diff options
643 files changed, 8067 insertions, 4380 deletions
diff --git a/.gitignore b/.gitignore index 27fd37621255..b1f5b9df2ae1 100644 --- a/.gitignore +++ b/.gitignore | |||
@@ -30,6 +30,11 @@ include/config | |||
30 | include/linux/autoconf.h | 30 | include/linux/autoconf.h |
31 | include/linux/compile.h | 31 | include/linux/compile.h |
32 | include/linux/version.h | 32 | include/linux/version.h |
33 | include/linux/utsrelease.h | ||
33 | 34 | ||
34 | # stgit generated dirs | 35 | # stgit generated dirs |
35 | patches-* | 36 | patches-* |
37 | |||
38 | # quilt's files | ||
39 | patches | ||
40 | series | ||
diff --git a/Documentation/DocBook/kernel-api.tmpl b/Documentation/DocBook/kernel-api.tmpl index 1ae4dc0fd856..f8fe882e33dc 100644 --- a/Documentation/DocBook/kernel-api.tmpl +++ b/Documentation/DocBook/kernel-api.tmpl | |||
@@ -59,6 +59,9 @@ | |||
59 | !Iinclude/linux/hrtimer.h | 59 | !Iinclude/linux/hrtimer.h |
60 | !Ekernel/hrtimer.c | 60 | !Ekernel/hrtimer.c |
61 | </sect1> | 61 | </sect1> |
62 | <sect1><title>Workqueues and Kevents</title> | ||
63 | !Ekernel/workqueue.c | ||
64 | </sect1> | ||
62 | <sect1><title>Internal Functions</title> | 65 | <sect1><title>Internal Functions</title> |
63 | !Ikernel/exit.c | 66 | !Ikernel/exit.c |
64 | !Ikernel/signal.c | 67 | !Ikernel/signal.c |
@@ -300,7 +303,7 @@ X!Ekernel/module.c | |||
300 | </sect1> | 303 | </sect1> |
301 | 304 | ||
302 | <sect1><title>Resources Management</title> | 305 | <sect1><title>Resources Management</title> |
303 | !Ekernel/resource.c | 306 | !Ikernel/resource.c |
304 | </sect1> | 307 | </sect1> |
305 | 308 | ||
306 | <sect1><title>MTRR Handling</title> | 309 | <sect1><title>MTRR Handling</title> |
@@ -312,9 +315,7 @@ X!Ekernel/module.c | |||
312 | !Edrivers/pci/pci-driver.c | 315 | !Edrivers/pci/pci-driver.c |
313 | !Edrivers/pci/remove.c | 316 | !Edrivers/pci/remove.c |
314 | !Edrivers/pci/pci-acpi.c | 317 | !Edrivers/pci/pci-acpi.c |
315 | <!-- kerneldoc does not understand __devinit | 318 | !Edrivers/pci/search.c |
316 | X!Edrivers/pci/search.c | ||
317 | --> | ||
318 | !Edrivers/pci/msi.c | 319 | !Edrivers/pci/msi.c |
319 | !Edrivers/pci/bus.c | 320 | !Edrivers/pci/bus.c |
320 | <!-- FIXME: Removed for now since no structured comments in source | 321 | <!-- FIXME: Removed for now since no structured comments in source |
diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches index c2c85bcb3d43..2cd7f02ffd0b 100644 --- a/Documentation/SubmittingPatches +++ b/Documentation/SubmittingPatches | |||
@@ -10,7 +10,9 @@ kernel, the process can sometimes be daunting if you're not familiar | |||
10 | with "the system." This text is a collection of suggestions which | 10 | with "the system." This text is a collection of suggestions which |
11 | can greatly increase the chances of your change being accepted. | 11 | can greatly increase the chances of your change being accepted. |
12 | 12 | ||
13 | If you are submitting a driver, also read Documentation/SubmittingDrivers. | 13 | Read Documentation/SubmitChecklist for a list of items to check |
14 | before submitting code. If you are submitting a driver, also read | ||
15 | Documentation/SubmittingDrivers. | ||
14 | 16 | ||
15 | 17 | ||
16 | 18 | ||
@@ -74,9 +76,6 @@ There are a number of scripts which can aid in this: | |||
74 | Quilt: | 76 | Quilt: |
75 | http://savannah.nongnu.org/projects/quilt | 77 | http://savannah.nongnu.org/projects/quilt |
76 | 78 | ||
77 | Randy Dunlap's patch scripts: | ||
78 | http://www.xenotime.net/linux/scripts/patching-scripts-002.tar.gz | ||
79 | |||
80 | Andrew Morton's patch scripts: | 79 | Andrew Morton's patch scripts: |
81 | http://www.zip.com.au/~akpm/linux/patches/ | 80 | http://www.zip.com.au/~akpm/linux/patches/ |
82 | Instead of these scripts, quilt is the recommended patch management | 81 | Instead of these scripts, quilt is the recommended patch management |
@@ -484,7 +483,7 @@ Greg Kroah-Hartman "How to piss off a kernel subsystem maintainer". | |||
484 | <http://www.kroah.com/log/2005/10/19/> | 483 | <http://www.kroah.com/log/2005/10/19/> |
485 | <http://www.kroah.com/log/2006/01/11/> | 484 | <http://www.kroah.com/log/2006/01/11/> |
486 | 485 | ||
487 | NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people!. | 486 | NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people! |
488 | <http://marc.theaimsgroup.com/?l=linux-kernel&m=112112749912944&w=2> | 487 | <http://marc.theaimsgroup.com/?l=linux-kernel&m=112112749912944&w=2> |
489 | 488 | ||
490 | Kernel Documentation/CodingStyle | 489 | Kernel Documentation/CodingStyle |
@@ -493,4 +492,3 @@ Kernel Documentation/CodingStyle | |||
493 | Linus Torvald's mail on the canonical patch format: | 492 | Linus Torvald's mail on the canonical patch format: |
494 | <http://lkml.org/lkml/2005/4/7/183> | 493 | <http://lkml.org/lkml/2005/4/7/183> |
495 | -- | 494 | -- |
496 | Last updated on 17 Nov 2005. | ||
diff --git a/Documentation/accounting/delay-accounting.txt b/Documentation/accounting/delay-accounting.txt index be215e58423b..1443cd71d263 100644 --- a/Documentation/accounting/delay-accounting.txt +++ b/Documentation/accounting/delay-accounting.txt | |||
@@ -64,11 +64,13 @@ Compile the kernel with | |||
64 | CONFIG_TASK_DELAY_ACCT=y | 64 | CONFIG_TASK_DELAY_ACCT=y |
65 | CONFIG_TASKSTATS=y | 65 | CONFIG_TASKSTATS=y |
66 | 66 | ||
67 | Enable the accounting at boot time by adding | 67 | Delay accounting is enabled by default at boot up. |
68 | the following to the kernel boot options | 68 | To disable, add |
69 | delayacct | 69 | nodelayacct |
70 | to the kernel boot options. The rest of the instructions | ||
71 | below assume this has not been done. | ||
70 | 72 | ||
71 | and after the system has booted up, use a utility | 73 | After the system has booted up, use a utility |
72 | similar to getdelays.c to access the delays | 74 | similar to getdelays.c to access the delays |
73 | seen by a given task or a task group (tgid). | 75 | seen by a given task or a task group (tgid). |
74 | The utility also allows a given command to be | 76 | The utility also allows a given command to be |
diff --git a/Documentation/cpu-freq/user-guide.txt b/Documentation/cpu-freq/user-guide.txt index 7fedc00c3d30..555c8cf3650a 100644 --- a/Documentation/cpu-freq/user-guide.txt +++ b/Documentation/cpu-freq/user-guide.txt | |||
@@ -153,10 +153,13 @@ scaling_governor, and by "echoing" the name of another | |||
153 | that some governors won't load - they only | 153 | that some governors won't load - they only |
154 | work on some specific architectures or | 154 | work on some specific architectures or |
155 | processors. | 155 | processors. |
156 | scaling_min_freq and | 156 | scaling_min_freq and |
157 | scaling_max_freq show the current "policy limits" (in | 157 | scaling_max_freq show the current "policy limits" (in |
158 | kHz). By echoing new values into these | 158 | kHz). By echoing new values into these |
159 | files, you can change these limits. | 159 | files, you can change these limits. |
160 | NOTE: when setting a policy you need to | ||
161 | first set scaling_max_freq, then | ||
162 | scaling_min_freq. | ||
160 | 163 | ||
161 | 164 | ||
162 | If you have selected the "userspace" governor which allows you to | 165 | If you have selected the "userspace" governor which allows you to |
diff --git a/Documentation/cpu-hotplug.txt b/Documentation/cpu-hotplug.txt index 1bcf69996c9d..bc107cb157a8 100644 --- a/Documentation/cpu-hotplug.txt +++ b/Documentation/cpu-hotplug.txt | |||
@@ -251,16 +251,24 @@ A: This is what you would need in your kernel code to receive notifications. | |||
251 | return NOTIFY_OK; | 251 | return NOTIFY_OK; |
252 | } | 252 | } |
253 | 253 | ||
254 | static struct notifier_block foobar_cpu_notifer = | 254 | static struct notifier_block __cpuinitdata foobar_cpu_notifer = |
255 | { | 255 | { |
256 | .notifier_call = foobar_cpu_callback, | 256 | .notifier_call = foobar_cpu_callback, |
257 | }; | 257 | }; |
258 | 258 | ||
259 | You need to call register_cpu_notifier() from your init function. | ||
260 | Init functions could be of two types: | ||
261 | 1. early init (init function called when only the boot processor is online). | ||
262 | 2. late init (init function called _after_ all the CPUs are online). | ||
259 | 263 | ||
260 | In your init function, | 264 | For the first case, you should add the following to your init function |
261 | 265 | ||
262 | register_cpu_notifier(&foobar_cpu_notifier); | 266 | register_cpu_notifier(&foobar_cpu_notifier); |
263 | 267 | ||
268 | For the second case, you should add the following to your init function | ||
269 | |||
270 | register_hotcpu_notifier(&foobar_cpu_notifier); | ||
271 | |||
264 | You can fail PREPARE notifiers if something doesn't work to prepare resources. | 272 | You can fail PREPARE notifiers if something doesn't work to prepare resources. |
265 | This will stop the activity and send a following CANCELED event back. | 273 | This will stop the activity and send a following CANCELED event back. |
266 | 274 | ||
diff --git a/Documentation/devices.txt b/Documentation/devices.txt index 4aaf68fafebe..66c725f530f3 100644 --- a/Documentation/devices.txt +++ b/Documentation/devices.txt | |||
@@ -2565,10 +2565,10 @@ Your cooperation is appreciated. | |||
2565 | 243 = /dev/usb/dabusb3 Fourth dabusb device | 2565 | 243 = /dev/usb/dabusb3 Fourth dabusb device |
2566 | 2566 | ||
2567 | 180 block USB block devices | 2567 | 180 block USB block devices |
2568 | 0 = /dev/uba First USB block device | 2568 | 0 = /dev/uba First USB block device |
2569 | 8 = /dev/ubb Second USB block device | 2569 | 8 = /dev/ubb Second USB block device |
2570 | 16 = /dev/ubc Thrid USB block device | 2570 | 16 = /dev/ubc Third USB block device |
2571 | ... | 2571 | ... |
2572 | 2572 | ||
2573 | 181 char Conrad Electronic parallel port radio clocks | 2573 | 181 char Conrad Electronic parallel port radio clocks |
2574 | 0 = /dev/pcfclock0 First Conrad radio clock | 2574 | 0 = /dev/pcfclock0 First Conrad radio clock |
diff --git a/Documentation/fb/imacfb.txt b/Documentation/fb/imacfb.txt new file mode 100644 index 000000000000..759028545a7e --- /dev/null +++ b/Documentation/fb/imacfb.txt | |||
@@ -0,0 +1,31 @@ | |||
1 | |||
2 | What is imacfb? | ||
3 | =============== | ||
4 | |||
5 | This is a generic EFI platform driver for Intel based Apple computers. | ||
6 | Imacfb is only for EFI booted Intel Macs. | ||
7 | |||
8 | Supported Hardware | ||
9 | ================== | ||
10 | |||
11 | iMac 17"/20" | ||
12 | Macbook | ||
13 | Macbook Pro 15"/17" | ||
14 | MacMini | ||
15 | |||
16 | How to use it? | ||
17 | ============== | ||
18 | |||
19 | Imacfb does not have any kind of autodetection of your machine. | ||
20 | You have to add the fillowing kernel parameters in your elilo.conf: | ||
21 | Macbook : | ||
22 | video=imacfb:macbook | ||
23 | MacMini : | ||
24 | video=imacfb:mini | ||
25 | Macbook Pro 15", iMac 17" : | ||
26 | video=imacfb:i17 | ||
27 | Macbook Pro 17", iMac 20" : | ||
28 | video=imacfb:i20 | ||
29 | |||
30 | -- | ||
31 | Edgar Hucek <gimli@dark-green.com> | ||
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 9d3a0775a11d..87851efb0228 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
@@ -258,3 +258,19 @@ Why: These drivers never compiled since they were added to the kernel | |||
258 | Who: Jean Delvare <khali@linux-fr.org> | 258 | Who: Jean Delvare <khali@linux-fr.org> |
259 | 259 | ||
260 | --------------------------- | 260 | --------------------------- |
261 | |||
262 | What: Bridge netfilter deferred IPv4/IPv6 output hook calling | ||
263 | When: January 2007 | ||
264 | Why: The deferred output hooks are a layering violation causing unusual | ||
265 | and broken behaviour on bridge devices. Examples of things they | ||
266 | break include QoS classifation using the MARK or CLASSIFY targets, | ||
267 | the IPsec policy match and connection tracking with VLANs on a | ||
268 | bridge. Their only use is to enable bridge output port filtering | ||
269 | within iptables with the physdev match, which can also be done by | ||
270 | combining iptables and ebtables using netfilter marks. Until it | ||
271 | will get removed the hook deferral is disabled by default and is | ||
272 | only enabled when needed. | ||
273 | |||
274 | Who: Patrick McHardy <kaber@trash.net> | ||
275 | |||
276 | --------------------------- | ||
diff --git a/Documentation/infiniband/ipoib.txt b/Documentation/infiniband/ipoib.txt index 187035560d7f..864ff3283780 100644 --- a/Documentation/infiniband/ipoib.txt +++ b/Documentation/infiniband/ipoib.txt | |||
@@ -51,8 +51,6 @@ Debugging Information | |||
51 | 51 | ||
52 | References | 52 | References |
53 | 53 | ||
54 | IETF IP over InfiniBand (ipoib) Working Group | ||
55 | http://ietf.org/html.charters/ipoib-charter.html | ||
56 | Transmission of IP over InfiniBand (IPoIB) (RFC 4391) | 54 | Transmission of IP over InfiniBand (IPoIB) (RFC 4391) |
57 | http://ietf.org/rfc/rfc4391.txt | 55 | http://ietf.org/rfc/rfc4391.txt |
58 | IP over InfiniBand (IPoIB) Architecture (RFC 4392) | 56 | IP over InfiniBand (IPoIB) Architecture (RFC 4392) |
diff --git a/Documentation/initrd.txt b/Documentation/initrd.txt index b1b6440237a6..15f1b35deb34 100644 --- a/Documentation/initrd.txt +++ b/Documentation/initrd.txt | |||
@@ -72,6 +72,22 @@ initrd adds the following new options: | |||
72 | initrd is mounted as root, and the normal boot procedure is followed, | 72 | initrd is mounted as root, and the normal boot procedure is followed, |
73 | with the RAM disk still mounted as root. | 73 | with the RAM disk still mounted as root. |
74 | 74 | ||
75 | Compressed cpio images | ||
76 | ---------------------- | ||
77 | |||
78 | Recent kernels have support for populating a ramdisk from a compressed cpio | ||
79 | archive, on such systems, the creation of a ramdisk image doesn't need to | ||
80 | involve special block devices or loopbacks, you merely create a directory on | ||
81 | disk with the desired initrd content, cd to that directory, and run (as an | ||
82 | example): | ||
83 | |||
84 | find . | cpio --quiet -c -o | gzip -9 -n > /boot/imagefile.img | ||
85 | |||
86 | Examining the contents of an existing image file is just as simple: | ||
87 | |||
88 | mkdir /tmp/imagefile | ||
89 | cd /tmp/imagefile | ||
90 | gzip -cd /boot/imagefile.img | cpio -imd --quiet | ||
75 | 91 | ||
76 | Installation | 92 | Installation |
77 | ------------ | 93 | ------------ |
diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt index 14ef3868a328..0706699c9da9 100644 --- a/Documentation/kbuild/makefiles.txt +++ b/Documentation/kbuild/makefiles.txt | |||
@@ -407,6 +407,20 @@ more details, with real examples. | |||
407 | The second argument is optional, and if supplied will be used | 407 | The second argument is optional, and if supplied will be used |
408 | if first argument is not supported. | 408 | if first argument is not supported. |
409 | 409 | ||
410 | ld-option | ||
411 | ld-option is used to check if $(CC) when used to link object files | ||
412 | supports the given option. An optional second option may be | ||
413 | specified if first option are not supported. | ||
414 | |||
415 | Example: | ||
416 | #arch/i386/kernel/Makefile | ||
417 | vsyscall-flags += $(call ld-option, -Wl$(comma)--hash-style=sysv) | ||
418 | |||
419 | In the above example vsyscall-flags will be assigned the option | ||
420 | -Wl$(comma)--hash-style=sysv if it is supported by $(CC). | ||
421 | The second argument is optional, and if supplied will be used | ||
422 | if first argument is not supported. | ||
423 | |||
410 | cc-option | 424 | cc-option |
411 | cc-option is used to check if $(CC) support a given option, and not | 425 | cc-option is used to check if $(CC) support a given option, and not |
412 | supported to use an optional second option. | 426 | supported to use an optional second option. |
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index e11f7728ec6f..b50595a0550f 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -448,8 +448,6 @@ running once the system is up. | |||
448 | Format: <area>[,<node>] | 448 | Format: <area>[,<node>] |
449 | See also Documentation/networking/decnet.txt. | 449 | See also Documentation/networking/decnet.txt. |
450 | 450 | ||
451 | delayacct [KNL] Enable per-task delay accounting | ||
452 | |||
453 | dhash_entries= [KNL] | 451 | dhash_entries= [KNL] |
454 | Set number of hash buckets for dentry cache. | 452 | Set number of hash buckets for dentry cache. |
455 | 453 | ||
@@ -1031,6 +1029,8 @@ running once the system is up. | |||
1031 | 1029 | ||
1032 | nocache [ARM] | 1030 | nocache [ARM] |
1033 | 1031 | ||
1032 | nodelayacct [KNL] Disable per-task delay accounting | ||
1033 | |||
1034 | nodisconnect [HW,SCSI,M68K] Disables SCSI disconnects. | 1034 | nodisconnect [HW,SCSI,M68K] Disables SCSI disconnects. |
1035 | 1035 | ||
1036 | noexec [IA-64] | 1036 | noexec [IA-64] |
diff --git a/Documentation/kobject.txt b/Documentation/kobject.txt index 8d9bffbd192c..949f7b5a2053 100644 --- a/Documentation/kobject.txt +++ b/Documentation/kobject.txt | |||
@@ -247,7 +247,7 @@ the object-specific fields, which include: | |||
247 | - default_attrs: Default attributes to be exported via sysfs when the | 247 | - default_attrs: Default attributes to be exported via sysfs when the |
248 | object is registered.Note that the last attribute has to be | 248 | object is registered.Note that the last attribute has to be |
249 | initialized to NULL ! You can find a complete implementation | 249 | initialized to NULL ! You can find a complete implementation |
250 | in drivers/block/genhd.c | 250 | in block/genhd.c |
251 | 251 | ||
252 | 252 | ||
253 | Instances of struct kobj_type are not registered; only referenced by | 253 | Instances of struct kobj_type are not registered; only referenced by |
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index d46338af6002..3e0c017e7877 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt | |||
@@ -294,15 +294,15 @@ tcp_rmem - vector of 3 INTEGERs: min, default, max | |||
294 | Default: 87380*2 bytes. | 294 | Default: 87380*2 bytes. |
295 | 295 | ||
296 | tcp_mem - vector of 3 INTEGERs: min, pressure, max | 296 | tcp_mem - vector of 3 INTEGERs: min, pressure, max |
297 | low: below this number of pages TCP is not bothered about its | 297 | min: below this number of pages TCP is not bothered about its |
298 | memory appetite. | 298 | memory appetite. |
299 | 299 | ||
300 | pressure: when amount of memory allocated by TCP exceeds this number | 300 | pressure: when amount of memory allocated by TCP exceeds this number |
301 | of pages, TCP moderates its memory consumption and enters memory | 301 | of pages, TCP moderates its memory consumption and enters memory |
302 | pressure mode, which is exited when memory consumption falls | 302 | pressure mode, which is exited when memory consumption falls |
303 | under "low". | 303 | under "min". |
304 | 304 | ||
305 | high: number of pages allowed for queueing by all TCP sockets. | 305 | max: number of pages allowed for queueing by all TCP sockets. |
306 | 306 | ||
307 | Defaults are calculated at boot time from amount of available | 307 | Defaults are calculated at boot time from amount of available |
308 | memory. | 308 | memory. |
diff --git a/Documentation/powerpc/booting-without-of.txt b/Documentation/powerpc/booting-without-of.txt index 3c62e66e1fcc..8c48b8a27b9c 100644 --- a/Documentation/powerpc/booting-without-of.txt +++ b/Documentation/powerpc/booting-without-of.txt | |||
@@ -1196,7 +1196,7 @@ platforms are moved over to use the flattened-device-tree model. | |||
1196 | - model : Model of the device. Can be "TSEC", "eTSEC", or "FEC" | 1196 | - model : Model of the device. Can be "TSEC", "eTSEC", or "FEC" |
1197 | - compatible : Should be "gianfar" | 1197 | - compatible : Should be "gianfar" |
1198 | - reg : Offset and length of the register set for the device | 1198 | - reg : Offset and length of the register set for the device |
1199 | - address : List of bytes representing the ethernet address of | 1199 | - mac-address : List of bytes representing the ethernet address of |
1200 | this controller | 1200 | this controller |
1201 | - interrupts : <a b> where a is the interrupt number and b is a | 1201 | - interrupts : <a b> where a is the interrupt number and b is a |
1202 | field that represents an encoding of the sense and level | 1202 | field that represents an encoding of the sense and level |
@@ -1216,7 +1216,7 @@ platforms are moved over to use the flattened-device-tree model. | |||
1216 | model = "TSEC"; | 1216 | model = "TSEC"; |
1217 | compatible = "gianfar"; | 1217 | compatible = "gianfar"; |
1218 | reg = <24000 1000>; | 1218 | reg = <24000 1000>; |
1219 | address = [ 00 E0 0C 00 73 00 ]; | 1219 | mac-address = [ 00 E0 0C 00 73 00 ]; |
1220 | interrupts = <d 3 e 3 12 3>; | 1220 | interrupts = <d 3 e 3 12 3>; |
1221 | interrupt-parent = <40000>; | 1221 | interrupt-parent = <40000>; |
1222 | phy-handle = <2452000> | 1222 | phy-handle = <2452000> |
@@ -1498,7 +1498,7 @@ not necessary as they are usually the same as the root node. | |||
1498 | model = "TSEC"; | 1498 | model = "TSEC"; |
1499 | compatible = "gianfar"; | 1499 | compatible = "gianfar"; |
1500 | reg = <24000 1000>; | 1500 | reg = <24000 1000>; |
1501 | address = [ 00 E0 0C 00 73 00 ]; | 1501 | mac-address = [ 00 E0 0C 00 73 00 ]; |
1502 | interrupts = <d 3 e 3 12 3>; | 1502 | interrupts = <d 3 e 3 12 3>; |
1503 | interrupt-parent = <40000>; | 1503 | interrupt-parent = <40000>; |
1504 | phy-handle = <2452000>; | 1504 | phy-handle = <2452000>; |
@@ -1511,7 +1511,7 @@ not necessary as they are usually the same as the root node. | |||
1511 | model = "TSEC"; | 1511 | model = "TSEC"; |
1512 | compatible = "gianfar"; | 1512 | compatible = "gianfar"; |
1513 | reg = <25000 1000>; | 1513 | reg = <25000 1000>; |
1514 | address = [ 00 E0 0C 00 73 01 ]; | 1514 | mac-address = [ 00 E0 0C 00 73 01 ]; |
1515 | interrupts = <13 3 14 3 18 3>; | 1515 | interrupts = <13 3 14 3 18 3>; |
1516 | interrupt-parent = <40000>; | 1516 | interrupt-parent = <40000>; |
1517 | phy-handle = <2452001>; | 1517 | phy-handle = <2452001>; |
@@ -1524,7 +1524,7 @@ not necessary as they are usually the same as the root node. | |||
1524 | model = "FEC"; | 1524 | model = "FEC"; |
1525 | compatible = "gianfar"; | 1525 | compatible = "gianfar"; |
1526 | reg = <26000 1000>; | 1526 | reg = <26000 1000>; |
1527 | address = [ 00 E0 0C 00 73 02 ]; | 1527 | mac-address = [ 00 E0 0C 00 73 02 ]; |
1528 | interrupts = <19 3>; | 1528 | interrupts = <19 3>; |
1529 | interrupt-parent = <40000>; | 1529 | interrupt-parent = <40000>; |
1530 | phy-handle = <2452002>; | 1530 | phy-handle = <2452002>; |
diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt index b0c7ab93dcb9..7345c338080a 100644 --- a/Documentation/sysctl/kernel.txt +++ b/Documentation/sysctl/kernel.txt | |||
@@ -211,9 +211,8 @@ Controls the kernel's behaviour when an oops or BUG is encountered. | |||
211 | 211 | ||
212 | 0: try to continue operation | 212 | 0: try to continue operation |
213 | 213 | ||
214 | 1: delay a few seconds (to give klogd time to record the oops output) and | 214 | 1: panic immediatly. If the `panic' sysctl is also non-zero then the |
215 | then panic. If the `panic' sysctl is also non-zero then the machine will | 215 | machine will be rebooted. |
216 | be rebooted. | ||
217 | 216 | ||
218 | ============================================================== | 217 | ============================================================== |
219 | 218 | ||
diff --git a/Documentation/usb/proc_usb_info.txt b/Documentation/usb/proc_usb_info.txt index f86550fe38ee..22c5331260ca 100644 --- a/Documentation/usb/proc_usb_info.txt +++ b/Documentation/usb/proc_usb_info.txt | |||
@@ -59,7 +59,7 @@ bind to an interface (or perhaps several) using an ioctl call. You | |||
59 | would issue more ioctls to the device to communicate to it using | 59 | would issue more ioctls to the device to communicate to it using |
60 | control, bulk, or other kinds of USB transfers. The IOCTLs are | 60 | control, bulk, or other kinds of USB transfers. The IOCTLs are |
61 | listed in the <linux/usbdevice_fs.h> file, and at this writing the | 61 | listed in the <linux/usbdevice_fs.h> file, and at this writing the |
62 | source code (linux/drivers/usb/devio.c) is the primary reference | 62 | source code (linux/drivers/usb/core/devio.c) is the primary reference |
63 | for how to access devices through those files. | 63 | for how to access devices through those files. |
64 | 64 | ||
65 | Note that since by default these BBB/DDD files are writable only by | 65 | Note that since by default these BBB/DDD files are writable only by |
diff --git a/Documentation/usb/usb-help.txt b/Documentation/usb/usb-help.txt index b7c324973695..a7408593829f 100644 --- a/Documentation/usb/usb-help.txt +++ b/Documentation/usb/usb-help.txt | |||
@@ -5,8 +5,7 @@ For USB help other than the readme files that are located in | |||
5 | Documentation/usb/*, see the following: | 5 | Documentation/usb/*, see the following: |
6 | 6 | ||
7 | Linux-USB project: http://www.linux-usb.org | 7 | Linux-USB project: http://www.linux-usb.org |
8 | mirrors at http://www.suse.cz/development/linux-usb/ | 8 | mirrors at http://usb.in.tum.de/linux-usb/ |
9 | and http://usb.in.tum.de/linux-usb/ | ||
10 | and http://it.linux-usb.org | 9 | and http://it.linux-usb.org |
11 | Linux USB Guide: http://linux-usb.sourceforge.net | 10 | Linux USB Guide: http://linux-usb.sourceforge.net |
12 | Linux-USB device overview (working devices and drivers): | 11 | Linux-USB device overview (working devices and drivers): |
diff --git a/Documentation/x86_64/boot-options.txt b/Documentation/x86_64/boot-options.txt index 6887d44d2661..6da24e7a56cb 100644 --- a/Documentation/x86_64/boot-options.txt +++ b/Documentation/x86_64/boot-options.txt | |||
@@ -238,6 +238,13 @@ Debugging | |||
238 | pagefaulttrace Dump all page faults. Only useful for extreme debugging | 238 | pagefaulttrace Dump all page faults. Only useful for extreme debugging |
239 | and will create a lot of output. | 239 | and will create a lot of output. |
240 | 240 | ||
241 | call_trace=[old|both|newfallback|new] | ||
242 | old: use old inexact backtracer | ||
243 | new: use new exact dwarf2 unwinder | ||
244 | both: print entries from both | ||
245 | newfallback: use new unwinder but fall back to old if it gets | ||
246 | stuck (default) | ||
247 | |||
241 | Misc | 248 | Misc |
242 | 249 | ||
243 | noreplacement Don't replace instructions with more appropriate ones | 250 | noreplacement Don't replace instructions with more appropriate ones |
diff --git a/MAINTAINERS b/MAINTAINERS index b2afc7ae965b..3bab239e82fe 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -214,6 +214,12 @@ W: http://acpi.sourceforge.net/ | |||
214 | T: git kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git | 214 | T: git kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git |
215 | S: Maintained | 215 | S: Maintained |
216 | 216 | ||
217 | ACPI PCI HOTPLUG DRIVER | ||
218 | P: Kristen Carlson Accardi | ||
219 | M: kristen.c.accardi@intel.com | ||
220 | L: pcihpd-discuss@lists.sourceforge.net | ||
221 | S: Maintained | ||
222 | |||
217 | AD1816 SOUND DRIVER | 223 | AD1816 SOUND DRIVER |
218 | P: Thorsten Knabe | 224 | P: Thorsten Knabe |
219 | M: Thorsten Knabe <linux@thorsten-knabe.de> | 225 | M: Thorsten Knabe <linux@thorsten-knabe.de> |
@@ -292,6 +298,13 @@ L: info-linux@geode.amd.com | |||
292 | W: http://www.amd.com/us-en/ConnectivitySolutions/TechnicalResources/0,,50_2334_2452_11363,00.html | 298 | W: http://www.amd.com/us-en/ConnectivitySolutions/TechnicalResources/0,,50_2334_2452_11363,00.html |
293 | S: Supported | 299 | S: Supported |
294 | 300 | ||
301 | AOA (Apple Onboard Audio) ALSA DRIVER | ||
302 | P: Johannes Berg | ||
303 | M: johannes@sipsolutions.net | ||
304 | L: linuxppc-dev@ozlabs.org | ||
305 | L: alsa-devel@alsa-project.org | ||
306 | S: Maintained | ||
307 | |||
295 | APM DRIVER | 308 | APM DRIVER |
296 | P: Stephen Rothwell | 309 | P: Stephen Rothwell |
297 | M: sfr@canb.auug.org.au | 310 | M: sfr@canb.auug.org.au |
@@ -876,6 +889,12 @@ M: rdunlap@xenotime.net | |||
876 | T: git http://tali.admingilde.org/git/linux-docbook.git | 889 | T: git http://tali.admingilde.org/git/linux-docbook.git |
877 | S: Maintained | 890 | S: Maintained |
878 | 891 | ||
892 | DOCKING STATION DRIVER | ||
893 | P: Kristen Carlson Accardi | ||
894 | M: kristen.c.accardi@intel.com | ||
895 | L: linux-acpi@vger.kernel.org | ||
896 | S: Maintained | ||
897 | |||
879 | DOUBLETALK DRIVER | 898 | DOUBLETALK DRIVER |
880 | P: James R. Van Zandt | 899 | P: James R. Van Zandt |
881 | M: jrv@vanzandt.mv.com | 900 | M: jrv@vanzandt.mv.com |
@@ -968,6 +987,10 @@ P: Andrey V. Savochkin | |||
968 | M: saw@saw.sw.com.sg | 987 | M: saw@saw.sw.com.sg |
969 | S: Maintained | 988 | S: Maintained |
970 | 989 | ||
990 | EFS FILESYSTEM | ||
991 | W: http://aeschi.ch.eu.org/efs/ | ||
992 | S: Orphan | ||
993 | |||
971 | EMU10K1 SOUND DRIVER | 994 | EMU10K1 SOUND DRIVER |
972 | P: James Courtier-Dutton | 995 | P: James Courtier-Dutton |
973 | M: James@superbug.demon.co.uk | 996 | M: James@superbug.demon.co.uk |
@@ -1598,7 +1621,7 @@ W: http://jfs.sourceforge.net/ | |||
1598 | T: git kernel.org:/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git | 1621 | T: git kernel.org:/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git |
1599 | S: Supported | 1622 | S: Supported |
1600 | 1623 | ||
1601 | JOURNALLING LAYER FOR BLOCK DEVICS (JBD) | 1624 | JOURNALLING LAYER FOR BLOCK DEVICES (JBD) |
1602 | P: Stephen Tweedie, Andrew Morton | 1625 | P: Stephen Tweedie, Andrew Morton |
1603 | M: sct@redhat.com, akpm@osdl.org | 1626 | M: sct@redhat.com, akpm@osdl.org |
1604 | L: ext2-devel@lists.sourceforge.net | 1627 | L: ext2-devel@lists.sourceforge.net |
@@ -1642,9 +1665,8 @@ S: Maintained | |||
1642 | 1665 | ||
1643 | KERNEL JANITORS | 1666 | KERNEL JANITORS |
1644 | P: Several | 1667 | P: Several |
1645 | L: kernel-janitors@osdl.org | 1668 | L: kernel-janitors@lists.osdl.org |
1646 | W: http://www.kerneljanitors.org/ | 1669 | W: http://www.kerneljanitors.org/ |
1647 | W: http://sf.net/projects/kernel-janitor/ | ||
1648 | S: Maintained | 1670 | S: Maintained |
1649 | 1671 | ||
1650 | KERNEL NFSD | 1672 | KERNEL NFSD |
@@ -1882,6 +1904,12 @@ S: linux-scsi@vger.kernel.org | |||
1882 | W: http://megaraid.lsilogic.com | 1904 | W: http://megaraid.lsilogic.com |
1883 | S: Maintained | 1905 | S: Maintained |
1884 | 1906 | ||
1907 | MEMORY MANAGEMENT | ||
1908 | L: linux-mm@kvack.org | ||
1909 | L: linux-kernel@vger.kernel.org | ||
1910 | W: http://www.linux-mm.org | ||
1911 | S: Maintained | ||
1912 | |||
1885 | MEMORY TECHNOLOGY DEVICES (MTD) | 1913 | MEMORY TECHNOLOGY DEVICES (MTD) |
1886 | P: David Woodhouse | 1914 | P: David Woodhouse |
1887 | M: dwmw2@infradead.org | 1915 | M: dwmw2@infradead.org |
@@ -2626,6 +2654,22 @@ M: dbrownell@users.sourceforge.net | |||
2626 | L: spi-devel-general@lists.sourceforge.net | 2654 | L: spi-devel-general@lists.sourceforge.net |
2627 | S: Maintained | 2655 | S: Maintained |
2628 | 2656 | ||
2657 | STABLE BRANCH: | ||
2658 | P: Greg Kroah-Hartman | ||
2659 | M: greg@kroah.com | ||
2660 | P: Chris Wright | ||
2661 | M: chrisw@sous-sol.org | ||
2662 | L: stable@kernel.org | ||
2663 | S: Maintained | ||
2664 | |||
2665 | STABLE BRANCH: | ||
2666 | P: Greg Kroah-Hartman | ||
2667 | M: greg@kroah.com | ||
2668 | P: Chris Wright | ||
2669 | M: chrisw@sous-sol.org | ||
2670 | L: stable@kernel.org | ||
2671 | S: Maintained | ||
2672 | |||
2629 | TPM DEVICE DRIVER | 2673 | TPM DEVICE DRIVER |
2630 | P: Kylene Hall | 2674 | P: Kylene Hall |
2631 | M: kjhall@us.ibm.com | 2675 | M: kjhall@us.ibm.com |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 2 | 1 | VERSION = 2 |
2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
3 | SUBLEVEL = 18 | 3 | SUBLEVEL = 18 |
4 | EXTRAVERSION = -rc2 | 4 | EXTRAVERSION = -rc4 |
5 | NAME=Crazed Snow-Weasel | 5 | NAME=Crazed Snow-Weasel |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
@@ -309,9 +309,6 @@ CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE) | |||
309 | 309 | ||
310 | CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ | 310 | CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ |
311 | -fno-strict-aliasing -fno-common | 311 | -fno-strict-aliasing -fno-common |
312 | # Force gcc to behave correct even for buggy distributions | ||
313 | CFLAGS += $(call cc-option, -fno-stack-protector-all \ | ||
314 | -fno-stack-protector) | ||
315 | AFLAGS := -D__ASSEMBLY__ | 312 | AFLAGS := -D__ASSEMBLY__ |
316 | 313 | ||
317 | # Read KERNELRELEASE from include/config/kernel.release (if it exists) | 314 | # Read KERNELRELEASE from include/config/kernel.release (if it exists) |
@@ -368,6 +365,7 @@ endif | |||
368 | 365 | ||
369 | no-dot-config-targets := clean mrproper distclean \ | 366 | no-dot-config-targets := clean mrproper distclean \ |
370 | cscope TAGS tags help %docs check% \ | 367 | cscope TAGS tags help %docs check% \ |
368 | include/linux/version.h headers_% \ | ||
371 | kernelrelease kernelversion | 369 | kernelrelease kernelversion |
372 | 370 | ||
373 | config-targets := 0 | 371 | config-targets := 0 |
@@ -435,12 +433,13 @@ core-y := usr/ | |||
435 | endif # KBUILD_EXTMOD | 433 | endif # KBUILD_EXTMOD |
436 | 434 | ||
437 | ifeq ($(dot-config),1) | 435 | ifeq ($(dot-config),1) |
438 | # In this section, we need .config | 436 | # Read in config |
437 | -include include/config/auto.conf | ||
439 | 438 | ||
439 | ifeq ($(KBUILD_EXTMOD),) | ||
440 | # Read in dependencies to all Kconfig* files, make sure to run | 440 | # Read in dependencies to all Kconfig* files, make sure to run |
441 | # oldconfig if changes are detected. | 441 | # oldconfig if changes are detected. |
442 | -include include/config/auto.conf.cmd | 442 | -include include/config/auto.conf.cmd |
443 | -include include/config/auto.conf | ||
444 | 443 | ||
445 | # To avoid any implicit rule to kick in, define an empty command | 444 | # To avoid any implicit rule to kick in, define an empty command |
446 | $(KCONFIG_CONFIG) include/config/auto.conf.cmd: ; | 445 | $(KCONFIG_CONFIG) include/config/auto.conf.cmd: ; |
@@ -450,16 +449,27 @@ $(KCONFIG_CONFIG) include/config/auto.conf.cmd: ; | |||
450 | # if auto.conf.cmd is missing then we are probably in a cleaned tree so | 449 | # if auto.conf.cmd is missing then we are probably in a cleaned tree so |
451 | # we execute the config step to be sure to catch updated Kconfig files | 450 | # we execute the config step to be sure to catch updated Kconfig files |
452 | include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd | 451 | include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd |
453 | ifeq ($(KBUILD_EXTMOD),) | ||
454 | $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig | 452 | $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig |
455 | else | 453 | else |
456 | $(error kernel configuration not valid - run 'make prepare' in $(srctree) to update it) | 454 | # external modules needs include/linux/autoconf.h and include/config/auto.conf |
457 | endif | 455 | # but do not care if they are up-to-date. Use auto.conf to trigger the test |
456 | PHONY += include/config/auto.conf | ||
457 | |||
458 | include/config/auto.conf: | ||
459 | $(Q)test -e include/linux/autoconf.h -a -e $@ || ( \ | ||
460 | echo; \ | ||
461 | echo " ERROR: Kernel configuration is invalid."; \ | ||
462 | echo " include/linux/autoconf.h or $@ are missing."; \ | ||
463 | echo " Run 'make oldconfig && make prepare' on kernel src to fix it."; \ | ||
464 | echo; \ | ||
465 | /bin/false) | ||
466 | |||
467 | endif # KBUILD_EXTMOD | ||
458 | 468 | ||
459 | else | 469 | else |
460 | # Dummy target needed, because used as prerequisite | 470 | # Dummy target needed, because used as prerequisite |
461 | include/config/auto.conf: ; | 471 | include/config/auto.conf: ; |
462 | endif | 472 | endif # $(dot-config) |
463 | 473 | ||
464 | # The all: target is the default when no target is given on the | 474 | # The all: target is the default when no target is given on the |
465 | # command line. | 475 | # command line. |
@@ -473,6 +483,8 @@ else | |||
473 | CFLAGS += -O2 | 483 | CFLAGS += -O2 |
474 | endif | 484 | endif |
475 | 485 | ||
486 | include $(srctree)/arch/$(ARCH)/Makefile | ||
487 | |||
476 | ifdef CONFIG_FRAME_POINTER | 488 | ifdef CONFIG_FRAME_POINTER |
477 | CFLAGS += -fno-omit-frame-pointer $(call cc-option,-fno-optimize-sibling-calls,) | 489 | CFLAGS += -fno-omit-frame-pointer $(call cc-option,-fno-optimize-sibling-calls,) |
478 | else | 490 | else |
@@ -487,7 +499,8 @@ ifdef CONFIG_DEBUG_INFO | |||
487 | CFLAGS += -g | 499 | CFLAGS += -g |
488 | endif | 500 | endif |
489 | 501 | ||
490 | include $(srctree)/arch/$(ARCH)/Makefile | 502 | # Force gcc to behave correct even for buggy distributions |
503 | CFLAGS += $(call cc-option, -fno-stack-protector) | ||
491 | 504 | ||
492 | # arch Makefile may override CC so keep this after arch Makefile is included | 505 | # arch Makefile may override CC so keep this after arch Makefile is included |
493 | NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) | 506 | NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) |
diff --git a/arch/alpha/kernel/err_ev7.c b/arch/alpha/kernel/err_ev7.c index bf52ba691957..fed6b3d1b803 100644 --- a/arch/alpha/kernel/err_ev7.c +++ b/arch/alpha/kernel/err_ev7.c | |||
@@ -274,16 +274,14 @@ ev7_process_pal_subpacket(struct el_subpacket *header) | |||
274 | struct el_subpacket_handler ev7_pal_subpacket_handler = | 274 | struct el_subpacket_handler ev7_pal_subpacket_handler = |
275 | SUBPACKET_HANDLER_INIT(EL_CLASS__PAL, ev7_process_pal_subpacket); | 275 | SUBPACKET_HANDLER_INIT(EL_CLASS__PAL, ev7_process_pal_subpacket); |
276 | 276 | ||
277 | void | 277 | void |
278 | ev7_register_error_handlers(void) | 278 | ev7_register_error_handlers(void) |
279 | { | 279 | { |
280 | int i; | 280 | int i; |
281 | 281 | ||
282 | for(i = 0; | 282 | for (i = 0; i < ARRAY_SIZE(el_ev7_pal_annotations); i++) |
283 | i<sizeof(el_ev7_pal_annotations)/sizeof(el_ev7_pal_annotations[1]); | ||
284 | i++) { | ||
285 | cdl_register_subpacket_annotation(&el_ev7_pal_annotations[i]); | 283 | cdl_register_subpacket_annotation(&el_ev7_pal_annotations[i]); |
286 | } | 284 | |
287 | cdl_register_subpacket_handler(&ev7_pal_subpacket_handler); | 285 | cdl_register_subpacket_handler(&ev7_pal_subpacket_handler); |
288 | } | 286 | } |
289 | 287 | ||
diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index e15dcf4f3dcd..73c7622b5297 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c | |||
@@ -623,12 +623,12 @@ osf_sysinfo(int command, char __user *buf, long count) | |||
623 | long len, err = -EINVAL; | 623 | long len, err = -EINVAL; |
624 | 624 | ||
625 | offset = command-1; | 625 | offset = command-1; |
626 | if (offset >= sizeof(sysinfo_table)/sizeof(char *)) { | 626 | if (offset >= ARRAY_SIZE(sysinfo_table)) { |
627 | /* Digital UNIX has a few unpublished interfaces here */ | 627 | /* Digital UNIX has a few unpublished interfaces here */ |
628 | printk("sysinfo(%d)", command); | 628 | printk("sysinfo(%d)", command); |
629 | goto out; | 629 | goto out; |
630 | } | 630 | } |
631 | 631 | ||
632 | down_read(&uts_sem); | 632 | down_read(&uts_sem); |
633 | res = sysinfo_table[offset]; | 633 | res = sysinfo_table[offset]; |
634 | len = strlen(res)+1; | 634 | len = strlen(res)+1; |
diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c index 2cb9c4380113..fd4a8fa0c93d 100644 --- a/arch/alpha/kernel/setup.c +++ b/arch/alpha/kernel/setup.c | |||
@@ -114,8 +114,6 @@ struct alpha_machine_vector alpha_mv; | |||
114 | int alpha_using_srm; | 114 | int alpha_using_srm; |
115 | #endif | 115 | #endif |
116 | 116 | ||
117 | #define N(a) (sizeof(a)/sizeof(a[0])) | ||
118 | |||
119 | static struct alpha_machine_vector *get_sysvec(unsigned long, unsigned long, | 117 | static struct alpha_machine_vector *get_sysvec(unsigned long, unsigned long, |
120 | unsigned long); | 118 | unsigned long); |
121 | static struct alpha_machine_vector *get_sysvec_byname(const char *); | 119 | static struct alpha_machine_vector *get_sysvec_byname(const char *); |
@@ -240,7 +238,7 @@ reserve_std_resources(void) | |||
240 | standard_io_resources[0].start = RTC_PORT(0); | 238 | standard_io_resources[0].start = RTC_PORT(0); |
241 | standard_io_resources[0].end = RTC_PORT(0) + 0x10; | 239 | standard_io_resources[0].end = RTC_PORT(0) + 0x10; |
242 | 240 | ||
243 | for (i = 0; i < N(standard_io_resources); ++i) | 241 | for (i = 0; i < ARRAY_SIZE(standard_io_resources); ++i) |
244 | request_resource(io, standard_io_resources+i); | 242 | request_resource(io, standard_io_resources+i); |
245 | } | 243 | } |
246 | 244 | ||
@@ -918,13 +916,13 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu) | |||
918 | 916 | ||
919 | /* Search the system tables first... */ | 917 | /* Search the system tables first... */ |
920 | vec = NULL; | 918 | vec = NULL; |
921 | if (type < N(systype_vecs)) { | 919 | if (type < ARRAY_SIZE(systype_vecs)) { |
922 | vec = systype_vecs[type]; | 920 | vec = systype_vecs[type]; |
923 | } else if ((type > ST_API_BIAS) && | 921 | } else if ((type > ST_API_BIAS) && |
924 | (type - ST_API_BIAS) < N(api_vecs)) { | 922 | (type - ST_API_BIAS) < ARRAY_SIZE(api_vecs)) { |
925 | vec = api_vecs[type - ST_API_BIAS]; | 923 | vec = api_vecs[type - ST_API_BIAS]; |
926 | } else if ((type > ST_UNOFFICIAL_BIAS) && | 924 | } else if ((type > ST_UNOFFICIAL_BIAS) && |
927 | (type - ST_UNOFFICIAL_BIAS) < N(unofficial_vecs)) { | 925 | (type - ST_UNOFFICIAL_BIAS) < ARRAY_SIZE(unofficial_vecs)) { |
928 | vec = unofficial_vecs[type - ST_UNOFFICIAL_BIAS]; | 926 | vec = unofficial_vecs[type - ST_UNOFFICIAL_BIAS]; |
929 | } | 927 | } |
930 | 928 | ||
@@ -938,11 +936,11 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu) | |||
938 | 936 | ||
939 | switch (type) { | 937 | switch (type) { |
940 | case ST_DEC_ALCOR: | 938 | case ST_DEC_ALCOR: |
941 | if (member < N(alcor_indices)) | 939 | if (member < ARRAY_SIZE(alcor_indices)) |
942 | vec = alcor_vecs[alcor_indices[member]]; | 940 | vec = alcor_vecs[alcor_indices[member]]; |
943 | break; | 941 | break; |
944 | case ST_DEC_EB164: | 942 | case ST_DEC_EB164: |
945 | if (member < N(eb164_indices)) | 943 | if (member < ARRAY_SIZE(eb164_indices)) |
946 | vec = eb164_vecs[eb164_indices[member]]; | 944 | vec = eb164_vecs[eb164_indices[member]]; |
947 | /* PC164 may show as EB164 variation with EV56 CPU, | 945 | /* PC164 may show as EB164 variation with EV56 CPU, |
948 | but, since no true EB164 had anything but EV5... */ | 946 | but, since no true EB164 had anything but EV5... */ |
@@ -950,24 +948,24 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu) | |||
950 | vec = &pc164_mv; | 948 | vec = &pc164_mv; |
951 | break; | 949 | break; |
952 | case ST_DEC_EB64P: | 950 | case ST_DEC_EB64P: |
953 | if (member < N(eb64p_indices)) | 951 | if (member < ARRAY_SIZE(eb64p_indices)) |
954 | vec = eb64p_vecs[eb64p_indices[member]]; | 952 | vec = eb64p_vecs[eb64p_indices[member]]; |
955 | break; | 953 | break; |
956 | case ST_DEC_EB66: | 954 | case ST_DEC_EB66: |
957 | if (member < N(eb66_indices)) | 955 | if (member < ARRAY_SIZE(eb66_indices)) |
958 | vec = eb66_vecs[eb66_indices[member]]; | 956 | vec = eb66_vecs[eb66_indices[member]]; |
959 | break; | 957 | break; |
960 | case ST_DEC_MARVEL: | 958 | case ST_DEC_MARVEL: |
961 | if (member < N(marvel_indices)) | 959 | if (member < ARRAY_SIZE(marvel_indices)) |
962 | vec = marvel_vecs[marvel_indices[member]]; | 960 | vec = marvel_vecs[marvel_indices[member]]; |
963 | break; | 961 | break; |
964 | case ST_DEC_TITAN: | 962 | case ST_DEC_TITAN: |
965 | vec = titan_vecs[0]; /* default */ | 963 | vec = titan_vecs[0]; /* default */ |
966 | if (member < N(titan_indices)) | 964 | if (member < ARRAY_SIZE(titan_indices)) |
967 | vec = titan_vecs[titan_indices[member]]; | 965 | vec = titan_vecs[titan_indices[member]]; |
968 | break; | 966 | break; |
969 | case ST_DEC_TSUNAMI: | 967 | case ST_DEC_TSUNAMI: |
970 | if (member < N(tsunami_indices)) | 968 | if (member < ARRAY_SIZE(tsunami_indices)) |
971 | vec = tsunami_vecs[tsunami_indices[member]]; | 969 | vec = tsunami_vecs[tsunami_indices[member]]; |
972 | break; | 970 | break; |
973 | case ST_DEC_1000: | 971 | case ST_DEC_1000: |
@@ -1039,7 +1037,7 @@ get_sysvec_byname(const char *name) | |||
1039 | 1037 | ||
1040 | size_t i; | 1038 | size_t i; |
1041 | 1039 | ||
1042 | for (i = 0; i < N(all_vecs); ++i) { | 1040 | for (i = 0; i < ARRAY_SIZE(all_vecs); ++i) { |
1043 | struct alpha_machine_vector *mv = all_vecs[i]; | 1041 | struct alpha_machine_vector *mv = all_vecs[i]; |
1044 | if (strcasecmp(mv->vector_name, name) == 0) | 1042 | if (strcasecmp(mv->vector_name, name) == 0) |
1045 | return mv; | 1043 | return mv; |
@@ -1055,13 +1053,13 @@ get_sysnames(unsigned long type, unsigned long variation, unsigned long cpu, | |||
1055 | 1053 | ||
1056 | /* If not in the tables, make it UNKNOWN, | 1054 | /* If not in the tables, make it UNKNOWN, |
1057 | else set type name to family */ | 1055 | else set type name to family */ |
1058 | if (type < N(systype_names)) { | 1056 | if (type < ARRAY_SIZE(systype_names)) { |
1059 | *type_name = systype_names[type]; | 1057 | *type_name = systype_names[type]; |
1060 | } else if ((type > ST_API_BIAS) && | 1058 | } else if ((type > ST_API_BIAS) && |
1061 | (type - ST_API_BIAS) < N(api_names)) { | 1059 | (type - ST_API_BIAS) < ARRAY_SIZE(api_names)) { |
1062 | *type_name = api_names[type - ST_API_BIAS]; | 1060 | *type_name = api_names[type - ST_API_BIAS]; |
1063 | } else if ((type > ST_UNOFFICIAL_BIAS) && | 1061 | } else if ((type > ST_UNOFFICIAL_BIAS) && |
1064 | (type - ST_UNOFFICIAL_BIAS) < N(unofficial_names)) { | 1062 | (type - ST_UNOFFICIAL_BIAS) < ARRAY_SIZE(unofficial_names)) { |
1065 | *type_name = unofficial_names[type - ST_UNOFFICIAL_BIAS]; | 1063 | *type_name = unofficial_names[type - ST_UNOFFICIAL_BIAS]; |
1066 | } else { | 1064 | } else { |
1067 | *type_name = sys_unknown; | 1065 | *type_name = sys_unknown; |
@@ -1083,7 +1081,7 @@ get_sysnames(unsigned long type, unsigned long variation, unsigned long cpu, | |||
1083 | default: /* default to variation "0" for now */ | 1081 | default: /* default to variation "0" for now */ |
1084 | break; | 1082 | break; |
1085 | case ST_DEC_EB164: | 1083 | case ST_DEC_EB164: |
1086 | if (member < N(eb164_indices)) | 1084 | if (member < ARRAY_SIZE(eb164_indices)) |
1087 | *variation_name = eb164_names[eb164_indices[member]]; | 1085 | *variation_name = eb164_names[eb164_indices[member]]; |
1088 | /* PC164 may show as EB164 variation, but with EV56 CPU, | 1086 | /* PC164 may show as EB164 variation, but with EV56 CPU, |
1089 | so, since no true EB164 had anything but EV5... */ | 1087 | so, since no true EB164 had anything but EV5... */ |
@@ -1091,32 +1089,32 @@ get_sysnames(unsigned long type, unsigned long variation, unsigned long cpu, | |||
1091 | *variation_name = eb164_names[1]; /* make it PC164 */ | 1089 | *variation_name = eb164_names[1]; /* make it PC164 */ |
1092 | break; | 1090 | break; |
1093 | case ST_DEC_ALCOR: | 1091 | case ST_DEC_ALCOR: |
1094 | if (member < N(alcor_indices)) | 1092 | if (member < ARRAY_SIZE(alcor_indices)) |
1095 | *variation_name = alcor_names[alcor_indices[member]]; | 1093 | *variation_name = alcor_names[alcor_indices[member]]; |
1096 | break; | 1094 | break; |
1097 | case ST_DEC_EB64P: | 1095 | case ST_DEC_EB64P: |
1098 | if (member < N(eb64p_indices)) | 1096 | if (member < ARRAY_SIZE(eb64p_indices)) |
1099 | *variation_name = eb64p_names[eb64p_indices[member]]; | 1097 | *variation_name = eb64p_names[eb64p_indices[member]]; |
1100 | break; | 1098 | break; |
1101 | case ST_DEC_EB66: | 1099 | case ST_DEC_EB66: |
1102 | if (member < N(eb66_indices)) | 1100 | if (member < ARRAY_SIZE(eb66_indices)) |
1103 | *variation_name = eb66_names[eb66_indices[member]]; | 1101 | *variation_name = eb66_names[eb66_indices[member]]; |
1104 | break; | 1102 | break; |
1105 | case ST_DEC_MARVEL: | 1103 | case ST_DEC_MARVEL: |
1106 | if (member < N(marvel_indices)) | 1104 | if (member < ARRAY_SIZE(marvel_indices)) |
1107 | *variation_name = marvel_names[marvel_indices[member]]; | 1105 | *variation_name = marvel_names[marvel_indices[member]]; |
1108 | break; | 1106 | break; |
1109 | case ST_DEC_RAWHIDE: | 1107 | case ST_DEC_RAWHIDE: |
1110 | if (member < N(rawhide_indices)) | 1108 | if (member < ARRAY_SIZE(rawhide_indices)) |
1111 | *variation_name = rawhide_names[rawhide_indices[member]]; | 1109 | *variation_name = rawhide_names[rawhide_indices[member]]; |
1112 | break; | 1110 | break; |
1113 | case ST_DEC_TITAN: | 1111 | case ST_DEC_TITAN: |
1114 | *variation_name = titan_names[0]; /* default */ | 1112 | *variation_name = titan_names[0]; /* default */ |
1115 | if (member < N(titan_indices)) | 1113 | if (member < ARRAY_SIZE(titan_indices)) |
1116 | *variation_name = titan_names[titan_indices[member]]; | 1114 | *variation_name = titan_names[titan_indices[member]]; |
1117 | break; | 1115 | break; |
1118 | case ST_DEC_TSUNAMI: | 1116 | case ST_DEC_TSUNAMI: |
1119 | if (member < N(tsunami_indices)) | 1117 | if (member < ARRAY_SIZE(tsunami_indices)) |
1120 | *variation_name = tsunami_names[tsunami_indices[member]]; | 1118 | *variation_name = tsunami_names[tsunami_indices[member]]; |
1121 | break; | 1119 | break; |
1122 | } | 1120 | } |
@@ -1211,7 +1209,7 @@ show_cpuinfo(struct seq_file *f, void *slot) | |||
1211 | 1209 | ||
1212 | cpu_index = (unsigned) (cpu->type - 1); | 1210 | cpu_index = (unsigned) (cpu->type - 1); |
1213 | cpu_name = "Unknown"; | 1211 | cpu_name = "Unknown"; |
1214 | if (cpu_index < N(cpu_names)) | 1212 | if (cpu_index < ARRAY_SIZE(cpu_names)) |
1215 | cpu_name = cpu_names[cpu_index]; | 1213 | cpu_name = cpu_names[cpu_index]; |
1216 | 1214 | ||
1217 | get_sysnames(hwrpb->sys_type, hwrpb->sys_variation, | 1215 | get_sysnames(hwrpb->sys_type, hwrpb->sys_variation, |
diff --git a/arch/alpha/kernel/sys_ruffian.c b/arch/alpha/kernel/sys_ruffian.c index 78c30decf3ff..5b99cf3cd69c 100644 --- a/arch/alpha/kernel/sys_ruffian.c +++ b/arch/alpha/kernel/sys_ruffian.c | |||
@@ -182,16 +182,16 @@ static unsigned long __init | |||
182 | ruffian_get_bank_size(unsigned long offset) | 182 | ruffian_get_bank_size(unsigned long offset) |
183 | { | 183 | { |
184 | unsigned long bank_addr, bank, ret = 0; | 184 | unsigned long bank_addr, bank, ret = 0; |
185 | 185 | ||
186 | /* Valid offsets are: 0x800, 0x840 and 0x880 | 186 | /* Valid offsets are: 0x800, 0x840 and 0x880 |
187 | since Ruffian only uses three banks. */ | 187 | since Ruffian only uses three banks. */ |
188 | bank_addr = (unsigned long)PYXIS_MCR + offset; | 188 | bank_addr = (unsigned long)PYXIS_MCR + offset; |
189 | bank = *(vulp)bank_addr; | 189 | bank = *(vulp)bank_addr; |
190 | 190 | ||
191 | /* Check BANK_ENABLE */ | 191 | /* Check BANK_ENABLE */ |
192 | if (bank & 0x01) { | 192 | if (bank & 0x01) { |
193 | static unsigned long size[] __initdata = { | 193 | static unsigned long size[] __initdata = { |
194 | 0x40000000UL, /* 0x00, 1G */ | 194 | 0x40000000UL, /* 0x00, 1G */ |
195 | 0x20000000UL, /* 0x02, 512M */ | 195 | 0x20000000UL, /* 0x02, 512M */ |
196 | 0x10000000UL, /* 0x04, 256M */ | 196 | 0x10000000UL, /* 0x04, 256M */ |
197 | 0x08000000UL, /* 0x06, 128M */ | 197 | 0x08000000UL, /* 0x06, 128M */ |
@@ -203,7 +203,7 @@ ruffian_get_bank_size(unsigned long offset) | |||
203 | }; | 203 | }; |
204 | 204 | ||
205 | bank = (bank & 0x1e) >> 1; | 205 | bank = (bank & 0x1e) >> 1; |
206 | if (bank < sizeof(size)/sizeof(*size)) | 206 | if (bank < ARRAY_SIZE(size)) |
207 | ret = size[bank]; | 207 | ret = size[bank]; |
208 | } | 208 | } |
209 | 209 | ||
diff --git a/arch/alpha/kernel/time.c b/arch/alpha/kernel/time.c index 50eccde2dcd8..b191cc759737 100644 --- a/arch/alpha/kernel/time.c +++ b/arch/alpha/kernel/time.c | |||
@@ -233,7 +233,7 @@ validate_cc_value(unsigned long cc) | |||
233 | index = cpu->type & 0xffffffff; | 233 | index = cpu->type & 0xffffffff; |
234 | 234 | ||
235 | /* If index out of bounds, no way to validate. */ | 235 | /* If index out of bounds, no way to validate. */ |
236 | if (index >= sizeof(cpu_hz)/sizeof(cpu_hz[0])) | 236 | if (index >= ARRAY_SIZE(cpu_hz)) |
237 | return cc; | 237 | return cc; |
238 | 238 | ||
239 | /* If index contains no data, no way to validate. */ | 239 | /* If index contains no data, no way to validate. */ |
diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c index f3c1ebfdd0aa..f3e020f2227f 100644 --- a/arch/arm/common/gic.c +++ b/arch/arm/common/gic.c | |||
@@ -95,7 +95,8 @@ static void gic_set_cpu(unsigned int irq, cpumask_t mask_val) | |||
95 | } | 95 | } |
96 | #endif | 96 | #endif |
97 | 97 | ||
98 | static struct irqchip gic_chip = { | 98 | static struct irq_chip gic_chip = { |
99 | .name = "GIC", | ||
99 | .ack = gic_ack_irq, | 100 | .ack = gic_ack_irq, |
100 | .mask = gic_mask_irq, | 101 | .mask = gic_mask_irq, |
101 | .unmask = gic_unmask_irq, | 102 | .unmask = gic_unmask_irq, |
diff --git a/arch/arm/common/locomo.c b/arch/arm/common/locomo.c index 04de83f4f008..4e0dcaef6eb2 100644 --- a/arch/arm/common/locomo.c +++ b/arch/arm/common/locomo.c | |||
@@ -204,7 +204,8 @@ static void locomo_unmask_irq(unsigned int irq) | |||
204 | locomo_writel(r, mapbase + LOCOMO_ICR); | 204 | locomo_writel(r, mapbase + LOCOMO_ICR); |
205 | } | 205 | } |
206 | 206 | ||
207 | static struct irqchip locomo_chip = { | 207 | static struct irq_chip locomo_chip = { |
208 | .name = "LOCOMO", | ||
208 | .ack = locomo_ack_irq, | 209 | .ack = locomo_ack_irq, |
209 | .mask = locomo_mask_irq, | 210 | .mask = locomo_mask_irq, |
210 | .unmask = locomo_unmask_irq, | 211 | .unmask = locomo_unmask_irq, |
@@ -249,7 +250,8 @@ static void locomo_key_unmask_irq(unsigned int irq) | |||
249 | locomo_writel(r, mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC); | 250 | locomo_writel(r, mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC); |
250 | } | 251 | } |
251 | 252 | ||
252 | static struct irqchip locomo_key_chip = { | 253 | static struct irq_chip locomo_key_chip = { |
254 | .name = "LOCOMO-key", | ||
253 | .ack = locomo_key_ack_irq, | 255 | .ack = locomo_key_ack_irq, |
254 | .mask = locomo_key_mask_irq, | 256 | .mask = locomo_key_mask_irq, |
255 | .unmask = locomo_key_unmask_irq, | 257 | .unmask = locomo_key_unmask_irq, |
@@ -312,7 +314,8 @@ static void locomo_gpio_unmask_irq(unsigned int irq) | |||
312 | locomo_writel(r, mapbase + LOCOMO_GIE); | 314 | locomo_writel(r, mapbase + LOCOMO_GIE); |
313 | } | 315 | } |
314 | 316 | ||
315 | static struct irqchip locomo_gpio_chip = { | 317 | static struct irq_chip locomo_gpio_chip = { |
318 | .name = "LOCOMO-gpio", | ||
316 | .ack = locomo_gpio_ack_irq, | 319 | .ack = locomo_gpio_ack_irq, |
317 | .mask = locomo_gpio_mask_irq, | 320 | .mask = locomo_gpio_mask_irq, |
318 | .unmask = locomo_gpio_unmask_irq, | 321 | .unmask = locomo_gpio_unmask_irq, |
@@ -357,7 +360,8 @@ static void locomo_lt_unmask_irq(unsigned int irq) | |||
357 | locomo_writel(r, mapbase + LOCOMO_LTINT); | 360 | locomo_writel(r, mapbase + LOCOMO_LTINT); |
358 | } | 361 | } |
359 | 362 | ||
360 | static struct irqchip locomo_lt_chip = { | 363 | static struct irq_chip locomo_lt_chip = { |
364 | .name = "LOCOMO-lt", | ||
361 | .ack = locomo_lt_ack_irq, | 365 | .ack = locomo_lt_ack_irq, |
362 | .mask = locomo_lt_mask_irq, | 366 | .mask = locomo_lt_mask_irq, |
363 | .unmask = locomo_lt_unmask_irq, | 367 | .unmask = locomo_lt_unmask_irq, |
@@ -418,7 +422,8 @@ static void locomo_spi_unmask_irq(unsigned int irq) | |||
418 | locomo_writel(r, mapbase + LOCOMO_SPIIE); | 422 | locomo_writel(r, mapbase + LOCOMO_SPIIE); |
419 | } | 423 | } |
420 | 424 | ||
421 | static struct irqchip locomo_spi_chip = { | 425 | static struct irq_chip locomo_spi_chip = { |
426 | .name = "LOCOMO-spi", | ||
422 | .ack = locomo_spi_ack_irq, | 427 | .ack = locomo_spi_ack_irq, |
423 | .mask = locomo_spi_mask_irq, | 428 | .mask = locomo_spi_mask_irq, |
424 | .unmask = locomo_spi_unmask_irq, | 429 | .unmask = locomo_spi_unmask_irq, |
diff --git a/arch/arm/common/rtctime.c b/arch/arm/common/rtctime.c index 35c9a64ac14c..4e5445cfb0ea 100644 --- a/arch/arm/common/rtctime.c +++ b/arch/arm/common/rtctime.c | |||
@@ -68,6 +68,7 @@ void rtc_next_alarm_time(struct rtc_time *next, struct rtc_time *now, struct rtc | |||
68 | rtc_time_to_tm(next_time, next); | 68 | rtc_time_to_tm(next_time, next); |
69 | } | 69 | } |
70 | } | 70 | } |
71 | EXPORT_SYMBOL(rtc_next_alarm_time); | ||
71 | 72 | ||
72 | static inline int rtc_arm_read_time(struct rtc_ops *ops, struct rtc_time *tm) | 73 | static inline int rtc_arm_read_time(struct rtc_ops *ops, struct rtc_time *tm) |
73 | { | 74 | { |
diff --git a/arch/arm/common/sa1111.c b/arch/arm/common/sa1111.c index 1cdb26a47e1f..a331c12cead9 100644 --- a/arch/arm/common/sa1111.c +++ b/arch/arm/common/sa1111.c | |||
@@ -272,7 +272,8 @@ static int sa1111_wake_lowirq(unsigned int irq, unsigned int on) | |||
272 | return 0; | 272 | return 0; |
273 | } | 273 | } |
274 | 274 | ||
275 | static struct irqchip sa1111_low_chip = { | 275 | static struct irq_chip sa1111_low_chip = { |
276 | .name = "SA1111-l", | ||
276 | .ack = sa1111_ack_irq, | 277 | .ack = sa1111_ack_irq, |
277 | .mask = sa1111_mask_lowirq, | 278 | .mask = sa1111_mask_lowirq, |
278 | .unmask = sa1111_unmask_lowirq, | 279 | .unmask = sa1111_unmask_lowirq, |
@@ -368,7 +369,8 @@ static int sa1111_wake_highirq(unsigned int irq, unsigned int on) | |||
368 | return 0; | 369 | return 0; |
369 | } | 370 | } |
370 | 371 | ||
371 | static struct irqchip sa1111_high_chip = { | 372 | static struct irq_chip sa1111_high_chip = { |
373 | .name = "SA1111-h", | ||
372 | .ack = sa1111_ack_irq, | 374 | .ack = sa1111_ack_irq, |
373 | .mask = sa1111_mask_highirq, | 375 | .mask = sa1111_mask_highirq, |
374 | .unmask = sa1111_unmask_highirq, | 376 | .unmask = sa1111_unmask_highirq, |
diff --git a/arch/arm/common/vic.c b/arch/arm/common/vic.c index a19bc4a6196d..43d278134521 100644 --- a/arch/arm/common/vic.c +++ b/arch/arm/common/vic.c | |||
@@ -39,7 +39,8 @@ static void vic_unmask_irq(unsigned int irq) | |||
39 | writel(1 << irq, base + VIC_INT_ENABLE); | 39 | writel(1 << irq, base + VIC_INT_ENABLE); |
40 | } | 40 | } |
41 | 41 | ||
42 | static struct irqchip vic_chip = { | 42 | static struct irq_chip vic_chip = { |
43 | .name = "VIC", | ||
43 | .ack = vic_mask_irq, | 44 | .ack = vic_mask_irq, |
44 | .mask = vic_mask_irq, | 45 | .mask = vic_mask_irq, |
45 | .unmask = vic_unmask_irq, | 46 | .unmask = vic_unmask_irq, |
diff --git a/arch/arm/configs/ep93xx_defconfig b/arch/arm/configs/ep93xx_defconfig index c0de6fcd488a..2948b4589a8b 100644 --- a/arch/arm/configs/ep93xx_defconfig +++ b/arch/arm/configs/ep93xx_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.18-rc1 | 3 | # Linux kernel version: 2.6.18-rc1-git9 |
4 | # Sun Jul 9 15:21:30 2006 | 4 | # Sat Jul 15 15:08:10 2006 |
5 | # | 5 | # |
6 | CONFIG_ARM=y | 6 | CONFIG_ARM=y |
7 | CONFIG_MMU=y | 7 | CONFIG_MMU=y |
@@ -30,6 +30,7 @@ CONFIG_SWAP=y | |||
30 | CONFIG_SYSVIPC=y | 30 | CONFIG_SYSVIPC=y |
31 | # CONFIG_POSIX_MQUEUE is not set | 31 | # CONFIG_POSIX_MQUEUE is not set |
32 | # CONFIG_BSD_PROCESS_ACCT is not set | 32 | # CONFIG_BSD_PROCESS_ACCT is not set |
33 | # CONFIG_TASKSTATS is not set | ||
33 | CONFIG_SYSCTL=y | 34 | CONFIG_SYSCTL=y |
34 | # CONFIG_AUDIT is not set | 35 | # CONFIG_AUDIT is not set |
35 | CONFIG_IKCONFIG=y | 36 | CONFIG_IKCONFIG=y |
@@ -749,7 +750,7 @@ CONFIG_VIDEO_V4L2=y | |||
749 | # USB support | 750 | # USB support |
750 | # | 751 | # |
751 | CONFIG_USB_ARCH_HAS_HCD=y | 752 | CONFIG_USB_ARCH_HAS_HCD=y |
752 | # CONFIG_USB_ARCH_HAS_OHCI is not set | 753 | CONFIG_USB_ARCH_HAS_OHCI=y |
753 | # CONFIG_USB_ARCH_HAS_EHCI is not set | 754 | # CONFIG_USB_ARCH_HAS_EHCI is not set |
754 | CONFIG_USB=y | 755 | CONFIG_USB=y |
755 | CONFIG_USB_DEBUG=y | 756 | CONFIG_USB_DEBUG=y |
@@ -766,6 +767,9 @@ CONFIG_USB_DYNAMIC_MINORS=y | |||
766 | # USB Host Controller Drivers | 767 | # USB Host Controller Drivers |
767 | # | 768 | # |
768 | # CONFIG_USB_ISP116X_HCD is not set | 769 | # CONFIG_USB_ISP116X_HCD is not set |
770 | CONFIG_USB_OHCI_HCD=y | ||
771 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set | ||
772 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
769 | # CONFIG_USB_SL811_HCD is not set | 773 | # CONFIG_USB_SL811_HCD is not set |
770 | 774 | ||
771 | # | 775 | # |
@@ -855,6 +859,7 @@ CONFIG_USB_SERIAL_CONSOLE=y | |||
855 | CONFIG_USB_SERIAL_PL2303=y | 859 | CONFIG_USB_SERIAL_PL2303=y |
856 | # CONFIG_USB_SERIAL_HP4X is not set | 860 | # CONFIG_USB_SERIAL_HP4X is not set |
857 | # CONFIG_USB_SERIAL_SAFE is not set | 861 | # CONFIG_USB_SERIAL_SAFE is not set |
862 | # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set | ||
858 | # CONFIG_USB_SERIAL_TI is not set | 863 | # CONFIG_USB_SERIAL_TI is not set |
859 | # CONFIG_USB_SERIAL_CYBERJACK is not set | 864 | # CONFIG_USB_SERIAL_CYBERJACK is not set |
860 | # CONFIG_USB_SERIAL_XIRCOM is not set | 865 | # CONFIG_USB_SERIAL_XIRCOM is not set |
@@ -871,7 +876,7 @@ CONFIG_USB_SERIAL_PL2303=y | |||
871 | # CONFIG_USB_LEGOTOWER is not set | 876 | # CONFIG_USB_LEGOTOWER is not set |
872 | # CONFIG_USB_LCD is not set | 877 | # CONFIG_USB_LCD is not set |
873 | # CONFIG_USB_LED is not set | 878 | # CONFIG_USB_LED is not set |
874 | # CONFIG_USB_CY7C63 is not set | 879 | # CONFIG_USB_CYPRESS_CY7C63 is not set |
875 | # CONFIG_USB_CYTHERM is not set | 880 | # CONFIG_USB_CYTHERM is not set |
876 | # CONFIG_USB_PHIDGETKIT is not set | 881 | # CONFIG_USB_PHIDGETKIT is not set |
877 | # CONFIG_USB_PHIDGETSERVO is not set | 882 | # CONFIG_USB_PHIDGETSERVO is not set |
@@ -916,6 +921,7 @@ CONFIG_RTC_INTF_DEV=y | |||
916 | # CONFIG_RTC_DRV_X1205 is not set | 921 | # CONFIG_RTC_DRV_X1205 is not set |
917 | # CONFIG_RTC_DRV_DS1307 is not set | 922 | # CONFIG_RTC_DRV_DS1307 is not set |
918 | # CONFIG_RTC_DRV_DS1553 is not set | 923 | # CONFIG_RTC_DRV_DS1553 is not set |
924 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
919 | # CONFIG_RTC_DRV_DS1672 is not set | 925 | # CONFIG_RTC_DRV_DS1672 is not set |
920 | # CONFIG_RTC_DRV_DS1742 is not set | 926 | # CONFIG_RTC_DRV_DS1742 is not set |
921 | # CONFIG_RTC_DRV_PCF8563 is not set | 927 | # CONFIG_RTC_DRV_PCF8563 is not set |
@@ -1023,7 +1029,6 @@ CONFIG_SUNRPC=y | |||
1023 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 1029 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
1024 | # CONFIG_SMB_FS is not set | 1030 | # CONFIG_SMB_FS is not set |
1025 | # CONFIG_CIFS is not set | 1031 | # CONFIG_CIFS is not set |
1026 | # CONFIG_CIFS_DEBUG2 is not set | ||
1027 | # CONFIG_NCP_FS is not set | 1032 | # CONFIG_NCP_FS is not set |
1028 | # CONFIG_CODA_FS is not set | 1033 | # CONFIG_CODA_FS is not set |
1029 | # CONFIG_AFS_FS is not set | 1034 | # CONFIG_AFS_FS is not set |
diff --git a/arch/arm/kernel/ecard.c b/arch/arm/kernel/ecard.c index b9a74a741d00..eca248d9eba4 100644 --- a/arch/arm/kernel/ecard.c +++ b/arch/arm/kernel/ecard.c | |||
@@ -470,7 +470,8 @@ static void ecard_irq_mask(unsigned int irqnr) | |||
470 | } | 470 | } |
471 | } | 471 | } |
472 | 472 | ||
473 | static struct irqchip ecard_chip = { | 473 | static struct irq_chip ecard_chip = { |
474 | .name = "ECARD", | ||
474 | .ack = ecard_irq_mask, | 475 | .ack = ecard_irq_mask, |
475 | .mask = ecard_irq_mask, | 476 | .mask = ecard_irq_mask, |
476 | .unmask = ecard_irq_unmask, | 477 | .unmask = ecard_irq_unmask, |
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 2242f5f7cb7d..4fe386eea4b4 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
@@ -114,9 +114,9 @@ ENTRY(secondary_startup) | |||
114 | * Use the page tables supplied from __cpu_up. | 114 | * Use the page tables supplied from __cpu_up. |
115 | */ | 115 | */ |
116 | adr r4, __secondary_data | 116 | adr r4, __secondary_data |
117 | ldmia r4, {r5, r6, r13} @ address to jump to after | 117 | ldmia r4, {r5, r7, r13} @ address to jump to after |
118 | sub r4, r4, r5 @ mmu has been enabled | 118 | sub r4, r4, r5 @ mmu has been enabled |
119 | ldr r4, [r6, r4] @ get secondary_data.pgdir | 119 | ldr r4, [r7, r4] @ get secondary_data.pgdir |
120 | adr lr, __enable_mmu @ return address | 120 | adr lr, __enable_mmu @ return address |
121 | add pc, r10, #12 @ initialise processor | 121 | add pc, r10, #12 @ initialise processor |
122 | @ (return control reg) | 122 | @ (return control reg) |
@@ -125,7 +125,7 @@ ENTRY(secondary_startup) | |||
125 | * r6 = &secondary_data | 125 | * r6 = &secondary_data |
126 | */ | 126 | */ |
127 | ENTRY(__secondary_switched) | 127 | ENTRY(__secondary_switched) |
128 | ldr sp, [r6, #4] @ get secondary_data.stack | 128 | ldr sp, [r7, #4] @ get secondary_data.stack |
129 | mov fp, #0 | 129 | mov fp, #0 |
130 | b secondary_start_kernel | 130 | b secondary_start_kernel |
131 | 131 | ||
diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 626feeec0ade..2e1bf830fe11 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c | |||
@@ -77,6 +77,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
77 | seq_printf(p, "%3d: ", i); | 77 | seq_printf(p, "%3d: ", i); |
78 | for_each_present_cpu(cpu) | 78 | for_each_present_cpu(cpu) |
79 | seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]); | 79 | seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]); |
80 | seq_printf(p, " %10s", irq_desc[i].chip->name ? : "-"); | ||
80 | seq_printf(p, " %s", action->name); | 81 | seq_printf(p, " %s", action->name); |
81 | for (action = action->next; action; action = action->next) | 82 | for (action = action->next; action; action = action->next) |
82 | seq_printf(p, ", %s", action->name); | 83 | seq_printf(p, ", %s", action->name); |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 35a052fc177a..aeeed806f991 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -232,11 +232,8 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err) | |||
232 | bust_spinlocks(0); | 232 | bust_spinlocks(0); |
233 | spin_unlock_irq(&die_lock); | 233 | spin_unlock_irq(&die_lock); |
234 | 234 | ||
235 | if (panic_on_oops) { | 235 | if (panic_on_oops) |
236 | printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n"); | ||
237 | ssleep(5); | ||
238 | panic("Fatal exception"); | 236 | panic("Fatal exception"); |
239 | } | ||
240 | 237 | ||
241 | do_exit(SIGSEGV); | 238 | do_exit(SIGSEGV); |
242 | } | 239 | } |
diff --git a/arch/arm/mach-at91rm9200/gpio.c b/arch/arm/mach-at91rm9200/gpio.c index 5783c282ae7b..cec199fd6721 100644 --- a/arch/arm/mach-at91rm9200/gpio.c +++ b/arch/arm/mach-at91rm9200/gpio.c | |||
@@ -327,7 +327,8 @@ static int gpio_irq_type(unsigned pin, unsigned type) | |||
327 | return (type == IRQT_BOTHEDGE) ? 0 : -EINVAL; | 327 | return (type == IRQT_BOTHEDGE) ? 0 : -EINVAL; |
328 | } | 328 | } |
329 | 329 | ||
330 | static struct irqchip gpio_irqchip = { | 330 | static struct irq_chip gpio_irqchip = { |
331 | .name = "GPIO", | ||
331 | .mask = gpio_irq_mask, | 332 | .mask = gpio_irq_mask, |
332 | .unmask = gpio_irq_unmask, | 333 | .unmask = gpio_irq_unmask, |
333 | .set_type = gpio_irq_type, | 334 | .set_type = gpio_irq_type, |
diff --git a/arch/arm/mach-at91rm9200/irq.c b/arch/arm/mach-at91rm9200/irq.c index 9b0911320417..c3a5e777f9f8 100644 --- a/arch/arm/mach-at91rm9200/irq.c +++ b/arch/arm/mach-at91rm9200/irq.c | |||
@@ -114,7 +114,8 @@ void at91_irq_resume(void) | |||
114 | #define at91_aic_set_wake NULL | 114 | #define at91_aic_set_wake NULL |
115 | #endif | 115 | #endif |
116 | 116 | ||
117 | static struct irqchip at91_aic_chip = { | 117 | static struct irq_chip at91_aic_chip = { |
118 | .name = "AIC", | ||
118 | .ack = at91_aic_mask_irq, | 119 | .ack = at91_aic_mask_irq, |
119 | .mask = at91_aic_mask_irq, | 120 | .mask = at91_aic_mask_irq, |
120 | .unmask = at91_aic_unmask_irq, | 121 | .unmask = at91_aic_unmask_irq, |
diff --git a/arch/arm/mach-footbridge/cats-hw.c b/arch/arm/mach-footbridge/cats-hw.c index 5b64d5c5b967..ef6ccc8993e9 100644 --- a/arch/arm/mach-footbridge/cats-hw.c +++ b/arch/arm/mach-footbridge/cats-hw.c | |||
@@ -8,7 +8,7 @@ | |||
8 | #include <linux/ioport.h> | 8 | #include <linux/ioport.h> |
9 | #include <linux/kernel.h> | 9 | #include <linux/kernel.h> |
10 | #include <linux/init.h> | 10 | #include <linux/init.h> |
11 | #include <linux/tty.h> | 11 | #include <linux/screen_info.h> |
12 | 12 | ||
13 | #include <asm/hardware/dec21285.h> | 13 | #include <asm/hardware/dec21285.h> |
14 | #include <asm/io.h> | 14 | #include <asm/io.h> |
diff --git a/arch/arm/mach-imx/irq.c b/arch/arm/mach-imx/irq.c index a5de5f1da9f2..2688bd82c2a2 100644 --- a/arch/arm/mach-imx/irq.c +++ b/arch/arm/mach-imx/irq.c | |||
@@ -204,13 +204,15 @@ imx_gpiod_demux_handler(unsigned int irq_unused, struct irqdesc *desc, | |||
204 | imx_gpio_handler(mask, irq, desc, regs); | 204 | imx_gpio_handler(mask, irq, desc, regs); |
205 | } | 205 | } |
206 | 206 | ||
207 | static struct irqchip imx_internal_chip = { | 207 | static struct irq_chip imx_internal_chip = { |
208 | .name = "MPU", | ||
208 | .ack = imx_mask_irq, | 209 | .ack = imx_mask_irq, |
209 | .mask = imx_mask_irq, | 210 | .mask = imx_mask_irq, |
210 | .unmask = imx_unmask_irq, | 211 | .unmask = imx_unmask_irq, |
211 | }; | 212 | }; |
212 | 213 | ||
213 | static struct irqchip imx_gpio_chip = { | 214 | static struct irq_chip imx_gpio_chip = { |
215 | .name = "GPIO", | ||
214 | .ack = imx_gpio_ack_irq, | 216 | .ack = imx_gpio_ack_irq, |
215 | .mask = imx_gpio_mask_irq, | 217 | .mask = imx_gpio_mask_irq, |
216 | .unmask = imx_gpio_unmask_irq, | 218 | .unmask = imx_gpio_unmask_irq, |
diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c index 6d65c96ebfd2..191c57a3b997 100644 --- a/arch/arm/mach-integrator/integrator_ap.c +++ b/arch/arm/mach-integrator/integrator_ap.c | |||
@@ -161,7 +161,8 @@ static void sc_unmask_irq(unsigned int irq) | |||
161 | writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_SET); | 161 | writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_SET); |
162 | } | 162 | } |
163 | 163 | ||
164 | static struct irqchip sc_chip = { | 164 | static struct irq_chip sc_chip = { |
165 | .name = "SC", | ||
165 | .ack = sc_mask_irq, | 166 | .ack = sc_mask_irq, |
166 | .mask = sc_mask_irq, | 167 | .mask = sc_mask_irq, |
167 | .unmask = sc_unmask_irq, | 168 | .unmask = sc_unmask_irq, |
diff --git a/arch/arm/mach-integrator/integrator_cp.c b/arch/arm/mach-integrator/integrator_cp.c index 9f55f5ae1044..678b6ba2b463 100644 --- a/arch/arm/mach-integrator/integrator_cp.c +++ b/arch/arm/mach-integrator/integrator_cp.c | |||
@@ -156,7 +156,8 @@ static void cic_unmask_irq(unsigned int irq) | |||
156 | cic_writel(1 << irq, INTCP_VA_CIC_BASE + IRQ_ENABLE_SET); | 156 | cic_writel(1 << irq, INTCP_VA_CIC_BASE + IRQ_ENABLE_SET); |
157 | } | 157 | } |
158 | 158 | ||
159 | static struct irqchip cic_chip = { | 159 | static struct irq_chip cic_chip = { |
160 | .name = "CIC", | ||
160 | .ack = cic_mask_irq, | 161 | .ack = cic_mask_irq, |
161 | .mask = cic_mask_irq, | 162 | .mask = cic_mask_irq, |
162 | .unmask = cic_unmask_irq, | 163 | .unmask = cic_unmask_irq, |
@@ -174,7 +175,8 @@ static void pic_unmask_irq(unsigned int irq) | |||
174 | pic_writel(1 << irq, INTCP_VA_PIC_BASE + IRQ_ENABLE_SET); | 175 | pic_writel(1 << irq, INTCP_VA_PIC_BASE + IRQ_ENABLE_SET); |
175 | } | 176 | } |
176 | 177 | ||
177 | static struct irqchip pic_chip = { | 178 | static struct irq_chip pic_chip = { |
179 | .name = "PIC", | ||
178 | .ack = pic_mask_irq, | 180 | .ack = pic_mask_irq, |
179 | .mask = pic_mask_irq, | 181 | .mask = pic_mask_irq, |
180 | .unmask = pic_unmask_irq, | 182 | .unmask = pic_unmask_irq, |
@@ -192,7 +194,8 @@ static void sic_unmask_irq(unsigned int irq) | |||
192 | sic_writel(1 << irq, INTCP_VA_SIC_BASE + IRQ_ENABLE_SET); | 194 | sic_writel(1 << irq, INTCP_VA_SIC_BASE + IRQ_ENABLE_SET); |
193 | } | 195 | } |
194 | 196 | ||
195 | static struct irqchip sic_chip = { | 197 | static struct irq_chip sic_chip = { |
198 | .name = "SIC", | ||
196 | .ack = sic_mask_irq, | 199 | .ack = sic_mask_irq, |
197 | .mask = sic_mask_irq, | 200 | .mask = sic_mask_irq, |
198 | .unmask = sic_unmask_irq, | 201 | .unmask = sic_unmask_irq, |
diff --git a/arch/arm/mach-iop3xx/iop321-irq.c b/arch/arm/mach-iop3xx/iop321-irq.c index d42aae6aef03..88ac333472c8 100644 --- a/arch/arm/mach-iop3xx/iop321-irq.c +++ b/arch/arm/mach-iop3xx/iop321-irq.c | |||
@@ -52,7 +52,8 @@ iop321_irq_unmask (unsigned int irq) | |||
52 | intctl_write(iop321_mask); | 52 | intctl_write(iop321_mask); |
53 | } | 53 | } |
54 | 54 | ||
55 | struct irqchip ext_chip = { | 55 | struct irq_chip ext_chip = { |
56 | .name = "IOP", | ||
56 | .ack = iop321_irq_mask, | 57 | .ack = iop321_irq_mask, |
57 | .mask = iop321_irq_mask, | 58 | .mask = iop321_irq_mask, |
58 | .unmask = iop321_irq_unmask, | 59 | .unmask = iop321_irq_unmask, |
diff --git a/arch/arm/mach-iop3xx/iop331-irq.c b/arch/arm/mach-iop3xx/iop331-irq.c index f4d4321737a4..cab11722ced2 100644 --- a/arch/arm/mach-iop3xx/iop331-irq.c +++ b/arch/arm/mach-iop3xx/iop331-irq.c | |||
@@ -77,13 +77,15 @@ iop331_irq_unmask2(unsigned int irq) | |||
77 | intctl_write1(iop331_mask1); | 77 | intctl_write1(iop331_mask1); |
78 | } | 78 | } |
79 | 79 | ||
80 | struct irqchip iop331_irqchip1 = { | 80 | struct irq_chip iop331_irqchip1 = { |
81 | .name = "IOP-1", | ||
81 | .ack = iop331_irq_mask1, | 82 | .ack = iop331_irq_mask1, |
82 | .mask = iop331_irq_mask1, | 83 | .mask = iop331_irq_mask1, |
83 | .unmask = iop331_irq_unmask1, | 84 | .unmask = iop331_irq_unmask1, |
84 | }; | 85 | }; |
85 | 86 | ||
86 | struct irqchip iop331_irqchip2 = { | 87 | struct irq_chip iop331_irqchip2 = { |
88 | .name = "IOP-2", | ||
87 | .ack = iop331_irq_mask2, | 89 | .ack = iop331_irq_mask2, |
88 | .mask = iop331_irq_mask2, | 90 | .mask = iop331_irq_mask2, |
89 | .unmask = iop331_irq_unmask2, | 91 | .unmask = iop331_irq_unmask2, |
diff --git a/arch/arm/mach-ixp4xx/common-pci.c b/arch/arm/mach-ixp4xx/common-pci.c index 2d40fe1145f0..9562177b5fe1 100644 --- a/arch/arm/mach-ixp4xx/common-pci.c +++ b/arch/arm/mach-ixp4xx/common-pci.c | |||
@@ -532,8 +532,6 @@ pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask) | |||
532 | return -EIO; | 532 | return -EIO; |
533 | } | 533 | } |
534 | 534 | ||
535 | EXPORT_SYMBOL(pci_set_dma_mask); | ||
536 | EXPORT_SYMBOL(pci_set_consistent_dma_mask); | ||
537 | EXPORT_SYMBOL(ixp4xx_pci_read); | 535 | EXPORT_SYMBOL(ixp4xx_pci_read); |
538 | EXPORT_SYMBOL(ixp4xx_pci_write); | 536 | EXPORT_SYMBOL(ixp4xx_pci_write); |
539 | 537 | ||
diff --git a/arch/arm/mach-ixp4xx/gtwx5715-setup.c b/arch/arm/mach-ixp4xx/gtwx5715-setup.c index 654e2eed81fb..30f1300e0e21 100644 --- a/arch/arm/mach-ixp4xx/gtwx5715-setup.c +++ b/arch/arm/mach-ixp4xx/gtwx5715-setup.c | |||
@@ -107,9 +107,9 @@ static struct flash_platform_data gtwx5715_flash_data = { | |||
107 | .width = 2, | 107 | .width = 2, |
108 | }; | 108 | }; |
109 | 109 | ||
110 | static struct gtw5715_flash_resource = { | 110 | static struct resource gtwx5715_flash_resource = { |
111 | .flags = IORESOURCE_MEM, | 111 | .flags = IORESOURCE_MEM, |
112 | } | 112 | }; |
113 | 113 | ||
114 | static struct platform_device gtwx5715_flash = { | 114 | static struct platform_device gtwx5715_flash = { |
115 | .name = "IXP4XX-Flash", | 115 | .name = "IXP4XX-Flash", |
@@ -130,9 +130,6 @@ static void __init gtwx5715_init(void) | |||
130 | { | 130 | { |
131 | ixp4xx_sys_init(); | 131 | ixp4xx_sys_init(); |
132 | 132 | ||
133 | if (!flash_resource) | ||
134 | printk(KERN_ERR "Could not allocate flash resource\n"); | ||
135 | |||
136 | gtwx5715_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); | 133 | gtwx5715_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); |
137 | gtwx5715_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_8M - 1; | 134 | gtwx5715_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_8M - 1; |
138 | 135 | ||
diff --git a/arch/arm/mach-lh7a40x/arch-kev7a400.c b/arch/arm/mach-lh7a40x/arch-kev7a400.c index 2cccc27c62e4..4f2ab48800a5 100644 --- a/arch/arm/mach-lh7a40x/arch-kev7a400.c +++ b/arch/arm/mach-lh7a40x/arch-kev7a400.c | |||
@@ -63,7 +63,8 @@ static void kev7a400_unmask_cpld_irq (u32 irq) | |||
63 | CPLD_WR_PB_INT_MASK = CPLD_IRQ_mask; | 63 | CPLD_WR_PB_INT_MASK = CPLD_IRQ_mask; |
64 | } | 64 | } |
65 | 65 | ||
66 | static struct irqchip kev7a400_cpld_chip = { | 66 | static struct irq_chip kev7a400_cpld_chip = { |
67 | .name = "CPLD", | ||
67 | .ack = kev7a400_ack_cpld_irq, | 68 | .ack = kev7a400_ack_cpld_irq, |
68 | .mask = kev7a400_mask_cpld_irq, | 69 | .mask = kev7a400_mask_cpld_irq, |
69 | .unmask = kev7a400_unmask_cpld_irq, | 70 | .unmask = kev7a400_unmask_cpld_irq, |
diff --git a/arch/arm/mach-lh7a40x/arch-lpd7a40x.c b/arch/arm/mach-lh7a40x/arch-lpd7a40x.c index 35c3606a2079..a6910114b24c 100644 --- a/arch/arm/mach-lh7a40x/arch-lpd7a40x.c +++ b/arch/arm/mach-lh7a40x/arch-lpd7a40x.c | |||
@@ -200,7 +200,8 @@ static void lh7a40x_unmask_cpld_irq (u32 irq) | |||
200 | } | 200 | } |
201 | } | 201 | } |
202 | 202 | ||
203 | static struct irqchip lpd7a40x_cpld_chip = { | 203 | static struct irq_chip lpd7a40x_cpld_chip = { |
204 | .name = "CPLD", | ||
204 | .ack = lh7a40x_ack_cpld_irq, | 205 | .ack = lh7a40x_ack_cpld_irq, |
205 | .mask = lh7a40x_mask_cpld_irq, | 206 | .mask = lh7a40x_mask_cpld_irq, |
206 | .unmask = lh7a40x_unmask_cpld_irq, | 207 | .unmask = lh7a40x_unmask_cpld_irq, |
diff --git a/arch/arm/mach-lh7a40x/irq-kev7a400.c b/arch/arm/mach-lh7a40x/irq-kev7a400.c index 8535764d89ca..f9b3fe9174a5 100644 --- a/arch/arm/mach-lh7a40x/irq-kev7a400.c +++ b/arch/arm/mach-lh7a40x/irq-kev7a400.c | |||
@@ -43,7 +43,8 @@ lh7a400_unmask_cpld_irq (u32 irq) | |||
43 | } | 43 | } |
44 | 44 | ||
45 | static struct | 45 | static struct |
46 | irqchip lh7a400_cpld_chip = { | 46 | irq_chip lh7a400_cpld_chip = { |
47 | .name = "CPLD", | ||
47 | .ack = lh7a400_ack_cpld_irq, | 48 | .ack = lh7a400_ack_cpld_irq, |
48 | .mask = lh7a400_mask_cpld_irq, | 49 | .mask = lh7a400_mask_cpld_irq, |
49 | .unmask = lh7a400_unmask_cpld_irq, | 50 | .unmask = lh7a400_unmask_cpld_irq, |
diff --git a/arch/arm/mach-lh7a40x/irq-lh7a400.c b/arch/arm/mach-lh7a40x/irq-lh7a400.c index f9fdefef6d6f..091b2dc58d25 100644 --- a/arch/arm/mach-lh7a40x/irq-lh7a400.c +++ b/arch/arm/mach-lh7a40x/irq-lh7a400.c | |||
@@ -38,13 +38,15 @@ static void lh7a400_ack_gpio_irq (u32 irq) | |||
38 | INTC_INTENC = (1 << irq); | 38 | INTC_INTENC = (1 << irq); |
39 | } | 39 | } |
40 | 40 | ||
41 | static struct irqchip lh7a400_internal_chip = { | 41 | static struct irq_chip lh7a400_internal_chip = { |
42 | .name = "MPU", | ||
42 | .ack = lh7a400_mask_irq, /* Level triggering -> mask is ack */ | 43 | .ack = lh7a400_mask_irq, /* Level triggering -> mask is ack */ |
43 | .mask = lh7a400_mask_irq, | 44 | .mask = lh7a400_mask_irq, |
44 | .unmask = lh7a400_unmask_irq, | 45 | .unmask = lh7a400_unmask_irq, |
45 | }; | 46 | }; |
46 | 47 | ||
47 | static struct irqchip lh7a400_gpio_chip = { | 48 | static struct irq_chip lh7a400_gpio_chip = { |
49 | .name = "GPIO", | ||
48 | .ack = lh7a400_ack_gpio_irq, | 50 | .ack = lh7a400_ack_gpio_irq, |
49 | .mask = lh7a400_mask_irq, | 51 | .mask = lh7a400_mask_irq, |
50 | .unmask = lh7a400_unmask_irq, | 52 | .unmask = lh7a400_unmask_irq, |
diff --git a/arch/arm/mach-lh7a40x/irq-lh7a404.c b/arch/arm/mach-lh7a40x/irq-lh7a404.c index 2685a81454d2..7059b983724f 100644 --- a/arch/arm/mach-lh7a40x/irq-lh7a404.c +++ b/arch/arm/mach-lh7a40x/irq-lh7a404.c | |||
@@ -76,25 +76,29 @@ static void lh7a404_vic2_ack_gpio_irq (u32 irq) | |||
76 | VIC2_INTENCLR = (1 << irq); | 76 | VIC2_INTENCLR = (1 << irq); |
77 | } | 77 | } |
78 | 78 | ||
79 | static struct irqchip lh7a404_vic1_chip = { | 79 | static struct irq_chip lh7a404_vic1_chip = { |
80 | .name = "VIC1", | ||
80 | .ack = lh7a404_vic1_mask_irq, /* Because level-triggered */ | 81 | .ack = lh7a404_vic1_mask_irq, /* Because level-triggered */ |
81 | .mask = lh7a404_vic1_mask_irq, | 82 | .mask = lh7a404_vic1_mask_irq, |
82 | .unmask = lh7a404_vic1_unmask_irq, | 83 | .unmask = lh7a404_vic1_unmask_irq, |
83 | }; | 84 | }; |
84 | 85 | ||
85 | static struct irqchip lh7a404_vic2_chip = { | 86 | static struct irq_chip lh7a404_vic2_chip = { |
87 | .name = "VIC2", | ||
86 | .ack = lh7a404_vic2_mask_irq, /* Because level-triggered */ | 88 | .ack = lh7a404_vic2_mask_irq, /* Because level-triggered */ |
87 | .mask = lh7a404_vic2_mask_irq, | 89 | .mask = lh7a404_vic2_mask_irq, |
88 | .unmask = lh7a404_vic2_unmask_irq, | 90 | .unmask = lh7a404_vic2_unmask_irq, |
89 | }; | 91 | }; |
90 | 92 | ||
91 | static struct irqchip lh7a404_gpio_vic1_chip = { | 93 | static struct irq_chip lh7a404_gpio_vic1_chip = { |
94 | .name = "GPIO-VIC1", | ||
92 | .ack = lh7a404_vic1_ack_gpio_irq, | 95 | .ack = lh7a404_vic1_ack_gpio_irq, |
93 | .mask = lh7a404_vic1_mask_irq, | 96 | .mask = lh7a404_vic1_mask_irq, |
94 | .unmask = lh7a404_vic1_unmask_irq, | 97 | .unmask = lh7a404_vic1_unmask_irq, |
95 | }; | 98 | }; |
96 | 99 | ||
97 | static struct irqchip lh7a404_gpio_vic2_chip = { | 100 | static struct irq_chip lh7a404_gpio_vic2_chip = { |
101 | .name = "GPIO-VIC2", | ||
98 | .ack = lh7a404_vic2_ack_gpio_irq, | 102 | .ack = lh7a404_vic2_ack_gpio_irq, |
99 | .mask = lh7a404_vic2_mask_irq, | 103 | .mask = lh7a404_vic2_mask_irq, |
100 | .unmask = lh7a404_vic2_unmask_irq, | 104 | .unmask = lh7a404_vic2_unmask_irq, |
diff --git a/arch/arm/mach-lh7a40x/irq-lpd7a40x.c b/arch/arm/mach-lh7a40x/irq-lpd7a40x.c index dcb4e17b9419..d6055dde6468 100644 --- a/arch/arm/mach-lh7a40x/irq-lpd7a40x.c +++ b/arch/arm/mach-lh7a40x/irq-lpd7a40x.c | |||
@@ -50,7 +50,8 @@ static void lh7a40x_unmask_cpld_irq (u32 irq) | |||
50 | } | 50 | } |
51 | } | 51 | } |
52 | 52 | ||
53 | static struct irqchip lh7a40x_cpld_chip = { | 53 | static struct irq_chip lh7a40x_cpld_chip = { |
54 | .name = "CPLD", | ||
54 | .ack = lh7a40x_ack_cpld_irq, | 55 | .ack = lh7a40x_ack_cpld_irq, |
55 | .mask = lh7a40x_mask_cpld_irq, | 56 | .mask = lh7a40x_mask_cpld_irq, |
56 | .unmask = lh7a40x_unmask_cpld_irq, | 57 | .unmask = lh7a40x_unmask_cpld_irq, |
diff --git a/arch/arm/mach-omap1/fpga.c b/arch/arm/mach-omap1/fpga.c index 34eb79ee6e61..efe9bfc6e55f 100644 --- a/arch/arm/mach-omap1/fpga.c +++ b/arch/arm/mach-omap1/fpga.c | |||
@@ -106,14 +106,16 @@ void innovator_fpga_IRQ_demux(unsigned int irq, struct irqdesc *desc, | |||
106 | } | 106 | } |
107 | } | 107 | } |
108 | 108 | ||
109 | static struct irqchip omap_fpga_irq_ack = { | 109 | static struct irq_chip omap_fpga_irq_ack = { |
110 | .name = "FPGA-ack", | ||
110 | .ack = fpga_mask_ack_irq, | 111 | .ack = fpga_mask_ack_irq, |
111 | .mask = fpga_mask_irq, | 112 | .mask = fpga_mask_irq, |
112 | .unmask = fpga_unmask_irq, | 113 | .unmask = fpga_unmask_irq, |
113 | }; | 114 | }; |
114 | 115 | ||
115 | 116 | ||
116 | static struct irqchip omap_fpga_irq = { | 117 | static struct irq_chip omap_fpga_irq = { |
118 | .name = "FPGA", | ||
117 | .ack = fpga_ack_irq, | 119 | .ack = fpga_ack_irq, |
118 | .mask = fpga_mask_irq, | 120 | .mask = fpga_mask_irq, |
119 | .unmask = fpga_unmask_irq, | 121 | .unmask = fpga_unmask_irq, |
diff --git a/arch/arm/mach-omap1/irq.c b/arch/arm/mach-omap1/irq.c index 9e039845b50e..3ea140bb9eba 100644 --- a/arch/arm/mach-omap1/irq.c +++ b/arch/arm/mach-omap1/irq.c | |||
@@ -168,7 +168,8 @@ static struct omap_irq_bank omap1610_irq_banks[] = { | |||
168 | }; | 168 | }; |
169 | #endif | 169 | #endif |
170 | 170 | ||
171 | static struct irqchip omap_irq_chip = { | 171 | static struct irq_chip omap_irq_chip = { |
172 | .name = "MPU", | ||
172 | .ack = omap_mask_ack_irq, | 173 | .ack = omap_mask_ack_irq, |
173 | .mask = omap_mask_irq, | 174 | .mask = omap_mask_irq, |
174 | .unmask = omap_unmask_irq, | 175 | .unmask = omap_unmask_irq, |
diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c index 3eed6a737bf8..dfc3b35cc1ff 100644 --- a/arch/arm/mach-omap2/irq.c +++ b/arch/arm/mach-omap2/irq.c | |||
@@ -94,7 +94,8 @@ static void omap_mask_ack_irq(unsigned int irq) | |||
94 | omap_ack_irq(irq); | 94 | omap_ack_irq(irq); |
95 | } | 95 | } |
96 | 96 | ||
97 | static struct irqchip omap_irq_chip = { | 97 | static struct irq_chip omap_irq_chip = { |
98 | .name = "INTC", | ||
98 | .ack = omap_mask_ack_irq, | 99 | .ack = omap_mask_ack_irq, |
99 | .mask = omap_mask_irq, | 100 | .mask = omap_mask_irq, |
100 | .unmask = omap_unmask_irq, | 101 | .unmask = omap_unmask_irq, |
diff --git a/arch/arm/mach-pxa/irq.c b/arch/arm/mach-pxa/irq.c index d9635ff4b10c..12141e2a50cc 100644 --- a/arch/arm/mach-pxa/irq.c +++ b/arch/arm/mach-pxa/irq.c | |||
@@ -39,7 +39,8 @@ static void pxa_unmask_low_irq(unsigned int irq) | |||
39 | ICMR |= (1 << (irq + PXA_IRQ_SKIP)); | 39 | ICMR |= (1 << (irq + PXA_IRQ_SKIP)); |
40 | } | 40 | } |
41 | 41 | ||
42 | static struct irqchip pxa_internal_chip_low = { | 42 | static struct irq_chip pxa_internal_chip_low = { |
43 | .name = "SC", | ||
43 | .ack = pxa_mask_low_irq, | 44 | .ack = pxa_mask_low_irq, |
44 | .mask = pxa_mask_low_irq, | 45 | .mask = pxa_mask_low_irq, |
45 | .unmask = pxa_unmask_low_irq, | 46 | .unmask = pxa_unmask_low_irq, |
@@ -61,7 +62,8 @@ static void pxa_unmask_high_irq(unsigned int irq) | |||
61 | ICMR2 |= (1 << (irq - 32 + PXA_IRQ_SKIP)); | 62 | ICMR2 |= (1 << (irq - 32 + PXA_IRQ_SKIP)); |
62 | } | 63 | } |
63 | 64 | ||
64 | static struct irqchip pxa_internal_chip_high = { | 65 | static struct irq_chip pxa_internal_chip_high = { |
66 | .name = "SC-hi", | ||
65 | .ack = pxa_mask_high_irq, | 67 | .ack = pxa_mask_high_irq, |
66 | .mask = pxa_mask_high_irq, | 68 | .mask = pxa_mask_high_irq, |
67 | .unmask = pxa_unmask_high_irq, | 69 | .unmask = pxa_unmask_high_irq, |
@@ -129,7 +131,8 @@ static void pxa_ack_low_gpio(unsigned int irq) | |||
129 | GEDR0 = (1 << (irq - IRQ_GPIO0)); | 131 | GEDR0 = (1 << (irq - IRQ_GPIO0)); |
130 | } | 132 | } |
131 | 133 | ||
132 | static struct irqchip pxa_low_gpio_chip = { | 134 | static struct irq_chip pxa_low_gpio_chip = { |
135 | .name = "GPIO-l", | ||
133 | .ack = pxa_ack_low_gpio, | 136 | .ack = pxa_ack_low_gpio, |
134 | .mask = pxa_mask_low_irq, | 137 | .mask = pxa_mask_low_irq, |
135 | .unmask = pxa_unmask_low_irq, | 138 | .unmask = pxa_unmask_low_irq, |
@@ -237,7 +240,8 @@ static void pxa_unmask_muxed_gpio(unsigned int irq) | |||
237 | GFER(gpio) = GPIO_IRQ_falling_edge[idx] & GPIO_IRQ_mask[idx]; | 240 | GFER(gpio) = GPIO_IRQ_falling_edge[idx] & GPIO_IRQ_mask[idx]; |
238 | } | 241 | } |
239 | 242 | ||
240 | static struct irqchip pxa_muxed_gpio_chip = { | 243 | static struct irq_chip pxa_muxed_gpio_chip = { |
244 | .name = "GPIO", | ||
241 | .ack = pxa_ack_muxed_gpio, | 245 | .ack = pxa_ack_muxed_gpio, |
242 | .mask = pxa_mask_muxed_gpio, | 246 | .mask = pxa_mask_muxed_gpio, |
243 | .unmask = pxa_unmask_muxed_gpio, | 247 | .unmask = pxa_unmask_muxed_gpio, |
diff --git a/arch/arm/mach-pxa/lpd270.c b/arch/arm/mach-pxa/lpd270.c index 1a5f5c21481e..12479ae26db2 100644 --- a/arch/arm/mach-pxa/lpd270.c +++ b/arch/arm/mach-pxa/lpd270.c | |||
@@ -68,7 +68,8 @@ static void lpd270_unmask_irq(unsigned int irq) | |||
68 | __raw_writew(lpd270_irq_enabled, LPD270_INT_MASK); | 68 | __raw_writew(lpd270_irq_enabled, LPD270_INT_MASK); |
69 | } | 69 | } |
70 | 70 | ||
71 | static struct irqchip lpd270_irq_chip = { | 71 | static struct irq_chip lpd270_irq_chip = { |
72 | .name = "CPLD", | ||
72 | .ack = lpd270_mask_irq, | 73 | .ack = lpd270_mask_irq, |
73 | .mask = lpd270_mask_irq, | 74 | .mask = lpd270_mask_irq, |
74 | .unmask = lpd270_unmask_irq, | 75 | .unmask = lpd270_unmask_irq, |
diff --git a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c index 6a9a669d60de..83ff5cee64d9 100644 --- a/arch/arm/mach-pxa/lubbock.c +++ b/arch/arm/mach-pxa/lubbock.c | |||
@@ -78,7 +78,8 @@ static void lubbock_unmask_irq(unsigned int irq) | |||
78 | LUB_IRQ_MASK_EN = (lubbock_irq_enabled |= (1 << lubbock_irq)); | 78 | LUB_IRQ_MASK_EN = (lubbock_irq_enabled |= (1 << lubbock_irq)); |
79 | } | 79 | } |
80 | 80 | ||
81 | static struct irqchip lubbock_irq_chip = { | 81 | static struct irq_chip lubbock_irq_chip = { |
82 | .name = "FPGA", | ||
82 | .ack = lubbock_mask_irq, | 83 | .ack = lubbock_mask_irq, |
83 | .mask = lubbock_mask_irq, | 84 | .mask = lubbock_mask_irq, |
84 | .unmask = lubbock_unmask_irq, | 85 | .unmask = lubbock_unmask_irq, |
diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c index 21ddf3de2f6e..a7e9b96f258a 100644 --- a/arch/arm/mach-pxa/mainstone.c +++ b/arch/arm/mach-pxa/mainstone.c | |||
@@ -64,7 +64,8 @@ static void mainstone_unmask_irq(unsigned int irq) | |||
64 | MST_INTMSKENA = (mainstone_irq_enabled |= (1 << mainstone_irq)); | 64 | MST_INTMSKENA = (mainstone_irq_enabled |= (1 << mainstone_irq)); |
65 | } | 65 | } |
66 | 66 | ||
67 | static struct irqchip mainstone_irq_chip = { | 67 | static struct irq_chip mainstone_irq_chip = { |
68 | .name = "FPGA", | ||
68 | .ack = mainstone_mask_irq, | 69 | .ack = mainstone_mask_irq, |
69 | .mask = mainstone_mask_irq, | 70 | .mask = mainstone_mask_irq, |
70 | .unmask = mainstone_unmask_irq, | 71 | .unmask = mainstone_unmask_irq, |
diff --git a/arch/arm/mach-s3c2410/mach-anubis.c b/arch/arm/mach-s3c2410/mach-anubis.c index 4a92d6f92d6b..60641d452db3 100644 --- a/arch/arm/mach-s3c2410/mach-anubis.c +++ b/arch/arm/mach-s3c2410/mach-anubis.c | |||
@@ -60,11 +60,12 @@ static struct map_desc anubis_iodesc[] __initdata = { | |||
60 | .virtual = (u32)S3C24XX_VA_ISA_BYTE, | 60 | .virtual = (u32)S3C24XX_VA_ISA_BYTE, |
61 | .pfn = __phys_to_pfn(0x0), | 61 | .pfn = __phys_to_pfn(0x0), |
62 | .length = SZ_4M, | 62 | .length = SZ_4M, |
63 | .type = MT_DEVICE | 63 | .type = MT_DEVICE, |
64 | }, { | 64 | }, { |
65 | .virtual = (u32)S3C24XX_VA_ISA_WORD, | 65 | .virtual = (u32)S3C24XX_VA_ISA_WORD, |
66 | .pfn = __phys_to_pfn(0x0), | 66 | .pfn = __phys_to_pfn(0x0), |
67 | .length = SZ_4M, MT_DEVICE | 67 | .length = SZ_4M, |
68 | .type = MT_DEVICE, | ||
68 | }, | 69 | }, |
69 | 70 | ||
70 | /* we could possibly compress the next set down into a set of smaller tables | 71 | /* we could possibly compress the next set down into a set of smaller tables |
@@ -78,36 +79,12 @@ static struct map_desc anubis_iodesc[] __initdata = { | |||
78 | .virtual = (u32)ANUBIS_VA_CTRL1, | 79 | .virtual = (u32)ANUBIS_VA_CTRL1, |
79 | .pfn = __phys_to_pfn(ANUBIS_PA_CTRL1), | 80 | .pfn = __phys_to_pfn(ANUBIS_PA_CTRL1), |
80 | .length = SZ_4K, | 81 | .length = SZ_4K, |
81 | .type = MT_DEVICE | 82 | .type = MT_DEVICE, |
82 | }, { | 83 | }, { |
83 | .virtual = (u32)ANUBIS_VA_CTRL2, | 84 | .virtual = (u32)ANUBIS_VA_CTRL2, |
84 | .pfn = __phys_to_pfn(ANUBIS_PA_CTRL2), | 85 | .pfn = __phys_to_pfn(ANUBIS_PA_CTRL2), |
85 | .length = SZ_4K, | 86 | .length = SZ_4K, |
86 | .type =MT_DEVICE | 87 | .type = MT_DEVICE, |
87 | }, | ||
88 | |||
89 | /* IDE drives */ | ||
90 | |||
91 | { | ||
92 | .virtual = (u32)ANUBIS_IDEPRI, | ||
93 | .pfn = __phys_to_pfn(S3C2410_CS3), | ||
94 | .length = SZ_1M, | ||
95 | .type = MT_DEVICE | ||
96 | }, { | ||
97 | .virtual = (u32)ANUBIS_IDEPRIAUX, | ||
98 | .pfn = __phys_to_pfn(S3C2410_CS3+(1<<26)), | ||
99 | .length = SZ_1M, | ||
100 | .type = MT_DEVICE | ||
101 | }, { | ||
102 | .virtual = (u32)ANUBIS_IDESEC, | ||
103 | .pfn = __phys_to_pfn(S3C2410_CS4), | ||
104 | .length = SZ_1M, | ||
105 | .type = MT_DEVICE | ||
106 | }, { | ||
107 | .virtual = (u32)ANUBIS_IDESECAUX, | ||
108 | .pfn = __phys_to_pfn(S3C2410_CS4+(1<<26)), | ||
109 | .length = SZ_1M, | ||
110 | .type = MT_DEVICE | ||
111 | }, | 88 | }, |
112 | }; | 89 | }; |
113 | 90 | ||
@@ -126,7 +103,7 @@ static struct s3c24xx_uart_clksrc anubis_serial_clocks[] = { | |||
126 | .name = "pclk", | 103 | .name = "pclk", |
127 | .divisor = 1, | 104 | .divisor = 1, |
128 | .min_baud = 0, | 105 | .min_baud = 0, |
129 | .max_baud = 0. | 106 | .max_baud = 0, |
130 | } | 107 | } |
131 | }; | 108 | }; |
132 | 109 | ||
@@ -139,7 +116,7 @@ static struct s3c2410_uartcfg anubis_uartcfgs[] __initdata = { | |||
139 | .ulcon = ULCON, | 116 | .ulcon = ULCON, |
140 | .ufcon = UFCON, | 117 | .ufcon = UFCON, |
141 | .clocks = anubis_serial_clocks, | 118 | .clocks = anubis_serial_clocks, |
142 | .clocks_size = ARRAY_SIZE(anubis_serial_clocks) | 119 | .clocks_size = ARRAY_SIZE(anubis_serial_clocks), |
143 | }, | 120 | }, |
144 | [1] = { | 121 | [1] = { |
145 | .hwport = 2, | 122 | .hwport = 2, |
@@ -148,7 +125,7 @@ static struct s3c2410_uartcfg anubis_uartcfgs[] __initdata = { | |||
148 | .ulcon = ULCON, | 125 | .ulcon = ULCON, |
149 | .ufcon = UFCON, | 126 | .ufcon = UFCON, |
150 | .clocks = anubis_serial_clocks, | 127 | .clocks = anubis_serial_clocks, |
151 | .clocks_size = ARRAY_SIZE(anubis_serial_clocks) | 128 | .clocks_size = ARRAY_SIZE(anubis_serial_clocks), |
152 | }, | 129 | }, |
153 | }; | 130 | }; |
154 | 131 | ||
@@ -162,7 +139,7 @@ static struct mtd_partition anubis_default_nand_part[] = { | |||
162 | [0] = { | 139 | [0] = { |
163 | .name = "Boot Agent", | 140 | .name = "Boot Agent", |
164 | .size = SZ_16K, | 141 | .size = SZ_16K, |
165 | .offset = 0 | 142 | .offset = 0, |
166 | }, | 143 | }, |
167 | [1] = { | 144 | [1] = { |
168 | .name = "/boot", | 145 | .name = "/boot", |
@@ -194,21 +171,21 @@ static struct s3c2410_nand_set anubis_nand_sets[] = { | |||
194 | .nr_chips = 1, | 171 | .nr_chips = 1, |
195 | .nr_map = external_map, | 172 | .nr_map = external_map, |
196 | .nr_partitions = ARRAY_SIZE(anubis_default_nand_part), | 173 | .nr_partitions = ARRAY_SIZE(anubis_default_nand_part), |
197 | .partitions = anubis_default_nand_part | 174 | .partitions = anubis_default_nand_part, |
198 | }, | 175 | }, |
199 | [0] = { | 176 | [0] = { |
200 | .name = "chip0", | 177 | .name = "chip0", |
201 | .nr_chips = 1, | 178 | .nr_chips = 1, |
202 | .nr_map = chip0_map, | 179 | .nr_map = chip0_map, |
203 | .nr_partitions = ARRAY_SIZE(anubis_default_nand_part), | 180 | .nr_partitions = ARRAY_SIZE(anubis_default_nand_part), |
204 | .partitions = anubis_default_nand_part | 181 | .partitions = anubis_default_nand_part, |
205 | }, | 182 | }, |
206 | [2] = { | 183 | [2] = { |
207 | .name = "chip1", | 184 | .name = "chip1", |
208 | .nr_chips = 1, | 185 | .nr_chips = 1, |
209 | .nr_map = chip1_map, | 186 | .nr_map = chip1_map, |
210 | .nr_partitions = ARRAY_SIZE(anubis_default_nand_part), | 187 | .nr_partitions = ARRAY_SIZE(anubis_default_nand_part), |
211 | .partitions = anubis_default_nand_part | 188 | .partitions = anubis_default_nand_part, |
212 | }, | 189 | }, |
213 | }; | 190 | }; |
214 | 191 | ||
@@ -313,7 +290,7 @@ static struct s3c24xx_board anubis_board __initdata = { | |||
313 | .devices = anubis_devices, | 290 | .devices = anubis_devices, |
314 | .devices_count = ARRAY_SIZE(anubis_devices), | 291 | .devices_count = ARRAY_SIZE(anubis_devices), |
315 | .clocks = anubis_clocks, | 292 | .clocks = anubis_clocks, |
316 | .clocks_count = ARRAY_SIZE(anubis_clocks) | 293 | .clocks_count = ARRAY_SIZE(anubis_clocks), |
317 | }; | 294 | }; |
318 | 295 | ||
319 | static void __init anubis_map_io(void) | 296 | static void __init anubis_map_io(void) |
diff --git a/arch/arm/mach-s3c2410/mach-osiris.c b/arch/arm/mach-s3c2410/mach-osiris.c index 858fd03c6bc5..e193ba69e652 100644 --- a/arch/arm/mach-s3c2410/mach-osiris.c +++ b/arch/arm/mach-s3c2410/mach-osiris.c | |||
@@ -67,12 +67,12 @@ static struct map_desc osiris_iodesc[] __initdata = { | |||
67 | .virtual = (u32)OSIRIS_VA_CTRL1, | 67 | .virtual = (u32)OSIRIS_VA_CTRL1, |
68 | .pfn = __phys_to_pfn(OSIRIS_PA_CTRL1), | 68 | .pfn = __phys_to_pfn(OSIRIS_PA_CTRL1), |
69 | .length = SZ_16K, | 69 | .length = SZ_16K, |
70 | .type = MT_DEVICE | 70 | .type = MT_DEVICE, |
71 | }, { | 71 | }, { |
72 | .virtual = (u32)OSIRIS_VA_CTRL2, | 72 | .virtual = (u32)OSIRIS_VA_CTRL2, |
73 | .pfn = __phys_to_pfn(OSIRIS_PA_CTRL2), | 73 | .pfn = __phys_to_pfn(OSIRIS_PA_CTRL2), |
74 | .length = SZ_16K, | 74 | .length = SZ_16K, |
75 | .type = MT_DEVICE | 75 | .type = MT_DEVICE, |
76 | }, | 76 | }, |
77 | }; | 77 | }; |
78 | 78 | ||
@@ -91,7 +91,7 @@ static struct s3c24xx_uart_clksrc osiris_serial_clocks[] = { | |||
91 | .name = "pclk", | 91 | .name = "pclk", |
92 | .divisor = 1, | 92 | .divisor = 1, |
93 | .min_baud = 0, | 93 | .min_baud = 0, |
94 | .max_baud = 0. | 94 | .max_baud = 0, |
95 | } | 95 | } |
96 | }; | 96 | }; |
97 | 97 | ||
@@ -103,7 +103,7 @@ static struct s3c2410_uartcfg osiris_uartcfgs[] __initdata = { | |||
103 | .ulcon = ULCON, | 103 | .ulcon = ULCON, |
104 | .ufcon = UFCON, | 104 | .ufcon = UFCON, |
105 | .clocks = osiris_serial_clocks, | 105 | .clocks = osiris_serial_clocks, |
106 | .clocks_size = ARRAY_SIZE(osiris_serial_clocks) | 106 | .clocks_size = ARRAY_SIZE(osiris_serial_clocks), |
107 | }, | 107 | }, |
108 | [1] = { | 108 | [1] = { |
109 | .hwport = 1, | 109 | .hwport = 1, |
@@ -112,7 +112,7 @@ static struct s3c2410_uartcfg osiris_uartcfgs[] __initdata = { | |||
112 | .ulcon = ULCON, | 112 | .ulcon = ULCON, |
113 | .ufcon = UFCON, | 113 | .ufcon = UFCON, |
114 | .clocks = osiris_serial_clocks, | 114 | .clocks = osiris_serial_clocks, |
115 | .clocks_size = ARRAY_SIZE(osiris_serial_clocks) | 115 | .clocks_size = ARRAY_SIZE(osiris_serial_clocks), |
116 | }, | 116 | }, |
117 | }; | 117 | }; |
118 | 118 | ||
@@ -126,7 +126,7 @@ static struct mtd_partition osiris_default_nand_part[] = { | |||
126 | [0] = { | 126 | [0] = { |
127 | .name = "Boot Agent", | 127 | .name = "Boot Agent", |
128 | .size = SZ_16K, | 128 | .size = SZ_16K, |
129 | .offset = 0 | 129 | .offset = 0, |
130 | }, | 130 | }, |
131 | [1] = { | 131 | [1] = { |
132 | .name = "/boot", | 132 | .name = "/boot", |
@@ -158,21 +158,21 @@ static struct s3c2410_nand_set osiris_nand_sets[] = { | |||
158 | .nr_chips = 1, | 158 | .nr_chips = 1, |
159 | .nr_map = external_map, | 159 | .nr_map = external_map, |
160 | .nr_partitions = ARRAY_SIZE(osiris_default_nand_part), | 160 | .nr_partitions = ARRAY_SIZE(osiris_default_nand_part), |
161 | .partitions = osiris_default_nand_part | 161 | .partitions = osiris_default_nand_part, |
162 | }, | 162 | }, |
163 | [0] = { | 163 | [0] = { |
164 | .name = "chip0", | 164 | .name = "chip0", |
165 | .nr_chips = 1, | 165 | .nr_chips = 1, |
166 | .nr_map = chip0_map, | 166 | .nr_map = chip0_map, |
167 | .nr_partitions = ARRAY_SIZE(osiris_default_nand_part), | 167 | .nr_partitions = ARRAY_SIZE(osiris_default_nand_part), |
168 | .partitions = osiris_default_nand_part | 168 | .partitions = osiris_default_nand_part, |
169 | }, | 169 | }, |
170 | [2] = { | 170 | [2] = { |
171 | .name = "chip1", | 171 | .name = "chip1", |
172 | .nr_chips = 1, | 172 | .nr_chips = 1, |
173 | .nr_map = chip1_map, | 173 | .nr_map = chip1_map, |
174 | .nr_partitions = ARRAY_SIZE(osiris_default_nand_part), | 174 | .nr_partitions = ARRAY_SIZE(osiris_default_nand_part), |
175 | .partitions = osiris_default_nand_part | 175 | .partitions = osiris_default_nand_part, |
176 | }, | 176 | }, |
177 | }; | 177 | }; |
178 | 178 | ||
@@ -245,7 +245,7 @@ static struct s3c24xx_board osiris_board __initdata = { | |||
245 | .devices = osiris_devices, | 245 | .devices = osiris_devices, |
246 | .devices_count = ARRAY_SIZE(osiris_devices), | 246 | .devices_count = ARRAY_SIZE(osiris_devices), |
247 | .clocks = osiris_clocks, | 247 | .clocks = osiris_clocks, |
248 | .clocks_count = ARRAY_SIZE(osiris_clocks) | 248 | .clocks_count = ARRAY_SIZE(osiris_clocks), |
249 | }; | 249 | }; |
250 | 250 | ||
251 | static void __init osiris_map_io(void) | 251 | static void __init osiris_map_io(void) |
diff --git a/arch/arm/mach-sa1100/irq.c b/arch/arm/mach-sa1100/irq.c index 2891b8ca86dd..b55b90a2e8fe 100644 --- a/arch/arm/mach-sa1100/irq.c +++ b/arch/arm/mach-sa1100/irq.c | |||
@@ -95,7 +95,8 @@ static int sa1100_low_gpio_wake(unsigned int irq, unsigned int on) | |||
95 | return 0; | 95 | return 0; |
96 | } | 96 | } |
97 | 97 | ||
98 | static struct irqchip sa1100_low_gpio_chip = { | 98 | static struct irq_chip sa1100_low_gpio_chip = { |
99 | .name = "GPIO-l", | ||
99 | .ack = sa1100_low_gpio_ack, | 100 | .ack = sa1100_low_gpio_ack, |
100 | .mask = sa1100_low_gpio_mask, | 101 | .mask = sa1100_low_gpio_mask, |
101 | .unmask = sa1100_low_gpio_unmask, | 102 | .unmask = sa1100_low_gpio_unmask, |
@@ -178,7 +179,8 @@ static int sa1100_high_gpio_wake(unsigned int irq, unsigned int on) | |||
178 | return 0; | 179 | return 0; |
179 | } | 180 | } |
180 | 181 | ||
181 | static struct irqchip sa1100_high_gpio_chip = { | 182 | static struct irq_chip sa1100_high_gpio_chip = { |
183 | .name = "GPIO-h", | ||
182 | .ack = sa1100_high_gpio_ack, | 184 | .ack = sa1100_high_gpio_ack, |
183 | .mask = sa1100_high_gpio_mask, | 185 | .mask = sa1100_high_gpio_mask, |
184 | .unmask = sa1100_high_gpio_unmask, | 186 | .unmask = sa1100_high_gpio_unmask, |
@@ -215,7 +217,8 @@ static int sa1100_set_wake(unsigned int irq, unsigned int on) | |||
215 | return -EINVAL; | 217 | return -EINVAL; |
216 | } | 218 | } |
217 | 219 | ||
218 | static struct irqchip sa1100_normal_chip = { | 220 | static struct irq_chip sa1100_normal_chip = { |
221 | .name = "SC", | ||
219 | .ack = sa1100_mask_irq, | 222 | .ack = sa1100_mask_irq, |
220 | .mask = sa1100_mask_irq, | 223 | .mask = sa1100_mask_irq, |
221 | .unmask = sa1100_unmask_irq, | 224 | .unmask = sa1100_unmask_irq, |
diff --git a/arch/arm/mach-shark/irq.c b/arch/arm/mach-shark/irq.c index 6cb67bd3dfd3..b227052296cf 100644 --- a/arch/arm/mach-shark/irq.c +++ b/arch/arm/mach-shark/irq.c | |||
@@ -69,7 +69,8 @@ static irqreturn_t bogus_int(int irq, void *dev_id, struct pt_regs *regs) | |||
69 | 69 | ||
70 | static struct irqaction cascade; | 70 | static struct irqaction cascade; |
71 | 71 | ||
72 | static struct irqchip fb_chip = { | 72 | static struct irq_chip fb_chip = { |
73 | .name = "XT-PIC", | ||
73 | .ack = shark_ack_8259A_irq, | 74 | .ack = shark_ack_8259A_irq, |
74 | .mask = shark_disable_8259A_irq, | 75 | .mask = shark_disable_8259A_irq, |
75 | .unmask = shark_enable_8259A_irq, | 76 | .unmask = shark_enable_8259A_irq, |
diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c index 864377176015..c4e3f8c68479 100644 --- a/arch/arm/mach-versatile/core.c +++ b/arch/arm/mach-versatile/core.c | |||
@@ -69,7 +69,8 @@ static void sic_unmask_irq(unsigned int irq) | |||
69 | writel(1 << irq, VA_SIC_BASE + SIC_IRQ_ENABLE_SET); | 69 | writel(1 << irq, VA_SIC_BASE + SIC_IRQ_ENABLE_SET); |
70 | } | 70 | } |
71 | 71 | ||
72 | static struct irqchip sic_chip = { | 72 | static struct irq_chip sic_chip = { |
73 | .name = "SIC", | ||
73 | .ack = sic_mask_irq, | 74 | .ack = sic_mask_irq, |
74 | .mask = sic_mask_irq, | 75 | .mask = sic_mask_irq, |
75 | .unmask = sic_unmask_irq, | 76 | .unmask = sic_unmask_irq, |
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index dba7dddfe57d..88a999df0ab3 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c | |||
@@ -363,7 +363,9 @@ EXPORT_SYMBOL(__ioremap); | |||
363 | 363 | ||
364 | void __iounmap(void __iomem *addr) | 364 | void __iounmap(void __iomem *addr) |
365 | { | 365 | { |
366 | #ifndef CONFIG_SMP | ||
366 | struct vm_struct **p, *tmp; | 367 | struct vm_struct **p, *tmp; |
368 | #endif | ||
367 | unsigned int section_mapping = 0; | 369 | unsigned int section_mapping = 0; |
368 | 370 | ||
369 | addr = (void __iomem *)(PAGE_MASK & (unsigned long)addr); | 371 | addr = (void __iomem *)(PAGE_MASK & (unsigned long)addr); |
diff --git a/arch/arm/mm/proc-syms.c b/arch/arm/mm/proc-syms.c index 6c5f0fe578a5..ab143557e688 100644 --- a/arch/arm/mm/proc-syms.c +++ b/arch/arm/mm/proc-syms.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <asm/cacheflush.h> | 13 | #include <asm/cacheflush.h> |
14 | #include <asm/proc-fns.h> | 14 | #include <asm/proc-fns.h> |
15 | #include <asm/tlbflush.h> | 15 | #include <asm/tlbflush.h> |
16 | #include <asm/page.h> | ||
16 | 17 | ||
17 | #ifndef MULTI_CPU | 18 | #ifndef MULTI_CPU |
18 | EXPORT_SYMBOL(cpu_dcache_clean_area); | 19 | EXPORT_SYMBOL(cpu_dcache_clean_area); |
@@ -30,6 +31,13 @@ EXPORT_SYMBOL(__cpuc_coherent_kern_range); | |||
30 | EXPORT_SYMBOL(cpu_cache); | 31 | EXPORT_SYMBOL(cpu_cache); |
31 | #endif | 32 | #endif |
32 | 33 | ||
34 | #ifndef MULTI_USER | ||
35 | EXPORT_SYMBOL(__cpu_clear_user_page); | ||
36 | EXPORT_SYMBOL(__cpu_copy_user_page); | ||
37 | #else | ||
38 | EXPORT_SYMBOL(cpu_user); | ||
39 | #endif | ||
40 | |||
33 | /* | 41 | /* |
34 | * No module should need to touch the TLB (and currently | 42 | * No module should need to touch the TLB (and currently |
35 | * no modules do. We export this for "loadkernel" support | 43 | * no modules do. We export this for "loadkernel" support |
diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S index 521538671f4c..561bff73a036 100644 --- a/arch/arm/mm/proc-xscale.S +++ b/arch/arm/mm/proc-xscale.S | |||
@@ -536,6 +536,11 @@ cpu_80200_name: | |||
536 | .asciz "XScale-80200" | 536 | .asciz "XScale-80200" |
537 | .size cpu_80200_name, . - cpu_80200_name | 537 | .size cpu_80200_name, . - cpu_80200_name |
538 | 538 | ||
539 | .type cpu_80219_name, #object | ||
540 | cpu_80219_name: | ||
541 | .asciz "XScale-80219" | ||
542 | .size cpu_80219_name, . - cpu_80219_name | ||
543 | |||
539 | .type cpu_8032x_name, #object | 544 | .type cpu_8032x_name, #object |
540 | cpu_8032x_name: | 545 | cpu_8032x_name: |
541 | .asciz "XScale-IOP8032x Family" | 546 | .asciz "XScale-IOP8032x Family" |
@@ -613,10 +618,33 @@ __80200_proc_info: | |||
613 | .long xscale_cache_fns | 618 | .long xscale_cache_fns |
614 | .size __80200_proc_info, . - __80200_proc_info | 619 | .size __80200_proc_info, . - __80200_proc_info |
615 | 620 | ||
621 | .type __80219_proc_info,#object | ||
622 | __80219_proc_info: | ||
623 | .long 0x69052e20 | ||
624 | .long 0xffffffe0 | ||
625 | .long PMD_TYPE_SECT | \ | ||
626 | PMD_SECT_BUFFERABLE | \ | ||
627 | PMD_SECT_CACHEABLE | \ | ||
628 | PMD_SECT_AP_WRITE | \ | ||
629 | PMD_SECT_AP_READ | ||
630 | .long PMD_TYPE_SECT | \ | ||
631 | PMD_SECT_AP_WRITE | \ | ||
632 | PMD_SECT_AP_READ | ||
633 | b __xscale_setup | ||
634 | .long cpu_arch_name | ||
635 | .long cpu_elf_name | ||
636 | .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP | ||
637 | .long cpu_80219_name | ||
638 | .long xscale_processor_functions | ||
639 | .long v4wbi_tlb_fns | ||
640 | .long xscale_mc_user_fns | ||
641 | .long xscale_cache_fns | ||
642 | .size __80219_proc_info, . - __80219_proc_info | ||
643 | |||
616 | .type __8032x_proc_info,#object | 644 | .type __8032x_proc_info,#object |
617 | __8032x_proc_info: | 645 | __8032x_proc_info: |
618 | .long 0x69052420 | 646 | .long 0x69052420 |
619 | .long 0xfffff5e0 @ mask should accomodate IOP80219 also | 647 | .long 0xffffffe0 |
620 | .long PMD_TYPE_SECT | \ | 648 | .long PMD_TYPE_SECT | \ |
621 | PMD_SECT_BUFFERABLE | \ | 649 | PMD_SECT_BUFFERABLE | \ |
622 | PMD_SECT_CACHEABLE | \ | 650 | PMD_SECT_CACHEABLE | \ |
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index fec7970e564d..cd7f973fb286 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c | |||
@@ -944,7 +944,8 @@ static void mpuio_unmask_irq(unsigned int irq) | |||
944 | _set_gpio_irqenable(bank, gpio, 1); | 944 | _set_gpio_irqenable(bank, gpio, 1); |
945 | } | 945 | } |
946 | 946 | ||
947 | static struct irqchip gpio_irq_chip = { | 947 | static struct irq_chip gpio_irq_chip = { |
948 | .name = "GPIO", | ||
948 | .ack = gpio_ack_irq, | 949 | .ack = gpio_ack_irq, |
949 | .mask = gpio_mask_irq, | 950 | .mask = gpio_mask_irq, |
950 | .unmask = gpio_unmask_irq, | 951 | .unmask = gpio_unmask_irq, |
@@ -952,10 +953,11 @@ static struct irqchip gpio_irq_chip = { | |||
952 | .set_wake = gpio_wake_enable, | 953 | .set_wake = gpio_wake_enable, |
953 | }; | 954 | }; |
954 | 955 | ||
955 | static struct irqchip mpuio_irq_chip = { | 956 | static struct irq_chip mpuio_irq_chip = { |
957 | .name = "MPUIO", | ||
956 | .ack = mpuio_ack_irq, | 958 | .ack = mpuio_ack_irq, |
957 | .mask = mpuio_mask_irq, | 959 | .mask = mpuio_mask_irq, |
958 | .unmask = mpuio_unmask_irq | 960 | .unmask = mpuio_unmask_irq |
959 | }; | 961 | }; |
960 | 962 | ||
961 | static int initialized; | 963 | static int initialized; |
diff --git a/arch/i386/Kconfig b/arch/i386/Kconfig index daa75ce4b777..f71fb4a029cb 100644 --- a/arch/i386/Kconfig +++ b/arch/i386/Kconfig | |||
@@ -672,7 +672,7 @@ config MTRR | |||
672 | See <file:Documentation/mtrr.txt> for more information. | 672 | See <file:Documentation/mtrr.txt> for more information. |
673 | 673 | ||
674 | config EFI | 674 | config EFI |
675 | bool "Boot from EFI support (EXPERIMENTAL)" | 675 | bool "Boot from EFI support" |
676 | depends on ACPI | 676 | depends on ACPI |
677 | default n | 677 | default n |
678 | ---help--- | 678 | ---help--- |
diff --git a/arch/i386/kernel/Makefile b/arch/i386/kernel/Makefile index 1b452a1665c4..ab98fc21a541 100644 --- a/arch/i386/kernel/Makefile +++ b/arch/i386/kernel/Makefile | |||
@@ -59,7 +59,8 @@ quiet_cmd_syscall = SYSCALL $@ | |||
59 | 59 | ||
60 | export CPPFLAGS_vsyscall.lds += -P -C -U$(ARCH) | 60 | export CPPFLAGS_vsyscall.lds += -P -C -U$(ARCH) |
61 | 61 | ||
62 | vsyscall-flags = -shared -s -Wl,-soname=linux-gate.so.1 | 62 | vsyscall-flags = -shared -s -Wl,-soname=linux-gate.so.1 \ |
63 | $(call ld-option, -Wl$(comma)--hash-style=sysv) | ||
63 | SYSCFLAGS_vsyscall-sysenter.so = $(vsyscall-flags) | 64 | SYSCFLAGS_vsyscall-sysenter.so = $(vsyscall-flags) |
64 | SYSCFLAGS_vsyscall-int80.so = $(vsyscall-flags) | 65 | SYSCFLAGS_vsyscall-int80.so = $(vsyscall-flags) |
65 | 66 | ||
diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c index 0db6387025ca..ee003bc0e8b1 100644 --- a/arch/i386/kernel/acpi/boot.c +++ b/arch/i386/kernel/acpi/boot.c | |||
@@ -59,7 +59,7 @@ static inline int gsi_irq_sharing(int gsi) { return gsi; } | |||
59 | 59 | ||
60 | #define BAD_MADT_ENTRY(entry, end) ( \ | 60 | #define BAD_MADT_ENTRY(entry, end) ( \ |
61 | (!entry) || (unsigned long)entry + sizeof(*entry) > end || \ | 61 | (!entry) || (unsigned long)entry + sizeof(*entry) > end || \ |
62 | ((acpi_table_entry_header *)entry)->length != sizeof(*entry)) | 62 | ((acpi_table_entry_header *)entry)->length < sizeof(*entry)) |
63 | 63 | ||
64 | #define PREFIX "ACPI: " | 64 | #define PREFIX "ACPI: " |
65 | 65 | ||
diff --git a/arch/i386/kernel/acpi/wakeup.S b/arch/i386/kernel/acpi/wakeup.S index 9f408eee4e6f..b781b38131c0 100644 --- a/arch/i386/kernel/acpi/wakeup.S +++ b/arch/i386/kernel/acpi/wakeup.S | |||
@@ -292,7 +292,10 @@ ENTRY(do_suspend_lowlevel) | |||
292 | pushl $3 | 292 | pushl $3 |
293 | call acpi_enter_sleep_state | 293 | call acpi_enter_sleep_state |
294 | addl $4, %esp | 294 | addl $4, %esp |
295 | ret | 295 | |
296 | # In case of S3 failure, we'll emerge here. Jump | ||
297 | # to ret_point to recover | ||
298 | jmp ret_point | ||
296 | .p2align 4,,7 | 299 | .p2align 4,,7 |
297 | ret_point: | 300 | ret_point: |
298 | call restore_registers | 301 | call restore_registers |
diff --git a/arch/i386/kernel/cpu/cpufreq/Kconfig b/arch/i386/kernel/cpu/cpufreq/Kconfig index e44a4c6a4fe5..ccc1edff5c97 100644 --- a/arch/i386/kernel/cpu/cpufreq/Kconfig +++ b/arch/i386/kernel/cpu/cpufreq/Kconfig | |||
@@ -96,6 +96,7 @@ config X86_POWERNOW_K8_ACPI | |||
96 | 96 | ||
97 | config X86_GX_SUSPMOD | 97 | config X86_GX_SUSPMOD |
98 | tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation" | 98 | tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation" |
99 | depends on PCI | ||
99 | help | 100 | help |
100 | This add the CPUFreq driver for NatSemi Geode processors which | 101 | This add the CPUFreq driver for NatSemi Geode processors which |
101 | support suspend modulation. | 102 | support suspend modulation. |
@@ -202,7 +203,7 @@ config X86_LONGRUN | |||
202 | config X86_LONGHAUL | 203 | config X86_LONGHAUL |
203 | tristate "VIA Cyrix III Longhaul" | 204 | tristate "VIA Cyrix III Longhaul" |
204 | select CPU_FREQ_TABLE | 205 | select CPU_FREQ_TABLE |
205 | depends on BROKEN | 206 | depends on ACPI_PROCESSOR |
206 | help | 207 | help |
207 | This adds the CPUFreq driver for VIA Samuel/CyrixIII, | 208 | This adds the CPUFreq driver for VIA Samuel/CyrixIII, |
208 | VIA Cyrix Samuel/C3, VIA Cyrix Ezra and VIA Cyrix Ezra-T | 209 | VIA Cyrix Samuel/C3, VIA Cyrix Ezra and VIA Cyrix Ezra-T |
diff --git a/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c index 567b39bea07e..efb41e81351c 100644 --- a/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c | |||
@@ -384,8 +384,7 @@ static int acpi_cpufreq_early_init_acpi(void) | |||
384 | } | 384 | } |
385 | 385 | ||
386 | /* Do initialization in ACPI core */ | 386 | /* Do initialization in ACPI core */ |
387 | acpi_processor_preregister_performance(acpi_perf_data); | 387 | return acpi_processor_preregister_performance(acpi_perf_data); |
388 | return 0; | ||
389 | } | 388 | } |
390 | 389 | ||
391 | static int | 390 | static int |
diff --git a/arch/i386/kernel/cpu/cpufreq/longhaul.c b/arch/i386/kernel/cpu/cpufreq/longhaul.c index 146f607e9c44..4f2c3aeef724 100644 --- a/arch/i386/kernel/cpu/cpufreq/longhaul.c +++ b/arch/i386/kernel/cpu/cpufreq/longhaul.c | |||
@@ -29,11 +29,13 @@ | |||
29 | #include <linux/cpufreq.h> | 29 | #include <linux/cpufreq.h> |
30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
31 | #include <linux/string.h> | 31 | #include <linux/string.h> |
32 | #include <linux/pci.h> | ||
33 | 32 | ||
34 | #include <asm/msr.h> | 33 | #include <asm/msr.h> |
35 | #include <asm/timex.h> | 34 | #include <asm/timex.h> |
36 | #include <asm/io.h> | 35 | #include <asm/io.h> |
36 | #include <asm/acpi.h> | ||
37 | #include <linux/acpi.h> | ||
38 | #include <acpi/processor.h> | ||
37 | 39 | ||
38 | #include "longhaul.h" | 40 | #include "longhaul.h" |
39 | 41 | ||
@@ -56,6 +58,8 @@ static int minvid, maxvid; | |||
56 | static unsigned int minmult, maxmult; | 58 | static unsigned int minmult, maxmult; |
57 | static int can_scale_voltage; | 59 | static int can_scale_voltage; |
58 | static int vrmrev; | 60 | static int vrmrev; |
61 | static struct acpi_processor *pr = NULL; | ||
62 | static struct acpi_processor_cx *cx = NULL; | ||
59 | 63 | ||
60 | /* Module parameters */ | 64 | /* Module parameters */ |
61 | static int dont_scale_voltage; | 65 | static int dont_scale_voltage; |
@@ -118,84 +122,65 @@ static int longhaul_get_cpu_mult(void) | |||
118 | return eblcr_table[invalue]; | 122 | return eblcr_table[invalue]; |
119 | } | 123 | } |
120 | 124 | ||
125 | /* For processor with BCR2 MSR */ | ||
121 | 126 | ||
122 | static void do_powersaver(union msr_longhaul *longhaul, | 127 | static void do_longhaul1(int cx_address, unsigned int clock_ratio_index) |
123 | unsigned int clock_ratio_index) | ||
124 | { | 128 | { |
125 | struct pci_dev *dev; | 129 | union msr_bcr2 bcr2; |
126 | unsigned long flags; | 130 | u32 t; |
127 | unsigned int tmp_mask; | ||
128 | int version; | ||
129 | int i; | ||
130 | u16 pci_cmd; | ||
131 | u16 cmd_state[64]; | ||
132 | 131 | ||
133 | switch (cpu_model) { | 132 | rdmsrl(MSR_VIA_BCR2, bcr2.val); |
134 | case CPU_EZRA_T: | 133 | /* Enable software clock multiplier */ |
135 | version = 3; | 134 | bcr2.bits.ESOFTBF = 1; |
136 | break; | 135 | bcr2.bits.CLOCKMUL = clock_ratio_index; |
137 | case CPU_NEHEMIAH: | ||
138 | version = 0xf; | ||
139 | break; | ||
140 | default: | ||
141 | return; | ||
142 | } | ||
143 | 136 | ||
144 | rdmsrl(MSR_VIA_LONGHAUL, longhaul->val); | 137 | /* Sync to timer tick */ |
145 | longhaul->bits.SoftBusRatio = clock_ratio_index & 0xf; | 138 | safe_halt(); |
146 | longhaul->bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4; | 139 | ACPI_FLUSH_CPU_CACHE(); |
147 | longhaul->bits.EnableSoftBusRatio = 1; | 140 | /* Change frequency on next halt or sleep */ |
148 | longhaul->bits.RevisionKey = 0; | 141 | wrmsrl(MSR_VIA_BCR2, bcr2.val); |
142 | /* Invoke C3 */ | ||
143 | inb(cx_address); | ||
144 | /* Dummy op - must do something useless after P_LVL3 read */ | ||
145 | t = inl(acpi_fadt.xpm_tmr_blk.address); | ||
146 | |||
147 | /* Disable software clock multiplier */ | ||
148 | local_irq_disable(); | ||
149 | rdmsrl(MSR_VIA_BCR2, bcr2.val); | ||
150 | bcr2.bits.ESOFTBF = 0; | ||
151 | wrmsrl(MSR_VIA_BCR2, bcr2.val); | ||
152 | } | ||
149 | 153 | ||
150 | preempt_disable(); | 154 | /* For processor with Longhaul MSR */ |
151 | local_irq_save(flags); | ||
152 | 155 | ||
153 | /* | 156 | static void do_powersaver(int cx_address, unsigned int clock_ratio_index) |
154 | * get current pci bus master state for all devices | 157 | { |
155 | * and clear bus master bit | 158 | union msr_longhaul longhaul; |
156 | */ | 159 | u32 t; |
157 | dev = NULL; | ||
158 | i = 0; | ||
159 | do { | ||
160 | dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev); | ||
161 | if (dev != NULL) { | ||
162 | pci_read_config_word(dev, PCI_COMMAND, &pci_cmd); | ||
163 | cmd_state[i++] = pci_cmd; | ||
164 | pci_cmd &= ~PCI_COMMAND_MASTER; | ||
165 | pci_write_config_word(dev, PCI_COMMAND, pci_cmd); | ||
166 | } | ||
167 | } while (dev != NULL); | ||
168 | 160 | ||
169 | tmp_mask=inb(0x21); /* works on C3. save mask. */ | 161 | rdmsrl(MSR_VIA_LONGHAUL, longhaul.val); |
170 | outb(0xFE,0x21); /* TMR0 only */ | 162 | longhaul.bits.RevisionKey = longhaul.bits.RevisionID; |
171 | outb(0xFF,0x80); /* delay */ | 163 | longhaul.bits.SoftBusRatio = clock_ratio_index & 0xf; |
164 | longhaul.bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4; | ||
165 | longhaul.bits.EnableSoftBusRatio = 1; | ||
172 | 166 | ||
167 | /* Sync to timer tick */ | ||
173 | safe_halt(); | 168 | safe_halt(); |
174 | wrmsrl(MSR_VIA_LONGHAUL, longhaul->val); | 169 | ACPI_FLUSH_CPU_CACHE(); |
175 | halt(); | 170 | /* Change frequency on next halt or sleep */ |
176 | 171 | wrmsrl(MSR_VIA_LONGHAUL, longhaul.val); | |
172 | /* Invoke C3 */ | ||
173 | inb(cx_address); | ||
174 | /* Dummy op - must do something useless after P_LVL3 read */ | ||
175 | t = inl(acpi_fadt.xpm_tmr_blk.address); | ||
176 | |||
177 | /* Disable bus ratio bit */ | ||
177 | local_irq_disable(); | 178 | local_irq_disable(); |
178 | 179 | longhaul.bits.RevisionKey = longhaul.bits.RevisionID; | |
179 | outb(tmp_mask,0x21); /* restore mask */ | 180 | longhaul.bits.EnableSoftBusRatio = 0; |
180 | 181 | longhaul.bits.EnableSoftBSEL = 0; | |
181 | /* restore pci bus master state for all devices */ | 182 | longhaul.bits.EnableSoftVID = 0; |
182 | dev = NULL; | 183 | wrmsrl(MSR_VIA_LONGHAUL, longhaul.val); |
183 | i = 0; | ||
184 | do { | ||
185 | dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev); | ||
186 | if (dev != NULL) { | ||
187 | pci_cmd = cmd_state[i++]; | ||
188 | pci_write_config_byte(dev, PCI_COMMAND, pci_cmd); | ||
189 | } | ||
190 | } while (dev != NULL); | ||
191 | local_irq_restore(flags); | ||
192 | preempt_enable(); | ||
193 | |||
194 | /* disable bus ratio bit */ | ||
195 | rdmsrl(MSR_VIA_LONGHAUL, longhaul->val); | ||
196 | longhaul->bits.EnableSoftBusRatio = 0; | ||
197 | longhaul->bits.RevisionKey = version; | ||
198 | wrmsrl(MSR_VIA_LONGHAUL, longhaul->val); | ||
199 | } | 184 | } |
200 | 185 | ||
201 | /** | 186 | /** |
@@ -209,9 +194,9 @@ static void longhaul_setstate(unsigned int clock_ratio_index) | |||
209 | { | 194 | { |
210 | int speed, mult; | 195 | int speed, mult; |
211 | struct cpufreq_freqs freqs; | 196 | struct cpufreq_freqs freqs; |
212 | union msr_longhaul longhaul; | ||
213 | union msr_bcr2 bcr2; | ||
214 | static unsigned int old_ratio=-1; | 197 | static unsigned int old_ratio=-1; |
198 | unsigned long flags; | ||
199 | unsigned int pic1_mask, pic2_mask; | ||
215 | 200 | ||
216 | if (old_ratio == clock_ratio_index) | 201 | if (old_ratio == clock_ratio_index) |
217 | return; | 202 | return; |
@@ -234,6 +219,20 @@ static void longhaul_setstate(unsigned int clock_ratio_index) | |||
234 | dprintk ("Setting to FSB:%dMHz Mult:%d.%dx (%s)\n", | 219 | dprintk ("Setting to FSB:%dMHz Mult:%d.%dx (%s)\n", |
235 | fsb, mult/10, mult%10, print_speed(speed/1000)); | 220 | fsb, mult/10, mult%10, print_speed(speed/1000)); |
236 | 221 | ||
222 | preempt_disable(); | ||
223 | local_irq_save(flags); | ||
224 | |||
225 | pic2_mask = inb(0xA1); | ||
226 | pic1_mask = inb(0x21); /* works on C3. save mask. */ | ||
227 | outb(0xFF,0xA1); /* Overkill */ | ||
228 | outb(0xFE,0x21); /* TMR0 only */ | ||
229 | |||
230 | /* Disable bus master arbitration */ | ||
231 | if (pr->flags.bm_check) { | ||
232 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1, | ||
233 | ACPI_MTX_DO_NOT_LOCK); | ||
234 | } | ||
235 | |||
237 | switch (longhaul_version) { | 236 | switch (longhaul_version) { |
238 | 237 | ||
239 | /* | 238 | /* |
@@ -245,20 +244,7 @@ static void longhaul_setstate(unsigned int clock_ratio_index) | |||
245 | */ | 244 | */ |
246 | case TYPE_LONGHAUL_V1: | 245 | case TYPE_LONGHAUL_V1: |
247 | case TYPE_LONGHAUL_V2: | 246 | case TYPE_LONGHAUL_V2: |
248 | rdmsrl (MSR_VIA_BCR2, bcr2.val); | 247 | do_longhaul1(cx->address, clock_ratio_index); |
249 | /* Enable software clock multiplier */ | ||
250 | bcr2.bits.ESOFTBF = 1; | ||
251 | bcr2.bits.CLOCKMUL = clock_ratio_index; | ||
252 | local_irq_disable(); | ||
253 | wrmsrl (MSR_VIA_BCR2, bcr2.val); | ||
254 | safe_halt(); | ||
255 | |||
256 | /* Disable software clock multiplier */ | ||
257 | rdmsrl (MSR_VIA_BCR2, bcr2.val); | ||
258 | bcr2.bits.ESOFTBF = 0; | ||
259 | local_irq_disable(); | ||
260 | wrmsrl (MSR_VIA_BCR2, bcr2.val); | ||
261 | local_irq_enable(); | ||
262 | break; | 248 | break; |
263 | 249 | ||
264 | /* | 250 | /* |
@@ -273,10 +259,22 @@ static void longhaul_setstate(unsigned int clock_ratio_index) | |||
273 | * to work in practice. | 259 | * to work in practice. |
274 | */ | 260 | */ |
275 | case TYPE_POWERSAVER: | 261 | case TYPE_POWERSAVER: |
276 | do_powersaver(&longhaul, clock_ratio_index); | 262 | do_powersaver(cx->address, clock_ratio_index); |
277 | break; | 263 | break; |
278 | } | 264 | } |
279 | 265 | ||
266 | /* Enable bus master arbitration */ | ||
267 | if (pr->flags.bm_check) { | ||
268 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0, | ||
269 | ACPI_MTX_DO_NOT_LOCK); | ||
270 | } | ||
271 | |||
272 | outb(pic2_mask,0xA1); /* restore mask */ | ||
273 | outb(pic1_mask,0x21); | ||
274 | |||
275 | local_irq_restore(flags); | ||
276 | preempt_enable(); | ||
277 | |||
280 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | 278 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); |
281 | } | 279 | } |
282 | 280 | ||
@@ -324,9 +322,11 @@ static int guess_fsb(void) | |||
324 | static int __init longhaul_get_ranges(void) | 322 | static int __init longhaul_get_ranges(void) |
325 | { | 323 | { |
326 | unsigned long invalue; | 324 | unsigned long invalue; |
327 | unsigned int multipliers[32]= { | 325 | unsigned int ezra_t_multipliers[32]= { |
328 | 50,30,40,100,55,35,45,95,90,70,80,60,120,75,85,65, | 326 | 90, 30, 40, 100, 55, 35, 45, 95, |
329 | -1,110,120,-1,135,115,125,105,130,150,160,140,-1,155,-1,145 }; | 327 | 50, 70, 80, 60, 120, 75, 85, 65, |
328 | -1, 110, 120, -1, 135, 115, 125, 105, | ||
329 | 130, 150, 160, 140, -1, 155, -1, 145 }; | ||
330 | unsigned int j, k = 0; | 330 | unsigned int j, k = 0; |
331 | union msr_longhaul longhaul; | 331 | union msr_longhaul longhaul; |
332 | unsigned long lo, hi; | 332 | unsigned long lo, hi; |
@@ -355,13 +355,13 @@ static int __init longhaul_get_ranges(void) | |||
355 | invalue = longhaul.bits.MaxMHzBR; | 355 | invalue = longhaul.bits.MaxMHzBR; |
356 | if (longhaul.bits.MaxMHzBR4) | 356 | if (longhaul.bits.MaxMHzBR4) |
357 | invalue += 16; | 357 | invalue += 16; |
358 | maxmult=multipliers[invalue]; | 358 | maxmult=ezra_t_multipliers[invalue]; |
359 | 359 | ||
360 | invalue = longhaul.bits.MinMHzBR; | 360 | invalue = longhaul.bits.MinMHzBR; |
361 | if (longhaul.bits.MinMHzBR4 == 1) | 361 | if (longhaul.bits.MinMHzBR4 == 1) |
362 | minmult = 30; | 362 | minmult = 30; |
363 | else | 363 | else |
364 | minmult = multipliers[invalue]; | 364 | minmult = ezra_t_multipliers[invalue]; |
365 | fsb = eblcr_fsb_table_v2[longhaul.bits.MaxMHzFSB]; | 365 | fsb = eblcr_fsb_table_v2[longhaul.bits.MaxMHzFSB]; |
366 | break; | 366 | break; |
367 | } | 367 | } |
@@ -527,6 +527,18 @@ static unsigned int longhaul_get(unsigned int cpu) | |||
527 | return calc_speed(longhaul_get_cpu_mult()); | 527 | return calc_speed(longhaul_get_cpu_mult()); |
528 | } | 528 | } |
529 | 529 | ||
530 | static acpi_status longhaul_walk_callback(acpi_handle obj_handle, | ||
531 | u32 nesting_level, | ||
532 | void *context, void **return_value) | ||
533 | { | ||
534 | struct acpi_device *d; | ||
535 | |||
536 | if ( acpi_bus_get_device(obj_handle, &d) ) { | ||
537 | return 0; | ||
538 | } | ||
539 | *return_value = (void *)acpi_driver_data(d); | ||
540 | return 1; | ||
541 | } | ||
530 | 542 | ||
531 | static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | 543 | static int __init longhaul_cpu_init(struct cpufreq_policy *policy) |
532 | { | 544 | { |
@@ -534,6 +546,15 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
534 | char *cpuname=NULL; | 546 | char *cpuname=NULL; |
535 | int ret; | 547 | int ret; |
536 | 548 | ||
549 | /* Check ACPI support for C3 state */ | ||
550 | acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, | ||
551 | &longhaul_walk_callback, NULL, (void *)&pr); | ||
552 | if (pr == NULL) goto err_acpi; | ||
553 | |||
554 | cx = &pr->power.states[ACPI_STATE_C3]; | ||
555 | if (cx->address == 0 || cx->latency > 1000) goto err_acpi; | ||
556 | |||
557 | /* Now check what we have on this motherboard */ | ||
537 | switch (c->x86_model) { | 558 | switch (c->x86_model) { |
538 | case 6: | 559 | case 6: |
539 | cpu_model = CPU_SAMUEL; | 560 | cpu_model = CPU_SAMUEL; |
@@ -634,6 +655,10 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
634 | cpufreq_frequency_table_get_attr(longhaul_table, policy->cpu); | 655 | cpufreq_frequency_table_get_attr(longhaul_table, policy->cpu); |
635 | 656 | ||
636 | return 0; | 657 | return 0; |
658 | |||
659 | err_acpi: | ||
660 | printk(KERN_ERR PFX "No ACPI support for CPU frequency changes.\n"); | ||
661 | return -ENODEV; | ||
637 | } | 662 | } |
638 | 663 | ||
639 | static int __devexit longhaul_cpu_exit(struct cpufreq_policy *policy) | 664 | static int __devexit longhaul_cpu_exit(struct cpufreq_policy *policy) |
@@ -666,6 +691,18 @@ static int __init longhaul_init(void) | |||
666 | if (c->x86_vendor != X86_VENDOR_CENTAUR || c->x86 != 6) | 691 | if (c->x86_vendor != X86_VENDOR_CENTAUR || c->x86 != 6) |
667 | return -ENODEV; | 692 | return -ENODEV; |
668 | 693 | ||
694 | #ifdef CONFIG_SMP | ||
695 | if (num_online_cpus() > 1) { | ||
696 | return -ENODEV; | ||
697 | printk(KERN_ERR PFX "More than 1 CPU detected, longhaul disabled.\n"); | ||
698 | } | ||
699 | #endif | ||
700 | #ifdef CONFIG_X86_IO_APIC | ||
701 | if (cpu_has_apic) { | ||
702 | printk(KERN_ERR PFX "APIC detected. Longhaul is currently broken in this configuration.\n"); | ||
703 | return -ENODEV; | ||
704 | } | ||
705 | #endif | ||
669 | switch (c->x86_model) { | 706 | switch (c->x86_model) { |
670 | case 6 ... 9: | 707 | case 6 ... 9: |
671 | return cpufreq_register_driver(&longhaul_driver); | 708 | return cpufreq_register_driver(&longhaul_driver); |
@@ -699,6 +736,6 @@ MODULE_AUTHOR ("Dave Jones <davej@codemonkey.org.uk>"); | |||
699 | MODULE_DESCRIPTION ("Longhaul driver for VIA Cyrix processors."); | 736 | MODULE_DESCRIPTION ("Longhaul driver for VIA Cyrix processors."); |
700 | MODULE_LICENSE ("GPL"); | 737 | MODULE_LICENSE ("GPL"); |
701 | 738 | ||
702 | module_init(longhaul_init); | 739 | late_initcall(longhaul_init); |
703 | module_exit(longhaul_exit); | 740 | module_exit(longhaul_exit); |
704 | 741 | ||
diff --git a/arch/i386/kernel/cpu/intel_cacheinfo.c b/arch/i386/kernel/cpu/intel_cacheinfo.c index e9f0b928b0a9..5c43be47587f 100644 --- a/arch/i386/kernel/cpu/intel_cacheinfo.c +++ b/arch/i386/kernel/cpu/intel_cacheinfo.c | |||
@@ -759,7 +759,7 @@ static int __cpuinit cache_sysfs_init(void) | |||
759 | if (num_cache_leaves == 0) | 759 | if (num_cache_leaves == 0) |
760 | return 0; | 760 | return 0; |
761 | 761 | ||
762 | register_cpu_notifier(&cacheinfo_cpu_notifier); | 762 | register_hotcpu_notifier(&cacheinfo_cpu_notifier); |
763 | 763 | ||
764 | for_each_online_cpu(i) { | 764 | for_each_online_cpu(i) { |
765 | cacheinfo_cpu_callback(&cacheinfo_cpu_notifier, CPU_ONLINE, | 765 | cacheinfo_cpu_callback(&cacheinfo_cpu_notifier, CPU_ONLINE, |
diff --git a/arch/i386/kernel/cpu/mcheck/mce.h b/arch/i386/kernel/cpu/mcheck/mce.h index dc2416dfef15..84fd4cf7d0fb 100644 --- a/arch/i386/kernel/cpu/mcheck/mce.h +++ b/arch/i386/kernel/cpu/mcheck/mce.h | |||
@@ -9,6 +9,6 @@ void winchip_mcheck_init(struct cpuinfo_x86 *c); | |||
9 | /* Call the installed machine check handler for this CPU setup. */ | 9 | /* Call the installed machine check handler for this CPU setup. */ |
10 | extern fastcall void (*machine_check_vector)(struct pt_regs *, long error_code); | 10 | extern fastcall void (*machine_check_vector)(struct pt_regs *, long error_code); |
11 | 11 | ||
12 | extern int mce_disabled __initdata; | 12 | extern int mce_disabled; |
13 | extern int nr_mce_banks; | 13 | extern int nr_mce_banks; |
14 | 14 | ||
diff --git a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S index d9a260f2efb4..37a7d2eaf4a0 100644 --- a/arch/i386/kernel/entry.S +++ b/arch/i386/kernel/entry.S | |||
@@ -204,7 +204,7 @@ VM_MASK = 0x00020000 | |||
204 | ENTRY(ret_from_fork) | 204 | ENTRY(ret_from_fork) |
205 | CFI_STARTPROC | 205 | CFI_STARTPROC |
206 | pushl %eax | 206 | pushl %eax |
207 | CFI_ADJUST_CFA_OFFSET -4 | 207 | CFI_ADJUST_CFA_OFFSET 4 |
208 | call schedule_tail | 208 | call schedule_tail |
209 | GET_THREAD_INFO(%ebp) | 209 | GET_THREAD_INFO(%ebp) |
210 | popl %eax | 210 | popl %eax |
diff --git a/arch/i386/kernel/kprobes.c b/arch/i386/kernel/kprobes.c index de2e16e561c0..afe6505ca0b3 100644 --- a/arch/i386/kernel/kprobes.c +++ b/arch/i386/kernel/kprobes.c | |||
@@ -256,11 +256,6 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) | |||
256 | int ret = 0; | 256 | int ret = 0; |
257 | kprobe_opcode_t *addr; | 257 | kprobe_opcode_t *addr; |
258 | struct kprobe_ctlblk *kcb; | 258 | struct kprobe_ctlblk *kcb; |
259 | #ifdef CONFIG_PREEMPT | ||
260 | unsigned pre_preempt_count = preempt_count(); | ||
261 | #else | ||
262 | unsigned pre_preempt_count = 1; | ||
263 | #endif | ||
264 | 259 | ||
265 | addr = (kprobe_opcode_t *)(regs->eip - sizeof(kprobe_opcode_t)); | 260 | addr = (kprobe_opcode_t *)(regs->eip - sizeof(kprobe_opcode_t)); |
266 | 261 | ||
@@ -338,13 +333,15 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) | |||
338 | return 1; | 333 | return 1; |
339 | 334 | ||
340 | ss_probe: | 335 | ss_probe: |
341 | if (pre_preempt_count && p->ainsn.boostable == 1 && !p->post_handler){ | 336 | #ifndef CONFIG_PREEMPT |
337 | if (p->ainsn.boostable == 1 && !p->post_handler){ | ||
342 | /* Boost up -- we can execute copied instructions directly */ | 338 | /* Boost up -- we can execute copied instructions directly */ |
343 | reset_current_kprobe(); | 339 | reset_current_kprobe(); |
344 | regs->eip = (unsigned long)p->ainsn.insn; | 340 | regs->eip = (unsigned long)p->ainsn.insn; |
345 | preempt_enable_no_resched(); | 341 | preempt_enable_no_resched(); |
346 | return 1; | 342 | return 1; |
347 | } | 343 | } |
344 | #endif | ||
348 | prepare_singlestep(p, regs); | 345 | prepare_singlestep(p, regs); |
349 | kcb->kprobe_status = KPROBE_HIT_SS; | 346 | kcb->kprobe_status = KPROBE_HIT_SS; |
350 | return 1; | 347 | return 1; |
diff --git a/arch/i386/kernel/machine_kexec.c b/arch/i386/kernel/machine_kexec.c index 511abe52a94e..6b1ae6ba76f0 100644 --- a/arch/i386/kernel/machine_kexec.c +++ b/arch/i386/kernel/machine_kexec.c | |||
@@ -189,14 +189,11 @@ NORET_TYPE void machine_kexec(struct kimage *image) | |||
189 | memcpy((void *)reboot_code_buffer, relocate_new_kernel, | 189 | memcpy((void *)reboot_code_buffer, relocate_new_kernel, |
190 | relocate_new_kernel_size); | 190 | relocate_new_kernel_size); |
191 | 191 | ||
192 | /* The segment registers are funny things, they are | 192 | /* The segment registers are funny things, they have both a |
193 | * automatically loaded from a table, in memory wherever you | 193 | * visible and an invisible part. Whenever the visible part is |
194 | * set them to a specific selector, but this table is never | 194 | * set to a specific selector, the invisible part is loaded |
195 | * accessed again you set the segment to a different selector. | 195 | * with from a table in memory. At no other time is the |
196 | * | 196 | * descriptor table in memory accessed. |
197 | * The more common model is are caches where the behide | ||
198 | * the scenes work is done, but is also dropped at arbitrary | ||
199 | * times. | ||
200 | * | 197 | * |
201 | * I take advantage of this here by force loading the | 198 | * I take advantage of this here by force loading the |
202 | * segments, before I zap the gdt with an invalid value. | 199 | * segments, before I zap the gdt with an invalid value. |
diff --git a/arch/i386/kernel/nmi.c b/arch/i386/kernel/nmi.c index 2dd928a84645..acb351478e42 100644 --- a/arch/i386/kernel/nmi.c +++ b/arch/i386/kernel/nmi.c | |||
@@ -575,6 +575,7 @@ void touch_nmi_watchdog (void) | |||
575 | */ | 575 | */ |
576 | touch_softlockup_watchdog(); | 576 | touch_softlockup_watchdog(); |
577 | } | 577 | } |
578 | EXPORT_SYMBOL(touch_nmi_watchdog); | ||
578 | 579 | ||
579 | extern void die_nmi(struct pt_regs *, const char *msg); | 580 | extern void die_nmi(struct pt_regs *, const char *msg); |
580 | 581 | ||
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index 923bb292f47f..8657c739656a 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c | |||
@@ -690,8 +690,8 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas | |||
690 | /* | 690 | /* |
691 | * Now maybe handle debug registers and/or IO bitmaps | 691 | * Now maybe handle debug registers and/or IO bitmaps |
692 | */ | 692 | */ |
693 | if (unlikely((task_thread_info(next_p)->flags & _TIF_WORK_CTXSW)) | 693 | if (unlikely((task_thread_info(next_p)->flags & _TIF_WORK_CTXSW) |
694 | || test_tsk_thread_flag(prev_p, TIF_IO_BITMAP)) | 694 | || test_tsk_thread_flag(prev_p, TIF_IO_BITMAP))) |
695 | __switch_to_xtra(next_p, tss); | 695 | __switch_to_xtra(next_p, tss); |
696 | 696 | ||
697 | disable_tsc(prev_p, next_p); | 697 | disable_tsc(prev_p, next_p); |
diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c index 6f5fea05f1d7..f948419c888a 100644 --- a/arch/i386/kernel/smpboot.c +++ b/arch/i386/kernel/smpboot.c | |||
@@ -212,14 +212,20 @@ valid_k7: | |||
212 | * then we print a warning if not, and always resync. | 212 | * then we print a warning if not, and always resync. |
213 | */ | 213 | */ |
214 | 214 | ||
215 | static atomic_t tsc_start_flag = ATOMIC_INIT(0); | 215 | static struct { |
216 | static atomic_t tsc_count_start = ATOMIC_INIT(0); | 216 | atomic_t start_flag; |
217 | static atomic_t tsc_count_stop = ATOMIC_INIT(0); | 217 | atomic_t count_start; |
218 | static unsigned long long tsc_values[NR_CPUS]; | 218 | atomic_t count_stop; |
219 | unsigned long long values[NR_CPUS]; | ||
220 | } tsc __initdata = { | ||
221 | .start_flag = ATOMIC_INIT(0), | ||
222 | .count_start = ATOMIC_INIT(0), | ||
223 | .count_stop = ATOMIC_INIT(0), | ||
224 | }; | ||
219 | 225 | ||
220 | #define NR_LOOPS 5 | 226 | #define NR_LOOPS 5 |
221 | 227 | ||
222 | static void __init synchronize_tsc_bp (void) | 228 | static void __init synchronize_tsc_bp(void) |
223 | { | 229 | { |
224 | int i; | 230 | int i; |
225 | unsigned long long t0; | 231 | unsigned long long t0; |
@@ -233,7 +239,7 @@ static void __init synchronize_tsc_bp (void) | |||
233 | /* convert from kcyc/sec to cyc/usec */ | 239 | /* convert from kcyc/sec to cyc/usec */ |
234 | one_usec = cpu_khz / 1000; | 240 | one_usec = cpu_khz / 1000; |
235 | 241 | ||
236 | atomic_set(&tsc_start_flag, 1); | 242 | atomic_set(&tsc.start_flag, 1); |
237 | wmb(); | 243 | wmb(); |
238 | 244 | ||
239 | /* | 245 | /* |
@@ -250,16 +256,16 @@ static void __init synchronize_tsc_bp (void) | |||
250 | /* | 256 | /* |
251 | * all APs synchronize but they loop on '== num_cpus' | 257 | * all APs synchronize but they loop on '== num_cpus' |
252 | */ | 258 | */ |
253 | while (atomic_read(&tsc_count_start) != num_booting_cpus()-1) | 259 | while (atomic_read(&tsc.count_start) != num_booting_cpus()-1) |
254 | cpu_relax(); | 260 | cpu_relax(); |
255 | atomic_set(&tsc_count_stop, 0); | 261 | atomic_set(&tsc.count_stop, 0); |
256 | wmb(); | 262 | wmb(); |
257 | /* | 263 | /* |
258 | * this lets the APs save their current TSC: | 264 | * this lets the APs save their current TSC: |
259 | */ | 265 | */ |
260 | atomic_inc(&tsc_count_start); | 266 | atomic_inc(&tsc.count_start); |
261 | 267 | ||
262 | rdtscll(tsc_values[smp_processor_id()]); | 268 | rdtscll(tsc.values[smp_processor_id()]); |
263 | /* | 269 | /* |
264 | * We clear the TSC in the last loop: | 270 | * We clear the TSC in the last loop: |
265 | */ | 271 | */ |
@@ -269,56 +275,54 @@ static void __init synchronize_tsc_bp (void) | |||
269 | /* | 275 | /* |
270 | * Wait for all APs to leave the synchronization point: | 276 | * Wait for all APs to leave the synchronization point: |
271 | */ | 277 | */ |
272 | while (atomic_read(&tsc_count_stop) != num_booting_cpus()-1) | 278 | while (atomic_read(&tsc.count_stop) != num_booting_cpus()-1) |
273 | cpu_relax(); | 279 | cpu_relax(); |
274 | atomic_set(&tsc_count_start, 0); | 280 | atomic_set(&tsc.count_start, 0); |
275 | wmb(); | 281 | wmb(); |
276 | atomic_inc(&tsc_count_stop); | 282 | atomic_inc(&tsc.count_stop); |
277 | } | 283 | } |
278 | 284 | ||
279 | sum = 0; | 285 | sum = 0; |
280 | for (i = 0; i < NR_CPUS; i++) { | 286 | for (i = 0; i < NR_CPUS; i++) { |
281 | if (cpu_isset(i, cpu_callout_map)) { | 287 | if (cpu_isset(i, cpu_callout_map)) { |
282 | t0 = tsc_values[i]; | 288 | t0 = tsc.values[i]; |
283 | sum += t0; | 289 | sum += t0; |
284 | } | 290 | } |
285 | } | 291 | } |
286 | avg = sum; | 292 | avg = sum; |
287 | do_div(avg, num_booting_cpus()); | 293 | do_div(avg, num_booting_cpus()); |
288 | 294 | ||
289 | sum = 0; | ||
290 | for (i = 0; i < NR_CPUS; i++) { | 295 | for (i = 0; i < NR_CPUS; i++) { |
291 | if (!cpu_isset(i, cpu_callout_map)) | 296 | if (!cpu_isset(i, cpu_callout_map)) |
292 | continue; | 297 | continue; |
293 | delta = tsc_values[i] - avg; | 298 | delta = tsc.values[i] - avg; |
294 | if (delta < 0) | 299 | if (delta < 0) |
295 | delta = -delta; | 300 | delta = -delta; |
296 | /* | 301 | /* |
297 | * We report bigger than 2 microseconds clock differences. | 302 | * We report bigger than 2 microseconds clock differences. |
298 | */ | 303 | */ |
299 | if (delta > 2*one_usec) { | 304 | if (delta > 2*one_usec) { |
300 | long realdelta; | 305 | long long realdelta; |
306 | |||
301 | if (!buggy) { | 307 | if (!buggy) { |
302 | buggy = 1; | 308 | buggy = 1; |
303 | printk("\n"); | 309 | printk("\n"); |
304 | } | 310 | } |
305 | realdelta = delta; | 311 | realdelta = delta; |
306 | do_div(realdelta, one_usec); | 312 | do_div(realdelta, one_usec); |
307 | if (tsc_values[i] < avg) | 313 | if (tsc.values[i] < avg) |
308 | realdelta = -realdelta; | 314 | realdelta = -realdelta; |
309 | 315 | ||
310 | if (realdelta > 0) | 316 | if (realdelta) |
311 | printk(KERN_INFO "CPU#%d had %ld usecs TSC " | 317 | printk(KERN_INFO "CPU#%d had %Ld usecs TSC " |
312 | "skew, fixed it up.\n", i, realdelta); | 318 | "skew, fixed it up.\n", i, realdelta); |
313 | } | 319 | } |
314 | |||
315 | sum += delta; | ||
316 | } | 320 | } |
317 | if (!buggy) | 321 | if (!buggy) |
318 | printk("passed.\n"); | 322 | printk("passed.\n"); |
319 | } | 323 | } |
320 | 324 | ||
321 | static void __init synchronize_tsc_ap (void) | 325 | static void __init synchronize_tsc_ap(void) |
322 | { | 326 | { |
323 | int i; | 327 | int i; |
324 | 328 | ||
@@ -327,20 +331,20 @@ static void __init synchronize_tsc_ap (void) | |||
327 | * this gets called, so we first wait for the BP to | 331 | * this gets called, so we first wait for the BP to |
328 | * finish SMP initialization: | 332 | * finish SMP initialization: |
329 | */ | 333 | */ |
330 | while (!atomic_read(&tsc_start_flag)) | 334 | while (!atomic_read(&tsc.start_flag)) |
331 | cpu_relax(); | 335 | cpu_relax(); |
332 | 336 | ||
333 | for (i = 0; i < NR_LOOPS; i++) { | 337 | for (i = 0; i < NR_LOOPS; i++) { |
334 | atomic_inc(&tsc_count_start); | 338 | atomic_inc(&tsc.count_start); |
335 | while (atomic_read(&tsc_count_start) != num_booting_cpus()) | 339 | while (atomic_read(&tsc.count_start) != num_booting_cpus()) |
336 | cpu_relax(); | 340 | cpu_relax(); |
337 | 341 | ||
338 | rdtscll(tsc_values[smp_processor_id()]); | 342 | rdtscll(tsc.values[smp_processor_id()]); |
339 | if (i == NR_LOOPS-1) | 343 | if (i == NR_LOOPS-1) |
340 | write_tsc(0, 0); | 344 | write_tsc(0, 0); |
341 | 345 | ||
342 | atomic_inc(&tsc_count_stop); | 346 | atomic_inc(&tsc.count_stop); |
343 | while (atomic_read(&tsc_count_stop) != num_booting_cpus()) | 347 | while (atomic_read(&tsc.count_stop) != num_booting_cpus()) |
344 | cpu_relax(); | 348 | cpu_relax(); |
345 | } | 349 | } |
346 | } | 350 | } |
diff --git a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c index 8705c0f05788..edd00f6cee37 100644 --- a/arch/i386/kernel/time.c +++ b/arch/i386/kernel/time.c | |||
@@ -135,7 +135,7 @@ unsigned long profile_pc(struct pt_regs *regs) | |||
135 | { | 135 | { |
136 | unsigned long pc = instruction_pointer(regs); | 136 | unsigned long pc = instruction_pointer(regs); |
137 | 137 | ||
138 | if (in_lock_functions(pc)) | 138 | if (!user_mode_vm(regs) && in_lock_functions(pc)) |
139 | return *(unsigned long *)(regs->ebp + 4); | 139 | return *(unsigned long *)(regs->ebp + 4); |
140 | 140 | ||
141 | return pc; | 141 | return pc; |
diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index 313ac1f7dc5a..82e0fd02af1c 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c | |||
@@ -187,10 +187,21 @@ static void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, | |||
187 | if (unwind_init_blocked(&info, task) == 0) | 187 | if (unwind_init_blocked(&info, task) == 0) |
188 | unw_ret = show_trace_unwind(&info, log_lvl); | 188 | unw_ret = show_trace_unwind(&info, log_lvl); |
189 | } | 189 | } |
190 | if (unw_ret > 0) { | 190 | if (unw_ret > 0 && !arch_unw_user_mode(&info)) { |
191 | if (call_trace > 0) | 191 | #ifdef CONFIG_STACK_UNWIND |
192 | print_symbol("DWARF2 unwinder stuck at %s\n", | ||
193 | UNW_PC(&info)); | ||
194 | if (call_trace == 1) { | ||
195 | printk("Leftover inexact backtrace:\n"); | ||
196 | if (UNW_SP(&info)) | ||
197 | stack = (void *)UNW_SP(&info); | ||
198 | } else if (call_trace > 1) | ||
192 | return; | 199 | return; |
193 | printk("%sLegacy call trace:\n", log_lvl); | 200 | else |
201 | printk("Full inexact backtrace again:\n"); | ||
202 | #else | ||
203 | printk("Inexact backtrace:\n"); | ||
204 | #endif | ||
194 | } | 205 | } |
195 | } | 206 | } |
196 | 207 | ||
@@ -442,11 +453,9 @@ void die(const char * str, struct pt_regs * regs, long err) | |||
442 | if (in_interrupt()) | 453 | if (in_interrupt()) |
443 | panic("Fatal exception in interrupt"); | 454 | panic("Fatal exception in interrupt"); |
444 | 455 | ||
445 | if (panic_on_oops) { | 456 | if (panic_on_oops) |
446 | printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n"); | ||
447 | ssleep(5); | ||
448 | panic("Fatal exception"); | 457 | panic("Fatal exception"); |
449 | } | 458 | |
450 | oops_exit(); | 459 | oops_exit(); |
451 | do_exit(SIGSEGV); | 460 | do_exit(SIGSEGV); |
452 | } | 461 | } |
@@ -1238,8 +1247,10 @@ static int __init call_trace_setup(char *s) | |||
1238 | call_trace = -1; | 1247 | call_trace = -1; |
1239 | else if (strcmp(s, "both") == 0) | 1248 | else if (strcmp(s, "both") == 0) |
1240 | call_trace = 0; | 1249 | call_trace = 0; |
1241 | else if (strcmp(s, "new") == 0) | 1250 | else if (strcmp(s, "newfallback") == 0) |
1242 | call_trace = 1; | 1251 | call_trace = 1; |
1252 | else if (strcmp(s, "new") == 2) | ||
1253 | call_trace = 2; | ||
1243 | return 1; | 1254 | return 1; |
1244 | } | 1255 | } |
1245 | __setup("call_trace=", call_trace_setup); | 1256 | __setup("call_trace=", call_trace_setup); |
diff --git a/arch/i386/kernel/vsyscall.lds.S b/arch/i386/kernel/vsyscall.lds.S index e26975fc68b6..f66cd11adb72 100644 --- a/arch/i386/kernel/vsyscall.lds.S +++ b/arch/i386/kernel/vsyscall.lds.S | |||
@@ -10,6 +10,7 @@ SECTIONS | |||
10 | . = VDSO_PRELINK + SIZEOF_HEADERS; | 10 | . = VDSO_PRELINK + SIZEOF_HEADERS; |
11 | 11 | ||
12 | .hash : { *(.hash) } :text | 12 | .hash : { *(.hash) } :text |
13 | .gnu.hash : { *(.gnu.hash) } | ||
13 | .dynsym : { *(.dynsym) } | 14 | .dynsym : { *(.dynsym) } |
14 | .dynstr : { *(.dynstr) } | 15 | .dynstr : { *(.dynstr) } |
15 | .gnu.version : { *(.gnu.version) } | 16 | .gnu.version : { *(.gnu.version) } |
diff --git a/arch/ia64/configs/sn2_defconfig b/arch/ia64/configs/sn2_defconfig index 9ea35398e10d..0f14a82b856e 100644 --- a/arch/ia64/configs/sn2_defconfig +++ b/arch/ia64/configs/sn2_defconfig | |||
@@ -363,7 +363,7 @@ CONFIG_BLK_DEV_IDECD=y | |||
363 | # | 363 | # |
364 | CONFIG_IDE_GENERIC=y | 364 | CONFIG_IDE_GENERIC=y |
365 | CONFIG_BLK_DEV_IDEPCI=y | 365 | CONFIG_BLK_DEV_IDEPCI=y |
366 | # CONFIG_IDEPCI_SHARE_IRQ is not set | 366 | CONFIG_IDEPCI_SHARE_IRQ=y |
367 | # CONFIG_BLK_DEV_OFFBOARD is not set | 367 | # CONFIG_BLK_DEV_OFFBOARD is not set |
368 | # CONFIG_BLK_DEV_GENERIC is not set | 368 | # CONFIG_BLK_DEV_GENERIC is not set |
369 | # CONFIG_BLK_DEV_OPTI621 is not set | 369 | # CONFIG_BLK_DEV_OPTI621 is not set |
diff --git a/arch/ia64/defconfig b/arch/ia64/defconfig index 6cba55da572a..9001b3fbaa32 100644 --- a/arch/ia64/defconfig +++ b/arch/ia64/defconfig | |||
@@ -366,7 +366,7 @@ CONFIG_BLK_DEV_IDESCSI=m | |||
366 | # CONFIG_IDE_GENERIC is not set | 366 | # CONFIG_IDE_GENERIC is not set |
367 | # CONFIG_BLK_DEV_IDEPNP is not set | 367 | # CONFIG_BLK_DEV_IDEPNP is not set |
368 | CONFIG_BLK_DEV_IDEPCI=y | 368 | CONFIG_BLK_DEV_IDEPCI=y |
369 | # CONFIG_IDEPCI_SHARE_IRQ is not set | 369 | CONFIG_IDEPCI_SHARE_IRQ=y |
370 | # CONFIG_BLK_DEV_OFFBOARD is not set | 370 | # CONFIG_BLK_DEV_OFFBOARD is not set |
371 | CONFIG_BLK_DEV_GENERIC=y | 371 | CONFIG_BLK_DEV_GENERIC=y |
372 | # CONFIG_BLK_DEV_OPTI621 is not set | 372 | # CONFIG_BLK_DEV_OPTI621 is not set |
diff --git a/arch/ia64/hp/sim/simscsi.c b/arch/ia64/hp/sim/simscsi.c index a3fe97531134..8a4f0d0d17a3 100644 --- a/arch/ia64/hp/sim/simscsi.c +++ b/arch/ia64/hp/sim/simscsi.c | |||
@@ -151,7 +151,7 @@ static void | |||
151 | simscsi_sg_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset) | 151 | simscsi_sg_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset) |
152 | { | 152 | { |
153 | int list_len = sc->use_sg; | 153 | int list_len = sc->use_sg; |
154 | struct scatterlist *sl = (struct scatterlist *)sc->buffer; | 154 | struct scatterlist *sl = (struct scatterlist *)sc->request_buffer; |
155 | struct disk_stat stat; | 155 | struct disk_stat stat; |
156 | struct disk_req req; | 156 | struct disk_req req; |
157 | 157 | ||
@@ -244,7 +244,7 @@ static void simscsi_fillresult(struct scsi_cmnd *sc, char *buf, unsigned len) | |||
244 | 244 | ||
245 | if (scatterlen == 0) | 245 | if (scatterlen == 0) |
246 | memcpy(sc->request_buffer, buf, len); | 246 | memcpy(sc->request_buffer, buf, len); |
247 | else for (slp = (struct scatterlist *)sc->buffer; scatterlen-- > 0 && len > 0; slp++) { | 247 | else for (slp = (struct scatterlist *)sc->request_buffer; scatterlen-- > 0 && len > 0; slp++) { |
248 | unsigned thislen = min(len, slp->length); | 248 | unsigned thislen = min(len, slp->length); |
249 | 249 | ||
250 | memcpy(page_address(slp->page) + slp->offset, buf, thislen); | 250 | memcpy(page_address(slp->page) + slp->offset, buf, thislen); |
diff --git a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile index 0e4553f320bf..ad8215a3c586 100644 --- a/arch/ia64/kernel/Makefile +++ b/arch/ia64/kernel/Makefile | |||
@@ -45,7 +45,8 @@ CPPFLAGS_gate.lds := -P -C -U$(ARCH) | |||
45 | quiet_cmd_gate = GATE $@ | 45 | quiet_cmd_gate = GATE $@ |
46 | cmd_gate = $(CC) -nostdlib $(GATECFLAGS_$(@F)) -Wl,-T,$(filter-out FORCE,$^) -o $@ | 46 | cmd_gate = $(CC) -nostdlib $(GATECFLAGS_$(@F)) -Wl,-T,$(filter-out FORCE,$^) -o $@ |
47 | 47 | ||
48 | GATECFLAGS_gate.so = -shared -s -Wl,-soname=linux-gate.so.1 | 48 | GATECFLAGS_gate.so = -shared -s -Wl,-soname=linux-gate.so.1 \ |
49 | $(call ld-option, -Wl$(comma)--hash-style=sysv) | ||
49 | $(obj)/gate.so: $(obj)/gate.lds $(obj)/gate.o FORCE | 50 | $(obj)/gate.so: $(obj)/gate.lds $(obj)/gate.o FORCE |
50 | $(call if_changed,gate) | 51 | $(call if_changed,gate) |
51 | 52 | ||
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 99761b81db44..0176556aeecc 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
@@ -55,7 +55,7 @@ | |||
55 | 55 | ||
56 | #define BAD_MADT_ENTRY(entry, end) ( \ | 56 | #define BAD_MADT_ENTRY(entry, end) ( \ |
57 | (!entry) || (unsigned long)entry + sizeof(*entry) > end || \ | 57 | (!entry) || (unsigned long)entry + sizeof(*entry) > end || \ |
58 | ((acpi_table_entry_header *)entry)->length != sizeof(*entry)) | 58 | ((acpi_table_entry_header *)entry)->length < sizeof(*entry)) |
59 | 59 | ||
60 | #define PREFIX "ACPI: " | 60 | #define PREFIX "ACPI: " |
61 | 61 | ||
diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c index e4bfa9dafbce..bb8770a177b5 100644 --- a/arch/ia64/kernel/efi.c +++ b/arch/ia64/kernel/efi.c | |||
@@ -632,7 +632,7 @@ kern_memory_descriptor (unsigned long phys_addr) | |||
632 | if (phys_addr - md->start < (md->num_pages << EFI_PAGE_SHIFT)) | 632 | if (phys_addr - md->start < (md->num_pages << EFI_PAGE_SHIFT)) |
633 | return md; | 633 | return md; |
634 | } | 634 | } |
635 | return 0; | 635 | return NULL; |
636 | } | 636 | } |
637 | 637 | ||
638 | static efi_memory_desc_t * | 638 | static efi_memory_desc_t * |
@@ -652,7 +652,7 @@ efi_memory_descriptor (unsigned long phys_addr) | |||
652 | if (phys_addr - md->phys_addr < (md->num_pages << EFI_PAGE_SHIFT)) | 652 | if (phys_addr - md->phys_addr < (md->num_pages << EFI_PAGE_SHIFT)) |
653 | return md; | 653 | return md; |
654 | } | 654 | } |
655 | return 0; | 655 | return NULL; |
656 | } | 656 | } |
657 | 657 | ||
658 | u32 | 658 | u32 |
@@ -923,7 +923,7 @@ find_memmap_space (void) | |||
923 | void | 923 | void |
924 | efi_memmap_init(unsigned long *s, unsigned long *e) | 924 | efi_memmap_init(unsigned long *s, unsigned long *e) |
925 | { | 925 | { |
926 | struct kern_memdesc *k, *prev = 0; | 926 | struct kern_memdesc *k, *prev = NULL; |
927 | u64 contig_low=0, contig_high=0; | 927 | u64 contig_low=0, contig_high=0; |
928 | u64 as, ae, lim; | 928 | u64 as, ae, lim; |
929 | void *efi_map_start, *efi_map_end, *p, *q; | 929 | void *efi_map_start, *efi_map_end, *p, *q; |
diff --git a/arch/ia64/kernel/gate.lds.S b/arch/ia64/kernel/gate.lds.S index cc35cddfd4cf..6d198339bf85 100644 --- a/arch/ia64/kernel/gate.lds.S +++ b/arch/ia64/kernel/gate.lds.S | |||
@@ -12,6 +12,7 @@ SECTIONS | |||
12 | . = GATE_ADDR + SIZEOF_HEADERS; | 12 | . = GATE_ADDR + SIZEOF_HEADERS; |
13 | 13 | ||
14 | .hash : { *(.hash) } :readable | 14 | .hash : { *(.hash) } :readable |
15 | .gnu.hash : { *(.gnu.hash) } | ||
15 | .dynsym : { *(.dynsym) } | 16 | .dynsym : { *(.dynsym) } |
16 | .dynstr : { *(.dynstr) } | 17 | .dynstr : { *(.dynstr) } |
17 | .gnu.version : { *(.gnu.version) } | 18 | .gnu.version : { *(.gnu.version) } |
diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S index 561b8f1d3bc7..29236f0c62b5 100644 --- a/arch/ia64/kernel/head.S +++ b/arch/ia64/kernel/head.S | |||
@@ -853,7 +853,6 @@ END(__ia64_init_fpu) | |||
853 | */ | 853 | */ |
854 | GLOBAL_ENTRY(ia64_switch_mode_phys) | 854 | GLOBAL_ENTRY(ia64_switch_mode_phys) |
855 | { | 855 | { |
856 | alloc r2=ar.pfs,0,0,0,0 | ||
857 | rsm psr.i | psr.ic // disable interrupts and interrupt collection | 856 | rsm psr.i | psr.ic // disable interrupts and interrupt collection |
858 | mov r15=ip | 857 | mov r15=ip |
859 | } | 858 | } |
@@ -902,7 +901,6 @@ END(ia64_switch_mode_phys) | |||
902 | */ | 901 | */ |
903 | GLOBAL_ENTRY(ia64_switch_mode_virt) | 902 | GLOBAL_ENTRY(ia64_switch_mode_virt) |
904 | { | 903 | { |
905 | alloc r2=ar.pfs,0,0,0,0 | ||
906 | rsm psr.i | psr.ic // disable interrupts and interrupt collection | 904 | rsm psr.i | psr.ic // disable interrupts and interrupt collection |
907 | mov r15=ip | 905 | mov r15=ip |
908 | } | 906 | } |
diff --git a/arch/ia64/kernel/ia64_ksyms.c b/arch/ia64/kernel/ia64_ksyms.c index b7cf651ceb14..3ead20fb6f4b 100644 --- a/arch/ia64/kernel/ia64_ksyms.c +++ b/arch/ia64/kernel/ia64_ksyms.c | |||
@@ -62,7 +62,7 @@ EXPORT_SYMBOL(__udivdi3); | |||
62 | EXPORT_SYMBOL(__moddi3); | 62 | EXPORT_SYMBOL(__moddi3); |
63 | EXPORT_SYMBOL(__umoddi3); | 63 | EXPORT_SYMBOL(__umoddi3); |
64 | 64 | ||
65 | #if defined(CONFIG_MD_RAID5) || defined(CONFIG_MD_RAID5_MODULE) | 65 | #if defined(CONFIG_MD_RAID456) || defined(CONFIG_MD_RAID456_MODULE) |
66 | extern void xor_ia64_2(void); | 66 | extern void xor_ia64_2(void); |
67 | extern void xor_ia64_3(void); | 67 | extern void xor_ia64_3(void); |
68 | extern void xor_ia64_4(void); | 68 | extern void xor_ia64_4(void); |
diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c index 00d9c83b8020..781960f80b6f 100644 --- a/arch/ia64/kernel/kprobes.c +++ b/arch/ia64/kernel/kprobes.c | |||
@@ -448,11 +448,20 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p) | |||
448 | return 0; | 448 | return 0; |
449 | } | 449 | } |
450 | 450 | ||
451 | void __kprobes flush_insn_slot(struct kprobe *p) | ||
452 | { | ||
453 | unsigned long arm_addr; | ||
454 | |||
455 | arm_addr = ((unsigned long)&p->opcode.bundle) & ~0xFULL; | ||
456 | flush_icache_range(arm_addr, arm_addr + sizeof(bundle_t)); | ||
457 | } | ||
458 | |||
451 | void __kprobes arch_arm_kprobe(struct kprobe *p) | 459 | void __kprobes arch_arm_kprobe(struct kprobe *p) |
452 | { | 460 | { |
453 | unsigned long addr = (unsigned long)p->addr; | 461 | unsigned long addr = (unsigned long)p->addr; |
454 | unsigned long arm_addr = addr & ~0xFULL; | 462 | unsigned long arm_addr = addr & ~0xFULL; |
455 | 463 | ||
464 | flush_insn_slot(p); | ||
456 | memcpy((char *)arm_addr, &p->ainsn.insn.bundle, sizeof(bundle_t)); | 465 | memcpy((char *)arm_addr, &p->ainsn.insn.bundle, sizeof(bundle_t)); |
457 | flush_icache_range(arm_addr, arm_addr + sizeof(bundle_t)); | 466 | flush_icache_range(arm_addr, arm_addr + sizeof(bundle_t)); |
458 | } | 467 | } |
diff --git a/arch/ia64/kernel/pal.S b/arch/ia64/kernel/pal.S index 5018c7f2e7a8..ebaf1e685f5e 100644 --- a/arch/ia64/kernel/pal.S +++ b/arch/ia64/kernel/pal.S | |||
@@ -217,12 +217,7 @@ GLOBAL_ENTRY(ia64_pal_call_phys_stacked) | |||
217 | .body | 217 | .body |
218 | ;; | 218 | ;; |
219 | ld8 loc2 = [loc2] // loc2 <- entry point | 219 | ld8 loc2 = [loc2] // loc2 <- entry point |
220 | mov out0 = in0 // first argument | 220 | mov loc3 = psr // save psr |
221 | mov out1 = in1 // copy arg2 | ||
222 | mov out2 = in2 // copy arg3 | ||
223 | mov out3 = in3 // copy arg3 | ||
224 | ;; | ||
225 | mov loc3 = psr // save psr | ||
226 | ;; | 221 | ;; |
227 | mov loc4=ar.rsc // save RSE configuration | 222 | mov loc4=ar.rsc // save RSE configuration |
228 | dep.z loc2=loc2,0,61 // convert pal entry point to physical | 223 | dep.z loc2=loc2,0,61 // convert pal entry point to physical |
@@ -236,18 +231,23 @@ GLOBAL_ENTRY(ia64_pal_call_phys_stacked) | |||
236 | ;; | 231 | ;; |
237 | andcm r16=loc3,r16 // removes bits to clear from psr | 232 | andcm r16=loc3,r16 // removes bits to clear from psr |
238 | br.call.sptk.many rp=ia64_switch_mode_phys | 233 | br.call.sptk.many rp=ia64_switch_mode_phys |
239 | .ret6: | 234 | |
235 | mov out0 = in0 // first argument | ||
236 | mov out1 = in1 // copy arg2 | ||
237 | mov out2 = in2 // copy arg3 | ||
238 | mov out3 = in3 // copy arg3 | ||
240 | mov loc5 = r19 | 239 | mov loc5 = r19 |
241 | mov loc6 = r20 | 240 | mov loc6 = r20 |
241 | |||
242 | br.call.sptk.many rp=b7 // now make the call | 242 | br.call.sptk.many rp=b7 // now make the call |
243 | .ret7: | 243 | |
244 | mov ar.rsc=0 // put RSE in enforced lazy, LE mode | 244 | mov ar.rsc=0 // put RSE in enforced lazy, LE mode |
245 | mov r16=loc3 // r16= original psr | 245 | mov r16=loc3 // r16= original psr |
246 | mov r19=loc5 | 246 | mov r19=loc5 |
247 | mov r20=loc6 | 247 | mov r20=loc6 |
248 | br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode | 248 | br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode |
249 | 249 | ||
250 | .ret8: mov psr.l = loc3 // restore init PSR | 250 | mov psr.l = loc3 // restore init PSR |
251 | mov ar.pfs = loc1 | 251 | mov ar.pfs = loc1 |
252 | mov rp = loc0 | 252 | mov rp = loc0 |
253 | ;; | 253 | ;; |
diff --git a/arch/ia64/kernel/palinfo.c b/arch/ia64/kernel/palinfo.c index 3f5bac59209a..0b546e2b36ac 100644 --- a/arch/ia64/kernel/palinfo.c +++ b/arch/ia64/kernel/palinfo.c | |||
@@ -566,29 +566,23 @@ version_info(char *page) | |||
566 | pal_version_u_t min_ver, cur_ver; | 566 | pal_version_u_t min_ver, cur_ver; |
567 | char *p = page; | 567 | char *p = page; |
568 | 568 | ||
569 | /* The PAL_VERSION call is advertised as being able to support | 569 | if (ia64_pal_version(&min_ver, &cur_ver) != 0) |
570 | * both physical and virtual mode calls. This seems to be a documentation | 570 | return 0; |
571 | * bug rather than firmware bug. In fact, it does only support physical mode. | ||
572 | * So now the code reflects this fact and the pal_version() has been updated | ||
573 | * accordingly. | ||
574 | */ | ||
575 | if (ia64_pal_version(&min_ver, &cur_ver) != 0) return 0; | ||
576 | 571 | ||
577 | p += sprintf(p, | 572 | p += sprintf(p, |
578 | "PAL_vendor : 0x%02x (min=0x%02x)\n" | 573 | "PAL_vendor : 0x%02x (min=0x%02x)\n" |
579 | "PAL_A : %x.%x.%x (min=%x.%x.%x)\n" | 574 | "PAL_A : %02x.%02x (min=%02x.%02x)\n" |
580 | "PAL_B : %x.%x.%x (min=%x.%x.%x)\n", | 575 | "PAL_B : %02x.%02x (min=%02x.%02x)\n", |
581 | cur_ver.pal_version_s.pv_pal_vendor, min_ver.pal_version_s.pv_pal_vendor, | 576 | cur_ver.pal_version_s.pv_pal_vendor, |
582 | 577 | min_ver.pal_version_s.pv_pal_vendor, | |
583 | cur_ver.pal_version_s.pv_pal_a_model>>4, | 578 | cur_ver.pal_version_s.pv_pal_a_model, |
584 | cur_ver.pal_version_s.pv_pal_a_model&0xf, cur_ver.pal_version_s.pv_pal_a_rev, | 579 | cur_ver.pal_version_s.pv_pal_a_rev, |
585 | min_ver.pal_version_s.pv_pal_a_model>>4, | 580 | min_ver.pal_version_s.pv_pal_a_model, |
586 | min_ver.pal_version_s.pv_pal_a_model&0xf, min_ver.pal_version_s.pv_pal_a_rev, | 581 | min_ver.pal_version_s.pv_pal_a_rev, |
587 | 582 | cur_ver.pal_version_s.pv_pal_b_model, | |
588 | cur_ver.pal_version_s.pv_pal_b_model>>4, | 583 | cur_ver.pal_version_s.pv_pal_b_rev, |
589 | cur_ver.pal_version_s.pv_pal_b_model&0xf, cur_ver.pal_version_s.pv_pal_b_rev, | 584 | min_ver.pal_version_s.pv_pal_b_model, |
590 | min_ver.pal_version_s.pv_pal_b_model>>4, | 585 | min_ver.pal_version_s.pv_pal_b_rev); |
591 | min_ver.pal_version_s.pv_pal_b_model&0xf, min_ver.pal_version_s.pv_pal_b_rev); | ||
592 | return p - page; | 586 | return p - page; |
593 | } | 587 | } |
594 | 588 | ||
@@ -958,9 +952,9 @@ remove_palinfo_proc_entries(unsigned int hcpu) | |||
958 | } | 952 | } |
959 | } | 953 | } |
960 | 954 | ||
961 | static int __cpuinit palinfo_cpu_callback(struct notifier_block *nfb, | 955 | #ifdef CONFIG_HOTPLUG_CPU |
962 | unsigned long action, | 956 | static int palinfo_cpu_callback(struct notifier_block *nfb, |
963 | void *hcpu) | 957 | unsigned long action, void *hcpu) |
964 | { | 958 | { |
965 | unsigned int hotcpu = (unsigned long)hcpu; | 959 | unsigned int hotcpu = (unsigned long)hcpu; |
966 | 960 | ||
@@ -968,20 +962,19 @@ static int __cpuinit palinfo_cpu_callback(struct notifier_block *nfb, | |||
968 | case CPU_ONLINE: | 962 | case CPU_ONLINE: |
969 | create_palinfo_proc_entries(hotcpu); | 963 | create_palinfo_proc_entries(hotcpu); |
970 | break; | 964 | break; |
971 | #ifdef CONFIG_HOTPLUG_CPU | ||
972 | case CPU_DEAD: | 965 | case CPU_DEAD: |
973 | remove_palinfo_proc_entries(hotcpu); | 966 | remove_palinfo_proc_entries(hotcpu); |
974 | break; | 967 | break; |
975 | #endif | ||
976 | } | 968 | } |
977 | return NOTIFY_OK; | 969 | return NOTIFY_OK; |
978 | } | 970 | } |
979 | 971 | ||
980 | static struct notifier_block __cpuinitdata palinfo_cpu_notifier = | 972 | static struct notifier_block palinfo_cpu_notifier = |
981 | { | 973 | { |
982 | .notifier_call = palinfo_cpu_callback, | 974 | .notifier_call = palinfo_cpu_callback, |
983 | .priority = 0, | 975 | .priority = 0, |
984 | }; | 976 | }; |
977 | #endif | ||
985 | 978 | ||
986 | static int __init | 979 | static int __init |
987 | palinfo_init(void) | 980 | palinfo_init(void) |
@@ -1020,7 +1013,7 @@ palinfo_exit(void) | |||
1020 | /* | 1013 | /* |
1021 | * Unregister from cpu notifier callbacks | 1014 | * Unregister from cpu notifier callbacks |
1022 | */ | 1015 | */ |
1023 | unregister_cpu_notifier(&palinfo_cpu_notifier); | 1016 | unregister_hotcpu_notifier(&palinfo_cpu_notifier); |
1024 | } | 1017 | } |
1025 | 1018 | ||
1026 | module_init(palinfo_init); | 1019 | module_init(palinfo_init); |
diff --git a/arch/ia64/kernel/topology.c b/arch/ia64/kernel/topology.c index b146f1cfad31..d24fa393b182 100644 --- a/arch/ia64/kernel/topology.c +++ b/arch/ia64/kernel/topology.c | |||
@@ -435,7 +435,7 @@ static int __cpuinit cache_sysfs_init(void) | |||
435 | (void *)(long)i); | 435 | (void *)(long)i); |
436 | } | 436 | } |
437 | 437 | ||
438 | register_cpu_notifier(&cache_cpu_notifier); | 438 | register_hotcpu_notifier(&cache_cpu_notifier); |
439 | 439 | ||
440 | return 0; | 440 | return 0; |
441 | } | 441 | } |
diff --git a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c index e7bbb0f40aa2..fffa9e0826bc 100644 --- a/arch/ia64/kernel/traps.c +++ b/arch/ia64/kernel/traps.c | |||
@@ -117,11 +117,8 @@ die (const char *str, struct pt_regs *regs, long err) | |||
117 | die.lock_owner = -1; | 117 | die.lock_owner = -1; |
118 | spin_unlock_irq(&die.lock); | 118 | spin_unlock_irq(&die.lock); |
119 | 119 | ||
120 | if (panic_on_oops) { | 120 | if (panic_on_oops) |
121 | printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n"); | ||
122 | ssleep(5); | ||
123 | panic("Fatal exception"); | 121 | panic("Fatal exception"); |
124 | } | ||
125 | 122 | ||
126 | do_exit(SIGSEGV); | 123 | do_exit(SIGSEGV); |
127 | } | 124 | } |
diff --git a/arch/ia64/kernel/uncached.c b/arch/ia64/kernel/uncached.c index 5f03b9e524dd..4c73a6763669 100644 --- a/arch/ia64/kernel/uncached.c +++ b/arch/ia64/kernel/uncached.c | |||
@@ -32,32 +32,38 @@ | |||
32 | 32 | ||
33 | extern void __init efi_memmap_walk_uc(efi_freemem_callback_t, void *); | 33 | extern void __init efi_memmap_walk_uc(efi_freemem_callback_t, void *); |
34 | 34 | ||
35 | #define MAX_UNCACHED_GRANULES 5 | 35 | struct uncached_pool { |
36 | static int allocated_granules; | 36 | struct gen_pool *pool; |
37 | struct mutex add_chunk_mutex; /* serialize adding a converted chunk */ | ||
38 | int nchunks_added; /* #of converted chunks added to pool */ | ||
39 | atomic_t status; /* smp called function's return status*/ | ||
40 | }; | ||
41 | |||
42 | #define MAX_CONVERTED_CHUNKS_PER_NODE 2 | ||
37 | 43 | ||
38 | struct gen_pool *uncached_pool[MAX_NUMNODES]; | 44 | struct uncached_pool uncached_pools[MAX_NUMNODES]; |
39 | 45 | ||
40 | 46 | ||
41 | static void uncached_ipi_visibility(void *data) | 47 | static void uncached_ipi_visibility(void *data) |
42 | { | 48 | { |
43 | int status; | 49 | int status; |
50 | struct uncached_pool *uc_pool = (struct uncached_pool *)data; | ||
44 | 51 | ||
45 | status = ia64_pal_prefetch_visibility(PAL_VISIBILITY_PHYSICAL); | 52 | status = ia64_pal_prefetch_visibility(PAL_VISIBILITY_PHYSICAL); |
46 | if ((status != PAL_VISIBILITY_OK) && | 53 | if ((status != PAL_VISIBILITY_OK) && |
47 | (status != PAL_VISIBILITY_OK_REMOTE_NEEDED)) | 54 | (status != PAL_VISIBILITY_OK_REMOTE_NEEDED)) |
48 | printk(KERN_DEBUG "pal_prefetch_visibility() returns %i on " | 55 | atomic_inc(&uc_pool->status); |
49 | "CPU %i\n", status, raw_smp_processor_id()); | ||
50 | } | 56 | } |
51 | 57 | ||
52 | 58 | ||
53 | static void uncached_ipi_mc_drain(void *data) | 59 | static void uncached_ipi_mc_drain(void *data) |
54 | { | 60 | { |
55 | int status; | 61 | int status; |
62 | struct uncached_pool *uc_pool = (struct uncached_pool *)data; | ||
56 | 63 | ||
57 | status = ia64_pal_mc_drain(); | 64 | status = ia64_pal_mc_drain(); |
58 | if (status) | 65 | if (status != PAL_STATUS_SUCCESS) |
59 | printk(KERN_WARNING "ia64_pal_mc_drain() failed with %i on " | 66 | atomic_inc(&uc_pool->status); |
60 | "CPU %i\n", status, raw_smp_processor_id()); | ||
61 | } | 67 | } |
62 | 68 | ||
63 | 69 | ||
@@ -70,21 +76,34 @@ static void uncached_ipi_mc_drain(void *data) | |||
70 | * This is accomplished by first allocating a granule of cached memory pages | 76 | * This is accomplished by first allocating a granule of cached memory pages |
71 | * and then converting them to uncached memory pages. | 77 | * and then converting them to uncached memory pages. |
72 | */ | 78 | */ |
73 | static int uncached_add_chunk(struct gen_pool *pool, int nid) | 79 | static int uncached_add_chunk(struct uncached_pool *uc_pool, int nid) |
74 | { | 80 | { |
75 | struct page *page; | 81 | struct page *page; |
76 | int status, i; | 82 | int status, i, nchunks_added = uc_pool->nchunks_added; |
77 | unsigned long c_addr, uc_addr; | 83 | unsigned long c_addr, uc_addr; |
78 | 84 | ||
79 | if (allocated_granules >= MAX_UNCACHED_GRANULES) | 85 | if (mutex_lock_interruptible(&uc_pool->add_chunk_mutex) != 0) |
86 | return -1; /* interrupted by a signal */ | ||
87 | |||
88 | if (uc_pool->nchunks_added > nchunks_added) { | ||
89 | /* someone added a new chunk while we were waiting */ | ||
90 | mutex_unlock(&uc_pool->add_chunk_mutex); | ||
91 | return 0; | ||
92 | } | ||
93 | |||
94 | if (uc_pool->nchunks_added >= MAX_CONVERTED_CHUNKS_PER_NODE) { | ||
95 | mutex_unlock(&uc_pool->add_chunk_mutex); | ||
80 | return -1; | 96 | return -1; |
97 | } | ||
81 | 98 | ||
82 | /* attempt to allocate a granule's worth of cached memory pages */ | 99 | /* attempt to allocate a granule's worth of cached memory pages */ |
83 | 100 | ||
84 | page = alloc_pages_node(nid, GFP_KERNEL | __GFP_ZERO, | 101 | page = alloc_pages_node(nid, GFP_KERNEL | __GFP_ZERO, |
85 | IA64_GRANULE_SHIFT-PAGE_SHIFT); | 102 | IA64_GRANULE_SHIFT-PAGE_SHIFT); |
86 | if (!page) | 103 | if (!page) { |
104 | mutex_unlock(&uc_pool->add_chunk_mutex); | ||
87 | return -1; | 105 | return -1; |
106 | } | ||
88 | 107 | ||
89 | /* convert the memory pages from cached to uncached */ | 108 | /* convert the memory pages from cached to uncached */ |
90 | 109 | ||
@@ -102,11 +121,14 @@ static int uncached_add_chunk(struct gen_pool *pool, int nid) | |||
102 | flush_tlb_kernel_range(uc_addr, uc_adddr + IA64_GRANULE_SIZE); | 121 | flush_tlb_kernel_range(uc_addr, uc_adddr + IA64_GRANULE_SIZE); |
103 | 122 | ||
104 | status = ia64_pal_prefetch_visibility(PAL_VISIBILITY_PHYSICAL); | 123 | status = ia64_pal_prefetch_visibility(PAL_VISIBILITY_PHYSICAL); |
105 | if (!status) { | 124 | if (status == PAL_VISIBILITY_OK_REMOTE_NEEDED) { |
106 | status = smp_call_function(uncached_ipi_visibility, NULL, 0, 1); | 125 | atomic_set(&uc_pool->status, 0); |
107 | if (status) | 126 | status = smp_call_function(uncached_ipi_visibility, uc_pool, |
127 | 0, 1); | ||
128 | if (status || atomic_read(&uc_pool->status)) | ||
108 | goto failed; | 129 | goto failed; |
109 | } | 130 | } else if (status != PAL_VISIBILITY_OK) |
131 | goto failed; | ||
110 | 132 | ||
111 | preempt_disable(); | 133 | preempt_disable(); |
112 | 134 | ||
@@ -120,20 +142,24 @@ static int uncached_add_chunk(struct gen_pool *pool, int nid) | |||
120 | 142 | ||
121 | preempt_enable(); | 143 | preempt_enable(); |
122 | 144 | ||
123 | ia64_pal_mc_drain(); | 145 | status = ia64_pal_mc_drain(); |
124 | status = smp_call_function(uncached_ipi_mc_drain, NULL, 0, 1); | 146 | if (status != PAL_STATUS_SUCCESS) |
125 | if (status) | 147 | goto failed; |
148 | atomic_set(&uc_pool->status, 0); | ||
149 | status = smp_call_function(uncached_ipi_mc_drain, uc_pool, 0, 1); | ||
150 | if (status || atomic_read(&uc_pool->status)) | ||
126 | goto failed; | 151 | goto failed; |
127 | 152 | ||
128 | /* | 153 | /* |
129 | * The chunk of memory pages has been converted to uncached so now we | 154 | * The chunk of memory pages has been converted to uncached so now we |
130 | * can add it to the pool. | 155 | * can add it to the pool. |
131 | */ | 156 | */ |
132 | status = gen_pool_add(pool, uc_addr, IA64_GRANULE_SIZE, nid); | 157 | status = gen_pool_add(uc_pool->pool, uc_addr, IA64_GRANULE_SIZE, nid); |
133 | if (status) | 158 | if (status) |
134 | goto failed; | 159 | goto failed; |
135 | 160 | ||
136 | allocated_granules++; | 161 | uc_pool->nchunks_added++; |
162 | mutex_unlock(&uc_pool->add_chunk_mutex); | ||
137 | return 0; | 163 | return 0; |
138 | 164 | ||
139 | /* failed to convert or add the chunk so give it back to the kernel */ | 165 | /* failed to convert or add the chunk so give it back to the kernel */ |
@@ -142,6 +168,7 @@ failed: | |||
142 | ClearPageUncached(&page[i]); | 168 | ClearPageUncached(&page[i]); |
143 | 169 | ||
144 | free_pages(c_addr, IA64_GRANULE_SHIFT-PAGE_SHIFT); | 170 | free_pages(c_addr, IA64_GRANULE_SHIFT-PAGE_SHIFT); |
171 | mutex_unlock(&uc_pool->add_chunk_mutex); | ||
145 | return -1; | 172 | return -1; |
146 | } | 173 | } |
147 | 174 | ||
@@ -158,7 +185,7 @@ failed: | |||
158 | unsigned long uncached_alloc_page(int starting_nid) | 185 | unsigned long uncached_alloc_page(int starting_nid) |
159 | { | 186 | { |
160 | unsigned long uc_addr; | 187 | unsigned long uc_addr; |
161 | struct gen_pool *pool; | 188 | struct uncached_pool *uc_pool; |
162 | int nid; | 189 | int nid; |
163 | 190 | ||
164 | if (unlikely(starting_nid >= MAX_NUMNODES)) | 191 | if (unlikely(starting_nid >= MAX_NUMNODES)) |
@@ -171,14 +198,14 @@ unsigned long uncached_alloc_page(int starting_nid) | |||
171 | do { | 198 | do { |
172 | if (!node_online(nid)) | 199 | if (!node_online(nid)) |
173 | continue; | 200 | continue; |
174 | pool = uncached_pool[nid]; | 201 | uc_pool = &uncached_pools[nid]; |
175 | if (pool == NULL) | 202 | if (uc_pool->pool == NULL) |
176 | continue; | 203 | continue; |
177 | do { | 204 | do { |
178 | uc_addr = gen_pool_alloc(pool, PAGE_SIZE); | 205 | uc_addr = gen_pool_alloc(uc_pool->pool, PAGE_SIZE); |
179 | if (uc_addr != 0) | 206 | if (uc_addr != 0) |
180 | return uc_addr; | 207 | return uc_addr; |
181 | } while (uncached_add_chunk(pool, nid) == 0); | 208 | } while (uncached_add_chunk(uc_pool, nid) == 0); |
182 | 209 | ||
183 | } while ((nid = (nid + 1) % MAX_NUMNODES) != starting_nid); | 210 | } while ((nid = (nid + 1) % MAX_NUMNODES) != starting_nid); |
184 | 211 | ||
@@ -197,7 +224,7 @@ EXPORT_SYMBOL(uncached_alloc_page); | |||
197 | void uncached_free_page(unsigned long uc_addr) | 224 | void uncached_free_page(unsigned long uc_addr) |
198 | { | 225 | { |
199 | int nid = paddr_to_nid(uc_addr - __IA64_UNCACHED_OFFSET); | 226 | int nid = paddr_to_nid(uc_addr - __IA64_UNCACHED_OFFSET); |
200 | struct gen_pool *pool = uncached_pool[nid]; | 227 | struct gen_pool *pool = uncached_pools[nid].pool; |
201 | 228 | ||
202 | if (unlikely(pool == NULL)) | 229 | if (unlikely(pool == NULL)) |
203 | return; | 230 | return; |
@@ -224,7 +251,7 @@ static int __init uncached_build_memmap(unsigned long uc_start, | |||
224 | unsigned long uc_end, void *arg) | 251 | unsigned long uc_end, void *arg) |
225 | { | 252 | { |
226 | int nid = paddr_to_nid(uc_start - __IA64_UNCACHED_OFFSET); | 253 | int nid = paddr_to_nid(uc_start - __IA64_UNCACHED_OFFSET); |
227 | struct gen_pool *pool = uncached_pool[nid]; | 254 | struct gen_pool *pool = uncached_pools[nid].pool; |
228 | size_t size = uc_end - uc_start; | 255 | size_t size = uc_end - uc_start; |
229 | 256 | ||
230 | touch_softlockup_watchdog(); | 257 | touch_softlockup_watchdog(); |
@@ -242,7 +269,8 @@ static int __init uncached_init(void) | |||
242 | int nid; | 269 | int nid; |
243 | 270 | ||
244 | for_each_online_node(nid) { | 271 | for_each_online_node(nid) { |
245 | uncached_pool[nid] = gen_pool_create(PAGE_SHIFT, nid); | 272 | uncached_pools[nid].pool = gen_pool_create(PAGE_SHIFT, nid); |
273 | mutex_init(&uncached_pools[nid].add_chunk_mutex); | ||
246 | } | 274 | } |
247 | 275 | ||
248 | efi_memmap_walk_uc(uncached_build_memmap, NULL); | 276 | efi_memmap_walk_uc(uncached_build_memmap, NULL); |
diff --git a/arch/ia64/lib/Makefile b/arch/ia64/lib/Makefile index d8536a2c22a9..38fa6e49e791 100644 --- a/arch/ia64/lib/Makefile +++ b/arch/ia64/lib/Makefile | |||
@@ -14,7 +14,7 @@ lib-y := __divsi3.o __udivsi3.o __modsi3.o __umodsi3.o \ | |||
14 | lib-$(CONFIG_ITANIUM) += copy_page.o copy_user.o memcpy.o | 14 | lib-$(CONFIG_ITANIUM) += copy_page.o copy_user.o memcpy.o |
15 | lib-$(CONFIG_MCKINLEY) += copy_page_mck.o memcpy_mck.o | 15 | lib-$(CONFIG_MCKINLEY) += copy_page_mck.o memcpy_mck.o |
16 | lib-$(CONFIG_PERFMON) += carta_random.o | 16 | lib-$(CONFIG_PERFMON) += carta_random.o |
17 | lib-$(CONFIG_MD_RAID5) += xor.o | 17 | lib-$(CONFIG_MD_RAID456) += xor.o |
18 | 18 | ||
19 | AFLAGS___divdi3.o = | 19 | AFLAGS___divdi3.o = |
20 | AFLAGS___udivdi3.o = -DUNSIGNED | 20 | AFLAGS___udivdi3.o = -DUNSIGNED |
diff --git a/arch/ia64/mm/contig.c b/arch/ia64/mm/contig.c index 2a88cdd6d924..e004143ba86b 100644 --- a/arch/ia64/mm/contig.c +++ b/arch/ia64/mm/contig.c | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | #ifdef CONFIG_VIRTUAL_MEM_MAP | 28 | #ifdef CONFIG_VIRTUAL_MEM_MAP |
29 | static unsigned long num_dma_physpages; | 29 | static unsigned long num_dma_physpages; |
30 | static unsigned long max_gap; | ||
30 | #endif | 31 | #endif |
31 | 32 | ||
32 | /** | 33 | /** |
@@ -45,9 +46,15 @@ show_mem (void) | |||
45 | 46 | ||
46 | printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); | 47 | printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); |
47 | i = max_mapnr; | 48 | i = max_mapnr; |
48 | while (i-- > 0) { | 49 | for (i = 0; i < max_mapnr; i++) { |
49 | if (!pfn_valid(i)) | 50 | if (!pfn_valid(i)) { |
51 | #ifdef CONFIG_VIRTUAL_MEM_MAP | ||
52 | if (max_gap < LARGE_GAP) | ||
53 | continue; | ||
54 | i = vmemmap_find_next_valid_pfn(0, i) - 1; | ||
55 | #endif | ||
50 | continue; | 56 | continue; |
57 | } | ||
51 | total++; | 58 | total++; |
52 | if (PageReserved(mem_map+i)) | 59 | if (PageReserved(mem_map+i)) |
53 | reserved++; | 60 | reserved++; |
@@ -234,7 +241,6 @@ paging_init (void) | |||
234 | unsigned long zones_size[MAX_NR_ZONES]; | 241 | unsigned long zones_size[MAX_NR_ZONES]; |
235 | #ifdef CONFIG_VIRTUAL_MEM_MAP | 242 | #ifdef CONFIG_VIRTUAL_MEM_MAP |
236 | unsigned long zholes_size[MAX_NR_ZONES]; | 243 | unsigned long zholes_size[MAX_NR_ZONES]; |
237 | unsigned long max_gap; | ||
238 | #endif | 244 | #endif |
239 | 245 | ||
240 | /* initialize mem_map[] */ | 246 | /* initialize mem_map[] */ |
@@ -266,7 +272,6 @@ paging_init (void) | |||
266 | } | 272 | } |
267 | } | 273 | } |
268 | 274 | ||
269 | max_gap = 0; | ||
270 | efi_memmap_walk(find_largest_hole, (u64 *)&max_gap); | 275 | efi_memmap_walk(find_largest_hole, (u64 *)&max_gap); |
271 | if (max_gap < LARGE_GAP) { | 276 | if (max_gap < LARGE_GAP) { |
272 | vmem_map = (struct page *) 0; | 277 | vmem_map = (struct page *) 0; |
@@ -277,7 +282,8 @@ paging_init (void) | |||
277 | 282 | ||
278 | /* allocate virtual_mem_map */ | 283 | /* allocate virtual_mem_map */ |
279 | 284 | ||
280 | map_size = PAGE_ALIGN(max_low_pfn * sizeof(struct page)); | 285 | map_size = PAGE_ALIGN(ALIGN(max_low_pfn, MAX_ORDER_NR_PAGES) * |
286 | sizeof(struct page)); | ||
281 | vmalloc_end -= map_size; | 287 | vmalloc_end -= map_size; |
282 | vmem_map = (struct page *) vmalloc_end; | 288 | vmem_map = (struct page *) vmalloc_end; |
283 | efi_memmap_walk(create_mem_map_page_table, NULL); | 289 | efi_memmap_walk(create_mem_map_page_table, NULL); |
diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c index 99bd9e30db96..d260bffa01ab 100644 --- a/arch/ia64/mm/discontig.c +++ b/arch/ia64/mm/discontig.c | |||
@@ -534,68 +534,6 @@ void __cpuinit *per_cpu_init(void) | |||
534 | } | 534 | } |
535 | #endif /* CONFIG_SMP */ | 535 | #endif /* CONFIG_SMP */ |
536 | 536 | ||
537 | #ifdef CONFIG_VIRTUAL_MEM_MAP | ||
538 | static inline int find_next_valid_pfn_for_pgdat(pg_data_t *pgdat, int i) | ||
539 | { | ||
540 | unsigned long end_address, hole_next_pfn; | ||
541 | unsigned long stop_address; | ||
542 | |||
543 | end_address = (unsigned long) &vmem_map[pgdat->node_start_pfn + i]; | ||
544 | end_address = PAGE_ALIGN(end_address); | ||
545 | |||
546 | stop_address = (unsigned long) &vmem_map[ | ||
547 | pgdat->node_start_pfn + pgdat->node_spanned_pages]; | ||
548 | |||
549 | do { | ||
550 | pgd_t *pgd; | ||
551 | pud_t *pud; | ||
552 | pmd_t *pmd; | ||
553 | pte_t *pte; | ||
554 | |||
555 | pgd = pgd_offset_k(end_address); | ||
556 | if (pgd_none(*pgd)) { | ||
557 | end_address += PGDIR_SIZE; | ||
558 | continue; | ||
559 | } | ||
560 | |||
561 | pud = pud_offset(pgd, end_address); | ||
562 | if (pud_none(*pud)) { | ||
563 | end_address += PUD_SIZE; | ||
564 | continue; | ||
565 | } | ||
566 | |||
567 | pmd = pmd_offset(pud, end_address); | ||
568 | if (pmd_none(*pmd)) { | ||
569 | end_address += PMD_SIZE; | ||
570 | continue; | ||
571 | } | ||
572 | |||
573 | pte = pte_offset_kernel(pmd, end_address); | ||
574 | retry_pte: | ||
575 | if (pte_none(*pte)) { | ||
576 | end_address += PAGE_SIZE; | ||
577 | pte++; | ||
578 | if ((end_address < stop_address) && | ||
579 | (end_address != ALIGN(end_address, 1UL << PMD_SHIFT))) | ||
580 | goto retry_pte; | ||
581 | continue; | ||
582 | } | ||
583 | /* Found next valid vmem_map page */ | ||
584 | break; | ||
585 | } while (end_address < stop_address); | ||
586 | |||
587 | end_address = min(end_address, stop_address); | ||
588 | end_address = end_address - (unsigned long) vmem_map + sizeof(struct page) - 1; | ||
589 | hole_next_pfn = end_address / sizeof(struct page); | ||
590 | return hole_next_pfn - pgdat->node_start_pfn; | ||
591 | } | ||
592 | #else | ||
593 | static inline int find_next_valid_pfn_for_pgdat(pg_data_t *pgdat, int i) | ||
594 | { | ||
595 | return i + 1; | ||
596 | } | ||
597 | #endif | ||
598 | |||
599 | /** | 537 | /** |
600 | * show_mem - give short summary of memory stats | 538 | * show_mem - give short summary of memory stats |
601 | * | 539 | * |
@@ -625,7 +563,8 @@ void show_mem(void) | |||
625 | if (pfn_valid(pgdat->node_start_pfn + i)) | 563 | if (pfn_valid(pgdat->node_start_pfn + i)) |
626 | page = pfn_to_page(pgdat->node_start_pfn + i); | 564 | page = pfn_to_page(pgdat->node_start_pfn + i); |
627 | else { | 565 | else { |
628 | i = find_next_valid_pfn_for_pgdat(pgdat, i) - 1; | 566 | i = vmemmap_find_next_valid_pfn(pgdat->node_id, |
567 | i) - 1; | ||
629 | continue; | 568 | continue; |
630 | } | 569 | } |
631 | if (PageReserved(page)) | 570 | if (PageReserved(page)) |
@@ -751,7 +690,8 @@ void __init paging_init(void) | |||
751 | efi_memmap_walk(filter_rsvd_memory, count_node_pages); | 690 | efi_memmap_walk(filter_rsvd_memory, count_node_pages); |
752 | 691 | ||
753 | #ifdef CONFIG_VIRTUAL_MEM_MAP | 692 | #ifdef CONFIG_VIRTUAL_MEM_MAP |
754 | vmalloc_end -= PAGE_ALIGN(max_low_pfn * sizeof(struct page)); | 693 | vmalloc_end -= PAGE_ALIGN(ALIGN(max_low_pfn, MAX_ORDER_NR_PAGES) * |
694 | sizeof(struct page)); | ||
755 | vmem_map = (struct page *) vmalloc_end; | 695 | vmem_map = (struct page *) vmalloc_end; |
756 | efi_memmap_walk(create_mem_map_page_table, NULL); | 696 | efi_memmap_walk(create_mem_map_page_table, NULL); |
757 | printk("Virtual mem_map starts at 0x%p\n", vmem_map); | 697 | printk("Virtual mem_map starts at 0x%p\n", vmem_map); |
diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index 2f50c064513c..30617ccb4f7e 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c | |||
@@ -415,6 +415,61 @@ ia64_mmu_init (void *my_cpu_data) | |||
415 | } | 415 | } |
416 | 416 | ||
417 | #ifdef CONFIG_VIRTUAL_MEM_MAP | 417 | #ifdef CONFIG_VIRTUAL_MEM_MAP |
418 | int vmemmap_find_next_valid_pfn(int node, int i) | ||
419 | { | ||
420 | unsigned long end_address, hole_next_pfn; | ||
421 | unsigned long stop_address; | ||
422 | pg_data_t *pgdat = NODE_DATA(node); | ||
423 | |||
424 | end_address = (unsigned long) &vmem_map[pgdat->node_start_pfn + i]; | ||
425 | end_address = PAGE_ALIGN(end_address); | ||
426 | |||
427 | stop_address = (unsigned long) &vmem_map[ | ||
428 | pgdat->node_start_pfn + pgdat->node_spanned_pages]; | ||
429 | |||
430 | do { | ||
431 | pgd_t *pgd; | ||
432 | pud_t *pud; | ||
433 | pmd_t *pmd; | ||
434 | pte_t *pte; | ||
435 | |||
436 | pgd = pgd_offset_k(end_address); | ||
437 | if (pgd_none(*pgd)) { | ||
438 | end_address += PGDIR_SIZE; | ||
439 | continue; | ||
440 | } | ||
441 | |||
442 | pud = pud_offset(pgd, end_address); | ||
443 | if (pud_none(*pud)) { | ||
444 | end_address += PUD_SIZE; | ||
445 | continue; | ||
446 | } | ||
447 | |||
448 | pmd = pmd_offset(pud, end_address); | ||
449 | if (pmd_none(*pmd)) { | ||
450 | end_address += PMD_SIZE; | ||
451 | continue; | ||
452 | } | ||
453 | |||
454 | pte = pte_offset_kernel(pmd, end_address); | ||
455 | retry_pte: | ||
456 | if (pte_none(*pte)) { | ||
457 | end_address += PAGE_SIZE; | ||
458 | pte++; | ||
459 | if ((end_address < stop_address) && | ||
460 | (end_address != ALIGN(end_address, 1UL << PMD_SHIFT))) | ||
461 | goto retry_pte; | ||
462 | continue; | ||
463 | } | ||
464 | /* Found next valid vmem_map page */ | ||
465 | break; | ||
466 | } while (end_address < stop_address); | ||
467 | |||
468 | end_address = min(end_address, stop_address); | ||
469 | end_address = end_address - (unsigned long) vmem_map + sizeof(struct page) - 1; | ||
470 | hole_next_pfn = end_address / sizeof(struct page); | ||
471 | return hole_next_pfn - pgdat->node_start_pfn; | ||
472 | } | ||
418 | 473 | ||
419 | int __init | 474 | int __init |
420 | create_mem_map_page_table (u64 start, u64 end, void *arg) | 475 | create_mem_map_page_table (u64 start, u64 end, void *arg) |
diff --git a/arch/ia64/mm/ioremap.c b/arch/ia64/mm/ioremap.c index 07bd02b6c372..4280c074d64e 100644 --- a/arch/ia64/mm/ioremap.c +++ b/arch/ia64/mm/ioremap.c | |||
@@ -32,7 +32,7 @@ ioremap (unsigned long offset, unsigned long size) | |||
32 | */ | 32 | */ |
33 | attr = kern_mem_attribute(offset, size); | 33 | attr = kern_mem_attribute(offset, size); |
34 | if (attr & EFI_MEMORY_WB) | 34 | if (attr & EFI_MEMORY_WB) |
35 | return phys_to_virt(offset); | 35 | return (void __iomem *) phys_to_virt(offset); |
36 | else if (attr & EFI_MEMORY_UC) | 36 | else if (attr & EFI_MEMORY_UC) |
37 | return __ioremap(offset, size); | 37 | return __ioremap(offset, size); |
38 | 38 | ||
@@ -43,7 +43,7 @@ ioremap (unsigned long offset, unsigned long size) | |||
43 | gran_base = GRANULEROUNDDOWN(offset); | 43 | gran_base = GRANULEROUNDDOWN(offset); |
44 | gran_size = GRANULEROUNDUP(offset + size) - gran_base; | 44 | gran_size = GRANULEROUNDUP(offset + size) - gran_base; |
45 | if (efi_mem_attribute(gran_base, gran_size) & EFI_MEMORY_WB) | 45 | if (efi_mem_attribute(gran_base, gran_size) & EFI_MEMORY_WB) |
46 | return phys_to_virt(offset); | 46 | return (void __iomem *) phys_to_virt(offset); |
47 | 47 | ||
48 | return __ioremap(offset, size); | 48 | return __ioremap(offset, size); |
49 | } | 49 | } |
@@ -53,7 +53,7 @@ void __iomem * | |||
53 | ioremap_nocache (unsigned long offset, unsigned long size) | 53 | ioremap_nocache (unsigned long offset, unsigned long size) |
54 | { | 54 | { |
55 | if (kern_mem_attribute(offset, size) & EFI_MEMORY_WB) | 55 | if (kern_mem_attribute(offset, size) & EFI_MEMORY_WB) |
56 | return 0; | 56 | return NULL; |
57 | 57 | ||
58 | return __ioremap(offset, size); | 58 | return __ioremap(offset, size); |
59 | } | 59 | } |
diff --git a/arch/ia64/sn/kernel/xpc_main.c b/arch/ia64/sn/kernel/xpc_main.c index 99b123a6421a..5e8e59efb347 100644 --- a/arch/ia64/sn/kernel/xpc_main.c +++ b/arch/ia64/sn/kernel/xpc_main.c | |||
@@ -480,7 +480,7 @@ xpc_activating(void *__partid) | |||
480 | partid_t partid = (u64) __partid; | 480 | partid_t partid = (u64) __partid; |
481 | struct xpc_partition *part = &xpc_partitions[partid]; | 481 | struct xpc_partition *part = &xpc_partitions[partid]; |
482 | unsigned long irq_flags; | 482 | unsigned long irq_flags; |
483 | struct sched_param param = { sched_priority: MAX_RT_PRIO - 1 }; | 483 | struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 }; |
484 | int ret; | 484 | int ret; |
485 | 485 | ||
486 | 486 | ||
diff --git a/arch/ia64/sn/pci/tioce_provider.c b/arch/ia64/sn/pci/tioce_provider.c index 17cd34284886..af7171adcd2c 100644 --- a/arch/ia64/sn/pci/tioce_provider.c +++ b/arch/ia64/sn/pci/tioce_provider.c | |||
@@ -74,7 +74,7 @@ tioce_mmr_war_pre(struct tioce_kernel *kern, void *mmr_addr) | |||
74 | else | 74 | else |
75 | mmr_war_offset = 0x158; | 75 | mmr_war_offset = 0x158; |
76 | 76 | ||
77 | readq_relaxed((void *)(mmr_base + mmr_war_offset)); | 77 | readq_relaxed((void __iomem *)(mmr_base + mmr_war_offset)); |
78 | } | 78 | } |
79 | } | 79 | } |
80 | 80 | ||
@@ -92,8 +92,8 @@ tioce_mmr_war_post(struct tioce_kernel *kern, void *mmr_addr) | |||
92 | 92 | ||
93 | if (mmr_offset < 0x45000) { | 93 | if (mmr_offset < 0x45000) { |
94 | if (mmr_offset == 0x100) | 94 | if (mmr_offset == 0x100) |
95 | readq_relaxed((void *)(mmr_base + 0x38)); | 95 | readq_relaxed((void __iomem *)(mmr_base + 0x38)); |
96 | readq_relaxed((void *)(mmr_base + 0xb050)); | 96 | readq_relaxed((void __iomem *)(mmr_base + 0xb050)); |
97 | } | 97 | } |
98 | } | 98 | } |
99 | 99 | ||
diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index 9989495a51dd..b3677fc8eef5 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S | |||
@@ -204,6 +204,7 @@ SECTIONS | |||
204 | *(.dynstr) | 204 | *(.dynstr) |
205 | *(.dynamic) | 205 | *(.dynamic) |
206 | *(.hash) | 206 | *(.hash) |
207 | *(.gnu.hash) | ||
207 | #endif | 208 | #endif |
208 | } | 209 | } |
209 | 210 | ||
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 2643dbc3f289..abb325eb8f75 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -504,7 +504,7 @@ config CPU_FREQ_PMAC | |||
504 | 504 | ||
505 | config CPU_FREQ_PMAC64 | 505 | config CPU_FREQ_PMAC64 |
506 | bool "Support for some Apple G5s" | 506 | bool "Support for some Apple G5s" |
507 | depends on CPU_FREQ && PMAC_SMU && PPC64 | 507 | depends on CPU_FREQ && PPC64 |
508 | select CPU_FREQ_TABLE | 508 | select CPU_FREQ_TABLE |
509 | help | 509 | help |
510 | This adds support for frequency switching on Apple iMac G5, | 510 | This adds support for frequency switching on Apple iMac G5, |
@@ -836,9 +836,10 @@ config MCA | |||
836 | bool | 836 | bool |
837 | 837 | ||
838 | config PCI | 838 | config PCI |
839 | bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) \ | 839 | bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx \ |
840 | || MPC7448HPC2 | 840 | || PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) || MPC7448HPC2 |
841 | default y if !40x && !CPM2 && !8xx && !APUS && !PPC_83xx && !PPC_85xx && !PPC_86xx | 841 | default y if !40x && !CPM2 && !8xx && !APUS && !PPC_83xx \ |
842 | && !PPC_85xx && !PPC_86xx | ||
842 | default PCI_PERMEDIA if !4xx && !CPM2 && !8xx && APUS | 843 | default PCI_PERMEDIA if !4xx && !CPM2 && !8xx && APUS |
843 | default PCI_QSPAN if !4xx && !CPM2 && 8xx | 844 | default PCI_QSPAN if !4xx && !CPM2 && 8xx |
844 | help | 845 | help |
diff --git a/arch/powerpc/boot/dts/mpc8641_hpcn.dts b/arch/powerpc/boot/dts/mpc8641_hpcn.dts new file mode 100644 index 000000000000..f0c7731743ea --- /dev/null +++ b/arch/powerpc/boot/dts/mpc8641_hpcn.dts | |||
@@ -0,0 +1,339 @@ | |||
1 | /* | ||
2 | * MPC8641 HPCN Device Tree Source | ||
3 | * | ||
4 | * Copyright 2006 Freescale Semiconductor Inc. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the | ||
8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
9 | * option) any later version. | ||
10 | */ | ||
11 | |||
12 | |||
13 | / { | ||
14 | model = "MPC8641HPCN"; | ||
15 | compatible = "mpc86xx"; | ||
16 | #address-cells = <1>; | ||
17 | #size-cells = <1>; | ||
18 | |||
19 | cpus { | ||
20 | #cpus = <2>; | ||
21 | #address-cells = <1>; | ||
22 | #size-cells = <0>; | ||
23 | |||
24 | PowerPC,8641@0 { | ||
25 | device_type = "cpu"; | ||
26 | reg = <0>; | ||
27 | d-cache-line-size = <20>; // 32 bytes | ||
28 | i-cache-line-size = <20>; // 32 bytes | ||
29 | d-cache-size = <8000>; // L1, 32K | ||
30 | i-cache-size = <8000>; // L1, 32K | ||
31 | timebase-frequency = <0>; // 33 MHz, from uboot | ||
32 | bus-frequency = <0>; // From uboot | ||
33 | clock-frequency = <0>; // From uboot | ||
34 | 32-bit; | ||
35 | linux,boot-cpu; | ||
36 | }; | ||
37 | PowerPC,8641@1 { | ||
38 | device_type = "cpu"; | ||
39 | reg = <1>; | ||
40 | d-cache-line-size = <20>; // 32 bytes | ||
41 | i-cache-line-size = <20>; // 32 bytes | ||
42 | d-cache-size = <8000>; // L1, 32K | ||
43 | i-cache-size = <8000>; // L1, 32K | ||
44 | timebase-frequency = <0>; // 33 MHz, from uboot | ||
45 | bus-frequency = <0>; // From uboot | ||
46 | clock-frequency = <0>; // From uboot | ||
47 | 32-bit; | ||
48 | }; | ||
49 | }; | ||
50 | |||
51 | memory { | ||
52 | device_type = "memory"; | ||
53 | reg = <00000000 40000000>; // 1G at 0x0 | ||
54 | }; | ||
55 | |||
56 | soc8641@f8000000 { | ||
57 | #address-cells = <1>; | ||
58 | #size-cells = <1>; | ||
59 | #interrupt-cells = <2>; | ||
60 | device_type = "soc"; | ||
61 | ranges = <0 f8000000 00100000>; | ||
62 | reg = <f8000000 00100000>; // CCSRBAR 1M | ||
63 | bus-frequency = <0>; | ||
64 | |||
65 | i2c@3000 { | ||
66 | device_type = "i2c"; | ||
67 | compatible = "fsl-i2c"; | ||
68 | reg = <3000 100>; | ||
69 | interrupts = <2b 2>; | ||
70 | interrupt-parent = <40000>; | ||
71 | dfsrr; | ||
72 | }; | ||
73 | |||
74 | i2c@3100 { | ||
75 | device_type = "i2c"; | ||
76 | compatible = "fsl-i2c"; | ||
77 | reg = <3100 100>; | ||
78 | interrupts = <2b 2>; | ||
79 | interrupt-parent = <40000>; | ||
80 | dfsrr; | ||
81 | }; | ||
82 | |||
83 | mdio@24520 { | ||
84 | #address-cells = <1>; | ||
85 | #size-cells = <0>; | ||
86 | device_type = "mdio"; | ||
87 | compatible = "gianfar"; | ||
88 | reg = <24520 20>; | ||
89 | linux,phandle = <24520>; | ||
90 | ethernet-phy@0 { | ||
91 | linux,phandle = <2452000>; | ||
92 | interrupt-parent = <40000>; | ||
93 | interrupts = <4a 1>; | ||
94 | reg = <0>; | ||
95 | device_type = "ethernet-phy"; | ||
96 | }; | ||
97 | ethernet-phy@1 { | ||
98 | linux,phandle = <2452001>; | ||
99 | interrupt-parent = <40000>; | ||
100 | interrupts = <4a 1>; | ||
101 | reg = <1>; | ||
102 | device_type = "ethernet-phy"; | ||
103 | }; | ||
104 | ethernet-phy@2 { | ||
105 | linux,phandle = <2452002>; | ||
106 | interrupt-parent = <40000>; | ||
107 | interrupts = <4a 1>; | ||
108 | reg = <2>; | ||
109 | device_type = "ethernet-phy"; | ||
110 | }; | ||
111 | ethernet-phy@3 { | ||
112 | linux,phandle = <2452003>; | ||
113 | interrupt-parent = <40000>; | ||
114 | interrupts = <4a 1>; | ||
115 | reg = <3>; | ||
116 | device_type = "ethernet-phy"; | ||
117 | }; | ||
118 | }; | ||
119 | |||
120 | ethernet@24000 { | ||
121 | #address-cells = <1>; | ||
122 | #size-cells = <0>; | ||
123 | device_type = "network"; | ||
124 | model = "TSEC"; | ||
125 | compatible = "gianfar"; | ||
126 | reg = <24000 1000>; | ||
127 | mac-address = [ 00 E0 0C 00 73 00 ]; | ||
128 | interrupts = <1d 2 1e 2 22 2>; | ||
129 | interrupt-parent = <40000>; | ||
130 | phy-handle = <2452000>; | ||
131 | }; | ||
132 | |||
133 | ethernet@25000 { | ||
134 | #address-cells = <1>; | ||
135 | #size-cells = <0>; | ||
136 | device_type = "network"; | ||
137 | model = "TSEC"; | ||
138 | compatible = "gianfar"; | ||
139 | reg = <25000 1000>; | ||
140 | mac-address = [ 00 E0 0C 00 73 01 ]; | ||
141 | interrupts = <23 2 24 2 28 2>; | ||
142 | interrupt-parent = <40000>; | ||
143 | phy-handle = <2452001>; | ||
144 | }; | ||
145 | |||
146 | ethernet@26000 { | ||
147 | #address-cells = <1>; | ||
148 | #size-cells = <0>; | ||
149 | device_type = "network"; | ||
150 | model = "TSEC"; | ||
151 | compatible = "gianfar"; | ||
152 | reg = <26000 1000>; | ||
153 | mac-address = [ 00 E0 0C 00 02 FD ]; | ||
154 | interrupts = <1F 2 20 2 21 2>; | ||
155 | interrupt-parent = <40000>; | ||
156 | phy-handle = <2452002>; | ||
157 | }; | ||
158 | |||
159 | ethernet@27000 { | ||
160 | #address-cells = <1>; | ||
161 | #size-cells = <0>; | ||
162 | device_type = "network"; | ||
163 | model = "TSEC"; | ||
164 | compatible = "gianfar"; | ||
165 | reg = <27000 1000>; | ||
166 | mac-address = [ 00 E0 0C 00 03 FD ]; | ||
167 | interrupts = <25 2 26 2 27 2>; | ||
168 | interrupt-parent = <40000>; | ||
169 | phy-handle = <2452003>; | ||
170 | }; | ||
171 | serial@4500 { | ||
172 | device_type = "serial"; | ||
173 | compatible = "ns16550"; | ||
174 | reg = <4500 100>; | ||
175 | clock-frequency = <0>; | ||
176 | interrupts = <2a 2>; | ||
177 | interrupt-parent = <40000>; | ||
178 | }; | ||
179 | |||
180 | serial@4600 { | ||
181 | device_type = "serial"; | ||
182 | compatible = "ns16550"; | ||
183 | reg = <4600 100>; | ||
184 | clock-frequency = <0>; | ||
185 | interrupts = <1c 2>; | ||
186 | interrupt-parent = <40000>; | ||
187 | }; | ||
188 | |||
189 | pci@8000 { | ||
190 | compatible = "86xx"; | ||
191 | device_type = "pci"; | ||
192 | #interrupt-cells = <1>; | ||
193 | #size-cells = <2>; | ||
194 | #address-cells = <3>; | ||
195 | reg = <8000 1000>; | ||
196 | bus-range = <0 fe>; | ||
197 | ranges = <02000000 0 80000000 80000000 0 20000000 | ||
198 | 01000000 0 00000000 e2000000 0 00100000>; | ||
199 | clock-frequency = <1fca055>; | ||
200 | interrupt-parent = <40000>; | ||
201 | interrupts = <18 2>; | ||
202 | interrupt-map-mask = <f800 0 0 7>; | ||
203 | interrupt-map = < | ||
204 | /* IDSEL 0x11 */ | ||
205 | 8800 0 0 1 4d0 3 2 | ||
206 | 8800 0 0 2 4d0 4 2 | ||
207 | 8800 0 0 3 4d0 5 2 | ||
208 | 8800 0 0 4 4d0 6 2 | ||
209 | |||
210 | /* IDSEL 0x12 */ | ||
211 | 9000 0 0 1 4d0 4 2 | ||
212 | 9000 0 0 2 4d0 5 2 | ||
213 | 9000 0 0 3 4d0 6 2 | ||
214 | 9000 0 0 4 4d0 3 2 | ||
215 | |||
216 | /* IDSEL 0x13 */ | ||
217 | 9800 0 0 1 4d0 0 0 | ||
218 | 9800 0 0 2 4d0 0 0 | ||
219 | 9800 0 0 3 4d0 0 0 | ||
220 | 9800 0 0 4 4d0 0 0 | ||
221 | |||
222 | /* IDSEL 0x14 */ | ||
223 | a000 0 0 1 4d0 0 0 | ||
224 | a000 0 0 2 4d0 0 0 | ||
225 | a000 0 0 3 4d0 0 0 | ||
226 | a000 0 0 4 4d0 0 0 | ||
227 | |||
228 | /* IDSEL 0x15 */ | ||
229 | a800 0 0 1 4d0 0 0 | ||
230 | a800 0 0 2 4d0 0 0 | ||
231 | a800 0 0 3 4d0 0 0 | ||
232 | a800 0 0 4 4d0 0 0 | ||
233 | |||
234 | /* IDSEL 0x16 */ | ||
235 | b000 0 0 1 4d0 0 0 | ||
236 | b000 0 0 2 4d0 0 0 | ||
237 | b000 0 0 3 4d0 0 0 | ||
238 | b000 0 0 4 4d0 0 0 | ||
239 | |||
240 | /* IDSEL 0x17 */ | ||
241 | b800 0 0 1 4d0 0 0 | ||
242 | b800 0 0 2 4d0 0 0 | ||
243 | b800 0 0 3 4d0 0 0 | ||
244 | b800 0 0 4 4d0 0 0 | ||
245 | |||
246 | /* IDSEL 0x18 */ | ||
247 | c000 0 0 1 4d0 0 0 | ||
248 | c000 0 0 2 4d0 0 0 | ||
249 | c000 0 0 3 4d0 0 0 | ||
250 | c000 0 0 4 4d0 0 0 | ||
251 | |||
252 | /* IDSEL 0x19 */ | ||
253 | c800 0 0 1 4d0 0 0 | ||
254 | c800 0 0 2 4d0 0 0 | ||
255 | c800 0 0 3 4d0 0 0 | ||
256 | c800 0 0 4 4d0 0 0 | ||
257 | |||
258 | /* IDSEL 0x1a */ | ||
259 | d000 0 0 1 4d0 6 2 | ||
260 | d000 0 0 2 4d0 3 2 | ||
261 | d000 0 0 3 4d0 4 2 | ||
262 | d000 0 0 4 4d0 5 2 | ||
263 | |||
264 | |||
265 | /* IDSEL 0x1b */ | ||
266 | d800 0 0 1 4d0 5 2 | ||
267 | d800 0 0 2 4d0 0 0 | ||
268 | d800 0 0 3 4d0 0 0 | ||
269 | d800 0 0 4 4d0 0 0 | ||
270 | |||
271 | /* IDSEL 0x1c */ | ||
272 | e000 0 0 1 4d0 9 2 | ||
273 | e000 0 0 2 4d0 a 2 | ||
274 | e000 0 0 3 4d0 c 2 | ||
275 | e000 0 0 4 4d0 7 2 | ||
276 | |||
277 | /* IDSEL 0x1d */ | ||
278 | e800 0 0 1 4d0 9 2 | ||
279 | e800 0 0 2 4d0 a 2 | ||
280 | e800 0 0 3 4d0 b 2 | ||
281 | e800 0 0 4 4d0 0 0 | ||
282 | |||
283 | /* IDSEL 0x1e */ | ||
284 | f000 0 0 1 4d0 c 2 | ||
285 | f000 0 0 2 4d0 0 0 | ||
286 | f000 0 0 3 4d0 0 0 | ||
287 | f000 0 0 4 4d0 0 0 | ||
288 | |||
289 | /* IDSEL 0x1f */ | ||
290 | f800 0 0 1 4d0 6 2 | ||
291 | f800 0 0 2 4d0 0 0 | ||
292 | f800 0 0 3 4d0 0 0 | ||
293 | f800 0 0 4 4d0 0 0 | ||
294 | >; | ||
295 | i8259@4d0 { | ||
296 | linux,phandle = <4d0>; | ||
297 | clock-frequency = <0>; | ||
298 | interrupt-controller; | ||
299 | device_type = "interrupt-controller"; | ||
300 | #address-cells = <0>; | ||
301 | #interrupt-cells = <2>; | ||
302 | built-in; | ||
303 | compatible = "chrp,iic"; | ||
304 | big-endian; | ||
305 | interrupts = <49 2>; | ||
306 | interrupt-parent = <40000>; | ||
307 | }; | ||
308 | |||
309 | }; | ||
310 | pic@40000 { | ||
311 | linux,phandle = <40000>; | ||
312 | clock-frequency = <0>; | ||
313 | interrupt-controller; | ||
314 | #address-cells = <0>; | ||
315 | #interrupt-cells = <2>; | ||
316 | reg = <40000 40000>; | ||
317 | built-in; | ||
318 | compatible = "chrp,open-pic"; | ||
319 | device_type = "open-pic"; | ||
320 | big-endian; | ||
321 | interrupts = < | ||
322 | 10 2 11 2 12 2 13 2 | ||
323 | 14 2 15 2 16 2 17 2 | ||
324 | 18 2 19 2 1a 2 1b 2 | ||
325 | 1c 2 1d 2 1e 2 1f 2 | ||
326 | 20 2 21 2 22 2 23 2 | ||
327 | 24 2 25 2 26 2 27 2 | ||
328 | 28 2 29 2 2a 2 2b 2 | ||
329 | 2c 2 2d 2 2e 2 2f 2 | ||
330 | 30 2 31 2 32 2 33 2 | ||
331 | 34 2 35 2 36 2 37 2 | ||
332 | 38 2 39 2 2a 2 3b 2 | ||
333 | 3c 2 3d 2 3e 2 3f 2 | ||
334 | 48 1 49 2 4a 1 | ||
335 | >; | ||
336 | interrupt-parent = <40000>; | ||
337 | }; | ||
338 | }; | ||
339 | }; | ||
diff --git a/arch/powerpc/configs/g5_defconfig b/arch/powerpc/configs/g5_defconfig index a45627547d03..8c6bd17c6929 100644 --- a/arch/powerpc/configs/g5_defconfig +++ b/arch/powerpc/configs/g5_defconfig | |||
@@ -1,16 +1,18 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.17-rc1 | 3 | # Linux kernel version: 2.6.18-rc3 |
4 | # Wed Apr 19 13:24:37 2006 | 4 | # Tue Aug 8 09:12:29 2006 |
5 | # | 5 | # |
6 | CONFIG_PPC64=y | 6 | CONFIG_PPC64=y |
7 | CONFIG_64BIT=y | 7 | CONFIG_64BIT=y |
8 | CONFIG_PPC_MERGE=y | 8 | CONFIG_PPC_MERGE=y |
9 | CONFIG_MMU=y | 9 | CONFIG_MMU=y |
10 | CONFIG_GENERIC_HARDIRQS=y | 10 | CONFIG_GENERIC_HARDIRQS=y |
11 | CONFIG_IRQ_PER_CPU=y | ||
11 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 12 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
12 | CONFIG_GENERIC_HWEIGHT=y | 13 | CONFIG_GENERIC_HWEIGHT=y |
13 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 14 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
15 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
14 | CONFIG_PPC=y | 16 | CONFIG_PPC=y |
15 | CONFIG_EARLY_PRINTK=y | 17 | CONFIG_EARLY_PRINTK=y |
16 | CONFIG_COMPAT=y | 18 | CONFIG_COMPAT=y |
@@ -33,6 +35,7 @@ CONFIG_PPC_STD_MMU=y | |||
33 | CONFIG_VIRT_CPU_ACCOUNTING=y | 35 | CONFIG_VIRT_CPU_ACCOUNTING=y |
34 | CONFIG_SMP=y | 36 | CONFIG_SMP=y |
35 | CONFIG_NR_CPUS=4 | 37 | CONFIG_NR_CPUS=4 |
38 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
36 | 39 | ||
37 | # | 40 | # |
38 | # Code maturity level options | 41 | # Code maturity level options |
@@ -50,6 +53,7 @@ CONFIG_SWAP=y | |||
50 | CONFIG_SYSVIPC=y | 53 | CONFIG_SYSVIPC=y |
51 | CONFIG_POSIX_MQUEUE=y | 54 | CONFIG_POSIX_MQUEUE=y |
52 | # CONFIG_BSD_PROCESS_ACCT is not set | 55 | # CONFIG_BSD_PROCESS_ACCT is not set |
56 | # CONFIG_TASKSTATS is not set | ||
53 | CONFIG_SYSCTL=y | 57 | CONFIG_SYSCTL=y |
54 | # CONFIG_AUDIT is not set | 58 | # CONFIG_AUDIT is not set |
55 | CONFIG_IKCONFIG=y | 59 | CONFIG_IKCONFIG=y |
@@ -67,10 +71,12 @@ CONFIG_PRINTK=y | |||
67 | CONFIG_BUG=y | 71 | CONFIG_BUG=y |
68 | CONFIG_ELF_CORE=y | 72 | CONFIG_ELF_CORE=y |
69 | CONFIG_BASE_FULL=y | 73 | CONFIG_BASE_FULL=y |
74 | CONFIG_RT_MUTEXES=y | ||
70 | CONFIG_FUTEX=y | 75 | CONFIG_FUTEX=y |
71 | CONFIG_EPOLL=y | 76 | CONFIG_EPOLL=y |
72 | CONFIG_SHMEM=y | 77 | CONFIG_SHMEM=y |
73 | CONFIG_SLAB=y | 78 | CONFIG_SLAB=y |
79 | CONFIG_VM_EVENT_COUNTERS=y | ||
74 | # CONFIG_TINY_SHMEM is not set | 80 | # CONFIG_TINY_SHMEM is not set |
75 | CONFIG_BASE_SMALL=0 | 81 | CONFIG_BASE_SMALL=0 |
76 | # CONFIG_SLOB is not set | 82 | # CONFIG_SLOB is not set |
@@ -116,12 +122,16 @@ CONFIG_PPC_PMAC=y | |||
116 | CONFIG_PPC_PMAC64=y | 122 | CONFIG_PPC_PMAC64=y |
117 | # CONFIG_PPC_MAPLE is not set | 123 | # CONFIG_PPC_MAPLE is not set |
118 | # CONFIG_PPC_CELL is not set | 124 | # CONFIG_PPC_CELL is not set |
125 | # CONFIG_PPC_CELL_NATIVE is not set | ||
126 | # CONFIG_PPC_IBM_CELL_BLADE is not set | ||
127 | # CONFIG_UDBG_RTAS_CONSOLE is not set | ||
119 | CONFIG_U3_DART=y | 128 | CONFIG_U3_DART=y |
120 | CONFIG_MPIC=y | 129 | CONFIG_MPIC=y |
121 | # CONFIG_PPC_RTAS is not set | 130 | # CONFIG_PPC_RTAS is not set |
122 | # CONFIG_MMIO_NVRAM is not set | 131 | # CONFIG_MMIO_NVRAM is not set |
123 | CONFIG_MPIC_BROKEN_U3=y | 132 | CONFIG_MPIC_BROKEN_U3=y |
124 | # CONFIG_PPC_MPC106 is not set | 133 | # CONFIG_PPC_MPC106 is not set |
134 | CONFIG_PPC_970_NAP=y | ||
125 | CONFIG_CPU_FREQ=y | 135 | CONFIG_CPU_FREQ=y |
126 | CONFIG_CPU_FREQ_TABLE=y | 136 | CONFIG_CPU_FREQ_TABLE=y |
127 | # CONFIG_CPU_FREQ_DEBUG is not set | 137 | # CONFIG_CPU_FREQ_DEBUG is not set |
@@ -153,6 +163,7 @@ CONFIG_BINFMT_ELF=y | |||
153 | CONFIG_FORCE_MAX_ZONEORDER=13 | 163 | CONFIG_FORCE_MAX_ZONEORDER=13 |
154 | CONFIG_IOMMU_VMERGE=y | 164 | CONFIG_IOMMU_VMERGE=y |
155 | # CONFIG_HOTPLUG_CPU is not set | 165 | # CONFIG_HOTPLUG_CPU is not set |
166 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
156 | CONFIG_KEXEC=y | 167 | CONFIG_KEXEC=y |
157 | # CONFIG_CRASH_DUMP is not set | 168 | # CONFIG_CRASH_DUMP is not set |
158 | CONFIG_IRQ_ALL_CPUS=y | 169 | CONFIG_IRQ_ALL_CPUS=y |
@@ -168,6 +179,7 @@ CONFIG_FLATMEM=y | |||
168 | CONFIG_FLAT_NODE_MEM_MAP=y | 179 | CONFIG_FLAT_NODE_MEM_MAP=y |
169 | # CONFIG_SPARSEMEM_STATIC is not set | 180 | # CONFIG_SPARSEMEM_STATIC is not set |
170 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 181 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
182 | CONFIG_RESOURCES_64BIT=y | ||
171 | # CONFIG_PPC_64K_PAGES is not set | 183 | # CONFIG_PPC_64K_PAGES is not set |
172 | # CONFIG_SCHED_SMT is not set | 184 | # CONFIG_SCHED_SMT is not set |
173 | CONFIG_PROC_DEVICETREE=y | 185 | CONFIG_PROC_DEVICETREE=y |
@@ -184,6 +196,7 @@ CONFIG_GENERIC_ISA_DMA=y | |||
184 | # CONFIG_PPC_INDIRECT_PCI is not set | 196 | # CONFIG_PPC_INDIRECT_PCI is not set |
185 | CONFIG_PCI=y | 197 | CONFIG_PCI=y |
186 | CONFIG_PCI_DOMAINS=y | 198 | CONFIG_PCI_DOMAINS=y |
199 | # CONFIG_PCIEPORTBUS is not set | ||
187 | # CONFIG_PCI_DEBUG is not set | 200 | # CONFIG_PCI_DEBUG is not set |
188 | 201 | ||
189 | # | 202 | # |
@@ -227,6 +240,8 @@ CONFIG_INET_ESP=m | |||
227 | CONFIG_INET_IPCOMP=m | 240 | CONFIG_INET_IPCOMP=m |
228 | CONFIG_INET_XFRM_TUNNEL=m | 241 | CONFIG_INET_XFRM_TUNNEL=m |
229 | CONFIG_INET_TUNNEL=y | 242 | CONFIG_INET_TUNNEL=y |
243 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
244 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
230 | CONFIG_INET_DIAG=y | 245 | CONFIG_INET_DIAG=y |
231 | CONFIG_INET_TCP_DIAG=y | 246 | CONFIG_INET_TCP_DIAG=y |
232 | # CONFIG_TCP_CONG_ADVANCED is not set | 247 | # CONFIG_TCP_CONG_ADVANCED is not set |
@@ -239,6 +254,7 @@ CONFIG_TCP_CONG_BIC=y | |||
239 | # CONFIG_IPV6 is not set | 254 | # CONFIG_IPV6 is not set |
240 | # CONFIG_INET6_XFRM_TUNNEL is not set | 255 | # CONFIG_INET6_XFRM_TUNNEL is not set |
241 | # CONFIG_INET6_TUNNEL is not set | 256 | # CONFIG_INET6_TUNNEL is not set |
257 | # CONFIG_NETWORK_SECMARK is not set | ||
242 | CONFIG_NETFILTER=y | 258 | CONFIG_NETFILTER=y |
243 | # CONFIG_NETFILTER_DEBUG is not set | 259 | # CONFIG_NETFILTER_DEBUG is not set |
244 | 260 | ||
@@ -263,6 +279,7 @@ CONFIG_IP_NF_TFTP=m | |||
263 | CONFIG_IP_NF_AMANDA=m | 279 | CONFIG_IP_NF_AMANDA=m |
264 | # CONFIG_IP_NF_PPTP is not set | 280 | # CONFIG_IP_NF_PPTP is not set |
265 | # CONFIG_IP_NF_H323 is not set | 281 | # CONFIG_IP_NF_H323 is not set |
282 | # CONFIG_IP_NF_SIP is not set | ||
266 | CONFIG_IP_NF_QUEUE=m | 283 | CONFIG_IP_NF_QUEUE=m |
267 | 284 | ||
268 | # | 285 | # |
@@ -318,6 +335,7 @@ CONFIG_STANDALONE=y | |||
318 | CONFIG_PREVENT_FIRMWARE_BUILD=y | 335 | CONFIG_PREVENT_FIRMWARE_BUILD=y |
319 | CONFIG_FW_LOADER=y | 336 | CONFIG_FW_LOADER=y |
320 | # CONFIG_DEBUG_DRIVER is not set | 337 | # CONFIG_DEBUG_DRIVER is not set |
338 | # CONFIG_SYS_HYPERVISOR is not set | ||
321 | 339 | ||
322 | # | 340 | # |
323 | # Connector - unified userspace <-> kernelspace linker | 341 | # Connector - unified userspace <-> kernelspace linker |
@@ -355,6 +373,7 @@ CONFIG_BLK_DEV_NBD=m | |||
355 | CONFIG_BLK_DEV_RAM=y | 373 | CONFIG_BLK_DEV_RAM=y |
356 | CONFIG_BLK_DEV_RAM_COUNT=16 | 374 | CONFIG_BLK_DEV_RAM_COUNT=16 |
357 | CONFIG_BLK_DEV_RAM_SIZE=65536 | 375 | CONFIG_BLK_DEV_RAM_SIZE=65536 |
376 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
358 | CONFIG_BLK_DEV_INITRD=y | 377 | CONFIG_BLK_DEV_INITRD=y |
359 | CONFIG_CDROM_PKTCDVD=m | 378 | CONFIG_CDROM_PKTCDVD=m |
360 | CONFIG_CDROM_PKTCDVD_BUFFERS=8 | 379 | CONFIG_CDROM_PKTCDVD_BUFFERS=8 |
@@ -417,7 +436,6 @@ CONFIG_IDEDMA_PCI_AUTO=y | |||
417 | CONFIG_BLK_DEV_IDE_PMAC=y | 436 | CONFIG_BLK_DEV_IDE_PMAC=y |
418 | CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y | 437 | CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y |
419 | CONFIG_BLK_DEV_IDEDMA_PMAC=y | 438 | CONFIG_BLK_DEV_IDEDMA_PMAC=y |
420 | # CONFIG_BLK_DEV_IDE_PMAC_BLINK is not set | ||
421 | # CONFIG_IDE_ARM is not set | 439 | # CONFIG_IDE_ARM is not set |
422 | CONFIG_BLK_DEV_IDEDMA=y | 440 | CONFIG_BLK_DEV_IDEDMA=y |
423 | # CONFIG_IDEDMA_IVB is not set | 441 | # CONFIG_IDEDMA_IVB is not set |
@@ -478,6 +496,7 @@ CONFIG_SCSI_SATA_SVW=y | |||
478 | # CONFIG_SCSI_SATA_MV is not set | 496 | # CONFIG_SCSI_SATA_MV is not set |
479 | # CONFIG_SCSI_SATA_NV is not set | 497 | # CONFIG_SCSI_SATA_NV is not set |
480 | # CONFIG_SCSI_PDC_ADMA is not set | 498 | # CONFIG_SCSI_PDC_ADMA is not set |
499 | # CONFIG_SCSI_HPTIOP is not set | ||
481 | # CONFIG_SCSI_SATA_QSTOR is not set | 500 | # CONFIG_SCSI_SATA_QSTOR is not set |
482 | # CONFIG_SCSI_SATA_PROMISE is not set | 501 | # CONFIG_SCSI_SATA_PROMISE is not set |
483 | # CONFIG_SCSI_SATA_SX4 is not set | 502 | # CONFIG_SCSI_SATA_SX4 is not set |
@@ -497,7 +516,6 @@ CONFIG_SCSI_SATA_SVW=y | |||
497 | # CONFIG_SCSI_INIA100 is not set | 516 | # CONFIG_SCSI_INIA100 is not set |
498 | # CONFIG_SCSI_SYM53C8XX_2 is not set | 517 | # CONFIG_SCSI_SYM53C8XX_2 is not set |
499 | # CONFIG_SCSI_IPR is not set | 518 | # CONFIG_SCSI_IPR is not set |
500 | # CONFIG_SCSI_QLOGIC_FC is not set | ||
501 | # CONFIG_SCSI_QLOGIC_1280 is not set | 519 | # CONFIG_SCSI_QLOGIC_1280 is not set |
502 | # CONFIG_SCSI_QLA_FC is not set | 520 | # CONFIG_SCSI_QLA_FC is not set |
503 | # CONFIG_SCSI_LPFC is not set | 521 | # CONFIG_SCSI_LPFC is not set |
@@ -514,9 +532,7 @@ CONFIG_MD_LINEAR=y | |||
514 | CONFIG_MD_RAID0=y | 532 | CONFIG_MD_RAID0=y |
515 | CONFIG_MD_RAID1=y | 533 | CONFIG_MD_RAID1=y |
516 | CONFIG_MD_RAID10=m | 534 | CONFIG_MD_RAID10=m |
517 | CONFIG_MD_RAID5=y | 535 | # CONFIG_MD_RAID456 is not set |
518 | # CONFIG_MD_RAID5_RESHAPE is not set | ||
519 | CONFIG_MD_RAID6=m | ||
520 | CONFIG_MD_MULTIPATH=m | 536 | CONFIG_MD_MULTIPATH=m |
521 | CONFIG_MD_FAULTY=m | 537 | CONFIG_MD_FAULTY=m |
522 | CONFIG_BLK_DEV_DM=y | 538 | CONFIG_BLK_DEV_DM=y |
@@ -559,7 +575,6 @@ CONFIG_IEEE1394_OHCI1394=y | |||
559 | # | 575 | # |
560 | CONFIG_IEEE1394_VIDEO1394=m | 576 | CONFIG_IEEE1394_VIDEO1394=m |
561 | CONFIG_IEEE1394_SBP2=m | 577 | CONFIG_IEEE1394_SBP2=m |
562 | # CONFIG_IEEE1394_SBP2_PHYS_DMA is not set | ||
563 | CONFIG_IEEE1394_ETH1394=m | 578 | CONFIG_IEEE1394_ETH1394=m |
564 | CONFIG_IEEE1394_DV1394=m | 579 | CONFIG_IEEE1394_DV1394=m |
565 | CONFIG_IEEE1394_RAWIO=y | 580 | CONFIG_IEEE1394_RAWIO=y |
@@ -573,6 +588,7 @@ CONFIG_IEEE1394_RAWIO=y | |||
573 | # Macintosh device drivers | 588 | # Macintosh device drivers |
574 | # | 589 | # |
575 | CONFIG_ADB_PMU=y | 590 | CONFIG_ADB_PMU=y |
591 | # CONFIG_ADB_PMU_LED is not set | ||
576 | CONFIG_PMAC_SMU=y | 592 | CONFIG_PMAC_SMU=y |
577 | CONFIG_THERM_PM72=y | 593 | CONFIG_THERM_PM72=y |
578 | CONFIG_WINDFARM=y | 594 | CONFIG_WINDFARM=y |
@@ -643,6 +659,7 @@ CONFIG_TIGON3=y | |||
643 | # CONFIG_CHELSIO_T1 is not set | 659 | # CONFIG_CHELSIO_T1 is not set |
644 | # CONFIG_IXGB is not set | 660 | # CONFIG_IXGB is not set |
645 | # CONFIG_S2IO is not set | 661 | # CONFIG_S2IO is not set |
662 | # CONFIG_MYRI10GE is not set | ||
646 | 663 | ||
647 | # | 664 | # |
648 | # Token Ring devices | 665 | # Token Ring devices |
@@ -739,6 +756,7 @@ CONFIG_SERIO=y | |||
739 | CONFIG_VT=y | 756 | CONFIG_VT=y |
740 | CONFIG_VT_CONSOLE=y | 757 | CONFIG_VT_CONSOLE=y |
741 | CONFIG_HW_CONSOLE=y | 758 | CONFIG_HW_CONSOLE=y |
759 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
742 | # CONFIG_SERIAL_NONSTANDARD is not set | 760 | # CONFIG_SERIAL_NONSTANDARD is not set |
743 | 761 | ||
744 | # | 762 | # |
@@ -754,6 +772,7 @@ CONFIG_HW_CONSOLE=y | |||
754 | CONFIG_UNIX98_PTYS=y | 772 | CONFIG_UNIX98_PTYS=y |
755 | CONFIG_LEGACY_PTYS=y | 773 | CONFIG_LEGACY_PTYS=y |
756 | CONFIG_LEGACY_PTY_COUNT=256 | 774 | CONFIG_LEGACY_PTY_COUNT=256 |
775 | # CONFIG_BRIQ_PANEL is not set | ||
757 | 776 | ||
758 | # | 777 | # |
759 | # IPMI | 778 | # IPMI |
@@ -764,6 +783,7 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
764 | # Watchdog Cards | 783 | # Watchdog Cards |
765 | # | 784 | # |
766 | # CONFIG_WATCHDOG is not set | 785 | # CONFIG_WATCHDOG is not set |
786 | # CONFIG_HW_RANDOM is not set | ||
767 | CONFIG_GEN_RTC=y | 787 | CONFIG_GEN_RTC=y |
768 | # CONFIG_GEN_RTC_X is not set | 788 | # CONFIG_GEN_RTC_X is not set |
769 | # CONFIG_DTLK is not set | 789 | # CONFIG_DTLK is not set |
@@ -774,6 +794,7 @@ CONFIG_GEN_RTC=y | |||
774 | # Ftape, the floppy tape device driver | 794 | # Ftape, the floppy tape device driver |
775 | # | 795 | # |
776 | CONFIG_AGP=m | 796 | CONFIG_AGP=m |
797 | # CONFIG_AGP_SIS is not set | ||
777 | # CONFIG_AGP_VIA is not set | 798 | # CONFIG_AGP_VIA is not set |
778 | CONFIG_AGP_UNINORTH=m | 799 | CONFIG_AGP_UNINORTH=m |
779 | # CONFIG_DRM is not set | 800 | # CONFIG_DRM is not set |
@@ -813,6 +834,7 @@ CONFIG_I2C_ALGOBIT=y | |||
813 | # CONFIG_I2C_PIIX4 is not set | 834 | # CONFIG_I2C_PIIX4 is not set |
814 | CONFIG_I2C_POWERMAC=y | 835 | CONFIG_I2C_POWERMAC=y |
815 | # CONFIG_I2C_NFORCE2 is not set | 836 | # CONFIG_I2C_NFORCE2 is not set |
837 | # CONFIG_I2C_OCORES is not set | ||
816 | # CONFIG_I2C_PARPORT_LIGHT is not set | 838 | # CONFIG_I2C_PARPORT_LIGHT is not set |
817 | # CONFIG_I2C_PROSAVAGE is not set | 839 | # CONFIG_I2C_PROSAVAGE is not set |
818 | # CONFIG_I2C_SAVAGE4 is not set | 840 | # CONFIG_I2C_SAVAGE4 is not set |
@@ -849,7 +871,6 @@ CONFIG_I2C_POWERMAC=y | |||
849 | # | 871 | # |
850 | # Dallas's 1-wire bus | 872 | # Dallas's 1-wire bus |
851 | # | 873 | # |
852 | # CONFIG_W1 is not set | ||
853 | 874 | ||
854 | # | 875 | # |
855 | # Hardware Monitoring support | 876 | # Hardware Monitoring support |
@@ -865,6 +886,7 @@ CONFIG_I2C_POWERMAC=y | |||
865 | # Multimedia devices | 886 | # Multimedia devices |
866 | # | 887 | # |
867 | # CONFIG_VIDEO_DEV is not set | 888 | # CONFIG_VIDEO_DEV is not set |
889 | CONFIG_VIDEO_V4L2=y | ||
868 | 890 | ||
869 | # | 891 | # |
870 | # Digital Video Broadcasting Devices | 892 | # Digital Video Broadcasting Devices |
@@ -875,22 +897,19 @@ CONFIG_I2C_POWERMAC=y | |||
875 | # | 897 | # |
876 | # Graphics support | 898 | # Graphics support |
877 | # | 899 | # |
900 | CONFIG_FIRMWARE_EDID=y | ||
878 | CONFIG_FB=y | 901 | CONFIG_FB=y |
879 | CONFIG_FB_CFB_FILLRECT=y | 902 | CONFIG_FB_CFB_FILLRECT=y |
880 | CONFIG_FB_CFB_COPYAREA=y | 903 | CONFIG_FB_CFB_COPYAREA=y |
881 | CONFIG_FB_CFB_IMAGEBLIT=y | 904 | CONFIG_FB_CFB_IMAGEBLIT=y |
882 | CONFIG_FB_MACMODES=y | 905 | CONFIG_FB_MACMODES=y |
883 | CONFIG_FB_FIRMWARE_EDID=y | 906 | # CONFIG_FB_BACKLIGHT is not set |
884 | CONFIG_FB_MODE_HELPERS=y | 907 | CONFIG_FB_MODE_HELPERS=y |
885 | CONFIG_FB_TILEBLITTING=y | 908 | CONFIG_FB_TILEBLITTING=y |
886 | # CONFIG_FB_CIRRUS is not set | 909 | # CONFIG_FB_CIRRUS is not set |
887 | # CONFIG_FB_PM2 is not set | 910 | # CONFIG_FB_PM2 is not set |
888 | # CONFIG_FB_CYBER2000 is not set | 911 | # CONFIG_FB_CYBER2000 is not set |
889 | CONFIG_FB_OF=y | 912 | CONFIG_FB_OF=y |
890 | # CONFIG_FB_CONTROL is not set | ||
891 | # CONFIG_FB_PLATINUM is not set | ||
892 | # CONFIG_FB_VALKYRIE is not set | ||
893 | # CONFIG_FB_CT65550 is not set | ||
894 | # CONFIG_FB_ASILIANT is not set | 913 | # CONFIG_FB_ASILIANT is not set |
895 | # CONFIG_FB_IMSTT is not set | 914 | # CONFIG_FB_IMSTT is not set |
896 | # CONFIG_FB_VGA16 is not set | 915 | # CONFIG_FB_VGA16 is not set |
@@ -990,6 +1009,18 @@ CONFIG_SND_VERBOSE_PROCFS=y | |||
990 | # CONFIG_SND_CMIPCI is not set | 1009 | # CONFIG_SND_CMIPCI is not set |
991 | # CONFIG_SND_CS4281 is not set | 1010 | # CONFIG_SND_CS4281 is not set |
992 | # CONFIG_SND_CS46XX is not set | 1011 | # CONFIG_SND_CS46XX is not set |
1012 | # CONFIG_SND_DARLA20 is not set | ||
1013 | # CONFIG_SND_GINA20 is not set | ||
1014 | # CONFIG_SND_LAYLA20 is not set | ||
1015 | # CONFIG_SND_DARLA24 is not set | ||
1016 | # CONFIG_SND_GINA24 is not set | ||
1017 | # CONFIG_SND_LAYLA24 is not set | ||
1018 | # CONFIG_SND_MONA is not set | ||
1019 | # CONFIG_SND_MIA is not set | ||
1020 | # CONFIG_SND_ECHO3G is not set | ||
1021 | # CONFIG_SND_INDIGO is not set | ||
1022 | # CONFIG_SND_INDIGOIO is not set | ||
1023 | # CONFIG_SND_INDIGODJ is not set | ||
993 | # CONFIG_SND_EMU10K1 is not set | 1024 | # CONFIG_SND_EMU10K1 is not set |
994 | # CONFIG_SND_EMU10K1X is not set | 1025 | # CONFIG_SND_EMU10K1X is not set |
995 | # CONFIG_SND_ENS1370 is not set | 1026 | # CONFIG_SND_ENS1370 is not set |
@@ -1027,6 +1058,17 @@ CONFIG_SND_POWERMAC=m | |||
1027 | CONFIG_SND_POWERMAC_AUTO_DRC=y | 1058 | CONFIG_SND_POWERMAC_AUTO_DRC=y |
1028 | 1059 | ||
1029 | # | 1060 | # |
1061 | # Apple Onboard Audio driver | ||
1062 | # | ||
1063 | CONFIG_SND_AOA=m | ||
1064 | CONFIG_SND_AOA_FABRIC_LAYOUT=m | ||
1065 | CONFIG_SND_AOA_ONYX=m | ||
1066 | CONFIG_SND_AOA_TAS=m | ||
1067 | CONFIG_SND_AOA_TOONIE=m | ||
1068 | CONFIG_SND_AOA_SOUNDBUS=m | ||
1069 | CONFIG_SND_AOA_SOUNDBUS_I2S=m | ||
1070 | |||
1071 | # | ||
1030 | # USB devices | 1072 | # USB devices |
1031 | # | 1073 | # |
1032 | CONFIG_SND_USB_AUDIO=m | 1074 | CONFIG_SND_USB_AUDIO=m |
@@ -1060,6 +1102,7 @@ CONFIG_USB_DEVICEFS=y | |||
1060 | CONFIG_USB_EHCI_HCD=y | 1102 | CONFIG_USB_EHCI_HCD=y |
1061 | # CONFIG_USB_EHCI_SPLIT_ISO is not set | 1103 | # CONFIG_USB_EHCI_SPLIT_ISO is not set |
1062 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | 1104 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set |
1105 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | ||
1063 | # CONFIG_USB_ISP116X_HCD is not set | 1106 | # CONFIG_USB_ISP116X_HCD is not set |
1064 | CONFIG_USB_OHCI_HCD=y | 1107 | CONFIG_USB_OHCI_HCD=y |
1065 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set | 1108 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set |
@@ -1110,9 +1153,7 @@ CONFIG_USB_HIDDEV=y | |||
1110 | # CONFIG_USB_ACECAD is not set | 1153 | # CONFIG_USB_ACECAD is not set |
1111 | # CONFIG_USB_KBTAB is not set | 1154 | # CONFIG_USB_KBTAB is not set |
1112 | # CONFIG_USB_POWERMATE is not set | 1155 | # CONFIG_USB_POWERMATE is not set |
1113 | # CONFIG_USB_MTOUCH is not set | 1156 | # CONFIG_USB_TOUCHSCREEN is not set |
1114 | # CONFIG_USB_ITMTOUCH is not set | ||
1115 | # CONFIG_USB_EGALAX is not set | ||
1116 | # CONFIG_USB_YEALINK is not set | 1157 | # CONFIG_USB_YEALINK is not set |
1117 | # CONFIG_USB_XPAD is not set | 1158 | # CONFIG_USB_XPAD is not set |
1118 | # CONFIG_USB_ATI_REMOTE is not set | 1159 | # CONFIG_USB_ATI_REMOTE is not set |
@@ -1155,6 +1196,7 @@ CONFIG_USB_SERIAL=m | |||
1155 | CONFIG_USB_SERIAL_GENERIC=y | 1196 | CONFIG_USB_SERIAL_GENERIC=y |
1156 | # CONFIG_USB_SERIAL_AIRPRIME is not set | 1197 | # CONFIG_USB_SERIAL_AIRPRIME is not set |
1157 | # CONFIG_USB_SERIAL_ANYDATA is not set | 1198 | # CONFIG_USB_SERIAL_ANYDATA is not set |
1199 | # CONFIG_USB_SERIAL_ARK3116 is not set | ||
1158 | CONFIG_USB_SERIAL_BELKIN=m | 1200 | CONFIG_USB_SERIAL_BELKIN=m |
1159 | # CONFIG_USB_SERIAL_WHITEHEAT is not set | 1201 | # CONFIG_USB_SERIAL_WHITEHEAT is not set |
1160 | CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m | 1202 | CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m |
@@ -1162,6 +1204,7 @@ CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m | |||
1162 | CONFIG_USB_SERIAL_CYPRESS_M8=m | 1204 | CONFIG_USB_SERIAL_CYPRESS_M8=m |
1163 | CONFIG_USB_SERIAL_EMPEG=m | 1205 | CONFIG_USB_SERIAL_EMPEG=m |
1164 | CONFIG_USB_SERIAL_FTDI_SIO=m | 1206 | CONFIG_USB_SERIAL_FTDI_SIO=m |
1207 | # CONFIG_USB_SERIAL_FUNSOFT is not set | ||
1165 | CONFIG_USB_SERIAL_VISOR=m | 1208 | CONFIG_USB_SERIAL_VISOR=m |
1166 | CONFIG_USB_SERIAL_IPAQ=m | 1209 | CONFIG_USB_SERIAL_IPAQ=m |
1167 | CONFIG_USB_SERIAL_IR=m | 1210 | CONFIG_USB_SERIAL_IR=m |
@@ -1191,9 +1234,11 @@ CONFIG_USB_SERIAL_PL2303=m | |||
1191 | # CONFIG_USB_SERIAL_HP4X is not set | 1234 | # CONFIG_USB_SERIAL_HP4X is not set |
1192 | CONFIG_USB_SERIAL_SAFE=m | 1235 | CONFIG_USB_SERIAL_SAFE=m |
1193 | CONFIG_USB_SERIAL_SAFE_PADDED=y | 1236 | CONFIG_USB_SERIAL_SAFE_PADDED=y |
1237 | # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set | ||
1194 | CONFIG_USB_SERIAL_TI=m | 1238 | CONFIG_USB_SERIAL_TI=m |
1195 | CONFIG_USB_SERIAL_CYBERJACK=m | 1239 | CONFIG_USB_SERIAL_CYBERJACK=m |
1196 | CONFIG_USB_SERIAL_XIRCOM=m | 1240 | CONFIG_USB_SERIAL_XIRCOM=m |
1241 | # CONFIG_USB_SERIAL_OPTION is not set | ||
1197 | CONFIG_USB_SERIAL_OMNINET=m | 1242 | CONFIG_USB_SERIAL_OMNINET=m |
1198 | CONFIG_USB_EZUSB=y | 1243 | CONFIG_USB_EZUSB=y |
1199 | 1244 | ||
@@ -1207,10 +1252,12 @@ CONFIG_USB_EZUSB=y | |||
1207 | # CONFIG_USB_LEGOTOWER is not set | 1252 | # CONFIG_USB_LEGOTOWER is not set |
1208 | # CONFIG_USB_LCD is not set | 1253 | # CONFIG_USB_LCD is not set |
1209 | # CONFIG_USB_LED is not set | 1254 | # CONFIG_USB_LED is not set |
1255 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
1210 | # CONFIG_USB_CYTHERM is not set | 1256 | # CONFIG_USB_CYTHERM is not set |
1211 | # CONFIG_USB_PHIDGETKIT is not set | 1257 | # CONFIG_USB_PHIDGETKIT is not set |
1212 | # CONFIG_USB_PHIDGETSERVO is not set | 1258 | # CONFIG_USB_PHIDGETSERVO is not set |
1213 | # CONFIG_USB_IDMOUSE is not set | 1259 | # CONFIG_USB_IDMOUSE is not set |
1260 | CONFIG_USB_APPLEDISPLAY=m | ||
1214 | # CONFIG_USB_SISUSBVGA is not set | 1261 | # CONFIG_USB_SISUSBVGA is not set |
1215 | # CONFIG_USB_LD is not set | 1262 | # CONFIG_USB_LD is not set |
1216 | # CONFIG_USB_TEST is not set | 1263 | # CONFIG_USB_TEST is not set |
@@ -1235,6 +1282,14 @@ CONFIG_USB_EZUSB=y | |||
1235 | # CONFIG_NEW_LEDS is not set | 1282 | # CONFIG_NEW_LEDS is not set |
1236 | 1283 | ||
1237 | # | 1284 | # |
1285 | # LED drivers | ||
1286 | # | ||
1287 | |||
1288 | # | ||
1289 | # LED Triggers | ||
1290 | # | ||
1291 | |||
1292 | # | ||
1238 | # InfiniBand support | 1293 | # InfiniBand support |
1239 | # | 1294 | # |
1240 | # CONFIG_INFINIBAND is not set | 1295 | # CONFIG_INFINIBAND is not set |
@@ -1249,6 +1304,19 @@ CONFIG_USB_EZUSB=y | |||
1249 | # CONFIG_RTC_CLASS is not set | 1304 | # CONFIG_RTC_CLASS is not set |
1250 | 1305 | ||
1251 | # | 1306 | # |
1307 | # DMA Engine support | ||
1308 | # | ||
1309 | # CONFIG_DMA_ENGINE is not set | ||
1310 | |||
1311 | # | ||
1312 | # DMA Clients | ||
1313 | # | ||
1314 | |||
1315 | # | ||
1316 | # DMA Devices | ||
1317 | # | ||
1318 | |||
1319 | # | ||
1252 | # File systems | 1320 | # File systems |
1253 | # | 1321 | # |
1254 | CONFIG_EXT2_FS=y | 1322 | CONFIG_EXT2_FS=y |
@@ -1273,7 +1341,6 @@ CONFIG_REISERFS_FS_SECURITY=y | |||
1273 | # CONFIG_JFS_FS is not set | 1341 | # CONFIG_JFS_FS is not set |
1274 | CONFIG_FS_POSIX_ACL=y | 1342 | CONFIG_FS_POSIX_ACL=y |
1275 | CONFIG_XFS_FS=m | 1343 | CONFIG_XFS_FS=m |
1276 | CONFIG_XFS_EXPORT=y | ||
1277 | # CONFIG_XFS_QUOTA is not set | 1344 | # CONFIG_XFS_QUOTA is not set |
1278 | CONFIG_XFS_SECURITY=y | 1345 | CONFIG_XFS_SECURITY=y |
1279 | CONFIG_XFS_POSIX_ACL=y | 1346 | CONFIG_XFS_POSIX_ACL=y |
@@ -1282,6 +1349,7 @@ CONFIG_XFS_POSIX_ACL=y | |||
1282 | # CONFIG_MINIX_FS is not set | 1349 | # CONFIG_MINIX_FS is not set |
1283 | # CONFIG_ROMFS_FS is not set | 1350 | # CONFIG_ROMFS_FS is not set |
1284 | CONFIG_INOTIFY=y | 1351 | CONFIG_INOTIFY=y |
1352 | CONFIG_INOTIFY_USER=y | ||
1285 | # CONFIG_QUOTA is not set | 1353 | # CONFIG_QUOTA is not set |
1286 | CONFIG_DNOTIFY=y | 1354 | CONFIG_DNOTIFY=y |
1287 | CONFIG_AUTOFS_FS=m | 1355 | CONFIG_AUTOFS_FS=m |
@@ -1363,7 +1431,9 @@ CONFIG_RPCSEC_GSS_KRB5=y | |||
1363 | # CONFIG_SMB_FS is not set | 1431 | # CONFIG_SMB_FS is not set |
1364 | CONFIG_CIFS=m | 1432 | CONFIG_CIFS=m |
1365 | # CONFIG_CIFS_STATS is not set | 1433 | # CONFIG_CIFS_STATS is not set |
1434 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
1366 | # CONFIG_CIFS_XATTR is not set | 1435 | # CONFIG_CIFS_XATTR is not set |
1436 | # CONFIG_CIFS_DEBUG2 is not set | ||
1367 | # CONFIG_CIFS_EXPERIMENTAL is not set | 1437 | # CONFIG_CIFS_EXPERIMENTAL is not set |
1368 | # CONFIG_NCP_FS is not set | 1438 | # CONFIG_NCP_FS is not set |
1369 | # CONFIG_CODA_FS is not set | 1439 | # CONFIG_CODA_FS is not set |
@@ -1444,6 +1514,9 @@ CONFIG_CRC32=y | |||
1444 | CONFIG_LIBCRC32C=m | 1514 | CONFIG_LIBCRC32C=m |
1445 | CONFIG_ZLIB_INFLATE=y | 1515 | CONFIG_ZLIB_INFLATE=y |
1446 | CONFIG_ZLIB_DEFLATE=m | 1516 | CONFIG_ZLIB_DEFLATE=m |
1517 | CONFIG_TEXTSEARCH=y | ||
1518 | CONFIG_TEXTSEARCH_KMP=m | ||
1519 | CONFIG_PLIST=y | ||
1447 | 1520 | ||
1448 | # | 1521 | # |
1449 | # Instrumentation Support | 1522 | # Instrumentation Support |
@@ -1457,14 +1530,19 @@ CONFIG_OPROFILE=y | |||
1457 | # | 1530 | # |
1458 | # CONFIG_PRINTK_TIME is not set | 1531 | # CONFIG_PRINTK_TIME is not set |
1459 | CONFIG_MAGIC_SYSRQ=y | 1532 | CONFIG_MAGIC_SYSRQ=y |
1533 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1460 | CONFIG_DEBUG_KERNEL=y | 1534 | CONFIG_DEBUG_KERNEL=y |
1461 | CONFIG_LOG_BUF_SHIFT=17 | 1535 | CONFIG_LOG_BUF_SHIFT=17 |
1462 | CONFIG_DETECT_SOFTLOCKUP=y | 1536 | CONFIG_DETECT_SOFTLOCKUP=y |
1463 | # CONFIG_SCHEDSTATS is not set | 1537 | # CONFIG_SCHEDSTATS is not set |
1464 | # CONFIG_DEBUG_SLAB is not set | 1538 | # CONFIG_DEBUG_SLAB is not set |
1465 | CONFIG_DEBUG_MUTEXES=y | 1539 | # CONFIG_DEBUG_RT_MUTEXES is not set |
1540 | # CONFIG_RT_MUTEX_TESTER is not set | ||
1466 | # CONFIG_DEBUG_SPINLOCK is not set | 1541 | # CONFIG_DEBUG_SPINLOCK is not set |
1542 | CONFIG_DEBUG_MUTEXES=y | ||
1543 | # CONFIG_DEBUG_RWSEMS is not set | ||
1467 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 1544 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
1545 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
1468 | # CONFIG_DEBUG_KOBJECT is not set | 1546 | # CONFIG_DEBUG_KOBJECT is not set |
1469 | # CONFIG_DEBUG_INFO is not set | 1547 | # CONFIG_DEBUG_INFO is not set |
1470 | CONFIG_DEBUG_FS=y | 1548 | CONFIG_DEBUG_FS=y |
@@ -1476,11 +1554,7 @@ CONFIG_FORCED_INLINING=y | |||
1476 | # CONFIG_DEBUGGER is not set | 1554 | # CONFIG_DEBUGGER is not set |
1477 | CONFIG_IRQSTACKS=y | 1555 | CONFIG_IRQSTACKS=y |
1478 | CONFIG_BOOTX_TEXT=y | 1556 | CONFIG_BOOTX_TEXT=y |
1479 | # CONFIG_PPC_EARLY_DEBUG_LPAR is not set | 1557 | # CONFIG_PPC_EARLY_DEBUG is not set |
1480 | # CONFIG_PPC_EARLY_DEBUG_G5 is not set | ||
1481 | # CONFIG_PPC_EARLY_DEBUG_RTAS is not set | ||
1482 | # CONFIG_PPC_EARLY_DEBUG_MAPLE is not set | ||
1483 | # CONFIG_PPC_EARLY_DEBUG_ISERIES is not set | ||
1484 | 1558 | ||
1485 | # | 1559 | # |
1486 | # Security options | 1560 | # Security options |
diff --git a/arch/powerpc/configs/iseries_defconfig b/arch/powerpc/configs/iseries_defconfig index a95e455a1944..72ed95b3ead6 100644 --- a/arch/powerpc/configs/iseries_defconfig +++ b/arch/powerpc/configs/iseries_defconfig | |||
@@ -1,16 +1,18 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.17-rc1 | 3 | # Linux kernel version: 2.6.18-rc3 |
4 | # Wed Apr 19 11:46:44 2006 | 4 | # Tue Aug 8 09:15:46 2006 |
5 | # | 5 | # |
6 | CONFIG_PPC64=y | 6 | CONFIG_PPC64=y |
7 | CONFIG_64BIT=y | 7 | CONFIG_64BIT=y |
8 | CONFIG_PPC_MERGE=y | 8 | CONFIG_PPC_MERGE=y |
9 | CONFIG_MMU=y | 9 | CONFIG_MMU=y |
10 | CONFIG_GENERIC_HARDIRQS=y | 10 | CONFIG_GENERIC_HARDIRQS=y |
11 | CONFIG_IRQ_PER_CPU=y | ||
11 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 12 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
12 | CONFIG_GENERIC_HWEIGHT=y | 13 | CONFIG_GENERIC_HWEIGHT=y |
13 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 14 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
15 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
14 | CONFIG_PPC=y | 16 | CONFIG_PPC=y |
15 | CONFIG_EARLY_PRINTK=y | 17 | CONFIG_EARLY_PRINTK=y |
16 | CONFIG_COMPAT=y | 18 | CONFIG_COMPAT=y |
@@ -34,6 +36,7 @@ CONFIG_PPC_STD_MMU=y | |||
34 | CONFIG_VIRT_CPU_ACCOUNTING=y | 36 | CONFIG_VIRT_CPU_ACCOUNTING=y |
35 | CONFIG_SMP=y | 37 | CONFIG_SMP=y |
36 | CONFIG_NR_CPUS=32 | 38 | CONFIG_NR_CPUS=32 |
39 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
37 | 40 | ||
38 | # | 41 | # |
39 | # Code maturity level options | 42 | # Code maturity level options |
@@ -51,6 +54,7 @@ CONFIG_SWAP=y | |||
51 | CONFIG_SYSVIPC=y | 54 | CONFIG_SYSVIPC=y |
52 | CONFIG_POSIX_MQUEUE=y | 55 | CONFIG_POSIX_MQUEUE=y |
53 | # CONFIG_BSD_PROCESS_ACCT is not set | 56 | # CONFIG_BSD_PROCESS_ACCT is not set |
57 | # CONFIG_TASKSTATS is not set | ||
54 | CONFIG_SYSCTL=y | 58 | CONFIG_SYSCTL=y |
55 | CONFIG_AUDIT=y | 59 | CONFIG_AUDIT=y |
56 | CONFIG_AUDITSYSCALL=y | 60 | CONFIG_AUDITSYSCALL=y |
@@ -69,10 +73,12 @@ CONFIG_PRINTK=y | |||
69 | CONFIG_BUG=y | 73 | CONFIG_BUG=y |
70 | CONFIG_ELF_CORE=y | 74 | CONFIG_ELF_CORE=y |
71 | CONFIG_BASE_FULL=y | 75 | CONFIG_BASE_FULL=y |
76 | CONFIG_RT_MUTEXES=y | ||
72 | CONFIG_FUTEX=y | 77 | CONFIG_FUTEX=y |
73 | CONFIG_EPOLL=y | 78 | CONFIG_EPOLL=y |
74 | CONFIG_SHMEM=y | 79 | CONFIG_SHMEM=y |
75 | CONFIG_SLAB=y | 80 | CONFIG_SLAB=y |
81 | CONFIG_VM_EVENT_COUNTERS=y | ||
76 | # CONFIG_TINY_SHMEM is not set | 82 | # CONFIG_TINY_SHMEM is not set |
77 | CONFIG_BASE_SMALL=0 | 83 | CONFIG_BASE_SMALL=0 |
78 | # CONFIG_SLOB is not set | 84 | # CONFIG_SLOB is not set |
@@ -113,10 +119,14 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" | |||
113 | CONFIG_PPC_ISERIES=y | 119 | CONFIG_PPC_ISERIES=y |
114 | # CONFIG_EMBEDDED6xx is not set | 120 | # CONFIG_EMBEDDED6xx is not set |
115 | # CONFIG_APUS is not set | 121 | # CONFIG_APUS is not set |
122 | # CONFIG_PPC_CELL is not set | ||
123 | # CONFIG_PPC_CELL_NATIVE is not set | ||
124 | # CONFIG_UDBG_RTAS_CONSOLE is not set | ||
116 | # CONFIG_PPC_RTAS is not set | 125 | # CONFIG_PPC_RTAS is not set |
117 | # CONFIG_MMIO_NVRAM is not set | 126 | # CONFIG_MMIO_NVRAM is not set |
118 | CONFIG_IBMVIO=y | 127 | CONFIG_IBMVIO=y |
119 | # CONFIG_PPC_MPC106 is not set | 128 | # CONFIG_PPC_MPC106 is not set |
129 | # CONFIG_PPC_970_NAP is not set | ||
120 | # CONFIG_CPU_FREQ is not set | 130 | # CONFIG_CPU_FREQ is not set |
121 | # CONFIG_WANT_EARLY_SERIAL is not set | 131 | # CONFIG_WANT_EARLY_SERIAL is not set |
122 | 132 | ||
@@ -135,6 +145,7 @@ CONFIG_BINFMT_ELF=y | |||
135 | # CONFIG_BINFMT_MISC is not set | 145 | # CONFIG_BINFMT_MISC is not set |
136 | CONFIG_FORCE_MAX_ZONEORDER=13 | 146 | CONFIG_FORCE_MAX_ZONEORDER=13 |
137 | CONFIG_IOMMU_VMERGE=y | 147 | CONFIG_IOMMU_VMERGE=y |
148 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
138 | CONFIG_IRQ_ALL_CPUS=y | 149 | CONFIG_IRQ_ALL_CPUS=y |
139 | CONFIG_LPARCFG=y | 150 | CONFIG_LPARCFG=y |
140 | # CONFIG_NUMA is not set | 151 | # CONFIG_NUMA is not set |
@@ -149,6 +160,7 @@ CONFIG_FLATMEM=y | |||
149 | CONFIG_FLAT_NODE_MEM_MAP=y | 160 | CONFIG_FLAT_NODE_MEM_MAP=y |
150 | # CONFIG_SPARSEMEM_STATIC is not set | 161 | # CONFIG_SPARSEMEM_STATIC is not set |
151 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 162 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
163 | CONFIG_RESOURCES_64BIT=y | ||
152 | # CONFIG_PPC_64K_PAGES is not set | 164 | # CONFIG_PPC_64K_PAGES is not set |
153 | # CONFIG_SCHED_SMT is not set | 165 | # CONFIG_SCHED_SMT is not set |
154 | CONFIG_PROC_DEVICETREE=y | 166 | CONFIG_PROC_DEVICETREE=y |
@@ -164,6 +176,7 @@ CONFIG_GENERIC_ISA_DMA=y | |||
164 | # CONFIG_PPC_INDIRECT_PCI is not set | 176 | # CONFIG_PPC_INDIRECT_PCI is not set |
165 | CONFIG_PCI=y | 177 | CONFIG_PCI=y |
166 | CONFIG_PCI_DOMAINS=y | 178 | CONFIG_PCI_DOMAINS=y |
179 | # CONFIG_PCIEPORTBUS is not set | ||
167 | # CONFIG_PCI_DEBUG is not set | 180 | # CONFIG_PCI_DEBUG is not set |
168 | 181 | ||
169 | # | 182 | # |
@@ -207,6 +220,8 @@ CONFIG_INET_ESP=m | |||
207 | CONFIG_INET_IPCOMP=m | 220 | CONFIG_INET_IPCOMP=m |
208 | CONFIG_INET_XFRM_TUNNEL=m | 221 | CONFIG_INET_XFRM_TUNNEL=m |
209 | CONFIG_INET_TUNNEL=y | 222 | CONFIG_INET_TUNNEL=y |
223 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
224 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
210 | CONFIG_INET_DIAG=y | 225 | CONFIG_INET_DIAG=y |
211 | CONFIG_INET_TCP_DIAG=y | 226 | CONFIG_INET_TCP_DIAG=y |
212 | # CONFIG_TCP_CONG_ADVANCED is not set | 227 | # CONFIG_TCP_CONG_ADVANCED is not set |
@@ -219,6 +234,7 @@ CONFIG_TCP_CONG_BIC=y | |||
219 | # CONFIG_IPV6 is not set | 234 | # CONFIG_IPV6 is not set |
220 | # CONFIG_INET6_XFRM_TUNNEL is not set | 235 | # CONFIG_INET6_XFRM_TUNNEL is not set |
221 | # CONFIG_INET6_TUNNEL is not set | 236 | # CONFIG_INET6_TUNNEL is not set |
237 | # CONFIG_NETWORK_SECMARK is not set | ||
222 | CONFIG_NETFILTER=y | 238 | CONFIG_NETFILTER=y |
223 | # CONFIG_NETFILTER_DEBUG is not set | 239 | # CONFIG_NETFILTER_DEBUG is not set |
224 | 240 | ||
@@ -246,9 +262,11 @@ CONFIG_NETFILTER_XT_MATCH_MARK=m | |||
246 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set | 262 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set |
247 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | 263 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set |
248 | CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m | 264 | CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m |
265 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
249 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 266 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
250 | CONFIG_NETFILTER_XT_MATCH_SCTP=m | 267 | CONFIG_NETFILTER_XT_MATCH_SCTP=m |
251 | CONFIG_NETFILTER_XT_MATCH_STATE=m | 268 | CONFIG_NETFILTER_XT_MATCH_STATE=m |
269 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
252 | CONFIG_NETFILTER_XT_MATCH_STRING=m | 270 | CONFIG_NETFILTER_XT_MATCH_STRING=m |
253 | CONFIG_NETFILTER_XT_MATCH_TCPMSS=m | 271 | CONFIG_NETFILTER_XT_MATCH_TCPMSS=m |
254 | 272 | ||
@@ -267,6 +285,7 @@ CONFIG_IP_NF_TFTP=m | |||
267 | CONFIG_IP_NF_AMANDA=m | 285 | CONFIG_IP_NF_AMANDA=m |
268 | # CONFIG_IP_NF_PPTP is not set | 286 | # CONFIG_IP_NF_PPTP is not set |
269 | # CONFIG_IP_NF_H323 is not set | 287 | # CONFIG_IP_NF_H323 is not set |
288 | # CONFIG_IP_NF_SIP is not set | ||
270 | CONFIG_IP_NF_QUEUE=m | 289 | CONFIG_IP_NF_QUEUE=m |
271 | CONFIG_IP_NF_IPTABLES=m | 290 | CONFIG_IP_NF_IPTABLES=m |
272 | CONFIG_IP_NF_MATCH_IPRANGE=m | 291 | CONFIG_IP_NF_MATCH_IPRANGE=m |
@@ -360,6 +379,7 @@ CONFIG_STANDALONE=y | |||
360 | CONFIG_PREVENT_FIRMWARE_BUILD=y | 379 | CONFIG_PREVENT_FIRMWARE_BUILD=y |
361 | CONFIG_FW_LOADER=m | 380 | CONFIG_FW_LOADER=m |
362 | # CONFIG_DEBUG_DRIVER is not set | 381 | # CONFIG_DEBUG_DRIVER is not set |
382 | # CONFIG_SYS_HYPERVISOR is not set | ||
363 | 383 | ||
364 | # | 384 | # |
365 | # Connector - unified userspace <-> kernelspace linker | 385 | # Connector - unified userspace <-> kernelspace linker |
@@ -396,6 +416,7 @@ CONFIG_BLK_DEV_NBD=m | |||
396 | CONFIG_BLK_DEV_RAM=y | 416 | CONFIG_BLK_DEV_RAM=y |
397 | CONFIG_BLK_DEV_RAM_COUNT=16 | 417 | CONFIG_BLK_DEV_RAM_COUNT=16 |
398 | CONFIG_BLK_DEV_RAM_SIZE=65536 | 418 | CONFIG_BLK_DEV_RAM_SIZE=65536 |
419 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
399 | CONFIG_BLK_DEV_INITRD=y | 420 | CONFIG_BLK_DEV_INITRD=y |
400 | # CONFIG_CDROM_PKTCDVD is not set | 421 | # CONFIG_CDROM_PKTCDVD is not set |
401 | # CONFIG_ATA_OVER_ETH is not set | 422 | # CONFIG_ATA_OVER_ETH is not set |
@@ -453,6 +474,7 @@ CONFIG_SCSI_FC_ATTRS=y | |||
453 | # CONFIG_MEGARAID_LEGACY is not set | 474 | # CONFIG_MEGARAID_LEGACY is not set |
454 | # CONFIG_MEGARAID_SAS is not set | 475 | # CONFIG_MEGARAID_SAS is not set |
455 | # CONFIG_SCSI_SATA is not set | 476 | # CONFIG_SCSI_SATA is not set |
477 | # CONFIG_SCSI_HPTIOP is not set | ||
456 | # CONFIG_SCSI_BUSLOGIC is not set | 478 | # CONFIG_SCSI_BUSLOGIC is not set |
457 | # CONFIG_SCSI_DMX3191D is not set | 479 | # CONFIG_SCSI_DMX3191D is not set |
458 | # CONFIG_SCSI_EATA is not set | 480 | # CONFIG_SCSI_EATA is not set |
@@ -464,7 +486,6 @@ CONFIG_SCSI_IBMVSCSI=m | |||
464 | # CONFIG_SCSI_INIA100 is not set | 486 | # CONFIG_SCSI_INIA100 is not set |
465 | # CONFIG_SCSI_SYM53C8XX_2 is not set | 487 | # CONFIG_SCSI_SYM53C8XX_2 is not set |
466 | # CONFIG_SCSI_IPR is not set | 488 | # CONFIG_SCSI_IPR is not set |
467 | # CONFIG_SCSI_QLOGIC_FC is not set | ||
468 | # CONFIG_SCSI_QLOGIC_1280 is not set | 489 | # CONFIG_SCSI_QLOGIC_1280 is not set |
469 | # CONFIG_SCSI_QLA_FC is not set | 490 | # CONFIG_SCSI_QLA_FC is not set |
470 | # CONFIG_SCSI_LPFC is not set | 491 | # CONFIG_SCSI_LPFC is not set |
@@ -481,9 +502,7 @@ CONFIG_MD_LINEAR=y | |||
481 | CONFIG_MD_RAID0=y | 502 | CONFIG_MD_RAID0=y |
482 | CONFIG_MD_RAID1=y | 503 | CONFIG_MD_RAID1=y |
483 | CONFIG_MD_RAID10=m | 504 | CONFIG_MD_RAID10=m |
484 | CONFIG_MD_RAID5=y | 505 | # CONFIG_MD_RAID456 is not set |
485 | # CONFIG_MD_RAID5_RESHAPE is not set | ||
486 | CONFIG_MD_RAID6=m | ||
487 | CONFIG_MD_MULTIPATH=m | 506 | CONFIG_MD_MULTIPATH=m |
488 | CONFIG_MD_FAULTY=m | 507 | CONFIG_MD_FAULTY=m |
489 | CONFIG_BLK_DEV_DM=y | 508 | CONFIG_BLK_DEV_DM=y |
@@ -596,6 +615,7 @@ CONFIG_E1000=m | |||
596 | # CONFIG_CHELSIO_T1 is not set | 615 | # CONFIG_CHELSIO_T1 is not set |
597 | # CONFIG_IXGB is not set | 616 | # CONFIG_IXGB is not set |
598 | # CONFIG_S2IO is not set | 617 | # CONFIG_S2IO is not set |
618 | # CONFIG_MYRI10GE is not set | ||
599 | 619 | ||
600 | # | 620 | # |
601 | # Token Ring devices | 621 | # Token Ring devices |
@@ -696,6 +716,7 @@ CONFIG_SERIAL_ICOM=m | |||
696 | CONFIG_UNIX98_PTYS=y | 716 | CONFIG_UNIX98_PTYS=y |
697 | CONFIG_LEGACY_PTYS=y | 717 | CONFIG_LEGACY_PTYS=y |
698 | CONFIG_LEGACY_PTY_COUNT=256 | 718 | CONFIG_LEGACY_PTY_COUNT=256 |
719 | # CONFIG_BRIQ_PANEL is not set | ||
699 | 720 | ||
700 | # | 721 | # |
701 | # IPMI | 722 | # IPMI |
@@ -706,6 +727,7 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
706 | # Watchdog Cards | 727 | # Watchdog Cards |
707 | # | 728 | # |
708 | # CONFIG_WATCHDOG is not set | 729 | # CONFIG_WATCHDOG is not set |
730 | # CONFIG_HW_RANDOM is not set | ||
709 | CONFIG_GEN_RTC=y | 731 | CONFIG_GEN_RTC=y |
710 | # CONFIG_GEN_RTC_X is not set | 732 | # CONFIG_GEN_RTC_X is not set |
711 | # CONFIG_DTLK is not set | 733 | # CONFIG_DTLK is not set |
@@ -741,7 +763,6 @@ CONFIG_MAX_RAW_DEVS=256 | |||
741 | # | 763 | # |
742 | # Dallas's 1-wire bus | 764 | # Dallas's 1-wire bus |
743 | # | 765 | # |
744 | # CONFIG_W1 is not set | ||
745 | 766 | ||
746 | # | 767 | # |
747 | # Hardware Monitoring support | 768 | # Hardware Monitoring support |
@@ -757,6 +778,7 @@ CONFIG_MAX_RAW_DEVS=256 | |||
757 | # Multimedia devices | 778 | # Multimedia devices |
758 | # | 779 | # |
759 | # CONFIG_VIDEO_DEV is not set | 780 | # CONFIG_VIDEO_DEV is not set |
781 | CONFIG_VIDEO_V4L2=y | ||
760 | 782 | ||
761 | # | 783 | # |
762 | # Digital Video Broadcasting Devices | 784 | # Digital Video Broadcasting Devices |
@@ -766,7 +788,9 @@ CONFIG_MAX_RAW_DEVS=256 | |||
766 | # | 788 | # |
767 | # Graphics support | 789 | # Graphics support |
768 | # | 790 | # |
791 | CONFIG_FIRMWARE_EDID=y | ||
769 | # CONFIG_FB is not set | 792 | # CONFIG_FB is not set |
793 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
770 | 794 | ||
771 | # | 795 | # |
772 | # Sound | 796 | # Sound |
@@ -801,6 +825,14 @@ CONFIG_USB_ARCH_HAS_EHCI=y | |||
801 | # CONFIG_NEW_LEDS is not set | 825 | # CONFIG_NEW_LEDS is not set |
802 | 826 | ||
803 | # | 827 | # |
828 | # LED drivers | ||
829 | # | ||
830 | |||
831 | # | ||
832 | # LED Triggers | ||
833 | # | ||
834 | |||
835 | # | ||
804 | # InfiniBand support | 836 | # InfiniBand support |
805 | # | 837 | # |
806 | # CONFIG_INFINIBAND is not set | 838 | # CONFIG_INFINIBAND is not set |
@@ -815,6 +847,19 @@ CONFIG_USB_ARCH_HAS_EHCI=y | |||
815 | # CONFIG_RTC_CLASS is not set | 847 | # CONFIG_RTC_CLASS is not set |
816 | 848 | ||
817 | # | 849 | # |
850 | # DMA Engine support | ||
851 | # | ||
852 | # CONFIG_DMA_ENGINE is not set | ||
853 | |||
854 | # | ||
855 | # DMA Clients | ||
856 | # | ||
857 | |||
858 | # | ||
859 | # DMA Devices | ||
860 | # | ||
861 | |||
862 | # | ||
818 | # File systems | 863 | # File systems |
819 | # | 864 | # |
820 | CONFIG_EXT2_FS=y | 865 | CONFIG_EXT2_FS=y |
@@ -843,7 +888,6 @@ CONFIG_JFS_SECURITY=y | |||
843 | # CONFIG_JFS_STATISTICS is not set | 888 | # CONFIG_JFS_STATISTICS is not set |
844 | CONFIG_FS_POSIX_ACL=y | 889 | CONFIG_FS_POSIX_ACL=y |
845 | CONFIG_XFS_FS=m | 890 | CONFIG_XFS_FS=m |
846 | CONFIG_XFS_EXPORT=y | ||
847 | # CONFIG_XFS_QUOTA is not set | 891 | # CONFIG_XFS_QUOTA is not set |
848 | CONFIG_XFS_SECURITY=y | 892 | CONFIG_XFS_SECURITY=y |
849 | CONFIG_XFS_POSIX_ACL=y | 893 | CONFIG_XFS_POSIX_ACL=y |
@@ -852,6 +896,7 @@ CONFIG_XFS_POSIX_ACL=y | |||
852 | # CONFIG_MINIX_FS is not set | 896 | # CONFIG_MINIX_FS is not set |
853 | # CONFIG_ROMFS_FS is not set | 897 | # CONFIG_ROMFS_FS is not set |
854 | CONFIG_INOTIFY=y | 898 | CONFIG_INOTIFY=y |
899 | CONFIG_INOTIFY_USER=y | ||
855 | # CONFIG_QUOTA is not set | 900 | # CONFIG_QUOTA is not set |
856 | CONFIG_DNOTIFY=y | 901 | CONFIG_DNOTIFY=y |
857 | CONFIG_AUTOFS_FS=m | 902 | CONFIG_AUTOFS_FS=m |
@@ -933,8 +978,10 @@ CONFIG_RPCSEC_GSS_SPKM3=m | |||
933 | # CONFIG_SMB_FS is not set | 978 | # CONFIG_SMB_FS is not set |
934 | CONFIG_CIFS=m | 979 | CONFIG_CIFS=m |
935 | # CONFIG_CIFS_STATS is not set | 980 | # CONFIG_CIFS_STATS is not set |
981 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
936 | CONFIG_CIFS_XATTR=y | 982 | CONFIG_CIFS_XATTR=y |
937 | CONFIG_CIFS_POSIX=y | 983 | CONFIG_CIFS_POSIX=y |
984 | # CONFIG_CIFS_DEBUG2 is not set | ||
938 | # CONFIG_CIFS_EXPERIMENTAL is not set | 985 | # CONFIG_CIFS_EXPERIMENTAL is not set |
939 | # CONFIG_NCP_FS is not set | 986 | # CONFIG_NCP_FS is not set |
940 | # CONFIG_CODA_FS is not set | 987 | # CONFIG_CODA_FS is not set |
@@ -1013,10 +1060,12 @@ CONFIG_TEXTSEARCH=y | |||
1013 | CONFIG_TEXTSEARCH_KMP=m | 1060 | CONFIG_TEXTSEARCH_KMP=m |
1014 | CONFIG_TEXTSEARCH_BM=m | 1061 | CONFIG_TEXTSEARCH_BM=m |
1015 | CONFIG_TEXTSEARCH_FSM=m | 1062 | CONFIG_TEXTSEARCH_FSM=m |
1063 | CONFIG_PLIST=y | ||
1016 | 1064 | ||
1017 | # | 1065 | # |
1018 | # Instrumentation Support | 1066 | # Instrumentation Support |
1019 | # | 1067 | # |
1068 | # CONFIG_PROFILING is not set | ||
1020 | # CONFIG_KPROBES is not set | 1069 | # CONFIG_KPROBES is not set |
1021 | 1070 | ||
1022 | # | 1071 | # |
@@ -1024,14 +1073,19 @@ CONFIG_TEXTSEARCH_FSM=m | |||
1024 | # | 1073 | # |
1025 | # CONFIG_PRINTK_TIME is not set | 1074 | # CONFIG_PRINTK_TIME is not set |
1026 | CONFIG_MAGIC_SYSRQ=y | 1075 | CONFIG_MAGIC_SYSRQ=y |
1076 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1027 | CONFIG_DEBUG_KERNEL=y | 1077 | CONFIG_DEBUG_KERNEL=y |
1028 | CONFIG_LOG_BUF_SHIFT=17 | 1078 | CONFIG_LOG_BUF_SHIFT=17 |
1029 | CONFIG_DETECT_SOFTLOCKUP=y | 1079 | CONFIG_DETECT_SOFTLOCKUP=y |
1030 | # CONFIG_SCHEDSTATS is not set | 1080 | # CONFIG_SCHEDSTATS is not set |
1031 | # CONFIG_DEBUG_SLAB is not set | 1081 | # CONFIG_DEBUG_SLAB is not set |
1032 | # CONFIG_DEBUG_MUTEXES is not set | 1082 | # CONFIG_DEBUG_RT_MUTEXES is not set |
1083 | # CONFIG_RT_MUTEX_TESTER is not set | ||
1033 | # CONFIG_DEBUG_SPINLOCK is not set | 1084 | # CONFIG_DEBUG_SPINLOCK is not set |
1085 | # CONFIG_DEBUG_MUTEXES is not set | ||
1086 | # CONFIG_DEBUG_RWSEMS is not set | ||
1034 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 1087 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
1088 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
1035 | # CONFIG_DEBUG_KOBJECT is not set | 1089 | # CONFIG_DEBUG_KOBJECT is not set |
1036 | # CONFIG_DEBUG_INFO is not set | 1090 | # CONFIG_DEBUG_INFO is not set |
1037 | CONFIG_DEBUG_FS=y | 1091 | CONFIG_DEBUG_FS=y |
@@ -1042,11 +1096,7 @@ CONFIG_DEBUG_STACKOVERFLOW=y | |||
1042 | CONFIG_DEBUG_STACK_USAGE=y | 1096 | CONFIG_DEBUG_STACK_USAGE=y |
1043 | # CONFIG_DEBUGGER is not set | 1097 | # CONFIG_DEBUGGER is not set |
1044 | CONFIG_IRQSTACKS=y | 1098 | CONFIG_IRQSTACKS=y |
1045 | # CONFIG_PPC_EARLY_DEBUG_LPAR is not set | 1099 | # CONFIG_PPC_EARLY_DEBUG is not set |
1046 | # CONFIG_PPC_EARLY_DEBUG_G5 is not set | ||
1047 | # CONFIG_PPC_EARLY_DEBUG_RTAS is not set | ||
1048 | # CONFIG_PPC_EARLY_DEBUG_MAPLE is not set | ||
1049 | # CONFIG_PPC_EARLY_DEBUG_ISERIES is not set | ||
1050 | 1100 | ||
1051 | # | 1101 | # |
1052 | # Security options | 1102 | # Security options |
diff --git a/arch/powerpc/configs/pmac32_defconfig b/arch/powerpc/configs/pmac32_defconfig index addc79381c3b..3545af9896af 100644 --- a/arch/powerpc/configs/pmac32_defconfig +++ b/arch/powerpc/configs/pmac32_defconfig | |||
@@ -1,16 +1,18 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.17-rc5 | 3 | # Linux kernel version: 2.6.17 |
4 | # Mon May 29 14:47:49 2006 | 4 | # Mon Jul 3 14:20:49 2006 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | CONFIG_PPC32=y | 7 | CONFIG_PPC32=y |
8 | CONFIG_PPC_MERGE=y | 8 | CONFIG_PPC_MERGE=y |
9 | CONFIG_MMU=y | 9 | CONFIG_MMU=y |
10 | CONFIG_GENERIC_HARDIRQS=y | 10 | CONFIG_GENERIC_HARDIRQS=y |
11 | CONFIG_IRQ_PER_CPU=y | ||
11 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 12 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
12 | CONFIG_GENERIC_HWEIGHT=y | 13 | CONFIG_GENERIC_HWEIGHT=y |
13 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 14 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
15 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
14 | CONFIG_PPC=y | 16 | CONFIG_PPC=y |
15 | CONFIG_EARLY_PRINTK=y | 17 | CONFIG_EARLY_PRINTK=y |
16 | CONFIG_GENERIC_NVRAM=y | 18 | CONFIG_GENERIC_NVRAM=y |
@@ -29,6 +31,7 @@ CONFIG_CLASSIC32=y | |||
29 | # CONFIG_PPC_82xx is not set | 31 | # CONFIG_PPC_82xx is not set |
30 | # CONFIG_PPC_83xx is not set | 32 | # CONFIG_PPC_83xx is not set |
31 | # CONFIG_PPC_85xx is not set | 33 | # CONFIG_PPC_85xx is not set |
34 | # CONFIG_PPC_86xx is not set | ||
32 | # CONFIG_40x is not set | 35 | # CONFIG_40x is not set |
33 | # CONFIG_44x is not set | 36 | # CONFIG_44x is not set |
34 | # CONFIG_8xx is not set | 37 | # CONFIG_8xx is not set |
@@ -39,6 +42,7 @@ CONFIG_ALTIVEC=y | |||
39 | CONFIG_PPC_STD_MMU=y | 42 | CONFIG_PPC_STD_MMU=y |
40 | CONFIG_PPC_STD_MMU_32=y | 43 | CONFIG_PPC_STD_MMU_32=y |
41 | # CONFIG_SMP is not set | 44 | # CONFIG_SMP is not set |
45 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
42 | 46 | ||
43 | # | 47 | # |
44 | # Code maturity level options | 48 | # Code maturity level options |
@@ -72,10 +76,12 @@ CONFIG_PRINTK=y | |||
72 | CONFIG_BUG=y | 76 | CONFIG_BUG=y |
73 | CONFIG_ELF_CORE=y | 77 | CONFIG_ELF_CORE=y |
74 | CONFIG_BASE_FULL=y | 78 | CONFIG_BASE_FULL=y |
79 | CONFIG_RT_MUTEXES=y | ||
75 | CONFIG_FUTEX=y | 80 | CONFIG_FUTEX=y |
76 | CONFIG_EPOLL=y | 81 | CONFIG_EPOLL=y |
77 | CONFIG_SHMEM=y | 82 | CONFIG_SHMEM=y |
78 | CONFIG_SLAB=y | 83 | CONFIG_SLAB=y |
84 | CONFIG_VM_EVENT_COUNTERS=y | ||
79 | # CONFIG_TINY_SHMEM is not set | 85 | # CONFIG_TINY_SHMEM is not set |
80 | CONFIG_BASE_SMALL=0 | 86 | CONFIG_BASE_SMALL=0 |
81 | # CONFIG_SLOB is not set | 87 | # CONFIG_SLOB is not set |
@@ -119,6 +125,9 @@ CONFIG_PPC_MULTIPLATFORM=y | |||
119 | # CONFIG_APUS is not set | 125 | # CONFIG_APUS is not set |
120 | # CONFIG_PPC_CHRP is not set | 126 | # CONFIG_PPC_CHRP is not set |
121 | CONFIG_PPC_PMAC=y | 127 | CONFIG_PPC_PMAC=y |
128 | # CONFIG_PPC_CELL is not set | ||
129 | # CONFIG_PPC_CELL_NATIVE is not set | ||
130 | # CONFIG_UDBG_RTAS_CONSOLE is not set | ||
122 | CONFIG_MPIC=y | 131 | CONFIG_MPIC=y |
123 | # CONFIG_PPC_RTAS is not set | 132 | # CONFIG_PPC_RTAS is not set |
124 | # CONFIG_MMIO_NVRAM is not set | 133 | # CONFIG_MMIO_NVRAM is not set |
@@ -154,6 +163,7 @@ CONFIG_PREEMPT_NONE=y | |||
154 | # CONFIG_PREEMPT is not set | 163 | # CONFIG_PREEMPT is not set |
155 | CONFIG_BINFMT_ELF=y | 164 | CONFIG_BINFMT_ELF=y |
156 | CONFIG_BINFMT_MISC=m | 165 | CONFIG_BINFMT_MISC=m |
166 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
157 | # CONFIG_KEXEC is not set | 167 | # CONFIG_KEXEC is not set |
158 | CONFIG_ARCH_FLATMEM_ENABLE=y | 168 | CONFIG_ARCH_FLATMEM_ENABLE=y |
159 | CONFIG_SELECT_MEMORY_MODEL=y | 169 | CONFIG_SELECT_MEMORY_MODEL=y |
@@ -164,6 +174,7 @@ CONFIG_FLATMEM=y | |||
164 | CONFIG_FLAT_NODE_MEM_MAP=y | 174 | CONFIG_FLAT_NODE_MEM_MAP=y |
165 | # CONFIG_SPARSEMEM_STATIC is not set | 175 | # CONFIG_SPARSEMEM_STATIC is not set |
166 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 176 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
177 | # CONFIG_RESOURCES_64BIT is not set | ||
167 | CONFIG_PROC_DEVICETREE=y | 178 | CONFIG_PROC_DEVICETREE=y |
168 | # CONFIG_CMDLINE_BOOL is not set | 179 | # CONFIG_CMDLINE_BOOL is not set |
169 | CONFIG_PM=y | 180 | CONFIG_PM=y |
@@ -182,6 +193,7 @@ CONFIG_GENERIC_ISA_DMA=y | |||
182 | CONFIG_PPC_INDIRECT_PCI=y | 193 | CONFIG_PPC_INDIRECT_PCI=y |
183 | CONFIG_PCI=y | 194 | CONFIG_PCI=y |
184 | CONFIG_PCI_DOMAINS=y | 195 | CONFIG_PCI_DOMAINS=y |
196 | # CONFIG_PCIEPORTBUS is not set | ||
185 | # CONFIG_PCI_DEBUG is not set | 197 | # CONFIG_PCI_DEBUG is not set |
186 | 198 | ||
187 | # | 199 | # |
@@ -256,6 +268,8 @@ CONFIG_INET_ESP=y | |||
256 | # CONFIG_INET_IPCOMP is not set | 268 | # CONFIG_INET_IPCOMP is not set |
257 | # CONFIG_INET_XFRM_TUNNEL is not set | 269 | # CONFIG_INET_XFRM_TUNNEL is not set |
258 | # CONFIG_INET_TUNNEL is not set | 270 | # CONFIG_INET_TUNNEL is not set |
271 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
272 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
259 | CONFIG_INET_DIAG=y | 273 | CONFIG_INET_DIAG=y |
260 | CONFIG_INET_TCP_DIAG=y | 274 | CONFIG_INET_TCP_DIAG=y |
261 | # CONFIG_TCP_CONG_ADVANCED is not set | 275 | # CONFIG_TCP_CONG_ADVANCED is not set |
@@ -268,6 +282,7 @@ CONFIG_TCP_CONG_BIC=y | |||
268 | # CONFIG_IPV6 is not set | 282 | # CONFIG_IPV6 is not set |
269 | # CONFIG_INET6_XFRM_TUNNEL is not set | 283 | # CONFIG_INET6_XFRM_TUNNEL is not set |
270 | # CONFIG_INET6_TUNNEL is not set | 284 | # CONFIG_INET6_TUNNEL is not set |
285 | # CONFIG_NETWORK_SECMARK is not set | ||
271 | CONFIG_NETFILTER=y | 286 | CONFIG_NETFILTER=y |
272 | # CONFIG_NETFILTER_DEBUG is not set | 287 | # CONFIG_NETFILTER_DEBUG is not set |
273 | 288 | ||
@@ -292,9 +307,11 @@ CONFIG_NETFILTER_XT_MATCH_MARK=m | |||
292 | CONFIG_NETFILTER_XT_MATCH_POLICY=m | 307 | CONFIG_NETFILTER_XT_MATCH_POLICY=m |
293 | CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m | 308 | CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m |
294 | CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m | 309 | CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m |
310 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
295 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 311 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
296 | CONFIG_NETFILTER_XT_MATCH_SCTP=m | 312 | CONFIG_NETFILTER_XT_MATCH_SCTP=m |
297 | CONFIG_NETFILTER_XT_MATCH_STATE=m | 313 | CONFIG_NETFILTER_XT_MATCH_STATE=m |
314 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
298 | CONFIG_NETFILTER_XT_MATCH_STRING=m | 315 | CONFIG_NETFILTER_XT_MATCH_STRING=m |
299 | CONFIG_NETFILTER_XT_MATCH_TCPMSS=m | 316 | CONFIG_NETFILTER_XT_MATCH_TCPMSS=m |
300 | 317 | ||
@@ -313,6 +330,7 @@ CONFIG_IP_NF_TFTP=m | |||
313 | CONFIG_IP_NF_AMANDA=m | 330 | CONFIG_IP_NF_AMANDA=m |
314 | CONFIG_IP_NF_PPTP=m | 331 | CONFIG_IP_NF_PPTP=m |
315 | CONFIG_IP_NF_H323=m | 332 | CONFIG_IP_NF_H323=m |
333 | # CONFIG_IP_NF_SIP is not set | ||
316 | # CONFIG_IP_NF_QUEUE is not set | 334 | # CONFIG_IP_NF_QUEUE is not set |
317 | CONFIG_IP_NF_IPTABLES=m | 335 | CONFIG_IP_NF_IPTABLES=m |
318 | CONFIG_IP_NF_MATCH_IPRANGE=m | 336 | CONFIG_IP_NF_MATCH_IPRANGE=m |
@@ -457,6 +475,7 @@ CONFIG_IRTTY_SIR=m | |||
457 | # CONFIG_ALI_FIR is not set | 475 | # CONFIG_ALI_FIR is not set |
458 | # CONFIG_VLSI_FIR is not set | 476 | # CONFIG_VLSI_FIR is not set |
459 | # CONFIG_VIA_FIR is not set | 477 | # CONFIG_VIA_FIR is not set |
478 | # CONFIG_MCS_FIR is not set | ||
460 | CONFIG_BT=m | 479 | CONFIG_BT=m |
461 | CONFIG_BT_L2CAP=m | 480 | CONFIG_BT_L2CAP=m |
462 | CONFIG_BT_SCO=m | 481 | CONFIG_BT_SCO=m |
@@ -500,6 +519,7 @@ CONFIG_WIRELESS_EXT=y | |||
500 | CONFIG_PREVENT_FIRMWARE_BUILD=y | 519 | CONFIG_PREVENT_FIRMWARE_BUILD=y |
501 | CONFIG_FW_LOADER=y | 520 | CONFIG_FW_LOADER=y |
502 | # CONFIG_DEBUG_DRIVER is not set | 521 | # CONFIG_DEBUG_DRIVER is not set |
522 | # CONFIG_SYS_HYPERVISOR is not set | ||
503 | 523 | ||
504 | # | 524 | # |
505 | # Connector - unified userspace <-> kernelspace linker | 525 | # Connector - unified userspace <-> kernelspace linker |
@@ -600,7 +620,6 @@ CONFIG_BLK_DEV_PDC202XX_NEW=y | |||
600 | CONFIG_BLK_DEV_IDE_PMAC=y | 620 | CONFIG_BLK_DEV_IDE_PMAC=y |
601 | CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y | 621 | CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y |
602 | CONFIG_BLK_DEV_IDEDMA_PMAC=y | 622 | CONFIG_BLK_DEV_IDEDMA_PMAC=y |
603 | CONFIG_BLK_DEV_IDE_PMAC_BLINK=y | ||
604 | # CONFIG_IDE_ARM is not set | 623 | # CONFIG_IDE_ARM is not set |
605 | CONFIG_BLK_DEV_IDEDMA=y | 624 | CONFIG_BLK_DEV_IDEDMA=y |
606 | # CONFIG_IDEDMA_IVB is not set | 625 | # CONFIG_IDEDMA_IVB is not set |
@@ -661,6 +680,7 @@ CONFIG_SCSI_AIC7XXX_OLD=m | |||
661 | # CONFIG_MEGARAID_LEGACY is not set | 680 | # CONFIG_MEGARAID_LEGACY is not set |
662 | # CONFIG_MEGARAID_SAS is not set | 681 | # CONFIG_MEGARAID_SAS is not set |
663 | # CONFIG_SCSI_SATA is not set | 682 | # CONFIG_SCSI_SATA is not set |
683 | # CONFIG_SCSI_HPTIOP is not set | ||
664 | # CONFIG_SCSI_BUSLOGIC is not set | 684 | # CONFIG_SCSI_BUSLOGIC is not set |
665 | # CONFIG_SCSI_DMX3191D is not set | 685 | # CONFIG_SCSI_DMX3191D is not set |
666 | # CONFIG_SCSI_EATA is not set | 686 | # CONFIG_SCSI_EATA is not set |
@@ -705,9 +725,7 @@ CONFIG_MD_LINEAR=m | |||
705 | CONFIG_MD_RAID0=m | 725 | CONFIG_MD_RAID0=m |
706 | CONFIG_MD_RAID1=m | 726 | CONFIG_MD_RAID1=m |
707 | CONFIG_MD_RAID10=m | 727 | CONFIG_MD_RAID10=m |
708 | CONFIG_MD_RAID5=m | 728 | # CONFIG_MD_RAID456 is not set |
709 | CONFIG_MD_RAID5_RESHAPE=y | ||
710 | CONFIG_MD_RAID6=m | ||
711 | CONFIG_MD_MULTIPATH=m | 729 | CONFIG_MD_MULTIPATH=m |
712 | CONFIG_MD_FAULTY=m | 730 | CONFIG_MD_FAULTY=m |
713 | CONFIG_BLK_DEV_DM=m | 731 | CONFIG_BLK_DEV_DM=m |
@@ -750,7 +768,6 @@ CONFIG_IEEE1394_OHCI1394=m | |||
750 | # | 768 | # |
751 | CONFIG_IEEE1394_VIDEO1394=m | 769 | CONFIG_IEEE1394_VIDEO1394=m |
752 | CONFIG_IEEE1394_SBP2=m | 770 | CONFIG_IEEE1394_SBP2=m |
753 | # CONFIG_IEEE1394_SBP2_PHYS_DMA is not set | ||
754 | # CONFIG_IEEE1394_ETH1394 is not set | 771 | # CONFIG_IEEE1394_ETH1394 is not set |
755 | CONFIG_IEEE1394_DV1394=m | 772 | CONFIG_IEEE1394_DV1394=m |
756 | CONFIG_IEEE1394_RAWIO=m | 773 | CONFIG_IEEE1394_RAWIO=m |
@@ -766,9 +783,12 @@ CONFIG_IEEE1394_RAWIO=m | |||
766 | CONFIG_ADB=y | 783 | CONFIG_ADB=y |
767 | CONFIG_ADB_CUDA=y | 784 | CONFIG_ADB_CUDA=y |
768 | CONFIG_ADB_PMU=y | 785 | CONFIG_ADB_PMU=y |
786 | CONFIG_ADB_PMU_LED=y | ||
787 | CONFIG_ADB_PMU_LED_IDE=y | ||
769 | CONFIG_PMAC_APM_EMU=m | 788 | CONFIG_PMAC_APM_EMU=m |
770 | CONFIG_PMAC_MEDIABAY=y | 789 | CONFIG_PMAC_MEDIABAY=y |
771 | CONFIG_PMAC_BACKLIGHT=y | 790 | CONFIG_PMAC_BACKLIGHT=y |
791 | CONFIG_PMAC_BACKLIGHT_LEGACY=y | ||
772 | CONFIG_INPUT_ADBHID=y | 792 | CONFIG_INPUT_ADBHID=y |
773 | CONFIG_MAC_EMUMOUSEBTN=y | 793 | CONFIG_MAC_EMUMOUSEBTN=y |
774 | CONFIG_THERM_WINDTUNNEL=m | 794 | CONFIG_THERM_WINDTUNNEL=m |
@@ -858,6 +878,7 @@ CONFIG_PCNET32=y | |||
858 | # CONFIG_CHELSIO_T1 is not set | 878 | # CONFIG_CHELSIO_T1 is not set |
859 | # CONFIG_IXGB is not set | 879 | # CONFIG_IXGB is not set |
860 | # CONFIG_S2IO is not set | 880 | # CONFIG_S2IO is not set |
881 | # CONFIG_MYRI10GE is not set | ||
861 | 882 | ||
862 | # | 883 | # |
863 | # Token Ring devices | 884 | # Token Ring devices |
@@ -908,6 +929,7 @@ CONFIG_APPLE_AIRPORT=m | |||
908 | # Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support | 929 | # Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support |
909 | # | 930 | # |
910 | CONFIG_PRISM54=m | 931 | CONFIG_PRISM54=m |
932 | # CONFIG_USB_ZD1201 is not set | ||
911 | # CONFIG_HOSTAP is not set | 933 | # CONFIG_HOSTAP is not set |
912 | CONFIG_NET_WIRELESS=y | 934 | CONFIG_NET_WIRELESS=y |
913 | 935 | ||
@@ -998,6 +1020,7 @@ CONFIG_SERIO=y | |||
998 | CONFIG_VT=y | 1020 | CONFIG_VT=y |
999 | CONFIG_VT_CONSOLE=y | 1021 | CONFIG_VT_CONSOLE=y |
1000 | CONFIG_HW_CONSOLE=y | 1022 | CONFIG_HW_CONSOLE=y |
1023 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
1001 | # CONFIG_SERIAL_NONSTANDARD is not set | 1024 | # CONFIG_SERIAL_NONSTANDARD is not set |
1002 | 1025 | ||
1003 | # | 1026 | # |
@@ -1029,6 +1052,7 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
1029 | # Watchdog Cards | 1052 | # Watchdog Cards |
1030 | # | 1053 | # |
1031 | # CONFIG_WATCHDOG is not set | 1054 | # CONFIG_WATCHDOG is not set |
1055 | # CONFIG_HW_RANDOM is not set | ||
1032 | CONFIG_NVRAM=y | 1056 | CONFIG_NVRAM=y |
1033 | CONFIG_GEN_RTC=y | 1057 | CONFIG_GEN_RTC=y |
1034 | # CONFIG_GEN_RTC_X is not set | 1058 | # CONFIG_GEN_RTC_X is not set |
@@ -1040,6 +1064,7 @@ CONFIG_GEN_RTC=y | |||
1040 | # Ftape, the floppy tape device driver | 1064 | # Ftape, the floppy tape device driver |
1041 | # | 1065 | # |
1042 | CONFIG_AGP=m | 1066 | CONFIG_AGP=m |
1067 | # CONFIG_AGP_SIS is not set | ||
1043 | # CONFIG_AGP_VIA is not set | 1068 | # CONFIG_AGP_VIA is not set |
1044 | CONFIG_AGP_UNINORTH=m | 1069 | CONFIG_AGP_UNINORTH=m |
1045 | CONFIG_DRM=m | 1070 | CONFIG_DRM=m |
@@ -1092,6 +1117,7 @@ CONFIG_I2C_ALGOBIT=y | |||
1092 | CONFIG_I2C_POWERMAC=y | 1117 | CONFIG_I2C_POWERMAC=y |
1093 | # CONFIG_I2C_MPC is not set | 1118 | # CONFIG_I2C_MPC is not set |
1094 | # CONFIG_I2C_NFORCE2 is not set | 1119 | # CONFIG_I2C_NFORCE2 is not set |
1120 | # CONFIG_I2C_OCORES is not set | ||
1095 | # CONFIG_I2C_PARPORT_LIGHT is not set | 1121 | # CONFIG_I2C_PARPORT_LIGHT is not set |
1096 | # CONFIG_I2C_PROSAVAGE is not set | 1122 | # CONFIG_I2C_PROSAVAGE is not set |
1097 | # CONFIG_I2C_SAVAGE4 is not set | 1123 | # CONFIG_I2C_SAVAGE4 is not set |
@@ -1156,12 +1182,13 @@ CONFIG_VIDEO_V4L2=y | |||
1156 | # | 1182 | # |
1157 | # Graphics support | 1183 | # Graphics support |
1158 | # | 1184 | # |
1185 | # CONFIG_FIRMWARE_EDID is not set | ||
1159 | CONFIG_FB=y | 1186 | CONFIG_FB=y |
1160 | CONFIG_FB_CFB_FILLRECT=y | 1187 | CONFIG_FB_CFB_FILLRECT=y |
1161 | CONFIG_FB_CFB_COPYAREA=y | 1188 | CONFIG_FB_CFB_COPYAREA=y |
1162 | CONFIG_FB_CFB_IMAGEBLIT=y | 1189 | CONFIG_FB_CFB_IMAGEBLIT=y |
1163 | CONFIG_FB_MACMODES=y | 1190 | CONFIG_FB_MACMODES=y |
1164 | CONFIG_FB_FIRMWARE_EDID=y | 1191 | CONFIG_FB_BACKLIGHT=y |
1165 | CONFIG_FB_MODE_HELPERS=y | 1192 | CONFIG_FB_MODE_HELPERS=y |
1166 | CONFIG_FB_TILEBLITTING=y | 1193 | CONFIG_FB_TILEBLITTING=y |
1167 | # CONFIG_FB_CIRRUS is not set | 1194 | # CONFIG_FB_CIRRUS is not set |
@@ -1178,6 +1205,7 @@ CONFIG_FB_IMSTT=y | |||
1178 | # CONFIG_FB_S1D13XXX is not set | 1205 | # CONFIG_FB_S1D13XXX is not set |
1179 | CONFIG_FB_NVIDIA=y | 1206 | CONFIG_FB_NVIDIA=y |
1180 | CONFIG_FB_NVIDIA_I2C=y | 1207 | CONFIG_FB_NVIDIA_I2C=y |
1208 | CONFIG_FB_NVIDIA_BACKLIGHT=y | ||
1181 | # CONFIG_FB_RIVA is not set | 1209 | # CONFIG_FB_RIVA is not set |
1182 | CONFIG_FB_MATROX=y | 1210 | CONFIG_FB_MATROX=y |
1183 | CONFIG_FB_MATROX_MILLENIUM=y | 1211 | CONFIG_FB_MATROX_MILLENIUM=y |
@@ -1187,12 +1215,15 @@ CONFIG_FB_MATROX_MYSTIQUE=y | |||
1187 | # CONFIG_FB_MATROX_MULTIHEAD is not set | 1215 | # CONFIG_FB_MATROX_MULTIHEAD is not set |
1188 | CONFIG_FB_RADEON=y | 1216 | CONFIG_FB_RADEON=y |
1189 | CONFIG_FB_RADEON_I2C=y | 1217 | CONFIG_FB_RADEON_I2C=y |
1218 | CONFIG_FB_RADEON_BACKLIGHT=y | ||
1190 | # CONFIG_FB_RADEON_DEBUG is not set | 1219 | # CONFIG_FB_RADEON_DEBUG is not set |
1191 | CONFIG_FB_ATY128=y | 1220 | CONFIG_FB_ATY128=y |
1221 | CONFIG_FB_ATY128_BACKLIGHT=y | ||
1192 | CONFIG_FB_ATY=y | 1222 | CONFIG_FB_ATY=y |
1193 | CONFIG_FB_ATY_CT=y | 1223 | CONFIG_FB_ATY_CT=y |
1194 | # CONFIG_FB_ATY_GENERIC_LCD is not set | 1224 | # CONFIG_FB_ATY_GENERIC_LCD is not set |
1195 | CONFIG_FB_ATY_GX=y | 1225 | CONFIG_FB_ATY_GX=y |
1226 | CONFIG_FB_ATY_BACKLIGHT=y | ||
1196 | # CONFIG_FB_SAVAGE is not set | 1227 | # CONFIG_FB_SAVAGE is not set |
1197 | # CONFIG_FB_SIS is not set | 1228 | # CONFIG_FB_SIS is not set |
1198 | # CONFIG_FB_NEOMAGIC is not set | 1229 | # CONFIG_FB_NEOMAGIC is not set |
@@ -1221,7 +1252,11 @@ CONFIG_LOGO=y | |||
1221 | CONFIG_LOGO_LINUX_MONO=y | 1252 | CONFIG_LOGO_LINUX_MONO=y |
1222 | CONFIG_LOGO_LINUX_VGA16=y | 1253 | CONFIG_LOGO_LINUX_VGA16=y |
1223 | CONFIG_LOGO_LINUX_CLUT224=y | 1254 | CONFIG_LOGO_LINUX_CLUT224=y |
1224 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 1255 | CONFIG_BACKLIGHT_LCD_SUPPORT=y |
1256 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
1257 | CONFIG_BACKLIGHT_DEVICE=y | ||
1258 | CONFIG_LCD_CLASS_DEVICE=m | ||
1259 | CONFIG_LCD_DEVICE=y | ||
1225 | 1260 | ||
1226 | # | 1261 | # |
1227 | # Sound | 1262 | # Sound |
@@ -1278,6 +1313,18 @@ CONFIG_SND_DUMMY=m | |||
1278 | # CONFIG_SND_CMIPCI is not set | 1313 | # CONFIG_SND_CMIPCI is not set |
1279 | # CONFIG_SND_CS4281 is not set | 1314 | # CONFIG_SND_CS4281 is not set |
1280 | # CONFIG_SND_CS46XX is not set | 1315 | # CONFIG_SND_CS46XX is not set |
1316 | # CONFIG_SND_DARLA20 is not set | ||
1317 | # CONFIG_SND_GINA20 is not set | ||
1318 | # CONFIG_SND_LAYLA20 is not set | ||
1319 | # CONFIG_SND_DARLA24 is not set | ||
1320 | # CONFIG_SND_GINA24 is not set | ||
1321 | # CONFIG_SND_LAYLA24 is not set | ||
1322 | # CONFIG_SND_MONA is not set | ||
1323 | # CONFIG_SND_MIA is not set | ||
1324 | # CONFIG_SND_ECHO3G is not set | ||
1325 | # CONFIG_SND_INDIGO is not set | ||
1326 | # CONFIG_SND_INDIGOIO is not set | ||
1327 | # CONFIG_SND_INDIGODJ is not set | ||
1281 | # CONFIG_SND_EMU10K1 is not set | 1328 | # CONFIG_SND_EMU10K1 is not set |
1282 | # CONFIG_SND_EMU10K1X is not set | 1329 | # CONFIG_SND_EMU10K1X is not set |
1283 | # CONFIG_SND_ENS1370 is not set | 1330 | # CONFIG_SND_ENS1370 is not set |
@@ -1315,6 +1362,17 @@ CONFIG_SND_POWERMAC=m | |||
1315 | CONFIG_SND_POWERMAC_AUTO_DRC=y | 1362 | CONFIG_SND_POWERMAC_AUTO_DRC=y |
1316 | 1363 | ||
1317 | # | 1364 | # |
1365 | # Apple Onboard Audio driver | ||
1366 | # | ||
1367 | CONFIG_SND_AOA=m | ||
1368 | CONFIG_SND_AOA_FABRIC_LAYOUT=m | ||
1369 | CONFIG_SND_AOA_ONYX=m | ||
1370 | CONFIG_SND_AOA_TAS=m | ||
1371 | CONFIG_SND_AOA_TOONIE=m | ||
1372 | CONFIG_SND_AOA_SOUNDBUS=m | ||
1373 | CONFIG_SND_AOA_SOUNDBUS_I2S=m | ||
1374 | |||
1375 | # | ||
1318 | # USB devices | 1376 | # USB devices |
1319 | # | 1377 | # |
1320 | CONFIG_SND_USB_AUDIO=m | 1378 | CONFIG_SND_USB_AUDIO=m |
@@ -1355,6 +1413,7 @@ CONFIG_USB_DYNAMIC_MINORS=y | |||
1355 | CONFIG_USB_EHCI_HCD=m | 1413 | CONFIG_USB_EHCI_HCD=m |
1356 | CONFIG_USB_EHCI_SPLIT_ISO=y | 1414 | CONFIG_USB_EHCI_SPLIT_ISO=y |
1357 | CONFIG_USB_EHCI_ROOT_HUB_TT=y | 1415 | CONFIG_USB_EHCI_ROOT_HUB_TT=y |
1416 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | ||
1358 | # CONFIG_USB_ISP116X_HCD is not set | 1417 | # CONFIG_USB_ISP116X_HCD is not set |
1359 | CONFIG_USB_OHCI_HCD=y | 1418 | CONFIG_USB_OHCI_HCD=y |
1360 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set | 1419 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set |
@@ -1431,7 +1490,6 @@ CONFIG_USB_NET_NET1080=m | |||
1431 | # CONFIG_USB_NET_RNDIS_HOST is not set | 1490 | # CONFIG_USB_NET_RNDIS_HOST is not set |
1432 | # CONFIG_USB_NET_CDC_SUBSET is not set | 1491 | # CONFIG_USB_NET_CDC_SUBSET is not set |
1433 | CONFIG_USB_NET_ZAURUS=m | 1492 | CONFIG_USB_NET_ZAURUS=m |
1434 | # CONFIG_USB_ZD1201 is not set | ||
1435 | CONFIG_USB_MON=y | 1493 | CONFIG_USB_MON=y |
1436 | 1494 | ||
1437 | # | 1495 | # |
@@ -1499,10 +1557,12 @@ CONFIG_USB_EZUSB=y | |||
1499 | # CONFIG_USB_LEGOTOWER is not set | 1557 | # CONFIG_USB_LEGOTOWER is not set |
1500 | # CONFIG_USB_LCD is not set | 1558 | # CONFIG_USB_LCD is not set |
1501 | # CONFIG_USB_LED is not set | 1559 | # CONFIG_USB_LED is not set |
1560 | # CONFIG_USB_CY7C63 is not set | ||
1502 | # CONFIG_USB_CYTHERM is not set | 1561 | # CONFIG_USB_CYTHERM is not set |
1503 | # CONFIG_USB_PHIDGETKIT is not set | 1562 | # CONFIG_USB_PHIDGETKIT is not set |
1504 | # CONFIG_USB_PHIDGETSERVO is not set | 1563 | # CONFIG_USB_PHIDGETSERVO is not set |
1505 | # CONFIG_USB_IDMOUSE is not set | 1564 | # CONFIG_USB_IDMOUSE is not set |
1565 | CONFIG_USB_APPLEDISPLAY=m | ||
1506 | # CONFIG_USB_SISUSBVGA is not set | 1566 | # CONFIG_USB_SISUSBVGA is not set |
1507 | # CONFIG_USB_LD is not set | 1567 | # CONFIG_USB_LD is not set |
1508 | # CONFIG_USB_TEST is not set | 1568 | # CONFIG_USB_TEST is not set |
@@ -1524,7 +1584,8 @@ CONFIG_USB_EZUSB=y | |||
1524 | # | 1584 | # |
1525 | # LED devices | 1585 | # LED devices |
1526 | # | 1586 | # |
1527 | # CONFIG_NEW_LEDS is not set | 1587 | CONFIG_NEW_LEDS=y |
1588 | CONFIG_LEDS_CLASS=y | ||
1528 | 1589 | ||
1529 | # | 1590 | # |
1530 | # LED drivers | 1591 | # LED drivers |
@@ -1533,6 +1594,10 @@ CONFIG_USB_EZUSB=y | |||
1533 | # | 1594 | # |
1534 | # LED Triggers | 1595 | # LED Triggers |
1535 | # | 1596 | # |
1597 | CONFIG_LEDS_TRIGGERS=y | ||
1598 | # CONFIG_LEDS_TRIGGER_TIMER is not set | ||
1599 | CONFIG_LEDS_TRIGGER_IDE_DISK=y | ||
1600 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set | ||
1536 | 1601 | ||
1537 | # | 1602 | # |
1538 | # InfiniBand support | 1603 | # InfiniBand support |
@@ -1549,6 +1614,19 @@ CONFIG_USB_EZUSB=y | |||
1549 | # CONFIG_RTC_CLASS is not set | 1614 | # CONFIG_RTC_CLASS is not set |
1550 | 1615 | ||
1551 | # | 1616 | # |
1617 | # DMA Engine support | ||
1618 | # | ||
1619 | # CONFIG_DMA_ENGINE is not set | ||
1620 | |||
1621 | # | ||
1622 | # DMA Clients | ||
1623 | # | ||
1624 | |||
1625 | # | ||
1626 | # DMA Devices | ||
1627 | # | ||
1628 | |||
1629 | # | ||
1552 | # File systems | 1630 | # File systems |
1553 | # | 1631 | # |
1554 | CONFIG_EXT2_FS=y | 1632 | CONFIG_EXT2_FS=y |
@@ -1569,6 +1647,7 @@ CONFIG_FS_POSIX_ACL=y | |||
1569 | # CONFIG_MINIX_FS is not set | 1647 | # CONFIG_MINIX_FS is not set |
1570 | # CONFIG_ROMFS_FS is not set | 1648 | # CONFIG_ROMFS_FS is not set |
1571 | CONFIG_INOTIFY=y | 1649 | CONFIG_INOTIFY=y |
1650 | CONFIG_INOTIFY_USER=y | ||
1572 | # CONFIG_QUOTA is not set | 1651 | # CONFIG_QUOTA is not set |
1573 | CONFIG_DNOTIFY=y | 1652 | CONFIG_DNOTIFY=y |
1574 | # CONFIG_AUTOFS_FS is not set | 1653 | # CONFIG_AUTOFS_FS is not set |
@@ -1649,6 +1728,7 @@ CONFIG_RPCSEC_GSS_KRB5=y | |||
1649 | CONFIG_SMB_FS=m | 1728 | CONFIG_SMB_FS=m |
1650 | # CONFIG_SMB_NLS_DEFAULT is not set | 1729 | # CONFIG_SMB_NLS_DEFAULT is not set |
1651 | # CONFIG_CIFS is not set | 1730 | # CONFIG_CIFS is not set |
1731 | # CONFIG_CIFS_DEBUG2 is not set | ||
1652 | # CONFIG_NCP_FS is not set | 1732 | # CONFIG_NCP_FS is not set |
1653 | # CONFIG_CODA_FS is not set | 1733 | # CONFIG_CODA_FS is not set |
1654 | # CONFIG_AFS_FS is not set | 1734 | # CONFIG_AFS_FS is not set |
@@ -1732,6 +1812,7 @@ CONFIG_TEXTSEARCH=y | |||
1732 | CONFIG_TEXTSEARCH_KMP=m | 1812 | CONFIG_TEXTSEARCH_KMP=m |
1733 | CONFIG_TEXTSEARCH_BM=m | 1813 | CONFIG_TEXTSEARCH_BM=m |
1734 | CONFIG_TEXTSEARCH_FSM=m | 1814 | CONFIG_TEXTSEARCH_FSM=m |
1815 | CONFIG_PLIST=y | ||
1735 | 1816 | ||
1736 | # | 1817 | # |
1737 | # Instrumentation Support | 1818 | # Instrumentation Support |
@@ -1744,12 +1825,15 @@ CONFIG_OPROFILE=y | |||
1744 | # | 1825 | # |
1745 | # CONFIG_PRINTK_TIME is not set | 1826 | # CONFIG_PRINTK_TIME is not set |
1746 | # CONFIG_MAGIC_SYSRQ is not set | 1827 | # CONFIG_MAGIC_SYSRQ is not set |
1828 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1747 | CONFIG_DEBUG_KERNEL=y | 1829 | CONFIG_DEBUG_KERNEL=y |
1748 | CONFIG_LOG_BUF_SHIFT=14 | 1830 | CONFIG_LOG_BUF_SHIFT=14 |
1749 | CONFIG_DETECT_SOFTLOCKUP=y | 1831 | CONFIG_DETECT_SOFTLOCKUP=y |
1750 | # CONFIG_SCHEDSTATS is not set | 1832 | # CONFIG_SCHEDSTATS is not set |
1751 | # CONFIG_DEBUG_SLAB is not set | 1833 | # CONFIG_DEBUG_SLAB is not set |
1752 | # CONFIG_DEBUG_MUTEXES is not set | 1834 | # CONFIG_DEBUG_MUTEXES is not set |
1835 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
1836 | # CONFIG_RT_MUTEX_TESTER is not set | ||
1753 | # CONFIG_DEBUG_SPINLOCK is not set | 1837 | # CONFIG_DEBUG_SPINLOCK is not set |
1754 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 1838 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
1755 | # CONFIG_DEBUG_KOBJECT is not set | 1839 | # CONFIG_DEBUG_KOBJECT is not set |
@@ -1763,11 +1847,7 @@ CONFIG_XMON=y | |||
1763 | CONFIG_XMON_DEFAULT=y | 1847 | CONFIG_XMON_DEFAULT=y |
1764 | # CONFIG_BDI_SWITCH is not set | 1848 | # CONFIG_BDI_SWITCH is not set |
1765 | CONFIG_BOOTX_TEXT=y | 1849 | CONFIG_BOOTX_TEXT=y |
1766 | # CONFIG_PPC_EARLY_DEBUG_LPAR is not set | 1850 | # CONFIG_PPC_EARLY_DEBUG is not set |
1767 | # CONFIG_PPC_EARLY_DEBUG_G5 is not set | ||
1768 | # CONFIG_PPC_EARLY_DEBUG_RTAS is not set | ||
1769 | # CONFIG_PPC_EARLY_DEBUG_MAPLE is not set | ||
1770 | # CONFIG_PPC_EARLY_DEBUG_ISERIES is not set | ||
1771 | 1851 | ||
1772 | # | 1852 | # |
1773 | # Security options | 1853 | # Security options |
diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig index 31708ad4574e..c18e8600d78f 100644 --- a/arch/powerpc/configs/pseries_defconfig +++ b/arch/powerpc/configs/pseries_defconfig | |||
@@ -1,13 +1,14 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.17-rc4 | 3 | # Linux kernel version: 2.6.18-rc3 |
4 | # Sun May 28 07:26:56 2006 | 4 | # Tue Aug 8 09:14:48 2006 |
5 | # | 5 | # |
6 | CONFIG_PPC64=y | 6 | CONFIG_PPC64=y |
7 | CONFIG_64BIT=y | 7 | CONFIG_64BIT=y |
8 | CONFIG_PPC_MERGE=y | 8 | CONFIG_PPC_MERGE=y |
9 | CONFIG_MMU=y | 9 | CONFIG_MMU=y |
10 | CONFIG_GENERIC_HARDIRQS=y | 10 | CONFIG_GENERIC_HARDIRQS=y |
11 | CONFIG_IRQ_PER_CPU=y | ||
11 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 12 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
12 | CONFIG_GENERIC_HWEIGHT=y | 13 | CONFIG_GENERIC_HWEIGHT=y |
13 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 14 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
@@ -35,6 +36,7 @@ CONFIG_PPC_STD_MMU=y | |||
35 | CONFIG_VIRT_CPU_ACCOUNTING=y | 36 | CONFIG_VIRT_CPU_ACCOUNTING=y |
36 | CONFIG_SMP=y | 37 | CONFIG_SMP=y |
37 | CONFIG_NR_CPUS=128 | 38 | CONFIG_NR_CPUS=128 |
39 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
38 | 40 | ||
39 | # | 41 | # |
40 | # Code maturity level options | 42 | # Code maturity level options |
@@ -52,6 +54,7 @@ CONFIG_SWAP=y | |||
52 | CONFIG_SYSVIPC=y | 54 | CONFIG_SYSVIPC=y |
53 | CONFIG_POSIX_MQUEUE=y | 55 | CONFIG_POSIX_MQUEUE=y |
54 | # CONFIG_BSD_PROCESS_ACCT is not set | 56 | # CONFIG_BSD_PROCESS_ACCT is not set |
57 | # CONFIG_TASKSTATS is not set | ||
55 | CONFIG_SYSCTL=y | 58 | CONFIG_SYSCTL=y |
56 | CONFIG_AUDIT=y | 59 | CONFIG_AUDIT=y |
57 | CONFIG_AUDITSYSCALL=y | 60 | CONFIG_AUDITSYSCALL=y |
@@ -70,10 +73,12 @@ CONFIG_PRINTK=y | |||
70 | CONFIG_BUG=y | 73 | CONFIG_BUG=y |
71 | CONFIG_ELF_CORE=y | 74 | CONFIG_ELF_CORE=y |
72 | CONFIG_BASE_FULL=y | 75 | CONFIG_BASE_FULL=y |
76 | CONFIG_RT_MUTEXES=y | ||
73 | CONFIG_FUTEX=y | 77 | CONFIG_FUTEX=y |
74 | CONFIG_EPOLL=y | 78 | CONFIG_EPOLL=y |
75 | CONFIG_SHMEM=y | 79 | CONFIG_SHMEM=y |
76 | CONFIG_SLAB=y | 80 | CONFIG_SLAB=y |
81 | CONFIG_VM_EVENT_COUNTERS=y | ||
77 | # CONFIG_TINY_SHMEM is not set | 82 | # CONFIG_TINY_SHMEM is not set |
78 | CONFIG_BASE_SMALL=0 | 83 | CONFIG_BASE_SMALL=0 |
79 | # CONFIG_SLOB is not set | 84 | # CONFIG_SLOB is not set |
@@ -118,6 +123,9 @@ CONFIG_PPC_PSERIES=y | |||
118 | # CONFIG_PPC_PMAC is not set | 123 | # CONFIG_PPC_PMAC is not set |
119 | # CONFIG_PPC_MAPLE is not set | 124 | # CONFIG_PPC_MAPLE is not set |
120 | # CONFIG_PPC_CELL is not set | 125 | # CONFIG_PPC_CELL is not set |
126 | # CONFIG_PPC_CELL_NATIVE is not set | ||
127 | # CONFIG_PPC_IBM_CELL_BLADE is not set | ||
128 | # CONFIG_UDBG_RTAS_CONSOLE is not set | ||
121 | CONFIG_XICS=y | 129 | CONFIG_XICS=y |
122 | # CONFIG_U3_DART is not set | 130 | # CONFIG_U3_DART is not set |
123 | CONFIG_MPIC=y | 131 | CONFIG_MPIC=y |
@@ -149,6 +157,7 @@ CONFIG_BINFMT_MISC=m | |||
149 | CONFIG_FORCE_MAX_ZONEORDER=13 | 157 | CONFIG_FORCE_MAX_ZONEORDER=13 |
150 | CONFIG_IOMMU_VMERGE=y | 158 | CONFIG_IOMMU_VMERGE=y |
151 | CONFIG_HOTPLUG_CPU=y | 159 | CONFIG_HOTPLUG_CPU=y |
160 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
152 | CONFIG_KEXEC=y | 161 | CONFIG_KEXEC=y |
153 | # CONFIG_CRASH_DUMP is not set | 162 | # CONFIG_CRASH_DUMP is not set |
154 | CONFIG_IRQ_ALL_CPUS=y | 163 | CONFIG_IRQ_ALL_CPUS=y |
@@ -173,6 +182,7 @@ CONFIG_SPARSEMEM_EXTREME=y | |||
173 | # CONFIG_MEMORY_HOTPLUG is not set | 182 | # CONFIG_MEMORY_HOTPLUG is not set |
174 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 183 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
175 | CONFIG_MIGRATION=y | 184 | CONFIG_MIGRATION=y |
185 | CONFIG_RESOURCES_64BIT=y | ||
176 | CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y | 186 | CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y |
177 | # CONFIG_PPC_64K_PAGES is not set | 187 | # CONFIG_PPC_64K_PAGES is not set |
178 | CONFIG_SCHED_SMT=y | 188 | CONFIG_SCHED_SMT=y |
@@ -190,6 +200,7 @@ CONFIG_PPC_I8259=y | |||
190 | # CONFIG_PPC_INDIRECT_PCI is not set | 200 | # CONFIG_PPC_INDIRECT_PCI is not set |
191 | CONFIG_PCI=y | 201 | CONFIG_PCI=y |
192 | CONFIG_PCI_DOMAINS=y | 202 | CONFIG_PCI_DOMAINS=y |
203 | # CONFIG_PCIEPORTBUS is not set | ||
193 | # CONFIG_PCI_DEBUG is not set | 204 | # CONFIG_PCI_DEBUG is not set |
194 | 205 | ||
195 | # | 206 | # |
@@ -238,6 +249,8 @@ CONFIG_INET_ESP=m | |||
238 | CONFIG_INET_IPCOMP=m | 249 | CONFIG_INET_IPCOMP=m |
239 | CONFIG_INET_XFRM_TUNNEL=m | 250 | CONFIG_INET_XFRM_TUNNEL=m |
240 | CONFIG_INET_TUNNEL=y | 251 | CONFIG_INET_TUNNEL=y |
252 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
253 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
241 | CONFIG_INET_DIAG=y | 254 | CONFIG_INET_DIAG=y |
242 | CONFIG_INET_TCP_DIAG=y | 255 | CONFIG_INET_TCP_DIAG=y |
243 | # CONFIG_TCP_CONG_ADVANCED is not set | 256 | # CONFIG_TCP_CONG_ADVANCED is not set |
@@ -250,6 +263,7 @@ CONFIG_TCP_CONG_BIC=y | |||
250 | # CONFIG_IPV6 is not set | 263 | # CONFIG_IPV6 is not set |
251 | # CONFIG_INET6_XFRM_TUNNEL is not set | 264 | # CONFIG_INET6_XFRM_TUNNEL is not set |
252 | # CONFIG_INET6_TUNNEL is not set | 265 | # CONFIG_INET6_TUNNEL is not set |
266 | # CONFIG_NETWORK_SECMARK is not set | ||
253 | CONFIG_NETFILTER=y | 267 | CONFIG_NETFILTER=y |
254 | # CONFIG_NETFILTER_DEBUG is not set | 268 | # CONFIG_NETFILTER_DEBUG is not set |
255 | 269 | ||
@@ -277,6 +291,7 @@ CONFIG_IP_NF_TFTP=m | |||
277 | CONFIG_IP_NF_AMANDA=m | 291 | CONFIG_IP_NF_AMANDA=m |
278 | # CONFIG_IP_NF_PPTP is not set | 292 | # CONFIG_IP_NF_PPTP is not set |
279 | # CONFIG_IP_NF_H323 is not set | 293 | # CONFIG_IP_NF_H323 is not set |
294 | # CONFIG_IP_NF_SIP is not set | ||
280 | CONFIG_IP_NF_QUEUE=m | 295 | CONFIG_IP_NF_QUEUE=m |
281 | 296 | ||
282 | # | 297 | # |
@@ -316,6 +331,7 @@ CONFIG_LLC=y | |||
316 | # Network testing | 331 | # Network testing |
317 | # | 332 | # |
318 | # CONFIG_NET_PKTGEN is not set | 333 | # CONFIG_NET_PKTGEN is not set |
334 | # CONFIG_NET_TCPPROBE is not set | ||
319 | # CONFIG_HAMRADIO is not set | 335 | # CONFIG_HAMRADIO is not set |
320 | # CONFIG_IRDA is not set | 336 | # CONFIG_IRDA is not set |
321 | # CONFIG_BT is not set | 337 | # CONFIG_BT is not set |
@@ -332,6 +348,7 @@ CONFIG_STANDALONE=y | |||
332 | CONFIG_PREVENT_FIRMWARE_BUILD=y | 348 | CONFIG_PREVENT_FIRMWARE_BUILD=y |
333 | CONFIG_FW_LOADER=y | 349 | CONFIG_FW_LOADER=y |
334 | # CONFIG_DEBUG_DRIVER is not set | 350 | # CONFIG_DEBUG_DRIVER is not set |
351 | # CONFIG_SYS_HYPERVISOR is not set | ||
335 | 352 | ||
336 | # | 353 | # |
337 | # Connector - unified userspace <-> kernelspace linker | 354 | # Connector - unified userspace <-> kernelspace linker |
@@ -352,6 +369,7 @@ CONFIG_PARPORT_PC=m | |||
352 | # CONFIG_PARPORT_PC_FIFO is not set | 369 | # CONFIG_PARPORT_PC_FIFO is not set |
353 | # CONFIG_PARPORT_PC_SUPERIO is not set | 370 | # CONFIG_PARPORT_PC_SUPERIO is not set |
354 | # CONFIG_PARPORT_GSC is not set | 371 | # CONFIG_PARPORT_GSC is not set |
372 | # CONFIG_PARPORT_AX88796 is not set | ||
355 | # CONFIG_PARPORT_1284 is not set | 373 | # CONFIG_PARPORT_1284 is not set |
356 | 374 | ||
357 | # | 375 | # |
@@ -376,6 +394,7 @@ CONFIG_BLK_DEV_NBD=m | |||
376 | CONFIG_BLK_DEV_RAM=y | 394 | CONFIG_BLK_DEV_RAM=y |
377 | CONFIG_BLK_DEV_RAM_COUNT=16 | 395 | CONFIG_BLK_DEV_RAM_COUNT=16 |
378 | CONFIG_BLK_DEV_RAM_SIZE=65536 | 396 | CONFIG_BLK_DEV_RAM_SIZE=65536 |
397 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
379 | CONFIG_BLK_DEV_INITRD=y | 398 | CONFIG_BLK_DEV_INITRD=y |
380 | # CONFIG_CDROM_PKTCDVD is not set | 399 | # CONFIG_CDROM_PKTCDVD is not set |
381 | # CONFIG_ATA_OVER_ETH is not set | 400 | # CONFIG_ATA_OVER_ETH is not set |
@@ -487,6 +506,7 @@ CONFIG_SCSI_SAS_ATTRS=m | |||
487 | # CONFIG_MEGARAID_LEGACY is not set | 506 | # CONFIG_MEGARAID_LEGACY is not set |
488 | # CONFIG_MEGARAID_SAS is not set | 507 | # CONFIG_MEGARAID_SAS is not set |
489 | # CONFIG_SCSI_SATA is not set | 508 | # CONFIG_SCSI_SATA is not set |
509 | # CONFIG_SCSI_HPTIOP is not set | ||
490 | # CONFIG_SCSI_BUSLOGIC is not set | 510 | # CONFIG_SCSI_BUSLOGIC is not set |
491 | # CONFIG_SCSI_DMX3191D is not set | 511 | # CONFIG_SCSI_DMX3191D is not set |
492 | # CONFIG_SCSI_EATA is not set | 512 | # CONFIG_SCSI_EATA is not set |
@@ -508,12 +528,6 @@ CONFIG_SCSI_IPR_TRACE=y | |||
508 | CONFIG_SCSI_IPR_DUMP=y | 528 | CONFIG_SCSI_IPR_DUMP=y |
509 | # CONFIG_SCSI_QLOGIC_1280 is not set | 529 | # CONFIG_SCSI_QLOGIC_1280 is not set |
510 | CONFIG_SCSI_QLA_FC=m | 530 | CONFIG_SCSI_QLA_FC=m |
511 | CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE=y | ||
512 | CONFIG_SCSI_QLA21XX=m | ||
513 | CONFIG_SCSI_QLA22XX=m | ||
514 | CONFIG_SCSI_QLA2300=m | ||
515 | CONFIG_SCSI_QLA2322=m | ||
516 | CONFIG_SCSI_QLA24XX=m | ||
517 | CONFIG_SCSI_LPFC=m | 531 | CONFIG_SCSI_LPFC=m |
518 | # CONFIG_SCSI_DC395x is not set | 532 | # CONFIG_SCSI_DC395x is not set |
519 | # CONFIG_SCSI_DC390T is not set | 533 | # CONFIG_SCSI_DC390T is not set |
@@ -528,9 +542,7 @@ CONFIG_MD_LINEAR=y | |||
528 | CONFIG_MD_RAID0=y | 542 | CONFIG_MD_RAID0=y |
529 | CONFIG_MD_RAID1=y | 543 | CONFIG_MD_RAID1=y |
530 | CONFIG_MD_RAID10=m | 544 | CONFIG_MD_RAID10=m |
531 | CONFIG_MD_RAID5=y | 545 | # CONFIG_MD_RAID456 is not set |
532 | CONFIG_MD_RAID5_RESHAPE=y | ||
533 | CONFIG_MD_RAID6=m | ||
534 | CONFIG_MD_MULTIPATH=m | 546 | CONFIG_MD_MULTIPATH=m |
535 | CONFIG_MD_FAULTY=m | 547 | CONFIG_MD_FAULTY=m |
536 | CONFIG_BLK_DEV_DM=y | 548 | CONFIG_BLK_DEV_DM=y |
@@ -651,6 +663,7 @@ CONFIG_IXGB=m | |||
651 | # CONFIG_IXGB_NAPI is not set | 663 | # CONFIG_IXGB_NAPI is not set |
652 | CONFIG_S2IO=m | 664 | CONFIG_S2IO=m |
653 | # CONFIG_S2IO_NAPI is not set | 665 | # CONFIG_S2IO_NAPI is not set |
666 | # CONFIG_MYRI10GE is not set | ||
654 | 667 | ||
655 | # | 668 | # |
656 | # Token Ring devices | 669 | # Token Ring devices |
@@ -754,6 +767,7 @@ CONFIG_SERIO_LIBPS2=y | |||
754 | CONFIG_VT=y | 767 | CONFIG_VT=y |
755 | CONFIG_VT_CONSOLE=y | 768 | CONFIG_VT_CONSOLE=y |
756 | CONFIG_HW_CONSOLE=y | 769 | CONFIG_HW_CONSOLE=y |
770 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
757 | # CONFIG_SERIAL_NONSTANDARD is not set | 771 | # CONFIG_SERIAL_NONSTANDARD is not set |
758 | 772 | ||
759 | # | 773 | # |
@@ -776,6 +790,7 @@ CONFIG_SERIAL_JSM=m | |||
776 | CONFIG_UNIX98_PTYS=y | 790 | CONFIG_UNIX98_PTYS=y |
777 | CONFIG_LEGACY_PTYS=y | 791 | CONFIG_LEGACY_PTYS=y |
778 | CONFIG_LEGACY_PTY_COUNT=256 | 792 | CONFIG_LEGACY_PTY_COUNT=256 |
793 | # CONFIG_BRIQ_PANEL is not set | ||
779 | # CONFIG_PRINTER is not set | 794 | # CONFIG_PRINTER is not set |
780 | # CONFIG_PPDEV is not set | 795 | # CONFIG_PPDEV is not set |
781 | # CONFIG_TIPAR is not set | 796 | # CONFIG_TIPAR is not set |
@@ -793,6 +808,7 @@ CONFIG_HVCS=m | |||
793 | # Watchdog Cards | 808 | # Watchdog Cards |
794 | # | 809 | # |
795 | # CONFIG_WATCHDOG is not set | 810 | # CONFIG_WATCHDOG is not set |
811 | # CONFIG_HW_RANDOM is not set | ||
796 | CONFIG_GEN_RTC=y | 812 | CONFIG_GEN_RTC=y |
797 | # CONFIG_GEN_RTC_X is not set | 813 | # CONFIG_GEN_RTC_X is not set |
798 | # CONFIG_DTLK is not set | 814 | # CONFIG_DTLK is not set |
@@ -839,6 +855,7 @@ CONFIG_I2C_ALGOBIT=y | |||
839 | # CONFIG_I2C_I810 is not set | 855 | # CONFIG_I2C_I810 is not set |
840 | # CONFIG_I2C_PIIX4 is not set | 856 | # CONFIG_I2C_PIIX4 is not set |
841 | # CONFIG_I2C_NFORCE2 is not set | 857 | # CONFIG_I2C_NFORCE2 is not set |
858 | # CONFIG_I2C_OCORES is not set | ||
842 | # CONFIG_I2C_PARPORT is not set | 859 | # CONFIG_I2C_PARPORT is not set |
843 | # CONFIG_I2C_PARPORT_LIGHT is not set | 860 | # CONFIG_I2C_PARPORT_LIGHT is not set |
844 | # CONFIG_I2C_PROSAVAGE is not set | 861 | # CONFIG_I2C_PROSAVAGE is not set |
@@ -876,7 +893,6 @@ CONFIG_I2C_ALGOBIT=y | |||
876 | # | 893 | # |
877 | # Dallas's 1-wire bus | 894 | # Dallas's 1-wire bus |
878 | # | 895 | # |
879 | # CONFIG_W1 is not set | ||
880 | 896 | ||
881 | # | 897 | # |
882 | # Hardware Monitoring support | 898 | # Hardware Monitoring support |
@@ -892,6 +908,7 @@ CONFIG_I2C_ALGOBIT=y | |||
892 | # Multimedia devices | 908 | # Multimedia devices |
893 | # | 909 | # |
894 | # CONFIG_VIDEO_DEV is not set | 910 | # CONFIG_VIDEO_DEV is not set |
911 | CONFIG_VIDEO_V4L2=y | ||
895 | 912 | ||
896 | # | 913 | # |
897 | # Digital Video Broadcasting Devices | 914 | # Digital Video Broadcasting Devices |
@@ -902,19 +919,19 @@ CONFIG_I2C_ALGOBIT=y | |||
902 | # | 919 | # |
903 | # Graphics support | 920 | # Graphics support |
904 | # | 921 | # |
922 | CONFIG_FIRMWARE_EDID=y | ||
905 | CONFIG_FB=y | 923 | CONFIG_FB=y |
906 | CONFIG_FB_CFB_FILLRECT=y | 924 | CONFIG_FB_CFB_FILLRECT=y |
907 | CONFIG_FB_CFB_COPYAREA=y | 925 | CONFIG_FB_CFB_COPYAREA=y |
908 | CONFIG_FB_CFB_IMAGEBLIT=y | 926 | CONFIG_FB_CFB_IMAGEBLIT=y |
909 | CONFIG_FB_MACMODES=y | 927 | CONFIG_FB_MACMODES=y |
910 | CONFIG_FB_FIRMWARE_EDID=y | 928 | # CONFIG_FB_BACKLIGHT is not set |
911 | CONFIG_FB_MODE_HELPERS=y | 929 | CONFIG_FB_MODE_HELPERS=y |
912 | CONFIG_FB_TILEBLITTING=y | 930 | CONFIG_FB_TILEBLITTING=y |
913 | # CONFIG_FB_CIRRUS is not set | 931 | # CONFIG_FB_CIRRUS is not set |
914 | # CONFIG_FB_PM2 is not set | 932 | # CONFIG_FB_PM2 is not set |
915 | # CONFIG_FB_CYBER2000 is not set | 933 | # CONFIG_FB_CYBER2000 is not set |
916 | CONFIG_FB_OF=y | 934 | CONFIG_FB_OF=y |
917 | # CONFIG_FB_CT65550 is not set | ||
918 | # CONFIG_FB_ASILIANT is not set | 935 | # CONFIG_FB_ASILIANT is not set |
919 | # CONFIG_FB_IMSTT is not set | 936 | # CONFIG_FB_IMSTT is not set |
920 | # CONFIG_FB_VGA16 is not set | 937 | # CONFIG_FB_VGA16 is not set |
@@ -993,6 +1010,7 @@ CONFIG_USB_DEVICEFS=y | |||
993 | CONFIG_USB_EHCI_HCD=y | 1010 | CONFIG_USB_EHCI_HCD=y |
994 | # CONFIG_USB_EHCI_SPLIT_ISO is not set | 1011 | # CONFIG_USB_EHCI_SPLIT_ISO is not set |
995 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | 1012 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set |
1013 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | ||
996 | # CONFIG_USB_ISP116X_HCD is not set | 1014 | # CONFIG_USB_ISP116X_HCD is not set |
997 | CONFIG_USB_OHCI_HCD=y | 1015 | CONFIG_USB_OHCI_HCD=y |
998 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set | 1016 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set |
@@ -1083,10 +1101,12 @@ CONFIG_USB_MON=y | |||
1083 | # CONFIG_USB_LEGOTOWER is not set | 1101 | # CONFIG_USB_LEGOTOWER is not set |
1084 | # CONFIG_USB_LCD is not set | 1102 | # CONFIG_USB_LCD is not set |
1085 | # CONFIG_USB_LED is not set | 1103 | # CONFIG_USB_LED is not set |
1104 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
1086 | # CONFIG_USB_CYTHERM is not set | 1105 | # CONFIG_USB_CYTHERM is not set |
1087 | # CONFIG_USB_PHIDGETKIT is not set | 1106 | # CONFIG_USB_PHIDGETKIT is not set |
1088 | # CONFIG_USB_PHIDGETSERVO is not set | 1107 | # CONFIG_USB_PHIDGETSERVO is not set |
1089 | # CONFIG_USB_IDMOUSE is not set | 1108 | # CONFIG_USB_IDMOUSE is not set |
1109 | # CONFIG_USB_APPLEDISPLAY is not set | ||
1090 | # CONFIG_USB_SISUSBVGA is not set | 1110 | # CONFIG_USB_SISUSBVGA is not set |
1091 | # CONFIG_USB_LD is not set | 1111 | # CONFIG_USB_LD is not set |
1092 | # CONFIG_USB_TEST is not set | 1112 | # CONFIG_USB_TEST is not set |
@@ -1124,12 +1144,14 @@ CONFIG_USB_MON=y | |||
1124 | CONFIG_INFINIBAND=m | 1144 | CONFIG_INFINIBAND=m |
1125 | CONFIG_INFINIBAND_USER_MAD=m | 1145 | CONFIG_INFINIBAND_USER_MAD=m |
1126 | CONFIG_INFINIBAND_USER_ACCESS=m | 1146 | CONFIG_INFINIBAND_USER_ACCESS=m |
1147 | CONFIG_INFINIBAND_ADDR_TRANS=y | ||
1127 | CONFIG_INFINIBAND_MTHCA=m | 1148 | CONFIG_INFINIBAND_MTHCA=m |
1128 | CONFIG_INFINIBAND_MTHCA_DEBUG=y | 1149 | CONFIG_INFINIBAND_MTHCA_DEBUG=y |
1129 | CONFIG_INFINIBAND_IPOIB=m | 1150 | CONFIG_INFINIBAND_IPOIB=m |
1130 | CONFIG_INFINIBAND_IPOIB_DEBUG=y | 1151 | CONFIG_INFINIBAND_IPOIB_DEBUG=y |
1131 | # CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set | 1152 | # CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set |
1132 | CONFIG_INFINIBAND_SRP=m | 1153 | CONFIG_INFINIBAND_SRP=m |
1154 | # CONFIG_INFINIBAND_ISER is not set | ||
1133 | 1155 | ||
1134 | # | 1156 | # |
1135 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) | 1157 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) |
@@ -1141,6 +1163,19 @@ CONFIG_INFINIBAND_SRP=m | |||
1141 | # CONFIG_RTC_CLASS is not set | 1163 | # CONFIG_RTC_CLASS is not set |
1142 | 1164 | ||
1143 | # | 1165 | # |
1166 | # DMA Engine support | ||
1167 | # | ||
1168 | # CONFIG_DMA_ENGINE is not set | ||
1169 | |||
1170 | # | ||
1171 | # DMA Clients | ||
1172 | # | ||
1173 | |||
1174 | # | ||
1175 | # DMA Devices | ||
1176 | # | ||
1177 | |||
1178 | # | ||
1144 | # File systems | 1179 | # File systems |
1145 | # | 1180 | # |
1146 | CONFIG_EXT2_FS=y | 1181 | CONFIG_EXT2_FS=y |
@@ -1169,15 +1204,16 @@ CONFIG_JFS_SECURITY=y | |||
1169 | # CONFIG_JFS_STATISTICS is not set | 1204 | # CONFIG_JFS_STATISTICS is not set |
1170 | CONFIG_FS_POSIX_ACL=y | 1205 | CONFIG_FS_POSIX_ACL=y |
1171 | CONFIG_XFS_FS=m | 1206 | CONFIG_XFS_FS=m |
1172 | CONFIG_XFS_EXPORT=y | ||
1173 | # CONFIG_XFS_QUOTA is not set | 1207 | # CONFIG_XFS_QUOTA is not set |
1174 | CONFIG_XFS_SECURITY=y | 1208 | CONFIG_XFS_SECURITY=y |
1175 | CONFIG_XFS_POSIX_ACL=y | 1209 | CONFIG_XFS_POSIX_ACL=y |
1176 | # CONFIG_XFS_RT is not set | 1210 | # CONFIG_XFS_RT is not set |
1177 | CONFIG_OCFS2_FS=m | 1211 | CONFIG_OCFS2_FS=m |
1212 | CONFIG_OCFS2_DEBUG_MASKLOG=y | ||
1178 | # CONFIG_MINIX_FS is not set | 1213 | # CONFIG_MINIX_FS is not set |
1179 | # CONFIG_ROMFS_FS is not set | 1214 | # CONFIG_ROMFS_FS is not set |
1180 | CONFIG_INOTIFY=y | 1215 | CONFIG_INOTIFY=y |
1216 | CONFIG_INOTIFY_USER=y | ||
1181 | # CONFIG_QUOTA is not set | 1217 | # CONFIG_QUOTA is not set |
1182 | CONFIG_DNOTIFY=y | 1218 | CONFIG_DNOTIFY=y |
1183 | # CONFIG_AUTOFS_FS is not set | 1219 | # CONFIG_AUTOFS_FS is not set |
@@ -1259,8 +1295,10 @@ CONFIG_RPCSEC_GSS_SPKM3=m | |||
1259 | # CONFIG_SMB_FS is not set | 1295 | # CONFIG_SMB_FS is not set |
1260 | CONFIG_CIFS=m | 1296 | CONFIG_CIFS=m |
1261 | # CONFIG_CIFS_STATS is not set | 1297 | # CONFIG_CIFS_STATS is not set |
1298 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
1262 | CONFIG_CIFS_XATTR=y | 1299 | CONFIG_CIFS_XATTR=y |
1263 | CONFIG_CIFS_POSIX=y | 1300 | CONFIG_CIFS_POSIX=y |
1301 | # CONFIG_CIFS_DEBUG2 is not set | ||
1264 | # CONFIG_CIFS_EXPERIMENTAL is not set | 1302 | # CONFIG_CIFS_EXPERIMENTAL is not set |
1265 | # CONFIG_NCP_FS is not set | 1303 | # CONFIG_NCP_FS is not set |
1266 | # CONFIG_CODA_FS is not set | 1304 | # CONFIG_CODA_FS is not set |
@@ -1326,6 +1364,9 @@ CONFIG_CRC32=y | |||
1326 | CONFIG_LIBCRC32C=m | 1364 | CONFIG_LIBCRC32C=m |
1327 | CONFIG_ZLIB_INFLATE=y | 1365 | CONFIG_ZLIB_INFLATE=y |
1328 | CONFIG_ZLIB_DEFLATE=m | 1366 | CONFIG_ZLIB_DEFLATE=m |
1367 | CONFIG_TEXTSEARCH=y | ||
1368 | CONFIG_TEXTSEARCH_KMP=m | ||
1369 | CONFIG_PLIST=y | ||
1329 | 1370 | ||
1330 | # | 1371 | # |
1331 | # Instrumentation Support | 1372 | # Instrumentation Support |
@@ -1339,14 +1380,19 @@ CONFIG_KPROBES=y | |||
1339 | # | 1380 | # |
1340 | # CONFIG_PRINTK_TIME is not set | 1381 | # CONFIG_PRINTK_TIME is not set |
1341 | CONFIG_MAGIC_SYSRQ=y | 1382 | CONFIG_MAGIC_SYSRQ=y |
1383 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1342 | CONFIG_DEBUG_KERNEL=y | 1384 | CONFIG_DEBUG_KERNEL=y |
1343 | CONFIG_LOG_BUF_SHIFT=17 | 1385 | CONFIG_LOG_BUF_SHIFT=17 |
1344 | CONFIG_DETECT_SOFTLOCKUP=y | 1386 | CONFIG_DETECT_SOFTLOCKUP=y |
1345 | # CONFIG_SCHEDSTATS is not set | 1387 | # CONFIG_SCHEDSTATS is not set |
1346 | # CONFIG_DEBUG_SLAB is not set | 1388 | # CONFIG_DEBUG_SLAB is not set |
1347 | # CONFIG_DEBUG_MUTEXES is not set | 1389 | # CONFIG_DEBUG_RT_MUTEXES is not set |
1390 | # CONFIG_RT_MUTEX_TESTER is not set | ||
1348 | # CONFIG_DEBUG_SPINLOCK is not set | 1391 | # CONFIG_DEBUG_SPINLOCK is not set |
1392 | # CONFIG_DEBUG_MUTEXES is not set | ||
1393 | # CONFIG_DEBUG_RWSEMS is not set | ||
1349 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 1394 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
1395 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
1350 | # CONFIG_DEBUG_KOBJECT is not set | 1396 | # CONFIG_DEBUG_KOBJECT is not set |
1351 | # CONFIG_DEBUG_INFO is not set | 1397 | # CONFIG_DEBUG_INFO is not set |
1352 | CONFIG_DEBUG_FS=y | 1398 | CONFIG_DEBUG_FS=y |
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 814f242aeb8c..956c2e5564b7 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
@@ -67,9 +67,9 @@ pci64-$(CONFIG_PPC64) += pci_64.o pci_dn.o pci_iommu.o \ | |||
67 | pci_direct_iommu.o iomap.o | 67 | pci_direct_iommu.o iomap.o |
68 | pci32-$(CONFIG_PPC32) := pci_32.o | 68 | pci32-$(CONFIG_PPC32) := pci_32.o |
69 | obj-$(CONFIG_PCI) += $(pci64-y) $(pci32-y) | 69 | obj-$(CONFIG_PCI) += $(pci64-y) $(pci32-y) |
70 | kexec-$(CONFIG_PPC64) := machine_kexec_64.o crash.o | 70 | kexec-$(CONFIG_PPC64) := machine_kexec_64.o |
71 | kexec-$(CONFIG_PPC32) := machine_kexec_32.o | 71 | kexec-$(CONFIG_PPC32) := machine_kexec_32.o |
72 | obj-$(CONFIG_KEXEC) += machine_kexec.o $(kexec-y) | 72 | obj-$(CONFIG_KEXEC) += machine_kexec.o crash.o $(kexec-y) |
73 | 73 | ||
74 | ifeq ($(CONFIG_PPC_ISERIES),y) | 74 | ifeq ($(CONFIG_PPC_ISERIES),y) |
75 | $(obj)/head_64.o: $(obj)/lparmap.s | 75 | $(obj)/head_64.o: $(obj)/lparmap.s |
diff --git a/arch/powerpc/kernel/cpu_setup_power4.S b/arch/powerpc/kernel/cpu_setup_power4.S index f69af2c5d7b3..76e97aa71c45 100644 --- a/arch/powerpc/kernel/cpu_setup_power4.S +++ b/arch/powerpc/kernel/cpu_setup_power4.S | |||
@@ -76,6 +76,8 @@ _GLOBAL(__setup_cpu_ppc970) | |||
76 | mfspr r0,SPRN_HID0 | 76 | mfspr r0,SPRN_HID0 |
77 | li r11,5 /* clear DOZE and SLEEP */ | 77 | li r11,5 /* clear DOZE and SLEEP */ |
78 | rldimi r0,r11,52,8 /* set NAP and DPM */ | 78 | rldimi r0,r11,52,8 /* set NAP and DPM */ |
79 | li r11,0 | ||
80 | rldimi r0,r11,32,31 /* clear EN_ATTN */ | ||
79 | mtspr SPRN_HID0,r0 | 81 | mtspr SPRN_HID0,r0 |
80 | mfspr r0,SPRN_HID0 | 82 | mfspr r0,SPRN_HID0 |
81 | mfspr r0,SPRN_HID0 | 83 | mfspr r0,SPRN_HID0 |
diff --git a/arch/powerpc/kernel/crash.c b/arch/powerpc/kernel/crash.c index 358cecdc6aef..f04c18e08b8b 100644 --- a/arch/powerpc/kernel/crash.c +++ b/arch/powerpc/kernel/crash.c | |||
@@ -44,6 +44,7 @@ | |||
44 | /* This keeps a track of which one is crashing cpu. */ | 44 | /* This keeps a track of which one is crashing cpu. */ |
45 | int crashing_cpu = -1; | 45 | int crashing_cpu = -1; |
46 | static cpumask_t cpus_in_crash = CPU_MASK_NONE; | 46 | static cpumask_t cpus_in_crash = CPU_MASK_NONE; |
47 | cpumask_t cpus_in_sr = CPU_MASK_NONE; | ||
47 | 48 | ||
48 | static u32 *append_elf_note(u32 *buf, char *name, unsigned type, void *data, | 49 | static u32 *append_elf_note(u32 *buf, char *name, unsigned type, void *data, |
49 | size_t data_len) | 50 | size_t data_len) |
@@ -139,7 +140,13 @@ void crash_ipi_callback(struct pt_regs *regs) | |||
139 | 140 | ||
140 | if (ppc_md.kexec_cpu_down) | 141 | if (ppc_md.kexec_cpu_down) |
141 | ppc_md.kexec_cpu_down(1, 1); | 142 | ppc_md.kexec_cpu_down(1, 1); |
143 | |||
144 | #ifdef CONFIG_PPC64 | ||
142 | kexec_smp_wait(); | 145 | kexec_smp_wait(); |
146 | #else | ||
147 | for (;;); /* FIXME */ | ||
148 | #endif | ||
149 | |||
143 | /* NOTREACHED */ | 150 | /* NOTREACHED */ |
144 | } | 151 | } |
145 | 152 | ||
@@ -255,7 +262,11 @@ static void crash_kexec_prepare_cpus(int cpu) | |||
255 | * | 262 | * |
256 | * do this if kexec in setup.c ? | 263 | * do this if kexec in setup.c ? |
257 | */ | 264 | */ |
265 | #ifdef CONFIG_PPC64 | ||
258 | smp_release_cpus(); | 266 | smp_release_cpus(); |
267 | #else | ||
268 | /* FIXME */ | ||
269 | #endif | ||
259 | } | 270 | } |
260 | 271 | ||
261 | void crash_kexec_secondary(struct pt_regs *regs) | 272 | void crash_kexec_secondary(struct pt_regs *regs) |
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index e16eb2a33173..6ff3cf506088 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
@@ -191,6 +191,37 @@ exception_marker: | |||
191 | ori reg,reg,(label)@l; /* virt addr of handler ... */ | 191 | ori reg,reg,(label)@l; /* virt addr of handler ... */ |
192 | #endif | 192 | #endif |
193 | 193 | ||
194 | /* | ||
195 | * Equal to EXCEPTION_PROLOG_PSERIES, except that it forces 64bit mode. | ||
196 | * The firmware calls the registered system_reset_fwnmi and | ||
197 | * machine_check_fwnmi handlers in 32bit mode if the cpu happens to run | ||
198 | * a 32bit application at the time of the event. | ||
199 | * This firmware bug is present on POWER4 and JS20. | ||
200 | */ | ||
201 | #define EXCEPTION_PROLOG_PSERIES_FORCE_64BIT(area, label) \ | ||
202 | mfspr r13,SPRN_SPRG3; /* get paca address into r13 */ \ | ||
203 | std r9,area+EX_R9(r13); /* save r9 - r12 */ \ | ||
204 | std r10,area+EX_R10(r13); \ | ||
205 | std r11,area+EX_R11(r13); \ | ||
206 | std r12,area+EX_R12(r13); \ | ||
207 | mfspr r9,SPRN_SPRG1; \ | ||
208 | std r9,area+EX_R13(r13); \ | ||
209 | mfcr r9; \ | ||
210 | clrrdi r12,r13,32; /* get high part of &label */ \ | ||
211 | mfmsr r10; \ | ||
212 | /* force 64bit mode */ \ | ||
213 | li r11,5; /* MSR_SF_LG|MSR_ISF_LG */ \ | ||
214 | rldimi r10,r11,61,0; /* insert into top 3 bits */ \ | ||
215 | /* done 64bit mode */ \ | ||
216 | mfspr r11,SPRN_SRR0; /* save SRR0 */ \ | ||
217 | LOAD_HANDLER(r12,label) \ | ||
218 | ori r10,r10,MSR_IR|MSR_DR|MSR_RI; \ | ||
219 | mtspr SPRN_SRR0,r12; \ | ||
220 | mfspr r12,SPRN_SRR1; /* and SRR1 */ \ | ||
221 | mtspr SPRN_SRR1,r10; \ | ||
222 | rfid; \ | ||
223 | b . /* prevent speculative execution */ | ||
224 | |||
194 | #define EXCEPTION_PROLOG_PSERIES(area, label) \ | 225 | #define EXCEPTION_PROLOG_PSERIES(area, label) \ |
195 | mfspr r13,SPRN_SPRG3; /* get paca address into r13 */ \ | 226 | mfspr r13,SPRN_SPRG3; /* get paca address into r13 */ \ |
196 | std r9,area+EX_R9(r13); /* save r9 - r12 */ \ | 227 | std r9,area+EX_R9(r13); /* save r9 - r12 */ \ |
@@ -604,14 +635,14 @@ slb_miss_user_pseries: | |||
604 | system_reset_fwnmi: | 635 | system_reset_fwnmi: |
605 | HMT_MEDIUM | 636 | HMT_MEDIUM |
606 | mtspr SPRN_SPRG1,r13 /* save r13 */ | 637 | mtspr SPRN_SPRG1,r13 /* save r13 */ |
607 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common) | 638 | EXCEPTION_PROLOG_PSERIES_FORCE_64BIT(PACA_EXGEN, system_reset_common) |
608 | 639 | ||
609 | .globl machine_check_fwnmi | 640 | .globl machine_check_fwnmi |
610 | .align 7 | 641 | .align 7 |
611 | machine_check_fwnmi: | 642 | machine_check_fwnmi: |
612 | HMT_MEDIUM | 643 | HMT_MEDIUM |
613 | mtspr SPRN_SPRG1,r13 /* save r13 */ | 644 | mtspr SPRN_SPRG1,r13 /* save r13 */ |
614 | EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common) | 645 | EXCEPTION_PROLOG_PSERIES_FORCE_64BIT(PACA_EXMC, machine_check_common) |
615 | 646 | ||
616 | #ifdef CONFIG_PPC_ISERIES | 647 | #ifdef CONFIG_PPC_ISERIES |
617 | /*** ISeries-LPAR interrupt handlers ***/ | 648 | /*** ISeries-LPAR interrupt handlers ***/ |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 01bdae35cb55..7ee685433319 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -693,7 +693,7 @@ unsigned int irq_radix_revmap(struct irq_host *host, | |||
693 | /* If not there, try to insert it */ | 693 | /* If not there, try to insert it */ |
694 | virq = irq_find_mapping(host, hwirq); | 694 | virq = irq_find_mapping(host, hwirq); |
695 | if (virq != NO_IRQ) | 695 | if (virq != NO_IRQ) |
696 | radix_tree_insert(tree, virq, &irq_map[virq]); | 696 | radix_tree_insert(tree, hwirq, &irq_map[virq]); |
697 | bail: | 697 | bail: |
698 | spin_unlock_irqrestore(&irq_big_lock, flags); | 698 | spin_unlock_irqrestore(&irq_big_lock, flags); |
699 | return virq; | 699 | return virq; |
diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c index 9f0898c89759..cd65c367b8b6 100644 --- a/arch/powerpc/kernel/kprobes.c +++ b/arch/powerpc/kernel/kprobes.c | |||
@@ -61,6 +61,8 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p) | |||
61 | if (!ret) { | 61 | if (!ret) { |
62 | memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t)); | 62 | memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t)); |
63 | p->opcode = *p->addr; | 63 | p->opcode = *p->addr; |
64 | flush_icache_range((unsigned long)p->ainsn.insn, | ||
65 | (unsigned long)p->ainsn.insn + sizeof(kprobe_opcode_t)); | ||
64 | } | 66 | } |
65 | 67 | ||
66 | return ret; | 68 | return ret; |
diff --git a/arch/powerpc/kernel/legacy_serial.c b/arch/powerpc/kernel/legacy_serial.c index 7e98e778b52f..359ab89748e0 100644 --- a/arch/powerpc/kernel/legacy_serial.c +++ b/arch/powerpc/kernel/legacy_serial.c | |||
@@ -112,7 +112,7 @@ static int __init add_legacy_port(struct device_node *np, int want_index, | |||
112 | static int __init add_legacy_soc_port(struct device_node *np, | 112 | static int __init add_legacy_soc_port(struct device_node *np, |
113 | struct device_node *soc_dev) | 113 | struct device_node *soc_dev) |
114 | { | 114 | { |
115 | phys_addr_t addr; | 115 | u64 addr; |
116 | u32 *addrp; | 116 | u32 *addrp; |
117 | upf_t flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ; | 117 | upf_t flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ; |
118 | 118 | ||
@@ -143,7 +143,7 @@ static int __init add_legacy_isa_port(struct device_node *np, | |||
143 | u32 *reg; | 143 | u32 *reg; |
144 | char *typep; | 144 | char *typep; |
145 | int index = -1; | 145 | int index = -1; |
146 | phys_addr_t taddr; | 146 | u64 taddr; |
147 | 147 | ||
148 | DBG(" -> add_legacy_isa_port(%s)\n", np->full_name); | 148 | DBG(" -> add_legacy_isa_port(%s)\n", np->full_name); |
149 | 149 | ||
@@ -165,10 +165,13 @@ static int __init add_legacy_isa_port(struct device_node *np, | |||
165 | if (typep && *typep == 'S') | 165 | if (typep && *typep == 'S') |
166 | index = simple_strtol(typep+1, NULL, 0) - 1; | 166 | index = simple_strtol(typep+1, NULL, 0) - 1; |
167 | 167 | ||
168 | /* Translate ISA address */ | 168 | /* Translate ISA address. If it fails, we still register the port |
169 | * with no translated address so that it can be picked up as an IO | ||
170 | * port later by the serial driver | ||
171 | */ | ||
169 | taddr = of_translate_address(np, reg); | 172 | taddr = of_translate_address(np, reg); |
170 | if (taddr == OF_BAD_ADDR) | 173 | if (taddr == OF_BAD_ADDR) |
171 | return -1; | 174 | taddr = 0; |
172 | 175 | ||
173 | /* Add port, irq will be dealt with later */ | 176 | /* Add port, irq will be dealt with later */ |
174 | return add_legacy_port(np, index, UPIO_PORT, reg[1], taddr, | 177 | return add_legacy_port(np, index, UPIO_PORT, reg[1], taddr, |
@@ -180,7 +183,7 @@ static int __init add_legacy_isa_port(struct device_node *np, | |||
180 | static int __init add_legacy_pci_port(struct device_node *np, | 183 | static int __init add_legacy_pci_port(struct device_node *np, |
181 | struct device_node *pci_dev) | 184 | struct device_node *pci_dev) |
182 | { | 185 | { |
183 | phys_addr_t addr, base; | 186 | u64 addr, base; |
184 | u32 *addrp; | 187 | u32 *addrp; |
185 | unsigned int flags; | 188 | unsigned int flags; |
186 | int iotype, index = -1, lindex = 0; | 189 | int iotype, index = -1, lindex = 0; |
diff --git a/arch/powerpc/kernel/machine_kexec.c b/arch/powerpc/kernel/machine_kexec.c index a81ca1b841ec..e60a0c544d63 100644 --- a/arch/powerpc/kernel/machine_kexec.c +++ b/arch/powerpc/kernel/machine_kexec.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/reboot.h> | 13 | #include <linux/reboot.h> |
14 | #include <linux/threads.h> | 14 | #include <linux/threads.h> |
15 | #include <asm/machdep.h> | 15 | #include <asm/machdep.h> |
16 | #include <asm/lmb.h> | ||
16 | 17 | ||
17 | void machine_crash_shutdown(struct pt_regs *regs) | 18 | void machine_crash_shutdown(struct pt_regs *regs) |
18 | { | 19 | { |
@@ -59,3 +60,58 @@ NORET_TYPE void machine_kexec(struct kimage *image) | |||
59 | } | 60 | } |
60 | for(;;); | 61 | for(;;); |
61 | } | 62 | } |
63 | |||
64 | static int __init early_parse_crashk(char *p) | ||
65 | { | ||
66 | unsigned long size; | ||
67 | |||
68 | if (!p) | ||
69 | return 1; | ||
70 | |||
71 | size = memparse(p, &p); | ||
72 | |||
73 | if (*p == '@') | ||
74 | crashk_res.start = memparse(p + 1, &p); | ||
75 | else | ||
76 | crashk_res.start = KDUMP_KERNELBASE; | ||
77 | |||
78 | crashk_res.end = crashk_res.start + size - 1; | ||
79 | |||
80 | return 0; | ||
81 | } | ||
82 | early_param("crashkernel", early_parse_crashk); | ||
83 | |||
84 | void __init reserve_crashkernel(void) | ||
85 | { | ||
86 | unsigned long size; | ||
87 | |||
88 | if (crashk_res.start == 0) | ||
89 | return; | ||
90 | |||
91 | /* We might have got these values via the command line or the | ||
92 | * device tree, either way sanitise them now. */ | ||
93 | |||
94 | size = crashk_res.end - crashk_res.start + 1; | ||
95 | |||
96 | if (crashk_res.start != KDUMP_KERNELBASE) | ||
97 | printk("Crash kernel location must be 0x%x\n", | ||
98 | KDUMP_KERNELBASE); | ||
99 | |||
100 | crashk_res.start = KDUMP_KERNELBASE; | ||
101 | size = PAGE_ALIGN(size); | ||
102 | crashk_res.end = crashk_res.start + size - 1; | ||
103 | |||
104 | /* Crash kernel trumps memory limit */ | ||
105 | if (memory_limit && memory_limit <= crashk_res.end) { | ||
106 | memory_limit = crashk_res.end + 1; | ||
107 | printk("Adjusted memory limit for crashkernel, now 0x%lx\n", | ||
108 | memory_limit); | ||
109 | } | ||
110 | |||
111 | lmb_reserve(crashk_res.start, size); | ||
112 | } | ||
113 | |||
114 | int overlaps_crashkernel(unsigned long start, unsigned long size) | ||
115 | { | ||
116 | return (start + size) > crashk_res.start && start <= crashk_res.end; | ||
117 | } | ||
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c index b438d45a068c..be58985c7681 100644 --- a/arch/powerpc/kernel/machine_kexec_64.c +++ b/arch/powerpc/kernel/machine_kexec_64.c | |||
@@ -10,7 +10,6 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | 12 | ||
13 | #include <linux/cpumask.h> | ||
14 | #include <linux/kexec.h> | 13 | #include <linux/kexec.h> |
15 | #include <linux/smp.h> | 14 | #include <linux/smp.h> |
16 | #include <linux/thread_info.h> | 15 | #include <linux/thread_info.h> |
@@ -21,7 +20,6 @@ | |||
21 | #include <asm/machdep.h> | 20 | #include <asm/machdep.h> |
22 | #include <asm/cacheflush.h> | 21 | #include <asm/cacheflush.h> |
23 | #include <asm/paca.h> | 22 | #include <asm/paca.h> |
24 | #include <asm/lmb.h> | ||
25 | #include <asm/mmu.h> | 23 | #include <asm/mmu.h> |
26 | #include <asm/sections.h> /* _end */ | 24 | #include <asm/sections.h> /* _end */ |
27 | #include <asm/prom.h> | 25 | #include <asm/prom.h> |
@@ -385,58 +383,3 @@ static int __init kexec_setup(void) | |||
385 | return 0; | 383 | return 0; |
386 | } | 384 | } |
387 | __initcall(kexec_setup); | 385 | __initcall(kexec_setup); |
388 | |||
389 | static int __init early_parse_crashk(char *p) | ||
390 | { | ||
391 | unsigned long size; | ||
392 | |||
393 | if (!p) | ||
394 | return 1; | ||
395 | |||
396 | size = memparse(p, &p); | ||
397 | |||
398 | if (*p == '@') | ||
399 | crashk_res.start = memparse(p + 1, &p); | ||
400 | else | ||
401 | crashk_res.start = KDUMP_KERNELBASE; | ||
402 | |||
403 | crashk_res.end = crashk_res.start + size - 1; | ||
404 | |||
405 | return 0; | ||
406 | } | ||
407 | early_param("crashkernel", early_parse_crashk); | ||
408 | |||
409 | void __init reserve_crashkernel(void) | ||
410 | { | ||
411 | unsigned long size; | ||
412 | |||
413 | if (crashk_res.start == 0) | ||
414 | return; | ||
415 | |||
416 | /* We might have got these values via the command line or the | ||
417 | * device tree, either way sanitise them now. */ | ||
418 | |||
419 | size = crashk_res.end - crashk_res.start + 1; | ||
420 | |||
421 | if (crashk_res.start != KDUMP_KERNELBASE) | ||
422 | printk("Crash kernel location must be 0x%x\n", | ||
423 | KDUMP_KERNELBASE); | ||
424 | |||
425 | crashk_res.start = KDUMP_KERNELBASE; | ||
426 | size = PAGE_ALIGN(size); | ||
427 | crashk_res.end = crashk_res.start + size - 1; | ||
428 | |||
429 | /* Crash kernel trumps memory limit */ | ||
430 | if (memory_limit && memory_limit <= crashk_res.end) { | ||
431 | memory_limit = crashk_res.end + 1; | ||
432 | printk("Adjusted memory limit for crashkernel, now 0x%lx\n", | ||
433 | memory_limit); | ||
434 | } | ||
435 | |||
436 | lmb_reserve(crashk_res.start, size); | ||
437 | } | ||
438 | |||
439 | int overlaps_crashkernel(unsigned long start, unsigned long size) | ||
440 | { | ||
441 | return (start + size) > crashk_res.start && start <= crashk_res.end; | ||
442 | } | ||
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index bfb407fc1aa1..e3ed21cd3d94 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
@@ -687,7 +687,7 @@ _GLOBAL(kexec_sequence) | |||
687 | /* clear out hardware hash page table and tlb */ | 687 | /* clear out hardware hash page table and tlb */ |
688 | ld r5,0(r27) /* deref function descriptor */ | 688 | ld r5,0(r27) /* deref function descriptor */ |
689 | mtctr r5 | 689 | mtctr r5 |
690 | bctrl /* ppc_md.hash_clear_all(void); */ | 690 | bctrl /* ppc_md.hpte_clear_all(void); */ |
691 | 691 | ||
692 | /* | 692 | /* |
693 | * kexec image calling is: | 693 | * kexec image calling is: |
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index ebd501a59abd..462bced40c12 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
@@ -557,7 +557,9 @@ unsigned long prom_memparse(const char *ptr, const char **retptr) | |||
557 | static void __init early_cmdline_parse(void) | 557 | static void __init early_cmdline_parse(void) |
558 | { | 558 | { |
559 | struct prom_t *_prom = &RELOC(prom); | 559 | struct prom_t *_prom = &RELOC(prom); |
560 | #ifdef CONFIG_PPC64 | ||
560 | const char *opt; | 561 | const char *opt; |
562 | #endif | ||
561 | char *p; | 563 | char *p; |
562 | int l = 0; | 564 | int l = 0; |
563 | 565 | ||
@@ -2030,6 +2032,39 @@ static void __init fixup_device_tree_maple(void) | |||
2030 | #define fixup_device_tree_maple() | 2032 | #define fixup_device_tree_maple() |
2031 | #endif | 2033 | #endif |
2032 | 2034 | ||
2035 | #ifdef CONFIG_PPC_CHRP | ||
2036 | /* Pegasos lacks the "ranges" property in the isa node */ | ||
2037 | static void __init fixup_device_tree_chrp(void) | ||
2038 | { | ||
2039 | phandle isa; | ||
2040 | u32 isa_ranges[6]; | ||
2041 | char *name; | ||
2042 | int rc; | ||
2043 | |||
2044 | name = "/pci@80000000/isa@c"; | ||
2045 | isa = call_prom("finddevice", 1, 1, ADDR(name)); | ||
2046 | if (!PHANDLE_VALID(isa)) | ||
2047 | return; | ||
2048 | |||
2049 | rc = prom_getproplen(isa, "ranges"); | ||
2050 | if (rc != 0 && rc != PROM_ERROR) | ||
2051 | return; | ||
2052 | |||
2053 | prom_printf("Fixing up missing ISA range on Pegasos...\n"); | ||
2054 | |||
2055 | isa_ranges[0] = 0x1; | ||
2056 | isa_ranges[1] = 0x0; | ||
2057 | isa_ranges[2] = 0x01006000; | ||
2058 | isa_ranges[3] = 0x0; | ||
2059 | isa_ranges[4] = 0x0; | ||
2060 | isa_ranges[5] = 0x00010000; | ||
2061 | prom_setprop(isa, name, "ranges", | ||
2062 | isa_ranges, sizeof(isa_ranges)); | ||
2063 | } | ||
2064 | #else | ||
2065 | #define fixup_device_tree_chrp() | ||
2066 | #endif | ||
2067 | |||
2033 | #if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC) | 2068 | #if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC) |
2034 | static void __init fixup_device_tree_pmac(void) | 2069 | static void __init fixup_device_tree_pmac(void) |
2035 | { | 2070 | { |
@@ -2077,6 +2112,7 @@ static void __init fixup_device_tree_pmac(void) | |||
2077 | static void __init fixup_device_tree(void) | 2112 | static void __init fixup_device_tree(void) |
2078 | { | 2113 | { |
2079 | fixup_device_tree_maple(); | 2114 | fixup_device_tree_maple(); |
2115 | fixup_device_tree_chrp(); | ||
2080 | fixup_device_tree_pmac(); | 2116 | fixup_device_tree_pmac(); |
2081 | } | 2117 | } |
2082 | 2118 | ||
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index 4a4cb5598402..77f1e06d208d 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c | |||
@@ -569,6 +569,27 @@ int rtas_set_indicator(int indicator, int index, int new_value) | |||
569 | } | 569 | } |
570 | EXPORT_SYMBOL(rtas_set_indicator); | 570 | EXPORT_SYMBOL(rtas_set_indicator); |
571 | 571 | ||
572 | /* | ||
573 | * Ignoring RTAS extended delay | ||
574 | */ | ||
575 | int rtas_set_indicator_fast(int indicator, int index, int new_value) | ||
576 | { | ||
577 | int rc; | ||
578 | int token = rtas_token("set-indicator"); | ||
579 | |||
580 | if (token == RTAS_UNKNOWN_SERVICE) | ||
581 | return -ENOENT; | ||
582 | |||
583 | rc = rtas_call(token, 3, 1, NULL, indicator, index, new_value); | ||
584 | |||
585 | WARN_ON(rc == -2 || (rc >= 9900 && rc <= 9905)); | ||
586 | |||
587 | if (rc < 0) | ||
588 | return rtas_error_rc(rc); | ||
589 | |||
590 | return rc; | ||
591 | } | ||
592 | |||
572 | void rtas_restart(char *cmd) | 593 | void rtas_restart(char *cmd) |
573 | { | 594 | { |
574 | if (rtas_flash_term_hook) | 595 | if (rtas_flash_term_hook) |
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 46c56cfd1b2f..6a9bc9ce54e0 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
@@ -144,13 +144,15 @@ void smp_message_recv(int msg, struct pt_regs *regs) | |||
144 | 144 | ||
145 | void smp_send_reschedule(int cpu) | 145 | void smp_send_reschedule(int cpu) |
146 | { | 146 | { |
147 | smp_ops->message_pass(cpu, PPC_MSG_RESCHEDULE); | 147 | if (likely(smp_ops)) |
148 | smp_ops->message_pass(cpu, PPC_MSG_RESCHEDULE); | ||
148 | } | 149 | } |
149 | 150 | ||
150 | #ifdef CONFIG_DEBUGGER | 151 | #ifdef CONFIG_DEBUGGER |
151 | void smp_send_debugger_break(int cpu) | 152 | void smp_send_debugger_break(int cpu) |
152 | { | 153 | { |
153 | smp_ops->message_pass(cpu, PPC_MSG_DEBUGGER_BREAK); | 154 | if (likely(smp_ops)) |
155 | smp_ops->message_pass(cpu, PPC_MSG_DEBUGGER_BREAK); | ||
154 | } | 156 | } |
155 | #endif | 157 | #endif |
156 | 158 | ||
@@ -158,7 +160,7 @@ void smp_send_debugger_break(int cpu) | |||
158 | void crash_send_ipi(void (*crash_ipi_callback)(struct pt_regs *)) | 160 | void crash_send_ipi(void (*crash_ipi_callback)(struct pt_regs *)) |
159 | { | 161 | { |
160 | crash_ipi_function_ptr = crash_ipi_callback; | 162 | crash_ipi_function_ptr = crash_ipi_callback; |
161 | if (crash_ipi_callback) { | 163 | if (crash_ipi_callback && smp_ops) { |
162 | mb(); | 164 | mb(); |
163 | smp_ops->message_pass(MSG_ALL_BUT_SELF, PPC_MSG_DEBUGGER_BREAK); | 165 | smp_ops->message_pass(MSG_ALL_BUT_SELF, PPC_MSG_DEBUGGER_BREAK); |
164 | } | 166 | } |
@@ -220,6 +222,9 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic, | |||
220 | /* Can deadlock when called with interrupts disabled */ | 222 | /* Can deadlock when called with interrupts disabled */ |
221 | WARN_ON(irqs_disabled()); | 223 | WARN_ON(irqs_disabled()); |
222 | 224 | ||
225 | if (unlikely(smp_ops == NULL)) | ||
226 | return -1; | ||
227 | |||
223 | data.func = func; | 228 | data.func = func; |
224 | data.info = info; | 229 | data.info = info; |
225 | atomic_set(&data.started, 0); | 230 | atomic_set(&data.started, 0); |
@@ -357,7 +362,10 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
357 | smp_store_cpu_info(boot_cpuid); | 362 | smp_store_cpu_info(boot_cpuid); |
358 | cpu_callin_map[boot_cpuid] = 1; | 363 | cpu_callin_map[boot_cpuid] = 1; |
359 | 364 | ||
360 | max_cpus = smp_ops->probe(); | 365 | if (smp_ops) |
366 | max_cpus = smp_ops->probe(); | ||
367 | else | ||
368 | max_cpus = 1; | ||
361 | 369 | ||
362 | smp_space_timers(max_cpus); | 370 | smp_space_timers(max_cpus); |
363 | 371 | ||
@@ -453,7 +461,7 @@ void generic_mach_cpu_die(void) | |||
453 | 461 | ||
454 | static int __devinit cpu_enable(unsigned int cpu) | 462 | static int __devinit cpu_enable(unsigned int cpu) |
455 | { | 463 | { |
456 | if (smp_ops->cpu_enable) | 464 | if (smp_ops && smp_ops->cpu_enable) |
457 | return smp_ops->cpu_enable(cpu); | 465 | return smp_ops->cpu_enable(cpu); |
458 | 466 | ||
459 | return -ENOSYS; | 467 | return -ENOSYS; |
@@ -467,7 +475,8 @@ int __devinit __cpu_up(unsigned int cpu) | |||
467 | if (!cpu_enable(cpu)) | 475 | if (!cpu_enable(cpu)) |
468 | return 0; | 476 | return 0; |
469 | 477 | ||
470 | if (smp_ops->cpu_bootable && !smp_ops->cpu_bootable(cpu)) | 478 | if (smp_ops == NULL || |
479 | (smp_ops->cpu_bootable && !smp_ops->cpu_bootable(cpu))) | ||
471 | return -EINVAL; | 480 | return -EINVAL; |
472 | 481 | ||
473 | /* Make sure callin-map entry is 0 (can be leftover a CPU | 482 | /* Make sure callin-map entry is 0 (can be leftover a CPU |
@@ -568,7 +577,8 @@ void __init smp_cpus_done(unsigned int max_cpus) | |||
568 | old_mask = current->cpus_allowed; | 577 | old_mask = current->cpus_allowed; |
569 | set_cpus_allowed(current, cpumask_of_cpu(boot_cpuid)); | 578 | set_cpus_allowed(current, cpumask_of_cpu(boot_cpuid)); |
570 | 579 | ||
571 | smp_ops->setup_cpu(boot_cpuid); | 580 | if (smp_ops) |
581 | smp_ops->setup_cpu(boot_cpuid); | ||
572 | 582 | ||
573 | set_cpus_allowed(current, old_mask); | 583 | set_cpus_allowed(current, old_mask); |
574 | 584 | ||
diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c index 010435095550..fec228cd0163 100644 --- a/arch/powerpc/kernel/sysfs.c +++ b/arch/powerpc/kernel/sysfs.c | |||
@@ -278,7 +278,7 @@ static void unregister_cpu_online(unsigned int cpu) | |||
278 | } | 278 | } |
279 | #endif /* CONFIG_HOTPLUG_CPU */ | 279 | #endif /* CONFIG_HOTPLUG_CPU */ |
280 | 280 | ||
281 | static int __devinit sysfs_cpu_notify(struct notifier_block *self, | 281 | static int __cpuinit sysfs_cpu_notify(struct notifier_block *self, |
282 | unsigned long action, void *hcpu) | 282 | unsigned long action, void *hcpu) |
283 | { | 283 | { |
284 | unsigned int cpu = (unsigned int)(long)hcpu; | 284 | unsigned int cpu = (unsigned int)(long)hcpu; |
@@ -296,7 +296,7 @@ static int __devinit sysfs_cpu_notify(struct notifier_block *self, | |||
296 | return NOTIFY_OK; | 296 | return NOTIFY_OK; |
297 | } | 297 | } |
298 | 298 | ||
299 | static struct notifier_block __devinitdata sysfs_cpu_nb = { | 299 | static struct notifier_block __cpuinitdata sysfs_cpu_nb = { |
300 | .notifier_call = sysfs_cpu_notify, | 300 | .notifier_call = sysfs_cpu_notify, |
301 | }; | 301 | }; |
302 | 302 | ||
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 3c668078e524..e4d1713e8aea 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
@@ -55,9 +55,6 @@ | |||
55 | 55 | ||
56 | #ifdef CONFIG_PPC64 /* XXX */ | 56 | #ifdef CONFIG_PPC64 /* XXX */ |
57 | #define _IO_BASE pci_io_base | 57 | #define _IO_BASE pci_io_base |
58 | #ifdef CONFIG_KEXEC | ||
59 | cpumask_t cpus_in_sr = CPU_MASK_NONE; | ||
60 | #endif | ||
61 | #endif | 58 | #endif |
62 | 59 | ||
63 | #ifdef CONFIG_DEBUGGER | 60 | #ifdef CONFIG_DEBUGGER |
@@ -150,13 +147,9 @@ int die(const char *str, struct pt_regs *regs, long err) | |||
150 | if (in_interrupt()) | 147 | if (in_interrupt()) |
151 | panic("Fatal exception in interrupt"); | 148 | panic("Fatal exception in interrupt"); |
152 | 149 | ||
153 | if (panic_on_oops) { | 150 | if (panic_on_oops) |
154 | #ifdef CONFIG_PPC64 | ||
155 | printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n"); | ||
156 | ssleep(5); | ||
157 | #endif | ||
158 | panic("Fatal exception"); | 151 | panic("Fatal exception"); |
159 | } | 152 | |
160 | do_exit(err); | 153 | do_exit(err); |
161 | 154 | ||
162 | return 0; | 155 | return 0; |
@@ -215,6 +208,19 @@ void system_reset_exception(struct pt_regs *regs) | |||
215 | 208 | ||
216 | die("System Reset", regs, SIGABRT); | 209 | die("System Reset", regs, SIGABRT); |
217 | 210 | ||
211 | /* | ||
212 | * Some CPUs when released from the debugger will execute this path. | ||
213 | * These CPUs entered the debugger via a soft-reset. If the CPU was | ||
214 | * hung before entering the debugger it will return to the hung | ||
215 | * state when exiting this function. This causes a problem in | ||
216 | * kdump since the hung CPU(s) will not respond to the IPI sent | ||
217 | * from kdump. To prevent the problem we call crash_kexec_secondary() | ||
218 | * here. If a kdump had not been initiated or we exit the debugger | ||
219 | * with the "exit and recover" command (x) crash_kexec_secondary() | ||
220 | * will return after 5ms and the CPU returns to its previous state. | ||
221 | */ | ||
222 | crash_kexec_secondary(regs); | ||
223 | |||
218 | /* Must die if the interrupt is not recoverable */ | 224 | /* Must die if the interrupt is not recoverable */ |
219 | if (!(regs->msr & MSR_RI)) | 225 | if (!(regs->msr & MSR_RI)) |
220 | panic("Unrecoverable System Reset"); | 226 | panic("Unrecoverable System Reset"); |
diff --git a/arch/powerpc/kernel/udbg_16550.c b/arch/powerpc/kernel/udbg_16550.c index 0835b4841dea..2d17f2b8eda7 100644 --- a/arch/powerpc/kernel/udbg_16550.c +++ b/arch/powerpc/kernel/udbg_16550.c | |||
@@ -81,10 +81,14 @@ static int udbg_550_getc(void) | |||
81 | void udbg_init_uart(void __iomem *comport, unsigned int speed, | 81 | void udbg_init_uart(void __iomem *comport, unsigned int speed, |
82 | unsigned int clock) | 82 | unsigned int clock) |
83 | { | 83 | { |
84 | unsigned int dll, base_bauds = clock / 16; | 84 | unsigned int dll, base_bauds; |
85 | 85 | ||
86 | if (clock == 0) | ||
87 | clock = 1843200; | ||
86 | if (speed == 0) | 88 | if (speed == 0) |
87 | speed = 9600; | 89 | speed = 9600; |
90 | |||
91 | base_bauds = clock / 16; | ||
88 | dll = base_bauds / speed; | 92 | dll = base_bauds / speed; |
89 | 93 | ||
90 | if (comport) { | 94 | if (comport) { |
diff --git a/arch/powerpc/kernel/vdso32/Makefile b/arch/powerpc/kernel/vdso32/Makefile index 8a3bed5f143a..3726358faae8 100644 --- a/arch/powerpc/kernel/vdso32/Makefile +++ b/arch/powerpc/kernel/vdso32/Makefile | |||
@@ -14,7 +14,8 @@ obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32)) | |||
14 | 14 | ||
15 | 15 | ||
16 | EXTRA_CFLAGS := -shared -s -fno-common -fno-builtin | 16 | EXTRA_CFLAGS := -shared -s -fno-common -fno-builtin |
17 | EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso32.so.1 | 17 | EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso32.so.1 \ |
18 | $(call ld-option, -Wl$(comma)--hash-style=sysv) | ||
18 | EXTRA_AFLAGS := -D__VDSO32__ -s | 19 | EXTRA_AFLAGS := -D__VDSO32__ -s |
19 | 20 | ||
20 | obj-y += vdso32_wrapper.o | 21 | obj-y += vdso32_wrapper.o |
diff --git a/arch/powerpc/kernel/vdso32/vdso32.lds.S b/arch/powerpc/kernel/vdso32/vdso32.lds.S index f4bad720cb0a..6187af2d54c3 100644 --- a/arch/powerpc/kernel/vdso32/vdso32.lds.S +++ b/arch/powerpc/kernel/vdso32/vdso32.lds.S | |||
@@ -14,6 +14,7 @@ SECTIONS | |||
14 | { | 14 | { |
15 | . = VDSO32_LBASE + SIZEOF_HEADERS; | 15 | . = VDSO32_LBASE + SIZEOF_HEADERS; |
16 | .hash : { *(.hash) } :text | 16 | .hash : { *(.hash) } :text |
17 | .gnu.hash : { *(.gnu.hash) } | ||
17 | .dynsym : { *(.dynsym) } | 18 | .dynsym : { *(.dynsym) } |
18 | .dynstr : { *(.dynstr) } | 19 | .dynstr : { *(.dynstr) } |
19 | .gnu.version : { *(.gnu.version) } | 20 | .gnu.version : { *(.gnu.version) } |
diff --git a/arch/powerpc/kernel/vdso64/Makefile b/arch/powerpc/kernel/vdso64/Makefile index ab39988452cc..43af9b2a6f3b 100644 --- a/arch/powerpc/kernel/vdso64/Makefile +++ b/arch/powerpc/kernel/vdso64/Makefile | |||
@@ -8,7 +8,8 @@ targets := $(obj-vdso64) vdso64.so | |||
8 | obj-vdso64 := $(addprefix $(obj)/, $(obj-vdso64)) | 8 | obj-vdso64 := $(addprefix $(obj)/, $(obj-vdso64)) |
9 | 9 | ||
10 | EXTRA_CFLAGS := -shared -s -fno-common -fno-builtin | 10 | EXTRA_CFLAGS := -shared -s -fno-common -fno-builtin |
11 | EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso64.so.1 | 11 | EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso64.so.1 \ |
12 | $(call ld-option, -Wl$(comma)--hash-style=sysv) | ||
12 | EXTRA_AFLAGS := -D__VDSO64__ -s | 13 | EXTRA_AFLAGS := -D__VDSO64__ -s |
13 | 14 | ||
14 | obj-y += vdso64_wrapper.o | 15 | obj-y += vdso64_wrapper.o |
diff --git a/arch/powerpc/kernel/vdso64/vdso64.lds.S b/arch/powerpc/kernel/vdso64/vdso64.lds.S index 4bdf224464ab..4a2b6dc0960c 100644 --- a/arch/powerpc/kernel/vdso64/vdso64.lds.S +++ b/arch/powerpc/kernel/vdso64/vdso64.lds.S | |||
@@ -12,6 +12,7 @@ SECTIONS | |||
12 | { | 12 | { |
13 | . = VDSO64_LBASE + SIZEOF_HEADERS; | 13 | . = VDSO64_LBASE + SIZEOF_HEADERS; |
14 | .hash : { *(.hash) } :text | 14 | .hash : { *(.hash) } :text |
15 | .gnu.hash : { *(.gnu.hash) } | ||
15 | .dynsym : { *(.dynsym) } | 16 | .dynsym : { *(.dynsym) } |
16 | .dynstr : { *(.dynstr) } | 17 | .dynstr : { *(.dynstr) } |
17 | .gnu.version : { *(.gnu.version) } | 18 | .gnu.version : { *(.gnu.version) } |
diff --git a/arch/powerpc/mm/lmb.c b/arch/powerpc/mm/lmb.c index 4b17a7359924..716a2906a24d 100644 --- a/arch/powerpc/mm/lmb.c +++ b/arch/powerpc/mm/lmb.c | |||
@@ -320,7 +320,8 @@ void __init lmb_enforce_memory_limit(unsigned long memory_limit) | |||
320 | break; | 320 | break; |
321 | } | 321 | } |
322 | 322 | ||
323 | lmb.rmo_size = lmb.memory.region[0].size; | 323 | if (lmb.memory.region[0].size < lmb.rmo_size) |
324 | lmb.rmo_size = lmb.memory.region[0].size; | ||
324 | 325 | ||
325 | /* And truncate any reserves above the limit also. */ | 326 | /* And truncate any reserves above the limit also. */ |
326 | for (i = 0; i < lmb.reserved.cnt; i++) { | 327 | for (i = 0; i < lmb.reserved.cnt; i++) { |
diff --git a/arch/powerpc/platforms/chrp/setup.c b/arch/powerpc/platforms/chrp/setup.c index 538e337d63e2..9c08ff322290 100644 --- a/arch/powerpc/platforms/chrp/setup.c +++ b/arch/powerpc/platforms/chrp/setup.c | |||
@@ -291,10 +291,6 @@ void __init chrp_setup_arch(void) | |||
291 | 291 | ||
292 | pci_create_OF_bus_map(); | 292 | pci_create_OF_bus_map(); |
293 | 293 | ||
294 | #ifdef CONFIG_SMP | ||
295 | smp_ops = &chrp_smp_ops; | ||
296 | #endif /* CONFIG_SMP */ | ||
297 | |||
298 | /* | 294 | /* |
299 | * Print the banner, then scroll down so boot progress | 295 | * Print the banner, then scroll down so boot progress |
300 | * can be printed. -- Cort | 296 | * can be printed. -- Cort |
@@ -479,6 +475,14 @@ void __init chrp_init_IRQ(void) | |||
479 | chrp_find_openpic(); | 475 | chrp_find_openpic(); |
480 | chrp_find_8259(); | 476 | chrp_find_8259(); |
481 | 477 | ||
478 | #ifdef CONFIG_SMP | ||
479 | /* Pegasos has no MPIC, those ops would make it crash. It might be an | ||
480 | * option to move setting them to after we probe the PIC though | ||
481 | */ | ||
482 | if (chrp_mpic != NULL) | ||
483 | smp_ops = &chrp_smp_ops; | ||
484 | #endif /* CONFIG_SMP */ | ||
485 | |||
482 | if (_chrp_type == _CHRP_Pegasos) | 486 | if (_chrp_type == _CHRP_Pegasos) |
483 | ppc_md.get_irq = i8259_irq; | 487 | ppc_md.get_irq = i8259_irq; |
484 | 488 | ||
diff --git a/arch/powerpc/platforms/maple/setup.c b/arch/powerpc/platforms/maple/setup.c index cb528c9de4c3..57567dfb9819 100644 --- a/arch/powerpc/platforms/maple/setup.c +++ b/arch/powerpc/platforms/maple/setup.c | |||
@@ -221,10 +221,17 @@ static void __init maple_init_IRQ(void) | |||
221 | * in Maple device-tree where the type of the controller is | 221 | * in Maple device-tree where the type of the controller is |
222 | * open-pic and not interrupt-controller | 222 | * open-pic and not interrupt-controller |
223 | */ | 223 | */ |
224 | for_each_node_by_type(np, "open-pic") { | 224 | |
225 | mpic_node = np; | 225 | for_each_node_by_type(np, "interrupt-controller") |
226 | break; | 226 | if (device_is_compatible(np, "open-pic")) { |
227 | } | 227 | mpic_node = np; |
228 | break; | ||
229 | } | ||
230 | if (mpic_node == NULL) | ||
231 | for_each_node_by_type(np, "open-pic") { | ||
232 | mpic_node = np; | ||
233 | break; | ||
234 | } | ||
228 | if (mpic_node == NULL) { | 235 | if (mpic_node == NULL) { |
229 | printk(KERN_ERR | 236 | printk(KERN_ERR |
230 | "Failed to locate the MPIC interrupt controller\n"); | 237 | "Failed to locate the MPIC interrupt controller\n"); |
@@ -252,6 +259,8 @@ static void __init maple_init_IRQ(void) | |||
252 | 259 | ||
253 | /* XXX Maple specific bits */ | 260 | /* XXX Maple specific bits */ |
254 | flags |= MPIC_BROKEN_U3 | MPIC_WANTS_RESET; | 261 | flags |= MPIC_BROKEN_U3 | MPIC_WANTS_RESET; |
262 | /* All U3/U4 are big-endian, older SLOF firmware doesn't encode this */ | ||
263 | flags |= MPIC_BIG_ENDIAN; | ||
255 | 264 | ||
256 | /* Setup the openpic driver. More device-tree junks, we hard code no | 265 | /* Setup the openpic driver. More device-tree junks, we hard code no |
257 | * ISUs for now. I'll have to revisit some stuffs with the folks doing | 266 | * ISUs for now. I'll have to revisit some stuffs with the folks doing |
diff --git a/arch/powerpc/platforms/powermac/backlight.c b/arch/powerpc/platforms/powermac/backlight.c index 74eed6b74cd6..d66415491055 100644 --- a/arch/powerpc/platforms/powermac/backlight.c +++ b/arch/powerpc/platforms/powermac/backlight.c | |||
@@ -10,19 +10,32 @@ | |||
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/fb.h> | 11 | #include <linux/fb.h> |
12 | #include <linux/backlight.h> | 12 | #include <linux/backlight.h> |
13 | #include <linux/adb.h> | ||
14 | #include <linux/pmu.h> | ||
15 | #include <asm/atomic.h> | ||
13 | #include <asm/prom.h> | 16 | #include <asm/prom.h> |
14 | #include <asm/backlight.h> | 17 | #include <asm/backlight.h> |
15 | 18 | ||
16 | #define OLD_BACKLIGHT_MAX 15 | 19 | #define OLD_BACKLIGHT_MAX 15 |
17 | 20 | ||
18 | static void pmac_backlight_key_worker(void *data); | 21 | static void pmac_backlight_key_worker(void *data); |
22 | static void pmac_backlight_set_legacy_worker(void *data); | ||
23 | |||
19 | static DECLARE_WORK(pmac_backlight_key_work, pmac_backlight_key_worker, NULL); | 24 | static DECLARE_WORK(pmac_backlight_key_work, pmac_backlight_key_worker, NULL); |
25 | static DECLARE_WORK(pmac_backlight_set_legacy_work, pmac_backlight_set_legacy_worker, NULL); | ||
20 | 26 | ||
21 | /* Although this variable is used in interrupt context, it makes no sense to | 27 | /* Although these variables are used in interrupt context, it makes no sense to |
22 | * protect it. No user is able to produce enough key events per second and | 28 | * protect them. No user is able to produce enough key events per second and |
23 | * notice the errors that might happen. | 29 | * notice the errors that might happen. |
24 | */ | 30 | */ |
25 | static int pmac_backlight_key_queued; | 31 | static int pmac_backlight_key_queued; |
32 | static int pmac_backlight_set_legacy_queued; | ||
33 | |||
34 | /* The via-pmu code allows the backlight to be grabbed, in which case the | ||
35 | * in-kernel control of the brightness needs to be disabled. This should | ||
36 | * only be used by really old PowerBooks. | ||
37 | */ | ||
38 | static atomic_t kernel_backlight_disabled = ATOMIC_INIT(0); | ||
26 | 39 | ||
27 | /* Protect the pmac_backlight variable */ | 40 | /* Protect the pmac_backlight variable */ |
28 | DEFINE_MUTEX(pmac_backlight_mutex); | 41 | DEFINE_MUTEX(pmac_backlight_mutex); |
@@ -82,6 +95,9 @@ int pmac_backlight_curve_lookup(struct fb_info *info, int value) | |||
82 | 95 | ||
83 | static void pmac_backlight_key_worker(void *data) | 96 | static void pmac_backlight_key_worker(void *data) |
84 | { | 97 | { |
98 | if (atomic_read(&kernel_backlight_disabled)) | ||
99 | return; | ||
100 | |||
85 | mutex_lock(&pmac_backlight_mutex); | 101 | mutex_lock(&pmac_backlight_mutex); |
86 | if (pmac_backlight) { | 102 | if (pmac_backlight) { |
87 | struct backlight_properties *props; | 103 | struct backlight_properties *props; |
@@ -107,8 +123,12 @@ static void pmac_backlight_key_worker(void *data) | |||
107 | mutex_unlock(&pmac_backlight_mutex); | 123 | mutex_unlock(&pmac_backlight_mutex); |
108 | } | 124 | } |
109 | 125 | ||
126 | /* This function is called in interrupt context */ | ||
110 | void pmac_backlight_key(int direction) | 127 | void pmac_backlight_key(int direction) |
111 | { | 128 | { |
129 | if (atomic_read(&kernel_backlight_disabled)) | ||
130 | return; | ||
131 | |||
112 | /* we can receive multiple interrupts here, but the scheduled work | 132 | /* we can receive multiple interrupts here, but the scheduled work |
113 | * will run only once, with the last value | 133 | * will run only once, with the last value |
114 | */ | 134 | */ |
@@ -116,7 +136,7 @@ void pmac_backlight_key(int direction) | |||
116 | schedule_work(&pmac_backlight_key_work); | 136 | schedule_work(&pmac_backlight_key_work); |
117 | } | 137 | } |
118 | 138 | ||
119 | int pmac_backlight_set_legacy_brightness(int brightness) | 139 | static int __pmac_backlight_set_legacy_brightness(int brightness) |
120 | { | 140 | { |
121 | int error = -ENXIO; | 141 | int error = -ENXIO; |
122 | 142 | ||
@@ -145,6 +165,28 @@ int pmac_backlight_set_legacy_brightness(int brightness) | |||
145 | return error; | 165 | return error; |
146 | } | 166 | } |
147 | 167 | ||
168 | static void pmac_backlight_set_legacy_worker(void *data) | ||
169 | { | ||
170 | if (atomic_read(&kernel_backlight_disabled)) | ||
171 | return; | ||
172 | |||
173 | __pmac_backlight_set_legacy_brightness(pmac_backlight_set_legacy_queued); | ||
174 | } | ||
175 | |||
176 | /* This function is called in interrupt context */ | ||
177 | void pmac_backlight_set_legacy_brightness_pmu(int brightness) { | ||
178 | if (atomic_read(&kernel_backlight_disabled)) | ||
179 | return; | ||
180 | |||
181 | pmac_backlight_set_legacy_queued = brightness; | ||
182 | schedule_work(&pmac_backlight_set_legacy_work); | ||
183 | } | ||
184 | |||
185 | int pmac_backlight_set_legacy_brightness(int brightness) | ||
186 | { | ||
187 | return __pmac_backlight_set_legacy_brightness(brightness); | ||
188 | } | ||
189 | |||
148 | int pmac_backlight_get_legacy_brightness() | 190 | int pmac_backlight_get_legacy_brightness() |
149 | { | 191 | { |
150 | int result = -ENXIO; | 192 | int result = -ENXIO; |
@@ -167,6 +209,16 @@ int pmac_backlight_get_legacy_brightness() | |||
167 | return result; | 209 | return result; |
168 | } | 210 | } |
169 | 211 | ||
212 | void pmac_backlight_disable() | ||
213 | { | ||
214 | atomic_inc(&kernel_backlight_disabled); | ||
215 | } | ||
216 | |||
217 | void pmac_backlight_enable() | ||
218 | { | ||
219 | atomic_dec(&kernel_backlight_disabled); | ||
220 | } | ||
221 | |||
170 | EXPORT_SYMBOL_GPL(pmac_backlight); | 222 | EXPORT_SYMBOL_GPL(pmac_backlight); |
171 | EXPORT_SYMBOL_GPL(pmac_backlight_mutex); | 223 | EXPORT_SYMBOL_GPL(pmac_backlight_mutex); |
172 | EXPORT_SYMBOL_GPL(pmac_has_backlight_type); | 224 | EXPORT_SYMBOL_GPL(pmac_has_backlight_type); |
diff --git a/arch/powerpc/platforms/powermac/bootx_init.c b/arch/powerpc/platforms/powermac/bootx_init.c index 871b002c9f90..6a026c733f6a 100644 --- a/arch/powerpc/platforms/powermac/bootx_init.c +++ b/arch/powerpc/platforms/powermac/bootx_init.c | |||
@@ -181,13 +181,18 @@ static void __init bootx_add_chosen_props(unsigned long base, | |||
181 | } | 181 | } |
182 | 182 | ||
183 | static void __init bootx_add_display_props(unsigned long base, | 183 | static void __init bootx_add_display_props(unsigned long base, |
184 | unsigned long *mem_end) | 184 | unsigned long *mem_end, |
185 | int has_real_node) | ||
185 | { | 186 | { |
186 | boot_infos_t *bi = bootx_info; | 187 | boot_infos_t *bi = bootx_info; |
187 | u32 tmp; | 188 | u32 tmp; |
188 | 189 | ||
189 | bootx_dt_add_prop("linux,boot-display", NULL, 0, mem_end); | 190 | if (has_real_node) { |
190 | bootx_dt_add_prop("linux,opened", NULL, 0, mem_end); | 191 | bootx_dt_add_prop("linux,boot-display", NULL, 0, mem_end); |
192 | bootx_dt_add_prop("linux,opened", NULL, 0, mem_end); | ||
193 | } else | ||
194 | bootx_dt_add_prop("linux,bootx-noscreen", NULL, 0, mem_end); | ||
195 | |||
191 | tmp = bi->dispDeviceDepth; | 196 | tmp = bi->dispDeviceDepth; |
192 | bootx_dt_add_prop("linux,bootx-depth", &tmp, 4, mem_end); | 197 | bootx_dt_add_prop("linux,bootx-depth", &tmp, 4, mem_end); |
193 | tmp = bi->dispDeviceRect[2] - bi->dispDeviceRect[0]; | 198 | tmp = bi->dispDeviceRect[2] - bi->dispDeviceRect[0]; |
@@ -241,11 +246,6 @@ static void __init bootx_scan_dt_build_strings(unsigned long base, | |||
241 | DBG(" detected display ! adding properties names !\n"); | 246 | DBG(" detected display ! adding properties names !\n"); |
242 | bootx_dt_add_string("linux,boot-display", mem_end); | 247 | bootx_dt_add_string("linux,boot-display", mem_end); |
243 | bootx_dt_add_string("linux,opened", mem_end); | 248 | bootx_dt_add_string("linux,opened", mem_end); |
244 | bootx_dt_add_string("linux,bootx-depth", mem_end); | ||
245 | bootx_dt_add_string("linux,bootx-width", mem_end); | ||
246 | bootx_dt_add_string("linux,bootx-height", mem_end); | ||
247 | bootx_dt_add_string("linux,bootx-linebytes", mem_end); | ||
248 | bootx_dt_add_string("linux,bootx-addr", mem_end); | ||
249 | strncpy(bootx_disp_path, namep, 255); | 249 | strncpy(bootx_disp_path, namep, 255); |
250 | } | 250 | } |
251 | 251 | ||
@@ -329,10 +329,13 @@ static void __init bootx_scan_dt_build_struct(unsigned long base, | |||
329 | ppp = &pp->next; | 329 | ppp = &pp->next; |
330 | } | 330 | } |
331 | 331 | ||
332 | if (node == bootx_node_chosen) | 332 | if (node == bootx_node_chosen) { |
333 | bootx_add_chosen_props(base, mem_end); | 333 | bootx_add_chosen_props(base, mem_end); |
334 | if (node == bootx_info->dispDeviceRegEntryOffset) | 334 | if (bootx_info->dispDeviceRegEntryOffset == 0) |
335 | bootx_add_display_props(base, mem_end); | 335 | bootx_add_display_props(base, mem_end, 0); |
336 | } | ||
337 | else if (node == bootx_info->dispDeviceRegEntryOffset) | ||
338 | bootx_add_display_props(base, mem_end, 1); | ||
336 | 339 | ||
337 | /* do all our children */ | 340 | /* do all our children */ |
338 | cpp = &np->child; | 341 | cpp = &np->child; |
@@ -374,6 +377,14 @@ static unsigned long __init bootx_flatten_dt(unsigned long start) | |||
374 | mem_end += 4; | 377 | mem_end += 4; |
375 | bootx_dt_strend = mem_end; | 378 | bootx_dt_strend = mem_end; |
376 | bootx_scan_dt_build_strings(base, 4, &mem_end); | 379 | bootx_scan_dt_build_strings(base, 4, &mem_end); |
380 | /* Add some strings */ | ||
381 | bootx_dt_add_string("linux,bootx-noscreen", &mem_end); | ||
382 | bootx_dt_add_string("linux,bootx-depth", &mem_end); | ||
383 | bootx_dt_add_string("linux,bootx-width", &mem_end); | ||
384 | bootx_dt_add_string("linux,bootx-height", &mem_end); | ||
385 | bootx_dt_add_string("linux,bootx-linebytes", &mem_end); | ||
386 | bootx_dt_add_string("linux,bootx-addr", &mem_end); | ||
387 | /* Wrap up strings */ | ||
377 | hdr->off_dt_strings = bootx_dt_strbase - mem_start; | 388 | hdr->off_dt_strings = bootx_dt_strbase - mem_start; |
378 | hdr->dt_strings_size = bootx_dt_strend - bootx_dt_strbase; | 389 | hdr->dt_strings_size = bootx_dt_strend - bootx_dt_strbase; |
379 | 390 | ||
@@ -471,6 +482,7 @@ void __init bootx_init(unsigned long r3, unsigned long r4) | |||
471 | if (bi->dispDeviceDepth == 16) | 482 | if (bi->dispDeviceDepth == 16) |
472 | bi->dispDeviceDepth = 15; | 483 | bi->dispDeviceDepth = 15; |
473 | 484 | ||
485 | |||
474 | #ifdef CONFIG_BOOTX_TEXT | 486 | #ifdef CONFIG_BOOTX_TEXT |
475 | ptr = (unsigned long)bi->logicalDisplayBase; | 487 | ptr = (unsigned long)bi->logicalDisplayBase; |
476 | ptr += bi->dispDeviceRect[1] * bi->dispDeviceRowBytes; | 488 | ptr += bi->dispDeviceRect[1] * bi->dispDeviceRowBytes; |
@@ -508,6 +520,7 @@ void __init bootx_init(unsigned long r3, unsigned long r4) | |||
508 | #ifdef CONFIG_BOOTX_TEXT | 520 | #ifdef CONFIG_BOOTX_TEXT |
509 | btext_welcome(bi); | 521 | btext_welcome(bi); |
510 | #endif | 522 | #endif |
523 | |||
511 | /* New BootX enters kernel with MMU off, i/os are not allowed | 524 | /* New BootX enters kernel with MMU off, i/os are not allowed |
512 | * here. This hack will have been done by the boostrap anyway. | 525 | * here. This hack will have been done by the boostrap anyway. |
513 | */ | 526 | */ |
diff --git a/arch/powerpc/platforms/powermac/cpufreq_64.c b/arch/powerpc/platforms/powermac/cpufreq_64.c index f08a14516139..7b1156ea5341 100644 --- a/arch/powerpc/platforms/powermac/cpufreq_64.c +++ b/arch/powerpc/platforms/powermac/cpufreq_64.c | |||
@@ -10,6 +10,8 @@ | |||
10 | * that is iMac G5 and latest single CPU desktop. | 10 | * that is iMac G5 and latest single CPU desktop. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #undef DEBUG | ||
14 | |||
13 | #include <linux/module.h> | 15 | #include <linux/module.h> |
14 | #include <linux/types.h> | 16 | #include <linux/types.h> |
15 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
@@ -30,13 +32,7 @@ | |||
30 | #include <asm/smu.h> | 32 | #include <asm/smu.h> |
31 | #include <asm/pmac_pfunc.h> | 33 | #include <asm/pmac_pfunc.h> |
32 | 34 | ||
33 | #undef DEBUG | 35 | #define DBG(fmt...) pr_debug(fmt) |
34 | |||
35 | #ifdef DEBUG | ||
36 | #define DBG(fmt...) printk(fmt) | ||
37 | #else | ||
38 | #define DBG(fmt...) | ||
39 | #endif | ||
40 | 36 | ||
41 | /* see 970FX user manual */ | 37 | /* see 970FX user manual */ |
42 | 38 | ||
@@ -82,8 +78,6 @@ static struct freq_attr* g5_cpu_freqs_attr[] = { | |||
82 | /* Power mode data is an array of the 32 bits PCR values to use for | 78 | /* Power mode data is an array of the 32 bits PCR values to use for |
83 | * the various frequencies, retrieved from the device-tree | 79 | * the various frequencies, retrieved from the device-tree |
84 | */ | 80 | */ |
85 | static u32 *g5_pmode_data; | ||
86 | static int g5_pmode_max; | ||
87 | static int g5_pmode_cur; | 81 | static int g5_pmode_cur; |
88 | 82 | ||
89 | static void (*g5_switch_volt)(int speed_mode); | 83 | static void (*g5_switch_volt)(int speed_mode); |
@@ -93,6 +87,11 @@ static int (*g5_query_freq)(void); | |||
93 | static DEFINE_MUTEX(g5_switch_mutex); | 87 | static DEFINE_MUTEX(g5_switch_mutex); |
94 | 88 | ||
95 | 89 | ||
90 | #ifdef CONFIG_PMAC_SMU | ||
91 | |||
92 | static u32 *g5_pmode_data; | ||
93 | static int g5_pmode_max; | ||
94 | |||
96 | static struct smu_sdbp_fvt *g5_fvt_table; /* table of op. points */ | 95 | static struct smu_sdbp_fvt *g5_fvt_table; /* table of op. points */ |
97 | static int g5_fvt_count; /* number of op. points */ | 96 | static int g5_fvt_count; /* number of op. points */ |
98 | static int g5_fvt_cur; /* current op. point */ | 97 | static int g5_fvt_cur; /* current op. point */ |
@@ -210,6 +209,16 @@ static int g5_scom_query_freq(void) | |||
210 | } | 209 | } |
211 | 210 | ||
212 | /* | 211 | /* |
212 | * Fake voltage switching for platforms with missing support | ||
213 | */ | ||
214 | |||
215 | static void g5_dummy_switch_volt(int speed_mode) | ||
216 | { | ||
217 | } | ||
218 | |||
219 | #endif /* CONFIG_PMAC_SMU */ | ||
220 | |||
221 | /* | ||
213 | * Platform function based voltage switching for PowerMac7,2 & 7,3 | 222 | * Platform function based voltage switching for PowerMac7,2 & 7,3 |
214 | */ | 223 | */ |
215 | 224 | ||
@@ -248,6 +257,9 @@ static int g5_pfunc_switch_freq(int speed_mode) | |||
248 | struct pmf_args args; | 257 | struct pmf_args args; |
249 | u32 done = 0; | 258 | u32 done = 0; |
250 | unsigned long timeout; | 259 | unsigned long timeout; |
260 | int rc; | ||
261 | |||
262 | DBG("g5_pfunc_switch_freq(%d)\n", speed_mode); | ||
251 | 263 | ||
252 | /* If frequency is going up, first ramp up the voltage */ | 264 | /* If frequency is going up, first ramp up the voltage */ |
253 | if (speed_mode < g5_pmode_cur) | 265 | if (speed_mode < g5_pmode_cur) |
@@ -255,9 +267,12 @@ static int g5_pfunc_switch_freq(int speed_mode) | |||
255 | 267 | ||
256 | /* Do it */ | 268 | /* Do it */ |
257 | if (speed_mode == CPUFREQ_HIGH) | 269 | if (speed_mode == CPUFREQ_HIGH) |
258 | pmf_call_one(pfunc_cpu_setfreq_high, NULL); | 270 | rc = pmf_call_one(pfunc_cpu_setfreq_high, NULL); |
259 | else | 271 | else |
260 | pmf_call_one(pfunc_cpu_setfreq_low, NULL); | 272 | rc = pmf_call_one(pfunc_cpu_setfreq_low, NULL); |
273 | |||
274 | if (rc) | ||
275 | printk(KERN_WARNING "cpufreq: pfunc switch error %d\n", rc); | ||
261 | 276 | ||
262 | /* It's an irq GPIO so we should be able to just block here, | 277 | /* It's an irq GPIO so we should be able to just block here, |
263 | * I'll do that later after I've properly tested the IRQ code for | 278 | * I'll do that later after I've properly tested the IRQ code for |
@@ -296,13 +311,6 @@ static int g5_pfunc_query_freq(void) | |||
296 | return val ? CPUFREQ_HIGH : CPUFREQ_LOW; | 311 | return val ? CPUFREQ_HIGH : CPUFREQ_LOW; |
297 | } | 312 | } |
298 | 313 | ||
299 | /* | ||
300 | * Fake voltage switching for platforms with missing support | ||
301 | */ | ||
302 | |||
303 | static void g5_dummy_switch_volt(int speed_mode) | ||
304 | { | ||
305 | } | ||
306 | 314 | ||
307 | /* | 315 | /* |
308 | * Common interface to the cpufreq core | 316 | * Common interface to the cpufreq core |
@@ -375,6 +383,8 @@ static struct cpufreq_driver g5_cpufreq_driver = { | |||
375 | }; | 383 | }; |
376 | 384 | ||
377 | 385 | ||
386 | #ifdef CONFIG_PMAC_SMU | ||
387 | |||
378 | static int __init g5_neo2_cpufreq_init(struct device_node *cpus) | 388 | static int __init g5_neo2_cpufreq_init(struct device_node *cpus) |
379 | { | 389 | { |
380 | struct device_node *cpunode; | 390 | struct device_node *cpunode; |
@@ -525,6 +535,9 @@ static int __init g5_neo2_cpufreq_init(struct device_node *cpus) | |||
525 | return rc; | 535 | return rc; |
526 | } | 536 | } |
527 | 537 | ||
538 | #endif /* CONFIG_PMAC_SMU */ | ||
539 | |||
540 | |||
528 | static int __init g5_pm72_cpufreq_init(struct device_node *cpus) | 541 | static int __init g5_pm72_cpufreq_init(struct device_node *cpus) |
529 | { | 542 | { |
530 | struct device_node *cpuid = NULL, *hwclock = NULL, *cpunode = NULL; | 543 | struct device_node *cpuid = NULL, *hwclock = NULL, *cpunode = NULL; |
@@ -533,6 +546,9 @@ static int __init g5_pm72_cpufreq_init(struct device_node *cpus) | |||
533 | u64 max_freq, min_freq, ih, il; | 546 | u64 max_freq, min_freq, ih, il; |
534 | int has_volt = 1, rc = 0; | 547 | int has_volt = 1, rc = 0; |
535 | 548 | ||
549 | DBG("cpufreq: Initializing for PowerMac7,2, PowerMac7,3 and" | ||
550 | " RackMac3,1...\n"); | ||
551 | |||
536 | /* Get first CPU node */ | 552 | /* Get first CPU node */ |
537 | for (cpunode = NULL; | 553 | for (cpunode = NULL; |
538 | (cpunode = of_get_next_child(cpus, cpunode)) != NULL;) { | 554 | (cpunode = of_get_next_child(cpus, cpunode)) != NULL;) { |
@@ -636,6 +652,15 @@ static int __init g5_pm72_cpufreq_init(struct device_node *cpus) | |||
636 | */ | 652 | */ |
637 | ih = *((u32 *)(eeprom + 0x10)); | 653 | ih = *((u32 *)(eeprom + 0x10)); |
638 | il = *((u32 *)(eeprom + 0x20)); | 654 | il = *((u32 *)(eeprom + 0x20)); |
655 | |||
656 | /* Check for machines with no useful settings */ | ||
657 | if (il == ih) { | ||
658 | printk(KERN_WARNING "cpufreq: No low frequency mode available" | ||
659 | " on this model !\n"); | ||
660 | rc = -ENODEV; | ||
661 | goto bail; | ||
662 | } | ||
663 | |||
639 | min_freq = 0; | 664 | min_freq = 0; |
640 | if (ih != 0 && il != 0) | 665 | if (ih != 0 && il != 0) |
641 | min_freq = (max_freq * il) / ih; | 666 | min_freq = (max_freq * il) / ih; |
@@ -643,7 +668,7 @@ static int __init g5_pm72_cpufreq_init(struct device_node *cpus) | |||
643 | /* Sanity check */ | 668 | /* Sanity check */ |
644 | if (min_freq >= max_freq || min_freq < 1000) { | 669 | if (min_freq >= max_freq || min_freq < 1000) { |
645 | printk(KERN_ERR "cpufreq: Can't calculate low frequency !\n"); | 670 | printk(KERN_ERR "cpufreq: Can't calculate low frequency !\n"); |
646 | rc = -ENODEV; | 671 | rc = -ENXIO; |
647 | goto bail; | 672 | goto bail; |
648 | } | 673 | } |
649 | g5_cpu_freqs[0].frequency = max_freq; | 674 | g5_cpu_freqs[0].frequency = max_freq; |
@@ -690,16 +715,10 @@ static int __init g5_pm72_cpufreq_init(struct device_node *cpus) | |||
690 | return rc; | 715 | return rc; |
691 | } | 716 | } |
692 | 717 | ||
693 | static int __init g5_rm31_cpufreq_init(struct device_node *cpus) | ||
694 | { | ||
695 | /* NYI */ | ||
696 | return 0; | ||
697 | } | ||
698 | |||
699 | static int __init g5_cpufreq_init(void) | 718 | static int __init g5_cpufreq_init(void) |
700 | { | 719 | { |
701 | struct device_node *cpus; | 720 | struct device_node *cpus; |
702 | int rc; | 721 | int rc = 0; |
703 | 722 | ||
704 | cpus = of_find_node_by_path("/cpus"); | 723 | cpus = of_find_node_by_path("/cpus"); |
705 | if (cpus == NULL) { | 724 | if (cpus == NULL) { |
@@ -708,12 +727,13 @@ static int __init g5_cpufreq_init(void) | |||
708 | } | 727 | } |
709 | 728 | ||
710 | if (machine_is_compatible("PowerMac7,2") || | 729 | if (machine_is_compatible("PowerMac7,2") || |
711 | machine_is_compatible("PowerMac7,3")) | 730 | machine_is_compatible("PowerMac7,3") || |
731 | machine_is_compatible("RackMac3,1")) | ||
712 | rc = g5_pm72_cpufreq_init(cpus); | 732 | rc = g5_pm72_cpufreq_init(cpus); |
713 | else if (machine_is_compatible("RackMac3,1")) | 733 | #ifdef CONFIG_PMAC_SMU |
714 | rc = g5_rm31_cpufreq_init(cpus); | ||
715 | else | 734 | else |
716 | rc = g5_neo2_cpufreq_init(cpus); | 735 | rc = g5_neo2_cpufreq_init(cpus); |
736 | #endif /* CONFIG_PMAC_SMU */ | ||
717 | 737 | ||
718 | of_node_put(cpus); | 738 | of_node_put(cpus); |
719 | return rc; | 739 | return rc; |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 54a52437265c..31867a701fcb 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -213,8 +213,6 @@ static void pseries_lpar_enable_pmcs(void) | |||
213 | { | 213 | { |
214 | unsigned long set, reset; | 214 | unsigned long set, reset; |
215 | 215 | ||
216 | power4_enable_pmcs(); | ||
217 | |||
218 | set = 1UL << 63; | 216 | set = 1UL << 63; |
219 | reset = 0; | 217 | reset = 0; |
220 | plpar_hcall_norets(H_PERFMON, set, reset); | 218 | plpar_hcall_norets(H_PERFMON, set, reset); |
@@ -501,7 +499,8 @@ static void pseries_dedicated_idle_sleep(void) | |||
501 | } | 499 | } |
502 | 500 | ||
503 | /* | 501 | /* |
504 | * Cede if the other thread is not idle, so that it can | 502 | * If not SMT, cede processor. If CPU is running SMT |
503 | * cede if the other thread is not idle, so that it can | ||
505 | * go single-threaded. If the other thread is idle, | 504 | * go single-threaded. If the other thread is idle, |
506 | * we ask the hypervisor if it has pending work it | 505 | * we ask the hypervisor if it has pending work it |
507 | * wants to do and cede if it does. Otherwise we keep | 506 | * wants to do and cede if it does. Otherwise we keep |
@@ -514,7 +513,8 @@ static void pseries_dedicated_idle_sleep(void) | |||
514 | * very low priority. The cede enables interrupts, which | 513 | * very low priority. The cede enables interrupts, which |
515 | * doesn't matter here. | 514 | * doesn't matter here. |
516 | */ | 515 | */ |
517 | if (!lppaca[cpu ^ 1].idle || poll_pending() == H_PENDING) | 516 | if (!cpu_has_feature(CPU_FTR_SMT) || !lppaca[cpu ^ 1].idle |
517 | || poll_pending() == H_PENDING) | ||
518 | cede_processor(); | 518 | cede_processor(); |
519 | 519 | ||
520 | out: | 520 | out: |
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index 2d0da6f9e244..e98863025721 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
@@ -467,7 +467,7 @@ void xics_setup_cpu(void) | |||
467 | * | 467 | * |
468 | * XXX: undo of teardown on kexec needs this too, as may hotplug | 468 | * XXX: undo of teardown on kexec needs this too, as may hotplug |
469 | */ | 469 | */ |
470 | rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE, | 470 | rtas_set_indicator_fast(GLOBAL_INTERRUPT_QUEUE, |
471 | (1UL << interrupt_server_size) - 1 - default_distrib_server, 1); | 471 | (1UL << interrupt_server_size) - 1 - default_distrib_server, 1); |
472 | } | 472 | } |
473 | 473 | ||
@@ -796,7 +796,7 @@ void xics_teardown_cpu(int secondary) | |||
796 | * so leave the master cpu in the group. | 796 | * so leave the master cpu in the group. |
797 | */ | 797 | */ |
798 | if (secondary) | 798 | if (secondary) |
799 | rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE, | 799 | rtas_set_indicator_fast(GLOBAL_INTERRUPT_QUEUE, |
800 | (1UL << interrupt_server_size) - 1 - | 800 | (1UL << interrupt_server_size) - 1 - |
801 | default_distrib_server, 0); | 801 | default_distrib_server, 0); |
802 | } | 802 | } |
@@ -813,7 +813,7 @@ void xics_migrate_irqs_away(void) | |||
813 | xics_set_cpu_priority(cpu, 0); | 813 | xics_set_cpu_priority(cpu, 0); |
814 | 814 | ||
815 | /* remove ourselves from the global interrupt queue */ | 815 | /* remove ourselves from the global interrupt queue */ |
816 | status = rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE, | 816 | status = rtas_set_indicator_fast(GLOBAL_INTERRUPT_QUEUE, |
817 | (1UL << interrupt_server_size) - 1 - default_distrib_server, 0); | 817 | (1UL << interrupt_server_size) - 1 - default_distrib_server, 0); |
818 | WARN_ON(status < 0); | 818 | WARN_ON(status < 0); |
819 | 819 | ||
diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c index e983972132d8..12b65609c072 100644 --- a/arch/powerpc/sysdev/fsl_soc.c +++ b/arch/powerpc/sysdev/fsl_soc.c | |||
@@ -169,8 +169,16 @@ static int __init gfar_of_init(void) | |||
169 | goto err; | 169 | goto err; |
170 | } | 170 | } |
171 | 171 | ||
172 | mac_addr = get_property(np, "address", NULL); | 172 | mac_addr = get_property(np, "local-mac-address", NULL); |
173 | memcpy(gfar_data.mac_addr, mac_addr, 6); | 173 | if (mac_addr == NULL) |
174 | mac_addr = get_property(np, "mac-address", NULL); | ||
175 | if (mac_addr == NULL) { | ||
176 | /* Obsolete */ | ||
177 | mac_addr = get_property(np, "address", NULL); | ||
178 | } | ||
179 | |||
180 | if (mac_addr) | ||
181 | memcpy(gfar_data.mac_addr, mac_addr, 6); | ||
174 | 182 | ||
175 | if (model && !strcasecmp(model, "TSEC")) | 183 | if (model && !strcasecmp(model, "TSEC")) |
176 | gfar_data.device_flags = | 184 | gfar_data.device_flags = |
diff --git a/arch/ppc/kernel/vmlinux.lds.S b/arch/ppc/kernel/vmlinux.lds.S index 09c6525cfa61..095fd3323323 100644 --- a/arch/ppc/kernel/vmlinux.lds.S +++ b/arch/ppc/kernel/vmlinux.lds.S | |||
@@ -8,6 +8,7 @@ SECTIONS | |||
8 | . = + SIZEOF_HEADERS; | 8 | . = + SIZEOF_HEADERS; |
9 | .interp : { *(.interp) } | 9 | .interp : { *(.interp) } |
10 | .hash : { *(.hash) } | 10 | .hash : { *(.hash) } |
11 | .gnu.hash : { *(.gnu.hash) } | ||
11 | .dynsym : { *(.dynsym) } | 12 | .dynsym : { *(.dynsym) } |
12 | .dynstr : { *(.dynstr) } | 13 | .dynstr : { *(.dynstr) } |
13 | .rel.text : { *(.rel.text) } | 14 | .rel.text : { *(.rel.text) } |
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index d0f82c995af6..a0a94e0ef8d1 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
@@ -617,6 +617,7 @@ appldata_offline_cpu(int cpu) | |||
617 | spin_unlock(&appldata_timer_lock); | 617 | spin_unlock(&appldata_timer_lock); |
618 | } | 618 | } |
619 | 619 | ||
620 | #ifdef CONFIG_HOTPLUG_CPU | ||
620 | static int __cpuinit | 621 | static int __cpuinit |
621 | appldata_cpu_notify(struct notifier_block *self, | 622 | appldata_cpu_notify(struct notifier_block *self, |
622 | unsigned long action, void *hcpu) | 623 | unsigned long action, void *hcpu) |
@@ -625,20 +626,19 @@ appldata_cpu_notify(struct notifier_block *self, | |||
625 | case CPU_ONLINE: | 626 | case CPU_ONLINE: |
626 | appldata_online_cpu((long) hcpu); | 627 | appldata_online_cpu((long) hcpu); |
627 | break; | 628 | break; |
628 | #ifdef CONFIG_HOTPLUG_CPU | ||
629 | case CPU_DEAD: | 629 | case CPU_DEAD: |
630 | appldata_offline_cpu((long) hcpu); | 630 | appldata_offline_cpu((long) hcpu); |
631 | break; | 631 | break; |
632 | #endif | ||
633 | default: | 632 | default: |
634 | break; | 633 | break; |
635 | } | 634 | } |
636 | return NOTIFY_OK; | 635 | return NOTIFY_OK; |
637 | } | 636 | } |
638 | 637 | ||
639 | static struct notifier_block __devinitdata appldata_nb = { | 638 | static struct notifier_block appldata_nb = { |
640 | .notifier_call = appldata_cpu_notify, | 639 | .notifier_call = appldata_cpu_notify, |
641 | }; | 640 | }; |
641 | #endif | ||
642 | 642 | ||
643 | /* | 643 | /* |
644 | * appldata_init() | 644 | * appldata_init() |
@@ -662,7 +662,7 @@ static int __init appldata_init(void) | |||
662 | appldata_online_cpu(i); | 662 | appldata_online_cpu(i); |
663 | 663 | ||
664 | /* Register cpu hotplug notifier */ | 664 | /* Register cpu hotplug notifier */ |
665 | register_cpu_notifier(&appldata_nb); | 665 | register_hotcpu_notifier(&appldata_nb); |
666 | 666 | ||
667 | appldata_sysctl_header = register_sysctl_table(appldata_dir_table, 1); | 667 | appldata_sysctl_header = register_sysctl_table(appldata_dir_table, 1); |
668 | #ifdef MODULE | 668 | #ifdef MODULE |
diff --git a/arch/s390/defconfig b/arch/s390/defconfig index f4dfc10026d2..f1d4591eddbb 100644 --- a/arch/s390/defconfig +++ b/arch/s390/defconfig | |||
@@ -1,13 +1,16 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.17-rc1 | 3 | # Linux kernel version: 2.6.18-rc2 |
4 | # Mon Apr 3 14:34:15 2006 | 4 | # Thu Jul 27 13:51:07 2006 |
5 | # | 5 | # |
6 | CONFIG_MMU=y | 6 | CONFIG_MMU=y |
7 | CONFIG_LOCKDEP_SUPPORT=y | ||
8 | CONFIG_STACKTRACE_SUPPORT=y | ||
7 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 9 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
8 | CONFIG_GENERIC_HWEIGHT=y | 10 | CONFIG_GENERIC_HWEIGHT=y |
9 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 11 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
10 | CONFIG_S390=y | 12 | CONFIG_S390=y |
13 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
11 | 14 | ||
12 | # | 15 | # |
13 | # Code maturity level options | 16 | # Code maturity level options |
@@ -25,6 +28,7 @@ CONFIG_SWAP=y | |||
25 | CONFIG_SYSVIPC=y | 28 | CONFIG_SYSVIPC=y |
26 | CONFIG_POSIX_MQUEUE=y | 29 | CONFIG_POSIX_MQUEUE=y |
27 | # CONFIG_BSD_PROCESS_ACCT is not set | 30 | # CONFIG_BSD_PROCESS_ACCT is not set |
31 | # CONFIG_TASKSTATS is not set | ||
28 | CONFIG_SYSCTL=y | 32 | CONFIG_SYSCTL=y |
29 | CONFIG_AUDIT=y | 33 | CONFIG_AUDIT=y |
30 | # CONFIG_AUDITSYSCALL is not set | 34 | # CONFIG_AUDITSYSCALL is not set |
@@ -43,10 +47,12 @@ CONFIG_PRINTK=y | |||
43 | CONFIG_BUG=y | 47 | CONFIG_BUG=y |
44 | CONFIG_ELF_CORE=y | 48 | CONFIG_ELF_CORE=y |
45 | CONFIG_BASE_FULL=y | 49 | CONFIG_BASE_FULL=y |
50 | CONFIG_RT_MUTEXES=y | ||
46 | CONFIG_FUTEX=y | 51 | CONFIG_FUTEX=y |
47 | CONFIG_EPOLL=y | 52 | CONFIG_EPOLL=y |
48 | CONFIG_SHMEM=y | 53 | CONFIG_SHMEM=y |
49 | CONFIG_SLAB=y | 54 | CONFIG_SLAB=y |
55 | CONFIG_VM_EVENT_COUNTERS=y | ||
50 | # CONFIG_TINY_SHMEM is not set | 56 | # CONFIG_TINY_SHMEM is not set |
51 | CONFIG_BASE_SMALL=0 | 57 | CONFIG_BASE_SMALL=0 |
52 | # CONFIG_SLOB is not set | 58 | # CONFIG_SLOB is not set |
@@ -94,7 +100,6 @@ CONFIG_HOTPLUG_CPU=y | |||
94 | CONFIG_DEFAULT_MIGRATION_COST=1000000 | 100 | CONFIG_DEFAULT_MIGRATION_COST=1000000 |
95 | CONFIG_COMPAT=y | 101 | CONFIG_COMPAT=y |
96 | CONFIG_SYSVIPC_COMPAT=y | 102 | CONFIG_SYSVIPC_COMPAT=y |
97 | CONFIG_BINFMT_ELF32=y | ||
98 | 103 | ||
99 | # | 104 | # |
100 | # Code generation options | 105 | # Code generation options |
@@ -115,6 +120,7 @@ CONFIG_FLATMEM=y | |||
115 | CONFIG_FLAT_NODE_MEM_MAP=y | 120 | CONFIG_FLAT_NODE_MEM_MAP=y |
116 | # CONFIG_SPARSEMEM_STATIC is not set | 121 | # CONFIG_SPARSEMEM_STATIC is not set |
117 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 122 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
123 | CONFIG_RESOURCES_64BIT=y | ||
118 | 124 | ||
119 | # | 125 | # |
120 | # I/O subsystem configuration | 126 | # I/O subsystem configuration |
@@ -142,6 +148,7 @@ CONFIG_VIRT_CPU_ACCOUNTING=y | |||
142 | # CONFIG_APPLDATA_BASE is not set | 148 | # CONFIG_APPLDATA_BASE is not set |
143 | CONFIG_NO_IDLE_HZ=y | 149 | CONFIG_NO_IDLE_HZ=y |
144 | CONFIG_NO_IDLE_HZ_INIT=y | 150 | CONFIG_NO_IDLE_HZ_INIT=y |
151 | CONFIG_S390_HYPFS_FS=y | ||
145 | CONFIG_KEXEC=y | 152 | CONFIG_KEXEC=y |
146 | 153 | ||
147 | # | 154 | # |
@@ -174,6 +181,8 @@ CONFIG_IP_FIB_HASH=y | |||
174 | # CONFIG_INET_IPCOMP is not set | 181 | # CONFIG_INET_IPCOMP is not set |
175 | # CONFIG_INET_XFRM_TUNNEL is not set | 182 | # CONFIG_INET_XFRM_TUNNEL is not set |
176 | # CONFIG_INET_TUNNEL is not set | 183 | # CONFIG_INET_TUNNEL is not set |
184 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
185 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
177 | CONFIG_INET_DIAG=y | 186 | CONFIG_INET_DIAG=y |
178 | CONFIG_INET_TCP_DIAG=y | 187 | CONFIG_INET_TCP_DIAG=y |
179 | # CONFIG_TCP_CONG_ADVANCED is not set | 188 | # CONFIG_TCP_CONG_ADVANCED is not set |
@@ -186,7 +195,10 @@ CONFIG_IPV6=y | |||
186 | # CONFIG_INET6_IPCOMP is not set | 195 | # CONFIG_INET6_IPCOMP is not set |
187 | # CONFIG_INET6_XFRM_TUNNEL is not set | 196 | # CONFIG_INET6_XFRM_TUNNEL is not set |
188 | # CONFIG_INET6_TUNNEL is not set | 197 | # CONFIG_INET6_TUNNEL is not set |
198 | CONFIG_INET6_XFRM_MODE_TRANSPORT=y | ||
199 | CONFIG_INET6_XFRM_MODE_TUNNEL=y | ||
189 | # CONFIG_IPV6_TUNNEL is not set | 200 | # CONFIG_IPV6_TUNNEL is not set |
201 | # CONFIG_NETWORK_SECMARK is not set | ||
190 | # CONFIG_NETFILTER is not set | 202 | # CONFIG_NETFILTER is not set |
191 | 203 | ||
192 | # | 204 | # |
@@ -263,6 +275,7 @@ CONFIG_NET_ESTIMATOR=y | |||
263 | # Network testing | 275 | # Network testing |
264 | # | 276 | # |
265 | # CONFIG_NET_PKTGEN is not set | 277 | # CONFIG_NET_PKTGEN is not set |
278 | # CONFIG_NET_TCPPROBE is not set | ||
266 | # CONFIG_HAMRADIO is not set | 279 | # CONFIG_HAMRADIO is not set |
267 | # CONFIG_IRDA is not set | 280 | # CONFIG_IRDA is not set |
268 | # CONFIG_BT is not set | 281 | # CONFIG_BT is not set |
@@ -276,6 +289,7 @@ CONFIG_STANDALONE=y | |||
276 | CONFIG_PREVENT_FIRMWARE_BUILD=y | 289 | CONFIG_PREVENT_FIRMWARE_BUILD=y |
277 | # CONFIG_FW_LOADER is not set | 290 | # CONFIG_FW_LOADER is not set |
278 | # CONFIG_DEBUG_DRIVER is not set | 291 | # CONFIG_DEBUG_DRIVER is not set |
292 | CONFIG_SYS_HYPERVISOR=y | ||
279 | 293 | ||
280 | # | 294 | # |
281 | # Connector - unified userspace <-> kernelspace linker | 295 | # Connector - unified userspace <-> kernelspace linker |
@@ -334,6 +348,7 @@ CONFIG_BLK_DEV_NBD=m | |||
334 | CONFIG_BLK_DEV_RAM=y | 348 | CONFIG_BLK_DEV_RAM=y |
335 | CONFIG_BLK_DEV_RAM_COUNT=16 | 349 | CONFIG_BLK_DEV_RAM_COUNT=16 |
336 | CONFIG_BLK_DEV_RAM_SIZE=4096 | 350 | CONFIG_BLK_DEV_RAM_SIZE=4096 |
351 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
337 | CONFIG_BLK_DEV_INITRD=y | 352 | CONFIG_BLK_DEV_INITRD=y |
338 | # CONFIG_CDROM_PKTCDVD is not set | 353 | # CONFIG_CDROM_PKTCDVD is not set |
339 | 354 | ||
@@ -359,9 +374,7 @@ CONFIG_MD_LINEAR=m | |||
359 | CONFIG_MD_RAID0=m | 374 | CONFIG_MD_RAID0=m |
360 | CONFIG_MD_RAID1=m | 375 | CONFIG_MD_RAID1=m |
361 | # CONFIG_MD_RAID10 is not set | 376 | # CONFIG_MD_RAID10 is not set |
362 | CONFIG_MD_RAID5=m | 377 | # CONFIG_MD_RAID456 is not set |
363 | # CONFIG_MD_RAID5_RESHAPE is not set | ||
364 | # CONFIG_MD_RAID6 is not set | ||
365 | CONFIG_MD_MULTIPATH=m | 378 | CONFIG_MD_MULTIPATH=m |
366 | # CONFIG_MD_FAULTY is not set | 379 | # CONFIG_MD_FAULTY is not set |
367 | CONFIG_BLK_DEV_DM=y | 380 | CONFIG_BLK_DEV_DM=y |
@@ -419,7 +432,8 @@ CONFIG_S390_TAPE_34XX=m | |||
419 | # | 432 | # |
420 | # Cryptographic devices | 433 | # Cryptographic devices |
421 | # | 434 | # |
422 | CONFIG_Z90CRYPT=m | 435 | CONFIG_ZCRYPT=m |
436 | # CONFIG_ZCRYPT_MONOLITHIC is not set | ||
423 | 437 | ||
424 | # | 438 | # |
425 | # Network device support | 439 | # Network device support |
@@ -509,6 +523,7 @@ CONFIG_FS_MBCACHE=y | |||
509 | # CONFIG_MINIX_FS is not set | 523 | # CONFIG_MINIX_FS is not set |
510 | # CONFIG_ROMFS_FS is not set | 524 | # CONFIG_ROMFS_FS is not set |
511 | CONFIG_INOTIFY=y | 525 | CONFIG_INOTIFY=y |
526 | CONFIG_INOTIFY_USER=y | ||
512 | # CONFIG_QUOTA is not set | 527 | # CONFIG_QUOTA is not set |
513 | CONFIG_DNOTIFY=y | 528 | CONFIG_DNOTIFY=y |
514 | # CONFIG_AUTOFS_FS is not set | 529 | # CONFIG_AUTOFS_FS is not set |
@@ -614,26 +629,36 @@ CONFIG_MSDOS_PARTITION=y | |||
614 | # Instrumentation Support | 629 | # Instrumentation Support |
615 | # | 630 | # |
616 | # CONFIG_PROFILING is not set | 631 | # CONFIG_PROFILING is not set |
617 | # CONFIG_STATISTICS is not set | 632 | CONFIG_STATISTICS=y |
633 | CONFIG_KPROBES=y | ||
618 | 634 | ||
619 | # | 635 | # |
620 | # Kernel hacking | 636 | # Kernel hacking |
621 | # | 637 | # |
638 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
622 | # CONFIG_PRINTK_TIME is not set | 639 | # CONFIG_PRINTK_TIME is not set |
623 | CONFIG_MAGIC_SYSRQ=y | 640 | CONFIG_MAGIC_SYSRQ=y |
641 | # CONFIG_UNUSED_SYMBOLS is not set | ||
624 | CONFIG_DEBUG_KERNEL=y | 642 | CONFIG_DEBUG_KERNEL=y |
625 | CONFIG_LOG_BUF_SHIFT=17 | 643 | CONFIG_LOG_BUF_SHIFT=17 |
626 | # CONFIG_DETECT_SOFTLOCKUP is not set | 644 | # CONFIG_DETECT_SOFTLOCKUP is not set |
627 | # CONFIG_SCHEDSTATS is not set | 645 | # CONFIG_SCHEDSTATS is not set |
628 | # CONFIG_DEBUG_SLAB is not set | 646 | # CONFIG_DEBUG_SLAB is not set |
629 | CONFIG_DEBUG_PREEMPT=y | 647 | CONFIG_DEBUG_PREEMPT=y |
630 | CONFIG_DEBUG_MUTEXES=y | 648 | # CONFIG_DEBUG_RT_MUTEXES is not set |
649 | # CONFIG_RT_MUTEX_TESTER is not set | ||
631 | CONFIG_DEBUG_SPINLOCK=y | 650 | CONFIG_DEBUG_SPINLOCK=y |
651 | CONFIG_DEBUG_MUTEXES=y | ||
652 | # CONFIG_DEBUG_RWSEMS is not set | ||
653 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
654 | # CONFIG_PROVE_LOCKING is not set | ||
632 | CONFIG_DEBUG_SPINLOCK_SLEEP=y | 655 | CONFIG_DEBUG_SPINLOCK_SLEEP=y |
656 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
633 | # CONFIG_DEBUG_KOBJECT is not set | 657 | # CONFIG_DEBUG_KOBJECT is not set |
634 | # CONFIG_DEBUG_INFO is not set | 658 | # CONFIG_DEBUG_INFO is not set |
635 | CONFIG_DEBUG_FS=y | 659 | CONFIG_DEBUG_FS=y |
636 | # CONFIG_DEBUG_VM is not set | 660 | # CONFIG_DEBUG_VM is not set |
661 | # CONFIG_FRAME_POINTER is not set | ||
637 | # CONFIG_UNWIND_INFO is not set | 662 | # CONFIG_UNWIND_INFO is not set |
638 | CONFIG_FORCED_INLINING=y | 663 | CONFIG_FORCED_INLINING=y |
639 | # CONFIG_RCU_TORTURE_TEST is not set | 664 | # CONFIG_RCU_TORTURE_TEST is not set |
@@ -688,3 +713,4 @@ CONFIG_CRYPTO=y | |||
688 | # CONFIG_CRC16 is not set | 713 | # CONFIG_CRC16 is not set |
689 | CONFIG_CRC32=m | 714 | CONFIG_CRC32=m |
690 | # CONFIG_LIBCRC32C is not set | 715 | # CONFIG_LIBCRC32C is not set |
716 | CONFIG_PLIST=y | ||
diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index eb6ebfef134a..6e6b6de77770 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c | |||
@@ -129,7 +129,7 @@ void __init paging_init(void) | |||
129 | /* | 129 | /* |
130 | * pg_table is physical at this point | 130 | * pg_table is physical at this point |
131 | */ | 131 | */ |
132 | pg_table = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE); | 132 | pg_table = (pte_t *) alloc_bootmem_pages(PAGE_SIZE); |
133 | 133 | ||
134 | pg_dir->pgd0 = (_PAGE_TABLE | __pa(pg_table)); | 134 | pg_dir->pgd0 = (_PAGE_TABLE | __pa(pg_table)); |
135 | pg_dir->pgd1 = (_PAGE_TABLE | (__pa(pg_table)+1024)); | 135 | pg_dir->pgd1 = (_PAGE_TABLE | (__pa(pg_table)+1024)); |
@@ -219,7 +219,7 @@ void __init paging_init(void) | |||
219 | continue; | 219 | continue; |
220 | } | 220 | } |
221 | 221 | ||
222 | pm_dir = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE*4); | 222 | pm_dir = (pmd_t *) alloc_bootmem_pages(PAGE_SIZE * 4); |
223 | pgd_populate(&init_mm, pg_dir, pm_dir); | 223 | pgd_populate(&init_mm, pg_dir, pm_dir); |
224 | 224 | ||
225 | for (j = 0 ; j < PTRS_PER_PMD ; j++,pm_dir++) { | 225 | for (j = 0 ; j < PTRS_PER_PMD ; j++,pm_dir++) { |
@@ -228,7 +228,7 @@ void __init paging_init(void) | |||
228 | continue; | 228 | continue; |
229 | } | 229 | } |
230 | 230 | ||
231 | pt_dir = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE); | 231 | pt_dir = (pte_t *) alloc_bootmem_pages(PAGE_SIZE); |
232 | pmd_populate_kernel(&init_mm, pm_dir, pt_dir); | 232 | pmd_populate_kernel(&init_mm, pm_dir, pt_dir); |
233 | 233 | ||
234 | for (k = 0 ; k < PTRS_PER_PTE ; k++,pt_dir++) { | 234 | for (k = 0 ; k < PTRS_PER_PTE ; k++,pt_dir++) { |
diff --git a/arch/sh/kernel/cpu/sh4/sq.c b/arch/sh/kernel/cpu/sh4/sq.c index 781dbb11c038..b09805f3ee23 100644 --- a/arch/sh/kernel/cpu/sh4/sq.c +++ b/arch/sh/kernel/cpu/sh4/sq.c | |||
@@ -421,18 +421,22 @@ static struct miscdevice sq_dev = { | |||
421 | 421 | ||
422 | static int __init sq_api_init(void) | 422 | static int __init sq_api_init(void) |
423 | { | 423 | { |
424 | int ret; | ||
424 | printk(KERN_NOTICE "sq: Registering store queue API.\n"); | 425 | printk(KERN_NOTICE "sq: Registering store queue API.\n"); |
425 | 426 | ||
426 | #ifdef CONFIG_PROC_FS | ||
427 | create_proc_read_entry("sq_mapping", 0, 0, sq_mapping_read_proc, 0); | 427 | create_proc_read_entry("sq_mapping", 0, 0, sq_mapping_read_proc, 0); |
428 | #endif | ||
429 | 428 | ||
430 | return misc_register(&sq_dev); | 429 | ret = misc_register(&sq_dev); |
430 | if (ret) | ||
431 | remove_proc_entry("sq_mapping", NULL); | ||
432 | |||
433 | return ret; | ||
431 | } | 434 | } |
432 | 435 | ||
433 | static void __exit sq_api_exit(void) | 436 | static void __exit sq_api_exit(void) |
434 | { | 437 | { |
435 | misc_deregister(&sq_dev); | 438 | misc_deregister(&sq_dev); |
439 | remove_proc_entry("sq_mapping", NULL); | ||
436 | } | 440 | } |
437 | 441 | ||
438 | module_init(sq_api_init); | 442 | module_init(sq_api_init); |
diff --git a/arch/sparc/kernel/time.c b/arch/sparc/kernel/time.c index 04eb1eab6e3e..845081b01267 100644 --- a/arch/sparc/kernel/time.c +++ b/arch/sparc/kernel/time.c | |||
@@ -225,6 +225,32 @@ static __inline__ int has_low_battery(void) | |||
225 | return (data1 == data2); /* Was the write blocked? */ | 225 | return (data1 == data2); /* Was the write blocked? */ |
226 | } | 226 | } |
227 | 227 | ||
228 | static void __init mostek_set_system_time(void) | ||
229 | { | ||
230 | unsigned int year, mon, day, hour, min, sec; | ||
231 | struct mostek48t02 *mregs; | ||
232 | |||
233 | mregs = (struct mostek48t02 *)mstk48t02_regs; | ||
234 | if(!mregs) { | ||
235 | prom_printf("Something wrong, clock regs not mapped yet.\n"); | ||
236 | prom_halt(); | ||
237 | } | ||
238 | spin_lock_irq(&mostek_lock); | ||
239 | mregs->creg |= MSTK_CREG_READ; | ||
240 | sec = MSTK_REG_SEC(mregs); | ||
241 | min = MSTK_REG_MIN(mregs); | ||
242 | hour = MSTK_REG_HOUR(mregs); | ||
243 | day = MSTK_REG_DOM(mregs); | ||
244 | mon = MSTK_REG_MONTH(mregs); | ||
245 | year = MSTK_CVT_YEAR( MSTK_REG_YEAR(mregs) ); | ||
246 | xtime.tv_sec = mktime(year, mon, day, hour, min, sec); | ||
247 | xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ); | ||
248 | set_normalized_timespec(&wall_to_monotonic, | ||
249 | -xtime.tv_sec, -xtime.tv_nsec); | ||
250 | mregs->creg &= ~MSTK_CREG_READ; | ||
251 | spin_unlock_irq(&mostek_lock); | ||
252 | } | ||
253 | |||
228 | /* Probe for the real time clock chip on Sun4 */ | 254 | /* Probe for the real time clock chip on Sun4 */ |
229 | static __inline__ void sun4_clock_probe(void) | 255 | static __inline__ void sun4_clock_probe(void) |
230 | { | 256 | { |
@@ -273,6 +299,7 @@ static __inline__ void sun4_clock_probe(void) | |||
273 | #endif | 299 | #endif |
274 | } | 300 | } |
275 | 301 | ||
302 | #ifndef CONFIG_SUN4 | ||
276 | static int __devinit clock_probe(struct of_device *op, const struct of_device_id *match) | 303 | static int __devinit clock_probe(struct of_device *op, const struct of_device_id *match) |
277 | { | 304 | { |
278 | struct device_node *dp = op->node; | 305 | struct device_node *dp = op->node; |
@@ -307,6 +334,8 @@ static int __devinit clock_probe(struct of_device *op, const struct of_device_id | |||
307 | if (mostek_read(mstk48t02_regs + MOSTEK_SEC) & MSTK_STOP) | 334 | if (mostek_read(mstk48t02_regs + MOSTEK_SEC) & MSTK_STOP) |
308 | kick_start_clock(); | 335 | kick_start_clock(); |
309 | 336 | ||
337 | mostek_set_system_time(); | ||
338 | |||
310 | return 0; | 339 | return 0; |
311 | } | 340 | } |
312 | 341 | ||
@@ -325,56 +354,37 @@ static struct of_platform_driver clock_driver = { | |||
325 | 354 | ||
326 | 355 | ||
327 | /* Probe for the mostek real time clock chip. */ | 356 | /* Probe for the mostek real time clock chip. */ |
328 | static void clock_init(void) | 357 | static int __init clock_init(void) |
329 | { | 358 | { |
330 | of_register_driver(&clock_driver, &of_bus_type); | 359 | return of_register_driver(&clock_driver, &of_bus_type); |
331 | } | 360 | } |
332 | 361 | ||
362 | /* Must be after subsys_initcall() so that busses are probed. Must | ||
363 | * be before device_initcall() because things like the RTC driver | ||
364 | * need to see the clock registers. | ||
365 | */ | ||
366 | fs_initcall(clock_init); | ||
367 | #endif /* !CONFIG_SUN4 */ | ||
368 | |||
333 | void __init sbus_time_init(void) | 369 | void __init sbus_time_init(void) |
334 | { | 370 | { |
335 | unsigned int year, mon, day, hour, min, sec; | ||
336 | struct mostek48t02 *mregs; | ||
337 | |||
338 | #ifdef CONFIG_SUN4 | ||
339 | int temp; | ||
340 | struct intersil *iregs; | ||
341 | #endif | ||
342 | 371 | ||
343 | BTFIXUPSET_CALL(bus_do_settimeofday, sbus_do_settimeofday, BTFIXUPCALL_NORM); | 372 | BTFIXUPSET_CALL(bus_do_settimeofday, sbus_do_settimeofday, BTFIXUPCALL_NORM); |
344 | btfixup(); | 373 | btfixup(); |
345 | 374 | ||
346 | if (ARCH_SUN4) | 375 | if (ARCH_SUN4) |
347 | sun4_clock_probe(); | 376 | sun4_clock_probe(); |
348 | else | ||
349 | clock_init(); | ||
350 | 377 | ||
351 | sparc_init_timers(timer_interrupt); | 378 | sparc_init_timers(timer_interrupt); |
352 | 379 | ||
353 | #ifdef CONFIG_SUN4 | 380 | #ifdef CONFIG_SUN4 |
354 | if(idprom->id_machtype == (SM_SUN4 | SM_4_330)) { | 381 | if(idprom->id_machtype == (SM_SUN4 | SM_4_330)) { |
355 | #endif | 382 | mostek_set_system_time(); |
356 | mregs = (struct mostek48t02 *)mstk48t02_regs; | ||
357 | if(!mregs) { | ||
358 | prom_printf("Something wrong, clock regs not mapped yet.\n"); | ||
359 | prom_halt(); | ||
360 | } | ||
361 | spin_lock_irq(&mostek_lock); | ||
362 | mregs->creg |= MSTK_CREG_READ; | ||
363 | sec = MSTK_REG_SEC(mregs); | ||
364 | min = MSTK_REG_MIN(mregs); | ||
365 | hour = MSTK_REG_HOUR(mregs); | ||
366 | day = MSTK_REG_DOM(mregs); | ||
367 | mon = MSTK_REG_MONTH(mregs); | ||
368 | year = MSTK_CVT_YEAR( MSTK_REG_YEAR(mregs) ); | ||
369 | xtime.tv_sec = mktime(year, mon, day, hour, min, sec); | ||
370 | xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ); | ||
371 | set_normalized_timespec(&wall_to_monotonic, | ||
372 | -xtime.tv_sec, -xtime.tv_nsec); | ||
373 | mregs->creg &= ~MSTK_CREG_READ; | ||
374 | spin_unlock_irq(&mostek_lock); | ||
375 | #ifdef CONFIG_SUN4 | ||
376 | } else if(idprom->id_machtype == (SM_SUN4 | SM_4_260) ) { | 383 | } else if(idprom->id_machtype == (SM_SUN4 | SM_4_260) ) { |
377 | /* initialise the intersil on sun4 */ | 384 | /* initialise the intersil on sun4 */ |
385 | unsigned int year, mon, day, hour, min, sec; | ||
386 | int temp; | ||
387 | struct intersil *iregs; | ||
378 | 388 | ||
379 | iregs=intersil_clock; | 389 | iregs=intersil_clock; |
380 | if(!iregs) { | 390 | if(!iregs) { |
diff --git a/arch/sparc64/mm/fault.c b/arch/sparc64/mm/fault.c index 1605967cce91..55ae802dc0ad 100644 --- a/arch/sparc64/mm/fault.c +++ b/arch/sparc64/mm/fault.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
20 | #include <linux/interrupt.h> | 20 | #include <linux/interrupt.h> |
21 | #include <linux/kprobes.h> | 21 | #include <linux/kprobes.h> |
22 | #include <linux/kallsyms.h> | ||
22 | 23 | ||
23 | #include <asm/page.h> | 24 | #include <asm/page.h> |
24 | #include <asm/pgtable.h> | 25 | #include <asm/pgtable.h> |
@@ -132,6 +133,8 @@ static void bad_kernel_pc(struct pt_regs *regs, unsigned long vaddr) | |||
132 | 133 | ||
133 | printk(KERN_CRIT "OOPS: Bogus kernel PC [%016lx] in fault handler\n", | 134 | printk(KERN_CRIT "OOPS: Bogus kernel PC [%016lx] in fault handler\n", |
134 | regs->tpc); | 135 | regs->tpc); |
136 | printk(KERN_CRIT "OOPS: RPC [%016lx]\n", regs->u_regs[15]); | ||
137 | print_symbol("RPC: <%s>\n", regs->u_regs[15]); | ||
135 | printk(KERN_CRIT "OOPS: Fault was to vaddr[%lx]\n", vaddr); | 138 | printk(KERN_CRIT "OOPS: Fault was to vaddr[%lx]\n", vaddr); |
136 | __asm__("mov %%sp, %0" : "=r" (ksp)); | 139 | __asm__("mov %%sp, %0" : "=r" (ksp)); |
137 | show_stack(current, ksp); | 140 | show_stack(current, ksp); |
diff --git a/arch/um/kernel/dyn.lds.S b/arch/um/kernel/dyn.lds.S index 2517ecb8bf27..68ed24df5c8f 100644 --- a/arch/um/kernel/dyn.lds.S +++ b/arch/um/kernel/dyn.lds.S | |||
@@ -26,6 +26,7 @@ SECTIONS | |||
26 | 26 | ||
27 | /* Read-only sections, merged into text segment: */ | 27 | /* Read-only sections, merged into text segment: */ |
28 | .hash : { *(.hash) } | 28 | .hash : { *(.hash) } |
29 | .gnu.hash : { *(.gnu.hash) } | ||
29 | .dynsym : { *(.dynsym) } | 30 | .dynsym : { *(.dynsym) } |
30 | .dynstr : { *(.dynstr) } | 31 | .dynstr : { *(.dynstr) } |
31 | .gnu.version : { *(.gnu.version) } | 32 | .gnu.version : { *(.gnu.version) } |
diff --git a/arch/v850/kernel/setup.c b/arch/v850/kernel/setup.c index 62bdb8d29fc0..1bf672a25692 100644 --- a/arch/v850/kernel/setup.c +++ b/arch/v850/kernel/setup.c | |||
@@ -1,8 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * arch/v850/kernel/setup.c -- Arch-dependent initialization functions | 2 | * arch/v850/kernel/setup.c -- Arch-dependent initialization functions |
3 | * | 3 | * |
4 | * Copyright (C) 2001,02,03,05 NEC Electronics Corporation | 4 | * Copyright (C) 2001,02,03,05,06 NEC Electronics Corporation |
5 | * Copyright (C) 2001,02,03,05 Miles Bader <miles@gnu.org> | 5 | * Copyright (C) 2001,02,03,05,06 Miles Bader <miles@gnu.org> |
6 | * | 6 | * |
7 | * This file is subject to the terms and conditions of the GNU General | 7 | * This file is subject to the terms and conditions of the GNU General |
8 | * Public License. See the file COPYING in the main directory of this | 8 | * Public License. See the file COPYING in the main directory of this |
@@ -190,7 +190,7 @@ void free_initmem (void) | |||
190 | for (addr = start; addr < end; addr += PAGE_SIZE) { | 190 | for (addr = start; addr < end; addr += PAGE_SIZE) { |
191 | struct page *page = virt_to_page (addr); | 191 | struct page *page = virt_to_page (addr); |
192 | ClearPageReserved (page); | 192 | ClearPageReserved (page); |
193 | set_page_count (page, 1); | 193 | init_page_count (page); |
194 | __free_page (page); | 194 | __free_page (page); |
195 | total_ram_pages++; | 195 | total_ram_pages++; |
196 | } | 196 | } |
diff --git a/arch/v850/kernel/v850_ksyms.c b/arch/v850/kernel/v850_ksyms.c index c03ad6ed61cc..67bc48e57c60 100644 --- a/arch/v850/kernel/v850_ksyms.c +++ b/arch/v850/kernel/v850_ksyms.c | |||
@@ -21,9 +21,6 @@ EXPORT_SYMBOL (trap_table); | |||
21 | 21 | ||
22 | /* platform dependent support */ | 22 | /* platform dependent support */ |
23 | EXPORT_SYMBOL (kernel_thread); | 23 | EXPORT_SYMBOL (kernel_thread); |
24 | EXPORT_SYMBOL (enable_irq); | ||
25 | EXPORT_SYMBOL (disable_irq); | ||
26 | EXPORT_SYMBOL (disable_irq_nosync); | ||
27 | EXPORT_SYMBOL (__bug); | 24 | EXPORT_SYMBOL (__bug); |
28 | 25 | ||
29 | /* Networking helper routines. */ | 26 | /* Networking helper routines. */ |
@@ -33,22 +30,9 @@ EXPORT_SYMBOL (ip_compute_csum); | |||
33 | EXPORT_SYMBOL (ip_fast_csum); | 30 | EXPORT_SYMBOL (ip_fast_csum); |
34 | 31 | ||
35 | /* string / mem functions */ | 32 | /* string / mem functions */ |
36 | EXPORT_SYMBOL (strcpy); | ||
37 | EXPORT_SYMBOL (strncpy); | ||
38 | EXPORT_SYMBOL (strcat); | ||
39 | EXPORT_SYMBOL (strncat); | ||
40 | EXPORT_SYMBOL (strcmp); | ||
41 | EXPORT_SYMBOL (strncmp); | ||
42 | EXPORT_SYMBOL (strchr); | ||
43 | EXPORT_SYMBOL (strlen); | ||
44 | EXPORT_SYMBOL (strnlen); | ||
45 | EXPORT_SYMBOL (strrchr); | ||
46 | EXPORT_SYMBOL (strstr); | ||
47 | EXPORT_SYMBOL (memset); | 33 | EXPORT_SYMBOL (memset); |
48 | EXPORT_SYMBOL (memcpy); | 34 | EXPORT_SYMBOL (memcpy); |
49 | EXPORT_SYMBOL (memmove); | 35 | EXPORT_SYMBOL (memmove); |
50 | EXPORT_SYMBOL (memcmp); | ||
51 | EXPORT_SYMBOL (memscan); | ||
52 | 36 | ||
53 | /* semaphores */ | 37 | /* semaphores */ |
54 | EXPORT_SYMBOL (__down); | 38 | EXPORT_SYMBOL (__down); |
diff --git a/arch/x86_64/defconfig b/arch/x86_64/defconfig index 83d389b8ebd8..840d5d93d5cc 100644 --- a/arch/x86_64/defconfig +++ b/arch/x86_64/defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.17-git22 | 3 | # Linux kernel version: 2.6.18-rc2 |
4 | # Tue Jul 4 14:24:40 2006 | 4 | # Tue Jul 18 17:13:20 2006 |
5 | # | 5 | # |
6 | CONFIG_X86_64=y | 6 | CONFIG_X86_64=y |
7 | CONFIG_64BIT=y | 7 | CONFIG_64BIT=y |
@@ -37,6 +37,7 @@ CONFIG_SWAP=y | |||
37 | CONFIG_SYSVIPC=y | 37 | CONFIG_SYSVIPC=y |
38 | CONFIG_POSIX_MQUEUE=y | 38 | CONFIG_POSIX_MQUEUE=y |
39 | # CONFIG_BSD_PROCESS_ACCT is not set | 39 | # CONFIG_BSD_PROCESS_ACCT is not set |
40 | # CONFIG_TASKSTATS is not set | ||
40 | CONFIG_SYSCTL=y | 41 | CONFIG_SYSCTL=y |
41 | # CONFIG_AUDIT is not set | 42 | # CONFIG_AUDIT is not set |
42 | CONFIG_IKCONFIG=y | 43 | CONFIG_IKCONFIG=y |
@@ -413,6 +414,7 @@ CONFIG_BLK_DEV_LOOP=y | |||
413 | CONFIG_BLK_DEV_RAM=y | 414 | CONFIG_BLK_DEV_RAM=y |
414 | CONFIG_BLK_DEV_RAM_COUNT=16 | 415 | CONFIG_BLK_DEV_RAM_COUNT=16 |
415 | CONFIG_BLK_DEV_RAM_SIZE=4096 | 416 | CONFIG_BLK_DEV_RAM_SIZE=4096 |
417 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
416 | CONFIG_BLK_DEV_INITRD=y | 418 | CONFIG_BLK_DEV_INITRD=y |
417 | # CONFIG_CDROM_PKTCDVD is not set | 419 | # CONFIG_CDROM_PKTCDVD is not set |
418 | # CONFIG_ATA_OVER_ETH is not set | 420 | # CONFIG_ATA_OVER_ETH is not set |
@@ -1195,7 +1197,7 @@ CONFIG_USB_MON=y | |||
1195 | # CONFIG_USB_LEGOTOWER is not set | 1197 | # CONFIG_USB_LEGOTOWER is not set |
1196 | # CONFIG_USB_LCD is not set | 1198 | # CONFIG_USB_LCD is not set |
1197 | # CONFIG_USB_LED is not set | 1199 | # CONFIG_USB_LED is not set |
1198 | # CONFIG_USB_CY7C63 is not set | 1200 | # CONFIG_USB_CYPRESS_CY7C63 is not set |
1199 | # CONFIG_USB_CYTHERM is not set | 1201 | # CONFIG_USB_CYTHERM is not set |
1200 | # CONFIG_USB_PHIDGETKIT is not set | 1202 | # CONFIG_USB_PHIDGETKIT is not set |
1201 | # CONFIG_USB_PHIDGETSERVO is not set | 1203 | # CONFIG_USB_PHIDGETSERVO is not set |
@@ -1373,7 +1375,6 @@ CONFIG_SUNRPC=y | |||
1373 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 1375 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
1374 | # CONFIG_SMB_FS is not set | 1376 | # CONFIG_SMB_FS is not set |
1375 | # CONFIG_CIFS is not set | 1377 | # CONFIG_CIFS is not set |
1376 | # CONFIG_CIFS_DEBUG2 is not set | ||
1377 | # CONFIG_NCP_FS is not set | 1378 | # CONFIG_NCP_FS is not set |
1378 | # CONFIG_CODA_FS is not set | 1379 | # CONFIG_CODA_FS is not set |
1379 | # CONFIG_AFS_FS is not set | 1380 | # CONFIG_AFS_FS is not set |
diff --git a/arch/x86_64/ia32/Makefile b/arch/x86_64/ia32/Makefile index 62bc5f56da9e..cdae36435e21 100644 --- a/arch/x86_64/ia32/Makefile +++ b/arch/x86_64/ia32/Makefile | |||
@@ -23,6 +23,7 @@ targets := $(foreach F,sysenter syscall,vsyscall-$F.o vsyscall-$F.so) | |||
23 | # The DSO images are built using a special linker script | 23 | # The DSO images are built using a special linker script |
24 | quiet_cmd_syscall = SYSCALL $@ | 24 | quiet_cmd_syscall = SYSCALL $@ |
25 | cmd_syscall = $(CC) -m32 -nostdlib -shared -s \ | 25 | cmd_syscall = $(CC) -m32 -nostdlib -shared -s \ |
26 | $(call ld-option, -Wl$(comma)--hash-style=sysv) \ | ||
26 | -Wl,-soname=linux-gate.so.1 -o $@ \ | 27 | -Wl,-soname=linux-gate.so.1 -o $@ \ |
27 | -Wl,-T,$(filter-out FORCE,$^) | 28 | -Wl,-T,$(filter-out FORCE,$^) |
28 | 29 | ||
diff --git a/arch/x86_64/ia32/ia32entry.S b/arch/x86_64/ia32/ia32entry.S index 9b5bb413a6e9..5d4a7d125ed0 100644 --- a/arch/x86_64/ia32/ia32entry.S +++ b/arch/x86_64/ia32/ia32entry.S | |||
@@ -103,7 +103,7 @@ ENTRY(ia32_sysenter_target) | |||
103 | pushq %rax | 103 | pushq %rax |
104 | CFI_ADJUST_CFA_OFFSET 8 | 104 | CFI_ADJUST_CFA_OFFSET 8 |
105 | cld | 105 | cld |
106 | SAVE_ARGS 0,0,1 | 106 | SAVE_ARGS 0,0,0 |
107 | /* no need to do an access_ok check here because rbp has been | 107 | /* no need to do an access_ok check here because rbp has been |
108 | 32bit zero extended */ | 108 | 32bit zero extended */ |
109 | 1: movl (%rbp),%r9d | 109 | 1: movl (%rbp),%r9d |
diff --git a/arch/x86_64/ia32/vsyscall.lds b/arch/x86_64/ia32/vsyscall.lds index f2e75ed4c6c7..1dc86ff5bcb9 100644 --- a/arch/x86_64/ia32/vsyscall.lds +++ b/arch/x86_64/ia32/vsyscall.lds | |||
@@ -11,6 +11,7 @@ SECTIONS | |||
11 | . = VSYSCALL_BASE + SIZEOF_HEADERS; | 11 | . = VSYSCALL_BASE + SIZEOF_HEADERS; |
12 | 12 | ||
13 | .hash : { *(.hash) } :text | 13 | .hash : { *(.hash) } :text |
14 | .gnu.hash : { *(.gnu.hash) } | ||
14 | .dynsym : { *(.dynsym) } | 15 | .dynsym : { *(.dynsym) } |
15 | .dynstr : { *(.dynstr) } | 16 | .dynstr : { *(.dynstr) } |
16 | .gnu.version : { *(.gnu.version) } | 17 | .gnu.version : { *(.gnu.version) } |
diff --git a/arch/x86_64/kernel/entry.S b/arch/x86_64/kernel/entry.S index d464dded68c0..6f810424df44 100644 --- a/arch/x86_64/kernel/entry.S +++ b/arch/x86_64/kernel/entry.S | |||
@@ -513,6 +513,7 @@ END(stub_rt_sigreturn) | |||
513 | swapgs | 513 | swapgs |
514 | 1: incl %gs:pda_irqcount # RED-PEN should check preempt count | 514 | 1: incl %gs:pda_irqcount # RED-PEN should check preempt count |
515 | cmoveq %gs:pda_irqstackptr,%rsp | 515 | cmoveq %gs:pda_irqstackptr,%rsp |
516 | push %rbp # backlink for old unwinder | ||
516 | /* | 517 | /* |
517 | * We entered an interrupt context - irqs are off: | 518 | * We entered an interrupt context - irqs are off: |
518 | */ | 519 | */ |
@@ -1139,18 +1140,21 @@ ENTRY(machine_check) | |||
1139 | END(machine_check) | 1140 | END(machine_check) |
1140 | #endif | 1141 | #endif |
1141 | 1142 | ||
1143 | /* Call softirq on interrupt stack. Interrupts are off. */ | ||
1142 | ENTRY(call_softirq) | 1144 | ENTRY(call_softirq) |
1143 | CFI_STARTPROC | 1145 | CFI_STARTPROC |
1144 | movq %gs:pda_irqstackptr,%rax | 1146 | push %rbp |
1145 | movq %rsp,%rdx | 1147 | CFI_ADJUST_CFA_OFFSET 8 |
1146 | CFI_DEF_CFA_REGISTER rdx | 1148 | CFI_REL_OFFSET rbp,0 |
1149 | mov %rsp,%rbp | ||
1150 | CFI_DEF_CFA_REGISTER rbp | ||
1147 | incl %gs:pda_irqcount | 1151 | incl %gs:pda_irqcount |
1148 | cmove %rax,%rsp | 1152 | cmove %gs:pda_irqstackptr,%rsp |
1149 | pushq %rdx | 1153 | push %rbp # backlink for old unwinder |
1150 | /*todo CFI_DEF_CFA_EXPRESSION ...*/ | ||
1151 | call __do_softirq | 1154 | call __do_softirq |
1152 | popq %rsp | 1155 | leaveq |
1153 | CFI_DEF_CFA_REGISTER rsp | 1156 | CFI_DEF_CFA_REGISTER rsp |
1157 | CFI_ADJUST_CFA_OFFSET -8 | ||
1154 | decl %gs:pda_irqcount | 1158 | decl %gs:pda_irqcount |
1155 | ret | 1159 | ret |
1156 | CFI_ENDPROC | 1160 | CFI_ENDPROC |
diff --git a/arch/x86_64/kernel/machine_kexec.c b/arch/x86_64/kernel/machine_kexec.c index 83fb24a02821..106076b370fc 100644 --- a/arch/x86_64/kernel/machine_kexec.c +++ b/arch/x86_64/kernel/machine_kexec.c | |||
@@ -207,14 +207,11 @@ NORET_TYPE void machine_kexec(struct kimage *image) | |||
207 | __flush_tlb(); | 207 | __flush_tlb(); |
208 | 208 | ||
209 | 209 | ||
210 | /* The segment registers are funny things, they are | 210 | /* The segment registers are funny things, they have both a |
211 | * automatically loaded from a table, in memory wherever you | 211 | * visible and an invisible part. Whenever the visible part is |
212 | * set them to a specific selector, but this table is never | 212 | * set to a specific selector, the invisible part is loaded |
213 | * accessed again unless you set the segment to a different selector. | 213 | * with from a table in memory. At no other time is the |
214 | * | 214 | * descriptor table in memory accessed. |
215 | * The more common model are caches where the behide | ||
216 | * the scenes work is done, but is also dropped at arbitrary | ||
217 | * times. | ||
218 | * | 215 | * |
219 | * I take advantage of this here by force loading the | 216 | * I take advantage of this here by force loading the |
220 | * segments, before I zap the gdt with an invalid value. | 217 | * segments, before I zap the gdt with an invalid value. |
diff --git a/arch/x86_64/kernel/mce.c b/arch/x86_64/kernel/mce.c index 88845674c661..4e017fb30fb3 100644 --- a/arch/x86_64/kernel/mce.c +++ b/arch/x86_64/kernel/mce.c | |||
@@ -615,7 +615,7 @@ static __cpuinit int mce_create_device(unsigned int cpu) | |||
615 | } | 615 | } |
616 | 616 | ||
617 | #ifdef CONFIG_HOTPLUG_CPU | 617 | #ifdef CONFIG_HOTPLUG_CPU |
618 | static __cpuinit void mce_remove_device(unsigned int cpu) | 618 | static void mce_remove_device(unsigned int cpu) |
619 | { | 619 | { |
620 | int i; | 620 | int i; |
621 | 621 | ||
@@ -626,10 +626,9 @@ static __cpuinit void mce_remove_device(unsigned int cpu) | |||
626 | sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_check_interval); | 626 | sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_check_interval); |
627 | sysdev_unregister(&per_cpu(device_mce,cpu)); | 627 | sysdev_unregister(&per_cpu(device_mce,cpu)); |
628 | } | 628 | } |
629 | #endif | ||
630 | 629 | ||
631 | /* Get notified when a cpu comes on/off. Be hotplug friendly. */ | 630 | /* Get notified when a cpu comes on/off. Be hotplug friendly. */ |
632 | static __cpuinit int | 631 | static int |
633 | mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) | 632 | mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) |
634 | { | 633 | { |
635 | unsigned int cpu = (unsigned long)hcpu; | 634 | unsigned int cpu = (unsigned long)hcpu; |
@@ -638,18 +637,17 @@ mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) | |||
638 | case CPU_ONLINE: | 637 | case CPU_ONLINE: |
639 | mce_create_device(cpu); | 638 | mce_create_device(cpu); |
640 | break; | 639 | break; |
641 | #ifdef CONFIG_HOTPLUG_CPU | ||
642 | case CPU_DEAD: | 640 | case CPU_DEAD: |
643 | mce_remove_device(cpu); | 641 | mce_remove_device(cpu); |
644 | break; | 642 | break; |
645 | #endif | ||
646 | } | 643 | } |
647 | return NOTIFY_OK; | 644 | return NOTIFY_OK; |
648 | } | 645 | } |
649 | 646 | ||
650 | static struct notifier_block __cpuinitdata mce_cpu_notifier = { | 647 | static struct notifier_block mce_cpu_notifier = { |
651 | .notifier_call = mce_cpu_callback, | 648 | .notifier_call = mce_cpu_callback, |
652 | }; | 649 | }; |
650 | #endif | ||
653 | 651 | ||
654 | static __init int mce_init_device(void) | 652 | static __init int mce_init_device(void) |
655 | { | 653 | { |
@@ -664,7 +662,7 @@ static __init int mce_init_device(void) | |||
664 | mce_create_device(i); | 662 | mce_create_device(i); |
665 | } | 663 | } |
666 | 664 | ||
667 | register_cpu_notifier(&mce_cpu_notifier); | 665 | register_hotcpu_notifier(&mce_cpu_notifier); |
668 | misc_register(&mce_log_device); | 666 | misc_register(&mce_log_device); |
669 | return err; | 667 | return err; |
670 | } | 668 | } |
diff --git a/arch/x86_64/kernel/mce_amd.c b/arch/x86_64/kernel/mce_amd.c index db2acbf7ad28..883fe747f64c 100644 --- a/arch/x86_64/kernel/mce_amd.c +++ b/arch/x86_64/kernel/mce_amd.c | |||
@@ -558,7 +558,7 @@ out: | |||
558 | * of shared sysfs dir/files, and rest of the cores will be symlinked to it. | 558 | * of shared sysfs dir/files, and rest of the cores will be symlinked to it. |
559 | */ | 559 | */ |
560 | 560 | ||
561 | static __cpuinit void deallocate_threshold_block(unsigned int cpu, | 561 | static void deallocate_threshold_block(unsigned int cpu, |
562 | unsigned int bank) | 562 | unsigned int bank) |
563 | { | 563 | { |
564 | struct threshold_block *pos = NULL; | 564 | struct threshold_block *pos = NULL; |
@@ -578,7 +578,7 @@ static __cpuinit void deallocate_threshold_block(unsigned int cpu, | |||
578 | per_cpu(threshold_banks, cpu)[bank]->blocks = NULL; | 578 | per_cpu(threshold_banks, cpu)[bank]->blocks = NULL; |
579 | } | 579 | } |
580 | 580 | ||
581 | static __cpuinit void threshold_remove_bank(unsigned int cpu, int bank) | 581 | static void threshold_remove_bank(unsigned int cpu, int bank) |
582 | { | 582 | { |
583 | int i = 0; | 583 | int i = 0; |
584 | struct threshold_bank *b; | 584 | struct threshold_bank *b; |
@@ -618,7 +618,7 @@ free_out: | |||
618 | per_cpu(threshold_banks, cpu)[bank] = NULL; | 618 | per_cpu(threshold_banks, cpu)[bank] = NULL; |
619 | } | 619 | } |
620 | 620 | ||
621 | static __cpuinit void threshold_remove_device(unsigned int cpu) | 621 | static void threshold_remove_device(unsigned int cpu) |
622 | { | 622 | { |
623 | unsigned int bank; | 623 | unsigned int bank; |
624 | 624 | ||
@@ -629,14 +629,8 @@ static __cpuinit void threshold_remove_device(unsigned int cpu) | |||
629 | } | 629 | } |
630 | } | 630 | } |
631 | 631 | ||
632 | #else /* !CONFIG_HOTPLUG_CPU */ | ||
633 | static void threshold_remove_device(unsigned int cpu) | ||
634 | { | ||
635 | } | ||
636 | #endif | ||
637 | |||
638 | /* get notified when a cpu comes on/off */ | 632 | /* get notified when a cpu comes on/off */ |
639 | static int __cpuinit threshold_cpu_callback(struct notifier_block *nfb, | 633 | static int threshold_cpu_callback(struct notifier_block *nfb, |
640 | unsigned long action, void *hcpu) | 634 | unsigned long action, void *hcpu) |
641 | { | 635 | { |
642 | /* cpu was unsigned int to begin with */ | 636 | /* cpu was unsigned int to begin with */ |
@@ -659,9 +653,10 @@ static int __cpuinit threshold_cpu_callback(struct notifier_block *nfb, | |||
659 | return NOTIFY_OK; | 653 | return NOTIFY_OK; |
660 | } | 654 | } |
661 | 655 | ||
662 | static struct notifier_block threshold_cpu_notifier __cpuinitdata = { | 656 | static struct notifier_block threshold_cpu_notifier = { |
663 | .notifier_call = threshold_cpu_callback, | 657 | .notifier_call = threshold_cpu_callback, |
664 | }; | 658 | }; |
659 | #endif /* CONFIG_HOTPLUG_CPU */ | ||
665 | 660 | ||
666 | static __init int threshold_init_device(void) | 661 | static __init int threshold_init_device(void) |
667 | { | 662 | { |
@@ -673,7 +668,7 @@ static __init int threshold_init_device(void) | |||
673 | if (err) | 668 | if (err) |
674 | return err; | 669 | return err; |
675 | } | 670 | } |
676 | register_cpu_notifier(&threshold_cpu_notifier); | 671 | register_hotcpu_notifier(&threshold_cpu_notifier); |
677 | return 0; | 672 | return 0; |
678 | } | 673 | } |
679 | 674 | ||
diff --git a/arch/x86_64/kernel/pci-calgary.c b/arch/x86_64/kernel/pci-calgary.c index e71ed53b08fb..146924ba5df5 100644 --- a/arch/x86_64/kernel/pci-calgary.c +++ b/arch/x86_64/kernel/pci-calgary.c | |||
@@ -85,7 +85,8 @@ | |||
85 | #define CSR_AGENT_MASK 0xffe0ffff | 85 | #define CSR_AGENT_MASK 0xffe0ffff |
86 | 86 | ||
87 | #define MAX_NUM_OF_PHBS 8 /* how many PHBs in total? */ | 87 | #define MAX_NUM_OF_PHBS 8 /* how many PHBs in total? */ |
88 | #define MAX_PHB_BUS_NUM (MAX_NUM_OF_PHBS * 2) /* max dev->bus->number */ | 88 | #define MAX_NUM_CHASSIS 8 /* max number of chassis */ |
89 | #define MAX_PHB_BUS_NUM (MAX_NUM_OF_PHBS * MAX_NUM_CHASSIS * 2) /* max dev->bus->number */ | ||
89 | #define PHBS_PER_CALGARY 4 | 90 | #define PHBS_PER_CALGARY 4 |
90 | 91 | ||
91 | /* register offsets in Calgary's internal register space */ | 92 | /* register offsets in Calgary's internal register space */ |
@@ -110,7 +111,8 @@ static const unsigned long phb_offsets[] = { | |||
110 | 0xB000 /* PHB3 */ | 111 | 0xB000 /* PHB3 */ |
111 | }; | 112 | }; |
112 | 113 | ||
113 | void* tce_table_kva[MAX_NUM_OF_PHBS * MAX_NUMNODES]; | 114 | static char bus_to_phb[MAX_PHB_BUS_NUM]; |
115 | void* tce_table_kva[MAX_PHB_BUS_NUM]; | ||
114 | unsigned int specified_table_size = TCE_TABLE_SIZE_UNSPECIFIED; | 116 | unsigned int specified_table_size = TCE_TABLE_SIZE_UNSPECIFIED; |
115 | static int translate_empty_slots __read_mostly = 0; | 117 | static int translate_empty_slots __read_mostly = 0; |
116 | static int calgary_detected __read_mostly = 0; | 118 | static int calgary_detected __read_mostly = 0; |
@@ -119,7 +121,7 @@ static int calgary_detected __read_mostly = 0; | |||
119 | * the bitmap of PHBs the user requested that we disable | 121 | * the bitmap of PHBs the user requested that we disable |
120 | * translation on. | 122 | * translation on. |
121 | */ | 123 | */ |
122 | static DECLARE_BITMAP(translation_disabled, MAX_NUMNODES * MAX_PHB_BUS_NUM); | 124 | static DECLARE_BITMAP(translation_disabled, MAX_PHB_BUS_NUM); |
123 | 125 | ||
124 | static void tce_cache_blast(struct iommu_table *tbl); | 126 | static void tce_cache_blast(struct iommu_table *tbl); |
125 | 127 | ||
@@ -452,7 +454,7 @@ static struct dma_mapping_ops calgary_dma_ops = { | |||
452 | 454 | ||
453 | static inline int busno_to_phbid(unsigned char num) | 455 | static inline int busno_to_phbid(unsigned char num) |
454 | { | 456 | { |
455 | return bus_to_phb(num) % PHBS_PER_CALGARY; | 457 | return bus_to_phb[num]; |
456 | } | 458 | } |
457 | 459 | ||
458 | static inline unsigned long split_queue_offset(unsigned char num) | 460 | static inline unsigned long split_queue_offset(unsigned char num) |
@@ -812,7 +814,7 @@ static int __init calgary_init(void) | |||
812 | int i, ret = -ENODEV; | 814 | int i, ret = -ENODEV; |
813 | struct pci_dev *dev = NULL; | 815 | struct pci_dev *dev = NULL; |
814 | 816 | ||
815 | for (i = 0; i <= num_online_nodes() * MAX_NUM_OF_PHBS; i++) { | 817 | for (i = 0; i < MAX_PHB_BUS_NUM; i++) { |
816 | dev = pci_get_device(PCI_VENDOR_ID_IBM, | 818 | dev = pci_get_device(PCI_VENDOR_ID_IBM, |
817 | PCI_DEVICE_ID_IBM_CALGARY, | 819 | PCI_DEVICE_ID_IBM_CALGARY, |
818 | dev); | 820 | dev); |
@@ -822,7 +824,7 @@ static int __init calgary_init(void) | |||
822 | calgary_init_one_nontraslated(dev); | 824 | calgary_init_one_nontraslated(dev); |
823 | continue; | 825 | continue; |
824 | } | 826 | } |
825 | if (!tce_table_kva[i] && !translate_empty_slots) { | 827 | if (!tce_table_kva[dev->bus->number] && !translate_empty_slots) { |
826 | pci_dev_put(dev); | 828 | pci_dev_put(dev); |
827 | continue; | 829 | continue; |
828 | } | 830 | } |
@@ -842,7 +844,7 @@ error: | |||
842 | pci_dev_put(dev); | 844 | pci_dev_put(dev); |
843 | continue; | 845 | continue; |
844 | } | 846 | } |
845 | if (!tce_table_kva[i] && !translate_empty_slots) | 847 | if (!tce_table_kva[dev->bus->number] && !translate_empty_slots) |
846 | continue; | 848 | continue; |
847 | calgary_disable_translation(dev); | 849 | calgary_disable_translation(dev); |
848 | calgary_free_tar(dev); | 850 | calgary_free_tar(dev); |
@@ -876,9 +878,10 @@ static inline int __init determine_tce_table_size(u64 ram) | |||
876 | void __init detect_calgary(void) | 878 | void __init detect_calgary(void) |
877 | { | 879 | { |
878 | u32 val; | 880 | u32 val; |
879 | int bus, table_idx; | 881 | int bus; |
880 | void *tbl; | 882 | void *tbl; |
881 | int detected = 0; | 883 | int calgary_found = 0; |
884 | int phb = -1; | ||
882 | 885 | ||
883 | /* | 886 | /* |
884 | * if the user specified iommu=off or iommu=soft or we found | 887 | * if the user specified iommu=off or iommu=soft or we found |
@@ -889,38 +892,46 @@ void __init detect_calgary(void) | |||
889 | 892 | ||
890 | specified_table_size = determine_tce_table_size(end_pfn * PAGE_SIZE); | 893 | specified_table_size = determine_tce_table_size(end_pfn * PAGE_SIZE); |
891 | 894 | ||
892 | for (bus = 0, table_idx = 0; | 895 | for (bus = 0; bus < MAX_PHB_BUS_NUM; bus++) { |
893 | bus <= num_online_nodes() * MAX_PHB_BUS_NUM; | 896 | int dev; |
894 | bus++) { | 897 | |
895 | BUG_ON(bus > MAX_NUMNODES * MAX_PHB_BUS_NUM); | 898 | tce_table_kva[bus] = NULL; |
899 | bus_to_phb[bus] = -1; | ||
900 | |||
896 | if (read_pci_config(bus, 0, 0, 0) != PCI_VENDOR_DEVICE_ID_CALGARY) | 901 | if (read_pci_config(bus, 0, 0, 0) != PCI_VENDOR_DEVICE_ID_CALGARY) |
897 | continue; | 902 | continue; |
903 | |||
904 | /* | ||
905 | * There are 4 PHBs per Calgary chip. Set phb to which phb (0-3) | ||
906 | * it is connected to releative to the clagary chip. | ||
907 | */ | ||
908 | phb = (phb + 1) % PHBS_PER_CALGARY; | ||
909 | |||
898 | if (test_bit(bus, translation_disabled)) { | 910 | if (test_bit(bus, translation_disabled)) { |
899 | printk(KERN_INFO "Calgary: translation is disabled for " | 911 | printk(KERN_INFO "Calgary: translation is disabled for " |
900 | "PHB 0x%x\n", bus); | 912 | "PHB 0x%x\n", bus); |
901 | /* skip this phb, don't allocate a tbl for it */ | 913 | /* skip this phb, don't allocate a tbl for it */ |
902 | tce_table_kva[table_idx] = NULL; | ||
903 | table_idx++; | ||
904 | continue; | 914 | continue; |
905 | } | 915 | } |
906 | /* | 916 | /* |
907 | * scan the first slot of the PCI bus to see if there | 917 | * Scan the slots of the PCI bus to see if there is a device present. |
908 | * are any devices present | 918 | * The parent bus will be the zero-ith device, so start at 1. |
909 | */ | 919 | */ |
910 | val = read_pci_config(bus, 1, 0, 0); | 920 | for (dev = 1; dev < 8; dev++) { |
911 | if (val != 0xffffffff || translate_empty_slots) { | 921 | val = read_pci_config(bus, dev, 0, 0); |
912 | tbl = alloc_tce_table(); | 922 | if (val != 0xffffffff || translate_empty_slots) { |
913 | if (!tbl) | 923 | tbl = alloc_tce_table(); |
914 | goto cleanup; | 924 | if (!tbl) |
915 | detected = 1; | 925 | goto cleanup; |
916 | } else | 926 | tce_table_kva[bus] = tbl; |
917 | tbl = NULL; | 927 | bus_to_phb[bus] = phb; |
918 | 928 | calgary_found = 1; | |
919 | tce_table_kva[table_idx] = tbl; | 929 | break; |
920 | table_idx++; | 930 | } |
931 | } | ||
921 | } | 932 | } |
922 | 933 | ||
923 | if (detected) { | 934 | if (calgary_found) { |
924 | iommu_detected = 1; | 935 | iommu_detected = 1; |
925 | calgary_detected = 1; | 936 | calgary_detected = 1; |
926 | printk(KERN_INFO "PCI-DMA: Calgary IOMMU detected. " | 937 | printk(KERN_INFO "PCI-DMA: Calgary IOMMU detected. " |
@@ -929,9 +940,9 @@ void __init detect_calgary(void) | |||
929 | return; | 940 | return; |
930 | 941 | ||
931 | cleanup: | 942 | cleanup: |
932 | for (--table_idx; table_idx >= 0; --table_idx) | 943 | for (--bus; bus >= 0; --bus) |
933 | if (tce_table_kva[table_idx]) | 944 | if (tce_table_kva[bus]) |
934 | free_tce_table(tce_table_kva[table_idx]); | 945 | free_tce_table(tce_table_kva[bus]); |
935 | } | 946 | } |
936 | 947 | ||
937 | int __init calgary_iommu_init(void) | 948 | int __init calgary_iommu_init(void) |
@@ -1002,7 +1013,7 @@ static int __init calgary_parse_options(char *p) | |||
1002 | if (p == endp) | 1013 | if (p == endp) |
1003 | break; | 1014 | break; |
1004 | 1015 | ||
1005 | if (bridge <= (num_online_nodes() * MAX_PHB_BUS_NUM)) { | 1016 | if (bridge < MAX_PHB_BUS_NUM) { |
1006 | printk(KERN_INFO "Calgary: disabling " | 1017 | printk(KERN_INFO "Calgary: disabling " |
1007 | "translation for PHB 0x%x\n", bridge); | 1018 | "translation for PHB 0x%x\n", bridge); |
1008 | set_bit(bridge, translation_disabled); | 1019 | set_bit(bridge, translation_disabled); |
diff --git a/arch/x86_64/kernel/pci-nommu.c b/arch/x86_64/kernel/pci-nommu.c index c4c3cc36ac5b..aad7609d8e92 100644 --- a/arch/x86_64/kernel/pci-nommu.c +++ b/arch/x86_64/kernel/pci-nommu.c | |||
@@ -92,5 +92,7 @@ void __init no_iommu_init(void) | |||
92 | { | 92 | { |
93 | if (dma_ops) | 93 | if (dma_ops) |
94 | return; | 94 | return; |
95 | |||
96 | force_iommu = 0; /* no HW IOMMU */ | ||
95 | dma_ops = &nommu_dma_ops; | 97 | dma_ops = &nommu_dma_ops; |
96 | } | 98 | } |
diff --git a/arch/x86_64/kernel/pci-swiotlb.c b/arch/x86_64/kernel/pci-swiotlb.c index ebdb77fe2057..6a55f87ba97f 100644 --- a/arch/x86_64/kernel/pci-swiotlb.c +++ b/arch/x86_64/kernel/pci-swiotlb.c | |||
@@ -31,9 +31,10 @@ struct dma_mapping_ops swiotlb_dma_ops = { | |||
31 | void pci_swiotlb_init(void) | 31 | void pci_swiotlb_init(void) |
32 | { | 32 | { |
33 | /* don't initialize swiotlb if iommu=off (no_iommu=1) */ | 33 | /* don't initialize swiotlb if iommu=off (no_iommu=1) */ |
34 | if (!iommu_detected && !no_iommu && | 34 | if (!iommu_detected && !no_iommu && end_pfn > MAX_DMA32_PFN) |
35 | (end_pfn > MAX_DMA32_PFN || force_iommu)) | ||
36 | swiotlb = 1; | 35 | swiotlb = 1; |
36 | if (swiotlb_force) | ||
37 | swiotlb = 1; | ||
37 | if (swiotlb) { | 38 | if (swiotlb) { |
38 | printk(KERN_INFO "PCI-DMA: Using software bounce buffering for IO (SWIOTLB)\n"); | 39 | printk(KERN_INFO "PCI-DMA: Using software bounce buffering for IO (SWIOTLB)\n"); |
39 | swiotlb_init(); | 40 | swiotlb_init(); |
diff --git a/arch/x86_64/kernel/smp.c b/arch/x86_64/kernel/smp.c index 5a1c0a3bf872..06af6ca60129 100644 --- a/arch/x86_64/kernel/smp.c +++ b/arch/x86_64/kernel/smp.c | |||
@@ -203,7 +203,7 @@ int __cpuinit init_smp_flush(void) | |||
203 | { | 203 | { |
204 | int i; | 204 | int i; |
205 | for_each_cpu_mask(i, cpu_possible_map) { | 205 | for_each_cpu_mask(i, cpu_possible_map) { |
206 | spin_lock_init(&per_cpu(flush_state.tlbstate_lock, i)); | 206 | spin_lock_init(&per_cpu(flush_state, i).tlbstate_lock); |
207 | } | 207 | } |
208 | return 0; | 208 | return 0; |
209 | } | 209 | } |
diff --git a/arch/x86_64/kernel/tce.c b/arch/x86_64/kernel/tce.c index d3a9e79e954c..5530dda3f27a 100644 --- a/arch/x86_64/kernel/tce.c +++ b/arch/x86_64/kernel/tce.c | |||
@@ -96,7 +96,6 @@ static inline unsigned int table_size_to_number_of_entries(unsigned char size) | |||
96 | static int tce_table_setparms(struct pci_dev *dev, struct iommu_table *tbl) | 96 | static int tce_table_setparms(struct pci_dev *dev, struct iommu_table *tbl) |
97 | { | 97 | { |
98 | unsigned int bitmapsz; | 98 | unsigned int bitmapsz; |
99 | unsigned int tce_table_index; | ||
100 | unsigned long bmppages; | 99 | unsigned long bmppages; |
101 | int ret; | 100 | int ret; |
102 | 101 | ||
@@ -105,8 +104,7 @@ static int tce_table_setparms(struct pci_dev *dev, struct iommu_table *tbl) | |||
105 | /* set the tce table size - measured in entries */ | 104 | /* set the tce table size - measured in entries */ |
106 | tbl->it_size = table_size_to_number_of_entries(specified_table_size); | 105 | tbl->it_size = table_size_to_number_of_entries(specified_table_size); |
107 | 106 | ||
108 | tce_table_index = bus_to_phb(tbl->it_busno); | 107 | tbl->it_base = (unsigned long)tce_table_kva[dev->bus->number]; |
109 | tbl->it_base = (unsigned long)tce_table_kva[tce_table_index]; | ||
110 | if (!tbl->it_base) { | 108 | if (!tbl->it_base) { |
111 | printk(KERN_ERR "Calgary: iommu_table_setparms: " | 109 | printk(KERN_ERR "Calgary: iommu_table_setparms: " |
112 | "no table allocated?!\n"); | 110 | "no table allocated?!\n"); |
diff --git a/arch/x86_64/kernel/time.c b/arch/x86_64/kernel/time.c index b9ff75992c16..7a9b18224182 100644 --- a/arch/x86_64/kernel/time.c +++ b/arch/x86_64/kernel/time.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/acpi.h> | 28 | #include <linux/acpi.h> |
29 | #ifdef CONFIG_ACPI | 29 | #ifdef CONFIG_ACPI |
30 | #include <acpi/achware.h> /* for PM timer frequency */ | 30 | #include <acpi/achware.h> /* for PM timer frequency */ |
31 | #include <acpi/acpi_bus.h> | ||
31 | #endif | 32 | #endif |
32 | #include <asm/8253pit.h> | 33 | #include <asm/8253pit.h> |
33 | #include <asm/pgtable.h> | 34 | #include <asm/pgtable.h> |
@@ -193,7 +194,7 @@ unsigned long profile_pc(struct pt_regs *regs) | |||
193 | is just accounted to the spinlock function. | 194 | is just accounted to the spinlock function. |
194 | Better would be to write these functions in assembler again | 195 | Better would be to write these functions in assembler again |
195 | and check exactly. */ | 196 | and check exactly. */ |
196 | if (in_lock_functions(pc)) { | 197 | if (!user_mode(regs) && in_lock_functions(pc)) { |
197 | char *v = *(char **)regs->rsp; | 198 | char *v = *(char **)regs->rsp; |
198 | if ((v >= _stext && v <= _etext) || | 199 | if ((v >= _stext && v <= _etext) || |
199 | (v >= _sinittext && v <= _einittext) || | 200 | (v >= _sinittext && v <= _einittext) || |
@@ -953,11 +954,18 @@ __cpuinit int unsynchronized_tsc(void) | |||
953 | #ifdef CONFIG_SMP | 954 | #ifdef CONFIG_SMP |
954 | if (apic_is_clustered_box()) | 955 | if (apic_is_clustered_box()) |
955 | return 1; | 956 | return 1; |
956 | /* Intel systems are normally all synchronized. Exceptions | ||
957 | are handled in the check above. */ | ||
958 | if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) | ||
959 | return 0; | ||
960 | #endif | 957 | #endif |
958 | /* Most intel systems have synchronized TSCs except for | ||
959 | multi node systems */ | ||
960 | if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) { | ||
961 | #ifdef CONFIG_ACPI | ||
962 | /* But TSC doesn't tick in C3 so don't use it there */ | ||
963 | if (acpi_fadt.length > 0 && acpi_fadt.plvl3_lat < 100) | ||
964 | return 1; | ||
965 | #endif | ||
966 | return 0; | ||
967 | } | ||
968 | |||
961 | /* Assume multi socket systems are not synchronized */ | 969 | /* Assume multi socket systems are not synchronized */ |
962 | return num_present_cpus() > 1; | 970 | return num_present_cpus() > 1; |
963 | } | 971 | } |
diff --git a/arch/x86_64/kernel/traps.c b/arch/x86_64/kernel/traps.c index eb39a2775236..14052f089814 100644 --- a/arch/x86_64/kernel/traps.c +++ b/arch/x86_64/kernel/traps.c | |||
@@ -254,7 +254,6 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s | |||
254 | { | 254 | { |
255 | const unsigned cpu = safe_smp_processor_id(); | 255 | const unsigned cpu = safe_smp_processor_id(); |
256 | unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr; | 256 | unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr; |
257 | int i = 11; | ||
258 | unsigned used = 0; | 257 | unsigned used = 0; |
259 | 258 | ||
260 | printk("\nCall Trace:\n"); | 259 | printk("\nCall Trace:\n"); |
@@ -275,11 +274,20 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s | |||
275 | if (unwind_init_blocked(&info, tsk) == 0) | 274 | if (unwind_init_blocked(&info, tsk) == 0) |
276 | unw_ret = show_trace_unwind(&info, NULL); | 275 | unw_ret = show_trace_unwind(&info, NULL); |
277 | } | 276 | } |
278 | if (unw_ret > 0) { | 277 | if (unw_ret > 0 && !arch_unw_user_mode(&info)) { |
279 | if (call_trace > 0) | 278 | #ifdef CONFIG_STACK_UNWIND |
279 | unsigned long rip = info.regs.rip; | ||
280 | print_symbol("DWARF2 unwinder stuck at %s\n", rip); | ||
281 | if (call_trace == 1) { | ||
282 | printk("Leftover inexact backtrace:\n"); | ||
283 | stack = (unsigned long *)info.regs.rsp; | ||
284 | } else if (call_trace > 1) | ||
280 | return; | 285 | return; |
281 | printk("Legacy call trace:"); | 286 | else |
282 | i = 18; | 287 | printk("Full inexact backtrace again:\n"); |
288 | #else | ||
289 | printk("Inexact backtrace:\n"); | ||
290 | #endif | ||
283 | } | 291 | } |
284 | } | 292 | } |
285 | 293 | ||
@@ -521,7 +529,7 @@ void __kprobes oops_end(unsigned long flags) | |||
521 | /* Nest count reaches zero, release the lock. */ | 529 | /* Nest count reaches zero, release the lock. */ |
522 | spin_unlock_irqrestore(&die_lock, flags); | 530 | spin_unlock_irqrestore(&die_lock, flags); |
523 | if (panic_on_oops) | 531 | if (panic_on_oops) |
524 | panic("Oops"); | 532 | panic("Fatal exception"); |
525 | } | 533 | } |
526 | 534 | ||
527 | void __kprobes __die(const char * str, struct pt_regs * regs, long err) | 535 | void __kprobes __die(const char * str, struct pt_regs * regs, long err) |
@@ -1118,8 +1126,10 @@ static int __init call_trace_setup(char *s) | |||
1118 | call_trace = -1; | 1126 | call_trace = -1; |
1119 | else if (strcmp(s, "both") == 0) | 1127 | else if (strcmp(s, "both") == 0) |
1120 | call_trace = 0; | 1128 | call_trace = 0; |
1121 | else if (strcmp(s, "new") == 0) | 1129 | else if (strcmp(s, "newfallback") == 0) |
1122 | call_trace = 1; | 1130 | call_trace = 1; |
1131 | else if (strcmp(s, "new") == 0) | ||
1132 | call_trace = 2; | ||
1123 | return 1; | 1133 | return 1; |
1124 | } | 1134 | } |
1125 | __setup("call_trace=", call_trace_setup); | 1135 | __setup("call_trace=", call_trace_setup); |
diff --git a/arch/x86_64/pci/k8-bus.c b/arch/x86_64/pci/k8-bus.c index b50a7c7c47f8..3acf60ded2a0 100644 --- a/arch/x86_64/pci/k8-bus.c +++ b/arch/x86_64/pci/k8-bus.c | |||
@@ -2,7 +2,6 @@ | |||
2 | #include <linux/pci.h> | 2 | #include <linux/pci.h> |
3 | #include <asm/mpspec.h> | 3 | #include <asm/mpspec.h> |
4 | #include <linux/cpumask.h> | 4 | #include <linux/cpumask.h> |
5 | #include <asm/k8.h> | ||
6 | 5 | ||
7 | /* | 6 | /* |
8 | * This discovers the pcibus <-> node mapping on AMD K8. | 7 | * This discovers the pcibus <-> node mapping on AMD K8. |
@@ -19,6 +18,7 @@ | |||
19 | #define NR_LDT_BUS_NUMBER_REGISTERS 3 | 18 | #define NR_LDT_BUS_NUMBER_REGISTERS 3 |
20 | #define SECONDARY_LDT_BUS_NUMBER(dword) ((dword >> 8) & 0xFF) | 19 | #define SECONDARY_LDT_BUS_NUMBER(dword) ((dword >> 8) & 0xFF) |
21 | #define SUBORDINATE_LDT_BUS_NUMBER(dword) ((dword >> 16) & 0xFF) | 20 | #define SUBORDINATE_LDT_BUS_NUMBER(dword) ((dword >> 16) & 0xFF) |
21 | #define PCI_DEVICE_ID_K8HTCONFIG 0x1100 | ||
22 | 22 | ||
23 | /** | 23 | /** |
24 | * fill_mp_bus_to_cpumask() | 24 | * fill_mp_bus_to_cpumask() |
@@ -28,7 +28,8 @@ | |||
28 | __init static int | 28 | __init static int |
29 | fill_mp_bus_to_cpumask(void) | 29 | fill_mp_bus_to_cpumask(void) |
30 | { | 30 | { |
31 | int i, j, k; | 31 | struct pci_dev *nb_dev = NULL; |
32 | int i, j; | ||
32 | u32 ldtbus, nid; | 33 | u32 ldtbus, nid; |
33 | static int lbnr[3] = { | 34 | static int lbnr[3] = { |
34 | LDT_BUS_NUMBER_REGISTER_0, | 35 | LDT_BUS_NUMBER_REGISTER_0, |
@@ -36,9 +37,8 @@ fill_mp_bus_to_cpumask(void) | |||
36 | LDT_BUS_NUMBER_REGISTER_2 | 37 | LDT_BUS_NUMBER_REGISTER_2 |
37 | }; | 38 | }; |
38 | 39 | ||
39 | cache_k8_northbridges(); | 40 | while ((nb_dev = pci_get_device(PCI_VENDOR_ID_AMD, |
40 | for (k = 0; k < num_k8_northbridges; k++) { | 41 | PCI_DEVICE_ID_K8HTCONFIG, nb_dev))) { |
41 | struct pci_dev *nb_dev = k8_northbridges[k]; | ||
42 | pci_read_config_dword(nb_dev, NODE_ID_REGISTER, &nid); | 42 | pci_read_config_dword(nb_dev, NODE_ID_REGISTER, &nid); |
43 | 43 | ||
44 | for (i = 0; i < NR_LDT_BUS_NUMBER_REGISTERS; i++) { | 44 | for (i = 0; i < NR_LDT_BUS_NUMBER_REGISTERS; i++) { |
diff --git a/arch/xtensa/kernel/traps.c b/arch/xtensa/kernel/traps.c index 27e409089a7b..ce077d6bf3a0 100644 --- a/arch/xtensa/kernel/traps.c +++ b/arch/xtensa/kernel/traps.c | |||
@@ -487,11 +487,9 @@ void die(const char * str, struct pt_regs * regs, long err) | |||
487 | if (in_interrupt()) | 487 | if (in_interrupt()) |
488 | panic("Fatal exception in interrupt"); | 488 | panic("Fatal exception in interrupt"); |
489 | 489 | ||
490 | if (panic_on_oops) { | 490 | if (panic_on_oops) |
491 | printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n"); | ||
492 | ssleep(5); | ||
493 | panic("Fatal exception"); | 491 | panic("Fatal exception"); |
494 | } | 492 | |
495 | do_exit(err); | 493 | do_exit(err); |
496 | } | 494 | } |
497 | 495 | ||
diff --git a/block/blktrace.c b/block/blktrace.c index b8c0702777ff..265f7a830619 100644 --- a/block/blktrace.c +++ b/block/blktrace.c | |||
@@ -80,7 +80,7 @@ static u32 bio_act[5] __read_mostly = { 0, BLK_TC_ACT(BLK_TC_BARRIER), BLK_TC_AC | |||
80 | #define trace_sync_bit(rw) \ | 80 | #define trace_sync_bit(rw) \ |
81 | (((rw) & (1 << BIO_RW_SYNC)) >> (BIO_RW_SYNC - 1)) | 81 | (((rw) & (1 << BIO_RW_SYNC)) >> (BIO_RW_SYNC - 1)) |
82 | #define trace_ahead_bit(rw) \ | 82 | #define trace_ahead_bit(rw) \ |
83 | (((rw) & (1 << BIO_RW_AHEAD)) << (BIO_RW_AHEAD - 0)) | 83 | (((rw) & (1 << BIO_RW_AHEAD)) << (2 - BIO_RW_AHEAD)) |
84 | 84 | ||
85 | /* | 85 | /* |
86 | * The worker for the various blk_add_trace*() types. Fills out a | 86 | * The worker for the various blk_add_trace*() types. Fills out a |
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 102ebc2c5c34..aae3123bf3ee 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -936,7 +936,7 @@ static int cfq_arm_slice_timer(struct cfq_data *cfqd, struct cfq_queue *cfqq) | |||
936 | * seeks. so allow a little bit of time for him to submit a new rq | 936 | * seeks. so allow a little bit of time for him to submit a new rq |
937 | */ | 937 | */ |
938 | if (sample_valid(cic->seek_samples) && CIC_SEEKY(cic)) | 938 | if (sample_valid(cic->seek_samples) && CIC_SEEKY(cic)) |
939 | sl = 2; | 939 | sl = min(sl, msecs_to_jiffies(2)); |
940 | 940 | ||
941 | mod_timer(&cfqd->idle_slice_timer, jiffies + sl); | 941 | mod_timer(&cfqd->idle_slice_timer, jiffies + sl); |
942 | return 1; | 942 | return 1; |
diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c index 96309b9660da..11abc7bf777e 100644 --- a/drivers/acpi/ac.c +++ b/drivers/acpi/ac.c | |||
@@ -285,6 +285,8 @@ static int __init acpi_ac_init(void) | |||
285 | { | 285 | { |
286 | int result; | 286 | int result; |
287 | 287 | ||
288 | if (acpi_disabled) | ||
289 | return -ENODEV; | ||
288 | 290 | ||
289 | acpi_ac_dir = acpi_lock_ac_dir(); | 291 | acpi_ac_dir = acpi_lock_ac_dir(); |
290 | if (!acpi_ac_dir) | 292 | if (!acpi_ac_dir) |
diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c index 81e970adeab3..1dda370f402b 100644 --- a/drivers/acpi/acpi_memhotplug.c +++ b/drivers/acpi/acpi_memhotplug.c | |||
@@ -129,11 +129,15 @@ acpi_memory_get_device_resources(struct acpi_memory_device *mem_device) | |||
129 | struct acpi_memory_info *info, *n; | 129 | struct acpi_memory_info *info, *n; |
130 | 130 | ||
131 | 131 | ||
132 | if (!list_empty(&mem_device->res_list)) | ||
133 | return 0; | ||
134 | |||
132 | status = acpi_walk_resources(mem_device->device->handle, METHOD_NAME__CRS, | 135 | status = acpi_walk_resources(mem_device->device->handle, METHOD_NAME__CRS, |
133 | acpi_memory_get_resource, mem_device); | 136 | acpi_memory_get_resource, mem_device); |
134 | if (ACPI_FAILURE(status)) { | 137 | if (ACPI_FAILURE(status)) { |
135 | list_for_each_entry_safe(info, n, &mem_device->res_list, list) | 138 | list_for_each_entry_safe(info, n, &mem_device->res_list, list) |
136 | kfree(info); | 139 | kfree(info); |
140 | INIT_LIST_HEAD(&mem_device->res_list); | ||
137 | return -EINVAL; | 141 | return -EINVAL; |
138 | } | 142 | } |
139 | 143 | ||
@@ -230,17 +234,10 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device) | |||
230 | * (i.e. memory-hot-remove function) | 234 | * (i.e. memory-hot-remove function) |
231 | */ | 235 | */ |
232 | list_for_each_entry(info, &mem_device->res_list, list) { | 236 | list_for_each_entry(info, &mem_device->res_list, list) { |
233 | u64 start_pfn, end_pfn; | 237 | if (info->enabled) { /* just sanity check...*/ |
234 | |||
235 | start_pfn = info->start_addr >> PAGE_SHIFT; | ||
236 | end_pfn = (info->start_addr + info->length - 1) >> PAGE_SHIFT; | ||
237 | |||
238 | if (pfn_valid(start_pfn) || pfn_valid(end_pfn)) { | ||
239 | /* already enabled. try next area */ | ||
240 | num_enabled++; | 238 | num_enabled++; |
241 | continue; | 239 | continue; |
242 | } | 240 | } |
243 | |||
244 | result = add_memory(node, info->start_addr, info->length); | 241 | result = add_memory(node, info->start_addr, info->length); |
245 | if (result) | 242 | if (result) |
246 | continue; | 243 | continue; |
@@ -487,10 +484,8 @@ acpi_memory_register_notify_handler(acpi_handle handle, | |||
487 | 484 | ||
488 | 485 | ||
489 | status = is_memory_device(handle); | 486 | status = is_memory_device(handle); |
490 | if (ACPI_FAILURE(status)){ | 487 | if (ACPI_FAILURE(status)) |
491 | ACPI_EXCEPTION((AE_INFO, status, "handle is no memory device")); | ||
492 | return AE_OK; /* continue */ | 488 | return AE_OK; /* continue */ |
493 | } | ||
494 | 489 | ||
495 | status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, | 490 | status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, |
496 | acpi_memory_device_notify, NULL); | 491 | acpi_memory_device_notify, NULL); |
@@ -506,10 +501,8 @@ acpi_memory_deregister_notify_handler(acpi_handle handle, | |||
506 | 501 | ||
507 | 502 | ||
508 | status = is_memory_device(handle); | 503 | status = is_memory_device(handle); |
509 | if (ACPI_FAILURE(status)){ | 504 | if (ACPI_FAILURE(status)) |
510 | ACPI_EXCEPTION((AE_INFO, status, "handle is no memory device")); | ||
511 | return AE_OK; /* continue */ | 505 | return AE_OK; /* continue */ |
512 | } | ||
513 | 506 | ||
514 | status = acpi_remove_notify_handler(handle, | 507 | status = acpi_remove_notify_handler(handle, |
515 | ACPI_SYSTEM_NOTIFY, | 508 | ACPI_SYSTEM_NOTIFY, |
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 6e5221707d97..9810e2a55d0a 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c | |||
@@ -757,6 +757,9 @@ static int __init acpi_battery_init(void) | |||
757 | { | 757 | { |
758 | int result; | 758 | int result; |
759 | 759 | ||
760 | if (acpi_disabled) | ||
761 | return -ENODEV; | ||
762 | |||
760 | acpi_battery_dir = acpi_lock_battery_dir(); | 763 | acpi_battery_dir = acpi_lock_battery_dir(); |
761 | if (!acpi_battery_dir) | 764 | if (!acpi_battery_dir) |
762 | return -ENODEV; | 765 | return -ENODEV; |
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index b2977695e120..279c4bac92e5 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/init.h> | 26 | #include <linux/init.h> |
27 | #include <linux/ioport.h> | 27 | #include <linux/ioport.h> |
28 | #include <linux/kernel.h> | ||
28 | #include <linux/list.h> | 29 | #include <linux/list.h> |
29 | #include <linux/sched.h> | 30 | #include <linux/sched.h> |
30 | #include <linux/pm.h> | 31 | #include <linux/pm.h> |
@@ -68,7 +69,8 @@ int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device) | |||
68 | 69 | ||
69 | status = acpi_get_data(handle, acpi_bus_data_handler, (void **)device); | 70 | status = acpi_get_data(handle, acpi_bus_data_handler, (void **)device); |
70 | if (ACPI_FAILURE(status) || !*device) { | 71 | if (ACPI_FAILURE(status) || !*device) { |
71 | ACPI_EXCEPTION((AE_INFO, status, "No context for object [%p]", handle)); | 72 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No context for object [%p]\n", |
73 | handle)); | ||
72 | return -ENODEV; | 74 | return -ENODEV; |
73 | } | 75 | } |
74 | 76 | ||
@@ -192,7 +194,7 @@ int acpi_bus_set_power(acpi_handle handle, int state) | |||
192 | /* Make sure this is a valid target state */ | 194 | /* Make sure this is a valid target state */ |
193 | 195 | ||
194 | if (!device->flags.power_manageable) { | 196 | if (!device->flags.power_manageable) { |
195 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device `[%s]' is not power manageable", | 197 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device `[%s]' is not power manageable\n", |
196 | device->kobj.name)); | 198 | device->kobj.name)); |
197 | return -ENODEV; | 199 | return -ENODEV; |
198 | } | 200 | } |
@@ -738,7 +740,10 @@ static int __init acpi_init(void) | |||
738 | return -ENODEV; | 740 | return -ENODEV; |
739 | } | 741 | } |
740 | 742 | ||
741 | firmware_register(&acpi_subsys); | 743 | result = firmware_register(&acpi_subsys); |
744 | if (result < 0) | ||
745 | printk(KERN_WARNING "%s: firmware_register error: %d\n", | ||
746 | __FUNCTION__, result); | ||
742 | 747 | ||
743 | result = acpi_bus_init(); | 748 | result = acpi_bus_init(); |
744 | 749 | ||
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c index 1c0a39d8b04e..578b99b71d9c 100644 --- a/drivers/acpi/dock.c +++ b/drivers/acpi/dock.c | |||
@@ -58,8 +58,8 @@ struct dock_dependent_device { | |||
58 | }; | 58 | }; |
59 | 59 | ||
60 | #define DOCK_DOCKING 0x00000001 | 60 | #define DOCK_DOCKING 0x00000001 |
61 | #define DOCK_EVENT KOBJ_DOCK | 61 | #define DOCK_EVENT 3 |
62 | #define UNDOCK_EVENT KOBJ_UNDOCK | 62 | #define UNDOCK_EVENT 2 |
63 | 63 | ||
64 | static struct dock_station *dock_station; | 64 | static struct dock_station *dock_station; |
65 | 65 | ||
@@ -322,11 +322,10 @@ static void hotplug_dock_devices(struct dock_station *ds, u32 event) | |||
322 | 322 | ||
323 | static void dock_event(struct dock_station *ds, u32 event, int num) | 323 | static void dock_event(struct dock_station *ds, u32 event, int num) |
324 | { | 324 | { |
325 | struct acpi_device *device; | 325 | /* |
326 | 326 | * we don't do events until someone tells me that | |
327 | device = dock_create_acpi_device(ds->handle); | 327 | * they would like to have them. |
328 | if (device) | 328 | */ |
329 | kobject_uevent(&device->kobj, num); | ||
330 | } | 329 | } |
331 | 330 | ||
332 | /** | 331 | /** |
diff --git a/drivers/acpi/hotkey.c b/drivers/acpi/hotkey.c index 32c9d88fd196..1ba2db671865 100644 --- a/drivers/acpi/hotkey.c +++ b/drivers/acpi/hotkey.c | |||
@@ -91,6 +91,14 @@ enum { | |||
91 | HK_EVENT_ENTERRING_S5, | 91 | HK_EVENT_ENTERRING_S5, |
92 | }; | 92 | }; |
93 | 93 | ||
94 | enum conf_entry_enum { | ||
95 | bus_handle = 0, | ||
96 | bus_method = 1, | ||
97 | action_handle = 2, | ||
98 | method = 3, | ||
99 | LAST_CONF_ENTRY | ||
100 | }; | ||
101 | |||
94 | /* procdir we use */ | 102 | /* procdir we use */ |
95 | static struct proc_dir_entry *hotkey_proc_dir; | 103 | static struct proc_dir_entry *hotkey_proc_dir; |
96 | static struct proc_dir_entry *hotkey_config; | 104 | static struct proc_dir_entry *hotkey_config; |
@@ -244,19 +252,15 @@ static int hotkey_info_open_fs(struct inode *inode, struct file *file) | |||
244 | 252 | ||
245 | static char *format_result(union acpi_object *object) | 253 | static char *format_result(union acpi_object *object) |
246 | { | 254 | { |
247 | char *buf = NULL; | 255 | char *buf; |
248 | |||
249 | buf = (char *)kmalloc(RESULT_STR_LEN, GFP_KERNEL); | ||
250 | if (buf) | ||
251 | memset(buf, 0, RESULT_STR_LEN); | ||
252 | else | ||
253 | goto do_fail; | ||
254 | 256 | ||
257 | buf = kzalloc(RESULT_STR_LEN, GFP_KERNEL); | ||
258 | if (!buf) | ||
259 | return NULL; | ||
255 | /* Now, just support integer type */ | 260 | /* Now, just support integer type */ |
256 | if (object->type == ACPI_TYPE_INTEGER) | 261 | if (object->type == ACPI_TYPE_INTEGER) |
257 | sprintf(buf, "%d\n", (u32) object->integer.value); | 262 | sprintf(buf, "%d\n", (u32) object->integer.value); |
258 | do_fail: | 263 | return buf; |
259 | return (buf); | ||
260 | } | 264 | } |
261 | 265 | ||
262 | static int hotkey_polling_seq_show(struct seq_file *seq, void *offset) | 266 | static int hotkey_polling_seq_show(struct seq_file *seq, void *offset) |
@@ -486,98 +490,102 @@ static void free_hotkey_device(union acpi_hotkey *key) | |||
486 | 490 | ||
487 | static void free_hotkey_buffer(union acpi_hotkey *key) | 491 | static void free_hotkey_buffer(union acpi_hotkey *key) |
488 | { | 492 | { |
493 | /* key would never be null, action method could be */ | ||
489 | kfree(key->event_hotkey.action_method); | 494 | kfree(key->event_hotkey.action_method); |
490 | } | 495 | } |
491 | 496 | ||
492 | static void free_poll_hotkey_buffer(union acpi_hotkey *key) | 497 | static void free_poll_hotkey_buffer(union acpi_hotkey *key) |
493 | { | 498 | { |
499 | /* key would never be null, others could be*/ | ||
494 | kfree(key->poll_hotkey.action_method); | 500 | kfree(key->poll_hotkey.action_method); |
495 | kfree(key->poll_hotkey.poll_method); | 501 | kfree(key->poll_hotkey.poll_method); |
496 | kfree(key->poll_hotkey.poll_result); | 502 | kfree(key->poll_hotkey.poll_result); |
497 | } | 503 | } |
498 | static int | 504 | static int |
499 | init_hotkey_device(union acpi_hotkey *key, char *bus_str, char *action_str, | 505 | init_hotkey_device(union acpi_hotkey *key, char **config_entry, |
500 | char *method, int std_num, int external_num) | 506 | int std_num, int external_num) |
501 | { | 507 | { |
502 | acpi_handle tmp_handle; | 508 | acpi_handle tmp_handle; |
503 | acpi_status status = AE_OK; | 509 | acpi_status status = AE_OK; |
504 | 510 | ||
505 | |||
506 | if (std_num < 0 || IS_POLL(std_num) || !key) | 511 | if (std_num < 0 || IS_POLL(std_num) || !key) |
507 | goto do_fail; | 512 | goto do_fail; |
508 | 513 | ||
509 | if (!bus_str || !action_str || !method) | 514 | if (!config_entry[bus_handle] || !config_entry[action_handle] |
515 | || !config_entry[method]) | ||
510 | goto do_fail; | 516 | goto do_fail; |
511 | 517 | ||
512 | key->link.hotkey_type = ACPI_HOTKEY_EVENT; | 518 | key->link.hotkey_type = ACPI_HOTKEY_EVENT; |
513 | key->link.hotkey_standard_num = std_num; | 519 | key->link.hotkey_standard_num = std_num; |
514 | key->event_hotkey.flag = 0; | 520 | key->event_hotkey.flag = 0; |
515 | key->event_hotkey.action_method = method; | 521 | key->event_hotkey.action_method = config_entry[method]; |
516 | 522 | ||
517 | status = | 523 | status = acpi_get_handle(NULL, config_entry[bus_handle], |
518 | acpi_get_handle(NULL, bus_str, &(key->event_hotkey.bus_handle)); | 524 | &(key->event_hotkey.bus_handle)); |
519 | if (ACPI_FAILURE(status)) | 525 | if (ACPI_FAILURE(status)) |
520 | goto do_fail; | 526 | goto do_fail_zero; |
521 | key->event_hotkey.external_hotkey_num = external_num; | 527 | key->event_hotkey.external_hotkey_num = external_num; |
522 | status = | 528 | status = acpi_get_handle(NULL, config_entry[action_handle], |
523 | acpi_get_handle(NULL, action_str, | ||
524 | &(key->event_hotkey.action_handle)); | 529 | &(key->event_hotkey.action_handle)); |
525 | if (ACPI_FAILURE(status)) | 530 | if (ACPI_FAILURE(status)) |
526 | goto do_fail; | 531 | goto do_fail_zero; |
527 | status = acpi_get_handle(key->event_hotkey.action_handle, | 532 | status = acpi_get_handle(key->event_hotkey.action_handle, |
528 | method, &tmp_handle); | 533 | config_entry[method], &tmp_handle); |
529 | if (ACPI_FAILURE(status)) | 534 | if (ACPI_FAILURE(status)) |
530 | goto do_fail; | 535 | goto do_fail_zero; |
531 | return AE_OK; | 536 | return AE_OK; |
532 | do_fail: | 537 | do_fail_zero: |
538 | key->event_hotkey.action_method = NULL; | ||
539 | do_fail: | ||
533 | return -ENODEV; | 540 | return -ENODEV; |
534 | } | 541 | } |
535 | 542 | ||
536 | static int | 543 | static int |
537 | init_poll_hotkey_device(union acpi_hotkey *key, | 544 | init_poll_hotkey_device(union acpi_hotkey *key, char **config_entry, |
538 | char *poll_str, | 545 | int std_num) |
539 | char *poll_method, | ||
540 | char *action_str, char *action_method, int std_num) | ||
541 | { | 546 | { |
542 | acpi_status status = AE_OK; | 547 | acpi_status status = AE_OK; |
543 | acpi_handle tmp_handle; | 548 | acpi_handle tmp_handle; |
544 | 549 | ||
545 | |||
546 | if (std_num < 0 || IS_EVENT(std_num) || !key) | 550 | if (std_num < 0 || IS_EVENT(std_num) || !key) |
547 | goto do_fail; | 551 | goto do_fail; |
548 | 552 | if (!config_entry[bus_handle] ||!config_entry[bus_method] || | |
549 | if (!poll_str || !poll_method || !action_str || !action_method) | 553 | !config_entry[action_handle] || !config_entry[method]) |
550 | goto do_fail; | 554 | goto do_fail; |
551 | 555 | ||
552 | key->link.hotkey_type = ACPI_HOTKEY_POLLING; | 556 | key->link.hotkey_type = ACPI_HOTKEY_POLLING; |
553 | key->link.hotkey_standard_num = std_num; | 557 | key->link.hotkey_standard_num = std_num; |
554 | key->poll_hotkey.flag = 0; | 558 | key->poll_hotkey.flag = 0; |
555 | key->poll_hotkey.poll_method = poll_method; | 559 | key->poll_hotkey.poll_method = config_entry[bus_method]; |
556 | key->poll_hotkey.action_method = action_method; | 560 | key->poll_hotkey.action_method = config_entry[method]; |
557 | 561 | ||
558 | status = | 562 | status = acpi_get_handle(NULL, config_entry[bus_handle], |
559 | acpi_get_handle(NULL, poll_str, &(key->poll_hotkey.poll_handle)); | 563 | &(key->poll_hotkey.poll_handle)); |
560 | if (ACPI_FAILURE(status)) | 564 | if (ACPI_FAILURE(status)) |
561 | goto do_fail; | 565 | goto do_fail_zero; |
562 | status = acpi_get_handle(key->poll_hotkey.poll_handle, | 566 | status = acpi_get_handle(key->poll_hotkey.poll_handle, |
563 | poll_method, &tmp_handle); | 567 | config_entry[bus_method], &tmp_handle); |
564 | if (ACPI_FAILURE(status)) | 568 | if (ACPI_FAILURE(status)) |
565 | goto do_fail; | 569 | goto do_fail_zero; |
566 | status = | 570 | status = |
567 | acpi_get_handle(NULL, action_str, | 571 | acpi_get_handle(NULL, config_entry[action_handle], |
568 | &(key->poll_hotkey.action_handle)); | 572 | &(key->poll_hotkey.action_handle)); |
569 | if (ACPI_FAILURE(status)) | 573 | if (ACPI_FAILURE(status)) |
570 | goto do_fail; | 574 | goto do_fail_zero; |
571 | status = acpi_get_handle(key->poll_hotkey.action_handle, | 575 | status = acpi_get_handle(key->poll_hotkey.action_handle, |
572 | action_method, &tmp_handle); | 576 | config_entry[method], &tmp_handle); |
573 | if (ACPI_FAILURE(status)) | 577 | if (ACPI_FAILURE(status)) |
574 | goto do_fail; | 578 | goto do_fail_zero; |
575 | key->poll_hotkey.poll_result = | 579 | key->poll_hotkey.poll_result = |
576 | (union acpi_object *)kmalloc(sizeof(union acpi_object), GFP_KERNEL); | 580 | (union acpi_object *)kmalloc(sizeof(union acpi_object), GFP_KERNEL); |
577 | if (!key->poll_hotkey.poll_result) | 581 | if (!key->poll_hotkey.poll_result) |
578 | goto do_fail; | 582 | goto do_fail_zero; |
579 | return AE_OK; | 583 | return AE_OK; |
580 | do_fail: | 584 | |
585 | do_fail_zero: | ||
586 | key->poll_hotkey.poll_method = NULL; | ||
587 | key->poll_hotkey.action_method = NULL; | ||
588 | do_fail: | ||
581 | return -ENODEV; | 589 | return -ENODEV; |
582 | } | 590 | } |
583 | 591 | ||
@@ -652,17 +660,18 @@ static int hotkey_poll_config_seq_show(struct seq_file *seq, void *offset) | |||
652 | } | 660 | } |
653 | 661 | ||
654 | static int | 662 | static int |
655 | get_parms(char *config_record, | 663 | get_parms(char *config_record, int *cmd, char **config_entry, |
656 | int *cmd, | 664 | int *internal_event_num, int *external_event_num) |
657 | char **bus_handle, | ||
658 | char **bus_method, | ||
659 | char **action_handle, | ||
660 | char **method, int *internal_event_num, int *external_event_num) | ||
661 | { | 665 | { |
666 | /* the format of *config_record = | ||
667 | * "1:\d+:*" : "cmd:internal_event_num" | ||
668 | * "\d+:\w+:\w+:\w+:\w+:\d+:\d+" : | ||
669 | * "cmd:bus_handle:bus_method:action_handle:method:internal_event_num:external_event_num" | ||
670 | */ | ||
662 | char *tmp, *tmp1, count; | 671 | char *tmp, *tmp1, count; |
672 | int i; | ||
663 | 673 | ||
664 | sscanf(config_record, "%d", cmd); | 674 | sscanf(config_record, "%d", cmd); |
665 | |||
666 | if (*cmd == 1) { | 675 | if (*cmd == 1) { |
667 | if (sscanf(config_record, "%d:%d", cmd, internal_event_num) != | 676 | if (sscanf(config_record, "%d:%d", cmd, internal_event_num) != |
668 | 2) | 677 | 2) |
@@ -674,59 +683,27 @@ get_parms(char *config_record, | |||
674 | if (!tmp) | 683 | if (!tmp) |
675 | goto do_fail; | 684 | goto do_fail; |
676 | tmp++; | 685 | tmp++; |
677 | tmp1 = strchr(tmp, ':'); | 686 | for (i = 0; i < LAST_CONF_ENTRY; i++) { |
678 | if (!tmp1) | 687 | tmp1 = strchr(tmp, ':'); |
679 | goto do_fail; | 688 | if (!tmp1) { |
680 | 689 | goto do_fail; | |
681 | count = tmp1 - tmp; | 690 | } |
682 | *bus_handle = (char *)kmalloc(count + 1, GFP_KERNEL); | 691 | count = tmp1 - tmp; |
683 | if (!*bus_handle) | 692 | config_entry[i] = kzalloc(count + 1, GFP_KERNEL); |
684 | goto do_fail; | 693 | if (!config_entry[i]) |
685 | strncpy(*bus_handle, tmp, count); | 694 | goto handle_failure; |
686 | *(*bus_handle + count) = 0; | 695 | strncpy(config_entry[i], tmp, count); |
687 | 696 | tmp = tmp1 + 1; | |
688 | tmp = tmp1; | 697 | } |
689 | tmp++; | 698 | if (sscanf(tmp, "%d:%d", internal_event_num, external_event_num) <= 0) |
690 | tmp1 = strchr(tmp, ':'); | 699 | goto handle_failure; |
691 | if (!tmp1) | 700 | if (!IS_OTHERS(*internal_event_num)) { |
692 | goto do_fail; | 701 | return 6; |
693 | count = tmp1 - tmp; | 702 | } |
694 | *bus_method = (char *)kmalloc(count + 1, GFP_KERNEL); | 703 | handle_failure: |
695 | if (!*bus_method) | 704 | while (i-- > 0) |
696 | goto do_fail; | 705 | kfree(config_entry[i]); |
697 | strncpy(*bus_method, tmp, count); | 706 | do_fail: |
698 | *(*bus_method + count) = 0; | ||
699 | |||
700 | tmp = tmp1; | ||
701 | tmp++; | ||
702 | tmp1 = strchr(tmp, ':'); | ||
703 | if (!tmp1) | ||
704 | goto do_fail; | ||
705 | count = tmp1 - tmp; | ||
706 | *action_handle = (char *)kmalloc(count + 1, GFP_KERNEL); | ||
707 | if (!*action_handle) | ||
708 | goto do_fail; | ||
709 | strncpy(*action_handle, tmp, count); | ||
710 | *(*action_handle + count) = 0; | ||
711 | |||
712 | tmp = tmp1; | ||
713 | tmp++; | ||
714 | tmp1 = strchr(tmp, ':'); | ||
715 | if (!tmp1) | ||
716 | goto do_fail; | ||
717 | count = tmp1 - tmp; | ||
718 | *method = (char *)kmalloc(count + 1, GFP_KERNEL); | ||
719 | if (!*method) | ||
720 | goto do_fail; | ||
721 | strncpy(*method, tmp, count); | ||
722 | *(*method + count) = 0; | ||
723 | |||
724 | if (sscanf(tmp1 + 1, "%d:%d", internal_event_num, external_event_num) <= | ||
725 | 0) | ||
726 | goto do_fail; | ||
727 | |||
728 | return 6; | ||
729 | do_fail: | ||
730 | return -1; | 707 | return -1; |
731 | } | 708 | } |
732 | 709 | ||
@@ -736,50 +713,34 @@ static ssize_t hotkey_write_config(struct file *file, | |||
736 | size_t count, loff_t * data) | 713 | size_t count, loff_t * data) |
737 | { | 714 | { |
738 | char *config_record = NULL; | 715 | char *config_record = NULL; |
739 | char *bus_handle = NULL; | 716 | char *config_entry[LAST_CONF_ENTRY]; |
740 | char *bus_method = NULL; | ||
741 | char *action_handle = NULL; | ||
742 | char *method = NULL; | ||
743 | int cmd, internal_event_num, external_event_num; | 717 | int cmd, internal_event_num, external_event_num; |
744 | int ret = 0; | 718 | int ret = 0; |
745 | union acpi_hotkey *key = NULL; | 719 | union acpi_hotkey *key = kzalloc(sizeof(union acpi_hotkey), GFP_KERNEL); |
746 | 720 | ||
721 | if (!key) | ||
722 | return -ENOMEM; | ||
747 | 723 | ||
748 | config_record = (char *)kmalloc(count + 1, GFP_KERNEL); | 724 | config_record = kzalloc(count + 1, GFP_KERNEL); |
749 | if (!config_record) | 725 | if (!config_record) { |
726 | kfree(key); | ||
750 | return -ENOMEM; | 727 | return -ENOMEM; |
728 | } | ||
751 | 729 | ||
752 | if (copy_from_user(config_record, buffer, count)) { | 730 | if (copy_from_user(config_record, buffer, count)) { |
753 | kfree(config_record); | 731 | kfree(config_record); |
732 | kfree(key); | ||
754 | printk(KERN_ERR PREFIX "Invalid data\n"); | 733 | printk(KERN_ERR PREFIX "Invalid data\n"); |
755 | return -EINVAL; | 734 | return -EINVAL; |
756 | } | 735 | } |
757 | config_record[count] = 0; | 736 | ret = get_parms(config_record, &cmd, config_entry, |
758 | 737 | &internal_event_num, &external_event_num); | |
759 | ret = get_parms(config_record, | ||
760 | &cmd, | ||
761 | &bus_handle, | ||
762 | &bus_method, | ||
763 | &action_handle, | ||
764 | &method, &internal_event_num, &external_event_num); | ||
765 | |||
766 | kfree(config_record); | 738 | kfree(config_record); |
767 | if (IS_OTHERS(internal_event_num)) | ||
768 | goto do_fail; | ||
769 | if (ret != 6) { | 739 | if (ret != 6) { |
770 | do_fail: | ||
771 | kfree(bus_handle); | ||
772 | kfree(bus_method); | ||
773 | kfree(action_handle); | ||
774 | kfree(method); | ||
775 | printk(KERN_ERR PREFIX "Invalid data format ret=%d\n", ret); | 740 | printk(KERN_ERR PREFIX "Invalid data format ret=%d\n", ret); |
776 | return -EINVAL; | 741 | return -EINVAL; |
777 | } | 742 | } |
778 | 743 | ||
779 | key = kmalloc(sizeof(union acpi_hotkey), GFP_KERNEL); | ||
780 | if (!key) | ||
781 | goto do_fail; | ||
782 | memset(key, 0, sizeof(union acpi_hotkey)); | ||
783 | if (cmd == 1) { | 744 | if (cmd == 1) { |
784 | union acpi_hotkey *tmp = NULL; | 745 | union acpi_hotkey *tmp = NULL; |
785 | tmp = get_hotkey_by_event(&global_hotkey_list, | 746 | tmp = get_hotkey_by_event(&global_hotkey_list, |
@@ -791,34 +752,19 @@ static ssize_t hotkey_write_config(struct file *file, | |||
791 | goto cont_cmd; | 752 | goto cont_cmd; |
792 | } | 753 | } |
793 | if (IS_EVENT(internal_event_num)) { | 754 | if (IS_EVENT(internal_event_num)) { |
794 | kfree(bus_method); | 755 | if (init_hotkey_device(key, config_entry, |
795 | ret = init_hotkey_device(key, bus_handle, action_handle, method, | 756 | internal_event_num, external_event_num)) |
796 | internal_event_num, | 757 | goto init_hotkey_fail; |
797 | external_event_num); | 758 | } else { |
798 | } else | 759 | if (init_poll_hotkey_device(key, config_entry, |
799 | ret = init_poll_hotkey_device(key, bus_handle, bus_method, | 760 | internal_event_num)) |
800 | action_handle, method, | 761 | goto init_poll_hotkey_fail; |
801 | internal_event_num); | ||
802 | if (ret) { | ||
803 | kfree(bus_handle); | ||
804 | kfree(action_handle); | ||
805 | if (IS_EVENT(internal_event_num)) | ||
806 | free_hotkey_buffer(key); | ||
807 | else | ||
808 | free_poll_hotkey_buffer(key); | ||
809 | kfree(key); | ||
810 | printk(KERN_ERR PREFIX "Invalid hotkey\n"); | ||
811 | return -EINVAL; | ||
812 | } | 762 | } |
813 | 763 | cont_cmd: | |
814 | cont_cmd: | ||
815 | kfree(bus_handle); | ||
816 | kfree(action_handle); | ||
817 | |||
818 | switch (cmd) { | 764 | switch (cmd) { |
819 | case 0: | 765 | case 0: |
820 | if (get_hotkey_by_event | 766 | if (get_hotkey_by_event(&global_hotkey_list, |
821 | (&global_hotkey_list, key->link.hotkey_standard_num)) | 767 | key->link.hotkey_standard_num)) |
822 | goto fail_out; | 768 | goto fail_out; |
823 | else | 769 | else |
824 | hotkey_add(key); | 770 | hotkey_add(key); |
@@ -827,6 +773,7 @@ static ssize_t hotkey_write_config(struct file *file, | |||
827 | hotkey_remove(key); | 773 | hotkey_remove(key); |
828 | break; | 774 | break; |
829 | case 2: | 775 | case 2: |
776 | /* key is kfree()ed if matched*/ | ||
830 | if (hotkey_update(key)) | 777 | if (hotkey_update(key)) |
831 | goto fail_out; | 778 | goto fail_out; |
832 | break; | 779 | break; |
@@ -835,11 +782,22 @@ static ssize_t hotkey_write_config(struct file *file, | |||
835 | break; | 782 | break; |
836 | } | 783 | } |
837 | return count; | 784 | return count; |
838 | fail_out: | 785 | |
839 | if (IS_EVENT(internal_event_num)) | 786 | init_poll_hotkey_fail: /* failed init_poll_hotkey_device */ |
840 | free_hotkey_buffer(key); | 787 | kfree(config_entry[bus_method]); |
841 | else | 788 | config_entry[bus_method] = NULL; |
842 | free_poll_hotkey_buffer(key); | 789 | init_hotkey_fail: /* failed init_hotkey_device */ |
790 | kfree(config_entry[method]); | ||
791 | fail_out: | ||
792 | kfree(config_entry[bus_handle]); | ||
793 | kfree(config_entry[action_handle]); | ||
794 | /* No double free since elements =NULL for error cases */ | ||
795 | if (IS_EVENT(internal_event_num)) { | ||
796 | if (config_entry[bus_method]) | ||
797 | kfree(config_entry[bus_method]); | ||
798 | free_hotkey_buffer(key); /* frees [method] */ | ||
799 | } else | ||
800 | free_poll_hotkey_buffer(key); /* frees [bus_method]+[method] */ | ||
843 | kfree(key); | 801 | kfree(key); |
844 | printk(KERN_ERR PREFIX "invalid key\n"); | 802 | printk(KERN_ERR PREFIX "invalid key\n"); |
845 | return -EINVAL; | 803 | return -EINVAL; |
@@ -923,10 +881,9 @@ static ssize_t hotkey_execute_aml_method(struct file *file, | |||
923 | union acpi_hotkey *key; | 881 | union acpi_hotkey *key; |
924 | 882 | ||
925 | 883 | ||
926 | arg = (char *)kmalloc(count + 1, GFP_KERNEL); | 884 | arg = kzalloc(count + 1, GFP_KERNEL); |
927 | if (!arg) | 885 | if (!arg) |
928 | return -ENOMEM; | 886 | return -ENOMEM; |
929 | arg[count] = 0; | ||
930 | 887 | ||
931 | if (copy_from_user(arg, buffer, count)) { | 888 | if (copy_from_user(arg, buffer, count)) { |
932 | kfree(arg); | 889 | kfree(arg); |
diff --git a/drivers/acpi/i2c_ec.c b/drivers/acpi/i2c_ec.c index 84239d51dc0c..6809c283ec58 100644 --- a/drivers/acpi/i2c_ec.c +++ b/drivers/acpi/i2c_ec.c | |||
@@ -330,7 +330,7 @@ static int acpi_ec_hc_add(struct acpi_device *device) | |||
330 | status = acpi_evaluate_integer(ec_hc->handle, "_EC", NULL, &val); | 330 | status = acpi_evaluate_integer(ec_hc->handle, "_EC", NULL, &val); |
331 | if (ACPI_FAILURE(status)) { | 331 | if (ACPI_FAILURE(status)) { |
332 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Error obtaining _EC\n")); | 332 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Error obtaining _EC\n")); |
333 | kfree(ec_hc->smbus); | 333 | kfree(ec_hc); |
334 | kfree(smbus); | 334 | kfree(smbus); |
335 | return -EIO; | 335 | return -EIO; |
336 | } | 336 | } |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index b7d1514cd199..507f051d1cef 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
@@ -746,6 +746,16 @@ acpi_status acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 timeout) | |||
746 | ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "Waiting for semaphore[%p|%d|%d]\n", | 746 | ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "Waiting for semaphore[%p|%d|%d]\n", |
747 | handle, units, timeout)); | 747 | handle, units, timeout)); |
748 | 748 | ||
749 | /* | ||
750 | * This can be called during resume with interrupts off. | ||
751 | * Like boot-time, we should be single threaded and will | ||
752 | * always get the lock if we try -- timeout or not. | ||
753 | * If this doesn't succeed, then we will oops courtesy of | ||
754 | * might_sleep() in down(). | ||
755 | */ | ||
756 | if (!down_trylock(sem)) | ||
757 | return AE_OK; | ||
758 | |||
749 | switch (timeout) { | 759 | switch (timeout) { |
750 | /* | 760 | /* |
751 | * No Wait: | 761 | * No Wait: |
diff --git a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c index db7b350a5035..62bef0b3b614 100644 --- a/drivers/acpi/sbs.c +++ b/drivers/acpi/sbs.c | |||
@@ -1714,6 +1714,9 @@ static int __init acpi_sbs_init(void) | |||
1714 | { | 1714 | { |
1715 | int result = 0; | 1715 | int result = 0; |
1716 | 1716 | ||
1717 | if (acpi_disabled) | ||
1718 | return -ENODEV; | ||
1719 | |||
1717 | init_MUTEX(&sbs_sem); | 1720 | init_MUTEX(&sbs_sem); |
1718 | 1721 | ||
1719 | if (capacity_mode != DEF_CAPACITY_UNIT | 1722 | if (capacity_mode != DEF_CAPACITY_UNIT |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 5fcb50c7b778..698a1540e303 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -4,6 +4,7 @@ | |||
4 | 4 | ||
5 | #include <linux/module.h> | 5 | #include <linux/module.h> |
6 | #include <linux/init.h> | 6 | #include <linux/init.h> |
7 | #include <linux/kernel.h> | ||
7 | #include <linux/acpi.h> | 8 | #include <linux/acpi.h> |
8 | 9 | ||
9 | #include <acpi/acpi_drivers.h> | 10 | #include <acpi/acpi_drivers.h> |
@@ -113,6 +114,8 @@ static struct kset acpi_namespace_kset = { | |||
113 | static void acpi_device_register(struct acpi_device *device, | 114 | static void acpi_device_register(struct acpi_device *device, |
114 | struct acpi_device *parent) | 115 | struct acpi_device *parent) |
115 | { | 116 | { |
117 | int err; | ||
118 | |||
116 | /* | 119 | /* |
117 | * Linkage | 120 | * Linkage |
118 | * ------- | 121 | * ------- |
@@ -138,7 +141,10 @@ static void acpi_device_register(struct acpi_device *device, | |||
138 | device->kobj.parent = &parent->kobj; | 141 | device->kobj.parent = &parent->kobj; |
139 | device->kobj.ktype = &ktype_acpi_ns; | 142 | device->kobj.ktype = &ktype_acpi_ns; |
140 | device->kobj.kset = &acpi_namespace_kset; | 143 | device->kobj.kset = &acpi_namespace_kset; |
141 | kobject_register(&device->kobj); | 144 | err = kobject_register(&device->kobj); |
145 | if (err < 0) | ||
146 | printk(KERN_WARNING "%s: kobject_register error: %d\n", | ||
147 | __FUNCTION__, err); | ||
142 | create_sysfs_device_files(device); | 148 | create_sysfs_device_files(device); |
143 | } | 149 | } |
144 | 150 | ||
@@ -1450,7 +1456,9 @@ static int __init acpi_scan_init(void) | |||
1450 | if (acpi_disabled) | 1456 | if (acpi_disabled) |
1451 | return 0; | 1457 | return 0; |
1452 | 1458 | ||
1453 | kset_register(&acpi_namespace_kset); | 1459 | result = kset_register(&acpi_namespace_kset); |
1460 | if (result < 0) | ||
1461 | printk(KERN_ERR PREFIX "kset_register error: %d\n", result); | ||
1454 | 1462 | ||
1455 | result = bus_register(&acpi_bus_type); | 1463 | result = bus_register(&acpi_bus_type); |
1456 | if (result) { | 1464 | if (result) { |
diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c index f48227f4c8c9..d0d84c43a9d4 100644 --- a/drivers/acpi/utils.c +++ b/drivers/acpi/utils.c | |||
@@ -262,7 +262,7 @@ acpi_evaluate_integer(acpi_handle handle, | |||
262 | if (!data) | 262 | if (!data) |
263 | return AE_BAD_PARAMETER; | 263 | return AE_BAD_PARAMETER; |
264 | 264 | ||
265 | element = kmalloc(sizeof(union acpi_object), GFP_KERNEL); | 265 | element = kmalloc(sizeof(union acpi_object), irqs_disabled() ? GFP_ATOMIC: GFP_KERNEL); |
266 | if (!element) | 266 | if (!element) |
267 | return AE_NO_MEMORY; | 267 | return AE_NO_MEMORY; |
268 | 268 | ||
diff --git a/drivers/base/topology.c b/drivers/base/topology.c index c2d621632383..3ef9d514b916 100644 --- a/drivers/base/topology.c +++ b/drivers/base/topology.c | |||
@@ -139,7 +139,7 @@ static int __cpuinit topology_sysfs_init(void) | |||
139 | (void *)(long)i); | 139 | (void *)(long)i); |
140 | } | 140 | } |
141 | 141 | ||
142 | register_cpu_notifier(&topology_cpu_notifier); | 142 | register_hotcpu_notifier(&topology_cpu_notifier); |
143 | 143 | ||
144 | return 0; | 144 | return 0; |
145 | } | 145 | } |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 1c4df22dfd2a..7b0eca703a67 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -1233,6 +1233,50 @@ static inline void complete_buffers(struct bio *bio, int status) | |||
1233 | } | 1233 | } |
1234 | } | 1234 | } |
1235 | 1235 | ||
1236 | static void cciss_check_queues(ctlr_info_t *h) | ||
1237 | { | ||
1238 | int start_queue = h->next_to_run; | ||
1239 | int i; | ||
1240 | |||
1241 | /* check to see if we have maxed out the number of commands that can | ||
1242 | * be placed on the queue. If so then exit. We do this check here | ||
1243 | * in case the interrupt we serviced was from an ioctl and did not | ||
1244 | * free any new commands. | ||
1245 | */ | ||
1246 | if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS) | ||
1247 | return; | ||
1248 | |||
1249 | /* We have room on the queue for more commands. Now we need to queue | ||
1250 | * them up. We will also keep track of the next queue to run so | ||
1251 | * that every queue gets a chance to be started first. | ||
1252 | */ | ||
1253 | for (i = 0; i < h->highest_lun + 1; i++) { | ||
1254 | int curr_queue = (start_queue + i) % (h->highest_lun + 1); | ||
1255 | /* make sure the disk has been added and the drive is real | ||
1256 | * because this can be called from the middle of init_one. | ||
1257 | */ | ||
1258 | if (!(h->drv[curr_queue].queue) || !(h->drv[curr_queue].heads)) | ||
1259 | continue; | ||
1260 | blk_start_queue(h->gendisk[curr_queue]->queue); | ||
1261 | |||
1262 | /* check to see if we have maxed out the number of commands | ||
1263 | * that can be placed on the queue. | ||
1264 | */ | ||
1265 | if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS) { | ||
1266 | if (curr_queue == start_queue) { | ||
1267 | h->next_to_run = | ||
1268 | (start_queue + 1) % (h->highest_lun + 1); | ||
1269 | break; | ||
1270 | } else { | ||
1271 | h->next_to_run = curr_queue; | ||
1272 | break; | ||
1273 | } | ||
1274 | } else { | ||
1275 | curr_queue = (curr_queue + 1) % (h->highest_lun + 1); | ||
1276 | } | ||
1277 | } | ||
1278 | } | ||
1279 | |||
1236 | static void cciss_softirq_done(struct request *rq) | 1280 | static void cciss_softirq_done(struct request *rq) |
1237 | { | 1281 | { |
1238 | CommandList_struct *cmd = rq->completion_data; | 1282 | CommandList_struct *cmd = rq->completion_data; |
@@ -1264,6 +1308,7 @@ static void cciss_softirq_done(struct request *rq) | |||
1264 | spin_lock_irqsave(&h->lock, flags); | 1308 | spin_lock_irqsave(&h->lock, flags); |
1265 | end_that_request_last(rq, rq->errors); | 1309 | end_that_request_last(rq, rq->errors); |
1266 | cmd_free(h, cmd, 1); | 1310 | cmd_free(h, cmd, 1); |
1311 | cciss_check_queues(h); | ||
1267 | spin_unlock_irqrestore(&h->lock, flags); | 1312 | spin_unlock_irqrestore(&h->lock, flags); |
1268 | } | 1313 | } |
1269 | 1314 | ||
@@ -2528,8 +2573,6 @@ static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs) | |||
2528 | CommandList_struct *c; | 2573 | CommandList_struct *c; |
2529 | unsigned long flags; | 2574 | unsigned long flags; |
2530 | __u32 a, a1, a2; | 2575 | __u32 a, a1, a2; |
2531 | int j; | ||
2532 | int start_queue = h->next_to_run; | ||
2533 | 2576 | ||
2534 | if (interrupt_not_for_us(h)) | 2577 | if (interrupt_not_for_us(h)) |
2535 | return IRQ_NONE; | 2578 | return IRQ_NONE; |
@@ -2588,45 +2631,6 @@ static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs) | |||
2588 | } | 2631 | } |
2589 | } | 2632 | } |
2590 | 2633 | ||
2591 | /* check to see if we have maxed out the number of commands that can | ||
2592 | * be placed on the queue. If so then exit. We do this check here | ||
2593 | * in case the interrupt we serviced was from an ioctl and did not | ||
2594 | * free any new commands. | ||
2595 | */ | ||
2596 | if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS) | ||
2597 | goto cleanup; | ||
2598 | |||
2599 | /* We have room on the queue for more commands. Now we need to queue | ||
2600 | * them up. We will also keep track of the next queue to run so | ||
2601 | * that every queue gets a chance to be started first. | ||
2602 | */ | ||
2603 | for (j = 0; j < h->highest_lun + 1; j++) { | ||
2604 | int curr_queue = (start_queue + j) % (h->highest_lun + 1); | ||
2605 | /* make sure the disk has been added and the drive is real | ||
2606 | * because this can be called from the middle of init_one. | ||
2607 | */ | ||
2608 | if (!(h->drv[curr_queue].queue) || !(h->drv[curr_queue].heads)) | ||
2609 | continue; | ||
2610 | blk_start_queue(h->gendisk[curr_queue]->queue); | ||
2611 | |||
2612 | /* check to see if we have maxed out the number of commands | ||
2613 | * that can be placed on the queue. | ||
2614 | */ | ||
2615 | if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS) { | ||
2616 | if (curr_queue == start_queue) { | ||
2617 | h->next_to_run = | ||
2618 | (start_queue + 1) % (h->highest_lun + 1); | ||
2619 | goto cleanup; | ||
2620 | } else { | ||
2621 | h->next_to_run = curr_queue; | ||
2622 | goto cleanup; | ||
2623 | } | ||
2624 | } else { | ||
2625 | curr_queue = (curr_queue + 1) % (h->highest_lun + 1); | ||
2626 | } | ||
2627 | } | ||
2628 | |||
2629 | cleanup: | ||
2630 | spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); | 2634 | spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); |
2631 | return IRQ_HANDLED; | 2635 | return IRQ_HANDLED; |
2632 | } | 2636 | } |
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 0a1b1ea36ddc..bdbade9a5cf5 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c | |||
@@ -300,6 +300,15 @@ static struct request *nbd_read_stat(struct nbd_device *lo) | |||
300 | lo->disk->disk_name, result); | 300 | lo->disk->disk_name, result); |
301 | goto harderror; | 301 | goto harderror; |
302 | } | 302 | } |
303 | |||
304 | if (ntohl(reply.magic) != NBD_REPLY_MAGIC) { | ||
305 | printk(KERN_ERR "%s: Wrong magic (0x%lx)\n", | ||
306 | lo->disk->disk_name, | ||
307 | (unsigned long)ntohl(reply.magic)); | ||
308 | result = -EPROTO; | ||
309 | goto harderror; | ||
310 | } | ||
311 | |||
303 | req = nbd_find_request(lo, reply.handle); | 312 | req = nbd_find_request(lo, reply.handle); |
304 | if (unlikely(IS_ERR(req))) { | 313 | if (unlikely(IS_ERR(req))) { |
305 | result = PTR_ERR(req); | 314 | result = PTR_ERR(req); |
@@ -312,13 +321,6 @@ static struct request *nbd_read_stat(struct nbd_device *lo) | |||
312 | goto harderror; | 321 | goto harderror; |
313 | } | 322 | } |
314 | 323 | ||
315 | if (ntohl(reply.magic) != NBD_REPLY_MAGIC) { | ||
316 | printk(KERN_ERR "%s: Wrong magic (0x%lx)\n", | ||
317 | lo->disk->disk_name, | ||
318 | (unsigned long)ntohl(reply.magic)); | ||
319 | result = -EPROTO; | ||
320 | goto harderror; | ||
321 | } | ||
322 | if (ntohl(reply.error)) { | 324 | if (ntohl(reply.error)) { |
323 | printk(KERN_ERR "%s: Other side returned error (%d)\n", | 325 | printk(KERN_ERR "%s: Other side returned error (%d)\n", |
324 | lo->disk->disk_name, ntohl(reply.error)); | 326 | lo->disk->disk_name, ntohl(reply.error)); |
@@ -339,7 +341,8 @@ static struct request *nbd_read_stat(struct nbd_device *lo) | |||
339 | printk(KERN_ERR "%s: Receive data failed (result %d)\n", | 341 | printk(KERN_ERR "%s: Receive data failed (result %d)\n", |
340 | lo->disk->disk_name, | 342 | lo->disk->disk_name, |
341 | result); | 343 | result); |
342 | goto harderror; | 344 | req->errors++; |
345 | return req; | ||
343 | } | 346 | } |
344 | dprintk(DBG_RX, "%s: request %p: got %d bytes data\n", | 347 | dprintk(DBG_RX, "%s: request %p: got %d bytes data\n", |
345 | lo->disk->disk_name, req, bvec->bv_len); | 348 | lo->disk->disk_name, req, bvec->bv_len); |
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index bde2c64b6346..451b996bba91 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c | |||
@@ -2577,19 +2577,19 @@ static int pkt_ctl_ioctl(struct inode *inode, struct file *file, unsigned int cm | |||
2577 | case PKT_CTRL_CMD_SETUP: | 2577 | case PKT_CTRL_CMD_SETUP: |
2578 | if (!capable(CAP_SYS_ADMIN)) | 2578 | if (!capable(CAP_SYS_ADMIN)) |
2579 | return -EPERM; | 2579 | return -EPERM; |
2580 | mutex_lock(&ctl_mutex); | 2580 | mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING); |
2581 | ret = pkt_setup_dev(&ctrl_cmd); | 2581 | ret = pkt_setup_dev(&ctrl_cmd); |
2582 | mutex_unlock(&ctl_mutex); | 2582 | mutex_unlock(&ctl_mutex); |
2583 | break; | 2583 | break; |
2584 | case PKT_CTRL_CMD_TEARDOWN: | 2584 | case PKT_CTRL_CMD_TEARDOWN: |
2585 | if (!capable(CAP_SYS_ADMIN)) | 2585 | if (!capable(CAP_SYS_ADMIN)) |
2586 | return -EPERM; | 2586 | return -EPERM; |
2587 | mutex_lock(&ctl_mutex); | 2587 | mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING); |
2588 | ret = pkt_remove_dev(&ctrl_cmd); | 2588 | ret = pkt_remove_dev(&ctrl_cmd); |
2589 | mutex_unlock(&ctl_mutex); | 2589 | mutex_unlock(&ctl_mutex); |
2590 | break; | 2590 | break; |
2591 | case PKT_CTRL_CMD_STATUS: | 2591 | case PKT_CTRL_CMD_STATUS: |
2592 | mutex_lock(&ctl_mutex); | 2592 | mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING); |
2593 | pkt_get_status(&ctrl_cmd); | 2593 | pkt_get_status(&ctrl_cmd); |
2594 | mutex_unlock(&ctl_mutex); | 2594 | mutex_unlock(&ctl_mutex); |
2595 | break; | 2595 | break; |
diff --git a/drivers/char/hvsi.c b/drivers/char/hvsi.c index 41db8060e8f7..017f755632a3 100644 --- a/drivers/char/hvsi.c +++ b/drivers/char/hvsi.c | |||
@@ -311,7 +311,8 @@ static void hvsi_recv_control(struct hvsi_struct *hp, uint8_t *packet, | |||
311 | /* CD went away; no more connection */ | 311 | /* CD went away; no more connection */ |
312 | pr_debug("hvsi%i: CD dropped\n", hp->index); | 312 | pr_debug("hvsi%i: CD dropped\n", hp->index); |
313 | hp->mctrl &= TIOCM_CD; | 313 | hp->mctrl &= TIOCM_CD; |
314 | if (!(hp->tty->flags & CLOCAL)) | 314 | /* If userland hasn't done an open(2) yet, hp->tty is NULL. */ |
315 | if (hp->tty && !(hp->tty->flags & CLOCAL)) | ||
315 | *to_hangup = hp->tty; | 316 | *to_hangup = hp->tty; |
316 | } | 317 | } |
317 | break; | 318 | break; |
@@ -986,10 +987,7 @@ static void hvsi_write_worker(void *arg) | |||
986 | start_j = 0; | 987 | start_j = 0; |
987 | #endif /* DEBUG */ | 988 | #endif /* DEBUG */ |
988 | wake_up_all(&hp->emptyq); | 989 | wake_up_all(&hp->emptyq); |
989 | if (test_bit(TTY_DO_WRITE_WAKEUP, &hp->tty->flags) | 990 | tty_wakeup(hp->tty); |
990 | && hp->tty->ldisc.write_wakeup) | ||
991 | hp->tty->ldisc.write_wakeup(hp->tty); | ||
992 | wake_up_interruptible(&hp->tty->write_wait); | ||
993 | } | 991 | } |
994 | 992 | ||
995 | out: | 993 | out: |
diff --git a/drivers/char/hw_random/geode-rng.c b/drivers/char/hw_random/geode-rng.c index be61f22ee7bb..d37ced0d132b 100644 --- a/drivers/char/hw_random/geode-rng.c +++ b/drivers/char/hw_random/geode-rng.c | |||
@@ -107,10 +107,14 @@ found: | |||
107 | if (err) { | 107 | if (err) { |
108 | printk(KERN_ERR PFX "RNG registering failed (%d)\n", | 108 | printk(KERN_ERR PFX "RNG registering failed (%d)\n", |
109 | err); | 109 | err); |
110 | goto out; | 110 | goto err_unmap; |
111 | } | 111 | } |
112 | out: | 112 | out: |
113 | return err; | 113 | return err; |
114 | |||
115 | err_unmap: | ||
116 | iounmap(mem); | ||
117 | goto out; | ||
114 | } | 118 | } |
115 | 119 | ||
116 | static void __exit mod_exit(void) | 120 | static void __exit mod_exit(void) |
diff --git a/drivers/char/hw_random/intel-rng.c b/drivers/char/hw_random/intel-rng.c index 6594bd5645f4..ccd7e7102234 100644 --- a/drivers/char/hw_random/intel-rng.c +++ b/drivers/char/hw_random/intel-rng.c | |||
@@ -164,7 +164,7 @@ static int __init mod_init(void) | |||
164 | if (err) { | 164 | if (err) { |
165 | printk(KERN_ERR PFX "RNG registering failed (%d)\n", | 165 | printk(KERN_ERR PFX "RNG registering failed (%d)\n", |
166 | err); | 166 | err); |
167 | goto out; | 167 | goto err_unmap; |
168 | } | 168 | } |
169 | out: | 169 | out: |
170 | return err; | 170 | return err; |
diff --git a/drivers/char/hw_random/omap-rng.c b/drivers/char/hw_random/omap-rng.c index 819516b35a79..a01d796d1eeb 100644 --- a/drivers/char/hw_random/omap-rng.c +++ b/drivers/char/hw_random/omap-rng.c | |||
@@ -25,12 +25,12 @@ | |||
25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/init.h> | 26 | #include <linux/init.h> |
27 | #include <linux/random.h> | 27 | #include <linux/random.h> |
28 | #include <linux/clk.h> | ||
28 | #include <linux/err.h> | 29 | #include <linux/err.h> |
29 | #include <linux/device.h> | 30 | #include <linux/platform_device.h> |
30 | #include <linux/hw_random.h> | 31 | #include <linux/hw_random.h> |
31 | 32 | ||
32 | #include <asm/io.h> | 33 | #include <asm/io.h> |
33 | #include <asm/hardware/clock.h> | ||
34 | 34 | ||
35 | #define RNG_OUT_REG 0x00 /* Output register */ | 35 | #define RNG_OUT_REG 0x00 /* Output register */ |
36 | #define RNG_STAT_REG 0x04 /* Status register | 36 | #define RNG_STAT_REG 0x04 /* Status register |
@@ -52,7 +52,7 @@ | |||
52 | 52 | ||
53 | static void __iomem *rng_base; | 53 | static void __iomem *rng_base; |
54 | static struct clk *rng_ick; | 54 | static struct clk *rng_ick; |
55 | static struct device *rng_dev; | 55 | static struct platform_device *rng_dev; |
56 | 56 | ||
57 | static u32 omap_rng_read_reg(int reg) | 57 | static u32 omap_rng_read_reg(int reg) |
58 | { | 58 | { |
@@ -83,9 +83,8 @@ static struct hwrng omap_rng_ops = { | |||
83 | .data_read = omap_rng_data_read, | 83 | .data_read = omap_rng_data_read, |
84 | }; | 84 | }; |
85 | 85 | ||
86 | static int __init omap_rng_probe(struct device *dev) | 86 | static int __init omap_rng_probe(struct platform_device *pdev) |
87 | { | 87 | { |
88 | struct platform_device *pdev = to_platform_device(dev); | ||
89 | struct resource *res, *mem; | 88 | struct resource *res, *mem; |
90 | int ret; | 89 | int ret; |
91 | 90 | ||
@@ -95,16 +94,14 @@ static int __init omap_rng_probe(struct device *dev) | |||
95 | */ | 94 | */ |
96 | BUG_ON(rng_dev); | 95 | BUG_ON(rng_dev); |
97 | 96 | ||
98 | if (cpu_is_omap24xx()) { | 97 | if (cpu_is_omap24xx()) { |
99 | rng_ick = clk_get(NULL, "rng_ick"); | 98 | rng_ick = clk_get(NULL, "rng_ick"); |
100 | if (IS_ERR(rng_ick)) { | 99 | if (IS_ERR(rng_ick)) { |
101 | dev_err(dev, "Could not get rng_ick\n"); | 100 | dev_err(&pdev->dev, "Could not get rng_ick\n"); |
102 | ret = PTR_ERR(rng_ick); | 101 | ret = PTR_ERR(rng_ick); |
103 | return ret; | 102 | return ret; |
104 | } | 103 | } else |
105 | else { | 104 | clk_enable(rng_ick); |
106 | clk_use(rng_ick); | ||
107 | } | ||
108 | } | 105 | } |
109 | 106 | ||
110 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 107 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
@@ -117,7 +114,7 @@ static int __init omap_rng_probe(struct device *dev) | |||
117 | if (mem == NULL) | 114 | if (mem == NULL) |
118 | return -EBUSY; | 115 | return -EBUSY; |
119 | 116 | ||
120 | dev_set_drvdata(dev, mem); | 117 | dev_set_drvdata(&pdev->dev, mem); |
121 | rng_base = (u32 __iomem *)io_p2v(res->start); | 118 | rng_base = (u32 __iomem *)io_p2v(res->start); |
122 | 119 | ||
123 | ret = hwrng_register(&omap_rng_ops); | 120 | ret = hwrng_register(&omap_rng_ops); |
@@ -127,25 +124,25 @@ static int __init omap_rng_probe(struct device *dev) | |||
127 | return ret; | 124 | return ret; |
128 | } | 125 | } |
129 | 126 | ||
130 | dev_info(dev, "OMAP Random Number Generator ver. %02x\n", | 127 | dev_info(&pdev->dev, "OMAP Random Number Generator ver. %02x\n", |
131 | omap_rng_read_reg(RNG_REV_REG)); | 128 | omap_rng_read_reg(RNG_REV_REG)); |
132 | omap_rng_write_reg(RNG_MASK_REG, 0x1); | 129 | omap_rng_write_reg(RNG_MASK_REG, 0x1); |
133 | 130 | ||
134 | rng_dev = dev; | 131 | rng_dev = pdev; |
135 | 132 | ||
136 | return 0; | 133 | return 0; |
137 | } | 134 | } |
138 | 135 | ||
139 | static int __exit omap_rng_remove(struct device *dev) | 136 | static int __exit omap_rng_remove(struct platform_device *pdev) |
140 | { | 137 | { |
141 | struct resource *mem = dev_get_drvdata(dev); | 138 | struct resource *mem = dev_get_drvdata(&pdev->dev); |
142 | 139 | ||
143 | hwrng_unregister(&omap_rng_ops); | 140 | hwrng_unregister(&omap_rng_ops); |
144 | 141 | ||
145 | omap_rng_write_reg(RNG_MASK_REG, 0x0); | 142 | omap_rng_write_reg(RNG_MASK_REG, 0x0); |
146 | 143 | ||
147 | if (cpu_is_omap24xx()) { | 144 | if (cpu_is_omap24xx()) { |
148 | clk_unuse(rng_ick); | 145 | clk_disable(rng_ick); |
149 | clk_put(rng_ick); | 146 | clk_put(rng_ick); |
150 | } | 147 | } |
151 | 148 | ||
@@ -157,18 +154,16 @@ static int __exit omap_rng_remove(struct device *dev) | |||
157 | 154 | ||
158 | #ifdef CONFIG_PM | 155 | #ifdef CONFIG_PM |
159 | 156 | ||
160 | static int omap_rng_suspend(struct device *dev, pm_message_t message, u32 level) | 157 | static int omap_rng_suspend(struct platform_device *pdev, pm_message_t message) |
161 | { | 158 | { |
162 | omap_rng_write_reg(RNG_MASK_REG, 0x0); | 159 | omap_rng_write_reg(RNG_MASK_REG, 0x0); |
163 | |||
164 | return 0; | 160 | return 0; |
165 | } | 161 | } |
166 | 162 | ||
167 | static int omap_rng_resume(struct device *dev, pm_message_t message, u32 level) | 163 | static int omap_rng_resume(struct platform_device *pdev) |
168 | { | 164 | { |
169 | omap_rng_write_reg(RNG_MASK_REG, 0x1); | 165 | omap_rng_write_reg(RNG_MASK_REG, 0x1); |
170 | 166 | return 0; | |
171 | return 1; | ||
172 | } | 167 | } |
173 | 168 | ||
174 | #else | 169 | #else |
@@ -179,9 +174,11 @@ static int omap_rng_resume(struct device *dev, pm_message_t message, u32 level) | |||
179 | #endif | 174 | #endif |
180 | 175 | ||
181 | 176 | ||
182 | static struct device_driver omap_rng_driver = { | 177 | static struct platform_driver omap_rng_driver = { |
183 | .name = "omap_rng", | 178 | .driver = { |
184 | .bus = &platform_bus_type, | 179 | .name = "omap_rng", |
180 | .owner = THIS_MODULE, | ||
181 | }, | ||
185 | .probe = omap_rng_probe, | 182 | .probe = omap_rng_probe, |
186 | .remove = __exit_p(omap_rng_remove), | 183 | .remove = __exit_p(omap_rng_remove), |
187 | .suspend = omap_rng_suspend, | 184 | .suspend = omap_rng_suspend, |
@@ -193,12 +190,12 @@ static int __init omap_rng_init(void) | |||
193 | if (!cpu_is_omap16xx() && !cpu_is_omap24xx()) | 190 | if (!cpu_is_omap16xx() && !cpu_is_omap24xx()) |
194 | return -ENODEV; | 191 | return -ENODEV; |
195 | 192 | ||
196 | return driver_register(&omap_rng_driver); | 193 | return platform_driver_register(&omap_rng_driver); |
197 | } | 194 | } |
198 | 195 | ||
199 | static void __exit omap_rng_exit(void) | 196 | static void __exit omap_rng_exit(void) |
200 | { | 197 | { |
201 | driver_unregister(&omap_rng_driver); | 198 | platform_driver_unregister(&omap_rng_driver); |
202 | } | 199 | } |
203 | 200 | ||
204 | module_init(omap_rng_init); | 201 | module_init(omap_rng_init); |
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c index 056ebe84b81d..3e90aac37510 100644 --- a/drivers/char/keyboard.c +++ b/drivers/char/keyboard.c | |||
@@ -107,7 +107,6 @@ const int NR_TYPES = ARRAY_SIZE(max_vals); | |||
107 | 107 | ||
108 | struct kbd_struct kbd_table[MAX_NR_CONSOLES]; | 108 | struct kbd_struct kbd_table[MAX_NR_CONSOLES]; |
109 | static struct kbd_struct *kbd = kbd_table; | 109 | static struct kbd_struct *kbd = kbd_table; |
110 | static struct kbd_struct kbd0; | ||
111 | 110 | ||
112 | int spawnpid, spawnsig; | 111 | int spawnpid, spawnsig; |
113 | 112 | ||
@@ -223,13 +222,13 @@ static void kd_nosound(unsigned long ignored) | |||
223 | { | 222 | { |
224 | struct list_head *node; | 223 | struct list_head *node; |
225 | 224 | ||
226 | list_for_each(node,&kbd_handler.h_list) { | 225 | list_for_each(node, &kbd_handler.h_list) { |
227 | struct input_handle *handle = to_handle_h(node); | 226 | struct input_handle *handle = to_handle_h(node); |
228 | if (test_bit(EV_SND, handle->dev->evbit)) { | 227 | if (test_bit(EV_SND, handle->dev->evbit)) { |
229 | if (test_bit(SND_TONE, handle->dev->sndbit)) | 228 | if (test_bit(SND_TONE, handle->dev->sndbit)) |
230 | input_event(handle->dev, EV_SND, SND_TONE, 0); | 229 | input_inject_event(handle, EV_SND, SND_TONE, 0); |
231 | if (test_bit(SND_BELL, handle->dev->sndbit)) | 230 | if (test_bit(SND_BELL, handle->dev->sndbit)) |
232 | input_event(handle->dev, EV_SND, SND_BELL, 0); | 231 | input_inject_event(handle, EV_SND, SND_BELL, 0); |
233 | } | 232 | } |
234 | } | 233 | } |
235 | } | 234 | } |
@@ -247,11 +246,11 @@ void kd_mksound(unsigned int hz, unsigned int ticks) | |||
247 | struct input_handle *handle = to_handle_h(node); | 246 | struct input_handle *handle = to_handle_h(node); |
248 | if (test_bit(EV_SND, handle->dev->evbit)) { | 247 | if (test_bit(EV_SND, handle->dev->evbit)) { |
249 | if (test_bit(SND_TONE, handle->dev->sndbit)) { | 248 | if (test_bit(SND_TONE, handle->dev->sndbit)) { |
250 | input_event(handle->dev, EV_SND, SND_TONE, hz); | 249 | input_inject_event(handle, EV_SND, SND_TONE, hz); |
251 | break; | 250 | break; |
252 | } | 251 | } |
253 | if (test_bit(SND_BELL, handle->dev->sndbit)) { | 252 | if (test_bit(SND_BELL, handle->dev->sndbit)) { |
254 | input_event(handle->dev, EV_SND, SND_BELL, 1); | 253 | input_inject_event(handle, EV_SND, SND_BELL, 1); |
255 | break; | 254 | break; |
256 | } | 255 | } |
257 | } | 256 | } |
@@ -272,15 +271,15 @@ int kbd_rate(struct kbd_repeat *rep) | |||
272 | unsigned int d = 0; | 271 | unsigned int d = 0; |
273 | unsigned int p = 0; | 272 | unsigned int p = 0; |
274 | 273 | ||
275 | list_for_each(node,&kbd_handler.h_list) { | 274 | list_for_each(node, &kbd_handler.h_list) { |
276 | struct input_handle *handle = to_handle_h(node); | 275 | struct input_handle *handle = to_handle_h(node); |
277 | struct input_dev *dev = handle->dev; | 276 | struct input_dev *dev = handle->dev; |
278 | 277 | ||
279 | if (test_bit(EV_REP, dev->evbit)) { | 278 | if (test_bit(EV_REP, dev->evbit)) { |
280 | if (rep->delay > 0) | 279 | if (rep->delay > 0) |
281 | input_event(dev, EV_REP, REP_DELAY, rep->delay); | 280 | input_inject_event(handle, EV_REP, REP_DELAY, rep->delay); |
282 | if (rep->period > 0) | 281 | if (rep->period > 0) |
283 | input_event(dev, EV_REP, REP_PERIOD, rep->period); | 282 | input_inject_event(handle, EV_REP, REP_PERIOD, rep->period); |
284 | d = dev->rep[REP_DELAY]; | 283 | d = dev->rep[REP_DELAY]; |
285 | p = dev->rep[REP_PERIOD]; | 284 | p = dev->rep[REP_PERIOD]; |
286 | } | 285 | } |
@@ -988,7 +987,7 @@ static inline unsigned char getleds(void) | |||
988 | * interrupt routines for this thing allows us to easily mask | 987 | * interrupt routines for this thing allows us to easily mask |
989 | * this when we don't want any of the above to happen. | 988 | * this when we don't want any of the above to happen. |
990 | * This allows for easy and efficient race-condition prevention | 989 | * This allows for easy and efficient race-condition prevention |
991 | * for kbd_refresh_leds => input_event(dev, EV_LED, ...) => ... | 990 | * for kbd_start => input_inject_event(dev, EV_LED, ...) => ... |
992 | */ | 991 | */ |
993 | 992 | ||
994 | static void kbd_bh(unsigned long dummy) | 993 | static void kbd_bh(unsigned long dummy) |
@@ -998,11 +997,11 @@ static void kbd_bh(unsigned long dummy) | |||
998 | 997 | ||
999 | if (leds != ledstate) { | 998 | if (leds != ledstate) { |
1000 | list_for_each(node, &kbd_handler.h_list) { | 999 | list_for_each(node, &kbd_handler.h_list) { |
1001 | struct input_handle * handle = to_handle_h(node); | 1000 | struct input_handle *handle = to_handle_h(node); |
1002 | input_event(handle->dev, EV_LED, LED_SCROLLL, !!(leds & 0x01)); | 1001 | input_inject_event(handle, EV_LED, LED_SCROLLL, !!(leds & 0x01)); |
1003 | input_event(handle->dev, EV_LED, LED_NUML, !!(leds & 0x02)); | 1002 | input_inject_event(handle, EV_LED, LED_NUML, !!(leds & 0x02)); |
1004 | input_event(handle->dev, EV_LED, LED_CAPSL, !!(leds & 0x04)); | 1003 | input_inject_event(handle, EV_LED, LED_CAPSL, !!(leds & 0x04)); |
1005 | input_sync(handle->dev); | 1004 | input_inject_event(handle, EV_SYN, SYN_REPORT, 0); |
1006 | } | 1005 | } |
1007 | } | 1006 | } |
1008 | 1007 | ||
@@ -1011,23 +1010,6 @@ static void kbd_bh(unsigned long dummy) | |||
1011 | 1010 | ||
1012 | DECLARE_TASKLET_DISABLED(keyboard_tasklet, kbd_bh, 0); | 1011 | DECLARE_TASKLET_DISABLED(keyboard_tasklet, kbd_bh, 0); |
1013 | 1012 | ||
1014 | /* | ||
1015 | * This allows a newly plugged keyboard to pick the LED state. | ||
1016 | */ | ||
1017 | static void kbd_refresh_leds(struct input_handle *handle) | ||
1018 | { | ||
1019 | unsigned char leds = ledstate; | ||
1020 | |||
1021 | tasklet_disable(&keyboard_tasklet); | ||
1022 | if (leds != 0xff) { | ||
1023 | input_event(handle->dev, EV_LED, LED_SCROLLL, !!(leds & 0x01)); | ||
1024 | input_event(handle->dev, EV_LED, LED_NUML, !!(leds & 0x02)); | ||
1025 | input_event(handle->dev, EV_LED, LED_CAPSL, !!(leds & 0x04)); | ||
1026 | input_sync(handle->dev); | ||
1027 | } | ||
1028 | tasklet_enable(&keyboard_tasklet); | ||
1029 | } | ||
1030 | |||
1031 | #if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) ||\ | 1013 | #if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) ||\ |
1032 | defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_SPARC) ||\ | 1014 | defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_SPARC) ||\ |
1033 | defined(CONFIG_PARISC) || defined(CONFIG_SUPERH) ||\ | 1015 | defined(CONFIG_PARISC) || defined(CONFIG_SUPERH) ||\ |
@@ -1043,7 +1025,7 @@ static const unsigned short x86_keycodes[256] = | |||
1043 | 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, | 1025 | 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, |
1044 | 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, | 1026 | 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, |
1045 | 80, 81, 82, 83, 84,118, 86, 87, 88,115,120,119,121,112,123, 92, | 1027 | 80, 81, 82, 83, 84,118, 86, 87, 88,115,120,119,121,112,123, 92, |
1046 | 284,285,309,298,312, 91,327,328,329,331,333,335,336,337,338,339, | 1028 | 284,285,309, 0,312, 91,327,328,329,331,333,335,336,337,338,339, |
1047 | 367,288,302,304,350, 89,334,326,267,126,268,269,125,347,348,349, | 1029 | 367,288,302,304,350, 89,334,326,267,126,268,269,125,347,348,349, |
1048 | 360,261,262,263,268,376,100,101,321,316,373,286,289,102,351,355, | 1030 | 360,261,262,263,268,376,100,101,321,316,373,286,289,102,351,355, |
1049 | 103,104,105,275,287,279,306,106,274,107,294,364,358,363,362,361, | 1031 | 103,104,105,275,287,279,306,106,274,107,294,364,358,363,362,361, |
@@ -1065,38 +1047,55 @@ extern void sun_do_break(void); | |||
1065 | static int emulate_raw(struct vc_data *vc, unsigned int keycode, | 1047 | static int emulate_raw(struct vc_data *vc, unsigned int keycode, |
1066 | unsigned char up_flag) | 1048 | unsigned char up_flag) |
1067 | { | 1049 | { |
1068 | if (keycode > 255 || !x86_keycodes[keycode]) | 1050 | int code; |
1069 | return -1; | ||
1070 | 1051 | ||
1071 | switch (keycode) { | 1052 | switch (keycode) { |
1072 | case KEY_PAUSE: | 1053 | case KEY_PAUSE: |
1073 | put_queue(vc, 0xe1); | 1054 | put_queue(vc, 0xe1); |
1074 | put_queue(vc, 0x1d | up_flag); | 1055 | put_queue(vc, 0x1d | up_flag); |
1075 | put_queue(vc, 0x45 | up_flag); | 1056 | put_queue(vc, 0x45 | up_flag); |
1076 | return 0; | 1057 | break; |
1058 | |||
1077 | case KEY_HANGEUL: | 1059 | case KEY_HANGEUL: |
1078 | if (!up_flag) | 1060 | if (!up_flag) |
1079 | put_queue(vc, 0xf2); | 1061 | put_queue(vc, 0xf2); |
1080 | return 0; | 1062 | break; |
1063 | |||
1081 | case KEY_HANJA: | 1064 | case KEY_HANJA: |
1082 | if (!up_flag) | 1065 | if (!up_flag) |
1083 | put_queue(vc, 0xf1); | 1066 | put_queue(vc, 0xf1); |
1084 | return 0; | 1067 | break; |
1085 | } | ||
1086 | 1068 | ||
1087 | if (keycode == KEY_SYSRQ && sysrq_alt) { | 1069 | case KEY_SYSRQ: |
1088 | put_queue(vc, 0x54 | up_flag); | 1070 | /* |
1089 | return 0; | 1071 | * Real AT keyboards (that's what we're trying |
1090 | } | 1072 | * to emulate here emit 0xe0 0x2a 0xe0 0x37 when |
1073 | * pressing PrtSc/SysRq alone, but simply 0x54 | ||
1074 | * when pressing Alt+PrtSc/SysRq. | ||
1075 | */ | ||
1076 | if (sysrq_alt) { | ||
1077 | put_queue(vc, 0x54 | up_flag); | ||
1078 | } else { | ||
1079 | put_queue(vc, 0xe0); | ||
1080 | put_queue(vc, 0x2a | up_flag); | ||
1081 | put_queue(vc, 0xe0); | ||
1082 | put_queue(vc, 0x37 | up_flag); | ||
1083 | } | ||
1084 | break; | ||
1085 | |||
1086 | default: | ||
1087 | if (keycode > 255) | ||
1088 | return -1; | ||
1091 | 1089 | ||
1092 | if (x86_keycodes[keycode] & 0x100) | 1090 | code = x86_keycodes[keycode]; |
1093 | put_queue(vc, 0xe0); | 1091 | if (!code) |
1092 | return -1; | ||
1094 | 1093 | ||
1095 | put_queue(vc, (x86_keycodes[keycode] & 0x7f) | up_flag); | 1094 | if (code & 0x100) |
1095 | put_queue(vc, 0xe0); | ||
1096 | put_queue(vc, (code & 0x7f) | up_flag); | ||
1096 | 1097 | ||
1097 | if (keycode == KEY_SYSRQ) { | 1098 | break; |
1098 | put_queue(vc, 0xe0); | ||
1099 | put_queue(vc, 0x37 | up_flag); | ||
1100 | } | 1099 | } |
1101 | 1100 | ||
1102 | return 0; | 1101 | return 0; |
@@ -1298,16 +1297,15 @@ static struct input_handle *kbd_connect(struct input_handler *handler, | |||
1298 | if (i == BTN_MISC && !test_bit(EV_SND, dev->evbit)) | 1297 | if (i == BTN_MISC && !test_bit(EV_SND, dev->evbit)) |
1299 | return NULL; | 1298 | return NULL; |
1300 | 1299 | ||
1301 | if (!(handle = kmalloc(sizeof(struct input_handle), GFP_KERNEL))) | 1300 | handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL); |
1301 | if (!handle) | ||
1302 | return NULL; | 1302 | return NULL; |
1303 | memset(handle, 0, sizeof(struct input_handle)); | ||
1304 | 1303 | ||
1305 | handle->dev = dev; | 1304 | handle->dev = dev; |
1306 | handle->handler = handler; | 1305 | handle->handler = handler; |
1307 | handle->name = "kbd"; | 1306 | handle->name = "kbd"; |
1308 | 1307 | ||
1309 | input_open_device(handle); | 1308 | input_open_device(handle); |
1310 | kbd_refresh_leds(handle); | ||
1311 | 1309 | ||
1312 | return handle; | 1310 | return handle; |
1313 | } | 1311 | } |
@@ -1318,6 +1316,24 @@ static void kbd_disconnect(struct input_handle *handle) | |||
1318 | kfree(handle); | 1316 | kfree(handle); |
1319 | } | 1317 | } |
1320 | 1318 | ||
1319 | /* | ||
1320 | * Start keyboard handler on the new keyboard by refreshing LED state to | ||
1321 | * match the rest of the system. | ||
1322 | */ | ||
1323 | static void kbd_start(struct input_handle *handle) | ||
1324 | { | ||
1325 | unsigned char leds = ledstate; | ||
1326 | |||
1327 | tasklet_disable(&keyboard_tasklet); | ||
1328 | if (leds != 0xff) { | ||
1329 | input_inject_event(handle, EV_LED, LED_SCROLLL, !!(leds & 0x01)); | ||
1330 | input_inject_event(handle, EV_LED, LED_NUML, !!(leds & 0x02)); | ||
1331 | input_inject_event(handle, EV_LED, LED_CAPSL, !!(leds & 0x04)); | ||
1332 | input_inject_event(handle, EV_SYN, SYN_REPORT, 0); | ||
1333 | } | ||
1334 | tasklet_enable(&keyboard_tasklet); | ||
1335 | } | ||
1336 | |||
1321 | static struct input_device_id kbd_ids[] = { | 1337 | static struct input_device_id kbd_ids[] = { |
1322 | { | 1338 | { |
1323 | .flags = INPUT_DEVICE_ID_MATCH_EVBIT, | 1339 | .flags = INPUT_DEVICE_ID_MATCH_EVBIT, |
@@ -1338,6 +1354,7 @@ static struct input_handler kbd_handler = { | |||
1338 | .event = kbd_event, | 1354 | .event = kbd_event, |
1339 | .connect = kbd_connect, | 1355 | .connect = kbd_connect, |
1340 | .disconnect = kbd_disconnect, | 1356 | .disconnect = kbd_disconnect, |
1357 | .start = kbd_start, | ||
1341 | .name = "kbd", | 1358 | .name = "kbd", |
1342 | .id_table = kbd_ids, | 1359 | .id_table = kbd_ids, |
1343 | }; | 1360 | }; |
@@ -1346,15 +1363,15 @@ int __init kbd_init(void) | |||
1346 | { | 1363 | { |
1347 | int i; | 1364 | int i; |
1348 | 1365 | ||
1349 | kbd0.ledflagstate = kbd0.default_ledflagstate = KBD_DEFLEDS; | 1366 | for (i = 0; i < MAX_NR_CONSOLES; i++) { |
1350 | kbd0.ledmode = LED_SHOW_FLAGS; | 1367 | kbd_table[i].ledflagstate = KBD_DEFLEDS; |
1351 | kbd0.lockstate = KBD_DEFLOCK; | 1368 | kbd_table[i].default_ledflagstate = KBD_DEFLEDS; |
1352 | kbd0.slockstate = 0; | 1369 | kbd_table[i].ledmode = LED_SHOW_FLAGS; |
1353 | kbd0.modeflags = KBD_DEFMODE; | 1370 | kbd_table[i].lockstate = KBD_DEFLOCK; |
1354 | kbd0.kbdmode = VC_XLATE; | 1371 | kbd_table[i].slockstate = 0; |
1355 | 1372 | kbd_table[i].modeflags = KBD_DEFMODE; | |
1356 | for (i = 0 ; i < MAX_NR_CONSOLES ; i++) | 1373 | kbd_table[i].kbdmode = VC_XLATE; |
1357 | kbd_table[i] = kbd0; | 1374 | } |
1358 | 1375 | ||
1359 | input_register_handler(&kbd_handler); | 1376 | input_register_handler(&kbd_handler); |
1360 | 1377 | ||
diff --git a/drivers/char/pc8736x_gpio.c b/drivers/char/pc8736x_gpio.c index 645eb81cb5a9..84e5a68635f1 100644 --- a/drivers/char/pc8736x_gpio.c +++ b/drivers/char/pc8736x_gpio.c | |||
@@ -221,7 +221,6 @@ static struct nsc_gpio_ops pc8736x_gpio_ops = { | |||
221 | .gpio_change = pc8736x_gpio_change, | 221 | .gpio_change = pc8736x_gpio_change, |
222 | .gpio_current = pc8736x_gpio_current | 222 | .gpio_current = pc8736x_gpio_current |
223 | }; | 223 | }; |
224 | EXPORT_SYMBOL(pc8736x_gpio_ops); | ||
225 | 224 | ||
226 | static int pc8736x_gpio_open(struct inode *inode, struct file *file) | 225 | static int pc8736x_gpio_open(struct inode *inode, struct file *file) |
227 | { | 226 | { |
diff --git a/drivers/char/snsc.c b/drivers/char/snsc.c index afc6eda602f7..07e0b75f2338 100644 --- a/drivers/char/snsc.c +++ b/drivers/char/snsc.c | |||
@@ -374,7 +374,12 @@ scdrv_init(void) | |||
374 | struct sysctl_data_s *scd; | 374 | struct sysctl_data_s *scd; |
375 | void *salbuf; | 375 | void *salbuf; |
376 | dev_t first_dev, dev; | 376 | dev_t first_dev, dev; |
377 | nasid_t event_nasid = ia64_sn_get_console_nasid(); | 377 | nasid_t event_nasid; |
378 | |||
379 | if (!ia64_platform_is("sn2")) | ||
380 | return -ENODEV; | ||
381 | |||
382 | event_nasid = ia64_sn_get_console_nasid(); | ||
378 | 383 | ||
379 | if (alloc_chrdev_region(&first_dev, 0, num_cnodes, | 384 | if (alloc_chrdev_region(&first_dev, 0, num_cnodes, |
380 | SYSCTL_BASENAME) < 0) { | 385 | SYSCTL_BASENAME) < 0) { |
diff --git a/drivers/char/watchdog/Kconfig b/drivers/char/watchdog/Kconfig index d53f664a4dd8..fff89c2d88fd 100644 --- a/drivers/char/watchdog/Kconfig +++ b/drivers/char/watchdog/Kconfig | |||
@@ -45,7 +45,7 @@ config WATCHDOG_NOWAYOUT | |||
45 | comment "Watchdog Device Drivers" | 45 | comment "Watchdog Device Drivers" |
46 | depends on WATCHDOG | 46 | depends on WATCHDOG |
47 | 47 | ||
48 | # Architecture Independant | 48 | # Architecture Independent |
49 | 49 | ||
50 | config SOFT_WATCHDOG | 50 | config SOFT_WATCHDOG |
51 | tristate "Software watchdog" | 51 | tristate "Software watchdog" |
@@ -127,7 +127,7 @@ config S3C2410_WATCHDOG | |||
127 | enabled. | 127 | enabled. |
128 | 128 | ||
129 | The driver is limited by the speed of the system's PCLK | 129 | The driver is limited by the speed of the system's PCLK |
130 | signal, so with reasonbaly fast systems (PCLK around 50-66MHz) | 130 | signal, so with reasonably fast systems (PCLK around 50-66MHz) |
131 | then watchdog intervals of over approximately 20seconds are | 131 | then watchdog intervals of over approximately 20seconds are |
132 | unavailable. | 132 | unavailable. |
133 | 133 | ||
@@ -423,7 +423,7 @@ config SBC_EPX_C3_WATCHDOG | |||
423 | is no way to know if writing to its IO address will corrupt | 423 | is no way to know if writing to its IO address will corrupt |
424 | your system or have any real effect. The only way to be sure | 424 | your system or have any real effect. The only way to be sure |
425 | that this driver does what you want is to make sure you | 425 | that this driver does what you want is to make sure you |
426 | are runnning it on an EPX-C3 from Winsystems with the watchdog | 426 | are running it on an EPX-C3 from Winsystems with the watchdog |
427 | timer at IO address 0x1ee and 0x1ef. It will write to both those | 427 | timer at IO address 0x1ee and 0x1ef. It will write to both those |
428 | IO ports. Basically, the assumption is made that if you compile | 428 | IO ports. Basically, the assumption is made that if you compile |
429 | this driver into your kernel and/or load it as a module, that you | 429 | this driver into your kernel and/or load it as a module, that you |
@@ -472,7 +472,7 @@ config INDYDOG | |||
472 | tristate "Indy/I2 Hardware Watchdog" | 472 | tristate "Indy/I2 Hardware Watchdog" |
473 | depends on WATCHDOG && SGI_IP22 | 473 | depends on WATCHDOG && SGI_IP22 |
474 | help | 474 | help |
475 | Hardwaredriver for the Indy's/I2's watchdog. This is a | 475 | Hardware driver for the Indy's/I2's watchdog. This is a |
476 | watchdog timer that will reboot the machine after a 60 second | 476 | watchdog timer that will reboot the machine after a 60 second |
477 | timer expired and no process has written to /dev/watchdog during | 477 | timer expired and no process has written to /dev/watchdog during |
478 | that time. | 478 | that time. |
diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c index 498aa37bca22..3ece69231343 100644 --- a/drivers/connector/cn_proc.c +++ b/drivers/connector/cn_proc.c | |||
@@ -51,6 +51,7 @@ void proc_fork_connector(struct task_struct *task) | |||
51 | struct cn_msg *msg; | 51 | struct cn_msg *msg; |
52 | struct proc_event *ev; | 52 | struct proc_event *ev; |
53 | __u8 buffer[CN_PROC_MSG_SIZE]; | 53 | __u8 buffer[CN_PROC_MSG_SIZE]; |
54 | struct timespec ts; | ||
54 | 55 | ||
55 | if (atomic_read(&proc_event_num_listeners) < 1) | 56 | if (atomic_read(&proc_event_num_listeners) < 1) |
56 | return; | 57 | return; |
@@ -58,7 +59,8 @@ void proc_fork_connector(struct task_struct *task) | |||
58 | msg = (struct cn_msg*)buffer; | 59 | msg = (struct cn_msg*)buffer; |
59 | ev = (struct proc_event*)msg->data; | 60 | ev = (struct proc_event*)msg->data; |
60 | get_seq(&msg->seq, &ev->cpu); | 61 | get_seq(&msg->seq, &ev->cpu); |
61 | ktime_get_ts(&ev->timestamp); /* get high res monotonic timestamp */ | 62 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ |
63 | ev->timestamp_ns = timespec_to_ns(&ts); | ||
62 | ev->what = PROC_EVENT_FORK; | 64 | ev->what = PROC_EVENT_FORK; |
63 | ev->event_data.fork.parent_pid = task->real_parent->pid; | 65 | ev->event_data.fork.parent_pid = task->real_parent->pid; |
64 | ev->event_data.fork.parent_tgid = task->real_parent->tgid; | 66 | ev->event_data.fork.parent_tgid = task->real_parent->tgid; |
@@ -76,6 +78,7 @@ void proc_exec_connector(struct task_struct *task) | |||
76 | { | 78 | { |
77 | struct cn_msg *msg; | 79 | struct cn_msg *msg; |
78 | struct proc_event *ev; | 80 | struct proc_event *ev; |
81 | struct timespec ts; | ||
79 | __u8 buffer[CN_PROC_MSG_SIZE]; | 82 | __u8 buffer[CN_PROC_MSG_SIZE]; |
80 | 83 | ||
81 | if (atomic_read(&proc_event_num_listeners) < 1) | 84 | if (atomic_read(&proc_event_num_listeners) < 1) |
@@ -84,7 +87,8 @@ void proc_exec_connector(struct task_struct *task) | |||
84 | msg = (struct cn_msg*)buffer; | 87 | msg = (struct cn_msg*)buffer; |
85 | ev = (struct proc_event*)msg->data; | 88 | ev = (struct proc_event*)msg->data; |
86 | get_seq(&msg->seq, &ev->cpu); | 89 | get_seq(&msg->seq, &ev->cpu); |
87 | ktime_get_ts(&ev->timestamp); | 90 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ |
91 | ev->timestamp_ns = timespec_to_ns(&ts); | ||
88 | ev->what = PROC_EVENT_EXEC; | 92 | ev->what = PROC_EVENT_EXEC; |
89 | ev->event_data.exec.process_pid = task->pid; | 93 | ev->event_data.exec.process_pid = task->pid; |
90 | ev->event_data.exec.process_tgid = task->tgid; | 94 | ev->event_data.exec.process_tgid = task->tgid; |
@@ -100,6 +104,7 @@ void proc_id_connector(struct task_struct *task, int which_id) | |||
100 | struct cn_msg *msg; | 104 | struct cn_msg *msg; |
101 | struct proc_event *ev; | 105 | struct proc_event *ev; |
102 | __u8 buffer[CN_PROC_MSG_SIZE]; | 106 | __u8 buffer[CN_PROC_MSG_SIZE]; |
107 | struct timespec ts; | ||
103 | 108 | ||
104 | if (atomic_read(&proc_event_num_listeners) < 1) | 109 | if (atomic_read(&proc_event_num_listeners) < 1) |
105 | return; | 110 | return; |
@@ -118,7 +123,8 @@ void proc_id_connector(struct task_struct *task, int which_id) | |||
118 | } else | 123 | } else |
119 | return; | 124 | return; |
120 | get_seq(&msg->seq, &ev->cpu); | 125 | get_seq(&msg->seq, &ev->cpu); |
121 | ktime_get_ts(&ev->timestamp); | 126 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ |
127 | ev->timestamp_ns = timespec_to_ns(&ts); | ||
122 | 128 | ||
123 | memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); | 129 | memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); |
124 | msg->ack = 0; /* not used */ | 130 | msg->ack = 0; /* not used */ |
@@ -131,6 +137,7 @@ void proc_exit_connector(struct task_struct *task) | |||
131 | struct cn_msg *msg; | 137 | struct cn_msg *msg; |
132 | struct proc_event *ev; | 138 | struct proc_event *ev; |
133 | __u8 buffer[CN_PROC_MSG_SIZE]; | 139 | __u8 buffer[CN_PROC_MSG_SIZE]; |
140 | struct timespec ts; | ||
134 | 141 | ||
135 | if (atomic_read(&proc_event_num_listeners) < 1) | 142 | if (atomic_read(&proc_event_num_listeners) < 1) |
136 | return; | 143 | return; |
@@ -138,7 +145,8 @@ void proc_exit_connector(struct task_struct *task) | |||
138 | msg = (struct cn_msg*)buffer; | 145 | msg = (struct cn_msg*)buffer; |
139 | ev = (struct proc_event*)msg->data; | 146 | ev = (struct proc_event*)msg->data; |
140 | get_seq(&msg->seq, &ev->cpu); | 147 | get_seq(&msg->seq, &ev->cpu); |
141 | ktime_get_ts(&ev->timestamp); | 148 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ |
149 | ev->timestamp_ns = timespec_to_ns(&ts); | ||
142 | ev->what = PROC_EVENT_EXIT; | 150 | ev->what = PROC_EVENT_EXIT; |
143 | ev->event_data.exit.process_pid = task->pid; | 151 | ev->event_data.exit.process_pid = task->pid; |
144 | ev->event_data.exit.process_tgid = task->tgid; | 152 | ev->event_data.exit.process_tgid = task->tgid; |
@@ -164,6 +172,7 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack) | |||
164 | struct cn_msg *msg; | 172 | struct cn_msg *msg; |
165 | struct proc_event *ev; | 173 | struct proc_event *ev; |
166 | __u8 buffer[CN_PROC_MSG_SIZE]; | 174 | __u8 buffer[CN_PROC_MSG_SIZE]; |
175 | struct timespec ts; | ||
167 | 176 | ||
168 | if (atomic_read(&proc_event_num_listeners) < 1) | 177 | if (atomic_read(&proc_event_num_listeners) < 1) |
169 | return; | 178 | return; |
@@ -171,7 +180,8 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack) | |||
171 | msg = (struct cn_msg*)buffer; | 180 | msg = (struct cn_msg*)buffer; |
172 | ev = (struct proc_event*)msg->data; | 181 | ev = (struct proc_event*)msg->data; |
173 | msg->seq = rcvd_seq; | 182 | msg->seq = rcvd_seq; |
174 | ktime_get_ts(&ev->timestamp); | 183 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ |
184 | ev->timestamp_ns = timespec_to_ns(&ts); | ||
175 | ev->cpu = -1; | 185 | ev->cpu = -1; |
176 | ev->what = PROC_EVENT_NONE; | 186 | ev->what = PROC_EVENT_NONE; |
177 | ev->event_data.ack.err = err; | 187 | ev->event_data.ack.err = err; |
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 8d328186f774..b3df613ae4ec 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -284,39 +284,69 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition); | |||
284 | * SYSFS INTERFACE * | 284 | * SYSFS INTERFACE * |
285 | *********************************************************************/ | 285 | *********************************************************************/ |
286 | 286 | ||
287 | static struct cpufreq_governor *__find_governor(const char *str_governor) | ||
288 | { | ||
289 | struct cpufreq_governor *t; | ||
290 | |||
291 | list_for_each_entry(t, &cpufreq_governor_list, governor_list) | ||
292 | if (!strnicmp(str_governor,t->name,CPUFREQ_NAME_LEN)) | ||
293 | return t; | ||
294 | |||
295 | return NULL; | ||
296 | } | ||
297 | |||
287 | /** | 298 | /** |
288 | * cpufreq_parse_governor - parse a governor string | 299 | * cpufreq_parse_governor - parse a governor string |
289 | */ | 300 | */ |
290 | static int cpufreq_parse_governor (char *str_governor, unsigned int *policy, | 301 | static int cpufreq_parse_governor (char *str_governor, unsigned int *policy, |
291 | struct cpufreq_governor **governor) | 302 | struct cpufreq_governor **governor) |
292 | { | 303 | { |
304 | int err = -EINVAL; | ||
305 | |||
293 | if (!cpufreq_driver) | 306 | if (!cpufreq_driver) |
294 | return -EINVAL; | 307 | goto out; |
308 | |||
295 | if (cpufreq_driver->setpolicy) { | 309 | if (cpufreq_driver->setpolicy) { |
296 | if (!strnicmp(str_governor, "performance", CPUFREQ_NAME_LEN)) { | 310 | if (!strnicmp(str_governor, "performance", CPUFREQ_NAME_LEN)) { |
297 | *policy = CPUFREQ_POLICY_PERFORMANCE; | 311 | *policy = CPUFREQ_POLICY_PERFORMANCE; |
298 | return 0; | 312 | err = 0; |
299 | } else if (!strnicmp(str_governor, "powersave", CPUFREQ_NAME_LEN)) { | 313 | } else if (!strnicmp(str_governor, "powersave", CPUFREQ_NAME_LEN)) { |
300 | *policy = CPUFREQ_POLICY_POWERSAVE; | 314 | *policy = CPUFREQ_POLICY_POWERSAVE; |
301 | return 0; | 315 | err = 0; |
302 | } | 316 | } |
303 | return -EINVAL; | 317 | } else if (cpufreq_driver->target) { |
304 | } else { | ||
305 | struct cpufreq_governor *t; | 318 | struct cpufreq_governor *t; |
319 | |||
306 | mutex_lock(&cpufreq_governor_mutex); | 320 | mutex_lock(&cpufreq_governor_mutex); |
307 | if (!cpufreq_driver || !cpufreq_driver->target) | 321 | |
308 | goto out; | 322 | t = __find_governor(str_governor); |
309 | list_for_each_entry(t, &cpufreq_governor_list, governor_list) { | 323 | |
310 | if (!strnicmp(str_governor,t->name,CPUFREQ_NAME_LEN)) { | 324 | if (t == NULL) { |
311 | *governor = t; | 325 | char *name = kasprintf(GFP_KERNEL, "cpufreq_%s", str_governor); |
326 | |||
327 | if (name) { | ||
328 | int ret; | ||
329 | |||
312 | mutex_unlock(&cpufreq_governor_mutex); | 330 | mutex_unlock(&cpufreq_governor_mutex); |
313 | return 0; | 331 | ret = request_module(name); |
332 | mutex_lock(&cpufreq_governor_mutex); | ||
333 | |||
334 | if (ret == 0) | ||
335 | t = __find_governor(str_governor); | ||
314 | } | 336 | } |
337 | |||
338 | kfree(name); | ||
315 | } | 339 | } |
316 | out: | 340 | |
341 | if (t != NULL) { | ||
342 | *governor = t; | ||
343 | err = 0; | ||
344 | } | ||
345 | |||
317 | mutex_unlock(&cpufreq_governor_mutex); | 346 | mutex_unlock(&cpufreq_governor_mutex); |
318 | } | 347 | } |
319 | return -EINVAL; | 348 | out: |
349 | return err; | ||
320 | } | 350 | } |
321 | 351 | ||
322 | 352 | ||
@@ -364,10 +394,12 @@ static ssize_t store_##file_name \ | |||
364 | if (ret != 1) \ | 394 | if (ret != 1) \ |
365 | return -EINVAL; \ | 395 | return -EINVAL; \ |
366 | \ | 396 | \ |
397 | lock_cpu_hotplug(); \ | ||
367 | mutex_lock(&policy->lock); \ | 398 | mutex_lock(&policy->lock); \ |
368 | ret = __cpufreq_set_policy(policy, &new_policy); \ | 399 | ret = __cpufreq_set_policy(policy, &new_policy); \ |
369 | policy->user_policy.object = policy->object; \ | 400 | policy->user_policy.object = policy->object; \ |
370 | mutex_unlock(&policy->lock); \ | 401 | mutex_unlock(&policy->lock); \ |
402 | unlock_cpu_hotplug(); \ | ||
371 | \ | 403 | \ |
372 | return ret ? ret : count; \ | 404 | return ret ? ret : count; \ |
373 | } | 405 | } |
@@ -1197,20 +1229,18 @@ EXPORT_SYMBOL(cpufreq_unregister_notifier); | |||
1197 | *********************************************************************/ | 1229 | *********************************************************************/ |
1198 | 1230 | ||
1199 | 1231 | ||
1232 | /* Must be called with lock_cpu_hotplug held */ | ||
1200 | int __cpufreq_driver_target(struct cpufreq_policy *policy, | 1233 | int __cpufreq_driver_target(struct cpufreq_policy *policy, |
1201 | unsigned int target_freq, | 1234 | unsigned int target_freq, |
1202 | unsigned int relation) | 1235 | unsigned int relation) |
1203 | { | 1236 | { |
1204 | int retval = -EINVAL; | 1237 | int retval = -EINVAL; |
1205 | 1238 | ||
1206 | lock_cpu_hotplug(); | ||
1207 | dprintk("target for CPU %u: %u kHz, relation %u\n", policy->cpu, | 1239 | dprintk("target for CPU %u: %u kHz, relation %u\n", policy->cpu, |
1208 | target_freq, relation); | 1240 | target_freq, relation); |
1209 | if (cpu_online(policy->cpu) && cpufreq_driver->target) | 1241 | if (cpu_online(policy->cpu) && cpufreq_driver->target) |
1210 | retval = cpufreq_driver->target(policy, target_freq, relation); | 1242 | retval = cpufreq_driver->target(policy, target_freq, relation); |
1211 | 1243 | ||
1212 | unlock_cpu_hotplug(); | ||
1213 | |||
1214 | return retval; | 1244 | return retval; |
1215 | } | 1245 | } |
1216 | EXPORT_SYMBOL_GPL(__cpufreq_driver_target); | 1246 | EXPORT_SYMBOL_GPL(__cpufreq_driver_target); |
@@ -1225,17 +1255,23 @@ int cpufreq_driver_target(struct cpufreq_policy *policy, | |||
1225 | if (!policy) | 1255 | if (!policy) |
1226 | return -EINVAL; | 1256 | return -EINVAL; |
1227 | 1257 | ||
1258 | lock_cpu_hotplug(); | ||
1228 | mutex_lock(&policy->lock); | 1259 | mutex_lock(&policy->lock); |
1229 | 1260 | ||
1230 | ret = __cpufreq_driver_target(policy, target_freq, relation); | 1261 | ret = __cpufreq_driver_target(policy, target_freq, relation); |
1231 | 1262 | ||
1232 | mutex_unlock(&policy->lock); | 1263 | mutex_unlock(&policy->lock); |
1264 | unlock_cpu_hotplug(); | ||
1233 | 1265 | ||
1234 | cpufreq_cpu_put(policy); | 1266 | cpufreq_cpu_put(policy); |
1235 | return ret; | 1267 | return ret; |
1236 | } | 1268 | } |
1237 | EXPORT_SYMBOL_GPL(cpufreq_driver_target); | 1269 | EXPORT_SYMBOL_GPL(cpufreq_driver_target); |
1238 | 1270 | ||
1271 | /* | ||
1272 | * Locking: Must be called with the lock_cpu_hotplug() lock held | ||
1273 | * when "event" is CPUFREQ_GOV_LIMITS | ||
1274 | */ | ||
1239 | 1275 | ||
1240 | static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event) | 1276 | static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event) |
1241 | { | 1277 | { |
@@ -1257,43 +1293,23 @@ static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event) | |||
1257 | } | 1293 | } |
1258 | 1294 | ||
1259 | 1295 | ||
1260 | int cpufreq_governor(unsigned int cpu, unsigned int event) | ||
1261 | { | ||
1262 | int ret = 0; | ||
1263 | struct cpufreq_policy *policy = cpufreq_cpu_get(cpu); | ||
1264 | |||
1265 | if (!policy) | ||
1266 | return -EINVAL; | ||
1267 | |||
1268 | mutex_lock(&policy->lock); | ||
1269 | ret = __cpufreq_governor(policy, event); | ||
1270 | mutex_unlock(&policy->lock); | ||
1271 | |||
1272 | cpufreq_cpu_put(policy); | ||
1273 | return ret; | ||
1274 | } | ||
1275 | EXPORT_SYMBOL_GPL(cpufreq_governor); | ||
1276 | |||
1277 | |||
1278 | int cpufreq_register_governor(struct cpufreq_governor *governor) | 1296 | int cpufreq_register_governor(struct cpufreq_governor *governor) |
1279 | { | 1297 | { |
1280 | struct cpufreq_governor *t; | 1298 | int err; |
1281 | 1299 | ||
1282 | if (!governor) | 1300 | if (!governor) |
1283 | return -EINVAL; | 1301 | return -EINVAL; |
1284 | 1302 | ||
1285 | mutex_lock(&cpufreq_governor_mutex); | 1303 | mutex_lock(&cpufreq_governor_mutex); |
1286 | 1304 | ||
1287 | list_for_each_entry(t, &cpufreq_governor_list, governor_list) { | 1305 | err = -EBUSY; |
1288 | if (!strnicmp(governor->name,t->name,CPUFREQ_NAME_LEN)) { | 1306 | if (__find_governor(governor->name) == NULL) { |
1289 | mutex_unlock(&cpufreq_governor_mutex); | 1307 | err = 0; |
1290 | return -EBUSY; | 1308 | list_add(&governor->governor_list, &cpufreq_governor_list); |
1291 | } | ||
1292 | } | 1309 | } |
1293 | list_add(&governor->governor_list, &cpufreq_governor_list); | ||
1294 | 1310 | ||
1295 | mutex_unlock(&cpufreq_governor_mutex); | 1311 | mutex_unlock(&cpufreq_governor_mutex); |
1296 | return 0; | 1312 | return err; |
1297 | } | 1313 | } |
1298 | EXPORT_SYMBOL_GPL(cpufreq_register_governor); | 1314 | EXPORT_SYMBOL_GPL(cpufreq_register_governor); |
1299 | 1315 | ||
@@ -1342,6 +1358,9 @@ int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu) | |||
1342 | EXPORT_SYMBOL(cpufreq_get_policy); | 1358 | EXPORT_SYMBOL(cpufreq_get_policy); |
1343 | 1359 | ||
1344 | 1360 | ||
1361 | /* | ||
1362 | * Locking: Must be called with the lock_cpu_hotplug() lock held | ||
1363 | */ | ||
1345 | static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_policy *policy) | 1364 | static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_policy *policy) |
1346 | { | 1365 | { |
1347 | int ret = 0; | 1366 | int ret = 0; |
@@ -1352,6 +1371,11 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_poli | |||
1352 | 1371 | ||
1353 | memcpy(&policy->cpuinfo, &data->cpuinfo, sizeof(struct cpufreq_cpuinfo)); | 1372 | memcpy(&policy->cpuinfo, &data->cpuinfo, sizeof(struct cpufreq_cpuinfo)); |
1354 | 1373 | ||
1374 | if (policy->min > data->min && policy->min > policy->max) { | ||
1375 | ret = -EINVAL; | ||
1376 | goto error_out; | ||
1377 | } | ||
1378 | |||
1355 | /* verify the cpu speed can be set within this limit */ | 1379 | /* verify the cpu speed can be set within this limit */ |
1356 | ret = cpufreq_driver->verify(policy); | 1380 | ret = cpufreq_driver->verify(policy); |
1357 | if (ret) | 1381 | if (ret) |
@@ -1436,6 +1460,8 @@ int cpufreq_set_policy(struct cpufreq_policy *policy) | |||
1436 | if (!data) | 1460 | if (!data) |
1437 | return -EINVAL; | 1461 | return -EINVAL; |
1438 | 1462 | ||
1463 | lock_cpu_hotplug(); | ||
1464 | |||
1439 | /* lock this CPU */ | 1465 | /* lock this CPU */ |
1440 | mutex_lock(&data->lock); | 1466 | mutex_lock(&data->lock); |
1441 | 1467 | ||
@@ -1446,6 +1472,8 @@ int cpufreq_set_policy(struct cpufreq_policy *policy) | |||
1446 | data->user_policy.governor = data->governor; | 1472 | data->user_policy.governor = data->governor; |
1447 | 1473 | ||
1448 | mutex_unlock(&data->lock); | 1474 | mutex_unlock(&data->lock); |
1475 | |||
1476 | unlock_cpu_hotplug(); | ||
1449 | cpufreq_cpu_put(data); | 1477 | cpufreq_cpu_put(data); |
1450 | 1478 | ||
1451 | return ret; | 1479 | return ret; |
@@ -1469,6 +1497,7 @@ int cpufreq_update_policy(unsigned int cpu) | |||
1469 | if (!data) | 1497 | if (!data) |
1470 | return -ENODEV; | 1498 | return -ENODEV; |
1471 | 1499 | ||
1500 | lock_cpu_hotplug(); | ||
1472 | mutex_lock(&data->lock); | 1501 | mutex_lock(&data->lock); |
1473 | 1502 | ||
1474 | dprintk("updating policy for CPU %u\n", cpu); | 1503 | dprintk("updating policy for CPU %u\n", cpu); |
@@ -1494,7 +1523,7 @@ int cpufreq_update_policy(unsigned int cpu) | |||
1494 | ret = __cpufreq_set_policy(data, &policy); | 1523 | ret = __cpufreq_set_policy(data, &policy); |
1495 | 1524 | ||
1496 | mutex_unlock(&data->lock); | 1525 | mutex_unlock(&data->lock); |
1497 | 1526 | unlock_cpu_hotplug(); | |
1498 | cpufreq_cpu_put(data); | 1527 | cpufreq_cpu_put(data); |
1499 | return ret; | 1528 | return ret; |
1500 | } | 1529 | } |
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c index b3ebc8f01975..c4c578defabf 100644 --- a/drivers/cpufreq/cpufreq_conservative.c +++ b/drivers/cpufreq/cpufreq_conservative.c | |||
@@ -525,7 +525,6 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy, | |||
525 | break; | 525 | break; |
526 | 526 | ||
527 | case CPUFREQ_GOV_LIMITS: | 527 | case CPUFREQ_GOV_LIMITS: |
528 | lock_cpu_hotplug(); | ||
529 | mutex_lock(&dbs_mutex); | 528 | mutex_lock(&dbs_mutex); |
530 | if (policy->max < this_dbs_info->cur_policy->cur) | 529 | if (policy->max < this_dbs_info->cur_policy->cur) |
531 | __cpufreq_driver_target( | 530 | __cpufreq_driver_target( |
@@ -536,7 +535,6 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy, | |||
536 | this_dbs_info->cur_policy, | 535 | this_dbs_info->cur_policy, |
537 | policy->min, CPUFREQ_RELATION_L); | 536 | policy->min, CPUFREQ_RELATION_L); |
538 | mutex_unlock(&dbs_mutex); | 537 | mutex_unlock(&dbs_mutex); |
539 | unlock_cpu_hotplug(); | ||
540 | break; | 538 | break; |
541 | } | 539 | } |
542 | return 0; | 540 | return 0; |
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c index 178f0c547eb7..52cf1f021825 100644 --- a/drivers/cpufreq/cpufreq_ondemand.c +++ b/drivers/cpufreq/cpufreq_ondemand.c | |||
@@ -309,7 +309,9 @@ static void do_dbs_timer(void *data) | |||
309 | if (!dbs_info->enable) | 309 | if (!dbs_info->enable) |
310 | return; | 310 | return; |
311 | 311 | ||
312 | lock_cpu_hotplug(); | ||
312 | dbs_check_cpu(dbs_info); | 313 | dbs_check_cpu(dbs_info); |
314 | unlock_cpu_hotplug(); | ||
313 | queue_delayed_work_on(cpu, kondemand_wq, &dbs_info->work, | 315 | queue_delayed_work_on(cpu, kondemand_wq, &dbs_info->work, |
314 | usecs_to_jiffies(dbs_tuners_ins.sampling_rate)); | 316 | usecs_to_jiffies(dbs_tuners_ins.sampling_rate)); |
315 | } | 317 | } |
@@ -412,7 +414,6 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy, | |||
412 | break; | 414 | break; |
413 | 415 | ||
414 | case CPUFREQ_GOV_LIMITS: | 416 | case CPUFREQ_GOV_LIMITS: |
415 | lock_cpu_hotplug(); | ||
416 | mutex_lock(&dbs_mutex); | 417 | mutex_lock(&dbs_mutex); |
417 | if (policy->max < this_dbs_info->cur_policy->cur) | 418 | if (policy->max < this_dbs_info->cur_policy->cur) |
418 | __cpufreq_driver_target(this_dbs_info->cur_policy, | 419 | __cpufreq_driver_target(this_dbs_info->cur_policy, |
@@ -423,7 +424,6 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy, | |||
423 | policy->min, | 424 | policy->min, |
424 | CPUFREQ_RELATION_L); | 425 | CPUFREQ_RELATION_L); |
425 | mutex_unlock(&dbs_mutex); | 426 | mutex_unlock(&dbs_mutex); |
426 | unlock_cpu_hotplug(); | ||
427 | break; | 427 | break; |
428 | } | 428 | } |
429 | return 0; | 429 | return 0; |
diff --git a/drivers/cpufreq/cpufreq_userspace.c b/drivers/cpufreq/cpufreq_userspace.c index 44ae5e5b94cf..a06c204589cd 100644 --- a/drivers/cpufreq/cpufreq_userspace.c +++ b/drivers/cpufreq/cpufreq_userspace.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/spinlock.h> | 18 | #include <linux/spinlock.h> |
19 | #include <linux/interrupt.h> | 19 | #include <linux/interrupt.h> |
20 | #include <linux/cpufreq.h> | 20 | #include <linux/cpufreq.h> |
21 | #include <linux/cpu.h> | ||
21 | #include <linux/types.h> | 22 | #include <linux/types.h> |
22 | #include <linux/fs.h> | 23 | #include <linux/fs.h> |
23 | #include <linux/sysfs.h> | 24 | #include <linux/sysfs.h> |
@@ -70,6 +71,7 @@ static int cpufreq_set(unsigned int freq, struct cpufreq_policy *policy) | |||
70 | 71 | ||
71 | dprintk("cpufreq_set for cpu %u, freq %u kHz\n", policy->cpu, freq); | 72 | dprintk("cpufreq_set for cpu %u, freq %u kHz\n", policy->cpu, freq); |
72 | 73 | ||
74 | lock_cpu_hotplug(); | ||
73 | mutex_lock(&userspace_mutex); | 75 | mutex_lock(&userspace_mutex); |
74 | if (!cpu_is_managed[policy->cpu]) | 76 | if (!cpu_is_managed[policy->cpu]) |
75 | goto err; | 77 | goto err; |
@@ -92,6 +94,7 @@ static int cpufreq_set(unsigned int freq, struct cpufreq_policy *policy) | |||
92 | 94 | ||
93 | err: | 95 | err: |
94 | mutex_unlock(&userspace_mutex); | 96 | mutex_unlock(&userspace_mutex); |
97 | unlock_cpu_hotplug(); | ||
95 | return ret; | 98 | return ret; |
96 | } | 99 | } |
97 | 100 | ||
diff --git a/drivers/edac/edac_mc.h b/drivers/edac/edac_mc.h index bf6ab8a8d5ed..a1cfd4e3c97d 100644 --- a/drivers/edac/edac_mc.h +++ b/drivers/edac/edac_mc.h | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/rcupdate.h> | 29 | #include <linux/rcupdate.h> |
30 | #include <linux/completion.h> | 30 | #include <linux/completion.h> |
31 | #include <linux/kobject.h> | 31 | #include <linux/kobject.h> |
32 | #include <linux/platform_device.h> | ||
32 | 33 | ||
33 | #define EDAC_MC_LABEL_LEN 31 | 34 | #define EDAC_MC_LABEL_LEN 31 |
34 | #define MC_PROC_NAME_MAX_LEN 7 | 35 | #define MC_PROC_NAME_MAX_LEN 7 |
diff --git a/drivers/i2c/busses/scx200_acb.c b/drivers/i2c/busses/scx200_acb.c index ced309ff056f..eae9e81be375 100644 --- a/drivers/i2c/busses/scx200_acb.c +++ b/drivers/i2c/busses/scx200_acb.c | |||
@@ -232,7 +232,7 @@ static void scx200_acb_poll(struct scx200_acb_iface *iface) | |||
232 | unsigned long timeout; | 232 | unsigned long timeout; |
233 | 233 | ||
234 | timeout = jiffies + POLL_TIMEOUT; | 234 | timeout = jiffies + POLL_TIMEOUT; |
235 | while (time_before(jiffies, timeout)) { | 235 | while (1) { |
236 | status = inb(ACBST); | 236 | status = inb(ACBST); |
237 | 237 | ||
238 | /* Reset the status register to avoid the hang */ | 238 | /* Reset the status register to avoid the hang */ |
@@ -242,7 +242,10 @@ static void scx200_acb_poll(struct scx200_acb_iface *iface) | |||
242 | scx200_acb_machine(iface, status); | 242 | scx200_acb_machine(iface, status); |
243 | return; | 243 | return; |
244 | } | 244 | } |
245 | yield(); | 245 | if (time_after(jiffies, timeout)) |
246 | break; | ||
247 | cpu_relax(); | ||
248 | cond_resched(); | ||
246 | } | 249 | } |
247 | 250 | ||
248 | dev_err(&iface->adapter.dev, "timeout in state %s\n", | 251 | dev_err(&iface->adapter.dev, "timeout in state %s\n", |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index d1266fe2d1ab..b6fb167e20f6 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -682,6 +682,7 @@ config BLK_DEV_SVWKS | |||
682 | config BLK_DEV_SGIIOC4 | 682 | config BLK_DEV_SGIIOC4 |
683 | tristate "Silicon Graphics IOC4 chipset ATA/ATAPI support" | 683 | tristate "Silicon Graphics IOC4 chipset ATA/ATAPI support" |
684 | depends on (IA64_SGI_SN2 || IA64_GENERIC) && SGI_IOC4 | 684 | depends on (IA64_SGI_SN2 || IA64_GENERIC) && SGI_IOC4 |
685 | select IDEPCI_SHARE_IRQ | ||
685 | help | 686 | help |
686 | This driver adds PIO & MultiMode DMA-2 support for the SGI IOC4 | 687 | This driver adds PIO & MultiMode DMA-2 support for the SGI IOC4 |
687 | chipset, which has one channel and can support two devices. | 688 | chipset, which has one channel and can support two devices. |
@@ -773,20 +774,6 @@ config BLK_DEV_IDEDMA_PMAC | |||
773 | to transfer data to and from memory. Saying Y is safe and improves | 774 | to transfer data to and from memory. Saying Y is safe and improves |
774 | performance. | 775 | performance. |
775 | 776 | ||
776 | config BLK_DEV_IDE_PMAC_BLINK | ||
777 | bool "Blink laptop LED on drive activity (DEPRECATED)" | ||
778 | depends on BLK_DEV_IDE_PMAC && ADB_PMU | ||
779 | select ADB_PMU_LED | ||
780 | select LEDS_TRIGGERS | ||
781 | select LEDS_TRIGGER_IDE_DISK | ||
782 | help | ||
783 | This option enables the use of the sleep LED as a hard drive | ||
784 | activity LED. | ||
785 | This option is deprecated, it only selects ADB_PMU_LED and | ||
786 | LEDS_TRIGGER_IDE_DISK and changes the code in the new led class | ||
787 | device to default to the ide-disk trigger (which should be set | ||
788 | from userspace via sysfs). | ||
789 | |||
790 | config BLK_DEV_IDE_SWARM | 777 | config BLK_DEV_IDE_SWARM |
791 | tristate "IDE for Sibyte evaluation boards" | 778 | tristate "IDE for Sibyte evaluation boards" |
792 | depends on SIBYTE_SB1xxx_SOC | 779 | depends on SIBYTE_SB1xxx_SOC |
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index f712e4cfd9dc..7cf3eb023521 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -776,7 +776,7 @@ static void update_ordered(ide_drive_t *drive) | |||
776 | * not available so we don't need to recheck that. | 776 | * not available so we don't need to recheck that. |
777 | */ | 777 | */ |
778 | capacity = idedisk_capacity(drive); | 778 | capacity = idedisk_capacity(drive); |
779 | barrier = ide_id_has_flush_cache(id) && | 779 | barrier = ide_id_has_flush_cache(id) && !drive->noflush && |
780 | (drive->addressing == 0 || capacity <= (1ULL << 28) || | 780 | (drive->addressing == 0 || capacity <= (1ULL << 28) || |
781 | ide_id_has_flush_cache_ext(id)); | 781 | ide_id_has_flush_cache_ext(id)); |
782 | 782 | ||
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index 98918fb6b2ce..7c3a13e1cf64 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c | |||
@@ -750,7 +750,7 @@ void ide_dma_verbose(ide_drive_t *drive) | |||
750 | goto bug_dma_off; | 750 | goto bug_dma_off; |
751 | printk(", DMA"); | 751 | printk(", DMA"); |
752 | } else if (id->field_valid & 1) { | 752 | } else if (id->field_valid & 1) { |
753 | printk(", BUG"); | 753 | goto bug_dma_off; |
754 | } | 754 | } |
755 | return; | 755 | return; |
756 | bug_dma_off: | 756 | bug_dma_off: |
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 657165297dc7..77703acaec17 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/hdreg.h> | 23 | #include <linux/hdreg.h> |
24 | #include <linux/ide.h> | 24 | #include <linux/ide.h> |
25 | #include <linux/bitops.h> | 25 | #include <linux/bitops.h> |
26 | #include <linux/nmi.h> | ||
26 | 27 | ||
27 | #include <asm/byteorder.h> | 28 | #include <asm/byteorder.h> |
28 | #include <asm/irq.h> | 29 | #include <asm/irq.h> |
@@ -1243,6 +1244,7 @@ int ide_wait_not_busy(ide_hwif_t *hwif, unsigned long timeout) | |||
1243 | if (stat == 0xff) | 1244 | if (stat == 0xff) |
1244 | return -ENODEV; | 1245 | return -ENODEV; |
1245 | touch_softlockup_watchdog(); | 1246 | touch_softlockup_watchdog(); |
1247 | touch_nmi_watchdog(); | ||
1246 | } | 1248 | } |
1247 | return -EBUSY; | 1249 | return -EBUSY; |
1248 | } | 1250 | } |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 05fbd9298db7..defd4b4bd374 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -1539,7 +1539,7 @@ static int __init ide_setup(char *s) | |||
1539 | const char *hd_words[] = { | 1539 | const char *hd_words[] = { |
1540 | "none", "noprobe", "nowerr", "cdrom", "serialize", | 1540 | "none", "noprobe", "nowerr", "cdrom", "serialize", |
1541 | "autotune", "noautotune", "minus8", "swapdata", "bswap", | 1541 | "autotune", "noautotune", "minus8", "swapdata", "bswap", |
1542 | "minus11", "remap", "remap63", "scsi", NULL }; | 1542 | "noflush", "remap", "remap63", "scsi", NULL }; |
1543 | unit = s[2] - 'a'; | 1543 | unit = s[2] - 'a'; |
1544 | hw = unit / MAX_DRIVES; | 1544 | hw = unit / MAX_DRIVES; |
1545 | unit = unit % MAX_DRIVES; | 1545 | unit = unit % MAX_DRIVES; |
@@ -1578,6 +1578,9 @@ static int __init ide_setup(char *s) | |||
1578 | case -10: /* "bswap" */ | 1578 | case -10: /* "bswap" */ |
1579 | drive->bswap = 1; | 1579 | drive->bswap = 1; |
1580 | goto done; | 1580 | goto done; |
1581 | case -11: /* noflush */ | ||
1582 | drive->noflush = 1; | ||
1583 | goto done; | ||
1581 | case -12: /* "remap" */ | 1584 | case -12: /* "remap" */ |
1582 | drive->remap_0_to_1 = 1; | 1585 | drive->remap_0_to_1 = 1; |
1583 | goto done; | 1586 | goto done; |
diff --git a/drivers/ide/pci/generic.c b/drivers/ide/pci/generic.c index 2f962cfa3f7f..78810ba982e9 100644 --- a/drivers/ide/pci/generic.c +++ b/drivers/ide/pci/generic.c | |||
@@ -180,6 +180,36 @@ static ide_pci_device_t generic_chipsets[] __devinitdata = { | |||
180 | .channels = 2, | 180 | .channels = 2, |
181 | .autodma = AUTODMA, | 181 | .autodma = AUTODMA, |
182 | .bootable = OFF_BOARD, | 182 | .bootable = OFF_BOARD, |
183 | },{ /* 15 */ | ||
184 | .name = "JMB361", | ||
185 | .init_hwif = init_hwif_generic, | ||
186 | .channels = 2, | ||
187 | .autodma = AUTODMA, | ||
188 | .bootable = OFF_BOARD, | ||
189 | },{ /* 16 */ | ||
190 | .name = "JMB363", | ||
191 | .init_hwif = init_hwif_generic, | ||
192 | .channels = 2, | ||
193 | .autodma = AUTODMA, | ||
194 | .bootable = OFF_BOARD, | ||
195 | },{ /* 17 */ | ||
196 | .name = "JMB365", | ||
197 | .init_hwif = init_hwif_generic, | ||
198 | .channels = 2, | ||
199 | .autodma = AUTODMA, | ||
200 | .bootable = OFF_BOARD, | ||
201 | },{ /* 18 */ | ||
202 | .name = "JMB366", | ||
203 | .init_hwif = init_hwif_generic, | ||
204 | .channels = 2, | ||
205 | .autodma = AUTODMA, | ||
206 | .bootable = OFF_BOARD, | ||
207 | },{ /* 19 */ | ||
208 | .name = "JMB368", | ||
209 | .init_hwif = init_hwif_generic, | ||
210 | .channels = 2, | ||
211 | .autodma = AUTODMA, | ||
212 | .bootable = OFF_BOARD, | ||
183 | } | 213 | } |
184 | }; | 214 | }; |
185 | 215 | ||
diff --git a/drivers/ide/pci/it821x.c b/drivers/ide/pci/it821x.c index 3cb04424d351..e9bad185968a 100644 --- a/drivers/ide/pci/it821x.c +++ b/drivers/ide/pci/it821x.c | |||
@@ -498,9 +498,14 @@ static int config_chipset_for_dma (ide_drive_t *drive) | |||
498 | { | 498 | { |
499 | u8 speed = ide_dma_speed(drive, it821x_ratemask(drive)); | 499 | u8 speed = ide_dma_speed(drive, it821x_ratemask(drive)); |
500 | 500 | ||
501 | config_it821x_chipset_for_pio(drive, !speed); | 501 | if (speed) { |
502 | it821x_tune_chipset(drive, speed); | 502 | config_it821x_chipset_for_pio(drive, 0); |
503 | return ide_dma_enable(drive); | 503 | it821x_tune_chipset(drive, speed); |
504 | |||
505 | return ide_dma_enable(drive); | ||
506 | } | ||
507 | |||
508 | return 0; | ||
504 | } | 509 | } |
505 | 510 | ||
506 | /** | 511 | /** |
diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index aaa74f293aaf..b08755e2e68f 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c | |||
@@ -2515,6 +2515,9 @@ static int sbp2scsi_slave_configure(struct scsi_device *sdev) | |||
2515 | sdev->skip_ms_page_8 = 1; | 2515 | sdev->skip_ms_page_8 = 1; |
2516 | if (scsi_id->workarounds & SBP2_WORKAROUND_FIX_CAPACITY) | 2516 | if (scsi_id->workarounds & SBP2_WORKAROUND_FIX_CAPACITY) |
2517 | sdev->fix_capacity = 1; | 2517 | sdev->fix_capacity = 1; |
2518 | if (scsi_id->ne->guid_vendor_id == 0x0010b9 && /* Maxtor's OUI */ | ||
2519 | (sdev->type == TYPE_DISK || sdev->type == TYPE_RBC)) | ||
2520 | sdev->allow_restart = 1; | ||
2518 | return 0; | 2521 | return 0; |
2519 | } | 2522 | } |
2520 | 2523 | ||
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c index d294bbc42f09..1205e8027829 100644 --- a/drivers/infiniband/core/addr.c +++ b/drivers/infiniband/core/addr.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <net/arp.h> | 35 | #include <net/arp.h> |
36 | #include <net/neighbour.h> | 36 | #include <net/neighbour.h> |
37 | #include <net/route.h> | 37 | #include <net/route.h> |
38 | #include <net/netevent.h> | ||
38 | #include <rdma/ib_addr.h> | 39 | #include <rdma/ib_addr.h> |
39 | 40 | ||
40 | MODULE_AUTHOR("Sean Hefty"); | 41 | MODULE_AUTHOR("Sean Hefty"); |
@@ -326,25 +327,22 @@ void rdma_addr_cancel(struct rdma_dev_addr *addr) | |||
326 | } | 327 | } |
327 | EXPORT_SYMBOL(rdma_addr_cancel); | 328 | EXPORT_SYMBOL(rdma_addr_cancel); |
328 | 329 | ||
329 | static int addr_arp_recv(struct sk_buff *skb, struct net_device *dev, | 330 | static int netevent_callback(struct notifier_block *self, unsigned long event, |
330 | struct packet_type *pkt, struct net_device *orig_dev) | 331 | void *ctx) |
331 | { | 332 | { |
332 | struct arphdr *arp_hdr; | 333 | if (event == NETEVENT_NEIGH_UPDATE) { |
334 | struct neighbour *neigh = ctx; | ||
333 | 335 | ||
334 | arp_hdr = (struct arphdr *) skb->nh.raw; | 336 | if (neigh->dev->type == ARPHRD_INFINIBAND && |
335 | 337 | (neigh->nud_state & NUD_VALID)) { | |
336 | if (arp_hdr->ar_op == htons(ARPOP_REQUEST) || | 338 | set_timeout(jiffies); |
337 | arp_hdr->ar_op == htons(ARPOP_REPLY)) | 339 | } |
338 | set_timeout(jiffies); | 340 | } |
339 | |||
340 | kfree_skb(skb); | ||
341 | return 0; | 341 | return 0; |
342 | } | 342 | } |
343 | 343 | ||
344 | static struct packet_type addr_arp = { | 344 | static struct notifier_block nb = { |
345 | .type = __constant_htons(ETH_P_ARP), | 345 | .notifier_call = netevent_callback |
346 | .func = addr_arp_recv, | ||
347 | .af_packet_priv = (void*) 1, | ||
348 | }; | 346 | }; |
349 | 347 | ||
350 | static int addr_init(void) | 348 | static int addr_init(void) |
@@ -353,13 +351,13 @@ static int addr_init(void) | |||
353 | if (!addr_wq) | 351 | if (!addr_wq) |
354 | return -ENOMEM; | 352 | return -ENOMEM; |
355 | 353 | ||
356 | dev_add_pack(&addr_arp); | 354 | register_netevent_notifier(&nb); |
357 | return 0; | 355 | return 0; |
358 | } | 356 | } |
359 | 357 | ||
360 | static void addr_cleanup(void) | 358 | static void addr_cleanup(void) |
361 | { | 359 | { |
362 | dev_remove_pack(&addr_arp); | 360 | unregister_netevent_notifier(&nb); |
363 | destroy_workqueue(addr_wq); | 361 | destroy_workqueue(addr_wq); |
364 | } | 362 | } |
365 | 363 | ||
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c index f85c97f7500a..0de335b7bfc2 100644 --- a/drivers/infiniband/core/cm.c +++ b/drivers/infiniband/core/cm.c | |||
@@ -975,8 +975,10 @@ int ib_send_cm_req(struct ib_cm_id *cm_id, | |||
975 | 975 | ||
976 | cm_id_priv->timewait_info = cm_create_timewait_info(cm_id_priv-> | 976 | cm_id_priv->timewait_info = cm_create_timewait_info(cm_id_priv-> |
977 | id.local_id); | 977 | id.local_id); |
978 | if (IS_ERR(cm_id_priv->timewait_info)) | 978 | if (IS_ERR(cm_id_priv->timewait_info)) { |
979 | ret = PTR_ERR(cm_id_priv->timewait_info); | ||
979 | goto out; | 980 | goto out; |
981 | } | ||
980 | 982 | ||
981 | ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av); | 983 | ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av); |
982 | if (ret) | 984 | if (ret) |
diff --git a/drivers/infiniband/core/uverbs.h b/drivers/infiniband/core/uverbs.h index bb9bee56a824..102a59c033ff 100644 --- a/drivers/infiniband/core/uverbs.h +++ b/drivers/infiniband/core/uverbs.h | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <linux/kref.h> | 42 | #include <linux/kref.h> |
43 | #include <linux/idr.h> | 43 | #include <linux/idr.h> |
44 | #include <linux/mutex.h> | 44 | #include <linux/mutex.h> |
45 | #include <linux/completion.h> | ||
45 | 46 | ||
46 | #include <rdma/ib_verbs.h> | 47 | #include <rdma/ib_verbs.h> |
47 | #include <rdma/ib_user_verbs.h> | 48 | #include <rdma/ib_user_verbs.h> |
@@ -69,6 +70,7 @@ | |||
69 | 70 | ||
70 | struct ib_uverbs_device { | 71 | struct ib_uverbs_device { |
71 | struct kref ref; | 72 | struct kref ref; |
73 | struct completion comp; | ||
72 | int devnum; | 74 | int devnum; |
73 | struct cdev *dev; | 75 | struct cdev *dev; |
74 | struct class_device *class_dev; | 76 | struct class_device *class_dev; |
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c index e725cccc7cde..4e16314e8e6d 100644 --- a/drivers/infiniband/core/uverbs_main.c +++ b/drivers/infiniband/core/uverbs_main.c | |||
@@ -122,7 +122,7 @@ static void ib_uverbs_release_dev(struct kref *ref) | |||
122 | struct ib_uverbs_device *dev = | 122 | struct ib_uverbs_device *dev = |
123 | container_of(ref, struct ib_uverbs_device, ref); | 123 | container_of(ref, struct ib_uverbs_device, ref); |
124 | 124 | ||
125 | kfree(dev); | 125 | complete(&dev->comp); |
126 | } | 126 | } |
127 | 127 | ||
128 | void ib_uverbs_release_ucq(struct ib_uverbs_file *file, | 128 | void ib_uverbs_release_ucq(struct ib_uverbs_file *file, |
@@ -740,6 +740,7 @@ static void ib_uverbs_add_one(struct ib_device *device) | |||
740 | return; | 740 | return; |
741 | 741 | ||
742 | kref_init(&uverbs_dev->ref); | 742 | kref_init(&uverbs_dev->ref); |
743 | init_completion(&uverbs_dev->comp); | ||
743 | 744 | ||
744 | spin_lock(&map_lock); | 745 | spin_lock(&map_lock); |
745 | uverbs_dev->devnum = find_first_zero_bit(dev_map, IB_UVERBS_MAX_DEVICES); | 746 | uverbs_dev->devnum = find_first_zero_bit(dev_map, IB_UVERBS_MAX_DEVICES); |
@@ -793,6 +794,8 @@ err_cdev: | |||
793 | 794 | ||
794 | err: | 795 | err: |
795 | kref_put(&uverbs_dev->ref, ib_uverbs_release_dev); | 796 | kref_put(&uverbs_dev->ref, ib_uverbs_release_dev); |
797 | wait_for_completion(&uverbs_dev->comp); | ||
798 | kfree(uverbs_dev); | ||
796 | return; | 799 | return; |
797 | } | 800 | } |
798 | 801 | ||
@@ -812,7 +815,10 @@ static void ib_uverbs_remove_one(struct ib_device *device) | |||
812 | spin_unlock(&map_lock); | 815 | spin_unlock(&map_lock); |
813 | 816 | ||
814 | clear_bit(uverbs_dev->devnum, dev_map); | 817 | clear_bit(uverbs_dev->devnum, dev_map); |
818 | |||
815 | kref_put(&uverbs_dev->ref, ib_uverbs_release_dev); | 819 | kref_put(&uverbs_dev->ref, ib_uverbs_release_dev); |
820 | wait_for_completion(&uverbs_dev->comp); | ||
821 | kfree(uverbs_dev); | ||
816 | } | 822 | } |
817 | 823 | ||
818 | static int uverbs_event_get_sb(struct file_system_type *fs_type, int flags, | 824 | static int uverbs_event_get_sb(struct file_system_type *fs_type, int flags, |
diff --git a/drivers/infiniband/hw/mthca/mthca_allocator.c b/drivers/infiniband/hw/mthca/mthca_allocator.c index 9ba3211cef7c..25157f57a6d0 100644 --- a/drivers/infiniband/hw/mthca/mthca_allocator.c +++ b/drivers/infiniband/hw/mthca/mthca_allocator.c | |||
@@ -108,14 +108,15 @@ void mthca_alloc_cleanup(struct mthca_alloc *alloc) | |||
108 | * serialize access to the array. | 108 | * serialize access to the array. |
109 | */ | 109 | */ |
110 | 110 | ||
111 | #define MTHCA_ARRAY_MASK (PAGE_SIZE / sizeof (void *) - 1) | ||
112 | |||
111 | void *mthca_array_get(struct mthca_array *array, int index) | 113 | void *mthca_array_get(struct mthca_array *array, int index) |
112 | { | 114 | { |
113 | int p = (index * sizeof (void *)) >> PAGE_SHIFT; | 115 | int p = (index * sizeof (void *)) >> PAGE_SHIFT; |
114 | 116 | ||
115 | if (array->page_list[p].page) { | 117 | if (array->page_list[p].page) |
116 | int i = index & (PAGE_SIZE / sizeof (void *) - 1); | 118 | return array->page_list[p].page[index & MTHCA_ARRAY_MASK]; |
117 | return array->page_list[p].page[i]; | 119 | else |
118 | } else | ||
119 | return NULL; | 120 | return NULL; |
120 | } | 121 | } |
121 | 122 | ||
@@ -130,8 +131,7 @@ int mthca_array_set(struct mthca_array *array, int index, void *value) | |||
130 | if (!array->page_list[p].page) | 131 | if (!array->page_list[p].page) |
131 | return -ENOMEM; | 132 | return -ENOMEM; |
132 | 133 | ||
133 | array->page_list[p].page[index & (PAGE_SIZE / sizeof (void *) - 1)] = | 134 | array->page_list[p].page[index & MTHCA_ARRAY_MASK] = value; |
134 | value; | ||
135 | ++array->page_list[p].used; | 135 | ++array->page_list[p].used; |
136 | 136 | ||
137 | return 0; | 137 | return 0; |
@@ -144,7 +144,8 @@ void mthca_array_clear(struct mthca_array *array, int index) | |||
144 | if (--array->page_list[p].used == 0) { | 144 | if (--array->page_list[p].used == 0) { |
145 | free_page((unsigned long) array->page_list[p].page); | 145 | free_page((unsigned long) array->page_list[p].page); |
146 | array->page_list[p].page = NULL; | 146 | array->page_list[p].page = NULL; |
147 | } | 147 | } else |
148 | array->page_list[p].page[index & MTHCA_ARRAY_MASK] = NULL; | ||
148 | 149 | ||
149 | if (array->page_list[p].used < 0) | 150 | if (array->page_list[p].used < 0) |
150 | pr_debug("Array %p index %d page %d with ref count %d < 0\n", | 151 | pr_debug("Array %p index %d page %d with ref count %d < 0\n", |
diff --git a/drivers/infiniband/ulp/ipoib/Kconfig b/drivers/infiniband/ulp/ipoib/Kconfig index 13d6d01c72c0..d74653d7de1c 100644 --- a/drivers/infiniband/ulp/ipoib/Kconfig +++ b/drivers/infiniband/ulp/ipoib/Kconfig | |||
@@ -6,8 +6,7 @@ config INFINIBAND_IPOIB | |||
6 | transports IP packets over InfiniBand so you can use your IB | 6 | transports IP packets over InfiniBand so you can use your IB |
7 | device as a fancy NIC. | 7 | device as a fancy NIC. |
8 | 8 | ||
9 | The IPoIB protocol is defined by the IETF ipoib working | 9 | See Documentation/infiniband/ipoib.txt for more information |
10 | group: <http://www.ietf.org/html.charters/ipoib-charter.html>. | ||
11 | 10 | ||
12 | config INFINIBAND_IPOIB_DEBUG | 11 | config INFINIBAND_IPOIB_DEBUG |
13 | bool "IP-over-InfiniBand debugging" if EMBEDDED | 12 | bool "IP-over-InfiniBand debugging" if EMBEDDED |
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 8f472e7113b4..8257d5a2c8f8 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c | |||
@@ -77,6 +77,14 @@ MODULE_PARM_DESC(topspin_workarounds, | |||
77 | 77 | ||
78 | static const u8 topspin_oui[3] = { 0x00, 0x05, 0xad }; | 78 | static const u8 topspin_oui[3] = { 0x00, 0x05, 0xad }; |
79 | 79 | ||
80 | static int mellanox_workarounds = 1; | ||
81 | |||
82 | module_param(mellanox_workarounds, int, 0444); | ||
83 | MODULE_PARM_DESC(mellanox_workarounds, | ||
84 | "Enable workarounds for Mellanox SRP target bugs if != 0"); | ||
85 | |||
86 | static const u8 mellanox_oui[3] = { 0x00, 0x02, 0xc9 }; | ||
87 | |||
80 | static void srp_add_one(struct ib_device *device); | 88 | static void srp_add_one(struct ib_device *device); |
81 | static void srp_remove_one(struct ib_device *device); | 89 | static void srp_remove_one(struct ib_device *device); |
82 | static void srp_completion(struct ib_cq *cq, void *target_ptr); | 90 | static void srp_completion(struct ib_cq *cq, void *target_ptr); |
@@ -526,8 +534,10 @@ static int srp_reconnect_target(struct srp_target_port *target) | |||
526 | while (ib_poll_cq(target->cq, 1, &wc) > 0) | 534 | while (ib_poll_cq(target->cq, 1, &wc) > 0) |
527 | ; /* nothing */ | 535 | ; /* nothing */ |
528 | 536 | ||
537 | spin_lock_irq(target->scsi_host->host_lock); | ||
529 | list_for_each_entry_safe(req, tmp, &target->req_queue, list) | 538 | list_for_each_entry_safe(req, tmp, &target->req_queue, list) |
530 | srp_reset_req(target, req); | 539 | srp_reset_req(target, req); |
540 | spin_unlock_irq(target->scsi_host->host_lock); | ||
531 | 541 | ||
532 | target->rx_head = 0; | 542 | target->rx_head = 0; |
533 | target->tx_head = 0; | 543 | target->tx_head = 0; |
@@ -567,7 +577,7 @@ err: | |||
567 | return ret; | 577 | return ret; |
568 | } | 578 | } |
569 | 579 | ||
570 | static int srp_map_fmr(struct srp_device *dev, struct scatterlist *scat, | 580 | static int srp_map_fmr(struct srp_target_port *target, struct scatterlist *scat, |
571 | int sg_cnt, struct srp_request *req, | 581 | int sg_cnt, struct srp_request *req, |
572 | struct srp_direct_buf *buf) | 582 | struct srp_direct_buf *buf) |
573 | { | 583 | { |
@@ -577,10 +587,15 @@ static int srp_map_fmr(struct srp_device *dev, struct scatterlist *scat, | |||
577 | int page_cnt; | 587 | int page_cnt; |
578 | int i, j; | 588 | int i, j; |
579 | int ret; | 589 | int ret; |
590 | struct srp_device *dev = target->srp_host->dev; | ||
580 | 591 | ||
581 | if (!dev->fmr_pool) | 592 | if (!dev->fmr_pool) |
582 | return -ENODEV; | 593 | return -ENODEV; |
583 | 594 | ||
595 | if ((sg_dma_address(&scat[0]) & ~dev->fmr_page_mask) && | ||
596 | mellanox_workarounds && !memcmp(&target->ioc_guid, mellanox_oui, 3)) | ||
597 | return -EINVAL; | ||
598 | |||
584 | len = page_cnt = 0; | 599 | len = page_cnt = 0; |
585 | for (i = 0; i < sg_cnt; ++i) { | 600 | for (i = 0; i < sg_cnt; ++i) { |
586 | if (sg_dma_address(&scat[i]) & ~dev->fmr_page_mask) { | 601 | if (sg_dma_address(&scat[i]) & ~dev->fmr_page_mask) { |
@@ -683,7 +698,7 @@ static int srp_map_data(struct scsi_cmnd *scmnd, struct srp_target_port *target, | |||
683 | buf->va = cpu_to_be64(sg_dma_address(scat)); | 698 | buf->va = cpu_to_be64(sg_dma_address(scat)); |
684 | buf->key = cpu_to_be32(target->srp_host->dev->mr->rkey); | 699 | buf->key = cpu_to_be32(target->srp_host->dev->mr->rkey); |
685 | buf->len = cpu_to_be32(sg_dma_len(scat)); | 700 | buf->len = cpu_to_be32(sg_dma_len(scat)); |
686 | } else if (srp_map_fmr(target->srp_host->dev, scat, count, req, | 701 | } else if (srp_map_fmr(target, scat, count, req, |
687 | (void *) cmd->add_data)) { | 702 | (void *) cmd->add_data)) { |
688 | /* | 703 | /* |
689 | * FMR mapping failed, and the scatterlist has more | 704 | * FMR mapping failed, and the scatterlist has more |
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index a29d5ceb00cf..4bf48188cc91 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
@@ -127,14 +127,10 @@ static int evdev_open(struct inode * inode, struct file * file) | |||
127 | { | 127 | { |
128 | struct evdev_list *list; | 128 | struct evdev_list *list; |
129 | int i = iminor(inode) - EVDEV_MINOR_BASE; | 129 | int i = iminor(inode) - EVDEV_MINOR_BASE; |
130 | int accept_err; | ||
131 | 130 | ||
132 | if (i >= EVDEV_MINORS || !evdev_table[i] || !evdev_table[i]->exist) | 131 | if (i >= EVDEV_MINORS || !evdev_table[i] || !evdev_table[i]->exist) |
133 | return -ENODEV; | 132 | return -ENODEV; |
134 | 133 | ||
135 | if ((accept_err = input_accept_process(&(evdev_table[i]->handle), file))) | ||
136 | return accept_err; | ||
137 | |||
138 | if (!(list = kzalloc(sizeof(struct evdev_list), GFP_KERNEL))) | 134 | if (!(list = kzalloc(sizeof(struct evdev_list), GFP_KERNEL))) |
139 | return -ENOMEM; | 135 | return -ENOMEM; |
140 | 136 | ||
@@ -260,7 +256,7 @@ static ssize_t evdev_write(struct file * file, const char __user * buffer, size_ | |||
260 | 256 | ||
261 | if (evdev_event_from_user(buffer + retval, &event)) | 257 | if (evdev_event_from_user(buffer + retval, &event)) |
262 | return -EFAULT; | 258 | return -EFAULT; |
263 | input_event(list->evdev->handle.dev, event.type, event.code, event.value); | 259 | input_inject_event(&list->evdev->handle, event.type, event.code, event.value); |
264 | retval += evdev_event_size(); | 260 | retval += evdev_event_size(); |
265 | } | 261 | } |
266 | 262 | ||
@@ -428,8 +424,8 @@ static long evdev_ioctl_handler(struct file *file, unsigned int cmd, | |||
428 | if (get_user(v, ip + 1)) | 424 | if (get_user(v, ip + 1)) |
429 | return -EFAULT; | 425 | return -EFAULT; |
430 | 426 | ||
431 | input_event(dev, EV_REP, REP_DELAY, u); | 427 | input_inject_event(&evdev->handle, EV_REP, REP_DELAY, u); |
432 | input_event(dev, EV_REP, REP_PERIOD, v); | 428 | input_inject_event(&evdev->handle, EV_REP, REP_PERIOD, v); |
433 | 429 | ||
434 | return 0; | 430 | return 0; |
435 | 431 | ||
diff --git a/drivers/input/gameport/fm801-gp.c b/drivers/input/gameport/fm801-gp.c index 47e93daa0fa7..90de5afe03c2 100644 --- a/drivers/input/gameport/fm801-gp.c +++ b/drivers/input/gameport/fm801-gp.c | |||
@@ -106,10 +106,10 @@ static int __devinit fm801_gp_probe(struct pci_dev *pci, const struct pci_device | |||
106 | gp->gameport = port; | 106 | gp->gameport = port; |
107 | gp->res_port = request_region(port->io, 0x10, "FM801 GP"); | 107 | gp->res_port = request_region(port->io, 0x10, "FM801 GP"); |
108 | if (!gp->res_port) { | 108 | if (!gp->res_port) { |
109 | kfree(gp); | ||
110 | gameport_free_port(port); | ||
111 | printk(KERN_DEBUG "fm801-gp: unable to grab region 0x%x-0x%x\n", | 109 | printk(KERN_DEBUG "fm801-gp: unable to grab region 0x%x-0x%x\n", |
112 | port->io, port->io + 0x0f); | 110 | port->io, port->io + 0x0f); |
111 | gameport_free_port(port); | ||
112 | kfree(gp); | ||
113 | return -EBUSY; | 113 | return -EBUSY; |
114 | } | 114 | } |
115 | 115 | ||
diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c index 36644bff379d..3f47ae55c6f3 100644 --- a/drivers/input/gameport/gameport.c +++ b/drivers/input/gameport/gameport.c | |||
@@ -53,6 +53,7 @@ static LIST_HEAD(gameport_list); | |||
53 | 53 | ||
54 | static struct bus_type gameport_bus; | 54 | static struct bus_type gameport_bus; |
55 | 55 | ||
56 | static void gameport_add_driver(struct gameport_driver *drv); | ||
56 | static void gameport_add_port(struct gameport *gameport); | 57 | static void gameport_add_port(struct gameport *gameport); |
57 | static void gameport_destroy_port(struct gameport *gameport); | 58 | static void gameport_destroy_port(struct gameport *gameport); |
58 | static void gameport_reconnect_port(struct gameport *gameport); | 59 | static void gameport_reconnect_port(struct gameport *gameport); |
@@ -211,8 +212,14 @@ static void gameport_release_driver(struct gameport *gameport) | |||
211 | 212 | ||
212 | static void gameport_find_driver(struct gameport *gameport) | 213 | static void gameport_find_driver(struct gameport *gameport) |
213 | { | 214 | { |
215 | int error; | ||
216 | |||
214 | down_write(&gameport_bus.subsys.rwsem); | 217 | down_write(&gameport_bus.subsys.rwsem); |
215 | device_attach(&gameport->dev); | 218 | error = device_attach(&gameport->dev); |
219 | if (error < 0) | ||
220 | printk(KERN_WARNING | ||
221 | "gameport: device_attach() failed for %s (%s), error: %d\n", | ||
222 | gameport->phys, gameport->name, error); | ||
216 | up_write(&gameport_bus.subsys.rwsem); | 223 | up_write(&gameport_bus.subsys.rwsem); |
217 | } | 224 | } |
218 | 225 | ||
@@ -316,7 +323,6 @@ static void gameport_remove_duplicate_events(struct gameport_event *event) | |||
316 | spin_unlock_irqrestore(&gameport_event_lock, flags); | 323 | spin_unlock_irqrestore(&gameport_event_lock, flags); |
317 | } | 324 | } |
318 | 325 | ||
319 | |||
320 | static struct gameport_event *gameport_get_event(void) | 326 | static struct gameport_event *gameport_get_event(void) |
321 | { | 327 | { |
322 | struct gameport_event *event; | 328 | struct gameport_event *event; |
@@ -342,7 +348,6 @@ static struct gameport_event *gameport_get_event(void) | |||
342 | static void gameport_handle_event(void) | 348 | static void gameport_handle_event(void) |
343 | { | 349 | { |
344 | struct gameport_event *event; | 350 | struct gameport_event *event; |
345 | struct gameport_driver *gameport_drv; | ||
346 | 351 | ||
347 | mutex_lock(&gameport_mutex); | 352 | mutex_lock(&gameport_mutex); |
348 | 353 | ||
@@ -369,8 +374,7 @@ static void gameport_handle_event(void) | |||
369 | break; | 374 | break; |
370 | 375 | ||
371 | case GAMEPORT_REGISTER_DRIVER: | 376 | case GAMEPORT_REGISTER_DRIVER: |
372 | gameport_drv = event->object; | 377 | gameport_add_driver(event->object); |
373 | driver_register(&gameport_drv->driver); | ||
374 | break; | 378 | break; |
375 | 379 | ||
376 | default: | 380 | default: |
@@ -532,6 +536,7 @@ static void gameport_init_port(struct gameport *gameport) | |||
532 | if (gameport->parent) | 536 | if (gameport->parent) |
533 | gameport->dev.parent = &gameport->parent->dev; | 537 | gameport->dev.parent = &gameport->parent->dev; |
534 | 538 | ||
539 | INIT_LIST_HEAD(&gameport->node); | ||
535 | spin_lock_init(&gameport->timer_lock); | 540 | spin_lock_init(&gameport->timer_lock); |
536 | init_timer(&gameport->poll_timer); | 541 | init_timer(&gameport->poll_timer); |
537 | gameport->poll_timer.function = gameport_run_poll_handler; | 542 | gameport->poll_timer.function = gameport_run_poll_handler; |
@@ -544,6 +549,8 @@ static void gameport_init_port(struct gameport *gameport) | |||
544 | */ | 549 | */ |
545 | static void gameport_add_port(struct gameport *gameport) | 550 | static void gameport_add_port(struct gameport *gameport) |
546 | { | 551 | { |
552 | int error; | ||
553 | |||
547 | if (gameport->parent) | 554 | if (gameport->parent) |
548 | gameport->parent->child = gameport; | 555 | gameport->parent->child = gameport; |
549 | 556 | ||
@@ -558,8 +565,13 @@ static void gameport_add_port(struct gameport *gameport) | |||
558 | printk(KERN_INFO "gameport: %s is %s, speed %dkHz\n", | 565 | printk(KERN_INFO "gameport: %s is %s, speed %dkHz\n", |
559 | gameport->name, gameport->phys, gameport->speed); | 566 | gameport->name, gameport->phys, gameport->speed); |
560 | 567 | ||
561 | device_add(&gameport->dev); | 568 | error = device_add(&gameport->dev); |
562 | gameport->registered = 1; | 569 | if (error) |
570 | printk(KERN_ERR | ||
571 | "gameport: device_add() failed for %s (%s), error: %d\n", | ||
572 | gameport->phys, gameport->name, error); | ||
573 | else | ||
574 | gameport->registered = 1; | ||
563 | } | 575 | } |
564 | 576 | ||
565 | /* | 577 | /* |
@@ -583,10 +595,11 @@ static void gameport_destroy_port(struct gameport *gameport) | |||
583 | 595 | ||
584 | if (gameport->registered) { | 596 | if (gameport->registered) { |
585 | device_del(&gameport->dev); | 597 | device_del(&gameport->dev); |
586 | list_del_init(&gameport->node); | ||
587 | gameport->registered = 0; | 598 | gameport->registered = 0; |
588 | } | 599 | } |
589 | 600 | ||
601 | list_del_init(&gameport->node); | ||
602 | |||
590 | gameport_remove_pending_events(gameport); | 603 | gameport_remove_pending_events(gameport); |
591 | put_device(&gameport->dev); | 604 | put_device(&gameport->dev); |
592 | } | 605 | } |
@@ -704,11 +717,22 @@ static int gameport_driver_remove(struct device *dev) | |||
704 | } | 717 | } |
705 | 718 | ||
706 | static struct bus_type gameport_bus = { | 719 | static struct bus_type gameport_bus = { |
707 | .name = "gameport", | 720 | .name = "gameport", |
708 | .probe = gameport_driver_probe, | 721 | .probe = gameport_driver_probe, |
709 | .remove = gameport_driver_remove, | 722 | .remove = gameport_driver_remove, |
710 | }; | 723 | }; |
711 | 724 | ||
725 | static void gameport_add_driver(struct gameport_driver *drv) | ||
726 | { | ||
727 | int error; | ||
728 | |||
729 | error = driver_register(&drv->driver); | ||
730 | if (error) | ||
731 | printk(KERN_ERR | ||
732 | "gameport: driver_register() failed for %s, error: %d\n", | ||
733 | drv->driver.name, error); | ||
734 | } | ||
735 | |||
712 | void __gameport_register_driver(struct gameport_driver *drv, struct module *owner) | 736 | void __gameport_register_driver(struct gameport_driver *drv, struct module *owner) |
713 | { | 737 | { |
714 | drv->driver.bus = &gameport_bus; | 738 | drv->driver.bus = &gameport_bus; |
@@ -778,16 +802,24 @@ void gameport_close(struct gameport *gameport) | |||
778 | 802 | ||
779 | static int __init gameport_init(void) | 803 | static int __init gameport_init(void) |
780 | { | 804 | { |
781 | gameport_task = kthread_run(gameport_thread, NULL, "kgameportd"); | 805 | int error; |
782 | if (IS_ERR(gameport_task)) { | ||
783 | printk(KERN_ERR "gameport: Failed to start kgameportd\n"); | ||
784 | return PTR_ERR(gameport_task); | ||
785 | } | ||
786 | 806 | ||
787 | gameport_bus.dev_attrs = gameport_device_attrs; | 807 | gameport_bus.dev_attrs = gameport_device_attrs; |
788 | gameport_bus.drv_attrs = gameport_driver_attrs; | 808 | gameport_bus.drv_attrs = gameport_driver_attrs; |
789 | gameport_bus.match = gameport_bus_match; | 809 | gameport_bus.match = gameport_bus_match; |
790 | bus_register(&gameport_bus); | 810 | error = bus_register(&gameport_bus); |
811 | if (error) { | ||
812 | printk(KERN_ERR "gameport: failed to register gameport bus, error: %d\n", error); | ||
813 | return error; | ||
814 | } | ||
815 | |||
816 | gameport_task = kthread_run(gameport_thread, NULL, "kgameportd"); | ||
817 | if (IS_ERR(gameport_task)) { | ||
818 | bus_unregister(&gameport_bus); | ||
819 | error = PTR_ERR(gameport_task); | ||
820 | printk(KERN_ERR "gameport: Failed to start kgameportd, error: %d\n", error); | ||
821 | return error; | ||
822 | } | ||
791 | 823 | ||
792 | return 0; | 824 | return 0; |
793 | } | 825 | } |
diff --git a/drivers/input/input.c b/drivers/input/input.c index a90486f5e491..9cb4b9a54f01 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
@@ -35,6 +35,16 @@ static LIST_HEAD(input_handler_list); | |||
35 | 35 | ||
36 | static struct input_handler *input_table[8]; | 36 | static struct input_handler *input_table[8]; |
37 | 37 | ||
38 | /** | ||
39 | * input_event() - report new input event | ||
40 | * @handle: device that generated the event | ||
41 | * @type: type of the event | ||
42 | * @code: event code | ||
43 | * @value: value of the event | ||
44 | * | ||
45 | * This function should be used by drivers implementing various input devices | ||
46 | * See also input_inject_event() | ||
47 | */ | ||
38 | void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) | 48 | void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) |
39 | { | 49 | { |
40 | struct input_handle *handle; | 50 | struct input_handle *handle; |
@@ -183,6 +193,23 @@ void input_event(struct input_dev *dev, unsigned int type, unsigned int code, in | |||
183 | } | 193 | } |
184 | EXPORT_SYMBOL(input_event); | 194 | EXPORT_SYMBOL(input_event); |
185 | 195 | ||
196 | /** | ||
197 | * input_inject_event() - send input event from input handler | ||
198 | * @handle: input handle to send event through | ||
199 | * @type: type of the event | ||
200 | * @code: event code | ||
201 | * @value: value of the event | ||
202 | * | ||
203 | * Similar to input_event() but will ignore event if device is "grabbed" and handle | ||
204 | * injecting event is not the one that owns the device. | ||
205 | */ | ||
206 | void input_inject_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) | ||
207 | { | ||
208 | if (!handle->dev->grab || handle->dev->grab == handle) | ||
209 | input_event(handle->dev, type, code, value); | ||
210 | } | ||
211 | EXPORT_SYMBOL(input_inject_event); | ||
212 | |||
186 | static void input_repeat_key(unsigned long data) | 213 | static void input_repeat_key(unsigned long data) |
187 | { | 214 | { |
188 | struct input_dev *dev = (void *) data; | 215 | struct input_dev *dev = (void *) data; |
@@ -197,15 +224,6 @@ static void input_repeat_key(unsigned long data) | |||
197 | mod_timer(&dev->timer, jiffies + msecs_to_jiffies(dev->rep[REP_PERIOD])); | 224 | mod_timer(&dev->timer, jiffies + msecs_to_jiffies(dev->rep[REP_PERIOD])); |
198 | } | 225 | } |
199 | 226 | ||
200 | int input_accept_process(struct input_handle *handle, struct file *file) | ||
201 | { | ||
202 | if (handle->dev->accept) | ||
203 | return handle->dev->accept(handle->dev, file); | ||
204 | |||
205 | return 0; | ||
206 | } | ||
207 | EXPORT_SYMBOL(input_accept_process); | ||
208 | |||
209 | int input_grab_device(struct input_handle *handle) | 227 | int input_grab_device(struct input_handle *handle) |
210 | { | 228 | { |
211 | if (handle->dev->grab) | 229 | if (handle->dev->grab) |
@@ -218,8 +236,15 @@ EXPORT_SYMBOL(input_grab_device); | |||
218 | 236 | ||
219 | void input_release_device(struct input_handle *handle) | 237 | void input_release_device(struct input_handle *handle) |
220 | { | 238 | { |
221 | if (handle->dev->grab == handle) | 239 | struct input_dev *dev = handle->dev; |
222 | handle->dev->grab = NULL; | 240 | |
241 | if (dev->grab == handle) { | ||
242 | dev->grab = NULL; | ||
243 | |||
244 | list_for_each_entry(handle, &dev->h_list, d_node) | ||
245 | if (handle->handler->start) | ||
246 | handle->handler->start(handle); | ||
247 | } | ||
223 | } | 248 | } |
224 | EXPORT_SYMBOL(input_release_device); | 249 | EXPORT_SYMBOL(input_release_device); |
225 | 250 | ||
@@ -963,8 +988,11 @@ int input_register_device(struct input_dev *dev) | |||
963 | list_for_each_entry(handler, &input_handler_list, node) | 988 | list_for_each_entry(handler, &input_handler_list, node) |
964 | if (!handler->blacklist || !input_match_device(handler->blacklist, dev)) | 989 | if (!handler->blacklist || !input_match_device(handler->blacklist, dev)) |
965 | if ((id = input_match_device(handler->id_table, dev))) | 990 | if ((id = input_match_device(handler->id_table, dev))) |
966 | if ((handle = handler->connect(handler, dev, id))) | 991 | if ((handle = handler->connect(handler, dev, id))) { |
967 | input_link_handle(handle); | 992 | input_link_handle(handle); |
993 | if (handler->start) | ||
994 | handler->start(handle); | ||
995 | } | ||
968 | 996 | ||
969 | input_wakeup_procfs_readers(); | 997 | input_wakeup_procfs_readers(); |
970 | 998 | ||
@@ -1028,8 +1056,11 @@ void input_register_handler(struct input_handler *handler) | |||
1028 | list_for_each_entry(dev, &input_dev_list, node) | 1056 | list_for_each_entry(dev, &input_dev_list, node) |
1029 | if (!handler->blacklist || !input_match_device(handler->blacklist, dev)) | 1057 | if (!handler->blacklist || !input_match_device(handler->blacklist, dev)) |
1030 | if ((id = input_match_device(handler->id_table, dev))) | 1058 | if ((id = input_match_device(handler->id_table, dev))) |
1031 | if ((handle = handler->connect(handler, dev, id))) | 1059 | if ((handle = handler->connect(handler, dev, id))) { |
1032 | input_link_handle(handle); | 1060 | input_link_handle(handle); |
1061 | if (handler->start) | ||
1062 | handler->start(handle); | ||
1063 | } | ||
1033 | 1064 | ||
1034 | input_wakeup_procfs_readers(); | 1065 | input_wakeup_procfs_readers(); |
1035 | } | 1066 | } |
diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c index 6d99e3c37884..b4914e7231f8 100644 --- a/drivers/input/joystick/iforce/iforce-main.c +++ b/drivers/input/joystick/iforce/iforce-main.c | |||
@@ -79,6 +79,7 @@ static struct iforce_device iforce_device[] = { | |||
79 | { 0x06f8, 0x0001, "Guillemot Race Leader Force Feedback", btn_wheel, abs_wheel, ff_iforce }, //? | 79 | { 0x06f8, 0x0001, "Guillemot Race Leader Force Feedback", btn_wheel, abs_wheel, ff_iforce }, //? |
80 | { 0x06f8, 0x0004, "Guillemot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //? | 80 | { 0x06f8, 0x0004, "Guillemot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //? |
81 | { 0x06f8, 0x0004, "Gullemot Jet Leader 3D", btn_joystick, abs_joystick, ff_iforce }, //? | 81 | { 0x06f8, 0x0004, "Gullemot Jet Leader 3D", btn_joystick, abs_joystick, ff_iforce }, //? |
82 | { 0x06d6, 0x29bc, "Trust Force Feedback Race Master", btn_wheel, abs_wheel, ff_iforce }, | ||
82 | { 0x0000, 0x0000, "Unknown I-Force Device [%04x:%04x]", btn_joystick, abs_joystick, ff_iforce } | 83 | { 0x0000, 0x0000, "Unknown I-Force Device [%04x:%04x]", btn_joystick, abs_joystick, ff_iforce } |
83 | }; | 84 | }; |
84 | 85 | ||
@@ -222,22 +223,22 @@ static int iforce_erase_effect(struct input_dev *dev, int effect_id) | |||
222 | int err = 0; | 223 | int err = 0; |
223 | struct iforce_core_effect* core_effect; | 224 | struct iforce_core_effect* core_effect; |
224 | 225 | ||
225 | /* Check who is trying to erase this effect */ | ||
226 | if (iforce->core_effects[effect_id].owner != current->pid) { | ||
227 | printk(KERN_WARNING "iforce-main.c: %d tried to erase an effect belonging to %d\n", current->pid, iforce->core_effects[effect_id].owner); | ||
228 | return -EACCES; | ||
229 | } | ||
230 | |||
231 | if (effect_id < 0 || effect_id >= FF_EFFECTS_MAX) | 226 | if (effect_id < 0 || effect_id >= FF_EFFECTS_MAX) |
232 | return -EINVAL; | 227 | return -EINVAL; |
233 | 228 | ||
234 | core_effect = iforce->core_effects + effect_id; | 229 | core_effect = &iforce->core_effects[effect_id]; |
230 | |||
231 | /* Check who is trying to erase this effect */ | ||
232 | if (core_effect->owner != current->pid) { | ||
233 | printk(KERN_WARNING "iforce-main.c: %d tried to erase an effect belonging to %d\n", current->pid, core_effect->owner); | ||
234 | return -EACCES; | ||
235 | } | ||
235 | 236 | ||
236 | if (test_bit(FF_MOD1_IS_USED, core_effect->flags)) | 237 | if (test_bit(FF_MOD1_IS_USED, core_effect->flags)) |
237 | err = release_resource(&(iforce->core_effects[effect_id].mod1_chunk)); | 238 | err = release_resource(&core_effect->mod1_chunk); |
238 | 239 | ||
239 | if (!err && test_bit(FF_MOD2_IS_USED, core_effect->flags)) | 240 | if (!err && test_bit(FF_MOD2_IS_USED, core_effect->flags)) |
240 | err = release_resource(&(iforce->core_effects[effect_id].mod2_chunk)); | 241 | err = release_resource(&core_effect->mod2_chunk); |
241 | 242 | ||
242 | /*TODO: remember to change that if more FF_MOD* bits are added */ | 243 | /*TODO: remember to change that if more FF_MOD* bits are added */ |
243 | core_effect->flags[0] = 0; | 244 | core_effect->flags[0] = 0; |
diff --git a/drivers/input/joystick/spaceball.c b/drivers/input/joystick/spaceball.c index 75eb5ca59992..7a19ee052972 100644 --- a/drivers/input/joystick/spaceball.c +++ b/drivers/input/joystick/spaceball.c | |||
@@ -50,7 +50,7 @@ MODULE_LICENSE("GPL"); | |||
50 | */ | 50 | */ |
51 | 51 | ||
52 | #define SPACEBALL_MAX_LENGTH 128 | 52 | #define SPACEBALL_MAX_LENGTH 128 |
53 | #define SPACEBALL_MAX_ID 8 | 53 | #define SPACEBALL_MAX_ID 9 |
54 | 54 | ||
55 | #define SPACEBALL_1003 1 | 55 | #define SPACEBALL_1003 1 |
56 | #define SPACEBALL_2003B 3 | 56 | #define SPACEBALL_2003B 3 |
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index ce1f10e8984b..6bfa0cf4b1d2 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c | |||
@@ -482,13 +482,7 @@ out: | |||
482 | return IRQ_HANDLED; | 482 | return IRQ_HANDLED; |
483 | } | 483 | } |
484 | 484 | ||
485 | /* | 485 | static int atkbd_set_repeat_rate(struct atkbd *atkbd) |
486 | * atkbd_event_work() is used to complete processing of events that | ||
487 | * can not be processed by input_event() which is often called from | ||
488 | * interrupt context. | ||
489 | */ | ||
490 | |||
491 | static void atkbd_event_work(void *data) | ||
492 | { | 486 | { |
493 | const short period[32] = | 487 | const short period[32] = |
494 | { 33, 37, 42, 46, 50, 54, 58, 63, 67, 75, 83, 92, 100, 109, 116, 125, | 488 | { 33, 37, 42, 46, 50, 54, 58, 63, 67, 75, 83, 92, 100, 109, 116, 125, |
@@ -496,41 +490,64 @@ static void atkbd_event_work(void *data) | |||
496 | const short delay[4] = | 490 | const short delay[4] = |
497 | { 250, 500, 750, 1000 }; | 491 | { 250, 500, 750, 1000 }; |
498 | 492 | ||
499 | struct atkbd *atkbd = data; | 493 | struct input_dev *dev = atkbd->dev; |
494 | unsigned char param; | ||
495 | int i = 0, j = 0; | ||
496 | |||
497 | while (i < ARRAY_SIZE(period) - 1 && period[i] < dev->rep[REP_PERIOD]) | ||
498 | i++; | ||
499 | dev->rep[REP_PERIOD] = period[i]; | ||
500 | |||
501 | while (j < ARRAY_SIZE(period) - 1 && delay[j] < dev->rep[REP_DELAY]) | ||
502 | j++; | ||
503 | dev->rep[REP_DELAY] = delay[j]; | ||
504 | |||
505 | param = i | (j << 5); | ||
506 | return ps2_command(&atkbd->ps2dev, ¶m, ATKBD_CMD_SETREP); | ||
507 | } | ||
508 | |||
509 | static int atkbd_set_leds(struct atkbd *atkbd) | ||
510 | { | ||
500 | struct input_dev *dev = atkbd->dev; | 511 | struct input_dev *dev = atkbd->dev; |
501 | unsigned char param[2]; | 512 | unsigned char param[2]; |
502 | int i, j; | ||
503 | 513 | ||
504 | mutex_lock(&atkbd->event_mutex); | 514 | param[0] = (test_bit(LED_SCROLLL, dev->led) ? 1 : 0) |
515 | | (test_bit(LED_NUML, dev->led) ? 2 : 0) | ||
516 | | (test_bit(LED_CAPSL, dev->led) ? 4 : 0); | ||
517 | if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS)) | ||
518 | return -1; | ||
505 | 519 | ||
506 | if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask)) { | 520 | if (atkbd->extra) { |
507 | param[0] = (test_bit(LED_SCROLLL, dev->led) ? 1 : 0) | 521 | param[0] = 0; |
508 | | (test_bit(LED_NUML, dev->led) ? 2 : 0) | 522 | param[1] = (test_bit(LED_COMPOSE, dev->led) ? 0x01 : 0) |
509 | | (test_bit(LED_CAPSL, dev->led) ? 4 : 0); | 523 | | (test_bit(LED_SLEEP, dev->led) ? 0x02 : 0) |
510 | ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS); | 524 | | (test_bit(LED_SUSPEND, dev->led) ? 0x04 : 0) |
511 | 525 | | (test_bit(LED_MISC, dev->led) ? 0x10 : 0) | |
512 | if (atkbd->extra) { | 526 | | (test_bit(LED_MUTE, dev->led) ? 0x20 : 0); |
513 | param[0] = 0; | 527 | if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS)) |
514 | param[1] = (test_bit(LED_COMPOSE, dev->led) ? 0x01 : 0) | 528 | return -1; |
515 | | (test_bit(LED_SLEEP, dev->led) ? 0x02 : 0) | ||
516 | | (test_bit(LED_SUSPEND, dev->led) ? 0x04 : 0) | ||
517 | | (test_bit(LED_MISC, dev->led) ? 0x10 : 0) | ||
518 | | (test_bit(LED_MUTE, dev->led) ? 0x20 : 0); | ||
519 | ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS); | ||
520 | } | ||
521 | } | 529 | } |
522 | 530 | ||
523 | if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) { | 531 | return 0; |
524 | i = j = 0; | 532 | } |
525 | while (i < 31 && period[i] < dev->rep[REP_PERIOD]) | 533 | |
526 | i++; | 534 | /* |
527 | while (j < 3 && delay[j] < dev->rep[REP_DELAY]) | 535 | * atkbd_event_work() is used to complete processing of events that |
528 | j++; | 536 | * can not be processed by input_event() which is often called from |
529 | dev->rep[REP_PERIOD] = period[i]; | 537 | * interrupt context. |
530 | dev->rep[REP_DELAY] = delay[j]; | 538 | */ |
531 | param[0] = i | (j << 5); | 539 | |
532 | ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETREP); | 540 | static void atkbd_event_work(void *data) |
533 | } | 541 | { |
542 | struct atkbd *atkbd = data; | ||
543 | |||
544 | mutex_lock(&atkbd->event_mutex); | ||
545 | |||
546 | if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask)) | ||
547 | atkbd_set_leds(atkbd); | ||
548 | |||
549 | if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) | ||
550 | atkbd_set_repeat_rate(atkbd); | ||
534 | 551 | ||
535 | mutex_unlock(&atkbd->event_mutex); | 552 | mutex_unlock(&atkbd->event_mutex); |
536 | } | 553 | } |
@@ -975,7 +992,6 @@ static int atkbd_reconnect(struct serio *serio) | |||
975 | { | 992 | { |
976 | struct atkbd *atkbd = serio_get_drvdata(serio); | 993 | struct atkbd *atkbd = serio_get_drvdata(serio); |
977 | struct serio_driver *drv = serio->drv; | 994 | struct serio_driver *drv = serio->drv; |
978 | unsigned char param[1]; | ||
979 | 995 | ||
980 | if (!atkbd || !drv) { | 996 | if (!atkbd || !drv) { |
981 | printk(KERN_DEBUG "atkbd: reconnect request, but serio is disconnected, ignoring...\n"); | 997 | printk(KERN_DEBUG "atkbd: reconnect request, but serio is disconnected, ignoring...\n"); |
@@ -985,10 +1001,6 @@ static int atkbd_reconnect(struct serio *serio) | |||
985 | atkbd_disable(atkbd); | 1001 | atkbd_disable(atkbd); |
986 | 1002 | ||
987 | if (atkbd->write) { | 1003 | if (atkbd->write) { |
988 | param[0] = (test_bit(LED_SCROLLL, atkbd->dev->led) ? 1 : 0) | ||
989 | | (test_bit(LED_NUML, atkbd->dev->led) ? 2 : 0) | ||
990 | | (test_bit(LED_CAPSL, atkbd->dev->led) ? 4 : 0); | ||
991 | |||
992 | if (atkbd_probe(atkbd)) | 1004 | if (atkbd_probe(atkbd)) |
993 | return -1; | 1005 | return -1; |
994 | if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra)) | 1006 | if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra)) |
@@ -996,8 +1008,13 @@ static int atkbd_reconnect(struct serio *serio) | |||
996 | 1008 | ||
997 | atkbd_activate(atkbd); | 1009 | atkbd_activate(atkbd); |
998 | 1010 | ||
999 | if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS)) | 1011 | /* |
1000 | return -1; | 1012 | * Restore repeat rate and LEDs (that were reset by atkbd_activate) |
1013 | * to pre-resume state | ||
1014 | */ | ||
1015 | if (!atkbd->softrepeat) | ||
1016 | atkbd_set_repeat_rate(atkbd); | ||
1017 | atkbd_set_leds(atkbd); | ||
1001 | } | 1018 | } |
1002 | 1019 | ||
1003 | atkbd_enable(atkbd); | 1020 | atkbd_enable(atkbd); |
diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c index ccf0faeee5c1..a8efc1af36cb 100644 --- a/drivers/input/misc/wistron_btns.c +++ b/drivers/input/misc/wistron_btns.c | |||
@@ -94,7 +94,7 @@ static void call_bios(struct regs *regs) | |||
94 | 94 | ||
95 | static ssize_t __init locate_wistron_bios(void __iomem *base) | 95 | static ssize_t __init locate_wistron_bios(void __iomem *base) |
96 | { | 96 | { |
97 | static const unsigned char __initdata signature[] = | 97 | static unsigned char __initdata signature[] = |
98 | { 0x42, 0x21, 0x55, 0x30 }; | 98 | { 0x42, 0x21, 0x55, 0x30 }; |
99 | ssize_t offset; | 99 | ssize_t offset; |
100 | 100 | ||
@@ -259,11 +259,11 @@ static int __init dmi_matched(struct dmi_system_id *dmi) | |||
259 | return 1; | 259 | return 1; |
260 | } | 260 | } |
261 | 261 | ||
262 | static struct key_entry keymap_empty[] = { | 262 | static struct key_entry keymap_empty[] __initdata = { |
263 | { KE_END, 0 } | 263 | { KE_END, 0 } |
264 | }; | 264 | }; |
265 | 265 | ||
266 | static struct key_entry keymap_fs_amilo_pro_v2000[] = { | 266 | static struct key_entry keymap_fs_amilo_pro_v2000[] __initdata = { |
267 | { KE_KEY, 0x01, KEY_HELP }, | 267 | { KE_KEY, 0x01, KEY_HELP }, |
268 | { KE_KEY, 0x11, KEY_PROG1 }, | 268 | { KE_KEY, 0x11, KEY_PROG1 }, |
269 | { KE_KEY, 0x12, KEY_PROG2 }, | 269 | { KE_KEY, 0x12, KEY_PROG2 }, |
@@ -273,7 +273,7 @@ static struct key_entry keymap_fs_amilo_pro_v2000[] = { | |||
273 | { KE_END, 0 } | 273 | { KE_END, 0 } |
274 | }; | 274 | }; |
275 | 275 | ||
276 | static struct key_entry keymap_fujitsu_n3510[] = { | 276 | static struct key_entry keymap_fujitsu_n3510[] __initdata = { |
277 | { KE_KEY, 0x11, KEY_PROG1 }, | 277 | { KE_KEY, 0x11, KEY_PROG1 }, |
278 | { KE_KEY, 0x12, KEY_PROG2 }, | 278 | { KE_KEY, 0x12, KEY_PROG2 }, |
279 | { KE_KEY, 0x36, KEY_WWW }, | 279 | { KE_KEY, 0x36, KEY_WWW }, |
@@ -285,7 +285,7 @@ static struct key_entry keymap_fujitsu_n3510[] = { | |||
285 | { KE_END, 0 } | 285 | { KE_END, 0 } |
286 | }; | 286 | }; |
287 | 287 | ||
288 | static struct key_entry keymap_wistron_ms2111[] = { | 288 | static struct key_entry keymap_wistron_ms2111[] __initdata = { |
289 | { KE_KEY, 0x11, KEY_PROG1 }, | 289 | { KE_KEY, 0x11, KEY_PROG1 }, |
290 | { KE_KEY, 0x12, KEY_PROG2 }, | 290 | { KE_KEY, 0x12, KEY_PROG2 }, |
291 | { KE_KEY, 0x13, KEY_PROG3 }, | 291 | { KE_KEY, 0x13, KEY_PROG3 }, |
@@ -294,7 +294,7 @@ static struct key_entry keymap_wistron_ms2111[] = { | |||
294 | { KE_END, 0 } | 294 | { KE_END, 0 } |
295 | }; | 295 | }; |
296 | 296 | ||
297 | static struct key_entry keymap_wistron_ms2141[] = { | 297 | static struct key_entry keymap_wistron_ms2141[] __initdata = { |
298 | { KE_KEY, 0x11, KEY_PROG1 }, | 298 | { KE_KEY, 0x11, KEY_PROG1 }, |
299 | { KE_KEY, 0x12, KEY_PROG2 }, | 299 | { KE_KEY, 0x12, KEY_PROG2 }, |
300 | { KE_WIFI, 0x30, 0 }, | 300 | { KE_WIFI, 0x30, 0 }, |
@@ -307,7 +307,7 @@ static struct key_entry keymap_wistron_ms2141[] = { | |||
307 | { KE_END, 0 } | 307 | { KE_END, 0 } |
308 | }; | 308 | }; |
309 | 309 | ||
310 | static struct key_entry keymap_acer_aspire_1500[] = { | 310 | static struct key_entry keymap_acer_aspire_1500[] __initdata = { |
311 | { KE_KEY, 0x11, KEY_PROG1 }, | 311 | { KE_KEY, 0x11, KEY_PROG1 }, |
312 | { KE_KEY, 0x12, KEY_PROG2 }, | 312 | { KE_KEY, 0x12, KEY_PROG2 }, |
313 | { KE_WIFI, 0x30, 0 }, | 313 | { KE_WIFI, 0x30, 0 }, |
@@ -317,7 +317,7 @@ static struct key_entry keymap_acer_aspire_1500[] = { | |||
317 | { KE_END, 0 } | 317 | { KE_END, 0 } |
318 | }; | 318 | }; |
319 | 319 | ||
320 | static struct key_entry keymap_acer_travelmate_240[] = { | 320 | static struct key_entry keymap_acer_travelmate_240[] __initdata = { |
321 | { KE_KEY, 0x31, KEY_MAIL }, | 321 | { KE_KEY, 0x31, KEY_MAIL }, |
322 | { KE_KEY, 0x36, KEY_WWW }, | 322 | { KE_KEY, 0x36, KEY_WWW }, |
323 | { KE_KEY, 0x11, KEY_PROG1 }, | 323 | { KE_KEY, 0x11, KEY_PROG1 }, |
@@ -327,7 +327,7 @@ static struct key_entry keymap_acer_travelmate_240[] = { | |||
327 | { KE_END, 0 } | 327 | { KE_END, 0 } |
328 | }; | 328 | }; |
329 | 329 | ||
330 | static struct key_entry keymap_aopen_1559as[] = { | 330 | static struct key_entry keymap_aopen_1559as[] __initdata = { |
331 | { KE_KEY, 0x01, KEY_HELP }, | 331 | { KE_KEY, 0x01, KEY_HELP }, |
332 | { KE_KEY, 0x06, KEY_PROG3 }, | 332 | { KE_KEY, 0x06, KEY_PROG3 }, |
333 | { KE_KEY, 0x11, KEY_PROG1 }, | 333 | { KE_KEY, 0x11, KEY_PROG1 }, |
@@ -343,7 +343,7 @@ static struct key_entry keymap_aopen_1559as[] = { | |||
343 | * a list of buttons and their key codes (reported when loading this module | 343 | * a list of buttons and their key codes (reported when loading this module |
344 | * with force=1) and the output of dmidecode to $MODULE_AUTHOR. | 344 | * with force=1) and the output of dmidecode to $MODULE_AUTHOR. |
345 | */ | 345 | */ |
346 | static struct dmi_system_id dmi_ids[] = { | 346 | static struct dmi_system_id dmi_ids[] __initdata = { |
347 | { | 347 | { |
348 | .callback = dmi_matched, | 348 | .callback = dmi_matched, |
349 | .ident = "Fujitsu-Siemens Amilo Pro V2000", | 349 | .ident = "Fujitsu-Siemens Amilo Pro V2000", |
diff --git a/drivers/input/mouse/logips2pp.c b/drivers/input/mouse/logips2pp.c index 2f0d28840810..54b696cfe1e3 100644 --- a/drivers/input/mouse/logips2pp.c +++ b/drivers/input/mouse/logips2pp.c | |||
@@ -238,8 +238,7 @@ static struct ps2pp_info *get_model_info(unsigned char model) | |||
238 | { 100, PS2PP_KIND_MX, /* MX510 */ | 238 | { 100, PS2PP_KIND_MX, /* MX510 */ |
239 | PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | | 239 | PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | |
240 | PS2PP_EXTRA_BTN | PS2PP_NAV_BTN }, | 240 | PS2PP_EXTRA_BTN | PS2PP_NAV_BTN }, |
241 | { 111, PS2PP_KIND_MX, /* MX300 */ | 241 | { 111, PS2PP_KIND_MX, PS2PP_WHEEL | PS2PP_SIDE_BTN }, /* MX300 reports task button as side */ |
242 | PS2PP_WHEEL | PS2PP_EXTRA_BTN | PS2PP_TASK_BTN }, | ||
243 | { 112, PS2PP_KIND_MX, /* MX500 */ | 242 | { 112, PS2PP_KIND_MX, /* MX500 */ |
244 | PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | | 243 | PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | |
245 | PS2PP_EXTRA_BTN | PS2PP_NAV_BTN }, | 244 | PS2PP_EXTRA_BTN | PS2PP_NAV_BTN }, |
diff --git a/drivers/input/mouse/trackpoint.c b/drivers/input/mouse/trackpoint.c index 6d9ec9ab1b90..ae5871a0e060 100644 --- a/drivers/input/mouse/trackpoint.c +++ b/drivers/input/mouse/trackpoint.c | |||
@@ -183,21 +183,26 @@ static struct attribute_group trackpoint_attr_group = { | |||
183 | .attrs = trackpoint_attrs, | 183 | .attrs = trackpoint_attrs, |
184 | }; | 184 | }; |
185 | 185 | ||
186 | static void trackpoint_disconnect(struct psmouse *psmouse) | 186 | static int trackpoint_start_protocol(struct psmouse *psmouse, unsigned char *firmware_id) |
187 | { | 187 | { |
188 | sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj, &trackpoint_attr_group); | 188 | unsigned char param[2] = { 0 }; |
189 | 189 | ||
190 | kfree(psmouse->private); | 190 | if (ps2_command(&psmouse->ps2dev, param, MAKE_PS2_CMD(0, 2, TP_READ_ID))) |
191 | psmouse->private = NULL; | 191 | return -1; |
192 | |||
193 | if (param[0] != TP_MAGIC_IDENT) | ||
194 | return -1; | ||
195 | |||
196 | if (firmware_id) | ||
197 | *firmware_id = param[1]; | ||
198 | |||
199 | return 0; | ||
192 | } | 200 | } |
193 | 201 | ||
194 | static int trackpoint_sync(struct psmouse *psmouse) | 202 | static int trackpoint_sync(struct psmouse *psmouse) |
195 | { | 203 | { |
196 | unsigned char toggle; | ||
197 | struct trackpoint_data *tp = psmouse->private; | 204 | struct trackpoint_data *tp = psmouse->private; |
198 | 205 | unsigned char toggle; | |
199 | if (!tp) | ||
200 | return -1; | ||
201 | 206 | ||
202 | /* Disable features that may make device unusable with this driver */ | 207 | /* Disable features that may make device unusable with this driver */ |
203 | trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_TWOHAND, &toggle); | 208 | trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_TWOHAND, &toggle); |
@@ -263,27 +268,38 @@ static void trackpoint_defaults(struct trackpoint_data *tp) | |||
263 | tp->ext_dev = TP_DEF_EXT_DEV; | 268 | tp->ext_dev = TP_DEF_EXT_DEV; |
264 | } | 269 | } |
265 | 270 | ||
271 | static void trackpoint_disconnect(struct psmouse *psmouse) | ||
272 | { | ||
273 | sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj, &trackpoint_attr_group); | ||
274 | |||
275 | kfree(psmouse->private); | ||
276 | psmouse->private = NULL; | ||
277 | } | ||
278 | |||
279 | static int trackpoint_reconnect(struct psmouse *psmouse) | ||
280 | { | ||
281 | if (trackpoint_start_protocol(psmouse, NULL)) | ||
282 | return -1; | ||
283 | |||
284 | if (trackpoint_sync(psmouse)) | ||
285 | return -1; | ||
286 | |||
287 | return 0; | ||
288 | } | ||
289 | |||
266 | int trackpoint_detect(struct psmouse *psmouse, int set_properties) | 290 | int trackpoint_detect(struct psmouse *psmouse, int set_properties) |
267 | { | 291 | { |
268 | struct trackpoint_data *priv; | 292 | struct trackpoint_data *priv; |
269 | struct ps2dev *ps2dev = &psmouse->ps2dev; | 293 | struct ps2dev *ps2dev = &psmouse->ps2dev; |
270 | unsigned char firmware_id; | 294 | unsigned char firmware_id; |
271 | unsigned char button_info; | 295 | unsigned char button_info; |
272 | unsigned char param[2]; | ||
273 | |||
274 | param[0] = param[1] = 0; | ||
275 | 296 | ||
276 | if (ps2_command(ps2dev, param, MAKE_PS2_CMD(0, 2, TP_READ_ID))) | 297 | if (trackpoint_start_protocol(psmouse, &firmware_id)) |
277 | return -1; | ||
278 | |||
279 | if (param[0] != TP_MAGIC_IDENT) | ||
280 | return -1; | 298 | return -1; |
281 | 299 | ||
282 | if (!set_properties) | 300 | if (!set_properties) |
283 | return 0; | 301 | return 0; |
284 | 302 | ||
285 | firmware_id = param[1]; | ||
286 | |||
287 | if (trackpoint_read(&psmouse->ps2dev, TP_EXT_BTN, &button_info)) { | 303 | if (trackpoint_read(&psmouse->ps2dev, TP_EXT_BTN, &button_info)) { |
288 | printk(KERN_WARNING "trackpoint.c: failed to get extended button data\n"); | 304 | printk(KERN_WARNING "trackpoint.c: failed to get extended button data\n"); |
289 | button_info = 0; | 305 | button_info = 0; |
@@ -296,7 +312,7 @@ int trackpoint_detect(struct psmouse *psmouse, int set_properties) | |||
296 | psmouse->vendor = "IBM"; | 312 | psmouse->vendor = "IBM"; |
297 | psmouse->name = "TrackPoint"; | 313 | psmouse->name = "TrackPoint"; |
298 | 314 | ||
299 | psmouse->reconnect = trackpoint_sync; | 315 | psmouse->reconnect = trackpoint_reconnect; |
300 | psmouse->disconnect = trackpoint_disconnect; | 316 | psmouse->disconnect = trackpoint_disconnect; |
301 | 317 | ||
302 | trackpoint_defaults(priv); | 318 | trackpoint_defaults(priv); |
diff --git a/drivers/input/serio/libps2.c b/drivers/input/serio/libps2.c index 61a6f977846f..ed202f2f251a 100644 --- a/drivers/input/serio/libps2.c +++ b/drivers/input/serio/libps2.c | |||
@@ -177,6 +177,11 @@ int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command) | |||
177 | return -1; | 177 | return -1; |
178 | } | 178 | } |
179 | 179 | ||
180 | if (send && !param) { | ||
181 | WARN_ON(1); | ||
182 | return -1; | ||
183 | } | ||
184 | |||
180 | mutex_lock_nested(&ps2dev->cmd_mutex, SINGLE_DEPTH_NESTING); | 185 | mutex_lock_nested(&ps2dev->cmd_mutex, SINGLE_DEPTH_NESTING); |
181 | 186 | ||
182 | serio_pause_rx(ps2dev->serio); | 187 | serio_pause_rx(ps2dev->serio); |
diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c index 6521034bc933..3e76ad71c9a0 100644 --- a/drivers/input/serio/serio.c +++ b/drivers/input/serio/serio.c | |||
@@ -62,6 +62,7 @@ static LIST_HEAD(serio_list); | |||
62 | 62 | ||
63 | static struct bus_type serio_bus; | 63 | static struct bus_type serio_bus; |
64 | 64 | ||
65 | static void serio_add_driver(struct serio_driver *drv); | ||
65 | static void serio_add_port(struct serio *serio); | 66 | static void serio_add_port(struct serio *serio); |
66 | static void serio_destroy_port(struct serio *serio); | 67 | static void serio_destroy_port(struct serio *serio); |
67 | static void serio_reconnect_port(struct serio *serio); | 68 | static void serio_reconnect_port(struct serio *serio); |
@@ -140,8 +141,14 @@ static void serio_release_driver(struct serio *serio) | |||
140 | 141 | ||
141 | static void serio_find_driver(struct serio *serio) | 142 | static void serio_find_driver(struct serio *serio) |
142 | { | 143 | { |
144 | int error; | ||
145 | |||
143 | down_write(&serio_bus.subsys.rwsem); | 146 | down_write(&serio_bus.subsys.rwsem); |
144 | device_attach(&serio->dev); | 147 | error = device_attach(&serio->dev); |
148 | if (error < 0) | ||
149 | printk(KERN_WARNING | ||
150 | "serio: device_attach() failed for %s (%s), error: %d\n", | ||
151 | serio->phys, serio->name, error); | ||
145 | up_write(&serio_bus.subsys.rwsem); | 152 | up_write(&serio_bus.subsys.rwsem); |
146 | } | 153 | } |
147 | 154 | ||
@@ -272,7 +279,6 @@ static struct serio_event *serio_get_event(void) | |||
272 | static void serio_handle_event(void) | 279 | static void serio_handle_event(void) |
273 | { | 280 | { |
274 | struct serio_event *event; | 281 | struct serio_event *event; |
275 | struct serio_driver *serio_drv; | ||
276 | 282 | ||
277 | mutex_lock(&serio_mutex); | 283 | mutex_lock(&serio_mutex); |
278 | 284 | ||
@@ -304,8 +310,7 @@ static void serio_handle_event(void) | |||
304 | break; | 310 | break; |
305 | 311 | ||
306 | case SERIO_REGISTER_DRIVER: | 312 | case SERIO_REGISTER_DRIVER: |
307 | serio_drv = event->object; | 313 | serio_add_driver(event->object); |
308 | driver_register(&serio_drv->driver); | ||
309 | break; | 314 | break; |
310 | 315 | ||
311 | default: | 316 | default: |
@@ -525,6 +530,7 @@ static void serio_init_port(struct serio *serio) | |||
525 | 530 | ||
526 | __module_get(THIS_MODULE); | 531 | __module_get(THIS_MODULE); |
527 | 532 | ||
533 | INIT_LIST_HEAD(&serio->node); | ||
528 | spin_lock_init(&serio->lock); | 534 | spin_lock_init(&serio->lock); |
529 | mutex_init(&serio->drv_mutex); | 535 | mutex_init(&serio->drv_mutex); |
530 | device_initialize(&serio->dev); | 536 | device_initialize(&serio->dev); |
@@ -542,6 +548,8 @@ static void serio_init_port(struct serio *serio) | |||
542 | */ | 548 | */ |
543 | static void serio_add_port(struct serio *serio) | 549 | static void serio_add_port(struct serio *serio) |
544 | { | 550 | { |
551 | int error; | ||
552 | |||
545 | if (serio->parent) { | 553 | if (serio->parent) { |
546 | serio_pause_rx(serio->parent); | 554 | serio_pause_rx(serio->parent); |
547 | serio->parent->child = serio; | 555 | serio->parent->child = serio; |
@@ -551,9 +559,19 @@ static void serio_add_port(struct serio *serio) | |||
551 | list_add_tail(&serio->node, &serio_list); | 559 | list_add_tail(&serio->node, &serio_list); |
552 | if (serio->start) | 560 | if (serio->start) |
553 | serio->start(serio); | 561 | serio->start(serio); |
554 | device_add(&serio->dev); | 562 | error = device_add(&serio->dev); |
555 | sysfs_create_group(&serio->dev.kobj, &serio_id_attr_group); | 563 | if (error) |
556 | serio->registered = 1; | 564 | printk(KERN_ERR |
565 | "serio: device_add() failed for %s (%s), error: %d\n", | ||
566 | serio->phys, serio->name, error); | ||
567 | else { | ||
568 | serio->registered = 1; | ||
569 | error = sysfs_create_group(&serio->dev.kobj, &serio_id_attr_group); | ||
570 | if (error) | ||
571 | printk(KERN_ERR | ||
572 | "serio: sysfs_create_group() failed for %s (%s), error: %d\n", | ||
573 | serio->phys, serio->name, error); | ||
574 | } | ||
557 | } | 575 | } |
558 | 576 | ||
559 | /* | 577 | /* |
@@ -583,10 +601,10 @@ static void serio_destroy_port(struct serio *serio) | |||
583 | if (serio->registered) { | 601 | if (serio->registered) { |
584 | sysfs_remove_group(&serio->dev.kobj, &serio_id_attr_group); | 602 | sysfs_remove_group(&serio->dev.kobj, &serio_id_attr_group); |
585 | device_del(&serio->dev); | 603 | device_del(&serio->dev); |
586 | list_del_init(&serio->node); | ||
587 | serio->registered = 0; | 604 | serio->registered = 0; |
588 | } | 605 | } |
589 | 606 | ||
607 | list_del_init(&serio->node); | ||
590 | serio_remove_pending_events(serio); | 608 | serio_remove_pending_events(serio); |
591 | put_device(&serio->dev); | 609 | put_device(&serio->dev); |
592 | } | 610 | } |
@@ -756,6 +774,17 @@ static struct bus_type serio_bus = { | |||
756 | .remove = serio_driver_remove, | 774 | .remove = serio_driver_remove, |
757 | }; | 775 | }; |
758 | 776 | ||
777 | static void serio_add_driver(struct serio_driver *drv) | ||
778 | { | ||
779 | int error; | ||
780 | |||
781 | error = driver_register(&drv->driver); | ||
782 | if (error) | ||
783 | printk(KERN_ERR | ||
784 | "serio: driver_register() failed for %s, error: %d\n", | ||
785 | drv->driver.name, error); | ||
786 | } | ||
787 | |||
759 | void __serio_register_driver(struct serio_driver *drv, struct module *owner) | 788 | void __serio_register_driver(struct serio_driver *drv, struct module *owner) |
760 | { | 789 | { |
761 | drv->driver.bus = &serio_bus; | 790 | drv->driver.bus = &serio_bus; |
@@ -903,18 +932,26 @@ irqreturn_t serio_interrupt(struct serio *serio, | |||
903 | 932 | ||
904 | static int __init serio_init(void) | 933 | static int __init serio_init(void) |
905 | { | 934 | { |
906 | serio_task = kthread_run(serio_thread, NULL, "kseriod"); | 935 | int error; |
907 | if (IS_ERR(serio_task)) { | ||
908 | printk(KERN_ERR "serio: Failed to start kseriod\n"); | ||
909 | return PTR_ERR(serio_task); | ||
910 | } | ||
911 | 936 | ||
912 | serio_bus.dev_attrs = serio_device_attrs; | 937 | serio_bus.dev_attrs = serio_device_attrs; |
913 | serio_bus.drv_attrs = serio_driver_attrs; | 938 | serio_bus.drv_attrs = serio_driver_attrs; |
914 | serio_bus.match = serio_bus_match; | 939 | serio_bus.match = serio_bus_match; |
915 | serio_bus.uevent = serio_uevent; | 940 | serio_bus.uevent = serio_uevent; |
916 | serio_bus.resume = serio_resume; | 941 | serio_bus.resume = serio_resume; |
917 | bus_register(&serio_bus); | 942 | error = bus_register(&serio_bus); |
943 | if (error) { | ||
944 | printk(KERN_ERR "serio: failed to register serio bus, error: %d\n", error); | ||
945 | return error; | ||
946 | } | ||
947 | |||
948 | serio_task = kthread_run(serio_thread, NULL, "kseriod"); | ||
949 | if (IS_ERR(serio_task)) { | ||
950 | bus_unregister(&serio_bus); | ||
951 | error = PTR_ERR(serio_task); | ||
952 | printk(KERN_ERR "serio: Failed to start kseriod, error: %d\n", error); | ||
953 | return error; | ||
954 | } | ||
918 | 955 | ||
919 | return 0; | 956 | return 0; |
920 | } | 957 | } |
diff --git a/drivers/isdn/hardware/eicon/divasync.h b/drivers/isdn/hardware/eicon/divasync.h index 0a5be7f969f2..af3eb9e795b5 100644 --- a/drivers/isdn/hardware/eicon/divasync.h +++ b/drivers/isdn/hardware/eicon/divasync.h | |||
@@ -256,7 +256,6 @@ typedef struct | |||
256 | #define NO_ORDER_CHECK_MASK 0x00000010 | 256 | #define NO_ORDER_CHECK_MASK 0x00000010 |
257 | #define LOW_CHANNEL_MASK 0x00000020 | 257 | #define LOW_CHANNEL_MASK 0x00000020 |
258 | #define NO_HSCX30_MASK 0x00000040 | 258 | #define NO_HSCX30_MASK 0x00000040 |
259 | #define MODE_MASK 0x00000080 | ||
260 | #define SET_BOARD 0x00001000 | 259 | #define SET_BOARD 0x00001000 |
261 | #define SET_CRC4 0x00030000 | 260 | #define SET_CRC4 0x00030000 |
262 | #define SET_L1_TRISTATE 0x00040000 | 261 | #define SET_L1_TRISTATE 0x00040000 |
diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig index f5fe7fb4b3ad..d5d649f5ccdb 100644 --- a/drivers/macintosh/Kconfig +++ b/drivers/macintosh/Kconfig | |||
@@ -90,6 +90,15 @@ config ADB_PMU_LED | |||
90 | and the ide-disk LED trigger and configure appropriately through | 90 | and the ide-disk LED trigger and configure appropriately through |
91 | sysfs. | 91 | sysfs. |
92 | 92 | ||
93 | config ADB_PMU_LED_IDE | ||
94 | bool "Use front LED as IDE LED by default" | ||
95 | depends on ADB_PMU_LED | ||
96 | select LEDS_TRIGGERS | ||
97 | select LEDS_TRIGGER_IDE_DISK | ||
98 | help | ||
99 | This option makes the front LED default to the IDE trigger | ||
100 | so that it blinks on IDE activity. | ||
101 | |||
93 | config PMAC_SMU | 102 | config PMAC_SMU |
94 | bool "Support for SMU based PowerMacs" | 103 | bool "Support for SMU based PowerMacs" |
95 | depends on PPC_PMAC64 | 104 | depends on PPC_PMAC64 |
@@ -100,7 +109,7 @@ config PMAC_SMU | |||
100 | 109 | ||
101 | config PMAC_APM_EMU | 110 | config PMAC_APM_EMU |
102 | tristate "APM emulation" | 111 | tristate "APM emulation" |
103 | depends on PPC_PMAC && PPC32 && PM | 112 | depends on PPC_PMAC && PPC32 && PM && ADB_PMU |
104 | 113 | ||
105 | config PMAC_MEDIABAY | 114 | config PMAC_MEDIABAY |
106 | bool "Support PowerBook hotswap media bay" | 115 | bool "Support PowerBook hotswap media bay" |
@@ -115,8 +124,6 @@ config PMAC_BACKLIGHT | |||
115 | bool "Backlight control for LCD screens" | 124 | bool "Backlight control for LCD screens" |
116 | depends on ADB_PMU && FB = y && (BROKEN || !PPC64) | 125 | depends on ADB_PMU && FB = y && (BROKEN || !PPC64) |
117 | select FB_BACKLIGHT | 126 | select FB_BACKLIGHT |
118 | select BACKLIGHT_CLASS_DEVICE | ||
119 | select BACKLIGHT_LCD_SUPPORT | ||
120 | help | 127 | help |
121 | Say Y here to enable Macintosh specific extensions of the generic | 128 | Say Y here to enable Macintosh specific extensions of the generic |
122 | backlight code. With this enabled, the brightness keys on older | 129 | backlight code. With this enabled, the brightness keys on older |
diff --git a/drivers/macintosh/adbhid.c b/drivers/macintosh/adbhid.c index 545be1ed6927..c69d23bb255e 100644 --- a/drivers/macintosh/adbhid.c +++ b/drivers/macintosh/adbhid.c | |||
@@ -45,14 +45,11 @@ | |||
45 | #include <linux/pmu.h> | 45 | #include <linux/pmu.h> |
46 | 46 | ||
47 | #include <asm/machdep.h> | 47 | #include <asm/machdep.h> |
48 | #include <asm/backlight.h> | ||
48 | #ifdef CONFIG_PPC_PMAC | 49 | #ifdef CONFIG_PPC_PMAC |
49 | #include <asm/pmac_feature.h> | 50 | #include <asm/pmac_feature.h> |
50 | #endif | 51 | #endif |
51 | 52 | ||
52 | #ifdef CONFIG_PMAC_BACKLIGHT | ||
53 | #include <asm/backlight.h> | ||
54 | #endif | ||
55 | |||
56 | MODULE_AUTHOR("Franz Sirl <Franz.Sirl-kernel@lauterbach.com>"); | 53 | MODULE_AUTHOR("Franz Sirl <Franz.Sirl-kernel@lauterbach.com>"); |
57 | 54 | ||
58 | #define KEYB_KEYREG 0 /* register # for key up/down data */ | 55 | #define KEYB_KEYREG 0 /* register # for key up/down data */ |
@@ -237,11 +234,6 @@ static struct adb_ids keyboard_ids; | |||
237 | static struct adb_ids mouse_ids; | 234 | static struct adb_ids mouse_ids; |
238 | static struct adb_ids buttons_ids; | 235 | static struct adb_ids buttons_ids; |
239 | 236 | ||
240 | #ifdef CONFIG_PMAC_BACKLIGHT | ||
241 | /* Exported to via-pmu.c */ | ||
242 | int disable_kernel_backlight = 0; | ||
243 | #endif /* CONFIG_PMAC_BACKLIGHT */ | ||
244 | |||
245 | /* Kind of keyboard, see Apple technote 1152 */ | 237 | /* Kind of keyboard, see Apple technote 1152 */ |
246 | #define ADB_KEYBOARD_UNKNOWN 0 | 238 | #define ADB_KEYBOARD_UNKNOWN 0 |
247 | #define ADB_KEYBOARD_ANSI 0x0100 | 239 | #define ADB_KEYBOARD_ANSI 0x0100 |
@@ -527,7 +519,7 @@ adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int auto | |||
527 | 519 | ||
528 | case 0xa: /* brightness decrease */ | 520 | case 0xa: /* brightness decrease */ |
529 | #ifdef CONFIG_PMAC_BACKLIGHT | 521 | #ifdef CONFIG_PMAC_BACKLIGHT |
530 | if (!disable_kernel_backlight && down) | 522 | if (down) |
531 | pmac_backlight_key_down(); | 523 | pmac_backlight_key_down(); |
532 | #endif | 524 | #endif |
533 | input_report_key(adbhid[id]->input, KEY_BRIGHTNESSDOWN, down); | 525 | input_report_key(adbhid[id]->input, KEY_BRIGHTNESSDOWN, down); |
@@ -535,7 +527,7 @@ adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int auto | |||
535 | 527 | ||
536 | case 0x9: /* brightness increase */ | 528 | case 0x9: /* brightness increase */ |
537 | #ifdef CONFIG_PMAC_BACKLIGHT | 529 | #ifdef CONFIG_PMAC_BACKLIGHT |
538 | if (!disable_kernel_backlight && down) | 530 | if (down) |
539 | pmac_backlight_key_up(); | 531 | pmac_backlight_key_up(); |
540 | #endif | 532 | #endif |
541 | input_report_key(adbhid[id]->input, KEY_BRIGHTNESSUP, down); | 533 | input_report_key(adbhid[id]->input, KEY_BRIGHTNESSUP, down); |
diff --git a/drivers/macintosh/therm_pm72.c b/drivers/macintosh/therm_pm72.c index c1fe0b368f76..20bf67244e2c 100644 --- a/drivers/macintosh/therm_pm72.c +++ b/drivers/macintosh/therm_pm72.c | |||
@@ -95,6 +95,17 @@ | |||
95 | * - Use min/max macros here or there | 95 | * - Use min/max macros here or there |
96 | * - Latest darwin updated U3H min fan speed to 20% PWM | 96 | * - Latest darwin updated U3H min fan speed to 20% PWM |
97 | * | 97 | * |
98 | * July. 06, 2006 : 1.3 | ||
99 | * - Fix setting of RPM fans on Xserve G5 (they were going too fast) | ||
100 | * - Add missing slots fan control loop for Xserve G5 | ||
101 | * - Lower fixed slots fan speed from 50% to 40% on desktop G5s. We | ||
102 | * still can't properly implement the control loop for these, so let's | ||
103 | * reduce the noise a little bit, it appears that 40% still gives us | ||
104 | * a pretty good air flow | ||
105 | * - Add code to "tickle" the FCU regulary so it doesn't think that | ||
106 | * we are gone while in fact, the machine just didn't need any fan | ||
107 | * speed change lately | ||
108 | * | ||
98 | */ | 109 | */ |
99 | 110 | ||
100 | #include <linux/types.h> | 111 | #include <linux/types.h> |
@@ -121,7 +132,7 @@ | |||
121 | 132 | ||
122 | #include "therm_pm72.h" | 133 | #include "therm_pm72.h" |
123 | 134 | ||
124 | #define VERSION "1.2b2" | 135 | #define VERSION "1.3" |
125 | 136 | ||
126 | #undef DEBUG | 137 | #undef DEBUG |
127 | 138 | ||
@@ -146,6 +157,7 @@ static struct basckside_pid_params backside_params; | |||
146 | static struct backside_pid_state backside_state; | 157 | static struct backside_pid_state backside_state; |
147 | static struct drives_pid_state drives_state; | 158 | static struct drives_pid_state drives_state; |
148 | static struct dimm_pid_state dimms_state; | 159 | static struct dimm_pid_state dimms_state; |
160 | static struct slots_pid_state slots_state; | ||
149 | static int state; | 161 | static int state; |
150 | static int cpu_count; | 162 | static int cpu_count; |
151 | static int cpu_pid_type; | 163 | static int cpu_pid_type; |
@@ -154,7 +166,8 @@ static struct completion ctrl_complete; | |||
154 | static int critical_state; | 166 | static int critical_state; |
155 | static int rackmac; | 167 | static int rackmac; |
156 | static s32 dimm_output_clamp; | 168 | static s32 dimm_output_clamp; |
157 | 169 | static int fcu_rpm_shift; | |
170 | static int fcu_tickle_ticks; | ||
158 | static DECLARE_MUTEX(driver_lock); | 171 | static DECLARE_MUTEX(driver_lock); |
159 | 172 | ||
160 | /* | 173 | /* |
@@ -495,13 +508,20 @@ static int start_fcu(void) | |||
495 | rc = fan_write_reg(0x2e, &buf, 1); | 508 | rc = fan_write_reg(0x2e, &buf, 1); |
496 | if (rc < 0) | 509 | if (rc < 0) |
497 | return -EIO; | 510 | return -EIO; |
511 | rc = fan_read_reg(0, &buf, 1); | ||
512 | if (rc < 0) | ||
513 | return -EIO; | ||
514 | fcu_rpm_shift = (buf == 1) ? 2 : 3; | ||
515 | printk(KERN_DEBUG "FCU Initialized, RPM fan shift is %d\n", | ||
516 | fcu_rpm_shift); | ||
517 | |||
498 | return 0; | 518 | return 0; |
499 | } | 519 | } |
500 | 520 | ||
501 | static int set_rpm_fan(int fan_index, int rpm) | 521 | static int set_rpm_fan(int fan_index, int rpm) |
502 | { | 522 | { |
503 | unsigned char buf[2]; | 523 | unsigned char buf[2]; |
504 | int rc, id; | 524 | int rc, id, min, max; |
505 | 525 | ||
506 | if (fcu_fans[fan_index].type != FCU_FAN_RPM) | 526 | if (fcu_fans[fan_index].type != FCU_FAN_RPM) |
507 | return -EINVAL; | 527 | return -EINVAL; |
@@ -509,12 +529,15 @@ static int set_rpm_fan(int fan_index, int rpm) | |||
509 | if (id == FCU_FAN_ABSENT_ID) | 529 | if (id == FCU_FAN_ABSENT_ID) |
510 | return -EINVAL; | 530 | return -EINVAL; |
511 | 531 | ||
512 | if (rpm < 300) | 532 | min = 2400 >> fcu_rpm_shift; |
513 | rpm = 300; | 533 | max = 56000 >> fcu_rpm_shift; |
514 | else if (rpm > 8191) | 534 | |
515 | rpm = 8191; | 535 | if (rpm < min) |
516 | buf[0] = rpm >> 5; | 536 | rpm = min; |
517 | buf[1] = rpm << 3; | 537 | else if (rpm > max) |
538 | rpm = max; | ||
539 | buf[0] = rpm >> (8 - fcu_rpm_shift); | ||
540 | buf[1] = rpm << fcu_rpm_shift; | ||
518 | rc = fan_write_reg(0x10 + (id * 2), buf, 2); | 541 | rc = fan_write_reg(0x10 + (id * 2), buf, 2); |
519 | if (rc < 0) | 542 | if (rc < 0) |
520 | return -EIO; | 543 | return -EIO; |
@@ -551,7 +574,7 @@ static int get_rpm_fan(int fan_index, int programmed) | |||
551 | if (rc != 2) | 574 | if (rc != 2) |
552 | return -EIO; | 575 | return -EIO; |
553 | 576 | ||
554 | return (buf[0] << 5) | buf[1] >> 3; | 577 | return (buf[0] << (8 - fcu_rpm_shift)) | buf[1] >> fcu_rpm_shift; |
555 | } | 578 | } |
556 | 579 | ||
557 | static int set_pwm_fan(int fan_index, int pwm) | 580 | static int set_pwm_fan(int fan_index, int pwm) |
@@ -609,6 +632,26 @@ static int get_pwm_fan(int fan_index) | |||
609 | return (buf[0] * 1000) / 2559; | 632 | return (buf[0] * 1000) / 2559; |
610 | } | 633 | } |
611 | 634 | ||
635 | static void tickle_fcu(void) | ||
636 | { | ||
637 | int pwm; | ||
638 | |||
639 | pwm = get_pwm_fan(SLOTS_FAN_PWM_INDEX); | ||
640 | |||
641 | DBG("FCU Tickle, slots fan is: %d\n", pwm); | ||
642 | if (pwm < 0) | ||
643 | pwm = 100; | ||
644 | |||
645 | if (!rackmac) { | ||
646 | pwm = SLOTS_FAN_DEFAULT_PWM; | ||
647 | } else if (pwm < SLOTS_PID_OUTPUT_MIN) | ||
648 | pwm = SLOTS_PID_OUTPUT_MIN; | ||
649 | |||
650 | /* That is hopefully enough to make the FCU happy */ | ||
651 | set_pwm_fan(SLOTS_FAN_PWM_INDEX, pwm); | ||
652 | } | ||
653 | |||
654 | |||
612 | /* | 655 | /* |
613 | * Utility routine to read the CPU calibration EEPROM data | 656 | * Utility routine to read the CPU calibration EEPROM data |
614 | * from the device-tree | 657 | * from the device-tree |
@@ -715,6 +758,9 @@ BUILD_SHOW_FUNC_INT(backside_fan_pwm, backside_state.pwm) | |||
715 | BUILD_SHOW_FUNC_FIX(drives_temperature, drives_state.last_temp) | 758 | BUILD_SHOW_FUNC_FIX(drives_temperature, drives_state.last_temp) |
716 | BUILD_SHOW_FUNC_INT(drives_fan_rpm, drives_state.rpm) | 759 | BUILD_SHOW_FUNC_INT(drives_fan_rpm, drives_state.rpm) |
717 | 760 | ||
761 | BUILD_SHOW_FUNC_FIX(slots_temperature, slots_state.last_temp) | ||
762 | BUILD_SHOW_FUNC_INT(slots_fan_pwm, slots_state.pwm) | ||
763 | |||
718 | BUILD_SHOW_FUNC_FIX(dimms_temperature, dimms_state.last_temp) | 764 | BUILD_SHOW_FUNC_FIX(dimms_temperature, dimms_state.last_temp) |
719 | 765 | ||
720 | static DEVICE_ATTR(cpu0_temperature,S_IRUGO,show_cpu0_temperature,NULL); | 766 | static DEVICE_ATTR(cpu0_temperature,S_IRUGO,show_cpu0_temperature,NULL); |
@@ -735,6 +781,9 @@ static DEVICE_ATTR(backside_fan_pwm,S_IRUGO,show_backside_fan_pwm,NULL); | |||
735 | static DEVICE_ATTR(drives_temperature,S_IRUGO,show_drives_temperature,NULL); | 781 | static DEVICE_ATTR(drives_temperature,S_IRUGO,show_drives_temperature,NULL); |
736 | static DEVICE_ATTR(drives_fan_rpm,S_IRUGO,show_drives_fan_rpm,NULL); | 782 | static DEVICE_ATTR(drives_fan_rpm,S_IRUGO,show_drives_fan_rpm,NULL); |
737 | 783 | ||
784 | static DEVICE_ATTR(slots_temperature,S_IRUGO,show_slots_temperature,NULL); | ||
785 | static DEVICE_ATTR(slots_fan_pwm,S_IRUGO,show_slots_fan_pwm,NULL); | ||
786 | |||
738 | static DEVICE_ATTR(dimms_temperature,S_IRUGO,show_dimms_temperature,NULL); | 787 | static DEVICE_ATTR(dimms_temperature,S_IRUGO,show_dimms_temperature,NULL); |
739 | 788 | ||
740 | /* | 789 | /* |
@@ -1076,6 +1125,9 @@ static void do_monitor_cpu_rack(struct cpu_pid_state *state) | |||
1076 | fan_min = dimm_output_clamp; | 1125 | fan_min = dimm_output_clamp; |
1077 | fan_min = max(fan_min, (int)state->mpu.rminn_intake_fan); | 1126 | fan_min = max(fan_min, (int)state->mpu.rminn_intake_fan); |
1078 | 1127 | ||
1128 | DBG(" CPU min mpu = %d, min dimm = %d\n", | ||
1129 | state->mpu.rminn_intake_fan, dimm_output_clamp); | ||
1130 | |||
1079 | state->rpm = max(state->rpm, (int)fan_min); | 1131 | state->rpm = max(state->rpm, (int)fan_min); |
1080 | state->rpm = min(state->rpm, (int)state->mpu.rmaxn_intake_fan); | 1132 | state->rpm = min(state->rpm, (int)state->mpu.rmaxn_intake_fan); |
1081 | state->intake_rpm = state->rpm; | 1133 | state->intake_rpm = state->rpm; |
@@ -1374,7 +1426,8 @@ static void do_monitor_drives(struct drives_pid_state *state) | |||
1374 | DBG(" current rpm: %d\n", state->rpm); | 1426 | DBG(" current rpm: %d\n", state->rpm); |
1375 | 1427 | ||
1376 | /* Get some sensor readings */ | 1428 | /* Get some sensor readings */ |
1377 | temp = le16_to_cpu(i2c_smbus_read_word_data(state->monitor, DS1775_TEMP)) << 8; | 1429 | temp = le16_to_cpu(i2c_smbus_read_word_data(state->monitor, |
1430 | DS1775_TEMP)) << 8; | ||
1378 | state->last_temp = temp; | 1431 | state->last_temp = temp; |
1379 | DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp), | 1432 | DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp), |
1380 | FIX32TOPRINT(DRIVES_PID_INPUT_TARGET)); | 1433 | FIX32TOPRINT(DRIVES_PID_INPUT_TARGET)); |
@@ -1575,7 +1628,7 @@ static int init_dimms_state(struct dimm_pid_state *state) | |||
1575 | } | 1628 | } |
1576 | 1629 | ||
1577 | /* | 1630 | /* |
1578 | * Dispose of the state data for the drives control loop | 1631 | * Dispose of the state data for the DIMM control loop |
1579 | */ | 1632 | */ |
1580 | static void dispose_dimms_state(struct dimm_pid_state *state) | 1633 | static void dispose_dimms_state(struct dimm_pid_state *state) |
1581 | { | 1634 | { |
@@ -1588,6 +1641,127 @@ static void dispose_dimms_state(struct dimm_pid_state *state) | |||
1588 | state->monitor = NULL; | 1641 | state->monitor = NULL; |
1589 | } | 1642 | } |
1590 | 1643 | ||
1644 | /* | ||
1645 | * Slots fan control loop | ||
1646 | */ | ||
1647 | static void do_monitor_slots(struct slots_pid_state *state) | ||
1648 | { | ||
1649 | s32 temp, integral, derivative; | ||
1650 | s64 integ_p, deriv_p, prop_p, sum; | ||
1651 | int i, rc; | ||
1652 | |||
1653 | if (--state->ticks != 0) | ||
1654 | return; | ||
1655 | state->ticks = SLOTS_PID_INTERVAL; | ||
1656 | |||
1657 | DBG("slots:\n"); | ||
1658 | |||
1659 | /* Check fan status */ | ||
1660 | rc = get_pwm_fan(SLOTS_FAN_PWM_INDEX); | ||
1661 | if (rc < 0) { | ||
1662 | printk(KERN_WARNING "Error %d reading slots fan !\n", rc); | ||
1663 | /* XXX What do we do now ? */ | ||
1664 | } else | ||
1665 | state->pwm = rc; | ||
1666 | DBG(" current pwm: %d\n", state->pwm); | ||
1667 | |||
1668 | /* Get some sensor readings */ | ||
1669 | temp = le16_to_cpu(i2c_smbus_read_word_data(state->monitor, | ||
1670 | DS1775_TEMP)) << 8; | ||
1671 | state->last_temp = temp; | ||
1672 | DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp), | ||
1673 | FIX32TOPRINT(SLOTS_PID_INPUT_TARGET)); | ||
1674 | |||
1675 | /* Store temperature and error in history array */ | ||
1676 | state->cur_sample = (state->cur_sample + 1) % SLOTS_PID_HISTORY_SIZE; | ||
1677 | state->sample_history[state->cur_sample] = temp; | ||
1678 | state->error_history[state->cur_sample] = temp - SLOTS_PID_INPUT_TARGET; | ||
1679 | |||
1680 | /* If first loop, fill the history table */ | ||
1681 | if (state->first) { | ||
1682 | for (i = 0; i < (SLOTS_PID_HISTORY_SIZE - 1); i++) { | ||
1683 | state->cur_sample = (state->cur_sample + 1) % | ||
1684 | SLOTS_PID_HISTORY_SIZE; | ||
1685 | state->sample_history[state->cur_sample] = temp; | ||
1686 | state->error_history[state->cur_sample] = | ||
1687 | temp - SLOTS_PID_INPUT_TARGET; | ||
1688 | } | ||
1689 | state->first = 0; | ||
1690 | } | ||
1691 | |||
1692 | /* Calculate the integral term */ | ||
1693 | sum = 0; | ||
1694 | integral = 0; | ||
1695 | for (i = 0; i < SLOTS_PID_HISTORY_SIZE; i++) | ||
1696 | integral += state->error_history[i]; | ||
1697 | integral *= SLOTS_PID_INTERVAL; | ||
1698 | DBG(" integral: %08x\n", integral); | ||
1699 | integ_p = ((s64)SLOTS_PID_G_r) * (s64)integral; | ||
1700 | DBG(" integ_p: %d\n", (int)(integ_p >> 36)); | ||
1701 | sum += integ_p; | ||
1702 | |||
1703 | /* Calculate the derivative term */ | ||
1704 | derivative = state->error_history[state->cur_sample] - | ||
1705 | state->error_history[(state->cur_sample + SLOTS_PID_HISTORY_SIZE - 1) | ||
1706 | % SLOTS_PID_HISTORY_SIZE]; | ||
1707 | derivative /= SLOTS_PID_INTERVAL; | ||
1708 | deriv_p = ((s64)SLOTS_PID_G_d) * (s64)derivative; | ||
1709 | DBG(" deriv_p: %d\n", (int)(deriv_p >> 36)); | ||
1710 | sum += deriv_p; | ||
1711 | |||
1712 | /* Calculate the proportional term */ | ||
1713 | prop_p = ((s64)SLOTS_PID_G_p) * (s64)(state->error_history[state->cur_sample]); | ||
1714 | DBG(" prop_p: %d\n", (int)(prop_p >> 36)); | ||
1715 | sum += prop_p; | ||
1716 | |||
1717 | /* Scale sum */ | ||
1718 | sum >>= 36; | ||
1719 | |||
1720 | DBG(" sum: %d\n", (int)sum); | ||
1721 | state->pwm = (s32)sum; | ||
1722 | |||
1723 | state->pwm = max(state->pwm, SLOTS_PID_OUTPUT_MIN); | ||
1724 | state->pwm = min(state->pwm, SLOTS_PID_OUTPUT_MAX); | ||
1725 | |||
1726 | DBG("** DRIVES PWM: %d\n", (int)state->pwm); | ||
1727 | set_pwm_fan(SLOTS_FAN_PWM_INDEX, state->pwm); | ||
1728 | } | ||
1729 | |||
1730 | /* | ||
1731 | * Initialize the state structure for the slots bay fan control loop | ||
1732 | */ | ||
1733 | static int init_slots_state(struct slots_pid_state *state) | ||
1734 | { | ||
1735 | state->ticks = 1; | ||
1736 | state->first = 1; | ||
1737 | state->pwm = 50; | ||
1738 | |||
1739 | state->monitor = attach_i2c_chip(XSERVE_SLOTS_LM75, "slots_temp"); | ||
1740 | if (state->monitor == NULL) | ||
1741 | return -ENODEV; | ||
1742 | |||
1743 | device_create_file(&of_dev->dev, &dev_attr_slots_temperature); | ||
1744 | device_create_file(&of_dev->dev, &dev_attr_slots_fan_pwm); | ||
1745 | |||
1746 | return 0; | ||
1747 | } | ||
1748 | |||
1749 | /* | ||
1750 | * Dispose of the state data for the slots control loop | ||
1751 | */ | ||
1752 | static void dispose_slots_state(struct slots_pid_state *state) | ||
1753 | { | ||
1754 | if (state->monitor == NULL) | ||
1755 | return; | ||
1756 | |||
1757 | device_remove_file(&of_dev->dev, &dev_attr_slots_temperature); | ||
1758 | device_remove_file(&of_dev->dev, &dev_attr_slots_fan_pwm); | ||
1759 | |||
1760 | detach_i2c_chip(state->monitor); | ||
1761 | state->monitor = NULL; | ||
1762 | } | ||
1763 | |||
1764 | |||
1591 | static int call_critical_overtemp(void) | 1765 | static int call_critical_overtemp(void) |
1592 | { | 1766 | { |
1593 | char *argv[] = { critical_overtemp_path, NULL }; | 1767 | char *argv[] = { critical_overtemp_path, NULL }; |
@@ -1617,14 +1791,17 @@ static int main_control_loop(void *x) | |||
1617 | goto out; | 1791 | goto out; |
1618 | } | 1792 | } |
1619 | 1793 | ||
1620 | /* Set the PCI fan once for now */ | 1794 | /* Set the PCI fan once for now on non-RackMac */ |
1621 | set_pwm_fan(SLOTS_FAN_PWM_INDEX, SLOTS_FAN_DEFAULT_PWM); | 1795 | if (!rackmac) |
1796 | set_pwm_fan(SLOTS_FAN_PWM_INDEX, SLOTS_FAN_DEFAULT_PWM); | ||
1622 | 1797 | ||
1623 | /* Initialize ADCs */ | 1798 | /* Initialize ADCs */ |
1624 | initialize_adc(&cpu_state[0]); | 1799 | initialize_adc(&cpu_state[0]); |
1625 | if (cpu_state[1].monitor != NULL) | 1800 | if (cpu_state[1].monitor != NULL) |
1626 | initialize_adc(&cpu_state[1]); | 1801 | initialize_adc(&cpu_state[1]); |
1627 | 1802 | ||
1803 | fcu_tickle_ticks = FCU_TICKLE_TICKS; | ||
1804 | |||
1628 | up(&driver_lock); | 1805 | up(&driver_lock); |
1629 | 1806 | ||
1630 | while (state == state_attached) { | 1807 | while (state == state_attached) { |
@@ -1634,6 +1811,12 @@ static int main_control_loop(void *x) | |||
1634 | 1811 | ||
1635 | down(&driver_lock); | 1812 | down(&driver_lock); |
1636 | 1813 | ||
1814 | /* Tickle the FCU just in case */ | ||
1815 | if (--fcu_tickle_ticks < 0) { | ||
1816 | fcu_tickle_ticks = FCU_TICKLE_TICKS; | ||
1817 | tickle_fcu(); | ||
1818 | } | ||
1819 | |||
1637 | /* First, we always calculate the new DIMMs state on an Xserve */ | 1820 | /* First, we always calculate the new DIMMs state on an Xserve */ |
1638 | if (rackmac) | 1821 | if (rackmac) |
1639 | do_monitor_dimms(&dimms_state); | 1822 | do_monitor_dimms(&dimms_state); |
@@ -1654,7 +1837,9 @@ static int main_control_loop(void *x) | |||
1654 | } | 1837 | } |
1655 | /* Then, the rest */ | 1838 | /* Then, the rest */ |
1656 | do_monitor_backside(&backside_state); | 1839 | do_monitor_backside(&backside_state); |
1657 | if (!rackmac) | 1840 | if (rackmac) |
1841 | do_monitor_slots(&slots_state); | ||
1842 | else | ||
1658 | do_monitor_drives(&drives_state); | 1843 | do_monitor_drives(&drives_state); |
1659 | up(&driver_lock); | 1844 | up(&driver_lock); |
1660 | 1845 | ||
@@ -1696,6 +1881,7 @@ static void dispose_control_loops(void) | |||
1696 | dispose_cpu_state(&cpu_state[1]); | 1881 | dispose_cpu_state(&cpu_state[1]); |
1697 | dispose_backside_state(&backside_state); | 1882 | dispose_backside_state(&backside_state); |
1698 | dispose_drives_state(&drives_state); | 1883 | dispose_drives_state(&drives_state); |
1884 | dispose_slots_state(&slots_state); | ||
1699 | dispose_dimms_state(&dimms_state); | 1885 | dispose_dimms_state(&dimms_state); |
1700 | } | 1886 | } |
1701 | 1887 | ||
@@ -1745,6 +1931,8 @@ static int create_control_loops(void) | |||
1745 | goto fail; | 1931 | goto fail; |
1746 | if (rackmac && init_dimms_state(&dimms_state)) | 1932 | if (rackmac && init_dimms_state(&dimms_state)) |
1747 | goto fail; | 1933 | goto fail; |
1934 | if (rackmac && init_slots_state(&slots_state)) | ||
1935 | goto fail; | ||
1748 | if (!rackmac && init_drives_state(&drives_state)) | 1936 | if (!rackmac && init_drives_state(&drives_state)) |
1749 | goto fail; | 1937 | goto fail; |
1750 | 1938 | ||
diff --git a/drivers/macintosh/therm_pm72.h b/drivers/macintosh/therm_pm72.h index fc7e9b7ecaf2..393cc9df94e1 100644 --- a/drivers/macintosh/therm_pm72.h +++ b/drivers/macintosh/therm_pm72.h | |||
@@ -105,6 +105,7 @@ static char * critical_overtemp_path = "/sbin/critical_overtemp"; | |||
105 | #define DRIVES_DALLAS_ID 0x94 | 105 | #define DRIVES_DALLAS_ID 0x94 |
106 | #define BACKSIDE_MAX_ID 0x98 | 106 | #define BACKSIDE_MAX_ID 0x98 |
107 | #define XSERVE_DIMMS_LM87 0x25a | 107 | #define XSERVE_DIMMS_LM87 0x25a |
108 | #define XSERVE_SLOTS_LM75 0x290 | ||
108 | 109 | ||
109 | /* | 110 | /* |
110 | * Some MAX6690, DS1775, LM87 register definitions | 111 | * Some MAX6690, DS1775, LM87 register definitions |
@@ -198,7 +199,7 @@ struct drives_pid_state | |||
198 | 199 | ||
199 | #define SLOTS_FAN_PWM_DEFAULT_ID 2 | 200 | #define SLOTS_FAN_PWM_DEFAULT_ID 2 |
200 | #define SLOTS_FAN_PWM_INDEX 2 | 201 | #define SLOTS_FAN_PWM_INDEX 2 |
201 | #define SLOTS_FAN_DEFAULT_PWM 50 /* Do better here ! */ | 202 | #define SLOTS_FAN_DEFAULT_PWM 40 /* Do better here ! */ |
202 | 203 | ||
203 | 204 | ||
204 | /* | 205 | /* |
@@ -206,7 +207,7 @@ struct drives_pid_state | |||
206 | */ | 207 | */ |
207 | #define DIMM_PID_G_d 0 | 208 | #define DIMM_PID_G_d 0 |
208 | #define DIMM_PID_G_p 0 | 209 | #define DIMM_PID_G_p 0 |
209 | #define DIMM_PID_G_r 0x6553600 | 210 | #define DIMM_PID_G_r 0x06553600 |
210 | #define DIMM_PID_INPUT_TARGET 3276800 | 211 | #define DIMM_PID_INPUT_TARGET 3276800 |
211 | #define DIMM_PID_INTERVAL 1 | 212 | #define DIMM_PID_INTERVAL 1 |
212 | #define DIMM_PID_OUTPUT_MAX 14000 | 213 | #define DIMM_PID_OUTPUT_MAX 14000 |
@@ -226,6 +227,31 @@ struct dimm_pid_state | |||
226 | }; | 227 | }; |
227 | 228 | ||
228 | 229 | ||
230 | /* | ||
231 | * PID factors for the Xserve Slots control loop | ||
232 | */ | ||
233 | #define SLOTS_PID_G_d 0 | ||
234 | #define SLOTS_PID_G_p 0 | ||
235 | #define SLOTS_PID_G_r 0x00100000 | ||
236 | #define SLOTS_PID_INPUT_TARGET 3200000 | ||
237 | #define SLOTS_PID_INTERVAL 1 | ||
238 | #define SLOTS_PID_OUTPUT_MAX 100 | ||
239 | #define SLOTS_PID_OUTPUT_MIN 20 | ||
240 | #define SLOTS_PID_HISTORY_SIZE 20 | ||
241 | |||
242 | struct slots_pid_state | ||
243 | { | ||
244 | int ticks; | ||
245 | struct i2c_client * monitor; | ||
246 | s32 sample_history[SLOTS_PID_HISTORY_SIZE]; | ||
247 | s32 error_history[SLOTS_PID_HISTORY_SIZE]; | ||
248 | int cur_sample; | ||
249 | s32 last_temp; | ||
250 | int first; | ||
251 | int pwm; | ||
252 | }; | ||
253 | |||
254 | |||
229 | 255 | ||
230 | /* Desktops */ | 256 | /* Desktops */ |
231 | 257 | ||
@@ -283,6 +309,9 @@ struct cpu_pid_state | |||
283 | s32 pump_max; | 309 | s32 pump_max; |
284 | }; | 310 | }; |
285 | 311 | ||
312 | /* Tickle FCU every 10 seconds */ | ||
313 | #define FCU_TICKLE_TICKS 10 | ||
314 | |||
286 | /* | 315 | /* |
287 | * Driver state | 316 | * Driver state |
288 | */ | 317 | */ |
diff --git a/drivers/macintosh/via-pmu-backlight.c b/drivers/macintosh/via-pmu-backlight.c index b42d05f2aaff..d3f8d75bcbb4 100644 --- a/drivers/macintosh/via-pmu-backlight.c +++ b/drivers/macintosh/via-pmu-backlight.c | |||
@@ -15,8 +15,9 @@ | |||
15 | 15 | ||
16 | #define MAX_PMU_LEVEL 0xFF | 16 | #define MAX_PMU_LEVEL 0xFF |
17 | 17 | ||
18 | static struct device_node *vias; | ||
19 | static struct backlight_properties pmu_backlight_data; | 18 | static struct backlight_properties pmu_backlight_data; |
19 | static spinlock_t pmu_backlight_lock; | ||
20 | static int sleeping; | ||
20 | 21 | ||
21 | static int pmu_backlight_get_level_brightness(struct fb_info *info, | 22 | static int pmu_backlight_get_level_brightness(struct fb_info *info, |
22 | int level) | 23 | int level) |
@@ -40,23 +41,36 @@ static int pmu_backlight_update_status(struct backlight_device *bd) | |||
40 | { | 41 | { |
41 | struct fb_info *info = class_get_devdata(&bd->class_dev); | 42 | struct fb_info *info = class_get_devdata(&bd->class_dev); |
42 | struct adb_request req; | 43 | struct adb_request req; |
43 | int pmulevel, level = bd->props->brightness; | 44 | unsigned long flags; |
45 | int level = bd->props->brightness; | ||
44 | 46 | ||
45 | if (vias == NULL) | 47 | spin_lock_irqsave(&pmu_backlight_lock, flags); |
46 | return -ENODEV; | 48 | |
49 | /* Don't update brightness when sleeping */ | ||
50 | if (sleeping) | ||
51 | goto out; | ||
47 | 52 | ||
48 | if (bd->props->power != FB_BLANK_UNBLANK || | 53 | if (bd->props->power != FB_BLANK_UNBLANK || |
49 | bd->props->fb_blank != FB_BLANK_UNBLANK) | 54 | bd->props->fb_blank != FB_BLANK_UNBLANK) |
50 | level = 0; | 55 | level = 0; |
51 | 56 | ||
52 | pmulevel = pmu_backlight_get_level_brightness(info, level); | 57 | if (level > 0) { |
58 | int pmulevel = pmu_backlight_get_level_brightness(info, level); | ||
53 | 59 | ||
54 | pmu_request(&req, NULL, 2, PMU_BACKLIGHT_BRIGHT, pmulevel); | 60 | pmu_request(&req, NULL, 2, PMU_BACKLIGHT_BRIGHT, pmulevel); |
55 | pmu_wait_complete(&req); | 61 | pmu_wait_complete(&req); |
56 | 62 | ||
57 | pmu_request(&req, NULL, 2, PMU_POWER_CTRL, | 63 | pmu_request(&req, NULL, 2, PMU_POWER_CTRL, |
58 | PMU_POW_BACKLIGHT | (level > 0 ? PMU_POW_ON : PMU_POW_OFF)); | 64 | PMU_POW_BACKLIGHT | PMU_POW_ON); |
59 | pmu_wait_complete(&req); | 65 | pmu_wait_complete(&req); |
66 | } else { | ||
67 | pmu_request(&req, NULL, 2, PMU_POWER_CTRL, | ||
68 | PMU_POW_BACKLIGHT | PMU_POW_OFF); | ||
69 | pmu_wait_complete(&req); | ||
70 | } | ||
71 | |||
72 | out: | ||
73 | spin_unlock_irqrestore(&pmu_backlight_lock, flags); | ||
60 | 74 | ||
61 | return 0; | 75 | return 0; |
62 | } | 76 | } |
@@ -73,15 +87,39 @@ static struct backlight_properties pmu_backlight_data = { | |||
73 | .max_brightness = (FB_BACKLIGHT_LEVELS - 1), | 87 | .max_brightness = (FB_BACKLIGHT_LEVELS - 1), |
74 | }; | 88 | }; |
75 | 89 | ||
76 | void __init pmu_backlight_init(struct device_node *in_vias) | 90 | #ifdef CONFIG_PM |
91 | static int pmu_backlight_sleep_call(struct pmu_sleep_notifier *self, int when) | ||
92 | { | ||
93 | unsigned long flags; | ||
94 | |||
95 | spin_lock_irqsave(&pmu_backlight_lock, flags); | ||
96 | |||
97 | switch (when) { | ||
98 | case PBOOK_SLEEP_REQUEST: | ||
99 | sleeping = 1; | ||
100 | break; | ||
101 | case PBOOK_WAKE: | ||
102 | sleeping = 0; | ||
103 | break; | ||
104 | } | ||
105 | |||
106 | spin_unlock_irqrestore(&pmu_backlight_lock, flags); | ||
107 | |||
108 | return PBOOK_SLEEP_OK; | ||
109 | } | ||
110 | |||
111 | static struct pmu_sleep_notifier pmu_backlight_sleep_notif = { | ||
112 | .notifier_call = pmu_backlight_sleep_call, | ||
113 | }; | ||
114 | #endif | ||
115 | |||
116 | void __init pmu_backlight_init() | ||
77 | { | 117 | { |
78 | struct backlight_device *bd; | 118 | struct backlight_device *bd; |
79 | struct fb_info *info; | 119 | struct fb_info *info; |
80 | char name[10]; | 120 | char name[10]; |
81 | int level, autosave; | 121 | int level, autosave; |
82 | 122 | ||
83 | vias = in_vias; | ||
84 | |||
85 | /* Special case for the old PowerBook since I can't test on it */ | 123 | /* Special case for the old PowerBook since I can't test on it */ |
86 | autosave = | 124 | autosave = |
87 | machine_is_compatible("AAPL,3400/2400") || | 125 | machine_is_compatible("AAPL,3400/2400") || |
@@ -141,6 +179,10 @@ void __init pmu_backlight_init(struct device_node *in_vias) | |||
141 | pmac_backlight = bd; | 179 | pmac_backlight = bd; |
142 | mutex_unlock(&pmac_backlight_mutex); | 180 | mutex_unlock(&pmac_backlight_mutex); |
143 | 181 | ||
182 | #ifdef CONFIG_PM | ||
183 | pmu_register_sleep_notifier(&pmu_backlight_sleep_notif); | ||
184 | #endif | ||
185 | |||
144 | printk("pmubl: Backlight initialized (%s)\n", name); | 186 | printk("pmubl: Backlight initialized (%s)\n", name); |
145 | 187 | ||
146 | return; | 188 | return; |
diff --git a/drivers/macintosh/via-pmu-led.c b/drivers/macintosh/via-pmu-led.c index af8375ed0f5e..5189d5454b1f 100644 --- a/drivers/macintosh/via-pmu-led.c +++ b/drivers/macintosh/via-pmu-led.c | |||
@@ -74,7 +74,7 @@ static void pmu_led_set(struct led_classdev *led_cdev, | |||
74 | 74 | ||
75 | static struct led_classdev pmu_led = { | 75 | static struct led_classdev pmu_led = { |
76 | .name = "pmu-front-led", | 76 | .name = "pmu-front-led", |
77 | #ifdef CONFIG_BLK_DEV_IDE_PMAC_BLINK | 77 | #ifdef CONFIG_ADB_PMU_LED_IDE |
78 | .default_trigger = "ide-disk", | 78 | .default_trigger = "ide-disk", |
79 | #endif | 79 | #endif |
80 | .brightness_set = pmu_led_set, | 80 | .brightness_set = pmu_led_set, |
diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c index 06ca80bfd6b9..ea386801e215 100644 --- a/drivers/macintosh/via-pmu.c +++ b/drivers/macintosh/via-pmu.c | |||
@@ -16,7 +16,6 @@ | |||
16 | * a sleep or a freq. switch | 16 | * a sleep or a freq. switch |
17 | * - Move sleep code out of here to pmac_pm, merge into new | 17 | * - Move sleep code out of here to pmac_pm, merge into new |
18 | * common PM infrastructure | 18 | * common PM infrastructure |
19 | * - Move backlight code out as well | ||
20 | * - Save/Restore PCI space properly | 19 | * - Save/Restore PCI space properly |
21 | * | 20 | * |
22 | */ | 21 | */ |
@@ -60,9 +59,7 @@ | |||
60 | #include <asm/mmu_context.h> | 59 | #include <asm/mmu_context.h> |
61 | #include <asm/cputable.h> | 60 | #include <asm/cputable.h> |
62 | #include <asm/time.h> | 61 | #include <asm/time.h> |
63 | #ifdef CONFIG_PMAC_BACKLIGHT | ||
64 | #include <asm/backlight.h> | 62 | #include <asm/backlight.h> |
65 | #endif | ||
66 | 63 | ||
67 | #include "via-pmu-event.h" | 64 | #include "via-pmu-event.h" |
68 | 65 | ||
@@ -177,10 +174,6 @@ static int query_batt_timer = BATTERY_POLLING_COUNT; | |||
177 | static struct adb_request batt_req; | 174 | static struct adb_request batt_req; |
178 | static struct proc_dir_entry *proc_pmu_batt[PMU_MAX_BATTERIES]; | 175 | static struct proc_dir_entry *proc_pmu_batt[PMU_MAX_BATTERIES]; |
179 | 176 | ||
180 | #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) | ||
181 | extern int disable_kernel_backlight; | ||
182 | #endif /* defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) */ | ||
183 | |||
184 | int __fake_sleep; | 177 | int __fake_sleep; |
185 | int asleep; | 178 | int asleep; |
186 | BLOCKING_NOTIFIER_HEAD(sleep_notifier_list); | 179 | BLOCKING_NOTIFIER_HEAD(sleep_notifier_list); |
@@ -466,7 +459,7 @@ static int __init via_pmu_dev_init(void) | |||
466 | 459 | ||
467 | #ifdef CONFIG_PMAC_BACKLIGHT | 460 | #ifdef CONFIG_PMAC_BACKLIGHT |
468 | /* Initialize backlight */ | 461 | /* Initialize backlight */ |
469 | pmu_backlight_init(vias); | 462 | pmu_backlight_init(); |
470 | #endif | 463 | #endif |
471 | 464 | ||
472 | #ifdef CONFIG_PPC32 | 465 | #ifdef CONFIG_PPC32 |
@@ -1403,11 +1396,8 @@ next: | |||
1403 | else if ((1 << pirq) & PMU_INT_SNDBRT) { | 1396 | else if ((1 << pirq) & PMU_INT_SNDBRT) { |
1404 | #ifdef CONFIG_PMAC_BACKLIGHT | 1397 | #ifdef CONFIG_PMAC_BACKLIGHT |
1405 | if (len == 3) | 1398 | if (len == 3) |
1406 | #ifdef CONFIG_INPUT_ADBHID | 1399 | pmac_backlight_set_legacy_brightness_pmu(data[1] >> 4); |
1407 | if (!disable_kernel_backlight) | 1400 | #endif |
1408 | #endif /* CONFIG_INPUT_ADBHID */ | ||
1409 | pmac_backlight_set_legacy_brightness(data[1] >> 4); | ||
1410 | #endif /* CONFIG_PMAC_BACKLIGHT */ | ||
1411 | } | 1401 | } |
1412 | /* Tick interrupt */ | 1402 | /* Tick interrupt */ |
1413 | else if ((1 << pirq) & PMU_INT_TICK) { | 1403 | else if ((1 << pirq) & PMU_INT_TICK) { |
@@ -2414,7 +2404,7 @@ struct pmu_private { | |||
2414 | spinlock_t lock; | 2404 | spinlock_t lock; |
2415 | #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) | 2405 | #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) |
2416 | int backlight_locker; | 2406 | int backlight_locker; |
2417 | #endif /* defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) */ | 2407 | #endif |
2418 | }; | 2408 | }; |
2419 | 2409 | ||
2420 | static LIST_HEAD(all_pmu_pvt); | 2410 | static LIST_HEAD(all_pmu_pvt); |
@@ -2464,7 +2454,7 @@ pmu_open(struct inode *inode, struct file *file) | |||
2464 | spin_lock_irqsave(&all_pvt_lock, flags); | 2454 | spin_lock_irqsave(&all_pvt_lock, flags); |
2465 | #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) | 2455 | #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) |
2466 | pp->backlight_locker = 0; | 2456 | pp->backlight_locker = 0; |
2467 | #endif /* defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) */ | 2457 | #endif |
2468 | list_add(&pp->list, &all_pmu_pvt); | 2458 | list_add(&pp->list, &all_pmu_pvt); |
2469 | spin_unlock_irqrestore(&all_pvt_lock, flags); | 2459 | spin_unlock_irqrestore(&all_pvt_lock, flags); |
2470 | file->private_data = pp; | 2460 | file->private_data = pp; |
@@ -2559,13 +2549,12 @@ pmu_release(struct inode *inode, struct file *file) | |||
2559 | spin_lock_irqsave(&all_pvt_lock, flags); | 2549 | spin_lock_irqsave(&all_pvt_lock, flags); |
2560 | list_del(&pp->list); | 2550 | list_del(&pp->list); |
2561 | spin_unlock_irqrestore(&all_pvt_lock, flags); | 2551 | spin_unlock_irqrestore(&all_pvt_lock, flags); |
2552 | |||
2562 | #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) | 2553 | #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) |
2563 | if (pp->backlight_locker) { | 2554 | if (pp->backlight_locker) |
2564 | spin_lock_irqsave(&pmu_lock, flags); | 2555 | pmac_backlight_enable(); |
2565 | disable_kernel_backlight--; | 2556 | #endif |
2566 | spin_unlock_irqrestore(&pmu_lock, flags); | 2557 | |
2567 | } | ||
2568 | #endif /* defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) */ | ||
2569 | kfree(pp); | 2558 | kfree(pp); |
2570 | } | 2559 | } |
2571 | unlock_kernel(); | 2560 | unlock_kernel(); |
@@ -2642,18 +2631,18 @@ pmu_ioctl(struct inode * inode, struct file *filp, | |||
2642 | #ifdef CONFIG_INPUT_ADBHID | 2631 | #ifdef CONFIG_INPUT_ADBHID |
2643 | case PMU_IOC_GRAB_BACKLIGHT: { | 2632 | case PMU_IOC_GRAB_BACKLIGHT: { |
2644 | struct pmu_private *pp = filp->private_data; | 2633 | struct pmu_private *pp = filp->private_data; |
2645 | unsigned long flags; | ||
2646 | 2634 | ||
2647 | if (pp->backlight_locker) | 2635 | if (pp->backlight_locker) |
2648 | return 0; | 2636 | return 0; |
2637 | |||
2649 | pp->backlight_locker = 1; | 2638 | pp->backlight_locker = 1; |
2650 | spin_lock_irqsave(&pmu_lock, flags); | 2639 | pmac_backlight_disable(); |
2651 | disable_kernel_backlight++; | 2640 | |
2652 | spin_unlock_irqrestore(&pmu_lock, flags); | ||
2653 | return 0; | 2641 | return 0; |
2654 | } | 2642 | } |
2655 | #endif /* CONFIG_INPUT_ADBHID */ | 2643 | #endif /* CONFIG_INPUT_ADBHID */ |
2656 | #endif /* CONFIG_PMAC_BACKLIGHT_LEGACY */ | 2644 | #endif /* CONFIG_PMAC_BACKLIGHT_LEGACY */ |
2645 | |||
2657 | case PMU_IOC_GET_MODEL: | 2646 | case PMU_IOC_GET_MODEL: |
2658 | return put_user(pmu_kind, argp); | 2647 | return put_user(pmu_kind, argp); |
2659 | case PMU_IOC_HAS_ADB: | 2648 | case PMU_IOC_HAS_ADB: |
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index 217615b33223..93f701ea87bc 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c | |||
@@ -710,6 +710,8 @@ static int multipath_ctr(struct dm_target *ti, unsigned int argc, | |||
710 | return -EINVAL; | 710 | return -EINVAL; |
711 | } | 711 | } |
712 | 712 | ||
713 | m->ti = ti; | ||
714 | |||
713 | r = parse_features(&as, m, ti); | 715 | r = parse_features(&as, m, ti); |
714 | if (r) | 716 | if (r) |
715 | goto bad; | 717 | goto bad; |
@@ -751,7 +753,6 @@ static int multipath_ctr(struct dm_target *ti, unsigned int argc, | |||
751 | } | 753 | } |
752 | 754 | ||
753 | ti->private = m; | 755 | ti->private = m; |
754 | m->ti = ti; | ||
755 | 756 | ||
756 | return 0; | 757 | return 0; |
757 | 758 | ||
diff --git a/drivers/md/linear.c b/drivers/md/linear.c index ff83c9b5979e..b99c19c7eb22 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c | |||
@@ -162,7 +162,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) | |||
162 | goto out; | 162 | goto out; |
163 | } | 163 | } |
164 | 164 | ||
165 | min_spacing = mddev->array_size; | 165 | min_spacing = conf->array_size; |
166 | sector_div(min_spacing, PAGE_SIZE/sizeof(struct dev_info *)); | 166 | sector_div(min_spacing, PAGE_SIZE/sizeof(struct dev_info *)); |
167 | 167 | ||
168 | /* min_spacing is the minimum spacing that will fit the hash | 168 | /* min_spacing is the minimum spacing that will fit the hash |
@@ -171,7 +171,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) | |||
171 | * that is larger than min_spacing as use the size of that as | 171 | * that is larger than min_spacing as use the size of that as |
172 | * the actual spacing | 172 | * the actual spacing |
173 | */ | 173 | */ |
174 | conf->hash_spacing = mddev->array_size; | 174 | conf->hash_spacing = conf->array_size; |
175 | for (i=0; i < cnt-1 ; i++) { | 175 | for (i=0; i < cnt-1 ; i++) { |
176 | sector_t sz = 0; | 176 | sector_t sz = 0; |
177 | int j; | 177 | int j; |
@@ -228,7 +228,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) | |||
228 | curr_offset = 0; | 228 | curr_offset = 0; |
229 | i = 0; | 229 | i = 0; |
230 | for (curr_offset = 0; | 230 | for (curr_offset = 0; |
231 | curr_offset < mddev->array_size; | 231 | curr_offset < conf->array_size; |
232 | curr_offset += conf->hash_spacing) { | 232 | curr_offset += conf->hash_spacing) { |
233 | 233 | ||
234 | while (i < mddev->raid_disks-1 && | 234 | while (i < mddev->raid_disks-1 && |
diff --git a/drivers/media/dvb/bt8xx/dst.c b/drivers/media/dvb/bt8xx/dst.c index d687a14ec0a7..06ac899a9a26 100644 --- a/drivers/media/dvb/bt8xx/dst.c +++ b/drivers/media/dvb/bt8xx/dst.c | |||
@@ -393,7 +393,7 @@ static int dst_set_bandwidth(struct dst_state *state, fe_bandwidth_t bandwidth) | |||
393 | state->bandwidth = bandwidth; | 393 | state->bandwidth = bandwidth; |
394 | 394 | ||
395 | if (state->dst_type != DST_TYPE_IS_TERR) | 395 | if (state->dst_type != DST_TYPE_IS_TERR) |
396 | return 0; | 396 | return -EOPNOTSUPP; |
397 | 397 | ||
398 | switch (bandwidth) { | 398 | switch (bandwidth) { |
399 | case BANDWIDTH_6_MHZ: | 399 | case BANDWIDTH_6_MHZ: |
@@ -462,7 +462,7 @@ static int dst_set_symbolrate(struct dst_state *state, u32 srate) | |||
462 | 462 | ||
463 | state->symbol_rate = srate; | 463 | state->symbol_rate = srate; |
464 | if (state->dst_type == DST_TYPE_IS_TERR) { | 464 | if (state->dst_type == DST_TYPE_IS_TERR) { |
465 | return 0; | 465 | return -EOPNOTSUPP; |
466 | } | 466 | } |
467 | dprintk(verbose, DST_INFO, 1, "set symrate %u", srate); | 467 | dprintk(verbose, DST_INFO, 1, "set symrate %u", srate); |
468 | srate /= 1000; | 468 | srate /= 1000; |
@@ -504,7 +504,7 @@ static int dst_set_symbolrate(struct dst_state *state, u32 srate) | |||
504 | static int dst_set_modulation(struct dst_state *state, fe_modulation_t modulation) | 504 | static int dst_set_modulation(struct dst_state *state, fe_modulation_t modulation) |
505 | { | 505 | { |
506 | if (state->dst_type != DST_TYPE_IS_CABLE) | 506 | if (state->dst_type != DST_TYPE_IS_CABLE) |
507 | return 0; | 507 | return -EOPNOTSUPP; |
508 | 508 | ||
509 | state->modulation = modulation; | 509 | state->modulation = modulation; |
510 | switch (modulation) { | 510 | switch (modulation) { |
@@ -1234,7 +1234,7 @@ int dst_command(struct dst_state *state, u8 *data, u8 len) | |||
1234 | goto error; | 1234 | goto error; |
1235 | } | 1235 | } |
1236 | if (write_dst(state, data, len)) { | 1236 | if (write_dst(state, data, len)) { |
1237 | dprintk(verbose, DST_INFO, 1, "Tring to recover.. "); | 1237 | dprintk(verbose, DST_INFO, 1, "Trying to recover.. "); |
1238 | if ((dst_error_recovery(state)) < 0) { | 1238 | if ((dst_error_recovery(state)) < 0) { |
1239 | dprintk(verbose, DST_ERROR, 1, "Recovery Failed."); | 1239 | dprintk(verbose, DST_ERROR, 1, "Recovery Failed."); |
1240 | goto error; | 1240 | goto error; |
@@ -1328,15 +1328,13 @@ static int dst_tone_power_cmd(struct dst_state *state) | |||
1328 | { | 1328 | { |
1329 | u8 paket[8] = { 0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00 }; | 1329 | u8 paket[8] = { 0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00 }; |
1330 | 1330 | ||
1331 | if (state->dst_type == DST_TYPE_IS_TERR) | 1331 | if (state->dst_type != DST_TYPE_IS_SAT) |
1332 | return 0; | 1332 | return -EOPNOTSUPP; |
1333 | paket[4] = state->tx_tuna[4]; | 1333 | paket[4] = state->tx_tuna[4]; |
1334 | paket[2] = state->tx_tuna[2]; | 1334 | paket[2] = state->tx_tuna[2]; |
1335 | paket[3] = state->tx_tuna[3]; | 1335 | paket[3] = state->tx_tuna[3]; |
1336 | paket[7] = dst_check_sum (paket, 7); | 1336 | paket[7] = dst_check_sum (paket, 7); |
1337 | dst_command(state, paket, 8); | 1337 | return dst_command(state, paket, 8); |
1338 | |||
1339 | return 0; | ||
1340 | } | 1338 | } |
1341 | 1339 | ||
1342 | static int dst_get_tuna(struct dst_state *state) | 1340 | static int dst_get_tuna(struct dst_state *state) |
@@ -1465,7 +1463,7 @@ static int dst_set_diseqc(struct dvb_frontend *fe, struct dvb_diseqc_master_cmd | |||
1465 | u8 paket[8] = { 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec }; | 1463 | u8 paket[8] = { 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec }; |
1466 | 1464 | ||
1467 | if (state->dst_type != DST_TYPE_IS_SAT) | 1465 | if (state->dst_type != DST_TYPE_IS_SAT) |
1468 | return 0; | 1466 | return -EOPNOTSUPP; |
1469 | if (cmd->msg_len > 0 && cmd->msg_len < 5) | 1467 | if (cmd->msg_len > 0 && cmd->msg_len < 5) |
1470 | memcpy(&paket[3], cmd->msg, cmd->msg_len); | 1468 | memcpy(&paket[3], cmd->msg, cmd->msg_len); |
1471 | else if (cmd->msg_len == 5 && state->dst_hw_cap & DST_TYPE_HAS_DISEQC5) | 1469 | else if (cmd->msg_len == 5 && state->dst_hw_cap & DST_TYPE_HAS_DISEQC5) |
@@ -1473,18 +1471,17 @@ static int dst_set_diseqc(struct dvb_frontend *fe, struct dvb_diseqc_master_cmd | |||
1473 | else | 1471 | else |
1474 | return -EINVAL; | 1472 | return -EINVAL; |
1475 | paket[7] = dst_check_sum(&paket[0], 7); | 1473 | paket[7] = dst_check_sum(&paket[0], 7); |
1476 | dst_command(state, paket, 8); | 1474 | return dst_command(state, paket, 8); |
1477 | return 0; | ||
1478 | } | 1475 | } |
1479 | 1476 | ||
1480 | static int dst_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) | 1477 | static int dst_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) |
1481 | { | 1478 | { |
1482 | int need_cmd; | 1479 | int need_cmd, retval = 0; |
1483 | struct dst_state *state = fe->demodulator_priv; | 1480 | struct dst_state *state = fe->demodulator_priv; |
1484 | 1481 | ||
1485 | state->voltage = voltage; | 1482 | state->voltage = voltage; |
1486 | if (state->dst_type != DST_TYPE_IS_SAT) | 1483 | if (state->dst_type != DST_TYPE_IS_SAT) |
1487 | return 0; | 1484 | return -EOPNOTSUPP; |
1488 | 1485 | ||
1489 | need_cmd = 0; | 1486 | need_cmd = 0; |
1490 | 1487 | ||
@@ -1506,9 +1503,9 @@ static int dst_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) | |||
1506 | } | 1503 | } |
1507 | 1504 | ||
1508 | if (need_cmd) | 1505 | if (need_cmd) |
1509 | dst_tone_power_cmd(state); | 1506 | retval = dst_tone_power_cmd(state); |
1510 | 1507 | ||
1511 | return 0; | 1508 | return retval; |
1512 | } | 1509 | } |
1513 | 1510 | ||
1514 | static int dst_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) | 1511 | static int dst_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) |
@@ -1517,7 +1514,7 @@ static int dst_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) | |||
1517 | 1514 | ||
1518 | state->tone = tone; | 1515 | state->tone = tone; |
1519 | if (state->dst_type != DST_TYPE_IS_SAT) | 1516 | if (state->dst_type != DST_TYPE_IS_SAT) |
1520 | return 0; | 1517 | return -EOPNOTSUPP; |
1521 | 1518 | ||
1522 | switch (tone) { | 1519 | switch (tone) { |
1523 | case SEC_TONE_OFF: | 1520 | case SEC_TONE_OFF: |
@@ -1533,9 +1530,7 @@ static int dst_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) | |||
1533 | default: | 1530 | default: |
1534 | return -EINVAL; | 1531 | return -EINVAL; |
1535 | } | 1532 | } |
1536 | dst_tone_power_cmd(state); | 1533 | return dst_tone_power_cmd(state); |
1537 | |||
1538 | return 0; | ||
1539 | } | 1534 | } |
1540 | 1535 | ||
1541 | static int dst_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t minicmd) | 1536 | static int dst_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t minicmd) |
@@ -1543,7 +1538,7 @@ static int dst_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t minicmd) | |||
1543 | struct dst_state *state = fe->demodulator_priv; | 1538 | struct dst_state *state = fe->demodulator_priv; |
1544 | 1539 | ||
1545 | if (state->dst_type != DST_TYPE_IS_SAT) | 1540 | if (state->dst_type != DST_TYPE_IS_SAT) |
1546 | return 0; | 1541 | return -EOPNOTSUPP; |
1547 | state->minicmd = minicmd; | 1542 | state->minicmd = minicmd; |
1548 | switch (minicmd) { | 1543 | switch (minicmd) { |
1549 | case SEC_MINI_A: | 1544 | case SEC_MINI_A: |
@@ -1553,9 +1548,7 @@ static int dst_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t minicmd) | |||
1553 | state->tx_tuna[3] = 0xff; | 1548 | state->tx_tuna[3] = 0xff; |
1554 | break; | 1549 | break; |
1555 | } | 1550 | } |
1556 | dst_tone_power_cmd(state); | 1551 | return dst_tone_power_cmd(state); |
1557 | |||
1558 | return 0; | ||
1559 | } | 1552 | } |
1560 | 1553 | ||
1561 | 1554 | ||
@@ -1608,28 +1601,31 @@ static int dst_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | |||
1608 | { | 1601 | { |
1609 | struct dst_state *state = fe->demodulator_priv; | 1602 | struct dst_state *state = fe->demodulator_priv; |
1610 | 1603 | ||
1611 | dst_get_signal(state); | 1604 | int retval = dst_get_signal(state); |
1612 | *strength = state->decode_strength; | 1605 | *strength = state->decode_strength; |
1613 | 1606 | ||
1614 | return 0; | 1607 | return retval; |
1615 | } | 1608 | } |
1616 | 1609 | ||
1617 | static int dst_read_snr(struct dvb_frontend *fe, u16 *snr) | 1610 | static int dst_read_snr(struct dvb_frontend *fe, u16 *snr) |
1618 | { | 1611 | { |
1619 | struct dst_state *state = fe->demodulator_priv; | 1612 | struct dst_state *state = fe->demodulator_priv; |
1620 | 1613 | ||
1621 | dst_get_signal(state); | 1614 | int retval = dst_get_signal(state); |
1622 | *snr = state->decode_snr; | 1615 | *snr = state->decode_snr; |
1623 | 1616 | ||
1624 | return 0; | 1617 | return retval; |
1625 | } | 1618 | } |
1626 | 1619 | ||
1627 | static int dst_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p) | 1620 | static int dst_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p) |
1628 | { | 1621 | { |
1622 | int retval = -EINVAL; | ||
1629 | struct dst_state *state = fe->demodulator_priv; | 1623 | struct dst_state *state = fe->demodulator_priv; |
1630 | 1624 | ||
1631 | if (p != NULL) { | 1625 | if (p != NULL) { |
1632 | dst_set_freq(state, p->frequency); | 1626 | retval = dst_set_freq(state, p->frequency); |
1627 | if(retval != 0) | ||
1628 | return retval; | ||
1633 | dprintk(verbose, DST_DEBUG, 1, "Set Frequency=[%d]", p->frequency); | 1629 | dprintk(verbose, DST_DEBUG, 1, "Set Frequency=[%d]", p->frequency); |
1634 | 1630 | ||
1635 | if (state->dst_type == DST_TYPE_IS_SAT) { | 1631 | if (state->dst_type == DST_TYPE_IS_SAT) { |
@@ -1647,10 +1643,10 @@ static int dst_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_paramet | |||
1647 | dst_set_symbolrate(state, p->u.qam.symbol_rate); | 1643 | dst_set_symbolrate(state, p->u.qam.symbol_rate); |
1648 | dst_set_modulation(state, p->u.qam.modulation); | 1644 | dst_set_modulation(state, p->u.qam.modulation); |
1649 | } | 1645 | } |
1650 | dst_write_tuna(fe); | 1646 | retval = dst_write_tuna(fe); |
1651 | } | 1647 | } |
1652 | 1648 | ||
1653 | return 0; | 1649 | return retval; |
1654 | } | 1650 | } |
1655 | 1651 | ||
1656 | static int dst_tune_frontend(struct dvb_frontend* fe, | 1652 | static int dst_tune_frontend(struct dvb_frontend* fe, |
diff --git a/drivers/media/dvb/dvb-core/Makefile b/drivers/media/dvb/dvb-core/Makefile index 11054657fdb5..0b5182835cc8 100644 --- a/drivers/media/dvb/dvb-core/Makefile +++ b/drivers/media/dvb/dvb-core/Makefile | |||
@@ -2,8 +2,8 @@ | |||
2 | # Makefile for the kernel DVB device drivers. | 2 | # Makefile for the kernel DVB device drivers. |
3 | # | 3 | # |
4 | 4 | ||
5 | dvb-core-objs = dvbdev.o dmxdev.o dvb_demux.o dvb_filter.o \ | 5 | dvb-core-objs := dvbdev.o dmxdev.o dvb_demux.o dvb_filter.o \ |
6 | dvb_ca_en50221.o dvb_frontend.o \ | 6 | dvb_ca_en50221.o dvb_frontend.o \ |
7 | dvb_net.o dvb_ringbuffer.o dvb_math.o | 7 | dvb_net.o dvb_ringbuffer.o dvb_math.o |
8 | 8 | ||
9 | obj-$(CONFIG_DVB_CORE) += dvb-core.o | 9 | obj-$(CONFIG_DVB_CORE) += dvb-core.o |
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 59ac35ddd51e..57b34cda99f5 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c | |||
@@ -526,7 +526,9 @@ static int dvb_frontend_thread(void *data) | |||
526 | fepriv->delay = 3*HZ; | 526 | fepriv->delay = 3*HZ; |
527 | fepriv->status = 0; | 527 | fepriv->status = 0; |
528 | fepriv->wakeup = 0; | 528 | fepriv->wakeup = 0; |
529 | fepriv->reinitialise = 1; | 529 | fepriv->reinitialise = 0; |
530 | |||
531 | dvb_frontend_init(fe); | ||
530 | 532 | ||
531 | while (1) { | 533 | while (1) { |
532 | up(&fepriv->sem); /* is locked when we enter the thread... */ | 534 | up(&fepriv->sem); /* is locked when we enter the thread... */ |
@@ -1013,17 +1015,18 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) | |||
1013 | return ret; | 1015 | return ret; |
1014 | 1016 | ||
1015 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) { | 1017 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) { |
1018 | |||
1019 | /* normal tune mode when opened R/W */ | ||
1020 | fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT; | ||
1021 | fepriv->tone = -1; | ||
1022 | fepriv->voltage = -1; | ||
1023 | |||
1016 | ret = dvb_frontend_start (fe); | 1024 | ret = dvb_frontend_start (fe); |
1017 | if (ret) | 1025 | if (ret) |
1018 | dvb_generic_release (inode, file); | 1026 | dvb_generic_release (inode, file); |
1019 | 1027 | ||
1020 | /* empty event queue */ | 1028 | /* empty event queue */ |
1021 | fepriv->events.eventr = fepriv->events.eventw = 0; | 1029 | fepriv->events.eventr = fepriv->events.eventw = 0; |
1022 | |||
1023 | /* normal tune mode when opened R/W */ | ||
1024 | fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT; | ||
1025 | fepriv->tone = -1; | ||
1026 | fepriv->voltage = -1; | ||
1027 | } | 1030 | } |
1028 | 1031 | ||
1029 | return ret; | 1032 | return ret; |
diff --git a/drivers/media/dvb/frontends/dvb-pll.c b/drivers/media/dvb/frontends/dvb-pll.c index a189683454b7..2be33f27c69f 100644 --- a/drivers/media/dvb/frontends/dvb-pll.c +++ b/drivers/media/dvb/frontends/dvb-pll.c | |||
@@ -194,11 +194,11 @@ struct dvb_pll_desc dvb_pll_tda665x = { | |||
194 | { 253834000, 36249333, 166667, 0xca, 0x62 /* 011 0 0 0 10 */ }, | 194 | { 253834000, 36249333, 166667, 0xca, 0x62 /* 011 0 0 0 10 */ }, |
195 | { 383834000, 36249333, 166667, 0xca, 0xa2 /* 101 0 0 0 10 */ }, | 195 | { 383834000, 36249333, 166667, 0xca, 0xa2 /* 101 0 0 0 10 */ }, |
196 | { 443834000, 36249333, 166667, 0xca, 0xc2 /* 110 0 0 0 10 */ }, | 196 | { 443834000, 36249333, 166667, 0xca, 0xc2 /* 110 0 0 0 10 */ }, |
197 | { 444000000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0 11 */ }, | 197 | { 444000000, 36249333, 166667, 0xca, 0xc4 /* 110 0 0 1 00 */ }, |
198 | { 583834000, 36249333, 166667, 0xca, 0x63 /* 011 0 0 0 11 */ }, | 198 | { 583834000, 36249333, 166667, 0xca, 0x64 /* 011 0 0 1 00 */ }, |
199 | { 793834000, 36249333, 166667, 0xca, 0xa3 /* 101 0 0 0 11 */ }, | 199 | { 793834000, 36249333, 166667, 0xca, 0xa4 /* 101 0 0 1 00 */ }, |
200 | { 444834000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0 11 */ }, | 200 | { 444834000, 36249333, 166667, 0xca, 0xc4 /* 110 0 0 1 00 */ }, |
201 | { 861000000, 36249333, 166667, 0xca, 0xe3 /* 111 0 0 0 11 */ }, | 201 | { 861000000, 36249333, 166667, 0xca, 0xe4 /* 111 0 0 1 00 */ }, |
202 | } | 202 | } |
203 | }; | 203 | }; |
204 | EXPORT_SYMBOL(dvb_pll_tda665x); | 204 | EXPORT_SYMBOL(dvb_pll_tda665x); |
@@ -613,7 +613,21 @@ static struct dvb_tuner_ops dvb_pll_tuner_ops = { | |||
613 | 613 | ||
614 | int dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, struct i2c_adapter *i2c, struct dvb_pll_desc *desc) | 614 | int dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, struct i2c_adapter *i2c, struct dvb_pll_desc *desc) |
615 | { | 615 | { |
616 | u8 b1 [] = { 0 }; | ||
617 | struct i2c_msg msg = { .addr = pll_addr, .flags = I2C_M_RD, .buf = b1, .len = 1 }; | ||
616 | struct dvb_pll_priv *priv = NULL; | 618 | struct dvb_pll_priv *priv = NULL; |
619 | int ret; | ||
620 | |||
621 | if (i2c != NULL) { | ||
622 | if (fe->ops.i2c_gate_ctrl) | ||
623 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
624 | |||
625 | ret = i2c_transfer (i2c, &msg, 1); | ||
626 | if (ret != 1) | ||
627 | return -1; | ||
628 | if (fe->ops.i2c_gate_ctrl) | ||
629 | fe->ops.i2c_gate_ctrl(fe, 0); | ||
630 | } | ||
617 | 631 | ||
618 | priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL); | 632 | priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL); |
619 | if (priv == NULL) | 633 | if (priv == NULL) |
diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c index 500f15c10aaf..4506165c5de2 100644 --- a/drivers/media/dvb/ttpci/av7110.c +++ b/drivers/media/dvb/ttpci/av7110.c | |||
@@ -2203,8 +2203,8 @@ static int frontend_init(struct av7110 *av7110) | |||
2203 | av7110->fe->ops.tuner_ops.set_params = nexusca_stv0297_tuner_set_params; | 2203 | av7110->fe->ops.tuner_ops.set_params = nexusca_stv0297_tuner_set_params; |
2204 | 2204 | ||
2205 | /* set TDA9819 into DVB mode */ | 2205 | /* set TDA9819 into DVB mode */ |
2206 | saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD) | 2206 | saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD) |
2207 | saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF) | 2207 | saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF) |
2208 | 2208 | ||
2209 | /* tuner on this needs a slower i2c bus speed */ | 2209 | /* tuner on this needs a slower i2c bus speed */ |
2210 | av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240; | 2210 | av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240; |
diff --git a/drivers/media/dvb/ttpci/av7110_v4l.c b/drivers/media/dvb/ttpci/av7110_v4l.c index 64055461559d..6ffe53fdcf57 100644 --- a/drivers/media/dvb/ttpci/av7110_v4l.c +++ b/drivers/media/dvb/ttpci/av7110_v4l.c | |||
@@ -272,8 +272,8 @@ static int av7110_dvb_c_switch(struct saa7146_fh *fh) | |||
272 | if (ves1820_writereg(dev, 0x09, 0x0f, 0x60)) | 272 | if (ves1820_writereg(dev, 0x09, 0x0f, 0x60)) |
273 | dprintk(1, "setting band in demodulator failed.\n"); | 273 | dprintk(1, "setting band in demodulator failed.\n"); |
274 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { | 274 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { |
275 | saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9198 pin9(STD) | 275 | saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9819 pin9(STD) |
276 | saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9198 pin30(VIF) | 276 | saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9819 pin30(VIF) |
277 | } | 277 | } |
278 | if (i2c_writereg(av7110, 0x48, 0x02, 0xd0) != 1) | 278 | if (i2c_writereg(av7110, 0x48, 0x02, 0xd0) != 1) |
279 | dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num); | 279 | dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num); |
@@ -308,8 +308,8 @@ static int av7110_dvb_c_switch(struct saa7146_fh *fh) | |||
308 | if (ves1820_writereg(dev, 0x09, 0x0f, 0x20)) | 308 | if (ves1820_writereg(dev, 0x09, 0x0f, 0x20)) |
309 | dprintk(1, "setting band in demodulator failed.\n"); | 309 | dprintk(1, "setting band in demodulator failed.\n"); |
310 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { | 310 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { |
311 | saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD) | 311 | saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD) |
312 | saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF) | 312 | saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF) |
313 | } | 313 | } |
314 | } | 314 | } |
315 | 315 | ||
@@ -750,8 +750,8 @@ int av7110_init_analog_module(struct av7110 *av7110) | |||
750 | if (ves1820_writereg(av7110->dev, 0x09, 0x0f, 0x20)) | 750 | if (ves1820_writereg(av7110->dev, 0x09, 0x0f, 0x20)) |
751 | dprintk(1, "setting band in demodulator failed.\n"); | 751 | dprintk(1, "setting band in demodulator failed.\n"); |
752 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { | 752 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { |
753 | saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD) | 753 | saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD) |
754 | saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF) | 754 | saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF) |
755 | } | 755 | } |
756 | 756 | ||
757 | /* init the saa7113 */ | 757 | /* init the saa7113 */ |
diff --git a/drivers/media/dvb/ttpci/budget-av.c b/drivers/media/dvb/ttpci/budget-av.c index 5f111d407730..2d21fec23b4d 100644 --- a/drivers/media/dvb/ttpci/budget-av.c +++ b/drivers/media/dvb/ttpci/budget-av.c | |||
@@ -1303,6 +1303,9 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio | |||
1303 | budget_av->budget.dvb_adapter.priv = budget_av; | 1303 | budget_av->budget.dvb_adapter.priv = budget_av; |
1304 | frontend_init(budget_av); | 1304 | frontend_init(budget_av); |
1305 | ciintf_init(budget_av); | 1305 | ciintf_init(budget_av); |
1306 | |||
1307 | ttpci_budget_init_hooks(&budget_av->budget); | ||
1308 | |||
1306 | return 0; | 1309 | return 0; |
1307 | } | 1310 | } |
1308 | 1311 | ||
diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c index 4b966eea3834..ffbbb3e34be4 100644 --- a/drivers/media/dvb/ttpci/budget-ci.c +++ b/drivers/media/dvb/ttpci/budget-ci.c | |||
@@ -1101,6 +1101,8 @@ static int budget_ci_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio | |||
1101 | budget_ci->budget.dvb_adapter.priv = budget_ci; | 1101 | budget_ci->budget.dvb_adapter.priv = budget_ci; |
1102 | frontend_init(budget_ci); | 1102 | frontend_init(budget_ci); |
1103 | 1103 | ||
1104 | ttpci_budget_init_hooks(&budget_ci->budget); | ||
1105 | |||
1104 | return 0; | 1106 | return 0; |
1105 | } | 1107 | } |
1106 | 1108 | ||
diff --git a/drivers/media/dvb/ttpci/budget-core.c b/drivers/media/dvb/ttpci/budget-core.c index e4cf7775e07f..e15562f81664 100644 --- a/drivers/media/dvb/ttpci/budget-core.c +++ b/drivers/media/dvb/ttpci/budget-core.c | |||
@@ -63,9 +63,6 @@ static int stop_ts_capture(struct budget *budget) | |||
63 | { | 63 | { |
64 | dprintk(2, "budget: %p\n", budget); | 64 | dprintk(2, "budget: %p\n", budget); |
65 | 65 | ||
66 | if (--budget->feeding) | ||
67 | return budget->feeding; | ||
68 | |||
69 | saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off | 66 | saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off |
70 | SAA7146_IER_DISABLE(budget->dev, MASK_10); | 67 | SAA7146_IER_DISABLE(budget->dev, MASK_10); |
71 | return 0; | 68 | return 0; |
@@ -77,8 +74,8 @@ static int start_ts_capture(struct budget *budget) | |||
77 | 74 | ||
78 | dprintk(2, "budget: %p\n", budget); | 75 | dprintk(2, "budget: %p\n", budget); |
79 | 76 | ||
80 | if (budget->feeding) | 77 | if (!budget->feeding || !budget->fe_synced) |
81 | return ++budget->feeding; | 78 | return 0; |
82 | 79 | ||
83 | saa7146_write(dev, MC1, MASK_20); // DMA3 off | 80 | saa7146_write(dev, MC1, MASK_20); // DMA3 off |
84 | 81 | ||
@@ -139,7 +136,33 @@ static int start_ts_capture(struct budget *budget) | |||
139 | SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */ | 136 | SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */ |
140 | saa7146_write(dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */ | 137 | saa7146_write(dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */ |
141 | 138 | ||
142 | return ++budget->feeding; | 139 | return 0; |
140 | } | ||
141 | |||
142 | static int budget_read_fe_status(struct dvb_frontend *fe, fe_status_t *status) | ||
143 | { | ||
144 | struct budget *budget = (struct budget *) fe->dvb->priv; | ||
145 | int synced; | ||
146 | int ret; | ||
147 | |||
148 | if (budget->read_fe_status) | ||
149 | ret = budget->read_fe_status(fe, status); | ||
150 | else | ||
151 | ret = -EINVAL; | ||
152 | |||
153 | if (!ret) { | ||
154 | synced = (*status & FE_HAS_LOCK); | ||
155 | if (synced != budget->fe_synced) { | ||
156 | budget->fe_synced = synced; | ||
157 | spin_lock(&budget->feedlock); | ||
158 | if (synced) | ||
159 | start_ts_capture(budget); | ||
160 | else | ||
161 | stop_ts_capture(budget); | ||
162 | spin_unlock(&budget->feedlock); | ||
163 | } | ||
164 | } | ||
165 | return ret; | ||
143 | } | 166 | } |
144 | 167 | ||
145 | static void vpeirq(unsigned long data) | 168 | static void vpeirq(unsigned long data) |
@@ -267,7 +290,7 @@ static int budget_start_feed(struct dvb_demux_feed *feed) | |||
267 | { | 290 | { |
268 | struct dvb_demux *demux = feed->demux; | 291 | struct dvb_demux *demux = feed->demux; |
269 | struct budget *budget = (struct budget *) demux->priv; | 292 | struct budget *budget = (struct budget *) demux->priv; |
270 | int status; | 293 | int status = 0; |
271 | 294 | ||
272 | dprintk(2, "budget: %p\n", budget); | 295 | dprintk(2, "budget: %p\n", budget); |
273 | 296 | ||
@@ -276,7 +299,8 @@ static int budget_start_feed(struct dvb_demux_feed *feed) | |||
276 | 299 | ||
277 | spin_lock(&budget->feedlock); | 300 | spin_lock(&budget->feedlock); |
278 | feed->pusi_seen = 0; /* have a clean section start */ | 301 | feed->pusi_seen = 0; /* have a clean section start */ |
279 | status = start_ts_capture(budget); | 302 | if (budget->feeding++ == 0) |
303 | status = start_ts_capture(budget); | ||
280 | spin_unlock(&budget->feedlock); | 304 | spin_unlock(&budget->feedlock); |
281 | return status; | 305 | return status; |
282 | } | 306 | } |
@@ -285,12 +309,13 @@ static int budget_stop_feed(struct dvb_demux_feed *feed) | |||
285 | { | 309 | { |
286 | struct dvb_demux *demux = feed->demux; | 310 | struct dvb_demux *demux = feed->demux; |
287 | struct budget *budget = (struct budget *) demux->priv; | 311 | struct budget *budget = (struct budget *) demux->priv; |
288 | int status; | 312 | int status = 0; |
289 | 313 | ||
290 | dprintk(2, "budget: %p\n", budget); | 314 | dprintk(2, "budget: %p\n", budget); |
291 | 315 | ||
292 | spin_lock(&budget->feedlock); | 316 | spin_lock(&budget->feedlock); |
293 | status = stop_ts_capture(budget); | 317 | if (--budget->feeding == 0) |
318 | status = stop_ts_capture(budget); | ||
294 | spin_unlock(&budget->feedlock); | 319 | spin_unlock(&budget->feedlock); |
295 | return status; | 320 | return status; |
296 | } | 321 | } |
@@ -470,6 +495,14 @@ err: | |||
470 | return ret; | 495 | return ret; |
471 | } | 496 | } |
472 | 497 | ||
498 | void ttpci_budget_init_hooks(struct budget *budget) | ||
499 | { | ||
500 | if (budget->dvb_frontend && !budget->read_fe_status) { | ||
501 | budget->read_fe_status = budget->dvb_frontend->ops.read_status; | ||
502 | budget->dvb_frontend->ops.read_status = budget_read_fe_status; | ||
503 | } | ||
504 | } | ||
505 | |||
473 | int ttpci_budget_deinit(struct budget *budget) | 506 | int ttpci_budget_deinit(struct budget *budget) |
474 | { | 507 | { |
475 | struct saa7146_dev *dev = budget->dev; | 508 | struct saa7146_dev *dev = budget->dev; |
@@ -508,11 +541,8 @@ void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port) | |||
508 | spin_lock(&budget->feedlock); | 541 | spin_lock(&budget->feedlock); |
509 | budget->video_port = video_port; | 542 | budget->video_port = video_port; |
510 | if (budget->feeding) { | 543 | if (budget->feeding) { |
511 | int oldfeeding = budget->feeding; | ||
512 | budget->feeding = 1; | ||
513 | stop_ts_capture(budget); | 544 | stop_ts_capture(budget); |
514 | start_ts_capture(budget); | 545 | start_ts_capture(budget); |
515 | budget->feeding = oldfeeding; | ||
516 | } | 546 | } |
517 | spin_unlock(&budget->feedlock); | 547 | spin_unlock(&budget->feedlock); |
518 | } | 548 | } |
@@ -520,6 +550,7 @@ void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port) | |||
520 | EXPORT_SYMBOL_GPL(ttpci_budget_debiread); | 550 | EXPORT_SYMBOL_GPL(ttpci_budget_debiread); |
521 | EXPORT_SYMBOL_GPL(ttpci_budget_debiwrite); | 551 | EXPORT_SYMBOL_GPL(ttpci_budget_debiwrite); |
522 | EXPORT_SYMBOL_GPL(ttpci_budget_init); | 552 | EXPORT_SYMBOL_GPL(ttpci_budget_init); |
553 | EXPORT_SYMBOL_GPL(ttpci_budget_init_hooks); | ||
523 | EXPORT_SYMBOL_GPL(ttpci_budget_deinit); | 554 | EXPORT_SYMBOL_GPL(ttpci_budget_deinit); |
524 | EXPORT_SYMBOL_GPL(ttpci_budget_irq10_handler); | 555 | EXPORT_SYMBOL_GPL(ttpci_budget_irq10_handler); |
525 | EXPORT_SYMBOL_GPL(ttpci_budget_set_video_port); | 556 | EXPORT_SYMBOL_GPL(ttpci_budget_set_video_port); |
diff --git a/drivers/media/dvb/ttpci/budget-patch.c b/drivers/media/dvb/ttpci/budget-patch.c index ee60ce90a400..57227441891e 100644 --- a/drivers/media/dvb/ttpci/budget-patch.c +++ b/drivers/media/dvb/ttpci/budget-patch.c | |||
@@ -617,6 +617,8 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte | |||
617 | budget->dvb_adapter.priv = budget; | 617 | budget->dvb_adapter.priv = budget; |
618 | frontend_init(budget); | 618 | frontend_init(budget); |
619 | 619 | ||
620 | ttpci_budget_init_hooks(budget); | ||
621 | |||
620 | return 0; | 622 | return 0; |
621 | } | 623 | } |
622 | 624 | ||
diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c index 35761f13c12b..863dffb4ed8e 100644 --- a/drivers/media/dvb/ttpci/budget.c +++ b/drivers/media/dvb/ttpci/budget.c | |||
@@ -375,9 +375,6 @@ static void frontend_init(struct budget *budget) | |||
375 | if (budget->dvb_frontend) { | 375 | if (budget->dvb_frontend) { |
376 | budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; | 376 | budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; |
377 | budget->dvb_frontend->tuner_priv = &budget->i2c_adap; | 377 | budget->dvb_frontend->tuner_priv = &budget->i2c_adap; |
378 | budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; | ||
379 | budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; | ||
380 | budget->dvb_frontend->ops.set_tone = budget_set_tone; | ||
381 | break; | 378 | break; |
382 | } | 379 | } |
383 | break; | 380 | break; |
@@ -474,6 +471,8 @@ static int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_ | |||
474 | budget->dvb_adapter.priv = budget; | 471 | budget->dvb_adapter.priv = budget; |
475 | frontend_init(budget); | 472 | frontend_init(budget); |
476 | 473 | ||
474 | ttpci_budget_init_hooks(budget); | ||
475 | |||
477 | return 0; | 476 | return 0; |
478 | } | 477 | } |
479 | 478 | ||
diff --git a/drivers/media/dvb/ttpci/budget.h b/drivers/media/dvb/ttpci/budget.h index ecea3a13030e..e8a5c79178e1 100644 --- a/drivers/media/dvb/ttpci/budget.h +++ b/drivers/media/dvb/ttpci/budget.h | |||
@@ -52,9 +52,6 @@ struct budget { | |||
52 | struct dmx_frontend hw_frontend; | 52 | struct dmx_frontend hw_frontend; |
53 | struct dmx_frontend mem_frontend; | 53 | struct dmx_frontend mem_frontend; |
54 | 54 | ||
55 | int fe_synced; | ||
56 | struct mutex pid_mutex; | ||
57 | |||
58 | int ci_present; | 55 | int ci_present; |
59 | int video_port; | 56 | int video_port; |
60 | 57 | ||
@@ -74,6 +71,9 @@ struct budget { | |||
74 | 71 | ||
75 | struct dvb_adapter dvb_adapter; | 72 | struct dvb_adapter dvb_adapter; |
76 | struct dvb_frontend *dvb_frontend; | 73 | struct dvb_frontend *dvb_frontend; |
74 | int (*read_fe_status)(struct dvb_frontend *fe, fe_status_t *status); | ||
75 | int fe_synced; | ||
76 | |||
77 | void *priv; | 77 | void *priv; |
78 | }; | 78 | }; |
79 | 79 | ||
@@ -106,6 +106,7 @@ static struct saa7146_pci_extension_data x_var = { \ | |||
106 | extern int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev, | 106 | extern int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev, |
107 | struct saa7146_pci_extension_data *info, | 107 | struct saa7146_pci_extension_data *info, |
108 | struct module *owner); | 108 | struct module *owner); |
109 | extern void ttpci_budget_init_hooks(struct budget *budget); | ||
109 | extern int ttpci_budget_deinit(struct budget *budget); | 110 | extern int ttpci_budget_deinit(struct budget *budget); |
110 | extern void ttpci_budget_irq10_handler(struct saa7146_dev *dev, u32 * isr); | 111 | extern void ttpci_budget_irq10_handler(struct saa7146_dev *dev, u32 * isr); |
111 | extern void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port); | 112 | extern void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port); |
diff --git a/drivers/media/radio/Kconfig b/drivers/media/radio/Kconfig index de3128a31de8..220076b1b956 100644 --- a/drivers/media/radio/Kconfig +++ b/drivers/media/radio/Kconfig | |||
@@ -350,5 +350,15 @@ config RADIO_ZOLTRIX_PORT | |||
350 | help | 350 | help |
351 | Enter the I/O port of your Zoltrix radio card. | 351 | Enter the I/O port of your Zoltrix radio card. |
352 | 352 | ||
353 | endmenu | 353 | config USB_DSBR |
354 | tristate "D-Link USB FM radio support (EXPERIMENTAL)" | ||
355 | depends on USB && VIDEO_V4L1 && EXPERIMENTAL | ||
356 | ---help--- | ||
357 | Say Y here if you want to connect this type of radio to your | ||
358 | computer's USB port. Note that the audio is not digital, and | ||
359 | you must connect the line out connector to a sound card or a | ||
360 | set of speakers. | ||
354 | 361 | ||
362 | To compile this driver as a module, choose M here: the | ||
363 | module will be called dsbr100. | ||
364 | endmenu | ||
diff --git a/drivers/media/radio/Makefile b/drivers/media/radio/Makefile index e95b6805e002..cf55a18e3ddf 100644 --- a/drivers/media/radio/Makefile +++ b/drivers/media/radio/Makefile | |||
@@ -20,5 +20,6 @@ obj-$(CONFIG_RADIO_GEMTEK) += radio-gemtek.o | |||
20 | obj-$(CONFIG_RADIO_GEMTEK_PCI) += radio-gemtek-pci.o | 20 | obj-$(CONFIG_RADIO_GEMTEK_PCI) += radio-gemtek-pci.o |
21 | obj-$(CONFIG_RADIO_TRUST) += radio-trust.o | 21 | obj-$(CONFIG_RADIO_TRUST) += radio-trust.o |
22 | obj-$(CONFIG_RADIO_MAESTRO) += radio-maestro.o | 22 | obj-$(CONFIG_RADIO_MAESTRO) += radio-maestro.o |
23 | obj-$(CONFIG_USB_DSBR) += dsbr100.o | ||
23 | 24 | ||
24 | EXTRA_CFLAGS += -Isound | 25 | EXTRA_CFLAGS += -Isound |
diff --git a/drivers/media/video/dsbr100.c b/drivers/media/radio/dsbr100.c index f7e33f9ee8e9..f7e33f9ee8e9 100644 --- a/drivers/media/video/dsbr100.c +++ b/drivers/media/radio/dsbr100.c | |||
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index 6d532f170ce5..732bf1e7c326 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig | |||
@@ -145,7 +145,7 @@ config VIDEO_SAA5246A | |||
145 | 145 | ||
146 | config VIDEO_SAA5249 | 146 | config VIDEO_SAA5249 |
147 | tristate "SAA5249 Teletext processor" | 147 | tristate "SAA5249 Teletext processor" |
148 | depends on VIDEO_DEV && I2C | 148 | depends on VIDEO_DEV && I2C && VIDEO_V4L1 |
149 | help | 149 | help |
150 | Support for I2C bus based teletext using the SAA5249 chip. At the | 150 | Support for I2C bus based teletext using the SAA5249 chip. At the |
151 | moment this is only useful on some European WinTV cards. | 151 | moment this is only useful on some European WinTV cards. |
@@ -155,7 +155,7 @@ config VIDEO_SAA5249 | |||
155 | 155 | ||
156 | config TUNER_3036 | 156 | config TUNER_3036 |
157 | tristate "SAB3036 tuner" | 157 | tristate "SAB3036 tuner" |
158 | depends on VIDEO_DEV && I2C | 158 | depends on VIDEO_DEV && I2C && VIDEO_V4L1 |
159 | help | 159 | help |
160 | Say Y here to include support for Philips SAB3036 compatible tuners. | 160 | Say Y here to include support for Philips SAB3036 compatible tuners. |
161 | If in doubt, say N. | 161 | If in doubt, say N. |
@@ -449,18 +449,6 @@ source "drivers/media/video/pvrusb2/Kconfig" | |||
449 | 449 | ||
450 | source "drivers/media/video/em28xx/Kconfig" | 450 | source "drivers/media/video/em28xx/Kconfig" |
451 | 451 | ||
452 | config USB_DSBR | ||
453 | tristate "D-Link USB FM radio support (EXPERIMENTAL)" | ||
454 | depends on USB && VIDEO_V4L1 && EXPERIMENTAL | ||
455 | ---help--- | ||
456 | Say Y here if you want to connect this type of radio to your | ||
457 | computer's USB port. Note that the audio is not digital, and | ||
458 | you must connect the line out connector to a sound card or a | ||
459 | set of speakers. | ||
460 | |||
461 | To compile this driver as a module, choose M here: the | ||
462 | module will be called dsbr100. | ||
463 | |||
464 | source "drivers/media/video/usbvideo/Kconfig" | 452 | source "drivers/media/video/usbvideo/Kconfig" |
465 | 453 | ||
466 | source "drivers/media/video/et61x251/Kconfig" | 454 | source "drivers/media/video/et61x251/Kconfig" |
diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile index 353d61cfac1b..e82e511f2a72 100644 --- a/drivers/media/video/Makefile +++ b/drivers/media/video/Makefile | |||
@@ -77,7 +77,6 @@ obj-$(CONFIG_VIDEO_UPD64083) += upd64083.o | |||
77 | obj-$(CONFIG_VIDEO_CX2341X) += cx2341x.o | 77 | obj-$(CONFIG_VIDEO_CX2341X) += cx2341x.o |
78 | 78 | ||
79 | obj-$(CONFIG_USB_DABUSB) += dabusb.o | 79 | obj-$(CONFIG_USB_DABUSB) += dabusb.o |
80 | obj-$(CONFIG_USB_DSBR) += dsbr100.o | ||
81 | obj-$(CONFIG_USB_OV511) += ov511.o | 80 | obj-$(CONFIG_USB_OV511) += ov511.o |
82 | obj-$(CONFIG_USB_SE401) += se401.o | 81 | obj-$(CONFIG_USB_SE401) += se401.o |
83 | obj-$(CONFIG_USB_STV680) += stv680.o | 82 | obj-$(CONFIG_USB_STV680) += stv680.o |
@@ -91,6 +90,7 @@ obj-$(CONFIG_USB_ZC0301) += zc0301/ | |||
91 | obj-$(CONFIG_USB_IBMCAM) += usbvideo/ | 90 | obj-$(CONFIG_USB_IBMCAM) += usbvideo/ |
92 | obj-$(CONFIG_USB_KONICAWC) += usbvideo/ | 91 | obj-$(CONFIG_USB_KONICAWC) += usbvideo/ |
93 | obj-$(CONFIG_USB_VICAM) += usbvideo/ | 92 | obj-$(CONFIG_USB_VICAM) += usbvideo/ |
93 | obj-$(CONFIG_USB_QUICKCAM_MESSENGER) += usbvideo/ | ||
94 | 94 | ||
95 | obj-$(CONFIG_VIDEO_VIVI) += vivi.o | 95 | obj-$(CONFIG_VIDEO_VIVI) += vivi.o |
96 | 96 | ||
diff --git a/drivers/media/video/bt8xx/Kconfig b/drivers/media/video/bt8xx/Kconfig index 153f6a4a96c9..cdcf55650714 100644 --- a/drivers/media/video/bt8xx/Kconfig +++ b/drivers/media/video/bt8xx/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config VIDEO_BT848 | 1 | config VIDEO_BT848 |
2 | tristate "BT848 Video For Linux" | 2 | tristate "BT848 Video For Linux" |
3 | depends on VIDEO_DEV && PCI && I2C && VIDEO_V4L2 | 3 | depends on VIDEO_DEV && PCI && I2C && VIDEO_V4L1 |
4 | select I2C_ALGOBIT | 4 | select I2C_ALGOBIT |
5 | select FW_LOADER | 5 | select FW_LOADER |
6 | select VIDEO_BTCX | 6 | select VIDEO_BTCX |
diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c index 5764a89d3562..20dff7c316eb 100644 --- a/drivers/media/video/bt8xx/bttv-driver.c +++ b/drivers/media/video/bt8xx/bttv-driver.c | |||
@@ -3923,7 +3923,12 @@ static int __devinit bttv_register_video(struct bttv *btv) | |||
3923 | goto err; | 3923 | goto err; |
3924 | printk(KERN_INFO "bttv%d: registered device video%d\n", | 3924 | printk(KERN_INFO "bttv%d: registered device video%d\n", |
3925 | btv->c.nr,btv->video_dev->minor & 0x1f); | 3925 | btv->c.nr,btv->video_dev->minor & 0x1f); |
3926 | video_device_create_file(btv->video_dev, &class_device_attr_card); | 3926 | if (class_device_create_file(&btv->video_dev->class_dev, |
3927 | &class_device_attr_card)<0) { | ||
3928 | printk(KERN_ERR "bttv%d: class_device_create_file 'card' " | ||
3929 | "failed\n", btv->c.nr); | ||
3930 | goto err; | ||
3931 | } | ||
3927 | 3932 | ||
3928 | /* vbi */ | 3933 | /* vbi */ |
3929 | btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi"); | 3934 | btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi"); |
@@ -4287,6 +4292,8 @@ static struct pci_driver bttv_pci_driver = { | |||
4287 | 4292 | ||
4288 | static int bttv_init_module(void) | 4293 | static int bttv_init_module(void) |
4289 | { | 4294 | { |
4295 | int ret; | ||
4296 | |||
4290 | bttv_num = 0; | 4297 | bttv_num = 0; |
4291 | 4298 | ||
4292 | printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n", | 4299 | printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n", |
@@ -4308,7 +4315,11 @@ static int bttv_init_module(void) | |||
4308 | 4315 | ||
4309 | bttv_check_chipset(); | 4316 | bttv_check_chipset(); |
4310 | 4317 | ||
4311 | bus_register(&bttv_sub_bus_type); | 4318 | ret = bus_register(&bttv_sub_bus_type); |
4319 | if (ret < 0) { | ||
4320 | printk(KERN_WARNING "bttv: bus_register error: %d\n", ret); | ||
4321 | return ret; | ||
4322 | } | ||
4312 | return pci_register_driver(&bttv_pci_driver); | 4323 | return pci_register_driver(&bttv_pci_driver); |
4313 | } | 4324 | } |
4314 | 4325 | ||
diff --git a/drivers/media/video/bt8xx/bttv-vbi.c b/drivers/media/video/bt8xx/bttv-vbi.c index 8c9f0f7cf467..63676e7bd635 100644 --- a/drivers/media/video/bt8xx/bttv-vbi.c +++ b/drivers/media/video/bt8xx/bttv-vbi.c | |||
@@ -31,11 +31,16 @@ | |||
31 | #include <asm/io.h> | 31 | #include <asm/io.h> |
32 | #include "bttvp.h" | 32 | #include "bttvp.h" |
33 | 33 | ||
34 | /* Offset from line sync pulse leading edge (0H) in 1 / sampling_rate: | 34 | /* Offset from line sync pulse leading edge (0H) to start of VBI capture, |
35 | bt8x8 /HRESET pulse starts at 0H and has length 64 / fCLKx1 (E|O_VTC | 35 | in fCLKx2 pixels. According to the datasheet, VBI capture starts |
36 | HSFMT = 0). VBI_HDELAY (always 0) is an offset from the trailing edge | 36 | VBI_HDELAY fCLKx1 pixels from the tailing edgeof /HRESET, and /HRESET |
37 | of /HRESET in 1 / fCLKx1, and the sampling_rate tvnorm->Fsc is fCLKx2. */ | 37 | is 64 fCLKx1 pixels wide. VBI_HDELAY is set to 0, so this should be |
38 | #define VBI_OFFSET ((64 + 0) * 2) | 38 | (64 + 0) * 2 = 128 fCLKx2 pixels. But it's not! The datasheet is |
39 | Just Plain Wrong. The real value appears to be different for | ||
40 | different revisions of the bt8x8 chips, and to be affected by the | ||
41 | horizontal scaling factor. Experimentally, the value is measured | ||
42 | to be about 244. */ | ||
43 | #define VBI_OFFSET 244 | ||
39 | 44 | ||
40 | #define VBI_DEFLINES 16 | 45 | #define VBI_DEFLINES 16 |
41 | #define VBI_MAXLINES 32 | 46 | #define VBI_MAXLINES 32 |
diff --git a/drivers/media/video/compat_ioctl32.c b/drivers/media/video/compat_ioctl32.c index 353d02b67c33..b69ee1194815 100644 --- a/drivers/media/video/compat_ioctl32.c +++ b/drivers/media/video/compat_ioctl32.c | |||
@@ -21,7 +21,7 @@ | |||
21 | 21 | ||
22 | #ifdef CONFIG_COMPAT | 22 | #ifdef CONFIG_COMPAT |
23 | 23 | ||
24 | 24 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | |
25 | struct video_tuner32 { | 25 | struct video_tuner32 { |
26 | compat_int_t tuner; | 26 | compat_int_t tuner; |
27 | char name[32]; | 27 | char name[32]; |
@@ -107,6 +107,7 @@ struct video_window32 { | |||
107 | compat_caddr_t clips; | 107 | compat_caddr_t clips; |
108 | compat_int_t clipcount; | 108 | compat_int_t clipcount; |
109 | }; | 109 | }; |
110 | #endif | ||
110 | 111 | ||
111 | static int native_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | 112 | static int native_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
112 | { | 113 | { |
@@ -124,6 +125,7 @@ static int native_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
124 | } | 125 | } |
125 | 126 | ||
126 | 127 | ||
128 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
127 | /* You get back everything except the clips... */ | 129 | /* You get back everything except the clips... */ |
128 | static int put_video_window32(struct video_window *kp, struct video_window32 __user *up) | 130 | static int put_video_window32(struct video_window *kp, struct video_window32 __user *up) |
129 | { | 131 | { |
@@ -138,6 +140,7 @@ static int put_video_window32(struct video_window *kp, struct video_window32 __u | |||
138 | return -EFAULT; | 140 | return -EFAULT; |
139 | return 0; | 141 | return 0; |
140 | } | 142 | } |
143 | #endif | ||
141 | 144 | ||
142 | struct v4l2_clip32 | 145 | struct v4l2_clip32 |
143 | { | 146 | { |
@@ -490,6 +493,24 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user | |||
490 | return 0; | 493 | return 0; |
491 | } | 494 | } |
492 | 495 | ||
496 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
497 | struct video_code32 | ||
498 | { | ||
499 | char loadwhat[16]; /* name or tag of file being passed */ | ||
500 | compat_int_t datasize; | ||
501 | unsigned char *data; | ||
502 | }; | ||
503 | |||
504 | static inline int microcode32(struct video_code *kp, struct video_code32 __user *up) | ||
505 | { | ||
506 | if(!access_ok(VERIFY_READ, up, sizeof(struct video_code32)) || | ||
507 | copy_from_user(kp->loadwhat, up->loadwhat, sizeof (up->loadwhat)) || | ||
508 | get_user(kp->datasize, &up->datasize) || | ||
509 | copy_from_user(kp->data, up->data, up->datasize)) | ||
510 | return -EFAULT; | ||
511 | return 0; | ||
512 | } | ||
513 | |||
493 | #define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32) | 514 | #define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32) |
494 | #define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32) | 515 | #define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32) |
495 | #define VIDIOCGWIN32 _IOR('v',9, struct video_window32) | 516 | #define VIDIOCGWIN32 _IOR('v',9, struct video_window32) |
@@ -498,6 +519,9 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user | |||
498 | #define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32) | 519 | #define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32) |
499 | #define VIDIOCGFREQ32 _IOR('v',14, u32) | 520 | #define VIDIOCGFREQ32 _IOR('v',14, u32) |
500 | #define VIDIOCSFREQ32 _IOW('v',15, u32) | 521 | #define VIDIOCSFREQ32 _IOW('v',15, u32) |
522 | #define VIDIOCSMICROCODE32 _IOW('v',27, struct video_code32) | ||
523 | |||
524 | #endif | ||
501 | 525 | ||
502 | /* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */ | 526 | /* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */ |
503 | #define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4) | 527 | #define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4) |
@@ -519,6 +543,7 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user | |||
519 | #define VIDIOC_S_INPUT32 _IOWR ('V', 39, compat_int_t) | 543 | #define VIDIOC_S_INPUT32 _IOWR ('V', 39, compat_int_t) |
520 | #define VIDIOC_TRY_FMT32 _IOWR ('V', 64, struct v4l2_format32) | 544 | #define VIDIOC_TRY_FMT32 _IOWR ('V', 64, struct v4l2_format32) |
521 | 545 | ||
546 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
522 | enum { | 547 | enum { |
523 | MaxClips = (~0U-sizeof(struct video_window))/sizeof(struct video_clip) | 548 | MaxClips = (~0U-sizeof(struct video_window))/sizeof(struct video_clip) |
524 | }; | 549 | }; |
@@ -583,13 +608,17 @@ static int do_set_window(struct file *file, unsigned int cmd, unsigned long arg) | |||
583 | 608 | ||
584 | return native_ioctl(file, VIDIOCSWIN, (unsigned long)vw); | 609 | return native_ioctl(file, VIDIOCSWIN, (unsigned long)vw); |
585 | } | 610 | } |
611 | #endif | ||
586 | 612 | ||
587 | static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | 613 | static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
588 | { | 614 | { |
589 | union { | 615 | union { |
616 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
590 | struct video_tuner vt; | 617 | struct video_tuner vt; |
591 | struct video_buffer vb; | 618 | struct video_buffer vb; |
592 | struct video_window vw; | 619 | struct video_window vw; |
620 | struct video_code vc; | ||
621 | #endif | ||
593 | struct v4l2_format v2f; | 622 | struct v4l2_format v2f; |
594 | struct v4l2_buffer v2b; | 623 | struct v4l2_buffer v2b; |
595 | struct v4l2_framebuffer v2fb; | 624 | struct v4l2_framebuffer v2fb; |
@@ -605,6 +634,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
605 | 634 | ||
606 | /* First, convert the command. */ | 635 | /* First, convert the command. */ |
607 | switch(cmd) { | 636 | switch(cmd) { |
637 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
608 | case VIDIOCGTUNER32: cmd = VIDIOCGTUNER; break; | 638 | case VIDIOCGTUNER32: cmd = VIDIOCGTUNER; break; |
609 | case VIDIOCSTUNER32: cmd = VIDIOCSTUNER; break; | 639 | case VIDIOCSTUNER32: cmd = VIDIOCSTUNER; break; |
610 | case VIDIOCGWIN32: cmd = VIDIOCGWIN; break; | 640 | case VIDIOCGWIN32: cmd = VIDIOCGWIN; break; |
@@ -612,6 +642,8 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
612 | case VIDIOCSFBUF32: cmd = VIDIOCSFBUF; break; | 642 | case VIDIOCSFBUF32: cmd = VIDIOCSFBUF; break; |
613 | case VIDIOCGFREQ32: cmd = VIDIOCGFREQ; break; | 643 | case VIDIOCGFREQ32: cmd = VIDIOCGFREQ; break; |
614 | case VIDIOCSFREQ32: cmd = VIDIOCSFREQ; break; | 644 | case VIDIOCSFREQ32: cmd = VIDIOCSFREQ; break; |
645 | case VIDIOCSMICROCODE32: cmd = VIDIOCSMICROCODE; break; | ||
646 | #endif | ||
615 | case VIDIOC_G_FMT32: cmd = VIDIOC_G_FMT; break; | 647 | case VIDIOC_G_FMT32: cmd = VIDIOC_G_FMT; break; |
616 | case VIDIOC_S_FMT32: cmd = VIDIOC_S_FMT; break; | 648 | case VIDIOC_S_FMT32: cmd = VIDIOC_S_FMT; break; |
617 | case VIDIOC_QUERYBUF32: cmd = VIDIOC_QUERYBUF; break; | 649 | case VIDIOC_QUERYBUF32: cmd = VIDIOC_QUERYBUF; break; |
@@ -631,6 +663,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
631 | }; | 663 | }; |
632 | 664 | ||
633 | switch(cmd) { | 665 | switch(cmd) { |
666 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
634 | case VIDIOCSTUNER: | 667 | case VIDIOCSTUNER: |
635 | case VIDIOCGTUNER: | 668 | case VIDIOCGTUNER: |
636 | err = get_video_tuner32(&karg.vt, up); | 669 | err = get_video_tuner32(&karg.vt, up); |
@@ -644,6 +677,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
644 | break; | 677 | break; |
645 | 678 | ||
646 | case VIDIOCSFREQ: | 679 | case VIDIOCSFREQ: |
680 | #endif | ||
647 | case VIDIOC_S_INPUT: | 681 | case VIDIOC_S_INPUT: |
648 | case VIDIOC_OVERLAY: | 682 | case VIDIOC_OVERLAY: |
649 | case VIDIOC_STREAMON: | 683 | case VIDIOC_STREAMON: |
@@ -697,14 +731,21 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
697 | compatible_arg = 0; | 731 | compatible_arg = 0; |
698 | break; | 732 | break; |
699 | 733 | ||
734 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
700 | case VIDIOCGWIN: | 735 | case VIDIOCGWIN: |
701 | case VIDIOCGFBUF: | 736 | case VIDIOCGFBUF: |
702 | case VIDIOCGFREQ: | 737 | case VIDIOCGFREQ: |
738 | #endif | ||
703 | case VIDIOC_G_FBUF: | 739 | case VIDIOC_G_FBUF: |
704 | case VIDIOC_G_INPUT: | 740 | case VIDIOC_G_INPUT: |
705 | compatible_arg = 0; | 741 | compatible_arg = 0; |
742 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
743 | case VIDIOCSMICROCODE: | ||
744 | err = microcode32(&karg.vc, up); | ||
745 | compatible_arg = 0; | ||
746 | break; | ||
747 | #endif | ||
706 | }; | 748 | }; |
707 | |||
708 | if(err) | 749 | if(err) |
709 | goto out; | 750 | goto out; |
710 | 751 | ||
@@ -719,6 +760,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
719 | } | 760 | } |
720 | if(err == 0) { | 761 | if(err == 0) { |
721 | switch(cmd) { | 762 | switch(cmd) { |
763 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
722 | case VIDIOCGTUNER: | 764 | case VIDIOCGTUNER: |
723 | err = put_video_tuner32(&karg.vt, up); | 765 | err = put_video_tuner32(&karg.vt, up); |
724 | break; | 766 | break; |
@@ -730,7 +772,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
730 | case VIDIOCGFBUF: | 772 | case VIDIOCGFBUF: |
731 | err = put_video_buffer32(&karg.vb, up); | 773 | err = put_video_buffer32(&karg.vb, up); |
732 | break; | 774 | break; |
733 | 775 | #endif | |
734 | case VIDIOC_G_FBUF: | 776 | case VIDIOC_G_FBUF: |
735 | err = put_v4l2_framebuffer32(&karg.v2fb, up); | 777 | err = put_v4l2_framebuffer32(&karg.v2fb, up); |
736 | break; | 778 | break; |
@@ -768,7 +810,9 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
768 | err = put_v4l2_input32(&karg.v2i, up); | 810 | err = put_v4l2_input32(&karg.v2i, up); |
769 | break; | 811 | break; |
770 | 812 | ||
813 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
771 | case VIDIOCGFREQ: | 814 | case VIDIOCGFREQ: |
815 | #endif | ||
772 | case VIDIOC_G_INPUT: | 816 | case VIDIOC_G_INPUT: |
773 | err = put_user(((u32)karg.vx), (u32 __user *)up); | 817 | err = put_user(((u32)karg.vx), (u32 __user *)up); |
774 | break; | 818 | break; |
@@ -786,6 +830,7 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) | |||
786 | return ret; | 830 | return ret; |
787 | 831 | ||
788 | switch (cmd) { | 832 | switch (cmd) { |
833 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
789 | case VIDIOCSWIN32: | 834 | case VIDIOCSWIN32: |
790 | ret = do_set_window(file, cmd, arg); | 835 | ret = do_set_window(file, cmd, arg); |
791 | break; | 836 | break; |
@@ -796,6 +841,7 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) | |||
796 | case VIDIOCSFBUF32: | 841 | case VIDIOCSFBUF32: |
797 | case VIDIOCGFREQ32: | 842 | case VIDIOCGFREQ32: |
798 | case VIDIOCSFREQ32: | 843 | case VIDIOCSFREQ32: |
844 | #endif | ||
799 | case VIDIOC_QUERYCAP: | 845 | case VIDIOC_QUERYCAP: |
800 | case VIDIOC_ENUM_FMT: | 846 | case VIDIOC_ENUM_FMT: |
801 | case VIDIOC_G_FMT32: | 847 | case VIDIOC_G_FMT32: |
@@ -827,6 +873,7 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) | |||
827 | ret = do_video_ioctl(file, cmd, arg); | 873 | ret = do_video_ioctl(file, cmd, arg); |
828 | break; | 874 | break; |
829 | 875 | ||
876 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
830 | /* Little v, the video4linux ioctls (conflict?) */ | 877 | /* Little v, the video4linux ioctls (conflict?) */ |
831 | case VIDIOCGCAP: | 878 | case VIDIOCGCAP: |
832 | case VIDIOCGCHAN: | 879 | case VIDIOCGCHAN: |
@@ -855,6 +902,7 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) | |||
855 | case _IOR('v' , BASE_VIDIOCPRIVATE+7, int): | 902 | case _IOR('v' , BASE_VIDIOCPRIVATE+7, int): |
856 | ret = native_ioctl(file, cmd, (unsigned long)compat_ptr(arg)); | 903 | ret = native_ioctl(file, cmd, (unsigned long)compat_ptr(arg)); |
857 | break; | 904 | break; |
905 | #endif | ||
858 | default: | 906 | default: |
859 | v4l_print_ioctl("compat_ioctl32", cmd); | 907 | v4l_print_ioctl("compat_ioctl32", cmd); |
860 | } | 908 | } |
diff --git a/drivers/media/video/cpia2/Kconfig b/drivers/media/video/cpia2/Kconfig index 513cc0927389..e39a96152004 100644 --- a/drivers/media/video/cpia2/Kconfig +++ b/drivers/media/video/cpia2/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config VIDEO_CPIA2 | 1 | config VIDEO_CPIA2 |
2 | tristate "CPiA2 Video For Linux" | 2 | tristate "CPiA2 Video For Linux" |
3 | depends on VIDEO_DEV && USB | 3 | depends on VIDEO_DEV && USB && VIDEO_V4L1 |
4 | ---help--- | 4 | ---help--- |
5 | This is the video4linux driver for cameras based on Vision's CPiA2 | 5 | This is the video4linux driver for cameras based on Vision's CPiA2 |
6 | (Colour Processor Interface ASIC), such as the Digital Blue QX5 | 6 | (Colour Processor Interface ASIC), such as the Digital Blue QX5 |
diff --git a/drivers/media/video/cx25840/cx25840-core.c b/drivers/media/video/cx25840/cx25840-core.c index 5c2036b40ea1..7bb7589a07c3 100644 --- a/drivers/media/video/cx25840/cx25840-core.c +++ b/drivers/media/video/cx25840/cx25840-core.c | |||
@@ -104,8 +104,8 @@ u32 cx25840_read4(struct i2c_client * client, u16 addr) | |||
104 | if (i2c_master_recv(client, buffer, 4) < 4) | 104 | if (i2c_master_recv(client, buffer, 4) < 4) |
105 | return 0; | 105 | return 0; |
106 | 106 | ||
107 | return (buffer[0] << 24) | (buffer[1] << 16) | | 107 | return (buffer[3] << 24) | (buffer[2] << 16) | |
108 | (buffer[2] << 8) | buffer[3]; | 108 | (buffer[1] << 8) | buffer[0]; |
109 | } | 109 | } |
110 | 110 | ||
111 | int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned and_mask, | 111 | int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned and_mask, |
diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c index 72b630a91f41..c25564648993 100644 --- a/drivers/media/video/cx88/cx88-input.c +++ b/drivers/media/video/cx88/cx88-input.c | |||
@@ -89,7 +89,7 @@ static void cx88_ir_handle_key(struct cx88_IR *ir) | |||
89 | 89 | ||
90 | auxgpio = cx_read(MO_GP1_IO); | 90 | auxgpio = cx_read(MO_GP1_IO); |
91 | /* Take out the parity part */ | 91 | /* Take out the parity part */ |
92 | gpio+=(gpio & 0x7fd) + (auxgpio & 0xef); | 92 | gpio=(gpio & 0x7fd) + (auxgpio & 0xef); |
93 | } else | 93 | } else |
94 | auxgpio = gpio; | 94 | auxgpio = gpio; |
95 | 95 | ||
diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c index 2225d4b94140..94c92bacc342 100644 --- a/drivers/media/video/cx88/cx88-video.c +++ b/drivers/media/video/cx88/cx88-video.c | |||
@@ -1180,7 +1180,6 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
1180 | V4L2_CAP_READWRITE | | 1180 | V4L2_CAP_READWRITE | |
1181 | V4L2_CAP_STREAMING | | 1181 | V4L2_CAP_STREAMING | |
1182 | V4L2_CAP_VBI_CAPTURE | | 1182 | V4L2_CAP_VBI_CAPTURE | |
1183 | V4L2_CAP_VIDEO_OVERLAY | | ||
1184 | 0; | 1183 | 0; |
1185 | if (UNSET != core->tuner_type) | 1184 | if (UNSET != core->tuner_type) |
1186 | cap->capabilities |= V4L2_CAP_TUNER; | 1185 | cap->capabilities |= V4L2_CAP_TUNER; |
@@ -1226,7 +1225,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
1226 | struct v4l2_format *f = arg; | 1225 | struct v4l2_format *f = arg; |
1227 | return cx8800_try_fmt(dev,fh,f); | 1226 | return cx8800_try_fmt(dev,fh,f); |
1228 | } | 1227 | } |
1229 | #ifdef HAVE_V4L1 | 1228 | #ifdef CONFIG_VIDEO_V4L1_COMPAT |
1230 | /* --- streaming capture ------------------------------------- */ | 1229 | /* --- streaming capture ------------------------------------- */ |
1231 | case VIDIOCGMBUF: | 1230 | case VIDIOCGMBUF: |
1232 | { | 1231 | { |
@@ -1585,7 +1584,7 @@ static int radio_do_ioctl(struct inode *inode, struct file *file, | |||
1585 | *id = 0; | 1584 | *id = 0; |
1586 | return 0; | 1585 | return 0; |
1587 | } | 1586 | } |
1588 | #ifdef HAVE_V4L1 | 1587 | #ifdef CONFIG_VIDEO_V4L1_COMPAT |
1589 | case VIDIOCSTUNER: | 1588 | case VIDIOCSTUNER: |
1590 | { | 1589 | { |
1591 | struct video_tuner *v = arg; | 1590 | struct video_tuner *v = arg; |
diff --git a/drivers/media/video/msp3400-driver.c b/drivers/media/video/msp3400-driver.c index dbb75a7db199..56246b8578f3 100644 --- a/drivers/media/video/msp3400-driver.c +++ b/drivers/media/video/msp3400-driver.c | |||
@@ -362,7 +362,7 @@ int msp_sleep(struct msp_state *state, int timeout) | |||
362 | } | 362 | } |
363 | 363 | ||
364 | /* ------------------------------------------------------------------------ */ | 364 | /* ------------------------------------------------------------------------ */ |
365 | 365 | #ifdef CONFIG_VIDEO_V4L1 | |
366 | static int msp_mode_v4l2_to_v4l1(int rxsubchans, int audmode) | 366 | static int msp_mode_v4l2_to_v4l1(int rxsubchans, int audmode) |
367 | { | 367 | { |
368 | if (rxsubchans == V4L2_TUNER_SUB_MONO) | 368 | if (rxsubchans == V4L2_TUNER_SUB_MONO) |
@@ -384,6 +384,7 @@ static int msp_mode_v4l1_to_v4l2(int mode) | |||
384 | return V4L2_TUNER_MODE_LANG1; | 384 | return V4L2_TUNER_MODE_LANG1; |
385 | return V4L2_TUNER_MODE_MONO; | 385 | return V4L2_TUNER_MODE_MONO; |
386 | } | 386 | } |
387 | #endif | ||
387 | 388 | ||
388 | static int msp_get_ctrl(struct i2c_client *client, struct v4l2_control *ctrl) | 389 | static int msp_get_ctrl(struct i2c_client *client, struct v4l2_control *ctrl) |
389 | { | 390 | { |
@@ -509,6 +510,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
509 | /* --- v4l ioctls --- */ | 510 | /* --- v4l ioctls --- */ |
510 | /* take care: bttv does userspace copying, we'll get a | 511 | /* take care: bttv does userspace copying, we'll get a |
511 | kernel pointer here... */ | 512 | kernel pointer here... */ |
513 | #ifdef CONFIG_VIDEO_V4L1 | ||
512 | case VIDIOCGAUDIO: | 514 | case VIDIOCGAUDIO: |
513 | { | 515 | { |
514 | struct video_audio *va = arg; | 516 | struct video_audio *va = arg; |
@@ -577,6 +579,12 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
577 | } | 579 | } |
578 | 580 | ||
579 | case VIDIOCSFREQ: | 581 | case VIDIOCSFREQ: |
582 | { | ||
583 | /* new channel -- kick audio carrier scan */ | ||
584 | msp_wake_thread(client); | ||
585 | break; | ||
586 | } | ||
587 | #endif | ||
580 | case VIDIOC_S_FREQUENCY: | 588 | case VIDIOC_S_FREQUENCY: |
581 | { | 589 | { |
582 | /* new channel -- kick audio carrier scan */ | 590 | /* new channel -- kick audio carrier scan */ |
diff --git a/drivers/media/video/msp3400-kthreads.c b/drivers/media/video/msp3400-kthreads.c index f2fd9195b3ac..ed02ff811388 100644 --- a/drivers/media/video/msp3400-kthreads.c +++ b/drivers/media/video/msp3400-kthreads.c | |||
@@ -961,10 +961,10 @@ int msp34xxg_thread(void *data) | |||
961 | /* setup the chip*/ | 961 | /* setup the chip*/ |
962 | msp34xxg_reset(client); | 962 | msp34xxg_reset(client); |
963 | state->std = state->radio ? 0x40 : msp_standard; | 963 | state->std = state->radio ? 0x40 : msp_standard; |
964 | if (state->std != 1) | ||
965 | goto unmute; | ||
966 | /* start autodetect */ | 964 | /* start autodetect */ |
967 | msp_write_dem(client, 0x20, state->std); | 965 | msp_write_dem(client, 0x20, state->std); |
966 | if (state->std != 1) | ||
967 | goto unmute; | ||
968 | 968 | ||
969 | /* watch autodetect */ | 969 | /* watch autodetect */ |
970 | v4l_dbg(1, msp_debug, client, "started autodetect, waiting for result\n"); | 970 | v4l_dbg(1, msp_debug, client, "started autodetect, waiting for result\n"); |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c index 9b48abcf6089..be1e5cc78081 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c | |||
@@ -852,7 +852,6 @@ unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw) | |||
852 | return hdw->serial_number; | 852 | return hdw->serial_number; |
853 | } | 853 | } |
854 | 854 | ||
855 | |||
856 | int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw) | 855 | int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw) |
857 | { | 856 | { |
858 | return hdw->unit_number; | 857 | return hdw->unit_number; |
@@ -2318,7 +2317,6 @@ void pvr2_hdw_poll_trigger_unlocked(struct pvr2_hdw *hdw) | |||
2318 | } | 2317 | } |
2319 | } | 2318 | } |
2320 | 2319 | ||
2321 | |||
2322 | /* Return name for this driver instance */ | 2320 | /* Return name for this driver instance */ |
2323 | const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw) | 2321 | const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw) |
2324 | { | 2322 | { |
@@ -2542,6 +2540,10 @@ static void pvr2_ctl_timeout(unsigned long data) | |||
2542 | } | 2540 | } |
2543 | 2541 | ||
2544 | 2542 | ||
2543 | /* Issue a command and get a response from the device. This extended | ||
2544 | version includes a probe flag (which if set means that device errors | ||
2545 | should not be logged or treated as fatal) and a timeout in jiffies. | ||
2546 | This can be used to non-lethally probe the health of endpoint 1. */ | ||
2545 | static int pvr2_send_request_ex(struct pvr2_hdw *hdw, | 2547 | static int pvr2_send_request_ex(struct pvr2_hdw *hdw, |
2546 | unsigned int timeout,int probe_fl, | 2548 | unsigned int timeout,int probe_fl, |
2547 | void *write_data,unsigned int write_len, | 2549 | void *write_data,unsigned int write_len, |
@@ -2970,6 +2972,7 @@ int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw) | |||
2970 | } | 2972 | } |
2971 | 2973 | ||
2972 | 2974 | ||
2975 | /* Stop / start video stream transport */ | ||
2973 | static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl) | 2976 | static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl) |
2974 | { | 2977 | { |
2975 | int status; | 2978 | int status; |
@@ -3068,6 +3071,7 @@ int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val) | |||
3068 | } | 3071 | } |
3069 | 3072 | ||
3070 | 3073 | ||
3074 | /* Find I2C address of eeprom */ | ||
3071 | static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw) | 3075 | static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw) |
3072 | { | 3076 | { |
3073 | int result; | 3077 | int result; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-io.c b/drivers/media/video/pvrusb2/pvrusb2-io.c index 681f79c8064e..1e393762546c 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-io.c +++ b/drivers/media/video/pvrusb2/pvrusb2-io.c | |||
@@ -26,6 +26,8 @@ | |||
26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
27 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
28 | 28 | ||
29 | static const char *pvr2_buffer_state_decode(enum pvr2_buffer_state); | ||
30 | |||
29 | #define BUFFER_SIG 0x47653271 | 31 | #define BUFFER_SIG 0x47653271 |
30 | 32 | ||
31 | // #define SANITY_CHECK_BUFFERS | 33 | // #define SANITY_CHECK_BUFFERS |
@@ -515,6 +517,10 @@ void pvr2_stream_set_callback(struct pvr2_stream *sp, | |||
515 | } | 517 | } |
516 | 518 | ||
517 | /* Query / set the nominal buffer count */ | 519 | /* Query / set the nominal buffer count */ |
520 | int pvr2_stream_get_buffer_count(struct pvr2_stream *sp) | ||
521 | { | ||
522 | return sp->buffer_target_count; | ||
523 | } | ||
518 | 524 | ||
519 | int pvr2_stream_set_buffer_count(struct pvr2_stream *sp,unsigned int cnt) | 525 | int pvr2_stream_set_buffer_count(struct pvr2_stream *sp,unsigned int cnt) |
520 | { | 526 | { |
@@ -553,7 +559,6 @@ int pvr2_stream_get_ready_count(struct pvr2_stream *sp) | |||
553 | return sp->r_count; | 559 | return sp->r_count; |
554 | } | 560 | } |
555 | 561 | ||
556 | |||
557 | void pvr2_stream_kill(struct pvr2_stream *sp) | 562 | void pvr2_stream_kill(struct pvr2_stream *sp) |
558 | { | 563 | { |
559 | struct pvr2_buffer *bp; | 564 | struct pvr2_buffer *bp; |
@@ -607,7 +612,6 @@ int pvr2_buffer_queue(struct pvr2_buffer *bp) | |||
607 | return ret; | 612 | return ret; |
608 | } | 613 | } |
609 | 614 | ||
610 | |||
611 | int pvr2_buffer_set_buffer(struct pvr2_buffer *bp,void *ptr,unsigned int cnt) | 615 | int pvr2_buffer_set_buffer(struct pvr2_buffer *bp,void *ptr,unsigned int cnt) |
612 | { | 616 | { |
613 | int ret = 0; | 617 | int ret = 0; |
@@ -646,7 +650,6 @@ int pvr2_buffer_get_status(struct pvr2_buffer *bp) | |||
646 | return bp->status; | 650 | return bp->status; |
647 | } | 651 | } |
648 | 652 | ||
649 | |||
650 | int pvr2_buffer_get_id(struct pvr2_buffer *bp) | 653 | int pvr2_buffer_get_id(struct pvr2_buffer *bp) |
651 | { | 654 | { |
652 | return bp->id; | 655 | return bp->id; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-io.h b/drivers/media/video/pvrusb2/pvrusb2-io.h index 96285ad234a6..93279cc2a35e 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-io.h +++ b/drivers/media/video/pvrusb2/pvrusb2-io.h | |||
@@ -47,6 +47,7 @@ void pvr2_stream_set_callback(struct pvr2_stream *, | |||
47 | void *data); | 47 | void *data); |
48 | 48 | ||
49 | /* Query / set the nominal buffer count */ | 49 | /* Query / set the nominal buffer count */ |
50 | int pvr2_stream_get_buffer_count(struct pvr2_stream *); | ||
50 | int pvr2_stream_set_buffer_count(struct pvr2_stream *,unsigned int); | 51 | int pvr2_stream_set_buffer_count(struct pvr2_stream *,unsigned int); |
51 | 52 | ||
52 | /* Get a pointer to a buffer that is either idle, ready, or is specified | 53 | /* Get a pointer to a buffer that is either idle, ready, or is specified |
@@ -58,6 +59,7 @@ struct pvr2_buffer *pvr2_stream_get_buffer(struct pvr2_stream *sp,int id); | |||
58 | /* Find out how many buffers are idle or ready */ | 59 | /* Find out how many buffers are idle or ready */ |
59 | int pvr2_stream_get_ready_count(struct pvr2_stream *); | 60 | int pvr2_stream_get_ready_count(struct pvr2_stream *); |
60 | 61 | ||
62 | |||
61 | /* Kill all pending buffers and throw away any ready buffers as well */ | 63 | /* Kill all pending buffers and throw away any ready buffers as well */ |
62 | void pvr2_stream_kill(struct pvr2_stream *); | 64 | void pvr2_stream_kill(struct pvr2_stream *); |
63 | 65 | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-ioread.c b/drivers/media/video/pvrusb2/pvrusb2-ioread.c index f7a2e225a002..b71f9a961f8a 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-ioread.c +++ b/drivers/media/video/pvrusb2/pvrusb2-ioread.c | |||
@@ -213,7 +213,9 @@ int pvr2_ioread_setup(struct pvr2_ioread *cp,struct pvr2_stream *sp) | |||
213 | " pvr2_ioread_setup (tear-down) id=%p",cp); | 213 | " pvr2_ioread_setup (tear-down) id=%p",cp); |
214 | pvr2_ioread_stop(cp); | 214 | pvr2_ioread_stop(cp); |
215 | pvr2_stream_kill(cp->stream); | 215 | pvr2_stream_kill(cp->stream); |
216 | pvr2_stream_set_buffer_count(cp->stream,0); | 216 | if (pvr2_stream_get_buffer_count(cp->stream)) { |
217 | pvr2_stream_set_buffer_count(cp->stream,0); | ||
218 | } | ||
217 | cp->stream = NULL; | 219 | cp->stream = NULL; |
218 | } | 220 | } |
219 | if (sp) { | 221 | if (sp) { |
@@ -251,7 +253,6 @@ int pvr2_ioread_set_enabled(struct pvr2_ioread *cp,int fl) | |||
251 | return ret; | 253 | return ret; |
252 | } | 254 | } |
253 | 255 | ||
254 | |||
255 | static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp) | 256 | static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp) |
256 | { | 257 | { |
257 | int stat; | 258 | int stat; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-sysfs.c b/drivers/media/video/pvrusb2/pvrusb2-sysfs.c index 6af55a8b6f05..d1dda5caf406 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-sysfs.c +++ b/drivers/media/video/pvrusb2/pvrusb2-sysfs.c | |||
@@ -44,12 +44,16 @@ struct pvr2_sysfs { | |||
44 | struct kobj_type ktype; | 44 | struct kobj_type ktype; |
45 | struct class_device_attribute attr_v4l_minor_number; | 45 | struct class_device_attribute attr_v4l_minor_number; |
46 | struct class_device_attribute attr_unit_number; | 46 | struct class_device_attribute attr_unit_number; |
47 | int v4l_minor_number_created_ok; | ||
48 | int unit_number_created_ok; | ||
47 | }; | 49 | }; |
48 | 50 | ||
49 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC | 51 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC |
50 | struct pvr2_sysfs_debugifc { | 52 | struct pvr2_sysfs_debugifc { |
51 | struct class_device_attribute attr_debugcmd; | 53 | struct class_device_attribute attr_debugcmd; |
52 | struct class_device_attribute attr_debuginfo; | 54 | struct class_device_attribute attr_debuginfo; |
55 | int debugcmd_created_ok; | ||
56 | int debuginfo_created_ok; | ||
53 | }; | 57 | }; |
54 | #endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */ | 58 | #endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */ |
55 | 59 | ||
@@ -67,6 +71,7 @@ struct pvr2_sysfs_ctl_item { | |||
67 | struct pvr2_sysfs_ctl_item *item_next; | 71 | struct pvr2_sysfs_ctl_item *item_next; |
68 | struct attribute *attr_gen[7]; | 72 | struct attribute *attr_gen[7]; |
69 | struct attribute_group grp; | 73 | struct attribute_group grp; |
74 | int created_ok; | ||
70 | char name[80]; | 75 | char name[80]; |
71 | }; | 76 | }; |
72 | 77 | ||
@@ -487,6 +492,7 @@ static void pvr2_sysfs_add_control(struct pvr2_sysfs *sfp,int ctl_id) | |||
487 | struct pvr2_sysfs_func_set *fp; | 492 | struct pvr2_sysfs_func_set *fp; |
488 | struct pvr2_ctrl *cptr; | 493 | struct pvr2_ctrl *cptr; |
489 | unsigned int cnt,acnt; | 494 | unsigned int cnt,acnt; |
495 | int ret; | ||
490 | 496 | ||
491 | if ((ctl_id < 0) || (ctl_id >= (sizeof(funcs)/sizeof(funcs[0])))) { | 497 | if ((ctl_id < 0) || (ctl_id >= (sizeof(funcs)/sizeof(funcs[0])))) { |
492 | return; | 498 | return; |
@@ -589,7 +595,13 @@ static void pvr2_sysfs_add_control(struct pvr2_sysfs *sfp,int ctl_id) | |||
589 | cip->grp.name = cip->name; | 595 | cip->grp.name = cip->name; |
590 | cip->grp.attrs = cip->attr_gen; | 596 | cip->grp.attrs = cip->attr_gen; |
591 | 597 | ||
592 | sysfs_create_group(&sfp->class_dev->kobj,&cip->grp); | 598 | ret = sysfs_create_group(&sfp->class_dev->kobj,&cip->grp); |
599 | if (ret) { | ||
600 | printk(KERN_WARNING "%s: sysfs_create_group error: %d\n", | ||
601 | __FUNCTION__, ret); | ||
602 | return; | ||
603 | } | ||
604 | cip->created_ok = !0; | ||
593 | } | 605 | } |
594 | 606 | ||
595 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC | 607 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC |
@@ -600,6 +612,8 @@ static ssize_t debugcmd_store(struct class_device *,const char *,size_t count); | |||
600 | static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp) | 612 | static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp) |
601 | { | 613 | { |
602 | struct pvr2_sysfs_debugifc *dip; | 614 | struct pvr2_sysfs_debugifc *dip; |
615 | int ret; | ||
616 | |||
603 | dip = kmalloc(sizeof(*dip),GFP_KERNEL); | 617 | dip = kmalloc(sizeof(*dip),GFP_KERNEL); |
604 | if (!dip) return; | 618 | if (!dip) return; |
605 | memset(dip,0,sizeof(*dip)); | 619 | memset(dip,0,sizeof(*dip)); |
@@ -613,17 +627,34 @@ static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp) | |||
613 | dip->attr_debuginfo.attr.mode = S_IRUGO; | 627 | dip->attr_debuginfo.attr.mode = S_IRUGO; |
614 | dip->attr_debuginfo.show = debuginfo_show; | 628 | dip->attr_debuginfo.show = debuginfo_show; |
615 | sfp->debugifc = dip; | 629 | sfp->debugifc = dip; |
616 | class_device_create_file(sfp->class_dev,&dip->attr_debugcmd); | 630 | ret = class_device_create_file(sfp->class_dev,&dip->attr_debugcmd); |
617 | class_device_create_file(sfp->class_dev,&dip->attr_debuginfo); | 631 | if (ret < 0) { |
632 | printk(KERN_WARNING "%s: class_device_create_file error: %d\n", | ||
633 | __FUNCTION__, ret); | ||
634 | } else { | ||
635 | dip->debugcmd_created_ok = !0; | ||
636 | } | ||
637 | ret = class_device_create_file(sfp->class_dev,&dip->attr_debuginfo); | ||
638 | if (ret < 0) { | ||
639 | printk(KERN_WARNING "%s: class_device_create_file error: %d\n", | ||
640 | __FUNCTION__, ret); | ||
641 | } else { | ||
642 | dip->debuginfo_created_ok = !0; | ||
643 | } | ||
618 | } | 644 | } |
619 | 645 | ||
620 | 646 | ||
621 | static void pvr2_sysfs_tear_down_debugifc(struct pvr2_sysfs *sfp) | 647 | static void pvr2_sysfs_tear_down_debugifc(struct pvr2_sysfs *sfp) |
622 | { | 648 | { |
623 | if (!sfp->debugifc) return; | 649 | if (!sfp->debugifc) return; |
624 | class_device_remove_file(sfp->class_dev, | 650 | if (sfp->debugifc->debuginfo_created_ok) { |
625 | &sfp->debugifc->attr_debuginfo); | 651 | class_device_remove_file(sfp->class_dev, |
626 | class_device_remove_file(sfp->class_dev,&sfp->debugifc->attr_debugcmd); | 652 | &sfp->debugifc->attr_debuginfo); |
653 | } | ||
654 | if (sfp->debugifc->debugcmd_created_ok) { | ||
655 | class_device_remove_file(sfp->class_dev, | ||
656 | &sfp->debugifc->attr_debugcmd); | ||
657 | } | ||
627 | kfree(sfp->debugifc); | 658 | kfree(sfp->debugifc); |
628 | sfp->debugifc = NULL; | 659 | sfp->debugifc = NULL; |
629 | } | 660 | } |
@@ -645,7 +676,9 @@ static void pvr2_sysfs_tear_down_controls(struct pvr2_sysfs *sfp) | |||
645 | struct pvr2_sysfs_ctl_item *cip1,*cip2; | 676 | struct pvr2_sysfs_ctl_item *cip1,*cip2; |
646 | for (cip1 = sfp->item_first; cip1; cip1 = cip2) { | 677 | for (cip1 = sfp->item_first; cip1; cip1 = cip2) { |
647 | cip2 = cip1->item_next; | 678 | cip2 = cip1->item_next; |
648 | sysfs_remove_group(&sfp->class_dev->kobj,&cip1->grp); | 679 | if (cip1->created_ok) { |
680 | sysfs_remove_group(&sfp->class_dev->kobj,&cip1->grp); | ||
681 | } | ||
649 | pvr2_sysfs_trace("Destroying pvr2_sysfs_ctl_item id=%p",cip1); | 682 | pvr2_sysfs_trace("Destroying pvr2_sysfs_ctl_item id=%p",cip1); |
650 | kfree(cip1); | 683 | kfree(cip1); |
651 | } | 684 | } |
@@ -675,8 +708,14 @@ static void class_dev_destroy(struct pvr2_sysfs *sfp) | |||
675 | pvr2_sysfs_tear_down_debugifc(sfp); | 708 | pvr2_sysfs_tear_down_debugifc(sfp); |
676 | #endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */ | 709 | #endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */ |
677 | pvr2_sysfs_tear_down_controls(sfp); | 710 | pvr2_sysfs_tear_down_controls(sfp); |
678 | class_device_remove_file(sfp->class_dev,&sfp->attr_v4l_minor_number); | 711 | if (sfp->v4l_minor_number_created_ok) { |
679 | class_device_remove_file(sfp->class_dev,&sfp->attr_unit_number); | 712 | class_device_remove_file(sfp->class_dev, |
713 | &sfp->attr_v4l_minor_number); | ||
714 | } | ||
715 | if (sfp->unit_number_created_ok) { | ||
716 | class_device_remove_file(sfp->class_dev, | ||
717 | &sfp->attr_unit_number); | ||
718 | } | ||
680 | pvr2_sysfs_trace("Destroying class_dev id=%p",sfp->class_dev); | 719 | pvr2_sysfs_trace("Destroying class_dev id=%p",sfp->class_dev); |
681 | sfp->class_dev->class_data = NULL; | 720 | sfp->class_dev->class_data = NULL; |
682 | class_device_unregister(sfp->class_dev); | 721 | class_device_unregister(sfp->class_dev); |
@@ -709,6 +748,8 @@ static void class_dev_create(struct pvr2_sysfs *sfp, | |||
709 | { | 748 | { |
710 | struct usb_device *usb_dev; | 749 | struct usb_device *usb_dev; |
711 | struct class_device *class_dev; | 750 | struct class_device *class_dev; |
751 | int ret; | ||
752 | |||
712 | usb_dev = pvr2_hdw_get_dev(sfp->channel.hdw); | 753 | usb_dev = pvr2_hdw_get_dev(sfp->channel.hdw); |
713 | if (!usb_dev) return; | 754 | if (!usb_dev) return; |
714 | class_dev = kmalloc(sizeof(*class_dev),GFP_KERNEL); | 755 | class_dev = kmalloc(sizeof(*class_dev),GFP_KERNEL); |
@@ -733,20 +774,40 @@ static void class_dev_create(struct pvr2_sysfs *sfp, | |||
733 | 774 | ||
734 | sfp->class_dev = class_dev; | 775 | sfp->class_dev = class_dev; |
735 | class_dev->class_data = sfp; | 776 | class_dev->class_data = sfp; |
736 | class_device_register(class_dev); | 777 | ret = class_device_register(class_dev); |
778 | if (ret) { | ||
779 | printk(KERN_ERR "%s: class_device_register failed\n", | ||
780 | __FUNCTION__); | ||
781 | kfree(class_dev); | ||
782 | return; | ||
783 | } | ||
737 | 784 | ||
738 | sfp->attr_v4l_minor_number.attr.owner = THIS_MODULE; | 785 | sfp->attr_v4l_minor_number.attr.owner = THIS_MODULE; |
739 | sfp->attr_v4l_minor_number.attr.name = "v4l_minor_number"; | 786 | sfp->attr_v4l_minor_number.attr.name = "v4l_minor_number"; |
740 | sfp->attr_v4l_minor_number.attr.mode = S_IRUGO; | 787 | sfp->attr_v4l_minor_number.attr.mode = S_IRUGO; |
741 | sfp->attr_v4l_minor_number.show = v4l_minor_number_show; | 788 | sfp->attr_v4l_minor_number.show = v4l_minor_number_show; |
742 | sfp->attr_v4l_minor_number.store = NULL; | 789 | sfp->attr_v4l_minor_number.store = NULL; |
743 | class_device_create_file(sfp->class_dev,&sfp->attr_v4l_minor_number); | 790 | ret = class_device_create_file(sfp->class_dev, |
791 | &sfp->attr_v4l_minor_number); | ||
792 | if (ret < 0) { | ||
793 | printk(KERN_WARNING "%s: class_device_create_file error: %d\n", | ||
794 | __FUNCTION__, ret); | ||
795 | } else { | ||
796 | sfp->v4l_minor_number_created_ok = !0; | ||
797 | } | ||
798 | |||
744 | sfp->attr_unit_number.attr.owner = THIS_MODULE; | 799 | sfp->attr_unit_number.attr.owner = THIS_MODULE; |
745 | sfp->attr_unit_number.attr.name = "unit_number"; | 800 | sfp->attr_unit_number.attr.name = "unit_number"; |
746 | sfp->attr_unit_number.attr.mode = S_IRUGO; | 801 | sfp->attr_unit_number.attr.mode = S_IRUGO; |
747 | sfp->attr_unit_number.show = unit_number_show; | 802 | sfp->attr_unit_number.show = unit_number_show; |
748 | sfp->attr_unit_number.store = NULL; | 803 | sfp->attr_unit_number.store = NULL; |
749 | class_device_create_file(sfp->class_dev,&sfp->attr_unit_number); | 804 | ret = class_device_create_file(sfp->class_dev,&sfp->attr_unit_number); |
805 | if (ret < 0) { | ||
806 | printk(KERN_WARNING "%s: class_device_create_file error: %d\n", | ||
807 | __FUNCTION__, ret); | ||
808 | } else { | ||
809 | sfp->unit_number_created_ok = !0; | ||
810 | } | ||
750 | 811 | ||
751 | pvr2_sysfs_add_controls(sfp); | 812 | pvr2_sysfs_add_controls(sfp); |
752 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC | 813 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC |
diff --git a/drivers/media/video/pwc/Kconfig b/drivers/media/video/pwc/Kconfig index 697145e0bf15..8fdf7101d3bf 100644 --- a/drivers/media/video/pwc/Kconfig +++ b/drivers/media/video/pwc/Kconfig | |||
@@ -30,7 +30,7 @@ config USB_PWC | |||
30 | 30 | ||
31 | config USB_PWC_DEBUG | 31 | config USB_PWC_DEBUG |
32 | bool "USB Philips Cameras verbose debug" | 32 | bool "USB Philips Cameras verbose debug" |
33 | depends USB_PWC | 33 | depends on USB_PWC |
34 | help | 34 | help |
35 | Say Y here in order to have the pwc driver generate verbose debugging | 35 | Say Y here in order to have the pwc driver generate verbose debugging |
36 | messages. | 36 | messages. |
diff --git a/drivers/media/video/pwc/pwc-if.c b/drivers/media/video/pwc/pwc-if.c index 47d0d83a0264..d4703944df9c 100644 --- a/drivers/media/video/pwc/pwc-if.c +++ b/drivers/media/video/pwc/pwc-if.c | |||
@@ -160,6 +160,7 @@ static struct file_operations pwc_fops = { | |||
160 | .poll = pwc_video_poll, | 160 | .poll = pwc_video_poll, |
161 | .mmap = pwc_video_mmap, | 161 | .mmap = pwc_video_mmap, |
162 | .ioctl = pwc_video_ioctl, | 162 | .ioctl = pwc_video_ioctl, |
163 | .compat_ioctl = v4l_compat_ioctl32, | ||
163 | .llseek = no_llseek, | 164 | .llseek = no_llseek, |
164 | }; | 165 | }; |
165 | static struct video_device pwc_template = { | 166 | static struct video_device pwc_template = { |
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c index f1fd69e7f119..d73cff1970ae 100644 --- a/drivers/media/video/saa7134/saa7134-alsa.c +++ b/drivers/media/video/saa7134/saa7134-alsa.c | |||
@@ -997,9 +997,9 @@ static int saa7134_alsa_init(void) | |||
997 | struct saa7134_dev *dev = NULL; | 997 | struct saa7134_dev *dev = NULL; |
998 | struct list_head *list; | 998 | struct list_head *list; |
999 | 999 | ||
1000 | if (!dmasound_init && !dmasound_exit) { | 1000 | if (!saa7134_dmasound_init && !saa7134_dmasound_exit) { |
1001 | dmasound_init = alsa_device_init; | 1001 | saa7134_dmasound_init = alsa_device_init; |
1002 | dmasound_exit = alsa_device_exit; | 1002 | saa7134_dmasound_exit = alsa_device_exit; |
1003 | } else { | 1003 | } else { |
1004 | printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n"); | 1004 | printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n"); |
1005 | return -EBUSY; | 1005 | return -EBUSY; |
@@ -1036,8 +1036,8 @@ static void saa7134_alsa_exit(void) | |||
1036 | snd_card_free(snd_saa7134_cards[idx]); | 1036 | snd_card_free(snd_saa7134_cards[idx]); |
1037 | } | 1037 | } |
1038 | 1038 | ||
1039 | dmasound_init = NULL; | 1039 | saa7134_dmasound_init = NULL; |
1040 | dmasound_exit = NULL; | 1040 | saa7134_dmasound_exit = NULL; |
1041 | printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n"); | 1041 | printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n"); |
1042 | 1042 | ||
1043 | return; | 1043 | return; |
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c index 6e97cc84ba89..be3a81fc90a2 100644 --- a/drivers/media/video/saa7134/saa7134-core.c +++ b/drivers/media/video/saa7134/saa7134-core.c | |||
@@ -95,8 +95,8 @@ LIST_HEAD(saa7134_devlist); | |||
95 | static LIST_HEAD(mops_list); | 95 | static LIST_HEAD(mops_list); |
96 | static unsigned int saa7134_devcount; | 96 | static unsigned int saa7134_devcount; |
97 | 97 | ||
98 | int (*dmasound_init)(struct saa7134_dev *dev); | 98 | int (*saa7134_dmasound_init)(struct saa7134_dev *dev); |
99 | int (*dmasound_exit)(struct saa7134_dev *dev); | 99 | int (*saa7134_dmasound_exit)(struct saa7134_dev *dev); |
100 | 100 | ||
101 | #define dprintk(fmt, arg...) if (core_debug) \ | 101 | #define dprintk(fmt, arg...) if (core_debug) \ |
102 | printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg) | 102 | printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg) |
@@ -1008,8 +1008,8 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
1008 | /* check for signal */ | 1008 | /* check for signal */ |
1009 | saa7134_irq_video_intl(dev); | 1009 | saa7134_irq_video_intl(dev); |
1010 | 1010 | ||
1011 | if (dmasound_init && !dev->dmasound.priv_data) { | 1011 | if (saa7134_dmasound_init && !dev->dmasound.priv_data) { |
1012 | dmasound_init(dev); | 1012 | saa7134_dmasound_init(dev); |
1013 | } | 1013 | } |
1014 | 1014 | ||
1015 | return 0; | 1015 | return 0; |
@@ -1036,8 +1036,8 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev) | |||
1036 | struct saa7134_mpeg_ops *mops; | 1036 | struct saa7134_mpeg_ops *mops; |
1037 | 1037 | ||
1038 | /* Release DMA sound modules if present */ | 1038 | /* Release DMA sound modules if present */ |
1039 | if (dmasound_exit && dev->dmasound.priv_data) { | 1039 | if (saa7134_dmasound_exit && dev->dmasound.priv_data) { |
1040 | dmasound_exit(dev); | 1040 | saa7134_dmasound_exit(dev); |
1041 | } | 1041 | } |
1042 | 1042 | ||
1043 | /* debugging ... */ | 1043 | /* debugging ... */ |
@@ -1169,8 +1169,8 @@ EXPORT_SYMBOL(saa7134_boards); | |||
1169 | 1169 | ||
1170 | /* ----------------- for the DMA sound modules --------------- */ | 1170 | /* ----------------- for the DMA sound modules --------------- */ |
1171 | 1171 | ||
1172 | EXPORT_SYMBOL(dmasound_init); | 1172 | EXPORT_SYMBOL(saa7134_dmasound_init); |
1173 | EXPORT_SYMBOL(dmasound_exit); | 1173 | EXPORT_SYMBOL(saa7134_dmasound_exit); |
1174 | EXPORT_SYMBOL(saa7134_pgtable_free); | 1174 | EXPORT_SYMBOL(saa7134_pgtable_free); |
1175 | EXPORT_SYMBOL(saa7134_pgtable_build); | 1175 | EXPORT_SYMBOL(saa7134_pgtable_build); |
1176 | EXPORT_SYMBOL(saa7134_pgtable_alloc); | 1176 | EXPORT_SYMBOL(saa7134_pgtable_alloc); |
diff --git a/drivers/media/video/saa7134/saa7134-oss.c b/drivers/media/video/saa7134/saa7134-oss.c index 3895d05804ae..2e3ba5f31453 100644 --- a/drivers/media/video/saa7134/saa7134-oss.c +++ b/drivers/media/video/saa7134/saa7134-oss.c | |||
@@ -993,9 +993,9 @@ static int saa7134_oss_init(void) | |||
993 | struct saa7134_dev *dev = NULL; | 993 | struct saa7134_dev *dev = NULL; |
994 | struct list_head *list; | 994 | struct list_head *list; |
995 | 995 | ||
996 | if (!dmasound_init && !dmasound_exit) { | 996 | if (!saa7134_dmasound_init && !saa7134_dmasound_exit) { |
997 | dmasound_init = oss_device_init; | 997 | saa7134_dmasound_init = oss_device_init; |
998 | dmasound_exit = oss_device_exit; | 998 | saa7134_dmasound_exit = oss_device_exit; |
999 | } else { | 999 | } else { |
1000 | printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n"); | 1000 | printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n"); |
1001 | return -EBUSY; | 1001 | return -EBUSY; |
@@ -1037,8 +1037,8 @@ static void saa7134_oss_exit(void) | |||
1037 | 1037 | ||
1038 | } | 1038 | } |
1039 | 1039 | ||
1040 | dmasound_init = NULL; | 1040 | saa7134_dmasound_init = NULL; |
1041 | dmasound_exit = NULL; | 1041 | saa7134_dmasound_exit = NULL; |
1042 | 1042 | ||
1043 | printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n"); | 1043 | printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n"); |
1044 | 1044 | ||
diff --git a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c index e4156ec9c6d7..2c171af9a9f2 100644 --- a/drivers/media/video/saa7134/saa7134-video.c +++ b/drivers/media/video/saa7134/saa7134-video.c | |||
@@ -40,7 +40,7 @@ | |||
40 | 40 | ||
41 | static unsigned int video_debug = 0; | 41 | static unsigned int video_debug = 0; |
42 | static unsigned int gbuffers = 8; | 42 | static unsigned int gbuffers = 8; |
43 | static unsigned int noninterlaced = 0; | 43 | static unsigned int noninterlaced = 1; |
44 | static unsigned int gbufsize = 720*576*4; | 44 | static unsigned int gbufsize = 720*576*4; |
45 | static unsigned int gbufsize_max = 720*576*4; | 45 | static unsigned int gbufsize_max = 720*576*4; |
46 | module_param(video_debug, int, 0644); | 46 | module_param(video_debug, int, 0644); |
@@ -48,7 +48,7 @@ MODULE_PARM_DESC(video_debug,"enable debug messages [video]"); | |||
48 | module_param(gbuffers, int, 0444); | 48 | module_param(gbuffers, int, 0444); |
49 | MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32"); | 49 | MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32"); |
50 | module_param(noninterlaced, int, 0644); | 50 | module_param(noninterlaced, int, 0644); |
51 | MODULE_PARM_DESC(noninterlaced,"video input is noninterlaced"); | 51 | MODULE_PARM_DESC(noninterlaced,"capture non interlaced video"); |
52 | 52 | ||
53 | #define dprintk(fmt, arg...) if (video_debug) \ | 53 | #define dprintk(fmt, arg...) if (video_debug) \ |
54 | printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) | 54 | printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) |
@@ -2087,7 +2087,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
2087 | struct v4l2_format *f = arg; | 2087 | struct v4l2_format *f = arg; |
2088 | return saa7134_try_fmt(dev,fh,f); | 2088 | return saa7134_try_fmt(dev,fh,f); |
2089 | } | 2089 | } |
2090 | #ifdef HAVE_V4L1 | 2090 | #ifdef CONFIG_VIDEO_V4L1_COMPAT |
2091 | case VIDIOCGMBUF: | 2091 | case VIDIOCGMBUF: |
2092 | { | 2092 | { |
2093 | struct video_mbuf *mbuf = arg; | 2093 | struct video_mbuf *mbuf = arg; |
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h index d5ee99c574cc..c04ce6152fd5 100644 --- a/drivers/media/video/saa7134/saa7134.h +++ b/drivers/media/video/saa7134/saa7134.h | |||
@@ -586,8 +586,8 @@ void saa7134_dma_free(struct videobuf_queue *q,struct saa7134_buf *buf); | |||
586 | 586 | ||
587 | int saa7134_set_dmabits(struct saa7134_dev *dev); | 587 | int saa7134_set_dmabits(struct saa7134_dev *dev); |
588 | 588 | ||
589 | extern int (*dmasound_init)(struct saa7134_dev *dev); | 589 | extern int (*saa7134_dmasound_init)(struct saa7134_dev *dev); |
590 | extern int (*dmasound_exit)(struct saa7134_dev *dev); | 590 | extern int (*saa7134_dmasound_exit)(struct saa7134_dev *dev); |
591 | 591 | ||
592 | 592 | ||
593 | /* ----------------------------------------------------------- */ | 593 | /* ----------------------------------------------------------- */ |
diff --git a/drivers/media/video/stradis.c b/drivers/media/video/stradis.c index b36ba9fa3a28..5686547ba76a 100644 --- a/drivers/media/video/stradis.c +++ b/drivers/media/video/stradis.c | |||
@@ -2181,7 +2181,6 @@ static struct pci_device_id stradis_pci_tbl[] = { | |||
2181 | { 0 } | 2181 | { 0 } |
2182 | }; | 2182 | }; |
2183 | 2183 | ||
2184 | MODULE_DEVICE_TABLE(pci, stradis_pci_tbl); | ||
2185 | 2184 | ||
2186 | static struct pci_driver stradis_driver = { | 2185 | static struct pci_driver stradis_driver = { |
2187 | .name = "stradis", | 2186 | .name = "stradis", |
diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c index f7eb402d5f2b..40590bae5ff7 100644 --- a/drivers/media/video/tuner-core.c +++ b/drivers/media/video/tuner-core.c | |||
@@ -196,14 +196,6 @@ static void set_type(struct i2c_client *c, unsigned int type, | |||
196 | i2c_master_send(c, buffer, 4); | 196 | i2c_master_send(c, buffer, 4); |
197 | default_tuner_init(c); | 197 | default_tuner_init(c); |
198 | break; | 198 | break; |
199 | case TUNER_LG_TDVS_H06XF: | ||
200 | /* Set the Auxiliary Byte. */ | ||
201 | buffer[2] &= ~0x20; | ||
202 | buffer[2] |= 0x18; | ||
203 | buffer[3] = 0x20; | ||
204 | i2c_master_send(c, buffer, 4); | ||
205 | default_tuner_init(c); | ||
206 | break; | ||
207 | case TUNER_PHILIPS_TD1316: | 199 | case TUNER_PHILIPS_TD1316: |
208 | buffer[0] = 0x0b; | 200 | buffer[0] = 0x0b; |
209 | buffer[1] = 0xdc; | 201 | buffer[1] = 0xdc; |
@@ -598,6 +590,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
598 | if (t->standby) | 590 | if (t->standby) |
599 | t->standby (client); | 591 | t->standby (client); |
600 | break; | 592 | break; |
593 | #ifdef CONFIG_VIDEO_V4L1 | ||
601 | case VIDIOCSAUDIO: | 594 | case VIDIOCSAUDIO: |
602 | if (check_mode(t, "VIDIOCSAUDIO") == EINVAL) | 595 | if (check_mode(t, "VIDIOCSAUDIO") == EINVAL) |
603 | return 0; | 596 | return 0; |
@@ -607,17 +600,6 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
607 | /* Should be implemented, since bttv calls it */ | 600 | /* Should be implemented, since bttv calls it */ |
608 | tuner_dbg("VIDIOCSAUDIO not implemented.\n"); | 601 | tuner_dbg("VIDIOCSAUDIO not implemented.\n"); |
609 | break; | 602 | break; |
610 | case TDA9887_SET_CONFIG: | ||
611 | if (t->type == TUNER_TDA9887) { | ||
612 | int *i = arg; | ||
613 | |||
614 | t->tda9887_config = *i; | ||
615 | set_freq(client, t->tv_freq); | ||
616 | } | ||
617 | break; | ||
618 | /* --- v4l ioctls --- */ | ||
619 | /* take care: bttv does userspace copying, we'll get a | ||
620 | kernel pointer here... */ | ||
621 | case VIDIOCSCHAN: | 603 | case VIDIOCSCHAN: |
622 | { | 604 | { |
623 | static const v4l2_std_id map[] = { | 605 | static const v4l2_std_id map[] = { |
@@ -701,7 +683,18 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
701 | ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO; | 683 | ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO; |
702 | return 0; | 684 | return 0; |
703 | } | 685 | } |
686 | #endif | ||
687 | case TDA9887_SET_CONFIG: | ||
688 | if (t->type == TUNER_TDA9887) { | ||
689 | int *i = arg; | ||
704 | 690 | ||
691 | t->tda9887_config = *i; | ||
692 | set_freq(client, t->tv_freq); | ||
693 | } | ||
694 | break; | ||
695 | /* --- v4l ioctls --- */ | ||
696 | /* take care: bttv does userspace copying, we'll get a | ||
697 | kernel pointer here... */ | ||
705 | case VIDIOC_S_STD: | 698 | case VIDIOC_S_STD: |
706 | { | 699 | { |
707 | v4l2_std_id *id = arg; | 700 | v4l2_std_id *id = arg; |
diff --git a/drivers/media/video/tuner-simple.c b/drivers/media/video/tuner-simple.c index d071c5cbf013..abe37cf632c6 100644 --- a/drivers/media/video/tuner-simple.c +++ b/drivers/media/video/tuner-simple.c | |||
@@ -339,7 +339,20 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
339 | if (4 != (rc = i2c_master_send(c,buffer,4))) | 339 | if (4 != (rc = i2c_master_send(c,buffer,4))) |
340 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); | 340 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); |
341 | 341 | ||
342 | if (t->type == TUNER_MICROTUNE_4042FI5) { | 342 | switch (t->type) { |
343 | case TUNER_LG_TDVS_H06XF: | ||
344 | /* Set the Auxiliary Byte. */ | ||
345 | buffer[0] = buffer[2]; | ||
346 | buffer[0] &= ~0x20; | ||
347 | buffer[0] |= 0x18; | ||
348 | buffer[1] = 0x20; | ||
349 | tuner_dbg("tv 0x%02x 0x%02x\n",buffer[0],buffer[1]); | ||
350 | |||
351 | if (2 != (rc = i2c_master_send(c,buffer,2))) | ||
352 | tuner_warn("i2c i/o error: rc == %d (should be 2)\n",rc); | ||
353 | break; | ||
354 | case TUNER_MICROTUNE_4042FI5: | ||
355 | { | ||
343 | // FIXME - this may also work for other tuners | 356 | // FIXME - this may also work for other tuners |
344 | unsigned long timeout = jiffies + msecs_to_jiffies(1); | 357 | unsigned long timeout = jiffies + msecs_to_jiffies(1); |
345 | u8 status_byte = 0; | 358 | u8 status_byte = 0; |
@@ -364,10 +377,12 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
364 | buffer[2] = config; | 377 | buffer[2] = config; |
365 | buffer[3] = cb; | 378 | buffer[3] = cb; |
366 | tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n", | 379 | tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n", |
367 | buffer[0],buffer[1],buffer[2],buffer[3]); | 380 | buffer[0],buffer[1],buffer[2],buffer[3]); |
368 | 381 | ||
369 | if (4 != (rc = i2c_master_send(c,buffer,4))) | 382 | if (4 != (rc = i2c_master_send(c,buffer,4))) |
370 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); | 383 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); |
384 | break; | ||
385 | } | ||
371 | } | 386 | } |
372 | } | 387 | } |
373 | 388 | ||
diff --git a/drivers/media/video/tuner-types.c b/drivers/media/video/tuner-types.c index a167e17c6dcd..d7eadc2c298d 100644 --- a/drivers/media/video/tuner-types.c +++ b/drivers/media/video/tuner-types.c | |||
@@ -1027,10 +1027,11 @@ static struct tuner_params tuner_tnf_5335mf_params[] = { | |||
1027 | /* 70-79 */ | 1027 | /* 70-79 */ |
1028 | /* ------------ TUNER_SAMSUNG_TCPN_2121P30A - Samsung NTSC ------------ */ | 1028 | /* ------------ TUNER_SAMSUNG_TCPN_2121P30A - Samsung NTSC ------------ */ |
1029 | 1029 | ||
1030 | /* '+ 4' turns on the Low Noise Amplifier */ | ||
1030 | static struct tuner_range tuner_samsung_tcpn_2121p30a_ntsc_ranges[] = { | 1031 | static struct tuner_range tuner_samsung_tcpn_2121p30a_ntsc_ranges[] = { |
1031 | { 16 * 130.00 /*MHz*/, 0xce, 0x01, }, | 1032 | { 16 * 130.00 /*MHz*/, 0xce, 0x01 + 4, }, |
1032 | { 16 * 364.50 /*MHz*/, 0xce, 0x02, }, | 1033 | { 16 * 364.50 /*MHz*/, 0xce, 0x02 + 4, }, |
1033 | { 16 * 999.99 , 0xce, 0x08, }, | 1034 | { 16 * 999.99 , 0xce, 0x08 + 4, }, |
1034 | }; | 1035 | }; |
1035 | 1036 | ||
1036 | static struct tuner_params tuner_samsung_tcpn_2121p30a_params[] = { | 1037 | static struct tuner_params tuner_samsung_tcpn_2121p30a_params[] = { |
@@ -1060,10 +1061,11 @@ static struct tuner_params tuner_thomson_fe6600_params[] = { | |||
1060 | 1061 | ||
1061 | /* ------------ TUNER_SAMSUNG_TCPG_6121P30A - Samsung PAL ------------ */ | 1062 | /* ------------ TUNER_SAMSUNG_TCPG_6121P30A - Samsung PAL ------------ */ |
1062 | 1063 | ||
1064 | /* '+ 4' turns on the Low Noise Amplifier */ | ||
1063 | static struct tuner_range tuner_samsung_tcpg_6121p30a_pal_ranges[] = { | 1065 | static struct tuner_range tuner_samsung_tcpg_6121p30a_pal_ranges[] = { |
1064 | { 16 * 146.25 /*MHz*/, 0xce, 0x01, }, | 1066 | { 16 * 146.25 /*MHz*/, 0xce, 0x01 + 4, }, |
1065 | { 16 * 428.50 /*MHz*/, 0xce, 0x02, }, | 1067 | { 16 * 428.50 /*MHz*/, 0xce, 0x02 + 4, }, |
1066 | { 16 * 999.99 , 0xce, 0x08, }, | 1068 | { 16 * 999.99 , 0xce, 0x08 + 4, }, |
1067 | }; | 1069 | }; |
1068 | 1070 | ||
1069 | static struct tuner_params tuner_samsung_tcpg_6121p30a_params[] = { | 1071 | static struct tuner_params tuner_samsung_tcpg_6121p30a_params[] = { |
diff --git a/drivers/media/video/usbvideo/Kconfig b/drivers/media/video/usbvideo/Kconfig index 59fb899f31f3..a0fd82b924f2 100644 --- a/drivers/media/video/usbvideo/Kconfig +++ b/drivers/media/video/usbvideo/Kconfig | |||
@@ -3,7 +3,7 @@ config VIDEO_USBVIDEO | |||
3 | 3 | ||
4 | config USB_VICAM | 4 | config USB_VICAM |
5 | tristate "USB 3com HomeConnect (aka vicam) support (EXPERIMENTAL)" | 5 | tristate "USB 3com HomeConnect (aka vicam) support (EXPERIMENTAL)" |
6 | depends on USB && VIDEO_V4L1 && EXPERIMENTAL | 6 | depends on USB && VIDEO_DEV && VIDEO_V4L1 && EXPERIMENTAL |
7 | select VIDEO_USBVIDEO | 7 | select VIDEO_USBVIDEO |
8 | ---help--- | 8 | ---help--- |
9 | Say Y here if you have 3com homeconnect camera (vicam). | 9 | Say Y here if you have 3com homeconnect camera (vicam). |
@@ -13,7 +13,7 @@ config USB_VICAM | |||
13 | 13 | ||
14 | config USB_IBMCAM | 14 | config USB_IBMCAM |
15 | tristate "USB IBM (Xirlink) C-it Camera support" | 15 | tristate "USB IBM (Xirlink) C-it Camera support" |
16 | depends on USB && VIDEO_V4L1 | 16 | depends on USB && VIDEO_DEV && VIDEO_V4L1 |
17 | select VIDEO_USBVIDEO | 17 | select VIDEO_USBVIDEO |
18 | ---help--- | 18 | ---help--- |
19 | Say Y here if you want to connect a IBM "C-It" camera, also known as | 19 | Say Y here if you want to connect a IBM "C-It" camera, also known as |
@@ -28,7 +28,7 @@ config USB_IBMCAM | |||
28 | 28 | ||
29 | config USB_KONICAWC | 29 | config USB_KONICAWC |
30 | tristate "USB Konica Webcam support" | 30 | tristate "USB Konica Webcam support" |
31 | depends on USB && VIDEO_V4L1 | 31 | depends on USB && VIDEO_DEV && VIDEO_V4L1 |
32 | select VIDEO_USBVIDEO | 32 | select VIDEO_USBVIDEO |
33 | ---help--- | 33 | ---help--- |
34 | Say Y here if you want support for webcams based on a Konica | 34 | Say Y here if you want support for webcams based on a Konica |
@@ -39,7 +39,7 @@ config USB_KONICAWC | |||
39 | 39 | ||
40 | config USB_QUICKCAM_MESSENGER | 40 | config USB_QUICKCAM_MESSENGER |
41 | tristate "USB Logitech Quickcam Messenger" | 41 | tristate "USB Logitech Quickcam Messenger" |
42 | depends on USB && VIDEO_DEV | 42 | depends on USB && VIDEO_DEV && VIDEO_V4L1 |
43 | select VIDEO_USBVIDEO | 43 | select VIDEO_USBVIDEO |
44 | ---help--- | 44 | ---help--- |
45 | Say Y or M here to enable support for the USB Logitech Quickcam | 45 | Say Y or M here to enable support for the USB Logitech Quickcam |
diff --git a/drivers/media/video/v4l1-compat.c b/drivers/media/video/v4l1-compat.c index d83a2c84d233..d7c3fcbc80f7 100644 --- a/drivers/media/video/v4l1-compat.c +++ b/drivers/media/video/v4l1-compat.c | |||
@@ -599,6 +599,10 @@ v4l_compat_translate_ioctl(struct inode *inode, | |||
599 | dprintk("VIDIOCGPICT / VIDIOC_G_FMT: %d\n",err); | 599 | dprintk("VIDIOCGPICT / VIDIOC_G_FMT: %d\n",err); |
600 | break; | 600 | break; |
601 | } | 601 | } |
602 | |||
603 | pict->depth = ((fmt2->fmt.pix.bytesperline<<3) | ||
604 | + (fmt2->fmt.pix.width-1) ) | ||
605 | /fmt2->fmt.pix.width; | ||
602 | pict->palette = pixelformat_to_palette( | 606 | pict->palette = pixelformat_to_palette( |
603 | fmt2->fmt.pix.pixelformat); | 607 | fmt2->fmt.pix.pixelformat); |
604 | break; | 608 | break; |
diff --git a/drivers/media/video/v4l2-common.c b/drivers/media/video/v4l2-common.c index f06dc19e504a..8d972ffdaf98 100644 --- a/drivers/media/video/v4l2-common.c +++ b/drivers/media/video/v4l2-common.c | |||
@@ -202,7 +202,7 @@ static char *v4l2_memory_names[] = { | |||
202 | /* ------------------------------------------------------------------ */ | 202 | /* ------------------------------------------------------------------ */ |
203 | /* debug help functions */ | 203 | /* debug help functions */ |
204 | 204 | ||
205 | #ifdef HAVE_V4L1 | 205 | #ifdef CONFIG_VIDEO_V4L1_COMPAT |
206 | static const char *v4l1_ioctls[] = { | 206 | static const char *v4l1_ioctls[] = { |
207 | [_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP", | 207 | [_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP", |
208 | [_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN", | 208 | [_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN", |
@@ -301,7 +301,7 @@ static const char *v4l2_ioctls[] = { | |||
301 | #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls) | 301 | #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls) |
302 | 302 | ||
303 | static const char *v4l2_int_ioctls[] = { | 303 | static const char *v4l2_int_ioctls[] = { |
304 | #ifdef HAVE_VIDEO_DECODER | 304 | #ifdef CONFIG_VIDEO_V4L1_COMPAT |
305 | [_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES", | 305 | [_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES", |
306 | [_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS", | 306 | [_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS", |
307 | [_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM", | 307 | [_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM", |
@@ -367,7 +367,7 @@ void v4l_printk_ioctl(unsigned int cmd) | |||
367 | (_IOC_NR(cmd) < V4L2_INT_IOCTLS) ? | 367 | (_IOC_NR(cmd) < V4L2_INT_IOCTLS) ? |
368 | v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd); | 368 | v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd); |
369 | break; | 369 | break; |
370 | #ifdef HAVE_V4L1 | 370 | #ifdef CONFIG_VIDEO_V4L1_COMPAT |
371 | case 'v': | 371 | case 'v': |
372 | printk("v4l1 ioctl %s, dir=%s (0x%08x)\n", | 372 | printk("v4l1 ioctl %s, dir=%s (0x%08x)\n", |
373 | (_IOC_NR(cmd) < V4L1_IOCTLS) ? | 373 | (_IOC_NR(cmd) < V4L1_IOCTLS) ? |
@@ -414,6 +414,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
414 | printk ("%s: tuner type=%d\n", s, *p); | 414 | printk ("%s: tuner type=%d\n", s, *p); |
415 | break; | 415 | break; |
416 | } | 416 | } |
417 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
417 | case DECODER_SET_VBI_BYPASS: | 418 | case DECODER_SET_VBI_BYPASS: |
418 | case DECODER_ENABLE_OUTPUT: | 419 | case DECODER_ENABLE_OUTPUT: |
419 | case DECODER_GET_STATUS: | 420 | case DECODER_GET_STATUS: |
@@ -424,6 +425,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
424 | case VIDIOCCAPTURE: | 425 | case VIDIOCCAPTURE: |
425 | case VIDIOCSYNC: | 426 | case VIDIOCSYNC: |
426 | case VIDIOCSWRITEMODE: | 427 | case VIDIOCSWRITEMODE: |
428 | #endif | ||
427 | case TUNER_SET_TYPE_ADDR: | 429 | case TUNER_SET_TYPE_ADDR: |
428 | case TUNER_SET_STANDBY: | 430 | case TUNER_SET_STANDBY: |
429 | case TDA9887_SET_CONFIG: | 431 | case TDA9887_SET_CONFIG: |
@@ -755,6 +757,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
755 | p->afc); | 757 | p->afc); |
756 | break; | 758 | break; |
757 | } | 759 | } |
760 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
758 | case VIDIOCGVBIFMT: | 761 | case VIDIOCGVBIFMT: |
759 | case VIDIOCSVBIFMT: | 762 | case VIDIOCSVBIFMT: |
760 | { | 763 | { |
@@ -924,6 +927,14 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
924 | p->clipcount); | 927 | p->clipcount); |
925 | break; | 928 | break; |
926 | } | 929 | } |
930 | case VIDIOCGFREQ: | ||
931 | case VIDIOCSFREQ: | ||
932 | { | ||
933 | unsigned long *p=arg; | ||
934 | printk ("%s: value=%lu\n", s, *p); | ||
935 | break; | ||
936 | } | ||
937 | #endif | ||
927 | case VIDIOC_INT_AUDIO_CLOCK_FREQ: | 938 | case VIDIOC_INT_AUDIO_CLOCK_FREQ: |
928 | case VIDIOC_INT_I2S_CLOCK_FREQ: | 939 | case VIDIOC_INT_I2S_CLOCK_FREQ: |
929 | case VIDIOC_INT_S_STANDBY: | 940 | case VIDIOC_INT_S_STANDBY: |
@@ -933,13 +944,6 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
933 | printk ("%s: value=%d\n", s, *p); | 944 | printk ("%s: value=%d\n", s, *p); |
934 | break; | 945 | break; |
935 | } | 946 | } |
936 | case VIDIOCGFREQ: | ||
937 | case VIDIOCSFREQ: | ||
938 | { | ||
939 | unsigned long *p=arg; | ||
940 | printk ("%s: value=%lu\n", s, *p); | ||
941 | break; | ||
942 | } | ||
943 | case VIDIOC_G_STD: | 947 | case VIDIOC_G_STD: |
944 | case VIDIOC_S_STD: | 948 | case VIDIOC_S_STD: |
945 | case VIDIOC_QUERYSTD: | 949 | case VIDIOC_QUERYSTD: |
diff --git a/drivers/media/video/videodev.c b/drivers/media/video/videodev.c index b26ebaff226f..88bf2af2a0e7 100644 --- a/drivers/media/video/videodev.c +++ b/drivers/media/video/videodev.c | |||
@@ -760,7 +760,7 @@ static int __video_do_ioctl(struct inode *inode, struct file *file, | |||
760 | ret=vfd->vidioc_overlay(file, fh, *i); | 760 | ret=vfd->vidioc_overlay(file, fh, *i); |
761 | break; | 761 | break; |
762 | } | 762 | } |
763 | #ifdef HAVE_V4L1 | 763 | #ifdef CONFIG_VIDEO_V4L1_COMPAT |
764 | /* --- streaming capture ------------------------------------- */ | 764 | /* --- streaming capture ------------------------------------- */ |
765 | case VIDIOCGMBUF: | 765 | case VIDIOCGMBUF: |
766 | { | 766 | { |
@@ -1512,6 +1512,7 @@ int video_register_device(struct video_device *vfd, int type, int nr) | |||
1512 | int i=0; | 1512 | int i=0; |
1513 | int base; | 1513 | int base; |
1514 | int end; | 1514 | int end; |
1515 | int ret; | ||
1515 | char *name_base; | 1516 | char *name_base; |
1516 | 1517 | ||
1517 | switch(type) | 1518 | switch(type) |
@@ -1537,6 +1538,8 @@ int video_register_device(struct video_device *vfd, int type, int nr) | |||
1537 | name_base = "radio"; | 1538 | name_base = "radio"; |
1538 | break; | 1539 | break; |
1539 | default: | 1540 | default: |
1541 | printk(KERN_ERR "%s called with unknown type: %d\n", | ||
1542 | __FUNCTION__, type); | ||
1540 | return -1; | 1543 | return -1; |
1541 | } | 1544 | } |
1542 | 1545 | ||
@@ -1571,9 +1574,18 @@ int video_register_device(struct video_device *vfd, int type, int nr) | |||
1571 | vfd->class_dev.class = &video_class; | 1574 | vfd->class_dev.class = &video_class; |
1572 | vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor); | 1575 | vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor); |
1573 | sprintf(vfd->class_dev.class_id, "%s%d", name_base, i - base); | 1576 | sprintf(vfd->class_dev.class_id, "%s%d", name_base, i - base); |
1574 | class_device_register(&vfd->class_dev); | 1577 | ret = class_device_register(&vfd->class_dev); |
1575 | class_device_create_file(&vfd->class_dev, | 1578 | if (ret < 0) { |
1576 | &class_device_attr_name); | 1579 | printk(KERN_ERR "%s: class_device_register failed\n", |
1580 | __FUNCTION__); | ||
1581 | goto fail_minor; | ||
1582 | } | ||
1583 | ret = class_device_create_file(&vfd->class_dev, &class_device_attr_name); | ||
1584 | if (ret < 0) { | ||
1585 | printk(KERN_ERR "%s: class_device_create_file 'name' failed\n", | ||
1586 | __FUNCTION__); | ||
1587 | goto fail_classdev; | ||
1588 | } | ||
1577 | 1589 | ||
1578 | #if 1 | 1590 | #if 1 |
1579 | /* needed until all drivers are fixed */ | 1591 | /* needed until all drivers are fixed */ |
@@ -1583,6 +1595,15 @@ int video_register_device(struct video_device *vfd, int type, int nr) | |||
1583 | "http://lwn.net/Articles/36850/\n", vfd->name); | 1595 | "http://lwn.net/Articles/36850/\n", vfd->name); |
1584 | #endif | 1596 | #endif |
1585 | return 0; | 1597 | return 0; |
1598 | |||
1599 | fail_classdev: | ||
1600 | class_device_unregister(&vfd->class_dev); | ||
1601 | fail_minor: | ||
1602 | mutex_lock(&videodev_lock); | ||
1603 | video_device[vfd->minor] = NULL; | ||
1604 | vfd->minor = -1; | ||
1605 | mutex_unlock(&videodev_lock); | ||
1606 | return ret; | ||
1586 | } | 1607 | } |
1587 | 1608 | ||
1588 | /** | 1609 | /** |
diff --git a/drivers/media/video/vivi.c b/drivers/media/video/vivi.c index 41d23c8acbd8..841884af0cc0 100644 --- a/drivers/media/video/vivi.c +++ b/drivers/media/video/vivi.c | |||
@@ -986,7 +986,7 @@ static int vidioc_dqbuf (struct file *file, void *priv, struct v4l2_buffer *p) | |||
986 | file->f_flags & O_NONBLOCK)); | 986 | file->f_flags & O_NONBLOCK)); |
987 | } | 987 | } |
988 | 988 | ||
989 | #ifdef HAVE_V4L1 | 989 | #ifdef CONFIG_VIDEO_V4L1_COMPAT |
990 | static int vidiocgmbuf (struct file *file, void *priv, struct video_mbuf *mbuf) | 990 | static int vidiocgmbuf (struct file *file, void *priv, struct video_mbuf *mbuf) |
991 | { | 991 | { |
992 | struct vivi_fh *fh=priv; | 992 | struct vivi_fh *fh=priv; |
@@ -1328,7 +1328,7 @@ static struct video_device vivi = { | |||
1328 | .vidioc_s_ctrl = vidioc_s_ctrl, | 1328 | .vidioc_s_ctrl = vidioc_s_ctrl, |
1329 | .vidioc_streamon = vidioc_streamon, | 1329 | .vidioc_streamon = vidioc_streamon, |
1330 | .vidioc_streamoff = vidioc_streamoff, | 1330 | .vidioc_streamoff = vidioc_streamoff, |
1331 | #ifdef HAVE_V4L1 | 1331 | #ifdef CONFIG_VIDEO_V4L1_COMPAT |
1332 | .vidiocgmbuf = vidiocgmbuf, | 1332 | .vidiocgmbuf = vidiocgmbuf, |
1333 | #endif | 1333 | #endif |
1334 | .tvnorms = tvnorms, | 1334 | .tvnorms = tvnorms, |
diff --git a/drivers/mmc/mmc_queue.c b/drivers/mmc/mmc_queue.c index 0b9682e9a357..74f8cdeeff0f 100644 --- a/drivers/mmc/mmc_queue.c +++ b/drivers/mmc/mmc_queue.c | |||
@@ -79,7 +79,8 @@ static int mmc_queue_thread(void *d) | |||
79 | spin_lock_irq(q->queue_lock); | 79 | spin_lock_irq(q->queue_lock); |
80 | set_current_state(TASK_INTERRUPTIBLE); | 80 | set_current_state(TASK_INTERRUPTIBLE); |
81 | if (!blk_queue_plugged(q)) | 81 | if (!blk_queue_plugged(q)) |
82 | mq->req = req = elv_next_request(q); | 82 | req = elv_next_request(q); |
83 | mq->req = req; | ||
83 | spin_unlock_irq(q->queue_lock); | 84 | spin_unlock_irq(q->queue_lock); |
84 | 85 | ||
85 | if (!req) { | 86 | if (!req) { |
diff --git a/drivers/mmc/wbsd.c b/drivers/mmc/wbsd.c index 8a30ef3ae419..c351c6d1a18a 100644 --- a/drivers/mmc/wbsd.c +++ b/drivers/mmc/wbsd.c | |||
@@ -41,7 +41,7 @@ | |||
41 | #include "wbsd.h" | 41 | #include "wbsd.h" |
42 | 42 | ||
43 | #define DRIVER_NAME "wbsd" | 43 | #define DRIVER_NAME "wbsd" |
44 | #define DRIVER_VERSION "1.5" | 44 | #define DRIVER_VERSION "1.6" |
45 | 45 | ||
46 | #define DBG(x...) \ | 46 | #define DBG(x...) \ |
47 | pr_debug(DRIVER_NAME ": " x) | 47 | pr_debug(DRIVER_NAME ": " x) |
@@ -1439,13 +1439,13 @@ static int __devinit wbsd_scan(struct wbsd_host *host) | |||
1439 | 1439 | ||
1440 | static int __devinit wbsd_request_region(struct wbsd_host *host, int base) | 1440 | static int __devinit wbsd_request_region(struct wbsd_host *host, int base) |
1441 | { | 1441 | { |
1442 | if (io & 0x7) | 1442 | if (base & 0x7) |
1443 | return -EINVAL; | 1443 | return -EINVAL; |
1444 | 1444 | ||
1445 | if (!request_region(base, 8, DRIVER_NAME)) | 1445 | if (!request_region(base, 8, DRIVER_NAME)) |
1446 | return -EIO; | 1446 | return -EIO; |
1447 | 1447 | ||
1448 | host->base = io; | 1448 | host->base = base; |
1449 | 1449 | ||
1450 | return 0; | 1450 | return 0; |
1451 | } | 1451 | } |
@@ -1773,7 +1773,7 @@ static int __devinit wbsd_init(struct device *dev, int base, int irq, int dma, | |||
1773 | /* | 1773 | /* |
1774 | * Request resources. | 1774 | * Request resources. |
1775 | */ | 1775 | */ |
1776 | ret = wbsd_request_resources(host, io, irq, dma); | 1776 | ret = wbsd_request_resources(host, base, irq, dma); |
1777 | if (ret) { | 1777 | if (ret) { |
1778 | wbsd_release_resources(host); | 1778 | wbsd_release_resources(host); |
1779 | wbsd_free_mmc(dev); | 1779 | wbsd_free_mmc(dev); |
@@ -1861,6 +1861,7 @@ static void __devexit wbsd_shutdown(struct device *dev, int pnp) | |||
1861 | 1861 | ||
1862 | static int __devinit wbsd_probe(struct platform_device *dev) | 1862 | static int __devinit wbsd_probe(struct platform_device *dev) |
1863 | { | 1863 | { |
1864 | /* Use the module parameters for resources */ | ||
1864 | return wbsd_init(&dev->dev, io, irq, dma, 0); | 1865 | return wbsd_init(&dev->dev, io, irq, dma, 0); |
1865 | } | 1866 | } |
1866 | 1867 | ||
diff --git a/drivers/net/appletalk/Kconfig b/drivers/net/appletalk/Kconfig index b14e89004c3a..0a0e0cd81a23 100644 --- a/drivers/net/appletalk/Kconfig +++ b/drivers/net/appletalk/Kconfig | |||
@@ -29,7 +29,7 @@ config ATALK | |||
29 | even politically correct people are allowed to say Y here. | 29 | even politically correct people are allowed to say Y here. |
30 | 30 | ||
31 | config DEV_APPLETALK | 31 | config DEV_APPLETALK |
32 | bool "Appletalk interfaces support" | 32 | tristate "Appletalk interfaces support" |
33 | depends on ATALK | 33 | depends on ATALK |
34 | help | 34 | help |
35 | AppleTalk is the protocol that Apple computers can use to communicate | 35 | AppleTalk is the protocol that Apple computers can use to communicate |
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index db73de0d2511..652eb05a6c2d 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -56,8 +56,8 @@ | |||
56 | 56 | ||
57 | #define DRV_MODULE_NAME "bnx2" | 57 | #define DRV_MODULE_NAME "bnx2" |
58 | #define PFX DRV_MODULE_NAME ": " | 58 | #define PFX DRV_MODULE_NAME ": " |
59 | #define DRV_MODULE_VERSION "1.4.43" | 59 | #define DRV_MODULE_VERSION "1.4.44" |
60 | #define DRV_MODULE_RELDATE "June 28, 2006" | 60 | #define DRV_MODULE_RELDATE "August 10, 2006" |
61 | 61 | ||
62 | #define RUN_AT(x) (jiffies + (x)) | 62 | #define RUN_AT(x) (jiffies + (x)) |
63 | 63 | ||
@@ -209,8 +209,10 @@ MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl); | |||
209 | 209 | ||
210 | static inline u32 bnx2_tx_avail(struct bnx2 *bp) | 210 | static inline u32 bnx2_tx_avail(struct bnx2 *bp) |
211 | { | 211 | { |
212 | u32 diff = TX_RING_IDX(bp->tx_prod) - TX_RING_IDX(bp->tx_cons); | 212 | u32 diff; |
213 | 213 | ||
214 | smp_mb(); | ||
215 | diff = TX_RING_IDX(bp->tx_prod) - TX_RING_IDX(bp->tx_cons); | ||
214 | if (diff > MAX_TX_DESC_CNT) | 216 | if (diff > MAX_TX_DESC_CNT) |
215 | diff = (diff & MAX_TX_DESC_CNT) - 1; | 217 | diff = (diff & MAX_TX_DESC_CNT) - 1; |
216 | return (bp->tx_ring_size - diff); | 218 | return (bp->tx_ring_size - diff); |
@@ -1569,7 +1571,7 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, u16 index) | |||
1569 | struct rx_bd *rxbd = &bp->rx_desc_ring[RX_RING(index)][RX_IDX(index)]; | 1571 | struct rx_bd *rxbd = &bp->rx_desc_ring[RX_RING(index)][RX_IDX(index)]; |
1570 | unsigned long align; | 1572 | unsigned long align; |
1571 | 1573 | ||
1572 | skb = dev_alloc_skb(bp->rx_buf_size); | 1574 | skb = netdev_alloc_skb(bp->dev, bp->rx_buf_size); |
1573 | if (skb == NULL) { | 1575 | if (skb == NULL) { |
1574 | return -ENOMEM; | 1576 | return -ENOMEM; |
1575 | } | 1577 | } |
@@ -1578,7 +1580,6 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, u16 index) | |||
1578 | skb_reserve(skb, 8 - align); | 1580 | skb_reserve(skb, 8 - align); |
1579 | } | 1581 | } |
1580 | 1582 | ||
1581 | skb->dev = bp->dev; | ||
1582 | mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_use_size, | 1583 | mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_use_size, |
1583 | PCI_DMA_FROMDEVICE); | 1584 | PCI_DMA_FROMDEVICE); |
1584 | 1585 | ||
@@ -1686,15 +1687,20 @@ bnx2_tx_int(struct bnx2 *bp) | |||
1686 | } | 1687 | } |
1687 | 1688 | ||
1688 | bp->tx_cons = sw_cons; | 1689 | bp->tx_cons = sw_cons; |
1690 | /* Need to make the tx_cons update visible to bnx2_start_xmit() | ||
1691 | * before checking for netif_queue_stopped(). Without the | ||
1692 | * memory barrier, there is a small possibility that bnx2_start_xmit() | ||
1693 | * will miss it and cause the queue to be stopped forever. | ||
1694 | */ | ||
1695 | smp_mb(); | ||
1689 | 1696 | ||
1690 | if (unlikely(netif_queue_stopped(bp->dev))) { | 1697 | if (unlikely(netif_queue_stopped(bp->dev)) && |
1691 | spin_lock(&bp->tx_lock); | 1698 | (bnx2_tx_avail(bp) > bp->tx_wake_thresh)) { |
1699 | netif_tx_lock(bp->dev); | ||
1692 | if ((netif_queue_stopped(bp->dev)) && | 1700 | if ((netif_queue_stopped(bp->dev)) && |
1693 | (bnx2_tx_avail(bp) > MAX_SKB_FRAGS)) { | 1701 | (bnx2_tx_avail(bp) > bp->tx_wake_thresh)) |
1694 | |||
1695 | netif_wake_queue(bp->dev); | 1702 | netif_wake_queue(bp->dev); |
1696 | } | 1703 | netif_tx_unlock(bp->dev); |
1697 | spin_unlock(&bp->tx_lock); | ||
1698 | } | 1704 | } |
1699 | } | 1705 | } |
1700 | 1706 | ||
@@ -1786,7 +1792,7 @@ bnx2_rx_int(struct bnx2 *bp, int budget) | |||
1786 | if ((bp->dev->mtu > 1500) && (len <= RX_COPY_THRESH)) { | 1792 | if ((bp->dev->mtu > 1500) && (len <= RX_COPY_THRESH)) { |
1787 | struct sk_buff *new_skb; | 1793 | struct sk_buff *new_skb; |
1788 | 1794 | ||
1789 | new_skb = dev_alloc_skb(len + 2); | 1795 | new_skb = netdev_alloc_skb(bp->dev, len + 2); |
1790 | if (new_skb == NULL) | 1796 | if (new_skb == NULL) |
1791 | goto reuse_rx; | 1797 | goto reuse_rx; |
1792 | 1798 | ||
@@ -1797,7 +1803,6 @@ bnx2_rx_int(struct bnx2 *bp, int budget) | |||
1797 | 1803 | ||
1798 | skb_reserve(new_skb, 2); | 1804 | skb_reserve(new_skb, 2); |
1799 | skb_put(new_skb, len); | 1805 | skb_put(new_skb, len); |
1800 | new_skb->dev = bp->dev; | ||
1801 | 1806 | ||
1802 | bnx2_reuse_rx_skb(bp, skb, | 1807 | bnx2_reuse_rx_skb(bp, skb, |
1803 | sw_ring_cons, sw_ring_prod); | 1808 | sw_ring_cons, sw_ring_prod); |
@@ -3503,6 +3508,8 @@ bnx2_init_tx_ring(struct bnx2 *bp) | |||
3503 | struct tx_bd *txbd; | 3508 | struct tx_bd *txbd; |
3504 | u32 val; | 3509 | u32 val; |
3505 | 3510 | ||
3511 | bp->tx_wake_thresh = bp->tx_ring_size / 2; | ||
3512 | |||
3506 | txbd = &bp->tx_desc_ring[MAX_TX_DESC_CNT]; | 3513 | txbd = &bp->tx_desc_ring[MAX_TX_DESC_CNT]; |
3507 | 3514 | ||
3508 | txbd->tx_bd_haddr_hi = (u64) bp->tx_desc_mapping >> 32; | 3515 | txbd->tx_bd_haddr_hi = (u64) bp->tx_desc_mapping >> 32; |
@@ -3952,7 +3959,7 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode) | |||
3952 | return -EINVAL; | 3959 | return -EINVAL; |
3953 | 3960 | ||
3954 | pkt_size = 1514; | 3961 | pkt_size = 1514; |
3955 | skb = dev_alloc_skb(pkt_size); | 3962 | skb = netdev_alloc_skb(bp->dev, pkt_size); |
3956 | if (!skb) | 3963 | if (!skb) |
3957 | return -ENOMEM; | 3964 | return -ENOMEM; |
3958 | packet = skb_put(skb, pkt_size); | 3965 | packet = skb_put(skb, pkt_size); |
@@ -4390,10 +4397,8 @@ bnx2_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid) | |||
4390 | #endif | 4397 | #endif |
4391 | 4398 | ||
4392 | /* Called with netif_tx_lock. | 4399 | /* Called with netif_tx_lock. |
4393 | * hard_start_xmit is pseudo-lockless - a lock is only required when | 4400 | * bnx2_tx_int() runs without netif_tx_lock unless it needs to call |
4394 | * the tx queue is full. This way, we get the benefit of lockless | 4401 | * netif_wake_queue(). |
4395 | * operations most of the time without the complexities to handle | ||
4396 | * netif_stop_queue/wake_queue race conditions. | ||
4397 | */ | 4402 | */ |
4398 | static int | 4403 | static int |
4399 | bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) | 4404 | bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) |
@@ -4512,12 +4517,9 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
4512 | dev->trans_start = jiffies; | 4517 | dev->trans_start = jiffies; |
4513 | 4518 | ||
4514 | if (unlikely(bnx2_tx_avail(bp) <= MAX_SKB_FRAGS)) { | 4519 | if (unlikely(bnx2_tx_avail(bp) <= MAX_SKB_FRAGS)) { |
4515 | spin_lock(&bp->tx_lock); | ||
4516 | netif_stop_queue(dev); | 4520 | netif_stop_queue(dev); |
4517 | 4521 | if (bnx2_tx_avail(bp) > bp->tx_wake_thresh) | |
4518 | if (bnx2_tx_avail(bp) > MAX_SKB_FRAGS) | ||
4519 | netif_wake_queue(dev); | 4522 | netif_wake_queue(dev); |
4520 | spin_unlock(&bp->tx_lock); | ||
4521 | } | 4523 | } |
4522 | 4524 | ||
4523 | return NETDEV_TX_OK; | 4525 | return NETDEV_TX_OK; |
@@ -5628,7 +5630,6 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) | |||
5628 | bp->pdev = pdev; | 5630 | bp->pdev = pdev; |
5629 | 5631 | ||
5630 | spin_lock_init(&bp->phy_lock); | 5632 | spin_lock_init(&bp->phy_lock); |
5631 | spin_lock_init(&bp->tx_lock); | ||
5632 | INIT_WORK(&bp->reset_task, bnx2_reset_task, bp); | 5633 | INIT_WORK(&bp->reset_task, bnx2_reset_task, bp); |
5633 | 5634 | ||
5634 | dev->base_addr = dev->mem_start = pci_resource_start(pdev, 0); | 5635 | dev->base_addr = dev->mem_start = pci_resource_start(pdev, 0); |
@@ -5751,7 +5752,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) | |||
5751 | bp->mac_addr[5] = (u8) reg; | 5752 | bp->mac_addr[5] = (u8) reg; |
5752 | 5753 | ||
5753 | bp->tx_ring_size = MAX_TX_DESC_CNT; | 5754 | bp->tx_ring_size = MAX_TX_DESC_CNT; |
5754 | bnx2_set_rx_ring_size(bp, 100); | 5755 | bnx2_set_rx_ring_size(bp, 255); |
5755 | 5756 | ||
5756 | bp->rx_csum = 1; | 5757 | bp->rx_csum = 1; |
5757 | 5758 | ||
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h index 658c5ee95c73..fe804763c607 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h | |||
@@ -3890,10 +3890,6 @@ struct bnx2 { | |||
3890 | u32 tx_prod_bseq __attribute__((aligned(L1_CACHE_BYTES))); | 3890 | u32 tx_prod_bseq __attribute__((aligned(L1_CACHE_BYTES))); |
3891 | u16 tx_prod; | 3891 | u16 tx_prod; |
3892 | 3892 | ||
3893 | struct tx_bd *tx_desc_ring; | ||
3894 | struct sw_bd *tx_buf_ring; | ||
3895 | int tx_ring_size; | ||
3896 | |||
3897 | u16 tx_cons __attribute__((aligned(L1_CACHE_BYTES))); | 3893 | u16 tx_cons __attribute__((aligned(L1_CACHE_BYTES))); |
3898 | u16 hw_tx_cons; | 3894 | u16 hw_tx_cons; |
3899 | 3895 | ||
@@ -3916,9 +3912,11 @@ struct bnx2 { | |||
3916 | struct sw_bd *rx_buf_ring; | 3912 | struct sw_bd *rx_buf_ring; |
3917 | struct rx_bd *rx_desc_ring[MAX_RX_RINGS]; | 3913 | struct rx_bd *rx_desc_ring[MAX_RX_RINGS]; |
3918 | 3914 | ||
3919 | /* Only used to synchronize netif_stop_queue/wake_queue when tx */ | 3915 | /* TX constants */ |
3920 | /* ring is full */ | 3916 | struct tx_bd *tx_desc_ring; |
3921 | spinlock_t tx_lock; | 3917 | struct sw_bd *tx_buf_ring; |
3918 | int tx_ring_size; | ||
3919 | u32 tx_wake_thresh; | ||
3922 | 3920 | ||
3923 | /* End of fields used in the performance code paths. */ | 3921 | /* End of fields used in the performance code paths. */ |
3924 | 3922 | ||
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index da62db897426..627f224d78bc 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -3127,7 +3127,7 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu) | |||
3127 | break; | 3127 | break; |
3128 | } | 3128 | } |
3129 | 3129 | ||
3130 | /* NOTE: dev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN | 3130 | /* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN |
3131 | * means we reserve 2 more, this pushes us to allocate from the next | 3131 | * means we reserve 2 more, this pushes us to allocate from the next |
3132 | * larger slab size | 3132 | * larger slab size |
3133 | * i.e. RXBUFFER_2048 --> size-4096 slab */ | 3133 | * i.e. RXBUFFER_2048 --> size-4096 slab */ |
@@ -3708,7 +3708,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
3708 | #define E1000_CB_LENGTH 256 | 3708 | #define E1000_CB_LENGTH 256 |
3709 | if (length < E1000_CB_LENGTH) { | 3709 | if (length < E1000_CB_LENGTH) { |
3710 | struct sk_buff *new_skb = | 3710 | struct sk_buff *new_skb = |
3711 | dev_alloc_skb(length + NET_IP_ALIGN); | 3711 | netdev_alloc_skb(netdev, length + NET_IP_ALIGN); |
3712 | if (new_skb) { | 3712 | if (new_skb) { |
3713 | skb_reserve(new_skb, NET_IP_ALIGN); | 3713 | skb_reserve(new_skb, NET_IP_ALIGN); |
3714 | new_skb->dev = netdev; | 3714 | new_skb->dev = netdev; |
@@ -3979,7 +3979,7 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter, | |||
3979 | 3979 | ||
3980 | while (cleaned_count--) { | 3980 | while (cleaned_count--) { |
3981 | if (!(skb = buffer_info->skb)) | 3981 | if (!(skb = buffer_info->skb)) |
3982 | skb = dev_alloc_skb(bufsz); | 3982 | skb = netdev_alloc_skb(netdev, bufsz); |
3983 | else { | 3983 | else { |
3984 | skb_trim(skb, 0); | 3984 | skb_trim(skb, 0); |
3985 | goto map_skb; | 3985 | goto map_skb; |
@@ -3997,7 +3997,7 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter, | |||
3997 | DPRINTK(RX_ERR, ERR, "skb align check failed: %u bytes " | 3997 | DPRINTK(RX_ERR, ERR, "skb align check failed: %u bytes " |
3998 | "at %p\n", bufsz, skb->data); | 3998 | "at %p\n", bufsz, skb->data); |
3999 | /* Try again, without freeing the previous */ | 3999 | /* Try again, without freeing the previous */ |
4000 | skb = dev_alloc_skb(bufsz); | 4000 | skb = netdev_alloc_skb(netdev, bufsz); |
4001 | /* Failed allocation, critical failure */ | 4001 | /* Failed allocation, critical failure */ |
4002 | if (!skb) { | 4002 | if (!skb) { |
4003 | dev_kfree_skb(oldskb); | 4003 | dev_kfree_skb(oldskb); |
@@ -4121,7 +4121,8 @@ e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter, | |||
4121 | rx_desc->read.buffer_addr[j+1] = ~0; | 4121 | rx_desc->read.buffer_addr[j+1] = ~0; |
4122 | } | 4122 | } |
4123 | 4123 | ||
4124 | skb = dev_alloc_skb(adapter->rx_ps_bsize0 + NET_IP_ALIGN); | 4124 | skb = netdev_alloc_skb(netdev, |
4125 | adapter->rx_ps_bsize0 + NET_IP_ALIGN); | ||
4125 | 4126 | ||
4126 | if (unlikely(!skb)) { | 4127 | if (unlikely(!skb)) { |
4127 | adapter->alloc_rx_buff_failed++; | 4128 | adapter->alloc_rx_buff_failed++; |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index 07ca9480a6fe..9bdd43ab3573 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -177,6 +177,7 @@ struct myri10ge_priv { | |||
177 | struct work_struct watchdog_work; | 177 | struct work_struct watchdog_work; |
178 | struct timer_list watchdog_timer; | 178 | struct timer_list watchdog_timer; |
179 | int watchdog_tx_done; | 179 | int watchdog_tx_done; |
180 | int watchdog_tx_req; | ||
180 | int watchdog_resets; | 181 | int watchdog_resets; |
181 | int tx_linearized; | 182 | int tx_linearized; |
182 | int pause; | 183 | int pause; |
@@ -448,6 +449,7 @@ static int myri10ge_load_hotplug_firmware(struct myri10ge_priv *mgp, u32 * size) | |||
448 | struct mcp_gen_header *hdr; | 449 | struct mcp_gen_header *hdr; |
449 | size_t hdr_offset; | 450 | size_t hdr_offset; |
450 | int status; | 451 | int status; |
452 | unsigned i; | ||
451 | 453 | ||
452 | if ((status = request_firmware(&fw, mgp->fw_name, dev)) < 0) { | 454 | if ((status = request_firmware(&fw, mgp->fw_name, dev)) < 0) { |
453 | dev_err(dev, "Unable to load %s firmware image via hotplug\n", | 455 | dev_err(dev, "Unable to load %s firmware image via hotplug\n", |
@@ -479,18 +481,12 @@ static int myri10ge_load_hotplug_firmware(struct myri10ge_priv *mgp, u32 * size) | |||
479 | goto abort_with_fw; | 481 | goto abort_with_fw; |
480 | 482 | ||
481 | crc = crc32(~0, fw->data, fw->size); | 483 | crc = crc32(~0, fw->data, fw->size); |
482 | if (mgp->tx.boundary == 2048) { | 484 | for (i = 0; i < fw->size; i += 256) { |
483 | /* Avoid PCI burst on chipset with unaligned completions. */ | 485 | myri10ge_pio_copy(mgp->sram + MYRI10GE_FW_OFFSET + i, |
484 | int i; | 486 | fw->data + i, |
485 | __iomem u32 *ptr = (__iomem u32 *) (mgp->sram + | 487 | min(256U, (unsigned)(fw->size - i))); |
486 | MYRI10GE_FW_OFFSET); | 488 | mb(); |
487 | for (i = 0; i < fw->size / 4; i++) { | 489 | readb(mgp->sram); |
488 | __raw_writel(((u32 *) fw->data)[i], ptr + i); | ||
489 | wmb(); | ||
490 | } | ||
491 | } else { | ||
492 | myri10ge_pio_copy(mgp->sram + MYRI10GE_FW_OFFSET, fw->data, | ||
493 | fw->size); | ||
494 | } | 490 | } |
495 | /* corruption checking is good for parity recovery and buggy chipset */ | 491 | /* corruption checking is good for parity recovery and buggy chipset */ |
496 | memcpy_fromio(fw->data, mgp->sram + MYRI10GE_FW_OFFSET, fw->size); | 492 | memcpy_fromio(fw->data, mgp->sram + MYRI10GE_FW_OFFSET, fw->size); |
@@ -620,7 +616,7 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp) | |||
620 | return -ENXIO; | 616 | return -ENXIO; |
621 | } | 617 | } |
622 | dev_info(&mgp->pdev->dev, "handoff confirmed\n"); | 618 | dev_info(&mgp->pdev->dev, "handoff confirmed\n"); |
623 | myri10ge_dummy_rdma(mgp, mgp->tx.boundary != 4096); | 619 | myri10ge_dummy_rdma(mgp, 1); |
624 | 620 | ||
625 | return 0; | 621 | return 0; |
626 | } | 622 | } |
@@ -2429,7 +2425,7 @@ static int myri10ge_resume(struct pci_dev *pdev) | |||
2429 | } | 2425 | } |
2430 | 2426 | ||
2431 | myri10ge_reset(mgp); | 2427 | myri10ge_reset(mgp); |
2432 | myri10ge_dummy_rdma(mgp, mgp->tx.boundary != 4096); | 2428 | myri10ge_dummy_rdma(mgp, 1); |
2433 | 2429 | ||
2434 | /* Save configuration space to be restored if the | 2430 | /* Save configuration space to be restored if the |
2435 | * nic resets due to a parity error */ | 2431 | * nic resets due to a parity error */ |
@@ -2547,7 +2543,8 @@ static void myri10ge_watchdog_timer(unsigned long arg) | |||
2547 | 2543 | ||
2548 | mgp = (struct myri10ge_priv *)arg; | 2544 | mgp = (struct myri10ge_priv *)arg; |
2549 | if (mgp->tx.req != mgp->tx.done && | 2545 | if (mgp->tx.req != mgp->tx.done && |
2550 | mgp->tx.done == mgp->watchdog_tx_done) | 2546 | mgp->tx.done == mgp->watchdog_tx_done && |
2547 | mgp->watchdog_tx_req != mgp->watchdog_tx_done) | ||
2551 | /* nic seems like it might be stuck.. */ | 2548 | /* nic seems like it might be stuck.. */ |
2552 | schedule_work(&mgp->watchdog_work); | 2549 | schedule_work(&mgp->watchdog_work); |
2553 | else | 2550 | else |
@@ -2556,6 +2553,7 @@ static void myri10ge_watchdog_timer(unsigned long arg) | |||
2556 | jiffies + myri10ge_watchdog_timeout * HZ); | 2553 | jiffies + myri10ge_watchdog_timeout * HZ); |
2557 | 2554 | ||
2558 | mgp->watchdog_tx_done = mgp->tx.done; | 2555 | mgp->watchdog_tx_done = mgp->tx.done; |
2556 | mgp->watchdog_tx_req = mgp->tx.req; | ||
2559 | } | 2557 | } |
2560 | 2558 | ||
2561 | static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | 2559 | static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 7d5c2233c252..f5aad77288f9 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c | |||
@@ -419,9 +419,8 @@ void phy_start_machine(struct phy_device *phydev, | |||
419 | 419 | ||
420 | /* phy_stop_machine | 420 | /* phy_stop_machine |
421 | * | 421 | * |
422 | * description: Stops the state machine timer, sets the state to | 422 | * description: Stops the state machine timer, sets the state to UP |
423 | * UP (unless it wasn't up yet), and then frees the interrupt, | 423 | * (unless it wasn't up yet). This function must be called BEFORE |
424 | * if it is in use. This function must be called BEFORE | ||
425 | * phy_detach. | 424 | * phy_detach. |
426 | */ | 425 | */ |
427 | void phy_stop_machine(struct phy_device *phydev) | 426 | void phy_stop_machine(struct phy_device *phydev) |
@@ -433,9 +432,6 @@ void phy_stop_machine(struct phy_device *phydev) | |||
433 | phydev->state = PHY_UP; | 432 | phydev->state = PHY_UP; |
434 | spin_unlock(&phydev->lock); | 433 | spin_unlock(&phydev->lock); |
435 | 434 | ||
436 | if (phydev->irq != PHY_POLL) | ||
437 | phy_stop_interrupts(phydev); | ||
438 | |||
439 | phydev->adjust_state = NULL; | 435 | phydev->adjust_state = NULL; |
440 | } | 436 | } |
441 | 437 | ||
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c index 0ec6e9d57b94..c872f7c6cce3 100644 --- a/drivers/net/ppp_generic.c +++ b/drivers/net/ppp_generic.c | |||
@@ -192,7 +192,7 @@ struct cardmap { | |||
192 | void *ptr[CARDMAP_WIDTH]; | 192 | void *ptr[CARDMAP_WIDTH]; |
193 | }; | 193 | }; |
194 | static void *cardmap_get(struct cardmap *map, unsigned int nr); | 194 | static void *cardmap_get(struct cardmap *map, unsigned int nr); |
195 | static void cardmap_set(struct cardmap **map, unsigned int nr, void *ptr); | 195 | static int cardmap_set(struct cardmap **map, unsigned int nr, void *ptr); |
196 | static unsigned int cardmap_find_first_free(struct cardmap *map); | 196 | static unsigned int cardmap_find_first_free(struct cardmap *map); |
197 | static void cardmap_destroy(struct cardmap **map); | 197 | static void cardmap_destroy(struct cardmap **map); |
198 | 198 | ||
@@ -1995,10 +1995,9 @@ ppp_register_channel(struct ppp_channel *chan) | |||
1995 | { | 1995 | { |
1996 | struct channel *pch; | 1996 | struct channel *pch; |
1997 | 1997 | ||
1998 | pch = kmalloc(sizeof(struct channel), GFP_KERNEL); | 1998 | pch = kzalloc(sizeof(struct channel), GFP_KERNEL); |
1999 | if (pch == 0) | 1999 | if (pch == 0) |
2000 | return -ENOMEM; | 2000 | return -ENOMEM; |
2001 | memset(pch, 0, sizeof(struct channel)); | ||
2002 | pch->ppp = NULL; | 2001 | pch->ppp = NULL; |
2003 | pch->chan = chan; | 2002 | pch->chan = chan; |
2004 | chan->ppp = pch; | 2003 | chan->ppp = pch; |
@@ -2408,13 +2407,12 @@ ppp_create_interface(int unit, int *retp) | |||
2408 | int ret = -ENOMEM; | 2407 | int ret = -ENOMEM; |
2409 | int i; | 2408 | int i; |
2410 | 2409 | ||
2411 | ppp = kmalloc(sizeof(struct ppp), GFP_KERNEL); | 2410 | ppp = kzalloc(sizeof(struct ppp), GFP_KERNEL); |
2412 | if (!ppp) | 2411 | if (!ppp) |
2413 | goto out; | 2412 | goto out; |
2414 | dev = alloc_netdev(0, "", ppp_setup); | 2413 | dev = alloc_netdev(0, "", ppp_setup); |
2415 | if (!dev) | 2414 | if (!dev) |
2416 | goto out1; | 2415 | goto out1; |
2417 | memset(ppp, 0, sizeof(struct ppp)); | ||
2418 | 2416 | ||
2419 | ppp->mru = PPP_MRU; | 2417 | ppp->mru = PPP_MRU; |
2420 | init_ppp_file(&ppp->file, INTERFACE); | 2418 | init_ppp_file(&ppp->file, INTERFACE); |
@@ -2454,11 +2452,16 @@ ppp_create_interface(int unit, int *retp) | |||
2454 | } | 2452 | } |
2455 | 2453 | ||
2456 | atomic_inc(&ppp_unit_count); | 2454 | atomic_inc(&ppp_unit_count); |
2457 | cardmap_set(&all_ppp_units, unit, ppp); | 2455 | ret = cardmap_set(&all_ppp_units, unit, ppp); |
2456 | if (ret != 0) | ||
2457 | goto out3; | ||
2458 | |||
2458 | mutex_unlock(&all_ppp_mutex); | 2459 | mutex_unlock(&all_ppp_mutex); |
2459 | *retp = 0; | 2460 | *retp = 0; |
2460 | return ppp; | 2461 | return ppp; |
2461 | 2462 | ||
2463 | out3: | ||
2464 | atomic_dec(&ppp_unit_count); | ||
2462 | out2: | 2465 | out2: |
2463 | mutex_unlock(&all_ppp_mutex); | 2466 | mutex_unlock(&all_ppp_mutex); |
2464 | free_netdev(dev); | 2467 | free_netdev(dev); |
@@ -2695,7 +2698,7 @@ static void *cardmap_get(struct cardmap *map, unsigned int nr) | |||
2695 | return NULL; | 2698 | return NULL; |
2696 | } | 2699 | } |
2697 | 2700 | ||
2698 | static void cardmap_set(struct cardmap **pmap, unsigned int nr, void *ptr) | 2701 | static int cardmap_set(struct cardmap **pmap, unsigned int nr, void *ptr) |
2699 | { | 2702 | { |
2700 | struct cardmap *p; | 2703 | struct cardmap *p; |
2701 | int i; | 2704 | int i; |
@@ -2704,8 +2707,9 @@ static void cardmap_set(struct cardmap **pmap, unsigned int nr, void *ptr) | |||
2704 | if (p == NULL || (nr >> p->shift) >= CARDMAP_WIDTH) { | 2707 | if (p == NULL || (nr >> p->shift) >= CARDMAP_WIDTH) { |
2705 | do { | 2708 | do { |
2706 | /* need a new top level */ | 2709 | /* need a new top level */ |
2707 | struct cardmap *np = kmalloc(sizeof(*np), GFP_KERNEL); | 2710 | struct cardmap *np = kzalloc(sizeof(*np), GFP_KERNEL); |
2708 | memset(np, 0, sizeof(*np)); | 2711 | if (!np) |
2712 | goto enomem; | ||
2709 | np->ptr[0] = p; | 2713 | np->ptr[0] = p; |
2710 | if (p != NULL) { | 2714 | if (p != NULL) { |
2711 | np->shift = p->shift + CARDMAP_ORDER; | 2715 | np->shift = p->shift + CARDMAP_ORDER; |
@@ -2719,8 +2723,9 @@ static void cardmap_set(struct cardmap **pmap, unsigned int nr, void *ptr) | |||
2719 | while (p->shift > 0) { | 2723 | while (p->shift > 0) { |
2720 | i = (nr >> p->shift) & CARDMAP_MASK; | 2724 | i = (nr >> p->shift) & CARDMAP_MASK; |
2721 | if (p->ptr[i] == NULL) { | 2725 | if (p->ptr[i] == NULL) { |
2722 | struct cardmap *np = kmalloc(sizeof(*np), GFP_KERNEL); | 2726 | struct cardmap *np = kzalloc(sizeof(*np), GFP_KERNEL); |
2723 | memset(np, 0, sizeof(*np)); | 2727 | if (!np) |
2728 | goto enomem; | ||
2724 | np->shift = p->shift - CARDMAP_ORDER; | 2729 | np->shift = p->shift - CARDMAP_ORDER; |
2725 | np->parent = p; | 2730 | np->parent = p; |
2726 | p->ptr[i] = np; | 2731 | p->ptr[i] = np; |
@@ -2735,6 +2740,9 @@ static void cardmap_set(struct cardmap **pmap, unsigned int nr, void *ptr) | |||
2735 | set_bit(i, &p->inuse); | 2740 | set_bit(i, &p->inuse); |
2736 | else | 2741 | else |
2737 | clear_bit(i, &p->inuse); | 2742 | clear_bit(i, &p->inuse); |
2743 | return 0; | ||
2744 | enomem: | ||
2745 | return -ENOMEM; | ||
2738 | } | 2746 | } |
2739 | 2747 | ||
2740 | static unsigned int cardmap_find_first_free(struct cardmap *map) | 2748 | static unsigned int cardmap_find_first_free(struct cardmap *map) |
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index e1fe3a0a7b0b..132ed32bce1a 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
@@ -76,7 +76,7 @@ | |||
76 | #include "s2io.h" | 76 | #include "s2io.h" |
77 | #include "s2io-regs.h" | 77 | #include "s2io-regs.h" |
78 | 78 | ||
79 | #define DRV_VERSION "2.0.14.2" | 79 | #define DRV_VERSION "2.0.15.2" |
80 | 80 | ||
81 | /* S2io Driver name & version. */ | 81 | /* S2io Driver name & version. */ |
82 | static char s2io_driver_name[] = "Neterion"; | 82 | static char s2io_driver_name[] = "Neterion"; |
@@ -370,38 +370,50 @@ static const u64 fix_mac[] = { | |||
370 | END_SIGN | 370 | END_SIGN |
371 | }; | 371 | }; |
372 | 372 | ||
373 | MODULE_AUTHOR("Raghavendra Koushik <raghavendra.koushik@neterion.com>"); | ||
374 | MODULE_LICENSE("GPL"); | ||
375 | MODULE_VERSION(DRV_VERSION); | ||
376 | |||
377 | |||
373 | /* Module Loadable parameters. */ | 378 | /* Module Loadable parameters. */ |
374 | static unsigned int tx_fifo_num = 1; | 379 | S2IO_PARM_INT(tx_fifo_num, 1); |
375 | static unsigned int tx_fifo_len[MAX_TX_FIFOS] = | 380 | S2IO_PARM_INT(rx_ring_num, 1); |
376 | {DEFAULT_FIFO_0_LEN, [1 ...(MAX_TX_FIFOS - 1)] = DEFAULT_FIFO_1_7_LEN}; | 381 | |
377 | static unsigned int rx_ring_num = 1; | 382 | |
378 | static unsigned int rx_ring_sz[MAX_RX_RINGS] = | 383 | S2IO_PARM_INT(rx_ring_mode, 1); |
379 | {[0 ...(MAX_RX_RINGS - 1)] = SMALL_BLK_CNT}; | 384 | S2IO_PARM_INT(use_continuous_tx_intrs, 1); |
380 | static unsigned int rts_frm_len[MAX_RX_RINGS] = | 385 | S2IO_PARM_INT(rmac_pause_time, 0x100); |
381 | {[0 ...(MAX_RX_RINGS - 1)] = 0 }; | 386 | S2IO_PARM_INT(mc_pause_threshold_q0q3, 187); |
382 | static unsigned int rx_ring_mode = 1; | 387 | S2IO_PARM_INT(mc_pause_threshold_q4q7, 187); |
383 | static unsigned int use_continuous_tx_intrs = 1; | 388 | S2IO_PARM_INT(shared_splits, 0); |
384 | static unsigned int rmac_pause_time = 0x100; | 389 | S2IO_PARM_INT(tmac_util_period, 5); |
385 | static unsigned int mc_pause_threshold_q0q3 = 187; | 390 | S2IO_PARM_INT(rmac_util_period, 5); |
386 | static unsigned int mc_pause_threshold_q4q7 = 187; | 391 | S2IO_PARM_INT(bimodal, 0); |
387 | static unsigned int shared_splits; | 392 | S2IO_PARM_INT(l3l4hdr_size, 128); |
388 | static unsigned int tmac_util_period = 5; | ||
389 | static unsigned int rmac_util_period = 5; | ||
390 | static unsigned int bimodal = 0; | ||
391 | static unsigned int l3l4hdr_size = 128; | ||
392 | #ifndef CONFIG_S2IO_NAPI | ||
393 | static unsigned int indicate_max_pkts; | ||
394 | #endif | ||
395 | /* Frequency of Rx desc syncs expressed as power of 2 */ | 393 | /* Frequency of Rx desc syncs expressed as power of 2 */ |
396 | static unsigned int rxsync_frequency = 3; | 394 | S2IO_PARM_INT(rxsync_frequency, 3); |
397 | /* Interrupt type. Values can be 0(INTA), 1(MSI), 2(MSI_X) */ | 395 | /* Interrupt type. Values can be 0(INTA), 1(MSI), 2(MSI_X) */ |
398 | static unsigned int intr_type = 0; | 396 | S2IO_PARM_INT(intr_type, 0); |
399 | /* Large receive offload feature */ | 397 | /* Large receive offload feature */ |
400 | static unsigned int lro = 0; | 398 | S2IO_PARM_INT(lro, 0); |
401 | /* Max pkts to be aggregated by LRO at one time. If not specified, | 399 | /* Max pkts to be aggregated by LRO at one time. If not specified, |
402 | * aggregation happens until we hit max IP pkt size(64K) | 400 | * aggregation happens until we hit max IP pkt size(64K) |
403 | */ | 401 | */ |
404 | static unsigned int lro_max_pkts = 0xFFFF; | 402 | S2IO_PARM_INT(lro_max_pkts, 0xFFFF); |
403 | #ifndef CONFIG_S2IO_NAPI | ||
404 | S2IO_PARM_INT(indicate_max_pkts, 0); | ||
405 | #endif | ||
406 | |||
407 | static unsigned int tx_fifo_len[MAX_TX_FIFOS] = | ||
408 | {DEFAULT_FIFO_0_LEN, [1 ...(MAX_TX_FIFOS - 1)] = DEFAULT_FIFO_1_7_LEN}; | ||
409 | static unsigned int rx_ring_sz[MAX_RX_RINGS] = | ||
410 | {[0 ...(MAX_RX_RINGS - 1)] = SMALL_BLK_CNT}; | ||
411 | static unsigned int rts_frm_len[MAX_RX_RINGS] = | ||
412 | {[0 ...(MAX_RX_RINGS - 1)] = 0 }; | ||
413 | |||
414 | module_param_array(tx_fifo_len, uint, NULL, 0); | ||
415 | module_param_array(rx_ring_sz, uint, NULL, 0); | ||
416 | module_param_array(rts_frm_len, uint, NULL, 0); | ||
405 | 417 | ||
406 | /* | 418 | /* |
407 | * S2IO device table. | 419 | * S2IO device table. |
@@ -464,10 +476,9 @@ static int init_shared_mem(struct s2io_nic *nic) | |||
464 | size += config->tx_cfg[i].fifo_len; | 476 | size += config->tx_cfg[i].fifo_len; |
465 | } | 477 | } |
466 | if (size > MAX_AVAILABLE_TXDS) { | 478 | if (size > MAX_AVAILABLE_TXDS) { |
467 | DBG_PRINT(ERR_DBG, "%s: Requested TxDs too high, ", | 479 | DBG_PRINT(ERR_DBG, "s2io: Requested TxDs too high, "); |
468 | __FUNCTION__); | ||
469 | DBG_PRINT(ERR_DBG, "Requested: %d, max supported: 8192\n", size); | 480 | DBG_PRINT(ERR_DBG, "Requested: %d, max supported: 8192\n", size); |
470 | return FAILURE; | 481 | return -EINVAL; |
471 | } | 482 | } |
472 | 483 | ||
473 | lst_size = (sizeof(TxD_t) * config->max_txds); | 484 | lst_size = (sizeof(TxD_t) * config->max_txds); |
@@ -547,6 +558,7 @@ static int init_shared_mem(struct s2io_nic *nic) | |||
547 | nic->ufo_in_band_v = kmalloc((sizeof(u64) * size), GFP_KERNEL); | 558 | nic->ufo_in_band_v = kmalloc((sizeof(u64) * size), GFP_KERNEL); |
548 | if (!nic->ufo_in_band_v) | 559 | if (!nic->ufo_in_band_v) |
549 | return -ENOMEM; | 560 | return -ENOMEM; |
561 | memset(nic->ufo_in_band_v, 0, size); | ||
550 | 562 | ||
551 | /* Allocation and initialization of RXDs in Rings */ | 563 | /* Allocation and initialization of RXDs in Rings */ |
552 | size = 0; | 564 | size = 0; |
@@ -1213,7 +1225,7 @@ static int init_nic(struct s2io_nic *nic) | |||
1213 | break; | 1225 | break; |
1214 | } | 1226 | } |
1215 | 1227 | ||
1216 | /* Enable Tx FIFO partition 0. */ | 1228 | /* Enable all configured Tx FIFO partitions */ |
1217 | val64 = readq(&bar0->tx_fifo_partition_0); | 1229 | val64 = readq(&bar0->tx_fifo_partition_0); |
1218 | val64 |= (TX_FIFO_PARTITION_EN); | 1230 | val64 |= (TX_FIFO_PARTITION_EN); |
1219 | writeq(val64, &bar0->tx_fifo_partition_0); | 1231 | writeq(val64, &bar0->tx_fifo_partition_0); |
@@ -1650,7 +1662,7 @@ static void en_dis_able_nic_intrs(struct s2io_nic *nic, u16 mask, int flag) | |||
1650 | writeq(temp64, &bar0->general_int_mask); | 1662 | writeq(temp64, &bar0->general_int_mask); |
1651 | /* | 1663 | /* |
1652 | * If Hercules adapter enable GPIO otherwise | 1664 | * If Hercules adapter enable GPIO otherwise |
1653 | * disabled all PCIX, Flash, MDIO, IIC and GPIO | 1665 | * disable all PCIX, Flash, MDIO, IIC and GPIO |
1654 | * interrupts for now. | 1666 | * interrupts for now. |
1655 | * TODO | 1667 | * TODO |
1656 | */ | 1668 | */ |
@@ -2119,7 +2131,7 @@ static struct sk_buff *s2io_txdl_getskb(fifo_info_t *fifo_data, TxD_t *txdlp, in | |||
2119 | frag->size, PCI_DMA_TODEVICE); | 2131 | frag->size, PCI_DMA_TODEVICE); |
2120 | } | 2132 | } |
2121 | } | 2133 | } |
2122 | txdlp->Host_Control = 0; | 2134 | memset(txdlp,0, (sizeof(TxD_t) * fifo_data->max_txds)); |
2123 | return(skb); | 2135 | return(skb); |
2124 | } | 2136 | } |
2125 | 2137 | ||
@@ -2371,9 +2383,14 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no) | |||
2371 | skb->data = (void *) (unsigned long)tmp; | 2383 | skb->data = (void *) (unsigned long)tmp; |
2372 | skb->tail = (void *) (unsigned long)tmp; | 2384 | skb->tail = (void *) (unsigned long)tmp; |
2373 | 2385 | ||
2374 | ((RxD3_t*)rxdp)->Buffer0_ptr = | 2386 | if (!(((RxD3_t*)rxdp)->Buffer0_ptr)) |
2375 | pci_map_single(nic->pdev, ba->ba_0, BUF0_LEN, | 2387 | ((RxD3_t*)rxdp)->Buffer0_ptr = |
2388 | pci_map_single(nic->pdev, ba->ba_0, BUF0_LEN, | ||
2376 | PCI_DMA_FROMDEVICE); | 2389 | PCI_DMA_FROMDEVICE); |
2390 | else | ||
2391 | pci_dma_sync_single_for_device(nic->pdev, | ||
2392 | (dma_addr_t) ((RxD3_t*)rxdp)->Buffer0_ptr, | ||
2393 | BUF0_LEN, PCI_DMA_FROMDEVICE); | ||
2377 | rxdp->Control_2 = SET_BUFFER0_SIZE_3(BUF0_LEN); | 2394 | rxdp->Control_2 = SET_BUFFER0_SIZE_3(BUF0_LEN); |
2378 | if (nic->rxd_mode == RXD_MODE_3B) { | 2395 | if (nic->rxd_mode == RXD_MODE_3B) { |
2379 | /* Two buffer mode */ | 2396 | /* Two buffer mode */ |
@@ -2386,10 +2403,13 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no) | |||
2386 | (nic->pdev, skb->data, dev->mtu + 4, | 2403 | (nic->pdev, skb->data, dev->mtu + 4, |
2387 | PCI_DMA_FROMDEVICE); | 2404 | PCI_DMA_FROMDEVICE); |
2388 | 2405 | ||
2389 | /* Buffer-1 will be dummy buffer not used */ | 2406 | /* Buffer-1 will be dummy buffer. Not used */ |
2390 | ((RxD3_t*)rxdp)->Buffer1_ptr = | 2407 | if (!(((RxD3_t*)rxdp)->Buffer1_ptr)) { |
2391 | pci_map_single(nic->pdev, ba->ba_1, BUF1_LEN, | 2408 | ((RxD3_t*)rxdp)->Buffer1_ptr = |
2392 | PCI_DMA_FROMDEVICE); | 2409 | pci_map_single(nic->pdev, |
2410 | ba->ba_1, BUF1_LEN, | ||
2411 | PCI_DMA_FROMDEVICE); | ||
2412 | } | ||
2393 | rxdp->Control_2 |= SET_BUFFER1_SIZE_3(1); | 2413 | rxdp->Control_2 |= SET_BUFFER1_SIZE_3(1); |
2394 | rxdp->Control_2 |= SET_BUFFER2_SIZE_3 | 2414 | rxdp->Control_2 |= SET_BUFFER2_SIZE_3 |
2395 | (dev->mtu + 4); | 2415 | (dev->mtu + 4); |
@@ -2614,23 +2634,23 @@ no_rx: | |||
2614 | } | 2634 | } |
2615 | #endif | 2635 | #endif |
2616 | 2636 | ||
2637 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
2617 | /** | 2638 | /** |
2618 | * s2io_netpoll - Rx interrupt service handler for netpoll support | 2639 | * s2io_netpoll - netpoll event handler entry point |
2619 | * @dev : pointer to the device structure. | 2640 | * @dev : pointer to the device structure. |
2620 | * Description: | 2641 | * Description: |
2621 | * Polling 'interrupt' - used by things like netconsole to send skbs | 2642 | * This function will be called by upper layer to check for events on the |
2622 | * without having to re-enable interrupts. It's not called while | 2643 | * interface in situations where interrupts are disabled. It is used for |
2623 | * the interrupt routine is executing. | 2644 | * specific in-kernel networking tasks, such as remote consoles and kernel |
2645 | * debugging over the network (example netdump in RedHat). | ||
2624 | */ | 2646 | */ |
2625 | |||
2626 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
2627 | static void s2io_netpoll(struct net_device *dev) | 2647 | static void s2io_netpoll(struct net_device *dev) |
2628 | { | 2648 | { |
2629 | nic_t *nic = dev->priv; | 2649 | nic_t *nic = dev->priv; |
2630 | mac_info_t *mac_control; | 2650 | mac_info_t *mac_control; |
2631 | struct config_param *config; | 2651 | struct config_param *config; |
2632 | XENA_dev_config_t __iomem *bar0 = nic->bar0; | 2652 | XENA_dev_config_t __iomem *bar0 = nic->bar0; |
2633 | u64 val64; | 2653 | u64 val64 = 0xFFFFFFFFFFFFFFFFULL; |
2634 | int i; | 2654 | int i; |
2635 | 2655 | ||
2636 | disable_irq(dev->irq); | 2656 | disable_irq(dev->irq); |
@@ -2639,9 +2659,17 @@ static void s2io_netpoll(struct net_device *dev) | |||
2639 | mac_control = &nic->mac_control; | 2659 | mac_control = &nic->mac_control; |
2640 | config = &nic->config; | 2660 | config = &nic->config; |
2641 | 2661 | ||
2642 | val64 = readq(&bar0->rx_traffic_int); | ||
2643 | writeq(val64, &bar0->rx_traffic_int); | 2662 | writeq(val64, &bar0->rx_traffic_int); |
2663 | writeq(val64, &bar0->tx_traffic_int); | ||
2644 | 2664 | ||
2665 | /* we need to free up the transmitted skbufs or else netpoll will | ||
2666 | * run out of skbs and will fail and eventually netpoll application such | ||
2667 | * as netdump will fail. | ||
2668 | */ | ||
2669 | for (i = 0; i < config->tx_fifo_num; i++) | ||
2670 | tx_intr_handler(&mac_control->fifos[i]); | ||
2671 | |||
2672 | /* check for received packet and indicate up to network */ | ||
2645 | for (i = 0; i < config->rx_ring_num; i++) | 2673 | for (i = 0; i < config->rx_ring_num; i++) |
2646 | rx_intr_handler(&mac_control->rings[i]); | 2674 | rx_intr_handler(&mac_control->rings[i]); |
2647 | 2675 | ||
@@ -2708,7 +2736,7 @@ static void rx_intr_handler(ring_info_t *ring_data) | |||
2708 | /* If your are next to put index then it's FIFO full condition */ | 2736 | /* If your are next to put index then it's FIFO full condition */ |
2709 | if ((get_block == put_block) && | 2737 | if ((get_block == put_block) && |
2710 | (get_info.offset + 1) == put_info.offset) { | 2738 | (get_info.offset + 1) == put_info.offset) { |
2711 | DBG_PRINT(ERR_DBG, "%s: Ring Full\n",dev->name); | 2739 | DBG_PRINT(INTR_DBG, "%s: Ring Full\n",dev->name); |
2712 | break; | 2740 | break; |
2713 | } | 2741 | } |
2714 | skb = (struct sk_buff *) ((unsigned long)rxdp->Host_Control); | 2742 | skb = (struct sk_buff *) ((unsigned long)rxdp->Host_Control); |
@@ -2728,18 +2756,15 @@ static void rx_intr_handler(ring_info_t *ring_data) | |||
2728 | HEADER_SNAP_SIZE, | 2756 | HEADER_SNAP_SIZE, |
2729 | PCI_DMA_FROMDEVICE); | 2757 | PCI_DMA_FROMDEVICE); |
2730 | } else if (nic->rxd_mode == RXD_MODE_3B) { | 2758 | } else if (nic->rxd_mode == RXD_MODE_3B) { |
2731 | pci_unmap_single(nic->pdev, (dma_addr_t) | 2759 | pci_dma_sync_single_for_cpu(nic->pdev, (dma_addr_t) |
2732 | ((RxD3_t*)rxdp)->Buffer0_ptr, | 2760 | ((RxD3_t*)rxdp)->Buffer0_ptr, |
2733 | BUF0_LEN, PCI_DMA_FROMDEVICE); | 2761 | BUF0_LEN, PCI_DMA_FROMDEVICE); |
2734 | pci_unmap_single(nic->pdev, (dma_addr_t) | 2762 | pci_unmap_single(nic->pdev, (dma_addr_t) |
2735 | ((RxD3_t*)rxdp)->Buffer1_ptr, | ||
2736 | BUF1_LEN, PCI_DMA_FROMDEVICE); | ||
2737 | pci_unmap_single(nic->pdev, (dma_addr_t) | ||
2738 | ((RxD3_t*)rxdp)->Buffer2_ptr, | 2763 | ((RxD3_t*)rxdp)->Buffer2_ptr, |
2739 | dev->mtu + 4, | 2764 | dev->mtu + 4, |
2740 | PCI_DMA_FROMDEVICE); | 2765 | PCI_DMA_FROMDEVICE); |
2741 | } else { | 2766 | } else { |
2742 | pci_unmap_single(nic->pdev, (dma_addr_t) | 2767 | pci_dma_sync_single_for_cpu(nic->pdev, (dma_addr_t) |
2743 | ((RxD3_t*)rxdp)->Buffer0_ptr, BUF0_LEN, | 2768 | ((RxD3_t*)rxdp)->Buffer0_ptr, BUF0_LEN, |
2744 | PCI_DMA_FROMDEVICE); | 2769 | PCI_DMA_FROMDEVICE); |
2745 | pci_unmap_single(nic->pdev, (dma_addr_t) | 2770 | pci_unmap_single(nic->pdev, (dma_addr_t) |
@@ -3327,7 +3352,7 @@ static void s2io_reset(nic_t * sp) | |||
3327 | 3352 | ||
3328 | /* Clear certain PCI/PCI-X fields after reset */ | 3353 | /* Clear certain PCI/PCI-X fields after reset */ |
3329 | if (sp->device_type == XFRAME_II_DEVICE) { | 3354 | if (sp->device_type == XFRAME_II_DEVICE) { |
3330 | /* Clear parity err detect bit */ | 3355 | /* Clear "detected parity error" bit */ |
3331 | pci_write_config_word(sp->pdev, PCI_STATUS, 0x8000); | 3356 | pci_write_config_word(sp->pdev, PCI_STATUS, 0x8000); |
3332 | 3357 | ||
3333 | /* Clearing PCIX Ecc status register */ | 3358 | /* Clearing PCIX Ecc status register */ |
@@ -3528,7 +3553,7 @@ static void restore_xmsi_data(nic_t *nic) | |||
3528 | u64 val64; | 3553 | u64 val64; |
3529 | int i; | 3554 | int i; |
3530 | 3555 | ||
3531 | for (i=0; i< nic->avail_msix_vectors; i++) { | 3556 | for (i=0; i < MAX_REQUESTED_MSI_X; i++) { |
3532 | writeq(nic->msix_info[i].addr, &bar0->xmsi_address); | 3557 | writeq(nic->msix_info[i].addr, &bar0->xmsi_address); |
3533 | writeq(nic->msix_info[i].data, &bar0->xmsi_data); | 3558 | writeq(nic->msix_info[i].data, &bar0->xmsi_data); |
3534 | val64 = (BIT(7) | BIT(15) | vBIT(i, 26, 6)); | 3559 | val64 = (BIT(7) | BIT(15) | vBIT(i, 26, 6)); |
@@ -3547,7 +3572,7 @@ static void store_xmsi_data(nic_t *nic) | |||
3547 | int i; | 3572 | int i; |
3548 | 3573 | ||
3549 | /* Store and display */ | 3574 | /* Store and display */ |
3550 | for (i=0; i< nic->avail_msix_vectors; i++) { | 3575 | for (i=0; i < MAX_REQUESTED_MSI_X; i++) { |
3551 | val64 = (BIT(15) | vBIT(i, 26, 6)); | 3576 | val64 = (BIT(15) | vBIT(i, 26, 6)); |
3552 | writeq(val64, &bar0->xmsi_access); | 3577 | writeq(val64, &bar0->xmsi_access); |
3553 | if (wait_for_msix_trans(nic, i)) { | 3578 | if (wait_for_msix_trans(nic, i)) { |
@@ -3808,13 +3833,11 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3808 | TxD_t *txdp; | 3833 | TxD_t *txdp; |
3809 | TxFIFO_element_t __iomem *tx_fifo; | 3834 | TxFIFO_element_t __iomem *tx_fifo; |
3810 | unsigned long flags; | 3835 | unsigned long flags; |
3811 | #ifdef NETIF_F_TSO | ||
3812 | int mss; | ||
3813 | #endif | ||
3814 | u16 vlan_tag = 0; | 3836 | u16 vlan_tag = 0; |
3815 | int vlan_priority = 0; | 3837 | int vlan_priority = 0; |
3816 | mac_info_t *mac_control; | 3838 | mac_info_t *mac_control; |
3817 | struct config_param *config; | 3839 | struct config_param *config; |
3840 | int offload_type; | ||
3818 | 3841 | ||
3819 | mac_control = &sp->mac_control; | 3842 | mac_control = &sp->mac_control; |
3820 | config = &sp->config; | 3843 | config = &sp->config; |
@@ -3862,13 +3885,11 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3862 | return 0; | 3885 | return 0; |
3863 | } | 3886 | } |
3864 | 3887 | ||
3865 | txdp->Control_1 = 0; | 3888 | offload_type = s2io_offload_type(skb); |
3866 | txdp->Control_2 = 0; | ||
3867 | #ifdef NETIF_F_TSO | 3889 | #ifdef NETIF_F_TSO |
3868 | mss = skb_shinfo(skb)->gso_size; | 3890 | if (offload_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { |
3869 | if (skb_shinfo(skb)->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { | ||
3870 | txdp->Control_1 |= TXD_TCP_LSO_EN; | 3891 | txdp->Control_1 |= TXD_TCP_LSO_EN; |
3871 | txdp->Control_1 |= TXD_TCP_LSO_MSS(mss); | 3892 | txdp->Control_1 |= TXD_TCP_LSO_MSS(s2io_tcp_mss(skb)); |
3872 | } | 3893 | } |
3873 | #endif | 3894 | #endif |
3874 | if (skb->ip_summed == CHECKSUM_HW) { | 3895 | if (skb->ip_summed == CHECKSUM_HW) { |
@@ -3886,10 +3907,10 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3886 | } | 3907 | } |
3887 | 3908 | ||
3888 | frg_len = skb->len - skb->data_len; | 3909 | frg_len = skb->len - skb->data_len; |
3889 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) { | 3910 | if (offload_type == SKB_GSO_UDP) { |
3890 | int ufo_size; | 3911 | int ufo_size; |
3891 | 3912 | ||
3892 | ufo_size = skb_shinfo(skb)->gso_size; | 3913 | ufo_size = s2io_udp_mss(skb); |
3893 | ufo_size &= ~7; | 3914 | ufo_size &= ~7; |
3894 | txdp->Control_1 |= TXD_UFO_EN; | 3915 | txdp->Control_1 |= TXD_UFO_EN; |
3895 | txdp->Control_1 |= TXD_UFO_MSS(ufo_size); | 3916 | txdp->Control_1 |= TXD_UFO_MSS(ufo_size); |
@@ -3906,16 +3927,13 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3906 | sp->ufo_in_band_v, | 3927 | sp->ufo_in_band_v, |
3907 | sizeof(u64), PCI_DMA_TODEVICE); | 3928 | sizeof(u64), PCI_DMA_TODEVICE); |
3908 | txdp++; | 3929 | txdp++; |
3909 | txdp->Control_1 = 0; | ||
3910 | txdp->Control_2 = 0; | ||
3911 | } | 3930 | } |
3912 | 3931 | ||
3913 | txdp->Buffer_Pointer = pci_map_single | 3932 | txdp->Buffer_Pointer = pci_map_single |
3914 | (sp->pdev, skb->data, frg_len, PCI_DMA_TODEVICE); | 3933 | (sp->pdev, skb->data, frg_len, PCI_DMA_TODEVICE); |
3915 | txdp->Host_Control = (unsigned long) skb; | 3934 | txdp->Host_Control = (unsigned long) skb; |
3916 | txdp->Control_1 |= TXD_BUFFER0_SIZE(frg_len); | 3935 | txdp->Control_1 |= TXD_BUFFER0_SIZE(frg_len); |
3917 | 3936 | if (offload_type == SKB_GSO_UDP) | |
3918 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) | ||
3919 | txdp->Control_1 |= TXD_UFO_EN; | 3937 | txdp->Control_1 |= TXD_UFO_EN; |
3920 | 3938 | ||
3921 | frg_cnt = skb_shinfo(skb)->nr_frags; | 3939 | frg_cnt = skb_shinfo(skb)->nr_frags; |
@@ -3930,12 +3948,12 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3930 | (sp->pdev, frag->page, frag->page_offset, | 3948 | (sp->pdev, frag->page, frag->page_offset, |
3931 | frag->size, PCI_DMA_TODEVICE); | 3949 | frag->size, PCI_DMA_TODEVICE); |
3932 | txdp->Control_1 = TXD_BUFFER0_SIZE(frag->size); | 3950 | txdp->Control_1 = TXD_BUFFER0_SIZE(frag->size); |
3933 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) | 3951 | if (offload_type == SKB_GSO_UDP) |
3934 | txdp->Control_1 |= TXD_UFO_EN; | 3952 | txdp->Control_1 |= TXD_UFO_EN; |
3935 | } | 3953 | } |
3936 | txdp->Control_1 |= TXD_GATHER_CODE_LAST; | 3954 | txdp->Control_1 |= TXD_GATHER_CODE_LAST; |
3937 | 3955 | ||
3938 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) | 3956 | if (offload_type == SKB_GSO_UDP) |
3939 | frg_cnt++; /* as Txd0 was used for inband header */ | 3957 | frg_cnt++; /* as Txd0 was used for inband header */ |
3940 | 3958 | ||
3941 | tx_fifo = mac_control->tx_FIFO_start[queue]; | 3959 | tx_fifo = mac_control->tx_FIFO_start[queue]; |
@@ -3944,13 +3962,9 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3944 | 3962 | ||
3945 | val64 = (TX_FIFO_LAST_TXD_NUM(frg_cnt) | TX_FIFO_FIRST_LIST | | 3963 | val64 = (TX_FIFO_LAST_TXD_NUM(frg_cnt) | TX_FIFO_FIRST_LIST | |
3946 | TX_FIFO_LAST_LIST); | 3964 | TX_FIFO_LAST_LIST); |
3947 | 3965 | if (offload_type) | |
3948 | #ifdef NETIF_F_TSO | ||
3949 | if (mss) | ||
3950 | val64 |= TX_FIFO_SPECIAL_FUNC; | ||
3951 | #endif | ||
3952 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) | ||
3953 | val64 |= TX_FIFO_SPECIAL_FUNC; | 3966 | val64 |= TX_FIFO_SPECIAL_FUNC; |
3967 | |||
3954 | writeq(val64, &tx_fifo->List_Control); | 3968 | writeq(val64, &tx_fifo->List_Control); |
3955 | 3969 | ||
3956 | mmiowb(); | 3970 | mmiowb(); |
@@ -3984,13 +3998,41 @@ s2io_alarm_handle(unsigned long data) | |||
3984 | mod_timer(&sp->alarm_timer, jiffies + HZ / 2); | 3998 | mod_timer(&sp->alarm_timer, jiffies + HZ / 2); |
3985 | } | 3999 | } |
3986 | 4000 | ||
4001 | static int s2io_chk_rx_buffers(nic_t *sp, int rng_n) | ||
4002 | { | ||
4003 | int rxb_size, level; | ||
4004 | |||
4005 | if (!sp->lro) { | ||
4006 | rxb_size = atomic_read(&sp->rx_bufs_left[rng_n]); | ||
4007 | level = rx_buffer_level(sp, rxb_size, rng_n); | ||
4008 | |||
4009 | if ((level == PANIC) && (!TASKLET_IN_USE)) { | ||
4010 | int ret; | ||
4011 | DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", __FUNCTION__); | ||
4012 | DBG_PRINT(INTR_DBG, "PANIC levels\n"); | ||
4013 | if ((ret = fill_rx_buffers(sp, rng_n)) == -ENOMEM) { | ||
4014 | DBG_PRINT(ERR_DBG, "Out of memory in %s", | ||
4015 | __FUNCTION__); | ||
4016 | clear_bit(0, (&sp->tasklet_status)); | ||
4017 | return -1; | ||
4018 | } | ||
4019 | clear_bit(0, (&sp->tasklet_status)); | ||
4020 | } else if (level == LOW) | ||
4021 | tasklet_schedule(&sp->task); | ||
4022 | |||
4023 | } else if (fill_rx_buffers(sp, rng_n) == -ENOMEM) { | ||
4024 | DBG_PRINT(ERR_DBG, "%s:Out of memory", sp->dev->name); | ||
4025 | DBG_PRINT(ERR_DBG, " in Rx Intr!!\n"); | ||
4026 | } | ||
4027 | return 0; | ||
4028 | } | ||
4029 | |||
3987 | static irqreturn_t | 4030 | static irqreturn_t |
3988 | s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs) | 4031 | s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs) |
3989 | { | 4032 | { |
3990 | struct net_device *dev = (struct net_device *) dev_id; | 4033 | struct net_device *dev = (struct net_device *) dev_id; |
3991 | nic_t *sp = dev->priv; | 4034 | nic_t *sp = dev->priv; |
3992 | int i; | 4035 | int i; |
3993 | int ret; | ||
3994 | mac_info_t *mac_control; | 4036 | mac_info_t *mac_control; |
3995 | struct config_param *config; | 4037 | struct config_param *config; |
3996 | 4038 | ||
@@ -4012,35 +4054,8 @@ s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs) | |||
4012 | * reallocate the buffers from the interrupt handler itself, | 4054 | * reallocate the buffers from the interrupt handler itself, |
4013 | * else schedule a tasklet to reallocate the buffers. | 4055 | * else schedule a tasklet to reallocate the buffers. |
4014 | */ | 4056 | */ |
4015 | for (i = 0; i < config->rx_ring_num; i++) { | 4057 | for (i = 0; i < config->rx_ring_num; i++) |
4016 | if (!sp->lro) { | 4058 | s2io_chk_rx_buffers(sp, i); |
4017 | int rxb_size = atomic_read(&sp->rx_bufs_left[i]); | ||
4018 | int level = rx_buffer_level(sp, rxb_size, i); | ||
4019 | |||
4020 | if ((level == PANIC) && (!TASKLET_IN_USE)) { | ||
4021 | DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", | ||
4022 | dev->name); | ||
4023 | DBG_PRINT(INTR_DBG, "PANIC levels\n"); | ||
4024 | if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) { | ||
4025 | DBG_PRINT(ERR_DBG, "%s:Out of memory", | ||
4026 | dev->name); | ||
4027 | DBG_PRINT(ERR_DBG, " in ISR!!\n"); | ||
4028 | clear_bit(0, (&sp->tasklet_status)); | ||
4029 | atomic_dec(&sp->isr_cnt); | ||
4030 | return IRQ_HANDLED; | ||
4031 | } | ||
4032 | clear_bit(0, (&sp->tasklet_status)); | ||
4033 | } else if (level == LOW) { | ||
4034 | tasklet_schedule(&sp->task); | ||
4035 | } | ||
4036 | } | ||
4037 | else if (fill_rx_buffers(sp, i) == -ENOMEM) { | ||
4038 | DBG_PRINT(ERR_DBG, "%s:Out of memory", | ||
4039 | dev->name); | ||
4040 | DBG_PRINT(ERR_DBG, " in Rx Intr!!\n"); | ||
4041 | break; | ||
4042 | } | ||
4043 | } | ||
4044 | 4059 | ||
4045 | atomic_dec(&sp->isr_cnt); | 4060 | atomic_dec(&sp->isr_cnt); |
4046 | return IRQ_HANDLED; | 4061 | return IRQ_HANDLED; |
@@ -4051,39 +4066,13 @@ s2io_msix_ring_handle(int irq, void *dev_id, struct pt_regs *regs) | |||
4051 | { | 4066 | { |
4052 | ring_info_t *ring = (ring_info_t *)dev_id; | 4067 | ring_info_t *ring = (ring_info_t *)dev_id; |
4053 | nic_t *sp = ring->nic; | 4068 | nic_t *sp = ring->nic; |
4054 | struct net_device *dev = (struct net_device *) dev_id; | ||
4055 | int rxb_size, level, rng_n; | ||
4056 | 4069 | ||
4057 | atomic_inc(&sp->isr_cnt); | 4070 | atomic_inc(&sp->isr_cnt); |
4058 | rx_intr_handler(ring); | ||
4059 | |||
4060 | rng_n = ring->ring_no; | ||
4061 | if (!sp->lro) { | ||
4062 | rxb_size = atomic_read(&sp->rx_bufs_left[rng_n]); | ||
4063 | level = rx_buffer_level(sp, rxb_size, rng_n); | ||
4064 | 4071 | ||
4065 | if ((level == PANIC) && (!TASKLET_IN_USE)) { | 4072 | rx_intr_handler(ring); |
4066 | int ret; | 4073 | s2io_chk_rx_buffers(sp, ring->ring_no); |
4067 | DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", __FUNCTION__); | ||
4068 | DBG_PRINT(INTR_DBG, "PANIC levels\n"); | ||
4069 | if ((ret = fill_rx_buffers(sp, rng_n)) == -ENOMEM) { | ||
4070 | DBG_PRINT(ERR_DBG, "Out of memory in %s", | ||
4071 | __FUNCTION__); | ||
4072 | clear_bit(0, (&sp->tasklet_status)); | ||
4073 | return IRQ_HANDLED; | ||
4074 | } | ||
4075 | clear_bit(0, (&sp->tasklet_status)); | ||
4076 | } else if (level == LOW) { | ||
4077 | tasklet_schedule(&sp->task); | ||
4078 | } | ||
4079 | } | ||
4080 | else if (fill_rx_buffers(sp, rng_n) == -ENOMEM) { | ||
4081 | DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name); | ||
4082 | DBG_PRINT(ERR_DBG, " in Rx Intr!!\n"); | ||
4083 | } | ||
4084 | 4074 | ||
4085 | atomic_dec(&sp->isr_cnt); | 4075 | atomic_dec(&sp->isr_cnt); |
4086 | |||
4087 | return IRQ_HANDLED; | 4076 | return IRQ_HANDLED; |
4088 | } | 4077 | } |
4089 | 4078 | ||
@@ -4248,37 +4237,8 @@ static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs) | |||
4248 | * else schedule a tasklet to reallocate the buffers. | 4237 | * else schedule a tasklet to reallocate the buffers. |
4249 | */ | 4238 | */ |
4250 | #ifndef CONFIG_S2IO_NAPI | 4239 | #ifndef CONFIG_S2IO_NAPI |
4251 | for (i = 0; i < config->rx_ring_num; i++) { | 4240 | for (i = 0; i < config->rx_ring_num; i++) |
4252 | if (!sp->lro) { | 4241 | s2io_chk_rx_buffers(sp, i); |
4253 | int ret; | ||
4254 | int rxb_size = atomic_read(&sp->rx_bufs_left[i]); | ||
4255 | int level = rx_buffer_level(sp, rxb_size, i); | ||
4256 | |||
4257 | if ((level == PANIC) && (!TASKLET_IN_USE)) { | ||
4258 | DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", | ||
4259 | dev->name); | ||
4260 | DBG_PRINT(INTR_DBG, "PANIC levels\n"); | ||
4261 | if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) { | ||
4262 | DBG_PRINT(ERR_DBG, "%s:Out of memory", | ||
4263 | dev->name); | ||
4264 | DBG_PRINT(ERR_DBG, " in ISR!!\n"); | ||
4265 | clear_bit(0, (&sp->tasklet_status)); | ||
4266 | atomic_dec(&sp->isr_cnt); | ||
4267 | writeq(org_mask, &bar0->general_int_mask); | ||
4268 | return IRQ_HANDLED; | ||
4269 | } | ||
4270 | clear_bit(0, (&sp->tasklet_status)); | ||
4271 | } else if (level == LOW) { | ||
4272 | tasklet_schedule(&sp->task); | ||
4273 | } | ||
4274 | } | ||
4275 | else if (fill_rx_buffers(sp, i) == -ENOMEM) { | ||
4276 | DBG_PRINT(ERR_DBG, "%s:Out of memory", | ||
4277 | dev->name); | ||
4278 | DBG_PRINT(ERR_DBG, " in Rx intr!!\n"); | ||
4279 | break; | ||
4280 | } | ||
4281 | } | ||
4282 | #endif | 4242 | #endif |
4283 | writeq(org_mask, &bar0->general_int_mask); | 4243 | writeq(org_mask, &bar0->general_int_mask); |
4284 | atomic_dec(&sp->isr_cnt); | 4244 | atomic_dec(&sp->isr_cnt); |
@@ -4308,6 +4268,8 @@ static void s2io_updt_stats(nic_t *sp) | |||
4308 | if (cnt == 5) | 4268 | if (cnt == 5) |
4309 | break; /* Updt failed */ | 4269 | break; /* Updt failed */ |
4310 | } while(1); | 4270 | } while(1); |
4271 | } else { | ||
4272 | memset(sp->mac_control.stats_info, 0, sizeof(StatInfo_t)); | ||
4311 | } | 4273 | } |
4312 | } | 4274 | } |
4313 | 4275 | ||
@@ -4942,7 +4904,8 @@ static int write_eeprom(nic_t * sp, int off, u64 data, int cnt) | |||
4942 | } | 4904 | } |
4943 | static void s2io_vpd_read(nic_t *nic) | 4905 | static void s2io_vpd_read(nic_t *nic) |
4944 | { | 4906 | { |
4945 | u8 vpd_data[256],data; | 4907 | u8 *vpd_data; |
4908 | u8 data; | ||
4946 | int i=0, cnt, fail = 0; | 4909 | int i=0, cnt, fail = 0; |
4947 | int vpd_addr = 0x80; | 4910 | int vpd_addr = 0x80; |
4948 | 4911 | ||
@@ -4955,6 +4918,10 @@ static void s2io_vpd_read(nic_t *nic) | |||
4955 | vpd_addr = 0x50; | 4918 | vpd_addr = 0x50; |
4956 | } | 4919 | } |
4957 | 4920 | ||
4921 | vpd_data = kmalloc(256, GFP_KERNEL); | ||
4922 | if (!vpd_data) | ||
4923 | return; | ||
4924 | |||
4958 | for (i = 0; i < 256; i +=4 ) { | 4925 | for (i = 0; i < 256; i +=4 ) { |
4959 | pci_write_config_byte(nic->pdev, (vpd_addr + 2), i); | 4926 | pci_write_config_byte(nic->pdev, (vpd_addr + 2), i); |
4960 | pci_read_config_byte(nic->pdev, (vpd_addr + 2), &data); | 4927 | pci_read_config_byte(nic->pdev, (vpd_addr + 2), &data); |
@@ -4977,6 +4944,7 @@ static void s2io_vpd_read(nic_t *nic) | |||
4977 | memset(nic->product_name, 0, vpd_data[1]); | 4944 | memset(nic->product_name, 0, vpd_data[1]); |
4978 | memcpy(nic->product_name, &vpd_data[3], vpd_data[1]); | 4945 | memcpy(nic->product_name, &vpd_data[3], vpd_data[1]); |
4979 | } | 4946 | } |
4947 | kfree(vpd_data); | ||
4980 | } | 4948 | } |
4981 | 4949 | ||
4982 | /** | 4950 | /** |
@@ -5295,7 +5263,7 @@ static int s2io_link_test(nic_t * sp, uint64_t * data) | |||
5295 | else | 5263 | else |
5296 | *data = 0; | 5264 | *data = 0; |
5297 | 5265 | ||
5298 | return 0; | 5266 | return *data; |
5299 | } | 5267 | } |
5300 | 5268 | ||
5301 | /** | 5269 | /** |
@@ -5753,6 +5721,19 @@ static int s2io_ethtool_op_set_tx_csum(struct net_device *dev, u32 data) | |||
5753 | return 0; | 5721 | return 0; |
5754 | } | 5722 | } |
5755 | 5723 | ||
5724 | static u32 s2io_ethtool_op_get_tso(struct net_device *dev) | ||
5725 | { | ||
5726 | return (dev->features & NETIF_F_TSO) != 0; | ||
5727 | } | ||
5728 | static int s2io_ethtool_op_set_tso(struct net_device *dev, u32 data) | ||
5729 | { | ||
5730 | if (data) | ||
5731 | dev->features |= (NETIF_F_TSO | NETIF_F_TSO6); | ||
5732 | else | ||
5733 | dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO6); | ||
5734 | |||
5735 | return 0; | ||
5736 | } | ||
5756 | 5737 | ||
5757 | static struct ethtool_ops netdev_ethtool_ops = { | 5738 | static struct ethtool_ops netdev_ethtool_ops = { |
5758 | .get_settings = s2io_ethtool_gset, | 5739 | .get_settings = s2io_ethtool_gset, |
@@ -5773,8 +5754,8 @@ static struct ethtool_ops netdev_ethtool_ops = { | |||
5773 | .get_sg = ethtool_op_get_sg, | 5754 | .get_sg = ethtool_op_get_sg, |
5774 | .set_sg = ethtool_op_set_sg, | 5755 | .set_sg = ethtool_op_set_sg, |
5775 | #ifdef NETIF_F_TSO | 5756 | #ifdef NETIF_F_TSO |
5776 | .get_tso = ethtool_op_get_tso, | 5757 | .get_tso = s2io_ethtool_op_get_tso, |
5777 | .set_tso = ethtool_op_set_tso, | 5758 | .set_tso = s2io_ethtool_op_set_tso, |
5778 | #endif | 5759 | #endif |
5779 | .get_ufo = ethtool_op_get_ufo, | 5760 | .get_ufo = ethtool_op_get_ufo, |
5780 | .set_ufo = ethtool_op_set_ufo, | 5761 | .set_ufo = ethtool_op_set_ufo, |
@@ -6337,7 +6318,7 @@ static int s2io_card_up(nic_t * sp) | |||
6337 | s2io_set_multicast(dev); | 6318 | s2io_set_multicast(dev); |
6338 | 6319 | ||
6339 | if (sp->lro) { | 6320 | if (sp->lro) { |
6340 | /* Initialize max aggregatable pkts based on MTU */ | 6321 | /* Initialize max aggregatable pkts per session based on MTU */ |
6341 | sp->lro_max_aggr_per_sess = ((1<<16) - 1) / dev->mtu; | 6322 | sp->lro_max_aggr_per_sess = ((1<<16) - 1) / dev->mtu; |
6342 | /* Check if we can use(if specified) user provided value */ | 6323 | /* Check if we can use(if specified) user provided value */ |
6343 | if (lro_max_pkts < sp->lro_max_aggr_per_sess) | 6324 | if (lro_max_pkts < sp->lro_max_aggr_per_sess) |
@@ -6438,7 +6419,7 @@ static void s2io_tx_watchdog(struct net_device *dev) | |||
6438 | * @cksum : FCS checksum of the frame. | 6419 | * @cksum : FCS checksum of the frame. |
6439 | * @ring_no : the ring from which this RxD was extracted. | 6420 | * @ring_no : the ring from which this RxD was extracted. |
6440 | * Description: | 6421 | * Description: |
6441 | * This function is called by the Tx interrupt serivce routine to perform | 6422 | * This function is called by the Rx interrupt serivce routine to perform |
6442 | * some OS related operations on the SKB before passing it to the upper | 6423 | * some OS related operations on the SKB before passing it to the upper |
6443 | * layers. It mainly checks if the checksum is OK, if so adds it to the | 6424 | * layers. It mainly checks if the checksum is OK, if so adds it to the |
6444 | * SKBs cksum variable, increments the Rx packet count and passes the SKB | 6425 | * SKBs cksum variable, increments the Rx packet count and passes the SKB |
@@ -6698,33 +6679,6 @@ static void s2io_init_pci(nic_t * sp) | |||
6698 | pci_read_config_word(sp->pdev, PCI_COMMAND, &pci_cmd); | 6679 | pci_read_config_word(sp->pdev, PCI_COMMAND, &pci_cmd); |
6699 | } | 6680 | } |
6700 | 6681 | ||
6701 | MODULE_AUTHOR("Raghavendra Koushik <raghavendra.koushik@neterion.com>"); | ||
6702 | MODULE_LICENSE("GPL"); | ||
6703 | MODULE_VERSION(DRV_VERSION); | ||
6704 | |||
6705 | module_param(tx_fifo_num, int, 0); | ||
6706 | module_param(rx_ring_num, int, 0); | ||
6707 | module_param(rx_ring_mode, int, 0); | ||
6708 | module_param_array(tx_fifo_len, uint, NULL, 0); | ||
6709 | module_param_array(rx_ring_sz, uint, NULL, 0); | ||
6710 | module_param_array(rts_frm_len, uint, NULL, 0); | ||
6711 | module_param(use_continuous_tx_intrs, int, 1); | ||
6712 | module_param(rmac_pause_time, int, 0); | ||
6713 | module_param(mc_pause_threshold_q0q3, int, 0); | ||
6714 | module_param(mc_pause_threshold_q4q7, int, 0); | ||
6715 | module_param(shared_splits, int, 0); | ||
6716 | module_param(tmac_util_period, int, 0); | ||
6717 | module_param(rmac_util_period, int, 0); | ||
6718 | module_param(bimodal, bool, 0); | ||
6719 | module_param(l3l4hdr_size, int , 0); | ||
6720 | #ifndef CONFIG_S2IO_NAPI | ||
6721 | module_param(indicate_max_pkts, int, 0); | ||
6722 | #endif | ||
6723 | module_param(rxsync_frequency, int, 0); | ||
6724 | module_param(intr_type, int, 0); | ||
6725 | module_param(lro, int, 0); | ||
6726 | module_param(lro_max_pkts, int, 0); | ||
6727 | |||
6728 | static int s2io_verify_parm(struct pci_dev *pdev, u8 *dev_intr_type) | 6682 | static int s2io_verify_parm(struct pci_dev *pdev, u8 *dev_intr_type) |
6729 | { | 6683 | { |
6730 | if ( tx_fifo_num > 8) { | 6684 | if ( tx_fifo_num > 8) { |
@@ -6832,8 +6786,8 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
6832 | } | 6786 | } |
6833 | if (dev_intr_type != MSI_X) { | 6787 | if (dev_intr_type != MSI_X) { |
6834 | if (pci_request_regions(pdev, s2io_driver_name)) { | 6788 | if (pci_request_regions(pdev, s2io_driver_name)) { |
6835 | DBG_PRINT(ERR_DBG, "Request Regions failed\n"), | 6789 | DBG_PRINT(ERR_DBG, "Request Regions failed\n"); |
6836 | pci_disable_device(pdev); | 6790 | pci_disable_device(pdev); |
6837 | return -ENODEV; | 6791 | return -ENODEV; |
6838 | } | 6792 | } |
6839 | } | 6793 | } |
@@ -6957,7 +6911,7 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
6957 | /* initialize the shared memory used by the NIC and the host */ | 6911 | /* initialize the shared memory used by the NIC and the host */ |
6958 | if (init_shared_mem(sp)) { | 6912 | if (init_shared_mem(sp)) { |
6959 | DBG_PRINT(ERR_DBG, "%s: Memory allocation failed\n", | 6913 | DBG_PRINT(ERR_DBG, "%s: Memory allocation failed\n", |
6960 | __FUNCTION__); | 6914 | dev->name); |
6961 | ret = -ENOMEM; | 6915 | ret = -ENOMEM; |
6962 | goto mem_alloc_failed; | 6916 | goto mem_alloc_failed; |
6963 | } | 6917 | } |
@@ -7094,6 +7048,9 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
7094 | dev->addr_len = ETH_ALEN; | 7048 | dev->addr_len = ETH_ALEN; |
7095 | memcpy(dev->dev_addr, sp->def_mac_addr, ETH_ALEN); | 7049 | memcpy(dev->dev_addr, sp->def_mac_addr, ETH_ALEN); |
7096 | 7050 | ||
7051 | /* reset Nic and bring it to known state */ | ||
7052 | s2io_reset(sp); | ||
7053 | |||
7097 | /* | 7054 | /* |
7098 | * Initialize the tasklet status and link state flags | 7055 | * Initialize the tasklet status and link state flags |
7099 | * and the card state parameter | 7056 | * and the card state parameter |
@@ -7131,11 +7088,11 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
7131 | goto register_failed; | 7088 | goto register_failed; |
7132 | } | 7089 | } |
7133 | s2io_vpd_read(sp); | 7090 | s2io_vpd_read(sp); |
7134 | DBG_PRINT(ERR_DBG, "%s: Neterion %s",dev->name, sp->product_name); | ||
7135 | DBG_PRINT(ERR_DBG, "(rev %d), Driver version %s\n", | ||
7136 | get_xena_rev_id(sp->pdev), | ||
7137 | s2io_driver_version); | ||
7138 | DBG_PRINT(ERR_DBG, "Copyright(c) 2002-2005 Neterion Inc.\n"); | 7091 | DBG_PRINT(ERR_DBG, "Copyright(c) 2002-2005 Neterion Inc.\n"); |
7092 | DBG_PRINT(ERR_DBG, "%s: Neterion %s (rev %d)\n",dev->name, | ||
7093 | sp->product_name, get_xena_rev_id(sp->pdev)); | ||
7094 | DBG_PRINT(ERR_DBG, "%s: Driver version %s\n", dev->name, | ||
7095 | s2io_driver_version); | ||
7139 | DBG_PRINT(ERR_DBG, "%s: MAC ADDR: " | 7096 | DBG_PRINT(ERR_DBG, "%s: MAC ADDR: " |
7140 | "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, | 7097 | "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, |
7141 | sp->def_mac_addr[0].mac_addr[0], | 7098 | sp->def_mac_addr[0].mac_addr[0], |
@@ -7436,8 +7393,13 @@ static int verify_l3_l4_lro_capable(lro_t *l_lro, struct iphdr *ip, | |||
7436 | if (ip->ihl != 5) /* IP has options */ | 7393 | if (ip->ihl != 5) /* IP has options */ |
7437 | return -1; | 7394 | return -1; |
7438 | 7395 | ||
7396 | /* If we see CE codepoint in IP header, packet is not mergeable */ | ||
7397 | if (INET_ECN_is_ce(ipv4_get_dsfield(ip))) | ||
7398 | return -1; | ||
7399 | |||
7400 | /* If we see ECE or CWR flags in TCP header, packet is not mergeable */ | ||
7439 | if (tcp->urg || tcp->psh || tcp->rst || tcp->syn || tcp->fin || | 7401 | if (tcp->urg || tcp->psh || tcp->rst || tcp->syn || tcp->fin || |
7440 | !tcp->ack) { | 7402 | tcp->ece || tcp->cwr || !tcp->ack) { |
7441 | /* | 7403 | /* |
7442 | * Currently recognize only the ack control word and | 7404 | * Currently recognize only the ack control word and |
7443 | * any other control field being set would result in | 7405 | * any other control field being set would result in |
@@ -7591,18 +7553,16 @@ static void queue_rx_frame(struct sk_buff *skb) | |||
7591 | static void lro_append_pkt(nic_t *sp, lro_t *lro, struct sk_buff *skb, | 7553 | static void lro_append_pkt(nic_t *sp, lro_t *lro, struct sk_buff *skb, |
7592 | u32 tcp_len) | 7554 | u32 tcp_len) |
7593 | { | 7555 | { |
7594 | struct sk_buff *tmp, *first = lro->parent; | 7556 | struct sk_buff *first = lro->parent; |
7595 | 7557 | ||
7596 | first->len += tcp_len; | 7558 | first->len += tcp_len; |
7597 | first->data_len = lro->frags_len; | 7559 | first->data_len = lro->frags_len; |
7598 | skb_pull(skb, (skb->len - tcp_len)); | 7560 | skb_pull(skb, (skb->len - tcp_len)); |
7599 | if ((tmp = skb_shinfo(first)->frag_list)) { | 7561 | if (skb_shinfo(first)->frag_list) |
7600 | while (tmp->next) | 7562 | lro->last_frag->next = skb; |
7601 | tmp = tmp->next; | ||
7602 | tmp->next = skb; | ||
7603 | } | ||
7604 | else | 7563 | else |
7605 | skb_shinfo(first)->frag_list = skb; | 7564 | skb_shinfo(first)->frag_list = skb; |
7565 | lro->last_frag = skb; | ||
7606 | sp->mac_control.stats_info->sw_stat.clubbed_frms_cnt++; | 7566 | sp->mac_control.stats_info->sw_stat.clubbed_frms_cnt++; |
7607 | return; | 7567 | return; |
7608 | } | 7568 | } |
diff --git a/drivers/net/s2io.h b/drivers/net/s2io.h index 217097bc22f1..5ed49c3be1e9 100644 --- a/drivers/net/s2io.h +++ b/drivers/net/s2io.h | |||
@@ -719,6 +719,7 @@ struct msix_info_st { | |||
719 | /* Data structure to represent a LRO session */ | 719 | /* Data structure to represent a LRO session */ |
720 | typedef struct lro { | 720 | typedef struct lro { |
721 | struct sk_buff *parent; | 721 | struct sk_buff *parent; |
722 | struct sk_buff *last_frag; | ||
722 | u8 *l2h; | 723 | u8 *l2h; |
723 | struct iphdr *iph; | 724 | struct iphdr *iph; |
724 | struct tcphdr *tcph; | 725 | struct tcphdr *tcph; |
@@ -1011,4 +1012,13 @@ static void clear_lro_session(lro_t *lro); | |||
1011 | static void queue_rx_frame(struct sk_buff *skb); | 1012 | static void queue_rx_frame(struct sk_buff *skb); |
1012 | static void update_L3L4_header(nic_t *sp, lro_t *lro); | 1013 | static void update_L3L4_header(nic_t *sp, lro_t *lro); |
1013 | static void lro_append_pkt(nic_t *sp, lro_t *lro, struct sk_buff *skb, u32 tcp_len); | 1014 | static void lro_append_pkt(nic_t *sp, lro_t *lro, struct sk_buff *skb, u32 tcp_len); |
1015 | |||
1016 | #define s2io_tcp_mss(skb) skb_shinfo(skb)->gso_size | ||
1017 | #define s2io_udp_mss(skb) skb_shinfo(skb)->gso_size | ||
1018 | #define s2io_offload_type(skb) skb_shinfo(skb)->gso_type | ||
1019 | |||
1020 | #define S2IO_PARM_INT(X, def_val) \ | ||
1021 | static unsigned int X = def_val;\ | ||
1022 | module_param(X , uint, 0); | ||
1023 | |||
1014 | #endif /* _S2IO_H */ | 1024 | #endif /* _S2IO_H */ |
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index 82200bfaa8ed..7de9a07b2ac2 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
@@ -516,10 +516,7 @@ static int skge_set_pauseparam(struct net_device *dev, | |||
516 | /* Chip internal frequency for clock calculations */ | 516 | /* Chip internal frequency for clock calculations */ |
517 | static inline u32 hwkhz(const struct skge_hw *hw) | 517 | static inline u32 hwkhz(const struct skge_hw *hw) |
518 | { | 518 | { |
519 | if (hw->chip_id == CHIP_ID_GENESIS) | 519 | return (hw->chip_id == CHIP_ID_GENESIS) ? 53125 : 78125; |
520 | return 53215; /* or: 53.125 MHz */ | ||
521 | else | ||
522 | return 78215; /* or: 78.125 MHz */ | ||
523 | } | 520 | } |
524 | 521 | ||
525 | /* Chip HZ to microseconds */ | 522 | /* Chip HZ to microseconds */ |
diff --git a/drivers/net/sunlance.c b/drivers/net/sunlance.c index 1ef9fd39a79a..0e3fdf7c6dd3 100644 --- a/drivers/net/sunlance.c +++ b/drivers/net/sunlance.c | |||
@@ -1537,7 +1537,7 @@ static int __init sparc_lance_init(void) | |||
1537 | { | 1537 | { |
1538 | if ((idprom->id_machtype == (SM_SUN4|SM_4_330)) || | 1538 | if ((idprom->id_machtype == (SM_SUN4|SM_4_330)) || |
1539 | (idprom->id_machtype == (SM_SUN4|SM_4_470))) { | 1539 | (idprom->id_machtype == (SM_SUN4|SM_4_470))) { |
1540 | memset(&sun4_sdev, 0, sizeof(sdev)); | 1540 | memset(&sun4_sdev, 0, sizeof(struct sbus_dev)); |
1541 | sun4_sdev.reg_addrs[0].phys_addr = sun4_eth_physaddr; | 1541 | sun4_sdev.reg_addrs[0].phys_addr = sun4_eth_physaddr; |
1542 | sun4_sdev.irqs[0] = 6; | 1542 | sun4_sdev.irqs[0] = 6; |
1543 | return sparc_lance_probe_one(&sun4_sdev, NULL, NULL); | 1543 | return sparc_lance_probe_one(&sun4_sdev, NULL, NULL); |
@@ -1547,16 +1547,16 @@ static int __init sparc_lance_init(void) | |||
1547 | 1547 | ||
1548 | static int __exit sunlance_sun4_remove(void) | 1548 | static int __exit sunlance_sun4_remove(void) |
1549 | { | 1549 | { |
1550 | struct lance_private *lp = dev_get_drvdata(&sun4_sdev->dev); | 1550 | struct lance_private *lp = dev_get_drvdata(&sun4_sdev.ofdev.dev); |
1551 | struct net_device *net_dev = lp->dev; | 1551 | struct net_device *net_dev = lp->dev; |
1552 | 1552 | ||
1553 | unregister_netdevice(net_dev); | 1553 | unregister_netdevice(net_dev); |
1554 | 1554 | ||
1555 | lance_free_hwresources(root_lance_dev); | 1555 | lance_free_hwresources(lp); |
1556 | 1556 | ||
1557 | free_netdev(net_dev); | 1557 | free_netdev(net_dev); |
1558 | 1558 | ||
1559 | dev_set_drvdata(&sun4_sdev->dev, NULL); | 1559 | dev_set_drvdata(&sun4_sdev.ofdev.dev, NULL); |
1560 | 1560 | ||
1561 | return 0; | 1561 | return 0; |
1562 | } | 1562 | } |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index ce6f3be86da0..eafabb253f08 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -68,8 +68,8 @@ | |||
68 | 68 | ||
69 | #define DRV_MODULE_NAME "tg3" | 69 | #define DRV_MODULE_NAME "tg3" |
70 | #define PFX DRV_MODULE_NAME ": " | 70 | #define PFX DRV_MODULE_NAME ": " |
71 | #define DRV_MODULE_VERSION "3.62" | 71 | #define DRV_MODULE_VERSION "3.65" |
72 | #define DRV_MODULE_RELDATE "June 30, 2006" | 72 | #define DRV_MODULE_RELDATE "August 07, 2006" |
73 | 73 | ||
74 | #define TG3_DEF_MAC_MODE 0 | 74 | #define TG3_DEF_MAC_MODE 0 |
75 | #define TG3_DEF_RX_MODE 0 | 75 | #define TG3_DEF_RX_MODE 0 |
@@ -123,9 +123,6 @@ | |||
123 | TG3_RX_RCB_RING_SIZE(tp)) | 123 | TG3_RX_RCB_RING_SIZE(tp)) |
124 | #define TG3_TX_RING_BYTES (sizeof(struct tg3_tx_buffer_desc) * \ | 124 | #define TG3_TX_RING_BYTES (sizeof(struct tg3_tx_buffer_desc) * \ |
125 | TG3_TX_RING_SIZE) | 125 | TG3_TX_RING_SIZE) |
126 | #define TX_BUFFS_AVAIL(TP) \ | ||
127 | ((TP)->tx_pending - \ | ||
128 | (((TP)->tx_prod - (TP)->tx_cons) & (TG3_TX_RING_SIZE - 1))) | ||
129 | #define NEXT_TX(N) (((N) + 1) & (TG3_TX_RING_SIZE - 1)) | 126 | #define NEXT_TX(N) (((N) + 1) & (TG3_TX_RING_SIZE - 1)) |
130 | 127 | ||
131 | #define RX_PKT_BUF_SZ (1536 + tp->rx_offset + 64) | 128 | #define RX_PKT_BUF_SZ (1536 + tp->rx_offset + 64) |
@@ -2987,6 +2984,13 @@ static void tg3_tx_recover(struct tg3 *tp) | |||
2987 | spin_unlock(&tp->lock); | 2984 | spin_unlock(&tp->lock); |
2988 | } | 2985 | } |
2989 | 2986 | ||
2987 | static inline u32 tg3_tx_avail(struct tg3 *tp) | ||
2988 | { | ||
2989 | smp_mb(); | ||
2990 | return (tp->tx_pending - | ||
2991 | ((tp->tx_prod - tp->tx_cons) & (TG3_TX_RING_SIZE - 1))); | ||
2992 | } | ||
2993 | |||
2990 | /* Tigon3 never reports partial packet sends. So we do not | 2994 | /* Tigon3 never reports partial packet sends. So we do not |
2991 | * need special logic to handle SKBs that have not had all | 2995 | * need special logic to handle SKBs that have not had all |
2992 | * of their frags sent yet, like SunGEM does. | 2996 | * of their frags sent yet, like SunGEM does. |
@@ -3038,12 +3042,20 @@ static void tg3_tx(struct tg3 *tp) | |||
3038 | 3042 | ||
3039 | tp->tx_cons = sw_idx; | 3043 | tp->tx_cons = sw_idx; |
3040 | 3044 | ||
3041 | if (unlikely(netif_queue_stopped(tp->dev))) { | 3045 | /* Need to make the tx_cons update visible to tg3_start_xmit() |
3042 | spin_lock(&tp->tx_lock); | 3046 | * before checking for netif_queue_stopped(). Without the |
3047 | * memory barrier, there is a small possibility that tg3_start_xmit() | ||
3048 | * will miss it and cause the queue to be stopped forever. | ||
3049 | */ | ||
3050 | smp_mb(); | ||
3051 | |||
3052 | if (unlikely(netif_queue_stopped(tp->dev) && | ||
3053 | (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH))) { | ||
3054 | netif_tx_lock(tp->dev); | ||
3043 | if (netif_queue_stopped(tp->dev) && | 3055 | if (netif_queue_stopped(tp->dev) && |
3044 | (TX_BUFFS_AVAIL(tp) > TG3_TX_WAKEUP_THRESH)) | 3056 | (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH)) |
3045 | netif_wake_queue(tp->dev); | 3057 | netif_wake_queue(tp->dev); |
3046 | spin_unlock(&tp->tx_lock); | 3058 | netif_tx_unlock(tp->dev); |
3047 | } | 3059 | } |
3048 | } | 3060 | } |
3049 | 3061 | ||
@@ -3097,11 +3109,10 @@ static int tg3_alloc_rx_skb(struct tg3 *tp, u32 opaque_key, | |||
3097 | * Callers depend upon this behavior and assume that | 3109 | * Callers depend upon this behavior and assume that |
3098 | * we leave everything unchanged if we fail. | 3110 | * we leave everything unchanged if we fail. |
3099 | */ | 3111 | */ |
3100 | skb = dev_alloc_skb(skb_size); | 3112 | skb = netdev_alloc_skb(tp->dev, skb_size); |
3101 | if (skb == NULL) | 3113 | if (skb == NULL) |
3102 | return -ENOMEM; | 3114 | return -ENOMEM; |
3103 | 3115 | ||
3104 | skb->dev = tp->dev; | ||
3105 | skb_reserve(skb, tp->rx_offset); | 3116 | skb_reserve(skb, tp->rx_offset); |
3106 | 3117 | ||
3107 | mapping = pci_map_single(tp->pdev, skb->data, | 3118 | mapping = pci_map_single(tp->pdev, skb->data, |
@@ -3270,11 +3281,10 @@ static int tg3_rx(struct tg3 *tp, int budget) | |||
3270 | tg3_recycle_rx(tp, opaque_key, | 3281 | tg3_recycle_rx(tp, opaque_key, |
3271 | desc_idx, *post_ptr); | 3282 | desc_idx, *post_ptr); |
3272 | 3283 | ||
3273 | copy_skb = dev_alloc_skb(len + 2); | 3284 | copy_skb = netdev_alloc_skb(tp->dev, len + 2); |
3274 | if (copy_skb == NULL) | 3285 | if (copy_skb == NULL) |
3275 | goto drop_it_no_recycle; | 3286 | goto drop_it_no_recycle; |
3276 | 3287 | ||
3277 | copy_skb->dev = tp->dev; | ||
3278 | skb_reserve(copy_skb, 2); | 3288 | skb_reserve(copy_skb, 2); |
3279 | skb_put(copy_skb, len); | 3289 | skb_put(copy_skb, len); |
3280 | pci_dma_sync_single_for_cpu(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE); | 3290 | pci_dma_sync_single_for_cpu(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE); |
@@ -3590,6 +3600,28 @@ static irqreturn_t tg3_test_isr(int irq, void *dev_id, | |||
3590 | static int tg3_init_hw(struct tg3 *, int); | 3600 | static int tg3_init_hw(struct tg3 *, int); |
3591 | static int tg3_halt(struct tg3 *, int, int); | 3601 | static int tg3_halt(struct tg3 *, int, int); |
3592 | 3602 | ||
3603 | /* Restart hardware after configuration changes, self-test, etc. | ||
3604 | * Invoked with tp->lock held. | ||
3605 | */ | ||
3606 | static int tg3_restart_hw(struct tg3 *tp, int reset_phy) | ||
3607 | { | ||
3608 | int err; | ||
3609 | |||
3610 | err = tg3_init_hw(tp, reset_phy); | ||
3611 | if (err) { | ||
3612 | printk(KERN_ERR PFX "%s: Failed to re-initialize device, " | ||
3613 | "aborting.\n", tp->dev->name); | ||
3614 | tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); | ||
3615 | tg3_full_unlock(tp); | ||
3616 | del_timer_sync(&tp->timer); | ||
3617 | tp->irq_sync = 0; | ||
3618 | netif_poll_enable(tp->dev); | ||
3619 | dev_close(tp->dev); | ||
3620 | tg3_full_lock(tp, 0); | ||
3621 | } | ||
3622 | return err; | ||
3623 | } | ||
3624 | |||
3593 | #ifdef CONFIG_NET_POLL_CONTROLLER | 3625 | #ifdef CONFIG_NET_POLL_CONTROLLER |
3594 | static void tg3_poll_controller(struct net_device *dev) | 3626 | static void tg3_poll_controller(struct net_device *dev) |
3595 | { | 3627 | { |
@@ -3630,13 +3662,15 @@ static void tg3_reset_task(void *_data) | |||
3630 | } | 3662 | } |
3631 | 3663 | ||
3632 | tg3_halt(tp, RESET_KIND_SHUTDOWN, 0); | 3664 | tg3_halt(tp, RESET_KIND_SHUTDOWN, 0); |
3633 | tg3_init_hw(tp, 1); | 3665 | if (tg3_init_hw(tp, 1)) |
3666 | goto out; | ||
3634 | 3667 | ||
3635 | tg3_netif_start(tp); | 3668 | tg3_netif_start(tp); |
3636 | 3669 | ||
3637 | if (restart_timer) | 3670 | if (restart_timer) |
3638 | mod_timer(&tp->timer, jiffies + 1); | 3671 | mod_timer(&tp->timer, jiffies + 1); |
3639 | 3672 | ||
3673 | out: | ||
3640 | tp->tg3_flags &= ~TG3_FLAG_IN_RESET_TASK; | 3674 | tp->tg3_flags &= ~TG3_FLAG_IN_RESET_TASK; |
3641 | 3675 | ||
3642 | tg3_full_unlock(tp); | 3676 | tg3_full_unlock(tp); |
@@ -3773,7 +3807,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3773 | * interrupt. Furthermore, IRQ processing runs lockless so we have | 3807 | * interrupt. Furthermore, IRQ processing runs lockless so we have |
3774 | * no IRQ context deadlocks to worry about either. Rejoice! | 3808 | * no IRQ context deadlocks to worry about either. Rejoice! |
3775 | */ | 3809 | */ |
3776 | if (unlikely(TX_BUFFS_AVAIL(tp) <= (skb_shinfo(skb)->nr_frags + 1))) { | 3810 | if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->nr_frags + 1))) { |
3777 | if (!netif_queue_stopped(dev)) { | 3811 | if (!netif_queue_stopped(dev)) { |
3778 | netif_stop_queue(dev); | 3812 | netif_stop_queue(dev); |
3779 | 3813 | ||
@@ -3869,12 +3903,10 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3869 | tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry); | 3903 | tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry); |
3870 | 3904 | ||
3871 | tp->tx_prod = entry; | 3905 | tp->tx_prod = entry; |
3872 | if (unlikely(TX_BUFFS_AVAIL(tp) <= (MAX_SKB_FRAGS + 1))) { | 3906 | if (unlikely(tg3_tx_avail(tp) <= (MAX_SKB_FRAGS + 1))) { |
3873 | spin_lock(&tp->tx_lock); | ||
3874 | netif_stop_queue(dev); | 3907 | netif_stop_queue(dev); |
3875 | if (TX_BUFFS_AVAIL(tp) > TG3_TX_WAKEUP_THRESH) | 3908 | if (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH) |
3876 | netif_wake_queue(tp->dev); | 3909 | netif_wake_queue(tp->dev); |
3877 | spin_unlock(&tp->tx_lock); | ||
3878 | } | 3910 | } |
3879 | 3911 | ||
3880 | out_unlock: | 3912 | out_unlock: |
@@ -3896,7 +3928,7 @@ static int tg3_tso_bug(struct tg3 *tp, struct sk_buff *skb) | |||
3896 | struct sk_buff *segs, *nskb; | 3928 | struct sk_buff *segs, *nskb; |
3897 | 3929 | ||
3898 | /* Estimate the number of fragments in the worst case */ | 3930 | /* Estimate the number of fragments in the worst case */ |
3899 | if (unlikely(TX_BUFFS_AVAIL(tp) <= (skb_shinfo(skb)->gso_segs * 3))) { | 3931 | if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->gso_segs * 3))) { |
3900 | netif_stop_queue(tp->dev); | 3932 | netif_stop_queue(tp->dev); |
3901 | return NETDEV_TX_BUSY; | 3933 | return NETDEV_TX_BUSY; |
3902 | } | 3934 | } |
@@ -3936,7 +3968,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) | |||
3936 | * interrupt. Furthermore, IRQ processing runs lockless so we have | 3968 | * interrupt. Furthermore, IRQ processing runs lockless so we have |
3937 | * no IRQ context deadlocks to worry about either. Rejoice! | 3969 | * no IRQ context deadlocks to worry about either. Rejoice! |
3938 | */ | 3970 | */ |
3939 | if (unlikely(TX_BUFFS_AVAIL(tp) <= (skb_shinfo(skb)->nr_frags + 1))) { | 3971 | if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->nr_frags + 1))) { |
3940 | if (!netif_queue_stopped(dev)) { | 3972 | if (!netif_queue_stopped(dev)) { |
3941 | netif_stop_queue(dev); | 3973 | netif_stop_queue(dev); |
3942 | 3974 | ||
@@ -4086,12 +4118,10 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) | |||
4086 | tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry); | 4118 | tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry); |
4087 | 4119 | ||
4088 | tp->tx_prod = entry; | 4120 | tp->tx_prod = entry; |
4089 | if (unlikely(TX_BUFFS_AVAIL(tp) <= (MAX_SKB_FRAGS + 1))) { | 4121 | if (unlikely(tg3_tx_avail(tp) <= (MAX_SKB_FRAGS + 1))) { |
4090 | spin_lock(&tp->tx_lock); | ||
4091 | netif_stop_queue(dev); | 4122 | netif_stop_queue(dev); |
4092 | if (TX_BUFFS_AVAIL(tp) > TG3_TX_WAKEUP_THRESH) | 4123 | if (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH) |
4093 | netif_wake_queue(tp->dev); | 4124 | netif_wake_queue(tp->dev); |
4094 | spin_unlock(&tp->tx_lock); | ||
4095 | } | 4125 | } |
4096 | 4126 | ||
4097 | out_unlock: | 4127 | out_unlock: |
@@ -4124,6 +4154,7 @@ static inline void tg3_set_mtu(struct net_device *dev, struct tg3 *tp, | |||
4124 | static int tg3_change_mtu(struct net_device *dev, int new_mtu) | 4154 | static int tg3_change_mtu(struct net_device *dev, int new_mtu) |
4125 | { | 4155 | { |
4126 | struct tg3 *tp = netdev_priv(dev); | 4156 | struct tg3 *tp = netdev_priv(dev); |
4157 | int err; | ||
4127 | 4158 | ||
4128 | if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU(tp)) | 4159 | if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU(tp)) |
4129 | return -EINVAL; | 4160 | return -EINVAL; |
@@ -4144,13 +4175,14 @@ static int tg3_change_mtu(struct net_device *dev, int new_mtu) | |||
4144 | 4175 | ||
4145 | tg3_set_mtu(dev, tp, new_mtu); | 4176 | tg3_set_mtu(dev, tp, new_mtu); |
4146 | 4177 | ||
4147 | tg3_init_hw(tp, 0); | 4178 | err = tg3_restart_hw(tp, 0); |
4148 | 4179 | ||
4149 | tg3_netif_start(tp); | 4180 | if (!err) |
4181 | tg3_netif_start(tp); | ||
4150 | 4182 | ||
4151 | tg3_full_unlock(tp); | 4183 | tg3_full_unlock(tp); |
4152 | 4184 | ||
4153 | return 0; | 4185 | return err; |
4154 | } | 4186 | } |
4155 | 4187 | ||
4156 | /* Free up pending packets in all rx/tx rings. | 4188 | /* Free up pending packets in all rx/tx rings. |
@@ -4232,7 +4264,7 @@ static void tg3_free_rings(struct tg3 *tp) | |||
4232 | * end up in the driver. tp->{tx,}lock are held and thus | 4264 | * end up in the driver. tp->{tx,}lock are held and thus |
4233 | * we may not sleep. | 4265 | * we may not sleep. |
4234 | */ | 4266 | */ |
4235 | static void tg3_init_rings(struct tg3 *tp) | 4267 | static int tg3_init_rings(struct tg3 *tp) |
4236 | { | 4268 | { |
4237 | u32 i; | 4269 | u32 i; |
4238 | 4270 | ||
@@ -4281,18 +4313,38 @@ static void tg3_init_rings(struct tg3 *tp) | |||
4281 | 4313 | ||
4282 | /* Now allocate fresh SKBs for each rx ring. */ | 4314 | /* Now allocate fresh SKBs for each rx ring. */ |
4283 | for (i = 0; i < tp->rx_pending; i++) { | 4315 | for (i = 0; i < tp->rx_pending; i++) { |
4284 | if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_STD, | 4316 | if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_STD, -1, i) < 0) { |
4285 | -1, i) < 0) | 4317 | printk(KERN_WARNING PFX |
4318 | "%s: Using a smaller RX standard ring, " | ||
4319 | "only %d out of %d buffers were allocated " | ||
4320 | "successfully.\n", | ||
4321 | tp->dev->name, i, tp->rx_pending); | ||
4322 | if (i == 0) | ||
4323 | return -ENOMEM; | ||
4324 | tp->rx_pending = i; | ||
4286 | break; | 4325 | break; |
4326 | } | ||
4287 | } | 4327 | } |
4288 | 4328 | ||
4289 | if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) { | 4329 | if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) { |
4290 | for (i = 0; i < tp->rx_jumbo_pending; i++) { | 4330 | for (i = 0; i < tp->rx_jumbo_pending; i++) { |
4291 | if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_JUMBO, | 4331 | if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_JUMBO, |
4292 | -1, i) < 0) | 4332 | -1, i) < 0) { |
4333 | printk(KERN_WARNING PFX | ||
4334 | "%s: Using a smaller RX jumbo ring, " | ||
4335 | "only %d out of %d buffers were " | ||
4336 | "allocated successfully.\n", | ||
4337 | tp->dev->name, i, tp->rx_jumbo_pending); | ||
4338 | if (i == 0) { | ||
4339 | tg3_free_rings(tp); | ||
4340 | return -ENOMEM; | ||
4341 | } | ||
4342 | tp->rx_jumbo_pending = i; | ||
4293 | break; | 4343 | break; |
4344 | } | ||
4294 | } | 4345 | } |
4295 | } | 4346 | } |
4347 | return 0; | ||
4296 | } | 4348 | } |
4297 | 4349 | ||
4298 | /* | 4350 | /* |
@@ -5815,6 +5867,7 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p) | |||
5815 | { | 5867 | { |
5816 | struct tg3 *tp = netdev_priv(dev); | 5868 | struct tg3 *tp = netdev_priv(dev); |
5817 | struct sockaddr *addr = p; | 5869 | struct sockaddr *addr = p; |
5870 | int err = 0; | ||
5818 | 5871 | ||
5819 | if (!is_valid_ether_addr(addr->sa_data)) | 5872 | if (!is_valid_ether_addr(addr->sa_data)) |
5820 | return -EINVAL; | 5873 | return -EINVAL; |
@@ -5832,9 +5885,9 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p) | |||
5832 | tg3_full_lock(tp, 1); | 5885 | tg3_full_lock(tp, 1); |
5833 | 5886 | ||
5834 | tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); | 5887 | tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); |
5835 | tg3_init_hw(tp, 0); | 5888 | err = tg3_restart_hw(tp, 0); |
5836 | 5889 | if (!err) | |
5837 | tg3_netif_start(tp); | 5890 | tg3_netif_start(tp); |
5838 | tg3_full_unlock(tp); | 5891 | tg3_full_unlock(tp); |
5839 | } else { | 5892 | } else { |
5840 | spin_lock_bh(&tp->lock); | 5893 | spin_lock_bh(&tp->lock); |
@@ -5842,7 +5895,7 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p) | |||
5842 | spin_unlock_bh(&tp->lock); | 5895 | spin_unlock_bh(&tp->lock); |
5843 | } | 5896 | } |
5844 | 5897 | ||
5845 | return 0; | 5898 | return err; |
5846 | } | 5899 | } |
5847 | 5900 | ||
5848 | /* tp->lock is held. */ | 5901 | /* tp->lock is held. */ |
@@ -5942,7 +5995,9 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
5942 | * can only do this after the hardware has been | 5995 | * can only do this after the hardware has been |
5943 | * successfully reset. | 5996 | * successfully reset. |
5944 | */ | 5997 | */ |
5945 | tg3_init_rings(tp); | 5998 | err = tg3_init_rings(tp); |
5999 | if (err) | ||
6000 | return err; | ||
5946 | 6001 | ||
5947 | /* This value is determined during the probe time DMA | 6002 | /* This value is determined during the probe time DMA |
5948 | * engine test, tg3_test_dma. | 6003 | * engine test, tg3_test_dma. |
@@ -7956,7 +8011,7 @@ static void tg3_get_ringparam(struct net_device *dev, struct ethtool_ringparam * | |||
7956 | static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) | 8011 | static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) |
7957 | { | 8012 | { |
7958 | struct tg3 *tp = netdev_priv(dev); | 8013 | struct tg3 *tp = netdev_priv(dev); |
7959 | int irq_sync = 0; | 8014 | int irq_sync = 0, err = 0; |
7960 | 8015 | ||
7961 | if ((ering->rx_pending > TG3_RX_RING_SIZE - 1) || | 8016 | if ((ering->rx_pending > TG3_RX_RING_SIZE - 1) || |
7962 | (ering->rx_jumbo_pending > TG3_RX_JUMBO_RING_SIZE - 1) || | 8017 | (ering->rx_jumbo_pending > TG3_RX_JUMBO_RING_SIZE - 1) || |
@@ -7980,13 +8035,14 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e | |||
7980 | 8035 | ||
7981 | if (netif_running(dev)) { | 8036 | if (netif_running(dev)) { |
7982 | tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); | 8037 | tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); |
7983 | tg3_init_hw(tp, 1); | 8038 | err = tg3_restart_hw(tp, 1); |
7984 | tg3_netif_start(tp); | 8039 | if (!err) |
8040 | tg3_netif_start(tp); | ||
7985 | } | 8041 | } |
7986 | 8042 | ||
7987 | tg3_full_unlock(tp); | 8043 | tg3_full_unlock(tp); |
7988 | 8044 | ||
7989 | return 0; | 8045 | return err; |
7990 | } | 8046 | } |
7991 | 8047 | ||
7992 | static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause) | 8048 | static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause) |
@@ -8001,7 +8057,7 @@ static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam | |||
8001 | static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause) | 8057 | static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause) |
8002 | { | 8058 | { |
8003 | struct tg3 *tp = netdev_priv(dev); | 8059 | struct tg3 *tp = netdev_priv(dev); |
8004 | int irq_sync = 0; | 8060 | int irq_sync = 0, err = 0; |
8005 | 8061 | ||
8006 | if (netif_running(dev)) { | 8062 | if (netif_running(dev)) { |
8007 | tg3_netif_stop(tp); | 8063 | tg3_netif_stop(tp); |
@@ -8025,13 +8081,14 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam | |||
8025 | 8081 | ||
8026 | if (netif_running(dev)) { | 8082 | if (netif_running(dev)) { |
8027 | tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); | 8083 | tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); |
8028 | tg3_init_hw(tp, 1); | 8084 | err = tg3_restart_hw(tp, 1); |
8029 | tg3_netif_start(tp); | 8085 | if (!err) |
8086 | tg3_netif_start(tp); | ||
8030 | } | 8087 | } |
8031 | 8088 | ||
8032 | tg3_full_unlock(tp); | 8089 | tg3_full_unlock(tp); |
8033 | 8090 | ||
8034 | return 0; | 8091 | return err; |
8035 | } | 8092 | } |
8036 | 8093 | ||
8037 | static u32 tg3_get_rx_csum(struct net_device *dev) | 8094 | static u32 tg3_get_rx_csum(struct net_device *dev) |
@@ -8567,7 +8624,7 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) | |||
8567 | err = -EIO; | 8624 | err = -EIO; |
8568 | 8625 | ||
8569 | tx_len = 1514; | 8626 | tx_len = 1514; |
8570 | skb = dev_alloc_skb(tx_len); | 8627 | skb = netdev_alloc_skb(tp->dev, tx_len); |
8571 | if (!skb) | 8628 | if (!skb) |
8572 | return -ENOMEM; | 8629 | return -ENOMEM; |
8573 | 8630 | ||
@@ -8666,7 +8723,9 @@ static int tg3_test_loopback(struct tg3 *tp) | |||
8666 | if (!netif_running(tp->dev)) | 8723 | if (!netif_running(tp->dev)) |
8667 | return TG3_LOOPBACK_FAILED; | 8724 | return TG3_LOOPBACK_FAILED; |
8668 | 8725 | ||
8669 | tg3_reset_hw(tp, 1); | 8726 | err = tg3_reset_hw(tp, 1); |
8727 | if (err) | ||
8728 | return TG3_LOOPBACK_FAILED; | ||
8670 | 8729 | ||
8671 | if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK)) | 8730 | if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK)) |
8672 | err |= TG3_MAC_LOOPBACK_FAILED; | 8731 | err |= TG3_MAC_LOOPBACK_FAILED; |
@@ -8740,8 +8799,8 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest, | |||
8740 | tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); | 8799 | tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); |
8741 | if (netif_running(dev)) { | 8800 | if (netif_running(dev)) { |
8742 | tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE; | 8801 | tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE; |
8743 | tg3_init_hw(tp, 1); | 8802 | if (!tg3_restart_hw(tp, 1)) |
8744 | tg3_netif_start(tp); | 8803 | tg3_netif_start(tp); |
8745 | } | 8804 | } |
8746 | 8805 | ||
8747 | tg3_full_unlock(tp); | 8806 | tg3_full_unlock(tp); |
@@ -11421,7 +11480,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
11421 | tp->grc_mode |= GRC_MODE_BSWAP_NONFRM_DATA; | 11480 | tp->grc_mode |= GRC_MODE_BSWAP_NONFRM_DATA; |
11422 | #endif | 11481 | #endif |
11423 | spin_lock_init(&tp->lock); | 11482 | spin_lock_init(&tp->lock); |
11424 | spin_lock_init(&tp->tx_lock); | ||
11425 | spin_lock_init(&tp->indirect_lock); | 11483 | spin_lock_init(&tp->indirect_lock); |
11426 | INIT_WORK(&tp->reset_task, tg3_reset_task, tp); | 11484 | INIT_WORK(&tp->reset_task, tg3_reset_task, tp); |
11427 | 11485 | ||
@@ -11699,7 +11757,8 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state) | |||
11699 | tg3_full_lock(tp, 0); | 11757 | tg3_full_lock(tp, 0); |
11700 | 11758 | ||
11701 | tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE; | 11759 | tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE; |
11702 | tg3_init_hw(tp, 1); | 11760 | if (tg3_restart_hw(tp, 1)) |
11761 | goto out; | ||
11703 | 11762 | ||
11704 | tp->timer.expires = jiffies + tp->timer_offset; | 11763 | tp->timer.expires = jiffies + tp->timer_offset; |
11705 | add_timer(&tp->timer); | 11764 | add_timer(&tp->timer); |
@@ -11707,6 +11766,7 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state) | |||
11707 | netif_device_attach(dev); | 11766 | netif_device_attach(dev); |
11708 | tg3_netif_start(tp); | 11767 | tg3_netif_start(tp); |
11709 | 11768 | ||
11769 | out: | ||
11710 | tg3_full_unlock(tp); | 11770 | tg3_full_unlock(tp); |
11711 | } | 11771 | } |
11712 | 11772 | ||
@@ -11733,16 +11793,19 @@ static int tg3_resume(struct pci_dev *pdev) | |||
11733 | tg3_full_lock(tp, 0); | 11793 | tg3_full_lock(tp, 0); |
11734 | 11794 | ||
11735 | tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE; | 11795 | tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE; |
11736 | tg3_init_hw(tp, 1); | 11796 | err = tg3_restart_hw(tp, 1); |
11797 | if (err) | ||
11798 | goto out; | ||
11737 | 11799 | ||
11738 | tp->timer.expires = jiffies + tp->timer_offset; | 11800 | tp->timer.expires = jiffies + tp->timer_offset; |
11739 | add_timer(&tp->timer); | 11801 | add_timer(&tp->timer); |
11740 | 11802 | ||
11741 | tg3_netif_start(tp); | 11803 | tg3_netif_start(tp); |
11742 | 11804 | ||
11805 | out: | ||
11743 | tg3_full_unlock(tp); | 11806 | tg3_full_unlock(tp); |
11744 | 11807 | ||
11745 | return 0; | 11808 | return err; |
11746 | } | 11809 | } |
11747 | 11810 | ||
11748 | static struct pci_driver tg3_driver = { | 11811 | static struct pci_driver tg3_driver = { |
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index ba2c98711c88..3ecf356cfb08 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h | |||
@@ -2079,9 +2079,9 @@ struct tg3 { | |||
2079 | * lock: Held during reset, PHY access, timer, and when | 2079 | * lock: Held during reset, PHY access, timer, and when |
2080 | * updating tg3_flags and tg3_flags2. | 2080 | * updating tg3_flags and tg3_flags2. |
2081 | * | 2081 | * |
2082 | * tx_lock: Held during tg3_start_xmit and tg3_tx only | 2082 | * netif_tx_lock: Held during tg3_start_xmit. tg3_tx holds |
2083 | * when calling netif_[start|stop]_queue. | 2083 | * netif_tx_lock when it needs to call |
2084 | * tg3_start_xmit is protected by netif_tx_lock. | 2084 | * netif_wake_queue. |
2085 | * | 2085 | * |
2086 | * Both of these locks are to be held with BH safety. | 2086 | * Both of these locks are to be held with BH safety. |
2087 | * | 2087 | * |
@@ -2118,8 +2118,6 @@ struct tg3 { | |||
2118 | u32 tx_cons; | 2118 | u32 tx_cons; |
2119 | u32 tx_pending; | 2119 | u32 tx_pending; |
2120 | 2120 | ||
2121 | spinlock_t tx_lock; | ||
2122 | |||
2123 | struct tg3_tx_buffer_desc *tx_ring; | 2121 | struct tg3_tx_buffer_desc *tx_ring; |
2124 | struct tx_ring_info *tx_buffers; | 2122 | struct tx_ring_info *tx_buffers; |
2125 | dma_addr_t tx_desc_mapping; | 2123 | dma_addr_t tx_desc_mapping; |
diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c index f5b0078eb4ad..aa9cd92f46b2 100644 --- a/drivers/net/via-velocity.c +++ b/drivers/net/via-velocity.c | |||
@@ -2742,7 +2742,7 @@ static u32 check_connection_type(struct mac_regs __iomem * regs) | |||
2742 | 2742 | ||
2743 | if (PHYSR0 & PHYSR0_SPDG) | 2743 | if (PHYSR0 & PHYSR0_SPDG) |
2744 | status |= VELOCITY_SPEED_1000; | 2744 | status |= VELOCITY_SPEED_1000; |
2745 | if (PHYSR0 & PHYSR0_SPD10) | 2745 | else if (PHYSR0 & PHYSR0_SPD10) |
2746 | status |= VELOCITY_SPEED_10; | 2746 | status |= VELOCITY_SPEED_10; |
2747 | else | 2747 | else |
2748 | status |= VELOCITY_SPEED_100; | 2748 | status |= VELOCITY_SPEED_100; |
@@ -2851,8 +2851,17 @@ static int velocity_get_settings(struct net_device *dev, struct ethtool_cmd *cmd | |||
2851 | u32 status; | 2851 | u32 status; |
2852 | status = check_connection_type(vptr->mac_regs); | 2852 | status = check_connection_type(vptr->mac_regs); |
2853 | 2853 | ||
2854 | cmd->supported = SUPPORTED_TP | SUPPORTED_Autoneg | SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | SUPPORTED_1000baseT_Half | SUPPORTED_1000baseT_Full; | 2854 | cmd->supported = SUPPORTED_TP | |
2855 | if (status & VELOCITY_SPEED_100) | 2855 | SUPPORTED_Autoneg | |
2856 | SUPPORTED_10baseT_Half | | ||
2857 | SUPPORTED_10baseT_Full | | ||
2858 | SUPPORTED_100baseT_Half | | ||
2859 | SUPPORTED_100baseT_Full | | ||
2860 | SUPPORTED_1000baseT_Half | | ||
2861 | SUPPORTED_1000baseT_Full; | ||
2862 | if (status & VELOCITY_SPEED_1000) | ||
2863 | cmd->speed = SPEED_1000; | ||
2864 | else if (status & VELOCITY_SPEED_100) | ||
2856 | cmd->speed = SPEED_100; | 2865 | cmd->speed = SPEED_100; |
2857 | else | 2866 | else |
2858 | cmd->speed = SPEED_10; | 2867 | cmd->speed = SPEED_10; |
@@ -2896,7 +2905,7 @@ static u32 velocity_get_link(struct net_device *dev) | |||
2896 | { | 2905 | { |
2897 | struct velocity_info *vptr = netdev_priv(dev); | 2906 | struct velocity_info *vptr = netdev_priv(dev); |
2898 | struct mac_regs __iomem * regs = vptr->mac_regs; | 2907 | struct mac_regs __iomem * regs = vptr->mac_regs; |
2899 | return BYTE_REG_BITS_IS_ON(PHYSR0_LINKGD, ®s->PHYSR0) ? 0 : 1; | 2908 | return BYTE_REG_BITS_IS_ON(PHYSR0_LINKGD, ®s->PHYSR0) ? 1 : 0; |
2900 | } | 2909 | } |
2901 | 2910 | ||
2902 | static void velocity_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) | 2911 | static void velocity_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) |
diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig index fa9d2c4edc93..2e8ac995d56f 100644 --- a/drivers/net/wireless/Kconfig +++ b/drivers/net/wireless/Kconfig | |||
@@ -447,6 +447,7 @@ config AIRO_CS | |||
447 | tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards" | 447 | tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards" |
448 | depends on NET_RADIO && PCMCIA && (BROKEN || !M32R) | 448 | depends on NET_RADIO && PCMCIA && (BROKEN || !M32R) |
449 | select CRYPTO | 449 | select CRYPTO |
450 | select CRYPTO_AES | ||
450 | ---help--- | 451 | ---help--- |
451 | This is the standard Linux driver to support Cisco/Aironet PCMCIA | 452 | This is the standard Linux driver to support Cisco/Aironet PCMCIA |
452 | 802.11 wireless cards. This driver is the same as the Aironet | 453 | 802.11 wireless cards. This driver is the same as the Aironet |
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_main.c b/drivers/net/wireless/bcm43xx/bcm43xx_main.c index 3889f79e7128..df317c1e12a8 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_main.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_main.c | |||
@@ -3701,7 +3701,7 @@ static void bcm43xx_ieee80211_set_security(struct net_device *net_dev, | |||
3701 | } | 3701 | } |
3702 | if (sec->flags & SEC_AUTH_MODE) { | 3702 | if (sec->flags & SEC_AUTH_MODE) { |
3703 | secinfo->auth_mode = sec->auth_mode; | 3703 | secinfo->auth_mode = sec->auth_mode; |
3704 | dprintk(", .auth_mode = %d\n", sec->auth_mode); | 3704 | dprintk(", .auth_mode = %d", sec->auth_mode); |
3705 | } | 3705 | } |
3706 | dprintk("\n"); | 3706 | dprintk("\n"); |
3707 | if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED && | 3707 | if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED && |
diff --git a/drivers/net/wireless/orinoco.c b/drivers/net/wireless/orinoco.c index d6ed5781b93a..317ace7f9aae 100644 --- a/drivers/net/wireless/orinoco.c +++ b/drivers/net/wireless/orinoco.c | |||
@@ -2875,7 +2875,7 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev, | |||
2875 | if (orinoco_lock(priv, &flags) != 0) | 2875 | if (orinoco_lock(priv, &flags) != 0) |
2876 | return -EBUSY; | 2876 | return -EBUSY; |
2877 | 2877 | ||
2878 | if (erq->pointer) { | 2878 | if (erq->length > 0) { |
2879 | if ((index < 0) || (index >= ORINOCO_MAX_KEYS)) | 2879 | if ((index < 0) || (index >= ORINOCO_MAX_KEYS)) |
2880 | index = priv->tx_key; | 2880 | index = priv->tx_key; |
2881 | 2881 | ||
@@ -2918,7 +2918,7 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev, | |||
2918 | if (erq->flags & IW_ENCODE_RESTRICTED) | 2918 | if (erq->flags & IW_ENCODE_RESTRICTED) |
2919 | restricted = 1; | 2919 | restricted = 1; |
2920 | 2920 | ||
2921 | if (erq->pointer) { | 2921 | if (erq->pointer && erq->length > 0) { |
2922 | priv->keys[index].len = cpu_to_le16(xlen); | 2922 | priv->keys[index].len = cpu_to_le16(xlen); |
2923 | memset(priv->keys[index].data, 0, | 2923 | memset(priv->keys[index].data, 0, |
2924 | sizeof(priv->keys[index].data)); | 2924 | sizeof(priv->keys[index].data)); |
diff --git a/drivers/net/wireless/zd1201.c b/drivers/net/wireless/zd1201.c index 662ecc8a33ff..c52e9bcf8d02 100644 --- a/drivers/net/wireless/zd1201.c +++ b/drivers/net/wireless/zd1201.c | |||
@@ -1820,6 +1820,8 @@ static int zd1201_probe(struct usb_interface *interface, | |||
1820 | zd->dev->name); | 1820 | zd->dev->name); |
1821 | 1821 | ||
1822 | usb_set_intfdata(interface, zd); | 1822 | usb_set_intfdata(interface, zd); |
1823 | zd1201_enable(zd); /* zd1201 likes to startup enabled, */ | ||
1824 | zd1201_disable(zd); /* interfering with all the wifis in range */ | ||
1823 | return 0; | 1825 | return 0; |
1824 | 1826 | ||
1825 | err_net: | 1827 | err_net: |
diff --git a/drivers/net/wireless/zd1211rw/zd_chip.c b/drivers/net/wireless/zd1211rw/zd_chip.c index efc9c4bd826f..da9d06bdb818 100644 --- a/drivers/net/wireless/zd1211rw/zd_chip.c +++ b/drivers/net/wireless/zd1211rw/zd_chip.c | |||
@@ -797,7 +797,7 @@ static int zd1211_hw_init_hmac(struct zd_chip *chip) | |||
797 | { CR_ADDA_MBIAS_WARMTIME, 0x30000808 }, | 797 | { CR_ADDA_MBIAS_WARMTIME, 0x30000808 }, |
798 | { CR_ZD1211_RETRY_MAX, 0x2 }, | 798 | { CR_ZD1211_RETRY_MAX, 0x2 }, |
799 | { CR_SNIFFER_ON, 0 }, | 799 | { CR_SNIFFER_ON, 0 }, |
800 | { CR_RX_FILTER, AP_RX_FILTER }, | 800 | { CR_RX_FILTER, STA_RX_FILTER }, |
801 | { CR_GROUP_HASH_P1, 0x00 }, | 801 | { CR_GROUP_HASH_P1, 0x00 }, |
802 | { CR_GROUP_HASH_P2, 0x80000000 }, | 802 | { CR_GROUP_HASH_P2, 0x80000000 }, |
803 | { CR_REG1, 0xa4 }, | 803 | { CR_REG1, 0xa4 }, |
@@ -844,7 +844,7 @@ static int zd1211b_hw_init_hmac(struct zd_chip *chip) | |||
844 | { CR_ZD1211B_AIFS_CTL2, 0x008C003C }, | 844 | { CR_ZD1211B_AIFS_CTL2, 0x008C003C }, |
845 | { CR_ZD1211B_TXOP, 0x01800824 }, | 845 | { CR_ZD1211B_TXOP, 0x01800824 }, |
846 | { CR_SNIFFER_ON, 0 }, | 846 | { CR_SNIFFER_ON, 0 }, |
847 | { CR_RX_FILTER, AP_RX_FILTER }, | 847 | { CR_RX_FILTER, STA_RX_FILTER }, |
848 | { CR_GROUP_HASH_P1, 0x00 }, | 848 | { CR_GROUP_HASH_P1, 0x00 }, |
849 | { CR_GROUP_HASH_P2, 0x80000000 }, | 849 | { CR_GROUP_HASH_P2, 0x80000000 }, |
850 | { CR_REG1, 0xa4 }, | 850 | { CR_REG1, 0xa4 }, |
diff --git a/drivers/net/wireless/zd1211rw/zd_chip.h b/drivers/net/wireless/zd1211rw/zd_chip.h index 805121093ab5..069d2b467339 100644 --- a/drivers/net/wireless/zd1211rw/zd_chip.h +++ b/drivers/net/wireless/zd1211rw/zd_chip.h | |||
@@ -461,10 +461,15 @@ | |||
461 | 461 | ||
462 | #define CR_RX_FILTER CTL_REG(0x068c) | 462 | #define CR_RX_FILTER CTL_REG(0x068c) |
463 | #define RX_FILTER_ASSOC_RESPONSE 0x0002 | 463 | #define RX_FILTER_ASSOC_RESPONSE 0x0002 |
464 | #define RX_FILTER_REASSOC_RESPONSE 0x0008 | ||
464 | #define RX_FILTER_PROBE_RESPONSE 0x0020 | 465 | #define RX_FILTER_PROBE_RESPONSE 0x0020 |
465 | #define RX_FILTER_BEACON 0x0100 | 466 | #define RX_FILTER_BEACON 0x0100 |
467 | #define RX_FILTER_DISASSOC 0x0400 | ||
466 | #define RX_FILTER_AUTH 0x0800 | 468 | #define RX_FILTER_AUTH 0x0800 |
467 | /* Sniff modus sets filter to 0xfffff */ | 469 | #define AP_RX_FILTER 0x0400feff |
470 | #define STA_RX_FILTER 0x0000ffff | ||
471 | |||
472 | /* Monitor mode sets filter to 0xfffff */ | ||
468 | 473 | ||
469 | #define CR_ACK_TIMEOUT_EXT CTL_REG(0x0690) | 474 | #define CR_ACK_TIMEOUT_EXT CTL_REG(0x0690) |
470 | #define CR_BCN_FIFO_SEMAPHORE CTL_REG(0x0694) | 475 | #define CR_BCN_FIFO_SEMAPHORE CTL_REG(0x0694) |
@@ -546,9 +551,6 @@ | |||
546 | #define CR_ZD1211B_TXOP CTL_REG(0x0b20) | 551 | #define CR_ZD1211B_TXOP CTL_REG(0x0b20) |
547 | #define CR_ZD1211B_RETRY_MAX CTL_REG(0x0b28) | 552 | #define CR_ZD1211B_RETRY_MAX CTL_REG(0x0b28) |
548 | 553 | ||
549 | #define AP_RX_FILTER 0x0400feff | ||
550 | #define STA_RX_FILTER 0x0000ffff | ||
551 | |||
552 | #define CWIN_SIZE 0x007f043f | 554 | #define CWIN_SIZE 0x007f043f |
553 | 555 | ||
554 | 556 | ||
diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c index 3bdc54d128d0..d6f3e02a0b54 100644 --- a/drivers/net/wireless/zd1211rw/zd_mac.c +++ b/drivers/net/wireless/zd1211rw/zd_mac.c | |||
@@ -108,7 +108,9 @@ int zd_mac_init_hw(struct zd_mac *mac, u8 device_type) | |||
108 | if (r) | 108 | if (r) |
109 | goto disable_int; | 109 | goto disable_int; |
110 | 110 | ||
111 | r = zd_set_encryption_type(chip, NO_WEP); | 111 | /* We must inform the device that we are doing encryption/decryption in |
112 | * software at the moment. */ | ||
113 | r = zd_set_encryption_type(chip, ENC_SNIFFER); | ||
112 | if (r) | 114 | if (r) |
113 | goto disable_int; | 115 | goto disable_int; |
114 | 116 | ||
@@ -136,10 +138,8 @@ static int reset_mode(struct zd_mac *mac) | |||
136 | { | 138 | { |
137 | struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); | 139 | struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); |
138 | struct zd_ioreq32 ioreqs[3] = { | 140 | struct zd_ioreq32 ioreqs[3] = { |
139 | { CR_RX_FILTER, RX_FILTER_BEACON|RX_FILTER_PROBE_RESPONSE| | 141 | { CR_RX_FILTER, STA_RX_FILTER }, |
140 | RX_FILTER_AUTH|RX_FILTER_ASSOC_RESPONSE }, | ||
141 | { CR_SNIFFER_ON, 0U }, | 142 | { CR_SNIFFER_ON, 0U }, |
142 | { CR_ENCRYPTION_TYPE, NO_WEP }, | ||
143 | }; | 143 | }; |
144 | 144 | ||
145 | if (ieee->iw_mode == IW_MODE_MONITOR) { | 145 | if (ieee->iw_mode == IW_MODE_MONITOR) { |
@@ -713,10 +713,10 @@ static int zd_mac_tx(struct zd_mac *mac, struct ieee80211_txb *txb, int pri) | |||
713 | struct zd_rt_hdr { | 713 | struct zd_rt_hdr { |
714 | struct ieee80211_radiotap_header rt_hdr; | 714 | struct ieee80211_radiotap_header rt_hdr; |
715 | u8 rt_flags; | 715 | u8 rt_flags; |
716 | u8 rt_rate; | ||
716 | u16 rt_channel; | 717 | u16 rt_channel; |
717 | u16 rt_chbitmask; | 718 | u16 rt_chbitmask; |
718 | u16 rt_rate; | 719 | } __attribute__((packed)); |
719 | }; | ||
720 | 720 | ||
721 | static void fill_rt_header(void *buffer, struct zd_mac *mac, | 721 | static void fill_rt_header(void *buffer, struct zd_mac *mac, |
722 | const struct ieee80211_rx_stats *stats, | 722 | const struct ieee80211_rx_stats *stats, |
@@ -735,14 +735,14 @@ static void fill_rt_header(void *buffer, struct zd_mac *mac, | |||
735 | if (status->decryption_type & (ZD_RX_WEP64|ZD_RX_WEP128|ZD_RX_WEP256)) | 735 | if (status->decryption_type & (ZD_RX_WEP64|ZD_RX_WEP128|ZD_RX_WEP256)) |
736 | hdr->rt_flags |= IEEE80211_RADIOTAP_F_WEP; | 736 | hdr->rt_flags |= IEEE80211_RADIOTAP_F_WEP; |
737 | 737 | ||
738 | hdr->rt_rate = stats->rate / 5; | ||
739 | |||
738 | /* FIXME: 802.11a */ | 740 | /* FIXME: 802.11a */ |
739 | hdr->rt_channel = cpu_to_le16(ieee80211chan2mhz( | 741 | hdr->rt_channel = cpu_to_le16(ieee80211chan2mhz( |
740 | _zd_chip_get_channel(&mac->chip))); | 742 | _zd_chip_get_channel(&mac->chip))); |
741 | hdr->rt_chbitmask = cpu_to_le16(IEEE80211_CHAN_2GHZ | | 743 | hdr->rt_chbitmask = cpu_to_le16(IEEE80211_CHAN_2GHZ | |
742 | ((status->frame_status & ZD_RX_FRAME_MODULATION_MASK) == | 744 | ((status->frame_status & ZD_RX_FRAME_MODULATION_MASK) == |
743 | ZD_RX_OFDM ? IEEE80211_CHAN_OFDM : IEEE80211_CHAN_CCK)); | 745 | ZD_RX_OFDM ? IEEE80211_CHAN_OFDM : IEEE80211_CHAN_CCK)); |
744 | |||
745 | hdr->rt_rate = stats->rate / 5; | ||
746 | } | 746 | } |
747 | 747 | ||
748 | /* Returns 1 if the data packet is for us and 0 otherwise. */ | 748 | /* Returns 1 if the data packet is for us and 0 otherwise. */ |
diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c index 72f90525bf68..6320984126c7 100644 --- a/drivers/net/wireless/zd1211rw/zd_usb.c +++ b/drivers/net/wireless/zd1211rw/zd_usb.c | |||
@@ -323,7 +323,6 @@ static void disable_read_regs_int(struct zd_usb *usb) | |||
323 | { | 323 | { |
324 | struct zd_usb_interrupt *intr = &usb->intr; | 324 | struct zd_usb_interrupt *intr = &usb->intr; |
325 | 325 | ||
326 | ZD_ASSERT(in_interrupt()); | ||
327 | spin_lock(&intr->lock); | 326 | spin_lock(&intr->lock); |
328 | intr->read_regs_enabled = 0; | 327 | intr->read_regs_enabled = 0; |
329 | spin_unlock(&intr->lock); | 328 | spin_unlock(&intr->lock); |
@@ -545,11 +544,11 @@ static void handle_rx_packet(struct zd_usb *usb, const u8 *buffer, | |||
545 | * be padded. Unaligned access might also happen if the length_info | 544 | * be padded. Unaligned access might also happen if the length_info |
546 | * structure is not present. | 545 | * structure is not present. |
547 | */ | 546 | */ |
548 | if (get_unaligned(&length_info->tag) == RX_LENGTH_INFO_TAG) { | 547 | if (get_unaligned(&length_info->tag) == cpu_to_le16(RX_LENGTH_INFO_TAG)) |
548 | { | ||
549 | unsigned int l, k, n; | 549 | unsigned int l, k, n; |
550 | for (i = 0, l = 0;; i++) { | 550 | for (i = 0, l = 0;; i++) { |
551 | k = le16_to_cpu(get_unaligned( | 551 | k = le16_to_cpu(get_unaligned(&length_info->length[i])); |
552 | &length_info->length[i])); | ||
553 | n = l+k; | 552 | n = l+k; |
554 | if (n > length) | 553 | if (n > length) |
555 | return; | 554 | return; |
diff --git a/drivers/pci/hotplug/Kconfig b/drivers/pci/hotplug/Kconfig index 3fae77ffb2fa..8a60f391ffcf 100644 --- a/drivers/pci/hotplug/Kconfig +++ b/drivers/pci/hotplug/Kconfig | |||
@@ -76,7 +76,7 @@ config HOTPLUG_PCI_IBM | |||
76 | 76 | ||
77 | config HOTPLUG_PCI_ACPI | 77 | config HOTPLUG_PCI_ACPI |
78 | tristate "ACPI PCI Hotplug driver" | 78 | tristate "ACPI PCI Hotplug driver" |
79 | depends on ACPI_DOCK && HOTPLUG_PCI | 79 | depends on (!ACPI_DOCK && ACPI && HOTPLUG_PCI) || (ACPI_DOCK && HOTPLUG_PCI) |
80 | help | 80 | help |
81 | Say Y here if you have a system that supports PCI Hotplug using | 81 | Say Y here if you have a system that supports PCI Hotplug using |
82 | ACPI. | 82 | ACPI. |
@@ -153,13 +153,6 @@ config HOTPLUG_PCI_SHPC_POLL_EVENT_MODE | |||
153 | 153 | ||
154 | When in doubt, say N. | 154 | When in doubt, say N. |
155 | 155 | ||
156 | config HOTPLUG_PCI_SHPC_PHPRM_LEGACY | ||
157 | bool "For AMD SHPC only: Use $HRT for resource/configuration" | ||
158 | depends on HOTPLUG_PCI_SHPC && !ACPI | ||
159 | help | ||
160 | Say Y here for AMD SHPC. You have to select this option if you are | ||
161 | using this driver on platform with AMD SHPC. | ||
162 | |||
163 | config HOTPLUG_PCI_RPA | 156 | config HOTPLUG_PCI_RPA |
164 | tristate "RPA PCI Hotplug driver" | 157 | tristate "RPA PCI Hotplug driver" |
165 | depends on HOTPLUG_PCI && PPC_PSERIES && PPC64 && !HOTPLUG_PCI_FAKE | 158 | depends on HOTPLUG_PCI && PPC_PSERIES && PPC64 && !HOTPLUG_PCI_FAKE |
diff --git a/drivers/pci/hotplug/acpiphp_core.c b/drivers/pci/hotplug/acpiphp_core.c index 34de5697983d..e2fef60c2d06 100644 --- a/drivers/pci/hotplug/acpiphp_core.c +++ b/drivers/pci/hotplug/acpiphp_core.c | |||
@@ -27,8 +27,7 @@ | |||
27 | * along with this program; if not, write to the Free Software | 27 | * along with this program; if not, write to the Free Software |
28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
29 | * | 29 | * |
30 | * Send feedback to <gregkh@us.ibm.com>, | 30 | * Send feedback to <kristen.c.accardi@intel.com> |
31 | * <t-kochi@bq.jp.nec.com> | ||
32 | * | 31 | * |
33 | */ | 32 | */ |
34 | 33 | ||
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index ef95d12fb32c..ae67a8f55ba1 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
@@ -26,7 +26,7 @@ | |||
26 | * along with this program; if not, write to the Free Software | 26 | * along with this program; if not, write to the Free Software |
27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
28 | * | 28 | * |
29 | * Send feedback to <t-kochi@bq.jp.nec.com> | 29 | * Send feedback to <kristen.c.accardi@intel.com> |
30 | * | 30 | * |
31 | */ | 31 | */ |
32 | 32 | ||
diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h index ce89f5815861..eaea9d36a1bb 100644 --- a/drivers/pci/hotplug/pciehp.h +++ b/drivers/pci/hotplug/pciehp.h | |||
@@ -279,6 +279,11 @@ struct hpc_ops { | |||
279 | 279 | ||
280 | 280 | ||
281 | #ifdef CONFIG_ACPI | 281 | #ifdef CONFIG_ACPI |
282 | #include <acpi/acpi.h> | ||
283 | #include <acpi/acpi_bus.h> | ||
284 | #include <acpi/actypes.h> | ||
285 | #include <linux/pci-acpi.h> | ||
286 | |||
282 | #define pciehp_get_hp_hw_control_from_firmware(dev) \ | 287 | #define pciehp_get_hp_hw_control_from_firmware(dev) \ |
283 | pciehp_acpi_get_hp_hw_control_from_firmware(dev) | 288 | pciehp_acpi_get_hp_hw_control_from_firmware(dev) |
284 | static inline int pciehp_get_hp_params_from_firmware(struct pci_dev *dev, | 289 | static inline int pciehp_get_hp_params_from_firmware(struct pci_dev *dev, |
diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index 0d8fb6e607a1..6ab3b6cd2b54 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c | |||
@@ -38,10 +38,6 @@ | |||
38 | 38 | ||
39 | #include "../pci.h" | 39 | #include "../pci.h" |
40 | #include "pciehp.h" | 40 | #include "pciehp.h" |
41 | #include <acpi/acpi.h> | ||
42 | #include <acpi/acpi_bus.h> | ||
43 | #include <acpi/actypes.h> | ||
44 | #include <linux/pci-acpi.h> | ||
45 | #ifdef DEBUG | 41 | #ifdef DEBUG |
46 | #define DBG_K_TRACE_ENTRY ((unsigned int)0x00000001) /* On function entry */ | 42 | #define DBG_K_TRACE_ENTRY ((unsigned int)0x00000001) /* On function entry */ |
47 | #define DBG_K_TRACE_EXIT ((unsigned int)0x00000002) /* On function exit */ | 43 | #define DBG_K_TRACE_EXIT ((unsigned int)0x00000002) /* On function exit */ |
diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c index 50bfc1b2f3bf..478d0d28f7ad 100644 --- a/drivers/pci/pcie/portdrv_pci.c +++ b/drivers/pci/pcie/portdrv_pci.c | |||
@@ -30,23 +30,6 @@ MODULE_LICENSE("GPL"); | |||
30 | /* global data */ | 30 | /* global data */ |
31 | static const char device_name[] = "pcieport-driver"; | 31 | static const char device_name[] = "pcieport-driver"; |
32 | 32 | ||
33 | static int pcie_portdrv_save_config(struct pci_dev *dev) | ||
34 | { | ||
35 | return pci_save_state(dev); | ||
36 | } | ||
37 | |||
38 | static int pcie_portdrv_restore_config(struct pci_dev *dev) | ||
39 | { | ||
40 | int retval; | ||
41 | |||
42 | pci_restore_state(dev); | ||
43 | retval = pci_enable_device(dev); | ||
44 | if (retval) | ||
45 | return retval; | ||
46 | pci_set_master(dev); | ||
47 | return 0; | ||
48 | } | ||
49 | |||
50 | /* | 33 | /* |
51 | * pcie_portdrv_probe - Probe PCI-Express port devices | 34 | * pcie_portdrv_probe - Probe PCI-Express port devices |
52 | * @dev: PCI-Express port device being probed | 35 | * @dev: PCI-Express port device being probed |
@@ -73,8 +56,10 @@ static int __devinit pcie_portdrv_probe (struct pci_dev *dev, | |||
73 | "%s->Dev[%04x:%04x] has invalid IRQ. Check vendor BIOS\n", | 56 | "%s->Dev[%04x:%04x] has invalid IRQ. Check vendor BIOS\n", |
74 | __FUNCTION__, dev->device, dev->vendor); | 57 | __FUNCTION__, dev->device, dev->vendor); |
75 | } | 58 | } |
76 | if (pcie_port_device_register(dev)) | 59 | if (pcie_port_device_register(dev)) { |
60 | pci_disable_device(dev); | ||
77 | return -ENOMEM; | 61 | return -ENOMEM; |
62 | } | ||
78 | 63 | ||
79 | return 0; | 64 | return 0; |
80 | } | 65 | } |
@@ -86,6 +71,23 @@ static void pcie_portdrv_remove (struct pci_dev *dev) | |||
86 | } | 71 | } |
87 | 72 | ||
88 | #ifdef CONFIG_PM | 73 | #ifdef CONFIG_PM |
74 | static int pcie_portdrv_save_config(struct pci_dev *dev) | ||
75 | { | ||
76 | return pci_save_state(dev); | ||
77 | } | ||
78 | |||
79 | static int pcie_portdrv_restore_config(struct pci_dev *dev) | ||
80 | { | ||
81 | int retval; | ||
82 | |||
83 | pci_restore_state(dev); | ||
84 | retval = pci_enable_device(dev); | ||
85 | if (retval) | ||
86 | return retval; | ||
87 | pci_set_master(dev); | ||
88 | return 0; | ||
89 | } | ||
90 | |||
89 | static int pcie_portdrv_suspend (struct pci_dev *dev, pm_message_t state) | 91 | static int pcie_portdrv_suspend (struct pci_dev *dev, pm_message_t state) |
90 | { | 92 | { |
91 | int ret = pcie_port_device_suspend(dev, state); | 93 | int ret = pcie_port_device_suspend(dev, state); |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 5ca1e94887be..04618d4d7d74 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -990,6 +990,11 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) | |||
990 | case 0x8070: /* P4G8X Deluxe */ | 990 | case 0x8070: /* P4G8X Deluxe */ |
991 | asus_hides_smbus = 1; | 991 | asus_hides_smbus = 1; |
992 | } | 992 | } |
993 | if (dev->device == PCI_DEVICE_ID_INTEL_E7501_MCH) | ||
994 | switch (dev->subsystem_device) { | ||
995 | case 0x80c9: /* PU-DLS */ | ||
996 | asus_hides_smbus = 1; | ||
997 | } | ||
993 | if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB) | 998 | if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB) |
994 | switch (dev->subsystem_device) { | 999 | switch (dev->subsystem_device) { |
995 | case 0x1751: /* M2N notebook */ | 1000 | case 0x1751: /* M2N notebook */ |
@@ -1058,6 +1063,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845G_HB, asu | |||
1058 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82850_HB, asus_hides_smbus_hostbridge ); | 1063 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82850_HB, asus_hides_smbus_hostbridge ); |
1059 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82865_HB, asus_hides_smbus_hostbridge ); | 1064 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82865_HB, asus_hides_smbus_hostbridge ); |
1060 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_7205_0, asus_hides_smbus_hostbridge ); | 1065 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_7205_0, asus_hides_smbus_hostbridge ); |
1066 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7501_MCH, asus_hides_smbus_hostbridge ); | ||
1061 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855PM_HB, asus_hides_smbus_hostbridge ); | 1067 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855PM_HB, asus_hides_smbus_hostbridge ); |
1062 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855GM_HB, asus_hides_smbus_hostbridge ); | 1068 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855GM_HB, asus_hides_smbus_hostbridge ); |
1063 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82915GM_HB, asus_hides_smbus_hostbridge ); | 1069 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82915GM_HB, asus_hides_smbus_hostbridge ); |
@@ -1081,6 +1087,7 @@ static void __init asus_hides_smbus_lpc(struct pci_dev *dev) | |||
1081 | } | 1087 | } |
1082 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc ); | 1088 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc ); |
1083 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc ); | 1089 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc ); |
1090 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, asus_hides_smbus_lpc ); | ||
1084 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc ); | 1091 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc ); |
1085 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc ); | 1092 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc ); |
1086 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc ); | 1093 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc ); |
diff --git a/drivers/pci/search.c b/drivers/pci/search.c index 622b3f8ba820..d529462d1b53 100644 --- a/drivers/pci/search.c +++ b/drivers/pci/search.c | |||
@@ -41,7 +41,7 @@ pci_do_find_bus(struct pci_bus* bus, unsigned char busnr) | |||
41 | * in the global list of PCI buses. If the bus is found, a pointer to its | 41 | * in the global list of PCI buses. If the bus is found, a pointer to its |
42 | * data structure is returned. If no bus is found, %NULL is returned. | 42 | * data structure is returned. If no bus is found, %NULL is returned. |
43 | */ | 43 | */ |
44 | struct pci_bus * __devinit pci_find_bus(int domain, int busnr) | 44 | struct pci_bus * pci_find_bus(int domain, int busnr) |
45 | { | 45 | { |
46 | struct pci_bus *bus = NULL; | 46 | struct pci_bus *bus = NULL; |
47 | struct pci_bus *tmp_bus; | 47 | struct pci_bus *tmp_bus; |
@@ -61,7 +61,7 @@ struct pci_bus * __devinit pci_find_bus(int domain, int busnr) | |||
61 | * @from: Previous PCI bus found, or %NULL for new search. | 61 | * @from: Previous PCI bus found, or %NULL for new search. |
62 | * | 62 | * |
63 | * Iterates through the list of known PCI busses. A new search is | 63 | * Iterates through the list of known PCI busses. A new search is |
64 | * initiated by passing %NULL to the @from argument. Otherwise if | 64 | * initiated by passing %NULL as the @from argument. Otherwise if |
65 | * @from is not %NULL, searches continue from next device on the | 65 | * @from is not %NULL, searches continue from next device on the |
66 | * global list. | 66 | * global list. |
67 | */ | 67 | */ |
@@ -148,13 +148,14 @@ struct pci_dev * pci_get_slot(struct pci_bus *bus, unsigned int devfn) | |||
148 | * @from: Previous PCI device found in search, or %NULL for new search. | 148 | * @from: Previous PCI device found in search, or %NULL for new search. |
149 | * | 149 | * |
150 | * Iterates through the list of known PCI devices. If a PCI device is | 150 | * Iterates through the list of known PCI devices. If a PCI device is |
151 | * found with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its | 151 | * found with a matching @vendor, @device, @ss_vendor and @ss_device, a |
152 | * device structure is returned. Otherwise, %NULL is returned. | 152 | * pointer to its device structure is returned. Otherwise, %NULL is returned. |
153 | * A new search is initiated by passing %NULL to the @from argument. | 153 | * A new search is initiated by passing %NULL as the @from argument. |
154 | * Otherwise if @from is not %NULL, searches continue from next device on the global list. | 154 | * Otherwise if @from is not %NULL, searches continue from next device |
155 | * on the global list. | ||
155 | * | 156 | * |
156 | * NOTE: Do not use this function anymore, use pci_get_subsys() instead, as | 157 | * NOTE: Do not use this function any more; use pci_get_subsys() instead, as |
157 | * the pci device returned by this function can disappear at any moment in | 158 | * the PCI device returned by this function can disappear at any moment in |
158 | * time. | 159 | * time. |
159 | */ | 160 | */ |
160 | static struct pci_dev * pci_find_subsys(unsigned int vendor, | 161 | static struct pci_dev * pci_find_subsys(unsigned int vendor, |
@@ -191,14 +192,15 @@ exit: | |||
191 | * @device: PCI device id to match, or %PCI_ANY_ID to match all device ids | 192 | * @device: PCI device id to match, or %PCI_ANY_ID to match all device ids |
192 | * @from: Previous PCI device found in search, or %NULL for new search. | 193 | * @from: Previous PCI device found in search, or %NULL for new search. |
193 | * | 194 | * |
194 | * Iterates through the list of known PCI devices. If a PCI device is | 195 | * Iterates through the list of known PCI devices. If a PCI device is found |
195 | * found with a matching @vendor and @device, a pointer to its device structure is | 196 | * with a matching @vendor and @device, a pointer to its device structure is |
196 | * returned. Otherwise, %NULL is returned. | 197 | * returned. Otherwise, %NULL is returned. |
197 | * A new search is initiated by passing %NULL to the @from argument. | 198 | * A new search is initiated by passing %NULL as the @from argument. |
198 | * Otherwise if @from is not %NULL, searches continue from next device on the global list. | 199 | * Otherwise if @from is not %NULL, searches continue from next device |
200 | * on the global list. | ||
199 | * | 201 | * |
200 | * NOTE: Do not use this function anymore, use pci_get_device() instead, as | 202 | * NOTE: Do not use this function any more; use pci_get_device() instead, as |
201 | * the pci device returned by this function can disappear at any moment in | 203 | * the PCI device returned by this function can disappear at any moment in |
202 | * time. | 204 | * time. |
203 | */ | 205 | */ |
204 | struct pci_dev * | 206 | struct pci_dev * |
@@ -215,11 +217,11 @@ pci_find_device(unsigned int vendor, unsigned int device, const struct pci_dev * | |||
215 | * @ss_device: PCI subsystem device id to match, or %PCI_ANY_ID to match all device ids | 217 | * @ss_device: PCI subsystem device id to match, or %PCI_ANY_ID to match all device ids |
216 | * @from: Previous PCI device found in search, or %NULL for new search. | 218 | * @from: Previous PCI device found in search, or %NULL for new search. |
217 | * | 219 | * |
218 | * Iterates through the list of known PCI devices. If a PCI device is | 220 | * Iterates through the list of known PCI devices. If a PCI device is found |
219 | * found with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its | 221 | * with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its |
220 | * device structure is returned, and the reference count to the device is | 222 | * device structure is returned, and the reference count to the device is |
221 | * incremented. Otherwise, %NULL is returned. A new search is initiated by | 223 | * incremented. Otherwise, %NULL is returned. A new search is initiated by |
222 | * passing %NULL to the @from argument. Otherwise if @from is not %NULL, | 224 | * passing %NULL as the @from argument. Otherwise if @from is not %NULL, |
223 | * searches continue from next device on the global list. | 225 | * searches continue from next device on the global list. |
224 | * The reference count for @from is always decremented if it is not %NULL. | 226 | * The reference count for @from is always decremented if it is not %NULL. |
225 | */ | 227 | */ |
@@ -262,7 +264,7 @@ exit: | |||
262 | * found with a matching @vendor and @device, the reference count to the | 264 | * found with a matching @vendor and @device, the reference count to the |
263 | * device is incremented and a pointer to its device structure is returned. | 265 | * device is incremented and a pointer to its device structure is returned. |
264 | * Otherwise, %NULL is returned. A new search is initiated by passing %NULL | 266 | * Otherwise, %NULL is returned. A new search is initiated by passing %NULL |
265 | * to the @from argument. Otherwise if @from is not %NULL, searches continue | 267 | * as the @from argument. Otherwise if @from is not %NULL, searches continue |
266 | * from next device on the global list. The reference count for @from is | 268 | * from next device on the global list. The reference count for @from is |
267 | * always decremented if it is not %NULL. | 269 | * always decremented if it is not %NULL. |
268 | */ | 270 | */ |
@@ -279,11 +281,13 @@ pci_get_device(unsigned int vendor, unsigned int device, struct pci_dev *from) | |||
279 | * @device: PCI device id to match, or %PCI_ANY_ID to match all device ids | 281 | * @device: PCI device id to match, or %PCI_ANY_ID to match all device ids |
280 | * @from: Previous PCI device found in search, or %NULL for new search. | 282 | * @from: Previous PCI device found in search, or %NULL for new search. |
281 | * | 283 | * |
282 | * Iterates through the list of known PCI devices in the reverse order of pci_find_device(). | 284 | * Iterates through the list of known PCI devices in the reverse order of |
285 | * pci_find_device(). | ||
283 | * If a PCI device is found with a matching @vendor and @device, a pointer to | 286 | * If a PCI device is found with a matching @vendor and @device, a pointer to |
284 | * its device structure is returned. Otherwise, %NULL is returned. | 287 | * its device structure is returned. Otherwise, %NULL is returned. |
285 | * A new search is initiated by passing %NULL to the @from argument. | 288 | * A new search is initiated by passing %NULL as the @from argument. |
286 | * Otherwise if @from is not %NULL, searches continue from previous device on the global list. | 289 | * Otherwise if @from is not %NULL, searches continue from previous device |
290 | * on the global list. | ||
287 | */ | 291 | */ |
288 | struct pci_dev * | 292 | struct pci_dev * |
289 | pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct pci_dev *from) | 293 | pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct pci_dev *from) |
@@ -317,7 +321,7 @@ exit: | |||
317 | * found with a matching @class, the reference count to the device is | 321 | * found with a matching @class, the reference count to the device is |
318 | * incremented and a pointer to its device structure is returned. | 322 | * incremented and a pointer to its device structure is returned. |
319 | * Otherwise, %NULL is returned. | 323 | * Otherwise, %NULL is returned. |
320 | * A new search is initiated by passing %NULL to the @from argument. | 324 | * A new search is initiated by passing %NULL as the @from argument. |
321 | * Otherwise if @from is not %NULL, searches continue from next device | 325 | * Otherwise if @from is not %NULL, searches continue from next device |
322 | * on the global list. The reference count for @from is always decremented | 326 | * on the global list. The reference count for @from is always decremented |
323 | * if it is not %NULL. | 327 | * if it is not %NULL. |
diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c index 738b1ef595a3..9ad18e62658d 100644 --- a/drivers/pcmcia/pcmcia_ioctl.c +++ b/drivers/pcmcia/pcmcia_ioctl.c | |||
@@ -601,12 +601,8 @@ static int ds_ioctl(struct inode * inode, struct file * file, | |||
601 | ret = CS_BAD_ARGS; | 601 | ret = CS_BAD_ARGS; |
602 | else { | 602 | else { |
603 | struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->config.Function); | 603 | struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->config.Function); |
604 | if (p_dev == NULL) | 604 | ret = pccard_get_configuration_info(s, p_dev, &buf->config); |
605 | ret = CS_BAD_ARGS; | 605 | pcmcia_put_dev(p_dev); |
606 | else { | ||
607 | ret = pccard_get_configuration_info(s, p_dev, &buf->config); | ||
608 | pcmcia_put_dev(p_dev); | ||
609 | } | ||
610 | } | 606 | } |
611 | break; | 607 | break; |
612 | case DS_GET_FIRST_TUPLE: | 608 | case DS_GET_FIRST_TUPLE: |
@@ -636,12 +632,8 @@ static int ds_ioctl(struct inode * inode, struct file * file, | |||
636 | ret = CS_BAD_ARGS; | 632 | ret = CS_BAD_ARGS; |
637 | else { | 633 | else { |
638 | struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->status.Function); | 634 | struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->status.Function); |
639 | if (p_dev == NULL) | 635 | ret = pccard_get_status(s, p_dev, &buf->status); |
640 | ret = CS_BAD_ARGS; | 636 | pcmcia_put_dev(p_dev); |
641 | else { | ||
642 | ret = pccard_get_status(s, p_dev, &buf->status); | ||
643 | pcmcia_put_dev(p_dev); | ||
644 | } | ||
645 | } | 637 | } |
646 | break; | 638 | break; |
647 | case DS_VALIDATE_CIS: | 639 | case DS_VALIDATE_CIS: |
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index 7bf25b88ea31..c8323399e9e4 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
@@ -245,10 +245,17 @@ int pccard_get_configuration_info(struct pcmcia_socket *s, | |||
245 | return CS_SUCCESS; | 245 | return CS_SUCCESS; |
246 | } | 246 | } |
247 | 247 | ||
248 | /* !!! This is a hack !!! */ | 248 | config->Attributes = c->Attributes | CONF_VALID_CLIENT; |
249 | memcpy(&config->Attributes, &c->Attributes, sizeof(config_t)); | 249 | config->Vcc = s->socket.Vcc; |
250 | config->Attributes |= CONF_VALID_CLIENT; | 250 | config->Vpp1 = config->Vpp2 = s->socket.Vpp; |
251 | config->CardValues = c->CardValues; | 251 | config->IntType = c->IntType; |
252 | config->ConfigBase = c->ConfigBase; | ||
253 | config->Status = c->Status; | ||
254 | config->Pin = c->Pin; | ||
255 | config->Copy = c->Copy; | ||
256 | config->Option = c->Option; | ||
257 | config->ExtStatus = c->ExtStatus; | ||
258 | config->Present = config->CardValues = c->CardValues; | ||
252 | config->IRQAttributes = c->irq.Attributes; | 259 | config->IRQAttributes = c->irq.Attributes; |
253 | config->AssignedIRQ = s->irq.AssignedIRQ; | 260 | config->AssignedIRQ = s->irq.AssignedIRQ; |
254 | config->BasePort1 = c->io.BasePort1; | 261 | config->BasePort1 = c->io.BasePort1; |
diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c index 3163e3d73da1..9d8b415eca79 100644 --- a/drivers/pnp/interface.c +++ b/drivers/pnp/interface.c | |||
@@ -265,8 +265,8 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at | |||
265 | pnp_printf(buffer," disabled\n"); | 265 | pnp_printf(buffer," disabled\n"); |
266 | else | 266 | else |
267 | pnp_printf(buffer," 0x%llx-0x%llx\n", | 267 | pnp_printf(buffer," 0x%llx-0x%llx\n", |
268 | pnp_port_start(dev, i), | 268 | (unsigned long long)pnp_port_start(dev, i), |
269 | pnp_port_end(dev, i)); | 269 | (unsigned long long)pnp_port_end(dev, i)); |
270 | } | 270 | } |
271 | } | 271 | } |
272 | for (i = 0; i < PNP_MAX_MEM; i++) { | 272 | for (i = 0; i < PNP_MAX_MEM; i++) { |
@@ -276,8 +276,8 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at | |||
276 | pnp_printf(buffer," disabled\n"); | 276 | pnp_printf(buffer," disabled\n"); |
277 | else | 277 | else |
278 | pnp_printf(buffer," 0x%llx-0x%llx\n", | 278 | pnp_printf(buffer," 0x%llx-0x%llx\n", |
279 | pnp_mem_start(dev, i), | 279 | (unsigned long long)pnp_mem_start(dev, i), |
280 | pnp_mem_end(dev, i)); | 280 | (unsigned long long)pnp_mem_end(dev, i)); |
281 | } | 281 | } |
282 | } | 282 | } |
283 | for (i = 0; i < PNP_MAX_IRQ; i++) { | 283 | for (i = 0; i < PNP_MAX_IRQ; i++) { |
@@ -287,7 +287,7 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at | |||
287 | pnp_printf(buffer," disabled\n"); | 287 | pnp_printf(buffer," disabled\n"); |
288 | else | 288 | else |
289 | pnp_printf(buffer," %lld\n", | 289 | pnp_printf(buffer," %lld\n", |
290 | pnp_irq(dev, i)); | 290 | (unsigned long long)pnp_irq(dev, i)); |
291 | } | 291 | } |
292 | } | 292 | } |
293 | for (i = 0; i < PNP_MAX_DMA; i++) { | 293 | for (i = 0; i < PNP_MAX_DMA; i++) { |
@@ -297,7 +297,7 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at | |||
297 | pnp_printf(buffer," disabled\n"); | 297 | pnp_printf(buffer," disabled\n"); |
298 | else | 298 | else |
299 | pnp_printf(buffer," %lld\n", | 299 | pnp_printf(buffer," %lld\n", |
300 | pnp_dma(dev, i)); | 300 | (unsigned long long)pnp_dma(dev, i)); |
301 | } | 301 | } |
302 | } | 302 | } |
303 | ret = (buffer->curr - buf); | 303 | ret = (buffer->curr - buf); |
diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c index 212268881857..dc79b0a0059f 100644 --- a/drivers/pnp/pnpacpi/rsparser.c +++ b/drivers/pnp/pnpacpi/rsparser.c | |||
@@ -173,6 +173,9 @@ pnpacpi_parse_allocated_address_space(struct pnp_resource_table *res_table, | |||
173 | return; | 173 | return; |
174 | } | 174 | } |
175 | 175 | ||
176 | if (p->producer_consumer == ACPI_PRODUCER) | ||
177 | return; | ||
178 | |||
176 | if (p->resource_type == ACPI_MEMORY_RANGE) | 179 | if (p->resource_type == ACPI_MEMORY_RANGE) |
177 | pnpacpi_parse_allocated_memresource(res_table, | 180 | pnpacpi_parse_allocated_memresource(res_table, |
178 | p->minimum, p->address_length); | 181 | p->minimum, p->address_length); |
@@ -252,9 +255,14 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res, | |||
252 | break; | 255 | break; |
253 | 256 | ||
254 | case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64: | 257 | case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64: |
258 | if (res->data.ext_address64.producer_consumer == ACPI_PRODUCER) | ||
259 | return AE_OK; | ||
255 | break; | 260 | break; |
256 | 261 | ||
257 | case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: | 262 | case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: |
263 | if (res->data.extended_irq.producer_consumer == ACPI_PRODUCER) | ||
264 | return AE_OK; | ||
265 | |||
258 | for (i = 0; i < res->data.extended_irq.interrupt_count; i++) { | 266 | for (i = 0; i < res->data.extended_irq.interrupt_count; i++) { |
259 | pnpacpi_parse_allocated_irqresource(res_table, | 267 | pnpacpi_parse_allocated_irqresource(res_table, |
260 | res->data.extended_irq.interrupts[i], | 268 | res->data.extended_irq.interrupts[i], |
diff --git a/drivers/pnp/pnpbios/core.c b/drivers/pnp/pnpbios/core.c index b154b3f52cbe..551f58e29810 100644 --- a/drivers/pnp/pnpbios/core.c +++ b/drivers/pnp/pnpbios/core.c | |||
@@ -346,7 +346,7 @@ static int insert_device(struct pnp_dev *dev, struct pnp_bios_node * node) | |||
346 | dev->flags = node->flags; | 346 | dev->flags = node->flags; |
347 | if (!(dev->flags & PNPBIOS_NO_CONFIG)) | 347 | if (!(dev->flags & PNPBIOS_NO_CONFIG)) |
348 | dev->capabilities |= PNP_CONFIGURABLE; | 348 | dev->capabilities |= PNP_CONFIGURABLE; |
349 | if (!(dev->flags & PNPBIOS_NO_DISABLE)) | 349 | if (!(dev->flags & PNPBIOS_NO_DISABLE) && pnpbios_is_dynamic(dev)) |
350 | dev->capabilities |= PNP_DISABLE; | 350 | dev->capabilities |= PNP_DISABLE; |
351 | dev->capabilities |= PNP_READ; | 351 | dev->capabilities |= PNP_READ; |
352 | if (pnpbios_is_dynamic(dev)) | 352 | if (pnpbios_is_dynamic(dev)) |
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 4bf03fb67f8d..d8e9b95f0a1a 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
@@ -1730,8 +1730,8 @@ dasd_flush_request_queue(struct dasd_device * device) | |||
1730 | req = elv_next_request(device->request_queue); | 1730 | req = elv_next_request(device->request_queue); |
1731 | if (req == NULL) | 1731 | if (req == NULL) |
1732 | break; | 1732 | break; |
1733 | dasd_end_request(req, 0); | ||
1734 | blkdev_dequeue_request(req); | 1733 | blkdev_dequeue_request(req); |
1734 | dasd_end_request(req, 0); | ||
1735 | } | 1735 | } |
1736 | spin_unlock_irq(&device->request_queue_lock); | 1736 | spin_unlock_irq(&device->request_queue_lock); |
1737 | } | 1737 | } |
diff --git a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c index 7f6fdac74706..9d0c6e1a0e66 100644 --- a/drivers/s390/block/dasd_devmap.c +++ b/drivers/s390/block/dasd_devmap.c | |||
@@ -48,18 +48,20 @@ struct dasd_devmap { | |||
48 | }; | 48 | }; |
49 | 49 | ||
50 | /* | 50 | /* |
51 | * dasd_servermap is used to store the server_id of all storage servers | 51 | * dasd_server_ssid_map contains a globally unique storage server subsystem ID. |
52 | * accessed by DASD device driver. | 52 | * dasd_server_ssid_list contains the list of all subsystem IDs accessed by |
53 | * the DASD device driver. | ||
53 | */ | 54 | */ |
54 | struct dasd_servermap { | 55 | struct dasd_server_ssid_map { |
55 | struct list_head list; | 56 | struct list_head list; |
56 | struct server_id { | 57 | struct server_id { |
57 | char vendor[4]; | 58 | char vendor[4]; |
58 | char serial[15]; | 59 | char serial[15]; |
59 | } sid; | 60 | } sid; |
61 | __u16 ssid; | ||
60 | }; | 62 | }; |
61 | 63 | ||
62 | static struct list_head dasd_serverlist; | 64 | static struct list_head dasd_server_ssid_list; |
63 | 65 | ||
64 | /* | 66 | /* |
65 | * Parameter parsing functions for dasd= parameter. The syntax is: | 67 | * Parameter parsing functions for dasd= parameter. The syntax is: |
@@ -89,7 +91,7 @@ static char *dasd[256]; | |||
89 | module_param_array(dasd, charp, NULL, 0); | 91 | module_param_array(dasd, charp, NULL, 0); |
90 | 92 | ||
91 | /* | 93 | /* |
92 | * Single spinlock to protect devmap structures and lists. | 94 | * Single spinlock to protect devmap and servermap structures and lists. |
93 | */ | 95 | */ |
94 | static DEFINE_SPINLOCK(dasd_devmap_lock); | 96 | static DEFINE_SPINLOCK(dasd_devmap_lock); |
95 | 97 | ||
@@ -264,8 +266,9 @@ dasd_parse_keyword( char *parsestring ) { | |||
264 | if (dasd_page_cache) | 266 | if (dasd_page_cache) |
265 | return residual_str; | 267 | return residual_str; |
266 | dasd_page_cache = | 268 | dasd_page_cache = |
267 | kmem_cache_create("dasd_page_cache", PAGE_SIZE, 0, | 269 | kmem_cache_create("dasd_page_cache", PAGE_SIZE, |
268 | SLAB_CACHE_DMA, NULL, NULL ); | 270 | PAGE_SIZE, SLAB_CACHE_DMA, |
271 | NULL, NULL ); | ||
269 | if (!dasd_page_cache) | 272 | if (!dasd_page_cache) |
270 | MESSAGE(KERN_WARNING, "%s", "Failed to create slab, " | 273 | MESSAGE(KERN_WARNING, "%s", "Failed to create slab, " |
271 | "fixed buffer mode disabled."); | 274 | "fixed buffer mode disabled."); |
@@ -859,39 +862,6 @@ static struct attribute_group dasd_attr_group = { | |||
859 | }; | 862 | }; |
860 | 863 | ||
861 | /* | 864 | /* |
862 | * Check if the related storage server is already contained in the | ||
863 | * dasd_serverlist. If server is not contained, create new entry. | ||
864 | * Return 0 if server was already in serverlist, | ||
865 | * 1 if the server was added successfully | ||
866 | * <0 in case of error. | ||
867 | */ | ||
868 | static int | ||
869 | dasd_add_server(struct dasd_uid *uid) | ||
870 | { | ||
871 | struct dasd_servermap *new, *tmp; | ||
872 | |||
873 | /* check if server is already contained */ | ||
874 | list_for_each_entry(tmp, &dasd_serverlist, list) | ||
875 | // normale cmp? | ||
876 | if (strncmp(tmp->sid.vendor, uid->vendor, | ||
877 | sizeof(tmp->sid.vendor)) == 0 | ||
878 | && strncmp(tmp->sid.serial, uid->serial, | ||
879 | sizeof(tmp->sid.serial)) == 0) | ||
880 | return 0; | ||
881 | |||
882 | new = (struct dasd_servermap *) | ||
883 | kzalloc(sizeof(struct dasd_servermap), GFP_KERNEL); | ||
884 | if (!new) | ||
885 | return -ENOMEM; | ||
886 | |||
887 | strncpy(new->sid.vendor, uid->vendor, sizeof(new->sid.vendor)); | ||
888 | strncpy(new->sid.serial, uid->serial, sizeof(new->sid.serial)); | ||
889 | list_add(&new->list, &dasd_serverlist); | ||
890 | return 1; | ||
891 | } | ||
892 | |||
893 | |||
894 | /* | ||
895 | * Return copy of the device unique identifier. | 865 | * Return copy of the device unique identifier. |
896 | */ | 866 | */ |
897 | int | 867 | int |
@@ -910,6 +880,9 @@ dasd_get_uid(struct ccw_device *cdev, struct dasd_uid *uid) | |||
910 | 880 | ||
911 | /* | 881 | /* |
912 | * Register the given device unique identifier into devmap struct. | 882 | * Register the given device unique identifier into devmap struct. |
883 | * In addition check if the related storage server subsystem ID is already | ||
884 | * contained in the dasd_server_ssid_list. If subsystem ID is not contained, | ||
885 | * create new entry. | ||
913 | * Return 0 if server was already in serverlist, | 886 | * Return 0 if server was already in serverlist, |
914 | * 1 if the server was added successful | 887 | * 1 if the server was added successful |
915 | * <0 in case of error. | 888 | * <0 in case of error. |
@@ -918,16 +891,39 @@ int | |||
918 | dasd_set_uid(struct ccw_device *cdev, struct dasd_uid *uid) | 891 | dasd_set_uid(struct ccw_device *cdev, struct dasd_uid *uid) |
919 | { | 892 | { |
920 | struct dasd_devmap *devmap; | 893 | struct dasd_devmap *devmap; |
921 | int rc; | 894 | struct dasd_server_ssid_map *srv, *tmp; |
922 | 895 | ||
923 | devmap = dasd_find_busid(cdev->dev.bus_id); | 896 | devmap = dasd_find_busid(cdev->dev.bus_id); |
924 | if (IS_ERR(devmap)) | 897 | if (IS_ERR(devmap)) |
925 | return PTR_ERR(devmap); | 898 | return PTR_ERR(devmap); |
899 | |||
900 | /* generate entry for server_ssid_map */ | ||
901 | srv = (struct dasd_server_ssid_map *) | ||
902 | kzalloc(sizeof(struct dasd_server_ssid_map), GFP_KERNEL); | ||
903 | if (!srv) | ||
904 | return -ENOMEM; | ||
905 | strncpy(srv->sid.vendor, uid->vendor, sizeof(srv->sid.vendor) - 1); | ||
906 | strncpy(srv->sid.serial, uid->serial, sizeof(srv->sid.serial) - 1); | ||
907 | srv->ssid = uid->ssid; | ||
908 | |||
909 | /* server is already contained ? */ | ||
926 | spin_lock(&dasd_devmap_lock); | 910 | spin_lock(&dasd_devmap_lock); |
927 | devmap->uid = *uid; | 911 | devmap->uid = *uid; |
928 | rc = dasd_add_server(uid); | 912 | list_for_each_entry(tmp, &dasd_server_ssid_list, list) { |
913 | if (!memcmp(&srv->sid, &tmp->sid, | ||
914 | sizeof(struct dasd_server_ssid_map))) { | ||
915 | kfree(srv); | ||
916 | srv = NULL; | ||
917 | break; | ||
918 | } | ||
919 | } | ||
920 | |||
921 | /* add servermap to serverlist */ | ||
922 | if (srv) | ||
923 | list_add(&srv->list, &dasd_server_ssid_list); | ||
929 | spin_unlock(&dasd_devmap_lock); | 924 | spin_unlock(&dasd_devmap_lock); |
930 | return rc; | 925 | |
926 | return (srv ? 1 : 0); | ||
931 | } | 927 | } |
932 | EXPORT_SYMBOL_GPL(dasd_set_uid); | 928 | EXPORT_SYMBOL_GPL(dasd_set_uid); |
933 | 929 | ||
@@ -995,7 +991,7 @@ dasd_devmap_init(void) | |||
995 | INIT_LIST_HEAD(&dasd_hashlists[i]); | 991 | INIT_LIST_HEAD(&dasd_hashlists[i]); |
996 | 992 | ||
997 | /* Initialize servermap structure. */ | 993 | /* Initialize servermap structure. */ |
998 | INIT_LIST_HEAD(&dasd_serverlist); | 994 | INIT_LIST_HEAD(&dasd_server_ssid_list); |
999 | return 0; | 995 | return 0; |
1000 | } | 996 | } |
1001 | 997 | ||
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 39c2281371b5..957ed5db98e4 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
@@ -468,11 +468,11 @@ dasd_eckd_generate_uid(struct dasd_device *device, struct dasd_uid *uid) | |||
468 | return -ENODEV; | 468 | return -ENODEV; |
469 | 469 | ||
470 | memset(uid, 0, sizeof(struct dasd_uid)); | 470 | memset(uid, 0, sizeof(struct dasd_uid)); |
471 | strncpy(uid->vendor, confdata->ned1.HDA_manufacturer, | 471 | memcpy(uid->vendor, confdata->ned1.HDA_manufacturer, |
472 | sizeof(uid->vendor) - 1); | 472 | sizeof(uid->vendor) - 1); |
473 | EBCASC(uid->vendor, sizeof(uid->vendor) - 1); | 473 | EBCASC(uid->vendor, sizeof(uid->vendor) - 1); |
474 | strncpy(uid->serial, confdata->ned1.HDA_location, | 474 | memcpy(uid->serial, confdata->ned1.HDA_location, |
475 | sizeof(uid->serial) - 1); | 475 | sizeof(uid->serial) - 1); |
476 | EBCASC(uid->serial, sizeof(uid->serial) - 1); | 476 | EBCASC(uid->serial, sizeof(uid->serial) - 1); |
477 | uid->ssid = confdata->neq.subsystemID; | 477 | uid->ssid = confdata->neq.subsystemID; |
478 | if (confdata->ned2.sneq.flags == 0x40) { | 478 | if (confdata->ned2.sneq.flags == 0x40) { |
diff --git a/drivers/s390/block/xpram.c b/drivers/s390/block/xpram.c index 1140302ff11d..ca7d51f7eccc 100644 --- a/drivers/s390/block/xpram.c +++ b/drivers/s390/block/xpram.c | |||
@@ -48,15 +48,6 @@ | |||
48 | #define PRINT_ERR(x...) printk(KERN_ERR XPRAM_NAME " error:" x) | 48 | #define PRINT_ERR(x...) printk(KERN_ERR XPRAM_NAME " error:" x) |
49 | 49 | ||
50 | 50 | ||
51 | static struct sysdev_class xpram_sysclass = { | ||
52 | set_kset_name("xpram"), | ||
53 | }; | ||
54 | |||
55 | static struct sys_device xpram_sys_device = { | ||
56 | .id = 0, | ||
57 | .cls = &xpram_sysclass, | ||
58 | }; | ||
59 | |||
60 | typedef struct { | 51 | typedef struct { |
61 | unsigned int size; /* size of xpram segment in pages */ | 52 | unsigned int size; /* size of xpram segment in pages */ |
62 | unsigned int offset; /* start page of xpram segment */ | 53 | unsigned int offset; /* start page of xpram segment */ |
@@ -451,8 +442,6 @@ static void __exit xpram_exit(void) | |||
451 | } | 442 | } |
452 | unregister_blkdev(XPRAM_MAJOR, XPRAM_NAME); | 443 | unregister_blkdev(XPRAM_MAJOR, XPRAM_NAME); |
453 | blk_cleanup_queue(xpram_queue); | 444 | blk_cleanup_queue(xpram_queue); |
454 | sysdev_unregister(&xpram_sys_device); | ||
455 | sysdev_class_unregister(&xpram_sysclass); | ||
456 | } | 445 | } |
457 | 446 | ||
458 | static int __init xpram_init(void) | 447 | static int __init xpram_init(void) |
@@ -470,19 +459,7 @@ static int __init xpram_init(void) | |||
470 | rc = xpram_setup_sizes(xpram_pages); | 459 | rc = xpram_setup_sizes(xpram_pages); |
471 | if (rc) | 460 | if (rc) |
472 | return rc; | 461 | return rc; |
473 | rc = sysdev_class_register(&xpram_sysclass); | 462 | return xpram_setup_blkdev(); |
474 | if (rc) | ||
475 | return rc; | ||
476 | |||
477 | rc = sysdev_register(&xpram_sys_device); | ||
478 | if (rc) { | ||
479 | sysdev_class_unregister(&xpram_sysclass); | ||
480 | return rc; | ||
481 | } | ||
482 | rc = xpram_setup_blkdev(); | ||
483 | if (rc) | ||
484 | sysdev_unregister(&xpram_sys_device); | ||
485 | return rc; | ||
486 | } | 463 | } |
487 | 464 | ||
488 | module_init(xpram_init); | 465 | module_init(xpram_init); |
diff --git a/drivers/s390/char/tape_class.c b/drivers/s390/char/tape_class.c index 643b6d078563..56b87618b100 100644 --- a/drivers/s390/char/tape_class.c +++ b/drivers/s390/char/tape_class.c | |||
@@ -76,7 +76,7 @@ struct tape_class_device *register_tape_dev( | |||
76 | device, | 76 | device, |
77 | "%s", tcd->device_name | 77 | "%s", tcd->device_name |
78 | ); | 78 | ); |
79 | rc = PTR_ERR(tcd->class_device); | 79 | rc = IS_ERR(tcd->class_device) ? PTR_ERR(tcd->class_device) : 0; |
80 | if (rc) | 80 | if (rc) |
81 | goto fail_with_cdev; | 81 | goto fail_with_cdev; |
82 | rc = sysfs_create_link( | 82 | rc = sysfs_create_link( |
diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c index f26a2ee3aad8..3cba6c9fab11 100644 --- a/drivers/s390/cio/ccwgroup.c +++ b/drivers/s390/cio/ccwgroup.c | |||
@@ -152,7 +152,6 @@ ccwgroup_create(struct device *root, | |||
152 | struct ccwgroup_device *gdev; | 152 | struct ccwgroup_device *gdev; |
153 | int i; | 153 | int i; |
154 | int rc; | 154 | int rc; |
155 | int del_drvdata; | ||
156 | 155 | ||
157 | if (argc > 256) /* disallow dumb users */ | 156 | if (argc > 256) /* disallow dumb users */ |
158 | return -EINVAL; | 157 | return -EINVAL; |
@@ -163,7 +162,6 @@ ccwgroup_create(struct device *root, | |||
163 | 162 | ||
164 | atomic_set(&gdev->onoff, 0); | 163 | atomic_set(&gdev->onoff, 0); |
165 | 164 | ||
166 | del_drvdata = 0; | ||
167 | for (i = 0; i < argc; i++) { | 165 | for (i = 0; i < argc; i++) { |
168 | gdev->cdev[i] = get_ccwdev_by_busid(cdrv, argv[i]); | 166 | gdev->cdev[i] = get_ccwdev_by_busid(cdrv, argv[i]); |
169 | 167 | ||
@@ -180,10 +178,8 @@ ccwgroup_create(struct device *root, | |||
180 | rc = -EINVAL; | 178 | rc = -EINVAL; |
181 | goto free_dev; | 179 | goto free_dev; |
182 | } | 180 | } |
183 | } | ||
184 | for (i = 0; i < argc; i++) | ||
185 | gdev->cdev[i]->dev.driver_data = gdev; | 181 | gdev->cdev[i]->dev.driver_data = gdev; |
186 | del_drvdata = 1; | 182 | } |
187 | 183 | ||
188 | gdev->creator_id = creator_id; | 184 | gdev->creator_id = creator_id; |
189 | gdev->count = argc; | 185 | gdev->count = argc; |
@@ -226,9 +222,9 @@ error: | |||
226 | free_dev: | 222 | free_dev: |
227 | for (i = 0; i < argc; i++) | 223 | for (i = 0; i < argc; i++) |
228 | if (gdev->cdev[i]) { | 224 | if (gdev->cdev[i]) { |
229 | put_device(&gdev->cdev[i]->dev); | 225 | if (gdev->cdev[i]->dev.driver_data == gdev) |
230 | if (del_drvdata) | ||
231 | gdev->cdev[i]->dev.driver_data = NULL; | 226 | gdev->cdev[i]->dev.driver_data = NULL; |
227 | put_device(&gdev->cdev[i]->dev); | ||
232 | } | 228 | } |
233 | kfree(gdev); | 229 | kfree(gdev); |
234 | return rc; | 230 | return rc; |
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index ac6e0c7e43d9..6d91c2eb205b 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c | |||
@@ -152,7 +152,8 @@ ccw_device_cancel_halt_clear(struct ccw_device *cdev) | |||
152 | if (cdev->private->iretry) { | 152 | if (cdev->private->iretry) { |
153 | cdev->private->iretry--; | 153 | cdev->private->iretry--; |
154 | ret = cio_halt(sch); | 154 | ret = cio_halt(sch); |
155 | return (ret == 0) ? -EBUSY : ret; | 155 | if (ret != -EBUSY) |
156 | return (ret == 0) ? -EBUSY : ret; | ||
156 | } | 157 | } |
157 | /* halt io unsuccessful. */ | 158 | /* halt io unsuccessful. */ |
158 | cdev->private->iretry = 255; /* 255 clear retries. */ | 159 | cdev->private->iretry = 255; /* 255 clear retries. */ |
@@ -771,6 +772,7 @@ ccw_device_online_verify(struct ccw_device *cdev, enum dev_event dev_event) | |||
771 | stsch(sch->schid, &sch->schib); | 772 | stsch(sch->schid, &sch->schib); |
772 | 773 | ||
773 | if (sch->schib.scsw.actl != 0 || | 774 | if (sch->schib.scsw.actl != 0 || |
775 | (sch->schib.scsw.stctl & SCSW_STCTL_STATUS_PEND) || | ||
774 | (cdev->private->irb.scsw.stctl & SCSW_STCTL_STATUS_PEND)) { | 776 | (cdev->private->irb.scsw.stctl & SCSW_STCTL_STATUS_PEND)) { |
775 | /* | 777 | /* |
776 | * No final status yet or final status not yet delivered | 778 | * No final status yet or final status not yet delivered |
diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c index a60124264bee..9e3de0bd59b5 100644 --- a/drivers/s390/cio/device_ops.c +++ b/drivers/s390/cio/device_ops.c | |||
@@ -263,6 +263,9 @@ ccw_device_wake_up(struct ccw_device *cdev, unsigned long ip, struct irb *irb) | |||
263 | /* Abuse intparm for error reporting. */ | 263 | /* Abuse intparm for error reporting. */ |
264 | if (IS_ERR(irb)) | 264 | if (IS_ERR(irb)) |
265 | cdev->private->intparm = -EIO; | 265 | cdev->private->intparm = -EIO; |
266 | else if (irb->scsw.cc == 1) | ||
267 | /* Retry for deferred condition code. */ | ||
268 | cdev->private->intparm = -EAGAIN; | ||
266 | else if ((irb->scsw.dstat != | 269 | else if ((irb->scsw.dstat != |
267 | (DEV_STAT_CHN_END|DEV_STAT_DEV_END)) || | 270 | (DEV_STAT_CHN_END|DEV_STAT_DEV_END)) || |
268 | (irb->scsw.cstat != 0)) { | 271 | (irb->scsw.cstat != 0)) { |
diff --git a/drivers/scsi/NCR53C9x.c b/drivers/scsi/NCR53C9x.c index 085db4826e0e..bdc6bb262bce 100644 --- a/drivers/scsi/NCR53C9x.c +++ b/drivers/scsi/NCR53C9x.c | |||
@@ -2152,29 +2152,23 @@ static int esp_do_data_finale(struct NCR_ESP *esp, | |||
2152 | */ | 2152 | */ |
2153 | static int esp_should_clear_sync(Scsi_Cmnd *sp) | 2153 | static int esp_should_clear_sync(Scsi_Cmnd *sp) |
2154 | { | 2154 | { |
2155 | unchar cmd1 = sp->cmnd[0]; | 2155 | unchar cmd = sp->cmnd[0]; |
2156 | unchar cmd2 = sp->data_cmnd[0]; | ||
2157 | 2156 | ||
2158 | /* These cases are for spinning up a disk and | 2157 | /* These cases are for spinning up a disk and |
2159 | * waiting for that spinup to complete. | 2158 | * waiting for that spinup to complete. |
2160 | */ | 2159 | */ |
2161 | if(cmd1 == START_STOP || | 2160 | if(cmd == START_STOP) |
2162 | cmd2 == START_STOP) | ||
2163 | return 0; | 2161 | return 0; |
2164 | 2162 | ||
2165 | if(cmd1 == TEST_UNIT_READY || | 2163 | if(cmd == TEST_UNIT_READY) |
2166 | cmd2 == TEST_UNIT_READY) | ||
2167 | return 0; | 2164 | return 0; |
2168 | 2165 | ||
2169 | /* One more special case for SCSI tape drives, | 2166 | /* One more special case for SCSI tape drives, |
2170 | * this is what is used to probe the device for | 2167 | * this is what is used to probe the device for |
2171 | * completion of a rewind or tape load operation. | 2168 | * completion of a rewind or tape load operation. |
2172 | */ | 2169 | */ |
2173 | if(sp->device->type == TYPE_TAPE) { | 2170 | if(sp->device->type == TYPE_TAPE && cmd == MODE_SENSE) |
2174 | if(cmd1 == MODE_SENSE || | 2171 | return 0; |
2175 | cmd2 == MODE_SENSE) | ||
2176 | return 0; | ||
2177 | } | ||
2178 | 2172 | ||
2179 | return 1; | 2173 | return 1; |
2180 | } | 2174 | } |
diff --git a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c index 77e7202a0eba..904c25fb4ba4 100644 --- a/drivers/scsi/ahci.c +++ b/drivers/scsi/ahci.c | |||
@@ -940,14 +940,8 @@ static void ahci_host_intr(struct ata_port *ap) | |||
940 | return; | 940 | return; |
941 | 941 | ||
942 | /* ignore interim PIO setup fis interrupts */ | 942 | /* ignore interim PIO setup fis interrupts */ |
943 | if (ata_tag_valid(ap->active_tag)) { | 943 | if (ata_tag_valid(ap->active_tag) && (status & PORT_IRQ_PIOS_FIS)) |
944 | struct ata_queued_cmd *qc = | 944 | return; |
945 | ata_qc_from_tag(ap, ap->active_tag); | ||
946 | |||
947 | if (qc && qc->tf.protocol == ATA_PROT_PIO && | ||
948 | (status & PORT_IRQ_PIOS_FIS)) | ||
949 | return; | ||
950 | } | ||
951 | 945 | ||
952 | if (ata_ratelimit()) | 946 | if (ata_ratelimit()) |
953 | ata_port_printk(ap, KERN_INFO, "spurious interrupt " | 947 | ata_port_printk(ap, KERN_INFO, "spurious interrupt " |
diff --git a/drivers/scsi/aic7xxx/aicasm/Makefile b/drivers/scsi/aic7xxx/aicasm/Makefile index 8c91fda6482c..b98c5c1056c3 100644 --- a/drivers/scsi/aic7xxx/aicasm/Makefile +++ b/drivers/scsi/aic7xxx/aicasm/Makefile | |||
@@ -14,6 +14,8 @@ LIBS= -ldb | |||
14 | clean-files:= ${GENSRCS} ${GENHDRS} $(YSRCS:.y=.output) $(PROG) | 14 | clean-files:= ${GENSRCS} ${GENHDRS} $(YSRCS:.y=.output) $(PROG) |
15 | # Override default kernel CFLAGS. This is a userland app. | 15 | # Override default kernel CFLAGS. This is a userland app. |
16 | AICASM_CFLAGS:= -I/usr/include -I. | 16 | AICASM_CFLAGS:= -I/usr/include -I. |
17 | LEX= flex | ||
18 | YACC= bison | ||
17 | YFLAGS= -d | 19 | YFLAGS= -d |
18 | 20 | ||
19 | NOMAN= noman | 21 | NOMAN= noman |
diff --git a/drivers/scsi/arm/Kconfig b/drivers/scsi/arm/Kconfig index 06d7601cdf56..d006a8cb4a74 100644 --- a/drivers/scsi/arm/Kconfig +++ b/drivers/scsi/arm/Kconfig | |||
@@ -69,6 +69,7 @@ comment "The following drivers are not fully supported" | |||
69 | config SCSI_CUMANA_1 | 69 | config SCSI_CUMANA_1 |
70 | tristate "CumanaSCSI I support (EXPERIMENTAL)" | 70 | tristate "CumanaSCSI I support (EXPERIMENTAL)" |
71 | depends on ARCH_ACORN && EXPERIMENTAL && SCSI | 71 | depends on ARCH_ACORN && EXPERIMENTAL && SCSI |
72 | select SCSI_SPI_ATTRS | ||
72 | help | 73 | help |
73 | This enables support for the Cumana SCSI I card. If you have an | 74 | This enables support for the Cumana SCSI I card. If you have an |
74 | Acorn system with one of these, say Y. If unsure, say N. | 75 | Acorn system with one of these, say Y. If unsure, say N. |
@@ -76,6 +77,7 @@ config SCSI_CUMANA_1 | |||
76 | config SCSI_ECOSCSI | 77 | config SCSI_ECOSCSI |
77 | tristate "EcoScsi support (EXPERIMENTAL)" | 78 | tristate "EcoScsi support (EXPERIMENTAL)" |
78 | depends on ARCH_ACORN && EXPERIMENTAL && (ARCH_ARC || ARCH_A5K) && SCSI | 79 | depends on ARCH_ACORN && EXPERIMENTAL && (ARCH_ARC || ARCH_A5K) && SCSI |
80 | select SCSI_SPI_ATTRS | ||
79 | help | 81 | help |
80 | This enables support for the EcoSCSI card -- a small card that sits | 82 | This enables support for the EcoSCSI card -- a small card that sits |
81 | in the Econet socket. If you have an Acorn system with one of these, | 83 | in the Econet socket. If you have an Acorn system with one of these, |
@@ -84,6 +86,7 @@ config SCSI_ECOSCSI | |||
84 | config SCSI_OAK1 | 86 | config SCSI_OAK1 |
85 | tristate "Oak SCSI support (EXPERIMENTAL)" | 87 | tristate "Oak SCSI support (EXPERIMENTAL)" |
86 | depends on ARCH_ACORN && EXPERIMENTAL && SCSI | 88 | depends on ARCH_ACORN && EXPERIMENTAL && SCSI |
89 | select SCSI_SPI_ATTRS | ||
87 | help | 90 | help |
88 | This enables support for the Oak SCSI card. If you have an Acorn | 91 | This enables support for the Oak SCSI card. If you have an Acorn |
89 | system with one of these, say Y. If unsure, say N. | 92 | system with one of these, say Y. If unsure, say N. |
diff --git a/drivers/scsi/arm/fas216.c b/drivers/scsi/arm/fas216.c index 3e1053f111dc..4cf7afc31cc7 100644 --- a/drivers/scsi/arm/fas216.c +++ b/drivers/scsi/arm/fas216.c | |||
@@ -2427,7 +2427,7 @@ int fas216_eh_abort(Scsi_Cmnd *SCpnt) | |||
2427 | info->stats.aborts += 1; | 2427 | info->stats.aborts += 1; |
2428 | 2428 | ||
2429 | printk(KERN_WARNING "scsi%d: abort command ", info->host->host_no); | 2429 | printk(KERN_WARNING "scsi%d: abort command ", info->host->host_no); |
2430 | __scsi_print_command(SCpnt->data_cmnd); | 2430 | __scsi_print_command(SCpnt->cmnd); |
2431 | 2431 | ||
2432 | print_debug_list(); | 2432 | print_debug_list(); |
2433 | fas216_dumpstate(info); | 2433 | fas216_dumpstate(info); |
diff --git a/drivers/scsi/arm/scsi.h b/drivers/scsi/arm/scsi.h index 6dd544a5eb56..8c2600ffc6af 100644 --- a/drivers/scsi/arm/scsi.h +++ b/drivers/scsi/arm/scsi.h | |||
@@ -74,7 +74,7 @@ static inline void init_SCp(Scsi_Cmnd *SCpnt) | |||
74 | unsigned long len = 0; | 74 | unsigned long len = 0; |
75 | int buf; | 75 | int buf; |
76 | 76 | ||
77 | SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->buffer; | 77 | SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->request_buffer; |
78 | SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1; | 78 | SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1; |
79 | SCpnt->SCp.ptr = (char *) | 79 | SCpnt->SCp.ptr = (char *) |
80 | (page_address(SCpnt->SCp.buffer->page) + | 80 | (page_address(SCpnt->SCp.buffer->page) + |
diff --git a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c index 19745a31072b..5e8afc876980 100644 --- a/drivers/scsi/ata_piix.c +++ b/drivers/scsi/ata_piix.c | |||
@@ -567,8 +567,8 @@ static int piix_sata_prereset(struct ata_port *ap) | |||
567 | present = 1; | 567 | present = 1; |
568 | } | 568 | } |
569 | 569 | ||
570 | DPRINTK("ata%u: LEAVE, pcs=0x%x present_mask=0x%x\n", | 570 | DPRINTK("ata%u: LEAVE, pcs=0x%x present=0x%x\n", |
571 | ap->id, pcs, present_mask); | 571 | ap->id, pcs, present); |
572 | 572 | ||
573 | if (!present) { | 573 | if (!present) { |
574 | ata_port_printk(ap, KERN_INFO, "SATA port has no device.\n"); | 574 | ata_port_printk(ap, KERN_INFO, "SATA port has no device.\n"); |
@@ -828,6 +828,7 @@ static void __devinit piix_init_sata_map(struct pci_dev *pdev, | |||
828 | case IDE: | 828 | case IDE: |
829 | WARN_ON((i & 1) || map[i + 1] != IDE); | 829 | WARN_ON((i & 1) || map[i + 1] != IDE); |
830 | pinfo[i / 2] = piix_port_info[ich5_pata]; | 830 | pinfo[i / 2] = piix_port_info[ich5_pata]; |
831 | pinfo[i / 2].private_data = hpriv; | ||
831 | i++; | 832 | i++; |
832 | printk(" IDE IDE"); | 833 | printk(" IDE IDE"); |
833 | break; | 834 | break; |
diff --git a/drivers/scsi/esp.c b/drivers/scsi/esp.c index eaf64c7e54e7..98bd22714d0d 100644 --- a/drivers/scsi/esp.c +++ b/drivers/scsi/esp.c | |||
@@ -2754,18 +2754,15 @@ static int esp_do_data_finale(struct esp *esp) | |||
2754 | */ | 2754 | */ |
2755 | static int esp_should_clear_sync(struct scsi_cmnd *sp) | 2755 | static int esp_should_clear_sync(struct scsi_cmnd *sp) |
2756 | { | 2756 | { |
2757 | u8 cmd1 = sp->cmnd[0]; | 2757 | u8 cmd = sp->cmnd[0]; |
2758 | u8 cmd2 = sp->data_cmnd[0]; | ||
2759 | 2758 | ||
2760 | /* These cases are for spinning up a disk and | 2759 | /* These cases are for spinning up a disk and |
2761 | * waiting for that spinup to complete. | 2760 | * waiting for that spinup to complete. |
2762 | */ | 2761 | */ |
2763 | if (cmd1 == START_STOP || | 2762 | if (cmd == START_STOP) |
2764 | cmd2 == START_STOP) | ||
2765 | return 0; | 2763 | return 0; |
2766 | 2764 | ||
2767 | if (cmd1 == TEST_UNIT_READY || | 2765 | if (cmd == TEST_UNIT_READY) |
2768 | cmd2 == TEST_UNIT_READY) | ||
2769 | return 0; | 2766 | return 0; |
2770 | 2767 | ||
2771 | /* One more special case for SCSI tape drives, | 2768 | /* One more special case for SCSI tape drives, |
@@ -2773,8 +2770,7 @@ static int esp_should_clear_sync(struct scsi_cmnd *sp) | |||
2773 | * completion of a rewind or tape load operation. | 2770 | * completion of a rewind or tape load operation. |
2774 | */ | 2771 | */ |
2775 | if (sp->device->type == TYPE_TAPE) { | 2772 | if (sp->device->type == TYPE_TAPE) { |
2776 | if (cmd1 == MODE_SENSE || | 2773 | if (cmd == MODE_SENSE) |
2777 | cmd2 == MODE_SENSE) | ||
2778 | return 0; | 2774 | return 0; |
2779 | } | 2775 | } |
2780 | 2776 | ||
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index 386e5f21e191..16fc2dd8f2f7 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
@@ -5185,28 +5185,6 @@ void ata_host_stop (struct ata_host_set *host_set) | |||
5185 | iounmap(host_set->mmio_base); | 5185 | iounmap(host_set->mmio_base); |
5186 | } | 5186 | } |
5187 | 5187 | ||
5188 | |||
5189 | /** | ||
5190 | * ata_host_remove - Unregister SCSI host structure with upper layers | ||
5191 | * @ap: Port to unregister | ||
5192 | * @do_unregister: 1 if we fully unregister, 0 to just stop the port | ||
5193 | * | ||
5194 | * LOCKING: | ||
5195 | * Inherited from caller. | ||
5196 | */ | ||
5197 | |||
5198 | static void ata_host_remove(struct ata_port *ap, unsigned int do_unregister) | ||
5199 | { | ||
5200 | struct Scsi_Host *sh = ap->host; | ||
5201 | |||
5202 | DPRINTK("ENTER\n"); | ||
5203 | |||
5204 | if (do_unregister) | ||
5205 | scsi_remove_host(sh); | ||
5206 | |||
5207 | ap->ops->port_stop(ap); | ||
5208 | } | ||
5209 | |||
5210 | /** | 5188 | /** |
5211 | * ata_dev_init - Initialize an ata_device structure | 5189 | * ata_dev_init - Initialize an ata_device structure |
5212 | * @dev: Device structure to initialize | 5190 | * @dev: Device structure to initialize |
@@ -5532,8 +5510,11 @@ int ata_device_add(const struct ata_probe_ent *ent) | |||
5532 | 5510 | ||
5533 | err_out: | 5511 | err_out: |
5534 | for (i = 0; i < count; i++) { | 5512 | for (i = 0; i < count; i++) { |
5535 | ata_host_remove(host_set->ports[i], 1); | 5513 | struct ata_port *ap = host_set->ports[i]; |
5536 | scsi_host_put(host_set->ports[i]->host); | 5514 | if (ap) { |
5515 | ap->ops->port_stop(ap); | ||
5516 | scsi_host_put(ap->host); | ||
5517 | } | ||
5537 | } | 5518 | } |
5538 | err_free_ret: | 5519 | err_free_ret: |
5539 | kfree(host_set); | 5520 | kfree(host_set); |
@@ -5558,7 +5539,7 @@ void ata_port_detach(struct ata_port *ap) | |||
5558 | int i; | 5539 | int i; |
5559 | 5540 | ||
5560 | if (!ap->ops->error_handler) | 5541 | if (!ap->ops->error_handler) |
5561 | return; | 5542 | goto skip_eh; |
5562 | 5543 | ||
5563 | /* tell EH we're leaving & flush EH */ | 5544 | /* tell EH we're leaving & flush EH */ |
5564 | spin_lock_irqsave(ap->lock, flags); | 5545 | spin_lock_irqsave(ap->lock, flags); |
@@ -5594,6 +5575,7 @@ void ata_port_detach(struct ata_port *ap) | |||
5594 | cancel_delayed_work(&ap->hotplug_task); | 5575 | cancel_delayed_work(&ap->hotplug_task); |
5595 | flush_workqueue(ata_aux_wq); | 5576 | flush_workqueue(ata_aux_wq); |
5596 | 5577 | ||
5578 | skip_eh: | ||
5597 | /* remove the associated SCSI host */ | 5579 | /* remove the associated SCSI host */ |
5598 | scsi_remove_host(ap->host); | 5580 | scsi_remove_host(ap->host); |
5599 | } | 5581 | } |
@@ -5662,7 +5644,7 @@ int ata_scsi_release(struct Scsi_Host *host) | |||
5662 | DPRINTK("ENTER\n"); | 5644 | DPRINTK("ENTER\n"); |
5663 | 5645 | ||
5664 | ap->ops->port_disable(ap); | 5646 | ap->ops->port_disable(ap); |
5665 | ata_host_remove(ap, 0); | 5647 | ap->ops->port_stop(ap); |
5666 | 5648 | ||
5667 | DPRINTK("EXIT\n"); | 5649 | DPRINTK("EXIT\n"); |
5668 | return 1; | 5650 | return 1; |
diff --git a/drivers/scsi/libata-eh.c b/drivers/scsi/libata-eh.c index 4b6aa30f4d68..29f59345305d 100644 --- a/drivers/scsi/libata-eh.c +++ b/drivers/scsi/libata-eh.c | |||
@@ -764,12 +764,27 @@ static void ata_eh_about_to_do(struct ata_port *ap, struct ata_device *dev, | |||
764 | unsigned int action) | 764 | unsigned int action) |
765 | { | 765 | { |
766 | unsigned long flags; | 766 | unsigned long flags; |
767 | struct ata_eh_info *ehi = &ap->eh_info; | ||
768 | struct ata_eh_context *ehc = &ap->eh_context; | ||
767 | 769 | ||
768 | spin_lock_irqsave(ap->lock, flags); | 770 | spin_lock_irqsave(ap->lock, flags); |
769 | 771 | ||
770 | ata_eh_clear_action(dev, &ap->eh_info, action); | 772 | /* Reset is represented by combination of actions and EHI |
773 | * flags. Suck in all related bits before clearing eh_info to | ||
774 | * avoid losing requested action. | ||
775 | */ | ||
776 | if (action & ATA_EH_RESET_MASK) { | ||
777 | ehc->i.action |= ehi->action & ATA_EH_RESET_MASK; | ||
778 | ehc->i.flags |= ehi->flags & ATA_EHI_RESET_MODIFIER_MASK; | ||
779 | |||
780 | /* make sure all reset actions are cleared & clear EHI flags */ | ||
781 | action |= ATA_EH_RESET_MASK; | ||
782 | ehi->flags &= ~ATA_EHI_RESET_MODIFIER_MASK; | ||
783 | } | ||
784 | |||
785 | ata_eh_clear_action(dev, ehi, action); | ||
771 | 786 | ||
772 | if (!(ap->eh_context.i.flags & ATA_EHI_QUIET)) | 787 | if (!(ehc->i.flags & ATA_EHI_QUIET)) |
773 | ap->pflags |= ATA_PFLAG_RECOVERED; | 788 | ap->pflags |= ATA_PFLAG_RECOVERED; |
774 | 789 | ||
775 | spin_unlock_irqrestore(ap->lock, flags); | 790 | spin_unlock_irqrestore(ap->lock, flags); |
@@ -790,6 +805,12 @@ static void ata_eh_about_to_do(struct ata_port *ap, struct ata_device *dev, | |||
790 | static void ata_eh_done(struct ata_port *ap, struct ata_device *dev, | 805 | static void ata_eh_done(struct ata_port *ap, struct ata_device *dev, |
791 | unsigned int action) | 806 | unsigned int action) |
792 | { | 807 | { |
808 | /* if reset is complete, clear all reset actions & reset modifier */ | ||
809 | if (action & ATA_EH_RESET_MASK) { | ||
810 | action |= ATA_EH_RESET_MASK; | ||
811 | ap->eh_context.i.flags &= ~ATA_EHI_RESET_MODIFIER_MASK; | ||
812 | } | ||
813 | |||
793 | ata_eh_clear_action(dev, &ap->eh_context.i, action); | 814 | ata_eh_clear_action(dev, &ap->eh_context.i, action); |
794 | } | 815 | } |
795 | 816 | ||
@@ -1276,8 +1297,6 @@ static int ata_eh_speed_down(struct ata_device *dev, int is_io, | |||
1276 | static void ata_eh_autopsy(struct ata_port *ap) | 1297 | static void ata_eh_autopsy(struct ata_port *ap) |
1277 | { | 1298 | { |
1278 | struct ata_eh_context *ehc = &ap->eh_context; | 1299 | struct ata_eh_context *ehc = &ap->eh_context; |
1279 | unsigned int action = ehc->i.action; | ||
1280 | struct ata_device *failed_dev = NULL; | ||
1281 | unsigned int all_err_mask = 0; | 1300 | unsigned int all_err_mask = 0; |
1282 | int tag, is_io = 0; | 1301 | int tag, is_io = 0; |
1283 | u32 serror; | 1302 | u32 serror; |
@@ -1294,7 +1313,7 @@ static void ata_eh_autopsy(struct ata_port *ap) | |||
1294 | ehc->i.serror |= serror; | 1313 | ehc->i.serror |= serror; |
1295 | ata_eh_analyze_serror(ap); | 1314 | ata_eh_analyze_serror(ap); |
1296 | } else if (rc != -EOPNOTSUPP) | 1315 | } else if (rc != -EOPNOTSUPP) |
1297 | action |= ATA_EH_HARDRESET; | 1316 | ehc->i.action |= ATA_EH_HARDRESET; |
1298 | 1317 | ||
1299 | /* analyze NCQ failure */ | 1318 | /* analyze NCQ failure */ |
1300 | ata_eh_analyze_ncq_error(ap); | 1319 | ata_eh_analyze_ncq_error(ap); |
@@ -1315,7 +1334,7 @@ static void ata_eh_autopsy(struct ata_port *ap) | |||
1315 | qc->err_mask |= ehc->i.err_mask; | 1334 | qc->err_mask |= ehc->i.err_mask; |
1316 | 1335 | ||
1317 | /* analyze TF */ | 1336 | /* analyze TF */ |
1318 | action |= ata_eh_analyze_tf(qc, &qc->result_tf); | 1337 | ehc->i.action |= ata_eh_analyze_tf(qc, &qc->result_tf); |
1319 | 1338 | ||
1320 | /* DEV errors are probably spurious in case of ATA_BUS error */ | 1339 | /* DEV errors are probably spurious in case of ATA_BUS error */ |
1321 | if (qc->err_mask & AC_ERR_ATA_BUS) | 1340 | if (qc->err_mask & AC_ERR_ATA_BUS) |
@@ -1329,11 +1348,11 @@ static void ata_eh_autopsy(struct ata_port *ap) | |||
1329 | /* SENSE_VALID trumps dev/unknown error and revalidation */ | 1348 | /* SENSE_VALID trumps dev/unknown error and revalidation */ |
1330 | if (qc->flags & ATA_QCFLAG_SENSE_VALID) { | 1349 | if (qc->flags & ATA_QCFLAG_SENSE_VALID) { |
1331 | qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER); | 1350 | qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER); |
1332 | action &= ~ATA_EH_REVALIDATE; | 1351 | ehc->i.action &= ~ATA_EH_REVALIDATE; |
1333 | } | 1352 | } |
1334 | 1353 | ||
1335 | /* accumulate error info */ | 1354 | /* accumulate error info */ |
1336 | failed_dev = qc->dev; | 1355 | ehc->i.dev = qc->dev; |
1337 | all_err_mask |= qc->err_mask; | 1356 | all_err_mask |= qc->err_mask; |
1338 | if (qc->flags & ATA_QCFLAG_IO) | 1357 | if (qc->flags & ATA_QCFLAG_IO) |
1339 | is_io = 1; | 1358 | is_io = 1; |
@@ -1342,25 +1361,22 @@ static void ata_eh_autopsy(struct ata_port *ap) | |||
1342 | /* enforce default EH actions */ | 1361 | /* enforce default EH actions */ |
1343 | if (ap->pflags & ATA_PFLAG_FROZEN || | 1362 | if (ap->pflags & ATA_PFLAG_FROZEN || |
1344 | all_err_mask & (AC_ERR_HSM | AC_ERR_TIMEOUT)) | 1363 | all_err_mask & (AC_ERR_HSM | AC_ERR_TIMEOUT)) |
1345 | action |= ATA_EH_SOFTRESET; | 1364 | ehc->i.action |= ATA_EH_SOFTRESET; |
1346 | else if (all_err_mask) | 1365 | else if (all_err_mask) |
1347 | action |= ATA_EH_REVALIDATE; | 1366 | ehc->i.action |= ATA_EH_REVALIDATE; |
1348 | 1367 | ||
1349 | /* if we have offending qcs and the associated failed device */ | 1368 | /* if we have offending qcs and the associated failed device */ |
1350 | if (failed_dev) { | 1369 | if (ehc->i.dev) { |
1351 | /* speed down */ | 1370 | /* speed down */ |
1352 | action |= ata_eh_speed_down(failed_dev, is_io, all_err_mask); | 1371 | ehc->i.action |= ata_eh_speed_down(ehc->i.dev, is_io, |
1372 | all_err_mask); | ||
1353 | 1373 | ||
1354 | /* perform per-dev EH action only on the offending device */ | 1374 | /* perform per-dev EH action only on the offending device */ |
1355 | ehc->i.dev_action[failed_dev->devno] |= | 1375 | ehc->i.dev_action[ehc->i.dev->devno] |= |
1356 | action & ATA_EH_PERDEV_MASK; | 1376 | ehc->i.action & ATA_EH_PERDEV_MASK; |
1357 | action &= ~ATA_EH_PERDEV_MASK; | 1377 | ehc->i.action &= ~ATA_EH_PERDEV_MASK; |
1358 | } | 1378 | } |
1359 | 1379 | ||
1360 | /* record autopsy result */ | ||
1361 | ehc->i.dev = failed_dev; | ||
1362 | ehc->i.action |= action; | ||
1363 | |||
1364 | DPRINTK("EXIT\n"); | 1380 | DPRINTK("EXIT\n"); |
1365 | } | 1381 | } |
1366 | 1382 | ||
@@ -1483,6 +1499,9 @@ static int ata_eh_reset(struct ata_port *ap, int classify, | |||
1483 | ata_reset_fn_t reset; | 1499 | ata_reset_fn_t reset; |
1484 | int i, did_followup_srst, rc; | 1500 | int i, did_followup_srst, rc; |
1485 | 1501 | ||
1502 | /* about to reset */ | ||
1503 | ata_eh_about_to_do(ap, NULL, ehc->i.action & ATA_EH_RESET_MASK); | ||
1504 | |||
1486 | /* Determine which reset to use and record in ehc->i.action. | 1505 | /* Determine which reset to use and record in ehc->i.action. |
1487 | * prereset() may examine and modify it. | 1506 | * prereset() may examine and modify it. |
1488 | */ | 1507 | */ |
@@ -1531,8 +1550,7 @@ static int ata_eh_reset(struct ata_port *ap, int classify, | |||
1531 | ata_port_printk(ap, KERN_INFO, "%s resetting port\n", | 1550 | ata_port_printk(ap, KERN_INFO, "%s resetting port\n", |
1532 | reset == softreset ? "soft" : "hard"); | 1551 | reset == softreset ? "soft" : "hard"); |
1533 | 1552 | ||
1534 | /* reset */ | 1553 | /* mark that this EH session started with reset */ |
1535 | ata_eh_about_to_do(ap, NULL, ATA_EH_RESET_MASK); | ||
1536 | ehc->i.flags |= ATA_EHI_DID_RESET; | 1554 | ehc->i.flags |= ATA_EHI_DID_RESET; |
1537 | 1555 | ||
1538 | rc = ata_do_reset(ap, reset, classes); | 1556 | rc = ata_do_reset(ap, reset, classes); |
@@ -1595,7 +1613,7 @@ static int ata_eh_reset(struct ata_port *ap, int classify, | |||
1595 | postreset(ap, classes); | 1613 | postreset(ap, classes); |
1596 | 1614 | ||
1597 | /* reset successful, schedule revalidation */ | 1615 | /* reset successful, schedule revalidation */ |
1598 | ata_eh_done(ap, NULL, ATA_EH_RESET_MASK); | 1616 | ata_eh_done(ap, NULL, ehc->i.action & ATA_EH_RESET_MASK); |
1599 | ehc->i.action |= ATA_EH_REVALIDATE; | 1617 | ehc->i.action |= ATA_EH_REVALIDATE; |
1600 | } | 1618 | } |
1601 | 1619 | ||
@@ -1848,15 +1866,16 @@ static int ata_eh_skip_recovery(struct ata_port *ap) | |||
1848 | for (i = 0; i < ata_port_max_devices(ap); i++) { | 1866 | for (i = 0; i < ata_port_max_devices(ap); i++) { |
1849 | struct ata_device *dev = &ap->device[i]; | 1867 | struct ata_device *dev = &ap->device[i]; |
1850 | 1868 | ||
1851 | if (ata_dev_absent(dev) || ata_dev_ready(dev)) | 1869 | if (!(dev->flags & ATA_DFLAG_SUSPENDED)) |
1852 | break; | 1870 | break; |
1853 | } | 1871 | } |
1854 | 1872 | ||
1855 | if (i == ata_port_max_devices(ap)) | 1873 | if (i == ata_port_max_devices(ap)) |
1856 | return 1; | 1874 | return 1; |
1857 | 1875 | ||
1858 | /* always thaw frozen port and recover failed devices */ | 1876 | /* thaw frozen port, resume link and recover failed devices */ |
1859 | if (ap->pflags & ATA_PFLAG_FROZEN || ata_port_nr_enabled(ap)) | 1877 | if ((ap->pflags & ATA_PFLAG_FROZEN) || |
1878 | (ehc->i.flags & ATA_EHI_RESUME_LINK) || ata_port_nr_enabled(ap)) | ||
1860 | return 0; | 1879 | return 0; |
1861 | 1880 | ||
1862 | /* skip if class codes for all vacant slots are ATA_DEV_NONE */ | 1881 | /* skip if class codes for all vacant slots are ATA_DEV_NONE */ |
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index 7ced41ecde86..e92c31d698ff 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c | |||
@@ -2353,6 +2353,19 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc) | |||
2353 | ata_gen_ata_desc_sense(qc); | 2353 | ata_gen_ata_desc_sense(qc); |
2354 | } | 2354 | } |
2355 | 2355 | ||
2356 | /* SCSI EH automatically locks door if sdev->locked is | ||
2357 | * set. Sometimes door lock request continues to | ||
2358 | * fail, for example, when no media is present. This | ||
2359 | * creates a loop - SCSI EH issues door lock which | ||
2360 | * fails and gets invoked again to acquire sense data | ||
2361 | * for the failed command. | ||
2362 | * | ||
2363 | * If door lock fails, always clear sdev->locked to | ||
2364 | * avoid this infinite loop. | ||
2365 | */ | ||
2366 | if (qc->cdb[0] == ALLOW_MEDIUM_REMOVAL) | ||
2367 | qc->dev->sdev->locked = 0; | ||
2368 | |||
2356 | qc->scsicmd->result = SAM_STAT_CHECK_CONDITION; | 2369 | qc->scsicmd->result = SAM_STAT_CHECK_CONDITION; |
2357 | qc->scsidone(cmd); | 2370 | qc->scsidone(cmd); |
2358 | ata_qc_free(qc); | 2371 | ata_qc_free(qc); |
diff --git a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c index 64631bd38952..4776f4e55839 100644 --- a/drivers/scsi/sata_promise.c +++ b/drivers/scsi/sata_promise.c | |||
@@ -269,8 +269,15 @@ static const struct pci_device_id pdc_ata_pci_tbl[] = { | |||
269 | { PCI_VENDOR_ID_PROMISE, 0x6629, PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 269 | { PCI_VENDOR_ID_PROMISE, 0x6629, PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
270 | board_20619 }, | 270 | board_20619 }, |
271 | 271 | ||
272 | /* TODO: remove all associated board_20771 code, as it completely | ||
273 | * duplicates board_2037x code, unless reason for separation can be | ||
274 | * divined. | ||
275 | */ | ||
276 | #if 0 | ||
272 | { PCI_VENDOR_ID_PROMISE, 0x3570, PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 277 | { PCI_VENDOR_ID_PROMISE, 0x3570, PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
273 | board_20771 }, | 278 | board_20771 }, |
279 | #endif | ||
280 | |||
274 | { } /* terminate list */ | 281 | { } /* terminate list */ |
275 | }; | 282 | }; |
276 | 283 | ||
diff --git a/drivers/scsi/sata_sil24.c b/drivers/scsi/sata_sil24.c index 2e0f4a4076af..3f368c7d3ef9 100644 --- a/drivers/scsi/sata_sil24.c +++ b/drivers/scsi/sata_sil24.c | |||
@@ -1106,7 +1106,6 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1106 | 1106 | ||
1107 | probe_ent->irq = pdev->irq; | 1107 | probe_ent->irq = pdev->irq; |
1108 | probe_ent->irq_flags = IRQF_SHARED; | 1108 | probe_ent->irq_flags = IRQF_SHARED; |
1109 | probe_ent->mmio_base = port_base; | ||
1110 | probe_ent->private_data = hpriv; | 1109 | probe_ent->private_data = hpriv; |
1111 | 1110 | ||
1112 | hpriv->host_base = host_base; | 1111 | hpriv->host_base = host_base; |
diff --git a/drivers/scsi/scsi_ioctl.c b/drivers/scsi/scsi_ioctl.c index a89c4115cfba..32293f451669 100644 --- a/drivers/scsi/scsi_ioctl.c +++ b/drivers/scsi/scsi_ioctl.c | |||
@@ -110,11 +110,8 @@ static int ioctl_internal_command(struct scsi_device *sdev, char *cmd, | |||
110 | sshdr.asc, sshdr.ascq); | 110 | sshdr.asc, sshdr.ascq); |
111 | break; | 111 | break; |
112 | case NOT_READY: /* This happens if there is no disc in drive */ | 112 | case NOT_READY: /* This happens if there is no disc in drive */ |
113 | if (sdev->removable && (cmd[0] != TEST_UNIT_READY)) { | 113 | if (sdev->removable) |
114 | printk(KERN_INFO "Device not ready. Make sure" | ||
115 | " there is a disc in the drive.\n"); | ||
116 | break; | 114 | break; |
117 | } | ||
118 | case UNIT_ATTENTION: | 115 | case UNIT_ATTENTION: |
119 | if (sdev->removable) { | 116 | if (sdev->removable) { |
120 | sdev->changed = 1; | 117 | sdev->changed = 1; |
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index 2ee742d40c43..005043197527 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig | |||
@@ -24,7 +24,7 @@ config USB_ARCH_HAS_OHCI | |||
24 | default y if ARCH_S3C2410 | 24 | default y if ARCH_S3C2410 |
25 | default y if PXA27x | 25 | default y if PXA27x |
26 | default y if ARCH_EP93XX | 26 | default y if ARCH_EP93XX |
27 | default y if ARCH_AT91RM9200 | 27 | default y if (ARCH_AT91RM9200 || ARCH_AT91SAM9261) |
28 | # PPC: | 28 | # PPC: |
29 | default y if STB03xxx | 29 | default y if STB03xxx |
30 | default y if PPC_MPC52xx | 30 | default y if PPC_MPC52xx |
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index f7bdd94b3aa8..218621b9958e 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
@@ -517,19 +517,19 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, unsig | |||
517 | 517 | ||
518 | static struct usb_device *usbdev_lookup_minor(int minor) | 518 | static struct usb_device *usbdev_lookup_minor(int minor) |
519 | { | 519 | { |
520 | struct device *device; | 520 | struct class_device *class_dev; |
521 | struct usb_device *udev = NULL; | 521 | struct usb_device *dev = NULL; |
522 | 522 | ||
523 | down(&usb_device_class->sem); | 523 | down(&usb_device_class->sem); |
524 | list_for_each_entry(device, &usb_device_class->devices, node) { | 524 | list_for_each_entry(class_dev, &usb_device_class->children, node) { |
525 | if (device->devt == MKDEV(USB_DEVICE_MAJOR, minor)) { | 525 | if (class_dev->devt == MKDEV(USB_DEVICE_MAJOR, minor)) { |
526 | udev = device->platform_data; | 526 | dev = class_dev->class_data; |
527 | break; | 527 | break; |
528 | } | 528 | } |
529 | } | 529 | } |
530 | up(&usb_device_class->sem); | 530 | up(&usb_device_class->sem); |
531 | 531 | ||
532 | return udev; | 532 | return dev; |
533 | }; | 533 | }; |
534 | 534 | ||
535 | /* | 535 | /* |
@@ -1580,16 +1580,16 @@ static void usbdev_add(struct usb_device *dev) | |||
1580 | { | 1580 | { |
1581 | int minor = ((dev->bus->busnum-1) * 128) + (dev->devnum-1); | 1581 | int minor = ((dev->bus->busnum-1) * 128) + (dev->devnum-1); |
1582 | 1582 | ||
1583 | dev->usbfs_dev = device_create(usb_device_class, &dev->dev, | 1583 | dev->class_dev = class_device_create(usb_device_class, NULL, |
1584 | MKDEV(USB_DEVICE_MAJOR, minor), | 1584 | MKDEV(USB_DEVICE_MAJOR, minor), &dev->dev, |
1585 | "usbdev%d.%d", dev->bus->busnum, dev->devnum); | 1585 | "usbdev%d.%d", dev->bus->busnum, dev->devnum); |
1586 | 1586 | ||
1587 | dev->usbfs_dev->platform_data = dev; | 1587 | dev->class_dev->class_data = dev; |
1588 | } | 1588 | } |
1589 | 1589 | ||
1590 | static void usbdev_remove(struct usb_device *dev) | 1590 | static void usbdev_remove(struct usb_device *dev) |
1591 | { | 1591 | { |
1592 | device_unregister(dev->usbfs_dev); | 1592 | class_device_unregister(dev->class_dev); |
1593 | } | 1593 | } |
1594 | 1594 | ||
1595 | static int usbdev_notify(struct notifier_block *self, unsigned long action, | 1595 | static int usbdev_notify(struct notifier_block *self, unsigned long action, |
diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c index abee0f5b6a66..8de4f8c99d61 100644 --- a/drivers/usb/core/file.c +++ b/drivers/usb/core/file.c | |||
@@ -194,13 +194,14 @@ int usb_register_dev(struct usb_interface *intf, | |||
194 | ++temp; | 194 | ++temp; |
195 | else | 195 | else |
196 | temp = name; | 196 | temp = name; |
197 | intf->usb_dev = device_create(usb_class->class, &intf->dev, | 197 | intf->class_dev = class_device_create(usb_class->class, NULL, |
198 | MKDEV(USB_MAJOR, minor), "%s", temp); | 198 | MKDEV(USB_MAJOR, minor), |
199 | if (IS_ERR(intf->usb_dev)) { | 199 | &intf->dev, "%s", temp); |
200 | if (IS_ERR(intf->class_dev)) { | ||
200 | spin_lock (&minor_lock); | 201 | spin_lock (&minor_lock); |
201 | usb_minors[intf->minor] = NULL; | 202 | usb_minors[intf->minor] = NULL; |
202 | spin_unlock (&minor_lock); | 203 | spin_unlock (&minor_lock); |
203 | retval = PTR_ERR(intf->usb_dev); | 204 | retval = PTR_ERR(intf->class_dev); |
204 | } | 205 | } |
205 | exit: | 206 | exit: |
206 | return retval; | 207 | return retval; |
@@ -241,8 +242,8 @@ void usb_deregister_dev(struct usb_interface *intf, | |||
241 | spin_unlock (&minor_lock); | 242 | spin_unlock (&minor_lock); |
242 | 243 | ||
243 | snprintf(name, BUS_ID_SIZE, class_driver->name, intf->minor - minor_base); | 244 | snprintf(name, BUS_ID_SIZE, class_driver->name, intf->minor - minor_base); |
244 | device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor)); | 245 | class_device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor)); |
245 | intf->usb_dev = NULL; | 246 | intf->class_dev = NULL; |
246 | intf->minor = -1; | 247 | intf->minor = -1; |
247 | destroy_usb_class(); | 248 | destroy_usb_class(); |
248 | } | 249 | } |
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 363b2ad74ae6..1a32d96774b4 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
@@ -207,7 +207,7 @@ config USB_AT91 | |||
207 | 207 | ||
208 | config USB_GADGET_DUMMY_HCD | 208 | config USB_GADGET_DUMMY_HCD |
209 | boolean "Dummy HCD (DEVELOPMENT)" | 209 | boolean "Dummy HCD (DEVELOPMENT)" |
210 | depends on USB && EXPERIMENTAL | 210 | depends on (USB=y || (USB=m && USB_GADGET=m)) && EXPERIMENTAL |
211 | select USB_GADGET_DUALSPEED | 211 | select USB_GADGET_DUALSPEED |
212 | help | 212 | help |
213 | This host controller driver emulates USB, looping all data transfer | 213 | This host controller driver emulates USB, looping all data transfer |
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 1c459ff037ce..cfebca05ead5 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
@@ -57,19 +57,23 @@ | |||
57 | 57 | ||
58 | /* | 58 | /* |
59 | * This controller is simple and PIO-only. It's used in many AT91-series | 59 | * This controller is simple and PIO-only. It's used in many AT91-series |
60 | * ARMv4T controllers, including the at91rm9200 (arm920T, with MMU), | 60 | * full speed USB controllers, including the at91rm9200 (arm920T, with MMU), |
61 | * at91sam9261 (arm926ejs, with MMU), and several no-mmu versions. | 61 | * at91sam926x (arm926ejs, with MMU), and several no-mmu versions. |
62 | * | 62 | * |
63 | * This driver expects the board has been wired with two GPIOs suppporting | 63 | * This driver expects the board has been wired with two GPIOs suppporting |
64 | * a VBUS sensing IRQ, and a D+ pullup. (They may be omitted, but the | 64 | * a VBUS sensing IRQ, and a D+ pullup. (They may be omitted, but the |
65 | * testing hasn't covered such cases.) The pullup is most important; it | 65 | * testing hasn't covered such cases.) |
66 | * | ||
67 | * The pullup is most important (so it's integrated on sam926x parts). It | ||
66 | * provides software control over whether the host enumerates the device. | 68 | * provides software control over whether the host enumerates the device. |
69 | * | ||
67 | * The VBUS sensing helps during enumeration, and allows both USB clocks | 70 | * The VBUS sensing helps during enumeration, and allows both USB clocks |
68 | * (and the transceiver) to stay gated off until they're necessary, saving | 71 | * (and the transceiver) to stay gated off until they're necessary, saving |
69 | * power. During USB suspend, the 48 MHz clock is gated off. | 72 | * power. During USB suspend, the 48 MHz clock is gated off in hardware; |
73 | * it may also be gated off by software during some Linux sleep states. | ||
70 | */ | 74 | */ |
71 | 75 | ||
72 | #define DRIVER_VERSION "8 March 2005" | 76 | #define DRIVER_VERSION "3 May 2006" |
73 | 77 | ||
74 | static const char driver_name [] = "at91_udc"; | 78 | static const char driver_name [] = "at91_udc"; |
75 | static const char ep0name[] = "ep0"; | 79 | static const char ep0name[] = "ep0"; |
@@ -316,9 +320,15 @@ static void done(struct at91_ep *ep, struct at91_request *req, int status) | |||
316 | * | 320 | * |
317 | * There are also state bits like FORCESTALL, EPEDS, DIR, and EPTYPE | 321 | * There are also state bits like FORCESTALL, EPEDS, DIR, and EPTYPE |
318 | * that shouldn't normally be changed. | 322 | * that shouldn't normally be changed. |
323 | * | ||
324 | * NOTE at91sam9260 docs mention synch between UDPCK and MCK clock domains, | ||
325 | * implying a need to wait for one write to complete (test relevant bits) | ||
326 | * before starting the next write. This shouldn't be an issue given how | ||
327 | * infrequently we write, except maybe for write-then-read idioms. | ||
319 | */ | 328 | */ |
320 | #define SET_FX (AT91_UDP_TXPKTRDY) | 329 | #define SET_FX (AT91_UDP_TXPKTRDY) |
321 | #define CLR_FX (RX_DATA_READY | AT91_UDP_RXSETUP | AT91_UDP_STALLSENT | AT91_UDP_TXCOMP) | 330 | #define CLR_FX (RX_DATA_READY | AT91_UDP_RXSETUP \ |
331 | | AT91_UDP_STALLSENT | AT91_UDP_TXCOMP) | ||
322 | 332 | ||
323 | /* pull OUT packet data from the endpoint's fifo */ | 333 | /* pull OUT packet data from the endpoint's fifo */ |
324 | static int read_fifo (struct at91_ep *ep, struct at91_request *req) | 334 | static int read_fifo (struct at91_ep *ep, struct at91_request *req) |
@@ -472,7 +482,8 @@ static void nuke(struct at91_ep *ep, int status) | |||
472 | 482 | ||
473 | /*-------------------------------------------------------------------------*/ | 483 | /*-------------------------------------------------------------------------*/ |
474 | 484 | ||
475 | static int at91_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | 485 | static int at91_ep_enable(struct usb_ep *_ep, |
486 | const struct usb_endpoint_descriptor *desc) | ||
476 | { | 487 | { |
477 | struct at91_ep *ep = container_of(_ep, struct at91_ep, ep); | 488 | struct at91_ep *ep = container_of(_ep, struct at91_ep, ep); |
478 | struct at91_udc *dev = ep->udc; | 489 | struct at91_udc *dev = ep->udc; |
@@ -582,11 +593,12 @@ static int at91_ep_disable (struct usb_ep * _ep) | |||
582 | * interesting for request or buffer allocation. | 593 | * interesting for request or buffer allocation. |
583 | */ | 594 | */ |
584 | 595 | ||
585 | static struct usb_request *at91_ep_alloc_request (struct usb_ep *_ep, unsigned int gfp_flags) | 596 | static struct usb_request * |
597 | at91_ep_alloc_request(struct usb_ep *_ep, unsigned int gfp_flags) | ||
586 | { | 598 | { |
587 | struct at91_request *req; | 599 | struct at91_request *req; |
588 | 600 | ||
589 | req = kcalloc(1, sizeof (struct at91_request), SLAB_KERNEL); | 601 | req = kcalloc(1, sizeof (struct at91_request), gfp_flags); |
590 | if (!req) | 602 | if (!req) |
591 | return NULL; | 603 | return NULL; |
592 | 604 | ||
@@ -862,6 +874,7 @@ static void stop_activity(struct at91_udc *udc) | |||
862 | if (udc->gadget.speed == USB_SPEED_UNKNOWN) | 874 | if (udc->gadget.speed == USB_SPEED_UNKNOWN) |
863 | driver = NULL; | 875 | driver = NULL; |
864 | udc->gadget.speed = USB_SPEED_UNKNOWN; | 876 | udc->gadget.speed = USB_SPEED_UNKNOWN; |
877 | udc->suspended = 0; | ||
865 | 878 | ||
866 | for (i = 0; i < NUM_ENDPOINTS; i++) { | 879 | for (i = 0; i < NUM_ENDPOINTS; i++) { |
867 | struct at91_ep *ep = &udc->ep[i]; | 880 | struct at91_ep *ep = &udc->ep[i]; |
@@ -889,8 +902,8 @@ static void clk_off(struct at91_udc *udc) | |||
889 | return; | 902 | return; |
890 | udc->clocked = 0; | 903 | udc->clocked = 0; |
891 | udc->gadget.speed = USB_SPEED_UNKNOWN; | 904 | udc->gadget.speed = USB_SPEED_UNKNOWN; |
892 | clk_disable(udc->iclk); | ||
893 | clk_disable(udc->fclk); | 905 | clk_disable(udc->fclk); |
906 | clk_disable(udc->iclk); | ||
894 | } | 907 | } |
895 | 908 | ||
896 | /* | 909 | /* |
@@ -911,9 +924,6 @@ static void pullup(struct at91_udc *udc, int is_on) | |||
911 | at91_udp_write(AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); | 924 | at91_udp_write(AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); |
912 | at91_set_gpio_value(udc->board.pullup_pin, 0); | 925 | at91_set_gpio_value(udc->board.pullup_pin, 0); |
913 | clk_off(udc); | 926 | clk_off(udc); |
914 | |||
915 | // REVISIT: with transceiver disabled, will D- float | ||
916 | // so that a host would falsely detect a device? | ||
917 | } | 927 | } |
918 | } | 928 | } |
919 | 929 | ||
@@ -1290,7 +1300,8 @@ static void handle_ep0(struct at91_udc *udc) | |||
1290 | if (udc->wait_for_addr_ack) { | 1300 | if (udc->wait_for_addr_ack) { |
1291 | u32 tmp; | 1301 | u32 tmp; |
1292 | 1302 | ||
1293 | at91_udp_write(AT91_UDP_FADDR, AT91_UDP_FEN | udc->addr); | 1303 | at91_udp_write(AT91_UDP_FADDR, |
1304 | AT91_UDP_FEN | udc->addr); | ||
1294 | tmp = at91_udp_read(AT91_UDP_GLB_STAT); | 1305 | tmp = at91_udp_read(AT91_UDP_GLB_STAT); |
1295 | tmp &= ~AT91_UDP_FADDEN; | 1306 | tmp &= ~AT91_UDP_FADDEN; |
1296 | if (udc->addr) | 1307 | if (udc->addr) |
@@ -1361,9 +1372,10 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r) | |||
1361 | u32 rescans = 5; | 1372 | u32 rescans = 5; |
1362 | 1373 | ||
1363 | while (rescans--) { | 1374 | while (rescans--) { |
1364 | u32 status = at91_udp_read(AT91_UDP_ISR); | 1375 | u32 status; |
1365 | 1376 | ||
1366 | status &= at91_udp_read(AT91_UDP_IMR); | 1377 | status = at91_udp_read(AT91_UDP_ISR) |
1378 | & at91_udp_read(AT91_UDP_IMR); | ||
1367 | if (!status) | 1379 | if (!status) |
1368 | break; | 1380 | break; |
1369 | 1381 | ||
@@ -1379,18 +1391,17 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r) | |||
1379 | stop_activity(udc); | 1391 | stop_activity(udc); |
1380 | 1392 | ||
1381 | /* enable ep0 */ | 1393 | /* enable ep0 */ |
1382 | at91_udp_write(AT91_UDP_CSR(0), AT91_UDP_EPEDS | AT91_UDP_EPTYPE_CTRL); | 1394 | at91_udp_write(AT91_UDP_CSR(0), |
1395 | AT91_UDP_EPEDS | AT91_UDP_EPTYPE_CTRL); | ||
1383 | udc->gadget.speed = USB_SPEED_FULL; | 1396 | udc->gadget.speed = USB_SPEED_FULL; |
1384 | udc->suspended = 0; | 1397 | udc->suspended = 0; |
1385 | at91_udp_write(AT91_UDP_IER, AT91_UDP_EP(0)); | 1398 | at91_udp_write(AT91_UDP_IER, AT91_UDP_EP(0)); |
1386 | 1399 | ||
1387 | /* | 1400 | /* |
1388 | * NOTE: this driver keeps clocks off unless the | 1401 | * NOTE: this driver keeps clocks off unless the |
1389 | * USB host is present. That saves power, and also | 1402 | * USB host is present. That saves power, but for |
1390 | * eliminates IRQs (reset, resume, suspend) that can | 1403 | * boards that don't support VBUS detection, both |
1391 | * otherwise flood from the controller. If your | 1404 | * clocks need to be active most of the time. |
1392 | * board doesn't support VBUS detection, suspend and | ||
1393 | * resume irq logic may need more attention... | ||
1394 | */ | 1405 | */ |
1395 | 1406 | ||
1396 | /* host initiated suspend (3+ms bus idle) */ | 1407 | /* host initiated suspend (3+ms bus idle) */ |
@@ -1452,13 +1463,19 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r) | |||
1452 | 1463 | ||
1453 | /*-------------------------------------------------------------------------*/ | 1464 | /*-------------------------------------------------------------------------*/ |
1454 | 1465 | ||
1466 | static void nop_release(struct device *dev) | ||
1467 | { | ||
1468 | /* nothing to free */ | ||
1469 | } | ||
1470 | |||
1455 | static struct at91_udc controller = { | 1471 | static struct at91_udc controller = { |
1456 | .gadget = { | 1472 | .gadget = { |
1457 | .ops = &at91_udc_ops, | 1473 | .ops = &at91_udc_ops, |
1458 | .ep0 = &controller.ep[0].ep, | 1474 | .ep0 = &controller.ep[0].ep, |
1459 | .name = driver_name, | 1475 | .name = driver_name, |
1460 | .dev = { | 1476 | .dev = { |
1461 | .bus_id = "gadget" | 1477 | .bus_id = "gadget", |
1478 | .release = nop_release, | ||
1462 | } | 1479 | } |
1463 | }, | 1480 | }, |
1464 | .ep[0] = { | 1481 | .ep[0] = { |
@@ -1468,7 +1485,8 @@ static struct at91_udc controller = { | |||
1468 | }, | 1485 | }, |
1469 | .udc = &controller, | 1486 | .udc = &controller, |
1470 | .maxpacket = 8, | 1487 | .maxpacket = 8, |
1471 | .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(0)), | 1488 | .creg = (void __iomem *)(AT91_VA_BASE_UDP |
1489 | + AT91_UDP_CSR(0)), | ||
1472 | .int_mask = 1 << 0, | 1490 | .int_mask = 1 << 0, |
1473 | }, | 1491 | }, |
1474 | .ep[1] = { | 1492 | .ep[1] = { |
@@ -1479,7 +1497,8 @@ static struct at91_udc controller = { | |||
1479 | .udc = &controller, | 1497 | .udc = &controller, |
1480 | .is_pingpong = 1, | 1498 | .is_pingpong = 1, |
1481 | .maxpacket = 64, | 1499 | .maxpacket = 64, |
1482 | .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(1)), | 1500 | .creg = (void __iomem *)(AT91_VA_BASE_UDP |
1501 | + AT91_UDP_CSR(1)), | ||
1483 | .int_mask = 1 << 1, | 1502 | .int_mask = 1 << 1, |
1484 | }, | 1503 | }, |
1485 | .ep[2] = { | 1504 | .ep[2] = { |
@@ -1490,7 +1509,8 @@ static struct at91_udc controller = { | |||
1490 | .udc = &controller, | 1509 | .udc = &controller, |
1491 | .is_pingpong = 1, | 1510 | .is_pingpong = 1, |
1492 | .maxpacket = 64, | 1511 | .maxpacket = 64, |
1493 | .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(2)), | 1512 | .creg = (void __iomem *)(AT91_VA_BASE_UDP |
1513 | + AT91_UDP_CSR(2)), | ||
1494 | .int_mask = 1 << 2, | 1514 | .int_mask = 1 << 2, |
1495 | }, | 1515 | }, |
1496 | .ep[3] = { | 1516 | .ep[3] = { |
@@ -1501,7 +1521,8 @@ static struct at91_udc controller = { | |||
1501 | }, | 1521 | }, |
1502 | .udc = &controller, | 1522 | .udc = &controller, |
1503 | .maxpacket = 8, | 1523 | .maxpacket = 8, |
1504 | .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(3)), | 1524 | .creg = (void __iomem *)(AT91_VA_BASE_UDP |
1525 | + AT91_UDP_CSR(3)), | ||
1505 | .int_mask = 1 << 3, | 1526 | .int_mask = 1 << 3, |
1506 | }, | 1527 | }, |
1507 | .ep[4] = { | 1528 | .ep[4] = { |
@@ -1512,7 +1533,8 @@ static struct at91_udc controller = { | |||
1512 | .udc = &controller, | 1533 | .udc = &controller, |
1513 | .is_pingpong = 1, | 1534 | .is_pingpong = 1, |
1514 | .maxpacket = 256, | 1535 | .maxpacket = 256, |
1515 | .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(4)), | 1536 | .creg = (void __iomem *)(AT91_VA_BASE_UDP |
1537 | + AT91_UDP_CSR(4)), | ||
1516 | .int_mask = 1 << 4, | 1538 | .int_mask = 1 << 4, |
1517 | }, | 1539 | }, |
1518 | .ep[5] = { | 1540 | .ep[5] = { |
@@ -1523,10 +1545,11 @@ static struct at91_udc controller = { | |||
1523 | .udc = &controller, | 1545 | .udc = &controller, |
1524 | .is_pingpong = 1, | 1546 | .is_pingpong = 1, |
1525 | .maxpacket = 256, | 1547 | .maxpacket = 256, |
1526 | .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(5)), | 1548 | .creg = (void __iomem *)(AT91_VA_BASE_UDP |
1549 | + AT91_UDP_CSR(5)), | ||
1527 | .int_mask = 1 << 5, | 1550 | .int_mask = 1 << 5, |
1528 | }, | 1551 | }, |
1529 | /* ep6 and ep7 are also reserved */ | 1552 | /* ep6 and ep7 are also reserved (custom silicon might use them) */ |
1530 | }; | 1553 | }; |
1531 | 1554 | ||
1532 | static irqreturn_t at91_vbus_irq(int irq, void *_udc, struct pt_regs *r) | 1555 | static irqreturn_t at91_vbus_irq(int irq, void *_udc, struct pt_regs *r) |
@@ -1593,6 +1616,7 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) | |||
1593 | 1616 | ||
1594 | local_irq_disable(); | 1617 | local_irq_disable(); |
1595 | udc->enabled = 0; | 1618 | udc->enabled = 0; |
1619 | at91_udp_write(AT91_UDP_IDR, ~0); | ||
1596 | pullup(udc, 0); | 1620 | pullup(udc, 0); |
1597 | local_irq_enable(); | 1621 | local_irq_enable(); |
1598 | 1622 | ||
@@ -1624,6 +1648,16 @@ static int __devinit at91udc_probe(struct platform_device *pdev) | |||
1624 | return -ENODEV; | 1648 | return -ENODEV; |
1625 | } | 1649 | } |
1626 | 1650 | ||
1651 | if (pdev->num_resources != 2) { | ||
1652 | DBG("invalid num_resources"); | ||
1653 | return -ENODEV; | ||
1654 | } | ||
1655 | if ((pdev->resource[0].flags != IORESOURCE_MEM) | ||
1656 | || (pdev->resource[1].flags != IORESOURCE_IRQ)) { | ||
1657 | DBG("invalid resource type"); | ||
1658 | return -ENODEV; | ||
1659 | } | ||
1660 | |||
1627 | if (!request_mem_region(AT91_BASE_UDP, SZ_16K, driver_name)) { | 1661 | if (!request_mem_region(AT91_BASE_UDP, SZ_16K, driver_name)) { |
1628 | DBG("someone's using UDC memory\n"); | 1662 | DBG("someone's using UDC memory\n"); |
1629 | return -EBUSY; | 1663 | return -EBUSY; |
@@ -1649,19 +1683,26 @@ static int __devinit at91udc_probe(struct platform_device *pdev) | |||
1649 | if (retval < 0) | 1683 | if (retval < 0) |
1650 | goto fail0; | 1684 | goto fail0; |
1651 | 1685 | ||
1652 | /* disable everything until there's a gadget driver and vbus */ | 1686 | /* don't do anything until we have both gadget driver and VBUS */ |
1653 | pullup(udc, 0); | 1687 | clk_enable(udc->iclk); |
1688 | at91_udp_write(AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); | ||
1689 | at91_udp_write(AT91_UDP_IDR, 0xffffffff); | ||
1690 | clk_disable(udc->iclk); | ||
1654 | 1691 | ||
1655 | /* request UDC and maybe VBUS irqs */ | 1692 | /* request UDC and maybe VBUS irqs */ |
1656 | if (request_irq(AT91_ID_UDP, at91_udc_irq, IRQF_DISABLED, driver_name, udc)) { | 1693 | udc->udp_irq = platform_get_irq(pdev, 0); |
1657 | DBG("request irq %d failed\n", AT91_ID_UDP); | 1694 | if (request_irq(udc->udp_irq, at91_udc_irq, |
1695 | IRQF_DISABLED, driver_name, udc)) { | ||
1696 | DBG("request irq %d failed\n", udc->udp_irq); | ||
1658 | retval = -EBUSY; | 1697 | retval = -EBUSY; |
1659 | goto fail1; | 1698 | goto fail1; |
1660 | } | 1699 | } |
1661 | if (udc->board.vbus_pin > 0) { | 1700 | if (udc->board.vbus_pin > 0) { |
1662 | if (request_irq(udc->board.vbus_pin, at91_vbus_irq, IRQF_DISABLED, driver_name, udc)) { | 1701 | if (request_irq(udc->board.vbus_pin, at91_vbus_irq, |
1663 | DBG("request vbus irq %d failed\n", udc->board.vbus_pin); | 1702 | IRQF_DISABLED, driver_name, udc)) { |
1664 | free_irq(AT91_ID_UDP, udc); | 1703 | DBG("request vbus irq %d failed\n", |
1704 | udc->board.vbus_pin); | ||
1705 | free_irq(udc->udp_irq, udc); | ||
1665 | retval = -EBUSY; | 1706 | retval = -EBUSY; |
1666 | goto fail1; | 1707 | goto fail1; |
1667 | } | 1708 | } |
@@ -1670,6 +1711,7 @@ static int __devinit at91udc_probe(struct platform_device *pdev) | |||
1670 | udc->vbus = 1; | 1711 | udc->vbus = 1; |
1671 | } | 1712 | } |
1672 | dev_set_drvdata(dev, udc); | 1713 | dev_set_drvdata(dev, udc); |
1714 | device_init_wakeup(dev, 1); | ||
1673 | create_debug_file(udc); | 1715 | create_debug_file(udc); |
1674 | 1716 | ||
1675 | INFO("%s version %s\n", driver_name, DRIVER_VERSION); | 1717 | INFO("%s version %s\n", driver_name, DRIVER_VERSION); |
@@ -1678,14 +1720,14 @@ static int __devinit at91udc_probe(struct platform_device *pdev) | |||
1678 | fail1: | 1720 | fail1: |
1679 | device_unregister(&udc->gadget.dev); | 1721 | device_unregister(&udc->gadget.dev); |
1680 | fail0: | 1722 | fail0: |
1681 | release_mem_region(AT91_VA_BASE_UDP, SZ_16K); | 1723 | release_mem_region(AT91_BASE_UDP, SZ_16K); |
1682 | DBG("%s probe failed, %d\n", driver_name, retval); | 1724 | DBG("%s probe failed, %d\n", driver_name, retval); |
1683 | return retval; | 1725 | return retval; |
1684 | } | 1726 | } |
1685 | 1727 | ||
1686 | static int __devexit at91udc_remove(struct platform_device *dev) | 1728 | static int __devexit at91udc_remove(struct platform_device *pdev) |
1687 | { | 1729 | { |
1688 | struct at91_udc *udc = platform_get_drvdata(dev); | 1730 | struct at91_udc *udc = platform_get_drvdata(pdev); |
1689 | 1731 | ||
1690 | DBG("remove\n"); | 1732 | DBG("remove\n"); |
1691 | 1733 | ||
@@ -1694,10 +1736,11 @@ static int __devexit at91udc_remove(struct platform_device *dev) | |||
1694 | if (udc->driver != 0) | 1736 | if (udc->driver != 0) |
1695 | usb_gadget_unregister_driver(udc->driver); | 1737 | usb_gadget_unregister_driver(udc->driver); |
1696 | 1738 | ||
1739 | device_init_wakeup(&pdev->dev, 0); | ||
1697 | remove_debug_file(udc); | 1740 | remove_debug_file(udc); |
1698 | if (udc->board.vbus_pin > 0) | 1741 | if (udc->board.vbus_pin > 0) |
1699 | free_irq(udc->board.vbus_pin, udc); | 1742 | free_irq(udc->board.vbus_pin, udc); |
1700 | free_irq(AT91_ID_UDP, udc); | 1743 | free_irq(udc->udp_irq, udc); |
1701 | device_unregister(&udc->gadget.dev); | 1744 | device_unregister(&udc->gadget.dev); |
1702 | release_mem_region(AT91_BASE_UDP, SZ_16K); | 1745 | release_mem_region(AT91_BASE_UDP, SZ_16K); |
1703 | 1746 | ||
@@ -1708,31 +1751,36 @@ static int __devexit at91udc_remove(struct platform_device *dev) | |||
1708 | } | 1751 | } |
1709 | 1752 | ||
1710 | #ifdef CONFIG_PM | 1753 | #ifdef CONFIG_PM |
1711 | static int at91udc_suspend(struct platform_device *dev, pm_message_t mesg) | 1754 | static int at91udc_suspend(struct platform_device *pdev, pm_message_t mesg) |
1712 | { | 1755 | { |
1713 | struct at91_udc *udc = platform_get_drvdata(dev); | 1756 | struct at91_udc *udc = platform_get_drvdata(pdev); |
1757 | int wake = udc->driver && device_may_wakeup(&pdev->dev); | ||
1714 | 1758 | ||
1715 | /* | 1759 | /* Unless we can act normally to the host (letting it wake us up |
1716 | * The "safe" suspend transitions are opportunistic ... e.g. when | 1760 | * whenever it has work for us) force disconnect. Wakeup requires |
1717 | * the USB link is suspended (48MHz clock autogated off), or when | 1761 | * PLLB for USB events (signaling for reset, wakeup, or incoming |
1718 | * it's disconnected (programmatically gated off, elsewhere). | 1762 | * tokens) and VBUS irqs (on systems which support them). |
1719 | * Then we can suspend, and the chip can enter slow clock mode. | ||
1720 | * | ||
1721 | * The problem case is some component (user mode?) suspending this | ||
1722 | * device while it's active, with the 48 MHz clock in use. There | ||
1723 | * are two basic approaches: (a) veto suspend levels involving slow | ||
1724 | * clock mode, (b) disconnect, so 48 MHz will no longer be in use | ||
1725 | * and we can enter slow clock mode. This uses (b) for now, since | ||
1726 | * it's simplest until AT91 PM exists and supports the other option. | ||
1727 | */ | 1763 | */ |
1728 | if (udc->vbus && !udc->suspended) | 1764 | if ((!udc->suspended && udc->addr) |
1765 | || !wake | ||
1766 | || at91_suspend_entering_slow_clock()) { | ||
1729 | pullup(udc, 0); | 1767 | pullup(udc, 0); |
1768 | disable_irq_wake(udc->udp_irq); | ||
1769 | } else | ||
1770 | enable_irq_wake(udc->udp_irq); | ||
1771 | |||
1772 | if (udc->board.vbus_pin > 0) { | ||
1773 | if (wake) | ||
1774 | enable_irq_wake(udc->board.vbus_pin); | ||
1775 | else | ||
1776 | disable_irq_wake(udc->board.vbus_pin); | ||
1777 | } | ||
1730 | return 0; | 1778 | return 0; |
1731 | } | 1779 | } |
1732 | 1780 | ||
1733 | static int at91udc_resume(struct platform_device *dev) | 1781 | static int at91udc_resume(struct platform_device *pdev) |
1734 | { | 1782 | { |
1735 | struct at91_udc *udc = platform_get_drvdata(dev); | 1783 | struct at91_udc *udc = platform_get_drvdata(pdev); |
1736 | 1784 | ||
1737 | /* maybe reconnect to host; if so, clocks on */ | 1785 | /* maybe reconnect to host; if so, clocks on */ |
1738 | pullup(udc, 1); | 1786 | pullup(udc, 1); |
@@ -1748,7 +1796,7 @@ static struct platform_driver at91_udc = { | |||
1748 | .remove = __devexit_p(at91udc_remove), | 1796 | .remove = __devexit_p(at91udc_remove), |
1749 | .shutdown = at91udc_shutdown, | 1797 | .shutdown = at91udc_shutdown, |
1750 | .suspend = at91udc_suspend, | 1798 | .suspend = at91udc_suspend, |
1751 | .resume = at91udc_resume, | 1799 | .resume = at91udc_resume, |
1752 | .driver = { | 1800 | .driver = { |
1753 | .name = (char *) driver_name, | 1801 | .name = (char *) driver_name, |
1754 | .owner = THIS_MODULE, | 1802 | .owner = THIS_MODULE, |
@@ -1767,6 +1815,6 @@ static void __devexit udc_exit_module(void) | |||
1767 | } | 1815 | } |
1768 | module_exit(udc_exit_module); | 1816 | module_exit(udc_exit_module); |
1769 | 1817 | ||
1770 | MODULE_DESCRIPTION("AT91RM9200 udc driver"); | 1818 | MODULE_DESCRIPTION("AT91 udc driver"); |
1771 | MODULE_AUTHOR("Thomas Rathbone, David Brownell"); | 1819 | MODULE_AUTHOR("Thomas Rathbone, David Brownell"); |
1772 | MODULE_LICENSE("GPL"); | 1820 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/gadget/at91_udc.h b/drivers/usb/gadget/at91_udc.h index 5a4799cedd19..882af42e86cc 100644 --- a/drivers/usb/gadget/at91_udc.h +++ b/drivers/usb/gadget/at91_udc.h | |||
@@ -141,6 +141,7 @@ struct at91_udc { | |||
141 | struct clk *iclk, *fclk; | 141 | struct clk *iclk, *fclk; |
142 | struct platform_device *pdev; | 142 | struct platform_device *pdev; |
143 | struct proc_dir_entry *pde; | 143 | struct proc_dir_entry *pde; |
144 | int udp_irq; | ||
144 | }; | 145 | }; |
145 | 146 | ||
146 | static inline struct at91_udc *to_udc(struct usb_gadget *g) | 147 | static inline struct at91_udc *to_udc(struct usb_gadget *g) |
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index 4be47195bd38..7d1c22c34957 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c | |||
@@ -609,7 +609,8 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req) | |||
609 | if (!dum->driver) | 609 | if (!dum->driver) |
610 | return -ESHUTDOWN; | 610 | return -ESHUTDOWN; |
611 | 611 | ||
612 | spin_lock_irqsave (&dum->lock, flags); | 612 | local_irq_save (flags); |
613 | spin_lock (&dum->lock); | ||
613 | list_for_each_entry (req, &ep->queue, queue) { | 614 | list_for_each_entry (req, &ep->queue, queue) { |
614 | if (&req->req == _req) { | 615 | if (&req->req == _req) { |
615 | list_del_init (&req->queue); | 616 | list_del_init (&req->queue); |
@@ -618,7 +619,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req) | |||
618 | break; | 619 | break; |
619 | } | 620 | } |
620 | } | 621 | } |
621 | spin_unlock_irqrestore (&dum->lock, flags); | 622 | spin_unlock (&dum->lock); |
622 | 623 | ||
623 | if (retval == 0) { | 624 | if (retval == 0) { |
624 | dev_dbg (udc_dev(dum), | 625 | dev_dbg (udc_dev(dum), |
@@ -626,6 +627,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req) | |||
626 | req, _ep->name, _req->length, _req->buf); | 627 | req, _ep->name, _req->length, _req->buf); |
627 | _req->complete (_ep, _req); | 628 | _req->complete (_ep, _req); |
628 | } | 629 | } |
630 | local_irq_restore (flags); | ||
629 | return retval; | 631 | return retval; |
630 | } | 632 | } |
631 | 633 | ||
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 85b0b4ad4c16..d63177a8eaea 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -892,7 +892,7 @@ MODULE_LICENSE ("GPL"); | |||
892 | #define PCI_DRIVER ehci_pci_driver | 892 | #define PCI_DRIVER ehci_pci_driver |
893 | #endif | 893 | #endif |
894 | 894 | ||
895 | #ifdef CONFIG_PPC_83xx | 895 | #ifdef CONFIG_MPC834x |
896 | #include "ehci-fsl.c" | 896 | #include "ehci-fsl.c" |
897 | #define PLATFORM_DRIVER ehci_fsl_driver | 897 | #define PLATFORM_DRIVER ehci_fsl_driver |
898 | #endif | 898 | #endif |
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index cdbafb710000..85cc059705a6 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * Copyright (C) 2004 SAN People (Pty) Ltd. | 4 | * Copyright (C) 2004 SAN People (Pty) Ltd. |
5 | * Copyright (C) 2005 Thibaut VARENE <varenet@parisc-linux.org> | 5 | * Copyright (C) 2005 Thibaut VARENE <varenet@parisc-linux.org> |
6 | * | 6 | * |
7 | * AT91RM9200 Bus Glue | 7 | * AT91 Bus Glue |
8 | * | 8 | * |
9 | * Based on fragments of 2.4 driver by Rick Bronson. | 9 | * Based on fragments of 2.4 driver by Rick Bronson. |
10 | * Based on ohci-omap.c | 10 | * Based on ohci-omap.c |
@@ -19,12 +19,13 @@ | |||
19 | #include <asm/hardware.h> | 19 | #include <asm/hardware.h> |
20 | #include <asm/arch/board.h> | 20 | #include <asm/arch/board.h> |
21 | 21 | ||
22 | #ifndef CONFIG_ARCH_AT91RM9200 | 22 | #ifndef CONFIG_ARCH_AT91 |
23 | #error "CONFIG_ARCH_AT91RM9200 must be defined." | 23 | #error "CONFIG_ARCH_AT91 must be defined." |
24 | #endif | 24 | #endif |
25 | 25 | ||
26 | /* interface and function clocks */ | 26 | /* interface and function clocks */ |
27 | static struct clk *iclk, *fclk; | 27 | static struct clk *iclk, *fclk; |
28 | static int clocked; | ||
28 | 29 | ||
29 | extern int usb_disabled(void); | 30 | extern int usb_disabled(void); |
30 | 31 | ||
@@ -35,13 +36,14 @@ static void at91_start_hc(struct platform_device *pdev) | |||
35 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | 36 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
36 | struct ohci_regs __iomem *regs = hcd->regs; | 37 | struct ohci_regs __iomem *regs = hcd->regs; |
37 | 38 | ||
38 | dev_dbg(&pdev->dev, "starting AT91RM9200 OHCI USB Controller\n"); | 39 | dev_dbg(&pdev->dev, "start\n"); |
39 | 40 | ||
40 | /* | 41 | /* |
41 | * Start the USB clocks. | 42 | * Start the USB clocks. |
42 | */ | 43 | */ |
43 | clk_enable(iclk); | 44 | clk_enable(iclk); |
44 | clk_enable(fclk); | 45 | clk_enable(fclk); |
46 | clocked = 1; | ||
45 | 47 | ||
46 | /* | 48 | /* |
47 | * The USB host controller must remain in reset. | 49 | * The USB host controller must remain in reset. |
@@ -54,7 +56,7 @@ static void at91_stop_hc(struct platform_device *pdev) | |||
54 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | 56 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
55 | struct ohci_regs __iomem *regs = hcd->regs; | 57 | struct ohci_regs __iomem *regs = hcd->regs; |
56 | 58 | ||
57 | dev_dbg(&pdev->dev, "stopping AT91RM9200 OHCI USB Controller\n"); | 59 | dev_dbg(&pdev->dev, "stop\n"); |
58 | 60 | ||
59 | /* | 61 | /* |
60 | * Put the USB host controller into reset. | 62 | * Put the USB host controller into reset. |
@@ -66,6 +68,7 @@ static void at91_stop_hc(struct platform_device *pdev) | |||
66 | */ | 68 | */ |
67 | clk_disable(fclk); | 69 | clk_disable(fclk); |
68 | clk_disable(iclk); | 70 | clk_disable(iclk); |
71 | clocked = 0; | ||
69 | } | 72 | } |
70 | 73 | ||
71 | 74 | ||
@@ -78,14 +81,15 @@ static int usb_hcd_at91_remove (struct usb_hcd *, struct platform_device *); | |||
78 | 81 | ||
79 | 82 | ||
80 | /** | 83 | /** |
81 | * usb_hcd_at91_probe - initialize AT91RM9200-based HCDs | 84 | * usb_hcd_at91_probe - initialize AT91-based HCDs |
82 | * Context: !in_interrupt() | 85 | * Context: !in_interrupt() |
83 | * | 86 | * |
84 | * Allocates basic resources for this USB host controller, and | 87 | * Allocates basic resources for this USB host controller, and |
85 | * then invokes the start() method for the HCD associated with it | 88 | * then invokes the start() method for the HCD associated with it |
86 | * through the hotplug entry's driver_data. | 89 | * through the hotplug entry's driver_data. |
87 | */ | 90 | */ |
88 | int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device *pdev) | 91 | static int usb_hcd_at91_probe(const struct hc_driver *driver, |
92 | struct platform_device *pdev) | ||
89 | { | 93 | { |
90 | int retval; | 94 | int retval; |
91 | struct usb_hcd *hcd = NULL; | 95 | struct usb_hcd *hcd = NULL; |
@@ -95,12 +99,13 @@ int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device * | |||
95 | return -ENODEV; | 99 | return -ENODEV; |
96 | } | 100 | } |
97 | 101 | ||
98 | if ((pdev->resource[0].flags != IORESOURCE_MEM) || (pdev->resource[1].flags != IORESOURCE_IRQ)) { | 102 | if ((pdev->resource[0].flags != IORESOURCE_MEM) |
103 | || (pdev->resource[1].flags != IORESOURCE_IRQ)) { | ||
99 | pr_debug("hcd probe: invalid resource type\n"); | 104 | pr_debug("hcd probe: invalid resource type\n"); |
100 | return -ENODEV; | 105 | return -ENODEV; |
101 | } | 106 | } |
102 | 107 | ||
103 | hcd = usb_create_hcd(driver, &pdev->dev, "at91rm9200"); | 108 | hcd = usb_create_hcd(driver, &pdev->dev, "at91"); |
104 | if (!hcd) | 109 | if (!hcd) |
105 | return -ENOMEM; | 110 | return -ENOMEM; |
106 | hcd->rsrc_start = pdev->resource[0].start; | 111 | hcd->rsrc_start = pdev->resource[0].start; |
@@ -149,21 +154,23 @@ int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device * | |||
149 | /* may be called with controller, bus, and devices active */ | 154 | /* may be called with controller, bus, and devices active */ |
150 | 155 | ||
151 | /** | 156 | /** |
152 | * usb_hcd_at91_remove - shutdown processing for AT91RM9200-based HCDs | 157 | * usb_hcd_at91_remove - shutdown processing for AT91-based HCDs |
153 | * @dev: USB Host Controller being removed | 158 | * @dev: USB Host Controller being removed |
154 | * Context: !in_interrupt() | 159 | * Context: !in_interrupt() |
155 | * | 160 | * |
156 | * Reverses the effect of usb_hcd_at91_probe(), first invoking | 161 | * Reverses the effect of usb_hcd_at91_probe(), first invoking |
157 | * the HCD's stop() method. It is always called from a thread | 162 | * the HCD's stop() method. It is always called from a thread |
158 | * context, normally "rmmod", "apmd", or something similar. | 163 | * context, "rmmod" or something similar. |
159 | * | 164 | * |
160 | */ | 165 | */ |
161 | static int usb_hcd_at91_remove (struct usb_hcd *hcd, struct platform_device *pdev) | 166 | static int usb_hcd_at91_remove(struct usb_hcd *hcd, |
167 | struct platform_device *pdev) | ||
162 | { | 168 | { |
163 | usb_remove_hcd(hcd); | 169 | usb_remove_hcd(hcd); |
164 | at91_stop_hc(pdev); | 170 | at91_stop_hc(pdev); |
165 | iounmap(hcd->regs); | 171 | iounmap(hcd->regs); |
166 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | 172 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
173 | disable_irq_wake(hcd->irq); | ||
167 | 174 | ||
168 | clk_put(fclk); | 175 | clk_put(fclk); |
169 | clk_put(iclk); | 176 | clk_put(iclk); |
@@ -178,19 +185,21 @@ static int usb_hcd_at91_remove (struct usb_hcd *hcd, struct platform_device *pde | |||
178 | static int __devinit | 185 | static int __devinit |
179 | ohci_at91_start (struct usb_hcd *hcd) | 186 | ohci_at91_start (struct usb_hcd *hcd) |
180 | { | 187 | { |
181 | // struct at91_ohci_data *board = hcd->self.controller->platform_data; | 188 | struct at91_usbh_data *board = hcd->self.controller->platform_data; |
182 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 189 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
190 | struct usb_device *root = hcd->self.root_hub; | ||
183 | int ret; | 191 | int ret; |
184 | 192 | ||
185 | if ((ret = ohci_init(ohci)) < 0) | 193 | if ((ret = ohci_init(ohci)) < 0) |
186 | return ret; | 194 | return ret; |
187 | 195 | ||
196 | root->maxchild = board->ports; | ||
197 | |||
188 | if ((ret = ohci_run(ohci)) < 0) { | 198 | if ((ret = ohci_run(ohci)) < 0) { |
189 | err("can't start %s", hcd->self.bus_name); | 199 | err("can't start %s", hcd->self.bus_name); |
190 | ohci_stop(hcd); | 200 | ohci_stop(hcd); |
191 | return ret; | 201 | return ret; |
192 | } | 202 | } |
193 | // hcd->self.root_hub->maxchild = board->ports; | ||
194 | return 0; | 203 | return 0; |
195 | } | 204 | } |
196 | 205 | ||
@@ -198,7 +207,7 @@ ohci_at91_start (struct usb_hcd *hcd) | |||
198 | 207 | ||
199 | static const struct hc_driver ohci_at91_hc_driver = { | 208 | static const struct hc_driver ohci_at91_hc_driver = { |
200 | .description = hcd_name, | 209 | .description = hcd_name, |
201 | .product_desc = "AT91RM9200 OHCI", | 210 | .product_desc = "AT91 OHCI", |
202 | .hcd_priv_size = sizeof(struct ohci_hcd), | 211 | .hcd_priv_size = sizeof(struct ohci_hcd), |
203 | 212 | ||
204 | /* | 213 | /* |
@@ -240,33 +249,54 @@ static const struct hc_driver ohci_at91_hc_driver = { | |||
240 | 249 | ||
241 | /*-------------------------------------------------------------------------*/ | 250 | /*-------------------------------------------------------------------------*/ |
242 | 251 | ||
243 | static int ohci_hcd_at91_drv_probe(struct platform_device *dev) | 252 | static int ohci_hcd_at91_drv_probe(struct platform_device *pdev) |
244 | { | 253 | { |
245 | return usb_hcd_at91_probe(&ohci_at91_hc_driver, dev); | 254 | device_init_wakeup(&pdev->dev, 1); |
255 | return usb_hcd_at91_probe(&ohci_at91_hc_driver, pdev); | ||
246 | } | 256 | } |
247 | 257 | ||
248 | static int ohci_hcd_at91_drv_remove(struct platform_device *dev) | 258 | static int ohci_hcd_at91_drv_remove(struct platform_device *pdev) |
249 | { | 259 | { |
250 | return usb_hcd_at91_remove(platform_get_drvdata(dev), dev); | 260 | device_init_wakeup(&pdev->dev, 0); |
261 | return usb_hcd_at91_remove(platform_get_drvdata(pdev), pdev); | ||
251 | } | 262 | } |
252 | 263 | ||
253 | #ifdef CONFIG_PM | 264 | #ifdef CONFIG_PM |
254 | 265 | ||
255 | /* REVISIT suspend/resume look "too" simple here */ | ||
256 | |||
257 | static int | 266 | static int |
258 | ohci_hcd_at91_drv_suspend(struct platform_device *dev, pm_message_t mesg) | 267 | ohci_hcd_at91_drv_suspend(struct platform_device *pdev, pm_message_t mesg) |
259 | { | 268 | { |
260 | clk_disable(fclk); | 269 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
261 | clk_disable(iclk); | 270 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
271 | |||
272 | if (device_may_wakeup(&pdev->dev)) | ||
273 | enable_irq_wake(hcd->irq); | ||
274 | else | ||
275 | disable_irq_wake(hcd->irq); | ||
276 | |||
277 | /* | ||
278 | * The integrated transceivers seem unable to notice disconnect, | ||
279 | * reconnect, or wakeup without the 48 MHz clock active. so for | ||
280 | * correctness, always discard connection state (using reset). | ||
281 | * | ||
282 | * REVISIT: some boards will be able to turn VBUS off... | ||
283 | */ | ||
284 | if (at91_suspend_entering_slow_clock()) { | ||
285 | ohci_usb_reset (ohci); | ||
286 | clk_disable(fclk); | ||
287 | clk_disable(iclk); | ||
288 | clocked = 0; | ||
289 | } | ||
262 | 290 | ||
263 | return 0; | 291 | return 0; |
264 | } | 292 | } |
265 | 293 | ||
266 | static int ohci_hcd_at91_drv_resume(struct platform_device *dev) | 294 | static int ohci_hcd_at91_drv_resume(struct platform_device *pdev) |
267 | { | 295 | { |
268 | clk_enable(iclk); | 296 | if (!clocked) { |
269 | clk_enable(fclk); | 297 | clk_enable(iclk); |
298 | clk_enable(fclk); | ||
299 | } | ||
270 | 300 | ||
271 | return 0; | 301 | return 0; |
272 | } | 302 | } |
@@ -275,7 +305,7 @@ static int ohci_hcd_at91_drv_resume(struct platform_device *dev) | |||
275 | #define ohci_hcd_at91_drv_resume NULL | 305 | #define ohci_hcd_at91_drv_resume NULL |
276 | #endif | 306 | #endif |
277 | 307 | ||
278 | MODULE_ALIAS("at91rm9200-ohci"); | 308 | MODULE_ALIAS("at91_ohci"); |
279 | 309 | ||
280 | static struct platform_driver ohci_hcd_at91_driver = { | 310 | static struct platform_driver ohci_hcd_at91_driver = { |
281 | .probe = ohci_hcd_at91_drv_probe, | 311 | .probe = ohci_hcd_at91_drv_probe, |
@@ -283,7 +313,7 @@ static struct platform_driver ohci_hcd_at91_driver = { | |||
283 | .suspend = ohci_hcd_at91_drv_suspend, | 313 | .suspend = ohci_hcd_at91_drv_suspend, |
284 | .resume = ohci_hcd_at91_drv_resume, | 314 | .resume = ohci_hcd_at91_drv_resume, |
285 | .driver = { | 315 | .driver = { |
286 | .name = "at91rm9200-ohci", | 316 | .name = "at91_ohci", |
287 | .owner = THIS_MODULE, | 317 | .owner = THIS_MODULE, |
288 | }, | 318 | }, |
289 | }; | 319 | }; |
diff --git a/drivers/usb/host/ohci-au1xxx.c b/drivers/usb/host/ohci-au1xxx.c index 822914e2f43b..f7a975d5db09 100644 --- a/drivers/usb/host/ohci-au1xxx.c +++ b/drivers/usb/host/ohci-au1xxx.c | |||
@@ -110,7 +110,6 @@ static void au1xxx_start_ohc(struct platform_device *dev) | |||
110 | 110 | ||
111 | printk(KERN_DEBUG __FILE__ | 111 | printk(KERN_DEBUG __FILE__ |
112 | ": Clock to USB host has been enabled \n"); | 112 | ": Clock to USB host has been enabled \n"); |
113 | #endif | ||
114 | } | 113 | } |
115 | 114 | ||
116 | static void au1xxx_stop_ohc(struct platform_device *dev) | 115 | static void au1xxx_stop_ohc(struct platform_device *dev) |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index afef5ac35b4a..94d8cf4b36c1 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -913,7 +913,7 @@ MODULE_LICENSE ("GPL"); | |||
913 | #include "ohci-ppc-soc.c" | 913 | #include "ohci-ppc-soc.c" |
914 | #endif | 914 | #endif |
915 | 915 | ||
916 | #ifdef CONFIG_ARCH_AT91RM9200 | 916 | #if defined(CONFIG_ARCH_AT91RM9200) || defined(CONFIG_ARCH_AT91SAM9261) |
917 | #include "ohci-at91.c" | 917 | #include "ohci-at91.c" |
918 | #endif | 918 | #endif |
919 | 919 | ||
@@ -927,6 +927,7 @@ MODULE_LICENSE ("GPL"); | |||
927 | || defined (CONFIG_SOC_AU1X00) \ | 927 | || defined (CONFIG_SOC_AU1X00) \ |
928 | || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \ | 928 | || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \ |
929 | || defined (CONFIG_ARCH_AT91RM9200) \ | 929 | || defined (CONFIG_ARCH_AT91RM9200) \ |
930 | || defined (CONFIG_ARCH_AT91SAM9261) \ | ||
930 | ) | 931 | ) |
931 | #error "missing bus glue for ohci-hcd" | 932 | #error "missing bus glue for ohci-hcd" |
932 | #endif | 933 | #endif |
diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c index c9d72ac0a1d7..66c3f61bc9d1 100644 --- a/drivers/usb/host/uhci-q.c +++ b/drivers/usb/host/uhci-q.c | |||
@@ -943,7 +943,9 @@ static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb) | |||
943 | /* We received a short packet */ | 943 | /* We received a short packet */ |
944 | if (urb->transfer_flags & URB_SHORT_NOT_OK) | 944 | if (urb->transfer_flags & URB_SHORT_NOT_OK) |
945 | ret = -EREMOTEIO; | 945 | ret = -EREMOTEIO; |
946 | else if (ctrlstat & TD_CTRL_SPD) | 946 | |
947 | /* Fixup needed only if this isn't the URB's last TD */ | ||
948 | else if (&td->list != urbp->td_list.prev) | ||
947 | ret = 1; | 949 | ret = 1; |
948 | } | 950 | } |
949 | 951 | ||
diff --git a/drivers/usb/input/appletouch.c b/drivers/usb/input/appletouch.c index 9e3f13903371..044faa07e297 100644 --- a/drivers/usb/input/appletouch.c +++ b/drivers/usb/input/appletouch.c | |||
@@ -597,9 +597,9 @@ static void atp_disconnect(struct usb_interface *iface) | |||
597 | if (dev) { | 597 | if (dev) { |
598 | usb_kill_urb(dev->urb); | 598 | usb_kill_urb(dev->urb); |
599 | input_unregister_device(dev->input); | 599 | input_unregister_device(dev->input); |
600 | usb_free_urb(dev->urb); | ||
601 | usb_buffer_free(dev->udev, dev->datalen, | 600 | usb_buffer_free(dev->udev, dev->datalen, |
602 | dev->data, dev->urb->transfer_dma); | 601 | dev->data, dev->urb->transfer_dma); |
602 | usb_free_urb(dev->urb); | ||
603 | kfree(dev); | 603 | kfree(dev); |
604 | } | 604 | } |
605 | printk(KERN_INFO "input: appletouch disconnected\n"); | 605 | printk(KERN_INFO "input: appletouch disconnected\n"); |
diff --git a/drivers/usb/input/ati_remote.c b/drivers/usb/input/ati_remote.c index 05d2d6012eb2..3719fcb04b8f 100644 --- a/drivers/usb/input/ati_remote.c +++ b/drivers/usb/input/ati_remote.c | |||
@@ -111,14 +111,28 @@ | |||
111 | #define NAME_BUFSIZE 80 /* size of product name, path buffers */ | 111 | #define NAME_BUFSIZE 80 /* size of product name, path buffers */ |
112 | #define DATA_BUFSIZE 63 /* size of URB data buffers */ | 112 | #define DATA_BUFSIZE 63 /* size of URB data buffers */ |
113 | 113 | ||
114 | /* | ||
115 | * Duplicate event filtering time. | ||
116 | * Sequential, identical KIND_FILTERED inputs with less than | ||
117 | * FILTER_TIME milliseconds between them are considered as repeat | ||
118 | * events. The hardware generates 5 events for the first keypress | ||
119 | * and we have to take this into account for an accurate repeat | ||
120 | * behaviour. | ||
121 | */ | ||
122 | #define FILTER_TIME 60 /* msec */ | ||
123 | |||
114 | static unsigned long channel_mask; | 124 | static unsigned long channel_mask; |
115 | module_param(channel_mask, ulong, 0444); | 125 | module_param(channel_mask, ulong, 0644); |
116 | MODULE_PARM_DESC(channel_mask, "Bitmask of remote control channels to ignore"); | 126 | MODULE_PARM_DESC(channel_mask, "Bitmask of remote control channels to ignore"); |
117 | 127 | ||
118 | static int debug; | 128 | static int debug; |
119 | module_param(debug, int, 0444); | 129 | module_param(debug, int, 0644); |
120 | MODULE_PARM_DESC(debug, "Enable extra debug messages and information"); | 130 | MODULE_PARM_DESC(debug, "Enable extra debug messages and information"); |
121 | 131 | ||
132 | static int repeat_filter = FILTER_TIME; | ||
133 | module_param(repeat_filter, int, 0644); | ||
134 | MODULE_PARM_DESC(repeat_filter, "Repeat filter time, default = 60 msec"); | ||
135 | |||
122 | #define dbginfo(dev, format, arg...) do { if (debug) dev_info(dev , format , ## arg); } while (0) | 136 | #define dbginfo(dev, format, arg...) do { if (debug) dev_info(dev , format , ## arg); } while (0) |
123 | #undef err | 137 | #undef err |
124 | #define err(format, arg...) printk(KERN_ERR format , ## arg) | 138 | #define err(format, arg...) printk(KERN_ERR format , ## arg) |
@@ -143,19 +157,6 @@ MODULE_DEVICE_TABLE(usb, ati_remote_table); | |||
143 | static char init1[] = { 0x01, 0x00, 0x20, 0x14 }; | 157 | static char init1[] = { 0x01, 0x00, 0x20, 0x14 }; |
144 | static char init2[] = { 0x01, 0x00, 0x20, 0x14, 0x20, 0x20, 0x20 }; | 158 | static char init2[] = { 0x01, 0x00, 0x20, 0x14, 0x20, 0x20, 0x20 }; |
145 | 159 | ||
146 | /* Acceleration curve for directional control pad */ | ||
147 | static const char accel[] = { 1, 2, 4, 6, 9, 13, 20 }; | ||
148 | |||
149 | /* Duplicate event filtering time. | ||
150 | * Sequential, identical KIND_FILTERED inputs with less than | ||
151 | * FILTER_TIME jiffies between them are considered as repeat | ||
152 | * events. The hardware generates 5 events for the first keypress | ||
153 | * and we have to take this into account for an accurate repeat | ||
154 | * behaviour. | ||
155 | * (HZ / 20) == 50 ms and works well for me. | ||
156 | */ | ||
157 | #define FILTER_TIME (HZ / 20) | ||
158 | |||
159 | struct ati_remote { | 160 | struct ati_remote { |
160 | struct input_dev *idev; | 161 | struct input_dev *idev; |
161 | struct usb_device *udev; | 162 | struct usb_device *udev; |
@@ -413,6 +414,43 @@ static int ati_remote_event_lookup(int rem, unsigned char d1, unsigned char d2) | |||
413 | } | 414 | } |
414 | 415 | ||
415 | /* | 416 | /* |
417 | * ati_remote_compute_accel | ||
418 | * | ||
419 | * Implements acceleration curve for directional control pad | ||
420 | * If elapsed time since last event is > 1/4 second, user "stopped", | ||
421 | * so reset acceleration. Otherwise, user is probably holding the control | ||
422 | * pad down, so we increase acceleration, ramping up over two seconds to | ||
423 | * a maximum speed. | ||
424 | */ | ||
425 | static int ati_remote_compute_accel(struct ati_remote *ati_remote) | ||
426 | { | ||
427 | static const char accel[] = { 1, 2, 4, 6, 9, 13, 20 }; | ||
428 | unsigned long now = jiffies; | ||
429 | int acc; | ||
430 | |||
431 | if (time_after(now, ati_remote->old_jiffies + msecs_to_jiffies(250))) { | ||
432 | acc = 1; | ||
433 | ati_remote->acc_jiffies = now; | ||
434 | } | ||
435 | else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(125))) | ||
436 | acc = accel[0]; | ||
437 | else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(250))) | ||
438 | acc = accel[1]; | ||
439 | else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(500))) | ||
440 | acc = accel[2]; | ||
441 | else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(1000))) | ||
442 | acc = accel[3]; | ||
443 | else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(1500))) | ||
444 | acc = accel[4]; | ||
445 | else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(2000))) | ||
446 | acc = accel[5]; | ||
447 | else | ||
448 | acc = accel[6]; | ||
449 | |||
450 | return acc; | ||
451 | } | ||
452 | |||
453 | /* | ||
416 | * ati_remote_report_input | 454 | * ati_remote_report_input |
417 | */ | 455 | */ |
418 | static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs) | 456 | static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs) |
@@ -465,9 +503,9 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs) | |||
465 | 503 | ||
466 | if (ati_remote_tbl[index].kind == KIND_FILTERED) { | 504 | if (ati_remote_tbl[index].kind == KIND_FILTERED) { |
467 | /* Filter duplicate events which happen "too close" together. */ | 505 | /* Filter duplicate events which happen "too close" together. */ |
468 | if ((ati_remote->old_data[0] == data[1]) && | 506 | if (ati_remote->old_data[0] == data[1] && |
469 | (ati_remote->old_data[1] == data[2]) && | 507 | ati_remote->old_data[1] == data[2] && |
470 | time_before(jiffies, ati_remote->old_jiffies + FILTER_TIME)) { | 508 | time_before(jiffies, ati_remote->old_jiffies + msecs_to_jiffies(repeat_filter))) { |
471 | ati_remote->repeat_count++; | 509 | ati_remote->repeat_count++; |
472 | } else { | 510 | } else { |
473 | ati_remote->repeat_count = 0; | 511 | ati_remote->repeat_count = 0; |
@@ -477,75 +515,61 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs) | |||
477 | ati_remote->old_data[1] = data[2]; | 515 | ati_remote->old_data[1] = data[2]; |
478 | ati_remote->old_jiffies = jiffies; | 516 | ati_remote->old_jiffies = jiffies; |
479 | 517 | ||
480 | if ((ati_remote->repeat_count > 0) | 518 | if (ati_remote->repeat_count > 0 && |
481 | && (ati_remote->repeat_count < 5)) | 519 | ati_remote->repeat_count < 5) |
482 | return; | 520 | return; |
483 | 521 | ||
484 | 522 | ||
485 | input_regs(dev, regs); | 523 | input_regs(dev, regs); |
486 | input_event(dev, ati_remote_tbl[index].type, | 524 | input_event(dev, ati_remote_tbl[index].type, |
487 | ati_remote_tbl[index].code, 1); | 525 | ati_remote_tbl[index].code, 1); |
526 | input_sync(dev); | ||
488 | input_event(dev, ati_remote_tbl[index].type, | 527 | input_event(dev, ati_remote_tbl[index].type, |
489 | ati_remote_tbl[index].code, 0); | 528 | ati_remote_tbl[index].code, 0); |
490 | input_sync(dev); | 529 | input_sync(dev); |
491 | 530 | ||
492 | return; | 531 | } else { |
493 | } | ||
494 | 532 | ||
495 | /* | 533 | /* |
496 | * Other event kinds are from the directional control pad, and have an | 534 | * Other event kinds are from the directional control pad, and have an |
497 | * acceleration factor applied to them. Without this acceleration, the | 535 | * acceleration factor applied to them. Without this acceleration, the |
498 | * control pad is mostly unusable. | 536 | * control pad is mostly unusable. |
499 | * | 537 | */ |
500 | * If elapsed time since last event is > 1/4 second, user "stopped", | 538 | acc = ati_remote_compute_accel(ati_remote); |
501 | * so reset acceleration. Otherwise, user is probably holding the control | 539 | |
502 | * pad down, so we increase acceleration, ramping up over two seconds to | 540 | input_regs(dev, regs); |
503 | * a maximum speed. The acceleration curve is #defined above. | 541 | switch (ati_remote_tbl[index].kind) { |
504 | */ | 542 | case KIND_ACCEL: |
505 | if (time_after(jiffies, ati_remote->old_jiffies + (HZ >> 2))) { | 543 | input_event(dev, ati_remote_tbl[index].type, |
506 | acc = 1; | 544 | ati_remote_tbl[index].code, |
507 | ati_remote->acc_jiffies = jiffies; | 545 | ati_remote_tbl[index].value * acc); |
508 | } | 546 | break; |
509 | else if (time_before(jiffies, ati_remote->acc_jiffies + (HZ >> 3))) acc = accel[0]; | 547 | case KIND_LU: |
510 | else if (time_before(jiffies, ati_remote->acc_jiffies + (HZ >> 2))) acc = accel[1]; | 548 | input_report_rel(dev, REL_X, -acc); |
511 | else if (time_before(jiffies, ati_remote->acc_jiffies + (HZ >> 1))) acc = accel[2]; | 549 | input_report_rel(dev, REL_Y, -acc); |
512 | else if (time_before(jiffies, ati_remote->acc_jiffies + HZ)) acc = accel[3]; | 550 | break; |
513 | else if (time_before(jiffies, ati_remote->acc_jiffies + HZ+(HZ>>1))) acc = accel[4]; | 551 | case KIND_RU: |
514 | else if (time_before(jiffies, ati_remote->acc_jiffies + (HZ << 1))) acc = accel[5]; | 552 | input_report_rel(dev, REL_X, acc); |
515 | else acc = accel[6]; | 553 | input_report_rel(dev, REL_Y, -acc); |
516 | 554 | break; | |
517 | input_regs(dev, regs); | 555 | case KIND_LD: |
518 | switch (ati_remote_tbl[index].kind) { | 556 | input_report_rel(dev, REL_X, -acc); |
519 | case KIND_ACCEL: | 557 | input_report_rel(dev, REL_Y, acc); |
520 | input_event(dev, ati_remote_tbl[index].type, | 558 | break; |
521 | ati_remote_tbl[index].code, | 559 | case KIND_RD: |
522 | ati_remote_tbl[index].value * acc); | 560 | input_report_rel(dev, REL_X, acc); |
523 | break; | 561 | input_report_rel(dev, REL_Y, acc); |
524 | case KIND_LU: | 562 | break; |
525 | input_report_rel(dev, REL_X, -acc); | 563 | default: |
526 | input_report_rel(dev, REL_Y, -acc); | 564 | dev_dbg(&ati_remote->interface->dev, "ati_remote kind=%d\n", |
527 | break; | 565 | ati_remote_tbl[index].kind); |
528 | case KIND_RU: | 566 | } |
529 | input_report_rel(dev, REL_X, acc); | 567 | input_sync(dev); |
530 | input_report_rel(dev, REL_Y, -acc); | ||
531 | break; | ||
532 | case KIND_LD: | ||
533 | input_report_rel(dev, REL_X, -acc); | ||
534 | input_report_rel(dev, REL_Y, acc); | ||
535 | break; | ||
536 | case KIND_RD: | ||
537 | input_report_rel(dev, REL_X, acc); | ||
538 | input_report_rel(dev, REL_Y, acc); | ||
539 | break; | ||
540 | default: | ||
541 | dev_dbg(&ati_remote->interface->dev, "ati_remote kind=%d\n", | ||
542 | ati_remote_tbl[index].kind); | ||
543 | } | ||
544 | input_sync(dev); | ||
545 | 568 | ||
546 | ati_remote->old_jiffies = jiffies; | 569 | ati_remote->old_jiffies = jiffies; |
547 | ati_remote->old_data[0] = data[1]; | 570 | ati_remote->old_data[0] = data[1]; |
548 | ati_remote->old_data[1] = data[2]; | 571 | ati_remote->old_data[1] = data[2]; |
572 | } | ||
549 | } | 573 | } |
550 | 574 | ||
551 | /* | 575 | /* |
diff --git a/drivers/usb/input/hid-input.c b/drivers/usb/input/hid-input.c index 028e1ad89f5d..7208839f2dbf 100644 --- a/drivers/usb/input/hid-input.c +++ b/drivers/usb/input/hid-input.c | |||
@@ -607,7 +607,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel | |||
607 | 607 | ||
608 | } | 608 | } |
609 | 609 | ||
610 | if (usage->hat_min < usage->hat_max || usage->hat_dir) { | 610 | if (usage->type == EV_ABS && |
611 | (usage->hat_min < usage->hat_max || usage->hat_dir)) { | ||
611 | int i; | 612 | int i; |
612 | for (i = usage->code; i < usage->code + 2 && i <= max; i++) { | 613 | for (i = usage->code; i < usage->code + 2 && i <= max; i++) { |
613 | input_set_abs_params(input, i, -1, 1, 0, 0); | 614 | input_set_abs_params(input, i, -1, 1, 0, 0); |
diff --git a/drivers/usb/input/hiddev.c b/drivers/usb/input/hiddev.c index 70477f02cc29..f6b839c257a7 100644 --- a/drivers/usb/input/hiddev.c +++ b/drivers/usb/input/hiddev.c | |||
@@ -49,7 +49,7 @@ struct hiddev { | |||
49 | int open; | 49 | int open; |
50 | wait_queue_head_t wait; | 50 | wait_queue_head_t wait; |
51 | struct hid_device *hid; | 51 | struct hid_device *hid; |
52 | struct hiddev_list *list; | 52 | struct list_head list; |
53 | }; | 53 | }; |
54 | 54 | ||
55 | struct hiddev_list { | 55 | struct hiddev_list { |
@@ -59,7 +59,7 @@ struct hiddev_list { | |||
59 | unsigned flags; | 59 | unsigned flags; |
60 | struct fasync_struct *fasync; | 60 | struct fasync_struct *fasync; |
61 | struct hiddev *hiddev; | 61 | struct hiddev *hiddev; |
62 | struct hiddev_list *next; | 62 | struct list_head node; |
63 | }; | 63 | }; |
64 | 64 | ||
65 | static struct hiddev *hiddev_table[HIDDEV_MINORS]; | 65 | static struct hiddev *hiddev_table[HIDDEV_MINORS]; |
@@ -73,12 +73,15 @@ static struct hiddev *hiddev_table[HIDDEV_MINORS]; | |||
73 | static struct hid_report * | 73 | static struct hid_report * |
74 | hiddev_lookup_report(struct hid_device *hid, struct hiddev_report_info *rinfo) | 74 | hiddev_lookup_report(struct hid_device *hid, struct hiddev_report_info *rinfo) |
75 | { | 75 | { |
76 | unsigned flags = rinfo->report_id & ~HID_REPORT_ID_MASK; | 76 | unsigned int flags = rinfo->report_id & ~HID_REPORT_ID_MASK; |
77 | unsigned int rid = rinfo->report_id & HID_REPORT_ID_MASK; | ||
77 | struct hid_report_enum *report_enum; | 78 | struct hid_report_enum *report_enum; |
79 | struct hid_report *report; | ||
78 | struct list_head *list; | 80 | struct list_head *list; |
79 | 81 | ||
80 | if (rinfo->report_type < HID_REPORT_TYPE_MIN || | 82 | if (rinfo->report_type < HID_REPORT_TYPE_MIN || |
81 | rinfo->report_type > HID_REPORT_TYPE_MAX) return NULL; | 83 | rinfo->report_type > HID_REPORT_TYPE_MAX) |
84 | return NULL; | ||
82 | 85 | ||
83 | report_enum = hid->report_enum + | 86 | report_enum = hid->report_enum + |
84 | (rinfo->report_type - HID_REPORT_TYPE_MIN); | 87 | (rinfo->report_type - HID_REPORT_TYPE_MIN); |
@@ -88,21 +91,25 @@ hiddev_lookup_report(struct hid_device *hid, struct hiddev_report_info *rinfo) | |||
88 | break; | 91 | break; |
89 | 92 | ||
90 | case HID_REPORT_ID_FIRST: | 93 | case HID_REPORT_ID_FIRST: |
91 | list = report_enum->report_list.next; | 94 | if (list_empty(&report_enum->report_list)) |
92 | if (list == &report_enum->report_list) | ||
93 | return NULL; | 95 | return NULL; |
94 | rinfo->report_id = ((struct hid_report *) list)->id; | 96 | |
97 | list = report_enum->report_list.next; | ||
98 | report = list_entry(list, struct hid_report, list); | ||
99 | rinfo->report_id = report->id; | ||
95 | break; | 100 | break; |
96 | 101 | ||
97 | case HID_REPORT_ID_NEXT: | 102 | case HID_REPORT_ID_NEXT: |
98 | list = (struct list_head *) | 103 | report = report_enum->report_id_hash[rid]; |
99 | report_enum->report_id_hash[rinfo->report_id & HID_REPORT_ID_MASK]; | 104 | if (!report) |
100 | if (list == NULL) | ||
101 | return NULL; | 105 | return NULL; |
102 | list = list->next; | 106 | |
107 | list = report->list.next; | ||
103 | if (list == &report_enum->report_list) | 108 | if (list == &report_enum->report_list) |
104 | return NULL; | 109 | return NULL; |
105 | rinfo->report_id = ((struct hid_report *) list)->id; | 110 | |
111 | report = list_entry(list, struct hid_report, list); | ||
112 | rinfo->report_id = report->id; | ||
106 | break; | 113 | break; |
107 | 114 | ||
108 | default: | 115 | default: |
@@ -125,12 +132,13 @@ hiddev_lookup_usage(struct hid_device *hid, struct hiddev_usage_ref *uref) | |||
125 | struct hid_field *field; | 132 | struct hid_field *field; |
126 | 133 | ||
127 | if (uref->report_type < HID_REPORT_TYPE_MIN || | 134 | if (uref->report_type < HID_REPORT_TYPE_MIN || |
128 | uref->report_type > HID_REPORT_TYPE_MAX) return NULL; | 135 | uref->report_type > HID_REPORT_TYPE_MAX) |
136 | return NULL; | ||
129 | 137 | ||
130 | report_enum = hid->report_enum + | 138 | report_enum = hid->report_enum + |
131 | (uref->report_type - HID_REPORT_TYPE_MIN); | 139 | (uref->report_type - HID_REPORT_TYPE_MIN); |
132 | 140 | ||
133 | list_for_each_entry(report, &report_enum->report_list, list) | 141 | list_for_each_entry(report, &report_enum->report_list, list) { |
134 | for (i = 0; i < report->maxfield; i++) { | 142 | for (i = 0; i < report->maxfield; i++) { |
135 | field = report->field[i]; | 143 | field = report->field[i]; |
136 | for (j = 0; j < field->maxusage; j++) { | 144 | for (j = 0; j < field->maxusage; j++) { |
@@ -142,6 +150,7 @@ hiddev_lookup_usage(struct hid_device *hid, struct hiddev_usage_ref *uref) | |||
142 | } | 150 | } |
143 | } | 151 | } |
144 | } | 152 | } |
153 | } | ||
145 | 154 | ||
146 | return NULL; | 155 | return NULL; |
147 | } | 156 | } |
@@ -150,9 +159,9 @@ static void hiddev_send_event(struct hid_device *hid, | |||
150 | struct hiddev_usage_ref *uref) | 159 | struct hiddev_usage_ref *uref) |
151 | { | 160 | { |
152 | struct hiddev *hiddev = hid->hiddev; | 161 | struct hiddev *hiddev = hid->hiddev; |
153 | struct hiddev_list *list = hiddev->list; | 162 | struct hiddev_list *list; |
154 | 163 | ||
155 | while (list) { | 164 | list_for_each_entry(list, &hiddev->list, node) { |
156 | if (uref->field_index != HID_FIELD_INDEX_NONE || | 165 | if (uref->field_index != HID_FIELD_INDEX_NONE || |
157 | (list->flags & HIDDEV_FLAG_REPORT) != 0) { | 166 | (list->flags & HIDDEV_FLAG_REPORT) != 0) { |
158 | list->buffer[list->head] = *uref; | 167 | list->buffer[list->head] = *uref; |
@@ -160,8 +169,6 @@ static void hiddev_send_event(struct hid_device *hid, | |||
160 | (HIDDEV_BUFFER_SIZE - 1); | 169 | (HIDDEV_BUFFER_SIZE - 1); |
161 | kill_fasync(&list->fasync, SIGIO, POLL_IN); | 170 | kill_fasync(&list->fasync, SIGIO, POLL_IN); |
162 | } | 171 | } |
163 | |||
164 | list = list->next; | ||
165 | } | 172 | } |
166 | 173 | ||
167 | wake_up_interruptible(&hiddev->wait); | 174 | wake_up_interruptible(&hiddev->wait); |
@@ -180,7 +187,7 @@ void hiddev_hid_event(struct hid_device *hid, struct hid_field *field, | |||
180 | uref.report_type = | 187 | uref.report_type = |
181 | (type == HID_INPUT_REPORT) ? HID_REPORT_TYPE_INPUT : | 188 | (type == HID_INPUT_REPORT) ? HID_REPORT_TYPE_INPUT : |
182 | ((type == HID_OUTPUT_REPORT) ? HID_REPORT_TYPE_OUTPUT : | 189 | ((type == HID_OUTPUT_REPORT) ? HID_REPORT_TYPE_OUTPUT : |
183 | ((type == HID_FEATURE_REPORT) ? HID_REPORT_TYPE_FEATURE:0)); | 190 | ((type == HID_FEATURE_REPORT) ? HID_REPORT_TYPE_FEATURE : 0)); |
184 | uref.report_id = field->report->id; | 191 | uref.report_id = field->report->id; |
185 | uref.field_index = field->index; | 192 | uref.field_index = field->index; |
186 | uref.usage_index = (usage - field->usage); | 193 | uref.usage_index = (usage - field->usage); |
@@ -200,7 +207,7 @@ void hiddev_report_event(struct hid_device *hid, struct hid_report *report) | |||
200 | uref.report_type = | 207 | uref.report_type = |
201 | (type == HID_INPUT_REPORT) ? HID_REPORT_TYPE_INPUT : | 208 | (type == HID_INPUT_REPORT) ? HID_REPORT_TYPE_INPUT : |
202 | ((type == HID_OUTPUT_REPORT) ? HID_REPORT_TYPE_OUTPUT : | 209 | ((type == HID_OUTPUT_REPORT) ? HID_REPORT_TYPE_OUTPUT : |
203 | ((type == HID_FEATURE_REPORT) ? HID_REPORT_TYPE_FEATURE:0)); | 210 | ((type == HID_FEATURE_REPORT) ? HID_REPORT_TYPE_FEATURE : 0)); |
204 | uref.report_id = report->id; | 211 | uref.report_id = report->id; |
205 | uref.field_index = HID_FIELD_INDEX_NONE; | 212 | uref.field_index = HID_FIELD_INDEX_NONE; |
206 | 213 | ||
@@ -213,7 +220,9 @@ static int hiddev_fasync(int fd, struct file *file, int on) | |||
213 | { | 220 | { |
214 | int retval; | 221 | int retval; |
215 | struct hiddev_list *list = file->private_data; | 222 | struct hiddev_list *list = file->private_data; |
223 | |||
216 | retval = fasync_helper(fd, file, on, &list->fasync); | 224 | retval = fasync_helper(fd, file, on, &list->fasync); |
225 | |||
217 | return retval < 0 ? retval : 0; | 226 | return retval < 0 ? retval : 0; |
218 | } | 227 | } |
219 | 228 | ||
@@ -224,14 +233,9 @@ static int hiddev_fasync(int fd, struct file *file, int on) | |||
224 | static int hiddev_release(struct inode * inode, struct file * file) | 233 | static int hiddev_release(struct inode * inode, struct file * file) |
225 | { | 234 | { |
226 | struct hiddev_list *list = file->private_data; | 235 | struct hiddev_list *list = file->private_data; |
227 | struct hiddev_list **listptr; | ||
228 | 236 | ||
229 | listptr = &list->hiddev->list; | ||
230 | hiddev_fasync(-1, file, 0); | 237 | hiddev_fasync(-1, file, 0); |
231 | 238 | list_del(&list->node); | |
232 | while (*listptr && (*listptr != list)) | ||
233 | listptr = &((*listptr)->next); | ||
234 | *listptr = (*listptr)->next; | ||
235 | 239 | ||
236 | if (!--list->hiddev->open) { | 240 | if (!--list->hiddev->open) { |
237 | if (list->hiddev->exist) | 241 | if (list->hiddev->exist) |
@@ -248,7 +252,8 @@ static int hiddev_release(struct inode * inode, struct file * file) | |||
248 | /* | 252 | /* |
249 | * open file op | 253 | * open file op |
250 | */ | 254 | */ |
251 | static int hiddev_open(struct inode * inode, struct file * file) { | 255 | static int hiddev_open(struct inode *inode, struct file *file) |
256 | { | ||
252 | struct hiddev_list *list; | 257 | struct hiddev_list *list; |
253 | 258 | ||
254 | int i = iminor(inode) - HIDDEV_MINOR_BASE; | 259 | int i = iminor(inode) - HIDDEV_MINOR_BASE; |
@@ -260,9 +265,7 @@ static int hiddev_open(struct inode * inode, struct file * file) { | |||
260 | return -ENOMEM; | 265 | return -ENOMEM; |
261 | 266 | ||
262 | list->hiddev = hiddev_table[i]; | 267 | list->hiddev = hiddev_table[i]; |
263 | list->next = hiddev_table[i]->list; | 268 | list_add_tail(&list->node, &hiddev_table[i]->list); |
264 | hiddev_table[i]->list = list; | ||
265 | |||
266 | file->private_data = list; | 269 | file->private_data = list; |
267 | 270 | ||
268 | if (!list->hiddev->open++) | 271 | if (!list->hiddev->open++) |
@@ -362,6 +365,7 @@ static ssize_t hiddev_read(struct file * file, char __user * buffer, size_t coun | |||
362 | static unsigned int hiddev_poll(struct file *file, poll_table *wait) | 365 | static unsigned int hiddev_poll(struct file *file, poll_table *wait) |
363 | { | 366 | { |
364 | struct hiddev_list *list = file->private_data; | 367 | struct hiddev_list *list = file->private_data; |
368 | |||
365 | poll_wait(file, &list->hiddev->wait, wait); | 369 | poll_wait(file, &list->hiddev->wait, wait); |
366 | if (list->head != list->tail) | 370 | if (list->head != list->tail) |
367 | return POLLIN | POLLRDNORM; | 371 | return POLLIN | POLLRDNORM; |
@@ -382,7 +386,7 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd | |||
382 | struct hiddev_collection_info cinfo; | 386 | struct hiddev_collection_info cinfo; |
383 | struct hiddev_report_info rinfo; | 387 | struct hiddev_report_info rinfo; |
384 | struct hiddev_field_info finfo; | 388 | struct hiddev_field_info finfo; |
385 | struct hiddev_usage_ref_multi *uref_multi=NULL; | 389 | struct hiddev_usage_ref_multi *uref_multi = NULL; |
386 | struct hiddev_usage_ref *uref; | 390 | struct hiddev_usage_ref *uref; |
387 | struct hiddev_devinfo dinfo; | 391 | struct hiddev_devinfo dinfo; |
388 | struct hid_report *report; | 392 | struct hid_report *report; |
@@ -764,15 +768,15 @@ int hiddev_connect(struct hid_device *hid) | |||
764 | } | 768 | } |
765 | 769 | ||
766 | init_waitqueue_head(&hiddev->wait); | 770 | init_waitqueue_head(&hiddev->wait); |
767 | 771 | INIT_LIST_HEAD(&hiddev->list); | |
768 | hiddev_table[hid->intf->minor - HIDDEV_MINOR_BASE] = hiddev; | ||
769 | |||
770 | hiddev->hid = hid; | 772 | hiddev->hid = hid; |
771 | hiddev->exist = 1; | 773 | hiddev->exist = 1; |
772 | 774 | ||
773 | hid->minor = hid->intf->minor; | 775 | hid->minor = hid->intf->minor; |
774 | hid->hiddev = hiddev; | 776 | hid->hiddev = hiddev; |
775 | 777 | ||
778 | hiddev_table[hid->intf->minor - HIDDEV_MINOR_BASE] = hiddev; | ||
779 | |||
776 | return 0; | 780 | return 0; |
777 | } | 781 | } |
778 | 782 | ||
diff --git a/drivers/usb/misc/cypress_cy7c63.c b/drivers/usb/misc/cypress_cy7c63.c index e091d327bd9e..a4062a6adbb8 100644 --- a/drivers/usb/misc/cypress_cy7c63.c +++ b/drivers/usb/misc/cypress_cy7c63.c | |||
@@ -12,8 +12,13 @@ | |||
12 | * the single I/O ports of the device. | 12 | * the single I/O ports of the device. |
13 | * | 13 | * |
14 | * Supported vendors: AK Modul-Bus Computer GmbH | 14 | * Supported vendors: AK Modul-Bus Computer GmbH |
15 | * Supported devices: CY7C63001A-PC (to be continued...) | 15 | * (Firmware "Port-Chip") |
16 | * Supported functions: Read/Write Ports (to be continued...) | 16 | * |
17 | * Supported devices: CY7C63001A-PC | ||
18 | * CY7C63001C-PXC | ||
19 | * CY7C63001C-SXC | ||
20 | * | ||
21 | * Supported functions: Read/Write Ports | ||
17 | * | 22 | * |
18 | * | 23 | * |
19 | * This program is free software; you can redistribute it and/or | 24 | * This program is free software; you can redistribute it and/or |
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index 786e1dbe88ec..983e104dd452 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c | |||
@@ -1242,11 +1242,12 @@ done: | |||
1242 | static int ctrl_out (struct usbtest_dev *dev, | 1242 | static int ctrl_out (struct usbtest_dev *dev, |
1243 | unsigned count, unsigned length, unsigned vary) | 1243 | unsigned count, unsigned length, unsigned vary) |
1244 | { | 1244 | { |
1245 | unsigned i, j, len, retval; | 1245 | unsigned i, j, len; |
1246 | int retval; | ||
1246 | u8 *buf; | 1247 | u8 *buf; |
1247 | char *what = "?"; | 1248 | char *what = "?"; |
1248 | struct usb_device *udev; | 1249 | struct usb_device *udev; |
1249 | 1250 | ||
1250 | if (length < 1 || length > 0xffff || vary >= length) | 1251 | if (length < 1 || length > 0xffff || vary >= length) |
1251 | return -EINVAL; | 1252 | return -EINVAL; |
1252 | 1253 | ||
diff --git a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c index e5e6e4f3ef87..bd09232ce13c 100644 --- a/drivers/usb/net/rtl8150.c +++ b/drivers/usb/net/rtl8150.c | |||
@@ -175,6 +175,8 @@ static inline struct sk_buff *pull_skb(rtl8150_t *); | |||
175 | static void rtl8150_disconnect(struct usb_interface *intf); | 175 | static void rtl8150_disconnect(struct usb_interface *intf); |
176 | static int rtl8150_probe(struct usb_interface *intf, | 176 | static int rtl8150_probe(struct usb_interface *intf, |
177 | const struct usb_device_id *id); | 177 | const struct usb_device_id *id); |
178 | static int rtl8150_suspend(struct usb_interface *intf, pm_message_t message); | ||
179 | static int rtl8150_resume(struct usb_interface *intf); | ||
178 | 180 | ||
179 | static const char driver_name [] = "rtl8150"; | 181 | static const char driver_name [] = "rtl8150"; |
180 | 182 | ||
@@ -183,6 +185,8 @@ static struct usb_driver rtl8150_driver = { | |||
183 | .probe = rtl8150_probe, | 185 | .probe = rtl8150_probe, |
184 | .disconnect = rtl8150_disconnect, | 186 | .disconnect = rtl8150_disconnect, |
185 | .id_table = rtl8150_table, | 187 | .id_table = rtl8150_table, |
188 | .suspend = rtl8150_suspend, | ||
189 | .resume = rtl8150_resume | ||
186 | }; | 190 | }; |
187 | 191 | ||
188 | /* | 192 | /* |
@@ -238,9 +242,11 @@ static int async_set_registers(rtl8150_t * dev, u16 indx, u16 size) | |||
238 | usb_fill_control_urb(dev->ctrl_urb, dev->udev, | 242 | usb_fill_control_urb(dev->ctrl_urb, dev->udev, |
239 | usb_sndctrlpipe(dev->udev, 0), (char *) &dev->dr, | 243 | usb_sndctrlpipe(dev->udev, 0), (char *) &dev->dr, |
240 | &dev->rx_creg, size, ctrl_callback, dev); | 244 | &dev->rx_creg, size, ctrl_callback, dev); |
241 | if ((ret = usb_submit_urb(dev->ctrl_urb, GFP_ATOMIC))) | 245 | if ((ret = usb_submit_urb(dev->ctrl_urb, GFP_ATOMIC))) { |
246 | if (ret == -ENODEV) | ||
247 | netif_device_detach(dev->netdev); | ||
242 | err("control request submission failed: %d", ret); | 248 | err("control request submission failed: %d", ret); |
243 | else | 249 | } else |
244 | set_bit(RX_REG_SET, &dev->flags); | 250 | set_bit(RX_REG_SET, &dev->flags); |
245 | 251 | ||
246 | return ret; | 252 | return ret; |
@@ -416,6 +422,7 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs) | |||
416 | struct sk_buff *skb; | 422 | struct sk_buff *skb; |
417 | struct net_device *netdev; | 423 | struct net_device *netdev; |
418 | u16 rx_stat; | 424 | u16 rx_stat; |
425 | int status; | ||
419 | 426 | ||
420 | dev = urb->context; | 427 | dev = urb->context; |
421 | if (!dev) | 428 | if (!dev) |
@@ -465,7 +472,10 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs) | |||
465 | goon: | 472 | goon: |
466 | usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), | 473 | usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), |
467 | dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); | 474 | dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); |
468 | if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) { | 475 | status = usb_submit_urb(dev->rx_urb, GFP_ATOMIC); |
476 | if (status == -ENODEV) | ||
477 | netif_device_detach(dev->netdev); | ||
478 | else if (status) { | ||
469 | set_bit(RX_URB_FAIL, &dev->flags); | 479 | set_bit(RX_URB_FAIL, &dev->flags); |
470 | goto resched; | 480 | goto resched; |
471 | } else { | 481 | } else { |
@@ -481,6 +491,7 @@ static void rx_fixup(unsigned long data) | |||
481 | { | 491 | { |
482 | rtl8150_t *dev; | 492 | rtl8150_t *dev; |
483 | struct sk_buff *skb; | 493 | struct sk_buff *skb; |
494 | int status; | ||
484 | 495 | ||
485 | dev = (rtl8150_t *)data; | 496 | dev = (rtl8150_t *)data; |
486 | 497 | ||
@@ -499,10 +510,13 @@ static void rx_fixup(unsigned long data) | |||
499 | usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), | 510 | usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), |
500 | dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); | 511 | dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); |
501 | try_again: | 512 | try_again: |
502 | if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) { | 513 | status = usb_submit_urb(dev->rx_urb, GFP_ATOMIC); |
514 | if (status == -ENODEV) { | ||
515 | netif_device_detach(dev->netdev); | ||
516 | } else if (status) { | ||
503 | set_bit(RX_URB_FAIL, &dev->flags); | 517 | set_bit(RX_URB_FAIL, &dev->flags); |
504 | goto tlsched; | 518 | goto tlsched; |
505 | } else { | 519 | } else { |
506 | clear_bit(RX_URB_FAIL, &dev->flags); | 520 | clear_bit(RX_URB_FAIL, &dev->flags); |
507 | } | 521 | } |
508 | 522 | ||
@@ -574,12 +588,43 @@ static void intr_callback(struct urb *urb, struct pt_regs *regs) | |||
574 | 588 | ||
575 | resubmit: | 589 | resubmit: |
576 | status = usb_submit_urb (urb, SLAB_ATOMIC); | 590 | status = usb_submit_urb (urb, SLAB_ATOMIC); |
577 | if (status) | 591 | if (status == -ENODEV) |
592 | netif_device_detach(dev->netdev); | ||
593 | else if (status) | ||
578 | err ("can't resubmit intr, %s-%s/input0, status %d", | 594 | err ("can't resubmit intr, %s-%s/input0, status %d", |
579 | dev->udev->bus->bus_name, | 595 | dev->udev->bus->bus_name, |
580 | dev->udev->devpath, status); | 596 | dev->udev->devpath, status); |
581 | } | 597 | } |
582 | 598 | ||
599 | static int rtl8150_suspend(struct usb_interface *intf, pm_message_t message) | ||
600 | { | ||
601 | rtl8150_t *dev = usb_get_intfdata(intf); | ||
602 | |||
603 | netif_device_detach(dev->netdev); | ||
604 | |||
605 | if (netif_running(dev->netdev)) { | ||
606 | usb_kill_urb(dev->rx_urb); | ||
607 | usb_kill_urb(dev->intr_urb); | ||
608 | } | ||
609 | return 0; | ||
610 | } | ||
611 | |||
612 | static int rtl8150_resume(struct usb_interface *intf) | ||
613 | { | ||
614 | rtl8150_t *dev = usb_get_intfdata(intf); | ||
615 | |||
616 | netif_device_attach(dev->netdev); | ||
617 | if (netif_running(dev->netdev)) { | ||
618 | dev->rx_urb->status = 0; | ||
619 | dev->rx_urb->actual_length = 0; | ||
620 | read_bulk_callback(dev->rx_urb, NULL); | ||
621 | |||
622 | dev->intr_urb->status = 0; | ||
623 | dev->intr_urb->actual_length = 0; | ||
624 | intr_callback(dev->intr_urb, NULL); | ||
625 | } | ||
626 | return 0; | ||
627 | } | ||
583 | 628 | ||
584 | /* | 629 | /* |
585 | ** | 630 | ** |
@@ -690,9 +735,14 @@ static int rtl8150_start_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
690 | usb_fill_bulk_urb(dev->tx_urb, dev->udev, usb_sndbulkpipe(dev->udev, 2), | 735 | usb_fill_bulk_urb(dev->tx_urb, dev->udev, usb_sndbulkpipe(dev->udev, 2), |
691 | skb->data, count, write_bulk_callback, dev); | 736 | skb->data, count, write_bulk_callback, dev); |
692 | if ((res = usb_submit_urb(dev->tx_urb, GFP_ATOMIC))) { | 737 | if ((res = usb_submit_urb(dev->tx_urb, GFP_ATOMIC))) { |
693 | warn("failed tx_urb %d\n", res); | 738 | /* Can we get/handle EPIPE here? */ |
694 | dev->stats.tx_errors++; | 739 | if (res == -ENODEV) |
695 | netif_start_queue(netdev); | 740 | netif_device_detach(dev->netdev); |
741 | else { | ||
742 | warn("failed tx_urb %d\n", res); | ||
743 | dev->stats.tx_errors++; | ||
744 | netif_start_queue(netdev); | ||
745 | } | ||
696 | } else { | 746 | } else { |
697 | dev->stats.tx_packets++; | 747 | dev->stats.tx_packets++; |
698 | dev->stats.tx_bytes += skb->len; | 748 | dev->stats.tx_bytes += skb->len; |
@@ -729,16 +779,25 @@ static int rtl8150_open(struct net_device *netdev) | |||
729 | 779 | ||
730 | usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), | 780 | usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), |
731 | dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); | 781 | dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); |
732 | if ((res = usb_submit_urb(dev->rx_urb, GFP_KERNEL))) | 782 | if ((res = usb_submit_urb(dev->rx_urb, GFP_KERNEL))) { |
783 | if (res == -ENODEV) | ||
784 | netif_device_detach(dev->netdev); | ||
733 | warn("%s: rx_urb submit failed: %d", __FUNCTION__, res); | 785 | warn("%s: rx_urb submit failed: %d", __FUNCTION__, res); |
786 | return res; | ||
787 | } | ||
734 | usb_fill_int_urb(dev->intr_urb, dev->udev, usb_rcvintpipe(dev->udev, 3), | 788 | usb_fill_int_urb(dev->intr_urb, dev->udev, usb_rcvintpipe(dev->udev, 3), |
735 | dev->intr_buff, INTBUFSIZE, intr_callback, | 789 | dev->intr_buff, INTBUFSIZE, intr_callback, |
736 | dev, dev->intr_interval); | 790 | dev, dev->intr_interval); |
737 | if ((res = usb_submit_urb(dev->intr_urb, GFP_KERNEL))) | 791 | if ((res = usb_submit_urb(dev->intr_urb, GFP_KERNEL))) { |
792 | if (res == -ENODEV) | ||
793 | netif_device_detach(dev->netdev); | ||
738 | warn("%s: intr_urb submit failed: %d", __FUNCTION__, res); | 794 | warn("%s: intr_urb submit failed: %d", __FUNCTION__, res); |
739 | netif_start_queue(netdev); | 795 | usb_kill_urb(dev->rx_urb); |
796 | return res; | ||
797 | } | ||
740 | enable_net_traffic(dev); | 798 | enable_net_traffic(dev); |
741 | set_carrier(netdev); | 799 | set_carrier(netdev); |
800 | netif_start_queue(netdev); | ||
742 | 801 | ||
743 | return res; | 802 | return res; |
744 | } | 803 | } |
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index ac33bd47cfce..f5b9438c94f0 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig | |||
@@ -62,15 +62,6 @@ config USB_SERIAL_AIRPRIME | |||
62 | To compile this driver as a module, choose M here: the | 62 | To compile this driver as a module, choose M here: the |
63 | module will be called airprime. | 63 | module will be called airprime. |
64 | 64 | ||
65 | config USB_SERIAL_ANYDATA | ||
66 | tristate "USB AnyData CDMA Wireless Driver" | ||
67 | depends on USB_SERIAL | ||
68 | help | ||
69 | Say Y here if you want to use a AnyData CDMA device. | ||
70 | |||
71 | To compile this driver as a module, choose M here: the | ||
72 | module will be called anydata. | ||
73 | |||
74 | config USB_SERIAL_ARK3116 | 65 | config USB_SERIAL_ARK3116 |
75 | tristate "USB ARK Micro 3116 USB Serial Driver (EXPERIMENTAL)" | 66 | tristate "USB ARK Micro 3116 USB Serial Driver (EXPERIMENTAL)" |
76 | depends on USB_SERIAL && EXPERIMENTAL | 67 | depends on USB_SERIAL && EXPERIMENTAL |
@@ -502,15 +493,18 @@ config USB_SERIAL_XIRCOM | |||
502 | module will be called keyspan_pda. | 493 | module will be called keyspan_pda. |
503 | 494 | ||
504 | config USB_SERIAL_OPTION | 495 | config USB_SERIAL_OPTION |
505 | tristate "USB driver for GSM modems" | 496 | tristate "USB driver for GSM and CDMA modems" |
506 | depends on USB_SERIAL | 497 | depends on USB_SERIAL |
507 | help | 498 | help |
508 | Say Y here if you have an "Option" GSM PCMCIA card | 499 | Say Y here if you have a GSM or CDMA modem that's connected to USB. |
509 | (or an OEM version: branded Huawei, Audiovox, or Novatel). | 500 | |
501 | This driver also supports several PCMCIA cards which have a | ||
502 | built-in OHCI-USB adapter and an internally-connected GSM modem. | ||
503 | The USB bus on these cards is not accessible externally. | ||
510 | 504 | ||
511 | These cards feature a built-in OHCI-USB adapter and an | 505 | Supported devices include (some of?) those made by: |
512 | internally-connected GSM modem. The USB bus is not | 506 | Option, Huawei, Audiovox, Sierra Wireless, Novatel Wireless, or |
513 | accessible externally. | 507 | Anydata. |
514 | 508 | ||
515 | To compile this driver as a module, choose M here: the | 509 | To compile this driver as a module, choose M here: the |
516 | module will be called option. | 510 | module will be called option. |
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile index 35d4acc7f1d3..8efed2ce1ba3 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile | |||
@@ -12,7 +12,6 @@ usbserial-obj-$(CONFIG_USB_EZUSB) += ezusb.o | |||
12 | usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y) | 12 | usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y) |
13 | 13 | ||
14 | obj-$(CONFIG_USB_SERIAL_AIRPRIME) += airprime.o | 14 | obj-$(CONFIG_USB_SERIAL_AIRPRIME) += airprime.o |
15 | obj-$(CONFIG_USB_SERIAL_ANYDATA) += anydata.o | ||
16 | obj-$(CONFIG_USB_SERIAL_ARK3116) += ark3116.o | 15 | obj-$(CONFIG_USB_SERIAL_ARK3116) += ark3116.o |
17 | obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o | 16 | obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o |
18 | obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o | 17 | obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o |
diff --git a/drivers/usb/serial/anydata.c b/drivers/usb/serial/anydata.c deleted file mode 100644 index 01843ef8c11e..000000000000 --- a/drivers/usb/serial/anydata.c +++ /dev/null | |||
@@ -1,123 +0,0 @@ | |||
1 | /* | ||
2 | * AnyData CDMA Serial USB driver | ||
3 | * | ||
4 | * Copyright (C) 2005 Greg Kroah-Hartman <gregkh@suse.de> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License version | ||
8 | * 2 as published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/tty.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <linux/usb.h> | ||
16 | #include <linux/usb/serial.h> | ||
17 | |||
18 | static struct usb_device_id id_table [] = { | ||
19 | { USB_DEVICE(0x16d5, 0x6501) }, /* AirData CDMA device */ | ||
20 | { }, | ||
21 | }; | ||
22 | MODULE_DEVICE_TABLE(usb, id_table); | ||
23 | |||
24 | /* if overridden by the user, then use their value for the size of the | ||
25 | * read and write urbs */ | ||
26 | static int buffer_size; | ||
27 | static int debug; | ||
28 | |||
29 | static struct usb_driver anydata_driver = { | ||
30 | .name = "anydata", | ||
31 | .probe = usb_serial_probe, | ||
32 | .disconnect = usb_serial_disconnect, | ||
33 | .id_table = id_table, | ||
34 | .no_dynamic_id = 1, | ||
35 | }; | ||
36 | |||
37 | static int anydata_open(struct usb_serial_port *port, struct file *filp) | ||
38 | { | ||
39 | char *buffer; | ||
40 | int result = 0; | ||
41 | |||
42 | dbg("%s - port %d", __FUNCTION__, port->number); | ||
43 | |||
44 | if (buffer_size) { | ||
45 | /* override the default buffer sizes */ | ||
46 | buffer = kmalloc(buffer_size, GFP_KERNEL); | ||
47 | if (!buffer) { | ||
48 | dev_err(&port->dev, "%s - out of memory.\n", | ||
49 | __FUNCTION__); | ||
50 | return -ENOMEM; | ||
51 | } | ||
52 | kfree (port->read_urb->transfer_buffer); | ||
53 | port->read_urb->transfer_buffer = buffer; | ||
54 | port->read_urb->transfer_buffer_length = buffer_size; | ||
55 | |||
56 | buffer = kmalloc(buffer_size, GFP_KERNEL); | ||
57 | if (!buffer) { | ||
58 | dev_err(&port->dev, "%s - out of memory.\n", | ||
59 | __FUNCTION__); | ||
60 | return -ENOMEM; | ||
61 | } | ||
62 | kfree (port->write_urb->transfer_buffer); | ||
63 | port->write_urb->transfer_buffer = buffer; | ||
64 | port->write_urb->transfer_buffer_length = buffer_size; | ||
65 | port->bulk_out_size = buffer_size; | ||
66 | } | ||
67 | |||
68 | /* Start reading from the device */ | ||
69 | usb_fill_bulk_urb(port->read_urb, port->serial->dev, | ||
70 | usb_rcvbulkpipe(port->serial->dev, | ||
71 | port->bulk_in_endpointAddress), | ||
72 | port->read_urb->transfer_buffer, | ||
73 | port->read_urb->transfer_buffer_length, | ||
74 | usb_serial_generic_read_bulk_callback, port); | ||
75 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); | ||
76 | if (result) | ||
77 | dev_err(&port->dev, | ||
78 | "%s - failed submitting read urb, error %d\n", | ||
79 | __FUNCTION__, result); | ||
80 | |||
81 | return result; | ||
82 | } | ||
83 | |||
84 | static struct usb_serial_driver anydata_device = { | ||
85 | .driver = { | ||
86 | .owner = THIS_MODULE, | ||
87 | .name = "anydata", | ||
88 | }, | ||
89 | .id_table = id_table, | ||
90 | .num_interrupt_in = NUM_DONT_CARE, | ||
91 | .num_bulk_in = NUM_DONT_CARE, | ||
92 | .num_bulk_out = NUM_DONT_CARE, | ||
93 | .num_ports = 1, | ||
94 | .open = anydata_open, | ||
95 | }; | ||
96 | |||
97 | static int __init anydata_init(void) | ||
98 | { | ||
99 | int retval; | ||
100 | |||
101 | retval = usb_serial_register(&anydata_device); | ||
102 | if (retval) | ||
103 | return retval; | ||
104 | retval = usb_register(&anydata_driver); | ||
105 | if (retval) | ||
106 | usb_serial_deregister(&anydata_device); | ||
107 | return retval; | ||
108 | } | ||
109 | |||
110 | static void __exit anydata_exit(void) | ||
111 | { | ||
112 | usb_deregister(&anydata_driver); | ||
113 | usb_serial_deregister(&anydata_device); | ||
114 | } | ||
115 | |||
116 | module_init(anydata_init); | ||
117 | module_exit(anydata_exit); | ||
118 | MODULE_LICENSE("GPL"); | ||
119 | |||
120 | module_param(debug, bool, S_IRUGO | S_IWUSR); | ||
121 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | ||
122 | module_param(buffer_size, int, 0); | ||
123 | MODULE_PARM_DESC(buffer_size, "Size of the transfer buffers"); | ||
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index b458aedc5fb6..15945e806f03 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -306,6 +306,8 @@ static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = { | |||
306 | 306 | ||
307 | 307 | ||
308 | static struct usb_device_id id_table_combined [] = { | 308 | static struct usb_device_id id_table_combined [] = { |
309 | { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) }, | ||
310 | { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) }, | ||
309 | { USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) }, | 311 | { USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) }, |
310 | { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) }, | 312 | { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) }, |
311 | { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) }, | 313 | { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) }, |
@@ -337,6 +339,7 @@ static struct usb_device_id id_table_combined [] = { | |||
337 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, | 339 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, |
338 | { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) }, | 340 | { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) }, |
339 | { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) }, | 341 | { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) }, |
342 | { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) }, | ||
340 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) }, | 343 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) }, |
341 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) }, | 344 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) }, |
342 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) }, | 345 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) }, |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index 04ef90fcb876..8888cd80a491 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
@@ -32,6 +32,12 @@ | |||
32 | #define FTDI_NF_RIC_PID 0x0001 /* Product Id */ | 32 | #define FTDI_NF_RIC_PID 0x0001 /* Product Id */ |
33 | 33 | ||
34 | 34 | ||
35 | /* www.canusb.com Lawicel CANUSB device */ | ||
36 | #define FTDI_CANUSB_PID 0xFFA8 /* Product Id */ | ||
37 | |||
38 | /* AlphaMicro Components AMC-232USB01 device */ | ||
39 | #define FTDI_AMC232_PID 0xFF00 /* Product Id */ | ||
40 | |||
35 | /* ACT Solutions HomePro ZWave interface (http://www.act-solutions.com/HomePro.htm) */ | 41 | /* ACT Solutions HomePro ZWave interface (http://www.act-solutions.com/HomePro.htm) */ |
36 | #define FTDI_ACTZWAVE_PID 0xF2D0 | 42 | #define FTDI_ACTZWAVE_PID 0xF2D0 |
37 | 43 | ||
@@ -182,6 +188,10 @@ | |||
182 | /* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */ | 188 | /* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */ |
183 | #define FTDI_USB_UIRT_PID 0xF850 /* Product Id */ | 189 | #define FTDI_USB_UIRT_PID 0xF850 /* Product Id */ |
184 | 190 | ||
191 | /* TNC-X USB-to-packet-radio adapter, versions prior to 3.0 (DLP module) */ | ||
192 | |||
193 | #define FTDI_TNC_X_PID 0xEBE0 | ||
194 | |||
185 | /* | 195 | /* |
186 | * ELV USB devices submitted by Christian Abt of ELV (www.elv.de). | 196 | * ELV USB devices submitted by Christian Abt of ELV (www.elv.de). |
187 | * All of these devices use FTDI's vendor ID (0x0403). | 197 | * All of these devices use FTDI's vendor ID (0x0403). |
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index 59c5d999009a..9840bade79f9 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c | |||
@@ -250,6 +250,9 @@ static struct usb_device_id ipaq_id_table [] = { | |||
250 | { USB_DEVICE(0x04C5, 0x1058) }, /* FUJITSU USB Sync */ | 250 | { USB_DEVICE(0x04C5, 0x1058) }, /* FUJITSU USB Sync */ |
251 | { USB_DEVICE(0x04C5, 0x1079) }, /* FUJITSU USB Sync */ | 251 | { USB_DEVICE(0x04C5, 0x1079) }, /* FUJITSU USB Sync */ |
252 | { USB_DEVICE(0x04DA, 0x2500) }, /* Panasonic USB Sync */ | 252 | { USB_DEVICE(0x04DA, 0x2500) }, /* Panasonic USB Sync */ |
253 | { USB_DEVICE(0x04DD, 0x9102) }, /* SHARP WS003SH USB Modem */ | ||
254 | { USB_DEVICE(0x04DD, 0x9121) }, /* SHARP WS004SH USB Modem */ | ||
255 | { USB_DEVICE(0x04DD, 0x9123) }, /* SHARP WS007SH USB Modem */ | ||
253 | { USB_DEVICE(0x04E8, 0x5F00) }, /* Samsung NEXiO USB Sync */ | 256 | { USB_DEVICE(0x04E8, 0x5F00) }, /* Samsung NEXiO USB Sync */ |
254 | { USB_DEVICE(0x04E8, 0x5F01) }, /* Samsung NEXiO USB Sync */ | 257 | { USB_DEVICE(0x04E8, 0x5F01) }, /* Samsung NEXiO USB Sync */ |
255 | { USB_DEVICE(0x04E8, 0x5F02) }, /* Samsung NEXiO USB Sync */ | 258 | { USB_DEVICE(0x04E8, 0x5F02) }, /* Samsung NEXiO USB Sync */ |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index f0530c1d7b7a..c856e6f40e22 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -9,40 +9,14 @@ | |||
9 | 9 | ||
10 | Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org> | 10 | Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org> |
11 | 11 | ||
12 | History: | 12 | History: see the git log. |
13 | |||
14 | 2005-05-19 v0.1 Initial version, based on incomplete docs | ||
15 | and analysis of misbehavior with the standard driver | ||
16 | 2005-05-20 v0.2 Extended the input buffer to avoid losing | ||
17 | random 64-byte chunks of data | ||
18 | 2005-05-21 v0.3 implemented chars_in_buffer() | ||
19 | turned on low_latency | ||
20 | simplified the code somewhat | ||
21 | 2005-05-24 v0.4 option_write() sometimes deadlocked under heavy load | ||
22 | removed some dead code | ||
23 | added sponsor notice | ||
24 | coding style clean-up | ||
25 | 2005-06-20 v0.4.1 add missing braces :-/ | ||
26 | killed end-of-line whitespace | ||
27 | 2005-07-15 v0.4.2 rename WLAN product to FUSION, add FUSION2 | ||
28 | 2005-09-10 v0.4.3 added HUAWEI E600 card and Audiovox AirCard | ||
29 | 2005-09-20 v0.4.4 increased recv buffer size: the card sometimes | ||
30 | wants to send >2000 bytes. | ||
31 | 2006-04-10 v0.5 fixed two array overrun errors :-/ | ||
32 | 2006-04-21 v0.5.1 added support for Sierra Wireless MC8755 | ||
33 | 2006-05-15 v0.6 re-enable multi-port support | ||
34 | 2006-06-01 v0.6.1 add COBRA | ||
35 | 2006-06-01 v0.6.2 add backwards-compatibility stuff | ||
36 | 2006-06-01 v0.6.3 add Novatel Wireless | ||
37 | 2006-06-01 v0.7 Option => GSM | ||
38 | 2006-06-01 v0.7.1 add COBRA2 | ||
39 | 13 | ||
40 | Work sponsored by: Sigos GmbH, Germany <info@sigos.de> | 14 | Work sponsored by: Sigos GmbH, Germany <info@sigos.de> |
41 | 15 | ||
42 | This driver exists because the "normal" serial driver doesn't work too well | 16 | This driver exists because the "normal" serial driver doesn't work too well |
43 | with GSM modems. Issues: | 17 | with GSM modems. Issues: |
44 | - data loss -- one single Receive URB is not nearly enough | 18 | - data loss -- one single Receive URB is not nearly enough |
45 | - nonstandard flow (Option devices) and multiplex (Sierra) control | 19 | - nonstandard flow (Option devices) control |
46 | - controlling the baud rate doesn't make sense | 20 | - controlling the baud rate doesn't make sense |
47 | 21 | ||
48 | This driver is named "option" because the most common device it's | 22 | This driver is named "option" because the most common device it's |
@@ -96,8 +70,8 @@ static int option_send_setup(struct usb_serial_port *port); | |||
96 | #define OPTION_VENDOR_ID 0x0AF0 | 70 | #define OPTION_VENDOR_ID 0x0AF0 |
97 | #define HUAWEI_VENDOR_ID 0x12D1 | 71 | #define HUAWEI_VENDOR_ID 0x12D1 |
98 | #define AUDIOVOX_VENDOR_ID 0x0F3D | 72 | #define AUDIOVOX_VENDOR_ID 0x0F3D |
99 | #define SIERRAWIRELESS_VENDOR_ID 0x1199 | ||
100 | #define NOVATELWIRELESS_VENDOR_ID 0x1410 | 73 | #define NOVATELWIRELESS_VENDOR_ID 0x1410 |
74 | #define ANYDATA_VENDOR_ID 0x16d5 | ||
101 | 75 | ||
102 | #define OPTION_PRODUCT_OLD 0x5000 | 76 | #define OPTION_PRODUCT_OLD 0x5000 |
103 | #define OPTION_PRODUCT_FUSION 0x6000 | 77 | #define OPTION_PRODUCT_FUSION 0x6000 |
@@ -106,8 +80,8 @@ static int option_send_setup(struct usb_serial_port *port); | |||
106 | #define OPTION_PRODUCT_COBRA2 0x6600 | 80 | #define OPTION_PRODUCT_COBRA2 0x6600 |
107 | #define HUAWEI_PRODUCT_E600 0x1001 | 81 | #define HUAWEI_PRODUCT_E600 0x1001 |
108 | #define AUDIOVOX_PRODUCT_AIRCARD 0x0112 | 82 | #define AUDIOVOX_PRODUCT_AIRCARD 0x0112 |
109 | #define SIERRAWIRELESS_PRODUCT_MC8755 0x6802 | ||
110 | #define NOVATELWIRELESS_PRODUCT_U740 0x1400 | 83 | #define NOVATELWIRELESS_PRODUCT_U740 0x1400 |
84 | #define ANYDATA_PRODUCT_ID 0x6501 | ||
111 | 85 | ||
112 | static struct usb_device_id option_ids[] = { | 86 | static struct usb_device_id option_ids[] = { |
113 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) }, | 87 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) }, |
@@ -117,8 +91,8 @@ static struct usb_device_id option_ids[] = { | |||
117 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, | 91 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, |
118 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, | 92 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, |
119 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, | 93 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, |
120 | { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) }, | ||
121 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, | 94 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, |
95 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) }, | ||
122 | { } /* Terminating entry */ | 96 | { } /* Terminating entry */ |
123 | }; | 97 | }; |
124 | 98 | ||
@@ -131,10 +105,7 @@ static struct usb_device_id option_ids1[] = { | |||
131 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, | 105 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, |
132 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, | 106 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, |
133 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, | 107 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, |
134 | { } /* Terminating entry */ | 108 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) }, |
135 | }; | ||
136 | static struct usb_device_id option_ids3[] = { | ||
137 | { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) }, | ||
138 | { } /* Terminating entry */ | 109 | { } /* Terminating entry */ |
139 | }; | 110 | }; |
140 | 111 | ||
@@ -151,37 +122,11 @@ static struct usb_driver option_driver = { | |||
151 | /* The card has three separate interfaces, which the serial driver | 122 | /* The card has three separate interfaces, which the serial driver |
152 | * recognizes separately, thus num_port=1. | 123 | * recognizes separately, thus num_port=1. |
153 | */ | 124 | */ |
154 | static struct usb_serial_driver option_3port_device = { | ||
155 | .driver = { | ||
156 | .owner = THIS_MODULE, | ||
157 | .name = "option", | ||
158 | }, | ||
159 | .description = "GSM modem (3-port)", | ||
160 | .id_table = option_ids3, | ||
161 | .num_interrupt_in = NUM_DONT_CARE, | ||
162 | .num_bulk_in = NUM_DONT_CARE, | ||
163 | .num_bulk_out = NUM_DONT_CARE, | ||
164 | .num_ports = 3, | ||
165 | .open = option_open, | ||
166 | .close = option_close, | ||
167 | .write = option_write, | ||
168 | .write_room = option_write_room, | ||
169 | .chars_in_buffer = option_chars_in_buffer, | ||
170 | .throttle = option_rx_throttle, | ||
171 | .unthrottle = option_rx_unthrottle, | ||
172 | .set_termios = option_set_termios, | ||
173 | .break_ctl = option_break_ctl, | ||
174 | .tiocmget = option_tiocmget, | ||
175 | .tiocmset = option_tiocmset, | ||
176 | .attach = option_startup, | ||
177 | .shutdown = option_shutdown, | ||
178 | .read_int_callback = option_instat_callback, | ||
179 | }; | ||
180 | 125 | ||
181 | static struct usb_serial_driver option_1port_device = { | 126 | static struct usb_serial_driver option_1port_device = { |
182 | .driver = { | 127 | .driver = { |
183 | .owner = THIS_MODULE, | 128 | .owner = THIS_MODULE, |
184 | .name = "option", | 129 | .name = "option1", |
185 | }, | 130 | }, |
186 | .description = "GSM modem (1-port)", | 131 | .description = "GSM modem (1-port)", |
187 | .id_table = option_ids1, | 132 | .id_table = option_ids1, |
@@ -245,9 +190,6 @@ static int __init option_init(void) | |||
245 | retval = usb_serial_register(&option_1port_device); | 190 | retval = usb_serial_register(&option_1port_device); |
246 | if (retval) | 191 | if (retval) |
247 | goto failed_1port_device_register; | 192 | goto failed_1port_device_register; |
248 | retval = usb_serial_register(&option_3port_device); | ||
249 | if (retval) | ||
250 | goto failed_3port_device_register; | ||
251 | retval = usb_register(&option_driver); | 193 | retval = usb_register(&option_driver); |
252 | if (retval) | 194 | if (retval) |
253 | goto failed_driver_register; | 195 | goto failed_driver_register; |
@@ -257,8 +199,6 @@ static int __init option_init(void) | |||
257 | return 0; | 199 | return 0; |
258 | 200 | ||
259 | failed_driver_register: | 201 | failed_driver_register: |
260 | usb_serial_deregister (&option_3port_device); | ||
261 | failed_3port_device_register: | ||
262 | usb_serial_deregister (&option_1port_device); | 202 | usb_serial_deregister (&option_1port_device); |
263 | failed_1port_device_register: | 203 | failed_1port_device_register: |
264 | return retval; | 204 | return retval; |
@@ -267,7 +207,6 @@ failed_1port_device_register: | |||
267 | static void __exit option_exit(void) | 207 | static void __exit option_exit(void) |
268 | { | 208 | { |
269 | usb_deregister (&option_driver); | 209 | usb_deregister (&option_driver); |
270 | usb_serial_deregister (&option_3port_device); | ||
271 | usb_serial_deregister (&option_1port_device); | 210 | usb_serial_deregister (&option_1port_device); |
272 | } | 211 | } |
273 | 212 | ||
@@ -656,7 +595,6 @@ static void option_setup_urbs(struct usb_serial *serial) | |||
656 | 595 | ||
657 | dbg("%s", __FUNCTION__); | 596 | dbg("%s", __FUNCTION__); |
658 | 597 | ||
659 | |||
660 | for (i = 0; i < serial->num_ports; i++) { | 598 | for (i = 0; i < serial->num_ports; i++) { |
661 | port = serial->port[i]; | 599 | port = serial->port[i]; |
662 | portdata = usb_get_serial_port_data(port); | 600 | portdata = usb_get_serial_port_data(port); |
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 259db31b65c1..efbbc0adb89a 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
@@ -81,6 +81,7 @@ static struct usb_device_id id_table [] = { | |||
81 | { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) }, | 81 | { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) }, |
82 | { USB_DEVICE(OTI_VENDOR_ID, OTI_PRODUCT_ID) }, | 82 | { USB_DEVICE(OTI_VENDOR_ID, OTI_PRODUCT_ID) }, |
83 | { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) }, | 83 | { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) }, |
84 | { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) }, | ||
84 | { } /* Terminating entry */ | 85 | { } /* Terminating entry */ |
85 | }; | 86 | }; |
86 | 87 | ||
diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h index d9c1e6e0b4b3..a692ac66ca6c 100644 --- a/drivers/usb/serial/pl2303.h +++ b/drivers/usb/serial/pl2303.h | |||
@@ -89,3 +89,7 @@ | |||
89 | /* DATAPILOT Universal-2 Phone Cable */ | 89 | /* DATAPILOT Universal-2 Phone Cable */ |
90 | #define DATAPILOT_U2_VENDOR_ID 0x0731 | 90 | #define DATAPILOT_U2_VENDOR_ID 0x0731 |
91 | #define DATAPILOT_U2_PRODUCT_ID 0x2003 | 91 | #define DATAPILOT_U2_PRODUCT_ID 0x2003 |
92 | |||
93 | /* Belkin "F5U257" Serial Adapter */ | ||
94 | #define BELKIN_VENDOR_ID 0x050d | ||
95 | #define BELKIN_PRODUCT_ID 0x0257 | ||
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index a5ca449f6e64..fd158e063c06 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -145,6 +145,13 @@ UNUSUAL_DEV( 0x0420, 0x0001, 0x0100, 0x0100, | |||
145 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 145 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
146 | US_FL_IGNORE_RESIDUE ), | 146 | US_FL_IGNORE_RESIDUE ), |
147 | 147 | ||
148 | /* Reported by Mario Rettig <mariorettig@web.de> */ | ||
149 | UNUSUAL_DEV( 0x0421, 0x042e, 0x0100, 0x0100, | ||
150 | "Nokia", | ||
151 | "Nokia 3250", | ||
152 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
153 | US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), | ||
154 | |||
148 | /* Reported by Sumedha Swamy <sumedhaswamy@gmail.com> and | 155 | /* Reported by Sumedha Swamy <sumedhaswamy@gmail.com> and |
149 | * Einar Th. Einarsson <einarthered@gmail.com> */ | 156 | * Einar Th. Einarsson <einarthered@gmail.com> */ |
150 | UNUSUAL_DEV( 0x0421, 0x0444, 0x0100, 0x0100, | 157 | UNUSUAL_DEV( 0x0421, 0x0444, 0x0100, 0x0100, |
@@ -627,18 +634,6 @@ UNUSUAL_DEV( 0x0595, 0x4343, 0x0000, 0x2210, | |||
627 | "Digital Camera EX-20 DSC", | 634 | "Digital Camera EX-20 DSC", |
628 | US_SC_8070, US_PR_DEVICE, NULL, 0 ), | 635 | US_SC_8070, US_PR_DEVICE, NULL, 0 ), |
629 | 636 | ||
630 | /* The entry was here before I took over, and had US_SC_RBC. It turns | ||
631 | * out that isn't needed. Additionally, Torsten Eriksson | ||
632 | * <Torsten.Eriksson@bergianska.se> is able to use his device fine | ||
633 | * without this entry at all - but I don't suspect that will be true | ||
634 | * for all users (the protocol is likely needed), so is staying at | ||
635 | * this time. - Phil Dibowitz <phil@ipom.com> | ||
636 | */ | ||
637 | UNUSUAL_DEV( 0x059f, 0xa601, 0x0200, 0x0200, | ||
638 | "LaCie", | ||
639 | "USB Hard Disk", | ||
640 | US_SC_DEVICE, US_PR_CB, NULL, 0 ), | ||
641 | |||
642 | /* Submitted by Joel Bourquard <numlock@freesurf.ch> | 637 | /* Submitted by Joel Bourquard <numlock@freesurf.ch> |
643 | * Some versions of this device need the SubClass and Protocol overrides | 638 | * Some versions of this device need the SubClass and Protocol overrides |
644 | * while others don't. | 639 | * while others don't. |
@@ -1106,7 +1101,15 @@ UNUSUAL_DEV( 0x0a17, 0x006, 0x0000, 0xffff, | |||
1106 | "Optio S/S4", | 1101 | "Optio S/S4", |
1107 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1102 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1108 | US_FL_FIX_INQUIRY ), | 1103 | US_FL_FIX_INQUIRY ), |
1109 | 1104 | ||
1105 | /* This is a virtual windows driver CD, which the zd1211rw driver automatically | ||
1106 | * converts into a WLAN device. */ | ||
1107 | UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101, | ||
1108 | "ZyXEL", | ||
1109 | "G-220F USB-WLAN Install", | ||
1110 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1111 | US_FL_IGNORE_DEVICE ), | ||
1112 | |||
1110 | #ifdef CONFIG_USB_STORAGE_ISD200 | 1113 | #ifdef CONFIG_USB_STORAGE_ISD200 |
1111 | UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110, | 1114 | UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110, |
1112 | "ATI", | 1115 | "ATI", |
@@ -1237,6 +1240,16 @@ UNUSUAL_DEV( 0x0ed1, 0x7636, 0x0103, 0x0103, | |||
1237 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1240 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1238 | US_FL_IGNORE_RESIDUE | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64), | 1241 | US_FL_IGNORE_RESIDUE | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64), |
1239 | 1242 | ||
1243 | /* David Kuehling <dvdkhlng@gmx.de>: | ||
1244 | * for MP3-Player AVOX WSX-300ER (bought in Japan). Reports lots of SCSI | ||
1245 | * errors when trying to write. | ||
1246 | */ | ||
1247 | UNUSUAL_DEV( 0x0f19, 0x0105, 0x0100, 0x0100, | ||
1248 | "C-MEX", | ||
1249 | "A-VOX", | ||
1250 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1251 | US_FL_IGNORE_RESIDUE ), | ||
1252 | |||
1240 | /* Reported by Michael Stattmann <michael@stattmann.com> */ | 1253 | /* Reported by Michael Stattmann <michael@stattmann.com> */ |
1241 | UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000, | 1254 | UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000, |
1242 | "Sony Ericsson", | 1255 | "Sony Ericsson", |
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 5ee19be52f65..8d7bdcb5924d 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
@@ -483,7 +483,7 @@ static struct us_unusual_dev *find_unusual(const struct usb_device_id *id) | |||
483 | } | 483 | } |
484 | 484 | ||
485 | /* Get the unusual_devs entries and the string descriptors */ | 485 | /* Get the unusual_devs entries and the string descriptors */ |
486 | static void get_device_info(struct us_data *us, const struct usb_device_id *id) | 486 | static int get_device_info(struct us_data *us, const struct usb_device_id *id) |
487 | { | 487 | { |
488 | struct usb_device *dev = us->pusb_dev; | 488 | struct usb_device *dev = us->pusb_dev; |
489 | struct usb_interface_descriptor *idesc = | 489 | struct usb_interface_descriptor *idesc = |
@@ -500,6 +500,11 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id) | |||
500 | unusual_dev->useTransport; | 500 | unusual_dev->useTransport; |
501 | us->flags = USB_US_ORIG_FLAGS(id->driver_info); | 501 | us->flags = USB_US_ORIG_FLAGS(id->driver_info); |
502 | 502 | ||
503 | if (us->flags & US_FL_IGNORE_DEVICE) { | ||
504 | printk(KERN_INFO USB_STORAGE "device ignored\n"); | ||
505 | return -ENODEV; | ||
506 | } | ||
507 | |||
503 | /* | 508 | /* |
504 | * This flag is only needed when we're in high-speed, so let's | 509 | * This flag is only needed when we're in high-speed, so let's |
505 | * disable it if we're in full-speed | 510 | * disable it if we're in full-speed |
@@ -541,6 +546,8 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id) | |||
541 | msgs[msg], | 546 | msgs[msg], |
542 | UTS_RELEASE); | 547 | UTS_RELEASE); |
543 | } | 548 | } |
549 | |||
550 | return 0; | ||
544 | } | 551 | } |
545 | 552 | ||
546 | /* Get the transport settings */ | 553 | /* Get the transport settings */ |
@@ -969,7 +976,9 @@ static int storage_probe(struct usb_interface *intf, | |||
969 | * of the match from the usb_device_id table, so we can find the | 976 | * of the match from the usb_device_id table, so we can find the |
970 | * corresponding entry in the private table. | 977 | * corresponding entry in the private table. |
971 | */ | 978 | */ |
972 | get_device_info(us, id); | 979 | result = get_device_info(us, id); |
980 | if (result) | ||
981 | goto BadDevice; | ||
973 | 982 | ||
974 | /* Get the transport, protocol, and pipe settings */ | 983 | /* Get the transport, protocol, and pipe settings */ |
975 | result = get_transport(us); | 984 | result = get_transport(us); |
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 6533b0f39231..702eb933cf88 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig | |||
@@ -86,9 +86,11 @@ config FB_MACMODES | |||
86 | default n | 86 | default n |
87 | 87 | ||
88 | config FB_BACKLIGHT | 88 | config FB_BACKLIGHT |
89 | bool | 89 | bool |
90 | depends on FB | 90 | depends on FB |
91 | default n | 91 | select BACKLIGHT_LCD_SUPPORT |
92 | select BACKLIGHT_CLASS_DEVICE | ||
93 | default n | ||
92 | 94 | ||
93 | config FB_MODE_HELPERS | 95 | config FB_MODE_HELPERS |
94 | bool "Enable Video Mode Handling Helpers" | 96 | bool "Enable Video Mode Handling Helpers" |
@@ -420,7 +422,7 @@ config FB_OF | |||
420 | 422 | ||
421 | config FB_CONTROL | 423 | config FB_CONTROL |
422 | bool "Apple \"control\" display support" | 424 | bool "Apple \"control\" display support" |
423 | depends on (FB = y) && PPC_PMAC | 425 | depends on (FB = y) && PPC_PMAC && PPC32 |
424 | select FB_CFB_FILLRECT | 426 | select FB_CFB_FILLRECT |
425 | select FB_CFB_COPYAREA | 427 | select FB_CFB_COPYAREA |
426 | select FB_CFB_IMAGEBLIT | 428 | select FB_CFB_IMAGEBLIT |
@@ -431,7 +433,7 @@ config FB_CONTROL | |||
431 | 433 | ||
432 | config FB_PLATINUM | 434 | config FB_PLATINUM |
433 | bool "Apple \"platinum\" display support" | 435 | bool "Apple \"platinum\" display support" |
434 | depends on (FB = y) && PPC_PMAC | 436 | depends on (FB = y) && PPC_PMAC && PPC32 |
435 | select FB_CFB_FILLRECT | 437 | select FB_CFB_FILLRECT |
436 | select FB_CFB_COPYAREA | 438 | select FB_CFB_COPYAREA |
437 | select FB_CFB_IMAGEBLIT | 439 | select FB_CFB_IMAGEBLIT |
@@ -442,7 +444,7 @@ config FB_PLATINUM | |||
442 | 444 | ||
443 | config FB_VALKYRIE | 445 | config FB_VALKYRIE |
444 | bool "Apple \"valkyrie\" display support" | 446 | bool "Apple \"valkyrie\" display support" |
445 | depends on (FB = y) && (MAC || PPC_PMAC) | 447 | depends on (FB = y) && (MAC || (PPC_PMAC && PPC32)) |
446 | select FB_CFB_FILLRECT | 448 | select FB_CFB_FILLRECT |
447 | select FB_CFB_COPYAREA | 449 | select FB_CFB_COPYAREA |
448 | select FB_CFB_IMAGEBLIT | 450 | select FB_CFB_IMAGEBLIT |
@@ -453,7 +455,7 @@ config FB_VALKYRIE | |||
453 | 455 | ||
454 | config FB_CT65550 | 456 | config FB_CT65550 |
455 | bool "Chips 65550 display support" | 457 | bool "Chips 65550 display support" |
456 | depends on (FB = y) && PPC | 458 | depends on (FB = y) && PPC32 |
457 | select FB_CFB_FILLRECT | 459 | select FB_CFB_FILLRECT |
458 | select FB_CFB_COPYAREA | 460 | select FB_CFB_COPYAREA |
459 | select FB_CFB_IMAGEBLIT | 461 | select FB_CFB_IMAGEBLIT |
@@ -552,7 +554,7 @@ config FB_VESA | |||
552 | 554 | ||
553 | config FB_IMAC | 555 | config FB_IMAC |
554 | bool "Intel-based Macintosh Framebuffer Support" | 556 | bool "Intel-based Macintosh Framebuffer Support" |
555 | depends on (FB = y) && X86 | 557 | depends on (FB = y) && X86 && EFI |
556 | select FB_CFB_FILLRECT | 558 | select FB_CFB_FILLRECT |
557 | select FB_CFB_COPYAREA | 559 | select FB_CFB_COPYAREA |
558 | select FB_CFB_IMAGEBLIT | 560 | select FB_CFB_IMAGEBLIT |
@@ -721,10 +723,8 @@ config FB_NVIDIA_I2C | |||
721 | 723 | ||
722 | config FB_NVIDIA_BACKLIGHT | 724 | config FB_NVIDIA_BACKLIGHT |
723 | bool "Support for backlight control" | 725 | bool "Support for backlight control" |
724 | depends on FB_NVIDIA && PPC_PMAC | 726 | depends on FB_NVIDIA && PMAC_BACKLIGHT |
725 | select FB_BACKLIGHT | 727 | select FB_BACKLIGHT |
726 | select BACKLIGHT_LCD_SUPPORT | ||
727 | select BACKLIGHT_CLASS_DEVICE | ||
728 | default y | 728 | default y |
729 | help | 729 | help |
730 | Say Y here if you want to control the backlight of your display. | 730 | Say Y here if you want to control the backlight of your display. |
@@ -769,10 +769,8 @@ config FB_RIVA_DEBUG | |||
769 | 769 | ||
770 | config FB_RIVA_BACKLIGHT | 770 | config FB_RIVA_BACKLIGHT |
771 | bool "Support for backlight control" | 771 | bool "Support for backlight control" |
772 | depends on FB_RIVA && PPC_PMAC | 772 | depends on FB_RIVA && PMAC_BACKLIGHT |
773 | select FB_BACKLIGHT | 773 | select FB_BACKLIGHT |
774 | select BACKLIGHT_LCD_SUPPORT | ||
775 | select BACKLIGHT_CLASS_DEVICE | ||
776 | default y | 774 | default y |
777 | help | 775 | help |
778 | Say Y here if you want to control the backlight of your display. | 776 | Say Y here if you want to control the backlight of your display. |
@@ -1025,10 +1023,8 @@ config FB_RADEON_I2C | |||
1025 | 1023 | ||
1026 | config FB_RADEON_BACKLIGHT | 1024 | config FB_RADEON_BACKLIGHT |
1027 | bool "Support for backlight control" | 1025 | bool "Support for backlight control" |
1028 | depends on FB_RADEON && PPC_PMAC | 1026 | depends on FB_RADEON && PMAC_BACKLIGHT |
1029 | select FB_BACKLIGHT | 1027 | select FB_BACKLIGHT |
1030 | select BACKLIGHT_LCD_SUPPORT | ||
1031 | select BACKLIGHT_CLASS_DEVICE | ||
1032 | default y | 1028 | default y |
1033 | help | 1029 | help |
1034 | Say Y here if you want to control the backlight of your display. | 1030 | Say Y here if you want to control the backlight of your display. |
@@ -1059,10 +1055,8 @@ config FB_ATY128 | |||
1059 | 1055 | ||
1060 | config FB_ATY128_BACKLIGHT | 1056 | config FB_ATY128_BACKLIGHT |
1061 | bool "Support for backlight control" | 1057 | bool "Support for backlight control" |
1062 | depends on FB_ATY128 && PPC_PMAC | 1058 | depends on FB_ATY128 && PMAC_BACKLIGHT |
1063 | select FB_BACKLIGHT | 1059 | select FB_BACKLIGHT |
1064 | select BACKLIGHT_LCD_SUPPORT | ||
1065 | select BACKLIGHT_CLASS_DEVICE | ||
1066 | default y | 1060 | default y |
1067 | help | 1061 | help |
1068 | Say Y here if you want to control the backlight of your display. | 1062 | Say Y here if you want to control the backlight of your display. |
@@ -1111,10 +1105,8 @@ config FB_ATY_GX | |||
1111 | 1105 | ||
1112 | config FB_ATY_BACKLIGHT | 1106 | config FB_ATY_BACKLIGHT |
1113 | bool "Support for backlight control" | 1107 | bool "Support for backlight control" |
1114 | depends on FB_ATY && PPC_PMAC | 1108 | depends on FB_ATY && PMAC_BACKLIGHT |
1115 | select FB_BACKLIGHT | 1109 | select FB_BACKLIGHT |
1116 | select BACKLIGHT_LCD_SUPPORT | ||
1117 | select BACKLIGHT_CLASS_DEVICE | ||
1118 | default y | 1110 | default y |
1119 | help | 1111 | help |
1120 | Say Y here if you want to control the backlight of your display. | 1112 | Say Y here if you want to control the backlight of your display. |
@@ -1620,7 +1612,7 @@ if FB || SGI_NEWPORT_CONSOLE | |||
1620 | source "drivers/video/logo/Kconfig" | 1612 | source "drivers/video/logo/Kconfig" |
1621 | endif | 1613 | endif |
1622 | 1614 | ||
1623 | if FB && SYSFS | 1615 | if SYSFS |
1624 | source "drivers/video/backlight/Kconfig" | 1616 | source "drivers/video/backlight/Kconfig" |
1625 | endif | 1617 | endif |
1626 | 1618 | ||
diff --git a/drivers/video/Makefile b/drivers/video/Makefile index 95563c9c6b9c..481c6c9695f8 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile | |||
@@ -4,6 +4,7 @@ | |||
4 | 4 | ||
5 | # Each configuration option enables a list of files. | 5 | # Each configuration option enables a list of files. |
6 | 6 | ||
7 | obj-y += fb_notify.o | ||
7 | obj-$(CONFIG_FB) += fb.o | 8 | obj-$(CONFIG_FB) += fb.o |
8 | fb-y := fbmem.o fbmon.o fbcmap.o fbsysfs.o \ | 9 | fb-y := fbmem.o fbmon.o fbcmap.o fbsysfs.o \ |
9 | modedb.o fbcvt.o | 10 | modedb.o fbcvt.o |
diff --git a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c index c64a717e2d4b..3e827e04a2aa 100644 --- a/drivers/video/aty/aty128fb.c +++ b/drivers/video/aty/aty128fb.c | |||
@@ -455,7 +455,10 @@ static void do_wait_for_fifo(u16 entries, struct aty128fb_par *par); | |||
455 | static void wait_for_fifo(u16 entries, struct aty128fb_par *par); | 455 | static void wait_for_fifo(u16 entries, struct aty128fb_par *par); |
456 | static void wait_for_idle(struct aty128fb_par *par); | 456 | static void wait_for_idle(struct aty128fb_par *par); |
457 | static u32 depth_to_dst(u32 depth); | 457 | static u32 depth_to_dst(u32 depth); |
458 | |||
459 | #ifdef CONFIG_FB_ATY128_BACKLIGHT | ||
458 | static void aty128_bl_set_power(struct fb_info *info, int power); | 460 | static void aty128_bl_set_power(struct fb_info *info, int power); |
461 | #endif | ||
459 | 462 | ||
460 | #define BIOS_IN8(v) (readb(bios + (v))) | 463 | #define BIOS_IN8(v) (readb(bios + (v))) |
461 | #define BIOS_IN16(v) (readb(bios + (v)) | \ | 464 | #define BIOS_IN16(v) (readb(bios + (v)) | \ |
@@ -1910,9 +1913,6 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i | |||
1910 | u8 chip_rev; | 1913 | u8 chip_rev; |
1911 | u32 dac; | 1914 | u32 dac; |
1912 | 1915 | ||
1913 | if (!par->vram_size) /* may have already been probed */ | ||
1914 | par->vram_size = aty_ld_le32(CONFIG_MEMSIZE) & 0x03FFFFFF; | ||
1915 | |||
1916 | /* Get the chip revision */ | 1916 | /* Get the chip revision */ |
1917 | chip_rev = (aty_ld_le32(CONFIG_CNTL) >> 16) & 0x1F; | 1917 | chip_rev = (aty_ld_le32(CONFIG_CNTL) >> 16) & 0x1F; |
1918 | 1918 | ||
@@ -2025,9 +2025,6 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i | |||
2025 | 2025 | ||
2026 | aty128_init_engine(par); | 2026 | aty128_init_engine(par); |
2027 | 2027 | ||
2028 | if (register_framebuffer(info) < 0) | ||
2029 | return 0; | ||
2030 | |||
2031 | par->pm_reg = pci_find_capability(pdev, PCI_CAP_ID_PM); | 2028 | par->pm_reg = pci_find_capability(pdev, PCI_CAP_ID_PM); |
2032 | par->pdev = pdev; | 2029 | par->pdev = pdev; |
2033 | par->asleep = 0; | 2030 | par->asleep = 0; |
@@ -2037,6 +2034,9 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i | |||
2037 | aty128_bl_init(par); | 2034 | aty128_bl_init(par); |
2038 | #endif | 2035 | #endif |
2039 | 2036 | ||
2037 | if (register_framebuffer(info) < 0) | ||
2038 | return 0; | ||
2039 | |||
2040 | printk(KERN_INFO "fb%d: %s frame buffer device on %s\n", | 2040 | printk(KERN_INFO "fb%d: %s frame buffer device on %s\n", |
2041 | info->node, info->fix.id, video_card); | 2041 | info->node, info->fix.id, video_card); |
2042 | 2042 | ||
@@ -2086,7 +2086,6 @@ static int __devinit aty128_probe(struct pci_dev *pdev, const struct pci_device_ | |||
2086 | par = info->par; | 2086 | par = info->par; |
2087 | 2087 | ||
2088 | info->pseudo_palette = par->pseudo_palette; | 2088 | info->pseudo_palette = par->pseudo_palette; |
2089 | info->fix = aty128fb_fix; | ||
2090 | 2089 | ||
2091 | /* Virtualize mmio region */ | 2090 | /* Virtualize mmio region */ |
2092 | info->fix.mmio_start = reg_addr; | 2091 | info->fix.mmio_start = reg_addr; |
diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c index 1507d19f481f..053ff63365b7 100644 --- a/drivers/video/aty/atyfb_base.c +++ b/drivers/video/aty/atyfb_base.c | |||
@@ -2812,7 +2812,7 @@ static int atyfb_blank(int blank, struct fb_info *info) | |||
2812 | if (par->lock_blank || par->asleep) | 2812 | if (par->lock_blank || par->asleep) |
2813 | return 0; | 2813 | return 0; |
2814 | 2814 | ||
2815 | #ifdef CONFIG_PMAC_BACKLIGHT | 2815 | #ifdef CONFIG_FB_ATY_BACKLIGHT |
2816 | if (machine_is(powermac) && blank > FB_BLANK_NORMAL) | 2816 | if (machine_is(powermac) && blank > FB_BLANK_NORMAL) |
2817 | aty_bl_set_power(info, FB_BLANK_POWERDOWN); | 2817 | aty_bl_set_power(info, FB_BLANK_POWERDOWN); |
2818 | #elif defined(CONFIG_FB_ATY_GENERIC_LCD) | 2818 | #elif defined(CONFIG_FB_ATY_GENERIC_LCD) |
@@ -2844,7 +2844,7 @@ static int atyfb_blank(int blank, struct fb_info *info) | |||
2844 | } | 2844 | } |
2845 | aty_st_le32(CRTC_GEN_CNTL, gen_cntl, par); | 2845 | aty_st_le32(CRTC_GEN_CNTL, gen_cntl, par); |
2846 | 2846 | ||
2847 | #ifdef CONFIG_PMAC_BACKLIGHT | 2847 | #ifdef CONFIG_FB_ATY_BACKLIGHT |
2848 | if (machine_is(powermac) && blank <= FB_BLANK_NORMAL) | 2848 | if (machine_is(powermac) && blank <= FB_BLANK_NORMAL) |
2849 | aty_bl_set_power(info, FB_BLANK_UNBLANK); | 2849 | aty_bl_set_power(info, FB_BLANK_UNBLANK); |
2850 | #elif defined(CONFIG_FB_ATY_GENERIC_LCD) | 2850 | #elif defined(CONFIG_FB_ATY_GENERIC_LCD) |
diff --git a/drivers/video/aty/radeon_base.c b/drivers/video/aty/radeon_base.c index 8d85fc58142e..8e3400d5dd21 100644 --- a/drivers/video/aty/radeon_base.c +++ b/drivers/video/aty/radeon_base.c | |||
@@ -266,6 +266,8 @@ static int force_measure_pll = 0; | |||
266 | #ifdef CONFIG_MTRR | 266 | #ifdef CONFIG_MTRR |
267 | static int nomtrr = 0; | 267 | static int nomtrr = 0; |
268 | #endif | 268 | #endif |
269 | static int force_sleep; | ||
270 | static int ignore_devlist; | ||
269 | 271 | ||
270 | /* | 272 | /* |
271 | * prototypes | 273 | * prototypes |
@@ -2327,9 +2329,9 @@ static int __devinit radeonfb_pci_register (struct pci_dev *pdev, | |||
2327 | /* -2 is special: means ON on mobility chips and do not | 2329 | /* -2 is special: means ON on mobility chips and do not |
2328 | * change on others | 2330 | * change on others |
2329 | */ | 2331 | */ |
2330 | radeonfb_pm_init(rinfo, rinfo->is_mobility ? 1 : -1); | 2332 | radeonfb_pm_init(rinfo, rinfo->is_mobility ? 1 : -1, ignore_devlist, force_sleep); |
2331 | } else | 2333 | } else |
2332 | radeonfb_pm_init(rinfo, default_dynclk); | 2334 | radeonfb_pm_init(rinfo, default_dynclk, ignore_devlist, force_sleep); |
2333 | 2335 | ||
2334 | pci_set_drvdata(pdev, info); | 2336 | pci_set_drvdata(pdev, info); |
2335 | 2337 | ||
@@ -2477,6 +2479,12 @@ static int __init radeonfb_setup (char *options) | |||
2477 | force_measure_pll = 1; | 2479 | force_measure_pll = 1; |
2478 | } else if (!strncmp(this_opt, "ignore_edid", 11)) { | 2480 | } else if (!strncmp(this_opt, "ignore_edid", 11)) { |
2479 | ignore_edid = 1; | 2481 | ignore_edid = 1; |
2482 | #if defined(CONFIG_PM) && defined(CONFIG_X86) | ||
2483 | } else if (!strncmp(this_opt, "force_sleep", 11)) { | ||
2484 | force_sleep = 1; | ||
2485 | } else if (!strncmp(this_opt, "ignore_devlist", 14)) { | ||
2486 | ignore_devlist = 1; | ||
2487 | #endif | ||
2480 | } else | 2488 | } else |
2481 | mode_option = this_opt; | 2489 | mode_option = this_opt; |
2482 | } | 2490 | } |
@@ -2532,3 +2540,9 @@ module_param(panel_yres, int, 0); | |||
2532 | MODULE_PARM_DESC(panel_yres, "int: set panel yres"); | 2540 | MODULE_PARM_DESC(panel_yres, "int: set panel yres"); |
2533 | module_param(mode_option, charp, 0); | 2541 | module_param(mode_option, charp, 0); |
2534 | MODULE_PARM_DESC(mode_option, "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" "); | 2542 | MODULE_PARM_DESC(mode_option, "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" "); |
2543 | #if defined(CONFIG_PM) && defined(CONFIG_X86) | ||
2544 | module_param(force_sleep, bool, 0); | ||
2545 | MODULE_PARM_DESC(force_sleep, "bool: force D2 sleep mode on all hardware"); | ||
2546 | module_param(ignore_devlist, bool, 0); | ||
2547 | MODULE_PARM_DESC(ignore_devlist, "bool: ignore workarounds for bugs in specific laptops"); | ||
2548 | #endif | ||
diff --git a/drivers/video/aty/radeon_pm.c b/drivers/video/aty/radeon_pm.c index c7091761cef4..f31e606a2ded 100644 --- a/drivers/video/aty/radeon_pm.c +++ b/drivers/video/aty/radeon_pm.c | |||
@@ -27,6 +27,99 @@ | |||
27 | 27 | ||
28 | #include "ati_ids.h" | 28 | #include "ati_ids.h" |
29 | 29 | ||
30 | static void radeon_reinitialize_M10(struct radeonfb_info *rinfo); | ||
31 | |||
32 | /* | ||
33 | * Workarounds for bugs in PC laptops: | ||
34 | * - enable D2 sleep in some IBM Thinkpads | ||
35 | * - special case for Samsung P35 | ||
36 | * | ||
37 | * Whitelist by subsystem vendor/device because | ||
38 | * its the subsystem vendor's fault! | ||
39 | */ | ||
40 | |||
41 | #if defined(CONFIG_PM) && defined(CONFIG_X86) | ||
42 | struct radeon_device_id { | ||
43 | const char *ident; /* (arbitrary) Name */ | ||
44 | const unsigned short subsystem_vendor; /* Subsystem Vendor ID */ | ||
45 | const unsigned short subsystem_device; /* Subsystem Device ID */ | ||
46 | const enum radeon_pm_mode pm_mode_modifier; /* modify pm_mode */ | ||
47 | const reinit_function_ptr new_reinit_func; /* changed reinit_func */ | ||
48 | }; | ||
49 | |||
50 | #define BUGFIX(model, sv, sd, pm, fn) { \ | ||
51 | .ident = model, \ | ||
52 | .subsystem_vendor = sv, \ | ||
53 | .subsystem_device = sd, \ | ||
54 | .pm_mode_modifier = pm, \ | ||
55 | .new_reinit_func = fn \ | ||
56 | } | ||
57 | |||
58 | static struct radeon_device_id radeon_workaround_list[] = { | ||
59 | BUGFIX("IBM Thinkpad R32", | ||
60 | PCI_VENDOR_ID_IBM, 0x1905, | ||
61 | radeon_pm_d2, NULL), | ||
62 | BUGFIX("IBM Thinkpad R40", | ||
63 | PCI_VENDOR_ID_IBM, 0x0526, | ||
64 | radeon_pm_d2, NULL), | ||
65 | BUGFIX("IBM Thinkpad R40", | ||
66 | PCI_VENDOR_ID_IBM, 0x0527, | ||
67 | radeon_pm_d2, NULL), | ||
68 | BUGFIX("IBM Thinkpad R50/R51/T40/T41", | ||
69 | PCI_VENDOR_ID_IBM, 0x0531, | ||
70 | radeon_pm_d2, NULL), | ||
71 | BUGFIX("IBM Thinkpad R51/T40/T41/T42", | ||
72 | PCI_VENDOR_ID_IBM, 0x0530, | ||
73 | radeon_pm_d2, NULL), | ||
74 | BUGFIX("IBM Thinkpad T30", | ||
75 | PCI_VENDOR_ID_IBM, 0x0517, | ||
76 | radeon_pm_d2, NULL), | ||
77 | BUGFIX("IBM Thinkpad T40p", | ||
78 | PCI_VENDOR_ID_IBM, 0x054d, | ||
79 | radeon_pm_d2, NULL), | ||
80 | BUGFIX("IBM Thinkpad T42", | ||
81 | PCI_VENDOR_ID_IBM, 0x0550, | ||
82 | radeon_pm_d2, NULL), | ||
83 | BUGFIX("IBM Thinkpad X31/X32", | ||
84 | PCI_VENDOR_ID_IBM, 0x052f, | ||
85 | radeon_pm_d2, NULL), | ||
86 | BUGFIX("Samsung P35", | ||
87 | PCI_VENDOR_ID_SAMSUNG, 0xc00c, | ||
88 | radeon_pm_off, radeon_reinitialize_M10), | ||
89 | { .ident = NULL } | ||
90 | }; | ||
91 | |||
92 | static int radeon_apply_workarounds(struct radeonfb_info *rinfo) | ||
93 | { | ||
94 | struct radeon_device_id *id; | ||
95 | |||
96 | for (id = radeon_workaround_list; id->ident != NULL; id++ ) | ||
97 | if ((id->subsystem_vendor == rinfo->pdev->subsystem_vendor ) && | ||
98 | (id->subsystem_device == rinfo->pdev->subsystem_device )) { | ||
99 | |||
100 | /* we found a device that requires workaround */ | ||
101 | printk(KERN_DEBUG "radeonfb: %s detected" | ||
102 | ", enabling workaround\n", id->ident); | ||
103 | |||
104 | rinfo->pm_mode |= id->pm_mode_modifier; | ||
105 | |||
106 | if (id->new_reinit_func != NULL) | ||
107 | rinfo->reinit_func = id->new_reinit_func; | ||
108 | |||
109 | return 1; | ||
110 | } | ||
111 | return 0; /* not found */ | ||
112 | } | ||
113 | |||
114 | #else /* defined(CONFIG_PM) && defined(CONFIG_X86) */ | ||
115 | static inline int radeon_apply_workarounds(struct radeonfb_info *rinfo) | ||
116 | { | ||
117 | return 0; | ||
118 | } | ||
119 | #endif /* defined(CONFIG_PM) && defined(CONFIG_X86) */ | ||
120 | |||
121 | |||
122 | |||
30 | static void radeon_pm_disable_dynamic_mode(struct radeonfb_info *rinfo) | 123 | static void radeon_pm_disable_dynamic_mode(struct radeonfb_info *rinfo) |
31 | { | 124 | { |
32 | u32 tmp; | 125 | u32 tmp; |
@@ -852,18 +945,26 @@ static void radeon_pm_setup_for_suspend(struct radeonfb_info *rinfo) | |||
852 | /* because both INPLL and OUTPLL take the same lock, that's why. */ | 945 | /* because both INPLL and OUTPLL take the same lock, that's why. */ |
853 | tmp = INPLL( pllMCLK_MISC) | MCLK_MISC__EN_MCLK_TRISTATE_IN_SUSPEND; | 946 | tmp = INPLL( pllMCLK_MISC) | MCLK_MISC__EN_MCLK_TRISTATE_IN_SUSPEND; |
854 | OUTPLL( pllMCLK_MISC, tmp); | 947 | OUTPLL( pllMCLK_MISC, tmp); |
855 | |||
856 | /* AGP PLL control */ | ||
857 | if (rinfo->family <= CHIP_FAMILY_RV280) { | ||
858 | OUTREG(BUS_CNTL1, INREG(BUS_CNTL1) | BUS_CNTL1__AGPCLK_VALID); | ||
859 | 948 | ||
860 | OUTREG(BUS_CNTL1, | 949 | /* BUS_CNTL1__MOBILE_PLATORM_SEL setting is northbridge chipset |
861 | (INREG(BUS_CNTL1) & ~BUS_CNTL1__MOBILE_PLATFORM_SEL_MASK) | 950 | * and radeon chip dependent. Thus we only enable it on Mac for |
862 | | (2<<BUS_CNTL1__MOBILE_PLATFORM_SEL__SHIFT)); // 440BX | 951 | * now (until we get more info on how to compute the correct |
863 | } else { | 952 | * value for various X86 bridges). |
864 | OUTREG(BUS_CNTL1, INREG(BUS_CNTL1)); | 953 | */ |
865 | OUTREG(BUS_CNTL1, (INREG(BUS_CNTL1) & ~0x4000) | 0x8000); | 954 | #ifdef CONFIG_PPC_PMAC |
955 | if (machine_is(powermac)) { | ||
956 | /* AGP PLL control */ | ||
957 | if (rinfo->family <= CHIP_FAMILY_RV280) { | ||
958 | OUTREG(BUS_CNTL1, INREG(BUS_CNTL1) | BUS_CNTL1__AGPCLK_VALID); | ||
959 | OUTREG(BUS_CNTL1, | ||
960 | (INREG(BUS_CNTL1) & ~BUS_CNTL1__MOBILE_PLATFORM_SEL_MASK) | ||
961 | | (2<<BUS_CNTL1__MOBILE_PLATFORM_SEL__SHIFT)); // 440BX | ||
962 | } else { | ||
963 | OUTREG(BUS_CNTL1, INREG(BUS_CNTL1)); | ||
964 | OUTREG(BUS_CNTL1, (INREG(BUS_CNTL1) & ~0x4000) | 0x8000); | ||
965 | } | ||
866 | } | 966 | } |
967 | #endif | ||
867 | 968 | ||
868 | OUTREG(CRTC_OFFSET_CNTL, (INREG(CRTC_OFFSET_CNTL) | 969 | OUTREG(CRTC_OFFSET_CNTL, (INREG(CRTC_OFFSET_CNTL) |
869 | & ~CRTC_OFFSET_CNTL__CRTC_STEREO_SYNC_OUT_EN)); | 970 | & ~CRTC_OFFSET_CNTL__CRTC_STEREO_SYNC_OUT_EN)); |
@@ -2713,7 +2814,7 @@ static void radeonfb_early_resume(void *data) | |||
2713 | 2814 | ||
2714 | #endif /* CONFIG_PM */ | 2815 | #endif /* CONFIG_PM */ |
2715 | 2816 | ||
2716 | void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk) | 2817 | void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlist, int force_sleep) |
2717 | { | 2818 | { |
2718 | /* Find PM registers in config space if any*/ | 2819 | /* Find PM registers in config space if any*/ |
2719 | rinfo->pm_reg = pci_find_capability(rinfo->pdev, PCI_CAP_ID_PM); | 2820 | rinfo->pm_reg = pci_find_capability(rinfo->pdev, PCI_CAP_ID_PM); |
@@ -2729,22 +2830,13 @@ void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk) | |||
2729 | } | 2830 | } |
2730 | 2831 | ||
2731 | #if defined(CONFIG_PM) | 2832 | #if defined(CONFIG_PM) |
2833 | #if defined(CONFIG_PPC_PMAC) | ||
2732 | /* Check if we can power manage on suspend/resume. We can do | 2834 | /* Check if we can power manage on suspend/resume. We can do |
2733 | * D2 on M6, M7 and M9, and we can resume from D3 cold a few other | 2835 | * D2 on M6, M7 and M9, and we can resume from D3 cold a few other |
2734 | * "Mac" cards, but that's all. We need more infos about what the | 2836 | * "Mac" cards, but that's all. We need more infos about what the |
2735 | * BIOS does tho. Right now, all this PM stuff is pmac-only for that | 2837 | * BIOS does tho. Right now, all this PM stuff is pmac-only for that |
2736 | * reason. --BenH | 2838 | * reason. --BenH |
2737 | */ | 2839 | */ |
2738 | /* Special case for Samsung P35 laptops | ||
2739 | */ | ||
2740 | if ((rinfo->pdev->vendor == PCI_VENDOR_ID_ATI) && | ||
2741 | (rinfo->pdev->device == PCI_CHIP_RV350_NP) && | ||
2742 | (rinfo->pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG) && | ||
2743 | (rinfo->pdev->subsystem_device == 0xc00c)) { | ||
2744 | rinfo->reinit_func = radeon_reinitialize_M10; | ||
2745 | rinfo->pm_mode |= radeon_pm_off; | ||
2746 | } | ||
2747 | #if defined(CONFIG_PPC_PMAC) | ||
2748 | if (machine_is(powermac) && rinfo->of_node) { | 2840 | if (machine_is(powermac) && rinfo->of_node) { |
2749 | if (rinfo->is_mobility && rinfo->pm_reg && | 2841 | if (rinfo->is_mobility && rinfo->pm_reg && |
2750 | rinfo->family <= CHIP_FAMILY_RV250) | 2842 | rinfo->family <= CHIP_FAMILY_RV250) |
@@ -2790,6 +2882,18 @@ void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk) | |||
2790 | } | 2882 | } |
2791 | #endif /* defined(CONFIG_PPC_PMAC) */ | 2883 | #endif /* defined(CONFIG_PPC_PMAC) */ |
2792 | #endif /* defined(CONFIG_PM) */ | 2884 | #endif /* defined(CONFIG_PM) */ |
2885 | |||
2886 | if (ignore_devlist) | ||
2887 | printk(KERN_DEBUG | ||
2888 | "radeonfb: skipping test for device workarounds\n"); | ||
2889 | else | ||
2890 | radeon_apply_workarounds(rinfo); | ||
2891 | |||
2892 | if (force_sleep) { | ||
2893 | printk(KERN_DEBUG | ||
2894 | "radeonfb: forcefully enabling D2 sleep mode\n"); | ||
2895 | rinfo->pm_mode |= radeon_pm_d2; | ||
2896 | } | ||
2793 | } | 2897 | } |
2794 | 2898 | ||
2795 | void radeonfb_pm_exit(struct radeonfb_info *rinfo) | 2899 | void radeonfb_pm_exit(struct radeonfb_info *rinfo) |
diff --git a/drivers/video/aty/radeonfb.h b/drivers/video/aty/radeonfb.h index 38657b2d10eb..d5ff224a6258 100644 --- a/drivers/video/aty/radeonfb.h +++ b/drivers/video/aty/radeonfb.h | |||
@@ -273,6 +273,8 @@ enum radeon_pm_mode { | |||
273 | radeon_pm_off = 0x00000002, /* Can resume from D3 cold */ | 273 | radeon_pm_off = 0x00000002, /* Can resume from D3 cold */ |
274 | }; | 274 | }; |
275 | 275 | ||
276 | typedef void (*reinit_function_ptr)(struct radeonfb_info *rinfo); | ||
277 | |||
276 | struct radeonfb_info { | 278 | struct radeonfb_info { |
277 | struct fb_info *info; | 279 | struct fb_info *info; |
278 | 280 | ||
@@ -338,7 +340,7 @@ struct radeonfb_info { | |||
338 | int dynclk; | 340 | int dynclk; |
339 | int no_schedule; | 341 | int no_schedule; |
340 | enum radeon_pm_mode pm_mode; | 342 | enum radeon_pm_mode pm_mode; |
341 | void (*reinit_func)(struct radeonfb_info *rinfo); | 343 | reinit_function_ptr reinit_func; |
342 | 344 | ||
343 | /* Lock on register access */ | 345 | /* Lock on register access */ |
344 | spinlock_t reg_lock; | 346 | spinlock_t reg_lock; |
@@ -600,7 +602,7 @@ extern int radeon_probe_i2c_connector(struct radeonfb_info *rinfo, int conn, u8 | |||
600 | /* PM Functions */ | 602 | /* PM Functions */ |
601 | extern int radeonfb_pci_suspend(struct pci_dev *pdev, pm_message_t state); | 603 | extern int radeonfb_pci_suspend(struct pci_dev *pdev, pm_message_t state); |
602 | extern int radeonfb_pci_resume(struct pci_dev *pdev); | 604 | extern int radeonfb_pci_resume(struct pci_dev *pdev); |
603 | extern void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk); | 605 | extern void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlist, int force_sleep); |
604 | extern void radeonfb_pm_exit(struct radeonfb_info *rinfo); | 606 | extern void radeonfb_pm_exit(struct radeonfb_info *rinfo); |
605 | 607 | ||
606 | /* Monitor probe functions */ | 608 | /* Monitor probe functions */ |
diff --git a/drivers/video/au1100fb.c b/drivers/video/au1100fb.c index a92a91fef16f..f25d5d648333 100644 --- a/drivers/video/au1100fb.c +++ b/drivers/video/au1100fb.c | |||
@@ -156,7 +156,7 @@ int au1100fb_setmode(struct au1100fb_device *fbdev) | |||
156 | 156 | ||
157 | info->fix.visual = FB_VISUAL_TRUECOLOR; | 157 | info->fix.visual = FB_VISUAL_TRUECOLOR; |
158 | info->fix.line_length = info->var.xres_virtual << 1; /* depth=16 */ | 158 | info->fix.line_length = info->var.xres_virtual << 1; /* depth=16 */ |
159 | } | 159 | } |
160 | } else { | 160 | } else { |
161 | /* mono */ | 161 | /* mono */ |
162 | info->fix.visual = FB_VISUAL_MONO10; | 162 | info->fix.visual = FB_VISUAL_MONO10; |
@@ -164,20 +164,16 @@ int au1100fb_setmode(struct au1100fb_device *fbdev) | |||
164 | } | 164 | } |
165 | 165 | ||
166 | info->screen_size = info->fix.line_length * info->var.yres_virtual; | 166 | info->screen_size = info->fix.line_length * info->var.yres_virtual; |
167 | info->var.rotate = ((fbdev->panel->control_base&LCD_CONTROL_SM_MASK) \ | ||
168 | >> LCD_CONTROL_SM_BIT) * 90; | ||
167 | 169 | ||
168 | /* Determine BPP mode and format */ | 170 | /* Determine BPP mode and format */ |
169 | fbdev->regs->lcd_control = fbdev->panel->control_base | | 171 | fbdev->regs->lcd_control = fbdev->panel->control_base; |
170 | ((info->var.rotate/90) << LCD_CONTROL_SM_BIT); | ||
171 | |||
172 | fbdev->regs->lcd_intenable = 0; | ||
173 | fbdev->regs->lcd_intstatus = 0; | ||
174 | |||
175 | fbdev->regs->lcd_horztiming = fbdev->panel->horztiming; | 172 | fbdev->regs->lcd_horztiming = fbdev->panel->horztiming; |
176 | |||
177 | fbdev->regs->lcd_verttiming = fbdev->panel->verttiming; | 173 | fbdev->regs->lcd_verttiming = fbdev->panel->verttiming; |
178 | |||
179 | fbdev->regs->lcd_clkcontrol = fbdev->panel->clkcontrol_base; | 174 | fbdev->regs->lcd_clkcontrol = fbdev->panel->clkcontrol_base; |
180 | 175 | fbdev->regs->lcd_intenable = 0; | |
176 | fbdev->regs->lcd_intstatus = 0; | ||
181 | fbdev->regs->lcd_dmaaddr0 = LCD_DMA_SA_N(fbdev->fb_phys); | 177 | fbdev->regs->lcd_dmaaddr0 = LCD_DMA_SA_N(fbdev->fb_phys); |
182 | 178 | ||
183 | if (panel_is_dual(fbdev->panel)) { | 179 | if (panel_is_dual(fbdev->panel)) { |
@@ -206,6 +202,8 @@ int au1100fb_setmode(struct au1100fb_device *fbdev) | |||
206 | 202 | ||
207 | /* Resume controller */ | 203 | /* Resume controller */ |
208 | fbdev->regs->lcd_control |= LCD_CONTROL_GO; | 204 | fbdev->regs->lcd_control |= LCD_CONTROL_GO; |
205 | mdelay(10); | ||
206 | au1100fb_fb_blank(VESA_NO_BLANKING, info); | ||
209 | 207 | ||
210 | return 0; | 208 | return 0; |
211 | } | 209 | } |
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index 022f9d3473f5..02f15297a021 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig | |||
@@ -10,7 +10,7 @@ menuconfig BACKLIGHT_LCD_SUPPORT | |||
10 | 10 | ||
11 | config BACKLIGHT_CLASS_DEVICE | 11 | config BACKLIGHT_CLASS_DEVICE |
12 | tristate "Lowlevel Backlight controls" | 12 | tristate "Lowlevel Backlight controls" |
13 | depends on BACKLIGHT_LCD_SUPPORT && FB | 13 | depends on BACKLIGHT_LCD_SUPPORT |
14 | default m | 14 | default m |
15 | help | 15 | help |
16 | This framework adds support for low-level control of the LCD | 16 | This framework adds support for low-level control of the LCD |
@@ -26,7 +26,7 @@ config BACKLIGHT_DEVICE | |||
26 | 26 | ||
27 | config LCD_CLASS_DEVICE | 27 | config LCD_CLASS_DEVICE |
28 | tristate "Lowlevel LCD controls" | 28 | tristate "Lowlevel LCD controls" |
29 | depends on BACKLIGHT_LCD_SUPPORT && FB | 29 | depends on BACKLIGHT_LCD_SUPPORT |
30 | default m | 30 | default m |
31 | help | 31 | help |
32 | This framework adds support for low-level control of LCD. | 32 | This framework adds support for low-level control of LCD. |
diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c index 52ed12b12acc..eb4d03fa5391 100644 --- a/drivers/video/console/mdacon.c +++ b/drivers/video/console/mdacon.c | |||
@@ -197,7 +197,7 @@ static int __init mdacon_setup(char *str) | |||
197 | __setup("mdacon=", mdacon_setup); | 197 | __setup("mdacon=", mdacon_setup); |
198 | #endif | 198 | #endif |
199 | 199 | ||
200 | static int __init mda_detect(void) | 200 | static int mda_detect(void) |
201 | { | 201 | { |
202 | int count=0; | 202 | int count=0; |
203 | u16 *p, p_save; | 203 | u16 *p, p_save; |
@@ -282,7 +282,7 @@ static int __init mda_detect(void) | |||
282 | return 1; | 282 | return 1; |
283 | } | 283 | } |
284 | 284 | ||
285 | static void __init mda_initialize(void) | 285 | static void mda_initialize(void) |
286 | { | 286 | { |
287 | write_mda_b(97, 0x00); /* horizontal total */ | 287 | write_mda_b(97, 0x00); /* horizontal total */ |
288 | write_mda_b(80, 0x01); /* horizontal displayed */ | 288 | write_mda_b(80, 0x01); /* horizontal displayed */ |
diff --git a/drivers/video/fb_notify.c b/drivers/video/fb_notify.c new file mode 100644 index 000000000000..8c020389e4fa --- /dev/null +++ b/drivers/video/fb_notify.c | |||
@@ -0,0 +1,46 @@ | |||
1 | /* | ||
2 | * linux/drivers/video/fb_notify.c | ||
3 | * | ||
4 | * Copyright (C) 2006 Antonino Daplas <adaplas@pol.net> | ||
5 | * | ||
6 | * 2001 - Documented with DocBook | ||
7 | * - Brad Douglas <brad@neruo.com> | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General Public | ||
10 | * License. See the file COPYING in the main directory of this archive | ||
11 | * for more details. | ||
12 | */ | ||
13 | #include <linux/fb.h> | ||
14 | #include <linux/notifier.h> | ||
15 | |||
16 | static BLOCKING_NOTIFIER_HEAD(fb_notifier_list); | ||
17 | |||
18 | /** | ||
19 | * fb_register_client - register a client notifier | ||
20 | * @nb: notifier block to callback on events | ||
21 | */ | ||
22 | int fb_register_client(struct notifier_block *nb) | ||
23 | { | ||
24 | return blocking_notifier_chain_register(&fb_notifier_list, nb); | ||
25 | } | ||
26 | EXPORT_SYMBOL(fb_register_client); | ||
27 | |||
28 | /** | ||
29 | * fb_unregister_client - unregister a client notifier | ||
30 | * @nb: notifier block to callback on events | ||
31 | */ | ||
32 | int fb_unregister_client(struct notifier_block *nb) | ||
33 | { | ||
34 | return blocking_notifier_chain_unregister(&fb_notifier_list, nb); | ||
35 | } | ||
36 | EXPORT_SYMBOL(fb_unregister_client); | ||
37 | |||
38 | /** | ||
39 | * fb_notifier_call_chain - notify clients of fb_events | ||
40 | * | ||
41 | */ | ||
42 | int fb_notifier_call_chain(unsigned long val, void *v) | ||
43 | { | ||
44 | return blocking_notifier_call_chain(&fb_notifier_list, val, v); | ||
45 | } | ||
46 | EXPORT_SYMBOL_GPL(fb_notifier_call_chain); | ||
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c index 4fc9df426c1a..17961e3ecaa0 100644 --- a/drivers/video/fbmem.c +++ b/drivers/video/fbmem.c | |||
@@ -52,7 +52,6 @@ | |||
52 | 52 | ||
53 | #define FBPIXMAPSIZE (1024 * 8) | 53 | #define FBPIXMAPSIZE (1024 * 8) |
54 | 54 | ||
55 | static BLOCKING_NOTIFIER_HEAD(fb_notifier_list); | ||
56 | struct fb_info *registered_fb[FB_MAX]; | 55 | struct fb_info *registered_fb[FB_MAX]; |
57 | int num_registered_fb; | 56 | int num_registered_fb; |
58 | 57 | ||
@@ -791,8 +790,7 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var) | |||
791 | 790 | ||
792 | event.info = info; | 791 | event.info = info; |
793 | event.data = &mode1; | 792 | event.data = &mode1; |
794 | ret = blocking_notifier_call_chain(&fb_notifier_list, | 793 | ret = fb_notifier_call_chain(FB_EVENT_MODE_DELETE, &event); |
795 | FB_EVENT_MODE_DELETE, &event); | ||
796 | } | 794 | } |
797 | 795 | ||
798 | if (!ret) | 796 | if (!ret) |
@@ -837,8 +835,7 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var) | |||
837 | 835 | ||
838 | info->flags &= ~FBINFO_MISC_USEREVENT; | 836 | info->flags &= ~FBINFO_MISC_USEREVENT; |
839 | event.info = info; | 837 | event.info = info; |
840 | blocking_notifier_call_chain(&fb_notifier_list, | 838 | fb_notifier_call_chain(evnt, &event); |
841 | evnt, &event); | ||
842 | } | 839 | } |
843 | } | 840 | } |
844 | } | 841 | } |
@@ -861,8 +858,7 @@ fb_blank(struct fb_info *info, int blank) | |||
861 | 858 | ||
862 | event.info = info; | 859 | event.info = info; |
863 | event.data = ␣ | 860 | event.data = ␣ |
864 | blocking_notifier_call_chain(&fb_notifier_list, | 861 | fb_notifier_call_chain(FB_EVENT_BLANK, &event); |
865 | FB_EVENT_BLANK, &event); | ||
866 | } | 862 | } |
867 | 863 | ||
868 | return ret; | 864 | return ret; |
@@ -933,8 +929,7 @@ fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
933 | con2fb.framebuffer = -1; | 929 | con2fb.framebuffer = -1; |
934 | event.info = info; | 930 | event.info = info; |
935 | event.data = &con2fb; | 931 | event.data = &con2fb; |
936 | blocking_notifier_call_chain(&fb_notifier_list, | 932 | fb_notifier_call_chain(FB_EVENT_GET_CONSOLE_MAP, &event); |
937 | FB_EVENT_GET_CONSOLE_MAP, &event); | ||
938 | return copy_to_user(argp, &con2fb, | 933 | return copy_to_user(argp, &con2fb, |
939 | sizeof(con2fb)) ? -EFAULT : 0; | 934 | sizeof(con2fb)) ? -EFAULT : 0; |
940 | case FBIOPUT_CON2FBMAP: | 935 | case FBIOPUT_CON2FBMAP: |
@@ -952,9 +947,8 @@ fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
952 | return -EINVAL; | 947 | return -EINVAL; |
953 | event.info = info; | 948 | event.info = info; |
954 | event.data = &con2fb; | 949 | event.data = &con2fb; |
955 | return blocking_notifier_call_chain(&fb_notifier_list, | 950 | return fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP, |
956 | FB_EVENT_SET_CONSOLE_MAP, | 951 | &event); |
957 | &event); | ||
958 | case FBIOBLANK: | 952 | case FBIOBLANK: |
959 | acquire_console_sem(); | 953 | acquire_console_sem(); |
960 | info->flags |= FBINFO_MISC_USEREVENT; | 954 | info->flags |= FBINFO_MISC_USEREVENT; |
@@ -1330,8 +1324,7 @@ register_framebuffer(struct fb_info *fb_info) | |||
1330 | registered_fb[i] = fb_info; | 1324 | registered_fb[i] = fb_info; |
1331 | 1325 | ||
1332 | event.info = fb_info; | 1326 | event.info = fb_info; |
1333 | blocking_notifier_call_chain(&fb_notifier_list, | 1327 | fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event); |
1334 | FB_EVENT_FB_REGISTERED, &event); | ||
1335 | return 0; | 1328 | return 0; |
1336 | } | 1329 | } |
1337 | 1330 | ||
@@ -1365,30 +1358,11 @@ unregister_framebuffer(struct fb_info *fb_info) | |||
1365 | fb_cleanup_class_device(fb_info); | 1358 | fb_cleanup_class_device(fb_info); |
1366 | class_device_destroy(fb_class, MKDEV(FB_MAJOR, i)); | 1359 | class_device_destroy(fb_class, MKDEV(FB_MAJOR, i)); |
1367 | event.info = fb_info; | 1360 | event.info = fb_info; |
1368 | blocking_notifier_call_chain(&fb_notifier_list, | 1361 | fb_notifier_call_chain(FB_EVENT_FB_UNREGISTERED, &event); |
1369 | FB_EVENT_FB_UNREGISTERED, &event); | ||
1370 | return 0; | 1362 | return 0; |
1371 | } | 1363 | } |
1372 | 1364 | ||
1373 | /** | 1365 | /** |
1374 | * fb_register_client - register a client notifier | ||
1375 | * @nb: notifier block to callback on events | ||
1376 | */ | ||
1377 | int fb_register_client(struct notifier_block *nb) | ||
1378 | { | ||
1379 | return blocking_notifier_chain_register(&fb_notifier_list, nb); | ||
1380 | } | ||
1381 | |||
1382 | /** | ||
1383 | * fb_unregister_client - unregister a client notifier | ||
1384 | * @nb: notifier block to callback on events | ||
1385 | */ | ||
1386 | int fb_unregister_client(struct notifier_block *nb) | ||
1387 | { | ||
1388 | return blocking_notifier_chain_unregister(&fb_notifier_list, nb); | ||
1389 | } | ||
1390 | |||
1391 | /** | ||
1392 | * fb_set_suspend - low level driver signals suspend | 1366 | * fb_set_suspend - low level driver signals suspend |
1393 | * @info: framebuffer affected | 1367 | * @info: framebuffer affected |
1394 | * @state: 0 = resuming, !=0 = suspending | 1368 | * @state: 0 = resuming, !=0 = suspending |
@@ -1403,13 +1377,11 @@ void fb_set_suspend(struct fb_info *info, int state) | |||
1403 | 1377 | ||
1404 | event.info = info; | 1378 | event.info = info; |
1405 | if (state) { | 1379 | if (state) { |
1406 | blocking_notifier_call_chain(&fb_notifier_list, | 1380 | fb_notifier_call_chain(FB_EVENT_SUSPEND, &event); |
1407 | FB_EVENT_SUSPEND, &event); | ||
1408 | info->state = FBINFO_STATE_SUSPENDED; | 1381 | info->state = FBINFO_STATE_SUSPENDED; |
1409 | } else { | 1382 | } else { |
1410 | info->state = FBINFO_STATE_RUNNING; | 1383 | info->state = FBINFO_STATE_RUNNING; |
1411 | blocking_notifier_call_chain(&fb_notifier_list, | 1384 | fb_notifier_call_chain(FB_EVENT_RESUME, &event); |
1412 | FB_EVENT_RESUME, &event); | ||
1413 | } | 1385 | } |
1414 | } | 1386 | } |
1415 | 1387 | ||
@@ -1480,9 +1452,7 @@ int fb_new_modelist(struct fb_info *info) | |||
1480 | 1452 | ||
1481 | if (!list_empty(&info->modelist)) { | 1453 | if (!list_empty(&info->modelist)) { |
1482 | event.info = info; | 1454 | event.info = info; |
1483 | err = blocking_notifier_call_chain(&fb_notifier_list, | 1455 | err = fb_notifier_call_chain(FB_EVENT_NEW_MODELIST, &event); |
1484 | FB_EVENT_NEW_MODELIST, | ||
1485 | &event); | ||
1486 | } | 1456 | } |
1487 | 1457 | ||
1488 | return err; | 1458 | return err; |
@@ -1594,8 +1564,6 @@ EXPORT_SYMBOL(fb_blank); | |||
1594 | EXPORT_SYMBOL(fb_pan_display); | 1564 | EXPORT_SYMBOL(fb_pan_display); |
1595 | EXPORT_SYMBOL(fb_get_buffer_offset); | 1565 | EXPORT_SYMBOL(fb_get_buffer_offset); |
1596 | EXPORT_SYMBOL(fb_set_suspend); | 1566 | EXPORT_SYMBOL(fb_set_suspend); |
1597 | EXPORT_SYMBOL(fb_register_client); | ||
1598 | EXPORT_SYMBOL(fb_unregister_client); | ||
1599 | EXPORT_SYMBOL(fb_get_options); | 1567 | EXPORT_SYMBOL(fb_get_options); |
1600 | 1568 | ||
1601 | MODULE_LICENSE("GPL"); | 1569 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/video/imacfb.c b/drivers/video/imacfb.c index ff233b84dec4..b485bece5fc9 100644 --- a/drivers/video/imacfb.c +++ b/drivers/video/imacfb.c | |||
@@ -18,6 +18,8 @@ | |||
18 | #include <linux/screen_info.h> | 18 | #include <linux/screen_info.h> |
19 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
20 | #include <linux/string.h> | 20 | #include <linux/string.h> |
21 | #include <linux/dmi.h> | ||
22 | #include <linux/efi.h> | ||
21 | 23 | ||
22 | #include <asm/io.h> | 24 | #include <asm/io.h> |
23 | 25 | ||
@@ -28,7 +30,7 @@ typedef enum _MAC_TYPE { | |||
28 | M_I20, | 30 | M_I20, |
29 | M_MINI, | 31 | M_MINI, |
30 | M_MACBOOK, | 32 | M_MACBOOK, |
31 | M_NEW | 33 | M_UNKNOWN |
32 | } MAC_TYPE; | 34 | } MAC_TYPE; |
33 | 35 | ||
34 | /* --------------------------------------------------------------------- */ | 36 | /* --------------------------------------------------------------------- */ |
@@ -52,10 +54,36 @@ static struct fb_fix_screeninfo imacfb_fix __initdata = { | |||
52 | }; | 54 | }; |
53 | 55 | ||
54 | static int inverse; | 56 | static int inverse; |
55 | static int model = M_NEW; | 57 | static int model = M_UNKNOWN; |
56 | static int manual_height; | 58 | static int manual_height; |
57 | static int manual_width; | 59 | static int manual_width; |
58 | 60 | ||
61 | static int set_system(struct dmi_system_id *id) | ||
62 | { | ||
63 | printk(KERN_INFO "imacfb: %s detected - set system to %ld\n", | ||
64 | id->ident, (long)id->driver_data); | ||
65 | |||
66 | model = (long)id->driver_data; | ||
67 | |||
68 | return 0; | ||
69 | } | ||
70 | |||
71 | static struct dmi_system_id __initdata dmi_system_table[] = { | ||
72 | { set_system, "iMac4,1", { | ||
73 | DMI_MATCH(DMI_BIOS_VENDOR,"Apple Computer, Inc."), | ||
74 | DMI_MATCH(DMI_BIOS_VERSION,"iMac4,1") }, (void*)M_I17}, | ||
75 | { set_system, "MacBookPro1,1", { | ||
76 | DMI_MATCH(DMI_BIOS_VENDOR,"Apple Computer, Inc."), | ||
77 | DMI_MATCH(DMI_BIOS_VERSION,"MacBookPro1,1") }, (void*)M_I17}, | ||
78 | { set_system, "MacBook1,1", { | ||
79 | DMI_MATCH(DMI_BIOS_VENDOR,"Apple Computer, Inc."), | ||
80 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook1,1")}, (void *)M_MACBOOK}, | ||
81 | { set_system, "Macmini1,1", { | ||
82 | DMI_MATCH(DMI_BIOS_VENDOR,"Apple Computer, Inc."), | ||
83 | DMI_MATCH(DMI_PRODUCT_NAME,"Macmini1,1")}, (void *)M_MINI}, | ||
84 | {}, | ||
85 | }; | ||
86 | |||
59 | #define DEFAULT_FB_MEM 1024*1024*16 | 87 | #define DEFAULT_FB_MEM 1024*1024*16 |
60 | 88 | ||
61 | /* --------------------------------------------------------------------- */ | 89 | /* --------------------------------------------------------------------- */ |
@@ -149,7 +177,6 @@ static int __init imacfb_probe(struct platform_device *dev) | |||
149 | screen_info.lfb_linelength = 1472 * 4; | 177 | screen_info.lfb_linelength = 1472 * 4; |
150 | screen_info.lfb_base = 0x80010000; | 178 | screen_info.lfb_base = 0x80010000; |
151 | break; | 179 | break; |
152 | case M_NEW: | ||
153 | case M_I20: | 180 | case M_I20: |
154 | screen_info.lfb_width = 1680; | 181 | screen_info.lfb_width = 1680; |
155 | screen_info.lfb_height = 1050; | 182 | screen_info.lfb_height = 1050; |
@@ -207,6 +234,10 @@ static int __init imacfb_probe(struct platform_device *dev) | |||
207 | size_remap = size_total; | 234 | size_remap = size_total; |
208 | imacfb_fix.smem_len = size_remap; | 235 | imacfb_fix.smem_len = size_remap; |
209 | 236 | ||
237 | #ifndef __i386__ | ||
238 | screen_info.imacpm_seg = 0; | ||
239 | #endif | ||
240 | |||
210 | if (!request_mem_region(imacfb_fix.smem_start, size_total, "imacfb")) { | 241 | if (!request_mem_region(imacfb_fix.smem_start, size_total, "imacfb")) { |
211 | printk(KERN_WARNING | 242 | printk(KERN_WARNING |
212 | "imacfb: cannot reserve video memory at 0x%lx\n", | 243 | "imacfb: cannot reserve video memory at 0x%lx\n", |
@@ -324,8 +355,16 @@ static int __init imacfb_init(void) | |||
324 | int ret; | 355 | int ret; |
325 | char *option = NULL; | 356 | char *option = NULL; |
326 | 357 | ||
327 | /* ignore error return of fb_get_options */ | 358 | if (!efi_enabled) |
328 | fb_get_options("imacfb", &option); | 359 | return -ENODEV; |
360 | if (!dmi_check_system(dmi_system_table)) | ||
361 | return -ENODEV; | ||
362 | if (model == M_UNKNOWN) | ||
363 | return -ENODEV; | ||
364 | |||
365 | if (fb_get_options("imacfb", &option)) | ||
366 | return -ENODEV; | ||
367 | |||
329 | imacfb_setup(option); | 368 | imacfb_setup(option); |
330 | ret = platform_driver_register(&imacfb_driver); | 369 | ret = platform_driver_register(&imacfb_driver); |
331 | 370 | ||
diff --git a/drivers/video/nvidia/nvidia.c b/drivers/video/nvidia/nvidia.c index 9f2066f0745a..d4f850117874 100644 --- a/drivers/video/nvidia/nvidia.c +++ b/drivers/video/nvidia/nvidia.c | |||
@@ -34,10 +34,6 @@ | |||
34 | #include "nv_proto.h" | 34 | #include "nv_proto.h" |
35 | #include "nv_dma.h" | 35 | #include "nv_dma.h" |
36 | 36 | ||
37 | #ifndef CONFIG_PCI /* sanity check */ | ||
38 | #error This driver requires PCI support. | ||
39 | #endif | ||
40 | |||
41 | #undef CONFIG_FB_NVIDIA_DEBUG | 37 | #undef CONFIG_FB_NVIDIA_DEBUG |
42 | #ifdef CONFIG_FB_NVIDIA_DEBUG | 38 | #ifdef CONFIG_FB_NVIDIA_DEBUG |
43 | #define NVTRACE printk | 39 | #define NVTRACE printk |
@@ -1303,20 +1299,19 @@ static int __devinit nvidiafb_probe(struct pci_dev *pd, | |||
1303 | 1299 | ||
1304 | nvidia_save_vga(par, &par->SavedReg); | 1300 | nvidia_save_vga(par, &par->SavedReg); |
1305 | 1301 | ||
1302 | pci_set_drvdata(pd, info); | ||
1303 | nvidia_bl_init(par); | ||
1306 | if (register_framebuffer(info) < 0) { | 1304 | if (register_framebuffer(info) < 0) { |
1307 | printk(KERN_ERR PFX "error registering nVidia framebuffer\n"); | 1305 | printk(KERN_ERR PFX "error registering nVidia framebuffer\n"); |
1308 | goto err_out_iounmap_fb; | 1306 | goto err_out_iounmap_fb; |
1309 | } | 1307 | } |
1310 | 1308 | ||
1311 | pci_set_drvdata(pd, info); | ||
1312 | 1309 | ||
1313 | printk(KERN_INFO PFX | 1310 | printk(KERN_INFO PFX |
1314 | "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n", | 1311 | "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n", |
1315 | info->fix.id, | 1312 | info->fix.id, |
1316 | par->FbMapSize / (1024 * 1024), info->fix.smem_start); | 1313 | par->FbMapSize / (1024 * 1024), info->fix.smem_start); |
1317 | 1314 | ||
1318 | nvidia_bl_init(par); | ||
1319 | |||
1320 | NVTRACE_LEAVE(); | 1315 | NVTRACE_LEAVE(); |
1321 | return 0; | 1316 | return 0; |
1322 | 1317 | ||
diff --git a/drivers/video/offb.c b/drivers/video/offb.c index ce5f3031b99b..0013311e0564 100644 --- a/drivers/video/offb.c +++ b/drivers/video/offb.c | |||
@@ -62,8 +62,6 @@ struct offb_par default_par; | |||
62 | * Interface used by the world | 62 | * Interface used by the world |
63 | */ | 63 | */ |
64 | 64 | ||
65 | int offb_init(void); | ||
66 | |||
67 | static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | 65 | static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, |
68 | u_int transp, struct fb_info *info); | 66 | u_int transp, struct fb_info *info); |
69 | static int offb_blank(int blank, struct fb_info *info); | 67 | static int offb_blank(int blank, struct fb_info *info); |
@@ -72,11 +70,6 @@ static int offb_blank(int blank, struct fb_info *info); | |||
72 | extern boot_infos_t *boot_infos; | 70 | extern boot_infos_t *boot_infos; |
73 | #endif | 71 | #endif |
74 | 72 | ||
75 | static void offb_init_nodriver(struct device_node *); | ||
76 | static void offb_init_fb(const char *name, const char *full_name, | ||
77 | int width, int height, int depth, int pitch, | ||
78 | unsigned long address, struct device_node *dp); | ||
79 | |||
80 | static struct fb_ops offb_ops = { | 73 | static struct fb_ops offb_ops = { |
81 | .owner = THIS_MODULE, | 74 | .owner = THIS_MODULE, |
82 | .fb_setcolreg = offb_setcolreg, | 75 | .fb_setcolreg = offb_setcolreg, |
@@ -229,123 +222,17 @@ static int offb_blank(int blank, struct fb_info *info) | |||
229 | return 0; | 222 | return 0; |
230 | } | 223 | } |
231 | 224 | ||
232 | /* | ||
233 | * Initialisation | ||
234 | */ | ||
235 | 225 | ||
236 | int __init offb_init(void) | 226 | static void __iomem *offb_map_reg(struct device_node *np, int index, |
227 | unsigned long offset, unsigned long size) | ||
237 | { | 228 | { |
238 | struct device_node *dp = NULL, *boot_disp = NULL; | 229 | struct resource r; |
239 | |||
240 | if (fb_get_options("offb", NULL)) | ||
241 | return -ENODEV; | ||
242 | 230 | ||
243 | for (dp = NULL; (dp = of_find_node_by_type(dp, "display"));) { | 231 | if (of_address_to_resource(np, index, &r)) |
244 | if (get_property(dp, "linux,opened", NULL) && | 232 | return 0; |
245 | get_property(dp, "linux,boot-display", NULL)) { | 233 | if ((r.start + offset + size) > r.end) |
246 | boot_disp = dp; | 234 | return 0; |
247 | offb_init_nodriver(dp); | 235 | return ioremap(r.start + offset, size); |
248 | } | ||
249 | } | ||
250 | for (dp = NULL; (dp = of_find_node_by_type(dp, "display"));) { | ||
251 | if (get_property(dp, "linux,opened", NULL) && | ||
252 | dp != boot_disp) | ||
253 | offb_init_nodriver(dp); | ||
254 | } | ||
255 | |||
256 | return 0; | ||
257 | } | ||
258 | |||
259 | |||
260 | static void __init offb_init_nodriver(struct device_node *dp) | ||
261 | { | ||
262 | unsigned int len; | ||
263 | int i, width = 640, height = 480, depth = 8, pitch = 640; | ||
264 | unsigned int flags, rsize, addr_prop = 0; | ||
265 | unsigned long max_size = 0; | ||
266 | u64 rstart, address = OF_BAD_ADDR; | ||
267 | u32 *pp, *addrp, *up; | ||
268 | u64 asize; | ||
269 | |||
270 | pp = (u32 *)get_property(dp, "linux,bootx-depth", &len); | ||
271 | if (pp == NULL) | ||
272 | pp = (u32 *)get_property(dp, "depth", &len); | ||
273 | if (pp && len == sizeof(u32)) | ||
274 | depth = *pp; | ||
275 | |||
276 | pp = (u32 *)get_property(dp, "linux,bootx-width", &len); | ||
277 | if (pp == NULL) | ||
278 | pp = (u32 *)get_property(dp, "width", &len); | ||
279 | if (pp && len == sizeof(u32)) | ||
280 | width = *pp; | ||
281 | |||
282 | pp = (u32 *)get_property(dp, "linux,bootx-height", &len); | ||
283 | if (pp == NULL) | ||
284 | pp = (u32 *)get_property(dp, "height", &len); | ||
285 | if (pp && len == sizeof(u32)) | ||
286 | height = *pp; | ||
287 | |||
288 | pp = (u32 *)get_property(dp, "linux,bootx-linebytes", &len); | ||
289 | if (pp == NULL) | ||
290 | pp = (u32 *)get_property(dp, "linebytes", &len); | ||
291 | if (pp && len == sizeof(u32)) | ||
292 | pitch = *pp; | ||
293 | else | ||
294 | pitch = width * ((depth + 7) / 8); | ||
295 | |||
296 | rsize = (unsigned long)pitch * (unsigned long)height; | ||
297 | |||
298 | /* Ok, now we try to figure out the address of the framebuffer. | ||
299 | * | ||
300 | * Unfortunately, Open Firmware doesn't provide a standard way to do | ||
301 | * so. All we can do is a dodgy heuristic that happens to work in | ||
302 | * practice. On most machines, the "address" property contains what | ||
303 | * we need, though not on Matrox cards found in IBM machines. What I've | ||
304 | * found that appears to give good results is to go through the PCI | ||
305 | * ranges and pick one that is both big enough and if possible encloses | ||
306 | * the "address" property. If none match, we pick the biggest | ||
307 | */ | ||
308 | up = (u32 *)get_property(dp, "linux,bootx-addr", &len); | ||
309 | if (up == NULL) | ||
310 | up = (u32 *)get_property(dp, "address", &len); | ||
311 | if (up && len == sizeof(u32)) | ||
312 | addr_prop = *up; | ||
313 | |||
314 | for (i = 0; (addrp = of_get_address(dp, i, &asize, &flags)) | ||
315 | != NULL; i++) { | ||
316 | int match_addrp = 0; | ||
317 | |||
318 | if (!(flags & IORESOURCE_MEM)) | ||
319 | continue; | ||
320 | if (asize < rsize) | ||
321 | continue; | ||
322 | rstart = of_translate_address(dp, addrp); | ||
323 | if (rstart == OF_BAD_ADDR) | ||
324 | continue; | ||
325 | if (addr_prop && (rstart <= addr_prop) && | ||
326 | ((rstart + asize) >= (addr_prop + rsize))) | ||
327 | match_addrp = 1; | ||
328 | if (match_addrp) { | ||
329 | address = addr_prop; | ||
330 | break; | ||
331 | } | ||
332 | if (rsize > max_size) { | ||
333 | max_size = rsize; | ||
334 | address = OF_BAD_ADDR; | ||
335 | } | ||
336 | |||
337 | if (address == OF_BAD_ADDR) | ||
338 | address = rstart; | ||
339 | } | ||
340 | if (address == OF_BAD_ADDR && addr_prop) | ||
341 | address = (u64)addr_prop; | ||
342 | if (address != OF_BAD_ADDR) { | ||
343 | /* kludge for valkyrie */ | ||
344 | if (strcmp(dp->name, "valkyrie") == 0) | ||
345 | address += 0x1000; | ||
346 | offb_init_fb(dp->name, dp->full_name, width, height, depth, | ||
347 | pitch, address, dp); | ||
348 | } | ||
349 | } | 236 | } |
350 | 237 | ||
351 | static void __init offb_init_fb(const char *name, const char *full_name, | 238 | static void __init offb_init_fb(const char *name, const char *full_name, |
@@ -402,45 +289,39 @@ static void __init offb_init_fb(const char *name, const char *full_name, | |||
402 | 289 | ||
403 | par->cmap_type = cmap_unknown; | 290 | par->cmap_type = cmap_unknown; |
404 | if (depth == 8) { | 291 | if (depth == 8) { |
405 | |||
406 | /* Palette hacks disabled for now */ | 292 | /* Palette hacks disabled for now */ |
407 | #if 0 | ||
408 | if (dp && !strncmp(name, "ATY,Rage128", 11)) { | 293 | if (dp && !strncmp(name, "ATY,Rage128", 11)) { |
409 | unsigned long regbase = dp->addrs[2].address; | 294 | par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff); |
410 | par->cmap_adr = ioremap(regbase, 0x1FFF); | 295 | if (par->cmap_adr) |
411 | par->cmap_type = cmap_r128; | 296 | par->cmap_type = cmap_r128; |
412 | } else if (dp && (!strncmp(name, "ATY,RageM3pA", 12) | 297 | } else if (dp && (!strncmp(name, "ATY,RageM3pA", 12) |
413 | || !strncmp(name, "ATY,RageM3p12A", 14))) { | 298 | || !strncmp(name, "ATY,RageM3p12A", 14))) { |
414 | unsigned long regbase = | 299 | par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff); |
415 | dp->parent->addrs[2].address; | 300 | if (par->cmap_adr) |
416 | par->cmap_adr = ioremap(regbase, 0x1FFF); | 301 | par->cmap_type = cmap_M3A; |
417 | par->cmap_type = cmap_M3A; | ||
418 | } else if (dp && !strncmp(name, "ATY,RageM3pB", 12)) { | 302 | } else if (dp && !strncmp(name, "ATY,RageM3pB", 12)) { |
419 | unsigned long regbase = | 303 | par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff); |
420 | dp->parent->addrs[2].address; | 304 | if (par->cmap_adr) |
421 | par->cmap_adr = ioremap(regbase, 0x1FFF); | 305 | par->cmap_type = cmap_M3B; |
422 | par->cmap_type = cmap_M3B; | ||
423 | } else if (dp && !strncmp(name, "ATY,Rage6", 9)) { | 306 | } else if (dp && !strncmp(name, "ATY,Rage6", 9)) { |
424 | unsigned long regbase = dp->addrs[1].address; | 307 | par->cmap_adr = offb_map_reg(dp, 1, 0, 0x1fff); |
425 | par->cmap_adr = ioremap(regbase, 0x1FFF); | 308 | if (par->cmap_adr) |
426 | par->cmap_type = cmap_radeon; | 309 | par->cmap_type = cmap_radeon; |
427 | } else if (!strncmp(name, "ATY,", 4)) { | 310 | } else if (!strncmp(name, "ATY,", 4)) { |
428 | unsigned long base = address & 0xff000000UL; | 311 | unsigned long base = address & 0xff000000UL; |
429 | par->cmap_adr = | 312 | par->cmap_adr = |
430 | ioremap(base + 0x7ff000, 0x1000) + 0xcc0; | 313 | ioremap(base + 0x7ff000, 0x1000) + 0xcc0; |
431 | par->cmap_data = par->cmap_adr + 1; | 314 | par->cmap_data = par->cmap_adr + 1; |
432 | par->cmap_type = cmap_m64; | 315 | par->cmap_type = cmap_m64; |
433 | } else if (device_is_compatible(dp, "pci1014,b7")) { | 316 | } else if (dp && device_is_compatible(dp, "pci1014,b7")) { |
434 | unsigned long regbase = dp->addrs[0].address; | 317 | par->cmap_adr = offb_map_reg(dp, 0, 0x6000, 0x1000); |
435 | par->cmap_adr = ioremap(regbase + 0x6000, 0x1000); | 318 | if (par->cmap_adr) |
436 | par->cmap_type = cmap_gxt2000; | 319 | par->cmap_type = cmap_gxt2000; |
437 | } | 320 | } |
438 | #endif | 321 | fix->visual = (par->cmap_type != cmap_unknown) ? |
439 | fix->visual = par->cmap_adr ? FB_VISUAL_PSEUDOCOLOR | 322 | FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_STATIC_PSEUDOCOLOR; |
440 | : FB_VISUAL_STATIC_PSEUDOCOLOR; | ||
441 | } else | 323 | } else |
442 | fix->visual = /* par->cmap_adr ? FB_VISUAL_DIRECTCOLOR | 324 | fix->visual = FB_VISUAL_TRUECOLOR; |
443 | : */ FB_VISUAL_TRUECOLOR; | ||
444 | 325 | ||
445 | var->xoffset = var->yoffset = 0; | 326 | var->xoffset = var->yoffset = 0; |
446 | switch (depth) { | 327 | switch (depth) { |
@@ -520,5 +401,139 @@ static void __init offb_init_fb(const char *name, const char *full_name, | |||
520 | info->node, full_name); | 401 | info->node, full_name); |
521 | } | 402 | } |
522 | 403 | ||
404 | |||
405 | static void __init offb_init_nodriver(struct device_node *dp, int no_real_node) | ||
406 | { | ||
407 | unsigned int len; | ||
408 | int i, width = 640, height = 480, depth = 8, pitch = 640; | ||
409 | unsigned int flags, rsize, addr_prop = 0; | ||
410 | unsigned long max_size = 0; | ||
411 | u64 rstart, address = OF_BAD_ADDR; | ||
412 | u32 *pp, *addrp, *up; | ||
413 | u64 asize; | ||
414 | |||
415 | pp = (u32 *)get_property(dp, "linux,bootx-depth", &len); | ||
416 | if (pp == NULL) | ||
417 | pp = (u32 *)get_property(dp, "depth", &len); | ||
418 | if (pp && len == sizeof(u32)) | ||
419 | depth = *pp; | ||
420 | |||
421 | pp = (u32 *)get_property(dp, "linux,bootx-width", &len); | ||
422 | if (pp == NULL) | ||
423 | pp = (u32 *)get_property(dp, "width", &len); | ||
424 | if (pp && len == sizeof(u32)) | ||
425 | width = *pp; | ||
426 | |||
427 | pp = (u32 *)get_property(dp, "linux,bootx-height", &len); | ||
428 | if (pp == NULL) | ||
429 | pp = (u32 *)get_property(dp, "height", &len); | ||
430 | if (pp && len == sizeof(u32)) | ||
431 | height = *pp; | ||
432 | |||
433 | pp = (u32 *)get_property(dp, "linux,bootx-linebytes", &len); | ||
434 | if (pp == NULL) | ||
435 | pp = (u32 *)get_property(dp, "linebytes", &len); | ||
436 | if (pp && len == sizeof(u32)) | ||
437 | pitch = *pp; | ||
438 | else | ||
439 | pitch = width * ((depth + 7) / 8); | ||
440 | |||
441 | rsize = (unsigned long)pitch * (unsigned long)height; | ||
442 | |||
443 | /* Ok, now we try to figure out the address of the framebuffer. | ||
444 | * | ||
445 | * Unfortunately, Open Firmware doesn't provide a standard way to do | ||
446 | * so. All we can do is a dodgy heuristic that happens to work in | ||
447 | * practice. On most machines, the "address" property contains what | ||
448 | * we need, though not on Matrox cards found in IBM machines. What I've | ||
449 | * found that appears to give good results is to go through the PCI | ||
450 | * ranges and pick one that is both big enough and if possible encloses | ||
451 | * the "address" property. If none match, we pick the biggest | ||
452 | */ | ||
453 | up = (u32 *)get_property(dp, "linux,bootx-addr", &len); | ||
454 | if (up == NULL) | ||
455 | up = (u32 *)get_property(dp, "address", &len); | ||
456 | if (up && len == sizeof(u32)) | ||
457 | addr_prop = *up; | ||
458 | |||
459 | /* Hack for when BootX is passing us */ | ||
460 | if (no_real_node) | ||
461 | goto skip_addr; | ||
462 | |||
463 | for (i = 0; (addrp = of_get_address(dp, i, &asize, &flags)) | ||
464 | != NULL; i++) { | ||
465 | int match_addrp = 0; | ||
466 | |||
467 | if (!(flags & IORESOURCE_MEM)) | ||
468 | continue; | ||
469 | if (asize < rsize) | ||
470 | continue; | ||
471 | rstart = of_translate_address(dp, addrp); | ||
472 | if (rstart == OF_BAD_ADDR) | ||
473 | continue; | ||
474 | if (addr_prop && (rstart <= addr_prop) && | ||
475 | ((rstart + asize) >= (addr_prop + rsize))) | ||
476 | match_addrp = 1; | ||
477 | if (match_addrp) { | ||
478 | address = addr_prop; | ||
479 | break; | ||
480 | } | ||
481 | if (rsize > max_size) { | ||
482 | max_size = rsize; | ||
483 | address = OF_BAD_ADDR; | ||
484 | } | ||
485 | |||
486 | if (address == OF_BAD_ADDR) | ||
487 | address = rstart; | ||
488 | } | ||
489 | skip_addr: | ||
490 | if (address == OF_BAD_ADDR && addr_prop) | ||
491 | address = (u64)addr_prop; | ||
492 | if (address != OF_BAD_ADDR) { | ||
493 | /* kludge for valkyrie */ | ||
494 | if (strcmp(dp->name, "valkyrie") == 0) | ||
495 | address += 0x1000; | ||
496 | offb_init_fb(no_real_node ? "bootx" : dp->name, | ||
497 | no_real_node ? "display" : dp->full_name, | ||
498 | width, height, depth, pitch, address, | ||
499 | no_real_node ? dp : NULL); | ||
500 | } | ||
501 | } | ||
502 | |||
503 | static int __init offb_init(void) | ||
504 | { | ||
505 | struct device_node *dp = NULL, *boot_disp = NULL; | ||
506 | |||
507 | if (fb_get_options("offb", NULL)) | ||
508 | return -ENODEV; | ||
509 | |||
510 | /* Check if we have a MacOS display without a node spec */ | ||
511 | if (get_property(of_chosen, "linux,bootx-noscreen", NULL) != NULL) { | ||
512 | /* The old code tried to work out which node was the MacOS | ||
513 | * display based on the address. I'm dropping that since the | ||
514 | * lack of a node spec only happens with old BootX versions | ||
515 | * (users can update) and with this code, they'll still get | ||
516 | * a display (just not the palette hacks). | ||
517 | */ | ||
518 | offb_init_nodriver(of_chosen, 1); | ||
519 | } | ||
520 | |||
521 | for (dp = NULL; (dp = of_find_node_by_type(dp, "display"));) { | ||
522 | if (get_property(dp, "linux,opened", NULL) && | ||
523 | get_property(dp, "linux,boot-display", NULL)) { | ||
524 | boot_disp = dp; | ||
525 | offb_init_nodriver(dp, 0); | ||
526 | } | ||
527 | } | ||
528 | for (dp = NULL; (dp = of_find_node_by_type(dp, "display"));) { | ||
529 | if (get_property(dp, "linux,opened", NULL) && | ||
530 | dp != boot_disp) | ||
531 | offb_init_nodriver(dp, 0); | ||
532 | } | ||
533 | |||
534 | return 0; | ||
535 | } | ||
536 | |||
537 | |||
523 | module_init(offb_init); | 538 | module_init(offb_init); |
524 | MODULE_LICENSE("GPL"); | 539 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/video/riva/fbdev.c b/drivers/video/riva/fbdev.c index 33dddbae5420..76fc9d355eb7 100644 --- a/drivers/video/riva/fbdev.c +++ b/drivers/video/riva/fbdev.c | |||
@@ -2132,6 +2132,9 @@ static int __devinit rivafb_probe(struct pci_dev *pd, | |||
2132 | 2132 | ||
2133 | fb_destroy_modedb(info->monspecs.modedb); | 2133 | fb_destroy_modedb(info->monspecs.modedb); |
2134 | info->monspecs.modedb = NULL; | 2134 | info->monspecs.modedb = NULL; |
2135 | |||
2136 | pci_set_drvdata(pd, info); | ||
2137 | riva_bl_init(info->par); | ||
2135 | ret = register_framebuffer(info); | 2138 | ret = register_framebuffer(info); |
2136 | if (ret < 0) { | 2139 | if (ret < 0) { |
2137 | printk(KERN_ERR PFX | 2140 | printk(KERN_ERR PFX |
@@ -2139,8 +2142,6 @@ static int __devinit rivafb_probe(struct pci_dev *pd, | |||
2139 | goto err_iounmap_screen_base; | 2142 | goto err_iounmap_screen_base; |
2140 | } | 2143 | } |
2141 | 2144 | ||
2142 | pci_set_drvdata(pd, info); | ||
2143 | |||
2144 | printk(KERN_INFO PFX | 2145 | printk(KERN_INFO PFX |
2145 | "PCI nVidia %s framebuffer ver %s (%dMB @ 0x%lX)\n", | 2146 | "PCI nVidia %s framebuffer ver %s (%dMB @ 0x%lX)\n", |
2146 | info->fix.id, | 2147 | info->fix.id, |
@@ -2148,8 +2149,6 @@ static int __devinit rivafb_probe(struct pci_dev *pd, | |||
2148 | info->fix.smem_len / (1024 * 1024), | 2149 | info->fix.smem_len / (1024 * 1024), |
2149 | info->fix.smem_start); | 2150 | info->fix.smem_start); |
2150 | 2151 | ||
2151 | riva_bl_init(info->par); | ||
2152 | |||
2153 | NVTRACE_LEAVE(); | 2152 | NVTRACE_LEAVE(); |
2154 | return 0; | 2153 | return 0; |
2155 | 2154 | ||
diff --git a/fs/9p/conv.c b/fs/9p/conv.c index 1e898144eb7c..56d88c1a09c5 100644 --- a/fs/9p/conv.c +++ b/fs/9p/conv.c | |||
@@ -673,8 +673,10 @@ struct v9fs_fcall *v9fs_create_tcreate(u32 fid, char *name, u32 perm, u8 mode, | |||
673 | struct cbuf *bufp = &buffer; | 673 | struct cbuf *bufp = &buffer; |
674 | 674 | ||
675 | size = 4 + 2 + strlen(name) + 4 + 1; /* fid[4] name[s] perm[4] mode[1] */ | 675 | size = 4 + 2 + strlen(name) + 4 + 1; /* fid[4] name[s] perm[4] mode[1] */ |
676 | if (extended && extension!=NULL) | 676 | if (extended) { |
677 | size += 2 + strlen(extension); /* extension[s] */ | 677 | size += 2 + /* extension[s] */ |
678 | (extension == NULL ? 0 : strlen(extension)); | ||
679 | } | ||
678 | 680 | ||
679 | fc = v9fs_create_common(bufp, size, TCREATE); | 681 | fc = v9fs_create_common(bufp, size, TCREATE); |
680 | if (IS_ERR(fc)) | 682 | if (IS_ERR(fc)) |
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 2f580a197b8d..eae50c9d6dc4 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
@@ -434,11 +434,11 @@ static int v9fs_remove(struct inode *dir, struct dentry *file, int rmdir) | |||
434 | result = v9fs_t_remove(v9ses, fid, &fcall); | 434 | result = v9fs_t_remove(v9ses, fid, &fcall); |
435 | if (result < 0) { | 435 | if (result < 0) { |
436 | PRINT_FCALL_ERROR("remove fails", fcall); | 436 | PRINT_FCALL_ERROR("remove fails", fcall); |
437 | } else { | ||
438 | v9fs_put_idpool(fid, &v9ses->fidpool); | ||
439 | v9fs_fid_destroy(v9fid); | ||
440 | } | 437 | } |
441 | 438 | ||
439 | v9fs_put_idpool(fid, &v9ses->fidpool); | ||
440 | v9fs_fid_destroy(v9fid); | ||
441 | |||
442 | kfree(fcall); | 442 | kfree(fcall); |
443 | return result; | 443 | return result; |
444 | } | 444 | } |
diff --git a/fs/adfs/super.c b/fs/adfs/super.c index ba1c88af49fe..82011019494c 100644 --- a/fs/adfs/super.c +++ b/fs/adfs/super.c | |||
@@ -308,7 +308,7 @@ static struct adfs_discmap *adfs_read_map(struct super_block *sb, struct adfs_di | |||
308 | if (adfs_checkmap(sb, dm)) | 308 | if (adfs_checkmap(sb, dm)) |
309 | return dm; | 309 | return dm; |
310 | 310 | ||
311 | adfs_error(sb, NULL, "map corrupted"); | 311 | adfs_error(sb, "map corrupted"); |
312 | 312 | ||
313 | error_free: | 313 | error_free: |
314 | while (--zone >= 0) | 314 | while (--zone >= 0) |
diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c index fcaeead9696b..50cfca5c7efd 100644 --- a/fs/befs/linuxvfs.c +++ b/fs/befs/linuxvfs.c | |||
@@ -512,7 +512,11 @@ befs_utf2nls(struct super_block *sb, const char *in, | |||
512 | wchar_t uni; | 512 | wchar_t uni; |
513 | int unilen, utflen; | 513 | int unilen, utflen; |
514 | char *result; | 514 | char *result; |
515 | int maxlen = in_len; /* The utf8->nls conversion can't make more chars */ | 515 | /* The utf8->nls conversion won't make the final nls string bigger |
516 | * than the utf one, but if the string is pure ascii they'll have the | ||
517 | * same width and an extra char is needed to save the additional \0 | ||
518 | */ | ||
519 | int maxlen = in_len + 1; | ||
516 | 520 | ||
517 | befs_debug(sb, "---> utf2nls()"); | 521 | befs_debug(sb, "---> utf2nls()"); |
518 | 522 | ||
@@ -588,7 +592,10 @@ befs_nls2utf(struct super_block *sb, const char *in, | |||
588 | wchar_t uni; | 592 | wchar_t uni; |
589 | int unilen, utflen; | 593 | int unilen, utflen; |
590 | char *result; | 594 | char *result; |
591 | int maxlen = 3 * in_len; | 595 | /* There're nls characters that will translate to 3-chars-wide UTF-8 |
596 | * characters, a additional byte is needed to save the final \0 | ||
597 | * in special cases */ | ||
598 | int maxlen = (3 * in_len) + 1; | ||
592 | 599 | ||
593 | befs_debug(sb, "---> nls2utf()\n"); | 600 | befs_debug(sb, "---> nls2utf()\n"); |
594 | 601 | ||
diff --git a/fs/buffer.c b/fs/buffer.c index 3660dcb97591..71649ef9b658 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
@@ -470,13 +470,18 @@ out: | |||
470 | pass does the actual I/O. */ | 470 | pass does the actual I/O. */ |
471 | void invalidate_bdev(struct block_device *bdev, int destroy_dirty_buffers) | 471 | void invalidate_bdev(struct block_device *bdev, int destroy_dirty_buffers) |
472 | { | 472 | { |
473 | struct address_space *mapping = bdev->bd_inode->i_mapping; | ||
474 | |||
475 | if (mapping->nrpages == 0) | ||
476 | return; | ||
477 | |||
473 | invalidate_bh_lrus(); | 478 | invalidate_bh_lrus(); |
474 | /* | 479 | /* |
475 | * FIXME: what about destroy_dirty_buffers? | 480 | * FIXME: what about destroy_dirty_buffers? |
476 | * We really want to use invalidate_inode_pages2() for | 481 | * We really want to use invalidate_inode_pages2() for |
477 | * that, but not until that's cleaned up. | 482 | * that, but not until that's cleaned up. |
478 | */ | 483 | */ |
479 | invalidate_inode_pages(bdev->bd_inode->i_mapping); | 484 | invalidate_inode_pages(mapping); |
480 | } | 485 | } |
481 | 486 | ||
482 | /* | 487 | /* |
diff --git a/fs/coda/file.c b/fs/coda/file.c index cc66c681bd11..dbfbcfa5b3c0 100644 --- a/fs/coda/file.c +++ b/fs/coda/file.c | |||
@@ -136,10 +136,8 @@ int coda_open(struct inode *coda_inode, struct file *coda_file) | |||
136 | coda_vfs_stat.open++; | 136 | coda_vfs_stat.open++; |
137 | 137 | ||
138 | cfi = kmalloc(sizeof(struct coda_file_info), GFP_KERNEL); | 138 | cfi = kmalloc(sizeof(struct coda_file_info), GFP_KERNEL); |
139 | if (!cfi) { | 139 | if (!cfi) |
140 | unlock_kernel(); | ||
141 | return -ENOMEM; | 140 | return -ENOMEM; |
142 | } | ||
143 | 141 | ||
144 | lock_kernel(); | 142 | lock_kernel(); |
145 | 143 | ||
diff --git a/fs/efs/symlink.c b/fs/efs/symlink.c index e249cf733a6b..1d30d2ff440f 100644 --- a/fs/efs/symlink.c +++ b/fs/efs/symlink.c | |||
@@ -22,7 +22,7 @@ static int efs_symlink_readpage(struct file *file, struct page *page) | |||
22 | 22 | ||
23 | err = -ENAMETOOLONG; | 23 | err = -ENAMETOOLONG; |
24 | if (size > 2 * EFS_BLOCKSIZE) | 24 | if (size > 2 * EFS_BLOCKSIZE) |
25 | goto fail; | 25 | goto fail_notlocked; |
26 | 26 | ||
27 | lock_kernel(); | 27 | lock_kernel(); |
28 | /* read first 512 bytes of link target */ | 28 | /* read first 512 bytes of link target */ |
@@ -47,6 +47,7 @@ static int efs_symlink_readpage(struct file *file, struct page *page) | |||
47 | return 0; | 47 | return 0; |
48 | fail: | 48 | fail: |
49 | unlock_kernel(); | 49 | unlock_kernel(); |
50 | fail_notlocked: | ||
50 | SetPageError(page); | 51 | SetPageError(page); |
51 | kunmap(page); | 52 | kunmap(page); |
52 | unlock_page(page); | 53 | unlock_page(page); |
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index f804d5e9d60c..c5ee9f0691e3 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c | |||
@@ -1158,7 +1158,7 @@ retry: | |||
1158 | ret = PTR_ERR(handle); | 1158 | ret = PTR_ERR(handle); |
1159 | goto out; | 1159 | goto out; |
1160 | } | 1160 | } |
1161 | if (test_opt(inode->i_sb, NOBH)) | 1161 | if (test_opt(inode->i_sb, NOBH) && ext3_should_writeback_data(inode)) |
1162 | ret = nobh_prepare_write(page, from, to, ext3_get_block); | 1162 | ret = nobh_prepare_write(page, from, to, ext3_get_block); |
1163 | else | 1163 | else |
1164 | ret = block_prepare_write(page, from, to, ext3_get_block); | 1164 | ret = block_prepare_write(page, from, to, ext3_get_block); |
@@ -1244,7 +1244,7 @@ static int ext3_writeback_commit_write(struct file *file, struct page *page, | |||
1244 | if (new_i_size > EXT3_I(inode)->i_disksize) | 1244 | if (new_i_size > EXT3_I(inode)->i_disksize) |
1245 | EXT3_I(inode)->i_disksize = new_i_size; | 1245 | EXT3_I(inode)->i_disksize = new_i_size; |
1246 | 1246 | ||
1247 | if (test_opt(inode->i_sb, NOBH)) | 1247 | if (test_opt(inode->i_sb, NOBH) && ext3_should_writeback_data(inode)) |
1248 | ret = nobh_commit_write(file, page, from, to); | 1248 | ret = nobh_commit_write(file, page, from, to); |
1249 | else | 1249 | else |
1250 | ret = generic_commit_write(file, page, from, to); | 1250 | ret = generic_commit_write(file, page, from, to); |
@@ -1494,7 +1494,7 @@ static int ext3_writeback_writepage(struct page *page, | |||
1494 | goto out_fail; | 1494 | goto out_fail; |
1495 | } | 1495 | } |
1496 | 1496 | ||
1497 | if (test_opt(inode->i_sb, NOBH)) | 1497 | if (test_opt(inode->i_sb, NOBH) && ext3_should_writeback_data(inode)) |
1498 | ret = nobh_writepage(page, ext3_get_block, wbc); | 1498 | ret = nobh_writepage(page, ext3_get_block, wbc); |
1499 | else | 1499 | else |
1500 | ret = block_write_full_page(page, ext3_get_block, wbc); | 1500 | ret = block_write_full_page(page, ext3_get_block, wbc); |
@@ -2402,14 +2402,15 @@ static ext3_fsblk_t ext3_get_inode_block(struct super_block *sb, | |||
2402 | struct buffer_head *bh; | 2402 | struct buffer_head *bh; |
2403 | struct ext3_group_desc * gdp; | 2403 | struct ext3_group_desc * gdp; |
2404 | 2404 | ||
2405 | 2405 | if (!ext3_valid_inum(sb, ino)) { | |
2406 | if ((ino != EXT3_ROOT_INO && ino != EXT3_JOURNAL_INO && | 2406 | /* |
2407 | ino != EXT3_RESIZE_INO && ino < EXT3_FIRST_INO(sb)) || | 2407 | * This error is already checked for in namei.c unless we are |
2408 | ino > le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count)) { | 2408 | * looking at an NFS filehandle, in which case no error |
2409 | ext3_error(sb, "ext3_get_inode_block", | 2409 | * report is needed |
2410 | "bad inode number: %lu", ino); | 2410 | */ |
2411 | return 0; | 2411 | return 0; |
2412 | } | 2412 | } |
2413 | |||
2413 | block_group = (ino - 1) / EXT3_INODES_PER_GROUP(sb); | 2414 | block_group = (ino - 1) / EXT3_INODES_PER_GROUP(sb); |
2414 | if (block_group >= EXT3_SB(sb)->s_groups_count) { | 2415 | if (block_group >= EXT3_SB(sb)->s_groups_count) { |
2415 | ext3_error(sb,"ext3_get_inode_block","group >= groups count"); | 2416 | ext3_error(sb,"ext3_get_inode_block","group >= groups count"); |
diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c index d9176dba3698..2aa7101b27cd 100644 --- a/fs/ext3/namei.c +++ b/fs/ext3/namei.c | |||
@@ -1000,7 +1000,12 @@ static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, str | |||
1000 | if (bh) { | 1000 | if (bh) { |
1001 | unsigned long ino = le32_to_cpu(de->inode); | 1001 | unsigned long ino = le32_to_cpu(de->inode); |
1002 | brelse (bh); | 1002 | brelse (bh); |
1003 | inode = iget(dir->i_sb, ino); | 1003 | if (!ext3_valid_inum(dir->i_sb, ino)) { |
1004 | ext3_error(dir->i_sb, "ext3_lookup", | ||
1005 | "bad inode number: %lu", ino); | ||
1006 | inode = NULL; | ||
1007 | } else | ||
1008 | inode = iget(dir->i_sb, ino); | ||
1004 | 1009 | ||
1005 | if (!inode) | 1010 | if (!inode) |
1006 | return ERR_PTR(-EACCES); | 1011 | return ERR_PTR(-EACCES); |
@@ -1028,7 +1033,13 @@ struct dentry *ext3_get_parent(struct dentry *child) | |||
1028 | return ERR_PTR(-ENOENT); | 1033 | return ERR_PTR(-ENOENT); |
1029 | ino = le32_to_cpu(de->inode); | 1034 | ino = le32_to_cpu(de->inode); |
1030 | brelse(bh); | 1035 | brelse(bh); |
1031 | inode = iget(child->d_inode->i_sb, ino); | 1036 | |
1037 | if (!ext3_valid_inum(child->d_inode->i_sb, ino)) { | ||
1038 | ext3_error(child->d_inode->i_sb, "ext3_get_parent", | ||
1039 | "bad inode number: %lu", ino); | ||
1040 | inode = NULL; | ||
1041 | } else | ||
1042 | inode = iget(child->d_inode->i_sb, ino); | ||
1032 | 1043 | ||
1033 | if (!inode) | 1044 | if (!inode) |
1034 | return ERR_PTR(-EACCES); | 1045 | return ERR_PTR(-EACCES); |
diff --git a/fs/freevxfs/vxfs_lookup.c b/fs/freevxfs/vxfs_lookup.c index 29cce456c7ce..43886fa00a2a 100644 --- a/fs/freevxfs/vxfs_lookup.c +++ b/fs/freevxfs/vxfs_lookup.c | |||
@@ -246,6 +246,8 @@ vxfs_readdir(struct file *fp, void *retp, filldir_t filler) | |||
246 | u_long page, npages, block, pblocks, nblocks, offset; | 246 | u_long page, npages, block, pblocks, nblocks, offset; |
247 | loff_t pos; | 247 | loff_t pos; |
248 | 248 | ||
249 | lock_kernel(); | ||
250 | |||
249 | switch ((long)fp->f_pos) { | 251 | switch ((long)fp->f_pos) { |
250 | case 0: | 252 | case 0: |
251 | if (filler(retp, ".", 1, fp->f_pos, ip->i_ino, DT_DIR) < 0) | 253 | if (filler(retp, ".", 1, fp->f_pos, ip->i_ino, DT_DIR) < 0) |
diff --git a/fs/fuse/control.c b/fs/fuse/control.c index a3bce3a77253..46fe60b2da23 100644 --- a/fs/fuse/control.c +++ b/fs/fuse/control.c | |||
@@ -105,7 +105,7 @@ static struct dentry *fuse_ctl_add_dentry(struct dentry *parent, | |||
105 | 105 | ||
106 | /* | 106 | /* |
107 | * Add a connection to the control filesystem (if it exists). Caller | 107 | * Add a connection to the control filesystem (if it exists). Caller |
108 | * must host fuse_mutex | 108 | * must hold fuse_mutex |
109 | */ | 109 | */ |
110 | int fuse_ctl_add_conn(struct fuse_conn *fc) | 110 | int fuse_ctl_add_conn(struct fuse_conn *fc) |
111 | { | 111 | { |
@@ -139,7 +139,7 @@ int fuse_ctl_add_conn(struct fuse_conn *fc) | |||
139 | 139 | ||
140 | /* | 140 | /* |
141 | * Remove a connection from the control filesystem (if it exists). | 141 | * Remove a connection from the control filesystem (if it exists). |
142 | * Caller must host fuse_mutex | 142 | * Caller must hold fuse_mutex |
143 | */ | 143 | */ |
144 | void fuse_ctl_remove_conn(struct fuse_conn *fc) | 144 | void fuse_ctl_remove_conn(struct fuse_conn *fc) |
145 | { | 145 | { |
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 72a74cde6de8..409ce6a7cca4 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c | |||
@@ -14,6 +14,33 @@ | |||
14 | #include <linux/sched.h> | 14 | #include <linux/sched.h> |
15 | #include <linux/namei.h> | 15 | #include <linux/namei.h> |
16 | 16 | ||
17 | #if BITS_PER_LONG >= 64 | ||
18 | static inline void fuse_dentry_settime(struct dentry *entry, u64 time) | ||
19 | { | ||
20 | entry->d_time = time; | ||
21 | } | ||
22 | |||
23 | static inline u64 fuse_dentry_time(struct dentry *entry) | ||
24 | { | ||
25 | return entry->d_time; | ||
26 | } | ||
27 | #else | ||
28 | /* | ||
29 | * On 32 bit archs store the high 32 bits of time in d_fsdata | ||
30 | */ | ||
31 | static void fuse_dentry_settime(struct dentry *entry, u64 time) | ||
32 | { | ||
33 | entry->d_time = time; | ||
34 | entry->d_fsdata = (void *) (unsigned long) (time >> 32); | ||
35 | } | ||
36 | |||
37 | static u64 fuse_dentry_time(struct dentry *entry) | ||
38 | { | ||
39 | return (u64) entry->d_time + | ||
40 | ((u64) (unsigned long) entry->d_fsdata << 32); | ||
41 | } | ||
42 | #endif | ||
43 | |||
17 | /* | 44 | /* |
18 | * FUSE caches dentries and attributes with separate timeout. The | 45 | * FUSE caches dentries and attributes with separate timeout. The |
19 | * time in jiffies until the dentry/attributes are valid is stored in | 46 | * time in jiffies until the dentry/attributes are valid is stored in |
@@ -23,10 +50,13 @@ | |||
23 | /* | 50 | /* |
24 | * Calculate the time in jiffies until a dentry/attributes are valid | 51 | * Calculate the time in jiffies until a dentry/attributes are valid |
25 | */ | 52 | */ |
26 | static unsigned long time_to_jiffies(unsigned long sec, unsigned long nsec) | 53 | static u64 time_to_jiffies(unsigned long sec, unsigned long nsec) |
27 | { | 54 | { |
28 | struct timespec ts = {sec, nsec}; | 55 | if (sec || nsec) { |
29 | return jiffies + timespec_to_jiffies(&ts); | 56 | struct timespec ts = {sec, nsec}; |
57 | return get_jiffies_64() + timespec_to_jiffies(&ts); | ||
58 | } else | ||
59 | return 0; | ||
30 | } | 60 | } |
31 | 61 | ||
32 | /* | 62 | /* |
@@ -35,7 +65,8 @@ static unsigned long time_to_jiffies(unsigned long sec, unsigned long nsec) | |||
35 | */ | 65 | */ |
36 | static void fuse_change_timeout(struct dentry *entry, struct fuse_entry_out *o) | 66 | static void fuse_change_timeout(struct dentry *entry, struct fuse_entry_out *o) |
37 | { | 67 | { |
38 | entry->d_time = time_to_jiffies(o->entry_valid, o->entry_valid_nsec); | 68 | fuse_dentry_settime(entry, |
69 | time_to_jiffies(o->entry_valid, o->entry_valid_nsec)); | ||
39 | if (entry->d_inode) | 70 | if (entry->d_inode) |
40 | get_fuse_inode(entry->d_inode)->i_time = | 71 | get_fuse_inode(entry->d_inode)->i_time = |
41 | time_to_jiffies(o->attr_valid, o->attr_valid_nsec); | 72 | time_to_jiffies(o->attr_valid, o->attr_valid_nsec); |
@@ -47,7 +78,7 @@ static void fuse_change_timeout(struct dentry *entry, struct fuse_entry_out *o) | |||
47 | */ | 78 | */ |
48 | void fuse_invalidate_attr(struct inode *inode) | 79 | void fuse_invalidate_attr(struct inode *inode) |
49 | { | 80 | { |
50 | get_fuse_inode(inode)->i_time = jiffies - 1; | 81 | get_fuse_inode(inode)->i_time = 0; |
51 | } | 82 | } |
52 | 83 | ||
53 | /* | 84 | /* |
@@ -60,7 +91,7 @@ void fuse_invalidate_attr(struct inode *inode) | |||
60 | */ | 91 | */ |
61 | static void fuse_invalidate_entry_cache(struct dentry *entry) | 92 | static void fuse_invalidate_entry_cache(struct dentry *entry) |
62 | { | 93 | { |
63 | entry->d_time = jiffies - 1; | 94 | fuse_dentry_settime(entry, 0); |
64 | } | 95 | } |
65 | 96 | ||
66 | /* | 97 | /* |
@@ -102,7 +133,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd) | |||
102 | 133 | ||
103 | if (inode && is_bad_inode(inode)) | 134 | if (inode && is_bad_inode(inode)) |
104 | return 0; | 135 | return 0; |
105 | else if (time_after(jiffies, entry->d_time)) { | 136 | else if (fuse_dentry_time(entry) < get_jiffies_64()) { |
106 | int err; | 137 | int err; |
107 | struct fuse_entry_out outarg; | 138 | struct fuse_entry_out outarg; |
108 | struct fuse_conn *fc; | 139 | struct fuse_conn *fc; |
@@ -666,7 +697,7 @@ static int fuse_revalidate(struct dentry *entry) | |||
666 | if (!fuse_allow_task(fc, current)) | 697 | if (!fuse_allow_task(fc, current)) |
667 | return -EACCES; | 698 | return -EACCES; |
668 | if (get_node_id(inode) != FUSE_ROOT_ID && | 699 | if (get_node_id(inode) != FUSE_ROOT_ID && |
669 | time_before_eq(jiffies, fi->i_time)) | 700 | fi->i_time >= get_jiffies_64()) |
670 | return 0; | 701 | return 0; |
671 | 702 | ||
672 | return fuse_do_getattr(inode); | 703 | return fuse_do_getattr(inode); |
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 63614ed16336..5c4fcd1dbf59 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -395,14 +395,16 @@ static int fuse_readpages(struct file *file, struct address_space *mapping, | |||
395 | struct fuse_readpages_data data; | 395 | struct fuse_readpages_data data; |
396 | int err; | 396 | int err; |
397 | 397 | ||
398 | err = -EIO; | ||
398 | if (is_bad_inode(inode)) | 399 | if (is_bad_inode(inode)) |
399 | return -EIO; | 400 | goto clean_pages_up; |
400 | 401 | ||
401 | data.file = file; | 402 | data.file = file; |
402 | data.inode = inode; | 403 | data.inode = inode; |
403 | data.req = fuse_get_req(fc); | 404 | data.req = fuse_get_req(fc); |
405 | err = PTR_ERR(data.req); | ||
404 | if (IS_ERR(data.req)) | 406 | if (IS_ERR(data.req)) |
405 | return PTR_ERR(data.req); | 407 | goto clean_pages_up; |
406 | 408 | ||
407 | err = read_cache_pages(mapping, pages, fuse_readpages_fill, &data); | 409 | err = read_cache_pages(mapping, pages, fuse_readpages_fill, &data); |
408 | if (!err) { | 410 | if (!err) { |
@@ -412,6 +414,10 @@ static int fuse_readpages(struct file *file, struct address_space *mapping, | |||
412 | fuse_put_request(fc, data.req); | 414 | fuse_put_request(fc, data.req); |
413 | } | 415 | } |
414 | return err; | 416 | return err; |
417 | |||
418 | clean_pages_up: | ||
419 | put_pages_list(pages); | ||
420 | return err; | ||
415 | } | 421 | } |
416 | 422 | ||
417 | static size_t fuse_send_write(struct fuse_req *req, struct file *file, | 423 | static size_t fuse_send_write(struct fuse_req *req, struct file *file, |
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index 0dbf96621841..69c7750d55b8 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h | |||
@@ -59,7 +59,7 @@ struct fuse_inode { | |||
59 | struct fuse_req *forget_req; | 59 | struct fuse_req *forget_req; |
60 | 60 | ||
61 | /** Time in jiffies until the file attributes are valid */ | 61 | /** Time in jiffies until the file attributes are valid */ |
62 | unsigned long i_time; | 62 | u64 i_time; |
63 | }; | 63 | }; |
64 | 64 | ||
65 | /** FUSE specific file data */ | 65 | /** FUSE specific file data */ |
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index dcaaabd3b9c4..7d25092262ae 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
@@ -51,7 +51,7 @@ static struct inode *fuse_alloc_inode(struct super_block *sb) | |||
51 | return NULL; | 51 | return NULL; |
52 | 52 | ||
53 | fi = get_fuse_inode(inode); | 53 | fi = get_fuse_inode(inode); |
54 | fi->i_time = jiffies - 1; | 54 | fi->i_time = 0; |
55 | fi->nodeid = 0; | 55 | fi->nodeid = 0; |
56 | fi->nlookup = 0; | 56 | fi->nlookup = 0; |
57 | fi->forget_req = fuse_request_alloc(); | 57 | fi->forget_req = fuse_request_alloc(); |
diff --git a/fs/inotify_user.c b/fs/inotify_user.c index f2386442adee..017cb0f134d6 100644 --- a/fs/inotify_user.c +++ b/fs/inotify_user.c | |||
@@ -187,7 +187,7 @@ static struct inotify_kernel_event * kernel_event(s32 wd, u32 mask, u32 cookie, | |||
187 | { | 187 | { |
188 | struct inotify_kernel_event *kevent; | 188 | struct inotify_kernel_event *kevent; |
189 | 189 | ||
190 | kevent = kmem_cache_alloc(event_cachep, GFP_KERNEL); | 190 | kevent = kmem_cache_alloc(event_cachep, GFP_NOFS); |
191 | if (unlikely(!kevent)) | 191 | if (unlikely(!kevent)) |
192 | return NULL; | 192 | return NULL; |
193 | 193 | ||
diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index 43e3f566aad6..a223cf4faa9b 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c | |||
@@ -168,16 +168,15 @@ void jfs_dirty_inode(struct inode *inode) | |||
168 | set_cflag(COMMIT_Dirty, inode); | 168 | set_cflag(COMMIT_Dirty, inode); |
169 | } | 169 | } |
170 | 170 | ||
171 | static int | 171 | int jfs_get_block(struct inode *ip, sector_t lblock, |
172 | jfs_get_blocks(struct inode *ip, sector_t lblock, unsigned long max_blocks, | 172 | struct buffer_head *bh_result, int create) |
173 | struct buffer_head *bh_result, int create) | ||
174 | { | 173 | { |
175 | s64 lblock64 = lblock; | 174 | s64 lblock64 = lblock; |
176 | int rc = 0; | 175 | int rc = 0; |
177 | xad_t xad; | 176 | xad_t xad; |
178 | s64 xaddr; | 177 | s64 xaddr; |
179 | int xflag; | 178 | int xflag; |
180 | s32 xlen = max_blocks; | 179 | s32 xlen = bh_result->b_size >> ip->i_blkbits; |
181 | 180 | ||
182 | /* | 181 | /* |
183 | * Take appropriate lock on inode | 182 | * Take appropriate lock on inode |
@@ -188,7 +187,7 @@ jfs_get_blocks(struct inode *ip, sector_t lblock, unsigned long max_blocks, | |||
188 | IREAD_LOCK(ip); | 187 | IREAD_LOCK(ip); |
189 | 188 | ||
190 | if (((lblock64 << ip->i_sb->s_blocksize_bits) < ip->i_size) && | 189 | if (((lblock64 << ip->i_sb->s_blocksize_bits) < ip->i_size) && |
191 | (!xtLookup(ip, lblock64, max_blocks, &xflag, &xaddr, &xlen, 0)) && | 190 | (!xtLookup(ip, lblock64, xlen, &xflag, &xaddr, &xlen, 0)) && |
192 | xaddr) { | 191 | xaddr) { |
193 | if (xflag & XAD_NOTRECORDED) { | 192 | if (xflag & XAD_NOTRECORDED) { |
194 | if (!create) | 193 | if (!create) |
@@ -255,13 +254,6 @@ jfs_get_blocks(struct inode *ip, sector_t lblock, unsigned long max_blocks, | |||
255 | return rc; | 254 | return rc; |
256 | } | 255 | } |
257 | 256 | ||
258 | static int jfs_get_block(struct inode *ip, sector_t lblock, | ||
259 | struct buffer_head *bh_result, int create) | ||
260 | { | ||
261 | return jfs_get_blocks(ip, lblock, bh_result->b_size >> ip->i_blkbits, | ||
262 | bh_result, create); | ||
263 | } | ||
264 | |||
265 | static int jfs_writepage(struct page *page, struct writeback_control *wbc) | 257 | static int jfs_writepage(struct page *page, struct writeback_control *wbc) |
266 | { | 258 | { |
267 | return nobh_writepage(page, jfs_get_block, wbc); | 259 | return nobh_writepage(page, jfs_get_block, wbc); |
diff --git a/fs/jfs/jfs_inode.h b/fs/jfs/jfs_inode.h index b5c7da6190dc..1fc48df670c8 100644 --- a/fs/jfs/jfs_inode.h +++ b/fs/jfs/jfs_inode.h | |||
@@ -32,6 +32,7 @@ extern void jfs_truncate_nolock(struct inode *, loff_t); | |||
32 | extern void jfs_free_zero_link(struct inode *); | 32 | extern void jfs_free_zero_link(struct inode *); |
33 | extern struct dentry *jfs_get_parent(struct dentry *dentry); | 33 | extern struct dentry *jfs_get_parent(struct dentry *dentry); |
34 | extern void jfs_set_inode_flags(struct inode *); | 34 | extern void jfs_set_inode_flags(struct inode *); |
35 | extern int jfs_get_block(struct inode *, sector_t, struct buffer_head *, int); | ||
35 | 36 | ||
36 | extern const struct address_space_operations jfs_aops; | 37 | extern const struct address_space_operations jfs_aops; |
37 | extern struct inode_operations jfs_dir_inode_operations; | 38 | extern struct inode_operations jfs_dir_inode_operations; |
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 4f6cfebc82db..143bcd1d5eaa 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/moduleparam.h> | 26 | #include <linux/moduleparam.h> |
27 | #include <linux/kthread.h> | 27 | #include <linux/kthread.h> |
28 | #include <linux/posix_acl.h> | 28 | #include <linux/posix_acl.h> |
29 | #include <linux/buffer_head.h> | ||
29 | #include <asm/uaccess.h> | 30 | #include <asm/uaccess.h> |
30 | #include <linux/seq_file.h> | 31 | #include <linux/seq_file.h> |
31 | 32 | ||
@@ -298,7 +299,7 @@ static int parse_options(char *options, struct super_block *sb, s64 *newLVSize, | |||
298 | break; | 299 | break; |
299 | } | 300 | } |
300 | 301 | ||
301 | #if defined(CONFIG_QUOTA) | 302 | #ifdef CONFIG_QUOTA |
302 | case Opt_quota: | 303 | case Opt_quota: |
303 | case Opt_usrquota: | 304 | case Opt_usrquota: |
304 | *flag |= JFS_USRQUOTA; | 305 | *flag |= JFS_USRQUOTA; |
@@ -597,7 +598,7 @@ static int jfs_show_options(struct seq_file *seq, struct vfsmount *vfs) | |||
597 | if (sbi->flag & JFS_NOINTEGRITY) | 598 | if (sbi->flag & JFS_NOINTEGRITY) |
598 | seq_puts(seq, ",nointegrity"); | 599 | seq_puts(seq, ",nointegrity"); |
599 | 600 | ||
600 | #if defined(CONFIG_QUOTA) | 601 | #ifdef CONFIG_QUOTA |
601 | if (sbi->flag & JFS_USRQUOTA) | 602 | if (sbi->flag & JFS_USRQUOTA) |
602 | seq_puts(seq, ",usrquota"); | 603 | seq_puts(seq, ",usrquota"); |
603 | 604 | ||
@@ -608,6 +609,113 @@ static int jfs_show_options(struct seq_file *seq, struct vfsmount *vfs) | |||
608 | return 0; | 609 | return 0; |
609 | } | 610 | } |
610 | 611 | ||
612 | #ifdef CONFIG_QUOTA | ||
613 | |||
614 | /* Read data from quotafile - avoid pagecache and such because we cannot afford | ||
615 | * acquiring the locks... As quota files are never truncated and quota code | ||
616 | * itself serializes the operations (and noone else should touch the files) | ||
617 | * we don't have to be afraid of races */ | ||
618 | static ssize_t jfs_quota_read(struct super_block *sb, int type, char *data, | ||
619 | size_t len, loff_t off) | ||
620 | { | ||
621 | struct inode *inode = sb_dqopt(sb)->files[type]; | ||
622 | sector_t blk = off >> sb->s_blocksize_bits; | ||
623 | int err = 0; | ||
624 | int offset = off & (sb->s_blocksize - 1); | ||
625 | int tocopy; | ||
626 | size_t toread; | ||
627 | struct buffer_head tmp_bh; | ||
628 | struct buffer_head *bh; | ||
629 | loff_t i_size = i_size_read(inode); | ||
630 | |||
631 | if (off > i_size) | ||
632 | return 0; | ||
633 | if (off+len > i_size) | ||
634 | len = i_size-off; | ||
635 | toread = len; | ||
636 | while (toread > 0) { | ||
637 | tocopy = sb->s_blocksize - offset < toread ? | ||
638 | sb->s_blocksize - offset : toread; | ||
639 | |||
640 | tmp_bh.b_state = 0; | ||
641 | tmp_bh.b_size = 1 << inode->i_blkbits; | ||
642 | err = jfs_get_block(inode, blk, &tmp_bh, 0); | ||
643 | if (err) | ||
644 | return err; | ||
645 | if (!buffer_mapped(&tmp_bh)) /* A hole? */ | ||
646 | memset(data, 0, tocopy); | ||
647 | else { | ||
648 | bh = sb_bread(sb, tmp_bh.b_blocknr); | ||
649 | if (!bh) | ||
650 | return -EIO; | ||
651 | memcpy(data, bh->b_data+offset, tocopy); | ||
652 | brelse(bh); | ||
653 | } | ||
654 | offset = 0; | ||
655 | toread -= tocopy; | ||
656 | data += tocopy; | ||
657 | blk++; | ||
658 | } | ||
659 | return len; | ||
660 | } | ||
661 | |||
662 | /* Write to quotafile */ | ||
663 | static ssize_t jfs_quota_write(struct super_block *sb, int type, | ||
664 | const char *data, size_t len, loff_t off) | ||
665 | { | ||
666 | struct inode *inode = sb_dqopt(sb)->files[type]; | ||
667 | sector_t blk = off >> sb->s_blocksize_bits; | ||
668 | int err = 0; | ||
669 | int offset = off & (sb->s_blocksize - 1); | ||
670 | int tocopy; | ||
671 | size_t towrite = len; | ||
672 | struct buffer_head tmp_bh; | ||
673 | struct buffer_head *bh; | ||
674 | |||
675 | mutex_lock(&inode->i_mutex); | ||
676 | while (towrite > 0) { | ||
677 | tocopy = sb->s_blocksize - offset < towrite ? | ||
678 | sb->s_blocksize - offset : towrite; | ||
679 | |||
680 | tmp_bh.b_state = 0; | ||
681 | tmp_bh.b_size = 1 << inode->i_blkbits; | ||
682 | err = jfs_get_block(inode, blk, &tmp_bh, 1); | ||
683 | if (err) | ||
684 | goto out; | ||
685 | if (offset || tocopy != sb->s_blocksize) | ||
686 | bh = sb_bread(sb, tmp_bh.b_blocknr); | ||
687 | else | ||
688 | bh = sb_getblk(sb, tmp_bh.b_blocknr); | ||
689 | if (!bh) { | ||
690 | err = -EIO; | ||
691 | goto out; | ||
692 | } | ||
693 | lock_buffer(bh); | ||
694 | memcpy(bh->b_data+offset, data, tocopy); | ||
695 | flush_dcache_page(bh->b_page); | ||
696 | set_buffer_uptodate(bh); | ||
697 | mark_buffer_dirty(bh); | ||
698 | unlock_buffer(bh); | ||
699 | brelse(bh); | ||
700 | offset = 0; | ||
701 | towrite -= tocopy; | ||
702 | data += tocopy; | ||
703 | blk++; | ||
704 | } | ||
705 | out: | ||
706 | if (len == towrite) | ||
707 | return err; | ||
708 | if (inode->i_size < off+len-towrite) | ||
709 | i_size_write(inode, off+len-towrite); | ||
710 | inode->i_version++; | ||
711 | inode->i_mtime = inode->i_ctime = CURRENT_TIME; | ||
712 | mark_inode_dirty(inode); | ||
713 | mutex_unlock(&inode->i_mutex); | ||
714 | return len - towrite; | ||
715 | } | ||
716 | |||
717 | #endif | ||
718 | |||
611 | static struct super_operations jfs_super_operations = { | 719 | static struct super_operations jfs_super_operations = { |
612 | .alloc_inode = jfs_alloc_inode, | 720 | .alloc_inode = jfs_alloc_inode, |
613 | .destroy_inode = jfs_destroy_inode, | 721 | .destroy_inode = jfs_destroy_inode, |
@@ -621,7 +729,11 @@ static struct super_operations jfs_super_operations = { | |||
621 | .unlockfs = jfs_unlockfs, | 729 | .unlockfs = jfs_unlockfs, |
622 | .statfs = jfs_statfs, | 730 | .statfs = jfs_statfs, |
623 | .remount_fs = jfs_remount, | 731 | .remount_fs = jfs_remount, |
624 | .show_options = jfs_show_options | 732 | .show_options = jfs_show_options, |
733 | #ifdef CONFIG_QUOTA | ||
734 | .quota_read = jfs_quota_read, | ||
735 | .quota_write = jfs_quota_write, | ||
736 | #endif | ||
625 | }; | 737 | }; |
626 | 738 | ||
627 | static struct export_operations jfs_export_operations = { | 739 | static struct export_operations jfs_export_operations = { |
diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c index baf5ae513481..c9d419703cf3 100644 --- a/fs/lockd/svclock.c +++ b/fs/lockd/svclock.c | |||
@@ -638,9 +638,6 @@ static void nlmsvc_grant_callback(struct rpc_task *task, void *data) | |||
638 | if (task->tk_status < 0) { | 638 | if (task->tk_status < 0) { |
639 | /* RPC error: Re-insert for retransmission */ | 639 | /* RPC error: Re-insert for retransmission */ |
640 | timeout = 10 * HZ; | 640 | timeout = 10 * HZ; |
641 | } else if (block->b_done) { | ||
642 | /* Block already removed, kill it for real */ | ||
643 | timeout = 0; | ||
644 | } else { | 641 | } else { |
645 | /* Call was successful, now wait for client callback */ | 642 | /* Call was successful, now wait for client callback */ |
646 | timeout = 60 * HZ; | 643 | timeout = 60 * HZ; |
@@ -709,13 +706,10 @@ nlmsvc_retry_blocked(void) | |||
709 | break; | 706 | break; |
710 | if (time_after(block->b_when,jiffies)) | 707 | if (time_after(block->b_when,jiffies)) |
711 | break; | 708 | break; |
712 | dprintk("nlmsvc_retry_blocked(%p, when=%ld, done=%d)\n", | 709 | dprintk("nlmsvc_retry_blocked(%p, when=%ld)\n", |
713 | block, block->b_when, block->b_done); | 710 | block, block->b_when); |
714 | kref_get(&block->b_count); | 711 | kref_get(&block->b_count); |
715 | if (block->b_done) | 712 | nlmsvc_grant_blocked(block); |
716 | nlmsvc_unlink_block(block); | ||
717 | else | ||
718 | nlmsvc_grant_blocked(block); | ||
719 | nlmsvc_release_block(block); | 713 | nlmsvc_release_block(block); |
720 | } | 714 | } |
721 | 715 | ||
diff --git a/fs/locks.c b/fs/locks.c index b0b41a64e10b..d7c53392cac1 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
@@ -1421,8 +1421,9 @@ static int __setlease(struct file *filp, long arg, struct file_lock **flp) | |||
1421 | if (!leases_enable) | 1421 | if (!leases_enable) |
1422 | goto out; | 1422 | goto out; |
1423 | 1423 | ||
1424 | error = lease_alloc(filp, arg, &fl); | 1424 | error = -ENOMEM; |
1425 | if (error) | 1425 | fl = locks_alloc_lock(); |
1426 | if (fl == NULL) | ||
1426 | goto out; | 1427 | goto out; |
1427 | 1428 | ||
1428 | locks_copy_lock(fl, lease); | 1429 | locks_copy_lock(fl, lease); |
@@ -1430,6 +1431,7 @@ static int __setlease(struct file *filp, long arg, struct file_lock **flp) | |||
1430 | locks_insert_lock(before, fl); | 1431 | locks_insert_lock(before, fl); |
1431 | 1432 | ||
1432 | *flp = fl; | 1433 | *flp = fl; |
1434 | error = 0; | ||
1433 | out: | 1435 | out: |
1434 | return error; | 1436 | return error; |
1435 | } | 1437 | } |
diff --git a/fs/namei.c b/fs/namei.c index e01070d7bf58..55a131230f94 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -159,7 +159,7 @@ char * getname(const char __user * filename) | |||
159 | #ifdef CONFIG_AUDITSYSCALL | 159 | #ifdef CONFIG_AUDITSYSCALL |
160 | void putname(const char *name) | 160 | void putname(const char *name) |
161 | { | 161 | { |
162 | if (unlikely(current->audit_context)) | 162 | if (unlikely(!audit_dummy_context())) |
163 | audit_putname(name); | 163 | audit_putname(name); |
164 | else | 164 | else |
165 | __putname(name); | 165 | __putname(name); |
@@ -1125,7 +1125,7 @@ static int fastcall do_path_lookup(int dfd, const char *name, | |||
1125 | retval = link_path_walk(name, nd); | 1125 | retval = link_path_walk(name, nd); |
1126 | out: | 1126 | out: |
1127 | if (likely(retval == 0)) { | 1127 | if (likely(retval == 0)) { |
1128 | if (unlikely(current->audit_context && nd && nd->dentry && | 1128 | if (unlikely(!audit_dummy_context() && nd && nd->dentry && |
1129 | nd->dentry->d_inode)) | 1129 | nd->dentry->d_inode)) |
1130 | audit_inode(name, nd->dentry->d_inode); | 1130 | audit_inode(name, nd->dentry->d_inode); |
1131 | } | 1131 | } |
@@ -1357,7 +1357,7 @@ static int may_delete(struct inode *dir,struct dentry *victim,int isdir) | |||
1357 | return -ENOENT; | 1357 | return -ENOENT; |
1358 | 1358 | ||
1359 | BUG_ON(victim->d_parent->d_inode != dir); | 1359 | BUG_ON(victim->d_parent->d_inode != dir); |
1360 | audit_inode_child(victim->d_name.name, victim->d_inode, dir->i_ino); | 1360 | audit_inode_child(victim->d_name.name, victim->d_inode, dir); |
1361 | 1361 | ||
1362 | error = permission(dir,MAY_WRITE | MAY_EXEC, NULL); | 1362 | error = permission(dir,MAY_WRITE | MAY_EXEC, NULL); |
1363 | if (error) | 1363 | if (error) |
@@ -1659,6 +1659,7 @@ do_last: | |||
1659 | * It already exists. | 1659 | * It already exists. |
1660 | */ | 1660 | */ |
1661 | mutex_unlock(&dir->d_inode->i_mutex); | 1661 | mutex_unlock(&dir->d_inode->i_mutex); |
1662 | audit_inode_update(path.dentry->d_inode); | ||
1662 | 1663 | ||
1663 | error = -EEXIST; | 1664 | error = -EEXIST; |
1664 | if (flag & O_EXCL) | 1665 | if (flag & O_EXCL) |
@@ -1669,6 +1670,7 @@ do_last: | |||
1669 | if (flag & O_NOFOLLOW) | 1670 | if (flag & O_NOFOLLOW) |
1670 | goto exit_dput; | 1671 | goto exit_dput; |
1671 | } | 1672 | } |
1673 | |||
1672 | error = -ENOENT; | 1674 | error = -ENOENT; |
1673 | if (!path.dentry->d_inode) | 1675 | if (!path.dentry->d_inode) |
1674 | goto exit_dput; | 1676 | goto exit_dput; |
diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c index 19b98ca468eb..86b3169c8cac 100644 --- a/fs/nfs/namespace.c +++ b/fs/nfs/namespace.c | |||
@@ -51,7 +51,7 @@ char *nfs_path(const char *base, const struct dentry *dentry, | |||
51 | namelen = dentry->d_name.len; | 51 | namelen = dentry->d_name.len; |
52 | buflen -= namelen + 1; | 52 | buflen -= namelen + 1; |
53 | if (buflen < 0) | 53 | if (buflen < 0) |
54 | goto Elong; | 54 | goto Elong_unlock; |
55 | end -= namelen; | 55 | end -= namelen; |
56 | memcpy(end, dentry->d_name.name, namelen); | 56 | memcpy(end, dentry->d_name.name, namelen); |
57 | *--end = '/'; | 57 | *--end = '/'; |
@@ -68,6 +68,8 @@ char *nfs_path(const char *base, const struct dentry *dentry, | |||
68 | end -= namelen; | 68 | end -= namelen; |
69 | memcpy(end, base, namelen); | 69 | memcpy(end, base, namelen); |
70 | return end; | 70 | return end; |
71 | Elong_unlock: | ||
72 | spin_unlock(&dcache_lock); | ||
71 | Elong: | 73 | Elong: |
72 | return ERR_PTR(-ENAMETOOLONG); | 74 | return ERR_PTR(-ENAMETOOLONG); |
73 | } | 75 | } |
diff --git a/fs/nfs/read.c b/fs/nfs/read.c index 52bf634260a1..65c0c5b32351 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c | |||
@@ -63,7 +63,7 @@ struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount) | |||
63 | return p; | 63 | return p; |
64 | } | 64 | } |
65 | 65 | ||
66 | void nfs_readdata_free(struct nfs_read_data *p) | 66 | static void nfs_readdata_free(struct nfs_read_data *p) |
67 | { | 67 | { |
68 | if (p && (p->pagevec != &p->page_array[0])) | 68 | if (p && (p->pagevec != &p->page_array[0])) |
69 | kfree(p->pagevec); | 69 | kfree(p->pagevec); |
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 86bac6a5008e..50774991f8d5 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
@@ -137,7 +137,7 @@ struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount) | |||
137 | return p; | 137 | return p; |
138 | } | 138 | } |
139 | 139 | ||
140 | void nfs_writedata_free(struct nfs_write_data *p) | 140 | static void nfs_writedata_free(struct nfs_write_data *p) |
141 | { | 141 | { |
142 | if (p && (p->pagevec != &p->page_array[0])) | 142 | if (p && (p->pagevec != &p->page_array[0])) |
143 | kfree(p->pagevec); | 143 | kfree(p->pagevec); |
diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index ecc439d2565f..501d83884530 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c | |||
@@ -187,6 +187,11 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) | |||
187 | goto out; | 187 | goto out; |
188 | } | 188 | } |
189 | 189 | ||
190 | /* Set user creds for this exportpoint */ | ||
191 | error = nfserrno(nfsd_setuser(rqstp, exp)); | ||
192 | if (error) | ||
193 | goto out; | ||
194 | |||
190 | /* | 195 | /* |
191 | * Look up the dentry using the NFS file handle. | 196 | * Look up the dentry using the NFS file handle. |
192 | */ | 197 | */ |
@@ -241,16 +246,17 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) | |||
241 | dprintk("nfsd: fh_verify - just checking\n"); | 246 | dprintk("nfsd: fh_verify - just checking\n"); |
242 | dentry = fhp->fh_dentry; | 247 | dentry = fhp->fh_dentry; |
243 | exp = fhp->fh_export; | 248 | exp = fhp->fh_export; |
249 | /* Set user creds for this exportpoint; necessary even | ||
250 | * in the "just checking" case because this may be a | ||
251 | * filehandle that was created by fh_compose, and that | ||
252 | * is about to be used in another nfsv4 compound | ||
253 | * operation */ | ||
254 | error = nfserrno(nfsd_setuser(rqstp, exp)); | ||
255 | if (error) | ||
256 | goto out; | ||
244 | } | 257 | } |
245 | cache_get(&exp->h); | 258 | cache_get(&exp->h); |
246 | 259 | ||
247 | /* Set user creds for this exportpoint; necessary even in the "just | ||
248 | * checking" case because this may be a filehandle that was created by | ||
249 | * fh_compose, and that is about to be used in another nfsv4 compound | ||
250 | * operation */ | ||
251 | error = nfserrno(nfsd_setuser(rqstp, exp)); | ||
252 | if (error) | ||
253 | goto out; | ||
254 | 260 | ||
255 | error = nfsd_mode_check(rqstp, dentry->d_inode->i_mode, type); | 261 | error = nfsd_mode_check(rqstp, dentry->d_inode->i_mode, type); |
256 | if (error) | 262 | if (error) |
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index 1b8346dd0572..9503240ef0e5 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
@@ -2375,7 +2375,6 @@ leave: | |||
2375 | mlog(0, "returning %d\n", ret); | 2375 | mlog(0, "returning %d\n", ret); |
2376 | return ret; | 2376 | return ret; |
2377 | } | 2377 | } |
2378 | EXPORT_SYMBOL_GPL(dlm_migrate_lockres); | ||
2379 | 2378 | ||
2380 | int dlm_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock) | 2379 | int dlm_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock) |
2381 | { | 2380 | { |
diff --git a/fs/ocfs2/dlm/dlmunlock.c b/fs/ocfs2/dlm/dlmunlock.c index b0c3134f4f70..37be4b2e0d4a 100644 --- a/fs/ocfs2/dlm/dlmunlock.c +++ b/fs/ocfs2/dlm/dlmunlock.c | |||
@@ -155,7 +155,7 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm, | |||
155 | else | 155 | else |
156 | status = dlm_get_unlock_actions(dlm, res, lock, lksb, &actions); | 156 | status = dlm_get_unlock_actions(dlm, res, lock, lksb, &actions); |
157 | 157 | ||
158 | if (status != DLM_NORMAL) | 158 | if (status != DLM_NORMAL && (status != DLM_CANCELGRANT || !master_node)) |
159 | goto leave; | 159 | goto leave; |
160 | 160 | ||
161 | /* By now this has been masked out of cancel requests. */ | 161 | /* By now this has been masked out of cancel requests. */ |
@@ -183,8 +183,7 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm, | |||
183 | spin_lock(&lock->spinlock); | 183 | spin_lock(&lock->spinlock); |
184 | /* if the master told us the lock was already granted, | 184 | /* if the master told us the lock was already granted, |
185 | * let the ast handle all of these actions */ | 185 | * let the ast handle all of these actions */ |
186 | if (status == DLM_NORMAL && | 186 | if (status == DLM_CANCELGRANT) { |
187 | lksb->status == DLM_CANCELGRANT) { | ||
188 | actions &= ~(DLM_UNLOCK_REMOVE_LOCK| | 187 | actions &= ~(DLM_UNLOCK_REMOVE_LOCK| |
189 | DLM_UNLOCK_REGRANT_LOCK| | 188 | DLM_UNLOCK_REGRANT_LOCK| |
190 | DLM_UNLOCK_CLEAR_CONVERT_TYPE); | 189 | DLM_UNLOCK_CLEAR_CONVERT_TYPE); |
@@ -349,14 +348,9 @@ static enum dlm_status dlm_send_remote_unlock_request(struct dlm_ctxt *dlm, | |||
349 | vec, veclen, owner, &status); | 348 | vec, veclen, owner, &status); |
350 | if (tmpret >= 0) { | 349 | if (tmpret >= 0) { |
351 | // successfully sent and received | 350 | // successfully sent and received |
352 | if (status == DLM_CANCELGRANT) | 351 | if (status == DLM_FORWARD) |
353 | ret = DLM_NORMAL; | ||
354 | else if (status == DLM_FORWARD) { | ||
355 | mlog(0, "master was in-progress. retry\n"); | 352 | mlog(0, "master was in-progress. retry\n"); |
356 | ret = DLM_FORWARD; | 353 | ret = status; |
357 | } else | ||
358 | ret = status; | ||
359 | lksb->status = status; | ||
360 | } else { | 354 | } else { |
361 | mlog_errno(tmpret); | 355 | mlog_errno(tmpret); |
362 | if (dlm_is_host_down(tmpret)) { | 356 | if (dlm_is_host_down(tmpret)) { |
@@ -372,7 +366,6 @@ static enum dlm_status dlm_send_remote_unlock_request(struct dlm_ctxt *dlm, | |||
372 | /* something bad. this will BUG in ocfs2 */ | 366 | /* something bad. this will BUG in ocfs2 */ |
373 | ret = dlm_err_to_dlm_status(tmpret); | 367 | ret = dlm_err_to_dlm_status(tmpret); |
374 | } | 368 | } |
375 | lksb->status = ret; | ||
376 | } | 369 | } |
377 | 370 | ||
378 | return ret; | 371 | return ret; |
@@ -483,6 +476,10 @@ int dlm_unlock_lock_handler(struct o2net_msg *msg, u32 len, void *data) | |||
483 | 476 | ||
484 | /* lock was found on queue */ | 477 | /* lock was found on queue */ |
485 | lksb = lock->lksb; | 478 | lksb = lock->lksb; |
479 | if (flags & (LKM_VALBLK|LKM_PUT_LVB) && | ||
480 | lock->ml.type != LKM_EXMODE) | ||
481 | flags &= ~(LKM_VALBLK|LKM_PUT_LVB); | ||
482 | |||
486 | /* unlockast only called on originating node */ | 483 | /* unlockast only called on originating node */ |
487 | if (flags & LKM_PUT_LVB) { | 484 | if (flags & LKM_PUT_LVB) { |
488 | lksb->flags |= DLM_LKSB_PUT_LVB; | 485 | lksb->flags |= DLM_LKSB_PUT_LVB; |
@@ -507,11 +504,8 @@ not_found: | |||
507 | "cookie=%u:%llu\n", | 504 | "cookie=%u:%llu\n", |
508 | dlm_get_lock_cookie_node(unlock->cookie), | 505 | dlm_get_lock_cookie_node(unlock->cookie), |
509 | dlm_get_lock_cookie_seq(unlock->cookie)); | 506 | dlm_get_lock_cookie_seq(unlock->cookie)); |
510 | else { | 507 | else |
511 | /* send the lksb->status back to the other node */ | ||
512 | status = lksb->status; | ||
513 | dlm_lock_put(lock); | 508 | dlm_lock_put(lock); |
514 | } | ||
515 | 509 | ||
516 | leave: | 510 | leave: |
517 | if (res) | 511 | if (res) |
@@ -533,26 +527,22 @@ static enum dlm_status dlm_get_cancel_actions(struct dlm_ctxt *dlm, | |||
533 | 527 | ||
534 | if (dlm_lock_on_list(&res->blocked, lock)) { | 528 | if (dlm_lock_on_list(&res->blocked, lock)) { |
535 | /* cancel this outright */ | 529 | /* cancel this outright */ |
536 | lksb->status = DLM_NORMAL; | ||
537 | status = DLM_NORMAL; | 530 | status = DLM_NORMAL; |
538 | *actions = (DLM_UNLOCK_CALL_AST | | 531 | *actions = (DLM_UNLOCK_CALL_AST | |
539 | DLM_UNLOCK_REMOVE_LOCK); | 532 | DLM_UNLOCK_REMOVE_LOCK); |
540 | } else if (dlm_lock_on_list(&res->converting, lock)) { | 533 | } else if (dlm_lock_on_list(&res->converting, lock)) { |
541 | /* cancel the request, put back on granted */ | 534 | /* cancel the request, put back on granted */ |
542 | lksb->status = DLM_NORMAL; | ||
543 | status = DLM_NORMAL; | 535 | status = DLM_NORMAL; |
544 | *actions = (DLM_UNLOCK_CALL_AST | | 536 | *actions = (DLM_UNLOCK_CALL_AST | |
545 | DLM_UNLOCK_REMOVE_LOCK | | 537 | DLM_UNLOCK_REMOVE_LOCK | |
546 | DLM_UNLOCK_REGRANT_LOCK | | 538 | DLM_UNLOCK_REGRANT_LOCK | |
547 | DLM_UNLOCK_CLEAR_CONVERT_TYPE); | 539 | DLM_UNLOCK_CLEAR_CONVERT_TYPE); |
548 | } else if (dlm_lock_on_list(&res->granted, lock)) { | 540 | } else if (dlm_lock_on_list(&res->granted, lock)) { |
549 | /* too late, already granted. DLM_CANCELGRANT */ | 541 | /* too late, already granted. */ |
550 | lksb->status = DLM_CANCELGRANT; | 542 | status = DLM_CANCELGRANT; |
551 | status = DLM_NORMAL; | ||
552 | *actions = DLM_UNLOCK_CALL_AST; | 543 | *actions = DLM_UNLOCK_CALL_AST; |
553 | } else { | 544 | } else { |
554 | mlog(ML_ERROR, "lock to cancel is not on any list!\n"); | 545 | mlog(ML_ERROR, "lock to cancel is not on any list!\n"); |
555 | lksb->status = DLM_IVLOCKID; | ||
556 | status = DLM_IVLOCKID; | 546 | status = DLM_IVLOCKID; |
557 | *actions = 0; | 547 | *actions = 0; |
558 | } | 548 | } |
@@ -569,13 +559,11 @@ static enum dlm_status dlm_get_unlock_actions(struct dlm_ctxt *dlm, | |||
569 | 559 | ||
570 | /* unlock request */ | 560 | /* unlock request */ |
571 | if (!dlm_lock_on_list(&res->granted, lock)) { | 561 | if (!dlm_lock_on_list(&res->granted, lock)) { |
572 | lksb->status = DLM_DENIED; | ||
573 | status = DLM_DENIED; | 562 | status = DLM_DENIED; |
574 | dlm_error(status); | 563 | dlm_error(status); |
575 | *actions = 0; | 564 | *actions = 0; |
576 | } else { | 565 | } else { |
577 | /* unlock granted lock */ | 566 | /* unlock granted lock */ |
578 | lksb->status = DLM_NORMAL; | ||
579 | status = DLM_NORMAL; | 567 | status = DLM_NORMAL; |
580 | *actions = (DLM_UNLOCK_FREE_LOCK | | 568 | *actions = (DLM_UNLOCK_FREE_LOCK | |
581 | DLM_UNLOCK_CALL_AST | | 569 | DLM_UNLOCK_CALL_AST | |
@@ -632,6 +620,8 @@ retry: | |||
632 | 620 | ||
633 | spin_lock(&res->spinlock); | 621 | spin_lock(&res->spinlock); |
634 | is_master = (res->owner == dlm->node_num); | 622 | is_master = (res->owner == dlm->node_num); |
623 | if (flags & LKM_VALBLK && lock->ml.type != LKM_EXMODE) | ||
624 | flags &= ~LKM_VALBLK; | ||
635 | spin_unlock(&res->spinlock); | 625 | spin_unlock(&res->spinlock); |
636 | 626 | ||
637 | if (is_master) { | 627 | if (is_master) { |
@@ -665,7 +655,7 @@ retry: | |||
665 | } | 655 | } |
666 | 656 | ||
667 | if (call_ast) { | 657 | if (call_ast) { |
668 | mlog(0, "calling unlockast(%p, %d)\n", data, lksb->status); | 658 | mlog(0, "calling unlockast(%p, %d)\n", data, status); |
669 | if (is_master) { | 659 | if (is_master) { |
670 | /* it is possible that there is one last bast | 660 | /* it is possible that there is one last bast |
671 | * pending. make sure it is flushed, then | 661 | * pending. make sure it is flushed, then |
@@ -677,9 +667,12 @@ retry: | |||
677 | wait_event(dlm->ast_wq, | 667 | wait_event(dlm->ast_wq, |
678 | dlm_lock_basts_flushed(dlm, lock)); | 668 | dlm_lock_basts_flushed(dlm, lock)); |
679 | } | 669 | } |
680 | (*unlockast)(data, lksb->status); | 670 | (*unlockast)(data, status); |
681 | } | 671 | } |
682 | 672 | ||
673 | if (status == DLM_CANCELGRANT) | ||
674 | status = DLM_NORMAL; | ||
675 | |||
683 | if (status == DLM_NORMAL) { | 676 | if (status == DLM_NORMAL) { |
684 | mlog(0, "kicking the thread\n"); | 677 | mlog(0, "kicking the thread\n"); |
685 | dlm_kick_thread(dlm, res); | 678 | dlm_kick_thread(dlm, res); |
diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c index 0d1973ea32b0..1f17a4d08287 100644 --- a/fs/ocfs2/localalloc.c +++ b/fs/ocfs2/localalloc.c | |||
@@ -840,6 +840,12 @@ static int ocfs2_local_alloc_new_window(struct ocfs2_super *osb, | |||
840 | 840 | ||
841 | mlog(0, "Allocating %u clusters for a new window.\n", | 841 | mlog(0, "Allocating %u clusters for a new window.\n", |
842 | ocfs2_local_alloc_window_bits(osb)); | 842 | ocfs2_local_alloc_window_bits(osb)); |
843 | |||
844 | /* Instruct the allocation code to try the most recently used | ||
845 | * cluster group. We'll re-record the group used this pass | ||
846 | * below. */ | ||
847 | ac->ac_last_group = osb->la_last_gd; | ||
848 | |||
843 | /* we used the generic suballoc reserve function, but we set | 849 | /* we used the generic suballoc reserve function, but we set |
844 | * everything up nicely, so there's no reason why we can't use | 850 | * everything up nicely, so there's no reason why we can't use |
845 | * the more specific cluster api to claim bits. */ | 851 | * the more specific cluster api to claim bits. */ |
@@ -852,6 +858,8 @@ static int ocfs2_local_alloc_new_window(struct ocfs2_super *osb, | |||
852 | goto bail; | 858 | goto bail; |
853 | } | 859 | } |
854 | 860 | ||
861 | osb->la_last_gd = ac->ac_last_group; | ||
862 | |||
855 | la->la_bm_off = cpu_to_le32(cluster_off); | 863 | la->la_bm_off = cpu_to_le32(cluster_off); |
856 | alloc->id1.bitmap1.i_total = cpu_to_le32(cluster_count); | 864 | alloc->id1.bitmap1.i_total = cpu_to_le32(cluster_count); |
857 | /* just in case... In the future when we find space ourselves, | 865 | /* just in case... In the future when we find space ourselves, |
diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h index cd4a6f253d13..0462a7f4e21b 100644 --- a/fs/ocfs2/ocfs2.h +++ b/fs/ocfs2/ocfs2.h | |||
@@ -197,7 +197,6 @@ struct ocfs2_super | |||
197 | struct ocfs2_node_map recovery_map; | 197 | struct ocfs2_node_map recovery_map; |
198 | struct ocfs2_node_map umount_map; | 198 | struct ocfs2_node_map umount_map; |
199 | 199 | ||
200 | u32 num_clusters; | ||
201 | u64 root_blkno; | 200 | u64 root_blkno; |
202 | u64 system_dir_blkno; | 201 | u64 system_dir_blkno; |
203 | u64 bitmap_blkno; | 202 | u64 bitmap_blkno; |
@@ -237,6 +236,7 @@ struct ocfs2_super | |||
237 | 236 | ||
238 | enum ocfs2_local_alloc_state local_alloc_state; | 237 | enum ocfs2_local_alloc_state local_alloc_state; |
239 | struct buffer_head *local_alloc_bh; | 238 | struct buffer_head *local_alloc_bh; |
239 | u64 la_last_gd; | ||
240 | 240 | ||
241 | /* Next two fields are for local node slot recovery during | 241 | /* Next two fields are for local node slot recovery during |
242 | * mount. */ | 242 | * mount. */ |
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index 195523090c87..9d91e66f51a9 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c | |||
@@ -70,12 +70,6 @@ static int ocfs2_block_group_search(struct inode *inode, | |||
70 | struct buffer_head *group_bh, | 70 | struct buffer_head *group_bh, |
71 | u32 bits_wanted, u32 min_bits, | 71 | u32 bits_wanted, u32 min_bits, |
72 | u16 *bit_off, u16 *bits_found); | 72 | u16 *bit_off, u16 *bits_found); |
73 | static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, | ||
74 | u32 bits_wanted, | ||
75 | u32 min_bits, | ||
76 | u16 *bit_off, | ||
77 | unsigned int *num_bits, | ||
78 | u64 *bg_blkno); | ||
79 | static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | 73 | static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, |
80 | struct ocfs2_alloc_context *ac, | 74 | struct ocfs2_alloc_context *ac, |
81 | u32 bits_wanted, | 75 | u32 bits_wanted, |
@@ -85,11 +79,6 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | |||
85 | u64 *bg_blkno); | 79 | u64 *bg_blkno); |
86 | static int ocfs2_test_bg_bit_allocatable(struct buffer_head *bg_bh, | 80 | static int ocfs2_test_bg_bit_allocatable(struct buffer_head *bg_bh, |
87 | int nr); | 81 | int nr); |
88 | static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb, | ||
89 | struct buffer_head *bg_bh, | ||
90 | unsigned int bits_wanted, | ||
91 | u16 *bit_off, | ||
92 | u16 *bits_found); | ||
93 | static inline int ocfs2_block_group_set_bits(struct ocfs2_journal_handle *handle, | 82 | static inline int ocfs2_block_group_set_bits(struct ocfs2_journal_handle *handle, |
94 | struct inode *alloc_inode, | 83 | struct inode *alloc_inode, |
95 | struct ocfs2_group_desc *bg, | 84 | struct ocfs2_group_desc *bg, |
@@ -143,6 +132,64 @@ static u32 ocfs2_bits_per_group(struct ocfs2_chain_list *cl) | |||
143 | return (u32)le16_to_cpu(cl->cl_cpg) * (u32)le16_to_cpu(cl->cl_bpc); | 132 | return (u32)le16_to_cpu(cl->cl_cpg) * (u32)le16_to_cpu(cl->cl_bpc); |
144 | } | 133 | } |
145 | 134 | ||
135 | /* somewhat more expensive than our other checks, so use sparingly. */ | ||
136 | static int ocfs2_check_group_descriptor(struct super_block *sb, | ||
137 | struct ocfs2_dinode *di, | ||
138 | struct ocfs2_group_desc *gd) | ||
139 | { | ||
140 | unsigned int max_bits; | ||
141 | |||
142 | if (!OCFS2_IS_VALID_GROUP_DESC(gd)) { | ||
143 | OCFS2_RO_ON_INVALID_GROUP_DESC(sb, gd); | ||
144 | return -EIO; | ||
145 | } | ||
146 | |||
147 | if (di->i_blkno != gd->bg_parent_dinode) { | ||
148 | ocfs2_error(sb, "Group descriptor # %llu has bad parent " | ||
149 | "pointer (%llu, expected %llu)", | ||
150 | (unsigned long long)le64_to_cpu(gd->bg_blkno), | ||
151 | (unsigned long long)le64_to_cpu(gd->bg_parent_dinode), | ||
152 | (unsigned long long)le64_to_cpu(di->i_blkno)); | ||
153 | return -EIO; | ||
154 | } | ||
155 | |||
156 | max_bits = le16_to_cpu(di->id2.i_chain.cl_cpg) * le16_to_cpu(di->id2.i_chain.cl_bpc); | ||
157 | if (le16_to_cpu(gd->bg_bits) > max_bits) { | ||
158 | ocfs2_error(sb, "Group descriptor # %llu has bit count of %u", | ||
159 | (unsigned long long)le64_to_cpu(gd->bg_blkno), | ||
160 | le16_to_cpu(gd->bg_bits)); | ||
161 | return -EIO; | ||
162 | } | ||
163 | |||
164 | if (le16_to_cpu(gd->bg_chain) >= | ||
165 | le16_to_cpu(di->id2.i_chain.cl_next_free_rec)) { | ||
166 | ocfs2_error(sb, "Group descriptor # %llu has bad chain %u", | ||
167 | (unsigned long long)le64_to_cpu(gd->bg_blkno), | ||
168 | le16_to_cpu(gd->bg_chain)); | ||
169 | return -EIO; | ||
170 | } | ||
171 | |||
172 | if (le16_to_cpu(gd->bg_free_bits_count) > le16_to_cpu(gd->bg_bits)) { | ||
173 | ocfs2_error(sb, "Group descriptor # %llu has bit count %u but " | ||
174 | "claims that %u are free", | ||
175 | (unsigned long long)le64_to_cpu(gd->bg_blkno), | ||
176 | le16_to_cpu(gd->bg_bits), | ||
177 | le16_to_cpu(gd->bg_free_bits_count)); | ||
178 | return -EIO; | ||
179 | } | ||
180 | |||
181 | if (le16_to_cpu(gd->bg_bits) > (8 * le16_to_cpu(gd->bg_size))) { | ||
182 | ocfs2_error(sb, "Group descriptor # %llu has bit count %u but " | ||
183 | "max bitmap bits of %u", | ||
184 | (unsigned long long)le64_to_cpu(gd->bg_blkno), | ||
185 | le16_to_cpu(gd->bg_bits), | ||
186 | 8 * le16_to_cpu(gd->bg_size)); | ||
187 | return -EIO; | ||
188 | } | ||
189 | |||
190 | return 0; | ||
191 | } | ||
192 | |||
146 | static int ocfs2_block_group_fill(struct ocfs2_journal_handle *handle, | 193 | static int ocfs2_block_group_fill(struct ocfs2_journal_handle *handle, |
147 | struct inode *alloc_inode, | 194 | struct inode *alloc_inode, |
148 | struct buffer_head *bg_bh, | 195 | struct buffer_head *bg_bh, |
@@ -663,6 +710,7 @@ static int ocfs2_test_bg_bit_allocatable(struct buffer_head *bg_bh, | |||
663 | static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb, | 710 | static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb, |
664 | struct buffer_head *bg_bh, | 711 | struct buffer_head *bg_bh, |
665 | unsigned int bits_wanted, | 712 | unsigned int bits_wanted, |
713 | unsigned int total_bits, | ||
666 | u16 *bit_off, | 714 | u16 *bit_off, |
667 | u16 *bits_found) | 715 | u16 *bits_found) |
668 | { | 716 | { |
@@ -679,10 +727,8 @@ static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb, | |||
679 | found = start = best_offset = best_size = 0; | 727 | found = start = best_offset = best_size = 0; |
680 | bitmap = bg->bg_bitmap; | 728 | bitmap = bg->bg_bitmap; |
681 | 729 | ||
682 | while((offset = ocfs2_find_next_zero_bit(bitmap, | 730 | while((offset = ocfs2_find_next_zero_bit(bitmap, total_bits, start)) != -1) { |
683 | le16_to_cpu(bg->bg_bits), | 731 | if (offset == total_bits) |
684 | start)) != -1) { | ||
685 | if (offset == le16_to_cpu(bg->bg_bits)) | ||
686 | break; | 732 | break; |
687 | 733 | ||
688 | if (!ocfs2_test_bg_bit_allocatable(bg_bh, offset)) { | 734 | if (!ocfs2_test_bg_bit_allocatable(bg_bh, offset)) { |
@@ -911,14 +957,35 @@ static int ocfs2_cluster_group_search(struct inode *inode, | |||
911 | { | 957 | { |
912 | int search = -ENOSPC; | 958 | int search = -ENOSPC; |
913 | int ret; | 959 | int ret; |
914 | struct ocfs2_group_desc *bg = (struct ocfs2_group_desc *) group_bh->b_data; | 960 | struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *) group_bh->b_data; |
915 | u16 tmp_off, tmp_found; | 961 | u16 tmp_off, tmp_found; |
962 | unsigned int max_bits, gd_cluster_off; | ||
916 | 963 | ||
917 | BUG_ON(!ocfs2_is_cluster_bitmap(inode)); | 964 | BUG_ON(!ocfs2_is_cluster_bitmap(inode)); |
918 | 965 | ||
919 | if (bg->bg_free_bits_count) { | 966 | if (gd->bg_free_bits_count) { |
967 | max_bits = le16_to_cpu(gd->bg_bits); | ||
968 | |||
969 | /* Tail groups in cluster bitmaps which aren't cpg | ||
970 | * aligned are prone to partial extention by a failed | ||
971 | * fs resize. If the file system resize never got to | ||
972 | * update the dinode cluster count, then we don't want | ||
973 | * to trust any clusters past it, regardless of what | ||
974 | * the group descriptor says. */ | ||
975 | gd_cluster_off = ocfs2_blocks_to_clusters(inode->i_sb, | ||
976 | le64_to_cpu(gd->bg_blkno)); | ||
977 | if ((gd_cluster_off + max_bits) > | ||
978 | OCFS2_I(inode)->ip_clusters) { | ||
979 | max_bits = OCFS2_I(inode)->ip_clusters - gd_cluster_off; | ||
980 | mlog(0, "Desc %llu, bg_bits %u, clusters %u, use %u\n", | ||
981 | (unsigned long long)le64_to_cpu(gd->bg_blkno), | ||
982 | le16_to_cpu(gd->bg_bits), | ||
983 | OCFS2_I(inode)->ip_clusters, max_bits); | ||
984 | } | ||
985 | |||
920 | ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb), | 986 | ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb), |
921 | group_bh, bits_wanted, | 987 | group_bh, bits_wanted, |
988 | max_bits, | ||
922 | &tmp_off, &tmp_found); | 989 | &tmp_off, &tmp_found); |
923 | if (ret) | 990 | if (ret) |
924 | return ret; | 991 | return ret; |
@@ -951,17 +1018,109 @@ static int ocfs2_block_group_search(struct inode *inode, | |||
951 | if (bg->bg_free_bits_count) | 1018 | if (bg->bg_free_bits_count) |
952 | ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb), | 1019 | ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb), |
953 | group_bh, bits_wanted, | 1020 | group_bh, bits_wanted, |
1021 | le16_to_cpu(bg->bg_bits), | ||
954 | bit_off, bits_found); | 1022 | bit_off, bits_found); |
955 | 1023 | ||
956 | return ret; | 1024 | return ret; |
957 | } | 1025 | } |
958 | 1026 | ||
1027 | static int ocfs2_alloc_dinode_update_counts(struct inode *inode, | ||
1028 | struct ocfs2_journal_handle *handle, | ||
1029 | struct buffer_head *di_bh, | ||
1030 | u32 num_bits, | ||
1031 | u16 chain) | ||
1032 | { | ||
1033 | int ret; | ||
1034 | u32 tmp_used; | ||
1035 | struct ocfs2_dinode *di = (struct ocfs2_dinode *) di_bh->b_data; | ||
1036 | struct ocfs2_chain_list *cl = (struct ocfs2_chain_list *) &di->id2.i_chain; | ||
1037 | |||
1038 | ret = ocfs2_journal_access(handle, inode, di_bh, | ||
1039 | OCFS2_JOURNAL_ACCESS_WRITE); | ||
1040 | if (ret < 0) { | ||
1041 | mlog_errno(ret); | ||
1042 | goto out; | ||
1043 | } | ||
1044 | |||
1045 | tmp_used = le32_to_cpu(di->id1.bitmap1.i_used); | ||
1046 | di->id1.bitmap1.i_used = cpu_to_le32(num_bits + tmp_used); | ||
1047 | le32_add_cpu(&cl->cl_recs[chain].c_free, -num_bits); | ||
1048 | |||
1049 | ret = ocfs2_journal_dirty(handle, di_bh); | ||
1050 | if (ret < 0) | ||
1051 | mlog_errno(ret); | ||
1052 | |||
1053 | out: | ||
1054 | return ret; | ||
1055 | } | ||
1056 | |||
1057 | static int ocfs2_search_one_group(struct ocfs2_alloc_context *ac, | ||
1058 | u32 bits_wanted, | ||
1059 | u32 min_bits, | ||
1060 | u16 *bit_off, | ||
1061 | unsigned int *num_bits, | ||
1062 | u64 gd_blkno, | ||
1063 | u16 *bits_left) | ||
1064 | { | ||
1065 | int ret; | ||
1066 | u16 found; | ||
1067 | struct buffer_head *group_bh = NULL; | ||
1068 | struct ocfs2_group_desc *gd; | ||
1069 | struct inode *alloc_inode = ac->ac_inode; | ||
1070 | struct ocfs2_journal_handle *handle = ac->ac_handle; | ||
1071 | |||
1072 | ret = ocfs2_read_block(OCFS2_SB(alloc_inode->i_sb), gd_blkno, | ||
1073 | &group_bh, OCFS2_BH_CACHED, alloc_inode); | ||
1074 | if (ret < 0) { | ||
1075 | mlog_errno(ret); | ||
1076 | return ret; | ||
1077 | } | ||
1078 | |||
1079 | gd = (struct ocfs2_group_desc *) group_bh->b_data; | ||
1080 | if (!OCFS2_IS_VALID_GROUP_DESC(gd)) { | ||
1081 | OCFS2_RO_ON_INVALID_GROUP_DESC(alloc_inode->i_sb, gd); | ||
1082 | ret = -EIO; | ||
1083 | goto out; | ||
1084 | } | ||
1085 | |||
1086 | ret = ac->ac_group_search(alloc_inode, group_bh, bits_wanted, min_bits, | ||
1087 | bit_off, &found); | ||
1088 | if (ret < 0) { | ||
1089 | if (ret != -ENOSPC) | ||
1090 | mlog_errno(ret); | ||
1091 | goto out; | ||
1092 | } | ||
1093 | |||
1094 | *num_bits = found; | ||
1095 | |||
1096 | ret = ocfs2_alloc_dinode_update_counts(alloc_inode, handle, ac->ac_bh, | ||
1097 | *num_bits, | ||
1098 | le16_to_cpu(gd->bg_chain)); | ||
1099 | if (ret < 0) { | ||
1100 | mlog_errno(ret); | ||
1101 | goto out; | ||
1102 | } | ||
1103 | |||
1104 | ret = ocfs2_block_group_set_bits(handle, alloc_inode, gd, group_bh, | ||
1105 | *bit_off, *num_bits); | ||
1106 | if (ret < 0) | ||
1107 | mlog_errno(ret); | ||
1108 | |||
1109 | *bits_left = le16_to_cpu(gd->bg_free_bits_count); | ||
1110 | |||
1111 | out: | ||
1112 | brelse(group_bh); | ||
1113 | |||
1114 | return ret; | ||
1115 | } | ||
1116 | |||
959 | static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, | 1117 | static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, |
960 | u32 bits_wanted, | 1118 | u32 bits_wanted, |
961 | u32 min_bits, | 1119 | u32 min_bits, |
962 | u16 *bit_off, | 1120 | u16 *bit_off, |
963 | unsigned int *num_bits, | 1121 | unsigned int *num_bits, |
964 | u64 *bg_blkno) | 1122 | u64 *bg_blkno, |
1123 | u16 *bits_left) | ||
965 | { | 1124 | { |
966 | int status; | 1125 | int status; |
967 | u16 chain, tmp_bits; | 1126 | u16 chain, tmp_bits; |
@@ -988,9 +1147,9 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, | |||
988 | goto bail; | 1147 | goto bail; |
989 | } | 1148 | } |
990 | bg = (struct ocfs2_group_desc *) group_bh->b_data; | 1149 | bg = (struct ocfs2_group_desc *) group_bh->b_data; |
991 | if (!OCFS2_IS_VALID_GROUP_DESC(bg)) { | 1150 | status = ocfs2_check_group_descriptor(alloc_inode->i_sb, fe, bg); |
992 | OCFS2_RO_ON_INVALID_GROUP_DESC(alloc_inode->i_sb, bg); | 1151 | if (status) { |
993 | status = -EIO; | 1152 | mlog_errno(status); |
994 | goto bail; | 1153 | goto bail; |
995 | } | 1154 | } |
996 | 1155 | ||
@@ -1018,9 +1177,9 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, | |||
1018 | goto bail; | 1177 | goto bail; |
1019 | } | 1178 | } |
1020 | bg = (struct ocfs2_group_desc *) group_bh->b_data; | 1179 | bg = (struct ocfs2_group_desc *) group_bh->b_data; |
1021 | if (!OCFS2_IS_VALID_GROUP_DESC(bg)) { | 1180 | status = ocfs2_check_group_descriptor(alloc_inode->i_sb, fe, bg); |
1022 | OCFS2_RO_ON_INVALID_GROUP_DESC(alloc_inode->i_sb, bg); | 1181 | if (status) { |
1023 | status = -EIO; | 1182 | mlog_errno(status); |
1024 | goto bail; | 1183 | goto bail; |
1025 | } | 1184 | } |
1026 | } | 1185 | } |
@@ -1099,6 +1258,7 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, | |||
1099 | (unsigned long long)fe->i_blkno); | 1258 | (unsigned long long)fe->i_blkno); |
1100 | 1259 | ||
1101 | *bg_blkno = le64_to_cpu(bg->bg_blkno); | 1260 | *bg_blkno = le64_to_cpu(bg->bg_blkno); |
1261 | *bits_left = le16_to_cpu(bg->bg_free_bits_count); | ||
1102 | bail: | 1262 | bail: |
1103 | if (group_bh) | 1263 | if (group_bh) |
1104 | brelse(group_bh); | 1264 | brelse(group_bh); |
@@ -1120,6 +1280,8 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | |||
1120 | { | 1280 | { |
1121 | int status; | 1281 | int status; |
1122 | u16 victim, i; | 1282 | u16 victim, i; |
1283 | u16 bits_left = 0; | ||
1284 | u64 hint_blkno = ac->ac_last_group; | ||
1123 | struct ocfs2_chain_list *cl; | 1285 | struct ocfs2_chain_list *cl; |
1124 | struct ocfs2_dinode *fe; | 1286 | struct ocfs2_dinode *fe; |
1125 | 1287 | ||
@@ -1146,6 +1308,28 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | |||
1146 | goto bail; | 1308 | goto bail; |
1147 | } | 1309 | } |
1148 | 1310 | ||
1311 | if (hint_blkno) { | ||
1312 | /* Attempt to short-circuit the usual search mechanism | ||
1313 | * by jumping straight to the most recently used | ||
1314 | * allocation group. This helps us mantain some | ||
1315 | * contiguousness across allocations. */ | ||
1316 | status = ocfs2_search_one_group(ac, bits_wanted, min_bits, | ||
1317 | bit_off, num_bits, | ||
1318 | hint_blkno, &bits_left); | ||
1319 | if (!status) { | ||
1320 | /* Be careful to update *bg_blkno here as the | ||
1321 | * caller is expecting it to be filled in, and | ||
1322 | * ocfs2_search_one_group() won't do that for | ||
1323 | * us. */ | ||
1324 | *bg_blkno = hint_blkno; | ||
1325 | goto set_hint; | ||
1326 | } | ||
1327 | if (status < 0 && status != -ENOSPC) { | ||
1328 | mlog_errno(status); | ||
1329 | goto bail; | ||
1330 | } | ||
1331 | } | ||
1332 | |||
1149 | cl = (struct ocfs2_chain_list *) &fe->id2.i_chain; | 1333 | cl = (struct ocfs2_chain_list *) &fe->id2.i_chain; |
1150 | 1334 | ||
1151 | victim = ocfs2_find_victim_chain(cl); | 1335 | victim = ocfs2_find_victim_chain(cl); |
@@ -1153,9 +1337,9 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | |||
1153 | ac->ac_allow_chain_relink = 1; | 1337 | ac->ac_allow_chain_relink = 1; |
1154 | 1338 | ||
1155 | status = ocfs2_search_chain(ac, bits_wanted, min_bits, bit_off, | 1339 | status = ocfs2_search_chain(ac, bits_wanted, min_bits, bit_off, |
1156 | num_bits, bg_blkno); | 1340 | num_bits, bg_blkno, &bits_left); |
1157 | if (!status) | 1341 | if (!status) |
1158 | goto bail; | 1342 | goto set_hint; |
1159 | if (status < 0 && status != -ENOSPC) { | 1343 | if (status < 0 && status != -ENOSPC) { |
1160 | mlog_errno(status); | 1344 | mlog_errno(status); |
1161 | goto bail; | 1345 | goto bail; |
@@ -1177,8 +1361,8 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | |||
1177 | 1361 | ||
1178 | ac->ac_chain = i; | 1362 | ac->ac_chain = i; |
1179 | status = ocfs2_search_chain(ac, bits_wanted, min_bits, | 1363 | status = ocfs2_search_chain(ac, bits_wanted, min_bits, |
1180 | bit_off, num_bits, | 1364 | bit_off, num_bits, bg_blkno, |
1181 | bg_blkno); | 1365 | &bits_left); |
1182 | if (!status) | 1366 | if (!status) |
1183 | break; | 1367 | break; |
1184 | if (status < 0 && status != -ENOSPC) { | 1368 | if (status < 0 && status != -ENOSPC) { |
@@ -1186,8 +1370,19 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | |||
1186 | goto bail; | 1370 | goto bail; |
1187 | } | 1371 | } |
1188 | } | 1372 | } |
1189 | bail: | ||
1190 | 1373 | ||
1374 | set_hint: | ||
1375 | if (status != -ENOSPC) { | ||
1376 | /* If the next search of this group is not likely to | ||
1377 | * yield a suitable extent, then we reset the last | ||
1378 | * group hint so as to not waste a disk read */ | ||
1379 | if (bits_left < min_bits) | ||
1380 | ac->ac_last_group = 0; | ||
1381 | else | ||
1382 | ac->ac_last_group = *bg_blkno; | ||
1383 | } | ||
1384 | |||
1385 | bail: | ||
1191 | mlog_exit(status); | 1386 | mlog_exit(status); |
1192 | return status; | 1387 | return status; |
1193 | } | 1388 | } |
@@ -1341,7 +1536,7 @@ int ocfs2_claim_clusters(struct ocfs2_super *osb, | |||
1341 | { | 1536 | { |
1342 | int status; | 1537 | int status; |
1343 | unsigned int bits_wanted = ac->ac_bits_wanted - ac->ac_bits_given; | 1538 | unsigned int bits_wanted = ac->ac_bits_wanted - ac->ac_bits_given; |
1344 | u64 bg_blkno; | 1539 | u64 bg_blkno = 0; |
1345 | u16 bg_bit_off; | 1540 | u16 bg_bit_off; |
1346 | 1541 | ||
1347 | mlog_entry_void(); | 1542 | mlog_entry_void(); |
@@ -1494,9 +1689,9 @@ static int ocfs2_free_suballoc_bits(struct ocfs2_journal_handle *handle, | |||
1494 | } | 1689 | } |
1495 | 1690 | ||
1496 | group = (struct ocfs2_group_desc *) group_bh->b_data; | 1691 | group = (struct ocfs2_group_desc *) group_bh->b_data; |
1497 | if (!OCFS2_IS_VALID_GROUP_DESC(group)) { | 1692 | status = ocfs2_check_group_descriptor(alloc_inode->i_sb, fe, group); |
1498 | OCFS2_RO_ON_INVALID_GROUP_DESC(alloc_inode->i_sb, group); | 1693 | if (status) { |
1499 | status = -EIO; | 1694 | mlog_errno(status); |
1500 | goto bail; | 1695 | goto bail; |
1501 | } | 1696 | } |
1502 | BUG_ON((count + start_bit) > le16_to_cpu(group->bg_bits)); | 1697 | BUG_ON((count + start_bit) > le16_to_cpu(group->bg_bits)); |
diff --git a/fs/ocfs2/suballoc.h b/fs/ocfs2/suballoc.h index a76c82a7ceac..c787838d1052 100644 --- a/fs/ocfs2/suballoc.h +++ b/fs/ocfs2/suballoc.h | |||
@@ -49,6 +49,8 @@ struct ocfs2_alloc_context { | |||
49 | u16 ac_chain; | 49 | u16 ac_chain; |
50 | int ac_allow_chain_relink; | 50 | int ac_allow_chain_relink; |
51 | group_search_t *ac_group_search; | 51 | group_search_t *ac_group_search; |
52 | |||
53 | u64 ac_last_group; | ||
52 | }; | 54 | }; |
53 | 55 | ||
54 | void ocfs2_free_alloc_context(struct ocfs2_alloc_context *ac); | 56 | void ocfs2_free_alloc_context(struct ocfs2_alloc_context *ac); |
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 382706a67ffd..d17e33e66a1e 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
@@ -1442,8 +1442,13 @@ static int ocfs2_initialize_super(struct super_block *sb, | |||
1442 | 1442 | ||
1443 | osb->bitmap_blkno = OCFS2_I(inode)->ip_blkno; | 1443 | osb->bitmap_blkno = OCFS2_I(inode)->ip_blkno; |
1444 | 1444 | ||
1445 | /* We don't have a cluster lock on the bitmap here because | ||
1446 | * we're only interested in static information and the extra | ||
1447 | * complexity at mount time isn't worht it. Don't pass the | ||
1448 | * inode in to the read function though as we don't want it to | ||
1449 | * be put in the cache. */ | ||
1445 | status = ocfs2_read_block(osb, osb->bitmap_blkno, &bitmap_bh, 0, | 1450 | status = ocfs2_read_block(osb, osb->bitmap_blkno, &bitmap_bh, 0, |
1446 | inode); | 1451 | NULL); |
1447 | iput(inode); | 1452 | iput(inode); |
1448 | if (status < 0) { | 1453 | if (status < 0) { |
1449 | mlog_errno(status); | 1454 | mlog_errno(status); |
@@ -1452,7 +1457,6 @@ static int ocfs2_initialize_super(struct super_block *sb, | |||
1452 | 1457 | ||
1453 | di = (struct ocfs2_dinode *) bitmap_bh->b_data; | 1458 | di = (struct ocfs2_dinode *) bitmap_bh->b_data; |
1454 | osb->bitmap_cpg = le16_to_cpu(di->id2.i_chain.cl_cpg); | 1459 | osb->bitmap_cpg = le16_to_cpu(di->id2.i_chain.cl_cpg); |
1455 | osb->num_clusters = le32_to_cpu(di->id1.bitmap1.i_total); | ||
1456 | brelse(bitmap_bh); | 1460 | brelse(bitmap_bh); |
1457 | mlog(0, "cluster bitmap inode: %llu, clusters per group: %u\n", | 1461 | mlog(0, "cluster bitmap inode: %llu, clusters per group: %u\n", |
1458 | (unsigned long long)osb->bitmap_blkno, osb->bitmap_cpg); | 1462 | (unsigned long long)osb->bitmap_blkno, osb->bitmap_cpg); |
diff --git a/fs/partitions/Kconfig b/fs/partitions/Kconfig index c9a478099281..e478f1941831 100644 --- a/fs/partitions/Kconfig +++ b/fs/partitions/Kconfig | |||
@@ -99,7 +99,7 @@ config IBM_PARTITION | |||
99 | 99 | ||
100 | config MAC_PARTITION | 100 | config MAC_PARTITION |
101 | bool "Macintosh partition map support" if PARTITION_ADVANCED | 101 | bool "Macintosh partition map support" if PARTITION_ADVANCED |
102 | default y if MAC | 102 | default y if (MAC || PPC_PMAC) |
103 | help | 103 | help |
104 | Say Y here if you would like to use hard disks under Linux which | 104 | Say Y here if you would like to use hard disks under Linux which |
105 | were partitioned on a Macintosh. | 105 | were partitioned on a Macintosh. |
diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c index f318b58510fd..1627edd50810 100644 --- a/fs/reiserfs/file.c +++ b/fs/reiserfs/file.c | |||
@@ -48,8 +48,8 @@ static int reiserfs_file_release(struct inode *inode, struct file *filp) | |||
48 | return 0; | 48 | return 0; |
49 | } | 49 | } |
50 | 50 | ||
51 | reiserfs_write_lock(inode->i_sb); | ||
52 | mutex_lock(&inode->i_mutex); | 51 | mutex_lock(&inode->i_mutex); |
52 | reiserfs_write_lock(inode->i_sb); | ||
53 | /* freeing preallocation only involves relogging blocks that | 53 | /* freeing preallocation only involves relogging blocks that |
54 | * are already in the current transaction. preallocation gets | 54 | * are already in the current transaction. preallocation gets |
55 | * freed at the end of each transaction, so it is impossible for | 55 | * freed at the end of each transaction, so it is impossible for |
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 12dfdcfbee3d..52f1e2136546 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
@@ -39,14 +39,10 @@ void reiserfs_delete_inode(struct inode *inode) | |||
39 | 39 | ||
40 | /* The = 0 happens when we abort creating a new inode for some reason like lack of space.. */ | 40 | /* The = 0 happens when we abort creating a new inode for some reason like lack of space.. */ |
41 | if (!(inode->i_state & I_NEW) && INODE_PKEY(inode)->k_objectid != 0) { /* also handles bad_inode case */ | 41 | if (!(inode->i_state & I_NEW) && INODE_PKEY(inode)->k_objectid != 0) { /* also handles bad_inode case */ |
42 | mutex_lock(&inode->i_mutex); | ||
43 | |||
44 | reiserfs_delete_xattrs(inode); | 42 | reiserfs_delete_xattrs(inode); |
45 | 43 | ||
46 | if (journal_begin(&th, inode->i_sb, jbegin_count)) { | 44 | if (journal_begin(&th, inode->i_sb, jbegin_count)) |
47 | mutex_unlock(&inode->i_mutex); | ||
48 | goto out; | 45 | goto out; |
49 | } | ||
50 | reiserfs_update_inode_transaction(inode); | 46 | reiserfs_update_inode_transaction(inode); |
51 | 47 | ||
52 | err = reiserfs_delete_object(&th, inode); | 48 | err = reiserfs_delete_object(&th, inode); |
@@ -57,12 +53,8 @@ void reiserfs_delete_inode(struct inode *inode) | |||
57 | if (!err) | 53 | if (!err) |
58 | DQUOT_FREE_INODE(inode); | 54 | DQUOT_FREE_INODE(inode); |
59 | 55 | ||
60 | if (journal_end(&th, inode->i_sb, jbegin_count)) { | 56 | if (journal_end(&th, inode->i_sb, jbegin_count)) |
61 | mutex_unlock(&inode->i_mutex); | ||
62 | goto out; | 57 | goto out; |
63 | } | ||
64 | |||
65 | mutex_unlock(&inode->i_mutex); | ||
66 | 58 | ||
67 | /* check return value from reiserfs_delete_object after | 59 | /* check return value from reiserfs_delete_object after |
68 | * ending the transaction | 60 | * ending the transaction |
@@ -2348,6 +2340,7 @@ static int reiserfs_write_full_page(struct page *page, | |||
2348 | unsigned long end_index = inode->i_size >> PAGE_CACHE_SHIFT; | 2340 | unsigned long end_index = inode->i_size >> PAGE_CACHE_SHIFT; |
2349 | int error = 0; | 2341 | int error = 0; |
2350 | unsigned long block; | 2342 | unsigned long block; |
2343 | sector_t last_block; | ||
2351 | struct buffer_head *head, *bh; | 2344 | struct buffer_head *head, *bh; |
2352 | int partial = 0; | 2345 | int partial = 0; |
2353 | int nr = 0; | 2346 | int nr = 0; |
@@ -2395,10 +2388,19 @@ static int reiserfs_write_full_page(struct page *page, | |||
2395 | } | 2388 | } |
2396 | bh = head; | 2389 | bh = head; |
2397 | block = page->index << (PAGE_CACHE_SHIFT - s->s_blocksize_bits); | 2390 | block = page->index << (PAGE_CACHE_SHIFT - s->s_blocksize_bits); |
2391 | last_block = (i_size_read(inode) - 1) >> inode->i_blkbits; | ||
2398 | /* first map all the buffers, logging any direct items we find */ | 2392 | /* first map all the buffers, logging any direct items we find */ |
2399 | do { | 2393 | do { |
2400 | if ((checked || buffer_dirty(bh)) && (!buffer_mapped(bh) || | 2394 | if (block > last_block) { |
2401 | (buffer_mapped(bh) | 2395 | /* |
2396 | * This can happen when the block size is less than | ||
2397 | * the page size. The corresponding bytes in the page | ||
2398 | * were zero filled above | ||
2399 | */ | ||
2400 | clear_buffer_dirty(bh); | ||
2401 | set_buffer_uptodate(bh); | ||
2402 | } else if ((checked || buffer_dirty(bh)) && | ||
2403 | (!buffer_mapped(bh) || (buffer_mapped(bh) | ||
2402 | && bh->b_blocknr == | 2404 | && bh->b_blocknr == |
2403 | 0))) { | 2405 | 0))) { |
2404 | /* not mapped yet, or it points to a direct item, search | 2406 | /* not mapped yet, or it points to a direct item, search |
diff --git a/fs/reiserfs/ioctl.c b/fs/reiserfs/ioctl.c index 745c88100895..a986b5e1e288 100644 --- a/fs/reiserfs/ioctl.c +++ b/fs/reiserfs/ioctl.c | |||
@@ -116,12 +116,12 @@ static int reiserfs_unpack(struct inode *inode, struct file *filp) | |||
116 | if (REISERFS_I(inode)->i_flags & i_nopack_mask) { | 116 | if (REISERFS_I(inode)->i_flags & i_nopack_mask) { |
117 | return 0; | 117 | return 0; |
118 | } | 118 | } |
119 | reiserfs_write_lock(inode->i_sb); | ||
120 | 119 | ||
121 | /* we need to make sure nobody is changing the file size beneath | 120 | /* we need to make sure nobody is changing the file size beneath |
122 | ** us | 121 | ** us |
123 | */ | 122 | */ |
124 | mutex_lock(&inode->i_mutex); | 123 | mutex_lock(&inode->i_mutex); |
124 | reiserfs_write_lock(inode->i_sb); | ||
125 | 125 | ||
126 | write_from = inode->i_size & (blocksize - 1); | 126 | write_from = inode->i_size & (blocksize - 1); |
127 | /* if we are on a block boundary, we are already unpacked. */ | 127 | /* if we are on a block boundary, we are already unpacked. */ |
diff --git a/fs/udf/ialloc.c b/fs/udf/ialloc.c index 3873c672cb4c..33323473e3c4 100644 --- a/fs/udf/ialloc.c +++ b/fs/udf/ialloc.c | |||
@@ -75,6 +75,12 @@ struct inode * udf_new_inode (struct inode *dir, int mode, int * err) | |||
75 | } | 75 | } |
76 | *err = -ENOSPC; | 76 | *err = -ENOSPC; |
77 | 77 | ||
78 | UDF_I_UNIQUE(inode) = 0; | ||
79 | UDF_I_LENEXTENTS(inode) = 0; | ||
80 | UDF_I_NEXT_ALLOC_BLOCK(inode) = 0; | ||
81 | UDF_I_NEXT_ALLOC_GOAL(inode) = 0; | ||
82 | UDF_I_STRAT4096(inode) = 0; | ||
83 | |||
78 | block = udf_new_block(dir->i_sb, NULL, UDF_I_LOCATION(dir).partitionReferenceNum, | 84 | block = udf_new_block(dir->i_sb, NULL, UDF_I_LOCATION(dir).partitionReferenceNum, |
79 | start, err); | 85 | start, err); |
80 | if (*err) | 86 | if (*err) |
@@ -84,11 +90,6 @@ struct inode * udf_new_inode (struct inode *dir, int mode, int * err) | |||
84 | } | 90 | } |
85 | 91 | ||
86 | mutex_lock(&sbi->s_alloc_mutex); | 92 | mutex_lock(&sbi->s_alloc_mutex); |
87 | UDF_I_UNIQUE(inode) = 0; | ||
88 | UDF_I_LENEXTENTS(inode) = 0; | ||
89 | UDF_I_NEXT_ALLOC_BLOCK(inode) = 0; | ||
90 | UDF_I_NEXT_ALLOC_GOAL(inode) = 0; | ||
91 | UDF_I_STRAT4096(inode) = 0; | ||
92 | if (UDF_SB_LVIDBH(sb)) | 93 | if (UDF_SB_LVIDBH(sb)) |
93 | { | 94 | { |
94 | struct logicalVolHeaderDesc *lvhd; | 95 | struct logicalVolHeaderDesc *lvhd; |
diff --git a/fs/udf/super.c b/fs/udf/super.c index 4df822c881b6..7de172efa084 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
@@ -115,6 +115,13 @@ static struct inode *udf_alloc_inode(struct super_block *sb) | |||
115 | ei = (struct udf_inode_info *)kmem_cache_alloc(udf_inode_cachep, SLAB_KERNEL); | 115 | ei = (struct udf_inode_info *)kmem_cache_alloc(udf_inode_cachep, SLAB_KERNEL); |
116 | if (!ei) | 116 | if (!ei) |
117 | return NULL; | 117 | return NULL; |
118 | |||
119 | ei->i_unique = 0; | ||
120 | ei->i_lenExtents = 0; | ||
121 | ei->i_next_alloc_block = 0; | ||
122 | ei->i_next_alloc_goal = 0; | ||
123 | ei->i_strat4096 = 0; | ||
124 | |||
118 | return &ei->vfs_inode; | 125 | return &ei->vfs_inode; |
119 | } | 126 | } |
120 | 127 | ||
diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c index b01804baa120..b82381475779 100644 --- a/fs/ufs/balloc.c +++ b/fs/ufs/balloc.c | |||
@@ -248,7 +248,7 @@ static void ufs_change_blocknr(struct inode *inode, unsigned int baseblk, | |||
248 | 248 | ||
249 | if (likely(cur_index != index)) { | 249 | if (likely(cur_index != index)) { |
250 | page = ufs_get_locked_page(mapping, index); | 250 | page = ufs_get_locked_page(mapping, index); |
251 | if (IS_ERR(page)) | 251 | if (!page || IS_ERR(page)) /* it was truncated or EIO */ |
252 | continue; | 252 | continue; |
253 | } else | 253 | } else |
254 | page = locked_page; | 254 | page = locked_page; |
diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c index abd5f23a426d..d344b411e261 100644 --- a/fs/ufs/namei.c +++ b/fs/ufs/namei.c | |||
@@ -129,7 +129,7 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry, | |||
129 | struct inode * inode; | 129 | struct inode * inode; |
130 | 130 | ||
131 | if (l > sb->s_blocksize) | 131 | if (l > sb->s_blocksize) |
132 | goto out; | 132 | goto out_notlocked; |
133 | 133 | ||
134 | lock_kernel(); | 134 | lock_kernel(); |
135 | inode = ufs_new_inode(dir, S_IFLNK | S_IRWXUGO); | 135 | inode = ufs_new_inode(dir, S_IFLNK | S_IRWXUGO); |
@@ -155,6 +155,7 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry, | |||
155 | err = ufs_add_nondir(dentry, inode); | 155 | err = ufs_add_nondir(dentry, inode); |
156 | out: | 156 | out: |
157 | unlock_kernel(); | 157 | unlock_kernel(); |
158 | out_notlocked: | ||
158 | return err; | 159 | return err; |
159 | 160 | ||
160 | out_fail: | 161 | out_fail: |
diff --git a/fs/ufs/util.c b/fs/ufs/util.c index 337cf2c46d10..22f820a9b15c 100644 --- a/fs/ufs/util.c +++ b/fs/ufs/util.c | |||
@@ -251,12 +251,12 @@ struct page *ufs_get_locked_page(struct address_space *mapping, | |||
251 | { | 251 | { |
252 | struct page *page; | 252 | struct page *page; |
253 | 253 | ||
254 | try_again: | ||
255 | page = find_lock_page(mapping, index); | 254 | page = find_lock_page(mapping, index); |
256 | if (!page) { | 255 | if (!page) { |
257 | page = read_cache_page(mapping, index, | 256 | page = read_cache_page(mapping, index, |
258 | (filler_t*)mapping->a_ops->readpage, | 257 | (filler_t*)mapping->a_ops->readpage, |
259 | NULL); | 258 | NULL); |
259 | |||
260 | if (IS_ERR(page)) { | 260 | if (IS_ERR(page)) { |
261 | printk(KERN_ERR "ufs_change_blocknr: " | 261 | printk(KERN_ERR "ufs_change_blocknr: " |
262 | "read_cache_page error: ino %lu, index: %lu\n", | 262 | "read_cache_page error: ino %lu, index: %lu\n", |
@@ -266,6 +266,14 @@ try_again: | |||
266 | 266 | ||
267 | lock_page(page); | 267 | lock_page(page); |
268 | 268 | ||
269 | if (unlikely(page->mapping == NULL)) { | ||
270 | /* Truncate got there first */ | ||
271 | unlock_page(page); | ||
272 | page_cache_release(page); | ||
273 | page = NULL; | ||
274 | goto out; | ||
275 | } | ||
276 | |||
269 | if (!PageUptodate(page) || PageError(page)) { | 277 | if (!PageUptodate(page) || PageError(page)) { |
270 | unlock_page(page); | 278 | unlock_page(page); |
271 | page_cache_release(page); | 279 | page_cache_release(page); |
@@ -275,15 +283,8 @@ try_again: | |||
275 | mapping->host->i_ino, index); | 283 | mapping->host->i_ino, index); |
276 | 284 | ||
277 | page = ERR_PTR(-EIO); | 285 | page = ERR_PTR(-EIO); |
278 | goto out; | ||
279 | } | 286 | } |
280 | } | 287 | } |
281 | |||
282 | if (unlikely(!page->mapping || !page_has_buffers(page))) { | ||
283 | unlock_page(page); | ||
284 | page_cache_release(page); | ||
285 | goto try_again;/*we really need these buffers*/ | ||
286 | } | ||
287 | out: | 288 | out: |
288 | return page; | 289 | return page; |
289 | } | 290 | } |
diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index ceda3a2859d2..7858703ed84c 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h | |||
@@ -246,8 +246,8 @@ extern void xfs_buf_trace(xfs_buf_t *, char *, void *, void *); | |||
246 | #define BUF_BUSY XBF_DONT_BLOCK | 246 | #define BUF_BUSY XBF_DONT_BLOCK |
247 | 247 | ||
248 | #define XFS_BUF_BFLAGS(bp) ((bp)->b_flags) | 248 | #define XFS_BUF_BFLAGS(bp) ((bp)->b_flags) |
249 | #define XFS_BUF_ZEROFLAGS(bp) \ | 249 | #define XFS_BUF_ZEROFLAGS(bp) ((bp)->b_flags &= \ |
250 | ((bp)->b_flags &= ~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI)) | 250 | ~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI|XBF_ORDERED)) |
251 | 251 | ||
252 | #define XFS_BUF_STALE(bp) ((bp)->b_flags |= XFS_B_STALE) | 252 | #define XFS_BUF_STALE(bp) ((bp)->b_flags |= XFS_B_STALE) |
253 | #define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XFS_B_STALE) | 253 | #define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XFS_B_STALE) |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 9bdef9d51900..4754f342a5d3 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -314,6 +314,13 @@ xfs_mountfs_check_barriers(xfs_mount_t *mp) | |||
314 | return; | 314 | return; |
315 | } | 315 | } |
316 | 316 | ||
317 | if (xfs_readonly_buftarg(mp->m_ddev_targp)) { | ||
318 | xfs_fs_cmn_err(CE_NOTE, mp, | ||
319 | "Disabling barriers, underlying device is readonly"); | ||
320 | mp->m_flags &= ~XFS_MOUNT_BARRIER; | ||
321 | return; | ||
322 | } | ||
323 | |||
317 | error = xfs_barrier_test(mp); | 324 | error = xfs_barrier_test(mp); |
318 | if (error) { | 325 | if (error) { |
319 | xfs_fs_cmn_err(CE_NOTE, mp, | 326 | xfs_fs_cmn_err(CE_NOTE, mp, |
diff --git a/fs/xfs/quota/xfs_qm_bhv.c b/fs/xfs/quota/xfs_qm_bhv.c index e95e99f7168f..f137856c3261 100644 --- a/fs/xfs/quota/xfs_qm_bhv.c +++ b/fs/xfs/quota/xfs_qm_bhv.c | |||
@@ -217,17 +217,24 @@ xfs_qm_statvfs( | |||
217 | return 0; | 217 | return 0; |
218 | dp = &dqp->q_core; | 218 | dp = &dqp->q_core; |
219 | 219 | ||
220 | limit = dp->d_blk_softlimit ? dp->d_blk_softlimit : dp->d_blk_hardlimit; | 220 | limit = dp->d_blk_softlimit ? |
221 | be64_to_cpu(dp->d_blk_softlimit) : | ||
222 | be64_to_cpu(dp->d_blk_hardlimit); | ||
221 | if (limit && statp->f_blocks > limit) { | 223 | if (limit && statp->f_blocks > limit) { |
222 | statp->f_blocks = limit; | 224 | statp->f_blocks = limit; |
223 | statp->f_bfree = (statp->f_blocks > dp->d_bcount) ? | 225 | statp->f_bfree = |
224 | (statp->f_blocks - dp->d_bcount) : 0; | 226 | (statp->f_blocks > be64_to_cpu(dp->d_bcount)) ? |
227 | (statp->f_blocks - be64_to_cpu(dp->d_bcount)) : 0; | ||
225 | } | 228 | } |
226 | limit = dp->d_ino_softlimit ? dp->d_ino_softlimit : dp->d_ino_hardlimit; | 229 | |
230 | limit = dp->d_ino_softlimit ? | ||
231 | be64_to_cpu(dp->d_ino_softlimit) : | ||
232 | be64_to_cpu(dp->d_ino_hardlimit); | ||
227 | if (limit && statp->f_files > limit) { | 233 | if (limit && statp->f_files > limit) { |
228 | statp->f_files = limit; | 234 | statp->f_files = limit; |
229 | statp->f_ffree = (statp->f_files > dp->d_icount) ? | 235 | statp->f_ffree = |
230 | (statp->f_ffree - dp->d_icount) : 0; | 236 | (statp->f_files > be64_to_cpu(dp->d_icount)) ? |
237 | (statp->f_ffree - be64_to_cpu(dp->d_icount)) : 0; | ||
231 | } | 238 | } |
232 | 239 | ||
233 | xfs_qm_dqput(dqp); | 240 | xfs_qm_dqput(dqp); |
diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index eef6763f3a67..d2bbcd882a69 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c | |||
@@ -1835,40 +1835,47 @@ xfs_alloc_fix_freelist( | |||
1835 | &agbp))) | 1835 | &agbp))) |
1836 | return error; | 1836 | return error; |
1837 | if (!pag->pagf_init) { | 1837 | if (!pag->pagf_init) { |
1838 | ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK); | ||
1839 | ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); | ||
1838 | args->agbp = NULL; | 1840 | args->agbp = NULL; |
1839 | return 0; | 1841 | return 0; |
1840 | } | 1842 | } |
1841 | } else | 1843 | } else |
1842 | agbp = NULL; | 1844 | agbp = NULL; |
1843 | 1845 | ||
1844 | /* If this is a metadata preferred pag and we are user data | 1846 | /* |
1847 | * If this is a metadata preferred pag and we are user data | ||
1845 | * then try somewhere else if we are not being asked to | 1848 | * then try somewhere else if we are not being asked to |
1846 | * try harder at this point | 1849 | * try harder at this point |
1847 | */ | 1850 | */ |
1848 | if (pag->pagf_metadata && args->userdata && flags) { | 1851 | if (pag->pagf_metadata && args->userdata && |
1852 | (flags & XFS_ALLOC_FLAG_TRYLOCK)) { | ||
1853 | ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); | ||
1849 | args->agbp = NULL; | 1854 | args->agbp = NULL; |
1850 | return 0; | 1855 | return 0; |
1851 | } | 1856 | } |
1852 | 1857 | ||
1853 | need = XFS_MIN_FREELIST_PAG(pag, mp); | 1858 | if (!(flags & XFS_ALLOC_FLAG_FREEING)) { |
1854 | delta = need > pag->pagf_flcount ? need - pag->pagf_flcount : 0; | 1859 | need = XFS_MIN_FREELIST_PAG(pag, mp); |
1855 | /* | 1860 | delta = need > pag->pagf_flcount ? need - pag->pagf_flcount : 0; |
1856 | * If it looks like there isn't a long enough extent, or enough | 1861 | /* |
1857 | * total blocks, reject it. | 1862 | * If it looks like there isn't a long enough extent, or enough |
1858 | */ | 1863 | * total blocks, reject it. |
1859 | longest = (pag->pagf_longest > delta) ? | 1864 | */ |
1860 | (pag->pagf_longest - delta) : | 1865 | longest = (pag->pagf_longest > delta) ? |
1861 | (pag->pagf_flcount > 0 || pag->pagf_longest > 0); | 1866 | (pag->pagf_longest - delta) : |
1862 | if (args->minlen + args->alignment + args->minalignslop - 1 > longest || | 1867 | (pag->pagf_flcount > 0 || pag->pagf_longest > 0); |
1863 | (!(flags & XFS_ALLOC_FLAG_FREEING) && | 1868 | if ((args->minlen + args->alignment + args->minalignslop - 1) > |
1864 | (int)(pag->pagf_freeblks + pag->pagf_flcount - | 1869 | longest || |
1865 | need - args->total) < | 1870 | ((int)(pag->pagf_freeblks + pag->pagf_flcount - |
1866 | (int)args->minleft)) { | 1871 | need - args->total) < (int)args->minleft)) { |
1867 | if (agbp) | 1872 | if (agbp) |
1868 | xfs_trans_brelse(tp, agbp); | 1873 | xfs_trans_brelse(tp, agbp); |
1869 | args->agbp = NULL; | 1874 | args->agbp = NULL; |
1870 | return 0; | 1875 | return 0; |
1876 | } | ||
1871 | } | 1877 | } |
1878 | |||
1872 | /* | 1879 | /* |
1873 | * Get the a.g. freespace buffer. | 1880 | * Get the a.g. freespace buffer. |
1874 | * Can fail if we're not blocking on locks, and it's held. | 1881 | * Can fail if we're not blocking on locks, and it's held. |
@@ -1878,6 +1885,8 @@ xfs_alloc_fix_freelist( | |||
1878 | &agbp))) | 1885 | &agbp))) |
1879 | return error; | 1886 | return error; |
1880 | if (agbp == NULL) { | 1887 | if (agbp == NULL) { |
1888 | ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK); | ||
1889 | ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); | ||
1881 | args->agbp = NULL; | 1890 | args->agbp = NULL; |
1882 | return 0; | 1891 | return 0; |
1883 | } | 1892 | } |
@@ -1887,22 +1896,24 @@ xfs_alloc_fix_freelist( | |||
1887 | */ | 1896 | */ |
1888 | agf = XFS_BUF_TO_AGF(agbp); | 1897 | agf = XFS_BUF_TO_AGF(agbp); |
1889 | need = XFS_MIN_FREELIST(agf, mp); | 1898 | need = XFS_MIN_FREELIST(agf, mp); |
1890 | delta = need > be32_to_cpu(agf->agf_flcount) ? | ||
1891 | (need - be32_to_cpu(agf->agf_flcount)) : 0; | ||
1892 | /* | 1899 | /* |
1893 | * If there isn't enough total or single-extent, reject it. | 1900 | * If there isn't enough total or single-extent, reject it. |
1894 | */ | 1901 | */ |
1895 | longest = be32_to_cpu(agf->agf_longest); | 1902 | if (!(flags & XFS_ALLOC_FLAG_FREEING)) { |
1896 | longest = (longest > delta) ? (longest - delta) : | 1903 | delta = need > be32_to_cpu(agf->agf_flcount) ? |
1897 | (be32_to_cpu(agf->agf_flcount) > 0 || longest > 0); | 1904 | (need - be32_to_cpu(agf->agf_flcount)) : 0; |
1898 | if (args->minlen + args->alignment + args->minalignslop - 1 > longest || | 1905 | longest = be32_to_cpu(agf->agf_longest); |
1899 | (!(flags & XFS_ALLOC_FLAG_FREEING) && | 1906 | longest = (longest > delta) ? (longest - delta) : |
1900 | (int)(be32_to_cpu(agf->agf_freeblks) + | 1907 | (be32_to_cpu(agf->agf_flcount) > 0 || longest > 0); |
1901 | be32_to_cpu(agf->agf_flcount) - need - args->total) < | 1908 | if ((args->minlen + args->alignment + args->minalignslop - 1) > |
1902 | (int)args->minleft)) { | 1909 | longest || |
1903 | xfs_trans_brelse(tp, agbp); | 1910 | ((int)(be32_to_cpu(agf->agf_freeblks) + |
1904 | args->agbp = NULL; | 1911 | be32_to_cpu(agf->agf_flcount) - need - args->total) < |
1905 | return 0; | 1912 | (int)args->minleft)) { |
1913 | xfs_trans_brelse(tp, agbp); | ||
1914 | args->agbp = NULL; | ||
1915 | return 0; | ||
1916 | } | ||
1906 | } | 1917 | } |
1907 | /* | 1918 | /* |
1908 | * Make the freelist shorter if it's too long. | 1919 | * Make the freelist shorter if it's too long. |
@@ -1950,12 +1961,11 @@ xfs_alloc_fix_freelist( | |||
1950 | * on a completely full ag. | 1961 | * on a completely full ag. |
1951 | */ | 1962 | */ |
1952 | if (targs.agbno == NULLAGBLOCK) { | 1963 | if (targs.agbno == NULLAGBLOCK) { |
1953 | if (!(flags & XFS_ALLOC_FLAG_FREEING)) { | 1964 | if (flags & XFS_ALLOC_FLAG_FREEING) |
1954 | xfs_trans_brelse(tp, agflbp); | 1965 | break; |
1955 | args->agbp = NULL; | 1966 | xfs_trans_brelse(tp, agflbp); |
1956 | return 0; | 1967 | args->agbp = NULL; |
1957 | } | 1968 | return 0; |
1958 | break; | ||
1959 | } | 1969 | } |
1960 | /* | 1970 | /* |
1961 | * Put each allocated block on the list. | 1971 | * Put each allocated block on the list. |
@@ -2442,31 +2452,26 @@ xfs_free_extent( | |||
2442 | xfs_fsblock_t bno, /* starting block number of extent */ | 2452 | xfs_fsblock_t bno, /* starting block number of extent */ |
2443 | xfs_extlen_t len) /* length of extent */ | 2453 | xfs_extlen_t len) /* length of extent */ |
2444 | { | 2454 | { |
2445 | #ifdef DEBUG | 2455 | xfs_alloc_arg_t args; |
2446 | xfs_agf_t *agf; /* a.g. freespace header */ | ||
2447 | #endif | ||
2448 | xfs_alloc_arg_t args; /* allocation argument structure */ | ||
2449 | int error; | 2456 | int error; |
2450 | 2457 | ||
2451 | ASSERT(len != 0); | 2458 | ASSERT(len != 0); |
2459 | memset(&args, 0, sizeof(xfs_alloc_arg_t)); | ||
2452 | args.tp = tp; | 2460 | args.tp = tp; |
2453 | args.mp = tp->t_mountp; | 2461 | args.mp = tp->t_mountp; |
2454 | args.agno = XFS_FSB_TO_AGNO(args.mp, bno); | 2462 | args.agno = XFS_FSB_TO_AGNO(args.mp, bno); |
2455 | ASSERT(args.agno < args.mp->m_sb.sb_agcount); | 2463 | ASSERT(args.agno < args.mp->m_sb.sb_agcount); |
2456 | args.agbno = XFS_FSB_TO_AGBNO(args.mp, bno); | 2464 | args.agbno = XFS_FSB_TO_AGBNO(args.mp, bno); |
2457 | args.alignment = 1; | ||
2458 | args.minlen = args.minleft = args.minalignslop = 0; | ||
2459 | down_read(&args.mp->m_peraglock); | 2465 | down_read(&args.mp->m_peraglock); |
2460 | args.pag = &args.mp->m_perag[args.agno]; | 2466 | args.pag = &args.mp->m_perag[args.agno]; |
2461 | if ((error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING))) | 2467 | if ((error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING))) |
2462 | goto error0; | 2468 | goto error0; |
2463 | #ifdef DEBUG | 2469 | #ifdef DEBUG |
2464 | ASSERT(args.agbp != NULL); | 2470 | ASSERT(args.agbp != NULL); |
2465 | agf = XFS_BUF_TO_AGF(args.agbp); | 2471 | ASSERT((args.agbno + len) <= |
2466 | ASSERT(args.agbno + len <= be32_to_cpu(agf->agf_length)); | 2472 | be32_to_cpu(XFS_BUF_TO_AGF(args.agbp)->agf_length)); |
2467 | #endif | 2473 | #endif |
2468 | error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, | 2474 | error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, len, 0); |
2469 | len, 0); | ||
2470 | error0: | 2475 | error0: |
2471 | up_read(&args.mp->m_peraglock); | 2476 | up_read(&args.mp->m_peraglock); |
2472 | return error; | 2477 | return error; |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 86c1bf0bba9e..1f8ecff8553a 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
@@ -334,10 +334,9 @@ xfs_itobp( | |||
334 | #if !defined(__KERNEL__) | 334 | #if !defined(__KERNEL__) |
335 | ni = 0; | 335 | ni = 0; |
336 | #elif defined(DEBUG) | 336 | #elif defined(DEBUG) |
337 | ni = (imap_flags & XFS_IMAP_BULKSTAT) ? 0 : | 337 | ni = BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog; |
338 | (BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog); | ||
339 | #else /* usual case */ | 338 | #else /* usual case */ |
340 | ni = (imap_flags & XFS_IMAP_BULKSTAT) ? 0 : 1; | 339 | ni = 1; |
341 | #endif | 340 | #endif |
342 | 341 | ||
343 | for (i = 0; i < ni; i++) { | 342 | for (i = 0; i < ni; i++) { |
@@ -348,11 +347,15 @@ xfs_itobp( | |||
348 | (i << mp->m_sb.sb_inodelog)); | 347 | (i << mp->m_sb.sb_inodelog)); |
349 | di_ok = INT_GET(dip->di_core.di_magic, ARCH_CONVERT) == XFS_DINODE_MAGIC && | 348 | di_ok = INT_GET(dip->di_core.di_magic, ARCH_CONVERT) == XFS_DINODE_MAGIC && |
350 | XFS_DINODE_GOOD_VERSION(INT_GET(dip->di_core.di_version, ARCH_CONVERT)); | 349 | XFS_DINODE_GOOD_VERSION(INT_GET(dip->di_core.di_version, ARCH_CONVERT)); |
351 | if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP, | 350 | if (unlikely(XFS_TEST_ERROR(!di_ok, mp, |
352 | XFS_RANDOM_ITOBP_INOTOBP))) { | 351 | XFS_ERRTAG_ITOBP_INOTOBP, |
352 | XFS_RANDOM_ITOBP_INOTOBP))) { | ||
353 | if (imap_flags & XFS_IMAP_BULKSTAT) { | ||
354 | xfs_trans_brelse(tp, bp); | ||
355 | return XFS_ERROR(EINVAL); | ||
356 | } | ||
353 | #ifdef DEBUG | 357 | #ifdef DEBUG |
354 | if (!(imap_flags & XFS_IMAP_BULKSTAT)) | 358 | cmn_err(CE_ALERT, |
355 | cmn_err(CE_ALERT, | ||
356 | "Device %s - bad inode magic/vsn " | 359 | "Device %s - bad inode magic/vsn " |
357 | "daddr %lld #%d (magic=%x)", | 360 | "daddr %lld #%d (magic=%x)", |
358 | XFS_BUFTARG_NAME(mp->m_ddev_targp), | 361 | XFS_BUFTARG_NAME(mp->m_ddev_targp), |
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index e730328636c3..21ac1a67e3e0 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c | |||
@@ -1413,7 +1413,7 @@ xlog_sync(xlog_t *log, | |||
1413 | ops = iclog->ic_header.h_num_logops; | 1413 | ops = iclog->ic_header.h_num_logops; |
1414 | INT_SET(iclog->ic_header.h_num_logops, ARCH_CONVERT, ops); | 1414 | INT_SET(iclog->ic_header.h_num_logops, ARCH_CONVERT, ops); |
1415 | 1415 | ||
1416 | bp = iclog->ic_bp; | 1416 | bp = iclog->ic_bp; |
1417 | ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long)1); | 1417 | ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long)1); |
1418 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); | 1418 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); |
1419 | XFS_BUF_SET_ADDR(bp, BLOCK_LSN(INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT))); | 1419 | XFS_BUF_SET_ADDR(bp, BLOCK_LSN(INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT))); |
@@ -1430,15 +1430,14 @@ xlog_sync(xlog_t *log, | |||
1430 | } | 1430 | } |
1431 | XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count); | 1431 | XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count); |
1432 | XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */ | 1432 | XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */ |
1433 | XFS_BUF_ZEROFLAGS(bp); | ||
1433 | XFS_BUF_BUSY(bp); | 1434 | XFS_BUF_BUSY(bp); |
1434 | XFS_BUF_ASYNC(bp); | 1435 | XFS_BUF_ASYNC(bp); |
1435 | /* | 1436 | /* |
1436 | * Do an ordered write for the log block. | 1437 | * Do an ordered write for the log block. |
1437 | * | 1438 | * Its unnecessary to flush the first split block in the log wrap case. |
1438 | * It may not be needed to flush the first split block in the log wrap | ||
1439 | * case, but do it anyways to be safe -AK | ||
1440 | */ | 1439 | */ |
1441 | if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) | 1440 | if (!split && (log->l_mp->m_flags & XFS_MOUNT_BARRIER)) |
1442 | XFS_BUF_ORDERED(bp); | 1441 | XFS_BUF_ORDERED(bp); |
1443 | 1442 | ||
1444 | ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); | 1443 | ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); |
@@ -1460,7 +1459,7 @@ xlog_sync(xlog_t *log, | |||
1460 | return error; | 1459 | return error; |
1461 | } | 1460 | } |
1462 | if (split) { | 1461 | if (split) { |
1463 | bp = iclog->ic_log->l_xbuf; | 1462 | bp = iclog->ic_log->l_xbuf; |
1464 | ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == | 1463 | ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == |
1465 | (unsigned long)1); | 1464 | (unsigned long)1); |
1466 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); | 1465 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); |
@@ -1468,6 +1467,7 @@ xlog_sync(xlog_t *log, | |||
1468 | XFS_BUF_SET_PTR(bp, (xfs_caddr_t)((__psint_t)&(iclog->ic_header)+ | 1467 | XFS_BUF_SET_PTR(bp, (xfs_caddr_t)((__psint_t)&(iclog->ic_header)+ |
1469 | (__psint_t)count), split); | 1468 | (__psint_t)count), split); |
1470 | XFS_BUF_SET_FSPRIVATE(bp, iclog); | 1469 | XFS_BUF_SET_FSPRIVATE(bp, iclog); |
1470 | XFS_BUF_ZEROFLAGS(bp); | ||
1471 | XFS_BUF_BUSY(bp); | 1471 | XFS_BUF_BUSY(bp); |
1472 | XFS_BUF_ASYNC(bp); | 1472 | XFS_BUF_ASYNC(bp); |
1473 | if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) | 1473 | if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) |
diff --git a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c index 6c96391f3f1a..b427d220a169 100644 --- a/fs/xfs/xfs_vfsops.c +++ b/fs/xfs/xfs_vfsops.c | |||
@@ -515,7 +515,7 @@ xfs_mount( | |||
515 | if (error) | 515 | if (error) |
516 | goto error2; | 516 | goto error2; |
517 | 517 | ||
518 | if ((mp->m_flags & XFS_MOUNT_BARRIER) && !(vfsp->vfs_flag & VFS_RDONLY)) | 518 | if (mp->m_flags & XFS_MOUNT_BARRIER) |
519 | xfs_mountfs_check_barriers(mp); | 519 | xfs_mountfs_check_barriers(mp); |
520 | 520 | ||
521 | error = XFS_IOINIT(vfsp, args, flags); | 521 | error = XFS_IOINIT(vfsp, args, flags); |
diff --git a/include/asm-arm/arch-iop3xx/iop331-irqs.h b/include/asm-arm/arch-iop3xx/iop331-irqs.h index 8ff73d487222..7135ad7e335e 100644 --- a/include/asm-arm/arch-iop3xx/iop331-irqs.h +++ b/include/asm-arm/arch-iop3xx/iop331-irqs.h | |||
@@ -91,7 +91,6 @@ | |||
91 | #define NR_IRQS NR_IOP331_IRQS | 91 | #define NR_IRQS NR_IOP331_IRQS |
92 | 92 | ||
93 | 93 | ||
94 | #if defined(CONFIG_ARCH_IQ80331) | ||
95 | /* | 94 | /* |
96 | * Interrupts available on the IQ80331 board | 95 | * Interrupts available on the IQ80331 board |
97 | */ | 96 | */ |
@@ -111,7 +110,6 @@ | |||
111 | #define IRQ_IQ80331_INTC IRQ_IOP331_XINT2 | 110 | #define IRQ_IQ80331_INTC IRQ_IOP331_XINT2 |
112 | #define IRQ_IQ80331_INTD IRQ_IOP331_XINT3 | 111 | #define IRQ_IQ80331_INTD IRQ_IOP331_XINT3 |
113 | 112 | ||
114 | #elif defined(CONFIG_MACH_IQ80332) | ||
115 | /* | 113 | /* |
116 | * Interrupts available on the IQ80332 board | 114 | * Interrupts available on the IQ80332 board |
117 | */ | 115 | */ |
@@ -131,6 +129,4 @@ | |||
131 | #define IRQ_IQ80332_INTC IRQ_IOP331_XINT2 | 129 | #define IRQ_IQ80332_INTC IRQ_IOP331_XINT2 |
132 | #define IRQ_IQ80332_INTD IRQ_IOP331_XINT3 | 130 | #define IRQ_IQ80332_INTD IRQ_IOP331_XINT3 |
133 | 131 | ||
134 | #endif | ||
135 | |||
136 | #endif // _IOP331_IRQ_H_ | 132 | #endif // _IOP331_IRQ_H_ |
diff --git a/include/asm-arm/arch-omap/clock.h b/include/asm-arm/arch-omap/clock.h index 3c4eb9fbe48a..f83003f5287b 100644 --- a/include/asm-arm/arch-omap/clock.h +++ b/include/asm-arm/arch-omap/clock.h | |||
@@ -48,8 +48,6 @@ struct clk_functions { | |||
48 | }; | 48 | }; |
49 | 49 | ||
50 | extern unsigned int mpurate; | 50 | extern unsigned int mpurate; |
51 | extern struct list_head clocks; | ||
52 | extern spinlock_t clockfw_lock; | ||
53 | 51 | ||
54 | extern int clk_init(struct clk_functions * custom_clocks); | 52 | extern int clk_init(struct clk_functions * custom_clocks); |
55 | extern int clk_register(struct clk *clk); | 53 | extern int clk_register(struct clk *clk); |
diff --git a/include/asm-i386/kprobes.h b/include/asm-i386/kprobes.h index 0730a20f6db8..8774d06689da 100644 --- a/include/asm-i386/kprobes.h +++ b/include/asm-i386/kprobes.h | |||
@@ -45,6 +45,7 @@ typedef u8 kprobe_opcode_t; | |||
45 | #define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)pentry | 45 | #define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)pentry |
46 | #define ARCH_SUPPORTS_KRETPROBES | 46 | #define ARCH_SUPPORTS_KRETPROBES |
47 | #define ARCH_INACTIVE_KPROBE_COUNT 0 | 47 | #define ARCH_INACTIVE_KPROBE_COUNT 0 |
48 | #define flush_insn_slot(p) do { } while (0) | ||
48 | 49 | ||
49 | void arch_remove_kprobe(struct kprobe *p); | 50 | void arch_remove_kprobe(struct kprobe *p); |
50 | void kretprobe_trampoline(void); | 51 | void kretprobe_trampoline(void); |
diff --git a/include/asm-ia64/kprobes.h b/include/asm-ia64/kprobes.h index 2418a787c405..938904910115 100644 --- a/include/asm-ia64/kprobes.h +++ b/include/asm-ia64/kprobes.h | |||
@@ -125,5 +125,6 @@ static inline void jprobe_return(void) | |||
125 | } | 125 | } |
126 | extern void invalidate_stacked_regs(void); | 126 | extern void invalidate_stacked_regs(void); |
127 | extern void flush_register_stack(void); | 127 | extern void flush_register_stack(void); |
128 | extern void flush_insn_slot(struct kprobe *p); | ||
128 | 129 | ||
129 | #endif /* _ASM_KPROBES_H */ | 130 | #endif /* _ASM_KPROBES_H */ |
diff --git a/include/asm-ia64/meminit.h b/include/asm-ia64/meminit.h index 894bc4d89dc0..6a33a07b3f1d 100644 --- a/include/asm-ia64/meminit.h +++ b/include/asm-ia64/meminit.h | |||
@@ -56,6 +56,11 @@ extern void efi_memmap_init(unsigned long *, unsigned long *); | |||
56 | extern struct page *vmem_map; | 56 | extern struct page *vmem_map; |
57 | extern int find_largest_hole (u64 start, u64 end, void *arg); | 57 | extern int find_largest_hole (u64 start, u64 end, void *arg); |
58 | extern int create_mem_map_page_table (u64 start, u64 end, void *arg); | 58 | extern int create_mem_map_page_table (u64 start, u64 end, void *arg); |
59 | extern int vmemmap_find_next_valid_pfn(int, int); | ||
60 | #else | ||
61 | static inline int vmemmap_find_next_valid_pfn(int node, int i) | ||
62 | { | ||
63 | return i + 1; | ||
64 | } | ||
59 | #endif | 65 | #endif |
60 | |||
61 | #endif /* meminit_h */ | 66 | #endif /* meminit_h */ |
diff --git a/include/asm-ia64/pal.h b/include/asm-ia64/pal.h index 37e52a2836b0..20a8d618c845 100644 --- a/include/asm-ia64/pal.h +++ b/include/asm-ia64/pal.h | |||
@@ -1433,7 +1433,12 @@ typedef union pal_version_u { | |||
1433 | } pal_version_u_t; | 1433 | } pal_version_u_t; |
1434 | 1434 | ||
1435 | 1435 | ||
1436 | /* Return PAL version information */ | 1436 | /* |
1437 | * Return PAL version information. While the documentation states that | ||
1438 | * PAL_VERSION can be called in either physical or virtual mode, some | ||
1439 | * implementations only allow physical calls. We don't call it very often, | ||
1440 | * so the overhead isn't worth eliminating. | ||
1441 | */ | ||
1437 | static inline s64 | 1442 | static inline s64 |
1438 | ia64_pal_version (pal_version_u_t *pal_min_version, pal_version_u_t *pal_cur_version) | 1443 | ia64_pal_version (pal_version_u_t *pal_min_version, pal_version_u_t *pal_cur_version) |
1439 | { | 1444 | { |
diff --git a/include/asm-ia64/sn/xpc.h b/include/asm-ia64/sn/xpc.h index 8406f1ef4caf..b72af597878d 100644 --- a/include/asm-ia64/sn/xpc.h +++ b/include/asm-ia64/sn/xpc.h | |||
@@ -1124,8 +1124,8 @@ xpc_notify_IRQ_send_local(struct xpc_channel *ch, u8 ipi_flag, | |||
1124 | #define XPC_GET_IPI_FLAGS(_amo, _c) ((u8) (((_amo) >> ((_c) * 8)) & 0xff)) | 1124 | #define XPC_GET_IPI_FLAGS(_amo, _c) ((u8) (((_amo) >> ((_c) * 8)) & 0xff)) |
1125 | #define XPC_SET_IPI_FLAGS(_amo, _c, _f) (_amo) |= ((u64) (_f) << ((_c) * 8)) | 1125 | #define XPC_SET_IPI_FLAGS(_amo, _c, _f) (_amo) |= ((u64) (_f) << ((_c) * 8)) |
1126 | 1126 | ||
1127 | #define XPC_ANY_OPENCLOSE_IPI_FLAGS_SET(_amo) ((_amo) & 0x0f0f0f0f0f0f0f0f) | 1127 | #define XPC_ANY_OPENCLOSE_IPI_FLAGS_SET(_amo) ((_amo) & __IA64_UL_CONST(0x0f0f0f0f0f0f0f0f)) |
1128 | #define XPC_ANY_MSG_IPI_FLAGS_SET(_amo) ((_amo) & 0x1010101010101010) | 1128 | #define XPC_ANY_MSG_IPI_FLAGS_SET(_amo) ((_amo) & __IA64_UL_CONST(0x1010101010101010)) |
1129 | 1129 | ||
1130 | 1130 | ||
1131 | static inline void | 1131 | static inline void |
diff --git a/include/asm-ia64/system.h b/include/asm-ia64/system.h index fc9677bc87ee..384fbf7f2a0f 100644 --- a/include/asm-ia64/system.h +++ b/include/asm-ia64/system.h | |||
@@ -24,7 +24,7 @@ | |||
24 | * 0xa000000000000000+2*PERCPU_PAGE_SIZE | 24 | * 0xa000000000000000+2*PERCPU_PAGE_SIZE |
25 | * - 0xa000000000000000+3*PERCPU_PAGE_SIZE remain unmapped (guard page) | 25 | * - 0xa000000000000000+3*PERCPU_PAGE_SIZE remain unmapped (guard page) |
26 | */ | 26 | */ |
27 | #define KERNEL_START (GATE_ADDR+0x100000000) | 27 | #define KERNEL_START (GATE_ADDR+__IA64_UL_CONST(0x100000000)) |
28 | #define PERCPU_ADDR (-PERCPU_PAGE_SIZE) | 28 | #define PERCPU_ADDR (-PERCPU_PAGE_SIZE) |
29 | 29 | ||
30 | #ifndef __ASSEMBLY__ | 30 | #ifndef __ASSEMBLY__ |
diff --git a/include/asm-powerpc/backlight.h b/include/asm-powerpc/backlight.h index 58d4b6f8d827..8cf5c37c3817 100644 --- a/include/asm-powerpc/backlight.h +++ b/include/asm-powerpc/backlight.h | |||
@@ -30,8 +30,12 @@ static inline void pmac_backlight_key_down(void) | |||
30 | pmac_backlight_key(1); | 30 | pmac_backlight_key(1); |
31 | } | 31 | } |
32 | 32 | ||
33 | extern void pmac_backlight_set_legacy_brightness_pmu(int brightness); | ||
33 | extern int pmac_backlight_set_legacy_brightness(int brightness); | 34 | extern int pmac_backlight_set_legacy_brightness(int brightness); |
34 | extern int pmac_backlight_get_legacy_brightness(void); | 35 | extern int pmac_backlight_get_legacy_brightness(void); |
35 | 36 | ||
37 | extern void pmac_backlight_enable(void); | ||
38 | extern void pmac_backlight_disable(void); | ||
39 | |||
36 | #endif /* __KERNEL__ */ | 40 | #endif /* __KERNEL__ */ |
37 | #endif | 41 | #endif |
diff --git a/include/asm-powerpc/kexec.h b/include/asm-powerpc/kexec.h index 8f7fd5cfec34..11cbdf81fd2e 100644 --- a/include/asm-powerpc/kexec.h +++ b/include/asm-powerpc/kexec.h | |||
@@ -32,6 +32,7 @@ | |||
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | #ifndef __ASSEMBLY__ | 34 | #ifndef __ASSEMBLY__ |
35 | #include <linux/cpumask.h> | ||
35 | 36 | ||
36 | #ifdef CONFIG_KEXEC | 37 | #ifdef CONFIG_KEXEC |
37 | 38 | ||
@@ -109,7 +110,6 @@ static inline void crash_setup_regs(struct pt_regs *newregs, | |||
109 | 110 | ||
110 | #define MAX_NOTE_BYTES 1024 | 111 | #define MAX_NOTE_BYTES 1024 |
111 | 112 | ||
112 | #ifdef __powerpc64__ | ||
113 | extern void kexec_smp_wait(void); /* get and clear naca physid, wait for | 113 | extern void kexec_smp_wait(void); /* get and clear naca physid, wait for |
114 | master to copy new code to 0 */ | 114 | master to copy new code to 0 */ |
115 | extern int crashing_cpu; | 115 | extern int crashing_cpu; |
@@ -119,7 +119,6 @@ static inline int kexec_sr_activated(int cpu) | |||
119 | { | 119 | { |
120 | return cpu_isset(cpu,cpus_in_sr); | 120 | return cpu_isset(cpu,cpus_in_sr); |
121 | } | 121 | } |
122 | #endif /* __powerpc64 __ */ | ||
123 | 122 | ||
124 | struct kimage; | 123 | struct kimage; |
125 | struct pt_regs; | 124 | struct pt_regs; |
diff --git a/include/asm-powerpc/kprobes.h b/include/asm-powerpc/kprobes.h index 2d0af52c823d..34e1f89a5fa0 100644 --- a/include/asm-powerpc/kprobes.h +++ b/include/asm-powerpc/kprobes.h | |||
@@ -51,6 +51,7 @@ typedef unsigned int kprobe_opcode_t; | |||
51 | 51 | ||
52 | #define ARCH_SUPPORTS_KRETPROBES | 52 | #define ARCH_SUPPORTS_KRETPROBES |
53 | #define ARCH_INACTIVE_KPROBE_COUNT 1 | 53 | #define ARCH_INACTIVE_KPROBE_COUNT 1 |
54 | #define flush_insn_slot(p) do { } while (0) | ||
54 | 55 | ||
55 | void kretprobe_trampoline(void); | 56 | void kretprobe_trampoline(void); |
56 | extern void arch_remove_kprobe(struct kprobe *p); | 57 | extern void arch_remove_kprobe(struct kprobe *p); |
diff --git a/include/asm-powerpc/rtas.h b/include/asm-powerpc/rtas.h index a33c6acffa61..82a27e9a041f 100644 --- a/include/asm-powerpc/rtas.h +++ b/include/asm-powerpc/rtas.h | |||
@@ -170,6 +170,7 @@ extern int rtas_get_sensor(int sensor, int index, int *state); | |||
170 | extern int rtas_get_power_level(int powerdomain, int *level); | 170 | extern int rtas_get_power_level(int powerdomain, int *level); |
171 | extern int rtas_set_power_level(int powerdomain, int level, int *setlevel); | 171 | extern int rtas_set_power_level(int powerdomain, int level, int *setlevel); |
172 | extern int rtas_set_indicator(int indicator, int index, int new_value); | 172 | extern int rtas_set_indicator(int indicator, int index, int new_value); |
173 | extern int rtas_set_indicator_fast(int indicator, int index, int new_value); | ||
173 | extern void rtas_progress(char *s, unsigned short hex); | 174 | extern void rtas_progress(char *s, unsigned short hex); |
174 | extern void rtas_initialize(void); | 175 | extern void rtas_initialize(void); |
175 | 176 | ||
diff --git a/include/asm-sparc/signal.h b/include/asm-sparc/signal.h index 0ae5084c427b..d03a21c97abb 100644 --- a/include/asm-sparc/signal.h +++ b/include/asm-sparc/signal.h | |||
@@ -168,7 +168,7 @@ struct sigstack { | |||
168 | * statically allocated data.. which is NOT GOOD. | 168 | * statically allocated data.. which is NOT GOOD. |
169 | * | 169 | * |
170 | */ | 170 | */ |
171 | #define SA_STATIC_ALLOC 0x80 | 171 | #define SA_STATIC_ALLOC 0x8000 |
172 | #endif | 172 | #endif |
173 | 173 | ||
174 | #include <asm-generic/signal.h> | 174 | #include <asm-generic/signal.h> |
diff --git a/include/asm-sparc64/kprobes.h b/include/asm-sparc64/kprobes.h index 15065af566c2..c9f5c34d318c 100644 --- a/include/asm-sparc64/kprobes.h +++ b/include/asm-sparc64/kprobes.h | |||
@@ -13,6 +13,7 @@ typedef u32 kprobe_opcode_t; | |||
13 | #define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)pentry | 13 | #define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)pentry |
14 | #define arch_remove_kprobe(p) do {} while (0) | 14 | #define arch_remove_kprobe(p) do {} while (0) |
15 | #define ARCH_INACTIVE_KPROBE_COUNT 0 | 15 | #define ARCH_INACTIVE_KPROBE_COUNT 0 |
16 | #define flush_insn_slot(p) do { } while (0) | ||
16 | 17 | ||
17 | /* Architecture specific copy of original instruction*/ | 18 | /* Architecture specific copy of original instruction*/ |
18 | struct arch_specific_insn { | 19 | struct arch_specific_insn { |
diff --git a/include/asm-sparc64/pgtable.h b/include/asm-sparc64/pgtable.h index 03f5bc9b6bec..1ba19eb34ce3 100644 --- a/include/asm-sparc64/pgtable.h +++ b/include/asm-sparc64/pgtable.h | |||
@@ -339,7 +339,7 @@ static inline pgprot_t pgprot_noncached(pgprot_t prot) | |||
339 | " .section .sun4v_2insn_patch, \"ax\"\n" | 339 | " .section .sun4v_2insn_patch, \"ax\"\n" |
340 | " .word 661b\n" | 340 | " .word 661b\n" |
341 | " andn %0, %4, %0\n" | 341 | " andn %0, %4, %0\n" |
342 | " or %0, %3, %0\n" | 342 | " or %0, %5, %0\n" |
343 | " .previous\n" | 343 | " .previous\n" |
344 | : "=r" (val) | 344 | : "=r" (val) |
345 | : "0" (val), "i" (_PAGE_CP_4U | _PAGE_CV_4U), "i" (_PAGE_E_4U), | 345 | : "0" (val), "i" (_PAGE_CP_4U | _PAGE_CV_4U), "i" (_PAGE_E_4U), |
diff --git a/include/asm-sparc64/sfp-machine.h b/include/asm-sparc64/sfp-machine.h index 5015bb8d6c32..89d42431efb5 100644 --- a/include/asm-sparc64/sfp-machine.h +++ b/include/asm-sparc64/sfp-machine.h | |||
@@ -34,7 +34,7 @@ | |||
34 | #define _FP_MUL_MEAT_D(R,X,Y) \ | 34 | #define _FP_MUL_MEAT_D(R,X,Y) \ |
35 | _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm) | 35 | _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm) |
36 | #define _FP_MUL_MEAT_Q(R,X,Y) \ | 36 | #define _FP_MUL_MEAT_Q(R,X,Y) \ |
37 | _FP_MUL_MEAT_2_wide_3mul(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) | 37 | _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) |
38 | 38 | ||
39 | #define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_imm(S,R,X,Y,_FP_DIV_HELP_imm) | 39 | #define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_imm(S,R,X,Y,_FP_DIV_HELP_imm) |
40 | #define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_1_udiv_norm(D,R,X,Y) | 40 | #define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_1_udiv_norm(D,R,X,Y) |
diff --git a/include/asm-x86_64/calgary.h b/include/asm-x86_64/calgary.h index fbfb50136edb..4e3919524240 100644 --- a/include/asm-x86_64/calgary.h +++ b/include/asm-x86_64/calgary.h | |||
@@ -60,9 +60,4 @@ static inline int calgary_iommu_init(void) { return 1; } | |||
60 | static inline void detect_calgary(void) { return; } | 60 | static inline void detect_calgary(void) { return; } |
61 | #endif | 61 | #endif |
62 | 62 | ||
63 | static inline unsigned int bus_to_phb(unsigned char busno) | ||
64 | { | ||
65 | return ((busno % 15 == 0) ? 0 : busno / 2 + 1); | ||
66 | } | ||
67 | |||
68 | #endif /* _ASM_X86_64_CALGARY_H */ | 63 | #endif /* _ASM_X86_64_CALGARY_H */ |
diff --git a/include/asm-x86_64/kprobes.h b/include/asm-x86_64/kprobes.h index d36febd9bb18..cf5317898fb0 100644 --- a/include/asm-x86_64/kprobes.h +++ b/include/asm-x86_64/kprobes.h | |||
@@ -47,6 +47,7 @@ typedef u8 kprobe_opcode_t; | |||
47 | 47 | ||
48 | void kretprobe_trampoline(void); | 48 | void kretprobe_trampoline(void); |
49 | extern void arch_remove_kprobe(struct kprobe *p); | 49 | extern void arch_remove_kprobe(struct kprobe *p); |
50 | #define flush_insn_slot(p) do { } while (0) | ||
50 | 51 | ||
51 | /* Architecture specific copy of original instruction*/ | 52 | /* Architecture specific copy of original instruction*/ |
52 | struct arch_specific_insn { | 53 | struct arch_specific_insn { |
diff --git a/include/asm-x86_64/page.h b/include/asm-x86_64/page.h index f7bf875aae40..10f346165cab 100644 --- a/include/asm-x86_64/page.h +++ b/include/asm-x86_64/page.h | |||
@@ -19,7 +19,7 @@ | |||
19 | #define EXCEPTION_STACK_ORDER 0 | 19 | #define EXCEPTION_STACK_ORDER 0 |
20 | #define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER) | 20 | #define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER) |
21 | 21 | ||
22 | #define DEBUG_STACK_ORDER EXCEPTION_STACK_ORDER | 22 | #define DEBUG_STACK_ORDER (EXCEPTION_STACK_ORDER + 1) |
23 | #define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER) | 23 | #define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER) |
24 | 24 | ||
25 | #define IRQSTACK_ORDER 2 | 25 | #define IRQSTACK_ORDER 2 |
diff --git a/include/asm-x86_64/swiotlb.h b/include/asm-x86_64/swiotlb.h index 5f9a01805821..ba94ab3d2673 100644 --- a/include/asm-x86_64/swiotlb.h +++ b/include/asm-x86_64/swiotlb.h | |||
@@ -42,6 +42,8 @@ extern void swiotlb_free_coherent (struct device *hwdev, size_t size, | |||
42 | extern int swiotlb_dma_supported(struct device *hwdev, u64 mask); | 42 | extern int swiotlb_dma_supported(struct device *hwdev, u64 mask); |
43 | extern void swiotlb_init(void); | 43 | extern void swiotlb_init(void); |
44 | 44 | ||
45 | extern int swiotlb_force; | ||
46 | |||
45 | #ifdef CONFIG_SWIOTLB | 47 | #ifdef CONFIG_SWIOTLB |
46 | extern int swiotlb; | 48 | extern int swiotlb; |
47 | #else | 49 | #else |
diff --git a/include/linux/audit.h b/include/linux/audit.h index b27d7debc5a1..64f9f9e56ac5 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
@@ -327,21 +327,31 @@ extern void __audit_getname(const char *name); | |||
327 | extern void audit_putname(const char *name); | 327 | extern void audit_putname(const char *name); |
328 | extern void __audit_inode(const char *name, const struct inode *inode); | 328 | extern void __audit_inode(const char *name, const struct inode *inode); |
329 | extern void __audit_inode_child(const char *dname, const struct inode *inode, | 329 | extern void __audit_inode_child(const char *dname, const struct inode *inode, |
330 | unsigned long pino); | 330 | const struct inode *parent); |
331 | extern void __audit_inode_update(const struct inode *inode); | ||
332 | static inline int audit_dummy_context(void) | ||
333 | { | ||
334 | void *p = current->audit_context; | ||
335 | return !p || *(int *)p; | ||
336 | } | ||
331 | static inline void audit_getname(const char *name) | 337 | static inline void audit_getname(const char *name) |
332 | { | 338 | { |
333 | if (unlikely(current->audit_context)) | 339 | if (unlikely(!audit_dummy_context())) |
334 | __audit_getname(name); | 340 | __audit_getname(name); |
335 | } | 341 | } |
336 | static inline void audit_inode(const char *name, const struct inode *inode) { | 342 | static inline void audit_inode(const char *name, const struct inode *inode) { |
337 | if (unlikely(current->audit_context)) | 343 | if (unlikely(!audit_dummy_context())) |
338 | __audit_inode(name, inode); | 344 | __audit_inode(name, inode); |
339 | } | 345 | } |
340 | static inline void audit_inode_child(const char *dname, | 346 | static inline void audit_inode_child(const char *dname, |
341 | const struct inode *inode, | 347 | const struct inode *inode, |
342 | unsigned long pino) { | 348 | const struct inode *parent) { |
343 | if (unlikely(current->audit_context)) | 349 | if (unlikely(!audit_dummy_context())) |
344 | __audit_inode_child(dname, inode, pino); | 350 | __audit_inode_child(dname, inode, parent); |
351 | } | ||
352 | static inline void audit_inode_update(const struct inode *inode) { | ||
353 | if (unlikely(!audit_dummy_context())) | ||
354 | __audit_inode_update(inode); | ||
345 | } | 355 | } |
346 | 356 | ||
347 | /* Private API (for audit.c only) */ | 357 | /* Private API (for audit.c only) */ |
@@ -365,57 +375,61 @@ extern int __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat); | |||
365 | 375 | ||
366 | static inline int audit_ipc_obj(struct kern_ipc_perm *ipcp) | 376 | static inline int audit_ipc_obj(struct kern_ipc_perm *ipcp) |
367 | { | 377 | { |
368 | if (unlikely(current->audit_context)) | 378 | if (unlikely(!audit_dummy_context())) |
369 | return __audit_ipc_obj(ipcp); | 379 | return __audit_ipc_obj(ipcp); |
370 | return 0; | 380 | return 0; |
371 | } | 381 | } |
372 | static inline int audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode) | 382 | static inline int audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode) |
373 | { | 383 | { |
374 | if (unlikely(current->audit_context)) | 384 | if (unlikely(!audit_dummy_context())) |
375 | return __audit_ipc_set_perm(qbytes, uid, gid, mode); | 385 | return __audit_ipc_set_perm(qbytes, uid, gid, mode); |
376 | return 0; | 386 | return 0; |
377 | } | 387 | } |
378 | static inline int audit_mq_open(int oflag, mode_t mode, struct mq_attr __user *u_attr) | 388 | static inline int audit_mq_open(int oflag, mode_t mode, struct mq_attr __user *u_attr) |
379 | { | 389 | { |
380 | if (unlikely(current->audit_context)) | 390 | if (unlikely(!audit_dummy_context())) |
381 | return __audit_mq_open(oflag, mode, u_attr); | 391 | return __audit_mq_open(oflag, mode, u_attr); |
382 | return 0; | 392 | return 0; |
383 | } | 393 | } |
384 | static inline int audit_mq_timedsend(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec __user *u_abs_timeout) | 394 | static inline int audit_mq_timedsend(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec __user *u_abs_timeout) |
385 | { | 395 | { |
386 | if (unlikely(current->audit_context)) | 396 | if (unlikely(!audit_dummy_context())) |
387 | return __audit_mq_timedsend(mqdes, msg_len, msg_prio, u_abs_timeout); | 397 | return __audit_mq_timedsend(mqdes, msg_len, msg_prio, u_abs_timeout); |
388 | return 0; | 398 | return 0; |
389 | } | 399 | } |
390 | static inline int audit_mq_timedreceive(mqd_t mqdes, size_t msg_len, unsigned int __user *u_msg_prio, const struct timespec __user *u_abs_timeout) | 400 | static inline int audit_mq_timedreceive(mqd_t mqdes, size_t msg_len, unsigned int __user *u_msg_prio, const struct timespec __user *u_abs_timeout) |
391 | { | 401 | { |
392 | if (unlikely(current->audit_context)) | 402 | if (unlikely(!audit_dummy_context())) |
393 | return __audit_mq_timedreceive(mqdes, msg_len, u_msg_prio, u_abs_timeout); | 403 | return __audit_mq_timedreceive(mqdes, msg_len, u_msg_prio, u_abs_timeout); |
394 | return 0; | 404 | return 0; |
395 | } | 405 | } |
396 | static inline int audit_mq_notify(mqd_t mqdes, const struct sigevent __user *u_notification) | 406 | static inline int audit_mq_notify(mqd_t mqdes, const struct sigevent __user *u_notification) |
397 | { | 407 | { |
398 | if (unlikely(current->audit_context)) | 408 | if (unlikely(!audit_dummy_context())) |
399 | return __audit_mq_notify(mqdes, u_notification); | 409 | return __audit_mq_notify(mqdes, u_notification); |
400 | return 0; | 410 | return 0; |
401 | } | 411 | } |
402 | static inline int audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat) | 412 | static inline int audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat) |
403 | { | 413 | { |
404 | if (unlikely(current->audit_context)) | 414 | if (unlikely(!audit_dummy_context())) |
405 | return __audit_mq_getsetattr(mqdes, mqstat); | 415 | return __audit_mq_getsetattr(mqdes, mqstat); |
406 | return 0; | 416 | return 0; |
407 | } | 417 | } |
418 | extern int audit_n_rules; | ||
408 | #else | 419 | #else |
409 | #define audit_alloc(t) ({ 0; }) | 420 | #define audit_alloc(t) ({ 0; }) |
410 | #define audit_free(t) do { ; } while (0) | 421 | #define audit_free(t) do { ; } while (0) |
411 | #define audit_syscall_entry(ta,a,b,c,d,e) do { ; } while (0) | 422 | #define audit_syscall_entry(ta,a,b,c,d,e) do { ; } while (0) |
412 | #define audit_syscall_exit(f,r) do { ; } while (0) | 423 | #define audit_syscall_exit(f,r) do { ; } while (0) |
424 | #define audit_dummy_context() 1 | ||
413 | #define audit_getname(n) do { ; } while (0) | 425 | #define audit_getname(n) do { ; } while (0) |
414 | #define audit_putname(n) do { ; } while (0) | 426 | #define audit_putname(n) do { ; } while (0) |
415 | #define __audit_inode(n,i) do { ; } while (0) | 427 | #define __audit_inode(n,i) do { ; } while (0) |
416 | #define __audit_inode_child(d,i,p) do { ; } while (0) | 428 | #define __audit_inode_child(d,i,p) do { ; } while (0) |
429 | #define __audit_inode_update(i) do { ; } while (0) | ||
417 | #define audit_inode(n,i) do { ; } while (0) | 430 | #define audit_inode(n,i) do { ; } while (0) |
418 | #define audit_inode_child(d,i,p) do { ; } while (0) | 431 | #define audit_inode_child(d,i,p) do { ; } while (0) |
432 | #define audit_inode_update(i) do { ; } while (0) | ||
419 | #define auditsc_get_stamp(c,t,s) do { BUG(); } while (0) | 433 | #define auditsc_get_stamp(c,t,s) do { BUG(); } while (0) |
420 | #define audit_get_loginuid(c) ({ -1; }) | 434 | #define audit_get_loginuid(c) ({ -1; }) |
421 | #define audit_ipc_obj(i) ({ 0; }) | 435 | #define audit_ipc_obj(i) ({ 0; }) |
@@ -430,6 +444,7 @@ static inline int audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat) | |||
430 | #define audit_mq_timedreceive(d,l,p,t) ({ 0; }) | 444 | #define audit_mq_timedreceive(d,l,p,t) ({ 0; }) |
431 | #define audit_mq_notify(d,n) ({ 0; }) | 445 | #define audit_mq_notify(d,n) ({ 0; }) |
432 | #define audit_mq_getsetattr(d,s) ({ 0; }) | 446 | #define audit_mq_getsetattr(d,s) ({ 0; }) |
447 | #define audit_n_rules 0 | ||
433 | #endif | 448 | #endif |
434 | 449 | ||
435 | #ifdef CONFIG_AUDIT | 450 | #ifdef CONFIG_AUDIT |
diff --git a/include/linux/cn_proc.h b/include/linux/cn_proc.h index dbb7769009be..1c86d65bc4b9 100644 --- a/include/linux/cn_proc.h +++ b/include/linux/cn_proc.h | |||
@@ -57,7 +57,8 @@ struct proc_event { | |||
57 | PROC_EVENT_EXIT = 0x80000000 | 57 | PROC_EVENT_EXIT = 0x80000000 |
58 | } what; | 58 | } what; |
59 | __u32 cpu; | 59 | __u32 cpu; |
60 | struct timespec timestamp; | 60 | __u64 __attribute__((aligned(8))) timestamp_ns; |
61 | /* Number of nano seconds since system boot */ | ||
61 | union { /* must be last field of proc_event struct */ | 62 | union { /* must be last field of proc_event struct */ |
62 | struct { | 63 | struct { |
63 | __u32 err; | 64 | __u32 err; |
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 35e137636b0b..4ea39fee99c7 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h | |||
@@ -172,9 +172,6 @@ extern int __cpufreq_driver_target(struct cpufreq_policy *policy, | |||
172 | unsigned int relation); | 172 | unsigned int relation); |
173 | 173 | ||
174 | 174 | ||
175 | /* pass an event to the cpufreq governor */ | ||
176 | int cpufreq_governor(unsigned int cpu, unsigned int event); | ||
177 | |||
178 | int cpufreq_register_governor(struct cpufreq_governor *governor); | 175 | int cpufreq_register_governor(struct cpufreq_governor *governor); |
179 | void cpufreq_unregister_governor(struct cpufreq_governor *governor); | 176 | void cpufreq_unregister_governor(struct cpufreq_governor *governor); |
180 | 177 | ||
diff --git a/include/linux/debug_locks.h b/include/linux/debug_locks.h index 6a7047851e48..88dafa246d87 100644 --- a/include/linux/debug_locks.h +++ b/include/linux/debug_locks.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __LINUX_DEBUG_LOCKING_H | 1 | #ifndef __LINUX_DEBUG_LOCKING_H |
2 | #define __LINUX_DEBUG_LOCKING_H | 2 | #define __LINUX_DEBUG_LOCKING_H |
3 | 3 | ||
4 | struct task_struct; | ||
5 | |||
4 | extern int debug_locks; | 6 | extern int debug_locks; |
5 | extern int debug_locks_silent; | 7 | extern int debug_locks_silent; |
6 | 8 | ||
diff --git a/include/linux/delayacct.h b/include/linux/delayacct.h index 7e8b6011b8f3..11487b6e7127 100644 --- a/include/linux/delayacct.h +++ b/include/linux/delayacct.h | |||
@@ -55,7 +55,7 @@ static inline void delayacct_tsk_init(struct task_struct *tsk) | |||
55 | { | 55 | { |
56 | /* reinitialize in case parent's non-null pointer was dup'ed*/ | 56 | /* reinitialize in case parent's non-null pointer was dup'ed*/ |
57 | tsk->delays = NULL; | 57 | tsk->delays = NULL; |
58 | if (unlikely(delayacct_on)) | 58 | if (delayacct_on) |
59 | __delayacct_tsk_init(tsk); | 59 | __delayacct_tsk_init(tsk); |
60 | } | 60 | } |
61 | 61 | ||
@@ -80,9 +80,7 @@ static inline void delayacct_blkio_end(void) | |||
80 | static inline int delayacct_add_tsk(struct taskstats *d, | 80 | static inline int delayacct_add_tsk(struct taskstats *d, |
81 | struct task_struct *tsk) | 81 | struct task_struct *tsk) |
82 | { | 82 | { |
83 | if (likely(!delayacct_on)) | 83 | if (!delayacct_on || !tsk->delays) |
84 | return -EINVAL; | ||
85 | if (!tsk->delays) | ||
86 | return 0; | 84 | return 0; |
87 | return __delayacct_add_tsk(d, tsk); | 85 | return __delayacct_add_tsk(d, tsk); |
88 | } | 86 | } |
diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h index 5607e6457a65..9f9cce7bd86d 100644 --- a/include/linux/ext3_fs.h +++ b/include/linux/ext3_fs.h | |||
@@ -492,6 +492,15 @@ static inline struct ext3_inode_info *EXT3_I(struct inode *inode) | |||
492 | { | 492 | { |
493 | return container_of(inode, struct ext3_inode_info, vfs_inode); | 493 | return container_of(inode, struct ext3_inode_info, vfs_inode); |
494 | } | 494 | } |
495 | |||
496 | static inline int ext3_valid_inum(struct super_block *sb, unsigned long ino) | ||
497 | { | ||
498 | return ino == EXT3_ROOT_INO || | ||
499 | ino == EXT3_JOURNAL_INO || | ||
500 | ino == EXT3_RESIZE_INO || | ||
501 | (ino >= EXT3_FIRST_INO(sb) && | ||
502 | ino <= le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count)); | ||
503 | } | ||
495 | #else | 504 | #else |
496 | /* Assume that user mode programs are passing in an ext3fs superblock, not | 505 | /* Assume that user mode programs are passing in an ext3fs superblock, not |
497 | * a kernel struct super_block. This will allow us to call the feature-test | 506 | * a kernel struct super_block. This will allow us to call the feature-test |
diff --git a/include/linux/fb.h b/include/linux/fb.h index 405f44e44e5d..2f335e966011 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h | |||
@@ -1,7 +1,6 @@ | |||
1 | #ifndef _LINUX_FB_H | 1 | #ifndef _LINUX_FB_H |
2 | #define _LINUX_FB_H | 2 | #define _LINUX_FB_H |
3 | 3 | ||
4 | #include <linux/backlight.h> | ||
5 | #include <asm/types.h> | 4 | #include <asm/types.h> |
6 | 5 | ||
7 | /* Definitions of frame buffers */ | 6 | /* Definitions of frame buffers */ |
@@ -381,6 +380,7 @@ struct fb_cursor { | |||
381 | #include <linux/workqueue.h> | 380 | #include <linux/workqueue.h> |
382 | #include <linux/notifier.h> | 381 | #include <linux/notifier.h> |
383 | #include <linux/list.h> | 382 | #include <linux/list.h> |
383 | #include <linux/backlight.h> | ||
384 | #include <asm/io.h> | 384 | #include <asm/io.h> |
385 | 385 | ||
386 | struct vm_area_struct; | 386 | struct vm_area_struct; |
@@ -524,7 +524,7 @@ struct fb_event { | |||
524 | 524 | ||
525 | extern int fb_register_client(struct notifier_block *nb); | 525 | extern int fb_register_client(struct notifier_block *nb); |
526 | extern int fb_unregister_client(struct notifier_block *nb); | 526 | extern int fb_unregister_client(struct notifier_block *nb); |
527 | 527 | extern int fb_notifier_call_chain(unsigned long val, void *v); | |
528 | /* | 528 | /* |
529 | * Pixmap structure definition | 529 | * Pixmap structure definition |
530 | * | 530 | * |
diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index cc5dec70c32c..d4f219ffaa5d 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h | |||
@@ -67,7 +67,7 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, | |||
67 | if (source) { | 67 | if (source) { |
68 | inotify_inode_queue_event(source, IN_MOVE_SELF, 0, NULL, NULL); | 68 | inotify_inode_queue_event(source, IN_MOVE_SELF, 0, NULL, NULL); |
69 | } | 69 | } |
70 | audit_inode_child(new_name, source, new_dir->i_ino); | 70 | audit_inode_child(new_name, source, new_dir); |
71 | } | 71 | } |
72 | 72 | ||
73 | /* | 73 | /* |
@@ -98,7 +98,7 @@ static inline void fsnotify_create(struct inode *inode, struct dentry *dentry) | |||
98 | inode_dir_notify(inode, DN_CREATE); | 98 | inode_dir_notify(inode, DN_CREATE); |
99 | inotify_inode_queue_event(inode, IN_CREATE, 0, dentry->d_name.name, | 99 | inotify_inode_queue_event(inode, IN_CREATE, 0, dentry->d_name.name, |
100 | dentry->d_inode); | 100 | dentry->d_inode); |
101 | audit_inode_child(dentry->d_name.name, dentry->d_inode, inode->i_ino); | 101 | audit_inode_child(dentry->d_name.name, dentry->d_inode, inode); |
102 | } | 102 | } |
103 | 103 | ||
104 | /* | 104 | /* |
@@ -109,7 +109,7 @@ static inline void fsnotify_mkdir(struct inode *inode, struct dentry *dentry) | |||
109 | inode_dir_notify(inode, DN_CREATE); | 109 | inode_dir_notify(inode, DN_CREATE); |
110 | inotify_inode_queue_event(inode, IN_CREATE | IN_ISDIR, 0, | 110 | inotify_inode_queue_event(inode, IN_CREATE | IN_ISDIR, 0, |
111 | dentry->d_name.name, dentry->d_inode); | 111 | dentry->d_name.name, dentry->d_inode); |
112 | audit_inode_child(dentry->d_name.name, dentry->d_inode, inode->i_ino); | 112 | audit_inode_child(dentry->d_name.name, dentry->d_inode, inode); |
113 | } | 113 | } |
114 | 114 | ||
115 | /* | 115 | /* |
diff --git a/include/linux/futex.h b/include/linux/futex.h index 34c3a215f2cd..d097b5b72bc6 100644 --- a/include/linux/futex.h +++ b/include/linux/futex.h | |||
@@ -96,7 +96,8 @@ struct robust_list_head { | |||
96 | long do_futex(u32 __user *uaddr, int op, u32 val, unsigned long timeout, | 96 | long do_futex(u32 __user *uaddr, int op, u32 val, unsigned long timeout, |
97 | u32 __user *uaddr2, u32 val2, u32 val3); | 97 | u32 __user *uaddr2, u32 val2, u32 val3); |
98 | 98 | ||
99 | extern int handle_futex_death(u32 __user *uaddr, struct task_struct *curr); | 99 | extern int |
100 | handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi); | ||
100 | 101 | ||
101 | #ifdef CONFIG_FUTEX | 102 | #ifdef CONFIG_FUTEX |
102 | extern void exit_robust_list(struct task_struct *curr); | 103 | extern void exit_robust_list(struct task_struct *curr); |
diff --git a/include/linux/ide.h b/include/linux/ide.h index dc7abef10965..99620451d958 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -571,6 +571,7 @@ typedef struct ide_drive_s { | |||
571 | u8 waiting_for_dma; /* dma currently in progress */ | 571 | u8 waiting_for_dma; /* dma currently in progress */ |
572 | u8 unmask; /* okay to unmask other irqs */ | 572 | u8 unmask; /* okay to unmask other irqs */ |
573 | u8 bswap; /* byte swap data */ | 573 | u8 bswap; /* byte swap data */ |
574 | u8 noflush; /* don't attempt flushes */ | ||
574 | u8 dsc_overlap; /* DSC overlap */ | 575 | u8 dsc_overlap; /* DSC overlap */ |
575 | u8 nice1; /* give potential excess bandwidth */ | 576 | u8 nice1; /* give potential excess bandwidth */ |
576 | 577 | ||
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 383627ad328f..ab2740832742 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
@@ -155,6 +155,11 @@ static inline int __vlan_hwaccel_rx(struct sk_buff *skb, | |||
155 | { | 155 | { |
156 | struct net_device_stats *stats; | 156 | struct net_device_stats *stats; |
157 | 157 | ||
158 | if (skb_bond_should_drop(skb)) { | ||
159 | dev_kfree_skb_any(skb); | ||
160 | return NET_RX_DROP; | ||
161 | } | ||
162 | |||
158 | skb->dev = grp->vlan_devices[vlan_tag & VLAN_VID_MASK]; | 163 | skb->dev = grp->vlan_devices[vlan_tag & VLAN_VID_MASK]; |
159 | if (skb->dev == NULL) { | 164 | if (skb->dev == NULL) { |
160 | dev_kfree_skb_any(skb); | 165 | dev_kfree_skb_any(skb); |
diff --git a/include/linux/input.h b/include/linux/input.h index 56f1e0e1e598..b3253ab72ff7 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
@@ -893,7 +893,6 @@ struct input_dev { | |||
893 | 893 | ||
894 | int (*open)(struct input_dev *dev); | 894 | int (*open)(struct input_dev *dev); |
895 | void (*close)(struct input_dev *dev); | 895 | void (*close)(struct input_dev *dev); |
896 | int (*accept)(struct input_dev *dev, struct file *file); | ||
897 | int (*flush)(struct input_dev *dev, struct file *file); | 896 | int (*flush)(struct input_dev *dev, struct file *file); |
898 | int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); | 897 | int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); |
899 | int (*upload_effect)(struct input_dev *dev, struct ff_effect *effect); | 898 | int (*upload_effect)(struct input_dev *dev, struct ff_effect *effect); |
@@ -961,6 +960,26 @@ struct input_dev { | |||
961 | 960 | ||
962 | struct input_handle; | 961 | struct input_handle; |
963 | 962 | ||
963 | /** | ||
964 | * struct input_handler - implements one of interfaces for input devices | ||
965 | * @private: driver-specific data | ||
966 | * @event: event handler | ||
967 | * @connect: called when attaching a handler to an input device | ||
968 | * @disconnect: disconnects a handler from input device | ||
969 | * @start: starts handler for given handle. This function is called by | ||
970 | * input core right after connect() method and also when a process | ||
971 | * that "grabbed" a device releases it | ||
972 | * @fops: file operations this driver implements | ||
973 | * @minor: beginning of range of 32 minors for devices this driver | ||
974 | * can provide | ||
975 | * @name: name of the handler, to be shown in /proc/bus/input/handlers | ||
976 | * @id_table: pointer to a table of input_device_ids this driver can | ||
977 | * handle | ||
978 | * @blacklist: prointer to a table of input_device_ids this driver should | ||
979 | * ignore even if they match @id_table | ||
980 | * @h_list: list of input handles associated with the handler | ||
981 | * @node: for placing the driver onto input_handler_list | ||
982 | */ | ||
964 | struct input_handler { | 983 | struct input_handler { |
965 | 984 | ||
966 | void *private; | 985 | void *private; |
@@ -968,6 +987,7 @@ struct input_handler { | |||
968 | void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value); | 987 | void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value); |
969 | struct input_handle* (*connect)(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id); | 988 | struct input_handle* (*connect)(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id); |
970 | void (*disconnect)(struct input_handle *handle); | 989 | void (*disconnect)(struct input_handle *handle); |
990 | void (*start)(struct input_handle *handle); | ||
971 | 991 | ||
972 | const struct file_operations *fops; | 992 | const struct file_operations *fops; |
973 | int minor; | 993 | int minor; |
@@ -1030,10 +1050,10 @@ void input_release_device(struct input_handle *); | |||
1030 | int input_open_device(struct input_handle *); | 1050 | int input_open_device(struct input_handle *); |
1031 | void input_close_device(struct input_handle *); | 1051 | void input_close_device(struct input_handle *); |
1032 | 1052 | ||
1033 | int input_accept_process(struct input_handle *handle, struct file *file); | ||
1034 | int input_flush_device(struct input_handle* handle, struct file* file); | 1053 | int input_flush_device(struct input_handle* handle, struct file* file); |
1035 | 1054 | ||
1036 | void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value); | 1055 | void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value); |
1056 | void input_inject_event(struct input_handle *handle, unsigned int type, unsigned int code, int value); | ||
1037 | 1057 | ||
1038 | static inline void input_report_key(struct input_dev *dev, unsigned int code, int value) | 1058 | static inline void input_report_key(struct input_dev *dev, unsigned int code, int value) |
1039 | { | 1059 | { |
diff --git a/include/linux/irq.h b/include/linux/irq.h index b48eae32dc61..fbf6d901e9c2 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -47,8 +47,8 @@ | |||
47 | #define IRQ_WAITING 0x00200000 /* IRQ not yet seen - for autodetection */ | 47 | #define IRQ_WAITING 0x00200000 /* IRQ not yet seen - for autodetection */ |
48 | #define IRQ_LEVEL 0x00400000 /* IRQ level triggered */ | 48 | #define IRQ_LEVEL 0x00400000 /* IRQ level triggered */ |
49 | #define IRQ_MASKED 0x00800000 /* IRQ masked - shouldn't be seen again */ | 49 | #define IRQ_MASKED 0x00800000 /* IRQ masked - shouldn't be seen again */ |
50 | #define IRQ_PER_CPU 0x01000000 /* IRQ is per CPU */ | ||
50 | #ifdef CONFIG_IRQ_PER_CPU | 51 | #ifdef CONFIG_IRQ_PER_CPU |
51 | # define IRQ_PER_CPU 0x01000000 /* IRQ is per CPU */ | ||
52 | # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) | 52 | # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) |
53 | #else | 53 | #else |
54 | # define CHECK_IRQ_PER_CPU(var) 0 | 54 | # define CHECK_IRQ_PER_CPU(var) 0 |
@@ -58,6 +58,7 @@ | |||
58 | #define IRQ_NOREQUEST 0x04000000 /* IRQ cannot be requested */ | 58 | #define IRQ_NOREQUEST 0x04000000 /* IRQ cannot be requested */ |
59 | #define IRQ_NOAUTOEN 0x08000000 /* IRQ will not be enabled on request irq */ | 59 | #define IRQ_NOAUTOEN 0x08000000 /* IRQ will not be enabled on request irq */ |
60 | #define IRQ_DELAYED_DISABLE 0x10000000 /* IRQ disable (masking) happens delayed. */ | 60 | #define IRQ_DELAYED_DISABLE 0x10000000 /* IRQ disable (masking) happens delayed. */ |
61 | #define IRQ_WAKEUP 0x20000000 /* IRQ triggers system wakeup */ | ||
61 | 62 | ||
62 | struct proc_dir_entry; | 63 | struct proc_dir_entry; |
63 | 64 | ||
@@ -124,6 +125,7 @@ struct irq_chip { | |||
124 | * @action: the irq action chain | 125 | * @action: the irq action chain |
125 | * @status: status information | 126 | * @status: status information |
126 | * @depth: disable-depth, for nested irq_disable() calls | 127 | * @depth: disable-depth, for nested irq_disable() calls |
128 | * @wake_depth: enable depth, for multiple set_irq_wake() callers | ||
127 | * @irq_count: stats field to detect stalled irqs | 129 | * @irq_count: stats field to detect stalled irqs |
128 | * @irqs_unhandled: stats field for spurious unhandled interrupts | 130 | * @irqs_unhandled: stats field for spurious unhandled interrupts |
129 | * @lock: locking for SMP | 131 | * @lock: locking for SMP |
@@ -147,6 +149,7 @@ struct irq_desc { | |||
147 | unsigned int status; /* IRQ status */ | 149 | unsigned int status; /* IRQ status */ |
148 | 150 | ||
149 | unsigned int depth; /* nested irq disables */ | 151 | unsigned int depth; /* nested irq disables */ |
152 | unsigned int wake_depth; /* nested wake enables */ | ||
150 | unsigned int irq_count; /* For detecting broken IRQs */ | 153 | unsigned int irq_count; /* For detecting broken IRQs */ |
151 | unsigned int irqs_unhandled; | 154 | unsigned int irqs_unhandled; |
152 | spinlock_t lock; | 155 | spinlock_t lock; |
diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h index 043376920f51..329ebcffa106 100644 --- a/include/linux/jiffies.h +++ b/include/linux/jiffies.h | |||
@@ -47,8 +47,8 @@ | |||
47 | * - (NOM / DEN) fits in (32 - LSH) bits. | 47 | * - (NOM / DEN) fits in (32 - LSH) bits. |
48 | * - (NOM % DEN) fits in (32 - LSH) bits. | 48 | * - (NOM % DEN) fits in (32 - LSH) bits. |
49 | */ | 49 | */ |
50 | #define SH_DIV(NOM,DEN,LSH) ( ((NOM / DEN) << LSH) \ | 50 | #define SH_DIV(NOM,DEN,LSH) ( (((NOM) / (DEN)) << (LSH)) \ |
51 | + (((NOM % DEN) << LSH) + DEN / 2) / DEN) | 51 | + ((((NOM) % (DEN)) << (LSH)) + (DEN) / 2) / (DEN)) |
52 | 52 | ||
53 | /* HZ is the requested value. ACTHZ is actual HZ ("<< 8" is for accuracy) */ | 53 | /* HZ is the requested value. ACTHZ is actual HZ ("<< 8" is for accuracy) */ |
54 | #define ACTHZ (SH_DIV (CLOCK_TICK_RATE, LATCH, 8)) | 54 | #define ACTHZ (SH_DIV (CLOCK_TICK_RATE, LATCH, 8)) |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 181c69cad4e3..851aa1bcfc1a 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
@@ -210,6 +210,7 @@ extern enum system_states { | |||
210 | extern void dump_stack(void); | 210 | extern void dump_stack(void); |
211 | 211 | ||
212 | #ifdef DEBUG | 212 | #ifdef DEBUG |
213 | /* If you are writing a driver, please use dev_dbg instead */ | ||
213 | #define pr_debug(fmt,arg...) \ | 214 | #define pr_debug(fmt,arg...) \ |
214 | printk(KERN_DEBUG fmt,##arg) | 215 | printk(KERN_DEBUG fmt,##arg) |
215 | #else | 216 | #else |
diff --git a/include/linux/kobject.h b/include/linux/kobject.h index 0503b2ed8bae..2d229327959e 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h | |||
@@ -46,8 +46,6 @@ enum kobject_action { | |||
46 | KOBJ_UMOUNT = (__force kobject_action_t) 0x05, /* umount event for block devices (broken) */ | 46 | KOBJ_UMOUNT = (__force kobject_action_t) 0x05, /* umount event for block devices (broken) */ |
47 | KOBJ_OFFLINE = (__force kobject_action_t) 0x06, /* device offline */ | 47 | KOBJ_OFFLINE = (__force kobject_action_t) 0x06, /* device offline */ |
48 | KOBJ_ONLINE = (__force kobject_action_t) 0x07, /* device online */ | 48 | KOBJ_ONLINE = (__force kobject_action_t) 0x07, /* device online */ |
49 | KOBJ_UNDOCK = (__force kobject_action_t) 0x08, /* undocking */ | ||
50 | KOBJ_DOCK = (__force kobject_action_t) 0x09, /* dock */ | ||
51 | }; | 49 | }; |
52 | 50 | ||
53 | struct kobject { | 51 | struct kobject { |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 6cc497a2b6da..66c3100c2b94 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -265,12 +265,14 @@ enum { | |||
265 | 265 | ||
266 | /* ata_eh_info->flags */ | 266 | /* ata_eh_info->flags */ |
267 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ | 267 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ |
268 | ATA_EHI_RESUME_LINK = (1 << 1), /* need to resume link */ | 268 | ATA_EHI_RESUME_LINK = (1 << 1), /* resume link (reset modifier) */ |
269 | ATA_EHI_NO_AUTOPSY = (1 << 2), /* no autopsy */ | 269 | ATA_EHI_NO_AUTOPSY = (1 << 2), /* no autopsy */ |
270 | ATA_EHI_QUIET = (1 << 3), /* be quiet */ | 270 | ATA_EHI_QUIET = (1 << 3), /* be quiet */ |
271 | 271 | ||
272 | ATA_EHI_DID_RESET = (1 << 16), /* already reset this port */ | 272 | ATA_EHI_DID_RESET = (1 << 16), /* already reset this port */ |
273 | 273 | ||
274 | ATA_EHI_RESET_MODIFIER_MASK = ATA_EHI_RESUME_LINK, | ||
275 | |||
274 | /* max repeat if error condition is still set after ->error_handler */ | 276 | /* max repeat if error condition is still set after ->error_handler */ |
275 | ATA_EH_MAX_REPEAT = 5, | 277 | ATA_EH_MAX_REPEAT = 5, |
276 | 278 | ||
diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h index aa4fe905bb4d..0d92c468d55a 100644 --- a/include/linux/lockd/lockd.h +++ b/include/linux/lockd/lockd.h | |||
@@ -123,7 +123,6 @@ struct nlm_block { | |||
123 | unsigned int b_id; /* block id */ | 123 | unsigned int b_id; /* block id */ |
124 | unsigned char b_queued; /* re-queued */ | 124 | unsigned char b_queued; /* re-queued */ |
125 | unsigned char b_granted; /* VFS granted lock */ | 125 | unsigned char b_granted; /* VFS granted lock */ |
126 | unsigned char b_done; /* callback complete */ | ||
127 | struct nlm_file * b_file; /* file in question */ | 126 | struct nlm_file * b_file; /* file in question */ |
128 | }; | 127 | }; |
129 | 128 | ||
diff --git a/include/linux/mm.h b/include/linux/mm.h index 990957e0929f..f0b135cd86da 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -336,6 +336,7 @@ static inline void init_page_count(struct page *page) | |||
336 | } | 336 | } |
337 | 337 | ||
338 | void put_page(struct page *page); | 338 | void put_page(struct page *page); |
339 | void put_pages_list(struct list_head *pages); | ||
339 | 340 | ||
340 | void split_page(struct page *page, unsigned int order); | 341 | void split_page(struct page *page, unsigned int order); |
341 | 342 | ||
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 75f02d8c6ed3..50a4719512ed 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -320,6 +320,9 @@ struct net_device | |||
320 | #define NETIF_F_TSO_ECN (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT) | 320 | #define NETIF_F_TSO_ECN (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT) |
321 | #define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT) | 321 | #define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT) |
322 | 322 | ||
323 | /* List of features with software fallbacks. */ | ||
324 | #define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6) | ||
325 | |||
323 | #define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) | 326 | #define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) |
324 | #define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM) | 327 | #define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM) |
325 | 328 | ||
@@ -1012,6 +1015,30 @@ static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) | |||
1012 | unlikely(skb->ip_summed != CHECKSUM_HW)); | 1015 | unlikely(skb->ip_summed != CHECKSUM_HW)); |
1013 | } | 1016 | } |
1014 | 1017 | ||
1018 | /* On bonding slaves other than the currently active slave, suppress | ||
1019 | * duplicates except for 802.3ad ETH_P_SLOW and alb non-mcast/bcast. | ||
1020 | */ | ||
1021 | static inline int skb_bond_should_drop(struct sk_buff *skb) | ||
1022 | { | ||
1023 | struct net_device *dev = skb->dev; | ||
1024 | struct net_device *master = dev->master; | ||
1025 | |||
1026 | if (master && | ||
1027 | (dev->priv_flags & IFF_SLAVE_INACTIVE)) { | ||
1028 | if (master->priv_flags & IFF_MASTER_ALB) { | ||
1029 | if (skb->pkt_type != PACKET_BROADCAST && | ||
1030 | skb->pkt_type != PACKET_MULTICAST) | ||
1031 | return 0; | ||
1032 | } | ||
1033 | if (master->priv_flags & IFF_MASTER_8023AD && | ||
1034 | skb->protocol == __constant_htons(ETH_P_SLOW)) | ||
1035 | return 0; | ||
1036 | |||
1037 | return 1; | ||
1038 | } | ||
1039 | return 0; | ||
1040 | } | ||
1041 | |||
1015 | #endif /* __KERNEL__ */ | 1042 | #endif /* __KERNEL__ */ |
1016 | 1043 | ||
1017 | #endif /* _LINUX_DEV_H */ | 1044 | #endif /* _LINUX_DEV_H */ |
diff --git a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h index 87764022cc67..10c13dc4665b 100644 --- a/include/linux/netfilter_bridge.h +++ b/include/linux/netfilter_bridge.h | |||
@@ -6,7 +6,6 @@ | |||
6 | 6 | ||
7 | #include <linux/netfilter.h> | 7 | #include <linux/netfilter.h> |
8 | #if defined(__KERNEL__) && defined(CONFIG_BRIDGE_NETFILTER) | 8 | #if defined(__KERNEL__) && defined(CONFIG_BRIDGE_NETFILTER) |
9 | #include <asm/atomic.h> | ||
10 | #include <linux/if_ether.h> | 9 | #include <linux/if_ether.h> |
11 | #endif | 10 | #endif |
12 | 11 | ||
@@ -79,6 +78,8 @@ struct bridge_skb_cb { | |||
79 | __u32 ipv4; | 78 | __u32 ipv4; |
80 | } daddr; | 79 | } daddr; |
81 | }; | 80 | }; |
81 | |||
82 | extern int brnf_deferred_hooks; | ||
82 | #endif /* CONFIG_BRIDGE_NETFILTER */ | 83 | #endif /* CONFIG_BRIDGE_NETFILTER */ |
83 | 84 | ||
84 | #endif /* __KERNEL__ */ | 85 | #endif /* __KERNEL__ */ |
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 55ea853d57bc..247434553ae8 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
@@ -476,10 +476,9 @@ static inline int nfs_wb_page(struct inode *inode, struct page* page) | |||
476 | } | 476 | } |
477 | 477 | ||
478 | /* | 478 | /* |
479 | * Allocate and free nfs_write_data structures | 479 | * Allocate nfs_write_data structures |
480 | */ | 480 | */ |
481 | extern struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount); | 481 | extern struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount); |
482 | extern void nfs_writedata_free(struct nfs_write_data *p); | ||
483 | 482 | ||
484 | /* | 483 | /* |
485 | * linux/fs/nfs/read.c | 484 | * linux/fs/nfs/read.c |
@@ -491,10 +490,9 @@ extern int nfs_readpage_result(struct rpc_task *, struct nfs_read_data *); | |||
491 | extern void nfs_readdata_release(void *data); | 490 | extern void nfs_readdata_release(void *data); |
492 | 491 | ||
493 | /* | 492 | /* |
494 | * Allocate and free nfs_read_data structures | 493 | * Allocate nfs_read_data structures |
495 | */ | 494 | */ |
496 | extern struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount); | 495 | extern struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount); |
497 | extern void nfs_readdata_free(struct nfs_read_data *p); | ||
498 | 496 | ||
499 | /* | 497 | /* |
500 | * linux/fs/nfs3proc.c | 498 | * linux/fs/nfs3proc.c |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index c09396d2c77b..4eae06b08cf2 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
@@ -2142,6 +2142,7 @@ | |||
2142 | #define PCI_DEVICE_ID_INTEL_82820_UP_HB 0x2501 | 2142 | #define PCI_DEVICE_ID_INTEL_82820_UP_HB 0x2501 |
2143 | #define PCI_DEVICE_ID_INTEL_82850_HB 0x2530 | 2143 | #define PCI_DEVICE_ID_INTEL_82850_HB 0x2530 |
2144 | #define PCI_DEVICE_ID_INTEL_82860_HB 0x2531 | 2144 | #define PCI_DEVICE_ID_INTEL_82860_HB 0x2531 |
2145 | #define PCI_DEVICE_ID_INTEL_E7501_MCH 0x254c | ||
2145 | #define PCI_DEVICE_ID_INTEL_82845G_HB 0x2560 | 2146 | #define PCI_DEVICE_ID_INTEL_82845G_HB 0x2560 |
2146 | #define PCI_DEVICE_ID_INTEL_82845G_IG 0x2562 | 2147 | #define PCI_DEVICE_ID_INTEL_82845G_IG 0x2562 |
2147 | #define PCI_DEVICE_ID_INTEL_82865_HB 0x2570 | 2148 | #define PCI_DEVICE_ID_INTEL_82865_HB 0x2570 |
diff --git a/include/linux/pmu.h b/include/linux/pmu.h index 2ed807ddc08c..783177387ac6 100644 --- a/include/linux/pmu.h +++ b/include/linux/pmu.h | |||
@@ -231,7 +231,6 @@ extern struct pmu_battery_info pmu_batteries[PMU_MAX_BATTERIES]; | |||
231 | extern unsigned int pmu_power_flags; | 231 | extern unsigned int pmu_power_flags; |
232 | 232 | ||
233 | /* Backlight */ | 233 | /* Backlight */ |
234 | extern int disable_kernel_backlight; | 234 | extern void pmu_backlight_init(void); |
235 | extern void pmu_backlight_init(struct device_node*); | ||
236 | 235 | ||
237 | #endif /* __KERNEL__ */ | 236 | #endif /* __KERNEL__ */ |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 6afa72e080cb..6674fc1e51bf 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -1558,6 +1558,14 @@ static inline void freeze(struct task_struct *p) | |||
1558 | } | 1558 | } |
1559 | 1559 | ||
1560 | /* | 1560 | /* |
1561 | * Sometimes we may need to cancel the previous 'freeze' request | ||
1562 | */ | ||
1563 | static inline void do_not_freeze(struct task_struct *p) | ||
1564 | { | ||
1565 | p->flags &= ~PF_FREEZE; | ||
1566 | } | ||
1567 | |||
1568 | /* | ||
1561 | * Wake up a frozen process | 1569 | * Wake up a frozen process |
1562 | */ | 1570 | */ |
1563 | static inline int thaw_process(struct task_struct *p) | 1571 | static inline int thaw_process(struct task_struct *p) |
diff --git a/include/linux/security.h b/include/linux/security.h index f75303831d09..6bc2aad494ff 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
@@ -1109,6 +1109,16 @@ struct swap_info_struct; | |||
1109 | * @name contains the name of the security module being unstacked. | 1109 | * @name contains the name of the security module being unstacked. |
1110 | * @ops contains a pointer to the struct security_operations of the module to unstack. | 1110 | * @ops contains a pointer to the struct security_operations of the module to unstack. |
1111 | * | 1111 | * |
1112 | * @secid_to_secctx: | ||
1113 | * Convert secid to security context. | ||
1114 | * @secid contains the security ID. | ||
1115 | * @secdata contains the pointer that stores the converted security context. | ||
1116 | * | ||
1117 | * @release_secctx: | ||
1118 | * Release the security context. | ||
1119 | * @secdata contains the security context. | ||
1120 | * @seclen contains the length of the security context. | ||
1121 | * | ||
1112 | * This is the main security structure. | 1122 | * This is the main security structure. |
1113 | */ | 1123 | */ |
1114 | struct security_operations { | 1124 | struct security_operations { |
@@ -1289,6 +1299,8 @@ struct security_operations { | |||
1289 | 1299 | ||
1290 | int (*getprocattr)(struct task_struct *p, char *name, void *value, size_t size); | 1300 | int (*getprocattr)(struct task_struct *p, char *name, void *value, size_t size); |
1291 | int (*setprocattr)(struct task_struct *p, char *name, void *value, size_t size); | 1301 | int (*setprocattr)(struct task_struct *p, char *name, void *value, size_t size); |
1302 | int (*secid_to_secctx)(u32 secid, char **secdata, u32 *seclen); | ||
1303 | void (*release_secctx)(char *secdata, u32 seclen); | ||
1292 | 1304 | ||
1293 | #ifdef CONFIG_SECURITY_NETWORK | 1305 | #ifdef CONFIG_SECURITY_NETWORK |
1294 | int (*unix_stream_connect) (struct socket * sock, | 1306 | int (*unix_stream_connect) (struct socket * sock, |
@@ -1317,7 +1329,7 @@ struct security_operations { | |||
1317 | int (*socket_shutdown) (struct socket * sock, int how); | 1329 | int (*socket_shutdown) (struct socket * sock, int how); |
1318 | int (*socket_sock_rcv_skb) (struct sock * sk, struct sk_buff * skb); | 1330 | int (*socket_sock_rcv_skb) (struct sock * sk, struct sk_buff * skb); |
1319 | int (*socket_getpeersec_stream) (struct socket *sock, char __user *optval, int __user *optlen, unsigned len); | 1331 | int (*socket_getpeersec_stream) (struct socket *sock, char __user *optval, int __user *optlen, unsigned len); |
1320 | int (*socket_getpeersec_dgram) (struct sk_buff *skb, char **secdata, u32 *seclen); | 1332 | int (*socket_getpeersec_dgram) (struct socket *sock, struct sk_buff *skb, u32 *secid); |
1321 | int (*sk_alloc_security) (struct sock *sk, int family, gfp_t priority); | 1333 | int (*sk_alloc_security) (struct sock *sk, int family, gfp_t priority); |
1322 | void (*sk_free_security) (struct sock *sk); | 1334 | void (*sk_free_security) (struct sock *sk); |
1323 | unsigned int (*sk_getsid) (struct sock *sk, struct flowi *fl, u8 dir); | 1335 | unsigned int (*sk_getsid) (struct sock *sk, struct flowi *fl, u8 dir); |
@@ -2059,6 +2071,16 @@ static inline int security_netlink_recv(struct sk_buff * skb, int cap) | |||
2059 | return security_ops->netlink_recv(skb, cap); | 2071 | return security_ops->netlink_recv(skb, cap); |
2060 | } | 2072 | } |
2061 | 2073 | ||
2074 | static inline int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) | ||
2075 | { | ||
2076 | return security_ops->secid_to_secctx(secid, secdata, seclen); | ||
2077 | } | ||
2078 | |||
2079 | static inline void security_release_secctx(char *secdata, u32 seclen) | ||
2080 | { | ||
2081 | return security_ops->release_secctx(secdata, seclen); | ||
2082 | } | ||
2083 | |||
2062 | /* prototypes */ | 2084 | /* prototypes */ |
2063 | extern int security_init (void); | 2085 | extern int security_init (void); |
2064 | extern int register_security (struct security_operations *ops); | 2086 | extern int register_security (struct security_operations *ops); |
@@ -2725,6 +2747,14 @@ static inline void securityfs_remove(struct dentry *dentry) | |||
2725 | { | 2747 | { |
2726 | } | 2748 | } |
2727 | 2749 | ||
2750 | static inline int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) | ||
2751 | { | ||
2752 | return -EOPNOTSUPP; | ||
2753 | } | ||
2754 | |||
2755 | static inline void security_release_secctx(char *secdata, u32 seclen) | ||
2756 | { | ||
2757 | } | ||
2728 | #endif /* CONFIG_SECURITY */ | 2758 | #endif /* CONFIG_SECURITY */ |
2729 | 2759 | ||
2730 | #ifdef CONFIG_SECURITY_NETWORK | 2760 | #ifdef CONFIG_SECURITY_NETWORK |
@@ -2840,10 +2870,9 @@ static inline int security_socket_getpeersec_stream(struct socket *sock, char __ | |||
2840 | return security_ops->socket_getpeersec_stream(sock, optval, optlen, len); | 2870 | return security_ops->socket_getpeersec_stream(sock, optval, optlen, len); |
2841 | } | 2871 | } |
2842 | 2872 | ||
2843 | static inline int security_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata, | 2873 | static inline int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) |
2844 | u32 *seclen) | ||
2845 | { | 2874 | { |
2846 | return security_ops->socket_getpeersec_dgram(skb, secdata, seclen); | 2875 | return security_ops->socket_getpeersec_dgram(sock, skb, secid); |
2847 | } | 2876 | } |
2848 | 2877 | ||
2849 | static inline int security_sk_alloc(struct sock *sk, int family, gfp_t priority) | 2878 | static inline int security_sk_alloc(struct sock *sk, int family, gfp_t priority) |
@@ -2968,8 +2997,7 @@ static inline int security_socket_getpeersec_stream(struct socket *sock, char __ | |||
2968 | return -ENOPROTOOPT; | 2997 | return -ENOPROTOOPT; |
2969 | } | 2998 | } |
2970 | 2999 | ||
2971 | static inline int security_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata, | 3000 | static inline int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) |
2972 | u32 *seclen) | ||
2973 | { | 3001 | { |
2974 | return -ENOPROTOOPT; | 3002 | return -ENOPROTOOPT; |
2975 | } | 3003 | } |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 4307e764ef0a..755e9cddac47 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -604,12 +604,17 @@ static inline __u32 skb_queue_len(const struct sk_buff_head *list_) | |||
604 | return list_->qlen; | 604 | return list_->qlen; |
605 | } | 605 | } |
606 | 606 | ||
607 | extern struct lock_class_key skb_queue_lock_key; | 607 | /* |
608 | 608 | * This function creates a split out lock class for each invocation; | |
609 | * this is needed for now since a whole lot of users of the skb-queue | ||
610 | * infrastructure in drivers have different locking usage (in hardirq) | ||
611 | * than the networking core (in softirq only). In the long run either the | ||
612 | * network layer or drivers should need annotation to consolidate the | ||
613 | * main types of usage into 3 classes. | ||
614 | */ | ||
609 | static inline void skb_queue_head_init(struct sk_buff_head *list) | 615 | static inline void skb_queue_head_init(struct sk_buff_head *list) |
610 | { | 616 | { |
611 | spin_lock_init(&list->lock); | 617 | spin_lock_init(&list->lock); |
612 | lockdep_set_class(&list->lock, &skb_queue_lock_key); | ||
613 | list->prev = list->next = (struct sk_buff *)list; | 618 | list->prev = list->next = (struct sk_buff *)list; |
614 | list->qlen = 0; | 619 | list->qlen = 0; |
615 | } | 620 | } |
@@ -1035,6 +1040,21 @@ static inline int pskb_trim(struct sk_buff *skb, unsigned int len) | |||
1035 | } | 1040 | } |
1036 | 1041 | ||
1037 | /** | 1042 | /** |
1043 | * pskb_trim_unique - remove end from a paged unique (not cloned) buffer | ||
1044 | * @skb: buffer to alter | ||
1045 | * @len: new length | ||
1046 | * | ||
1047 | * This is identical to pskb_trim except that the caller knows that | ||
1048 | * the skb is not cloned so we should never get an error due to out- | ||
1049 | * of-memory. | ||
1050 | */ | ||
1051 | static inline void pskb_trim_unique(struct sk_buff *skb, unsigned int len) | ||
1052 | { | ||
1053 | int err = pskb_trim(skb, len); | ||
1054 | BUG_ON(err); | ||
1055 | } | ||
1056 | |||
1057 | /** | ||
1038 | * skb_orphan - orphan a buffer | 1058 | * skb_orphan - orphan a buffer |
1039 | * @skb: buffer to orphan | 1059 | * @skb: buffer to orphan |
1040 | * | 1060 | * |
@@ -1076,7 +1096,7 @@ static inline void __skb_queue_purge(struct sk_buff_head *list) | |||
1076 | * the headroom they think they need without accounting for the | 1096 | * the headroom they think they need without accounting for the |
1077 | * built in space. The built in space is used for optimisations. | 1097 | * built in space. The built in space is used for optimisations. |
1078 | * | 1098 | * |
1079 | * %NULL is returned in there is no free memory. | 1099 | * %NULL is returned if there is no free memory. |
1080 | */ | 1100 | */ |
1081 | static inline struct sk_buff *__dev_alloc_skb(unsigned int length, | 1101 | static inline struct sk_buff *__dev_alloc_skb(unsigned int length, |
1082 | gfp_t gfp_mask) | 1102 | gfp_t gfp_mask) |
@@ -1096,7 +1116,7 @@ static inline struct sk_buff *__dev_alloc_skb(unsigned int length, | |||
1096 | * the headroom they think they need without accounting for the | 1116 | * the headroom they think they need without accounting for the |
1097 | * built in space. The built in space is used for optimisations. | 1117 | * built in space. The built in space is used for optimisations. |
1098 | * | 1118 | * |
1099 | * %NULL is returned in there is no free memory. Although this function | 1119 | * %NULL is returned if there is no free memory. Although this function |
1100 | * allocates memory it can be called from an interrupt. | 1120 | * allocates memory it can be called from an interrupt. |
1101 | */ | 1121 | */ |
1102 | static inline struct sk_buff *dev_alloc_skb(unsigned int length) | 1122 | static inline struct sk_buff *dev_alloc_skb(unsigned int length) |
@@ -1104,6 +1124,28 @@ static inline struct sk_buff *dev_alloc_skb(unsigned int length) | |||
1104 | return __dev_alloc_skb(length, GFP_ATOMIC); | 1124 | return __dev_alloc_skb(length, GFP_ATOMIC); |
1105 | } | 1125 | } |
1106 | 1126 | ||
1127 | extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev, | ||
1128 | unsigned int length, gfp_t gfp_mask); | ||
1129 | |||
1130 | /** | ||
1131 | * netdev_alloc_skb - allocate an skbuff for rx on a specific device | ||
1132 | * @dev: network device to receive on | ||
1133 | * @length: length to allocate | ||
1134 | * | ||
1135 | * Allocate a new &sk_buff and assign it a usage count of one. The | ||
1136 | * buffer has unspecified headroom built in. Users should allocate | ||
1137 | * the headroom they think they need without accounting for the | ||
1138 | * built in space. The built in space is used for optimisations. | ||
1139 | * | ||
1140 | * %NULL is returned if there is no free memory. Although this function | ||
1141 | * allocates memory it can be called from an interrupt. | ||
1142 | */ | ||
1143 | static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev, | ||
1144 | unsigned int length) | ||
1145 | { | ||
1146 | return __netdev_alloc_skb(dev, length, GFP_ATOMIC); | ||
1147 | } | ||
1148 | |||
1107 | /** | 1149 | /** |
1108 | * skb_cow - copy header of skb when it is required | 1150 | * skb_cow - copy header of skb when it is required |
1109 | * @skb: buffer to cow | 1151 | * @skb: buffer to cow |
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index e8bbe8118de8..840e47a4ccc5 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
@@ -229,7 +229,7 @@ int xprt_reserve_xprt(struct rpc_task *task); | |||
229 | int xprt_reserve_xprt_cong(struct rpc_task *task); | 229 | int xprt_reserve_xprt_cong(struct rpc_task *task); |
230 | int xprt_prepare_transmit(struct rpc_task *task); | 230 | int xprt_prepare_transmit(struct rpc_task *task); |
231 | void xprt_transmit(struct rpc_task *task); | 231 | void xprt_transmit(struct rpc_task *task); |
232 | void xprt_abort_transmit(struct rpc_task *task); | 232 | void xprt_end_transmit(struct rpc_task *task); |
233 | int xprt_adjust_timeout(struct rpc_rqst *req); | 233 | int xprt_adjust_timeout(struct rpc_rqst *req); |
234 | void xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task); | 234 | void xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task); |
235 | void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); | 235 | void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); |
diff --git a/include/linux/usb.h b/include/linux/usb.h index c944e8f06a4a..d2bd0c8e0154 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -103,8 +103,7 @@ enum usb_interface_condition { | |||
103 | * @condition: binding state of the interface: not bound, binding | 103 | * @condition: binding state of the interface: not bound, binding |
104 | * (in probe()), bound to a driver, or unbinding (in disconnect()) | 104 | * (in probe()), bound to a driver, or unbinding (in disconnect()) |
105 | * @dev: driver model's view of this device | 105 | * @dev: driver model's view of this device |
106 | * @usb_dev: if an interface is bound to the USB major, this will point | 106 | * @class_dev: driver model's class view of this device. |
107 | * to the sysfs representation for that device. | ||
108 | * | 107 | * |
109 | * USB device drivers attach to interfaces on a physical device. Each | 108 | * USB device drivers attach to interfaces on a physical device. Each |
110 | * interface encapsulates a single high level function, such as feeding | 109 | * interface encapsulates a single high level function, such as feeding |
@@ -144,7 +143,7 @@ struct usb_interface { | |||
144 | * bound to */ | 143 | * bound to */ |
145 | enum usb_interface_condition condition; /* state of binding */ | 144 | enum usb_interface_condition condition; /* state of binding */ |
146 | struct device dev; /* interface specific device info */ | 145 | struct device dev; /* interface specific device info */ |
147 | struct device *usb_dev; /* pointer to the usb class's device, if any */ | 146 | struct class_device *class_dev; |
148 | }; | 147 | }; |
149 | #define to_usb_interface(d) container_of(d, struct usb_interface, dev) | 148 | #define to_usb_interface(d) container_of(d, struct usb_interface, dev) |
150 | #define interface_to_usbdev(intf) \ | 149 | #define interface_to_usbdev(intf) \ |
@@ -361,7 +360,7 @@ struct usb_device { | |||
361 | char *serial; /* iSerialNumber string, if present */ | 360 | char *serial; /* iSerialNumber string, if present */ |
362 | 361 | ||
363 | struct list_head filelist; | 362 | struct list_head filelist; |
364 | struct device *usbfs_dev; | 363 | struct class_device *class_dev; |
365 | struct dentry *usbfs_dentry; /* usbfs dentry entry for the device */ | 364 | struct dentry *usbfs_dentry; /* usbfs dentry entry for the device */ |
366 | 365 | ||
367 | /* | 366 | /* |
diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h index f38f43f20fae..e7fc5fed5b98 100644 --- a/include/linux/usb_usual.h +++ b/include/linux/usb_usual.h | |||
@@ -44,7 +44,9 @@ | |||
44 | US_FLAG(NO_WP_DETECT, 0x00000200) \ | 44 | US_FLAG(NO_WP_DETECT, 0x00000200) \ |
45 | /* Don't check for write-protect */ \ | 45 | /* Don't check for write-protect */ \ |
46 | US_FLAG(MAX_SECTORS_64, 0x00000400) \ | 46 | US_FLAG(MAX_SECTORS_64, 0x00000400) \ |
47 | /* Sets max_sectors to 64 */ | 47 | /* Sets max_sectors to 64 */ \ |
48 | US_FLAG(IGNORE_DEVICE, 0x00000800) \ | ||
49 | /* Don't claim device */ | ||
48 | 50 | ||
49 | #define US_FLAG(name, value) US_FL_##name = value , | 51 | #define US_FLAG(name, value) US_FL_##name = value , |
50 | enum { US_DO_ALL_FLAGS }; | 52 | enum { US_DO_ALL_FLAGS }; |
diff --git a/include/linux/videodev.h b/include/linux/videodev.h index 41bc7e9603cd..518c7a32175e 100644 --- a/include/linux/videodev.h +++ b/include/linux/videodev.h | |||
@@ -12,10 +12,11 @@ | |||
12 | #ifndef __LINUX_VIDEODEV_H | 12 | #ifndef __LINUX_VIDEODEV_H |
13 | #define __LINUX_VIDEODEV_H | 13 | #define __LINUX_VIDEODEV_H |
14 | 14 | ||
15 | #define HAVE_V4L1 1 | ||
16 | |||
17 | #include <linux/videodev2.h> | 15 | #include <linux/videodev2.h> |
18 | 16 | ||
17 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
18 | #define HAVE_V4L1 1 | ||
19 | |||
19 | struct video_capability | 20 | struct video_capability |
20 | { | 21 | { |
21 | char name[32]; | 22 | char name[32]; |
@@ -336,6 +337,8 @@ struct video_code | |||
336 | #define VID_HARDWARE_SN9C102 38 | 337 | #define VID_HARDWARE_SN9C102 38 |
337 | #define VID_HARDWARE_ARV 39 | 338 | #define VID_HARDWARE_ARV 39 |
338 | 339 | ||
340 | #endif /* CONFIG_VIDEO_V4L1_COMPAT */ | ||
341 | |||
339 | #endif /* __LINUX_VIDEODEV_H */ | 342 | #endif /* __LINUX_VIDEODEV_H */ |
340 | 343 | ||
341 | /* | 344 | /* |
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index a62673dad76e..b7146956a929 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
@@ -716,7 +716,7 @@ struct v4l2_ext_control | |||
716 | __s64 value64; | 716 | __s64 value64; |
717 | void *reserved; | 717 | void *reserved; |
718 | }; | 718 | }; |
719 | }; | 719 | } __attribute__ ((packed)); |
720 | 720 | ||
721 | struct v4l2_ext_controls | 721 | struct v4l2_ext_controls |
722 | { | 722 | { |
diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h index 1ab806c47514..2d9b1b60798a 100644 --- a/include/linux/vmstat.h +++ b/include/linux/vmstat.h | |||
@@ -41,23 +41,23 @@ DECLARE_PER_CPU(struct vm_event_state, vm_event_states); | |||
41 | 41 | ||
42 | static inline void __count_vm_event(enum vm_event_item item) | 42 | static inline void __count_vm_event(enum vm_event_item item) |
43 | { | 43 | { |
44 | __get_cpu_var(vm_event_states.event[item])++; | 44 | __get_cpu_var(vm_event_states).event[item]++; |
45 | } | 45 | } |
46 | 46 | ||
47 | static inline void count_vm_event(enum vm_event_item item) | 47 | static inline void count_vm_event(enum vm_event_item item) |
48 | { | 48 | { |
49 | get_cpu_var(vm_event_states.event[item])++; | 49 | get_cpu_var(vm_event_states).event[item]++; |
50 | put_cpu(); | 50 | put_cpu(); |
51 | } | 51 | } |
52 | 52 | ||
53 | static inline void __count_vm_events(enum vm_event_item item, long delta) | 53 | static inline void __count_vm_events(enum vm_event_item item, long delta) |
54 | { | 54 | { |
55 | __get_cpu_var(vm_event_states.event[item]) += delta; | 55 | __get_cpu_var(vm_event_states).event[item] += delta; |
56 | } | 56 | } |
57 | 57 | ||
58 | static inline void count_vm_events(enum vm_event_item item, long delta) | 58 | static inline void count_vm_events(enum vm_event_item item, long delta) |
59 | { | 59 | { |
60 | get_cpu_var(vm_event_states.event[item]) += delta; | 60 | get_cpu_var(vm_event_states).event[item] += delta; |
61 | put_cpu(); | 61 | put_cpu(); |
62 | } | 62 | } |
63 | 63 | ||
diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h index 62dae1a8c441..600d61d7d2ab 100644 --- a/include/media/v4l2-dev.h +++ b/include/media/v4l2-dev.h | |||
@@ -16,7 +16,7 @@ | |||
16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
17 | #include <linux/mutex.h> | 17 | #include <linux/mutex.h> |
18 | #include <linux/compiler.h> /* need __user */ | 18 | #include <linux/compiler.h> /* need __user */ |
19 | #ifdef CONFIG_VIDEO_V4L1 | 19 | #ifdef CONFIG_VIDEO_V4L1_COMPAT |
20 | #include <linux/videodev.h> | 20 | #include <linux/videodev.h> |
21 | #else | 21 | #else |
22 | #include <linux/videodev2.h> | 22 | #include <linux/videodev2.h> |
@@ -341,11 +341,14 @@ extern int video_usercopy(struct inode *inode, struct file *file, | |||
341 | extern struct video_device* video_devdata(struct file*); | 341 | extern struct video_device* video_devdata(struct file*); |
342 | 342 | ||
343 | #define to_video_device(cd) container_of(cd, struct video_device, class_dev) | 343 | #define to_video_device(cd) container_of(cd, struct video_device, class_dev) |
344 | static inline void | 344 | static inline int |
345 | video_device_create_file(struct video_device *vfd, | 345 | video_device_create_file(struct video_device *vfd, |
346 | struct class_device_attribute *attr) | 346 | struct class_device_attribute *attr) |
347 | { | 347 | { |
348 | class_device_create_file(&vfd->class_dev, attr); | 348 | int ret = class_device_create_file(&vfd->class_dev, attr); |
349 | if (ret < 0) | ||
350 | printk(KERN_WARNING "%s error: %d\n", __FUNCTION__, ret); | ||
351 | return ret; | ||
349 | } | 352 | } |
350 | static inline void | 353 | static inline void |
351 | video_device_remove_file(struct video_device *vfd, | 354 | video_device_remove_file(struct video_device *vfd, |
diff --git a/include/net/af_unix.h b/include/net/af_unix.h index 2fec827c8801..c0398f5a8cb9 100644 --- a/include/net/af_unix.h +++ b/include/net/af_unix.h | |||
@@ -54,15 +54,13 @@ struct unix_skb_parms { | |||
54 | struct ucred creds; /* Skb credentials */ | 54 | struct ucred creds; /* Skb credentials */ |
55 | struct scm_fp_list *fp; /* Passed files */ | 55 | struct scm_fp_list *fp; /* Passed files */ |
56 | #ifdef CONFIG_SECURITY_NETWORK | 56 | #ifdef CONFIG_SECURITY_NETWORK |
57 | char *secdata; /* Security context */ | 57 | u32 secid; /* Security ID */ |
58 | u32 seclen; /* Security length */ | ||
59 | #endif | 58 | #endif |
60 | }; | 59 | }; |
61 | 60 | ||
62 | #define UNIXCB(skb) (*(struct unix_skb_parms*)&((skb)->cb)) | 61 | #define UNIXCB(skb) (*(struct unix_skb_parms*)&((skb)->cb)) |
63 | #define UNIXCREDS(skb) (&UNIXCB((skb)).creds) | 62 | #define UNIXCREDS(skb) (&UNIXCB((skb)).creds) |
64 | #define UNIXSECDATA(skb) (&UNIXCB((skb)).secdata) | 63 | #define UNIXSID(skb) (&UNIXCB((skb)).secid) |
65 | #define UNIXSECLEN(skb) (&UNIXCB((skb)).seclen) | ||
66 | 64 | ||
67 | #define unix_state_rlock(s) spin_lock(&unix_sk(s)->lock) | 65 | #define unix_state_rlock(s) spin_lock(&unix_sk(s)->lock) |
68 | #define unix_state_runlock(s) spin_unlock(&unix_sk(s)->lock) | 66 | #define unix_state_runlock(s) spin_unlock(&unix_sk(s)->lock) |
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index ab29dafb1a6a..96b0e66406ec 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h | |||
@@ -139,16 +139,22 @@ extern rwlock_t rt6_lock; | |||
139 | /* | 139 | /* |
140 | * Store a destination cache entry in a socket | 140 | * Store a destination cache entry in a socket |
141 | */ | 141 | */ |
142 | static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst, | 142 | static inline void __ip6_dst_store(struct sock *sk, struct dst_entry *dst, |
143 | struct in6_addr *daddr) | 143 | struct in6_addr *daddr) |
144 | { | 144 | { |
145 | struct ipv6_pinfo *np = inet6_sk(sk); | 145 | struct ipv6_pinfo *np = inet6_sk(sk); |
146 | struct rt6_info *rt = (struct rt6_info *) dst; | 146 | struct rt6_info *rt = (struct rt6_info *) dst; |
147 | 147 | ||
148 | write_lock(&sk->sk_dst_lock); | ||
149 | sk_setup_caps(sk, dst); | 148 | sk_setup_caps(sk, dst); |
150 | np->daddr_cache = daddr; | 149 | np->daddr_cache = daddr; |
151 | np->dst_cookie = rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0; | 150 | np->dst_cookie = rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0; |
151 | } | ||
152 | |||
153 | static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst, | ||
154 | struct in6_addr *daddr) | ||
155 | { | ||
156 | write_lock(&sk->sk_dst_lock); | ||
157 | __ip6_dst_store(sk, dst, daddr); | ||
152 | write_unlock(&sk->sk_dst_lock); | 158 | write_unlock(&sk->sk_dst_lock); |
153 | } | 159 | } |
154 | 160 | ||
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index a8fdf7970b37..ece7e8a84ffd 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
@@ -468,6 +468,9 @@ extern void ip6_flush_pending_frames(struct sock *sk); | |||
468 | extern int ip6_dst_lookup(struct sock *sk, | 468 | extern int ip6_dst_lookup(struct sock *sk, |
469 | struct dst_entry **dst, | 469 | struct dst_entry **dst, |
470 | struct flowi *fl); | 470 | struct flowi *fl); |
471 | extern int ip6_sk_dst_lookup(struct sock *sk, | ||
472 | struct dst_entry **dst, | ||
473 | struct flowi *fl); | ||
471 | 474 | ||
472 | /* | 475 | /* |
473 | * skb processing functions | 476 | * skb processing functions |
diff --git a/include/net/netdma.h b/include/net/netdma.h index ceae5ee85c04..7f53cd1d8b1e 100644 --- a/include/net/netdma.h +++ b/include/net/netdma.h | |||
@@ -29,7 +29,7 @@ static inline struct dma_chan *get_softnet_dma(void) | |||
29 | { | 29 | { |
30 | struct dma_chan *chan; | 30 | struct dma_chan *chan; |
31 | rcu_read_lock(); | 31 | rcu_read_lock(); |
32 | chan = rcu_dereference(__get_cpu_var(softnet_data.net_dma)); | 32 | chan = rcu_dereference(__get_cpu_var(softnet_data).net_dma); |
33 | if (chan) | 33 | if (chan) |
34 | dma_chan_get(chan); | 34 | dma_chan_get(chan); |
35 | rcu_read_unlock(); | 35 | rcu_read_unlock(); |
diff --git a/include/net/netevent.h b/include/net/netevent.h new file mode 100644 index 000000000000..e5d216241423 --- /dev/null +++ b/include/net/netevent.h | |||
@@ -0,0 +1,33 @@ | |||
1 | #ifndef _NET_EVENT_H | ||
2 | #define _NET_EVENT_H | ||
3 | |||
4 | /* | ||
5 | * Generic netevent notifiers | ||
6 | * | ||
7 | * Authors: | ||
8 | * Tom Tucker <tom@opengridcomputing.com> | ||
9 | * Steve Wise <swise@opengridcomputing.com> | ||
10 | * | ||
11 | * Changes: | ||
12 | */ | ||
13 | #ifdef __KERNEL__ | ||
14 | |||
15 | #include <net/dst.h> | ||
16 | |||
17 | struct netevent_redirect { | ||
18 | struct dst_entry *old; | ||
19 | struct dst_entry *new; | ||
20 | }; | ||
21 | |||
22 | enum netevent_notif_type { | ||
23 | NETEVENT_NEIGH_UPDATE = 1, /* arg is struct neighbour ptr */ | ||
24 | NETEVENT_PMTU_UPDATE, /* arg is struct dst_entry ptr */ | ||
25 | NETEVENT_REDIRECT, /* arg is struct netevent_redirect ptr */ | ||
26 | }; | ||
27 | |||
28 | extern int register_netevent_notifier(struct notifier_block *nb); | ||
29 | extern int unregister_netevent_notifier(struct notifier_block *nb); | ||
30 | extern int call_netevent_notifiers(unsigned long val, void *v); | ||
31 | |||
32 | #endif | ||
33 | #endif | ||
diff --git a/include/net/red.h b/include/net/red.h index 5ccdbb3d4722..a4eb37946f2c 100644 --- a/include/net/red.h +++ b/include/net/red.h | |||
@@ -212,7 +212,7 @@ static inline unsigned long red_calc_qavg_from_idle_time(struct red_parms *p) | |||
212 | * Seems, it is the best solution to | 212 | * Seems, it is the best solution to |
213 | * problem of too coarse exponent tabulation. | 213 | * problem of too coarse exponent tabulation. |
214 | */ | 214 | */ |
215 | us_idle = (p->qavg * us_idle) >> p->Scell_log; | 215 | us_idle = (p->qavg * (u64)us_idle) >> p->Scell_log; |
216 | 216 | ||
217 | if (us_idle < (p->qavg >> 1)) | 217 | if (us_idle < (p->qavg >> 1)) |
218 | return p->qavg - us_idle; | 218 | return p->qavg - us_idle; |
diff --git a/include/net/scm.h b/include/net/scm.h index 02daa097cdcd..5637d5e22d5f 100644 --- a/include/net/scm.h +++ b/include/net/scm.h | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | #include <linux/limits.h> | 4 | #include <linux/limits.h> |
5 | #include <linux/net.h> | 5 | #include <linux/net.h> |
6 | #include <linux/security.h> | ||
6 | 7 | ||
7 | /* Well, we should have at least one descriptor open | 8 | /* Well, we should have at least one descriptor open |
8 | * to accept passed FDs 8) | 9 | * to accept passed FDs 8) |
@@ -20,8 +21,7 @@ struct scm_cookie | |||
20 | struct ucred creds; /* Skb credentials */ | 21 | struct ucred creds; /* Skb credentials */ |
21 | struct scm_fp_list *fp; /* Passed files */ | 22 | struct scm_fp_list *fp; /* Passed files */ |
22 | #ifdef CONFIG_SECURITY_NETWORK | 23 | #ifdef CONFIG_SECURITY_NETWORK |
23 | char *secdata; /* Security context */ | 24 | u32 secid; /* Passed security ID */ |
24 | u32 seclen; /* Security length */ | ||
25 | #endif | 25 | #endif |
26 | unsigned long seq; /* Connection seqno */ | 26 | unsigned long seq; /* Connection seqno */ |
27 | }; | 27 | }; |
@@ -32,6 +32,16 @@ extern int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie | |||
32 | extern void __scm_destroy(struct scm_cookie *scm); | 32 | extern void __scm_destroy(struct scm_cookie *scm); |
33 | extern struct scm_fp_list * scm_fp_dup(struct scm_fp_list *fpl); | 33 | extern struct scm_fp_list * scm_fp_dup(struct scm_fp_list *fpl); |
34 | 34 | ||
35 | #ifdef CONFIG_SECURITY_NETWORK | ||
36 | static __inline__ void unix_get_peersec_dgram(struct socket *sock, struct scm_cookie *scm) | ||
37 | { | ||
38 | security_socket_getpeersec_dgram(sock, NULL, &scm->secid); | ||
39 | } | ||
40 | #else | ||
41 | static __inline__ void unix_get_peersec_dgram(struct socket *sock, struct scm_cookie *scm) | ||
42 | { } | ||
43 | #endif /* CONFIG_SECURITY_NETWORK */ | ||
44 | |||
35 | static __inline__ void scm_destroy(struct scm_cookie *scm) | 45 | static __inline__ void scm_destroy(struct scm_cookie *scm) |
36 | { | 46 | { |
37 | if (scm && scm->fp) | 47 | if (scm && scm->fp) |
@@ -47,6 +57,7 @@ static __inline__ int scm_send(struct socket *sock, struct msghdr *msg, | |||
47 | scm->creds.pid = p->tgid; | 57 | scm->creds.pid = p->tgid; |
48 | scm->fp = NULL; | 58 | scm->fp = NULL; |
49 | scm->seq = 0; | 59 | scm->seq = 0; |
60 | unix_get_peersec_dgram(sock, scm); | ||
50 | if (msg->msg_controllen <= 0) | 61 | if (msg->msg_controllen <= 0) |
51 | return 0; | 62 | return 0; |
52 | return __scm_send(sock, msg, scm); | 63 | return __scm_send(sock, msg, scm); |
@@ -55,8 +66,18 @@ static __inline__ int scm_send(struct socket *sock, struct msghdr *msg, | |||
55 | #ifdef CONFIG_SECURITY_NETWORK | 66 | #ifdef CONFIG_SECURITY_NETWORK |
56 | static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm) | 67 | static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm) |
57 | { | 68 | { |
58 | if (test_bit(SOCK_PASSSEC, &sock->flags) && scm->secdata != NULL) | 69 | char *secdata; |
59 | put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, scm->seclen, scm->secdata); | 70 | u32 seclen; |
71 | int err; | ||
72 | |||
73 | if (test_bit(SOCK_PASSSEC, &sock->flags)) { | ||
74 | err = security_secid_to_secctx(scm->secid, &secdata, &seclen); | ||
75 | |||
76 | if (!err) { | ||
77 | put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, seclen, secdata); | ||
78 | security_release_secctx(secdata, seclen); | ||
79 | } | ||
80 | } | ||
60 | } | 81 | } |
61 | #else | 82 | #else |
62 | static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm) | 83 | static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm) |
diff --git a/include/net/tcp.h b/include/net/tcp.h index 0720bddff1e9..7a093d0aa0fe 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -914,6 +914,9 @@ static inline void tcp_set_state(struct sock *sk, int state) | |||
914 | 914 | ||
915 | static inline void tcp_done(struct sock *sk) | 915 | static inline void tcp_done(struct sock *sk) |
916 | { | 916 | { |
917 | if(sk->sk_state == TCP_SYN_SENT || sk->sk_state == TCP_SYN_RECV) | ||
918 | TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); | ||
919 | |||
917 | tcp_set_state(sk, TCP_CLOSE); | 920 | tcp_set_state(sk, TCP_CLOSE); |
918 | tcp_clear_xmit_timers(sk); | 921 | tcp_clear_xmit_timers(sk); |
919 | 922 | ||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * linux/ipc/msg.c | 2 | * linux/ipc/msg.c |
3 | * Copyright (C) 1992 Krishna Balasubramanian | 3 | * Copyright (C) 1992 Krishna Balasubramanian |
4 | * | 4 | * |
5 | * Removed all the remaining kerneld mess | 5 | * Removed all the remaining kerneld mess |
6 | * Catch the -EFAULT stuff properly | 6 | * Catch the -EFAULT stuff properly |
@@ -41,22 +41,24 @@ int msg_ctlmax = MSGMAX; | |||
41 | int msg_ctlmnb = MSGMNB; | 41 | int msg_ctlmnb = MSGMNB; |
42 | int msg_ctlmni = MSGMNI; | 42 | int msg_ctlmni = MSGMNI; |
43 | 43 | ||
44 | /* one msg_receiver structure for each sleeping receiver */ | 44 | /* |
45 | * one msg_receiver structure for each sleeping receiver: | ||
46 | */ | ||
45 | struct msg_receiver { | 47 | struct msg_receiver { |
46 | struct list_head r_list; | 48 | struct list_head r_list; |
47 | struct task_struct* r_tsk; | 49 | struct task_struct *r_tsk; |
48 | 50 | ||
49 | int r_mode; | 51 | int r_mode; |
50 | long r_msgtype; | 52 | long r_msgtype; |
51 | long r_maxsize; | 53 | long r_maxsize; |
52 | 54 | ||
53 | struct msg_msg* volatile r_msg; | 55 | volatile struct msg_msg *r_msg; |
54 | }; | 56 | }; |
55 | 57 | ||
56 | /* one msg_sender for each sleeping sender */ | 58 | /* one msg_sender for each sleeping sender */ |
57 | struct msg_sender { | 59 | struct msg_sender { |
58 | struct list_head list; | 60 | struct list_head list; |
59 | struct task_struct* tsk; | 61 | struct task_struct *tsk; |
60 | }; | 62 | }; |
61 | 63 | ||
62 | #define SEARCH_ANY 1 | 64 | #define SEARCH_ANY 1 |
@@ -64,45 +66,42 @@ struct msg_sender { | |||
64 | #define SEARCH_NOTEQUAL 3 | 66 | #define SEARCH_NOTEQUAL 3 |
65 | #define SEARCH_LESSEQUAL 4 | 67 | #define SEARCH_LESSEQUAL 4 |
66 | 68 | ||
67 | static atomic_t msg_bytes = ATOMIC_INIT(0); | 69 | static atomic_t msg_bytes = ATOMIC_INIT(0); |
68 | static atomic_t msg_hdrs = ATOMIC_INIT(0); | 70 | static atomic_t msg_hdrs = ATOMIC_INIT(0); |
69 | 71 | ||
70 | static struct ipc_ids msg_ids; | 72 | static struct ipc_ids msg_ids; |
71 | 73 | ||
72 | #define msg_lock(id) ((struct msg_queue*)ipc_lock(&msg_ids,id)) | 74 | #define msg_lock(id) ((struct msg_queue *)ipc_lock(&msg_ids, id)) |
73 | #define msg_unlock(msq) ipc_unlock(&(msq)->q_perm) | 75 | #define msg_unlock(msq) ipc_unlock(&(msq)->q_perm) |
74 | #define msg_rmid(id) ((struct msg_queue*)ipc_rmid(&msg_ids,id)) | 76 | #define msg_rmid(id) ((struct msg_queue *)ipc_rmid(&msg_ids, id)) |
75 | #define msg_checkid(msq, msgid) \ | 77 | #define msg_checkid(msq, msgid) ipc_checkid(&msg_ids, &msq->q_perm, msgid) |
76 | ipc_checkid(&msg_ids,&msq->q_perm,msgid) | 78 | #define msg_buildid(id, seq) ipc_buildid(&msg_ids, id, seq) |
77 | #define msg_buildid(id, seq) \ | ||
78 | ipc_buildid(&msg_ids, id, seq) | ||
79 | 79 | ||
80 | static void freeque (struct msg_queue *msq, int id); | 80 | static void freeque(struct msg_queue *msq, int id); |
81 | static int newque (key_t key, int msgflg); | 81 | static int newque(key_t key, int msgflg); |
82 | #ifdef CONFIG_PROC_FS | 82 | #ifdef CONFIG_PROC_FS |
83 | static int sysvipc_msg_proc_show(struct seq_file *s, void *it); | 83 | static int sysvipc_msg_proc_show(struct seq_file *s, void *it); |
84 | #endif | 84 | #endif |
85 | 85 | ||
86 | void __init msg_init (void) | 86 | void __init msg_init(void) |
87 | { | 87 | { |
88 | ipc_init_ids(&msg_ids,msg_ctlmni); | 88 | ipc_init_ids(&msg_ids, msg_ctlmni); |
89 | ipc_init_proc_interface("sysvipc/msg", | 89 | ipc_init_proc_interface("sysvipc/msg", |
90 | " key msqid perms cbytes qnum lspid lrpid uid gid cuid cgid stime rtime ctime\n", | 90 | " key msqid perms cbytes qnum lspid lrpid uid gid cuid cgid stime rtime ctime\n", |
91 | &msg_ids, | 91 | &msg_ids, |
92 | sysvipc_msg_proc_show); | 92 | sysvipc_msg_proc_show); |
93 | } | 93 | } |
94 | 94 | ||
95 | static int newque (key_t key, int msgflg) | 95 | static int newque(key_t key, int msgflg) |
96 | { | 96 | { |
97 | int id; | ||
98 | int retval; | ||
99 | struct msg_queue *msq; | 97 | struct msg_queue *msq; |
98 | int id, retval; | ||
100 | 99 | ||
101 | msq = ipc_rcu_alloc(sizeof(*msq)); | 100 | msq = ipc_rcu_alloc(sizeof(*msq)); |
102 | if (!msq) | 101 | if (!msq) |
103 | return -ENOMEM; | 102 | return -ENOMEM; |
104 | 103 | ||
105 | msq->q_perm.mode = (msgflg & S_IRWXUGO); | 104 | msq->q_perm.mode = msgflg & S_IRWXUGO; |
106 | msq->q_perm.key = key; | 105 | msq->q_perm.key = key; |
107 | 106 | ||
108 | msq->q_perm.security = NULL; | 107 | msq->q_perm.security = NULL; |
@@ -113,13 +112,13 @@ static int newque (key_t key, int msgflg) | |||
113 | } | 112 | } |
114 | 113 | ||
115 | id = ipc_addid(&msg_ids, &msq->q_perm, msg_ctlmni); | 114 | id = ipc_addid(&msg_ids, &msq->q_perm, msg_ctlmni); |
116 | if(id == -1) { | 115 | if (id == -1) { |
117 | security_msg_queue_free(msq); | 116 | security_msg_queue_free(msq); |
118 | ipc_rcu_putref(msq); | 117 | ipc_rcu_putref(msq); |
119 | return -ENOSPC; | 118 | return -ENOSPC; |
120 | } | 119 | } |
121 | 120 | ||
122 | msq->q_id = msg_buildid(id,msq->q_perm.seq); | 121 | msq->q_id = msg_buildid(id, msq->q_perm.seq); |
123 | msq->q_stime = msq->q_rtime = 0; | 122 | msq->q_stime = msq->q_rtime = 0; |
124 | msq->q_ctime = get_seconds(); | 123 | msq->q_ctime = get_seconds(); |
125 | msq->q_cbytes = msq->q_qnum = 0; | 124 | msq->q_cbytes = msq->q_qnum = 0; |
@@ -133,44 +132,44 @@ static int newque (key_t key, int msgflg) | |||
133 | return msq->q_id; | 132 | return msq->q_id; |
134 | } | 133 | } |
135 | 134 | ||
136 | static inline void ss_add(struct msg_queue* msq, struct msg_sender* mss) | 135 | static inline void ss_add(struct msg_queue *msq, struct msg_sender *mss) |
137 | { | 136 | { |
138 | mss->tsk=current; | 137 | mss->tsk = current; |
139 | current->state=TASK_INTERRUPTIBLE; | 138 | current->state = TASK_INTERRUPTIBLE; |
140 | list_add_tail(&mss->list,&msq->q_senders); | 139 | list_add_tail(&mss->list, &msq->q_senders); |
141 | } | 140 | } |
142 | 141 | ||
143 | static inline void ss_del(struct msg_sender* mss) | 142 | static inline void ss_del(struct msg_sender *mss) |
144 | { | 143 | { |
145 | if(mss->list.next != NULL) | 144 | if (mss->list.next != NULL) |
146 | list_del(&mss->list); | 145 | list_del(&mss->list); |
147 | } | 146 | } |
148 | 147 | ||
149 | static void ss_wakeup(struct list_head* h, int kill) | 148 | static void ss_wakeup(struct list_head *h, int kill) |
150 | { | 149 | { |
151 | struct list_head *tmp; | 150 | struct list_head *tmp; |
152 | 151 | ||
153 | tmp = h->next; | 152 | tmp = h->next; |
154 | while (tmp != h) { | 153 | while (tmp != h) { |
155 | struct msg_sender* mss; | 154 | struct msg_sender *mss; |
156 | 155 | ||
157 | mss = list_entry(tmp,struct msg_sender,list); | 156 | mss = list_entry(tmp, struct msg_sender, list); |
158 | tmp = tmp->next; | 157 | tmp = tmp->next; |
159 | if(kill) | 158 | if (kill) |
160 | mss->list.next=NULL; | 159 | mss->list.next = NULL; |
161 | wake_up_process(mss->tsk); | 160 | wake_up_process(mss->tsk); |
162 | } | 161 | } |
163 | } | 162 | } |
164 | 163 | ||
165 | static void expunge_all(struct msg_queue* msq, int res) | 164 | static void expunge_all(struct msg_queue *msq, int res) |
166 | { | 165 | { |
167 | struct list_head *tmp; | 166 | struct list_head *tmp; |
168 | 167 | ||
169 | tmp = msq->q_receivers.next; | 168 | tmp = msq->q_receivers.next; |
170 | while (tmp != &msq->q_receivers) { | 169 | while (tmp != &msq->q_receivers) { |
171 | struct msg_receiver* msr; | 170 | struct msg_receiver *msr; |
172 | 171 | ||
173 | msr = list_entry(tmp,struct msg_receiver,r_list); | 172 | msr = list_entry(tmp, struct msg_receiver, r_list); |
174 | tmp = tmp->next; | 173 | tmp = tmp->next; |
175 | msr->r_msg = NULL; | 174 | msr->r_msg = NULL; |
176 | wake_up_process(msr->r_tsk); | 175 | wake_up_process(msr->r_tsk); |
@@ -178,26 +177,28 @@ static void expunge_all(struct msg_queue* msq, int res) | |||
178 | msr->r_msg = ERR_PTR(res); | 177 | msr->r_msg = ERR_PTR(res); |
179 | } | 178 | } |
180 | } | 179 | } |
181 | /* | 180 | |
182 | * freeque() wakes up waiters on the sender and receiver waiting queue, | 181 | /* |
183 | * removes the message queue from message queue ID | 182 | * freeque() wakes up waiters on the sender and receiver waiting queue, |
183 | * removes the message queue from message queue ID | ||
184 | * array, and cleans up all the messages associated with this queue. | 184 | * array, and cleans up all the messages associated with this queue. |
185 | * | 185 | * |
186 | * msg_ids.mutex and the spinlock for this message queue is hold | 186 | * msg_ids.mutex and the spinlock for this message queue is hold |
187 | * before freeque() is called. msg_ids.mutex remains locked on exit. | 187 | * before freeque() is called. msg_ids.mutex remains locked on exit. |
188 | */ | 188 | */ |
189 | static void freeque (struct msg_queue *msq, int id) | 189 | static void freeque(struct msg_queue *msq, int id) |
190 | { | 190 | { |
191 | struct list_head *tmp; | 191 | struct list_head *tmp; |
192 | 192 | ||
193 | expunge_all(msq,-EIDRM); | 193 | expunge_all(msq, -EIDRM); |
194 | ss_wakeup(&msq->q_senders,1); | 194 | ss_wakeup(&msq->q_senders, 1); |
195 | msq = msg_rmid(id); | 195 | msq = msg_rmid(id); |
196 | msg_unlock(msq); | 196 | msg_unlock(msq); |
197 | 197 | ||
198 | tmp = msq->q_messages.next; | 198 | tmp = msq->q_messages.next; |
199 | while(tmp != &msq->q_messages) { | 199 | while (tmp != &msq->q_messages) { |
200 | struct msg_msg* msg = list_entry(tmp,struct msg_msg,m_list); | 200 | struct msg_msg *msg = list_entry(tmp, struct msg_msg, m_list); |
201 | |||
201 | tmp = tmp->next; | 202 | tmp = tmp->next; |
202 | atomic_dec(&msg_hdrs); | 203 | atomic_dec(&msg_hdrs); |
203 | free_msg(msg); | 204 | free_msg(msg); |
@@ -207,10 +208,10 @@ static void freeque (struct msg_queue *msq, int id) | |||
207 | ipc_rcu_putref(msq); | 208 | ipc_rcu_putref(msq); |
208 | } | 209 | } |
209 | 210 | ||
210 | asmlinkage long sys_msgget (key_t key, int msgflg) | 211 | asmlinkage long sys_msgget(key_t key, int msgflg) |
211 | { | 212 | { |
212 | int id, ret = -EPERM; | ||
213 | struct msg_queue *msq; | 213 | struct msg_queue *msq; |
214 | int id, ret = -EPERM; | ||
214 | 215 | ||
215 | mutex_lock(&msg_ids.mutex); | 216 | mutex_lock(&msg_ids.mutex); |
216 | if (key == IPC_PRIVATE) | 217 | if (key == IPC_PRIVATE) |
@@ -224,31 +225,34 @@ asmlinkage long sys_msgget (key_t key, int msgflg) | |||
224 | ret = -EEXIST; | 225 | ret = -EEXIST; |
225 | } else { | 226 | } else { |
226 | msq = msg_lock(id); | 227 | msq = msg_lock(id); |
227 | BUG_ON(msq==NULL); | 228 | BUG_ON(msq == NULL); |
228 | if (ipcperms(&msq->q_perm, msgflg)) | 229 | if (ipcperms(&msq->q_perm, msgflg)) |
229 | ret = -EACCES; | 230 | ret = -EACCES; |
230 | else { | 231 | else { |
231 | int qid = msg_buildid(id, msq->q_perm.seq); | 232 | int qid = msg_buildid(id, msq->q_perm.seq); |
232 | ret = security_msg_queue_associate(msq, msgflg); | 233 | |
234 | ret = security_msg_queue_associate(msq, msgflg); | ||
233 | if (!ret) | 235 | if (!ret) |
234 | ret = qid; | 236 | ret = qid; |
235 | } | 237 | } |
236 | msg_unlock(msq); | 238 | msg_unlock(msq); |
237 | } | 239 | } |
238 | mutex_unlock(&msg_ids.mutex); | 240 | mutex_unlock(&msg_ids.mutex); |
241 | |||
239 | return ret; | 242 | return ret; |
240 | } | 243 | } |
241 | 244 | ||
242 | static inline unsigned long copy_msqid_to_user(void __user *buf, struct msqid64_ds *in, int version) | 245 | static inline unsigned long |
246 | copy_msqid_to_user(void __user *buf, struct msqid64_ds *in, int version) | ||
243 | { | 247 | { |
244 | switch(version) { | 248 | switch(version) { |
245 | case IPC_64: | 249 | case IPC_64: |
246 | return copy_to_user (buf, in, sizeof(*in)); | 250 | return copy_to_user(buf, in, sizeof(*in)); |
247 | case IPC_OLD: | 251 | case IPC_OLD: |
248 | { | 252 | { |
249 | struct msqid_ds out; | 253 | struct msqid_ds out; |
250 | 254 | ||
251 | memset(&out,0,sizeof(out)); | 255 | memset(&out, 0, sizeof(out)); |
252 | 256 | ||
253 | ipc64_perm_to_ipc_perm(&in->msg_perm, &out.msg_perm); | 257 | ipc64_perm_to_ipc_perm(&in->msg_perm, &out.msg_perm); |
254 | 258 | ||
@@ -256,18 +260,18 @@ static inline unsigned long copy_msqid_to_user(void __user *buf, struct msqid64_ | |||
256 | out.msg_rtime = in->msg_rtime; | 260 | out.msg_rtime = in->msg_rtime; |
257 | out.msg_ctime = in->msg_ctime; | 261 | out.msg_ctime = in->msg_ctime; |
258 | 262 | ||
259 | if(in->msg_cbytes > USHRT_MAX) | 263 | if (in->msg_cbytes > USHRT_MAX) |
260 | out.msg_cbytes = USHRT_MAX; | 264 | out.msg_cbytes = USHRT_MAX; |
261 | else | 265 | else |
262 | out.msg_cbytes = in->msg_cbytes; | 266 | out.msg_cbytes = in->msg_cbytes; |
263 | out.msg_lcbytes = in->msg_cbytes; | 267 | out.msg_lcbytes = in->msg_cbytes; |
264 | 268 | ||
265 | if(in->msg_qnum > USHRT_MAX) | 269 | if (in->msg_qnum > USHRT_MAX) |
266 | out.msg_qnum = USHRT_MAX; | 270 | out.msg_qnum = USHRT_MAX; |
267 | else | 271 | else |
268 | out.msg_qnum = in->msg_qnum; | 272 | out.msg_qnum = in->msg_qnum; |
269 | 273 | ||
270 | if(in->msg_qbytes > USHRT_MAX) | 274 | if (in->msg_qbytes > USHRT_MAX) |
271 | out.msg_qbytes = USHRT_MAX; | 275 | out.msg_qbytes = USHRT_MAX; |
272 | else | 276 | else |
273 | out.msg_qbytes = in->msg_qbytes; | 277 | out.msg_qbytes = in->msg_qbytes; |
@@ -276,8 +280,8 @@ static inline unsigned long copy_msqid_to_user(void __user *buf, struct msqid64_ | |||
276 | out.msg_lspid = in->msg_lspid; | 280 | out.msg_lspid = in->msg_lspid; |
277 | out.msg_lrpid = in->msg_lrpid; | 281 | out.msg_lrpid = in->msg_lrpid; |
278 | 282 | ||
279 | return copy_to_user (buf, &out, sizeof(out)); | 283 | return copy_to_user(buf, &out, sizeof(out)); |
280 | } | 284 | } |
281 | default: | 285 | default: |
282 | return -EINVAL; | 286 | return -EINVAL; |
283 | } | 287 | } |
@@ -290,14 +294,15 @@ struct msq_setbuf { | |||
290 | mode_t mode; | 294 | mode_t mode; |
291 | }; | 295 | }; |
292 | 296 | ||
293 | static inline unsigned long copy_msqid_from_user(struct msq_setbuf *out, void __user *buf, int version) | 297 | static inline unsigned long |
298 | copy_msqid_from_user(struct msq_setbuf *out, void __user *buf, int version) | ||
294 | { | 299 | { |
295 | switch(version) { | 300 | switch(version) { |
296 | case IPC_64: | 301 | case IPC_64: |
297 | { | 302 | { |
298 | struct msqid64_ds tbuf; | 303 | struct msqid64_ds tbuf; |
299 | 304 | ||
300 | if (copy_from_user (&tbuf, buf, sizeof (tbuf))) | 305 | if (copy_from_user(&tbuf, buf, sizeof(tbuf))) |
301 | return -EFAULT; | 306 | return -EFAULT; |
302 | 307 | ||
303 | out->qbytes = tbuf.msg_qbytes; | 308 | out->qbytes = tbuf.msg_qbytes; |
@@ -306,60 +311,61 @@ static inline unsigned long copy_msqid_from_user(struct msq_setbuf *out, void __ | |||
306 | out->mode = tbuf.msg_perm.mode; | 311 | out->mode = tbuf.msg_perm.mode; |
307 | 312 | ||
308 | return 0; | 313 | return 0; |
309 | } | 314 | } |
310 | case IPC_OLD: | 315 | case IPC_OLD: |
311 | { | 316 | { |
312 | struct msqid_ds tbuf_old; | 317 | struct msqid_ds tbuf_old; |
313 | 318 | ||
314 | if (copy_from_user (&tbuf_old, buf, sizeof (tbuf_old))) | 319 | if (copy_from_user(&tbuf_old, buf, sizeof(tbuf_old))) |
315 | return -EFAULT; | 320 | return -EFAULT; |
316 | 321 | ||
317 | out->uid = tbuf_old.msg_perm.uid; | 322 | out->uid = tbuf_old.msg_perm.uid; |
318 | out->gid = tbuf_old.msg_perm.gid; | 323 | out->gid = tbuf_old.msg_perm.gid; |
319 | out->mode = tbuf_old.msg_perm.mode; | 324 | out->mode = tbuf_old.msg_perm.mode; |
320 | 325 | ||
321 | if(tbuf_old.msg_qbytes == 0) | 326 | if (tbuf_old.msg_qbytes == 0) |
322 | out->qbytes = tbuf_old.msg_lqbytes; | 327 | out->qbytes = tbuf_old.msg_lqbytes; |
323 | else | 328 | else |
324 | out->qbytes = tbuf_old.msg_qbytes; | 329 | out->qbytes = tbuf_old.msg_qbytes; |
325 | 330 | ||
326 | return 0; | 331 | return 0; |
327 | } | 332 | } |
328 | default: | 333 | default: |
329 | return -EINVAL; | 334 | return -EINVAL; |
330 | } | 335 | } |
331 | } | 336 | } |
332 | 337 | ||
333 | asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) | 338 | asmlinkage long sys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf) |
334 | { | 339 | { |
335 | int err, version; | ||
336 | struct msg_queue *msq; | ||
337 | struct msq_setbuf setbuf; | ||
338 | struct kern_ipc_perm *ipcp; | 340 | struct kern_ipc_perm *ipcp; |
339 | 341 | struct msq_setbuf setbuf; | |
342 | struct msg_queue *msq; | ||
343 | int err, version; | ||
344 | |||
340 | if (msqid < 0 || cmd < 0) | 345 | if (msqid < 0 || cmd < 0) |
341 | return -EINVAL; | 346 | return -EINVAL; |
342 | 347 | ||
343 | version = ipc_parse_version(&cmd); | 348 | version = ipc_parse_version(&cmd); |
344 | 349 | ||
345 | switch (cmd) { | 350 | switch (cmd) { |
346 | case IPC_INFO: | 351 | case IPC_INFO: |
347 | case MSG_INFO: | 352 | case MSG_INFO: |
348 | { | 353 | { |
349 | struct msginfo msginfo; | 354 | struct msginfo msginfo; |
350 | int max_id; | 355 | int max_id; |
356 | |||
351 | if (!buf) | 357 | if (!buf) |
352 | return -EFAULT; | 358 | return -EFAULT; |
353 | /* We must not return kernel stack data. | 359 | /* |
360 | * We must not return kernel stack data. | ||
354 | * due to padding, it's not enough | 361 | * due to padding, it's not enough |
355 | * to set all member fields. | 362 | * to set all member fields. |
356 | */ | 363 | */ |
357 | |||
358 | err = security_msg_queue_msgctl(NULL, cmd); | 364 | err = security_msg_queue_msgctl(NULL, cmd); |
359 | if (err) | 365 | if (err) |
360 | return err; | 366 | return err; |
361 | 367 | ||
362 | memset(&msginfo,0,sizeof(msginfo)); | 368 | memset(&msginfo, 0, sizeof(msginfo)); |
363 | msginfo.msgmni = msg_ctlmni; | 369 | msginfo.msgmni = msg_ctlmni; |
364 | msginfo.msgmax = msg_ctlmax; | 370 | msginfo.msgmax = msg_ctlmax; |
365 | msginfo.msgmnb = msg_ctlmnb; | 371 | msginfo.msgmnb = msg_ctlmnb; |
@@ -377,36 +383,37 @@ asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) | |||
377 | } | 383 | } |
378 | max_id = msg_ids.max_id; | 384 | max_id = msg_ids.max_id; |
379 | mutex_unlock(&msg_ids.mutex); | 385 | mutex_unlock(&msg_ids.mutex); |
380 | if (copy_to_user (buf, &msginfo, sizeof(struct msginfo))) | 386 | if (copy_to_user(buf, &msginfo, sizeof(struct msginfo))) |
381 | return -EFAULT; | 387 | return -EFAULT; |
382 | return (max_id < 0) ? 0: max_id; | 388 | return (max_id < 0) ? 0 : max_id; |
383 | } | 389 | } |
384 | case MSG_STAT: | 390 | case MSG_STAT: |
385 | case IPC_STAT: | 391 | case IPC_STAT: |
386 | { | 392 | { |
387 | struct msqid64_ds tbuf; | 393 | struct msqid64_ds tbuf; |
388 | int success_return; | 394 | int success_return; |
395 | |||
389 | if (!buf) | 396 | if (!buf) |
390 | return -EFAULT; | 397 | return -EFAULT; |
391 | if(cmd == MSG_STAT && msqid >= msg_ids.entries->size) | 398 | if (cmd == MSG_STAT && msqid >= msg_ids.entries->size) |
392 | return -EINVAL; | 399 | return -EINVAL; |
393 | 400 | ||
394 | memset(&tbuf,0,sizeof(tbuf)); | 401 | memset(&tbuf, 0, sizeof(tbuf)); |
395 | 402 | ||
396 | msq = msg_lock(msqid); | 403 | msq = msg_lock(msqid); |
397 | if (msq == NULL) | 404 | if (msq == NULL) |
398 | return -EINVAL; | 405 | return -EINVAL; |
399 | 406 | ||
400 | if(cmd == MSG_STAT) { | 407 | if (cmd == MSG_STAT) { |
401 | success_return = msg_buildid(msqid, msq->q_perm.seq); | 408 | success_return = msg_buildid(msqid, msq->q_perm.seq); |
402 | } else { | 409 | } else { |
403 | err = -EIDRM; | 410 | err = -EIDRM; |
404 | if (msg_checkid(msq,msqid)) | 411 | if (msg_checkid(msq, msqid)) |
405 | goto out_unlock; | 412 | goto out_unlock; |
406 | success_return = 0; | 413 | success_return = 0; |
407 | } | 414 | } |
408 | err = -EACCES; | 415 | err = -EACCES; |
409 | if (ipcperms (&msq->q_perm, S_IRUGO)) | 416 | if (ipcperms(&msq->q_perm, S_IRUGO)) |
410 | goto out_unlock; | 417 | goto out_unlock; |
411 | 418 | ||
412 | err = security_msg_queue_msgctl(msq, cmd); | 419 | err = security_msg_queue_msgctl(msq, cmd); |
@@ -430,7 +437,7 @@ asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) | |||
430 | case IPC_SET: | 437 | case IPC_SET: |
431 | if (!buf) | 438 | if (!buf) |
432 | return -EFAULT; | 439 | return -EFAULT; |
433 | if (copy_msqid_from_user (&setbuf, buf, version)) | 440 | if (copy_msqid_from_user(&setbuf, buf, version)) |
434 | return -EFAULT; | 441 | return -EFAULT; |
435 | break; | 442 | break; |
436 | case IPC_RMID: | 443 | case IPC_RMID: |
@@ -441,12 +448,12 @@ asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) | |||
441 | 448 | ||
442 | mutex_lock(&msg_ids.mutex); | 449 | mutex_lock(&msg_ids.mutex); |
443 | msq = msg_lock(msqid); | 450 | msq = msg_lock(msqid); |
444 | err=-EINVAL; | 451 | err = -EINVAL; |
445 | if (msq == NULL) | 452 | if (msq == NULL) |
446 | goto out_up; | 453 | goto out_up; |
447 | 454 | ||
448 | err = -EIDRM; | 455 | err = -EIDRM; |
449 | if (msg_checkid(msq,msqid)) | 456 | if (msg_checkid(msq, msqid)) |
450 | goto out_unlock_up; | 457 | goto out_unlock_up; |
451 | ipcp = &msq->q_perm; | 458 | ipcp = &msq->q_perm; |
452 | 459 | ||
@@ -454,15 +461,16 @@ asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) | |||
454 | if (err) | 461 | if (err) |
455 | goto out_unlock_up; | 462 | goto out_unlock_up; |
456 | if (cmd==IPC_SET) { | 463 | if (cmd==IPC_SET) { |
457 | err = audit_ipc_set_perm(setbuf.qbytes, setbuf.uid, setbuf.gid, setbuf.mode); | 464 | err = audit_ipc_set_perm(setbuf.qbytes, setbuf.uid, setbuf.gid, |
465 | setbuf.mode); | ||
458 | if (err) | 466 | if (err) |
459 | goto out_unlock_up; | 467 | goto out_unlock_up; |
460 | } | 468 | } |
461 | 469 | ||
462 | err = -EPERM; | 470 | err = -EPERM; |
463 | if (current->euid != ipcp->cuid && | 471 | if (current->euid != ipcp->cuid && |
464 | current->euid != ipcp->uid && !capable(CAP_SYS_ADMIN)) | 472 | current->euid != ipcp->uid && !capable(CAP_SYS_ADMIN)) |
465 | /* We _could_ check for CAP_CHOWN above, but we don't */ | 473 | /* We _could_ check for CAP_CHOWN above, but we don't */ |
466 | goto out_unlock_up; | 474 | goto out_unlock_up; |
467 | 475 | ||
468 | err = security_msg_queue_msgctl(msq, cmd); | 476 | err = security_msg_queue_msgctl(msq, cmd); |
@@ -480,22 +488,22 @@ asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) | |||
480 | 488 | ||
481 | ipcp->uid = setbuf.uid; | 489 | ipcp->uid = setbuf.uid; |
482 | ipcp->gid = setbuf.gid; | 490 | ipcp->gid = setbuf.gid; |
483 | ipcp->mode = (ipcp->mode & ~S_IRWXUGO) | | 491 | ipcp->mode = (ipcp->mode & ~S_IRWXUGO) | |
484 | (S_IRWXUGO & setbuf.mode); | 492 | (S_IRWXUGO & setbuf.mode); |
485 | msq->q_ctime = get_seconds(); | 493 | msq->q_ctime = get_seconds(); |
486 | /* sleeping receivers might be excluded by | 494 | /* sleeping receivers might be excluded by |
487 | * stricter permissions. | 495 | * stricter permissions. |
488 | */ | 496 | */ |
489 | expunge_all(msq,-EAGAIN); | 497 | expunge_all(msq, -EAGAIN); |
490 | /* sleeping senders might be able to send | 498 | /* sleeping senders might be able to send |
491 | * due to a larger queue size. | 499 | * due to a larger queue size. |
492 | */ | 500 | */ |
493 | ss_wakeup(&msq->q_senders,0); | 501 | ss_wakeup(&msq->q_senders, 0); |
494 | msg_unlock(msq); | 502 | msg_unlock(msq); |
495 | break; | 503 | break; |
496 | } | 504 | } |
497 | case IPC_RMID: | 505 | case IPC_RMID: |
498 | freeque (msq, msqid); | 506 | freeque(msq, msqid); |
499 | break; | 507 | break; |
500 | } | 508 | } |
501 | err = 0; | 509 | err = 0; |
@@ -510,41 +518,44 @@ out_unlock: | |||
510 | return err; | 518 | return err; |
511 | } | 519 | } |
512 | 520 | ||
513 | static int testmsg(struct msg_msg* msg,long type,int mode) | 521 | static int testmsg(struct msg_msg *msg, long type, int mode) |
514 | { | 522 | { |
515 | switch(mode) | 523 | switch(mode) |
516 | { | 524 | { |
517 | case SEARCH_ANY: | 525 | case SEARCH_ANY: |
518 | return 1; | 526 | return 1; |
519 | case SEARCH_LESSEQUAL: | 527 | case SEARCH_LESSEQUAL: |
520 | if(msg->m_type <=type) | 528 | if (msg->m_type <=type) |
521 | return 1; | 529 | return 1; |
522 | break; | 530 | break; |
523 | case SEARCH_EQUAL: | 531 | case SEARCH_EQUAL: |
524 | if(msg->m_type == type) | 532 | if (msg->m_type == type) |
525 | return 1; | 533 | return 1; |
526 | break; | 534 | break; |
527 | case SEARCH_NOTEQUAL: | 535 | case SEARCH_NOTEQUAL: |
528 | if(msg->m_type != type) | 536 | if (msg->m_type != type) |
529 | return 1; | 537 | return 1; |
530 | break; | 538 | break; |
531 | } | 539 | } |
532 | return 0; | 540 | return 0; |
533 | } | 541 | } |
534 | 542 | ||
535 | static inline int pipelined_send(struct msg_queue* msq, struct msg_msg* msg) | 543 | static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg) |
536 | { | 544 | { |
537 | struct list_head* tmp; | 545 | struct list_head *tmp; |
538 | 546 | ||
539 | tmp = msq->q_receivers.next; | 547 | tmp = msq->q_receivers.next; |
540 | while (tmp != &msq->q_receivers) { | 548 | while (tmp != &msq->q_receivers) { |
541 | struct msg_receiver* msr; | 549 | struct msg_receiver *msr; |
542 | msr = list_entry(tmp,struct msg_receiver,r_list); | 550 | |
551 | msr = list_entry(tmp, struct msg_receiver, r_list); | ||
543 | tmp = tmp->next; | 552 | tmp = tmp->next; |
544 | if(testmsg(msg,msr->r_msgtype,msr->r_mode) && | 553 | if (testmsg(msg, msr->r_msgtype, msr->r_mode) && |
545 | !security_msg_queue_msgrcv(msq, msg, msr->r_tsk, msr->r_msgtype, msr->r_mode)) { | 554 | !security_msg_queue_msgrcv(msq, msg, msr->r_tsk, |
555 | msr->r_msgtype, msr->r_mode)) { | ||
556 | |||
546 | list_del(&msr->r_list); | 557 | list_del(&msr->r_list); |
547 | if(msr->r_maxsize < msg->m_ts) { | 558 | if (msr->r_maxsize < msg->m_ts) { |
548 | msr->r_msg = NULL; | 559 | msr->r_msg = NULL; |
549 | wake_up_process(msr->r_tsk); | 560 | wake_up_process(msr->r_tsk); |
550 | smp_mb(); | 561 | smp_mb(); |
@@ -556,6 +567,7 @@ static inline int pipelined_send(struct msg_queue* msq, struct msg_msg* msg) | |||
556 | wake_up_process(msr->r_tsk); | 567 | wake_up_process(msr->r_tsk); |
557 | smp_mb(); | 568 | smp_mb(); |
558 | msr->r_msg = msg; | 569 | msr->r_msg = msg; |
570 | |||
559 | return 1; | 571 | return 1; |
560 | } | 572 | } |
561 | } | 573 | } |
@@ -563,40 +575,41 @@ static inline int pipelined_send(struct msg_queue* msq, struct msg_msg* msg) | |||
563 | return 0; | 575 | return 0; |
564 | } | 576 | } |
565 | 577 | ||
566 | asmlinkage long sys_msgsnd (int msqid, struct msgbuf __user *msgp, size_t msgsz, int msgflg) | 578 | asmlinkage long |
579 | sys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz, int msgflg) | ||
567 | { | 580 | { |
568 | struct msg_queue *msq; | 581 | struct msg_queue *msq; |
569 | struct msg_msg *msg; | 582 | struct msg_msg *msg; |
570 | long mtype; | 583 | long mtype; |
571 | int err; | 584 | int err; |
572 | 585 | ||
573 | if (msgsz > msg_ctlmax || (long) msgsz < 0 || msqid < 0) | 586 | if (msgsz > msg_ctlmax || (long) msgsz < 0 || msqid < 0) |
574 | return -EINVAL; | 587 | return -EINVAL; |
575 | if (get_user(mtype, &msgp->mtype)) | 588 | if (get_user(mtype, &msgp->mtype)) |
576 | return -EFAULT; | 589 | return -EFAULT; |
577 | if (mtype < 1) | 590 | if (mtype < 1) |
578 | return -EINVAL; | 591 | return -EINVAL; |
579 | 592 | ||
580 | msg = load_msg(msgp->mtext, msgsz); | 593 | msg = load_msg(msgp->mtext, msgsz); |
581 | if(IS_ERR(msg)) | 594 | if (IS_ERR(msg)) |
582 | return PTR_ERR(msg); | 595 | return PTR_ERR(msg); |
583 | 596 | ||
584 | msg->m_type = mtype; | 597 | msg->m_type = mtype; |
585 | msg->m_ts = msgsz; | 598 | msg->m_ts = msgsz; |
586 | 599 | ||
587 | msq = msg_lock(msqid); | 600 | msq = msg_lock(msqid); |
588 | err=-EINVAL; | 601 | err = -EINVAL; |
589 | if(msq==NULL) | 602 | if (msq == NULL) |
590 | goto out_free; | 603 | goto out_free; |
591 | 604 | ||
592 | err= -EIDRM; | 605 | err= -EIDRM; |
593 | if (msg_checkid(msq,msqid)) | 606 | if (msg_checkid(msq, msqid)) |
594 | goto out_unlock_free; | 607 | goto out_unlock_free; |
595 | 608 | ||
596 | for (;;) { | 609 | for (;;) { |
597 | struct msg_sender s; | 610 | struct msg_sender s; |
598 | 611 | ||
599 | err=-EACCES; | 612 | err = -EACCES; |
600 | if (ipcperms(&msq->q_perm, S_IWUGO)) | 613 | if (ipcperms(&msq->q_perm, S_IWUGO)) |
601 | goto out_unlock_free; | 614 | goto out_unlock_free; |
602 | 615 | ||
@@ -604,14 +617,14 @@ asmlinkage long sys_msgsnd (int msqid, struct msgbuf __user *msgp, size_t msgsz, | |||
604 | if (err) | 617 | if (err) |
605 | goto out_unlock_free; | 618 | goto out_unlock_free; |
606 | 619 | ||
607 | if(msgsz + msq->q_cbytes <= msq->q_qbytes && | 620 | if (msgsz + msq->q_cbytes <= msq->q_qbytes && |
608 | 1 + msq->q_qnum <= msq->q_qbytes) { | 621 | 1 + msq->q_qnum <= msq->q_qbytes) { |
609 | break; | 622 | break; |
610 | } | 623 | } |
611 | 624 | ||
612 | /* queue full, wait: */ | 625 | /* queue full, wait: */ |
613 | if(msgflg&IPC_NOWAIT) { | 626 | if (msgflg & IPC_NOWAIT) { |
614 | err=-EAGAIN; | 627 | err = -EAGAIN; |
615 | goto out_unlock_free; | 628 | goto out_unlock_free; |
616 | } | 629 | } |
617 | ss_add(msq, &s); | 630 | ss_add(msq, &s); |
@@ -626,9 +639,9 @@ asmlinkage long sys_msgsnd (int msqid, struct msgbuf __user *msgp, size_t msgsz, | |||
626 | goto out_unlock_free; | 639 | goto out_unlock_free; |
627 | } | 640 | } |
628 | ss_del(&s); | 641 | ss_del(&s); |
629 | 642 | ||
630 | if (signal_pending(current)) { | 643 | if (signal_pending(current)) { |
631 | err=-ERESTARTNOHAND; | 644 | err = -ERESTARTNOHAND; |
632 | goto out_unlock_free; | 645 | goto out_unlock_free; |
633 | } | 646 | } |
634 | } | 647 | } |
@@ -636,47 +649,47 @@ asmlinkage long sys_msgsnd (int msqid, struct msgbuf __user *msgp, size_t msgsz, | |||
636 | msq->q_lspid = current->tgid; | 649 | msq->q_lspid = current->tgid; |
637 | msq->q_stime = get_seconds(); | 650 | msq->q_stime = get_seconds(); |
638 | 651 | ||
639 | if(!pipelined_send(msq,msg)) { | 652 | if (!pipelined_send(msq, msg)) { |
640 | /* noone is waiting for this message, enqueue it */ | 653 | /* noone is waiting for this message, enqueue it */ |
641 | list_add_tail(&msg->m_list,&msq->q_messages); | 654 | list_add_tail(&msg->m_list, &msq->q_messages); |
642 | msq->q_cbytes += msgsz; | 655 | msq->q_cbytes += msgsz; |
643 | msq->q_qnum++; | 656 | msq->q_qnum++; |
644 | atomic_add(msgsz,&msg_bytes); | 657 | atomic_add(msgsz, &msg_bytes); |
645 | atomic_inc(&msg_hdrs); | 658 | atomic_inc(&msg_hdrs); |
646 | } | 659 | } |
647 | 660 | ||
648 | err = 0; | 661 | err = 0; |
649 | msg = NULL; | 662 | msg = NULL; |
650 | 663 | ||
651 | out_unlock_free: | 664 | out_unlock_free: |
652 | msg_unlock(msq); | 665 | msg_unlock(msq); |
653 | out_free: | 666 | out_free: |
654 | if(msg!=NULL) | 667 | if (msg != NULL) |
655 | free_msg(msg); | 668 | free_msg(msg); |
656 | return err; | 669 | return err; |
657 | } | 670 | } |
658 | 671 | ||
659 | static inline int convert_mode(long* msgtyp, int msgflg) | 672 | static inline int convert_mode(long *msgtyp, int msgflg) |
660 | { | 673 | { |
661 | /* | 674 | /* |
662 | * find message of correct type. | 675 | * find message of correct type. |
663 | * msgtyp = 0 => get first. | 676 | * msgtyp = 0 => get first. |
664 | * msgtyp > 0 => get first message of matching type. | 677 | * msgtyp > 0 => get first message of matching type. |
665 | * msgtyp < 0 => get message with least type must be < abs(msgtype). | 678 | * msgtyp < 0 => get message with least type must be < abs(msgtype). |
666 | */ | 679 | */ |
667 | if(*msgtyp==0) | 680 | if (*msgtyp == 0) |
668 | return SEARCH_ANY; | 681 | return SEARCH_ANY; |
669 | if(*msgtyp<0) { | 682 | if (*msgtyp < 0) { |
670 | *msgtyp=-(*msgtyp); | 683 | *msgtyp = -*msgtyp; |
671 | return SEARCH_LESSEQUAL; | 684 | return SEARCH_LESSEQUAL; |
672 | } | 685 | } |
673 | if(msgflg & MSG_EXCEPT) | 686 | if (msgflg & MSG_EXCEPT) |
674 | return SEARCH_NOTEQUAL; | 687 | return SEARCH_NOTEQUAL; |
675 | return SEARCH_EQUAL; | 688 | return SEARCH_EQUAL; |
676 | } | 689 | } |
677 | 690 | ||
678 | asmlinkage long sys_msgrcv (int msqid, struct msgbuf __user *msgp, size_t msgsz, | 691 | asmlinkage long sys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz, |
679 | long msgtyp, int msgflg) | 692 | long msgtyp, int msgflg) |
680 | { | 693 | { |
681 | struct msg_queue *msq; | 694 | struct msg_queue *msq; |
682 | struct msg_msg *msg; | 695 | struct msg_msg *msg; |
@@ -684,44 +697,51 @@ asmlinkage long sys_msgrcv (int msqid, struct msgbuf __user *msgp, size_t msgsz, | |||
684 | 697 | ||
685 | if (msqid < 0 || (long) msgsz < 0) | 698 | if (msqid < 0 || (long) msgsz < 0) |
686 | return -EINVAL; | 699 | return -EINVAL; |
687 | mode = convert_mode(&msgtyp,msgflg); | 700 | mode = convert_mode(&msgtyp, msgflg); |
688 | 701 | ||
689 | msq = msg_lock(msqid); | 702 | msq = msg_lock(msqid); |
690 | if(msq==NULL) | 703 | if (msq == NULL) |
691 | return -EINVAL; | 704 | return -EINVAL; |
692 | 705 | ||
693 | msg = ERR_PTR(-EIDRM); | 706 | msg = ERR_PTR(-EIDRM); |
694 | if (msg_checkid(msq,msqid)) | 707 | if (msg_checkid(msq, msqid)) |
695 | goto out_unlock; | 708 | goto out_unlock; |
696 | 709 | ||
697 | for (;;) { | 710 | for (;;) { |
698 | struct msg_receiver msr_d; | 711 | struct msg_receiver msr_d; |
699 | struct list_head* tmp; | 712 | struct list_head *tmp; |
700 | 713 | ||
701 | msg = ERR_PTR(-EACCES); | 714 | msg = ERR_PTR(-EACCES); |
702 | if (ipcperms (&msq->q_perm, S_IRUGO)) | 715 | if (ipcperms(&msq->q_perm, S_IRUGO)) |
703 | goto out_unlock; | 716 | goto out_unlock; |
704 | 717 | ||
705 | msg = ERR_PTR(-EAGAIN); | 718 | msg = ERR_PTR(-EAGAIN); |
706 | tmp = msq->q_messages.next; | 719 | tmp = msq->q_messages.next; |
707 | while (tmp != &msq->q_messages) { | 720 | while (tmp != &msq->q_messages) { |
708 | struct msg_msg *walk_msg; | 721 | struct msg_msg *walk_msg; |
709 | walk_msg = list_entry(tmp,struct msg_msg,m_list); | 722 | |
710 | if(testmsg(walk_msg,msgtyp,mode) && | 723 | walk_msg = list_entry(tmp, struct msg_msg, m_list); |
711 | !security_msg_queue_msgrcv(msq, walk_msg, current, msgtyp, mode)) { | 724 | if (testmsg(walk_msg, msgtyp, mode) && |
725 | !security_msg_queue_msgrcv(msq, walk_msg, current, | ||
726 | msgtyp, mode)) { | ||
727 | |||
712 | msg = walk_msg; | 728 | msg = walk_msg; |
713 | if(mode == SEARCH_LESSEQUAL && walk_msg->m_type != 1) { | 729 | if (mode == SEARCH_LESSEQUAL && |
714 | msg=walk_msg; | 730 | walk_msg->m_type != 1) { |
715 | msgtyp=walk_msg->m_type-1; | 731 | msg = walk_msg; |
732 | msgtyp = walk_msg->m_type - 1; | ||
716 | } else { | 733 | } else { |
717 | msg=walk_msg; | 734 | msg = walk_msg; |
718 | break; | 735 | break; |
719 | } | 736 | } |
720 | } | 737 | } |
721 | tmp = tmp->next; | 738 | tmp = tmp->next; |
722 | } | 739 | } |
723 | if(!IS_ERR(msg)) { | 740 | if (!IS_ERR(msg)) { |
724 | /* Found a suitable message. Unlink it from the queue. */ | 741 | /* |
742 | * Found a suitable message. | ||
743 | * Unlink it from the queue. | ||
744 | */ | ||
725 | if ((msgsz < msg->m_ts) && !(msgflg & MSG_NOERROR)) { | 745 | if ((msgsz < msg->m_ts) && !(msgflg & MSG_NOERROR)) { |
726 | msg = ERR_PTR(-E2BIG); | 746 | msg = ERR_PTR(-E2BIG); |
727 | goto out_unlock; | 747 | goto out_unlock; |
@@ -731,9 +751,9 @@ asmlinkage long sys_msgrcv (int msqid, struct msgbuf __user *msgp, size_t msgsz, | |||
731 | msq->q_rtime = get_seconds(); | 751 | msq->q_rtime = get_seconds(); |
732 | msq->q_lrpid = current->tgid; | 752 | msq->q_lrpid = current->tgid; |
733 | msq->q_cbytes -= msg->m_ts; | 753 | msq->q_cbytes -= msg->m_ts; |
734 | atomic_sub(msg->m_ts,&msg_bytes); | 754 | atomic_sub(msg->m_ts, &msg_bytes); |
735 | atomic_dec(&msg_hdrs); | 755 | atomic_dec(&msg_hdrs); |
736 | ss_wakeup(&msq->q_senders,0); | 756 | ss_wakeup(&msq->q_senders, 0); |
737 | msg_unlock(msq); | 757 | msg_unlock(msq); |
738 | break; | 758 | break; |
739 | } | 759 | } |
@@ -742,13 +762,13 @@ asmlinkage long sys_msgrcv (int msqid, struct msgbuf __user *msgp, size_t msgsz, | |||
742 | msg = ERR_PTR(-ENOMSG); | 762 | msg = ERR_PTR(-ENOMSG); |
743 | goto out_unlock; | 763 | goto out_unlock; |
744 | } | 764 | } |
745 | list_add_tail(&msr_d.r_list,&msq->q_receivers); | 765 | list_add_tail(&msr_d.r_list, &msq->q_receivers); |
746 | msr_d.r_tsk = current; | 766 | msr_d.r_tsk = current; |
747 | msr_d.r_msgtype = msgtyp; | 767 | msr_d.r_msgtype = msgtyp; |
748 | msr_d.r_mode = mode; | 768 | msr_d.r_mode = mode; |
749 | if(msgflg & MSG_NOERROR) | 769 | if (msgflg & MSG_NOERROR) |
750 | msr_d.r_maxsize = INT_MAX; | 770 | msr_d.r_maxsize = INT_MAX; |
751 | else | 771 | else |
752 | msr_d.r_maxsize = msgsz; | 772 | msr_d.r_maxsize = msgsz; |
753 | msr_d.r_msg = ERR_PTR(-EAGAIN); | 773 | msr_d.r_msg = ERR_PTR(-EAGAIN); |
754 | current->state = TASK_INTERRUPTIBLE; | 774 | current->state = TASK_INTERRUPTIBLE; |
@@ -773,17 +793,17 @@ asmlinkage long sys_msgrcv (int msqid, struct msgbuf __user *msgp, size_t msgsz, | |||
773 | * wake_up_process(). There is a race with exit(), see | 793 | * wake_up_process(). There is a race with exit(), see |
774 | * ipc/mqueue.c for the details. | 794 | * ipc/mqueue.c for the details. |
775 | */ | 795 | */ |
776 | msg = (struct msg_msg*) msr_d.r_msg; | 796 | msg = (struct msg_msg*)msr_d.r_msg; |
777 | while (msg == NULL) { | 797 | while (msg == NULL) { |
778 | cpu_relax(); | 798 | cpu_relax(); |
779 | msg = (struct msg_msg*) msr_d.r_msg; | 799 | msg = (struct msg_msg *)msr_d.r_msg; |
780 | } | 800 | } |
781 | 801 | ||
782 | /* Lockless receive, part 3: | 802 | /* Lockless receive, part 3: |
783 | * If there is a message or an error then accept it without | 803 | * If there is a message or an error then accept it without |
784 | * locking. | 804 | * locking. |
785 | */ | 805 | */ |
786 | if(msg != ERR_PTR(-EAGAIN)) { | 806 | if (msg != ERR_PTR(-EAGAIN)) { |
787 | rcu_read_unlock(); | 807 | rcu_read_unlock(); |
788 | break; | 808 | break; |
789 | } | 809 | } |
@@ -798,7 +818,7 @@ asmlinkage long sys_msgrcv (int msqid, struct msgbuf __user *msgp, size_t msgsz, | |||
798 | * Repeat test after acquiring the spinlock. | 818 | * Repeat test after acquiring the spinlock. |
799 | */ | 819 | */ |
800 | msg = (struct msg_msg*)msr_d.r_msg; | 820 | msg = (struct msg_msg*)msr_d.r_msg; |
801 | if(msg != ERR_PTR(-EAGAIN)) | 821 | if (msg != ERR_PTR(-EAGAIN)) |
802 | goto out_unlock; | 822 | goto out_unlock; |
803 | 823 | ||
804 | list_del(&msr_d.r_list); | 824 | list_del(&msr_d.r_list); |
@@ -810,14 +830,15 @@ out_unlock: | |||
810 | } | 830 | } |
811 | } | 831 | } |
812 | if (IS_ERR(msg)) | 832 | if (IS_ERR(msg)) |
813 | return PTR_ERR(msg); | 833 | return PTR_ERR(msg); |
814 | 834 | ||
815 | msgsz = (msgsz > msg->m_ts) ? msg->m_ts : msgsz; | 835 | msgsz = (msgsz > msg->m_ts) ? msg->m_ts : msgsz; |
816 | if (put_user (msg->m_type, &msgp->mtype) || | 836 | if (put_user (msg->m_type, &msgp->mtype) || |
817 | store_msg(msgp->mtext, msg, msgsz)) { | 837 | store_msg(msgp->mtext, msg, msgsz)) { |
818 | msgsz = -EFAULT; | 838 | msgsz = -EFAULT; |
819 | } | 839 | } |
820 | free_msg(msg); | 840 | free_msg(msg); |
841 | |||
821 | return msgsz; | 842 | return msgsz; |
822 | } | 843 | } |
823 | 844 | ||
@@ -827,20 +848,20 @@ static int sysvipc_msg_proc_show(struct seq_file *s, void *it) | |||
827 | struct msg_queue *msq = it; | 848 | struct msg_queue *msq = it; |
828 | 849 | ||
829 | return seq_printf(s, | 850 | return seq_printf(s, |
830 | "%10d %10d %4o %10lu %10lu %5u %5u %5u %5u %5u %5u %10lu %10lu %10lu\n", | 851 | "%10d %10d %4o %10lu %10lu %5u %5u %5u %5u %5u %5u %10lu %10lu %10lu\n", |
831 | msq->q_perm.key, | 852 | msq->q_perm.key, |
832 | msq->q_id, | 853 | msq->q_id, |
833 | msq->q_perm.mode, | 854 | msq->q_perm.mode, |
834 | msq->q_cbytes, | 855 | msq->q_cbytes, |
835 | msq->q_qnum, | 856 | msq->q_qnum, |
836 | msq->q_lspid, | 857 | msq->q_lspid, |
837 | msq->q_lrpid, | 858 | msq->q_lrpid, |
838 | msq->q_perm.uid, | 859 | msq->q_perm.uid, |
839 | msq->q_perm.gid, | 860 | msq->q_perm.gid, |
840 | msq->q_perm.cuid, | 861 | msq->q_perm.cuid, |
841 | msq->q_perm.cgid, | 862 | msq->q_perm.cgid, |
842 | msq->q_stime, | 863 | msq->q_stime, |
843 | msq->q_rtime, | 864 | msq->q_rtime, |
844 | msq->q_ctime); | 865 | msq->q_ctime); |
845 | } | 866 | } |
846 | #endif | 867 | #endif |
diff --git a/kernel/audit.c b/kernel/audit.c index d417ca1db79b..0a36091ed712 100644 --- a/kernel/audit.c +++ b/kernel/audit.c | |||
@@ -690,9 +690,7 @@ static const struct inotify_operations audit_inotify_ops = { | |||
690 | /* Initialize audit support at boot time. */ | 690 | /* Initialize audit support at boot time. */ |
691 | static int __init audit_init(void) | 691 | static int __init audit_init(void) |
692 | { | 692 | { |
693 | #ifdef CONFIG_AUDITSYSCALL | ||
694 | int i; | 693 | int i; |
695 | #endif | ||
696 | 694 | ||
697 | printk(KERN_INFO "audit: initializing netlink socket (%s)\n", | 695 | printk(KERN_INFO "audit: initializing netlink socket (%s)\n", |
698 | audit_default ? "enabled" : "disabled"); | 696 | audit_default ? "enabled" : "disabled"); |
@@ -717,10 +715,10 @@ static int __init audit_init(void) | |||
717 | audit_ih = inotify_init(&audit_inotify_ops); | 715 | audit_ih = inotify_init(&audit_inotify_ops); |
718 | if (IS_ERR(audit_ih)) | 716 | if (IS_ERR(audit_ih)) |
719 | audit_panic("cannot initialize inotify handle"); | 717 | audit_panic("cannot initialize inotify handle"); |
718 | #endif | ||
720 | 719 | ||
721 | for (i = 0; i < AUDIT_INODE_BUCKETS; i++) | 720 | for (i = 0; i < AUDIT_INODE_BUCKETS; i++) |
722 | INIT_LIST_HEAD(&audit_inode_hash[i]); | 721 | INIT_LIST_HEAD(&audit_inode_hash[i]); |
723 | #endif | ||
724 | 722 | ||
725 | return 0; | 723 | return 0; |
726 | } | 724 | } |
diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index 5b4e16276ca0..6a9a5c5a4e7d 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c | |||
@@ -442,6 +442,7 @@ static struct audit_entry *audit_rule_to_entry(struct audit_rule *rule) | |||
442 | case AUDIT_EQUAL: | 442 | case AUDIT_EQUAL: |
443 | break; | 443 | break; |
444 | default: | 444 | default: |
445 | err = -EINVAL; | ||
445 | goto exit_free; | 446 | goto exit_free; |
446 | } | 447 | } |
447 | } | 448 | } |
@@ -579,6 +580,7 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, | |||
579 | case AUDIT_EQUAL: | 580 | case AUDIT_EQUAL: |
580 | break; | 581 | break; |
581 | default: | 582 | default: |
583 | err = -EINVAL; | ||
582 | goto exit_free; | 584 | goto exit_free; |
583 | } | 585 | } |
584 | } | 586 | } |
@@ -1134,6 +1136,14 @@ static inline int audit_add_rule(struct audit_entry *entry, | |||
1134 | struct audit_watch *watch = entry->rule.watch; | 1136 | struct audit_watch *watch = entry->rule.watch; |
1135 | struct nameidata *ndp, *ndw; | 1137 | struct nameidata *ndp, *ndw; |
1136 | int h, err, putnd_needed = 0; | 1138 | int h, err, putnd_needed = 0; |
1139 | #ifdef CONFIG_AUDITSYSCALL | ||
1140 | int dont_count = 0; | ||
1141 | |||
1142 | /* If either of these, don't count towards total */ | ||
1143 | if (entry->rule.listnr == AUDIT_FILTER_USER || | ||
1144 | entry->rule.listnr == AUDIT_FILTER_TYPE) | ||
1145 | dont_count = 1; | ||
1146 | #endif | ||
1137 | 1147 | ||
1138 | if (inode_f) { | 1148 | if (inode_f) { |
1139 | h = audit_hash_ino(inode_f->val); | 1149 | h = audit_hash_ino(inode_f->val); |
@@ -1174,6 +1184,10 @@ static inline int audit_add_rule(struct audit_entry *entry, | |||
1174 | } else { | 1184 | } else { |
1175 | list_add_tail_rcu(&entry->list, list); | 1185 | list_add_tail_rcu(&entry->list, list); |
1176 | } | 1186 | } |
1187 | #ifdef CONFIG_AUDITSYSCALL | ||
1188 | if (!dont_count) | ||
1189 | audit_n_rules++; | ||
1190 | #endif | ||
1177 | mutex_unlock(&audit_filter_mutex); | 1191 | mutex_unlock(&audit_filter_mutex); |
1178 | 1192 | ||
1179 | if (putnd_needed) | 1193 | if (putnd_needed) |
@@ -1198,6 +1212,14 @@ static inline int audit_del_rule(struct audit_entry *entry, | |||
1198 | struct audit_watch *watch, *tmp_watch = entry->rule.watch; | 1212 | struct audit_watch *watch, *tmp_watch = entry->rule.watch; |
1199 | LIST_HEAD(inotify_list); | 1213 | LIST_HEAD(inotify_list); |
1200 | int h, ret = 0; | 1214 | int h, ret = 0; |
1215 | #ifdef CONFIG_AUDITSYSCALL | ||
1216 | int dont_count = 0; | ||
1217 | |||
1218 | /* If either of these, don't count towards total */ | ||
1219 | if (entry->rule.listnr == AUDIT_FILTER_USER || | ||
1220 | entry->rule.listnr == AUDIT_FILTER_TYPE) | ||
1221 | dont_count = 1; | ||
1222 | #endif | ||
1201 | 1223 | ||
1202 | if (inode_f) { | 1224 | if (inode_f) { |
1203 | h = audit_hash_ino(inode_f->val); | 1225 | h = audit_hash_ino(inode_f->val); |
@@ -1235,6 +1257,10 @@ static inline int audit_del_rule(struct audit_entry *entry, | |||
1235 | list_del_rcu(&e->list); | 1257 | list_del_rcu(&e->list); |
1236 | call_rcu(&e->rcu, audit_free_rule_rcu); | 1258 | call_rcu(&e->rcu, audit_free_rule_rcu); |
1237 | 1259 | ||
1260 | #ifdef CONFIG_AUDITSYSCALL | ||
1261 | if (!dont_count) | ||
1262 | audit_n_rules--; | ||
1263 | #endif | ||
1238 | mutex_unlock(&audit_filter_mutex); | 1264 | mutex_unlock(&audit_filter_mutex); |
1239 | 1265 | ||
1240 | if (!list_empty(&inotify_list)) | 1266 | if (!list_empty(&inotify_list)) |
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index ae40ac8c39e7..efc1b74bebf3 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
@@ -85,6 +85,9 @@ extern int audit_enabled; | |||
85 | /* Indicates that audit should log the full pathname. */ | 85 | /* Indicates that audit should log the full pathname. */ |
86 | #define AUDIT_NAME_FULL -1 | 86 | #define AUDIT_NAME_FULL -1 |
87 | 87 | ||
88 | /* number of audit rules */ | ||
89 | int audit_n_rules; | ||
90 | |||
88 | /* When fs/namei.c:getname() is called, we store the pointer in name and | 91 | /* When fs/namei.c:getname() is called, we store the pointer in name and |
89 | * we don't let putname() free it (instead we free all of the saved | 92 | * we don't let putname() free it (instead we free all of the saved |
90 | * pointers at syscall exit time). | 93 | * pointers at syscall exit time). |
@@ -174,6 +177,7 @@ struct audit_aux_data_path { | |||
174 | 177 | ||
175 | /* The per-task audit context. */ | 178 | /* The per-task audit context. */ |
176 | struct audit_context { | 179 | struct audit_context { |
180 | int dummy; /* must be the first element */ | ||
177 | int in_syscall; /* 1 if task is in a syscall */ | 181 | int in_syscall; /* 1 if task is in a syscall */ |
178 | enum audit_state state; | 182 | enum audit_state state; |
179 | unsigned int serial; /* serial number for record */ | 183 | unsigned int serial; /* serial number for record */ |
@@ -514,7 +518,7 @@ static inline struct audit_context *audit_get_context(struct task_struct *tsk, | |||
514 | context->return_valid = return_valid; | 518 | context->return_valid = return_valid; |
515 | context->return_code = return_code; | 519 | context->return_code = return_code; |
516 | 520 | ||
517 | if (context->in_syscall && !context->auditable) { | 521 | if (context->in_syscall && !context->dummy && !context->auditable) { |
518 | enum audit_state state; | 522 | enum audit_state state; |
519 | 523 | ||
520 | state = audit_filter_syscall(tsk, context, &audit_filter_list[AUDIT_FILTER_EXIT]); | 524 | state = audit_filter_syscall(tsk, context, &audit_filter_list[AUDIT_FILTER_EXIT]); |
@@ -530,17 +534,7 @@ static inline struct audit_context *audit_get_context(struct task_struct *tsk, | |||
530 | } | 534 | } |
531 | 535 | ||
532 | get_context: | 536 | get_context: |
533 | context->pid = tsk->pid; | 537 | |
534 | context->ppid = sys_getppid(); /* sic. tsk == current in all cases */ | ||
535 | context->uid = tsk->uid; | ||
536 | context->gid = tsk->gid; | ||
537 | context->euid = tsk->euid; | ||
538 | context->suid = tsk->suid; | ||
539 | context->fsuid = tsk->fsuid; | ||
540 | context->egid = tsk->egid; | ||
541 | context->sgid = tsk->sgid; | ||
542 | context->fsgid = tsk->fsgid; | ||
543 | context->personality = tsk->personality; | ||
544 | tsk->audit_context = NULL; | 538 | tsk->audit_context = NULL; |
545 | return context; | 539 | return context; |
546 | } | 540 | } |
@@ -749,6 +743,17 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts | |||
749 | const char *tty; | 743 | const char *tty; |
750 | 744 | ||
751 | /* tsk == current */ | 745 | /* tsk == current */ |
746 | context->pid = tsk->pid; | ||
747 | context->ppid = sys_getppid(); /* sic. tsk == current in all cases */ | ||
748 | context->uid = tsk->uid; | ||
749 | context->gid = tsk->gid; | ||
750 | context->euid = tsk->euid; | ||
751 | context->suid = tsk->suid; | ||
752 | context->fsuid = tsk->fsuid; | ||
753 | context->egid = tsk->egid; | ||
754 | context->sgid = tsk->sgid; | ||
755 | context->fsgid = tsk->fsgid; | ||
756 | context->personality = tsk->personality; | ||
752 | 757 | ||
753 | ab = audit_log_start(context, GFP_KERNEL, AUDIT_SYSCALL); | 758 | ab = audit_log_start(context, GFP_KERNEL, AUDIT_SYSCALL); |
754 | if (!ab) | 759 | if (!ab) |
@@ -1066,7 +1071,8 @@ void audit_syscall_entry(int arch, int major, | |||
1066 | context->argv[3] = a4; | 1071 | context->argv[3] = a4; |
1067 | 1072 | ||
1068 | state = context->state; | 1073 | state = context->state; |
1069 | if (state == AUDIT_SETUP_CONTEXT || state == AUDIT_BUILD_CONTEXT) | 1074 | context->dummy = !audit_n_rules; |
1075 | if (!context->dummy && (state == AUDIT_SETUP_CONTEXT || state == AUDIT_BUILD_CONTEXT)) | ||
1070 | state = audit_filter_syscall(tsk, context, &audit_filter_list[AUDIT_FILTER_ENTRY]); | 1076 | state = audit_filter_syscall(tsk, context, &audit_filter_list[AUDIT_FILTER_ENTRY]); |
1071 | if (likely(state == AUDIT_DISABLED)) | 1077 | if (likely(state == AUDIT_DISABLED)) |
1072 | return; | 1078 | return; |
@@ -1199,14 +1205,18 @@ void audit_putname(const char *name) | |||
1199 | #endif | 1205 | #endif |
1200 | } | 1206 | } |
1201 | 1207 | ||
1202 | static void audit_inode_context(int idx, const struct inode *inode) | 1208 | /* Copy inode data into an audit_names. */ |
1209 | static void audit_copy_inode(struct audit_names *name, const struct inode *inode) | ||
1203 | { | 1210 | { |
1204 | struct audit_context *context = current->audit_context; | 1211 | name->ino = inode->i_ino; |
1205 | 1212 | name->dev = inode->i_sb->s_dev; | |
1206 | selinux_get_inode_sid(inode, &context->names[idx].osid); | 1213 | name->mode = inode->i_mode; |
1214 | name->uid = inode->i_uid; | ||
1215 | name->gid = inode->i_gid; | ||
1216 | name->rdev = inode->i_rdev; | ||
1217 | selinux_get_inode_sid(inode, &name->osid); | ||
1207 | } | 1218 | } |
1208 | 1219 | ||
1209 | |||
1210 | /** | 1220 | /** |
1211 | * audit_inode - store the inode and device from a lookup | 1221 | * audit_inode - store the inode and device from a lookup |
1212 | * @name: name being audited | 1222 | * @name: name being audited |
@@ -1240,20 +1250,14 @@ void __audit_inode(const char *name, const struct inode *inode) | |||
1240 | ++context->ino_count; | 1250 | ++context->ino_count; |
1241 | #endif | 1251 | #endif |
1242 | } | 1252 | } |
1243 | context->names[idx].ino = inode->i_ino; | 1253 | audit_copy_inode(&context->names[idx], inode); |
1244 | context->names[idx].dev = inode->i_sb->s_dev; | ||
1245 | context->names[idx].mode = inode->i_mode; | ||
1246 | context->names[idx].uid = inode->i_uid; | ||
1247 | context->names[idx].gid = inode->i_gid; | ||
1248 | context->names[idx].rdev = inode->i_rdev; | ||
1249 | audit_inode_context(idx, inode); | ||
1250 | } | 1254 | } |
1251 | 1255 | ||
1252 | /** | 1256 | /** |
1253 | * audit_inode_child - collect inode info for created/removed objects | 1257 | * audit_inode_child - collect inode info for created/removed objects |
1254 | * @dname: inode's dentry name | 1258 | * @dname: inode's dentry name |
1255 | * @inode: inode being audited | 1259 | * @inode: inode being audited |
1256 | * @pino: inode number of dentry parent | 1260 | * @parent: inode of dentry parent |
1257 | * | 1261 | * |
1258 | * For syscalls that create or remove filesystem objects, audit_inode | 1262 | * For syscalls that create or remove filesystem objects, audit_inode |
1259 | * can only collect information for the filesystem object's parent. | 1263 | * can only collect information for the filesystem object's parent. |
@@ -1264,7 +1268,7 @@ void __audit_inode(const char *name, const struct inode *inode) | |||
1264 | * unsuccessful attempts. | 1268 | * unsuccessful attempts. |
1265 | */ | 1269 | */ |
1266 | void __audit_inode_child(const char *dname, const struct inode *inode, | 1270 | void __audit_inode_child(const char *dname, const struct inode *inode, |
1267 | unsigned long pino) | 1271 | const struct inode *parent) |
1268 | { | 1272 | { |
1269 | int idx; | 1273 | int idx; |
1270 | struct audit_context *context = current->audit_context; | 1274 | struct audit_context *context = current->audit_context; |
@@ -1278,7 +1282,7 @@ void __audit_inode_child(const char *dname, const struct inode *inode, | |||
1278 | if (!dname) | 1282 | if (!dname) |
1279 | goto update_context; | 1283 | goto update_context; |
1280 | for (idx = 0; idx < context->name_count; idx++) | 1284 | for (idx = 0; idx < context->name_count; idx++) |
1281 | if (context->names[idx].ino == pino) { | 1285 | if (context->names[idx].ino == parent->i_ino) { |
1282 | const char *name = context->names[idx].name; | 1286 | const char *name = context->names[idx].name; |
1283 | 1287 | ||
1284 | if (!name) | 1288 | if (!name) |
@@ -1302,16 +1306,47 @@ update_context: | |||
1302 | context->names[idx].name_len = AUDIT_NAME_FULL; | 1306 | context->names[idx].name_len = AUDIT_NAME_FULL; |
1303 | context->names[idx].name_put = 0; /* don't call __putname() */ | 1307 | context->names[idx].name_put = 0; /* don't call __putname() */ |
1304 | 1308 | ||
1305 | if (inode) { | 1309 | if (!inode) |
1306 | context->names[idx].ino = inode->i_ino; | 1310 | context->names[idx].ino = (unsigned long)-1; |
1307 | context->names[idx].dev = inode->i_sb->s_dev; | 1311 | else |
1308 | context->names[idx].mode = inode->i_mode; | 1312 | audit_copy_inode(&context->names[idx], inode); |
1309 | context->names[idx].uid = inode->i_uid; | 1313 | |
1310 | context->names[idx].gid = inode->i_gid; | 1314 | /* A parent was not found in audit_names, so copy the inode data for the |
1311 | context->names[idx].rdev = inode->i_rdev; | 1315 | * provided parent. */ |
1312 | audit_inode_context(idx, inode); | 1316 | if (!found_name) { |
1313 | } else | 1317 | idx = context->name_count++; |
1314 | context->names[idx].ino = (unsigned long)-1; | 1318 | #if AUDIT_DEBUG |
1319 | context->ino_count++; | ||
1320 | #endif | ||
1321 | audit_copy_inode(&context->names[idx], parent); | ||
1322 | } | ||
1323 | } | ||
1324 | |||
1325 | /** | ||
1326 | * audit_inode_update - update inode info for last collected name | ||
1327 | * @inode: inode being audited | ||
1328 | * | ||
1329 | * When open() is called on an existing object with the O_CREAT flag, the inode | ||
1330 | * data audit initially collects is incorrect. This additional hook ensures | ||
1331 | * audit has the inode data for the actual object to be opened. | ||
1332 | */ | ||
1333 | void __audit_inode_update(const struct inode *inode) | ||
1334 | { | ||
1335 | struct audit_context *context = current->audit_context; | ||
1336 | int idx; | ||
1337 | |||
1338 | if (!context->in_syscall || !inode) | ||
1339 | return; | ||
1340 | |||
1341 | if (context->name_count == 0) { | ||
1342 | context->name_count++; | ||
1343 | #if AUDIT_DEBUG | ||
1344 | context->ino_count++; | ||
1345 | #endif | ||
1346 | } | ||
1347 | idx = context->name_count - 1; | ||
1348 | |||
1349 | audit_copy_inode(&context->names[idx], inode); | ||
1315 | } | 1350 | } |
1316 | 1351 | ||
1317 | /** | 1352 | /** |
@@ -1642,7 +1677,7 @@ int audit_bprm(struct linux_binprm *bprm) | |||
1642 | unsigned long p, next; | 1677 | unsigned long p, next; |
1643 | void *to; | 1678 | void *to; |
1644 | 1679 | ||
1645 | if (likely(!audit_enabled || !context)) | 1680 | if (likely(!audit_enabled || !context || context->dummy)) |
1646 | return 0; | 1681 | return 0; |
1647 | 1682 | ||
1648 | ax = kmalloc(sizeof(*ax) + PAGE_SIZE * MAX_ARG_PAGES - bprm->p, | 1683 | ax = kmalloc(sizeof(*ax) + PAGE_SIZE * MAX_ARG_PAGES - bprm->p, |
@@ -1680,7 +1715,7 @@ int audit_socketcall(int nargs, unsigned long *args) | |||
1680 | struct audit_aux_data_socketcall *ax; | 1715 | struct audit_aux_data_socketcall *ax; |
1681 | struct audit_context *context = current->audit_context; | 1716 | struct audit_context *context = current->audit_context; |
1682 | 1717 | ||
1683 | if (likely(!context)) | 1718 | if (likely(!context || context->dummy)) |
1684 | return 0; | 1719 | return 0; |
1685 | 1720 | ||
1686 | ax = kmalloc(sizeof(*ax) + nargs * sizeof(unsigned long), GFP_KERNEL); | 1721 | ax = kmalloc(sizeof(*ax) + nargs * sizeof(unsigned long), GFP_KERNEL); |
@@ -1708,7 +1743,7 @@ int audit_sockaddr(int len, void *a) | |||
1708 | struct audit_aux_data_sockaddr *ax; | 1743 | struct audit_aux_data_sockaddr *ax; |
1709 | struct audit_context *context = current->audit_context; | 1744 | struct audit_context *context = current->audit_context; |
1710 | 1745 | ||
1711 | if (likely(!context)) | 1746 | if (likely(!context || context->dummy)) |
1712 | return 0; | 1747 | return 0; |
1713 | 1748 | ||
1714 | ax = kmalloc(sizeof(*ax) + len, GFP_KERNEL); | 1749 | ax = kmalloc(sizeof(*ax) + len, GFP_KERNEL); |
diff --git a/kernel/delayacct.c b/kernel/delayacct.c index f05392d64267..57ca3730205d 100644 --- a/kernel/delayacct.c +++ b/kernel/delayacct.c | |||
@@ -19,15 +19,15 @@ | |||
19 | #include <linux/sysctl.h> | 19 | #include <linux/sysctl.h> |
20 | #include <linux/delayacct.h> | 20 | #include <linux/delayacct.h> |
21 | 21 | ||
22 | int delayacct_on __read_mostly; /* Delay accounting turned on/off */ | 22 | int delayacct_on __read_mostly = 1; /* Delay accounting turned on/off */ |
23 | kmem_cache_t *delayacct_cache; | 23 | kmem_cache_t *delayacct_cache; |
24 | 24 | ||
25 | static int __init delayacct_setup_enable(char *str) | 25 | static int __init delayacct_setup_disable(char *str) |
26 | { | 26 | { |
27 | delayacct_on = 1; | 27 | delayacct_on = 0; |
28 | return 1; | 28 | return 1; |
29 | } | 29 | } |
30 | __setup("delayacct", delayacct_setup_enable); | 30 | __setup("nodelayacct", delayacct_setup_disable); |
31 | 31 | ||
32 | void delayacct_init(void) | 32 | void delayacct_init(void) |
33 | { | 33 | { |
diff --git a/kernel/fork.c b/kernel/fork.c index 1b0f7b1e0881..aa36c43783cc 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -1387,8 +1387,10 @@ long do_fork(unsigned long clone_flags, | |||
1387 | 1387 | ||
1388 | if (clone_flags & CLONE_VFORK) { | 1388 | if (clone_flags & CLONE_VFORK) { |
1389 | wait_for_completion(&vfork); | 1389 | wait_for_completion(&vfork); |
1390 | if (unlikely (current->ptrace & PT_TRACE_VFORK_DONE)) | 1390 | if (unlikely (current->ptrace & PT_TRACE_VFORK_DONE)) { |
1391 | current->ptrace_message = nr; | ||
1391 | ptrace_notify ((PTRACE_EVENT_VFORK_DONE << 8) | SIGTRAP); | 1392 | ptrace_notify ((PTRACE_EVENT_VFORK_DONE << 8) | SIGTRAP); |
1393 | } | ||
1392 | } | 1394 | } |
1393 | } else { | 1395 | } else { |
1394 | free_pid(pid); | 1396 | free_pid(pid); |
diff --git a/kernel/futex.c b/kernel/futex.c index cf0c8e21d1ab..d4633c588f33 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
@@ -297,7 +297,7 @@ static int futex_handle_fault(unsigned long address, int attempt) | |||
297 | struct vm_area_struct * vma; | 297 | struct vm_area_struct * vma; |
298 | struct mm_struct *mm = current->mm; | 298 | struct mm_struct *mm = current->mm; |
299 | 299 | ||
300 | if (attempt >= 2 || !(vma = find_vma(mm, address)) || | 300 | if (attempt > 2 || !(vma = find_vma(mm, address)) || |
301 | vma->vm_start > address || !(vma->vm_flags & VM_WRITE)) | 301 | vma->vm_start > address || !(vma->vm_flags & VM_WRITE)) |
302 | return -EFAULT; | 302 | return -EFAULT; |
303 | 303 | ||
@@ -415,15 +415,15 @@ out_unlock: | |||
415 | */ | 415 | */ |
416 | void exit_pi_state_list(struct task_struct *curr) | 416 | void exit_pi_state_list(struct task_struct *curr) |
417 | { | 417 | { |
418 | struct futex_hash_bucket *hb; | ||
419 | struct list_head *next, *head = &curr->pi_state_list; | 418 | struct list_head *next, *head = &curr->pi_state_list; |
420 | struct futex_pi_state *pi_state; | 419 | struct futex_pi_state *pi_state; |
420 | struct futex_hash_bucket *hb; | ||
421 | union futex_key key; | 421 | union futex_key key; |
422 | 422 | ||
423 | /* | 423 | /* |
424 | * We are a ZOMBIE and nobody can enqueue itself on | 424 | * We are a ZOMBIE and nobody can enqueue itself on |
425 | * pi_state_list anymore, but we have to be careful | 425 | * pi_state_list anymore, but we have to be careful |
426 | * versus waiters unqueueing themselfs | 426 | * versus waiters unqueueing themselves: |
427 | */ | 427 | */ |
428 | spin_lock_irq(&curr->pi_lock); | 428 | spin_lock_irq(&curr->pi_lock); |
429 | while (!list_empty(head)) { | 429 | while (!list_empty(head)) { |
@@ -431,21 +431,24 @@ void exit_pi_state_list(struct task_struct *curr) | |||
431 | next = head->next; | 431 | next = head->next; |
432 | pi_state = list_entry(next, struct futex_pi_state, list); | 432 | pi_state = list_entry(next, struct futex_pi_state, list); |
433 | key = pi_state->key; | 433 | key = pi_state->key; |
434 | hb = hash_futex(&key); | ||
434 | spin_unlock_irq(&curr->pi_lock); | 435 | spin_unlock_irq(&curr->pi_lock); |
435 | 436 | ||
436 | hb = hash_futex(&key); | ||
437 | spin_lock(&hb->lock); | 437 | spin_lock(&hb->lock); |
438 | 438 | ||
439 | spin_lock_irq(&curr->pi_lock); | 439 | spin_lock_irq(&curr->pi_lock); |
440 | /* | ||
441 | * We dropped the pi-lock, so re-check whether this | ||
442 | * task still owns the PI-state: | ||
443 | */ | ||
440 | if (head->next != next) { | 444 | if (head->next != next) { |
441 | spin_unlock(&hb->lock); | 445 | spin_unlock(&hb->lock); |
442 | continue; | 446 | continue; |
443 | } | 447 | } |
444 | 448 | ||
445 | list_del_init(&pi_state->list); | ||
446 | |||
447 | WARN_ON(pi_state->owner != curr); | 449 | WARN_ON(pi_state->owner != curr); |
448 | 450 | WARN_ON(list_empty(&pi_state->list)); | |
451 | list_del_init(&pi_state->list); | ||
449 | pi_state->owner = NULL; | 452 | pi_state->owner = NULL; |
450 | spin_unlock_irq(&curr->pi_lock); | 453 | spin_unlock_irq(&curr->pi_lock); |
451 | 454 | ||
@@ -470,7 +473,7 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, struct futex_q *me) | |||
470 | head = &hb->chain; | 473 | head = &hb->chain; |
471 | 474 | ||
472 | list_for_each_entry_safe(this, next, head, list) { | 475 | list_for_each_entry_safe(this, next, head, list) { |
473 | if (match_futex (&this->key, &me->key)) { | 476 | if (match_futex(&this->key, &me->key)) { |
474 | /* | 477 | /* |
475 | * Another waiter already exists - bump up | 478 | * Another waiter already exists - bump up |
476 | * the refcount and return its pi_state: | 479 | * the refcount and return its pi_state: |
@@ -482,6 +485,8 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, struct futex_q *me) | |||
482 | if (unlikely(!pi_state)) | 485 | if (unlikely(!pi_state)) |
483 | return -EINVAL; | 486 | return -EINVAL; |
484 | 487 | ||
488 | WARN_ON(!atomic_read(&pi_state->refcount)); | ||
489 | |||
485 | atomic_inc(&pi_state->refcount); | 490 | atomic_inc(&pi_state->refcount); |
486 | me->pi_state = pi_state; | 491 | me->pi_state = pi_state; |
487 | 492 | ||
@@ -490,10 +495,13 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, struct futex_q *me) | |||
490 | } | 495 | } |
491 | 496 | ||
492 | /* | 497 | /* |
493 | * We are the first waiter - try to look up the real owner and | 498 | * We are the first waiter - try to look up the real owner and attach |
494 | * attach the new pi_state to it: | 499 | * the new pi_state to it, but bail out when the owner died bit is set |
500 | * and TID = 0: | ||
495 | */ | 501 | */ |
496 | pid = uval & FUTEX_TID_MASK; | 502 | pid = uval & FUTEX_TID_MASK; |
503 | if (!pid && (uval & FUTEX_OWNER_DIED)) | ||
504 | return -ESRCH; | ||
497 | p = futex_find_get_task(pid); | 505 | p = futex_find_get_task(pid); |
498 | if (!p) | 506 | if (!p) |
499 | return -ESRCH; | 507 | return -ESRCH; |
@@ -510,6 +518,7 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, struct futex_q *me) | |||
510 | pi_state->key = me->key; | 518 | pi_state->key = me->key; |
511 | 519 | ||
512 | spin_lock_irq(&p->pi_lock); | 520 | spin_lock_irq(&p->pi_lock); |
521 | WARN_ON(!list_empty(&pi_state->list)); | ||
513 | list_add(&pi_state->list, &p->pi_state_list); | 522 | list_add(&pi_state->list, &p->pi_state_list); |
514 | pi_state->owner = p; | 523 | pi_state->owner = p; |
515 | spin_unlock_irq(&p->pi_lock); | 524 | spin_unlock_irq(&p->pi_lock); |
@@ -573,20 +582,29 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this) | |||
573 | * kept enabled while there is PI state around. We must also | 582 | * kept enabled while there is PI state around. We must also |
574 | * preserve the owner died bit.) | 583 | * preserve the owner died bit.) |
575 | */ | 584 | */ |
576 | newval = (uval & FUTEX_OWNER_DIED) | FUTEX_WAITERS | new_owner->pid; | 585 | if (!(uval & FUTEX_OWNER_DIED)) { |
586 | newval = FUTEX_WAITERS | new_owner->pid; | ||
577 | 587 | ||
578 | inc_preempt_count(); | 588 | inc_preempt_count(); |
579 | curval = futex_atomic_cmpxchg_inatomic(uaddr, uval, newval); | 589 | curval = futex_atomic_cmpxchg_inatomic(uaddr, uval, newval); |
580 | dec_preempt_count(); | 590 | dec_preempt_count(); |
591 | if (curval == -EFAULT) | ||
592 | return -EFAULT; | ||
593 | if (curval != uval) | ||
594 | return -EINVAL; | ||
595 | } | ||
581 | 596 | ||
582 | if (curval == -EFAULT) | 597 | spin_lock_irq(&pi_state->owner->pi_lock); |
583 | return -EFAULT; | 598 | WARN_ON(list_empty(&pi_state->list)); |
584 | if (curval != uval) | 599 | list_del_init(&pi_state->list); |
585 | return -EINVAL; | 600 | spin_unlock_irq(&pi_state->owner->pi_lock); |
586 | 601 | ||
587 | list_del_init(&pi_state->owner->pi_state_list); | 602 | spin_lock_irq(&new_owner->pi_lock); |
603 | WARN_ON(!list_empty(&pi_state->list)); | ||
588 | list_add(&pi_state->list, &new_owner->pi_state_list); | 604 | list_add(&pi_state->list, &new_owner->pi_state_list); |
589 | pi_state->owner = new_owner; | 605 | pi_state->owner = new_owner; |
606 | spin_unlock_irq(&new_owner->pi_lock); | ||
607 | |||
590 | rt_mutex_unlock(&pi_state->pi_mutex); | 608 | rt_mutex_unlock(&pi_state->pi_mutex); |
591 | 609 | ||
592 | return 0; | 610 | return 0; |
@@ -729,8 +747,10 @@ retry: | |||
729 | */ | 747 | */ |
730 | if (attempt++) { | 748 | if (attempt++) { |
731 | if (futex_handle_fault((unsigned long)uaddr2, | 749 | if (futex_handle_fault((unsigned long)uaddr2, |
732 | attempt)) | 750 | attempt)) { |
751 | ret = -EFAULT; | ||
733 | goto out; | 752 | goto out; |
753 | } | ||
734 | goto retry; | 754 | goto retry; |
735 | } | 755 | } |
736 | 756 | ||
@@ -930,6 +950,7 @@ static int unqueue_me(struct futex_q *q) | |||
930 | /* In the common case we don't take the spinlock, which is nice. */ | 950 | /* In the common case we don't take the spinlock, which is nice. */ |
931 | retry: | 951 | retry: |
932 | lock_ptr = q->lock_ptr; | 952 | lock_ptr = q->lock_ptr; |
953 | barrier(); | ||
933 | if (lock_ptr != 0) { | 954 | if (lock_ptr != 0) { |
934 | spin_lock(lock_ptr); | 955 | spin_lock(lock_ptr); |
935 | /* | 956 | /* |
@@ -1236,6 +1257,7 @@ static int do_futex_lock_pi(u32 __user *uaddr, int detect, int trylock, | |||
1236 | /* Owner died? */ | 1257 | /* Owner died? */ |
1237 | if (q.pi_state->owner != NULL) { | 1258 | if (q.pi_state->owner != NULL) { |
1238 | spin_lock_irq(&q.pi_state->owner->pi_lock); | 1259 | spin_lock_irq(&q.pi_state->owner->pi_lock); |
1260 | WARN_ON(list_empty(&q.pi_state->list)); | ||
1239 | list_del_init(&q.pi_state->list); | 1261 | list_del_init(&q.pi_state->list); |
1240 | spin_unlock_irq(&q.pi_state->owner->pi_lock); | 1262 | spin_unlock_irq(&q.pi_state->owner->pi_lock); |
1241 | } else | 1263 | } else |
@@ -1244,6 +1266,7 @@ static int do_futex_lock_pi(u32 __user *uaddr, int detect, int trylock, | |||
1244 | q.pi_state->owner = current; | 1266 | q.pi_state->owner = current; |
1245 | 1267 | ||
1246 | spin_lock_irq(¤t->pi_lock); | 1268 | spin_lock_irq(¤t->pi_lock); |
1269 | WARN_ON(!list_empty(&q.pi_state->list)); | ||
1247 | list_add(&q.pi_state->list, ¤t->pi_state_list); | 1270 | list_add(&q.pi_state->list, ¤t->pi_state_list); |
1248 | spin_unlock_irq(¤t->pi_lock); | 1271 | spin_unlock_irq(¤t->pi_lock); |
1249 | 1272 | ||
@@ -1301,9 +1324,10 @@ static int do_futex_lock_pi(u32 __user *uaddr, int detect, int trylock, | |||
1301 | * still holding the mmap_sem. | 1324 | * still holding the mmap_sem. |
1302 | */ | 1325 | */ |
1303 | if (attempt++) { | 1326 | if (attempt++) { |
1304 | if (futex_handle_fault((unsigned long)uaddr, attempt)) | 1327 | if (futex_handle_fault((unsigned long)uaddr, attempt)) { |
1328 | ret = -EFAULT; | ||
1305 | goto out_unlock_release_sem; | 1329 | goto out_unlock_release_sem; |
1306 | 1330 | } | |
1307 | goto retry_locked; | 1331 | goto retry_locked; |
1308 | } | 1332 | } |
1309 | 1333 | ||
@@ -1427,9 +1451,11 @@ retry_locked: | |||
1427 | * again. If it succeeds then we can return without waking | 1451 | * again. If it succeeds then we can return without waking |
1428 | * anyone else up: | 1452 | * anyone else up: |
1429 | */ | 1453 | */ |
1430 | inc_preempt_count(); | 1454 | if (!(uval & FUTEX_OWNER_DIED)) { |
1431 | uval = futex_atomic_cmpxchg_inatomic(uaddr, current->pid, 0); | 1455 | inc_preempt_count(); |
1432 | dec_preempt_count(); | 1456 | uval = futex_atomic_cmpxchg_inatomic(uaddr, current->pid, 0); |
1457 | dec_preempt_count(); | ||
1458 | } | ||
1433 | 1459 | ||
1434 | if (unlikely(uval == -EFAULT)) | 1460 | if (unlikely(uval == -EFAULT)) |
1435 | goto pi_faulted; | 1461 | goto pi_faulted; |
@@ -1462,9 +1488,11 @@ retry_locked: | |||
1462 | /* | 1488 | /* |
1463 | * No waiters - kernel unlocks the futex: | 1489 | * No waiters - kernel unlocks the futex: |
1464 | */ | 1490 | */ |
1465 | ret = unlock_futex_pi(uaddr, uval); | 1491 | if (!(uval & FUTEX_OWNER_DIED)) { |
1466 | if (ret == -EFAULT) | 1492 | ret = unlock_futex_pi(uaddr, uval); |
1467 | goto pi_faulted; | 1493 | if (ret == -EFAULT) |
1494 | goto pi_faulted; | ||
1495 | } | ||
1468 | 1496 | ||
1469 | out_unlock: | 1497 | out_unlock: |
1470 | spin_unlock(&hb->lock); | 1498 | spin_unlock(&hb->lock); |
@@ -1481,9 +1509,10 @@ pi_faulted: | |||
1481 | * still holding the mmap_sem. | 1509 | * still holding the mmap_sem. |
1482 | */ | 1510 | */ |
1483 | if (attempt++) { | 1511 | if (attempt++) { |
1484 | if (futex_handle_fault((unsigned long)uaddr, attempt)) | 1512 | if (futex_handle_fault((unsigned long)uaddr, attempt)) { |
1513 | ret = -EFAULT; | ||
1485 | goto out_unlock; | 1514 | goto out_unlock; |
1486 | 1515 | } | |
1487 | goto retry_locked; | 1516 | goto retry_locked; |
1488 | } | 1517 | } |
1489 | 1518 | ||
@@ -1683,9 +1712,9 @@ err_unlock: | |||
1683 | * Process a futex-list entry, check whether it's owned by the | 1712 | * Process a futex-list entry, check whether it's owned by the |
1684 | * dying task, and do notification if so: | 1713 | * dying task, and do notification if so: |
1685 | */ | 1714 | */ |
1686 | int handle_futex_death(u32 __user *uaddr, struct task_struct *curr) | 1715 | int handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi) |
1687 | { | 1716 | { |
1688 | u32 uval, nval; | 1717 | u32 uval, nval, mval; |
1689 | 1718 | ||
1690 | retry: | 1719 | retry: |
1691 | if (get_user(uval, uaddr)) | 1720 | if (get_user(uval, uaddr)) |
@@ -1702,21 +1731,45 @@ retry: | |||
1702 | * thread-death.) The rest of the cleanup is done in | 1731 | * thread-death.) The rest of the cleanup is done in |
1703 | * userspace. | 1732 | * userspace. |
1704 | */ | 1733 | */ |
1705 | nval = futex_atomic_cmpxchg_inatomic(uaddr, uval, | 1734 | mval = (uval & FUTEX_WAITERS) | FUTEX_OWNER_DIED; |
1706 | uval | FUTEX_OWNER_DIED); | 1735 | nval = futex_atomic_cmpxchg_inatomic(uaddr, uval, mval); |
1736 | |||
1707 | if (nval == -EFAULT) | 1737 | if (nval == -EFAULT) |
1708 | return -1; | 1738 | return -1; |
1709 | 1739 | ||
1710 | if (nval != uval) | 1740 | if (nval != uval) |
1711 | goto retry; | 1741 | goto retry; |
1712 | 1742 | ||
1713 | if (uval & FUTEX_WAITERS) | 1743 | /* |
1714 | futex_wake(uaddr, 1); | 1744 | * Wake robust non-PI futexes here. The wakeup of |
1745 | * PI futexes happens in exit_pi_state(): | ||
1746 | */ | ||
1747 | if (!pi) { | ||
1748 | if (uval & FUTEX_WAITERS) | ||
1749 | futex_wake(uaddr, 1); | ||
1750 | } | ||
1715 | } | 1751 | } |
1716 | return 0; | 1752 | return 0; |
1717 | } | 1753 | } |
1718 | 1754 | ||
1719 | /* | 1755 | /* |
1756 | * Fetch a robust-list pointer. Bit 0 signals PI futexes: | ||
1757 | */ | ||
1758 | static inline int fetch_robust_entry(struct robust_list __user **entry, | ||
1759 | struct robust_list __user **head, int *pi) | ||
1760 | { | ||
1761 | unsigned long uentry; | ||
1762 | |||
1763 | if (get_user(uentry, (unsigned long *)head)) | ||
1764 | return -EFAULT; | ||
1765 | |||
1766 | *entry = (void *)(uentry & ~1UL); | ||
1767 | *pi = uentry & 1; | ||
1768 | |||
1769 | return 0; | ||
1770 | } | ||
1771 | |||
1772 | /* | ||
1720 | * Walk curr->robust_list (very carefully, it's a userspace list!) | 1773 | * Walk curr->robust_list (very carefully, it's a userspace list!) |
1721 | * and mark any locks found there dead, and notify any waiters. | 1774 | * and mark any locks found there dead, and notify any waiters. |
1722 | * | 1775 | * |
@@ -1726,14 +1779,14 @@ void exit_robust_list(struct task_struct *curr) | |||
1726 | { | 1779 | { |
1727 | struct robust_list_head __user *head = curr->robust_list; | 1780 | struct robust_list_head __user *head = curr->robust_list; |
1728 | struct robust_list __user *entry, *pending; | 1781 | struct robust_list __user *entry, *pending; |
1729 | unsigned int limit = ROBUST_LIST_LIMIT; | 1782 | unsigned int limit = ROBUST_LIST_LIMIT, pi, pip; |
1730 | unsigned long futex_offset; | 1783 | unsigned long futex_offset; |
1731 | 1784 | ||
1732 | /* | 1785 | /* |
1733 | * Fetch the list head (which was registered earlier, via | 1786 | * Fetch the list head (which was registered earlier, via |
1734 | * sys_set_robust_list()): | 1787 | * sys_set_robust_list()): |
1735 | */ | 1788 | */ |
1736 | if (get_user(entry, &head->list.next)) | 1789 | if (fetch_robust_entry(&entry, &head->list.next, &pi)) |
1737 | return; | 1790 | return; |
1738 | /* | 1791 | /* |
1739 | * Fetch the relative futex offset: | 1792 | * Fetch the relative futex offset: |
@@ -1744,10 +1797,11 @@ void exit_robust_list(struct task_struct *curr) | |||
1744 | * Fetch any possibly pending lock-add first, and handle it | 1797 | * Fetch any possibly pending lock-add first, and handle it |
1745 | * if it exists: | 1798 | * if it exists: |
1746 | */ | 1799 | */ |
1747 | if (get_user(pending, &head->list_op_pending)) | 1800 | if (fetch_robust_entry(&pending, &head->list_op_pending, &pip)) |
1748 | return; | 1801 | return; |
1802 | |||
1749 | if (pending) | 1803 | if (pending) |
1750 | handle_futex_death((void *)pending + futex_offset, curr); | 1804 | handle_futex_death((void *)pending + futex_offset, curr, pip); |
1751 | 1805 | ||
1752 | while (entry != &head->list) { | 1806 | while (entry != &head->list) { |
1753 | /* | 1807 | /* |
@@ -1756,12 +1810,12 @@ void exit_robust_list(struct task_struct *curr) | |||
1756 | */ | 1810 | */ |
1757 | if (entry != pending) | 1811 | if (entry != pending) |
1758 | if (handle_futex_death((void *)entry + futex_offset, | 1812 | if (handle_futex_death((void *)entry + futex_offset, |
1759 | curr)) | 1813 | curr, pi)) |
1760 | return; | 1814 | return; |
1761 | /* | 1815 | /* |
1762 | * Fetch the next entry in the list: | 1816 | * Fetch the next entry in the list: |
1763 | */ | 1817 | */ |
1764 | if (get_user(entry, &entry->next)) | 1818 | if (fetch_robust_entry(&entry, &entry->next, &pi)) |
1765 | return; | 1819 | return; |
1766 | /* | 1820 | /* |
1767 | * Avoid excessively long or circular lists: | 1821 | * Avoid excessively long or circular lists: |
diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c index d1d92b441fb7..c5cca3f65cb7 100644 --- a/kernel/futex_compat.c +++ b/kernel/futex_compat.c | |||
@@ -12,6 +12,23 @@ | |||
12 | 12 | ||
13 | #include <asm/uaccess.h> | 13 | #include <asm/uaccess.h> |
14 | 14 | ||
15 | |||
16 | /* | ||
17 | * Fetch a robust-list pointer. Bit 0 signals PI futexes: | ||
18 | */ | ||
19 | static inline int | ||
20 | fetch_robust_entry(compat_uptr_t *uentry, struct robust_list __user **entry, | ||
21 | compat_uptr_t *head, int *pi) | ||
22 | { | ||
23 | if (get_user(*uentry, head)) | ||
24 | return -EFAULT; | ||
25 | |||
26 | *entry = compat_ptr((*uentry) & ~1); | ||
27 | *pi = (unsigned int)(*uentry) & 1; | ||
28 | |||
29 | return 0; | ||
30 | } | ||
31 | |||
15 | /* | 32 | /* |
16 | * Walk curr->robust_list (very carefully, it's a userspace list!) | 33 | * Walk curr->robust_list (very carefully, it's a userspace list!) |
17 | * and mark any locks found there dead, and notify any waiters. | 34 | * and mark any locks found there dead, and notify any waiters. |
@@ -22,17 +39,16 @@ void compat_exit_robust_list(struct task_struct *curr) | |||
22 | { | 39 | { |
23 | struct compat_robust_list_head __user *head = curr->compat_robust_list; | 40 | struct compat_robust_list_head __user *head = curr->compat_robust_list; |
24 | struct robust_list __user *entry, *pending; | 41 | struct robust_list __user *entry, *pending; |
42 | unsigned int limit = ROBUST_LIST_LIMIT, pi, pip; | ||
25 | compat_uptr_t uentry, upending; | 43 | compat_uptr_t uentry, upending; |
26 | unsigned int limit = ROBUST_LIST_LIMIT; | ||
27 | compat_long_t futex_offset; | 44 | compat_long_t futex_offset; |
28 | 45 | ||
29 | /* | 46 | /* |
30 | * Fetch the list head (which was registered earlier, via | 47 | * Fetch the list head (which was registered earlier, via |
31 | * sys_set_robust_list()): | 48 | * sys_set_robust_list()): |
32 | */ | 49 | */ |
33 | if (get_user(uentry, &head->list.next)) | 50 | if (fetch_robust_entry(&uentry, &entry, &head->list.next, &pi)) |
34 | return; | 51 | return; |
35 | entry = compat_ptr(uentry); | ||
36 | /* | 52 | /* |
37 | * Fetch the relative futex offset: | 53 | * Fetch the relative futex offset: |
38 | */ | 54 | */ |
@@ -42,11 +58,11 @@ void compat_exit_robust_list(struct task_struct *curr) | |||
42 | * Fetch any possibly pending lock-add first, and handle it | 58 | * Fetch any possibly pending lock-add first, and handle it |
43 | * if it exists: | 59 | * if it exists: |
44 | */ | 60 | */ |
45 | if (get_user(upending, &head->list_op_pending)) | 61 | if (fetch_robust_entry(&upending, &pending, |
62 | &head->list_op_pending, &pip)) | ||
46 | return; | 63 | return; |
47 | pending = compat_ptr(upending); | ||
48 | if (upending) | 64 | if (upending) |
49 | handle_futex_death((void *)pending + futex_offset, curr); | 65 | handle_futex_death((void *)pending + futex_offset, curr, pip); |
50 | 66 | ||
51 | while (compat_ptr(uentry) != &head->list) { | 67 | while (compat_ptr(uentry) != &head->list) { |
52 | /* | 68 | /* |
@@ -55,15 +71,15 @@ void compat_exit_robust_list(struct task_struct *curr) | |||
55 | */ | 71 | */ |
56 | if (entry != pending) | 72 | if (entry != pending) |
57 | if (handle_futex_death((void *)entry + futex_offset, | 73 | if (handle_futex_death((void *)entry + futex_offset, |
58 | curr)) | 74 | curr, pi)) |
59 | return; | 75 | return; |
60 | 76 | ||
61 | /* | 77 | /* |
62 | * Fetch the next entry in the list: | 78 | * Fetch the next entry in the list: |
63 | */ | 79 | */ |
64 | if (get_user(uentry, (compat_uptr_t *)&entry->next)) | 80 | if (fetch_robust_entry(&uentry, &entry, |
81 | (compat_uptr_t *)&entry->next, &pi)) | ||
65 | return; | 82 | return; |
66 | entry = compat_ptr(uentry); | ||
67 | /* | 83 | /* |
68 | * Avoid excessively long or circular lists: | 84 | * Avoid excessively long or circular lists: |
69 | */ | 85 | */ |
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index d17766d40dab..21c38a7e666b 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
@@ -187,7 +187,7 @@ switch_hrtimer_base(struct hrtimer *timer, struct hrtimer_base *base) | |||
187 | { | 187 | { |
188 | struct hrtimer_base *new_base; | 188 | struct hrtimer_base *new_base; |
189 | 189 | ||
190 | new_base = &__get_cpu_var(hrtimer_bases[base->index]); | 190 | new_base = &__get_cpu_var(hrtimer_bases)[base->index]; |
191 | 191 | ||
192 | if (base != new_base) { | 192 | if (base != new_base) { |
193 | /* | 193 | /* |
@@ -835,7 +835,7 @@ static void migrate_hrtimers(int cpu) | |||
835 | } | 835 | } |
836 | #endif /* CONFIG_HOTPLUG_CPU */ | 836 | #endif /* CONFIG_HOTPLUG_CPU */ |
837 | 837 | ||
838 | static int __devinit hrtimer_cpu_notify(struct notifier_block *self, | 838 | static int __cpuinit hrtimer_cpu_notify(struct notifier_block *self, |
839 | unsigned long action, void *hcpu) | 839 | unsigned long action, void *hcpu) |
840 | { | 840 | { |
841 | long cpu = (long)hcpu; | 841 | long cpu = (long)hcpu; |
@@ -859,7 +859,7 @@ static int __devinit hrtimer_cpu_notify(struct notifier_block *self, | |||
859 | return NOTIFY_OK; | 859 | return NOTIFY_OK; |
860 | } | 860 | } |
861 | 861 | ||
862 | static struct notifier_block __devinitdata hrtimers_nb = { | 862 | static struct notifier_block __cpuinitdata hrtimers_nb = { |
863 | .notifier_call = hrtimer_cpu_notify, | 863 | .notifier_call = hrtimer_cpu_notify, |
864 | }; | 864 | }; |
865 | 865 | ||
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 4e461438e48b..92be519eff26 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -137,16 +137,40 @@ EXPORT_SYMBOL(enable_irq); | |||
137 | * @irq: interrupt to control | 137 | * @irq: interrupt to control |
138 | * @on: enable/disable power management wakeup | 138 | * @on: enable/disable power management wakeup |
139 | * | 139 | * |
140 | * Enable/disable power management wakeup mode | 140 | * Enable/disable power management wakeup mode, which is |
141 | * disabled by default. Enables and disables must match, | ||
142 | * just as they match for non-wakeup mode support. | ||
143 | * | ||
144 | * Wakeup mode lets this IRQ wake the system from sleep | ||
145 | * states like "suspend to RAM". | ||
141 | */ | 146 | */ |
142 | int set_irq_wake(unsigned int irq, unsigned int on) | 147 | int set_irq_wake(unsigned int irq, unsigned int on) |
143 | { | 148 | { |
144 | struct irq_desc *desc = irq_desc + irq; | 149 | struct irq_desc *desc = irq_desc + irq; |
145 | unsigned long flags; | 150 | unsigned long flags; |
146 | int ret = -ENXIO; | 151 | int ret = -ENXIO; |
152 | int (*set_wake)(unsigned, unsigned) = desc->chip->set_wake; | ||
147 | 153 | ||
154 | /* wakeup-capable irqs can be shared between drivers that | ||
155 | * don't need to have the same sleep mode behaviors. | ||
156 | */ | ||
148 | spin_lock_irqsave(&desc->lock, flags); | 157 | spin_lock_irqsave(&desc->lock, flags); |
149 | if (desc->chip->set_wake) | 158 | if (on) { |
159 | if (desc->wake_depth++ == 0) | ||
160 | desc->status |= IRQ_WAKEUP; | ||
161 | else | ||
162 | set_wake = NULL; | ||
163 | } else { | ||
164 | if (desc->wake_depth == 0) { | ||
165 | printk(KERN_WARNING "Unbalanced IRQ %d " | ||
166 | "wake disable\n", irq); | ||
167 | WARN_ON(1); | ||
168 | } else if (--desc->wake_depth == 0) | ||
169 | desc->status &= ~IRQ_WAKEUP; | ||
170 | else | ||
171 | set_wake = NULL; | ||
172 | } | ||
173 | if (set_wake) | ||
150 | ret = desc->chip->set_wake(irq, on); | 174 | ret = desc->chip->set_wake(irq, on); |
151 | spin_unlock_irqrestore(&desc->lock, flags); | 175 | spin_unlock_irqrestore(&desc->lock, flags); |
152 | return ret; | 176 | return ret; |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 64aab081153b..3f57dfdc8f92 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -393,6 +393,7 @@ static int __kprobes add_new_kprobe(struct kprobe *old_p, struct kprobe *p) | |||
393 | static inline void add_aggr_kprobe(struct kprobe *ap, struct kprobe *p) | 393 | static inline void add_aggr_kprobe(struct kprobe *ap, struct kprobe *p) |
394 | { | 394 | { |
395 | copy_kprobe(p, ap); | 395 | copy_kprobe(p, ap); |
396 | flush_insn_slot(ap); | ||
396 | ap->addr = p->addr; | 397 | ap->addr = p->addr; |
397 | ap->pre_handler = aggr_pre_handler; | 398 | ap->pre_handler = aggr_pre_handler; |
398 | ap->fault_handler = aggr_fault_handler; | 399 | ap->fault_handler = aggr_fault_handler; |
diff --git a/kernel/panic.c b/kernel/panic.c index d8a0bca21233..9b8dcfd1ca93 100644 --- a/kernel/panic.c +++ b/kernel/panic.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/interrupt.h> | 18 | #include <linux/interrupt.h> |
19 | #include <linux/nmi.h> | 19 | #include <linux/nmi.h> |
20 | #include <linux/kexec.h> | 20 | #include <linux/kexec.h> |
21 | #include <linux/debug_locks.h> | ||
21 | 22 | ||
22 | int panic_on_oops; | 23 | int panic_on_oops; |
23 | int tainted; | 24 | int tainted; |
diff --git a/kernel/power/process.c b/kernel/power/process.c index b2a5f671d6cd..72e72d2c61e6 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c | |||
@@ -66,13 +66,25 @@ static inline void freeze_process(struct task_struct *p) | |||
66 | } | 66 | } |
67 | } | 67 | } |
68 | 68 | ||
69 | static void cancel_freezing(struct task_struct *p) | ||
70 | { | ||
71 | unsigned long flags; | ||
72 | |||
73 | if (freezing(p)) { | ||
74 | pr_debug(" clean up: %s\n", p->comm); | ||
75 | do_not_freeze(p); | ||
76 | spin_lock_irqsave(&p->sighand->siglock, flags); | ||
77 | recalc_sigpending_tsk(p); | ||
78 | spin_unlock_irqrestore(&p->sighand->siglock, flags); | ||
79 | } | ||
80 | } | ||
81 | |||
69 | /* 0 = success, else # of processes that we failed to stop */ | 82 | /* 0 = success, else # of processes that we failed to stop */ |
70 | int freeze_processes(void) | 83 | int freeze_processes(void) |
71 | { | 84 | { |
72 | int todo, nr_user, user_frozen; | 85 | int todo, nr_user, user_frozen; |
73 | unsigned long start_time; | 86 | unsigned long start_time; |
74 | struct task_struct *g, *p; | 87 | struct task_struct *g, *p; |
75 | unsigned long flags; | ||
76 | 88 | ||
77 | printk( "Stopping tasks: " ); | 89 | printk( "Stopping tasks: " ); |
78 | start_time = jiffies; | 90 | start_time = jiffies; |
@@ -85,6 +97,10 @@ int freeze_processes(void) | |||
85 | continue; | 97 | continue; |
86 | if (frozen(p)) | 98 | if (frozen(p)) |
87 | continue; | 99 | continue; |
100 | if (p->state == TASK_TRACED && frozen(p->parent)) { | ||
101 | cancel_freezing(p); | ||
102 | continue; | ||
103 | } | ||
88 | if (p->mm && !(p->flags & PF_BORROWED_MM)) { | 104 | if (p->mm && !(p->flags & PF_BORROWED_MM)) { |
89 | /* The task is a user-space one. | 105 | /* The task is a user-space one. |
90 | * Freeze it unless there's a vfork completion | 106 | * Freeze it unless there's a vfork completion |
@@ -126,13 +142,7 @@ int freeze_processes(void) | |||
126 | do_each_thread(g, p) { | 142 | do_each_thread(g, p) { |
127 | if (freezeable(p) && !frozen(p)) | 143 | if (freezeable(p) && !frozen(p)) |
128 | printk(KERN_ERR " %s\n", p->comm); | 144 | printk(KERN_ERR " %s\n", p->comm); |
129 | if (freezing(p)) { | 145 | cancel_freezing(p); |
130 | pr_debug(" clean up: %s\n", p->comm); | ||
131 | p->flags &= ~PF_FREEZE; | ||
132 | spin_lock_irqsave(&p->sighand->siglock, flags); | ||
133 | recalc_sigpending_tsk(p); | ||
134 | spin_unlock_irqrestore(&p->sighand->siglock, flags); | ||
135 | } | ||
136 | } while_each_thread(g, p); | 146 | } while_each_thread(g, p); |
137 | read_unlock(&tasklist_lock); | 147 | read_unlock(&tasklist_lock); |
138 | return todo; | 148 | return todo; |
diff --git a/kernel/printk.c b/kernel/printk.c index 65ca0688f86f..1149365e989e 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
@@ -799,6 +799,9 @@ void release_console_sem(void) | |||
799 | up(&secondary_console_sem); | 799 | up(&secondary_console_sem); |
800 | return; | 800 | return; |
801 | } | 801 | } |
802 | |||
803 | console_may_schedule = 0; | ||
804 | |||
802 | for ( ; ; ) { | 805 | for ( ; ; ) { |
803 | spin_lock_irqsave(&logbuf_lock, flags); | 806 | spin_lock_irqsave(&logbuf_lock, flags); |
804 | wake_klogd |= log_start - log_end; | 807 | wake_klogd |= log_start - log_end; |
@@ -812,7 +815,6 @@ void release_console_sem(void) | |||
812 | local_irq_restore(flags); | 815 | local_irq_restore(flags); |
813 | } | 816 | } |
814 | console_locked = 0; | 817 | console_locked = 0; |
815 | console_may_schedule = 0; | ||
816 | up(&console_sem); | 818 | up(&console_sem); |
817 | spin_unlock_irqrestore(&logbuf_lock, flags); | 819 | spin_unlock_irqrestore(&logbuf_lock, flags); |
818 | if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait)) { | 820 | if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait)) { |
diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index 759805c9859a..436ab35f6fa7 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c | |||
@@ -548,7 +548,7 @@ static void __devinit rcu_online_cpu(int cpu) | |||
548 | tasklet_init(&per_cpu(rcu_tasklet, cpu), rcu_process_callbacks, 0UL); | 548 | tasklet_init(&per_cpu(rcu_tasklet, cpu), rcu_process_callbacks, 0UL); |
549 | } | 549 | } |
550 | 550 | ||
551 | static int __devinit rcu_cpu_notify(struct notifier_block *self, | 551 | static int __cpuinit rcu_cpu_notify(struct notifier_block *self, |
552 | unsigned long action, void *hcpu) | 552 | unsigned long action, void *hcpu) |
553 | { | 553 | { |
554 | long cpu = (long)hcpu; | 554 | long cpu = (long)hcpu; |
@@ -565,7 +565,7 @@ static int __devinit rcu_cpu_notify(struct notifier_block *self, | |||
565 | return NOTIFY_OK; | 565 | return NOTIFY_OK; |
566 | } | 566 | } |
567 | 567 | ||
568 | static struct notifier_block __devinitdata rcu_nb = { | 568 | static struct notifier_block __cpuinitdata rcu_nb = { |
569 | .notifier_call = rcu_cpu_notify, | 569 | .notifier_call = rcu_cpu_notify, |
570 | }; | 570 | }; |
571 | 571 | ||
diff --git a/kernel/resource.c b/kernel/resource.c index 0dd3a857579e..46286434af80 100644 --- a/kernel/resource.c +++ b/kernel/resource.c | |||
@@ -244,6 +244,7 @@ int find_next_system_ram(struct resource *res) | |||
244 | 244 | ||
245 | start = res->start; | 245 | start = res->start; |
246 | end = res->end; | 246 | end = res->end; |
247 | BUG_ON(start >= end); | ||
247 | 248 | ||
248 | read_lock(&resource_lock); | 249 | read_lock(&resource_lock); |
249 | for (p = iomem_resource.child; p ; p = p->sibling) { | 250 | for (p = iomem_resource.child; p ; p = p->sibling) { |
@@ -254,15 +255,17 @@ int find_next_system_ram(struct resource *res) | |||
254 | p = NULL; | 255 | p = NULL; |
255 | break; | 256 | break; |
256 | } | 257 | } |
257 | if (p->start >= start) | 258 | if ((p->end >= start) && (p->start < end)) |
258 | break; | 259 | break; |
259 | } | 260 | } |
260 | read_unlock(&resource_lock); | 261 | read_unlock(&resource_lock); |
261 | if (!p) | 262 | if (!p) |
262 | return -1; | 263 | return -1; |
263 | /* copy data */ | 264 | /* copy data */ |
264 | res->start = p->start; | 265 | if (res->start < p->start) |
265 | res->end = p->end; | 266 | res->start = p->start; |
267 | if (res->end > p->end) | ||
268 | res->end = p->end; | ||
266 | return 0; | 269 | return 0; |
267 | } | 270 | } |
268 | #endif | 271 | #endif |
diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c index d2ef13b485e7..3e13a1e5856f 100644 --- a/kernel/rtmutex.c +++ b/kernel/rtmutex.c | |||
@@ -7,6 +7,8 @@ | |||
7 | * Copyright (C) 2005-2006 Timesys Corp., Thomas Gleixner <tglx@timesys.com> | 7 | * Copyright (C) 2005-2006 Timesys Corp., Thomas Gleixner <tglx@timesys.com> |
8 | * Copyright (C) 2005 Kihon Technologies Inc., Steven Rostedt | 8 | * Copyright (C) 2005 Kihon Technologies Inc., Steven Rostedt |
9 | * Copyright (C) 2006 Esben Nielsen | 9 | * Copyright (C) 2006 Esben Nielsen |
10 | * | ||
11 | * See Documentation/rt-mutex-design.txt for details. | ||
10 | */ | 12 | */ |
11 | #include <linux/spinlock.h> | 13 | #include <linux/spinlock.h> |
12 | #include <linux/module.h> | 14 | #include <linux/module.h> |
diff --git a/kernel/sched.c b/kernel/sched.c index b44b9a43b0fc..a2be2d055299 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -4456,9 +4456,9 @@ asmlinkage long sys_sched_yield(void) | |||
4456 | return 0; | 4456 | return 0; |
4457 | } | 4457 | } |
4458 | 4458 | ||
4459 | static inline int __resched_legal(void) | 4459 | static inline int __resched_legal(int expected_preempt_count) |
4460 | { | 4460 | { |
4461 | if (unlikely(preempt_count())) | 4461 | if (unlikely(preempt_count() != expected_preempt_count)) |
4462 | return 0; | 4462 | return 0; |
4463 | if (unlikely(system_state != SYSTEM_RUNNING)) | 4463 | if (unlikely(system_state != SYSTEM_RUNNING)) |
4464 | return 0; | 4464 | return 0; |
@@ -4484,7 +4484,7 @@ static void __cond_resched(void) | |||
4484 | 4484 | ||
4485 | int __sched cond_resched(void) | 4485 | int __sched cond_resched(void) |
4486 | { | 4486 | { |
4487 | if (need_resched() && __resched_legal()) { | 4487 | if (need_resched() && __resched_legal(0)) { |
4488 | __cond_resched(); | 4488 | __cond_resched(); |
4489 | return 1; | 4489 | return 1; |
4490 | } | 4490 | } |
@@ -4510,7 +4510,7 @@ int cond_resched_lock(spinlock_t *lock) | |||
4510 | ret = 1; | 4510 | ret = 1; |
4511 | spin_lock(lock); | 4511 | spin_lock(lock); |
4512 | } | 4512 | } |
4513 | if (need_resched() && __resched_legal()) { | 4513 | if (need_resched() && __resched_legal(1)) { |
4514 | spin_release(&lock->dep_map, 1, _THIS_IP_); | 4514 | spin_release(&lock->dep_map, 1, _THIS_IP_); |
4515 | _raw_spin_unlock(lock); | 4515 | _raw_spin_unlock(lock); |
4516 | preempt_enable_no_resched(); | 4516 | preempt_enable_no_resched(); |
@@ -4526,7 +4526,7 @@ int __sched cond_resched_softirq(void) | |||
4526 | { | 4526 | { |
4527 | BUG_ON(!in_softirq()); | 4527 | BUG_ON(!in_softirq()); |
4528 | 4528 | ||
4529 | if (need_resched() && __resched_legal()) { | 4529 | if (need_resched() && __resched_legal(0)) { |
4530 | raw_local_irq_disable(); | 4530 | raw_local_irq_disable(); |
4531 | _local_bh_enable(); | 4531 | _local_bh_enable(); |
4532 | raw_local_irq_enable(); | 4532 | raw_local_irq_enable(); |
@@ -6494,7 +6494,12 @@ static int build_sched_domains(const cpumask_t *cpu_map) | |||
6494 | for (i = 0; i < MAX_NUMNODES; i++) | 6494 | for (i = 0; i < MAX_NUMNODES; i++) |
6495 | init_numa_sched_groups_power(sched_group_nodes[i]); | 6495 | init_numa_sched_groups_power(sched_group_nodes[i]); |
6496 | 6496 | ||
6497 | init_numa_sched_groups_power(sched_group_allnodes); | 6497 | if (sched_group_allnodes) { |
6498 | int group = cpu_to_allnodes_group(first_cpu(*cpu_map)); | ||
6499 | struct sched_group *sg = &sched_group_allnodes[group]; | ||
6500 | |||
6501 | init_numa_sched_groups_power(sg); | ||
6502 | } | ||
6498 | #endif | 6503 | #endif |
6499 | 6504 | ||
6500 | /* Attach the domains */ | 6505 | /* Attach the domains */ |
@@ -6761,6 +6766,11 @@ void __init sched_init(void) | |||
6761 | } | 6766 | } |
6762 | 6767 | ||
6763 | set_load_weight(&init_task); | 6768 | set_load_weight(&init_task); |
6769 | |||
6770 | #ifdef CONFIG_RT_MUTEXES | ||
6771 | plist_head_init(&init_task.pi_waiters, &init_task.pi_lock); | ||
6772 | #endif | ||
6773 | |||
6764 | /* | 6774 | /* |
6765 | * The boot idle thread does lazy MMU switching as well: | 6775 | * The boot idle thread does lazy MMU switching as well: |
6766 | */ | 6776 | */ |
diff --git a/kernel/signal.c b/kernel/signal.c index 7fe874d12fae..bfdb5686fa3e 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -791,22 +791,31 @@ out: | |||
791 | /* | 791 | /* |
792 | * Force a signal that the process can't ignore: if necessary | 792 | * Force a signal that the process can't ignore: if necessary |
793 | * we unblock the signal and change any SIG_IGN to SIG_DFL. | 793 | * we unblock the signal and change any SIG_IGN to SIG_DFL. |
794 | * | ||
795 | * Note: If we unblock the signal, we always reset it to SIG_DFL, | ||
796 | * since we do not want to have a signal handler that was blocked | ||
797 | * be invoked when user space had explicitly blocked it. | ||
798 | * | ||
799 | * We don't want to have recursive SIGSEGV's etc, for example. | ||
794 | */ | 800 | */ |
795 | |||
796 | int | 801 | int |
797 | force_sig_info(int sig, struct siginfo *info, struct task_struct *t) | 802 | force_sig_info(int sig, struct siginfo *info, struct task_struct *t) |
798 | { | 803 | { |
799 | unsigned long int flags; | 804 | unsigned long int flags; |
800 | int ret; | 805 | int ret, blocked, ignored; |
806 | struct k_sigaction *action; | ||
801 | 807 | ||
802 | spin_lock_irqsave(&t->sighand->siglock, flags); | 808 | spin_lock_irqsave(&t->sighand->siglock, flags); |
803 | if (t->sighand->action[sig-1].sa.sa_handler == SIG_IGN) { | 809 | action = &t->sighand->action[sig-1]; |
804 | t->sighand->action[sig-1].sa.sa_handler = SIG_DFL; | 810 | ignored = action->sa.sa_handler == SIG_IGN; |
805 | } | 811 | blocked = sigismember(&t->blocked, sig); |
806 | if (sigismember(&t->blocked, sig)) { | 812 | if (blocked || ignored) { |
807 | sigdelset(&t->blocked, sig); | 813 | action->sa.sa_handler = SIG_DFL; |
814 | if (blocked) { | ||
815 | sigdelset(&t->blocked, sig); | ||
816 | recalc_sigpending_tsk(t); | ||
817 | } | ||
808 | } | 818 | } |
809 | recalc_sigpending_tsk(t); | ||
810 | ret = specific_send_sig_info(sig, info, t); | 819 | ret = specific_send_sig_info(sig, info, t); |
811 | spin_unlock_irqrestore(&t->sighand->siglock, flags); | 820 | spin_unlock_irqrestore(&t->sighand->siglock, flags); |
812 | 821 | ||
diff --git a/kernel/softirq.c b/kernel/softirq.c index 0f08a84ae307..3789ca98197c 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
@@ -65,6 +65,7 @@ static inline void wakeup_softirqd(void) | |||
65 | * This one is for softirq.c-internal use, | 65 | * This one is for softirq.c-internal use, |
66 | * where hardirqs are disabled legitimately: | 66 | * where hardirqs are disabled legitimately: |
67 | */ | 67 | */ |
68 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
68 | static void __local_bh_disable(unsigned long ip) | 69 | static void __local_bh_disable(unsigned long ip) |
69 | { | 70 | { |
70 | unsigned long flags; | 71 | unsigned long flags; |
@@ -80,6 +81,13 @@ static void __local_bh_disable(unsigned long ip) | |||
80 | trace_softirqs_off(ip); | 81 | trace_softirqs_off(ip); |
81 | raw_local_irq_restore(flags); | 82 | raw_local_irq_restore(flags); |
82 | } | 83 | } |
84 | #else /* !CONFIG_TRACE_IRQFLAGS */ | ||
85 | static inline void __local_bh_disable(unsigned long ip) | ||
86 | { | ||
87 | add_preempt_count(SOFTIRQ_OFFSET); | ||
88 | barrier(); | ||
89 | } | ||
90 | #endif /* CONFIG_TRACE_IRQFLAGS */ | ||
83 | 91 | ||
84 | void local_bh_disable(void) | 92 | void local_bh_disable(void) |
85 | { | 93 | { |
@@ -121,12 +129,16 @@ EXPORT_SYMBOL(_local_bh_enable); | |||
121 | 129 | ||
122 | void local_bh_enable(void) | 130 | void local_bh_enable(void) |
123 | { | 131 | { |
132 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
124 | unsigned long flags; | 133 | unsigned long flags; |
125 | 134 | ||
126 | WARN_ON_ONCE(in_irq()); | 135 | WARN_ON_ONCE(in_irq()); |
136 | #endif | ||
127 | WARN_ON_ONCE(irqs_disabled()); | 137 | WARN_ON_ONCE(irqs_disabled()); |
128 | 138 | ||
139 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
129 | local_irq_save(flags); | 140 | local_irq_save(flags); |
141 | #endif | ||
130 | /* | 142 | /* |
131 | * Are softirqs going to be turned on now: | 143 | * Are softirqs going to be turned on now: |
132 | */ | 144 | */ |
@@ -142,18 +154,22 @@ void local_bh_enable(void) | |||
142 | do_softirq(); | 154 | do_softirq(); |
143 | 155 | ||
144 | dec_preempt_count(); | 156 | dec_preempt_count(); |
157 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
145 | local_irq_restore(flags); | 158 | local_irq_restore(flags); |
159 | #endif | ||
146 | preempt_check_resched(); | 160 | preempt_check_resched(); |
147 | } | 161 | } |
148 | EXPORT_SYMBOL(local_bh_enable); | 162 | EXPORT_SYMBOL(local_bh_enable); |
149 | 163 | ||
150 | void local_bh_enable_ip(unsigned long ip) | 164 | void local_bh_enable_ip(unsigned long ip) |
151 | { | 165 | { |
166 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
152 | unsigned long flags; | 167 | unsigned long flags; |
153 | 168 | ||
154 | WARN_ON_ONCE(in_irq()); | 169 | WARN_ON_ONCE(in_irq()); |
155 | 170 | ||
156 | local_irq_save(flags); | 171 | local_irq_save(flags); |
172 | #endif | ||
157 | /* | 173 | /* |
158 | * Are softirqs going to be turned on now: | 174 | * Are softirqs going to be turned on now: |
159 | */ | 175 | */ |
@@ -169,7 +185,9 @@ void local_bh_enable_ip(unsigned long ip) | |||
169 | do_softirq(); | 185 | do_softirq(); |
170 | 186 | ||
171 | dec_preempt_count(); | 187 | dec_preempt_count(); |
188 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
172 | local_irq_restore(flags); | 189 | local_irq_restore(flags); |
190 | #endif | ||
173 | preempt_check_resched(); | 191 | preempt_check_resched(); |
174 | } | 192 | } |
175 | EXPORT_SYMBOL(local_bh_enable_ip); | 193 | EXPORT_SYMBOL(local_bh_enable_ip); |
@@ -547,7 +565,7 @@ static void takeover_tasklets(unsigned int cpu) | |||
547 | } | 565 | } |
548 | #endif /* CONFIG_HOTPLUG_CPU */ | 566 | #endif /* CONFIG_HOTPLUG_CPU */ |
549 | 567 | ||
550 | static int __devinit cpu_callback(struct notifier_block *nfb, | 568 | static int __cpuinit cpu_callback(struct notifier_block *nfb, |
551 | unsigned long action, | 569 | unsigned long action, |
552 | void *hcpu) | 570 | void *hcpu) |
553 | { | 571 | { |
@@ -587,7 +605,7 @@ static int __devinit cpu_callback(struct notifier_block *nfb, | |||
587 | return NOTIFY_OK; | 605 | return NOTIFY_OK; |
588 | } | 606 | } |
589 | 607 | ||
590 | static struct notifier_block __devinitdata cpu_nfb = { | 608 | static struct notifier_block __cpuinitdata cpu_nfb = { |
591 | .notifier_call = cpu_callback | 609 | .notifier_call = cpu_callback |
592 | }; | 610 | }; |
593 | 611 | ||
diff --git a/kernel/softlockup.c b/kernel/softlockup.c index 6b76caa22981..03e6a2b0b787 100644 --- a/kernel/softlockup.c +++ b/kernel/softlockup.c | |||
@@ -104,7 +104,7 @@ static int watchdog(void * __bind_cpu) | |||
104 | /* | 104 | /* |
105 | * Create/destroy watchdog threads as CPUs come and go: | 105 | * Create/destroy watchdog threads as CPUs come and go: |
106 | */ | 106 | */ |
107 | static int __devinit | 107 | static int __cpuinit |
108 | cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) | 108 | cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) |
109 | { | 109 | { |
110 | int hotcpu = (unsigned long)hcpu; | 110 | int hotcpu = (unsigned long)hcpu; |
@@ -142,7 +142,7 @@ cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) | |||
142 | return NOTIFY_OK; | 142 | return NOTIFY_OK; |
143 | } | 143 | } |
144 | 144 | ||
145 | static struct notifier_block __devinitdata cpu_nfb = { | 145 | static struct notifier_block __cpuinitdata cpu_nfb = { |
146 | .notifier_call = cpu_callback | 146 | .notifier_call = cpu_callback |
147 | }; | 147 | }; |
148 | 148 | ||
diff --git a/kernel/taskstats.c b/kernel/taskstats.c index f45179ce028e..e78187657330 100644 --- a/kernel/taskstats.c +++ b/kernel/taskstats.c | |||
@@ -121,46 +121,45 @@ static int send_reply(struct sk_buff *skb, pid_t pid) | |||
121 | /* | 121 | /* |
122 | * Send taskstats data in @skb to listeners registered for @cpu's exit data | 122 | * Send taskstats data in @skb to listeners registered for @cpu's exit data |
123 | */ | 123 | */ |
124 | static int send_cpu_listeners(struct sk_buff *skb, unsigned int cpu) | 124 | static void send_cpu_listeners(struct sk_buff *skb, unsigned int cpu) |
125 | { | 125 | { |
126 | struct genlmsghdr *genlhdr = nlmsg_data((struct nlmsghdr *)skb->data); | 126 | struct genlmsghdr *genlhdr = nlmsg_data((struct nlmsghdr *)skb->data); |
127 | struct listener_list *listeners; | 127 | struct listener_list *listeners; |
128 | struct listener *s, *tmp; | 128 | struct listener *s, *tmp; |
129 | struct sk_buff *skb_next, *skb_cur = skb; | 129 | struct sk_buff *skb_next, *skb_cur = skb; |
130 | void *reply = genlmsg_data(genlhdr); | 130 | void *reply = genlmsg_data(genlhdr); |
131 | int rc, ret, delcount = 0; | 131 | int rc, delcount = 0; |
132 | 132 | ||
133 | rc = genlmsg_end(skb, reply); | 133 | rc = genlmsg_end(skb, reply); |
134 | if (rc < 0) { | 134 | if (rc < 0) { |
135 | nlmsg_free(skb); | 135 | nlmsg_free(skb); |
136 | return rc; | 136 | return; |
137 | } | 137 | } |
138 | 138 | ||
139 | rc = 0; | 139 | rc = 0; |
140 | listeners = &per_cpu(listener_array, cpu); | 140 | listeners = &per_cpu(listener_array, cpu); |
141 | down_read(&listeners->sem); | 141 | down_read(&listeners->sem); |
142 | list_for_each_entry_safe(s, tmp, &listeners->list, list) { | 142 | list_for_each_entry(s, &listeners->list, list) { |
143 | skb_next = NULL; | 143 | skb_next = NULL; |
144 | if (!list_is_last(&s->list, &listeners->list)) { | 144 | if (!list_is_last(&s->list, &listeners->list)) { |
145 | skb_next = skb_clone(skb_cur, GFP_KERNEL); | 145 | skb_next = skb_clone(skb_cur, GFP_KERNEL); |
146 | if (!skb_next) { | 146 | if (!skb_next) |
147 | nlmsg_free(skb_cur); | ||
148 | rc = -ENOMEM; | ||
149 | break; | 147 | break; |
150 | } | ||
151 | } | 148 | } |
152 | ret = genlmsg_unicast(skb_cur, s->pid); | 149 | rc = genlmsg_unicast(skb_cur, s->pid); |
153 | if (ret == -ECONNREFUSED) { | 150 | if (rc == -ECONNREFUSED) { |
154 | s->valid = 0; | 151 | s->valid = 0; |
155 | delcount++; | 152 | delcount++; |
156 | rc = ret; | ||
157 | } | 153 | } |
158 | skb_cur = skb_next; | 154 | skb_cur = skb_next; |
159 | } | 155 | } |
160 | up_read(&listeners->sem); | 156 | up_read(&listeners->sem); |
161 | 157 | ||
158 | if (skb_cur) | ||
159 | nlmsg_free(skb_cur); | ||
160 | |||
162 | if (!delcount) | 161 | if (!delcount) |
163 | return rc; | 162 | return; |
164 | 163 | ||
165 | /* Delete invalidated entries */ | 164 | /* Delete invalidated entries */ |
166 | down_write(&listeners->sem); | 165 | down_write(&listeners->sem); |
@@ -171,13 +170,12 @@ static int send_cpu_listeners(struct sk_buff *skb, unsigned int cpu) | |||
171 | } | 170 | } |
172 | } | 171 | } |
173 | up_write(&listeners->sem); | 172 | up_write(&listeners->sem); |
174 | return rc; | ||
175 | } | 173 | } |
176 | 174 | ||
177 | static int fill_pid(pid_t pid, struct task_struct *pidtsk, | 175 | static int fill_pid(pid_t pid, struct task_struct *pidtsk, |
178 | struct taskstats *stats) | 176 | struct taskstats *stats) |
179 | { | 177 | { |
180 | int rc; | 178 | int rc = 0; |
181 | struct task_struct *tsk = pidtsk; | 179 | struct task_struct *tsk = pidtsk; |
182 | 180 | ||
183 | if (!pidtsk) { | 181 | if (!pidtsk) { |
@@ -196,12 +194,10 @@ static int fill_pid(pid_t pid, struct task_struct *pidtsk, | |||
196 | * Each accounting subsystem adds calls to its functions to | 194 | * Each accounting subsystem adds calls to its functions to |
197 | * fill in relevant parts of struct taskstsats as follows | 195 | * fill in relevant parts of struct taskstsats as follows |
198 | * | 196 | * |
199 | * rc = per-task-foo(stats, tsk); | 197 | * per-task-foo(stats, tsk); |
200 | * if (rc) | ||
201 | * goto err; | ||
202 | */ | 198 | */ |
203 | 199 | ||
204 | rc = delayacct_add_tsk(stats, tsk); | 200 | delayacct_add_tsk(stats, tsk); |
205 | stats->version = TASKSTATS_VERSION; | 201 | stats->version = TASKSTATS_VERSION; |
206 | 202 | ||
207 | /* Define err: label here if needed */ | 203 | /* Define err: label here if needed */ |
diff --git a/kernel/timer.c b/kernel/timer.c index 05809c2e2fd6..1d7dd6267c2d 100644 --- a/kernel/timer.c +++ b/kernel/timer.c | |||
@@ -84,7 +84,7 @@ typedef struct tvec_t_base_s tvec_base_t; | |||
84 | 84 | ||
85 | tvec_base_t boot_tvec_bases; | 85 | tvec_base_t boot_tvec_bases; |
86 | EXPORT_SYMBOL(boot_tvec_bases); | 86 | EXPORT_SYMBOL(boot_tvec_bases); |
87 | static DEFINE_PER_CPU(tvec_base_t *, tvec_bases) = { &boot_tvec_bases }; | 87 | static DEFINE_PER_CPU(tvec_base_t *, tvec_bases) = &boot_tvec_bases; |
88 | 88 | ||
89 | static inline void set_running_timer(tvec_base_t *base, | 89 | static inline void set_running_timer(tvec_base_t *base, |
90 | struct timer_list *timer) | 90 | struct timer_list *timer) |
@@ -408,7 +408,7 @@ static int cascade(tvec_base_t *base, tvec_t *tv, int index) | |||
408 | * This function cascades all vectors and executes all expired timer | 408 | * This function cascades all vectors and executes all expired timer |
409 | * vectors. | 409 | * vectors. |
410 | */ | 410 | */ |
411 | #define INDEX(N) (base->timer_jiffies >> (TVR_BITS + N * TVN_BITS)) & TVN_MASK | 411 | #define INDEX(N) ((base->timer_jiffies >> (TVR_BITS + (N) * TVN_BITS)) & TVN_MASK) |
412 | 412 | ||
413 | static inline void __run_timers(tvec_base_t *base) | 413 | static inline void __run_timers(tvec_base_t *base) |
414 | { | 414 | { |
@@ -1324,46 +1324,19 @@ asmlinkage long sys_getpid(void) | |||
1324 | } | 1324 | } |
1325 | 1325 | ||
1326 | /* | 1326 | /* |
1327 | * Accessing ->group_leader->real_parent is not SMP-safe, it could | 1327 | * Accessing ->real_parent is not SMP-safe, it could |
1328 | * change from under us. However, rather than getting any lock | 1328 | * change from under us. However, we can use a stale |
1329 | * we can use an optimistic algorithm: get the parent | 1329 | * value of ->real_parent under rcu_read_lock(), see |
1330 | * pid, and go back and check that the parent is still | 1330 | * release_task()->call_rcu(delayed_put_task_struct). |
1331 | * the same. If it has changed (which is extremely unlikely | ||
1332 | * indeed), we just try again.. | ||
1333 | * | ||
1334 | * NOTE! This depends on the fact that even if we _do_ | ||
1335 | * get an old value of "parent", we can happily dereference | ||
1336 | * the pointer (it was and remains a dereferencable kernel pointer | ||
1337 | * no matter what): we just can't necessarily trust the result | ||
1338 | * until we know that the parent pointer is valid. | ||
1339 | * | ||
1340 | * NOTE2: ->group_leader never changes from under us. | ||
1341 | */ | 1331 | */ |
1342 | asmlinkage long sys_getppid(void) | 1332 | asmlinkage long sys_getppid(void) |
1343 | { | 1333 | { |
1344 | int pid; | 1334 | int pid; |
1345 | struct task_struct *me = current; | ||
1346 | struct task_struct *parent; | ||
1347 | 1335 | ||
1348 | parent = me->group_leader->real_parent; | 1336 | rcu_read_lock(); |
1349 | for (;;) { | 1337 | pid = rcu_dereference(current->real_parent)->tgid; |
1350 | pid = parent->tgid; | 1338 | rcu_read_unlock(); |
1351 | #if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT) | ||
1352 | { | ||
1353 | struct task_struct *old = parent; | ||
1354 | 1339 | ||
1355 | /* | ||
1356 | * Make sure we read the pid before re-reading the | ||
1357 | * parent pointer: | ||
1358 | */ | ||
1359 | smp_rmb(); | ||
1360 | parent = me->group_leader->real_parent; | ||
1361 | if (old != parent) | ||
1362 | continue; | ||
1363 | } | ||
1364 | #endif | ||
1365 | break; | ||
1366 | } | ||
1367 | return pid; | 1340 | return pid; |
1368 | } | 1341 | } |
1369 | 1342 | ||
@@ -1688,7 +1661,7 @@ static void __devinit migrate_timers(int cpu) | |||
1688 | } | 1661 | } |
1689 | #endif /* CONFIG_HOTPLUG_CPU */ | 1662 | #endif /* CONFIG_HOTPLUG_CPU */ |
1690 | 1663 | ||
1691 | static int __devinit timer_cpu_notify(struct notifier_block *self, | 1664 | static int __cpuinit timer_cpu_notify(struct notifier_block *self, |
1692 | unsigned long action, void *hcpu) | 1665 | unsigned long action, void *hcpu) |
1693 | { | 1666 | { |
1694 | long cpu = (long)hcpu; | 1667 | long cpu = (long)hcpu; |
@@ -1708,7 +1681,7 @@ static int __devinit timer_cpu_notify(struct notifier_block *self, | |||
1708 | return NOTIFY_OK; | 1681 | return NOTIFY_OK; |
1709 | } | 1682 | } |
1710 | 1683 | ||
1711 | static struct notifier_block __devinitdata timers_nb = { | 1684 | static struct notifier_block __cpuinitdata timers_nb = { |
1712 | .notifier_call = timer_cpu_notify, | 1685 | .notifier_call = timer_cpu_notify, |
1713 | }; | 1686 | }; |
1714 | 1687 | ||
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index eebb1d839235..835fe28b87a8 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
@@ -68,7 +68,7 @@ struct workqueue_struct { | |||
68 | 68 | ||
69 | /* All the per-cpu workqueues on the system, for hotplug cpu to add/remove | 69 | /* All the per-cpu workqueues on the system, for hotplug cpu to add/remove |
70 | threads to each one as cpus come/go. */ | 70 | threads to each one as cpus come/go. */ |
71 | static DEFINE_SPINLOCK(workqueue_lock); | 71 | static DEFINE_MUTEX(workqueue_mutex); |
72 | static LIST_HEAD(workqueues); | 72 | static LIST_HEAD(workqueues); |
73 | 73 | ||
74 | static int singlethread_cpu; | 74 | static int singlethread_cpu; |
@@ -93,9 +93,12 @@ static void __queue_work(struct cpu_workqueue_struct *cwq, | |||
93 | spin_unlock_irqrestore(&cwq->lock, flags); | 93 | spin_unlock_irqrestore(&cwq->lock, flags); |
94 | } | 94 | } |
95 | 95 | ||
96 | /* | 96 | /** |
97 | * Queue work on a workqueue. Return non-zero if it was successfully | 97 | * queue_work - queue work on a workqueue |
98 | * added. | 98 | * @wq: workqueue to use |
99 | * @work: work to queue | ||
100 | * | ||
101 | * Returns non-zero if it was successfully added. | ||
99 | * | 102 | * |
100 | * We queue the work to the CPU it was submitted, but there is no | 103 | * We queue the work to the CPU it was submitted, but there is no |
101 | * guarantee that it will be processed by that CPU. | 104 | * guarantee that it will be processed by that CPU. |
@@ -128,6 +131,14 @@ static void delayed_work_timer_fn(unsigned long __data) | |||
128 | __queue_work(per_cpu_ptr(wq->cpu_wq, cpu), work); | 131 | __queue_work(per_cpu_ptr(wq->cpu_wq, cpu), work); |
129 | } | 132 | } |
130 | 133 | ||
134 | /** | ||
135 | * queue_delayed_work - queue work on a workqueue after delay | ||
136 | * @wq: workqueue to use | ||
137 | * @work: work to queue | ||
138 | * @delay: number of jiffies to wait before queueing | ||
139 | * | ||
140 | * Returns non-zero if it was successfully added. | ||
141 | */ | ||
131 | int fastcall queue_delayed_work(struct workqueue_struct *wq, | 142 | int fastcall queue_delayed_work(struct workqueue_struct *wq, |
132 | struct work_struct *work, unsigned long delay) | 143 | struct work_struct *work, unsigned long delay) |
133 | { | 144 | { |
@@ -150,6 +161,15 @@ int fastcall queue_delayed_work(struct workqueue_struct *wq, | |||
150 | } | 161 | } |
151 | EXPORT_SYMBOL_GPL(queue_delayed_work); | 162 | EXPORT_SYMBOL_GPL(queue_delayed_work); |
152 | 163 | ||
164 | /** | ||
165 | * queue_delayed_work_on - queue work on specific CPU after delay | ||
166 | * @cpu: CPU number to execute work on | ||
167 | * @wq: workqueue to use | ||
168 | * @work: work to queue | ||
169 | * @delay: number of jiffies to wait before queueing | ||
170 | * | ||
171 | * Returns non-zero if it was successfully added. | ||
172 | */ | ||
153 | int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, | 173 | int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, |
154 | struct work_struct *work, unsigned long delay) | 174 | struct work_struct *work, unsigned long delay) |
155 | { | 175 | { |
@@ -275,8 +295,9 @@ static void flush_cpu_workqueue(struct cpu_workqueue_struct *cwq) | |||
275 | } | 295 | } |
276 | } | 296 | } |
277 | 297 | ||
278 | /* | 298 | /** |
279 | * flush_workqueue - ensure that any scheduled work has run to completion. | 299 | * flush_workqueue - ensure that any scheduled work has run to completion. |
300 | * @wq: workqueue to flush | ||
280 | * | 301 | * |
281 | * Forces execution of the workqueue and blocks until its completion. | 302 | * Forces execution of the workqueue and blocks until its completion. |
282 | * This is typically used in driver shutdown handlers. | 303 | * This is typically used in driver shutdown handlers. |
@@ -299,10 +320,10 @@ void fastcall flush_workqueue(struct workqueue_struct *wq) | |||
299 | } else { | 320 | } else { |
300 | int cpu; | 321 | int cpu; |
301 | 322 | ||
302 | lock_cpu_hotplug(); | 323 | mutex_lock(&workqueue_mutex); |
303 | for_each_online_cpu(cpu) | 324 | for_each_online_cpu(cpu) |
304 | flush_cpu_workqueue(per_cpu_ptr(wq->cpu_wq, cpu)); | 325 | flush_cpu_workqueue(per_cpu_ptr(wq->cpu_wq, cpu)); |
305 | unlock_cpu_hotplug(); | 326 | mutex_unlock(&workqueue_mutex); |
306 | } | 327 | } |
307 | } | 328 | } |
308 | EXPORT_SYMBOL_GPL(flush_workqueue); | 329 | EXPORT_SYMBOL_GPL(flush_workqueue); |
@@ -350,8 +371,7 @@ struct workqueue_struct *__create_workqueue(const char *name, | |||
350 | } | 371 | } |
351 | 372 | ||
352 | wq->name = name; | 373 | wq->name = name; |
353 | /* We don't need the distraction of CPUs appearing and vanishing. */ | 374 | mutex_lock(&workqueue_mutex); |
354 | lock_cpu_hotplug(); | ||
355 | if (singlethread) { | 375 | if (singlethread) { |
356 | INIT_LIST_HEAD(&wq->list); | 376 | INIT_LIST_HEAD(&wq->list); |
357 | p = create_workqueue_thread(wq, singlethread_cpu); | 377 | p = create_workqueue_thread(wq, singlethread_cpu); |
@@ -360,9 +380,7 @@ struct workqueue_struct *__create_workqueue(const char *name, | |||
360 | else | 380 | else |
361 | wake_up_process(p); | 381 | wake_up_process(p); |
362 | } else { | 382 | } else { |
363 | spin_lock(&workqueue_lock); | ||
364 | list_add(&wq->list, &workqueues); | 383 | list_add(&wq->list, &workqueues); |
365 | spin_unlock(&workqueue_lock); | ||
366 | for_each_online_cpu(cpu) { | 384 | for_each_online_cpu(cpu) { |
367 | p = create_workqueue_thread(wq, cpu); | 385 | p = create_workqueue_thread(wq, cpu); |
368 | if (p) { | 386 | if (p) { |
@@ -372,7 +390,7 @@ struct workqueue_struct *__create_workqueue(const char *name, | |||
372 | destroy = 1; | 390 | destroy = 1; |
373 | } | 391 | } |
374 | } | 392 | } |
375 | unlock_cpu_hotplug(); | 393 | mutex_unlock(&workqueue_mutex); |
376 | 394 | ||
377 | /* | 395 | /* |
378 | * Was there any error during startup? If yes then clean up: | 396 | * Was there any error during startup? If yes then clean up: |
@@ -400,6 +418,12 @@ static void cleanup_workqueue_thread(struct workqueue_struct *wq, int cpu) | |||
400 | kthread_stop(p); | 418 | kthread_stop(p); |
401 | } | 419 | } |
402 | 420 | ||
421 | /** | ||
422 | * destroy_workqueue - safely terminate a workqueue | ||
423 | * @wq: target workqueue | ||
424 | * | ||
425 | * Safely destroy a workqueue. All work currently pending will be done first. | ||
426 | */ | ||
403 | void destroy_workqueue(struct workqueue_struct *wq) | 427 | void destroy_workqueue(struct workqueue_struct *wq) |
404 | { | 428 | { |
405 | int cpu; | 429 | int cpu; |
@@ -407,17 +431,15 @@ void destroy_workqueue(struct workqueue_struct *wq) | |||
407 | flush_workqueue(wq); | 431 | flush_workqueue(wq); |
408 | 432 | ||
409 | /* We don't need the distraction of CPUs appearing and vanishing. */ | 433 | /* We don't need the distraction of CPUs appearing and vanishing. */ |
410 | lock_cpu_hotplug(); | 434 | mutex_lock(&workqueue_mutex); |
411 | if (is_single_threaded(wq)) | 435 | if (is_single_threaded(wq)) |
412 | cleanup_workqueue_thread(wq, singlethread_cpu); | 436 | cleanup_workqueue_thread(wq, singlethread_cpu); |
413 | else { | 437 | else { |
414 | for_each_online_cpu(cpu) | 438 | for_each_online_cpu(cpu) |
415 | cleanup_workqueue_thread(wq, cpu); | 439 | cleanup_workqueue_thread(wq, cpu); |
416 | spin_lock(&workqueue_lock); | ||
417 | list_del(&wq->list); | 440 | list_del(&wq->list); |
418 | spin_unlock(&workqueue_lock); | ||
419 | } | 441 | } |
420 | unlock_cpu_hotplug(); | 442 | mutex_unlock(&workqueue_mutex); |
421 | free_percpu(wq->cpu_wq); | 443 | free_percpu(wq->cpu_wq); |
422 | kfree(wq); | 444 | kfree(wq); |
423 | } | 445 | } |
@@ -425,18 +447,41 @@ EXPORT_SYMBOL_GPL(destroy_workqueue); | |||
425 | 447 | ||
426 | static struct workqueue_struct *keventd_wq; | 448 | static struct workqueue_struct *keventd_wq; |
427 | 449 | ||
450 | /** | ||
451 | * schedule_work - put work task in global workqueue | ||
452 | * @work: job to be done | ||
453 | * | ||
454 | * This puts a job in the kernel-global workqueue. | ||
455 | */ | ||
428 | int fastcall schedule_work(struct work_struct *work) | 456 | int fastcall schedule_work(struct work_struct *work) |
429 | { | 457 | { |
430 | return queue_work(keventd_wq, work); | 458 | return queue_work(keventd_wq, work); |
431 | } | 459 | } |
432 | EXPORT_SYMBOL(schedule_work); | 460 | EXPORT_SYMBOL(schedule_work); |
433 | 461 | ||
462 | /** | ||
463 | * schedule_delayed_work - put work task in global workqueue after delay | ||
464 | * @work: job to be done | ||
465 | * @delay: number of jiffies to wait | ||
466 | * | ||
467 | * After waiting for a given time this puts a job in the kernel-global | ||
468 | * workqueue. | ||
469 | */ | ||
434 | int fastcall schedule_delayed_work(struct work_struct *work, unsigned long delay) | 470 | int fastcall schedule_delayed_work(struct work_struct *work, unsigned long delay) |
435 | { | 471 | { |
436 | return queue_delayed_work(keventd_wq, work, delay); | 472 | return queue_delayed_work(keventd_wq, work, delay); |
437 | } | 473 | } |
438 | EXPORT_SYMBOL(schedule_delayed_work); | 474 | EXPORT_SYMBOL(schedule_delayed_work); |
439 | 475 | ||
476 | /** | ||
477 | * schedule_delayed_work_on - queue work in global workqueue on CPU after delay | ||
478 | * @cpu: cpu to use | ||
479 | * @work: job to be done | ||
480 | * @delay: number of jiffies to wait | ||
481 | * | ||
482 | * After waiting for a given time this puts a job in the kernel-global | ||
483 | * workqueue on the specified CPU. | ||
484 | */ | ||
440 | int schedule_delayed_work_on(int cpu, | 485 | int schedule_delayed_work_on(int cpu, |
441 | struct work_struct *work, unsigned long delay) | 486 | struct work_struct *work, unsigned long delay) |
442 | { | 487 | { |
@@ -465,11 +510,13 @@ int schedule_on_each_cpu(void (*func)(void *info), void *info) | |||
465 | if (!works) | 510 | if (!works) |
466 | return -ENOMEM; | 511 | return -ENOMEM; |
467 | 512 | ||
513 | mutex_lock(&workqueue_mutex); | ||
468 | for_each_online_cpu(cpu) { | 514 | for_each_online_cpu(cpu) { |
469 | INIT_WORK(per_cpu_ptr(works, cpu), func, info); | 515 | INIT_WORK(per_cpu_ptr(works, cpu), func, info); |
470 | __queue_work(per_cpu_ptr(keventd_wq->cpu_wq, cpu), | 516 | __queue_work(per_cpu_ptr(keventd_wq->cpu_wq, cpu), |
471 | per_cpu_ptr(works, cpu)); | 517 | per_cpu_ptr(works, cpu)); |
472 | } | 518 | } |
519 | mutex_unlock(&workqueue_mutex); | ||
473 | flush_workqueue(keventd_wq); | 520 | flush_workqueue(keventd_wq); |
474 | free_percpu(works); | 521 | free_percpu(works); |
475 | return 0; | 522 | return 0; |
@@ -585,6 +632,7 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, | |||
585 | 632 | ||
586 | switch (action) { | 633 | switch (action) { |
587 | case CPU_UP_PREPARE: | 634 | case CPU_UP_PREPARE: |
635 | mutex_lock(&workqueue_mutex); | ||
588 | /* Create a new workqueue thread for it. */ | 636 | /* Create a new workqueue thread for it. */ |
589 | list_for_each_entry(wq, &workqueues, list) { | 637 | list_for_each_entry(wq, &workqueues, list) { |
590 | if (!create_workqueue_thread(wq, hotcpu)) { | 638 | if (!create_workqueue_thread(wq, hotcpu)) { |
@@ -603,6 +651,7 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, | |||
603 | kthread_bind(cwq->thread, hotcpu); | 651 | kthread_bind(cwq->thread, hotcpu); |
604 | wake_up_process(cwq->thread); | 652 | wake_up_process(cwq->thread); |
605 | } | 653 | } |
654 | mutex_unlock(&workqueue_mutex); | ||
606 | break; | 655 | break; |
607 | 656 | ||
608 | case CPU_UP_CANCELED: | 657 | case CPU_UP_CANCELED: |
@@ -614,6 +663,15 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, | |||
614 | any_online_cpu(cpu_online_map)); | 663 | any_online_cpu(cpu_online_map)); |
615 | cleanup_workqueue_thread(wq, hotcpu); | 664 | cleanup_workqueue_thread(wq, hotcpu); |
616 | } | 665 | } |
666 | mutex_unlock(&workqueue_mutex); | ||
667 | break; | ||
668 | |||
669 | case CPU_DOWN_PREPARE: | ||
670 | mutex_lock(&workqueue_mutex); | ||
671 | break; | ||
672 | |||
673 | case CPU_DOWN_FAILED: | ||
674 | mutex_unlock(&workqueue_mutex); | ||
617 | break; | 675 | break; |
618 | 676 | ||
619 | case CPU_DEAD: | 677 | case CPU_DEAD: |
@@ -621,6 +679,7 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, | |||
621 | cleanup_workqueue_thread(wq, hotcpu); | 679 | cleanup_workqueue_thread(wq, hotcpu); |
622 | list_for_each_entry(wq, &workqueues, list) | 680 | list_for_each_entry(wq, &workqueues, list) |
623 | take_over_work(wq, hotcpu); | 681 | take_over_work(wq, hotcpu); |
682 | mutex_unlock(&workqueue_mutex); | ||
624 | break; | 683 | break; |
625 | } | 684 | } |
626 | 685 | ||
diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c index 2b1530fc573b..7f20e7b857cb 100644 --- a/lib/kobject_uevent.c +++ b/lib/kobject_uevent.c | |||
@@ -50,10 +50,6 @@ static char *action_to_string(enum kobject_action action) | |||
50 | return "offline"; | 50 | return "offline"; |
51 | case KOBJ_ONLINE: | 51 | case KOBJ_ONLINE: |
52 | return "online"; | 52 | return "online"; |
53 | case KOBJ_DOCK: | ||
54 | return "dock"; | ||
55 | case KOBJ_UNDOCK: | ||
56 | return "undock"; | ||
57 | default: | 53 | default: |
58 | return NULL; | 54 | return NULL; |
59 | } | 55 | } |
diff --git a/lib/spinlock_debug.c b/lib/spinlock_debug.c index 3d9c4dc965ed..58c577dd82e5 100644 --- a/lib/spinlock_debug.c +++ b/lib/spinlock_debug.c | |||
@@ -162,6 +162,7 @@ static void rwlock_bug(rwlock_t *lock, const char *msg) | |||
162 | 162 | ||
163 | #define RWLOCK_BUG_ON(cond, lock, msg) if (unlikely(cond)) rwlock_bug(lock, msg) | 163 | #define RWLOCK_BUG_ON(cond, lock, msg) if (unlikely(cond)) rwlock_bug(lock, msg) |
164 | 164 | ||
165 | #if 0 /* __write_lock_debug() can lock up - maybe this can too? */ | ||
165 | static void __read_lock_debug(rwlock_t *lock) | 166 | static void __read_lock_debug(rwlock_t *lock) |
166 | { | 167 | { |
167 | int print_once = 1; | 168 | int print_once = 1; |
@@ -184,12 +185,12 @@ static void __read_lock_debug(rwlock_t *lock) | |||
184 | } | 185 | } |
185 | } | 186 | } |
186 | } | 187 | } |
188 | #endif | ||
187 | 189 | ||
188 | void _raw_read_lock(rwlock_t *lock) | 190 | void _raw_read_lock(rwlock_t *lock) |
189 | { | 191 | { |
190 | RWLOCK_BUG_ON(lock->magic != RWLOCK_MAGIC, lock, "bad magic"); | 192 | RWLOCK_BUG_ON(lock->magic != RWLOCK_MAGIC, lock, "bad magic"); |
191 | if (unlikely(!__raw_read_trylock(&lock->raw_lock))) | 193 | __raw_read_lock(&lock->raw_lock); |
192 | __read_lock_debug(lock); | ||
193 | } | 194 | } |
194 | 195 | ||
195 | int _raw_read_trylock(rwlock_t *lock) | 196 | int _raw_read_trylock(rwlock_t *lock) |
@@ -235,6 +236,7 @@ static inline void debug_write_unlock(rwlock_t *lock) | |||
235 | lock->owner_cpu = -1; | 236 | lock->owner_cpu = -1; |
236 | } | 237 | } |
237 | 238 | ||
239 | #if 0 /* This can cause lockups */ | ||
238 | static void __write_lock_debug(rwlock_t *lock) | 240 | static void __write_lock_debug(rwlock_t *lock) |
239 | { | 241 | { |
240 | int print_once = 1; | 242 | int print_once = 1; |
@@ -257,12 +259,12 @@ static void __write_lock_debug(rwlock_t *lock) | |||
257 | } | 259 | } |
258 | } | 260 | } |
259 | } | 261 | } |
262 | #endif | ||
260 | 263 | ||
261 | void _raw_write_lock(rwlock_t *lock) | 264 | void _raw_write_lock(rwlock_t *lock) |
262 | { | 265 | { |
263 | debug_write_lock_before(lock); | 266 | debug_write_lock_before(lock); |
264 | if (unlikely(!__raw_write_trylock(&lock->raw_lock))) | 267 | __raw_write_lock(&lock->raw_lock); |
265 | __write_lock_debug(lock); | ||
266 | debug_write_lock_after(lock); | 268 | debug_write_lock_after(lock); |
267 | } | 269 | } |
268 | 270 | ||
diff --git a/lib/zlib_inflate/inflate.c b/lib/zlib_inflate/inflate.c index 7f922dccf1a5..fceb97c3aff7 100644 --- a/lib/zlib_inflate/inflate.c +++ b/lib/zlib_inflate/inflate.c | |||
@@ -347,7 +347,10 @@ int zlib_inflate(z_streamp strm, int flush) | |||
347 | static const unsigned short order[19] = /* permutation of code lengths */ | 347 | static const unsigned short order[19] = /* permutation of code lengths */ |
348 | {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; | 348 | {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; |
349 | 349 | ||
350 | if (strm == NULL || strm->state == NULL || strm->next_out == NULL || | 350 | /* Do not check for strm->next_out == NULL here as ppc zImage |
351 | inflates to strm->next_out = 0 */ | ||
352 | |||
353 | if (strm == NULL || strm->state == NULL || | ||
351 | (strm->next_in == NULL && strm->avail_in != 0)) | 354 | (strm->next_in == NULL && strm->avail_in != 0)) |
352 | return Z_STREAM_ERROR; | 355 | return Z_STREAM_ERROR; |
353 | 356 | ||
diff --git a/mm/fadvise.c b/mm/fadvise.c index 60a5d55e51d9..168c78a121bb 100644 --- a/mm/fadvise.c +++ b/mm/fadvise.c | |||
@@ -73,7 +73,6 @@ asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice) | |||
73 | file->f_ra.ra_pages = bdi->ra_pages * 2; | 73 | file->f_ra.ra_pages = bdi->ra_pages * 2; |
74 | break; | 74 | break; |
75 | case POSIX_FADV_WILLNEED: | 75 | case POSIX_FADV_WILLNEED: |
76 | case POSIX_FADV_NOREUSE: | ||
77 | if (!mapping->a_ops->readpage) { | 76 | if (!mapping->a_ops->readpage) { |
78 | ret = -EINVAL; | 77 | ret = -EINVAL; |
79 | break; | 78 | break; |
@@ -94,6 +93,8 @@ asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice) | |||
94 | if (ret > 0) | 93 | if (ret > 0) |
95 | ret = 0; | 94 | ret = 0; |
96 | break; | 95 | break; |
96 | case POSIX_FADV_NOREUSE: | ||
97 | break; | ||
97 | case POSIX_FADV_DONTNEED: | 98 | case POSIX_FADV_DONTNEED: |
98 | if (!bdi_write_congested(mapping->backing_dev_info)) | 99 | if (!bdi_write_congested(mapping->backing_dev_info)) |
99 | filemap_flush(mapping); | 100 | filemap_flush(mapping); |
diff --git a/mm/filemap.c b/mm/filemap.c index d087fc3d3281..b9a60c43b61a 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -849,8 +849,6 @@ static void shrink_readahead_size_eio(struct file *filp, | |||
849 | return; | 849 | return; |
850 | 850 | ||
851 | ra->ra_pages /= 4; | 851 | ra->ra_pages /= 4; |
852 | printk(KERN_WARNING "Reducing readahead size to %luK\n", | ||
853 | ra->ra_pages << (PAGE_CACHE_SHIFT - 10)); | ||
854 | } | 852 | } |
855 | 853 | ||
856 | /** | 854 | /** |
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 01c9fb97c619..c37319542b70 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
@@ -52,6 +52,9 @@ static int __add_section(struct zone *zone, unsigned long phys_start_pfn) | |||
52 | int nr_pages = PAGES_PER_SECTION; | 52 | int nr_pages = PAGES_PER_SECTION; |
53 | int ret; | 53 | int ret; |
54 | 54 | ||
55 | if (pfn_valid(phys_start_pfn)) | ||
56 | return -EEXIST; | ||
57 | |||
55 | ret = sparse_add_one_section(zone, phys_start_pfn, nr_pages); | 58 | ret = sparse_add_one_section(zone, phys_start_pfn, nr_pages); |
56 | 59 | ||
57 | if (ret < 0) | 60 | if (ret < 0) |
@@ -76,15 +79,22 @@ int __add_pages(struct zone *zone, unsigned long phys_start_pfn, | |||
76 | { | 79 | { |
77 | unsigned long i; | 80 | unsigned long i; |
78 | int err = 0; | 81 | int err = 0; |
82 | int start_sec, end_sec; | ||
83 | /* during initialize mem_map, align hot-added range to section */ | ||
84 | start_sec = pfn_to_section_nr(phys_start_pfn); | ||
85 | end_sec = pfn_to_section_nr(phys_start_pfn + nr_pages - 1); | ||
79 | 86 | ||
80 | for (i = 0; i < nr_pages; i += PAGES_PER_SECTION) { | 87 | for (i = start_sec; i <= end_sec; i++) { |
81 | err = __add_section(zone, phys_start_pfn + i); | 88 | err = __add_section(zone, i << PFN_SECTION_SHIFT); |
82 | 89 | ||
83 | /* We want to keep adding the rest of the | 90 | /* |
84 | * sections if the first ones already exist | 91 | * EEXIST is finally dealed with by ioresource collision |
92 | * check. see add_memory() => register_memory_resource() | ||
93 | * Warning will be printed if there is collision. | ||
85 | */ | 94 | */ |
86 | if (err && (err != -EEXIST)) | 95 | if (err && (err != -EEXIST)) |
87 | break; | 96 | break; |
97 | err = 0; | ||
88 | } | 98 | } |
89 | 99 | ||
90 | return err; | 100 | return err; |
@@ -156,7 +166,7 @@ int online_pages(unsigned long pfn, unsigned long nr_pages) | |||
156 | res.flags = IORESOURCE_MEM; /* we just need system ram */ | 166 | res.flags = IORESOURCE_MEM; /* we just need system ram */ |
157 | section_end = res.end; | 167 | section_end = res.end; |
158 | 168 | ||
159 | while (find_next_system_ram(&res) >= 0) { | 169 | while ((res.start < res.end) && (find_next_system_ram(&res) >= 0)) { |
160 | start_pfn = (unsigned long)(res.start >> PAGE_SHIFT); | 170 | start_pfn = (unsigned long)(res.start >> PAGE_SHIFT); |
161 | nr_pages = (unsigned long) | 171 | nr_pages = (unsigned long) |
162 | ((res.end + 1 - res.start) >> PAGE_SHIFT); | 172 | ((res.end + 1 - res.start) >> PAGE_SHIFT); |
@@ -213,10 +223,9 @@ static void rollback_node_hotadd(int nid, pg_data_t *pgdat) | |||
213 | } | 223 | } |
214 | 224 | ||
215 | /* add this memory to iomem resource */ | 225 | /* add this memory to iomem resource */ |
216 | static void register_memory_resource(u64 start, u64 size) | 226 | static struct resource *register_memory_resource(u64 start, u64 size) |
217 | { | 227 | { |
218 | struct resource *res; | 228 | struct resource *res; |
219 | |||
220 | res = kzalloc(sizeof(struct resource), GFP_KERNEL); | 229 | res = kzalloc(sizeof(struct resource), GFP_KERNEL); |
221 | BUG_ON(!res); | 230 | BUG_ON(!res); |
222 | 231 | ||
@@ -228,7 +237,18 @@ static void register_memory_resource(u64 start, u64 size) | |||
228 | printk("System RAM resource %llx - %llx cannot be added\n", | 237 | printk("System RAM resource %llx - %llx cannot be added\n", |
229 | (unsigned long long)res->start, (unsigned long long)res->end); | 238 | (unsigned long long)res->start, (unsigned long long)res->end); |
230 | kfree(res); | 239 | kfree(res); |
240 | res = NULL; | ||
231 | } | 241 | } |
242 | return res; | ||
243 | } | ||
244 | |||
245 | static void release_memory_resource(struct resource *res) | ||
246 | { | ||
247 | if (!res) | ||
248 | return; | ||
249 | release_resource(res); | ||
250 | kfree(res); | ||
251 | return; | ||
232 | } | 252 | } |
233 | 253 | ||
234 | 254 | ||
@@ -237,8 +257,13 @@ int add_memory(int nid, u64 start, u64 size) | |||
237 | { | 257 | { |
238 | pg_data_t *pgdat = NULL; | 258 | pg_data_t *pgdat = NULL; |
239 | int new_pgdat = 0; | 259 | int new_pgdat = 0; |
260 | struct resource *res; | ||
240 | int ret; | 261 | int ret; |
241 | 262 | ||
263 | res = register_memory_resource(start, size); | ||
264 | if (!res) | ||
265 | return -EEXIST; | ||
266 | |||
242 | if (!node_online(nid)) { | 267 | if (!node_online(nid)) { |
243 | pgdat = hotadd_new_pgdat(nid, start); | 268 | pgdat = hotadd_new_pgdat(nid, start); |
244 | if (!pgdat) | 269 | if (!pgdat) |
@@ -268,14 +293,13 @@ int add_memory(int nid, u64 start, u64 size) | |||
268 | BUG_ON(ret); | 293 | BUG_ON(ret); |
269 | } | 294 | } |
270 | 295 | ||
271 | /* register this memory as resource */ | ||
272 | register_memory_resource(start, size); | ||
273 | |||
274 | return ret; | 296 | return ret; |
275 | error: | 297 | error: |
276 | /* rollback pgdat allocation and others */ | 298 | /* rollback pgdat allocation and others */ |
277 | if (new_pgdat) | 299 | if (new_pgdat) |
278 | rollback_node_hotadd(nid, pgdat); | 300 | rollback_node_hotadd(nid, pgdat); |
301 | if (res) | ||
302 | release_memory_resource(res); | ||
279 | 303 | ||
280 | return ret; | 304 | return ret; |
281 | } | 305 | } |
@@ -1106,7 +1106,7 @@ static inline int cache_free_alien(struct kmem_cache *cachep, void *objp) | |||
1106 | 1106 | ||
1107 | #endif | 1107 | #endif |
1108 | 1108 | ||
1109 | static int __devinit cpuup_callback(struct notifier_block *nfb, | 1109 | static int __cpuinit cpuup_callback(struct notifier_block *nfb, |
1110 | unsigned long action, void *hcpu) | 1110 | unsigned long action, void *hcpu) |
1111 | { | 1111 | { |
1112 | long cpu = (long)hcpu; | 1112 | long cpu = (long)hcpu; |
@@ -3224,7 +3224,7 @@ void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags) | |||
3224 | EXPORT_SYMBOL(kmem_cache_alloc); | 3224 | EXPORT_SYMBOL(kmem_cache_alloc); |
3225 | 3225 | ||
3226 | /** | 3226 | /** |
3227 | * kmem_cache_alloc - Allocate an object. The memory is set to zero. | 3227 | * kmem_cache_zalloc - Allocate an object. The memory is set to zero. |
3228 | * @cache: The cache to allocate from. | 3228 | * @cache: The cache to allocate from. |
3229 | * @flags: See kmalloc(). | 3229 | * @flags: See kmalloc(). |
3230 | * | 3230 | * |
@@ -54,6 +54,26 @@ void put_page(struct page *page) | |||
54 | } | 54 | } |
55 | EXPORT_SYMBOL(put_page); | 55 | EXPORT_SYMBOL(put_page); |
56 | 56 | ||
57 | /** | ||
58 | * put_pages_list(): release a list of pages | ||
59 | * | ||
60 | * Release a list of pages which are strung together on page.lru. Currently | ||
61 | * used by read_cache_pages() and related error recovery code. | ||
62 | * | ||
63 | * @pages: list of pages threaded on page->lru | ||
64 | */ | ||
65 | void put_pages_list(struct list_head *pages) | ||
66 | { | ||
67 | while (!list_empty(pages)) { | ||
68 | struct page *victim; | ||
69 | |||
70 | victim = list_entry(pages->prev, struct page, lru); | ||
71 | list_del(&victim->lru); | ||
72 | page_cache_release(victim); | ||
73 | } | ||
74 | } | ||
75 | EXPORT_SYMBOL(put_pages_list); | ||
76 | |||
57 | /* | 77 | /* |
58 | * Writeback is about to end against a page which has been marked for immediate | 78 | * Writeback is about to end against a page which has been marked for immediate |
59 | * reclaim. If it still appears to be reclaimable, move it to the tail of the | 79 | * reclaim. If it still appears to be reclaimable, move it to the tail of the |
diff --git a/net/atm/proc.c b/net/atm/proc.c index 3f95b0886a6a..91fe5f53ff11 100644 --- a/net/atm/proc.c +++ b/net/atm/proc.c | |||
@@ -507,7 +507,7 @@ err_out: | |||
507 | goto out; | 507 | goto out; |
508 | } | 508 | } |
509 | 509 | ||
510 | void __exit atm_proc_exit(void) | 510 | void atm_proc_exit(void) |
511 | { | 511 | { |
512 | atm_proc_dirs_remove(); | 512 | atm_proc_dirs_remove(); |
513 | } | 513 | } |
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index f55ef682ef84..b1211d5342f6 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c | |||
@@ -386,12 +386,17 @@ void br_features_recompute(struct net_bridge *br) | |||
386 | checksum = 0; | 386 | checksum = 0; |
387 | 387 | ||
388 | if (feature & NETIF_F_GSO) | 388 | if (feature & NETIF_F_GSO) |
389 | feature |= NETIF_F_TSO; | 389 | feature |= NETIF_F_GSO_SOFTWARE; |
390 | feature |= NETIF_F_GSO; | 390 | feature |= NETIF_F_GSO; |
391 | 391 | ||
392 | features &= feature; | 392 | features &= feature; |
393 | } | 393 | } |
394 | 394 | ||
395 | if (!(checksum & NETIF_F_ALL_CSUM)) | ||
396 | features &= ~NETIF_F_SG; | ||
397 | if (!(features & NETIF_F_SG)) | ||
398 | features &= ~NETIF_F_GSO_MASK; | ||
399 | |||
395 | br->dev->features = features | checksum | NETIF_F_LLTX | | 400 | br->dev->features = features | checksum | NETIF_F_LLTX | |
396 | NETIF_F_GSO_ROBUST; | 401 | NETIF_F_GSO_ROBUST; |
397 | } | 402 | } |
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index cbc8a389a0a8..05b3de888243 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
@@ -61,6 +61,9 @@ static int brnf_filter_vlan_tagged = 1; | |||
61 | #define brnf_filter_vlan_tagged 1 | 61 | #define brnf_filter_vlan_tagged 1 |
62 | #endif | 62 | #endif |
63 | 63 | ||
64 | int brnf_deferred_hooks; | ||
65 | EXPORT_SYMBOL_GPL(brnf_deferred_hooks); | ||
66 | |||
64 | static __be16 inline vlan_proto(const struct sk_buff *skb) | 67 | static __be16 inline vlan_proto(const struct sk_buff *skb) |
65 | { | 68 | { |
66 | return vlan_eth_hdr(skb)->h_vlan_encapsulated_proto; | 69 | return vlan_eth_hdr(skb)->h_vlan_encapsulated_proto; |
@@ -890,6 +893,8 @@ static unsigned int ip_sabotage_out(unsigned int hook, struct sk_buff **pskb, | |||
890 | return NF_ACCEPT; | 893 | return NF_ACCEPT; |
891 | else if (ip->version == 6 && !brnf_call_ip6tables) | 894 | else if (ip->version == 6 && !brnf_call_ip6tables) |
892 | return NF_ACCEPT; | 895 | return NF_ACCEPT; |
896 | else if (!brnf_deferred_hooks) | ||
897 | return NF_ACCEPT; | ||
893 | #endif | 898 | #endif |
894 | if (hook == NF_IP_POST_ROUTING) | 899 | if (hook == NF_IP_POST_ROUTING) |
895 | return NF_ACCEPT; | 900 | return NF_ACCEPT; |
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 06abb6634f5b..53086fb75089 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
@@ -85,7 +85,7 @@ void br_ifinfo_notify(int event, struct net_bridge_port *port) | |||
85 | goto err_out; | 85 | goto err_out; |
86 | 86 | ||
87 | err = br_fill_ifinfo(skb, port, current->pid, 0, event, 0); | 87 | err = br_fill_ifinfo(skb, port, current->pid, 0, event, 0); |
88 | if (err) | 88 | if (err < 0) |
89 | goto err_kfree; | 89 | goto err_kfree; |
90 | 90 | ||
91 | NETLINK_CB(skb).dst_group = RTNLGRP_LINK; | 91 | NETLINK_CB(skb).dst_group = RTNLGRP_LINK; |
diff --git a/net/bridge/netfilter/ebt_ulog.c b/net/bridge/netfilter/ebt_ulog.c index 02693a230dc1..9f950db3b76f 100644 --- a/net/bridge/netfilter/ebt_ulog.c +++ b/net/bridge/netfilter/ebt_ulog.c | |||
@@ -74,6 +74,9 @@ static void ulog_send(unsigned int nlgroup) | |||
74 | if (timer_pending(&ub->timer)) | 74 | if (timer_pending(&ub->timer)) |
75 | del_timer(&ub->timer); | 75 | del_timer(&ub->timer); |
76 | 76 | ||
77 | if (!ub->skb) | ||
78 | return; | ||
79 | |||
77 | /* last nlmsg needs NLMSG_DONE */ | 80 | /* last nlmsg needs NLMSG_DONE */ |
78 | if (ub->qlen > 1) | 81 | if (ub->qlen > 1) |
79 | ub->lastnlh->nlmsg_type = NLMSG_DONE; | 82 | ub->lastnlh->nlmsg_type = NLMSG_DONE; |
diff --git a/net/core/Makefile b/net/core/Makefile index e9bd2467d5a9..2645ba428d48 100644 --- a/net/core/Makefile +++ b/net/core/Makefile | |||
@@ -7,7 +7,7 @@ obj-y := sock.o request_sock.o skbuff.o iovec.o datagram.o stream.o scm.o \ | |||
7 | 7 | ||
8 | obj-$(CONFIG_SYSCTL) += sysctl_net_core.o | 8 | obj-$(CONFIG_SYSCTL) += sysctl_net_core.o |
9 | 9 | ||
10 | obj-y += dev.o ethtool.o dev_mcast.o dst.o \ | 10 | obj-y += dev.o ethtool.o dev_mcast.o dst.o netevent.o \ |
11 | neighbour.o rtnetlink.o utils.o link_watch.o filter.o | 11 | neighbour.o rtnetlink.o utils.o link_watch.o filter.o |
12 | 12 | ||
13 | obj-$(CONFIG_XFRM) += flow.o | 13 | obj-$(CONFIG_XFRM) += flow.o |
diff --git a/net/core/dev.c b/net/core/dev.c index 4d2b5167d7f5..d4a1ec3bded5 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -116,6 +116,7 @@ | |||
116 | #include <linux/audit.h> | 116 | #include <linux/audit.h> |
117 | #include <linux/dmaengine.h> | 117 | #include <linux/dmaengine.h> |
118 | #include <linux/err.h> | 118 | #include <linux/err.h> |
119 | #include <linux/ctype.h> | ||
119 | 120 | ||
120 | /* | 121 | /* |
121 | * The list of packet types we will receive (as opposed to discard) | 122 | * The list of packet types we will receive (as opposed to discard) |
@@ -632,14 +633,22 @@ struct net_device * dev_get_by_flags(unsigned short if_flags, unsigned short mas | |||
632 | * @name: name string | 633 | * @name: name string |
633 | * | 634 | * |
634 | * Network device names need to be valid file names to | 635 | * Network device names need to be valid file names to |
635 | * to allow sysfs to work | 636 | * to allow sysfs to work. We also disallow any kind of |
637 | * whitespace. | ||
636 | */ | 638 | */ |
637 | int dev_valid_name(const char *name) | 639 | int dev_valid_name(const char *name) |
638 | { | 640 | { |
639 | return !(*name == '\0' | 641 | if (*name == '\0') |
640 | || !strcmp(name, ".") | 642 | return 0; |
641 | || !strcmp(name, "..") | 643 | if (!strcmp(name, ".") || !strcmp(name, "..")) |
642 | || strchr(name, '/')); | 644 | return 0; |
645 | |||
646 | while (*name) { | ||
647 | if (*name == '/' || isspace(*name)) | ||
648 | return 0; | ||
649 | name++; | ||
650 | } | ||
651 | return 1; | ||
643 | } | 652 | } |
644 | 653 | ||
645 | /** | 654 | /** |
@@ -1166,11 +1175,6 @@ int skb_checksum_help(struct sk_buff *skb, int inward) | |||
1166 | goto out_set_summed; | 1175 | goto out_set_summed; |
1167 | 1176 | ||
1168 | if (unlikely(skb_shinfo(skb)->gso_size)) { | 1177 | if (unlikely(skb_shinfo(skb)->gso_size)) { |
1169 | static int warned; | ||
1170 | |||
1171 | WARN_ON(!warned); | ||
1172 | warned = 1; | ||
1173 | |||
1174 | /* Let GSO fix up the checksum. */ | 1178 | /* Let GSO fix up the checksum. */ |
1175 | goto out_set_summed; | 1179 | goto out_set_summed; |
1176 | } | 1180 | } |
@@ -1220,11 +1224,6 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features) | |||
1220 | __skb_pull(skb, skb->mac_len); | 1224 | __skb_pull(skb, skb->mac_len); |
1221 | 1225 | ||
1222 | if (unlikely(skb->ip_summed != CHECKSUM_HW)) { | 1226 | if (unlikely(skb->ip_summed != CHECKSUM_HW)) { |
1223 | static int warned; | ||
1224 | |||
1225 | WARN_ON(!warned); | ||
1226 | warned = 1; | ||
1227 | |||
1228 | if (skb_header_cloned(skb) && | 1227 | if (skb_header_cloned(skb) && |
1229 | (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))) | 1228 | (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))) |
1230 | return ERR_PTR(err); | 1229 | return ERR_PTR(err); |
@@ -1629,26 +1628,10 @@ static inline struct net_device *skb_bond(struct sk_buff *skb) | |||
1629 | struct net_device *dev = skb->dev; | 1628 | struct net_device *dev = skb->dev; |
1630 | 1629 | ||
1631 | if (dev->master) { | 1630 | if (dev->master) { |
1632 | /* | 1631 | if (skb_bond_should_drop(skb)) { |
1633 | * On bonding slaves other than the currently active | ||
1634 | * slave, suppress duplicates except for 802.3ad | ||
1635 | * ETH_P_SLOW and alb non-mcast/bcast. | ||
1636 | */ | ||
1637 | if (dev->priv_flags & IFF_SLAVE_INACTIVE) { | ||
1638 | if (dev->master->priv_flags & IFF_MASTER_ALB) { | ||
1639 | if (skb->pkt_type != PACKET_BROADCAST && | ||
1640 | skb->pkt_type != PACKET_MULTICAST) | ||
1641 | goto keep; | ||
1642 | } | ||
1643 | |||
1644 | if (dev->master->priv_flags & IFF_MASTER_8023AD && | ||
1645 | skb->protocol == __constant_htons(ETH_P_SLOW)) | ||
1646 | goto keep; | ||
1647 | |||
1648 | kfree_skb(skb); | 1632 | kfree_skb(skb); |
1649 | return NULL; | 1633 | return NULL; |
1650 | } | 1634 | } |
1651 | keep: | ||
1652 | skb->dev = dev->master; | 1635 | skb->dev = dev->master; |
1653 | } | 1636 | } |
1654 | 1637 | ||
@@ -3429,12 +3412,9 @@ static void net_dma_rebalance(void) | |||
3429 | unsigned int cpu, i, n; | 3412 | unsigned int cpu, i, n; |
3430 | struct dma_chan *chan; | 3413 | struct dma_chan *chan; |
3431 | 3414 | ||
3432 | lock_cpu_hotplug(); | ||
3433 | |||
3434 | if (net_dma_count == 0) { | 3415 | if (net_dma_count == 0) { |
3435 | for_each_online_cpu(cpu) | 3416 | for_each_online_cpu(cpu) |
3436 | rcu_assign_pointer(per_cpu(softnet_data.net_dma, cpu), NULL); | 3417 | rcu_assign_pointer(per_cpu(softnet_data, cpu).net_dma, NULL); |
3437 | unlock_cpu_hotplug(); | ||
3438 | return; | 3418 | return; |
3439 | } | 3419 | } |
3440 | 3420 | ||
@@ -3447,15 +3427,13 @@ static void net_dma_rebalance(void) | |||
3447 | + (i < (num_online_cpus() % net_dma_count) ? 1 : 0)); | 3427 | + (i < (num_online_cpus() % net_dma_count) ? 1 : 0)); |
3448 | 3428 | ||
3449 | while(n) { | 3429 | while(n) { |
3450 | per_cpu(softnet_data.net_dma, cpu) = chan; | 3430 | per_cpu(softnet_data, cpu).net_dma = chan; |
3451 | cpu = next_cpu(cpu, cpu_online_map); | 3431 | cpu = next_cpu(cpu, cpu_online_map); |
3452 | n--; | 3432 | n--; |
3453 | } | 3433 | } |
3454 | i++; | 3434 | i++; |
3455 | } | 3435 | } |
3456 | rcu_read_unlock(); | 3436 | rcu_read_unlock(); |
3457 | |||
3458 | unlock_cpu_hotplug(); | ||
3459 | } | 3437 | } |
3460 | 3438 | ||
3461 | /** | 3439 | /** |
diff --git a/net/core/dst.c b/net/core/dst.c index 470c05bc4cb2..1a5e49da0e77 100644 --- a/net/core/dst.c +++ b/net/core/dst.c | |||
@@ -95,12 +95,11 @@ static void dst_run_gc(unsigned long dummy) | |||
95 | dst_gc_timer_inc = DST_GC_INC; | 95 | dst_gc_timer_inc = DST_GC_INC; |
96 | dst_gc_timer_expires = DST_GC_MIN; | 96 | dst_gc_timer_expires = DST_GC_MIN; |
97 | } | 97 | } |
98 | dst_gc_timer.expires = jiffies + dst_gc_timer_expires; | ||
99 | #if RT_CACHE_DEBUG >= 2 | 98 | #if RT_CACHE_DEBUG >= 2 |
100 | printk("dst_total: %d/%d %ld\n", | 99 | printk("dst_total: %d/%d %ld\n", |
101 | atomic_read(&dst_total), delayed, dst_gc_timer_expires); | 100 | atomic_read(&dst_total), delayed, dst_gc_timer_expires); |
102 | #endif | 101 | #endif |
103 | add_timer(&dst_gc_timer); | 102 | mod_timer(&dst_gc_timer, jiffies + dst_gc_timer_expires); |
104 | 103 | ||
105 | out: | 104 | out: |
106 | spin_unlock(&dst_lock); | 105 | spin_unlock(&dst_lock); |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 7ad681f5e712..5130d2efdbbe 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <net/neighbour.h> | 29 | #include <net/neighbour.h> |
30 | #include <net/dst.h> | 30 | #include <net/dst.h> |
31 | #include <net/sock.h> | 31 | #include <net/sock.h> |
32 | #include <net/netevent.h> | ||
32 | #include <linux/rtnetlink.h> | 33 | #include <linux/rtnetlink.h> |
33 | #include <linux/random.h> | 34 | #include <linux/random.h> |
34 | #include <linux/string.h> | 35 | #include <linux/string.h> |
@@ -754,6 +755,7 @@ static void neigh_timer_handler(unsigned long arg) | |||
754 | neigh->nud_state = NUD_STALE; | 755 | neigh->nud_state = NUD_STALE; |
755 | neigh->updated = jiffies; | 756 | neigh->updated = jiffies; |
756 | neigh_suspect(neigh); | 757 | neigh_suspect(neigh); |
758 | notify = 1; | ||
757 | } | 759 | } |
758 | } else if (state & NUD_DELAY) { | 760 | } else if (state & NUD_DELAY) { |
759 | if (time_before_eq(now, | 761 | if (time_before_eq(now, |
@@ -762,6 +764,7 @@ static void neigh_timer_handler(unsigned long arg) | |||
762 | neigh->nud_state = NUD_REACHABLE; | 764 | neigh->nud_state = NUD_REACHABLE; |
763 | neigh->updated = jiffies; | 765 | neigh->updated = jiffies; |
764 | neigh_connect(neigh); | 766 | neigh_connect(neigh); |
767 | notify = 1; | ||
765 | next = neigh->confirmed + neigh->parms->reachable_time; | 768 | next = neigh->confirmed + neigh->parms->reachable_time; |
766 | } else { | 769 | } else { |
767 | NEIGH_PRINTK2("neigh %p is probed.\n", neigh); | 770 | NEIGH_PRINTK2("neigh %p is probed.\n", neigh); |
@@ -819,6 +822,8 @@ static void neigh_timer_handler(unsigned long arg) | |||
819 | out: | 822 | out: |
820 | write_unlock(&neigh->lock); | 823 | write_unlock(&neigh->lock); |
821 | } | 824 | } |
825 | if (notify) | ||
826 | call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh); | ||
822 | 827 | ||
823 | #ifdef CONFIG_ARPD | 828 | #ifdef CONFIG_ARPD |
824 | if (notify && neigh->parms->app_probes) | 829 | if (notify && neigh->parms->app_probes) |
@@ -926,9 +931,7 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, | |||
926 | { | 931 | { |
927 | u8 old; | 932 | u8 old; |
928 | int err; | 933 | int err; |
929 | #ifdef CONFIG_ARPD | ||
930 | int notify = 0; | 934 | int notify = 0; |
931 | #endif | ||
932 | struct net_device *dev; | 935 | struct net_device *dev; |
933 | int update_isrouter = 0; | 936 | int update_isrouter = 0; |
934 | 937 | ||
@@ -948,9 +951,7 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, | |||
948 | neigh_suspect(neigh); | 951 | neigh_suspect(neigh); |
949 | neigh->nud_state = new; | 952 | neigh->nud_state = new; |
950 | err = 0; | 953 | err = 0; |
951 | #ifdef CONFIG_ARPD | ||
952 | notify = old & NUD_VALID; | 954 | notify = old & NUD_VALID; |
953 | #endif | ||
954 | goto out; | 955 | goto out; |
955 | } | 956 | } |
956 | 957 | ||
@@ -1022,9 +1023,7 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, | |||
1022 | if (!(new & NUD_CONNECTED)) | 1023 | if (!(new & NUD_CONNECTED)) |
1023 | neigh->confirmed = jiffies - | 1024 | neigh->confirmed = jiffies - |
1024 | (neigh->parms->base_reachable_time << 1); | 1025 | (neigh->parms->base_reachable_time << 1); |
1025 | #ifdef CONFIG_ARPD | ||
1026 | notify = 1; | 1026 | notify = 1; |
1027 | #endif | ||
1028 | } | 1027 | } |
1029 | if (new == old) | 1028 | if (new == old) |
1030 | goto out; | 1029 | goto out; |
@@ -1056,6 +1055,9 @@ out: | |||
1056 | (neigh->flags & ~NTF_ROUTER); | 1055 | (neigh->flags & ~NTF_ROUTER); |
1057 | } | 1056 | } |
1058 | write_unlock_bh(&neigh->lock); | 1057 | write_unlock_bh(&neigh->lock); |
1058 | |||
1059 | if (notify) | ||
1060 | call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh); | ||
1059 | #ifdef CONFIG_ARPD | 1061 | #ifdef CONFIG_ARPD |
1060 | if (notify && neigh->parms->app_probes) | 1062 | if (notify && neigh->parms->app_probes) |
1061 | neigh_app_notify(neigh); | 1063 | neigh_app_notify(neigh); |
diff --git a/net/core/netevent.c b/net/core/netevent.c new file mode 100644 index 000000000000..35d02c38554e --- /dev/null +++ b/net/core/netevent.c | |||
@@ -0,0 +1,69 @@ | |||
1 | /* | ||
2 | * Network event notifiers | ||
3 | * | ||
4 | * Authors: | ||
5 | * Tom Tucker <tom@opengridcomputing.com> | ||
6 | * Steve Wise <swise@opengridcomputing.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * as published by the Free Software Foundation; either version | ||
11 | * 2 of the License, or (at your option) any later version. | ||
12 | * | ||
13 | * Fixes: | ||
14 | */ | ||
15 | |||
16 | #include <linux/rtnetlink.h> | ||
17 | #include <linux/notifier.h> | ||
18 | |||
19 | static ATOMIC_NOTIFIER_HEAD(netevent_notif_chain); | ||
20 | |||
21 | /** | ||
22 | * register_netevent_notifier - register a netevent notifier block | ||
23 | * @nb: notifier | ||
24 | * | ||
25 | * Register a notifier to be called when a netevent occurs. | ||
26 | * The notifier passed is linked into the kernel structures and must | ||
27 | * not be reused until it has been unregistered. A negative errno code | ||
28 | * is returned on a failure. | ||
29 | */ | ||
30 | int register_netevent_notifier(struct notifier_block *nb) | ||
31 | { | ||
32 | int err; | ||
33 | |||
34 | err = atomic_notifier_chain_register(&netevent_notif_chain, nb); | ||
35 | return err; | ||
36 | } | ||
37 | |||
38 | /** | ||
39 | * netevent_unregister_notifier - unregister a netevent notifier block | ||
40 | * @nb: notifier | ||
41 | * | ||
42 | * Unregister a notifier previously registered by | ||
43 | * register_neigh_notifier(). The notifier is unlinked into the | ||
44 | * kernel structures and may then be reused. A negative errno code | ||
45 | * is returned on a failure. | ||
46 | */ | ||
47 | |||
48 | int unregister_netevent_notifier(struct notifier_block *nb) | ||
49 | { | ||
50 | return atomic_notifier_chain_unregister(&netevent_notif_chain, nb); | ||
51 | } | ||
52 | |||
53 | /** | ||
54 | * call_netevent_notifiers - call all netevent notifier blocks | ||
55 | * @val: value passed unmodified to notifier function | ||
56 | * @v: pointer passed unmodified to notifier function | ||
57 | * | ||
58 | * Call all neighbour notifier blocks. Parameters and return value | ||
59 | * are as for notifier_call_chain(). | ||
60 | */ | ||
61 | |||
62 | int call_netevent_notifiers(unsigned long val, void *v) | ||
63 | { | ||
64 | return atomic_notifier_call_chain(&netevent_notif_chain, val, v); | ||
65 | } | ||
66 | |||
67 | EXPORT_SYMBOL_GPL(register_netevent_notifier); | ||
68 | EXPORT_SYMBOL_GPL(unregister_netevent_notifier); | ||
69 | EXPORT_SYMBOL_GPL(call_netevent_notifiers); | ||
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 67ed14ddabd2..6a7320b39ed0 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -2149,6 +2149,8 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, | |||
2149 | skb->mac.raw = ((u8 *) iph) - 14 - pkt_dev->nr_labels*sizeof(u32); | 2149 | skb->mac.raw = ((u8 *) iph) - 14 - pkt_dev->nr_labels*sizeof(u32); |
2150 | skb->dev = odev; | 2150 | skb->dev = odev; |
2151 | skb->pkt_type = PACKET_HOST; | 2151 | skb->pkt_type = PACKET_HOST; |
2152 | skb->nh.iph = iph; | ||
2153 | skb->h.uh = udph; | ||
2152 | 2154 | ||
2153 | if (pkt_dev->nfrags <= 0) | 2155 | if (pkt_dev->nfrags <= 0) |
2154 | pgh = (struct pktgen_hdr *)skb_put(skb, datalen); | 2156 | pgh = (struct pktgen_hdr *)skb_put(skb, datalen); |
@@ -2460,6 +2462,8 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, | |||
2460 | skb->protocol = protocol; | 2462 | skb->protocol = protocol; |
2461 | skb->dev = odev; | 2463 | skb->dev = odev; |
2462 | skb->pkt_type = PACKET_HOST; | 2464 | skb->pkt_type = PACKET_HOST; |
2465 | skb->nh.ipv6h = iph; | ||
2466 | skb->h.uh = udph; | ||
2463 | 2467 | ||
2464 | if (pkt_dev->nfrags <= 0) | 2468 | if (pkt_dev->nfrags <= 0) |
2465 | pgh = (struct pktgen_hdr *)skb_put(skb, datalen); | 2469 | pgh = (struct pktgen_hdr *)skb_put(skb, datalen); |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 20e5bb73f147..30cc1ba6ed5c 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -394,6 +394,9 @@ static int do_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
394 | } | 394 | } |
395 | 395 | ||
396 | if (ida[IFLA_ADDRESS - 1]) { | 396 | if (ida[IFLA_ADDRESS - 1]) { |
397 | struct sockaddr *sa; | ||
398 | int len; | ||
399 | |||
397 | if (!dev->set_mac_address) { | 400 | if (!dev->set_mac_address) { |
398 | err = -EOPNOTSUPP; | 401 | err = -EOPNOTSUPP; |
399 | goto out; | 402 | goto out; |
@@ -405,7 +408,17 @@ static int do_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
405 | if (ida[IFLA_ADDRESS - 1]->rta_len != RTA_LENGTH(dev->addr_len)) | 408 | if (ida[IFLA_ADDRESS - 1]->rta_len != RTA_LENGTH(dev->addr_len)) |
406 | goto out; | 409 | goto out; |
407 | 410 | ||
408 | err = dev->set_mac_address(dev, RTA_DATA(ida[IFLA_ADDRESS - 1])); | 411 | len = sizeof(sa_family_t) + dev->addr_len; |
412 | sa = kmalloc(len, GFP_KERNEL); | ||
413 | if (!sa) { | ||
414 | err = -ENOMEM; | ||
415 | goto out; | ||
416 | } | ||
417 | sa->sa_family = dev->type; | ||
418 | memcpy(sa->sa_data, RTA_DATA(ida[IFLA_ADDRESS - 1]), | ||
419 | dev->addr_len); | ||
420 | err = dev->set_mac_address(dev, sa); | ||
421 | kfree(sa); | ||
409 | if (err) | 422 | if (err) |
410 | goto out; | 423 | goto out; |
411 | send_addr_notify = 1; | 424 | send_addr_notify = 1; |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 476aa3978504..c54f3664bce5 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -71,13 +71,6 @@ static kmem_cache_t *skbuff_head_cache __read_mostly; | |||
71 | static kmem_cache_t *skbuff_fclone_cache __read_mostly; | 71 | static kmem_cache_t *skbuff_fclone_cache __read_mostly; |
72 | 72 | ||
73 | /* | 73 | /* |
74 | * lockdep: lock class key used by skb_queue_head_init(): | ||
75 | */ | ||
76 | struct lock_class_key skb_queue_lock_key; | ||
77 | |||
78 | EXPORT_SYMBOL(skb_queue_lock_key); | ||
79 | |||
80 | /* | ||
81 | * Keep out-of-line to prevent kernel bloat. | 74 | * Keep out-of-line to prevent kernel bloat. |
82 | * __builtin_return_address is not used because it is not always | 75 | * __builtin_return_address is not used because it is not always |
83 | * reliable. | 76 | * reliable. |
@@ -256,6 +249,31 @@ nodata: | |||
256 | goto out; | 249 | goto out; |
257 | } | 250 | } |
258 | 251 | ||
252 | /** | ||
253 | * __netdev_alloc_skb - allocate an skbuff for rx on a specific device | ||
254 | * @dev: network device to receive on | ||
255 | * @length: length to allocate | ||
256 | * @gfp_mask: get_free_pages mask, passed to alloc_skb | ||
257 | * | ||
258 | * Allocate a new &sk_buff and assign it a usage count of one. The | ||
259 | * buffer has unspecified headroom built in. Users should allocate | ||
260 | * the headroom they think they need without accounting for the | ||
261 | * built in space. The built in space is used for optimisations. | ||
262 | * | ||
263 | * %NULL is returned if there is no free memory. | ||
264 | */ | ||
265 | struct sk_buff *__netdev_alloc_skb(struct net_device *dev, | ||
266 | unsigned int length, gfp_t gfp_mask) | ||
267 | { | ||
268 | struct sk_buff *skb; | ||
269 | |||
270 | skb = alloc_skb(length + NET_SKB_PAD, gfp_mask); | ||
271 | if (likely(skb)) { | ||
272 | skb_reserve(skb, NET_SKB_PAD); | ||
273 | skb->dev = dev; | ||
274 | } | ||
275 | return skb; | ||
276 | } | ||
259 | 277 | ||
260 | static void skb_drop_list(struct sk_buff **listp) | 278 | static void skb_drop_list(struct sk_buff **listp) |
261 | { | 279 | { |
@@ -846,7 +864,11 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len) | |||
846 | unlikely((err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))) | 864 | unlikely((err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))) |
847 | return err; | 865 | return err; |
848 | 866 | ||
849 | for (i = 0; i < nfrags; i++) { | 867 | i = 0; |
868 | if (offset >= len) | ||
869 | goto drop_pages; | ||
870 | |||
871 | for (; i < nfrags; i++) { | ||
850 | int end = offset + skb_shinfo(skb)->frags[i].size; | 872 | int end = offset + skb_shinfo(skb)->frags[i].size; |
851 | 873 | ||
852 | if (end < len) { | 874 | if (end < len) { |
@@ -854,9 +876,9 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len) | |||
854 | continue; | 876 | continue; |
855 | } | 877 | } |
856 | 878 | ||
857 | if (len > offset) | 879 | skb_shinfo(skb)->frags[i++].size = len - offset; |
858 | skb_shinfo(skb)->frags[i++].size = len - offset; | ||
859 | 880 | ||
881 | drop_pages: | ||
860 | skb_shinfo(skb)->nr_frags = i; | 882 | skb_shinfo(skb)->nr_frags = i; |
861 | 883 | ||
862 | for (; i < nfrags; i++) | 884 | for (; i < nfrags; i++) |
@@ -864,7 +886,7 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len) | |||
864 | 886 | ||
865 | if (skb_shinfo(skb)->frag_list) | 887 | if (skb_shinfo(skb)->frag_list) |
866 | skb_drop_fraglist(skb); | 888 | skb_drop_fraglist(skb); |
867 | break; | 889 | goto done; |
868 | } | 890 | } |
869 | 891 | ||
870 | for (fragp = &skb_shinfo(skb)->frag_list; (frag = *fragp); | 892 | for (fragp = &skb_shinfo(skb)->frag_list; (frag = *fragp); |
@@ -879,6 +901,7 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len) | |||
879 | return -ENOMEM; | 901 | return -ENOMEM; |
880 | 902 | ||
881 | nfrag->next = frag->next; | 903 | nfrag->next = frag->next; |
904 | kfree_skb(frag); | ||
882 | frag = nfrag; | 905 | frag = nfrag; |
883 | *fragp = frag; | 906 | *fragp = frag; |
884 | } | 907 | } |
@@ -897,6 +920,7 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len) | |||
897 | break; | 920 | break; |
898 | } | 921 | } |
899 | 922 | ||
923 | done: | ||
900 | if (len > skb_headlen(skb)) { | 924 | if (len > skb_headlen(skb)) { |
901 | skb->data_len -= skb->len - len; | 925 | skb->data_len -= skb->len - len; |
902 | skb->len = len; | 926 | skb->len = len; |
@@ -2042,6 +2066,7 @@ EXPORT_SYMBOL(__kfree_skb); | |||
2042 | EXPORT_SYMBOL(kfree_skb); | 2066 | EXPORT_SYMBOL(kfree_skb); |
2043 | EXPORT_SYMBOL(__pskb_pull_tail); | 2067 | EXPORT_SYMBOL(__pskb_pull_tail); |
2044 | EXPORT_SYMBOL(__alloc_skb); | 2068 | EXPORT_SYMBOL(__alloc_skb); |
2069 | EXPORT_SYMBOL(__netdev_alloc_skb); | ||
2045 | EXPORT_SYMBOL(pskb_copy); | 2070 | EXPORT_SYMBOL(pskb_copy); |
2046 | EXPORT_SYMBOL(pskb_expand_head); | 2071 | EXPORT_SYMBOL(pskb_expand_head); |
2047 | EXPORT_SYMBOL(skb_checksum); | 2072 | EXPORT_SYMBOL(skb_checksum); |
diff --git a/net/core/utils.c b/net/core/utils.c index 4f96f389243d..e31c90e05594 100644 --- a/net/core/utils.c +++ b/net/core/utils.c | |||
@@ -130,12 +130,13 @@ void __init net_random_init(void) | |||
130 | static int net_random_reseed(void) | 130 | static int net_random_reseed(void) |
131 | { | 131 | { |
132 | int i; | 132 | int i; |
133 | unsigned long seed[NR_CPUS]; | 133 | unsigned long seed; |
134 | 134 | ||
135 | get_random_bytes(seed, sizeof(seed)); | ||
136 | for_each_possible_cpu(i) { | 135 | for_each_possible_cpu(i) { |
137 | struct nrnd_state *state = &per_cpu(net_rand_state,i); | 136 | struct nrnd_state *state = &per_cpu(net_rand_state,i); |
138 | __net_srandom(state, seed[i]); | 137 | |
138 | get_random_bytes(&seed, sizeof(seed)); | ||
139 | __net_srandom(state, seed); | ||
139 | } | 140 | } |
140 | return 0; | 141 | return 0; |
141 | } | 142 | } |
diff --git a/net/core/wireless.c b/net/core/wireless.c index d2bc72d318f7..de0bde4b51dd 100644 --- a/net/core/wireless.c +++ b/net/core/wireless.c | |||
@@ -82,6 +82,7 @@ | |||
82 | #include <linux/init.h> /* for __init */ | 82 | #include <linux/init.h> /* for __init */ |
83 | #include <linux/if_arp.h> /* ARPHRD_ETHER */ | 83 | #include <linux/if_arp.h> /* ARPHRD_ETHER */ |
84 | #include <linux/etherdevice.h> /* compare_ether_addr */ | 84 | #include <linux/etherdevice.h> /* compare_ether_addr */ |
85 | #include <linux/interrupt.h> | ||
85 | 86 | ||
86 | #include <linux/wireless.h> /* Pretty obvious */ | 87 | #include <linux/wireless.h> /* Pretty obvious */ |
87 | #include <net/iw_handler.h> /* New driver API */ | 88 | #include <net/iw_handler.h> /* New driver API */ |
@@ -1842,6 +1843,18 @@ int wireless_rtnetlink_set(struct net_device * dev, | |||
1842 | */ | 1843 | */ |
1843 | 1844 | ||
1844 | #ifdef WE_EVENT_RTNETLINK | 1845 | #ifdef WE_EVENT_RTNETLINK |
1846 | static struct sk_buff_head wireless_nlevent_queue; | ||
1847 | |||
1848 | static void wireless_nlevent_process(unsigned long data) | ||
1849 | { | ||
1850 | struct sk_buff *skb; | ||
1851 | |||
1852 | while ((skb = skb_dequeue(&wireless_nlevent_queue))) | ||
1853 | netlink_broadcast(rtnl, skb, 0, RTNLGRP_LINK, GFP_ATOMIC); | ||
1854 | } | ||
1855 | |||
1856 | static DECLARE_TASKLET(wireless_nlevent_tasklet, wireless_nlevent_process, 0); | ||
1857 | |||
1845 | /* ---------------------------------------------------------------- */ | 1858 | /* ---------------------------------------------------------------- */ |
1846 | /* | 1859 | /* |
1847 | * Fill a rtnetlink message with our event data. | 1860 | * Fill a rtnetlink message with our event data. |
@@ -1904,8 +1917,17 @@ static inline void rtmsg_iwinfo(struct net_device * dev, | |||
1904 | return; | 1917 | return; |
1905 | } | 1918 | } |
1906 | NETLINK_CB(skb).dst_group = RTNLGRP_LINK; | 1919 | NETLINK_CB(skb).dst_group = RTNLGRP_LINK; |
1907 | netlink_broadcast(rtnl, skb, 0, RTNLGRP_LINK, GFP_ATOMIC); | 1920 | skb_queue_tail(&wireless_nlevent_queue, skb); |
1921 | tasklet_schedule(&wireless_nlevent_tasklet); | ||
1922 | } | ||
1923 | |||
1924 | static int __init wireless_nlevent_init(void) | ||
1925 | { | ||
1926 | skb_queue_head_init(&wireless_nlevent_queue); | ||
1927 | return 0; | ||
1908 | } | 1928 | } |
1929 | |||
1930 | subsys_initcall(wireless_nlevent_init); | ||
1909 | #endif /* WE_EVENT_RTNETLINK */ | 1931 | #endif /* WE_EVENT_RTNETLINK */ |
1910 | 1932 | ||
1911 | /* ---------------------------------------------------------------- */ | 1933 | /* ---------------------------------------------------------------- */ |
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index 9f3d4d7cd0bf..610c722ac27f 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c | |||
@@ -230,7 +230,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
230 | ipv6_addr_copy(&np->saddr, saddr); | 230 | ipv6_addr_copy(&np->saddr, saddr); |
231 | inet->rcv_saddr = LOOPBACK4_IPV6; | 231 | inet->rcv_saddr = LOOPBACK4_IPV6; |
232 | 232 | ||
233 | ip6_dst_store(sk, dst, NULL); | 233 | __ip6_dst_store(sk, dst, NULL); |
234 | 234 | ||
235 | icsk->icsk_ext_hdr_len = 0; | 235 | icsk->icsk_ext_hdr_len = 0; |
236 | if (np->opt != NULL) | 236 | if (np->opt != NULL) |
@@ -863,7 +863,7 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, | |||
863 | * comment in that function for the gory details. -acme | 863 | * comment in that function for the gory details. -acme |
864 | */ | 864 | */ |
865 | 865 | ||
866 | ip6_dst_store(newsk, dst, NULL); | 866 | __ip6_dst_store(newsk, dst, NULL); |
867 | newsk->sk_route_caps = dst->dev->features & ~(NETIF_F_IP_CSUM | | 867 | newsk->sk_route_caps = dst->dev->features & ~(NETIF_F_IP_CSUM | |
868 | NETIF_F_TSO); | 868 | NETIF_F_TSO); |
869 | newdp6 = (struct dccp6_sock *)newsk; | 869 | newdp6 = (struct dccp6_sock *)newsk; |
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 1355614ec11b..743e9fcf7c5a 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
@@ -925,8 +925,13 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old | |||
925 | for(dev_out = dev_base; dev_out; dev_out = dev_out->next) { | 925 | for(dev_out = dev_base; dev_out; dev_out = dev_out->next) { |
926 | if (!dev_out->dn_ptr) | 926 | if (!dev_out->dn_ptr) |
927 | continue; | 927 | continue; |
928 | if (dn_dev_islocal(dev_out, oldflp->fld_src)) | 928 | if (!dn_dev_islocal(dev_out, oldflp->fld_src)) |
929 | break; | 929 | continue; |
930 | if ((dev_out->flags & IFF_LOOPBACK) && | ||
931 | oldflp->fld_dst && | ||
932 | !dn_dev_islocal(dev_out, oldflp->fld_dst)) | ||
933 | continue; | ||
934 | break; | ||
930 | } | 935 | } |
931 | read_unlock(&dev_base_lock); | 936 | read_unlock(&dev_base_lock); |
932 | if (dev_out == NULL) | 937 | if (dev_out == NULL) |
diff --git a/net/ieee80211/Kconfig b/net/ieee80211/Kconfig index dbb08528ddf5..f7e84e9d13ad 100644 --- a/net/ieee80211/Kconfig +++ b/net/ieee80211/Kconfig | |||
@@ -58,6 +58,7 @@ config IEEE80211_CRYPT_TKIP | |||
58 | depends on IEEE80211 && NET_RADIO | 58 | depends on IEEE80211 && NET_RADIO |
59 | select CRYPTO | 59 | select CRYPTO |
60 | select CRYPTO_MICHAEL_MIC | 60 | select CRYPTO_MICHAEL_MIC |
61 | select CRC32 | ||
61 | ---help--- | 62 | ---help--- |
62 | Include software based cipher suites in support of IEEE 802.11i | 63 | Include software based cipher suites in support of IEEE 802.11i |
63 | (aka TGi, WPA, WPA2, WPA-PSK, etc.) for use with TKIP enabled | 64 | (aka TGi, WPA, WPA2, WPA-PSK, etc.) for use with TKIP enabled |
diff --git a/net/ieee80211/softmac/ieee80211softmac_auth.c b/net/ieee80211/softmac/ieee80211softmac_auth.c index ebc33ca6e692..4cef39e171d0 100644 --- a/net/ieee80211/softmac/ieee80211softmac_auth.c +++ b/net/ieee80211/softmac/ieee80211softmac_auth.c | |||
@@ -116,6 +116,16 @@ ieee80211softmac_auth_queue(void *data) | |||
116 | kfree(auth); | 116 | kfree(auth); |
117 | } | 117 | } |
118 | 118 | ||
119 | /* Sends a response to an auth challenge (for shared key auth). */ | ||
120 | static void | ||
121 | ieee80211softmac_auth_challenge_response(void *_aq) | ||
122 | { | ||
123 | struct ieee80211softmac_auth_queue_item *aq = _aq; | ||
124 | |||
125 | /* Send our response */ | ||
126 | ieee80211softmac_send_mgt_frame(aq->mac, aq->net, IEEE80211_STYPE_AUTH, aq->state); | ||
127 | } | ||
128 | |||
119 | /* Handle the auth response from the AP | 129 | /* Handle the auth response from the AP |
120 | * This should be registered with ieee80211 as handle_auth | 130 | * This should be registered with ieee80211 as handle_auth |
121 | */ | 131 | */ |
@@ -197,24 +207,30 @@ ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth) | |||
197 | case IEEE80211SOFTMAC_AUTH_SHARED_CHALLENGE: | 207 | case IEEE80211SOFTMAC_AUTH_SHARED_CHALLENGE: |
198 | /* Check to make sure we have a challenge IE */ | 208 | /* Check to make sure we have a challenge IE */ |
199 | data = (u8 *)auth->info_element; | 209 | data = (u8 *)auth->info_element; |
200 | if(*data++ != MFIE_TYPE_CHALLENGE){ | 210 | if (*data++ != MFIE_TYPE_CHALLENGE) { |
201 | printkl(KERN_NOTICE PFX "Shared Key Authentication failed due to a missing challenge.\n"); | 211 | printkl(KERN_NOTICE PFX "Shared Key Authentication failed due to a missing challenge.\n"); |
202 | break; | 212 | break; |
203 | } | 213 | } |
204 | /* Save the challenge */ | 214 | /* Save the challenge */ |
205 | spin_lock_irqsave(&mac->lock, flags); | 215 | spin_lock_irqsave(&mac->lock, flags); |
206 | net->challenge_len = *data++; | 216 | net->challenge_len = *data++; |
207 | if(net->challenge_len > WLAN_AUTH_CHALLENGE_LEN) | 217 | if (net->challenge_len > WLAN_AUTH_CHALLENGE_LEN) |
208 | net->challenge_len = WLAN_AUTH_CHALLENGE_LEN; | 218 | net->challenge_len = WLAN_AUTH_CHALLENGE_LEN; |
209 | if(net->challenge != NULL) | 219 | if (net->challenge != NULL) |
210 | kfree(net->challenge); | 220 | kfree(net->challenge); |
211 | net->challenge = kmalloc(net->challenge_len, GFP_ATOMIC); | 221 | net->challenge = kmalloc(net->challenge_len, GFP_ATOMIC); |
212 | memcpy(net->challenge, data, net->challenge_len); | 222 | memcpy(net->challenge, data, net->challenge_len); |
213 | aq->state = IEEE80211SOFTMAC_AUTH_SHARED_RESPONSE; | 223 | aq->state = IEEE80211SOFTMAC_AUTH_SHARED_RESPONSE; |
214 | spin_unlock_irqrestore(&mac->lock, flags); | ||
215 | 224 | ||
216 | /* Send our response */ | 225 | /* We reuse the work struct from the auth request here. |
217 | ieee80211softmac_send_mgt_frame(mac, aq->net, IEEE80211_STYPE_AUTH, aq->state); | 226 | * It is safe to do so as each one is per-request, and |
227 | * at this point (dealing with authentication response) | ||
228 | * we have obviously already sent the initial auth | ||
229 | * request. */ | ||
230 | cancel_delayed_work(&aq->work); | ||
231 | INIT_WORK(&aq->work, &ieee80211softmac_auth_challenge_response, (void *)aq); | ||
232 | schedule_work(&aq->work); | ||
233 | spin_unlock_irqrestore(&mac->lock, flags); | ||
218 | return 0; | 234 | return 0; |
219 | case IEEE80211SOFTMAC_AUTH_SHARED_PASS: | 235 | case IEEE80211SOFTMAC_AUTH_SHARED_PASS: |
220 | kfree(net->challenge); | 236 | kfree(net->challenge); |
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index 9be53a8e72c3..51738000f3dc 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c | |||
@@ -159,7 +159,7 @@ void free_fib_info(struct fib_info *fi) | |||
159 | 159 | ||
160 | void fib_release_info(struct fib_info *fi) | 160 | void fib_release_info(struct fib_info *fi) |
161 | { | 161 | { |
162 | write_lock(&fib_info_lock); | 162 | write_lock_bh(&fib_info_lock); |
163 | if (fi && --fi->fib_treeref == 0) { | 163 | if (fi && --fi->fib_treeref == 0) { |
164 | hlist_del(&fi->fib_hash); | 164 | hlist_del(&fi->fib_hash); |
165 | if (fi->fib_prefsrc) | 165 | if (fi->fib_prefsrc) |
@@ -172,7 +172,7 @@ void fib_release_info(struct fib_info *fi) | |||
172 | fi->fib_dead = 1; | 172 | fi->fib_dead = 1; |
173 | fib_info_put(fi); | 173 | fib_info_put(fi); |
174 | } | 174 | } |
175 | write_unlock(&fib_info_lock); | 175 | write_unlock_bh(&fib_info_lock); |
176 | } | 176 | } |
177 | 177 | ||
178 | static __inline__ int nh_comp(const struct fib_info *fi, const struct fib_info *ofi) | 178 | static __inline__ int nh_comp(const struct fib_info *fi, const struct fib_info *ofi) |
@@ -598,7 +598,7 @@ static void fib_hash_move(struct hlist_head *new_info_hash, | |||
598 | unsigned int old_size = fib_hash_size; | 598 | unsigned int old_size = fib_hash_size; |
599 | unsigned int i, bytes; | 599 | unsigned int i, bytes; |
600 | 600 | ||
601 | write_lock(&fib_info_lock); | 601 | write_lock_bh(&fib_info_lock); |
602 | old_info_hash = fib_info_hash; | 602 | old_info_hash = fib_info_hash; |
603 | old_laddrhash = fib_info_laddrhash; | 603 | old_laddrhash = fib_info_laddrhash; |
604 | fib_hash_size = new_size; | 604 | fib_hash_size = new_size; |
@@ -639,7 +639,7 @@ static void fib_hash_move(struct hlist_head *new_info_hash, | |||
639 | } | 639 | } |
640 | fib_info_laddrhash = new_laddrhash; | 640 | fib_info_laddrhash = new_laddrhash; |
641 | 641 | ||
642 | write_unlock(&fib_info_lock); | 642 | write_unlock_bh(&fib_info_lock); |
643 | 643 | ||
644 | bytes = old_size * sizeof(struct hlist_head *); | 644 | bytes = old_size * sizeof(struct hlist_head *); |
645 | fib_hash_free(old_info_hash, bytes); | 645 | fib_hash_free(old_info_hash, bytes); |
@@ -820,7 +820,7 @@ link_it: | |||
820 | 820 | ||
821 | fi->fib_treeref++; | 821 | fi->fib_treeref++; |
822 | atomic_inc(&fi->fib_clntref); | 822 | atomic_inc(&fi->fib_clntref); |
823 | write_lock(&fib_info_lock); | 823 | write_lock_bh(&fib_info_lock); |
824 | hlist_add_head(&fi->fib_hash, | 824 | hlist_add_head(&fi->fib_hash, |
825 | &fib_info_hash[fib_info_hashfn(fi)]); | 825 | &fib_info_hash[fib_info_hashfn(fi)]); |
826 | if (fi->fib_prefsrc) { | 826 | if (fi->fib_prefsrc) { |
@@ -839,7 +839,7 @@ link_it: | |||
839 | head = &fib_info_devhash[hash]; | 839 | head = &fib_info_devhash[hash]; |
840 | hlist_add_head(&nh->nh_hash, head); | 840 | hlist_add_head(&nh->nh_hash, head); |
841 | } endfor_nexthops(fi) | 841 | } endfor_nexthops(fi) |
842 | write_unlock(&fib_info_lock); | 842 | write_unlock_bh(&fib_info_lock); |
843 | return fi; | 843 | return fi; |
844 | 844 | ||
845 | err_inval: | 845 | err_inval: |
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index 9f4b752f5a33..8e8117c19e4d 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
@@ -1793,29 +1793,35 @@ int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr) | |||
1793 | struct in_device *in_dev; | 1793 | struct in_device *in_dev; |
1794 | u32 group = imr->imr_multiaddr.s_addr; | 1794 | u32 group = imr->imr_multiaddr.s_addr; |
1795 | u32 ifindex; | 1795 | u32 ifindex; |
1796 | int ret = -EADDRNOTAVAIL; | ||
1796 | 1797 | ||
1797 | rtnl_lock(); | 1798 | rtnl_lock(); |
1798 | in_dev = ip_mc_find_dev(imr); | 1799 | in_dev = ip_mc_find_dev(imr); |
1799 | if (!in_dev) { | ||
1800 | rtnl_unlock(); | ||
1801 | return -ENODEV; | ||
1802 | } | ||
1803 | ifindex = imr->imr_ifindex; | 1800 | ifindex = imr->imr_ifindex; |
1804 | for (imlp = &inet->mc_list; (iml = *imlp) != NULL; imlp = &iml->next) { | 1801 | for (imlp = &inet->mc_list; (iml = *imlp) != NULL; imlp = &iml->next) { |
1805 | if (iml->multi.imr_multiaddr.s_addr == group && | 1802 | if (iml->multi.imr_multiaddr.s_addr != group) |
1806 | iml->multi.imr_ifindex == ifindex) { | 1803 | continue; |
1807 | (void) ip_mc_leave_src(sk, iml, in_dev); | 1804 | if (ifindex) { |
1805 | if (iml->multi.imr_ifindex != ifindex) | ||
1806 | continue; | ||
1807 | } else if (imr->imr_address.s_addr && imr->imr_address.s_addr != | ||
1808 | iml->multi.imr_address.s_addr) | ||
1809 | continue; | ||
1810 | |||
1811 | (void) ip_mc_leave_src(sk, iml, in_dev); | ||
1808 | 1812 | ||
1809 | *imlp = iml->next; | 1813 | *imlp = iml->next; |
1810 | 1814 | ||
1815 | if (in_dev) | ||
1811 | ip_mc_dec_group(in_dev, group); | 1816 | ip_mc_dec_group(in_dev, group); |
1812 | rtnl_unlock(); | 1817 | rtnl_unlock(); |
1813 | sock_kfree_s(sk, iml, sizeof(*iml)); | 1818 | sock_kfree_s(sk, iml, sizeof(*iml)); |
1814 | return 0; | 1819 | return 0; |
1815 | } | ||
1816 | } | 1820 | } |
1821 | if (!in_dev) | ||
1822 | ret = -ENODEV; | ||
1817 | rtnl_unlock(); | 1823 | rtnl_unlock(); |
1818 | return -EADDRNOTAVAIL; | 1824 | return ret; |
1819 | } | 1825 | } |
1820 | 1826 | ||
1821 | int ip_mc_source(int add, int omode, struct sock *sk, struct | 1827 | int ip_mc_source(int add, int omode, struct sock *sk, struct |
@@ -2199,13 +2205,13 @@ void ip_mc_drop_socket(struct sock *sk) | |||
2199 | struct in_device *in_dev; | 2205 | struct in_device *in_dev; |
2200 | inet->mc_list = iml->next; | 2206 | inet->mc_list = iml->next; |
2201 | 2207 | ||
2202 | if ((in_dev = inetdev_by_index(iml->multi.imr_ifindex)) != NULL) { | 2208 | in_dev = inetdev_by_index(iml->multi.imr_ifindex); |
2203 | (void) ip_mc_leave_src(sk, iml, in_dev); | 2209 | (void) ip_mc_leave_src(sk, iml, in_dev); |
2210 | if (in_dev != NULL) { | ||
2204 | ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr); | 2211 | ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr); |
2205 | in_dev_put(in_dev); | 2212 | in_dev_put(in_dev); |
2206 | } | 2213 | } |
2207 | sock_kfree_s(sk, iml, sizeof(*iml)); | 2214 | sock_kfree_s(sk, iml, sizeof(*iml)); |
2208 | |||
2209 | } | 2215 | } |
2210 | rtnl_unlock(); | 2216 | rtnl_unlock(); |
2211 | } | 2217 | } |
diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c index 184c78ca79e6..212734ca238f 100644 --- a/net/ipv4/ip_input.c +++ b/net/ipv4/ip_input.c | |||
@@ -429,7 +429,7 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, | |||
429 | } | 429 | } |
430 | 430 | ||
431 | /* Remove any debris in the socket control block */ | 431 | /* Remove any debris in the socket control block */ |
432 | memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); | 432 | memset(IPCB(skb), 0, sizeof(struct inet_skb_parm)); |
433 | 433 | ||
434 | return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL, | 434 | return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL, |
435 | ip_rcv_finish); | 435 | ip_rcv_finish); |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 7c9f9a6421b8..4c20f5546893 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -526,6 +526,8 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)) | |||
526 | 526 | ||
527 | err = output(skb); | 527 | err = output(skb); |
528 | 528 | ||
529 | if (!err) | ||
530 | IP_INC_STATS(IPSTATS_MIB_FRAGCREATES); | ||
529 | if (err || !frag) | 531 | if (err || !frag) |
530 | break; | 532 | break; |
531 | 533 | ||
@@ -649,9 +651,6 @@ slow_path: | |||
649 | /* | 651 | /* |
650 | * Put this fragment into the sending queue. | 652 | * Put this fragment into the sending queue. |
651 | */ | 653 | */ |
652 | |||
653 | IP_INC_STATS(IPSTATS_MIB_FRAGCREATES); | ||
654 | |||
655 | iph->tot_len = htons(len + hlen); | 654 | iph->tot_len = htons(len + hlen); |
656 | 655 | ||
657 | ip_send_check(iph); | 656 | ip_send_check(iph); |
@@ -659,6 +658,8 @@ slow_path: | |||
659 | err = output(skb2); | 658 | err = output(skb2); |
660 | if (err) | 659 | if (err) |
661 | goto fail; | 660 | goto fail; |
661 | |||
662 | IP_INC_STATS(IPSTATS_MIB_FRAGCREATES); | ||
662 | } | 663 | } |
663 | kfree_skb(skb); | 664 | kfree_skb(skb); |
664 | IP_INC_STATS(IPSTATS_MIB_FRAGOKS); | 665 | IP_INC_STATS(IPSTATS_MIB_FRAGOKS); |
@@ -946,7 +947,7 @@ alloc_new_skb: | |||
946 | skb_prev->csum = csum_sub(skb_prev->csum, | 947 | skb_prev->csum = csum_sub(skb_prev->csum, |
947 | skb->csum); | 948 | skb->csum); |
948 | data += fraggap; | 949 | data += fraggap; |
949 | skb_trim(skb_prev, maxfraglen); | 950 | pskb_trim_unique(skb_prev, maxfraglen); |
950 | } | 951 | } |
951 | 952 | ||
952 | copy = datalen - transhdrlen - fraggap; | 953 | copy = datalen - transhdrlen - fraggap; |
@@ -1141,7 +1142,7 @@ ssize_t ip_append_page(struct sock *sk, struct page *page, | |||
1141 | data, fraggap, 0); | 1142 | data, fraggap, 0); |
1142 | skb_prev->csum = csum_sub(skb_prev->csum, | 1143 | skb_prev->csum = csum_sub(skb_prev->csum, |
1143 | skb->csum); | 1144 | skb->csum); |
1144 | skb_trim(skb_prev, maxfraglen); | 1145 | pskb_trim_unique(skb_prev, maxfraglen); |
1145 | } | 1146 | } |
1146 | 1147 | ||
1147 | /* | 1148 | /* |
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index 84f43a3c9098..2d05c4133d3e 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c | |||
@@ -112,14 +112,19 @@ static void ip_cmsg_recv_retopts(struct msghdr *msg, struct sk_buff *skb) | |||
112 | static void ip_cmsg_recv_security(struct msghdr *msg, struct sk_buff *skb) | 112 | static void ip_cmsg_recv_security(struct msghdr *msg, struct sk_buff *skb) |
113 | { | 113 | { |
114 | char *secdata; | 114 | char *secdata; |
115 | u32 seclen; | 115 | u32 seclen, secid; |
116 | int err; | 116 | int err; |
117 | 117 | ||
118 | err = security_socket_getpeersec_dgram(skb, &secdata, &seclen); | 118 | err = security_socket_getpeersec_dgram(NULL, skb, &secid); |
119 | if (err) | ||
120 | return; | ||
121 | |||
122 | err = security_secid_to_secctx(secid, &secdata, &seclen); | ||
119 | if (err) | 123 | if (err) |
120 | return; | 124 | return; |
121 | 125 | ||
122 | put_cmsg(msg, SOL_IP, SCM_SECURITY, seclen, secdata); | 126 | put_cmsg(msg, SOL_IP, SCM_SECURITY, seclen, secdata); |
127 | security_release_secctx(secdata, seclen); | ||
123 | } | 128 | } |
124 | 129 | ||
125 | 130 | ||
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 9ccacf57f08b..85893eef6b16 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
@@ -1578,6 +1578,7 @@ int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait) | |||
1578 | cache = ipmr_cache_find(rt->rt_src, rt->rt_dst); | 1578 | cache = ipmr_cache_find(rt->rt_src, rt->rt_dst); |
1579 | 1579 | ||
1580 | if (cache==NULL) { | 1580 | if (cache==NULL) { |
1581 | struct sk_buff *skb2; | ||
1581 | struct net_device *dev; | 1582 | struct net_device *dev; |
1582 | int vif; | 1583 | int vif; |
1583 | 1584 | ||
@@ -1591,12 +1592,18 @@ int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait) | |||
1591 | read_unlock(&mrt_lock); | 1592 | read_unlock(&mrt_lock); |
1592 | return -ENODEV; | 1593 | return -ENODEV; |
1593 | } | 1594 | } |
1594 | skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); | 1595 | skb2 = skb_clone(skb, GFP_ATOMIC); |
1595 | skb->nh.iph->ihl = sizeof(struct iphdr)>>2; | 1596 | if (!skb2) { |
1596 | skb->nh.iph->saddr = rt->rt_src; | 1597 | read_unlock(&mrt_lock); |
1597 | skb->nh.iph->daddr = rt->rt_dst; | 1598 | return -ENOMEM; |
1598 | skb->nh.iph->version = 0; | 1599 | } |
1599 | err = ipmr_cache_unresolved(vif, skb); | 1600 | |
1601 | skb2->nh.raw = skb_push(skb2, sizeof(struct iphdr)); | ||
1602 | skb2->nh.iph->ihl = sizeof(struct iphdr)>>2; | ||
1603 | skb2->nh.iph->saddr = rt->rt_src; | ||
1604 | skb2->nh.iph->daddr = rt->rt_dst; | ||
1605 | skb2->nh.iph->version = 0; | ||
1606 | err = ipmr_cache_unresolved(vif, skb2); | ||
1600 | read_unlock(&mrt_lock); | 1607 | read_unlock(&mrt_lock); |
1601 | return err; | 1608 | return err; |
1602 | } | 1609 | } |
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index 80c73ca90116..df4854cf598b 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c | |||
@@ -1170,21 +1170,34 @@ static int __init arp_tables_init(void) | |||
1170 | { | 1170 | { |
1171 | int ret; | 1171 | int ret; |
1172 | 1172 | ||
1173 | xt_proto_init(NF_ARP); | 1173 | ret = xt_proto_init(NF_ARP); |
1174 | if (ret < 0) | ||
1175 | goto err1; | ||
1174 | 1176 | ||
1175 | /* Noone else will be downing sem now, so we won't sleep */ | 1177 | /* Noone else will be downing sem now, so we won't sleep */ |
1176 | xt_register_target(&arpt_standard_target); | 1178 | ret = xt_register_target(&arpt_standard_target); |
1177 | xt_register_target(&arpt_error_target); | 1179 | if (ret < 0) |
1180 | goto err2; | ||
1181 | ret = xt_register_target(&arpt_error_target); | ||
1182 | if (ret < 0) | ||
1183 | goto err3; | ||
1178 | 1184 | ||
1179 | /* Register setsockopt */ | 1185 | /* Register setsockopt */ |
1180 | ret = nf_register_sockopt(&arpt_sockopts); | 1186 | ret = nf_register_sockopt(&arpt_sockopts); |
1181 | if (ret < 0) { | 1187 | if (ret < 0) |
1182 | duprintf("Unable to register sockopts.\n"); | 1188 | goto err4; |
1183 | return ret; | ||
1184 | } | ||
1185 | 1189 | ||
1186 | printk("arp_tables: (C) 2002 David S. Miller\n"); | 1190 | printk("arp_tables: (C) 2002 David S. Miller\n"); |
1187 | return 0; | 1191 | return 0; |
1192 | |||
1193 | err4: | ||
1194 | xt_unregister_target(&arpt_error_target); | ||
1195 | err3: | ||
1196 | xt_unregister_target(&arpt_standard_target); | ||
1197 | err2: | ||
1198 | xt_proto_fini(NF_ARP); | ||
1199 | err1: | ||
1200 | return ret; | ||
1188 | } | 1201 | } |
1189 | 1202 | ||
1190 | static void __exit arp_tables_fini(void) | 1203 | static void __exit arp_tables_fini(void) |
diff --git a/net/ipv4/netfilter/ip_conntrack_helper_h323.c b/net/ipv4/netfilter/ip_conntrack_helper_h323.c index af35235672d5..9a39e2969712 100644 --- a/net/ipv4/netfilter/ip_conntrack_helper_h323.c +++ b/net/ipv4/netfilter/ip_conntrack_helper_h323.c | |||
@@ -1200,7 +1200,7 @@ static struct ip_conntrack_expect *find_expect(struct ip_conntrack *ct, | |||
1200 | tuple.dst.protonum = IPPROTO_TCP; | 1200 | tuple.dst.protonum = IPPROTO_TCP; |
1201 | 1201 | ||
1202 | exp = __ip_conntrack_expect_find(&tuple); | 1202 | exp = __ip_conntrack_expect_find(&tuple); |
1203 | if (exp->master == ct) | 1203 | if (exp && exp->master == ct) |
1204 | return exp; | 1204 | return exp; |
1205 | return NULL; | 1205 | return NULL; |
1206 | } | 1206 | } |
diff --git a/net/ipv4/netfilter/ip_conntrack_netlink.c b/net/ipv4/netfilter/ip_conntrack_netlink.c index 33891bb1fde4..0d4cc92391fa 100644 --- a/net/ipv4/netfilter/ip_conntrack_netlink.c +++ b/net/ipv4/netfilter/ip_conntrack_netlink.c | |||
@@ -415,21 +415,18 @@ ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb) | |||
415 | cb->args[0], *id); | 415 | cb->args[0], *id); |
416 | 416 | ||
417 | read_lock_bh(&ip_conntrack_lock); | 417 | read_lock_bh(&ip_conntrack_lock); |
418 | last = (struct ip_conntrack *)cb->args[1]; | ||
418 | for (; cb->args[0] < ip_conntrack_htable_size; cb->args[0]++) { | 419 | for (; cb->args[0] < ip_conntrack_htable_size; cb->args[0]++) { |
419 | restart: | 420 | restart: |
420 | last = (struct ip_conntrack *)cb->args[1]; | ||
421 | list_for_each_prev(i, &ip_conntrack_hash[cb->args[0]]) { | 421 | list_for_each_prev(i, &ip_conntrack_hash[cb->args[0]]) { |
422 | h = (struct ip_conntrack_tuple_hash *) i; | 422 | h = (struct ip_conntrack_tuple_hash *) i; |
423 | if (DIRECTION(h) != IP_CT_DIR_ORIGINAL) | 423 | if (DIRECTION(h) != IP_CT_DIR_ORIGINAL) |
424 | continue; | 424 | continue; |
425 | ct = tuplehash_to_ctrack(h); | 425 | ct = tuplehash_to_ctrack(h); |
426 | if (last != NULL) { | 426 | if (cb->args[1]) { |
427 | if (ct == last) { | 427 | if (ct != last) |
428 | ip_conntrack_put(last); | ||
429 | cb->args[1] = 0; | ||
430 | last = NULL; | ||
431 | } else | ||
432 | continue; | 428 | continue; |
429 | cb->args[1] = 0; | ||
433 | } | 430 | } |
434 | if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid, | 431 | if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid, |
435 | cb->nlh->nlmsg_seq, | 432 | cb->nlh->nlmsg_seq, |
@@ -440,17 +437,17 @@ restart: | |||
440 | goto out; | 437 | goto out; |
441 | } | 438 | } |
442 | } | 439 | } |
443 | if (last != NULL) { | 440 | if (cb->args[1]) { |
444 | ip_conntrack_put(last); | ||
445 | cb->args[1] = 0; | 441 | cb->args[1] = 0; |
446 | goto restart; | 442 | goto restart; |
447 | } | 443 | } |
448 | } | 444 | } |
449 | out: | 445 | out: |
450 | read_unlock_bh(&ip_conntrack_lock); | 446 | read_unlock_bh(&ip_conntrack_lock); |
447 | if (last) | ||
448 | ip_conntrack_put(last); | ||
451 | 449 | ||
452 | DEBUGP("leaving, last bucket=%lu id=%u\n", cb->args[0], *id); | 450 | DEBUGP("leaving, last bucket=%lu id=%u\n", cb->args[0], *id); |
453 | |||
454 | return skb->len; | 451 | return skb->len; |
455 | } | 452 | } |
456 | 453 | ||
diff --git a/net/ipv4/netfilter/ip_conntrack_sip.c b/net/ipv4/netfilter/ip_conntrack_sip.c index fc87ce0da40d..4f222d6be009 100644 --- a/net/ipv4/netfilter/ip_conntrack_sip.c +++ b/net/ipv4/netfilter/ip_conntrack_sip.c | |||
@@ -442,7 +442,7 @@ static int __init init(void) | |||
442 | sip[i].tuple.src.u.udp.port = htons(ports[i]); | 442 | sip[i].tuple.src.u.udp.port = htons(ports[i]); |
443 | sip[i].mask.src.u.udp.port = 0xFFFF; | 443 | sip[i].mask.src.u.udp.port = 0xFFFF; |
444 | sip[i].mask.dst.protonum = 0xFF; | 444 | sip[i].mask.dst.protonum = 0xFF; |
445 | sip[i].max_expected = 1; | 445 | sip[i].max_expected = 2; |
446 | sip[i].timeout = 3 * 60; /* 3 minutes */ | 446 | sip[i].timeout = 3 * 60; /* 3 minutes */ |
447 | sip[i].me = THIS_MODULE; | 447 | sip[i].me = THIS_MODULE; |
448 | sip[i].help = sip_help; | 448 | sip[i].help = sip_help; |
diff --git a/net/ipv4/netfilter/ip_conntrack_standalone.c b/net/ipv4/netfilter/ip_conntrack_standalone.c index 7bd3c22003a2..7a9fa04a467a 100644 --- a/net/ipv4/netfilter/ip_conntrack_standalone.c +++ b/net/ipv4/netfilter/ip_conntrack_standalone.c | |||
@@ -534,6 +534,8 @@ static struct nf_hook_ops ip_conntrack_ops[] = { | |||
534 | 534 | ||
535 | /* Sysctl support */ | 535 | /* Sysctl support */ |
536 | 536 | ||
537 | int ip_conntrack_checksum = 1; | ||
538 | |||
537 | #ifdef CONFIG_SYSCTL | 539 | #ifdef CONFIG_SYSCTL |
538 | 540 | ||
539 | /* From ip_conntrack_core.c */ | 541 | /* From ip_conntrack_core.c */ |
@@ -568,8 +570,6 @@ extern unsigned int ip_ct_generic_timeout; | |||
568 | static int log_invalid_proto_min = 0; | 570 | static int log_invalid_proto_min = 0; |
569 | static int log_invalid_proto_max = 255; | 571 | static int log_invalid_proto_max = 255; |
570 | 572 | ||
571 | int ip_conntrack_checksum = 1; | ||
572 | |||
573 | static struct ctl_table_header *ip_ct_sysctl_header; | 573 | static struct ctl_table_header *ip_ct_sysctl_header; |
574 | 574 | ||
575 | static ctl_table ip_ct_sysctl_table[] = { | 575 | static ctl_table ip_ct_sysctl_table[] = { |
diff --git a/net/ipv4/netfilter/ip_nat_snmp_basic.c b/net/ipv4/netfilter/ip_nat_snmp_basic.c index 0b1b416759cc..18b7fbdccb61 100644 --- a/net/ipv4/netfilter/ip_nat_snmp_basic.c +++ b/net/ipv4/netfilter/ip_nat_snmp_basic.c | |||
@@ -1255,9 +1255,9 @@ static int help(struct sk_buff **pskb, | |||
1255 | struct udphdr *udph = (struct udphdr *)((u_int32_t *)iph + iph->ihl); | 1255 | struct udphdr *udph = (struct udphdr *)((u_int32_t *)iph + iph->ihl); |
1256 | 1256 | ||
1257 | /* SNMP replies and originating SNMP traps get mangled */ | 1257 | /* SNMP replies and originating SNMP traps get mangled */ |
1258 | if (udph->source == ntohs(SNMP_PORT) && dir != IP_CT_DIR_REPLY) | 1258 | if (udph->source == htons(SNMP_PORT) && dir != IP_CT_DIR_REPLY) |
1259 | return NF_ACCEPT; | 1259 | return NF_ACCEPT; |
1260 | if (udph->dest == ntohs(SNMP_TRAP_PORT) && dir != IP_CT_DIR_ORIGINAL) | 1260 | if (udph->dest == htons(SNMP_TRAP_PORT) && dir != IP_CT_DIR_ORIGINAL) |
1261 | return NF_ACCEPT; | 1261 | return NF_ACCEPT; |
1262 | 1262 | ||
1263 | /* No NAT? */ | 1263 | /* No NAT? */ |
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index fc5bdd5eb7d3..048514f15f2f 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c | |||
@@ -230,7 +230,7 @@ ipt_do_table(struct sk_buff **pskb, | |||
230 | const char *indev, *outdev; | 230 | const char *indev, *outdev; |
231 | void *table_base; | 231 | void *table_base; |
232 | struct ipt_entry *e, *back; | 232 | struct ipt_entry *e, *back; |
233 | struct xt_table_info *private = table->private; | 233 | struct xt_table_info *private; |
234 | 234 | ||
235 | /* Initialization */ | 235 | /* Initialization */ |
236 | ip = (*pskb)->nh.iph; | 236 | ip = (*pskb)->nh.iph; |
@@ -247,6 +247,7 @@ ipt_do_table(struct sk_buff **pskb, | |||
247 | 247 | ||
248 | read_lock_bh(&table->lock); | 248 | read_lock_bh(&table->lock); |
249 | IP_NF_ASSERT(table->valid_hooks & (1 << hook)); | 249 | IP_NF_ASSERT(table->valid_hooks & (1 << hook)); |
250 | private = table->private; | ||
250 | table_base = (void *)private->entries[smp_processor_id()]; | 251 | table_base = (void *)private->entries[smp_processor_id()]; |
251 | e = get_entry(table_base, private->hook_entry[hook]); | 252 | e = get_entry(table_base, private->hook_entry[hook]); |
252 | 253 | ||
@@ -2239,22 +2240,39 @@ static int __init ip_tables_init(void) | |||
2239 | { | 2240 | { |
2240 | int ret; | 2241 | int ret; |
2241 | 2242 | ||
2242 | xt_proto_init(AF_INET); | 2243 | ret = xt_proto_init(AF_INET); |
2244 | if (ret < 0) | ||
2245 | goto err1; | ||
2243 | 2246 | ||
2244 | /* Noone else will be downing sem now, so we won't sleep */ | 2247 | /* Noone else will be downing sem now, so we won't sleep */ |
2245 | xt_register_target(&ipt_standard_target); | 2248 | ret = xt_register_target(&ipt_standard_target); |
2246 | xt_register_target(&ipt_error_target); | 2249 | if (ret < 0) |
2247 | xt_register_match(&icmp_matchstruct); | 2250 | goto err2; |
2251 | ret = xt_register_target(&ipt_error_target); | ||
2252 | if (ret < 0) | ||
2253 | goto err3; | ||
2254 | ret = xt_register_match(&icmp_matchstruct); | ||
2255 | if (ret < 0) | ||
2256 | goto err4; | ||
2248 | 2257 | ||
2249 | /* Register setsockopt */ | 2258 | /* Register setsockopt */ |
2250 | ret = nf_register_sockopt(&ipt_sockopts); | 2259 | ret = nf_register_sockopt(&ipt_sockopts); |
2251 | if (ret < 0) { | 2260 | if (ret < 0) |
2252 | duprintf("Unable to register sockopts.\n"); | 2261 | goto err5; |
2253 | return ret; | ||
2254 | } | ||
2255 | 2262 | ||
2256 | printk("ip_tables: (C) 2000-2006 Netfilter Core Team\n"); | 2263 | printk("ip_tables: (C) 2000-2006 Netfilter Core Team\n"); |
2257 | return 0; | 2264 | return 0; |
2265 | |||
2266 | err5: | ||
2267 | xt_unregister_match(&icmp_matchstruct); | ||
2268 | err4: | ||
2269 | xt_unregister_target(&ipt_error_target); | ||
2270 | err3: | ||
2271 | xt_unregister_target(&ipt_standard_target); | ||
2272 | err2: | ||
2273 | xt_proto_fini(AF_INET); | ||
2274 | err1: | ||
2275 | return ret; | ||
2258 | } | 2276 | } |
2259 | 2277 | ||
2260 | static void __exit ip_tables_fini(void) | 2278 | static void __exit ip_tables_fini(void) |
diff --git a/net/ipv4/netfilter/ipt_ULOG.c b/net/ipv4/netfilter/ipt_ULOG.c index d7dd7fe7051c..d46fd677fa11 100644 --- a/net/ipv4/netfilter/ipt_ULOG.c +++ b/net/ipv4/netfilter/ipt_ULOG.c | |||
@@ -115,6 +115,11 @@ static void ulog_send(unsigned int nlgroupnum) | |||
115 | del_timer(&ub->timer); | 115 | del_timer(&ub->timer); |
116 | } | 116 | } |
117 | 117 | ||
118 | if (!ub->skb) { | ||
119 | DEBUGP("ipt_ULOG: ulog_send: nothing to send\n"); | ||
120 | return; | ||
121 | } | ||
122 | |||
118 | /* last nlmsg needs NLMSG_DONE */ | 123 | /* last nlmsg needs NLMSG_DONE */ |
119 | if (ub->qlen > 1) | 124 | if (ub->qlen > 1) |
120 | ub->lastnlh->nlmsg_type = NLMSG_DONE; | 125 | ub->lastnlh->nlmsg_type = NLMSG_DONE; |
diff --git a/net/ipv4/netfilter/ipt_hashlimit.c b/net/ipv4/netfilter/ipt_hashlimit.c index 92980ab8ce48..3bd2368e1fc9 100644 --- a/net/ipv4/netfilter/ipt_hashlimit.c +++ b/net/ipv4/netfilter/ipt_hashlimit.c | |||
@@ -454,15 +454,12 @@ hashlimit_match(const struct sk_buff *skb, | |||
454 | dh->rateinfo.credit_cap = user2credits(hinfo->cfg.avg * | 454 | dh->rateinfo.credit_cap = user2credits(hinfo->cfg.avg * |
455 | hinfo->cfg.burst); | 455 | hinfo->cfg.burst); |
456 | dh->rateinfo.cost = user2credits(hinfo->cfg.avg); | 456 | dh->rateinfo.cost = user2credits(hinfo->cfg.avg); |
457 | 457 | } else { | |
458 | spin_unlock_bh(&hinfo->lock); | 458 | /* update expiration timeout */ |
459 | return 1; | 459 | dh->expires = now + msecs_to_jiffies(hinfo->cfg.expire); |
460 | rateinfo_recalc(dh, now); | ||
460 | } | 461 | } |
461 | 462 | ||
462 | /* update expiration timeout */ | ||
463 | dh->expires = now + msecs_to_jiffies(hinfo->cfg.expire); | ||
464 | |||
465 | rateinfo_recalc(dh, now); | ||
466 | if (dh->rateinfo.credit >= dh->rateinfo.cost) { | 463 | if (dh->rateinfo.credit >= dh->rateinfo.cost) { |
467 | /* We're underlimit. */ | 464 | /* We're underlimit. */ |
468 | dh->rateinfo.credit -= dh->rateinfo.cost; | 465 | dh->rateinfo.credit -= dh->rateinfo.cost; |
@@ -508,6 +505,9 @@ hashlimit_checkentry(const char *tablename, | |||
508 | if (!r->cfg.expire) | 505 | if (!r->cfg.expire) |
509 | return 0; | 506 | return 0; |
510 | 507 | ||
508 | if (r->name[sizeof(r->name) - 1] != '\0') | ||
509 | return 0; | ||
510 | |||
511 | /* This is the best we've got: We cannot release and re-grab lock, | 511 | /* This is the best we've got: We cannot release and re-grab lock, |
512 | * since checkentry() is called before ip_tables.c grabs ipt_mutex. | 512 | * since checkentry() is called before ip_tables.c grabs ipt_mutex. |
513 | * We also cannot grab the hashtable spinlock, since htable_create will | 513 | * We also cannot grab the hashtable spinlock, since htable_create will |
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index bd221ec3f81e..62b2762a2420 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
@@ -609,6 +609,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
609 | if (sin) { | 609 | if (sin) { |
610 | sin->sin_family = AF_INET; | 610 | sin->sin_family = AF_INET; |
611 | sin->sin_addr.s_addr = skb->nh.iph->saddr; | 611 | sin->sin_addr.s_addr = skb->nh.iph->saddr; |
612 | sin->sin_port = 0; | ||
612 | memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); | 613 | memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); |
613 | } | 614 | } |
614 | if (inet->cmsg_flags) | 615 | if (inet->cmsg_flags) |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 2dc6dbb28467..b873cbcdd0b8 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -104,6 +104,7 @@ | |||
104 | #include <net/icmp.h> | 104 | #include <net/icmp.h> |
105 | #include <net/xfrm.h> | 105 | #include <net/xfrm.h> |
106 | #include <net/ip_mp_alg.h> | 106 | #include <net/ip_mp_alg.h> |
107 | #include <net/netevent.h> | ||
107 | #ifdef CONFIG_SYSCTL | 108 | #ifdef CONFIG_SYSCTL |
108 | #include <linux/sysctl.h> | 109 | #include <linux/sysctl.h> |
109 | #endif | 110 | #endif |
@@ -1125,6 +1126,7 @@ void ip_rt_redirect(u32 old_gw, u32 daddr, u32 new_gw, | |||
1125 | struct rtable *rth, **rthp; | 1126 | struct rtable *rth, **rthp; |
1126 | u32 skeys[2] = { saddr, 0 }; | 1127 | u32 skeys[2] = { saddr, 0 }; |
1127 | int ikeys[2] = { dev->ifindex, 0 }; | 1128 | int ikeys[2] = { dev->ifindex, 0 }; |
1129 | struct netevent_redirect netevent; | ||
1128 | 1130 | ||
1129 | if (!in_dev) | 1131 | if (!in_dev) |
1130 | return; | 1132 | return; |
@@ -1216,6 +1218,11 @@ void ip_rt_redirect(u32 old_gw, u32 daddr, u32 new_gw, | |||
1216 | rt_drop(rt); | 1218 | rt_drop(rt); |
1217 | goto do_next; | 1219 | goto do_next; |
1218 | } | 1220 | } |
1221 | |||
1222 | netevent.old = &rth->u.dst; | ||
1223 | netevent.new = &rt->u.dst; | ||
1224 | call_netevent_notifiers(NETEVENT_REDIRECT, | ||
1225 | &netevent); | ||
1219 | 1226 | ||
1220 | rt_del(hash, rth); | 1227 | rt_del(hash, rth); |
1221 | if (!rt_intern_hash(hash, rt, &rt)) | 1228 | if (!rt_intern_hash(hash, rt, &rt)) |
@@ -1452,6 +1459,7 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu) | |||
1452 | } | 1459 | } |
1453 | dst->metrics[RTAX_MTU-1] = mtu; | 1460 | dst->metrics[RTAX_MTU-1] = mtu; |
1454 | dst_set_expires(dst, ip_rt_mtu_expires); | 1461 | dst_set_expires(dst, ip_rt_mtu_expires); |
1462 | call_netevent_notifiers(NETEVENT_PMTU_UPDATE, dst); | ||
1455 | } | 1463 | } |
1456 | } | 1464 | } |
1457 | 1465 | ||
@@ -3149,7 +3157,7 @@ int __init ip_rt_init(void) | |||
3149 | rhash_entries, | 3157 | rhash_entries, |
3150 | (num_physpages >= 128 * 1024) ? | 3158 | (num_physpages >= 128 * 1024) ? |
3151 | 15 : 17, | 3159 | 15 : 17, |
3152 | HASH_HIGHMEM, | 3160 | 0, |
3153 | &rt_hash_log, | 3161 | &rt_hash_log, |
3154 | &rt_hash_mask, | 3162 | &rt_hash_mask, |
3155 | 0); | 3163 | 0); |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index f6a2d9223d07..934396bb1376 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -1132,7 +1132,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
1132 | tp->ucopy.dma_chan = NULL; | 1132 | tp->ucopy.dma_chan = NULL; |
1133 | preempt_disable(); | 1133 | preempt_disable(); |
1134 | if ((len > sysctl_tcp_dma_copybreak) && !(flags & MSG_PEEK) && | 1134 | if ((len > sysctl_tcp_dma_copybreak) && !(flags & MSG_PEEK) && |
1135 | !sysctl_tcp_low_latency && __get_cpu_var(softnet_data.net_dma)) { | 1135 | !sysctl_tcp_low_latency && __get_cpu_var(softnet_data).net_dma) { |
1136 | preempt_enable_no_resched(); | 1136 | preempt_enable_no_resched(); |
1137 | tp->ucopy.pinned_list = dma_pin_iovec_pages(msg->msg_iov, len); | 1137 | tp->ucopy.pinned_list = dma_pin_iovec_pages(msg->msg_iov, len); |
1138 | } else | 1138 | } else |
@@ -1659,7 +1659,8 @@ adjudge_to_death: | |||
1659 | const int tmo = tcp_fin_time(sk); | 1659 | const int tmo = tcp_fin_time(sk); |
1660 | 1660 | ||
1661 | if (tmo > TCP_TIMEWAIT_LEN) { | 1661 | if (tmo > TCP_TIMEWAIT_LEN) { |
1662 | inet_csk_reset_keepalive_timer(sk, tcp_fin_time(sk)); | 1662 | inet_csk_reset_keepalive_timer(sk, |
1663 | tmo - TCP_TIMEWAIT_LEN); | ||
1663 | } else { | 1664 | } else { |
1664 | tcp_time_wait(sk, TCP_FIN_WAIT2, tmo); | 1665 | tcp_time_wait(sk, TCP_FIN_WAIT2, tmo); |
1665 | goto out; | 1666 | goto out; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 738dad9f7d49..104af5d5bcbc 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -3541,7 +3541,8 @@ void tcp_cwnd_application_limited(struct sock *sk) | |||
3541 | if (inet_csk(sk)->icsk_ca_state == TCP_CA_Open && | 3541 | if (inet_csk(sk)->icsk_ca_state == TCP_CA_Open && |
3542 | sk->sk_socket && !test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) { | 3542 | sk->sk_socket && !test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) { |
3543 | /* Limited by application or receiver window. */ | 3543 | /* Limited by application or receiver window. */ |
3544 | u32 win_used = max(tp->snd_cwnd_used, 2U); | 3544 | u32 init_win = tcp_init_cwnd(tp, __sk_dst_get(sk)); |
3545 | u32 win_used = max(tp->snd_cwnd_used, init_win); | ||
3545 | if (win_used < tp->snd_cwnd) { | 3546 | if (win_used < tp->snd_cwnd) { |
3546 | tp->snd_ssthresh = tcp_current_ssthresh(sk); | 3547 | tp->snd_ssthresh = tcp_current_ssthresh(sk); |
3547 | tp->snd_cwnd = (tp->snd_cwnd + win_used) >> 1; | 3548 | tp->snd_cwnd = (tp->snd_cwnd + win_used) >> 1; |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index f6f39e814291..4b04c3edd4a9 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -438,7 +438,6 @@ void tcp_v4_err(struct sk_buff *skb, u32 info) | |||
438 | It can f.e. if SYNs crossed. | 438 | It can f.e. if SYNs crossed. |
439 | */ | 439 | */ |
440 | if (!sock_owned_by_user(sk)) { | 440 | if (!sock_owned_by_user(sk)) { |
441 | TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); | ||
442 | sk->sk_err = err; | 441 | sk->sk_err = err; |
443 | 442 | ||
444 | sk->sk_error_report(sk); | 443 | sk->sk_error_report(sk); |
@@ -874,7 +873,6 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) | |||
874 | drop_and_free: | 873 | drop_and_free: |
875 | reqsk_free(req); | 874 | reqsk_free(req); |
876 | drop: | 875 | drop: |
877 | TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); | ||
878 | return 0; | 876 | return 0; |
879 | } | 877 | } |
880 | 878 | ||
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index 0ccb7cb22b15..624e2b2c7f53 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c | |||
@@ -589,8 +589,10 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb, | |||
589 | /* RFC793: "second check the RST bit" and | 589 | /* RFC793: "second check the RST bit" and |
590 | * "fourth, check the SYN bit" | 590 | * "fourth, check the SYN bit" |
591 | */ | 591 | */ |
592 | if (flg & (TCP_FLAG_RST|TCP_FLAG_SYN)) | 592 | if (flg & (TCP_FLAG_RST|TCP_FLAG_SYN)) { |
593 | TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); | ||
593 | goto embryonic_reset; | 594 | goto embryonic_reset; |
595 | } | ||
594 | 596 | ||
595 | /* ACK sequence verified above, just make sure ACK is | 597 | /* ACK sequence verified above, just make sure ACK is |
596 | * set. If ACK not set, just silently drop the packet. | 598 | * set. If ACK not set, just silently drop the packet. |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 5c08ea20a18d..507adefbc17c 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -466,7 +466,8 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, | |||
466 | if (skb->len != tcp_header_size) | 466 | if (skb->len != tcp_header_size) |
467 | tcp_event_data_sent(tp, skb, sk); | 467 | tcp_event_data_sent(tp, skb, sk); |
468 | 468 | ||
469 | TCP_INC_STATS(TCP_MIB_OUTSEGS); | 469 | if (after(tcb->end_seq, tp->snd_nxt) || tcb->seq == tcb->end_seq) |
470 | TCP_INC_STATS(TCP_MIB_OUTSEGS); | ||
470 | 471 | ||
471 | err = icsk->icsk_af_ops->queue_xmit(skb, 0); | 472 | err = icsk->icsk_af_ops->queue_xmit(skb, 0); |
472 | if (likely(err <= 0)) | 473 | if (likely(err <= 0)) |
@@ -2157,10 +2158,9 @@ int tcp_connect(struct sock *sk) | |||
2157 | skb_shinfo(buff)->gso_size = 0; | 2158 | skb_shinfo(buff)->gso_size = 0; |
2158 | skb_shinfo(buff)->gso_type = 0; | 2159 | skb_shinfo(buff)->gso_type = 0; |
2159 | buff->csum = 0; | 2160 | buff->csum = 0; |
2161 | tp->snd_nxt = tp->write_seq; | ||
2160 | TCP_SKB_CB(buff)->seq = tp->write_seq++; | 2162 | TCP_SKB_CB(buff)->seq = tp->write_seq++; |
2161 | TCP_SKB_CB(buff)->end_seq = tp->write_seq; | 2163 | TCP_SKB_CB(buff)->end_seq = tp->write_seq; |
2162 | tp->snd_nxt = tp->write_seq; | ||
2163 | tp->pushed_seq = tp->write_seq; | ||
2164 | 2164 | ||
2165 | /* Send it off. */ | 2165 | /* Send it off. */ |
2166 | TCP_SKB_CB(buff)->when = tcp_time_stamp; | 2166 | TCP_SKB_CB(buff)->when = tcp_time_stamp; |
@@ -2170,6 +2170,12 @@ int tcp_connect(struct sock *sk) | |||
2170 | sk_charge_skb(sk, buff); | 2170 | sk_charge_skb(sk, buff); |
2171 | tp->packets_out += tcp_skb_pcount(buff); | 2171 | tp->packets_out += tcp_skb_pcount(buff); |
2172 | tcp_transmit_skb(sk, buff, 1, GFP_KERNEL); | 2172 | tcp_transmit_skb(sk, buff, 1, GFP_KERNEL); |
2173 | |||
2174 | /* We change tp->snd_nxt after the tcp_transmit_skb() call | ||
2175 | * in order to make this packet get counted in tcpOutSegs. | ||
2176 | */ | ||
2177 | tp->snd_nxt = tp->write_seq; | ||
2178 | tp->pushed_seq = tp->write_seq; | ||
2173 | TCP_INC_STATS(TCP_MIB_ACTIVEOPENS); | 2179 | TCP_INC_STATS(TCP_MIB_ACTIVEOPENS); |
2174 | 2180 | ||
2175 | /* Timer for repeating the SYN until an answer. */ | 2181 | /* Timer for repeating the SYN until an answer. */ |
diff --git a/net/ipv4/tcp_probe.c b/net/ipv4/tcp_probe.c index d7d517a3a238..dab37d2f65fc 100644 --- a/net/ipv4/tcp_probe.c +++ b/net/ipv4/tcp_probe.c | |||
@@ -114,7 +114,7 @@ static int tcpprobe_open(struct inode * inode, struct file * file) | |||
114 | static ssize_t tcpprobe_read(struct file *file, char __user *buf, | 114 | static ssize_t tcpprobe_read(struct file *file, char __user *buf, |
115 | size_t len, loff_t *ppos) | 115 | size_t len, loff_t *ppos) |
116 | { | 116 | { |
117 | int error = 0, cnt; | 117 | int error = 0, cnt = 0; |
118 | unsigned char *tbuf; | 118 | unsigned char *tbuf; |
119 | 119 | ||
120 | if (!buf || len < 0) | 120 | if (!buf || len < 0) |
@@ -130,11 +130,12 @@ static ssize_t tcpprobe_read(struct file *file, char __user *buf, | |||
130 | error = wait_event_interruptible(tcpw.wait, | 130 | error = wait_event_interruptible(tcpw.wait, |
131 | __kfifo_len(tcpw.fifo) != 0); | 131 | __kfifo_len(tcpw.fifo) != 0); |
132 | if (error) | 132 | if (error) |
133 | return error; | 133 | goto out_free; |
134 | 134 | ||
135 | cnt = kfifo_get(tcpw.fifo, tbuf, len); | 135 | cnt = kfifo_get(tcpw.fifo, tbuf, len); |
136 | error = copy_to_user(buf, tbuf, cnt); | 136 | error = copy_to_user(buf, tbuf, cnt); |
137 | 137 | ||
138 | out_free: | ||
138 | vfree(tbuf); | 139 | vfree(tbuf); |
139 | 140 | ||
140 | return error ? error : cnt; | 141 | return error ? error : cnt; |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 2316a4315a18..0c5042e7380d 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -1869,15 +1869,21 @@ err_exit: | |||
1869 | /* | 1869 | /* |
1870 | * Manual configuration of address on an interface | 1870 | * Manual configuration of address on an interface |
1871 | */ | 1871 | */ |
1872 | static int inet6_addr_add(int ifindex, struct in6_addr *pfx, int plen) | 1872 | static int inet6_addr_add(int ifindex, struct in6_addr *pfx, int plen, |
1873 | __u32 prefered_lft, __u32 valid_lft) | ||
1873 | { | 1874 | { |
1874 | struct inet6_ifaddr *ifp; | 1875 | struct inet6_ifaddr *ifp; |
1875 | struct inet6_dev *idev; | 1876 | struct inet6_dev *idev; |
1876 | struct net_device *dev; | 1877 | struct net_device *dev; |
1878 | __u8 ifa_flags = 0; | ||
1877 | int scope; | 1879 | int scope; |
1878 | 1880 | ||
1879 | ASSERT_RTNL(); | 1881 | ASSERT_RTNL(); |
1880 | 1882 | ||
1883 | /* check the lifetime */ | ||
1884 | if (!valid_lft || prefered_lft > valid_lft) | ||
1885 | return -EINVAL; | ||
1886 | |||
1881 | if ((dev = __dev_get_by_index(ifindex)) == NULL) | 1887 | if ((dev = __dev_get_by_index(ifindex)) == NULL) |
1882 | return -ENODEV; | 1888 | return -ENODEV; |
1883 | 1889 | ||
@@ -1889,10 +1895,29 @@ static int inet6_addr_add(int ifindex, struct in6_addr *pfx, int plen) | |||
1889 | 1895 | ||
1890 | scope = ipv6_addr_scope(pfx); | 1896 | scope = ipv6_addr_scope(pfx); |
1891 | 1897 | ||
1892 | ifp = ipv6_add_addr(idev, pfx, plen, scope, IFA_F_PERMANENT); | 1898 | if (valid_lft == INFINITY_LIFE_TIME) |
1899 | ifa_flags |= IFA_F_PERMANENT; | ||
1900 | else if (valid_lft >= 0x7FFFFFFF/HZ) | ||
1901 | valid_lft = 0x7FFFFFFF/HZ; | ||
1902 | |||
1903 | if (prefered_lft == 0) | ||
1904 | ifa_flags |= IFA_F_DEPRECATED; | ||
1905 | else if ((prefered_lft >= 0x7FFFFFFF/HZ) && | ||
1906 | (prefered_lft != INFINITY_LIFE_TIME)) | ||
1907 | prefered_lft = 0x7FFFFFFF/HZ; | ||
1908 | |||
1909 | ifp = ipv6_add_addr(idev, pfx, plen, scope, ifa_flags); | ||
1910 | |||
1893 | if (!IS_ERR(ifp)) { | 1911 | if (!IS_ERR(ifp)) { |
1912 | spin_lock_bh(&ifp->lock); | ||
1913 | ifp->valid_lft = valid_lft; | ||
1914 | ifp->prefered_lft = prefered_lft; | ||
1915 | ifp->tstamp = jiffies; | ||
1916 | spin_unlock_bh(&ifp->lock); | ||
1917 | |||
1894 | addrconf_dad_start(ifp, 0); | 1918 | addrconf_dad_start(ifp, 0); |
1895 | in6_ifa_put(ifp); | 1919 | in6_ifa_put(ifp); |
1920 | addrconf_verify(0); | ||
1896 | return 0; | 1921 | return 0; |
1897 | } | 1922 | } |
1898 | 1923 | ||
@@ -1945,7 +1970,8 @@ int addrconf_add_ifaddr(void __user *arg) | |||
1945 | return -EFAULT; | 1970 | return -EFAULT; |
1946 | 1971 | ||
1947 | rtnl_lock(); | 1972 | rtnl_lock(); |
1948 | err = inet6_addr_add(ireq.ifr6_ifindex, &ireq.ifr6_addr, ireq.ifr6_prefixlen); | 1973 | err = inet6_addr_add(ireq.ifr6_ifindex, &ireq.ifr6_addr, ireq.ifr6_prefixlen, |
1974 | INFINITY_LIFE_TIME, INFINITY_LIFE_TIME); | ||
1949 | rtnl_unlock(); | 1975 | rtnl_unlock(); |
1950 | return err; | 1976 | return err; |
1951 | } | 1977 | } |
@@ -2771,12 +2797,16 @@ restart: | |||
2771 | ifp->idev->nd_parms->retrans_time / HZ; | 2797 | ifp->idev->nd_parms->retrans_time / HZ; |
2772 | #endif | 2798 | #endif |
2773 | 2799 | ||
2774 | if (age >= ifp->valid_lft) { | 2800 | if (ifp->valid_lft != INFINITY_LIFE_TIME && |
2801 | age >= ifp->valid_lft) { | ||
2775 | spin_unlock(&ifp->lock); | 2802 | spin_unlock(&ifp->lock); |
2776 | in6_ifa_hold(ifp); | 2803 | in6_ifa_hold(ifp); |
2777 | read_unlock(&addrconf_hash_lock); | 2804 | read_unlock(&addrconf_hash_lock); |
2778 | ipv6_del_addr(ifp); | 2805 | ipv6_del_addr(ifp); |
2779 | goto restart; | 2806 | goto restart; |
2807 | } else if (ifp->prefered_lft == INFINITY_LIFE_TIME) { | ||
2808 | spin_unlock(&ifp->lock); | ||
2809 | continue; | ||
2780 | } else if (age >= ifp->prefered_lft) { | 2810 | } else if (age >= ifp->prefered_lft) { |
2781 | /* jiffies - ifp->tsamp > age >= ifp->prefered_lft */ | 2811 | /* jiffies - ifp->tsamp > age >= ifp->prefered_lft */ |
2782 | int deprecate = 0; | 2812 | int deprecate = 0; |
@@ -2853,7 +2883,8 @@ inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
2853 | pfx = RTA_DATA(rta[IFA_ADDRESS-1]); | 2883 | pfx = RTA_DATA(rta[IFA_ADDRESS-1]); |
2854 | } | 2884 | } |
2855 | if (rta[IFA_LOCAL-1]) { | 2885 | if (rta[IFA_LOCAL-1]) { |
2856 | if (pfx && memcmp(pfx, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*pfx))) | 2886 | if (RTA_PAYLOAD(rta[IFA_LOCAL-1]) < sizeof(*pfx) || |
2887 | (pfx && memcmp(pfx, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*pfx)))) | ||
2857 | return -EINVAL; | 2888 | return -EINVAL; |
2858 | pfx = RTA_DATA(rta[IFA_LOCAL-1]); | 2889 | pfx = RTA_DATA(rta[IFA_LOCAL-1]); |
2859 | } | 2890 | } |
@@ -2864,11 +2895,61 @@ inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
2864 | } | 2895 | } |
2865 | 2896 | ||
2866 | static int | 2897 | static int |
2898 | inet6_addr_modify(int ifindex, struct in6_addr *pfx, | ||
2899 | __u32 prefered_lft, __u32 valid_lft) | ||
2900 | { | ||
2901 | struct inet6_ifaddr *ifp = NULL; | ||
2902 | struct net_device *dev; | ||
2903 | int ifa_flags = 0; | ||
2904 | |||
2905 | if ((dev = __dev_get_by_index(ifindex)) == NULL) | ||
2906 | return -ENODEV; | ||
2907 | |||
2908 | if (!(dev->flags&IFF_UP)) | ||
2909 | return -ENETDOWN; | ||
2910 | |||
2911 | if (!valid_lft || (prefered_lft > valid_lft)) | ||
2912 | return -EINVAL; | ||
2913 | |||
2914 | ifp = ipv6_get_ifaddr(pfx, dev, 1); | ||
2915 | if (ifp == NULL) | ||
2916 | return -ENOENT; | ||
2917 | |||
2918 | if (valid_lft == INFINITY_LIFE_TIME) | ||
2919 | ifa_flags = IFA_F_PERMANENT; | ||
2920 | else if (valid_lft >= 0x7FFFFFFF/HZ) | ||
2921 | valid_lft = 0x7FFFFFFF/HZ; | ||
2922 | |||
2923 | if (prefered_lft == 0) | ||
2924 | ifa_flags = IFA_F_DEPRECATED; | ||
2925 | else if ((prefered_lft >= 0x7FFFFFFF/HZ) && | ||
2926 | (prefered_lft != INFINITY_LIFE_TIME)) | ||
2927 | prefered_lft = 0x7FFFFFFF/HZ; | ||
2928 | |||
2929 | spin_lock_bh(&ifp->lock); | ||
2930 | ifp->flags = (ifp->flags & ~(IFA_F_DEPRECATED|IFA_F_PERMANENT)) | ifa_flags; | ||
2931 | |||
2932 | ifp->tstamp = jiffies; | ||
2933 | ifp->valid_lft = valid_lft; | ||
2934 | ifp->prefered_lft = prefered_lft; | ||
2935 | |||
2936 | spin_unlock_bh(&ifp->lock); | ||
2937 | if (!(ifp->flags&IFA_F_TENTATIVE)) | ||
2938 | ipv6_ifa_notify(0, ifp); | ||
2939 | in6_ifa_put(ifp); | ||
2940 | |||
2941 | addrconf_verify(0); | ||
2942 | |||
2943 | return 0; | ||
2944 | } | ||
2945 | |||
2946 | static int | ||
2867 | inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | 2947 | inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) |
2868 | { | 2948 | { |
2869 | struct rtattr **rta = arg; | 2949 | struct rtattr **rta = arg; |
2870 | struct ifaddrmsg *ifm = NLMSG_DATA(nlh); | 2950 | struct ifaddrmsg *ifm = NLMSG_DATA(nlh); |
2871 | struct in6_addr *pfx; | 2951 | struct in6_addr *pfx; |
2952 | __u32 valid_lft = INFINITY_LIFE_TIME, prefered_lft = INFINITY_LIFE_TIME; | ||
2872 | 2953 | ||
2873 | pfx = NULL; | 2954 | pfx = NULL; |
2874 | if (rta[IFA_ADDRESS-1]) { | 2955 | if (rta[IFA_ADDRESS-1]) { |
@@ -2877,14 +2958,34 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
2877 | pfx = RTA_DATA(rta[IFA_ADDRESS-1]); | 2958 | pfx = RTA_DATA(rta[IFA_ADDRESS-1]); |
2878 | } | 2959 | } |
2879 | if (rta[IFA_LOCAL-1]) { | 2960 | if (rta[IFA_LOCAL-1]) { |
2880 | if (pfx && memcmp(pfx, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*pfx))) | 2961 | if (RTA_PAYLOAD(rta[IFA_LOCAL-1]) < sizeof(*pfx) || |
2962 | (pfx && memcmp(pfx, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*pfx)))) | ||
2881 | return -EINVAL; | 2963 | return -EINVAL; |
2882 | pfx = RTA_DATA(rta[IFA_LOCAL-1]); | 2964 | pfx = RTA_DATA(rta[IFA_LOCAL-1]); |
2883 | } | 2965 | } |
2884 | if (pfx == NULL) | 2966 | if (pfx == NULL) |
2885 | return -EINVAL; | 2967 | return -EINVAL; |
2886 | 2968 | ||
2887 | return inet6_addr_add(ifm->ifa_index, pfx, ifm->ifa_prefixlen); | 2969 | if (rta[IFA_CACHEINFO-1]) { |
2970 | struct ifa_cacheinfo *ci; | ||
2971 | if (RTA_PAYLOAD(rta[IFA_CACHEINFO-1]) < sizeof(*ci)) | ||
2972 | return -EINVAL; | ||
2973 | ci = RTA_DATA(rta[IFA_CACHEINFO-1]); | ||
2974 | valid_lft = ci->ifa_valid; | ||
2975 | prefered_lft = ci->ifa_prefered; | ||
2976 | } | ||
2977 | |||
2978 | if (nlh->nlmsg_flags & NLM_F_REPLACE) { | ||
2979 | int ret; | ||
2980 | ret = inet6_addr_modify(ifm->ifa_index, pfx, | ||
2981 | prefered_lft, valid_lft); | ||
2982 | if (ret == 0 || !(nlh->nlmsg_flags & NLM_F_CREATE)) | ||
2983 | return ret; | ||
2984 | } | ||
2985 | |||
2986 | return inet6_addr_add(ifm->ifa_index, pfx, ifm->ifa_prefixlen, | ||
2987 | prefered_lft, valid_lft); | ||
2988 | |||
2888 | } | 2989 | } |
2889 | 2990 | ||
2890 | /* Maximum length of ifa_cacheinfo attributes */ | 2991 | /* Maximum length of ifa_cacheinfo attributes */ |
@@ -3121,6 +3222,62 @@ static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb) | |||
3121 | return inet6_dump_addr(skb, cb, type); | 3222 | return inet6_dump_addr(skb, cb, type); |
3122 | } | 3223 | } |
3123 | 3224 | ||
3225 | static int inet6_rtm_getaddr(struct sk_buff *in_skb, | ||
3226 | struct nlmsghdr* nlh, void *arg) | ||
3227 | { | ||
3228 | struct rtattr **rta = arg; | ||
3229 | struct ifaddrmsg *ifm = NLMSG_DATA(nlh); | ||
3230 | struct in6_addr *addr = NULL; | ||
3231 | struct net_device *dev = NULL; | ||
3232 | struct inet6_ifaddr *ifa; | ||
3233 | struct sk_buff *skb; | ||
3234 | int size = NLMSG_SPACE(sizeof(struct ifaddrmsg) + INET6_IFADDR_RTA_SPACE); | ||
3235 | int err; | ||
3236 | |||
3237 | if (rta[IFA_ADDRESS-1]) { | ||
3238 | if (RTA_PAYLOAD(rta[IFA_ADDRESS-1]) < sizeof(*addr)) | ||
3239 | return -EINVAL; | ||
3240 | addr = RTA_DATA(rta[IFA_ADDRESS-1]); | ||
3241 | } | ||
3242 | if (rta[IFA_LOCAL-1]) { | ||
3243 | if (RTA_PAYLOAD(rta[IFA_LOCAL-1]) < sizeof(*addr) || | ||
3244 | (addr && memcmp(addr, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*addr)))) | ||
3245 | return -EINVAL; | ||
3246 | addr = RTA_DATA(rta[IFA_LOCAL-1]); | ||
3247 | } | ||
3248 | if (addr == NULL) | ||
3249 | return -EINVAL; | ||
3250 | |||
3251 | if (ifm->ifa_index) | ||
3252 | dev = __dev_get_by_index(ifm->ifa_index); | ||
3253 | |||
3254 | if ((ifa = ipv6_get_ifaddr(addr, dev, 1)) == NULL) | ||
3255 | return -EADDRNOTAVAIL; | ||
3256 | |||
3257 | if ((skb = alloc_skb(size, GFP_KERNEL)) == NULL) { | ||
3258 | err = -ENOBUFS; | ||
3259 | goto out; | ||
3260 | } | ||
3261 | |||
3262 | NETLINK_CB(skb).dst_pid = NETLINK_CB(in_skb).pid; | ||
3263 | err = inet6_fill_ifaddr(skb, ifa, NETLINK_CB(in_skb).pid, | ||
3264 | nlh->nlmsg_seq, RTM_NEWADDR, 0); | ||
3265 | if (err < 0) { | ||
3266 | err = -EMSGSIZE; | ||
3267 | goto out_free; | ||
3268 | } | ||
3269 | |||
3270 | err = netlink_unicast(rtnl, skb, NETLINK_CB(in_skb).pid, MSG_DONTWAIT); | ||
3271 | if (err > 0) | ||
3272 | err = 0; | ||
3273 | out: | ||
3274 | in6_ifa_put(ifa); | ||
3275 | return err; | ||
3276 | out_free: | ||
3277 | kfree_skb(skb); | ||
3278 | goto out; | ||
3279 | } | ||
3280 | |||
3124 | static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa) | 3281 | static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa) |
3125 | { | 3282 | { |
3126 | struct sk_buff *skb; | 3283 | struct sk_buff *skb; |
@@ -3363,7 +3520,8 @@ static struct rtnetlink_link inet6_rtnetlink_table[RTM_NR_MSGTYPES] = { | |||
3363 | [RTM_GETLINK - RTM_BASE] = { .dumpit = inet6_dump_ifinfo, }, | 3520 | [RTM_GETLINK - RTM_BASE] = { .dumpit = inet6_dump_ifinfo, }, |
3364 | [RTM_NEWADDR - RTM_BASE] = { .doit = inet6_rtm_newaddr, }, | 3521 | [RTM_NEWADDR - RTM_BASE] = { .doit = inet6_rtm_newaddr, }, |
3365 | [RTM_DELADDR - RTM_BASE] = { .doit = inet6_rtm_deladdr, }, | 3522 | [RTM_DELADDR - RTM_BASE] = { .doit = inet6_rtm_deladdr, }, |
3366 | [RTM_GETADDR - RTM_BASE] = { .dumpit = inet6_dump_ifaddr, }, | 3523 | [RTM_GETADDR - RTM_BASE] = { .doit = inet6_rtm_getaddr, |
3524 | .dumpit = inet6_dump_ifaddr, }, | ||
3367 | [RTM_GETMULTICAST - RTM_BASE] = { .dumpit = inet6_dump_ifmcaddr, }, | 3525 | [RTM_GETMULTICAST - RTM_BASE] = { .dumpit = inet6_dump_ifmcaddr, }, |
3368 | [RTM_GETANYCAST - RTM_BASE] = { .dumpit = inet6_dump_ifacaddr, }, | 3526 | [RTM_GETANYCAST - RTM_BASE] = { .dumpit = inet6_dump_ifacaddr, }, |
3369 | [RTM_NEWROUTE - RTM_BASE] = { .doit = inet6_rtm_newroute, }, | 3527 | [RTM_NEWROUTE - RTM_BASE] = { .doit = inet6_rtm_newroute, }, |
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 5a0ba58b86cc..ac85e9c532c2 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
@@ -658,7 +658,7 @@ int inet6_sk_rebuild_header(struct sock *sk) | |||
658 | return err; | 658 | return err; |
659 | } | 659 | } |
660 | 660 | ||
661 | ip6_dst_store(sk, dst, NULL); | 661 | __ip6_dst_store(sk, dst, NULL); |
662 | } | 662 | } |
663 | 663 | ||
664 | return 0; | 664 | return 0; |
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index 1044b6fce0d5..3d6e9a351150 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c | |||
@@ -712,6 +712,11 @@ discard_it: | |||
712 | return 0; | 712 | return 0; |
713 | } | 713 | } |
714 | 714 | ||
715 | /* | ||
716 | * Special lock-class for __icmpv6_socket: | ||
717 | */ | ||
718 | static struct lock_class_key icmpv6_socket_sk_dst_lock_key; | ||
719 | |||
715 | int __init icmpv6_init(struct net_proto_family *ops) | 720 | int __init icmpv6_init(struct net_proto_family *ops) |
716 | { | 721 | { |
717 | struct sock *sk; | 722 | struct sock *sk; |
@@ -730,6 +735,14 @@ int __init icmpv6_init(struct net_proto_family *ops) | |||
730 | 735 | ||
731 | sk = per_cpu(__icmpv6_socket, i)->sk; | 736 | sk = per_cpu(__icmpv6_socket, i)->sk; |
732 | sk->sk_allocation = GFP_ATOMIC; | 737 | sk->sk_allocation = GFP_ATOMIC; |
738 | /* | ||
739 | * Split off their lock-class, because sk->sk_dst_lock | ||
740 | * gets used from softirqs, which is safe for | ||
741 | * __icmpv6_socket (because those never get directly used | ||
742 | * via userspace syscalls), but unsafe for normal sockets. | ||
743 | */ | ||
744 | lockdep_set_class(&sk->sk_dst_lock, | ||
745 | &icmpv6_socket_sk_dst_lock_key); | ||
733 | 746 | ||
734 | /* Enough space for 2 64K ICMP packets, including | 747 | /* Enough space for 2 64K ICMP packets, including |
735 | * sk_buff struct overhead. | 748 | * sk_buff struct overhead. |
diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c index 5c950cc79d80..bf491077b822 100644 --- a/net/ipv6/inet6_connection_sock.c +++ b/net/ipv6/inet6_connection_sock.c | |||
@@ -185,7 +185,7 @@ int inet6_csk_xmit(struct sk_buff *skb, int ipfragok) | |||
185 | return err; | 185 | return err; |
186 | } | 186 | } |
187 | 187 | ||
188 | ip6_dst_store(sk, dst, NULL); | 188 | __ip6_dst_store(sk, dst, NULL); |
189 | } | 189 | } |
190 | 190 | ||
191 | skb->dst = dst_clone(dst); | 191 | skb->dst = dst_clone(dst); |
diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c index df8f051c0fce..25c2a9e03895 100644 --- a/net/ipv6/ip6_input.c +++ b/net/ipv6/ip6_input.c | |||
@@ -71,6 +71,8 @@ int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt | |||
71 | goto out; | 71 | goto out; |
72 | } | 72 | } |
73 | 73 | ||
74 | memset(IP6CB(skb), 0, sizeof(struct inet6_skb_parm)); | ||
75 | |||
74 | /* | 76 | /* |
75 | * Store incoming device index. When the packet will | 77 | * Store incoming device index. When the packet will |
76 | * be queued, we cannot refer to skb->dev anymore. | 78 | * be queued, we cannot refer to skb->dev anymore. |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 3bc74ce78800..4fb47a252913 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -356,6 +356,7 @@ int ip6_forward(struct sk_buff *skb) | |||
356 | skb->dev = dst->dev; | 356 | skb->dev = dst->dev; |
357 | icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, | 357 | icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, |
358 | 0, skb->dev); | 358 | 0, skb->dev); |
359 | IP6_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS); | ||
359 | 360 | ||
360 | kfree_skb(skb); | 361 | kfree_skb(skb); |
361 | return -ETIMEDOUT; | 362 | return -ETIMEDOUT; |
@@ -595,6 +596,9 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
595 | } | 596 | } |
596 | 597 | ||
597 | err = output(skb); | 598 | err = output(skb); |
599 | if(!err) | ||
600 | IP6_INC_STATS(IPSTATS_MIB_FRAGCREATES); | ||
601 | |||
598 | if (err || !frag) | 602 | if (err || !frag) |
599 | break; | 603 | break; |
600 | 604 | ||
@@ -706,12 +710,11 @@ slow_path: | |||
706 | /* | 710 | /* |
707 | * Put this fragment into the sending queue. | 711 | * Put this fragment into the sending queue. |
708 | */ | 712 | */ |
709 | |||
710 | IP6_INC_STATS(IPSTATS_MIB_FRAGCREATES); | ||
711 | |||
712 | err = output(frag); | 713 | err = output(frag); |
713 | if (err) | 714 | if (err) |
714 | goto fail; | 715 | goto fail; |
716 | |||
717 | IP6_INC_STATS(IPSTATS_MIB_FRAGCREATES); | ||
715 | } | 718 | } |
716 | kfree_skb(skb); | 719 | kfree_skb(skb); |
717 | IP6_INC_STATS(IPSTATS_MIB_FRAGOKS); | 720 | IP6_INC_STATS(IPSTATS_MIB_FRAGOKS); |
@@ -723,48 +726,51 @@ fail: | |||
723 | return err; | 726 | return err; |
724 | } | 727 | } |
725 | 728 | ||
726 | int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl) | 729 | static struct dst_entry *ip6_sk_dst_check(struct sock *sk, |
730 | struct dst_entry *dst, | ||
731 | struct flowi *fl) | ||
727 | { | 732 | { |
728 | int err = 0; | 733 | struct ipv6_pinfo *np = inet6_sk(sk); |
734 | struct rt6_info *rt = (struct rt6_info *)dst; | ||
729 | 735 | ||
730 | *dst = NULL; | 736 | if (!dst) |
731 | if (sk) { | 737 | goto out; |
732 | struct ipv6_pinfo *np = inet6_sk(sk); | 738 | |
733 | 739 | /* Yes, checking route validity in not connected | |
734 | *dst = sk_dst_check(sk, np->dst_cookie); | 740 | * case is not very simple. Take into account, |
735 | if (*dst) { | 741 | * that we do not support routing by source, TOS, |
736 | struct rt6_info *rt = (struct rt6_info*)*dst; | 742 | * and MSG_DONTROUTE --ANK (980726) |
737 | 743 | * | |
738 | /* Yes, checking route validity in not connected | 744 | * 1. If route was host route, check that |
739 | * case is not very simple. Take into account, | 745 | * cached destination is current. |
740 | * that we do not support routing by source, TOS, | 746 | * If it is network route, we still may |
741 | * and MSG_DONTROUTE --ANK (980726) | 747 | * check its validity using saved pointer |
742 | * | 748 | * to the last used address: daddr_cache. |
743 | * 1. If route was host route, check that | 749 | * We do not want to save whole address now, |
744 | * cached destination is current. | 750 | * (because main consumer of this service |
745 | * If it is network route, we still may | 751 | * is tcp, which has not this problem), |
746 | * check its validity using saved pointer | 752 | * so that the last trick works only on connected |
747 | * to the last used address: daddr_cache. | 753 | * sockets. |
748 | * We do not want to save whole address now, | 754 | * 2. oif also should be the same. |
749 | * (because main consumer of this service | 755 | */ |
750 | * is tcp, which has not this problem), | 756 | if (((rt->rt6i_dst.plen != 128 || |
751 | * so that the last trick works only on connected | 757 | !ipv6_addr_equal(&fl->fl6_dst, &rt->rt6i_dst.addr)) |
752 | * sockets. | 758 | && (np->daddr_cache == NULL || |
753 | * 2. oif also should be the same. | 759 | !ipv6_addr_equal(&fl->fl6_dst, np->daddr_cache))) |
754 | */ | 760 | || (fl->oif && fl->oif != dst->dev->ifindex)) { |
755 | if (((rt->rt6i_dst.plen != 128 || | 761 | dst_release(dst); |
756 | !ipv6_addr_equal(&fl->fl6_dst, | 762 | dst = NULL; |
757 | &rt->rt6i_dst.addr)) | ||
758 | && (np->daddr_cache == NULL || | ||
759 | !ipv6_addr_equal(&fl->fl6_dst, | ||
760 | np->daddr_cache))) | ||
761 | || (fl->oif && fl->oif != (*dst)->dev->ifindex)) { | ||
762 | dst_release(*dst); | ||
763 | *dst = NULL; | ||
764 | } | ||
765 | } | ||
766 | } | 763 | } |
767 | 764 | ||
765 | out: | ||
766 | return dst; | ||
767 | } | ||
768 | |||
769 | static int ip6_dst_lookup_tail(struct sock *sk, | ||
770 | struct dst_entry **dst, struct flowi *fl) | ||
771 | { | ||
772 | int err; | ||
773 | |||
768 | if (*dst == NULL) | 774 | if (*dst == NULL) |
769 | *dst = ip6_route_output(sk, fl); | 775 | *dst = ip6_route_output(sk, fl); |
770 | 776 | ||
@@ -773,7 +779,6 @@ int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl) | |||
773 | 779 | ||
774 | if (ipv6_addr_any(&fl->fl6_src)) { | 780 | if (ipv6_addr_any(&fl->fl6_src)) { |
775 | err = ipv6_get_saddr(*dst, &fl->fl6_dst, &fl->fl6_src); | 781 | err = ipv6_get_saddr(*dst, &fl->fl6_dst, &fl->fl6_src); |
776 | |||
777 | if (err) | 782 | if (err) |
778 | goto out_err_release; | 783 | goto out_err_release; |
779 | } | 784 | } |
@@ -786,8 +791,48 @@ out_err_release: | |||
786 | return err; | 791 | return err; |
787 | } | 792 | } |
788 | 793 | ||
794 | /** | ||
795 | * ip6_dst_lookup - perform route lookup on flow | ||
796 | * @sk: socket which provides route info | ||
797 | * @dst: pointer to dst_entry * for result | ||
798 | * @fl: flow to lookup | ||
799 | * | ||
800 | * This function performs a route lookup on the given flow. | ||
801 | * | ||
802 | * It returns zero on success, or a standard errno code on error. | ||
803 | */ | ||
804 | int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl) | ||
805 | { | ||
806 | *dst = NULL; | ||
807 | return ip6_dst_lookup_tail(sk, dst, fl); | ||
808 | } | ||
789 | EXPORT_SYMBOL_GPL(ip6_dst_lookup); | 809 | EXPORT_SYMBOL_GPL(ip6_dst_lookup); |
790 | 810 | ||
811 | /** | ||
812 | * ip6_sk_dst_lookup - perform socket cached route lookup on flow | ||
813 | * @sk: socket which provides the dst cache and route info | ||
814 | * @dst: pointer to dst_entry * for result | ||
815 | * @fl: flow to lookup | ||
816 | * | ||
817 | * This function performs a route lookup on the given flow with the | ||
818 | * possibility of using the cached route in the socket if it is valid. | ||
819 | * It will take the socket dst lock when operating on the dst cache. | ||
820 | * As a result, this function can only be used in process context. | ||
821 | * | ||
822 | * It returns zero on success, or a standard errno code on error. | ||
823 | */ | ||
824 | int ip6_sk_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl) | ||
825 | { | ||
826 | *dst = NULL; | ||
827 | if (sk) { | ||
828 | *dst = sk_dst_check(sk, inet6_sk(sk)->dst_cookie); | ||
829 | *dst = ip6_sk_dst_check(sk, *dst, fl); | ||
830 | } | ||
831 | |||
832 | return ip6_dst_lookup_tail(sk, dst, fl); | ||
833 | } | ||
834 | EXPORT_SYMBOL_GPL(ip6_sk_dst_lookup); | ||
835 | |||
791 | static inline int ip6_ufo_append_data(struct sock *sk, | 836 | static inline int ip6_ufo_append_data(struct sock *sk, |
792 | int getfrag(void *from, char *to, int offset, int len, | 837 | int getfrag(void *from, char *to, int offset, int len, |
793 | int odd, struct sk_buff *skb), | 838 | int odd, struct sk_buff *skb), |
@@ -1050,7 +1095,7 @@ alloc_new_skb: | |||
1050 | skb_prev->csum = csum_sub(skb_prev->csum, | 1095 | skb_prev->csum = csum_sub(skb_prev->csum, |
1051 | skb->csum); | 1096 | skb->csum); |
1052 | data += fraggap; | 1097 | data += fraggap; |
1053 | skb_trim(skb_prev, maxfraglen); | 1098 | pskb_trim_unique(skb_prev, maxfraglen); |
1054 | } | 1099 | } |
1055 | copy = datalen - transhdrlen - fraggap; | 1100 | copy = datalen - transhdrlen - fraggap; |
1056 | if (copy < 0) { | 1101 | if (copy < 0) { |
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 9d697d4dcffc..639eb20c9f1f 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c | |||
@@ -268,13 +268,14 @@ int ipv6_sock_mc_drop(struct sock *sk, int ifindex, struct in6_addr *addr) | |||
268 | if ((dev = dev_get_by_index(mc_lst->ifindex)) != NULL) { | 268 | if ((dev = dev_get_by_index(mc_lst->ifindex)) != NULL) { |
269 | struct inet6_dev *idev = in6_dev_get(dev); | 269 | struct inet6_dev *idev = in6_dev_get(dev); |
270 | 270 | ||
271 | (void) ip6_mc_leave_src(sk, mc_lst, idev); | ||
271 | if (idev) { | 272 | if (idev) { |
272 | (void) ip6_mc_leave_src(sk,mc_lst,idev); | ||
273 | __ipv6_dev_mc_dec(idev, &mc_lst->addr); | 273 | __ipv6_dev_mc_dec(idev, &mc_lst->addr); |
274 | in6_dev_put(idev); | 274 | in6_dev_put(idev); |
275 | } | 275 | } |
276 | dev_put(dev); | 276 | dev_put(dev); |
277 | } | 277 | } else |
278 | (void) ip6_mc_leave_src(sk, mc_lst, NULL); | ||
278 | sock_kfree_s(sk, mc_lst, sizeof(*mc_lst)); | 279 | sock_kfree_s(sk, mc_lst, sizeof(*mc_lst)); |
279 | return 0; | 280 | return 0; |
280 | } | 281 | } |
@@ -334,13 +335,14 @@ void ipv6_sock_mc_close(struct sock *sk) | |||
334 | if (dev) { | 335 | if (dev) { |
335 | struct inet6_dev *idev = in6_dev_get(dev); | 336 | struct inet6_dev *idev = in6_dev_get(dev); |
336 | 337 | ||
338 | (void) ip6_mc_leave_src(sk, mc_lst, idev); | ||
337 | if (idev) { | 339 | if (idev) { |
338 | (void) ip6_mc_leave_src(sk, mc_lst, idev); | ||
339 | __ipv6_dev_mc_dec(idev, &mc_lst->addr); | 340 | __ipv6_dev_mc_dec(idev, &mc_lst->addr); |
340 | in6_dev_put(idev); | 341 | in6_dev_put(idev); |
341 | } | 342 | } |
342 | dev_put(dev); | 343 | dev_put(dev); |
343 | } | 344 | } else |
345 | (void) ip6_mc_leave_src(sk, mc_lst, NULL); | ||
344 | 346 | ||
345 | sock_kfree_s(sk, mc_lst, sizeof(*mc_lst)); | 347 | sock_kfree_s(sk, mc_lst, sizeof(*mc_lst)); |
346 | 348 | ||
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index f26898b00347..c9d6b23cd3f7 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c | |||
@@ -1398,23 +1398,39 @@ static int __init ip6_tables_init(void) | |||
1398 | { | 1398 | { |
1399 | int ret; | 1399 | int ret; |
1400 | 1400 | ||
1401 | xt_proto_init(AF_INET6); | 1401 | ret = xt_proto_init(AF_INET6); |
1402 | if (ret < 0) | ||
1403 | goto err1; | ||
1402 | 1404 | ||
1403 | /* Noone else will be downing sem now, so we won't sleep */ | 1405 | /* Noone else will be downing sem now, so we won't sleep */ |
1404 | xt_register_target(&ip6t_standard_target); | 1406 | ret = xt_register_target(&ip6t_standard_target); |
1405 | xt_register_target(&ip6t_error_target); | 1407 | if (ret < 0) |
1406 | xt_register_match(&icmp6_matchstruct); | 1408 | goto err2; |
1409 | ret = xt_register_target(&ip6t_error_target); | ||
1410 | if (ret < 0) | ||
1411 | goto err3; | ||
1412 | ret = xt_register_match(&icmp6_matchstruct); | ||
1413 | if (ret < 0) | ||
1414 | goto err4; | ||
1407 | 1415 | ||
1408 | /* Register setsockopt */ | 1416 | /* Register setsockopt */ |
1409 | ret = nf_register_sockopt(&ip6t_sockopts); | 1417 | ret = nf_register_sockopt(&ip6t_sockopts); |
1410 | if (ret < 0) { | 1418 | if (ret < 0) |
1411 | duprintf("Unable to register sockopts.\n"); | 1419 | goto err5; |
1412 | xt_proto_fini(AF_INET6); | ||
1413 | return ret; | ||
1414 | } | ||
1415 | 1420 | ||
1416 | printk("ip6_tables: (C) 2000-2006 Netfilter Core Team\n"); | 1421 | printk("ip6_tables: (C) 2000-2006 Netfilter Core Team\n"); |
1417 | return 0; | 1422 | return 0; |
1423 | |||
1424 | err5: | ||
1425 | xt_unregister_match(&icmp6_matchstruct); | ||
1426 | err4: | ||
1427 | xt_unregister_target(&ip6t_error_target); | ||
1428 | err3: | ||
1429 | xt_unregister_target(&ip6t_standard_target); | ||
1430 | err2: | ||
1431 | xt_proto_fini(AF_INET6); | ||
1432 | err1: | ||
1433 | return ret; | ||
1418 | } | 1434 | } |
1419 | 1435 | ||
1420 | static void __exit ip6_tables_fini(void) | 1436 | static void __exit ip6_tables_fini(void) |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index fa1ce0ae123e..d57e61ce4a7d 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -411,6 +411,7 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
411 | /* Copy the address. */ | 411 | /* Copy the address. */ |
412 | if (sin6) { | 412 | if (sin6) { |
413 | sin6->sin6_family = AF_INET6; | 413 | sin6->sin6_family = AF_INET6; |
414 | sin6->sin6_port = 0; | ||
414 | ipv6_addr_copy(&sin6->sin6_addr, &skb->nh.ipv6h->saddr); | 415 | ipv6_addr_copy(&sin6->sin6_addr, &skb->nh.ipv6h->saddr); |
415 | sin6->sin6_flowinfo = 0; | 416 | sin6->sin6_flowinfo = 0; |
416 | sin6->sin6_scope_id = 0; | 417 | sin6->sin6_scope_id = 0; |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 87c39c978cd0..4b163711f3a8 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -53,6 +53,7 @@ | |||
53 | #include <linux/rtnetlink.h> | 53 | #include <linux/rtnetlink.h> |
54 | #include <net/dst.h> | 54 | #include <net/dst.h> |
55 | #include <net/xfrm.h> | 55 | #include <net/xfrm.h> |
56 | #include <net/netevent.h> | ||
56 | 57 | ||
57 | #include <asm/uaccess.h> | 58 | #include <asm/uaccess.h> |
58 | 59 | ||
@@ -742,6 +743,7 @@ static void ip6_rt_update_pmtu(struct dst_entry *dst, u32 mtu) | |||
742 | dst->metrics[RTAX_FEATURES-1] |= RTAX_FEATURE_ALLFRAG; | 743 | dst->metrics[RTAX_FEATURES-1] |= RTAX_FEATURE_ALLFRAG; |
743 | } | 744 | } |
744 | dst->metrics[RTAX_MTU-1] = mtu; | 745 | dst->metrics[RTAX_MTU-1] = mtu; |
746 | call_netevent_notifiers(NETEVENT_PMTU_UPDATE, dst); | ||
745 | } | 747 | } |
746 | } | 748 | } |
747 | 749 | ||
@@ -1155,6 +1157,7 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *saddr, | |||
1155 | struct rt6_info *rt, *nrt = NULL; | 1157 | struct rt6_info *rt, *nrt = NULL; |
1156 | int strict; | 1158 | int strict; |
1157 | struct fib6_node *fn; | 1159 | struct fib6_node *fn; |
1160 | struct netevent_redirect netevent; | ||
1158 | 1161 | ||
1159 | /* | 1162 | /* |
1160 | * Get the "current" route for this destination and | 1163 | * Get the "current" route for this destination and |
@@ -1252,6 +1255,10 @@ restart: | |||
1252 | if (ip6_ins_rt(nrt, NULL, NULL, NULL)) | 1255 | if (ip6_ins_rt(nrt, NULL, NULL, NULL)) |
1253 | goto out; | 1256 | goto out; |
1254 | 1257 | ||
1258 | netevent.old = &rt->u.dst; | ||
1259 | netevent.new = &nrt->u.dst; | ||
1260 | call_netevent_notifiers(NETEVENT_REDIRECT, &netevent); | ||
1261 | |||
1255 | if (rt->rt6i_flags&RTF_CACHE) { | 1262 | if (rt->rt6i_flags&RTF_CACHE) { |
1256 | ip6_del_rt(rt, NULL, NULL, NULL); | 1263 | ip6_del_rt(rt, NULL, NULL, NULL); |
1257 | return; | 1264 | return; |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 923989d0520d..b843a650be71 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -270,7 +270,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
270 | inet->rcv_saddr = LOOPBACK4_IPV6; | 270 | inet->rcv_saddr = LOOPBACK4_IPV6; |
271 | 271 | ||
272 | sk->sk_gso_type = SKB_GSO_TCPV6; | 272 | sk->sk_gso_type = SKB_GSO_TCPV6; |
273 | ip6_dst_store(sk, dst, NULL); | 273 | __ip6_dst_store(sk, dst, NULL); |
274 | 274 | ||
275 | icsk->icsk_ext_hdr_len = 0; | 275 | icsk->icsk_ext_hdr_len = 0; |
276 | if (np->opt) | 276 | if (np->opt) |
@@ -427,7 +427,6 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
427 | case TCP_SYN_RECV: /* Cannot happen. | 427 | case TCP_SYN_RECV: /* Cannot happen. |
428 | It can, it SYNs are crossed. --ANK */ | 428 | It can, it SYNs are crossed. --ANK */ |
429 | if (!sock_owned_by_user(sk)) { | 429 | if (!sock_owned_by_user(sk)) { |
430 | TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); | ||
431 | sk->sk_err = err; | 430 | sk->sk_err = err; |
432 | sk->sk_error_report(sk); /* Wake people up to see the error (see connect in sock.c) */ | 431 | sk->sk_error_report(sk); /* Wake people up to see the error (see connect in sock.c) */ |
433 | 432 | ||
@@ -831,7 +830,6 @@ drop: | |||
831 | if (req) | 830 | if (req) |
832 | reqsk_free(req); | 831 | reqsk_free(req); |
833 | 832 | ||
834 | TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); | ||
835 | return 0; /* don't send reset */ | 833 | return 0; /* don't send reset */ |
836 | } | 834 | } |
837 | 835 | ||
@@ -947,7 +945,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
947 | */ | 945 | */ |
948 | 946 | ||
949 | sk->sk_gso_type = SKB_GSO_TCPV6; | 947 | sk->sk_gso_type = SKB_GSO_TCPV6; |
950 | ip6_dst_store(newsk, dst, NULL); | 948 | __ip6_dst_store(newsk, dst, NULL); |
951 | 949 | ||
952 | newtcp6sk = (struct tcp6_sock *)newsk; | 950 | newtcp6sk = (struct tcp6_sock *)newsk; |
953 | inet_sk(newsk)->pinet6 = &newtcp6sk->inet6; | 951 | inet_sk(newsk)->pinet6 = &newtcp6sk->inet6; |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index ccc57f434cd3..3d54f246411e 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -782,7 +782,7 @@ do_udp_sendmsg: | |||
782 | connected = 0; | 782 | connected = 0; |
783 | } | 783 | } |
784 | 784 | ||
785 | err = ip6_dst_lookup(sk, &dst, fl); | 785 | err = ip6_sk_dst_lookup(sk, &dst, fl); |
786 | if (err) | 786 | if (err) |
787 | goto out; | 787 | goto out; |
788 | if (final_p) | 788 | if (final_p) |
diff --git a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c index 0eea60ea9ebc..c8c8b44a0f58 100644 --- a/net/ipv6/xfrm6_output.c +++ b/net/ipv6/xfrm6_output.c | |||
@@ -125,7 +125,7 @@ static int xfrm6_output_finish(struct sk_buff *skb) | |||
125 | if (!skb_is_gso(skb)) | 125 | if (!skb_is_gso(skb)) |
126 | return xfrm6_output_finish2(skb); | 126 | return xfrm6_output_finish2(skb); |
127 | 127 | ||
128 | skb->protocol = htons(ETH_P_IP); | 128 | skb->protocol = htons(ETH_P_IPV6); |
129 | segs = skb_gso_segment(skb, 0); | 129 | segs = skb_gso_segment(skb, 0); |
130 | kfree_skb(skb); | 130 | kfree_skb(skb); |
131 | if (unlikely(IS_ERR(segs))) | 131 | if (unlikely(IS_ERR(segs))) |
diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c index aa34ff4b707c..bef3f61569f7 100644 --- a/net/ipx/af_ipx.c +++ b/net/ipx/af_ipx.c | |||
@@ -1642,13 +1642,17 @@ static int ipx_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_ty | |||
1642 | if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) | 1642 | if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) |
1643 | goto out; | 1643 | goto out; |
1644 | 1644 | ||
1645 | ipx = ipx_hdr(skb); | 1645 | if (!pskb_may_pull(skb, sizeof(struct ipxhdr))) |
1646 | ipx_pktsize = ntohs(ipx->ipx_pktsize); | 1646 | goto drop; |
1647 | |||
1648 | ipx_pktsize = ntohs(ipx_hdr(skb)->ipx_pktsize); | ||
1647 | 1649 | ||
1648 | /* Too small or invalid header? */ | 1650 | /* Too small or invalid header? */ |
1649 | if (ipx_pktsize < sizeof(struct ipxhdr) || ipx_pktsize > skb->len) | 1651 | if (ipx_pktsize < sizeof(struct ipxhdr) || |
1652 | !pskb_may_pull(skb, ipx_pktsize)) | ||
1650 | goto drop; | 1653 | goto drop; |
1651 | 1654 | ||
1655 | ipx = ipx_hdr(skb); | ||
1652 | if (ipx->ipx_checksum != IPX_NO_CHECKSUM && | 1656 | if (ipx->ipx_checksum != IPX_NO_CHECKSUM && |
1653 | ipx->ipx_checksum != ipx_cksum(ipx, ipx_pktsize)) | 1657 | ipx->ipx_checksum != ipx_cksum(ipx, ipx_pktsize)) |
1654 | goto drop; | 1658 | goto drop; |
diff --git a/net/lapb/lapb_iface.c b/net/lapb/lapb_iface.c index d504eed416f6..7e6bc41eeb21 100644 --- a/net/lapb/lapb_iface.c +++ b/net/lapb/lapb_iface.c | |||
@@ -238,11 +238,13 @@ int lapb_setparms(struct net_device *dev, struct lapb_parms_struct *parms) | |||
238 | goto out_put; | 238 | goto out_put; |
239 | 239 | ||
240 | if (lapb->state == LAPB_STATE_0) { | 240 | if (lapb->state == LAPB_STATE_0) { |
241 | if (((parms->mode & LAPB_EXTENDED) && | 241 | if (parms->mode & LAPB_EXTENDED) { |
242 | (parms->window < 1 || parms->window > 127)) || | 242 | if (parms->window < 1 || parms->window > 127) |
243 | (parms->window < 1 || parms->window > 7)) | 243 | goto out_put; |
244 | goto out_put; | 244 | } else { |
245 | 245 | if (parms->window < 1 || parms->window > 7) | |
246 | goto out_put; | ||
247 | } | ||
246 | lapb->mode = parms->mode; | 248 | lapb->mode = parms->mode; |
247 | lapb->window = parms->window; | 249 | lapb->window = parms->window; |
248 | } | 250 | } |
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index d6cfe84d521b..2652ead96c64 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c | |||
@@ -784,24 +784,20 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
784 | copied += used; | 784 | copied += used; |
785 | len -= used; | 785 | len -= used; |
786 | 786 | ||
787 | if (used + offset < skb->len) | ||
788 | continue; | ||
789 | |||
790 | if (!(flags & MSG_PEEK)) { | 787 | if (!(flags & MSG_PEEK)) { |
791 | sk_eat_skb(sk, skb, 0); | 788 | sk_eat_skb(sk, skb, 0); |
792 | *seq = 0; | 789 | *seq = 0; |
793 | } | 790 | } |
791 | |||
792 | /* For non stream protcols we get one packet per recvmsg call */ | ||
793 | if (sk->sk_type != SOCK_STREAM) | ||
794 | goto copy_uaddr; | ||
795 | |||
796 | /* Partial read */ | ||
797 | if (used + offset < skb->len) | ||
798 | continue; | ||
794 | } while (len > 0); | 799 | } while (len > 0); |
795 | 800 | ||
796 | /* | ||
797 | * According to UNIX98, msg_name/msg_namelen are ignored | ||
798 | * on connected socket. -ANK | ||
799 | * But... af_llc still doesn't have separate sets of methods for | ||
800 | * SOCK_DGRAM and SOCK_STREAM :-( So we have to do this test, will | ||
801 | * eventually fix this tho :-) -acme | ||
802 | */ | ||
803 | if (sk->sk_type == SOCK_DGRAM) | ||
804 | goto copy_uaddr; | ||
805 | out: | 801 | out: |
806 | release_sock(sk); | 802 | release_sock(sk); |
807 | return copied; | 803 | return copied; |
diff --git a/net/llc/llc_sap.c b/net/llc/llc_sap.c index 20c4eb5c1ac6..61cb8cf7d153 100644 --- a/net/llc/llc_sap.c +++ b/net/llc/llc_sap.c | |||
@@ -51,10 +51,10 @@ void llc_save_primitive(struct sock *sk, struct sk_buff* skb, u8 prim) | |||
51 | { | 51 | { |
52 | struct sockaddr_llc *addr; | 52 | struct sockaddr_llc *addr; |
53 | 53 | ||
54 | if (skb->sk->sk_type == SOCK_STREAM) /* See UNIX98 */ | ||
55 | return; | ||
56 | /* save primitive for use by the user. */ | 54 | /* save primitive for use by the user. */ |
57 | addr = llc_ui_skb_cb(skb); | 55 | addr = llc_ui_skb_cb(skb); |
56 | |||
57 | memset(addr, 0, sizeof(*addr)); | ||
58 | addr->sllc_family = sk->sk_family; | 58 | addr->sllc_family = sk->sk_family; |
59 | addr->sllc_arphrd = skb->dev->type; | 59 | addr->sllc_arphrd = skb->dev->type; |
60 | addr->sllc_test = prim == LLC_TEST_PRIM; | 60 | addr->sllc_test = prim == LLC_TEST_PRIM; |
@@ -330,6 +330,9 @@ static void llc_sap_mcast(struct llc_sap *sap, | |||
330 | if (llc->laddr.lsap != laddr->lsap) | 330 | if (llc->laddr.lsap != laddr->lsap) |
331 | continue; | 331 | continue; |
332 | 332 | ||
333 | if (llc->dev != skb->dev) | ||
334 | continue; | ||
335 | |||
333 | skb1 = skb_clone(skb, GFP_ATOMIC); | 336 | skb1 = skb_clone(skb, GFP_ATOMIC); |
334 | if (!skb1) | 337 | if (!skb1) |
335 | break; | 338 | break; |
diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig index 42a178aa30f9..a9894ddfd72a 100644 --- a/net/netfilter/Kconfig +++ b/net/netfilter/Kconfig | |||
@@ -386,8 +386,8 @@ config NETFILTER_XT_MATCH_REALM | |||
386 | <file:Documentation/modules.txt>. If unsure, say `N'. | 386 | <file:Documentation/modules.txt>. If unsure, say `N'. |
387 | 387 | ||
388 | config NETFILTER_XT_MATCH_SCTP | 388 | config NETFILTER_XT_MATCH_SCTP |
389 | tristate '"sctp" protocol match support' | 389 | tristate '"sctp" protocol match support (EXPERIMENTAL)' |
390 | depends on NETFILTER_XTABLES | 390 | depends on NETFILTER_XTABLES && EXPERIMENTAL |
391 | help | 391 | help |
392 | With this option enabled, you will be able to use the | 392 | With this option enabled, you will be able to use the |
393 | `sctp' match in order to match on SCTP source/destination ports | 393 | `sctp' match in order to match on SCTP source/destination ports |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index af4845971f70..6527d4e048d8 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
@@ -429,9 +429,9 @@ ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb) | |||
429 | cb->args[0], *id); | 429 | cb->args[0], *id); |
430 | 430 | ||
431 | read_lock_bh(&nf_conntrack_lock); | 431 | read_lock_bh(&nf_conntrack_lock); |
432 | last = (struct nf_conn *)cb->args[1]; | ||
432 | for (; cb->args[0] < nf_conntrack_htable_size; cb->args[0]++) { | 433 | for (; cb->args[0] < nf_conntrack_htable_size; cb->args[0]++) { |
433 | restart: | 434 | restart: |
434 | last = (struct nf_conn *)cb->args[1]; | ||
435 | list_for_each_prev(i, &nf_conntrack_hash[cb->args[0]]) { | 435 | list_for_each_prev(i, &nf_conntrack_hash[cb->args[0]]) { |
436 | h = (struct nf_conntrack_tuple_hash *) i; | 436 | h = (struct nf_conntrack_tuple_hash *) i; |
437 | if (DIRECTION(h) != IP_CT_DIR_ORIGINAL) | 437 | if (DIRECTION(h) != IP_CT_DIR_ORIGINAL) |
@@ -442,13 +442,10 @@ restart: | |||
442 | * then dump everything. */ | 442 | * then dump everything. */ |
443 | if (l3proto && L3PROTO(ct) != l3proto) | 443 | if (l3proto && L3PROTO(ct) != l3proto) |
444 | continue; | 444 | continue; |
445 | if (last != NULL) { | 445 | if (cb->args[1]) { |
446 | if (ct == last) { | 446 | if (ct != last) |
447 | nf_ct_put(last); | ||
448 | cb->args[1] = 0; | ||
449 | last = NULL; | ||
450 | } else | ||
451 | continue; | 447 | continue; |
448 | cb->args[1] = 0; | ||
452 | } | 449 | } |
453 | if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid, | 450 | if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid, |
454 | cb->nlh->nlmsg_seq, | 451 | cb->nlh->nlmsg_seq, |
@@ -459,17 +456,17 @@ restart: | |||
459 | goto out; | 456 | goto out; |
460 | } | 457 | } |
461 | } | 458 | } |
462 | if (last != NULL) { | 459 | if (cb->args[1]) { |
463 | nf_ct_put(last); | ||
464 | cb->args[1] = 0; | 460 | cb->args[1] = 0; |
465 | goto restart; | 461 | goto restart; |
466 | } | 462 | } |
467 | } | 463 | } |
468 | out: | 464 | out: |
469 | read_unlock_bh(&nf_conntrack_lock); | 465 | read_unlock_bh(&nf_conntrack_lock); |
466 | if (last) | ||
467 | nf_ct_put(last); | ||
470 | 468 | ||
471 | DEBUGP("leaving, last bucket=%lu id=%u\n", cb->args[0], *id); | 469 | DEBUGP("leaving, last bucket=%lu id=%u\n", cb->args[0], *id); |
472 | |||
473 | return skb->len; | 470 | return skb->len; |
474 | } | 471 | } |
475 | 472 | ||
diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index 5fcab2ef231f..4ef836699962 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c | |||
@@ -428,6 +428,8 @@ static struct file_operations ct_cpu_seq_fops = { | |||
428 | 428 | ||
429 | /* Sysctl support */ | 429 | /* Sysctl support */ |
430 | 430 | ||
431 | int nf_conntrack_checksum = 1; | ||
432 | |||
431 | #ifdef CONFIG_SYSCTL | 433 | #ifdef CONFIG_SYSCTL |
432 | 434 | ||
433 | /* From nf_conntrack_core.c */ | 435 | /* From nf_conntrack_core.c */ |
@@ -459,8 +461,6 @@ extern unsigned int nf_ct_generic_timeout; | |||
459 | static int log_invalid_proto_min = 0; | 461 | static int log_invalid_proto_min = 0; |
460 | static int log_invalid_proto_max = 255; | 462 | static int log_invalid_proto_max = 255; |
461 | 463 | ||
462 | int nf_conntrack_checksum = 1; | ||
463 | |||
464 | static struct ctl_table_header *nf_ct_sysctl_header; | 464 | static struct ctl_table_header *nf_ct_sysctl_header; |
465 | 465 | ||
466 | static ctl_table nf_ct_sysctl_table[] = { | 466 | static ctl_table nf_ct_sysctl_table[] = { |
diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c index bb6fcee452ca..662a869593bf 100644 --- a/net/netfilter/nf_queue.c +++ b/net/netfilter/nf_queue.c | |||
@@ -219,21 +219,20 @@ void nf_reinject(struct sk_buff *skb, struct nf_info *info, | |||
219 | 219 | ||
220 | switch (verdict & NF_VERDICT_MASK) { | 220 | switch (verdict & NF_VERDICT_MASK) { |
221 | case NF_ACCEPT: | 221 | case NF_ACCEPT: |
222 | case NF_STOP: | ||
222 | info->okfn(skb); | 223 | info->okfn(skb); |
224 | case NF_STOLEN: | ||
223 | break; | 225 | break; |
224 | |||
225 | case NF_QUEUE: | 226 | case NF_QUEUE: |
226 | if (!nf_queue(&skb, elem, info->pf, info->hook, | 227 | if (!nf_queue(&skb, elem, info->pf, info->hook, |
227 | info->indev, info->outdev, info->okfn, | 228 | info->indev, info->outdev, info->okfn, |
228 | verdict >> NF_VERDICT_BITS)) | 229 | verdict >> NF_VERDICT_BITS)) |
229 | goto next_hook; | 230 | goto next_hook; |
230 | break; | 231 | break; |
232 | default: | ||
233 | kfree_skb(skb); | ||
231 | } | 234 | } |
232 | rcu_read_unlock(); | 235 | rcu_read_unlock(); |
233 | |||
234 | if (verdict == NF_DROP) | ||
235 | kfree_skb(skb); | ||
236 | |||
237 | kfree(info); | 236 | kfree(info); |
238 | return; | 237 | return; |
239 | } | 238 | } |
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c index 61cdda4e5d3b..b59d3b2bde21 100644 --- a/net/netfilter/nfnetlink_log.c +++ b/net/netfilter/nfnetlink_log.c | |||
@@ -366,6 +366,9 @@ __nfulnl_send(struct nfulnl_instance *inst) | |||
366 | if (timer_pending(&inst->timer)) | 366 | if (timer_pending(&inst->timer)) |
367 | del_timer(&inst->timer); | 367 | del_timer(&inst->timer); |
368 | 368 | ||
369 | if (!inst->skb) | ||
370 | return 0; | ||
371 | |||
369 | if (inst->qlen > 1) | 372 | if (inst->qlen > 1) |
370 | inst->lastnlh->nlmsg_type = NLMSG_DONE; | 373 | inst->lastnlh->nlmsg_type = NLMSG_DONE; |
371 | 374 | ||
diff --git a/net/netfilter/xt_SECMARK.c b/net/netfilter/xt_SECMARK.c index c2ce9c4011cc..de9537ad9a7c 100644 --- a/net/netfilter/xt_SECMARK.c +++ b/net/netfilter/xt_SECMARK.c | |||
@@ -57,6 +57,8 @@ static int checkentry_selinux(struct xt_secmark_target_info *info) | |||
57 | { | 57 | { |
58 | int err; | 58 | int err; |
59 | struct xt_secmark_target_selinux_info *sel = &info->u.sel; | 59 | struct xt_secmark_target_selinux_info *sel = &info->u.sel; |
60 | |||
61 | sel->selctx[SECMARK_SELCTX_MAX - 1] = '\0'; | ||
60 | 62 | ||
61 | err = selinux_string_to_sid(sel->selctx, &sel->selsid); | 63 | err = selinux_string_to_sid(sel->selctx, &sel->selsid); |
62 | if (err) { | 64 | if (err) { |
diff --git a/net/netfilter/xt_physdev.c b/net/netfilter/xt_physdev.c index 5fe4c9df17f5..63a965467465 100644 --- a/net/netfilter/xt_physdev.c +++ b/net/netfilter/xt_physdev.c | |||
@@ -10,6 +10,7 @@ | |||
10 | 10 | ||
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/skbuff.h> | 12 | #include <linux/skbuff.h> |
13 | #include <linux/netfilter_bridge.h> | ||
13 | #include <linux/netfilter/xt_physdev.h> | 14 | #include <linux/netfilter/xt_physdev.h> |
14 | #include <linux/netfilter/x_tables.h> | 15 | #include <linux/netfilter/x_tables.h> |
15 | #include <linux/netfilter_bridge.h> | 16 | #include <linux/netfilter_bridge.h> |
@@ -113,6 +114,21 @@ checkentry(const char *tablename, | |||
113 | if (!(info->bitmask & XT_PHYSDEV_OP_MASK) || | 114 | if (!(info->bitmask & XT_PHYSDEV_OP_MASK) || |
114 | info->bitmask & ~XT_PHYSDEV_OP_MASK) | 115 | info->bitmask & ~XT_PHYSDEV_OP_MASK) |
115 | return 0; | 116 | return 0; |
117 | if (brnf_deferred_hooks == 0 && | ||
118 | info->bitmask & XT_PHYSDEV_OP_OUT && | ||
119 | (!(info->bitmask & XT_PHYSDEV_OP_BRIDGED) || | ||
120 | info->invert & XT_PHYSDEV_OP_BRIDGED) && | ||
121 | hook_mask & ((1 << NF_IP_LOCAL_OUT) | (1 << NF_IP_FORWARD) | | ||
122 | (1 << NF_IP_POST_ROUTING))) { | ||
123 | printk(KERN_WARNING "physdev match: using --physdev-out in the " | ||
124 | "OUTPUT, FORWARD and POSTROUTING chains for non-bridged " | ||
125 | "traffic is deprecated and breaks other things, it will " | ||
126 | "be removed in January 2007. See Documentation/" | ||
127 | "feature-removal-schedule.txt for details. This doesn't " | ||
128 | "affect you in case you're using it for purely bridged " | ||
129 | "traffic.\n"); | ||
130 | brnf_deferred_hooks = 1; | ||
131 | } | ||
116 | return 1; | 132 | return 1; |
117 | } | 133 | } |
118 | 134 | ||
diff --git a/net/netfilter/xt_pkttype.c b/net/netfilter/xt_pkttype.c index 3ac703b5cb8f..d2f5320a80bf 100644 --- a/net/netfilter/xt_pkttype.c +++ b/net/netfilter/xt_pkttype.c | |||
@@ -9,6 +9,8 @@ | |||
9 | #include <linux/skbuff.h> | 9 | #include <linux/skbuff.h> |
10 | #include <linux/if_ether.h> | 10 | #include <linux/if_ether.h> |
11 | #include <linux/if_packet.h> | 11 | #include <linux/if_packet.h> |
12 | #include <linux/in.h> | ||
13 | #include <linux/ip.h> | ||
12 | 14 | ||
13 | #include <linux/netfilter/xt_pkttype.h> | 15 | #include <linux/netfilter/xt_pkttype.h> |
14 | #include <linux/netfilter/x_tables.h> | 16 | #include <linux/netfilter/x_tables.h> |
@@ -28,9 +30,17 @@ static int match(const struct sk_buff *skb, | |||
28 | unsigned int protoff, | 30 | unsigned int protoff, |
29 | int *hotdrop) | 31 | int *hotdrop) |
30 | { | 32 | { |
33 | u_int8_t type; | ||
31 | const struct xt_pkttype_info *info = matchinfo; | 34 | const struct xt_pkttype_info *info = matchinfo; |
32 | 35 | ||
33 | return (skb->pkt_type == info->pkttype) ^ info->invert; | 36 | if (skb->pkt_type == PACKET_LOOPBACK) |
37 | type = (MULTICAST(skb->nh.iph->daddr) | ||
38 | ? PACKET_MULTICAST | ||
39 | : PACKET_BROADCAST); | ||
40 | else | ||
41 | type = skb->pkt_type; | ||
42 | |||
43 | return (type == info->pkttype) ^ info->invert; | ||
34 | } | 44 | } |
35 | 45 | ||
36 | static struct xt_match pkttype_match = { | 46 | static struct xt_match pkttype_match = { |
diff --git a/net/netfilter/xt_string.c b/net/netfilter/xt_string.c index 0ebb6ac2c8c7..275330fcdaaa 100644 --- a/net/netfilter/xt_string.c +++ b/net/netfilter/xt_string.c | |||
@@ -37,7 +37,7 @@ static int match(const struct sk_buff *skb, | |||
37 | 37 | ||
38 | return (skb_find_text((struct sk_buff *)skb, conf->from_offset, | 38 | return (skb_find_text((struct sk_buff *)skb, conf->from_offset, |
39 | conf->to_offset, conf->config, &state) | 39 | conf->to_offset, conf->config, &state) |
40 | != UINT_MAX) && !conf->invert; | 40 | != UINT_MAX) ^ conf->invert; |
41 | } | 41 | } |
42 | 42 | ||
43 | #define STRING_TEXT_PRIV(m) ((struct xt_string_info *) m) | 43 | #define STRING_TEXT_PRIV(m) ((struct xt_string_info *) m) |
@@ -55,7 +55,10 @@ static int checkentry(const char *tablename, | |||
55 | /* Damn, can't handle this case properly with iptables... */ | 55 | /* Damn, can't handle this case properly with iptables... */ |
56 | if (conf->from_offset > conf->to_offset) | 56 | if (conf->from_offset > conf->to_offset) |
57 | return 0; | 57 | return 0; |
58 | 58 | if (conf->algo[XT_STRING_MAX_ALGO_NAME_SIZE - 1] != '\0') | |
59 | return 0; | ||
60 | if (conf->patlen > XT_STRING_MAX_PATTERN_SIZE) | ||
61 | return 0; | ||
59 | ts_conf = textsearch_prepare(conf->algo, conf->pattern, conf->patlen, | 62 | ts_conf = textsearch_prepare(conf->algo, conf->pattern, conf->patlen, |
60 | GFP_KERNEL, TS_AUTOLOAD); | 63 | GFP_KERNEL, TS_AUTOLOAD); |
61 | if (IS_ERR(ts_conf)) | 64 | if (IS_ERR(ts_conf)) |
diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c index eea366966740..0a6cfa0005be 100644 --- a/net/sched/cls_u32.c +++ b/net/sched/cls_u32.c | |||
@@ -796,7 +796,7 @@ static int __init init_u32(void) | |||
796 | { | 796 | { |
797 | printk("u32 classifier\n"); | 797 | printk("u32 classifier\n"); |
798 | #ifdef CONFIG_CLS_U32_PERF | 798 | #ifdef CONFIG_CLS_U32_PERF |
799 | printk(" Perfomance counters on\n"); | 799 | printk(" Performance counters on\n"); |
800 | #endif | 800 | #endif |
801 | #ifdef CONFIG_NET_CLS_POLICE | 801 | #ifdef CONFIG_NET_CLS_POLICE |
802 | printk(" OLD policer on \n"); | 802 | printk(" OLD policer on \n"); |
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index c7844bacbbcb..a19eff12cf78 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
@@ -430,7 +430,7 @@ qdisc_create(struct net_device *dev, u32 handle, struct rtattr **tca, int *errp) | |||
430 | } | 430 | } |
431 | #endif | 431 | #endif |
432 | 432 | ||
433 | err = -EINVAL; | 433 | err = -ENOENT; |
434 | if (ops == NULL) | 434 | if (ops == NULL) |
435 | goto err_out; | 435 | goto err_out; |
436 | 436 | ||
diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index 7026b0866b7b..00cb388ece03 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c | |||
@@ -71,7 +71,12 @@ struct cache_head *sunrpc_cache_lookup(struct cache_detail *detail, | |||
71 | new = detail->alloc(); | 71 | new = detail->alloc(); |
72 | if (!new) | 72 | if (!new) |
73 | return NULL; | 73 | return NULL; |
74 | /* must fully initialise 'new', else | ||
75 | * we might get lose if we need to | ||
76 | * cache_put it soon. | ||
77 | */ | ||
74 | cache_init(new); | 78 | cache_init(new); |
79 | detail->init(new, key); | ||
75 | 80 | ||
76 | write_lock(&detail->hash_lock); | 81 | write_lock(&detail->hash_lock); |
77 | 82 | ||
@@ -85,7 +90,6 @@ struct cache_head *sunrpc_cache_lookup(struct cache_detail *detail, | |||
85 | return tmp; | 90 | return tmp; |
86 | } | 91 | } |
87 | } | 92 | } |
88 | detail->init(new, key); | ||
89 | new->next = *head; | 93 | new->next = *head; |
90 | *head = new; | 94 | *head = new; |
91 | detail->entries++; | 95 | detail->entries++; |
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 4ba271f892c8..d6409e757219 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -921,26 +921,43 @@ call_transmit(struct rpc_task *task) | |||
921 | task->tk_status = xprt_prepare_transmit(task); | 921 | task->tk_status = xprt_prepare_transmit(task); |
922 | if (task->tk_status != 0) | 922 | if (task->tk_status != 0) |
923 | return; | 923 | return; |
924 | task->tk_action = call_transmit_status; | ||
924 | /* Encode here so that rpcsec_gss can use correct sequence number. */ | 925 | /* Encode here so that rpcsec_gss can use correct sequence number. */ |
925 | if (rpc_task_need_encode(task)) { | 926 | if (rpc_task_need_encode(task)) { |
926 | task->tk_rqstp->rq_bytes_sent = 0; | 927 | BUG_ON(task->tk_rqstp->rq_bytes_sent != 0); |
927 | call_encode(task); | 928 | call_encode(task); |
928 | /* Did the encode result in an error condition? */ | 929 | /* Did the encode result in an error condition? */ |
929 | if (task->tk_status != 0) | 930 | if (task->tk_status != 0) |
930 | goto out_nosend; | 931 | return; |
931 | } | 932 | } |
932 | task->tk_action = call_transmit_status; | ||
933 | xprt_transmit(task); | 933 | xprt_transmit(task); |
934 | if (task->tk_status < 0) | 934 | if (task->tk_status < 0) |
935 | return; | 935 | return; |
936 | if (!task->tk_msg.rpc_proc->p_decode) { | 936 | /* |
937 | task->tk_action = rpc_exit_task; | 937 | * On success, ensure that we call xprt_end_transmit() before sleeping |
938 | rpc_wake_up_task(task); | 938 | * in order to allow access to the socket to other RPC requests. |
939 | } | 939 | */ |
940 | return; | 940 | call_transmit_status(task); |
941 | out_nosend: | 941 | if (task->tk_msg.rpc_proc->p_decode != NULL) |
942 | /* release socket write lock before attempting to handle error */ | 942 | return; |
943 | xprt_abort_transmit(task); | 943 | task->tk_action = rpc_exit_task; |
944 | rpc_wake_up_task(task); | ||
945 | } | ||
946 | |||
947 | /* | ||
948 | * 5a. Handle cleanup after a transmission | ||
949 | */ | ||
950 | static void | ||
951 | call_transmit_status(struct rpc_task *task) | ||
952 | { | ||
953 | task->tk_action = call_status; | ||
954 | /* | ||
955 | * Special case: if we've been waiting on the socket's write_space() | ||
956 | * callback, then don't call xprt_end_transmit(). | ||
957 | */ | ||
958 | if (task->tk_status == -EAGAIN) | ||
959 | return; | ||
960 | xprt_end_transmit(task); | ||
944 | rpc_task_force_reencode(task); | 961 | rpc_task_force_reencode(task); |
945 | } | 962 | } |
946 | 963 | ||
@@ -992,18 +1009,7 @@ call_status(struct rpc_task *task) | |||
992 | } | 1009 | } |
993 | 1010 | ||
994 | /* | 1011 | /* |
995 | * 6a. Handle transmission errors. | 1012 | * 6a. Handle RPC timeout |
996 | */ | ||
997 | static void | ||
998 | call_transmit_status(struct rpc_task *task) | ||
999 | { | ||
1000 | if (task->tk_status != -EAGAIN) | ||
1001 | rpc_task_force_reencode(task); | ||
1002 | call_status(task); | ||
1003 | } | ||
1004 | |||
1005 | /* | ||
1006 | * 6b. Handle RPC timeout | ||
1007 | * We do not release the request slot, so we keep using the | 1013 | * We do not release the request slot, so we keep using the |
1008 | * same XID for all retransmits. | 1014 | * same XID for all retransmits. |
1009 | */ | 1015 | */ |
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index dc6cb93c8830..a3bd2db2e024 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
@@ -667,10 +667,11 @@ rpc_mkdir(char *path, struct rpc_clnt *rpc_client) | |||
667 | RPCAUTH_info, RPCAUTH_EOF); | 667 | RPCAUTH_info, RPCAUTH_EOF); |
668 | if (error) | 668 | if (error) |
669 | goto err_depopulate; | 669 | goto err_depopulate; |
670 | dget(dentry); | ||
670 | out: | 671 | out: |
671 | mutex_unlock(&dir->i_mutex); | 672 | mutex_unlock(&dir->i_mutex); |
672 | rpc_release_path(&nd); | 673 | rpc_release_path(&nd); |
673 | return dget(dentry); | 674 | return dentry; |
674 | err_depopulate: | 675 | err_depopulate: |
675 | rpc_depopulate(dentry); | 676 | rpc_depopulate(dentry); |
676 | __rpc_rmdir(dir, dentry); | 677 | __rpc_rmdir(dir, dentry); |
@@ -731,10 +732,11 @@ rpc_mkpipe(char *path, void *private, struct rpc_pipe_ops *ops, int flags) | |||
731 | rpci->flags = flags; | 732 | rpci->flags = flags; |
732 | rpci->ops = ops; | 733 | rpci->ops = ops; |
733 | inode_dir_notify(dir, DN_CREATE); | 734 | inode_dir_notify(dir, DN_CREATE); |
735 | dget(dentry); | ||
734 | out: | 736 | out: |
735 | mutex_unlock(&dir->i_mutex); | 737 | mutex_unlock(&dir->i_mutex); |
736 | rpc_release_path(&nd); | 738 | rpc_release_path(&nd); |
737 | return dget(dentry); | 739 | return dentry; |
738 | err_dput: | 740 | err_dput: |
739 | dput(dentry); | 741 | dput(dentry); |
740 | dentry = ERR_PTR(-ENOMEM); | 742 | dentry = ERR_PTR(-ENOMEM); |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 313b68d892c6..e8c2bc4977f3 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
@@ -707,12 +707,9 @@ out_unlock: | |||
707 | return err; | 707 | return err; |
708 | } | 708 | } |
709 | 709 | ||
710 | void | 710 | void xprt_end_transmit(struct rpc_task *task) |
711 | xprt_abort_transmit(struct rpc_task *task) | ||
712 | { | 711 | { |
713 | struct rpc_xprt *xprt = task->tk_xprt; | 712 | xprt_release_write(task->tk_xprt, task); |
714 | |||
715 | xprt_release_write(xprt, task); | ||
716 | } | 713 | } |
717 | 714 | ||
718 | /** | 715 | /** |
@@ -761,8 +758,6 @@ void xprt_transmit(struct rpc_task *task) | |||
761 | task->tk_status = -ENOTCONN; | 758 | task->tk_status = -ENOTCONN; |
762 | else if (!req->rq_received) | 759 | else if (!req->rq_received) |
763 | rpc_sleep_on(&xprt->pending, task, NULL, xprt_timer); | 760 | rpc_sleep_on(&xprt->pending, task, NULL, xprt_timer); |
764 | |||
765 | xprt->ops->release_xprt(xprt, task); | ||
766 | spin_unlock_bh(&xprt->transport_lock); | 761 | spin_unlock_bh(&xprt->transport_lock); |
767 | return; | 762 | return; |
768 | } | 763 | } |
@@ -772,18 +767,8 @@ void xprt_transmit(struct rpc_task *task) | |||
772 | * schedq, and being picked up by a parallel run of rpciod(). | 767 | * schedq, and being picked up by a parallel run of rpciod(). |
773 | */ | 768 | */ |
774 | task->tk_status = status; | 769 | task->tk_status = status; |
775 | 770 | if (status == -ECONNREFUSED) | |
776 | switch (status) { | ||
777 | case -ECONNREFUSED: | ||
778 | rpc_sleep_on(&xprt->sending, task, NULL, NULL); | 771 | rpc_sleep_on(&xprt->sending, task, NULL, NULL); |
779 | case -EAGAIN: | ||
780 | case -ENOTCONN: | ||
781 | return; | ||
782 | default: | ||
783 | break; | ||
784 | } | ||
785 | xprt_release_write(xprt, task); | ||
786 | return; | ||
787 | } | 772 | } |
788 | 773 | ||
789 | static inline void do_xprt_reserve(struct rpc_task *task) | 774 | static inline void do_xprt_reserve(struct rpc_task *task) |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index ee678ed13b6f..441bd53f5eca 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -414,6 +414,33 @@ static int xs_tcp_send_request(struct rpc_task *task) | |||
414 | } | 414 | } |
415 | 415 | ||
416 | /** | 416 | /** |
417 | * xs_tcp_release_xprt - clean up after a tcp transmission | ||
418 | * @xprt: transport | ||
419 | * @task: rpc task | ||
420 | * | ||
421 | * This cleans up if an error causes us to abort the transmission of a request. | ||
422 | * In this case, the socket may need to be reset in order to avoid confusing | ||
423 | * the server. | ||
424 | */ | ||
425 | static void xs_tcp_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task) | ||
426 | { | ||
427 | struct rpc_rqst *req; | ||
428 | |||
429 | if (task != xprt->snd_task) | ||
430 | return; | ||
431 | if (task == NULL) | ||
432 | goto out_release; | ||
433 | req = task->tk_rqstp; | ||
434 | if (req->rq_bytes_sent == 0) | ||
435 | goto out_release; | ||
436 | if (req->rq_bytes_sent == req->rq_snd_buf.len) | ||
437 | goto out_release; | ||
438 | set_bit(XPRT_CLOSE_WAIT, &task->tk_xprt->state); | ||
439 | out_release: | ||
440 | xprt_release_xprt(xprt, task); | ||
441 | } | ||
442 | |||
443 | /** | ||
417 | * xs_close - close a socket | 444 | * xs_close - close a socket |
418 | * @xprt: transport | 445 | * @xprt: transport |
419 | * | 446 | * |
@@ -1250,7 +1277,7 @@ static struct rpc_xprt_ops xs_udp_ops = { | |||
1250 | 1277 | ||
1251 | static struct rpc_xprt_ops xs_tcp_ops = { | 1278 | static struct rpc_xprt_ops xs_tcp_ops = { |
1252 | .reserve_xprt = xprt_reserve_xprt, | 1279 | .reserve_xprt = xprt_reserve_xprt, |
1253 | .release_xprt = xprt_release_xprt, | 1280 | .release_xprt = xs_tcp_release_xprt, |
1254 | .set_port = xs_set_port, | 1281 | .set_port = xs_set_port, |
1255 | .connect = xs_connect, | 1282 | .connect = xs_connect, |
1256 | .buf_alloc = rpc_malloc, | 1283 | .buf_alloc = rpc_malloc, |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 6f2909279268..de6ec519272e 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -128,23 +128,17 @@ static atomic_t unix_nr_socks = ATOMIC_INIT(0); | |||
128 | #define UNIX_ABSTRACT(sk) (unix_sk(sk)->addr->hash != UNIX_HASH_SIZE) | 128 | #define UNIX_ABSTRACT(sk) (unix_sk(sk)->addr->hash != UNIX_HASH_SIZE) |
129 | 129 | ||
130 | #ifdef CONFIG_SECURITY_NETWORK | 130 | #ifdef CONFIG_SECURITY_NETWORK |
131 | static void unix_get_peersec_dgram(struct sk_buff *skb) | 131 | static void unix_get_secdata(struct scm_cookie *scm, struct sk_buff *skb) |
132 | { | 132 | { |
133 | int err; | 133 | memcpy(UNIXSID(skb), &scm->secid, sizeof(u32)); |
134 | |||
135 | err = security_socket_getpeersec_dgram(skb, UNIXSECDATA(skb), | ||
136 | UNIXSECLEN(skb)); | ||
137 | if (err) | ||
138 | *(UNIXSECDATA(skb)) = NULL; | ||
139 | } | 134 | } |
140 | 135 | ||
141 | static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb) | 136 | static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb) |
142 | { | 137 | { |
143 | scm->secdata = *UNIXSECDATA(skb); | 138 | scm->secid = *UNIXSID(skb); |
144 | scm->seclen = *UNIXSECLEN(skb); | ||
145 | } | 139 | } |
146 | #else | 140 | #else |
147 | static inline void unix_get_peersec_dgram(struct sk_buff *skb) | 141 | static inline void unix_get_secdata(struct scm_cookie *scm, struct sk_buff *skb) |
148 | { } | 142 | { } |
149 | 143 | ||
150 | static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb) | 144 | static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb) |
@@ -1322,8 +1316,7 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock, | |||
1322 | memcpy(UNIXCREDS(skb), &siocb->scm->creds, sizeof(struct ucred)); | 1316 | memcpy(UNIXCREDS(skb), &siocb->scm->creds, sizeof(struct ucred)); |
1323 | if (siocb->scm->fp) | 1317 | if (siocb->scm->fp) |
1324 | unix_attach_fds(siocb->scm, skb); | 1318 | unix_attach_fds(siocb->scm, skb); |
1325 | 1319 | unix_get_secdata(siocb->scm, skb); | |
1326 | unix_get_peersec_dgram(skb); | ||
1327 | 1320 | ||
1328 | skb->h.raw = skb->data; | 1321 | skb->h.raw = skb->data; |
1329 | err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len); | 1322 | err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len); |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index f35bc676128c..3da67ca2c3ce 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -1134,12 +1134,33 @@ int __xfrm_route_forward(struct sk_buff *skb, unsigned short family) | |||
1134 | } | 1134 | } |
1135 | EXPORT_SYMBOL(__xfrm_route_forward); | 1135 | EXPORT_SYMBOL(__xfrm_route_forward); |
1136 | 1136 | ||
1137 | /* Optimize later using cookies and generation ids. */ | ||
1138 | |||
1137 | static struct dst_entry *xfrm_dst_check(struct dst_entry *dst, u32 cookie) | 1139 | static struct dst_entry *xfrm_dst_check(struct dst_entry *dst, u32 cookie) |
1138 | { | 1140 | { |
1139 | /* If it is marked obsolete, which is how we even get here, | 1141 | /* Code (such as __xfrm4_bundle_create()) sets dst->obsolete |
1140 | * then we have purged it from the policy bundle list and we | 1142 | * to "-1" to force all XFRM destinations to get validated by |
1141 | * did that for a good reason. | 1143 | * dst_ops->check on every use. We do this because when a |
1144 | * normal route referenced by an XFRM dst is obsoleted we do | ||
1145 | * not go looking around for all parent referencing XFRM dsts | ||
1146 | * so that we can invalidate them. It is just too much work. | ||
1147 | * Instead we make the checks here on every use. For example: | ||
1148 | * | ||
1149 | * XFRM dst A --> IPv4 dst X | ||
1150 | * | ||
1151 | * X is the "xdst->route" of A (X is also the "dst->path" of A | ||
1152 | * in this example). If X is marked obsolete, "A" will not | ||
1153 | * notice. That's what we are validating here via the | ||
1154 | * stale_bundle() check. | ||
1155 | * | ||
1156 | * When a policy's bundle is pruned, we dst_free() the XFRM | ||
1157 | * dst which causes it's ->obsolete field to be set to a | ||
1158 | * positive non-zero integer. If an XFRM dst has been pruned | ||
1159 | * like this, we want to force a new route lookup. | ||
1142 | */ | 1160 | */ |
1161 | if (dst->obsolete < 0 && !stale_bundle(dst)) | ||
1162 | return dst; | ||
1163 | |||
1143 | return NULL; | 1164 | return NULL; |
1144 | } | 1165 | } |
1145 | 1166 | ||
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index 2180c88cfe89..bb19c1561f1e 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include | |||
@@ -77,14 +77,20 @@ cc-option-align = $(subst -functions=0,,\ | |||
77 | 77 | ||
78 | # cc-version | 78 | # cc-version |
79 | # Usage gcc-ver := $(call cc-version, $(CC)) | 79 | # Usage gcc-ver := $(call cc-version, $(CC)) |
80 | cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh \ | 80 | cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC)) |
81 | $(if $(1), $(1), $(CC))) | ||
82 | 81 | ||
83 | # cc-ifversion | 82 | # cc-ifversion |
84 | # Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1) | 83 | # Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1) |
85 | cc-ifversion = $(shell if [ $(call cc-version, $(CC)) $(1) $(2) ]; then \ | 84 | cc-ifversion = $(shell if [ $(call cc-version, $(CC)) $(1) $(2) ]; then \ |
86 | echo $(3); fi;) | 85 | echo $(3); fi;) |
87 | 86 | ||
87 | # ld-option | ||
88 | # Usage: ldflags += $(call ld-option, -Wl$(comma)--hash-style=both) | ||
89 | ld-option = $(shell if $(CC) $(1) \ | ||
90 | -nostdlib -o ldtest$$$$.out -xc /dev/null \ | ||
91 | > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi; \ | ||
92 | rm -f ldtest$$$$.out) | ||
93 | |||
88 | ### | 94 | ### |
89 | # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj= | 95 | # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj= |
90 | # Usage: | 96 | # Usage: |
diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost index a49550205dcc..0a64688c2b5d 100644 --- a/scripts/Makefile.modpost +++ b/scripts/Makefile.modpost | |||
@@ -40,7 +40,7 @@ include scripts/Kbuild.include | |||
40 | include scripts/Makefile.lib | 40 | include scripts/Makefile.lib |
41 | 41 | ||
42 | kernelsymfile := $(objtree)/Module.symvers | 42 | kernelsymfile := $(objtree)/Module.symvers |
43 | modulesymfile := $(KBUILD_EXTMOD)/Modules.symvers | 43 | modulesymfile := $(KBUILD_EXTMOD)/Module.symvers |
44 | 44 | ||
45 | # Step 1), find all modules listed in $(MODVERDIR)/ | 45 | # Step 1), find all modules listed in $(MODVERDIR)/ |
46 | __modules := $(sort $(shell grep -h '\.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod))) | 46 | __modules := $(sort $(shell grep -h '\.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod))) |
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 2ee48c377b66..a69d8acbf274 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c | |||
@@ -357,7 +357,7 @@ int conf_read(const char *name) | |||
357 | for (e = prop->expr; e; e = e->left.expr) | 357 | for (e = prop->expr; e; e = e->left.expr) |
358 | if (e->right.sym->visible != no) | 358 | if (e->right.sym->visible != no) |
359 | flags &= e->right.sym->flags; | 359 | flags &= e->right.sym->flags; |
360 | sym->flags |= flags & SYMBOL_DEF_USER; | 360 | sym->flags &= flags | ~SYMBOL_DEF_USER; |
361 | } | 361 | } |
362 | 362 | ||
363 | sym_change_count += conf_warnings || conf_unsaved; | 363 | sym_change_count += conf_warnings || conf_unsaved; |
diff --git a/scripts/kernel-doc b/scripts/kernel-doc index f9460a6218de..c9ca0c23bd91 100755 --- a/scripts/kernel-doc +++ b/scripts/kernel-doc | |||
@@ -1518,6 +1518,7 @@ sub dump_function($$) { | |||
1518 | $prototype =~ s/^asmlinkage +//; | 1518 | $prototype =~ s/^asmlinkage +//; |
1519 | $prototype =~ s/^inline +//; | 1519 | $prototype =~ s/^inline +//; |
1520 | $prototype =~ s/^__inline__ +//; | 1520 | $prototype =~ s/^__inline__ +//; |
1521 | $prototype =~ s/__devinit +//; | ||
1521 | $prototype =~ s/^#define +//; #ak added | 1522 | $prototype =~ s/^#define +//; #ak added |
1522 | $prototype =~ s/__attribute__ \(\([a-z,]*\)\)//; | 1523 | $prototype =~ s/__attribute__ \(\([a-z,]*\)\)//; |
1523 | 1524 | ||
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 37f67c23e11b..e2de650d3dbf 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
@@ -52,6 +52,23 @@ do { \ | |||
52 | sprintf(str + strlen(str), "*"); \ | 52 | sprintf(str + strlen(str), "*"); \ |
53 | } while(0) | 53 | } while(0) |
54 | 54 | ||
55 | /** | ||
56 | * Check that sizeof(device_id type) are consistent with size of section | ||
57 | * in .o file. If in-consistent then userspace and kernel does not agree | ||
58 | * on actual size which is a bug. | ||
59 | **/ | ||
60 | static void device_id_size_check(const char *modname, const char *device_id, | ||
61 | unsigned long size, unsigned long id_size) | ||
62 | { | ||
63 | if (size % id_size || size < id_size) { | ||
64 | fatal("%s: sizeof(struct %s_device_id)=%lu is not a modulo " | ||
65 | "of the size of section __mod_%s_device_table=%lu.\n" | ||
66 | "Fix definition of struct %s_device_id " | ||
67 | "in mod_devicetable.h\n", | ||
68 | modname, device_id, id_size, device_id, size, device_id); | ||
69 | } | ||
70 | } | ||
71 | |||
55 | /* USB is special because the bcdDevice can be matched against a numeric range */ | 72 | /* USB is special because the bcdDevice can be matched against a numeric range */ |
56 | /* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipN" */ | 73 | /* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipN" */ |
57 | static void do_usb_entry(struct usb_device_id *id, | 74 | static void do_usb_entry(struct usb_device_id *id, |
@@ -152,10 +169,8 @@ static void do_usb_table(void *symval, unsigned long size, | |||
152 | unsigned int i; | 169 | unsigned int i; |
153 | const unsigned long id_size = sizeof(struct usb_device_id); | 170 | const unsigned long id_size = sizeof(struct usb_device_id); |
154 | 171 | ||
155 | if (size % id_size || size < id_size) { | 172 | device_id_size_check(mod->name, "usb", size, id_size); |
156 | warn("%s ids %lu bad size " | 173 | |
157 | "(each on %lu)\n", mod->name, size, id_size); | ||
158 | } | ||
159 | /* Leave last one: it's the terminator. */ | 174 | /* Leave last one: it's the terminator. */ |
160 | size -= id_size; | 175 | size -= id_size; |
161 | 176 | ||
@@ -376,7 +391,7 @@ static void do_input(char *alias, | |||
376 | unsigned int i; | 391 | unsigned int i; |
377 | 392 | ||
378 | for (i = min; i < max; i++) | 393 | for (i = min; i < max; i++) |
379 | if (arr[i / BITS_PER_LONG] & (1 << (i%BITS_PER_LONG))) | 394 | if (arr[i / BITS_PER_LONG] & (1L << (i%BITS_PER_LONG))) |
380 | sprintf(alias + strlen(alias), "%X,*", i); | 395 | sprintf(alias + strlen(alias), "%X,*", i); |
381 | } | 396 | } |
382 | 397 | ||
@@ -434,6 +449,7 @@ static inline int sym_is(const char *symbol, const char *name) | |||
434 | 449 | ||
435 | static void do_table(void *symval, unsigned long size, | 450 | static void do_table(void *symval, unsigned long size, |
436 | unsigned long id_size, | 451 | unsigned long id_size, |
452 | const char *device_id, | ||
437 | void *function, | 453 | void *function, |
438 | struct module *mod) | 454 | struct module *mod) |
439 | { | 455 | { |
@@ -441,10 +457,7 @@ static void do_table(void *symval, unsigned long size, | |||
441 | char alias[500]; | 457 | char alias[500]; |
442 | int (*do_entry)(const char *, void *entry, char *alias) = function; | 458 | int (*do_entry)(const char *, void *entry, char *alias) = function; |
443 | 459 | ||
444 | if (size % id_size || size < id_size) { | 460 | device_id_size_check(mod->name, device_id, size, id_size); |
445 | warn("%s ids %lu bad size " | ||
446 | "(each on %lu)\n", mod->name, size, id_size); | ||
447 | } | ||
448 | /* Leave last one: it's the terminator. */ | 461 | /* Leave last one: it's the terminator. */ |
449 | size -= id_size; | 462 | size -= id_size; |
450 | 463 | ||
@@ -476,40 +489,51 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, | |||
476 | + sym->st_value; | 489 | + sym->st_value; |
477 | 490 | ||
478 | if (sym_is(symname, "__mod_pci_device_table")) | 491 | if (sym_is(symname, "__mod_pci_device_table")) |
479 | do_table(symval, sym->st_size, sizeof(struct pci_device_id), | 492 | do_table(symval, sym->st_size, |
493 | sizeof(struct pci_device_id), "pci", | ||
480 | do_pci_entry, mod); | 494 | do_pci_entry, mod); |
481 | else if (sym_is(symname, "__mod_usb_device_table")) | 495 | else if (sym_is(symname, "__mod_usb_device_table")) |
482 | /* special case to handle bcdDevice ranges */ | 496 | /* special case to handle bcdDevice ranges */ |
483 | do_usb_table(symval, sym->st_size, mod); | 497 | do_usb_table(symval, sym->st_size, mod); |
484 | else if (sym_is(symname, "__mod_ieee1394_device_table")) | 498 | else if (sym_is(symname, "__mod_ieee1394_device_table")) |
485 | do_table(symval, sym->st_size, sizeof(struct ieee1394_device_id), | 499 | do_table(symval, sym->st_size, |
500 | sizeof(struct ieee1394_device_id), "ieee1394", | ||
486 | do_ieee1394_entry, mod); | 501 | do_ieee1394_entry, mod); |
487 | else if (sym_is(symname, "__mod_ccw_device_table")) | 502 | else if (sym_is(symname, "__mod_ccw_device_table")) |
488 | do_table(symval, sym->st_size, sizeof(struct ccw_device_id), | 503 | do_table(symval, sym->st_size, |
504 | sizeof(struct ccw_device_id), "ccw", | ||
489 | do_ccw_entry, mod); | 505 | do_ccw_entry, mod); |
490 | else if (sym_is(symname, "__mod_serio_device_table")) | 506 | else if (sym_is(symname, "__mod_serio_device_table")) |
491 | do_table(symval, sym->st_size, sizeof(struct serio_device_id), | 507 | do_table(symval, sym->st_size, |
508 | sizeof(struct serio_device_id), "serio", | ||
492 | do_serio_entry, mod); | 509 | do_serio_entry, mod); |
493 | else if (sym_is(symname, "__mod_pnp_device_table")) | 510 | else if (sym_is(symname, "__mod_pnp_device_table")) |
494 | do_table(symval, sym->st_size, sizeof(struct pnp_device_id), | 511 | do_table(symval, sym->st_size, |
512 | sizeof(struct pnp_device_id), "pnp", | ||
495 | do_pnp_entry, mod); | 513 | do_pnp_entry, mod); |
496 | else if (sym_is(symname, "__mod_pnp_card_device_table")) | 514 | else if (sym_is(symname, "__mod_pnp_card_device_table")) |
497 | do_table(symval, sym->st_size, sizeof(struct pnp_card_device_id), | 515 | do_table(symval, sym->st_size, |
516 | sizeof(struct pnp_card_device_id), "pnp_card", | ||
498 | do_pnp_card_entry, mod); | 517 | do_pnp_card_entry, mod); |
499 | else if (sym_is(symname, "__mod_pcmcia_device_table")) | 518 | else if (sym_is(symname, "__mod_pcmcia_device_table")) |
500 | do_table(symval, sym->st_size, sizeof(struct pcmcia_device_id), | 519 | do_table(symval, sym->st_size, |
520 | sizeof(struct pcmcia_device_id), "pcmcia", | ||
501 | do_pcmcia_entry, mod); | 521 | do_pcmcia_entry, mod); |
502 | else if (sym_is(symname, "__mod_of_device_table")) | 522 | else if (sym_is(symname, "__mod_of_device_table")) |
503 | do_table(symval, sym->st_size, sizeof(struct of_device_id), | 523 | do_table(symval, sym->st_size, |
524 | sizeof(struct of_device_id), "of", | ||
504 | do_of_entry, mod); | 525 | do_of_entry, mod); |
505 | else if (sym_is(symname, "__mod_vio_device_table")) | 526 | else if (sym_is(symname, "__mod_vio_device_table")) |
506 | do_table(symval, sym->st_size, sizeof(struct vio_device_id), | 527 | do_table(symval, sym->st_size, |
528 | sizeof(struct vio_device_id), "vio", | ||
507 | do_vio_entry, mod); | 529 | do_vio_entry, mod); |
508 | else if (sym_is(symname, "__mod_i2c_device_table")) | 530 | else if (sym_is(symname, "__mod_i2c_device_table")) |
509 | do_table(symval, sym->st_size, sizeof(struct i2c_device_id), | 531 | do_table(symval, sym->st_size, |
532 | sizeof(struct i2c_device_id), "i2c", | ||
510 | do_i2c_entry, mod); | 533 | do_i2c_entry, mod); |
511 | else if (sym_is(symname, "__mod_input_device_table")) | 534 | else if (sym_is(symname, "__mod_input_device_table")) |
512 | do_table(symval, sym->st_size, sizeof(struct input_device_id), | 535 | do_table(symval, sym->st_size, |
536 | sizeof(struct input_device_id), "input", | ||
513 | do_input_entry, mod); | 537 | do_input_entry, mod); |
514 | } | 538 | } |
515 | 539 | ||
diff --git a/security/dummy.c b/security/dummy.c index bbbfda70e131..58c6d399c844 100644 --- a/security/dummy.c +++ b/security/dummy.c | |||
@@ -791,8 +791,7 @@ static int dummy_socket_getpeersec_stream(struct socket *sock, char __user *optv | |||
791 | return -ENOPROTOOPT; | 791 | return -ENOPROTOOPT; |
792 | } | 792 | } |
793 | 793 | ||
794 | static int dummy_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata, | 794 | static int dummy_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) |
795 | u32 *seclen) | ||
796 | { | 795 | { |
797 | return -ENOPROTOOPT; | 796 | return -ENOPROTOOPT; |
798 | } | 797 | } |
@@ -876,6 +875,15 @@ static int dummy_setprocattr(struct task_struct *p, char *name, void *value, siz | |||
876 | return -EINVAL; | 875 | return -EINVAL; |
877 | } | 876 | } |
878 | 877 | ||
878 | static int dummy_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) | ||
879 | { | ||
880 | return -EOPNOTSUPP; | ||
881 | } | ||
882 | |||
883 | static void dummy_release_secctx(char *secdata, u32 seclen) | ||
884 | { | ||
885 | } | ||
886 | |||
879 | #ifdef CONFIG_KEYS | 887 | #ifdef CONFIG_KEYS |
880 | static inline int dummy_key_alloc(struct key *key, struct task_struct *ctx, | 888 | static inline int dummy_key_alloc(struct key *key, struct task_struct *ctx, |
881 | unsigned long flags) | 889 | unsigned long flags) |
@@ -1028,6 +1036,8 @@ void security_fixup_ops (struct security_operations *ops) | |||
1028 | set_to_dummy_if_null(ops, d_instantiate); | 1036 | set_to_dummy_if_null(ops, d_instantiate); |
1029 | set_to_dummy_if_null(ops, getprocattr); | 1037 | set_to_dummy_if_null(ops, getprocattr); |
1030 | set_to_dummy_if_null(ops, setprocattr); | 1038 | set_to_dummy_if_null(ops, setprocattr); |
1039 | set_to_dummy_if_null(ops, secid_to_secctx); | ||
1040 | set_to_dummy_if_null(ops, release_secctx); | ||
1031 | #ifdef CONFIG_SECURITY_NETWORK | 1041 | #ifdef CONFIG_SECURITY_NETWORK |
1032 | set_to_dummy_if_null(ops, unix_stream_connect); | 1042 | set_to_dummy_if_null(ops, unix_stream_connect); |
1033 | set_to_dummy_if_null(ops, unix_may_send); | 1043 | set_to_dummy_if_null(ops, unix_may_send); |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index a91c961ba38b..5d1b8c733199 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -3524,25 +3524,21 @@ out: | |||
3524 | return err; | 3524 | return err; |
3525 | } | 3525 | } |
3526 | 3526 | ||
3527 | static int selinux_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata, u32 *seclen) | 3527 | static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) |
3528 | { | 3528 | { |
3529 | u32 peer_secid = SECSID_NULL; | ||
3529 | int err = 0; | 3530 | int err = 0; |
3530 | u32 peer_sid; | ||
3531 | 3531 | ||
3532 | if (skb->sk->sk_family == PF_UNIX) | 3532 | if (sock && (sock->sk->sk_family == PF_UNIX)) |
3533 | selinux_get_inode_sid(SOCK_INODE(skb->sk->sk_socket), | 3533 | selinux_get_inode_sid(SOCK_INODE(sock), &peer_secid); |
3534 | &peer_sid); | 3534 | else if (skb) |
3535 | else | 3535 | peer_secid = selinux_socket_getpeer_dgram(skb); |
3536 | peer_sid = selinux_socket_getpeer_dgram(skb); | ||
3537 | |||
3538 | if (peer_sid == SECSID_NULL) | ||
3539 | return -EINVAL; | ||
3540 | 3536 | ||
3541 | err = security_sid_to_context(peer_sid, secdata, seclen); | 3537 | if (peer_secid == SECSID_NULL) |
3542 | if (err) | 3538 | err = -EINVAL; |
3543 | return err; | 3539 | *secid = peer_secid; |
3544 | 3540 | ||
3545 | return 0; | 3541 | return err; |
3546 | } | 3542 | } |
3547 | 3543 | ||
3548 | static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority) | 3544 | static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority) |
@@ -4407,6 +4403,17 @@ static int selinux_setprocattr(struct task_struct *p, | |||
4407 | return size; | 4403 | return size; |
4408 | } | 4404 | } |
4409 | 4405 | ||
4406 | static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) | ||
4407 | { | ||
4408 | return security_sid_to_context(secid, secdata, seclen); | ||
4409 | } | ||
4410 | |||
4411 | static void selinux_release_secctx(char *secdata, u32 seclen) | ||
4412 | { | ||
4413 | if (secdata) | ||
4414 | kfree(secdata); | ||
4415 | } | ||
4416 | |||
4410 | #ifdef CONFIG_KEYS | 4417 | #ifdef CONFIG_KEYS |
4411 | 4418 | ||
4412 | static int selinux_key_alloc(struct key *k, struct task_struct *tsk, | 4419 | static int selinux_key_alloc(struct key *k, struct task_struct *tsk, |
@@ -4587,6 +4594,9 @@ static struct security_operations selinux_ops = { | |||
4587 | .getprocattr = selinux_getprocattr, | 4594 | .getprocattr = selinux_getprocattr, |
4588 | .setprocattr = selinux_setprocattr, | 4595 | .setprocattr = selinux_setprocattr, |
4589 | 4596 | ||
4597 | .secid_to_secctx = selinux_secid_to_secctx, | ||
4598 | .release_secctx = selinux_release_secctx, | ||
4599 | |||
4590 | .unix_stream_connect = selinux_socket_unix_stream_connect, | 4600 | .unix_stream_connect = selinux_socket_unix_stream_connect, |
4591 | .unix_may_send = selinux_socket_unix_may_send, | 4601 | .unix_may_send = selinux_socket_unix_may_send, |
4592 | 4602 | ||
diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c index 0111990ba837..f03960e697ce 100644 --- a/security/selinux/ss/policydb.c +++ b/security/selinux/ss/policydb.c | |||
@@ -644,10 +644,18 @@ void policydb_destroy(struct policydb *p) | |||
644 | kfree(lra); | 644 | kfree(lra); |
645 | 645 | ||
646 | for (rt = p->range_tr; rt; rt = rt -> next) { | 646 | for (rt = p->range_tr; rt; rt = rt -> next) { |
647 | kfree(lrt); | 647 | if (lrt) { |
648 | ebitmap_destroy(&lrt->range.level[0].cat); | ||
649 | ebitmap_destroy(&lrt->range.level[1].cat); | ||
650 | kfree(lrt); | ||
651 | } | ||
648 | lrt = rt; | 652 | lrt = rt; |
649 | } | 653 | } |
650 | kfree(lrt); | 654 | if (lrt) { |
655 | ebitmap_destroy(&lrt->range.level[0].cat); | ||
656 | ebitmap_destroy(&lrt->range.level[1].cat); | ||
657 | kfree(lrt); | ||
658 | } | ||
651 | 659 | ||
652 | if (p->type_attr_map) { | 660 | if (p->type_attr_map) { |
653 | for (i = 0; i < p->p_types.nprim; i++) | 661 | for (i = 0; i < p->p_types.nprim; i++) |
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index d2e80e62ff0c..85e429884393 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c | |||
@@ -833,6 +833,8 @@ static int security_compute_sid(u32 ssid, | |||
833 | goto out; | 833 | goto out; |
834 | } | 834 | } |
835 | 835 | ||
836 | context_init(&newcontext); | ||
837 | |||
836 | POLICY_RDLOCK; | 838 | POLICY_RDLOCK; |
837 | 839 | ||
838 | scontext = sidtab_search(&sidtab, ssid); | 840 | scontext = sidtab_search(&sidtab, ssid); |
@@ -850,8 +852,6 @@ static int security_compute_sid(u32 ssid, | |||
850 | goto out_unlock; | 852 | goto out_unlock; |
851 | } | 853 | } |
852 | 854 | ||
853 | context_init(&newcontext); | ||
854 | |||
855 | /* Set the user identity. */ | 855 | /* Set the user identity. */ |
856 | switch (specified) { | 856 | switch (specified) { |
857 | case AVTAB_TRANSITION: | 857 | case AVTAB_TRANSITION: |
diff --git a/sound/aoa/codecs/snd-aoa-codec-toonie.c b/sound/aoa/codecs/snd-aoa-codec-toonie.c index bcc555647e79..3c7d1d8a9a6f 100644 --- a/sound/aoa/codecs/snd-aoa-codec-toonie.c +++ b/sound/aoa/codecs/snd-aoa-codec-toonie.c | |||
@@ -51,6 +51,13 @@ static struct transfer_info toonie_transfers[] = { | |||
51 | {} | 51 | {} |
52 | }; | 52 | }; |
53 | 53 | ||
54 | static int toonie_usable(struct codec_info_item *cii, | ||
55 | struct transfer_info *ti, | ||
56 | struct transfer_info *out) | ||
57 | { | ||
58 | return 1; | ||
59 | } | ||
60 | |||
54 | #ifdef CONFIG_PM | 61 | #ifdef CONFIG_PM |
55 | static int toonie_suspend(struct codec_info_item *cii, pm_message_t state) | 62 | static int toonie_suspend(struct codec_info_item *cii, pm_message_t state) |
56 | { | 63 | { |
@@ -69,6 +76,7 @@ static struct codec_info toonie_codec_info = { | |||
69 | .sysclock_factor = 256, | 76 | .sysclock_factor = 256, |
70 | .bus_factor = 64, | 77 | .bus_factor = 64, |
71 | .owner = THIS_MODULE, | 78 | .owner = THIS_MODULE, |
79 | .usable = toonie_usable, | ||
72 | #ifdef CONFIG_PM | 80 | #ifdef CONFIG_PM |
73 | .suspend = toonie_suspend, | 81 | .suspend = toonie_suspend, |
74 | .resume = toonie_resume, | 82 | .resume = toonie_resume, |
@@ -79,19 +87,20 @@ static int toonie_init_codec(struct aoa_codec *codec) | |||
79 | { | 87 | { |
80 | struct toonie *toonie = codec_to_toonie(codec); | 88 | struct toonie *toonie = codec_to_toonie(codec); |
81 | 89 | ||
90 | /* nothing connected? what a joke! */ | ||
91 | if (toonie->codec.connected != 1) | ||
92 | return -ENOTCONN; | ||
93 | |||
82 | if (aoa_snd_device_new(SNDRV_DEV_LOWLEVEL, toonie, &ops)) { | 94 | if (aoa_snd_device_new(SNDRV_DEV_LOWLEVEL, toonie, &ops)) { |
83 | printk(KERN_ERR PFX "failed to create toonie snd device!\n"); | 95 | printk(KERN_ERR PFX "failed to create toonie snd device!\n"); |
84 | return -ENODEV; | 96 | return -ENODEV; |
85 | } | 97 | } |
86 | 98 | ||
87 | /* nothing connected? what a joke! */ | ||
88 | if (toonie->codec.connected != 1) | ||
89 | return -ENOTCONN; | ||
90 | |||
91 | if (toonie->codec.soundbus_dev->attach_codec(toonie->codec.soundbus_dev, | 99 | if (toonie->codec.soundbus_dev->attach_codec(toonie->codec.soundbus_dev, |
92 | aoa_get_card(), | 100 | aoa_get_card(), |
93 | &toonie_codec_info, toonie)) { | 101 | &toonie_codec_info, toonie)) { |
94 | printk(KERN_ERR PFX "error creating toonie pcm\n"); | 102 | printk(KERN_ERR PFX "error creating toonie pcm\n"); |
103 | snd_device_free(aoa_get_card(), toonie); | ||
95 | return -ENODEV; | 104 | return -ENODEV; |
96 | } | 105 | } |
97 | 106 | ||
diff --git a/sound/aoa/core/snd-aoa-gpio-feature.c b/sound/aoa/core/snd-aoa-gpio-feature.c index 7ae0c0bdfad8..f69d33357a28 100644 --- a/sound/aoa/core/snd-aoa-gpio-feature.c +++ b/sound/aoa/core/snd-aoa-gpio-feature.c | |||
@@ -112,7 +112,10 @@ static struct device_node *get_gpio(char *name, | |||
112 | 112 | ||
113 | static void get_irq(struct device_node * np, int *irqptr) | 113 | static void get_irq(struct device_node * np, int *irqptr) |
114 | { | 114 | { |
115 | *irqptr = irq_of_parse_and_map(np, 0); | 115 | if (np) |
116 | *irqptr = irq_of_parse_and_map(np, 0); | ||
117 | else | ||
118 | *irqptr = NO_IRQ; | ||
116 | } | 119 | } |
117 | 120 | ||
118 | /* 0x4 is outenable, 0x1 is out, thus 4 or 5 */ | 121 | /* 0x4 is outenable, 0x1 is out, thus 4 or 5 */ |
@@ -322,7 +325,7 @@ static int ftr_set_notify(struct gpio_runtime *rt, | |||
322 | return -EINVAL; | 325 | return -EINVAL; |
323 | } | 326 | } |
324 | 327 | ||
325 | if (irq == -1) | 328 | if (irq == NO_IRQ) |
326 | return -ENODEV; | 329 | return -ENODEV; |
327 | 330 | ||
328 | mutex_lock(¬if->mutex); | 331 | mutex_lock(¬if->mutex); |
diff --git a/sound/aoa/core/snd-aoa-gpio-pmf.c b/sound/aoa/core/snd-aoa-gpio-pmf.c index 3d57fd1aec4b..2836c3218391 100644 --- a/sound/aoa/core/snd-aoa-gpio-pmf.c +++ b/sound/aoa/core/snd-aoa-gpio-pmf.c | |||
@@ -18,7 +18,7 @@ static void pmf_gpio_set_##name(struct gpio_runtime *rt, int on)\ | |||
18 | \ | 18 | \ |
19 | if (unlikely(!rt)) return; \ | 19 | if (unlikely(!rt)) return; \ |
20 | rc = pmf_call_function(rt->node, #name "-mute", &args); \ | 20 | rc = pmf_call_function(rt->node, #name "-mute", &args); \ |
21 | if (rc) \ | 21 | if (rc && rc != -ENODEV) \ |
22 | printk(KERN_WARNING "pmf_gpio_set_" #name \ | 22 | printk(KERN_WARNING "pmf_gpio_set_" #name \ |
23 | " failed, rc: %d\n", rc); \ | 23 | " failed, rc: %d\n", rc); \ |
24 | rt->implementation_private &= ~(1<<bit); \ | 24 | rt->implementation_private &= ~(1<<bit); \ |
diff --git a/sound/core/oss/mixer_oss.c b/sound/core/oss/mixer_oss.c index 71b5080fa66d..75a9505c7445 100644 --- a/sound/core/oss/mixer_oss.c +++ b/sound/core/oss/mixer_oss.c | |||
@@ -988,13 +988,12 @@ static int snd_mixer_oss_build_input(struct snd_mixer_oss *mixer, struct snd_mix | |||
988 | if (ptr->index == 0 && (kctl = snd_mixer_oss_test_id(mixer, "Capture Source", 0)) != NULL) { | 988 | if (ptr->index == 0 && (kctl = snd_mixer_oss_test_id(mixer, "Capture Source", 0)) != NULL) { |
989 | struct snd_ctl_elem_info *uinfo; | 989 | struct snd_ctl_elem_info *uinfo; |
990 | 990 | ||
991 | uinfo = kmalloc(sizeof(*uinfo), GFP_KERNEL); | 991 | uinfo = kzalloc(sizeof(*uinfo), GFP_KERNEL); |
992 | if (! uinfo) { | 992 | if (! uinfo) { |
993 | up_read(&mixer->card->controls_rwsem); | 993 | up_read(&mixer->card->controls_rwsem); |
994 | return -ENOMEM; | 994 | return -ENOMEM; |
995 | } | 995 | } |
996 | 996 | ||
997 | memset(uinfo, 0, sizeof(*uinfo)); | ||
998 | if (kctl->info(kctl, uinfo)) { | 997 | if (kctl->info(kctl, uinfo)) { |
999 | up_read(&mixer->card->controls_rwsem); | 998 | up_read(&mixer->card->controls_rwsem); |
1000 | return 0; | 999 | return 0; |
diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c index f5ff4f4a16ee..472fce0ee0e8 100644 --- a/sound/core/oss/pcm_oss.c +++ b/sound/core/oss/pcm_oss.c | |||
@@ -2228,6 +2228,8 @@ static int snd_pcm_oss_open_file(struct file *file, | |||
2228 | for (idx = 0; idx < 2; idx++) { | 2228 | for (idx = 0; idx < 2; idx++) { |
2229 | if (setup[idx].disable) | 2229 | if (setup[idx].disable) |
2230 | continue; | 2230 | continue; |
2231 | if (! pcm->streams[idx].substream_count) | ||
2232 | continue; /* no matching substream */ | ||
2231 | if (idx == SNDRV_PCM_STREAM_PLAYBACK) { | 2233 | if (idx == SNDRV_PCM_STREAM_PLAYBACK) { |
2232 | if (! (f_mode & FMODE_WRITE)) | 2234 | if (! (f_mode & FMODE_WRITE)) |
2233 | continue; | 2235 | continue; |
diff --git a/sound/core/seq/seq_device.c b/sound/core/seq/seq_device.c index 4260de90f36f..102ff548ce69 100644 --- a/sound/core/seq/seq_device.c +++ b/sound/core/seq/seq_device.c | |||
@@ -372,10 +372,9 @@ static struct ops_list * create_driver(char *id) | |||
372 | { | 372 | { |
373 | struct ops_list *ops; | 373 | struct ops_list *ops; |
374 | 374 | ||
375 | ops = kmalloc(sizeof(*ops), GFP_KERNEL); | 375 | ops = kzalloc(sizeof(*ops), GFP_KERNEL); |
376 | if (ops == NULL) | 376 | if (ops == NULL) |
377 | return ops; | 377 | return ops; |
378 | memset(ops, 0, sizeof(*ops)); | ||
379 | 378 | ||
380 | /* set up driver entry */ | 379 | /* set up driver entry */ |
381 | strlcpy(ops->id, id, sizeof(ops->id)); | 380 | strlcpy(ops->id, id, sizeof(ops->id)); |
diff --git a/sound/core/sgbuf.c b/sound/core/sgbuf.c index 6e4d4ab34632..c30669f14ac0 100644 --- a/sound/core/sgbuf.c +++ b/sound/core/sgbuf.c | |||
@@ -68,21 +68,18 @@ void *snd_malloc_sgbuf_pages(struct device *device, | |||
68 | 68 | ||
69 | dmab->area = NULL; | 69 | dmab->area = NULL; |
70 | dmab->addr = 0; | 70 | dmab->addr = 0; |
71 | dmab->private_data = sgbuf = kmalloc(sizeof(*sgbuf), GFP_KERNEL); | 71 | dmab->private_data = sgbuf = kzalloc(sizeof(*sgbuf), GFP_KERNEL); |
72 | if (! sgbuf) | 72 | if (! sgbuf) |
73 | return NULL; | 73 | return NULL; |
74 | memset(sgbuf, 0, sizeof(*sgbuf)); | ||
75 | sgbuf->dev = device; | 74 | sgbuf->dev = device; |
76 | pages = snd_sgbuf_aligned_pages(size); | 75 | pages = snd_sgbuf_aligned_pages(size); |
77 | sgbuf->tblsize = sgbuf_align_table(pages); | 76 | sgbuf->tblsize = sgbuf_align_table(pages); |
78 | sgbuf->table = kmalloc(sizeof(*sgbuf->table) * sgbuf->tblsize, GFP_KERNEL); | 77 | sgbuf->table = kcalloc(sgbuf->tblsize, sizeof(*sgbuf->table), GFP_KERNEL); |
79 | if (! sgbuf->table) | 78 | if (! sgbuf->table) |
80 | goto _failed; | 79 | goto _failed; |
81 | memset(sgbuf->table, 0, sizeof(*sgbuf->table) * sgbuf->tblsize); | 80 | sgbuf->page_table = kcalloc(sgbuf->tblsize, sizeof(*sgbuf->page_table), GFP_KERNEL); |
82 | sgbuf->page_table = kmalloc(sizeof(*sgbuf->page_table) * sgbuf->tblsize, GFP_KERNEL); | ||
83 | if (! sgbuf->page_table) | 81 | if (! sgbuf->page_table) |
84 | goto _failed; | 82 | goto _failed; |
85 | memset(sgbuf->page_table, 0, sizeof(*sgbuf->page_table) * sgbuf->tblsize); | ||
86 | 83 | ||
87 | /* allocate each page */ | 84 | /* allocate each page */ |
88 | for (i = 0; i < pages; i++) { | 85 | for (i = 0; i < pages; i++) { |
diff --git a/sound/drivers/vx/vx_pcm.c b/sound/drivers/vx/vx_pcm.c index c4af84995d05..7e65a103fbb2 100644 --- a/sound/drivers/vx/vx_pcm.c +++ b/sound/drivers/vx/vx_pcm.c | |||
@@ -1252,18 +1252,15 @@ static int vx_init_audio_io(struct vx_core *chip) | |||
1252 | chip->audio_info = rmh.Stat[1]; | 1252 | chip->audio_info = rmh.Stat[1]; |
1253 | 1253 | ||
1254 | /* allocate pipes */ | 1254 | /* allocate pipes */ |
1255 | chip->playback_pipes = kmalloc(sizeof(struct vx_pipe *) * chip->audio_outs, GFP_KERNEL); | 1255 | chip->playback_pipes = kcalloc(chip->audio_outs, sizeof(struct vx_pipe *), GFP_KERNEL); |
1256 | if (!chip->playback_pipes) | 1256 | if (!chip->playback_pipes) |
1257 | return -ENOMEM; | 1257 | return -ENOMEM; |
1258 | chip->capture_pipes = kmalloc(sizeof(struct vx_pipe *) * chip->audio_ins, GFP_KERNEL); | 1258 | chip->capture_pipes = kcalloc(chip->audio_ins, sizeof(struct vx_pipe *), GFP_KERNEL); |
1259 | if (!chip->capture_pipes) { | 1259 | if (!chip->capture_pipes) { |
1260 | kfree(chip->playback_pipes); | 1260 | kfree(chip->playback_pipes); |
1261 | return -ENOMEM; | 1261 | return -ENOMEM; |
1262 | } | 1262 | } |
1263 | 1263 | ||
1264 | memset(chip->playback_pipes, 0, sizeof(struct vx_pipe *) * chip->audio_outs); | ||
1265 | memset(chip->capture_pipes, 0, sizeof(struct vx_pipe *) * chip->audio_ins); | ||
1266 | |||
1267 | preferred = chip->ibl.size; | 1264 | preferred = chip->ibl.size; |
1268 | chip->ibl.size = 0; | 1265 | chip->ibl.size = 0; |
1269 | vx_set_ibl(chip, &chip->ibl); /* query the info */ | 1266 | vx_set_ibl(chip, &chip->ibl); /* query the info */ |
diff --git a/sound/oss/Kconfig b/sound/oss/Kconfig index f4980ca5c05c..1b7c3dfc2b41 100644 --- a/sound/oss/Kconfig +++ b/sound/oss/Kconfig | |||
@@ -31,7 +31,7 @@ config SOUND_EMU10K1 | |||
31 | For more information on this driver and the degree of support for | 31 | For more information on this driver and the degree of support for |
32 | the different card models please check: | 32 | the different card models please check: |
33 | 33 | ||
34 | <http://sourceforge.net/projects/emu10k1/> | 34 | <http://sourceforge.net/projects/emu10k1/> |
35 | 35 | ||
36 | It is now possible to load dsp microcode patches into the EMU10K1 | 36 | It is now possible to load dsp microcode patches into the EMU10K1 |
37 | chip. These patches are used to implement real time sound | 37 | chip. These patches are used to implement real time sound |
@@ -140,7 +140,7 @@ config SOUND_TRIDENT | |||
140 | system support" and "Sysctl support", and after the /proc file | 140 | system support" and "Sysctl support", and after the /proc file |
141 | system has been mounted, executing the command | 141 | system has been mounted, executing the command |
142 | 142 | ||
143 | command what is enabled | 143 | command what is enabled |
144 | 144 | ||
145 | echo 0>/proc/ALi5451 pcm out is also set to S/PDIF out. (Default). | 145 | echo 0>/proc/ALi5451 pcm out is also set to S/PDIF out. (Default). |
146 | 146 | ||
@@ -838,7 +838,7 @@ config SOUND_WAVEARTIST | |||
838 | 838 | ||
839 | config SOUND_TVMIXER | 839 | config SOUND_TVMIXER |
840 | tristate "TV card (bt848) mixer support" | 840 | tristate "TV card (bt848) mixer support" |
841 | depends on SOUND_PRIME && I2C | 841 | depends on SOUND_PRIME && I2C && VIDEO_V4L1 |
842 | help | 842 | help |
843 | Support for audio mixer facilities on the BT848 TV frame-grabber | 843 | Support for audio mixer facilities on the BT848 TV frame-grabber |
844 | card. | 844 | card. |
diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig index d7ad32f514da..e49c0fe21b0d 100644 --- a/sound/pci/Kconfig +++ b/sound/pci/Kconfig | |||
@@ -16,16 +16,16 @@ config SND_AD1889 | |||
16 | will be called snd-ad1889. | 16 | will be called snd-ad1889. |
17 | 17 | ||
18 | config SND_ALS300 | 18 | config SND_ALS300 |
19 | tristate "Avance Logic ALS300/ALS300+" | 19 | tristate "Avance Logic ALS300/ALS300+" |
20 | depends on SND | 20 | depends on SND |
21 | select SND_PCM | 21 | select SND_PCM |
22 | select SND_AC97_CODEC | 22 | select SND_AC97_CODEC |
23 | select SND_OPL3_LIB | 23 | select SND_OPL3_LIB |
24 | help | 24 | help |
25 | Say 'Y' or 'M' to include support for Avance Logic ALS300/ALS300+ | 25 | Say 'Y' or 'M' to include support for Avance Logic ALS300/ALS300+ |
26 | 26 | ||
27 | To compile this driver as a module, choose M here: the module | 27 | To compile this driver as a module, choose M here: the module |
28 | will be called snd-als300 | 28 | will be called snd-als300 |
29 | 29 | ||
30 | config SND_ALS4000 | 30 | config SND_ALS4000 |
31 | tristate "Avance Logic ALS4000" | 31 | tristate "Avance Logic ALS4000" |
@@ -78,49 +78,49 @@ config SND_ATIIXP_MODEM | |||
78 | will be called snd-atiixp-modem. | 78 | will be called snd-atiixp-modem. |
79 | 79 | ||
80 | config SND_AU8810 | 80 | config SND_AU8810 |
81 | tristate "Aureal Advantage" | 81 | tristate "Aureal Advantage" |
82 | depends on SND | 82 | depends on SND |
83 | select SND_MPU401_UART | 83 | select SND_MPU401_UART |
84 | select SND_AC97_CODEC | 84 | select SND_AC97_CODEC |
85 | help | 85 | help |
86 | Say Y here to include support for Aureal Advantage soundcards. | 86 | Say Y here to include support for Aureal Advantage soundcards. |
87 | 87 | ||
88 | Supported features: Hardware Mixer, SRC, EQ and SPDIF output. | 88 | Supported features: Hardware Mixer, SRC, EQ and SPDIF output. |
89 | 3D support code is in place, but not yet useable. For more info, | 89 | 3D support code is in place, but not yet useable. For more info, |
90 | email the ALSA developer list, or <mjander@users.sourceforge.net>. | 90 | email the ALSA developer list, or <mjander@users.sourceforge.net>. |
91 | 91 | ||
92 | To compile this driver as a module, choose M here: the module | 92 | To compile this driver as a module, choose M here: the module |
93 | will be called snd-au8810. | 93 | will be called snd-au8810. |
94 | 94 | ||
95 | config SND_AU8820 | 95 | config SND_AU8820 |
96 | tristate "Aureal Vortex" | 96 | tristate "Aureal Vortex" |
97 | depends on SND | 97 | depends on SND |
98 | select SND_MPU401_UART | 98 | select SND_MPU401_UART |
99 | select SND_AC97_CODEC | 99 | select SND_AC97_CODEC |
100 | help | 100 | help |
101 | Say Y here to include support for Aureal Vortex soundcards. | 101 | Say Y here to include support for Aureal Vortex soundcards. |
102 | 102 | ||
103 | Supported features: Hardware Mixer and SRC. For more info, email | 103 | Supported features: Hardware Mixer and SRC. For more info, email |
104 | the ALSA developer list, or <mjander@users.sourceforge.net>. | 104 | the ALSA developer list, or <mjander@users.sourceforge.net>. |
105 | 105 | ||
106 | To compile this driver as a module, choose M here: the module | 106 | To compile this driver as a module, choose M here: the module |
107 | will be called snd-au8820. | 107 | will be called snd-au8820. |
108 | 108 | ||
109 | config SND_AU8830 | 109 | config SND_AU8830 |
110 | tristate "Aureal Vortex 2" | 110 | tristate "Aureal Vortex 2" |
111 | depends on SND | 111 | depends on SND |
112 | select SND_MPU401_UART | 112 | select SND_MPU401_UART |
113 | select SND_AC97_CODEC | 113 | select SND_AC97_CODEC |
114 | help | 114 | help |
115 | Say Y here to include support for Aureal Vortex 2 soundcards. | 115 | Say Y here to include support for Aureal Vortex 2 soundcards. |
116 | 116 | ||
117 | Supported features: Hardware Mixer, SRC, EQ and SPDIF output. | 117 | Supported features: Hardware Mixer, SRC, EQ and SPDIF output. |
118 | 3D support code is in place, but not yet useable. For more info, | 118 | 3D support code is in place, but not yet useable. For more info, |
119 | email the ALSA developer list, or <mjander@users.sourceforge.net>. | 119 | email the ALSA developer list, or <mjander@users.sourceforge.net>. |
120 | 120 | ||
121 | To compile this driver as a module, choose M here: the module | 121 | To compile this driver as a module, choose M here: the module |
122 | will be called snd-au8830. | 122 | will be called snd-au8830. |
123 | 123 | ||
124 | config SND_AZT3328 | 124 | config SND_AZT3328 |
125 | tristate "Aztech AZF3328 / PCI168 (EXPERIMENTAL)" | 125 | tristate "Aztech AZF3328 / PCI168 (EXPERIMENTAL)" |
126 | depends on SND && EXPERIMENTAL | 126 | depends on SND && EXPERIMENTAL |
@@ -135,10 +135,10 @@ config SND_AZT3328 | |||
135 | will be called snd-azt3328. | 135 | will be called snd-azt3328. |
136 | 136 | ||
137 | config SND_BT87X | 137 | config SND_BT87X |
138 | tristate "Bt87x Audio Capture" | 138 | tristate "Bt87x Audio Capture" |
139 | depends on SND | 139 | depends on SND |
140 | select SND_PCM | 140 | select SND_PCM |
141 | help | 141 | help |
142 | If you want to record audio from TV cards based on | 142 | If you want to record audio from TV cards based on |
143 | Brooktree Bt878/Bt879 chips, say Y here and read | 143 | Brooktree Bt878/Bt879 chips, say Y here and read |
144 | <file:Documentation/sound/alsa/Bt87x.txt>. | 144 | <file:Documentation/sound/alsa/Bt87x.txt>. |
@@ -209,7 +209,7 @@ config SND_CS46XX | |||
209 | config SND_CS46XX_NEW_DSP | 209 | config SND_CS46XX_NEW_DSP |
210 | bool "Cirrus Logic (Sound Fusion) New DSP support" | 210 | bool "Cirrus Logic (Sound Fusion) New DSP support" |
211 | depends on SND_CS46XX | 211 | depends on SND_CS46XX |
212 | default y | 212 | default y |
213 | help | 213 | help |
214 | Say Y here to use a new DSP image for SPDIF and dual codecs. | 214 | Say Y here to use a new DSP image for SPDIF and dual codecs. |
215 | 215 | ||
@@ -225,7 +225,7 @@ config SND_CS5535AUDIO | |||
225 | referred to as NS CS5535 IO or AMD CS5535 IO companion in | 225 | referred to as NS CS5535 IO or AMD CS5535 IO companion in |
226 | various literature. This driver also supports the CS5536 audio | 226 | various literature. This driver also supports the CS5536 audio |
227 | device. However, for both chips, on certain boards, you may | 227 | device. However, for both chips, on certain boards, you may |
228 | need to use ac97_quirk=hp_only if your board has physically | 228 | need to use ac97_quirk=hp_only if your board has physically |
229 | mapped headphone out to master output. If that works for you, | 229 | mapped headphone out to master output. If that works for you, |
230 | send lspci -vvv output to the mailing list so that your board | 230 | send lspci -vvv output to the mailing list so that your board |
231 | can be identified in the quirks list. | 231 | can be identified in the quirks list. |
@@ -468,11 +468,13 @@ config SND_FM801_TEA575X_BOOL | |||
468 | FM801 chip with a TEA5757 tuner connected to GPIO1-3 pins (Media | 468 | FM801 chip with a TEA5757 tuner connected to GPIO1-3 pins (Media |
469 | Forte SF256-PCS-02) into the snd-fm801 driver. | 469 | Forte SF256-PCS-02) into the snd-fm801 driver. |
470 | 470 | ||
471 | This will enable support for the old V4L1 API. | ||
472 | |||
471 | config SND_FM801_TEA575X | 473 | config SND_FM801_TEA575X |
472 | tristate | 474 | tristate |
473 | depends on SND_FM801_TEA575X_BOOL | 475 | depends on SND_FM801_TEA575X_BOOL |
474 | default SND_FM801 | 476 | default SND_FM801 |
475 | select VIDEO_DEV | 477 | select VIDEO_V4L1 |
476 | 478 | ||
477 | config SND_HDA_INTEL | 479 | config SND_HDA_INTEL |
478 | tristate "Intel HD Audio" | 480 | tristate "Intel HD Audio" |
diff --git a/sound/pci/echoaudio/echoaudio.c b/sound/pci/echoaudio/echoaudio.c index 27a8dbe6f6a8..c3dafa29054f 100644 --- a/sound/pci/echoaudio/echoaudio.c +++ b/sound/pci/echoaudio/echoaudio.c | |||
@@ -236,9 +236,9 @@ static int pcm_open(struct snd_pcm_substream *substream, | |||
236 | chip = snd_pcm_substream_chip(substream); | 236 | chip = snd_pcm_substream_chip(substream); |
237 | runtime = substream->runtime; | 237 | runtime = substream->runtime; |
238 | 238 | ||
239 | if (!(pipe = kmalloc(sizeof(struct audiopipe), GFP_KERNEL))) | 239 | pipe = kzalloc(sizeof(struct audiopipe), GFP_KERNEL); |
240 | if (!pipe) | ||
240 | return -ENOMEM; | 241 | return -ENOMEM; |
241 | memset(pipe, 0, sizeof(struct audiopipe)); | ||
242 | pipe->index = -1; /* Not configured yet */ | 242 | pipe->index = -1; /* Not configured yet */ |
243 | 243 | ||
244 | /* Set up hw capabilities and contraints */ | 244 | /* Set up hw capabilities and contraints */ |
diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c index f9b5c3dc3b34..79f24cdf5fbf 100644 --- a/sound/pci/emu10k1/emu10k1_main.c +++ b/sound/pci/emu10k1/emu10k1_main.c | |||
@@ -936,6 +936,17 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
936 | .ca0151_chip = 1, | 936 | .ca0151_chip = 1, |
937 | .spk71 = 1, | 937 | .spk71 = 1, |
938 | .spdif_bug = 1} , | 938 | .spdif_bug = 1} , |
939 | /* Dell OEM/Creative Labs Audigy 2 ZS */ | ||
940 | /* See ALSA bug#1365 */ | ||
941 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10031102, | ||
942 | .driver = "Audigy2", .name = "Audigy 2 ZS [SB0353]", | ||
943 | .id = "Audigy2", | ||
944 | .emu10k2_chip = 1, | ||
945 | .ca0102_chip = 1, | ||
946 | .ca0151_chip = 1, | ||
947 | .spk71 = 1, | ||
948 | .spdif_bug = 1, | ||
949 | .ac97_chip = 1} , | ||
939 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10021102, | 950 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10021102, |
940 | .driver = "Audigy2", .name = "Audigy 2 Platinum [SB0240P]", | 951 | .driver = "Audigy2", .name = "Audigy 2 Platinum [SB0240P]", |
941 | .id = "Audigy2", | 952 | .id = "Audigy2", |
diff --git a/sound/pci/emu10k1/irq.c b/sound/pci/emu10k1/irq.c index a8b31286b6db..1076af4c3669 100644 --- a/sound/pci/emu10k1/irq.c +++ b/sound/pci/emu10k1/irq.c | |||
@@ -37,9 +37,13 @@ irqreturn_t snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
37 | int handled = 0; | 37 | int handled = 0; |
38 | 38 | ||
39 | while ((status = inl(emu->port + IPR)) != 0) { | 39 | while ((status = inl(emu->port + IPR)) != 0) { |
40 | //printk("emu10k1 irq - status = 0x%x\n", status); | 40 | //snd_printk(KERN_INFO "emu10k1 irq - status = 0x%x\n", status); |
41 | orig_status = status; | 41 | orig_status = status; |
42 | handled = 1; | 42 | handled = 1; |
43 | if ((status & 0xffffffff) == 0xffffffff) { | ||
44 | snd_printk(KERN_INFO "snd-emu10k1: Suspected sound card removal\n"); | ||
45 | break; | ||
46 | } | ||
43 | if (status & IPR_PCIERROR) { | 47 | if (status & IPR_PCIERROR) { |
44 | snd_printk(KERN_ERR "interrupt: PCI error\n"); | 48 | snd_printk(KERN_ERR "interrupt: PCI error\n"); |
45 | snd_emu10k1_intr_disable(emu, INTE_PCIERRORENABLE); | 49 | snd_emu10k1_intr_disable(emu, INTE_PCIERRORENABLE); |
diff --git a/sound/ppc/awacs.c b/sound/ppc/awacs.c index 82d791be7499..05dabe454658 100644 --- a/sound/ppc/awacs.c +++ b/sound/ppc/awacs.c | |||
@@ -801,11 +801,10 @@ snd_pmac_awacs_init(struct snd_pmac *chip) | |||
801 | chip->revision = (in_le32(&chip->awacs->codec_stat) >> 12) & 0xf; | 801 | chip->revision = (in_le32(&chip->awacs->codec_stat) >> 12) & 0xf; |
802 | #ifdef PMAC_AMP_AVAIL | 802 | #ifdef PMAC_AMP_AVAIL |
803 | if (chip->revision == 3 && chip->has_iic && CHECK_CUDA_AMP()) { | 803 | if (chip->revision == 3 && chip->has_iic && CHECK_CUDA_AMP()) { |
804 | struct awacs_amp *amp = kmalloc(sizeof(*amp), GFP_KERNEL); | 804 | struct awacs_amp *amp = kzalloc(sizeof(*amp), GFP_KERNEL); |
805 | if (! amp) | 805 | if (! amp) |
806 | return -ENOMEM; | 806 | return -ENOMEM; |
807 | chip->mixer_data = amp; | 807 | chip->mixer_data = amp; |
808 | memset(amp, 0, sizeof(*amp)); | ||
809 | chip->mixer_free = awacs_amp_free; | 808 | chip->mixer_free = awacs_amp_free; |
810 | awacs_amp_set_vol(amp, 0, 63, 63, 0); /* mute and zero vol */ | 809 | awacs_amp_set_vol(amp, 0, 63, 63, 0); /* mute and zero vol */ |
811 | awacs_amp_set_vol(amp, 1, 63, 63, 0); | 810 | awacs_amp_set_vol(amp, 1, 63, 63, 0); |
diff --git a/sound/ppc/daca.c b/sound/ppc/daca.c index 46eebf5610e3..57202b0f033e 100644 --- a/sound/ppc/daca.c +++ b/sound/ppc/daca.c | |||
@@ -258,10 +258,9 @@ int __init snd_pmac_daca_init(struct snd_pmac *chip) | |||
258 | request_module("i2c-powermac"); | 258 | request_module("i2c-powermac"); |
259 | #endif /* CONFIG_KMOD */ | 259 | #endif /* CONFIG_KMOD */ |
260 | 260 | ||
261 | mix = kmalloc(sizeof(*mix), GFP_KERNEL); | 261 | mix = kzalloc(sizeof(*mix), GFP_KERNEL); |
262 | if (! mix) | 262 | if (! mix) |
263 | return -ENOMEM; | 263 | return -ENOMEM; |
264 | memset(mix, 0, sizeof(*mix)); | ||
265 | chip->mixer_data = mix; | 264 | chip->mixer_data = mix; |
266 | chip->mixer_free = daca_cleanup; | 265 | chip->mixer_free = daca_cleanup; |
267 | mix->amp_on = 1; /* default on */ | 266 | mix->amp_on = 1; /* default on */ |
diff --git a/sound/ppc/keywest.c b/sound/ppc/keywest.c index fb05938dcbd9..59482a4cd446 100644 --- a/sound/ppc/keywest.c +++ b/sound/ppc/keywest.c | |||
@@ -64,11 +64,10 @@ static int keywest_attach_adapter(struct i2c_adapter *adapter) | |||
64 | if (strncmp(i2c_device_name(adapter), "mac-io", 6)) | 64 | if (strncmp(i2c_device_name(adapter), "mac-io", 6)) |
65 | return 0; /* ignored */ | 65 | return 0; /* ignored */ |
66 | 66 | ||
67 | new_client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL); | 67 | new_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); |
68 | if (! new_client) | 68 | if (! new_client) |
69 | return -ENOMEM; | 69 | return -ENOMEM; |
70 | 70 | ||
71 | memset(new_client, 0, sizeof(*new_client)); | ||
72 | new_client->addr = keywest_ctx->addr; | 71 | new_client->addr = keywest_ctx->addr; |
73 | i2c_set_clientdata(new_client, keywest_ctx); | 72 | i2c_set_clientdata(new_client, keywest_ctx); |
74 | new_client->adapter = adapter; | 73 | new_client->adapter = adapter; |
diff --git a/sound/ppc/powermac.c b/sound/ppc/powermac.c index fa9a44ab487e..2264574fa06b 100644 --- a/sound/ppc/powermac.c +++ b/sound/ppc/powermac.c | |||
@@ -181,21 +181,14 @@ static int __init alsa_card_pmac_init(void) | |||
181 | if ((err = platform_driver_register(&snd_pmac_driver)) < 0) | 181 | if ((err = platform_driver_register(&snd_pmac_driver)) < 0) |
182 | return err; | 182 | return err; |
183 | device = platform_device_register_simple(SND_PMAC_DRIVER, -1, NULL, 0); | 183 | device = platform_device_register_simple(SND_PMAC_DRIVER, -1, NULL, 0); |
184 | if (!IS_ERR(device)) { | 184 | return 0; |
185 | if (platform_get_drvdata(device)) | ||
186 | return 0; | ||
187 | platform_device_unregister(device); | ||
188 | err = -ENODEV; | ||
189 | } else | ||
190 | err = PTR_ERR(device); | ||
191 | platform_driver_unregister(&snd_pmac_driver); | ||
192 | return err; | ||
193 | 185 | ||
194 | } | 186 | } |
195 | 187 | ||
196 | static void __exit alsa_card_pmac_exit(void) | 188 | static void __exit alsa_card_pmac_exit(void) |
197 | { | 189 | { |
198 | platform_device_unregister(device); | 190 | if (!IS_ERR(device)) |
191 | platform_device_unregister(device); | ||
199 | platform_driver_unregister(&snd_pmac_driver); | 192 | platform_driver_unregister(&snd_pmac_driver); |
200 | } | 193 | } |
201 | 194 | ||
diff --git a/sound/ppc/tumbler.c b/sound/ppc/tumbler.c index 692c61177678..84f6b19c07ca 100644 --- a/sound/ppc/tumbler.c +++ b/sound/ppc/tumbler.c | |||
@@ -1316,10 +1316,9 @@ int __init snd_pmac_tumbler_init(struct snd_pmac *chip) | |||
1316 | request_module("i2c-powermac"); | 1316 | request_module("i2c-powermac"); |
1317 | #endif /* CONFIG_KMOD */ | 1317 | #endif /* CONFIG_KMOD */ |
1318 | 1318 | ||
1319 | mix = kmalloc(sizeof(*mix), GFP_KERNEL); | 1319 | mix = kzalloc(sizeof(*mix), GFP_KERNEL); |
1320 | if (! mix) | 1320 | if (! mix) |
1321 | return -ENOMEM; | 1321 | return -ENOMEM; |
1322 | memset(mix, 0, sizeof(*mix)); | ||
1323 | mix->headphone_irq = -1; | 1322 | mix->headphone_irq = -1; |
1324 | 1323 | ||
1325 | chip->mixer_data = mix; | 1324 | chip->mixer_data = mix; |
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index d32d83d970cc..1b7f499c549d 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c | |||
@@ -2260,10 +2260,9 @@ static int add_audio_endpoint(struct snd_usb_audio *chip, int stream, struct aud | |||
2260 | } | 2260 | } |
2261 | 2261 | ||
2262 | /* create a new pcm */ | 2262 | /* create a new pcm */ |
2263 | as = kmalloc(sizeof(*as), GFP_KERNEL); | 2263 | as = kzalloc(sizeof(*as), GFP_KERNEL); |
2264 | if (! as) | 2264 | if (! as) |
2265 | return -ENOMEM; | 2265 | return -ENOMEM; |
2266 | memset(as, 0, sizeof(*as)); | ||
2267 | as->pcm_index = chip->pcm_devs; | 2266 | as->pcm_index = chip->pcm_devs; |
2268 | as->chip = chip; | 2267 | as->chip = chip; |
2269 | as->fmt_type = fp->fmt_type; | 2268 | as->fmt_type = fp->fmt_type; |
@@ -2633,13 +2632,12 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) | |||
2633 | csep = NULL; | 2632 | csep = NULL; |
2634 | } | 2633 | } |
2635 | 2634 | ||
2636 | fp = kmalloc(sizeof(*fp), GFP_KERNEL); | 2635 | fp = kzalloc(sizeof(*fp), GFP_KERNEL); |
2637 | if (! fp) { | 2636 | if (! fp) { |
2638 | snd_printk(KERN_ERR "cannot malloc\n"); | 2637 | snd_printk(KERN_ERR "cannot malloc\n"); |
2639 | return -ENOMEM; | 2638 | return -ENOMEM; |
2640 | } | 2639 | } |
2641 | 2640 | ||
2642 | memset(fp, 0, sizeof(*fp)); | ||
2643 | fp->iface = iface_no; | 2641 | fp->iface = iface_no; |
2644 | fp->altsetting = altno; | 2642 | fp->altsetting = altno; |
2645 | fp->altset_idx = i; | 2643 | fp->altset_idx = i; |
diff --git a/usr/Makefile b/usr/Makefile index e93824269da2..5b31c0b61c76 100644 --- a/usr/Makefile +++ b/usr/Makefile | |||
@@ -35,6 +35,9 @@ quiet_cmd_initfs = GEN $@ | |||
35 | cmd_initfs = $(initramfs) -o $@ $(ramfs-args) $(ramfs-input) | 35 | cmd_initfs = $(initramfs) -o $@ $(ramfs-args) $(ramfs-input) |
36 | 36 | ||
37 | targets := initramfs_data.cpio.gz | 37 | targets := initramfs_data.cpio.gz |
38 | # do not try to update files included in initramfs | ||
39 | $(deps_initramfs): ; | ||
40 | |||
38 | $(deps_initramfs): klibcdirs | 41 | $(deps_initramfs): klibcdirs |
39 | # We rebuild initramfs_data.cpio.gz if: | 42 | # We rebuild initramfs_data.cpio.gz if: |
40 | # 1) Any included file is newer then initramfs_data.cpio.gz | 43 | # 1) Any included file is newer then initramfs_data.cpio.gz |