diff options
504 files changed, 17604 insertions, 3174 deletions
| @@ -2611,8 +2611,9 @@ S: Perth, Western Australia | |||
| 2611 | S: Australia | 2611 | S: Australia |
| 2612 | 2612 | ||
| 2613 | N: Miguel Ojeda Sandonis | 2613 | N: Miguel Ojeda Sandonis |
| 2614 | E: maxextreme@gmail.com | 2614 | E: miguel.ojeda.sandonis@gmail.com |
| 2615 | W: http://maxextreme.googlepages.com/ | 2615 | W: http://miguelojeda.es |
| 2616 | W: http://jair.lab.fi.uva.es/~migojed/ | ||
| 2616 | D: Author of the ks0108, cfag12864b and cfag12864bfb auxiliary display drivers. | 2617 | D: Author of the ks0108, cfag12864b and cfag12864bfb auxiliary display drivers. |
| 2617 | D: Maintainer of the auxiliary display drivers tree (drivers/auxdisplay/*) | 2618 | D: Maintainer of the auxiliary display drivers tree (drivers/auxdisplay/*) |
| 2618 | S: C/ Mieses 20, 9-B | 2619 | S: C/ Mieses 20, 9-B |
diff --git a/Documentation/HOWTO b/Documentation/HOWTO index 0291ade44c17..619e8caf30db 100644 --- a/Documentation/HOWTO +++ b/Documentation/HOWTO | |||
| @@ -377,7 +377,7 @@ Bug Reporting | |||
| 377 | bugzilla.kernel.org is where the Linux kernel developers track kernel | 377 | bugzilla.kernel.org is where the Linux kernel developers track kernel |
| 378 | bugs. Users are encouraged to report all bugs that they find in this | 378 | bugs. Users are encouraged to report all bugs that they find in this |
| 379 | tool. For details on how to use the kernel bugzilla, please see: | 379 | tool. For details on how to use the kernel bugzilla, please see: |
| 380 | http://test.kernel.org/bugzilla/faq.html | 380 | http://bugzilla.kernel.org/page.cgi?id=faq.html |
| 381 | 381 | ||
| 382 | The file REPORTING-BUGS in the main kernel source directory has a good | 382 | The file REPORTING-BUGS in the main kernel source directory has a good |
| 383 | template for how to report a possible kernel bug, and details what kind | 383 | template for how to report a possible kernel bug, and details what kind |
diff --git a/Documentation/accounting/taskstats-struct.txt b/Documentation/accounting/taskstats-struct.txt index 8aa7529f8258..cd784f46bf8a 100644 --- a/Documentation/accounting/taskstats-struct.txt +++ b/Documentation/accounting/taskstats-struct.txt | |||
| @@ -24,6 +24,8 @@ There are three different groups of fields in the struct taskstats: | |||
| 24 | 24 | ||
| 25 | 4) Per-task and per-thread context switch count statistics | 25 | 4) Per-task and per-thread context switch count statistics |
| 26 | 26 | ||
| 27 | 5) Time accounting for SMT machines | ||
| 28 | |||
| 27 | Future extension should add fields to the end of the taskstats struct, and | 29 | Future extension should add fields to the end of the taskstats struct, and |
| 28 | should not change the relative position of each field within the struct. | 30 | should not change the relative position of each field within the struct. |
| 29 | 31 | ||
| @@ -164,4 +166,8 @@ struct taskstats { | |||
| 164 | __u64 nvcsw; /* Context voluntary switch counter */ | 166 | __u64 nvcsw; /* Context voluntary switch counter */ |
| 165 | __u64 nivcsw; /* Context involuntary switch counter */ | 167 | __u64 nivcsw; /* Context involuntary switch counter */ |
| 166 | 168 | ||
| 169 | 5) Time accounting for SMT machines | ||
| 170 | __u64 ac_utimescaled; /* utime scaled on frequency etc */ | ||
| 171 | __u64 ac_stimescaled; /* stime scaled on frequency etc */ | ||
| 172 | __u64 cpu_scaled_run_real_total; /* scaled cpu_run_real_total */ | ||
| 167 | } | 173 | } |
diff --git a/Documentation/auxdisplay/cfag12864b b/Documentation/auxdisplay/cfag12864b index b714183d4125..eb7be393a510 100644 --- a/Documentation/auxdisplay/cfag12864b +++ b/Documentation/auxdisplay/cfag12864b | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | =================================== | 3 | =================================== |
| 4 | 4 | ||
| 5 | License: GPLv2 | 5 | License: GPLv2 |
| 6 | Author & Maintainer: Miguel Ojeda Sandonis <maxextreme@gmail.com> | 6 | Author & Maintainer: Miguel Ojeda Sandonis |
| 7 | Date: 2006-10-27 | 7 | Date: 2006-10-27 |
| 8 | 8 | ||
| 9 | 9 | ||
| @@ -22,7 +22,7 @@ Date: 2006-10-27 | |||
| 22 | 1. DRIVER INFORMATION | 22 | 1. DRIVER INFORMATION |
| 23 | --------------------- | 23 | --------------------- |
| 24 | 24 | ||
| 25 | This driver support one cfag12864b display at time. | 25 | This driver supports a cfag12864b LCD. |
| 26 | 26 | ||
| 27 | 27 | ||
| 28 | --------------------- | 28 | --------------------- |
diff --git a/Documentation/auxdisplay/cfag12864b-example.c b/Documentation/auxdisplay/cfag12864b-example.c index 7bfac354d4c9..2caeea5e4993 100644 --- a/Documentation/auxdisplay/cfag12864b-example.c +++ b/Documentation/auxdisplay/cfag12864b-example.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Description: cfag12864b LCD userspace example program | 4 | * Description: cfag12864b LCD userspace example program |
| 5 | * License: GPLv2 | 5 | * License: GPLv2 |
| 6 | * | 6 | * |
| 7 | * Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com> | 7 | * Author: Copyright (C) Miguel Ojeda Sandonis |
| 8 | * Date: 2006-10-31 | 8 | * Date: 2006-10-31 |
| 9 | * | 9 | * |
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
diff --git a/Documentation/auxdisplay/ks0108 b/Documentation/auxdisplay/ks0108 index 92b03b60c613..8ddda0c8ceef 100644 --- a/Documentation/auxdisplay/ks0108 +++ b/Documentation/auxdisplay/ks0108 | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | ========================================== | 3 | ========================================== |
| 4 | 4 | ||
| 5 | License: GPLv2 | 5 | License: GPLv2 |
| 6 | Author & Maintainer: Miguel Ojeda Sandonis <maxextreme@gmail.com> | 6 | Author & Maintainer: Miguel Ojeda Sandonis |
| 7 | Date: 2006-10-27 | 7 | Date: 2006-10-27 |
| 8 | 8 | ||
| 9 | 9 | ||
| @@ -21,7 +21,7 @@ Date: 2006-10-27 | |||
| 21 | 1. DRIVER INFORMATION | 21 | 1. DRIVER INFORMATION |
| 22 | --------------------- | 22 | --------------------- |
| 23 | 23 | ||
| 24 | This driver support the ks0108 LCD controller. | 24 | This driver supports the ks0108 LCD controller. |
| 25 | 25 | ||
| 26 | 26 | ||
| 27 | --------------------- | 27 | --------------------- |
diff --git a/Documentation/cgroups.txt b/Documentation/cgroups.txt index 824fc0274471..d9014aa0eb68 100644 --- a/Documentation/cgroups.txt +++ b/Documentation/cgroups.txt | |||
| @@ -390,6 +390,10 @@ If you have several tasks to attach, you have to do it one after another: | |||
| 390 | ... | 390 | ... |
| 391 | # /bin/echo PIDn > tasks | 391 | # /bin/echo PIDn > tasks |
| 392 | 392 | ||
| 393 | You can attach the current shell task by echoing 0: | ||
| 394 | |||
| 395 | # echo 0 > tasks | ||
| 396 | |||
| 393 | 3. Kernel API | 397 | 3. Kernel API |
| 394 | ============= | 398 | ============= |
| 395 | 399 | ||
diff --git a/Documentation/controllers/devices.txt b/Documentation/controllers/devices.txt index 4dcea42432c2..7cc6e6a60672 100644 --- a/Documentation/controllers/devices.txt +++ b/Documentation/controllers/devices.txt | |||
| @@ -13,7 +13,7 @@ either an integer or * for all. Access is a composition of r | |||
| 13 | The root device cgroup starts with rwm to 'all'. A child device | 13 | The root device cgroup starts with rwm to 'all'. A child device |
| 14 | cgroup gets a copy of the parent. Administrators can then remove | 14 | cgroup gets a copy of the parent. Administrators can then remove |
| 15 | devices from the whitelist or add new entries. A child cgroup can | 15 | devices from the whitelist or add new entries. A child cgroup can |
| 16 | never receive a device access which is denied its parent. However | 16 | never receive a device access which is denied by its parent. However |
| 17 | when a device access is removed from a parent it will not also be | 17 | when a device access is removed from a parent it will not also be |
| 18 | removed from the child(ren). | 18 | removed from the child(ren). |
| 19 | 19 | ||
| @@ -29,7 +29,11 @@ allows cgroup 1 to read and mknod the device usually known as | |||
| 29 | 29 | ||
| 30 | echo a > /cgroups/1/devices.deny | 30 | echo a > /cgroups/1/devices.deny |
| 31 | 31 | ||
| 32 | will remove the default 'a *:* mrw' entry. | 32 | will remove the default 'a *:* rwm' entry. Doing |
| 33 | |||
| 34 | echo a > /cgroups/1/devices.allow | ||
| 35 | |||
| 36 | will add the 'a *:* rwm' entry to the whitelist. | ||
| 33 | 37 | ||
| 34 | 3. Security | 38 | 3. Security |
| 35 | 39 | ||
diff --git a/Documentation/cpusets.txt b/Documentation/cpusets.txt index 353504de3084..1f5a924d1e56 100644 --- a/Documentation/cpusets.txt +++ b/Documentation/cpusets.txt | |||
| @@ -154,13 +154,15 @@ browsing and modifying the cpusets presently known to the kernel. No | |||
| 154 | new system calls are added for cpusets - all support for querying and | 154 | new system calls are added for cpusets - all support for querying and |
| 155 | modifying cpusets is via this cpuset file system. | 155 | modifying cpusets is via this cpuset file system. |
| 156 | 156 | ||
| 157 | The /proc/<pid>/status file for each task has two added lines, | 157 | The /proc/<pid>/status file for each task has four added lines, |
| 158 | displaying the tasks cpus_allowed (on which CPUs it may be scheduled) | 158 | displaying the tasks cpus_allowed (on which CPUs it may be scheduled) |
| 159 | and mems_allowed (on which Memory Nodes it may obtain memory), | 159 | and mems_allowed (on which Memory Nodes it may obtain memory), |
| 160 | in the format seen in the following example: | 160 | in the two formats seen in the following example: |
| 161 | 161 | ||
| 162 | Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff | 162 | Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff |
| 163 | Cpus_allowed_list: 0-127 | ||
| 163 | Mems_allowed: ffffffff,ffffffff | 164 | Mems_allowed: ffffffff,ffffffff |
| 165 | Mems_allowed_list: 0-63 | ||
| 164 | 166 | ||
| 165 | Each cpuset is represented by a directory in the cgroup file system | 167 | Each cpuset is represented by a directory in the cgroup file system |
| 166 | containing (on top of the standard cgroup files) the following | 168 | containing (on top of the standard cgroup files) the following |
| @@ -544,6 +546,9 @@ otherwise initial value -1 that indicates the cpuset has no request. | |||
| 544 | ( 4 : search nodes in a chunk of node [on NUMA system] ) | 546 | ( 4 : search nodes in a chunk of node [on NUMA system] ) |
| 545 | ( 5 : search system wide [on NUMA system] ) | 547 | ( 5 : search system wide [on NUMA system] ) |
| 546 | 548 | ||
| 549 | The system default is architecture dependent. The system default | ||
| 550 | can be changed using the relax_domain_level= boot parameter. | ||
| 551 | |||
| 547 | This file is per-cpuset and affect the sched domain where the cpuset | 552 | This file is per-cpuset and affect the sched domain where the cpuset |
| 548 | belongs to. Therefore if the flag 'sched_load_balance' of a cpuset | 553 | belongs to. Therefore if the flag 'sched_load_balance' of a cpuset |
| 549 | is disabled, then 'sched_relax_domain_level' have no effect since | 554 | is disabled, then 'sched_relax_domain_level' have no effect since |
diff --git a/Documentation/ftrace.txt b/Documentation/ftrace.txt new file mode 100644 index 000000000000..13e4bf054c38 --- /dev/null +++ b/Documentation/ftrace.txt | |||
| @@ -0,0 +1,1353 @@ | |||
| 1 | ftrace - Function Tracer | ||
| 2 | ======================== | ||
| 3 | |||
| 4 | Copyright 2008 Red Hat Inc. | ||
| 5 | Author: Steven Rostedt <srostedt@redhat.com> | ||
| 6 | |||
| 7 | |||
| 8 | Introduction | ||
| 9 | ------------ | ||
| 10 | |||
| 11 | Ftrace is an internal tracer designed to help out developers and | ||
| 12 | designers of systems to find what is going on inside the kernel. | ||
| 13 | It can be used for debugging or analyzing latencies and performance | ||
| 14 | issues that take place outside of user-space. | ||
| 15 | |||
| 16 | Although ftrace is the function tracer, it also includes an | ||
| 17 | infrastructure that allows for other types of tracing. Some of the | ||
| 18 | tracers that are currently in ftrace is a tracer to trace | ||
| 19 | context switches, the time it takes for a high priority task to | ||
| 20 | run after it was woken up, the time interrupts are disabled, and | ||
| 21 | more. | ||
| 22 | |||
| 23 | |||
| 24 | The File System | ||
| 25 | --------------- | ||
| 26 | |||
| 27 | Ftrace uses the debugfs file system to hold the control files as well | ||
| 28 | as the files to display output. | ||
| 29 | |||
| 30 | To mount the debugfs system: | ||
| 31 | |||
| 32 | # mkdir /debug | ||
| 33 | # mount -t debugfs nodev /debug | ||
| 34 | |||
| 35 | |||
| 36 | That's it! (assuming that you have ftrace configured into your kernel) | ||
| 37 | |||
| 38 | After mounting the debugfs, you can see a directory called | ||
| 39 | "tracing". This directory contains the control and output files | ||
| 40 | of ftrace. Here is a list of some of the key files: | ||
| 41 | |||
| 42 | |||
| 43 | Note: all time values are in microseconds. | ||
| 44 | |||
| 45 | current_tracer : This is used to set or display the current tracer | ||
| 46 | that is configured. | ||
| 47 | |||
| 48 | available_tracers : This holds the different types of tracers that | ||
| 49 | has been compiled into the kernel. The tracers | ||
| 50 | listed here can be configured by echoing in their | ||
| 51 | name into current_tracer. | ||
| 52 | |||
| 53 | tracing_enabled : This sets or displays whether the current_tracer | ||
| 54 | is activated and tracing or not. Echo 0 into this | ||
| 55 | file to disable the tracer or 1 (or non-zero) to | ||
| 56 | enable it. | ||
| 57 | |||
| 58 | trace : This file holds the output of the trace in a human readable | ||
| 59 | format. | ||
| 60 | |||
| 61 | latency_trace : This file shows the same trace but the information | ||
| 62 | is organized more to display possible latencies | ||
| 63 | in the system. | ||
| 64 | |||
| 65 | trace_pipe : The output is the same as the "trace" file but this | ||
| 66 | file is meant to be streamed with live tracing. | ||
| 67 | Reads from this file will block until new data | ||
| 68 | is retrieved. Unlike the "trace" and "latency_trace" | ||
| 69 | files, this file is a consumer. This means reading | ||
| 70 | from this file causes sequential reads to display | ||
| 71 | more current data. Once data is read from this | ||
| 72 | file, it is consumed, and will not be read | ||
| 73 | again with a sequential read. The "trace" and | ||
| 74 | "latency_trace" files are static, and if the | ||
| 75 | tracer isn't adding more data, they will display | ||
| 76 | the same information every time they are read. | ||
| 77 | |||
| 78 | iter_ctrl : This file lets the user control the amount of data | ||
| 79 | that is displayed in one of the above output | ||
| 80 | files. | ||
| 81 | |||
| 82 | trace_max_latency : Some of the tracers record the max latency. | ||
| 83 | For example, the time interrupts are disabled. | ||
| 84 | This time is saved in this file. The max trace | ||
| 85 | will also be stored, and displayed by either | ||
| 86 | "trace" or "latency_trace". A new max trace will | ||
| 87 | only be recorded if the latency is greater than | ||
| 88 | the value in this file. (in microseconds) | ||
| 89 | |||
| 90 | trace_entries : This sets or displays the number of trace | ||
| 91 | entries each CPU buffer can hold. The tracer buffers | ||
| 92 | are the same size for each CPU, so care must be | ||
| 93 | taken when modifying the trace_entries. The number | ||
| 94 | of actually entries will be the number given | ||
| 95 | times the number of possible CPUS. The buffers | ||
| 96 | are saved as individual pages, and the actual entries | ||
| 97 | will always be rounded up to entries per page. | ||
| 98 | |||
| 99 | This can only be updated when the current_tracer | ||
| 100 | is set to "none". | ||
| 101 | |||
| 102 | NOTE: It is planned on changing the allocated buffers | ||
| 103 | from being the number of possible CPUS to | ||
| 104 | the number of online CPUS. | ||
| 105 | |||
| 106 | tracing_cpumask : This is a mask that lets the user only trace | ||
| 107 | on specified CPUS. The format is a hex string | ||
| 108 | representing the CPUS. | ||
| 109 | |||
| 110 | set_ftrace_filter : When dynamic ftrace is configured in, the | ||
| 111 | code is dynamically modified to disable calling | ||
| 112 | of the function profiler (mcount). This lets | ||
| 113 | tracing be configured in with practically no overhead | ||
| 114 | in performance. This also has a side effect of | ||
| 115 | enabling or disabling specific functions to be | ||
| 116 | traced. Echoing in names of functions into this | ||
| 117 | file will limit the trace to only those files. | ||
| 118 | |||
| 119 | set_ftrace_notrace: This has the opposite effect that | ||
| 120 | set_ftrace_filter has. Any function that is added | ||
| 121 | here will not be traced. If a function exists | ||
| 122 | in both set_ftrace_filter and set_ftrace_notrace | ||
| 123 | the function will _not_ bet traced. | ||
| 124 | |||
| 125 | available_filter_functions : When a function is encountered the first | ||
| 126 | time by the dynamic tracer, it is recorded and | ||
| 127 | later the call is converted into a nop. This file | ||
| 128 | lists the functions that have been recorded | ||
| 129 | by the dynamic tracer and these functions can | ||
| 130 | be used to set the ftrace filter by the above | ||
| 131 | "set_ftrace_filter" file. | ||
| 132 | |||
| 133 | |||
| 134 | The Tracers | ||
| 135 | ----------- | ||
| 136 | |||
| 137 | Here are the list of current tracers that can be configured. | ||
| 138 | |||
| 139 | ftrace - function tracer that uses mcount to trace all functions. | ||
| 140 | It is possible to filter out which functions that are | ||
| 141 | traced when dynamic ftrace is configured in. | ||
| 142 | |||
| 143 | sched_switch - traces the context switches between tasks. | ||
| 144 | |||
| 145 | irqsoff - traces the areas that disable interrupts and saves off | ||
| 146 | the trace with the longest max latency. | ||
| 147 | See tracing_max_latency. When a new max is recorded, | ||
| 148 | it replaces the old trace. It is best to view this | ||
| 149 | trace with the latency_trace file. | ||
| 150 | |||
| 151 | preemptoff - Similar to irqsoff but traces and records the time | ||
| 152 | preemption is disabled. | ||
| 153 | |||
| 154 | preemptirqsoff - Similar to irqsoff and preemptoff, but traces and | ||
| 155 | records the largest time irqs and/or preemption is | ||
| 156 | disabled. | ||
| 157 | |||
| 158 | wakeup - Traces and records the max latency that it takes for | ||
| 159 | the highest priority task to get scheduled after | ||
| 160 | it has been woken up. | ||
| 161 | |||
| 162 | none - This is not a tracer. To remove all tracers from tracing | ||
| 163 | simply echo "none" into current_tracer. | ||
| 164 | |||
| 165 | |||
| 166 | Examples of using the tracer | ||
| 167 | ---------------------------- | ||
| 168 | |||
| 169 | Here are typical examples of using the tracers with only controlling | ||
| 170 | them with the debugfs interface (without using any user-land utilities). | ||
| 171 | |||
| 172 | Output format: | ||
| 173 | -------------- | ||
| 174 | |||
| 175 | Here's an example of the output format of the file "trace" | ||
| 176 | |||
| 177 | -------- | ||
| 178 | # tracer: ftrace | ||
| 179 | # | ||
| 180 | # TASK-PID CPU# TIMESTAMP FUNCTION | ||
| 181 | # | | | | | | ||
| 182 | bash-4251 [01] 10152.583854: path_put <-path_walk | ||
| 183 | bash-4251 [01] 10152.583855: dput <-path_put | ||
| 184 | bash-4251 [01] 10152.583855: _atomic_dec_and_lock <-dput | ||
| 185 | -------- | ||
| 186 | |||
| 187 | A header is printed with the trace that is represented. In this case | ||
| 188 | the tracer is "ftrace". Then a header showing the format. Task name | ||
| 189 | "bash", the task PID "4251", the CPU that it was running on | ||
| 190 | "01", the timestamp in <secs>.<usecs> format, the function name that was | ||
| 191 | traced "path_put" and the parent function that called this function | ||
| 192 | "path_walk". | ||
| 193 | |||
| 194 | The sched_switch tracer also includes tracing of task wake ups and | ||
| 195 | context switches. | ||
| 196 | |||
| 197 | ksoftirqd/1-7 [01] 1453.070013: 7:115:R + 2916:115:S | ||
| 198 | ksoftirqd/1-7 [01] 1453.070013: 7:115:R + 10:115:S | ||
| 199 | ksoftirqd/1-7 [01] 1453.070013: 7:115:R ==> 10:115:R | ||
| 200 | events/1-10 [01] 1453.070013: 10:115:S ==> 2916:115:R | ||
| 201 | kondemand/1-2916 [01] 1453.070013: 2916:115:S ==> 7:115:R | ||
| 202 | ksoftirqd/1-7 [01] 1453.070013: 7:115:S ==> 0:140:R | ||
| 203 | |||
| 204 | Wake ups are represented by a "+" and the context switches show | ||
| 205 | "==>". The format is: | ||
| 206 | |||
| 207 | Context switches: | ||
| 208 | |||
| 209 | Previous task Next Task | ||
| 210 | |||
| 211 | <pid>:<prio>:<state> ==> <pid>:<prio>:<state> | ||
| 212 | |||
| 213 | Wake ups: | ||
| 214 | |||
| 215 | Current task Task waking up | ||
| 216 | |||
| 217 | <pid>:<prio>:<state> + <pid>:<prio>:<state> | ||
| 218 | |||
| 219 | The prio is the internal kernel priority, which is inverse to the | ||
| 220 | priority that is usually displayed by user-space tools. Zero represents | ||
| 221 | the highest priority (99). Prio 100 starts the "nice" priorities with | ||
| 222 | 100 being equal to nice -20 and 139 being nice 19. The prio "140" is | ||
| 223 | reserved for the idle task which is the lowest priority thread (pid 0). | ||
| 224 | |||
| 225 | |||
| 226 | Latency trace format | ||
| 227 | -------------------- | ||
| 228 | |||
| 229 | For traces that display latency times, the latency_trace file gives | ||
| 230 | a bit more information to see why a latency happened. Here's a typical | ||
| 231 | trace. | ||
| 232 | |||
| 233 | # tracer: irqsoff | ||
| 234 | # | ||
| 235 | irqsoff latency trace v1.1.5 on 2.6.26-rc8 | ||
| 236 | -------------------------------------------------------------------- | ||
| 237 | latency: 97 us, #3/3, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) | ||
| 238 | ----------------- | ||
| 239 | | task: swapper-0 (uid:0 nice:0 policy:0 rt_prio:0) | ||
| 240 | ----------------- | ||
| 241 | => started at: apic_timer_interrupt | ||
| 242 | => ended at: do_softirq | ||
| 243 | |||
| 244 | # _------=> CPU# | ||
| 245 | # / _-----=> irqs-off | ||
| 246 | # | / _----=> need-resched | ||
| 247 | # || / _---=> hardirq/softirq | ||
| 248 | # ||| / _--=> preempt-depth | ||
| 249 | # |||| / | ||
| 250 | # ||||| delay | ||
| 251 | # cmd pid ||||| time | caller | ||
| 252 | # \ / ||||| \ | / | ||
| 253 | <idle>-0 0d..1 0us+: trace_hardirqs_off_thunk (apic_timer_interrupt) | ||
| 254 | <idle>-0 0d.s. 97us : __do_softirq (do_softirq) | ||
| 255 | <idle>-0 0d.s1 98us : trace_hardirqs_on (do_softirq) | ||
| 256 | |||
| 257 | |||
| 258 | vim:ft=help | ||
| 259 | |||
| 260 | |||
| 261 | This shows that the current tracer is "irqsoff" tracing the time | ||
| 262 | interrupts are disabled. It gives the trace version and the kernel | ||
| 263 | this was executed on (2.6.26-rc8). Then it displays the max latency | ||
| 264 | in microsecs (97 us). The number of trace entries displayed | ||
| 265 | by the total number recorded (both are three: #3/3). The type of | ||
| 266 | preemption that was used (PREEMPT). VP, KP, SP, and HP are always zero | ||
| 267 | and reserved for later use. #P is the number of online CPUS (#P:2). | ||
| 268 | |||
| 269 | The task is the process that was running when the latency happened. | ||
| 270 | (swapper pid: 0). | ||
| 271 | |||
| 272 | The start and stop that caused the latencies: | ||
| 273 | |||
| 274 | apic_timer_interrupt is where the interrupts were disabled. | ||
| 275 | do_softirq is where they were enabled again. | ||
| 276 | |||
| 277 | The next lines after the header are the trace itself. The header | ||
| 278 | explains which is which. | ||
| 279 | |||
| 280 | cmd: The name of the process in the trace. | ||
| 281 | |||
| 282 | pid: The PID of that process. | ||
| 283 | |||
| 284 | CPU#: The CPU that the process was running on. | ||
| 285 | |||
| 286 | irqs-off: 'd' interrupts are disabled. '.' otherwise. | ||
| 287 | |||
| 288 | need-resched: 'N' task need_resched is set, '.' otherwise. | ||
| 289 | |||
| 290 | hardirq/softirq: | ||
| 291 | 'H' - hard irq happened inside a softirq. | ||
| 292 | 'h' - hard irq is running | ||
| 293 | 's' - soft irq is running | ||
| 294 | '.' - normal context. | ||
| 295 | |||
| 296 | preempt-depth: The level of preempt_disabled | ||
| 297 | |||
| 298 | The above is mostly meaningful for kernel developers. | ||
| 299 | |||
| 300 | time: This differs from the trace output where as the trace output | ||
| 301 | contained a absolute timestamp. This timestamp is relative | ||
| 302 | to the start of the first entry in the the trace. | ||
| 303 | |||
| 304 | delay: This is just to help catch your eye a bit better. And | ||
| 305 | needs to be fixed to be only relative to the same CPU. | ||
| 306 | The marks is determined by the difference between this | ||
| 307 | current trace and the next trace. | ||
| 308 | '!' - greater than preempt_mark_thresh (default 100) | ||
| 309 | '+' - greater than 1 microsecond | ||
| 310 | ' ' - less than or equal to 1 microsecond. | ||
| 311 | |||
| 312 | The rest is the same as the 'trace' file. | ||
| 313 | |||
| 314 | |||
| 315 | iter_ctrl | ||
| 316 | --------- | ||
| 317 | |||
| 318 | The iter_ctrl file is used to control what gets printed in the trace | ||
| 319 | output. To see what is available, simply cat the file: | ||
| 320 | |||
| 321 | cat /debug/tracing/iter_ctrl | ||
| 322 | print-parent nosym-offset nosym-addr noverbose noraw nohex nobin \ | ||
| 323 | noblock nostacktrace nosched-tree | ||
| 324 | |||
| 325 | To disable one of the options, echo in the option appended with "no". | ||
| 326 | |||
| 327 | echo noprint-parent > /debug/tracing/iter_ctrl | ||
| 328 | |||
| 329 | To enable an option, leave off the "no". | ||
| 330 | |||
| 331 | echo sym-offest > /debug/tracing/iter_ctrl | ||
| 332 | |||
| 333 | Here are the available options: | ||
| 334 | |||
| 335 | print-parent - On function traces, display the calling function | ||
| 336 | as well as the function being traced. | ||
| 337 | |||
| 338 | print-parent: | ||
| 339 | bash-4000 [01] 1477.606694: simple_strtoul <-strict_strtoul | ||
| 340 | |||
| 341 | noprint-parent: | ||
| 342 | bash-4000 [01] 1477.606694: simple_strtoul | ||
| 343 | |||
| 344 | |||
| 345 | sym-offset - Display not only the function name, but also the offset | ||
| 346 | in the function. For example, instead of seeing just | ||
| 347 | "ktime_get" you will see "ktime_get+0xb/0x20" | ||
| 348 | |||
| 349 | sym-offset: | ||
| 350 | bash-4000 [01] 1477.606694: simple_strtoul+0x6/0xa0 | ||
| 351 | |||
| 352 | sym-addr - this will also display the function address as well as | ||
| 353 | the function name. | ||
| 354 | |||
| 355 | sym-addr: | ||
| 356 | bash-4000 [01] 1477.606694: simple_strtoul <c0339346> | ||
| 357 | |||
| 358 | verbose - This deals with the latency_trace file. | ||
| 359 | |||
| 360 | bash 4000 1 0 00000000 00010a95 [58127d26] 1720.415ms \ | ||
| 361 | (+0.000ms): simple_strtoul (strict_strtoul) | ||
| 362 | |||
| 363 | raw - This will display raw numbers. This option is best for use with | ||
| 364 | user applications that can translate the raw numbers better than | ||
| 365 | having it done in the kernel. | ||
| 366 | |||
| 367 | hex - similar to raw, but the numbers will be in a hexadecimal format. | ||
| 368 | |||
| 369 | bin - This will print out the formats in raw binary. | ||
| 370 | |||
| 371 | block - TBD (needs update) | ||
| 372 | |||
| 373 | stacktrace - This is one of the options that changes the trace itself. | ||
| 374 | When a trace is recorded, so is the stack of functions. | ||
| 375 | This allows for back traces of trace sites. | ||
| 376 | |||
| 377 | sched-tree - TBD (any users??) | ||
| 378 | |||
| 379 | |||
| 380 | sched_switch | ||
| 381 | ------------ | ||
| 382 | |||
| 383 | This tracer simply records schedule switches. Here's an example | ||
| 384 | on how to implement it. | ||
| 385 | |||
| 386 | # echo sched_switch > /debug/tracing/current_tracer | ||
| 387 | # echo 1 > /debug/tracing/tracing_enabled | ||
| 388 | # sleep 1 | ||
| 389 | # echo 0 > /debug/tracing/tracing_enabled | ||
| 390 | # cat /debug/tracing/trace | ||
| 391 | |||
| 392 | # tracer: sched_switch | ||
| 393 | # | ||
| 394 | # TASK-PID CPU# TIMESTAMP FUNCTION | ||
| 395 | # | | | | | | ||
| 396 | bash-3997 [01] 240.132281: 3997:120:R + 4055:120:R | ||
| 397 | bash-3997 [01] 240.132284: 3997:120:R ==> 4055:120:R | ||
| 398 | sleep-4055 [01] 240.132371: 4055:120:S ==> 3997:120:R | ||
| 399 | bash-3997 [01] 240.132454: 3997:120:R + 4055:120:S | ||
| 400 | bash-3997 [01] 240.132457: 3997:120:R ==> 4055:120:R | ||
| 401 | sleep-4055 [01] 240.132460: 4055:120:D ==> 3997:120:R | ||
| 402 | bash-3997 [01] 240.132463: 3997:120:R + 4055:120:D | ||
| 403 | bash-3997 [01] 240.132465: 3997:120:R ==> 4055:120:R | ||
| 404 | <idle>-0 [00] 240.132589: 0:140:R + 4:115:S | ||
| 405 | <idle>-0 [00] 240.132591: 0:140:R ==> 4:115:R | ||
| 406 | ksoftirqd/0-4 [00] 240.132595: 4:115:S ==> 0:140:R | ||
| 407 | <idle>-0 [00] 240.132598: 0:140:R + 4:115:S | ||
| 408 | <idle>-0 [00] 240.132599: 0:140:R ==> 4:115:R | ||
| 409 | ksoftirqd/0-4 [00] 240.132603: 4:115:S ==> 0:140:R | ||
| 410 | sleep-4055 [01] 240.133058: 4055:120:S ==> 3997:120:R | ||
| 411 | [...] | ||
| 412 | |||
| 413 | |||
| 414 | As we have discussed previously about this format, the header shows | ||
| 415 | the name of the trace and points to the options. The "FUNCTION" | ||
| 416 | is a misnomer since here it represents the wake ups and context | ||
| 417 | switches. | ||
| 418 | |||
| 419 | The sched_switch only lists the wake ups (represented with '+') | ||
| 420 | and context switches ('==>') with the previous task or current | ||
| 421 | first followed by the next task or task waking up. The format for both | ||
| 422 | of these is PID:KERNEL-PRIO:TASK-STATE. Remember that the KERNEL-PRIO | ||
| 423 | is the inverse of the actual priority with zero (0) being the highest | ||
| 424 | priority and the nice values starting at 100 (nice -20). Below is | ||
| 425 | a quick chart to map the kernel priority to user land priorities. | ||
| 426 | |||
| 427 | Kernel priority: 0 to 99 ==> user RT priority 99 to 0 | ||
| 428 | Kernel priority: 100 to 139 ==> user nice -20 to 19 | ||
| 429 | Kernel priority: 140 ==> idle task priority | ||
| 430 | |||
| 431 | The task states are: | ||
| 432 | |||
| 433 | R - running : wants to run, may not actually be running | ||
| 434 | S - sleep : process is waiting to be woken up (handles signals) | ||
| 435 | D - deep sleep : process must be woken up (ignores signals) | ||
| 436 | T - stopped : process suspended | ||
| 437 | t - traced : process is being traced (with something like gdb) | ||
| 438 | Z - zombie : process waiting to be cleaned up | ||
| 439 | X - unknown | ||
| 440 | |||
| 441 | |||
| 442 | ftrace_enabled | ||
| 443 | -------------- | ||
| 444 | |||
| 445 | The following tracers give different output depending on whether | ||
| 446 | or not the sysctl ftrace_enabled is set. To set ftrace_enabled, | ||
| 447 | one can either use the sysctl function or set it via the proc | ||
| 448 | file system interface. | ||
| 449 | |||
| 450 | sysctl kernel.ftrace_enabled=1 | ||
| 451 | |||
| 452 | or | ||
| 453 | |||
| 454 | echo 1 > /proc/sys/kernel/ftrace_enabled | ||
| 455 | |||
| 456 | To disable ftrace_enabled simply replace the '1' with '0' in | ||
| 457 | the above commands. | ||
| 458 | |||
| 459 | When ftrace_enabled is set the tracers will also record the functions | ||
| 460 | that are within the trace. The descriptions of the tracers | ||
| 461 | will also show an example with ftrace enabled. | ||
| 462 | |||
| 463 | |||
| 464 | irqsoff | ||
| 465 | ------- | ||
| 466 | |||
| 467 | When interrupts are disabled, the CPU can not react to any other | ||
| 468 | external event (besides NMIs and SMIs). This prevents the timer | ||
| 469 | interrupt from triggering or the mouse interrupt from letting the | ||
| 470 | kernel know of a new mouse event. The result is a latency with the | ||
| 471 | reaction time. | ||
| 472 | |||
| 473 | The irqsoff tracer tracks the time interrupts are disabled and when | ||
| 474 | they are re-enabled. When a new maximum latency is hit, it saves off | ||
| 475 | the trace so that it may be retrieved at a later time. Every time a | ||
| 476 | new maximum in reached, the old saved trace is discarded and the new | ||
| 477 | trace is saved. | ||
| 478 | |||
| 479 | To reset the maximum, echo 0 into tracing_max_latency. Here's an | ||
| 480 | example: | ||
| 481 | |||
| 482 | # echo irqsoff > /debug/tracing/current_tracer | ||
| 483 | # echo 0 > /debug/tracing/tracing_max_latency | ||
| 484 | # echo 1 > /debug/tracing/tracing_enabled | ||
| 485 | # ls -ltr | ||
| 486 | [...] | ||
| 487 | # echo 0 > /debug/tracing/tracing_enabled | ||
| 488 | # cat /debug/tracing/latency_trace | ||
| 489 | # tracer: irqsoff | ||
| 490 | # | ||
| 491 | irqsoff latency trace v1.1.5 on 2.6.26-rc8 | ||
| 492 | -------------------------------------------------------------------- | ||
| 493 | latency: 6 us, #3/3, CPU#1 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) | ||
| 494 | ----------------- | ||
| 495 | | task: bash-4269 (uid:0 nice:0 policy:0 rt_prio:0) | ||
| 496 | ----------------- | ||
| 497 | => started at: copy_page_range | ||
| 498 | => ended at: copy_page_range | ||
| 499 | |||
| 500 | # _------=> CPU# | ||
| 501 | # / _-----=> irqs-off | ||
| 502 | # | / _----=> need-resched | ||
| 503 | # || / _---=> hardirq/softirq | ||
| 504 | # ||| / _--=> preempt-depth | ||
| 505 | # |||| / | ||
| 506 | # ||||| delay | ||
| 507 | # cmd pid ||||| time | caller | ||
| 508 | # \ / ||||| \ | / | ||
| 509 | bash-4269 1...1 0us+: _spin_lock (copy_page_range) | ||
| 510 | bash-4269 1...1 7us : _spin_unlock (copy_page_range) | ||
| 511 | bash-4269 1...2 7us : trace_preempt_on (copy_page_range) | ||
| 512 | |||
| 513 | |||
| 514 | vim:ft=help | ||
| 515 | |||
| 516 | Here we see that that we had a latency of 6 microsecs (which is | ||
| 517 | very good). The spin_lock in copy_page_range disabled interrupts. | ||
| 518 | The difference between the 6 and the displayed timestamp 7us is | ||
| 519 | because the clock must have incremented between the time of recording | ||
| 520 | the max latency and recording the function that had that latency. | ||
| 521 | |||
| 522 | Note the above had ftrace_enabled not set. If we set the ftrace_enabled | ||
| 523 | we get a much larger output: | ||
| 524 | |||
| 525 | # tracer: irqsoff | ||
| 526 | # | ||
| 527 | irqsoff latency trace v1.1.5 on 2.6.26-rc8 | ||
| 528 | -------------------------------------------------------------------- | ||
| 529 | latency: 50 us, #101/101, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) | ||
| 530 | ----------------- | ||
| 531 | | task: ls-4339 (uid:0 nice:0 policy:0 rt_prio:0) | ||
| 532 | ----------------- | ||
| 533 | => started at: __alloc_pages_internal | ||
| 534 | => ended at: __alloc_pages_internal | ||
| 535 | |||
| 536 | # _------=> CPU# | ||
| 537 | # / _-----=> irqs-off | ||
| 538 | # | / _----=> need-resched | ||
| 539 | # || / _---=> hardirq/softirq | ||
| 540 | # ||| / _--=> preempt-depth | ||
| 541 | # |||| / | ||
| 542 | # ||||| delay | ||
| 543 | # cmd pid ||||| time | caller | ||
| 544 | # \ / ||||| \ | / | ||
| 545 | ls-4339 0...1 0us+: get_page_from_freelist (__alloc_pages_internal) | ||
| 546 | ls-4339 0d..1 3us : rmqueue_bulk (get_page_from_freelist) | ||
| 547 | ls-4339 0d..1 3us : _spin_lock (rmqueue_bulk) | ||
| 548 | ls-4339 0d..1 4us : add_preempt_count (_spin_lock) | ||
| 549 | ls-4339 0d..2 4us : __rmqueue (rmqueue_bulk) | ||
| 550 | ls-4339 0d..2 5us : __rmqueue_smallest (__rmqueue) | ||
| 551 | ls-4339 0d..2 5us : __mod_zone_page_state (__rmqueue_smallest) | ||
| 552 | ls-4339 0d..2 6us : __rmqueue (rmqueue_bulk) | ||
| 553 | ls-4339 0d..2 6us : __rmqueue_smallest (__rmqueue) | ||
| 554 | ls-4339 0d..2 7us : __mod_zone_page_state (__rmqueue_smallest) | ||
| 555 | ls-4339 0d..2 7us : __rmqueue (rmqueue_bulk) | ||
| 556 | ls-4339 0d..2 8us : __rmqueue_smallest (__rmqueue) | ||
| 557 | [...] | ||
| 558 | ls-4339 0d..2 46us : __rmqueue_smallest (__rmqueue) | ||
| 559 | ls-4339 0d..2 47us : __mod_zone_page_state (__rmqueue_smallest) | ||
| 560 | ls-4339 0d..2 47us : __rmqueue (rmqueue_bulk) | ||
| 561 | ls-4339 0d..2 48us : __rmqueue_smallest (__rmqueue) | ||
| 562 | ls-4339 0d..2 48us : __mod_zone_page_state (__rmqueue_smallest) | ||
| 563 | ls-4339 0d..2 49us : _spin_unlock (rmqueue_bulk) | ||
| 564 | ls-4339 0d..2 49us : sub_preempt_count (_spin_unlock) | ||
| 565 | ls-4339 0d..1 50us : get_page_from_freelist (__alloc_pages_internal) | ||
| 566 | ls-4339 0d..2 51us : trace_hardirqs_on (__alloc_pages_internal) | ||
| 567 | |||
| 568 | |||
| 569 | vim:ft=help | ||
| 570 | |||
| 571 | |||
| 572 | Here we traced a 50 microsecond latency. But we also see all the | ||
| 573 | functions that were called during that time. Note that enabling | ||
| 574 | function tracing we endure an added overhead. This overhead may | ||
| 575 | extend the latency times. But never the less, this trace has provided | ||
| 576 | some very helpful debugging. | ||
| 577 | |||
| 578 | |||
| 579 | preemptoff | ||
| 580 | ---------- | ||
| 581 | |||
| 582 | When preemption is disabled we may be able to receive interrupts but | ||
| 583 | the task can not be preempted and a higher priority task must wait | ||
| 584 | for preemption to be enabled again before it can preempt a lower | ||
| 585 | priority task. | ||
| 586 | |||
| 587 | The preemptoff tracer traces the places that disables preemption. | ||
| 588 | Like the irqsoff, it records the maximum latency that preemption | ||
| 589 | was disabled. The control of preemptoff is much like the irqsoff. | ||
| 590 | |||
| 591 | # echo preemptoff > /debug/tracing/current_tracer | ||
| 592 | # echo 0 > /debug/tracing/tracing_max_latency | ||
| 593 | # echo 1 > /debug/tracing/tracing_enabled | ||
| 594 | # ls -ltr | ||
| 595 | [...] | ||
| 596 | # echo 0 > /debug/tracing/tracing_enabled | ||
| 597 | # cat /debug/tracing/latency_trace | ||
| 598 | # tracer: preemptoff | ||
| 599 | # | ||
| 600 | preemptoff latency trace v1.1.5 on 2.6.26-rc8 | ||
| 601 | -------------------------------------------------------------------- | ||
| 602 | latency: 29 us, #3/3, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) | ||
| 603 | ----------------- | ||
| 604 | | task: sshd-4261 (uid:0 nice:0 policy:0 rt_prio:0) | ||
| 605 | ----------------- | ||
| 606 | => started at: do_IRQ | ||
| 607 | => ended at: __do_softirq | ||
| 608 | |||
| 609 | # _------=> CPU# | ||
| 610 | # / _-----=> irqs-off | ||
| 611 | # | / _----=> need-resched | ||
| 612 | # || / _---=> hardirq/softirq | ||
| 613 | # ||| / _--=> preempt-depth | ||
| 614 | # |||| / | ||
| 615 | # ||||| delay | ||
| 616 | # cmd pid ||||| time | caller | ||
| 617 | # \ / ||||| \ | / | ||
| 618 | sshd-4261 0d.h. 0us+: irq_enter (do_IRQ) | ||
| 619 | sshd-4261 0d.s. 29us : _local_bh_enable (__do_softirq) | ||
| 620 | sshd-4261 0d.s1 30us : trace_preempt_on (__do_softirq) | ||
| 621 | |||
| 622 | |||
| 623 | vim:ft=help | ||
| 624 | |||
| 625 | This has some more changes. Preemption was disabled when an interrupt | ||
| 626 | came in (notice the 'h'), and was enabled while doing a softirq. | ||
| 627 | (notice the 's'). But we also see that interrupts have been disabled | ||
| 628 | when entering the preempt off section and leaving it (the 'd'). | ||
| 629 | We do not know if interrupts were enabled in the mean time. | ||
| 630 | |||
| 631 | # tracer: preemptoff | ||
| 632 | # | ||
| 633 | preemptoff latency trace v1.1.5 on 2.6.26-rc8 | ||
| 634 | -------------------------------------------------------------------- | ||
| 635 | latency: 63 us, #87/87, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) | ||
| 636 | ----------------- | ||
| 637 | | task: sshd-4261 (uid:0 nice:0 policy:0 rt_prio:0) | ||
| 638 | ----------------- | ||
| 639 | => started at: remove_wait_queue | ||
| 640 | => ended at: __do_softirq | ||
| 641 | |||
| 642 | # _------=> CPU# | ||
| 643 | # / _-----=> irqs-off | ||
| 644 | # | / _----=> need-resched | ||
| 645 | # || / _---=> hardirq/softirq | ||
| 646 | # ||| / _--=> preempt-depth | ||
| 647 | # |||| / | ||
| 648 | # ||||| delay | ||
| 649 | # cmd pid ||||| time | caller | ||
| 650 | # \ / ||||| \ | / | ||
| 651 | sshd-4261 0d..1 0us : _spin_lock_irqsave (remove_wait_queue) | ||
| 652 | sshd-4261 0d..1 1us : _spin_unlock_irqrestore (remove_wait_queue) | ||
| 653 | sshd-4261 0d..1 2us : do_IRQ (common_interrupt) | ||
| 654 | sshd-4261 0d..1 2us : irq_enter (do_IRQ) | ||
| 655 | sshd-4261 0d..1 2us : idle_cpu (irq_enter) | ||
| 656 | sshd-4261 0d..1 3us : add_preempt_count (irq_enter) | ||
| 657 | sshd-4261 0d.h1 3us : idle_cpu (irq_enter) | ||
| 658 | sshd-4261 0d.h. 4us : handle_fasteoi_irq (do_IRQ) | ||
| 659 | [...] | ||
| 660 | sshd-4261 0d.h. 12us : add_preempt_count (_spin_lock) | ||
| 661 | sshd-4261 0d.h1 12us : ack_ioapic_quirk_irq (handle_fasteoi_irq) | ||
| 662 | sshd-4261 0d.h1 13us : move_native_irq (ack_ioapic_quirk_irq) | ||
| 663 | sshd-4261 0d.h1 13us : _spin_unlock (handle_fasteoi_irq) | ||
| 664 | sshd-4261 0d.h1 14us : sub_preempt_count (_spin_unlock) | ||
| 665 | sshd-4261 0d.h1 14us : irq_exit (do_IRQ) | ||
| 666 | sshd-4261 0d.h1 15us : sub_preempt_count (irq_exit) | ||
| 667 | sshd-4261 0d..2 15us : do_softirq (irq_exit) | ||
| 668 | sshd-4261 0d... 15us : __do_softirq (do_softirq) | ||
| 669 | sshd-4261 0d... 16us : __local_bh_disable (__do_softirq) | ||
| 670 | sshd-4261 0d... 16us+: add_preempt_count (__local_bh_disable) | ||
| 671 | sshd-4261 0d.s4 20us : add_preempt_count (__local_bh_disable) | ||
| 672 | sshd-4261 0d.s4 21us : sub_preempt_count (local_bh_enable) | ||
| 673 | sshd-4261 0d.s5 21us : sub_preempt_count (local_bh_enable) | ||
| 674 | [...] | ||
| 675 | sshd-4261 0d.s6 41us : add_preempt_count (__local_bh_disable) | ||
| 676 | sshd-4261 0d.s6 42us : sub_preempt_count (local_bh_enable) | ||
| 677 | sshd-4261 0d.s7 42us : sub_preempt_count (local_bh_enable) | ||
| 678 | sshd-4261 0d.s5 43us : add_preempt_count (__local_bh_disable) | ||
| 679 | sshd-4261 0d.s5 43us : sub_preempt_count (local_bh_enable_ip) | ||
| 680 | sshd-4261 0d.s6 44us : sub_preempt_count (local_bh_enable_ip) | ||
| 681 | sshd-4261 0d.s5 44us : add_preempt_count (__local_bh_disable) | ||
| 682 | sshd-4261 0d.s5 45us : sub_preempt_count (local_bh_enable) | ||
| 683 | [...] | ||
| 684 | sshd-4261 0d.s. 63us : _local_bh_enable (__do_softirq) | ||
| 685 | sshd-4261 0d.s1 64us : trace_preempt_on (__do_softirq) | ||
| 686 | |||
| 687 | |||
| 688 | The above is an example of the preemptoff trace with ftrace_enabled | ||
| 689 | set. Here we see that interrupts were disabled the entire time. | ||
| 690 | The irq_enter code lets us know that we entered an interrupt 'h'. | ||
| 691 | Before that, the functions being traced still show that it is not | ||
| 692 | in an interrupt, but we can see by the functions themselves that | ||
| 693 | this is not the case. | ||
| 694 | |||
| 695 | Notice that the __do_softirq when called doesn't have a preempt_count. | ||
| 696 | It may seem that we missed a preempt enabled. What really happened | ||
| 697 | is that the preempt count is held on the threads stack and we | ||
| 698 | switched to the softirq stack (4K stacks in effect). The code | ||
| 699 | does not copy the preempt count, but because interrupts are disabled | ||
| 700 | we don't need to worry about it. Having a tracer like this is good | ||
| 701 | to let people know what really happens inside the kernel. | ||
| 702 | |||
| 703 | |||
| 704 | preemptirqsoff | ||
| 705 | -------------- | ||
| 706 | |||
| 707 | Knowing the locations that have interrupts disabled or preemption | ||
| 708 | disabled for the longest times is helpful. But sometimes we would | ||
| 709 | like to know when either preemption and/or interrupts are disabled. | ||
| 710 | |||
| 711 | The following code: | ||
| 712 | |||
| 713 | local_irq_disable(); | ||
| 714 | call_function_with_irqs_off(); | ||
| 715 | preempt_disable(); | ||
| 716 | call_function_with_irqs_and_preemption_off(); | ||
| 717 | local_irq_enable(); | ||
| 718 | call_function_with_preemption_off(); | ||
| 719 | preempt_enable(); | ||
| 720 | |||
| 721 | The irqsoff tracer will record the total length of | ||
| 722 | call_function_with_irqs_off() and | ||
| 723 | call_function_with_irqs_and_preemption_off(). | ||
| 724 | |||
| 725 | The preemptoff tracer will record the total length of | ||
| 726 | call_function_with_irqs_and_preemption_off() and | ||
| 727 | call_function_with_preemption_off(). | ||
| 728 | |||
| 729 | But neither will trace the time that interrupts and/or preemption | ||
| 730 | is disabled. This total time is the time that we can not schedule. | ||
| 731 | To record this time, use the preemptirqsoff tracer. | ||
| 732 | |||
| 733 | Again, using this trace is much like the irqsoff and preemptoff tracers. | ||
| 734 | |||
| 735 | # echo preemptoff > /debug/tracing/current_tracer | ||
| 736 | # echo 0 > /debug/tracing/tracing_max_latency | ||
| 737 | # echo 1 > /debug/tracing/tracing_enabled | ||
| 738 | # ls -ltr | ||
| 739 | [...] | ||
| 740 | # echo 0 > /debug/tracing/tracing_enabled | ||
| 741 | # cat /debug/tracing/latency_trace | ||
| 742 | # tracer: preemptirqsoff | ||
| 743 | # | ||
| 744 | preemptirqsoff latency trace v1.1.5 on 2.6.26-rc8 | ||
| 745 | -------------------------------------------------------------------- | ||
| 746 | latency: 293 us, #3/3, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) | ||
| 747 | ----------------- | ||
| 748 | | task: ls-4860 (uid:0 nice:0 policy:0 rt_prio:0) | ||
| 749 | ----------------- | ||
| 750 | => started at: apic_timer_interrupt | ||
| 751 | => ended at: __do_softirq | ||
| 752 | |||
| 753 | # _------=> CPU# | ||
| 754 | # / _-----=> irqs-off | ||
| 755 | # | / _----=> need-resched | ||
| 756 | # || / _---=> hardirq/softirq | ||
| 757 | # ||| / _--=> preempt-depth | ||
| 758 | # |||| / | ||
| 759 | # ||||| delay | ||
| 760 | # cmd pid ||||| time | caller | ||
| 761 | # \ / ||||| \ | / | ||
| 762 | ls-4860 0d... 0us!: trace_hardirqs_off_thunk (apic_timer_interrupt) | ||
| 763 | ls-4860 0d.s. 294us : _local_bh_enable (__do_softirq) | ||
| 764 | ls-4860 0d.s1 294us : trace_preempt_on (__do_softirq) | ||
| 765 | |||
| 766 | |||
| 767 | vim:ft=help | ||
| 768 | |||
| 769 | |||
| 770 | The trace_hardirqs_off_thunk is called from assembly on x86 when | ||
| 771 | interrupts are disabled in the assembly code. Without the function | ||
| 772 | tracing, we don't know if interrupts were enabled within the preemption | ||
| 773 | points. We do see that it started with preemption enabled. | ||
| 774 | |||
| 775 | Here is a trace with ftrace_enabled set: | ||
| 776 | |||
| 777 | |||
| 778 | # tracer: preemptirqsoff | ||
| 779 | # | ||
| 780 | preemptirqsoff latency trace v1.1.5 on 2.6.26-rc8 | ||
| 781 | -------------------------------------------------------------------- | ||
| 782 | latency: 105 us, #183/183, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) | ||
| 783 | ----------------- | ||
| 784 | | task: sshd-4261 (uid:0 nice:0 policy:0 rt_prio:0) | ||
| 785 | ----------------- | ||
| 786 | => started at: write_chan | ||
| 787 | => ended at: __do_softirq | ||
| 788 | |||
| 789 | # _------=> CPU# | ||
| 790 | # / _-----=> irqs-off | ||
| 791 | # | / _----=> need-resched | ||
| 792 | # || / _---=> hardirq/softirq | ||
| 793 | # ||| / _--=> preempt-depth | ||
| 794 | # |||| / | ||
| 795 | # ||||| delay | ||
| 796 | # cmd pid ||||| time | caller | ||
| 797 | # \ / ||||| \ | / | ||
| 798 | ls-4473 0.N.. 0us : preempt_schedule (write_chan) | ||
| 799 | ls-4473 0dN.1 1us : _spin_lock (schedule) | ||
| 800 | ls-4473 0dN.1 2us : add_preempt_count (_spin_lock) | ||
| 801 | ls-4473 0d..2 2us : put_prev_task_fair (schedule) | ||
| 802 | [...] | ||
| 803 | ls-4473 0d..2 13us : set_normalized_timespec (ktime_get_ts) | ||
| 804 | ls-4473 0d..2 13us : __switch_to (schedule) | ||
| 805 | sshd-4261 0d..2 14us : finish_task_switch (schedule) | ||
| 806 | sshd-4261 0d..2 14us : _spin_unlock_irq (finish_task_switch) | ||
| 807 | sshd-4261 0d..1 15us : add_preempt_count (_spin_lock_irqsave) | ||
| 808 | sshd-4261 0d..2 16us : _spin_unlock_irqrestore (hrtick_set) | ||
| 809 | sshd-4261 0d..2 16us : do_IRQ (common_interrupt) | ||
| 810 | sshd-4261 0d..2 17us : irq_enter (do_IRQ) | ||
| 811 | sshd-4261 0d..2 17us : idle_cpu (irq_enter) | ||
| 812 | sshd-4261 0d..2 18us : add_preempt_count (irq_enter) | ||
| 813 | sshd-4261 0d.h2 18us : idle_cpu (irq_enter) | ||
| 814 | sshd-4261 0d.h. 18us : handle_fasteoi_irq (do_IRQ) | ||
| 815 | sshd-4261 0d.h. 19us : _spin_lock (handle_fasteoi_irq) | ||
| 816 | sshd-4261 0d.h. 19us : add_preempt_count (_spin_lock) | ||
| 817 | sshd-4261 0d.h1 20us : _spin_unlock (handle_fasteoi_irq) | ||
| 818 | sshd-4261 0d.h1 20us : sub_preempt_count (_spin_unlock) | ||
| 819 | [...] | ||
| 820 | sshd-4261 0d.h1 28us : _spin_unlock (handle_fasteoi_irq) | ||
| 821 | sshd-4261 0d.h1 29us : sub_preempt_count (_spin_unlock) | ||
| 822 | sshd-4261 0d.h2 29us : irq_exit (do_IRQ) | ||
| 823 | sshd-4261 0d.h2 29us : sub_preempt_count (irq_exit) | ||
| 824 | sshd-4261 0d..3 30us : do_softirq (irq_exit) | ||
| 825 | sshd-4261 0d... 30us : __do_softirq (do_softirq) | ||
| 826 | sshd-4261 0d... 31us : __local_bh_disable (__do_softirq) | ||
| 827 | sshd-4261 0d... 31us+: add_preempt_count (__local_bh_disable) | ||
| 828 | sshd-4261 0d.s4 34us : add_preempt_count (__local_bh_disable) | ||
| 829 | [...] | ||
| 830 | sshd-4261 0d.s3 43us : sub_preempt_count (local_bh_enable_ip) | ||
| 831 | sshd-4261 0d.s4 44us : sub_preempt_count (local_bh_enable_ip) | ||
| 832 | sshd-4261 0d.s3 44us : smp_apic_timer_interrupt (apic_timer_interrupt) | ||
| 833 | sshd-4261 0d.s3 45us : irq_enter (smp_apic_timer_interrupt) | ||
| 834 | sshd-4261 0d.s3 45us : idle_cpu (irq_enter) | ||
| 835 | sshd-4261 0d.s3 46us : add_preempt_count (irq_enter) | ||
| 836 | sshd-4261 0d.H3 46us : idle_cpu (irq_enter) | ||
| 837 | sshd-4261 0d.H3 47us : hrtimer_interrupt (smp_apic_timer_interrupt) | ||
| 838 | sshd-4261 0d.H3 47us : ktime_get (hrtimer_interrupt) | ||
| 839 | [...] | ||
| 840 | sshd-4261 0d.H3 81us : tick_program_event (hrtimer_interrupt) | ||
| 841 | sshd-4261 0d.H3 82us : ktime_get (tick_program_event) | ||
| 842 | sshd-4261 0d.H3 82us : ktime_get_ts (ktime_get) | ||
| 843 | sshd-4261 0d.H3 83us : getnstimeofday (ktime_get_ts) | ||
| 844 | sshd-4261 0d.H3 83us : set_normalized_timespec (ktime_get_ts) | ||
| 845 | sshd-4261 0d.H3 84us : clockevents_program_event (tick_program_event) | ||
| 846 | sshd-4261 0d.H3 84us : lapic_next_event (clockevents_program_event) | ||
| 847 | sshd-4261 0d.H3 85us : irq_exit (smp_apic_timer_interrupt) | ||
| 848 | sshd-4261 0d.H3 85us : sub_preempt_count (irq_exit) | ||
| 849 | sshd-4261 0d.s4 86us : sub_preempt_count (irq_exit) | ||
| 850 | sshd-4261 0d.s3 86us : add_preempt_count (__local_bh_disable) | ||
| 851 | [...] | ||
| 852 | sshd-4261 0d.s1 98us : sub_preempt_count (net_rx_action) | ||
| 853 | sshd-4261 0d.s. 99us : add_preempt_count (_spin_lock_irq) | ||
| 854 | sshd-4261 0d.s1 99us+: _spin_unlock_irq (run_timer_softirq) | ||
| 855 | sshd-4261 0d.s. 104us : _local_bh_enable (__do_softirq) | ||
| 856 | sshd-4261 0d.s. 104us : sub_preempt_count (_local_bh_enable) | ||
| 857 | sshd-4261 0d.s. 105us : _local_bh_enable (__do_softirq) | ||
| 858 | sshd-4261 0d.s1 105us : trace_preempt_on (__do_softirq) | ||
| 859 | |||
| 860 | |||
| 861 | This is a very interesting trace. It started with the preemption of | ||
| 862 | the ls task. We see that the task had the "need_resched" bit set | ||
| 863 | with the 'N' in the trace. Interrupts are disabled in the spin_lock | ||
| 864 | and the trace started. We see that a schedule took place to run | ||
| 865 | sshd. When the interrupts were enabled we took an interrupt. | ||
| 866 | On return of the interrupt the softirq ran. We took another interrupt | ||
| 867 | while running the softirq as we see with the capital 'H'. | ||
| 868 | |||
| 869 | |||
| 870 | wakeup | ||
| 871 | ------ | ||
| 872 | |||
| 873 | In Real-Time environment it is very important to know the wakeup | ||
| 874 | time it takes for the highest priority task that wakes up to the | ||
| 875 | time it executes. This is also known as "schedule latency". | ||
| 876 | I stress the point that this is about RT tasks. It is also important | ||
| 877 | to know the scheduling latency of non-RT tasks, but the average | ||
| 878 | schedule latency is better for non-RT tasks. Tools like | ||
| 879 | LatencyTop is more appropriate for such measurements. | ||
| 880 | |||
| 881 | Real-Time environments is interested in the worst case latency. | ||
| 882 | That is the longest latency it takes for something to happen, and | ||
| 883 | not the average. We can have a very fast scheduler that may only | ||
| 884 | have a large latency once in a while, but that would not work well | ||
| 885 | with Real-Time tasks. The wakeup tracer was designed to record | ||
| 886 | the worst case wakeups of RT tasks. Non-RT tasks are not recorded | ||
| 887 | because the tracer only records one worst case and tracing non-RT | ||
| 888 | tasks that are unpredictable will overwrite the worst case latency | ||
| 889 | of RT tasks. | ||
| 890 | |||
| 891 | Since this tracer only deals with RT tasks, we will run this slightly | ||
| 892 | different than we did with the previous tracers. Instead of performing | ||
| 893 | an 'ls' we will run 'sleep 1' under 'chrt' which changes the | ||
| 894 | priority of the task. | ||
| 895 | |||
| 896 | # echo wakeup > /debug/tracing/current_tracer | ||
| 897 | # echo 0 > /debug/tracing/tracing_max_latency | ||
| 898 | # echo 1 > /debug/tracing/tracing_enabled | ||
| 899 | # chrt -f 5 sleep 1 | ||
| 900 | # echo 0 > /debug/tracing/tracing_enabled | ||
| 901 | # cat /debug/tracing/latency_trace | ||
| 902 | # tracer: wakeup | ||
| 903 | # | ||
| 904 | wakeup latency trace v1.1.5 on 2.6.26-rc8 | ||
| 905 | -------------------------------------------------------------------- | ||
| 906 | latency: 4 us, #2/2, CPU#1 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) | ||
| 907 | ----------------- | ||
| 908 | | task: sleep-4901 (uid:0 nice:0 policy:1 rt_prio:5) | ||
| 909 | ----------------- | ||
| 910 | |||
| 911 | # _------=> CPU# | ||
| 912 | # / _-----=> irqs-off | ||
| 913 | # | / _----=> need-resched | ||
| 914 | # || / _---=> hardirq/softirq | ||
| 915 | # ||| / _--=> preempt-depth | ||
| 916 | # |||| / | ||
| 917 | # ||||| delay | ||
| 918 | # cmd pid ||||| time | caller | ||
| 919 | # \ / ||||| \ | / | ||
| 920 | <idle>-0 1d.h4 0us+: try_to_wake_up (wake_up_process) | ||
| 921 | <idle>-0 1d..4 4us : schedule (cpu_idle) | ||
| 922 | |||
| 923 | |||
| 924 | vim:ft=help | ||
| 925 | |||
| 926 | |||
| 927 | Running this on an idle system we see that it only took 4 microseconds | ||
| 928 | to perform the task switch. Note, since the trace marker in the | ||
| 929 | schedule is before the actual "switch" we stop the tracing when | ||
| 930 | the recorded task is about to schedule in. This may change if | ||
| 931 | we add a new marker at the end of the scheduler. | ||
| 932 | |||
| 933 | Notice that the recorded task is 'sleep' with the PID of 4901 and it | ||
| 934 | has an rt_prio of 5. This priority is user-space priority and not | ||
| 935 | the internal kernel priority. The policy is 1 for SCHED_FIFO and 2 | ||
| 936 | for SCHED_RR. | ||
| 937 | |||
| 938 | Doing the same with chrt -r 5 and ftrace_enabled set. | ||
| 939 | |||
| 940 | # tracer: wakeup | ||
| 941 | # | ||
| 942 | wakeup latency trace v1.1.5 on 2.6.26-rc8 | ||
| 943 | -------------------------------------------------------------------- | ||
| 944 | latency: 50 us, #60/60, CPU#1 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:2) | ||
| 945 | ----------------- | ||
| 946 | | task: sleep-4068 (uid:0 nice:0 policy:2 rt_prio:5) | ||
| 947 | ----------------- | ||
| 948 | |||
| 949 | # _------=> CPU# | ||
| 950 | # / _-----=> irqs-off | ||
| 951 | # | / _----=> need-resched | ||
| 952 | # || / _---=> hardirq/softirq | ||
| 953 | # ||| / _--=> preempt-depth | ||
| 954 | # |||| / | ||
| 955 | # ||||| delay | ||
| 956 | # cmd pid ||||| time | caller | ||
| 957 | # \ / ||||| \ | / | ||
| 958 | ksoftirq-7 1d.H3 0us : try_to_wake_up (wake_up_process) | ||
| 959 | ksoftirq-7 1d.H4 1us : sub_preempt_count (marker_probe_cb) | ||
| 960 | ksoftirq-7 1d.H3 2us : check_preempt_wakeup (try_to_wake_up) | ||
| 961 | ksoftirq-7 1d.H3 3us : update_curr (check_preempt_wakeup) | ||
| 962 | ksoftirq-7 1d.H3 4us : calc_delta_mine (update_curr) | ||
| 963 | ksoftirq-7 1d.H3 5us : __resched_task (check_preempt_wakeup) | ||
| 964 | ksoftirq-7 1d.H3 6us : task_wake_up_rt (try_to_wake_up) | ||
| 965 | ksoftirq-7 1d.H3 7us : _spin_unlock_irqrestore (try_to_wake_up) | ||
| 966 | [...] | ||
| 967 | ksoftirq-7 1d.H2 17us : irq_exit (smp_apic_timer_interrupt) | ||
| 968 | ksoftirq-7 1d.H2 18us : sub_preempt_count (irq_exit) | ||
| 969 | ksoftirq-7 1d.s3 19us : sub_preempt_count (irq_exit) | ||
| 970 | ksoftirq-7 1..s2 20us : rcu_process_callbacks (__do_softirq) | ||
| 971 | [...] | ||
| 972 | ksoftirq-7 1..s2 26us : __rcu_process_callbacks (rcu_process_callbacks) | ||
| 973 | ksoftirq-7 1d.s2 27us : _local_bh_enable (__do_softirq) | ||
| 974 | ksoftirq-7 1d.s2 28us : sub_preempt_count (_local_bh_enable) | ||
| 975 | ksoftirq-7 1.N.3 29us : sub_preempt_count (ksoftirqd) | ||
| 976 | ksoftirq-7 1.N.2 30us : _cond_resched (ksoftirqd) | ||
| 977 | ksoftirq-7 1.N.2 31us : __cond_resched (_cond_resched) | ||
| 978 | ksoftirq-7 1.N.2 32us : add_preempt_count (__cond_resched) | ||
| 979 | ksoftirq-7 1.N.2 33us : schedule (__cond_resched) | ||
| 980 | ksoftirq-7 1.N.2 33us : add_preempt_count (schedule) | ||
| 981 | ksoftirq-7 1.N.3 34us : hrtick_clear (schedule) | ||
| 982 | ksoftirq-7 1dN.3 35us : _spin_lock (schedule) | ||
| 983 | ksoftirq-7 1dN.3 36us : add_preempt_count (_spin_lock) | ||
| 984 | ksoftirq-7 1d..4 37us : put_prev_task_fair (schedule) | ||
| 985 | ksoftirq-7 1d..4 38us : update_curr (put_prev_task_fair) | ||
| 986 | [...] | ||
| 987 | ksoftirq-7 1d..5 47us : _spin_trylock (tracing_record_cmdline) | ||
| 988 | ksoftirq-7 1d..5 48us : add_preempt_count (_spin_trylock) | ||
| 989 | ksoftirq-7 1d..6 49us : _spin_unlock (tracing_record_cmdline) | ||
| 990 | ksoftirq-7 1d..6 49us : sub_preempt_count (_spin_unlock) | ||
| 991 | ksoftirq-7 1d..4 50us : schedule (__cond_resched) | ||
| 992 | |||
| 993 | The interrupt went off while running ksoftirqd. This task runs at | ||
| 994 | SCHED_OTHER. Why didn't we see the 'N' set early? This may be | ||
| 995 | a harmless bug with x86_32 and 4K stacks. The need_reched() function | ||
| 996 | that tests if we need to reschedule looks on the actual stack. | ||
| 997 | Where as the setting of the NEED_RESCHED bit happens on the | ||
| 998 | task's stack. But because we are in a hard interrupt, the test | ||
| 999 | is with the interrupts stack which has that to be false. We don't | ||
| 1000 | see the 'N' until we switch back to the task's stack. | ||
| 1001 | |||
| 1002 | ftrace | ||
| 1003 | ------ | ||
| 1004 | |||
| 1005 | ftrace is not only the name of the tracing infrastructure, but it | ||
| 1006 | is also a name of one of the tracers. The tracer is the function | ||
| 1007 | tracer. Enabling the function tracer can be done from the | ||
| 1008 | debug file system. Make sure the ftrace_enabled is set otherwise | ||
| 1009 | this tracer is a nop. | ||
| 1010 | |||
| 1011 | # sysctl kernel.ftrace_enabled=1 | ||
| 1012 | # echo ftrace > /debug/tracing/current_tracer | ||
| 1013 | # echo 1 > /debug/tracing/tracing_enabled | ||
| 1014 | # usleep 1 | ||
| 1015 | # echo 0 > /debug/tracing/tracing_enabled | ||
| 1016 | # cat /debug/tracing/trace | ||
| 1017 | # tracer: ftrace | ||
| 1018 | # | ||
| 1019 | # TASK-PID CPU# TIMESTAMP FUNCTION | ||
| 1020 | # | | | | | | ||
| 1021 | bash-4003 [00] 123.638713: finish_task_switch <-schedule | ||
| 1022 | bash-4003 [00] 123.638714: _spin_unlock_irq <-finish_task_switch | ||
| 1023 | bash-4003 [00] 123.638714: sub_preempt_count <-_spin_unlock_irq | ||
| 1024 | bash-4003 [00] 123.638715: hrtick_set <-schedule | ||
| 1025 | bash-4003 [00] 123.638715: _spin_lock_irqsave <-hrtick_set | ||
| 1026 | bash-4003 [00] 123.638716: add_preempt_count <-_spin_lock_irqsave | ||
| 1027 | bash-4003 [00] 123.638716: _spin_unlock_irqrestore <-hrtick_set | ||
| 1028 | bash-4003 [00] 123.638717: sub_preempt_count <-_spin_unlock_irqrestore | ||
| 1029 | bash-4003 [00] 123.638717: hrtick_clear <-hrtick_set | ||
| 1030 | bash-4003 [00] 123.638718: sub_preempt_count <-schedule | ||
| 1031 | bash-4003 [00] 123.638718: sub_preempt_count <-preempt_schedule | ||
| 1032 | bash-4003 [00] 123.638719: wait_for_completion <-__stop_machine_run | ||
| 1033 | bash-4003 [00] 123.638719: wait_for_common <-wait_for_completion | ||
| 1034 | bash-4003 [00] 123.638720: _spin_lock_irq <-wait_for_common | ||
| 1035 | bash-4003 [00] 123.638720: add_preempt_count <-_spin_lock_irq | ||
| 1036 | [...] | ||
| 1037 | |||
| 1038 | |||
| 1039 | Note: It is sometimes better to enable or disable tracing directly from | ||
| 1040 | a program, because the buffer may be overflowed by the echo commands | ||
| 1041 | before you get to the point you want to trace. It is also easier to | ||
| 1042 | stop the tracing at the point that you hit the part that you are | ||
| 1043 | interested in. Since the ftrace buffer is a ring buffer with the | ||
| 1044 | oldest data being overwritten, usually it is sufficient to start the | ||
| 1045 | tracer with an echo command but have you code stop it. Something | ||
| 1046 | like the following is usually appropriate for this. | ||
| 1047 | |||
| 1048 | int trace_fd; | ||
| 1049 | [...] | ||
| 1050 | int main(int argc, char *argv[]) { | ||
| 1051 | [...] | ||
| 1052 | trace_fd = open("/debug/tracing/tracing_enabled", O_WRONLY); | ||
| 1053 | [...] | ||
| 1054 | if (condition_hit()) { | ||
| 1055 | write(trace_fd, "0", 1); | ||
| 1056 | } | ||
| 1057 | [...] | ||
| 1058 | } | ||
| 1059 | |||
| 1060 | |||
| 1061 | dynamic ftrace | ||
| 1062 | -------------- | ||
| 1063 | |||
| 1064 | If CONFIG_DYNAMIC_FTRACE is set, then the system will run with | ||
| 1065 | virtually no overhead when function tracing is disabled. The way | ||
| 1066 | this works is the mcount function call (placed at the start of | ||
| 1067 | every kernel function, produced by the -pg switch in gcc), starts | ||
| 1068 | of pointing to a simple return. | ||
| 1069 | |||
| 1070 | When dynamic ftrace is initialized, it calls kstop_machine to make it | ||
| 1071 | act like a uniprocessor so that it can freely modify code without | ||
| 1072 | worrying about other processors executing that same code. At | ||
| 1073 | initialization, the mcount calls are change to call a "record_ip" | ||
| 1074 | function. After this, the first time a kernel function is called, | ||
| 1075 | it has the calling address saved in a hash table. | ||
| 1076 | |||
| 1077 | Later on the ftraced kernel thread is awoken and will again call | ||
| 1078 | kstop_machine if new functions have been recorded. The ftraced thread | ||
| 1079 | will change all calls to mcount to "nop". Just calling mcount | ||
| 1080 | and having mcount return has shown a 10% overhead. By converting | ||
| 1081 | it to a nop, there is no recordable overhead to the system. | ||
| 1082 | |||
| 1083 | One special side-effect to the recording of the functions being | ||
| 1084 | traced, is that we can now selectively choose which functions we | ||
| 1085 | want to trace and which ones we want the mcount calls to remain as | ||
| 1086 | nops. | ||
| 1087 | |||
| 1088 | Two files that contain to the enabling and disabling of recorded | ||
| 1089 | functions are: | ||
| 1090 | |||
| 1091 | set_ftrace_filter | ||
| 1092 | |||
| 1093 | and | ||
| 1094 | |||
| 1095 | set_ftrace_notrace | ||
| 1096 | |||
| 1097 | A list of available functions that you can add to this files is listed | ||
| 1098 | in: | ||
| 1099 | |||
| 1100 | available_filter_functions | ||
| 1101 | |||
| 1102 | # cat /debug/tracing/available_filter_functions | ||
| 1103 | put_prev_task_idle | ||
| 1104 | kmem_cache_create | ||
| 1105 | pick_next_task_rt | ||
| 1106 | get_online_cpus | ||
| 1107 | pick_next_task_fair | ||
| 1108 | mutex_lock | ||
| 1109 | [...] | ||
| 1110 | |||
| 1111 | If I'm only interested in sys_nanosleep and hrtimer_interrupt: | ||
| 1112 | |||
| 1113 | # echo sys_nanosleep hrtimer_interrupt \ | ||
| 1114 | > /debug/tracing/set_ftrace_filter | ||
| 1115 | # echo ftrace > /debug/tracing/current_tracer | ||
| 1116 | # echo 1 > /debug/tracing/tracing_enabled | ||
| 1117 | # usleep 1 | ||
| 1118 | # echo 0 > /debug/tracing/tracing_enabled | ||
| 1119 | # cat /debug/tracing/trace | ||
| 1120 | # tracer: ftrace | ||
| 1121 | # | ||
| 1122 | # TASK-PID CPU# TIMESTAMP FUNCTION | ||
| 1123 | # | | | | | | ||
| 1124 | usleep-4134 [00] 1317.070017: hrtimer_interrupt <-smp_apic_timer_interrupt | ||
| 1125 | usleep-4134 [00] 1317.070111: sys_nanosleep <-syscall_call | ||
| 1126 | <idle>-0 [00] 1317.070115: hrtimer_interrupt <-smp_apic_timer_interrupt | ||
| 1127 | |||
| 1128 | To see what functions are being traced, you can cat the file: | ||
| 1129 | |||
| 1130 | # cat /debug/tracing/set_ftrace_filter | ||
| 1131 | hrtimer_interrupt | ||
| 1132 | sys_nanosleep | ||
| 1133 | |||
| 1134 | |||
| 1135 | Perhaps this isn't enough. The filters also allow simple wild cards. | ||
| 1136 | Only the following is currently available | ||
| 1137 | |||
| 1138 | <match>* - will match functions that begins with <match> | ||
| 1139 | *<match> - will match functions that end with <match> | ||
| 1140 | *<match>* - will match functions that have <match> in it | ||
| 1141 | |||
| 1142 | Thats all the wild cards that are allowed. | ||
| 1143 | |||
| 1144 | <match>*<match> will not work. | ||
| 1145 | |||
| 1146 | # echo hrtimer_* > /debug/tracing/set_ftrace_filter | ||
| 1147 | |||
| 1148 | Produces: | ||
| 1149 | |||
| 1150 | # tracer: ftrace | ||
| 1151 | # | ||
| 1152 | # TASK-PID CPU# TIMESTAMP FUNCTION | ||
| 1153 | # | | | | | | ||
| 1154 | bash-4003 [00] 1480.611794: hrtimer_init <-copy_process | ||
| 1155 | bash-4003 [00] 1480.611941: hrtimer_start <-hrtick_set | ||
| 1156 | bash-4003 [00] 1480.611956: hrtimer_cancel <-hrtick_clear | ||
| 1157 | bash-4003 [00] 1480.611956: hrtimer_try_to_cancel <-hrtimer_cancel | ||
| 1158 | <idle>-0 [00] 1480.612019: hrtimer_get_next_event <-get_next_timer_interrupt | ||
| 1159 | <idle>-0 [00] 1480.612025: hrtimer_get_next_event <-get_next_timer_interrupt | ||
| 1160 | <idle>-0 [00] 1480.612032: hrtimer_get_next_event <-get_next_timer_interrupt | ||
| 1161 | <idle>-0 [00] 1480.612037: hrtimer_get_next_event <-get_next_timer_interrupt | ||
| 1162 | <idle>-0 [00] 1480.612382: hrtimer_get_next_event <-get_next_timer_interrupt | ||
| 1163 | |||
| 1164 | |||
| 1165 | Notice that we lost the sys_nanosleep. | ||
| 1166 | |||
| 1167 | # cat /debug/tracing/set_ftrace_filter | ||
| 1168 | hrtimer_run_queues | ||
| 1169 | hrtimer_run_pending | ||
| 1170 | hrtimer_init | ||
| 1171 | hrtimer_cancel | ||
| 1172 | hrtimer_try_to_cancel | ||
| 1173 | hrtimer_forward | ||
| 1174 | hrtimer_start | ||
| 1175 | hrtimer_reprogram | ||
| 1176 | hrtimer_force_reprogram | ||
| 1177 | hrtimer_get_next_event | ||
| 1178 | hrtimer_interrupt | ||
| 1179 | hrtimer_nanosleep | ||
| 1180 | hrtimer_wakeup | ||
| 1181 | hrtimer_get_remaining | ||
| 1182 | hrtimer_get_res | ||
| 1183 | hrtimer_init_sleeper | ||
| 1184 | |||
| 1185 | |||
| 1186 | This is because the '>' and '>>' act just like they do in bash. | ||
| 1187 | To rewrite the filters, use '>' | ||
| 1188 | To append to the filters, use '>>' | ||
| 1189 | |||
| 1190 | To clear out a filter so that all functions will be recorded again. | ||
| 1191 | |||
| 1192 | # echo > /debug/tracing/set_ftrace_filter | ||
| 1193 | # cat /debug/tracing/set_ftrace_filter | ||
| 1194 | # | ||
| 1195 | |||
| 1196 | Again, now we want to append. | ||
| 1197 | |||
| 1198 | # echo sys_nanosleep > /debug/tracing/set_ftrace_filter | ||
| 1199 | # cat /debug/tracing/set_ftrace_filter | ||
| 1200 | sys_nanosleep | ||
| 1201 | # echo hrtimer_* >> /debug/tracing/set_ftrace_filter | ||
| 1202 | # cat /debug/tracing/set_ftrace_filter | ||
| 1203 | hrtimer_run_queues | ||
| 1204 | hrtimer_run_pending | ||
| 1205 | hrtimer_init | ||
| 1206 | hrtimer_cancel | ||
| 1207 | hrtimer_try_to_cancel | ||
| 1208 | hrtimer_forward | ||
| 1209 | hrtimer_start | ||
| 1210 | hrtimer_reprogram | ||
| 1211 | hrtimer_force_reprogram | ||
| 1212 | hrtimer_get_next_event | ||
| 1213 | hrtimer_interrupt | ||
| 1214 | sys_nanosleep | ||
| 1215 | hrtimer_nanosleep | ||
| 1216 | hrtimer_wakeup | ||
| 1217 | hrtimer_get_remaining | ||
| 1218 | hrtimer_get_res | ||
| 1219 | hrtimer_init_sleeper | ||
| 1220 | |||
| 1221 | |||
| 1222 | The set_ftrace_notrace prevents those functions from being traced. | ||
| 1223 | |||
| 1224 | # echo '*preempt*' '*lock*' > /debug/tracing/set_ftrace_notrace | ||
| 1225 | |||
| 1226 | Produces: | ||
| 1227 | |||
| 1228 | # tracer: ftrace | ||
| 1229 | # | ||
| 1230 | # TASK-PID CPU# TIMESTAMP FUNCTION | ||
| 1231 | # | | | | | | ||
| 1232 | bash-4043 [01] 115.281644: finish_task_switch <-schedule | ||
| 1233 | bash-4043 [01] 115.281645: hrtick_set <-schedule | ||
| 1234 | bash-4043 [01] 115.281645: hrtick_clear <-hrtick_set | ||
| 1235 | bash-4043 [01] 115.281646: wait_for_completion <-__stop_machine_run | ||
| 1236 | bash-4043 [01] 115.281647: wait_for_common <-wait_for_completion | ||
| 1237 | bash-4043 [01] 115.281647: kthread_stop <-stop_machine_run | ||
| 1238 | bash-4043 [01] 115.281648: init_waitqueue_head <-kthread_stop | ||
| 1239 | bash-4043 [01] 115.281648: wake_up_process <-kthread_stop | ||
| 1240 | bash-4043 [01] 115.281649: try_to_wake_up <-wake_up_process | ||
| 1241 | |||
| 1242 | We can see that there's no more lock or preempt tracing. | ||
| 1243 | |||
| 1244 | ftraced | ||
| 1245 | ------- | ||
| 1246 | |||
| 1247 | As mentioned above, when dynamic ftrace is configured in, a kernel | ||
| 1248 | thread wakes up once a second and checks to see if there are mcount | ||
| 1249 | calls that need to be converted into nops. If there is not, then | ||
| 1250 | it simply goes back to sleep. But if there is, it will call | ||
| 1251 | kstop_machine to convert the calls to nops. | ||
| 1252 | |||
| 1253 | There may be a case that you do not want this added latency. | ||
| 1254 | Perhaps you are doing some audio recording and this activity might | ||
| 1255 | cause skips in the playback. There is an interface to disable | ||
| 1256 | and enable the ftraced kernel thread. | ||
| 1257 | |||
| 1258 | # echo 0 > /debug/tracing/ftraced_enabled | ||
| 1259 | |||
| 1260 | This will disable the calling of the kstop_machine to update the | ||
| 1261 | mcount calls to nops. Remember that there's a large overhead | ||
| 1262 | to calling mcount. Without this kernel thread, that overhead will | ||
| 1263 | exist. | ||
| 1264 | |||
| 1265 | Any write to the ftraced_enabled file will cause the kstop_machine | ||
| 1266 | to run if there are recorded calls to mcount. This means that a | ||
| 1267 | user can manually perform the updates when they want to by simply | ||
| 1268 | echoing a '0' into the ftraced_enabled file. | ||
| 1269 | |||
| 1270 | The updates are also done at the beginning of enabling a tracer | ||
| 1271 | that uses ftrace function recording. | ||
| 1272 | |||
| 1273 | |||
| 1274 | trace_pipe | ||
| 1275 | ---------- | ||
| 1276 | |||
| 1277 | The trace_pipe outputs the same as trace, but the effect on the | ||
| 1278 | tracing is different. Every read from trace_pipe is consumed. | ||
| 1279 | This means that subsequent reads will be different. The trace | ||
| 1280 | is live. | ||
| 1281 | |||
| 1282 | # echo ftrace > /debug/tracing/current_tracer | ||
| 1283 | # cat /debug/tracing/trace_pipe > /tmp/trace.out & | ||
| 1284 | [1] 4153 | ||
| 1285 | # echo 1 > /debug/tracing/tracing_enabled | ||
| 1286 | # usleep 1 | ||
| 1287 | # echo 0 > /debug/tracing/tracing_enabled | ||
| 1288 | # cat /debug/tracing/trace | ||
| 1289 | # tracer: ftrace | ||
| 1290 | # | ||
| 1291 | # TASK-PID CPU# TIMESTAMP FUNCTION | ||
| 1292 | # | | | | | | ||
| 1293 | |||
| 1294 | # | ||
| 1295 | # cat /tmp/trace.out | ||
| 1296 | bash-4043 [00] 41.267106: finish_task_switch <-schedule | ||
| 1297 | bash-4043 [00] 41.267106: hrtick_set <-schedule | ||
| 1298 | bash-4043 [00] 41.267107: hrtick_clear <-hrtick_set | ||
| 1299 | bash-4043 [00] 41.267108: wait_for_completion <-__stop_machine_run | ||
| 1300 | bash-4043 [00] 41.267108: wait_for_common <-wait_for_completion | ||
| 1301 | bash-4043 [00] 41.267109: kthread_stop <-stop_machine_run | ||
| 1302 | bash-4043 [00] 41.267109: init_waitqueue_head <-kthread_stop | ||
| 1303 | bash-4043 [00] 41.267110: wake_up_process <-kthread_stop | ||
| 1304 | bash-4043 [00] 41.267110: try_to_wake_up <-wake_up_process | ||
| 1305 | bash-4043 [00] 41.267111: select_task_rq_rt <-try_to_wake_up | ||
| 1306 | |||
| 1307 | |||
| 1308 | Note, reading the trace_pipe will block until more input is added. | ||
| 1309 | By changing the tracer, trace_pipe will issue an EOF. We needed | ||
| 1310 | to set the ftrace tracer _before_ cating the trace_pipe file. | ||
| 1311 | |||
| 1312 | |||
| 1313 | trace entries | ||
| 1314 | ------------- | ||
| 1315 | |||
| 1316 | Having too much or not enough data can be troublesome in diagnosing | ||
| 1317 | some issue in the kernel. The file trace_entries is used to modify | ||
| 1318 | the size of the internal trace buffers. The numbers listed | ||
| 1319 | is the number of entries that can be recorded per CPU. To know | ||
| 1320 | the full size, multiply the number of possible CPUS with the | ||
| 1321 | number of entries. | ||
| 1322 | |||
| 1323 | # cat /debug/tracing/trace_entries | ||
| 1324 | 65620 | ||
| 1325 | |||
| 1326 | Note, to modify this you must have tracing fulling disabled. To do that, | ||
| 1327 | echo "none" into the current_tracer. | ||
| 1328 | |||
| 1329 | # echo none > /debug/tracing/current_tracer | ||
| 1330 | # echo 100000 > /debug/tracing/trace_entries | ||
| 1331 | # cat /debug/tracing/trace_entries | ||
| 1332 | 100045 | ||
| 1333 | |||
| 1334 | |||
| 1335 | Notice that we echoed in 100,000 but the size is 100,045. The entries | ||
| 1336 | are held by individual pages. It allocates the number of pages it takes | ||
| 1337 | to fulfill the request. If more entries may fit on the last page | ||
| 1338 | it will add them. | ||
| 1339 | |||
| 1340 | # echo 1 > /debug/tracing/trace_entries | ||
| 1341 | # cat /debug/tracing/trace_entries | ||
| 1342 | 85 | ||
| 1343 | |||
| 1344 | This shows us that 85 entries can fit on a single page. | ||
| 1345 | |||
| 1346 | The number of pages that will be allocated is a percentage of available | ||
| 1347 | memory. Allocating too much will produces an error. | ||
| 1348 | |||
| 1349 | # echo 1000000000000 > /debug/tracing/trace_entries | ||
| 1350 | -bash: echo: write error: Cannot allocate memory | ||
| 1351 | # cat /debug/tracing/trace_entries | ||
| 1352 | 85 | ||
| 1353 | |||
diff --git a/Documentation/i2c/writing-clients b/Documentation/i2c/writing-clients index ee75cbace28d..d4cd4126d1ad 100644 --- a/Documentation/i2c/writing-clients +++ b/Documentation/i2c/writing-clients | |||
| @@ -25,12 +25,23 @@ routines, and should be zero-initialized except for fields with data you | |||
| 25 | provide. A client structure holds device-specific information like the | 25 | provide. A client structure holds device-specific information like the |
| 26 | driver model device node, and its I2C address. | 26 | driver model device node, and its I2C address. |
| 27 | 27 | ||
| 28 | /* iff driver uses driver model ("new style") binding model: */ | ||
| 29 | |||
| 30 | static struct i2c_device_id foo_idtable[] = { | ||
| 31 | { "foo", my_id_for_foo }, | ||
| 32 | { "bar", my_id_for_bar }, | ||
| 33 | { } | ||
| 34 | }; | ||
| 35 | |||
| 36 | MODULE_DEVICE_TABLE(i2c, foo_idtable); | ||
| 37 | |||
| 28 | static struct i2c_driver foo_driver = { | 38 | static struct i2c_driver foo_driver = { |
| 29 | .driver = { | 39 | .driver = { |
| 30 | .name = "foo", | 40 | .name = "foo", |
| 31 | }, | 41 | }, |
| 32 | 42 | ||
| 33 | /* iff driver uses driver model ("new style") binding model: */ | 43 | /* iff driver uses driver model ("new style") binding model: */ |
| 44 | .id_table = foo_ids, | ||
| 34 | .probe = foo_probe, | 45 | .probe = foo_probe, |
| 35 | .remove = foo_remove, | 46 | .remove = foo_remove, |
| 36 | 47 | ||
| @@ -173,10 +184,9 @@ handle may be used during foo_probe(). If foo_probe() reports success | |||
| 173 | (zero not a negative status code) it may save the handle and use it until | 184 | (zero not a negative status code) it may save the handle and use it until |
| 174 | foo_remove() returns. That binding model is used by most Linux drivers. | 185 | foo_remove() returns. That binding model is used by most Linux drivers. |
| 175 | 186 | ||
| 176 | Drivers match devices when i2c_client.driver_name and the driver name are | 187 | The probe function is called when an entry in the id_table name field |
| 177 | the same; this approach is used in several other busses that don't have | 188 | matches the device's name. It is passed the entry that was matched so |
| 178 | device typing support in the hardware. The driver and module name should | 189 | the driver knows which one in the table matched. |
| 179 | match, so hotplug/coldplug mechanisms will modprobe the driver. | ||
| 180 | 190 | ||
| 181 | 191 | ||
| 182 | Device Creation (Standard driver model) | 192 | Device Creation (Standard driver model) |
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index e07c432c731f..b52f47d588b4 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -295,7 +295,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 295 | when initialising the APIC and IO-APIC components. | 295 | when initialising the APIC and IO-APIC components. |
| 296 | 296 | ||
| 297 | apm= [APM] Advanced Power Management | 297 | apm= [APM] Advanced Power Management |
| 298 | See header of arch/i386/kernel/apm.c. | 298 | See header of arch/x86/kernel/apm_32.c. |
| 299 | 299 | ||
| 300 | arcrimi= [HW,NET] ARCnet - "RIM I" (entirely mem-mapped) cards | 300 | arcrimi= [HW,NET] ARCnet - "RIM I" (entirely mem-mapped) cards |
| 301 | Format: <io>,<irq>,<nodeID> | 301 | Format: <io>,<irq>,<nodeID> |
| @@ -638,7 +638,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 638 | 638 | ||
| 639 | elanfreq= [X86-32] | 639 | elanfreq= [X86-32] |
| 640 | See comment before function elanfreq_setup() in | 640 | See comment before function elanfreq_setup() in |
| 641 | arch/i386/kernel/cpu/cpufreq/elanfreq.c. | 641 | arch/x86/kernel/cpu/cpufreq/elanfreq.c. |
| 642 | 642 | ||
| 643 | elevator= [IOSCHED] | 643 | elevator= [IOSCHED] |
| 644 | Format: {"anticipatory" | "cfq" | "deadline" | "noop"} | 644 | Format: {"anticipatory" | "cfq" | "deadline" | "noop"} |
| @@ -1679,6 +1679,10 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 1679 | Format: <reboot_mode>[,<reboot_mode2>[,...]] | 1679 | Format: <reboot_mode>[,<reboot_mode2>[,...]] |
| 1680 | See arch/*/kernel/reboot.c or arch/*/kernel/process.c | 1680 | See arch/*/kernel/reboot.c or arch/*/kernel/process.c |
| 1681 | 1681 | ||
| 1682 | relax_domain_level= | ||
| 1683 | [KNL, SMP] Set scheduler's default relax_domain_level. | ||
| 1684 | See Documentation/cpusets.txt. | ||
| 1685 | |||
| 1682 | reserve= [KNL,BUGS] Force the kernel to ignore some iomem area | 1686 | reserve= [KNL,BUGS] Force the kernel to ignore some iomem area |
| 1683 | 1687 | ||
| 1684 | reservetop= [X86-32] | 1688 | reservetop= [X86-32] |
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index 17a6e46fbd43..946b66e1b652 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt | |||
| @@ -81,23 +81,23 @@ inet_peer_minttl - INTEGER | |||
| 81 | Minimum time-to-live of entries. Should be enough to cover fragment | 81 | Minimum time-to-live of entries. Should be enough to cover fragment |
| 82 | time-to-live on the reassembling side. This minimum time-to-live is | 82 | time-to-live on the reassembling side. This minimum time-to-live is |
| 83 | guaranteed if the pool size is less than inet_peer_threshold. | 83 | guaranteed if the pool size is less than inet_peer_threshold. |
| 84 | Measured in jiffies(1). | 84 | Measured in seconds. |
| 85 | 85 | ||
| 86 | inet_peer_maxttl - INTEGER | 86 | inet_peer_maxttl - INTEGER |
| 87 | Maximum time-to-live of entries. Unused entries will expire after | 87 | Maximum time-to-live of entries. Unused entries will expire after |
| 88 | this period of time if there is no memory pressure on the pool (i.e. | 88 | this period of time if there is no memory pressure on the pool (i.e. |
| 89 | when the number of entries in the pool is very small). | 89 | when the number of entries in the pool is very small). |
| 90 | Measured in jiffies(1). | 90 | Measured in seconds. |
| 91 | 91 | ||
| 92 | inet_peer_gc_mintime - INTEGER | 92 | inet_peer_gc_mintime - INTEGER |
| 93 | Minimum interval between garbage collection passes. This interval is | 93 | Minimum interval between garbage collection passes. This interval is |
| 94 | in effect under high memory pressure on the pool. | 94 | in effect under high memory pressure on the pool. |
| 95 | Measured in jiffies(1). | 95 | Measured in seconds. |
| 96 | 96 | ||
| 97 | inet_peer_gc_maxtime - INTEGER | 97 | inet_peer_gc_maxtime - INTEGER |
| 98 | Minimum interval between garbage collection passes. This interval is | 98 | Minimum interval between garbage collection passes. This interval is |
| 99 | in effect under low (or absent) memory pressure on the pool. | 99 | in effect under low (or absent) memory pressure on the pool. |
| 100 | Measured in jiffies(1). | 100 | Measured in seconds. |
| 101 | 101 | ||
| 102 | TCP variables: | 102 | TCP variables: |
| 103 | 103 | ||
| @@ -148,9 +148,9 @@ tcp_available_congestion_control - STRING | |||
| 148 | but not loaded. | 148 | but not loaded. |
| 149 | 149 | ||
| 150 | tcp_base_mss - INTEGER | 150 | tcp_base_mss - INTEGER |
| 151 | The initial value of search_low to be used by Packetization Layer | 151 | The initial value of search_low to be used by the packetization layer |
| 152 | Path MTU Discovery (MTU probing). If MTU probing is enabled, | 152 | Path MTU discovery (MTU probing). If MTU probing is enabled, |
| 153 | this is the inital MSS used by the connection. | 153 | this is the initial MSS used by the connection. |
| 154 | 154 | ||
| 155 | tcp_congestion_control - STRING | 155 | tcp_congestion_control - STRING |
| 156 | Set the congestion control algorithm to be used for new | 156 | Set the congestion control algorithm to be used for new |
| @@ -185,10 +185,9 @@ tcp_frto - INTEGER | |||
| 185 | timeouts. It is particularly beneficial in wireless environments | 185 | timeouts. It is particularly beneficial in wireless environments |
| 186 | where packet loss is typically due to random radio interference | 186 | where packet loss is typically due to random radio interference |
| 187 | rather than intermediate router congestion. F-RTO is sender-side | 187 | rather than intermediate router congestion. F-RTO is sender-side |
| 188 | only modification. Therefore it does not require any support from | 188 | only modification. Therefore it does not require any support from |
| 189 | the peer, but in a typical case, however, where wireless link is | 189 | the peer. |
| 190 | the local access link and most of the data flows downlink, the | 190 | |
| 191 | faraway servers should have F-RTO enabled to take advantage of it. | ||
| 192 | If set to 1, basic version is enabled. 2 enables SACK enhanced | 191 | If set to 1, basic version is enabled. 2 enables SACK enhanced |
| 193 | F-RTO if flow uses SACK. The basic version can be used also when | 192 | F-RTO if flow uses SACK. The basic version can be used also when |
| 194 | SACK is in use though scenario(s) with it exists where F-RTO | 193 | SACK is in use though scenario(s) with it exists where F-RTO |
| @@ -276,7 +275,7 @@ tcp_mem - vector of 3 INTEGERs: min, pressure, max | |||
| 276 | memory. | 275 | memory. |
| 277 | 276 | ||
| 278 | tcp_moderate_rcvbuf - BOOLEAN | 277 | tcp_moderate_rcvbuf - BOOLEAN |
| 279 | If set, TCP performs receive buffer autotuning, attempting to | 278 | If set, TCP performs receive buffer auto-tuning, attempting to |
| 280 | automatically size the buffer (no greater than tcp_rmem[2]) to | 279 | automatically size the buffer (no greater than tcp_rmem[2]) to |
| 281 | match the size required by the path for full throughput. Enabled by | 280 | match the size required by the path for full throughput. Enabled by |
| 282 | default. | 281 | default. |
| @@ -336,7 +335,7 @@ tcp_rmem - vector of 3 INTEGERs: min, default, max | |||
| 336 | pressure. | 335 | pressure. |
| 337 | Default: 8K | 336 | Default: 8K |
| 338 | 337 | ||
| 339 | default: default size of receive buffer used by TCP sockets. | 338 | default: initial size of receive buffer used by TCP sockets. |
| 340 | This value overrides net.core.rmem_default used by other protocols. | 339 | This value overrides net.core.rmem_default used by other protocols. |
| 341 | Default: 87380 bytes. This value results in window of 65535 with | 340 | Default: 87380 bytes. This value results in window of 65535 with |
| 342 | default setting of tcp_adv_win_scale and tcp_app_win:0 and a bit | 341 | default setting of tcp_adv_win_scale and tcp_app_win:0 and a bit |
| @@ -344,8 +343,10 @@ tcp_rmem - vector of 3 INTEGERs: min, default, max | |||
| 344 | 343 | ||
| 345 | max: maximal size of receive buffer allowed for automatically | 344 | max: maximal size of receive buffer allowed for automatically |
| 346 | selected receiver buffers for TCP socket. This value does not override | 345 | selected receiver buffers for TCP socket. This value does not override |
| 347 | net.core.rmem_max, "static" selection via SO_RCVBUF does not use this. | 346 | net.core.rmem_max. Calling setsockopt() with SO_RCVBUF disables |
| 348 | Default: 87380*2 bytes. | 347 | automatic tuning of that socket's receive buffer size, in which |
| 348 | case this value is ignored. | ||
| 349 | Default: between 87380B and 4MB, depending on RAM size. | ||
| 349 | 350 | ||
| 350 | tcp_sack - BOOLEAN | 351 | tcp_sack - BOOLEAN |
| 351 | Enable select acknowledgments (SACKS). | 352 | Enable select acknowledgments (SACKS). |
| @@ -358,7 +359,7 @@ tcp_slow_start_after_idle - BOOLEAN | |||
| 358 | Default: 1 | 359 | Default: 1 |
| 359 | 360 | ||
| 360 | tcp_stdurg - BOOLEAN | 361 | tcp_stdurg - BOOLEAN |
| 361 | Use the Host requirements interpretation of the TCP urg pointer field. | 362 | Use the Host requirements interpretation of the TCP urgent pointer field. |
| 362 | Most hosts use the older BSD interpretation, so if you turn this on | 363 | Most hosts use the older BSD interpretation, so if you turn this on |
| 363 | Linux might not communicate correctly with them. | 364 | Linux might not communicate correctly with them. |
| 364 | Default: FALSE | 365 | Default: FALSE |
| @@ -371,12 +372,12 @@ tcp_synack_retries - INTEGER | |||
| 371 | tcp_syncookies - BOOLEAN | 372 | tcp_syncookies - BOOLEAN |
| 372 | Only valid when the kernel was compiled with CONFIG_SYNCOOKIES | 373 | Only valid when the kernel was compiled with CONFIG_SYNCOOKIES |
| 373 | Send out syncookies when the syn backlog queue of a socket | 374 | Send out syncookies when the syn backlog queue of a socket |
| 374 | overflows. This is to prevent against the common 'syn flood attack' | 375 | overflows. This is to prevent against the common 'SYN flood attack' |
| 375 | Default: FALSE | 376 | Default: FALSE |
| 376 | 377 | ||
| 377 | Note, that syncookies is fallback facility. | 378 | Note, that syncookies is fallback facility. |
| 378 | It MUST NOT be used to help highly loaded servers to stand | 379 | It MUST NOT be used to help highly loaded servers to stand |
| 379 | against legal connection rate. If you see synflood warnings | 380 | against legal connection rate. If you see SYN flood warnings |
| 380 | in your logs, but investigation shows that they occur | 381 | in your logs, but investigation shows that they occur |
| 381 | because of overload with legal connections, you should tune | 382 | because of overload with legal connections, you should tune |
| 382 | another parameters until this warning disappear. | 383 | another parameters until this warning disappear. |
| @@ -386,7 +387,7 @@ tcp_syncookies - BOOLEAN | |||
| 386 | to use TCP extensions, can result in serious degradation | 387 | to use TCP extensions, can result in serious degradation |
| 387 | of some services (f.e. SMTP relaying), visible not by you, | 388 | of some services (f.e. SMTP relaying), visible not by you, |
| 388 | but your clients and relays, contacting you. While you see | 389 | but your clients and relays, contacting you. While you see |
| 389 | synflood warnings in logs not being really flooded, your server | 390 | SYN flood warnings in logs not being really flooded, your server |
| 390 | is seriously misconfigured. | 391 | is seriously misconfigured. |
| 391 | 392 | ||
| 392 | tcp_syn_retries - INTEGER | 393 | tcp_syn_retries - INTEGER |
| @@ -419,19 +420,21 @@ tcp_window_scaling - BOOLEAN | |||
| 419 | Enable window scaling as defined in RFC1323. | 420 | Enable window scaling as defined in RFC1323. |
| 420 | 421 | ||
| 421 | tcp_wmem - vector of 3 INTEGERs: min, default, max | 422 | tcp_wmem - vector of 3 INTEGERs: min, default, max |
| 422 | min: Amount of memory reserved for send buffers for TCP socket. | 423 | min: Amount of memory reserved for send buffers for TCP sockets. |
| 423 | Each TCP socket has rights to use it due to fact of its birth. | 424 | Each TCP socket has rights to use it due to fact of its birth. |
| 424 | Default: 4K | 425 | Default: 4K |
| 425 | 426 | ||
| 426 | default: Amount of memory allowed for send buffers for TCP socket | 427 | default: initial size of send buffer used by TCP sockets. This |
| 427 | by default. This value overrides net.core.wmem_default used | 428 | value overrides net.core.wmem_default used by other protocols. |
| 428 | by other protocols, it is usually lower than net.core.wmem_default. | 429 | It is usually lower than net.core.wmem_default. |
| 429 | Default: 16K | 430 | Default: 16K |
| 430 | 431 | ||
| 431 | max: Maximal amount of memory allowed for automatically selected | 432 | max: Maximal amount of memory allowed for automatically tuned |
| 432 | send buffers for TCP socket. This value does not override | 433 | send buffers for TCP sockets. This value does not override |
| 433 | net.core.wmem_max, "static" selection via SO_SNDBUF does not use this. | 434 | net.core.wmem_max. Calling setsockopt() with SO_SNDBUF disables |
| 434 | Default: 128K | 435 | automatic tuning of that socket's send buffer size, in which case |
| 436 | this value is ignored. | ||
| 437 | Default: between 64K and 4MB, depending on RAM size. | ||
| 435 | 438 | ||
| 436 | tcp_workaround_signed_windows - BOOLEAN | 439 | tcp_workaround_signed_windows - BOOLEAN |
| 437 | If set, assume no receipt of a window scaling option means the | 440 | If set, assume no receipt of a window scaling option means the |
| @@ -794,10 +797,6 @@ tag - INTEGER | |||
| 794 | Allows you to write a number, which can be used as required. | 797 | Allows you to write a number, which can be used as required. |
| 795 | Default value is 0. | 798 | Default value is 0. |
| 796 | 799 | ||
| 797 | (1) Jiffie: internal timeunit for the kernel. On the i386 1/100s, on the | ||
| 798 | Alpha 1/1024s. See the HZ define in /usr/include/asm/param.h for the exact | ||
| 799 | value on your system. | ||
| 800 | |||
| 801 | Alexey Kuznetsov. | 800 | Alexey Kuznetsov. |
| 802 | kuznet@ms2.inr.ac.ru | 801 | kuznet@ms2.inr.ac.ru |
| 803 | 802 | ||
| @@ -1064,24 +1063,193 @@ bridge-nf-filter-pppoe-tagged - BOOLEAN | |||
| 1064 | Default: 1 | 1063 | Default: 1 |
| 1065 | 1064 | ||
| 1066 | 1065 | ||
| 1067 | UNDOCUMENTED: | 1066 | proc/sys/net/sctp/* Variables: |
| 1067 | |||
| 1068 | addip_enable - BOOLEAN | ||
| 1069 | Enable or disable extension of Dynamic Address Reconfiguration | ||
| 1070 | (ADD-IP) functionality specified in RFC5061. This extension provides | ||
| 1071 | the ability to dynamically add and remove new addresses for the SCTP | ||
| 1072 | associations. | ||
| 1073 | |||
| 1074 | 1: Enable extension. | ||
| 1075 | |||
| 1076 | 0: Disable extension. | ||
| 1077 | |||
| 1078 | Default: 0 | ||
| 1079 | |||
| 1080 | addip_noauth_enable - BOOLEAN | ||
| 1081 | Dynamic Address Reconfiguration (ADD-IP) requires the use of | ||
| 1082 | authentication to protect the operations of adding or removing new | ||
| 1083 | addresses. This requirement is mandated so that unauthorized hosts | ||
| 1084 | would not be able to hijack associations. However, older | ||
| 1085 | implementations may not have implemented this requirement while | ||
| 1086 | allowing the ADD-IP extension. For reasons of interoperability, | ||
| 1087 | we provide this variable to control the enforcement of the | ||
| 1088 | authentication requirement. | ||
| 1089 | |||
| 1090 | 1: Allow ADD-IP extension to be used without authentication. This | ||
| 1091 | should only be set in a closed environment for interoperability | ||
| 1092 | with older implementations. | ||
| 1093 | |||
| 1094 | 0: Enforce the authentication requirement | ||
| 1095 | |||
| 1096 | Default: 0 | ||
| 1097 | |||
| 1098 | auth_enable - BOOLEAN | ||
| 1099 | Enable or disable Authenticated Chunks extension. This extension | ||
| 1100 | provides the ability to send and receive authenticated chunks and is | ||
| 1101 | required for secure operation of Dynamic Address Reconfiguration | ||
| 1102 | (ADD-IP) extension. | ||
| 1103 | |||
| 1104 | 1: Enable this extension. | ||
| 1105 | 0: Disable this extension. | ||
| 1106 | |||
| 1107 | Default: 0 | ||
| 1108 | |||
| 1109 | prsctp_enable - BOOLEAN | ||
| 1110 | Enable or disable the Partial Reliability extension (RFC3758) which | ||
| 1111 | is used to notify peers that a given DATA should no longer be expected. | ||
| 1112 | |||
| 1113 | 1: Enable extension | ||
| 1114 | 0: Disable | ||
| 1115 | |||
| 1116 | Default: 1 | ||
| 1117 | |||
| 1118 | max_burst - INTEGER | ||
| 1119 | The limit of the number of new packets that can be initially sent. It | ||
| 1120 | controls how bursty the generated traffic can be. | ||
| 1121 | |||
| 1122 | Default: 4 | ||
| 1123 | |||
| 1124 | association_max_retrans - INTEGER | ||
| 1125 | Set the maximum number for retransmissions that an association can | ||
| 1126 | attempt deciding that the remote end is unreachable. If this value | ||
| 1127 | is exceeded, the association is terminated. | ||
| 1128 | |||
| 1129 | Default: 10 | ||
| 1130 | |||
| 1131 | max_init_retransmits - INTEGER | ||
| 1132 | The maximum number of retransmissions of INIT and COOKIE-ECHO chunks | ||
| 1133 | that an association will attempt before declaring the destination | ||
| 1134 | unreachable and terminating. | ||
| 1135 | |||
| 1136 | Default: 8 | ||
| 1137 | |||
| 1138 | path_max_retrans - INTEGER | ||
| 1139 | The maximum number of retransmissions that will be attempted on a given | ||
| 1140 | path. Once this threshold is exceeded, the path is considered | ||
| 1141 | unreachable, and new traffic will use a different path when the | ||
| 1142 | association is multihomed. | ||
| 1143 | |||
| 1144 | Default: 5 | ||
| 1145 | |||
| 1146 | rto_initial - INTEGER | ||
| 1147 | The initial round trip timeout value in milliseconds that will be used | ||
| 1148 | in calculating round trip times. This is the initial time interval | ||
| 1149 | for retransmissions. | ||
| 1068 | 1150 | ||
| 1069 | dev_weight FIXME | 1151 | Default: 3000 |
| 1070 | discovery_slots FIXME | 1152 | |
| 1071 | discovery_timeout FIXME | 1153 | rto_max - INTEGER |
| 1072 | fast_poll_increase FIXME | 1154 | The maximum value (in milliseconds) of the round trip timeout. This |
| 1073 | ip6_queue_maxlen FIXME | 1155 | is the largest time interval that can elapse between retransmissions. |
| 1074 | lap_keepalive_time FIXME | 1156 | |
| 1075 | lo_cong FIXME | 1157 | Default: 60000 |
| 1076 | max_baud_rate FIXME | 1158 | |
| 1077 | max_dgram_qlen FIXME | 1159 | rto_min - INTEGER |
| 1078 | max_noreply_time FIXME | 1160 | The minimum value (in milliseconds) of the round trip timeout. This |
| 1079 | max_tx_data_size FIXME | 1161 | is the smallest time interval the can elapse between retransmissions. |
| 1080 | max_tx_window FIXME | 1162 | |
| 1081 | min_tx_turn_time FIXME | 1163 | Default: 1000 |
| 1082 | mod_cong FIXME | 1164 | |
| 1083 | no_cong FIXME | 1165 | hb_interval - INTEGER |
| 1084 | no_cong_thresh FIXME | 1166 | The interval (in milliseconds) between HEARTBEAT chunks. These chunks |
| 1085 | slot_timeout FIXME | 1167 | are sent at the specified interval on idle paths to probe the state of |
| 1086 | warn_noreply_time FIXME | 1168 | a given path between 2 associations. |
| 1169 | |||
| 1170 | Default: 30000 | ||
| 1171 | |||
| 1172 | sack_timeout - INTEGER | ||
| 1173 | The amount of time (in milliseconds) that the implementation will wait | ||
| 1174 | to send a SACK. | ||
| 1175 | |||
| 1176 | Default: 200 | ||
| 1177 | |||
| 1178 | valid_cookie_life - INTEGER | ||
| 1179 | The default lifetime of the SCTP cookie (in milliseconds). The cookie | ||
| 1180 | is used during association establishment. | ||
| 1181 | |||
| 1182 | Default: 60000 | ||
| 1183 | |||
| 1184 | cookie_preserve_enable - BOOLEAN | ||
| 1185 | Enable or disable the ability to extend the lifetime of the SCTP cookie | ||
| 1186 | that is used during the establishment phase of SCTP association | ||
| 1187 | |||
| 1188 | 1: Enable cookie lifetime extension. | ||
| 1189 | 0: Disable | ||
| 1190 | |||
| 1191 | Default: 1 | ||
| 1192 | |||
| 1193 | rcvbuf_policy - INTEGER | ||
| 1194 | Determines if the receive buffer is attributed to the socket or to | ||
| 1195 | association. SCTP supports the capability to create multiple | ||
| 1196 | associations on a single socket. When using this capability, it is | ||
| 1197 | possible that a single stalled association that's buffering a lot | ||
| 1198 | of data may block other associations from delivering their data by | ||
| 1199 | consuming all of the receive buffer space. To work around this, | ||
| 1200 | the rcvbuf_policy could be set to attribute the receiver buffer space | ||
| 1201 | to each association instead of the socket. This prevents the described | ||
| 1202 | blocking. | ||
| 1203 | |||
| 1204 | 1: rcvbuf space is per association | ||
| 1205 | 0: recbuf space is per socket | ||
| 1206 | |||
| 1207 | Default: 0 | ||
| 1208 | |||
| 1209 | sndbuf_policy - INTEGER | ||
| 1210 | Similar to rcvbuf_policy above, this applies to send buffer space. | ||
| 1211 | |||
| 1212 | 1: Send buffer is tracked per association | ||
| 1213 | 0: Send buffer is tracked per socket. | ||
| 1214 | |||
| 1215 | Default: 0 | ||
| 1216 | |||
| 1217 | sctp_mem - vector of 3 INTEGERs: min, pressure, max | ||
| 1218 | Number of pages allowed for queueing by all SCTP sockets. | ||
| 1219 | |||
| 1220 | min: Below this number of pages SCTP is not bothered about its | ||
| 1221 | memory appetite. When amount of memory allocated by SCTP exceeds | ||
| 1222 | this number, SCTP starts to moderate memory usage. | ||
| 1223 | |||
| 1224 | pressure: This value was introduced to follow format of tcp_mem. | ||
| 1225 | |||
| 1226 | max: Number of pages allowed for queueing by all SCTP sockets. | ||
| 1227 | |||
| 1228 | Default is calculated at boot time from amount of available memory. | ||
| 1229 | |||
| 1230 | sctp_rmem - vector of 3 INTEGERs: min, default, max | ||
| 1231 | See tcp_rmem for a description. | ||
| 1232 | |||
| 1233 | sctp_wmem - vector of 3 INTEGERs: min, default, max | ||
| 1234 | See tcp_wmem for a description. | ||
| 1235 | |||
| 1236 | UNDOCUMENTED: | ||
| 1087 | 1237 | ||
| 1238 | /proc/sys/net/core/* | ||
| 1239 | dev_weight FIXME | ||
| 1240 | |||
| 1241 | /proc/sys/net/unix/* | ||
| 1242 | max_dgram_qlen FIXME | ||
| 1243 | |||
| 1244 | /proc/sys/net/irda/* | ||
| 1245 | fast_poll_increase FIXME | ||
| 1246 | warn_noreply_time FIXME | ||
| 1247 | discovery_slots FIXME | ||
| 1248 | slot_timeout FIXME | ||
| 1249 | max_baud_rate FIXME | ||
| 1250 | discovery_timeout FIXME | ||
| 1251 | lap_keepalive_time FIXME | ||
| 1252 | max_noreply_time FIXME | ||
| 1253 | max_tx_data_size FIXME | ||
| 1254 | max_tx_window FIXME | ||
| 1255 | min_tx_turn_time FIXME | ||
diff --git a/Documentation/networking/s2io.txt b/Documentation/networking/s2io.txt index 4bde53e85f3f..1e28e2ddb90a 100644 --- a/Documentation/networking/s2io.txt +++ b/Documentation/networking/s2io.txt | |||
| @@ -83,9 +83,9 @@ Valid range: Limited by memory on system | |||
| 83 | Default: 30 | 83 | Default: 30 |
| 84 | 84 | ||
| 85 | e. intr_type | 85 | e. intr_type |
| 86 | Specifies interrupt type. Possible values 1(INTA), 2(MSI), 3(MSI-X) | 86 | Specifies interrupt type. Possible values 0(INTA), 2(MSI-X) |
| 87 | Valid range: 1-3 | 87 | Valid values: 0, 2 |
| 88 | Default: 1 | 88 | Default: 2 |
| 89 | 89 | ||
| 90 | 5. Performance suggestions | 90 | 5. Performance suggestions |
| 91 | General: | 91 | General: |
diff --git a/Documentation/powerpc/booting-without-of.txt b/Documentation/powerpc/booting-without-of.txt index b68684d39f96..de2e5c05d6e7 100644 --- a/Documentation/powerpc/booting-without-of.txt +++ b/Documentation/powerpc/booting-without-of.txt | |||
| @@ -41,27 +41,12 @@ Table of Contents | |||
| 41 | VI - System-on-a-chip devices and nodes | 41 | VI - System-on-a-chip devices and nodes |
| 42 | 1) Defining child nodes of an SOC | 42 | 1) Defining child nodes of an SOC |
| 43 | 2) Representing devices without a current OF specification | 43 | 2) Representing devices without a current OF specification |
| 44 | a) MDIO IO device | 44 | a) PHY nodes |
| 45 | b) Gianfar-compatible ethernet nodes | 45 | b) Interrupt controllers |
| 46 | c) PHY nodes | 46 | c) CFI or JEDEC memory-mapped NOR flash |
| 47 | d) Interrupt controllers | 47 | d) 4xx/Axon EMAC ethernet nodes |
| 48 | e) I2C | 48 | e) Xilinx IP cores |
| 49 | f) Freescale SOC USB controllers | 49 | f) USB EHCI controllers |
| 50 | g) Freescale SOC SEC Security Engines | ||
| 51 | h) Board Control and Status (BCSR) | ||
| 52 | i) Freescale QUICC Engine module (QE) | ||
| 53 | j) CFI or JEDEC memory-mapped NOR flash | ||
| 54 | k) Global Utilities Block | ||
| 55 | l) Freescale Communications Processor Module | ||
| 56 | m) Chipselect/Local Bus | ||
| 57 | n) 4xx/Axon EMAC ethernet nodes | ||
| 58 | o) Xilinx IP cores | ||
| 59 | p) Freescale Synchronous Serial Interface | ||
| 60 | q) USB EHCI controllers | ||
| 61 | r) Freescale Display Interface Unit | ||
| 62 | s) Freescale on board FPGA | ||
| 63 | t) Freescael MSI interrupt controller | ||
| 64 | u) Freescale General-purpose Timers Module | ||
| 65 | 50 | ||
| 66 | VII - Marvell Discovery mv64[345]6x System Controller chips | 51 | VII - Marvell Discovery mv64[345]6x System Controller chips |
| 67 | 1) The /system-controller node | 52 | 1) The /system-controller node |
| @@ -1250,80 +1235,7 @@ descriptions for the SOC devices for which new nodes have been | |||
| 1250 | defined; this list will expand as more and more SOC-containing | 1235 | defined; this list will expand as more and more SOC-containing |
| 1251 | platforms are moved over to use the flattened-device-tree model. | 1236 | platforms are moved over to use the flattened-device-tree model. |
| 1252 | 1237 | ||
| 1253 | a) MDIO IO device | 1238 | a) PHY nodes |
| 1254 | |||
| 1255 | The MDIO is a bus to which the PHY devices are connected. For each | ||
| 1256 | device that exists on this bus, a child node should be created. See | ||
| 1257 | the definition of the PHY node below for an example of how to define | ||
| 1258 | a PHY. | ||
| 1259 | |||
| 1260 | Required properties: | ||
| 1261 | - reg : Offset and length of the register set for the device | ||
| 1262 | - compatible : Should define the compatible device type for the | ||
| 1263 | mdio. Currently, this is most likely to be "fsl,gianfar-mdio" | ||
| 1264 | |||
| 1265 | Example: | ||
| 1266 | |||
| 1267 | mdio@24520 { | ||
| 1268 | reg = <24520 20>; | ||
| 1269 | compatible = "fsl,gianfar-mdio"; | ||
| 1270 | |||
| 1271 | ethernet-phy@0 { | ||
| 1272 | ...... | ||
| 1273 | }; | ||
| 1274 | }; | ||
| 1275 | |||
| 1276 | |||
| 1277 | b) Gianfar-compatible ethernet nodes | ||
| 1278 | |||
| 1279 | Required properties: | ||
| 1280 | |||
| 1281 | - device_type : Should be "network" | ||
| 1282 | - model : Model of the device. Can be "TSEC", "eTSEC", or "FEC" | ||
| 1283 | - compatible : Should be "gianfar" | ||
| 1284 | - reg : Offset and length of the register set for the device | ||
| 1285 | - mac-address : List of bytes representing the ethernet address of | ||
| 1286 | this controller | ||
| 1287 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 1288 | field that represents an encoding of the sense and level | ||
| 1289 | information for the interrupt. This should be encoded based on | ||
| 1290 | the information in section 2) depending on the type of interrupt | ||
| 1291 | controller you have. | ||
| 1292 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 1293 | services interrupts for this device. | ||
| 1294 | - phy-handle : The phandle for the PHY connected to this ethernet | ||
| 1295 | controller. | ||
| 1296 | - fixed-link : <a b c d e> where a is emulated phy id - choose any, | ||
| 1297 | but unique to the all specified fixed-links, b is duplex - 0 half, | ||
| 1298 | 1 full, c is link speed - d#10/d#100/d#1000, d is pause - 0 no | ||
| 1299 | pause, 1 pause, e is asym_pause - 0 no asym_pause, 1 asym_pause. | ||
| 1300 | |||
| 1301 | Recommended properties: | ||
| 1302 | |||
| 1303 | - phy-connection-type : a string naming the controller/PHY interface type, | ||
| 1304 | i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id", "sgmii", | ||
| 1305 | "tbi", or "rtbi". This property is only really needed if the connection | ||
| 1306 | is of type "rgmii-id", as all other connection types are detected by | ||
| 1307 | hardware. | ||
| 1308 | |||
| 1309 | |||
| 1310 | Example: | ||
| 1311 | |||
| 1312 | ethernet@24000 { | ||
| 1313 | #size-cells = <0>; | ||
| 1314 | device_type = "network"; | ||
| 1315 | model = "TSEC"; | ||
| 1316 | compatible = "gianfar"; | ||
| 1317 | reg = <24000 1000>; | ||
| 1318 | mac-address = [ 00 E0 0C 00 73 00 ]; | ||
| 1319 | interrupts = <d 3 e 3 12 3>; | ||
| 1320 | interrupt-parent = <40000>; | ||
| 1321 | phy-handle = <2452000> | ||
| 1322 | }; | ||
| 1323 | |||
| 1324 | |||
| 1325 | |||
| 1326 | c) PHY nodes | ||
| 1327 | 1239 | ||
| 1328 | Required properties: | 1240 | Required properties: |
| 1329 | 1241 | ||
| @@ -1351,7 +1263,7 @@ platforms are moved over to use the flattened-device-tree model. | |||
| 1351 | }; | 1263 | }; |
| 1352 | 1264 | ||
| 1353 | 1265 | ||
| 1354 | d) Interrupt controllers | 1266 | b) Interrupt controllers |
| 1355 | 1267 | ||
| 1356 | Some SOC devices contain interrupt controllers that are different | 1268 | Some SOC devices contain interrupt controllers that are different |
| 1357 | from the standard Open PIC specification. The SOC device nodes for | 1269 | from the standard Open PIC specification. The SOC device nodes for |
| @@ -1371,508 +1283,7 @@ platforms are moved over to use the flattened-device-tree model. | |||
| 1371 | device_type = "open-pic"; | 1283 | device_type = "open-pic"; |
| 1372 | }; | 1284 | }; |
| 1373 | 1285 | ||
| 1374 | 1286 | c) CFI or JEDEC memory-mapped NOR flash | |
| 1375 | e) I2C | ||
| 1376 | |||
| 1377 | Required properties : | ||
| 1378 | |||
| 1379 | - device_type : Should be "i2c" | ||
| 1380 | - reg : Offset and length of the register set for the device | ||
| 1381 | |||
| 1382 | Recommended properties : | ||
| 1383 | |||
| 1384 | - compatible : Should be "fsl-i2c" for parts compatible with | ||
| 1385 | Freescale I2C specifications. | ||
| 1386 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 1387 | field that represents an encoding of the sense and level | ||
| 1388 | information for the interrupt. This should be encoded based on | ||
| 1389 | the information in section 2) depending on the type of interrupt | ||
| 1390 | controller you have. | ||
| 1391 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 1392 | services interrupts for this device. | ||
| 1393 | - dfsrr : boolean; if defined, indicates that this I2C device has | ||
| 1394 | a digital filter sampling rate register | ||
| 1395 | - fsl5200-clocking : boolean; if defined, indicated that this device | ||
| 1396 | uses the FSL 5200 clocking mechanism. | ||
| 1397 | |||
| 1398 | Example : | ||
| 1399 | |||
| 1400 | i2c@3000 { | ||
| 1401 | interrupt-parent = <40000>; | ||
| 1402 | interrupts = <1b 3>; | ||
| 1403 | reg = <3000 18>; | ||
| 1404 | device_type = "i2c"; | ||
| 1405 | compatible = "fsl-i2c"; | ||
| 1406 | dfsrr; | ||
| 1407 | }; | ||
| 1408 | |||
| 1409 | |||
| 1410 | f) Freescale SOC USB controllers | ||
| 1411 | |||
| 1412 | The device node for a USB controller that is part of a Freescale | ||
| 1413 | SOC is as described in the document "Open Firmware Recommended | ||
| 1414 | Practice : Universal Serial Bus" with the following modifications | ||
| 1415 | and additions : | ||
| 1416 | |||
| 1417 | Required properties : | ||
| 1418 | - compatible : Should be "fsl-usb2-mph" for multi port host USB | ||
| 1419 | controllers, or "fsl-usb2-dr" for dual role USB controllers | ||
| 1420 | - phy_type : For multi port host USB controllers, should be one of | ||
| 1421 | "ulpi", or "serial". For dual role USB controllers, should be | ||
| 1422 | one of "ulpi", "utmi", "utmi_wide", or "serial". | ||
| 1423 | - reg : Offset and length of the register set for the device | ||
| 1424 | - port0 : boolean; if defined, indicates port0 is connected for | ||
| 1425 | fsl-usb2-mph compatible controllers. Either this property or | ||
| 1426 | "port1" (or both) must be defined for "fsl-usb2-mph" compatible | ||
| 1427 | controllers. | ||
| 1428 | - port1 : boolean; if defined, indicates port1 is connected for | ||
| 1429 | fsl-usb2-mph compatible controllers. Either this property or | ||
| 1430 | "port0" (or both) must be defined for "fsl-usb2-mph" compatible | ||
| 1431 | controllers. | ||
| 1432 | - dr_mode : indicates the working mode for "fsl-usb2-dr" compatible | ||
| 1433 | controllers. Can be "host", "peripheral", or "otg". Default to | ||
| 1434 | "host" if not defined for backward compatibility. | ||
| 1435 | |||
| 1436 | Recommended properties : | ||
| 1437 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 1438 | field that represents an encoding of the sense and level | ||
| 1439 | information for the interrupt. This should be encoded based on | ||
| 1440 | the information in section 2) depending on the type of interrupt | ||
| 1441 | controller you have. | ||
| 1442 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 1443 | services interrupts for this device. | ||
| 1444 | |||
| 1445 | Example multi port host USB controller device node : | ||
| 1446 | usb@22000 { | ||
| 1447 | compatible = "fsl-usb2-mph"; | ||
| 1448 | reg = <22000 1000>; | ||
| 1449 | #address-cells = <1>; | ||
| 1450 | #size-cells = <0>; | ||
| 1451 | interrupt-parent = <700>; | ||
| 1452 | interrupts = <27 1>; | ||
| 1453 | phy_type = "ulpi"; | ||
| 1454 | port0; | ||
| 1455 | port1; | ||
| 1456 | }; | ||
| 1457 | |||
| 1458 | Example dual role USB controller device node : | ||
| 1459 | usb@23000 { | ||
| 1460 | compatible = "fsl-usb2-dr"; | ||
| 1461 | reg = <23000 1000>; | ||
| 1462 | #address-cells = <1>; | ||
| 1463 | #size-cells = <0>; | ||
| 1464 | interrupt-parent = <700>; | ||
| 1465 | interrupts = <26 1>; | ||
| 1466 | dr_mode = "otg"; | ||
| 1467 | phy = "ulpi"; | ||
| 1468 | }; | ||
| 1469 | |||
| 1470 | |||
| 1471 | g) Freescale SOC SEC Security Engines | ||
| 1472 | |||
| 1473 | Required properties: | ||
| 1474 | |||
| 1475 | - device_type : Should be "crypto" | ||
| 1476 | - model : Model of the device. Should be "SEC1" or "SEC2" | ||
| 1477 | - compatible : Should be "talitos" | ||
| 1478 | - reg : Offset and length of the register set for the device | ||
| 1479 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 1480 | field that represents an encoding of the sense and level | ||
| 1481 | information for the interrupt. This should be encoded based on | ||
| 1482 | the information in section 2) depending on the type of interrupt | ||
| 1483 | controller you have. | ||
| 1484 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 1485 | services interrupts for this device. | ||
| 1486 | - num-channels : An integer representing the number of channels | ||
| 1487 | available. | ||
| 1488 | - channel-fifo-len : An integer representing the number of | ||
| 1489 | descriptor pointers each channel fetch fifo can hold. | ||
| 1490 | - exec-units-mask : The bitmask representing what execution units | ||
| 1491 | (EUs) are available. It's a single 32-bit cell. EU information | ||
| 1492 | should be encoded following the SEC's Descriptor Header Dword | ||
| 1493 | EU_SEL0 field documentation, i.e. as follows: | ||
| 1494 | |||
| 1495 | bit 0 = reserved - should be 0 | ||
| 1496 | bit 1 = set if SEC has the ARC4 EU (AFEU) | ||
| 1497 | bit 2 = set if SEC has the DES/3DES EU (DEU) | ||
| 1498 | bit 3 = set if SEC has the message digest EU (MDEU) | ||
| 1499 | bit 4 = set if SEC has the random number generator EU (RNG) | ||
| 1500 | bit 5 = set if SEC has the public key EU (PKEU) | ||
| 1501 | bit 6 = set if SEC has the AES EU (AESU) | ||
| 1502 | bit 7 = set if SEC has the Kasumi EU (KEU) | ||
| 1503 | |||
| 1504 | bits 8 through 31 are reserved for future SEC EUs. | ||
| 1505 | |||
| 1506 | - descriptor-types-mask : The bitmask representing what descriptors | ||
| 1507 | are available. It's a single 32-bit cell. Descriptor type | ||
| 1508 | information should be encoded following the SEC's Descriptor | ||
| 1509 | Header Dword DESC_TYPE field documentation, i.e. as follows: | ||
| 1510 | |||
| 1511 | bit 0 = set if SEC supports the aesu_ctr_nonsnoop desc. type | ||
| 1512 | bit 1 = set if SEC supports the ipsec_esp descriptor type | ||
| 1513 | bit 2 = set if SEC supports the common_nonsnoop desc. type | ||
| 1514 | bit 3 = set if SEC supports the 802.11i AES ccmp desc. type | ||
| 1515 | bit 4 = set if SEC supports the hmac_snoop_no_afeu desc. type | ||
| 1516 | bit 5 = set if SEC supports the srtp descriptor type | ||
| 1517 | bit 6 = set if SEC supports the non_hmac_snoop_no_afeu desc.type | ||
| 1518 | bit 7 = set if SEC supports the pkeu_assemble descriptor type | ||
| 1519 | bit 8 = set if SEC supports the aesu_key_expand_output desc.type | ||
| 1520 | bit 9 = set if SEC supports the pkeu_ptmul descriptor type | ||
| 1521 | bit 10 = set if SEC supports the common_nonsnoop_afeu desc. type | ||
| 1522 | bit 11 = set if SEC supports the pkeu_ptadd_dbl descriptor type | ||
| 1523 | |||
| 1524 | ..and so on and so forth. | ||
| 1525 | |||
| 1526 | Example: | ||
| 1527 | |||
| 1528 | /* MPC8548E */ | ||
| 1529 | crypto@30000 { | ||
| 1530 | device_type = "crypto"; | ||
| 1531 | model = "SEC2"; | ||
| 1532 | compatible = "talitos"; | ||
| 1533 | reg = <30000 10000>; | ||
| 1534 | interrupts = <1d 3>; | ||
| 1535 | interrupt-parent = <40000>; | ||
| 1536 | num-channels = <4>; | ||
| 1537 | channel-fifo-len = <18>; | ||
| 1538 | exec-units-mask = <000000fe>; | ||
| 1539 | descriptor-types-mask = <012b0ebf>; | ||
| 1540 | }; | ||
| 1541 | |||
| 1542 | h) Board Control and Status (BCSR) | ||
| 1543 | |||
| 1544 | Required properties: | ||
| 1545 | |||
| 1546 | - device_type : Should be "board-control" | ||
| 1547 | - reg : Offset and length of the register set for the device | ||
| 1548 | |||
| 1549 | Example: | ||
| 1550 | |||
| 1551 | bcsr@f8000000 { | ||
| 1552 | device_type = "board-control"; | ||
| 1553 | reg = <f8000000 8000>; | ||
| 1554 | }; | ||
| 1555 | |||
| 1556 | i) Freescale QUICC Engine module (QE) | ||
| 1557 | This represents qe module that is installed on PowerQUICC II Pro. | ||
| 1558 | |||
| 1559 | NOTE: This is an interim binding; it should be updated to fit | ||
| 1560 | in with the CPM binding later in this document. | ||
| 1561 | |||
| 1562 | Basically, it is a bus of devices, that could act more or less | ||
| 1563 | as a complete entity (UCC, USB etc ). All of them should be siblings on | ||
| 1564 | the "root" qe node, using the common properties from there. | ||
| 1565 | The description below applies to the qe of MPC8360 and | ||
| 1566 | more nodes and properties would be extended in the future. | ||
| 1567 | |||
| 1568 | i) Root QE device | ||
| 1569 | |||
| 1570 | Required properties: | ||
| 1571 | - compatible : should be "fsl,qe"; | ||
| 1572 | - model : precise model of the QE, Can be "QE", "CPM", or "CPM2" | ||
| 1573 | - reg : offset and length of the device registers. | ||
| 1574 | - bus-frequency : the clock frequency for QUICC Engine. | ||
| 1575 | |||
| 1576 | Recommended properties | ||
| 1577 | - brg-frequency : the internal clock source frequency for baud-rate | ||
| 1578 | generators in Hz. | ||
| 1579 | |||
| 1580 | Example: | ||
| 1581 | qe@e0100000 { | ||
| 1582 | #address-cells = <1>; | ||
| 1583 | #size-cells = <1>; | ||
| 1584 | #interrupt-cells = <2>; | ||
| 1585 | compatible = "fsl,qe"; | ||
| 1586 | ranges = <0 e0100000 00100000>; | ||
| 1587 | reg = <e0100000 480>; | ||
| 1588 | brg-frequency = <0>; | ||
| 1589 | bus-frequency = <179A7B00>; | ||
| 1590 | } | ||
| 1591 | |||
| 1592 | |||
| 1593 | ii) SPI (Serial Peripheral Interface) | ||
| 1594 | |||
| 1595 | Required properties: | ||
| 1596 | - cell-index : SPI controller index. | ||
| 1597 | - compatible : should be "fsl,spi". | ||
| 1598 | - mode : the SPI operation mode, it can be "cpu" or "cpu-qe". | ||
| 1599 | - reg : Offset and length of the register set for the device | ||
| 1600 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 1601 | field that represents an encoding of the sense and level | ||
| 1602 | information for the interrupt. This should be encoded based on | ||
| 1603 | the information in section 2) depending on the type of interrupt | ||
| 1604 | controller you have. | ||
| 1605 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 1606 | services interrupts for this device. | ||
| 1607 | |||
| 1608 | Example: | ||
| 1609 | spi@4c0 { | ||
| 1610 | cell-index = <0>; | ||
| 1611 | compatible = "fsl,spi"; | ||
| 1612 | reg = <4c0 40>; | ||
| 1613 | interrupts = <82 0>; | ||
| 1614 | interrupt-parent = <700>; | ||
| 1615 | mode = "cpu"; | ||
| 1616 | }; | ||
| 1617 | |||
| 1618 | |||
| 1619 | iii) USB (Universal Serial Bus Controller) | ||
| 1620 | |||
| 1621 | Required properties: | ||
| 1622 | - compatible : could be "qe_udc" or "fhci-hcd". | ||
| 1623 | - mode : the could be "host" or "slave". | ||
| 1624 | - reg : Offset and length of the register set for the device | ||
| 1625 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 1626 | field that represents an encoding of the sense and level | ||
| 1627 | information for the interrupt. This should be encoded based on | ||
| 1628 | the information in section 2) depending on the type of interrupt | ||
| 1629 | controller you have. | ||
| 1630 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 1631 | services interrupts for this device. | ||
| 1632 | |||
| 1633 | Example(slave): | ||
| 1634 | usb@6c0 { | ||
| 1635 | compatible = "qe_udc"; | ||
| 1636 | reg = <6c0 40>; | ||
| 1637 | interrupts = <8b 0>; | ||
| 1638 | interrupt-parent = <700>; | ||
| 1639 | mode = "slave"; | ||
| 1640 | }; | ||
| 1641 | |||
| 1642 | |||
| 1643 | iv) UCC (Unified Communications Controllers) | ||
| 1644 | |||
| 1645 | Required properties: | ||
| 1646 | - device_type : should be "network", "hldc", "uart", "transparent" | ||
| 1647 | "bisync", "atm", or "serial". | ||
| 1648 | - compatible : could be "ucc_geth" or "fsl_atm" and so on. | ||
| 1649 | - cell-index : the ucc number(1-8), corresponding to UCCx in UM. | ||
| 1650 | - reg : Offset and length of the register set for the device | ||
| 1651 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 1652 | field that represents an encoding of the sense and level | ||
| 1653 | information for the interrupt. This should be encoded based on | ||
| 1654 | the information in section 2) depending on the type of interrupt | ||
| 1655 | controller you have. | ||
| 1656 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 1657 | services interrupts for this device. | ||
| 1658 | - pio-handle : The phandle for the Parallel I/O port configuration. | ||
| 1659 | - port-number : for UART drivers, the port number to use, between 0 and 3. | ||
| 1660 | This usually corresponds to the /dev/ttyQE device, e.g. <0> = /dev/ttyQE0. | ||
| 1661 | The port number is added to the minor number of the device. Unlike the | ||
| 1662 | CPM UART driver, the port-number is required for the QE UART driver. | ||
| 1663 | - soft-uart : for UART drivers, if specified this means the QE UART device | ||
| 1664 | driver should use "Soft-UART" mode, which is needed on some SOCs that have | ||
| 1665 | broken UART hardware. Soft-UART is provided via a microcode upload. | ||
| 1666 | - rx-clock-name: the UCC receive clock source | ||
| 1667 | "none": clock source is disabled | ||
| 1668 | "brg1" through "brg16": clock source is BRG1-BRG16, respectively | ||
| 1669 | "clk1" through "clk24": clock source is CLK1-CLK24, respectively | ||
| 1670 | - tx-clock-name: the UCC transmit clock source | ||
| 1671 | "none": clock source is disabled | ||
| 1672 | "brg1" through "brg16": clock source is BRG1-BRG16, respectively | ||
| 1673 | "clk1" through "clk24": clock source is CLK1-CLK24, respectively | ||
| 1674 | The following two properties are deprecated. rx-clock has been replaced | ||
| 1675 | with rx-clock-name, and tx-clock has been replaced with tx-clock-name. | ||
| 1676 | Drivers that currently use the deprecated properties should continue to | ||
| 1677 | do so, in order to support older device trees, but they should be updated | ||
| 1678 | to check for the new properties first. | ||
| 1679 | - rx-clock : represents the UCC receive clock source. | ||
| 1680 | 0x00 : clock source is disabled; | ||
| 1681 | 0x1~0x10 : clock source is BRG1~BRG16 respectively; | ||
| 1682 | 0x11~0x28: clock source is QE_CLK1~QE_CLK24 respectively. | ||
| 1683 | - tx-clock: represents the UCC transmit clock source; | ||
| 1684 | 0x00 : clock source is disabled; | ||
| 1685 | 0x1~0x10 : clock source is BRG1~BRG16 respectively; | ||
| 1686 | 0x11~0x28: clock source is QE_CLK1~QE_CLK24 respectively. | ||
| 1687 | |||
| 1688 | Required properties for network device_type: | ||
| 1689 | - mac-address : list of bytes representing the ethernet address. | ||
| 1690 | - phy-handle : The phandle for the PHY connected to this controller. | ||
| 1691 | |||
| 1692 | Recommended properties: | ||
| 1693 | - phy-connection-type : a string naming the controller/PHY interface type, | ||
| 1694 | i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id" (Internal | ||
| 1695 | Delay), "rgmii-txid" (delay on TX only), "rgmii-rxid" (delay on RX only), | ||
| 1696 | "tbi", or "rtbi". | ||
| 1697 | |||
| 1698 | Example: | ||
| 1699 | ucc@2000 { | ||
| 1700 | device_type = "network"; | ||
| 1701 | compatible = "ucc_geth"; | ||
| 1702 | cell-index = <1>; | ||
| 1703 | reg = <2000 200>; | ||
| 1704 | interrupts = <a0 0>; | ||
| 1705 | interrupt-parent = <700>; | ||
| 1706 | mac-address = [ 00 04 9f 00 23 23 ]; | ||
| 1707 | rx-clock = "none"; | ||
| 1708 | tx-clock = "clk9"; | ||
| 1709 | phy-handle = <212000>; | ||
| 1710 | phy-connection-type = "gmii"; | ||
| 1711 | pio-handle = <140001>; | ||
| 1712 | }; | ||
| 1713 | |||
| 1714 | |||
| 1715 | v) Parallel I/O Ports | ||
| 1716 | |||
| 1717 | This node configures Parallel I/O ports for CPUs with QE support. | ||
| 1718 | The node should reside in the "soc" node of the tree. For each | ||
| 1719 | device that using parallel I/O ports, a child node should be created. | ||
| 1720 | See the definition of the Pin configuration nodes below for more | ||
| 1721 | information. | ||
| 1722 | |||
| 1723 | Required properties: | ||
| 1724 | - device_type : should be "par_io". | ||
| 1725 | - reg : offset to the register set and its length. | ||
| 1726 | - num-ports : number of Parallel I/O ports | ||
| 1727 | |||
| 1728 | Example: | ||
| 1729 | par_io@1400 { | ||
| 1730 | reg = <1400 100>; | ||
| 1731 | #address-cells = <1>; | ||
| 1732 | #size-cells = <0>; | ||
| 1733 | device_type = "par_io"; | ||
| 1734 | num-ports = <7>; | ||
| 1735 | ucc_pin@01 { | ||
| 1736 | ...... | ||
| 1737 | }; | ||
| 1738 | |||
| 1739 | Note that "par_io" nodes are obsolete, and should not be used for | ||
| 1740 | the new device trees. Instead, each Par I/O bank should be represented | ||
| 1741 | via its own gpio-controller node: | ||
| 1742 | |||
| 1743 | Required properties: | ||
| 1744 | - #gpio-cells : should be "2". | ||
| 1745 | - compatible : should be "fsl,<chip>-qe-pario-bank", | ||
| 1746 | "fsl,mpc8323-qe-pario-bank". | ||
| 1747 | - reg : offset to the register set and its length. | ||
| 1748 | - gpio-controller : node to identify gpio controllers. | ||
| 1749 | |||
| 1750 | Example: | ||
| 1751 | qe_pio_a: gpio-controller@1400 { | ||
| 1752 | #gpio-cells = <2>; | ||
| 1753 | compatible = "fsl,mpc8360-qe-pario-bank", | ||
| 1754 | "fsl,mpc8323-qe-pario-bank"; | ||
| 1755 | reg = <0x1400 0x18>; | ||
| 1756 | gpio-controller; | ||
| 1757 | }; | ||
| 1758 | |||
| 1759 | qe_pio_e: gpio-controller@1460 { | ||
| 1760 | #gpio-cells = <2>; | ||
| 1761 | compatible = "fsl,mpc8360-qe-pario-bank", | ||
| 1762 | "fsl,mpc8323-qe-pario-bank"; | ||
| 1763 | reg = <0x1460 0x18>; | ||
| 1764 | gpio-controller; | ||
| 1765 | }; | ||
| 1766 | |||
| 1767 | vi) Pin configuration nodes | ||
| 1768 | |||
| 1769 | Required properties: | ||
| 1770 | - linux,phandle : phandle of this node; likely referenced by a QE | ||
| 1771 | device. | ||
| 1772 | - pio-map : array of pin configurations. Each pin is defined by 6 | ||
| 1773 | integers. The six numbers are respectively: port, pin, dir, | ||
| 1774 | open_drain, assignment, has_irq. | ||
| 1775 | - port : port number of the pin; 0-6 represent port A-G in UM. | ||
| 1776 | - pin : pin number in the port. | ||
| 1777 | - dir : direction of the pin, should encode as follows: | ||
| 1778 | |||
| 1779 | 0 = The pin is disabled | ||
| 1780 | 1 = The pin is an output | ||
| 1781 | 2 = The pin is an input | ||
| 1782 | 3 = The pin is I/O | ||
| 1783 | |||
| 1784 | - open_drain : indicates the pin is normal or wired-OR: | ||
| 1785 | |||
| 1786 | 0 = The pin is actively driven as an output | ||
| 1787 | 1 = The pin is an open-drain driver. As an output, the pin is | ||
| 1788 | driven active-low, otherwise it is three-stated. | ||
| 1789 | |||
| 1790 | - assignment : function number of the pin according to the Pin Assignment | ||
| 1791 | tables in User Manual. Each pin can have up to 4 possible functions in | ||
| 1792 | QE and two options for CPM. | ||
| 1793 | - has_irq : indicates if the pin is used as source of external | ||
| 1794 | interrupts. | ||
| 1795 | |||
| 1796 | Example: | ||
| 1797 | ucc_pin@01 { | ||
| 1798 | linux,phandle = <140001>; | ||
| 1799 | pio-map = < | ||
| 1800 | /* port pin dir open_drain assignment has_irq */ | ||
| 1801 | 0 3 1 0 1 0 /* TxD0 */ | ||
| 1802 | 0 4 1 0 1 0 /* TxD1 */ | ||
| 1803 | 0 5 1 0 1 0 /* TxD2 */ | ||
| 1804 | 0 6 1 0 1 0 /* TxD3 */ | ||
| 1805 | 1 6 1 0 3 0 /* TxD4 */ | ||
| 1806 | 1 7 1 0 1 0 /* TxD5 */ | ||
| 1807 | 1 9 1 0 2 0 /* TxD6 */ | ||
| 1808 | 1 a 1 0 2 0 /* TxD7 */ | ||
| 1809 | 0 9 2 0 1 0 /* RxD0 */ | ||
| 1810 | 0 a 2 0 1 0 /* RxD1 */ | ||
| 1811 | 0 b 2 0 1 0 /* RxD2 */ | ||
| 1812 | 0 c 2 0 1 0 /* RxD3 */ | ||
| 1813 | 0 d 2 0 1 0 /* RxD4 */ | ||
| 1814 | 1 1 2 0 2 0 /* RxD5 */ | ||
| 1815 | 1 0 2 0 2 0 /* RxD6 */ | ||
| 1816 | 1 4 2 0 2 0 /* RxD7 */ | ||
| 1817 | 0 7 1 0 1 0 /* TX_EN */ | ||
| 1818 | 0 8 1 0 1 0 /* TX_ER */ | ||
| 1819 | 0 f 2 0 1 0 /* RX_DV */ | ||
| 1820 | 0 10 2 0 1 0 /* RX_ER */ | ||
| 1821 | 0 0 2 0 1 0 /* RX_CLK */ | ||
| 1822 | 2 9 1 0 3 0 /* GTX_CLK - CLK10 */ | ||
| 1823 | 2 8 2 0 1 0>; /* GTX125 - CLK9 */ | ||
| 1824 | }; | ||
| 1825 | |||
| 1826 | vii) Multi-User RAM (MURAM) | ||
| 1827 | |||
| 1828 | Required properties: | ||
| 1829 | - compatible : should be "fsl,qe-muram", "fsl,cpm-muram". | ||
| 1830 | - mode : the could be "host" or "slave". | ||
| 1831 | - ranges : Should be defined as specified in 1) to describe the | ||
| 1832 | translation of MURAM addresses. | ||
| 1833 | - data-only : sub-node which defines the address area under MURAM | ||
| 1834 | bus that can be allocated as data/parameter | ||
| 1835 | |||
| 1836 | Example: | ||
| 1837 | |||
| 1838 | muram@10000 { | ||
| 1839 | compatible = "fsl,qe-muram", "fsl,cpm-muram"; | ||
| 1840 | ranges = <0 00010000 0000c000>; | ||
| 1841 | |||
| 1842 | data-only@0{ | ||
| 1843 | compatible = "fsl,qe-muram-data", | ||
| 1844 | "fsl,cpm-muram-data"; | ||
| 1845 | reg = <0 c000>; | ||
| 1846 | }; | ||
| 1847 | }; | ||
| 1848 | |||
| 1849 | viii) Uploaded QE firmware | ||
| 1850 | |||
| 1851 | If a new firwmare has been uploaded to the QE (usually by the | ||
| 1852 | boot loader), then a 'firmware' child node should be added to the QE | ||
| 1853 | node. This node provides information on the uploaded firmware that | ||
| 1854 | device drivers may need. | ||
| 1855 | |||
| 1856 | Required properties: | ||
| 1857 | - id: The string name of the firmware. This is taken from the 'id' | ||
| 1858 | member of the qe_firmware structure of the uploaded firmware. | ||
| 1859 | Device drivers can search this string to determine if the | ||
| 1860 | firmware they want is already present. | ||
| 1861 | - extended-modes: The Extended Modes bitfield, taken from the | ||
| 1862 | firmware binary. It is a 64-bit number represented | ||
| 1863 | as an array of two 32-bit numbers. | ||
| 1864 | - virtual-traps: The virtual traps, taken from the firmware binary. | ||
| 1865 | It is an array of 8 32-bit numbers. | ||
| 1866 | |||
| 1867 | Example: | ||
| 1868 | |||
| 1869 | firmware { | ||
| 1870 | id = "Soft-UART"; | ||
| 1871 | extended-modes = <0 0>; | ||
| 1872 | virtual-traps = <0 0 0 0 0 0 0 0>; | ||
| 1873 | } | ||
| 1874 | |||
| 1875 | j) CFI or JEDEC memory-mapped NOR flash | ||
| 1876 | 1287 | ||
| 1877 | Flash chips (Memory Technology Devices) are often used for solid state | 1288 | Flash chips (Memory Technology Devices) are often used for solid state |
| 1878 | file systems on embedded devices. | 1289 | file systems on embedded devices. |
| @@ -1936,268 +1347,7 @@ platforms are moved over to use the flattened-device-tree model. | |||
| 1936 | }; | 1347 | }; |
| 1937 | }; | 1348 | }; |
| 1938 | 1349 | ||
| 1939 | k) Global Utilities Block | 1350 | d) 4xx/Axon EMAC ethernet nodes |
| 1940 | |||
| 1941 | The global utilities block controls power management, I/O device | ||
| 1942 | enabling, power-on-reset configuration monitoring, general-purpose | ||
| 1943 | I/O signal configuration, alternate function selection for multiplexed | ||
| 1944 | signals, and clock control. | ||
| 1945 | |||
| 1946 | Required properties: | ||
| 1947 | |||
| 1948 | - compatible : Should define the compatible device type for | ||
| 1949 | global-utilities. | ||
| 1950 | - reg : Offset and length of the register set for the device. | ||
| 1951 | |||
| 1952 | Recommended properties: | ||
| 1953 | |||
| 1954 | - fsl,has-rstcr : Indicates that the global utilities register set | ||
| 1955 | contains a functioning "reset control register" (i.e. the board | ||
| 1956 | is wired to reset upon setting the HRESET_REQ bit in this register). | ||
| 1957 | |||
| 1958 | Example: | ||
| 1959 | |||
| 1960 | global-utilities@e0000 { /* global utilities block */ | ||
| 1961 | compatible = "fsl,mpc8548-guts"; | ||
| 1962 | reg = <e0000 1000>; | ||
| 1963 | fsl,has-rstcr; | ||
| 1964 | }; | ||
| 1965 | |||
| 1966 | l) Freescale Communications Processor Module | ||
| 1967 | |||
| 1968 | NOTE: This is an interim binding, and will likely change slightly, | ||
| 1969 | as more devices are supported. The QE bindings especially are | ||
| 1970 | incomplete. | ||
| 1971 | |||
| 1972 | i) Root CPM node | ||
| 1973 | |||
| 1974 | Properties: | ||
| 1975 | - compatible : "fsl,cpm1", "fsl,cpm2", or "fsl,qe". | ||
| 1976 | - reg : A 48-byte region beginning with CPCR. | ||
| 1977 | |||
| 1978 | Example: | ||
| 1979 | cpm@119c0 { | ||
| 1980 | #address-cells = <1>; | ||
| 1981 | #size-cells = <1>; | ||
| 1982 | #interrupt-cells = <2>; | ||
| 1983 | compatible = "fsl,mpc8272-cpm", "fsl,cpm2"; | ||
| 1984 | reg = <119c0 30>; | ||
| 1985 | } | ||
| 1986 | |||
| 1987 | ii) Properties common to mulitple CPM/QE devices | ||
| 1988 | |||
| 1989 | - fsl,cpm-command : This value is ORed with the opcode and command flag | ||
| 1990 | to specify the device on which a CPM command operates. | ||
| 1991 | |||
| 1992 | - fsl,cpm-brg : Indicates which baud rate generator the device | ||
| 1993 | is associated with. If absent, an unused BRG | ||
| 1994 | should be dynamically allocated. If zero, the | ||
| 1995 | device uses an external clock rather than a BRG. | ||
| 1996 | |||
| 1997 | - reg : Unless otherwise specified, the first resource represents the | ||
| 1998 | scc/fcc/ucc registers, and the second represents the device's | ||
| 1999 | parameter RAM region (if it has one). | ||
| 2000 | |||
| 2001 | iii) Serial | ||
| 2002 | |||
| 2003 | Currently defined compatibles: | ||
| 2004 | - fsl,cpm1-smc-uart | ||
| 2005 | - fsl,cpm2-smc-uart | ||
| 2006 | - fsl,cpm1-scc-uart | ||
| 2007 | - fsl,cpm2-scc-uart | ||
| 2008 | - fsl,qe-uart | ||
| 2009 | |||
| 2010 | Example: | ||
| 2011 | |||
| 2012 | serial@11a00 { | ||
| 2013 | device_type = "serial"; | ||
| 2014 | compatible = "fsl,mpc8272-scc-uart", | ||
| 2015 | "fsl,cpm2-scc-uart"; | ||
| 2016 | reg = <11a00 20 8000 100>; | ||
| 2017 | interrupts = <28 8>; | ||
| 2018 | interrupt-parent = <&PIC>; | ||
| 2019 | fsl,cpm-brg = <1>; | ||
| 2020 | fsl,cpm-command = <00800000>; | ||
| 2021 | }; | ||
| 2022 | |||
| 2023 | iii) Network | ||
| 2024 | |||
| 2025 | Currently defined compatibles: | ||
| 2026 | - fsl,cpm1-scc-enet | ||
| 2027 | - fsl,cpm2-scc-enet | ||
| 2028 | - fsl,cpm1-fec-enet | ||
| 2029 | - fsl,cpm2-fcc-enet (third resource is GFEMR) | ||
| 2030 | - fsl,qe-enet | ||
| 2031 | |||
| 2032 | Example: | ||
| 2033 | |||
| 2034 | ethernet@11300 { | ||
| 2035 | device_type = "network"; | ||
| 2036 | compatible = "fsl,mpc8272-fcc-enet", | ||
| 2037 | "fsl,cpm2-fcc-enet"; | ||
| 2038 | reg = <11300 20 8400 100 11390 1>; | ||
| 2039 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
| 2040 | interrupts = <20 8>; | ||
| 2041 | interrupt-parent = <&PIC>; | ||
| 2042 | phy-handle = <&PHY0>; | ||
| 2043 | fsl,cpm-command = <12000300>; | ||
| 2044 | }; | ||
| 2045 | |||
| 2046 | iv) MDIO | ||
| 2047 | |||
| 2048 | Currently defined compatibles: | ||
| 2049 | fsl,pq1-fec-mdio (reg is same as first resource of FEC device) | ||
| 2050 | fsl,cpm2-mdio-bitbang (reg is port C registers) | ||
| 2051 | |||
| 2052 | Properties for fsl,cpm2-mdio-bitbang: | ||
| 2053 | fsl,mdio-pin : pin of port C controlling mdio data | ||
| 2054 | fsl,mdc-pin : pin of port C controlling mdio clock | ||
| 2055 | |||
| 2056 | Example: | ||
| 2057 | |||
| 2058 | mdio@10d40 { | ||
| 2059 | device_type = "mdio"; | ||
| 2060 | compatible = "fsl,mpc8272ads-mdio-bitbang", | ||
| 2061 | "fsl,mpc8272-mdio-bitbang", | ||
| 2062 | "fsl,cpm2-mdio-bitbang"; | ||
| 2063 | reg = <10d40 14>; | ||
| 2064 | #address-cells = <1>; | ||
| 2065 | #size-cells = <0>; | ||
| 2066 | fsl,mdio-pin = <12>; | ||
| 2067 | fsl,mdc-pin = <13>; | ||
| 2068 | }; | ||
| 2069 | |||
| 2070 | v) Baud Rate Generators | ||
| 2071 | |||
| 2072 | Currently defined compatibles: | ||
| 2073 | fsl,cpm-brg | ||
| 2074 | fsl,cpm1-brg | ||
| 2075 | fsl,cpm2-brg | ||
| 2076 | |||
| 2077 | Properties: | ||
| 2078 | - reg : There may be an arbitrary number of reg resources; BRG | ||
| 2079 | numbers are assigned to these in order. | ||
| 2080 | - clock-frequency : Specifies the base frequency driving | ||
| 2081 | the BRG. | ||
| 2082 | |||
| 2083 | Example: | ||
| 2084 | |||
| 2085 | brg@119f0 { | ||
| 2086 | compatible = "fsl,mpc8272-brg", | ||
| 2087 | "fsl,cpm2-brg", | ||
| 2088 | "fsl,cpm-brg"; | ||
| 2089 | reg = <119f0 10 115f0 10>; | ||
| 2090 | clock-frequency = <d#25000000>; | ||
| 2091 | }; | ||
| 2092 | |||
| 2093 | vi) Interrupt Controllers | ||
| 2094 | |||
| 2095 | Currently defined compatibles: | ||
| 2096 | - fsl,cpm1-pic | ||
| 2097 | - only one interrupt cell | ||
| 2098 | - fsl,pq1-pic | ||
| 2099 | - fsl,cpm2-pic | ||
| 2100 | - second interrupt cell is level/sense: | ||
| 2101 | - 2 is falling edge | ||
| 2102 | - 8 is active low | ||
| 2103 | |||
| 2104 | Example: | ||
| 2105 | |||
| 2106 | interrupt-controller@10c00 { | ||
| 2107 | #interrupt-cells = <2>; | ||
| 2108 | interrupt-controller; | ||
| 2109 | reg = <10c00 80>; | ||
| 2110 | compatible = "mpc8272-pic", "fsl,cpm2-pic"; | ||
| 2111 | }; | ||
| 2112 | |||
| 2113 | vii) USB (Universal Serial Bus Controller) | ||
| 2114 | |||
| 2115 | Properties: | ||
| 2116 | - compatible : "fsl,cpm1-usb", "fsl,cpm2-usb", "fsl,qe-usb" | ||
| 2117 | |||
| 2118 | Example: | ||
| 2119 | usb@11bc0 { | ||
| 2120 | #address-cells = <1>; | ||
| 2121 | #size-cells = <0>; | ||
| 2122 | compatible = "fsl,cpm2-usb"; | ||
| 2123 | reg = <11b60 18 8b00 100>; | ||
| 2124 | interrupts = <b 8>; | ||
| 2125 | interrupt-parent = <&PIC>; | ||
| 2126 | fsl,cpm-command = <2e600000>; | ||
| 2127 | }; | ||
| 2128 | |||
| 2129 | viii) Multi-User RAM (MURAM) | ||
| 2130 | |||
| 2131 | The multi-user/dual-ported RAM is expressed as a bus under the CPM node. | ||
| 2132 | |||
| 2133 | Ranges must be set up subject to the following restrictions: | ||
| 2134 | |||
| 2135 | - Children's reg nodes must be offsets from the start of all muram, even | ||
| 2136 | if the user-data area does not begin at zero. | ||
| 2137 | - If multiple range entries are used, the difference between the parent | ||
| 2138 | address and the child address must be the same in all, so that a single | ||
| 2139 | mapping can cover them all while maintaining the ability to determine | ||
| 2140 | CPM-side offsets with pointer subtraction. It is recommended that | ||
| 2141 | multiple range entries not be used. | ||
| 2142 | - A child address of zero must be translatable, even if no reg resources | ||
| 2143 | contain it. | ||
| 2144 | |||
| 2145 | A child "data" node must exist, compatible with "fsl,cpm-muram-data", to | ||
| 2146 | indicate the portion of muram that is usable by the OS for arbitrary | ||
| 2147 | purposes. The data node may have an arbitrary number of reg resources, | ||
| 2148 | all of which contribute to the allocatable muram pool. | ||
| 2149 | |||
| 2150 | Example, based on mpc8272: | ||
| 2151 | |||
| 2152 | muram@0 { | ||
| 2153 | #address-cells = <1>; | ||
| 2154 | #size-cells = <1>; | ||
| 2155 | ranges = <0 0 10000>; | ||
| 2156 | |||
| 2157 | data@0 { | ||
| 2158 | compatible = "fsl,cpm-muram-data"; | ||
| 2159 | reg = <0 2000 9800 800>; | ||
| 2160 | }; | ||
| 2161 | }; | ||
| 2162 | |||
| 2163 | m) Chipselect/Local Bus | ||
| 2164 | |||
| 2165 | Properties: | ||
| 2166 | - name : Should be localbus | ||
| 2167 | - #address-cells : Should be either two or three. The first cell is the | ||
| 2168 | chipselect number, and the remaining cells are the | ||
| 2169 | offset into the chipselect. | ||
| 2170 | - #size-cells : Either one or two, depending on how large each chipselect | ||
| 2171 | can be. | ||
| 2172 | - ranges : Each range corresponds to a single chipselect, and cover | ||
| 2173 | the entire access window as configured. | ||
| 2174 | |||
| 2175 | Example: | ||
| 2176 | localbus@f0010100 { | ||
| 2177 | compatible = "fsl,mpc8272-localbus", | ||
| 2178 | "fsl,pq2-localbus"; | ||
| 2179 | #address-cells = <2>; | ||
| 2180 | #size-cells = <1>; | ||
| 2181 | reg = <f0010100 40>; | ||
| 2182 | |||
| 2183 | ranges = <0 0 fe000000 02000000 | ||
| 2184 | 1 0 f4500000 00008000>; | ||
| 2185 | |||
| 2186 | flash@0,0 { | ||
| 2187 | compatible = "jedec-flash"; | ||
| 2188 | reg = <0 0 2000000>; | ||
| 2189 | bank-width = <4>; | ||
| 2190 | device-width = <1>; | ||
| 2191 | }; | ||
| 2192 | |||
| 2193 | board-control@1,0 { | ||
| 2194 | reg = <1 0 20>; | ||
| 2195 | compatible = "fsl,mpc8272ads-bcsr"; | ||
| 2196 | }; | ||
| 2197 | }; | ||
| 2198 | |||
| 2199 | |||
| 2200 | n) 4xx/Axon EMAC ethernet nodes | ||
| 2201 | 1351 | ||
| 2202 | The EMAC ethernet controller in IBM and AMCC 4xx chips, and also | 1352 | The EMAC ethernet controller in IBM and AMCC 4xx chips, and also |
| 2203 | the Axon bridge. To operate this needs to interact with a ths | 1353 | the Axon bridge. To operate this needs to interact with a ths |
| @@ -2345,7 +1495,7 @@ platforms are moved over to use the flattened-device-tree model. | |||
| 2345 | available. | 1495 | available. |
| 2346 | For Axon: 0x0000012a | 1496 | For Axon: 0x0000012a |
| 2347 | 1497 | ||
| 2348 | o) Xilinx IP cores | 1498 | e) Xilinx IP cores |
| 2349 | 1499 | ||
| 2350 | The Xilinx EDK toolchain ships with a set of IP cores (devices) for use | 1500 | The Xilinx EDK toolchain ships with a set of IP cores (devices) for use |
| 2351 | in Xilinx Spartan and Virtex FPGAs. The devices cover the whole range | 1501 | in Xilinx Spartan and Virtex FPGAs. The devices cover the whole range |
| @@ -2639,206 +1789,7 @@ platforms are moved over to use the flattened-device-tree model. | |||
| 2639 | - reg-offset : A value of 3 is required | 1789 | - reg-offset : A value of 3 is required |
| 2640 | - reg-shift : A value of 2 is required | 1790 | - reg-shift : A value of 2 is required |
| 2641 | 1791 | ||
| 2642 | 1792 | f) USB EHCI controllers | |
| 2643 | p) Freescale Synchronous Serial Interface | ||
| 2644 | |||
| 2645 | The SSI is a serial device that communicates with audio codecs. It can | ||
| 2646 | be programmed in AC97, I2S, left-justified, or right-justified modes. | ||
| 2647 | |||
| 2648 | Required properties: | ||
| 2649 | - compatible : compatible list, containing "fsl,ssi" | ||
| 2650 | - cell-index : the SSI, <0> = SSI1, <1> = SSI2, and so on | ||
| 2651 | - reg : offset and length of the register set for the device | ||
| 2652 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 2653 | field that represents an encoding of the sense and | ||
| 2654 | level information for the interrupt. This should be | ||
| 2655 | encoded based on the information in section 2) | ||
| 2656 | depending on the type of interrupt controller you | ||
| 2657 | have. | ||
| 2658 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 2659 | services interrupts for this device. | ||
| 2660 | - fsl,mode : the operating mode for the SSI interface | ||
| 2661 | "i2s-slave" - I2S mode, SSI is clock slave | ||
| 2662 | "i2s-master" - I2S mode, SSI is clock master | ||
| 2663 | "lj-slave" - left-justified mode, SSI is clock slave | ||
| 2664 | "lj-master" - l.j. mode, SSI is clock master | ||
| 2665 | "rj-slave" - right-justified mode, SSI is clock slave | ||
| 2666 | "rj-master" - r.j., SSI is clock master | ||
| 2667 | "ac97-slave" - AC97 mode, SSI is clock slave | ||
| 2668 | "ac97-master" - AC97 mode, SSI is clock master | ||
| 2669 | |||
| 2670 | Optional properties: | ||
| 2671 | - codec-handle : phandle to a 'codec' node that defines an audio | ||
| 2672 | codec connected to this SSI. This node is typically | ||
| 2673 | a child of an I2C or other control node. | ||
| 2674 | |||
| 2675 | Child 'codec' node required properties: | ||
| 2676 | - compatible : compatible list, contains the name of the codec | ||
| 2677 | |||
| 2678 | Child 'codec' node optional properties: | ||
| 2679 | - clock-frequency : The frequency of the input clock, which typically | ||
| 2680 | comes from an on-board dedicated oscillator. | ||
| 2681 | |||
| 2682 | * Freescale 83xx DMA Controller | ||
| 2683 | |||
| 2684 | Freescale PowerPC 83xx have on chip general purpose DMA controllers. | ||
| 2685 | |||
| 2686 | Required properties: | ||
| 2687 | |||
| 2688 | - compatible : compatible list, contains 2 entries, first is | ||
| 2689 | "fsl,CHIP-dma", where CHIP is the processor | ||
| 2690 | (mpc8349, mpc8360, etc.) and the second is | ||
| 2691 | "fsl,elo-dma" | ||
| 2692 | - reg : <registers mapping for DMA general status reg> | ||
| 2693 | - ranges : Should be defined as specified in 1) to describe the | ||
| 2694 | DMA controller channels. | ||
| 2695 | - cell-index : controller index. 0 for controller @ 0x8100 | ||
| 2696 | - interrupts : <interrupt mapping for DMA IRQ> | ||
| 2697 | - interrupt-parent : optional, if needed for interrupt mapping | ||
| 2698 | |||
| 2699 | |||
| 2700 | - DMA channel nodes: | ||
| 2701 | - compatible : compatible list, contains 2 entries, first is | ||
| 2702 | "fsl,CHIP-dma-channel", where CHIP is the processor | ||
| 2703 | (mpc8349, mpc8350, etc.) and the second is | ||
| 2704 | "fsl,elo-dma-channel" | ||
| 2705 | - reg : <registers mapping for channel> | ||
| 2706 | - cell-index : dma channel index starts at 0. | ||
| 2707 | |||
| 2708 | Optional properties: | ||
| 2709 | - interrupts : <interrupt mapping for DMA channel IRQ> | ||
| 2710 | (on 83xx this is expected to be identical to | ||
| 2711 | the interrupts property of the parent node) | ||
| 2712 | - interrupt-parent : optional, if needed for interrupt mapping | ||
| 2713 | |||
| 2714 | Example: | ||
| 2715 | dma@82a8 { | ||
| 2716 | #address-cells = <1>; | ||
| 2717 | #size-cells = <1>; | ||
| 2718 | compatible = "fsl,mpc8349-dma", "fsl,elo-dma"; | ||
| 2719 | reg = <82a8 4>; | ||
| 2720 | ranges = <0 8100 1a4>; | ||
| 2721 | interrupt-parent = <&ipic>; | ||
| 2722 | interrupts = <47 8>; | ||
| 2723 | cell-index = <0>; | ||
| 2724 | dma-channel@0 { | ||
| 2725 | compatible = "fsl,mpc8349-dma-channel", "fsl,elo-dma-channel"; | ||
| 2726 | cell-index = <0>; | ||
| 2727 | reg = <0 80>; | ||
| 2728 | }; | ||
| 2729 | dma-channel@80 { | ||
| 2730 | compatible = "fsl,mpc8349-dma-channel", "fsl,elo-dma-channel"; | ||
| 2731 | cell-index = <1>; | ||
| 2732 | reg = <80 80>; | ||
| 2733 | }; | ||
| 2734 | dma-channel@100 { | ||
| 2735 | compatible = "fsl,mpc8349-dma-channel", "fsl,elo-dma-channel"; | ||
| 2736 | cell-index = <2>; | ||
| 2737 | reg = <100 80>; | ||
| 2738 | }; | ||
| 2739 | dma-channel@180 { | ||
| 2740 | compatible = "fsl,mpc8349-dma-channel", "fsl,elo-dma-channel"; | ||
| 2741 | cell-index = <3>; | ||
| 2742 | reg = <180 80>; | ||
| 2743 | }; | ||
| 2744 | }; | ||
| 2745 | |||
| 2746 | * Freescale 85xx/86xx DMA Controller | ||
| 2747 | |||
| 2748 | Freescale PowerPC 85xx/86xx have on chip general purpose DMA controllers. | ||
| 2749 | |||
| 2750 | Required properties: | ||
| 2751 | |||
| 2752 | - compatible : compatible list, contains 2 entries, first is | ||
| 2753 | "fsl,CHIP-dma", where CHIP is the processor | ||
| 2754 | (mpc8540, mpc8540, etc.) and the second is | ||
| 2755 | "fsl,eloplus-dma" | ||
| 2756 | - reg : <registers mapping for DMA general status reg> | ||
| 2757 | - cell-index : controller index. 0 for controller @ 0x21000, | ||
| 2758 | 1 for controller @ 0xc000 | ||
| 2759 | - ranges : Should be defined as specified in 1) to describe the | ||
| 2760 | DMA controller channels. | ||
| 2761 | |||
| 2762 | - DMA channel nodes: | ||
| 2763 | - compatible : compatible list, contains 2 entries, first is | ||
| 2764 | "fsl,CHIP-dma-channel", where CHIP is the processor | ||
| 2765 | (mpc8540, mpc8560, etc.) and the second is | ||
| 2766 | "fsl,eloplus-dma-channel" | ||
| 2767 | - cell-index : dma channel index starts at 0. | ||
| 2768 | - reg : <registers mapping for channel> | ||
| 2769 | - interrupts : <interrupt mapping for DMA channel IRQ> | ||
| 2770 | - interrupt-parent : optional, if needed for interrupt mapping | ||
| 2771 | |||
| 2772 | Example: | ||
| 2773 | dma@21300 { | ||
| 2774 | #address-cells = <1>; | ||
| 2775 | #size-cells = <1>; | ||
| 2776 | compatible = "fsl,mpc8540-dma", "fsl,eloplus-dma"; | ||
| 2777 | reg = <21300 4>; | ||
| 2778 | ranges = <0 21100 200>; | ||
| 2779 | cell-index = <0>; | ||
| 2780 | dma-channel@0 { | ||
| 2781 | compatible = "fsl,mpc8540-dma-channel", "fsl,eloplus-dma-channel"; | ||
| 2782 | reg = <0 80>; | ||
| 2783 | cell-index = <0>; | ||
| 2784 | interrupt-parent = <&mpic>; | ||
| 2785 | interrupts = <14 2>; | ||
| 2786 | }; | ||
| 2787 | dma-channel@80 { | ||
| 2788 | compatible = "fsl,mpc8540-dma-channel", "fsl,eloplus-dma-channel"; | ||
| 2789 | reg = <80 80>; | ||
| 2790 | cell-index = <1>; | ||
| 2791 | interrupt-parent = <&mpic>; | ||
| 2792 | interrupts = <15 2>; | ||
| 2793 | }; | ||
| 2794 | dma-channel@100 { | ||
| 2795 | compatible = "fsl,mpc8540-dma-channel", "fsl,eloplus-dma-channel"; | ||
| 2796 | reg = <100 80>; | ||
| 2797 | cell-index = <2>; | ||
| 2798 | interrupt-parent = <&mpic>; | ||
| 2799 | interrupts = <16 2>; | ||
| 2800 | }; | ||
| 2801 | dma-channel@180 { | ||
| 2802 | compatible = "fsl,mpc8540-dma-channel", "fsl,eloplus-dma-channel"; | ||
| 2803 | reg = <180 80>; | ||
| 2804 | cell-index = <3>; | ||
| 2805 | interrupt-parent = <&mpic>; | ||
| 2806 | interrupts = <17 2>; | ||
| 2807 | }; | ||
| 2808 | }; | ||
| 2809 | |||
| 2810 | * Freescale 8xxx/3.0 Gb/s SATA nodes | ||
| 2811 | |||
| 2812 | SATA nodes are defined to describe on-chip Serial ATA controllers. | ||
| 2813 | Each SATA port should have its own node. | ||
| 2814 | |||
| 2815 | Required properties: | ||
| 2816 | - compatible : compatible list, contains 2 entries, first is | ||
| 2817 | "fsl,CHIP-sata", where CHIP is the processor | ||
| 2818 | (mpc8315, mpc8379, etc.) and the second is | ||
| 2819 | "fsl,pq-sata" | ||
| 2820 | - interrupts : <interrupt mapping for SATA IRQ> | ||
| 2821 | - cell-index : controller index. | ||
| 2822 | 1 for controller @ 0x18000 | ||
| 2823 | 2 for controller @ 0x19000 | ||
| 2824 | 3 for controller @ 0x1a000 | ||
| 2825 | 4 for controller @ 0x1b000 | ||
| 2826 | |||
| 2827 | Optional properties: | ||
| 2828 | - interrupt-parent : optional, if needed for interrupt mapping | ||
| 2829 | - reg : <registers mapping> | ||
| 2830 | |||
| 2831 | Example: | ||
| 2832 | |||
| 2833 | sata@18000 { | ||
| 2834 | compatible = "fsl,mpc8379-sata", "fsl,pq-sata"; | ||
| 2835 | reg = <0x18000 0x1000>; | ||
| 2836 | cell-index = <1>; | ||
| 2837 | interrupts = <2c 8>; | ||
| 2838 | interrupt-parent = < &ipic >; | ||
| 2839 | }; | ||
| 2840 | |||
| 2841 | q) USB EHCI controllers | ||
| 2842 | 1793 | ||
| 2843 | Required properties: | 1794 | Required properties: |
| 2844 | - compatible : should be "usb-ehci". | 1795 | - compatible : should be "usb-ehci". |
| @@ -2864,109 +1815,6 @@ platforms are moved over to use the flattened-device-tree model. | |||
| 2864 | big-endian; | 1815 | big-endian; |
| 2865 | }; | 1816 | }; |
| 2866 | 1817 | ||
| 2867 | r) Freescale Display Interface Unit | ||
| 2868 | |||
| 2869 | The Freescale DIU is a LCD controller, with proper hardware, it can also | ||
| 2870 | drive DVI monitors. | ||
| 2871 | |||
| 2872 | Required properties: | ||
| 2873 | - compatible : should be "fsl-diu". | ||
| 2874 | - reg : should contain at least address and length of the DIU register | ||
| 2875 | set. | ||
| 2876 | - Interrupts : one DIU interrupt should be describe here. | ||
| 2877 | |||
| 2878 | Example (MPC8610HPCD) | ||
| 2879 | display@2c000 { | ||
| 2880 | compatible = "fsl,diu"; | ||
| 2881 | reg = <0x2c000 100>; | ||
| 2882 | interrupts = <72 2>; | ||
| 2883 | interrupt-parent = <&mpic>; | ||
| 2884 | }; | ||
| 2885 | |||
| 2886 | s) Freescale on board FPGA | ||
| 2887 | |||
| 2888 | This is the memory-mapped registers for on board FPGA. | ||
| 2889 | |||
| 2890 | Required properities: | ||
| 2891 | - compatible : should be "fsl,fpga-pixis". | ||
| 2892 | - reg : should contain the address and the lenght of the FPPGA register | ||
| 2893 | set. | ||
| 2894 | |||
| 2895 | Example (MPC8610HPCD) | ||
| 2896 | board-control@e8000000 { | ||
| 2897 | compatible = "fsl,fpga-pixis"; | ||
| 2898 | reg = <0xe8000000 32>; | ||
| 2899 | }; | ||
| 2900 | |||
| 2901 | t) Freescale MSI interrupt controller | ||
| 2902 | |||
| 2903 | Reguired properities: | ||
| 2904 | - compatible : compatible list, contains 2 entries, | ||
| 2905 | first is "fsl,CHIP-msi", where CHIP is the processor(mpc8610, mpc8572, | ||
| 2906 | etc.) and the second is "fsl,mpic-msi" or "fsl,ipic-msi" depending on | ||
| 2907 | the parent type. | ||
| 2908 | - reg : should contain the address and the length of the shared message | ||
| 2909 | interrupt register set. | ||
| 2910 | - msi-available-ranges: use <start count> style section to define which | ||
| 2911 | msi interrupt can be used in the 256 msi interrupts. This property is | ||
| 2912 | optional, without this, all the 256 MSI interrupts can be used. | ||
| 2913 | - interrupts : each one of the interrupts here is one entry per 32 MSIs, | ||
| 2914 | and routed to the host interrupt controller. the interrupts should | ||
| 2915 | be set as edge sensitive. | ||
| 2916 | - interrupt-parent: the phandle for the interrupt controller | ||
| 2917 | that services interrupts for this device. for 83xx cpu, the interrupts | ||
| 2918 | are routed to IPIC, and for 85xx/86xx cpu the interrupts are routed | ||
| 2919 | to MPIC. | ||
| 2920 | |||
| 2921 | Example | ||
| 2922 | msi@41600 { | ||
| 2923 | compatible = "fsl,mpc8610-msi", "fsl,mpic-msi"; | ||
| 2924 | reg = <0x41600 0x80>; | ||
| 2925 | msi-available-ranges = <0 0x100>; | ||
| 2926 | interrupts = < | ||
| 2927 | 0xe0 0 | ||
| 2928 | 0xe1 0 | ||
| 2929 | 0xe2 0 | ||
| 2930 | 0xe3 0 | ||
| 2931 | 0xe4 0 | ||
| 2932 | 0xe5 0 | ||
| 2933 | 0xe6 0 | ||
| 2934 | 0xe7 0>; | ||
| 2935 | interrupt-parent = <&mpic>; | ||
| 2936 | }; | ||
| 2937 | |||
| 2938 | u) Freescale General-purpose Timers Module | ||
| 2939 | |||
| 2940 | Required properties: | ||
| 2941 | - compatible : should be | ||
| 2942 | "fsl,<chip>-gtm", "fsl,gtm" for SOC GTMs | ||
| 2943 | "fsl,<chip>-qe-gtm", "fsl,qe-gtm", "fsl,gtm" for QE GTMs | ||
| 2944 | "fsl,<chip>-cpm2-gtm", "fsl,cpm2-gtm", "fsl,gtm" for CPM2 GTMs | ||
| 2945 | - reg : should contain gtm registers location and length (0x40). | ||
| 2946 | - interrupts : should contain four interrupts. | ||
| 2947 | - interrupt-parent : interrupt source phandle. | ||
| 2948 | - clock-frequency : specifies the frequency driving the timer. | ||
| 2949 | |||
| 2950 | Example: | ||
| 2951 | |||
| 2952 | timer@500 { | ||
| 2953 | compatible = "fsl,mpc8360-gtm", "fsl,gtm"; | ||
| 2954 | reg = <0x500 0x40>; | ||
| 2955 | interrupts = <90 8 78 8 84 8 72 8>; | ||
| 2956 | interrupt-parent = <&ipic>; | ||
| 2957 | /* filled by u-boot */ | ||
| 2958 | clock-frequency = <0>; | ||
| 2959 | }; | ||
| 2960 | |||
| 2961 | timer@440 { | ||
| 2962 | compatible = "fsl,mpc8360-qe-gtm", "fsl,qe-gtm", "fsl,gtm"; | ||
| 2963 | reg = <0x440 0x40>; | ||
| 2964 | interrupts = <12 13 14 15>; | ||
| 2965 | interrupt-parent = <&qeic>; | ||
| 2966 | /* filled by u-boot */ | ||
| 2967 | clock-frequency = <0>; | ||
| 2968 | }; | ||
| 2969 | |||
| 2970 | VII - Marvell Discovery mv64[345]6x System Controller chips | 1818 | VII - Marvell Discovery mv64[345]6x System Controller chips |
| 2971 | =========================================================== | 1819 | =========================================================== |
| 2972 | 1820 | ||
diff --git a/Documentation/powerpc/bootwrapper.txt b/Documentation/powerpc/bootwrapper.txt new file mode 100644 index 000000000000..d60fced5e1cc --- /dev/null +++ b/Documentation/powerpc/bootwrapper.txt | |||
| @@ -0,0 +1,141 @@ | |||
| 1 | The PowerPC boot wrapper | ||
| 2 | ------------------------ | ||
| 3 | Copyright (C) Secret Lab Technologies Ltd. | ||
| 4 | |||
| 5 | PowerPC image targets compresses and wraps the kernel image (vmlinux) with | ||
| 6 | a boot wrapper to make it usable by the system firmware. There is no | ||
| 7 | standard PowerPC firmware interface, so the boot wrapper is designed to | ||
| 8 | be adaptable for each kind of image that needs to be built. | ||
| 9 | |||
| 10 | The boot wrapper can be found in the arch/powerpc/boot/ directory. The | ||
| 11 | Makefile in that directory has targets for all the available image types. | ||
| 12 | The different image types are used to support all of the various firmware | ||
| 13 | interfaces found on PowerPC platforms. OpenFirmware is the most commonly | ||
| 14 | used firmware type on general purpose PowerPC systems from Apple, IBM and | ||
| 15 | others. U-Boot is typically found on embedded PowerPC hardware, but there | ||
| 16 | are a handful of other firmware implementations which are also popular. Each | ||
| 17 | firmware interface requires a different image format. | ||
| 18 | |||
| 19 | The boot wrapper is built from the makefile in arch/powerpc/boot/Makefile and | ||
| 20 | it uses the wrapper script (arch/powerpc/boot/wrapper) to generate target | ||
| 21 | image. The details of the build system is discussed in the next section. | ||
| 22 | Currently, the following image format targets exist: | ||
| 23 | |||
| 24 | cuImage.%: Backwards compatible uImage for older version of | ||
| 25 | U-Boot (for versions that don't understand the device | ||
| 26 | tree). This image embeds a device tree blob inside | ||
| 27 | the image. The boot wrapper, kernel and device tree | ||
| 28 | are all embedded inside the U-Boot uImage file format | ||
| 29 | with boot wrapper code that extracts data from the old | ||
| 30 | bd_info structure and loads the data into the device | ||
| 31 | tree before jumping into the kernel. | ||
| 32 | Because of the series of #ifdefs found in the | ||
| 33 | bd_info structure used in the old U-Boot interfaces, | ||
| 34 | cuImages are platform specific. Each specific | ||
| 35 | U-Boot platform has a different platform init file | ||
| 36 | which populates the embedded device tree with data | ||
| 37 | from the platform specific bd_info file. The platform | ||
| 38 | specific cuImage platform init code can be found in | ||
| 39 | arch/powerpc/boot/cuboot.*.c. Selection of the correct | ||
| 40 | cuImage init code for a specific board can be found in | ||
| 41 | the wrapper structure. | ||
| 42 | dtbImage.%: Similar to zImage, except device tree blob is embedded | ||
| 43 | inside the image instead of provided by firmware. The | ||
| 44 | output image file can be either an elf file or a flat | ||
| 45 | binary depending on the platform. | ||
| 46 | dtbImages are used on systems which do not have an | ||
| 47 | interface for passing a device tree directly. | ||
| 48 | dtbImages are similar to simpleImages except that | ||
| 49 | dtbImages have platform specific code for extracting | ||
| 50 | data from the board firmware, but simpleImages do not | ||
| 51 | talk to the firmware at all. | ||
| 52 | PlayStation 3 support uses dtbImage. So do Embedded | ||
| 53 | Planet boards using the PlanetCore firmware. Board | ||
| 54 | specific initialization code is typically found in a | ||
| 55 | file named arch/powerpc/boot/<platform>.c; but this | ||
| 56 | can be overridden by the wrapper script. | ||
| 57 | simpleImage.%: Firmware independent compressed image that does not | ||
| 58 | depend on any particular firmware interface and embeds | ||
| 59 | a device tree blob. This image is a flat binary that | ||
| 60 | can be loaded to any location in RAM and jumped to. | ||
| 61 | Firmware cannot pass any configuration data to the | ||
| 62 | kernel with this image type and it depends entirely on | ||
| 63 | the embedded device tree for all information. | ||
| 64 | The simpleImage is useful for booting systems with | ||
| 65 | an unknown firmware interface or for booting from | ||
| 66 | a debugger when no firmware is present (such as on | ||
| 67 | the Xilinx Virtex platform). The only assumption that | ||
| 68 | simpleImage makes is that RAM is correctly initialized | ||
| 69 | and that the MMU is either off or has RAM mapped to | ||
| 70 | base address 0. | ||
| 71 | simpleImage also supports inserting special platform | ||
| 72 | specific initialization code to the start of the bootup | ||
| 73 | sequence. The virtex405 platform uses this feature to | ||
| 74 | ensure that the cache is invalidated before caching | ||
| 75 | is enabled. Platform specific initialization code is | ||
| 76 | added as part of the wrapper script and is keyed on | ||
| 77 | the image target name. For example, all | ||
| 78 | simpleImage.virtex405-* targets will add the | ||
| 79 | virtex405-head.S initialization code (This also means | ||
| 80 | that the dts file for virtex405 targets should be | ||
| 81 | named (virtex405-<board>.dts). Search the wrapper | ||
| 82 | script for 'virtex405' and see the file | ||
| 83 | arch/powerpc/boot/virtex405-head.S for details. | ||
| 84 | treeImage.%; Image format for used with OpenBIOS firmware found | ||
| 85 | on some ppc4xx hardware. This image embeds a device | ||
| 86 | tree blob inside the image. | ||
| 87 | uImage: Native image format used by U-Boot. The uImage target | ||
| 88 | does not add any boot code. It just wraps a compressed | ||
| 89 | vmlinux in the uImage data structure. This image | ||
| 90 | requires a version of U-Boot that is able to pass | ||
| 91 | a device tree to the kernel at boot. If using an older | ||
| 92 | version of U-Boot, then you need to use a cuImage | ||
| 93 | instead. | ||
| 94 | zImage.%: Image format which does not embed a device tree. | ||
| 95 | Used by OpenFirmware and other firmware interfaces | ||
| 96 | which are able to supply a device tree. This image | ||
| 97 | expects firmware to provide the device tree at boot. | ||
| 98 | Typically, if you have general purpose PowerPC | ||
| 99 | hardware then you want this image format. | ||
| 100 | |||
| 101 | Image types which embed a device tree blob (simpleImage, dtbImage, treeImage, | ||
| 102 | and cuImage) all generate the device tree blob from a file in the | ||
| 103 | arch/powerpc/boot/dts/ directory. The Makefile selects the correct device | ||
| 104 | tree source based on the name of the target. Therefore, if the kernel is | ||
| 105 | built with 'make treeImage.walnut simpleImage.virtex405-ml403', then the | ||
| 106 | build system will use arch/powerpc/boot/dts/walnut.dts to build | ||
| 107 | treeImage.walnut and arch/powerpc/boot/dts/virtex405-ml403.dts to build | ||
| 108 | the simpleImage.virtex405-ml403. | ||
| 109 | |||
| 110 | Two special targets called 'zImage' and 'zImage.initrd' also exist. These | ||
| 111 | targets build all the default images as selected by the kernel configuration. | ||
| 112 | Default images are selected by the boot wrapper Makefile | ||
| 113 | (arch/powerpc/boot/Makefile) by adding targets to the $image-y variable. Look | ||
| 114 | at the Makefile to see which default image targets are available. | ||
| 115 | |||
| 116 | How it is built | ||
| 117 | --------------- | ||
| 118 | arch/powerpc is designed to support multiplatform kernels, which means | ||
| 119 | that a single vmlinux image can be booted on many different target boards. | ||
| 120 | It also means that the boot wrapper must be able to wrap for many kinds of | ||
| 121 | images on a single build. The design decision was made to not use any | ||
| 122 | conditional compilation code (#ifdef, etc) in the boot wrapper source code. | ||
| 123 | All of the boot wrapper pieces are buildable at any time regardless of the | ||
| 124 | kernel configuration. Building all the wrapper bits on every kernel build | ||
| 125 | also ensures that obscure parts of the wrapper are at the very least compile | ||
| 126 | tested in a large variety of environments. | ||
| 127 | |||
| 128 | The wrapper is adapted for different image types at link time by linking in | ||
| 129 | just the wrapper bits that are appropriate for the image type. The 'wrapper | ||
| 130 | script' (found in arch/powerpc/boot/wrapper) is called by the Makefile and | ||
| 131 | is responsible for selecting the correct wrapper bits for the image type. | ||
| 132 | The arguments are well documented in the script's comment block, so they | ||
| 133 | are not repeated here. However, it is worth mentioning that the script | ||
| 134 | uses the -p (platform) argument as the main method of deciding which wrapper | ||
| 135 | bits to compile in. Look for the large 'case "$platform" in' block in the | ||
| 136 | middle of the script. This is also the place where platform specific fixups | ||
| 137 | can be selected by changing the link order. | ||
| 138 | |||
| 139 | In particular, care should be taken when working with cuImages. cuImage | ||
| 140 | wrapper bits are very board specific and care should be taken to make sure | ||
| 141 | the target you are trying to build is supported by the wrapper bits. | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/board.txt b/Documentation/powerpc/dts-bindings/fsl/board.txt new file mode 100644 index 000000000000..74ae6f1cd2d6 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/board.txt | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | * Board Control and Status (BCSR) | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | |||
| 5 | - device_type : Should be "board-control" | ||
| 6 | - reg : Offset and length of the register set for the device | ||
| 7 | |||
| 8 | Example: | ||
| 9 | |||
| 10 | bcsr@f8000000 { | ||
| 11 | device_type = "board-control"; | ||
| 12 | reg = <f8000000 8000>; | ||
| 13 | }; | ||
| 14 | |||
| 15 | * Freescale on board FPGA | ||
| 16 | |||
| 17 | This is the memory-mapped registers for on board FPGA. | ||
| 18 | |||
| 19 | Required properities: | ||
| 20 | - compatible : should be "fsl,fpga-pixis". | ||
| 21 | - reg : should contain the address and the lenght of the FPPGA register | ||
| 22 | set. | ||
| 23 | |||
| 24 | Example (MPC8610HPCD): | ||
| 25 | |||
| 26 | board-control@e8000000 { | ||
| 27 | compatible = "fsl,fpga-pixis"; | ||
| 28 | reg = <0xe8000000 32>; | ||
| 29 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm.txt b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm.txt new file mode 100644 index 000000000000..088fc471e03a --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm.txt | |||
| @@ -0,0 +1,67 @@ | |||
| 1 | * Freescale Communications Processor Module | ||
| 2 | |||
| 3 | NOTE: This is an interim binding, and will likely change slightly, | ||
| 4 | as more devices are supported. The QE bindings especially are | ||
| 5 | incomplete. | ||
| 6 | |||
| 7 | * Root CPM node | ||
| 8 | |||
| 9 | Properties: | ||
| 10 | - compatible : "fsl,cpm1", "fsl,cpm2", or "fsl,qe". | ||
| 11 | - reg : A 48-byte region beginning with CPCR. | ||
| 12 | |||
| 13 | Example: | ||
| 14 | cpm@119c0 { | ||
| 15 | #address-cells = <1>; | ||
| 16 | #size-cells = <1>; | ||
| 17 | #interrupt-cells = <2>; | ||
| 18 | compatible = "fsl,mpc8272-cpm", "fsl,cpm2"; | ||
| 19 | reg = <119c0 30>; | ||
| 20 | } | ||
| 21 | |||
| 22 | * Properties common to mulitple CPM/QE devices | ||
| 23 | |||
| 24 | - fsl,cpm-command : This value is ORed with the opcode and command flag | ||
| 25 | to specify the device on which a CPM command operates. | ||
| 26 | |||
| 27 | - fsl,cpm-brg : Indicates which baud rate generator the device | ||
| 28 | is associated with. If absent, an unused BRG | ||
| 29 | should be dynamically allocated. If zero, the | ||
| 30 | device uses an external clock rather than a BRG. | ||
| 31 | |||
| 32 | - reg : Unless otherwise specified, the first resource represents the | ||
| 33 | scc/fcc/ucc registers, and the second represents the device's | ||
| 34 | parameter RAM region (if it has one). | ||
| 35 | |||
| 36 | * Multi-User RAM (MURAM) | ||
| 37 | |||
| 38 | The multi-user/dual-ported RAM is expressed as a bus under the CPM node. | ||
| 39 | |||
| 40 | Ranges must be set up subject to the following restrictions: | ||
| 41 | |||
| 42 | - Children's reg nodes must be offsets from the start of all muram, even | ||
| 43 | if the user-data area does not begin at zero. | ||
| 44 | - If multiple range entries are used, the difference between the parent | ||
| 45 | address and the child address must be the same in all, so that a single | ||
| 46 | mapping can cover them all while maintaining the ability to determine | ||
| 47 | CPM-side offsets with pointer subtraction. It is recommended that | ||
| 48 | multiple range entries not be used. | ||
| 49 | - A child address of zero must be translatable, even if no reg resources | ||
| 50 | contain it. | ||
| 51 | |||
| 52 | A child "data" node must exist, compatible with "fsl,cpm-muram-data", to | ||
| 53 | indicate the portion of muram that is usable by the OS for arbitrary | ||
| 54 | purposes. The data node may have an arbitrary number of reg resources, | ||
| 55 | all of which contribute to the allocatable muram pool. | ||
| 56 | |||
| 57 | Example, based on mpc8272: | ||
| 58 | muram@0 { | ||
| 59 | #address-cells = <1>; | ||
| 60 | #size-cells = <1>; | ||
| 61 | ranges = <0 0 10000>; | ||
| 62 | |||
| 63 | data@0 { | ||
| 64 | compatible = "fsl,cpm-muram-data"; | ||
| 65 | reg = <0 2000 9800 800>; | ||
| 66 | }; | ||
| 67 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm/brg.txt b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm/brg.txt new file mode 100644 index 000000000000..4c7d45eaf025 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm/brg.txt | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | * Baud Rate Generators | ||
| 2 | |||
| 3 | Currently defined compatibles: | ||
| 4 | fsl,cpm-brg | ||
| 5 | fsl,cpm1-brg | ||
| 6 | fsl,cpm2-brg | ||
| 7 | |||
| 8 | Properties: | ||
| 9 | - reg : There may be an arbitrary number of reg resources; BRG | ||
| 10 | numbers are assigned to these in order. | ||
| 11 | - clock-frequency : Specifies the base frequency driving | ||
| 12 | the BRG. | ||
| 13 | |||
| 14 | Example: | ||
| 15 | brg@119f0 { | ||
| 16 | compatible = "fsl,mpc8272-brg", | ||
| 17 | "fsl,cpm2-brg", | ||
| 18 | "fsl,cpm-brg"; | ||
| 19 | reg = <119f0 10 115f0 10>; | ||
| 20 | clock-frequency = <d#25000000>; | ||
| 21 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm/i2c.txt b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm/i2c.txt new file mode 100644 index 000000000000..87bc6048667e --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm/i2c.txt | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | * I2C | ||
| 2 | |||
| 3 | The I2C controller is expressed as a bus under the CPM node. | ||
| 4 | |||
| 5 | Properties: | ||
| 6 | - compatible : "fsl,cpm1-i2c", "fsl,cpm2-i2c" | ||
| 7 | - reg : On CPM2 devices, the second resource doesn't specify the I2C | ||
| 8 | Parameter RAM itself, but the I2C_BASE field of the CPM2 Parameter RAM | ||
| 9 | (typically 0x8afc 0x2). | ||
| 10 | - #address-cells : Should be one. The cell is the i2c device address with | ||
| 11 | the r/w bit set to zero. | ||
| 12 | - #size-cells : Should be zero. | ||
| 13 | - clock-frequency : Can be used to set the i2c clock frequency. If | ||
| 14 | unspecified, a default frequency of 60kHz is being used. | ||
| 15 | The following two properties are deprecated. They are only used by legacy | ||
| 16 | i2c drivers to find the bus to probe: | ||
| 17 | - linux,i2c-index : Can be used to hard code an i2c bus number. By default, | ||
| 18 | the bus number is dynamically assigned by the i2c core. | ||
| 19 | - linux,i2c-class : Can be used to override the i2c class. The class is used | ||
| 20 | by legacy i2c device drivers to find a bus in a specific context like | ||
| 21 | system management, video or sound. By default, I2C_CLASS_HWMON (1) is | ||
| 22 | being used. The definition of the classes can be found in | ||
| 23 | include/i2c/i2c.h | ||
| 24 | |||
| 25 | Example, based on mpc823: | ||
| 26 | |||
| 27 | i2c@860 { | ||
| 28 | compatible = "fsl,mpc823-i2c", | ||
| 29 | "fsl,cpm1-i2c"; | ||
| 30 | reg = <0x860 0x20 0x3c80 0x30>; | ||
| 31 | interrupts = <16>; | ||
| 32 | interrupt-parent = <&CPM_PIC>; | ||
| 33 | fsl,cpm-command = <0x10>; | ||
| 34 | #address-cells = <1>; | ||
| 35 | #size-cells = <0>; | ||
| 36 | |||
| 37 | rtc@68 { | ||
| 38 | compatible = "dallas,ds1307"; | ||
| 39 | reg = <0x68>; | ||
| 40 | }; | ||
| 41 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm/pic.txt b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm/pic.txt new file mode 100644 index 000000000000..8e3ee1681618 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm/pic.txt | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | * Interrupt Controllers | ||
| 2 | |||
| 3 | Currently defined compatibles: | ||
| 4 | - fsl,cpm1-pic | ||
| 5 | - only one interrupt cell | ||
| 6 | - fsl,pq1-pic | ||
| 7 | - fsl,cpm2-pic | ||
| 8 | - second interrupt cell is level/sense: | ||
| 9 | - 2 is falling edge | ||
| 10 | - 8 is active low | ||
| 11 | |||
| 12 | Example: | ||
| 13 | interrupt-controller@10c00 { | ||
| 14 | #interrupt-cells = <2>; | ||
| 15 | interrupt-controller; | ||
| 16 | reg = <10c00 80>; | ||
| 17 | compatible = "mpc8272-pic", "fsl,cpm2-pic"; | ||
| 18 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm/usb.txt b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm/usb.txt new file mode 100644 index 000000000000..74bfda4bb824 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm/usb.txt | |||
| @@ -0,0 +1,15 @@ | |||
| 1 | * USB (Universal Serial Bus Controller) | ||
| 2 | |||
| 3 | Properties: | ||
| 4 | - compatible : "fsl,cpm1-usb", "fsl,cpm2-usb", "fsl,qe-usb" | ||
| 5 | |||
| 6 | Example: | ||
| 7 | usb@11bc0 { | ||
| 8 | #address-cells = <1>; | ||
| 9 | #size-cells = <0>; | ||
| 10 | compatible = "fsl,cpm2-usb"; | ||
| 11 | reg = <11b60 18 8b00 100>; | ||
| 12 | interrupts = <b 8>; | ||
| 13 | interrupt-parent = <&PIC>; | ||
| 14 | fsl,cpm-command = <2e600000>; | ||
| 15 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/cpm_qe/network.txt b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/network.txt new file mode 100644 index 000000000000..0e4269446580 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/network.txt | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | * Network | ||
| 2 | |||
| 3 | Currently defined compatibles: | ||
| 4 | - fsl,cpm1-scc-enet | ||
| 5 | - fsl,cpm2-scc-enet | ||
| 6 | - fsl,cpm1-fec-enet | ||
| 7 | - fsl,cpm2-fcc-enet (third resource is GFEMR) | ||
| 8 | - fsl,qe-enet | ||
| 9 | |||
| 10 | Example: | ||
| 11 | |||
| 12 | ethernet@11300 { | ||
| 13 | device_type = "network"; | ||
| 14 | compatible = "fsl,mpc8272-fcc-enet", | ||
| 15 | "fsl,cpm2-fcc-enet"; | ||
| 16 | reg = <11300 20 8400 100 11390 1>; | ||
| 17 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
| 18 | interrupts = <20 8>; | ||
| 19 | interrupt-parent = <&PIC>; | ||
| 20 | phy-handle = <&PHY0>; | ||
| 21 | fsl,cpm-command = <12000300>; | ||
| 22 | }; | ||
| 23 | |||
| 24 | * MDIO | ||
| 25 | |||
| 26 | Currently defined compatibles: | ||
| 27 | fsl,pq1-fec-mdio (reg is same as first resource of FEC device) | ||
| 28 | fsl,cpm2-mdio-bitbang (reg is port C registers) | ||
| 29 | |||
| 30 | Properties for fsl,cpm2-mdio-bitbang: | ||
| 31 | fsl,mdio-pin : pin of port C controlling mdio data | ||
| 32 | fsl,mdc-pin : pin of port C controlling mdio clock | ||
| 33 | |||
| 34 | Example: | ||
| 35 | mdio@10d40 { | ||
| 36 | device_type = "mdio"; | ||
| 37 | compatible = "fsl,mpc8272ads-mdio-bitbang", | ||
| 38 | "fsl,mpc8272-mdio-bitbang", | ||
| 39 | "fsl,cpm2-mdio-bitbang"; | ||
| 40 | reg = <10d40 14>; | ||
| 41 | #address-cells = <1>; | ||
| 42 | #size-cells = <0>; | ||
| 43 | fsl,mdio-pin = <12>; | ||
| 44 | fsl,mdc-pin = <13>; | ||
| 45 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe.txt b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe.txt new file mode 100644 index 000000000000..78790d58dc2c --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe.txt | |||
| @@ -0,0 +1,58 @@ | |||
| 1 | * Freescale QUICC Engine module (QE) | ||
| 2 | This represents qe module that is installed on PowerQUICC II Pro. | ||
| 3 | |||
| 4 | NOTE: This is an interim binding; it should be updated to fit | ||
| 5 | in with the CPM binding later in this document. | ||
| 6 | |||
| 7 | Basically, it is a bus of devices, that could act more or less | ||
| 8 | as a complete entity (UCC, USB etc ). All of them should be siblings on | ||
| 9 | the "root" qe node, using the common properties from there. | ||
| 10 | The description below applies to the qe of MPC8360 and | ||
| 11 | more nodes and properties would be extended in the future. | ||
| 12 | |||
| 13 | i) Root QE device | ||
| 14 | |||
| 15 | Required properties: | ||
| 16 | - compatible : should be "fsl,qe"; | ||
| 17 | - model : precise model of the QE, Can be "QE", "CPM", or "CPM2" | ||
| 18 | - reg : offset and length of the device registers. | ||
| 19 | - bus-frequency : the clock frequency for QUICC Engine. | ||
| 20 | |||
| 21 | Recommended properties | ||
| 22 | - brg-frequency : the internal clock source frequency for baud-rate | ||
| 23 | generators in Hz. | ||
| 24 | |||
| 25 | Example: | ||
| 26 | qe@e0100000 { | ||
| 27 | #address-cells = <1>; | ||
| 28 | #size-cells = <1>; | ||
| 29 | #interrupt-cells = <2>; | ||
| 30 | compatible = "fsl,qe"; | ||
| 31 | ranges = <0 e0100000 00100000>; | ||
| 32 | reg = <e0100000 480>; | ||
| 33 | brg-frequency = <0>; | ||
| 34 | bus-frequency = <179A7B00>; | ||
| 35 | } | ||
| 36 | |||
| 37 | * Multi-User RAM (MURAM) | ||
| 38 | |||
| 39 | Required properties: | ||
| 40 | - compatible : should be "fsl,qe-muram", "fsl,cpm-muram". | ||
| 41 | - mode : the could be "host" or "slave". | ||
| 42 | - ranges : Should be defined as specified in 1) to describe the | ||
| 43 | translation of MURAM addresses. | ||
| 44 | - data-only : sub-node which defines the address area under MURAM | ||
| 45 | bus that can be allocated as data/parameter | ||
| 46 | |||
| 47 | Example: | ||
| 48 | |||
| 49 | muram@10000 { | ||
| 50 | compatible = "fsl,qe-muram", "fsl,cpm-muram"; | ||
| 51 | ranges = <0 00010000 0000c000>; | ||
| 52 | |||
| 53 | data-only@0{ | ||
| 54 | compatible = "fsl,qe-muram-data", | ||
| 55 | "fsl,cpm-muram-data"; | ||
| 56 | reg = <0 c000>; | ||
| 57 | }; | ||
| 58 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/firmware.txt b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/firmware.txt new file mode 100644 index 000000000000..6c238f59b2a9 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/firmware.txt | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | * Uploaded QE firmware | ||
| 2 | |||
| 3 | If a new firwmare has been uploaded to the QE (usually by the | ||
| 4 | boot loader), then a 'firmware' child node should be added to the QE | ||
| 5 | node. This node provides information on the uploaded firmware that | ||
| 6 | device drivers may need. | ||
| 7 | |||
| 8 | Required properties: | ||
| 9 | - id: The string name of the firmware. This is taken from the 'id' | ||
| 10 | member of the qe_firmware structure of the uploaded firmware. | ||
| 11 | Device drivers can search this string to determine if the | ||
| 12 | firmware they want is already present. | ||
| 13 | - extended-modes: The Extended Modes bitfield, taken from the | ||
| 14 | firmware binary. It is a 64-bit number represented | ||
| 15 | as an array of two 32-bit numbers. | ||
| 16 | - virtual-traps: The virtual traps, taken from the firmware binary. | ||
| 17 | It is an array of 8 32-bit numbers. | ||
| 18 | |||
| 19 | Example: | ||
| 20 | firmware { | ||
| 21 | id = "Soft-UART"; | ||
| 22 | extended-modes = <0 0>; | ||
| 23 | virtual-traps = <0 0 0 0 0 0 0 0>; | ||
| 24 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/par_io.txt b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/par_io.txt new file mode 100644 index 000000000000..60984260207b --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/par_io.txt | |||
| @@ -0,0 +1,51 @@ | |||
| 1 | * Parallel I/O Ports | ||
| 2 | |||
| 3 | This node configures Parallel I/O ports for CPUs with QE support. | ||
| 4 | The node should reside in the "soc" node of the tree. For each | ||
| 5 | device that using parallel I/O ports, a child node should be created. | ||
| 6 | See the definition of the Pin configuration nodes below for more | ||
| 7 | information. | ||
| 8 | |||
| 9 | Required properties: | ||
| 10 | - device_type : should be "par_io". | ||
| 11 | - reg : offset to the register set and its length. | ||
| 12 | - num-ports : number of Parallel I/O ports | ||
| 13 | |||
| 14 | Example: | ||
| 15 | par_io@1400 { | ||
| 16 | reg = <1400 100>; | ||
| 17 | #address-cells = <1>; | ||
| 18 | #size-cells = <0>; | ||
| 19 | device_type = "par_io"; | ||
| 20 | num-ports = <7>; | ||
| 21 | ucc_pin@01 { | ||
| 22 | ...... | ||
| 23 | }; | ||
| 24 | |||
| 25 | Note that "par_io" nodes are obsolete, and should not be used for | ||
| 26 | the new device trees. Instead, each Par I/O bank should be represented | ||
| 27 | via its own gpio-controller node: | ||
| 28 | |||
| 29 | Required properties: | ||
| 30 | - #gpio-cells : should be "2". | ||
| 31 | - compatible : should be "fsl,<chip>-qe-pario-bank", | ||
| 32 | "fsl,mpc8323-qe-pario-bank". | ||
| 33 | - reg : offset to the register set and its length. | ||
| 34 | - gpio-controller : node to identify gpio controllers. | ||
| 35 | |||
| 36 | Example: | ||
| 37 | qe_pio_a: gpio-controller@1400 { | ||
| 38 | #gpio-cells = <2>; | ||
| 39 | compatible = "fsl,mpc8360-qe-pario-bank", | ||
| 40 | "fsl,mpc8323-qe-pario-bank"; | ||
| 41 | reg = <0x1400 0x18>; | ||
| 42 | gpio-controller; | ||
| 43 | }; | ||
| 44 | |||
| 45 | qe_pio_e: gpio-controller@1460 { | ||
| 46 | #gpio-cells = <2>; | ||
| 47 | compatible = "fsl,mpc8360-qe-pario-bank", | ||
| 48 | "fsl,mpc8323-qe-pario-bank"; | ||
| 49 | reg = <0x1460 0x18>; | ||
| 50 | gpio-controller; | ||
| 51 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/pincfg.txt b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/pincfg.txt new file mode 100644 index 000000000000..c5b43061db3a --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/pincfg.txt | |||
| @@ -0,0 +1,60 @@ | |||
| 1 | * Pin configuration nodes | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - linux,phandle : phandle of this node; likely referenced by a QE | ||
| 5 | device. | ||
| 6 | - pio-map : array of pin configurations. Each pin is defined by 6 | ||
| 7 | integers. The six numbers are respectively: port, pin, dir, | ||
| 8 | open_drain, assignment, has_irq. | ||
| 9 | - port : port number of the pin; 0-6 represent port A-G in UM. | ||
| 10 | - pin : pin number in the port. | ||
| 11 | - dir : direction of the pin, should encode as follows: | ||
| 12 | |||
| 13 | 0 = The pin is disabled | ||
| 14 | 1 = The pin is an output | ||
| 15 | 2 = The pin is an input | ||
| 16 | 3 = The pin is I/O | ||
| 17 | |||
| 18 | - open_drain : indicates the pin is normal or wired-OR: | ||
| 19 | |||
| 20 | 0 = The pin is actively driven as an output | ||
| 21 | 1 = The pin is an open-drain driver. As an output, the pin is | ||
| 22 | driven active-low, otherwise it is three-stated. | ||
| 23 | |||
| 24 | - assignment : function number of the pin according to the Pin Assignment | ||
| 25 | tables in User Manual. Each pin can have up to 4 possible functions in | ||
| 26 | QE and two options for CPM. | ||
| 27 | - has_irq : indicates if the pin is used as source of external | ||
| 28 | interrupts. | ||
| 29 | |||
| 30 | Example: | ||
| 31 | ucc_pin@01 { | ||
| 32 | linux,phandle = <140001>; | ||
| 33 | pio-map = < | ||
| 34 | /* port pin dir open_drain assignment has_irq */ | ||
| 35 | 0 3 1 0 1 0 /* TxD0 */ | ||
| 36 | 0 4 1 0 1 0 /* TxD1 */ | ||
| 37 | 0 5 1 0 1 0 /* TxD2 */ | ||
| 38 | 0 6 1 0 1 0 /* TxD3 */ | ||
| 39 | 1 6 1 0 3 0 /* TxD4 */ | ||
| 40 | 1 7 1 0 1 0 /* TxD5 */ | ||
| 41 | 1 9 1 0 2 0 /* TxD6 */ | ||
| 42 | 1 a 1 0 2 0 /* TxD7 */ | ||
| 43 | 0 9 2 0 1 0 /* RxD0 */ | ||
| 44 | 0 a 2 0 1 0 /* RxD1 */ | ||
| 45 | 0 b 2 0 1 0 /* RxD2 */ | ||
| 46 | 0 c 2 0 1 0 /* RxD3 */ | ||
| 47 | 0 d 2 0 1 0 /* RxD4 */ | ||
| 48 | 1 1 2 0 2 0 /* RxD5 */ | ||
| 49 | 1 0 2 0 2 0 /* RxD6 */ | ||
| 50 | 1 4 2 0 2 0 /* RxD7 */ | ||
| 51 | 0 7 1 0 1 0 /* TX_EN */ | ||
| 52 | 0 8 1 0 1 0 /* TX_ER */ | ||
| 53 | 0 f 2 0 1 0 /* RX_DV */ | ||
| 54 | 0 10 2 0 1 0 /* RX_ER */ | ||
| 55 | 0 0 2 0 1 0 /* RX_CLK */ | ||
| 56 | 2 9 1 0 3 0 /* GTX_CLK - CLK10 */ | ||
| 57 | 2 8 2 0 1 0>; /* GTX125 - CLK9 */ | ||
| 58 | }; | ||
| 59 | |||
| 60 | |||
diff --git a/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/ucc.txt b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/ucc.txt new file mode 100644 index 000000000000..e47734bee3f0 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/ucc.txt | |||
| @@ -0,0 +1,70 @@ | |||
| 1 | * UCC (Unified Communications Controllers) | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - device_type : should be "network", "hldc", "uart", "transparent" | ||
| 5 | "bisync", "atm", or "serial". | ||
| 6 | - compatible : could be "ucc_geth" or "fsl_atm" and so on. | ||
| 7 | - cell-index : the ucc number(1-8), corresponding to UCCx in UM. | ||
| 8 | - reg : Offset and length of the register set for the device | ||
| 9 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 10 | field that represents an encoding of the sense and level | ||
| 11 | information for the interrupt. This should be encoded based on | ||
| 12 | the information in section 2) depending on the type of interrupt | ||
| 13 | controller you have. | ||
| 14 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 15 | services interrupts for this device. | ||
| 16 | - pio-handle : The phandle for the Parallel I/O port configuration. | ||
| 17 | - port-number : for UART drivers, the port number to use, between 0 and 3. | ||
| 18 | This usually corresponds to the /dev/ttyQE device, e.g. <0> = /dev/ttyQE0. | ||
| 19 | The port number is added to the minor number of the device. Unlike the | ||
| 20 | CPM UART driver, the port-number is required for the QE UART driver. | ||
| 21 | - soft-uart : for UART drivers, if specified this means the QE UART device | ||
| 22 | driver should use "Soft-UART" mode, which is needed on some SOCs that have | ||
| 23 | broken UART hardware. Soft-UART is provided via a microcode upload. | ||
| 24 | - rx-clock-name: the UCC receive clock source | ||
| 25 | "none": clock source is disabled | ||
| 26 | "brg1" through "brg16": clock source is BRG1-BRG16, respectively | ||
| 27 | "clk1" through "clk24": clock source is CLK1-CLK24, respectively | ||
| 28 | - tx-clock-name: the UCC transmit clock source | ||
| 29 | "none": clock source is disabled | ||
| 30 | "brg1" through "brg16": clock source is BRG1-BRG16, respectively | ||
| 31 | "clk1" through "clk24": clock source is CLK1-CLK24, respectively | ||
| 32 | The following two properties are deprecated. rx-clock has been replaced | ||
| 33 | with rx-clock-name, and tx-clock has been replaced with tx-clock-name. | ||
| 34 | Drivers that currently use the deprecated properties should continue to | ||
| 35 | do so, in order to support older device trees, but they should be updated | ||
| 36 | to check for the new properties first. | ||
| 37 | - rx-clock : represents the UCC receive clock source. | ||
| 38 | 0x00 : clock source is disabled; | ||
| 39 | 0x1~0x10 : clock source is BRG1~BRG16 respectively; | ||
| 40 | 0x11~0x28: clock source is QE_CLK1~QE_CLK24 respectively. | ||
| 41 | - tx-clock: represents the UCC transmit clock source; | ||
| 42 | 0x00 : clock source is disabled; | ||
| 43 | 0x1~0x10 : clock source is BRG1~BRG16 respectively; | ||
| 44 | 0x11~0x28: clock source is QE_CLK1~QE_CLK24 respectively. | ||
| 45 | |||
| 46 | Required properties for network device_type: | ||
| 47 | - mac-address : list of bytes representing the ethernet address. | ||
| 48 | - phy-handle : The phandle for the PHY connected to this controller. | ||
| 49 | |||
| 50 | Recommended properties: | ||
| 51 | - phy-connection-type : a string naming the controller/PHY interface type, | ||
| 52 | i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id" (Internal | ||
| 53 | Delay), "rgmii-txid" (delay on TX only), "rgmii-rxid" (delay on RX only), | ||
| 54 | "tbi", or "rtbi". | ||
| 55 | |||
| 56 | Example: | ||
| 57 | ucc@2000 { | ||
| 58 | device_type = "network"; | ||
| 59 | compatible = "ucc_geth"; | ||
| 60 | cell-index = <1>; | ||
| 61 | reg = <2000 200>; | ||
| 62 | interrupts = <a0 0>; | ||
| 63 | interrupt-parent = <700>; | ||
| 64 | mac-address = [ 00 04 9f 00 23 23 ]; | ||
| 65 | rx-clock = "none"; | ||
| 66 | tx-clock = "clk9"; | ||
| 67 | phy-handle = <212000>; | ||
| 68 | phy-connection-type = "gmii"; | ||
| 69 | pio-handle = <140001>; | ||
| 70 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/usb.txt b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/usb.txt new file mode 100644 index 000000000000..c8f44d6bcbcf --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/qe/usb.txt | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | * USB (Universal Serial Bus Controller) | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - compatible : could be "qe_udc" or "fhci-hcd". | ||
| 5 | - mode : the could be "host" or "slave". | ||
| 6 | - reg : Offset and length of the register set for the device | ||
| 7 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 8 | field that represents an encoding of the sense and level | ||
| 9 | information for the interrupt. This should be encoded based on | ||
| 10 | the information in section 2) depending on the type of interrupt | ||
| 11 | controller you have. | ||
| 12 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 13 | services interrupts for this device. | ||
| 14 | |||
| 15 | Example(slave): | ||
| 16 | usb@6c0 { | ||
| 17 | compatible = "qe_udc"; | ||
| 18 | reg = <6c0 40>; | ||
| 19 | interrupts = <8b 0>; | ||
| 20 | interrupt-parent = <700>; | ||
| 21 | mode = "slave"; | ||
| 22 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/cpm_qe/serial.txt b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/serial.txt new file mode 100644 index 000000000000..b35f3482e3e4 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/cpm_qe/serial.txt | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | * Serial | ||
| 2 | |||
| 3 | Currently defined compatibles: | ||
| 4 | - fsl,cpm1-smc-uart | ||
| 5 | - fsl,cpm2-smc-uart | ||
| 6 | - fsl,cpm1-scc-uart | ||
| 7 | - fsl,cpm2-scc-uart | ||
| 8 | - fsl,qe-uart | ||
| 9 | |||
| 10 | Example: | ||
| 11 | |||
| 12 | serial@11a00 { | ||
| 13 | device_type = "serial"; | ||
| 14 | compatible = "fsl,mpc8272-scc-uart", | ||
| 15 | "fsl,cpm2-scc-uart"; | ||
| 16 | reg = <11a00 20 8000 100>; | ||
| 17 | interrupts = <28 8>; | ||
| 18 | interrupt-parent = <&PIC>; | ||
| 19 | fsl,cpm-brg = <1>; | ||
| 20 | fsl,cpm-command = <00800000>; | ||
| 21 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/diu.txt b/Documentation/powerpc/dts-bindings/fsl/diu.txt new file mode 100644 index 000000000000..deb35de70988 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/diu.txt | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | * Freescale Display Interface Unit | ||
| 2 | |||
| 3 | The Freescale DIU is a LCD controller, with proper hardware, it can also | ||
| 4 | drive DVI monitors. | ||
| 5 | |||
| 6 | Required properties: | ||
| 7 | - compatible : should be "fsl-diu". | ||
| 8 | - reg : should contain at least address and length of the DIU register | ||
| 9 | set. | ||
| 10 | - Interrupts : one DIU interrupt should be describe here. | ||
| 11 | |||
| 12 | Example (MPC8610HPCD): | ||
| 13 | display@2c000 { | ||
| 14 | compatible = "fsl,diu"; | ||
| 15 | reg = <0x2c000 100>; | ||
| 16 | interrupts = <72 2>; | ||
| 17 | interrupt-parent = <&mpic>; | ||
| 18 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/dma.txt b/Documentation/powerpc/dts-bindings/fsl/dma.txt new file mode 100644 index 000000000000..86826df00e64 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/dma.txt | |||
| @@ -0,0 +1,127 @@ | |||
| 1 | * Freescale 83xx DMA Controller | ||
| 2 | |||
| 3 | Freescale PowerPC 83xx have on chip general purpose DMA controllers. | ||
| 4 | |||
| 5 | Required properties: | ||
| 6 | |||
| 7 | - compatible : compatible list, contains 2 entries, first is | ||
| 8 | "fsl,CHIP-dma", where CHIP is the processor | ||
| 9 | (mpc8349, mpc8360, etc.) and the second is | ||
| 10 | "fsl,elo-dma" | ||
| 11 | - reg : <registers mapping for DMA general status reg> | ||
| 12 | - ranges : Should be defined as specified in 1) to describe the | ||
| 13 | DMA controller channels. | ||
| 14 | - cell-index : controller index. 0 for controller @ 0x8100 | ||
| 15 | - interrupts : <interrupt mapping for DMA IRQ> | ||
| 16 | - interrupt-parent : optional, if needed for interrupt mapping | ||
| 17 | |||
| 18 | |||
| 19 | - DMA channel nodes: | ||
| 20 | - compatible : compatible list, contains 2 entries, first is | ||
| 21 | "fsl,CHIP-dma-channel", where CHIP is the processor | ||
| 22 | (mpc8349, mpc8350, etc.) and the second is | ||
| 23 | "fsl,elo-dma-channel" | ||
| 24 | - reg : <registers mapping for channel> | ||
| 25 | - cell-index : dma channel index starts at 0. | ||
| 26 | |||
| 27 | Optional properties: | ||
| 28 | - interrupts : <interrupt mapping for DMA channel IRQ> | ||
| 29 | (on 83xx this is expected to be identical to | ||
| 30 | the interrupts property of the parent node) | ||
| 31 | - interrupt-parent : optional, if needed for interrupt mapping | ||
| 32 | |||
| 33 | Example: | ||
| 34 | dma@82a8 { | ||
| 35 | #address-cells = <1>; | ||
| 36 | #size-cells = <1>; | ||
| 37 | compatible = "fsl,mpc8349-dma", "fsl,elo-dma"; | ||
| 38 | reg = <82a8 4>; | ||
| 39 | ranges = <0 8100 1a4>; | ||
| 40 | interrupt-parent = <&ipic>; | ||
| 41 | interrupts = <47 8>; | ||
| 42 | cell-index = <0>; | ||
| 43 | dma-channel@0 { | ||
| 44 | compatible = "fsl,mpc8349-dma-channel", "fsl,elo-dma-channel"; | ||
| 45 | cell-index = <0>; | ||
| 46 | reg = <0 80>; | ||
| 47 | }; | ||
| 48 | dma-channel@80 { | ||
| 49 | compatible = "fsl,mpc8349-dma-channel", "fsl,elo-dma-channel"; | ||
| 50 | cell-index = <1>; | ||
| 51 | reg = <80 80>; | ||
| 52 | }; | ||
| 53 | dma-channel@100 { | ||
| 54 | compatible = "fsl,mpc8349-dma-channel", "fsl,elo-dma-channel"; | ||
| 55 | cell-index = <2>; | ||
| 56 | reg = <100 80>; | ||
| 57 | }; | ||
| 58 | dma-channel@180 { | ||
| 59 | compatible = "fsl,mpc8349-dma-channel", "fsl,elo-dma-channel"; | ||
| 60 | cell-index = <3>; | ||
| 61 | reg = <180 80>; | ||
| 62 | }; | ||
| 63 | }; | ||
| 64 | |||
| 65 | * Freescale 85xx/86xx DMA Controller | ||
| 66 | |||
| 67 | Freescale PowerPC 85xx/86xx have on chip general purpose DMA controllers. | ||
| 68 | |||
| 69 | Required properties: | ||
| 70 | |||
| 71 | - compatible : compatible list, contains 2 entries, first is | ||
| 72 | "fsl,CHIP-dma", where CHIP is the processor | ||
| 73 | (mpc8540, mpc8540, etc.) and the second is | ||
| 74 | "fsl,eloplus-dma" | ||
| 75 | - reg : <registers mapping for DMA general status reg> | ||
| 76 | - cell-index : controller index. 0 for controller @ 0x21000, | ||
| 77 | 1 for controller @ 0xc000 | ||
| 78 | - ranges : Should be defined as specified in 1) to describe the | ||
| 79 | DMA controller channels. | ||
| 80 | |||
| 81 | - DMA channel nodes: | ||
| 82 | - compatible : compatible list, contains 2 entries, first is | ||
| 83 | "fsl,CHIP-dma-channel", where CHIP is the processor | ||
| 84 | (mpc8540, mpc8560, etc.) and the second is | ||
| 85 | "fsl,eloplus-dma-channel" | ||
| 86 | - cell-index : dma channel index starts at 0. | ||
| 87 | - reg : <registers mapping for channel> | ||
| 88 | - interrupts : <interrupt mapping for DMA channel IRQ> | ||
| 89 | - interrupt-parent : optional, if needed for interrupt mapping | ||
| 90 | |||
| 91 | Example: | ||
| 92 | dma@21300 { | ||
| 93 | #address-cells = <1>; | ||
| 94 | #size-cells = <1>; | ||
| 95 | compatible = "fsl,mpc8540-dma", "fsl,eloplus-dma"; | ||
| 96 | reg = <21300 4>; | ||
| 97 | ranges = <0 21100 200>; | ||
| 98 | cell-index = <0>; | ||
| 99 | dma-channel@0 { | ||
| 100 | compatible = "fsl,mpc8540-dma-channel", "fsl,eloplus-dma-channel"; | ||
| 101 | reg = <0 80>; | ||
| 102 | cell-index = <0>; | ||
| 103 | interrupt-parent = <&mpic>; | ||
| 104 | interrupts = <14 2>; | ||
| 105 | }; | ||
| 106 | dma-channel@80 { | ||
| 107 | compatible = "fsl,mpc8540-dma-channel", "fsl,eloplus-dma-channel"; | ||
| 108 | reg = <80 80>; | ||
| 109 | cell-index = <1>; | ||
| 110 | interrupt-parent = <&mpic>; | ||
| 111 | interrupts = <15 2>; | ||
| 112 | }; | ||
| 113 | dma-channel@100 { | ||
| 114 | compatible = "fsl,mpc8540-dma-channel", "fsl,eloplus-dma-channel"; | ||
| 115 | reg = <100 80>; | ||
| 116 | cell-index = <2>; | ||
| 117 | interrupt-parent = <&mpic>; | ||
| 118 | interrupts = <16 2>; | ||
| 119 | }; | ||
| 120 | dma-channel@180 { | ||
| 121 | compatible = "fsl,mpc8540-dma-channel", "fsl,eloplus-dma-channel"; | ||
| 122 | reg = <180 80>; | ||
| 123 | cell-index = <3>; | ||
| 124 | interrupt-parent = <&mpic>; | ||
| 125 | interrupts = <17 2>; | ||
| 126 | }; | ||
| 127 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/gtm.txt b/Documentation/powerpc/dts-bindings/fsl/gtm.txt new file mode 100644 index 000000000000..9a33efded4bc --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/gtm.txt | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | * Freescale General-purpose Timers Module | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - compatible : should be | ||
| 5 | "fsl,<chip>-gtm", "fsl,gtm" for SOC GTMs | ||
| 6 | "fsl,<chip>-qe-gtm", "fsl,qe-gtm", "fsl,gtm" for QE GTMs | ||
| 7 | "fsl,<chip>-cpm2-gtm", "fsl,cpm2-gtm", "fsl,gtm" for CPM2 GTMs | ||
| 8 | - reg : should contain gtm registers location and length (0x40). | ||
| 9 | - interrupts : should contain four interrupts. | ||
| 10 | - interrupt-parent : interrupt source phandle. | ||
| 11 | - clock-frequency : specifies the frequency driving the timer. | ||
| 12 | |||
| 13 | Example: | ||
| 14 | |||
| 15 | timer@500 { | ||
| 16 | compatible = "fsl,mpc8360-gtm", "fsl,gtm"; | ||
| 17 | reg = <0x500 0x40>; | ||
| 18 | interrupts = <90 8 78 8 84 8 72 8>; | ||
| 19 | interrupt-parent = <&ipic>; | ||
| 20 | /* filled by u-boot */ | ||
| 21 | clock-frequency = <0>; | ||
| 22 | }; | ||
| 23 | |||
| 24 | timer@440 { | ||
| 25 | compatible = "fsl,mpc8360-qe-gtm", "fsl,qe-gtm", "fsl,gtm"; | ||
| 26 | reg = <0x440 0x40>; | ||
| 27 | interrupts = <12 13 14 15>; | ||
| 28 | interrupt-parent = <&qeic>; | ||
| 29 | /* filled by u-boot */ | ||
| 30 | clock-frequency = <0>; | ||
| 31 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/guts.txt b/Documentation/powerpc/dts-bindings/fsl/guts.txt new file mode 100644 index 000000000000..9e7a2417dac5 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/guts.txt | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | * Global Utilities Block | ||
| 2 | |||
| 3 | The global utilities block controls power management, I/O device | ||
| 4 | enabling, power-on-reset configuration monitoring, general-purpose | ||
| 5 | I/O signal configuration, alternate function selection for multiplexed | ||
| 6 | signals, and clock control. | ||
| 7 | |||
| 8 | Required properties: | ||
| 9 | |||
| 10 | - compatible : Should define the compatible device type for | ||
| 11 | global-utilities. | ||
| 12 | - reg : Offset and length of the register set for the device. | ||
| 13 | |||
| 14 | Recommended properties: | ||
| 15 | |||
| 16 | - fsl,has-rstcr : Indicates that the global utilities register set | ||
| 17 | contains a functioning "reset control register" (i.e. the board | ||
| 18 | is wired to reset upon setting the HRESET_REQ bit in this register). | ||
| 19 | |||
| 20 | Example: | ||
| 21 | global-utilities@e0000 { /* global utilities block */ | ||
| 22 | compatible = "fsl,mpc8548-guts"; | ||
| 23 | reg = <e0000 1000>; | ||
| 24 | fsl,has-rstcr; | ||
| 25 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/i2c.txt b/Documentation/powerpc/dts-bindings/fsl/i2c.txt new file mode 100644 index 000000000000..d0ab33e21fe6 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/i2c.txt | |||
| @@ -0,0 +1,32 @@ | |||
| 1 | * I2C | ||
| 2 | |||
| 3 | Required properties : | ||
| 4 | |||
| 5 | - device_type : Should be "i2c" | ||
| 6 | - reg : Offset and length of the register set for the device | ||
| 7 | |||
| 8 | Recommended properties : | ||
| 9 | |||
| 10 | - compatible : Should be "fsl-i2c" for parts compatible with | ||
| 11 | Freescale I2C specifications. | ||
| 12 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 13 | field that represents an encoding of the sense and level | ||
| 14 | information for the interrupt. This should be encoded based on | ||
| 15 | the information in section 2) depending on the type of interrupt | ||
| 16 | controller you have. | ||
| 17 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 18 | services interrupts for this device. | ||
| 19 | - dfsrr : boolean; if defined, indicates that this I2C device has | ||
| 20 | a digital filter sampling rate register | ||
| 21 | - fsl5200-clocking : boolean; if defined, indicated that this device | ||
| 22 | uses the FSL 5200 clocking mechanism. | ||
| 23 | |||
| 24 | Example : | ||
| 25 | i2c@3000 { | ||
| 26 | interrupt-parent = <40000>; | ||
| 27 | interrupts = <1b 3>; | ||
| 28 | reg = <3000 18>; | ||
| 29 | device_type = "i2c"; | ||
| 30 | compatible = "fsl-i2c"; | ||
| 31 | dfsrr; | ||
| 32 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/lbc.txt b/Documentation/powerpc/dts-bindings/fsl/lbc.txt new file mode 100644 index 000000000000..3300fec501c5 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/lbc.txt | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | * Chipselect/Local Bus | ||
| 2 | |||
| 3 | Properties: | ||
| 4 | - name : Should be localbus | ||
| 5 | - #address-cells : Should be either two or three. The first cell is the | ||
| 6 | chipselect number, and the remaining cells are the | ||
| 7 | offset into the chipselect. | ||
| 8 | - #size-cells : Either one or two, depending on how large each chipselect | ||
| 9 | can be. | ||
| 10 | - ranges : Each range corresponds to a single chipselect, and cover | ||
| 11 | the entire access window as configured. | ||
| 12 | |||
| 13 | Example: | ||
| 14 | localbus@f0010100 { | ||
| 15 | compatible = "fsl,mpc8272-localbus", | ||
| 16 | "fsl,pq2-localbus"; | ||
| 17 | #address-cells = <2>; | ||
| 18 | #size-cells = <1>; | ||
| 19 | reg = <f0010100 40>; | ||
| 20 | |||
| 21 | ranges = <0 0 fe000000 02000000 | ||
| 22 | 1 0 f4500000 00008000>; | ||
| 23 | |||
| 24 | flash@0,0 { | ||
| 25 | compatible = "jedec-flash"; | ||
| 26 | reg = <0 0 2000000>; | ||
| 27 | bank-width = <4>; | ||
| 28 | device-width = <1>; | ||
| 29 | }; | ||
| 30 | |||
| 31 | board-control@1,0 { | ||
| 32 | reg = <1 0 20>; | ||
| 33 | compatible = "fsl,mpc8272ads-bcsr"; | ||
| 34 | }; | ||
| 35 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/msi-pic.txt b/Documentation/powerpc/dts-bindings/fsl/msi-pic.txt new file mode 100644 index 000000000000..b26b91992c55 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/msi-pic.txt | |||
| @@ -0,0 +1,36 @@ | |||
| 1 | * Freescale MSI interrupt controller | ||
| 2 | |||
| 3 | Reguired properities: | ||
| 4 | - compatible : compatible list, contains 2 entries, | ||
| 5 | first is "fsl,CHIP-msi", where CHIP is the processor(mpc8610, mpc8572, | ||
| 6 | etc.) and the second is "fsl,mpic-msi" or "fsl,ipic-msi" depending on | ||
| 7 | the parent type. | ||
| 8 | - reg : should contain the address and the length of the shared message | ||
| 9 | interrupt register set. | ||
| 10 | - msi-available-ranges: use <start count> style section to define which | ||
| 11 | msi interrupt can be used in the 256 msi interrupts. This property is | ||
| 12 | optional, without this, all the 256 MSI interrupts can be used. | ||
| 13 | - interrupts : each one of the interrupts here is one entry per 32 MSIs, | ||
| 14 | and routed to the host interrupt controller. the interrupts should | ||
| 15 | be set as edge sensitive. | ||
| 16 | - interrupt-parent: the phandle for the interrupt controller | ||
| 17 | that services interrupts for this device. for 83xx cpu, the interrupts | ||
| 18 | are routed to IPIC, and for 85xx/86xx cpu the interrupts are routed | ||
| 19 | to MPIC. | ||
| 20 | |||
| 21 | Example: | ||
| 22 | msi@41600 { | ||
| 23 | compatible = "fsl,mpc8610-msi", "fsl,mpic-msi"; | ||
| 24 | reg = <0x41600 0x80>; | ||
| 25 | msi-available-ranges = <0 0x100>; | ||
| 26 | interrupts = < | ||
| 27 | 0xe0 0 | ||
| 28 | 0xe1 0 | ||
| 29 | 0xe2 0 | ||
| 30 | 0xe3 0 | ||
| 31 | 0xe4 0 | ||
| 32 | 0xe5 0 | ||
| 33 | 0xe6 0 | ||
| 34 | 0xe7 0>; | ||
| 35 | interrupt-parent = <&mpic>; | ||
| 36 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/sata.txt b/Documentation/powerpc/dts-bindings/fsl/sata.txt new file mode 100644 index 000000000000..b46bcf46c3d8 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/sata.txt | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | * Freescale 8xxx/3.0 Gb/s SATA nodes | ||
| 2 | |||
| 3 | SATA nodes are defined to describe on-chip Serial ATA controllers. | ||
| 4 | Each SATA port should have its own node. | ||
| 5 | |||
| 6 | Required properties: | ||
| 7 | - compatible : compatible list, contains 2 entries, first is | ||
| 8 | "fsl,CHIP-sata", where CHIP is the processor | ||
| 9 | (mpc8315, mpc8379, etc.) and the second is | ||
| 10 | "fsl,pq-sata" | ||
| 11 | - interrupts : <interrupt mapping for SATA IRQ> | ||
| 12 | - cell-index : controller index. | ||
| 13 | 1 for controller @ 0x18000 | ||
| 14 | 2 for controller @ 0x19000 | ||
| 15 | 3 for controller @ 0x1a000 | ||
| 16 | 4 for controller @ 0x1b000 | ||
| 17 | |||
| 18 | Optional properties: | ||
| 19 | - interrupt-parent : optional, if needed for interrupt mapping | ||
| 20 | - reg : <registers mapping> | ||
| 21 | |||
| 22 | Example: | ||
| 23 | sata@18000 { | ||
| 24 | compatible = "fsl,mpc8379-sata", "fsl,pq-sata"; | ||
| 25 | reg = <0x18000 0x1000>; | ||
| 26 | cell-index = <1>; | ||
| 27 | interrupts = <2c 8>; | ||
| 28 | interrupt-parent = < &ipic >; | ||
| 29 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/sec.txt b/Documentation/powerpc/dts-bindings/fsl/sec.txt new file mode 100644 index 000000000000..2b6f2d45c45a --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/sec.txt | |||
| @@ -0,0 +1,68 @@ | |||
| 1 | Freescale SoC SEC Security Engines | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | |||
| 5 | - compatible : Should contain entries for this and backward compatible | ||
| 6 | SEC versions, high to low, e.g., "fsl,sec2.1", "fsl,sec2.0" | ||
| 7 | - reg : Offset and length of the register set for the device | ||
| 8 | - interrupts : the SEC's interrupt number | ||
| 9 | - fsl,num-channels : An integer representing the number of channels | ||
| 10 | available. | ||
| 11 | - fsl,channel-fifo-len : An integer representing the number of | ||
| 12 | descriptor pointers each channel fetch fifo can hold. | ||
| 13 | - fsl,exec-units-mask : The bitmask representing what execution units | ||
| 14 | (EUs) are available. It's a single 32-bit cell. EU information | ||
| 15 | should be encoded following the SEC's Descriptor Header Dword | ||
| 16 | EU_SEL0 field documentation, i.e. as follows: | ||
| 17 | |||
| 18 | bit 0 = reserved - should be 0 | ||
| 19 | bit 1 = set if SEC has the ARC4 EU (AFEU) | ||
| 20 | bit 2 = set if SEC has the DES/3DES EU (DEU) | ||
| 21 | bit 3 = set if SEC has the message digest EU (MDEU/MDEU-A) | ||
| 22 | bit 4 = set if SEC has the random number generator EU (RNG) | ||
| 23 | bit 5 = set if SEC has the public key EU (PKEU) | ||
| 24 | bit 6 = set if SEC has the AES EU (AESU) | ||
| 25 | bit 7 = set if SEC has the Kasumi EU (KEU) | ||
| 26 | bit 8 = set if SEC has the CRC EU (CRCU) | ||
| 27 | bit 11 = set if SEC has the message digest EU extended alg set (MDEU-B) | ||
| 28 | |||
| 29 | remaining bits are reserved for future SEC EUs. | ||
| 30 | |||
| 31 | - fsl,descriptor-types-mask : The bitmask representing what descriptors | ||
| 32 | are available. It's a single 32-bit cell. Descriptor type information | ||
| 33 | should be encoded following the SEC's Descriptor Header Dword DESC_TYPE | ||
| 34 | field documentation, i.e. as follows: | ||
| 35 | |||
| 36 | bit 0 = set if SEC supports the aesu_ctr_nonsnoop desc. type | ||
| 37 | bit 1 = set if SEC supports the ipsec_esp descriptor type | ||
| 38 | bit 2 = set if SEC supports the common_nonsnoop desc. type | ||
| 39 | bit 3 = set if SEC supports the 802.11i AES ccmp desc. type | ||
| 40 | bit 4 = set if SEC supports the hmac_snoop_no_afeu desc. type | ||
| 41 | bit 5 = set if SEC supports the srtp descriptor type | ||
| 42 | bit 6 = set if SEC supports the non_hmac_snoop_no_afeu desc.type | ||
| 43 | bit 7 = set if SEC supports the pkeu_assemble descriptor type | ||
| 44 | bit 8 = set if SEC supports the aesu_key_expand_output desc.type | ||
| 45 | bit 9 = set if SEC supports the pkeu_ptmul descriptor type | ||
| 46 | bit 10 = set if SEC supports the common_nonsnoop_afeu desc. type | ||
| 47 | bit 11 = set if SEC supports the pkeu_ptadd_dbl descriptor type | ||
| 48 | |||
| 49 | ..and so on and so forth. | ||
| 50 | |||
| 51 | Optional properties: | ||
| 52 | |||
| 53 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 54 | services interrupts for this device. | ||
| 55 | |||
| 56 | Example: | ||
| 57 | |||
| 58 | /* MPC8548E */ | ||
| 59 | crypto@30000 { | ||
| 60 | compatible = "fsl,sec2.1", "fsl,sec2.0"; | ||
| 61 | reg = <0x30000 0x10000>; | ||
| 62 | interrupts = <29 2>; | ||
| 63 | interrupt-parent = <&mpic>; | ||
| 64 | fsl,num-channels = <4>; | ||
| 65 | fsl,channel-fifo-len = <24>; | ||
| 66 | fsl,exec-units-mask = <0xfe>; | ||
| 67 | fsl,descriptor-types-mask = <0x12b0ebf>; | ||
| 68 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/spi.txt b/Documentation/powerpc/dts-bindings/fsl/spi.txt new file mode 100644 index 000000000000..e7d9a344c4f4 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/spi.txt | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | * SPI (Serial Peripheral Interface) | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - cell-index : SPI controller index. | ||
| 5 | - compatible : should be "fsl,spi". | ||
| 6 | - mode : the SPI operation mode, it can be "cpu" or "cpu-qe". | ||
| 7 | - reg : Offset and length of the register set for the device | ||
| 8 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 9 | field that represents an encoding of the sense and level | ||
| 10 | information for the interrupt. This should be encoded based on | ||
| 11 | the information in section 2) depending on the type of interrupt | ||
| 12 | controller you have. | ||
| 13 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 14 | services interrupts for this device. | ||
| 15 | |||
| 16 | Example: | ||
| 17 | spi@4c0 { | ||
| 18 | cell-index = <0>; | ||
| 19 | compatible = "fsl,spi"; | ||
| 20 | reg = <4c0 40>; | ||
| 21 | interrupts = <82 0>; | ||
| 22 | interrupt-parent = <700>; | ||
| 23 | mode = "cpu"; | ||
| 24 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/ssi.txt b/Documentation/powerpc/dts-bindings/fsl/ssi.txt new file mode 100644 index 000000000000..d100555d488a --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/ssi.txt | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | Freescale Synchronous Serial Interface | ||
| 2 | |||
| 3 | The SSI is a serial device that communicates with audio codecs. It can | ||
| 4 | be programmed in AC97, I2S, left-justified, or right-justified modes. | ||
| 5 | |||
| 6 | Required properties: | ||
| 7 | - compatible : compatible list, containing "fsl,ssi" | ||
| 8 | - cell-index : the SSI, <0> = SSI1, <1> = SSI2, and so on | ||
| 9 | - reg : offset and length of the register set for the device | ||
| 10 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 11 | field that represents an encoding of the sense and | ||
| 12 | level information for the interrupt. This should be | ||
| 13 | encoded based on the information in section 2) | ||
| 14 | depending on the type of interrupt controller you | ||
| 15 | have. | ||
| 16 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 17 | services interrupts for this device. | ||
| 18 | - fsl,mode : the operating mode for the SSI interface | ||
| 19 | "i2s-slave" - I2S mode, SSI is clock slave | ||
| 20 | "i2s-master" - I2S mode, SSI is clock master | ||
| 21 | "lj-slave" - left-justified mode, SSI is clock slave | ||
| 22 | "lj-master" - l.j. mode, SSI is clock master | ||
| 23 | "rj-slave" - right-justified mode, SSI is clock slave | ||
| 24 | "rj-master" - r.j., SSI is clock master | ||
| 25 | "ac97-slave" - AC97 mode, SSI is clock slave | ||
| 26 | "ac97-master" - AC97 mode, SSI is clock master | ||
| 27 | |||
| 28 | Optional properties: | ||
| 29 | - codec-handle : phandle to a 'codec' node that defines an audio | ||
| 30 | codec connected to this SSI. This node is typically | ||
| 31 | a child of an I2C or other control node. | ||
| 32 | |||
| 33 | Child 'codec' node required properties: | ||
| 34 | - compatible : compatible list, contains the name of the codec | ||
| 35 | |||
| 36 | Child 'codec' node optional properties: | ||
| 37 | - clock-frequency : The frequency of the input clock, which typically | ||
| 38 | comes from an on-board dedicated oscillator. | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/tsec.txt b/Documentation/powerpc/dts-bindings/fsl/tsec.txt new file mode 100644 index 000000000000..583ef6b56c43 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/tsec.txt | |||
| @@ -0,0 +1,69 @@ | |||
| 1 | * MDIO IO device | ||
| 2 | |||
| 3 | The MDIO is a bus to which the PHY devices are connected. For each | ||
| 4 | device that exists on this bus, a child node should be created. See | ||
| 5 | the definition of the PHY node below for an example of how to define | ||
| 6 | a PHY. | ||
| 7 | |||
| 8 | Required properties: | ||
| 9 | - reg : Offset and length of the register set for the device | ||
| 10 | - compatible : Should define the compatible device type for the | ||
| 11 | mdio. Currently, this is most likely to be "fsl,gianfar-mdio" | ||
| 12 | |||
| 13 | Example: | ||
| 14 | |||
| 15 | mdio@24520 { | ||
| 16 | reg = <24520 20>; | ||
| 17 | compatible = "fsl,gianfar-mdio"; | ||
| 18 | |||
| 19 | ethernet-phy@0 { | ||
| 20 | ...... | ||
| 21 | }; | ||
| 22 | }; | ||
| 23 | |||
| 24 | |||
| 25 | * Gianfar-compatible ethernet nodes | ||
| 26 | |||
| 27 | Required properties: | ||
| 28 | |||
| 29 | - device_type : Should be "network" | ||
| 30 | - model : Model of the device. Can be "TSEC", "eTSEC", or "FEC" | ||
| 31 | - compatible : Should be "gianfar" | ||
| 32 | - reg : Offset and length of the register set for the device | ||
| 33 | - mac-address : List of bytes representing the ethernet address of | ||
| 34 | this controller | ||
| 35 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 36 | field that represents an encoding of the sense and level | ||
| 37 | information for the interrupt. This should be encoded based on | ||
| 38 | the information in section 2) depending on the type of interrupt | ||
| 39 | controller you have. | ||
| 40 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 41 | services interrupts for this device. | ||
| 42 | - phy-handle : The phandle for the PHY connected to this ethernet | ||
| 43 | controller. | ||
| 44 | - fixed-link : <a b c d e> where a is emulated phy id - choose any, | ||
| 45 | but unique to the all specified fixed-links, b is duplex - 0 half, | ||
| 46 | 1 full, c is link speed - d#10/d#100/d#1000, d is pause - 0 no | ||
| 47 | pause, 1 pause, e is asym_pause - 0 no asym_pause, 1 asym_pause. | ||
| 48 | |||
| 49 | Recommended properties: | ||
| 50 | |||
| 51 | - phy-connection-type : a string naming the controller/PHY interface type, | ||
| 52 | i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id", "sgmii", | ||
| 53 | "tbi", or "rtbi". This property is only really needed if the connection | ||
| 54 | is of type "rgmii-id", as all other connection types are detected by | ||
| 55 | hardware. | ||
| 56 | |||
| 57 | |||
| 58 | Example: | ||
| 59 | ethernet@24000 { | ||
| 60 | #size-cells = <0>; | ||
| 61 | device_type = "network"; | ||
| 62 | model = "TSEC"; | ||
| 63 | compatible = "gianfar"; | ||
| 64 | reg = <24000 1000>; | ||
| 65 | mac-address = [ 00 E0 0C 00 73 00 ]; | ||
| 66 | interrupts = <d 3 e 3 12 3>; | ||
| 67 | interrupt-parent = <40000>; | ||
| 68 | phy-handle = <2452000> | ||
| 69 | }; | ||
diff --git a/Documentation/powerpc/dts-bindings/fsl/usb.txt b/Documentation/powerpc/dts-bindings/fsl/usb.txt new file mode 100644 index 000000000000..b00152402694 --- /dev/null +++ b/Documentation/powerpc/dts-bindings/fsl/usb.txt | |||
| @@ -0,0 +1,59 @@ | |||
| 1 | Freescale SOC USB controllers | ||
| 2 | |||
| 3 | The device node for a USB controller that is part of a Freescale | ||
| 4 | SOC is as described in the document "Open Firmware Recommended | ||
| 5 | Practice : Universal Serial Bus" with the following modifications | ||
| 6 | and additions : | ||
| 7 | |||
| 8 | Required properties : | ||
| 9 | - compatible : Should be "fsl-usb2-mph" for multi port host USB | ||
| 10 | controllers, or "fsl-usb2-dr" for dual role USB controllers | ||
| 11 | - phy_type : For multi port host USB controllers, should be one of | ||
| 12 | "ulpi", or "serial". For dual role USB controllers, should be | ||
| 13 | one of "ulpi", "utmi", "utmi_wide", or "serial". | ||
| 14 | - reg : Offset and length of the register set for the device | ||
| 15 | - port0 : boolean; if defined, indicates port0 is connected for | ||
| 16 | fsl-usb2-mph compatible controllers. Either this property or | ||
| 17 | "port1" (or both) must be defined for "fsl-usb2-mph" compatible | ||
| 18 | controllers. | ||
| 19 | - port1 : boolean; if defined, indicates port1 is connected for | ||
| 20 | fsl-usb2-mph compatible controllers. Either this property or | ||
| 21 | "port0" (or both) must be defined for "fsl-usb2-mph" compatible | ||
| 22 | controllers. | ||
| 23 | - dr_mode : indicates the working mode for "fsl-usb2-dr" compatible | ||
| 24 | controllers. Can be "host", "peripheral", or "otg". Default to | ||
| 25 | "host" if not defined for backward compatibility. | ||
| 26 | |||
| 27 | Recommended properties : | ||
| 28 | - interrupts : <a b> where a is the interrupt number and b is a | ||
| 29 | field that represents an encoding of the sense and level | ||
| 30 | information for the interrupt. This should be encoded based on | ||
| 31 | the information in section 2) depending on the type of interrupt | ||
| 32 | controller you have. | ||
| 33 | - interrupt-parent : the phandle for the interrupt controller that | ||
| 34 | services interrupts for this device. | ||
| 35 | |||
| 36 | Example multi port host USB controller device node : | ||
| 37 | usb@22000 { | ||
| 38 | compatible = "fsl-usb2-mph"; | ||
| 39 | reg = <22000 1000>; | ||
| 40 | #address-cells = <1>; | ||
| 41 | #size-cells = <0>; | ||
| 42 | interrupt-parent = <700>; | ||
| 43 | interrupts = <27 1>; | ||
| 44 | phy_type = "ulpi"; | ||
| 45 | port0; | ||
| 46 | port1; | ||
| 47 | }; | ||
| 48 | |||
| 49 | Example dual role USB controller device node : | ||
| 50 | usb@23000 { | ||
| 51 | compatible = "fsl-usb2-dr"; | ||
| 52 | reg = <23000 1000>; | ||
| 53 | #address-cells = <1>; | ||
| 54 | #size-cells = <0>; | ||
| 55 | interrupt-parent = <700>; | ||
| 56 | interrupts = <26 1>; | ||
| 57 | dr_mode = "otg"; | ||
| 58 | phy = "ulpi"; | ||
| 59 | }; | ||
diff --git a/Documentation/vm/slabinfo.c b/Documentation/vm/slabinfo.c index e4230ed16ee7..df3227605d59 100644 --- a/Documentation/vm/slabinfo.c +++ b/Documentation/vm/slabinfo.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Slabinfo: Tool to get reports about slabs | 2 | * Slabinfo: Tool to get reports about slabs |
| 3 | * | 3 | * |
| 4 | * (C) 2007 sgi, Christoph Lameter <clameter@sgi.com> | 4 | * (C) 2007 sgi, Christoph Lameter |
| 5 | * | 5 | * |
| 6 | * Compile by: | 6 | * Compile by: |
| 7 | * | 7 | * |
| @@ -99,7 +99,7 @@ void fatal(const char *x, ...) | |||
| 99 | 99 | ||
| 100 | void usage(void) | 100 | void usage(void) |
| 101 | { | 101 | { |
| 102 | printf("slabinfo 5/7/2007. (c) 2007 sgi. clameter@sgi.com\n\n" | 102 | printf("slabinfo 5/7/2007. (c) 2007 sgi.\n\n" |
| 103 | "slabinfo [-ahnpvtsz] [-d debugopts] [slab-regexp]\n" | 103 | "slabinfo [-ahnpvtsz] [-d debugopts] [slab-regexp]\n" |
| 104 | "-a|--aliases Show aliases\n" | 104 | "-a|--aliases Show aliases\n" |
| 105 | "-A|--activity Most active slabs first\n" | 105 | "-A|--activity Most active slabs first\n" |
diff --git a/Documentation/vm/slub.txt b/Documentation/vm/slub.txt index 7c13f22a0c9e..bb1f5c6e28b3 100644 --- a/Documentation/vm/slub.txt +++ b/Documentation/vm/slub.txt | |||
| @@ -266,4 +266,4 @@ of other objects. | |||
| 266 | 266 | ||
| 267 | slub_debug=FZ,dentry | 267 | slub_debug=FZ,dentry |
| 268 | 268 | ||
| 269 | Christoph Lameter, <clameter@sgi.com>, May 30, 2007 | 269 | Christoph Lameter, May 30, 2007 |
diff --git a/MAINTAINERS b/MAINTAINERS index c984014a5ce5..8619861dd345 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -763,9 +763,10 @@ S: Maintained | |||
| 763 | 763 | ||
| 764 | AUXILIARY DISPLAY DRIVERS | 764 | AUXILIARY DISPLAY DRIVERS |
| 765 | P: Miguel Ojeda Sandonis | 765 | P: Miguel Ojeda Sandonis |
| 766 | M: maxextreme@gmail.com | 766 | M: miguel.ojeda.sandonis@gmail.com |
| 767 | L: linux-kernel@vger.kernel.org | 767 | L: linux-kernel@vger.kernel.org |
| 768 | W: http://auxdisplay.googlepages.com/ | 768 | W: http://miguelojeda.es/auxdisplay.htm |
| 769 | W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm | ||
| 769 | S: Maintained | 770 | S: Maintained |
| 770 | 771 | ||
| 771 | AVR32 ARCHITECTURE | 772 | AVR32 ARCHITECTURE |
| @@ -1055,16 +1056,18 @@ S: Supported | |||
| 1055 | 1056 | ||
| 1056 | CFAG12864B LCD DRIVER | 1057 | CFAG12864B LCD DRIVER |
| 1057 | P: Miguel Ojeda Sandonis | 1058 | P: Miguel Ojeda Sandonis |
| 1058 | M: maxextreme@gmail.com | 1059 | M: miguel.ojeda.sandonis@gmail.com |
| 1059 | L: linux-kernel@vger.kernel.org | 1060 | L: linux-kernel@vger.kernel.org |
| 1060 | W: http://auxdisplay.googlepages.com/ | 1061 | W: http://miguelojeda.es/auxdisplay.htm |
| 1062 | W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm | ||
| 1061 | S: Maintained | 1063 | S: Maintained |
| 1062 | 1064 | ||
| 1063 | CFAG12864BFB LCD FRAMEBUFFER DRIVER | 1065 | CFAG12864BFB LCD FRAMEBUFFER DRIVER |
| 1064 | P: Miguel Ojeda Sandonis | 1066 | P: Miguel Ojeda Sandonis |
| 1065 | M: maxextreme@gmail.com | 1067 | M: miguel.ojeda.sandonis@gmail.com |
| 1066 | L: linux-kernel@vger.kernel.org | 1068 | L: linux-kernel@vger.kernel.org |
| 1067 | W: http://auxdisplay.googlepages.com/ | 1069 | W: http://miguelojeda.es/auxdisplay.htm |
| 1070 | W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm | ||
| 1068 | S: Maintained | 1071 | S: Maintained |
| 1069 | 1072 | ||
| 1070 | CFG80211 and NL80211 | 1073 | CFG80211 and NL80211 |
| @@ -1420,6 +1423,14 @@ M: kristen.c.accardi@intel.com | |||
| 1420 | L: linux-acpi@vger.kernel.org | 1423 | L: linux-acpi@vger.kernel.org |
| 1421 | S: Supported | 1424 | S: Supported |
| 1422 | 1425 | ||
| 1426 | DOCUMENTATION (/Documentation directory) | ||
| 1427 | P: Michael Kerrisk | ||
| 1428 | M: mtk.manpages@gmail.com | ||
| 1429 | P: Randy Dunlap | ||
| 1430 | M: rdunlap@xenotime.net | ||
| 1431 | L: linux-doc@vger.kernel.org | ||
| 1432 | S: Maintained | ||
| 1433 | |||
| 1423 | DOUBLETALK DRIVER | 1434 | DOUBLETALK DRIVER |
| 1424 | P: James R. Van Zandt | 1435 | P: James R. Van Zandt |
| 1425 | M: jrv@vanzandt.mv.com | 1436 | M: jrv@vanzandt.mv.com |
| @@ -1626,13 +1637,13 @@ S: Maintained | |||
| 1626 | 1637 | ||
| 1627 | EXT3 FILE SYSTEM | 1638 | EXT3 FILE SYSTEM |
| 1628 | P: Stephen Tweedie, Andrew Morton | 1639 | P: Stephen Tweedie, Andrew Morton |
| 1629 | M: sct@redhat.com, akpm@linux-foundation.org, adilger@clusterfs.com | 1640 | M: sct@redhat.com, akpm@linux-foundation.org, adilger@sun.com |
| 1630 | L: linux-ext4@vger.kernel.org | 1641 | L: linux-ext4@vger.kernel.org |
| 1631 | S: Maintained | 1642 | S: Maintained |
| 1632 | 1643 | ||
| 1633 | EXT4 FILE SYSTEM | 1644 | EXT4 FILE SYSTEM |
| 1634 | P: Stephen Tweedie, Andrew Morton | 1645 | P: Stephen Tweedie, Andrew Morton |
| 1635 | M: sct@redhat.com, akpm@linux-foundation.org, adilger@clusterfs.com | 1646 | M: sct@redhat.com, akpm@linux-foundation.org, adilger@sun.com |
| 1636 | L: linux-ext4@vger.kernel.org | 1647 | L: linux-ext4@vger.kernel.org |
| 1637 | S: Maintained | 1648 | S: Maintained |
| 1638 | 1649 | ||
| @@ -2428,9 +2439,10 @@ S: Maintained | |||
| 2428 | 2439 | ||
| 2429 | KS0108 LCD CONTROLLER DRIVER | 2440 | KS0108 LCD CONTROLLER DRIVER |
| 2430 | P: Miguel Ojeda Sandonis | 2441 | P: Miguel Ojeda Sandonis |
| 2431 | M: maxextreme@gmail.com | 2442 | M: miguel.ojeda.sandonis@gmail.com |
| 2432 | L: linux-kernel@vger.kernel.org | 2443 | L: linux-kernel@vger.kernel.org |
| 2433 | W: http://auxdisplay.googlepages.com/ | 2444 | W: http://miguelojeda.es/auxdisplay.htm |
| 2445 | W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm | ||
| 2434 | S: Maintained | 2446 | S: Maintained |
| 2435 | 2447 | ||
| 2436 | LAPB module | 2448 | LAPB module |
| @@ -2474,9 +2486,11 @@ M: James.Bottomley@HansenPartnership.com | |||
| 2474 | W: http://www.hansenpartnership.com/voyager | 2486 | W: http://www.hansenpartnership.com/voyager |
| 2475 | S: Maintained | 2487 | S: Maintained |
| 2476 | 2488 | ||
| 2477 | LINUX FOR POWERPC | 2489 | LINUX FOR POWERPC (32-BIT AND 64-BIT) |
| 2478 | P: Paul Mackerras | 2490 | P: Paul Mackerras |
| 2479 | M: paulus@samba.org | 2491 | M: paulus@samba.org |
| 2492 | P: Benjamin Herrenschmidt | ||
| 2493 | M: benh@kernel.crashing.org | ||
| 2480 | W: http://www.penguinppc.org/ | 2494 | W: http://www.penguinppc.org/ |
| 2481 | L: linuxppc-dev@ozlabs.org | 2495 | L: linuxppc-dev@ozlabs.org |
| 2482 | T: git kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc.git | 2496 | T: git kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc.git |
| @@ -2514,13 +2528,6 @@ W: http://wiki.secretlab.ca/index.php/Linux_on_Xilinx_Virtex | |||
| 2514 | L: linuxppc-dev@ozlabs.org | 2528 | L: linuxppc-dev@ozlabs.org |
| 2515 | S: Maintained | 2529 | S: Maintained |
| 2516 | 2530 | ||
| 2517 | LINUX FOR POWERPC BOOT CODE | ||
| 2518 | P: Tom Rini | ||
| 2519 | M: trini@kernel.crashing.org | ||
| 2520 | W: http://www.penguinppc.org/ | ||
| 2521 | L: linuxppc-dev@ozlabs.org | ||
| 2522 | S: Maintained | ||
| 2523 | |||
| 2524 | LINUX FOR POWERPC EMBEDDED PPC8XX | 2531 | LINUX FOR POWERPC EMBEDDED PPC8XX |
| 2525 | P: Vitaly Bordug | 2532 | P: Vitaly Bordug |
| 2526 | M: vitb@kernel.crashing.org | 2533 | M: vitb@kernel.crashing.org |
| @@ -2549,17 +2556,6 @@ P: Arnaldo Carvalho de Melo | |||
| 2549 | M: acme@ghostprotocols.net | 2556 | M: acme@ghostprotocols.net |
| 2550 | S: Maintained | 2557 | S: Maintained |
| 2551 | 2558 | ||
| 2552 | LINUX FOR 64BIT POWERPC | ||
| 2553 | P: Paul Mackerras | ||
| 2554 | M: paulus@samba.org | ||
| 2555 | M: paulus@au.ibm.com | ||
| 2556 | P: Anton Blanchard | ||
| 2557 | M: anton@samba.org | ||
| 2558 | M: anton@au.ibm.com | ||
| 2559 | W: http://www.penguinppc.org/ppc64/ | ||
| 2560 | L: linuxppc-dev@ozlabs.org | ||
| 2561 | S: Supported | ||
| 2562 | |||
| 2563 | LINUX SECURITY MODULE (LSM) FRAMEWORK | 2559 | LINUX SECURITY MODULE (LSM) FRAMEWORK |
| 2564 | P: Chris Wright | 2560 | P: Chris Wright |
| 2565 | M: chrisw@sous-sol.org | 2561 | M: chrisw@sous-sol.org |
| @@ -2678,8 +2674,8 @@ S: Supported | |||
| 2678 | MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7 | 2674 | MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7 |
| 2679 | P: Michael Kerrisk | 2675 | P: Michael Kerrisk |
| 2680 | M: mtk.manpages@gmail.com | 2676 | M: mtk.manpages@gmail.com |
| 2681 | W: ftp://ftp.kernel.org/pub/linux/docs/manpages | 2677 | W: http://www.kernel.org/doc/man-pages |
| 2682 | S: Maintained | 2678 | S: Supported |
| 2683 | 2679 | ||
| 2684 | MARVELL LIBERTAS WIRELESS DRIVER | 2680 | MARVELL LIBERTAS WIRELESS DRIVER |
| 2685 | P: Dan Williams | 2681 | P: Dan Williams |
| @@ -2812,6 +2808,12 @@ W: https://tango.0pointer.de/mailman/listinfo/s270-linux | |||
| 2812 | W: http://0pointer.de/lennart/tchibo.html | 2808 | W: http://0pointer.de/lennart/tchibo.html |
| 2813 | S: Maintained | 2809 | S: Maintained |
| 2814 | 2810 | ||
| 2811 | MULTIFUNCTION DEVICES (MFD) | ||
| 2812 | P: Samuel Ortiz | ||
| 2813 | M: sameo@openedhand.com | ||
| 2814 | L: linux-kernel@vger.kernel.org | ||
| 2815 | S: Supported | ||
| 2816 | |||
| 2815 | MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM | 2817 | MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM |
| 2816 | P: Pierre Ossman | 2818 | P: Pierre Ossman |
| 2817 | M: drzeus-mmc@drzeus.cx | 2819 | M: drzeus-mmc@drzeus.cx |
| @@ -3078,8 +3080,8 @@ L: linux-scsi@vger.kernel.org | |||
| 3078 | S: Maintained | 3080 | S: Maintained |
| 3079 | 3081 | ||
| 3080 | OPROFILE | 3082 | OPROFILE |
| 3081 | P: Philippe Elie | 3083 | P: Robert Richter |
| 3082 | M: phil.el@wanadoo.fr | 3084 | M: robert.richter@amd.com |
| 3083 | L: oprofile-list@lists.sf.net | 3085 | L: oprofile-list@lists.sf.net |
| 3084 | S: Maintained | 3086 | S: Maintained |
| 3085 | 3087 | ||
| @@ -3193,8 +3195,8 @@ L: netdev@vger.kernel.org | |||
| 3193 | S: Maintained | 3195 | S: Maintained |
| 3194 | 3196 | ||
| 3195 | PER-TASK DELAY ACCOUNTING | 3197 | PER-TASK DELAY ACCOUNTING |
| 3196 | P: Shailabh Nagar | 3198 | P: Balbir Singh |
| 3197 | M: nagar@watson.ibm.com | 3199 | M: balbir@linux.vnet.ibm.com |
| 3198 | L: linux-kernel@vger.kernel.org | 3200 | L: linux-kernel@vger.kernel.org |
| 3199 | S: Maintained | 3201 | S: Maintained |
| 3200 | 3202 | ||
| @@ -3686,7 +3688,7 @@ S: Maintained | |||
| 3686 | 3688 | ||
| 3687 | SLAB ALLOCATOR | 3689 | SLAB ALLOCATOR |
| 3688 | P: Christoph Lameter | 3690 | P: Christoph Lameter |
| 3689 | M: clameter@sgi.com | 3691 | M: cl@linux-foundation.org |
| 3690 | P: Pekka Enberg | 3692 | P: Pekka Enberg |
| 3691 | M: penberg@cs.helsinki.fi | 3693 | M: penberg@cs.helsinki.fi |
| 3692 | P: Matt Mackall | 3694 | P: Matt Mackall |
| @@ -3896,8 +3898,8 @@ M: hch@infradead.org | |||
| 3896 | S: Maintained | 3898 | S: Maintained |
| 3897 | 3899 | ||
| 3898 | TASKSTATS STATISTICS INTERFACE | 3900 | TASKSTATS STATISTICS INTERFACE |
| 3899 | P: Shailabh Nagar | 3901 | P: Balbir Singh |
| 3900 | M: nagar@watson.ibm.com | 3902 | M: balbir@linux.vnet.ibm.com |
| 3901 | L: linux-kernel@vger.kernel.org | 3903 | L: linux-kernel@vger.kernel.org |
| 3902 | S: Maintained | 3904 | S: Maintained |
| 3903 | 3905 | ||
| @@ -3993,7 +3995,8 @@ W: http://www.buzzard.org.uk/toshiba/ | |||
| 3993 | S: Maintained | 3995 | S: Maintained |
| 3994 | 3996 | ||
| 3995 | TPM DEVICE DRIVER | 3997 | TPM DEVICE DRIVER |
| 3996 | P: Kylene Hall | 3998 | P: Debora Velarde |
| 3999 | P: Rajiv Andrade | ||
| 3997 | M: tpmdd-devel@lists.sourceforge.net | 4000 | M: tpmdd-devel@lists.sourceforge.net |
| 3998 | W: http://tpmdd.sourceforge.net | 4001 | W: http://tpmdd.sourceforge.net |
| 3999 | P: Marcel Selhorst | 4002 | P: Marcel Selhorst |
| @@ -4312,6 +4315,14 @@ L: netdev@vger.kernel.org | |||
| 4312 | W: http://www.linux-usb.org/usbnet | 4315 | W: http://www.linux-usb.org/usbnet |
| 4313 | S: Maintained | 4316 | S: Maintained |
| 4314 | 4317 | ||
| 4318 | USB VIDEO CLASS | ||
| 4319 | P: Laurent Pinchart | ||
| 4320 | M: laurent.pinchart@skynet.be | ||
| 4321 | L: linx-uvc-devel@berlios.de | ||
| 4322 | L: video4linux-list@redhat.com | ||
| 4323 | W: http://linux-uvc.berlios.de | ||
| 4324 | S: Maintained | ||
| 4325 | |||
| 4315 | USB W996[87]CF DRIVER | 4326 | USB W996[87]CF DRIVER |
| 4316 | P: Luca Risolia | 4327 | P: Luca Risolia |
| 4317 | M: luca.risolia@studio.unibo.it | 4328 | M: luca.risolia@studio.unibo.it |
| @@ -2,7 +2,7 @@ FRED=42 | |||
| 2 | VERSION = 2 | 2 | VERSION = 2 |
| 3 | PATCHLEVEL = 6 | 3 | PATCHLEVEL = 6 |
| 4 | SUBLEVEL = 26 | 4 | SUBLEVEL = 26 |
| 5 | EXTRAVERSION = -rc8 | 5 | EXTRAVERSION = |
| 6 | NAME = Rotary Wombat | 6 | NAME = Rotary Wombat |
| 7 | 7 | ||
| 8 | # *DOCUMENTATION* | 8 | # *DOCUMENTATION* |
diff --git a/arch/alpha/kernel/vmlinux.lds.S b/arch/alpha/kernel/vmlinux.lds.S index f13249be17c5..ef37fc1acaea 100644 --- a/arch/alpha/kernel/vmlinux.lds.S +++ b/arch/alpha/kernel/vmlinux.lds.S | |||
| @@ -25,6 +25,13 @@ SECTIONS | |||
| 25 | } :kernel | 25 | } :kernel |
| 26 | _etext = .; /* End of text section */ | 26 | _etext = .; /* End of text section */ |
| 27 | 27 | ||
| 28 | NOTES :kernel :note | ||
| 29 | .dummy : { | ||
| 30 | *(.dummy) | ||
| 31 | } :kernel | ||
| 32 | |||
| 33 | RODATA | ||
| 34 | |||
| 28 | /* Exception table */ | 35 | /* Exception table */ |
| 29 | . = ALIGN(16); | 36 | . = ALIGN(16); |
| 30 | __ex_table : { | 37 | __ex_table : { |
| @@ -33,13 +40,6 @@ SECTIONS | |||
| 33 | __stop___ex_table = .; | 40 | __stop___ex_table = .; |
| 34 | } | 41 | } |
| 35 | 42 | ||
| 36 | NOTES :kernel :note | ||
| 37 | .dummy : { | ||
| 38 | *(.dummy) | ||
| 39 | } :kernel | ||
| 40 | |||
| 41 | RODATA | ||
| 42 | |||
| 43 | /* Will be freed after init */ | 43 | /* Will be freed after init */ |
| 44 | . = ALIGN(PAGE_SIZE); | 44 | . = ALIGN(PAGE_SIZE); |
| 45 | /* Init code and data */ | 45 | /* Init code and data */ |
diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c index 52fc6a883281..2744673314b4 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c | |||
| @@ -650,7 +650,8 @@ EXPORT_SYMBOL(dma_map_sg); | |||
| 650 | EXPORT_SYMBOL(dma_unmap_sg); | 650 | EXPORT_SYMBOL(dma_unmap_sg); |
| 651 | EXPORT_SYMBOL(dma_sync_single_for_cpu); | 651 | EXPORT_SYMBOL(dma_sync_single_for_cpu); |
| 652 | EXPORT_SYMBOL(dma_sync_single_for_device); | 652 | EXPORT_SYMBOL(dma_sync_single_for_device); |
| 653 | EXPORT_SYMBOL(dma_sync_sg); | 653 | EXPORT_SYMBOL(dma_sync_sg_for_cpu); |
| 654 | EXPORT_SYMBOL(dma_sync_sg_for_device); | ||
| 654 | EXPORT_SYMBOL(dmabounce_register_dev); | 655 | EXPORT_SYMBOL(dmabounce_register_dev); |
| 655 | EXPORT_SYMBOL(dmabounce_unregister_dev); | 656 | EXPORT_SYMBOL(dmabounce_unregister_dev); |
| 656 | 657 | ||
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 02cede295e89..dbf68dc50ae2 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c | |||
| @@ -42,7 +42,7 @@ | |||
| 42 | #define GPMC_STATUS 0x54 | 42 | #define GPMC_STATUS 0x54 |
| 43 | #define GPMC_PREFETCH_CONFIG1 0x1e0 | 43 | #define GPMC_PREFETCH_CONFIG1 0x1e0 |
| 44 | #define GPMC_PREFETCH_CONFIG2 0x1e4 | 44 | #define GPMC_PREFETCH_CONFIG2 0x1e4 |
| 45 | #define GPMC_PREFETCH_CONTROL 0x1e8 | 45 | #define GPMC_PREFETCH_CONTROL 0x1ec |
| 46 | #define GPMC_PREFETCH_STATUS 0x1f0 | 46 | #define GPMC_PREFETCH_STATUS 0x1f0 |
| 47 | #define GPMC_ECC_CONFIG 0x1f4 | 47 | #define GPMC_ECC_CONFIG 0x1f4 |
| 48 | #define GPMC_ECC_CONTROL 0x1f8 | 48 | #define GPMC_ECC_CONTROL 0x1f8 |
diff --git a/arch/arm/mach-realview/platsmp.c b/arch/arm/mach-realview/platsmp.c index 3e57428affee..8e813ed57519 100644 --- a/arch/arm/mach-realview/platsmp.c +++ b/arch/arm/mach-realview/platsmp.c | |||
| @@ -74,6 +74,8 @@ static DEFINE_SPINLOCK(boot_lock); | |||
| 74 | 74 | ||
| 75 | void __cpuinit platform_secondary_init(unsigned int cpu) | 75 | void __cpuinit platform_secondary_init(unsigned int cpu) |
| 76 | { | 76 | { |
| 77 | trace_hardirqs_off(); | ||
| 78 | |||
| 77 | /* | 79 | /* |
| 78 | * the primary core may have used a "cross call" soft interrupt | 80 | * the primary core may have used a "cross call" soft interrupt |
| 79 | * to get this processor out of WFI in the BootMonitor - make | 81 | * to get this processor out of WFI in the BootMonitor - make |
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index c00eda588cd8..39c637b0ffea 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c | |||
| @@ -501,8 +501,6 @@ static inline void omap_enable_channel_irq(int lch) | |||
| 501 | 501 | ||
| 502 | /* Enable some nice interrupts. */ | 502 | /* Enable some nice interrupts. */ |
| 503 | OMAP_DMA_CICR_REG(lch) = dma_chan[lch].enabled_irqs; | 503 | OMAP_DMA_CICR_REG(lch) = dma_chan[lch].enabled_irqs; |
| 504 | |||
| 505 | dma_chan[lch].flags |= OMAP_DMA_ACTIVE; | ||
| 506 | } | 504 | } |
| 507 | 505 | ||
| 508 | static void omap_disable_channel_irq(int lch) | 506 | static void omap_disable_channel_irq(int lch) |
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index 4ae15c8c2488..632cda8f2e76 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
| @@ -547,7 +547,8 @@ setup_arch (char **cmdline_p) | |||
| 547 | # ifdef CONFIG_ACPI_NUMA | 547 | # ifdef CONFIG_ACPI_NUMA |
| 548 | acpi_numa_init(); | 548 | acpi_numa_init(); |
| 549 | per_cpu_scan_finalize((cpus_weight(early_cpu_possible_map) == 0 ? | 549 | per_cpu_scan_finalize((cpus_weight(early_cpu_possible_map) == 0 ? |
| 550 | 32 : cpus_weight(early_cpu_possible_map)), additional_cpus); | 550 | 32 : cpus_weight(early_cpu_possible_map)), |
| 551 | additional_cpus > 0 ? additional_cpus : 0); | ||
| 551 | # endif | 552 | # endif |
| 552 | #else | 553 | #else |
| 553 | # ifdef CONFIG_SMP | 554 | # ifdef CONFIG_SMP |
diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c index 8c73643f2d66..aad1b7b1fff9 100644 --- a/arch/ia64/kernel/time.c +++ b/arch/ia64/kernel/time.c | |||
| @@ -117,6 +117,7 @@ void account_system_vtime(struct task_struct *tsk) | |||
| 117 | 117 | ||
| 118 | local_irq_restore(flags); | 118 | local_irq_restore(flags); |
| 119 | } | 119 | } |
| 120 | EXPORT_SYMBOL_GPL(account_system_vtime); | ||
| 120 | 121 | ||
| 121 | /* | 122 | /* |
| 122 | * Called from the timer interrupt handler to charge accumulated user time | 123 | * Called from the timer interrupt handler to charge accumulated user time |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index e5a7c5d96364..24c5dee91768 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -1006,7 +1006,7 @@ config BOOT_ELF32 | |||
| 1006 | config MIPS_L1_CACHE_SHIFT | 1006 | config MIPS_L1_CACHE_SHIFT |
| 1007 | int | 1007 | int |
| 1008 | default "4" if MACH_DECSTATION | 1008 | default "4" if MACH_DECSTATION |
| 1009 | default "7" if SGI_IP27 || SGI_IP28 || SNI_RM | 1009 | default "7" if SGI_IP22 || SGI_IP27 || SGI_IP28 || SNI_RM |
| 1010 | default "4" if PMC_MSP4200_EVAL | 1010 | default "4" if PMC_MSP4200_EVAL |
| 1011 | default "5" | 1011 | default "5" |
| 1012 | 1012 | ||
diff --git a/arch/mips/kernel/cevt-txx9.c b/arch/mips/kernel/cevt-txx9.c index 795cb8fb0d74..b5fc4eb412d2 100644 --- a/arch/mips/kernel/cevt-txx9.c +++ b/arch/mips/kernel/cevt-txx9.c | |||
| @@ -161,6 +161,9 @@ void __init txx9_tmr_init(unsigned long baseaddr) | |||
| 161 | struct txx9_tmr_reg __iomem *tmrptr; | 161 | struct txx9_tmr_reg __iomem *tmrptr; |
| 162 | 162 | ||
| 163 | tmrptr = ioremap(baseaddr, sizeof(struct txx9_tmr_reg)); | 163 | tmrptr = ioremap(baseaddr, sizeof(struct txx9_tmr_reg)); |
| 164 | /* Start once to make CounterResetEnable effective */ | ||
| 165 | __raw_writel(TXx9_TMTCR_CRE | TXx9_TMTCR_TCE, &tmrptr->tcr); | ||
| 166 | /* Stop and reset the counter */ | ||
| 164 | __raw_writel(TXx9_TMTCR_CRE, &tmrptr->tcr); | 167 | __raw_writel(TXx9_TMTCR_CRE, &tmrptr->tcr); |
| 165 | __raw_writel(0, &tmrptr->tisr); | 168 | __raw_writel(0, &tmrptr->tisr); |
| 166 | __raw_writel(0xffffffff, &tmrptr->cpra); | 169 | __raw_writel(0xffffffff, &tmrptr->cpra); |
diff --git a/arch/mips/mm/c-r3k.c b/arch/mips/mm/c-r3k.c index 76935e320214..27a5b466c85c 100644 --- a/arch/mips/mm/c-r3k.c +++ b/arch/mips/mm/c-r3k.c | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | static unsigned long icache_size, dcache_size; /* Size in bytes */ | 26 | static unsigned long icache_size, dcache_size; /* Size in bytes */ |
| 27 | static unsigned long icache_lsize, dcache_lsize; /* Size in bytes */ | 27 | static unsigned long icache_lsize, dcache_lsize; /* Size in bytes */ |
| 28 | 28 | ||
| 29 | unsigned long __init r3k_cache_size(unsigned long ca_flags) | 29 | unsigned long __cpuinit r3k_cache_size(unsigned long ca_flags) |
| 30 | { | 30 | { |
| 31 | unsigned long flags, status, dummy, size; | 31 | unsigned long flags, status, dummy, size; |
| 32 | volatile unsigned long *p; | 32 | volatile unsigned long *p; |
| @@ -61,7 +61,7 @@ unsigned long __init r3k_cache_size(unsigned long ca_flags) | |||
| 61 | return size * sizeof(*p); | 61 | return size * sizeof(*p); |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | unsigned long __init r3k_cache_lsize(unsigned long ca_flags) | 64 | unsigned long __cpuinit r3k_cache_lsize(unsigned long ca_flags) |
| 65 | { | 65 | { |
| 66 | unsigned long flags, status, lsize, i; | 66 | unsigned long flags, status, lsize, i; |
| 67 | volatile unsigned long *p; | 67 | volatile unsigned long *p; |
| @@ -90,7 +90,7 @@ unsigned long __init r3k_cache_lsize(unsigned long ca_flags) | |||
| 90 | return lsize * sizeof(*p); | 90 | return lsize * sizeof(*p); |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | static void __init r3k_probe_cache(void) | 93 | static void __cpuinit r3k_probe_cache(void) |
| 94 | { | 94 | { |
| 95 | dcache_size = r3k_cache_size(ST0_ISC); | 95 | dcache_size = r3k_cache_size(ST0_ISC); |
| 96 | if (dcache_size) | 96 | if (dcache_size) |
diff --git a/arch/mips/mm/page.c b/arch/mips/mm/page.c index 1edf0cbbeede..1417c6494858 100644 --- a/arch/mips/mm/page.c +++ b/arch/mips/mm/page.c | |||
| @@ -235,13 +235,12 @@ static void __cpuinit set_prefetch_parameters(void) | |||
| 235 | } | 235 | } |
| 236 | /* | 236 | /* |
| 237 | * Too much unrolling will overflow the available space in | 237 | * Too much unrolling will overflow the available space in |
| 238 | * clear_space_array / copy_page_array. 8 words sounds generous, | 238 | * clear_space_array / copy_page_array. |
| 239 | * but a R4000 with 128 byte L2 line length can exceed even that. | ||
| 240 | */ | 239 | */ |
| 241 | half_clear_loop_size = min(8 * clear_word_size, | 240 | half_clear_loop_size = min(16 * clear_word_size, |
| 242 | max(cache_line_size >> 1, | 241 | max(cache_line_size >> 1, |
| 243 | 4 * clear_word_size)); | 242 | 4 * clear_word_size)); |
| 244 | half_copy_loop_size = min(8 * copy_word_size, | 243 | half_copy_loop_size = min(16 * copy_word_size, |
| 245 | max(cache_line_size >> 1, | 244 | max(cache_line_size >> 1, |
| 246 | 4 * copy_word_size)); | 245 | 4 * copy_word_size)); |
| 247 | } | 246 | } |
| @@ -263,21 +262,23 @@ static inline void __cpuinit build_clear_pref(u32 **buf, int off) | |||
| 263 | if (pref_bias_clear_store) { | 262 | if (pref_bias_clear_store) { |
| 264 | uasm_i_pref(buf, pref_dst_mode, pref_bias_clear_store + off, | 263 | uasm_i_pref(buf, pref_dst_mode, pref_bias_clear_store + off, |
| 265 | A0); | 264 | A0); |
| 266 | } else if (cpu_has_cache_cdex_s) { | 265 | } else if (cache_line_size == (half_clear_loop_size << 1)) { |
| 267 | uasm_i_cache(buf, Create_Dirty_Excl_SD, off, A0); | 266 | if (cpu_has_cache_cdex_s) { |
| 268 | } else if (cpu_has_cache_cdex_p) { | 267 | uasm_i_cache(buf, Create_Dirty_Excl_SD, off, A0); |
| 269 | if (R4600_V1_HIT_CACHEOP_WAR && cpu_is_r4600_v1_x()) { | 268 | } else if (cpu_has_cache_cdex_p) { |
| 270 | uasm_i_nop(buf); | 269 | if (R4600_V1_HIT_CACHEOP_WAR && cpu_is_r4600_v1_x()) { |
| 271 | uasm_i_nop(buf); | 270 | uasm_i_nop(buf); |
| 272 | uasm_i_nop(buf); | 271 | uasm_i_nop(buf); |
| 273 | uasm_i_nop(buf); | 272 | uasm_i_nop(buf); |
| 274 | } | 273 | uasm_i_nop(buf); |
| 274 | } | ||
| 275 | 275 | ||
| 276 | if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x()) | 276 | if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x()) |
| 277 | uasm_i_lw(buf, ZERO, ZERO, AT); | 277 | uasm_i_lw(buf, ZERO, ZERO, AT); |
| 278 | 278 | ||
| 279 | uasm_i_cache(buf, Create_Dirty_Excl_D, off, A0); | 279 | uasm_i_cache(buf, Create_Dirty_Excl_D, off, A0); |
| 280 | } | 280 | } |
| 281 | } | ||
| 281 | } | 282 | } |
| 282 | 283 | ||
| 283 | void __cpuinit build_clear_page(void) | 284 | void __cpuinit build_clear_page(void) |
| @@ -403,20 +404,22 @@ static inline void build_copy_store_pref(u32 **buf, int off) | |||
| 403 | if (pref_bias_copy_store) { | 404 | if (pref_bias_copy_store) { |
| 404 | uasm_i_pref(buf, pref_dst_mode, pref_bias_copy_store + off, | 405 | uasm_i_pref(buf, pref_dst_mode, pref_bias_copy_store + off, |
| 405 | A0); | 406 | A0); |
| 406 | } else if (cpu_has_cache_cdex_s) { | 407 | } else if (cache_line_size == (half_copy_loop_size << 1)) { |
| 407 | uasm_i_cache(buf, Create_Dirty_Excl_SD, off, A0); | 408 | if (cpu_has_cache_cdex_s) { |
| 408 | } else if (cpu_has_cache_cdex_p) { | 409 | uasm_i_cache(buf, Create_Dirty_Excl_SD, off, A0); |
| 409 | if (R4600_V1_HIT_CACHEOP_WAR && cpu_is_r4600_v1_x()) { | 410 | } else if (cpu_has_cache_cdex_p) { |
| 410 | uasm_i_nop(buf); | 411 | if (R4600_V1_HIT_CACHEOP_WAR && cpu_is_r4600_v1_x()) { |
| 411 | uasm_i_nop(buf); | 412 | uasm_i_nop(buf); |
| 412 | uasm_i_nop(buf); | 413 | uasm_i_nop(buf); |
| 413 | uasm_i_nop(buf); | 414 | uasm_i_nop(buf); |
| 414 | } | 415 | uasm_i_nop(buf); |
| 416 | } | ||
| 415 | 417 | ||
| 416 | if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x()) | 418 | if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x()) |
| 417 | uasm_i_lw(buf, ZERO, ZERO, AT); | 419 | uasm_i_lw(buf, ZERO, ZERO, AT); |
| 418 | 420 | ||
| 419 | uasm_i_cache(buf, Create_Dirty_Excl_D, off, A0); | 421 | uasm_i_cache(buf, Create_Dirty_Excl_D, off, A0); |
| 422 | } | ||
| 420 | } | 423 | } |
| 421 | } | 424 | } |
| 422 | 425 | ||
diff --git a/arch/mips/mm/sc-rm7k.c b/arch/mips/mm/sc-rm7k.c index fc227f3b1199..e3abfb2d7e86 100644 --- a/arch/mips/mm/sc-rm7k.c +++ b/arch/mips/mm/sc-rm7k.c | |||
| @@ -86,7 +86,7 @@ static void rm7k_sc_inv(unsigned long addr, unsigned long size) | |||
| 86 | /* | 86 | /* |
| 87 | * This function is executed in uncached address space. | 87 | * This function is executed in uncached address space. |
| 88 | */ | 88 | */ |
| 89 | static __init void __rm7k_sc_enable(void) | 89 | static __cpuinit void __rm7k_sc_enable(void) |
| 90 | { | 90 | { |
| 91 | int i; | 91 | int i; |
| 92 | 92 | ||
| @@ -107,7 +107,7 @@ static __init void __rm7k_sc_enable(void) | |||
| 107 | } | 107 | } |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | static __init void rm7k_sc_enable(void) | 110 | static __cpuinit void rm7k_sc_enable(void) |
| 111 | { | 111 | { |
| 112 | if (read_c0_config() & RM7K_CONF_SE) | 112 | if (read_c0_config() & RM7K_CONF_SE) |
| 113 | return; | 113 | return; |
diff --git a/arch/mips/sgi-ip32/ip32-irq.c b/arch/mips/sgi-ip32/ip32-irq.c index b0ea0e43ba48..0d6b6663d5f6 100644 --- a/arch/mips/sgi-ip32/ip32-irq.c +++ b/arch/mips/sgi-ip32/ip32-irq.c | |||
| @@ -425,6 +425,11 @@ static void ip32_irq0(void) | |||
| 425 | BUILD_BUG_ON(MACEISA_SERIAL2_RDMAOR_IRQ - MACEISA_AUDIO_SW_IRQ != 31); | 425 | BUILD_BUG_ON(MACEISA_SERIAL2_RDMAOR_IRQ - MACEISA_AUDIO_SW_IRQ != 31); |
| 426 | 426 | ||
| 427 | crime_int = crime->istat & crime_mask; | 427 | crime_int = crime->istat & crime_mask; |
| 428 | |||
| 429 | /* crime sometime delivers spurious interrupts, ignore them */ | ||
| 430 | if (unlikely(crime_int == 0)) | ||
| 431 | return; | ||
| 432 | |||
| 428 | irq = MACE_VID_IN1_IRQ + __ffs(crime_int); | 433 | irq = MACE_VID_IN1_IRQ + __ffs(crime_int); |
| 429 | 434 | ||
| 430 | if (crime_int & CRIME_MACEISA_INT_MASK) { | 435 | if (crime_int & CRIME_MACEISA_INT_MASK) { |
diff --git a/arch/mn10300/kernel/mn10300_ksyms.c b/arch/mn10300/kernel/mn10300_ksyms.c index 6d19628634e3..f9eb9753a404 100644 --- a/arch/mn10300/kernel/mn10300_ksyms.c +++ b/arch/mn10300/kernel/mn10300_ksyms.c | |||
| @@ -10,8 +10,11 @@ | |||
| 10 | */ | 10 | */ |
| 11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| 12 | #include <asm/uaccess.h> | 12 | #include <asm/uaccess.h> |
| 13 | #include <asm/pgtable.h> | ||
| 13 | 14 | ||
| 14 | 15 | ||
| 16 | EXPORT_SYMBOL(empty_zero_page); | ||
| 17 | |||
| 15 | EXPORT_SYMBOL(change_bit); | 18 | EXPORT_SYMBOL(change_bit); |
| 16 | EXPORT_SYMBOL(test_and_change_bit); | 19 | EXPORT_SYMBOL(test_and_change_bit); |
| 17 | 20 | ||
| @@ -31,7 +34,9 @@ extern u64 __ashrdi3(u64, unsigned); | |||
| 31 | extern u64 __ashldi3(u64, unsigned); | 34 | extern u64 __ashldi3(u64, unsigned); |
| 32 | extern u64 __lshrdi3(u64, unsigned); | 35 | extern u64 __lshrdi3(u64, unsigned); |
| 33 | extern s64 __negdi2(s64); | 36 | extern s64 __negdi2(s64); |
| 37 | extern int __ucmpdi2(u64, u64); | ||
| 34 | EXPORT_SYMBOL(__ashrdi3); | 38 | EXPORT_SYMBOL(__ashrdi3); |
| 35 | EXPORT_SYMBOL(__ashldi3); | 39 | EXPORT_SYMBOL(__ashldi3); |
| 36 | EXPORT_SYMBOL(__lshrdi3); | 40 | EXPORT_SYMBOL(__lshrdi3); |
| 37 | EXPORT_SYMBOL(__negdi2); | 41 | EXPORT_SYMBOL(__negdi2); |
| 42 | EXPORT_SYMBOL(__ucmpdi2); | ||
diff --git a/arch/mn10300/kernel/process.c b/arch/mn10300/kernel/process.c index 9c623c88387b..b28c9a60445b 100644 --- a/arch/mn10300/kernel/process.c +++ b/arch/mn10300/kernel/process.c | |||
| @@ -153,6 +153,7 @@ int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | |||
| 153 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, | 153 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, |
| 154 | NULL, NULL); | 154 | NULL, NULL); |
| 155 | } | 155 | } |
| 156 | EXPORT_SYMBOL(kernel_thread); | ||
| 156 | 157 | ||
| 157 | /* | 158 | /* |
| 158 | * free current thread data structures etc.. | 159 | * free current thread data structures etc.. |
diff --git a/arch/mn10300/lib/Makefile b/arch/mn10300/lib/Makefile index fdfa9ec5b5bb..0cd2346f4c13 100644 --- a/arch/mn10300/lib/Makefile +++ b/arch/mn10300/lib/Makefile | |||
| @@ -4,4 +4,4 @@ | |||
| 4 | 4 | ||
| 5 | lib-y = delay.o usercopy.o checksum.o bitops.o memcpy.o memmove.o memset.o | 5 | lib-y = delay.o usercopy.o checksum.o bitops.o memcpy.o memmove.o memset.o |
| 6 | lib-y += do_csum.o | 6 | lib-y += do_csum.o |
| 7 | lib-y += __ashldi3.o __ashrdi3.o __lshrdi3.o negdi2.o | 7 | lib-y += __ashldi3.o __ashrdi3.o __lshrdi3.o negdi2.o __ucmpdi2.o |
diff --git a/arch/mn10300/lib/__ucmpdi2.S b/arch/mn10300/lib/__ucmpdi2.S new file mode 100644 index 000000000000..60dcbdfe386c --- /dev/null +++ b/arch/mn10300/lib/__ucmpdi2.S | |||
| @@ -0,0 +1,43 @@ | |||
| 1 | /* __ucmpdi2.S: 64-bit unsigned compare | ||
| 2 | * | ||
| 3 | * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. | ||
| 4 | * Written by David Howells (dhowells@redhat.com) | ||
| 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 | ||
| 8 | * as published by the Free Software Foundation; either version | ||
| 9 | * 2 of the License, or (at your option) any later version. | ||
| 10 | */ | ||
| 11 | |||
| 12 | |||
| 13 | .text | ||
| 14 | .p2align 4 | ||
| 15 | |||
| 16 | ############################################################################### | ||
| 17 | # | ||
| 18 | # int __ucmpdi2(unsigned long long a [D0:D1], | ||
| 19 | # unsigned long long b [(SP,12),(SP,16)]) | ||
| 20 | # | ||
| 21 | # - returns 0, 1, or 2 as a <, =, > b respectively. | ||
| 22 | # | ||
| 23 | ############################################################################### | ||
| 24 | .globl __ucmpdi2 | ||
| 25 | .type __ucmpdi2,@function | ||
| 26 | __ucmpdi2: | ||
| 27 | mov (12,sp),a0 # b.lsw | ||
| 28 | mov (16,sp),a1 # b.msw | ||
| 29 | |||
| 30 | sub a0,d0 | ||
| 31 | subc a1,d1 # may clear Z, never sets it | ||
| 32 | bne __ucmpdi2_differ # a.msw != b.msw | ||
| 33 | mov +1,d0 | ||
| 34 | rets | ||
| 35 | |||
| 36 | __ucmpdi2_differ: | ||
| 37 | # C flag is set if LE, clear if GE | ||
| 38 | subc d0,d0 # -1 if LE, 0 if GE | ||
| 39 | add +1,d0 # 0 if LE, 1 if GE | ||
| 40 | add d0,d0 # 0 if LE, 2 if GE | ||
| 41 | rets | ||
| 42 | |||
| 43 | .size __ucmpdi2, .-__ucmpdi2 | ||
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index f2a0f50146e1..aaf99892d1b3 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
| @@ -110,6 +110,7 @@ config PPC | |||
| 110 | select HAVE_KPROBES | 110 | select HAVE_KPROBES |
| 111 | select HAVE_KRETPROBES | 111 | select HAVE_KRETPROBES |
| 112 | select HAVE_LMB | 112 | select HAVE_LMB |
| 113 | select HAVE_DMA_ATTRS | ||
| 113 | 114 | ||
| 114 | config EARLY_PRINTK | 115 | config EARLY_PRINTK |
| 115 | bool | 116 | bool |
| @@ -458,6 +459,19 @@ config CMDLINE | |||
| 458 | some command-line options at build time by entering them here. In | 459 | some command-line options at build time by entering them here. In |
| 459 | most cases you will need to specify the root device here. | 460 | most cases you will need to specify the root device here. |
| 460 | 461 | ||
| 462 | config EXTRA_TARGETS | ||
| 463 | string "Additional default image types" | ||
| 464 | help | ||
| 465 | List additional targets to be built by the bootwrapper here (separated | ||
| 466 | by spaces). This is useful for targets that depend of device tree | ||
| 467 | files in the .dts directory. | ||
| 468 | |||
| 469 | Targets in this list will be build as part of the default build | ||
| 470 | target, or when the user does a 'make zImage' or a | ||
| 471 | 'make zImage.initrd'. | ||
| 472 | |||
| 473 | If unsure, leave blank | ||
| 474 | |||
| 461 | if !44x || BROKEN | 475 | if !44x || BROKEN |
| 462 | config ARCH_WANTS_FREEZER_CONTROL | 476 | config ARCH_WANTS_FREEZER_CONTROL |
| 463 | def_bool y | 477 | def_bool y |
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index 59ae7d9cdccf..9155c9312c1e 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
| @@ -163,12 +163,25 @@ bootwrapper_install %.dtb: | |||
| 163 | $(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@) | 163 | $(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@) |
| 164 | 164 | ||
| 165 | define archhelp | 165 | define archhelp |
| 166 | @echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage.*)' | 166 | @echo '* zImage - Build default images selected by kernel config' |
| 167 | @echo ' zImage.* - Compressed kernel image (arch/$(ARCH)/boot/zImage.*)' | ||
| 168 | @echo ' uImage - U-Boot native image format' | ||
| 169 | @echo ' cuImage.<dt> - Backwards compatible U-Boot image for older' | ||
| 170 | @echo ' versions which do not support device trees' | ||
| 171 | @echo ' dtbImage.<dt> - zImage with an embedded device tree blob' | ||
| 172 | @echo ' simpleImage.<dt> - Firmware independent image.' | ||
| 173 | @echo ' treeImage.<dt> - Support for older IBM 4xx firmware (not U-Boot)' | ||
| 167 | @echo ' install - Install kernel using' | 174 | @echo ' install - Install kernel using' |
| 168 | @echo ' (your) ~/bin/installkernel or' | 175 | @echo ' (your) ~/bin/installkernel or' |
| 169 | @echo ' (distribution) /sbin/installkernel or' | 176 | @echo ' (distribution) /sbin/installkernel or' |
| 170 | @echo ' install to $$(INSTALL_PATH) and run lilo' | 177 | @echo ' install to $$(INSTALL_PATH) and run lilo' |
| 171 | @echo ' *_defconfig - Select default config from arch/$(ARCH)/configs' | 178 | @echo ' *_defconfig - Select default config from arch/$(ARCH)/configs' |
| 179 | @echo '' | ||
| 180 | @echo ' Targets with <dt> embed a device tree blob inside the image' | ||
| 181 | @echo ' These targets support board with firmware that does not' | ||
| 182 | @echo ' support passing a device tree directly. Replace <dt> with the' | ||
| 183 | @echo ' name of a dts file from the arch/$(ARCH)/boot/dts/ directory' | ||
| 184 | @echo ' (minus the .dts extension).' | ||
| 172 | endef | 185 | endef |
| 173 | 186 | ||
| 174 | install: | 187 | install: |
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index 751a6e6070d2..19f83c8f219d 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile | |||
| @@ -68,7 +68,7 @@ src-plat := of.c cuboot-52xx.c cuboot-824x.c cuboot-83xx.c cuboot-85xx.c holly.c | |||
| 68 | fixed-head.S ep88xc.c ep405.c cuboot-c2k.c \ | 68 | fixed-head.S ep88xc.c ep405.c cuboot-c2k.c \ |
| 69 | cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \ | 69 | cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \ |
| 70 | cuboot-warp.c cuboot-85xx-cpm2.c cuboot-yosemite.c simpleboot.c \ | 70 | cuboot-warp.c cuboot-85xx-cpm2.c cuboot-yosemite.c simpleboot.c \ |
| 71 | virtex405-head.S redboot-83xx.c cuboot-sam440ep.c | 71 | virtex405-head.S virtex.c redboot-83xx.c cuboot-sam440ep.c |
| 72 | src-boot := $(src-wlib) $(src-plat) empty.c | 72 | src-boot := $(src-wlib) $(src-plat) empty.c |
| 73 | 73 | ||
| 74 | src-boot := $(addprefix $(obj)/, $(src-boot)) | 74 | src-boot := $(addprefix $(obj)/, $(src-boot)) |
| @@ -276,10 +276,14 @@ ifeq ($(CONFIG_PPC32),y) | |||
| 276 | image-$(CONFIG_PPC_PMAC) += zImage.coff zImage.miboot | 276 | image-$(CONFIG_PPC_PMAC) += zImage.coff zImage.miboot |
| 277 | endif | 277 | endif |
| 278 | 278 | ||
| 279 | # Allow extra targets to be added to the defconfig | ||
| 280 | image-y += $(subst ",,$(CONFIG_EXTRA_TARGETS)) | ||
| 281 | |||
| 279 | initrd- := $(patsubst zImage%, zImage.initrd%, $(image-n) $(image-)) | 282 | initrd- := $(patsubst zImage%, zImage.initrd%, $(image-n) $(image-)) |
| 280 | initrd-y := $(patsubst zImage%, zImage.initrd%, \ | 283 | initrd-y := $(patsubst zImage%, zImage.initrd%, \ |
| 281 | $(patsubst dtbImage%, dtbImage.initrd%, \ | 284 | $(patsubst dtbImage%, dtbImage.initrd%, \ |
| 282 | $(patsubst treeImage%, treeImage.initrd%, $(image-y)))) | 285 | $(patsubst simpleImage%, simpleImage.initrd%, \ |
| 286 | $(patsubst treeImage%, treeImage.initrd%, $(image-y))))) | ||
| 283 | initrd-y := $(filter-out $(image-y), $(initrd-y)) | 287 | initrd-y := $(filter-out $(image-y), $(initrd-y)) |
| 284 | targets += $(image-y) $(initrd-y) | 288 | targets += $(image-y) $(initrd-y) |
| 285 | 289 | ||
diff --git a/arch/powerpc/boot/dts/canyonlands.dts b/arch/powerpc/boot/dts/canyonlands.dts index f9fe03252150..79fe412c11c9 100644 --- a/arch/powerpc/boot/dts/canyonlands.dts +++ b/arch/powerpc/boot/dts/canyonlands.dts | |||
| @@ -266,7 +266,7 @@ | |||
| 266 | 266 | ||
| 267 | EMAC0: ethernet@ef600e00 { | 267 | EMAC0: ethernet@ef600e00 { |
| 268 | device_type = "network"; | 268 | device_type = "network"; |
| 269 | compatible = "ibm,emac-460ex", "ibm,emac4"; | 269 | compatible = "ibm,emac-460ex", "ibm,emac4sync"; |
| 270 | interrupt-parent = <&EMAC0>; | 270 | interrupt-parent = <&EMAC0>; |
| 271 | interrupts = <0x0 0x1>; | 271 | interrupts = <0x0 0x1>; |
| 272 | #interrupt-cells = <1>; | 272 | #interrupt-cells = <1>; |
| @@ -274,7 +274,7 @@ | |||
| 274 | #size-cells = <0>; | 274 | #size-cells = <0>; |
| 275 | interrupt-map = </*Status*/ 0x0 &UIC2 0x10 0x4 | 275 | interrupt-map = </*Status*/ 0x0 &UIC2 0x10 0x4 |
| 276 | /*Wake*/ 0x1 &UIC2 0x14 0x4>; | 276 | /*Wake*/ 0x1 &UIC2 0x14 0x4>; |
| 277 | reg = <0xef600e00 0x00000070>; | 277 | reg = <0xef600e00 0x000000c4>; |
| 278 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ | 278 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ |
| 279 | mal-device = <&MAL0>; | 279 | mal-device = <&MAL0>; |
| 280 | mal-tx-channel = <0>; | 280 | mal-tx-channel = <0>; |
| @@ -295,7 +295,7 @@ | |||
| 295 | 295 | ||
| 296 | EMAC1: ethernet@ef600f00 { | 296 | EMAC1: ethernet@ef600f00 { |
| 297 | device_type = "network"; | 297 | device_type = "network"; |
| 298 | compatible = "ibm,emac-460ex", "ibm,emac4"; | 298 | compatible = "ibm,emac-460ex", "ibm,emac4sync"; |
| 299 | interrupt-parent = <&EMAC1>; | 299 | interrupt-parent = <&EMAC1>; |
| 300 | interrupts = <0x0 0x1>; | 300 | interrupts = <0x0 0x1>; |
| 301 | #interrupt-cells = <1>; | 301 | #interrupt-cells = <1>; |
| @@ -303,7 +303,7 @@ | |||
| 303 | #size-cells = <0>; | 303 | #size-cells = <0>; |
| 304 | interrupt-map = </*Status*/ 0x0 &UIC2 0x11 0x4 | 304 | interrupt-map = </*Status*/ 0x0 &UIC2 0x11 0x4 |
| 305 | /*Wake*/ 0x1 &UIC2 0x15 0x4>; | 305 | /*Wake*/ 0x1 &UIC2 0x15 0x4>; |
| 306 | reg = <0xef600f00 0x00000070>; | 306 | reg = <0xef600f00 0x000000c4>; |
| 307 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ | 307 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ |
| 308 | mal-device = <&MAL0>; | 308 | mal-device = <&MAL0>; |
| 309 | mal-tx-channel = <1>; | 309 | mal-tx-channel = <1>; |
diff --git a/arch/powerpc/boot/dts/glacier.dts b/arch/powerpc/boot/dts/glacier.dts index 463650c5f61d..24cf0dba120c 100644 --- a/arch/powerpc/boot/dts/glacier.dts +++ b/arch/powerpc/boot/dts/glacier.dts | |||
| @@ -283,7 +283,7 @@ | |||
| 283 | #size-cells = <0>; | 283 | #size-cells = <0>; |
| 284 | interrupt-map = </*Status*/ 0x0 &UIC2 0x10 0x4 | 284 | interrupt-map = </*Status*/ 0x0 &UIC2 0x10 0x4 |
| 285 | /*Wake*/ 0x1 &UIC2 0x14 0x4>; | 285 | /*Wake*/ 0x1 &UIC2 0x14 0x4>; |
| 286 | reg = <0xef600e00 0x00000070>; | 286 | reg = <0xef600e00 0x00000074>; |
| 287 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ | 287 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ |
| 288 | mal-device = <&MAL0>; | 288 | mal-device = <&MAL0>; |
| 289 | mal-tx-channel = <0>; | 289 | mal-tx-channel = <0>; |
| @@ -312,7 +312,7 @@ | |||
| 312 | #size-cells = <0>; | 312 | #size-cells = <0>; |
| 313 | interrupt-map = </*Status*/ 0x0 &UIC2 0x11 0x4 | 313 | interrupt-map = </*Status*/ 0x0 &UIC2 0x11 0x4 |
| 314 | /*Wake*/ 0x1 &UIC2 0x15 0x4>; | 314 | /*Wake*/ 0x1 &UIC2 0x15 0x4>; |
| 315 | reg = <0xef600f00 0x00000070>; | 315 | reg = <0xef600f00 0x00000074>; |
| 316 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ | 316 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ |
| 317 | mal-device = <&MAL0>; | 317 | mal-device = <&MAL0>; |
| 318 | mal-tx-channel = <1>; | 318 | mal-tx-channel = <1>; |
| @@ -342,7 +342,7 @@ | |||
| 342 | #size-cells = <0>; | 342 | #size-cells = <0>; |
| 343 | interrupt-map = </*Status*/ 0x0 &UIC2 0x12 0x4 | 343 | interrupt-map = </*Status*/ 0x0 &UIC2 0x12 0x4 |
| 344 | /*Wake*/ 0x1 &UIC2 0x16 0x4>; | 344 | /*Wake*/ 0x1 &UIC2 0x16 0x4>; |
| 345 | reg = <0xef601100 0x00000070>; | 345 | reg = <0xef601100 0x00000074>; |
| 346 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ | 346 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ |
| 347 | mal-device = <&MAL0>; | 347 | mal-device = <&MAL0>; |
| 348 | mal-tx-channel = <2>; | 348 | mal-tx-channel = <2>; |
| @@ -370,7 +370,7 @@ | |||
| 370 | #size-cells = <0>; | 370 | #size-cells = <0>; |
| 371 | interrupt-map = </*Status*/ 0x0 &UIC2 0x13 0x4 | 371 | interrupt-map = </*Status*/ 0x0 &UIC2 0x13 0x4 |
| 372 | /*Wake*/ 0x1 &UIC2 0x17 0x4>; | 372 | /*Wake*/ 0x1 &UIC2 0x17 0x4>; |
| 373 | reg = <0xef601200 0x00000070>; | 373 | reg = <0xef601200 0x00000074>; |
| 374 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ | 374 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ |
| 375 | mal-device = <&MAL0>; | 375 | mal-device = <&MAL0>; |
| 376 | mal-tx-channel = <3>; | 376 | mal-tx-channel = <3>; |
diff --git a/arch/powerpc/boot/dts/haleakala.dts b/arch/powerpc/boot/dts/haleakala.dts index 2c2fceaabbcd..513bc43a71af 100644 --- a/arch/powerpc/boot/dts/haleakala.dts +++ b/arch/powerpc/boot/dts/haleakala.dts | |||
| @@ -206,7 +206,7 @@ | |||
| 206 | EMAC0: ethernet@ef600900 { | 206 | EMAC0: ethernet@ef600900 { |
| 207 | linux,network-index = <0x0>; | 207 | linux,network-index = <0x0>; |
| 208 | device_type = "network"; | 208 | device_type = "network"; |
| 209 | compatible = "ibm,emac-405exr", "ibm,emac4"; | 209 | compatible = "ibm,emac-405exr", "ibm,emac4sync"; |
| 210 | interrupt-parent = <&EMAC0>; | 210 | interrupt-parent = <&EMAC0>; |
| 211 | interrupts = <0x0 0x1>; | 211 | interrupts = <0x0 0x1>; |
| 212 | #interrupt-cells = <1>; | 212 | #interrupt-cells = <1>; |
| @@ -214,7 +214,7 @@ | |||
| 214 | #size-cells = <0>; | 214 | #size-cells = <0>; |
| 215 | interrupt-map = </*Status*/ 0x0 &UIC0 0x18 0x4 | 215 | interrupt-map = </*Status*/ 0x0 &UIC0 0x18 0x4 |
| 216 | /*Wake*/ 0x1 &UIC1 0x1d 0x4>; | 216 | /*Wake*/ 0x1 &UIC1 0x1d 0x4>; |
| 217 | reg = <0xef600900 0x00000070>; | 217 | reg = <0xef600900 0x000000c4>; |
| 218 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ | 218 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ |
| 219 | mal-device = <&MAL0>; | 219 | mal-device = <&MAL0>; |
| 220 | mal-tx-channel = <0>; | 220 | mal-tx-channel = <0>; |
diff --git a/arch/powerpc/boot/dts/katmai.dts b/arch/powerpc/boot/dts/katmai.dts index b94bf61b9bcc..077819bc3cbd 100644 --- a/arch/powerpc/boot/dts/katmai.dts +++ b/arch/powerpc/boot/dts/katmai.dts | |||
| @@ -208,7 +208,7 @@ | |||
| 208 | compatible = "ibm,emac-440spe", "ibm,emac4"; | 208 | compatible = "ibm,emac-440spe", "ibm,emac4"; |
| 209 | interrupt-parent = <&UIC1>; | 209 | interrupt-parent = <&UIC1>; |
| 210 | interrupts = <0x1c 0x4 0x1d 0x4>; | 210 | interrupts = <0x1c 0x4 0x1d 0x4>; |
| 211 | reg = <0x10000800 0x00000070>; | 211 | reg = <0x10000800 0x00000074>; |
| 212 | local-mac-address = [000000000000]; | 212 | local-mac-address = [000000000000]; |
| 213 | mal-device = <&MAL0>; | 213 | mal-device = <&MAL0>; |
| 214 | mal-tx-channel = <0>; | 214 | mal-tx-channel = <0>; |
diff --git a/arch/powerpc/boot/dts/kilauea.dts b/arch/powerpc/boot/dts/kilauea.dts index 3ed6a8fee1d5..dececc4b5ff2 100644 --- a/arch/powerpc/boot/dts/kilauea.dts +++ b/arch/powerpc/boot/dts/kilauea.dts | |||
| @@ -207,7 +207,7 @@ | |||
| 207 | EMAC0: ethernet@ef600900 { | 207 | EMAC0: ethernet@ef600900 { |
| 208 | linux,network-index = <0x0>; | 208 | linux,network-index = <0x0>; |
| 209 | device_type = "network"; | 209 | device_type = "network"; |
| 210 | compatible = "ibm,emac-405ex", "ibm,emac4"; | 210 | compatible = "ibm,emac-405ex", "ibm,emac4sync"; |
| 211 | interrupt-parent = <&EMAC0>; | 211 | interrupt-parent = <&EMAC0>; |
| 212 | interrupts = <0x0 0x1>; | 212 | interrupts = <0x0 0x1>; |
| 213 | #interrupt-cells = <1>; | 213 | #interrupt-cells = <1>; |
| @@ -215,7 +215,7 @@ | |||
| 215 | #size-cells = <0>; | 215 | #size-cells = <0>; |
| 216 | interrupt-map = </*Status*/ 0x0 &UIC0 0x18 0x4 | 216 | interrupt-map = </*Status*/ 0x0 &UIC0 0x18 0x4 |
| 217 | /*Wake*/ 0x1 &UIC1 0x1d 0x4>; | 217 | /*Wake*/ 0x1 &UIC1 0x1d 0x4>; |
| 218 | reg = <0xef600900 0x00000070>; | 218 | reg = <0xef600900 0x000000c4>; |
| 219 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ | 219 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ |
| 220 | mal-device = <&MAL0>; | 220 | mal-device = <&MAL0>; |
| 221 | mal-tx-channel = <0>; | 221 | mal-tx-channel = <0>; |
| @@ -235,7 +235,7 @@ | |||
| 235 | EMAC1: ethernet@ef600a00 { | 235 | EMAC1: ethernet@ef600a00 { |
| 236 | linux,network-index = <0x1>; | 236 | linux,network-index = <0x1>; |
| 237 | device_type = "network"; | 237 | device_type = "network"; |
| 238 | compatible = "ibm,emac-405ex", "ibm,emac4"; | 238 | compatible = "ibm,emac-405ex", "ibm,emac4sync"; |
| 239 | interrupt-parent = <&EMAC1>; | 239 | interrupt-parent = <&EMAC1>; |
| 240 | interrupts = <0x0 0x1>; | 240 | interrupts = <0x0 0x1>; |
| 241 | #interrupt-cells = <1>; | 241 | #interrupt-cells = <1>; |
| @@ -243,7 +243,7 @@ | |||
| 243 | #size-cells = <0>; | 243 | #size-cells = <0>; |
| 244 | interrupt-map = </*Status*/ 0x0 &UIC0 0x19 0x4 | 244 | interrupt-map = </*Status*/ 0x0 &UIC0 0x19 0x4 |
| 245 | /*Wake*/ 0x1 &UIC1 0x1f 0x4>; | 245 | /*Wake*/ 0x1 &UIC1 0x1f 0x4>; |
| 246 | reg = <0xef600a00 0x00000070>; | 246 | reg = <0xef600a00 0x000000c4>; |
| 247 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ | 247 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ |
| 248 | mal-device = <&MAL0>; | 248 | mal-device = <&MAL0>; |
| 249 | mal-tx-channel = <1>; | 249 | mal-tx-channel = <1>; |
diff --git a/arch/powerpc/boot/dts/ksi8560.dts b/arch/powerpc/boot/dts/ksi8560.dts index fd5804398417..49737589ffc8 100644 --- a/arch/powerpc/boot/dts/ksi8560.dts +++ b/arch/powerpc/boot/dts/ksi8560.dts | |||
| @@ -59,7 +59,7 @@ | |||
| 59 | memory-controller@2000 { | 59 | memory-controller@2000 { |
| 60 | compatible = "fsl,8540-memory-controller"; | 60 | compatible = "fsl,8540-memory-controller"; |
| 61 | reg = <0x2000 0x1000>; | 61 | reg = <0x2000 0x1000>; |
| 62 | interrupt-parent = <&MPIC>; | 62 | interrupt-parent = <&mpic>; |
| 63 | interrupts = <0x12 0x2>; | 63 | interrupts = <0x12 0x2>; |
| 64 | }; | 64 | }; |
| 65 | 65 | ||
| @@ -68,7 +68,7 @@ | |||
| 68 | reg = <0x20000 0x1000>; | 68 | reg = <0x20000 0x1000>; |
| 69 | cache-line-size = <0x20>; /* 32 bytes */ | 69 | cache-line-size = <0x20>; /* 32 bytes */ |
| 70 | cache-size = <0x40000>; /* L2, 256K */ | 70 | cache-size = <0x40000>; /* L2, 256K */ |
| 71 | interrupt-parent = <&MPIC>; | 71 | interrupt-parent = <&mpic>; |
| 72 | interrupts = <0x10 0x2>; | 72 | interrupts = <0x10 0x2>; |
| 73 | }; | 73 | }; |
| 74 | 74 | ||
| @@ -79,7 +79,7 @@ | |||
| 79 | compatible = "fsl-i2c"; | 79 | compatible = "fsl-i2c"; |
| 80 | reg = <0x3000 0x100>; | 80 | reg = <0x3000 0x100>; |
| 81 | interrupts = <0x2b 0x2>; | 81 | interrupts = <0x2b 0x2>; |
| 82 | interrupt-parent = <&MPIC>; | 82 | interrupt-parent = <&mpic>; |
| 83 | dfsrr; | 83 | dfsrr; |
| 84 | }; | 84 | }; |
| 85 | 85 | ||
| @@ -131,13 +131,13 @@ | |||
| 131 | reg = <0x24520 0x20>; | 131 | reg = <0x24520 0x20>; |
| 132 | 132 | ||
| 133 | PHY1: ethernet-phy@1 { | 133 | PHY1: ethernet-phy@1 { |
| 134 | interrupt-parent = <&MPIC>; | 134 | interrupt-parent = <&mpic>; |
| 135 | reg = <0x1>; | 135 | reg = <0x1>; |
| 136 | device_type = "ethernet-phy"; | 136 | device_type = "ethernet-phy"; |
| 137 | }; | 137 | }; |
| 138 | 138 | ||
| 139 | PHY2: ethernet-phy@2 { | 139 | PHY2: ethernet-phy@2 { |
| 140 | interrupt-parent = <&MPIC>; | 140 | interrupt-parent = <&mpic>; |
| 141 | reg = <0x2>; | 141 | reg = <0x2>; |
| 142 | device_type = "ethernet-phy"; | 142 | device_type = "ethernet-phy"; |
| 143 | }; | 143 | }; |
| @@ -151,7 +151,7 @@ | |||
| 151 | /* Mac address filled in by bootwrapper */ | 151 | /* Mac address filled in by bootwrapper */ |
| 152 | local-mac-address = [ 00 00 00 00 00 00 ]; | 152 | local-mac-address = [ 00 00 00 00 00 00 ]; |
| 153 | interrupts = <0x1d 0x2 0x1e 0x2 0x22 0x2>; | 153 | interrupts = <0x1d 0x2 0x1e 0x2 0x22 0x2>; |
| 154 | interrupt-parent = <&MPIC>; | 154 | interrupt-parent = <&mpic>; |
| 155 | phy-handle = <&PHY1>; | 155 | phy-handle = <&PHY1>; |
| 156 | }; | 156 | }; |
| 157 | 157 | ||
| @@ -163,11 +163,11 @@ | |||
| 163 | /* Mac address filled in by bootwrapper */ | 163 | /* Mac address filled in by bootwrapper */ |
| 164 | local-mac-address = [ 00 00 00 00 00 00 ]; | 164 | local-mac-address = [ 00 00 00 00 00 00 ]; |
| 165 | interrupts = <0x23 0x2 0x24 0x2 0x28 0x2>; | 165 | interrupts = <0x23 0x2 0x24 0x2 0x28 0x2>; |
| 166 | interrupt-parent = <&MPIC>; | 166 | interrupt-parent = <&mpic>; |
| 167 | phy-handle = <&PHY2>; | 167 | phy-handle = <&PHY2>; |
| 168 | }; | 168 | }; |
| 169 | 169 | ||
| 170 | MPIC: pic@40000 { | 170 | mpic: pic@40000 { |
| 171 | #address-cells = <0>; | 171 | #address-cells = <0>; |
| 172 | #interrupt-cells = <2>; | 172 | #interrupt-cells = <2>; |
| 173 | interrupt-controller; | 173 | interrupt-controller; |
| @@ -206,7 +206,7 @@ | |||
| 206 | #interrupt-cells = <2>; | 206 | #interrupt-cells = <2>; |
| 207 | interrupt-controller; | 207 | interrupt-controller; |
| 208 | interrupts = <0x2e 0x2>; | 208 | interrupts = <0x2e 0x2>; |
| 209 | interrupt-parent = <&MPIC>; | 209 | interrupt-parent = <&mpic>; |
| 210 | reg = <0x90c00 0x80>; | 210 | reg = <0x90c00 0x80>; |
| 211 | compatible = "fsl,mpc8560-cpm-pic", "fsl,cpm2-pic"; | 211 | compatible = "fsl,mpc8560-cpm-pic", "fsl,cpm2-pic"; |
| 212 | }; | 212 | }; |
| @@ -244,7 +244,7 @@ | |||
| 244 | fsl,mdc-pin = <25>; | 244 | fsl,mdc-pin = <25>; |
| 245 | 245 | ||
| 246 | PHY0: ethernet-phy@0 { | 246 | PHY0: ethernet-phy@0 { |
| 247 | interrupt-parent = <&MPIC>; | 247 | interrupt-parent = <&mpic>; |
| 248 | reg = <0x0>; | 248 | reg = <0x0>; |
| 249 | device_type = "ethernet-phy"; | 249 | device_type = "ethernet-phy"; |
| 250 | }; | 250 | }; |
diff --git a/arch/powerpc/boot/dts/makalu.dts b/arch/powerpc/boot/dts/makalu.dts index 1dfcd7ed199c..945508c7e7d8 100644 --- a/arch/powerpc/boot/dts/makalu.dts +++ b/arch/powerpc/boot/dts/makalu.dts | |||
| @@ -207,7 +207,7 @@ | |||
| 207 | EMAC0: ethernet@ef600900 { | 207 | EMAC0: ethernet@ef600900 { |
| 208 | linux,network-index = <0x0>; | 208 | linux,network-index = <0x0>; |
| 209 | device_type = "network"; | 209 | device_type = "network"; |
| 210 | compatible = "ibm,emac-405ex", "ibm,emac4"; | 210 | compatible = "ibm,emac-405ex", "ibm,emac4sync"; |
| 211 | interrupt-parent = <&EMAC0>; | 211 | interrupt-parent = <&EMAC0>; |
| 212 | interrupts = <0x0 0x1>; | 212 | interrupts = <0x0 0x1>; |
| 213 | #interrupt-cells = <1>; | 213 | #interrupt-cells = <1>; |
| @@ -215,7 +215,7 @@ | |||
| 215 | #size-cells = <0>; | 215 | #size-cells = <0>; |
| 216 | interrupt-map = </*Status*/ 0x0 &UIC0 0x18 0x4 | 216 | interrupt-map = </*Status*/ 0x0 &UIC0 0x18 0x4 |
| 217 | /*Wake*/ 0x1 &UIC1 0x1d 0x4>; | 217 | /*Wake*/ 0x1 &UIC1 0x1d 0x4>; |
| 218 | reg = <0xef600900 0x00000070>; | 218 | reg = <0xef600900 0x000000c4>; |
| 219 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ | 219 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ |
| 220 | mal-device = <&MAL0>; | 220 | mal-device = <&MAL0>; |
| 221 | mal-tx-channel = <0>; | 221 | mal-tx-channel = <0>; |
| @@ -235,7 +235,7 @@ | |||
| 235 | EMAC1: ethernet@ef600a00 { | 235 | EMAC1: ethernet@ef600a00 { |
| 236 | linux,network-index = <0x1>; | 236 | linux,network-index = <0x1>; |
| 237 | device_type = "network"; | 237 | device_type = "network"; |
| 238 | compatible = "ibm,emac-405ex", "ibm,emac4"; | 238 | compatible = "ibm,emac-405ex", "ibm,emac4sync"; |
| 239 | interrupt-parent = <&EMAC1>; | 239 | interrupt-parent = <&EMAC1>; |
| 240 | interrupts = <0x0 0x1>; | 240 | interrupts = <0x0 0x1>; |
| 241 | #interrupt-cells = <1>; | 241 | #interrupt-cells = <1>; |
| @@ -243,7 +243,7 @@ | |||
| 243 | #size-cells = <0>; | 243 | #size-cells = <0>; |
| 244 | interrupt-map = </*Status*/ 0x0 &UIC0 0x19 0x4 | 244 | interrupt-map = </*Status*/ 0x0 &UIC0 0x19 0x4 |
| 245 | /*Wake*/ 0x1 &UIC1 0x1f 0x4>; | 245 | /*Wake*/ 0x1 &UIC1 0x1f 0x4>; |
| 246 | reg = <0xef600a00 0x00000070>; | 246 | reg = <0xef600a00 0x000000c4>; |
| 247 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ | 247 | local-mac-address = [000000000000]; /* Filled in by U-Boot */ |
| 248 | mal-device = <&MAL0>; | 248 | mal-device = <&MAL0>; |
| 249 | mal-tx-channel = <1>; | 249 | mal-tx-channel = <1>; |
diff --git a/arch/powerpc/boot/dts/mpc8272ads.dts b/arch/powerpc/boot/dts/mpc8272ads.dts index 46e2da30c3dd..2a1929acaabd 100644 --- a/arch/powerpc/boot/dts/mpc8272ads.dts +++ b/arch/powerpc/boot/dts/mpc8272ads.dts | |||
| @@ -217,6 +217,17 @@ | |||
| 217 | linux,network-index = <1>; | 217 | linux,network-index = <1>; |
| 218 | fsl,cpm-command = <0x16200300>; | 218 | fsl,cpm-command = <0x16200300>; |
| 219 | }; | 219 | }; |
| 220 | |||
| 221 | i2c@11860 { | ||
| 222 | compatible = "fsl,mpc8272-i2c", | ||
| 223 | "fsl,cpm2-i2c"; | ||
| 224 | reg = <0x11860 0x20 0x8afc 0x2>; | ||
| 225 | interrupts = <1 8>; | ||
| 226 | interrupt-parent = <&PIC>; | ||
| 227 | fsl,cpm-command = <0x29600000>; | ||
| 228 | #address-cells = <1>; | ||
| 229 | #size-cells = <0>; | ||
| 230 | }; | ||
| 220 | }; | 231 | }; |
| 221 | 232 | ||
| 222 | PIC: interrupt-controller@10c00 { | 233 | PIC: interrupt-controller@10c00 { |
| @@ -226,22 +237,15 @@ | |||
| 226 | compatible = "fsl,mpc8272-pic", "fsl,cpm2-pic"; | 237 | compatible = "fsl,mpc8272-pic", "fsl,cpm2-pic"; |
| 227 | }; | 238 | }; |
| 228 | 239 | ||
| 229 | /* May need to remove if on a part without crypto engine */ | ||
| 230 | crypto@30000 { | 240 | crypto@30000 { |
| 231 | device_type = "crypto"; | 241 | compatible = "fsl,sec1.0"; |
| 232 | model = "SEC2"; | 242 | reg = <0x40000 0x13000>; |
| 233 | compatible = "fsl,mpc8272-talitos-sec2", | 243 | interrupts = <47 0x8>; |
| 234 | "fsl,talitos-sec2", | ||
| 235 | "fsl,talitos", | ||
| 236 | "talitos"; | ||
| 237 | reg = <0x30000 0x10000>; | ||
| 238 | interrupts = <11 8>; | ||
| 239 | interrupt-parent = <&PIC>; | 244 | interrupt-parent = <&PIC>; |
| 240 | num-channels = <4>; | 245 | fsl,num-channels = <4>; |
| 241 | channel-fifo-len = <24>; | 246 | fsl,channel-fifo-len = <24>; |
| 242 | exec-units-mask = <0x7e>; | 247 | fsl,exec-units-mask = <0x7e>; |
| 243 | /* desc mask is for rev1.x, we need runtime fixup for >=2.x */ | 248 | fsl,descriptor-types-mask = <0x1010415>; |
| 244 | descriptor-types-mask = <0x1010ebf>; | ||
| 245 | }; | 249 | }; |
| 246 | }; | 250 | }; |
| 247 | 251 | ||
diff --git a/arch/powerpc/boot/dts/mpc8313erdb.dts b/arch/powerpc/boot/dts/mpc8313erdb.dts index b2068430a06d..3664fb584026 100644 --- a/arch/powerpc/boot/dts/mpc8313erdb.dts +++ b/arch/powerpc/boot/dts/mpc8313erdb.dts | |||
| @@ -254,17 +254,14 @@ | |||
| 254 | }; | 254 | }; |
| 255 | 255 | ||
| 256 | crypto@30000 { | 256 | crypto@30000 { |
| 257 | device_type = "crypto"; | 257 | compatible = "fsl,sec2.2", "fsl,sec2.1", "fsl,sec2.0"; |
| 258 | model = "SEC2"; | 258 | reg = <0x30000 0x10000>; |
| 259 | compatible = "talitos"; | ||
| 260 | reg = <0x30000 0x7000>; | ||
| 261 | interrupts = <11 0x8>; | 259 | interrupts = <11 0x8>; |
| 262 | interrupt-parent = <&ipic>; | 260 | interrupt-parent = <&ipic>; |
| 263 | /* Rev. 2.2 */ | 261 | fsl,num-channels = <1>; |
| 264 | num-channels = <1>; | 262 | fsl,channel-fifo-len = <24>; |
| 265 | channel-fifo-len = <24>; | 263 | fsl,exec-units-mask = <0x4c>; |
| 266 | exec-units-mask = <0x0000004c>; | 264 | fsl,descriptor-types-mask = <0x0122003f>; |
| 267 | descriptor-types-mask = <0x0122003f>; | ||
| 268 | }; | 265 | }; |
| 269 | 266 | ||
| 270 | /* IPIC | 267 | /* IPIC |
diff --git a/arch/powerpc/boot/dts/mpc8315erdb.dts b/arch/powerpc/boot/dts/mpc8315erdb.dts index a40e8064d429..f704513fb930 100644 --- a/arch/powerpc/boot/dts/mpc8315erdb.dts +++ b/arch/powerpc/boot/dts/mpc8315erdb.dts | |||
| @@ -241,17 +241,16 @@ | |||
| 241 | }; | 241 | }; |
| 242 | 242 | ||
| 243 | crypto@30000 { | 243 | crypto@30000 { |
| 244 | model = "SEC3"; | 244 | compatible = "fsl,sec3.3", "fsl,sec3.1", "fsl,sec3.0", |
| 245 | device_type = "crypto"; | 245 | "fsl,sec2.4", "fsl,sec2.2", "fsl,sec2.1", |
| 246 | compatible = "talitos"; | 246 | "fsl,sec2.0"; |
| 247 | reg = <0x30000 0x10000>; | 247 | reg = <0x30000 0x10000>; |
| 248 | interrupts = <11 0x8>; | 248 | interrupts = <11 0x8>; |
| 249 | interrupt-parent = <&ipic>; | 249 | interrupt-parent = <&ipic>; |
| 250 | /* Rev. 3.0 geometry */ | 250 | fsl,num-channels = <4>; |
| 251 | num-channels = <4>; | 251 | fsl,channel-fifo-len = <24>; |
| 252 | channel-fifo-len = <24>; | 252 | fsl,exec-units-mask = <0x97c>; |
| 253 | exec-units-mask = <0x000001fe>; | 253 | fsl,descriptor-types-mask = <0x3ab0abf>; |
| 254 | descriptor-types-mask = <0x03ab0ebf>; | ||
| 255 | }; | 254 | }; |
| 256 | 255 | ||
| 257 | sata@18000 { | 256 | sata@18000 { |
diff --git a/arch/powerpc/boot/dts/mpc832x_mds.dts b/arch/powerpc/boot/dts/mpc832x_mds.dts index b5968b6c8a29..7345743d3d96 100644 --- a/arch/powerpc/boot/dts/mpc832x_mds.dts +++ b/arch/powerpc/boot/dts/mpc832x_mds.dts | |||
| @@ -150,17 +150,14 @@ | |||
| 150 | }; | 150 | }; |
| 151 | 151 | ||
| 152 | crypto@30000 { | 152 | crypto@30000 { |
| 153 | device_type = "crypto"; | 153 | compatible = "fsl,sec2.2", "fsl,sec2.1", "fsl,sec2.0"; |
| 154 | model = "SEC2"; | 154 | reg = <0x30000 0x10000>; |
| 155 | compatible = "talitos"; | ||
| 156 | reg = <0x30000 0x7000>; | ||
| 157 | interrupts = <11 0x8>; | 155 | interrupts = <11 0x8>; |
| 158 | interrupt-parent = <&ipic>; | 156 | interrupt-parent = <&ipic>; |
| 159 | /* Rev. 2.2 */ | 157 | fsl,num-channels = <1>; |
| 160 | num-channels = <1>; | 158 | fsl,channel-fifo-len = <24>; |
| 161 | channel-fifo-len = <24>; | 159 | fsl,exec-units-mask = <0x4c>; |
| 162 | exec-units-mask = <0x0000004c>; | 160 | fsl,descriptor-types-mask = <0x0122003f>; |
| 163 | descriptor-types-mask = <0x0122003f>; | ||
| 164 | }; | 161 | }; |
| 165 | 162 | ||
| 166 | ipic: pic@700 { | 163 | ipic: pic@700 { |
diff --git a/arch/powerpc/boot/dts/mpc832x_rdb.dts b/arch/powerpc/boot/dts/mpc832x_rdb.dts index a798d8639a7d..e74c045a0f8c 100644 --- a/arch/powerpc/boot/dts/mpc832x_rdb.dts +++ b/arch/powerpc/boot/dts/mpc832x_rdb.dts | |||
| @@ -128,17 +128,14 @@ | |||
| 128 | }; | 128 | }; |
| 129 | 129 | ||
| 130 | crypto@30000 { | 130 | crypto@30000 { |
| 131 | device_type = "crypto"; | 131 | compatible = "fsl,sec2.2", "fsl,sec2.1", "fsl,sec2.0"; |
| 132 | model = "SEC2"; | 132 | reg = <0x30000 0x10000>; |
| 133 | compatible = "talitos"; | ||
| 134 | reg = <0x30000 0x7000>; | ||
| 135 | interrupts = <11 0x8>; | 133 | interrupts = <11 0x8>; |
| 136 | interrupt-parent = <&ipic>; | 134 | interrupt-parent = <&ipic>; |
| 137 | /* Rev. 2.2 */ | 135 | fsl,num-channels = <1>; |
| 138 | num-channels = <1>; | 136 | fsl,channel-fifo-len = <24>; |
| 139 | channel-fifo-len = <24>; | 137 | fsl,exec-units-mask = <0x4c>; |
| 140 | exec-units-mask = <0x0000004c>; | 138 | fsl,descriptor-types-mask = <0x0122003f>; |
| 141 | descriptor-types-mask = <0x0122003f>; | ||
| 142 | }; | 139 | }; |
| 143 | 140 | ||
| 144 | ipic:pic@700 { | 141 | ipic:pic@700 { |
diff --git a/arch/powerpc/boot/dts/mpc8349emitx.dts b/arch/powerpc/boot/dts/mpc8349emitx.dts index fc0f4c918c76..8dfab5662585 100644 --- a/arch/powerpc/boot/dts/mpc8349emitx.dts +++ b/arch/powerpc/boot/dts/mpc8349emitx.dts | |||
| @@ -213,16 +213,14 @@ | |||
| 213 | }; | 213 | }; |
| 214 | 214 | ||
| 215 | crypto@30000 { | 215 | crypto@30000 { |
| 216 | device_type = "crypto"; | 216 | compatible = "fsl,sec2.0"; |
| 217 | model = "SEC2"; | ||
| 218 | compatible = "talitos"; | ||
| 219 | reg = <0x30000 0x10000>; | 217 | reg = <0x30000 0x10000>; |
| 220 | interrupts = <11 0x8>; | 218 | interrupts = <11 0x8>; |
| 221 | interrupt-parent = <&ipic>; | 219 | interrupt-parent = <&ipic>; |
| 222 | num-channels = <4>; | 220 | fsl,num-channels = <4>; |
| 223 | channel-fifo-len = <24>; | 221 | fsl,channel-fifo-len = <24>; |
| 224 | exec-units-mask = <0x0000007e>; | 222 | fsl,exec-units-mask = <0x7e>; |
| 225 | descriptor-types-mask = <0x01010ebf>; | 223 | fsl,descriptor-types-mask = <0x01010ebf>; |
| 226 | }; | 224 | }; |
| 227 | 225 | ||
| 228 | ipic: pic@700 { | 226 | ipic: pic@700 { |
diff --git a/arch/powerpc/boot/dts/mpc8349emitxgp.dts b/arch/powerpc/boot/dts/mpc8349emitxgp.dts index e6afb1d1e19e..49ca3497eefb 100644 --- a/arch/powerpc/boot/dts/mpc8349emitxgp.dts +++ b/arch/powerpc/boot/dts/mpc8349emitxgp.dts | |||
| @@ -186,16 +186,14 @@ | |||
| 186 | }; | 186 | }; |
| 187 | 187 | ||
| 188 | crypto@30000 { | 188 | crypto@30000 { |
| 189 | device_type = "crypto"; | 189 | compatible = "fsl,sec2.0"; |
| 190 | model = "SEC2"; | ||
| 191 | compatible = "talitos"; | ||
| 192 | reg = <0x30000 0x10000>; | 190 | reg = <0x30000 0x10000>; |
| 193 | interrupts = <11 0x8>; | 191 | interrupts = <11 0x8>; |
| 194 | interrupt-parent = <&ipic>; | 192 | interrupt-parent = <&ipic>; |
| 195 | num-channels = <4>; | 193 | fsl,num-channels = <4>; |
| 196 | channel-fifo-len = <24>; | 194 | fsl,channel-fifo-len = <24>; |
| 197 | exec-units-mask = <0x0000007e>; | 195 | fsl,exec-units-mask = <0x7e>; |
| 198 | descriptor-types-mask = <0x01010ebf>; | 196 | fsl,descriptor-types-mask = <0x01010ebf>; |
| 199 | }; | 197 | }; |
| 200 | 198 | ||
| 201 | ipic: pic@700 { | 199 | ipic: pic@700 { |
diff --git a/arch/powerpc/boot/dts/mpc834x_mds.dts b/arch/powerpc/boot/dts/mpc834x_mds.dts index 9c75c7c69e21..ba586cb7afbb 100644 --- a/arch/powerpc/boot/dts/mpc834x_mds.dts +++ b/arch/powerpc/boot/dts/mpc834x_mds.dts | |||
| @@ -228,20 +228,15 @@ | |||
| 228 | interrupt-parent = <&ipic>; | 228 | interrupt-parent = <&ipic>; |
| 229 | }; | 229 | }; |
| 230 | 230 | ||
| 231 | /* May need to remove if on a part without crypto engine */ | ||
| 232 | crypto@30000 { | 231 | crypto@30000 { |
| 233 | device_type = "crypto"; | 232 | compatible = "fsl,sec2.0"; |
| 234 | model = "SEC2"; | ||
| 235 | compatible = "talitos"; | ||
| 236 | reg = <0x30000 0x10000>; | 233 | reg = <0x30000 0x10000>; |
| 237 | interrupts = <11 0x8>; | 234 | interrupts = <11 0x8>; |
| 238 | interrupt-parent = <&ipic>; | 235 | interrupt-parent = <&ipic>; |
| 239 | num-channels = <4>; | 236 | fsl,num-channels = <4>; |
| 240 | channel-fifo-len = <24>; | 237 | fsl,channel-fifo-len = <24>; |
| 241 | exec-units-mask = <0x0000007e>; | 238 | fsl,exec-units-mask = <0x7e>; |
| 242 | /* desc mask is for rev2.0, | 239 | fsl,descriptor-types-mask = <0x01010ebf>; |
| 243 | * we need runtime fixup for >2.0 */ | ||
| 244 | descriptor-types-mask = <0x01010ebf>; | ||
| 245 | }; | 240 | }; |
| 246 | 241 | ||
| 247 | /* IPIC | 242 | /* IPIC |
diff --git a/arch/powerpc/boot/dts/mpc836x_mds.dts b/arch/powerpc/boot/dts/mpc836x_mds.dts index 8e33b155f112..3701dae1ee02 100644 --- a/arch/powerpc/boot/dts/mpc836x_mds.dts +++ b/arch/powerpc/boot/dts/mpc836x_mds.dts | |||
| @@ -154,17 +154,14 @@ | |||
| 154 | }; | 154 | }; |
| 155 | 155 | ||
| 156 | crypto@30000 { | 156 | crypto@30000 { |
| 157 | device_type = "crypto"; | 157 | compatible = "fsl,sec2.0"; |
| 158 | model = "SEC2"; | ||
| 159 | compatible = "talitos"; | ||
| 160 | reg = <0x30000 0x10000>; | 158 | reg = <0x30000 0x10000>; |
| 161 | interrupts = <11 0x8>; | 159 | interrupts = <11 0x8>; |
| 162 | interrupt-parent = <&ipic>; | 160 | interrupt-parent = <&ipic>; |
| 163 | num-channels = <4>; | 161 | fsl,num-channels = <4>; |
| 164 | channel-fifo-len = <24>; | 162 | fsl,channel-fifo-len = <24>; |
| 165 | exec-units-mask = <0x0000007e>; | 163 | fsl,exec-units-mask = <0x7e>; |
| 166 | /* desc mask is for rev1.x, we need runtime fixup for >=2.x */ | 164 | fsl,descriptor-types-mask = <0x01010ebf>; |
| 167 | descriptor-types-mask = <0x01010ebf>; | ||
| 168 | }; | 165 | }; |
| 169 | 166 | ||
| 170 | ipic: pic@700 { | 167 | ipic: pic@700 { |
diff --git a/arch/powerpc/boot/dts/mpc8377_mds.dts b/arch/powerpc/boot/dts/mpc8377_mds.dts index 49a38cb95b52..0a700cb5f611 100644 --- a/arch/powerpc/boot/dts/mpc8377_mds.dts +++ b/arch/powerpc/boot/dts/mpc8377_mds.dts | |||
| @@ -269,16 +269,15 @@ | |||
| 269 | }; | 269 | }; |
| 270 | 270 | ||
| 271 | crypto@30000 { | 271 | crypto@30000 { |
| 272 | model = "SEC3"; | 272 | compatible = "fsl,sec3.0", "fsl,sec2.4", "fsl,sec2.2", |
| 273 | compatible = "talitos"; | 273 | "fsl,sec2.1", "fsl,sec2.0"; |
| 274 | reg = <0x30000 0x10000>; | 274 | reg = <0x30000 0x10000>; |
| 275 | interrupts = <11 0x8>; | 275 | interrupts = <11 0x8>; |
| 276 | interrupt-parent = <&ipic>; | 276 | interrupt-parent = <&ipic>; |
| 277 | /* Rev. 3.0 geometry */ | 277 | fsl,num-channels = <4>; |
| 278 | num-channels = <4>; | 278 | fsl,channel-fifo-len = <24>; |
| 279 | channel-fifo-len = <24>; | 279 | fsl,exec-units-mask = <0x9fe>; |
| 280 | exec-units-mask = <0x000001fe>; | 280 | fsl,descriptor-types-mask = <0x3ab0ebf>; |
| 281 | descriptor-types-mask = <0x03ab0ebf>; | ||
| 282 | }; | 281 | }; |
| 283 | 282 | ||
| 284 | sdhc@2e000 { | 283 | sdhc@2e000 { |
diff --git a/arch/powerpc/boot/dts/mpc8377_rdb.dts b/arch/powerpc/boot/dts/mpc8377_rdb.dts index 1f4538790302..ed137aa83d5f 100644 --- a/arch/powerpc/boot/dts/mpc8377_rdb.dts +++ b/arch/powerpc/boot/dts/mpc8377_rdb.dts | |||
| @@ -248,17 +248,15 @@ | |||
| 248 | }; | 248 | }; |
| 249 | 249 | ||
| 250 | crypto@30000 { | 250 | crypto@30000 { |
| 251 | model = "SEC3"; | 251 | compatible = "fsl,sec3.0", "fsl,sec2.4", "fsl,sec2.2", |
| 252 | device_type = "crypto"; | 252 | "fsl,sec2.1", "fsl,sec2.0"; |
| 253 | compatible = "talitos"; | ||
| 254 | reg = <0x30000 0x10000>; | 253 | reg = <0x30000 0x10000>; |
| 255 | interrupts = <11 0x8>; | 254 | interrupts = <11 0x8>; |
| 256 | interrupt-parent = <&ipic>; | 255 | interrupt-parent = <&ipic>; |
| 257 | /* Rev. 3.0 geometry */ | 256 | fsl,num-channels = <4>; |
| 258 | num-channels = <4>; | 257 | fsl,channel-fifo-len = <24>; |
| 259 | channel-fifo-len = <24>; | 258 | fsl,exec-units-mask = <0x9fe>; |
| 260 | exec-units-mask = <0x000001fe>; | 259 | fsl,descriptor-types-mask = <0x3ab0ebf>; |
| 261 | descriptor-types-mask = <0x03ab0ebf>; | ||
| 262 | }; | 260 | }; |
| 263 | 261 | ||
| 264 | sata@18000 { | 262 | sata@18000 { |
diff --git a/arch/powerpc/boot/dts/mpc8378_mds.dts b/arch/powerpc/boot/dts/mpc8378_mds.dts index 99ad49d4f13f..29c8c76a58f7 100644 --- a/arch/powerpc/boot/dts/mpc8378_mds.dts +++ b/arch/powerpc/boot/dts/mpc8378_mds.dts | |||
| @@ -269,16 +269,15 @@ | |||
| 269 | }; | 269 | }; |
| 270 | 270 | ||
| 271 | crypto@30000 { | 271 | crypto@30000 { |
| 272 | model = "SEC3"; | 272 | compatible = "fsl,sec3.0", "fsl,sec2.4", "fsl,sec2.2", |
| 273 | compatible = "talitos"; | 273 | "fsl,sec2.1", "fsl,sec2.0"; |
| 274 | reg = <0x30000 0x10000>; | 274 | reg = <0x30000 0x10000>; |
| 275 | interrupts = <11 0x8>; | 275 | interrupts = <11 0x8>; |
| 276 | interrupt-parent = <&ipic>; | 276 | interrupt-parent = <&ipic>; |
| 277 | /* Rev. 3.0 geometry */ | 277 | fsl,num-channels = <4>; |
| 278 | num-channels = <4>; | 278 | fsl,channel-fifo-len = <24>; |
| 279 | channel-fifo-len = <24>; | 279 | fsl,exec-units-mask = <0x9fe>; |
| 280 | exec-units-mask = <0x000001fe>; | 280 | fsl,descriptor-types-mask = <0x3ab0ebf>; |
| 281 | descriptor-types-mask = <0x03ab0ebf>; | ||
| 282 | }; | 281 | }; |
| 283 | 282 | ||
| 284 | sdhc@2e000 { | 283 | sdhc@2e000 { |
diff --git a/arch/powerpc/boot/dts/mpc8378_rdb.dts b/arch/powerpc/boot/dts/mpc8378_rdb.dts index 44e34d3f21cf..34a7f2f935e1 100644 --- a/arch/powerpc/boot/dts/mpc8378_rdb.dts +++ b/arch/powerpc/boot/dts/mpc8378_rdb.dts | |||
| @@ -248,17 +248,15 @@ | |||
| 248 | }; | 248 | }; |
| 249 | 249 | ||
| 250 | crypto@30000 { | 250 | crypto@30000 { |
| 251 | model = "SEC3"; | 251 | compatible = "fsl,sec3.0", "fsl,sec2.4", "fsl,sec2.2", |
| 252 | device_type = "crypto"; | 252 | "fsl,sec2.1", "fsl,sec2.0"; |
| 253 | compatible = "talitos"; | ||
| 254 | reg = <0x30000 0x10000>; | 253 | reg = <0x30000 0x10000>; |
| 255 | interrupts = <11 0x8>; | 254 | interrupts = <11 0x8>; |
| 256 | interrupt-parent = <&ipic>; | 255 | interrupt-parent = <&ipic>; |
| 257 | /* Rev. 3.0 geometry */ | 256 | fsl,num-channels = <4>; |
| 258 | num-channels = <4>; | 257 | fsl,channel-fifo-len = <24>; |
| 259 | channel-fifo-len = <24>; | 258 | fsl,exec-units-mask = <0x9fe>; |
| 260 | exec-units-mask = <0x000001fe>; | 259 | fsl,descriptor-types-mask = <0x3ab0ebf>; |
| 261 | descriptor-types-mask = <0x03ab0ebf>; | ||
| 262 | }; | 260 | }; |
| 263 | 261 | ||
| 264 | /* IPIC | 262 | /* IPIC |
diff --git a/arch/powerpc/boot/dts/mpc8379_mds.dts b/arch/powerpc/boot/dts/mpc8379_mds.dts index 980be8136276..d641a8985ea3 100644 --- a/arch/powerpc/boot/dts/mpc8379_mds.dts +++ b/arch/powerpc/boot/dts/mpc8379_mds.dts | |||
| @@ -269,16 +269,15 @@ | |||
| 269 | }; | 269 | }; |
| 270 | 270 | ||
| 271 | crypto@30000 { | 271 | crypto@30000 { |
| 272 | model = "SEC3"; | 272 | compatible = "fsl,sec3.0", "fsl,sec2.4", "fsl,sec2.2", |
| 273 | compatible = "talitos"; | 273 | "fsl,sec2.1", "fsl,sec2.0"; |
| 274 | reg = <0x30000 0x10000>; | 274 | reg = <0x30000 0x10000>; |
| 275 | interrupts = <11 0x8>; | 275 | interrupts = <11 0x8>; |
| 276 | interrupt-parent = <&ipic>; | 276 | interrupt-parent = <&ipic>; |
| 277 | /* Rev. 3.0 geometry */ | 277 | fsl,num-channels = <4>; |
| 278 | num-channels = <4>; | 278 | fsl,channel-fifo-len = <24>; |
| 279 | channel-fifo-len = <24>; | 279 | fsl,exec-units-mask = <0x9fe>; |
| 280 | exec-units-mask = <0x000001fe>; | 280 | fsl,descriptor-types-mask = <0x3ab0ebf>; |
| 281 | descriptor-types-mask = <0x03ab0ebf>; | ||
| 282 | }; | 281 | }; |
| 283 | 282 | ||
| 284 | sdhc@2e000 { | 283 | sdhc@2e000 { |
diff --git a/arch/powerpc/boot/dts/mpc8379_rdb.dts b/arch/powerpc/boot/dts/mpc8379_rdb.dts index eeedf5884881..e4d7030d50e5 100644 --- a/arch/powerpc/boot/dts/mpc8379_rdb.dts +++ b/arch/powerpc/boot/dts/mpc8379_rdb.dts | |||
| @@ -248,17 +248,15 @@ | |||
| 248 | }; | 248 | }; |
| 249 | 249 | ||
| 250 | crypto@30000 { | 250 | crypto@30000 { |
| 251 | model = "SEC3"; | 251 | compatible = "fsl,sec3.0", "fsl,sec2.4", "fsl,sec2.2", |
| 252 | device_type = "crypto"; | 252 | "fsl,sec2.1", "fsl,sec2.0"; |
| 253 | compatible = "talitos"; | ||
| 254 | reg = <0x30000 0x10000>; | 253 | reg = <0x30000 0x10000>; |
| 255 | interrupts = <11 0x8>; | 254 | interrupts = <11 0x8>; |
| 256 | interrupt-parent = <&ipic>; | 255 | interrupt-parent = <&ipic>; |
| 257 | /* Rev. 3.0 geometry */ | 256 | fsl,num-channels = <4>; |
| 258 | num-channels = <4>; | 257 | fsl,channel-fifo-len = <24>; |
| 259 | channel-fifo-len = <24>; | 258 | fsl,exec-units-mask = <0x9fe>; |
| 260 | exec-units-mask = <0x000001fe>; | 259 | fsl,descriptor-types-mask = <0x3ab0ebf>; |
| 261 | descriptor-types-mask = <0x03ab0ebf>; | ||
| 262 | }; | 260 | }; |
| 263 | 261 | ||
| 264 | sata@18000 { | 262 | sata@18000 { |
diff --git a/arch/powerpc/boot/dts/mpc8536ds.dts b/arch/powerpc/boot/dts/mpc8536ds.dts new file mode 100644 index 000000000000..02cfa24a1695 --- /dev/null +++ b/arch/powerpc/boot/dts/mpc8536ds.dts | |||
| @@ -0,0 +1,432 @@ | |||
| 1 | /* | ||
| 2 | * MPC8536 DS Device Tree Source | ||
| 3 | * | ||
| 4 | * Copyright 2008 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 | /dts-v1/; | ||
| 13 | |||
| 14 | / { | ||
| 15 | model = "fsl,mpc8536ds"; | ||
| 16 | compatible = "fsl,mpc8536ds"; | ||
| 17 | #address-cells = <1>; | ||
| 18 | #size-cells = <1>; | ||
| 19 | |||
| 20 | aliases { | ||
| 21 | ethernet0 = &enet0; | ||
| 22 | ethernet1 = &enet1; | ||
| 23 | serial0 = &serial0; | ||
| 24 | serial1 = &serial1; | ||
| 25 | pci0 = &pci0; | ||
| 26 | pci1 = &pci1; | ||
| 27 | pci2 = &pci2; | ||
| 28 | pci3 = &pci3; | ||
| 29 | }; | ||
| 30 | |||
| 31 | cpus { | ||
| 32 | #cpus = <1>; | ||
| 33 | #address-cells = <1>; | ||
| 34 | #size-cells = <0>; | ||
| 35 | |||
| 36 | PowerPC,8536@0 { | ||
| 37 | device_type = "cpu"; | ||
| 38 | reg = <0>; | ||
| 39 | next-level-cache = <&L2>; | ||
| 40 | }; | ||
| 41 | }; | ||
| 42 | |||
| 43 | memory { | ||
| 44 | device_type = "memory"; | ||
| 45 | reg = <00000000 00000000>; // Filled by U-Boot | ||
| 46 | }; | ||
| 47 | |||
| 48 | soc@ffe00000 { | ||
| 49 | #address-cells = <1>; | ||
| 50 | #size-cells = <1>; | ||
| 51 | device_type = "soc"; | ||
| 52 | ranges = <0x0 0xffe00000 0x100000>; | ||
| 53 | reg = <0xffe00000 0x1000>; | ||
| 54 | bus-frequency = <0>; // Filled out by uboot. | ||
| 55 | |||
| 56 | memory-controller@2000 { | ||
| 57 | compatible = "fsl,mpc8536-memory-controller"; | ||
| 58 | reg = <0x2000 0x1000>; | ||
| 59 | interrupt-parent = <&mpic>; | ||
| 60 | interrupts = <18 0x2>; | ||
| 61 | }; | ||
| 62 | |||
| 63 | L2: l2-cache-controller@20000 { | ||
| 64 | compatible = "fsl,mpc8536-l2-cache-controller"; | ||
| 65 | reg = <0x20000 0x1000>; | ||
| 66 | interrupt-parent = <&mpic>; | ||
| 67 | interrupts = <16 0x2>; | ||
| 68 | }; | ||
| 69 | |||
| 70 | i2c@3000 { | ||
| 71 | #address-cells = <1>; | ||
| 72 | #size-cells = <0>; | ||
| 73 | cell-index = <0>; | ||
| 74 | compatible = "fsl-i2c"; | ||
| 75 | reg = <0x3000 0x100>; | ||
| 76 | interrupts = <43 0x2>; | ||
| 77 | interrupt-parent = <&mpic>; | ||
| 78 | dfsrr; | ||
| 79 | }; | ||
| 80 | |||
| 81 | i2c@3100 { | ||
| 82 | #address-cells = <1>; | ||
| 83 | #size-cells = <0>; | ||
| 84 | cell-index = <1>; | ||
| 85 | compatible = "fsl-i2c"; | ||
| 86 | reg = <0x3100 0x100>; | ||
| 87 | interrupts = <43 0x2>; | ||
| 88 | interrupt-parent = <&mpic>; | ||
| 89 | dfsrr; | ||
| 90 | rtc@68 { | ||
| 91 | compatible = "dallas,ds3232"; | ||
| 92 | reg = <0x68>; | ||
| 93 | }; | ||
| 94 | }; | ||
| 95 | |||
| 96 | dma@21300 { | ||
| 97 | #address-cells = <1>; | ||
| 98 | #size-cells = <1>; | ||
| 99 | compatible = "fsl,mpc8536-dma", "fsl,eloplus-dma"; | ||
| 100 | reg = <0x21300 4>; | ||
| 101 | ranges = <0 0x21100 0x200>; | ||
| 102 | cell-index = <0>; | ||
| 103 | dma-channel@0 { | ||
| 104 | compatible = "fsl,mpc8536-dma-channel", | ||
| 105 | "fsl,eloplus-dma-channel"; | ||
| 106 | reg = <0x0 0x80>; | ||
| 107 | cell-index = <0>; | ||
| 108 | interrupt-parent = <&mpic>; | ||
| 109 | interrupts = <14 0x2>; | ||
| 110 | }; | ||
| 111 | dma-channel@80 { | ||
| 112 | compatible = "fsl,mpc8536-dma-channel", | ||
| 113 | "fsl,eloplus-dma-channel"; | ||
| 114 | reg = <0x80 0x80>; | ||
| 115 | cell-index = <1>; | ||
| 116 | interrupt-parent = <&mpic>; | ||
| 117 | interrupts = <15 0x2>; | ||
| 118 | }; | ||
| 119 | dma-channel@100 { | ||
| 120 | compatible = "fsl,mpc8536-dma-channel", | ||
| 121 | "fsl,eloplus-dma-channel"; | ||
| 122 | reg = <0x100 0x80>; | ||
| 123 | cell-index = <2>; | ||
| 124 | interrupt-parent = <&mpic>; | ||
| 125 | interrupts = <16 0x2>; | ||
| 126 | }; | ||
| 127 | dma-channel@180 { | ||
| 128 | compatible = "fsl,mpc8536-dma-channel", | ||
| 129 | "fsl,eloplus-dma-channel"; | ||
| 130 | reg = <0x180 0x80>; | ||
| 131 | cell-index = <3>; | ||
| 132 | interrupt-parent = <&mpic>; | ||
| 133 | interrupts = <17 0x2>; | ||
| 134 | }; | ||
| 135 | }; | ||
| 136 | |||
| 137 | mdio@24520 { | ||
| 138 | #address-cells = <1>; | ||
| 139 | #size-cells = <0>; | ||
| 140 | compatible = "fsl,gianfar-mdio"; | ||
| 141 | reg = <0x24520 0x20>; | ||
| 142 | |||
| 143 | phy0: ethernet-phy@0 { | ||
| 144 | interrupt-parent = <&mpic>; | ||
| 145 | interrupts = <10 0x1>; | ||
| 146 | reg = <0>; | ||
| 147 | device_type = "ethernet-phy"; | ||
| 148 | }; | ||
| 149 | phy1: ethernet-phy@1 { | ||
| 150 | interrupt-parent = <&mpic>; | ||
| 151 | interrupts = <10 0x1>; | ||
| 152 | reg = <1>; | ||
| 153 | device_type = "ethernet-phy"; | ||
| 154 | }; | ||
| 155 | }; | ||
| 156 | |||
| 157 | usb@22000 { | ||
| 158 | compatible = "fsl,mpc8536-usb2-mph", "fsl-usb2-mph"; | ||
| 159 | reg = <0x22000 0x1000>; | ||
| 160 | #address-cells = <1>; | ||
| 161 | #size-cells = <0>; | ||
| 162 | interrupt-parent = <&mpic>; | ||
| 163 | interrupts = <28 0x2>; | ||
| 164 | phy_type = "ulpi"; | ||
| 165 | }; | ||
| 166 | |||
| 167 | usb@23000 { | ||
| 168 | compatible = "fsl,mpc8536-usb2-mph", "fsl-usb2-mph"; | ||
| 169 | reg = <0x23000 0x1000>; | ||
| 170 | #address-cells = <1>; | ||
| 171 | #size-cells = <0>; | ||
| 172 | interrupt-parent = <&mpic>; | ||
| 173 | interrupts = <46 0x2>; | ||
| 174 | phy_type = "ulpi"; | ||
| 175 | }; | ||
| 176 | |||
| 177 | enet0: ethernet@24000 { | ||
| 178 | cell-index = <0>; | ||
| 179 | device_type = "network"; | ||
| 180 | model = "TSEC"; | ||
| 181 | compatible = "gianfar"; | ||
| 182 | reg = <0x24000 0x1000>; | ||
| 183 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
| 184 | interrupts = <29 2 30 2 34 2>; | ||
| 185 | interrupt-parent = <&mpic>; | ||
| 186 | phy-handle = <&phy1>; | ||
| 187 | phy-connection-type = "rgmii-id"; | ||
| 188 | }; | ||
| 189 | |||
| 190 | enet1: ethernet@26000 { | ||
| 191 | cell-index = <1>; | ||
| 192 | device_type = "network"; | ||
| 193 | model = "TSEC"; | ||
| 194 | compatible = "gianfar"; | ||
| 195 | reg = <0x26000 0x1000>; | ||
| 196 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
| 197 | interrupts = <31 2 32 2 33 2>; | ||
| 198 | interrupt-parent = <&mpic>; | ||
| 199 | phy-handle = <&phy0>; | ||
| 200 | phy-connection-type = "rgmii-id"; | ||
| 201 | }; | ||
| 202 | |||
| 203 | usb@2b000 { | ||
| 204 | compatible = "fsl,mpc8536-usb2-dr", "fsl-usb2-dr"; | ||
| 205 | reg = <0x2b000 0x1000>; | ||
| 206 | #address-cells = <1>; | ||
| 207 | #size-cells = <0>; | ||
| 208 | interrupt-parent = <&mpic>; | ||
| 209 | interrupts = <60 0x2>; | ||
| 210 | dr_mode = "peripheral"; | ||
| 211 | phy_type = "ulpi"; | ||
| 212 | }; | ||
| 213 | |||
| 214 | serial0: serial@4500 { | ||
| 215 | cell-index = <0>; | ||
| 216 | device_type = "serial"; | ||
| 217 | compatible = "ns16550"; | ||
| 218 | reg = <0x4500 0x100>; | ||
| 219 | clock-frequency = <0>; | ||
| 220 | interrupts = <42 0x2>; | ||
| 221 | interrupt-parent = <&mpic>; | ||
| 222 | }; | ||
| 223 | |||
| 224 | serial1: serial@4600 { | ||
| 225 | cell-index = <1>; | ||
| 226 | device_type = "serial"; | ||
| 227 | compatible = "ns16550"; | ||
| 228 | reg = <0x4600 0x100>; | ||
| 229 | clock-frequency = <0>; | ||
| 230 | interrupts = <42 0x2>; | ||
| 231 | interrupt-parent = <&mpic>; | ||
| 232 | }; | ||
| 233 | |||
| 234 | crypto@30000 { | ||
| 235 | compatible = "fsl,sec3.0", "fsl,sec2.4", "fsl,sec2.2", | ||
| 236 | "fsl,sec2.1", "fsl,sec2.0"; | ||
| 237 | reg = <0x30000 0x10000>; | ||
| 238 | interrupts = <45 2 58 2>; | ||
| 239 | interrupt-parent = <&mpic>; | ||
| 240 | fsl,num-channels = <4>; | ||
| 241 | fsl,channel-fifo-len = <24>; | ||
| 242 | fsl,exec-units-mask = <0x9fe>; | ||
| 243 | fsl,descriptor-types-mask = <0x3ab0ebf>; | ||
| 244 | }; | ||
| 245 | |||
| 246 | sata@18000 { | ||
| 247 | compatible = "fsl,mpc8536-sata", "fsl,pq-sata"; | ||
| 248 | reg = <0x18000 0x1000>; | ||
| 249 | cell-index = <1>; | ||
| 250 | interrupts = <74 0x2>; | ||
| 251 | interrupt-parent = <&mpic>; | ||
| 252 | }; | ||
| 253 | |||
| 254 | sata@19000 { | ||
| 255 | compatible = "fsl,mpc8536-sata", "fsl,pq-sata"; | ||
| 256 | reg = <0x19000 0x1000>; | ||
| 257 | cell-index = <2>; | ||
| 258 | interrupts = <41 0x2>; | ||
| 259 | interrupt-parent = <&mpic>; | ||
| 260 | }; | ||
| 261 | |||
| 262 | global-utilities@e0000 { //global utilities block | ||
| 263 | compatible = "fsl,mpc8548-guts"; | ||
| 264 | reg = <0xe0000 0x1000>; | ||
| 265 | fsl,has-rstcr; | ||
| 266 | }; | ||
| 267 | |||
| 268 | mpic: pic@40000 { | ||
| 269 | clock-frequency = <0>; | ||
| 270 | interrupt-controller; | ||
| 271 | #address-cells = <0>; | ||
| 272 | #interrupt-cells = <2>; | ||
| 273 | reg = <0x40000 0x40000>; | ||
| 274 | compatible = "chrp,open-pic"; | ||
| 275 | device_type = "open-pic"; | ||
| 276 | big-endian; | ||
| 277 | }; | ||
| 278 | |||
| 279 | msi@41600 { | ||
| 280 | compatible = "fsl,mpc8536-msi", "fsl,mpic-msi"; | ||
| 281 | reg = <0x41600 0x80>; | ||
| 282 | msi-available-ranges = <0 0x100>; | ||
| 283 | interrupts = < | ||
| 284 | 0xe0 0 | ||
| 285 | 0xe1 0 | ||
| 286 | 0xe2 0 | ||
| 287 | 0xe3 0 | ||
| 288 | 0xe4 0 | ||
| 289 | 0xe5 0 | ||
| 290 | 0xe6 0 | ||
| 291 | 0xe7 0>; | ||
| 292 | interrupt-parent = <&mpic>; | ||
| 293 | }; | ||
| 294 | }; | ||
| 295 | |||
| 296 | pci0: pci@ffe08000 { | ||
| 297 | cell-index = <0>; | ||
| 298 | compatible = "fsl,mpc8540-pci"; | ||
| 299 | device_type = "pci"; | ||
| 300 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; | ||
| 301 | interrupt-map = < | ||
| 302 | |||
| 303 | /* IDSEL 0x11 J17 Slot 1 */ | ||
| 304 | 0x8800 0 0 1 &mpic 1 1 | ||
| 305 | 0x8800 0 0 2 &mpic 2 1 | ||
| 306 | 0x8800 0 0 3 &mpic 3 1 | ||
| 307 | 0x8800 0 0 4 &mpic 4 1>; | ||
| 308 | |||
| 309 | interrupt-parent = <&mpic>; | ||
| 310 | interrupts = <24 0x2>; | ||
| 311 | bus-range = <0 0xff>; | ||
| 312 | ranges = <0x02000000 0 0x80000000 0x80000000 0 0x10000000 | ||
| 313 | 0x01000000 0 0x00000000 0xffc00000 0 0x00010000>; | ||
| 314 | clock-frequency = <66666666>; | ||
| 315 | #interrupt-cells = <1>; | ||
| 316 | #size-cells = <2>; | ||
| 317 | #address-cells = <3>; | ||
| 318 | reg = <0xffe08000 0x1000>; | ||
| 319 | }; | ||
| 320 | |||
| 321 | pci1: pcie@ffe09000 { | ||
| 322 | cell-index = <1>; | ||
| 323 | compatible = "fsl,mpc8548-pcie"; | ||
| 324 | device_type = "pci"; | ||
| 325 | #interrupt-cells = <1>; | ||
| 326 | #size-cells = <2>; | ||
| 327 | #address-cells = <3>; | ||
| 328 | reg = <0xffe09000 0x1000>; | ||
| 329 | bus-range = <0 0xff>; | ||
| 330 | ranges = <0x02000000 0 0x98000000 0x98000000 0 0x08000000 | ||
| 331 | 0x01000000 0 0x00000000 0xffc20000 0 0x00010000>; | ||
| 332 | clock-frequency = <33333333>; | ||
| 333 | interrupt-parent = <&mpic>; | ||
| 334 | interrupts = <25 0x2>; | ||
| 335 | interrupt-map-mask = <0xf800 0 0 7>; | ||
| 336 | interrupt-map = < | ||
| 337 | /* IDSEL 0x0 */ | ||
| 338 | 0000 0 0 1 &mpic 4 1 | ||
| 339 | 0000 0 0 2 &mpic 5 1 | ||
| 340 | 0000 0 0 3 &mpic 6 1 | ||
| 341 | 0000 0 0 4 &mpic 7 1 | ||
| 342 | >; | ||
| 343 | pcie@0 { | ||
| 344 | reg = <0 0 0 0 0>; | ||
| 345 | #size-cells = <2>; | ||
| 346 | #address-cells = <3>; | ||
| 347 | device_type = "pci"; | ||
| 348 | ranges = <0x02000000 0 0x98000000 | ||
| 349 | 0x02000000 0 0x98000000 | ||
| 350 | 0 0x08000000 | ||
| 351 | |||
| 352 | 0x01000000 0 0x00000000 | ||
| 353 | 0x01000000 0 0x00000000 | ||
| 354 | 0 0x00010000>; | ||
| 355 | }; | ||
| 356 | }; | ||
| 357 | |||
| 358 | pci2: pcie@ffe0a000 { | ||
| 359 | cell-index = <2>; | ||
| 360 | compatible = "fsl,mpc8548-pcie"; | ||
| 361 | device_type = "pci"; | ||
| 362 | #interrupt-cells = <1>; | ||
| 363 | #size-cells = <2>; | ||
| 364 | #address-cells = <3>; | ||
| 365 | reg = <0xffe0a000 0x1000>; | ||
| 366 | bus-range = <0 0xff>; | ||
| 367 | ranges = <0x02000000 0 0x90000000 0x90000000 0 0x08000000 | ||
| 368 | 0x01000000 0 0x00000000 0xffc10000 0 0x00010000>; | ||
| 369 | clock-frequency = <33333333>; | ||
| 370 | interrupt-parent = <&mpic>; | ||
| 371 | interrupts = <26 0x2>; | ||
| 372 | interrupt-map-mask = <0xf800 0 0 7>; | ||
| 373 | interrupt-map = < | ||
| 374 | /* IDSEL 0x0 */ | ||
| 375 | 0000 0 0 1 &mpic 0 1 | ||
| 376 | 0000 0 0 2 &mpic 1 1 | ||
| 377 | 0000 0 0 3 &mpic 2 1 | ||
| 378 | 0000 0 0 4 &mpic 3 1 | ||
| 379 | >; | ||
| 380 | pcie@0 { | ||
| 381 | reg = <0 0 0 0 0>; | ||
| 382 | #size-cells = <2>; | ||
| 383 | #address-cells = <3>; | ||
| 384 | device_type = "pci"; | ||
| 385 | ranges = <0x02000000 0 0x90000000 | ||
| 386 | 0x02000000 0 0x90000000 | ||
| 387 | 0 0x08000000 | ||
| 388 | |||
| 389 | 0x01000000 0 0x00000000 | ||
| 390 | 0x01000000 0 0x00000000 | ||
| 391 | 0 0x00010000>; | ||
| 392 | }; | ||
| 393 | }; | ||
| 394 | |||
| 395 | pci3: pcie@ffe0b000 { | ||
| 396 | cell-index = <3>; | ||
| 397 | compatible = "fsl,mpc8548-pcie"; | ||
| 398 | device_type = "pci"; | ||
| 399 | #interrupt-cells = <1>; | ||
| 400 | #size-cells = <2>; | ||
| 401 | #address-cells = <3>; | ||
| 402 | reg = <0xffe0b000 0x1000>; | ||
| 403 | bus-range = <0 0xff>; | ||
| 404 | ranges = <0x02000000 0 0xa0000000 0xa0000000 0 0x20000000 | ||
| 405 | 0x01000000 0 0x00000000 0xffc30000 0 0x00010000>; | ||
| 406 | clock-frequency = <33333333>; | ||
| 407 | interrupt-parent = <&mpic>; | ||
| 408 | interrupts = <27 0x2>; | ||
| 409 | interrupt-map-mask = <0xf800 0 0 7>; | ||
| 410 | interrupt-map = < | ||
| 411 | /* IDSEL 0x0 */ | ||
| 412 | 0000 0 0 1 &mpic 8 1 | ||
| 413 | 0000 0 0 2 &mpic 9 1 | ||
| 414 | 0000 0 0 3 &mpic 10 1 | ||
| 415 | 0000 0 0 4 &mpic 11 1 | ||
| 416 | >; | ||
| 417 | |||
| 418 | pcie@0 { | ||
| 419 | reg = <0 0 0 0 0>; | ||
| 420 | #size-cells = <2>; | ||
| 421 | #address-cells = <3>; | ||
| 422 | device_type = "pci"; | ||
| 423 | ranges = <0x02000000 0 0xa0000000 | ||
| 424 | 0x02000000 0 0xa0000000 | ||
| 425 | 0 0x20000000 | ||
| 426 | |||
| 427 | 0x01000000 0 0x00000000 | ||
| 428 | 0x01000000 0 0x00000000 | ||
| 429 | 0 0x00100000>; | ||
| 430 | }; | ||
| 431 | }; | ||
| 432 | }; | ||
diff --git a/arch/powerpc/boot/dts/mpc8541cds.dts b/arch/powerpc/boot/dts/mpc8541cds.dts index 21ad71b825c1..c4469f19ff82 100644 --- a/arch/powerpc/boot/dts/mpc8541cds.dts +++ b/arch/powerpc/boot/dts/mpc8541cds.dts | |||
| @@ -189,6 +189,17 @@ | |||
| 189 | interrupt-parent = <&mpic>; | 189 | interrupt-parent = <&mpic>; |
| 190 | }; | 190 | }; |
| 191 | 191 | ||
| 192 | crypto@30000 { | ||
| 193 | compatible = "fsl,sec2.0"; | ||
| 194 | reg = <0x30000 0x10000>; | ||
| 195 | interrupts = <45 2>; | ||
| 196 | interrupt-parent = <&mpic>; | ||
| 197 | fsl,num-channels = <4>; | ||
| 198 | fsl,channel-fifo-len = <24>; | ||
| 199 | fsl,exec-units-mask = <0x7e>; | ||
| 200 | fsl,descriptor-types-mask = <0x01010ebf>; | ||
| 201 | }; | ||
| 202 | |||
| 192 | mpic: pic@40000 { | 203 | mpic: pic@40000 { |
| 193 | interrupt-controller; | 204 | interrupt-controller; |
| 194 | #address-cells = <0>; | 205 | #address-cells = <0>; |
diff --git a/arch/powerpc/boot/dts/mpc8544ds.dts b/arch/powerpc/boot/dts/mpc8544ds.dts index 6cf533f4b5fb..7d3829d3495e 100644 --- a/arch/powerpc/boot/dts/mpc8544ds.dts +++ b/arch/powerpc/boot/dts/mpc8544ds.dts | |||
| @@ -210,6 +210,17 @@ | |||
| 210 | fsl,has-rstcr; | 210 | fsl,has-rstcr; |
| 211 | }; | 211 | }; |
| 212 | 212 | ||
| 213 | crypto@30000 { | ||
| 214 | compatible = "fsl,sec2.1", "fsl,sec2.0"; | ||
| 215 | reg = <0x30000 0x10000>; | ||
| 216 | interrupts = <45 2>; | ||
| 217 | interrupt-parent = <&mpic>; | ||
| 218 | fsl,num-channels = <4>; | ||
| 219 | fsl,channel-fifo-len = <24>; | ||
| 220 | fsl,exec-units-mask = <0xfe>; | ||
| 221 | fsl,descriptor-types-mask = <0x12b0ebf>; | ||
| 222 | }; | ||
| 223 | |||
| 213 | mpic: pic@40000 { | 224 | mpic: pic@40000 { |
| 214 | interrupt-controller; | 225 | interrupt-controller; |
| 215 | #address-cells = <0>; | 226 | #address-cells = <0>; |
diff --git a/arch/powerpc/boot/dts/mpc8548cds.dts b/arch/powerpc/boot/dts/mpc8548cds.dts index d1fa6bbfaea0..d84466bb7eca 100644 --- a/arch/powerpc/boot/dts/mpc8548cds.dts +++ b/arch/powerpc/boot/dts/mpc8548cds.dts | |||
| @@ -249,6 +249,17 @@ | |||
| 249 | fsl,has-rstcr; | 249 | fsl,has-rstcr; |
| 250 | }; | 250 | }; |
| 251 | 251 | ||
| 252 | crypto@30000 { | ||
| 253 | compatible = "fsl,sec2.1", "fsl,sec2.0"; | ||
| 254 | reg = <0x30000 0x10000>; | ||
| 255 | interrupts = <45 2>; | ||
| 256 | interrupt-parent = <&mpic>; | ||
| 257 | fsl,num-channels = <4>; | ||
| 258 | fsl,channel-fifo-len = <24>; | ||
| 259 | fsl,exec-units-mask = <0xfe>; | ||
| 260 | fsl,descriptor-types-mask = <0x12b0ebf>; | ||
| 261 | }; | ||
| 262 | |||
| 252 | mpic: pic@40000 { | 263 | mpic: pic@40000 { |
| 253 | interrupt-controller; | 264 | interrupt-controller; |
| 254 | #address-cells = <0>; | 265 | #address-cells = <0>; |
diff --git a/arch/powerpc/boot/dts/mpc8555cds.dts b/arch/powerpc/boot/dts/mpc8555cds.dts index 6fc8059b5a01..e03a78006283 100644 --- a/arch/powerpc/boot/dts/mpc8555cds.dts +++ b/arch/powerpc/boot/dts/mpc8555cds.dts | |||
| @@ -189,6 +189,17 @@ | |||
| 189 | interrupt-parent = <&mpic>; | 189 | interrupt-parent = <&mpic>; |
| 190 | }; | 190 | }; |
| 191 | 191 | ||
| 192 | crypto@30000 { | ||
| 193 | compatible = "fsl,sec2.0"; | ||
| 194 | reg = <0x30000 0x10000>; | ||
| 195 | interrupts = <45 2>; | ||
| 196 | interrupt-parent = <&mpic>; | ||
| 197 | fsl,num-channels = <4>; | ||
| 198 | fsl,channel-fifo-len = <24>; | ||
| 199 | fsl,exec-units-mask = <0x7e>; | ||
| 200 | fsl,descriptor-types-mask = <0x01010ebf>; | ||
| 201 | }; | ||
| 202 | |||
| 192 | mpic: pic@40000 { | 203 | mpic: pic@40000 { |
| 193 | interrupt-controller; | 204 | interrupt-controller; |
| 194 | #address-cells = <0>; | 205 | #address-cells = <0>; |
diff --git a/arch/powerpc/boot/dts/mpc8568mds.dts b/arch/powerpc/boot/dts/mpc8568mds.dts index be9a289c0d62..9c30a34821dc 100644 --- a/arch/powerpc/boot/dts/mpc8568mds.dts +++ b/arch/powerpc/boot/dts/mpc8568mds.dts | |||
| @@ -231,16 +231,14 @@ | |||
| 231 | }; | 231 | }; |
| 232 | 232 | ||
| 233 | crypto@30000 { | 233 | crypto@30000 { |
| 234 | device_type = "crypto"; | 234 | compatible = "fsl,sec2.1", "fsl,sec2.0"; |
| 235 | model = "SEC2"; | 235 | reg = <0x30000 0x10000>; |
| 236 | compatible = "talitos"; | ||
| 237 | reg = <0x30000 0xf000>; | ||
| 238 | interrupts = <45 2>; | 236 | interrupts = <45 2>; |
| 239 | interrupt-parent = <&mpic>; | 237 | interrupt-parent = <&mpic>; |
| 240 | num-channels = <4>; | 238 | fsl,num-channels = <4>; |
| 241 | channel-fifo-len = <24>; | 239 | fsl,channel-fifo-len = <24>; |
| 242 | exec-units-mask = <0xfe>; | 240 | fsl,exec-units-mask = <0xfe>; |
| 243 | descriptor-types-mask = <0x12b0ebf>; | 241 | fsl,descriptor-types-mask = <0x12b0ebf>; |
| 244 | }; | 242 | }; |
| 245 | 243 | ||
| 246 | mpic: pic@40000 { | 244 | mpic: pic@40000 { |
diff --git a/arch/powerpc/boot/dts/mpc8572ds.dts b/arch/powerpc/boot/dts/mpc8572ds.dts index cb06325f0b79..08c61e3daecc 100644 --- a/arch/powerpc/boot/dts/mpc8572ds.dts +++ b/arch/powerpc/boot/dts/mpc8572ds.dts | |||
| @@ -321,6 +321,18 @@ | |||
| 321 | interrupt-parent = <&mpic>; | 321 | interrupt-parent = <&mpic>; |
| 322 | }; | 322 | }; |
| 323 | 323 | ||
| 324 | crypto@30000 { | ||
| 325 | compatible = "fsl,sec3.0", "fsl,sec2.4", "fsl,sec2.2", | ||
| 326 | "fsl,sec2.1", "fsl,sec2.0"; | ||
| 327 | reg = <0x30000 0x10000>; | ||
| 328 | interrupts = <45 2 58 2>; | ||
| 329 | interrupt-parent = <&mpic>; | ||
| 330 | fsl,num-channels = <4>; | ||
| 331 | fsl,channel-fifo-len = <24>; | ||
| 332 | fsl,exec-units-mask = <0x9fe>; | ||
| 333 | fsl,descriptor-types-mask = <0x3ab0ebf>; | ||
| 334 | }; | ||
| 335 | |||
| 324 | mpic: pic@40000 { | 336 | mpic: pic@40000 { |
| 325 | interrupt-controller; | 337 | interrupt-controller; |
| 326 | #address-cells = <0>; | 338 | #address-cells = <0>; |
diff --git a/arch/powerpc/boot/dts/mpc8610_hpcd.dts b/arch/powerpc/boot/dts/mpc8610_hpcd.dts index 65a5f64b2339..981941e5d7a5 100644 --- a/arch/powerpc/boot/dts/mpc8610_hpcd.dts +++ b/arch/powerpc/boot/dts/mpc8610_hpcd.dts | |||
| @@ -363,7 +363,7 @@ | |||
| 363 | 0xe000 0 0 4 &mpic 1 1 | 363 | 0xe000 0 0 4 &mpic 1 1 |
| 364 | 364 | ||
| 365 | /* IDSEL 0x1f */ | 365 | /* IDSEL 0x1f */ |
| 366 | 0xf800 0 0 1 &mpic 3 0 | 366 | 0xf800 0 0 1 &mpic 3 2 |
| 367 | 0xf800 0 0 2 &mpic 0 1 | 367 | 0xf800 0 0 2 &mpic 0 1 |
| 368 | >; | 368 | >; |
| 369 | 369 | ||
diff --git a/arch/powerpc/boot/dts/mpc866ads.dts b/arch/powerpc/boot/dts/mpc866ads.dts index 765e43c997da..bd700651f360 100644 --- a/arch/powerpc/boot/dts/mpc866ads.dts +++ b/arch/powerpc/boot/dts/mpc866ads.dts | |||
| @@ -171,6 +171,17 @@ | |||
| 171 | fsl,cpm-command = <0000>; | 171 | fsl,cpm-command = <0000>; |
| 172 | linux,network-index = <1>; | 172 | linux,network-index = <1>; |
| 173 | }; | 173 | }; |
| 174 | |||
| 175 | i2c@860 { | ||
| 176 | compatible = "fsl,mpc866-i2c", | ||
| 177 | "fsl,cpm1-i2c"; | ||
| 178 | reg = <0x860 0x20 0x3c80 0x30>; | ||
| 179 | interrupts = <16>; | ||
| 180 | interrupt-parent = <&CPM_PIC>; | ||
| 181 | fsl,cpm-command = <0x10>; | ||
| 182 | #address-cells = <1>; | ||
| 183 | #size-cells = <0>; | ||
| 184 | }; | ||
| 174 | }; | 185 | }; |
| 175 | }; | 186 | }; |
| 176 | 187 | ||
diff --git a/arch/powerpc/boot/dts/mpc885ads.dts b/arch/powerpc/boot/dts/mpc885ads.dts index 9895043722b9..b123e9f7a5a8 100644 --- a/arch/powerpc/boot/dts/mpc885ads.dts +++ b/arch/powerpc/boot/dts/mpc885ads.dts | |||
| @@ -215,6 +215,17 @@ | |||
| 215 | fsl,cpm-command = <0x80>; | 215 | fsl,cpm-command = <0x80>; |
| 216 | linux,network-index = <2>; | 216 | linux,network-index = <2>; |
| 217 | }; | 217 | }; |
| 218 | |||
| 219 | i2c@860 { | ||
| 220 | compatible = "fsl,mpc885-i2c", | ||
| 221 | "fsl,cpm1-i2c"; | ||
| 222 | reg = <0x860 0x20 0x3c80 0x30>; | ||
| 223 | interrupts = <16>; | ||
| 224 | interrupt-parent = <&CPM_PIC>; | ||
| 225 | fsl,cpm-command = <0x10>; | ||
| 226 | #address-cells = <1>; | ||
| 227 | #size-cells = <0>; | ||
| 228 | }; | ||
| 218 | }; | 229 | }; |
| 219 | }; | 230 | }; |
| 220 | 231 | ||
diff --git a/arch/powerpc/boot/dts/rainier.dts b/arch/powerpc/boot/dts/rainier.dts index 2afb63a42ea9..9684c80e4093 100644 --- a/arch/powerpc/boot/dts/rainier.dts +++ b/arch/powerpc/boot/dts/rainier.dts | |||
| @@ -265,7 +265,7 @@ | |||
| 265 | #size-cells = <0>; | 265 | #size-cells = <0>; |
| 266 | interrupt-map = </*Status*/ 0x0 &UIC0 0x18 0x4 | 266 | interrupt-map = </*Status*/ 0x0 &UIC0 0x18 0x4 |
| 267 | /*Wake*/ 0x1 &UIC1 0x1d 0x4>; | 267 | /*Wake*/ 0x1 &UIC1 0x1d 0x4>; |
| 268 | reg = <0xef600e00 0x00000070>; | 268 | reg = <0xef600e00 0x00000074>; |
| 269 | local-mac-address = [000000000000]; | 269 | local-mac-address = [000000000000]; |
| 270 | mal-device = <&MAL0>; | 270 | mal-device = <&MAL0>; |
| 271 | mal-tx-channel = <0>; | 271 | mal-tx-channel = <0>; |
| @@ -294,7 +294,7 @@ | |||
| 294 | #size-cells = <0>; | 294 | #size-cells = <0>; |
| 295 | interrupt-map = </*Status*/ 0x0 &UIC0 0x19 0x4 | 295 | interrupt-map = </*Status*/ 0x0 &UIC0 0x19 0x4 |
| 296 | /*Wake*/ 0x1 &UIC1 0x1f 0x4>; | 296 | /*Wake*/ 0x1 &UIC1 0x1f 0x4>; |
| 297 | reg = <0xef600f00 0x00000070>; | 297 | reg = <0xef600f00 0x00000074>; |
| 298 | local-mac-address = [000000000000]; | 298 | local-mac-address = [000000000000]; |
| 299 | mal-device = <&MAL0>; | 299 | mal-device = <&MAL0>; |
| 300 | mal-tx-channel = <1>; | 300 | mal-tx-channel = <1>; |
diff --git a/arch/powerpc/boot/dts/sbc8349.dts b/arch/powerpc/boot/dts/sbc8349.dts index 5b76bb26085a..45f789b56709 100644 --- a/arch/powerpc/boot/dts/sbc8349.dts +++ b/arch/powerpc/boot/dts/sbc8349.dts | |||
| @@ -221,19 +221,15 @@ | |||
| 221 | interrupt-parent = <&ipic>; | 221 | interrupt-parent = <&ipic>; |
| 222 | }; | 222 | }; |
| 223 | 223 | ||
| 224 | /* May need to remove if on a part without crypto engine */ | ||
| 225 | crypto@30000 { | 224 | crypto@30000 { |
| 226 | model = "SEC2"; | 225 | compatible = "fsl,sec2.0"; |
| 227 | compatible = "talitos"; | ||
| 228 | reg = <0x30000 0x10000>; | 226 | reg = <0x30000 0x10000>; |
| 229 | interrupts = <11 0x8>; | 227 | interrupts = <11 0x8>; |
| 230 | interrupt-parent = <&ipic>; | 228 | interrupt-parent = <&ipic>; |
| 231 | num-channels = <4>; | 229 | fsl,num-channels = <4>; |
| 232 | channel-fifo-len = <24>; | 230 | fsl,channel-fifo-len = <24>; |
| 233 | exec-units-mask = <0x0000007e>; | 231 | fsl,exec-units-mask = <0x7e>; |
| 234 | /* desc mask is for rev2.0, | 232 | fsl,descriptor-types-mask = <0x01010ebf>; |
| 235 | * we need runtime fixup for >2.0 */ | ||
| 236 | descriptor-types-mask = <0x01010ebf>; | ||
| 237 | }; | 233 | }; |
| 238 | 234 | ||
| 239 | /* IPIC | 235 | /* IPIC |
diff --git a/arch/powerpc/boot/dts/sbc8548.dts b/arch/powerpc/boot/dts/sbc8548.dts index 21cbacb1000c..333552b4e90d 100644 --- a/arch/powerpc/boot/dts/sbc8548.dts +++ b/arch/powerpc/boot/dts/sbc8548.dts | |||
| @@ -304,6 +304,17 @@ | |||
| 304 | fsl,has-rstcr; | 304 | fsl,has-rstcr; |
| 305 | }; | 305 | }; |
| 306 | 306 | ||
| 307 | crypto@30000 { | ||
| 308 | compatible = "fsl,sec2.1", "fsl,sec2.0"; | ||
| 309 | reg = <0x30000 0x10000>; | ||
| 310 | interrupts = <45 2>; | ||
| 311 | interrupt-parent = <&mpic>; | ||
| 312 | fsl,num-channels = <4>; | ||
| 313 | fsl,channel-fifo-len = <24>; | ||
| 314 | fsl,exec-units-mask = <0xfe>; | ||
| 315 | fsl,descriptor-types-mask = <0x12b0ebf>; | ||
| 316 | }; | ||
| 317 | |||
| 307 | mpic: pic@40000 { | 318 | mpic: pic@40000 { |
| 308 | interrupt-controller; | 319 | interrupt-controller; |
| 309 | #address-cells = <0>; | 320 | #address-cells = <0>; |
diff --git a/arch/powerpc/boot/dts/sequoia.dts b/arch/powerpc/boot/dts/sequoia.dts index 149dabc55217..72d15f075d34 100644 --- a/arch/powerpc/boot/dts/sequoia.dts +++ b/arch/powerpc/boot/dts/sequoia.dts | |||
| @@ -280,7 +280,7 @@ | |||
| 280 | #size-cells = <0>; | 280 | #size-cells = <0>; |
| 281 | interrupt-map = </*Status*/ 0x0 &UIC0 0x18 0x4 | 281 | interrupt-map = </*Status*/ 0x0 &UIC0 0x18 0x4 |
| 282 | /*Wake*/ 0x1 &UIC1 0x1d 0x4>; | 282 | /*Wake*/ 0x1 &UIC1 0x1d 0x4>; |
| 283 | reg = <0xef600e00 0x00000070>; | 283 | reg = <0xef600e00 0x00000074>; |
| 284 | local-mac-address = [000000000000]; | 284 | local-mac-address = [000000000000]; |
| 285 | mal-device = <&MAL0>; | 285 | mal-device = <&MAL0>; |
| 286 | mal-tx-channel = <0>; | 286 | mal-tx-channel = <0>; |
| @@ -309,7 +309,7 @@ | |||
| 309 | #size-cells = <0>; | 309 | #size-cells = <0>; |
| 310 | interrupt-map = </*Status*/ 0x0 &UIC0 0x19 0x4 | 310 | interrupt-map = </*Status*/ 0x0 &UIC0 0x19 0x4 |
| 311 | /*Wake*/ 0x1 &UIC1 0x1f 0x4>; | 311 | /*Wake*/ 0x1 &UIC1 0x1f 0x4>; |
| 312 | reg = <0xef600f00 0x00000070>; | 312 | reg = <0xef600f00 0x00000074>; |
| 313 | local-mac-address = [000000000000]; | 313 | local-mac-address = [000000000000]; |
| 314 | mal-device = <&MAL0>; | 314 | mal-device = <&MAL0>; |
| 315 | mal-tx-channel = <1>; | 315 | mal-tx-channel = <1>; |
diff --git a/arch/powerpc/boot/dts/taishan.dts b/arch/powerpc/boot/dts/taishan.dts index d4867ded8699..058438f9629b 100644 --- a/arch/powerpc/boot/dts/taishan.dts +++ b/arch/powerpc/boot/dts/taishan.dts | |||
| @@ -287,7 +287,7 @@ | |||
| 287 | compatible = "ibm,emac-440gx", "ibm,emac4"; | 287 | compatible = "ibm,emac-440gx", "ibm,emac4"; |
| 288 | interrupt-parent = <&UIC1>; | 288 | interrupt-parent = <&UIC1>; |
| 289 | interrupts = <0x1c 0x4 0x1d 0x4>; | 289 | interrupts = <0x1c 0x4 0x1d 0x4>; |
| 290 | reg = <0x40000800 0x00000070>; | 290 | reg = <0x40000800 0x00000074>; |
| 291 | local-mac-address = [000000000000]; // Filled in by zImage | 291 | local-mac-address = [000000000000]; // Filled in by zImage |
| 292 | mal-device = <&MAL0>; | 292 | mal-device = <&MAL0>; |
| 293 | mal-tx-channel = <0>; | 293 | mal-tx-channel = <0>; |
| @@ -307,7 +307,7 @@ | |||
| 307 | compatible = "ibm,emac-440gx", "ibm,emac4"; | 307 | compatible = "ibm,emac-440gx", "ibm,emac4"; |
| 308 | interrupt-parent = <&UIC1>; | 308 | interrupt-parent = <&UIC1>; |
| 309 | interrupts = <0x1e 0x4 0x1f 0x4>; | 309 | interrupts = <0x1e 0x4 0x1f 0x4>; |
| 310 | reg = <0x40000900 0x00000070>; | 310 | reg = <0x40000900 0x00000074>; |
| 311 | local-mac-address = [000000000000]; // Filled in by zImage | 311 | local-mac-address = [000000000000]; // Filled in by zImage |
| 312 | mal-device = <&MAL0>; | 312 | mal-device = <&MAL0>; |
| 313 | mal-tx-channel = <1>; | 313 | mal-tx-channel = <1>; |
| @@ -327,7 +327,7 @@ | |||
| 327 | compatible = "ibm,emac-440gx", "ibm,emac4"; | 327 | compatible = "ibm,emac-440gx", "ibm,emac4"; |
| 328 | interrupt-parent = <&UIC2>; | 328 | interrupt-parent = <&UIC2>; |
| 329 | interrupts = <0x0 0x4 0x1 0x4>; | 329 | interrupts = <0x0 0x4 0x1 0x4>; |
| 330 | reg = <0x40000c00 0x00000070>; | 330 | reg = <0x40000c00 0x00000074>; |
| 331 | local-mac-address = [000000000000]; // Filled in by zImage | 331 | local-mac-address = [000000000000]; // Filled in by zImage |
| 332 | mal-device = <&MAL0>; | 332 | mal-device = <&MAL0>; |
| 333 | mal-tx-channel = <2>; | 333 | mal-tx-channel = <2>; |
| @@ -351,7 +351,7 @@ | |||
| 351 | compatible = "ibm,emac-440gx", "ibm,emac4"; | 351 | compatible = "ibm,emac-440gx", "ibm,emac4"; |
| 352 | interrupt-parent = <&UIC2>; | 352 | interrupt-parent = <&UIC2>; |
| 353 | interrupts = <0x2 0x4 0x3 0x4>; | 353 | interrupts = <0x2 0x4 0x3 0x4>; |
| 354 | reg = <0x40000e00 0x00000070>; | 354 | reg = <0x40000e00 0x00000074>; |
| 355 | local-mac-address = [000000000000]; // Filled in by zImage | 355 | local-mac-address = [000000000000]; // Filled in by zImage |
| 356 | mal-device = <&MAL0>; | 356 | mal-device = <&MAL0>; |
| 357 | mal-tx-channel = <3>; | 357 | mal-tx-channel = <3>; |
diff --git a/arch/powerpc/boot/dts/tqm8541.dts b/arch/powerpc/boot/dts/tqm8541.dts index d083a648a81d..d76441ec5dc7 100644 --- a/arch/powerpc/boot/dts/tqm8541.dts +++ b/arch/powerpc/boot/dts/tqm8541.dts | |||
| @@ -200,6 +200,17 @@ | |||
| 200 | interrupt-parent = <&mpic>; | 200 | interrupt-parent = <&mpic>; |
| 201 | }; | 201 | }; |
| 202 | 202 | ||
| 203 | crypto@30000 { | ||
| 204 | compatible = "fsl,sec2.0"; | ||
| 205 | reg = <0x30000 0x10000>; | ||
| 206 | interrupts = <45 2>; | ||
| 207 | interrupt-parent = <&mpic>; | ||
| 208 | fsl,num-channels = <4>; | ||
| 209 | fsl,channel-fifo-len = <24>; | ||
| 210 | fsl,exec-units-mask = <0x7e>; | ||
| 211 | fsl,descriptor-types-mask = <0x01010ebf>; | ||
| 212 | }; | ||
| 213 | |||
| 203 | mpic: pic@40000 { | 214 | mpic: pic@40000 { |
| 204 | interrupt-controller; | 215 | interrupt-controller; |
| 205 | #address-cells = <0>; | 216 | #address-cells = <0>; |
diff --git a/arch/powerpc/boot/dts/tqm8548.dts b/arch/powerpc/boot/dts/tqm8548.dts index 13cd7280cb26..2563112cabd3 100644 --- a/arch/powerpc/boot/dts/tqm8548.dts +++ b/arch/powerpc/boot/dts/tqm8548.dts | |||
| @@ -83,6 +83,11 @@ | |||
| 83 | interrupts = <43 2>; | 83 | interrupts = <43 2>; |
| 84 | interrupt-parent = <&mpic>; | 84 | interrupt-parent = <&mpic>; |
| 85 | dfsrr; | 85 | dfsrr; |
| 86 | |||
| 87 | rtc@68 { | ||
| 88 | compatible = "dallas,ds1337"; | ||
| 89 | reg = <0x68>; | ||
| 90 | }; | ||
| 86 | }; | 91 | }; |
| 87 | 92 | ||
| 88 | i2c@3100 { | 93 | i2c@3100 { |
diff --git a/arch/powerpc/boot/dts/tqm8555.dts b/arch/powerpc/boot/dts/tqm8555.dts index 96b0b94ad925..6f7ea59c4846 100644 --- a/arch/powerpc/boot/dts/tqm8555.dts +++ b/arch/powerpc/boot/dts/tqm8555.dts | |||
| @@ -200,6 +200,17 @@ | |||
| 200 | interrupt-parent = <&mpic>; | 200 | interrupt-parent = <&mpic>; |
| 201 | }; | 201 | }; |
| 202 | 202 | ||
| 203 | crypto@30000 { | ||
| 204 | compatible = "fsl,sec2.0"; | ||
| 205 | reg = <0x30000 0x10000>; | ||
| 206 | interrupts = <45 2>; | ||
| 207 | interrupt-parent = <&mpic>; | ||
| 208 | fsl,num-channels = <4>; | ||
| 209 | fsl,channel-fifo-len = <24>; | ||
| 210 | fsl,exec-units-mask = <0x7e>; | ||
| 211 | fsl,descriptor-types-mask = <0x01010ebf>; | ||
| 212 | }; | ||
| 213 | |||
| 203 | mpic: pic@40000 { | 214 | mpic: pic@40000 { |
| 204 | interrupt-controller; | 215 | interrupt-controller; |
| 205 | #address-cells = <0>; | 216 | #address-cells = <0>; |
diff --git a/arch/powerpc/boot/dts/virtex440-ml507.dts b/arch/powerpc/boot/dts/virtex440-ml507.dts new file mode 100644 index 000000000000..dc8e78e2dceb --- /dev/null +++ b/arch/powerpc/boot/dts/virtex440-ml507.dts | |||
| @@ -0,0 +1,296 @@ | |||
| 1 | /* | ||
| 2 | * This file supports the Xilinx ML507 board with the 440 processor. | ||
| 3 | * A reference design for the FPGA is provided at http://git.xilinx.com. | ||
| 4 | * | ||
| 5 | * (C) Copyright 2008 Xilinx, Inc. | ||
| 6 | * | ||
| 7 | * This file is licensed under the terms of the GNU General Public License | ||
| 8 | * version 2. This program is licensed "as is" without any warranty of any | ||
| 9 | * kind, whether express or implied. | ||
| 10 | */ | ||
| 11 | |||
| 12 | /dts-v1/; | ||
| 13 | |||
| 14 | / { | ||
| 15 | #address-cells = <1>; | ||
| 16 | #size-cells = <1>; | ||
| 17 | compatible = "xlnx,virtex440"; | ||
| 18 | dcr-parent = <&ppc440_0>; | ||
| 19 | model = "testing"; | ||
| 20 | DDR2_SDRAM: memory@0 { | ||
| 21 | device_type = "memory"; | ||
| 22 | reg = < 0 0x10000000 >; | ||
| 23 | } ; | ||
| 24 | chosen { | ||
| 25 | bootargs = "console=ttyS0 ip=on root=/dev/ram"; | ||
| 26 | linux,stdout-path = "/plb@0/serial@83e00000"; | ||
| 27 | } ; | ||
| 28 | cpus { | ||
| 29 | #address-cells = <1>; | ||
| 30 | #cpus = <1>; | ||
| 31 | #size-cells = <0>; | ||
| 32 | ppc440_0: cpu@0 { | ||
| 33 | clock-frequency = <400000000>; | ||
| 34 | compatible = "PowerPC,440", "ibm,ppc440"; | ||
| 35 | d-cache-line-size = <0x20>; | ||
| 36 | d-cache-size = <0x8000>; | ||
| 37 | dcr-access-method = "native"; | ||
| 38 | dcr-controller ; | ||
| 39 | device_type = "cpu"; | ||
| 40 | i-cache-line-size = <0x20>; | ||
| 41 | i-cache-size = <0x8000>; | ||
| 42 | model = "PowerPC,440"; | ||
| 43 | reg = <0>; | ||
| 44 | timebase-frequency = <400000000>; | ||
| 45 | xlnx,apu-control = <1>; | ||
| 46 | xlnx,apu-udi-0 = <0>; | ||
| 47 | xlnx,apu-udi-1 = <0>; | ||
| 48 | xlnx,apu-udi-10 = <0>; | ||
| 49 | xlnx,apu-udi-11 = <0>; | ||
| 50 | xlnx,apu-udi-12 = <0>; | ||
| 51 | xlnx,apu-udi-13 = <0>; | ||
| 52 | xlnx,apu-udi-14 = <0>; | ||
| 53 | xlnx,apu-udi-15 = <0>; | ||
| 54 | xlnx,apu-udi-2 = <0>; | ||
| 55 | xlnx,apu-udi-3 = <0>; | ||
| 56 | xlnx,apu-udi-4 = <0>; | ||
| 57 | xlnx,apu-udi-5 = <0>; | ||
| 58 | xlnx,apu-udi-6 = <0>; | ||
| 59 | xlnx,apu-udi-7 = <0>; | ||
| 60 | xlnx,apu-udi-8 = <0>; | ||
| 61 | xlnx,apu-udi-9 = <0>; | ||
| 62 | xlnx,dcr-autolock-enable = <1>; | ||
| 63 | xlnx,dcu-rd-ld-cache-plb-prio = <0>; | ||
| 64 | xlnx,dcu-rd-noncache-plb-prio = <0>; | ||
| 65 | xlnx,dcu-rd-touch-plb-prio = <0>; | ||
| 66 | xlnx,dcu-rd-urgent-plb-prio = <0>; | ||
| 67 | xlnx,dcu-wr-flush-plb-prio = <0>; | ||
| 68 | xlnx,dcu-wr-store-plb-prio = <0>; | ||
| 69 | xlnx,dcu-wr-urgent-plb-prio = <0>; | ||
| 70 | xlnx,dma0-control = <0>; | ||
| 71 | xlnx,dma0-plb-prio = <0>; | ||
| 72 | xlnx,dma0-rxchannelctrl = <0x1010000>; | ||
| 73 | xlnx,dma0-rxirqtimer = <0x3ff>; | ||
| 74 | xlnx,dma0-txchannelctrl = <0x1010000>; | ||
| 75 | xlnx,dma0-txirqtimer = <0x3ff>; | ||
| 76 | xlnx,dma1-control = <0>; | ||
| 77 | xlnx,dma1-plb-prio = <0>; | ||
| 78 | xlnx,dma1-rxchannelctrl = <0x1010000>; | ||
| 79 | xlnx,dma1-rxirqtimer = <0x3ff>; | ||
| 80 | xlnx,dma1-txchannelctrl = <0x1010000>; | ||
| 81 | xlnx,dma1-txirqtimer = <0x3ff>; | ||
| 82 | xlnx,dma2-control = <0>; | ||
| 83 | xlnx,dma2-plb-prio = <0>; | ||
| 84 | xlnx,dma2-rxchannelctrl = <0x1010000>; | ||
| 85 | xlnx,dma2-rxirqtimer = <0x3ff>; | ||
| 86 | xlnx,dma2-txchannelctrl = <0x1010000>; | ||
| 87 | xlnx,dma2-txirqtimer = <0x3ff>; | ||
| 88 | xlnx,dma3-control = <0>; | ||
| 89 | xlnx,dma3-plb-prio = <0>; | ||
| 90 | xlnx,dma3-rxchannelctrl = <0x1010000>; | ||
| 91 | xlnx,dma3-rxirqtimer = <0x3ff>; | ||
| 92 | xlnx,dma3-txchannelctrl = <0x1010000>; | ||
| 93 | xlnx,dma3-txirqtimer = <0x3ff>; | ||
| 94 | xlnx,endian-reset = <0>; | ||
| 95 | xlnx,generate-plb-timespecs = <1>; | ||
| 96 | xlnx,icu-rd-fetch-plb-prio = <0>; | ||
| 97 | xlnx,icu-rd-spec-plb-prio = <0>; | ||
| 98 | xlnx,icu-rd-touch-plb-prio = <0>; | ||
| 99 | xlnx,interconnect-imask = <0xffffffff>; | ||
| 100 | xlnx,mplb-allow-lock-xfer = <1>; | ||
| 101 | xlnx,mplb-arb-mode = <0>; | ||
| 102 | xlnx,mplb-awidth = <0x20>; | ||
| 103 | xlnx,mplb-counter = <0x500>; | ||
| 104 | xlnx,mplb-dwidth = <0x80>; | ||
| 105 | xlnx,mplb-max-burst = <8>; | ||
| 106 | xlnx,mplb-native-dwidth = <0x80>; | ||
| 107 | xlnx,mplb-p2p = <0>; | ||
| 108 | xlnx,mplb-prio-dcur = <2>; | ||
| 109 | xlnx,mplb-prio-dcuw = <3>; | ||
| 110 | xlnx,mplb-prio-icu = <4>; | ||
| 111 | xlnx,mplb-prio-splb0 = <1>; | ||
| 112 | xlnx,mplb-prio-splb1 = <0>; | ||
| 113 | xlnx,mplb-read-pipe-enable = <1>; | ||
| 114 | xlnx,mplb-sync-tattribute = <0>; | ||
| 115 | xlnx,mplb-wdog-enable = <1>; | ||
| 116 | xlnx,mplb-write-pipe-enable = <1>; | ||
| 117 | xlnx,mplb-write-post-enable = <1>; | ||
| 118 | xlnx,num-dma = <1>; | ||
| 119 | xlnx,pir = <0xf>; | ||
| 120 | xlnx,ppc440mc-addr-base = <0>; | ||
| 121 | xlnx,ppc440mc-addr-high = <0xfffffff>; | ||
| 122 | xlnx,ppc440mc-arb-mode = <0>; | ||
| 123 | xlnx,ppc440mc-bank-conflict-mask = <0xc00000>; | ||
| 124 | xlnx,ppc440mc-control = <0xf810008f>; | ||
| 125 | xlnx,ppc440mc-max-burst = <8>; | ||
| 126 | xlnx,ppc440mc-prio-dcur = <2>; | ||
| 127 | xlnx,ppc440mc-prio-dcuw = <3>; | ||
| 128 | xlnx,ppc440mc-prio-icu = <4>; | ||
| 129 | xlnx,ppc440mc-prio-splb0 = <1>; | ||
| 130 | xlnx,ppc440mc-prio-splb1 = <0>; | ||
| 131 | xlnx,ppc440mc-row-conflict-mask = <0x3ffe00>; | ||
| 132 | xlnx,ppcdm-asyncmode = <0>; | ||
| 133 | xlnx,ppcds-asyncmode = <0>; | ||
| 134 | xlnx,user-reset = <0>; | ||
| 135 | DMA0: sdma@80 { | ||
| 136 | compatible = "xlnx,ll-dma-1.00.a"; | ||
| 137 | dcr-reg = < 0x80 0x11 >; | ||
| 138 | interrupt-parent = <&xps_intc_0>; | ||
| 139 | interrupts = < 9 2 0xa 2 >; | ||
| 140 | } ; | ||
| 141 | } ; | ||
| 142 | } ; | ||
| 143 | plb_v46_0: plb@0 { | ||
| 144 | #address-cells = <1>; | ||
| 145 | #size-cells = <1>; | ||
| 146 | compatible = "xlnx,plb-v46-1.02.a", "simple-bus"; | ||
| 147 | ranges ; | ||
| 148 | DIP_Switches_8Bit: gpio@81460000 { | ||
| 149 | compatible = "xlnx,xps-gpio-1.00.a"; | ||
| 150 | interrupt-parent = <&xps_intc_0>; | ||
| 151 | interrupts = < 6 2 >; | ||
| 152 | reg = < 0x81460000 0x10000 >; | ||
| 153 | xlnx,all-inputs = <1>; | ||
| 154 | xlnx,all-inputs-2 = <0>; | ||
| 155 | xlnx,dout-default = <0>; | ||
| 156 | xlnx,dout-default-2 = <0>; | ||
| 157 | xlnx,family = "virtex5"; | ||
| 158 | xlnx,gpio-width = <8>; | ||
| 159 | xlnx,interrupt-present = <1>; | ||
| 160 | xlnx,is-bidir = <1>; | ||
| 161 | xlnx,is-bidir-2 = <1>; | ||
| 162 | xlnx,is-dual = <0>; | ||
| 163 | xlnx,tri-default = <0xffffffff>; | ||
| 164 | xlnx,tri-default-2 = <0xffffffff>; | ||
| 165 | } ; | ||
| 166 | Hard_Ethernet_MAC: xps-ll-temac@81c00000 { | ||
| 167 | #address-cells = <1>; | ||
| 168 | #size-cells = <1>; | ||
| 169 | compatible = "xlnx,compound"; | ||
| 170 | ethernet@81c00000 { | ||
| 171 | compatible = "xlnx,xps-ll-temac-1.01.b"; | ||
| 172 | device_type = "network"; | ||
| 173 | interrupt-parent = <&xps_intc_0>; | ||
| 174 | interrupts = < 5 2 >; | ||
| 175 | llink-connected = <&DMA0>; | ||
| 176 | local-mac-address = [ 02 00 00 00 00 00 ]; | ||
| 177 | reg = < 0x81c00000 0x40 >; | ||
| 178 | xlnx,bus2core-clk-ratio = <1>; | ||
| 179 | xlnx,phy-type = <1>; | ||
| 180 | xlnx,phyaddr = <1>; | ||
| 181 | xlnx,rxcsum = <1>; | ||
| 182 | xlnx,rxfifo = <0x1000>; | ||
| 183 | xlnx,temac-type = <0>; | ||
| 184 | xlnx,txcsum = <1>; | ||
| 185 | xlnx,txfifo = <0x1000>; | ||
| 186 | } ; | ||
| 187 | } ; | ||
| 188 | LEDs_8Bit: gpio@81400000 { | ||
| 189 | compatible = "xlnx,xps-gpio-1.00.a"; | ||
| 190 | reg = < 0x81400000 0x10000 >; | ||
| 191 | xlnx,all-inputs = <0>; | ||
| 192 | xlnx,all-inputs-2 = <0>; | ||
| 193 | xlnx,dout-default = <0>; | ||
| 194 | xlnx,dout-default-2 = <0>; | ||
| 195 | xlnx,family = "virtex5"; | ||
| 196 | xlnx,gpio-width = <8>; | ||
| 197 | xlnx,interrupt-present = <0>; | ||
| 198 | xlnx,is-bidir = <1>; | ||
| 199 | xlnx,is-bidir-2 = <1>; | ||
| 200 | xlnx,is-dual = <0>; | ||
| 201 | xlnx,tri-default = <0xffffffff>; | ||
| 202 | xlnx,tri-default-2 = <0xffffffff>; | ||
| 203 | } ; | ||
| 204 | LEDs_Positions: gpio@81420000 { | ||
| 205 | compatible = "xlnx,xps-gpio-1.00.a"; | ||
| 206 | reg = < 0x81420000 0x10000 >; | ||
| 207 | xlnx,all-inputs = <0>; | ||
| 208 | xlnx,all-inputs-2 = <0>; | ||
| 209 | xlnx,dout-default = <0>; | ||
| 210 | xlnx,dout-default-2 = <0>; | ||
| 211 | xlnx,family = "virtex5"; | ||
| 212 | xlnx,gpio-width = <5>; | ||
| 213 | xlnx,interrupt-present = <0>; | ||
| 214 | xlnx,is-bidir = <1>; | ||
| 215 | xlnx,is-bidir-2 = <1>; | ||
| 216 | xlnx,is-dual = <0>; | ||
| 217 | xlnx,tri-default = <0xffffffff>; | ||
| 218 | xlnx,tri-default-2 = <0xffffffff>; | ||
| 219 | } ; | ||
| 220 | Push_Buttons_5Bit: gpio@81440000 { | ||
| 221 | compatible = "xlnx,xps-gpio-1.00.a"; | ||
| 222 | interrupt-parent = <&xps_intc_0>; | ||
| 223 | interrupts = < 7 2 >; | ||
| 224 | reg = < 0x81440000 0x10000 >; | ||
| 225 | xlnx,all-inputs = <1>; | ||
| 226 | xlnx,all-inputs-2 = <0>; | ||
| 227 | xlnx,dout-default = <0>; | ||
| 228 | xlnx,dout-default-2 = <0>; | ||
| 229 | xlnx,family = "virtex5"; | ||
| 230 | xlnx,gpio-width = <5>; | ||
| 231 | xlnx,interrupt-present = <1>; | ||
| 232 | xlnx,is-bidir = <1>; | ||
| 233 | xlnx,is-bidir-2 = <1>; | ||
| 234 | xlnx,is-dual = <0>; | ||
| 235 | xlnx,tri-default = <0xffffffff>; | ||
| 236 | xlnx,tri-default-2 = <0xffffffff>; | ||
| 237 | } ; | ||
| 238 | RS232_Uart_1: serial@83e00000 { | ||
| 239 | clock-frequency = <100000000>; | ||
| 240 | compatible = "xlnx,xps-uart16550-2.00.a", "ns16550"; | ||
| 241 | current-speed = <0x2580>; | ||
| 242 | device_type = "serial"; | ||
| 243 | interrupt-parent = <&xps_intc_0>; | ||
| 244 | interrupts = < 8 2 >; | ||
| 245 | reg = < 0x83e00000 0x10000 >; | ||
| 246 | reg-offset = <3>; | ||
| 247 | reg-shift = <2>; | ||
| 248 | xlnx,family = "virtex5"; | ||
| 249 | xlnx,has-external-rclk = <0>; | ||
| 250 | xlnx,has-external-xin = <0>; | ||
| 251 | xlnx,is-a-16550 = <1>; | ||
| 252 | } ; | ||
| 253 | SysACE_CompactFlash: sysace@83600000 { | ||
| 254 | compatible = "xlnx,xps-sysace-1.00.a"; | ||
| 255 | interrupt-parent = <&xps_intc_0>; | ||
| 256 | interrupts = < 4 2 >; | ||
| 257 | reg = < 0x83600000 0x10000 >; | ||
| 258 | xlnx,family = "virtex5"; | ||
| 259 | xlnx,mem-width = <0x10>; | ||
| 260 | } ; | ||
| 261 | xps_bram_if_cntlr_1: xps-bram-if-cntlr@ffff0000 { | ||
| 262 | compatible = "xlnx,xps-bram-if-cntlr-1.00.a"; | ||
| 263 | reg = < 0xffff0000 0x10000 >; | ||
| 264 | xlnx,family = "virtex5"; | ||
| 265 | } ; | ||
| 266 | xps_intc_0: interrupt-controller@81800000 { | ||
| 267 | #interrupt-cells = <2>; | ||
| 268 | compatible = "xlnx,xps-intc-1.00.a"; | ||
| 269 | interrupt-controller ; | ||
| 270 | reg = < 0x81800000 0x10000 >; | ||
| 271 | xlnx,num-intr-inputs = <0xb>; | ||
| 272 | } ; | ||
| 273 | xps_timebase_wdt_1: xps-timebase-wdt@83a00000 { | ||
| 274 | compatible = "xlnx,xps-timebase-wdt-1.00.b"; | ||
| 275 | interrupt-parent = <&xps_intc_0>; | ||
| 276 | interrupts = < 2 0 1 2 >; | ||
| 277 | reg = < 0x83a00000 0x10000 >; | ||
| 278 | xlnx,family = "virtex5"; | ||
| 279 | xlnx,wdt-enable-once = <0>; | ||
| 280 | xlnx,wdt-interval = <0x1e>; | ||
| 281 | } ; | ||
| 282 | xps_timer_1: timer@83c00000 { | ||
| 283 | compatible = "xlnx,xps-timer-1.00.a"; | ||
| 284 | interrupt-parent = <&xps_intc_0>; | ||
| 285 | interrupts = < 3 2 >; | ||
| 286 | reg = < 0x83c00000 0x10000 >; | ||
| 287 | xlnx,count-width = <0x20>; | ||
| 288 | xlnx,family = "virtex5"; | ||
| 289 | xlnx,gen0-assert = <1>; | ||
| 290 | xlnx,gen1-assert = <1>; | ||
| 291 | xlnx,one-timer-only = <1>; | ||
| 292 | xlnx,trig0-assert = <1>; | ||
| 293 | xlnx,trig1-assert = <1>; | ||
| 294 | } ; | ||
| 295 | } ; | ||
| 296 | } ; | ||
diff --git a/arch/powerpc/boot/simpleboot.c b/arch/powerpc/boot/simpleboot.c index 86cd285bccc6..c58a0dada992 100644 --- a/arch/powerpc/boot/simpleboot.c +++ b/arch/powerpc/boot/simpleboot.c | |||
| @@ -23,6 +23,8 @@ | |||
| 23 | 23 | ||
| 24 | BSS_STACK(4*1024); | 24 | BSS_STACK(4*1024); |
| 25 | 25 | ||
| 26 | extern int platform_specific_init(void) __attribute__((weak)); | ||
| 27 | |||
| 26 | void platform_init(unsigned long r3, unsigned long r4, unsigned long r5, | 28 | void platform_init(unsigned long r3, unsigned long r4, unsigned long r5, |
| 27 | unsigned long r6, unsigned long r7) | 29 | unsigned long r6, unsigned long r7) |
| 28 | { | 30 | { |
| @@ -80,5 +82,9 @@ void platform_init(unsigned long r3, unsigned long r4, unsigned long r5, | |||
| 80 | 82 | ||
| 81 | /* prepare the device tree and find the console */ | 83 | /* prepare the device tree and find the console */ |
| 82 | fdt_init(_dtb_start); | 84 | fdt_init(_dtb_start); |
| 85 | |||
| 86 | if (platform_specific_init) | ||
| 87 | platform_specific_init(); | ||
| 88 | |||
| 83 | serial_console_init(); | 89 | serial_console_init(); |
| 84 | } | 90 | } |
diff --git a/arch/powerpc/boot/virtex.c b/arch/powerpc/boot/virtex.c new file mode 100644 index 000000000000..f622805f8000 --- /dev/null +++ b/arch/powerpc/boot/virtex.c | |||
| @@ -0,0 +1,100 @@ | |||
| 1 | /* | ||
| 2 | * The platform specific code for virtex devices since a boot loader is not | ||
| 3 | * always used. | ||
| 4 | * | ||
| 5 | * (C) Copyright 2008 Xilinx, Inc. | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify it | ||
| 8 | * under the terms of the GNU General Public License version 2 as published | ||
| 9 | * by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include "ops.h" | ||
| 13 | #include "io.h" | ||
| 14 | #include "stdio.h" | ||
| 15 | |||
| 16 | #define UART_DLL 0 /* Out: Divisor Latch Low */ | ||
| 17 | #define UART_DLM 1 /* Out: Divisor Latch High */ | ||
| 18 | #define UART_FCR 2 /* Out: FIFO Control Register */ | ||
| 19 | #define UART_FCR_CLEAR_RCVR 0x02 /* Clear the RCVR FIFO */ | ||
| 20 | #define UART_FCR_CLEAR_XMIT 0x04 /* Clear the XMIT FIFO */ | ||
| 21 | #define UART_LCR 3 /* Out: Line Control Register */ | ||
| 22 | #define UART_MCR 4 /* Out: Modem Control Register */ | ||
| 23 | #define UART_MCR_RTS 0x02 /* RTS complement */ | ||
| 24 | #define UART_MCR_DTR 0x01 /* DTR complement */ | ||
| 25 | #define UART_LCR_DLAB 0x80 /* Divisor latch access bit */ | ||
| 26 | #define UART_LCR_WLEN8 0x03 /* Wordlength: 8 bits */ | ||
| 27 | |||
| 28 | static int virtex_ns16550_console_init(void *devp) | ||
| 29 | { | ||
| 30 | unsigned char *reg_base; | ||
| 31 | u32 reg_shift, reg_offset, clk, spd; | ||
| 32 | u16 divisor; | ||
| 33 | int n; | ||
| 34 | |||
| 35 | if (dt_get_virtual_reg(devp, (void **)®_base, 1) < 1) | ||
| 36 | return -1; | ||
| 37 | |||
| 38 | n = getprop(devp, "reg-offset", ®_offset, sizeof(reg_offset)); | ||
| 39 | if (n == sizeof(reg_offset)) | ||
| 40 | reg_base += reg_offset; | ||
| 41 | |||
| 42 | n = getprop(devp, "reg-shift", ®_shift, sizeof(reg_shift)); | ||
| 43 | if (n != sizeof(reg_shift)) | ||
| 44 | reg_shift = 0; | ||
| 45 | |||
| 46 | n = getprop(devp, "current-speed", (void *)&spd, sizeof(spd)); | ||
| 47 | if (n != sizeof(spd)) | ||
| 48 | spd = 9600; | ||
| 49 | |||
| 50 | /* should there be a default clock rate?*/ | ||
| 51 | n = getprop(devp, "clock-frequency", (void *)&clk, sizeof(clk)); | ||
| 52 | if (n != sizeof(clk)) | ||
| 53 | return -1; | ||
| 54 | |||
| 55 | divisor = clk / (16 * spd); | ||
| 56 | |||
| 57 | /* Access baud rate */ | ||
| 58 | out_8(reg_base + (UART_LCR << reg_shift), UART_LCR_DLAB); | ||
| 59 | |||
| 60 | /* Baud rate based on input clock */ | ||
| 61 | out_8(reg_base + (UART_DLL << reg_shift), divisor & 0xFF); | ||
| 62 | out_8(reg_base + (UART_DLM << reg_shift), divisor >> 8); | ||
| 63 | |||
| 64 | /* 8 data, 1 stop, no parity */ | ||
| 65 | out_8(reg_base + (UART_LCR << reg_shift), UART_LCR_WLEN8); | ||
| 66 | |||
| 67 | /* RTS/DTR */ | ||
| 68 | out_8(reg_base + (UART_MCR << reg_shift), UART_MCR_RTS | UART_MCR_DTR); | ||
| 69 | |||
| 70 | /* Clear transmitter and receiver */ | ||
| 71 | out_8(reg_base + (UART_FCR << reg_shift), | ||
| 72 | UART_FCR_CLEAR_XMIT | UART_FCR_CLEAR_RCVR); | ||
| 73 | return 0; | ||
| 74 | } | ||
| 75 | |||
| 76 | /* For virtex, the kernel may be loaded without using a bootloader and if so | ||
| 77 | some UARTs need more setup than is provided in the normal console init | ||
| 78 | */ | ||
| 79 | int platform_specific_init(void) | ||
| 80 | { | ||
| 81 | void *devp; | ||
| 82 | char devtype[MAX_PROP_LEN]; | ||
| 83 | char path[MAX_PATH_LEN]; | ||
| 84 | |||
| 85 | devp = finddevice("/chosen"); | ||
| 86 | if (devp == NULL) | ||
| 87 | return -1; | ||
| 88 | |||
| 89 | if (getprop(devp, "linux,stdout-path", path, MAX_PATH_LEN) > 0) { | ||
| 90 | devp = finddevice(path); | ||
| 91 | if (devp == NULL) | ||
| 92 | return -1; | ||
| 93 | |||
| 94 | if ((getprop(devp, "device_type", devtype, sizeof(devtype)) > 0) | ||
| 95 | && !strcmp(devtype, "serial") | ||
| 96 | && (dt_is_compatible(devp, "ns16550"))) | ||
| 97 | virtex_ns16550_console_init(devp); | ||
| 98 | } | ||
| 99 | return 0; | ||
| 100 | } | ||
diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper index df2358e9f1ca..644bf9d4ea00 100755 --- a/arch/powerpc/boot/wrapper +++ b/arch/powerpc/boot/wrapper | |||
| @@ -207,7 +207,15 @@ adder875-redboot) | |||
| 207 | binary=y | 207 | binary=y |
| 208 | ;; | 208 | ;; |
| 209 | simpleboot-virtex405-*) | 209 | simpleboot-virtex405-*) |
| 210 | platformo="$object/virtex405-head.o $object/simpleboot.o" | 210 | platformo="$object/virtex405-head.o $object/simpleboot.o $object/virtex.o" |
| 211 | binary=y | ||
| 212 | ;; | ||
| 213 | simpleboot-virtex440-*) | ||
| 214 | platformo="$object/simpleboot.o $object/virtex.o" | ||
| 215 | binary=y | ||
| 216 | ;; | ||
| 217 | simpleboot-*) | ||
| 218 | platformo="$object/simpleboot.o" | ||
| 211 | binary=y | 219 | binary=y |
| 212 | ;; | 220 | ;; |
| 213 | asp834x-redboot) | 221 | asp834x-redboot) |
diff --git a/arch/powerpc/configs/44x/virtex5_defconfig b/arch/powerpc/configs/44x/virtex5_defconfig new file mode 100644 index 000000000000..9c41f66b5a7d --- /dev/null +++ b/arch/powerpc/configs/44x/virtex5_defconfig | |||
| @@ -0,0 +1,1107 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.26-rc8 | ||
| 4 | # Wed Jul 2 15:36:41 2008 | ||
| 5 | # | ||
| 6 | # CONFIG_PPC64 is not set | ||
| 7 | |||
| 8 | # | ||
| 9 | # Processor support | ||
| 10 | # | ||
| 11 | # CONFIG_6xx is not set | ||
| 12 | # CONFIG_PPC_85xx is not set | ||
| 13 | # CONFIG_PPC_8xx is not set | ||
| 14 | # CONFIG_40x is not set | ||
| 15 | CONFIG_44x=y | ||
| 16 | # CONFIG_E200 is not set | ||
| 17 | CONFIG_4xx=y | ||
| 18 | CONFIG_BOOKE=y | ||
| 19 | CONFIG_PTE_64BIT=y | ||
| 20 | CONFIG_PHYS_64BIT=y | ||
| 21 | # CONFIG_PPC_MM_SLICES is not set | ||
| 22 | CONFIG_NOT_COHERENT_CACHE=y | ||
| 23 | CONFIG_PPC32=y | ||
| 24 | CONFIG_WORD_SIZE=32 | ||
| 25 | CONFIG_PPC_MERGE=y | ||
| 26 | CONFIG_MMU=y | ||
| 27 | CONFIG_GENERIC_CMOS_UPDATE=y | ||
| 28 | CONFIG_GENERIC_TIME=y | ||
| 29 | CONFIG_GENERIC_TIME_VSYSCALL=y | ||
| 30 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 31 | CONFIG_GENERIC_HARDIRQS=y | ||
| 32 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set | ||
| 33 | CONFIG_IRQ_PER_CPU=y | ||
| 34 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 35 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 36 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | ||
| 37 | CONFIG_ARCH_HAS_ILOG2_U32=y | ||
| 38 | CONFIG_GENERIC_HWEIGHT=y | ||
| 39 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 40 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
| 41 | # CONFIG_ARCH_NO_VIRT_TO_BUS is not set | ||
| 42 | CONFIG_PPC=y | ||
| 43 | CONFIG_EARLY_PRINTK=y | ||
| 44 | CONFIG_GENERIC_NVRAM=y | ||
| 45 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | ||
| 46 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y | ||
| 47 | CONFIG_PPC_OF=y | ||
| 48 | CONFIG_OF=y | ||
| 49 | CONFIG_PPC_UDBG_16550=y | ||
| 50 | # CONFIG_GENERIC_TBSYNC is not set | ||
| 51 | CONFIG_AUDIT_ARCH=y | ||
| 52 | CONFIG_GENERIC_BUG=y | ||
| 53 | # CONFIG_DEFAULT_UIMAGE is not set | ||
| 54 | CONFIG_PPC_DCR_NATIVE=y | ||
| 55 | # CONFIG_PPC_DCR_MMIO is not set | ||
| 56 | CONFIG_PPC_DCR=y | ||
| 57 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 58 | |||
| 59 | # | ||
| 60 | # General setup | ||
| 61 | # | ||
| 62 | CONFIG_EXPERIMENTAL=y | ||
| 63 | CONFIG_BROKEN_ON_SMP=y | ||
| 64 | CONFIG_LOCK_KERNEL=y | ||
| 65 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 66 | CONFIG_LOCALVERSION="" | ||
| 67 | # CONFIG_LOCALVERSION_AUTO is not set | ||
| 68 | CONFIG_SWAP=y | ||
| 69 | CONFIG_SYSVIPC=y | ||
| 70 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 71 | CONFIG_POSIX_MQUEUE=y | ||
| 72 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
| 73 | # CONFIG_TASKSTATS is not set | ||
| 74 | # CONFIG_AUDIT is not set | ||
| 75 | CONFIG_IKCONFIG=y | ||
| 76 | CONFIG_IKCONFIG_PROC=y | ||
| 77 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 78 | # CONFIG_CGROUPS is not set | ||
| 79 | # CONFIG_GROUP_SCHED is not set | ||
| 80 | CONFIG_SYSFS_DEPRECATED=y | ||
| 81 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 82 | # CONFIG_RELAY is not set | ||
| 83 | CONFIG_NAMESPACES=y | ||
| 84 | # CONFIG_UTS_NS is not set | ||
| 85 | # CONFIG_IPC_NS is not set | ||
| 86 | # CONFIG_USER_NS is not set | ||
| 87 | # CONFIG_PID_NS is not set | ||
| 88 | CONFIG_BLK_DEV_INITRD=y | ||
| 89 | CONFIG_INITRAMFS_SOURCE="" | ||
| 90 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
| 91 | CONFIG_SYSCTL=y | ||
| 92 | # CONFIG_EMBEDDED is not set | ||
| 93 | CONFIG_SYSCTL_SYSCALL=y | ||
| 94 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 95 | CONFIG_KALLSYMS=y | ||
| 96 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 97 | CONFIG_HOTPLUG=y | ||
| 98 | CONFIG_PRINTK=y | ||
| 99 | CONFIG_BUG=y | ||
| 100 | CONFIG_ELF_CORE=y | ||
| 101 | CONFIG_COMPAT_BRK=y | ||
| 102 | CONFIG_BASE_FULL=y | ||
| 103 | CONFIG_FUTEX=y | ||
| 104 | CONFIG_ANON_INODES=y | ||
| 105 | CONFIG_EPOLL=y | ||
| 106 | CONFIG_SIGNALFD=y | ||
| 107 | CONFIG_TIMERFD=y | ||
| 108 | CONFIG_EVENTFD=y | ||
| 109 | CONFIG_SHMEM=y | ||
| 110 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 111 | CONFIG_SLAB=y | ||
| 112 | # CONFIG_SLUB is not set | ||
| 113 | # CONFIG_SLOB is not set | ||
| 114 | # CONFIG_PROFILING is not set | ||
| 115 | # CONFIG_MARKERS is not set | ||
| 116 | CONFIG_HAVE_OPROFILE=y | ||
| 117 | # CONFIG_KPROBES is not set | ||
| 118 | CONFIG_HAVE_KPROBES=y | ||
| 119 | CONFIG_HAVE_KRETPROBES=y | ||
| 120 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
| 121 | CONFIG_PROC_PAGE_MONITOR=y | ||
| 122 | CONFIG_SLABINFO=y | ||
| 123 | CONFIG_RT_MUTEXES=y | ||
| 124 | # CONFIG_TINY_SHMEM is not set | ||
| 125 | CONFIG_BASE_SMALL=0 | ||
| 126 | CONFIG_MODULES=y | ||
| 127 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
| 128 | CONFIG_MODULE_UNLOAD=y | ||
| 129 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
| 130 | CONFIG_MODVERSIONS=y | ||
| 131 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 132 | CONFIG_KMOD=y | ||
| 133 | CONFIG_BLOCK=y | ||
| 134 | # CONFIG_LBD is not set | ||
| 135 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 136 | # CONFIG_LSF is not set | ||
| 137 | # CONFIG_BLK_DEV_BSG is not set | ||
| 138 | |||
| 139 | # | ||
| 140 | # IO Schedulers | ||
| 141 | # | ||
| 142 | CONFIG_IOSCHED_NOOP=y | ||
| 143 | CONFIG_IOSCHED_AS=y | ||
| 144 | CONFIG_IOSCHED_DEADLINE=y | ||
| 145 | CONFIG_IOSCHED_CFQ=y | ||
| 146 | # CONFIG_DEFAULT_AS is not set | ||
| 147 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 148 | CONFIG_DEFAULT_CFQ=y | ||
| 149 | # CONFIG_DEFAULT_NOOP is not set | ||
| 150 | CONFIG_DEFAULT_IOSCHED="cfq" | ||
| 151 | CONFIG_CLASSIC_RCU=y | ||
| 152 | # CONFIG_PPC4xx_PCI_EXPRESS is not set | ||
| 153 | |||
| 154 | # | ||
| 155 | # Platform support | ||
| 156 | # | ||
| 157 | # CONFIG_PPC_MPC512x is not set | ||
| 158 | # CONFIG_PPC_MPC5121 is not set | ||
| 159 | # CONFIG_PPC_CELL is not set | ||
| 160 | # CONFIG_PPC_CELL_NATIVE is not set | ||
| 161 | # CONFIG_PQ2ADS is not set | ||
| 162 | # CONFIG_BAMBOO is not set | ||
| 163 | # CONFIG_EBONY is not set | ||
| 164 | # CONFIG_SEQUOIA is not set | ||
| 165 | # CONFIG_TAISHAN is not set | ||
| 166 | # CONFIG_KATMAI is not set | ||
| 167 | # CONFIG_RAINIER is not set | ||
| 168 | # CONFIG_WARP is not set | ||
| 169 | # CONFIG_CANYONLANDS is not set | ||
| 170 | # CONFIG_YOSEMITE is not set | ||
| 171 | CONFIG_XILINX_VIRTEX440_GENERIC_BOARD=y | ||
| 172 | CONFIG_XILINX_VIRTEX=y | ||
| 173 | CONFIG_XILINX_VIRTEX_5_FXT=y | ||
| 174 | # CONFIG_IPIC is not set | ||
| 175 | # CONFIG_MPIC is not set | ||
| 176 | # CONFIG_MPIC_WEIRD is not set | ||
| 177 | # CONFIG_PPC_I8259 is not set | ||
| 178 | # CONFIG_PPC_RTAS is not set | ||
| 179 | # CONFIG_MMIO_NVRAM is not set | ||
| 180 | # CONFIG_PPC_MPC106 is not set | ||
| 181 | # CONFIG_PPC_970_NAP is not set | ||
| 182 | # CONFIG_PPC_INDIRECT_IO is not set | ||
| 183 | # CONFIG_GENERIC_IOMAP is not set | ||
| 184 | # CONFIG_CPU_FREQ is not set | ||
| 185 | # CONFIG_FSL_ULI1575 is not set | ||
| 186 | |||
| 187 | # | ||
| 188 | # Kernel options | ||
| 189 | # | ||
| 190 | # CONFIG_HIGHMEM is not set | ||
| 191 | # CONFIG_TICK_ONESHOT is not set | ||
| 192 | # CONFIG_NO_HZ is not set | ||
| 193 | # CONFIG_HIGH_RES_TIMERS is not set | ||
| 194 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 195 | # CONFIG_HZ_100 is not set | ||
| 196 | CONFIG_HZ_250=y | ||
| 197 | # CONFIG_HZ_300 is not set | ||
| 198 | # CONFIG_HZ_1000 is not set | ||
| 199 | CONFIG_HZ=250 | ||
| 200 | # CONFIG_SCHED_HRTICK is not set | ||
| 201 | # CONFIG_PREEMPT_NONE is not set | ||
| 202 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
| 203 | CONFIG_PREEMPT=y | ||
| 204 | # CONFIG_PREEMPT_RCU is not set | ||
| 205 | CONFIG_BINFMT_ELF=y | ||
| 206 | # CONFIG_BINFMT_MISC is not set | ||
| 207 | CONFIG_MATH_EMULATION=y | ||
| 208 | # CONFIG_IOMMU_HELPER is not set | ||
| 209 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
| 210 | CONFIG_ARCH_HAS_WALK_MEMORY=y | ||
| 211 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y | ||
| 212 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
| 213 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
| 214 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 215 | CONFIG_FLATMEM_MANUAL=y | ||
| 216 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 217 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 218 | CONFIG_FLATMEM=y | ||
| 219 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 220 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 221 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 222 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
| 223 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
| 224 | CONFIG_RESOURCES_64BIT=y | ||
| 225 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 226 | CONFIG_BOUNCE=y | ||
| 227 | CONFIG_VIRT_TO_BUS=y | ||
| 228 | CONFIG_FORCE_MAX_ZONEORDER=11 | ||
| 229 | CONFIG_PROC_DEVICETREE=y | ||
| 230 | CONFIG_CMDLINE_BOOL=y | ||
| 231 | CONFIG_CMDLINE="" | ||
| 232 | CONFIG_EXTRA_TARGETS="" | ||
| 233 | CONFIG_SECCOMP=y | ||
| 234 | CONFIG_ISA_DMA_API=y | ||
| 235 | |||
| 236 | # | ||
| 237 | # Bus options | ||
| 238 | # | ||
| 239 | CONFIG_ZONE_DMA=y | ||
| 240 | CONFIG_PPC_INDIRECT_PCI=y | ||
| 241 | CONFIG_4xx_SOC=y | ||
| 242 | CONFIG_PCI=y | ||
| 243 | CONFIG_PCI_DOMAINS=y | ||
| 244 | CONFIG_PCI_SYSCALL=y | ||
| 245 | # CONFIG_PCIEPORTBUS is not set | ||
| 246 | CONFIG_ARCH_SUPPORTS_MSI=y | ||
| 247 | # CONFIG_PCI_MSI is not set | ||
| 248 | CONFIG_PCI_LEGACY=y | ||
| 249 | # CONFIG_PCCARD is not set | ||
| 250 | # CONFIG_HOTPLUG_PCI is not set | ||
| 251 | # CONFIG_HAS_RAPIDIO is not set | ||
| 252 | |||
| 253 | # | ||
| 254 | # Advanced setup | ||
| 255 | # | ||
| 256 | # CONFIG_ADVANCED_OPTIONS is not set | ||
| 257 | |||
| 258 | # | ||
| 259 | # Default settings for advanced configuration options are used | ||
| 260 | # | ||
| 261 | CONFIG_LOWMEM_SIZE=0x30000000 | ||
| 262 | CONFIG_PAGE_OFFSET=0xc0000000 | ||
| 263 | CONFIG_KERNEL_START=0xc0000000 | ||
| 264 | CONFIG_PHYSICAL_START=0x00000000 | ||
| 265 | CONFIG_TASK_SIZE=0xc0000000 | ||
| 266 | CONFIG_CONSISTENT_START=0xff100000 | ||
| 267 | CONFIG_CONSISTENT_SIZE=0x00200000 | ||
| 268 | |||
| 269 | # | ||
| 270 | # Networking | ||
| 271 | # | ||
| 272 | CONFIG_NET=y | ||
| 273 | |||
| 274 | # | ||
| 275 | # Networking options | ||
| 276 | # | ||
| 277 | CONFIG_PACKET=y | ||
| 278 | # CONFIG_PACKET_MMAP is not set | ||
| 279 | CONFIG_UNIX=y | ||
| 280 | CONFIG_XFRM=y | ||
| 281 | # CONFIG_XFRM_USER is not set | ||
| 282 | # CONFIG_XFRM_SUB_POLICY is not set | ||
| 283 | # CONFIG_XFRM_MIGRATE is not set | ||
| 284 | # CONFIG_XFRM_STATISTICS is not set | ||
| 285 | # CONFIG_NET_KEY is not set | ||
| 286 | CONFIG_INET=y | ||
| 287 | CONFIG_IP_MULTICAST=y | ||
| 288 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 289 | CONFIG_IP_FIB_HASH=y | ||
| 290 | CONFIG_IP_PNP=y | ||
| 291 | CONFIG_IP_PNP_DHCP=y | ||
| 292 | CONFIG_IP_PNP_BOOTP=y | ||
| 293 | # CONFIG_IP_PNP_RARP is not set | ||
| 294 | # CONFIG_NET_IPIP is not set | ||
| 295 | # CONFIG_NET_IPGRE is not set | ||
| 296 | # CONFIG_IP_MROUTE is not set | ||
| 297 | # CONFIG_ARPD is not set | ||
| 298 | # CONFIG_SYN_COOKIES is not set | ||
| 299 | # CONFIG_INET_AH is not set | ||
| 300 | # CONFIG_INET_ESP is not set | ||
| 301 | # CONFIG_INET_IPCOMP is not set | ||
| 302 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 303 | CONFIG_INET_TUNNEL=m | ||
| 304 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
| 305 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
| 306 | CONFIG_INET_XFRM_MODE_BEET=y | ||
| 307 | # CONFIG_INET_LRO is not set | ||
| 308 | CONFIG_INET_DIAG=y | ||
| 309 | CONFIG_INET_TCP_DIAG=y | ||
| 310 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 311 | CONFIG_TCP_CONG_CUBIC=y | ||
| 312 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 313 | # CONFIG_TCP_MD5SIG is not set | ||
| 314 | # CONFIG_IP_VS is not set | ||
| 315 | CONFIG_IPV6=m | ||
| 316 | # CONFIG_IPV6_PRIVACY is not set | ||
| 317 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
| 318 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set | ||
| 319 | # CONFIG_INET6_AH is not set | ||
| 320 | # CONFIG_INET6_ESP is not set | ||
| 321 | # CONFIG_INET6_IPCOMP is not set | ||
| 322 | # CONFIG_IPV6_MIP6 is not set | ||
| 323 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
| 324 | # CONFIG_INET6_TUNNEL is not set | ||
| 325 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
| 326 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
| 327 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
| 328 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
| 329 | CONFIG_IPV6_SIT=m | ||
| 330 | CONFIG_IPV6_NDISC_NODETYPE=y | ||
| 331 | # CONFIG_IPV6_TUNNEL is not set | ||
| 332 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
| 333 | # CONFIG_IPV6_MROUTE is not set | ||
| 334 | # CONFIG_NETWORK_SECMARK is not set | ||
| 335 | CONFIG_NETFILTER=y | ||
| 336 | # CONFIG_NETFILTER_DEBUG is not set | ||
| 337 | CONFIG_NETFILTER_ADVANCED=y | ||
| 338 | |||
| 339 | # | ||
| 340 | # Core Netfilter Configuration | ||
| 341 | # | ||
| 342 | # CONFIG_NETFILTER_NETLINK_QUEUE is not set | ||
| 343 | # CONFIG_NETFILTER_NETLINK_LOG is not set | ||
| 344 | # CONFIG_NF_CONNTRACK is not set | ||
| 345 | CONFIG_NETFILTER_XTABLES=m | ||
| 346 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
| 347 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | ||
| 348 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
| 349 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
| 350 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | ||
| 351 | # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set | ||
| 352 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set | ||
| 353 | # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set | ||
| 354 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
| 355 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
| 356 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | ||
| 357 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | ||
| 358 | # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set | ||
| 359 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
| 360 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set | ||
| 361 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set | ||
| 362 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
| 363 | # CONFIG_NETFILTER_XT_MATCH_OWNER is not set | ||
| 364 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set | ||
| 365 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
| 366 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
| 367 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
| 368 | # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set | ||
| 369 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
| 370 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
| 371 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
| 372 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
| 373 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
| 374 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | ||
| 375 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | ||
| 376 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
| 377 | |||
| 378 | # | ||
| 379 | # IP: Netfilter Configuration | ||
| 380 | # | ||
| 381 | # CONFIG_IP_NF_QUEUE is not set | ||
| 382 | CONFIG_IP_NF_IPTABLES=m | ||
| 383 | # CONFIG_IP_NF_MATCH_RECENT is not set | ||
| 384 | # CONFIG_IP_NF_MATCH_ECN is not set | ||
| 385 | # CONFIG_IP_NF_MATCH_AH is not set | ||
| 386 | # CONFIG_IP_NF_MATCH_TTL is not set | ||
| 387 | # CONFIG_IP_NF_MATCH_ADDRTYPE is not set | ||
| 388 | CONFIG_IP_NF_FILTER=m | ||
| 389 | # CONFIG_IP_NF_TARGET_REJECT is not set | ||
| 390 | # CONFIG_IP_NF_TARGET_LOG is not set | ||
| 391 | # CONFIG_IP_NF_TARGET_ULOG is not set | ||
| 392 | CONFIG_IP_NF_MANGLE=m | ||
| 393 | # CONFIG_IP_NF_TARGET_ECN is not set | ||
| 394 | # CONFIG_IP_NF_TARGET_TTL is not set | ||
| 395 | # CONFIG_IP_NF_RAW is not set | ||
| 396 | # CONFIG_IP_NF_ARPTABLES is not set | ||
| 397 | |||
| 398 | # | ||
| 399 | # IPv6: Netfilter Configuration | ||
| 400 | # | ||
| 401 | # CONFIG_IP6_NF_QUEUE is not set | ||
| 402 | # CONFIG_IP6_NF_IPTABLES is not set | ||
| 403 | # CONFIG_IP_DCCP is not set | ||
| 404 | # CONFIG_IP_SCTP is not set | ||
| 405 | # CONFIG_TIPC is not set | ||
| 406 | # CONFIG_ATM is not set | ||
| 407 | # CONFIG_BRIDGE is not set | ||
| 408 | # CONFIG_VLAN_8021Q is not set | ||
| 409 | # CONFIG_DECNET is not set | ||
| 410 | # CONFIG_LLC2 is not set | ||
| 411 | # CONFIG_IPX is not set | ||
| 412 | # CONFIG_ATALK is not set | ||
| 413 | # CONFIG_X25 is not set | ||
| 414 | # CONFIG_LAPB is not set | ||
| 415 | # CONFIG_ECONET is not set | ||
| 416 | # CONFIG_WAN_ROUTER is not set | ||
| 417 | # CONFIG_NET_SCHED is not set | ||
| 418 | |||
| 419 | # | ||
| 420 | # Network testing | ||
| 421 | # | ||
| 422 | # CONFIG_NET_PKTGEN is not set | ||
| 423 | # CONFIG_HAMRADIO is not set | ||
| 424 | # CONFIG_CAN is not set | ||
| 425 | # CONFIG_IRDA is not set | ||
| 426 | # CONFIG_BT is not set | ||
| 427 | # CONFIG_AF_RXRPC is not set | ||
| 428 | |||
| 429 | # | ||
| 430 | # Wireless | ||
| 431 | # | ||
| 432 | # CONFIG_CFG80211 is not set | ||
| 433 | # CONFIG_WIRELESS_EXT is not set | ||
| 434 | # CONFIG_MAC80211 is not set | ||
| 435 | # CONFIG_IEEE80211 is not set | ||
| 436 | # CONFIG_RFKILL is not set | ||
| 437 | # CONFIG_NET_9P is not set | ||
| 438 | |||
| 439 | # | ||
| 440 | # Device Drivers | ||
| 441 | # | ||
| 442 | |||
| 443 | # | ||
| 444 | # Generic Driver Options | ||
| 445 | # | ||
| 446 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 447 | CONFIG_STANDALONE=y | ||
| 448 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 449 | # CONFIG_FW_LOADER is not set | ||
| 450 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 451 | # CONFIG_CONNECTOR is not set | ||
| 452 | # CONFIG_MTD is not set | ||
| 453 | CONFIG_OF_DEVICE=y | ||
| 454 | CONFIG_OF_I2C=y | ||
| 455 | # CONFIG_PARPORT is not set | ||
| 456 | CONFIG_BLK_DEV=y | ||
| 457 | # CONFIG_BLK_DEV_FD is not set | ||
| 458 | # CONFIG_BLK_CPQ_DA is not set | ||
| 459 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
| 460 | # CONFIG_BLK_DEV_DAC960 is not set | ||
| 461 | # CONFIG_BLK_DEV_UMEM is not set | ||
| 462 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 463 | CONFIG_BLK_DEV_LOOP=y | ||
| 464 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
| 465 | # CONFIG_BLK_DEV_NBD is not set | ||
| 466 | # CONFIG_BLK_DEV_SX8 is not set | ||
| 467 | CONFIG_BLK_DEV_RAM=y | ||
| 468 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
| 469 | CONFIG_BLK_DEV_RAM_SIZE=8192 | ||
| 470 | # CONFIG_BLK_DEV_XIP is not set | ||
| 471 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 472 | # CONFIG_ATA_OVER_ETH is not set | ||
| 473 | # CONFIG_XILINX_SYSACE is not set | ||
| 474 | CONFIG_MISC_DEVICES=y | ||
| 475 | # CONFIG_PHANTOM is not set | ||
| 476 | # CONFIG_EEPROM_93CX6 is not set | ||
| 477 | # CONFIG_SGI_IOC4 is not set | ||
| 478 | # CONFIG_TIFM_CORE is not set | ||
| 479 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
| 480 | CONFIG_HAVE_IDE=y | ||
| 481 | # CONFIG_IDE is not set | ||
| 482 | |||
| 483 | # | ||
| 484 | # SCSI device support | ||
| 485 | # | ||
| 486 | # CONFIG_RAID_ATTRS is not set | ||
| 487 | # CONFIG_SCSI is not set | ||
| 488 | # CONFIG_SCSI_DMA is not set | ||
| 489 | # CONFIG_SCSI_NETLINK is not set | ||
| 490 | # CONFIG_ATA is not set | ||
| 491 | # CONFIG_MD is not set | ||
| 492 | # CONFIG_FUSION is not set | ||
| 493 | |||
| 494 | # | ||
| 495 | # IEEE 1394 (FireWire) support | ||
| 496 | # | ||
| 497 | |||
| 498 | # | ||
| 499 | # Enable only one of the two stacks, unless you know what you are doing | ||
| 500 | # | ||
| 501 | # CONFIG_FIREWIRE is not set | ||
| 502 | # CONFIG_IEEE1394 is not set | ||
| 503 | # CONFIG_I2O is not set | ||
| 504 | # CONFIG_MACINTOSH_DRIVERS is not set | ||
| 505 | CONFIG_NETDEVICES=y | ||
| 506 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
| 507 | # CONFIG_DUMMY is not set | ||
| 508 | # CONFIG_BONDING is not set | ||
| 509 | # CONFIG_MACVLAN is not set | ||
| 510 | # CONFIG_EQUALIZER is not set | ||
| 511 | # CONFIG_TUN is not set | ||
| 512 | # CONFIG_VETH is not set | ||
| 513 | # CONFIG_ARCNET is not set | ||
| 514 | # CONFIG_PHYLIB is not set | ||
| 515 | CONFIG_NET_ETHERNET=y | ||
| 516 | CONFIG_MII=y | ||
| 517 | # CONFIG_HAPPYMEAL is not set | ||
| 518 | # CONFIG_SUNGEM is not set | ||
| 519 | # CONFIG_CASSINI is not set | ||
| 520 | # CONFIG_NET_VENDOR_3COM is not set | ||
| 521 | # CONFIG_NET_TULIP is not set | ||
| 522 | # CONFIG_HP100 is not set | ||
| 523 | # CONFIG_IBM_NEW_EMAC is not set | ||
| 524 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 525 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 526 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 527 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 528 | # CONFIG_NET_PCI is not set | ||
| 529 | # CONFIG_B44 is not set | ||
| 530 | CONFIG_NETDEV_1000=y | ||
| 531 | # CONFIG_ACENIC is not set | ||
| 532 | # CONFIG_DL2K is not set | ||
| 533 | # CONFIG_E1000 is not set | ||
| 534 | # CONFIG_E1000E is not set | ||
| 535 | # CONFIG_E1000E_ENABLED is not set | ||
| 536 | # CONFIG_IP1000 is not set | ||
| 537 | # CONFIG_IGB is not set | ||
| 538 | # CONFIG_NS83820 is not set | ||
| 539 | # CONFIG_HAMACHI is not set | ||
| 540 | # CONFIG_YELLOWFIN is not set | ||
| 541 | # CONFIG_R8169 is not set | ||
| 542 | # CONFIG_SIS190 is not set | ||
| 543 | # CONFIG_SKGE is not set | ||
| 544 | # CONFIG_SKY2 is not set | ||
| 545 | # CONFIG_VIA_VELOCITY is not set | ||
| 546 | # CONFIG_TIGON3 is not set | ||
| 547 | # CONFIG_BNX2 is not set | ||
| 548 | # CONFIG_QLA3XXX is not set | ||
| 549 | # CONFIG_ATL1 is not set | ||
| 550 | # CONFIG_NETDEV_10000 is not set | ||
| 551 | # CONFIG_TR is not set | ||
| 552 | |||
| 553 | # | ||
| 554 | # Wireless LAN | ||
| 555 | # | ||
| 556 | # CONFIG_WLAN_PRE80211 is not set | ||
| 557 | # CONFIG_WLAN_80211 is not set | ||
| 558 | # CONFIG_IWLWIFI_LEDS is not set | ||
| 559 | # CONFIG_WAN is not set | ||
| 560 | # CONFIG_FDDI is not set | ||
| 561 | # CONFIG_HIPPI is not set | ||
| 562 | # CONFIG_PPP is not set | ||
| 563 | # CONFIG_SLIP is not set | ||
| 564 | # CONFIG_NETCONSOLE is not set | ||
| 565 | # CONFIG_NETPOLL is not set | ||
| 566 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 567 | # CONFIG_ISDN is not set | ||
| 568 | # CONFIG_PHONE is not set | ||
| 569 | |||
| 570 | # | ||
| 571 | # Input device support | ||
| 572 | # | ||
| 573 | CONFIG_INPUT=y | ||
| 574 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 575 | # CONFIG_INPUT_POLLDEV is not set | ||
| 576 | |||
| 577 | # | ||
| 578 | # Userland interfaces | ||
| 579 | # | ||
| 580 | CONFIG_INPUT_MOUSEDEV=y | ||
| 581 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | ||
| 582 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
| 583 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
| 584 | # CONFIG_INPUT_JOYDEV is not set | ||
| 585 | # CONFIG_INPUT_EVDEV is not set | ||
| 586 | # CONFIG_INPUT_EVBUG is not set | ||
| 587 | |||
| 588 | # | ||
| 589 | # Input Device Drivers | ||
| 590 | # | ||
| 591 | CONFIG_INPUT_KEYBOARD=y | ||
| 592 | CONFIG_KEYBOARD_ATKBD=y | ||
| 593 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
| 594 | # CONFIG_KEYBOARD_LKKBD is not set | ||
| 595 | # CONFIG_KEYBOARD_XTKBD is not set | ||
| 596 | # CONFIG_KEYBOARD_NEWTON is not set | ||
| 597 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
| 598 | CONFIG_INPUT_MOUSE=y | ||
| 599 | CONFIG_MOUSE_PS2=y | ||
| 600 | CONFIG_MOUSE_PS2_ALPS=y | ||
| 601 | CONFIG_MOUSE_PS2_LOGIPS2PP=y | ||
| 602 | CONFIG_MOUSE_PS2_SYNAPTICS=y | ||
| 603 | CONFIG_MOUSE_PS2_LIFEBOOK=y | ||
| 604 | CONFIG_MOUSE_PS2_TRACKPOINT=y | ||
| 605 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set | ||
| 606 | # CONFIG_MOUSE_SERIAL is not set | ||
| 607 | # CONFIG_MOUSE_VSXXXAA is not set | ||
| 608 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 609 | # CONFIG_INPUT_TABLET is not set | ||
| 610 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
| 611 | # CONFIG_INPUT_MISC is not set | ||
| 612 | |||
| 613 | # | ||
| 614 | # Hardware I/O ports | ||
| 615 | # | ||
| 616 | CONFIG_SERIO=y | ||
| 617 | # CONFIG_SERIO_I8042 is not set | ||
| 618 | CONFIG_SERIO_SERPORT=y | ||
| 619 | # CONFIG_SERIO_PCIPS2 is not set | ||
| 620 | CONFIG_SERIO_LIBPS2=y | ||
| 621 | # CONFIG_SERIO_RAW is not set | ||
| 622 | # CONFIG_GAMEPORT is not set | ||
| 623 | |||
| 624 | # | ||
| 625 | # Character devices | ||
| 626 | # | ||
| 627 | CONFIG_VT=y | ||
| 628 | CONFIG_VT_CONSOLE=y | ||
| 629 | CONFIG_HW_CONSOLE=y | ||
| 630 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
| 631 | CONFIG_DEVKMEM=y | ||
| 632 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 633 | # CONFIG_NOZOMI is not set | ||
| 634 | |||
| 635 | # | ||
| 636 | # Serial drivers | ||
| 637 | # | ||
| 638 | CONFIG_SERIAL_8250=y | ||
| 639 | CONFIG_SERIAL_8250_CONSOLE=y | ||
| 640 | CONFIG_SERIAL_8250_PCI=y | ||
| 641 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
| 642 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
| 643 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
| 644 | |||
| 645 | # | ||
| 646 | # Non-8250 serial port support | ||
| 647 | # | ||
| 648 | # CONFIG_SERIAL_UARTLITE is not set | ||
| 649 | CONFIG_SERIAL_CORE=y | ||
| 650 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 651 | # CONFIG_SERIAL_JSM is not set | ||
| 652 | CONFIG_SERIAL_OF_PLATFORM=y | ||
| 653 | CONFIG_UNIX98_PTYS=y | ||
| 654 | CONFIG_LEGACY_PTYS=y | ||
| 655 | CONFIG_LEGACY_PTY_COUNT=256 | ||
| 656 | # CONFIG_IPMI_HANDLER is not set | ||
| 657 | CONFIG_HW_RANDOM=m | ||
| 658 | # CONFIG_NVRAM is not set | ||
| 659 | # CONFIG_GEN_RTC is not set | ||
| 660 | CONFIG_XILINX_HWICAP=y | ||
| 661 | # CONFIG_R3964 is not set | ||
| 662 | # CONFIG_APPLICOM is not set | ||
| 663 | # CONFIG_RAW_DRIVER is not set | ||
| 664 | # CONFIG_TCG_TPM is not set | ||
| 665 | CONFIG_DEVPORT=y | ||
| 666 | CONFIG_I2C=y | ||
| 667 | CONFIG_I2C_BOARDINFO=y | ||
| 668 | CONFIG_I2C_CHARDEV=y | ||
| 669 | |||
| 670 | # | ||
| 671 | # I2C Hardware Bus support | ||
| 672 | # | ||
| 673 | # CONFIG_I2C_ALI1535 is not set | ||
| 674 | # CONFIG_I2C_ALI1563 is not set | ||
| 675 | # CONFIG_I2C_ALI15X3 is not set | ||
| 676 | # CONFIG_I2C_AMD756 is not set | ||
| 677 | # CONFIG_I2C_AMD8111 is not set | ||
| 678 | # CONFIG_I2C_I801 is not set | ||
| 679 | # CONFIG_I2C_I810 is not set | ||
| 680 | # CONFIG_I2C_PIIX4 is not set | ||
| 681 | # CONFIG_I2C_IBM_IIC is not set | ||
| 682 | # CONFIG_I2C_MPC is not set | ||
| 683 | # CONFIG_I2C_NFORCE2 is not set | ||
| 684 | # CONFIG_I2C_OCORES is not set | ||
| 685 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
| 686 | # CONFIG_I2C_PROSAVAGE is not set | ||
| 687 | # CONFIG_I2C_SAVAGE4 is not set | ||
| 688 | # CONFIG_I2C_SIMTEC is not set | ||
| 689 | # CONFIG_I2C_SIS5595 is not set | ||
| 690 | # CONFIG_I2C_SIS630 is not set | ||
| 691 | # CONFIG_I2C_SIS96X is not set | ||
| 692 | # CONFIG_I2C_TAOS_EVM is not set | ||
| 693 | # CONFIG_I2C_STUB is not set | ||
| 694 | # CONFIG_I2C_VIA is not set | ||
| 695 | # CONFIG_I2C_VIAPRO is not set | ||
| 696 | # CONFIG_I2C_VOODOO3 is not set | ||
| 697 | # CONFIG_I2C_PCA_PLATFORM is not set | ||
| 698 | |||
| 699 | # | ||
| 700 | # Miscellaneous I2C Chip support | ||
| 701 | # | ||
| 702 | # CONFIG_DS1682 is not set | ||
| 703 | # CONFIG_SENSORS_EEPROM is not set | ||
| 704 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 705 | # CONFIG_PCF8575 is not set | ||
| 706 | # CONFIG_SENSORS_PCF8591 is not set | ||
| 707 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 708 | # CONFIG_SENSORS_TSL2550 is not set | ||
| 709 | CONFIG_I2C_DEBUG_CORE=y | ||
| 710 | CONFIG_I2C_DEBUG_ALGO=y | ||
| 711 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 712 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 713 | # CONFIG_SPI is not set | ||
| 714 | # CONFIG_W1 is not set | ||
| 715 | # CONFIG_POWER_SUPPLY is not set | ||
| 716 | # CONFIG_HWMON is not set | ||
| 717 | # CONFIG_THERMAL is not set | ||
| 718 | # CONFIG_WATCHDOG is not set | ||
| 719 | |||
| 720 | # | ||
| 721 | # Sonics Silicon Backplane | ||
| 722 | # | ||
| 723 | CONFIG_SSB_POSSIBLE=y | ||
| 724 | # CONFIG_SSB is not set | ||
| 725 | |||
| 726 | # | ||
| 727 | # Multifunction device drivers | ||
| 728 | # | ||
| 729 | # CONFIG_MFD_SM501 is not set | ||
| 730 | # CONFIG_HTC_PASIC3 is not set | ||
| 731 | |||
| 732 | # | ||
| 733 | # Multimedia devices | ||
| 734 | # | ||
| 735 | |||
| 736 | # | ||
| 737 | # Multimedia core support | ||
| 738 | # | ||
| 739 | # CONFIG_VIDEO_DEV is not set | ||
| 740 | # CONFIG_DVB_CORE is not set | ||
| 741 | # CONFIG_VIDEO_MEDIA is not set | ||
| 742 | |||
| 743 | # | ||
| 744 | # Multimedia drivers | ||
| 745 | # | ||
| 746 | # CONFIG_DAB is not set | ||
| 747 | |||
| 748 | # | ||
| 749 | # Graphics support | ||
| 750 | # | ||
| 751 | # CONFIG_AGP is not set | ||
| 752 | # CONFIG_DRM is not set | ||
| 753 | # CONFIG_VGASTATE is not set | ||
| 754 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
| 755 | CONFIG_FB=y | ||
| 756 | # CONFIG_FIRMWARE_EDID is not set | ||
| 757 | # CONFIG_FB_DDC is not set | ||
| 758 | CONFIG_FB_CFB_FILLRECT=y | ||
| 759 | CONFIG_FB_CFB_COPYAREA=y | ||
| 760 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
| 761 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
| 762 | # CONFIG_FB_SYS_FILLRECT is not set | ||
| 763 | # CONFIG_FB_SYS_COPYAREA is not set | ||
| 764 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
| 765 | # CONFIG_FB_FOREIGN_ENDIAN is not set | ||
| 766 | # CONFIG_FB_SYS_FOPS is not set | ||
| 767 | # CONFIG_FB_SVGALIB is not set | ||
| 768 | # CONFIG_FB_MACMODES is not set | ||
| 769 | # CONFIG_FB_BACKLIGHT is not set | ||
| 770 | # CONFIG_FB_MODE_HELPERS is not set | ||
| 771 | # CONFIG_FB_TILEBLITTING is not set | ||
| 772 | |||
| 773 | # | ||
| 774 | # Frame buffer hardware drivers | ||
| 775 | # | ||
| 776 | # CONFIG_FB_CIRRUS is not set | ||
| 777 | # CONFIG_FB_PM2 is not set | ||
| 778 | # CONFIG_FB_CYBER2000 is not set | ||
| 779 | # CONFIG_FB_OF is not set | ||
| 780 | # CONFIG_FB_CT65550 is not set | ||
| 781 | # CONFIG_FB_ASILIANT is not set | ||
| 782 | # CONFIG_FB_IMSTT is not set | ||
| 783 | # CONFIG_FB_VGA16 is not set | ||
| 784 | # CONFIG_FB_S1D13XXX is not set | ||
| 785 | # CONFIG_FB_NVIDIA is not set | ||
| 786 | # CONFIG_FB_RIVA is not set | ||
| 787 | # CONFIG_FB_MATROX is not set | ||
| 788 | # CONFIG_FB_RADEON is not set | ||
| 789 | # CONFIG_FB_ATY128 is not set | ||
| 790 | # CONFIG_FB_ATY is not set | ||
| 791 | # CONFIG_FB_S3 is not set | ||
| 792 | # CONFIG_FB_SAVAGE is not set | ||
| 793 | # CONFIG_FB_SIS is not set | ||
| 794 | # CONFIG_FB_NEOMAGIC is not set | ||
| 795 | # CONFIG_FB_KYRO is not set | ||
| 796 | # CONFIG_FB_3DFX is not set | ||
| 797 | # CONFIG_FB_VOODOO1 is not set | ||
| 798 | # CONFIG_FB_VT8623 is not set | ||
| 799 | # CONFIG_FB_TRIDENT is not set | ||
| 800 | # CONFIG_FB_ARK is not set | ||
| 801 | # CONFIG_FB_PM3 is not set | ||
| 802 | # CONFIG_FB_IBM_GXT4500 is not set | ||
| 803 | CONFIG_FB_XILINX=y | ||
| 804 | # CONFIG_FB_VIRTUAL is not set | ||
| 805 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
| 806 | |||
| 807 | # | ||
| 808 | # Display device support | ||
| 809 | # | ||
| 810 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 811 | |||
| 812 | # | ||
| 813 | # Console display driver support | ||
| 814 | # | ||
| 815 | CONFIG_DUMMY_CONSOLE=y | ||
| 816 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
| 817 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
| 818 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
| 819 | CONFIG_FONTS=y | ||
| 820 | CONFIG_FONT_8x8=y | ||
| 821 | CONFIG_FONT_8x16=y | ||
| 822 | # CONFIG_FONT_6x11 is not set | ||
| 823 | # CONFIG_FONT_7x14 is not set | ||
| 824 | # CONFIG_FONT_PEARL_8x8 is not set | ||
| 825 | # CONFIG_FONT_ACORN_8x8 is not set | ||
| 826 | # CONFIG_FONT_MINI_4x6 is not set | ||
| 827 | # CONFIG_FONT_SUN8x16 is not set | ||
| 828 | # CONFIG_FONT_SUN12x22 is not set | ||
| 829 | # CONFIG_FONT_10x18 is not set | ||
| 830 | CONFIG_LOGO=y | ||
| 831 | CONFIG_LOGO_LINUX_MONO=y | ||
| 832 | CONFIG_LOGO_LINUX_VGA16=y | ||
| 833 | CONFIG_LOGO_LINUX_CLUT224=y | ||
| 834 | |||
| 835 | # | ||
| 836 | # Sound | ||
| 837 | # | ||
| 838 | # CONFIG_SOUND is not set | ||
| 839 | # CONFIG_HID_SUPPORT is not set | ||
| 840 | # CONFIG_USB_SUPPORT is not set | ||
| 841 | # CONFIG_MMC is not set | ||
| 842 | # CONFIG_MEMSTICK is not set | ||
| 843 | # CONFIG_NEW_LEDS is not set | ||
| 844 | # CONFIG_ACCESSIBILITY is not set | ||
| 845 | # CONFIG_INFINIBAND is not set | ||
| 846 | # CONFIG_EDAC is not set | ||
| 847 | # CONFIG_RTC_CLASS is not set | ||
| 848 | # CONFIG_DMADEVICES is not set | ||
| 849 | # CONFIG_UIO is not set | ||
| 850 | |||
| 851 | # | ||
| 852 | # File systems | ||
| 853 | # | ||
| 854 | CONFIG_EXT2_FS=y | ||
| 855 | # CONFIG_EXT2_FS_XATTR is not set | ||
| 856 | # CONFIG_EXT2_FS_XIP is not set | ||
| 857 | # CONFIG_EXT3_FS is not set | ||
| 858 | # CONFIG_EXT4DEV_FS is not set | ||
| 859 | # CONFIG_REISERFS_FS is not set | ||
| 860 | # CONFIG_JFS_FS is not set | ||
| 861 | # CONFIG_FS_POSIX_ACL is not set | ||
| 862 | # CONFIG_XFS_FS is not set | ||
| 863 | # CONFIG_OCFS2_FS is not set | ||
| 864 | CONFIG_DNOTIFY=y | ||
| 865 | CONFIG_INOTIFY=y | ||
| 866 | CONFIG_INOTIFY_USER=y | ||
| 867 | # CONFIG_QUOTA is not set | ||
| 868 | CONFIG_AUTOFS_FS=y | ||
| 869 | CONFIG_AUTOFS4_FS=y | ||
| 870 | CONFIG_FUSE_FS=m | ||
| 871 | |||
| 872 | # | ||
| 873 | # CD-ROM/DVD Filesystems | ||
| 874 | # | ||
| 875 | # CONFIG_ISO9660_FS is not set | ||
| 876 | # CONFIG_UDF_FS is not set | ||
| 877 | |||
| 878 | # | ||
| 879 | # DOS/FAT/NT Filesystems | ||
| 880 | # | ||
| 881 | CONFIG_FAT_FS=y | ||
| 882 | CONFIG_MSDOS_FS=y | ||
| 883 | CONFIG_VFAT_FS=y | ||
| 884 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 885 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 886 | # CONFIG_NTFS_FS is not set | ||
| 887 | |||
| 888 | # | ||
| 889 | # Pseudo filesystems | ||
| 890 | # | ||
| 891 | CONFIG_PROC_FS=y | ||
| 892 | # CONFIG_PROC_KCORE is not set | ||
| 893 | CONFIG_PROC_SYSCTL=y | ||
| 894 | CONFIG_SYSFS=y | ||
| 895 | CONFIG_TMPFS=y | ||
| 896 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 897 | # CONFIG_HUGETLB_PAGE is not set | ||
| 898 | # CONFIG_CONFIGFS_FS is not set | ||
| 899 | |||
| 900 | # | ||
| 901 | # Miscellaneous filesystems | ||
| 902 | # | ||
| 903 | # CONFIG_ADFS_FS is not set | ||
| 904 | # CONFIG_AFFS_FS is not set | ||
| 905 | # CONFIG_HFS_FS is not set | ||
| 906 | # CONFIG_HFSPLUS_FS is not set | ||
| 907 | # CONFIG_BEFS_FS is not set | ||
| 908 | # CONFIG_BFS_FS is not set | ||
| 909 | # CONFIG_EFS_FS is not set | ||
| 910 | CONFIG_CRAMFS=y | ||
| 911 | # CONFIG_VXFS_FS is not set | ||
| 912 | # CONFIG_MINIX_FS is not set | ||
| 913 | # CONFIG_HPFS_FS is not set | ||
| 914 | # CONFIG_QNX4FS_FS is not set | ||
| 915 | CONFIG_ROMFS_FS=y | ||
| 916 | # CONFIG_SYSV_FS is not set | ||
| 917 | # CONFIG_UFS_FS is not set | ||
| 918 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 919 | CONFIG_NFS_FS=y | ||
| 920 | CONFIG_NFS_V3=y | ||
| 921 | # CONFIG_NFS_V3_ACL is not set | ||
| 922 | # CONFIG_NFS_V4 is not set | ||
| 923 | CONFIG_NFSD=y | ||
| 924 | CONFIG_NFSD_V3=y | ||
| 925 | # CONFIG_NFSD_V3_ACL is not set | ||
| 926 | # CONFIG_NFSD_V4 is not set | ||
| 927 | CONFIG_ROOT_NFS=y | ||
| 928 | CONFIG_LOCKD=y | ||
| 929 | CONFIG_LOCKD_V4=y | ||
| 930 | CONFIG_EXPORTFS=y | ||
| 931 | CONFIG_NFS_COMMON=y | ||
| 932 | CONFIG_SUNRPC=y | ||
| 933 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 934 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
| 935 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 936 | CONFIG_SMB_FS=y | ||
| 937 | # CONFIG_SMB_NLS_DEFAULT is not set | ||
| 938 | # CONFIG_CIFS is not set | ||
| 939 | # CONFIG_NCP_FS is not set | ||
| 940 | # CONFIG_CODA_FS is not set | ||
| 941 | # CONFIG_AFS_FS is not set | ||
| 942 | |||
| 943 | # | ||
| 944 | # Partition Types | ||
| 945 | # | ||
| 946 | # CONFIG_PARTITION_ADVANCED is not set | ||
| 947 | CONFIG_MSDOS_PARTITION=y | ||
| 948 | CONFIG_NLS=y | ||
| 949 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
| 950 | CONFIG_NLS_CODEPAGE_437=y | ||
| 951 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
| 952 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
| 953 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
| 954 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
| 955 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
| 956 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
| 957 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
| 958 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
| 959 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
| 960 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
| 961 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
| 962 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
| 963 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
| 964 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
| 965 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
| 966 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
| 967 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
| 968 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
| 969 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
| 970 | # CONFIG_NLS_ISO8859_8 is not set | ||
| 971 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
| 972 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
| 973 | CONFIG_NLS_ASCII=m | ||
| 974 | CONFIG_NLS_ISO8859_1=m | ||
| 975 | # CONFIG_NLS_ISO8859_2 is not set | ||
| 976 | # CONFIG_NLS_ISO8859_3 is not set | ||
| 977 | # CONFIG_NLS_ISO8859_4 is not set | ||
| 978 | # CONFIG_NLS_ISO8859_5 is not set | ||
| 979 | # CONFIG_NLS_ISO8859_6 is not set | ||
| 980 | # CONFIG_NLS_ISO8859_7 is not set | ||
| 981 | # CONFIG_NLS_ISO8859_9 is not set | ||
| 982 | # CONFIG_NLS_ISO8859_13 is not set | ||
| 983 | # CONFIG_NLS_ISO8859_14 is not set | ||
| 984 | # CONFIG_NLS_ISO8859_15 is not set | ||
| 985 | # CONFIG_NLS_KOI8_R is not set | ||
| 986 | # CONFIG_NLS_KOI8_U is not set | ||
| 987 | CONFIG_NLS_UTF8=m | ||
| 988 | # CONFIG_DLM is not set | ||
| 989 | |||
| 990 | # | ||
| 991 | # Library routines | ||
| 992 | # | ||
| 993 | CONFIG_BITREVERSE=y | ||
| 994 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
| 995 | CONFIG_CRC_CCITT=y | ||
| 996 | # CONFIG_CRC16 is not set | ||
| 997 | # CONFIG_CRC_ITU_T is not set | ||
| 998 | CONFIG_CRC32=y | ||
| 999 | # CONFIG_CRC7 is not set | ||
| 1000 | # CONFIG_LIBCRC32C is not set | ||
| 1001 | CONFIG_ZLIB_INFLATE=y | ||
| 1002 | CONFIG_PLIST=y | ||
| 1003 | CONFIG_HAS_IOMEM=y | ||
| 1004 | CONFIG_HAS_IOPORT=y | ||
| 1005 | CONFIG_HAS_DMA=y | ||
| 1006 | CONFIG_HAVE_LMB=y | ||
| 1007 | |||
| 1008 | # | ||
| 1009 | # Kernel hacking | ||
| 1010 | # | ||
| 1011 | # CONFIG_PRINTK_TIME is not set | ||
| 1012 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1013 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1014 | CONFIG_FRAME_WARN=1024 | ||
| 1015 | # CONFIG_MAGIC_SYSRQ is not set | ||
| 1016 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1017 | # CONFIG_DEBUG_FS is not set | ||
| 1018 | # CONFIG_HEADERS_CHECK is not set | ||
| 1019 | # CONFIG_DEBUG_KERNEL is not set | ||
| 1020 | CONFIG_DEBUG_BUGVERBOSE=y | ||
| 1021 | # CONFIG_SAMPLES is not set | ||
| 1022 | # CONFIG_IRQSTACKS is not set | ||
| 1023 | # CONFIG_PPC_EARLY_DEBUG is not set | ||
| 1024 | |||
| 1025 | # | ||
| 1026 | # Security options | ||
| 1027 | # | ||
| 1028 | # CONFIG_KEYS is not set | ||
| 1029 | # CONFIG_SECURITY is not set | ||
| 1030 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1031 | CONFIG_CRYPTO=y | ||
| 1032 | |||
| 1033 | # | ||
| 1034 | # Crypto core or helper | ||
| 1035 | # | ||
| 1036 | # CONFIG_CRYPTO_MANAGER is not set | ||
| 1037 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1038 | # CONFIG_CRYPTO_NULL is not set | ||
| 1039 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1040 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1041 | # CONFIG_CRYPTO_TEST is not set | ||
| 1042 | |||
| 1043 | # | ||
| 1044 | # Authenticated Encryption with Associated Data | ||
| 1045 | # | ||
| 1046 | # CONFIG_CRYPTO_CCM is not set | ||
| 1047 | # CONFIG_CRYPTO_GCM is not set | ||
| 1048 | # CONFIG_CRYPTO_SEQIV is not set | ||
| 1049 | |||
| 1050 | # | ||
| 1051 | # Block modes | ||
| 1052 | # | ||
| 1053 | # CONFIG_CRYPTO_CBC is not set | ||
| 1054 | # CONFIG_CRYPTO_CTR is not set | ||
| 1055 | # CONFIG_CRYPTO_CTS is not set | ||
| 1056 | # CONFIG_CRYPTO_ECB is not set | ||
| 1057 | # CONFIG_CRYPTO_LRW is not set | ||
| 1058 | # CONFIG_CRYPTO_PCBC is not set | ||
| 1059 | # CONFIG_CRYPTO_XTS is not set | ||
| 1060 | |||
| 1061 | # | ||
| 1062 | # Hash modes | ||
| 1063 | # | ||
| 1064 | # CONFIG_CRYPTO_HMAC is not set | ||
| 1065 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1066 | |||
| 1067 | # | ||
| 1068 | # Digest | ||
| 1069 | # | ||
| 1070 | # CONFIG_CRYPTO_CRC32C is not set | ||
| 1071 | # CONFIG_CRYPTO_MD4 is not set | ||
| 1072 | # CONFIG_CRYPTO_MD5 is not set | ||
| 1073 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
| 1074 | # CONFIG_CRYPTO_SHA1 is not set | ||
| 1075 | # CONFIG_CRYPTO_SHA256 is not set | ||
| 1076 | # CONFIG_CRYPTO_SHA512 is not set | ||
| 1077 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1078 | # CONFIG_CRYPTO_WP512 is not set | ||
| 1079 | |||
| 1080 | # | ||
| 1081 | # Ciphers | ||
| 1082 | # | ||
| 1083 | # CONFIG_CRYPTO_AES is not set | ||
| 1084 | # CONFIG_CRYPTO_ANUBIS is not set | ||
| 1085 | # CONFIG_CRYPTO_ARC4 is not set | ||
| 1086 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
| 1087 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
| 1088 | # CONFIG_CRYPTO_CAST5 is not set | ||
| 1089 | # CONFIG_CRYPTO_CAST6 is not set | ||
| 1090 | # CONFIG_CRYPTO_DES is not set | ||
| 1091 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1092 | # CONFIG_CRYPTO_KHAZAD is not set | ||
| 1093 | # CONFIG_CRYPTO_SALSA20 is not set | ||
| 1094 | # CONFIG_CRYPTO_SEED is not set | ||
| 1095 | # CONFIG_CRYPTO_SERPENT is not set | ||
| 1096 | # CONFIG_CRYPTO_TEA is not set | ||
| 1097 | # CONFIG_CRYPTO_TWOFISH is not set | ||
| 1098 | |||
| 1099 | # | ||
| 1100 | # Compression | ||
| 1101 | # | ||
| 1102 | # CONFIG_CRYPTO_DEFLATE is not set | ||
| 1103 | # CONFIG_CRYPTO_LZO is not set | ||
| 1104 | CONFIG_CRYPTO_HW=y | ||
| 1105 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set | ||
| 1106 | # CONFIG_PPC_CLOCK is not set | ||
| 1107 | # CONFIG_VIRTUALIZATION is not set | ||
diff --git a/arch/powerpc/configs/85xx/tqm8548_defconfig b/arch/powerpc/configs/85xx/tqm8548_defconfig index 5d5b898767a3..b3b770be3cc9 100644 --- a/arch/powerpc/configs/85xx/tqm8548_defconfig +++ b/arch/powerpc/configs/85xx/tqm8548_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.26-rc4 | 3 | # Linux kernel version: 2.6.26-rc5 |
| 4 | # Tue Jun 3 14:39:30 2008 | 4 | # Thu Jun 26 14:40:02 2008 |
| 5 | # | 5 | # |
| 6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
| 7 | 7 | ||
| @@ -15,6 +15,7 @@ CONFIG_PPC_85xx=y | |||
| 15 | # CONFIG_44x is not set | 15 | # CONFIG_44x is not set |
| 16 | # CONFIG_E200 is not set | 16 | # CONFIG_E200 is not set |
| 17 | CONFIG_E500=y | 17 | CONFIG_E500=y |
| 18 | # CONFIG_PPC_E500MC is not set | ||
| 18 | CONFIG_BOOKE=y | 19 | CONFIG_BOOKE=y |
| 19 | CONFIG_FSL_BOOKE=y | 20 | CONFIG_FSL_BOOKE=y |
| 20 | CONFIG_FSL_EMB_PERFMON=y | 21 | CONFIG_FSL_EMB_PERFMON=y |
| @@ -470,6 +471,7 @@ CONFIG_MTD_UBI_BEB_RESERVE=1 | |||
| 470 | # | 471 | # |
| 471 | # CONFIG_MTD_UBI_DEBUG is not set | 472 | # CONFIG_MTD_UBI_DEBUG is not set |
| 472 | CONFIG_OF_DEVICE=y | 473 | CONFIG_OF_DEVICE=y |
| 474 | CONFIG_OF_I2C=y | ||
| 473 | # CONFIG_PARPORT is not set | 475 | # CONFIG_PARPORT is not set |
| 474 | CONFIG_BLK_DEV=y | 476 | CONFIG_BLK_DEV=y |
| 475 | # CONFIG_BLK_DEV_FD is not set | 477 | # CONFIG_BLK_DEV_FD is not set |
| @@ -734,31 +736,111 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
| 734 | # CONFIG_IPMI_HANDLER is not set | 736 | # CONFIG_IPMI_HANDLER is not set |
| 735 | # CONFIG_HW_RANDOM is not set | 737 | # CONFIG_HW_RANDOM is not set |
| 736 | # CONFIG_NVRAM is not set | 738 | # CONFIG_NVRAM is not set |
| 737 | CONFIG_GEN_RTC=y | ||
| 738 | # CONFIG_GEN_RTC_X is not set | ||
| 739 | # CONFIG_R3964 is not set | 739 | # CONFIG_R3964 is not set |
| 740 | # CONFIG_APPLICOM is not set | 740 | # CONFIG_APPLICOM is not set |
| 741 | # CONFIG_RAW_DRIVER is not set | 741 | # CONFIG_RAW_DRIVER is not set |
| 742 | # CONFIG_TCG_TPM is not set | 742 | # CONFIG_TCG_TPM is not set |
| 743 | CONFIG_DEVPORT=y | 743 | CONFIG_DEVPORT=y |
| 744 | # CONFIG_I2C is not set | 744 | CONFIG_I2C=y |
| 745 | CONFIG_I2C_BOARDINFO=y | ||
| 746 | CONFIG_I2C_CHARDEV=y | ||
| 747 | |||
| 748 | # | ||
| 749 | # I2C Hardware Bus support | ||
| 750 | # | ||
| 751 | # CONFIG_I2C_ALI1535 is not set | ||
| 752 | # CONFIG_I2C_ALI1563 is not set | ||
| 753 | # CONFIG_I2C_ALI15X3 is not set | ||
| 754 | # CONFIG_I2C_AMD756 is not set | ||
| 755 | # CONFIG_I2C_AMD8111 is not set | ||
| 756 | # CONFIG_I2C_I801 is not set | ||
| 757 | # CONFIG_I2C_I810 is not set | ||
| 758 | # CONFIG_I2C_PIIX4 is not set | ||
| 759 | CONFIG_I2C_MPC=y | ||
| 760 | # CONFIG_I2C_NFORCE2 is not set | ||
| 761 | # CONFIG_I2C_OCORES is not set | ||
| 762 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
| 763 | # CONFIG_I2C_PROSAVAGE is not set | ||
| 764 | # CONFIG_I2C_SAVAGE4 is not set | ||
| 765 | # CONFIG_I2C_SIMTEC is not set | ||
| 766 | # CONFIG_I2C_SIS5595 is not set | ||
| 767 | # CONFIG_I2C_SIS630 is not set | ||
| 768 | # CONFIG_I2C_SIS96X is not set | ||
| 769 | # CONFIG_I2C_TAOS_EVM is not set | ||
| 770 | # CONFIG_I2C_STUB is not set | ||
| 771 | # CONFIG_I2C_VIA is not set | ||
| 772 | # CONFIG_I2C_VIAPRO is not set | ||
| 773 | # CONFIG_I2C_VOODOO3 is not set | ||
| 774 | # CONFIG_I2C_PCA_PLATFORM is not set | ||
| 775 | |||
| 776 | # | ||
| 777 | # Miscellaneous I2C Chip support | ||
| 778 | # | ||
| 779 | # CONFIG_DS1682 is not set | ||
| 780 | # CONFIG_SENSORS_EEPROM is not set | ||
| 781 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 782 | # CONFIG_PCF8575 is not set | ||
| 783 | # CONFIG_SENSORS_PCF8591 is not set | ||
| 784 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 785 | # CONFIG_SENSORS_TSL2550 is not set | ||
| 786 | # CONFIG_I2C_DEBUG_CORE is not set | ||
| 787 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
| 788 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 789 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 745 | # CONFIG_SPI is not set | 790 | # CONFIG_SPI is not set |
| 746 | # CONFIG_W1 is not set | 791 | # CONFIG_W1 is not set |
| 747 | # CONFIG_POWER_SUPPLY is not set | 792 | # CONFIG_POWER_SUPPLY is not set |
| 748 | CONFIG_HWMON=y | 793 | CONFIG_HWMON=y |
| 749 | # CONFIG_HWMON_VID is not set | 794 | # CONFIG_HWMON_VID is not set |
| 795 | # CONFIG_SENSORS_AD7418 is not set | ||
| 796 | # CONFIG_SENSORS_ADM1021 is not set | ||
| 797 | # CONFIG_SENSORS_ADM1025 is not set | ||
| 798 | # CONFIG_SENSORS_ADM1026 is not set | ||
| 799 | # CONFIG_SENSORS_ADM1029 is not set | ||
| 800 | # CONFIG_SENSORS_ADM1031 is not set | ||
| 801 | # CONFIG_SENSORS_ADM9240 is not set | ||
| 802 | # CONFIG_SENSORS_ADT7470 is not set | ||
| 803 | # CONFIG_SENSORS_ADT7473 is not set | ||
| 804 | # CONFIG_SENSORS_ATXP1 is not set | ||
| 805 | # CONFIG_SENSORS_DS1621 is not set | ||
| 750 | # CONFIG_SENSORS_I5K_AMB is not set | 806 | # CONFIG_SENSORS_I5K_AMB is not set |
| 751 | # CONFIG_SENSORS_F71805F is not set | 807 | # CONFIG_SENSORS_F71805F is not set |
| 752 | # CONFIG_SENSORS_F71882FG is not set | 808 | # CONFIG_SENSORS_F71882FG is not set |
| 809 | # CONFIG_SENSORS_F75375S is not set | ||
| 810 | # CONFIG_SENSORS_GL518SM is not set | ||
| 811 | # CONFIG_SENSORS_GL520SM is not set | ||
| 753 | # CONFIG_SENSORS_IT87 is not set | 812 | # CONFIG_SENSORS_IT87 is not set |
| 813 | # CONFIG_SENSORS_LM63 is not set | ||
| 814 | CONFIG_SENSORS_LM75=y | ||
| 815 | # CONFIG_SENSORS_LM77 is not set | ||
| 816 | # CONFIG_SENSORS_LM78 is not set | ||
| 817 | # CONFIG_SENSORS_LM80 is not set | ||
| 818 | # CONFIG_SENSORS_LM83 is not set | ||
| 819 | # CONFIG_SENSORS_LM85 is not set | ||
| 820 | # CONFIG_SENSORS_LM87 is not set | ||
| 821 | # CONFIG_SENSORS_LM90 is not set | ||
| 822 | # CONFIG_SENSORS_LM92 is not set | ||
| 823 | # CONFIG_SENSORS_LM93 is not set | ||
| 824 | # CONFIG_SENSORS_MAX1619 is not set | ||
| 825 | # CONFIG_SENSORS_MAX6650 is not set | ||
| 754 | # CONFIG_SENSORS_PC87360 is not set | 826 | # CONFIG_SENSORS_PC87360 is not set |
| 755 | # CONFIG_SENSORS_PC87427 is not set | 827 | # CONFIG_SENSORS_PC87427 is not set |
| 756 | # CONFIG_SENSORS_SIS5595 is not set | 828 | # CONFIG_SENSORS_SIS5595 is not set |
| 829 | # CONFIG_SENSORS_DME1737 is not set | ||
| 757 | # CONFIG_SENSORS_SMSC47M1 is not set | 830 | # CONFIG_SENSORS_SMSC47M1 is not set |
| 831 | # CONFIG_SENSORS_SMSC47M192 is not set | ||
| 758 | # CONFIG_SENSORS_SMSC47B397 is not set | 832 | # CONFIG_SENSORS_SMSC47B397 is not set |
| 833 | # CONFIG_SENSORS_ADS7828 is not set | ||
| 834 | # CONFIG_SENSORS_THMC50 is not set | ||
| 759 | # CONFIG_SENSORS_VIA686A is not set | 835 | # CONFIG_SENSORS_VIA686A is not set |
| 760 | # CONFIG_SENSORS_VT1211 is not set | 836 | # CONFIG_SENSORS_VT1211 is not set |
| 761 | # CONFIG_SENSORS_VT8231 is not set | 837 | # CONFIG_SENSORS_VT8231 is not set |
| 838 | # CONFIG_SENSORS_W83781D is not set | ||
| 839 | # CONFIG_SENSORS_W83791D is not set | ||
| 840 | # CONFIG_SENSORS_W83792D is not set | ||
| 841 | # CONFIG_SENSORS_W83793 is not set | ||
| 842 | # CONFIG_SENSORS_W83L785TS is not set | ||
| 843 | # CONFIG_SENSORS_W83L786NG is not set | ||
| 762 | # CONFIG_SENSORS_W83627HF is not set | 844 | # CONFIG_SENSORS_W83627HF is not set |
| 763 | # CONFIG_SENSORS_W83627EHF is not set | 845 | # CONFIG_SENSORS_W83627EHF is not set |
| 764 | # CONFIG_HWMON_DEBUG_CHIP is not set | 846 | # CONFIG_HWMON_DEBUG_CHIP is not set |
| @@ -834,7 +916,56 @@ CONFIG_USB_ARCH_HAS_EHCI=y | |||
| 834 | # CONFIG_ACCESSIBILITY is not set | 916 | # CONFIG_ACCESSIBILITY is not set |
| 835 | # CONFIG_INFINIBAND is not set | 917 | # CONFIG_INFINIBAND is not set |
| 836 | # CONFIG_EDAC is not set | 918 | # CONFIG_EDAC is not set |
| 837 | # CONFIG_RTC_CLASS is not set | 919 | CONFIG_RTC_LIB=y |
| 920 | CONFIG_RTC_CLASS=y | ||
| 921 | CONFIG_RTC_HCTOSYS=y | ||
| 922 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
| 923 | # CONFIG_RTC_DEBUG is not set | ||
| 924 | |||
| 925 | # | ||
| 926 | # RTC interfaces | ||
| 927 | # | ||
| 928 | CONFIG_RTC_INTF_SYSFS=y | ||
| 929 | CONFIG_RTC_INTF_PROC=y | ||
| 930 | CONFIG_RTC_INTF_DEV=y | ||
| 931 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
| 932 | # CONFIG_RTC_DRV_TEST is not set | ||
| 933 | |||
| 934 | # | ||
| 935 | # I2C RTC drivers | ||
| 936 | # | ||
| 937 | CONFIG_RTC_DRV_DS1307=y | ||
| 938 | # CONFIG_RTC_DRV_DS1374 is not set | ||
| 939 | # CONFIG_RTC_DRV_DS1672 is not set | ||
| 940 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
| 941 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
| 942 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
| 943 | # CONFIG_RTC_DRV_X1205 is not set | ||
| 944 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
| 945 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
| 946 | # CONFIG_RTC_DRV_M41T80 is not set | ||
| 947 | # CONFIG_RTC_DRV_S35390A is not set | ||
| 948 | |||
| 949 | # | ||
| 950 | # SPI RTC drivers | ||
| 951 | # | ||
| 952 | |||
| 953 | # | ||
| 954 | # Platform RTC drivers | ||
| 955 | # | ||
| 956 | # CONFIG_RTC_DRV_CMOS is not set | ||
| 957 | # CONFIG_RTC_DRV_DS1511 is not set | ||
| 958 | # CONFIG_RTC_DRV_DS1553 is not set | ||
| 959 | # CONFIG_RTC_DRV_DS1742 is not set | ||
| 960 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
| 961 | # CONFIG_RTC_DRV_M48T86 is not set | ||
| 962 | # CONFIG_RTC_DRV_M48T59 is not set | ||
| 963 | # CONFIG_RTC_DRV_V3020 is not set | ||
| 964 | |||
| 965 | # | ||
| 966 | # on-CPU RTC drivers | ||
| 967 | # | ||
| 968 | # CONFIG_RTC_DRV_PPC is not set | ||
| 838 | # CONFIG_DMADEVICES is not set | 969 | # CONFIG_DMADEVICES is not set |
| 839 | # CONFIG_UIO is not set | 970 | # CONFIG_UIO is not set |
| 840 | 971 | ||
diff --git a/arch/powerpc/configs/mpc8536_ds_defconfig b/arch/powerpc/configs/mpc8536_ds_defconfig new file mode 100644 index 000000000000..f1e2931de5da --- /dev/null +++ b/arch/powerpc/configs/mpc8536_ds_defconfig | |||
| @@ -0,0 +1,1637 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.26-rc8 | ||
| 4 | # Wed Jul 2 01:34:26 2008 | ||
| 5 | # | ||
| 6 | # CONFIG_PPC64 is not set | ||
| 7 | |||
| 8 | # | ||
| 9 | # Processor support | ||
| 10 | # | ||
| 11 | # CONFIG_6xx is not set | ||
| 12 | CONFIG_PPC_85xx=y | ||
| 13 | # CONFIG_PPC_8xx is not set | ||
| 14 | # CONFIG_40x is not set | ||
| 15 | # CONFIG_44x is not set | ||
| 16 | # CONFIG_E200 is not set | ||
| 17 | CONFIG_E500=y | ||
| 18 | # CONFIG_PPC_E500MC is not set | ||
| 19 | CONFIG_BOOKE=y | ||
| 20 | CONFIG_FSL_BOOKE=y | ||
| 21 | CONFIG_FSL_EMB_PERFMON=y | ||
| 22 | # CONFIG_PHYS_64BIT is not set | ||
| 23 | CONFIG_SPE=y | ||
| 24 | # CONFIG_PPC_MM_SLICES is not set | ||
| 25 | CONFIG_PPC32=y | ||
| 26 | CONFIG_WORD_SIZE=32 | ||
| 27 | CONFIG_PPC_MERGE=y | ||
| 28 | CONFIG_MMU=y | ||
| 29 | CONFIG_GENERIC_CMOS_UPDATE=y | ||
| 30 | CONFIG_GENERIC_TIME=y | ||
| 31 | CONFIG_GENERIC_TIME_VSYSCALL=y | ||
| 32 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 33 | CONFIG_GENERIC_HARDIRQS=y | ||
| 34 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set | ||
| 35 | CONFIG_IRQ_PER_CPU=y | ||
| 36 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 37 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 38 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | ||
| 39 | CONFIG_ARCH_HAS_ILOG2_U32=y | ||
| 40 | CONFIG_GENERIC_HWEIGHT=y | ||
| 41 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 42 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
| 43 | # CONFIG_ARCH_NO_VIRT_TO_BUS is not set | ||
| 44 | CONFIG_PPC=y | ||
| 45 | CONFIG_EARLY_PRINTK=y | ||
| 46 | CONFIG_GENERIC_NVRAM=y | ||
| 47 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | ||
| 48 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y | ||
| 49 | CONFIG_PPC_OF=y | ||
| 50 | CONFIG_OF=y | ||
| 51 | CONFIG_PPC_UDBG_16550=y | ||
| 52 | # CONFIG_GENERIC_TBSYNC is not set | ||
| 53 | CONFIG_AUDIT_ARCH=y | ||
| 54 | CONFIG_GENERIC_BUG=y | ||
| 55 | CONFIG_DEFAULT_UIMAGE=y | ||
| 56 | # CONFIG_PPC_DCR_NATIVE is not set | ||
| 57 | # CONFIG_PPC_DCR_MMIO is not set | ||
| 58 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 59 | |||
| 60 | # | ||
| 61 | # General setup | ||
| 62 | # | ||
| 63 | CONFIG_EXPERIMENTAL=y | ||
| 64 | CONFIG_BROKEN_ON_SMP=y | ||
| 65 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 66 | CONFIG_LOCALVERSION="" | ||
| 67 | CONFIG_LOCALVERSION_AUTO=y | ||
| 68 | CONFIG_SWAP=y | ||
| 69 | CONFIG_SYSVIPC=y | ||
| 70 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 71 | CONFIG_POSIX_MQUEUE=y | ||
| 72 | CONFIG_BSD_PROCESS_ACCT=y | ||
| 73 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | ||
| 74 | # CONFIG_TASKSTATS is not set | ||
| 75 | CONFIG_AUDIT=y | ||
| 76 | # CONFIG_AUDITSYSCALL is not set | ||
| 77 | CONFIG_IKCONFIG=y | ||
| 78 | CONFIG_IKCONFIG_PROC=y | ||
| 79 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 80 | # CONFIG_CGROUPS is not set | ||
| 81 | CONFIG_GROUP_SCHED=y | ||
| 82 | # CONFIG_FAIR_GROUP_SCHED is not set | ||
| 83 | # CONFIG_RT_GROUP_SCHED is not set | ||
| 84 | CONFIG_USER_SCHED=y | ||
| 85 | # CONFIG_CGROUP_SCHED is not set | ||
| 86 | CONFIG_SYSFS_DEPRECATED=y | ||
| 87 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 88 | # CONFIG_RELAY is not set | ||
| 89 | # CONFIG_NAMESPACES is not set | ||
| 90 | CONFIG_BLK_DEV_INITRD=y | ||
| 91 | CONFIG_INITRAMFS_SOURCE="" | ||
| 92 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
| 93 | CONFIG_SYSCTL=y | ||
| 94 | CONFIG_EMBEDDED=y | ||
| 95 | CONFIG_SYSCTL_SYSCALL=y | ||
| 96 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 97 | CONFIG_KALLSYMS=y | ||
| 98 | CONFIG_KALLSYMS_ALL=y | ||
| 99 | CONFIG_KALLSYMS_EXTRA_PASS=y | ||
| 100 | CONFIG_HOTPLUG=y | ||
| 101 | CONFIG_PRINTK=y | ||
| 102 | CONFIG_BUG=y | ||
| 103 | CONFIG_ELF_CORE=y | ||
| 104 | CONFIG_COMPAT_BRK=y | ||
| 105 | CONFIG_BASE_FULL=y | ||
| 106 | CONFIG_FUTEX=y | ||
| 107 | CONFIG_ANON_INODES=y | ||
| 108 | CONFIG_EPOLL=y | ||
| 109 | CONFIG_SIGNALFD=y | ||
| 110 | CONFIG_TIMERFD=y | ||
| 111 | CONFIG_EVENTFD=y | ||
| 112 | CONFIG_SHMEM=y | ||
| 113 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 114 | CONFIG_SLUB_DEBUG=y | ||
| 115 | # CONFIG_SLAB is not set | ||
| 116 | CONFIG_SLUB=y | ||
| 117 | # CONFIG_SLOB is not set | ||
| 118 | # CONFIG_PROFILING is not set | ||
| 119 | # CONFIG_MARKERS is not set | ||
| 120 | CONFIG_HAVE_OPROFILE=y | ||
| 121 | # CONFIG_KPROBES is not set | ||
| 122 | CONFIG_HAVE_KPROBES=y | ||
| 123 | CONFIG_HAVE_KRETPROBES=y | ||
| 124 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
| 125 | CONFIG_PROC_PAGE_MONITOR=y | ||
| 126 | CONFIG_SLABINFO=y | ||
| 127 | CONFIG_RT_MUTEXES=y | ||
| 128 | # CONFIG_TINY_SHMEM is not set | ||
| 129 | CONFIG_BASE_SMALL=0 | ||
| 130 | CONFIG_MODULES=y | ||
| 131 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
| 132 | CONFIG_MODULE_UNLOAD=y | ||
| 133 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
| 134 | CONFIG_MODVERSIONS=y | ||
| 135 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 136 | CONFIG_KMOD=y | ||
| 137 | CONFIG_BLOCK=y | ||
| 138 | CONFIG_LBD=y | ||
| 139 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 140 | # CONFIG_LSF is not set | ||
| 141 | # CONFIG_BLK_DEV_BSG is not set | ||
| 142 | |||
| 143 | # | ||
| 144 | # IO Schedulers | ||
| 145 | # | ||
| 146 | CONFIG_IOSCHED_NOOP=y | ||
| 147 | CONFIG_IOSCHED_AS=y | ||
| 148 | CONFIG_IOSCHED_DEADLINE=y | ||
| 149 | CONFIG_IOSCHED_CFQ=y | ||
| 150 | # CONFIG_DEFAULT_AS is not set | ||
| 151 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 152 | CONFIG_DEFAULT_CFQ=y | ||
| 153 | # CONFIG_DEFAULT_NOOP is not set | ||
| 154 | CONFIG_DEFAULT_IOSCHED="cfq" | ||
| 155 | CONFIG_CLASSIC_RCU=y | ||
| 156 | |||
| 157 | # | ||
| 158 | # Platform support | ||
| 159 | # | ||
| 160 | # CONFIG_PPC_MPC512x is not set | ||
| 161 | # CONFIG_PPC_MPC5121 is not set | ||
| 162 | # CONFIG_PPC_CELL is not set | ||
| 163 | # CONFIG_PPC_CELL_NATIVE is not set | ||
| 164 | # CONFIG_PQ2ADS is not set | ||
| 165 | CONFIG_MPC85xx=y | ||
| 166 | # CONFIG_MPC8540_ADS is not set | ||
| 167 | # CONFIG_MPC8560_ADS is not set | ||
| 168 | # CONFIG_MPC85xx_CDS is not set | ||
| 169 | # CONFIG_MPC85xx_MDS is not set | ||
| 170 | CONFIG_MPC8536_DS=y | ||
| 171 | # CONFIG_MPC85xx_DS is not set | ||
| 172 | # CONFIG_KSI8560 is not set | ||
| 173 | # CONFIG_STX_GP3 is not set | ||
| 174 | # CONFIG_TQM8540 is not set | ||
| 175 | # CONFIG_TQM8541 is not set | ||
| 176 | # CONFIG_TQM8548 is not set | ||
| 177 | # CONFIG_TQM8555 is not set | ||
| 178 | # CONFIG_TQM8560 is not set | ||
| 179 | # CONFIG_SBC8548 is not set | ||
| 180 | # CONFIG_SBC8560 is not set | ||
| 181 | # CONFIG_IPIC is not set | ||
| 182 | CONFIG_MPIC=y | ||
| 183 | # CONFIG_MPIC_WEIRD is not set | ||
| 184 | # CONFIG_PPC_I8259 is not set | ||
| 185 | # CONFIG_PPC_RTAS is not set | ||
| 186 | # CONFIG_MMIO_NVRAM is not set | ||
| 187 | # CONFIG_PPC_MPC106 is not set | ||
| 188 | # CONFIG_PPC_970_NAP is not set | ||
| 189 | # CONFIG_PPC_INDIRECT_IO is not set | ||
| 190 | # CONFIG_GENERIC_IOMAP is not set | ||
| 191 | # CONFIG_CPU_FREQ is not set | ||
| 192 | # CONFIG_CPM2 is not set | ||
| 193 | # CONFIG_FSL_ULI1575 is not set | ||
| 194 | |||
| 195 | # | ||
| 196 | # Kernel options | ||
| 197 | # | ||
| 198 | CONFIG_HIGHMEM=y | ||
| 199 | CONFIG_TICK_ONESHOT=y | ||
| 200 | CONFIG_NO_HZ=y | ||
| 201 | CONFIG_HIGH_RES_TIMERS=y | ||
| 202 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 203 | # CONFIG_HZ_100 is not set | ||
| 204 | CONFIG_HZ_250=y | ||
| 205 | # CONFIG_HZ_300 is not set | ||
| 206 | # CONFIG_HZ_1000 is not set | ||
| 207 | CONFIG_HZ=250 | ||
| 208 | # CONFIG_SCHED_HRTICK is not set | ||
| 209 | CONFIG_PREEMPT_NONE=y | ||
| 210 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
| 211 | # CONFIG_PREEMPT is not set | ||
| 212 | CONFIG_BINFMT_ELF=y | ||
| 213 | CONFIG_BINFMT_MISC=m | ||
| 214 | CONFIG_MATH_EMULATION=y | ||
| 215 | # CONFIG_IOMMU_HELPER is not set | ||
| 216 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
| 217 | CONFIG_ARCH_HAS_WALK_MEMORY=y | ||
| 218 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y | ||
| 219 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
| 220 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
| 221 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 222 | CONFIG_FLATMEM_MANUAL=y | ||
| 223 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 224 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 225 | CONFIG_FLATMEM=y | ||
| 226 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 227 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 228 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 229 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
| 230 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
| 231 | # CONFIG_RESOURCES_64BIT is not set | ||
| 232 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 233 | CONFIG_BOUNCE=y | ||
| 234 | CONFIG_VIRT_TO_BUS=y | ||
| 235 | CONFIG_FORCE_MAX_ZONEORDER=11 | ||
| 236 | CONFIG_PROC_DEVICETREE=y | ||
| 237 | # CONFIG_CMDLINE_BOOL is not set | ||
| 238 | # CONFIG_PM is not set | ||
| 239 | CONFIG_SECCOMP=y | ||
| 240 | CONFIG_ISA_DMA_API=y | ||
| 241 | |||
| 242 | # | ||
| 243 | # Bus options | ||
| 244 | # | ||
| 245 | CONFIG_ZONE_DMA=y | ||
| 246 | CONFIG_PPC_INDIRECT_PCI=y | ||
| 247 | CONFIG_FSL_SOC=y | ||
| 248 | CONFIG_FSL_PCI=y | ||
| 249 | CONFIG_PCI=y | ||
| 250 | CONFIG_PCI_DOMAINS=y | ||
| 251 | CONFIG_PCI_SYSCALL=y | ||
| 252 | # CONFIG_PCIEPORTBUS is not set | ||
| 253 | CONFIG_ARCH_SUPPORTS_MSI=y | ||
| 254 | # CONFIG_PCI_MSI is not set | ||
| 255 | CONFIG_PCI_LEGACY=y | ||
| 256 | # CONFIG_PCI_DEBUG is not set | ||
| 257 | # CONFIG_PCCARD is not set | ||
| 258 | # CONFIG_HOTPLUG_PCI is not set | ||
| 259 | # CONFIG_HAS_RAPIDIO is not set | ||
| 260 | |||
| 261 | # | ||
| 262 | # Advanced setup | ||
| 263 | # | ||
| 264 | # CONFIG_ADVANCED_OPTIONS is not set | ||
| 265 | |||
| 266 | # | ||
| 267 | # Default settings for advanced configuration options are used | ||
| 268 | # | ||
| 269 | CONFIG_LOWMEM_SIZE=0x30000000 | ||
| 270 | CONFIG_PAGE_OFFSET=0xc0000000 | ||
| 271 | CONFIG_KERNEL_START=0xc0000000 | ||
| 272 | CONFIG_PHYSICAL_START=0x00000000 | ||
| 273 | CONFIG_PHYSICAL_ALIGN=0x10000000 | ||
| 274 | CONFIG_TASK_SIZE=0xc0000000 | ||
| 275 | |||
| 276 | # | ||
| 277 | # Networking | ||
| 278 | # | ||
| 279 | CONFIG_NET=y | ||
| 280 | |||
| 281 | # | ||
| 282 | # Networking options | ||
| 283 | # | ||
| 284 | CONFIG_PACKET=y | ||
| 285 | # CONFIG_PACKET_MMAP is not set | ||
| 286 | CONFIG_UNIX=y | ||
| 287 | CONFIG_XFRM=y | ||
| 288 | CONFIG_XFRM_USER=y | ||
| 289 | # CONFIG_XFRM_SUB_POLICY is not set | ||
| 290 | # CONFIG_XFRM_MIGRATE is not set | ||
| 291 | # CONFIG_XFRM_STATISTICS is not set | ||
| 292 | CONFIG_NET_KEY=m | ||
| 293 | # CONFIG_NET_KEY_MIGRATE is not set | ||
| 294 | CONFIG_INET=y | ||
| 295 | CONFIG_IP_MULTICAST=y | ||
| 296 | CONFIG_IP_ADVANCED_ROUTER=y | ||
| 297 | CONFIG_ASK_IP_FIB_HASH=y | ||
| 298 | # CONFIG_IP_FIB_TRIE is not set | ||
| 299 | CONFIG_IP_FIB_HASH=y | ||
| 300 | CONFIG_IP_MULTIPLE_TABLES=y | ||
| 301 | CONFIG_IP_ROUTE_MULTIPATH=y | ||
| 302 | CONFIG_IP_ROUTE_VERBOSE=y | ||
| 303 | CONFIG_IP_PNP=y | ||
| 304 | CONFIG_IP_PNP_DHCP=y | ||
| 305 | CONFIG_IP_PNP_BOOTP=y | ||
| 306 | CONFIG_IP_PNP_RARP=y | ||
| 307 | CONFIG_NET_IPIP=y | ||
| 308 | CONFIG_NET_IPGRE=y | ||
| 309 | CONFIG_NET_IPGRE_BROADCAST=y | ||
| 310 | CONFIG_IP_MROUTE=y | ||
| 311 | CONFIG_IP_PIMSM_V1=y | ||
| 312 | CONFIG_IP_PIMSM_V2=y | ||
| 313 | CONFIG_ARPD=y | ||
| 314 | # CONFIG_SYN_COOKIES is not set | ||
| 315 | # CONFIG_INET_AH is not set | ||
| 316 | # CONFIG_INET_ESP is not set | ||
| 317 | # CONFIG_INET_IPCOMP is not set | ||
| 318 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 319 | CONFIG_INET_TUNNEL=y | ||
| 320 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
| 321 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
| 322 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
| 323 | # CONFIG_INET_LRO is not set | ||
| 324 | CONFIG_INET_DIAG=y | ||
| 325 | CONFIG_INET_TCP_DIAG=y | ||
| 326 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 327 | CONFIG_TCP_CONG_CUBIC=y | ||
| 328 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 329 | # CONFIG_TCP_MD5SIG is not set | ||
| 330 | CONFIG_IPV6=y | ||
| 331 | # CONFIG_IPV6_PRIVACY is not set | ||
| 332 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
| 333 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set | ||
| 334 | # CONFIG_INET6_AH is not set | ||
| 335 | # CONFIG_INET6_ESP is not set | ||
| 336 | # CONFIG_INET6_IPCOMP is not set | ||
| 337 | # CONFIG_IPV6_MIP6 is not set | ||
| 338 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
| 339 | # CONFIG_INET6_TUNNEL is not set | ||
| 340 | CONFIG_INET6_XFRM_MODE_TRANSPORT=y | ||
| 341 | CONFIG_INET6_XFRM_MODE_TUNNEL=y | ||
| 342 | CONFIG_INET6_XFRM_MODE_BEET=y | ||
| 343 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
| 344 | CONFIG_IPV6_SIT=y | ||
| 345 | CONFIG_IPV6_NDISC_NODETYPE=y | ||
| 346 | # CONFIG_IPV6_TUNNEL is not set | ||
| 347 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
| 348 | # CONFIG_IPV6_MROUTE is not set | ||
| 349 | # CONFIG_NETWORK_SECMARK is not set | ||
| 350 | # CONFIG_NETFILTER is not set | ||
| 351 | # CONFIG_IP_DCCP is not set | ||
| 352 | CONFIG_IP_SCTP=m | ||
| 353 | # CONFIG_SCTP_DBG_MSG is not set | ||
| 354 | # CONFIG_SCTP_DBG_OBJCNT is not set | ||
| 355 | # CONFIG_SCTP_HMAC_NONE is not set | ||
| 356 | # CONFIG_SCTP_HMAC_SHA1 is not set | ||
| 357 | CONFIG_SCTP_HMAC_MD5=y | ||
| 358 | # CONFIG_TIPC is not set | ||
| 359 | # CONFIG_ATM is not set | ||
| 360 | # CONFIG_BRIDGE is not set | ||
| 361 | # CONFIG_VLAN_8021Q is not set | ||
| 362 | # CONFIG_DECNET is not set | ||
| 363 | # CONFIG_LLC2 is not set | ||
| 364 | # CONFIG_IPX is not set | ||
| 365 | # CONFIG_ATALK is not set | ||
| 366 | # CONFIG_X25 is not set | ||
| 367 | # CONFIG_LAPB is not set | ||
| 368 | # CONFIG_ECONET is not set | ||
| 369 | # CONFIG_WAN_ROUTER is not set | ||
| 370 | # CONFIG_NET_SCHED is not set | ||
| 371 | |||
| 372 | # | ||
| 373 | # Network testing | ||
| 374 | # | ||
| 375 | # CONFIG_NET_PKTGEN is not set | ||
| 376 | # CONFIG_HAMRADIO is not set | ||
| 377 | # CONFIG_CAN is not set | ||
| 378 | # CONFIG_IRDA is not set | ||
| 379 | # CONFIG_BT is not set | ||
| 380 | # CONFIG_AF_RXRPC is not set | ||
| 381 | CONFIG_FIB_RULES=y | ||
| 382 | |||
| 383 | # | ||
| 384 | # Wireless | ||
| 385 | # | ||
| 386 | # CONFIG_CFG80211 is not set | ||
| 387 | # CONFIG_WIRELESS_EXT is not set | ||
| 388 | # CONFIG_MAC80211 is not set | ||
| 389 | # CONFIG_IEEE80211 is not set | ||
| 390 | # CONFIG_RFKILL is not set | ||
| 391 | # CONFIG_NET_9P is not set | ||
| 392 | |||
| 393 | # | ||
| 394 | # Device Drivers | ||
| 395 | # | ||
| 396 | |||
| 397 | # | ||
| 398 | # Generic Driver Options | ||
| 399 | # | ||
| 400 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 401 | CONFIG_STANDALONE=y | ||
| 402 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 403 | CONFIG_FW_LOADER=y | ||
| 404 | # CONFIG_DEBUG_DRIVER is not set | ||
| 405 | # CONFIG_DEBUG_DEVRES is not set | ||
| 406 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 407 | # CONFIG_CONNECTOR is not set | ||
| 408 | # CONFIG_MTD is not set | ||
| 409 | CONFIG_OF_DEVICE=y | ||
| 410 | CONFIG_OF_I2C=y | ||
| 411 | # CONFIG_PARPORT is not set | ||
| 412 | CONFIG_BLK_DEV=y | ||
| 413 | # CONFIG_BLK_DEV_FD is not set | ||
| 414 | # CONFIG_BLK_CPQ_DA is not set | ||
| 415 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
| 416 | # CONFIG_BLK_DEV_DAC960 is not set | ||
| 417 | # CONFIG_BLK_DEV_UMEM is not set | ||
| 418 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 419 | CONFIG_BLK_DEV_LOOP=y | ||
| 420 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
| 421 | CONFIG_BLK_DEV_NBD=y | ||
| 422 | # CONFIG_BLK_DEV_SX8 is not set | ||
| 423 | # CONFIG_BLK_DEV_UB is not set | ||
| 424 | CONFIG_BLK_DEV_RAM=y | ||
| 425 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
| 426 | CONFIG_BLK_DEV_RAM_SIZE=524288 | ||
| 427 | # CONFIG_BLK_DEV_XIP is not set | ||
| 428 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 429 | # CONFIG_ATA_OVER_ETH is not set | ||
| 430 | CONFIG_MISC_DEVICES=y | ||
| 431 | # CONFIG_PHANTOM is not set | ||
| 432 | # CONFIG_EEPROM_93CX6 is not set | ||
| 433 | # CONFIG_SGI_IOC4 is not set | ||
| 434 | # CONFIG_TIFM_CORE is not set | ||
| 435 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
| 436 | CONFIG_HAVE_IDE=y | ||
| 437 | # CONFIG_IDE is not set | ||
| 438 | |||
| 439 | # | ||
| 440 | # SCSI device support | ||
| 441 | # | ||
| 442 | # CONFIG_RAID_ATTRS is not set | ||
| 443 | CONFIG_SCSI=y | ||
| 444 | CONFIG_SCSI_DMA=y | ||
| 445 | # CONFIG_SCSI_TGT is not set | ||
| 446 | # CONFIG_SCSI_NETLINK is not set | ||
| 447 | CONFIG_SCSI_PROC_FS=y | ||
| 448 | |||
| 449 | # | ||
| 450 | # SCSI support type (disk, tape, CD-ROM) | ||
| 451 | # | ||
| 452 | CONFIG_BLK_DEV_SD=y | ||
| 453 | CONFIG_CHR_DEV_ST=y | ||
| 454 | # CONFIG_CHR_DEV_OSST is not set | ||
| 455 | CONFIG_BLK_DEV_SR=y | ||
| 456 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
| 457 | CONFIG_CHR_DEV_SG=y | ||
| 458 | # CONFIG_CHR_DEV_SCH is not set | ||
| 459 | |||
| 460 | # | ||
| 461 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 462 | # | ||
| 463 | CONFIG_SCSI_MULTI_LUN=y | ||
| 464 | # CONFIG_SCSI_CONSTANTS is not set | ||
| 465 | CONFIG_SCSI_LOGGING=y | ||
| 466 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
| 467 | CONFIG_SCSI_WAIT_SCAN=m | ||
| 468 | |||
| 469 | # | ||
| 470 | # SCSI Transports | ||
| 471 | # | ||
| 472 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
| 473 | # CONFIG_SCSI_FC_ATTRS is not set | ||
| 474 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
| 475 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
| 476 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
| 477 | CONFIG_SCSI_LOWLEVEL=y | ||
| 478 | # CONFIG_ISCSI_TCP is not set | ||
| 479 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | ||
| 480 | # CONFIG_SCSI_3W_9XXX is not set | ||
| 481 | # CONFIG_SCSI_ACARD is not set | ||
| 482 | # CONFIG_SCSI_AACRAID is not set | ||
| 483 | # CONFIG_SCSI_AIC7XXX is not set | ||
| 484 | # CONFIG_SCSI_AIC7XXX_OLD is not set | ||
| 485 | # CONFIG_SCSI_AIC79XX is not set | ||
| 486 | # CONFIG_SCSI_AIC94XX is not set | ||
| 487 | # CONFIG_SCSI_DPT_I2O is not set | ||
| 488 | # CONFIG_SCSI_ADVANSYS is not set | ||
| 489 | # CONFIG_SCSI_ARCMSR is not set | ||
| 490 | # CONFIG_MEGARAID_NEWGEN is not set | ||
| 491 | # CONFIG_MEGARAID_LEGACY is not set | ||
| 492 | # CONFIG_MEGARAID_SAS is not set | ||
| 493 | # CONFIG_SCSI_HPTIOP is not set | ||
| 494 | # CONFIG_SCSI_BUSLOGIC is not set | ||
| 495 | # CONFIG_SCSI_DMX3191D is not set | ||
| 496 | # CONFIG_SCSI_EATA is not set | ||
| 497 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
| 498 | # CONFIG_SCSI_GDTH is not set | ||
| 499 | # CONFIG_SCSI_IPS is not set | ||
| 500 | # CONFIG_SCSI_INITIO is not set | ||
| 501 | # CONFIG_SCSI_INIA100 is not set | ||
| 502 | # CONFIG_SCSI_MVSAS is not set | ||
| 503 | # CONFIG_SCSI_STEX is not set | ||
| 504 | # CONFIG_SCSI_SYM53C8XX_2 is not set | ||
| 505 | # CONFIG_SCSI_IPR is not set | ||
| 506 | # CONFIG_SCSI_QLOGIC_1280 is not set | ||
| 507 | # CONFIG_SCSI_QLA_FC is not set | ||
| 508 | # CONFIG_SCSI_QLA_ISCSI is not set | ||
| 509 | # CONFIG_SCSI_LPFC is not set | ||
| 510 | # CONFIG_SCSI_DC395x is not set | ||
| 511 | # CONFIG_SCSI_DC390T is not set | ||
| 512 | # CONFIG_SCSI_NSP32 is not set | ||
| 513 | # CONFIG_SCSI_DEBUG is not set | ||
| 514 | # CONFIG_SCSI_SRP is not set | ||
| 515 | CONFIG_ATA=y | ||
| 516 | # CONFIG_ATA_NONSTANDARD is not set | ||
| 517 | CONFIG_SATA_PMP=y | ||
| 518 | # CONFIG_SATA_AHCI is not set | ||
| 519 | CONFIG_SATA_SIL24=y | ||
| 520 | CONFIG_SATA_FSL=y | ||
| 521 | CONFIG_ATA_SFF=y | ||
| 522 | # CONFIG_SATA_SVW is not set | ||
| 523 | # CONFIG_ATA_PIIX is not set | ||
| 524 | # CONFIG_SATA_MV is not set | ||
| 525 | # CONFIG_SATA_NV is not set | ||
| 526 | # CONFIG_PDC_ADMA is not set | ||
| 527 | # CONFIG_SATA_QSTOR is not set | ||
| 528 | # CONFIG_SATA_PROMISE is not set | ||
| 529 | # CONFIG_SATA_SX4 is not set | ||
| 530 | CONFIG_SATA_SIL=y | ||
| 531 | # CONFIG_SATA_SIS is not set | ||
| 532 | # CONFIG_SATA_ULI is not set | ||
| 533 | # CONFIG_SATA_VIA is not set | ||
| 534 | # CONFIG_SATA_VITESSE is not set | ||
| 535 | # CONFIG_SATA_INIC162X is not set | ||
| 536 | # CONFIG_PATA_ALI is not set | ||
| 537 | # CONFIG_PATA_AMD is not set | ||
| 538 | # CONFIG_PATA_ARTOP is not set | ||
| 539 | # CONFIG_PATA_ATIIXP is not set | ||
| 540 | # CONFIG_PATA_CMD640_PCI is not set | ||
| 541 | # CONFIG_PATA_CMD64X is not set | ||
| 542 | # CONFIG_PATA_CS5520 is not set | ||
| 543 | # CONFIG_PATA_CS5530 is not set | ||
| 544 | # CONFIG_PATA_CYPRESS is not set | ||
| 545 | # CONFIG_PATA_EFAR is not set | ||
| 546 | # CONFIG_ATA_GENERIC is not set | ||
| 547 | # CONFIG_PATA_HPT366 is not set | ||
| 548 | # CONFIG_PATA_HPT37X is not set | ||
| 549 | # CONFIG_PATA_HPT3X2N is not set | ||
| 550 | # CONFIG_PATA_HPT3X3 is not set | ||
| 551 | # CONFIG_PATA_IT821X is not set | ||
| 552 | # CONFIG_PATA_IT8213 is not set | ||
| 553 | # CONFIG_PATA_JMICRON is not set | ||
| 554 | # CONFIG_PATA_TRIFLEX is not set | ||
| 555 | # CONFIG_PATA_MARVELL is not set | ||
| 556 | # CONFIG_PATA_MPIIX is not set | ||
| 557 | # CONFIG_PATA_OLDPIIX is not set | ||
| 558 | # CONFIG_PATA_NETCELL is not set | ||
| 559 | # CONFIG_PATA_NINJA32 is not set | ||
| 560 | # CONFIG_PATA_NS87410 is not set | ||
| 561 | # CONFIG_PATA_NS87415 is not set | ||
| 562 | # CONFIG_PATA_OPTI is not set | ||
| 563 | # CONFIG_PATA_OPTIDMA is not set | ||
| 564 | # CONFIG_PATA_PDC_OLD is not set | ||
| 565 | # CONFIG_PATA_RADISYS is not set | ||
| 566 | # CONFIG_PATA_RZ1000 is not set | ||
| 567 | # CONFIG_PATA_SC1200 is not set | ||
| 568 | # CONFIG_PATA_SERVERWORKS is not set | ||
| 569 | # CONFIG_PATA_PDC2027X is not set | ||
| 570 | # CONFIG_PATA_SIL680 is not set | ||
| 571 | # CONFIG_PATA_SIS is not set | ||
| 572 | # CONFIG_PATA_VIA is not set | ||
| 573 | # CONFIG_PATA_WINBOND is not set | ||
| 574 | # CONFIG_PATA_PLATFORM is not set | ||
| 575 | # CONFIG_PATA_SCH is not set | ||
| 576 | # CONFIG_MD is not set | ||
| 577 | # CONFIG_FUSION is not set | ||
| 578 | |||
| 579 | # | ||
| 580 | # IEEE 1394 (FireWire) support | ||
| 581 | # | ||
| 582 | |||
| 583 | # | ||
| 584 | # Enable only one of the two stacks, unless you know what you are doing | ||
| 585 | # | ||
| 586 | # CONFIG_FIREWIRE is not set | ||
| 587 | # CONFIG_IEEE1394 is not set | ||
| 588 | # CONFIG_I2O is not set | ||
| 589 | # CONFIG_MACINTOSH_DRIVERS is not set | ||
| 590 | CONFIG_NETDEVICES=y | ||
| 591 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
| 592 | CONFIG_DUMMY=y | ||
| 593 | # CONFIG_BONDING is not set | ||
| 594 | # CONFIG_MACVLAN is not set | ||
| 595 | # CONFIG_EQUALIZER is not set | ||
| 596 | # CONFIG_TUN is not set | ||
| 597 | # CONFIG_VETH is not set | ||
| 598 | # CONFIG_ARCNET is not set | ||
| 599 | CONFIG_PHYLIB=y | ||
| 600 | |||
| 601 | # | ||
| 602 | # MII PHY device drivers | ||
| 603 | # | ||
| 604 | # CONFIG_MARVELL_PHY is not set | ||
| 605 | # CONFIG_DAVICOM_PHY is not set | ||
| 606 | # CONFIG_QSEMI_PHY is not set | ||
| 607 | # CONFIG_LXT_PHY is not set | ||
| 608 | # CONFIG_CICADA_PHY is not set | ||
| 609 | CONFIG_VITESSE_PHY=y | ||
| 610 | # CONFIG_SMSC_PHY is not set | ||
| 611 | # CONFIG_BROADCOM_PHY is not set | ||
| 612 | # CONFIG_ICPLUS_PHY is not set | ||
| 613 | # CONFIG_REALTEK_PHY is not set | ||
| 614 | # CONFIG_FIXED_PHY is not set | ||
| 615 | # CONFIG_MDIO_BITBANG is not set | ||
| 616 | CONFIG_NET_ETHERNET=y | ||
| 617 | CONFIG_MII=y | ||
| 618 | # CONFIG_HAPPYMEAL is not set | ||
| 619 | # CONFIG_SUNGEM is not set | ||
| 620 | # CONFIG_CASSINI is not set | ||
| 621 | # CONFIG_NET_VENDOR_3COM is not set | ||
| 622 | # CONFIG_NET_TULIP is not set | ||
| 623 | # CONFIG_HP100 is not set | ||
| 624 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 625 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 626 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 627 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 628 | # CONFIG_NET_PCI is not set | ||
| 629 | # CONFIG_B44 is not set | ||
| 630 | CONFIG_NETDEV_1000=y | ||
| 631 | # CONFIG_ACENIC is not set | ||
| 632 | # CONFIG_DL2K is not set | ||
| 633 | # CONFIG_E1000 is not set | ||
| 634 | # CONFIG_E1000E is not set | ||
| 635 | # CONFIG_E1000E_ENABLED is not set | ||
| 636 | # CONFIG_IP1000 is not set | ||
| 637 | # CONFIG_IGB is not set | ||
| 638 | # CONFIG_NS83820 is not set | ||
| 639 | # CONFIG_HAMACHI is not set | ||
| 640 | # CONFIG_YELLOWFIN is not set | ||
| 641 | # CONFIG_R8169 is not set | ||
| 642 | # CONFIG_SIS190 is not set | ||
| 643 | CONFIG_SKGE=y | ||
| 644 | # CONFIG_SKGE_DEBUG is not set | ||
| 645 | CONFIG_SKY2=y | ||
| 646 | # CONFIG_SKY2_DEBUG is not set | ||
| 647 | # CONFIG_VIA_VELOCITY is not set | ||
| 648 | # CONFIG_TIGON3 is not set | ||
| 649 | # CONFIG_BNX2 is not set | ||
| 650 | CONFIG_GIANFAR=y | ||
| 651 | CONFIG_GFAR_NAPI=y | ||
| 652 | # CONFIG_QLA3XXX is not set | ||
| 653 | # CONFIG_ATL1 is not set | ||
| 654 | CONFIG_NETDEV_10000=y | ||
| 655 | # CONFIG_CHELSIO_T1 is not set | ||
| 656 | # CONFIG_CHELSIO_T3 is not set | ||
| 657 | # CONFIG_IXGBE is not set | ||
| 658 | # CONFIG_IXGB is not set | ||
| 659 | # CONFIG_S2IO is not set | ||
| 660 | # CONFIG_MYRI10GE is not set | ||
| 661 | # CONFIG_NETXEN_NIC is not set | ||
| 662 | # CONFIG_NIU is not set | ||
| 663 | # CONFIG_MLX4_CORE is not set | ||
| 664 | # CONFIG_TEHUTI is not set | ||
| 665 | # CONFIG_BNX2X is not set | ||
| 666 | # CONFIG_SFC is not set | ||
| 667 | # CONFIG_TR is not set | ||
| 668 | |||
| 669 | # | ||
| 670 | # Wireless LAN | ||
| 671 | # | ||
| 672 | # CONFIG_WLAN_PRE80211 is not set | ||
| 673 | # CONFIG_WLAN_80211 is not set | ||
| 674 | # CONFIG_IWLWIFI_LEDS is not set | ||
| 675 | |||
| 676 | # | ||
| 677 | # USB Network Adapters | ||
| 678 | # | ||
| 679 | # CONFIG_USB_CATC is not set | ||
| 680 | # CONFIG_USB_KAWETH is not set | ||
| 681 | # CONFIG_USB_PEGASUS is not set | ||
| 682 | # CONFIG_USB_RTL8150 is not set | ||
| 683 | # CONFIG_USB_USBNET is not set | ||
| 684 | # CONFIG_WAN is not set | ||
| 685 | # CONFIG_FDDI is not set | ||
| 686 | # CONFIG_HIPPI is not set | ||
| 687 | # CONFIG_PPP is not set | ||
| 688 | # CONFIG_SLIP is not set | ||
| 689 | # CONFIG_NET_FC is not set | ||
| 690 | # CONFIG_NETCONSOLE is not set | ||
| 691 | # CONFIG_NETPOLL is not set | ||
| 692 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 693 | # CONFIG_ISDN is not set | ||
| 694 | # CONFIG_PHONE is not set | ||
| 695 | |||
| 696 | # | ||
| 697 | # Input device support | ||
| 698 | # | ||
| 699 | CONFIG_INPUT=y | ||
| 700 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 701 | # CONFIG_INPUT_POLLDEV is not set | ||
| 702 | |||
| 703 | # | ||
| 704 | # Userland interfaces | ||
| 705 | # | ||
| 706 | # CONFIG_INPUT_MOUSEDEV is not set | ||
| 707 | # CONFIG_INPUT_JOYDEV is not set | ||
| 708 | # CONFIG_INPUT_EVDEV is not set | ||
| 709 | # CONFIG_INPUT_EVBUG is not set | ||
| 710 | |||
| 711 | # | ||
| 712 | # Input Device Drivers | ||
| 713 | # | ||
| 714 | # CONFIG_INPUT_KEYBOARD is not set | ||
| 715 | # CONFIG_INPUT_MOUSE is not set | ||
| 716 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 717 | # CONFIG_INPUT_TABLET is not set | ||
| 718 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
| 719 | # CONFIG_INPUT_MISC is not set | ||
| 720 | |||
| 721 | # | ||
| 722 | # Hardware I/O ports | ||
| 723 | # | ||
| 724 | CONFIG_SERIO=y | ||
| 725 | CONFIG_SERIO_I8042=y | ||
| 726 | CONFIG_SERIO_SERPORT=y | ||
| 727 | # CONFIG_SERIO_PCIPS2 is not set | ||
| 728 | CONFIG_SERIO_LIBPS2=y | ||
| 729 | # CONFIG_SERIO_RAW is not set | ||
| 730 | # CONFIG_GAMEPORT is not set | ||
| 731 | |||
| 732 | # | ||
| 733 | # Character devices | ||
| 734 | # | ||
| 735 | CONFIG_VT=y | ||
| 736 | CONFIG_VT_CONSOLE=y | ||
| 737 | CONFIG_HW_CONSOLE=y | ||
| 738 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
| 739 | CONFIG_DEVKMEM=y | ||
| 740 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 741 | # CONFIG_NOZOMI is not set | ||
| 742 | |||
| 743 | # | ||
| 744 | # Serial drivers | ||
| 745 | # | ||
| 746 | CONFIG_SERIAL_8250=y | ||
| 747 | CONFIG_SERIAL_8250_CONSOLE=y | ||
| 748 | CONFIG_SERIAL_8250_PCI=y | ||
| 749 | CONFIG_SERIAL_8250_NR_UARTS=2 | ||
| 750 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 | ||
| 751 | CONFIG_SERIAL_8250_EXTENDED=y | ||
| 752 | CONFIG_SERIAL_8250_MANY_PORTS=y | ||
| 753 | CONFIG_SERIAL_8250_SHARE_IRQ=y | ||
| 754 | CONFIG_SERIAL_8250_DETECT_IRQ=y | ||
| 755 | CONFIG_SERIAL_8250_RSA=y | ||
| 756 | |||
| 757 | # | ||
| 758 | # Non-8250 serial port support | ||
| 759 | # | ||
| 760 | # CONFIG_SERIAL_UARTLITE is not set | ||
| 761 | CONFIG_SERIAL_CORE=y | ||
| 762 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 763 | # CONFIG_SERIAL_JSM is not set | ||
| 764 | # CONFIG_SERIAL_OF_PLATFORM is not set | ||
| 765 | CONFIG_UNIX98_PTYS=y | ||
| 766 | CONFIG_LEGACY_PTYS=y | ||
| 767 | CONFIG_LEGACY_PTY_COUNT=256 | ||
| 768 | # CONFIG_IPMI_HANDLER is not set | ||
| 769 | # CONFIG_HW_RANDOM is not set | ||
| 770 | # CONFIG_NVRAM is not set | ||
| 771 | # CONFIG_R3964 is not set | ||
| 772 | # CONFIG_APPLICOM is not set | ||
| 773 | # CONFIG_RAW_DRIVER is not set | ||
| 774 | # CONFIG_TCG_TPM is not set | ||
| 775 | CONFIG_DEVPORT=y | ||
| 776 | CONFIG_I2C=y | ||
| 777 | CONFIG_I2C_BOARDINFO=y | ||
| 778 | # CONFIG_I2C_CHARDEV is not set | ||
| 779 | |||
| 780 | # | ||
| 781 | # I2C Hardware Bus support | ||
| 782 | # | ||
| 783 | # CONFIG_I2C_ALI1535 is not set | ||
| 784 | # CONFIG_I2C_ALI1563 is not set | ||
| 785 | # CONFIG_I2C_ALI15X3 is not set | ||
| 786 | # CONFIG_I2C_AMD756 is not set | ||
| 787 | # CONFIG_I2C_AMD8111 is not set | ||
| 788 | # CONFIG_I2C_I801 is not set | ||
| 789 | # CONFIG_I2C_I810 is not set | ||
| 790 | # CONFIG_I2C_PIIX4 is not set | ||
| 791 | CONFIG_I2C_MPC=y | ||
| 792 | # CONFIG_I2C_NFORCE2 is not set | ||
| 793 | # CONFIG_I2C_OCORES is not set | ||
| 794 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
| 795 | # CONFIG_I2C_PROSAVAGE is not set | ||
| 796 | # CONFIG_I2C_SAVAGE4 is not set | ||
| 797 | # CONFIG_I2C_SIMTEC is not set | ||
| 798 | # CONFIG_I2C_SIS5595 is not set | ||
| 799 | # CONFIG_I2C_SIS630 is not set | ||
| 800 | # CONFIG_I2C_SIS96X is not set | ||
| 801 | # CONFIG_I2C_TAOS_EVM is not set | ||
| 802 | # CONFIG_I2C_STUB is not set | ||
| 803 | # CONFIG_I2C_TINY_USB is not set | ||
| 804 | # CONFIG_I2C_VIA is not set | ||
| 805 | # CONFIG_I2C_VIAPRO is not set | ||
| 806 | # CONFIG_I2C_VOODOO3 is not set | ||
| 807 | # CONFIG_I2C_PCA_PLATFORM is not set | ||
| 808 | |||
| 809 | # | ||
| 810 | # Miscellaneous I2C Chip support | ||
| 811 | # | ||
| 812 | # CONFIG_DS1682 is not set | ||
| 813 | CONFIG_SENSORS_EEPROM=y | ||
| 814 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 815 | # CONFIG_PCF8575 is not set | ||
| 816 | # CONFIG_SENSORS_PCF8591 is not set | ||
| 817 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 818 | # CONFIG_SENSORS_TSL2550 is not set | ||
| 819 | # CONFIG_I2C_DEBUG_CORE is not set | ||
| 820 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
| 821 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 822 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 823 | # CONFIG_SPI is not set | ||
| 824 | # CONFIG_W1 is not set | ||
| 825 | # CONFIG_POWER_SUPPLY is not set | ||
| 826 | # CONFIG_HWMON is not set | ||
| 827 | CONFIG_THERMAL=y | ||
| 828 | # CONFIG_WATCHDOG is not set | ||
| 829 | |||
| 830 | # | ||
| 831 | # Sonics Silicon Backplane | ||
| 832 | # | ||
| 833 | CONFIG_SSB_POSSIBLE=y | ||
| 834 | # CONFIG_SSB is not set | ||
| 835 | |||
| 836 | # | ||
| 837 | # Multifunction device drivers | ||
| 838 | # | ||
| 839 | # CONFIG_MFD_SM501 is not set | ||
| 840 | # CONFIG_HTC_PASIC3 is not set | ||
| 841 | |||
| 842 | # | ||
| 843 | # Multimedia devices | ||
| 844 | # | ||
| 845 | |||
| 846 | # | ||
| 847 | # Multimedia core support | ||
| 848 | # | ||
| 849 | # CONFIG_VIDEO_DEV is not set | ||
| 850 | CONFIG_DVB_CORE=m | ||
| 851 | CONFIG_VIDEO_MEDIA=m | ||
| 852 | |||
| 853 | # | ||
| 854 | # Multimedia drivers | ||
| 855 | # | ||
| 856 | # CONFIG_MEDIA_ATTACH is not set | ||
| 857 | CONFIG_MEDIA_TUNER=m | ||
| 858 | # CONFIG_MEDIA_TUNER_CUSTOMIZE is not set | ||
| 859 | CONFIG_MEDIA_TUNER_SIMPLE=m | ||
| 860 | CONFIG_MEDIA_TUNER_TDA8290=m | ||
| 861 | CONFIG_MEDIA_TUNER_TDA9887=m | ||
| 862 | CONFIG_MEDIA_TUNER_TEA5761=m | ||
| 863 | CONFIG_MEDIA_TUNER_TEA5767=m | ||
| 864 | CONFIG_MEDIA_TUNER_MT20XX=m | ||
| 865 | CONFIG_MEDIA_TUNER_XC2028=m | ||
| 866 | CONFIG_MEDIA_TUNER_XC5000=m | ||
| 867 | CONFIG_DVB_CAPTURE_DRIVERS=y | ||
| 868 | |||
| 869 | # | ||
| 870 | # Supported SAA7146 based PCI Adapters | ||
| 871 | # | ||
| 872 | # CONFIG_TTPCI_EEPROM is not set | ||
| 873 | # CONFIG_DVB_BUDGET_CORE is not set | ||
| 874 | |||
| 875 | # | ||
| 876 | # Supported USB Adapters | ||
| 877 | # | ||
| 878 | # CONFIG_DVB_USB is not set | ||
| 879 | # CONFIG_DVB_TTUSB_BUDGET is not set | ||
| 880 | # CONFIG_DVB_TTUSB_DEC is not set | ||
| 881 | # CONFIG_DVB_CINERGYT2 is not set | ||
| 882 | |||
| 883 | # | ||
| 884 | # Supported FlexCopII (B2C2) Adapters | ||
| 885 | # | ||
| 886 | # CONFIG_DVB_B2C2_FLEXCOP is not set | ||
| 887 | |||
| 888 | # | ||
| 889 | # Supported BT878 Adapters | ||
| 890 | # | ||
| 891 | |||
| 892 | # | ||
| 893 | # Supported Pluto2 Adapters | ||
| 894 | # | ||
| 895 | # CONFIG_DVB_PLUTO2 is not set | ||
| 896 | |||
| 897 | # | ||
| 898 | # Supported DVB Frontends | ||
| 899 | # | ||
| 900 | |||
| 901 | # | ||
| 902 | # Customise DVB Frontends | ||
| 903 | # | ||
| 904 | # CONFIG_DVB_FE_CUSTOMISE is not set | ||
| 905 | |||
| 906 | # | ||
| 907 | # DVB-S (satellite) frontends | ||
| 908 | # | ||
| 909 | # CONFIG_DVB_CX24110 is not set | ||
| 910 | # CONFIG_DVB_CX24123 is not set | ||
| 911 | # CONFIG_DVB_MT312 is not set | ||
| 912 | # CONFIG_DVB_S5H1420 is not set | ||
| 913 | # CONFIG_DVB_STV0299 is not set | ||
| 914 | # CONFIG_DVB_TDA8083 is not set | ||
| 915 | # CONFIG_DVB_TDA10086 is not set | ||
| 916 | # CONFIG_DVB_VES1X93 is not set | ||
| 917 | # CONFIG_DVB_TUNER_ITD1000 is not set | ||
| 918 | # CONFIG_DVB_TDA826X is not set | ||
| 919 | # CONFIG_DVB_TUA6100 is not set | ||
| 920 | |||
| 921 | # | ||
| 922 | # DVB-T (terrestrial) frontends | ||
| 923 | # | ||
| 924 | # CONFIG_DVB_SP8870 is not set | ||
| 925 | # CONFIG_DVB_SP887X is not set | ||
| 926 | # CONFIG_DVB_CX22700 is not set | ||
| 927 | # CONFIG_DVB_CX22702 is not set | ||
| 928 | # CONFIG_DVB_L64781 is not set | ||
| 929 | # CONFIG_DVB_TDA1004X is not set | ||
| 930 | # CONFIG_DVB_NXT6000 is not set | ||
| 931 | # CONFIG_DVB_MT352 is not set | ||
| 932 | # CONFIG_DVB_ZL10353 is not set | ||
| 933 | # CONFIG_DVB_DIB3000MB is not set | ||
| 934 | # CONFIG_DVB_DIB3000MC is not set | ||
| 935 | # CONFIG_DVB_DIB7000M is not set | ||
| 936 | # CONFIG_DVB_DIB7000P is not set | ||
| 937 | # CONFIG_DVB_TDA10048 is not set | ||
| 938 | |||
| 939 | # | ||
| 940 | # DVB-C (cable) frontends | ||
| 941 | # | ||
| 942 | # CONFIG_DVB_VES1820 is not set | ||
| 943 | # CONFIG_DVB_TDA10021 is not set | ||
| 944 | # CONFIG_DVB_TDA10023 is not set | ||
| 945 | # CONFIG_DVB_STV0297 is not set | ||
| 946 | |||
| 947 | # | ||
| 948 | # ATSC (North American/Korean Terrestrial/Cable DTV) frontends | ||
| 949 | # | ||
| 950 | # CONFIG_DVB_NXT200X is not set | ||
| 951 | # CONFIG_DVB_OR51211 is not set | ||
| 952 | # CONFIG_DVB_OR51132 is not set | ||
| 953 | # CONFIG_DVB_BCM3510 is not set | ||
| 954 | # CONFIG_DVB_LGDT330X is not set | ||
| 955 | # CONFIG_DVB_S5H1409 is not set | ||
| 956 | # CONFIG_DVB_AU8522 is not set | ||
| 957 | # CONFIG_DVB_S5H1411 is not set | ||
| 958 | |||
| 959 | # | ||
| 960 | # Digital terrestrial only tuners/PLL | ||
| 961 | # | ||
| 962 | # CONFIG_DVB_PLL is not set | ||
| 963 | # CONFIG_DVB_TUNER_DIB0070 is not set | ||
| 964 | |||
| 965 | # | ||
| 966 | # SEC control devices for DVB-S | ||
| 967 | # | ||
| 968 | # CONFIG_DVB_LNBP21 is not set | ||
| 969 | # CONFIG_DVB_ISL6405 is not set | ||
| 970 | # CONFIG_DVB_ISL6421 is not set | ||
| 971 | CONFIG_DAB=y | ||
| 972 | # CONFIG_USB_DABUSB is not set | ||
| 973 | |||
| 974 | # | ||
| 975 | # Graphics support | ||
| 976 | # | ||
| 977 | # CONFIG_AGP is not set | ||
| 978 | # CONFIG_DRM is not set | ||
| 979 | # CONFIG_VGASTATE is not set | ||
| 980 | CONFIG_VIDEO_OUTPUT_CONTROL=y | ||
| 981 | # CONFIG_FB is not set | ||
| 982 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
| 983 | |||
| 984 | # | ||
| 985 | # Display device support | ||
| 986 | # | ||
| 987 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 988 | |||
| 989 | # | ||
| 990 | # Console display driver support | ||
| 991 | # | ||
| 992 | CONFIG_VGA_CONSOLE=y | ||
| 993 | # CONFIG_VGACON_SOFT_SCROLLBACK is not set | ||
| 994 | CONFIG_DUMMY_CONSOLE=y | ||
| 995 | |||
| 996 | # | ||
| 997 | # Sound | ||
| 998 | # | ||
| 999 | CONFIG_SOUND=y | ||
| 1000 | |||
| 1001 | # | ||
| 1002 | # Advanced Linux Sound Architecture | ||
| 1003 | # | ||
| 1004 | CONFIG_SND=y | ||
| 1005 | CONFIG_SND_TIMER=y | ||
| 1006 | CONFIG_SND_PCM=y | ||
| 1007 | # CONFIG_SND_SEQUENCER is not set | ||
| 1008 | # CONFIG_SND_MIXER_OSS is not set | ||
| 1009 | # CONFIG_SND_PCM_OSS is not set | ||
| 1010 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
| 1011 | CONFIG_SND_SUPPORT_OLD_API=y | ||
| 1012 | CONFIG_SND_VERBOSE_PROCFS=y | ||
| 1013 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
| 1014 | # CONFIG_SND_DEBUG is not set | ||
| 1015 | |||
| 1016 | # | ||
| 1017 | # Generic devices | ||
| 1018 | # | ||
| 1019 | CONFIG_SND_AC97_CODEC=y | ||
| 1020 | # CONFIG_SND_DUMMY is not set | ||
| 1021 | # CONFIG_SND_MTPAV is not set | ||
| 1022 | # CONFIG_SND_SERIAL_U16550 is not set | ||
| 1023 | # CONFIG_SND_MPU401 is not set | ||
| 1024 | |||
| 1025 | # | ||
| 1026 | # PCI devices | ||
| 1027 | # | ||
| 1028 | # CONFIG_SND_AD1889 is not set | ||
| 1029 | # CONFIG_SND_ALS300 is not set | ||
| 1030 | # CONFIG_SND_ALS4000 is not set | ||
| 1031 | # CONFIG_SND_ALI5451 is not set | ||
| 1032 | # CONFIG_SND_ATIIXP is not set | ||
| 1033 | # CONFIG_SND_ATIIXP_MODEM is not set | ||
| 1034 | # CONFIG_SND_AU8810 is not set | ||
| 1035 | # CONFIG_SND_AU8820 is not set | ||
| 1036 | # CONFIG_SND_AU8830 is not set | ||
| 1037 | # CONFIG_SND_AW2 is not set | ||
| 1038 | # CONFIG_SND_AZT3328 is not set | ||
| 1039 | # CONFIG_SND_BT87X is not set | ||
| 1040 | # CONFIG_SND_CA0106 is not set | ||
| 1041 | # CONFIG_SND_CMIPCI is not set | ||
| 1042 | # CONFIG_SND_OXYGEN is not set | ||
| 1043 | # CONFIG_SND_CS4281 is not set | ||
| 1044 | # CONFIG_SND_CS46XX is not set | ||
| 1045 | # CONFIG_SND_CS5530 is not set | ||
| 1046 | # CONFIG_SND_DARLA20 is not set | ||
| 1047 | # CONFIG_SND_GINA20 is not set | ||
| 1048 | # CONFIG_SND_LAYLA20 is not set | ||
| 1049 | # CONFIG_SND_DARLA24 is not set | ||
| 1050 | # CONFIG_SND_GINA24 is not set | ||
| 1051 | # CONFIG_SND_LAYLA24 is not set | ||
| 1052 | # CONFIG_SND_MONA is not set | ||
| 1053 | # CONFIG_SND_MIA is not set | ||
| 1054 | # CONFIG_SND_ECHO3G is not set | ||
| 1055 | # CONFIG_SND_INDIGO is not set | ||
| 1056 | # CONFIG_SND_INDIGOIO is not set | ||
| 1057 | # CONFIG_SND_INDIGODJ is not set | ||
| 1058 | # CONFIG_SND_EMU10K1 is not set | ||
| 1059 | # CONFIG_SND_EMU10K1X is not set | ||
| 1060 | # CONFIG_SND_ENS1370 is not set | ||
| 1061 | # CONFIG_SND_ENS1371 is not set | ||
| 1062 | # CONFIG_SND_ES1938 is not set | ||
| 1063 | # CONFIG_SND_ES1968 is not set | ||
| 1064 | # CONFIG_SND_FM801 is not set | ||
| 1065 | # CONFIG_SND_HDA_INTEL is not set | ||
| 1066 | # CONFIG_SND_HDSP is not set | ||
| 1067 | # CONFIG_SND_HDSPM is not set | ||
| 1068 | # CONFIG_SND_HIFIER is not set | ||
| 1069 | # CONFIG_SND_ICE1712 is not set | ||
| 1070 | # CONFIG_SND_ICE1724 is not set | ||
| 1071 | CONFIG_SND_INTEL8X0=y | ||
| 1072 | # CONFIG_SND_INTEL8X0M is not set | ||
| 1073 | # CONFIG_SND_KORG1212 is not set | ||
| 1074 | # CONFIG_SND_MAESTRO3 is not set | ||
| 1075 | # CONFIG_SND_MIXART is not set | ||
| 1076 | # CONFIG_SND_NM256 is not set | ||
| 1077 | # CONFIG_SND_PCXHR is not set | ||
| 1078 | # CONFIG_SND_RIPTIDE is not set | ||
| 1079 | # CONFIG_SND_RME32 is not set | ||
| 1080 | # CONFIG_SND_RME96 is not set | ||
| 1081 | # CONFIG_SND_RME9652 is not set | ||
| 1082 | # CONFIG_SND_SONICVIBES is not set | ||
| 1083 | # CONFIG_SND_TRIDENT is not set | ||
| 1084 | # CONFIG_SND_VIA82XX is not set | ||
| 1085 | # CONFIG_SND_VIA82XX_MODEM is not set | ||
| 1086 | # CONFIG_SND_VIRTUOSO is not set | ||
| 1087 | # CONFIG_SND_VX222 is not set | ||
| 1088 | # CONFIG_SND_YMFPCI is not set | ||
| 1089 | # CONFIG_SND_AC97_POWER_SAVE is not set | ||
| 1090 | |||
| 1091 | # | ||
| 1092 | # ALSA PowerMac devices | ||
| 1093 | # | ||
| 1094 | |||
| 1095 | # | ||
| 1096 | # ALSA PowerPC devices | ||
| 1097 | # | ||
| 1098 | |||
| 1099 | # | ||
| 1100 | # USB devices | ||
| 1101 | # | ||
| 1102 | # CONFIG_SND_USB_AUDIO is not set | ||
| 1103 | # CONFIG_SND_USB_USX2Y is not set | ||
| 1104 | # CONFIG_SND_USB_CAIAQ is not set | ||
| 1105 | |||
| 1106 | # | ||
| 1107 | # System on Chip audio support | ||
| 1108 | # | ||
| 1109 | # CONFIG_SND_SOC is not set | ||
| 1110 | |||
| 1111 | # | ||
| 1112 | # ALSA SoC audio for Freescale SOCs | ||
| 1113 | # | ||
| 1114 | |||
| 1115 | # | ||
| 1116 | # SoC Audio for the Texas Instruments OMAP | ||
| 1117 | # | ||
| 1118 | |||
| 1119 | # | ||
| 1120 | # Open Sound System | ||
| 1121 | # | ||
| 1122 | # CONFIG_SOUND_PRIME is not set | ||
| 1123 | CONFIG_AC97_BUS=y | ||
| 1124 | CONFIG_HID_SUPPORT=y | ||
| 1125 | CONFIG_HID=y | ||
| 1126 | # CONFIG_HID_DEBUG is not set | ||
| 1127 | # CONFIG_HIDRAW is not set | ||
| 1128 | |||
| 1129 | # | ||
| 1130 | # USB Input Devices | ||
| 1131 | # | ||
| 1132 | CONFIG_USB_HID=y | ||
| 1133 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
| 1134 | # CONFIG_HID_FF is not set | ||
| 1135 | # CONFIG_USB_HIDDEV is not set | ||
| 1136 | CONFIG_USB_SUPPORT=y | ||
| 1137 | CONFIG_USB_ARCH_HAS_HCD=y | ||
| 1138 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
| 1139 | CONFIG_USB_ARCH_HAS_EHCI=y | ||
| 1140 | CONFIG_USB=y | ||
| 1141 | # CONFIG_USB_DEBUG is not set | ||
| 1142 | # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set | ||
| 1143 | |||
| 1144 | # | ||
| 1145 | # Miscellaneous USB options | ||
| 1146 | # | ||
| 1147 | CONFIG_USB_DEVICEFS=y | ||
| 1148 | CONFIG_USB_DEVICE_CLASS=y | ||
| 1149 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
| 1150 | # CONFIG_USB_OTG is not set | ||
| 1151 | # CONFIG_USB_OTG_WHITELIST is not set | ||
| 1152 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | ||
| 1153 | |||
| 1154 | # | ||
| 1155 | # USB Host Controller Drivers | ||
| 1156 | # | ||
| 1157 | # CONFIG_USB_C67X00_HCD is not set | ||
| 1158 | CONFIG_USB_EHCI_HCD=y | ||
| 1159 | CONFIG_USB_EHCI_ROOT_HUB_TT=y | ||
| 1160 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | ||
| 1161 | CONFIG_USB_EHCI_FSL=y | ||
| 1162 | CONFIG_USB_EHCI_HCD_PPC_OF=y | ||
| 1163 | # CONFIG_USB_ISP116X_HCD is not set | ||
| 1164 | # CONFIG_USB_ISP1760_HCD is not set | ||
| 1165 | CONFIG_USB_OHCI_HCD=y | ||
| 1166 | CONFIG_USB_OHCI_HCD_PPC_OF=y | ||
| 1167 | CONFIG_USB_OHCI_HCD_PPC_OF_BE=y | ||
| 1168 | CONFIG_USB_OHCI_HCD_PPC_OF_LE=y | ||
| 1169 | CONFIG_USB_OHCI_HCD_PCI=y | ||
| 1170 | CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y | ||
| 1171 | CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y | ||
| 1172 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
| 1173 | # CONFIG_USB_UHCI_HCD is not set | ||
| 1174 | # CONFIG_USB_SL811_HCD is not set | ||
| 1175 | # CONFIG_USB_R8A66597_HCD is not set | ||
| 1176 | |||
| 1177 | # | ||
| 1178 | # USB Device Class drivers | ||
| 1179 | # | ||
| 1180 | # CONFIG_USB_ACM is not set | ||
| 1181 | # CONFIG_USB_PRINTER is not set | ||
| 1182 | # CONFIG_USB_WDM is not set | ||
| 1183 | |||
| 1184 | # | ||
| 1185 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
| 1186 | # | ||
| 1187 | |||
| 1188 | # | ||
| 1189 | # may also be needed; see USB_STORAGE Help for more information | ||
| 1190 | # | ||
| 1191 | CONFIG_USB_STORAGE=y | ||
| 1192 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
| 1193 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
| 1194 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
| 1195 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
| 1196 | # CONFIG_USB_STORAGE_DPCM is not set | ||
| 1197 | # CONFIG_USB_STORAGE_USBAT is not set | ||
| 1198 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
| 1199 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
| 1200 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
| 1201 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
| 1202 | # CONFIG_USB_STORAGE_ONETOUCH is not set | ||
| 1203 | # CONFIG_USB_STORAGE_KARMA is not set | ||
| 1204 | # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set | ||
| 1205 | # CONFIG_USB_LIBUSUAL is not set | ||
| 1206 | |||
| 1207 | # | ||
| 1208 | # USB Imaging devices | ||
| 1209 | # | ||
| 1210 | # CONFIG_USB_MDC800 is not set | ||
| 1211 | # CONFIG_USB_MICROTEK is not set | ||
| 1212 | CONFIG_USB_MON=y | ||
| 1213 | |||
| 1214 | # | ||
| 1215 | # USB port drivers | ||
| 1216 | # | ||
| 1217 | # CONFIG_USB_SERIAL is not set | ||
| 1218 | |||
| 1219 | # | ||
| 1220 | # USB Miscellaneous drivers | ||
| 1221 | # | ||
| 1222 | # CONFIG_USB_EMI62 is not set | ||
| 1223 | # CONFIG_USB_EMI26 is not set | ||
| 1224 | # CONFIG_USB_ADUTUX is not set | ||
| 1225 | # CONFIG_USB_AUERSWALD is not set | ||
| 1226 | # CONFIG_USB_RIO500 is not set | ||
| 1227 | # CONFIG_USB_LEGOTOWER is not set | ||
| 1228 | # CONFIG_USB_LCD is not set | ||
| 1229 | # CONFIG_USB_BERRY_CHARGE is not set | ||
| 1230 | # CONFIG_USB_LED is not set | ||
| 1231 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
| 1232 | # CONFIG_USB_CYTHERM is not set | ||
| 1233 | # CONFIG_USB_PHIDGET is not set | ||
| 1234 | # CONFIG_USB_IDMOUSE is not set | ||
| 1235 | # CONFIG_USB_FTDI_ELAN is not set | ||
| 1236 | # CONFIG_USB_APPLEDISPLAY is not set | ||
| 1237 | # CONFIG_USB_SISUSBVGA is not set | ||
| 1238 | # CONFIG_USB_LD is not set | ||
| 1239 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
| 1240 | # CONFIG_USB_IOWARRIOR is not set | ||
| 1241 | # CONFIG_USB_TEST is not set | ||
| 1242 | # CONFIG_USB_ISIGHTFW is not set | ||
| 1243 | # CONFIG_USB_GADGET is not set | ||
| 1244 | # CONFIG_MMC is not set | ||
| 1245 | # CONFIG_MEMSTICK is not set | ||
| 1246 | # CONFIG_NEW_LEDS is not set | ||
| 1247 | # CONFIG_ACCESSIBILITY is not set | ||
| 1248 | # CONFIG_INFINIBAND is not set | ||
| 1249 | # CONFIG_EDAC is not set | ||
| 1250 | CONFIG_RTC_LIB=y | ||
| 1251 | CONFIG_RTC_CLASS=y | ||
| 1252 | CONFIG_RTC_HCTOSYS=y | ||
| 1253 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
| 1254 | # CONFIG_RTC_DEBUG is not set | ||
| 1255 | |||
| 1256 | # | ||
| 1257 | # RTC interfaces | ||
| 1258 | # | ||
| 1259 | CONFIG_RTC_INTF_SYSFS=y | ||
| 1260 | CONFIG_RTC_INTF_PROC=y | ||
| 1261 | CONFIG_RTC_INTF_DEV=y | ||
| 1262 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
| 1263 | # CONFIG_RTC_DRV_TEST is not set | ||
| 1264 | |||
| 1265 | # | ||
| 1266 | # I2C RTC drivers | ||
| 1267 | # | ||
| 1268 | # CONFIG_RTC_DRV_DS1307 is not set | ||
| 1269 | # CONFIG_RTC_DRV_DS1374 is not set | ||
| 1270 | # CONFIG_RTC_DRV_DS1672 is not set | ||
| 1271 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
| 1272 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
| 1273 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
| 1274 | # CONFIG_RTC_DRV_X1205 is not set | ||
| 1275 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
| 1276 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
| 1277 | # CONFIG_RTC_DRV_M41T80 is not set | ||
| 1278 | # CONFIG_RTC_DRV_S35390A is not set | ||
| 1279 | # CONFIG_RTC_DRV_FM3130 is not set | ||
| 1280 | |||
| 1281 | # | ||
| 1282 | # SPI RTC drivers | ||
| 1283 | # | ||
| 1284 | |||
| 1285 | # | ||
| 1286 | # Platform RTC drivers | ||
| 1287 | # | ||
| 1288 | CONFIG_RTC_DRV_CMOS=y | ||
| 1289 | # CONFIG_RTC_DRV_DS1511 is not set | ||
| 1290 | # CONFIG_RTC_DRV_DS1553 is not set | ||
| 1291 | # CONFIG_RTC_DRV_DS1742 is not set | ||
| 1292 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
| 1293 | # CONFIG_RTC_DRV_M48T86 is not set | ||
| 1294 | # CONFIG_RTC_DRV_M48T59 is not set | ||
| 1295 | # CONFIG_RTC_DRV_V3020 is not set | ||
| 1296 | |||
| 1297 | # | ||
| 1298 | # on-CPU RTC drivers | ||
| 1299 | # | ||
| 1300 | # CONFIG_RTC_DRV_PPC is not set | ||
| 1301 | CONFIG_DMADEVICES=y | ||
| 1302 | |||
| 1303 | # | ||
| 1304 | # DMA Devices | ||
| 1305 | # | ||
| 1306 | CONFIG_FSL_DMA=y | ||
| 1307 | CONFIG_DMA_ENGINE=y | ||
| 1308 | |||
| 1309 | # | ||
| 1310 | # DMA Clients | ||
| 1311 | # | ||
| 1312 | # CONFIG_NET_DMA is not set | ||
| 1313 | # CONFIG_UIO is not set | ||
| 1314 | |||
| 1315 | # | ||
| 1316 | # File systems | ||
| 1317 | # | ||
| 1318 | CONFIG_EXT2_FS=y | ||
| 1319 | # CONFIG_EXT2_FS_XATTR is not set | ||
| 1320 | # CONFIG_EXT2_FS_XIP is not set | ||
| 1321 | CONFIG_EXT3_FS=y | ||
| 1322 | CONFIG_EXT3_FS_XATTR=y | ||
| 1323 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
| 1324 | # CONFIG_EXT3_FS_SECURITY is not set | ||
| 1325 | # CONFIG_EXT4DEV_FS is not set | ||
| 1326 | CONFIG_JBD=y | ||
| 1327 | # CONFIG_JBD_DEBUG is not set | ||
| 1328 | CONFIG_FS_MBCACHE=y | ||
| 1329 | # CONFIG_REISERFS_FS is not set | ||
| 1330 | # CONFIG_JFS_FS is not set | ||
| 1331 | # CONFIG_FS_POSIX_ACL is not set | ||
| 1332 | # CONFIG_XFS_FS is not set | ||
| 1333 | # CONFIG_OCFS2_FS is not set | ||
| 1334 | CONFIG_DNOTIFY=y | ||
| 1335 | CONFIG_INOTIFY=y | ||
| 1336 | CONFIG_INOTIFY_USER=y | ||
| 1337 | # CONFIG_QUOTA is not set | ||
| 1338 | # CONFIG_AUTOFS_FS is not set | ||
| 1339 | # CONFIG_AUTOFS4_FS is not set | ||
| 1340 | # CONFIG_FUSE_FS is not set | ||
| 1341 | |||
| 1342 | # | ||
| 1343 | # CD-ROM/DVD Filesystems | ||
| 1344 | # | ||
| 1345 | CONFIG_ISO9660_FS=m | ||
| 1346 | CONFIG_JOLIET=y | ||
| 1347 | CONFIG_ZISOFS=y | ||
| 1348 | CONFIG_UDF_FS=m | ||
| 1349 | CONFIG_UDF_NLS=y | ||
| 1350 | |||
| 1351 | # | ||
| 1352 | # DOS/FAT/NT Filesystems | ||
| 1353 | # | ||
| 1354 | CONFIG_FAT_FS=y | ||
| 1355 | CONFIG_MSDOS_FS=m | ||
| 1356 | CONFIG_VFAT_FS=y | ||
| 1357 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 1358 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 1359 | CONFIG_NTFS_FS=y | ||
| 1360 | # CONFIG_NTFS_DEBUG is not set | ||
| 1361 | # CONFIG_NTFS_RW is not set | ||
| 1362 | |||
| 1363 | # | ||
| 1364 | # Pseudo filesystems | ||
| 1365 | # | ||
| 1366 | CONFIG_PROC_FS=y | ||
| 1367 | CONFIG_PROC_KCORE=y | ||
| 1368 | CONFIG_PROC_SYSCTL=y | ||
| 1369 | CONFIG_SYSFS=y | ||
| 1370 | CONFIG_TMPFS=y | ||
| 1371 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 1372 | # CONFIG_HUGETLB_PAGE is not set | ||
| 1373 | # CONFIG_CONFIGFS_FS is not set | ||
| 1374 | |||
| 1375 | # | ||
| 1376 | # Miscellaneous filesystems | ||
| 1377 | # | ||
| 1378 | CONFIG_ADFS_FS=m | ||
| 1379 | # CONFIG_ADFS_FS_RW is not set | ||
| 1380 | CONFIG_AFFS_FS=m | ||
| 1381 | CONFIG_HFS_FS=m | ||
| 1382 | CONFIG_HFSPLUS_FS=m | ||
| 1383 | CONFIG_BEFS_FS=m | ||
| 1384 | # CONFIG_BEFS_DEBUG is not set | ||
| 1385 | CONFIG_BFS_FS=m | ||
| 1386 | CONFIG_EFS_FS=m | ||
| 1387 | CONFIG_CRAMFS=y | ||
| 1388 | CONFIG_VXFS_FS=m | ||
| 1389 | # CONFIG_MINIX_FS is not set | ||
| 1390 | CONFIG_HPFS_FS=m | ||
| 1391 | CONFIG_QNX4FS_FS=m | ||
| 1392 | # CONFIG_ROMFS_FS is not set | ||
| 1393 | CONFIG_SYSV_FS=m | ||
| 1394 | CONFIG_UFS_FS=m | ||
| 1395 | # CONFIG_UFS_FS_WRITE is not set | ||
| 1396 | # CONFIG_UFS_DEBUG is not set | ||
| 1397 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 1398 | CONFIG_NFS_FS=y | ||
| 1399 | CONFIG_NFS_V3=y | ||
| 1400 | # CONFIG_NFS_V3_ACL is not set | ||
| 1401 | CONFIG_NFS_V4=y | ||
| 1402 | CONFIG_NFSD=y | ||
| 1403 | # CONFIG_NFSD_V3 is not set | ||
| 1404 | # CONFIG_NFSD_V4 is not set | ||
| 1405 | CONFIG_ROOT_NFS=y | ||
| 1406 | CONFIG_LOCKD=y | ||
| 1407 | CONFIG_LOCKD_V4=y | ||
| 1408 | CONFIG_EXPORTFS=y | ||
| 1409 | CONFIG_NFS_COMMON=y | ||
| 1410 | CONFIG_SUNRPC=y | ||
| 1411 | CONFIG_SUNRPC_GSS=y | ||
| 1412 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 1413 | CONFIG_RPCSEC_GSS_KRB5=y | ||
| 1414 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 1415 | # CONFIG_SMB_FS is not set | ||
| 1416 | # CONFIG_CIFS is not set | ||
| 1417 | # CONFIG_NCP_FS is not set | ||
| 1418 | # CONFIG_CODA_FS is not set | ||
| 1419 | # CONFIG_AFS_FS is not set | ||
| 1420 | |||
| 1421 | # | ||
| 1422 | # Partition Types | ||
| 1423 | # | ||
| 1424 | CONFIG_PARTITION_ADVANCED=y | ||
| 1425 | # CONFIG_ACORN_PARTITION is not set | ||
| 1426 | # CONFIG_OSF_PARTITION is not set | ||
| 1427 | # CONFIG_AMIGA_PARTITION is not set | ||
| 1428 | # CONFIG_ATARI_PARTITION is not set | ||
| 1429 | CONFIG_MAC_PARTITION=y | ||
| 1430 | CONFIG_MSDOS_PARTITION=y | ||
| 1431 | # CONFIG_BSD_DISKLABEL is not set | ||
| 1432 | # CONFIG_MINIX_SUBPARTITION is not set | ||
| 1433 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
| 1434 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
| 1435 | # CONFIG_LDM_PARTITION is not set | ||
| 1436 | # CONFIG_SGI_PARTITION is not set | ||
| 1437 | # CONFIG_ULTRIX_PARTITION is not set | ||
| 1438 | # CONFIG_SUN_PARTITION is not set | ||
| 1439 | # CONFIG_KARMA_PARTITION is not set | ||
| 1440 | # CONFIG_EFI_PARTITION is not set | ||
| 1441 | # CONFIG_SYSV68_PARTITION is not set | ||
| 1442 | CONFIG_NLS=y | ||
| 1443 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
| 1444 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
| 1445 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
| 1446 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
| 1447 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
| 1448 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
| 1449 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
| 1450 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
| 1451 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
| 1452 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
| 1453 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
| 1454 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
| 1455 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
| 1456 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
| 1457 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
| 1458 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
| 1459 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
| 1460 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
| 1461 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
| 1462 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
| 1463 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
| 1464 | # CONFIG_NLS_ISO8859_8 is not set | ||
| 1465 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
| 1466 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
| 1467 | # CONFIG_NLS_ASCII is not set | ||
| 1468 | # CONFIG_NLS_ISO8859_1 is not set | ||
| 1469 | # CONFIG_NLS_ISO8859_2 is not set | ||
| 1470 | # CONFIG_NLS_ISO8859_3 is not set | ||
| 1471 | # CONFIG_NLS_ISO8859_4 is not set | ||
| 1472 | # CONFIG_NLS_ISO8859_5 is not set | ||
| 1473 | # CONFIG_NLS_ISO8859_6 is not set | ||
| 1474 | # CONFIG_NLS_ISO8859_7 is not set | ||
| 1475 | # CONFIG_NLS_ISO8859_9 is not set | ||
| 1476 | # CONFIG_NLS_ISO8859_13 is not set | ||
| 1477 | # CONFIG_NLS_ISO8859_14 is not set | ||
| 1478 | # CONFIG_NLS_ISO8859_15 is not set | ||
| 1479 | # CONFIG_NLS_KOI8_R is not set | ||
| 1480 | # CONFIG_NLS_KOI8_U is not set | ||
| 1481 | CONFIG_NLS_UTF8=m | ||
| 1482 | # CONFIG_DLM is not set | ||
| 1483 | |||
| 1484 | # | ||
| 1485 | # Library routines | ||
| 1486 | # | ||
| 1487 | CONFIG_BITREVERSE=y | ||
| 1488 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
| 1489 | # CONFIG_CRC_CCITT is not set | ||
| 1490 | # CONFIG_CRC16 is not set | ||
| 1491 | CONFIG_CRC_ITU_T=m | ||
| 1492 | CONFIG_CRC32=y | ||
| 1493 | # CONFIG_CRC7 is not set | ||
| 1494 | CONFIG_LIBCRC32C=m | ||
| 1495 | CONFIG_ZLIB_INFLATE=y | ||
| 1496 | CONFIG_PLIST=y | ||
| 1497 | CONFIG_HAS_IOMEM=y | ||
| 1498 | CONFIG_HAS_IOPORT=y | ||
| 1499 | CONFIG_HAS_DMA=y | ||
| 1500 | CONFIG_HAVE_LMB=y | ||
| 1501 | |||
| 1502 | # | ||
| 1503 | # Kernel hacking | ||
| 1504 | # | ||
| 1505 | # CONFIG_PRINTK_TIME is not set | ||
| 1506 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1507 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1508 | CONFIG_FRAME_WARN=1024 | ||
| 1509 | # CONFIG_MAGIC_SYSRQ is not set | ||
| 1510 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1511 | CONFIG_DEBUG_FS=y | ||
| 1512 | # CONFIG_HEADERS_CHECK is not set | ||
| 1513 | CONFIG_DEBUG_KERNEL=y | ||
| 1514 | # CONFIG_DEBUG_SHIRQ is not set | ||
| 1515 | CONFIG_DETECT_SOFTLOCKUP=y | ||
| 1516 | CONFIG_SCHED_DEBUG=y | ||
| 1517 | # CONFIG_SCHEDSTATS is not set | ||
| 1518 | # CONFIG_TIMER_STATS is not set | ||
| 1519 | # CONFIG_DEBUG_OBJECTS is not set | ||
| 1520 | # CONFIG_SLUB_DEBUG_ON is not set | ||
| 1521 | # CONFIG_SLUB_STATS is not set | ||
| 1522 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
| 1523 | # CONFIG_RT_MUTEX_TESTER is not set | ||
| 1524 | # CONFIG_DEBUG_SPINLOCK is not set | ||
| 1525 | # CONFIG_DEBUG_MUTEXES is not set | ||
| 1526 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
| 1527 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
| 1528 | # CONFIG_DEBUG_KOBJECT is not set | ||
| 1529 | # CONFIG_DEBUG_HIGHMEM is not set | ||
| 1530 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
| 1531 | CONFIG_DEBUG_INFO=y | ||
| 1532 | # CONFIG_DEBUG_VM is not set | ||
| 1533 | # CONFIG_DEBUG_WRITECOUNT is not set | ||
| 1534 | # CONFIG_DEBUG_LIST is not set | ||
| 1535 | # CONFIG_DEBUG_SG is not set | ||
| 1536 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
| 1537 | # CONFIG_RCU_TORTURE_TEST is not set | ||
| 1538 | # CONFIG_BACKTRACE_SELF_TEST is not set | ||
| 1539 | # CONFIG_FAULT_INJECTION is not set | ||
| 1540 | # CONFIG_SAMPLES is not set | ||
| 1541 | # CONFIG_DEBUG_STACKOVERFLOW is not set | ||
| 1542 | # CONFIG_DEBUG_STACK_USAGE is not set | ||
| 1543 | # CONFIG_DEBUG_PAGEALLOC is not set | ||
| 1544 | # CONFIG_DEBUGGER is not set | ||
| 1545 | # CONFIG_CODE_PATCHING_SELFTEST is not set | ||
| 1546 | # CONFIG_FTR_FIXUP_SELFTEST is not set | ||
| 1547 | # CONFIG_IRQSTACKS is not set | ||
| 1548 | # CONFIG_VIRQ_DEBUG is not set | ||
| 1549 | # CONFIG_BDI_SWITCH is not set | ||
| 1550 | # CONFIG_PPC_EARLY_DEBUG is not set | ||
| 1551 | |||
| 1552 | # | ||
| 1553 | # Security options | ||
| 1554 | # | ||
| 1555 | # CONFIG_KEYS is not set | ||
| 1556 | # CONFIG_SECURITY is not set | ||
| 1557 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1558 | CONFIG_CRYPTO=y | ||
| 1559 | |||
| 1560 | # | ||
| 1561 | # Crypto core or helper | ||
| 1562 | # | ||
| 1563 | CONFIG_CRYPTO_ALGAPI=y | ||
| 1564 | CONFIG_CRYPTO_BLKCIPHER=y | ||
| 1565 | CONFIG_CRYPTO_HASH=y | ||
| 1566 | CONFIG_CRYPTO_MANAGER=y | ||
| 1567 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1568 | # CONFIG_CRYPTO_NULL is not set | ||
| 1569 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1570 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1571 | # CONFIG_CRYPTO_TEST is not set | ||
| 1572 | |||
| 1573 | # | ||
| 1574 | # Authenticated Encryption with Associated Data | ||
| 1575 | # | ||
| 1576 | # CONFIG_CRYPTO_CCM is not set | ||
| 1577 | # CONFIG_CRYPTO_GCM is not set | ||
| 1578 | # CONFIG_CRYPTO_SEQIV is not set | ||
| 1579 | |||
| 1580 | # | ||
| 1581 | # Block modes | ||
| 1582 | # | ||
| 1583 | CONFIG_CRYPTO_CBC=y | ||
| 1584 | # CONFIG_CRYPTO_CTR is not set | ||
| 1585 | # CONFIG_CRYPTO_CTS is not set | ||
| 1586 | # CONFIG_CRYPTO_ECB is not set | ||
| 1587 | # CONFIG_CRYPTO_LRW is not set | ||
| 1588 | CONFIG_CRYPTO_PCBC=m | ||
| 1589 | # CONFIG_CRYPTO_XTS is not set | ||
| 1590 | |||
| 1591 | # | ||
| 1592 | # Hash modes | ||
| 1593 | # | ||
| 1594 | CONFIG_CRYPTO_HMAC=y | ||
| 1595 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1596 | |||
| 1597 | # | ||
| 1598 | # Digest | ||
| 1599 | # | ||
| 1600 | # CONFIG_CRYPTO_CRC32C is not set | ||
| 1601 | # CONFIG_CRYPTO_MD4 is not set | ||
| 1602 | CONFIG_CRYPTO_MD5=y | ||
| 1603 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
| 1604 | CONFIG_CRYPTO_SHA1=m | ||
| 1605 | # CONFIG_CRYPTO_SHA256 is not set | ||
| 1606 | # CONFIG_CRYPTO_SHA512 is not set | ||
| 1607 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1608 | # CONFIG_CRYPTO_WP512 is not set | ||
| 1609 | |||
| 1610 | # | ||
| 1611 | # Ciphers | ||
| 1612 | # | ||
| 1613 | # CONFIG_CRYPTO_AES is not set | ||
| 1614 | # CONFIG_CRYPTO_ANUBIS is not set | ||
| 1615 | # CONFIG_CRYPTO_ARC4 is not set | ||
| 1616 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
| 1617 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
| 1618 | # CONFIG_CRYPTO_CAST5 is not set | ||
| 1619 | # CONFIG_CRYPTO_CAST6 is not set | ||
| 1620 | CONFIG_CRYPTO_DES=y | ||
| 1621 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1622 | # CONFIG_CRYPTO_KHAZAD is not set | ||
| 1623 | # CONFIG_CRYPTO_SALSA20 is not set | ||
| 1624 | # CONFIG_CRYPTO_SEED is not set | ||
| 1625 | # CONFIG_CRYPTO_SERPENT is not set | ||
| 1626 | # CONFIG_CRYPTO_TEA is not set | ||
| 1627 | # CONFIG_CRYPTO_TWOFISH is not set | ||
| 1628 | |||
| 1629 | # | ||
| 1630 | # Compression | ||
| 1631 | # | ||
| 1632 | # CONFIG_CRYPTO_DEFLATE is not set | ||
| 1633 | # CONFIG_CRYPTO_LZO is not set | ||
| 1634 | CONFIG_CRYPTO_HW=y | ||
| 1635 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set | ||
| 1636 | # CONFIG_PPC_CLOCK is not set | ||
| 1637 | # CONFIG_VIRTUALIZATION is not set | ||
diff --git a/arch/powerpc/configs/ppc44x_defconfig b/arch/powerpc/configs/ppc44x_defconfig index 12f9b5a80220..f9d279bb700b 100644 --- a/arch/powerpc/configs/ppc44x_defconfig +++ b/arch/powerpc/configs/ppc44x_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.25-rc6 | 3 | # Linux kernel version: 2.6.26-rc8 |
| 4 | # Sat Apr 5 09:35:48 2008 | 4 | # Wed Jul 9 13:50:48 2008 |
| 5 | # | 5 | # |
| 6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
| 7 | 7 | ||
| @@ -32,6 +32,8 @@ CONFIG_GENERIC_CLOCKEVENTS=y | |||
| 32 | CONFIG_GENERIC_HARDIRQS=y | 32 | CONFIG_GENERIC_HARDIRQS=y |
| 33 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set | 33 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set |
| 34 | CONFIG_IRQ_PER_CPU=y | 34 | CONFIG_IRQ_PER_CPU=y |
| 35 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 36 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 35 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 37 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
| 36 | CONFIG_ARCH_HAS_ILOG2_U32=y | 38 | CONFIG_ARCH_HAS_ILOG2_U32=y |
| 37 | CONFIG_GENERIC_HWEIGHT=y | 39 | CONFIG_GENERIC_HWEIGHT=y |
| @@ -88,6 +90,7 @@ CONFIG_INITRAMFS_SOURCE="" | |||
| 88 | CONFIG_SYSCTL=y | 90 | CONFIG_SYSCTL=y |
| 89 | CONFIG_EMBEDDED=y | 91 | CONFIG_EMBEDDED=y |
| 90 | CONFIG_SYSCTL_SYSCALL=y | 92 | CONFIG_SYSCTL_SYSCALL=y |
| 93 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 91 | CONFIG_KALLSYMS=y | 94 | CONFIG_KALLSYMS=y |
| 92 | CONFIG_KALLSYMS_ALL=y | 95 | CONFIG_KALLSYMS_ALL=y |
| 93 | CONFIG_KALLSYMS_EXTRA_PASS=y | 96 | CONFIG_KALLSYMS_EXTRA_PASS=y |
| @@ -115,12 +118,14 @@ CONFIG_HAVE_OPROFILE=y | |||
| 115 | # CONFIG_KPROBES is not set | 118 | # CONFIG_KPROBES is not set |
| 116 | CONFIG_HAVE_KPROBES=y | 119 | CONFIG_HAVE_KPROBES=y |
| 117 | CONFIG_HAVE_KRETPROBES=y | 120 | CONFIG_HAVE_KRETPROBES=y |
| 121 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
| 118 | CONFIG_PROC_PAGE_MONITOR=y | 122 | CONFIG_PROC_PAGE_MONITOR=y |
| 119 | CONFIG_SLABINFO=y | 123 | CONFIG_SLABINFO=y |
| 120 | CONFIG_RT_MUTEXES=y | 124 | CONFIG_RT_MUTEXES=y |
| 121 | # CONFIG_TINY_SHMEM is not set | 125 | # CONFIG_TINY_SHMEM is not set |
| 122 | CONFIG_BASE_SMALL=0 | 126 | CONFIG_BASE_SMALL=0 |
| 123 | CONFIG_MODULES=y | 127 | CONFIG_MODULES=y |
| 128 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
| 124 | CONFIG_MODULE_UNLOAD=y | 129 | CONFIG_MODULE_UNLOAD=y |
| 125 | # CONFIG_MODULE_FORCE_UNLOAD is not set | 130 | # CONFIG_MODULE_FORCE_UNLOAD is not set |
| 126 | # CONFIG_MODVERSIONS is not set | 131 | # CONFIG_MODVERSIONS is not set |
| @@ -157,6 +162,7 @@ CONFIG_PPC4xx_PCI_EXPRESS=y | |||
| 157 | # CONFIG_PQ2ADS is not set | 162 | # CONFIG_PQ2ADS is not set |
| 158 | CONFIG_BAMBOO=y | 163 | CONFIG_BAMBOO=y |
| 159 | CONFIG_EBONY=y | 164 | CONFIG_EBONY=y |
| 165 | CONFIG_SAM440EP=y | ||
| 160 | CONFIG_SEQUOIA=y | 166 | CONFIG_SEQUOIA=y |
| 161 | CONFIG_TAISHAN=y | 167 | CONFIG_TAISHAN=y |
| 162 | CONFIG_KATMAI=y | 168 | CONFIG_KATMAI=y |
| @@ -164,6 +170,7 @@ CONFIG_RAINIER=y | |||
| 164 | CONFIG_WARP=y | 170 | CONFIG_WARP=y |
| 165 | CONFIG_CANYONLANDS=y | 171 | CONFIG_CANYONLANDS=y |
| 166 | CONFIG_YOSEMITE=y | 172 | CONFIG_YOSEMITE=y |
| 173 | CONFIG_XILINX_VIRTEX440_GENERIC_BOARD=y | ||
| 167 | CONFIG_440EP=y | 174 | CONFIG_440EP=y |
| 168 | CONFIG_440EPX=y | 175 | CONFIG_440EPX=y |
| 169 | CONFIG_440GRX=y | 176 | CONFIG_440GRX=y |
| @@ -172,6 +179,8 @@ CONFIG_440GX=y | |||
| 172 | CONFIG_440SPe=y | 179 | CONFIG_440SPe=y |
| 173 | CONFIG_460EX=y | 180 | CONFIG_460EX=y |
| 174 | CONFIG_IBM440EP_ERR42=y | 181 | CONFIG_IBM440EP_ERR42=y |
| 182 | CONFIG_XILINX_VIRTEX=y | ||
| 183 | CONFIG_XILINX_VIRTEX_5_FXT=y | ||
| 175 | # CONFIG_IPIC is not set | 184 | # CONFIG_IPIC is not set |
| 176 | # CONFIG_MPIC is not set | 185 | # CONFIG_MPIC is not set |
| 177 | # CONFIG_MPIC_WEIRD is not set | 186 | # CONFIG_MPIC_WEIRD is not set |
| @@ -220,13 +229,16 @@ CONFIG_FLATMEM=y | |||
| 220 | CONFIG_FLAT_NODE_MEM_MAP=y | 229 | CONFIG_FLAT_NODE_MEM_MAP=y |
| 221 | # CONFIG_SPARSEMEM_STATIC is not set | 230 | # CONFIG_SPARSEMEM_STATIC is not set |
| 222 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | 231 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set |
| 232 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
| 223 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 233 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
| 224 | CONFIG_RESOURCES_64BIT=y | 234 | CONFIG_RESOURCES_64BIT=y |
| 225 | CONFIG_ZONE_DMA_FLAG=1 | 235 | CONFIG_ZONE_DMA_FLAG=1 |
| 226 | CONFIG_BOUNCE=y | 236 | CONFIG_BOUNCE=y |
| 227 | CONFIG_VIRT_TO_BUS=y | 237 | CONFIG_VIRT_TO_BUS=y |
| 238 | CONFIG_FORCE_MAX_ZONEORDER=11 | ||
| 228 | CONFIG_PROC_DEVICETREE=y | 239 | CONFIG_PROC_DEVICETREE=y |
| 229 | # CONFIG_CMDLINE_BOOL is not set | 240 | # CONFIG_CMDLINE_BOOL is not set |
| 241 | CONFIG_EXTRA_TARGETS="" | ||
| 230 | CONFIG_SECCOMP=y | 242 | CONFIG_SECCOMP=y |
| 231 | CONFIG_ISA_DMA_API=y | 243 | CONFIG_ISA_DMA_API=y |
| 232 | 244 | ||
| @@ -246,6 +258,7 @@ CONFIG_PCI_LEGACY=y | |||
| 246 | # CONFIG_PCI_DEBUG is not set | 258 | # CONFIG_PCI_DEBUG is not set |
| 247 | # CONFIG_PCCARD is not set | 259 | # CONFIG_PCCARD is not set |
| 248 | # CONFIG_HOTPLUG_PCI is not set | 260 | # CONFIG_HOTPLUG_PCI is not set |
| 261 | # CONFIG_HAS_RAPIDIO is not set | ||
| 249 | 262 | ||
| 250 | # | 263 | # |
| 251 | # Advanced setup | 264 | # Advanced setup |
| @@ -255,13 +268,13 @@ CONFIG_PCI_LEGACY=y | |||
| 255 | # | 268 | # |
| 256 | # Default settings for advanced configuration options are used | 269 | # Default settings for advanced configuration options are used |
| 257 | # | 270 | # |
| 258 | CONFIG_HIGHMEM_START=0xfe000000 | ||
| 259 | CONFIG_LOWMEM_SIZE=0x30000000 | 271 | CONFIG_LOWMEM_SIZE=0x30000000 |
| 272 | CONFIG_PAGE_OFFSET=0xc0000000 | ||
| 260 | CONFIG_KERNEL_START=0xc0000000 | 273 | CONFIG_KERNEL_START=0xc0000000 |
| 274 | CONFIG_PHYSICAL_START=0x00000000 | ||
| 261 | CONFIG_TASK_SIZE=0xc0000000 | 275 | CONFIG_TASK_SIZE=0xc0000000 |
| 262 | CONFIG_CONSISTENT_START=0xff100000 | 276 | CONFIG_CONSISTENT_START=0xff100000 |
| 263 | CONFIG_CONSISTENT_SIZE=0x00200000 | 277 | CONFIG_CONSISTENT_SIZE=0x00200000 |
| 264 | CONFIG_BOOT_LOAD=0x01000000 | ||
| 265 | 278 | ||
| 266 | # | 279 | # |
| 267 | # Networking | 280 | # Networking |
| @@ -303,8 +316,6 @@ CONFIG_TCP_CONG_CUBIC=y | |||
| 303 | CONFIG_DEFAULT_TCP_CONG="cubic" | 316 | CONFIG_DEFAULT_TCP_CONG="cubic" |
| 304 | # CONFIG_TCP_MD5SIG is not set | 317 | # CONFIG_TCP_MD5SIG is not set |
| 305 | # CONFIG_IPV6 is not set | 318 | # CONFIG_IPV6 is not set |
| 306 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
| 307 | # CONFIG_INET6_TUNNEL is not set | ||
| 308 | # CONFIG_NETWORK_SECMARK is not set | 319 | # CONFIG_NETWORK_SECMARK is not set |
| 309 | # CONFIG_NETFILTER is not set | 320 | # CONFIG_NETFILTER is not set |
| 310 | # CONFIG_IP_DCCP is not set | 321 | # CONFIG_IP_DCCP is not set |
| @@ -366,6 +377,7 @@ CONFIG_MTD_PARTITIONS=y | |||
| 366 | # CONFIG_MTD_REDBOOT_PARTS is not set | 377 | # CONFIG_MTD_REDBOOT_PARTS is not set |
| 367 | # CONFIG_MTD_CMDLINE_PARTS is not set | 378 | # CONFIG_MTD_CMDLINE_PARTS is not set |
| 368 | CONFIG_MTD_OF_PARTS=y | 379 | CONFIG_MTD_OF_PARTS=y |
| 380 | # CONFIG_MTD_AR7_PARTS is not set | ||
| 369 | 381 | ||
| 370 | # | 382 | # |
| 371 | # User Modules And Translation Layers | 383 | # User Modules And Translation Layers |
| @@ -478,6 +490,10 @@ CONFIG_HAVE_IDE=y | |||
| 478 | # | 490 | # |
| 479 | # IEEE 1394 (FireWire) support | 491 | # IEEE 1394 (FireWire) support |
| 480 | # | 492 | # |
| 493 | |||
| 494 | # | ||
| 495 | # Enable only one of the two stacks, unless you know what you are doing | ||
| 496 | # | ||
| 481 | # CONFIG_FIREWIRE is not set | 497 | # CONFIG_FIREWIRE is not set |
| 482 | # CONFIG_IEEE1394 is not set | 498 | # CONFIG_IEEE1394 is not set |
| 483 | # CONFIG_I2O is not set | 499 | # CONFIG_I2O is not set |
| @@ -528,7 +544,6 @@ CONFIG_NETDEV_1000=y | |||
| 528 | # CONFIG_SIS190 is not set | 544 | # CONFIG_SIS190 is not set |
| 529 | # CONFIG_SKGE is not set | 545 | # CONFIG_SKGE is not set |
| 530 | # CONFIG_SKY2 is not set | 546 | # CONFIG_SKY2 is not set |
| 531 | # CONFIG_SK98LIN is not set | ||
| 532 | # CONFIG_VIA_VELOCITY is not set | 547 | # CONFIG_VIA_VELOCITY is not set |
| 533 | # CONFIG_TIGON3 is not set | 548 | # CONFIG_TIGON3 is not set |
| 534 | # CONFIG_BNX2 is not set | 549 | # CONFIG_BNX2 is not set |
| @@ -546,6 +561,7 @@ CONFIG_NETDEV_10000=y | |||
| 546 | # CONFIG_MLX4_CORE is not set | 561 | # CONFIG_MLX4_CORE is not set |
| 547 | # CONFIG_TEHUTI is not set | 562 | # CONFIG_TEHUTI is not set |
| 548 | # CONFIG_BNX2X is not set | 563 | # CONFIG_BNX2X is not set |
| 564 | # CONFIG_SFC is not set | ||
| 549 | # CONFIG_TR is not set | 565 | # CONFIG_TR is not set |
| 550 | 566 | ||
| 551 | # | 567 | # |
| @@ -553,6 +569,7 @@ CONFIG_NETDEV_10000=y | |||
| 553 | # | 569 | # |
| 554 | # CONFIG_WLAN_PRE80211 is not set | 570 | # CONFIG_WLAN_PRE80211 is not set |
| 555 | # CONFIG_WLAN_80211 is not set | 571 | # CONFIG_WLAN_80211 is not set |
| 572 | # CONFIG_IWLWIFI_LEDS is not set | ||
| 556 | # CONFIG_WAN is not set | 573 | # CONFIG_WAN is not set |
| 557 | # CONFIG_FDDI is not set | 574 | # CONFIG_FDDI is not set |
| 558 | # CONFIG_HIPPI is not set | 575 | # CONFIG_HIPPI is not set |
| @@ -579,6 +596,7 @@ CONFIG_NETDEV_10000=y | |||
| 579 | # Character devices | 596 | # Character devices |
| 580 | # | 597 | # |
| 581 | # CONFIG_VT is not set | 598 | # CONFIG_VT is not set |
| 599 | CONFIG_DEVKMEM=y | ||
| 582 | # CONFIG_SERIAL_NONSTANDARD is not set | 600 | # CONFIG_SERIAL_NONSTANDARD is not set |
| 583 | # CONFIG_NOZOMI is not set | 601 | # CONFIG_NOZOMI is not set |
| 584 | 602 | ||
| @@ -611,22 +629,19 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
| 611 | # CONFIG_HW_RANDOM is not set | 629 | # CONFIG_HW_RANDOM is not set |
| 612 | # CONFIG_NVRAM is not set | 630 | # CONFIG_NVRAM is not set |
| 613 | # CONFIG_GEN_RTC is not set | 631 | # CONFIG_GEN_RTC is not set |
| 632 | CONFIG_XILINX_HWICAP=m | ||
| 614 | # CONFIG_R3964 is not set | 633 | # CONFIG_R3964 is not set |
| 615 | # CONFIG_APPLICOM is not set | 634 | # CONFIG_APPLICOM is not set |
| 616 | # CONFIG_RAW_DRIVER is not set | 635 | # CONFIG_RAW_DRIVER is not set |
| 617 | # CONFIG_TCG_TPM is not set | 636 | # CONFIG_TCG_TPM is not set |
| 618 | CONFIG_DEVPORT=y | 637 | CONFIG_DEVPORT=y |
| 619 | # CONFIG_I2C is not set | 638 | # CONFIG_I2C is not set |
| 620 | |||
| 621 | # | ||
| 622 | # SPI support | ||
| 623 | # | ||
| 624 | # CONFIG_SPI is not set | 639 | # CONFIG_SPI is not set |
| 625 | # CONFIG_SPI_MASTER is not set | ||
| 626 | # CONFIG_W1 is not set | 640 | # CONFIG_W1 is not set |
| 627 | # CONFIG_POWER_SUPPLY is not set | 641 | # CONFIG_POWER_SUPPLY is not set |
| 628 | # CONFIG_HWMON is not set | 642 | # CONFIG_HWMON is not set |
| 629 | # CONFIG_THERMAL is not set | 643 | # CONFIG_THERMAL is not set |
| 644 | # CONFIG_THERMAL_HWMON is not set | ||
| 630 | # CONFIG_WATCHDOG is not set | 645 | # CONFIG_WATCHDOG is not set |
| 631 | 646 | ||
| 632 | # | 647 | # |
| @@ -639,12 +654,22 @@ CONFIG_SSB_POSSIBLE=y | |||
| 639 | # Multifunction device drivers | 654 | # Multifunction device drivers |
| 640 | # | 655 | # |
| 641 | # CONFIG_MFD_SM501 is not set | 656 | # CONFIG_MFD_SM501 is not set |
| 657 | # CONFIG_HTC_PASIC3 is not set | ||
| 642 | 658 | ||
| 643 | # | 659 | # |
| 644 | # Multimedia devices | 660 | # Multimedia devices |
| 645 | # | 661 | # |
| 662 | |||
| 663 | # | ||
| 664 | # Multimedia core support | ||
| 665 | # | ||
| 646 | # CONFIG_VIDEO_DEV is not set | 666 | # CONFIG_VIDEO_DEV is not set |
| 647 | # CONFIG_DVB_CORE is not set | 667 | # CONFIG_DVB_CORE is not set |
| 668 | # CONFIG_VIDEO_MEDIA is not set | ||
| 669 | |||
| 670 | # | ||
| 671 | # Multimedia drivers | ||
| 672 | # | ||
| 648 | # CONFIG_DAB is not set | 673 | # CONFIG_DAB is not set |
| 649 | 674 | ||
| 650 | # | 675 | # |
| @@ -671,6 +696,8 @@ CONFIG_USB_ARCH_HAS_HCD=y | |||
| 671 | CONFIG_USB_ARCH_HAS_OHCI=y | 696 | CONFIG_USB_ARCH_HAS_OHCI=y |
| 672 | CONFIG_USB_ARCH_HAS_EHCI=y | 697 | CONFIG_USB_ARCH_HAS_EHCI=y |
| 673 | # CONFIG_USB is not set | 698 | # CONFIG_USB is not set |
| 699 | # CONFIG_USB_OTG_WHITELIST is not set | ||
| 700 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | ||
| 674 | 701 | ||
| 675 | # | 702 | # |
| 676 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 703 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' |
| @@ -679,14 +706,11 @@ CONFIG_USB_ARCH_HAS_EHCI=y | |||
| 679 | # CONFIG_MMC is not set | 706 | # CONFIG_MMC is not set |
| 680 | # CONFIG_MEMSTICK is not set | 707 | # CONFIG_MEMSTICK is not set |
| 681 | # CONFIG_NEW_LEDS is not set | 708 | # CONFIG_NEW_LEDS is not set |
| 709 | # CONFIG_ACCESSIBILITY is not set | ||
| 682 | # CONFIG_INFINIBAND is not set | 710 | # CONFIG_INFINIBAND is not set |
| 683 | # CONFIG_EDAC is not set | 711 | # CONFIG_EDAC is not set |
| 684 | # CONFIG_RTC_CLASS is not set | 712 | # CONFIG_RTC_CLASS is not set |
| 685 | # CONFIG_DMADEVICES is not set | 713 | # CONFIG_DMADEVICES is not set |
| 686 | |||
| 687 | # | ||
| 688 | # Userspace I/O | ||
| 689 | # | ||
| 690 | # CONFIG_UIO is not set | 714 | # CONFIG_UIO is not set |
| 691 | 715 | ||
| 692 | # | 716 | # |
| @@ -701,7 +725,6 @@ CONFIG_EXT2_FS=y | |||
| 701 | # CONFIG_JFS_FS is not set | 725 | # CONFIG_JFS_FS is not set |
| 702 | # CONFIG_FS_POSIX_ACL is not set | 726 | # CONFIG_FS_POSIX_ACL is not set |
| 703 | # CONFIG_XFS_FS is not set | 727 | # CONFIG_XFS_FS is not set |
| 704 | # CONFIG_GFS2_FS is not set | ||
| 705 | # CONFIG_OCFS2_FS is not set | 728 | # CONFIG_OCFS2_FS is not set |
| 706 | CONFIG_DNOTIFY=y | 729 | CONFIG_DNOTIFY=y |
| 707 | CONFIG_INOTIFY=y | 730 | CONFIG_INOTIFY=y |
| @@ -770,7 +793,6 @@ CONFIG_NFS_FS=y | |||
| 770 | CONFIG_NFS_V3=y | 793 | CONFIG_NFS_V3=y |
| 771 | # CONFIG_NFS_V3_ACL is not set | 794 | # CONFIG_NFS_V3_ACL is not set |
| 772 | # CONFIG_NFS_V4 is not set | 795 | # CONFIG_NFS_V4 is not set |
| 773 | # CONFIG_NFS_DIRECTIO is not set | ||
| 774 | # CONFIG_NFSD is not set | 796 | # CONFIG_NFSD is not set |
| 775 | CONFIG_ROOT_NFS=y | 797 | CONFIG_ROOT_NFS=y |
| 776 | CONFIG_LOCKD=y | 798 | CONFIG_LOCKD=y |
| @@ -798,6 +820,7 @@ CONFIG_MSDOS_PARTITION=y | |||
| 798 | # Library routines | 820 | # Library routines |
| 799 | # | 821 | # |
| 800 | CONFIG_BITREVERSE=y | 822 | CONFIG_BITREVERSE=y |
| 823 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
| 801 | # CONFIG_CRC_CCITT is not set | 824 | # CONFIG_CRC_CCITT is not set |
| 802 | # CONFIG_CRC16 is not set | 825 | # CONFIG_CRC16 is not set |
| 803 | # CONFIG_CRC_ITU_T is not set | 826 | # CONFIG_CRC_ITU_T is not set |
| @@ -818,6 +841,7 @@ CONFIG_HAVE_LMB=y | |||
| 818 | # CONFIG_PRINTK_TIME is not set | 841 | # CONFIG_PRINTK_TIME is not set |
| 819 | CONFIG_ENABLE_WARN_DEPRECATED=y | 842 | CONFIG_ENABLE_WARN_DEPRECATED=y |
| 820 | CONFIG_ENABLE_MUST_CHECK=y | 843 | CONFIG_ENABLE_MUST_CHECK=y |
| 844 | CONFIG_FRAME_WARN=1024 | ||
| 821 | CONFIG_MAGIC_SYSRQ=y | 845 | CONFIG_MAGIC_SYSRQ=y |
| 822 | # CONFIG_UNUSED_SYMBOLS is not set | 846 | # CONFIG_UNUSED_SYMBOLS is not set |
| 823 | # CONFIG_DEBUG_FS is not set | 847 | # CONFIG_DEBUG_FS is not set |
| @@ -828,6 +852,7 @@ CONFIG_DETECT_SOFTLOCKUP=y | |||
| 828 | CONFIG_SCHED_DEBUG=y | 852 | CONFIG_SCHED_DEBUG=y |
| 829 | # CONFIG_SCHEDSTATS is not set | 853 | # CONFIG_SCHEDSTATS is not set |
| 830 | # CONFIG_TIMER_STATS is not set | 854 | # CONFIG_TIMER_STATS is not set |
| 855 | # CONFIG_DEBUG_OBJECTS is not set | ||
| 831 | # CONFIG_SLUB_DEBUG_ON is not set | 856 | # CONFIG_SLUB_DEBUG_ON is not set |
| 832 | # CONFIG_SLUB_STATS is not set | 857 | # CONFIG_SLUB_STATS is not set |
| 833 | # CONFIG_DEBUG_RT_MUTEXES is not set | 858 | # CONFIG_DEBUG_RT_MUTEXES is not set |
| @@ -840,6 +865,7 @@ CONFIG_SCHED_DEBUG=y | |||
| 840 | CONFIG_DEBUG_BUGVERBOSE=y | 865 | CONFIG_DEBUG_BUGVERBOSE=y |
| 841 | # CONFIG_DEBUG_INFO is not set | 866 | # CONFIG_DEBUG_INFO is not set |
| 842 | # CONFIG_DEBUG_VM is not set | 867 | # CONFIG_DEBUG_VM is not set |
| 868 | # CONFIG_DEBUG_WRITECOUNT is not set | ||
| 843 | # CONFIG_DEBUG_LIST is not set | 869 | # CONFIG_DEBUG_LIST is not set |
| 844 | # CONFIG_DEBUG_SG is not set | 870 | # CONFIG_DEBUG_SG is not set |
| 845 | # CONFIG_BOOT_PRINTK_DELAY is not set | 871 | # CONFIG_BOOT_PRINTK_DELAY is not set |
| @@ -851,6 +877,9 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
| 851 | # CONFIG_DEBUG_STACK_USAGE is not set | 877 | # CONFIG_DEBUG_STACK_USAGE is not set |
| 852 | # CONFIG_DEBUG_PAGEALLOC is not set | 878 | # CONFIG_DEBUG_PAGEALLOC is not set |
| 853 | # CONFIG_DEBUGGER is not set | 879 | # CONFIG_DEBUGGER is not set |
| 880 | # CONFIG_CODE_PATCHING_SELFTEST is not set | ||
| 881 | # CONFIG_FTR_FIXUP_SELFTEST is not set | ||
| 882 | # CONFIG_IRQSTACKS is not set | ||
| 854 | # CONFIG_BDI_SWITCH is not set | 883 | # CONFIG_BDI_SWITCH is not set |
| 855 | # CONFIG_PPC_EARLY_DEBUG is not set | 884 | # CONFIG_PPC_EARLY_DEBUG is not set |
| 856 | 885 | ||
| @@ -861,50 +890,80 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
| 861 | # CONFIG_SECURITY is not set | 890 | # CONFIG_SECURITY is not set |
| 862 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 891 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set |
| 863 | CONFIG_CRYPTO=y | 892 | CONFIG_CRYPTO=y |
| 893 | |||
| 894 | # | ||
| 895 | # Crypto core or helper | ||
| 896 | # | ||
| 864 | CONFIG_CRYPTO_ALGAPI=y | 897 | CONFIG_CRYPTO_ALGAPI=y |
| 865 | CONFIG_CRYPTO_BLKCIPHER=y | 898 | CONFIG_CRYPTO_BLKCIPHER=y |
| 866 | # CONFIG_CRYPTO_SEQIV is not set | ||
| 867 | CONFIG_CRYPTO_MANAGER=y | 899 | CONFIG_CRYPTO_MANAGER=y |
| 900 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 901 | # CONFIG_CRYPTO_NULL is not set | ||
| 902 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 903 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 904 | # CONFIG_CRYPTO_TEST is not set | ||
| 905 | |||
| 906 | # | ||
| 907 | # Authenticated Encryption with Associated Data | ||
| 908 | # | ||
| 909 | # CONFIG_CRYPTO_CCM is not set | ||
| 910 | # CONFIG_CRYPTO_GCM is not set | ||
| 911 | # CONFIG_CRYPTO_SEQIV is not set | ||
| 912 | |||
| 913 | # | ||
| 914 | # Block modes | ||
| 915 | # | ||
| 916 | CONFIG_CRYPTO_CBC=y | ||
| 917 | # CONFIG_CRYPTO_CTR is not set | ||
| 918 | # CONFIG_CRYPTO_CTS is not set | ||
| 919 | CONFIG_CRYPTO_ECB=y | ||
| 920 | # CONFIG_CRYPTO_LRW is not set | ||
| 921 | CONFIG_CRYPTO_PCBC=y | ||
| 922 | # CONFIG_CRYPTO_XTS is not set | ||
| 923 | |||
| 924 | # | ||
| 925 | # Hash modes | ||
| 926 | # | ||
| 868 | # CONFIG_CRYPTO_HMAC is not set | 927 | # CONFIG_CRYPTO_HMAC is not set |
| 869 | # CONFIG_CRYPTO_XCBC is not set | 928 | # CONFIG_CRYPTO_XCBC is not set |
| 870 | # CONFIG_CRYPTO_NULL is not set | 929 | |
| 930 | # | ||
| 931 | # Digest | ||
| 932 | # | ||
| 933 | # CONFIG_CRYPTO_CRC32C is not set | ||
| 871 | # CONFIG_CRYPTO_MD4 is not set | 934 | # CONFIG_CRYPTO_MD4 is not set |
| 872 | CONFIG_CRYPTO_MD5=y | 935 | CONFIG_CRYPTO_MD5=y |
| 936 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
| 873 | # CONFIG_CRYPTO_SHA1 is not set | 937 | # CONFIG_CRYPTO_SHA1 is not set |
| 874 | # CONFIG_CRYPTO_SHA256 is not set | 938 | # CONFIG_CRYPTO_SHA256 is not set |
| 875 | # CONFIG_CRYPTO_SHA512 is not set | 939 | # CONFIG_CRYPTO_SHA512 is not set |
| 876 | # CONFIG_CRYPTO_WP512 is not set | ||
| 877 | # CONFIG_CRYPTO_TGR192 is not set | 940 | # CONFIG_CRYPTO_TGR192 is not set |
| 878 | # CONFIG_CRYPTO_GF128MUL is not set | 941 | # CONFIG_CRYPTO_WP512 is not set |
| 879 | CONFIG_CRYPTO_ECB=y | 942 | |
| 880 | CONFIG_CRYPTO_CBC=y | 943 | # |
| 881 | CONFIG_CRYPTO_PCBC=y | 944 | # Ciphers |
| 882 | # CONFIG_CRYPTO_LRW is not set | 945 | # |
| 883 | # CONFIG_CRYPTO_XTS is not set | ||
| 884 | # CONFIG_CRYPTO_CTR is not set | ||
| 885 | # CONFIG_CRYPTO_GCM is not set | ||
| 886 | # CONFIG_CRYPTO_CCM is not set | ||
| 887 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 888 | CONFIG_CRYPTO_DES=y | ||
| 889 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 890 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
| 891 | # CONFIG_CRYPTO_TWOFISH is not set | ||
| 892 | # CONFIG_CRYPTO_SERPENT is not set | ||
| 893 | # CONFIG_CRYPTO_AES is not set | 946 | # CONFIG_CRYPTO_AES is not set |
| 947 | # CONFIG_CRYPTO_ANUBIS is not set | ||
| 948 | # CONFIG_CRYPTO_ARC4 is not set | ||
| 949 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
| 950 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
| 894 | # CONFIG_CRYPTO_CAST5 is not set | 951 | # CONFIG_CRYPTO_CAST5 is not set |
| 895 | # CONFIG_CRYPTO_CAST6 is not set | 952 | # CONFIG_CRYPTO_CAST6 is not set |
| 896 | # CONFIG_CRYPTO_TEA is not set | 953 | CONFIG_CRYPTO_DES=y |
| 897 | # CONFIG_CRYPTO_ARC4 is not set | 954 | # CONFIG_CRYPTO_FCRYPT is not set |
| 898 | # CONFIG_CRYPTO_KHAZAD is not set | 955 | # CONFIG_CRYPTO_KHAZAD is not set |
| 899 | # CONFIG_CRYPTO_ANUBIS is not set | ||
| 900 | # CONFIG_CRYPTO_SEED is not set | ||
| 901 | # CONFIG_CRYPTO_SALSA20 is not set | 956 | # CONFIG_CRYPTO_SALSA20 is not set |
| 957 | # CONFIG_CRYPTO_SEED is not set | ||
| 958 | # CONFIG_CRYPTO_SERPENT is not set | ||
| 959 | # CONFIG_CRYPTO_TEA is not set | ||
| 960 | # CONFIG_CRYPTO_TWOFISH is not set | ||
| 961 | |||
| 962 | # | ||
| 963 | # Compression | ||
| 964 | # | ||
| 902 | # CONFIG_CRYPTO_DEFLATE is not set | 965 | # CONFIG_CRYPTO_DEFLATE is not set |
| 903 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
| 904 | # CONFIG_CRYPTO_CRC32C is not set | ||
| 905 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
| 906 | # CONFIG_CRYPTO_TEST is not set | ||
| 907 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 908 | # CONFIG_CRYPTO_LZO is not set | 966 | # CONFIG_CRYPTO_LZO is not set |
| 909 | # CONFIG_CRYPTO_HW is not set | 967 | # CONFIG_CRYPTO_HW is not set |
| 910 | # CONFIG_PPC_CLOCK is not set | 968 | # CONFIG_PPC_CLOCK is not set |
| 969 | # CONFIG_VIRTUALIZATION is not set | ||
diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c index c95954c81454..f22b5d0a4a97 100644 --- a/arch/powerpc/kernel/align.c +++ b/arch/powerpc/kernel/align.c | |||
| @@ -363,8 +363,8 @@ static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr, | |||
| 363 | * Only POWER6 has these instructions, and it does true little-endian, | 363 | * Only POWER6 has these instructions, and it does true little-endian, |
| 364 | * so we don't need the address swizzling. | 364 | * so we don't need the address swizzling. |
| 365 | */ | 365 | */ |
| 366 | static int emulate_fp_pair(struct pt_regs *regs, unsigned char __user *addr, | 366 | static int emulate_fp_pair(unsigned char __user *addr, unsigned int reg, |
| 367 | unsigned int reg, unsigned int flags) | 367 | unsigned int flags) |
| 368 | { | 368 | { |
| 369 | char *ptr = (char *) ¤t->thread.TS_FPR(reg); | 369 | char *ptr = (char *) ¤t->thread.TS_FPR(reg); |
| 370 | int i, ret; | 370 | int i, ret; |
| @@ -759,7 +759,7 @@ int fix_alignment(struct pt_regs *regs) | |||
| 759 | 759 | ||
| 760 | /* Special case for 16-byte FP loads and stores */ | 760 | /* Special case for 16-byte FP loads and stores */ |
| 761 | if (nb == 16) | 761 | if (nb == 16) |
| 762 | return emulate_fp_pair(regs, addr, reg, flags); | 762 | return emulate_fp_pair(addr, reg, flags); |
| 763 | 763 | ||
| 764 | /* If we are loading, get the data from user space, else | 764 | /* If we are loading, get the data from user space, else |
| 765 | * get it from register values | 765 | * get it from register values |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 817cea1b5ad3..72adb19a204d 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
| @@ -1447,6 +1447,16 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
| 1447 | .machine_check = machine_check_440A, | 1447 | .machine_check = machine_check_440A, |
| 1448 | .platform = "ppc440", | 1448 | .platform = "ppc440", |
| 1449 | }, | 1449 | }, |
| 1450 | { /* 440 in Xilinx Virtex-5 FXT */ | ||
| 1451 | .pvr_mask = 0xfffffff0, | ||
| 1452 | .pvr_value = 0x7ff21910, | ||
| 1453 | .cpu_name = "440 in Virtex-5 FXT", | ||
| 1454 | .cpu_features = CPU_FTRS_44X, | ||
| 1455 | .cpu_user_features = COMMON_USER_BOOKE, | ||
| 1456 | .icache_bsize = 32, | ||
| 1457 | .dcache_bsize = 32, | ||
| 1458 | .platform = "ppc440", | ||
| 1459 | }, | ||
| 1450 | { /* 460EX */ | 1460 | { /* 460EX */ |
| 1451 | .pvr_mask = 0xffff0002, | 1461 | .pvr_mask = 0xffff0002, |
| 1452 | .pvr_value = 0x13020002, | 1462 | .pvr_value = 0x13020002, |
diff --git a/arch/powerpc/kernel/dma_64.c b/arch/powerpc/kernel/dma_64.c index 3a317cb0636a..ae5708e3a312 100644 --- a/arch/powerpc/kernel/dma_64.c +++ b/arch/powerpc/kernel/dma_64.c | |||
| @@ -15,15 +15,6 @@ | |||
| 15 | * Generic iommu implementation | 15 | * Generic iommu implementation |
| 16 | */ | 16 | */ |
| 17 | 17 | ||
| 18 | static inline unsigned long device_to_mask(struct device *dev) | ||
| 19 | { | ||
| 20 | if (dev->dma_mask && *dev->dma_mask) | ||
| 21 | return *dev->dma_mask; | ||
| 22 | /* Assume devices without mask can take 32 bit addresses */ | ||
| 23 | return 0xfffffffful; | ||
| 24 | } | ||
| 25 | |||
| 26 | |||
| 27 | /* Allocates a contiguous real buffer and creates mappings over it. | 18 | /* Allocates a contiguous real buffer and creates mappings over it. |
| 28 | * Returns the virtual address of the buffer and sets dma_handle | 19 | * Returns the virtual address of the buffer and sets dma_handle |
| 29 | * to the dma address (mapping) of the first page. | 20 | * to the dma address (mapping) of the first page. |
| @@ -50,32 +41,38 @@ static void dma_iommu_free_coherent(struct device *dev, size_t size, | |||
| 50 | */ | 41 | */ |
| 51 | static dma_addr_t dma_iommu_map_single(struct device *dev, void *vaddr, | 42 | static dma_addr_t dma_iommu_map_single(struct device *dev, void *vaddr, |
| 52 | size_t size, | 43 | size_t size, |
| 53 | enum dma_data_direction direction) | 44 | enum dma_data_direction direction, |
| 45 | struct dma_attrs *attrs) | ||
| 54 | { | 46 | { |
| 55 | return iommu_map_single(dev, dev->archdata.dma_data, vaddr, size, | 47 | return iommu_map_single(dev, dev->archdata.dma_data, vaddr, size, |
| 56 | device_to_mask(dev), direction); | 48 | device_to_mask(dev), direction, attrs); |
| 57 | } | 49 | } |
| 58 | 50 | ||
| 59 | 51 | ||
| 60 | static void dma_iommu_unmap_single(struct device *dev, dma_addr_t dma_handle, | 52 | static void dma_iommu_unmap_single(struct device *dev, dma_addr_t dma_handle, |
| 61 | size_t size, | 53 | size_t size, |
| 62 | enum dma_data_direction direction) | 54 | enum dma_data_direction direction, |
| 55 | struct dma_attrs *attrs) | ||
| 63 | { | 56 | { |
| 64 | iommu_unmap_single(dev->archdata.dma_data, dma_handle, size, direction); | 57 | iommu_unmap_single(dev->archdata.dma_data, dma_handle, size, direction, |
| 58 | attrs); | ||
| 65 | } | 59 | } |
| 66 | 60 | ||
| 67 | 61 | ||
| 68 | static int dma_iommu_map_sg(struct device *dev, struct scatterlist *sglist, | 62 | static int dma_iommu_map_sg(struct device *dev, struct scatterlist *sglist, |
| 69 | int nelems, enum dma_data_direction direction) | 63 | int nelems, enum dma_data_direction direction, |
| 64 | struct dma_attrs *attrs) | ||
| 70 | { | 65 | { |
| 71 | return iommu_map_sg(dev, sglist, nelems, | 66 | return iommu_map_sg(dev, dev->archdata.dma_data, sglist, nelems, |
| 72 | device_to_mask(dev), direction); | 67 | device_to_mask(dev), direction, attrs); |
| 73 | } | 68 | } |
| 74 | 69 | ||
| 75 | static void dma_iommu_unmap_sg(struct device *dev, struct scatterlist *sglist, | 70 | static void dma_iommu_unmap_sg(struct device *dev, struct scatterlist *sglist, |
| 76 | int nelems, enum dma_data_direction direction) | 71 | int nelems, enum dma_data_direction direction, |
| 72 | struct dma_attrs *attrs) | ||
| 77 | { | 73 | { |
| 78 | iommu_unmap_sg(dev->archdata.dma_data, sglist, nelems, direction); | 74 | iommu_unmap_sg(dev->archdata.dma_data, sglist, nelems, direction, |
| 75 | attrs); | ||
| 79 | } | 76 | } |
| 80 | 77 | ||
| 81 | /* We support DMA to/from any memory page via the iommu */ | 78 | /* We support DMA to/from any memory page via the iommu */ |
| @@ -148,19 +145,22 @@ static void dma_direct_free_coherent(struct device *dev, size_t size, | |||
| 148 | 145 | ||
| 149 | static dma_addr_t dma_direct_map_single(struct device *dev, void *ptr, | 146 | static dma_addr_t dma_direct_map_single(struct device *dev, void *ptr, |
| 150 | size_t size, | 147 | size_t size, |
| 151 | enum dma_data_direction direction) | 148 | enum dma_data_direction direction, |
| 149 | struct dma_attrs *attrs) | ||
| 152 | { | 150 | { |
| 153 | return virt_to_abs(ptr) + get_dma_direct_offset(dev); | 151 | return virt_to_abs(ptr) + get_dma_direct_offset(dev); |
| 154 | } | 152 | } |
| 155 | 153 | ||
| 156 | static void dma_direct_unmap_single(struct device *dev, dma_addr_t dma_addr, | 154 | static void dma_direct_unmap_single(struct device *dev, dma_addr_t dma_addr, |
| 157 | size_t size, | 155 | size_t size, |
| 158 | enum dma_data_direction direction) | 156 | enum dma_data_direction direction, |
| 157 | struct dma_attrs *attrs) | ||
| 159 | { | 158 | { |
| 160 | } | 159 | } |
| 161 | 160 | ||
| 162 | static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, | 161 | static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, |
| 163 | int nents, enum dma_data_direction direction) | 162 | int nents, enum dma_data_direction direction, |
| 163 | struct dma_attrs *attrs) | ||
| 164 | { | 164 | { |
| 165 | struct scatterlist *sg; | 165 | struct scatterlist *sg; |
| 166 | int i; | 166 | int i; |
| @@ -174,7 +174,8 @@ static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, | |||
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | static void dma_direct_unmap_sg(struct device *dev, struct scatterlist *sg, | 176 | static void dma_direct_unmap_sg(struct device *dev, struct scatterlist *sg, |
| 177 | int nents, enum dma_data_direction direction) | 177 | int nents, enum dma_data_direction direction, |
| 178 | struct dma_attrs *attrs) | ||
| 178 | { | 179 | { |
| 179 | } | 180 | } |
| 180 | 181 | ||
diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S index 2944529e8bf9..f3a1ea9d7fe4 100644 --- a/arch/powerpc/kernel/head_44x.S +++ b/arch/powerpc/kernel/head_44x.S | |||
| @@ -293,119 +293,9 @@ interrupt_base: | |||
| 293 | MCHECK_EXCEPTION(0x0210, MachineCheckA, machine_check_exception) | 293 | MCHECK_EXCEPTION(0x0210, MachineCheckA, machine_check_exception) |
| 294 | 294 | ||
| 295 | /* Data Storage Interrupt */ | 295 | /* Data Storage Interrupt */ |
| 296 | START_EXCEPTION(DataStorage) | 296 | DATA_STORAGE_EXCEPTION |
| 297 | mtspr SPRN_SPRG0, r10 /* Save some working registers */ | ||
| 298 | mtspr SPRN_SPRG1, r11 | ||
| 299 | mtspr SPRN_SPRG4W, r12 | ||
| 300 | mtspr SPRN_SPRG5W, r13 | ||
| 301 | mfcr r11 | ||
| 302 | mtspr SPRN_SPRG7W, r11 | ||
| 303 | |||
| 304 | /* | ||
| 305 | * Check if it was a store fault, if not then bail | ||
| 306 | * because a user tried to access a kernel or | ||
| 307 | * read-protected page. Otherwise, get the | ||
| 308 | * offending address and handle it. | ||
| 309 | */ | ||
| 310 | mfspr r10, SPRN_ESR | ||
| 311 | andis. r10, r10, ESR_ST@h | ||
| 312 | beq 2f | ||
| 313 | |||
| 314 | mfspr r10, SPRN_DEAR /* Get faulting address */ | ||
| 315 | |||
| 316 | /* If we are faulting a kernel address, we have to use the | ||
| 317 | * kernel page tables. | ||
| 318 | */ | ||
| 319 | lis r11, PAGE_OFFSET@h | ||
| 320 | cmplw r10, r11 | ||
| 321 | blt+ 3f | ||
| 322 | lis r11, swapper_pg_dir@h | ||
| 323 | ori r11, r11, swapper_pg_dir@l | ||
| 324 | |||
| 325 | mfspr r12,SPRN_MMUCR | ||
| 326 | rlwinm r12,r12,0,0,23 /* Clear TID */ | ||
| 327 | |||
| 328 | b 4f | ||
| 329 | |||
| 330 | /* Get the PGD for the current thread */ | ||
| 331 | 3: | ||
| 332 | mfspr r11,SPRN_SPRG3 | ||
| 333 | lwz r11,PGDIR(r11) | ||
| 334 | |||
| 335 | /* Load PID into MMUCR TID */ | ||
| 336 | mfspr r12,SPRN_MMUCR /* Get MMUCR */ | ||
| 337 | mfspr r13,SPRN_PID /* Get PID */ | ||
| 338 | rlwimi r12,r13,0,24,31 /* Set TID */ | ||
| 339 | |||
| 340 | 4: | ||
| 341 | mtspr SPRN_MMUCR,r12 | ||
| 342 | |||
| 343 | rlwinm r12, r10, 13, 19, 29 /* Compute pgdir/pmd offset */ | ||
| 344 | lwzx r11, r12, r11 /* Get pgd/pmd entry */ | ||
| 345 | rlwinm. r12, r11, 0, 0, 20 /* Extract pt base address */ | ||
| 346 | beq 2f /* Bail if no table */ | ||
| 347 | |||
| 348 | rlwimi r12, r10, 23, 20, 28 /* Compute pte address */ | ||
| 349 | lwz r11, 4(r12) /* Get pte entry */ | ||
| 350 | |||
| 351 | andi. r13, r11, _PAGE_RW /* Is it writeable? */ | ||
| 352 | beq 2f /* Bail if not */ | ||
| 353 | |||
| 354 | /* Update 'changed'. | ||
| 355 | */ | ||
| 356 | ori r11, r11, _PAGE_DIRTY|_PAGE_ACCESSED|_PAGE_HWWRITE | ||
| 357 | stw r11, 4(r12) /* Update Linux page table */ | ||
| 358 | |||
| 359 | li r13, PPC44x_TLB_SR@l /* Set SR */ | ||
| 360 | rlwimi r13, r11, 29, 29, 29 /* SX = _PAGE_HWEXEC */ | ||
| 361 | rlwimi r13, r11, 0, 30, 30 /* SW = _PAGE_RW */ | ||
| 362 | rlwimi r13, r11, 29, 28, 28 /* UR = _PAGE_USER */ | ||
| 363 | rlwimi r12, r11, 31, 26, 26 /* (_PAGE_USER>>1)->r12 */ | ||
| 364 | rlwimi r12, r11, 29, 30, 30 /* (_PAGE_USER>>3)->r12 */ | ||
| 365 | and r12, r12, r11 /* HWEXEC/RW & USER */ | ||
| 366 | rlwimi r13, r12, 0, 26, 26 /* UX = HWEXEC & USER */ | ||
| 367 | rlwimi r13, r12, 3, 27, 27 /* UW = RW & USER */ | ||
| 368 | |||
| 369 | rlwimi r11,r13,0,26,31 /* Insert static perms */ | ||
| 370 | |||
| 371 | /* | ||
| 372 | * Clear U0-U3 and WL1 IL1I IL1D IL2I IL2D bits which are added | ||
| 373 | * on newer 440 cores like the 440x6 used on AMCC 460EX/460GT (see | ||
| 374 | * include/asm-powerpc/pgtable-ppc32.h for details). | ||
| 375 | */ | ||
| 376 | rlwinm r11,r11,0,20,10 | ||
| 377 | |||
| 378 | /* find the TLB index that caused the fault. It has to be here. */ | ||
| 379 | tlbsx r10, 0, r10 | ||
| 380 | |||
| 381 | tlbwe r11, r10, PPC44x_TLB_ATTRIB /* Write ATTRIB */ | ||
| 382 | |||
| 383 | /* Done...restore registers and get out of here. | ||
| 384 | */ | ||
| 385 | mfspr r11, SPRN_SPRG7R | ||
| 386 | mtcr r11 | ||
| 387 | mfspr r13, SPRN_SPRG5R | ||
| 388 | mfspr r12, SPRN_SPRG4R | ||
| 389 | 297 | ||
| 390 | mfspr r11, SPRN_SPRG1 | 298 | /* Instruction Storage Interrupt */ |
| 391 | mfspr r10, SPRN_SPRG0 | ||
| 392 | rfi /* Force context change */ | ||
| 393 | |||
| 394 | 2: | ||
| 395 | /* | ||
| 396 | * The bailout. Restore registers to pre-exception conditions | ||
| 397 | * and call the heavyweights to help us out. | ||
| 398 | */ | ||
| 399 | mfspr r11, SPRN_SPRG7R | ||
| 400 | mtcr r11 | ||
| 401 | mfspr r13, SPRN_SPRG5R | ||
| 402 | mfspr r12, SPRN_SPRG4R | ||
| 403 | |||
| 404 | mfspr r11, SPRN_SPRG1 | ||
| 405 | mfspr r10, SPRN_SPRG0 | ||
| 406 | b data_access | ||
| 407 | |||
| 408 | /* Instruction Storage Interrupt */ | ||
| 409 | INSTRUCTION_STORAGE_EXCEPTION | 299 | INSTRUCTION_STORAGE_EXCEPTION |
| 410 | 300 | ||
| 411 | /* External Input Interrupt */ | 301 | /* External Input Interrupt */ |
| @@ -423,7 +313,6 @@ interrupt_base: | |||
| 423 | #else | 313 | #else |
| 424 | EXCEPTION(0x2010, FloatingPointUnavailable, unknown_exception, EXC_XFER_EE) | 314 | EXCEPTION(0x2010, FloatingPointUnavailable, unknown_exception, EXC_XFER_EE) |
| 425 | #endif | 315 | #endif |
| 426 | |||
| 427 | /* System Call Interrupt */ | 316 | /* System Call Interrupt */ |
| 428 | START_EXCEPTION(SystemCall) | 317 | START_EXCEPTION(SystemCall) |
| 429 | NORMAL_EXCEPTION_PROLOG | 318 | NORMAL_EXCEPTION_PROLOG |
| @@ -484,18 +373,57 @@ interrupt_base: | |||
| 484 | 4: | 373 | 4: |
| 485 | mtspr SPRN_MMUCR,r12 | 374 | mtspr SPRN_MMUCR,r12 |
| 486 | 375 | ||
| 376 | /* Mask of required permission bits. Note that while we | ||
| 377 | * do copy ESR:ST to _PAGE_RW position as trying to write | ||
| 378 | * to an RO page is pretty common, we don't do it with | ||
| 379 | * _PAGE_DIRTY. We could do it, but it's a fairly rare | ||
| 380 | * event so I'd rather take the overhead when it happens | ||
| 381 | * rather than adding an instruction here. We should measure | ||
| 382 | * whether the whole thing is worth it in the first place | ||
| 383 | * as we could avoid loading SPRN_ESR completely in the first | ||
| 384 | * place... | ||
| 385 | * | ||
| 386 | * TODO: Is it worth doing that mfspr & rlwimi in the first | ||
| 387 | * place or can we save a couple of instructions here ? | ||
| 388 | */ | ||
| 389 | mfspr r12,SPRN_ESR | ||
| 390 | li r13,_PAGE_PRESENT|_PAGE_ACCESSED | ||
| 391 | rlwimi r13,r12,10,30,30 | ||
| 392 | |||
| 393 | /* Load the PTE */ | ||
| 487 | rlwinm r12, r10, 13, 19, 29 /* Compute pgdir/pmd offset */ | 394 | rlwinm r12, r10, 13, 19, 29 /* Compute pgdir/pmd offset */ |
| 488 | lwzx r11, r12, r11 /* Get pgd/pmd entry */ | 395 | lwzx r11, r12, r11 /* Get pgd/pmd entry */ |
| 489 | rlwinm. r12, r11, 0, 0, 20 /* Extract pt base address */ | 396 | rlwinm. r12, r11, 0, 0, 20 /* Extract pt base address */ |
| 490 | beq 2f /* Bail if no table */ | 397 | beq 2f /* Bail if no table */ |
| 491 | 398 | ||
| 492 | rlwimi r12, r10, 23, 20, 28 /* Compute pte address */ | 399 | rlwimi r12, r10, 23, 20, 28 /* Compute pte address */ |
| 493 | lwz r11, 4(r12) /* Get pte entry */ | 400 | lwz r11, 0(r12) /* Get high word of pte entry */ |
| 494 | andi. r13, r11, _PAGE_PRESENT /* Is the page present? */ | 401 | lwz r12, 4(r12) /* Get low word of pte entry */ |
| 495 | beq 2f /* Bail if not present */ | ||
| 496 | 402 | ||
| 497 | ori r11, r11, _PAGE_ACCESSED | 403 | lis r10,tlb_44x_index@ha |
| 498 | stw r11, 4(r12) | 404 | |
| 405 | andc. r13,r13,r12 /* Check permission */ | ||
| 406 | |||
| 407 | /* Load the next available TLB index */ | ||
| 408 | lwz r13,tlb_44x_index@l(r10) | ||
| 409 | |||
| 410 | bne 2f /* Bail if permission mismach */ | ||
| 411 | |||
| 412 | /* Increment, rollover, and store TLB index */ | ||
| 413 | addi r13,r13,1 | ||
| 414 | |||
| 415 | /* Compare with watermark (instruction gets patched) */ | ||
| 416 | .globl tlb_44x_patch_hwater_D | ||
| 417 | tlb_44x_patch_hwater_D: | ||
| 418 | cmpwi 0,r13,1 /* reserve entries */ | ||
| 419 | ble 5f | ||
| 420 | li r13,0 | ||
| 421 | 5: | ||
| 422 | /* Store the next available TLB index */ | ||
| 423 | stw r13,tlb_44x_index@l(r10) | ||
| 424 | |||
| 425 | /* Re-load the faulting address */ | ||
| 426 | mfspr r10,SPRN_DEAR | ||
| 499 | 427 | ||
| 500 | /* Jump to common tlb load */ | 428 | /* Jump to common tlb load */ |
| 501 | b finish_tlb_load | 429 | b finish_tlb_load |
| @@ -510,7 +438,7 @@ interrupt_base: | |||
| 510 | mfspr r12, SPRN_SPRG4R | 438 | mfspr r12, SPRN_SPRG4R |
| 511 | mfspr r11, SPRN_SPRG1 | 439 | mfspr r11, SPRN_SPRG1 |
| 512 | mfspr r10, SPRN_SPRG0 | 440 | mfspr r10, SPRN_SPRG0 |
| 513 | b data_access | 441 | b DataStorage |
| 514 | 442 | ||
| 515 | /* Instruction TLB Error Interrupt */ | 443 | /* Instruction TLB Error Interrupt */ |
| 516 | /* | 444 | /* |
| @@ -554,18 +482,42 @@ interrupt_base: | |||
| 554 | 4: | 482 | 4: |
| 555 | mtspr SPRN_MMUCR,r12 | 483 | mtspr SPRN_MMUCR,r12 |
| 556 | 484 | ||
| 485 | /* Make up the required permissions */ | ||
| 486 | li r13,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_HWEXEC | ||
| 487 | |||
| 557 | rlwinm r12, r10, 13, 19, 29 /* Compute pgdir/pmd offset */ | 488 | rlwinm r12, r10, 13, 19, 29 /* Compute pgdir/pmd offset */ |
| 558 | lwzx r11, r12, r11 /* Get pgd/pmd entry */ | 489 | lwzx r11, r12, r11 /* Get pgd/pmd entry */ |
| 559 | rlwinm. r12, r11, 0, 0, 20 /* Extract pt base address */ | 490 | rlwinm. r12, r11, 0, 0, 20 /* Extract pt base address */ |
| 560 | beq 2f /* Bail if no table */ | 491 | beq 2f /* Bail if no table */ |
| 561 | 492 | ||
| 562 | rlwimi r12, r10, 23, 20, 28 /* Compute pte address */ | 493 | rlwimi r12, r10, 23, 20, 28 /* Compute pte address */ |
| 563 | lwz r11, 4(r12) /* Get pte entry */ | 494 | lwz r11, 0(r12) /* Get high word of pte entry */ |
| 564 | andi. r13, r11, _PAGE_PRESENT /* Is the page present? */ | 495 | lwz r12, 4(r12) /* Get low word of pte entry */ |
| 565 | beq 2f /* Bail if not present */ | ||
| 566 | 496 | ||
| 567 | ori r11, r11, _PAGE_ACCESSED | 497 | lis r10,tlb_44x_index@ha |
| 568 | stw r11, 4(r12) | 498 | |
| 499 | andc. r13,r13,r12 /* Check permission */ | ||
| 500 | |||
| 501 | /* Load the next available TLB index */ | ||
| 502 | lwz r13,tlb_44x_index@l(r10) | ||
| 503 | |||
| 504 | bne 2f /* Bail if permission mismach */ | ||
| 505 | |||
| 506 | /* Increment, rollover, and store TLB index */ | ||
| 507 | addi r13,r13,1 | ||
| 508 | |||
| 509 | /* Compare with watermark (instruction gets patched) */ | ||
| 510 | .globl tlb_44x_patch_hwater_I | ||
| 511 | tlb_44x_patch_hwater_I: | ||
| 512 | cmpwi 0,r13,1 /* reserve entries */ | ||
| 513 | ble 5f | ||
| 514 | li r13,0 | ||
| 515 | 5: | ||
| 516 | /* Store the next available TLB index */ | ||
| 517 | stw r13,tlb_44x_index@l(r10) | ||
| 518 | |||
| 519 | /* Re-load the faulting address */ | ||
| 520 | mfspr r10,SPRN_SRR0 | ||
| 569 | 521 | ||
| 570 | /* Jump to common TLB load point */ | 522 | /* Jump to common TLB load point */ |
| 571 | b finish_tlb_load | 523 | b finish_tlb_load |
| @@ -587,86 +539,40 @@ interrupt_base: | |||
| 587 | 539 | ||
| 588 | /* | 540 | /* |
| 589 | * Local functions | 541 | * Local functions |
| 590 | */ | 542 | */ |
| 591 | /* | ||
| 592 | * Data TLB exceptions will bail out to this point | ||
| 593 | * if they can't resolve the lightweight TLB fault. | ||
| 594 | */ | ||
| 595 | data_access: | ||
| 596 | NORMAL_EXCEPTION_PROLOG | ||
| 597 | mfspr r5,SPRN_ESR /* Grab the ESR, save it, pass arg3 */ | ||
| 598 | stw r5,_ESR(r11) | ||
| 599 | mfspr r4,SPRN_DEAR /* Grab the DEAR, save it, pass arg2 */ | ||
| 600 | EXC_XFER_EE_LITE(0x0300, handle_page_fault) | ||
| 601 | 543 | ||
| 602 | /* | 544 | /* |
| 603 | 545 | ||
| 604 | * Both the instruction and data TLB miss get to this | 546 | * Both the instruction and data TLB miss get to this |
| 605 | * point to load the TLB. | 547 | * point to load the TLB. |
| 606 | * r10 - EA of fault | 548 | * r10 - EA of fault |
| 607 | * r11 - available to use | 549 | * r11 - PTE high word value |
| 608 | * r12 - Pointer to the 64-bit PTE | 550 | * r12 - PTE low word value |
| 609 | * r13 - available to use | 551 | * r13 - TLB index |
| 610 | * MMUCR - loaded with proper value when we get here | 552 | * MMUCR - loaded with proper value when we get here |
| 611 | * Upon exit, we reload everything and RFI. | 553 | * Upon exit, we reload everything and RFI. |
| 612 | */ | 554 | */ |
| 613 | finish_tlb_load: | 555 | finish_tlb_load: |
| 614 | /* | 556 | /* Combine RPN & ERPN an write WS 0 */ |
| 615 | * We set execute, because we don't have the granularity to | 557 | rlwimi r11,r12,0,0,19 |
| 616 | * properly set this at the page level (Linux problem). | 558 | tlbwe r11,r13,PPC44x_TLB_XLAT |
| 617 | * If shared is set, we cause a zero PID->TID load. | ||
| 618 | * Many of these bits are software only. Bits we don't set | ||
| 619 | * here we (properly should) assume have the appropriate value. | ||
| 620 | */ | ||
| 621 | |||
| 622 | /* Load the next available TLB index */ | ||
| 623 | lis r13, tlb_44x_index@ha | ||
| 624 | lwz r13, tlb_44x_index@l(r13) | ||
| 625 | /* Load the TLB high watermark */ | ||
| 626 | lis r11, tlb_44x_hwater@ha | ||
| 627 | lwz r11, tlb_44x_hwater@l(r11) | ||
| 628 | |||
| 629 | /* Increment, rollover, and store TLB index */ | ||
| 630 | addi r13, r13, 1 | ||
| 631 | cmpw 0, r13, r11 /* reserve entries */ | ||
| 632 | ble 7f | ||
| 633 | li r13, 0 | ||
| 634 | 7: | ||
| 635 | /* Store the next available TLB index */ | ||
| 636 | lis r11, tlb_44x_index@ha | ||
| 637 | stw r13, tlb_44x_index@l(r11) | ||
| 638 | |||
| 639 | lwz r11, 0(r12) /* Get MS word of PTE */ | ||
| 640 | lwz r12, 4(r12) /* Get LS word of PTE */ | ||
| 641 | rlwimi r11, r12, 0, 0 , 19 /* Insert RPN */ | ||
| 642 | tlbwe r11, r13, PPC44x_TLB_XLAT /* Write XLAT */ | ||
| 643 | 559 | ||
| 644 | /* | 560 | /* |
| 645 | * Create PAGEID. This is the faulting address, | 561 | * Create WS1. This is the faulting address (EPN), |
| 646 | * page size, and valid flag. | 562 | * page size, and valid flag. |
| 647 | */ | 563 | */ |
| 648 | li r11, PPC44x_TLB_VALID | PPC44x_TLB_4K | 564 | li r11,PPC44x_TLB_VALID | PPC44x_TLB_4K |
| 649 | rlwimi r10, r11, 0, 20, 31 /* Insert valid and page size */ | 565 | rlwimi r10,r11,0,20,31 /* Insert valid and page size*/ |
| 650 | tlbwe r10, r13, PPC44x_TLB_PAGEID /* Write PAGEID */ | 566 | tlbwe r10,r13,PPC44x_TLB_PAGEID /* Write PAGEID */ |
| 651 | 567 | ||
| 652 | li r10, PPC44x_TLB_SR@l /* Set SR */ | 568 | /* And WS 2 */ |
| 653 | rlwimi r10, r12, 0, 30, 30 /* Set SW = _PAGE_RW */ | 569 | li r10,0xf85 /* Mask to apply from PTE */ |
| 654 | rlwimi r10, r12, 29, 29, 29 /* SX = _PAGE_HWEXEC */ | 570 | rlwimi r10,r12,29,30,30 /* DIRTY -> SW position */ |
| 655 | rlwimi r10, r12, 29, 28, 28 /* UR = _PAGE_USER */ | 571 | and r11,r12,r10 /* Mask PTE bits to keep */ |
| 656 | rlwimi r11, r12, 31, 26, 26 /* (_PAGE_USER>>1)->r12 */ | 572 | andi. r10,r12,_PAGE_USER /* User page ? */ |
| 657 | and r11, r12, r11 /* HWEXEC & USER */ | 573 | beq 1f /* nope, leave U bits empty */ |
| 658 | rlwimi r10, r11, 0, 26, 26 /* UX = HWEXEC & USER */ | 574 | rlwimi r11,r11,3,26,28 /* yes, copy S bits to U */ |
| 659 | 575 | 1: tlbwe r11,r13,PPC44x_TLB_ATTRIB /* Write ATTRIB */ | |
| 660 | rlwimi r12, r10, 0, 26, 31 /* Insert static perms */ | ||
| 661 | |||
| 662 | /* | ||
| 663 | * Clear U0-U3 and WL1 IL1I IL1D IL2I IL2D bits which are added | ||
| 664 | * on newer 440 cores like the 440x6 used on AMCC 460EX/460GT (see | ||
| 665 | * include/asm-powerpc/pgtable-ppc32.h for details). | ||
| 666 | */ | ||
| 667 | rlwinm r12, r12, 0, 20, 10 | ||
| 668 | |||
| 669 | tlbwe r12, r13, PPC44x_TLB_ATTRIB /* Write ATTRIB */ | ||
| 670 | 576 | ||
| 671 | /* Done...restore registers and get out of here. | 577 | /* Done...restore registers and get out of here. |
| 672 | */ | 578 | */ |
diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h index b0461be1c928..fce2df988504 100644 --- a/arch/powerpc/kernel/head_booke.h +++ b/arch/powerpc/kernel/head_booke.h | |||
| @@ -340,6 +340,14 @@ label: | |||
| 340 | addi r3,r1,STACK_FRAME_OVERHEAD; \ | 340 | addi r3,r1,STACK_FRAME_OVERHEAD; \ |
| 341 | EXC_XFER_TEMPLATE(DebugException, 0x2002, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), NOCOPY, crit_transfer_to_handler, ret_from_crit_exc) | 341 | EXC_XFER_TEMPLATE(DebugException, 0x2002, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), NOCOPY, crit_transfer_to_handler, ret_from_crit_exc) |
| 342 | 342 | ||
| 343 | #define DATA_STORAGE_EXCEPTION \ | ||
| 344 | START_EXCEPTION(DataStorage) \ | ||
| 345 | NORMAL_EXCEPTION_PROLOG; \ | ||
| 346 | mfspr r5,SPRN_ESR; /* Grab the ESR and save it */ \ | ||
| 347 | stw r5,_ESR(r11); \ | ||
| 348 | mfspr r4,SPRN_DEAR; /* Grab the DEAR */ \ | ||
| 349 | EXC_XFER_EE_LITE(0x0300, handle_page_fault) | ||
| 350 | |||
| 343 | #define INSTRUCTION_STORAGE_EXCEPTION \ | 351 | #define INSTRUCTION_STORAGE_EXCEPTION \ |
| 344 | START_EXCEPTION(InstructionStorage) \ | 352 | START_EXCEPTION(InstructionStorage) \ |
| 345 | NORMAL_EXCEPTION_PROLOG; \ | 353 | NORMAL_EXCEPTION_PROLOG; \ |
diff --git a/arch/powerpc/kernel/ibmebus.c b/arch/powerpc/kernel/ibmebus.c index 9971159c8040..9d42eb57aea3 100644 --- a/arch/powerpc/kernel/ibmebus.c +++ b/arch/powerpc/kernel/ibmebus.c | |||
| @@ -53,7 +53,7 @@ static struct device ibmebus_bus_device = { /* fake "parent" device */ | |||
| 53 | struct bus_type ibmebus_bus_type; | 53 | struct bus_type ibmebus_bus_type; |
| 54 | 54 | ||
| 55 | /* These devices will automatically be added to the bus during init */ | 55 | /* These devices will automatically be added to the bus during init */ |
| 56 | static struct of_device_id __initdata builtin_matches[] = { | 56 | static struct of_device_id __initdata ibmebus_matches[] = { |
| 57 | { .compatible = "IBM,lhca" }, | 57 | { .compatible = "IBM,lhca" }, |
| 58 | { .compatible = "IBM,lhea" }, | 58 | { .compatible = "IBM,lhea" }, |
| 59 | {}, | 59 | {}, |
| @@ -82,7 +82,8 @@ static void ibmebus_free_coherent(struct device *dev, | |||
| 82 | static dma_addr_t ibmebus_map_single(struct device *dev, | 82 | static dma_addr_t ibmebus_map_single(struct device *dev, |
| 83 | void *ptr, | 83 | void *ptr, |
| 84 | size_t size, | 84 | size_t size, |
| 85 | enum dma_data_direction direction) | 85 | enum dma_data_direction direction, |
| 86 | struct dma_attrs *attrs) | ||
| 86 | { | 87 | { |
| 87 | return (dma_addr_t)(ptr); | 88 | return (dma_addr_t)(ptr); |
| 88 | } | 89 | } |
| @@ -90,14 +91,16 @@ static dma_addr_t ibmebus_map_single(struct device *dev, | |||
| 90 | static void ibmebus_unmap_single(struct device *dev, | 91 | static void ibmebus_unmap_single(struct device *dev, |
| 91 | dma_addr_t dma_addr, | 92 | dma_addr_t dma_addr, |
| 92 | size_t size, | 93 | size_t size, |
| 93 | enum dma_data_direction direction) | 94 | enum dma_data_direction direction, |
| 95 | struct dma_attrs *attrs) | ||
| 94 | { | 96 | { |
| 95 | return; | 97 | return; |
| 96 | } | 98 | } |
| 97 | 99 | ||
| 98 | static int ibmebus_map_sg(struct device *dev, | 100 | static int ibmebus_map_sg(struct device *dev, |
| 99 | struct scatterlist *sgl, | 101 | struct scatterlist *sgl, |
| 100 | int nents, enum dma_data_direction direction) | 102 | int nents, enum dma_data_direction direction, |
| 103 | struct dma_attrs *attrs) | ||
| 101 | { | 104 | { |
| 102 | struct scatterlist *sg; | 105 | struct scatterlist *sg; |
| 103 | int i; | 106 | int i; |
| @@ -112,7 +115,8 @@ static int ibmebus_map_sg(struct device *dev, | |||
| 112 | 115 | ||
| 113 | static void ibmebus_unmap_sg(struct device *dev, | 116 | static void ibmebus_unmap_sg(struct device *dev, |
| 114 | struct scatterlist *sg, | 117 | struct scatterlist *sg, |
| 115 | int nents, enum dma_data_direction direction) | 118 | int nents, enum dma_data_direction direction, |
| 119 | struct dma_attrs *attrs) | ||
| 116 | { | 120 | { |
| 117 | return; | 121 | return; |
| 118 | } | 122 | } |
| @@ -350,7 +354,7 @@ static int __init ibmebus_bus_init(void) | |||
| 350 | return err; | 354 | return err; |
| 351 | } | 355 | } |
| 352 | 356 | ||
| 353 | err = ibmebus_create_devices(builtin_matches); | 357 | err = ibmebus_create_devices(ibmebus_matches); |
| 354 | if (err) { | 358 | if (err) { |
| 355 | device_unregister(&ibmebus_bus_device); | 359 | device_unregister(&ibmebus_bus_device); |
| 356 | bus_unregister(&ibmebus_bus_type); | 360 | bus_unregister(&ibmebus_bus_type); |
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index 0c663669bc32..8c68ee9e5d1c 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c | |||
| @@ -267,11 +267,11 @@ static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr, | |||
| 267 | spin_unlock_irqrestore(&(tbl->it_lock), flags); | 267 | spin_unlock_irqrestore(&(tbl->it_lock), flags); |
| 268 | } | 268 | } |
| 269 | 269 | ||
| 270 | int iommu_map_sg(struct device *dev, struct scatterlist *sglist, | 270 | int iommu_map_sg(struct device *dev, struct iommu_table *tbl, |
| 271 | int nelems, unsigned long mask, | 271 | struct scatterlist *sglist, int nelems, |
| 272 | enum dma_data_direction direction) | 272 | unsigned long mask, enum dma_data_direction direction, |
| 273 | struct dma_attrs *attrs) | ||
| 273 | { | 274 | { |
| 274 | struct iommu_table *tbl = dev->archdata.dma_data; | ||
| 275 | dma_addr_t dma_next = 0, dma_addr; | 275 | dma_addr_t dma_next = 0, dma_addr; |
| 276 | unsigned long flags; | 276 | unsigned long flags; |
| 277 | struct scatterlist *s, *outs, *segstart; | 277 | struct scatterlist *s, *outs, *segstart; |
| @@ -412,7 +412,8 @@ int iommu_map_sg(struct device *dev, struct scatterlist *sglist, | |||
| 412 | 412 | ||
| 413 | 413 | ||
| 414 | void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist, | 414 | void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist, |
| 415 | int nelems, enum dma_data_direction direction) | 415 | int nelems, enum dma_data_direction direction, |
| 416 | struct dma_attrs *attrs) | ||
| 416 | { | 417 | { |
| 417 | struct scatterlist *sg; | 418 | struct scatterlist *sg; |
| 418 | unsigned long flags; | 419 | unsigned long flags; |
| @@ -554,7 +555,7 @@ void iommu_free_table(struct iommu_table *tbl, const char *node_name) | |||
| 554 | */ | 555 | */ |
| 555 | dma_addr_t iommu_map_single(struct device *dev, struct iommu_table *tbl, | 556 | dma_addr_t iommu_map_single(struct device *dev, struct iommu_table *tbl, |
| 556 | void *vaddr, size_t size, unsigned long mask, | 557 | void *vaddr, size_t size, unsigned long mask, |
| 557 | enum dma_data_direction direction) | 558 | enum dma_data_direction direction, struct dma_attrs *attrs) |
| 558 | { | 559 | { |
| 559 | dma_addr_t dma_handle = DMA_ERROR_CODE; | 560 | dma_addr_t dma_handle = DMA_ERROR_CODE; |
| 560 | unsigned long uaddr; | 561 | unsigned long uaddr; |
| @@ -587,7 +588,8 @@ dma_addr_t iommu_map_single(struct device *dev, struct iommu_table *tbl, | |||
| 587 | } | 588 | } |
| 588 | 589 | ||
| 589 | void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle, | 590 | void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle, |
| 590 | size_t size, enum dma_data_direction direction) | 591 | size_t size, enum dma_data_direction direction, |
| 592 | struct dma_attrs *attrs) | ||
| 591 | { | 593 | { |
| 592 | unsigned int npages; | 594 | unsigned int npages; |
| 593 | 595 | ||
diff --git a/arch/powerpc/kernel/legacy_serial.c b/arch/powerpc/kernel/legacy_serial.c index 61dd17449ddc..4d96e1db55ee 100644 --- a/arch/powerpc/kernel/legacy_serial.c +++ b/arch/powerpc/kernel/legacy_serial.c | |||
| @@ -33,13 +33,14 @@ static struct legacy_serial_info { | |||
| 33 | phys_addr_t taddr; | 33 | phys_addr_t taddr; |
| 34 | } legacy_serial_infos[MAX_LEGACY_SERIAL_PORTS]; | 34 | } legacy_serial_infos[MAX_LEGACY_SERIAL_PORTS]; |
| 35 | 35 | ||
| 36 | static struct __initdata of_device_id parents[] = { | 36 | static struct __initdata of_device_id legacy_serial_parents[] = { |
| 37 | {.type = "soc",}, | 37 | {.type = "soc",}, |
| 38 | {.type = "tsi-bridge",}, | 38 | {.type = "tsi-bridge",}, |
| 39 | {.type = "opb", }, | 39 | {.type = "opb", }, |
| 40 | {.compatible = "ibm,opb",}, | 40 | {.compatible = "ibm,opb",}, |
| 41 | {.compatible = "simple-bus",}, | 41 | {.compatible = "simple-bus",}, |
| 42 | {.compatible = "wrs,epld-localbus",}, | 42 | {.compatible = "wrs,epld-localbus",}, |
| 43 | {}, | ||
| 43 | }; | 44 | }; |
| 44 | 45 | ||
| 45 | static unsigned int legacy_serial_count; | 46 | static unsigned int legacy_serial_count; |
| @@ -136,6 +137,11 @@ static int __init add_legacy_soc_port(struct device_node *np, | |||
| 136 | if (of_get_property(np, "clock-frequency", NULL) == NULL) | 137 | if (of_get_property(np, "clock-frequency", NULL) == NULL) |
| 137 | return -1; | 138 | return -1; |
| 138 | 139 | ||
| 140 | /* if reg-shift or offset, don't try to use it */ | ||
| 141 | if ((of_get_property(np, "reg-shift", NULL) != NULL) || | ||
| 142 | (of_get_property(np, "reg-offset", NULL) != NULL)) | ||
| 143 | return -1; | ||
| 144 | |||
| 139 | /* if rtas uses this device, don't try to use it as well */ | 145 | /* if rtas uses this device, don't try to use it as well */ |
| 140 | if (of_get_property(np, "used-by-rtas", NULL) != NULL) | 146 | if (of_get_property(np, "used-by-rtas", NULL) != NULL) |
| 141 | return -1; | 147 | return -1; |
| @@ -322,7 +328,7 @@ void __init find_legacy_serial_ports(void) | |||
| 322 | struct device_node *parent = of_get_parent(np); | 328 | struct device_node *parent = of_get_parent(np); |
| 323 | if (!parent) | 329 | if (!parent) |
| 324 | continue; | 330 | continue; |
| 325 | if (of_match_node(parents, parent) != NULL) { | 331 | if (of_match_node(legacy_serial_parents, parent) != NULL) { |
| 326 | index = add_legacy_soc_port(np, np); | 332 | index = add_legacy_soc_port(np, np); |
| 327 | if (index >= 0 && np == stdout) | 333 | if (index >= 0 && np == stdout) |
| 328 | legacy_serial_console = index; | 334 | legacy_serial_console = index; |
diff --git a/arch/powerpc/kernel/of_platform.c b/arch/powerpc/kernel/of_platform.c index e79ad8afda07..3f37a6e62771 100644 --- a/arch/powerpc/kernel/of_platform.c +++ b/arch/powerpc/kernel/of_platform.c | |||
| @@ -76,6 +76,8 @@ struct of_device* of_platform_device_create(struct device_node *np, | |||
| 76 | return NULL; | 76 | return NULL; |
| 77 | 77 | ||
| 78 | dev->dma_mask = 0xffffffffUL; | 78 | dev->dma_mask = 0xffffffffUL; |
| 79 | dev->dev.coherent_dma_mask = DMA_32BIT_MASK; | ||
| 80 | |||
| 79 | dev->dev.bus = &of_platform_bus_type; | 81 | dev->dev.bus = &of_platform_bus_type; |
| 80 | 82 | ||
| 81 | /* We do not fill the DMA ops for platform devices by default. | 83 | /* We do not fill the DMA ops for platform devices by default. |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 85e557300d86..0a4eb0811590 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
| @@ -485,10 +485,8 @@ void show_regs(struct pt_regs * regs) | |||
| 485 | * Lookup NIP late so we have the best change of getting the | 485 | * Lookup NIP late so we have the best change of getting the |
| 486 | * above info out without failing | 486 | * above info out without failing |
| 487 | */ | 487 | */ |
| 488 | printk("NIP ["REG"] ", regs->nip); | 488 | printk("NIP ["REG"] %pS\n", regs->nip, (void *)regs->nip); |
| 489 | print_symbol("%s\n", regs->nip); | 489 | printk("LR ["REG"] %pS\n", regs->link, (void *)regs->link); |
| 490 | printk("LR ["REG"] ", regs->link); | ||
| 491 | print_symbol("%s\n", regs->link); | ||
| 492 | #endif | 490 | #endif |
| 493 | show_stack(current, (unsigned long *) regs->gpr[1]); | 491 | show_stack(current, (unsigned long *) regs->gpr[1]); |
| 494 | if (!user_mode(regs)) | 492 | if (!user_mode(regs)) |
| @@ -976,8 +974,7 @@ void show_stack(struct task_struct *tsk, unsigned long *stack) | |||
| 976 | newsp = stack[0]; | 974 | newsp = stack[0]; |
| 977 | ip = stack[STACK_FRAME_LR_SAVE]; | 975 | ip = stack[STACK_FRAME_LR_SAVE]; |
| 978 | if (!firstframe || ip != lr) { | 976 | if (!firstframe || ip != lr) { |
| 979 | printk("["REG"] ["REG"] ", sp, ip); | 977 | printk("["REG"] ["REG"] %pS", sp, ip, (void *)ip); |
| 980 | print_symbol("%s", ip); | ||
| 981 | if (firstframe) | 978 | if (firstframe) |
| 982 | printk(" (unreliable)"); | 979 | printk(" (unreliable)"); |
| 983 | printk("\n"); | 980 | printk("\n"); |
| @@ -992,10 +989,9 @@ void show_stack(struct task_struct *tsk, unsigned long *stack) | |||
| 992 | && stack[STACK_FRAME_MARKER] == STACK_FRAME_REGS_MARKER) { | 989 | && stack[STACK_FRAME_MARKER] == STACK_FRAME_REGS_MARKER) { |
| 993 | struct pt_regs *regs = (struct pt_regs *) | 990 | struct pt_regs *regs = (struct pt_regs *) |
| 994 | (sp + STACK_FRAME_OVERHEAD); | 991 | (sp + STACK_FRAME_OVERHEAD); |
| 995 | printk("--- Exception: %lx", regs->trap); | ||
| 996 | print_symbol(" at %s\n", regs->nip); | ||
| 997 | lr = regs->link; | 992 | lr = regs->link; |
| 998 | print_symbol(" LR = %s\n", lr); | 993 | printk("--- Exception: %lx at %pS\n LR = %pS\n", |
| 994 | regs->trap, (void *)regs->nip, (void *)lr); | ||
| 999 | firstframe = 1; | 995 | firstframe = 1; |
| 1000 | } | 996 | } |
| 1001 | 997 | ||
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 9991e2a58bf4..6f6810db0a74 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c | |||
| @@ -68,6 +68,13 @@ | |||
| 68 | #define ucontext ucontext32 | 68 | #define ucontext ucontext32 |
| 69 | 69 | ||
| 70 | /* | 70 | /* |
| 71 | * Userspace code may pass a ucontext which doesn't include VSX added | ||
| 72 | * at the end. We need to check for this case. | ||
| 73 | */ | ||
| 74 | #define UCONTEXTSIZEWITHOUTVSX \ | ||
| 75 | (sizeof(struct ucontext) - sizeof(elf_vsrreghalf_t32)) | ||
| 76 | |||
| 77 | /* | ||
| 71 | * Returning 0 means we return to userspace via | 78 | * Returning 0 means we return to userspace via |
| 72 | * ret_from_except and thus restore all user | 79 | * ret_from_except and thus restore all user |
| 73 | * registers from *regs. This is what we need | 80 | * registers from *regs. This is what we need |
| @@ -930,12 +937,42 @@ long sys_swapcontext(struct ucontext __user *old_ctx, | |||
| 930 | { | 937 | { |
| 931 | unsigned char tmp; | 938 | unsigned char tmp; |
| 932 | 939 | ||
| 940 | #ifdef CONFIG_PPC64 | ||
| 941 | unsigned long new_msr = 0; | ||
| 942 | |||
| 943 | if (new_ctx && | ||
| 944 | __get_user(new_msr, &new_ctx->uc_mcontext.mc_gregs[PT_MSR])) | ||
| 945 | return -EFAULT; | ||
| 946 | /* | ||
| 947 | * Check that the context is not smaller than the original | ||
| 948 | * size (with VMX but without VSX) | ||
| 949 | */ | ||
| 950 | if (ctx_size < UCONTEXTSIZEWITHOUTVSX) | ||
| 951 | return -EINVAL; | ||
| 952 | /* | ||
| 953 | * If the new context state sets the MSR VSX bits but | ||
| 954 | * it doesn't provide VSX state. | ||
| 955 | */ | ||
| 956 | if ((ctx_size < sizeof(struct ucontext)) && | ||
| 957 | (new_msr & MSR_VSX)) | ||
| 958 | return -EINVAL; | ||
| 959 | #ifdef CONFIG_VSX | ||
| 960 | /* | ||
| 961 | * If userspace doesn't provide enough room for VSX data, | ||
| 962 | * but current thread has used VSX, we don't have anywhere | ||
| 963 | * to store the full context back into. | ||
| 964 | */ | ||
| 965 | if ((ctx_size < sizeof(struct ucontext)) && | ||
| 966 | (current->thread.used_vsr && old_ctx)) | ||
| 967 | return -EINVAL; | ||
| 968 | #endif | ||
| 969 | #else | ||
| 933 | /* Context size is for future use. Right now, we only make sure | 970 | /* Context size is for future use. Right now, we only make sure |
| 934 | * we are passed something we understand | 971 | * we are passed something we understand |
| 935 | */ | 972 | */ |
| 936 | if (ctx_size < sizeof(struct ucontext)) | 973 | if (ctx_size < sizeof(struct ucontext)) |
| 937 | return -EINVAL; | 974 | return -EINVAL; |
| 938 | 975 | #endif | |
| 939 | if (old_ctx != NULL) { | 976 | if (old_ctx != NULL) { |
| 940 | struct mcontext __user *mctx; | 977 | struct mcontext __user *mctx; |
| 941 | 978 | ||
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index 93ebfb6944b6..5f9d2ef2e24b 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c | |||
| @@ -268,6 +268,13 @@ static long setup_trampoline(unsigned int syscall, unsigned int __user *tramp) | |||
| 268 | } | 268 | } |
| 269 | 269 | ||
| 270 | /* | 270 | /* |
| 271 | * Userspace code may pass a ucontext which doesn't include VSX added | ||
| 272 | * at the end. We need to check for this case. | ||
| 273 | */ | ||
| 274 | #define UCONTEXTSIZEWITHOUTVSX \ | ||
| 275 | (sizeof(struct ucontext) - 32*sizeof(long)) | ||
| 276 | |||
| 277 | /* | ||
| 271 | * Handle {get,set,swap}_context operations | 278 | * Handle {get,set,swap}_context operations |
| 272 | */ | 279 | */ |
| 273 | int sys_swapcontext(struct ucontext __user *old_ctx, | 280 | int sys_swapcontext(struct ucontext __user *old_ctx, |
| @@ -276,13 +283,34 @@ int sys_swapcontext(struct ucontext __user *old_ctx, | |||
| 276 | { | 283 | { |
| 277 | unsigned char tmp; | 284 | unsigned char tmp; |
| 278 | sigset_t set; | 285 | sigset_t set; |
| 286 | unsigned long new_msr = 0; | ||
| 279 | 287 | ||
| 280 | /* Context size is for future use. Right now, we only make sure | 288 | if (new_ctx && |
| 281 | * we are passed something we understand | 289 | __get_user(new_msr, &new_ctx->uc_mcontext.gp_regs[PT_MSR])) |
| 290 | return -EFAULT; | ||
| 291 | /* | ||
| 292 | * Check that the context is not smaller than the original | ||
| 293 | * size (with VMX but without VSX) | ||
| 282 | */ | 294 | */ |
| 283 | if (ctx_size < sizeof(struct ucontext)) | 295 | if (ctx_size < UCONTEXTSIZEWITHOUTVSX) |
| 284 | return -EINVAL; | 296 | return -EINVAL; |
| 285 | 297 | /* | |
| 298 | * If the new context state sets the MSR VSX bits but | ||
| 299 | * it doesn't provide VSX state. | ||
| 300 | */ | ||
| 301 | if ((ctx_size < sizeof(struct ucontext)) && | ||
| 302 | (new_msr & MSR_VSX)) | ||
| 303 | return -EINVAL; | ||
| 304 | #ifdef CONFIG_VSX | ||
| 305 | /* | ||
| 306 | * If userspace doesn't provide enough room for VSX data, | ||
| 307 | * but current thread has used VSX, we don't have anywhere | ||
| 308 | * to store the full context back into. | ||
| 309 | */ | ||
| 310 | if ((ctx_size < sizeof(struct ucontext)) && | ||
| 311 | (current->thread.used_vsr && old_ctx)) | ||
| 312 | return -EINVAL; | ||
| 313 | #endif | ||
| 286 | if (old_ctx != NULL) { | 314 | if (old_ctx != NULL) { |
| 287 | if (!access_ok(VERIFY_WRITE, old_ctx, sizeof(*old_ctx)) | 315 | if (!access_ok(VERIFY_WRITE, old_ctx, sizeof(*old_ctx)) |
| 288 | || setup_sigcontext(&old_ctx->uc_mcontext, regs, 0, NULL, 0) | 316 | || setup_sigcontext(&old_ctx->uc_mcontext, regs, 0, NULL, 0) |
diff --git a/arch/powerpc/kernel/syscalls.c b/arch/powerpc/kernel/syscalls.c index 4fe69ca24481..c04832c4a02e 100644 --- a/arch/powerpc/kernel/syscalls.c +++ b/arch/powerpc/kernel/syscalls.c | |||
| @@ -143,6 +143,9 @@ static inline unsigned long do_mmap2(unsigned long addr, size_t len, | |||
| 143 | struct file * file = NULL; | 143 | struct file * file = NULL; |
| 144 | unsigned long ret = -EINVAL; | 144 | unsigned long ret = -EINVAL; |
| 145 | 145 | ||
| 146 | if (!arch_validate_prot(prot)) | ||
| 147 | goto out; | ||
| 148 | |||
| 146 | if (shift) { | 149 | if (shift) { |
| 147 | if (off & ((1 << shift) - 1)) | 150 | if (off & ((1 << shift) - 1)) |
| 148 | goto out; | 151 | goto out; |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index c73fc33aa817..eb938808ddfb 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
| @@ -742,10 +742,6 @@ void __init generic_calibrate_decr(void) | |||
| 742 | } | 742 | } |
| 743 | 743 | ||
| 744 | #if defined(CONFIG_BOOKE) || defined(CONFIG_40x) | 744 | #if defined(CONFIG_BOOKE) || defined(CONFIG_40x) |
| 745 | /* Set the time base to zero */ | ||
| 746 | mtspr(SPRN_TBWL, 0); | ||
| 747 | mtspr(SPRN_TBWU, 0); | ||
| 748 | |||
| 749 | /* Clear any pending timer interrupts */ | 745 | /* Clear any pending timer interrupts */ |
| 750 | mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_DIS | TSR_FIS); | 746 | mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_DIS | TSR_FIS); |
| 751 | 747 | ||
diff --git a/arch/powerpc/mm/44x_mmu.c b/arch/powerpc/mm/44x_mmu.c index 953fb919eb06..98052ac96580 100644 --- a/arch/powerpc/mm/44x_mmu.c +++ b/arch/powerpc/mm/44x_mmu.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <asm/mmu.h> | 27 | #include <asm/mmu.h> |
| 28 | #include <asm/system.h> | 28 | #include <asm/system.h> |
| 29 | #include <asm/page.h> | 29 | #include <asm/page.h> |
| 30 | #include <asm/cacheflush.h> | ||
| 30 | 31 | ||
| 31 | #include "mmu_decl.h" | 32 | #include "mmu_decl.h" |
| 32 | 33 | ||
| @@ -37,11 +38,35 @@ unsigned int tlb_44x_index; /* = 0 */ | |||
| 37 | unsigned int tlb_44x_hwater = PPC44x_TLB_SIZE - 1 - PPC44x_EARLY_TLBS; | 38 | unsigned int tlb_44x_hwater = PPC44x_TLB_SIZE - 1 - PPC44x_EARLY_TLBS; |
| 38 | int icache_44x_need_flush; | 39 | int icache_44x_need_flush; |
| 39 | 40 | ||
| 41 | static void __init ppc44x_update_tlb_hwater(void) | ||
| 42 | { | ||
| 43 | extern unsigned int tlb_44x_patch_hwater_D[]; | ||
| 44 | extern unsigned int tlb_44x_patch_hwater_I[]; | ||
| 45 | |||
| 46 | /* The TLB miss handlers hard codes the watermark in a cmpli | ||
| 47 | * instruction to improve performances rather than loading it | ||
| 48 | * from the global variable. Thus, we patch the instructions | ||
| 49 | * in the 2 TLB miss handlers when updating the value | ||
| 50 | */ | ||
| 51 | tlb_44x_patch_hwater_D[0] = (tlb_44x_patch_hwater_D[0] & 0xffff0000) | | ||
| 52 | tlb_44x_hwater; | ||
| 53 | flush_icache_range((unsigned long)&tlb_44x_patch_hwater_D[0], | ||
| 54 | (unsigned long)&tlb_44x_patch_hwater_D[1]); | ||
| 55 | tlb_44x_patch_hwater_I[0] = (tlb_44x_patch_hwater_I[0] & 0xffff0000) | | ||
| 56 | tlb_44x_hwater; | ||
| 57 | flush_icache_range((unsigned long)&tlb_44x_patch_hwater_I[0], | ||
| 58 | (unsigned long)&tlb_44x_patch_hwater_I[1]); | ||
| 59 | } | ||
| 60 | |||
| 40 | /* | 61 | /* |
| 41 | * "Pins" a 256MB TLB entry in AS0 for kernel lowmem | 62 | * "Pins" a 256MB TLB entry in AS0 for kernel lowmem |
| 42 | */ | 63 | */ |
| 43 | static void __init ppc44x_pin_tlb(unsigned int virt, unsigned int phys) | 64 | static void __init ppc44x_pin_tlb(unsigned int virt, unsigned int phys) |
| 44 | { | 65 | { |
| 66 | unsigned int entry = tlb_44x_hwater--; | ||
| 67 | |||
| 68 | ppc44x_update_tlb_hwater(); | ||
| 69 | |||
| 45 | __asm__ __volatile__( | 70 | __asm__ __volatile__( |
| 46 | "tlbwe %2,%3,%4\n" | 71 | "tlbwe %2,%3,%4\n" |
| 47 | "tlbwe %1,%3,%5\n" | 72 | "tlbwe %1,%3,%5\n" |
| @@ -50,7 +75,7 @@ static void __init ppc44x_pin_tlb(unsigned int virt, unsigned int phys) | |||
| 50 | : "r" (PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G), | 75 | : "r" (PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G), |
| 51 | "r" (phys), | 76 | "r" (phys), |
| 52 | "r" (virt | PPC44x_TLB_VALID | PPC44x_TLB_256M), | 77 | "r" (virt | PPC44x_TLB_VALID | PPC44x_TLB_256M), |
| 53 | "r" (tlb_44x_hwater--), /* slot for this TLB entry */ | 78 | "r" (entry), |
| 54 | "i" (PPC44x_TLB_PAGEID), | 79 | "i" (PPC44x_TLB_PAGEID), |
| 55 | "i" (PPC44x_TLB_XLAT), | 80 | "i" (PPC44x_TLB_XLAT), |
| 56 | "i" (PPC44x_TLB_ATTRIB)); | 81 | "i" (PPC44x_TLB_ATTRIB)); |
| @@ -58,6 +83,8 @@ static void __init ppc44x_pin_tlb(unsigned int virt, unsigned int phys) | |||
| 58 | 83 | ||
| 59 | void __init MMU_init_hw(void) | 84 | void __init MMU_init_hw(void) |
| 60 | { | 85 | { |
| 86 | ppc44x_update_tlb_hwater(); | ||
| 87 | |||
| 61 | flush_instruction_cache(); | 88 | flush_instruction_cache(); |
| 62 | } | 89 | } |
| 63 | 90 | ||
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c index 7b2510799266..1707d00331fc 100644 --- a/arch/powerpc/mm/fault.c +++ b/arch/powerpc/mm/fault.c | |||
| @@ -306,7 +306,8 @@ good_area: | |||
| 306 | flush_dcache_icache_page(page); | 306 | flush_dcache_icache_page(page); |
| 307 | set_bit(PG_arch_1, &page->flags); | 307 | set_bit(PG_arch_1, &page->flags); |
| 308 | } | 308 | } |
| 309 | pte_update(ptep, 0, _PAGE_HWEXEC); | 309 | pte_update(ptep, 0, _PAGE_HWEXEC | |
| 310 | _PAGE_ACCESSED); | ||
| 310 | _tlbie(address, mm->context.id); | 311 | _tlbie(address, mm->context.id); |
| 311 | pte_unmap_unlock(ptep, ptl); | 312 | pte_unmap_unlock(ptep, ptl); |
| 312 | up_read(&mm->mmap_sem); | 313 | up_read(&mm->mmap_sem); |
diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c index 45418590b6a9..388ceda632f3 100644 --- a/arch/powerpc/mm/init_32.c +++ b/arch/powerpc/mm/init_32.c | |||
| @@ -57,8 +57,8 @@ | |||
| 57 | 57 | ||
| 58 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 58 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
| 59 | 59 | ||
| 60 | unsigned long total_memory; | 60 | phys_addr_t total_memory; |
| 61 | unsigned long total_lowmem; | 61 | phys_addr_t total_lowmem; |
| 62 | 62 | ||
| 63 | phys_addr_t memstart_addr = (phys_addr_t)~0ull; | 63 | phys_addr_t memstart_addr = (phys_addr_t)~0ull; |
| 64 | EXPORT_SYMBOL(memstart_addr); | 64 | EXPORT_SYMBOL(memstart_addr); |
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 776ba6ad5e1e..1ca2235f0965 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
| @@ -330,7 +330,7 @@ static int __init mark_nonram_nosave(void) | |||
| 330 | void __init paging_init(void) | 330 | void __init paging_init(void) |
| 331 | { | 331 | { |
| 332 | unsigned long total_ram = lmb_phys_mem_size(); | 332 | unsigned long total_ram = lmb_phys_mem_size(); |
| 333 | unsigned long top_of_ram = lmb_end_of_DRAM(); | 333 | phys_addr_t top_of_ram = lmb_end_of_DRAM(); |
| 334 | unsigned long max_zone_pfns[MAX_NR_ZONES]; | 334 | unsigned long max_zone_pfns[MAX_NR_ZONES]; |
| 335 | 335 | ||
| 336 | #ifdef CONFIG_PPC32 | 336 | #ifdef CONFIG_PPC32 |
| @@ -349,10 +349,10 @@ void __init paging_init(void) | |||
| 349 | kmap_prot = PAGE_KERNEL; | 349 | kmap_prot = PAGE_KERNEL; |
| 350 | #endif /* CONFIG_HIGHMEM */ | 350 | #endif /* CONFIG_HIGHMEM */ |
| 351 | 351 | ||
| 352 | printk(KERN_DEBUG "Top of RAM: 0x%lx, Total RAM: 0x%lx\n", | 352 | printk(KERN_DEBUG "Top of RAM: 0x%llx, Total RAM: 0x%lx\n", |
| 353 | top_of_ram, total_ram); | 353 | (u64)top_of_ram, total_ram); |
| 354 | printk(KERN_DEBUG "Memory hole size: %ldMB\n", | 354 | printk(KERN_DEBUG "Memory hole size: %ldMB\n", |
| 355 | (top_of_ram - total_ram) >> 20); | 355 | (long int)((top_of_ram - total_ram) >> 20)); |
| 356 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); | 356 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); |
| 357 | #ifdef CONFIG_HIGHMEM | 357 | #ifdef CONFIG_HIGHMEM |
| 358 | max_zone_pfns[ZONE_DMA] = lowmem_end_addr >> PAGE_SHIFT; | 358 | max_zone_pfns[ZONE_DMA] = lowmem_end_addr >> PAGE_SHIFT; |
diff --git a/arch/powerpc/mm/mmu_decl.h b/arch/powerpc/mm/mmu_decl.h index 46585b7bb194..fab3cfad4099 100644 --- a/arch/powerpc/mm/mmu_decl.h +++ b/arch/powerpc/mm/mmu_decl.h | |||
| @@ -49,8 +49,8 @@ extern unsigned int num_tlbcam_entries; | |||
| 49 | extern unsigned long ioremap_bot; | 49 | extern unsigned long ioremap_bot; |
| 50 | extern unsigned long __max_low_memory; | 50 | extern unsigned long __max_low_memory; |
| 51 | extern phys_addr_t __initial_memory_limit_addr; | 51 | extern phys_addr_t __initial_memory_limit_addr; |
| 52 | extern unsigned long total_memory; | 52 | extern phys_addr_t total_memory; |
| 53 | extern unsigned long total_lowmem; | 53 | extern phys_addr_t total_lowmem; |
| 54 | extern phys_addr_t memstart_addr; | 54 | extern phys_addr_t memstart_addr; |
| 55 | extern phys_addr_t lowmem_end_addr; | 55 | extern phys_addr_t lowmem_end_addr; |
| 56 | 56 | ||
diff --git a/arch/powerpc/platforms/44x/Kconfig b/arch/powerpc/platforms/44x/Kconfig index bee49ca704ef..249ba01c6674 100644 --- a/arch/powerpc/platforms/44x/Kconfig +++ b/arch/powerpc/platforms/44x/Kconfig | |||
| @@ -111,6 +111,22 @@ config YOSEMITE | |||
| 111 | # help | 111 | # help |
| 112 | # This option enables support for the IBM PPC440GX evaluation board. | 112 | # This option enables support for the IBM PPC440GX evaluation board. |
| 113 | 113 | ||
| 114 | config XILINX_VIRTEX440_GENERIC_BOARD | ||
| 115 | bool "Generic Xilinx Virtex 440 board" | ||
| 116 | depends on 44x | ||
| 117 | default n | ||
| 118 | select XILINX_VIRTEX_5_FXT | ||
| 119 | help | ||
| 120 | This option enables generic support for Xilinx Virtex based boards | ||
| 121 | that use a 440 based processor in the Virtex 5 FXT FPGA architecture. | ||
| 122 | |||
| 123 | The generic virtex board support matches any device tree which | ||
| 124 | specifies 'xlnx,virtex440' in its compatible field. This includes | ||
| 125 | the Xilinx ML5xx reference designs using the powerpc core. | ||
| 126 | |||
| 127 | Most Virtex 5 designs should use this unless it needs to do some | ||
| 128 | special configuration at board probe time. | ||
| 129 | |||
| 114 | # 44x specific CPU modules, selected based on the board above. | 130 | # 44x specific CPU modules, selected based on the board above. |
| 115 | config 440EP | 131 | config 440EP |
| 116 | bool | 132 | bool |
| @@ -161,3 +177,13 @@ config 460EX | |||
| 161 | # 44x errata/workaround config symbols, selected by the CPU models above | 177 | # 44x errata/workaround config symbols, selected by the CPU models above |
| 162 | config IBM440EP_ERR42 | 178 | config IBM440EP_ERR42 |
| 163 | bool | 179 | bool |
| 180 | |||
| 181 | # Xilinx specific config options. | ||
| 182 | config XILINX_VIRTEX | ||
| 183 | bool | ||
| 184 | |||
| 185 | # Xilinx Virtex 5 FXT FPGA architecture, selected by a Xilinx board above | ||
| 186 | config XILINX_VIRTEX_5_FXT | ||
| 187 | bool | ||
| 188 | select XILINX_VIRTEX | ||
| 189 | |||
diff --git a/arch/powerpc/platforms/44x/Makefile b/arch/powerpc/platforms/44x/Makefile index 4e71e77f9a23..8d0b1a192d62 100644 --- a/arch/powerpc/platforms/44x/Makefile +++ b/arch/powerpc/platforms/44x/Makefile | |||
| @@ -10,3 +10,4 @@ obj-$(CONFIG_RAINIER) += rainier.o | |||
| 10 | obj-$(CONFIG_WARP) += warp.o | 10 | obj-$(CONFIG_WARP) += warp.o |
| 11 | obj-$(CONFIG_WARP) += warp-nand.o | 11 | obj-$(CONFIG_WARP) += warp-nand.o |
| 12 | obj-$(CONFIG_CANYONLANDS) += canyonlands.o | 12 | obj-$(CONFIG_CANYONLANDS) += canyonlands.o |
| 13 | obj-$(CONFIG_XILINX_VIRTEX_5_FXT) += virtex.o | ||
diff --git a/arch/powerpc/platforms/44x/virtex.c b/arch/powerpc/platforms/44x/virtex.c new file mode 100644 index 000000000000..68637faf70ae --- /dev/null +++ b/arch/powerpc/platforms/44x/virtex.c | |||
| @@ -0,0 +1,60 @@ | |||
| 1 | /* | ||
| 2 | * Xilinx Virtex 5FXT based board support, derived from | ||
| 3 | * the Xilinx Virtex (IIpro & 4FX) based board support | ||
| 4 | * | ||
| 5 | * Copyright 2007 Secret Lab Technologies Ltd. | ||
| 6 | * Copyright 2008 Xilinx, Inc. | ||
| 7 | * | ||
| 8 | * This file is licensed under the terms of the GNU General Public License | ||
| 9 | * version 2. This program is licensed "as is" without any warranty of any | ||
| 10 | * kind, whether express or implied. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #include <linux/init.h> | ||
| 14 | #include <linux/of_platform.h> | ||
| 15 | #include <asm/machdep.h> | ||
| 16 | #include <asm/prom.h> | ||
| 17 | #include <asm/time.h> | ||
| 18 | #include <asm/xilinx_intc.h> | ||
| 19 | #include <asm/reg.h> | ||
| 20 | #include <asm/ppc4xx.h> | ||
| 21 | #include "44x.h" | ||
| 22 | |||
| 23 | static struct of_device_id xilinx_of_bus_ids[] __initdata = { | ||
| 24 | { .compatible = "simple-bus", }, | ||
| 25 | { .compatible = "xlnx,plb-v46-1.00.a", }, | ||
| 26 | { .compatible = "xlnx,plb-v46-1.02.a", }, | ||
| 27 | { .compatible = "xlnx,plb-v34-1.01.a", }, | ||
| 28 | { .compatible = "xlnx,plb-v34-1.02.a", }, | ||
| 29 | { .compatible = "xlnx,opb-v20-1.10.c", }, | ||
| 30 | { .compatible = "xlnx,dcr-v29-1.00.a", }, | ||
| 31 | { .compatible = "xlnx,compound", }, | ||
| 32 | {} | ||
| 33 | }; | ||
| 34 | |||
| 35 | static int __init virtex_device_probe(void) | ||
| 36 | { | ||
| 37 | of_platform_bus_probe(NULL, xilinx_of_bus_ids, NULL); | ||
| 38 | |||
| 39 | return 0; | ||
| 40 | } | ||
| 41 | machine_device_initcall(virtex, virtex_device_probe); | ||
| 42 | |||
| 43 | static int __init virtex_probe(void) | ||
| 44 | { | ||
| 45 | unsigned long root = of_get_flat_dt_root(); | ||
| 46 | |||
| 47 | if (!of_flat_dt_is_compatible(root, "xlnx,virtex440")) | ||
| 48 | return 0; | ||
| 49 | |||
| 50 | return 1; | ||
| 51 | } | ||
| 52 | |||
| 53 | define_machine(virtex) { | ||
| 54 | .name = "Xilinx Virtex440", | ||
| 55 | .probe = virtex_probe, | ||
| 56 | .init_IRQ = xilinx_intc_init_tree, | ||
| 57 | .get_irq = xilinx_intc_get_irq, | ||
| 58 | .calibrate_decr = generic_calibrate_decr, | ||
| 59 | .restart = ppc4xx_reset_system, | ||
| 60 | }; | ||
diff --git a/arch/powerpc/platforms/44x/warp-nand.c b/arch/powerpc/platforms/44x/warp-nand.c index 7bec2815771a..e55746b824b4 100644 --- a/arch/powerpc/platforms/44x/warp-nand.c +++ b/arch/powerpc/platforms/44x/warp-nand.c | |||
| @@ -113,9 +113,14 @@ static int warp_setup_nand_flash(void) | |||
| 113 | pp = of_find_property(np, "reg", NULL); | 113 | pp = of_find_property(np, "reg", NULL); |
| 114 | if (pp && (pp->length == 12)) { | 114 | if (pp && (pp->length == 12)) { |
| 115 | u32 *v = pp->value; | 115 | u32 *v = pp->value; |
| 116 | if (v[2] == 0x4000000) | 116 | if (v[2] == 0x4000000) { |
| 117 | /* Rev A = 64M NAND */ | 117 | /* Rev A = 64M NAND */ |
| 118 | warp_nand_chip0.nr_partitions = 2; | 118 | warp_nand_chip0.nr_partitions = 3; |
| 119 | |||
| 120 | nand_parts[1].size = 0x3000000; | ||
| 121 | nand_parts[2].offset = 0x3200000; | ||
| 122 | nand_parts[2].size = 0x0e00000; | ||
| 123 | } | ||
| 119 | } | 124 | } |
| 120 | of_node_put(np); | 125 | of_node_put(np); |
| 121 | } | 126 | } |
diff --git a/arch/powerpc/platforms/52xx/lite5200_pm.c b/arch/powerpc/platforms/52xx/lite5200_pm.c index 41c7fd91e99e..fe92e65103ed 100644 --- a/arch/powerpc/platforms/52xx/lite5200_pm.c +++ b/arch/powerpc/platforms/52xx/lite5200_pm.c | |||
| @@ -14,6 +14,7 @@ static struct mpc52xx_sdma __iomem *bes; | |||
| 14 | static struct mpc52xx_xlb __iomem *xlb; | 14 | static struct mpc52xx_xlb __iomem *xlb; |
| 15 | static struct mpc52xx_gpio __iomem *gps; | 15 | static struct mpc52xx_gpio __iomem *gps; |
| 16 | static struct mpc52xx_gpio_wkup __iomem *gpw; | 16 | static struct mpc52xx_gpio_wkup __iomem *gpw; |
| 17 | static void __iomem *pci; | ||
| 17 | static void __iomem *sram; | 18 | static void __iomem *sram; |
| 18 | static const int sram_size = 0x4000; /* 16 kBytes */ | 19 | static const int sram_size = 0x4000; /* 16 kBytes */ |
| 19 | static void __iomem *mbar; | 20 | static void __iomem *mbar; |
| @@ -50,6 +51,8 @@ static int lite5200_pm_prepare(void) | |||
| 50 | { .type = "builtin", .compatible = "mpc5200", }, /* efika */ | 51 | { .type = "builtin", .compatible = "mpc5200", }, /* efika */ |
| 51 | {} | 52 | {} |
| 52 | }; | 53 | }; |
| 54 | u64 regaddr64 = 0; | ||
| 55 | const u32 *regaddr_p; | ||
| 53 | 56 | ||
| 54 | /* deep sleep? let mpc52xx code handle that */ | 57 | /* deep sleep? let mpc52xx code handle that */ |
| 55 | if (lite5200_pm_target_state == PM_SUSPEND_STANDBY) | 58 | if (lite5200_pm_target_state == PM_SUSPEND_STANDBY) |
| @@ -60,8 +63,12 @@ static int lite5200_pm_prepare(void) | |||
| 60 | 63 | ||
| 61 | /* map registers */ | 64 | /* map registers */ |
| 62 | np = of_find_matching_node(NULL, immr_ids); | 65 | np = of_find_matching_node(NULL, immr_ids); |
| 63 | mbar = of_iomap(np, 0); | 66 | regaddr_p = of_get_address(np, 0, NULL, NULL); |
| 67 | if (regaddr_p) | ||
| 68 | regaddr64 = of_translate_address(np, regaddr_p); | ||
| 64 | of_node_put(np); | 69 | of_node_put(np); |
| 70 | |||
| 71 | mbar = ioremap((u32) regaddr64, 0xC000); | ||
| 65 | if (!mbar) { | 72 | if (!mbar) { |
| 66 | printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__); | 73 | printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__); |
| 67 | return -ENOSYS; | 74 | return -ENOSYS; |
| @@ -71,6 +78,7 @@ static int lite5200_pm_prepare(void) | |||
| 71 | pic = mbar + 0x500; | 78 | pic = mbar + 0x500; |
| 72 | gps = mbar + 0xb00; | 79 | gps = mbar + 0xb00; |
| 73 | gpw = mbar + 0xc00; | 80 | gpw = mbar + 0xc00; |
| 81 | pci = mbar + 0xd00; | ||
| 74 | bes = mbar + 0x1200; | 82 | bes = mbar + 0x1200; |
| 75 | xlb = mbar + 0x1f00; | 83 | xlb = mbar + 0x1f00; |
| 76 | sram = mbar + 0x8000; | 84 | sram = mbar + 0x8000; |
| @@ -85,6 +93,7 @@ static struct mpc52xx_sdma sbes; | |||
| 85 | static struct mpc52xx_xlb sxlb; | 93 | static struct mpc52xx_xlb sxlb; |
| 86 | static struct mpc52xx_gpio sgps; | 94 | static struct mpc52xx_gpio sgps; |
| 87 | static struct mpc52xx_gpio_wkup sgpw; | 95 | static struct mpc52xx_gpio_wkup sgpw; |
| 96 | static char spci[0x200]; | ||
| 88 | 97 | ||
| 89 | static void lite5200_save_regs(void) | 98 | static void lite5200_save_regs(void) |
| 90 | { | 99 | { |
| @@ -94,6 +103,7 @@ static void lite5200_save_regs(void) | |||
| 94 | _memcpy_fromio(&sxlb, xlb, sizeof(*xlb)); | 103 | _memcpy_fromio(&sxlb, xlb, sizeof(*xlb)); |
| 95 | _memcpy_fromio(&sgps, gps, sizeof(*gps)); | 104 | _memcpy_fromio(&sgps, gps, sizeof(*gps)); |
| 96 | _memcpy_fromio(&sgpw, gpw, sizeof(*gpw)); | 105 | _memcpy_fromio(&sgpw, gpw, sizeof(*gpw)); |
| 106 | _memcpy_fromio(spci, pci, 0x200); | ||
| 97 | 107 | ||
| 98 | _memcpy_fromio(saved_sram, sram, sram_size); | 108 | _memcpy_fromio(saved_sram, sram, sram_size); |
| 99 | } | 109 | } |
| @@ -103,6 +113,8 @@ static void lite5200_restore_regs(void) | |||
| 103 | int i; | 113 | int i; |
| 104 | _memcpy_toio(sram, saved_sram, sram_size); | 114 | _memcpy_toio(sram, saved_sram, sram_size); |
| 105 | 115 | ||
| 116 | /* PCI Configuration */ | ||
| 117 | _memcpy_toio(pci, spci, 0x200); | ||
| 106 | 118 | ||
| 107 | /* | 119 | /* |
| 108 | * GPIOs. Interrupt Master Enable has higher address then other | 120 | * GPIOs. Interrupt Master Enable has higher address then other |
diff --git a/arch/powerpc/platforms/82xx/Kconfig b/arch/powerpc/platforms/82xx/Kconfig index 917ac8891555..1c8034bfa796 100644 --- a/arch/powerpc/platforms/82xx/Kconfig +++ b/arch/powerpc/platforms/82xx/Kconfig | |||
| @@ -1,7 +1,8 @@ | |||
| 1 | choice | 1 | menuconfig PPC_82xx |
| 2 | prompt "82xx Board Type" | 2 | bool "82xx-based boards (PQ II)" |
| 3 | depends on PPC_82xx | 3 | depends on 6xx && PPC_MULTIPLATFORM |
| 4 | default MPC8272_ADS | 4 | |
| 5 | if PPC_82xx | ||
| 5 | 6 | ||
| 6 | config MPC8272_ADS | 7 | config MPC8272_ADS |
| 7 | bool "Freescale MPC8272 ADS" | 8 | bool "Freescale MPC8272 ADS" |
| @@ -36,7 +37,7 @@ config EP8248E | |||
| 36 | This board is also resold by Freescale as the QUICCStart | 37 | This board is also resold by Freescale as the QUICCStart |
| 37 | MPC8248 Evaluation System and/or the CWH-PPC-8248N-VE. | 38 | MPC8248 Evaluation System and/or the CWH-PPC-8248N-VE. |
| 38 | 39 | ||
| 39 | endchoice | 40 | endif |
| 40 | 41 | ||
| 41 | config PQ2ADS | 42 | config PQ2ADS |
| 42 | bool | 43 | bool |
diff --git a/arch/powerpc/platforms/82xx/mpc8272_ads.c b/arch/powerpc/platforms/82xx/mpc8272_ads.c index 7d3018751988..8054c685d323 100644 --- a/arch/powerpc/platforms/82xx/mpc8272_ads.c +++ b/arch/powerpc/platforms/82xx/mpc8272_ads.c | |||
| @@ -96,6 +96,10 @@ static struct cpm_pin mpc8272_ads_pins[] = { | |||
| 96 | {1, 31, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, | 96 | {1, 31, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, |
| 97 | {2, 16, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | 97 | {2, 16, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, |
| 98 | {2, 17, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | 98 | {2, 17, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, |
| 99 | |||
| 100 | /* I2C */ | ||
| 101 | {3, 14, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_OPENDRAIN}, | ||
| 102 | {3, 15, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_OPENDRAIN}, | ||
| 99 | }; | 103 | }; |
| 100 | 104 | ||
| 101 | static void __init init_ioports(void) | 105 | static void __init init_ioports(void) |
diff --git a/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c b/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c index a8013816125c..9876d7e072f4 100644 --- a/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c +++ b/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c | |||
| @@ -109,7 +109,7 @@ static int pci_pic_host_map(struct irq_host *h, unsigned int virq, | |||
| 109 | { | 109 | { |
| 110 | get_irq_desc(virq)->status |= IRQ_LEVEL; | 110 | get_irq_desc(virq)->status |= IRQ_LEVEL; |
| 111 | set_irq_chip_data(virq, h->host_data); | 111 | set_irq_chip_data(virq, h->host_data); |
| 112 | set_irq_chip(virq, &pq2ads_pci_ic); | 112 | set_irq_chip_and_handler(virq, &pq2ads_pci_ic, handle_level_irq); |
| 113 | return 0; | 113 | return 0; |
| 114 | } | 114 | } |
| 115 | 115 | ||
diff --git a/arch/powerpc/platforms/83xx/Kconfig b/arch/powerpc/platforms/83xx/Kconfig index fe75b2ac3c9f..27d9bf86de01 100644 --- a/arch/powerpc/platforms/83xx/Kconfig +++ b/arch/powerpc/platforms/83xx/Kconfig | |||
| @@ -1,10 +1,12 @@ | |||
| 1 | menuconfig MPC83xx | 1 | menuconfig PPC_83xx |
| 2 | bool "83xx Board Type" | 2 | bool "83xx-based boards" |
| 3 | depends on PPC_83xx | 3 | depends on 6xx && PPC_MULTIPLATFORM |
| 4 | select PPC_UDBG_16550 | 4 | select PPC_UDBG_16550 |
| 5 | select PPC_INDIRECT_PCI | 5 | select PPC_INDIRECT_PCI |
| 6 | select FSL_SOC | ||
| 7 | select IPIC | ||
| 6 | 8 | ||
| 7 | if MPC83xx | 9 | if PPC_83xx |
| 8 | 10 | ||
| 9 | config MPC831x_RDB | 11 | config MPC831x_RDB |
| 10 | bool "Freescale MPC831x RDB" | 12 | bool "Freescale MPC831x RDB" |
diff --git a/arch/powerpc/platforms/85xx/Kconfig b/arch/powerpc/platforms/85xx/Kconfig index 9cb8e29987a3..cebea5cadbc1 100644 --- a/arch/powerpc/platforms/85xx/Kconfig +++ b/arch/powerpc/platforms/85xx/Kconfig | |||
| @@ -38,6 +38,12 @@ config MPC85xx_MDS | |||
| 38 | help | 38 | help |
| 39 | This option enables support for the MPC85xx MDS board | 39 | This option enables support for the MPC85xx MDS board |
| 40 | 40 | ||
| 41 | config MPC8536_DS | ||
| 42 | bool "Freescale MPC8536 DS" | ||
| 43 | select DEFAULT_UIMAGE | ||
| 44 | help | ||
| 45 | This option enables support for the MPC8536 DS board | ||
| 46 | |||
| 41 | config MPC85xx_DS | 47 | config MPC85xx_DS |
| 42 | bool "Freescale MPC85xx DS" | 48 | bool "Freescale MPC85xx DS" |
| 43 | select PPC_I8259 | 49 | select PPC_I8259 |
diff --git a/arch/powerpc/platforms/85xx/Makefile b/arch/powerpc/platforms/85xx/Makefile index 6cea185f62b2..cb3054e1001d 100644 --- a/arch/powerpc/platforms/85xx/Makefile +++ b/arch/powerpc/platforms/85xx/Makefile | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | obj-$(CONFIG_MPC8540_ADS) += mpc85xx_ads.o | 4 | obj-$(CONFIG_MPC8540_ADS) += mpc85xx_ads.o |
| 5 | obj-$(CONFIG_MPC8560_ADS) += mpc85xx_ads.o | 5 | obj-$(CONFIG_MPC8560_ADS) += mpc85xx_ads.o |
| 6 | obj-$(CONFIG_MPC85xx_CDS) += mpc85xx_cds.o | 6 | obj-$(CONFIG_MPC85xx_CDS) += mpc85xx_cds.o |
| 7 | obj-$(CONFIG_MPC8536_DS) += mpc8536_ds.o | ||
| 7 | obj-$(CONFIG_MPC85xx_DS) += mpc85xx_ds.o | 8 | obj-$(CONFIG_MPC85xx_DS) += mpc85xx_ds.o |
| 8 | obj-$(CONFIG_MPC85xx_MDS) += mpc85xx_mds.o | 9 | obj-$(CONFIG_MPC85xx_MDS) += mpc85xx_mds.o |
| 9 | obj-$(CONFIG_STX_GP3) += stx_gp3.o | 10 | obj-$(CONFIG_STX_GP3) += stx_gp3.o |
diff --git a/arch/powerpc/platforms/85xx/mpc8536_ds.c b/arch/powerpc/platforms/85xx/mpc8536_ds.c new file mode 100644 index 000000000000..6b846aa1ced9 --- /dev/null +++ b/arch/powerpc/platforms/85xx/mpc8536_ds.c | |||
| @@ -0,0 +1,125 @@ | |||
| 1 | /* | ||
| 2 | * MPC8536 DS Board Setup | ||
| 3 | * | ||
| 4 | * Copyright 2008 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 | #include <linux/stddef.h> | ||
| 13 | #include <linux/kernel.h> | ||
| 14 | #include <linux/pci.h> | ||
| 15 | #include <linux/kdev_t.h> | ||
| 16 | #include <linux/delay.h> | ||
| 17 | #include <linux/seq_file.h> | ||
| 18 | #include <linux/interrupt.h> | ||
| 19 | #include <linux/of_platform.h> | ||
| 20 | |||
| 21 | #include <asm/system.h> | ||
| 22 | #include <asm/time.h> | ||
| 23 | #include <asm/machdep.h> | ||
| 24 | #include <asm/pci-bridge.h> | ||
| 25 | #include <mm/mmu_decl.h> | ||
| 26 | #include <asm/prom.h> | ||
| 27 | #include <asm/udbg.h> | ||
| 28 | #include <asm/mpic.h> | ||
| 29 | |||
| 30 | #include <sysdev/fsl_soc.h> | ||
| 31 | #include <sysdev/fsl_pci.h> | ||
| 32 | |||
| 33 | void __init mpc8536_ds_pic_init(void) | ||
| 34 | { | ||
| 35 | struct mpic *mpic; | ||
| 36 | struct resource r; | ||
| 37 | struct device_node *np; | ||
| 38 | |||
| 39 | np = of_find_node_by_type(NULL, "open-pic"); | ||
| 40 | if (np == NULL) { | ||
| 41 | printk(KERN_ERR "Could not find open-pic node\n"); | ||
| 42 | return; | ||
| 43 | } | ||
| 44 | |||
| 45 | if (of_address_to_resource(np, 0, &r)) { | ||
| 46 | printk(KERN_ERR "Failed to map mpic register space\n"); | ||
| 47 | of_node_put(np); | ||
| 48 | return; | ||
| 49 | } | ||
| 50 | |||
| 51 | mpic = mpic_alloc(np, r.start, | ||
| 52 | MPIC_PRIMARY | MPIC_WANTS_RESET | | ||
| 53 | MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS, | ||
| 54 | 0, 256, " OpenPIC "); | ||
| 55 | BUG_ON(mpic == NULL); | ||
| 56 | of_node_put(np); | ||
| 57 | |||
| 58 | mpic_init(mpic); | ||
| 59 | } | ||
| 60 | |||
| 61 | /* | ||
| 62 | * Setup the architecture | ||
| 63 | */ | ||
| 64 | static void __init mpc8536_ds_setup_arch(void) | ||
| 65 | { | ||
| 66 | #ifdef CONFIG_PCI | ||
| 67 | struct device_node *np; | ||
| 68 | #endif | ||
| 69 | |||
| 70 | if (ppc_md.progress) | ||
| 71 | ppc_md.progress("mpc8536_ds_setup_arch()", 0); | ||
| 72 | |||
| 73 | #ifdef CONFIG_PCI | ||
| 74 | for_each_node_by_type(np, "pci") { | ||
| 75 | if (of_device_is_compatible(np, "fsl,mpc8540-pci") || | ||
| 76 | of_device_is_compatible(np, "fsl,mpc8548-pcie")) { | ||
| 77 | struct resource rsrc; | ||
| 78 | of_address_to_resource(np, 0, &rsrc); | ||
| 79 | if ((rsrc.start & 0xfffff) == 0x8000) | ||
| 80 | fsl_add_bridge(np, 1); | ||
| 81 | else | ||
| 82 | fsl_add_bridge(np, 0); | ||
| 83 | } | ||
| 84 | } | ||
| 85 | |||
| 86 | #endif | ||
| 87 | |||
| 88 | printk("MPC8536 DS board from Freescale Semiconductor\n"); | ||
| 89 | } | ||
| 90 | |||
| 91 | static struct of_device_id __initdata mpc8536_ds_ids[] = { | ||
| 92 | { .type = "soc", }, | ||
| 93 | { .compatible = "soc", }, | ||
| 94 | {}, | ||
| 95 | }; | ||
| 96 | |||
| 97 | static int __init mpc8536_ds_publish_devices(void) | ||
| 98 | { | ||
| 99 | return of_platform_bus_probe(NULL, mpc8536_ds_ids, NULL); | ||
| 100 | } | ||
| 101 | machine_device_initcall(mpc8536_ds, mpc8536_ds_publish_devices); | ||
| 102 | |||
| 103 | /* | ||
| 104 | * Called very early, device-tree isn't unflattened | ||
| 105 | */ | ||
| 106 | static int __init mpc8536_ds_probe(void) | ||
| 107 | { | ||
| 108 | unsigned long root = of_get_flat_dt_root(); | ||
| 109 | |||
| 110 | return of_flat_dt_is_compatible(root, "fsl,mpc8536ds"); | ||
| 111 | } | ||
| 112 | |||
| 113 | define_machine(mpc8536_ds) { | ||
| 114 | .name = "MPC8536 DS", | ||
| 115 | .probe = mpc8536_ds_probe, | ||
| 116 | .setup_arch = mpc8536_ds_setup_arch, | ||
| 117 | .init_IRQ = mpc8536_ds_pic_init, | ||
| 118 | #ifdef CONFIG_PCI | ||
| 119 | .pcibios_fixup_bus = fsl_pcibios_fixup_bus, | ||
| 120 | #endif | ||
| 121 | .get_irq = mpic_get_irq, | ||
| 122 | .restart = fsl_rstcr_restart, | ||
| 123 | .calibrate_decr = generic_calibrate_decr, | ||
| 124 | .progress = udbg_progress, | ||
| 125 | }; | ||
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_cds.c b/arch/powerpc/platforms/85xx/mpc85xx_cds.c index 8b1de7884be6..50d7ea8f922b 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_cds.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_cds.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
| 27 | #include <linux/interrupt.h> | 27 | #include <linux/interrupt.h> |
| 28 | #include <linux/fsl_devices.h> | 28 | #include <linux/fsl_devices.h> |
| 29 | #include <linux/of_platform.h> | ||
| 29 | 30 | ||
| 30 | #include <asm/system.h> | 31 | #include <asm/system.h> |
| 31 | #include <asm/pgtable.h> | 32 | #include <asm/pgtable.h> |
| @@ -335,6 +336,19 @@ static int __init mpc85xx_cds_probe(void) | |||
| 335 | return of_flat_dt_is_compatible(root, "MPC85xxCDS"); | 336 | return of_flat_dt_is_compatible(root, "MPC85xxCDS"); |
| 336 | } | 337 | } |
| 337 | 338 | ||
| 339 | static struct of_device_id __initdata of_bus_ids[] = { | ||
| 340 | { .type = "soc", }, | ||
| 341 | { .compatible = "soc", }, | ||
| 342 | { .compatible = "simple-bus", }, | ||
| 343 | {}, | ||
| 344 | }; | ||
| 345 | |||
| 346 | static int __init declare_of_platform_devices(void) | ||
| 347 | { | ||
| 348 | return of_platform_bus_probe(NULL, of_bus_ids, NULL); | ||
| 349 | } | ||
| 350 | machine_device_initcall(mpc85xx_cds, declare_of_platform_devices); | ||
| 351 | |||
| 338 | define_machine(mpc85xx_cds) { | 352 | define_machine(mpc85xx_cds) { |
| 339 | .name = "MPC85xx CDS", | 353 | .name = "MPC85xx CDS", |
| 340 | .probe = mpc85xx_cds_probe, | 354 | .probe = mpc85xx_cds_probe, |
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ds.c b/arch/powerpc/platforms/85xx/mpc85xx_ds.c index b010dc9dec65..25f41cd2d33a 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_ds.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_ds.c | |||
| @@ -58,14 +58,13 @@ void __init mpc85xx_ds_pic_init(void) | |||
| 58 | { | 58 | { |
| 59 | struct mpic *mpic; | 59 | struct mpic *mpic; |
| 60 | struct resource r; | 60 | struct resource r; |
| 61 | struct device_node *np = NULL; | 61 | struct device_node *np; |
| 62 | #ifdef CONFIG_PPC_I8259 | 62 | #ifdef CONFIG_PPC_I8259 |
| 63 | struct device_node *cascade_node = NULL; | 63 | struct device_node *cascade_node = NULL; |
| 64 | int cascade_irq; | 64 | int cascade_irq; |
| 65 | #endif | 65 | #endif |
| 66 | 66 | ||
| 67 | np = of_find_node_by_type(np, "open-pic"); | 67 | np = of_find_node_by_type(NULL, "open-pic"); |
| 68 | |||
| 69 | if (np == NULL) { | 68 | if (np == NULL) { |
| 70 | printk(KERN_ERR "Could not find open-pic node\n"); | 69 | printk(KERN_ERR "Could not find open-pic node\n"); |
| 71 | return; | 70 | return; |
| @@ -82,6 +81,7 @@ void __init mpc85xx_ds_pic_init(void) | |||
| 82 | MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS, | 81 | MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS, |
| 83 | 0, 256, " OpenPIC "); | 82 | 0, 256, " OpenPIC "); |
| 84 | BUG_ON(mpic == NULL); | 83 | BUG_ON(mpic == NULL); |
| 84 | of_node_put(np); | ||
| 85 | 85 | ||
| 86 | mpic_init(mpic); | 86 | mpic_init(mpic); |
| 87 | 87 | ||
| @@ -185,7 +185,7 @@ static int __init mpc8544_ds_probe(void) | |||
| 185 | } | 185 | } |
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | static struct of_device_id mpc85xxds_ids[] = { | 188 | static struct of_device_id __initdata mpc85xxds_ids[] = { |
| 189 | { .type = "soc", }, | 189 | { .type = "soc", }, |
| 190 | { .compatible = "soc", }, | 190 | { .compatible = "soc", }, |
| 191 | {}, | 191 | {}, |
diff --git a/arch/powerpc/platforms/86xx/Kconfig b/arch/powerpc/platforms/86xx/Kconfig index 053f49a1dcae..80a81e02bb55 100644 --- a/arch/powerpc/platforms/86xx/Kconfig +++ b/arch/powerpc/platforms/86xx/Kconfig | |||
| @@ -1,7 +1,13 @@ | |||
| 1 | choice | 1 | config PPC_86xx |
| 2 | prompt "86xx Board Type" | 2 | menuconfig PPC_86xx |
| 3 | depends on PPC_86xx | 3 | bool "86xx-based boards" |
| 4 | default MPC8641_HPCN | 4 | depends on 6xx && PPC_MULTIPLATFORM |
| 5 | select FSL_SOC | ||
| 6 | select ALTIVEC | ||
| 7 | help | ||
| 8 | The Freescale E600 SoCs have 74xx cores. | ||
| 9 | |||
| 10 | if PPC_86xx | ||
| 5 | 11 | ||
| 6 | config MPC8641_HPCN | 12 | config MPC8641_HPCN |
| 7 | bool "Freescale MPC8641 HPCN" | 13 | bool "Freescale MPC8641 HPCN" |
| @@ -24,7 +30,7 @@ config MPC8610_HPCD | |||
| 24 | help | 30 | help |
| 25 | This option enables support for the MPC8610 HPCD board. | 31 | This option enables support for the MPC8610 HPCD board. |
| 26 | 32 | ||
| 27 | endchoice | 33 | endif |
| 28 | 34 | ||
| 29 | config MPC8641 | 35 | config MPC8641 |
| 30 | bool | 36 | bool |
diff --git a/arch/powerpc/platforms/86xx/Makefile b/arch/powerpc/platforms/86xx/Makefile index 1b9b4a9b2525..8fee37dec795 100644 --- a/arch/powerpc/platforms/86xx/Makefile +++ b/arch/powerpc/platforms/86xx/Makefile | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | # Makefile for the PowerPC 86xx linux kernel. | 2 | # Makefile for the PowerPC 86xx linux kernel. |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | obj-y := pic.o | ||
| 5 | obj-$(CONFIG_SMP) += mpc86xx_smp.o | 6 | obj-$(CONFIG_SMP) += mpc86xx_smp.o |
| 6 | obj-$(CONFIG_MPC8641_HPCN) += mpc86xx_hpcn.o | 7 | obj-$(CONFIG_MPC8641_HPCN) += mpc86xx_hpcn.o |
| 7 | obj-$(CONFIG_SBC8641D) += sbc8641d.o | 8 | obj-$(CONFIG_SBC8641D) += sbc8641d.o |
diff --git a/arch/powerpc/platforms/86xx/mpc8610_hpcd.c b/arch/powerpc/platforms/86xx/mpc8610_hpcd.c index eb16208b29d9..30725302884a 100644 --- a/arch/powerpc/platforms/86xx/mpc8610_hpcd.c +++ b/arch/powerpc/platforms/86xx/mpc8610_hpcd.c | |||
| @@ -39,6 +39,8 @@ | |||
| 39 | #include <sysdev/fsl_pci.h> | 39 | #include <sysdev/fsl_pci.h> |
| 40 | #include <sysdev/fsl_soc.h> | 40 | #include <sysdev/fsl_soc.h> |
| 41 | 41 | ||
| 42 | #include "mpc86xx.h" | ||
| 43 | |||
| 42 | static unsigned char *pixis_bdcfg0, *pixis_arch; | 44 | static unsigned char *pixis_bdcfg0, *pixis_arch; |
| 43 | 45 | ||
| 44 | static struct of_device_id __initdata mpc8610_ids[] = { | 46 | static struct of_device_id __initdata mpc8610_ids[] = { |
| @@ -56,28 +58,6 @@ static int __init mpc8610_declare_of_platform_devices(void) | |||
| 56 | } | 58 | } |
| 57 | machine_device_initcall(mpc86xx_hpcd, mpc8610_declare_of_platform_devices); | 59 | machine_device_initcall(mpc86xx_hpcd, mpc8610_declare_of_platform_devices); |
| 58 | 60 | ||
| 59 | static void __init mpc86xx_hpcd_init_irq(void) | ||
| 60 | { | ||
| 61 | struct mpic *mpic1; | ||
| 62 | struct device_node *np; | ||
| 63 | struct resource res; | ||
| 64 | |||
| 65 | /* Determine PIC address. */ | ||
| 66 | np = of_find_node_by_type(NULL, "open-pic"); | ||
| 67 | if (np == NULL) | ||
| 68 | return; | ||
| 69 | of_address_to_resource(np, 0, &res); | ||
| 70 | |||
| 71 | /* Alloc mpic structure and per isu has 16 INT entries. */ | ||
| 72 | mpic1 = mpic_alloc(np, res.start, | ||
| 73 | MPIC_PRIMARY | MPIC_WANTS_RESET | | ||
| 74 | MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS, | ||
| 75 | 0, 256, " MPIC "); | ||
| 76 | BUG_ON(mpic1 == NULL); | ||
| 77 | |||
| 78 | mpic_init(mpic1); | ||
| 79 | } | ||
| 80 | |||
| 81 | #ifdef CONFIG_PCI | 61 | #ifdef CONFIG_PCI |
| 82 | static void __devinit quirk_uli1575(struct pci_dev *dev) | 62 | static void __devinit quirk_uli1575(struct pci_dev *dev) |
| 83 | { | 63 | { |
| @@ -405,7 +385,7 @@ define_machine(mpc86xx_hpcd) { | |||
| 405 | .name = "MPC86xx HPCD", | 385 | .name = "MPC86xx HPCD", |
| 406 | .probe = mpc86xx_hpcd_probe, | 386 | .probe = mpc86xx_hpcd_probe, |
| 407 | .setup_arch = mpc86xx_hpcd_setup_arch, | 387 | .setup_arch = mpc86xx_hpcd_setup_arch, |
| 408 | .init_IRQ = mpc86xx_hpcd_init_irq, | 388 | .init_IRQ = mpc86xx_init_irq, |
| 409 | .get_irq = mpic_get_irq, | 389 | .get_irq = mpic_get_irq, |
| 410 | .restart = fsl_rstcr_restart, | 390 | .restart = fsl_rstcr_restart, |
| 411 | .time_init = mpc86xx_time_init, | 391 | .time_init = mpc86xx_time_init, |
diff --git a/arch/powerpc/platforms/86xx/mpc86xx.h b/arch/powerpc/platforms/86xx/mpc86xx.h index 525ffa1904f9..08efb57559d1 100644 --- a/arch/powerpc/platforms/86xx/mpc86xx.h +++ b/arch/powerpc/platforms/86xx/mpc86xx.h | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | * mpc86xx_* files. Mostly for use by mpc86xx_setup(). | 15 | * mpc86xx_* files. Mostly for use by mpc86xx_setup(). |
| 16 | */ | 16 | */ |
| 17 | 17 | ||
| 18 | extern void __init mpc86xx_smp_init(void); | 18 | extern void mpc86xx_smp_init(void); |
| 19 | extern void mpc86xx_init_irq(void); | ||
| 19 | 20 | ||
| 20 | #endif /* __MPC86XX_H__ */ | 21 | #endif /* __MPC86XX_H__ */ |
diff --git a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c index f13704aabbea..7916599c9126 100644 --- a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c +++ b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c | |||
| @@ -28,7 +28,6 @@ | |||
| 28 | #include <asm/prom.h> | 28 | #include <asm/prom.h> |
| 29 | #include <mm/mmu_decl.h> | 29 | #include <mm/mmu_decl.h> |
| 30 | #include <asm/udbg.h> | 30 | #include <asm/udbg.h> |
| 31 | #include <asm/i8259.h> | ||
| 32 | 31 | ||
| 33 | #include <asm/mpic.h> | 32 | #include <asm/mpic.h> |
| 34 | 33 | ||
| @@ -46,67 +45,6 @@ | |||
| 46 | #endif | 45 | #endif |
| 47 | 46 | ||
| 48 | #ifdef CONFIG_PCI | 47 | #ifdef CONFIG_PCI |
| 49 | static void mpc86xx_8259_cascade(unsigned int irq, struct irq_desc *desc) | ||
| 50 | { | ||
| 51 | unsigned int cascade_irq = i8259_irq(); | ||
| 52 | if (cascade_irq != NO_IRQ) | ||
| 53 | generic_handle_irq(cascade_irq); | ||
| 54 | desc->chip->eoi(irq); | ||
| 55 | } | ||
| 56 | #endif /* CONFIG_PCI */ | ||
| 57 | |||
| 58 | static void __init | ||
| 59 | mpc86xx_hpcn_init_irq(void) | ||
| 60 | { | ||
| 61 | struct mpic *mpic1; | ||
| 62 | struct device_node *np; | ||
| 63 | struct resource res; | ||
| 64 | #ifdef CONFIG_PCI | ||
| 65 | struct device_node *cascade_node = NULL; | ||
| 66 | int cascade_irq; | ||
| 67 | #endif | ||
| 68 | |||
| 69 | /* Determine PIC address. */ | ||
| 70 | np = of_find_node_by_type(NULL, "open-pic"); | ||
| 71 | if (np == NULL) | ||
| 72 | return; | ||
| 73 | of_address_to_resource(np, 0, &res); | ||
| 74 | |||
| 75 | /* Alloc mpic structure and per isu has 16 INT entries. */ | ||
| 76 | mpic1 = mpic_alloc(np, res.start, | ||
| 77 | MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN, | ||
| 78 | 0, 256, " MPIC "); | ||
| 79 | BUG_ON(mpic1 == NULL); | ||
| 80 | |||
| 81 | mpic_init(mpic1); | ||
| 82 | |||
| 83 | #ifdef CONFIG_PCI | ||
| 84 | /* Initialize i8259 controller */ | ||
| 85 | for_each_node_by_type(np, "interrupt-controller") | ||
| 86 | if (of_device_is_compatible(np, "chrp,iic")) { | ||
| 87 | cascade_node = np; | ||
| 88 | break; | ||
| 89 | } | ||
| 90 | if (cascade_node == NULL) { | ||
| 91 | printk(KERN_DEBUG "mpc86xxhpcn: no ISA interrupt controller\n"); | ||
| 92 | return; | ||
| 93 | } | ||
| 94 | |||
| 95 | cascade_irq = irq_of_parse_and_map(cascade_node, 0); | ||
| 96 | if (cascade_irq == NO_IRQ) { | ||
| 97 | printk(KERN_ERR "mpc86xxhpcn: failed to map cascade interrupt"); | ||
| 98 | return; | ||
| 99 | } | ||
| 100 | DBG("mpc86xxhpcn: cascade mapped to irq %d\n", cascade_irq); | ||
| 101 | |||
| 102 | i8259_init(cascade_node, 0); | ||
| 103 | of_node_put(cascade_node); | ||
| 104 | |||
| 105 | set_irq_chained_handler(cascade_irq, mpc86xx_8259_cascade); | ||
| 106 | #endif | ||
| 107 | } | ||
| 108 | |||
| 109 | #ifdef CONFIG_PCI | ||
| 110 | extern int uses_fsl_uli_m1575; | 48 | extern int uses_fsl_uli_m1575; |
| 111 | extern int uli_exclude_device(struct pci_controller *hose, | 49 | extern int uli_exclude_device(struct pci_controller *hose, |
| 112 | u_char bus, u_char devfn); | 50 | u_char bus, u_char devfn); |
| @@ -237,7 +175,7 @@ define_machine(mpc86xx_hpcn) { | |||
| 237 | .name = "MPC86xx HPCN", | 175 | .name = "MPC86xx HPCN", |
| 238 | .probe = mpc86xx_hpcn_probe, | 176 | .probe = mpc86xx_hpcn_probe, |
| 239 | .setup_arch = mpc86xx_hpcn_setup_arch, | 177 | .setup_arch = mpc86xx_hpcn_setup_arch, |
| 240 | .init_IRQ = mpc86xx_hpcn_init_irq, | 178 | .init_IRQ = mpc86xx_init_irq, |
| 241 | .show_cpuinfo = mpc86xx_hpcn_show_cpuinfo, | 179 | .show_cpuinfo = mpc86xx_hpcn_show_cpuinfo, |
| 242 | .get_irq = mpic_get_irq, | 180 | .get_irq = mpic_get_irq, |
| 243 | .restart = fsl_rstcr_restart, | 181 | .restart = fsl_rstcr_restart, |
diff --git a/arch/powerpc/platforms/86xx/pic.c b/arch/powerpc/platforms/86xx/pic.c new file mode 100644 index 000000000000..8881c5de500d --- /dev/null +++ b/arch/powerpc/platforms/86xx/pic.c | |||
| @@ -0,0 +1,78 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008 Freescale Semiconductor, Inc. | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify it | ||
| 5 | * under the terms of the GNU General Public License as published by the | ||
| 6 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 7 | * option) any later version. | ||
| 8 | */ | ||
| 9 | |||
| 10 | #include <linux/stddef.h> | ||
| 11 | #include <linux/kernel.h> | ||
| 12 | #include <linux/interrupt.h> | ||
| 13 | #include <linux/of_platform.h> | ||
| 14 | |||
| 15 | #include <asm/system.h> | ||
| 16 | #include <asm/mpic.h> | ||
| 17 | #include <asm/i8259.h> | ||
| 18 | |||
| 19 | #ifdef CONFIG_PPC_I8259 | ||
| 20 | static void mpc86xx_8259_cascade(unsigned int irq, struct irq_desc *desc) | ||
| 21 | { | ||
| 22 | unsigned int cascade_irq = i8259_irq(); | ||
| 23 | if (cascade_irq != NO_IRQ) | ||
| 24 | generic_handle_irq(cascade_irq); | ||
| 25 | desc->chip->eoi(irq); | ||
| 26 | } | ||
| 27 | #endif /* CONFIG_PPC_I8259 */ | ||
| 28 | |||
| 29 | void __init mpc86xx_init_irq(void) | ||
| 30 | { | ||
| 31 | struct mpic *mpic; | ||
| 32 | struct device_node *np; | ||
| 33 | struct resource res; | ||
| 34 | #ifdef CONFIG_PPC_I8259 | ||
| 35 | struct device_node *cascade_node = NULL; | ||
| 36 | int cascade_irq; | ||
| 37 | #endif | ||
| 38 | |||
| 39 | /* Determine PIC address. */ | ||
| 40 | np = of_find_node_by_type(NULL, "open-pic"); | ||
| 41 | if (np == NULL) | ||
| 42 | return; | ||
| 43 | of_address_to_resource(np, 0, &res); | ||
| 44 | |||
| 45 | mpic = mpic_alloc(np, res.start, | ||
| 46 | MPIC_PRIMARY | MPIC_WANTS_RESET | | ||
| 47 | MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS, | ||
| 48 | 0, 256, " MPIC "); | ||
| 49 | of_node_put(np); | ||
| 50 | BUG_ON(mpic == NULL); | ||
| 51 | |||
| 52 | mpic_init(mpic); | ||
| 53 | |||
| 54 | #ifdef CONFIG_PPC_I8259 | ||
| 55 | /* Initialize i8259 controller */ | ||
| 56 | for_each_node_by_type(np, "interrupt-controller") | ||
| 57 | if (of_device_is_compatible(np, "chrp,iic")) { | ||
| 58 | cascade_node = np; | ||
| 59 | break; | ||
| 60 | } | ||
| 61 | |||
| 62 | if (cascade_node == NULL) { | ||
| 63 | printk(KERN_DEBUG "Could not find i8259 PIC\n"); | ||
| 64 | return; | ||
| 65 | } | ||
| 66 | |||
| 67 | cascade_irq = irq_of_parse_and_map(cascade_node, 0); | ||
| 68 | if (cascade_irq == NO_IRQ) { | ||
| 69 | printk(KERN_ERR "Failed to map cascade interrupt\n"); | ||
| 70 | return; | ||
| 71 | } | ||
| 72 | |||
| 73 | i8259_init(cascade_node, 0); | ||
| 74 | of_node_put(cascade_node); | ||
| 75 | |||
| 76 | set_irq_chained_handler(cascade_irq, mpc86xx_8259_cascade); | ||
| 77 | #endif | ||
| 78 | } | ||
diff --git a/arch/powerpc/platforms/86xx/sbc8641d.c b/arch/powerpc/platforms/86xx/sbc8641d.c index 510a06ef0b55..00e6fad3b3ca 100644 --- a/arch/powerpc/platforms/86xx/sbc8641d.c +++ b/arch/powerpc/platforms/86xx/sbc8641d.c | |||
| @@ -38,29 +38,6 @@ | |||
| 38 | #include "mpc86xx.h" | 38 | #include "mpc86xx.h" |
| 39 | 39 | ||
| 40 | static void __init | 40 | static void __init |
| 41 | sbc8641_init_irq(void) | ||
| 42 | { | ||
| 43 | struct mpic *mpic1; | ||
| 44 | struct device_node *np; | ||
| 45 | struct resource res; | ||
| 46 | |||
| 47 | /* Determine PIC address. */ | ||
| 48 | np = of_find_node_by_type(NULL, "open-pic"); | ||
| 49 | if (np == NULL) | ||
| 50 | return; | ||
| 51 | of_address_to_resource(np, 0, &res); | ||
| 52 | |||
| 53 | /* Alloc mpic structure and per isu has 16 INT entries. */ | ||
| 54 | mpic1 = mpic_alloc(np, res.start, | ||
| 55 | MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN, | ||
| 56 | 0, 256, " MPIC "); | ||
| 57 | of_node_put(np); | ||
| 58 | BUG_ON(mpic1 == NULL); | ||
| 59 | |||
| 60 | mpic_init(mpic1); | ||
| 61 | } | ||
| 62 | |||
| 63 | static void __init | ||
| 64 | sbc8641_setup_arch(void) | 41 | sbc8641_setup_arch(void) |
| 65 | { | 42 | { |
| 66 | #ifdef CONFIG_PCI | 43 | #ifdef CONFIG_PCI |
| @@ -151,7 +128,7 @@ define_machine(sbc8641) { | |||
| 151 | .name = "SBC8641D", | 128 | .name = "SBC8641D", |
| 152 | .probe = sbc8641_probe, | 129 | .probe = sbc8641_probe, |
| 153 | .setup_arch = sbc8641_setup_arch, | 130 | .setup_arch = sbc8641_setup_arch, |
| 154 | .init_IRQ = sbc8641_init_irq, | 131 | .init_IRQ = mpc86xx_init_irq, |
| 155 | .show_cpuinfo = sbc8641_show_cpuinfo, | 132 | .show_cpuinfo = sbc8641_show_cpuinfo, |
| 156 | .get_irq = mpic_get_irq, | 133 | .get_irq = mpic_get_irq, |
| 157 | .restart = fsl_rstcr_restart, | 134 | .restart = fsl_rstcr_restart, |
diff --git a/arch/powerpc/platforms/8xx/mpc86xads_setup.c b/arch/powerpc/platforms/8xx/mpc86xads_setup.c index c028a5b71bbb..caaec29796b7 100644 --- a/arch/powerpc/platforms/8xx/mpc86xads_setup.c +++ b/arch/powerpc/platforms/8xx/mpc86xads_setup.c | |||
| @@ -65,6 +65,10 @@ static struct cpm_pin mpc866ads_pins[] = { | |||
| 65 | {CPM_PORTD, 13, CPM_PIN_OUTPUT}, | 65 | {CPM_PORTD, 13, CPM_PIN_OUTPUT}, |
| 66 | {CPM_PORTD, 14, CPM_PIN_OUTPUT}, | 66 | {CPM_PORTD, 14, CPM_PIN_OUTPUT}, |
| 67 | {CPM_PORTD, 15, CPM_PIN_OUTPUT}, | 67 | {CPM_PORTD, 15, CPM_PIN_OUTPUT}, |
| 68 | |||
| 69 | /* I2C */ | ||
| 70 | {CPM_PORTB, 26, CPM_PIN_INPUT | CPM_PIN_OPENDRAIN}, | ||
| 71 | {CPM_PORTB, 27, CPM_PIN_INPUT | CPM_PIN_OPENDRAIN}, | ||
| 68 | }; | 72 | }; |
| 69 | 73 | ||
| 70 | static void __init init_ioports(void) | 74 | static void __init init_ioports(void) |
diff --git a/arch/powerpc/platforms/8xx/mpc885ads_setup.c b/arch/powerpc/platforms/8xx/mpc885ads_setup.c index 6e7ded0233f6..45ed6cdc1310 100644 --- a/arch/powerpc/platforms/8xx/mpc885ads_setup.c +++ b/arch/powerpc/platforms/8xx/mpc885ads_setup.c | |||
| @@ -158,6 +158,9 @@ static struct cpm_pin mpc885ads_pins[] = { | |||
| 158 | {CPM_PORTE, 28, CPM_PIN_OUTPUT}, | 158 | {CPM_PORTE, 28, CPM_PIN_OUTPUT}, |
| 159 | {CPM_PORTE, 29, CPM_PIN_OUTPUT}, | 159 | {CPM_PORTE, 29, CPM_PIN_OUTPUT}, |
| 160 | #endif | 160 | #endif |
| 161 | /* I2C */ | ||
| 162 | {CPM_PORTB, 26, CPM_PIN_INPUT | CPM_PIN_OPENDRAIN}, | ||
| 163 | {CPM_PORTB, 27, CPM_PIN_INPUT | CPM_PIN_OPENDRAIN}, | ||
| 161 | }; | 164 | }; |
| 162 | 165 | ||
| 163 | static void __init init_ioports(void) | 166 | static void __init init_ioports(void) |
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index 87454c526973..690c1f46e698 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig | |||
| @@ -1,36 +1,9 @@ | |||
| 1 | menu "Platform support" | 1 | menu "Platform support" |
| 2 | 2 | ||
| 3 | choice | ||
| 4 | prompt "Machine type" | ||
| 5 | depends on PPC64 || 6xx | ||
| 6 | default PPC_MULTIPLATFORM | ||
| 7 | |||
| 8 | config PPC_MULTIPLATFORM | 3 | config PPC_MULTIPLATFORM |
| 9 | bool "Generic desktop/server/laptop" | 4 | bool |
| 10 | help | 5 | depends on PPC64 || 6xx |
| 11 | Select this option if configuring for an IBM pSeries or | 6 | default y |
| 12 | RS/6000 machine, an Apple machine, or a PReP, CHRP, | ||
| 13 | Maple or Cell-based machine. | ||
| 14 | |||
| 15 | config PPC_82xx | ||
| 16 | bool "Freescale 82xx" | ||
| 17 | depends on 6xx | ||
| 18 | |||
| 19 | config PPC_83xx | ||
| 20 | bool "Freescale 83xx" | ||
| 21 | depends on 6xx | ||
| 22 | select FSL_SOC | ||
| 23 | select MPC83xx | ||
| 24 | select IPIC | ||
| 25 | |||
| 26 | config PPC_86xx | ||
| 27 | bool "Freescale 86xx" | ||
| 28 | depends on 6xx | ||
| 29 | select FSL_SOC | ||
| 30 | select ALTIVEC | ||
| 31 | help | ||
| 32 | The Freescale E600 SoCs have 74xx cores. | ||
| 33 | endchoice | ||
| 34 | 7 | ||
| 35 | config CLASSIC32 | 8 | config CLASSIC32 |
| 36 | def_bool y | 9 | def_bool y |
diff --git a/arch/powerpc/platforms/cell/iommu.c b/arch/powerpc/platforms/cell/iommu.c index 45646b2b4af4..eeacb3a52ca1 100644 --- a/arch/powerpc/platforms/cell/iommu.c +++ b/arch/powerpc/platforms/cell/iommu.c | |||
| @@ -540,7 +540,7 @@ static unsigned long cell_dma_direct_offset; | |||
| 540 | static unsigned long dma_iommu_fixed_base; | 540 | static unsigned long dma_iommu_fixed_base; |
| 541 | struct dma_mapping_ops dma_iommu_fixed_ops; | 541 | struct dma_mapping_ops dma_iommu_fixed_ops; |
| 542 | 542 | ||
| 543 | static void cell_dma_dev_setup_iommu(struct device *dev) | 543 | static struct iommu_table *cell_get_iommu_table(struct device *dev) |
| 544 | { | 544 | { |
| 545 | struct iommu_window *window; | 545 | struct iommu_window *window; |
| 546 | struct cbe_iommu *iommu; | 546 | struct cbe_iommu *iommu; |
| @@ -555,11 +555,11 @@ static void cell_dma_dev_setup_iommu(struct device *dev) | |||
| 555 | printk(KERN_ERR "iommu: missing iommu for %s (node %d)\n", | 555 | printk(KERN_ERR "iommu: missing iommu for %s (node %d)\n", |
| 556 | archdata->of_node ? archdata->of_node->full_name : "?", | 556 | archdata->of_node ? archdata->of_node->full_name : "?", |
| 557 | archdata->numa_node); | 557 | archdata->numa_node); |
| 558 | return; | 558 | return NULL; |
| 559 | } | 559 | } |
| 560 | window = list_entry(iommu->windows.next, struct iommu_window, list); | 560 | window = list_entry(iommu->windows.next, struct iommu_window, list); |
| 561 | 561 | ||
| 562 | archdata->dma_data = &window->table; | 562 | return &window->table; |
| 563 | } | 563 | } |
| 564 | 564 | ||
| 565 | static void cell_dma_dev_setup_fixed(struct device *dev); | 565 | static void cell_dma_dev_setup_fixed(struct device *dev); |
| @@ -572,7 +572,7 @@ static void cell_dma_dev_setup(struct device *dev) | |||
| 572 | if (get_dma_ops(dev) == &dma_iommu_fixed_ops) | 572 | if (get_dma_ops(dev) == &dma_iommu_fixed_ops) |
| 573 | cell_dma_dev_setup_fixed(dev); | 573 | cell_dma_dev_setup_fixed(dev); |
| 574 | else if (get_pci_dma_ops() == &dma_iommu_ops) | 574 | else if (get_pci_dma_ops() == &dma_iommu_ops) |
| 575 | cell_dma_dev_setup_iommu(dev); | 575 | archdata->dma_data = cell_get_iommu_table(dev); |
| 576 | else if (get_pci_dma_ops() == &dma_direct_ops) | 576 | else if (get_pci_dma_ops() == &dma_direct_ops) |
| 577 | archdata->dma_data = (void *)cell_dma_direct_offset; | 577 | archdata->dma_data = (void *)cell_dma_direct_offset; |
| 578 | else | 578 | else |
diff --git a/arch/powerpc/platforms/cell/spufs/context.c b/arch/powerpc/platforms/cell/spufs/context.c index 177735f79317..6653ddbed048 100644 --- a/arch/powerpc/platforms/cell/spufs/context.c +++ b/arch/powerpc/platforms/cell/spufs/context.c | |||
| @@ -130,17 +130,17 @@ void spu_unmap_mappings(struct spu_context *ctx) | |||
| 130 | if (ctx->local_store) | 130 | if (ctx->local_store) |
| 131 | unmap_mapping_range(ctx->local_store, 0, LS_SIZE, 1); | 131 | unmap_mapping_range(ctx->local_store, 0, LS_SIZE, 1); |
| 132 | if (ctx->mfc) | 132 | if (ctx->mfc) |
| 133 | unmap_mapping_range(ctx->mfc, 0, 0x1000, 1); | 133 | unmap_mapping_range(ctx->mfc, 0, SPUFS_MFC_MAP_SIZE, 1); |
| 134 | if (ctx->cntl) | 134 | if (ctx->cntl) |
| 135 | unmap_mapping_range(ctx->cntl, 0, 0x1000, 1); | 135 | unmap_mapping_range(ctx->cntl, 0, SPUFS_CNTL_MAP_SIZE, 1); |
| 136 | if (ctx->signal1) | 136 | if (ctx->signal1) |
| 137 | unmap_mapping_range(ctx->signal1, 0, PAGE_SIZE, 1); | 137 | unmap_mapping_range(ctx->signal1, 0, SPUFS_SIGNAL_MAP_SIZE, 1); |
| 138 | if (ctx->signal2) | 138 | if (ctx->signal2) |
| 139 | unmap_mapping_range(ctx->signal2, 0, PAGE_SIZE, 1); | 139 | unmap_mapping_range(ctx->signal2, 0, SPUFS_SIGNAL_MAP_SIZE, 1); |
| 140 | if (ctx->mss) | 140 | if (ctx->mss) |
| 141 | unmap_mapping_range(ctx->mss, 0, 0x1000, 1); | 141 | unmap_mapping_range(ctx->mss, 0, SPUFS_MSS_MAP_SIZE, 1); |
| 142 | if (ctx->psmap) | 142 | if (ctx->psmap) |
| 143 | unmap_mapping_range(ctx->psmap, 0, 0x20000, 1); | 143 | unmap_mapping_range(ctx->psmap, 0, SPUFS_PS_MAP_SIZE, 1); |
| 144 | mutex_unlock(&ctx->mapping_lock); | 144 | mutex_unlock(&ctx->mapping_lock); |
| 145 | } | 145 | } |
| 146 | 146 | ||
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c index f74259979cb6..99c73066b82f 100644 --- a/arch/powerpc/platforms/cell/spufs/file.c +++ b/arch/powerpc/platforms/cell/spufs/file.c | |||
| @@ -410,7 +410,7 @@ refault: | |||
| 410 | static int spufs_cntl_mmap_fault(struct vm_area_struct *vma, | 410 | static int spufs_cntl_mmap_fault(struct vm_area_struct *vma, |
| 411 | struct vm_fault *vmf) | 411 | struct vm_fault *vmf) |
| 412 | { | 412 | { |
| 413 | return spufs_ps_fault(vma, vmf, 0x4000, 0x1000); | 413 | return spufs_ps_fault(vma, vmf, 0x4000, SPUFS_CNTL_MAP_SIZE); |
| 414 | } | 414 | } |
| 415 | 415 | ||
| 416 | static struct vm_operations_struct spufs_cntl_mmap_vmops = { | 416 | static struct vm_operations_struct spufs_cntl_mmap_vmops = { |
| @@ -1102,13 +1102,13 @@ static ssize_t spufs_signal1_write(struct file *file, const char __user *buf, | |||
| 1102 | static int | 1102 | static int |
| 1103 | spufs_signal1_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | 1103 | spufs_signal1_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
| 1104 | { | 1104 | { |
| 1105 | #if PAGE_SIZE == 0x1000 | 1105 | #if SPUFS_SIGNAL_MAP_SIZE == 0x1000 |
| 1106 | return spufs_ps_fault(vma, vmf, 0x14000, 0x1000); | 1106 | return spufs_ps_fault(vma, vmf, 0x14000, SPUFS_SIGNAL_MAP_SIZE); |
| 1107 | #elif PAGE_SIZE == 0x10000 | 1107 | #elif SPUFS_SIGNAL_MAP_SIZE == 0x10000 |
| 1108 | /* For 64k pages, both signal1 and signal2 can be used to mmap the whole | 1108 | /* For 64k pages, both signal1 and signal2 can be used to mmap the whole |
| 1109 | * signal 1 and 2 area | 1109 | * signal 1 and 2 area |
| 1110 | */ | 1110 | */ |
| 1111 | return spufs_ps_fault(vma, vmf, 0x10000, 0x10000); | 1111 | return spufs_ps_fault(vma, vmf, 0x10000, SPUFS_SIGNAL_MAP_SIZE); |
| 1112 | #else | 1112 | #else |
| 1113 | #error unsupported page size | 1113 | #error unsupported page size |
| 1114 | #endif | 1114 | #endif |
| @@ -1239,13 +1239,13 @@ static ssize_t spufs_signal2_write(struct file *file, const char __user *buf, | |||
| 1239 | static int | 1239 | static int |
| 1240 | spufs_signal2_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | 1240 | spufs_signal2_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
| 1241 | { | 1241 | { |
| 1242 | #if PAGE_SIZE == 0x1000 | 1242 | #if SPUFS_SIGNAL_MAP_SIZE == 0x1000 |
| 1243 | return spufs_ps_fault(vma, vmf, 0x1c000, 0x1000); | 1243 | return spufs_ps_fault(vma, vmf, 0x1c000, SPUFS_SIGNAL_MAP_SIZE); |
| 1244 | #elif PAGE_SIZE == 0x10000 | 1244 | #elif SPUFS_SIGNAL_MAP_SIZE == 0x10000 |
| 1245 | /* For 64k pages, both signal1 and signal2 can be used to mmap the whole | 1245 | /* For 64k pages, both signal1 and signal2 can be used to mmap the whole |
| 1246 | * signal 1 and 2 area | 1246 | * signal 1 and 2 area |
| 1247 | */ | 1247 | */ |
| 1248 | return spufs_ps_fault(vma, vmf, 0x10000, 0x10000); | 1248 | return spufs_ps_fault(vma, vmf, 0x10000, SPUFS_SIGNAL_MAP_SIZE); |
| 1249 | #else | 1249 | #else |
| 1250 | #error unsupported page size | 1250 | #error unsupported page size |
| 1251 | #endif | 1251 | #endif |
| @@ -1367,7 +1367,7 @@ DEFINE_SPUFS_ATTRIBUTE(spufs_signal2_type, spufs_signal2_type_get, | |||
| 1367 | static int | 1367 | static int |
| 1368 | spufs_mss_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | 1368 | spufs_mss_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
| 1369 | { | 1369 | { |
| 1370 | return spufs_ps_fault(vma, vmf, 0x0000, 0x1000); | 1370 | return spufs_ps_fault(vma, vmf, 0x0000, SPUFS_MSS_MAP_SIZE); |
| 1371 | } | 1371 | } |
| 1372 | 1372 | ||
| 1373 | static struct vm_operations_struct spufs_mss_mmap_vmops = { | 1373 | static struct vm_operations_struct spufs_mss_mmap_vmops = { |
| @@ -1429,7 +1429,7 @@ static const struct file_operations spufs_mss_fops = { | |||
| 1429 | static int | 1429 | static int |
| 1430 | spufs_psmap_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | 1430 | spufs_psmap_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
| 1431 | { | 1431 | { |
| 1432 | return spufs_ps_fault(vma, vmf, 0x0000, 0x20000); | 1432 | return spufs_ps_fault(vma, vmf, 0x0000, SPUFS_PS_MAP_SIZE); |
| 1433 | } | 1433 | } |
| 1434 | 1434 | ||
| 1435 | static struct vm_operations_struct spufs_psmap_mmap_vmops = { | 1435 | static struct vm_operations_struct spufs_psmap_mmap_vmops = { |
| @@ -1489,7 +1489,7 @@ static const struct file_operations spufs_psmap_fops = { | |||
| 1489 | static int | 1489 | static int |
| 1490 | spufs_mfc_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | 1490 | spufs_mfc_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
| 1491 | { | 1491 | { |
| 1492 | return spufs_ps_fault(vma, vmf, 0x3000, 0x1000); | 1492 | return spufs_ps_fault(vma, vmf, 0x3000, SPUFS_MFC_MAP_SIZE); |
| 1493 | } | 1493 | } |
| 1494 | 1494 | ||
| 1495 | static struct vm_operations_struct spufs_mfc_mmap_vmops = { | 1495 | static struct vm_operations_struct spufs_mfc_mmap_vmops = { |
| @@ -2555,22 +2555,74 @@ void spu_switch_log_notify(struct spu *spu, struct spu_context *ctx, | |||
| 2555 | wake_up(&ctx->switch_log->wait); | 2555 | wake_up(&ctx->switch_log->wait); |
| 2556 | } | 2556 | } |
| 2557 | 2557 | ||
| 2558 | struct tree_descr spufs_dir_contents[] = { | 2558 | static int spufs_show_ctx(struct seq_file *s, void *private) |
| 2559 | { | ||
| 2560 | struct spu_context *ctx = s->private; | ||
| 2561 | u64 mfc_control_RW; | ||
| 2562 | |||
| 2563 | mutex_lock(&ctx->state_mutex); | ||
| 2564 | if (ctx->spu) { | ||
| 2565 | struct spu *spu = ctx->spu; | ||
| 2566 | struct spu_priv2 __iomem *priv2 = spu->priv2; | ||
| 2567 | |||
| 2568 | spin_lock_irq(&spu->register_lock); | ||
| 2569 | mfc_control_RW = in_be64(&priv2->mfc_control_RW); | ||
| 2570 | spin_unlock_irq(&spu->register_lock); | ||
| 2571 | } else { | ||
| 2572 | struct spu_state *csa = &ctx->csa; | ||
| 2573 | |||
| 2574 | mfc_control_RW = csa->priv2.mfc_control_RW; | ||
| 2575 | } | ||
| 2576 | |||
| 2577 | seq_printf(s, "%c flgs(%lx) sflgs(%lx) pri(%d) ts(%d) spu(%02d)" | ||
| 2578 | " %c %lx %lx %lx %lx %x %x\n", | ||
| 2579 | ctx->state == SPU_STATE_SAVED ? 'S' : 'R', | ||
| 2580 | ctx->flags, | ||
| 2581 | ctx->sched_flags, | ||
| 2582 | ctx->prio, | ||
| 2583 | ctx->time_slice, | ||
| 2584 | ctx->spu ? ctx->spu->number : -1, | ||
| 2585 | !list_empty(&ctx->rq) ? 'q' : ' ', | ||
| 2586 | ctx->csa.class_0_pending, | ||
| 2587 | ctx->csa.class_0_dar, | ||
| 2588 | ctx->csa.class_1_dsisr, | ||
| 2589 | mfc_control_RW, | ||
| 2590 | ctx->ops->runcntl_read(ctx), | ||
| 2591 | ctx->ops->status_read(ctx)); | ||
| 2592 | |||
| 2593 | mutex_unlock(&ctx->state_mutex); | ||
| 2594 | |||
| 2595 | return 0; | ||
| 2596 | } | ||
| 2597 | |||
| 2598 | static int spufs_ctx_open(struct inode *inode, struct file *file) | ||
| 2599 | { | ||
| 2600 | return single_open(file, spufs_show_ctx, SPUFS_I(inode)->i_ctx); | ||
| 2601 | } | ||
| 2602 | |||
| 2603 | static const struct file_operations spufs_ctx_fops = { | ||
| 2604 | .open = spufs_ctx_open, | ||
| 2605 | .read = seq_read, | ||
| 2606 | .llseek = seq_lseek, | ||
| 2607 | .release = single_release, | ||
| 2608 | }; | ||
| 2609 | |||
| 2610 | struct spufs_tree_descr spufs_dir_contents[] = { | ||
| 2559 | { "capabilities", &spufs_caps_fops, 0444, }, | 2611 | { "capabilities", &spufs_caps_fops, 0444, }, |
| 2560 | { "mem", &spufs_mem_fops, 0666, }, | 2612 | { "mem", &spufs_mem_fops, 0666, LS_SIZE, }, |
| 2561 | { "regs", &spufs_regs_fops, 0666, }, | 2613 | { "regs", &spufs_regs_fops, 0666, sizeof(struct spu_reg128[128]), }, |
| 2562 | { "mbox", &spufs_mbox_fops, 0444, }, | 2614 | { "mbox", &spufs_mbox_fops, 0444, }, |
| 2563 | { "ibox", &spufs_ibox_fops, 0444, }, | 2615 | { "ibox", &spufs_ibox_fops, 0444, }, |
| 2564 | { "wbox", &spufs_wbox_fops, 0222, }, | 2616 | { "wbox", &spufs_wbox_fops, 0222, }, |
| 2565 | { "mbox_stat", &spufs_mbox_stat_fops, 0444, }, | 2617 | { "mbox_stat", &spufs_mbox_stat_fops, 0444, sizeof(u32), }, |
| 2566 | { "ibox_stat", &spufs_ibox_stat_fops, 0444, }, | 2618 | { "ibox_stat", &spufs_ibox_stat_fops, 0444, sizeof(u32), }, |
| 2567 | { "wbox_stat", &spufs_wbox_stat_fops, 0444, }, | 2619 | { "wbox_stat", &spufs_wbox_stat_fops, 0444, sizeof(u32), }, |
| 2568 | { "signal1", &spufs_signal1_fops, 0666, }, | 2620 | { "signal1", &spufs_signal1_fops, 0666, }, |
| 2569 | { "signal2", &spufs_signal2_fops, 0666, }, | 2621 | { "signal2", &spufs_signal2_fops, 0666, }, |
| 2570 | { "signal1_type", &spufs_signal1_type, 0666, }, | 2622 | { "signal1_type", &spufs_signal1_type, 0666, }, |
| 2571 | { "signal2_type", &spufs_signal2_type, 0666, }, | 2623 | { "signal2_type", &spufs_signal2_type, 0666, }, |
| 2572 | { "cntl", &spufs_cntl_fops, 0666, }, | 2624 | { "cntl", &spufs_cntl_fops, 0666, }, |
| 2573 | { "fpcr", &spufs_fpcr_fops, 0666, }, | 2625 | { "fpcr", &spufs_fpcr_fops, 0666, sizeof(struct spu_reg128), }, |
| 2574 | { "lslr", &spufs_lslr_ops, 0444, }, | 2626 | { "lslr", &spufs_lslr_ops, 0444, }, |
| 2575 | { "mfc", &spufs_mfc_fops, 0666, }, | 2627 | { "mfc", &spufs_mfc_fops, 0666, }, |
| 2576 | { "mss", &spufs_mss_fops, 0666, }, | 2628 | { "mss", &spufs_mss_fops, 0666, }, |
| @@ -2580,29 +2632,31 @@ struct tree_descr spufs_dir_contents[] = { | |||
| 2580 | { "decr_status", &spufs_decr_status_ops, 0666, }, | 2632 | { "decr_status", &spufs_decr_status_ops, 0666, }, |
| 2581 | { "event_mask", &spufs_event_mask_ops, 0666, }, | 2633 | { "event_mask", &spufs_event_mask_ops, 0666, }, |
| 2582 | { "event_status", &spufs_event_status_ops, 0444, }, | 2634 | { "event_status", &spufs_event_status_ops, 0444, }, |
| 2583 | { "psmap", &spufs_psmap_fops, 0666, }, | 2635 | { "psmap", &spufs_psmap_fops, 0666, SPUFS_PS_MAP_SIZE, }, |
| 2584 | { "phys-id", &spufs_id_ops, 0666, }, | 2636 | { "phys-id", &spufs_id_ops, 0666, }, |
| 2585 | { "object-id", &spufs_object_id_ops, 0666, }, | 2637 | { "object-id", &spufs_object_id_ops, 0666, }, |
| 2586 | { "mbox_info", &spufs_mbox_info_fops, 0444, }, | 2638 | { "mbox_info", &spufs_mbox_info_fops, 0444, sizeof(u32), }, |
| 2587 | { "ibox_info", &spufs_ibox_info_fops, 0444, }, | 2639 | { "ibox_info", &spufs_ibox_info_fops, 0444, sizeof(u32), }, |
| 2588 | { "wbox_info", &spufs_wbox_info_fops, 0444, }, | 2640 | { "wbox_info", &spufs_wbox_info_fops, 0444, sizeof(u32), }, |
| 2589 | { "dma_info", &spufs_dma_info_fops, 0444, }, | 2641 | { "dma_info", &spufs_dma_info_fops, 0444, |
| 2590 | { "proxydma_info", &spufs_proxydma_info_fops, 0444, }, | 2642 | sizeof(struct spu_dma_info), }, |
| 2643 | { "proxydma_info", &spufs_proxydma_info_fops, 0444, | ||
| 2644 | sizeof(struct spu_proxydma_info)}, | ||
| 2591 | { "tid", &spufs_tid_fops, 0444, }, | 2645 | { "tid", &spufs_tid_fops, 0444, }, |
| 2592 | { "stat", &spufs_stat_fops, 0444, }, | 2646 | { "stat", &spufs_stat_fops, 0444, }, |
| 2593 | { "switch_log", &spufs_switch_log_fops, 0444 }, | 2647 | { "switch_log", &spufs_switch_log_fops, 0444 }, |
| 2594 | {}, | 2648 | {}, |
| 2595 | }; | 2649 | }; |
| 2596 | 2650 | ||
| 2597 | struct tree_descr spufs_dir_nosched_contents[] = { | 2651 | struct spufs_tree_descr spufs_dir_nosched_contents[] = { |
| 2598 | { "capabilities", &spufs_caps_fops, 0444, }, | 2652 | { "capabilities", &spufs_caps_fops, 0444, }, |
| 2599 | { "mem", &spufs_mem_fops, 0666, }, | 2653 | { "mem", &spufs_mem_fops, 0666, LS_SIZE, }, |
| 2600 | { "mbox", &spufs_mbox_fops, 0444, }, | 2654 | { "mbox", &spufs_mbox_fops, 0444, }, |
| 2601 | { "ibox", &spufs_ibox_fops, 0444, }, | 2655 | { "ibox", &spufs_ibox_fops, 0444, }, |
| 2602 | { "wbox", &spufs_wbox_fops, 0222, }, | 2656 | { "wbox", &spufs_wbox_fops, 0222, }, |
| 2603 | { "mbox_stat", &spufs_mbox_stat_fops, 0444, }, | 2657 | { "mbox_stat", &spufs_mbox_stat_fops, 0444, sizeof(u32), }, |
| 2604 | { "ibox_stat", &spufs_ibox_stat_fops, 0444, }, | 2658 | { "ibox_stat", &spufs_ibox_stat_fops, 0444, sizeof(u32), }, |
| 2605 | { "wbox_stat", &spufs_wbox_stat_fops, 0444, }, | 2659 | { "wbox_stat", &spufs_wbox_stat_fops, 0444, sizeof(u32), }, |
| 2606 | { "signal1", &spufs_signal1_nosched_fops, 0222, }, | 2660 | { "signal1", &spufs_signal1_nosched_fops, 0222, }, |
| 2607 | { "signal2", &spufs_signal2_nosched_fops, 0222, }, | 2661 | { "signal2", &spufs_signal2_nosched_fops, 0222, }, |
| 2608 | { "signal1_type", &spufs_signal1_type, 0666, }, | 2662 | { "signal1_type", &spufs_signal1_type, 0666, }, |
| @@ -2611,7 +2665,7 @@ struct tree_descr spufs_dir_nosched_contents[] = { | |||
| 2611 | { "mfc", &spufs_mfc_fops, 0666, }, | 2665 | { "mfc", &spufs_mfc_fops, 0666, }, |
| 2612 | { "cntl", &spufs_cntl_fops, 0666, }, | 2666 | { "cntl", &spufs_cntl_fops, 0666, }, |
| 2613 | { "npc", &spufs_npc_ops, 0666, }, | 2667 | { "npc", &spufs_npc_ops, 0666, }, |
| 2614 | { "psmap", &spufs_psmap_fops, 0666, }, | 2668 | { "psmap", &spufs_psmap_fops, 0666, SPUFS_PS_MAP_SIZE, }, |
| 2615 | { "phys-id", &spufs_id_ops, 0666, }, | 2669 | { "phys-id", &spufs_id_ops, 0666, }, |
| 2616 | { "object-id", &spufs_object_id_ops, 0666, }, | 2670 | { "object-id", &spufs_object_id_ops, 0666, }, |
| 2617 | { "tid", &spufs_tid_fops, 0444, }, | 2671 | { "tid", &spufs_tid_fops, 0444, }, |
| @@ -2619,6 +2673,11 @@ struct tree_descr spufs_dir_nosched_contents[] = { | |||
| 2619 | {}, | 2673 | {}, |
| 2620 | }; | 2674 | }; |
| 2621 | 2675 | ||
| 2676 | struct spufs_tree_descr spufs_dir_debug_contents[] = { | ||
| 2677 | { ".ctx", &spufs_ctx_fops, 0444, }, | ||
| 2678 | {}, | ||
| 2679 | }; | ||
| 2680 | |||
| 2622 | struct spufs_coredump_reader spufs_coredump_read[] = { | 2681 | struct spufs_coredump_reader spufs_coredump_read[] = { |
| 2623 | { "regs", __spufs_regs_read, NULL, sizeof(struct spu_reg128[128])}, | 2682 | { "regs", __spufs_regs_read, NULL, sizeof(struct spu_reg128[128])}, |
| 2624 | { "fpcr", __spufs_fpcr_read, NULL, sizeof(struct spu_reg128) }, | 2683 | { "fpcr", __spufs_fpcr_read, NULL, sizeof(struct spu_reg128) }, |
diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c index f407b2471855..7123472801d9 100644 --- a/arch/powerpc/platforms/cell/spufs/inode.c +++ b/arch/powerpc/platforms/cell/spufs/inode.c | |||
| @@ -42,10 +42,19 @@ | |||
| 42 | 42 | ||
| 43 | #include "spufs.h" | 43 | #include "spufs.h" |
| 44 | 44 | ||
| 45 | struct spufs_sb_info { | ||
| 46 | int debug; | ||
| 47 | }; | ||
| 48 | |||
| 45 | static struct kmem_cache *spufs_inode_cache; | 49 | static struct kmem_cache *spufs_inode_cache; |
| 46 | char *isolated_loader; | 50 | char *isolated_loader; |
| 47 | static int isolated_loader_size; | 51 | static int isolated_loader_size; |
| 48 | 52 | ||
| 53 | static struct spufs_sb_info *spufs_get_sb_info(struct super_block *sb) | ||
| 54 | { | ||
| 55 | return sb->s_fs_info; | ||
| 56 | } | ||
| 57 | |||
| 49 | static struct inode * | 58 | static struct inode * |
| 50 | spufs_alloc_inode(struct super_block *sb) | 59 | spufs_alloc_inode(struct super_block *sb) |
| 51 | { | 60 | { |
| @@ -109,7 +118,7 @@ spufs_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 109 | static int | 118 | static int |
| 110 | spufs_new_file(struct super_block *sb, struct dentry *dentry, | 119 | spufs_new_file(struct super_block *sb, struct dentry *dentry, |
| 111 | const struct file_operations *fops, int mode, | 120 | const struct file_operations *fops, int mode, |
| 112 | struct spu_context *ctx) | 121 | size_t size, struct spu_context *ctx) |
| 113 | { | 122 | { |
| 114 | static struct inode_operations spufs_file_iops = { | 123 | static struct inode_operations spufs_file_iops = { |
| 115 | .setattr = spufs_setattr, | 124 | .setattr = spufs_setattr, |
| @@ -125,6 +134,7 @@ spufs_new_file(struct super_block *sb, struct dentry *dentry, | |||
| 125 | ret = 0; | 134 | ret = 0; |
| 126 | inode->i_op = &spufs_file_iops; | 135 | inode->i_op = &spufs_file_iops; |
| 127 | inode->i_fop = fops; | 136 | inode->i_fop = fops; |
| 137 | inode->i_size = size; | ||
| 128 | inode->i_private = SPUFS_I(inode)->i_ctx = get_spu_context(ctx); | 138 | inode->i_private = SPUFS_I(inode)->i_ctx = get_spu_context(ctx); |
| 129 | d_add(dentry, inode); | 139 | d_add(dentry, inode); |
| 130 | out: | 140 | out: |
| @@ -177,7 +187,7 @@ static int spufs_rmdir(struct inode *parent, struct dentry *dir) | |||
| 177 | return simple_rmdir(parent, dir); | 187 | return simple_rmdir(parent, dir); |
| 178 | } | 188 | } |
| 179 | 189 | ||
| 180 | static int spufs_fill_dir(struct dentry *dir, struct tree_descr *files, | 190 | static int spufs_fill_dir(struct dentry *dir, struct spufs_tree_descr *files, |
| 181 | int mode, struct spu_context *ctx) | 191 | int mode, struct spu_context *ctx) |
| 182 | { | 192 | { |
| 183 | struct dentry *dentry, *tmp; | 193 | struct dentry *dentry, *tmp; |
| @@ -189,7 +199,7 @@ static int spufs_fill_dir(struct dentry *dir, struct tree_descr *files, | |||
| 189 | if (!dentry) | 199 | if (!dentry) |
| 190 | goto out; | 200 | goto out; |
| 191 | ret = spufs_new_file(dir->d_sb, dentry, files->ops, | 201 | ret = spufs_new_file(dir->d_sb, dentry, files->ops, |
| 192 | files->mode & mode, ctx); | 202 | files->mode & mode, files->size, ctx); |
| 193 | if (ret) | 203 | if (ret) |
| 194 | goto out; | 204 | goto out; |
| 195 | files++; | 205 | files++; |
| @@ -279,6 +289,13 @@ spufs_mkdir(struct inode *dir, struct dentry *dentry, unsigned int flags, | |||
| 279 | if (ret) | 289 | if (ret) |
| 280 | goto out_free_ctx; | 290 | goto out_free_ctx; |
| 281 | 291 | ||
| 292 | if (spufs_get_sb_info(dir->i_sb)->debug) | ||
| 293 | ret = spufs_fill_dir(dentry, spufs_dir_debug_contents, | ||
| 294 | mode, ctx); | ||
| 295 | |||
| 296 | if (ret) | ||
| 297 | goto out_free_ctx; | ||
| 298 | |||
| 282 | d_instantiate(dentry, inode); | 299 | d_instantiate(dentry, inode); |
| 283 | dget(dentry); | 300 | dget(dentry); |
| 284 | dir->i_nlink++; | 301 | dir->i_nlink++; |
| @@ -639,18 +656,19 @@ out: | |||
| 639 | 656 | ||
| 640 | /* File system initialization */ | 657 | /* File system initialization */ |
| 641 | enum { | 658 | enum { |
| 642 | Opt_uid, Opt_gid, Opt_mode, Opt_err, | 659 | Opt_uid, Opt_gid, Opt_mode, Opt_debug, Opt_err, |
| 643 | }; | 660 | }; |
| 644 | 661 | ||
| 645 | static match_table_t spufs_tokens = { | 662 | static match_table_t spufs_tokens = { |
| 646 | { Opt_uid, "uid=%d" }, | 663 | { Opt_uid, "uid=%d" }, |
| 647 | { Opt_gid, "gid=%d" }, | 664 | { Opt_gid, "gid=%d" }, |
| 648 | { Opt_mode, "mode=%o" }, | 665 | { Opt_mode, "mode=%o" }, |
| 649 | { Opt_err, NULL }, | 666 | { Opt_debug, "debug" }, |
| 667 | { Opt_err, NULL }, | ||
| 650 | }; | 668 | }; |
| 651 | 669 | ||
| 652 | static int | 670 | static int |
| 653 | spufs_parse_options(char *options, struct inode *root) | 671 | spufs_parse_options(struct super_block *sb, char *options, struct inode *root) |
| 654 | { | 672 | { |
| 655 | char *p; | 673 | char *p; |
| 656 | substring_t args[MAX_OPT_ARGS]; | 674 | substring_t args[MAX_OPT_ARGS]; |
| @@ -678,6 +696,9 @@ spufs_parse_options(char *options, struct inode *root) | |||
| 678 | return 0; | 696 | return 0; |
| 679 | root->i_mode = option | S_IFDIR; | 697 | root->i_mode = option | S_IFDIR; |
| 680 | break; | 698 | break; |
| 699 | case Opt_debug: | ||
| 700 | spufs_get_sb_info(sb)->debug = 1; | ||
| 701 | break; | ||
| 681 | default: | 702 | default: |
| 682 | return 0; | 703 | return 0; |
| 683 | } | 704 | } |
| @@ -736,7 +757,7 @@ spufs_create_root(struct super_block *sb, void *data) | |||
| 736 | SPUFS_I(inode)->i_ctx = NULL; | 757 | SPUFS_I(inode)->i_ctx = NULL; |
| 737 | 758 | ||
| 738 | ret = -EINVAL; | 759 | ret = -EINVAL; |
| 739 | if (!spufs_parse_options(data, inode)) | 760 | if (!spufs_parse_options(sb, data, inode)) |
| 740 | goto out_iput; | 761 | goto out_iput; |
| 741 | 762 | ||
| 742 | ret = -ENOMEM; | 763 | ret = -ENOMEM; |
| @@ -754,6 +775,7 @@ out: | |||
| 754 | static int | 775 | static int |
| 755 | spufs_fill_super(struct super_block *sb, void *data, int silent) | 776 | spufs_fill_super(struct super_block *sb, void *data, int silent) |
| 756 | { | 777 | { |
| 778 | struct spufs_sb_info *info; | ||
| 757 | static struct super_operations s_ops = { | 779 | static struct super_operations s_ops = { |
| 758 | .alloc_inode = spufs_alloc_inode, | 780 | .alloc_inode = spufs_alloc_inode, |
| 759 | .destroy_inode = spufs_destroy_inode, | 781 | .destroy_inode = spufs_destroy_inode, |
| @@ -765,11 +787,16 @@ spufs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 765 | 787 | ||
| 766 | save_mount_options(sb, data); | 788 | save_mount_options(sb, data); |
| 767 | 789 | ||
| 790 | info = kzalloc(sizeof(*info), GFP_KERNEL); | ||
| 791 | if (!info) | ||
| 792 | return -ENOMEM; | ||
| 793 | |||
| 768 | sb->s_maxbytes = MAX_LFS_FILESIZE; | 794 | sb->s_maxbytes = MAX_LFS_FILESIZE; |
| 769 | sb->s_blocksize = PAGE_CACHE_SIZE; | 795 | sb->s_blocksize = PAGE_CACHE_SIZE; |
| 770 | sb->s_blocksize_bits = PAGE_CACHE_SHIFT; | 796 | sb->s_blocksize_bits = PAGE_CACHE_SHIFT; |
| 771 | sb->s_magic = SPUFS_MAGIC; | 797 | sb->s_magic = SPUFS_MAGIC; |
| 772 | sb->s_op = &s_ops; | 798 | sb->s_op = &s_ops; |
| 799 | sb->s_fs_info = info; | ||
| 773 | 800 | ||
| 774 | return spufs_create_root(sb, data); | 801 | return spufs_create_root(sb, data); |
| 775 | } | 802 | } |
diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c index e929e70a84e3..34654743363d 100644 --- a/arch/powerpc/platforms/cell/spufs/sched.c +++ b/arch/powerpc/platforms/cell/spufs/sched.c | |||
| @@ -899,7 +899,8 @@ static noinline void spusched_tick(struct spu_context *ctx) | |||
| 899 | spu_add_to_rq(ctx); | 899 | spu_add_to_rq(ctx); |
| 900 | } else { | 900 | } else { |
| 901 | spu_context_nospu_trace(spusched_tick__newslice, ctx); | 901 | spu_context_nospu_trace(spusched_tick__newslice, ctx); |
| 902 | ctx->time_slice++; | 902 | if (!ctx->time_slice) |
| 903 | ctx->time_slice++; | ||
| 903 | } | 904 | } |
| 904 | out: | 905 | out: |
| 905 | spu_release(ctx); | 906 | spu_release(ctx); |
| @@ -993,6 +994,7 @@ void spuctx_switch_state(struct spu_context *ctx, | |||
| 993 | struct timespec ts; | 994 | struct timespec ts; |
| 994 | struct spu *spu; | 995 | struct spu *spu; |
| 995 | enum spu_utilization_state old_state; | 996 | enum spu_utilization_state old_state; |
| 997 | int node; | ||
| 996 | 998 | ||
| 997 | ktime_get_ts(&ts); | 999 | ktime_get_ts(&ts); |
| 998 | curtime = timespec_to_ns(&ts); | 1000 | curtime = timespec_to_ns(&ts); |
| @@ -1014,6 +1016,11 @@ void spuctx_switch_state(struct spu_context *ctx, | |||
| 1014 | spu->stats.times[old_state] += delta; | 1016 | spu->stats.times[old_state] += delta; |
| 1015 | spu->stats.util_state = new_state; | 1017 | spu->stats.util_state = new_state; |
| 1016 | spu->stats.tstamp = curtime; | 1018 | spu->stats.tstamp = curtime; |
| 1019 | node = spu->node; | ||
| 1020 | if (old_state == SPU_UTIL_USER) | ||
| 1021 | atomic_dec(&cbe_spu_info[node].busy_spus); | ||
| 1022 | if (new_state == SPU_UTIL_USER); | ||
| 1023 | atomic_inc(&cbe_spu_info[node].busy_spus); | ||
| 1017 | } | 1024 | } |
| 1018 | } | 1025 | } |
| 1019 | 1026 | ||
diff --git a/arch/powerpc/platforms/cell/spufs/spufs.h b/arch/powerpc/platforms/cell/spufs/spufs.h index 454c277c1457..8ae8ef9dfc22 100644 --- a/arch/powerpc/platforms/cell/spufs/spufs.h +++ b/arch/powerpc/platforms/cell/spufs/spufs.h | |||
| @@ -32,6 +32,13 @@ | |||
| 32 | #include <asm/spu_csa.h> | 32 | #include <asm/spu_csa.h> |
| 33 | #include <asm/spu_info.h> | 33 | #include <asm/spu_info.h> |
| 34 | 34 | ||
| 35 | #define SPUFS_PS_MAP_SIZE 0x20000 | ||
| 36 | #define SPUFS_MFC_MAP_SIZE 0x1000 | ||
| 37 | #define SPUFS_CNTL_MAP_SIZE 0x1000 | ||
| 38 | #define SPUFS_CNTL_MAP_SIZE 0x1000 | ||
| 39 | #define SPUFS_SIGNAL_MAP_SIZE PAGE_SIZE | ||
| 40 | #define SPUFS_MSS_MAP_SIZE 0x1000 | ||
| 41 | |||
| 35 | /* The magic number for our file system */ | 42 | /* The magic number for our file system */ |
| 36 | enum { | 43 | enum { |
| 37 | SPUFS_MAGIC = 0x23c9b64e, | 44 | SPUFS_MAGIC = 0x23c9b64e, |
| @@ -228,8 +235,16 @@ struct spufs_inode_info { | |||
| 228 | #define SPUFS_I(inode) \ | 235 | #define SPUFS_I(inode) \ |
| 229 | container_of(inode, struct spufs_inode_info, vfs_inode) | 236 | container_of(inode, struct spufs_inode_info, vfs_inode) |
| 230 | 237 | ||
| 231 | extern struct tree_descr spufs_dir_contents[]; | 238 | struct spufs_tree_descr { |
| 232 | extern struct tree_descr spufs_dir_nosched_contents[]; | 239 | const char *name; |
| 240 | const struct file_operations *ops; | ||
| 241 | int mode; | ||
| 242 | size_t size; | ||
| 243 | }; | ||
| 244 | |||
| 245 | extern struct spufs_tree_descr spufs_dir_contents[]; | ||
| 246 | extern struct spufs_tree_descr spufs_dir_nosched_contents[]; | ||
| 247 | extern struct spufs_tree_descr spufs_dir_debug_contents[]; | ||
| 233 | 248 | ||
| 234 | /* system call implementation */ | 249 | /* system call implementation */ |
| 235 | extern struct spufs_calls spufs_calls; | 250 | extern struct spufs_calls spufs_calls; |
diff --git a/arch/powerpc/platforms/iseries/iommu.c b/arch/powerpc/platforms/iseries/iommu.c index 11fa3c772ed5..ab5d8687c3cf 100644 --- a/arch/powerpc/platforms/iseries/iommu.c +++ b/arch/powerpc/platforms/iseries/iommu.c | |||
| @@ -214,13 +214,13 @@ dma_addr_t iseries_hv_map(void *vaddr, size_t size, | |||
| 214 | enum dma_data_direction direction) | 214 | enum dma_data_direction direction) |
| 215 | { | 215 | { |
| 216 | return iommu_map_single(NULL, &vio_iommu_table, vaddr, size, | 216 | return iommu_map_single(NULL, &vio_iommu_table, vaddr, size, |
| 217 | DMA_32BIT_MASK, direction); | 217 | DMA_32BIT_MASK, direction, NULL); |
| 218 | } | 218 | } |
| 219 | 219 | ||
| 220 | void iseries_hv_unmap(dma_addr_t dma_handle, size_t size, | 220 | void iseries_hv_unmap(dma_addr_t dma_handle, size_t size, |
| 221 | enum dma_data_direction direction) | 221 | enum dma_data_direction direction) |
| 222 | { | 222 | { |
| 223 | iommu_unmap_single(&vio_iommu_table, dma_handle, size, direction); | 223 | iommu_unmap_single(&vio_iommu_table, dma_handle, size, direction, NULL); |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | void __init iommu_vio_init(void) | 226 | void __init iommu_vio_init(void) |
diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 43c493fca2d0..d66c3628a112 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c | |||
| @@ -349,9 +349,14 @@ static int ps3_system_bus_match(struct device *_dev, | |||
| 349 | 349 | ||
| 350 | result = dev->match_id == drv->match_id; | 350 | result = dev->match_id == drv->match_id; |
| 351 | 351 | ||
| 352 | pr_info("%s:%d: dev=%u(%s), drv=%u(%s): %s\n", __func__, __LINE__, | 352 | if (result) |
| 353 | dev->match_id, dev->core.bus_id, drv->match_id, drv->core.name, | 353 | pr_info("%s:%d: dev=%u(%s), drv=%u(%s): match\n", __func__, |
| 354 | (result ? "match" : "miss")); | 354 | __LINE__, dev->match_id, dev->core.bus_id, |
| 355 | drv->match_id, drv->core.name); | ||
| 356 | else | ||
| 357 | pr_debug("%s:%d: dev=%u(%s), drv=%u(%s): miss\n", __func__, | ||
| 358 | __LINE__, dev->match_id, dev->core.bus_id, | ||
| 359 | drv->match_id, drv->core.name); | ||
| 355 | return result; | 360 | return result; |
| 356 | } | 361 | } |
| 357 | 362 | ||
| @@ -362,7 +367,7 @@ static int ps3_system_bus_probe(struct device *_dev) | |||
| 362 | struct ps3_system_bus_driver *drv; | 367 | struct ps3_system_bus_driver *drv; |
| 363 | 368 | ||
| 364 | BUG_ON(!dev); | 369 | BUG_ON(!dev); |
| 365 | pr_info(" -> %s:%d: %s\n", __func__, __LINE__, _dev->bus_id); | 370 | pr_debug(" -> %s:%d: %s\n", __func__, __LINE__, _dev->bus_id); |
| 366 | 371 | ||
| 367 | drv = ps3_system_bus_dev_to_system_bus_drv(dev); | 372 | drv = ps3_system_bus_dev_to_system_bus_drv(dev); |
| 368 | BUG_ON(!drv); | 373 | BUG_ON(!drv); |
| @@ -370,10 +375,10 @@ static int ps3_system_bus_probe(struct device *_dev) | |||
| 370 | if (drv->probe) | 375 | if (drv->probe) |
| 371 | result = drv->probe(dev); | 376 | result = drv->probe(dev); |
| 372 | else | 377 | else |
| 373 | pr_info("%s:%d: %s no probe method\n", __func__, __LINE__, | 378 | pr_debug("%s:%d: %s no probe method\n", __func__, __LINE__, |
| 374 | dev->core.bus_id); | 379 | dev->core.bus_id); |
| 375 | 380 | ||
| 376 | pr_info(" <- %s:%d: %s\n", __func__, __LINE__, dev->core.bus_id); | 381 | pr_debug(" <- %s:%d: %s\n", __func__, __LINE__, dev->core.bus_id); |
| 377 | return result; | 382 | return result; |
| 378 | } | 383 | } |
| 379 | 384 | ||
| @@ -384,7 +389,7 @@ static int ps3_system_bus_remove(struct device *_dev) | |||
| 384 | struct ps3_system_bus_driver *drv; | 389 | struct ps3_system_bus_driver *drv; |
| 385 | 390 | ||
| 386 | BUG_ON(!dev); | 391 | BUG_ON(!dev); |
| 387 | pr_info(" -> %s:%d: %s\n", __func__, __LINE__, _dev->bus_id); | 392 | pr_debug(" -> %s:%d: %s\n", __func__, __LINE__, _dev->bus_id); |
| 388 | 393 | ||
| 389 | drv = ps3_system_bus_dev_to_system_bus_drv(dev); | 394 | drv = ps3_system_bus_dev_to_system_bus_drv(dev); |
| 390 | BUG_ON(!drv); | 395 | BUG_ON(!drv); |
| @@ -395,7 +400,7 @@ static int ps3_system_bus_remove(struct device *_dev) | |||
| 395 | dev_dbg(&dev->core, "%s:%d %s: no remove method\n", | 400 | dev_dbg(&dev->core, "%s:%d %s: no remove method\n", |
| 396 | __func__, __LINE__, drv->core.name); | 401 | __func__, __LINE__, drv->core.name); |
| 397 | 402 | ||
| 398 | pr_info(" <- %s:%d: %s\n", __func__, __LINE__, dev->core.bus_id); | 403 | pr_debug(" <- %s:%d: %s\n", __func__, __LINE__, dev->core.bus_id); |
| 399 | return result; | 404 | return result; |
| 400 | } | 405 | } |
| 401 | 406 | ||
| @@ -550,7 +555,7 @@ static void ps3_free_coherent(struct device *_dev, size_t size, void *vaddr, | |||
| 550 | */ | 555 | */ |
| 551 | 556 | ||
| 552 | static dma_addr_t ps3_sb_map_single(struct device *_dev, void *ptr, size_t size, | 557 | static dma_addr_t ps3_sb_map_single(struct device *_dev, void *ptr, size_t size, |
| 553 | enum dma_data_direction direction) | 558 | enum dma_data_direction direction, struct dma_attrs *attrs) |
| 554 | { | 559 | { |
| 555 | struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev); | 560 | struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev); |
| 556 | int result; | 561 | int result; |
| @@ -570,7 +575,8 @@ static dma_addr_t ps3_sb_map_single(struct device *_dev, void *ptr, size_t size, | |||
| 570 | 575 | ||
| 571 | static dma_addr_t ps3_ioc0_map_single(struct device *_dev, void *ptr, | 576 | static dma_addr_t ps3_ioc0_map_single(struct device *_dev, void *ptr, |
| 572 | size_t size, | 577 | size_t size, |
| 573 | enum dma_data_direction direction) | 578 | enum dma_data_direction direction, |
| 579 | struct dma_attrs *attrs) | ||
| 574 | { | 580 | { |
| 575 | struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev); | 581 | struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev); |
| 576 | int result; | 582 | int result; |
| @@ -603,7 +609,7 @@ static dma_addr_t ps3_ioc0_map_single(struct device *_dev, void *ptr, | |||
| 603 | } | 609 | } |
| 604 | 610 | ||
| 605 | static void ps3_unmap_single(struct device *_dev, dma_addr_t dma_addr, | 611 | static void ps3_unmap_single(struct device *_dev, dma_addr_t dma_addr, |
| 606 | size_t size, enum dma_data_direction direction) | 612 | size_t size, enum dma_data_direction direction, struct dma_attrs *attrs) |
| 607 | { | 613 | { |
| 608 | struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev); | 614 | struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev); |
| 609 | int result; | 615 | int result; |
| @@ -617,7 +623,7 @@ static void ps3_unmap_single(struct device *_dev, dma_addr_t dma_addr, | |||
| 617 | } | 623 | } |
| 618 | 624 | ||
| 619 | static int ps3_sb_map_sg(struct device *_dev, struct scatterlist *sgl, | 625 | static int ps3_sb_map_sg(struct device *_dev, struct scatterlist *sgl, |
| 620 | int nents, enum dma_data_direction direction) | 626 | int nents, enum dma_data_direction direction, struct dma_attrs *attrs) |
| 621 | { | 627 | { |
| 622 | #if defined(CONFIG_PS3_DYNAMIC_DMA) | 628 | #if defined(CONFIG_PS3_DYNAMIC_DMA) |
| 623 | BUG_ON("do"); | 629 | BUG_ON("do"); |
| @@ -646,14 +652,15 @@ static int ps3_sb_map_sg(struct device *_dev, struct scatterlist *sgl, | |||
| 646 | 652 | ||
| 647 | static int ps3_ioc0_map_sg(struct device *_dev, struct scatterlist *sg, | 653 | static int ps3_ioc0_map_sg(struct device *_dev, struct scatterlist *sg, |
| 648 | int nents, | 654 | int nents, |
| 649 | enum dma_data_direction direction) | 655 | enum dma_data_direction direction, |
| 656 | struct dma_attrs *attrs) | ||
| 650 | { | 657 | { |
| 651 | BUG(); | 658 | BUG(); |
| 652 | return 0; | 659 | return 0; |
| 653 | } | 660 | } |
| 654 | 661 | ||
| 655 | static void ps3_sb_unmap_sg(struct device *_dev, struct scatterlist *sg, | 662 | static void ps3_sb_unmap_sg(struct device *_dev, struct scatterlist *sg, |
| 656 | int nents, enum dma_data_direction direction) | 663 | int nents, enum dma_data_direction direction, struct dma_attrs *attrs) |
| 657 | { | 664 | { |
| 658 | #if defined(CONFIG_PS3_DYNAMIC_DMA) | 665 | #if defined(CONFIG_PS3_DYNAMIC_DMA) |
| 659 | BUG_ON("do"); | 666 | BUG_ON("do"); |
| @@ -661,7 +668,8 @@ static void ps3_sb_unmap_sg(struct device *_dev, struct scatterlist *sg, | |||
| 661 | } | 668 | } |
| 662 | 669 | ||
| 663 | static void ps3_ioc0_unmap_sg(struct device *_dev, struct scatterlist *sg, | 670 | static void ps3_ioc0_unmap_sg(struct device *_dev, struct scatterlist *sg, |
| 664 | int nents, enum dma_data_direction direction) | 671 | int nents, enum dma_data_direction direction, |
| 672 | struct dma_attrs *attrs) | ||
| 665 | { | 673 | { |
| 666 | BUG(); | 674 | BUG(); |
| 667 | } | 675 | } |
diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c index 6f544ba4b37f..c027f0a70a04 100644 --- a/arch/powerpc/platforms/pseries/eeh.c +++ b/arch/powerpc/platforms/pseries/eeh.c | |||
| @@ -812,6 +812,7 @@ int rtas_set_slot_reset(struct pci_dn *pdn) | |||
| 812 | static inline void __restore_bars (struct pci_dn *pdn) | 812 | static inline void __restore_bars (struct pci_dn *pdn) |
| 813 | { | 813 | { |
| 814 | int i; | 814 | int i; |
| 815 | u32 cmd; | ||
| 815 | 816 | ||
| 816 | if (NULL==pdn->phb) return; | 817 | if (NULL==pdn->phb) return; |
| 817 | for (i=4; i<10; i++) { | 818 | for (i=4; i<10; i++) { |
| @@ -832,6 +833,19 @@ static inline void __restore_bars (struct pci_dn *pdn) | |||
| 832 | 833 | ||
| 833 | /* max latency, min grant, interrupt pin and line */ | 834 | /* max latency, min grant, interrupt pin and line */ |
| 834 | rtas_write_config(pdn, 15*4, 4, pdn->config_space[15]); | 835 | rtas_write_config(pdn, 15*4, 4, pdn->config_space[15]); |
| 836 | |||
| 837 | /* Restore PERR & SERR bits, some devices require it, | ||
| 838 | don't touch the other command bits */ | ||
| 839 | rtas_read_config(pdn, PCI_COMMAND, 4, &cmd); | ||
| 840 | if (pdn->config_space[1] & PCI_COMMAND_PARITY) | ||
| 841 | cmd |= PCI_COMMAND_PARITY; | ||
| 842 | else | ||
| 843 | cmd &= ~PCI_COMMAND_PARITY; | ||
| 844 | if (pdn->config_space[1] & PCI_COMMAND_SERR) | ||
| 845 | cmd |= PCI_COMMAND_SERR; | ||
| 846 | else | ||
| 847 | cmd &= ~PCI_COMMAND_SERR; | ||
| 848 | rtas_write_config(pdn, PCI_COMMAND, 4, cmd); | ||
| 835 | } | 849 | } |
| 836 | 850 | ||
| 837 | /** | 851 | /** |
diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c index 3b4651b6ee05..38b5927b3629 100644 --- a/arch/powerpc/platforms/pseries/lpar.c +++ b/arch/powerpc/platforms/pseries/lpar.c | |||
| @@ -305,7 +305,8 @@ static long pSeries_lpar_hpte_insert(unsigned long hpte_group, | |||
| 305 | flags = 0; | 305 | flags = 0; |
| 306 | 306 | ||
| 307 | /* Make pHyp happy */ | 307 | /* Make pHyp happy */ |
| 308 | if (rflags & (_PAGE_GUARDED|_PAGE_NO_CACHE)) | 308 | if ((rflags & _PAGE_GUARDED) || |
| 309 | ((rflags & _PAGE_NO_CACHE) & !(rflags & _PAGE_WRITETHRU))) | ||
| 309 | hpte_r &= ~_PAGE_COHERENT; | 310 | hpte_r &= ~_PAGE_COHERENT; |
| 310 | 311 | ||
| 311 | lpar_rc = plpar_pte_enter(flags, hpte_group, hpte_v, hpte_r, &slot); | 312 | lpar_rc = plpar_pte_enter(flags, hpte_group, hpte_v, hpte_r, &slot); |
diff --git a/arch/powerpc/sysdev/cpm_common.c b/arch/powerpc/sysdev/cpm_common.c index 9b75d164bdf9..e4b7296acb2c 100644 --- a/arch/powerpc/sysdev/cpm_common.c +++ b/arch/powerpc/sysdev/cpm_common.c | |||
| @@ -37,7 +37,7 @@ static void udbg_putc_cpm(char c) | |||
| 37 | u8 __iomem *txbuf = (u8 __iomem __force *)in_be32(&cpm_udbg_txdesc[1]); | 37 | u8 __iomem *txbuf = (u8 __iomem __force *)in_be32(&cpm_udbg_txdesc[1]); |
| 38 | 38 | ||
| 39 | if (c == '\n') | 39 | if (c == '\n') |
| 40 | udbg_putc('\r'); | 40 | udbg_putc_cpm('\r'); |
| 41 | 41 | ||
| 42 | while (in_be32(&cpm_udbg_txdesc[0]) & 0x80000000) | 42 | while (in_be32(&cpm_udbg_txdesc[0]) & 0x80000000) |
| 43 | ; | 43 | ; |
| @@ -53,7 +53,6 @@ void __init udbg_init_cpm(void) | |||
| 53 | setbat(1, 0xf0000000, 0xf0000000, 1024*1024, _PAGE_IO); | 53 | setbat(1, 0xf0000000, 0xf0000000, 1024*1024, _PAGE_IO); |
| 54 | #endif | 54 | #endif |
| 55 | udbg_putc = udbg_putc_cpm; | 55 | udbg_putc = udbg_putc_cpm; |
| 56 | udbg_putc('X'); | ||
| 57 | } | 56 | } |
| 58 | } | 57 | } |
| 59 | #endif | 58 | #endif |
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 489ca5a397b1..87b0aa13ab48 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c | |||
| @@ -243,6 +243,8 @@ DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8544E, quirk_fsl_pcie_header); | |||
| 243 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8544, quirk_fsl_pcie_header); | 243 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8544, quirk_fsl_pcie_header); |
| 244 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8572E, quirk_fsl_pcie_header); | 244 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8572E, quirk_fsl_pcie_header); |
| 245 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8572, quirk_fsl_pcie_header); | 245 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8572, quirk_fsl_pcie_header); |
| 246 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8536E, quirk_fsl_pcie_header); | ||
| 247 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8536, quirk_fsl_pcie_header); | ||
| 246 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_header); | 248 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_header); |
| 247 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_header); | 249 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_header); |
| 248 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_header); | 250 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_header); |
diff --git a/arch/um/Makefile b/arch/um/Makefile index dbeab15e7bb7..ca40397017b9 100644 --- a/arch/um/Makefile +++ b/arch/um/Makefile | |||
| @@ -77,7 +77,6 @@ include $(srctree)/$(ARCH_DIR)/Makefile-os-$(OS) | |||
| 77 | KERNEL_DEFINES = $(strip -Derrno=kernel_errno -Dsigprocmask=kernel_sigprocmask \ | 77 | KERNEL_DEFINES = $(strip -Derrno=kernel_errno -Dsigprocmask=kernel_sigprocmask \ |
| 78 | -Dmktime=kernel_mktime $(ARCH_KERNEL_DEFINES)) | 78 | -Dmktime=kernel_mktime $(ARCH_KERNEL_DEFINES)) |
| 79 | KBUILD_CFLAGS += $(KERNEL_DEFINES) | 79 | KBUILD_CFLAGS += $(KERNEL_DEFINES) |
| 80 | KBUILD_CFLAGS += $(call cc-option,-fno-unit-at-a-time,) | ||
| 81 | 80 | ||
| 82 | PHONY += linux | 81 | PHONY += linux |
| 83 | 82 | ||
diff --git a/arch/um/Makefile-i386 b/arch/um/Makefile-i386 index 561e373bd850..302cbe504543 100644 --- a/arch/um/Makefile-i386 +++ b/arch/um/Makefile-i386 | |||
| @@ -32,4 +32,11 @@ cflags-y += $(call cc-option,-mpreferred-stack-boundary=2) | |||
| 32 | # an unresolved reference. | 32 | # an unresolved reference. |
| 33 | cflags-y += -ffreestanding | 33 | cflags-y += -ffreestanding |
| 34 | 34 | ||
| 35 | # Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use | ||
| 36 | # a lot more stack due to the lack of sharing of stacklots. Also, gcc | ||
| 37 | # 4.3.0 needs -funit-at-a-time for extern inline functions. | ||
| 38 | KBUILD_CFLAGS += $(shell if [ $(call cc-version) -lt 0400 ] ; then \ | ||
| 39 | echo $(call cc-option,-fno-unit-at-a-time); \ | ||
| 40 | else echo $(call cc-option,-funit-at-a-time); fi ;) | ||
| 41 | |||
| 35 | KBUILD_CFLAGS += $(cflags-y) | 42 | KBUILD_CFLAGS += $(cflags-y) |
diff --git a/arch/um/Makefile-x86_64 b/arch/um/Makefile-x86_64 index 8ed362f93582..a9cd7e77a7ab 100644 --- a/arch/um/Makefile-x86_64 +++ b/arch/um/Makefile-x86_64 | |||
| @@ -21,3 +21,6 @@ HEADER_ARCH := x86 | |||
| 21 | 21 | ||
| 22 | LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib64 | 22 | LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib64 |
| 23 | LINK-y += -m64 | 23 | LINK-y += -m64 |
| 24 | |||
| 25 | # Do unit-at-a-time unconditionally on x86_64, following the host | ||
| 26 | KBUILD_CFLAGS += $(call cc-option,-funit-at-a-time) | ||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index e0edaaa6920a..bf07b6f50fa1 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -966,8 +966,8 @@ config NUMA_EMU | |||
| 966 | number of nodes. This is only useful for debugging. | 966 | number of nodes. This is only useful for debugging. |
| 967 | 967 | ||
| 968 | config NODES_SHIFT | 968 | config NODES_SHIFT |
| 969 | int "Max num nodes shift(1-15)" | 969 | int "Max num nodes shift(1-9)" |
| 970 | range 1 15 if X86_64 | 970 | range 1 9 if X86_64 |
| 971 | default "6" if X86_64 | 971 | default "6" if X86_64 |
| 972 | default "4" if X86_NUMAQ | 972 | default "4" if X86_NUMAQ |
| 973 | default "3" | 973 | default "3" |
diff --git a/arch/x86/kernel/.gitignore b/arch/x86/kernel/.gitignore index 4ea38a39aed4..08f4fd731469 100644 --- a/arch/x86/kernel/.gitignore +++ b/arch/x86/kernel/.gitignore | |||
| @@ -1,2 +1,3 @@ | |||
| 1 | vsyscall.lds | 1 | vsyscall.lds |
| 2 | vsyscall_32.lds | 2 | vsyscall_32.lds |
| 3 | vmlinux.lds | ||
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.S b/arch/x86/kernel/acpi/realmode/wakeup.S index f9b77fb37e5b..3355973b12ac 100644 --- a/arch/x86/kernel/acpi/realmode/wakeup.S +++ b/arch/x86/kernel/acpi/realmode/wakeup.S | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #include <asm/msr-index.h> | 5 | #include <asm/msr-index.h> |
| 6 | #include <asm/page.h> | 6 | #include <asm/page.h> |
| 7 | #include <asm/pgtable.h> | 7 | #include <asm/pgtable.h> |
| 8 | #include <asm/processor-flags.h> | ||
| 8 | 9 | ||
| 9 | .code16 | 10 | .code16 |
| 10 | .section ".header", "a" | 11 | .section ".header", "a" |
| @@ -24,6 +25,11 @@ pmode_gdt: .quad 0 | |||
| 24 | realmode_flags: .long 0 | 25 | realmode_flags: .long 0 |
| 25 | real_magic: .long 0 | 26 | real_magic: .long 0 |
| 26 | trampoline_segment: .word 0 | 27 | trampoline_segment: .word 0 |
| 28 | _pad1: .byte 0 | ||
| 29 | wakeup_jmp: .byte 0xea /* ljmpw */ | ||
| 30 | wakeup_jmp_off: .word 3f | ||
| 31 | wakeup_jmp_seg: .word 0 | ||
| 32 | wakeup_gdt: .quad 0, 0, 0 | ||
| 27 | signature: .long 0x51ee1111 | 33 | signature: .long 0x51ee1111 |
| 28 | 34 | ||
| 29 | .text | 35 | .text |
| @@ -34,11 +40,34 @@ _start: | |||
| 34 | cli | 40 | cli |
| 35 | cld | 41 | cld |
| 36 | 42 | ||
| 43 | /* Apparently some dimwit BIOS programmers don't know how to | ||
| 44 | program a PM to RM transition, and we might end up here with | ||
| 45 | junk in the data segment descriptor registers. The only way | ||
| 46 | to repair that is to go into PM and fix it ourselves... */ | ||
| 47 | movw $16, %cx | ||
| 48 | lgdtl %cs:wakeup_gdt | ||
| 49 | movl %cr0, %eax | ||
| 50 | orb $X86_CR0_PE, %al | ||
| 51 | movl %eax, %cr0 | ||
| 52 | jmp 1f | ||
| 53 | 1: ljmpw $8, $2f | ||
| 54 | 2: | ||
| 55 | movw %cx, %ds | ||
| 56 | movw %cx, %es | ||
| 57 | movw %cx, %ss | ||
| 58 | movw %cx, %fs | ||
| 59 | movw %cx, %gs | ||
| 60 | |||
| 61 | andb $~X86_CR0_PE, %al | ||
| 62 | movl %eax, %cr0 | ||
| 63 | jmp wakeup_jmp | ||
| 64 | 3: | ||
| 37 | /* Set up segments */ | 65 | /* Set up segments */ |
| 38 | movw %cs, %ax | 66 | movw %cs, %ax |
| 39 | movw %ax, %ds | 67 | movw %ax, %ds |
| 40 | movw %ax, %es | 68 | movw %ax, %es |
| 41 | movw %ax, %ss | 69 | movw %ax, %ss |
| 70 | lidtl wakeup_idt | ||
| 42 | 71 | ||
| 43 | movl $wakeup_stack_end, %esp | 72 | movl $wakeup_stack_end, %esp |
| 44 | 73 | ||
| @@ -98,7 +127,14 @@ bogus_real_magic: | |||
| 98 | jmp 1b | 127 | jmp 1b |
| 99 | 128 | ||
| 100 | .data | 129 | .data |
| 101 | .balign 4 | 130 | .balign 8 |
| 131 | |||
| 132 | /* This is the standard real-mode IDT */ | ||
| 133 | wakeup_idt: | ||
| 134 | .word 0xffff /* limit */ | ||
| 135 | .long 0 /* address */ | ||
| 136 | .word 0 | ||
| 137 | |||
| 102 | .globl HEAP, heap_end | 138 | .globl HEAP, heap_end |
| 103 | HEAP: | 139 | HEAP: |
| 104 | .long wakeup_heap | 140 | .long wakeup_heap |
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.h b/arch/x86/kernel/acpi/realmode/wakeup.h index ef8166fe8020..69d38d0b2b64 100644 --- a/arch/x86/kernel/acpi/realmode/wakeup.h +++ b/arch/x86/kernel/acpi/realmode/wakeup.h | |||
| @@ -24,6 +24,11 @@ struct wakeup_header { | |||
| 24 | u32 realmode_flags; | 24 | u32 realmode_flags; |
| 25 | u32 real_magic; | 25 | u32 real_magic; |
| 26 | u16 trampoline_segment; /* segment with trampoline code, 64-bit only */ | 26 | u16 trampoline_segment; /* segment with trampoline code, 64-bit only */ |
| 27 | u8 _pad1; | ||
| 28 | u8 wakeup_jmp; | ||
| 29 | u16 wakeup_jmp_off; | ||
| 30 | u16 wakeup_jmp_seg; | ||
| 31 | u64 wakeup_gdt[3]; | ||
| 27 | u32 signature; /* To check we have correct structure */ | 32 | u32 signature; /* To check we have correct structure */ |
| 28 | } __attribute__((__packed__)); | 33 | } __attribute__((__packed__)); |
| 29 | 34 | ||
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index afc25ee9964b..36af01f029ed 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c | |||
| @@ -50,6 +50,20 @@ int acpi_save_state_mem(void) | |||
| 50 | 50 | ||
| 51 | header->video_mode = saved_video_mode; | 51 | header->video_mode = saved_video_mode; |
| 52 | 52 | ||
| 53 | header->wakeup_jmp_seg = acpi_wakeup_address >> 4; | ||
| 54 | /* GDT[0]: GDT self-pointer */ | ||
| 55 | header->wakeup_gdt[0] = | ||
| 56 | (u64)(sizeof(header->wakeup_gdt) - 1) + | ||
| 57 | ((u64)(acpi_wakeup_address + | ||
| 58 | ((char *)&header->wakeup_gdt - (char *)acpi_realmode)) | ||
| 59 | << 16); | ||
| 60 | /* GDT[1]: real-mode-like code segment */ | ||
| 61 | header->wakeup_gdt[1] = (0x009bULL << 40) + | ||
| 62 | ((u64)acpi_wakeup_address << 16) + 0xffff; | ||
| 63 | /* GDT[2]: real-mode-like data segment */ | ||
| 64 | header->wakeup_gdt[2] = (0x0093ULL << 40) + | ||
| 65 | ((u64)acpi_wakeup_address << 16) + 0xffff; | ||
| 66 | |||
| 53 | #ifndef CONFIG_64BIT | 67 | #ifndef CONFIG_64BIT |
| 54 | store_gdt((struct desc_ptr *)&header->pmode_gdt); | 68 | store_gdt((struct desc_ptr *)&header->pmode_gdt); |
| 55 | 69 | ||
| @@ -111,7 +125,7 @@ void __init acpi_reserve_bootmem(void) | |||
| 111 | return; | 125 | return; |
| 112 | } | 126 | } |
| 113 | 127 | ||
| 114 | acpi_wakeup_address = acpi_realmode; | 128 | acpi_wakeup_address = virt_to_phys((void *)acpi_realmode); |
| 115 | } | 129 | } |
| 116 | 130 | ||
| 117 | 131 | ||
diff --git a/arch/x86/kernel/efi_32.c b/arch/x86/kernel/efi_32.c index 5d23d85624d4..4b63c8e1f13b 100644 --- a/arch/x86/kernel/efi_32.c +++ b/arch/x86/kernel/efi_32.c | |||
| @@ -49,13 +49,13 @@ void efi_call_phys_prelog(void) | |||
| 49 | local_irq_save(efi_rt_eflags); | 49 | local_irq_save(efi_rt_eflags); |
| 50 | 50 | ||
| 51 | /* | 51 | /* |
| 52 | * If I don't have PSE, I should just duplicate two entries in page | 52 | * If I don't have PAE, I should just duplicate two entries in page |
| 53 | * directory. If I have PSE, I just need to duplicate one entry in | 53 | * directory. If I have PAE, I just need to duplicate one entry in |
| 54 | * page directory. | 54 | * page directory. |
| 55 | */ | 55 | */ |
| 56 | cr4 = read_cr4(); | 56 | cr4 = read_cr4(); |
| 57 | 57 | ||
| 58 | if (cr4 & X86_CR4_PSE) { | 58 | if (cr4 & X86_CR4_PAE) { |
| 59 | efi_bak_pg_dir_pointer[0].pgd = | 59 | efi_bak_pg_dir_pointer[0].pgd = |
| 60 | swapper_pg_dir[pgd_index(0)].pgd; | 60 | swapper_pg_dir[pgd_index(0)].pgd; |
| 61 | swapper_pg_dir[0].pgd = | 61 | swapper_pg_dir[0].pgd = |
| @@ -93,7 +93,7 @@ void efi_call_phys_epilog(void) | |||
| 93 | 93 | ||
| 94 | cr4 = read_cr4(); | 94 | cr4 = read_cr4(); |
| 95 | 95 | ||
| 96 | if (cr4 & X86_CR4_PSE) { | 96 | if (cr4 & X86_CR4_PAE) { |
| 97 | swapper_pg_dir[pgd_index(0)].pgd = | 97 | swapper_pg_dir[pgd_index(0)].pgd = |
| 98 | efi_bak_pg_dir_pointer[0].pgd; | 98 | efi_bak_pg_dir_pointer[0].pgd; |
| 99 | } else { | 99 | } else { |
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 10a1955bb1d1..b817974ef942 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S | |||
| @@ -128,7 +128,7 @@ ident_complete: | |||
| 128 | /* Fixup phys_base */ | 128 | /* Fixup phys_base */ |
| 129 | addq %rbp, phys_base(%rip) | 129 | addq %rbp, phys_base(%rip) |
| 130 | 130 | ||
| 131 | #ifdef CONFIG_SMP | 131 | #ifdef CONFIG_X86_TRAMPOLINE |
| 132 | addq %rbp, trampoline_level4_pgt + 0(%rip) | 132 | addq %rbp, trampoline_level4_pgt + 0(%rip) |
| 133 | addq %rbp, trampoline_level4_pgt + (511*8)(%rip) | 133 | addq %rbp, trampoline_level4_pgt + (511*8)(%rip) |
| 134 | #endif | 134 | #endif |
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index eb9ddd8efb82..95e80e5033c3 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c | |||
| @@ -162,7 +162,7 @@ int xfpregs_get(struct task_struct *target, const struct user_regset *regset, | |||
| 162 | int ret; | 162 | int ret; |
| 163 | 163 | ||
| 164 | if (!cpu_has_fxsr) | 164 | if (!cpu_has_fxsr) |
| 165 | return -ENODEV; | 165 | return -EIO; |
| 166 | 166 | ||
| 167 | ret = init_fpu(target); | 167 | ret = init_fpu(target); |
| 168 | if (ret) | 168 | if (ret) |
| @@ -179,7 +179,7 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset, | |||
| 179 | int ret; | 179 | int ret; |
| 180 | 180 | ||
| 181 | if (!cpu_has_fxsr) | 181 | if (!cpu_has_fxsr) |
| 182 | return -ENODEV; | 182 | return -EIO; |
| 183 | 183 | ||
| 184 | ret = init_fpu(target); | 184 | ret = init_fpu(target); |
| 185 | if (ret) | 185 | if (ret) |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 56078d61c793..3e1cecedde42 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -996,7 +996,6 @@ do_rest: | |||
| 996 | #endif | 996 | #endif |
| 997 | cpu_clear(cpu, cpu_callout_map); /* was set by do_boot_cpu() */ | 997 | cpu_clear(cpu, cpu_callout_map); /* was set by do_boot_cpu() */ |
| 998 | cpu_clear(cpu, cpu_initialized); /* was set by cpu_init() */ | 998 | cpu_clear(cpu, cpu_initialized); /* was set by cpu_init() */ |
| 999 | cpu_clear(cpu, cpu_possible_map); | ||
| 1000 | cpu_clear(cpu, cpu_present_map); | 999 | cpu_clear(cpu, cpu_present_map); |
| 1001 | per_cpu(x86_cpu_to_apicid, cpu) = BAD_APICID; | 1000 | per_cpu(x86_cpu_to_apicid, cpu) = BAD_APICID; |
| 1002 | } | 1001 | } |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 156e6d7b0e32..819dad973b13 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
| @@ -135,7 +135,7 @@ static __init void *spp_getpage(void) | |||
| 135 | return ptr; | 135 | return ptr; |
| 136 | } | 136 | } |
| 137 | 137 | ||
| 138 | static void | 138 | static __init void |
| 139 | set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot) | 139 | set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot) |
| 140 | { | 140 | { |
| 141 | pgd_t *pgd; | 141 | pgd_t *pgd; |
| @@ -214,7 +214,7 @@ void __init cleanup_highmap(void) | |||
| 214 | } | 214 | } |
| 215 | 215 | ||
| 216 | /* NOTE: this is meant to be run only at boot */ | 216 | /* NOTE: this is meant to be run only at boot */ |
| 217 | void __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot) | 217 | void __init __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot) |
| 218 | { | 218 | { |
| 219 | unsigned long address = __fix_to_virt(idx); | 219 | unsigned long address = __fix_to_virt(idx); |
| 220 | 220 | ||
| @@ -526,7 +526,8 @@ static void __init early_memtest(unsigned long start, unsigned long end) | |||
| 526 | t_size = end - t_start; | 526 | t_size = end - t_start; |
| 527 | 527 | ||
| 528 | printk(KERN_CONT "\n %016llx - %016llx pattern %d", | 528 | printk(KERN_CONT "\n %016llx - %016llx pattern %d", |
| 529 | t_start, t_start + t_size, pattern); | 529 | (unsigned long long)t_start, |
| 530 | (unsigned long long)t_start + t_size, pattern); | ||
| 530 | 531 | ||
| 531 | memtest(t_start, t_size, pattern); | 532 | memtest(t_start, t_size, pattern); |
| 532 | 533 | ||
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 2b2bb3f9b683..d1b867101e5f 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
| @@ -300,6 +300,29 @@ void __iomem *ioremap_cache(resource_size_t phys_addr, unsigned long size) | |||
| 300 | } | 300 | } |
| 301 | EXPORT_SYMBOL(ioremap_cache); | 301 | EXPORT_SYMBOL(ioremap_cache); |
| 302 | 302 | ||
| 303 | static void __iomem *ioremap_default(resource_size_t phys_addr, | ||
| 304 | unsigned long size) | ||
| 305 | { | ||
| 306 | unsigned long flags; | ||
| 307 | void *ret; | ||
| 308 | int err; | ||
| 309 | |||
| 310 | /* | ||
| 311 | * - WB for WB-able memory and no other conflicting mappings | ||
| 312 | * - UC_MINUS for non-WB-able memory with no other conflicting mappings | ||
| 313 | * - Inherit from confliting mappings otherwise | ||
| 314 | */ | ||
| 315 | err = reserve_memtype(phys_addr, phys_addr + size, -1, &flags); | ||
| 316 | if (err < 0) | ||
| 317 | return NULL; | ||
| 318 | |||
| 319 | ret = (void *) __ioremap_caller(phys_addr, size, flags, | ||
| 320 | __builtin_return_address(0)); | ||
| 321 | |||
| 322 | free_memtype(phys_addr, phys_addr + size); | ||
| 323 | return (void __iomem *)ret; | ||
| 324 | } | ||
| 325 | |||
| 303 | /** | 326 | /** |
| 304 | * iounmap - Free a IO remapping | 327 | * iounmap - Free a IO remapping |
| 305 | * @addr: virtual address from ioremap_* | 328 | * @addr: virtual address from ioremap_* |
| @@ -365,7 +388,7 @@ void *xlate_dev_mem_ptr(unsigned long phys) | |||
| 365 | if (page_is_ram(start >> PAGE_SHIFT)) | 388 | if (page_is_ram(start >> PAGE_SHIFT)) |
| 366 | return __va(phys); | 389 | return __va(phys); |
| 367 | 390 | ||
| 368 | addr = (void *)ioremap(start, PAGE_SIZE); | 391 | addr = (void *)ioremap_default(start, PAGE_SIZE); |
| 369 | if (addr) | 392 | if (addr) |
| 370 | addr = (void *)((unsigned long)addr | (phys & ~PAGE_MASK)); | 393 | addr = (void *)((unsigned long)addr | (phys & ~PAGE_MASK)); |
| 371 | 394 | ||
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 940185ecaeda..6e64aaf00d1d 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c | |||
| @@ -328,18 +328,18 @@ static struct dmi_system_id __devinitdata pciprobe_dmi_table[] = { | |||
| 328 | #endif | 328 | #endif |
| 329 | { | 329 | { |
| 330 | .callback = set_bf_sort, | 330 | .callback = set_bf_sort, |
| 331 | .ident = "HP ProLiant DL360", | 331 | .ident = "HP ProLiant DL385 G2", |
| 332 | .matches = { | 332 | .matches = { |
| 333 | DMI_MATCH(DMI_SYS_VENDOR, "HP"), | 333 | DMI_MATCH(DMI_SYS_VENDOR, "HP"), |
| 334 | DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL360"), | 334 | DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL385 G2"), |
| 335 | }, | 335 | }, |
| 336 | }, | 336 | }, |
| 337 | { | 337 | { |
| 338 | .callback = set_bf_sort, | 338 | .callback = set_bf_sort, |
| 339 | .ident = "HP ProLiant DL380", | 339 | .ident = "HP ProLiant DL585 G2", |
| 340 | .matches = { | 340 | .matches = { |
| 341 | DMI_MATCH(DMI_SYS_VENDOR, "HP"), | 341 | DMI_MATCH(DMI_SYS_VENDOR, "HP"), |
| 342 | DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL380"), | 342 | DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL585 G2"), |
| 343 | }, | 343 | }, |
| 344 | }, | 344 | }, |
| 345 | {} | 345 | {} |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index df40bf74ea75..4e527e7893a8 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -185,7 +185,7 @@ static pteval_t pte_mfn_to_pfn(pteval_t val) | |||
| 185 | if (val & _PAGE_PRESENT) { | 185 | if (val & _PAGE_PRESENT) { |
| 186 | unsigned long mfn = (val & PTE_MASK) >> PAGE_SHIFT; | 186 | unsigned long mfn = (val & PTE_MASK) >> PAGE_SHIFT; |
| 187 | pteval_t flags = val & ~PTE_MASK; | 187 | pteval_t flags = val & ~PTE_MASK; |
| 188 | val = (mfn_to_pfn(mfn) << PAGE_SHIFT) | flags; | 188 | val = ((pteval_t)mfn_to_pfn(mfn) << PAGE_SHIFT) | flags; |
| 189 | } | 189 | } |
| 190 | 190 | ||
| 191 | return val; | 191 | return val; |
| @@ -196,7 +196,7 @@ static pteval_t pte_pfn_to_mfn(pteval_t val) | |||
| 196 | if (val & _PAGE_PRESENT) { | 196 | if (val & _PAGE_PRESENT) { |
| 197 | unsigned long pfn = (val & PTE_MASK) >> PAGE_SHIFT; | 197 | unsigned long pfn = (val & PTE_MASK) >> PAGE_SHIFT; |
| 198 | pteval_t flags = val & ~PTE_MASK; | 198 | pteval_t flags = val & ~PTE_MASK; |
| 199 | val = (pfn_to_mfn(pfn) << PAGE_SHIFT) | flags; | 199 | val = ((pteval_t)pfn_to_mfn(pfn) << PAGE_SHIFT) | flags; |
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | return val; | 202 | return val; |
diff --git a/block/as-iosched.c b/block/as-iosched.c index 8c3946787dbb..743f33a01a07 100644 --- a/block/as-iosched.c +++ b/block/as-iosched.c | |||
| @@ -831,6 +831,8 @@ static void as_completed_request(struct request_queue *q, struct request *rq) | |||
| 831 | } | 831 | } |
| 832 | 832 | ||
| 833 | if (ad->changed_batch && ad->nr_dispatched == 1) { | 833 | if (ad->changed_batch && ad->nr_dispatched == 1) { |
| 834 | ad->current_batch_expires = jiffies + | ||
| 835 | ad->batch_expire[ad->batch_data_dir]; | ||
| 834 | kblockd_schedule_work(&ad->antic_work); | 836 | kblockd_schedule_work(&ad->antic_work); |
| 835 | ad->changed_batch = 0; | 837 | ad->changed_batch = 0; |
| 836 | 838 | ||
diff --git a/block/bsg.c b/block/bsg.c index f0b7cd343216..54d617f7df3e 100644 --- a/block/bsg.c +++ b/block/bsg.c | |||
| @@ -709,11 +709,12 @@ static void bsg_kref_release_function(struct kref *kref) | |||
| 709 | { | 709 | { |
| 710 | struct bsg_class_device *bcd = | 710 | struct bsg_class_device *bcd = |
| 711 | container_of(kref, struct bsg_class_device, ref); | 711 | container_of(kref, struct bsg_class_device, ref); |
| 712 | struct device *parent = bcd->parent; | ||
| 712 | 713 | ||
| 713 | if (bcd->release) | 714 | if (bcd->release) |
| 714 | bcd->release(bcd->parent); | 715 | bcd->release(bcd->parent); |
| 715 | 716 | ||
| 716 | put_device(bcd->parent); | 717 | put_device(parent); |
| 717 | } | 718 | } |
| 718 | 719 | ||
| 719 | static int bsg_put_device(struct bsg_device *bd) | 720 | static int bsg_put_device(struct bsg_device *bd) |
diff --git a/crypto/chainiv.c b/crypto/chainiv.c index 6da3f577e4db..9affadee3287 100644 --- a/crypto/chainiv.c +++ b/crypto/chainiv.c | |||
| @@ -117,6 +117,7 @@ static int chainiv_init(struct crypto_tfm *tfm) | |||
| 117 | static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx) | 117 | static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx) |
| 118 | { | 118 | { |
| 119 | int queued; | 119 | int queued; |
| 120 | int err = ctx->err; | ||
| 120 | 121 | ||
| 121 | if (!ctx->queue.qlen) { | 122 | if (!ctx->queue.qlen) { |
| 122 | smp_mb__before_clear_bit(); | 123 | smp_mb__before_clear_bit(); |
| @@ -131,7 +132,7 @@ static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx) | |||
| 131 | BUG_ON(!queued); | 132 | BUG_ON(!queued); |
| 132 | 133 | ||
| 133 | out: | 134 | out: |
| 134 | return ctx->err; | 135 | return err; |
| 135 | } | 136 | } |
| 136 | 137 | ||
| 137 | static int async_chainiv_postpone_request(struct skcipher_givcrypt_request *req) | 138 | static int async_chainiv_postpone_request(struct skcipher_givcrypt_request *req) |
| @@ -227,6 +228,7 @@ static void async_chainiv_do_postponed(struct work_struct *work) | |||
| 227 | postponed); | 228 | postponed); |
| 228 | struct skcipher_givcrypt_request *req; | 229 | struct skcipher_givcrypt_request *req; |
| 229 | struct ablkcipher_request *subreq; | 230 | struct ablkcipher_request *subreq; |
| 231 | int err; | ||
| 230 | 232 | ||
| 231 | /* Only handle one request at a time to avoid hogging keventd. */ | 233 | /* Only handle one request at a time to avoid hogging keventd. */ |
| 232 | spin_lock_bh(&ctx->lock); | 234 | spin_lock_bh(&ctx->lock); |
| @@ -241,7 +243,11 @@ static void async_chainiv_do_postponed(struct work_struct *work) | |||
| 241 | subreq = skcipher_givcrypt_reqctx(req); | 243 | subreq = skcipher_givcrypt_reqctx(req); |
| 242 | subreq->base.flags |= CRYPTO_TFM_REQ_MAY_SLEEP; | 244 | subreq->base.flags |= CRYPTO_TFM_REQ_MAY_SLEEP; |
| 243 | 245 | ||
| 244 | async_chainiv_givencrypt_tail(req); | 246 | err = async_chainiv_givencrypt_tail(req); |
| 247 | |||
| 248 | local_bh_disable(); | ||
| 249 | skcipher_givcrypt_complete(req, err); | ||
| 250 | local_bh_enable(); | ||
| 245 | } | 251 | } |
| 246 | 252 | ||
| 247 | static int async_chainiv_init(struct crypto_tfm *tfm) | 253 | static int async_chainiv_init(struct crypto_tfm *tfm) |
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index 6beabc5abd07..e47f6e02133c 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c | |||
| @@ -586,12 +586,6 @@ static void test_cipher(char *algo, int enc, | |||
| 586 | j = 0; | 586 | j = 0; |
| 587 | for (i = 0; i < tcount; i++) { | 587 | for (i = 0; i < tcount; i++) { |
| 588 | 588 | ||
| 589 | data = kzalloc(template[i].ilen, GFP_KERNEL); | ||
| 590 | if (!data) | ||
| 591 | continue; | ||
| 592 | |||
| 593 | memcpy(data, template[i].input, template[i].ilen); | ||
| 594 | |||
| 595 | if (template[i].iv) | 589 | if (template[i].iv) |
| 596 | memcpy(iv, template[i].iv, MAX_IVLEN); | 590 | memcpy(iv, template[i].iv, MAX_IVLEN); |
| 597 | else | 591 | else |
| @@ -613,10 +607,8 @@ static void test_cipher(char *algo, int enc, | |||
| 613 | printk("setkey() failed flags=%x\n", | 607 | printk("setkey() failed flags=%x\n", |
| 614 | crypto_ablkcipher_get_flags(tfm)); | 608 | crypto_ablkcipher_get_flags(tfm)); |
| 615 | 609 | ||
| 616 | if (!template[i].fail) { | 610 | if (!template[i].fail) |
| 617 | kfree(data); | ||
| 618 | goto out; | 611 | goto out; |
| 619 | } | ||
| 620 | } | 612 | } |
| 621 | 613 | ||
| 622 | temp = 0; | 614 | temp = 0; |
diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c index c3b0cd88d09f..495c63a3e0af 100644 --- a/drivers/acpi/sleep/main.c +++ b/drivers/acpi/sleep/main.c | |||
| @@ -36,9 +36,8 @@ static int acpi_sleep_prepare(u32 acpi_state) | |||
| 36 | if (!acpi_wakeup_address) { | 36 | if (!acpi_wakeup_address) { |
| 37 | return -EFAULT; | 37 | return -EFAULT; |
| 38 | } | 38 | } |
| 39 | acpi_set_firmware_waking_vector((acpi_physical_address) | 39 | acpi_set_firmware_waking_vector( |
| 40 | virt_to_phys((void *) | 40 | (acpi_physical_address)acpi_wakeup_address); |
| 41 | acpi_wakeup_address)); | ||
| 42 | 41 | ||
| 43 | } | 42 | } |
| 44 | ACPI_FLUSH_CPU_CACHE(); | 43 | ACPI_FLUSH_CPU_CACHE(); |
diff --git a/drivers/acpi/sleep/proc.c b/drivers/acpi/sleep/proc.c index 224c57c03381..4ebbba2b6b19 100644 --- a/drivers/acpi/sleep/proc.c +++ b/drivers/acpi/sleep/proc.c | |||
| @@ -315,8 +315,11 @@ acpi_system_write_alarm(struct file *file, | |||
| 315 | cmos_bcd_write(day, acpi_gbl_FADT.day_alarm, rtc_control); | 315 | cmos_bcd_write(day, acpi_gbl_FADT.day_alarm, rtc_control); |
| 316 | if (acpi_gbl_FADT.month_alarm) | 316 | if (acpi_gbl_FADT.month_alarm) |
| 317 | cmos_bcd_write(mo, acpi_gbl_FADT.month_alarm, rtc_control); | 317 | cmos_bcd_write(mo, acpi_gbl_FADT.month_alarm, rtc_control); |
| 318 | if (acpi_gbl_FADT.century) | 318 | if (acpi_gbl_FADT.century) { |
| 319 | if (adjust) | ||
| 320 | yr += cmos_bcd_read(acpi_gbl_FADT.century, rtc_control) * 100; | ||
| 319 | cmos_bcd_write(yr / 100, acpi_gbl_FADT.century, rtc_control); | 321 | cmos_bcd_write(yr / 100, acpi_gbl_FADT.century, rtc_control); |
| 322 | } | ||
| 320 | /* enable the rtc alarm interrupt */ | 323 | /* enable the rtc alarm interrupt */ |
| 321 | rtc_control |= RTC_AIE; | 324 | rtc_control |= RTC_AIE; |
| 322 | CMOS_WRITE(rtc_control, RTC_CONTROL); | 325 | CMOS_WRITE(rtc_control, RTC_CONTROL); |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 6a4a2a25d97a..5e6468a7ca4b 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -1777,7 +1777,7 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance) | |||
| 1777 | struct ahci_host_priv *hpriv; | 1777 | struct ahci_host_priv *hpriv; |
| 1778 | unsigned int i, handled = 0; | 1778 | unsigned int i, handled = 0; |
| 1779 | void __iomem *mmio; | 1779 | void __iomem *mmio; |
| 1780 | u32 irq_stat, irq_ack = 0; | 1780 | u32 irq_stat, irq_masked; |
| 1781 | 1781 | ||
| 1782 | VPRINTK("ENTER\n"); | 1782 | VPRINTK("ENTER\n"); |
| 1783 | 1783 | ||
| @@ -1786,16 +1786,17 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance) | |||
| 1786 | 1786 | ||
| 1787 | /* sigh. 0xffffffff is a valid return from h/w */ | 1787 | /* sigh. 0xffffffff is a valid return from h/w */ |
| 1788 | irq_stat = readl(mmio + HOST_IRQ_STAT); | 1788 | irq_stat = readl(mmio + HOST_IRQ_STAT); |
| 1789 | irq_stat &= hpriv->port_map; | ||
| 1790 | if (!irq_stat) | 1789 | if (!irq_stat) |
| 1791 | return IRQ_NONE; | 1790 | return IRQ_NONE; |
| 1792 | 1791 | ||
| 1792 | irq_masked = irq_stat & hpriv->port_map; | ||
| 1793 | |||
| 1793 | spin_lock(&host->lock); | 1794 | spin_lock(&host->lock); |
| 1794 | 1795 | ||
| 1795 | for (i = 0; i < host->n_ports; i++) { | 1796 | for (i = 0; i < host->n_ports; i++) { |
| 1796 | struct ata_port *ap; | 1797 | struct ata_port *ap; |
| 1797 | 1798 | ||
| 1798 | if (!(irq_stat & (1 << i))) | 1799 | if (!(irq_masked & (1 << i))) |
| 1799 | continue; | 1800 | continue; |
| 1800 | 1801 | ||
| 1801 | ap = host->ports[i]; | 1802 | ap = host->ports[i]; |
| @@ -1809,14 +1810,20 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance) | |||
| 1809 | "interrupt on disabled port %u\n", i); | 1810 | "interrupt on disabled port %u\n", i); |
| 1810 | } | 1811 | } |
| 1811 | 1812 | ||
| 1812 | irq_ack |= (1 << i); | ||
| 1813 | } | ||
| 1814 | |||
| 1815 | if (irq_ack) { | ||
| 1816 | writel(irq_ack, mmio + HOST_IRQ_STAT); | ||
| 1817 | handled = 1; | 1813 | handled = 1; |
| 1818 | } | 1814 | } |
| 1819 | 1815 | ||
| 1816 | /* HOST_IRQ_STAT behaves as level triggered latch meaning that | ||
| 1817 | * it should be cleared after all the port events are cleared; | ||
| 1818 | * otherwise, it will raise a spurious interrupt after each | ||
| 1819 | * valid one. Please read section 10.6.2 of ahci 1.1 for more | ||
| 1820 | * information. | ||
| 1821 | * | ||
| 1822 | * Also, use the unmasked value to clear interrupt as spurious | ||
| 1823 | * pending event on a dummy port might cause screaming IRQ. | ||
| 1824 | */ | ||
| 1825 | writel(irq_stat, mmio + HOST_IRQ_STAT); | ||
| 1826 | |||
| 1820 | spin_unlock(&host->lock); | 1827 | spin_unlock(&host->lock); |
| 1821 | 1828 | ||
| 1822 | VPRINTK("EXIT\n"); | 1829 | VPRINTK("EXIT\n"); |
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index 3ff8b14420d9..9330b7922f62 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
| @@ -29,14 +29,16 @@ | |||
| 29 | enum { | 29 | enum { |
| 30 | ATA_ACPI_FILTER_SETXFER = 1 << 0, | 30 | ATA_ACPI_FILTER_SETXFER = 1 << 0, |
| 31 | ATA_ACPI_FILTER_LOCK = 1 << 1, | 31 | ATA_ACPI_FILTER_LOCK = 1 << 1, |
| 32 | ATA_ACPI_FILTER_DIPM = 1 << 2, | ||
| 32 | 33 | ||
| 33 | ATA_ACPI_FILTER_DEFAULT = ATA_ACPI_FILTER_SETXFER | | 34 | ATA_ACPI_FILTER_DEFAULT = ATA_ACPI_FILTER_SETXFER | |
| 34 | ATA_ACPI_FILTER_LOCK, | 35 | ATA_ACPI_FILTER_LOCK | |
| 36 | ATA_ACPI_FILTER_DIPM, | ||
| 35 | }; | 37 | }; |
| 36 | 38 | ||
| 37 | static unsigned int ata_acpi_gtf_filter = ATA_ACPI_FILTER_DEFAULT; | 39 | static unsigned int ata_acpi_gtf_filter = ATA_ACPI_FILTER_DEFAULT; |
| 38 | module_param_named(acpi_gtf_filter, ata_acpi_gtf_filter, int, 0644); | 40 | module_param_named(acpi_gtf_filter, ata_acpi_gtf_filter, int, 0644); |
| 39 | MODULE_PARM_DESC(acpi_gtf_filter, "filter mask for ACPI _GTF commands, set to filter out (0x1=set xfermode, 0x2=lock/freeze lock)"); | 41 | MODULE_PARM_DESC(acpi_gtf_filter, "filter mask for ACPI _GTF commands, set to filter out (0x1=set xfermode, 0x2=lock/freeze lock, 0x4=DIPM)"); |
| 40 | 42 | ||
| 41 | #define NO_PORT_MULT 0xffff | 43 | #define NO_PORT_MULT 0xffff |
| 42 | #define SATA_ADR(root, pmp) (((root) << 16) | (pmp)) | 44 | #define SATA_ADR(root, pmp) (((root) << 16) | (pmp)) |
| @@ -195,6 +197,10 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev, | |||
| 195 | /* This device does not support hotplug */ | 197 | /* This device does not support hotplug */ |
| 196 | return; | 198 | return; |
| 197 | 199 | ||
| 200 | if (event == ACPI_NOTIFY_BUS_CHECK || | ||
| 201 | event == ACPI_NOTIFY_DEVICE_CHECK) | ||
| 202 | status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); | ||
| 203 | |||
| 198 | spin_lock_irqsave(ap->lock, flags); | 204 | spin_lock_irqsave(ap->lock, flags); |
| 199 | 205 | ||
| 200 | switch (event) { | 206 | switch (event) { |
| @@ -202,7 +208,6 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev, | |||
| 202 | case ACPI_NOTIFY_DEVICE_CHECK: | 208 | case ACPI_NOTIFY_DEVICE_CHECK: |
| 203 | ata_ehi_push_desc(ehi, "ACPI event"); | 209 | ata_ehi_push_desc(ehi, "ACPI event"); |
| 204 | 210 | ||
| 205 | status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); | ||
| 206 | if (ACPI_FAILURE(status)) { | 211 | if (ACPI_FAILURE(status)) { |
| 207 | ata_port_printk(ap, KERN_ERR, | 212 | ata_port_printk(ap, KERN_ERR, |
| 208 | "acpi: failed to determine bay status (0x%x)\n", | 213 | "acpi: failed to determine bay status (0x%x)\n", |
| @@ -690,6 +695,14 @@ static int ata_acpi_filter_tf(const struct ata_taskfile *tf, | |||
| 690 | return 1; | 695 | return 1; |
| 691 | } | 696 | } |
| 692 | 697 | ||
| 698 | if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_DIPM) { | ||
| 699 | /* inhibit enabling DIPM */ | ||
| 700 | if (tf->command == ATA_CMD_SET_FEATURES && | ||
| 701 | tf->feature == SETFEATURES_SATA_ENABLE && | ||
| 702 | tf->nsect == SATA_DIPM) | ||
| 703 | return 1; | ||
| 704 | } | ||
| 705 | |||
| 693 | return 0; | 706 | return 0; |
| 694 | } | 707 | } |
| 695 | 708 | ||
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 215d18672a5a..c0908c225483 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
| @@ -1094,6 +1094,7 @@ static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq) | |||
| 1094 | int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, | 1094 | int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, |
| 1095 | u8 status, int in_wq) | 1095 | u8 status, int in_wq) |
| 1096 | { | 1096 | { |
| 1097 | struct ata_eh_info *ehi = &ap->link.eh_info; | ||
| 1097 | unsigned long flags = 0; | 1098 | unsigned long flags = 0; |
| 1098 | int poll_next; | 1099 | int poll_next; |
| 1099 | 1100 | ||
| @@ -1125,9 +1126,12 @@ fsm_start: | |||
| 1125 | if (likely(status & (ATA_ERR | ATA_DF))) | 1126 | if (likely(status & (ATA_ERR | ATA_DF))) |
| 1126 | /* device stops HSM for abort/error */ | 1127 | /* device stops HSM for abort/error */ |
| 1127 | qc->err_mask |= AC_ERR_DEV; | 1128 | qc->err_mask |= AC_ERR_DEV; |
| 1128 | else | 1129 | else { |
| 1129 | /* HSM violation. Let EH handle this */ | 1130 | /* HSM violation. Let EH handle this */ |
| 1131 | ata_ehi_push_desc(ehi, | ||
| 1132 | "ST_FIRST: !(DRQ|ERR|DF)"); | ||
| 1130 | qc->err_mask |= AC_ERR_HSM; | 1133 | qc->err_mask |= AC_ERR_HSM; |
| 1134 | } | ||
| 1131 | 1135 | ||
| 1132 | ap->hsm_task_state = HSM_ST_ERR; | 1136 | ap->hsm_task_state = HSM_ST_ERR; |
| 1133 | goto fsm_start; | 1137 | goto fsm_start; |
| @@ -1146,9 +1150,9 @@ fsm_start: | |||
| 1146 | * the CDB. | 1150 | * the CDB. |
| 1147 | */ | 1151 | */ |
| 1148 | if (!(qc->dev->horkage & ATA_HORKAGE_STUCK_ERR)) { | 1152 | if (!(qc->dev->horkage & ATA_HORKAGE_STUCK_ERR)) { |
| 1149 | ata_port_printk(ap, KERN_WARNING, | 1153 | ata_ehi_push_desc(ehi, "ST_FIRST: " |
| 1150 | "DRQ=1 with device error, " | 1154 | "DRQ=1 with device error, " |
| 1151 | "dev_stat 0x%X\n", status); | 1155 | "dev_stat 0x%X", status); |
| 1152 | qc->err_mask |= AC_ERR_HSM; | 1156 | qc->err_mask |= AC_ERR_HSM; |
| 1153 | ap->hsm_task_state = HSM_ST_ERR; | 1157 | ap->hsm_task_state = HSM_ST_ERR; |
| 1154 | goto fsm_start; | 1158 | goto fsm_start; |
| @@ -1205,9 +1209,9 @@ fsm_start: | |||
| 1205 | * let the EH abort the command or reset the device. | 1209 | * let the EH abort the command or reset the device. |
| 1206 | */ | 1210 | */ |
| 1207 | if (unlikely(status & (ATA_ERR | ATA_DF))) { | 1211 | if (unlikely(status & (ATA_ERR | ATA_DF))) { |
| 1208 | ata_port_printk(ap, KERN_WARNING, "DRQ=1 with " | 1212 | ata_ehi_push_desc(ehi, "ST-ATAPI: " |
| 1209 | "device error, dev_stat 0x%X\n", | 1213 | "DRQ=1 with device error, " |
| 1210 | status); | 1214 | "dev_stat 0x%X", status); |
| 1211 | qc->err_mask |= AC_ERR_HSM; | 1215 | qc->err_mask |= AC_ERR_HSM; |
| 1212 | ap->hsm_task_state = HSM_ST_ERR; | 1216 | ap->hsm_task_state = HSM_ST_ERR; |
| 1213 | goto fsm_start; | 1217 | goto fsm_start; |
| @@ -1226,13 +1230,17 @@ fsm_start: | |||
| 1226 | if (likely(status & (ATA_ERR | ATA_DF))) | 1230 | if (likely(status & (ATA_ERR | ATA_DF))) |
| 1227 | /* device stops HSM for abort/error */ | 1231 | /* device stops HSM for abort/error */ |
| 1228 | qc->err_mask |= AC_ERR_DEV; | 1232 | qc->err_mask |= AC_ERR_DEV; |
| 1229 | else | 1233 | else { |
| 1230 | /* HSM violation. Let EH handle this. | 1234 | /* HSM violation. Let EH handle this. |
| 1231 | * Phantom devices also trigger this | 1235 | * Phantom devices also trigger this |
| 1232 | * condition. Mark hint. | 1236 | * condition. Mark hint. |
| 1233 | */ | 1237 | */ |
| 1238 | ata_ehi_push_desc(ehi, "ST-ATA: " | ||
| 1239 | "DRQ=1 with device error, " | ||
| 1240 | "dev_stat 0x%X", status); | ||
| 1234 | qc->err_mask |= AC_ERR_HSM | | 1241 | qc->err_mask |= AC_ERR_HSM | |
| 1235 | AC_ERR_NODEV_HINT; | 1242 | AC_ERR_NODEV_HINT; |
| 1243 | } | ||
| 1236 | 1244 | ||
| 1237 | ap->hsm_task_state = HSM_ST_ERR; | 1245 | ap->hsm_task_state = HSM_ST_ERR; |
| 1238 | goto fsm_start; | 1246 | goto fsm_start; |
| @@ -1257,8 +1265,12 @@ fsm_start: | |||
| 1257 | status = ata_wait_idle(ap); | 1265 | status = ata_wait_idle(ap); |
| 1258 | } | 1266 | } |
| 1259 | 1267 | ||
| 1260 | if (status & (ATA_BUSY | ATA_DRQ)) | 1268 | if (status & (ATA_BUSY | ATA_DRQ)) { |
| 1269 | ata_ehi_push_desc(ehi, "ST-ATA: " | ||
| 1270 | "BUSY|DRQ persists on ERR|DF, " | ||
| 1271 | "dev_stat 0x%X", status); | ||
| 1261 | qc->err_mask |= AC_ERR_HSM; | 1272 | qc->err_mask |= AC_ERR_HSM; |
| 1273 | } | ||
| 1262 | 1274 | ||
| 1263 | /* ata_pio_sectors() might change the | 1275 | /* ata_pio_sectors() might change the |
| 1264 | * state to HSM_ST_LAST. so, the state | 1276 | * state to HSM_ST_LAST. so, the state |
diff --git a/drivers/ata/pata_sis.c b/drivers/ata/pata_sis.c index e82c66e8d31b..26345d7b531c 100644 --- a/drivers/ata/pata_sis.c +++ b/drivers/ata/pata_sis.c | |||
| @@ -56,6 +56,7 @@ static const struct sis_laptop sis_laptop[] = { | |||
| 56 | { 0x5513, 0x1043, 0x1107 }, /* ASUS A6K */ | 56 | { 0x5513, 0x1043, 0x1107 }, /* ASUS A6K */ |
| 57 | { 0x5513, 0x1734, 0x105F }, /* FSC Amilo A1630 */ | 57 | { 0x5513, 0x1734, 0x105F }, /* FSC Amilo A1630 */ |
| 58 | { 0x5513, 0x1071, 0x8640 }, /* EasyNote K5305 */ | 58 | { 0x5513, 0x1071, 0x8640 }, /* EasyNote K5305 */ |
| 59 | { 0x5513, 0x1039, 0x5513 }, /* Targa Visionary 1000 */ | ||
| 59 | /* end marker */ | 60 | /* end marker */ |
| 60 | { 0, } | 61 | { 0, } |
| 61 | }; | 62 | }; |
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 28092bc50146..ad169ffbc4cb 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
| @@ -1607,7 +1607,7 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc) | |||
| 1607 | * Much of the time, this could just work regardless. | 1607 | * Much of the time, this could just work regardless. |
| 1608 | * So for now, just log the incident, and allow the attempt. | 1608 | * So for now, just log the incident, and allow the attempt. |
| 1609 | */ | 1609 | */ |
| 1610 | if (limit_warnings && (qc->nbytes / qc->sect_size) > 1) { | 1610 | if (limit_warnings > 0 && (qc->nbytes / qc->sect_size) > 1) { |
| 1611 | --limit_warnings; | 1611 | --limit_warnings; |
| 1612 | ata_link_printk(qc->dev->link, KERN_WARNING, DRV_NAME | 1612 | ata_link_printk(qc->dev->link, KERN_WARNING, DRV_NAME |
| 1613 | ": attempting PIO w/multiple DRQ: " | 1613 | ": attempting PIO w/multiple DRQ: " |
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index 8ee6b5b4ede7..84ffcc26a74b 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
| @@ -370,6 +370,7 @@ static const struct pci_device_id sil24_pci_tbl[] = { | |||
| 370 | { PCI_VDEVICE(INTEL, 0x3124), BID_SIL3124 }, | 370 | { PCI_VDEVICE(INTEL, 0x3124), BID_SIL3124 }, |
| 371 | { PCI_VDEVICE(CMD, 0x3132), BID_SIL3132 }, | 371 | { PCI_VDEVICE(CMD, 0x3132), BID_SIL3132 }, |
| 372 | { PCI_VDEVICE(CMD, 0x0242), BID_SIL3132 }, | 372 | { PCI_VDEVICE(CMD, 0x0242), BID_SIL3132 }, |
| 373 | { PCI_VDEVICE(CMD, 0x0244), BID_SIL3132 }, | ||
| 373 | { PCI_VDEVICE(CMD, 0x3131), BID_SIL3131 }, | 374 | { PCI_VDEVICE(CMD, 0x3131), BID_SIL3131 }, |
| 374 | { PCI_VDEVICE(CMD, 0x3531), BID_SIL3131 }, | 375 | { PCI_VDEVICE(CMD, 0x3531), BID_SIL3131 }, |
| 375 | 376 | ||
diff --git a/drivers/ata/sata_uli.c b/drivers/ata/sata_uli.c index f277cea904ce..db529b849948 100644 --- a/drivers/ata/sata_uli.c +++ b/drivers/ata/sata_uli.c | |||
| @@ -83,6 +83,7 @@ static struct ata_port_operations uli_ops = { | |||
| 83 | .inherits = &ata_bmdma_port_ops, | 83 | .inherits = &ata_bmdma_port_ops, |
| 84 | .scr_read = uli_scr_read, | 84 | .scr_read = uli_scr_read, |
| 85 | .scr_write = uli_scr_write, | 85 | .scr_write = uli_scr_write, |
| 86 | .hardreset = ATA_OP_NULL, | ||
| 86 | }; | 87 | }; |
| 87 | 88 | ||
| 88 | static const struct ata_port_info uli_port_info = { | 89 | static const struct ata_port_info uli_port_info = { |
diff --git a/drivers/auxdisplay/Kconfig b/drivers/auxdisplay/Kconfig index 043353bd0600..14b9d5f4c203 100644 --- a/drivers/auxdisplay/Kconfig +++ b/drivers/auxdisplay/Kconfig | |||
| @@ -64,7 +64,7 @@ config KS0108_DELAY | |||
| 64 | Amount of time the ks0108 should wait between each control write | 64 | Amount of time the ks0108 should wait between each control write |
| 65 | to the parallel port. | 65 | to the parallel port. |
| 66 | 66 | ||
| 67 | If your driver seems to miss random writings, increment this. | 67 | If your LCD seems to miss random writings, increment this. |
| 68 | 68 | ||
| 69 | If you don't know what I'm talking about, ignore it. | 69 | If you don't know what I'm talking about, ignore it. |
| 70 | 70 | ||
diff --git a/drivers/auxdisplay/cfag12864b.c b/drivers/auxdisplay/cfag12864b.c index 80bb06105387..683509f013ab 100644 --- a/drivers/auxdisplay/cfag12864b.c +++ b/drivers/auxdisplay/cfag12864b.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * License: GPLv2 | 5 | * License: GPLv2 |
| 6 | * Depends: ks0108 | 6 | * Depends: ks0108 |
| 7 | * | 7 | * |
| 8 | * Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com> | 8 | * Author: Copyright (C) Miguel Ojeda Sandonis |
| 9 | * Date: 2006-10-31 | 9 | * Date: 2006-10-31 |
| 10 | * | 10 | * |
| 11 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
| @@ -398,5 +398,5 @@ module_init(cfag12864b_init); | |||
| 398 | module_exit(cfag12864b_exit); | 398 | module_exit(cfag12864b_exit); |
| 399 | 399 | ||
| 400 | MODULE_LICENSE("GPL v2"); | 400 | MODULE_LICENSE("GPL v2"); |
| 401 | MODULE_AUTHOR("Miguel Ojeda Sandonis <maxextreme@gmail.com>"); | 401 | MODULE_AUTHOR("Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>"); |
| 402 | MODULE_DESCRIPTION("cfag12864b LCD driver"); | 402 | MODULE_DESCRIPTION("cfag12864b LCD driver"); |
diff --git a/drivers/auxdisplay/cfag12864bfb.c b/drivers/auxdisplay/cfag12864bfb.c index 307c190699e0..fe3a865be4e5 100644 --- a/drivers/auxdisplay/cfag12864bfb.c +++ b/drivers/auxdisplay/cfag12864bfb.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * License: GPLv2 | 5 | * License: GPLv2 |
| 6 | * Depends: cfag12864b | 6 | * Depends: cfag12864b |
| 7 | * | 7 | * |
| 8 | * Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com> | 8 | * Author: Copyright (C) Miguel Ojeda Sandonis |
| 9 | * Date: 2006-10-31 | 9 | * Date: 2006-10-31 |
| 10 | * | 10 | * |
| 11 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
| @@ -186,5 +186,5 @@ module_init(cfag12864bfb_init); | |||
| 186 | module_exit(cfag12864bfb_exit); | 186 | module_exit(cfag12864bfb_exit); |
| 187 | 187 | ||
| 188 | MODULE_LICENSE("GPL v2"); | 188 | MODULE_LICENSE("GPL v2"); |
| 189 | MODULE_AUTHOR("Miguel Ojeda Sandonis <maxextreme@gmail.com>"); | 189 | MODULE_AUTHOR("Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>"); |
| 190 | MODULE_DESCRIPTION("cfag12864b LCD framebuffer driver"); | 190 | MODULE_DESCRIPTION("cfag12864b LCD framebuffer driver"); |
diff --git a/drivers/auxdisplay/ks0108.c b/drivers/auxdisplay/ks0108.c index e6c3646ef18c..5b93852392b8 100644 --- a/drivers/auxdisplay/ks0108.c +++ b/drivers/auxdisplay/ks0108.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * License: GPLv2 | 5 | * License: GPLv2 |
| 6 | * Depends: parport | 6 | * Depends: parport |
| 7 | * | 7 | * |
| 8 | * Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com> | 8 | * Author: Copyright (C) Miguel Ojeda Sandonis |
| 9 | * Date: 2006-10-31 | 9 | * Date: 2006-10-31 |
| 10 | * | 10 | * |
| 11 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
| @@ -173,6 +173,6 @@ module_init(ks0108_init); | |||
| 173 | module_exit(ks0108_exit); | 173 | module_exit(ks0108_exit); |
| 174 | 174 | ||
| 175 | MODULE_LICENSE("GPL v2"); | 175 | MODULE_LICENSE("GPL v2"); |
| 176 | MODULE_AUTHOR("Miguel Ojeda Sandonis <maxextreme@gmail.com>"); | 176 | MODULE_AUTHOR("Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>"); |
| 177 | MODULE_DESCRIPTION("ks0108 LCD Controller driver"); | 177 | MODULE_DESCRIPTION("ks0108 LCD Controller driver"); |
| 178 | 178 | ||
diff --git a/drivers/base/node.c b/drivers/base/node.c index 39f3d1b3a213..0f867a083338 100644 --- a/drivers/base/node.c +++ b/drivers/base/node.c | |||
| @@ -84,8 +84,8 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf) | |||
| 84 | nid, K(i.totalram), | 84 | nid, K(i.totalram), |
| 85 | nid, K(i.freeram), | 85 | nid, K(i.freeram), |
| 86 | nid, K(i.totalram - i.freeram), | 86 | nid, K(i.totalram - i.freeram), |
| 87 | nid, node_page_state(nid, NR_ACTIVE), | 87 | nid, K(node_page_state(nid, NR_ACTIVE)), |
| 88 | nid, node_page_state(nid, NR_INACTIVE), | 88 | nid, K(node_page_state(nid, NR_INACTIVE)), |
| 89 | #ifdef CONFIG_HIGHMEM | 89 | #ifdef CONFIG_HIGHMEM |
| 90 | nid, K(i.totalhigh), | 90 | nid, K(i.totalhigh), |
| 91 | nid, K(i.freehigh), | 91 | nid, K(i.freehigh), |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 5f1e1cc6165a..d81632cd7d06 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
| @@ -106,35 +106,34 @@ MODULE_DEVICE_TABLE(pci, cciss_pci_device_id); | |||
| 106 | /* board_id = Subsystem Device ID & Vendor ID | 106 | /* board_id = Subsystem Device ID & Vendor ID |
| 107 | * product = Marketing Name for the board | 107 | * product = Marketing Name for the board |
| 108 | * access = Address of the struct of function pointers | 108 | * access = Address of the struct of function pointers |
| 109 | * nr_cmds = Number of commands supported by controller | ||
| 110 | */ | 109 | */ |
| 111 | static struct board_type products[] = { | 110 | static struct board_type products[] = { |
| 112 | {0x40700E11, "Smart Array 5300", &SA5_access, 512}, | 111 | {0x40700E11, "Smart Array 5300", &SA5_access}, |
| 113 | {0x40800E11, "Smart Array 5i", &SA5B_access, 512}, | 112 | {0x40800E11, "Smart Array 5i", &SA5B_access}, |
| 114 | {0x40820E11, "Smart Array 532", &SA5B_access, 512}, | 113 | {0x40820E11, "Smart Array 532", &SA5B_access}, |
| 115 | {0x40830E11, "Smart Array 5312", &SA5B_access, 512}, | 114 | {0x40830E11, "Smart Array 5312", &SA5B_access}, |
| 116 | {0x409A0E11, "Smart Array 641", &SA5_access, 512}, | 115 | {0x409A0E11, "Smart Array 641", &SA5_access}, |
| 117 | {0x409B0E11, "Smart Array 642", &SA5_access, 512}, | 116 | {0x409B0E11, "Smart Array 642", &SA5_access}, |
| 118 | {0x409C0E11, "Smart Array 6400", &SA5_access, 512}, | 117 | {0x409C0E11, "Smart Array 6400", &SA5_access}, |
| 119 | {0x409D0E11, "Smart Array 6400 EM", &SA5_access, 512}, | 118 | {0x409D0E11, "Smart Array 6400 EM", &SA5_access}, |
| 120 | {0x40910E11, "Smart Array 6i", &SA5_access, 512}, | 119 | {0x40910E11, "Smart Array 6i", &SA5_access}, |
| 121 | {0x3225103C, "Smart Array P600", &SA5_access, 512}, | 120 | {0x3225103C, "Smart Array P600", &SA5_access}, |
| 122 | {0x3223103C, "Smart Array P800", &SA5_access, 512}, | 121 | {0x3223103C, "Smart Array P800", &SA5_access}, |
| 123 | {0x3234103C, "Smart Array P400", &SA5_access, 512}, | 122 | {0x3234103C, "Smart Array P400", &SA5_access}, |
| 124 | {0x3235103C, "Smart Array P400i", &SA5_access, 512}, | 123 | {0x3235103C, "Smart Array P400i", &SA5_access}, |
| 125 | {0x3211103C, "Smart Array E200i", &SA5_access, 120}, | 124 | {0x3211103C, "Smart Array E200i", &SA5_access}, |
| 126 | {0x3212103C, "Smart Array E200", &SA5_access, 120}, | 125 | {0x3212103C, "Smart Array E200", &SA5_access}, |
| 127 | {0x3213103C, "Smart Array E200i", &SA5_access, 120}, | 126 | {0x3213103C, "Smart Array E200i", &SA5_access}, |
| 128 | {0x3214103C, "Smart Array E200i", &SA5_access, 120}, | 127 | {0x3214103C, "Smart Array E200i", &SA5_access}, |
| 129 | {0x3215103C, "Smart Array E200i", &SA5_access, 120}, | 128 | {0x3215103C, "Smart Array E200i", &SA5_access}, |
| 130 | {0x3237103C, "Smart Array E500", &SA5_access, 512}, | 129 | {0x3237103C, "Smart Array E500", &SA5_access}, |
| 131 | {0x323D103C, "Smart Array P700m", &SA5_access, 512}, | 130 | {0x323D103C, "Smart Array P700m", &SA5_access}, |
| 132 | {0x3241103C, "Smart Array P212", &SA5_access, 384}, | 131 | {0x3241103C, "Smart Array P212", &SA5_access}, |
| 133 | {0x3243103C, "Smart Array P410", &SA5_access, 384}, | 132 | {0x3243103C, "Smart Array P410", &SA5_access}, |
| 134 | {0x3245103C, "Smart Array P410i", &SA5_access, 384}, | 133 | {0x3245103C, "Smart Array P410i", &SA5_access}, |
| 135 | {0x3247103C, "Smart Array P411", &SA5_access, 384}, | 134 | {0x3247103C, "Smart Array P411", &SA5_access}, |
| 136 | {0x3249103C, "Smart Array P812", &SA5_access, 384}, | 135 | {0x3249103C, "Smart Array P812", &SA5_access}, |
| 137 | {0xFFFF103C, "Unknown Smart Array", &SA5_access, 120}, | 136 | {0xFFFF103C, "Unknown Smart Array", &SA5_access}, |
| 138 | }; | 137 | }; |
| 139 | 138 | ||
| 140 | /* How long to wait (in milliseconds) for board to go into simple mode */ | 139 | /* How long to wait (in milliseconds) for board to go into simple mode */ |
| @@ -3086,11 +3085,20 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) | |||
| 3086 | print_cfg_table(c->cfgtable); | 3085 | print_cfg_table(c->cfgtable); |
| 3087 | #endif /* CCISS_DEBUG */ | 3086 | #endif /* CCISS_DEBUG */ |
| 3088 | 3087 | ||
| 3088 | /* Some controllers support Zero Memory Raid (ZMR). | ||
| 3089 | * When configured in ZMR mode the number of supported | ||
| 3090 | * commands drops to 64. So instead of just setting an | ||
| 3091 | * arbitrary value we make the driver a little smarter. | ||
| 3092 | * We read the config table to tell us how many commands | ||
| 3093 | * are supported on the controller then subtract 4 to | ||
| 3094 | * leave a little room for ioctl calls. | ||
| 3095 | */ | ||
| 3096 | c->max_commands = readl(&(c->cfgtable->CmdsOutMax)); | ||
| 3089 | for (i = 0; i < ARRAY_SIZE(products); i++) { | 3097 | for (i = 0; i < ARRAY_SIZE(products); i++) { |
| 3090 | if (board_id == products[i].board_id) { | 3098 | if (board_id == products[i].board_id) { |
| 3091 | c->product_name = products[i].product_name; | 3099 | c->product_name = products[i].product_name; |
| 3092 | c->access = *(products[i].access); | 3100 | c->access = *(products[i].access); |
| 3093 | c->nr_cmds = products[i].nr_cmds; | 3101 | c->nr_cmds = c->max_commands - 4; |
| 3094 | break; | 3102 | break; |
| 3095 | } | 3103 | } |
| 3096 | } | 3104 | } |
| @@ -3110,7 +3118,7 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) | |||
| 3110 | if (subsystem_vendor_id == PCI_VENDOR_ID_HP) { | 3118 | if (subsystem_vendor_id == PCI_VENDOR_ID_HP) { |
| 3111 | c->product_name = products[i-1].product_name; | 3119 | c->product_name = products[i-1].product_name; |
| 3112 | c->access = *(products[i-1].access); | 3120 | c->access = *(products[i-1].access); |
| 3113 | c->nr_cmds = products[i-1].nr_cmds; | 3121 | c->nr_cmds = c->max_commands - 4; |
| 3114 | printk(KERN_WARNING "cciss: This is an unknown " | 3122 | printk(KERN_WARNING "cciss: This is an unknown " |
| 3115 | "Smart Array controller.\n" | 3123 | "Smart Array controller.\n" |
| 3116 | "cciss: Please update to the latest driver " | 3124 | "cciss: Please update to the latest driver " |
| @@ -3546,6 +3554,10 @@ static int __devinit cciss_init_one(struct pci_dev *pdev, | |||
| 3546 | for (j = 0; j <= hba[i]->highest_lun; j++) | 3554 | for (j = 0; j <= hba[i]->highest_lun; j++) |
| 3547 | add_disk(hba[i]->gendisk[j]); | 3555 | add_disk(hba[i]->gendisk[j]); |
| 3548 | 3556 | ||
| 3557 | /* we must register the controller even if no disks exist */ | ||
| 3558 | if (hba[i]->highest_lun == -1) | ||
| 3559 | add_disk(hba[i]->gendisk[0]); | ||
| 3560 | |||
| 3549 | return 1; | 3561 | return 1; |
| 3550 | 3562 | ||
| 3551 | clean4: | 3563 | clean4: |
diff --git a/drivers/char/drm/i915_irq.c b/drivers/char/drm/i915_irq.c index f7f16e7a8bf3..df036118b8b1 100644 --- a/drivers/char/drm/i915_irq.c +++ b/drivers/char/drm/i915_irq.c | |||
| @@ -62,11 +62,11 @@ static void i915_vblank_tasklet(struct drm_device *dev) | |||
| 62 | u32 ropcpp = (0xcc << 16) | ((cpp - 1) << 24); | 62 | u32 ropcpp = (0xcc << 16) | ((cpp - 1) << 24); |
| 63 | RING_LOCALS; | 63 | RING_LOCALS; |
| 64 | 64 | ||
| 65 | if (sarea_priv->front_tiled) { | 65 | if (IS_I965G(dev) && sarea_priv->front_tiled) { |
| 66 | cmd |= XY_SRC_COPY_BLT_DST_TILED; | 66 | cmd |= XY_SRC_COPY_BLT_DST_TILED; |
| 67 | dst_pitch >>= 2; | 67 | dst_pitch >>= 2; |
| 68 | } | 68 | } |
| 69 | if (sarea_priv->back_tiled) { | 69 | if (IS_I965G(dev) && sarea_priv->back_tiled) { |
| 70 | cmd |= XY_SRC_COPY_BLT_SRC_TILED; | 70 | cmd |= XY_SRC_COPY_BLT_SRC_TILED; |
| 71 | src_pitch >>= 2; | 71 | src_pitch >>= 2; |
| 72 | } | 72 | } |
diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c index 1b9a87047817..0e6df289cb46 100644 --- a/drivers/char/ipmi/ipmi_watchdog.c +++ b/drivers/char/ipmi/ipmi_watchdog.c | |||
| @@ -755,9 +755,8 @@ static ssize_t ipmi_write(struct file *file, | |||
| 755 | rv = ipmi_heartbeat(); | 755 | rv = ipmi_heartbeat(); |
| 756 | if (rv) | 756 | if (rv) |
| 757 | return rv; | 757 | return rv; |
| 758 | return 1; | ||
| 759 | } | 758 | } |
| 760 | return 0; | 759 | return len; |
| 761 | } | 760 | } |
| 762 | 761 | ||
| 763 | static ssize_t ipmi_read(struct file *file, | 762 | static ssize_t ipmi_read(struct file *file, |
diff --git a/drivers/char/pcmcia/ipwireless/hardware.c b/drivers/char/pcmcia/ipwireless/hardware.c index ba6340ae98af..929101ecbae2 100644 --- a/drivers/char/pcmcia/ipwireless/hardware.c +++ b/drivers/char/pcmcia/ipwireless/hardware.c | |||
| @@ -590,8 +590,10 @@ static struct ipw_rx_packet *pool_allocate(struct ipw_hardware *hw, | |||
| 590 | packet = kmalloc(sizeof(struct ipw_rx_packet) + | 590 | packet = kmalloc(sizeof(struct ipw_rx_packet) + |
| 591 | old_packet->length + minimum_free_space, | 591 | old_packet->length + minimum_free_space, |
| 592 | GFP_ATOMIC); | 592 | GFP_ATOMIC); |
| 593 | if (!packet) | 593 | if (!packet) { |
| 594 | kfree(old_packet); | ||
| 594 | return NULL; | 595 | return NULL; |
| 596 | } | ||
| 595 | memcpy(packet, old_packet, | 597 | memcpy(packet, old_packet, |
| 596 | sizeof(struct ipw_rx_packet) | 598 | sizeof(struct ipw_rx_packet) |
| 597 | + old_packet->length); | 599 | + old_packet->length); |
diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c index 5f80a9dff573..909cac93fa2a 100644 --- a/drivers/char/rtc.c +++ b/drivers/char/rtc.c | |||
| @@ -678,12 +678,13 @@ static int rtc_do_ioctl(unsigned int cmd, unsigned long arg, int kernel) | |||
| 678 | if (arg != (1<<tmp)) | 678 | if (arg != (1<<tmp)) |
| 679 | return -EINVAL; | 679 | return -EINVAL; |
| 680 | 680 | ||
| 681 | rtc_freq = arg; | ||
| 682 | |||
| 681 | spin_lock_irqsave(&rtc_lock, flags); | 683 | spin_lock_irqsave(&rtc_lock, flags); |
| 682 | if (hpet_set_periodic_freq(arg)) { | 684 | if (hpet_set_periodic_freq(arg)) { |
| 683 | spin_unlock_irqrestore(&rtc_lock, flags); | 685 | spin_unlock_irqrestore(&rtc_lock, flags); |
| 684 | return 0; | 686 | return 0; |
| 685 | } | 687 | } |
| 686 | rtc_freq = arg; | ||
| 687 | 688 | ||
| 688 | val = CMOS_READ(RTC_FREQ_SELECT) & 0xf0; | 689 | val = CMOS_READ(RTC_FREQ_SELECT) & 0xf0; |
| 689 | val |= (16 - tmp); | 690 | val |= (16 - tmp); |
diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c index 13a4bdd4e4d6..c7a977bc03e8 100644 --- a/drivers/char/tpm/tpm_tis.c +++ b/drivers/char/tpm/tpm_tis.c | |||
| @@ -623,6 +623,7 @@ static struct pnp_device_id tpm_pnp_tbl[] __devinitdata = { | |||
| 623 | {"IFX0102", 0}, /* Infineon */ | 623 | {"IFX0102", 0}, /* Infineon */ |
| 624 | {"BCM0101", 0}, /* Broadcom */ | 624 | {"BCM0101", 0}, /* Broadcom */ |
| 625 | {"NSC1200", 0}, /* National */ | 625 | {"NSC1200", 0}, /* National */ |
| 626 | {"ICO0102", 0}, /* Intel */ | ||
| 626 | /* Add new here */ | 627 | /* Add new here */ |
| 627 | {"", 0}, /* User Specified */ | 628 | {"", 0}, /* User Specified */ |
| 628 | {"", 0} /* Terminator */ | 629 | {"", 0} /* Terminator */ |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index e94bee032314..750131010af0 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
| @@ -3322,7 +3322,7 @@ static int send_break(struct tty_struct *tty, unsigned int duration) | |||
| 3322 | msleep_interruptible(duration); | 3322 | msleep_interruptible(duration); |
| 3323 | tty->ops->break_ctl(tty, 0); | 3323 | tty->ops->break_ctl(tty, 0); |
| 3324 | tty_write_unlock(tty); | 3324 | tty_write_unlock(tty); |
| 3325 | if (!signal_pending(current)) | 3325 | if (signal_pending(current)) |
| 3326 | return -EINTR; | 3326 | return -EINTR; |
| 3327 | return 0; | 3327 | return 0; |
| 3328 | } | 3328 | } |
diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index 85e2ba7fcfba..bf4830082a13 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c | |||
| @@ -27,6 +27,8 @@ | |||
| 27 | #include <linux/moduleparam.h> | 27 | #include <linux/moduleparam.h> |
| 28 | #include <linux/connector.h> | 28 | #include <linux/connector.h> |
| 29 | #include <linux/mutex.h> | 29 | #include <linux/mutex.h> |
| 30 | #include <linux/proc_fs.h> | ||
| 31 | #include <linux/spinlock.h> | ||
| 30 | 32 | ||
| 31 | #include <net/sock.h> | 33 | #include <net/sock.h> |
| 32 | 34 | ||
| @@ -403,6 +405,40 @@ static void cn_callback(void *data) | |||
| 403 | mutex_unlock(¬ify_lock); | 405 | mutex_unlock(¬ify_lock); |
| 404 | } | 406 | } |
| 405 | 407 | ||
| 408 | static int cn_proc_show(struct seq_file *m, void *v) | ||
| 409 | { | ||
| 410 | struct cn_queue_dev *dev = cdev.cbdev; | ||
| 411 | struct cn_callback_entry *cbq; | ||
| 412 | |||
| 413 | seq_printf(m, "Name ID\n"); | ||
| 414 | |||
| 415 | spin_lock_bh(&dev->queue_lock); | ||
| 416 | |||
| 417 | list_for_each_entry(cbq, &dev->queue_list, callback_entry) { | ||
| 418 | seq_printf(m, "%-15s %u:%u\n", | ||
| 419 | cbq->id.name, | ||
| 420 | cbq->id.id.idx, | ||
| 421 | cbq->id.id.val); | ||
| 422 | } | ||
| 423 | |||
| 424 | spin_unlock_bh(&dev->queue_lock); | ||
| 425 | |||
| 426 | return 0; | ||
| 427 | } | ||
| 428 | |||
| 429 | static int cn_proc_open(struct inode *inode, struct file *file) | ||
| 430 | { | ||
| 431 | return single_open(file, cn_proc_show, NULL); | ||
| 432 | } | ||
| 433 | |||
| 434 | static const struct file_operations cn_file_ops = { | ||
| 435 | .owner = THIS_MODULE, | ||
| 436 | .open = cn_proc_open, | ||
| 437 | .read = seq_read, | ||
| 438 | .llseek = seq_lseek, | ||
| 439 | .release = single_release | ||
| 440 | }; | ||
| 441 | |||
| 406 | static int __devinit cn_init(void) | 442 | static int __devinit cn_init(void) |
| 407 | { | 443 | { |
| 408 | struct cn_dev *dev = &cdev; | 444 | struct cn_dev *dev = &cdev; |
| @@ -434,6 +470,8 @@ static int __devinit cn_init(void) | |||
| 434 | return -EINVAL; | 470 | return -EINVAL; |
| 435 | } | 471 | } |
| 436 | 472 | ||
| 473 | proc_net_fops_create(&init_net, "connector", S_IRUGO, &cn_file_ops); | ||
| 474 | |||
| 437 | return 0; | 475 | return 0; |
| 438 | } | 476 | } |
| 439 | 477 | ||
| @@ -443,6 +481,8 @@ static void __devexit cn_fini(void) | |||
| 443 | 481 | ||
| 444 | cn_already_initialized = 0; | 482 | cn_already_initialized = 0; |
| 445 | 483 | ||
| 484 | proc_net_remove(&init_net, "connector"); | ||
| 485 | |||
| 446 | cn_del_callback(&dev->id); | 486 | cn_del_callback(&dev->id); |
| 447 | cn_queue_free_dev(dev->cbdev); | 487 | cn_queue_free_dev(dev->cbdev); |
| 448 | netlink_kernel_release(dev->nls); | 488 | netlink_kernel_release(dev->nls); |
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index bbd28342e771..008c38ba774f 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
| @@ -28,12 +28,18 @@ config DEBUG_GPIO | |||
| 28 | comment "I2C GPIO expanders:" | 28 | comment "I2C GPIO expanders:" |
| 29 | 29 | ||
| 30 | config GPIO_PCA953X | 30 | config GPIO_PCA953X |
| 31 | tristate "PCA953x I/O ports" | 31 | tristate "PCA953x, PCA955x, and MAX7310 I/O ports" |
| 32 | depends on I2C | 32 | depends on I2C |
| 33 | help | 33 | help |
| 34 | Say yes here to support the PCA9534 (8-bit), PCA9535 (16-bit), | 34 | Say yes here to provide access to several register-oriented |
| 35 | PCA9536 (4-bit), PCA9537 (4-bit), PCA9538 (8-bit), and PCA9539 | 35 | SMBus I/O expanders, made mostly by NXP or TI. Compatible |
| 36 | (16-bit) I/O ports. These parts are made by NXP and TI. | 36 | models include: |
| 37 | |||
| 38 | 4 bits: pca9536, pca9537 | ||
| 39 | |||
| 40 | 8 bits: max7310, pca9534, pca9538, pca9554, pca9557 | ||
| 41 | |||
| 42 | 16 bits: pca9535, pca9539, pca9555 | ||
| 37 | 43 | ||
| 38 | This driver can also be built as a module. If so, the module | 44 | This driver can also be built as a module. If so, the module |
| 39 | will be called pca953x. | 45 | will be called pca953x. |
diff --git a/drivers/gpio/pca953x.c b/drivers/gpio/pca953x.c index 7e40e8a55edf..a380730b61ab 100644 --- a/drivers/gpio/pca953x.c +++ b/drivers/gpio/pca953x.c | |||
| @@ -33,7 +33,7 @@ static const struct i2c_device_id pca953x_id[] = { | |||
| 33 | { "pca9554", 8, }, | 33 | { "pca9554", 8, }, |
| 34 | { "pca9555", 16, }, | 34 | { "pca9555", 16, }, |
| 35 | { "pca9557", 8, }, | 35 | { "pca9557", 8, }, |
| 36 | /* REVISIT several pca955x parts should work here too */ | 36 | { "max7310", 8, }, |
| 37 | { } | 37 | { } |
| 38 | }; | 38 | }; |
| 39 | MODULE_DEVICE_TABLE(i2c, pca953x_id); | 39 | MODULE_DEVICE_TABLE(i2c, pca953x_id); |
diff --git a/drivers/hwmon/hdaps.c b/drivers/hwmon/hdaps.c index 26df06f840eb..50f22690d611 100644 --- a/drivers/hwmon/hdaps.c +++ b/drivers/hwmon/hdaps.c | |||
| @@ -516,17 +516,23 @@ static struct dmi_system_id __initdata hdaps_whitelist[] = { | |||
| 516 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R51"), | 516 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R51"), |
| 517 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R52"), | 517 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R52"), |
| 518 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61i"), | 518 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61i"), |
| 519 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61"), | ||
| 519 | HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T41p"), | 520 | HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T41p"), |
| 520 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T41"), | 521 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T41"), |
| 521 | HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T42p"), | 522 | HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T42p"), |
| 522 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T42"), | 523 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T42"), |
| 523 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T43"), | 524 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T43"), |
| 524 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T60"), | 525 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T60"), |
| 526 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61p"), | ||
| 525 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61"), | 527 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61"), |
| 526 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X40"), | 528 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X40"), |
| 527 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X41"), | 529 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X41"), |
| 528 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60"), | 530 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60"), |
| 531 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X61s"), | ||
| 532 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X61"), | ||
| 529 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad Z60m"), | 533 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad Z60m"), |
| 534 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad Z61m"), | ||
| 535 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad Z61p"), | ||
| 530 | { .ident = NULL } | 536 | { .ident = NULL } |
| 531 | }; | 537 | }; |
| 532 | 538 | ||
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 1305ef190fc1..9e8c875437be 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
| @@ -290,12 +290,12 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat) | |||
| 290 | * bus, or started a new i2c message | 290 | * bus, or started a new i2c message |
| 291 | */ | 291 | */ |
| 292 | 292 | ||
| 293 | if (iicstat & S3C2410_IICSTAT_LASTBIT && | 293 | if (iicstat & S3C2410_IICSTAT_LASTBIT && |
| 294 | !(i2c->msg->flags & I2C_M_IGNORE_NAK)) { | 294 | !(i2c->msg->flags & I2C_M_IGNORE_NAK)) { |
| 295 | /* ack was not received... */ | 295 | /* ack was not received... */ |
| 296 | 296 | ||
| 297 | dev_dbg(i2c->dev, "ack was not received\n"); | 297 | dev_dbg(i2c->dev, "ack was not received\n"); |
| 298 | s3c24xx_i2c_stop(i2c, -EREMOTEIO); | 298 | s3c24xx_i2c_stop(i2c, -ENXIO); |
| 299 | goto out_ack; | 299 | goto out_ack; |
| 300 | } | 300 | } |
| 301 | 301 | ||
| @@ -305,7 +305,7 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat) | |||
| 305 | i2c->state = STATE_WRITE; | 305 | i2c->state = STATE_WRITE; |
| 306 | 306 | ||
| 307 | /* terminate the transfer if there is nothing to do | 307 | /* terminate the transfer if there is nothing to do |
| 308 | * (used by the i2c probe to find devices */ | 308 | * as this is used by the i2c probe to find devices. */ |
| 309 | 309 | ||
| 310 | if (is_lastmsg(i2c) && i2c->msg->len == 0) { | 310 | if (is_lastmsg(i2c) && i2c->msg->len == 0) { |
| 311 | s3c24xx_i2c_stop(i2c, 0); | 311 | s3c24xx_i2c_stop(i2c, 0); |
| @@ -323,7 +323,17 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat) | |||
| 323 | * end of the message, and if so, work out what to do | 323 | * end of the message, and if so, work out what to do |
| 324 | */ | 324 | */ |
| 325 | 325 | ||
| 326 | if (!(i2c->msg->flags & I2C_M_IGNORE_NAK)) { | ||
| 327 | if (iicstat & S3C2410_IICSTAT_LASTBIT) { | ||
| 328 | dev_dbg(i2c->dev, "WRITE: No Ack\n"); | ||
| 329 | |||
| 330 | s3c24xx_i2c_stop(i2c, -ECONNREFUSED); | ||
| 331 | goto out_ack; | ||
| 332 | } | ||
| 333 | } | ||
| 334 | |||
| 326 | retry_write: | 335 | retry_write: |
| 336 | |||
| 327 | if (!is_msgend(i2c)) { | 337 | if (!is_msgend(i2c)) { |
| 328 | byte = i2c->msg->buf[i2c->msg_ptr++]; | 338 | byte = i2c->msg->buf[i2c->msg_ptr++]; |
| 329 | writeb(byte, i2c->regs + S3C2410_IICDS); | 339 | writeb(byte, i2c->regs + S3C2410_IICDS); |
| @@ -377,17 +387,6 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat) | |||
| 377 | * going to do any more read/write | 387 | * going to do any more read/write |
| 378 | */ | 388 | */ |
| 379 | 389 | ||
| 380 | if (!(i2c->msg->flags & I2C_M_IGNORE_NAK) && | ||
| 381 | !(is_msglast(i2c) && is_lastmsg(i2c))) { | ||
| 382 | |||
| 383 | if (iicstat & S3C2410_IICSTAT_LASTBIT) { | ||
| 384 | dev_dbg(i2c->dev, "READ: No Ack\n"); | ||
| 385 | |||
| 386 | s3c24xx_i2c_stop(i2c, -ECONNREFUSED); | ||
| 387 | goto out_ack; | ||
| 388 | } | ||
| 389 | } | ||
| 390 | |||
| 391 | byte = readb(i2c->regs + S3C2410_IICDS); | 390 | byte = readb(i2c->regs + S3C2410_IICDS); |
| 392 | i2c->msg->buf[i2c->msg_ptr++] = byte; | 391 | i2c->msg->buf[i2c->msg_ptr++] = byte; |
| 393 | 392 | ||
| @@ -949,3 +948,4 @@ MODULE_DESCRIPTION("S3C24XX I2C Bus driver"); | |||
| 949 | MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>"); | 948 | MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>"); |
| 950 | MODULE_LICENSE("GPL"); | 949 | MODULE_LICENSE("GPL"); |
| 951 | MODULE_ALIAS("platform:s3c2410-i2c"); | 950 | MODULE_ALIAS("platform:s3c2410-i2c"); |
| 951 | MODULE_ALIAS("platform:s3c2440-i2c"); | ||
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 8e07de23d220..1607536ff5fb 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
| @@ -823,6 +823,13 @@ config BLK_DEV_IDE_RAPIDE | |||
| 823 | Say Y here if you want to support the Yellowstone RapIDE controller | 823 | Say Y here if you want to support the Yellowstone RapIDE controller |
| 824 | manufactured for use with Acorn computers. | 824 | manufactured for use with Acorn computers. |
| 825 | 825 | ||
| 826 | config BLK_DEV_IDE_BAST | ||
| 827 | tristate "Simtec BAST / Thorcom VR1000 IDE support" | ||
| 828 | depends on ARM && (ARCH_BAST || MACH_VR1000) | ||
| 829 | help | ||
| 830 | Say Y here if you want to support the onboard IDE channels on the | ||
| 831 | Simtec BAST or the Thorcom VR1000 | ||
| 832 | |||
| 826 | config IDE_H8300 | 833 | config IDE_H8300 |
| 827 | tristate "H8300 IDE support" | 834 | tristate "H8300 IDE support" |
| 828 | depends on H8300 | 835 | depends on H8300 |
diff --git a/drivers/ide/arm/Makefile b/drivers/ide/arm/Makefile index 5bc26053afa6..936e7b0237f5 100644 --- a/drivers/ide/arm/Makefile +++ b/drivers/ide/arm/Makefile | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | 1 | ||
| 2 | obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o | 2 | obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o |
| 3 | obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o | 3 | obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o |
| 4 | obj-$(CONFIG_BLK_DEV_IDE_BAST) += bast-ide.o | ||
| 4 | obj-$(CONFIG_BLK_DEV_PALMCHIP_BK3710) += palm_bk3710.o | 5 | obj-$(CONFIG_BLK_DEV_PALMCHIP_BK3710) += palm_bk3710.o |
| 5 | 6 | ||
| 6 | ifeq ($(CONFIG_IDE_ARM), m) | 7 | ifeq ($(CONFIG_IDE_ARM), m) |
diff --git a/drivers/ide/arm/bast-ide.c b/drivers/ide/arm/bast-ide.c new file mode 100644 index 000000000000..8e8c28104b45 --- /dev/null +++ b/drivers/ide/arm/bast-ide.c | |||
| @@ -0,0 +1,90 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2003-2004 Simtec Electronics | ||
| 3 | * Ben Dooks <ben@simtec.co.uk> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License version 2 as | ||
| 7 | * published by the Free Software Foundation. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/module.h> | ||
| 12 | #include <linux/errno.h> | ||
| 13 | #include <linux/ide.h> | ||
| 14 | #include <linux/init.h> | ||
| 15 | |||
| 16 | #include <asm/mach-types.h> | ||
| 17 | |||
| 18 | #include <asm/io.h> | ||
| 19 | #include <asm/irq.h> | ||
| 20 | #include <asm/arch/map.h> | ||
| 21 | #include <asm/arch/bast-map.h> | ||
| 22 | #include <asm/arch/bast-irq.h> | ||
| 23 | |||
| 24 | #define DRV_NAME "bast-ide" | ||
| 25 | |||
| 26 | static int __init bastide_register(unsigned int base, unsigned int aux, int irq) | ||
| 27 | { | ||
| 28 | ide_hwif_t *hwif; | ||
| 29 | hw_regs_t hw; | ||
| 30 | int i; | ||
| 31 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | ||
| 32 | |||
| 33 | memset(&hw, 0, sizeof(hw)); | ||
| 34 | |||
| 35 | base += BAST_IDE_CS; | ||
| 36 | aux += BAST_IDE_CS; | ||
| 37 | |||
| 38 | for (i = 0; i <= 7; i++) { | ||
| 39 | hw.io_ports_array[i] = (unsigned long)base; | ||
| 40 | base += 0x20; | ||
| 41 | } | ||
| 42 | |||
| 43 | hw.io_ports.ctl_addr = aux + (6 * 0x20); | ||
| 44 | hw.irq = irq; | ||
| 45 | hw.chipset = ide_generic; | ||
| 46 | |||
| 47 | hwif = ide_find_port(); | ||
| 48 | if (hwif == NULL) | ||
| 49 | goto out; | ||
| 50 | |||
| 51 | i = hwif->index; | ||
| 52 | |||
| 53 | ide_init_port_data(hwif, i); | ||
| 54 | ide_init_port_hw(hwif, &hw); | ||
| 55 | hwif->port_ops = NULL; | ||
| 56 | |||
| 57 | idx[0] = i; | ||
| 58 | |||
| 59 | ide_device_add(idx, NULL); | ||
| 60 | out: | ||
| 61 | return 0; | ||
| 62 | } | ||
| 63 | |||
| 64 | static int __init bastide_init(void) | ||
| 65 | { | ||
| 66 | unsigned long base = BAST_VA_IDEPRI + BAST_IDE_CS; | ||
| 67 | |||
| 68 | /* we can treat the VR1000 and the BAST the same */ | ||
| 69 | |||
| 70 | if (!(machine_is_bast() || machine_is_vr1000())) | ||
| 71 | return 0; | ||
| 72 | |||
| 73 | printk("BAST: IDE driver, (c) 2003-2004 Simtec Electronics\n"); | ||
| 74 | |||
| 75 | if (!request_mem_region(base, 0x400000, DRV_NAME)) { | ||
| 76 | printk(KERN_ERR "%s: resources busy\n", DRV_NAME); | ||
| 77 | return -EBUSY; | ||
| 78 | } | ||
| 79 | |||
| 80 | bastide_register(BAST_VA_IDEPRI, BAST_VA_IDEPRIAUX, IRQ_IDE0); | ||
| 81 | bastide_register(BAST_VA_IDESEC, BAST_VA_IDESECAUX, IRQ_IDE1); | ||
| 82 | |||
| 83 | return 0; | ||
| 84 | } | ||
| 85 | |||
| 86 | module_init(bastide_init); | ||
| 87 | |||
| 88 | MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>"); | ||
| 89 | MODULE_LICENSE("GPL"); | ||
| 90 | MODULE_DESCRIPTION("Simtec BAST / Thorcom VR1000 IDE driver"); | ||
diff --git a/drivers/ide/arm/palm_bk3710.c b/drivers/ide/arm/palm_bk3710.c index cc24803fadff..2f2b4f4cf229 100644 --- a/drivers/ide/arm/palm_bk3710.c +++ b/drivers/ide/arm/palm_bk3710.c | |||
| @@ -76,7 +76,7 @@ struct palm_bk3710_udmatiming { | |||
| 76 | 76 | ||
| 77 | #include "../ide-timing.h" | 77 | #include "../ide-timing.h" |
| 78 | 78 | ||
| 79 | static long ide_palm_clk; | 79 | static unsigned ideclk_period; /* in nanoseconds */ |
| 80 | 80 | ||
| 81 | static const struct palm_bk3710_udmatiming palm_bk3710_udmatimings[6] = { | 81 | static const struct palm_bk3710_udmatiming palm_bk3710_udmatimings[6] = { |
| 82 | {160, 240}, /* UDMA Mode 0 */ | 82 | {160, 240}, /* UDMA Mode 0 */ |
| @@ -86,8 +86,6 @@ static const struct palm_bk3710_udmatiming palm_bk3710_udmatimings[6] = { | |||
| 86 | {85, 60}, /* UDMA Mode 4 */ | 86 | {85, 60}, /* UDMA Mode 4 */ |
| 87 | }; | 87 | }; |
| 88 | 88 | ||
| 89 | static struct clk *ideclkp; | ||
| 90 | |||
| 91 | static void palm_bk3710_setudmamode(void __iomem *base, unsigned int dev, | 89 | static void palm_bk3710_setudmamode(void __iomem *base, unsigned int dev, |
| 92 | unsigned int mode) | 90 | unsigned int mode) |
| 93 | { | 91 | { |
| @@ -97,10 +95,10 @@ static void palm_bk3710_setudmamode(void __iomem *base, unsigned int dev, | |||
| 97 | 95 | ||
| 98 | /* DMA Data Setup */ | 96 | /* DMA Data Setup */ |
| 99 | t0 = DIV_ROUND_UP(palm_bk3710_udmatimings[mode].cycletime, | 97 | t0 = DIV_ROUND_UP(palm_bk3710_udmatimings[mode].cycletime, |
| 100 | ide_palm_clk) - 1; | 98 | ideclk_period) - 1; |
| 101 | tenv = DIV_ROUND_UP(20, ide_palm_clk) - 1; | 99 | tenv = DIV_ROUND_UP(20, ideclk_period) - 1; |
| 102 | trp = DIV_ROUND_UP(palm_bk3710_udmatimings[mode].rptime, | 100 | trp = DIV_ROUND_UP(palm_bk3710_udmatimings[mode].rptime, |
| 103 | ide_palm_clk) - 1; | 101 | ideclk_period) - 1; |
| 104 | 102 | ||
| 105 | /* udmatim Register */ | 103 | /* udmatim Register */ |
| 106 | val16 = readw(base + BK3710_UDMATIM) & (dev ? 0xFF0F : 0xFFF0); | 104 | val16 = readw(base + BK3710_UDMATIM) & (dev ? 0xFF0F : 0xFFF0); |
| @@ -141,8 +139,8 @@ static void palm_bk3710_setdmamode(void __iomem *base, unsigned int dev, | |||
| 141 | cycletime = max_t(int, t->cycle, min_cycle); | 139 | cycletime = max_t(int, t->cycle, min_cycle); |
| 142 | 140 | ||
| 143 | /* DMA Data Setup */ | 141 | /* DMA Data Setup */ |
| 144 | t0 = DIV_ROUND_UP(cycletime, ide_palm_clk); | 142 | t0 = DIV_ROUND_UP(cycletime, ideclk_period); |
| 145 | td = DIV_ROUND_UP(t->active, ide_palm_clk); | 143 | td = DIV_ROUND_UP(t->active, ideclk_period); |
| 146 | tkw = t0 - td - 1; | 144 | tkw = t0 - td - 1; |
| 147 | td -= 1; | 145 | td -= 1; |
| 148 | 146 | ||
| @@ -168,9 +166,9 @@ static void palm_bk3710_setpiomode(void __iomem *base, ide_drive_t *mate, | |||
| 168 | struct ide_timing *t; | 166 | struct ide_timing *t; |
| 169 | 167 | ||
| 170 | /* PIO Data Setup */ | 168 | /* PIO Data Setup */ |
| 171 | t0 = DIV_ROUND_UP(cycletime, ide_palm_clk); | 169 | t0 = DIV_ROUND_UP(cycletime, ideclk_period); |
| 172 | t2 = DIV_ROUND_UP(ide_timing_find_mode(XFER_PIO_0 + mode)->active, | 170 | t2 = DIV_ROUND_UP(ide_timing_find_mode(XFER_PIO_0 + mode)->active, |
| 173 | ide_palm_clk); | 171 | ideclk_period); |
| 174 | 172 | ||
| 175 | t2i = t0 - t2 - 1; | 173 | t2i = t0 - t2 - 1; |
| 176 | t2 -= 1; | 174 | t2 -= 1; |
| @@ -192,8 +190,8 @@ static void palm_bk3710_setpiomode(void __iomem *base, ide_drive_t *mate, | |||
| 192 | 190 | ||
| 193 | /* TASKFILE Setup */ | 191 | /* TASKFILE Setup */ |
| 194 | t = ide_timing_find_mode(XFER_PIO_0 + mode); | 192 | t = ide_timing_find_mode(XFER_PIO_0 + mode); |
| 195 | t0 = DIV_ROUND_UP(t->cyc8b, ide_palm_clk); | 193 | t0 = DIV_ROUND_UP(t->cyc8b, ideclk_period); |
| 196 | t2 = DIV_ROUND_UP(t->act8b, ide_palm_clk); | 194 | t2 = DIV_ROUND_UP(t->act8b, ideclk_period); |
| 197 | 195 | ||
| 198 | t2i = t0 - t2 - 1; | 196 | t2i = t0 - t2 - 1; |
| 199 | t2 -= 1; | 197 | t2 -= 1; |
| @@ -350,22 +348,22 @@ static const struct ide_port_info __devinitdata palm_bk3710_port_info = { | |||
| 350 | 348 | ||
| 351 | static int __devinit palm_bk3710_probe(struct platform_device *pdev) | 349 | static int __devinit palm_bk3710_probe(struct platform_device *pdev) |
| 352 | { | 350 | { |
| 353 | struct clk *clkp; | 351 | struct clk *clk; |
| 354 | struct resource *mem, *irq; | 352 | struct resource *mem, *irq; |
| 355 | ide_hwif_t *hwif; | 353 | ide_hwif_t *hwif; |
| 356 | unsigned long base; | 354 | unsigned long base, rate; |
| 357 | int i; | 355 | int i; |
| 358 | hw_regs_t hw; | 356 | hw_regs_t hw; |
| 359 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | 357 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; |
| 360 | 358 | ||
| 361 | clkp = clk_get(NULL, "IDECLK"); | 359 | clk = clk_get(NULL, "IDECLK"); |
| 362 | if (IS_ERR(clkp)) | 360 | if (IS_ERR(clk)) |
| 363 | return -ENODEV; | 361 | return -ENODEV; |
| 364 | 362 | ||
| 365 | ideclkp = clkp; | 363 | clk_enable(clk); |
| 366 | clk_enable(ideclkp); | 364 | rate = clk_get_rate(clk); |
| 367 | ide_palm_clk = clk_get_rate(ideclkp)/100000; | 365 | ideclk_period = 1000000000UL / rate; |
| 368 | ide_palm_clk = (10000/ide_palm_clk) + 1; | 366 | |
| 369 | /* Register the IDE interface with Linux ATA Interface */ | 367 | /* Register the IDE interface with Linux ATA Interface */ |
| 370 | memset(&hw, 0, sizeof(hw)); | 368 | memset(&hw, 0, sizeof(hw)); |
| 371 | 369 | ||
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 380fa0c8cc84..26e68b65b7cf 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
| @@ -646,8 +646,6 @@ static int ide_register_port(ide_hwif_t *hwif) | |||
| 646 | goto out; | 646 | goto out; |
| 647 | } | 647 | } |
| 648 | 648 | ||
| 649 | get_device(&hwif->gendev); | ||
| 650 | |||
| 651 | hwif->portdev = device_create_drvdata(ide_port_class, &hwif->gendev, | 649 | hwif->portdev = device_create_drvdata(ide_port_class, &hwif->gendev, |
| 652 | MKDEV(0, 0), hwif, hwif->name); | 650 | MKDEV(0, 0), hwif, hwif->name); |
| 653 | if (IS_ERR(hwif->portdev)) { | 651 | if (IS_ERR(hwif->portdev)) { |
| @@ -1220,16 +1218,12 @@ static void drive_release_dev (struct device *dev) | |||
| 1220 | complete(&drive->gendev_rel_comp); | 1218 | complete(&drive->gendev_rel_comp); |
| 1221 | } | 1219 | } |
| 1222 | 1220 | ||
| 1223 | #ifndef ide_default_irq | ||
| 1224 | #define ide_default_irq(irq) 0 | ||
| 1225 | #endif | ||
| 1226 | |||
| 1227 | static int hwif_init(ide_hwif_t *hwif) | 1221 | static int hwif_init(ide_hwif_t *hwif) |
| 1228 | { | 1222 | { |
| 1229 | int old_irq; | 1223 | int old_irq; |
| 1230 | 1224 | ||
| 1231 | if (!hwif->irq) { | 1225 | if (!hwif->irq) { |
| 1232 | hwif->irq = ide_default_irq(hwif->io_ports.data_addr); | 1226 | hwif->irq = __ide_default_irq(hwif->io_ports.data_addr); |
| 1233 | if (!hwif->irq) { | 1227 | if (!hwif->irq) { |
| 1234 | printk("%s: DISABLED, NO IRQ\n", hwif->name); | 1228 | printk("%s: DISABLED, NO IRQ\n", hwif->name); |
| 1235 | return 0; | 1229 | return 0; |
| @@ -1259,7 +1253,7 @@ static int hwif_init(ide_hwif_t *hwif) | |||
| 1259 | * It failed to initialise. Find the default IRQ for | 1253 | * It failed to initialise. Find the default IRQ for |
| 1260 | * this port and try that. | 1254 | * this port and try that. |
| 1261 | */ | 1255 | */ |
| 1262 | hwif->irq = ide_default_irq(hwif->io_ports.data_addr); | 1256 | hwif->irq = __ide_default_irq(hwif->io_ports.data_addr); |
| 1263 | if (!hwif->irq) { | 1257 | if (!hwif->irq) { |
| 1264 | printk("%s: Disabled unable to get IRQ %d.\n", | 1258 | printk("%s: Disabled unable to get IRQ %d.\n", |
| 1265 | hwif->name, old_irq); | 1259 | hwif->name, old_irq); |
diff --git a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c index 55ec7f798772..8af88bf0969b 100644 --- a/drivers/ide/ide-proc.c +++ b/drivers/ide/ide-proc.c | |||
| @@ -76,7 +76,7 @@ static int proc_ide_read_mate | |||
| 76 | ide_hwif_t *hwif = (ide_hwif_t *) data; | 76 | ide_hwif_t *hwif = (ide_hwif_t *) data; |
| 77 | int len; | 77 | int len; |
| 78 | 78 | ||
| 79 | if (hwif && hwif->mate && hwif->mate->present) | 79 | if (hwif && hwif->mate) |
| 80 | len = sprintf(page, "%s\n", hwif->mate->name); | 80 | len = sprintf(page, "%s\n", hwif->mate->name); |
| 81 | else | 81 | else |
| 82 | len = sprintf(page, "(none)\n"); | 82 | len = sprintf(page, "(none)\n"); |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index c758dcb13b14..300431d080a9 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
| @@ -315,13 +315,14 @@ void ide_unregister(ide_hwif_t *hwif) | |||
| 315 | 315 | ||
| 316 | BUG_ON(in_interrupt()); | 316 | BUG_ON(in_interrupt()); |
| 317 | BUG_ON(irqs_disabled()); | 317 | BUG_ON(irqs_disabled()); |
| 318 | |||
| 318 | mutex_lock(&ide_cfg_mtx); | 319 | mutex_lock(&ide_cfg_mtx); |
| 319 | spin_lock_irq(&ide_lock); | ||
| 320 | if (!hwif->present) | ||
| 321 | goto abort; | ||
| 322 | __ide_port_unregister_devices(hwif); | ||
| 323 | hwif->present = 0; | ||
| 324 | 320 | ||
| 321 | spin_lock_irq(&ide_lock); | ||
| 322 | if (hwif->present) { | ||
| 323 | __ide_port_unregister_devices(hwif); | ||
| 324 | hwif->present = 0; | ||
| 325 | } | ||
| 325 | spin_unlock_irq(&ide_lock); | 326 | spin_unlock_irq(&ide_lock); |
| 326 | 327 | ||
| 327 | ide_proc_unregister_port(hwif); | 328 | ide_proc_unregister_port(hwif); |
| @@ -351,16 +352,15 @@ void ide_unregister(ide_hwif_t *hwif) | |||
| 351 | blk_unregister_region(MKDEV(hwif->major, 0), MAX_DRIVES<<PARTN_BITS); | 352 | blk_unregister_region(MKDEV(hwif->major, 0), MAX_DRIVES<<PARTN_BITS); |
| 352 | kfree(hwif->sg_table); | 353 | kfree(hwif->sg_table); |
| 353 | unregister_blkdev(hwif->major, hwif->name); | 354 | unregister_blkdev(hwif->major, hwif->name); |
| 354 | spin_lock_irq(&ide_lock); | ||
| 355 | 355 | ||
| 356 | if (hwif->dma_base) | 356 | if (hwif->dma_base) |
| 357 | ide_release_dma_engine(hwif); | 357 | ide_release_dma_engine(hwif); |
| 358 | 358 | ||
| 359 | spin_lock_irq(&ide_lock); | ||
| 359 | /* restore hwif data to pristine status */ | 360 | /* restore hwif data to pristine status */ |
| 360 | ide_init_port_data(hwif, hwif->index); | 361 | ide_init_port_data(hwif, hwif->index); |
| 361 | |||
| 362 | abort: | ||
| 363 | spin_unlock_irq(&ide_lock); | 362 | spin_unlock_irq(&ide_lock); |
| 363 | |||
| 364 | mutex_unlock(&ide_cfg_mtx); | 364 | mutex_unlock(&ide_cfg_mtx); |
| 365 | } | 365 | } |
| 366 | 366 | ||
| @@ -1094,13 +1094,6 @@ struct bus_type ide_bus_type = { | |||
| 1094 | 1094 | ||
| 1095 | EXPORT_SYMBOL_GPL(ide_bus_type); | 1095 | EXPORT_SYMBOL_GPL(ide_bus_type); |
| 1096 | 1096 | ||
| 1097 | static void ide_port_class_release(struct device *portdev) | ||
| 1098 | { | ||
| 1099 | ide_hwif_t *hwif = dev_get_drvdata(portdev); | ||
| 1100 | |||
| 1101 | put_device(&hwif->gendev); | ||
| 1102 | } | ||
| 1103 | |||
| 1104 | int ide_vlb_clk; | 1097 | int ide_vlb_clk; |
| 1105 | EXPORT_SYMBOL_GPL(ide_vlb_clk); | 1098 | EXPORT_SYMBOL_GPL(ide_vlb_clk); |
| 1106 | 1099 | ||
| @@ -1305,7 +1298,6 @@ static int __init ide_init(void) | |||
| 1305 | ret = PTR_ERR(ide_port_class); | 1298 | ret = PTR_ERR(ide_port_class); |
| 1306 | goto out_port_class; | 1299 | goto out_port_class; |
| 1307 | } | 1300 | } |
| 1308 | ide_port_class->dev_release = ide_port_class_release; | ||
| 1309 | 1301 | ||
| 1310 | init_ide_data(); | 1302 | init_ide_data(); |
| 1311 | 1303 | ||
diff --git a/drivers/ide/pci/it8213.c b/drivers/ide/pci/it8213.c index 9053c8771e6e..2b71bdf74e73 100644 --- a/drivers/ide/pci/it8213.c +++ b/drivers/ide/pci/it8213.c | |||
| @@ -184,8 +184,7 @@ static const struct ide_port_info it8213_chipsets[] __devinitdata = { | |||
| 184 | 184 | ||
| 185 | static int __devinit it8213_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 185 | static int __devinit it8213_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
| 186 | { | 186 | { |
| 187 | ide_setup_pci_device(dev, &it8213_chipsets[id->driver_data]); | 187 | return ide_setup_pci_device(dev, &it8213_chipsets[id->driver_data]); |
| 188 | return 0; | ||
| 189 | } | 188 | } |
| 190 | 189 | ||
| 191 | static const struct pci_device_id it8213_pci_tbl[] = { | 190 | static const struct pci_device_id it8213_pci_tbl[] = { |
diff --git a/drivers/ide/pci/ns87415.c b/drivers/ide/pci/ns87415.c index fec4955f449b..a7a41bb82778 100644 --- a/drivers/ide/pci/ns87415.c +++ b/drivers/ide/pci/ns87415.c | |||
| @@ -225,10 +225,6 @@ static int ns87415_dma_setup(ide_drive_t *drive) | |||
| 225 | return 1; | 225 | return 1; |
| 226 | } | 226 | } |
| 227 | 227 | ||
| 228 | #ifndef ide_default_irq | ||
| 229 | #define ide_default_irq(irq) 0 | ||
| 230 | #endif | ||
| 231 | |||
| 232 | static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif) | 228 | static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif) |
| 233 | { | 229 | { |
| 234 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 230 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
| @@ -288,7 +284,7 @@ static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif) | |||
| 288 | } | 284 | } |
| 289 | 285 | ||
| 290 | if (!using_inta) | 286 | if (!using_inta) |
| 291 | hwif->irq = ide_default_irq(hwif->io_ports.data_addr); | 287 | hwif->irq = __ide_default_irq(hwif->io_ports.data_addr); |
| 292 | else if (!hwif->irq && hwif->mate && hwif->mate->irq) | 288 | else if (!hwif->irq && hwif->mate && hwif->mate->irq) |
| 293 | hwif->irq = hwif->mate->irq; /* share IRQ with mate */ | 289 | hwif->irq = hwif->mate->irq; /* share IRQ with mate */ |
| 294 | 290 | ||
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c index 8934178a23ee..95f82cfb6c54 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_provider.c +++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c | |||
| @@ -1096,7 +1096,9 @@ static ssize_t show_fw_ver(struct device *dev, struct device_attribute *attr, ch | |||
| 1096 | struct net_device *lldev = iwch_dev->rdev.t3cdev_p->lldev; | 1096 | struct net_device *lldev = iwch_dev->rdev.t3cdev_p->lldev; |
| 1097 | 1097 | ||
| 1098 | PDBG("%s dev 0x%p\n", __func__, dev); | 1098 | PDBG("%s dev 0x%p\n", __func__, dev); |
| 1099 | rtnl_lock(); | ||
| 1099 | lldev->ethtool_ops->get_drvinfo(lldev, &info); | 1100 | lldev->ethtool_ops->get_drvinfo(lldev, &info); |
| 1101 | rtnl_unlock(); | ||
| 1100 | return sprintf(buf, "%s\n", info.fw_version); | 1102 | return sprintf(buf, "%s\n", info.fw_version); |
| 1101 | } | 1103 | } |
| 1102 | 1104 | ||
| @@ -1109,7 +1111,9 @@ static ssize_t show_hca(struct device *dev, struct device_attribute *attr, | |||
| 1109 | struct net_device *lldev = iwch_dev->rdev.t3cdev_p->lldev; | 1111 | struct net_device *lldev = iwch_dev->rdev.t3cdev_p->lldev; |
| 1110 | 1112 | ||
| 1111 | PDBG("%s dev 0x%p\n", __func__, dev); | 1113 | PDBG("%s dev 0x%p\n", __func__, dev); |
| 1114 | rtnl_lock(); | ||
| 1112 | lldev->ethtool_ops->get_drvinfo(lldev, &info); | 1115 | lldev->ethtool_ops->get_drvinfo(lldev, &info); |
| 1116 | rtnl_unlock(); | ||
| 1113 | return sprintf(buf, "%s\n", info.driver); | 1117 | return sprintf(buf, "%s\n", info.driver); |
| 1114 | } | 1118 | } |
| 1115 | 1119 | ||
diff --git a/drivers/input/ff-core.c b/drivers/input/ff-core.c index eebc72465fc9..72c63e5dd630 100644 --- a/drivers/input/ff-core.c +++ b/drivers/input/ff-core.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/input.h> | 28 | #include <linux/input.h> |
| 29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
| 30 | #include <linux/mutex.h> | 30 | #include <linux/mutex.h> |
| 31 | #include <linux/sched.h> | ||
| 31 | 32 | ||
| 32 | /* | 33 | /* |
| 33 | * Check that the effect_id is a valid effect and whether the user | 34 | * Check that the effect_id is a valid effect and whether the user |
| @@ -166,8 +167,10 @@ int input_ff_upload(struct input_dev *dev, struct ff_effect *effect, | |||
| 166 | if (ret) | 167 | if (ret) |
| 167 | goto out; | 168 | goto out; |
| 168 | 169 | ||
| 170 | spin_lock_irq(&dev->event_lock); | ||
| 169 | ff->effects[id] = *effect; | 171 | ff->effects[id] = *effect; |
| 170 | ff->effect_owners[id] = file; | 172 | ff->effect_owners[id] = file; |
| 173 | spin_unlock_irq(&dev->event_lock); | ||
| 171 | 174 | ||
| 172 | out: | 175 | out: |
| 173 | mutex_unlock(&ff->mutex); | 176 | mutex_unlock(&ff->mutex); |
| @@ -189,16 +192,22 @@ static int erase_effect(struct input_dev *dev, int effect_id, | |||
| 189 | if (error) | 192 | if (error) |
| 190 | return error; | 193 | return error; |
| 191 | 194 | ||
| 195 | spin_lock_irq(&dev->event_lock); | ||
| 192 | ff->playback(dev, effect_id, 0); | 196 | ff->playback(dev, effect_id, 0); |
| 197 | ff->effect_owners[effect_id] = NULL; | ||
| 198 | spin_unlock_irq(&dev->event_lock); | ||
| 193 | 199 | ||
| 194 | if (ff->erase) { | 200 | if (ff->erase) { |
| 195 | error = ff->erase(dev, effect_id); | 201 | error = ff->erase(dev, effect_id); |
| 196 | if (error) | 202 | if (error) { |
| 203 | spin_lock_irq(&dev->event_lock); | ||
| 204 | ff->effect_owners[effect_id] = file; | ||
| 205 | spin_unlock_irq(&dev->event_lock); | ||
| 206 | |||
| 197 | return error; | 207 | return error; |
| 208 | } | ||
| 198 | } | 209 | } |
| 199 | 210 | ||
| 200 | ff->effect_owners[effect_id] = NULL; | ||
| 201 | |||
| 202 | return 0; | 211 | return 0; |
| 203 | } | 212 | } |
| 204 | 213 | ||
| @@ -263,8 +272,6 @@ int input_ff_event(struct input_dev *dev, unsigned int type, | |||
| 263 | if (type != EV_FF) | 272 | if (type != EV_FF) |
| 264 | return 0; | 273 | return 0; |
| 265 | 274 | ||
| 266 | mutex_lock(&ff->mutex); | ||
| 267 | |||
| 268 | switch (code) { | 275 | switch (code) { |
| 269 | case FF_GAIN: | 276 | case FF_GAIN: |
| 270 | if (!test_bit(FF_GAIN, dev->ffbit) || value > 0xffff) | 277 | if (!test_bit(FF_GAIN, dev->ffbit) || value > 0xffff) |
| @@ -286,7 +293,6 @@ int input_ff_event(struct input_dev *dev, unsigned int type, | |||
| 286 | break; | 293 | break; |
| 287 | } | 294 | } |
| 288 | 295 | ||
| 289 | mutex_unlock(&ff->mutex); | ||
| 290 | return 0; | 296 | return 0; |
| 291 | } | 297 | } |
| 292 | EXPORT_SYMBOL_GPL(input_ff_event); | 298 | EXPORT_SYMBOL_GPL(input_ff_event); |
diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 0f3c66de69bc..8d8c6b736167 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c | |||
| @@ -1977,8 +1977,10 @@ isdn_writebuf_stub(int drvidx, int chan, const u_char __user * buf, int len) | |||
| 1977 | if (!skb) | 1977 | if (!skb) |
| 1978 | return -ENOMEM; | 1978 | return -ENOMEM; |
| 1979 | skb_reserve(skb, hl); | 1979 | skb_reserve(skb, hl); |
| 1980 | if (copy_from_user(skb_put(skb, len), buf, len)) | 1980 | if (copy_from_user(skb_put(skb, len), buf, len)) { |
| 1981 | dev_kfree_skb(skb); | ||
| 1981 | return -EFAULT; | 1982 | return -EFAULT; |
| 1983 | } | ||
| 1982 | ret = dev->drv[drvidx]->interface->writebuf_skb(drvidx, chan, 1, skb); | 1984 | ret = dev->drv[drvidx]->interface->writebuf_skb(drvidx, chan, 1, skb); |
| 1983 | if (ret <= 0) | 1985 | if (ret <= 0) |
| 1984 | dev_kfree_skb(skb); | 1986 | dev_kfree_skb(skb); |
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 835def11419d..ab6a61db63ce 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c | |||
| @@ -432,6 +432,7 @@ static int crypt_convert(struct crypt_config *cc, | |||
| 432 | case 0: | 432 | case 0: |
| 433 | atomic_dec(&ctx->pending); | 433 | atomic_dec(&ctx->pending); |
| 434 | ctx->sector++; | 434 | ctx->sector++; |
| 435 | cond_resched(); | ||
| 435 | continue; | 436 | continue; |
| 436 | 437 | ||
| 437 | /* error */ | 438 | /* error */ |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 7cf512a34ccf..2580ac1b9b0f 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -3897,8 +3897,10 @@ static void autorun_devices(int part) | |||
| 3897 | 3897 | ||
| 3898 | md_probe(dev, NULL, NULL); | 3898 | md_probe(dev, NULL, NULL); |
| 3899 | mddev = mddev_find(dev); | 3899 | mddev = mddev_find(dev); |
| 3900 | if (!mddev) { | 3900 | if (!mddev || !mddev->gendisk) { |
| 3901 | printk(KERN_ERR | 3901 | if (mddev) |
| 3902 | mddev_put(mddev); | ||
| 3903 | printk(KERN_ERR | ||
| 3902 | "md: cannot allocate memory for md drive.\n"); | 3904 | "md: cannot allocate memory for md drive.\n"); |
| 3903 | break; | 3905 | break; |
| 3904 | } | 3906 | } |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 1de17da34a95..a71277b640ab 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
| @@ -2137,6 +2137,8 @@ static int run(mddev_t *mddev) | |||
| 2137 | !test_bit(In_sync, &disk->rdev->flags)) { | 2137 | !test_bit(In_sync, &disk->rdev->flags)) { |
| 2138 | disk->head_position = 0; | 2138 | disk->head_position = 0; |
| 2139 | mddev->degraded++; | 2139 | mddev->degraded++; |
| 2140 | if (disk->rdev) | ||
| 2141 | conf->fullsync = 1; | ||
| 2140 | } | 2142 | } |
| 2141 | } | 2143 | } |
| 2142 | 2144 | ||
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index c37e256b1176..3b27df52456b 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -2017,12 +2017,7 @@ static int __handle_issuing_new_read_requests5(struct stripe_head *sh, | |||
| 2017 | */ | 2017 | */ |
| 2018 | s->uptodate++; | 2018 | s->uptodate++; |
| 2019 | return 0; /* uptodate + compute == disks */ | 2019 | return 0; /* uptodate + compute == disks */ |
| 2020 | } else if ((s->uptodate < disks - 1) && | 2020 | } else if (test_bit(R5_Insync, &dev->flags)) { |
| 2021 | test_bit(R5_Insync, &dev->flags)) { | ||
| 2022 | /* Note: we hold off compute operations while checks are | ||
| 2023 | * in flight, but we still prefer 'compute' over 'read' | ||
| 2024 | * hence we only read if (uptodate < * disks-1) | ||
| 2025 | */ | ||
| 2026 | set_bit(R5_LOCKED, &dev->flags); | 2021 | set_bit(R5_LOCKED, &dev->flags); |
| 2027 | set_bit(R5_Wantread, &dev->flags); | 2022 | set_bit(R5_Wantread, &dev->flags); |
| 2028 | if (!test_and_set_bit(STRIPE_OP_IO, &sh->ops.pending)) | 2023 | if (!test_and_set_bit(STRIPE_OP_IO, &sh->ops.pending)) |
| @@ -2898,6 +2893,8 @@ static void handle_stripe5(struct stripe_head *sh) | |||
| 2898 | 2893 | ||
| 2899 | for (i = conf->raid_disks; i--; ) { | 2894 | for (i = conf->raid_disks; i--; ) { |
| 2900 | set_bit(R5_Wantwrite, &sh->dev[i].flags); | 2895 | set_bit(R5_Wantwrite, &sh->dev[i].flags); |
| 2896 | set_bit(R5_LOCKED, &dev->flags); | ||
| 2897 | s.locked++; | ||
| 2901 | if (!test_and_set_bit(STRIPE_OP_IO, &sh->ops.pending)) | 2898 | if (!test_and_set_bit(STRIPE_OP_IO, &sh->ops.pending)) |
| 2902 | sh->ops.count++; | 2899 | sh->ops.count++; |
| 2903 | } | 2900 | } |
| @@ -2911,6 +2908,7 @@ static void handle_stripe5(struct stripe_head *sh) | |||
| 2911 | conf->raid_disks); | 2908 | conf->raid_disks); |
| 2912 | s.locked += handle_write_operations5(sh, 1, 1); | 2909 | s.locked += handle_write_operations5(sh, 1, 1); |
| 2913 | } else if (s.expanded && | 2910 | } else if (s.expanded && |
| 2911 | s.locked == 0 && | ||
| 2914 | !test_bit(STRIPE_OP_POSTXOR, &sh->ops.pending)) { | 2912 | !test_bit(STRIPE_OP_POSTXOR, &sh->ops.pending)) { |
| 2915 | clear_bit(STRIPE_EXPAND_READY, &sh->state); | 2913 | clear_bit(STRIPE_EXPAND_READY, &sh->state); |
| 2916 | atomic_dec(&conf->reshape_stripes); | 2914 | atomic_dec(&conf->reshape_stripes); |
| @@ -4305,7 +4303,9 @@ static int run(mddev_t *mddev) | |||
| 4305 | " disk %d\n", bdevname(rdev->bdev,b), | 4303 | " disk %d\n", bdevname(rdev->bdev,b), |
| 4306 | raid_disk); | 4304 | raid_disk); |
| 4307 | working_disks++; | 4305 | working_disks++; |
| 4308 | } | 4306 | } else |
| 4307 | /* Cannot rely on bitmap to complete recovery */ | ||
| 4308 | conf->fullsync = 1; | ||
| 4309 | } | 4309 | } |
| 4310 | 4310 | ||
| 4311 | /* | 4311 | /* |
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index 3b26fbd3e558..5ccb0aeca8cc 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig | |||
| @@ -793,6 +793,14 @@ menuconfig V4L_USB_DRIVERS | |||
| 793 | 793 | ||
| 794 | if V4L_USB_DRIVERS && USB | 794 | if V4L_USB_DRIVERS && USB |
| 795 | 795 | ||
| 796 | config USB_VIDEO_CLASS | ||
| 797 | tristate "USB Video Class (UVC)" | ||
| 798 | ---help--- | ||
| 799 | Support for the USB Video Class (UVC). Currently only video | ||
| 800 | input devices, such as webcams, are supported. | ||
| 801 | |||
| 802 | For more information see: <http://linux-uvc.berlios.de/> | ||
| 803 | |||
| 796 | source "drivers/media/video/pvrusb2/Kconfig" | 804 | source "drivers/media/video/pvrusb2/Kconfig" |
| 797 | 805 | ||
| 798 | source "drivers/media/video/em28xx/Kconfig" | 806 | source "drivers/media/video/em28xx/Kconfig" |
diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile index dff0d6abe917..ecbbfaab24d5 100644 --- a/drivers/media/video/Makefile +++ b/drivers/media/video/Makefile | |||
| @@ -136,6 +136,8 @@ obj-$(CONFIG_SOC_CAMERA_MT9V022) += mt9v022.o | |||
| 136 | 136 | ||
| 137 | obj-$(CONFIG_VIDEO_AU0828) += au0828/ | 137 | obj-$(CONFIG_VIDEO_AU0828) += au0828/ |
| 138 | 138 | ||
| 139 | obj-$(CONFIG_USB_VIDEO_CLASS) += uvc/ | ||
| 140 | |||
| 139 | EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core | 141 | EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core |
| 140 | EXTRA_CFLAGS += -Idrivers/media/dvb/frontends | 142 | EXTRA_CFLAGS += -Idrivers/media/dvb/frontends |
| 141 | EXTRA_CFLAGS += -Idrivers/media/common/tuners | 143 | EXTRA_CFLAGS += -Idrivers/media/common/tuners |
diff --git a/drivers/media/video/ov7670.c b/drivers/media/video/ov7670.c index 2bc6bdc9c1f2..d7bfd30f74a9 100644 --- a/drivers/media/video/ov7670.c +++ b/drivers/media/video/ov7670.c | |||
| @@ -406,8 +406,10 @@ static int ov7670_read(struct i2c_client *c, unsigned char reg, | |||
| 406 | int ret; | 406 | int ret; |
| 407 | 407 | ||
| 408 | ret = i2c_smbus_read_byte_data(c, reg); | 408 | ret = i2c_smbus_read_byte_data(c, reg); |
| 409 | if (ret >= 0) | 409 | if (ret >= 0) { |
| 410 | *value = (unsigned char) ret; | 410 | *value = (unsigned char) ret; |
| 411 | ret = 0; | ||
| 412 | } | ||
| 411 | return ret; | 413 | return ret; |
| 412 | } | 414 | } |
| 413 | 415 | ||
diff --git a/drivers/media/video/uvc/Makefile b/drivers/media/video/uvc/Makefile new file mode 100644 index 000000000000..968c1994eda0 --- /dev/null +++ b/drivers/media/video/uvc/Makefile | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | uvcvideo-objs := uvc_driver.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_ctrl.o \ | ||
| 2 | uvc_status.o uvc_isight.o | ||
| 3 | obj-$(CONFIG_USB_VIDEO_CLASS) += uvcvideo.o | ||
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c new file mode 100644 index 000000000000..f0ee46d15540 --- /dev/null +++ b/drivers/media/video/uvc/uvc_ctrl.c | |||
| @@ -0,0 +1,1256 @@ | |||
| 1 | /* | ||
| 2 | * uvc_ctrl.c -- USB Video Class driver - Controls | ||
| 3 | * | ||
| 4 | * Copyright (C) 2005-2008 | ||
| 5 | * Laurent Pinchart (laurent.pinchart@skynet.be) | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <linux/kernel.h> | ||
| 15 | #include <linux/version.h> | ||
| 16 | #include <linux/list.h> | ||
| 17 | #include <linux/module.h> | ||
| 18 | #include <linux/uaccess.h> | ||
| 19 | #include <linux/usb.h> | ||
| 20 | #include <linux/videodev2.h> | ||
| 21 | #include <linux/vmalloc.h> | ||
| 22 | #include <linux/wait.h> | ||
| 23 | #include <asm/atomic.h> | ||
| 24 | |||
| 25 | #include "uvcvideo.h" | ||
| 26 | |||
| 27 | #define UVC_CTRL_NDATA 2 | ||
| 28 | #define UVC_CTRL_DATA_CURRENT 0 | ||
| 29 | #define UVC_CTRL_DATA_BACKUP 1 | ||
| 30 | |||
| 31 | /* ------------------------------------------------------------------------ | ||
| 32 | * Control, formats, ... | ||
| 33 | */ | ||
| 34 | |||
| 35 | static struct uvc_control_info uvc_ctrls[] = { | ||
| 36 | { | ||
| 37 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 38 | .selector = PU_BRIGHTNESS_CONTROL, | ||
| 39 | .index = 0, | ||
| 40 | .size = 2, | ||
| 41 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE | ||
| 42 | | UVC_CONTROL_RESTORE, | ||
| 43 | }, | ||
| 44 | { | ||
| 45 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 46 | .selector = PU_CONTRAST_CONTROL, | ||
| 47 | .index = 1, | ||
| 48 | .size = 2, | ||
| 49 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE | ||
| 50 | | UVC_CONTROL_RESTORE, | ||
| 51 | }, | ||
| 52 | { | ||
| 53 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 54 | .selector = PU_HUE_CONTROL, | ||
| 55 | .index = 2, | ||
| 56 | .size = 2, | ||
| 57 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE | ||
| 58 | | UVC_CONTROL_RESTORE | UVC_CONTROL_AUTO_UPDATE, | ||
| 59 | }, | ||
| 60 | { | ||
| 61 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 62 | .selector = PU_SATURATION_CONTROL, | ||
| 63 | .index = 3, | ||
| 64 | .size = 2, | ||
| 65 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE | ||
| 66 | | UVC_CONTROL_RESTORE, | ||
| 67 | }, | ||
| 68 | { | ||
| 69 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 70 | .selector = PU_SHARPNESS_CONTROL, | ||
| 71 | .index = 4, | ||
| 72 | .size = 2, | ||
| 73 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE | ||
| 74 | | UVC_CONTROL_RESTORE, | ||
| 75 | }, | ||
| 76 | { | ||
| 77 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 78 | .selector = PU_GAMMA_CONTROL, | ||
| 79 | .index = 5, | ||
| 80 | .size = 2, | ||
| 81 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE | ||
| 82 | | UVC_CONTROL_RESTORE, | ||
| 83 | }, | ||
| 84 | { | ||
| 85 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 86 | .selector = PU_BACKLIGHT_COMPENSATION_CONTROL, | ||
| 87 | .index = 8, | ||
| 88 | .size = 2, | ||
| 89 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE | ||
| 90 | | UVC_CONTROL_RESTORE, | ||
| 91 | }, | ||
| 92 | { | ||
| 93 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 94 | .selector = PU_GAIN_CONTROL, | ||
| 95 | .index = 9, | ||
| 96 | .size = 2, | ||
| 97 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE | ||
| 98 | | UVC_CONTROL_RESTORE, | ||
| 99 | }, | ||
| 100 | { | ||
| 101 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 102 | .selector = PU_POWER_LINE_FREQUENCY_CONTROL, | ||
| 103 | .index = 10, | ||
| 104 | .size = 1, | ||
| 105 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE | ||
| 106 | | UVC_CONTROL_RESTORE, | ||
| 107 | }, | ||
| 108 | { | ||
| 109 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 110 | .selector = PU_HUE_AUTO_CONTROL, | ||
| 111 | .index = 11, | ||
| 112 | .size = 1, | ||
| 113 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR | ||
| 114 | | UVC_CONTROL_GET_DEF | UVC_CONTROL_RESTORE, | ||
| 115 | }, | ||
| 116 | { | ||
| 117 | .entity = UVC_GUID_UVC_CAMERA, | ||
| 118 | .selector = CT_AE_MODE_CONTROL, | ||
| 119 | .index = 1, | ||
| 120 | .size = 1, | ||
| 121 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR | ||
| 122 | | UVC_CONTROL_GET_DEF | UVC_CONTROL_GET_RES | ||
| 123 | | UVC_CONTROL_RESTORE, | ||
| 124 | }, | ||
| 125 | { | ||
| 126 | .entity = UVC_GUID_UVC_CAMERA, | ||
| 127 | .selector = CT_AE_PRIORITY_CONTROL, | ||
| 128 | .index = 2, | ||
| 129 | .size = 1, | ||
| 130 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR | ||
| 131 | | UVC_CONTROL_RESTORE, | ||
| 132 | }, | ||
| 133 | { | ||
| 134 | .entity = UVC_GUID_UVC_CAMERA, | ||
| 135 | .selector = CT_EXPOSURE_TIME_ABSOLUTE_CONTROL, | ||
| 136 | .index = 3, | ||
| 137 | .size = 4, | ||
| 138 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE | ||
| 139 | | UVC_CONTROL_RESTORE, | ||
| 140 | }, | ||
| 141 | { | ||
| 142 | .entity = UVC_GUID_UVC_CAMERA, | ||
| 143 | .selector = CT_FOCUS_ABSOLUTE_CONTROL, | ||
| 144 | .index = 5, | ||
| 145 | .size = 2, | ||
| 146 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE | ||
| 147 | | UVC_CONTROL_RESTORE | UVC_CONTROL_AUTO_UPDATE, | ||
| 148 | }, | ||
| 149 | { | ||
| 150 | .entity = UVC_GUID_UVC_CAMERA, | ||
| 151 | .selector = CT_FOCUS_AUTO_CONTROL, | ||
| 152 | .index = 17, | ||
| 153 | .size = 1, | ||
| 154 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR | ||
| 155 | | UVC_CONTROL_GET_DEF | UVC_CONTROL_RESTORE, | ||
| 156 | }, | ||
| 157 | { | ||
| 158 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 159 | .selector = PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL, | ||
| 160 | .index = 12, | ||
| 161 | .size = 1, | ||
| 162 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR | ||
| 163 | | UVC_CONTROL_GET_DEF | UVC_CONTROL_RESTORE, | ||
| 164 | }, | ||
| 165 | { | ||
| 166 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 167 | .selector = PU_WHITE_BALANCE_TEMPERATURE_CONTROL, | ||
| 168 | .index = 6, | ||
| 169 | .size = 2, | ||
| 170 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE | ||
| 171 | | UVC_CONTROL_RESTORE | UVC_CONTROL_AUTO_UPDATE, | ||
| 172 | }, | ||
| 173 | { | ||
| 174 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 175 | .selector = PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL, | ||
| 176 | .index = 13, | ||
| 177 | .size = 1, | ||
| 178 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_CUR | ||
| 179 | | UVC_CONTROL_GET_DEF | UVC_CONTROL_RESTORE, | ||
| 180 | }, | ||
| 181 | { | ||
| 182 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 183 | .selector = PU_WHITE_BALANCE_COMPONENT_CONTROL, | ||
| 184 | .index = 7, | ||
| 185 | .size = 4, | ||
| 186 | .flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE | ||
| 187 | | UVC_CONTROL_RESTORE | UVC_CONTROL_AUTO_UPDATE, | ||
| 188 | }, | ||
| 189 | }; | ||
| 190 | |||
| 191 | static struct uvc_menu_info power_line_frequency_controls[] = { | ||
| 192 | { 0, "Disabled" }, | ||
| 193 | { 1, "50 Hz" }, | ||
| 194 | { 2, "60 Hz" }, | ||
| 195 | }; | ||
| 196 | |||
| 197 | static struct uvc_menu_info exposure_auto_controls[] = { | ||
| 198 | { 1, "Manual Mode" }, | ||
| 199 | { 2, "Auto Mode" }, | ||
| 200 | { 4, "Shutter Priority Mode" }, | ||
| 201 | { 8, "Aperture Priority Mode" }, | ||
| 202 | }; | ||
| 203 | |||
| 204 | static struct uvc_control_mapping uvc_ctrl_mappings[] = { | ||
| 205 | { | ||
| 206 | .id = V4L2_CID_BRIGHTNESS, | ||
| 207 | .name = "Brightness", | ||
| 208 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 209 | .selector = PU_BRIGHTNESS_CONTROL, | ||
| 210 | .size = 16, | ||
| 211 | .offset = 0, | ||
| 212 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
| 213 | .data_type = UVC_CTRL_DATA_TYPE_SIGNED, | ||
| 214 | }, | ||
| 215 | { | ||
| 216 | .id = V4L2_CID_CONTRAST, | ||
| 217 | .name = "Contrast", | ||
| 218 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 219 | .selector = PU_CONTRAST_CONTROL, | ||
| 220 | .size = 16, | ||
| 221 | .offset = 0, | ||
| 222 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
| 223 | .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, | ||
| 224 | }, | ||
| 225 | { | ||
| 226 | .id = V4L2_CID_HUE, | ||
| 227 | .name = "Hue", | ||
| 228 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 229 | .selector = PU_HUE_CONTROL, | ||
| 230 | .size = 16, | ||
| 231 | .offset = 0, | ||
| 232 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
| 233 | .data_type = UVC_CTRL_DATA_TYPE_SIGNED, | ||
| 234 | }, | ||
| 235 | { | ||
| 236 | .id = V4L2_CID_SATURATION, | ||
| 237 | .name = "Saturation", | ||
| 238 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 239 | .selector = PU_SATURATION_CONTROL, | ||
| 240 | .size = 16, | ||
| 241 | .offset = 0, | ||
| 242 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
| 243 | .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, | ||
| 244 | }, | ||
| 245 | { | ||
| 246 | .id = V4L2_CID_SHARPNESS, | ||
| 247 | .name = "Sharpness", | ||
| 248 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 249 | .selector = PU_SHARPNESS_CONTROL, | ||
| 250 | .size = 16, | ||
| 251 | .offset = 0, | ||
| 252 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
| 253 | .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, | ||
| 254 | }, | ||
| 255 | { | ||
| 256 | .id = V4L2_CID_GAMMA, | ||
| 257 | .name = "Gamma", | ||
| 258 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 259 | .selector = PU_GAMMA_CONTROL, | ||
| 260 | .size = 16, | ||
| 261 | .offset = 0, | ||
| 262 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
| 263 | .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, | ||
| 264 | }, | ||
| 265 | { | ||
| 266 | .id = V4L2_CID_BACKLIGHT_COMPENSATION, | ||
| 267 | .name = "Backlight Compensation", | ||
| 268 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 269 | .selector = PU_BACKLIGHT_COMPENSATION_CONTROL, | ||
| 270 | .size = 16, | ||
| 271 | .offset = 0, | ||
| 272 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
| 273 | .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, | ||
| 274 | }, | ||
| 275 | { | ||
| 276 | .id = V4L2_CID_GAIN, | ||
| 277 | .name = "Gain", | ||
| 278 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 279 | .selector = PU_GAIN_CONTROL, | ||
| 280 | .size = 16, | ||
| 281 | .offset = 0, | ||
| 282 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
| 283 | .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, | ||
| 284 | }, | ||
| 285 | { | ||
| 286 | .id = V4L2_CID_POWER_LINE_FREQUENCY, | ||
| 287 | .name = "Power Line Frequency", | ||
| 288 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 289 | .selector = PU_POWER_LINE_FREQUENCY_CONTROL, | ||
| 290 | .size = 2, | ||
| 291 | .offset = 0, | ||
| 292 | .v4l2_type = V4L2_CTRL_TYPE_MENU, | ||
| 293 | .data_type = UVC_CTRL_DATA_TYPE_ENUM, | ||
| 294 | .menu_info = power_line_frequency_controls, | ||
| 295 | .menu_count = ARRAY_SIZE(power_line_frequency_controls), | ||
| 296 | }, | ||
| 297 | { | ||
| 298 | .id = V4L2_CID_HUE_AUTO, | ||
| 299 | .name = "Hue, Auto", | ||
| 300 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 301 | .selector = PU_HUE_AUTO_CONTROL, | ||
| 302 | .size = 1, | ||
| 303 | .offset = 0, | ||
| 304 | .v4l2_type = V4L2_CTRL_TYPE_BOOLEAN, | ||
| 305 | .data_type = UVC_CTRL_DATA_TYPE_BOOLEAN, | ||
| 306 | }, | ||
| 307 | { | ||
| 308 | .id = V4L2_CID_EXPOSURE_AUTO, | ||
| 309 | .name = "Exposure, Auto", | ||
| 310 | .entity = UVC_GUID_UVC_CAMERA, | ||
| 311 | .selector = CT_AE_MODE_CONTROL, | ||
| 312 | .size = 4, | ||
| 313 | .offset = 0, | ||
| 314 | .v4l2_type = V4L2_CTRL_TYPE_MENU, | ||
| 315 | .data_type = UVC_CTRL_DATA_TYPE_BITMASK, | ||
| 316 | .menu_info = exposure_auto_controls, | ||
| 317 | .menu_count = ARRAY_SIZE(exposure_auto_controls), | ||
| 318 | }, | ||
| 319 | { | ||
| 320 | .id = V4L2_CID_EXPOSURE_AUTO_PRIORITY, | ||
| 321 | .name = "Exposure, Auto Priority", | ||
| 322 | .entity = UVC_GUID_UVC_CAMERA, | ||
| 323 | .selector = CT_AE_PRIORITY_CONTROL, | ||
| 324 | .size = 1, | ||
| 325 | .offset = 0, | ||
| 326 | .v4l2_type = V4L2_CTRL_TYPE_BOOLEAN, | ||
| 327 | .data_type = UVC_CTRL_DATA_TYPE_BOOLEAN, | ||
| 328 | }, | ||
| 329 | { | ||
| 330 | .id = V4L2_CID_EXPOSURE_ABSOLUTE, | ||
| 331 | .name = "Exposure (Absolute)", | ||
| 332 | .entity = UVC_GUID_UVC_CAMERA, | ||
| 333 | .selector = CT_EXPOSURE_TIME_ABSOLUTE_CONTROL, | ||
| 334 | .size = 32, | ||
| 335 | .offset = 0, | ||
| 336 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
| 337 | .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, | ||
| 338 | }, | ||
| 339 | { | ||
| 340 | .id = V4L2_CID_AUTO_WHITE_BALANCE, | ||
| 341 | .name = "White Balance Temperature, Auto", | ||
| 342 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 343 | .selector = PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL, | ||
| 344 | .size = 1, | ||
| 345 | .offset = 0, | ||
| 346 | .v4l2_type = V4L2_CTRL_TYPE_BOOLEAN, | ||
| 347 | .data_type = UVC_CTRL_DATA_TYPE_BOOLEAN, | ||
| 348 | }, | ||
| 349 | { | ||
| 350 | .id = V4L2_CID_WHITE_BALANCE_TEMPERATURE, | ||
| 351 | .name = "White Balance Temperature", | ||
| 352 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 353 | .selector = PU_WHITE_BALANCE_TEMPERATURE_CONTROL, | ||
| 354 | .size = 16, | ||
| 355 | .offset = 0, | ||
| 356 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
| 357 | .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, | ||
| 358 | }, | ||
| 359 | { | ||
| 360 | .id = V4L2_CID_AUTO_WHITE_BALANCE, | ||
| 361 | .name = "White Balance Component, Auto", | ||
| 362 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 363 | .selector = PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL, | ||
| 364 | .size = 1, | ||
| 365 | .offset = 0, | ||
| 366 | .v4l2_type = V4L2_CTRL_TYPE_BOOLEAN, | ||
| 367 | .data_type = UVC_CTRL_DATA_TYPE_BOOLEAN, | ||
| 368 | }, | ||
| 369 | { | ||
| 370 | .id = V4L2_CID_BLUE_BALANCE, | ||
| 371 | .name = "White Balance Blue Component", | ||
| 372 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 373 | .selector = PU_WHITE_BALANCE_COMPONENT_CONTROL, | ||
| 374 | .size = 16, | ||
| 375 | .offset = 0, | ||
| 376 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
| 377 | .data_type = UVC_CTRL_DATA_TYPE_SIGNED, | ||
| 378 | }, | ||
| 379 | { | ||
| 380 | .id = V4L2_CID_RED_BALANCE, | ||
| 381 | .name = "White Balance Red Component", | ||
| 382 | .entity = UVC_GUID_UVC_PROCESSING, | ||
| 383 | .selector = PU_WHITE_BALANCE_COMPONENT_CONTROL, | ||
| 384 | .size = 16, | ||
| 385 | .offset = 16, | ||
| 386 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
| 387 | .data_type = UVC_CTRL_DATA_TYPE_SIGNED, | ||
| 388 | }, | ||
| 389 | { | ||
| 390 | .id = V4L2_CID_FOCUS_ABSOLUTE, | ||
| 391 | .name = "Focus (absolute)", | ||
| 392 | .entity = UVC_GUID_UVC_CAMERA, | ||
| 393 | .selector = CT_FOCUS_ABSOLUTE_CONTROL, | ||
| 394 | .size = 16, | ||
| 395 | .offset = 0, | ||
| 396 | .v4l2_type = V4L2_CTRL_TYPE_INTEGER, | ||
| 397 | .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED, | ||
| 398 | }, | ||
| 399 | { | ||
| 400 | .id = V4L2_CID_FOCUS_AUTO, | ||
| 401 | .name = "Focus, Auto", | ||
| 402 | .entity = UVC_GUID_UVC_CAMERA, | ||
| 403 | .selector = CT_FOCUS_AUTO_CONTROL, | ||
| 404 | .size = 1, | ||
| 405 | .offset = 0, | ||
| 406 | .v4l2_type = V4L2_CTRL_TYPE_BOOLEAN, | ||
| 407 | .data_type = UVC_CTRL_DATA_TYPE_BOOLEAN, | ||
| 408 | }, | ||
| 409 | }; | ||
| 410 | |||
| 411 | /* ------------------------------------------------------------------------ | ||
| 412 | * Utility functions | ||
| 413 | */ | ||
| 414 | |||
| 415 | static inline __u8 *uvc_ctrl_data(struct uvc_control *ctrl, int id) | ||
| 416 | { | ||
| 417 | return ctrl->data + id * ctrl->info->size; | ||
| 418 | } | ||
| 419 | |||
| 420 | static inline int uvc_get_bit(const __u8 *data, int bit) | ||
| 421 | { | ||
| 422 | return (data[bit >> 3] >> (bit & 7)) & 1; | ||
| 423 | } | ||
| 424 | |||
| 425 | /* Extract the bit string specified by mapping->offset and mapping->size | ||
| 426 | * from the little-endian data stored at 'data' and return the result as | ||
| 427 | * a signed 32bit integer. Sign extension will be performed if the mapping | ||
| 428 | * references a signed data type. | ||
| 429 | */ | ||
| 430 | static __s32 uvc_get_le_value(const __u8 *data, | ||
| 431 | struct uvc_control_mapping *mapping) | ||
| 432 | { | ||
| 433 | int bits = mapping->size; | ||
| 434 | int offset = mapping->offset; | ||
| 435 | __s32 value = 0; | ||
| 436 | __u8 mask; | ||
| 437 | |||
| 438 | data += offset / 8; | ||
| 439 | offset &= 7; | ||
| 440 | mask = ((1LL << bits) - 1) << offset; | ||
| 441 | |||
| 442 | for (; bits > 0; data++) { | ||
| 443 | __u8 byte = *data & mask; | ||
| 444 | value |= offset > 0 ? (byte >> offset) : (byte << (-offset)); | ||
| 445 | bits -= 8 - (offset > 0 ? offset : 0); | ||
| 446 | offset -= 8; | ||
| 447 | mask = (1 << bits) - 1; | ||
| 448 | } | ||
| 449 | |||
| 450 | /* Sign-extend the value if needed */ | ||
| 451 | if (mapping->data_type == UVC_CTRL_DATA_TYPE_SIGNED) | ||
| 452 | value |= -(value & (1 << (mapping->size - 1))); | ||
| 453 | |||
| 454 | return value; | ||
| 455 | } | ||
| 456 | |||
| 457 | /* Set the bit string specified by mapping->offset and mapping->size | ||
| 458 | * in the little-endian data stored at 'data' to the value 'value'. | ||
| 459 | */ | ||
| 460 | static void uvc_set_le_value(__s32 value, __u8 *data, | ||
| 461 | struct uvc_control_mapping *mapping) | ||
| 462 | { | ||
| 463 | int bits = mapping->size; | ||
| 464 | int offset = mapping->offset; | ||
| 465 | __u8 mask; | ||
| 466 | |||
| 467 | data += offset / 8; | ||
| 468 | offset &= 7; | ||
| 469 | |||
| 470 | for (; bits > 0; data++) { | ||
| 471 | mask = ((1LL << bits) - 1) << offset; | ||
| 472 | *data = (*data & ~mask) | ((value << offset) & mask); | ||
| 473 | value >>= offset ? offset : 8; | ||
| 474 | bits -= 8 - offset; | ||
| 475 | offset = 0; | ||
| 476 | } | ||
| 477 | } | ||
| 478 | |||
| 479 | /* ------------------------------------------------------------------------ | ||
| 480 | * Terminal and unit management | ||
| 481 | */ | ||
| 482 | |||
| 483 | static const __u8 uvc_processing_guid[16] = UVC_GUID_UVC_PROCESSING; | ||
| 484 | static const __u8 uvc_camera_guid[16] = UVC_GUID_UVC_CAMERA; | ||
| 485 | static const __u8 uvc_media_transport_input_guid[16] = | ||
| 486 | UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT; | ||
| 487 | |||
| 488 | static int uvc_entity_match_guid(struct uvc_entity *entity, __u8 guid[16]) | ||
| 489 | { | ||
| 490 | switch (UVC_ENTITY_TYPE(entity)) { | ||
| 491 | case ITT_CAMERA: | ||
| 492 | return memcmp(uvc_camera_guid, guid, 16) == 0; | ||
| 493 | |||
| 494 | case ITT_MEDIA_TRANSPORT_INPUT: | ||
| 495 | return memcmp(uvc_media_transport_input_guid, guid, 16) == 0; | ||
| 496 | |||
| 497 | case VC_PROCESSING_UNIT: | ||
| 498 | return memcmp(uvc_processing_guid, guid, 16) == 0; | ||
| 499 | |||
| 500 | case VC_EXTENSION_UNIT: | ||
| 501 | return memcmp(entity->extension.guidExtensionCode, | ||
| 502 | guid, 16) == 0; | ||
| 503 | |||
| 504 | default: | ||
| 505 | return 0; | ||
| 506 | } | ||
| 507 | } | ||
| 508 | |||
| 509 | /* ------------------------------------------------------------------------ | ||
| 510 | * UVC Controls | ||
| 511 | */ | ||
| 512 | |||
| 513 | static void __uvc_find_control(struct uvc_entity *entity, __u32 v4l2_id, | ||
| 514 | struct uvc_control_mapping **mapping, struct uvc_control **control, | ||
| 515 | int next) | ||
| 516 | { | ||
| 517 | struct uvc_control *ctrl; | ||
| 518 | struct uvc_control_mapping *map; | ||
| 519 | unsigned int i; | ||
| 520 | |||
| 521 | if (entity == NULL) | ||
| 522 | return; | ||
| 523 | |||
| 524 | for (i = 0; i < entity->ncontrols; ++i) { | ||
| 525 | ctrl = &entity->controls[i]; | ||
| 526 | if (ctrl->info == NULL) | ||
| 527 | continue; | ||
| 528 | |||
| 529 | list_for_each_entry(map, &ctrl->info->mappings, list) { | ||
| 530 | if ((map->id == v4l2_id) && !next) { | ||
| 531 | *control = ctrl; | ||
| 532 | *mapping = map; | ||
| 533 | return; | ||
| 534 | } | ||
| 535 | |||
| 536 | if ((*mapping == NULL || (*mapping)->id > map->id) && | ||
| 537 | (map->id > v4l2_id) && next) { | ||
| 538 | *control = ctrl; | ||
| 539 | *mapping = map; | ||
| 540 | } | ||
| 541 | } | ||
| 542 | } | ||
| 543 | } | ||
| 544 | |||
| 545 | struct uvc_control *uvc_find_control(struct uvc_video_device *video, | ||
| 546 | __u32 v4l2_id, struct uvc_control_mapping **mapping) | ||
| 547 | { | ||
| 548 | struct uvc_control *ctrl = NULL; | ||
| 549 | struct uvc_entity *entity; | ||
| 550 | int next = v4l2_id & V4L2_CTRL_FLAG_NEXT_CTRL; | ||
| 551 | |||
| 552 | *mapping = NULL; | ||
| 553 | |||
| 554 | /* Mask the query flags. */ | ||
| 555 | v4l2_id &= V4L2_CTRL_ID_MASK; | ||
| 556 | |||
| 557 | /* Find the control. */ | ||
| 558 | __uvc_find_control(video->processing, v4l2_id, mapping, &ctrl, next); | ||
| 559 | if (ctrl && !next) | ||
| 560 | return ctrl; | ||
| 561 | |||
| 562 | list_for_each_entry(entity, &video->iterms, chain) { | ||
| 563 | __uvc_find_control(entity, v4l2_id, mapping, &ctrl, next); | ||
| 564 | if (ctrl && !next) | ||
| 565 | return ctrl; | ||
| 566 | } | ||
| 567 | |||
| 568 | list_for_each_entry(entity, &video->extensions, chain) { | ||
| 569 | __uvc_find_control(entity, v4l2_id, mapping, &ctrl, next); | ||
| 570 | if (ctrl && !next) | ||
| 571 | return ctrl; | ||
| 572 | } | ||
| 573 | |||
| 574 | if (ctrl == NULL && !next) | ||
| 575 | uvc_trace(UVC_TRACE_CONTROL, "Control 0x%08x not found.\n", | ||
| 576 | v4l2_id); | ||
| 577 | |||
| 578 | return ctrl; | ||
| 579 | } | ||
| 580 | |||
| 581 | int uvc_query_v4l2_ctrl(struct uvc_video_device *video, | ||
| 582 | struct v4l2_queryctrl *v4l2_ctrl) | ||
| 583 | { | ||
| 584 | struct uvc_control *ctrl; | ||
| 585 | struct uvc_control_mapping *mapping; | ||
| 586 | struct uvc_menu_info *menu; | ||
| 587 | unsigned int i; | ||
| 588 | __u8 data[8]; | ||
| 589 | int ret; | ||
| 590 | |||
| 591 | ctrl = uvc_find_control(video, v4l2_ctrl->id, &mapping); | ||
| 592 | if (ctrl == NULL) | ||
| 593 | return -EINVAL; | ||
| 594 | |||
| 595 | v4l2_ctrl->id = mapping->id; | ||
| 596 | v4l2_ctrl->type = mapping->v4l2_type; | ||
| 597 | strncpy(v4l2_ctrl->name, mapping->name, sizeof v4l2_ctrl->name); | ||
| 598 | v4l2_ctrl->flags = 0; | ||
| 599 | |||
| 600 | if (!(ctrl->info->flags & UVC_CONTROL_SET_CUR)) | ||
| 601 | v4l2_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; | ||
| 602 | |||
| 603 | if (ctrl->info->flags & UVC_CONTROL_GET_DEF) { | ||
| 604 | if ((ret = uvc_query_ctrl(video->dev, GET_DEF, ctrl->entity->id, | ||
| 605 | video->dev->intfnum, ctrl->info->selector, | ||
| 606 | &data, ctrl->info->size)) < 0) | ||
| 607 | return ret; | ||
| 608 | v4l2_ctrl->default_value = uvc_get_le_value(data, mapping); | ||
| 609 | } | ||
| 610 | |||
| 611 | if (mapping->v4l2_type == V4L2_CTRL_TYPE_MENU) { | ||
| 612 | v4l2_ctrl->minimum = 0; | ||
| 613 | v4l2_ctrl->maximum = mapping->menu_count - 1; | ||
| 614 | v4l2_ctrl->step = 1; | ||
| 615 | |||
| 616 | menu = mapping->menu_info; | ||
| 617 | for (i = 0; i < mapping->menu_count; ++i, ++menu) { | ||
| 618 | if (menu->value == v4l2_ctrl->default_value) { | ||
| 619 | v4l2_ctrl->default_value = i; | ||
| 620 | break; | ||
| 621 | } | ||
| 622 | } | ||
| 623 | |||
| 624 | return 0; | ||
| 625 | } | ||
| 626 | |||
| 627 | if (ctrl->info->flags & UVC_CONTROL_GET_MIN) { | ||
| 628 | if ((ret = uvc_query_ctrl(video->dev, GET_MIN, ctrl->entity->id, | ||
| 629 | video->dev->intfnum, ctrl->info->selector, | ||
| 630 | &data, ctrl->info->size)) < 0) | ||
| 631 | return ret; | ||
| 632 | v4l2_ctrl->minimum = uvc_get_le_value(data, mapping); | ||
| 633 | } | ||
| 634 | if (ctrl->info->flags & UVC_CONTROL_GET_MAX) { | ||
| 635 | if ((ret = uvc_query_ctrl(video->dev, GET_MAX, ctrl->entity->id, | ||
| 636 | video->dev->intfnum, ctrl->info->selector, | ||
| 637 | &data, ctrl->info->size)) < 0) | ||
| 638 | return ret; | ||
| 639 | v4l2_ctrl->maximum = uvc_get_le_value(data, mapping); | ||
| 640 | } | ||
| 641 | if (ctrl->info->flags & UVC_CONTROL_GET_RES) { | ||
| 642 | if ((ret = uvc_query_ctrl(video->dev, GET_RES, ctrl->entity->id, | ||
| 643 | video->dev->intfnum, ctrl->info->selector, | ||
| 644 | &data, ctrl->info->size)) < 0) | ||
| 645 | return ret; | ||
| 646 | v4l2_ctrl->step = uvc_get_le_value(data, mapping); | ||
| 647 | } | ||
| 648 | |||
| 649 | return 0; | ||
| 650 | } | ||
| 651 | |||
| 652 | |||
| 653 | /* -------------------------------------------------------------------------- | ||
| 654 | * Control transactions | ||
| 655 | * | ||
| 656 | * To make extended set operations as atomic as the hardware allows, controls | ||
| 657 | * are handled using begin/commit/rollback operations. | ||
| 658 | * | ||
| 659 | * At the beginning of a set request, uvc_ctrl_begin should be called to | ||
| 660 | * initialize the request. This function acquires the control lock. | ||
| 661 | * | ||
| 662 | * When setting a control, the new value is stored in the control data field | ||
| 663 | * at position UVC_CTRL_DATA_CURRENT. The control is then marked as dirty for | ||
| 664 | * later processing. If the UVC and V4L2 control sizes differ, the current | ||
| 665 | * value is loaded from the hardware before storing the new value in the data | ||
| 666 | * field. | ||
| 667 | * | ||
| 668 | * After processing all controls in the transaction, uvc_ctrl_commit or | ||
| 669 | * uvc_ctrl_rollback must be called to apply the pending changes to the | ||
| 670 | * hardware or revert them. When applying changes, all controls marked as | ||
| 671 | * dirty will be modified in the UVC device, and the dirty flag will be | ||
| 672 | * cleared. When reverting controls, the control data field | ||
| 673 | * UVC_CTRL_DATA_CURRENT is reverted to its previous value | ||
| 674 | * (UVC_CTRL_DATA_BACKUP) for all dirty controls. Both functions release the | ||
| 675 | * control lock. | ||
| 676 | */ | ||
| 677 | int uvc_ctrl_begin(struct uvc_video_device *video) | ||
| 678 | { | ||
| 679 | return mutex_lock_interruptible(&video->ctrl_mutex) ? -ERESTARTSYS : 0; | ||
| 680 | } | ||
| 681 | |||
| 682 | static int uvc_ctrl_commit_entity(struct uvc_device *dev, | ||
| 683 | struct uvc_entity *entity, int rollback) | ||
| 684 | { | ||
| 685 | struct uvc_control *ctrl; | ||
| 686 | unsigned int i; | ||
| 687 | int ret; | ||
| 688 | |||
| 689 | if (entity == NULL) | ||
| 690 | return 0; | ||
| 691 | |||
| 692 | for (i = 0; i < entity->ncontrols; ++i) { | ||
| 693 | ctrl = &entity->controls[i]; | ||
| 694 | if (ctrl->info == NULL || !ctrl->dirty) | ||
| 695 | continue; | ||
| 696 | |||
| 697 | if (!rollback) | ||
| 698 | ret = uvc_query_ctrl(dev, SET_CUR, ctrl->entity->id, | ||
| 699 | dev->intfnum, ctrl->info->selector, | ||
| 700 | uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), | ||
| 701 | ctrl->info->size); | ||
| 702 | else | ||
| 703 | ret = 0; | ||
| 704 | |||
| 705 | if (rollback || ret < 0) | ||
| 706 | memcpy(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), | ||
| 707 | uvc_ctrl_data(ctrl, UVC_CTRL_DATA_BACKUP), | ||
| 708 | ctrl->info->size); | ||
| 709 | |||
| 710 | if ((ctrl->info->flags & UVC_CONTROL_GET_CUR) == 0) | ||
| 711 | ctrl->loaded = 0; | ||
| 712 | |||
| 713 | ctrl->dirty = 0; | ||
| 714 | |||
| 715 | if (ret < 0) | ||
| 716 | return ret; | ||
| 717 | } | ||
| 718 | |||
| 719 | return 0; | ||
| 720 | } | ||
| 721 | |||
| 722 | int __uvc_ctrl_commit(struct uvc_video_device *video, int rollback) | ||
| 723 | { | ||
| 724 | struct uvc_entity *entity; | ||
| 725 | int ret = 0; | ||
| 726 | |||
| 727 | /* Find the control. */ | ||
| 728 | ret = uvc_ctrl_commit_entity(video->dev, video->processing, rollback); | ||
| 729 | if (ret < 0) | ||
| 730 | goto done; | ||
| 731 | |||
| 732 | list_for_each_entry(entity, &video->iterms, chain) { | ||
| 733 | ret = uvc_ctrl_commit_entity(video->dev, entity, rollback); | ||
| 734 | if (ret < 0) | ||
| 735 | goto done; | ||
| 736 | } | ||
| 737 | |||
| 738 | list_for_each_entry(entity, &video->extensions, chain) { | ||
| 739 | ret = uvc_ctrl_commit_entity(video->dev, entity, rollback); | ||
| 740 | if (ret < 0) | ||
| 741 | goto done; | ||
| 742 | } | ||
| 743 | |||
| 744 | done: | ||
| 745 | mutex_unlock(&video->ctrl_mutex); | ||
| 746 | return ret; | ||
| 747 | } | ||
| 748 | |||
| 749 | int uvc_ctrl_get(struct uvc_video_device *video, | ||
| 750 | struct v4l2_ext_control *xctrl) | ||
| 751 | { | ||
| 752 | struct uvc_control *ctrl; | ||
| 753 | struct uvc_control_mapping *mapping; | ||
| 754 | struct uvc_menu_info *menu; | ||
| 755 | unsigned int i; | ||
| 756 | int ret; | ||
| 757 | |||
| 758 | ctrl = uvc_find_control(video, xctrl->id, &mapping); | ||
| 759 | if (ctrl == NULL || (ctrl->info->flags & UVC_CONTROL_GET_CUR) == 0) | ||
| 760 | return -EINVAL; | ||
| 761 | |||
| 762 | if (!ctrl->loaded) { | ||
| 763 | ret = uvc_query_ctrl(video->dev, GET_CUR, ctrl->entity->id, | ||
| 764 | video->dev->intfnum, ctrl->info->selector, | ||
| 765 | uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), | ||
| 766 | ctrl->info->size); | ||
| 767 | if (ret < 0) | ||
| 768 | return ret; | ||
| 769 | |||
| 770 | if ((ctrl->info->flags & UVC_CONTROL_AUTO_UPDATE) == 0) | ||
| 771 | ctrl->loaded = 1; | ||
| 772 | } | ||
| 773 | |||
| 774 | xctrl->value = uvc_get_le_value( | ||
| 775 | uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), mapping); | ||
| 776 | |||
| 777 | if (mapping->v4l2_type == V4L2_CTRL_TYPE_MENU) { | ||
| 778 | menu = mapping->menu_info; | ||
| 779 | for (i = 0; i < mapping->menu_count; ++i, ++menu) { | ||
| 780 | if (menu->value == xctrl->value) { | ||
| 781 | xctrl->value = i; | ||
| 782 | break; | ||
| 783 | } | ||
| 784 | } | ||
| 785 | } | ||
| 786 | |||
| 787 | return 0; | ||
| 788 | } | ||
| 789 | |||
| 790 | int uvc_ctrl_set(struct uvc_video_device *video, | ||
| 791 | struct v4l2_ext_control *xctrl) | ||
| 792 | { | ||
| 793 | struct uvc_control *ctrl; | ||
| 794 | struct uvc_control_mapping *mapping; | ||
| 795 | s32 value = xctrl->value; | ||
| 796 | int ret; | ||
| 797 | |||
| 798 | ctrl = uvc_find_control(video, xctrl->id, &mapping); | ||
| 799 | if (ctrl == NULL || (ctrl->info->flags & UVC_CONTROL_SET_CUR) == 0) | ||
| 800 | return -EINVAL; | ||
| 801 | |||
| 802 | if (mapping->v4l2_type == V4L2_CTRL_TYPE_MENU) { | ||
| 803 | if (value < 0 || value >= mapping->menu_count) | ||
| 804 | return -EINVAL; | ||
| 805 | value = mapping->menu_info[value].value; | ||
| 806 | } | ||
| 807 | |||
| 808 | if (!ctrl->loaded && (ctrl->info->size * 8) != mapping->size) { | ||
| 809 | if ((ctrl->info->flags & UVC_CONTROL_GET_CUR) == 0) { | ||
| 810 | memset(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), | ||
| 811 | 0, ctrl->info->size); | ||
| 812 | } else { | ||
| 813 | ret = uvc_query_ctrl(video->dev, GET_CUR, | ||
| 814 | ctrl->entity->id, video->dev->intfnum, | ||
| 815 | ctrl->info->selector, | ||
| 816 | uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), | ||
| 817 | ctrl->info->size); | ||
| 818 | if (ret < 0) | ||
| 819 | return ret; | ||
| 820 | } | ||
| 821 | |||
| 822 | if ((ctrl->info->flags & UVC_CONTROL_AUTO_UPDATE) == 0) | ||
| 823 | ctrl->loaded = 1; | ||
| 824 | } | ||
| 825 | |||
| 826 | if (!ctrl->dirty) { | ||
| 827 | memcpy(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_BACKUP), | ||
| 828 | uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), | ||
| 829 | ctrl->info->size); | ||
| 830 | } | ||
| 831 | |||
| 832 | uvc_set_le_value(value, | ||
| 833 | uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), mapping); | ||
| 834 | |||
| 835 | ctrl->dirty = 1; | ||
| 836 | ctrl->modified = 1; | ||
| 837 | return 0; | ||
| 838 | } | ||
| 839 | |||
| 840 | /* -------------------------------------------------------------------------- | ||
| 841 | * Dynamic controls | ||
| 842 | */ | ||
| 843 | |||
| 844 | int uvc_xu_ctrl_query(struct uvc_video_device *video, | ||
| 845 | struct uvc_xu_control *xctrl, int set) | ||
| 846 | { | ||
| 847 | struct uvc_entity *entity; | ||
| 848 | struct uvc_control *ctrl = NULL; | ||
| 849 | unsigned int i, found = 0; | ||
| 850 | __u8 *data; | ||
| 851 | int ret; | ||
| 852 | |||
| 853 | /* Find the extension unit. */ | ||
| 854 | list_for_each_entry(entity, &video->extensions, chain) { | ||
| 855 | if (entity->id == xctrl->unit) | ||
| 856 | break; | ||
| 857 | } | ||
| 858 | |||
| 859 | if (entity->id != xctrl->unit) { | ||
| 860 | uvc_trace(UVC_TRACE_CONTROL, "Extension unit %u not found.\n", | ||
| 861 | xctrl->unit); | ||
| 862 | return -EINVAL; | ||
| 863 | } | ||
| 864 | |||
| 865 | /* Find the control. */ | ||
| 866 | for (i = 0; i < entity->ncontrols; ++i) { | ||
| 867 | ctrl = &entity->controls[i]; | ||
| 868 | if (ctrl->info == NULL) | ||
| 869 | continue; | ||
| 870 | |||
| 871 | if (ctrl->info->selector == xctrl->selector) { | ||
| 872 | found = 1; | ||
| 873 | break; | ||
| 874 | } | ||
| 875 | } | ||
| 876 | |||
| 877 | if (!found) { | ||
| 878 | uvc_trace(UVC_TRACE_CONTROL, | ||
| 879 | "Control " UVC_GUID_FORMAT "/%u not found.\n", | ||
| 880 | UVC_GUID_ARGS(entity->extension.guidExtensionCode), | ||
| 881 | xctrl->selector); | ||
| 882 | return -EINVAL; | ||
| 883 | } | ||
| 884 | |||
| 885 | /* Validate control data size. */ | ||
| 886 | if (ctrl->info->size != xctrl->size) | ||
| 887 | return -EINVAL; | ||
| 888 | |||
| 889 | if ((set && !(ctrl->info->flags & UVC_CONTROL_SET_CUR)) || | ||
| 890 | (!set && !(ctrl->info->flags & UVC_CONTROL_GET_CUR))) | ||
| 891 | return -EINVAL; | ||
| 892 | |||
| 893 | if (mutex_lock_interruptible(&video->ctrl_mutex)) | ||
| 894 | return -ERESTARTSYS; | ||
| 895 | |||
| 896 | memcpy(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_BACKUP), | ||
| 897 | uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), | ||
| 898 | xctrl->size); | ||
| 899 | data = uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT); | ||
| 900 | |||
| 901 | if (set && copy_from_user(data, xctrl->data, xctrl->size)) { | ||
| 902 | ret = -EFAULT; | ||
| 903 | goto out; | ||
| 904 | } | ||
| 905 | |||
| 906 | ret = uvc_query_ctrl(video->dev, set ? SET_CUR : GET_CUR, xctrl->unit, | ||
| 907 | video->dev->intfnum, xctrl->selector, data, | ||
| 908 | xctrl->size); | ||
| 909 | if (ret < 0) | ||
| 910 | goto out; | ||
| 911 | |||
| 912 | if (!set && copy_to_user(xctrl->data, data, xctrl->size)) { | ||
| 913 | ret = -EFAULT; | ||
| 914 | goto out; | ||
| 915 | } | ||
| 916 | |||
| 917 | out: | ||
| 918 | if (ret) | ||
| 919 | memcpy(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), | ||
| 920 | uvc_ctrl_data(ctrl, UVC_CTRL_DATA_BACKUP), | ||
| 921 | xctrl->size); | ||
| 922 | |||
| 923 | mutex_unlock(&video->ctrl_mutex); | ||
| 924 | return ret; | ||
| 925 | } | ||
| 926 | |||
| 927 | /* -------------------------------------------------------------------------- | ||
| 928 | * Suspend/resume | ||
| 929 | */ | ||
| 930 | |||
| 931 | /* | ||
| 932 | * Restore control values after resume, skipping controls that haven't been | ||
| 933 | * changed. | ||
| 934 | * | ||
| 935 | * TODO | ||
| 936 | * - Don't restore modified controls that are back to their default value. | ||
| 937 | * - Handle restore order (Auto-Exposure Mode should be restored before | ||
| 938 | * Exposure Time). | ||
| 939 | */ | ||
| 940 | int uvc_ctrl_resume_device(struct uvc_device *dev) | ||
| 941 | { | ||
| 942 | struct uvc_control *ctrl; | ||
| 943 | struct uvc_entity *entity; | ||
| 944 | unsigned int i; | ||
| 945 | int ret; | ||
| 946 | |||
| 947 | /* Walk the entities list and restore controls when possible. */ | ||
| 948 | list_for_each_entry(entity, &dev->entities, list) { | ||
| 949 | |||
| 950 | for (i = 0; i < entity->ncontrols; ++i) { | ||
| 951 | ctrl = &entity->controls[i]; | ||
| 952 | |||
| 953 | if (ctrl->info == NULL || !ctrl->modified || | ||
| 954 | (ctrl->info->flags & UVC_CONTROL_RESTORE) == 0) | ||
| 955 | continue; | ||
| 956 | |||
| 957 | printk(KERN_INFO "restoring control " UVC_GUID_FORMAT | ||
| 958 | "/%u/%u\n", UVC_GUID_ARGS(ctrl->info->entity), | ||
| 959 | ctrl->info->index, ctrl->info->selector); | ||
| 960 | ctrl->dirty = 1; | ||
| 961 | } | ||
| 962 | |||
| 963 | ret = uvc_ctrl_commit_entity(dev, entity, 0); | ||
| 964 | if (ret < 0) | ||
| 965 | return ret; | ||
| 966 | } | ||
| 967 | |||
| 968 | return 0; | ||
| 969 | } | ||
| 970 | |||
| 971 | /* -------------------------------------------------------------------------- | ||
| 972 | * Control and mapping handling | ||
| 973 | */ | ||
| 974 | |||
| 975 | static void uvc_ctrl_add_ctrl(struct uvc_device *dev, | ||
| 976 | struct uvc_control_info *info) | ||
| 977 | { | ||
| 978 | struct uvc_entity *entity; | ||
| 979 | struct uvc_control *ctrl = NULL; | ||
| 980 | int ret, found = 0; | ||
| 981 | unsigned int i; | ||
| 982 | |||
| 983 | list_for_each_entry(entity, &dev->entities, list) { | ||
| 984 | if (!uvc_entity_match_guid(entity, info->entity)) | ||
| 985 | continue; | ||
| 986 | |||
| 987 | for (i = 0; i < entity->ncontrols; ++i) { | ||
| 988 | ctrl = &entity->controls[i]; | ||
| 989 | if (ctrl->index == info->index) { | ||
| 990 | found = 1; | ||
| 991 | break; | ||
| 992 | } | ||
| 993 | } | ||
| 994 | |||
| 995 | if (found) | ||
| 996 | break; | ||
| 997 | } | ||
| 998 | |||
| 999 | if (!found) | ||
| 1000 | return; | ||
| 1001 | |||
| 1002 | if (UVC_ENTITY_TYPE(entity) == VC_EXTENSION_UNIT) { | ||
| 1003 | /* Check if the device control information and length match | ||
| 1004 | * the user supplied information. | ||
| 1005 | */ | ||
| 1006 | __u32 flags; | ||
| 1007 | __le16 size; | ||
| 1008 | __u8 inf; | ||
| 1009 | |||
| 1010 | if ((ret = uvc_query_ctrl(dev, GET_LEN, ctrl->entity->id, | ||
| 1011 | dev->intfnum, info->selector, (__u8 *)&size, 2)) < 0) { | ||
| 1012 | uvc_trace(UVC_TRACE_CONTROL, "GET_LEN failed on " | ||
| 1013 | "control " UVC_GUID_FORMAT "/%u (%d).\n", | ||
| 1014 | UVC_GUID_ARGS(info->entity), info->selector, | ||
| 1015 | ret); | ||
| 1016 | return; | ||
| 1017 | } | ||
| 1018 | |||
| 1019 | if (info->size != le16_to_cpu(size)) { | ||
| 1020 | uvc_trace(UVC_TRACE_CONTROL, "Control " UVC_GUID_FORMAT | ||
| 1021 | "/%u size doesn't match user supplied " | ||
| 1022 | "value.\n", UVC_GUID_ARGS(info->entity), | ||
| 1023 | info->selector); | ||
| 1024 | return; | ||
| 1025 | } | ||
| 1026 | |||
| 1027 | if ((ret = uvc_query_ctrl(dev, GET_INFO, ctrl->entity->id, | ||
| 1028 | dev->intfnum, info->selector, &inf, 1)) < 0) { | ||
| 1029 | uvc_trace(UVC_TRACE_CONTROL, "GET_INFO failed on " | ||
| 1030 | "control " UVC_GUID_FORMAT "/%u (%d).\n", | ||
| 1031 | UVC_GUID_ARGS(info->entity), info->selector, | ||
| 1032 | ret); | ||
| 1033 | return; | ||
| 1034 | } | ||
| 1035 | |||
| 1036 | flags = info->flags; | ||
| 1037 | if (((flags & UVC_CONTROL_GET_CUR) && !(inf & (1 << 0))) || | ||
| 1038 | ((flags & UVC_CONTROL_SET_CUR) && !(inf & (1 << 1)))) { | ||
| 1039 | uvc_trace(UVC_TRACE_CONTROL, "Control " | ||
| 1040 | UVC_GUID_FORMAT "/%u flags don't match " | ||
| 1041 | "supported operations.\n", | ||
| 1042 | UVC_GUID_ARGS(info->entity), info->selector); | ||
| 1043 | return; | ||
| 1044 | } | ||
| 1045 | } | ||
| 1046 | |||
| 1047 | ctrl->info = info; | ||
| 1048 | ctrl->data = kmalloc(ctrl->info->size * UVC_CTRL_NDATA, GFP_KERNEL); | ||
| 1049 | uvc_trace(UVC_TRACE_CONTROL, "Added control " UVC_GUID_FORMAT "/%u " | ||
| 1050 | "to device %s entity %u\n", UVC_GUID_ARGS(ctrl->info->entity), | ||
| 1051 | ctrl->info->selector, dev->udev->devpath, entity->id); | ||
| 1052 | } | ||
| 1053 | |||
| 1054 | /* | ||
| 1055 | * Add an item to the UVC control information list, and instantiate a control | ||
| 1056 | * structure for each device that supports the control. | ||
| 1057 | */ | ||
| 1058 | int uvc_ctrl_add_info(struct uvc_control_info *info) | ||
| 1059 | { | ||
| 1060 | struct uvc_control_info *ctrl; | ||
| 1061 | struct uvc_device *dev; | ||
| 1062 | int ret = 0; | ||
| 1063 | |||
| 1064 | /* Find matching controls by walking the devices, entities and | ||
| 1065 | * controls list. | ||
| 1066 | */ | ||
| 1067 | mutex_lock(&uvc_driver.ctrl_mutex); | ||
| 1068 | |||
| 1069 | /* First check if the list contains a control matching the new one. | ||
| 1070 | * Bail out if it does. | ||
| 1071 | */ | ||
| 1072 | list_for_each_entry(ctrl, &uvc_driver.controls, list) { | ||
| 1073 | if (memcmp(ctrl->entity, info->entity, 16)) | ||
| 1074 | continue; | ||
| 1075 | |||
| 1076 | if (ctrl->selector == info->selector) { | ||
| 1077 | uvc_trace(UVC_TRACE_CONTROL, "Control " | ||
| 1078 | UVC_GUID_FORMAT "/%u is already defined.\n", | ||
| 1079 | UVC_GUID_ARGS(info->entity), info->selector); | ||
| 1080 | ret = -EEXIST; | ||
| 1081 | goto end; | ||
| 1082 | } | ||
| 1083 | if (ctrl->index == info->index) { | ||
| 1084 | uvc_trace(UVC_TRACE_CONTROL, "Control " | ||
| 1085 | UVC_GUID_FORMAT "/%u would overwrite index " | ||
| 1086 | "%d.\n", UVC_GUID_ARGS(info->entity), | ||
| 1087 | info->selector, info->index); | ||
| 1088 | ret = -EEXIST; | ||
| 1089 | goto end; | ||
| 1090 | } | ||
| 1091 | } | ||
| 1092 | |||
| 1093 | list_for_each_entry(dev, &uvc_driver.devices, list) | ||
| 1094 | uvc_ctrl_add_ctrl(dev, info); | ||
| 1095 | |||
| 1096 | INIT_LIST_HEAD(&info->mappings); | ||
| 1097 | list_add_tail(&info->list, &uvc_driver.controls); | ||
| 1098 | end: | ||
| 1099 | mutex_unlock(&uvc_driver.ctrl_mutex); | ||
| 1100 | return ret; | ||
| 1101 | } | ||
| 1102 | |||
| 1103 | int uvc_ctrl_add_mapping(struct uvc_control_mapping *mapping) | ||
| 1104 | { | ||
| 1105 | struct uvc_control_info *info; | ||
| 1106 | struct uvc_control_mapping *map; | ||
| 1107 | int ret = -EINVAL; | ||
| 1108 | |||
| 1109 | if (mapping->id & ~V4L2_CTRL_ID_MASK) { | ||
| 1110 | uvc_trace(UVC_TRACE_CONTROL, "Can't add mapping '%s' with " | ||
| 1111 | "invalid control id 0x%08x\n", mapping->name, | ||
| 1112 | mapping->id); | ||
| 1113 | return -EINVAL; | ||
| 1114 | } | ||
| 1115 | |||
| 1116 | mutex_lock(&uvc_driver.ctrl_mutex); | ||
| 1117 | list_for_each_entry(info, &uvc_driver.controls, list) { | ||
| 1118 | if (memcmp(info->entity, mapping->entity, 16) || | ||
| 1119 | info->selector != mapping->selector) | ||
| 1120 | continue; | ||
| 1121 | |||
| 1122 | if (info->size * 8 < mapping->size + mapping->offset) { | ||
| 1123 | uvc_trace(UVC_TRACE_CONTROL, "Mapping '%s' would " | ||
| 1124 | "overflow control " UVC_GUID_FORMAT "/%u\n", | ||
| 1125 | mapping->name, UVC_GUID_ARGS(info->entity), | ||
| 1126 | info->selector); | ||
| 1127 | ret = -EOVERFLOW; | ||
| 1128 | goto end; | ||
| 1129 | } | ||
| 1130 | |||
| 1131 | /* Check if the list contains a mapping matching the new one. | ||
| 1132 | * Bail out if it does. | ||
| 1133 | */ | ||
| 1134 | list_for_each_entry(map, &info->mappings, list) { | ||
| 1135 | if (map->id == mapping->id) { | ||
| 1136 | uvc_trace(UVC_TRACE_CONTROL, "Mapping '%s' is " | ||
| 1137 | "already defined.\n", mapping->name); | ||
| 1138 | ret = -EEXIST; | ||
| 1139 | goto end; | ||
| 1140 | } | ||
| 1141 | } | ||
| 1142 | |||
| 1143 | mapping->ctrl = info; | ||
| 1144 | list_add_tail(&mapping->list, &info->mappings); | ||
| 1145 | uvc_trace(UVC_TRACE_CONTROL, "Adding mapping %s to control " | ||
| 1146 | UVC_GUID_FORMAT "/%u.\n", mapping->name, | ||
| 1147 | UVC_GUID_ARGS(info->entity), info->selector); | ||
| 1148 | |||
| 1149 | ret = 0; | ||
| 1150 | break; | ||
| 1151 | } | ||
| 1152 | end: | ||
| 1153 | mutex_unlock(&uvc_driver.ctrl_mutex); | ||
| 1154 | return ret; | ||
| 1155 | } | ||
| 1156 | |||
| 1157 | /* | ||
| 1158 | * Initialize device controls. | ||
| 1159 | */ | ||
| 1160 | int uvc_ctrl_init_device(struct uvc_device *dev) | ||
| 1161 | { | ||
| 1162 | struct uvc_control_info *info; | ||
| 1163 | struct uvc_control *ctrl; | ||
| 1164 | struct uvc_entity *entity; | ||
| 1165 | unsigned int i; | ||
| 1166 | |||
| 1167 | /* Walk the entities list and instantiate controls */ | ||
| 1168 | list_for_each_entry(entity, &dev->entities, list) { | ||
| 1169 | unsigned int bControlSize = 0, ncontrols = 0; | ||
| 1170 | __u8 *bmControls = NULL; | ||
| 1171 | |||
| 1172 | if (UVC_ENTITY_TYPE(entity) == VC_EXTENSION_UNIT) { | ||
| 1173 | bmControls = entity->extension.bmControls; | ||
| 1174 | bControlSize = entity->extension.bControlSize; | ||
| 1175 | } else if (UVC_ENTITY_TYPE(entity) == VC_PROCESSING_UNIT) { | ||
| 1176 | bmControls = entity->processing.bmControls; | ||
| 1177 | bControlSize = entity->processing.bControlSize; | ||
| 1178 | } else if (UVC_ENTITY_TYPE(entity) == ITT_CAMERA) { | ||
| 1179 | bmControls = entity->camera.bmControls; | ||
| 1180 | bControlSize = entity->camera.bControlSize; | ||
| 1181 | } | ||
| 1182 | |||
| 1183 | for (i = 0; i < bControlSize; ++i) | ||
| 1184 | ncontrols += hweight8(bmControls[i]); | ||
| 1185 | |||
| 1186 | if (ncontrols == 0) | ||
| 1187 | continue; | ||
| 1188 | |||
| 1189 | entity->controls = kzalloc(ncontrols*sizeof *ctrl, GFP_KERNEL); | ||
| 1190 | if (entity->controls == NULL) | ||
| 1191 | return -ENOMEM; | ||
| 1192 | |||
| 1193 | entity->ncontrols = ncontrols; | ||
| 1194 | |||
| 1195 | ctrl = entity->controls; | ||
| 1196 | for (i = 0; i < bControlSize * 8; ++i) { | ||
| 1197 | if (uvc_get_bit(bmControls, i) == 0) | ||
| 1198 | continue; | ||
| 1199 | |||
| 1200 | ctrl->entity = entity; | ||
| 1201 | ctrl->index = i; | ||
| 1202 | ctrl++; | ||
| 1203 | } | ||
| 1204 | } | ||
| 1205 | |||
| 1206 | /* Walk the controls info list and associate them with the device | ||
| 1207 | * controls, then add the device to the global device list. This has | ||
| 1208 | * to be done while holding the controls lock, to make sure | ||
| 1209 | * uvc_ctrl_add_info() will not get called in-between. | ||
| 1210 | */ | ||
| 1211 | mutex_lock(&uvc_driver.ctrl_mutex); | ||
| 1212 | list_for_each_entry(info, &uvc_driver.controls, list) | ||
| 1213 | uvc_ctrl_add_ctrl(dev, info); | ||
| 1214 | |||
| 1215 | list_add_tail(&dev->list, &uvc_driver.devices); | ||
| 1216 | mutex_unlock(&uvc_driver.ctrl_mutex); | ||
| 1217 | |||
| 1218 | return 0; | ||
| 1219 | } | ||
| 1220 | |||
| 1221 | /* | ||
| 1222 | * Cleanup device controls. | ||
| 1223 | */ | ||
| 1224 | void uvc_ctrl_cleanup_device(struct uvc_device *dev) | ||
| 1225 | { | ||
| 1226 | struct uvc_entity *entity; | ||
| 1227 | unsigned int i; | ||
| 1228 | |||
| 1229 | /* Remove the device from the global devices list */ | ||
| 1230 | mutex_lock(&uvc_driver.ctrl_mutex); | ||
| 1231 | if (dev->list.next != NULL) | ||
| 1232 | list_del(&dev->list); | ||
| 1233 | mutex_unlock(&uvc_driver.ctrl_mutex); | ||
| 1234 | |||
| 1235 | list_for_each_entry(entity, &dev->entities, list) { | ||
| 1236 | for (i = 0; i < entity->ncontrols; ++i) | ||
| 1237 | kfree(entity->controls[i].data); | ||
| 1238 | |||
| 1239 | kfree(entity->controls); | ||
| 1240 | } | ||
| 1241 | } | ||
| 1242 | |||
| 1243 | void uvc_ctrl_init(void) | ||
| 1244 | { | ||
| 1245 | struct uvc_control_info *ctrl = uvc_ctrls; | ||
| 1246 | struct uvc_control_info *cend = ctrl + ARRAY_SIZE(uvc_ctrls); | ||
| 1247 | struct uvc_control_mapping *mapping = uvc_ctrl_mappings; | ||
| 1248 | struct uvc_control_mapping *mend = | ||
| 1249 | mapping + ARRAY_SIZE(uvc_ctrl_mappings); | ||
| 1250 | |||
| 1251 | for (; ctrl < cend; ++ctrl) | ||
| 1252 | uvc_ctrl_add_info(ctrl); | ||
| 1253 | |||
| 1254 | for (; mapping < mend; ++mapping) | ||
| 1255 | uvc_ctrl_add_mapping(mapping); | ||
| 1256 | } | ||
diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c new file mode 100644 index 000000000000..60ced589f898 --- /dev/null +++ b/drivers/media/video/uvc/uvc_driver.c | |||
| @@ -0,0 +1,1955 @@ | |||
| 1 | /* | ||
| 2 | * uvc_driver.c -- USB Video Class driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2005-2008 | ||
| 5 | * Laurent Pinchart (laurent.pinchart@skynet.be) | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | */ | ||
| 13 | |||
| 14 | /* | ||
| 15 | * This driver aims to support video input devices compliant with the 'USB | ||
| 16 | * Video Class' specification. | ||
| 17 | * | ||
| 18 | * The driver doesn't support the deprecated v4l1 interface. It implements the | ||
| 19 | * mmap capture method only, and doesn't do any image format conversion in | ||
| 20 | * software. If your user-space application doesn't support YUYV or MJPEG, fix | ||
| 21 | * it :-). Please note that the MJPEG data have been stripped from their | ||
| 22 | * Huffman tables (DHT marker), you will need to add it back if your JPEG | ||
| 23 | * codec can't handle MJPEG data. | ||
| 24 | */ | ||
| 25 | |||
| 26 | #include <linux/kernel.h> | ||
| 27 | #include <linux/version.h> | ||
| 28 | #include <linux/list.h> | ||
| 29 | #include <linux/module.h> | ||
| 30 | #include <linux/usb.h> | ||
| 31 | #include <linux/videodev2.h> | ||
| 32 | #include <linux/vmalloc.h> | ||
| 33 | #include <linux/wait.h> | ||
| 34 | #include <asm/atomic.h> | ||
| 35 | |||
| 36 | #include <media/v4l2-common.h> | ||
| 37 | |||
| 38 | #include "uvcvideo.h" | ||
| 39 | |||
| 40 | #define DRIVER_AUTHOR "Laurent Pinchart <laurent.pinchart@skynet.be>" | ||
| 41 | #define DRIVER_DESC "USB Video Class driver" | ||
| 42 | #ifndef DRIVER_VERSION | ||
| 43 | #define DRIVER_VERSION "v0.1.0" | ||
| 44 | #endif | ||
| 45 | |||
| 46 | static unsigned int uvc_quirks_param; | ||
| 47 | unsigned int uvc_trace_param; | ||
| 48 | |||
| 49 | /* ------------------------------------------------------------------------ | ||
| 50 | * Control, formats, ... | ||
| 51 | */ | ||
| 52 | |||
| 53 | static struct uvc_format_desc uvc_fmts[] = { | ||
| 54 | { | ||
| 55 | .name = "YUV 4:2:2 (YUYV)", | ||
| 56 | .guid = UVC_GUID_FORMAT_YUY2, | ||
| 57 | .fcc = V4L2_PIX_FMT_YUYV, | ||
| 58 | }, | ||
| 59 | { | ||
| 60 | .name = "YUV 4:2:0 (NV12)", | ||
| 61 | .guid = UVC_GUID_FORMAT_NV12, | ||
| 62 | .fcc = V4L2_PIX_FMT_NV12, | ||
| 63 | }, | ||
| 64 | { | ||
| 65 | .name = "MJPEG", | ||
| 66 | .guid = UVC_GUID_FORMAT_MJPEG, | ||
| 67 | .fcc = V4L2_PIX_FMT_MJPEG, | ||
| 68 | }, | ||
| 69 | { | ||
| 70 | .name = "YVU 4:2:0 (YV12)", | ||
| 71 | .guid = UVC_GUID_FORMAT_YV12, | ||
| 72 | .fcc = V4L2_PIX_FMT_YVU420, | ||
| 73 | }, | ||
| 74 | { | ||
| 75 | .name = "YUV 4:2:0 (I420)", | ||
| 76 | .guid = UVC_GUID_FORMAT_I420, | ||
| 77 | .fcc = V4L2_PIX_FMT_YUV420, | ||
| 78 | }, | ||
| 79 | { | ||
| 80 | .name = "YUV 4:2:2 (UYVY)", | ||
| 81 | .guid = UVC_GUID_FORMAT_UYVY, | ||
| 82 | .fcc = V4L2_PIX_FMT_UYVY, | ||
| 83 | }, | ||
| 84 | { | ||
| 85 | .name = "Greyscale", | ||
| 86 | .guid = UVC_GUID_FORMAT_Y800, | ||
| 87 | .fcc = V4L2_PIX_FMT_GREY, | ||
| 88 | }, | ||
| 89 | { | ||
| 90 | .name = "RGB Bayer", | ||
| 91 | .guid = UVC_GUID_FORMAT_BY8, | ||
| 92 | .fcc = V4L2_PIX_FMT_SBGGR8, | ||
| 93 | }, | ||
| 94 | }; | ||
| 95 | |||
| 96 | /* ------------------------------------------------------------------------ | ||
| 97 | * Utility functions | ||
| 98 | */ | ||
| 99 | |||
| 100 | struct usb_host_endpoint *uvc_find_endpoint(struct usb_host_interface *alts, | ||
| 101 | __u8 epaddr) | ||
| 102 | { | ||
| 103 | struct usb_host_endpoint *ep; | ||
| 104 | unsigned int i; | ||
| 105 | |||
| 106 | for (i = 0; i < alts->desc.bNumEndpoints; ++i) { | ||
| 107 | ep = &alts->endpoint[i]; | ||
| 108 | if (ep->desc.bEndpointAddress == epaddr) | ||
| 109 | return ep; | ||
| 110 | } | ||
| 111 | |||
| 112 | return NULL; | ||
| 113 | } | ||
| 114 | |||
| 115 | static struct uvc_format_desc *uvc_format_by_guid(const __u8 guid[16]) | ||
| 116 | { | ||
| 117 | unsigned int len = ARRAY_SIZE(uvc_fmts); | ||
| 118 | unsigned int i; | ||
| 119 | |||
| 120 | for (i = 0; i < len; ++i) { | ||
| 121 | if (memcmp(guid, uvc_fmts[i].guid, 16) == 0) | ||
| 122 | return &uvc_fmts[i]; | ||
| 123 | } | ||
| 124 | |||
| 125 | return NULL; | ||
| 126 | } | ||
| 127 | |||
| 128 | static __u32 uvc_colorspace(const __u8 primaries) | ||
| 129 | { | ||
| 130 | static const __u8 colorprimaries[] = { | ||
| 131 | 0, | ||
| 132 | V4L2_COLORSPACE_SRGB, | ||
| 133 | V4L2_COLORSPACE_470_SYSTEM_M, | ||
| 134 | V4L2_COLORSPACE_470_SYSTEM_BG, | ||
| 135 | V4L2_COLORSPACE_SMPTE170M, | ||
| 136 | V4L2_COLORSPACE_SMPTE240M, | ||
| 137 | }; | ||
| 138 | |||
| 139 | if (primaries < ARRAY_SIZE(colorprimaries)) | ||
| 140 | return colorprimaries[primaries]; | ||
| 141 | |||
| 142 | return 0; | ||
| 143 | } | ||
| 144 | |||
| 145 | /* Simplify a fraction using a simple continued fraction decomposition. The | ||
| 146 | * idea here is to convert fractions such as 333333/10000000 to 1/30 using | ||
| 147 | * 32 bit arithmetic only. The algorithm is not perfect and relies upon two | ||
| 148 | * arbitrary parameters to remove non-significative terms from the simple | ||
| 149 | * continued fraction decomposition. Using 8 and 333 for n_terms and threshold | ||
| 150 | * respectively seems to give nice results. | ||
| 151 | */ | ||
| 152 | void uvc_simplify_fraction(uint32_t *numerator, uint32_t *denominator, | ||
| 153 | unsigned int n_terms, unsigned int threshold) | ||
| 154 | { | ||
| 155 | uint32_t *an; | ||
| 156 | uint32_t x, y, r; | ||
| 157 | unsigned int i, n; | ||
| 158 | |||
| 159 | an = kmalloc(n_terms * sizeof *an, GFP_KERNEL); | ||
| 160 | if (an == NULL) | ||
| 161 | return; | ||
| 162 | |||
| 163 | /* Convert the fraction to a simple continued fraction. See | ||
| 164 | * http://mathforum.org/dr.math/faq/faq.fractions.html | ||
| 165 | * Stop if the current term is bigger than or equal to the given | ||
| 166 | * threshold. | ||
| 167 | */ | ||
| 168 | x = *numerator; | ||
| 169 | y = *denominator; | ||
| 170 | |||
| 171 | for (n = 0; n < n_terms && y != 0; ++n) { | ||
| 172 | an[n] = x / y; | ||
| 173 | if (an[n] >= threshold) { | ||
| 174 | if (n < 2) | ||
| 175 | n++; | ||
| 176 | break; | ||
| 177 | } | ||
| 178 | |||
| 179 | r = x - an[n] * y; | ||
| 180 | x = y; | ||
| 181 | y = r; | ||
| 182 | } | ||
| 183 | |||
| 184 | /* Expand the simple continued fraction back to an integer fraction. */ | ||
| 185 | x = 0; | ||
| 186 | y = 1; | ||
| 187 | |||
| 188 | for (i = n; i > 0; --i) { | ||
| 189 | r = y; | ||
| 190 | y = an[i-1] * y + x; | ||
| 191 | x = r; | ||
| 192 | } | ||
| 193 | |||
| 194 | *numerator = y; | ||
| 195 | *denominator = x; | ||
| 196 | kfree(an); | ||
| 197 | } | ||
| 198 | |||
| 199 | /* Convert a fraction to a frame interval in 100ns multiples. The idea here is | ||
| 200 | * to compute numerator / denominator * 10000000 using 32 bit fixed point | ||
| 201 | * arithmetic only. | ||
| 202 | */ | ||
| 203 | uint32_t uvc_fraction_to_interval(uint32_t numerator, uint32_t denominator) | ||
| 204 | { | ||
| 205 | uint32_t multiplier; | ||
| 206 | |||
| 207 | /* Saturate the result if the operation would overflow. */ | ||
| 208 | if (denominator == 0 || | ||
| 209 | numerator/denominator >= ((uint32_t)-1)/10000000) | ||
| 210 | return (uint32_t)-1; | ||
| 211 | |||
| 212 | /* Divide both the denominator and the multiplier by two until | ||
| 213 | * numerator * multiplier doesn't overflow. If anyone knows a better | ||
| 214 | * algorithm please let me know. | ||
| 215 | */ | ||
| 216 | multiplier = 10000000; | ||
| 217 | while (numerator > ((uint32_t)-1)/multiplier) { | ||
| 218 | multiplier /= 2; | ||
| 219 | denominator /= 2; | ||
| 220 | } | ||
| 221 | |||
| 222 | return denominator ? numerator * multiplier / denominator : 0; | ||
| 223 | } | ||
| 224 | |||
| 225 | /* ------------------------------------------------------------------------ | ||
| 226 | * Terminal and unit management | ||
| 227 | */ | ||
| 228 | |||
| 229 | static struct uvc_entity *uvc_entity_by_id(struct uvc_device *dev, int id) | ||
| 230 | { | ||
| 231 | struct uvc_entity *entity; | ||
| 232 | |||
| 233 | list_for_each_entry(entity, &dev->entities, list) { | ||
| 234 | if (entity->id == id) | ||
| 235 | return entity; | ||
| 236 | } | ||
| 237 | |||
| 238 | return NULL; | ||
| 239 | } | ||
| 240 | |||
| 241 | static struct uvc_entity *uvc_entity_by_reference(struct uvc_device *dev, | ||
| 242 | int id, struct uvc_entity *entity) | ||
| 243 | { | ||
| 244 | unsigned int i; | ||
| 245 | |||
| 246 | if (entity == NULL) | ||
| 247 | entity = list_entry(&dev->entities, struct uvc_entity, list); | ||
| 248 | |||
| 249 | list_for_each_entry_continue(entity, &dev->entities, list) { | ||
| 250 | switch (UVC_ENTITY_TYPE(entity)) { | ||
| 251 | case TT_STREAMING: | ||
| 252 | if (entity->output.bSourceID == id) | ||
| 253 | return entity; | ||
| 254 | break; | ||
| 255 | |||
| 256 | case VC_PROCESSING_UNIT: | ||
| 257 | if (entity->processing.bSourceID == id) | ||
| 258 | return entity; | ||
| 259 | break; | ||
| 260 | |||
| 261 | case VC_SELECTOR_UNIT: | ||
| 262 | for (i = 0; i < entity->selector.bNrInPins; ++i) | ||
| 263 | if (entity->selector.baSourceID[i] == id) | ||
| 264 | return entity; | ||
| 265 | break; | ||
| 266 | |||
| 267 | case VC_EXTENSION_UNIT: | ||
| 268 | for (i = 0; i < entity->extension.bNrInPins; ++i) | ||
| 269 | if (entity->extension.baSourceID[i] == id) | ||
| 270 | return entity; | ||
| 271 | break; | ||
| 272 | } | ||
| 273 | } | ||
| 274 | |||
| 275 | return NULL; | ||
| 276 | } | ||
| 277 | |||
| 278 | /* ------------------------------------------------------------------------ | ||
| 279 | * Descriptors handling | ||
| 280 | */ | ||
| 281 | |||
| 282 | static int uvc_parse_format(struct uvc_device *dev, | ||
| 283 | struct uvc_streaming *streaming, struct uvc_format *format, | ||
| 284 | __u32 **intervals, unsigned char *buffer, int buflen) | ||
| 285 | { | ||
| 286 | struct usb_interface *intf = streaming->intf; | ||
| 287 | struct usb_host_interface *alts = intf->cur_altsetting; | ||
| 288 | struct uvc_format_desc *fmtdesc; | ||
| 289 | struct uvc_frame *frame; | ||
| 290 | const unsigned char *start = buffer; | ||
| 291 | unsigned int interval; | ||
| 292 | unsigned int i, n; | ||
| 293 | __u8 ftype; | ||
| 294 | |||
| 295 | format->type = buffer[2]; | ||
| 296 | format->index = buffer[3]; | ||
| 297 | |||
| 298 | switch (buffer[2]) { | ||
| 299 | case VS_FORMAT_UNCOMPRESSED: | ||
| 300 | case VS_FORMAT_FRAME_BASED: | ||
| 301 | if (buflen < 27) { | ||
| 302 | uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming" | ||
| 303 | "interface %d FORMAT error\n", | ||
| 304 | dev->udev->devnum, | ||
| 305 | alts->desc.bInterfaceNumber); | ||
| 306 | return -EINVAL; | ||
| 307 | } | ||
| 308 | |||
| 309 | /* Find the format descriptor from its GUID. */ | ||
| 310 | fmtdesc = uvc_format_by_guid(&buffer[5]); | ||
| 311 | |||
| 312 | if (fmtdesc != NULL) { | ||
| 313 | strncpy(format->name, fmtdesc->name, | ||
| 314 | sizeof format->name); | ||
| 315 | format->fcc = fmtdesc->fcc; | ||
| 316 | } else { | ||
| 317 | uvc_printk(KERN_INFO, "Unknown video format " | ||
| 318 | UVC_GUID_FORMAT "\n", | ||
| 319 | UVC_GUID_ARGS(&buffer[5])); | ||
| 320 | snprintf(format->name, sizeof format->name, | ||
| 321 | UVC_GUID_FORMAT, UVC_GUID_ARGS(&buffer[5])); | ||
| 322 | format->fcc = 0; | ||
| 323 | } | ||
| 324 | |||
| 325 | format->bpp = buffer[21]; | ||
| 326 | if (buffer[2] == VS_FORMAT_UNCOMPRESSED) { | ||
| 327 | ftype = VS_FRAME_UNCOMPRESSED; | ||
| 328 | } else { | ||
| 329 | ftype = VS_FRAME_FRAME_BASED; | ||
| 330 | if (buffer[27]) | ||
| 331 | format->flags = UVC_FMT_FLAG_COMPRESSED; | ||
| 332 | } | ||
| 333 | break; | ||
| 334 | |||
| 335 | case VS_FORMAT_MJPEG: | ||
| 336 | if (buflen < 11) { | ||
| 337 | uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming" | ||
| 338 | "interface %d FORMAT error\n", | ||
| 339 | dev->udev->devnum, | ||
| 340 | alts->desc.bInterfaceNumber); | ||
| 341 | return -EINVAL; | ||
| 342 | } | ||
| 343 | |||
| 344 | strncpy(format->name, "MJPEG", sizeof format->name); | ||
| 345 | format->fcc = V4L2_PIX_FMT_MJPEG; | ||
| 346 | format->flags = UVC_FMT_FLAG_COMPRESSED; | ||
| 347 | format->bpp = 0; | ||
| 348 | ftype = VS_FRAME_MJPEG; | ||
| 349 | break; | ||
| 350 | |||
| 351 | case VS_FORMAT_DV: | ||
| 352 | if (buflen < 9) { | ||
| 353 | uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming" | ||
| 354 | "interface %d FORMAT error\n", | ||
| 355 | dev->udev->devnum, | ||
| 356 | alts->desc.bInterfaceNumber); | ||
| 357 | return -EINVAL; | ||
| 358 | } | ||
| 359 | |||
| 360 | switch (buffer[8] & 0x7f) { | ||
| 361 | case 0: | ||
| 362 | strncpy(format->name, "SD-DV", sizeof format->name); | ||
| 363 | break; | ||
| 364 | case 1: | ||
| 365 | strncpy(format->name, "SDL-DV", sizeof format->name); | ||
| 366 | break; | ||
| 367 | case 2: | ||
| 368 | strncpy(format->name, "HD-DV", sizeof format->name); | ||
| 369 | break; | ||
| 370 | default: | ||
| 371 | uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming" | ||
| 372 | "interface %d: unknown DV format %u\n", | ||
| 373 | dev->udev->devnum, | ||
| 374 | alts->desc.bInterfaceNumber, buffer[8]); | ||
| 375 | return -EINVAL; | ||
| 376 | } | ||
| 377 | |||
| 378 | strncat(format->name, buffer[8] & (1 << 7) ? " 60Hz" : " 50Hz", | ||
| 379 | sizeof format->name); | ||
| 380 | |||
| 381 | format->fcc = V4L2_PIX_FMT_DV; | ||
| 382 | format->flags = UVC_FMT_FLAG_COMPRESSED | UVC_FMT_FLAG_STREAM; | ||
| 383 | format->bpp = 0; | ||
| 384 | ftype = 0; | ||
| 385 | |||
| 386 | /* Create a dummy frame descriptor. */ | ||
| 387 | frame = &format->frame[0]; | ||
| 388 | memset(&format->frame[0], 0, sizeof format->frame[0]); | ||
| 389 | frame->bFrameIntervalType = 1; | ||
| 390 | frame->dwDefaultFrameInterval = 1; | ||
| 391 | frame->dwFrameInterval = *intervals; | ||
| 392 | *(*intervals)++ = 1; | ||
| 393 | format->nframes = 1; | ||
| 394 | break; | ||
| 395 | |||
| 396 | case VS_FORMAT_MPEG2TS: | ||
| 397 | case VS_FORMAT_STREAM_BASED: | ||
| 398 | /* Not supported yet. */ | ||
| 399 | default: | ||
| 400 | uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming" | ||
| 401 | "interface %d unsupported format %u\n", | ||
| 402 | dev->udev->devnum, alts->desc.bInterfaceNumber, | ||
| 403 | buffer[2]); | ||
| 404 | return -EINVAL; | ||
| 405 | } | ||
| 406 | |||
| 407 | uvc_trace(UVC_TRACE_DESCR, "Found format %s.\n", format->name); | ||
| 408 | |||
| 409 | buflen -= buffer[0]; | ||
| 410 | buffer += buffer[0]; | ||
| 411 | |||
| 412 | /* Parse the frame descriptors. Only uncompressed, MJPEG and frame | ||
| 413 | * based formats have frame descriptors. | ||
| 414 | */ | ||
| 415 | while (buflen > 2 && buffer[2] == ftype) { | ||
| 416 | frame = &format->frame[format->nframes]; | ||
| 417 | |||
| 418 | if (ftype != VS_FRAME_FRAME_BASED) | ||
| 419 | n = buflen > 25 ? buffer[25] : 0; | ||
| 420 | else | ||
| 421 | n = buflen > 21 ? buffer[21] : 0; | ||
| 422 | |||
| 423 | n = n ? n : 3; | ||
| 424 | |||
| 425 | if (buflen < 26 + 4*n) { | ||
| 426 | uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming" | ||
| 427 | "interface %d FRAME error\n", dev->udev->devnum, | ||
| 428 | alts->desc.bInterfaceNumber); | ||
| 429 | return -EINVAL; | ||
| 430 | } | ||
| 431 | |||
| 432 | frame->bFrameIndex = buffer[3]; | ||
| 433 | frame->bmCapabilities = buffer[4]; | ||
| 434 | frame->wWidth = le16_to_cpup((__le16 *)&buffer[5]); | ||
| 435 | frame->wHeight = le16_to_cpup((__le16 *)&buffer[7]); | ||
| 436 | frame->dwMinBitRate = le32_to_cpup((__le32 *)&buffer[9]); | ||
| 437 | frame->dwMaxBitRate = le32_to_cpup((__le32 *)&buffer[13]); | ||
| 438 | if (ftype != VS_FRAME_FRAME_BASED) { | ||
| 439 | frame->dwMaxVideoFrameBufferSize = | ||
| 440 | le32_to_cpup((__le32 *)&buffer[17]); | ||
| 441 | frame->dwDefaultFrameInterval = | ||
| 442 | le32_to_cpup((__le32 *)&buffer[21]); | ||
| 443 | frame->bFrameIntervalType = buffer[25]; | ||
| 444 | } else { | ||
| 445 | frame->dwMaxVideoFrameBufferSize = 0; | ||
| 446 | frame->dwDefaultFrameInterval = | ||
| 447 | le32_to_cpup((__le32 *)&buffer[17]); | ||
| 448 | frame->bFrameIntervalType = buffer[21]; | ||
| 449 | } | ||
| 450 | frame->dwFrameInterval = *intervals; | ||
| 451 | |||
| 452 | /* Several UVC chipsets screw up dwMaxVideoFrameBufferSize | ||
| 453 | * completely. Observed behaviours range from setting the | ||
| 454 | * value to 1.1x the actual frame size of hardwiring the | ||
| 455 | * 16 low bits to 0. This results in a higher than necessary | ||
| 456 | * memory usage as well as a wrong image size information. For | ||
| 457 | * uncompressed formats this can be fixed by computing the | ||
| 458 | * value from the frame size. | ||
| 459 | */ | ||
| 460 | if (!(format->flags & UVC_FMT_FLAG_COMPRESSED)) | ||
| 461 | frame->dwMaxVideoFrameBufferSize = format->bpp | ||
| 462 | * frame->wWidth * frame->wHeight / 8; | ||
| 463 | |||
| 464 | /* Some bogus devices report dwMinFrameInterval equal to | ||
| 465 | * dwMaxFrameInterval and have dwFrameIntervalStep set to | ||
| 466 | * zero. Setting all null intervals to 1 fixes the problem and | ||
| 467 | * some other divisions by zero which could happen. | ||
| 468 | */ | ||
| 469 | for (i = 0; i < n; ++i) { | ||
| 470 | interval = le32_to_cpup((__le32 *)&buffer[26+4*i]); | ||
| 471 | *(*intervals)++ = interval ? interval : 1; | ||
| 472 | } | ||
| 473 | |||
| 474 | /* Make sure that the default frame interval stays between | ||
| 475 | * the boundaries. | ||
| 476 | */ | ||
| 477 | n -= frame->bFrameIntervalType ? 1 : 2; | ||
| 478 | frame->dwDefaultFrameInterval = | ||
| 479 | min(frame->dwFrameInterval[n], | ||
| 480 | max(frame->dwFrameInterval[0], | ||
| 481 | frame->dwDefaultFrameInterval)); | ||
| 482 | |||
| 483 | uvc_trace(UVC_TRACE_DESCR, "- %ux%u (%u.%u fps)\n", | ||
| 484 | frame->wWidth, frame->wHeight, | ||
| 485 | 10000000/frame->dwDefaultFrameInterval, | ||
| 486 | (100000000/frame->dwDefaultFrameInterval)%10); | ||
| 487 | |||
| 488 | format->nframes++; | ||
| 489 | buflen -= buffer[0]; | ||
| 490 | buffer += buffer[0]; | ||
| 491 | } | ||
| 492 | |||
| 493 | if (buflen > 2 && buffer[2] == VS_STILL_IMAGE_FRAME) { | ||
| 494 | buflen -= buffer[0]; | ||
| 495 | buffer += buffer[0]; | ||
| 496 | } | ||
| 497 | |||
| 498 | if (buflen > 2 && buffer[2] == VS_COLORFORMAT) { | ||
| 499 | if (buflen < 6) { | ||
| 500 | uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming" | ||
| 501 | "interface %d COLORFORMAT error\n", | ||
| 502 | dev->udev->devnum, | ||
| 503 | alts->desc.bInterfaceNumber); | ||
| 504 | return -EINVAL; | ||
| 505 | } | ||
| 506 | |||
| 507 | format->colorspace = uvc_colorspace(buffer[3]); | ||
| 508 | |||
| 509 | buflen -= buffer[0]; | ||
| 510 | buffer += buffer[0]; | ||
| 511 | } | ||
| 512 | |||
| 513 | return buffer - start; | ||
| 514 | } | ||
| 515 | |||
| 516 | static int uvc_parse_streaming(struct uvc_device *dev, | ||
| 517 | struct usb_interface *intf) | ||
| 518 | { | ||
| 519 | struct uvc_streaming *streaming = NULL; | ||
| 520 | struct uvc_format *format; | ||
| 521 | struct uvc_frame *frame; | ||
| 522 | struct usb_host_interface *alts = &intf->altsetting[0]; | ||
| 523 | unsigned char *_buffer, *buffer = alts->extra; | ||
| 524 | int _buflen, buflen = alts->extralen; | ||
| 525 | unsigned int nformats = 0, nframes = 0, nintervals = 0; | ||
| 526 | unsigned int size, i, n, p; | ||
| 527 | __u32 *interval; | ||
| 528 | __u16 psize; | ||
| 529 | int ret = -EINVAL; | ||
| 530 | |||
| 531 | if (intf->cur_altsetting->desc.bInterfaceSubClass | ||
| 532 | != SC_VIDEOSTREAMING) { | ||
| 533 | uvc_trace(UVC_TRACE_DESCR, "device %d interface %d isn't a " | ||
| 534 | "video streaming interface\n", dev->udev->devnum, | ||
| 535 | intf->altsetting[0].desc.bInterfaceNumber); | ||
| 536 | return -EINVAL; | ||
| 537 | } | ||
| 538 | |||
| 539 | if (usb_driver_claim_interface(&uvc_driver.driver, intf, dev)) { | ||
| 540 | uvc_trace(UVC_TRACE_DESCR, "device %d interface %d is already " | ||
| 541 | "claimed\n", dev->udev->devnum, | ||
| 542 | intf->altsetting[0].desc.bInterfaceNumber); | ||
| 543 | return -EINVAL; | ||
| 544 | } | ||
| 545 | |||
| 546 | streaming = kzalloc(sizeof *streaming, GFP_KERNEL); | ||
| 547 | if (streaming == NULL) { | ||
| 548 | usb_driver_release_interface(&uvc_driver.driver, intf); | ||
| 549 | return -EINVAL; | ||
| 550 | } | ||
| 551 | |||
| 552 | mutex_init(&streaming->mutex); | ||
| 553 | streaming->intf = usb_get_intf(intf); | ||
| 554 | streaming->intfnum = intf->cur_altsetting->desc.bInterfaceNumber; | ||
| 555 | |||
| 556 | /* The Pico iMage webcam has its class-specific interface descriptors | ||
| 557 | * after the endpoint descriptors. | ||
| 558 | */ | ||
| 559 | if (buflen == 0) { | ||
| 560 | for (i = 0; i < alts->desc.bNumEndpoints; ++i) { | ||
| 561 | struct usb_host_endpoint *ep = &alts->endpoint[i]; | ||
| 562 | |||
| 563 | if (ep->extralen == 0) | ||
| 564 | continue; | ||
| 565 | |||
| 566 | if (ep->extralen > 2 && | ||
| 567 | ep->extra[1] == USB_DT_CS_INTERFACE) { | ||
| 568 | uvc_trace(UVC_TRACE_DESCR, "trying extra data " | ||
| 569 | "from endpoint %u.\n", i); | ||
| 570 | buffer = alts->endpoint[i].extra; | ||
| 571 | buflen = alts->endpoint[i].extralen; | ||
| 572 | break; | ||
| 573 | } | ||
| 574 | } | ||
| 575 | } | ||
| 576 | |||
| 577 | /* Skip the standard interface descriptors. */ | ||
| 578 | while (buflen > 2 && buffer[1] != USB_DT_CS_INTERFACE) { | ||
| 579 | buflen -= buffer[0]; | ||
| 580 | buffer += buffer[0]; | ||
| 581 | } | ||
| 582 | |||
| 583 | if (buflen <= 2) { | ||
| 584 | uvc_trace(UVC_TRACE_DESCR, "no class-specific streaming " | ||
| 585 | "interface descriptors found.\n"); | ||
| 586 | goto error; | ||
| 587 | } | ||
| 588 | |||
| 589 | /* Parse the header descriptor. */ | ||
| 590 | if (buffer[2] == VS_OUTPUT_HEADER) { | ||
| 591 | uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface " | ||
| 592 | "%d OUTPUT HEADER descriptor is not supported.\n", | ||
| 593 | dev->udev->devnum, alts->desc.bInterfaceNumber); | ||
| 594 | goto error; | ||
| 595 | } else if (buffer[2] == VS_INPUT_HEADER) { | ||
| 596 | p = buflen >= 5 ? buffer[3] : 0; | ||
| 597 | n = buflen >= 12 ? buffer[12] : 0; | ||
| 598 | |||
| 599 | if (buflen < 13 + p*n || buffer[2] != VS_INPUT_HEADER) { | ||
| 600 | uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming " | ||
| 601 | "interface %d INPUT HEADER descriptor is " | ||
| 602 | "invalid.\n", dev->udev->devnum, | ||
| 603 | alts->desc.bInterfaceNumber); | ||
| 604 | goto error; | ||
| 605 | } | ||
| 606 | |||
| 607 | streaming->header.bNumFormats = p; | ||
| 608 | streaming->header.bEndpointAddress = buffer[6]; | ||
| 609 | streaming->header.bmInfo = buffer[7]; | ||
| 610 | streaming->header.bTerminalLink = buffer[8]; | ||
| 611 | streaming->header.bStillCaptureMethod = buffer[9]; | ||
| 612 | streaming->header.bTriggerSupport = buffer[10]; | ||
| 613 | streaming->header.bTriggerUsage = buffer[11]; | ||
| 614 | streaming->header.bControlSize = n; | ||
| 615 | |||
| 616 | streaming->header.bmaControls = kmalloc(p*n, GFP_KERNEL); | ||
| 617 | if (streaming->header.bmaControls == NULL) { | ||
| 618 | ret = -ENOMEM; | ||
| 619 | goto error; | ||
| 620 | } | ||
| 621 | |||
| 622 | memcpy(streaming->header.bmaControls, &buffer[13], p*n); | ||
| 623 | } else { | ||
| 624 | uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface " | ||
| 625 | "%d HEADER descriptor not found.\n", dev->udev->devnum, | ||
| 626 | alts->desc.bInterfaceNumber); | ||
| 627 | goto error; | ||
| 628 | } | ||
| 629 | |||
| 630 | buflen -= buffer[0]; | ||
| 631 | buffer += buffer[0]; | ||
| 632 | |||
| 633 | _buffer = buffer; | ||
| 634 | _buflen = buflen; | ||
| 635 | |||
| 636 | /* Count the format and frame descriptors. */ | ||
| 637 | while (_buflen > 2) { | ||
| 638 | switch (_buffer[2]) { | ||
| 639 | case VS_FORMAT_UNCOMPRESSED: | ||
| 640 | case VS_FORMAT_MJPEG: | ||
| 641 | case VS_FORMAT_FRAME_BASED: | ||
| 642 | nformats++; | ||
| 643 | break; | ||
| 644 | |||
| 645 | case VS_FORMAT_DV: | ||
| 646 | /* DV format has no frame descriptor. We will create a | ||
| 647 | * dummy frame descriptor with a dummy frame interval. | ||
| 648 | */ | ||
| 649 | nformats++; | ||
| 650 | nframes++; | ||
| 651 | nintervals++; | ||
| 652 | break; | ||
| 653 | |||
| 654 | case VS_FORMAT_MPEG2TS: | ||
| 655 | case VS_FORMAT_STREAM_BASED: | ||
| 656 | uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming " | ||
| 657 | "interface %d FORMAT %u is not supported.\n", | ||
| 658 | dev->udev->devnum, | ||
| 659 | alts->desc.bInterfaceNumber, _buffer[2]); | ||
| 660 | break; | ||
| 661 | |||
| 662 | case VS_FRAME_UNCOMPRESSED: | ||
| 663 | case VS_FRAME_MJPEG: | ||
| 664 | nframes++; | ||
| 665 | if (_buflen > 25) | ||
| 666 | nintervals += _buffer[25] ? _buffer[25] : 3; | ||
| 667 | break; | ||
| 668 | |||
| 669 | case VS_FRAME_FRAME_BASED: | ||
| 670 | nframes++; | ||
| 671 | if (_buflen > 21) | ||
| 672 | nintervals += _buffer[21] ? _buffer[21] : 3; | ||
| 673 | break; | ||
| 674 | } | ||
| 675 | |||
| 676 | _buflen -= _buffer[0]; | ||
| 677 | _buffer += _buffer[0]; | ||
| 678 | } | ||
| 679 | |||
| 680 | if (nformats == 0) { | ||
| 681 | uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface " | ||
| 682 | "%d has no supported formats defined.\n", | ||
| 683 | dev->udev->devnum, alts->desc.bInterfaceNumber); | ||
| 684 | goto error; | ||
| 685 | } | ||
| 686 | |||
| 687 | size = nformats * sizeof *format + nframes * sizeof *frame | ||
| 688 | + nintervals * sizeof *interval; | ||
| 689 | format = kzalloc(size, GFP_KERNEL); | ||
| 690 | if (format == NULL) { | ||
| 691 | ret = -ENOMEM; | ||
| 692 | goto error; | ||
| 693 | } | ||
| 694 | |||
| 695 | frame = (struct uvc_frame *)&format[nformats]; | ||
| 696 | interval = (__u32 *)&frame[nframes]; | ||
| 697 | |||
| 698 | streaming->format = format; | ||
| 699 | streaming->nformats = nformats; | ||
| 700 | |||
| 701 | /* Parse the format descriptors. */ | ||
| 702 | while (buflen > 2) { | ||
| 703 | switch (buffer[2]) { | ||
| 704 | case VS_FORMAT_UNCOMPRESSED: | ||
| 705 | case VS_FORMAT_MJPEG: | ||
| 706 | case VS_FORMAT_DV: | ||
| 707 | case VS_FORMAT_FRAME_BASED: | ||
| 708 | format->frame = frame; | ||
| 709 | ret = uvc_parse_format(dev, streaming, format, | ||
| 710 | &interval, buffer, buflen); | ||
| 711 | if (ret < 0) | ||
| 712 | goto error; | ||
| 713 | |||
| 714 | frame += format->nframes; | ||
| 715 | format++; | ||
| 716 | |||
| 717 | buflen -= ret; | ||
| 718 | buffer += ret; | ||
| 719 | continue; | ||
| 720 | |||
| 721 | default: | ||
| 722 | break; | ||
| 723 | } | ||
| 724 | |||
| 725 | buflen -= buffer[0]; | ||
| 726 | buffer += buffer[0]; | ||
| 727 | } | ||
| 728 | |||
| 729 | /* Parse the alternate settings to find the maximum bandwidth. */ | ||
| 730 | for (i = 0; i < intf->num_altsetting; ++i) { | ||
| 731 | struct usb_host_endpoint *ep; | ||
| 732 | alts = &intf->altsetting[i]; | ||
| 733 | ep = uvc_find_endpoint(alts, | ||
| 734 | streaming->header.bEndpointAddress); | ||
| 735 | if (ep == NULL) | ||
| 736 | continue; | ||
| 737 | |||
| 738 | psize = le16_to_cpu(ep->desc.wMaxPacketSize); | ||
| 739 | psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3)); | ||
| 740 | if (psize > streaming->maxpsize) | ||
| 741 | streaming->maxpsize = psize; | ||
| 742 | } | ||
| 743 | |||
| 744 | list_add_tail(&streaming->list, &dev->streaming); | ||
| 745 | return 0; | ||
| 746 | |||
| 747 | error: | ||
| 748 | usb_driver_release_interface(&uvc_driver.driver, intf); | ||
| 749 | usb_put_intf(intf); | ||
| 750 | kfree(streaming->format); | ||
| 751 | kfree(streaming->header.bmaControls); | ||
| 752 | kfree(streaming); | ||
| 753 | return ret; | ||
| 754 | } | ||
| 755 | |||
| 756 | /* Parse vendor-specific extensions. */ | ||
| 757 | static int uvc_parse_vendor_control(struct uvc_device *dev, | ||
| 758 | const unsigned char *buffer, int buflen) | ||
| 759 | { | ||
| 760 | struct usb_device *udev = dev->udev; | ||
| 761 | struct usb_host_interface *alts = dev->intf->cur_altsetting; | ||
| 762 | struct uvc_entity *unit; | ||
| 763 | unsigned int n, p; | ||
| 764 | int handled = 0; | ||
| 765 | |||
| 766 | switch (le16_to_cpu(dev->udev->descriptor.idVendor)) { | ||
| 767 | case 0x046d: /* Logitech */ | ||
| 768 | if (buffer[1] != 0x41 || buffer[2] != 0x01) | ||
| 769 | break; | ||
| 770 | |||
| 771 | /* Logitech implements several vendor specific functions | ||
| 772 | * through vendor specific extension units (LXU). | ||
| 773 | * | ||
| 774 | * The LXU descriptors are similar to XU descriptors | ||
| 775 | * (see "USB Device Video Class for Video Devices", section | ||
| 776 | * 3.7.2.6 "Extension Unit Descriptor") with the following | ||
| 777 | * differences: | ||
| 778 | * | ||
| 779 | * ---------------------------------------------------------- | ||
| 780 | * 0 bLength 1 Number | ||
| 781 | * Size of this descriptor, in bytes: 24+p+n*2 | ||
| 782 | * ---------------------------------------------------------- | ||
| 783 | * 23+p+n bmControlsType N Bitmap | ||
| 784 | * Individual bits in the set are defined: | ||
| 785 | * 0: Absolute | ||
| 786 | * 1: Relative | ||
| 787 | * | ||
| 788 | * This bitset is mapped exactly the same as bmControls. | ||
| 789 | * ---------------------------------------------------------- | ||
| 790 | * 23+p+n*2 bReserved 1 Boolean | ||
| 791 | * ---------------------------------------------------------- | ||
| 792 | * 24+p+n*2 iExtension 1 Index | ||
| 793 | * Index of a string descriptor that describes this | ||
| 794 | * extension unit. | ||
| 795 | * ---------------------------------------------------------- | ||
| 796 | */ | ||
| 797 | p = buflen >= 22 ? buffer[21] : 0; | ||
| 798 | n = buflen >= 25 + p ? buffer[22+p] : 0; | ||
| 799 | |||
| 800 | if (buflen < 25 + p + 2*n) { | ||
| 801 | uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " | ||
| 802 | "interface %d EXTENSION_UNIT error\n", | ||
| 803 | udev->devnum, alts->desc.bInterfaceNumber); | ||
| 804 | break; | ||
| 805 | } | ||
| 806 | |||
| 807 | unit = kzalloc(sizeof *unit + p + 2*n, GFP_KERNEL); | ||
| 808 | if (unit == NULL) | ||
| 809 | return -ENOMEM; | ||
| 810 | |||
| 811 | unit->id = buffer[3]; | ||
| 812 | unit->type = VC_EXTENSION_UNIT; | ||
| 813 | memcpy(unit->extension.guidExtensionCode, &buffer[4], 16); | ||
| 814 | unit->extension.bNumControls = buffer[20]; | ||
| 815 | unit->extension.bNrInPins = | ||
| 816 | le16_to_cpup((__le16 *)&buffer[21]); | ||
| 817 | unit->extension.baSourceID = (__u8 *)unit + sizeof *unit; | ||
| 818 | memcpy(unit->extension.baSourceID, &buffer[22], p); | ||
| 819 | unit->extension.bControlSize = buffer[22+p]; | ||
| 820 | unit->extension.bmControls = (__u8 *)unit + sizeof *unit + p; | ||
| 821 | unit->extension.bmControlsType = (__u8 *)unit + sizeof *unit | ||
| 822 | + p + n; | ||
| 823 | memcpy(unit->extension.bmControls, &buffer[23+p], 2*n); | ||
| 824 | |||
| 825 | if (buffer[24+p+2*n] != 0) | ||
| 826 | usb_string(udev, buffer[24+p+2*n], unit->name, | ||
| 827 | sizeof unit->name); | ||
| 828 | else | ||
| 829 | sprintf(unit->name, "Extension %u", buffer[3]); | ||
| 830 | |||
| 831 | list_add_tail(&unit->list, &dev->entities); | ||
| 832 | handled = 1; | ||
| 833 | break; | ||
| 834 | } | ||
| 835 | |||
| 836 | return handled; | ||
| 837 | } | ||
| 838 | |||
| 839 | static int uvc_parse_standard_control(struct uvc_device *dev, | ||
| 840 | const unsigned char *buffer, int buflen) | ||
| 841 | { | ||
| 842 | struct usb_device *udev = dev->udev; | ||
| 843 | struct uvc_entity *unit, *term; | ||
| 844 | struct usb_interface *intf; | ||
| 845 | struct usb_host_interface *alts = dev->intf->cur_altsetting; | ||
| 846 | unsigned int i, n, p, len; | ||
| 847 | __u16 type; | ||
| 848 | |||
| 849 | switch (buffer[2]) { | ||
| 850 | case VC_HEADER: | ||
| 851 | n = buflen >= 12 ? buffer[11] : 0; | ||
| 852 | |||
| 853 | if (buflen < 12 || buflen < 12 + n) { | ||
| 854 | uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " | ||
| 855 | "interface %d HEADER error\n", udev->devnum, | ||
| 856 | alts->desc.bInterfaceNumber); | ||
| 857 | return -EINVAL; | ||
| 858 | } | ||
| 859 | |||
| 860 | dev->uvc_version = le16_to_cpup((__le16 *)&buffer[3]); | ||
| 861 | dev->clock_frequency = le32_to_cpup((__le32 *)&buffer[7]); | ||
| 862 | |||
| 863 | /* Parse all USB Video Streaming interfaces. */ | ||
| 864 | for (i = 0; i < n; ++i) { | ||
| 865 | intf = usb_ifnum_to_if(udev, buffer[12+i]); | ||
| 866 | if (intf == NULL) { | ||
| 867 | uvc_trace(UVC_TRACE_DESCR, "device %d " | ||
| 868 | "interface %d doesn't exists\n", | ||
| 869 | udev->devnum, i); | ||
| 870 | continue; | ||
| 871 | } | ||
| 872 | |||
| 873 | uvc_parse_streaming(dev, intf); | ||
| 874 | } | ||
| 875 | break; | ||
| 876 | |||
| 877 | case VC_INPUT_TERMINAL: | ||
| 878 | if (buflen < 8) { | ||
| 879 | uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " | ||
| 880 | "interface %d INPUT_TERMINAL error\n", | ||
| 881 | udev->devnum, alts->desc.bInterfaceNumber); | ||
| 882 | return -EINVAL; | ||
| 883 | } | ||
| 884 | |||
| 885 | /* Make sure the terminal type MSB is not null, otherwise it | ||
| 886 | * could be confused with a unit. | ||
| 887 | */ | ||
| 888 | type = le16_to_cpup((__le16 *)&buffer[4]); | ||
| 889 | if ((type & 0xff00) == 0) { | ||
| 890 | uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " | ||
| 891 | "interface %d INPUT_TERMINAL %d has invalid " | ||
| 892 | "type 0x%04x, skipping\n", udev->devnum, | ||
| 893 | alts->desc.bInterfaceNumber, | ||
| 894 | buffer[3], type); | ||
| 895 | return 0; | ||
| 896 | } | ||
| 897 | |||
| 898 | n = 0; | ||
| 899 | p = 0; | ||
| 900 | len = 8; | ||
| 901 | |||
| 902 | if (type == ITT_CAMERA) { | ||
| 903 | n = buflen >= 15 ? buffer[14] : 0; | ||
| 904 | len = 15; | ||
| 905 | |||
| 906 | } else if (type == ITT_MEDIA_TRANSPORT_INPUT) { | ||
| 907 | n = buflen >= 9 ? buffer[8] : 0; | ||
| 908 | p = buflen >= 10 + n ? buffer[9+n] : 0; | ||
| 909 | len = 10; | ||
| 910 | } | ||
| 911 | |||
| 912 | if (buflen < len + n + p) { | ||
| 913 | uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " | ||
| 914 | "interface %d INPUT_TERMINAL error\n", | ||
| 915 | udev->devnum, alts->desc.bInterfaceNumber); | ||
| 916 | return -EINVAL; | ||
| 917 | } | ||
| 918 | |||
| 919 | term = kzalloc(sizeof *term + n + p, GFP_KERNEL); | ||
| 920 | if (term == NULL) | ||
| 921 | return -ENOMEM; | ||
| 922 | |||
| 923 | term->id = buffer[3]; | ||
| 924 | term->type = type | UVC_TERM_INPUT; | ||
| 925 | |||
| 926 | if (UVC_ENTITY_TYPE(term) == ITT_CAMERA) { | ||
| 927 | term->camera.bControlSize = n; | ||
| 928 | term->camera.bmControls = (__u8 *)term + sizeof *term; | ||
| 929 | term->camera.wObjectiveFocalLengthMin = | ||
| 930 | le16_to_cpup((__le16 *)&buffer[8]); | ||
| 931 | term->camera.wObjectiveFocalLengthMax = | ||
| 932 | le16_to_cpup((__le16 *)&buffer[10]); | ||
| 933 | term->camera.wOcularFocalLength = | ||
| 934 | le16_to_cpup((__le16 *)&buffer[12]); | ||
| 935 | memcpy(term->camera.bmControls, &buffer[15], n); | ||
| 936 | } else if (UVC_ENTITY_TYPE(term) == ITT_MEDIA_TRANSPORT_INPUT) { | ||
| 937 | term->media.bControlSize = n; | ||
| 938 | term->media.bmControls = (__u8 *)term + sizeof *term; | ||
| 939 | term->media.bTransportModeSize = p; | ||
| 940 | term->media.bmTransportModes = (__u8 *)term | ||
| 941 | + sizeof *term + n; | ||
| 942 | memcpy(term->media.bmControls, &buffer[9], n); | ||
| 943 | memcpy(term->media.bmTransportModes, &buffer[10+n], p); | ||
| 944 | } | ||
| 945 | |||
| 946 | if (buffer[7] != 0) | ||
| 947 | usb_string(udev, buffer[7], term->name, | ||
| 948 | sizeof term->name); | ||
| 949 | else if (UVC_ENTITY_TYPE(term) == ITT_CAMERA) | ||
| 950 | sprintf(term->name, "Camera %u", buffer[3]); | ||
| 951 | else if (UVC_ENTITY_TYPE(term) == ITT_MEDIA_TRANSPORT_INPUT) | ||
| 952 | sprintf(term->name, "Media %u", buffer[3]); | ||
| 953 | else | ||
| 954 | sprintf(term->name, "Input %u", buffer[3]); | ||
| 955 | |||
| 956 | list_add_tail(&term->list, &dev->entities); | ||
| 957 | break; | ||
| 958 | |||
| 959 | case VC_OUTPUT_TERMINAL: | ||
| 960 | if (buflen < 9) { | ||
| 961 | uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " | ||
| 962 | "interface %d OUTPUT_TERMINAL error\n", | ||
| 963 | udev->devnum, alts->desc.bInterfaceNumber); | ||
| 964 | return -EINVAL; | ||
| 965 | } | ||
| 966 | |||
| 967 | /* Make sure the terminal type MSB is not null, otherwise it | ||
| 968 | * could be confused with a unit. | ||
| 969 | */ | ||
| 970 | type = le16_to_cpup((__le16 *)&buffer[4]); | ||
| 971 | if ((type & 0xff00) == 0) { | ||
| 972 | uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " | ||
| 973 | "interface %d OUTPUT_TERMINAL %d has invalid " | ||
| 974 | "type 0x%04x, skipping\n", udev->devnum, | ||
| 975 | alts->desc.bInterfaceNumber, buffer[3], type); | ||
| 976 | return 0; | ||
| 977 | } | ||
| 978 | |||
| 979 | term = kzalloc(sizeof *term, GFP_KERNEL); | ||
| 980 | if (term == NULL) | ||
| 981 | return -ENOMEM; | ||
| 982 | |||
| 983 | term->id = buffer[3]; | ||
| 984 | term->type = type | UVC_TERM_OUTPUT; | ||
| 985 | term->output.bSourceID = buffer[7]; | ||
| 986 | |||
| 987 | if (buffer[8] != 0) | ||
| 988 | usb_string(udev, buffer[8], term->name, | ||
| 989 | sizeof term->name); | ||
| 990 | else | ||
| 991 | sprintf(term->name, "Output %u", buffer[3]); | ||
| 992 | |||
| 993 | list_add_tail(&term->list, &dev->entities); | ||
| 994 | break; | ||
| 995 | |||
| 996 | case VC_SELECTOR_UNIT: | ||
| 997 | p = buflen >= 5 ? buffer[4] : 0; | ||
| 998 | |||
| 999 | if (buflen < 5 || buflen < 6 + p) { | ||
| 1000 | uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " | ||
| 1001 | "interface %d SELECTOR_UNIT error\n", | ||
| 1002 | udev->devnum, alts->desc.bInterfaceNumber); | ||
| 1003 | return -EINVAL; | ||
| 1004 | } | ||
| 1005 | |||
| 1006 | unit = kzalloc(sizeof *unit + p, GFP_KERNEL); | ||
| 1007 | if (unit == NULL) | ||
| 1008 | return -ENOMEM; | ||
| 1009 | |||
| 1010 | unit->id = buffer[3]; | ||
| 1011 | unit->type = buffer[2]; | ||
| 1012 | unit->selector.bNrInPins = buffer[4]; | ||
| 1013 | unit->selector.baSourceID = (__u8 *)unit + sizeof *unit; | ||
| 1014 | memcpy(unit->selector.baSourceID, &buffer[5], p); | ||
| 1015 | |||
| 1016 | if (buffer[5+p] != 0) | ||
| 1017 | usb_string(udev, buffer[5+p], unit->name, | ||
| 1018 | sizeof unit->name); | ||
| 1019 | else | ||
| 1020 | sprintf(unit->name, "Selector %u", buffer[3]); | ||
| 1021 | |||
| 1022 | list_add_tail(&unit->list, &dev->entities); | ||
| 1023 | break; | ||
| 1024 | |||
| 1025 | case VC_PROCESSING_UNIT: | ||
| 1026 | n = buflen >= 8 ? buffer[7] : 0; | ||
| 1027 | p = dev->uvc_version >= 0x0110 ? 10 : 9; | ||
| 1028 | |||
| 1029 | if (buflen < p + n) { | ||
| 1030 | uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " | ||
| 1031 | "interface %d PROCESSING_UNIT error\n", | ||
| 1032 | udev->devnum, alts->desc.bInterfaceNumber); | ||
| 1033 | return -EINVAL; | ||
| 1034 | } | ||
| 1035 | |||
| 1036 | unit = kzalloc(sizeof *unit + n, GFP_KERNEL); | ||
| 1037 | if (unit == NULL) | ||
| 1038 | return -ENOMEM; | ||
| 1039 | |||
| 1040 | unit->id = buffer[3]; | ||
| 1041 | unit->type = buffer[2]; | ||
| 1042 | unit->processing.bSourceID = buffer[4]; | ||
| 1043 | unit->processing.wMaxMultiplier = | ||
| 1044 | le16_to_cpup((__le16 *)&buffer[5]); | ||
| 1045 | unit->processing.bControlSize = buffer[7]; | ||
| 1046 | unit->processing.bmControls = (__u8 *)unit + sizeof *unit; | ||
| 1047 | memcpy(unit->processing.bmControls, &buffer[8], n); | ||
| 1048 | if (dev->uvc_version >= 0x0110) | ||
| 1049 | unit->processing.bmVideoStandards = buffer[9+n]; | ||
| 1050 | |||
| 1051 | if (buffer[8+n] != 0) | ||
| 1052 | usb_string(udev, buffer[8+n], unit->name, | ||
| 1053 | sizeof unit->name); | ||
| 1054 | else | ||
| 1055 | sprintf(unit->name, "Processing %u", buffer[3]); | ||
| 1056 | |||
| 1057 | list_add_tail(&unit->list, &dev->entities); | ||
| 1058 | break; | ||
| 1059 | |||
| 1060 | case VC_EXTENSION_UNIT: | ||
| 1061 | p = buflen >= 22 ? buffer[21] : 0; | ||
| 1062 | n = buflen >= 24 + p ? buffer[22+p] : 0; | ||
| 1063 | |||
| 1064 | if (buflen < 24 + p + n) { | ||
| 1065 | uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " | ||
| 1066 | "interface %d EXTENSION_UNIT error\n", | ||
| 1067 | udev->devnum, alts->desc.bInterfaceNumber); | ||
| 1068 | return -EINVAL; | ||
| 1069 | } | ||
| 1070 | |||
| 1071 | unit = kzalloc(sizeof *unit + p + n, GFP_KERNEL); | ||
| 1072 | if (unit == NULL) | ||
| 1073 | return -ENOMEM; | ||
| 1074 | |||
| 1075 | unit->id = buffer[3]; | ||
| 1076 | unit->type = buffer[2]; | ||
| 1077 | memcpy(unit->extension.guidExtensionCode, &buffer[4], 16); | ||
| 1078 | unit->extension.bNumControls = buffer[20]; | ||
| 1079 | unit->extension.bNrInPins = | ||
| 1080 | le16_to_cpup((__le16 *)&buffer[21]); | ||
| 1081 | unit->extension.baSourceID = (__u8 *)unit + sizeof *unit; | ||
| 1082 | memcpy(unit->extension.baSourceID, &buffer[22], p); | ||
| 1083 | unit->extension.bControlSize = buffer[22+p]; | ||
| 1084 | unit->extension.bmControls = (__u8 *)unit + sizeof *unit + p; | ||
| 1085 | memcpy(unit->extension.bmControls, &buffer[23+p], n); | ||
| 1086 | |||
| 1087 | if (buffer[23+p+n] != 0) | ||
| 1088 | usb_string(udev, buffer[23+p+n], unit->name, | ||
| 1089 | sizeof unit->name); | ||
| 1090 | else | ||
| 1091 | sprintf(unit->name, "Extension %u", buffer[3]); | ||
| 1092 | |||
| 1093 | list_add_tail(&unit->list, &dev->entities); | ||
| 1094 | break; | ||
| 1095 | |||
| 1096 | default: | ||
| 1097 | uvc_trace(UVC_TRACE_DESCR, "Found an unknown CS_INTERFACE " | ||
| 1098 | "descriptor (%u)\n", buffer[2]); | ||
| 1099 | break; | ||
| 1100 | } | ||
| 1101 | |||
| 1102 | return 0; | ||
| 1103 | } | ||
| 1104 | |||
| 1105 | static int uvc_parse_control(struct uvc_device *dev) | ||
| 1106 | { | ||
| 1107 | struct usb_host_interface *alts = dev->intf->cur_altsetting; | ||
| 1108 | unsigned char *buffer = alts->extra; | ||
| 1109 | int buflen = alts->extralen; | ||
| 1110 | int ret; | ||
| 1111 | |||
| 1112 | /* Parse the default alternate setting only, as the UVC specification | ||
| 1113 | * defines a single alternate setting, the default alternate setting | ||
| 1114 | * zero. | ||
| 1115 | */ | ||
| 1116 | |||
| 1117 | while (buflen > 2) { | ||
| 1118 | if (uvc_parse_vendor_control(dev, buffer, buflen) || | ||
| 1119 | buffer[1] != USB_DT_CS_INTERFACE) | ||
| 1120 | goto next_descriptor; | ||
| 1121 | |||
| 1122 | if ((ret = uvc_parse_standard_control(dev, buffer, buflen)) < 0) | ||
| 1123 | return ret; | ||
| 1124 | |||
| 1125 | next_descriptor: | ||
| 1126 | buflen -= buffer[0]; | ||
| 1127 | buffer += buffer[0]; | ||
| 1128 | } | ||
| 1129 | |||
| 1130 | /* Check if the optional status endpoint is present. */ | ||
| 1131 | if (alts->desc.bNumEndpoints == 1) { | ||
| 1132 | struct usb_host_endpoint *ep = &alts->endpoint[0]; | ||
| 1133 | struct usb_endpoint_descriptor *desc = &ep->desc; | ||
| 1134 | |||
| 1135 | if (usb_endpoint_is_int_in(desc) && | ||
| 1136 | le16_to_cpu(desc->wMaxPacketSize) >= 8 && | ||
| 1137 | desc->bInterval != 0) { | ||
| 1138 | uvc_trace(UVC_TRACE_DESCR, "Found a Status endpoint " | ||
| 1139 | "(addr %02x).\n", desc->bEndpointAddress); | ||
| 1140 | dev->int_ep = ep; | ||
| 1141 | } | ||
| 1142 | } | ||
| 1143 | |||
| 1144 | return 0; | ||
| 1145 | } | ||
| 1146 | |||
| 1147 | /* ------------------------------------------------------------------------ | ||
| 1148 | * USB probe and disconnect | ||
| 1149 | */ | ||
| 1150 | |||
| 1151 | /* | ||
| 1152 | * Unregister the video devices. | ||
| 1153 | */ | ||
| 1154 | static void uvc_unregister_video(struct uvc_device *dev) | ||
| 1155 | { | ||
| 1156 | if (dev->video.vdev) { | ||
| 1157 | if (dev->video.vdev->minor == -1) | ||
| 1158 | video_device_release(dev->video.vdev); | ||
| 1159 | else | ||
| 1160 | video_unregister_device(dev->video.vdev); | ||
| 1161 | dev->video.vdev = NULL; | ||
| 1162 | } | ||
| 1163 | } | ||
| 1164 | |||
| 1165 | /* | ||
| 1166 | * Scan the UVC descriptors to locate a chain starting at an Output Terminal | ||
| 1167 | * and containing the following units: | ||
| 1168 | * | ||
| 1169 | * - a USB Streaming Output Terminal | ||
| 1170 | * - zero or one Processing Unit | ||
| 1171 | * - zero, one or mode single-input Selector Units | ||
| 1172 | * - zero or one multiple-input Selector Units, provided all inputs are | ||
| 1173 | * connected to input terminals | ||
| 1174 | * - zero, one or mode single-input Extension Units | ||
| 1175 | * - one Camera Input Terminal, or one or more External terminals. | ||
| 1176 | * | ||
| 1177 | * A side forward scan is made on each detected entity to check for additional | ||
| 1178 | * extension units. | ||
| 1179 | */ | ||
| 1180 | static int uvc_scan_chain_entity(struct uvc_video_device *video, | ||
| 1181 | struct uvc_entity *entity) | ||
| 1182 | { | ||
| 1183 | switch (UVC_ENTITY_TYPE(entity)) { | ||
| 1184 | case VC_EXTENSION_UNIT: | ||
| 1185 | if (uvc_trace_param & UVC_TRACE_PROBE) | ||
| 1186 | printk(" <- XU %d", entity->id); | ||
| 1187 | |||
| 1188 | if (entity->extension.bNrInPins != 1) { | ||
| 1189 | uvc_trace(UVC_TRACE_DESCR, "Extension unit %d has more " | ||
| 1190 | "than 1 input pin.\n", entity->id); | ||
| 1191 | return -1; | ||
| 1192 | } | ||
| 1193 | |||
| 1194 | list_add_tail(&entity->chain, &video->extensions); | ||
| 1195 | break; | ||
| 1196 | |||
| 1197 | case VC_PROCESSING_UNIT: | ||
| 1198 | if (uvc_trace_param & UVC_TRACE_PROBE) | ||
| 1199 | printk(" <- PU %d", entity->id); | ||
| 1200 | |||
| 1201 | if (video->processing != NULL) { | ||
| 1202 | uvc_trace(UVC_TRACE_DESCR, "Found multiple " | ||
| 1203 | "Processing Units in chain.\n"); | ||
| 1204 | return -1; | ||
| 1205 | } | ||
| 1206 | |||
| 1207 | video->processing = entity; | ||
| 1208 | break; | ||
| 1209 | |||
| 1210 | case VC_SELECTOR_UNIT: | ||
| 1211 | if (uvc_trace_param & UVC_TRACE_PROBE) | ||
| 1212 | printk(" <- SU %d", entity->id); | ||
| 1213 | |||
| 1214 | /* Single-input selector units are ignored. */ | ||
| 1215 | if (entity->selector.bNrInPins == 1) | ||
| 1216 | break; | ||
| 1217 | |||
| 1218 | if (video->selector != NULL) { | ||
| 1219 | uvc_trace(UVC_TRACE_DESCR, "Found multiple Selector " | ||
| 1220 | "Units in chain.\n"); | ||
| 1221 | return -1; | ||
| 1222 | } | ||
| 1223 | |||
| 1224 | video->selector = entity; | ||
| 1225 | break; | ||
| 1226 | |||
| 1227 | case ITT_VENDOR_SPECIFIC: | ||
| 1228 | case ITT_CAMERA: | ||
| 1229 | case ITT_MEDIA_TRANSPORT_INPUT: | ||
| 1230 | if (uvc_trace_param & UVC_TRACE_PROBE) | ||
| 1231 | printk(" <- IT %d\n", entity->id); | ||
| 1232 | |||
| 1233 | list_add_tail(&entity->chain, &video->iterms); | ||
| 1234 | break; | ||
| 1235 | |||
| 1236 | default: | ||
| 1237 | uvc_trace(UVC_TRACE_DESCR, "Unsupported entity type " | ||
| 1238 | "0x%04x found in chain.\n", UVC_ENTITY_TYPE(entity)); | ||
| 1239 | return -1; | ||
| 1240 | } | ||
| 1241 | |||
| 1242 | return 0; | ||
| 1243 | } | ||
| 1244 | |||
| 1245 | static int uvc_scan_chain_forward(struct uvc_video_device *video, | ||
| 1246 | struct uvc_entity *entity, struct uvc_entity *prev) | ||
| 1247 | { | ||
| 1248 | struct uvc_entity *forward; | ||
| 1249 | int found; | ||
| 1250 | |||
| 1251 | /* Forward scan */ | ||
| 1252 | forward = NULL; | ||
| 1253 | found = 0; | ||
| 1254 | |||
| 1255 | while (1) { | ||
| 1256 | forward = uvc_entity_by_reference(video->dev, entity->id, | ||
| 1257 | forward); | ||
| 1258 | if (forward == NULL) | ||
| 1259 | break; | ||
| 1260 | |||
| 1261 | if (UVC_ENTITY_TYPE(forward) != VC_EXTENSION_UNIT || | ||
| 1262 | forward == prev) | ||
| 1263 | continue; | ||
| 1264 | |||
| 1265 | if (forward->extension.bNrInPins != 1) { | ||
| 1266 | uvc_trace(UVC_TRACE_DESCR, "Extension unit %d has" | ||
| 1267 | "more than 1 input pin.\n", entity->id); | ||
| 1268 | return -1; | ||
| 1269 | } | ||
| 1270 | |||
| 1271 | list_add_tail(&forward->chain, &video->extensions); | ||
| 1272 | if (uvc_trace_param & UVC_TRACE_PROBE) { | ||
| 1273 | if (!found) | ||
| 1274 | printk(" (-> XU"); | ||
| 1275 | |||
| 1276 | printk(" %d", forward->id); | ||
| 1277 | found = 1; | ||
| 1278 | } | ||
| 1279 | } | ||
| 1280 | if (found) | ||
| 1281 | printk(")"); | ||
| 1282 | |||
| 1283 | return 0; | ||
| 1284 | } | ||
| 1285 | |||
| 1286 | static int uvc_scan_chain_backward(struct uvc_video_device *video, | ||
| 1287 | struct uvc_entity *entity) | ||
| 1288 | { | ||
| 1289 | struct uvc_entity *term; | ||
| 1290 | int id = -1, i; | ||
| 1291 | |||
| 1292 | switch (UVC_ENTITY_TYPE(entity)) { | ||
| 1293 | case VC_EXTENSION_UNIT: | ||
| 1294 | id = entity->extension.baSourceID[0]; | ||
| 1295 | break; | ||
| 1296 | |||
| 1297 | case VC_PROCESSING_UNIT: | ||
| 1298 | id = entity->processing.bSourceID; | ||
| 1299 | break; | ||
| 1300 | |||
| 1301 | case VC_SELECTOR_UNIT: | ||
| 1302 | /* Single-input selector units are ignored. */ | ||
| 1303 | if (entity->selector.bNrInPins == 1) { | ||
| 1304 | id = entity->selector.baSourceID[0]; | ||
| 1305 | break; | ||
| 1306 | } | ||
| 1307 | |||
| 1308 | if (uvc_trace_param & UVC_TRACE_PROBE) | ||
| 1309 | printk(" <- IT"); | ||
| 1310 | |||
| 1311 | video->selector = entity; | ||
| 1312 | for (i = 0; i < entity->selector.bNrInPins; ++i) { | ||
| 1313 | id = entity->selector.baSourceID[i]; | ||
| 1314 | term = uvc_entity_by_id(video->dev, id); | ||
| 1315 | if (term == NULL || !UVC_ENTITY_IS_ITERM(term)) { | ||
| 1316 | uvc_trace(UVC_TRACE_DESCR, "Selector unit %d " | ||
| 1317 | "input %d isn't connected to an " | ||
| 1318 | "input terminal\n", entity->id, i); | ||
| 1319 | return -1; | ||
| 1320 | } | ||
| 1321 | |||
| 1322 | if (uvc_trace_param & UVC_TRACE_PROBE) | ||
| 1323 | printk(" %d", term->id); | ||
| 1324 | |||
| 1325 | list_add_tail(&term->chain, &video->iterms); | ||
| 1326 | uvc_scan_chain_forward(video, term, entity); | ||
| 1327 | } | ||
| 1328 | |||
| 1329 | if (uvc_trace_param & UVC_TRACE_PROBE) | ||
| 1330 | printk("\n"); | ||
| 1331 | |||
| 1332 | id = 0; | ||
| 1333 | break; | ||
| 1334 | } | ||
| 1335 | |||
| 1336 | return id; | ||
| 1337 | } | ||
| 1338 | |||
| 1339 | static int uvc_scan_chain(struct uvc_video_device *video) | ||
| 1340 | { | ||
| 1341 | struct uvc_entity *entity, *prev; | ||
| 1342 | int id; | ||
| 1343 | |||
| 1344 | entity = video->oterm; | ||
| 1345 | uvc_trace(UVC_TRACE_PROBE, "Scanning UVC chain: OT %d", entity->id); | ||
| 1346 | id = entity->output.bSourceID; | ||
| 1347 | while (id != 0) { | ||
| 1348 | prev = entity; | ||
| 1349 | entity = uvc_entity_by_id(video->dev, id); | ||
| 1350 | if (entity == NULL) { | ||
| 1351 | uvc_trace(UVC_TRACE_DESCR, "Found reference to " | ||
| 1352 | "unknown entity %d.\n", id); | ||
| 1353 | return -1; | ||
| 1354 | } | ||
| 1355 | |||
| 1356 | /* Process entity */ | ||
| 1357 | if (uvc_scan_chain_entity(video, entity) < 0) | ||
| 1358 | return -1; | ||
| 1359 | |||
| 1360 | /* Forward scan */ | ||
| 1361 | if (uvc_scan_chain_forward(video, entity, prev) < 0) | ||
| 1362 | return -1; | ||
| 1363 | |||
| 1364 | /* Stop when a terminal is found. */ | ||
| 1365 | if (!UVC_ENTITY_IS_UNIT(entity)) | ||
| 1366 | break; | ||
| 1367 | |||
| 1368 | /* Backward scan */ | ||
| 1369 | id = uvc_scan_chain_backward(video, entity); | ||
| 1370 | if (id < 0) | ||
| 1371 | return id; | ||
| 1372 | } | ||
| 1373 | |||
| 1374 | /* Initialize the video buffers queue. */ | ||
| 1375 | uvc_queue_init(&video->queue); | ||
| 1376 | |||
| 1377 | return 0; | ||
| 1378 | } | ||
| 1379 | |||
| 1380 | /* | ||
| 1381 | * Register the video devices. | ||
| 1382 | * | ||
| 1383 | * The driver currently supports a single video device per control interface | ||
| 1384 | * only. The terminal and units must match the following structure: | ||
| 1385 | * | ||
| 1386 | * ITT_CAMERA -> VC_PROCESSING_UNIT -> VC_EXTENSION_UNIT{0,n} -> TT_STREAMING | ||
| 1387 | * | ||
| 1388 | * The Extension Units, if present, must have a single input pin. The | ||
| 1389 | * Processing Unit and Extension Units can be in any order. Additional | ||
| 1390 | * Extension Units connected to the main chain as single-unit branches are | ||
| 1391 | * also supported. | ||
| 1392 | */ | ||
| 1393 | static int uvc_register_video(struct uvc_device *dev) | ||
| 1394 | { | ||
| 1395 | struct video_device *vdev; | ||
| 1396 | struct uvc_entity *term; | ||
| 1397 | int found = 0, ret; | ||
| 1398 | |||
| 1399 | /* Check if the control interface matches the structure we expect. */ | ||
| 1400 | list_for_each_entry(term, &dev->entities, list) { | ||
| 1401 | struct uvc_streaming *streaming; | ||
| 1402 | |||
| 1403 | if (UVC_ENTITY_TYPE(term) != TT_STREAMING) | ||
| 1404 | continue; | ||
| 1405 | |||
| 1406 | memset(&dev->video, 0, sizeof dev->video); | ||
| 1407 | mutex_init(&dev->video.ctrl_mutex); | ||
| 1408 | INIT_LIST_HEAD(&dev->video.iterms); | ||
| 1409 | INIT_LIST_HEAD(&dev->video.extensions); | ||
| 1410 | dev->video.oterm = term; | ||
| 1411 | dev->video.dev = dev; | ||
| 1412 | if (uvc_scan_chain(&dev->video) < 0) | ||
| 1413 | continue; | ||
| 1414 | |||
| 1415 | list_for_each_entry(streaming, &dev->streaming, list) { | ||
| 1416 | if (streaming->header.bTerminalLink == term->id) { | ||
| 1417 | dev->video.streaming = streaming; | ||
| 1418 | found = 1; | ||
| 1419 | break; | ||
| 1420 | } | ||
| 1421 | } | ||
| 1422 | |||
| 1423 | if (found) | ||
| 1424 | break; | ||
| 1425 | } | ||
| 1426 | |||
| 1427 | if (!found) { | ||
| 1428 | uvc_printk(KERN_INFO, "No valid video chain found.\n"); | ||
| 1429 | return -1; | ||
| 1430 | } | ||
| 1431 | |||
| 1432 | if (uvc_trace_param & UVC_TRACE_PROBE) { | ||
| 1433 | uvc_printk(KERN_INFO, "Found a valid video chain ("); | ||
| 1434 | list_for_each_entry(term, &dev->video.iterms, chain) { | ||
| 1435 | printk("%d", term->id); | ||
| 1436 | if (term->chain.next != &dev->video.iterms) | ||
| 1437 | printk(","); | ||
| 1438 | } | ||
| 1439 | printk(" -> %d).\n", dev->video.oterm->id); | ||
| 1440 | } | ||
| 1441 | |||
| 1442 | /* Initialize the streaming interface with default streaming | ||
| 1443 | * parameters. | ||
| 1444 | */ | ||
| 1445 | if ((ret = uvc_video_init(&dev->video)) < 0) { | ||
| 1446 | uvc_printk(KERN_ERR, "Failed to initialize the device " | ||
| 1447 | "(%d).\n", ret); | ||
| 1448 | return ret; | ||
| 1449 | } | ||
| 1450 | |||
| 1451 | /* Register the device with V4L. */ | ||
| 1452 | vdev = video_device_alloc(); | ||
| 1453 | if (vdev == NULL) | ||
| 1454 | return -1; | ||
| 1455 | |||
| 1456 | /* We already hold a reference to dev->udev. The video device will be | ||
| 1457 | * unregistered before the reference is released, so we don't need to | ||
| 1458 | * get another one. | ||
| 1459 | */ | ||
| 1460 | vdev->dev = &dev->intf->dev; | ||
| 1461 | vdev->type = 0; | ||
| 1462 | vdev->type2 = 0; | ||
| 1463 | vdev->minor = -1; | ||
| 1464 | vdev->fops = &uvc_fops; | ||
| 1465 | vdev->release = video_device_release; | ||
| 1466 | strncpy(vdev->name, dev->name, sizeof vdev->name); | ||
| 1467 | |||
| 1468 | /* Set the driver data before calling video_register_device, otherwise | ||
| 1469 | * uvc_v4l2_open might race us. | ||
| 1470 | * | ||
| 1471 | * FIXME: usb_set_intfdata hasn't been called so far. Is that a | ||
| 1472 | * problem ? Does any function which could be called here get | ||
| 1473 | * a pointer to the usb_interface ? | ||
| 1474 | */ | ||
| 1475 | dev->video.vdev = vdev; | ||
| 1476 | video_set_drvdata(vdev, &dev->video); | ||
| 1477 | |||
| 1478 | if (video_register_device(vdev, VFL_TYPE_GRABBER, -1) < 0) { | ||
| 1479 | dev->video.vdev = NULL; | ||
| 1480 | video_device_release(vdev); | ||
| 1481 | return -1; | ||
| 1482 | } | ||
| 1483 | |||
| 1484 | return 0; | ||
| 1485 | } | ||
| 1486 | |||
| 1487 | /* | ||
| 1488 | * Delete the UVC device. | ||
| 1489 | * | ||
| 1490 | * Called by the kernel when the last reference to the uvc_device structure | ||
| 1491 | * is released. | ||
| 1492 | * | ||
| 1493 | * Unregistering the video devices is done here because every opened instance | ||
| 1494 | * must be closed before the device can be unregistered. An alternative would | ||
| 1495 | * have been to use another reference count for uvc_v4l2_open/uvc_release, and | ||
| 1496 | * unregister the video devices on disconnect when that reference count drops | ||
| 1497 | * to zero. | ||
| 1498 | * | ||
| 1499 | * As this function is called after or during disconnect(), all URBs have | ||
| 1500 | * already been canceled by the USB core. There is no need to kill the | ||
| 1501 | * interrupt URB manually. | ||
| 1502 | */ | ||
| 1503 | void uvc_delete(struct kref *kref) | ||
| 1504 | { | ||
| 1505 | struct uvc_device *dev = container_of(kref, struct uvc_device, kref); | ||
| 1506 | struct list_head *p, *n; | ||
| 1507 | |||
| 1508 | /* Unregister the video device */ | ||
| 1509 | uvc_unregister_video(dev); | ||
| 1510 | usb_put_intf(dev->intf); | ||
| 1511 | usb_put_dev(dev->udev); | ||
| 1512 | |||
| 1513 | uvc_status_cleanup(dev); | ||
| 1514 | uvc_ctrl_cleanup_device(dev); | ||
| 1515 | |||
| 1516 | list_for_each_safe(p, n, &dev->entities) { | ||
| 1517 | struct uvc_entity *entity; | ||
| 1518 | entity = list_entry(p, struct uvc_entity, list); | ||
| 1519 | kfree(entity); | ||
| 1520 | } | ||
| 1521 | |||
| 1522 | list_for_each_safe(p, n, &dev->streaming) { | ||
| 1523 | struct uvc_streaming *streaming; | ||
| 1524 | streaming = list_entry(p, struct uvc_streaming, list); | ||
| 1525 | usb_driver_release_interface(&uvc_driver.driver, | ||
| 1526 | streaming->intf); | ||
| 1527 | usb_put_intf(streaming->intf); | ||
| 1528 | kfree(streaming->format); | ||
| 1529 | kfree(streaming->header.bmaControls); | ||
| 1530 | kfree(streaming); | ||
| 1531 | } | ||
| 1532 | |||
| 1533 | kfree(dev); | ||
| 1534 | } | ||
| 1535 | |||
| 1536 | static int uvc_probe(struct usb_interface *intf, | ||
| 1537 | const struct usb_device_id *id) | ||
| 1538 | { | ||
| 1539 | struct usb_device *udev = interface_to_usbdev(intf); | ||
| 1540 | struct uvc_device *dev; | ||
| 1541 | int ret; | ||
| 1542 | |||
| 1543 | if (id->idVendor && id->idProduct) | ||
| 1544 | uvc_trace(UVC_TRACE_PROBE, "Probing known UVC device %s " | ||
| 1545 | "(%04x:%04x)\n", udev->devpath, id->idVendor, | ||
| 1546 | id->idProduct); | ||
| 1547 | else | ||
| 1548 | uvc_trace(UVC_TRACE_PROBE, "Probing generic UVC device %s\n", | ||
| 1549 | udev->devpath); | ||
| 1550 | |||
| 1551 | /* Allocate memory for the device and initialize it */ | ||
| 1552 | if ((dev = kzalloc(sizeof *dev, GFP_KERNEL)) == NULL) | ||
| 1553 | return -ENOMEM; | ||
| 1554 | |||
| 1555 | INIT_LIST_HEAD(&dev->entities); | ||
| 1556 | INIT_LIST_HEAD(&dev->streaming); | ||
| 1557 | kref_init(&dev->kref); | ||
| 1558 | |||
| 1559 | dev->udev = usb_get_dev(udev); | ||
| 1560 | dev->intf = usb_get_intf(intf); | ||
| 1561 | dev->intfnum = intf->cur_altsetting->desc.bInterfaceNumber; | ||
| 1562 | dev->quirks = id->driver_info | uvc_quirks_param; | ||
| 1563 | |||
| 1564 | if (udev->product != NULL) | ||
| 1565 | strncpy(dev->name, udev->product, sizeof dev->name); | ||
| 1566 | else | ||
| 1567 | snprintf(dev->name, sizeof dev->name, | ||
| 1568 | "UVC Camera (%04x:%04x)", | ||
| 1569 | le16_to_cpu(udev->descriptor.idVendor), | ||
| 1570 | le16_to_cpu(udev->descriptor.idProduct)); | ||
| 1571 | |||
| 1572 | /* Parse the Video Class control descriptor */ | ||
| 1573 | if (uvc_parse_control(dev) < 0) { | ||
| 1574 | uvc_trace(UVC_TRACE_PROBE, "Unable to parse UVC " | ||
| 1575 | "descriptors.\n"); | ||
| 1576 | goto error; | ||
| 1577 | } | ||
| 1578 | |||
| 1579 | uvc_printk(KERN_INFO, "Found UVC %u.%02u device %s (%04x:%04x)\n", | ||
| 1580 | dev->uvc_version >> 8, dev->uvc_version & 0xff, | ||
| 1581 | udev->product ? udev->product : "<unnamed>", | ||
| 1582 | le16_to_cpu(udev->descriptor.idVendor), | ||
| 1583 | le16_to_cpu(udev->descriptor.idProduct)); | ||
| 1584 | |||
| 1585 | if (uvc_quirks_param != 0) { | ||
| 1586 | uvc_printk(KERN_INFO, "Forcing device quirks 0x%x by module " | ||
| 1587 | "parameter for testing purpose.\n", uvc_quirks_param); | ||
| 1588 | uvc_printk(KERN_INFO, "Please report required quirks to the " | ||
| 1589 | "linux-uvc-devel mailing list.\n"); | ||
| 1590 | } | ||
| 1591 | |||
| 1592 | /* Initialize controls */ | ||
| 1593 | if (uvc_ctrl_init_device(dev) < 0) | ||
| 1594 | goto error; | ||
| 1595 | |||
| 1596 | /* Register the video devices */ | ||
| 1597 | if (uvc_register_video(dev) < 0) | ||
| 1598 | goto error; | ||
| 1599 | |||
| 1600 | /* Save our data pointer in the interface data */ | ||
| 1601 | usb_set_intfdata(intf, dev); | ||
| 1602 | |||
| 1603 | /* Initialize the interrupt URB */ | ||
| 1604 | if ((ret = uvc_status_init(dev)) < 0) { | ||
| 1605 | uvc_printk(KERN_INFO, "Unable to initialize the status " | ||
| 1606 | "endpoint (%d), status interrupt will not be " | ||
| 1607 | "supported.\n", ret); | ||
| 1608 | } | ||
| 1609 | |||
| 1610 | uvc_trace(UVC_TRACE_PROBE, "UVC device initialized.\n"); | ||
| 1611 | return 0; | ||
| 1612 | |||
| 1613 | error: | ||
| 1614 | kref_put(&dev->kref, uvc_delete); | ||
| 1615 | return -ENODEV; | ||
| 1616 | } | ||
| 1617 | |||
| 1618 | static void uvc_disconnect(struct usb_interface *intf) | ||
| 1619 | { | ||
| 1620 | struct uvc_device *dev = usb_get_intfdata(intf); | ||
| 1621 | |||
| 1622 | /* Set the USB interface data to NULL. This can be done outside the | ||
| 1623 | * lock, as there's no other reader. | ||
| 1624 | */ | ||
| 1625 | usb_set_intfdata(intf, NULL); | ||
| 1626 | |||
| 1627 | if (intf->cur_altsetting->desc.bInterfaceSubClass == SC_VIDEOSTREAMING) | ||
| 1628 | return; | ||
| 1629 | |||
| 1630 | /* uvc_v4l2_open() might race uvc_disconnect(). A static driver-wide | ||
| 1631 | * lock is needed to prevent uvc_disconnect from releasing its | ||
| 1632 | * reference to the uvc_device instance after uvc_v4l2_open() received | ||
| 1633 | * the pointer to the device (video_devdata) but before it got the | ||
| 1634 | * chance to increase the reference count (kref_get). | ||
| 1635 | */ | ||
| 1636 | mutex_lock(&uvc_driver.open_mutex); | ||
| 1637 | |||
| 1638 | dev->state |= UVC_DEV_DISCONNECTED; | ||
| 1639 | kref_put(&dev->kref, uvc_delete); | ||
| 1640 | |||
| 1641 | mutex_unlock(&uvc_driver.open_mutex); | ||
| 1642 | } | ||
| 1643 | |||
| 1644 | static int uvc_suspend(struct usb_interface *intf, pm_message_t message) | ||
| 1645 | { | ||
| 1646 | struct uvc_device *dev = usb_get_intfdata(intf); | ||
| 1647 | |||
| 1648 | uvc_trace(UVC_TRACE_SUSPEND, "Suspending interface %u\n", | ||
| 1649 | intf->cur_altsetting->desc.bInterfaceNumber); | ||
| 1650 | |||
| 1651 | /* Controls are cached on the fly so they don't need to be saved. */ | ||
| 1652 | if (intf->cur_altsetting->desc.bInterfaceSubClass == SC_VIDEOCONTROL) | ||
| 1653 | return uvc_status_suspend(dev); | ||
| 1654 | |||
| 1655 | if (dev->video.streaming->intf != intf) { | ||
| 1656 | uvc_trace(UVC_TRACE_SUSPEND, "Suspend: video streaming USB " | ||
| 1657 | "interface mismatch.\n"); | ||
| 1658 | return -EINVAL; | ||
| 1659 | } | ||
| 1660 | |||
| 1661 | return uvc_video_suspend(&dev->video); | ||
| 1662 | } | ||
| 1663 | |||
| 1664 | static int uvc_resume(struct usb_interface *intf) | ||
| 1665 | { | ||
| 1666 | struct uvc_device *dev = usb_get_intfdata(intf); | ||
| 1667 | int ret; | ||
| 1668 | |||
| 1669 | uvc_trace(UVC_TRACE_SUSPEND, "Resuming interface %u\n", | ||
| 1670 | intf->cur_altsetting->desc.bInterfaceNumber); | ||
| 1671 | |||
| 1672 | if (intf->cur_altsetting->desc.bInterfaceSubClass == SC_VIDEOCONTROL) { | ||
| 1673 | if ((ret = uvc_ctrl_resume_device(dev)) < 0) | ||
| 1674 | return ret; | ||
| 1675 | |||
| 1676 | return uvc_status_resume(dev); | ||
| 1677 | } | ||
| 1678 | |||
| 1679 | if (dev->video.streaming->intf != intf) { | ||
| 1680 | uvc_trace(UVC_TRACE_SUSPEND, "Resume: video streaming USB " | ||
| 1681 | "interface mismatch.\n"); | ||
| 1682 | return -EINVAL; | ||
| 1683 | } | ||
| 1684 | |||
| 1685 | return uvc_video_resume(&dev->video); | ||
| 1686 | } | ||
| 1687 | |||
| 1688 | /* ------------------------------------------------------------------------ | ||
| 1689 | * Driver initialization and cleanup | ||
| 1690 | */ | ||
| 1691 | |||
| 1692 | /* | ||
| 1693 | * The Logitech cameras listed below have their interface class set to | ||
| 1694 | * VENDOR_SPEC because they don't announce themselves as UVC devices, even | ||
| 1695 | * though they are compliant. | ||
| 1696 | */ | ||
| 1697 | static struct usb_device_id uvc_ids[] = { | ||
| 1698 | /* ALi M5606 (Clevo M540SR) */ | ||
| 1699 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1700 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1701 | .idVendor = 0x0402, | ||
| 1702 | .idProduct = 0x5606, | ||
| 1703 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1704 | .bInterfaceSubClass = 1, | ||
| 1705 | .bInterfaceProtocol = 0, | ||
| 1706 | .driver_info = UVC_QUIRK_PROBE_MINMAX }, | ||
| 1707 | /* Creative Live! Optia */ | ||
| 1708 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1709 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1710 | .idVendor = 0x041e, | ||
| 1711 | .idProduct = 0x4057, | ||
| 1712 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1713 | .bInterfaceSubClass = 1, | ||
| 1714 | .bInterfaceProtocol = 0, | ||
| 1715 | .driver_info = UVC_QUIRK_PROBE_MINMAX }, | ||
| 1716 | /* Microsoft Lifecam NX-6000 */ | ||
| 1717 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1718 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1719 | .idVendor = 0x045e, | ||
| 1720 | .idProduct = 0x00f8, | ||
| 1721 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1722 | .bInterfaceSubClass = 1, | ||
| 1723 | .bInterfaceProtocol = 0, | ||
| 1724 | .driver_info = UVC_QUIRK_PROBE_MINMAX }, | ||
| 1725 | /* Microsoft Lifecam VX-7000 */ | ||
| 1726 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1727 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1728 | .idVendor = 0x045e, | ||
| 1729 | .idProduct = 0x0723, | ||
| 1730 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1731 | .bInterfaceSubClass = 1, | ||
| 1732 | .bInterfaceProtocol = 0, | ||
| 1733 | .driver_info = UVC_QUIRK_PROBE_MINMAX }, | ||
| 1734 | /* Logitech Quickcam Fusion */ | ||
| 1735 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1736 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1737 | .idVendor = 0x046d, | ||
| 1738 | .idProduct = 0x08c1, | ||
| 1739 | .bInterfaceClass = USB_CLASS_VENDOR_SPEC, | ||
| 1740 | .bInterfaceSubClass = 1, | ||
| 1741 | .bInterfaceProtocol = 0 }, | ||
| 1742 | /* Logitech Quickcam Orbit MP */ | ||
| 1743 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1744 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1745 | .idVendor = 0x046d, | ||
| 1746 | .idProduct = 0x08c2, | ||
| 1747 | .bInterfaceClass = USB_CLASS_VENDOR_SPEC, | ||
| 1748 | .bInterfaceSubClass = 1, | ||
| 1749 | .bInterfaceProtocol = 0 }, | ||
| 1750 | /* Logitech Quickcam Pro for Notebook */ | ||
| 1751 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1752 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1753 | .idVendor = 0x046d, | ||
| 1754 | .idProduct = 0x08c3, | ||
| 1755 | .bInterfaceClass = USB_CLASS_VENDOR_SPEC, | ||
| 1756 | .bInterfaceSubClass = 1, | ||
| 1757 | .bInterfaceProtocol = 0 }, | ||
| 1758 | /* Logitech Quickcam Pro 5000 */ | ||
| 1759 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1760 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1761 | .idVendor = 0x046d, | ||
| 1762 | .idProduct = 0x08c5, | ||
| 1763 | .bInterfaceClass = USB_CLASS_VENDOR_SPEC, | ||
| 1764 | .bInterfaceSubClass = 1, | ||
| 1765 | .bInterfaceProtocol = 0 }, | ||
| 1766 | /* Logitech Quickcam OEM Dell Notebook */ | ||
| 1767 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1768 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1769 | .idVendor = 0x046d, | ||
| 1770 | .idProduct = 0x08c6, | ||
| 1771 | .bInterfaceClass = USB_CLASS_VENDOR_SPEC, | ||
| 1772 | .bInterfaceSubClass = 1, | ||
| 1773 | .bInterfaceProtocol = 0 }, | ||
| 1774 | /* Logitech Quickcam OEM Cisco VT Camera II */ | ||
| 1775 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1776 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1777 | .idVendor = 0x046d, | ||
| 1778 | .idProduct = 0x08c7, | ||
| 1779 | .bInterfaceClass = USB_CLASS_VENDOR_SPEC, | ||
| 1780 | .bInterfaceSubClass = 1, | ||
| 1781 | .bInterfaceProtocol = 0 }, | ||
| 1782 | /* Apple Built-In iSight */ | ||
| 1783 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1784 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1785 | .idVendor = 0x05ac, | ||
| 1786 | .idProduct = 0x8501, | ||
| 1787 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1788 | .bInterfaceSubClass = 1, | ||
| 1789 | .bInterfaceProtocol = 0, | ||
| 1790 | .driver_info = UVC_QUIRK_PROBE_MINMAX | ||
| 1791 | | UVC_QUIRK_BUILTIN_ISIGHT }, | ||
| 1792 | /* Genesys Logic USB 2.0 PC Camera */ | ||
| 1793 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1794 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1795 | .idVendor = 0x05e3, | ||
| 1796 | .idProduct = 0x0505, | ||
| 1797 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1798 | .bInterfaceSubClass = 1, | ||
| 1799 | .bInterfaceProtocol = 0, | ||
| 1800 | .driver_info = UVC_QUIRK_STREAM_NO_FID }, | ||
| 1801 | /* Silicon Motion SM371 */ | ||
| 1802 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1803 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1804 | .idVendor = 0x090c, | ||
| 1805 | .idProduct = 0xb371, | ||
| 1806 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1807 | .bInterfaceSubClass = 1, | ||
| 1808 | .bInterfaceProtocol = 0, | ||
| 1809 | .driver_info = UVC_QUIRK_PROBE_MINMAX }, | ||
| 1810 | /* MT6227 */ | ||
| 1811 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1812 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1813 | .idVendor = 0x0e8d, | ||
| 1814 | .idProduct = 0x0004, | ||
| 1815 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1816 | .bInterfaceSubClass = 1, | ||
| 1817 | .bInterfaceProtocol = 0, | ||
| 1818 | .driver_info = UVC_QUIRK_PROBE_MINMAX }, | ||
| 1819 | /* Syntek (HP Spartan) */ | ||
| 1820 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1821 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1822 | .idVendor = 0x174f, | ||
| 1823 | .idProduct = 0x5212, | ||
| 1824 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1825 | .bInterfaceSubClass = 1, | ||
| 1826 | .bInterfaceProtocol = 0, | ||
| 1827 | .driver_info = UVC_QUIRK_STREAM_NO_FID }, | ||
| 1828 | /* Syntek (Asus U3S) */ | ||
| 1829 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1830 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1831 | .idVendor = 0x174f, | ||
| 1832 | .idProduct = 0x8a33, | ||
| 1833 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1834 | .bInterfaceSubClass = 1, | ||
| 1835 | .bInterfaceProtocol = 0, | ||
| 1836 | .driver_info = UVC_QUIRK_STREAM_NO_FID }, | ||
| 1837 | /* Ecamm Pico iMage */ | ||
| 1838 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1839 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1840 | .idVendor = 0x18cd, | ||
| 1841 | .idProduct = 0xcafe, | ||
| 1842 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1843 | .bInterfaceSubClass = 1, | ||
| 1844 | .bInterfaceProtocol = 0, | ||
| 1845 | .driver_info = UVC_QUIRK_PROBE_EXTRAFIELDS }, | ||
| 1846 | /* Bodelin ProScopeHR */ | ||
| 1847 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1848 | | USB_DEVICE_ID_MATCH_DEV_HI | ||
| 1849 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1850 | .idVendor = 0x19ab, | ||
| 1851 | .idProduct = 0x1000, | ||
| 1852 | .bcdDevice_hi = 0x0126, | ||
| 1853 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1854 | .bInterfaceSubClass = 1, | ||
| 1855 | .bInterfaceProtocol = 0, | ||
| 1856 | .driver_info = UVC_QUIRK_STATUS_INTERVAL }, | ||
| 1857 | /* SiGma Micro USB Web Camera */ | ||
| 1858 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1859 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1860 | .idVendor = 0x1c4f, | ||
| 1861 | .idProduct = 0x3000, | ||
| 1862 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1863 | .bInterfaceSubClass = 1, | ||
| 1864 | .bInterfaceProtocol = 0, | ||
| 1865 | .driver_info = UVC_QUIRK_PROBE_MINMAX | ||
| 1866 | | UVC_QUIRK_IGNORE_SELECTOR_UNIT}, | ||
| 1867 | /* Acer OEM Webcam - Unknown vendor */ | ||
| 1868 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1869 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1870 | .idVendor = 0x5986, | ||
| 1871 | .idProduct = 0x0100, | ||
| 1872 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1873 | .bInterfaceSubClass = 1, | ||
| 1874 | .bInterfaceProtocol = 0, | ||
| 1875 | .driver_info = UVC_QUIRK_PROBE_MINMAX }, | ||
| 1876 | /* Packard Bell OEM Webcam */ | ||
| 1877 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1878 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1879 | .idVendor = 0x5986, | ||
| 1880 | .idProduct = 0x0101, | ||
| 1881 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1882 | .bInterfaceSubClass = 1, | ||
| 1883 | .bInterfaceProtocol = 0, | ||
| 1884 | .driver_info = UVC_QUIRK_PROBE_MINMAX }, | ||
| 1885 | /* Acer Crystal Eye webcam */ | ||
| 1886 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1887 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1888 | .idVendor = 0x5986, | ||
| 1889 | .idProduct = 0x0102, | ||
| 1890 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1891 | .bInterfaceSubClass = 1, | ||
| 1892 | .bInterfaceProtocol = 0, | ||
| 1893 | .driver_info = UVC_QUIRK_PROBE_MINMAX }, | ||
| 1894 | /* Acer OrbiCam - Unknown vendor */ | ||
| 1895 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
| 1896 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
| 1897 | .idVendor = 0x5986, | ||
| 1898 | .idProduct = 0x0200, | ||
| 1899 | .bInterfaceClass = USB_CLASS_VIDEO, | ||
| 1900 | .bInterfaceSubClass = 1, | ||
| 1901 | .bInterfaceProtocol = 0, | ||
| 1902 | .driver_info = UVC_QUIRK_PROBE_MINMAX }, | ||
| 1903 | /* Generic USB Video Class */ | ||
| 1904 | { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, 0) }, | ||
| 1905 | {} | ||
| 1906 | }; | ||
| 1907 | |||
| 1908 | MODULE_DEVICE_TABLE(usb, uvc_ids); | ||
| 1909 | |||
| 1910 | struct uvc_driver uvc_driver = { | ||
| 1911 | .driver = { | ||
| 1912 | .name = "uvcvideo", | ||
| 1913 | .probe = uvc_probe, | ||
| 1914 | .disconnect = uvc_disconnect, | ||
| 1915 | .suspend = uvc_suspend, | ||
| 1916 | .resume = uvc_resume, | ||
| 1917 | .id_table = uvc_ids, | ||
| 1918 | .supports_autosuspend = 1, | ||
| 1919 | }, | ||
| 1920 | }; | ||
| 1921 | |||
| 1922 | static int __init uvc_init(void) | ||
| 1923 | { | ||
| 1924 | int result; | ||
| 1925 | |||
| 1926 | INIT_LIST_HEAD(&uvc_driver.devices); | ||
| 1927 | INIT_LIST_HEAD(&uvc_driver.controls); | ||
| 1928 | mutex_init(&uvc_driver.open_mutex); | ||
| 1929 | mutex_init(&uvc_driver.ctrl_mutex); | ||
| 1930 | |||
| 1931 | uvc_ctrl_init(); | ||
| 1932 | |||
| 1933 | result = usb_register(&uvc_driver.driver); | ||
| 1934 | if (result == 0) | ||
| 1935 | printk(KERN_INFO DRIVER_DESC " (" DRIVER_VERSION ")\n"); | ||
| 1936 | return result; | ||
| 1937 | } | ||
| 1938 | |||
| 1939 | static void __exit uvc_cleanup(void) | ||
| 1940 | { | ||
| 1941 | usb_deregister(&uvc_driver.driver); | ||
| 1942 | } | ||
| 1943 | |||
| 1944 | module_init(uvc_init); | ||
| 1945 | module_exit(uvc_cleanup); | ||
| 1946 | |||
| 1947 | module_param_named(quirks, uvc_quirks_param, uint, S_IRUGO|S_IWUSR); | ||
| 1948 | MODULE_PARM_DESC(quirks, "Forced device quirks"); | ||
| 1949 | module_param_named(trace, uvc_trace_param, uint, S_IRUGO|S_IWUSR); | ||
| 1950 | MODULE_PARM_DESC(trace, "Trace level bitmask"); | ||
| 1951 | |||
| 1952 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
| 1953 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
| 1954 | MODULE_LICENSE("GPL"); | ||
| 1955 | MODULE_VERSION(DRIVER_VERSION); | ||
diff --git a/drivers/media/video/uvc/uvc_isight.c b/drivers/media/video/uvc/uvc_isight.c new file mode 100644 index 000000000000..37bdefdbead5 --- /dev/null +++ b/drivers/media/video/uvc/uvc_isight.c | |||
| @@ -0,0 +1,134 @@ | |||
| 1 | /* | ||
| 2 | * uvc_isight.c -- USB Video Class driver - iSight support | ||
| 3 | * | ||
| 4 | * Copyright (C) 2006-2007 | ||
| 5 | * Ivan N. Zlatev <contact@i-nz.net> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <linux/usb.h> | ||
| 15 | #include <linux/kernel.h> | ||
| 16 | #include <linux/mm.h> | ||
| 17 | |||
| 18 | #include "uvcvideo.h" | ||
| 19 | |||
| 20 | /* Built-in iSight webcams implements most of UVC 1.0 except a | ||
| 21 | * different packet format. Instead of sending a header at the | ||
| 22 | * beginning of each isochronous transfer payload, the webcam sends a | ||
| 23 | * single header per image (on its own in a packet), followed by | ||
| 24 | * packets containing data only. | ||
| 25 | * | ||
| 26 | * Offset Size (bytes) Description | ||
| 27 | * ------------------------------------------------------------------ | ||
| 28 | * 0x00 1 Header length | ||
| 29 | * 0x01 1 Flags (UVC-compliant) | ||
| 30 | * 0x02 4 Always equal to '11223344' | ||
| 31 | * 0x06 8 Always equal to 'deadbeefdeadface' | ||
| 32 | * 0x0e 16 Unknown | ||
| 33 | * | ||
| 34 | * The header can be prefixed by an optional, unknown-purpose byte. | ||
| 35 | */ | ||
| 36 | |||
| 37 | static int isight_decode(struct uvc_video_queue *queue, struct uvc_buffer *buf, | ||
| 38 | const __u8 *data, unsigned int len) | ||
| 39 | { | ||
| 40 | static const __u8 hdr[] = { | ||
| 41 | 0x11, 0x22, 0x33, 0x44, | ||
| 42 | 0xde, 0xad, 0xbe, 0xef, | ||
| 43 | 0xde, 0xad, 0xfa, 0xce | ||
| 44 | }; | ||
| 45 | |||
| 46 | unsigned int maxlen, nbytes; | ||
| 47 | __u8 *mem; | ||
| 48 | int is_header = 0; | ||
| 49 | |||
| 50 | if (buf == NULL) | ||
| 51 | return 0; | ||
| 52 | |||
| 53 | if ((len >= 14 && memcmp(&data[2], hdr, 12) == 0) || | ||
| 54 | (len >= 15 && memcmp(&data[3], hdr, 12) == 0)) { | ||
| 55 | uvc_trace(UVC_TRACE_FRAME, "iSight header found\n"); | ||
| 56 | is_header = 1; | ||
| 57 | } | ||
| 58 | |||
| 59 | /* Synchronize to the input stream by waiting for a header packet. */ | ||
| 60 | if (buf->state != UVC_BUF_STATE_ACTIVE) { | ||
| 61 | if (!is_header) { | ||
| 62 | uvc_trace(UVC_TRACE_FRAME, "Dropping packet (out of " | ||
| 63 | "sync).\n"); | ||
| 64 | return 0; | ||
| 65 | } | ||
| 66 | |||
| 67 | buf->state = UVC_BUF_STATE_ACTIVE; | ||
| 68 | } | ||
| 69 | |||
| 70 | /* Mark the buffer as done if we're at the beginning of a new frame. | ||
| 71 | * | ||
| 72 | * Empty buffers (bytesused == 0) don't trigger end of frame detection | ||
| 73 | * as it doesn't make sense to return an empty buffer. | ||
| 74 | */ | ||
| 75 | if (is_header && buf->buf.bytesused != 0) { | ||
| 76 | buf->state = UVC_BUF_STATE_DONE; | ||
| 77 | return -EAGAIN; | ||
| 78 | } | ||
| 79 | |||
| 80 | /* Copy the video data to the buffer. Skip header packets, as they | ||
| 81 | * contain no data. | ||
| 82 | */ | ||
| 83 | if (!is_header) { | ||
| 84 | maxlen = buf->buf.length - buf->buf.bytesused; | ||
| 85 | mem = queue->mem + buf->buf.m.offset + buf->buf.bytesused; | ||
| 86 | nbytes = min(len, maxlen); | ||
| 87 | memcpy(mem, data, nbytes); | ||
| 88 | buf->buf.bytesused += nbytes; | ||
| 89 | |||
| 90 | if (len > maxlen || buf->buf.bytesused == buf->buf.length) { | ||
| 91 | uvc_trace(UVC_TRACE_FRAME, "Frame complete " | ||
| 92 | "(overflow).\n"); | ||
| 93 | buf->state = UVC_BUF_STATE_DONE; | ||
| 94 | } | ||
| 95 | } | ||
| 96 | |||
| 97 | return 0; | ||
| 98 | } | ||
| 99 | |||
| 100 | void uvc_video_decode_isight(struct urb *urb, struct uvc_video_device *video, | ||
| 101 | struct uvc_buffer *buf) | ||
| 102 | { | ||
| 103 | int ret, i; | ||
| 104 | |||
| 105 | for (i = 0; i < urb->number_of_packets; ++i) { | ||
| 106 | if (urb->iso_frame_desc[i].status < 0) { | ||
| 107 | uvc_trace(UVC_TRACE_FRAME, "USB isochronous frame " | ||
| 108 | "lost (%d).\n", | ||
| 109 | urb->iso_frame_desc[i].status); | ||
| 110 | } | ||
| 111 | |||
| 112 | /* Decode the payload packet. | ||
| 113 | * uvc_video_decode is entered twice when a frame transition | ||
| 114 | * has been detected because the end of frame can only be | ||
| 115 | * reliably detected when the first packet of the new frame | ||
| 116 | * is processed. The first pass detects the transition and | ||
| 117 | * closes the previous frame's buffer, the second pass | ||
| 118 | * processes the data of the first payload of the new frame. | ||
| 119 | */ | ||
| 120 | do { | ||
| 121 | ret = isight_decode(&video->queue, buf, | ||
| 122 | urb->transfer_buffer + | ||
| 123 | urb->iso_frame_desc[i].offset, | ||
| 124 | urb->iso_frame_desc[i].actual_length); | ||
| 125 | |||
| 126 | if (buf == NULL) | ||
| 127 | break; | ||
| 128 | |||
| 129 | if (buf->state == UVC_BUF_STATE_DONE || | ||
| 130 | buf->state == UVC_BUF_STATE_ERROR) | ||
| 131 | buf = uvc_queue_next_buffer(&video->queue, buf); | ||
| 132 | } while (ret == -EAGAIN); | ||
| 133 | } | ||
| 134 | } | ||
diff --git a/drivers/media/video/uvc/uvc_queue.c b/drivers/media/video/uvc/uvc_queue.c new file mode 100644 index 000000000000..0923f0e3b3d4 --- /dev/null +++ b/drivers/media/video/uvc/uvc_queue.c | |||
| @@ -0,0 +1,477 @@ | |||
| 1 | /* | ||
| 2 | * uvc_queue.c -- USB Video Class driver - Buffers management | ||
| 3 | * | ||
| 4 | * Copyright (C) 2005-2008 | ||
| 5 | * Laurent Pinchart (laurent.pinchart@skynet.be) | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <linux/kernel.h> | ||
| 15 | #include <linux/version.h> | ||
| 16 | #include <linux/list.h> | ||
| 17 | #include <linux/module.h> | ||
| 18 | #include <linux/usb.h> | ||
| 19 | #include <linux/videodev2.h> | ||
| 20 | #include <linux/vmalloc.h> | ||
| 21 | #include <linux/wait.h> | ||
| 22 | #include <asm/atomic.h> | ||
| 23 | |||
| 24 | #include "uvcvideo.h" | ||
| 25 | |||
| 26 | /* ------------------------------------------------------------------------ | ||
| 27 | * Video buffers queue management. | ||
| 28 | * | ||
| 29 | * Video queues is initialized by uvc_queue_init(). The function performs | ||
| 30 | * basic initialization of the uvc_video_queue struct and never fails. | ||
| 31 | * | ||
| 32 | * Video buffer allocation and freeing are performed by uvc_alloc_buffers and | ||
| 33 | * uvc_free_buffers respectively. The former acquires the video queue lock, | ||
| 34 | * while the later must be called with the lock held (so that allocation can | ||
| 35 | * free previously allocated buffers). Trying to free buffers that are mapped | ||
| 36 | * to user space will return -EBUSY. | ||
| 37 | * | ||
| 38 | * Video buffers are managed using two queues. However, unlike most USB video | ||
| 39 | * drivers which use an in queue and an out queue, we use a main queue which | ||
| 40 | * holds all queued buffers (both 'empty' and 'done' buffers), and an irq | ||
| 41 | * queue which holds empty buffers. This design (copied from video-buf) | ||
| 42 | * minimizes locking in interrupt, as only one queue is shared between | ||
| 43 | * interrupt and user contexts. | ||
| 44 | * | ||
| 45 | * Use cases | ||
| 46 | * --------- | ||
| 47 | * | ||
| 48 | * Unless stated otherwise, all operations which modify the irq buffers queue | ||
| 49 | * are protected by the irq spinlock. | ||
| 50 | * | ||
| 51 | * 1. The user queues the buffers, starts streaming and dequeues a buffer. | ||
| 52 | * | ||
| 53 | * The buffers are added to the main and irq queues. Both operations are | ||
| 54 | * protected by the queue lock, and the latert is protected by the irq | ||
| 55 | * spinlock as well. | ||
| 56 | * | ||
| 57 | * The completion handler fetches a buffer from the irq queue and fills it | ||
| 58 | * with video data. If no buffer is available (irq queue empty), the handler | ||
| 59 | * returns immediately. | ||
| 60 | * | ||
| 61 | * When the buffer is full, the completion handler removes it from the irq | ||
| 62 | * queue, marks it as ready (UVC_BUF_STATE_DONE) and wake its wait queue. | ||
| 63 | * At that point, any process waiting on the buffer will be woken up. If a | ||
| 64 | * process tries to dequeue a buffer after it has been marked ready, the | ||
| 65 | * dequeing will succeed immediately. | ||
| 66 | * | ||
| 67 | * 2. Buffers are queued, user is waiting on a buffer and the device gets | ||
| 68 | * disconnected. | ||
| 69 | * | ||
| 70 | * When the device is disconnected, the kernel calls the completion handler | ||
| 71 | * with an appropriate status code. The handler marks all buffers in the | ||
| 72 | * irq queue as being erroneous (UVC_BUF_STATE_ERROR) and wakes them up so | ||
| 73 | * that any process waiting on a buffer gets woken up. | ||
| 74 | * | ||
| 75 | * Waking up up the first buffer on the irq list is not enough, as the | ||
| 76 | * process waiting on the buffer might restart the dequeue operation | ||
| 77 | * immediately. | ||
| 78 | * | ||
| 79 | */ | ||
| 80 | |||
| 81 | void uvc_queue_init(struct uvc_video_queue *queue) | ||
| 82 | { | ||
| 83 | mutex_init(&queue->mutex); | ||
| 84 | spin_lock_init(&queue->irqlock); | ||
| 85 | INIT_LIST_HEAD(&queue->mainqueue); | ||
| 86 | INIT_LIST_HEAD(&queue->irqqueue); | ||
| 87 | } | ||
| 88 | |||
| 89 | /* | ||
| 90 | * Allocate the video buffers. | ||
| 91 | * | ||
| 92 | * Pages are reserved to make sure they will not be swaped, as they will be | ||
| 93 | * filled in URB completion handler. | ||
| 94 | * | ||
| 95 | * Buffers will be individually mapped, so they must all be page aligned. | ||
| 96 | */ | ||
| 97 | int uvc_alloc_buffers(struct uvc_video_queue *queue, unsigned int nbuffers, | ||
| 98 | unsigned int buflength) | ||
| 99 | { | ||
| 100 | unsigned int bufsize = PAGE_ALIGN(buflength); | ||
| 101 | unsigned int i; | ||
| 102 | void *mem = NULL; | ||
| 103 | int ret; | ||
| 104 | |||
| 105 | if (nbuffers > UVC_MAX_VIDEO_BUFFERS) | ||
| 106 | nbuffers = UVC_MAX_VIDEO_BUFFERS; | ||
| 107 | |||
| 108 | mutex_lock(&queue->mutex); | ||
| 109 | |||
| 110 | if ((ret = uvc_free_buffers(queue)) < 0) | ||
| 111 | goto done; | ||
| 112 | |||
| 113 | /* Bail out if no buffers should be allocated. */ | ||
| 114 | if (nbuffers == 0) | ||
| 115 | goto done; | ||
| 116 | |||
| 117 | /* Decrement the number of buffers until allocation succeeds. */ | ||
| 118 | for (; nbuffers > 0; --nbuffers) { | ||
| 119 | mem = vmalloc_32(nbuffers * bufsize); | ||
| 120 | if (mem != NULL) | ||
| 121 | break; | ||
| 122 | } | ||
| 123 | |||
| 124 | if (mem == NULL) { | ||
| 125 | ret = -ENOMEM; | ||
| 126 | goto done; | ||
| 127 | } | ||
| 128 | |||
| 129 | for (i = 0; i < nbuffers; ++i) { | ||
| 130 | memset(&queue->buffer[i], 0, sizeof queue->buffer[i]); | ||
| 131 | queue->buffer[i].buf.index = i; | ||
| 132 | queue->buffer[i].buf.m.offset = i * bufsize; | ||
| 133 | queue->buffer[i].buf.length = buflength; | ||
| 134 | queue->buffer[i].buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | ||
| 135 | queue->buffer[i].buf.sequence = 0; | ||
| 136 | queue->buffer[i].buf.field = V4L2_FIELD_NONE; | ||
| 137 | queue->buffer[i].buf.memory = V4L2_MEMORY_MMAP; | ||
| 138 | queue->buffer[i].buf.flags = 0; | ||
| 139 | init_waitqueue_head(&queue->buffer[i].wait); | ||
| 140 | } | ||
| 141 | |||
| 142 | queue->mem = mem; | ||
| 143 | queue->count = nbuffers; | ||
| 144 | queue->buf_size = bufsize; | ||
| 145 | ret = nbuffers; | ||
| 146 | |||
| 147 | done: | ||
| 148 | mutex_unlock(&queue->mutex); | ||
| 149 | return ret; | ||
| 150 | } | ||
| 151 | |||
| 152 | /* | ||
| 153 | * Free the video buffers. | ||
| 154 | * | ||
| 155 | * This function must be called with the queue lock held. | ||
| 156 | */ | ||
| 157 | int uvc_free_buffers(struct uvc_video_queue *queue) | ||
| 158 | { | ||
| 159 | unsigned int i; | ||
| 160 | |||
| 161 | for (i = 0; i < queue->count; ++i) { | ||
| 162 | if (queue->buffer[i].vma_use_count != 0) | ||
| 163 | return -EBUSY; | ||
| 164 | } | ||
| 165 | |||
| 166 | if (queue->count) { | ||
| 167 | vfree(queue->mem); | ||
| 168 | queue->count = 0; | ||
| 169 | } | ||
| 170 | |||
| 171 | return 0; | ||
| 172 | } | ||
| 173 | |||
| 174 | static void __uvc_query_buffer(struct uvc_buffer *buf, | ||
| 175 | struct v4l2_buffer *v4l2_buf) | ||
| 176 | { | ||
| 177 | memcpy(v4l2_buf, &buf->buf, sizeof *v4l2_buf); | ||
| 178 | |||
| 179 | if (buf->vma_use_count) | ||
| 180 | v4l2_buf->flags |= V4L2_BUF_FLAG_MAPPED; | ||
| 181 | |||
| 182 | switch (buf->state) { | ||
| 183 | case UVC_BUF_STATE_ERROR: | ||
| 184 | case UVC_BUF_STATE_DONE: | ||
| 185 | v4l2_buf->flags |= V4L2_BUF_FLAG_DONE; | ||
| 186 | break; | ||
| 187 | case UVC_BUF_STATE_QUEUED: | ||
| 188 | case UVC_BUF_STATE_ACTIVE: | ||
| 189 | v4l2_buf->flags |= V4L2_BUF_FLAG_QUEUED; | ||
| 190 | break; | ||
| 191 | case UVC_BUF_STATE_IDLE: | ||
| 192 | default: | ||
| 193 | break; | ||
| 194 | } | ||
| 195 | } | ||
| 196 | |||
| 197 | int uvc_query_buffer(struct uvc_video_queue *queue, | ||
| 198 | struct v4l2_buffer *v4l2_buf) | ||
| 199 | { | ||
| 200 | int ret = 0; | ||
| 201 | |||
| 202 | mutex_lock(&queue->mutex); | ||
| 203 | if (v4l2_buf->index >= queue->count) { | ||
| 204 | ret = -EINVAL; | ||
| 205 | goto done; | ||
| 206 | } | ||
| 207 | |||
| 208 | __uvc_query_buffer(&queue->buffer[v4l2_buf->index], v4l2_buf); | ||
| 209 | |||
| 210 | done: | ||
| 211 | mutex_unlock(&queue->mutex); | ||
| 212 | return ret; | ||
| 213 | } | ||
| 214 | |||
| 215 | /* | ||
| 216 | * Queue a video buffer. Attempting to queue a buffer that has already been | ||
| 217 | * queued will return -EINVAL. | ||
| 218 | */ | ||
| 219 | int uvc_queue_buffer(struct uvc_video_queue *queue, | ||
| 220 | struct v4l2_buffer *v4l2_buf) | ||
| 221 | { | ||
| 222 | struct uvc_buffer *buf; | ||
| 223 | unsigned long flags; | ||
| 224 | int ret = 0; | ||
| 225 | |||
| 226 | uvc_trace(UVC_TRACE_CAPTURE, "Queuing buffer %u.\n", v4l2_buf->index); | ||
| 227 | |||
| 228 | if (v4l2_buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || | ||
| 229 | v4l2_buf->memory != V4L2_MEMORY_MMAP) { | ||
| 230 | uvc_trace(UVC_TRACE_CAPTURE, "[E] Invalid buffer type (%u) " | ||
| 231 | "and/or memory (%u).\n", v4l2_buf->type, | ||
| 232 | v4l2_buf->memory); | ||
| 233 | return -EINVAL; | ||
| 234 | } | ||
| 235 | |||
| 236 | mutex_lock(&queue->mutex); | ||
| 237 | if (v4l2_buf->index >= queue->count) { | ||
| 238 | uvc_trace(UVC_TRACE_CAPTURE, "[E] Out of range index.\n"); | ||
| 239 | ret = -EINVAL; | ||
| 240 | goto done; | ||
| 241 | } | ||
| 242 | |||
| 243 | buf = &queue->buffer[v4l2_buf->index]; | ||
| 244 | if (buf->state != UVC_BUF_STATE_IDLE) { | ||
| 245 | uvc_trace(UVC_TRACE_CAPTURE, "[E] Invalid buffer state " | ||
| 246 | "(%u).\n", buf->state); | ||
| 247 | ret = -EINVAL; | ||
| 248 | goto done; | ||
| 249 | } | ||
| 250 | |||
| 251 | spin_lock_irqsave(&queue->irqlock, flags); | ||
| 252 | if (queue->flags & UVC_QUEUE_DISCONNECTED) { | ||
| 253 | spin_unlock_irqrestore(&queue->irqlock, flags); | ||
| 254 | ret = -ENODEV; | ||
| 255 | goto done; | ||
| 256 | } | ||
| 257 | buf->state = UVC_BUF_STATE_QUEUED; | ||
| 258 | buf->buf.bytesused = 0; | ||
| 259 | list_add_tail(&buf->stream, &queue->mainqueue); | ||
| 260 | list_add_tail(&buf->queue, &queue->irqqueue); | ||
| 261 | spin_unlock_irqrestore(&queue->irqlock, flags); | ||
| 262 | |||
| 263 | done: | ||
| 264 | mutex_unlock(&queue->mutex); | ||
| 265 | return ret; | ||
| 266 | } | ||
| 267 | |||
| 268 | static int uvc_queue_waiton(struct uvc_buffer *buf, int nonblocking) | ||
| 269 | { | ||
| 270 | if (nonblocking) { | ||
| 271 | return (buf->state != UVC_BUF_STATE_QUEUED && | ||
| 272 | buf->state != UVC_BUF_STATE_ACTIVE) | ||
| 273 | ? 0 : -EAGAIN; | ||
| 274 | } | ||
| 275 | |||
| 276 | return wait_event_interruptible(buf->wait, | ||
| 277 | buf->state != UVC_BUF_STATE_QUEUED && | ||
| 278 | buf->state != UVC_BUF_STATE_ACTIVE); | ||
| 279 | } | ||
| 280 | |||
| 281 | /* | ||
| 282 | * Dequeue a video buffer. If nonblocking is false, block until a buffer is | ||
| 283 | * available. | ||
| 284 | */ | ||
| 285 | int uvc_dequeue_buffer(struct uvc_video_queue *queue, | ||
| 286 | struct v4l2_buffer *v4l2_buf, int nonblocking) | ||
| 287 | { | ||
| 288 | struct uvc_buffer *buf; | ||
| 289 | int ret = 0; | ||
| 290 | |||
| 291 | if (v4l2_buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || | ||
| 292 | v4l2_buf->memory != V4L2_MEMORY_MMAP) { | ||
| 293 | uvc_trace(UVC_TRACE_CAPTURE, "[E] Invalid buffer type (%u) " | ||
| 294 | "and/or memory (%u).\n", v4l2_buf->type, | ||
| 295 | v4l2_buf->memory); | ||
| 296 | return -EINVAL; | ||
| 297 | } | ||
| 298 | |||
| 299 | mutex_lock(&queue->mutex); | ||
| 300 | if (list_empty(&queue->mainqueue)) { | ||
| 301 | uvc_trace(UVC_TRACE_CAPTURE, "[E] Empty buffer queue.\n"); | ||
| 302 | ret = -EINVAL; | ||
| 303 | goto done; | ||
| 304 | } | ||
| 305 | |||
| 306 | buf = list_first_entry(&queue->mainqueue, struct uvc_buffer, stream); | ||
| 307 | if ((ret = uvc_queue_waiton(buf, nonblocking)) < 0) | ||
| 308 | goto done; | ||
| 309 | |||
| 310 | uvc_trace(UVC_TRACE_CAPTURE, "Dequeuing buffer %u (%u, %u bytes).\n", | ||
| 311 | buf->buf.index, buf->state, buf->buf.bytesused); | ||
| 312 | |||
| 313 | switch (buf->state) { | ||
| 314 | case UVC_BUF_STATE_ERROR: | ||
| 315 | uvc_trace(UVC_TRACE_CAPTURE, "[W] Corrupted data " | ||
| 316 | "(transmission error).\n"); | ||
| 317 | ret = -EIO; | ||
| 318 | case UVC_BUF_STATE_DONE: | ||
| 319 | buf->state = UVC_BUF_STATE_IDLE; | ||
| 320 | break; | ||
| 321 | |||
| 322 | case UVC_BUF_STATE_IDLE: | ||
| 323 | case UVC_BUF_STATE_QUEUED: | ||
| 324 | case UVC_BUF_STATE_ACTIVE: | ||
| 325 | default: | ||
| 326 | uvc_trace(UVC_TRACE_CAPTURE, "[E] Invalid buffer state %u " | ||
| 327 | "(driver bug?).\n", buf->state); | ||
| 328 | ret = -EINVAL; | ||
| 329 | goto done; | ||
| 330 | } | ||
| 331 | |||
| 332 | list_del(&buf->stream); | ||
| 333 | __uvc_query_buffer(buf, v4l2_buf); | ||
| 334 | |||
| 335 | done: | ||
| 336 | mutex_unlock(&queue->mutex); | ||
| 337 | return ret; | ||
| 338 | } | ||
| 339 | |||
| 340 | /* | ||
| 341 | * Poll the video queue. | ||
| 342 | * | ||
| 343 | * This function implements video queue polling and is intended to be used by | ||
| 344 | * the device poll handler. | ||
| 345 | */ | ||
| 346 | unsigned int uvc_queue_poll(struct uvc_video_queue *queue, struct file *file, | ||
| 347 | poll_table *wait) | ||
| 348 | { | ||
| 349 | struct uvc_buffer *buf; | ||
| 350 | unsigned int mask = 0; | ||
| 351 | |||
| 352 | mutex_lock(&queue->mutex); | ||
| 353 | if (list_empty(&queue->mainqueue)) { | ||
| 354 | mask |= POLLERR; | ||
| 355 | goto done; | ||
| 356 | } | ||
| 357 | buf = list_first_entry(&queue->mainqueue, struct uvc_buffer, stream); | ||
| 358 | |||
| 359 | poll_wait(file, &buf->wait, wait); | ||
| 360 | if (buf->state == UVC_BUF_STATE_DONE || | ||
| 361 | buf->state == UVC_BUF_STATE_ERROR) | ||
| 362 | mask |= POLLIN | POLLRDNORM; | ||
| 363 | |||
| 364 | done: | ||
| 365 | mutex_unlock(&queue->mutex); | ||
| 366 | return mask; | ||
| 367 | } | ||
| 368 | |||
| 369 | /* | ||
| 370 | * Enable or disable the video buffers queue. | ||
| 371 | * | ||
| 372 | * The queue must be enabled before starting video acquisition and must be | ||
| 373 | * disabled after stopping it. This ensures that the video buffers queue | ||
| 374 | * state can be properly initialized before buffers are accessed from the | ||
| 375 | * interrupt handler. | ||
| 376 | * | ||
| 377 | * Enabling the video queue initializes parameters (such as sequence number, | ||
| 378 | * sync pattern, ...). If the queue is already enabled, return -EBUSY. | ||
| 379 | * | ||
| 380 | * Disabling the video queue cancels the queue and removes all buffers from | ||
| 381 | * the main queue. | ||
| 382 | * | ||
| 383 | * This function can't be called from interrupt context. Use | ||
| 384 | * uvc_queue_cancel() instead. | ||
| 385 | */ | ||
| 386 | int uvc_queue_enable(struct uvc_video_queue *queue, int enable) | ||
| 387 | { | ||
| 388 | unsigned int i; | ||
| 389 | int ret = 0; | ||
| 390 | |||
| 391 | mutex_lock(&queue->mutex); | ||
| 392 | if (enable) { | ||
| 393 | if (uvc_queue_streaming(queue)) { | ||
| 394 | ret = -EBUSY; | ||
| 395 | goto done; | ||
| 396 | } | ||
| 397 | queue->sequence = 0; | ||
| 398 | queue->flags |= UVC_QUEUE_STREAMING; | ||
| 399 | } else { | ||
| 400 | uvc_queue_cancel(queue, 0); | ||
| 401 | INIT_LIST_HEAD(&queue->mainqueue); | ||
| 402 | |||
| 403 | for (i = 0; i < queue->count; ++i) | ||
| 404 | queue->buffer[i].state = UVC_BUF_STATE_IDLE; | ||
| 405 | |||
| 406 | queue->flags &= ~UVC_QUEUE_STREAMING; | ||
| 407 | } | ||
| 408 | |||
| 409 | done: | ||
| 410 | mutex_unlock(&queue->mutex); | ||
| 411 | return ret; | ||
| 412 | } | ||
| 413 | |||
| 414 | /* | ||
| 415 | * Cancel the video buffers queue. | ||
| 416 | * | ||
| 417 | * Cancelling the queue marks all buffers on the irq queue as erroneous, | ||
| 418 | * wakes them up and remove them from the queue. | ||
| 419 | * | ||
| 420 | * If the disconnect parameter is set, further calls to uvc_queue_buffer will | ||
| 421 | * fail with -ENODEV. | ||
| 422 | * | ||
| 423 | * This function acquires the irq spinlock and can be called from interrupt | ||
| 424 | * context. | ||
| 425 | */ | ||
| 426 | void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect) | ||
| 427 | { | ||
| 428 | struct uvc_buffer *buf; | ||
| 429 | unsigned long flags; | ||
| 430 | |||
| 431 | spin_lock_irqsave(&queue->irqlock, flags); | ||
| 432 | while (!list_empty(&queue->irqqueue)) { | ||
| 433 | buf = list_first_entry(&queue->irqqueue, struct uvc_buffer, | ||
| 434 | queue); | ||
| 435 | list_del(&buf->queue); | ||
| 436 | buf->state = UVC_BUF_STATE_ERROR; | ||
| 437 | wake_up(&buf->wait); | ||
| 438 | } | ||
| 439 | /* This must be protected by the irqlock spinlock to avoid race | ||
| 440 | * conditions between uvc_queue_buffer and the disconnection event that | ||
| 441 | * could result in an interruptible wait in uvc_dequeue_buffer. Do not | ||
| 442 | * blindly replace this logic by checking for the UVC_DEV_DISCONNECTED | ||
| 443 | * state outside the queue code. | ||
| 444 | */ | ||
| 445 | if (disconnect) | ||
| 446 | queue->flags |= UVC_QUEUE_DISCONNECTED; | ||
| 447 | spin_unlock_irqrestore(&queue->irqlock, flags); | ||
| 448 | } | ||
| 449 | |||
| 450 | struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue, | ||
| 451 | struct uvc_buffer *buf) | ||
| 452 | { | ||
| 453 | struct uvc_buffer *nextbuf; | ||
| 454 | unsigned long flags; | ||
| 455 | |||
| 456 | if ((queue->flags & UVC_QUEUE_DROP_INCOMPLETE) && | ||
| 457 | buf->buf.length != buf->buf.bytesused) { | ||
| 458 | buf->state = UVC_BUF_STATE_QUEUED; | ||
| 459 | buf->buf.bytesused = 0; | ||
| 460 | return buf; | ||
| 461 | } | ||
| 462 | |||
| 463 | spin_lock_irqsave(&queue->irqlock, flags); | ||
| 464 | list_del(&buf->queue); | ||
| 465 | if (!list_empty(&queue->irqqueue)) | ||
| 466 | nextbuf = list_first_entry(&queue->irqqueue, struct uvc_buffer, | ||
| 467 | queue); | ||
| 468 | else | ||
| 469 | nextbuf = NULL; | ||
| 470 | spin_unlock_irqrestore(&queue->irqlock, flags); | ||
| 471 | |||
| 472 | buf->buf.sequence = queue->sequence++; | ||
| 473 | do_gettimeofday(&buf->buf.timestamp); | ||
| 474 | |||
| 475 | wake_up(&buf->wait); | ||
| 476 | return nextbuf; | ||
| 477 | } | ||
diff --git a/drivers/media/video/uvc/uvc_status.c b/drivers/media/video/uvc/uvc_status.c new file mode 100644 index 000000000000..be9084e5eace --- /dev/null +++ b/drivers/media/video/uvc/uvc_status.c | |||
| @@ -0,0 +1,207 @@ | |||
| 1 | /* | ||
| 2 | * uvc_status.c -- USB Video Class driver - Status endpoint | ||
| 3 | * | ||
| 4 | * Copyright (C) 2007-2008 | ||
| 5 | * Laurent Pinchart (laurent.pinchart@skynet.be) | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <linux/kernel.h> | ||
| 15 | #include <linux/version.h> | ||
| 16 | #include <linux/input.h> | ||
| 17 | #include <linux/usb.h> | ||
| 18 | #include <linux/usb/input.h> | ||
| 19 | |||
| 20 | #include "uvcvideo.h" | ||
| 21 | |||
| 22 | /* -------------------------------------------------------------------------- | ||
| 23 | * Input device | ||
| 24 | */ | ||
| 25 | static int uvc_input_init(struct uvc_device *dev) | ||
| 26 | { | ||
| 27 | struct usb_device *udev = dev->udev; | ||
| 28 | struct input_dev *input; | ||
| 29 | char *phys = NULL; | ||
| 30 | int ret; | ||
| 31 | |||
| 32 | input = input_allocate_device(); | ||
| 33 | if (input == NULL) | ||
| 34 | return -ENOMEM; | ||
| 35 | |||
| 36 | phys = kmalloc(6 + strlen(udev->bus->bus_name) + strlen(udev->devpath), | ||
| 37 | GFP_KERNEL); | ||
| 38 | if (phys == NULL) { | ||
| 39 | ret = -ENOMEM; | ||
| 40 | goto error; | ||
| 41 | } | ||
| 42 | sprintf(phys, "usb-%s-%s", udev->bus->bus_name, udev->devpath); | ||
| 43 | |||
| 44 | input->name = dev->name; | ||
| 45 | input->phys = phys; | ||
| 46 | usb_to_input_id(udev, &input->id); | ||
| 47 | input->dev.parent = &dev->intf->dev; | ||
| 48 | |||
| 49 | set_bit(EV_KEY, input->evbit); | ||
| 50 | set_bit(BTN_0, input->keybit); | ||
| 51 | |||
| 52 | if ((ret = input_register_device(input)) < 0) | ||
| 53 | goto error; | ||
| 54 | |||
| 55 | dev->input = input; | ||
| 56 | return 0; | ||
| 57 | |||
| 58 | error: | ||
| 59 | input_free_device(input); | ||
| 60 | kfree(phys); | ||
| 61 | return ret; | ||
| 62 | } | ||
| 63 | |||
| 64 | static void uvc_input_cleanup(struct uvc_device *dev) | ||
| 65 | { | ||
| 66 | if (dev->input) | ||
| 67 | input_unregister_device(dev->input); | ||
| 68 | } | ||
| 69 | |||
| 70 | /* -------------------------------------------------------------------------- | ||
| 71 | * Status interrupt endpoint | ||
| 72 | */ | ||
| 73 | static void uvc_event_streaming(struct uvc_device *dev, __u8 *data, int len) | ||
| 74 | { | ||
| 75 | if (len < 3) { | ||
| 76 | uvc_trace(UVC_TRACE_STATUS, "Invalid streaming status event " | ||
| 77 | "received.\n"); | ||
| 78 | return; | ||
| 79 | } | ||
| 80 | |||
| 81 | if (data[2] == 0) { | ||
| 82 | if (len < 4) | ||
| 83 | return; | ||
| 84 | uvc_trace(UVC_TRACE_STATUS, "Button (intf %u) %s len %d\n", | ||
| 85 | data[1], data[3] ? "pressed" : "released", len); | ||
| 86 | if (dev->input) | ||
| 87 | input_report_key(dev->input, BTN_0, data[3]); | ||
| 88 | } else { | ||
| 89 | uvc_trace(UVC_TRACE_STATUS, "Stream %u error event %02x %02x " | ||
| 90 | "len %d.\n", data[1], data[2], data[3], len); | ||
| 91 | } | ||
| 92 | } | ||
| 93 | |||
| 94 | static void uvc_event_control(struct uvc_device *dev, __u8 *data, int len) | ||
| 95 | { | ||
| 96 | char *attrs[3] = { "value", "info", "failure" }; | ||
| 97 | |||
| 98 | if (len < 6 || data[2] != 0 || data[4] > 2) { | ||
| 99 | uvc_trace(UVC_TRACE_STATUS, "Invalid control status event " | ||
| 100 | "received.\n"); | ||
| 101 | return; | ||
| 102 | } | ||
| 103 | |||
| 104 | uvc_trace(UVC_TRACE_STATUS, "Control %u/%u %s change len %d.\n", | ||
| 105 | data[1], data[3], attrs[data[4]], len); | ||
| 106 | } | ||
| 107 | |||
| 108 | static void uvc_status_complete(struct urb *urb) | ||
| 109 | { | ||
| 110 | struct uvc_device *dev = urb->context; | ||
| 111 | int len, ret; | ||
| 112 | |||
| 113 | switch (urb->status) { | ||
| 114 | case 0: | ||
| 115 | break; | ||
| 116 | |||
| 117 | case -ENOENT: /* usb_kill_urb() called. */ | ||
| 118 | case -ECONNRESET: /* usb_unlink_urb() called. */ | ||
| 119 | case -ESHUTDOWN: /* The endpoint is being disabled. */ | ||
| 120 | case -EPROTO: /* Device is disconnected (reported by some | ||
| 121 | * host controller). */ | ||
| 122 | return; | ||
| 123 | |||
| 124 | default: | ||
| 125 | uvc_printk(KERN_WARNING, "Non-zero status (%d) in status " | ||
| 126 | "completion handler.\n", urb->status); | ||
| 127 | return; | ||
| 128 | } | ||
| 129 | |||
| 130 | len = urb->actual_length; | ||
| 131 | if (len > 0) { | ||
| 132 | switch (dev->status[0] & 0x0f) { | ||
| 133 | case UVC_STATUS_TYPE_CONTROL: | ||
| 134 | uvc_event_control(dev, dev->status, len); | ||
| 135 | break; | ||
| 136 | |||
| 137 | case UVC_STATUS_TYPE_STREAMING: | ||
| 138 | uvc_event_streaming(dev, dev->status, len); | ||
| 139 | break; | ||
| 140 | |||
| 141 | default: | ||
| 142 | uvc_printk(KERN_INFO, "unknown event type %u.\n", | ||
| 143 | dev->status[0]); | ||
| 144 | break; | ||
| 145 | } | ||
| 146 | } | ||
| 147 | |||
| 148 | /* Resubmit the URB. */ | ||
| 149 | urb->interval = dev->int_ep->desc.bInterval; | ||
| 150 | if ((ret = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { | ||
| 151 | uvc_printk(KERN_ERR, "Failed to resubmit status URB (%d).\n", | ||
| 152 | ret); | ||
| 153 | } | ||
| 154 | } | ||
| 155 | |||
| 156 | int uvc_status_init(struct uvc_device *dev) | ||
| 157 | { | ||
| 158 | struct usb_host_endpoint *ep = dev->int_ep; | ||
| 159 | unsigned int pipe; | ||
| 160 | int interval; | ||
| 161 | |||
| 162 | if (ep == NULL) | ||
| 163 | return 0; | ||
| 164 | |||
| 165 | uvc_input_init(dev); | ||
| 166 | |||
| 167 | dev->int_urb = usb_alloc_urb(0, GFP_KERNEL); | ||
| 168 | if (dev->int_urb == NULL) | ||
| 169 | return -ENOMEM; | ||
| 170 | |||
| 171 | pipe = usb_rcvintpipe(dev->udev, ep->desc.bEndpointAddress); | ||
| 172 | |||
| 173 | /* For high-speed interrupt endpoints, the bInterval value is used as | ||
| 174 | * an exponent of two. Some developers forgot about it. | ||
| 175 | */ | ||
| 176 | interval = ep->desc.bInterval; | ||
| 177 | if (interval > 16 && dev->udev->speed == USB_SPEED_HIGH && | ||
| 178 | (dev->quirks & UVC_QUIRK_STATUS_INTERVAL)) | ||
| 179 | interval = fls(interval) - 1; | ||
| 180 | |||
| 181 | usb_fill_int_urb(dev->int_urb, dev->udev, pipe, | ||
| 182 | dev->status, sizeof dev->status, uvc_status_complete, | ||
| 183 | dev, interval); | ||
| 184 | |||
| 185 | return usb_submit_urb(dev->int_urb, GFP_KERNEL); | ||
| 186 | } | ||
| 187 | |||
| 188 | void uvc_status_cleanup(struct uvc_device *dev) | ||
| 189 | { | ||
| 190 | usb_kill_urb(dev->int_urb); | ||
| 191 | usb_free_urb(dev->int_urb); | ||
| 192 | uvc_input_cleanup(dev); | ||
| 193 | } | ||
| 194 | |||
| 195 | int uvc_status_suspend(struct uvc_device *dev) | ||
| 196 | { | ||
| 197 | usb_kill_urb(dev->int_urb); | ||
| 198 | return 0; | ||
| 199 | } | ||
| 200 | |||
| 201 | int uvc_status_resume(struct uvc_device *dev) | ||
| 202 | { | ||
| 203 | if (dev->int_urb == NULL) | ||
| 204 | return 0; | ||
| 205 | |||
| 206 | return usb_submit_urb(dev->int_urb, GFP_KERNEL); | ||
| 207 | } | ||
diff --git a/drivers/media/video/uvc/uvc_v4l2.c b/drivers/media/video/uvc/uvc_v4l2.c new file mode 100644 index 000000000000..2e0a66575bb4 --- /dev/null +++ b/drivers/media/video/uvc/uvc_v4l2.c | |||
| @@ -0,0 +1,1105 @@ | |||
| 1 | /* | ||
| 2 | * uvc_v4l2.c -- USB Video Class driver - V4L2 API | ||
| 3 | * | ||
| 4 | * Copyright (C) 2005-2008 | ||
| 5 | * Laurent Pinchart (laurent.pinchart@skynet.be) | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <linux/kernel.h> | ||
| 15 | #include <linux/version.h> | ||
| 16 | #include <linux/list.h> | ||
| 17 | #include <linux/module.h> | ||
| 18 | #include <linux/usb.h> | ||
| 19 | #include <linux/videodev2.h> | ||
| 20 | #include <linux/vmalloc.h> | ||
| 21 | #include <linux/mm.h> | ||
| 22 | #include <linux/wait.h> | ||
| 23 | #include <asm/atomic.h> | ||
| 24 | |||
| 25 | #include <media/v4l2-common.h> | ||
| 26 | |||
| 27 | #include "uvcvideo.h" | ||
| 28 | |||
| 29 | /* ------------------------------------------------------------------------ | ||
| 30 | * V4L2 interface | ||
| 31 | */ | ||
| 32 | |||
| 33 | /* | ||
| 34 | * Mapping V4L2 controls to UVC controls can be straighforward if done well. | ||
| 35 | * Most of the UVC controls exist in V4L2, and can be mapped directly. Some | ||
| 36 | * must be grouped (for instance the Red Balance, Blue Balance and Do White | ||
| 37 | * Balance V4L2 controls use the White Balance Component UVC control) or | ||
| 38 | * otherwise translated. The approach we take here is to use a translation | ||
| 39 | * table for the controls which can be mapped directly, and handle the others | ||
| 40 | * manually. | ||
| 41 | */ | ||
| 42 | static int uvc_v4l2_query_menu(struct uvc_video_device *video, | ||
| 43 | struct v4l2_querymenu *query_menu) | ||
| 44 | { | ||
| 45 | struct uvc_menu_info *menu_info; | ||
| 46 | struct uvc_control_mapping *mapping; | ||
| 47 | struct uvc_control *ctrl; | ||
| 48 | |||
| 49 | ctrl = uvc_find_control(video, query_menu->id, &mapping); | ||
| 50 | if (ctrl == NULL || mapping->v4l2_type != V4L2_CTRL_TYPE_MENU) | ||
| 51 | return -EINVAL; | ||
| 52 | |||
| 53 | if (query_menu->index >= mapping->menu_count) | ||
| 54 | return -EINVAL; | ||
| 55 | |||
| 56 | menu_info = &mapping->menu_info[query_menu->index]; | ||
| 57 | strncpy(query_menu->name, menu_info->name, 32); | ||
| 58 | return 0; | ||
| 59 | } | ||
| 60 | |||
| 61 | /* | ||
| 62 | * Find the frame interval closest to the requested frame interval for the | ||
| 63 | * given frame format and size. This should be done by the device as part of | ||
| 64 | * the Video Probe and Commit negotiation, but some hardware don't implement | ||
| 65 | * that feature. | ||
| 66 | */ | ||
| 67 | static __u32 uvc_try_frame_interval(struct uvc_frame *frame, __u32 interval) | ||
| 68 | { | ||
| 69 | unsigned int i; | ||
| 70 | |||
| 71 | if (frame->bFrameIntervalType) { | ||
| 72 | __u32 best = -1, dist; | ||
| 73 | |||
| 74 | for (i = 0; i < frame->bFrameIntervalType; ++i) { | ||
| 75 | dist = interval > frame->dwFrameInterval[i] | ||
| 76 | ? interval - frame->dwFrameInterval[i] | ||
| 77 | : frame->dwFrameInterval[i] - interval; | ||
| 78 | |||
| 79 | if (dist > best) | ||
| 80 | break; | ||
| 81 | |||
| 82 | best = dist; | ||
| 83 | } | ||
| 84 | |||
| 85 | interval = frame->dwFrameInterval[i-1]; | ||
| 86 | } else { | ||
| 87 | const __u32 min = frame->dwFrameInterval[0]; | ||
| 88 | const __u32 max = frame->dwFrameInterval[1]; | ||
| 89 | const __u32 step = frame->dwFrameInterval[2]; | ||
| 90 | |||
| 91 | interval = min + (interval - min + step/2) / step * step; | ||
| 92 | if (interval > max) | ||
| 93 | interval = max; | ||
| 94 | } | ||
| 95 | |||
| 96 | return interval; | ||
| 97 | } | ||
| 98 | |||
| 99 | static int uvc_v4l2_try_format(struct uvc_video_device *video, | ||
| 100 | struct v4l2_format *fmt, struct uvc_streaming_control *probe, | ||
| 101 | struct uvc_format **uvc_format, struct uvc_frame **uvc_frame) | ||
| 102 | { | ||
| 103 | struct uvc_format *format = NULL; | ||
| 104 | struct uvc_frame *frame = NULL; | ||
| 105 | __u16 rw, rh; | ||
| 106 | unsigned int d, maxd; | ||
| 107 | unsigned int i; | ||
| 108 | __u32 interval; | ||
| 109 | int ret = 0; | ||
| 110 | __u8 *fcc; | ||
| 111 | |||
| 112 | if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
| 113 | return -EINVAL; | ||
| 114 | |||
| 115 | fcc = (__u8 *)&fmt->fmt.pix.pixelformat; | ||
| 116 | uvc_trace(UVC_TRACE_FORMAT, "Trying format 0x%08x (%c%c%c%c): %ux%u.\n", | ||
| 117 | fmt->fmt.pix.pixelformat, | ||
| 118 | fcc[0], fcc[1], fcc[2], fcc[3], | ||
| 119 | fmt->fmt.pix.width, fmt->fmt.pix.height); | ||
| 120 | |||
| 121 | /* Check if the hardware supports the requested format. */ | ||
| 122 | for (i = 0; i < video->streaming->nformats; ++i) { | ||
| 123 | format = &video->streaming->format[i]; | ||
| 124 | if (format->fcc == fmt->fmt.pix.pixelformat) | ||
| 125 | break; | ||
| 126 | } | ||
| 127 | |||
| 128 | if (format == NULL || format->fcc != fmt->fmt.pix.pixelformat) { | ||
| 129 | uvc_trace(UVC_TRACE_FORMAT, "Unsupported format 0x%08x.\n", | ||
| 130 | fmt->fmt.pix.pixelformat); | ||
| 131 | return -EINVAL; | ||
| 132 | } | ||
| 133 | |||
| 134 | /* Find the closest image size. The distance between image sizes is | ||
| 135 | * the size in pixels of the non-overlapping regions between the | ||
| 136 | * requested size and the frame-specified size. | ||
| 137 | */ | ||
| 138 | rw = fmt->fmt.pix.width; | ||
| 139 | rh = fmt->fmt.pix.height; | ||
| 140 | maxd = (unsigned int)-1; | ||
| 141 | |||
| 142 | for (i = 0; i < format->nframes; ++i) { | ||
| 143 | __u16 w = format->frame[i].wWidth; | ||
| 144 | __u16 h = format->frame[i].wHeight; | ||
| 145 | |||
| 146 | d = min(w, rw) * min(h, rh); | ||
| 147 | d = w*h + rw*rh - 2*d; | ||
| 148 | if (d < maxd) { | ||
| 149 | maxd = d; | ||
| 150 | frame = &format->frame[i]; | ||
| 151 | } | ||
| 152 | |||
| 153 | if (maxd == 0) | ||
| 154 | break; | ||
| 155 | } | ||
| 156 | |||
| 157 | if (frame == NULL) { | ||
| 158 | uvc_trace(UVC_TRACE_FORMAT, "Unsupported size %ux%u.\n", | ||
| 159 | fmt->fmt.pix.width, fmt->fmt.pix.height); | ||
| 160 | return -EINVAL; | ||
| 161 | } | ||
| 162 | |||
| 163 | /* Use the default frame interval. */ | ||
| 164 | interval = frame->dwDefaultFrameInterval; | ||
| 165 | uvc_trace(UVC_TRACE_FORMAT, "Using default frame interval %u.%u us " | ||
| 166 | "(%u.%u fps).\n", interval/10, interval%10, 10000000/interval, | ||
| 167 | (100000000/interval)%10); | ||
| 168 | |||
| 169 | /* Set the format index, frame index and frame interval. */ | ||
| 170 | memset(probe, 0, sizeof *probe); | ||
| 171 | probe->bmHint = 1; /* dwFrameInterval */ | ||
| 172 | probe->bFormatIndex = format->index; | ||
| 173 | probe->bFrameIndex = frame->bFrameIndex; | ||
| 174 | probe->dwFrameInterval = uvc_try_frame_interval(frame, interval); | ||
| 175 | /* Some webcams stall the probe control set request when the | ||
| 176 | * dwMaxVideoFrameSize field is set to zero. The UVC specification | ||
| 177 | * clearly states that the field is read-only from the host, so this | ||
| 178 | * is a webcam bug. Set dwMaxVideoFrameSize to the value reported by | ||
| 179 | * the webcam to work around the problem. | ||
| 180 | * | ||
| 181 | * The workaround could probably be enabled for all webcams, so the | ||
| 182 | * quirk can be removed if needed. It's currently useful to detect | ||
| 183 | * webcam bugs and fix them before they hit the market (providing | ||
| 184 | * developers test their webcams with the Linux driver as well as with | ||
| 185 | * the Windows driver). | ||
| 186 | */ | ||
| 187 | if (video->dev->quirks & UVC_QUIRK_PROBE_EXTRAFIELDS) | ||
| 188 | probe->dwMaxVideoFrameSize = | ||
| 189 | video->streaming->ctrl.dwMaxVideoFrameSize; | ||
| 190 | |||
| 191 | /* Probe the device */ | ||
| 192 | if ((ret = uvc_probe_video(video, probe)) < 0) | ||
| 193 | goto done; | ||
| 194 | |||
| 195 | fmt->fmt.pix.width = frame->wWidth; | ||
| 196 | fmt->fmt.pix.height = frame->wHeight; | ||
| 197 | fmt->fmt.pix.field = V4L2_FIELD_NONE; | ||
| 198 | fmt->fmt.pix.bytesperline = format->bpp * frame->wWidth / 8; | ||
| 199 | fmt->fmt.pix.sizeimage = probe->dwMaxVideoFrameSize; | ||
| 200 | fmt->fmt.pix.colorspace = format->colorspace; | ||
| 201 | fmt->fmt.pix.priv = 0; | ||
| 202 | |||
| 203 | if (uvc_format != NULL) | ||
| 204 | *uvc_format = format; | ||
| 205 | if (uvc_frame != NULL) | ||
| 206 | *uvc_frame = frame; | ||
| 207 | |||
| 208 | done: | ||
| 209 | return ret; | ||
| 210 | } | ||
| 211 | |||
| 212 | static int uvc_v4l2_get_format(struct uvc_video_device *video, | ||
| 213 | struct v4l2_format *fmt) | ||
| 214 | { | ||
| 215 | struct uvc_format *format = video->streaming->cur_format; | ||
| 216 | struct uvc_frame *frame = video->streaming->cur_frame; | ||
| 217 | |||
| 218 | if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
| 219 | return -EINVAL; | ||
| 220 | |||
| 221 | if (format == NULL || frame == NULL) | ||
| 222 | return -EINVAL; | ||
| 223 | |||
| 224 | fmt->fmt.pix.pixelformat = format->fcc; | ||
| 225 | fmt->fmt.pix.width = frame->wWidth; | ||
| 226 | fmt->fmt.pix.height = frame->wHeight; | ||
| 227 | fmt->fmt.pix.field = V4L2_FIELD_NONE; | ||
| 228 | fmt->fmt.pix.bytesperline = format->bpp * frame->wWidth / 8; | ||
| 229 | fmt->fmt.pix.sizeimage = video->streaming->ctrl.dwMaxVideoFrameSize; | ||
| 230 | fmt->fmt.pix.colorspace = format->colorspace; | ||
| 231 | fmt->fmt.pix.priv = 0; | ||
| 232 | |||
| 233 | return 0; | ||
| 234 | } | ||
| 235 | |||
| 236 | static int uvc_v4l2_set_format(struct uvc_video_device *video, | ||
| 237 | struct v4l2_format *fmt) | ||
| 238 | { | ||
| 239 | struct uvc_streaming_control probe; | ||
| 240 | struct uvc_format *format; | ||
| 241 | struct uvc_frame *frame; | ||
| 242 | int ret; | ||
| 243 | |||
| 244 | if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
| 245 | return -EINVAL; | ||
| 246 | |||
| 247 | if (uvc_queue_streaming(&video->queue)) | ||
| 248 | return -EBUSY; | ||
| 249 | |||
| 250 | ret = uvc_v4l2_try_format(video, fmt, &probe, &format, &frame); | ||
| 251 | if (ret < 0) | ||
| 252 | return ret; | ||
| 253 | |||
| 254 | if ((ret = uvc_set_video_ctrl(video, &probe, 0)) < 0) | ||
| 255 | return ret; | ||
| 256 | |||
| 257 | memcpy(&video->streaming->ctrl, &probe, sizeof probe); | ||
| 258 | video->streaming->cur_format = format; | ||
| 259 | video->streaming->cur_frame = frame; | ||
| 260 | |||
| 261 | return 0; | ||
| 262 | } | ||
| 263 | |||
| 264 | static int uvc_v4l2_get_streamparm(struct uvc_video_device *video, | ||
| 265 | struct v4l2_streamparm *parm) | ||
| 266 | { | ||
| 267 | uint32_t numerator, denominator; | ||
| 268 | |||
| 269 | if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
| 270 | return -EINVAL; | ||
| 271 | |||
| 272 | numerator = video->streaming->ctrl.dwFrameInterval; | ||
| 273 | denominator = 10000000; | ||
| 274 | uvc_simplify_fraction(&numerator, &denominator, 8, 333); | ||
| 275 | |||
| 276 | memset(parm, 0, sizeof *parm); | ||
| 277 | parm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | ||
| 278 | parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME; | ||
| 279 | parm->parm.capture.capturemode = 0; | ||
| 280 | parm->parm.capture.timeperframe.numerator = numerator; | ||
| 281 | parm->parm.capture.timeperframe.denominator = denominator; | ||
| 282 | parm->parm.capture.extendedmode = 0; | ||
| 283 | parm->parm.capture.readbuffers = 0; | ||
| 284 | |||
| 285 | return 0; | ||
| 286 | } | ||
| 287 | |||
| 288 | static int uvc_v4l2_set_streamparm(struct uvc_video_device *video, | ||
| 289 | struct v4l2_streamparm *parm) | ||
| 290 | { | ||
| 291 | struct uvc_frame *frame = video->streaming->cur_frame; | ||
| 292 | struct uvc_streaming_control probe; | ||
| 293 | uint32_t interval; | ||
| 294 | int ret; | ||
| 295 | |||
| 296 | if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
| 297 | return -EINVAL; | ||
| 298 | |||
| 299 | if (uvc_queue_streaming(&video->queue)) | ||
| 300 | return -EBUSY; | ||
| 301 | |||
| 302 | memcpy(&probe, &video->streaming->ctrl, sizeof probe); | ||
| 303 | interval = uvc_fraction_to_interval( | ||
| 304 | parm->parm.capture.timeperframe.numerator, | ||
| 305 | parm->parm.capture.timeperframe.denominator); | ||
| 306 | |||
| 307 | uvc_trace(UVC_TRACE_FORMAT, "Setting frame interval to %u/%u (%u).\n", | ||
| 308 | parm->parm.capture.timeperframe.numerator, | ||
| 309 | parm->parm.capture.timeperframe.denominator, | ||
| 310 | interval); | ||
| 311 | probe.dwFrameInterval = uvc_try_frame_interval(frame, interval); | ||
| 312 | |||
| 313 | /* Probe the device with the new settings. */ | ||
| 314 | if ((ret = uvc_probe_video(video, &probe)) < 0) | ||
| 315 | return ret; | ||
| 316 | |||
| 317 | /* Commit the new settings. */ | ||
| 318 | if ((ret = uvc_set_video_ctrl(video, &probe, 0)) < 0) | ||
| 319 | return ret; | ||
| 320 | |||
| 321 | memcpy(&video->streaming->ctrl, &probe, sizeof probe); | ||
| 322 | |||
| 323 | /* Return the actual frame period. */ | ||
| 324 | parm->parm.capture.timeperframe.numerator = probe.dwFrameInterval; | ||
| 325 | parm->parm.capture.timeperframe.denominator = 10000000; | ||
| 326 | uvc_simplify_fraction(&parm->parm.capture.timeperframe.numerator, | ||
| 327 | &parm->parm.capture.timeperframe.denominator, | ||
| 328 | 8, 333); | ||
| 329 | |||
| 330 | return 0; | ||
| 331 | } | ||
| 332 | |||
| 333 | /* ------------------------------------------------------------------------ | ||
| 334 | * Privilege management | ||
| 335 | */ | ||
| 336 | |||
| 337 | /* | ||
| 338 | * Privilege management is the multiple-open implementation basis. The current | ||
| 339 | * implementation is completely transparent for the end-user and doesn't | ||
| 340 | * require explicit use of the VIDIOC_G_PRIORITY and VIDIOC_S_PRIORITY ioctls. | ||
| 341 | * Those ioctls enable finer control on the device (by making possible for a | ||
| 342 | * user to request exclusive access to a device), but are not mature yet. | ||
| 343 | * Switching to the V4L2 priority mechanism might be considered in the future | ||
| 344 | * if this situation changes. | ||
| 345 | * | ||
| 346 | * Each open instance of a UVC device can either be in a privileged or | ||
| 347 | * unprivileged state. Only a single instance can be in a privileged state at | ||
| 348 | * a given time. Trying to perform an operation which requires privileges will | ||
| 349 | * automatically acquire the required privileges if possible, or return -EBUSY | ||
| 350 | * otherwise. Privileges are dismissed when closing the instance. | ||
| 351 | * | ||
| 352 | * Operations which require privileges are: | ||
| 353 | * | ||
| 354 | * - VIDIOC_S_INPUT | ||
| 355 | * - VIDIOC_S_PARM | ||
| 356 | * - VIDIOC_S_FMT | ||
| 357 | * - VIDIOC_TRY_FMT | ||
| 358 | * - VIDIOC_REQBUFS | ||
| 359 | */ | ||
| 360 | static int uvc_acquire_privileges(struct uvc_fh *handle) | ||
| 361 | { | ||
| 362 | int ret = 0; | ||
| 363 | |||
| 364 | /* Always succeed if the handle is already privileged. */ | ||
| 365 | if (handle->state == UVC_HANDLE_ACTIVE) | ||
| 366 | return 0; | ||
| 367 | |||
| 368 | /* Check if the device already has a privileged handle. */ | ||
| 369 | mutex_lock(&uvc_driver.open_mutex); | ||
| 370 | if (atomic_inc_return(&handle->device->active) != 1) { | ||
| 371 | atomic_dec(&handle->device->active); | ||
| 372 | ret = -EBUSY; | ||
| 373 | goto done; | ||
| 374 | } | ||
| 375 | |||
| 376 | handle->state = UVC_HANDLE_ACTIVE; | ||
| 377 | |||
| 378 | done: | ||
| 379 | mutex_unlock(&uvc_driver.open_mutex); | ||
| 380 | return ret; | ||
| 381 | } | ||
| 382 | |||
| 383 | static void uvc_dismiss_privileges(struct uvc_fh *handle) | ||
| 384 | { | ||
| 385 | if (handle->state == UVC_HANDLE_ACTIVE) | ||
| 386 | atomic_dec(&handle->device->active); | ||
| 387 | |||
| 388 | handle->state = UVC_HANDLE_PASSIVE; | ||
| 389 | } | ||
| 390 | |||
| 391 | static int uvc_has_privileges(struct uvc_fh *handle) | ||
| 392 | { | ||
| 393 | return handle->state == UVC_HANDLE_ACTIVE; | ||
| 394 | } | ||
| 395 | |||
| 396 | /* ------------------------------------------------------------------------ | ||
| 397 | * V4L2 file operations | ||
| 398 | */ | ||
| 399 | |||
| 400 | static int uvc_v4l2_open(struct inode *inode, struct file *file) | ||
| 401 | { | ||
| 402 | struct video_device *vdev; | ||
| 403 | struct uvc_video_device *video; | ||
| 404 | struct uvc_fh *handle; | ||
| 405 | int ret = 0; | ||
| 406 | |||
| 407 | uvc_trace(UVC_TRACE_CALLS, "uvc_v4l2_open\n"); | ||
| 408 | mutex_lock(&uvc_driver.open_mutex); | ||
| 409 | vdev = video_devdata(file); | ||
| 410 | video = video_get_drvdata(vdev); | ||
| 411 | |||
| 412 | if (video->dev->state & UVC_DEV_DISCONNECTED) { | ||
| 413 | ret = -ENODEV; | ||
| 414 | goto done; | ||
| 415 | } | ||
| 416 | |||
| 417 | ret = usb_autopm_get_interface(video->dev->intf); | ||
| 418 | if (ret < 0) | ||
| 419 | goto done; | ||
| 420 | |||
| 421 | /* Create the device handle. */ | ||
| 422 | handle = kzalloc(sizeof *handle, GFP_KERNEL); | ||
| 423 | if (handle == NULL) { | ||
| 424 | usb_autopm_put_interface(video->dev->intf); | ||
| 425 | ret = -ENOMEM; | ||
| 426 | goto done; | ||
| 427 | } | ||
| 428 | |||
| 429 | handle->device = video; | ||
| 430 | handle->state = UVC_HANDLE_PASSIVE; | ||
| 431 | file->private_data = handle; | ||
| 432 | |||
| 433 | kref_get(&video->dev->kref); | ||
| 434 | |||
| 435 | done: | ||
| 436 | mutex_unlock(&uvc_driver.open_mutex); | ||
| 437 | return ret; | ||
| 438 | } | ||
| 439 | |||
| 440 | static int uvc_v4l2_release(struct inode *inode, struct file *file) | ||
| 441 | { | ||
| 442 | struct video_device *vdev = video_devdata(file); | ||
| 443 | struct uvc_video_device *video = video_get_drvdata(vdev); | ||
| 444 | struct uvc_fh *handle = (struct uvc_fh *)file->private_data; | ||
| 445 | |||
| 446 | uvc_trace(UVC_TRACE_CALLS, "uvc_v4l2_release\n"); | ||
| 447 | |||
| 448 | /* Only free resources if this is a privileged handle. */ | ||
| 449 | if (uvc_has_privileges(handle)) { | ||
| 450 | uvc_video_enable(video, 0); | ||
| 451 | |||
| 452 | mutex_lock(&video->queue.mutex); | ||
| 453 | if (uvc_free_buffers(&video->queue) < 0) | ||
| 454 | uvc_printk(KERN_ERR, "uvc_v4l2_release: Unable to " | ||
| 455 | "free buffers.\n"); | ||
| 456 | mutex_unlock(&video->queue.mutex); | ||
| 457 | } | ||
| 458 | |||
| 459 | /* Release the file handle. */ | ||
| 460 | uvc_dismiss_privileges(handle); | ||
| 461 | kfree(handle); | ||
| 462 | file->private_data = NULL; | ||
| 463 | |||
| 464 | usb_autopm_put_interface(video->dev->intf); | ||
| 465 | kref_put(&video->dev->kref, uvc_delete); | ||
| 466 | return 0; | ||
| 467 | } | ||
| 468 | |||
| 469 | static int uvc_v4l2_do_ioctl(struct inode *inode, struct file *file, | ||
| 470 | unsigned int cmd, void *arg) | ||
| 471 | { | ||
| 472 | struct video_device *vdev = video_devdata(file); | ||
| 473 | struct uvc_video_device *video = video_get_drvdata(vdev); | ||
| 474 | struct uvc_fh *handle = (struct uvc_fh *)file->private_data; | ||
| 475 | int ret = 0; | ||
| 476 | |||
| 477 | if (uvc_trace_param & UVC_TRACE_IOCTL) | ||
| 478 | v4l_printk_ioctl(cmd); | ||
| 479 | |||
| 480 | switch (cmd) { | ||
| 481 | /* Query capabilities */ | ||
| 482 | case VIDIOC_QUERYCAP: | ||
| 483 | { | ||
| 484 | struct v4l2_capability *cap = arg; | ||
| 485 | |||
| 486 | memset(cap, 0, sizeof *cap); | ||
| 487 | strncpy(cap->driver, "uvcvideo", sizeof cap->driver); | ||
| 488 | strncpy(cap->card, vdev->name, 32); | ||
| 489 | strncpy(cap->bus_info, video->dev->udev->bus->bus_name, | ||
| 490 | sizeof cap->bus_info); | ||
| 491 | cap->version = DRIVER_VERSION_NUMBER; | ||
| 492 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | ||
| 493 | | V4L2_CAP_STREAMING; | ||
| 494 | break; | ||
| 495 | } | ||
| 496 | |||
| 497 | /* Get, Set & Query control */ | ||
| 498 | case VIDIOC_QUERYCTRL: | ||
| 499 | return uvc_query_v4l2_ctrl(video, arg); | ||
| 500 | |||
| 501 | case VIDIOC_G_CTRL: | ||
| 502 | { | ||
| 503 | struct v4l2_control *ctrl = arg; | ||
| 504 | struct v4l2_ext_control xctrl; | ||
| 505 | |||
| 506 | memset(&xctrl, 0, sizeof xctrl); | ||
| 507 | xctrl.id = ctrl->id; | ||
| 508 | |||
| 509 | uvc_ctrl_begin(video); | ||
| 510 | ret = uvc_ctrl_get(video, &xctrl); | ||
| 511 | uvc_ctrl_rollback(video); | ||
| 512 | if (ret >= 0) | ||
| 513 | ctrl->value = xctrl.value; | ||
| 514 | break; | ||
| 515 | } | ||
| 516 | |||
| 517 | case VIDIOC_S_CTRL: | ||
| 518 | { | ||
| 519 | struct v4l2_control *ctrl = arg; | ||
| 520 | struct v4l2_ext_control xctrl; | ||
| 521 | |||
| 522 | memset(&xctrl, 0, sizeof xctrl); | ||
| 523 | xctrl.id = ctrl->id; | ||
| 524 | xctrl.value = ctrl->value; | ||
| 525 | |||
| 526 | uvc_ctrl_begin(video); | ||
| 527 | ret = uvc_ctrl_set(video, &xctrl); | ||
| 528 | if (ret < 0) { | ||
| 529 | uvc_ctrl_rollback(video); | ||
| 530 | return ret; | ||
| 531 | } | ||
| 532 | ret = uvc_ctrl_commit(video); | ||
| 533 | break; | ||
| 534 | } | ||
| 535 | |||
| 536 | case VIDIOC_QUERYMENU: | ||
| 537 | return uvc_v4l2_query_menu(video, arg); | ||
| 538 | |||
| 539 | case VIDIOC_G_EXT_CTRLS: | ||
| 540 | { | ||
| 541 | struct v4l2_ext_controls *ctrls = arg; | ||
| 542 | struct v4l2_ext_control *ctrl = ctrls->controls; | ||
| 543 | unsigned int i; | ||
| 544 | |||
| 545 | uvc_ctrl_begin(video); | ||
| 546 | for (i = 0; i < ctrls->count; ++ctrl, ++i) { | ||
| 547 | ret = uvc_ctrl_get(video, ctrl); | ||
| 548 | if (ret < 0) { | ||
| 549 | uvc_ctrl_rollback(video); | ||
| 550 | ctrls->error_idx = i; | ||
| 551 | return ret; | ||
| 552 | } | ||
| 553 | } | ||
| 554 | ctrls->error_idx = 0; | ||
| 555 | ret = uvc_ctrl_rollback(video); | ||
| 556 | break; | ||
| 557 | } | ||
| 558 | |||
| 559 | case VIDIOC_S_EXT_CTRLS: | ||
| 560 | case VIDIOC_TRY_EXT_CTRLS: | ||
| 561 | { | ||
| 562 | struct v4l2_ext_controls *ctrls = arg; | ||
| 563 | struct v4l2_ext_control *ctrl = ctrls->controls; | ||
| 564 | unsigned int i; | ||
| 565 | |||
| 566 | ret = uvc_ctrl_begin(video); | ||
| 567 | if (ret < 0) | ||
| 568 | return ret; | ||
| 569 | |||
| 570 | for (i = 0; i < ctrls->count; ++ctrl, ++i) { | ||
| 571 | ret = uvc_ctrl_set(video, ctrl); | ||
| 572 | if (ret < 0) { | ||
| 573 | uvc_ctrl_rollback(video); | ||
| 574 | ctrls->error_idx = i; | ||
| 575 | return ret; | ||
| 576 | } | ||
| 577 | } | ||
| 578 | |||
| 579 | ctrls->error_idx = 0; | ||
| 580 | |||
| 581 | if (cmd == VIDIOC_S_EXT_CTRLS) | ||
| 582 | ret = uvc_ctrl_commit(video); | ||
| 583 | else | ||
| 584 | ret = uvc_ctrl_rollback(video); | ||
| 585 | break; | ||
| 586 | } | ||
| 587 | |||
| 588 | /* Get, Set & Enum input */ | ||
| 589 | case VIDIOC_ENUMINPUT: | ||
| 590 | { | ||
| 591 | const struct uvc_entity *selector = video->selector; | ||
| 592 | struct v4l2_input *input = arg; | ||
| 593 | struct uvc_entity *iterm = NULL; | ||
| 594 | u32 index = input->index; | ||
| 595 | int pin = 0; | ||
| 596 | |||
| 597 | if (selector == NULL || | ||
| 598 | (video->dev->quirks & UVC_QUIRK_IGNORE_SELECTOR_UNIT)) { | ||
| 599 | if (index != 0) | ||
| 600 | return -EINVAL; | ||
| 601 | iterm = list_first_entry(&video->iterms, | ||
| 602 | struct uvc_entity, chain); | ||
| 603 | pin = iterm->id; | ||
| 604 | } else if (pin < selector->selector.bNrInPins) { | ||
| 605 | pin = selector->selector.baSourceID[index]; | ||
| 606 | list_for_each_entry(iterm, video->iterms.next, chain) { | ||
| 607 | if (iterm->id == pin) | ||
| 608 | break; | ||
| 609 | } | ||
| 610 | } | ||
| 611 | |||
| 612 | if (iterm == NULL || iterm->id != pin) | ||
| 613 | return -EINVAL; | ||
| 614 | |||
| 615 | memset(input, 0, sizeof *input); | ||
| 616 | input->index = index; | ||
| 617 | strncpy(input->name, iterm->name, sizeof input->name); | ||
| 618 | if (UVC_ENTITY_TYPE(iterm) == ITT_CAMERA) | ||
| 619 | input->type = V4L2_INPUT_TYPE_CAMERA; | ||
| 620 | break; | ||
| 621 | } | ||
| 622 | |||
| 623 | case VIDIOC_G_INPUT: | ||
| 624 | { | ||
| 625 | u8 input; | ||
| 626 | |||
| 627 | if (video->selector == NULL || | ||
| 628 | (video->dev->quirks & UVC_QUIRK_IGNORE_SELECTOR_UNIT)) { | ||
| 629 | *(int *)arg = 0; | ||
| 630 | break; | ||
| 631 | } | ||
| 632 | |||
| 633 | ret = uvc_query_ctrl(video->dev, GET_CUR, video->selector->id, | ||
| 634 | video->dev->intfnum, SU_INPUT_SELECT_CONTROL, | ||
| 635 | &input, 1); | ||
| 636 | if (ret < 0) | ||
| 637 | return ret; | ||
| 638 | |||
| 639 | *(int *)arg = input - 1; | ||
| 640 | break; | ||
| 641 | } | ||
| 642 | |||
| 643 | case VIDIOC_S_INPUT: | ||
| 644 | { | ||
| 645 | u8 input = *(u32 *)arg + 1; | ||
| 646 | |||
| 647 | if ((ret = uvc_acquire_privileges(handle)) < 0) | ||
| 648 | return ret; | ||
| 649 | |||
| 650 | if (video->selector == NULL || | ||
| 651 | (video->dev->quirks & UVC_QUIRK_IGNORE_SELECTOR_UNIT)) { | ||
| 652 | if (input != 1) | ||
| 653 | return -EINVAL; | ||
| 654 | break; | ||
| 655 | } | ||
| 656 | |||
| 657 | if (input > video->selector->selector.bNrInPins) | ||
| 658 | return -EINVAL; | ||
| 659 | |||
| 660 | return uvc_query_ctrl(video->dev, SET_CUR, video->selector->id, | ||
| 661 | video->dev->intfnum, SU_INPUT_SELECT_CONTROL, | ||
| 662 | &input, 1); | ||
| 663 | } | ||
| 664 | |||
| 665 | /* Try, Get, Set & Enum format */ | ||
| 666 | case VIDIOC_ENUM_FMT: | ||
| 667 | { | ||
| 668 | struct v4l2_fmtdesc *fmt = arg; | ||
| 669 | struct uvc_format *format; | ||
| 670 | |||
| 671 | if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || | ||
| 672 | fmt->index >= video->streaming->nformats) | ||
| 673 | return -EINVAL; | ||
| 674 | |||
| 675 | format = &video->streaming->format[fmt->index]; | ||
| 676 | fmt->flags = 0; | ||
| 677 | if (format->flags & UVC_FMT_FLAG_COMPRESSED) | ||
| 678 | fmt->flags |= V4L2_FMT_FLAG_COMPRESSED; | ||
| 679 | strncpy(fmt->description, format->name, | ||
| 680 | sizeof fmt->description); | ||
| 681 | fmt->description[sizeof fmt->description - 1] = 0; | ||
| 682 | fmt->pixelformat = format->fcc; | ||
| 683 | break; | ||
| 684 | } | ||
| 685 | |||
| 686 | case VIDIOC_TRY_FMT: | ||
| 687 | { | ||
| 688 | struct uvc_streaming_control probe; | ||
| 689 | |||
| 690 | if ((ret = uvc_acquire_privileges(handle)) < 0) | ||
| 691 | return ret; | ||
| 692 | |||
| 693 | return uvc_v4l2_try_format(video, arg, &probe, NULL, NULL); | ||
| 694 | } | ||
| 695 | |||
| 696 | case VIDIOC_S_FMT: | ||
| 697 | if ((ret = uvc_acquire_privileges(handle)) < 0) | ||
| 698 | return ret; | ||
| 699 | |||
| 700 | return uvc_v4l2_set_format(video, arg); | ||
| 701 | |||
| 702 | case VIDIOC_G_FMT: | ||
| 703 | return uvc_v4l2_get_format(video, arg); | ||
| 704 | |||
| 705 | /* Frame size enumeration */ | ||
| 706 | case VIDIOC_ENUM_FRAMESIZES: | ||
| 707 | { | ||
| 708 | struct v4l2_frmsizeenum *fsize = arg; | ||
| 709 | struct uvc_format *format = NULL; | ||
| 710 | struct uvc_frame *frame; | ||
| 711 | int i; | ||
| 712 | |||
| 713 | /* Look for the given pixel format */ | ||
| 714 | for (i = 0; i < video->streaming->nformats; i++) { | ||
| 715 | if (video->streaming->format[i].fcc == | ||
| 716 | fsize->pixel_format) { | ||
| 717 | format = &video->streaming->format[i]; | ||
| 718 | break; | ||
| 719 | } | ||
| 720 | } | ||
| 721 | if (format == NULL) | ||
| 722 | return -EINVAL; | ||
| 723 | |||
| 724 | if (fsize->index >= format->nframes) | ||
| 725 | return -EINVAL; | ||
| 726 | |||
| 727 | frame = &format->frame[fsize->index]; | ||
| 728 | fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE; | ||
| 729 | fsize->discrete.width = frame->wWidth; | ||
| 730 | fsize->discrete.height = frame->wHeight; | ||
| 731 | break; | ||
| 732 | } | ||
| 733 | |||
| 734 | /* Frame interval enumeration */ | ||
| 735 | case VIDIOC_ENUM_FRAMEINTERVALS: | ||
| 736 | { | ||
| 737 | struct v4l2_frmivalenum *fival = arg; | ||
| 738 | struct uvc_format *format = NULL; | ||
| 739 | struct uvc_frame *frame = NULL; | ||
| 740 | int i; | ||
| 741 | |||
| 742 | /* Look for the given pixel format and frame size */ | ||
| 743 | for (i = 0; i < video->streaming->nformats; i++) { | ||
| 744 | if (video->streaming->format[i].fcc == | ||
| 745 | fival->pixel_format) { | ||
| 746 | format = &video->streaming->format[i]; | ||
| 747 | break; | ||
| 748 | } | ||
| 749 | } | ||
| 750 | if (format == NULL) | ||
| 751 | return -EINVAL; | ||
| 752 | |||
| 753 | for (i = 0; i < format->nframes; i++) { | ||
| 754 | if (format->frame[i].wWidth == fival->width && | ||
| 755 | format->frame[i].wHeight == fival->height) { | ||
| 756 | frame = &format->frame[i]; | ||
| 757 | break; | ||
| 758 | } | ||
| 759 | } | ||
| 760 | if (frame == NULL) | ||
| 761 | return -EINVAL; | ||
| 762 | |||
| 763 | if (frame->bFrameIntervalType) { | ||
| 764 | if (fival->index >= frame->bFrameIntervalType) | ||
| 765 | return -EINVAL; | ||
| 766 | |||
| 767 | fival->type = V4L2_FRMIVAL_TYPE_DISCRETE; | ||
| 768 | fival->discrete.numerator = | ||
| 769 | frame->dwFrameInterval[fival->index]; | ||
| 770 | fival->discrete.denominator = 10000000; | ||
| 771 | uvc_simplify_fraction(&fival->discrete.numerator, | ||
| 772 | &fival->discrete.denominator, 8, 333); | ||
| 773 | } else { | ||
| 774 | fival->type = V4L2_FRMIVAL_TYPE_STEPWISE; | ||
| 775 | fival->stepwise.min.numerator = | ||
| 776 | frame->dwFrameInterval[0]; | ||
| 777 | fival->stepwise.min.denominator = 10000000; | ||
| 778 | fival->stepwise.max.numerator = | ||
| 779 | frame->dwFrameInterval[1]; | ||
| 780 | fival->stepwise.max.denominator = 10000000; | ||
| 781 | fival->stepwise.step.numerator = | ||
| 782 | frame->dwFrameInterval[2]; | ||
| 783 | fival->stepwise.step.denominator = 10000000; | ||
| 784 | uvc_simplify_fraction(&fival->stepwise.min.numerator, | ||
| 785 | &fival->stepwise.min.denominator, 8, 333); | ||
| 786 | uvc_simplify_fraction(&fival->stepwise.max.numerator, | ||
| 787 | &fival->stepwise.max.denominator, 8, 333); | ||
| 788 | uvc_simplify_fraction(&fival->stepwise.step.numerator, | ||
| 789 | &fival->stepwise.step.denominator, 8, 333); | ||
| 790 | } | ||
| 791 | break; | ||
| 792 | } | ||
| 793 | |||
| 794 | /* Get & Set streaming parameters */ | ||
| 795 | case VIDIOC_G_PARM: | ||
| 796 | return uvc_v4l2_get_streamparm(video, arg); | ||
| 797 | |||
| 798 | case VIDIOC_S_PARM: | ||
| 799 | if ((ret = uvc_acquire_privileges(handle)) < 0) | ||
| 800 | return ret; | ||
| 801 | |||
| 802 | return uvc_v4l2_set_streamparm(video, arg); | ||
| 803 | |||
| 804 | /* Cropping and scaling */ | ||
| 805 | case VIDIOC_CROPCAP: | ||
| 806 | { | ||
| 807 | struct v4l2_cropcap *ccap = arg; | ||
| 808 | struct uvc_frame *frame = video->streaming->cur_frame; | ||
| 809 | |||
| 810 | if (ccap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
| 811 | return -EINVAL; | ||
| 812 | |||
| 813 | ccap->bounds.left = 0; | ||
| 814 | ccap->bounds.top = 0; | ||
| 815 | ccap->bounds.width = frame->wWidth; | ||
| 816 | ccap->bounds.height = frame->wHeight; | ||
| 817 | |||
| 818 | ccap->defrect = ccap->bounds; | ||
| 819 | |||
| 820 | ccap->pixelaspect.numerator = 1; | ||
| 821 | ccap->pixelaspect.denominator = 1; | ||
| 822 | break; | ||
| 823 | } | ||
| 824 | |||
| 825 | case VIDIOC_G_CROP: | ||
| 826 | case VIDIOC_S_CROP: | ||
| 827 | return -EINVAL; | ||
| 828 | |||
| 829 | /* Buffers & streaming */ | ||
| 830 | case VIDIOC_REQBUFS: | ||
| 831 | { | ||
| 832 | struct v4l2_requestbuffers *rb = arg; | ||
| 833 | unsigned int bufsize = | ||
| 834 | video->streaming->ctrl.dwMaxVideoFrameSize; | ||
| 835 | |||
| 836 | if (rb->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || | ||
| 837 | rb->memory != V4L2_MEMORY_MMAP) | ||
| 838 | return -EINVAL; | ||
| 839 | |||
| 840 | if ((ret = uvc_acquire_privileges(handle)) < 0) | ||
| 841 | return ret; | ||
| 842 | |||
| 843 | ret = uvc_alloc_buffers(&video->queue, rb->count, bufsize); | ||
| 844 | if (ret < 0) | ||
| 845 | return ret; | ||
| 846 | |||
| 847 | if (!(video->streaming->cur_format->flags & | ||
| 848 | UVC_FMT_FLAG_COMPRESSED)) | ||
| 849 | video->queue.flags |= UVC_QUEUE_DROP_INCOMPLETE; | ||
| 850 | |||
| 851 | rb->count = ret; | ||
| 852 | ret = 0; | ||
| 853 | break; | ||
| 854 | } | ||
| 855 | |||
| 856 | case VIDIOC_QUERYBUF: | ||
| 857 | { | ||
| 858 | struct v4l2_buffer *buf = arg; | ||
| 859 | |||
| 860 | if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
| 861 | return -EINVAL; | ||
| 862 | |||
| 863 | if (!uvc_has_privileges(handle)) | ||
| 864 | return -EBUSY; | ||
| 865 | |||
| 866 | return uvc_query_buffer(&video->queue, buf); | ||
| 867 | } | ||
| 868 | |||
| 869 | case VIDIOC_QBUF: | ||
| 870 | if (!uvc_has_privileges(handle)) | ||
| 871 | return -EBUSY; | ||
| 872 | |||
| 873 | return uvc_queue_buffer(&video->queue, arg); | ||
| 874 | |||
| 875 | case VIDIOC_DQBUF: | ||
| 876 | if (!uvc_has_privileges(handle)) | ||
| 877 | return -EBUSY; | ||
| 878 | |||
| 879 | return uvc_dequeue_buffer(&video->queue, arg, | ||
| 880 | file->f_flags & O_NONBLOCK); | ||
| 881 | |||
| 882 | case VIDIOC_STREAMON: | ||
| 883 | { | ||
| 884 | int *type = arg; | ||
| 885 | |||
| 886 | if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
| 887 | return -EINVAL; | ||
| 888 | |||
| 889 | if (!uvc_has_privileges(handle)) | ||
| 890 | return -EBUSY; | ||
| 891 | |||
| 892 | if ((ret = uvc_video_enable(video, 1)) < 0) | ||
| 893 | return ret; | ||
| 894 | break; | ||
| 895 | } | ||
| 896 | |||
| 897 | case VIDIOC_STREAMOFF: | ||
| 898 | { | ||
| 899 | int *type = arg; | ||
| 900 | |||
| 901 | if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
| 902 | return -EINVAL; | ||
| 903 | |||
| 904 | if (!uvc_has_privileges(handle)) | ||
| 905 | return -EBUSY; | ||
| 906 | |||
| 907 | return uvc_video_enable(video, 0); | ||
| 908 | } | ||
| 909 | |||
| 910 | /* Analog video standards make no sense for digital cameras. */ | ||
| 911 | case VIDIOC_ENUMSTD: | ||
| 912 | case VIDIOC_QUERYSTD: | ||
| 913 | case VIDIOC_G_STD: | ||
| 914 | case VIDIOC_S_STD: | ||
| 915 | |||
| 916 | case VIDIOC_OVERLAY: | ||
| 917 | |||
| 918 | case VIDIOC_ENUMAUDIO: | ||
| 919 | case VIDIOC_ENUMAUDOUT: | ||
| 920 | |||
| 921 | case VIDIOC_ENUMOUTPUT: | ||
| 922 | uvc_trace(UVC_TRACE_IOCTL, "Unsupported ioctl 0x%08x\n", cmd); | ||
| 923 | return -EINVAL; | ||
| 924 | |||
| 925 | /* Dynamic controls. */ | ||
| 926 | case UVCIOC_CTRL_ADD: | ||
| 927 | { | ||
| 928 | struct uvc_xu_control_info *xinfo = arg; | ||
| 929 | struct uvc_control_info *info; | ||
| 930 | |||
| 931 | if (!capable(CAP_SYS_ADMIN)) | ||
| 932 | return -EPERM; | ||
| 933 | |||
| 934 | info = kmalloc(sizeof *info, GFP_KERNEL); | ||
| 935 | if (info == NULL) | ||
| 936 | return -ENOMEM; | ||
| 937 | |||
| 938 | memcpy(info->entity, xinfo->entity, sizeof info->entity); | ||
| 939 | info->index = xinfo->index; | ||
| 940 | info->selector = xinfo->selector; | ||
| 941 | info->size = xinfo->size; | ||
| 942 | info->flags = xinfo->flags; | ||
| 943 | |||
| 944 | info->flags |= UVC_CONTROL_GET_MIN | UVC_CONTROL_GET_MAX | | ||
| 945 | UVC_CONTROL_GET_RES | UVC_CONTROL_GET_DEF; | ||
| 946 | |||
| 947 | ret = uvc_ctrl_add_info(info); | ||
| 948 | if (ret < 0) | ||
| 949 | kfree(info); | ||
| 950 | break; | ||
| 951 | } | ||
| 952 | |||
| 953 | case UVCIOC_CTRL_MAP: | ||
| 954 | { | ||
| 955 | struct uvc_xu_control_mapping *xmap = arg; | ||
| 956 | struct uvc_control_mapping *map; | ||
| 957 | |||
| 958 | if (!capable(CAP_SYS_ADMIN)) | ||
| 959 | return -EPERM; | ||
| 960 | |||
| 961 | map = kmalloc(sizeof *map, GFP_KERNEL); | ||
| 962 | if (map == NULL) | ||
| 963 | return -ENOMEM; | ||
| 964 | |||
| 965 | map->id = xmap->id; | ||
| 966 | memcpy(map->name, xmap->name, sizeof map->name); | ||
| 967 | memcpy(map->entity, xmap->entity, sizeof map->entity); | ||
| 968 | map->selector = xmap->selector; | ||
| 969 | map->size = xmap->size; | ||
| 970 | map->offset = xmap->offset; | ||
| 971 | map->v4l2_type = xmap->v4l2_type; | ||
| 972 | map->data_type = xmap->data_type; | ||
| 973 | |||
| 974 | ret = uvc_ctrl_add_mapping(map); | ||
| 975 | if (ret < 0) | ||
| 976 | kfree(map); | ||
| 977 | break; | ||
| 978 | } | ||
| 979 | |||
| 980 | case UVCIOC_CTRL_GET: | ||
| 981 | return uvc_xu_ctrl_query(video, arg, 0); | ||
| 982 | |||
| 983 | case UVCIOC_CTRL_SET: | ||
| 984 | return uvc_xu_ctrl_query(video, arg, 1); | ||
| 985 | |||
| 986 | default: | ||
| 987 | if ((ret = v4l_compat_translate_ioctl(inode, file, cmd, arg, | ||
| 988 | uvc_v4l2_do_ioctl)) == -ENOIOCTLCMD) | ||
| 989 | uvc_trace(UVC_TRACE_IOCTL, "Unknown ioctl 0x%08x\n", | ||
| 990 | cmd); | ||
| 991 | return ret; | ||
| 992 | } | ||
| 993 | |||
| 994 | return ret; | ||
| 995 | } | ||
| 996 | |||
| 997 | static int uvc_v4l2_ioctl(struct inode *inode, struct file *file, | ||
| 998 | unsigned int cmd, unsigned long arg) | ||
| 999 | { | ||
| 1000 | uvc_trace(UVC_TRACE_CALLS, "uvc_v4l2_ioctl\n"); | ||
| 1001 | return video_usercopy(inode, file, cmd, arg, uvc_v4l2_do_ioctl); | ||
| 1002 | } | ||
| 1003 | |||
| 1004 | static ssize_t uvc_v4l2_read(struct file *file, char __user *data, | ||
| 1005 | size_t count, loff_t *ppos) | ||
| 1006 | { | ||
| 1007 | uvc_trace(UVC_TRACE_CALLS, "uvc_v4l2_read: not implemented.\n"); | ||
| 1008 | return -ENODEV; | ||
| 1009 | } | ||
| 1010 | |||
| 1011 | /* | ||
| 1012 | * VMA operations. | ||
| 1013 | */ | ||
| 1014 | static void uvc_vm_open(struct vm_area_struct *vma) | ||
| 1015 | { | ||
| 1016 | struct uvc_buffer *buffer = vma->vm_private_data; | ||
| 1017 | buffer->vma_use_count++; | ||
| 1018 | } | ||
| 1019 | |||
| 1020 | static void uvc_vm_close(struct vm_area_struct *vma) | ||
| 1021 | { | ||
| 1022 | struct uvc_buffer *buffer = vma->vm_private_data; | ||
| 1023 | buffer->vma_use_count--; | ||
| 1024 | } | ||
| 1025 | |||
| 1026 | static struct vm_operations_struct uvc_vm_ops = { | ||
| 1027 | .open = uvc_vm_open, | ||
| 1028 | .close = uvc_vm_close, | ||
| 1029 | }; | ||
| 1030 | |||
| 1031 | static int uvc_v4l2_mmap(struct file *file, struct vm_area_struct *vma) | ||
| 1032 | { | ||
| 1033 | struct video_device *vdev = video_devdata(file); | ||
| 1034 | struct uvc_video_device *video = video_get_drvdata(vdev); | ||
| 1035 | struct uvc_buffer *buffer; | ||
| 1036 | struct page *page; | ||
| 1037 | unsigned long addr, start, size; | ||
| 1038 | unsigned int i; | ||
| 1039 | int ret = 0; | ||
| 1040 | |||
| 1041 | uvc_trace(UVC_TRACE_CALLS, "uvc_v4l2_mmap\n"); | ||
| 1042 | |||
| 1043 | start = vma->vm_start; | ||
| 1044 | size = vma->vm_end - vma->vm_start; | ||
| 1045 | |||
| 1046 | mutex_lock(&video->queue.mutex); | ||
| 1047 | |||
| 1048 | for (i = 0; i < video->queue.count; ++i) { | ||
| 1049 | buffer = &video->queue.buffer[i]; | ||
| 1050 | if ((buffer->buf.m.offset >> PAGE_SHIFT) == vma->vm_pgoff) | ||
| 1051 | break; | ||
| 1052 | } | ||
| 1053 | |||
| 1054 | if (i == video->queue.count || size != video->queue.buf_size) { | ||
| 1055 | ret = -EINVAL; | ||
| 1056 | goto done; | ||
| 1057 | } | ||
| 1058 | |||
| 1059 | /* | ||
| 1060 | * VM_IO marks the area as being an mmaped region for I/O to a | ||
| 1061 | * device. It also prevents the region from being core dumped. | ||
| 1062 | */ | ||
| 1063 | vma->vm_flags |= VM_IO; | ||
| 1064 | |||
| 1065 | addr = (unsigned long)video->queue.mem + buffer->buf.m.offset; | ||
| 1066 | while (size > 0) { | ||
| 1067 | page = vmalloc_to_page((void *)addr); | ||
| 1068 | if ((ret = vm_insert_page(vma, start, page)) < 0) | ||
| 1069 | goto done; | ||
| 1070 | |||
| 1071 | start += PAGE_SIZE; | ||
| 1072 | addr += PAGE_SIZE; | ||
| 1073 | size -= PAGE_SIZE; | ||
| 1074 | } | ||
| 1075 | |||
| 1076 | vma->vm_ops = &uvc_vm_ops; | ||
| 1077 | vma->vm_private_data = buffer; | ||
| 1078 | uvc_vm_open(vma); | ||
| 1079 | |||
| 1080 | done: | ||
| 1081 | mutex_unlock(&video->queue.mutex); | ||
| 1082 | return ret; | ||
| 1083 | } | ||
| 1084 | |||
| 1085 | static unsigned int uvc_v4l2_poll(struct file *file, poll_table *wait) | ||
| 1086 | { | ||
| 1087 | struct video_device *vdev = video_devdata(file); | ||
| 1088 | struct uvc_video_device *video = video_get_drvdata(vdev); | ||
| 1089 | |||
| 1090 | uvc_trace(UVC_TRACE_CALLS, "uvc_v4l2_poll\n"); | ||
| 1091 | |||
| 1092 | return uvc_queue_poll(&video->queue, file, wait); | ||
| 1093 | } | ||
| 1094 | |||
| 1095 | struct file_operations uvc_fops = { | ||
| 1096 | .owner = THIS_MODULE, | ||
| 1097 | .open = uvc_v4l2_open, | ||
| 1098 | .release = uvc_v4l2_release, | ||
| 1099 | .ioctl = uvc_v4l2_ioctl, | ||
| 1100 | .compat_ioctl = v4l_compat_ioctl32, | ||
| 1101 | .llseek = no_llseek, | ||
| 1102 | .read = uvc_v4l2_read, | ||
| 1103 | .mmap = uvc_v4l2_mmap, | ||
| 1104 | .poll = uvc_v4l2_poll, | ||
| 1105 | }; | ||
diff --git a/drivers/media/video/uvc/uvc_video.c b/drivers/media/video/uvc/uvc_video.c new file mode 100644 index 000000000000..6faf1fb21614 --- /dev/null +++ b/drivers/media/video/uvc/uvc_video.c | |||
| @@ -0,0 +1,934 @@ | |||
| 1 | /* | ||
| 2 | * uvc_video.c -- USB Video Class driver - Video handling | ||
| 3 | * | ||
| 4 | * Copyright (C) 2005-2008 | ||
| 5 | * Laurent Pinchart (laurent.pinchart@skynet.be) | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <linux/kernel.h> | ||
| 15 | #include <linux/version.h> | ||
| 16 | #include <linux/list.h> | ||
| 17 | #include <linux/module.h> | ||
| 18 | #include <linux/usb.h> | ||
| 19 | #include <linux/videodev2.h> | ||
| 20 | #include <linux/vmalloc.h> | ||
| 21 | #include <linux/wait.h> | ||
| 22 | #include <asm/atomic.h> | ||
| 23 | #include <asm/unaligned.h> | ||
| 24 | |||
| 25 | #include <media/v4l2-common.h> | ||
| 26 | |||
| 27 | #include "uvcvideo.h" | ||
| 28 | |||
| 29 | /* ------------------------------------------------------------------------ | ||
| 30 | * UVC Controls | ||
| 31 | */ | ||
| 32 | |||
| 33 | static int __uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit, | ||
| 34 | __u8 intfnum, __u8 cs, void *data, __u16 size, | ||
| 35 | int timeout) | ||
| 36 | { | ||
| 37 | __u8 type = USB_TYPE_CLASS | USB_RECIP_INTERFACE; | ||
| 38 | unsigned int pipe; | ||
| 39 | int ret; | ||
| 40 | |||
| 41 | pipe = (query & 0x80) ? usb_rcvctrlpipe(dev->udev, 0) | ||
| 42 | : usb_sndctrlpipe(dev->udev, 0); | ||
| 43 | type |= (query & 0x80) ? USB_DIR_IN : USB_DIR_OUT; | ||
| 44 | |||
| 45 | ret = usb_control_msg(dev->udev, pipe, query, type, cs << 8, | ||
| 46 | unit << 8 | intfnum, data, size, timeout); | ||
| 47 | |||
| 48 | if (ret != size) { | ||
| 49 | uvc_printk(KERN_ERR, "Failed to query (%u) UVC control %u " | ||
| 50 | "(unit %u) : %d (exp. %u).\n", query, cs, unit, ret, | ||
| 51 | size); | ||
| 52 | return -EIO; | ||
| 53 | } | ||
| 54 | |||
| 55 | return 0; | ||
| 56 | } | ||
| 57 | |||
| 58 | int uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit, | ||
| 59 | __u8 intfnum, __u8 cs, void *data, __u16 size) | ||
| 60 | { | ||
| 61 | return __uvc_query_ctrl(dev, query, unit, intfnum, cs, data, size, | ||
| 62 | UVC_CTRL_CONTROL_TIMEOUT); | ||
| 63 | } | ||
| 64 | |||
| 65 | static void uvc_fixup_buffer_size(struct uvc_video_device *video, | ||
| 66 | struct uvc_streaming_control *ctrl) | ||
| 67 | { | ||
| 68 | struct uvc_format *format; | ||
| 69 | struct uvc_frame *frame; | ||
| 70 | |||
| 71 | if (ctrl->bFormatIndex <= 0 || | ||
| 72 | ctrl->bFormatIndex > video->streaming->nformats) | ||
| 73 | return; | ||
| 74 | |||
| 75 | format = &video->streaming->format[ctrl->bFormatIndex - 1]; | ||
| 76 | |||
| 77 | if (ctrl->bFrameIndex <= 0 || | ||
| 78 | ctrl->bFrameIndex > format->nframes) | ||
| 79 | return; | ||
| 80 | |||
| 81 | frame = &format->frame[ctrl->bFrameIndex - 1]; | ||
| 82 | |||
| 83 | if (!(format->flags & UVC_FMT_FLAG_COMPRESSED) || | ||
| 84 | (ctrl->dwMaxVideoFrameSize == 0 && | ||
| 85 | video->dev->uvc_version < 0x0110)) | ||
| 86 | ctrl->dwMaxVideoFrameSize = | ||
| 87 | frame->dwMaxVideoFrameBufferSize; | ||
| 88 | } | ||
| 89 | |||
| 90 | static int uvc_get_video_ctrl(struct uvc_video_device *video, | ||
| 91 | struct uvc_streaming_control *ctrl, int probe, __u8 query) | ||
| 92 | { | ||
| 93 | __u8 data[34]; | ||
| 94 | __u8 size; | ||
| 95 | int ret; | ||
| 96 | |||
| 97 | size = video->dev->uvc_version >= 0x0110 ? 34 : 26; | ||
| 98 | ret = __uvc_query_ctrl(video->dev, query, 0, video->streaming->intfnum, | ||
| 99 | probe ? VS_PROBE_CONTROL : VS_COMMIT_CONTROL, &data, size, | ||
| 100 | UVC_CTRL_STREAMING_TIMEOUT); | ||
| 101 | |||
| 102 | if (ret < 0) | ||
| 103 | return ret; | ||
| 104 | |||
| 105 | ctrl->bmHint = le16_to_cpup((__le16 *)&data[0]); | ||
| 106 | ctrl->bFormatIndex = data[2]; | ||
| 107 | ctrl->bFrameIndex = data[3]; | ||
| 108 | ctrl->dwFrameInterval = le32_to_cpup((__le32 *)&data[4]); | ||
| 109 | ctrl->wKeyFrameRate = le16_to_cpup((__le16 *)&data[8]); | ||
| 110 | ctrl->wPFrameRate = le16_to_cpup((__le16 *)&data[10]); | ||
| 111 | ctrl->wCompQuality = le16_to_cpup((__le16 *)&data[12]); | ||
| 112 | ctrl->wCompWindowSize = le16_to_cpup((__le16 *)&data[14]); | ||
| 113 | ctrl->wDelay = le16_to_cpup((__le16 *)&data[16]); | ||
| 114 | ctrl->dwMaxVideoFrameSize = | ||
| 115 | le32_to_cpu(get_unaligned((__le32 *)&data[18])); | ||
| 116 | ctrl->dwMaxPayloadTransferSize = | ||
| 117 | le32_to_cpu(get_unaligned((__le32 *)&data[22])); | ||
| 118 | |||
| 119 | if (size == 34) { | ||
| 120 | ctrl->dwClockFrequency = | ||
| 121 | le32_to_cpu(get_unaligned((__le32 *)&data[26])); | ||
| 122 | ctrl->bmFramingInfo = data[30]; | ||
| 123 | ctrl->bPreferedVersion = data[31]; | ||
| 124 | ctrl->bMinVersion = data[32]; | ||
| 125 | ctrl->bMaxVersion = data[33]; | ||
| 126 | } else { | ||
| 127 | ctrl->dwClockFrequency = video->dev->clock_frequency; | ||
| 128 | ctrl->bmFramingInfo = 0; | ||
| 129 | ctrl->bPreferedVersion = 0; | ||
| 130 | ctrl->bMinVersion = 0; | ||
| 131 | ctrl->bMaxVersion = 0; | ||
| 132 | } | ||
| 133 | |||
| 134 | /* Some broken devices return a null or wrong dwMaxVideoFrameSize. | ||
| 135 | * Try to get the value from the format and frame descriptor. | ||
| 136 | */ | ||
| 137 | uvc_fixup_buffer_size(video, ctrl); | ||
| 138 | |||
| 139 | return 0; | ||
| 140 | } | ||
| 141 | |||
| 142 | int uvc_set_video_ctrl(struct uvc_video_device *video, | ||
| 143 | struct uvc_streaming_control *ctrl, int probe) | ||
| 144 | { | ||
| 145 | __u8 data[34]; | ||
| 146 | __u8 size; | ||
| 147 | |||
| 148 | size = video->dev->uvc_version >= 0x0110 ? 34 : 26; | ||
| 149 | memset(data, 0, sizeof data); | ||
| 150 | |||
| 151 | *(__le16 *)&data[0] = cpu_to_le16(ctrl->bmHint); | ||
| 152 | data[2] = ctrl->bFormatIndex; | ||
| 153 | data[3] = ctrl->bFrameIndex; | ||
| 154 | *(__le32 *)&data[4] = cpu_to_le32(ctrl->dwFrameInterval); | ||
| 155 | *(__le16 *)&data[8] = cpu_to_le16(ctrl->wKeyFrameRate); | ||
| 156 | *(__le16 *)&data[10] = cpu_to_le16(ctrl->wPFrameRate); | ||
| 157 | *(__le16 *)&data[12] = cpu_to_le16(ctrl->wCompQuality); | ||
| 158 | *(__le16 *)&data[14] = cpu_to_le16(ctrl->wCompWindowSize); | ||
| 159 | *(__le16 *)&data[16] = cpu_to_le16(ctrl->wDelay); | ||
| 160 | /* Note: Some of the fields below are not required for IN devices (see | ||
| 161 | * UVC spec, 4.3.1.1), but we still copy them in case support for OUT | ||
| 162 | * devices is added in the future. */ | ||
| 163 | put_unaligned(cpu_to_le32(ctrl->dwMaxVideoFrameSize), | ||
| 164 | (__le32 *)&data[18]); | ||
| 165 | put_unaligned(cpu_to_le32(ctrl->dwMaxPayloadTransferSize), | ||
| 166 | (__le32 *)&data[22]); | ||
| 167 | |||
| 168 | if (size == 34) { | ||
| 169 | put_unaligned(cpu_to_le32(ctrl->dwClockFrequency), | ||
| 170 | (__le32 *)&data[26]); | ||
| 171 | data[30] = ctrl->bmFramingInfo; | ||
| 172 | data[31] = ctrl->bPreferedVersion; | ||
| 173 | data[32] = ctrl->bMinVersion; | ||
| 174 | data[33] = ctrl->bMaxVersion; | ||
| 175 | } | ||
| 176 | |||
| 177 | return __uvc_query_ctrl(video->dev, SET_CUR, 0, | ||
| 178 | video->streaming->intfnum, | ||
| 179 | probe ? VS_PROBE_CONTROL : VS_COMMIT_CONTROL, &data, size, | ||
| 180 | UVC_CTRL_STREAMING_TIMEOUT); | ||
| 181 | } | ||
| 182 | |||
| 183 | int uvc_probe_video(struct uvc_video_device *video, | ||
| 184 | struct uvc_streaming_control *probe) | ||
| 185 | { | ||
| 186 | struct uvc_streaming_control probe_min, probe_max; | ||
| 187 | __u16 bandwidth; | ||
| 188 | unsigned int i; | ||
| 189 | int ret; | ||
| 190 | |||
| 191 | mutex_lock(&video->streaming->mutex); | ||
| 192 | |||
| 193 | /* Perform probing. The device should adjust the requested values | ||
| 194 | * according to its capabilities. However, some devices, namely the | ||
| 195 | * first generation UVC Logitech webcams, don't implement the Video | ||
| 196 | * Probe control properly, and just return the needed bandwidth. For | ||
| 197 | * that reason, if the needed bandwidth exceeds the maximum available | ||
| 198 | * bandwidth, try to lower the quality. | ||
| 199 | */ | ||
| 200 | if ((ret = uvc_set_video_ctrl(video, probe, 1)) < 0) | ||
| 201 | goto done; | ||
| 202 | |||
| 203 | /* Get the minimum and maximum values for compression settings. */ | ||
| 204 | if (!(video->dev->quirks & UVC_QUIRK_PROBE_MINMAX)) { | ||
| 205 | ret = uvc_get_video_ctrl(video, &probe_min, 1, GET_MIN); | ||
| 206 | if (ret < 0) | ||
| 207 | goto done; | ||
| 208 | ret = uvc_get_video_ctrl(video, &probe_max, 1, GET_MAX); | ||
| 209 | if (ret < 0) | ||
| 210 | goto done; | ||
| 211 | |||
| 212 | probe->wCompQuality = probe_max.wCompQuality; | ||
| 213 | } | ||
| 214 | |||
| 215 | for (i = 0; i < 2; ++i) { | ||
| 216 | if ((ret = uvc_set_video_ctrl(video, probe, 1)) < 0 || | ||
| 217 | (ret = uvc_get_video_ctrl(video, probe, 1, GET_CUR)) < 0) | ||
| 218 | goto done; | ||
| 219 | |||
| 220 | if (video->streaming->intf->num_altsetting == 1) | ||
| 221 | break; | ||
| 222 | |||
| 223 | bandwidth = probe->dwMaxPayloadTransferSize; | ||
| 224 | if (bandwidth <= video->streaming->maxpsize) | ||
| 225 | break; | ||
| 226 | |||
| 227 | if (video->dev->quirks & UVC_QUIRK_PROBE_MINMAX) { | ||
| 228 | ret = -ENOSPC; | ||
| 229 | goto done; | ||
| 230 | } | ||
| 231 | |||
| 232 | /* TODO: negotiate compression parameters */ | ||
| 233 | probe->wKeyFrameRate = probe_min.wKeyFrameRate; | ||
| 234 | probe->wPFrameRate = probe_min.wPFrameRate; | ||
| 235 | probe->wCompQuality = probe_max.wCompQuality; | ||
| 236 | probe->wCompWindowSize = probe_min.wCompWindowSize; | ||
| 237 | } | ||
| 238 | |||
| 239 | done: | ||
| 240 | mutex_unlock(&video->streaming->mutex); | ||
| 241 | return ret; | ||
| 242 | } | ||
| 243 | |||
| 244 | /* ------------------------------------------------------------------------ | ||
| 245 | * Video codecs | ||
| 246 | */ | ||
| 247 | |||
| 248 | /* Values for bmHeaderInfo (Video and Still Image Payload Headers, 2.4.3.3) */ | ||
| 249 | #define UVC_STREAM_EOH (1 << 7) | ||
| 250 | #define UVC_STREAM_ERR (1 << 6) | ||
| 251 | #define UVC_STREAM_STI (1 << 5) | ||
| 252 | #define UVC_STREAM_RES (1 << 4) | ||
| 253 | #define UVC_STREAM_SCR (1 << 3) | ||
| 254 | #define UVC_STREAM_PTS (1 << 2) | ||
| 255 | #define UVC_STREAM_EOF (1 << 1) | ||
| 256 | #define UVC_STREAM_FID (1 << 0) | ||
| 257 | |||
| 258 | /* Video payload decoding is handled by uvc_video_decode_start(), | ||
| 259 | * uvc_video_decode_data() and uvc_video_decode_end(). | ||
| 260 | * | ||
| 261 | * uvc_video_decode_start is called with URB data at the start of a bulk or | ||
| 262 | * isochronous payload. It processes header data and returns the header size | ||
| 263 | * in bytes if successful. If an error occurs, it returns a negative error | ||
| 264 | * code. The following error codes have special meanings. | ||
| 265 | * | ||
| 266 | * - EAGAIN informs the caller that the current video buffer should be marked | ||
| 267 | * as done, and that the function should be called again with the same data | ||
| 268 | * and a new video buffer. This is used when end of frame conditions can be | ||
| 269 | * reliably detected at the beginning of the next frame only. | ||
| 270 | * | ||
| 271 | * If an error other than -EAGAIN is returned, the caller will drop the current | ||
| 272 | * payload. No call to uvc_video_decode_data and uvc_video_decode_end will be | ||
| 273 | * made until the next payload. -ENODATA can be used to drop the current | ||
| 274 | * payload if no other error code is appropriate. | ||
| 275 | * | ||
| 276 | * uvc_video_decode_data is called for every URB with URB data. It copies the | ||
| 277 | * data to the video buffer. | ||
| 278 | * | ||
| 279 | * uvc_video_decode_end is called with header data at the end of a bulk or | ||
| 280 | * isochronous payload. It performs any additional header data processing and | ||
| 281 | * returns 0 or a negative error code if an error occured. As header data have | ||
| 282 | * already been processed by uvc_video_decode_start, this functions isn't | ||
| 283 | * required to perform sanity checks a second time. | ||
| 284 | * | ||
| 285 | * For isochronous transfers where a payload is always transfered in a single | ||
| 286 | * URB, the three functions will be called in a row. | ||
| 287 | * | ||
| 288 | * To let the decoder process header data and update its internal state even | ||
| 289 | * when no video buffer is available, uvc_video_decode_start must be prepared | ||
| 290 | * to be called with a NULL buf parameter. uvc_video_decode_data and | ||
| 291 | * uvc_video_decode_end will never be called with a NULL buffer. | ||
| 292 | */ | ||
| 293 | static int uvc_video_decode_start(struct uvc_video_device *video, | ||
| 294 | struct uvc_buffer *buf, const __u8 *data, int len) | ||
| 295 | { | ||
| 296 | __u8 fid; | ||
| 297 | |||
| 298 | /* Sanity checks: | ||
| 299 | * - packet must be at least 2 bytes long | ||
| 300 | * - bHeaderLength value must be at least 2 bytes (see above) | ||
| 301 | * - bHeaderLength value can't be larger than the packet size. | ||
| 302 | */ | ||
| 303 | if (len < 2 || data[0] < 2 || data[0] > len) | ||
| 304 | return -EINVAL; | ||
| 305 | |||
| 306 | /* Skip payloads marked with the error bit ("error frames"). */ | ||
| 307 | if (data[1] & UVC_STREAM_ERR) { | ||
| 308 | uvc_trace(UVC_TRACE_FRAME, "Dropping payload (error bit " | ||
| 309 | "set).\n"); | ||
| 310 | return -ENODATA; | ||
| 311 | } | ||
| 312 | |||
| 313 | fid = data[1] & UVC_STREAM_FID; | ||
| 314 | |||
| 315 | /* Store the payload FID bit and return immediately when the buffer is | ||
| 316 | * NULL. | ||
| 317 | */ | ||
| 318 | if (buf == NULL) { | ||
| 319 | video->last_fid = fid; | ||
| 320 | return -ENODATA; | ||
| 321 | } | ||
| 322 | |||
| 323 | /* Synchronize to the input stream by waiting for the FID bit to be | ||
| 324 | * toggled when the the buffer state is not UVC_BUF_STATE_ACTIVE. | ||
| 325 | * queue->last_fid is initialized to -1, so the first isochronous | ||
| 326 | * frame will always be in sync. | ||
| 327 | * | ||
| 328 | * If the device doesn't toggle the FID bit, invert video->last_fid | ||
| 329 | * when the EOF bit is set to force synchronisation on the next packet. | ||
| 330 | */ | ||
| 331 | if (buf->state != UVC_BUF_STATE_ACTIVE) { | ||
| 332 | if (fid == video->last_fid) { | ||
| 333 | uvc_trace(UVC_TRACE_FRAME, "Dropping payload (out of " | ||
| 334 | "sync).\n"); | ||
| 335 | if ((video->dev->quirks & UVC_QUIRK_STREAM_NO_FID) && | ||
| 336 | (data[1] & UVC_STREAM_EOF)) | ||
| 337 | video->last_fid ^= UVC_STREAM_FID; | ||
| 338 | return -ENODATA; | ||
| 339 | } | ||
| 340 | |||
| 341 | /* TODO: Handle PTS and SCR. */ | ||
| 342 | buf->state = UVC_BUF_STATE_ACTIVE; | ||
| 343 | } | ||
| 344 | |||
| 345 | /* Mark the buffer as done if we're at the beginning of a new frame. | ||
| 346 | * End of frame detection is better implemented by checking the EOF | ||
| 347 | * bit (FID bit toggling is delayed by one frame compared to the EOF | ||
| 348 | * bit), but some devices don't set the bit at end of frame (and the | ||
| 349 | * last payload can be lost anyway). We thus must check if the FID has | ||
| 350 | * been toggled. | ||
| 351 | * | ||
| 352 | * queue->last_fid is initialized to -1, so the first isochronous | ||
| 353 | * frame will never trigger an end of frame detection. | ||
| 354 | * | ||
| 355 | * Empty buffers (bytesused == 0) don't trigger end of frame detection | ||
| 356 | * as it doesn't make sense to return an empty buffer. This also | ||
| 357 | * avoids detecting and of frame conditions at FID toggling if the | ||
| 358 | * previous payload had the EOF bit set. | ||
| 359 | */ | ||
| 360 | if (fid != video->last_fid && buf->buf.bytesused != 0) { | ||
| 361 | uvc_trace(UVC_TRACE_FRAME, "Frame complete (FID bit " | ||
| 362 | "toggled).\n"); | ||
| 363 | buf->state = UVC_BUF_STATE_DONE; | ||
| 364 | return -EAGAIN; | ||
| 365 | } | ||
| 366 | |||
| 367 | video->last_fid = fid; | ||
| 368 | |||
| 369 | return data[0]; | ||
| 370 | } | ||
| 371 | |||
| 372 | static void uvc_video_decode_data(struct uvc_video_device *video, | ||
| 373 | struct uvc_buffer *buf, const __u8 *data, int len) | ||
| 374 | { | ||
| 375 | struct uvc_video_queue *queue = &video->queue; | ||
| 376 | unsigned int maxlen, nbytes; | ||
| 377 | void *mem; | ||
| 378 | |||
| 379 | if (len <= 0) | ||
| 380 | return; | ||
| 381 | |||
| 382 | /* Copy the video data to the buffer. */ | ||
| 383 | maxlen = buf->buf.length - buf->buf.bytesused; | ||
| 384 | mem = queue->mem + buf->buf.m.offset + buf->buf.bytesused; | ||
| 385 | nbytes = min((unsigned int)len, maxlen); | ||
| 386 | memcpy(mem, data, nbytes); | ||
| 387 | buf->buf.bytesused += nbytes; | ||
| 388 | |||
| 389 | /* Complete the current frame if the buffer size was exceeded. */ | ||
| 390 | if (len > maxlen) { | ||
| 391 | uvc_trace(UVC_TRACE_FRAME, "Frame complete (overflow).\n"); | ||
| 392 | buf->state = UVC_BUF_STATE_DONE; | ||
| 393 | } | ||
| 394 | } | ||
| 395 | |||
| 396 | static void uvc_video_decode_end(struct uvc_video_device *video, | ||
| 397 | struct uvc_buffer *buf, const __u8 *data, int len) | ||
| 398 | { | ||
| 399 | /* Mark the buffer as done if the EOF marker is set. */ | ||
| 400 | if (data[1] & UVC_STREAM_EOF && buf->buf.bytesused != 0) { | ||
| 401 | uvc_trace(UVC_TRACE_FRAME, "Frame complete (EOF found).\n"); | ||
| 402 | if (data[0] == len) | ||
| 403 | uvc_trace(UVC_TRACE_FRAME, "EOF in empty payload.\n"); | ||
| 404 | buf->state = UVC_BUF_STATE_DONE; | ||
| 405 | if (video->dev->quirks & UVC_QUIRK_STREAM_NO_FID) | ||
| 406 | video->last_fid ^= UVC_STREAM_FID; | ||
| 407 | } | ||
| 408 | } | ||
| 409 | |||
| 410 | /* ------------------------------------------------------------------------ | ||
| 411 | * URB handling | ||
| 412 | */ | ||
| 413 | |||
| 414 | /* | ||
| 415 | * Completion handler for video URBs. | ||
| 416 | */ | ||
| 417 | static void uvc_video_decode_isoc(struct urb *urb, | ||
| 418 | struct uvc_video_device *video, struct uvc_buffer *buf) | ||
| 419 | { | ||
| 420 | u8 *mem; | ||
| 421 | int ret, i; | ||
| 422 | |||
| 423 | for (i = 0; i < urb->number_of_packets; ++i) { | ||
| 424 | if (urb->iso_frame_desc[i].status < 0) { | ||
| 425 | uvc_trace(UVC_TRACE_FRAME, "USB isochronous frame " | ||
| 426 | "lost (%d).\n", urb->iso_frame_desc[i].status); | ||
| 427 | continue; | ||
| 428 | } | ||
| 429 | |||
| 430 | /* Decode the payload header. */ | ||
| 431 | mem = urb->transfer_buffer + urb->iso_frame_desc[i].offset; | ||
| 432 | do { | ||
| 433 | ret = uvc_video_decode_start(video, buf, mem, | ||
| 434 | urb->iso_frame_desc[i].actual_length); | ||
| 435 | if (ret == -EAGAIN) | ||
| 436 | buf = uvc_queue_next_buffer(&video->queue, buf); | ||
| 437 | } while (ret == -EAGAIN); | ||
| 438 | |||
| 439 | if (ret < 0) | ||
| 440 | continue; | ||
| 441 | |||
| 442 | /* Decode the payload data. */ | ||
| 443 | uvc_video_decode_data(video, buf, mem + ret, | ||
| 444 | urb->iso_frame_desc[i].actual_length - ret); | ||
| 445 | |||
| 446 | /* Process the header again. */ | ||
| 447 | uvc_video_decode_end(video, buf, mem, ret); | ||
| 448 | |||
| 449 | if (buf->state == UVC_BUF_STATE_DONE || | ||
| 450 | buf->state == UVC_BUF_STATE_ERROR) | ||
| 451 | buf = uvc_queue_next_buffer(&video->queue, buf); | ||
| 452 | } | ||
| 453 | } | ||
| 454 | |||
| 455 | static void uvc_video_decode_bulk(struct urb *urb, | ||
| 456 | struct uvc_video_device *video, struct uvc_buffer *buf) | ||
| 457 | { | ||
| 458 | u8 *mem; | ||
| 459 | int len, ret; | ||
| 460 | |||
| 461 | mem = urb->transfer_buffer; | ||
| 462 | len = urb->actual_length; | ||
| 463 | video->bulk.payload_size += len; | ||
| 464 | |||
| 465 | /* If the URB is the first of its payload, decode and save the | ||
| 466 | * header. | ||
| 467 | */ | ||
| 468 | if (video->bulk.header_size == 0) { | ||
| 469 | do { | ||
| 470 | ret = uvc_video_decode_start(video, buf, mem, len); | ||
| 471 | if (ret == -EAGAIN) | ||
| 472 | buf = uvc_queue_next_buffer(&video->queue, buf); | ||
| 473 | } while (ret == -EAGAIN); | ||
| 474 | |||
| 475 | /* If an error occured skip the rest of the payload. */ | ||
| 476 | if (ret < 0 || buf == NULL) { | ||
| 477 | video->bulk.skip_payload = 1; | ||
| 478 | return; | ||
| 479 | } | ||
| 480 | |||
| 481 | video->bulk.header_size = ret; | ||
| 482 | memcpy(video->bulk.header, mem, video->bulk.header_size); | ||
| 483 | |||
| 484 | mem += ret; | ||
| 485 | len -= ret; | ||
| 486 | } | ||
| 487 | |||
| 488 | /* The buffer queue might have been cancelled while a bulk transfer | ||
| 489 | * was in progress, so we can reach here with buf equal to NULL. Make | ||
| 490 | * sure buf is never dereferenced if NULL. | ||
| 491 | */ | ||
| 492 | |||
| 493 | /* Process video data. */ | ||
| 494 | if (!video->bulk.skip_payload && buf != NULL) | ||
| 495 | uvc_video_decode_data(video, buf, mem, len); | ||
| 496 | |||
| 497 | /* Detect the payload end by a URB smaller than the maximum size (or | ||
| 498 | * a payload size equal to the maximum) and process the header again. | ||
| 499 | */ | ||
| 500 | if (urb->actual_length < urb->transfer_buffer_length || | ||
| 501 | video->bulk.payload_size >= video->bulk.max_payload_size) { | ||
| 502 | if (!video->bulk.skip_payload && buf != NULL) { | ||
| 503 | uvc_video_decode_end(video, buf, video->bulk.header, | ||
| 504 | video->bulk.header_size); | ||
| 505 | if (buf->state == UVC_BUF_STATE_DONE || | ||
| 506 | buf->state == UVC_BUF_STATE_ERROR) | ||
| 507 | buf = uvc_queue_next_buffer(&video->queue, buf); | ||
| 508 | } | ||
| 509 | |||
| 510 | video->bulk.header_size = 0; | ||
| 511 | video->bulk.skip_payload = 0; | ||
| 512 | video->bulk.payload_size = 0; | ||
| 513 | } | ||
| 514 | } | ||
| 515 | |||
| 516 | static void uvc_video_complete(struct urb *urb) | ||
| 517 | { | ||
| 518 | struct uvc_video_device *video = urb->context; | ||
| 519 | struct uvc_video_queue *queue = &video->queue; | ||
| 520 | struct uvc_buffer *buf = NULL; | ||
| 521 | unsigned long flags; | ||
| 522 | int ret; | ||
| 523 | |||
| 524 | switch (urb->status) { | ||
| 525 | case 0: | ||
| 526 | break; | ||
| 527 | |||
| 528 | default: | ||
| 529 | uvc_printk(KERN_WARNING, "Non-zero status (%d) in video " | ||
| 530 | "completion handler.\n", urb->status); | ||
| 531 | |||
| 532 | case -ENOENT: /* usb_kill_urb() called. */ | ||
| 533 | if (video->frozen) | ||
| 534 | return; | ||
| 535 | |||
| 536 | case -ECONNRESET: /* usb_unlink_urb() called. */ | ||
| 537 | case -ESHUTDOWN: /* The endpoint is being disabled. */ | ||
| 538 | uvc_queue_cancel(queue, urb->status == -ESHUTDOWN); | ||
| 539 | return; | ||
| 540 | } | ||
| 541 | |||
| 542 | spin_lock_irqsave(&queue->irqlock, flags); | ||
| 543 | if (!list_empty(&queue->irqqueue)) | ||
| 544 | buf = list_first_entry(&queue->irqqueue, struct uvc_buffer, | ||
| 545 | queue); | ||
| 546 | spin_unlock_irqrestore(&queue->irqlock, flags); | ||
| 547 | |||
| 548 | video->decode(urb, video, buf); | ||
| 549 | |||
| 550 | if ((ret = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { | ||
| 551 | uvc_printk(KERN_ERR, "Failed to resubmit video URB (%d).\n", | ||
| 552 | ret); | ||
| 553 | } | ||
| 554 | } | ||
| 555 | |||
| 556 | /* | ||
| 557 | * Uninitialize isochronous/bulk URBs and free transfer buffers. | ||
| 558 | */ | ||
| 559 | static void uvc_uninit_video(struct uvc_video_device *video) | ||
| 560 | { | ||
| 561 | struct urb *urb; | ||
| 562 | unsigned int i; | ||
| 563 | |||
| 564 | for (i = 0; i < UVC_URBS; ++i) { | ||
| 565 | if ((urb = video->urb[i]) == NULL) | ||
| 566 | continue; | ||
| 567 | |||
| 568 | usb_kill_urb(urb); | ||
| 569 | /* urb->transfer_buffer_length is not touched by USB core, so | ||
| 570 | * we can use it here as the buffer length. | ||
| 571 | */ | ||
| 572 | if (video->urb_buffer[i]) { | ||
| 573 | usb_buffer_free(video->dev->udev, | ||
| 574 | urb->transfer_buffer_length, | ||
| 575 | video->urb_buffer[i], urb->transfer_dma); | ||
| 576 | video->urb_buffer[i] = NULL; | ||
| 577 | } | ||
| 578 | |||
| 579 | usb_free_urb(urb); | ||
| 580 | video->urb[i] = NULL; | ||
| 581 | } | ||
| 582 | } | ||
| 583 | |||
| 584 | /* | ||
| 585 | * Initialize isochronous URBs and allocate transfer buffers. The packet size | ||
| 586 | * is given by the endpoint. | ||
| 587 | */ | ||
| 588 | static int uvc_init_video_isoc(struct uvc_video_device *video, | ||
| 589 | struct usb_host_endpoint *ep) | ||
| 590 | { | ||
| 591 | struct urb *urb; | ||
| 592 | unsigned int npackets, i, j; | ||
| 593 | __u16 psize; | ||
| 594 | __u32 size; | ||
| 595 | |||
| 596 | /* Compute the number of isochronous packets to allocate by dividing | ||
| 597 | * the maximum video frame size by the packet size. Limit the result | ||
| 598 | * to UVC_MAX_ISO_PACKETS. | ||
| 599 | */ | ||
| 600 | psize = le16_to_cpu(ep->desc.wMaxPacketSize); | ||
| 601 | psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3)); | ||
| 602 | |||
| 603 | size = video->streaming->ctrl.dwMaxVideoFrameSize; | ||
| 604 | if (size > UVC_MAX_FRAME_SIZE) | ||
| 605 | return -EINVAL; | ||
| 606 | |||
| 607 | npackets = (size + psize - 1) / psize; | ||
| 608 | if (npackets > UVC_MAX_ISO_PACKETS) | ||
| 609 | npackets = UVC_MAX_ISO_PACKETS; | ||
| 610 | |||
| 611 | size = npackets * psize; | ||
| 612 | |||
| 613 | for (i = 0; i < UVC_URBS; ++i) { | ||
| 614 | urb = usb_alloc_urb(npackets, GFP_KERNEL); | ||
| 615 | if (urb == NULL) { | ||
| 616 | uvc_uninit_video(video); | ||
| 617 | return -ENOMEM; | ||
| 618 | } | ||
| 619 | |||
| 620 | video->urb_buffer[i] = usb_buffer_alloc(video->dev->udev, | ||
| 621 | size, GFP_KERNEL, &urb->transfer_dma); | ||
| 622 | if (video->urb_buffer[i] == NULL) { | ||
| 623 | usb_free_urb(urb); | ||
| 624 | uvc_uninit_video(video); | ||
| 625 | return -ENOMEM; | ||
| 626 | } | ||
| 627 | |||
| 628 | urb->dev = video->dev->udev; | ||
| 629 | urb->context = video; | ||
| 630 | urb->pipe = usb_rcvisocpipe(video->dev->udev, | ||
| 631 | ep->desc.bEndpointAddress); | ||
| 632 | urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP; | ||
| 633 | urb->interval = ep->desc.bInterval; | ||
| 634 | urb->transfer_buffer = video->urb_buffer[i]; | ||
| 635 | urb->complete = uvc_video_complete; | ||
| 636 | urb->number_of_packets = npackets; | ||
| 637 | urb->transfer_buffer_length = size; | ||
| 638 | |||
| 639 | for (j = 0; j < npackets; ++j) { | ||
| 640 | urb->iso_frame_desc[j].offset = j * psize; | ||
| 641 | urb->iso_frame_desc[j].length = psize; | ||
| 642 | } | ||
| 643 | |||
| 644 | video->urb[i] = urb; | ||
| 645 | } | ||
| 646 | |||
| 647 | return 0; | ||
| 648 | } | ||
| 649 | |||
| 650 | /* | ||
| 651 | * Initialize bulk URBs and allocate transfer buffers. The packet size is | ||
| 652 | * given by the endpoint. | ||
| 653 | */ | ||
| 654 | static int uvc_init_video_bulk(struct uvc_video_device *video, | ||
| 655 | struct usb_host_endpoint *ep) | ||
| 656 | { | ||
| 657 | struct urb *urb; | ||
| 658 | unsigned int pipe, i; | ||
| 659 | __u16 psize; | ||
| 660 | __u32 size; | ||
| 661 | |||
| 662 | /* Compute the bulk URB size. Some devices set the maximum payload | ||
| 663 | * size to a value too high for memory-constrained devices. We must | ||
| 664 | * then transfer the payload accross multiple URBs. To be consistant | ||
| 665 | * with isochronous mode, allocate maximum UVC_MAX_ISO_PACKETS per bulk | ||
| 666 | * URB. | ||
| 667 | */ | ||
| 668 | psize = le16_to_cpu(ep->desc.wMaxPacketSize) & 0x07ff; | ||
| 669 | size = video->streaming->ctrl.dwMaxPayloadTransferSize; | ||
| 670 | video->bulk.max_payload_size = size; | ||
| 671 | if (size > psize * UVC_MAX_ISO_PACKETS) | ||
| 672 | size = psize * UVC_MAX_ISO_PACKETS; | ||
| 673 | |||
| 674 | pipe = usb_rcvbulkpipe(video->dev->udev, ep->desc.bEndpointAddress); | ||
| 675 | |||
| 676 | for (i = 0; i < UVC_URBS; ++i) { | ||
| 677 | urb = usb_alloc_urb(0, GFP_KERNEL); | ||
| 678 | if (urb == NULL) { | ||
| 679 | uvc_uninit_video(video); | ||
| 680 | return -ENOMEM; | ||
| 681 | } | ||
| 682 | |||
| 683 | video->urb_buffer[i] = usb_buffer_alloc(video->dev->udev, | ||
| 684 | size, GFP_KERNEL, &urb->transfer_dma); | ||
| 685 | if (video->urb_buffer[i] == NULL) { | ||
| 686 | usb_free_urb(urb); | ||
| 687 | uvc_uninit_video(video); | ||
| 688 | return -ENOMEM; | ||
| 689 | } | ||
| 690 | |||
| 691 | usb_fill_bulk_urb(urb, video->dev->udev, pipe, | ||
| 692 | video->urb_buffer[i], size, uvc_video_complete, | ||
| 693 | video); | ||
| 694 | urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; | ||
| 695 | |||
| 696 | video->urb[i] = urb; | ||
| 697 | } | ||
| 698 | |||
| 699 | return 0; | ||
| 700 | } | ||
| 701 | |||
| 702 | /* | ||
| 703 | * Initialize isochronous/bulk URBs and allocate transfer buffers. | ||
| 704 | */ | ||
| 705 | static int uvc_init_video(struct uvc_video_device *video) | ||
| 706 | { | ||
| 707 | struct usb_interface *intf = video->streaming->intf; | ||
| 708 | struct usb_host_interface *alts; | ||
| 709 | struct usb_host_endpoint *ep = NULL; | ||
| 710 | int intfnum = video->streaming->intfnum; | ||
| 711 | unsigned int bandwidth, psize, i; | ||
| 712 | int ret; | ||
| 713 | |||
| 714 | video->last_fid = -1; | ||
| 715 | video->bulk.header_size = 0; | ||
| 716 | video->bulk.skip_payload = 0; | ||
| 717 | video->bulk.payload_size = 0; | ||
| 718 | |||
| 719 | if (intf->num_altsetting > 1) { | ||
| 720 | /* Isochronous endpoint, select the alternate setting. */ | ||
| 721 | bandwidth = video->streaming->ctrl.dwMaxPayloadTransferSize; | ||
| 722 | |||
| 723 | if (bandwidth == 0) { | ||
| 724 | uvc_printk(KERN_WARNING, "device %s requested null " | ||
| 725 | "bandwidth, defaulting to lowest.\n", | ||
| 726 | video->vdev->name); | ||
| 727 | bandwidth = 1; | ||
| 728 | } | ||
| 729 | |||
| 730 | for (i = 0; i < intf->num_altsetting; ++i) { | ||
| 731 | alts = &intf->altsetting[i]; | ||
| 732 | ep = uvc_find_endpoint(alts, | ||
| 733 | video->streaming->header.bEndpointAddress); | ||
| 734 | if (ep == NULL) | ||
| 735 | continue; | ||
| 736 | |||
| 737 | /* Check if the bandwidth is high enough. */ | ||
| 738 | psize = le16_to_cpu(ep->desc.wMaxPacketSize); | ||
| 739 | psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3)); | ||
| 740 | if (psize >= bandwidth) | ||
| 741 | break; | ||
| 742 | } | ||
| 743 | |||
| 744 | if (i >= intf->num_altsetting) | ||
| 745 | return -EIO; | ||
| 746 | |||
| 747 | if ((ret = usb_set_interface(video->dev->udev, intfnum, i)) < 0) | ||
| 748 | return ret; | ||
| 749 | |||
| 750 | ret = uvc_init_video_isoc(video, ep); | ||
| 751 | } else { | ||
| 752 | /* Bulk endpoint, proceed to URB initialization. */ | ||
| 753 | ep = uvc_find_endpoint(&intf->altsetting[0], | ||
| 754 | video->streaming->header.bEndpointAddress); | ||
| 755 | if (ep == NULL) | ||
| 756 | return -EIO; | ||
| 757 | |||
| 758 | ret = uvc_init_video_bulk(video, ep); | ||
| 759 | } | ||
| 760 | |||
| 761 | if (ret < 0) | ||
| 762 | return ret; | ||
| 763 | |||
| 764 | /* Submit the URBs. */ | ||
| 765 | for (i = 0; i < UVC_URBS; ++i) { | ||
| 766 | if ((ret = usb_submit_urb(video->urb[i], GFP_KERNEL)) < 0) { | ||
| 767 | uvc_printk(KERN_ERR, "Failed to submit URB %u " | ||
| 768 | "(%d).\n", i, ret); | ||
| 769 | uvc_uninit_video(video); | ||
| 770 | return ret; | ||
| 771 | } | ||
| 772 | } | ||
| 773 | |||
| 774 | return 0; | ||
| 775 | } | ||
| 776 | |||
| 777 | /* -------------------------------------------------------------------------- | ||
| 778 | * Suspend/resume | ||
| 779 | */ | ||
| 780 | |||
| 781 | /* | ||
| 782 | * Stop streaming without disabling the video queue. | ||
| 783 | * | ||
| 784 | * To let userspace applications resume without trouble, we must not touch the | ||
| 785 | * video buffers in any way. We mark the device as frozen to make sure the URB | ||
| 786 | * completion handler won't try to cancel the queue when we kill the URBs. | ||
| 787 | */ | ||
| 788 | int uvc_video_suspend(struct uvc_video_device *video) | ||
| 789 | { | ||
| 790 | if (!uvc_queue_streaming(&video->queue)) | ||
| 791 | return 0; | ||
| 792 | |||
| 793 | video->frozen = 1; | ||
| 794 | uvc_uninit_video(video); | ||
| 795 | usb_set_interface(video->dev->udev, video->streaming->intfnum, 0); | ||
| 796 | return 0; | ||
| 797 | } | ||
| 798 | |||
| 799 | /* | ||
| 800 | * Reconfigure the video interface and restart streaming if it was enable | ||
| 801 | * before suspend. | ||
| 802 | * | ||
| 803 | * If an error occurs, disable the video queue. This will wake all pending | ||
| 804 | * buffers, making sure userspace applications are notified of the problem | ||
| 805 | * instead of waiting forever. | ||
| 806 | */ | ||
| 807 | int uvc_video_resume(struct uvc_video_device *video) | ||
| 808 | { | ||
| 809 | int ret; | ||
| 810 | |||
| 811 | video->frozen = 0; | ||
| 812 | |||
| 813 | if ((ret = uvc_set_video_ctrl(video, &video->streaming->ctrl, 0)) < 0) { | ||
| 814 | uvc_queue_enable(&video->queue, 0); | ||
| 815 | return ret; | ||
| 816 | } | ||
| 817 | |||
| 818 | if (!uvc_queue_streaming(&video->queue)) | ||
| 819 | return 0; | ||
| 820 | |||
| 821 | if ((ret = uvc_init_video(video)) < 0) | ||
| 822 | uvc_queue_enable(&video->queue, 0); | ||
| 823 | |||
| 824 | return ret; | ||
| 825 | } | ||
| 826 | |||
| 827 | /* ------------------------------------------------------------------------ | ||
| 828 | * Video device | ||
| 829 | */ | ||
| 830 | |||
| 831 | /* | ||
| 832 | * Initialize the UVC video device by retrieving the default format and | ||
| 833 | * committing it. | ||
| 834 | * | ||
| 835 | * Some cameras (namely the Fuji Finepix) set the format and frame | ||
| 836 | * indexes to zero. The UVC standard doesn't clearly make this a spec | ||
| 837 | * violation, so try to silently fix the values if possible. | ||
| 838 | * | ||
| 839 | * This function is called before registering the device with V4L. | ||
| 840 | */ | ||
| 841 | int uvc_video_init(struct uvc_video_device *video) | ||
| 842 | { | ||
| 843 | struct uvc_streaming_control *probe = &video->streaming->ctrl; | ||
| 844 | struct uvc_format *format = NULL; | ||
| 845 | struct uvc_frame *frame = NULL; | ||
| 846 | unsigned int i; | ||
| 847 | int ret; | ||
| 848 | |||
| 849 | if (video->streaming->nformats == 0) { | ||
| 850 | uvc_printk(KERN_INFO, "No supported video formats found.\n"); | ||
| 851 | return -EINVAL; | ||
| 852 | } | ||
| 853 | |||
| 854 | /* Alternate setting 0 should be the default, yet the XBox Live Vision | ||
| 855 | * Cam (and possibly other devices) crash or otherwise misbehave if | ||
| 856 | * they don't receive a SET_INTERFACE request before any other video | ||
| 857 | * control request. | ||
| 858 | */ | ||
| 859 | usb_set_interface(video->dev->udev, video->streaming->intfnum, 0); | ||
| 860 | |||
| 861 | /* Some webcams don't suport GET_DEF request on the probe control. We | ||
| 862 | * fall back to GET_CUR if GET_DEF fails. | ||
| 863 | */ | ||
| 864 | if ((ret = uvc_get_video_ctrl(video, probe, 1, GET_DEF)) < 0 && | ||
| 865 | (ret = uvc_get_video_ctrl(video, probe, 1, GET_CUR)) < 0) | ||
| 866 | return ret; | ||
| 867 | |||
| 868 | /* Check if the default format descriptor exists. Use the first | ||
| 869 | * available format otherwise. | ||
| 870 | */ | ||
| 871 | for (i = video->streaming->nformats; i > 0; --i) { | ||
| 872 | format = &video->streaming->format[i-1]; | ||
| 873 | if (format->index == probe->bFormatIndex) | ||
| 874 | break; | ||
| 875 | } | ||
| 876 | |||
| 877 | if (format->nframes == 0) { | ||
| 878 | uvc_printk(KERN_INFO, "No frame descriptor found for the " | ||
| 879 | "default format.\n"); | ||
| 880 | return -EINVAL; | ||
| 881 | } | ||
| 882 | |||
| 883 | /* Zero bFrameIndex might be correct. Stream-based formats (including | ||
| 884 | * MPEG-2 TS and DV) do not support frames but have a dummy frame | ||
| 885 | * descriptor with bFrameIndex set to zero. If the default frame | ||
| 886 | * descriptor is not found, use the first avalable frame. | ||
| 887 | */ | ||
| 888 | for (i = format->nframes; i > 0; --i) { | ||
| 889 | frame = &format->frame[i-1]; | ||
| 890 | if (frame->bFrameIndex == probe->bFrameIndex) | ||
| 891 | break; | ||
| 892 | } | ||
| 893 | |||
| 894 | /* Commit the default settings. */ | ||
| 895 | probe->bFormatIndex = format->index; | ||
| 896 | probe->bFrameIndex = frame->bFrameIndex; | ||
| 897 | if ((ret = uvc_set_video_ctrl(video, probe, 0)) < 0) | ||
| 898 | return ret; | ||
| 899 | |||
| 900 | video->streaming->cur_format = format; | ||
| 901 | video->streaming->cur_frame = frame; | ||
| 902 | atomic_set(&video->active, 0); | ||
| 903 | |||
| 904 | /* Select the video decoding function */ | ||
| 905 | if (video->dev->quirks & UVC_QUIRK_BUILTIN_ISIGHT) | ||
| 906 | video->decode = uvc_video_decode_isight; | ||
| 907 | else if (video->streaming->intf->num_altsetting > 1) | ||
| 908 | video->decode = uvc_video_decode_isoc; | ||
| 909 | else | ||
| 910 | video->decode = uvc_video_decode_bulk; | ||
| 911 | |||
| 912 | return 0; | ||
| 913 | } | ||
| 914 | |||
| 915 | /* | ||
| 916 | * Enable or disable the video stream. | ||
| 917 | */ | ||
| 918 | int uvc_video_enable(struct uvc_video_device *video, int enable) | ||
| 919 | { | ||
| 920 | int ret; | ||
| 921 | |||
| 922 | if (!enable) { | ||
| 923 | uvc_uninit_video(video); | ||
| 924 | usb_set_interface(video->dev->udev, | ||
| 925 | video->streaming->intfnum, 0); | ||
| 926 | uvc_queue_enable(&video->queue, 0); | ||
| 927 | return 0; | ||
| 928 | } | ||
| 929 | |||
| 930 | if ((ret = uvc_queue_enable(&video->queue, 1)) < 0) | ||
| 931 | return ret; | ||
| 932 | |||
| 933 | return uvc_init_video(video); | ||
| 934 | } | ||
diff --git a/drivers/media/video/uvc/uvcvideo.h b/drivers/media/video/uvc/uvcvideo.h new file mode 100644 index 000000000000..a995a780db1c --- /dev/null +++ b/drivers/media/video/uvc/uvcvideo.h | |||
| @@ -0,0 +1,796 @@ | |||
| 1 | #ifndef _USB_VIDEO_H_ | ||
| 2 | #define _USB_VIDEO_H_ | ||
| 3 | |||
| 4 | #include <linux/kernel.h> | ||
| 5 | #include <linux/videodev2.h> | ||
| 6 | |||
| 7 | |||
| 8 | /* | ||
| 9 | * Dynamic controls | ||
| 10 | */ | ||
| 11 | |||
| 12 | /* Data types for UVC control data */ | ||
| 13 | #define UVC_CTRL_DATA_TYPE_RAW 0 | ||
| 14 | #define UVC_CTRL_DATA_TYPE_SIGNED 1 | ||
| 15 | #define UVC_CTRL_DATA_TYPE_UNSIGNED 2 | ||
| 16 | #define UVC_CTRL_DATA_TYPE_BOOLEAN 3 | ||
| 17 | #define UVC_CTRL_DATA_TYPE_ENUM 4 | ||
| 18 | #define UVC_CTRL_DATA_TYPE_BITMASK 5 | ||
| 19 | |||
| 20 | /* Control flags */ | ||
| 21 | #define UVC_CONTROL_SET_CUR (1 << 0) | ||
| 22 | #define UVC_CONTROL_GET_CUR (1 << 1) | ||
| 23 | #define UVC_CONTROL_GET_MIN (1 << 2) | ||
| 24 | #define UVC_CONTROL_GET_MAX (1 << 3) | ||
| 25 | #define UVC_CONTROL_GET_RES (1 << 4) | ||
| 26 | #define UVC_CONTROL_GET_DEF (1 << 5) | ||
| 27 | /* Control should be saved at suspend and restored at resume. */ | ||
| 28 | #define UVC_CONTROL_RESTORE (1 << 6) | ||
| 29 | /* Control can be updated by the camera. */ | ||
| 30 | #define UVC_CONTROL_AUTO_UPDATE (1 << 7) | ||
| 31 | |||
| 32 | #define UVC_CONTROL_GET_RANGE (UVC_CONTROL_GET_CUR | UVC_CONTROL_GET_MIN | \ | ||
| 33 | UVC_CONTROL_GET_MAX | UVC_CONTROL_GET_RES | \ | ||
| 34 | UVC_CONTROL_GET_DEF) | ||
| 35 | |||
| 36 | struct uvc_xu_control_info { | ||
| 37 | __u8 entity[16]; | ||
| 38 | __u8 index; | ||
| 39 | __u8 selector; | ||
| 40 | __u16 size; | ||
| 41 | __u32 flags; | ||
| 42 | }; | ||
| 43 | |||
| 44 | struct uvc_xu_control_mapping { | ||
| 45 | __u32 id; | ||
| 46 | __u8 name[32]; | ||
| 47 | __u8 entity[16]; | ||
| 48 | __u8 selector; | ||
| 49 | |||
| 50 | __u8 size; | ||
| 51 | __u8 offset; | ||
| 52 | enum v4l2_ctrl_type v4l2_type; | ||
| 53 | __u32 data_type; | ||
| 54 | }; | ||
| 55 | |||
| 56 | struct uvc_xu_control { | ||
| 57 | __u8 unit; | ||
| 58 | __u8 selector; | ||
| 59 | __u16 size; | ||
| 60 | __u8 __user *data; | ||
| 61 | }; | ||
| 62 | |||
| 63 | #define UVCIOC_CTRL_ADD _IOW('U', 1, struct uvc_xu_control_info) | ||
| 64 | #define UVCIOC_CTRL_MAP _IOWR('U', 2, struct uvc_xu_control_mapping) | ||
| 65 | #define UVCIOC_CTRL_GET _IOWR('U', 3, struct uvc_xu_control) | ||
| 66 | #define UVCIOC_CTRL_SET _IOW('U', 4, struct uvc_xu_control) | ||
| 67 | |||
| 68 | #ifdef __KERNEL__ | ||
| 69 | |||
| 70 | #include <linux/poll.h> | ||
| 71 | |||
| 72 | /* -------------------------------------------------------------------------- | ||
| 73 | * UVC constants | ||
| 74 | */ | ||
| 75 | |||
| 76 | #define SC_UNDEFINED 0x00 | ||
| 77 | #define SC_VIDEOCONTROL 0x01 | ||
| 78 | #define SC_VIDEOSTREAMING 0x02 | ||
| 79 | #define SC_VIDEO_INTERFACE_COLLECTION 0x03 | ||
| 80 | |||
| 81 | #define PC_PROTOCOL_UNDEFINED 0x00 | ||
| 82 | |||
| 83 | #define CS_UNDEFINED 0x20 | ||
| 84 | #define CS_DEVICE 0x21 | ||
| 85 | #define CS_CONFIGURATION 0x22 | ||
| 86 | #define CS_STRING 0x23 | ||
| 87 | #define CS_INTERFACE 0x24 | ||
| 88 | #define CS_ENDPOINT 0x25 | ||
| 89 | |||
| 90 | /* VideoControl class specific interface descriptor */ | ||
| 91 | #define VC_DESCRIPTOR_UNDEFINED 0x00 | ||
| 92 | #define VC_HEADER 0x01 | ||
| 93 | #define VC_INPUT_TERMINAL 0x02 | ||
| 94 | #define VC_OUTPUT_TERMINAL 0x03 | ||
| 95 | #define VC_SELECTOR_UNIT 0x04 | ||
| 96 | #define VC_PROCESSING_UNIT 0x05 | ||
| 97 | #define VC_EXTENSION_UNIT 0x06 | ||
| 98 | |||
| 99 | /* VideoStreaming class specific interface descriptor */ | ||
| 100 | #define VS_UNDEFINED 0x00 | ||
| 101 | #define VS_INPUT_HEADER 0x01 | ||
| 102 | #define VS_OUTPUT_HEADER 0x02 | ||
| 103 | #define VS_STILL_IMAGE_FRAME 0x03 | ||
| 104 | #define VS_FORMAT_UNCOMPRESSED 0x04 | ||
| 105 | #define VS_FRAME_UNCOMPRESSED 0x05 | ||
| 106 | #define VS_FORMAT_MJPEG 0x06 | ||
| 107 | #define VS_FRAME_MJPEG 0x07 | ||
| 108 | #define VS_FORMAT_MPEG2TS 0x0a | ||
| 109 | #define VS_FORMAT_DV 0x0c | ||
| 110 | #define VS_COLORFORMAT 0x0d | ||
| 111 | #define VS_FORMAT_FRAME_BASED 0x10 | ||
| 112 | #define VS_FRAME_FRAME_BASED 0x11 | ||
| 113 | #define VS_FORMAT_STREAM_BASED 0x12 | ||
| 114 | |||
| 115 | /* Endpoint type */ | ||
| 116 | #define EP_UNDEFINED 0x00 | ||
| 117 | #define EP_GENERAL 0x01 | ||
| 118 | #define EP_ENDPOINT 0x02 | ||
| 119 | #define EP_INTERRUPT 0x03 | ||
| 120 | |||
| 121 | /* Request codes */ | ||
| 122 | #define RC_UNDEFINED 0x00 | ||
| 123 | #define SET_CUR 0x01 | ||
| 124 | #define GET_CUR 0x81 | ||
| 125 | #define GET_MIN 0x82 | ||
| 126 | #define GET_MAX 0x83 | ||
| 127 | #define GET_RES 0x84 | ||
| 128 | #define GET_LEN 0x85 | ||
| 129 | #define GET_INFO 0x86 | ||
| 130 | #define GET_DEF 0x87 | ||
| 131 | |||
| 132 | /* VideoControl interface controls */ | ||
| 133 | #define VC_CONTROL_UNDEFINED 0x00 | ||
| 134 | #define VC_VIDEO_POWER_MODE_CONTROL 0x01 | ||
| 135 | #define VC_REQUEST_ERROR_CODE_CONTROL 0x02 | ||
| 136 | |||
| 137 | /* Terminal controls */ | ||
| 138 | #define TE_CONTROL_UNDEFINED 0x00 | ||
| 139 | |||
| 140 | /* Selector Unit controls */ | ||
| 141 | #define SU_CONTROL_UNDEFINED 0x00 | ||
| 142 | #define SU_INPUT_SELECT_CONTROL 0x01 | ||
| 143 | |||
| 144 | /* Camera Terminal controls */ | ||
| 145 | #define CT_CONTROL_UNDEFINED 0x00 | ||
| 146 | #define CT_SCANNING_MODE_CONTROL 0x01 | ||
| 147 | #define CT_AE_MODE_CONTROL 0x02 | ||
| 148 | #define CT_AE_PRIORITY_CONTROL 0x03 | ||
| 149 | #define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04 | ||
| 150 | #define CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05 | ||
| 151 | #define CT_FOCUS_ABSOLUTE_CONTROL 0x06 | ||
| 152 | #define CT_FOCUS_RELATIVE_CONTROL 0x07 | ||
| 153 | #define CT_FOCUS_AUTO_CONTROL 0x08 | ||
| 154 | #define CT_IRIS_ABSOLUTE_CONTROL 0x09 | ||
| 155 | #define CT_IRIS_RELATIVE_CONTROL 0x0a | ||
| 156 | #define CT_ZOOM_ABSOLUTE_CONTROL 0x0b | ||
| 157 | #define CT_ZOOM_RELATIVE_CONTROL 0x0c | ||
| 158 | #define CT_PANTILT_ABSOLUTE_CONTROL 0x0d | ||
| 159 | #define CT_PANTILT_RELATIVE_CONTROL 0x0e | ||
| 160 | #define CT_ROLL_ABSOLUTE_CONTROL 0x0f | ||
| 161 | #define CT_ROLL_RELATIVE_CONTROL 0x10 | ||
| 162 | #define CT_PRIVACY_CONTROL 0x11 | ||
| 163 | |||
| 164 | /* Processing Unit controls */ | ||
| 165 | #define PU_CONTROL_UNDEFINED 0x00 | ||
| 166 | #define PU_BACKLIGHT_COMPENSATION_CONTROL 0x01 | ||
| 167 | #define PU_BRIGHTNESS_CONTROL 0x02 | ||
| 168 | #define PU_CONTRAST_CONTROL 0x03 | ||
| 169 | #define PU_GAIN_CONTROL 0x04 | ||
| 170 | #define PU_POWER_LINE_FREQUENCY_CONTROL 0x05 | ||
| 171 | #define PU_HUE_CONTROL 0x06 | ||
| 172 | #define PU_SATURATION_CONTROL 0x07 | ||
| 173 | #define PU_SHARPNESS_CONTROL 0x08 | ||
| 174 | #define PU_GAMMA_CONTROL 0x09 | ||
| 175 | #define PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a | ||
| 176 | #define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b | ||
| 177 | #define PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c | ||
| 178 | #define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d | ||
| 179 | #define PU_DIGITAL_MULTIPLIER_CONTROL 0x0e | ||
| 180 | #define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f | ||
| 181 | #define PU_HUE_AUTO_CONTROL 0x10 | ||
| 182 | #define PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11 | ||
| 183 | #define PU_ANALOG_LOCK_STATUS_CONTROL 0x12 | ||
| 184 | |||
| 185 | #define LXU_MOTOR_PANTILT_RELATIVE_CONTROL 0x01 | ||
| 186 | #define LXU_MOTOR_PANTILT_RESET_CONTROL 0x02 | ||
| 187 | #define LXU_MOTOR_FOCUS_MOTOR_CONTROL 0x03 | ||
| 188 | |||
| 189 | /* VideoStreaming interface controls */ | ||
| 190 | #define VS_CONTROL_UNDEFINED 0x00 | ||
| 191 | #define VS_PROBE_CONTROL 0x01 | ||
| 192 | #define VS_COMMIT_CONTROL 0x02 | ||
| 193 | #define VS_STILL_PROBE_CONTROL 0x03 | ||
| 194 | #define VS_STILL_COMMIT_CONTROL 0x04 | ||
| 195 | #define VS_STILL_IMAGE_TRIGGER_CONTROL 0x05 | ||
| 196 | #define VS_STREAM_ERROR_CODE_CONTROL 0x06 | ||
| 197 | #define VS_GENERATE_KEY_FRAME_CONTROL 0x07 | ||
| 198 | #define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08 | ||
| 199 | #define VS_SYNC_DELAY_CONTROL 0x09 | ||
| 200 | |||
| 201 | #define TT_VENDOR_SPECIFIC 0x0100 | ||
| 202 | #define TT_STREAMING 0x0101 | ||
| 203 | |||
| 204 | /* Input Terminal types */ | ||
| 205 | #define ITT_VENDOR_SPECIFIC 0x0200 | ||
| 206 | #define ITT_CAMERA 0x0201 | ||
| 207 | #define ITT_MEDIA_TRANSPORT_INPUT 0x0202 | ||
| 208 | |||
| 209 | /* Output Terminal types */ | ||
| 210 | #define OTT_VENDOR_SPECIFIC 0x0300 | ||
| 211 | #define OTT_DISPLAY 0x0301 | ||
| 212 | #define OTT_MEDIA_TRANSPORT_OUTPUT 0x0302 | ||
| 213 | |||
| 214 | /* External Terminal types */ | ||
| 215 | #define EXTERNAL_VENDOR_SPECIFIC 0x0400 | ||
| 216 | #define COMPOSITE_CONNECTOR 0x0401 | ||
| 217 | #define SVIDEO_CONNECTOR 0x0402 | ||
| 218 | #define COMPONENT_CONNECTOR 0x0403 | ||
| 219 | |||
| 220 | #define UVC_TERM_INPUT 0x0000 | ||
| 221 | #define UVC_TERM_OUTPUT 0x8000 | ||
| 222 | |||
| 223 | #define UVC_ENTITY_TYPE(entity) ((entity)->type & 0x7fff) | ||
| 224 | #define UVC_ENTITY_IS_UNIT(entity) (((entity)->type & 0xff00) == 0) | ||
| 225 | #define UVC_ENTITY_IS_TERM(entity) (((entity)->type & 0xff00) != 0) | ||
| 226 | #define UVC_ENTITY_IS_ITERM(entity) \ | ||
| 227 | (((entity)->type & 0x8000) == UVC_TERM_INPUT) | ||
| 228 | #define UVC_ENTITY_IS_OTERM(entity) \ | ||
| 229 | (((entity)->type & 0x8000) == UVC_TERM_OUTPUT) | ||
| 230 | |||
| 231 | #define UVC_STATUS_TYPE_CONTROL 1 | ||
| 232 | #define UVC_STATUS_TYPE_STREAMING 2 | ||
| 233 | |||
| 234 | /* ------------------------------------------------------------------------ | ||
| 235 | * GUIDs | ||
| 236 | */ | ||
| 237 | #define UVC_GUID_UVC_CAMERA \ | ||
| 238 | {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ | ||
| 239 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01} | ||
| 240 | #define UVC_GUID_UVC_OUTPUT \ | ||
| 241 | {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ | ||
| 242 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02} | ||
| 243 | #define UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT \ | ||
| 244 | {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ | ||
| 245 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03} | ||
| 246 | #define UVC_GUID_UVC_PROCESSING \ | ||
| 247 | {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ | ||
| 248 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01} | ||
| 249 | #define UVC_GUID_UVC_SELECTOR \ | ||
| 250 | {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ | ||
| 251 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02} | ||
| 252 | |||
| 253 | #define UVC_GUID_LOGITECH_DEV_INFO \ | ||
| 254 | {0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \ | ||
| 255 | 0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x1e} | ||
| 256 | #define UVC_GUID_LOGITECH_USER_HW \ | ||
| 257 | {0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \ | ||
| 258 | 0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x1f} | ||
| 259 | #define UVC_GUID_LOGITECH_VIDEO \ | ||
| 260 | {0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \ | ||
| 261 | 0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x50} | ||
| 262 | #define UVC_GUID_LOGITECH_MOTOR \ | ||
| 263 | {0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \ | ||
| 264 | 0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x56} | ||
| 265 | |||
| 266 | #define UVC_GUID_FORMAT_MJPEG \ | ||
| 267 | { 'M', 'J', 'P', 'G', 0x00, 0x00, 0x10, 0x00, \ | ||
| 268 | 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} | ||
| 269 | #define UVC_GUID_FORMAT_YUY2 \ | ||
| 270 | { 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \ | ||
| 271 | 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} | ||
| 272 | #define UVC_GUID_FORMAT_NV12 \ | ||
| 273 | { 'N', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \ | ||
| 274 | 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} | ||
| 275 | #define UVC_GUID_FORMAT_YV12 \ | ||
| 276 | { 'Y', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \ | ||
| 277 | 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} | ||
| 278 | #define UVC_GUID_FORMAT_I420 \ | ||
| 279 | { 'I', '4', '2', '0', 0x00, 0x00, 0x10, 0x00, \ | ||
| 280 | 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} | ||
| 281 | #define UVC_GUID_FORMAT_UYVY \ | ||
| 282 | { 'U', 'Y', 'V', 'Y', 0x00, 0x00, 0x10, 0x00, \ | ||
| 283 | 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} | ||
| 284 | #define UVC_GUID_FORMAT_Y800 \ | ||
| 285 | { 'Y', '8', '0', '0', 0x00, 0x00, 0x10, 0x00, \ | ||
| 286 | 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} | ||
| 287 | #define UVC_GUID_FORMAT_BY8 \ | ||
| 288 | { 'B', 'Y', '8', ' ', 0x00, 0x00, 0x10, 0x00, \ | ||
| 289 | 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} | ||
| 290 | |||
| 291 | |||
| 292 | /* ------------------------------------------------------------------------ | ||
| 293 | * Driver specific constants. | ||
| 294 | */ | ||
| 295 | |||
| 296 | #define DRIVER_VERSION_NUMBER KERNEL_VERSION(0, 1, 0) | ||
| 297 | |||
| 298 | /* Number of isochronous URBs. */ | ||
| 299 | #define UVC_URBS 5 | ||
| 300 | /* Maximum number of packets per isochronous URB. */ | ||
| 301 | #define UVC_MAX_ISO_PACKETS 40 | ||
| 302 | /* Maximum frame size in bytes, for sanity checking. */ | ||
| 303 | #define UVC_MAX_FRAME_SIZE (16*1024*1024) | ||
| 304 | /* Maximum number of video buffers. */ | ||
| 305 | #define UVC_MAX_VIDEO_BUFFERS 32 | ||
| 306 | |||
| 307 | #define UVC_CTRL_CONTROL_TIMEOUT 300 | ||
| 308 | #define UVC_CTRL_STREAMING_TIMEOUT 1000 | ||
| 309 | |||
| 310 | /* Devices quirks */ | ||
| 311 | #define UVC_QUIRK_STATUS_INTERVAL 0x00000001 | ||
| 312 | #define UVC_QUIRK_PROBE_MINMAX 0x00000002 | ||
| 313 | #define UVC_QUIRK_PROBE_EXTRAFIELDS 0x00000004 | ||
| 314 | #define UVC_QUIRK_BUILTIN_ISIGHT 0x00000008 | ||
| 315 | #define UVC_QUIRK_STREAM_NO_FID 0x00000010 | ||
| 316 | #define UVC_QUIRK_IGNORE_SELECTOR_UNIT 0x00000020 | ||
| 317 | |||
| 318 | /* Format flags */ | ||
| 319 | #define UVC_FMT_FLAG_COMPRESSED 0x00000001 | ||
| 320 | #define UVC_FMT_FLAG_STREAM 0x00000002 | ||
| 321 | |||
| 322 | /* ------------------------------------------------------------------------ | ||
| 323 | * Structures. | ||
| 324 | */ | ||
| 325 | |||
| 326 | struct uvc_device; | ||
| 327 | |||
| 328 | /* TODO: Put the most frequently accessed fields at the beginning of | ||
| 329 | * structures to maximize cache efficiency. | ||
| 330 | */ | ||
| 331 | struct uvc_streaming_control { | ||
| 332 | __u16 bmHint; | ||
| 333 | __u8 bFormatIndex; | ||
| 334 | __u8 bFrameIndex; | ||
| 335 | __u32 dwFrameInterval; | ||
| 336 | __u16 wKeyFrameRate; | ||
| 337 | __u16 wPFrameRate; | ||
| 338 | __u16 wCompQuality; | ||
| 339 | __u16 wCompWindowSize; | ||
| 340 | __u16 wDelay; | ||
| 341 | __u32 dwMaxVideoFrameSize; | ||
| 342 | __u32 dwMaxPayloadTransferSize; | ||
| 343 | __u32 dwClockFrequency; | ||
| 344 | __u8 bmFramingInfo; | ||
| 345 | __u8 bPreferedVersion; | ||
| 346 | __u8 bMinVersion; | ||
| 347 | __u8 bMaxVersion; | ||
| 348 | }; | ||
| 349 | |||
| 350 | struct uvc_menu_info { | ||
| 351 | __u32 value; | ||
| 352 | __u8 name[32]; | ||
| 353 | }; | ||
| 354 | |||
| 355 | struct uvc_control_info { | ||
| 356 | struct list_head list; | ||
| 357 | struct list_head mappings; | ||
| 358 | |||
| 359 | __u8 entity[16]; | ||
| 360 | __u8 index; | ||
| 361 | __u8 selector; | ||
| 362 | |||
| 363 | __u16 size; | ||
| 364 | __u32 flags; | ||
| 365 | }; | ||
| 366 | |||
| 367 | struct uvc_control_mapping { | ||
| 368 | struct list_head list; | ||
| 369 | |||
| 370 | struct uvc_control_info *ctrl; | ||
| 371 | |||
| 372 | __u32 id; | ||
| 373 | __u8 name[32]; | ||
| 374 | __u8 entity[16]; | ||
| 375 | __u8 selector; | ||
| 376 | |||
| 377 | __u8 size; | ||
| 378 | __u8 offset; | ||
| 379 | enum v4l2_ctrl_type v4l2_type; | ||
| 380 | __u32 data_type; | ||
| 381 | |||
| 382 | struct uvc_menu_info *menu_info; | ||
| 383 | __u32 menu_count; | ||
| 384 | }; | ||
| 385 | |||
| 386 | struct uvc_control { | ||
| 387 | struct uvc_entity *entity; | ||
| 388 | struct uvc_control_info *info; | ||
| 389 | |||
| 390 | __u8 index; /* Used to match the uvc_control entry with a | ||
| 391 | uvc_control_info. */ | ||
| 392 | __u8 dirty : 1, | ||
| 393 | loaded : 1, | ||
| 394 | modified : 1; | ||
| 395 | |||
| 396 | __u8 *data; | ||
| 397 | }; | ||
| 398 | |||
| 399 | struct uvc_format_desc { | ||
| 400 | char *name; | ||
| 401 | __u8 guid[16]; | ||
| 402 | __u32 fcc; | ||
| 403 | }; | ||
| 404 | |||
| 405 | /* The term 'entity' refers to both UVC units and UVC terminals. | ||
| 406 | * | ||
| 407 | * The type field is either the terminal type (wTerminalType in the terminal | ||
| 408 | * descriptor), or the unit type (bDescriptorSubtype in the unit descriptor). | ||
| 409 | * As the bDescriptorSubtype field is one byte long, the type value will | ||
| 410 | * always have a null MSB for units. All terminal types defined by the UVC | ||
| 411 | * specification have a non-null MSB, so it is safe to use the MSB to | ||
| 412 | * differentiate between units and terminals as long as the descriptor parsing | ||
| 413 | * code makes sure terminal types have a non-null MSB. | ||
| 414 | * | ||
| 415 | * For terminals, the type's most significant bit stores the terminal | ||
| 416 | * direction (either UVC_TERM_INPUT or UVC_TERM_OUTPUT). The type field should | ||
| 417 | * always be accessed with the UVC_ENTITY_* macros and never directly. | ||
| 418 | */ | ||
| 419 | |||
| 420 | struct uvc_entity { | ||
| 421 | struct list_head list; /* Entity as part of a UVC device. */ | ||
| 422 | struct list_head chain; /* Entity as part of a video device | ||
| 423 | * chain. */ | ||
| 424 | __u8 id; | ||
| 425 | __u16 type; | ||
| 426 | char name[64]; | ||
| 427 | |||
| 428 | union { | ||
| 429 | struct { | ||
| 430 | __u16 wObjectiveFocalLengthMin; | ||
| 431 | __u16 wObjectiveFocalLengthMax; | ||
| 432 | __u16 wOcularFocalLength; | ||
| 433 | __u8 bControlSize; | ||
| 434 | __u8 *bmControls; | ||
| 435 | } camera; | ||
| 436 | |||
| 437 | struct { | ||
| 438 | __u8 bControlSize; | ||
| 439 | __u8 *bmControls; | ||
| 440 | __u8 bTransportModeSize; | ||
| 441 | __u8 *bmTransportModes; | ||
| 442 | } media; | ||
| 443 | |||
| 444 | struct { | ||
| 445 | __u8 bSourceID; | ||
| 446 | } output; | ||
| 447 | |||
| 448 | struct { | ||
| 449 | __u8 bSourceID; | ||
| 450 | __u16 wMaxMultiplier; | ||
| 451 | __u8 bControlSize; | ||
| 452 | __u8 *bmControls; | ||
| 453 | __u8 bmVideoStandards; | ||
| 454 | } processing; | ||
| 455 | |||
| 456 | struct { | ||
| 457 | __u8 bNrInPins; | ||
| 458 | __u8 *baSourceID; | ||
| 459 | } selector; | ||
| 460 | |||
| 461 | struct { | ||
| 462 | __u8 guidExtensionCode[16]; | ||
| 463 | __u8 bNumControls; | ||
| 464 | __u8 bNrInPins; | ||
| 465 | __u8 *baSourceID; | ||
| 466 | __u8 bControlSize; | ||
| 467 | __u8 *bmControls; | ||
| 468 | __u8 *bmControlsType; | ||
| 469 | } extension; | ||
| 470 | }; | ||
| 471 | |||
| 472 | unsigned int ncontrols; | ||
| 473 | struct uvc_control *controls; | ||
| 474 | }; | ||
| 475 | |||
| 476 | struct uvc_frame { | ||
| 477 | __u8 bFrameIndex; | ||
| 478 | __u8 bmCapabilities; | ||
| 479 | __u16 wWidth; | ||
| 480 | __u16 wHeight; | ||
| 481 | __u32 dwMinBitRate; | ||
| 482 | __u32 dwMaxBitRate; | ||
| 483 | __u32 dwMaxVideoFrameBufferSize; | ||
| 484 | __u8 bFrameIntervalType; | ||
| 485 | __u32 dwDefaultFrameInterval; | ||
| 486 | __u32 *dwFrameInterval; | ||
| 487 | }; | ||
| 488 | |||
| 489 | struct uvc_format { | ||
| 490 | __u8 type; | ||
| 491 | __u8 index; | ||
| 492 | __u8 bpp; | ||
| 493 | __u8 colorspace; | ||
| 494 | __u32 fcc; | ||
| 495 | __u32 flags; | ||
| 496 | |||
| 497 | char name[32]; | ||
| 498 | |||
| 499 | unsigned int nframes; | ||
| 500 | struct uvc_frame *frame; | ||
| 501 | }; | ||
| 502 | |||
| 503 | struct uvc_streaming_header { | ||
| 504 | __u8 bNumFormats; | ||
| 505 | __u8 bEndpointAddress; | ||
| 506 | __u8 bTerminalLink; | ||
| 507 | __u8 bControlSize; | ||
| 508 | __u8 *bmaControls; | ||
| 509 | /* The following fields are used by input headers only. */ | ||
| 510 | __u8 bmInfo; | ||
| 511 | __u8 bStillCaptureMethod; | ||
| 512 | __u8 bTriggerSupport; | ||
| 513 | __u8 bTriggerUsage; | ||
| 514 | }; | ||
| 515 | |||
| 516 | struct uvc_streaming { | ||
| 517 | struct list_head list; | ||
| 518 | |||
| 519 | struct usb_interface *intf; | ||
| 520 | int intfnum; | ||
| 521 | __u16 maxpsize; | ||
| 522 | |||
| 523 | struct uvc_streaming_header header; | ||
| 524 | |||
| 525 | unsigned int nformats; | ||
| 526 | struct uvc_format *format; | ||
| 527 | |||
| 528 | struct uvc_streaming_control ctrl; | ||
| 529 | struct uvc_format *cur_format; | ||
| 530 | struct uvc_frame *cur_frame; | ||
| 531 | |||
| 532 | struct mutex mutex; | ||
| 533 | }; | ||
| 534 | |||
| 535 | enum uvc_buffer_state { | ||
| 536 | UVC_BUF_STATE_IDLE = 0, | ||
| 537 | UVC_BUF_STATE_QUEUED = 1, | ||
| 538 | UVC_BUF_STATE_ACTIVE = 2, | ||
| 539 | UVC_BUF_STATE_DONE = 3, | ||
| 540 | UVC_BUF_STATE_ERROR = 4, | ||
| 541 | }; | ||
| 542 | |||
| 543 | struct uvc_buffer { | ||
| 544 | unsigned long vma_use_count; | ||
| 545 | struct list_head stream; | ||
| 546 | |||
| 547 | /* Touched by interrupt handler. */ | ||
| 548 | struct v4l2_buffer buf; | ||
| 549 | struct list_head queue; | ||
| 550 | wait_queue_head_t wait; | ||
| 551 | enum uvc_buffer_state state; | ||
| 552 | }; | ||
| 553 | |||
| 554 | #define UVC_QUEUE_STREAMING (1 << 0) | ||
| 555 | #define UVC_QUEUE_DISCONNECTED (1 << 1) | ||
| 556 | #define UVC_QUEUE_DROP_INCOMPLETE (1 << 2) | ||
| 557 | |||
| 558 | struct uvc_video_queue { | ||
| 559 | void *mem; | ||
| 560 | unsigned int flags; | ||
| 561 | __u32 sequence; | ||
| 562 | |||
| 563 | unsigned int count; | ||
| 564 | unsigned int buf_size; | ||
| 565 | struct uvc_buffer buffer[UVC_MAX_VIDEO_BUFFERS]; | ||
| 566 | struct mutex mutex; /* protects buffers and mainqueue */ | ||
| 567 | spinlock_t irqlock; /* protects irqqueue */ | ||
| 568 | |||
| 569 | struct list_head mainqueue; | ||
| 570 | struct list_head irqqueue; | ||
| 571 | }; | ||
| 572 | |||
| 573 | struct uvc_video_device { | ||
| 574 | struct uvc_device *dev; | ||
| 575 | struct video_device *vdev; | ||
| 576 | atomic_t active; | ||
| 577 | unsigned int frozen : 1; | ||
| 578 | |||
| 579 | struct list_head iterms; | ||
| 580 | struct uvc_entity *oterm; | ||
| 581 | struct uvc_entity *processing; | ||
| 582 | struct uvc_entity *selector; | ||
| 583 | struct list_head extensions; | ||
| 584 | struct mutex ctrl_mutex; | ||
| 585 | |||
| 586 | struct uvc_video_queue queue; | ||
| 587 | |||
| 588 | /* Video streaming object, must always be non-NULL. */ | ||
| 589 | struct uvc_streaming *streaming; | ||
| 590 | |||
| 591 | void (*decode) (struct urb *urb, struct uvc_video_device *video, | ||
| 592 | struct uvc_buffer *buf); | ||
| 593 | |||
| 594 | /* Context data used by the bulk completion handler. */ | ||
| 595 | struct { | ||
| 596 | __u8 header[256]; | ||
| 597 | unsigned int header_size; | ||
| 598 | int skip_payload; | ||
| 599 | __u32 payload_size; | ||
| 600 | __u32 max_payload_size; | ||
| 601 | } bulk; | ||
| 602 | |||
| 603 | struct urb *urb[UVC_URBS]; | ||
| 604 | char *urb_buffer[UVC_URBS]; | ||
| 605 | |||
| 606 | __u8 last_fid; | ||
| 607 | }; | ||
| 608 | |||
| 609 | enum uvc_device_state { | ||
| 610 | UVC_DEV_DISCONNECTED = 1, | ||
| 611 | }; | ||
| 612 | |||
| 613 | struct uvc_device { | ||
| 614 | struct usb_device *udev; | ||
| 615 | struct usb_interface *intf; | ||
| 616 | __u32 quirks; | ||
| 617 | int intfnum; | ||
| 618 | char name[32]; | ||
| 619 | |||
| 620 | enum uvc_device_state state; | ||
| 621 | struct kref kref; | ||
| 622 | struct list_head list; | ||
| 623 | |||
| 624 | /* Video control interface */ | ||
| 625 | __u16 uvc_version; | ||
| 626 | __u32 clock_frequency; | ||
| 627 | |||
| 628 | struct list_head entities; | ||
| 629 | |||
| 630 | struct uvc_video_device video; | ||
| 631 | |||
| 632 | /* Status Interrupt Endpoint */ | ||
| 633 | struct usb_host_endpoint *int_ep; | ||
| 634 | struct urb *int_urb; | ||
| 635 | __u8 status[16]; | ||
| 636 | struct input_dev *input; | ||
| 637 | |||
| 638 | /* Video Streaming interfaces */ | ||
| 639 | struct list_head streaming; | ||
| 640 | }; | ||
| 641 | |||
| 642 | enum uvc_handle_state { | ||
| 643 | UVC_HANDLE_PASSIVE = 0, | ||
| 644 | UVC_HANDLE_ACTIVE = 1, | ||
| 645 | }; | ||
| 646 | |||
| 647 | struct uvc_fh { | ||
| 648 | struct uvc_video_device *device; | ||
| 649 | enum uvc_handle_state state; | ||
| 650 | }; | ||
| 651 | |||
| 652 | struct uvc_driver { | ||
| 653 | struct usb_driver driver; | ||
| 654 | |||
| 655 | struct mutex open_mutex; /* protects from open/disconnect race */ | ||
| 656 | |||
| 657 | struct list_head devices; /* struct uvc_device list */ | ||
| 658 | struct list_head controls; /* struct uvc_control_info list */ | ||
| 659 | struct mutex ctrl_mutex; /* protects controls and devices | ||
| 660 | lists */ | ||
| 661 | }; | ||
| 662 | |||
| 663 | /* ------------------------------------------------------------------------ | ||
| 664 | * Debugging, printing and logging | ||
| 665 | */ | ||
| 666 | |||
| 667 | #define UVC_TRACE_PROBE (1 << 0) | ||
| 668 | #define UVC_TRACE_DESCR (1 << 1) | ||
| 669 | #define UVC_TRACE_CONTROL (1 << 2) | ||
| 670 | #define UVC_TRACE_FORMAT (1 << 3) | ||
| 671 | #define UVC_TRACE_CAPTURE (1 << 4) | ||
| 672 | #define UVC_TRACE_CALLS (1 << 5) | ||
| 673 | #define UVC_TRACE_IOCTL (1 << 6) | ||
| 674 | #define UVC_TRACE_FRAME (1 << 7) | ||
| 675 | #define UVC_TRACE_SUSPEND (1 << 8) | ||
| 676 | #define UVC_TRACE_STATUS (1 << 9) | ||
| 677 | |||
| 678 | extern unsigned int uvc_trace_param; | ||
| 679 | |||
| 680 | #define uvc_trace(flag, msg...) \ | ||
| 681 | do { \ | ||
| 682 | if (uvc_trace_param & flag) \ | ||
| 683 | printk(KERN_DEBUG "uvcvideo: " msg); \ | ||
| 684 | } while (0) | ||
| 685 | |||
| 686 | #define uvc_printk(level, msg...) \ | ||
| 687 | printk(level "uvcvideo: " msg) | ||
| 688 | |||
| 689 | #define UVC_GUID_FORMAT "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-" \ | ||
| 690 | "%02x%02x%02x%02x%02x%02x" | ||
| 691 | #define UVC_GUID_ARGS(guid) \ | ||
| 692 | (guid)[3], (guid)[2], (guid)[1], (guid)[0], \ | ||
| 693 | (guid)[5], (guid)[4], \ | ||
| 694 | (guid)[7], (guid)[6], \ | ||
| 695 | (guid)[8], (guid)[9], \ | ||
| 696 | (guid)[10], (guid)[11], (guid)[12], \ | ||
| 697 | (guid)[13], (guid)[14], (guid)[15] | ||
| 698 | |||
| 699 | /* -------------------------------------------------------------------------- | ||
| 700 | * Internal functions. | ||
| 701 | */ | ||
| 702 | |||
| 703 | /* Core driver */ | ||
| 704 | extern struct uvc_driver uvc_driver; | ||
| 705 | extern void uvc_delete(struct kref *kref); | ||
| 706 | |||
| 707 | /* Video buffers queue management. */ | ||
| 708 | extern void uvc_queue_init(struct uvc_video_queue *queue); | ||
| 709 | extern int uvc_alloc_buffers(struct uvc_video_queue *queue, | ||
| 710 | unsigned int nbuffers, unsigned int buflength); | ||
| 711 | extern int uvc_free_buffers(struct uvc_video_queue *queue); | ||
| 712 | extern int uvc_query_buffer(struct uvc_video_queue *queue, | ||
| 713 | struct v4l2_buffer *v4l2_buf); | ||
| 714 | extern int uvc_queue_buffer(struct uvc_video_queue *queue, | ||
| 715 | struct v4l2_buffer *v4l2_buf); | ||
| 716 | extern int uvc_dequeue_buffer(struct uvc_video_queue *queue, | ||
| 717 | struct v4l2_buffer *v4l2_buf, int nonblocking); | ||
| 718 | extern int uvc_queue_enable(struct uvc_video_queue *queue, int enable); | ||
| 719 | extern void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect); | ||
| 720 | extern struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue, | ||
| 721 | struct uvc_buffer *buf); | ||
| 722 | extern unsigned int uvc_queue_poll(struct uvc_video_queue *queue, | ||
| 723 | struct file *file, poll_table *wait); | ||
| 724 | static inline int uvc_queue_streaming(struct uvc_video_queue *queue) | ||
| 725 | { | ||
| 726 | return queue->flags & UVC_QUEUE_STREAMING; | ||
| 727 | } | ||
| 728 | |||
| 729 | /* V4L2 interface */ | ||
| 730 | extern struct file_operations uvc_fops; | ||
| 731 | |||
| 732 | /* Video */ | ||
| 733 | extern int uvc_video_init(struct uvc_video_device *video); | ||
| 734 | extern int uvc_video_suspend(struct uvc_video_device *video); | ||
| 735 | extern int uvc_video_resume(struct uvc_video_device *video); | ||
| 736 | extern int uvc_video_enable(struct uvc_video_device *video, int enable); | ||
| 737 | extern int uvc_probe_video(struct uvc_video_device *video, | ||
| 738 | struct uvc_streaming_control *probe); | ||
| 739 | extern int uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit, | ||
| 740 | __u8 intfnum, __u8 cs, void *data, __u16 size); | ||
| 741 | extern int uvc_set_video_ctrl(struct uvc_video_device *video, | ||
| 742 | struct uvc_streaming_control *ctrl, int probe); | ||
| 743 | |||
| 744 | /* Status */ | ||
| 745 | extern int uvc_status_init(struct uvc_device *dev); | ||
| 746 | extern void uvc_status_cleanup(struct uvc_device *dev); | ||
| 747 | extern int uvc_status_suspend(struct uvc_device *dev); | ||
| 748 | extern int uvc_status_resume(struct uvc_device *dev); | ||
| 749 | |||
| 750 | /* Controls */ | ||
| 751 | extern struct uvc_control *uvc_find_control(struct uvc_video_device *video, | ||
| 752 | __u32 v4l2_id, struct uvc_control_mapping **mapping); | ||
| 753 | extern int uvc_query_v4l2_ctrl(struct uvc_video_device *video, | ||
| 754 | struct v4l2_queryctrl *v4l2_ctrl); | ||
| 755 | |||
| 756 | extern int uvc_ctrl_add_info(struct uvc_control_info *info); | ||
| 757 | extern int uvc_ctrl_add_mapping(struct uvc_control_mapping *mapping); | ||
| 758 | extern int uvc_ctrl_init_device(struct uvc_device *dev); | ||
| 759 | extern void uvc_ctrl_cleanup_device(struct uvc_device *dev); | ||
| 760 | extern int uvc_ctrl_resume_device(struct uvc_device *dev); | ||
| 761 | extern void uvc_ctrl_init(void); | ||
| 762 | |||
| 763 | extern int uvc_ctrl_begin(struct uvc_video_device *video); | ||
| 764 | extern int __uvc_ctrl_commit(struct uvc_video_device *video, int rollback); | ||
| 765 | static inline int uvc_ctrl_commit(struct uvc_video_device *video) | ||
| 766 | { | ||
| 767 | return __uvc_ctrl_commit(video, 0); | ||
| 768 | } | ||
| 769 | static inline int uvc_ctrl_rollback(struct uvc_video_device *video) | ||
| 770 | { | ||
| 771 | return __uvc_ctrl_commit(video, 1); | ||
| 772 | } | ||
| 773 | |||
| 774 | extern int uvc_ctrl_get(struct uvc_video_device *video, | ||
| 775 | struct v4l2_ext_control *xctrl); | ||
| 776 | extern int uvc_ctrl_set(struct uvc_video_device *video, | ||
| 777 | struct v4l2_ext_control *xctrl); | ||
| 778 | |||
| 779 | extern int uvc_xu_ctrl_query(struct uvc_video_device *video, | ||
| 780 | struct uvc_xu_control *ctrl, int set); | ||
| 781 | |||
| 782 | /* Utility functions */ | ||
| 783 | extern void uvc_simplify_fraction(uint32_t *numerator, uint32_t *denominator, | ||
| 784 | unsigned int n_terms, unsigned int threshold); | ||
| 785 | extern uint32_t uvc_fraction_to_interval(uint32_t numerator, | ||
| 786 | uint32_t denominator); | ||
| 787 | extern struct usb_host_endpoint *uvc_find_endpoint( | ||
| 788 | struct usb_host_interface *alts, __u8 epaddr); | ||
| 789 | |||
| 790 | /* Quirks support */ | ||
| 791 | void uvc_video_decode_isight(struct urb *urb, struct uvc_video_device *video, | ||
| 792 | struct uvc_buffer *buf); | ||
| 793 | |||
| 794 | #endif /* __KERNEL__ */ | ||
| 795 | |||
| 796 | #endif | ||
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index db3c892f87fb..d40d6d15ae20 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
| @@ -1686,9 +1686,14 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1686 | ioc->bus_type = SAS; | 1686 | ioc->bus_type = SAS; |
| 1687 | } | 1687 | } |
| 1688 | 1688 | ||
| 1689 | if (ioc->bus_type == SAS && mpt_msi_enable == -1) | 1689 | if (mpt_msi_enable == -1) { |
| 1690 | ioc->msi_enable = 1; | 1690 | /* Enable on SAS, disable on FC and SPI */ |
| 1691 | else | 1691 | if (ioc->bus_type == SAS) |
| 1692 | ioc->msi_enable = 1; | ||
| 1693 | else | ||
| 1694 | ioc->msi_enable = 0; | ||
| 1695 | } else | ||
| 1696 | /* follow flag: 0 - disable; 1 - enable */ | ||
| 1692 | ioc->msi_enable = mpt_msi_enable; | 1697 | ioc->msi_enable = mpt_msi_enable; |
| 1693 | 1698 | ||
| 1694 | if (ioc->errata_flag_1064) | 1699 | if (ioc->errata_flag_1064) |
diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c index 25bcfcf36f2e..1effca4e40e1 100644 --- a/drivers/message/fusion/mptspi.c +++ b/drivers/message/fusion/mptspi.c | |||
| @@ -1266,13 +1266,18 @@ mptspi_dv_renegotiate(struct _MPT_SCSI_HOST *hd) | |||
| 1266 | static int | 1266 | static int |
| 1267 | mptspi_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) | 1267 | mptspi_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) |
| 1268 | { | 1268 | { |
| 1269 | struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh); | ||
| 1270 | int rc; | 1269 | int rc; |
| 1271 | 1270 | ||
| 1272 | rc = mptscsih_ioc_reset(ioc, reset_phase); | 1271 | rc = mptscsih_ioc_reset(ioc, reset_phase); |
| 1273 | 1272 | ||
| 1274 | if (reset_phase == MPT_IOC_POST_RESET) | 1273 | /* only try to do a renegotiation if we're properly set up |
| 1274 | * if we get an ioc fault on bringup, ioc->sh will be NULL */ | ||
| 1275 | if (reset_phase == MPT_IOC_POST_RESET && | ||
| 1276 | ioc->sh) { | ||
| 1277 | struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh); | ||
| 1278 | |||
| 1275 | mptspi_dv_renegotiate(hd); | 1279 | mptspi_dv_renegotiate(hd); |
| 1280 | } | ||
| 1276 | 1281 | ||
| 1277 | return rc; | 1282 | return rc; |
| 1278 | } | 1283 | } |
diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c index 65210fca37ed..d89475d36988 100644 --- a/drivers/mmc/host/pxamci.c +++ b/drivers/mmc/host/pxamci.c | |||
| @@ -114,6 +114,7 @@ static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data) | |||
| 114 | unsigned int nob = data->blocks; | 114 | unsigned int nob = data->blocks; |
| 115 | unsigned long long clks; | 115 | unsigned long long clks; |
| 116 | unsigned int timeout; | 116 | unsigned int timeout; |
| 117 | bool dalgn = 0; | ||
| 117 | u32 dcmd; | 118 | u32 dcmd; |
| 118 | int i; | 119 | int i; |
| 119 | 120 | ||
| @@ -152,6 +153,9 @@ static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data) | |||
| 152 | host->sg_cpu[i].dcmd = dcmd | length; | 153 | host->sg_cpu[i].dcmd = dcmd | length; |
| 153 | if (length & 31 && !(data->flags & MMC_DATA_READ)) | 154 | if (length & 31 && !(data->flags & MMC_DATA_READ)) |
| 154 | host->sg_cpu[i].dcmd |= DCMD_ENDIRQEN; | 155 | host->sg_cpu[i].dcmd |= DCMD_ENDIRQEN; |
| 156 | /* Not aligned to 8-byte boundary? */ | ||
| 157 | if (sg_dma_address(&data->sg[i]) & 0x7) | ||
| 158 | dalgn = 1; | ||
| 155 | if (data->flags & MMC_DATA_READ) { | 159 | if (data->flags & MMC_DATA_READ) { |
| 156 | host->sg_cpu[i].dsadr = host->res->start + MMC_RXFIFO; | 160 | host->sg_cpu[i].dsadr = host->res->start + MMC_RXFIFO; |
| 157 | host->sg_cpu[i].dtadr = sg_dma_address(&data->sg[i]); | 161 | host->sg_cpu[i].dtadr = sg_dma_address(&data->sg[i]); |
| @@ -165,6 +169,15 @@ static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data) | |||
| 165 | host->sg_cpu[host->dma_len - 1].ddadr = DDADR_STOP; | 169 | host->sg_cpu[host->dma_len - 1].ddadr = DDADR_STOP; |
| 166 | wmb(); | 170 | wmb(); |
| 167 | 171 | ||
| 172 | /* | ||
| 173 | * The PXA27x DMA controller encounters overhead when working with | ||
| 174 | * unaligned (to 8-byte boundaries) data, so switch on byte alignment | ||
| 175 | * mode only if we have unaligned data. | ||
| 176 | */ | ||
| 177 | if (dalgn) | ||
| 178 | DALGN |= (1 << host->dma); | ||
| 179 | else | ||
| 180 | DALGN &= (1 << host->dma); | ||
| 168 | DDADR(host->dma) = host->sg_dma; | 181 | DDADR(host->dma) = host->sg_dma; |
| 169 | DCSR(host->dma) = DCSR_RUN; | 182 | DCSR(host->dma) = DCSR_RUN; |
| 170 | } | 183 | } |
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 07c2048b230b..b413aa6c246b 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
| @@ -55,6 +55,10 @@ static unsigned int debug_quirks = 0; | |||
| 55 | #define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<7) | 55 | #define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<7) |
| 56 | /* Controller needs to be reset after each request to stay stable */ | 56 | /* Controller needs to be reset after each request to stay stable */ |
| 57 | #define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<8) | 57 | #define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<8) |
| 58 | /* Controller needs voltage and power writes to happen separately */ | ||
| 59 | #define SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER (1<<9) | ||
| 60 | /* Controller has an off-by-one issue with timeout value */ | ||
| 61 | #define SDHCI_QUIRK_INCR_TIMEOUT_CONTROL (1<<10) | ||
| 58 | 62 | ||
| 59 | static const struct pci_device_id pci_ids[] __devinitdata = { | 63 | static const struct pci_device_id pci_ids[] __devinitdata = { |
| 60 | { | 64 | { |
| @@ -115,7 +119,8 @@ static const struct pci_device_id pci_ids[] __devinitdata = { | |||
| 115 | .subvendor = PCI_ANY_ID, | 119 | .subvendor = PCI_ANY_ID, |
| 116 | .subdevice = PCI_ANY_ID, | 120 | .subdevice = PCI_ANY_ID, |
| 117 | .driver_data = SDHCI_QUIRK_SINGLE_POWER_WRITE | | 121 | .driver_data = SDHCI_QUIRK_SINGLE_POWER_WRITE | |
| 118 | SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS, | 122 | SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS | |
| 123 | SDHCI_QUIRK_BROKEN_DMA, | ||
| 119 | }, | 124 | }, |
| 120 | 125 | ||
| 121 | { | 126 | { |
| @@ -124,7 +129,17 @@ static const struct pci_device_id pci_ids[] __devinitdata = { | |||
| 124 | .subvendor = PCI_ANY_ID, | 129 | .subvendor = PCI_ANY_ID, |
| 125 | .subdevice = PCI_ANY_ID, | 130 | .subdevice = PCI_ANY_ID, |
| 126 | .driver_data = SDHCI_QUIRK_SINGLE_POWER_WRITE | | 131 | .driver_data = SDHCI_QUIRK_SINGLE_POWER_WRITE | |
| 127 | SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS, | 132 | SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS | |
| 133 | SDHCI_QUIRK_BROKEN_DMA, | ||
| 134 | }, | ||
| 135 | |||
| 136 | { | ||
| 137 | .vendor = PCI_VENDOR_ID_MARVELL, | ||
| 138 | .device = PCI_DEVICE_ID_MARVELL_CAFE_SD, | ||
| 139 | .subvendor = PCI_ANY_ID, | ||
| 140 | .subdevice = PCI_ANY_ID, | ||
| 141 | .driver_data = SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER | | ||
| 142 | SDHCI_QUIRK_INCR_TIMEOUT_CONTROL, | ||
| 128 | }, | 143 | }, |
| 129 | 144 | ||
| 130 | { | 145 | { |
| @@ -469,6 +484,13 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data) | |||
| 469 | break; | 484 | break; |
| 470 | } | 485 | } |
| 471 | 486 | ||
| 487 | /* | ||
| 488 | * Compensate for an off-by-one error in the CaFe hardware; otherwise, | ||
| 489 | * a too-small count gives us interrupt timeouts. | ||
| 490 | */ | ||
| 491 | if ((host->chip->quirks & SDHCI_QUIRK_INCR_TIMEOUT_CONTROL)) | ||
| 492 | count++; | ||
| 493 | |||
| 472 | if (count >= 0xF) { | 494 | if (count >= 0xF) { |
| 473 | printk(KERN_WARNING "%s: Too large timeout requested!\n", | 495 | printk(KERN_WARNING "%s: Too large timeout requested!\n", |
| 474 | mmc_hostname(host->mmc)); | 496 | mmc_hostname(host->mmc)); |
| @@ -774,6 +796,14 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned short power) | |||
| 774 | BUG(); | 796 | BUG(); |
| 775 | } | 797 | } |
| 776 | 798 | ||
| 799 | /* | ||
| 800 | * At least the CaFe chip gets confused if we set the voltage | ||
| 801 | * and set turn on power at the same time, so set the voltage first. | ||
| 802 | */ | ||
| 803 | if ((host->chip->quirks & SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER)) | ||
| 804 | writeb(pwr & ~SDHCI_POWER_ON, | ||
| 805 | host->ioaddr + SDHCI_POWER_CONTROL); | ||
| 806 | |||
| 777 | writeb(pwr, host->ioaddr + SDHCI_POWER_CONTROL); | 807 | writeb(pwr, host->ioaddr + SDHCI_POWER_CONTROL); |
| 778 | 808 | ||
| 779 | out: | 809 | out: |
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index 2edda8cc7f99..aabad8ce7458 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c | |||
| @@ -1768,9 +1768,10 @@ vortex_timer(unsigned long data) | |||
| 1768 | case XCVR_MII: case XCVR_NWAY: | 1768 | case XCVR_MII: case XCVR_NWAY: |
| 1769 | { | 1769 | { |
| 1770 | ok = 1; | 1770 | ok = 1; |
| 1771 | spin_lock_bh(&vp->lock); | 1771 | /* Interrupts are already disabled */ |
| 1772 | spin_lock(&vp->lock); | ||
| 1772 | vortex_check_media(dev, 0); | 1773 | vortex_check_media(dev, 0); |
| 1773 | spin_unlock_bh(&vp->lock); | 1774 | spin_unlock(&vp->lock); |
| 1774 | } | 1775 | } |
| 1775 | break; | 1776 | break; |
| 1776 | default: /* Other media types handled by Tx timeouts. */ | 1777 | default: /* Other media types handled by Tx timeouts. */ |
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index f3cba5e24ec5..1037b1332312 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
| @@ -1803,6 +1803,8 @@ static int e100_rx_alloc_skb(struct nic *nic, struct rx *rx) | |||
| 1803 | if (rx->prev->skb) { | 1803 | if (rx->prev->skb) { |
| 1804 | struct rfd *prev_rfd = (struct rfd *)rx->prev->skb->data; | 1804 | struct rfd *prev_rfd = (struct rfd *)rx->prev->skb->data; |
| 1805 | put_unaligned_le32(rx->dma_addr, &prev_rfd->link); | 1805 | put_unaligned_le32(rx->dma_addr, &prev_rfd->link); |
| 1806 | pci_dma_sync_single_for_device(nic->pdev, rx->prev->dma_addr, | ||
| 1807 | sizeof(struct rfd), PCI_DMA_TODEVICE); | ||
| 1806 | } | 1808 | } |
| 1807 | 1809 | ||
| 1808 | return 0; | 1810 | return 0; |
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index 701531e72e7b..a3f6a9c72ec8 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c | |||
| @@ -347,7 +347,7 @@ e1000_set_tso(struct net_device *netdev, u32 data) | |||
| 347 | else | 347 | else |
| 348 | netdev->features &= ~NETIF_F_TSO; | 348 | netdev->features &= ~NETIF_F_TSO; |
| 349 | 349 | ||
| 350 | if (data) | 350 | if (data && (adapter->hw.mac_type > e1000_82547_rev_2)) |
| 351 | netdev->features |= NETIF_F_TSO6; | 351 | netdev->features |= NETIF_F_TSO6; |
| 352 | else | 352 | else |
| 353 | netdev->features &= ~NETIF_F_TSO6; | 353 | netdev->features &= ~NETIF_F_TSO6; |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index cab1835173cd..648a87bbf467 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
| @@ -2535,7 +2535,8 @@ void e1000e_down(struct e1000_adapter *adapter) | |||
| 2535 | adapter->link_speed = 0; | 2535 | adapter->link_speed = 0; |
| 2536 | adapter->link_duplex = 0; | 2536 | adapter->link_duplex = 0; |
| 2537 | 2537 | ||
| 2538 | e1000e_reset(adapter); | 2538 | if (!pci_channel_offline(adapter->pdev)) |
| 2539 | e1000e_reset(adapter); | ||
| 2539 | e1000_clean_tx_ring(adapter); | 2540 | e1000_clean_tx_ring(adapter); |
| 2540 | e1000_clean_rx_ring(adapter); | 2541 | e1000_clean_rx_ring(adapter); |
| 2541 | 2542 | ||
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index fe872fbd671e..e01926b7b5b7 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #include <asm/io.h> | 40 | #include <asm/io.h> |
| 41 | 41 | ||
| 42 | #define DRV_NAME "ehea" | 42 | #define DRV_NAME "ehea" |
| 43 | #define DRV_VERSION "EHEA_0091" | 43 | #define DRV_VERSION "EHEA_0092" |
| 44 | 44 | ||
| 45 | /* eHEA capability flags */ | 45 | /* eHEA capability flags */ |
| 46 | #define DLPAR_PORT_ADD_REM 1 | 46 | #define DLPAR_PORT_ADD_REM 1 |
| @@ -452,7 +452,7 @@ struct ehea_bcmc_reg_entry { | |||
| 452 | struct ehea_bcmc_reg_array { | 452 | struct ehea_bcmc_reg_array { |
| 453 | struct ehea_bcmc_reg_entry *arr; | 453 | struct ehea_bcmc_reg_entry *arr; |
| 454 | int num_entries; | 454 | int num_entries; |
| 455 | struct mutex lock; | 455 | spinlock_t lock; |
| 456 | }; | 456 | }; |
| 457 | 457 | ||
| 458 | #define EHEA_PORT_UP 1 | 458 | #define EHEA_PORT_UP 1 |
| @@ -478,6 +478,7 @@ struct ehea_port { | |||
| 478 | int num_add_tx_qps; | 478 | int num_add_tx_qps; |
| 479 | int num_mcs; | 479 | int num_mcs; |
| 480 | int resets; | 480 | int resets; |
| 481 | u64 flags; | ||
| 481 | u64 mac_addr; | 482 | u64 mac_addr; |
| 482 | u32 logical_port_id; | 483 | u32 logical_port_id; |
| 483 | u32 port_speed; | 484 | u32 port_speed; |
| @@ -501,7 +502,8 @@ struct port_res_cfg { | |||
| 501 | }; | 502 | }; |
| 502 | 503 | ||
| 503 | enum ehea_flag_bits { | 504 | enum ehea_flag_bits { |
| 504 | __EHEA_STOP_XFER | 505 | __EHEA_STOP_XFER, |
| 506 | __EHEA_DISABLE_PORT_RESET | ||
| 505 | }; | 507 | }; |
| 506 | 508 | ||
| 507 | void ehea_set_ethtool_ops(struct net_device *netdev); | 509 | void ehea_set_ethtool_ops(struct net_device *netdev); |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index 075fd547421e..0920b796bd78 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
| @@ -118,6 +118,7 @@ static struct of_device_id ehea_device_table[] = { | |||
| 118 | }, | 118 | }, |
| 119 | {}, | 119 | {}, |
| 120 | }; | 120 | }; |
| 121 | MODULE_DEVICE_TABLE(of, ehea_device_table); | ||
| 121 | 122 | ||
| 122 | static struct of_platform_driver ehea_driver = { | 123 | static struct of_platform_driver ehea_driver = { |
| 123 | .name = "ehea", | 124 | .name = "ehea", |
| @@ -137,6 +138,12 @@ void ehea_dump(void *adr, int len, char *msg) | |||
| 137 | } | 138 | } |
| 138 | } | 139 | } |
| 139 | 140 | ||
| 141 | void ehea_schedule_port_reset(struct ehea_port *port) | ||
| 142 | { | ||
| 143 | if (!test_bit(__EHEA_DISABLE_PORT_RESET, &port->flags)) | ||
| 144 | schedule_work(&port->reset_task); | ||
| 145 | } | ||
| 146 | |||
| 140 | static void ehea_update_firmware_handles(void) | 147 | static void ehea_update_firmware_handles(void) |
| 141 | { | 148 | { |
| 142 | struct ehea_fw_handle_entry *arr = NULL; | 149 | struct ehea_fw_handle_entry *arr = NULL; |
| @@ -241,7 +248,7 @@ static void ehea_update_bcmc_registrations(void) | |||
| 241 | } | 248 | } |
| 242 | 249 | ||
| 243 | if (num_registrations) { | 250 | if (num_registrations) { |
| 244 | arr = kzalloc(num_registrations * sizeof(*arr), GFP_KERNEL); | 251 | arr = kzalloc(num_registrations * sizeof(*arr), GFP_ATOMIC); |
| 245 | if (!arr) | 252 | if (!arr) |
| 246 | return; /* Keep the existing array */ | 253 | return; /* Keep the existing array */ |
| 247 | } else | 254 | } else |
| @@ -301,7 +308,7 @@ static struct net_device_stats *ehea_get_stats(struct net_device *dev) | |||
| 301 | 308 | ||
| 302 | memset(stats, 0, sizeof(*stats)); | 309 | memset(stats, 0, sizeof(*stats)); |
| 303 | 310 | ||
| 304 | cb2 = kzalloc(PAGE_SIZE, GFP_KERNEL); | 311 | cb2 = kzalloc(PAGE_SIZE, GFP_ATOMIC); |
| 305 | if (!cb2) { | 312 | if (!cb2) { |
| 306 | ehea_error("no mem for cb2"); | 313 | ehea_error("no mem for cb2"); |
| 307 | goto out; | 314 | goto out; |
| @@ -587,7 +594,7 @@ static int ehea_treat_poll_error(struct ehea_port_res *pr, int rq, | |||
| 587 | "Resetting port.", pr->qp->init_attr.qp_nr); | 594 | "Resetting port.", pr->qp->init_attr.qp_nr); |
| 588 | ehea_dump(cqe, sizeof(*cqe), "CQE"); | 595 | ehea_dump(cqe, sizeof(*cqe), "CQE"); |
| 589 | } | 596 | } |
| 590 | schedule_work(&pr->port->reset_task); | 597 | ehea_schedule_port_reset(pr->port); |
| 591 | return 1; | 598 | return 1; |
| 592 | } | 599 | } |
| 593 | 600 | ||
| @@ -616,7 +623,7 @@ static int get_skb_hdr(struct sk_buff *skb, void **iphdr, | |||
| 616 | *tcph = tcp_hdr(skb); | 623 | *tcph = tcp_hdr(skb); |
| 617 | 624 | ||
| 618 | /* check if ip header and tcp header are complete */ | 625 | /* check if ip header and tcp header are complete */ |
| 619 | if (iph->tot_len < ip_len + tcp_hdrlen(skb)) | 626 | if (ntohs(iph->tot_len) < ip_len + tcp_hdrlen(skb)) |
| 620 | return -1; | 627 | return -1; |
| 621 | 628 | ||
| 622 | *hdr_flags = LRO_IPV4 | LRO_TCP; | 629 | *hdr_flags = LRO_IPV4 | LRO_TCP; |
| @@ -765,7 +772,7 @@ static struct ehea_cqe *ehea_proc_cqes(struct ehea_port_res *pr, int my_quota) | |||
| 765 | ehea_error("Send Completion Error: Resetting port"); | 772 | ehea_error("Send Completion Error: Resetting port"); |
| 766 | if (netif_msg_tx_err(pr->port)) | 773 | if (netif_msg_tx_err(pr->port)) |
| 767 | ehea_dump(cqe, sizeof(*cqe), "Send CQE"); | 774 | ehea_dump(cqe, sizeof(*cqe), "Send CQE"); |
| 768 | schedule_work(&pr->port->reset_task); | 775 | ehea_schedule_port_reset(pr->port); |
| 769 | break; | 776 | break; |
| 770 | } | 777 | } |
| 771 | 778 | ||
| @@ -885,7 +892,7 @@ static irqreturn_t ehea_qp_aff_irq_handler(int irq, void *param) | |||
| 885 | eqe = ehea_poll_eq(port->qp_eq); | 892 | eqe = ehea_poll_eq(port->qp_eq); |
| 886 | } | 893 | } |
| 887 | 894 | ||
| 888 | schedule_work(&port->reset_task); | 895 | ehea_schedule_port_reset(port); |
| 889 | 896 | ||
| 890 | return IRQ_HANDLED; | 897 | return IRQ_HANDLED; |
| 891 | } | 898 | } |
| @@ -1763,7 +1770,7 @@ static int ehea_set_mac_addr(struct net_device *dev, void *sa) | |||
| 1763 | 1770 | ||
| 1764 | memcpy(dev->dev_addr, mac_addr->sa_data, dev->addr_len); | 1771 | memcpy(dev->dev_addr, mac_addr->sa_data, dev->addr_len); |
| 1765 | 1772 | ||
| 1766 | mutex_lock(&ehea_bcmc_regs.lock); | 1773 | spin_lock(&ehea_bcmc_regs.lock); |
| 1767 | 1774 | ||
| 1768 | /* Deregister old MAC in pHYP */ | 1775 | /* Deregister old MAC in pHYP */ |
| 1769 | if (port->state == EHEA_PORT_UP) { | 1776 | if (port->state == EHEA_PORT_UP) { |
| @@ -1785,7 +1792,7 @@ static int ehea_set_mac_addr(struct net_device *dev, void *sa) | |||
| 1785 | 1792 | ||
| 1786 | out_upregs: | 1793 | out_upregs: |
| 1787 | ehea_update_bcmc_registrations(); | 1794 | ehea_update_bcmc_registrations(); |
| 1788 | mutex_unlock(&ehea_bcmc_regs.lock); | 1795 | spin_unlock(&ehea_bcmc_regs.lock); |
| 1789 | out_free: | 1796 | out_free: |
| 1790 | kfree(cb0); | 1797 | kfree(cb0); |
| 1791 | out: | 1798 | out: |
| @@ -1947,7 +1954,7 @@ static void ehea_set_multicast_list(struct net_device *dev) | |||
| 1947 | } | 1954 | } |
| 1948 | ehea_promiscuous(dev, 0); | 1955 | ehea_promiscuous(dev, 0); |
| 1949 | 1956 | ||
| 1950 | mutex_lock(&ehea_bcmc_regs.lock); | 1957 | spin_lock(&ehea_bcmc_regs.lock); |
| 1951 | 1958 | ||
| 1952 | if (dev->flags & IFF_ALLMULTI) { | 1959 | if (dev->flags & IFF_ALLMULTI) { |
| 1953 | ehea_allmulti(dev, 1); | 1960 | ehea_allmulti(dev, 1); |
| @@ -1978,7 +1985,7 @@ static void ehea_set_multicast_list(struct net_device *dev) | |||
| 1978 | } | 1985 | } |
| 1979 | out: | 1986 | out: |
| 1980 | ehea_update_bcmc_registrations(); | 1987 | ehea_update_bcmc_registrations(); |
| 1981 | mutex_unlock(&ehea_bcmc_regs.lock); | 1988 | spin_unlock(&ehea_bcmc_regs.lock); |
| 1982 | return; | 1989 | return; |
| 1983 | } | 1990 | } |
| 1984 | 1991 | ||
| @@ -2497,7 +2504,7 @@ static int ehea_up(struct net_device *dev) | |||
| 2497 | } | 2504 | } |
| 2498 | } | 2505 | } |
| 2499 | 2506 | ||
| 2500 | mutex_lock(&ehea_bcmc_regs.lock); | 2507 | spin_lock(&ehea_bcmc_regs.lock); |
| 2501 | 2508 | ||
| 2502 | ret = ehea_broadcast_reg_helper(port, H_REG_BCMC); | 2509 | ret = ehea_broadcast_reg_helper(port, H_REG_BCMC); |
| 2503 | if (ret) { | 2510 | if (ret) { |
| @@ -2520,7 +2527,7 @@ out: | |||
| 2520 | ehea_info("Failed starting %s. ret=%i", dev->name, ret); | 2527 | ehea_info("Failed starting %s. ret=%i", dev->name, ret); |
| 2521 | 2528 | ||
| 2522 | ehea_update_bcmc_registrations(); | 2529 | ehea_update_bcmc_registrations(); |
| 2523 | mutex_unlock(&ehea_bcmc_regs.lock); | 2530 | spin_unlock(&ehea_bcmc_regs.lock); |
| 2524 | 2531 | ||
| 2525 | ehea_update_firmware_handles(); | 2532 | ehea_update_firmware_handles(); |
| 2526 | mutex_unlock(&ehea_fw_handles.lock); | 2533 | mutex_unlock(&ehea_fw_handles.lock); |
| @@ -2575,7 +2582,7 @@ static int ehea_down(struct net_device *dev) | |||
| 2575 | 2582 | ||
| 2576 | mutex_lock(&ehea_fw_handles.lock); | 2583 | mutex_lock(&ehea_fw_handles.lock); |
| 2577 | 2584 | ||
| 2578 | mutex_lock(&ehea_bcmc_regs.lock); | 2585 | spin_lock(&ehea_bcmc_regs.lock); |
| 2579 | ehea_drop_multicast_list(dev); | 2586 | ehea_drop_multicast_list(dev); |
| 2580 | ehea_broadcast_reg_helper(port, H_DEREG_BCMC); | 2587 | ehea_broadcast_reg_helper(port, H_DEREG_BCMC); |
| 2581 | 2588 | ||
| @@ -2584,7 +2591,7 @@ static int ehea_down(struct net_device *dev) | |||
| 2584 | port->state = EHEA_PORT_DOWN; | 2591 | port->state = EHEA_PORT_DOWN; |
| 2585 | 2592 | ||
| 2586 | ehea_update_bcmc_registrations(); | 2593 | ehea_update_bcmc_registrations(); |
| 2587 | mutex_unlock(&ehea_bcmc_regs.lock); | 2594 | spin_unlock(&ehea_bcmc_regs.lock); |
| 2588 | 2595 | ||
| 2589 | ret = ehea_clean_all_portres(port); | 2596 | ret = ehea_clean_all_portres(port); |
| 2590 | if (ret) | 2597 | if (ret) |
| @@ -2605,13 +2612,14 @@ static int ehea_stop(struct net_device *dev) | |||
| 2605 | if (netif_msg_ifdown(port)) | 2612 | if (netif_msg_ifdown(port)) |
| 2606 | ehea_info("disabling port %s", dev->name); | 2613 | ehea_info("disabling port %s", dev->name); |
| 2607 | 2614 | ||
| 2615 | set_bit(__EHEA_DISABLE_PORT_RESET, &port->flags); | ||
| 2608 | cancel_work_sync(&port->reset_task); | 2616 | cancel_work_sync(&port->reset_task); |
| 2609 | |||
| 2610 | mutex_lock(&port->port_lock); | 2617 | mutex_lock(&port->port_lock); |
| 2611 | netif_stop_queue(dev); | 2618 | netif_stop_queue(dev); |
| 2612 | port_napi_disable(port); | 2619 | port_napi_disable(port); |
| 2613 | ret = ehea_down(dev); | 2620 | ret = ehea_down(dev); |
| 2614 | mutex_unlock(&port->port_lock); | 2621 | mutex_unlock(&port->port_lock); |
| 2622 | clear_bit(__EHEA_DISABLE_PORT_RESET, &port->flags); | ||
| 2615 | return ret; | 2623 | return ret; |
| 2616 | } | 2624 | } |
| 2617 | 2625 | ||
| @@ -2941,7 +2949,7 @@ static void ehea_tx_watchdog(struct net_device *dev) | |||
| 2941 | 2949 | ||
| 2942 | if (netif_carrier_ok(dev) && | 2950 | if (netif_carrier_ok(dev) && |
| 2943 | !test_bit(__EHEA_STOP_XFER, &ehea_driver_flags)) | 2951 | !test_bit(__EHEA_STOP_XFER, &ehea_driver_flags)) |
| 2944 | schedule_work(&port->reset_task); | 2952 | ehea_schedule_port_reset(port); |
| 2945 | } | 2953 | } |
| 2946 | 2954 | ||
| 2947 | int ehea_sense_adapter_attr(struct ehea_adapter *adapter) | 2955 | int ehea_sense_adapter_attr(struct ehea_adapter *adapter) |
| @@ -3590,7 +3598,7 @@ int __init ehea_module_init(void) | |||
| 3590 | memset(&ehea_bcmc_regs, 0, sizeof(ehea_bcmc_regs)); | 3598 | memset(&ehea_bcmc_regs, 0, sizeof(ehea_bcmc_regs)); |
| 3591 | 3599 | ||
| 3592 | mutex_init(&ehea_fw_handles.lock); | 3600 | mutex_init(&ehea_fw_handles.lock); |
| 3593 | mutex_init(&ehea_bcmc_regs.lock); | 3601 | spin_lock_init(&ehea_bcmc_regs.lock); |
| 3594 | 3602 | ||
| 3595 | ret = check_module_parm(); | 3603 | ret = check_module_parm(); |
| 3596 | if (ret) | 3604 | if (ret) |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 2cb244763292..20d4fe96a81c 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
| @@ -4194,12 +4194,23 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
| 4194 | 4194 | ||
| 4195 | netif_carrier_off(dev); | 4195 | netif_carrier_off(dev); |
| 4196 | if (netif_running(dev)) { | 4196 | if (netif_running(dev)) { |
| 4197 | unsigned long flags; | ||
| 4198 | |||
| 4197 | nv_disable_irq(dev); | 4199 | nv_disable_irq(dev); |
| 4198 | netif_tx_lock_bh(dev); | 4200 | netif_tx_lock_bh(dev); |
| 4199 | spin_lock(&np->lock); | 4201 | /* with plain spinlock lockdep complains */ |
| 4202 | spin_lock_irqsave(&np->lock, flags); | ||
| 4200 | /* stop engines */ | 4203 | /* stop engines */ |
| 4204 | /* FIXME: | ||
| 4205 | * this can take some time, and interrupts are disabled | ||
| 4206 | * due to spin_lock_irqsave, but let's hope no daemon | ||
| 4207 | * is going to change the settings very often... | ||
| 4208 | * Worst case: | ||
| 4209 | * NV_RXSTOP_DELAY1MAX + NV_TXSTOP_DELAY1MAX | ||
| 4210 | * + some minor delays, which is up to a second approximately | ||
| 4211 | */ | ||
| 4201 | nv_stop_rxtx(dev); | 4212 | nv_stop_rxtx(dev); |
| 4202 | spin_unlock(&np->lock); | 4213 | spin_unlock_irqrestore(&np->lock, flags); |
| 4203 | netif_tx_unlock_bh(dev); | 4214 | netif_tx_unlock_bh(dev); |
| 4204 | } | 4215 | } |
| 4205 | 4216 | ||
diff --git a/drivers/net/fs_enet/mac-fcc.c b/drivers/net/fs_enet/mac-fcc.c index e36321152d50..8268b3535b30 100644 --- a/drivers/net/fs_enet/mac-fcc.c +++ b/drivers/net/fs_enet/mac-fcc.c | |||
| @@ -463,6 +463,9 @@ static void restart(struct net_device *dev) | |||
| 463 | else | 463 | else |
| 464 | C32(fccp, fcc_fpsmr, FCC_PSMR_FDE | FCC_PSMR_LPB); | 464 | C32(fccp, fcc_fpsmr, FCC_PSMR_FDE | FCC_PSMR_LPB); |
| 465 | 465 | ||
| 466 | /* Restore multicast and promiscuous settings */ | ||
| 467 | set_multicast_list(dev); | ||
| 468 | |||
| 466 | S32(fccp, fcc_gfmr, FCC_GFMR_ENR | FCC_GFMR_ENT); | 469 | S32(fccp, fcc_gfmr, FCC_GFMR_ENR | FCC_GFMR_ENT); |
| 467 | } | 470 | } |
| 468 | 471 | ||
diff --git a/drivers/net/hamradio/dmascc.c b/drivers/net/hamradio/dmascc.c index 0b94833e23f7..e8cfadefa4b6 100644 --- a/drivers/net/hamradio/dmascc.c +++ b/drivers/net/hamradio/dmascc.c | |||
| @@ -1077,8 +1077,6 @@ static inline void rx_off(struct scc_priv *priv) | |||
| 1077 | 1077 | ||
| 1078 | static void start_timer(struct scc_priv *priv, int t, int r15) | 1078 | static void start_timer(struct scc_priv *priv, int t, int r15) |
| 1079 | { | 1079 | { |
| 1080 | unsigned long flags; | ||
| 1081 | |||
| 1082 | outb(priv->tmr_mode, priv->tmr_ctrl); | 1080 | outb(priv->tmr_mode, priv->tmr_ctrl); |
| 1083 | if (t == 0) { | 1081 | if (t == 0) { |
| 1084 | tm_isr(priv); | 1082 | tm_isr(priv); |
diff --git a/drivers/net/ibm_newemac/core.c b/drivers/net/ibm_newemac/core.c index 5d2108c5ac7c..61af02b4c9d8 100644 --- a/drivers/net/ibm_newemac/core.c +++ b/drivers/net/ibm_newemac/core.c | |||
| @@ -363,25 +363,31 @@ static int emac_reset(struct emac_instance *dev) | |||
| 363 | 363 | ||
| 364 | static void emac_hash_mc(struct emac_instance *dev) | 364 | static void emac_hash_mc(struct emac_instance *dev) |
| 365 | { | 365 | { |
| 366 | struct emac_regs __iomem *p = dev->emacp; | 366 | const int regs = EMAC_XAHT_REGS(dev); |
| 367 | u16 gaht[4] = { 0 }; | 367 | u32 *gaht_base = emac_gaht_base(dev); |
| 368 | u32 gaht_temp[regs]; | ||
| 368 | struct dev_mc_list *dmi; | 369 | struct dev_mc_list *dmi; |
| 370 | int i; | ||
| 369 | 371 | ||
| 370 | DBG(dev, "hash_mc %d" NL, dev->ndev->mc_count); | 372 | DBG(dev, "hash_mc %d" NL, dev->ndev->mc_count); |
| 371 | 373 | ||
| 374 | memset(gaht_temp, 0, sizeof (gaht_temp)); | ||
| 375 | |||
| 372 | for (dmi = dev->ndev->mc_list; dmi; dmi = dmi->next) { | 376 | for (dmi = dev->ndev->mc_list; dmi; dmi = dmi->next) { |
| 373 | int bit; | 377 | int slot, reg, mask; |
| 374 | DBG2(dev, "mc %02x:%02x:%02x:%02x:%02x:%02x" NL, | 378 | DBG2(dev, "mc %02x:%02x:%02x:%02x:%02x:%02x" NL, |
| 375 | dmi->dmi_addr[0], dmi->dmi_addr[1], dmi->dmi_addr[2], | 379 | dmi->dmi_addr[0], dmi->dmi_addr[1], dmi->dmi_addr[2], |
| 376 | dmi->dmi_addr[3], dmi->dmi_addr[4], dmi->dmi_addr[5]); | 380 | dmi->dmi_addr[3], dmi->dmi_addr[4], dmi->dmi_addr[5]); |
| 377 | 381 | ||
| 378 | bit = 63 - (ether_crc(ETH_ALEN, dmi->dmi_addr) >> 26); | 382 | slot = EMAC_XAHT_CRC_TO_SLOT(dev, ether_crc(ETH_ALEN, dmi->dmi_addr)); |
| 379 | gaht[bit >> 4] |= 0x8000 >> (bit & 0x0f); | 383 | reg = EMAC_XAHT_SLOT_TO_REG(dev, slot); |
| 384 | mask = EMAC_XAHT_SLOT_TO_MASK(dev, slot); | ||
| 385 | |||
| 386 | gaht_temp[reg] |= mask; | ||
| 380 | } | 387 | } |
| 381 | out_be32(&p->gaht1, gaht[0]); | 388 | |
| 382 | out_be32(&p->gaht2, gaht[1]); | 389 | for (i = 0; i < regs; i++) |
| 383 | out_be32(&p->gaht3, gaht[2]); | 390 | out_be32(gaht_base + i, gaht_temp[i]); |
| 384 | out_be32(&p->gaht4, gaht[3]); | ||
| 385 | } | 391 | } |
| 386 | 392 | ||
| 387 | static inline u32 emac_iff2rmr(struct net_device *ndev) | 393 | static inline u32 emac_iff2rmr(struct net_device *ndev) |
| @@ -398,7 +404,8 @@ static inline u32 emac_iff2rmr(struct net_device *ndev) | |||
| 398 | 404 | ||
| 399 | if (ndev->flags & IFF_PROMISC) | 405 | if (ndev->flags & IFF_PROMISC) |
| 400 | r |= EMAC_RMR_PME; | 406 | r |= EMAC_RMR_PME; |
| 401 | else if (ndev->flags & IFF_ALLMULTI || ndev->mc_count > 32) | 407 | else if (ndev->flags & IFF_ALLMULTI || |
| 408 | (ndev->mc_count > EMAC_XAHT_SLOTS(dev))) | ||
| 402 | r |= EMAC_RMR_PMME; | 409 | r |= EMAC_RMR_PMME; |
| 403 | else if (ndev->mc_count > 0) | 410 | else if (ndev->mc_count > 0) |
| 404 | r |= EMAC_RMR_MAE; | 411 | r |= EMAC_RMR_MAE; |
| @@ -542,7 +549,7 @@ static int emac_configure(struct emac_instance *dev) | |||
| 542 | /* Put some arbitrary OUI, Manuf & Rev IDs so we can | 549 | /* Put some arbitrary OUI, Manuf & Rev IDs so we can |
| 543 | * identify this GPCS PHY later. | 550 | * identify this GPCS PHY later. |
| 544 | */ | 551 | */ |
| 545 | out_be32(&p->ipcr, 0xdeadbeef); | 552 | out_be32(&p->u1.emac4.ipcr, 0xdeadbeef); |
| 546 | } else | 553 | } else |
| 547 | mr1 |= EMAC_MR1_MF_1000; | 554 | mr1 |= EMAC_MR1_MF_1000; |
| 548 | 555 | ||
| @@ -1636,6 +1643,12 @@ static int emac_poll_rx(void *param, int budget) | |||
| 1636 | goto next; | 1643 | goto next; |
| 1637 | } | 1644 | } |
| 1638 | 1645 | ||
| 1646 | if (len < ETH_HLEN) { | ||
| 1647 | ++dev->estats.rx_dropped_stack; | ||
| 1648 | emac_recycle_rx_skb(dev, slot, len); | ||
| 1649 | goto next; | ||
| 1650 | } | ||
| 1651 | |||
| 1639 | if (len && len < EMAC_RX_COPY_THRESH) { | 1652 | if (len && len < EMAC_RX_COPY_THRESH) { |
| 1640 | struct sk_buff *copy_skb = | 1653 | struct sk_buff *copy_skb = |
| 1641 | alloc_skb(len + EMAC_RX_SKB_HEADROOM + 2, GFP_ATOMIC); | 1654 | alloc_skb(len + EMAC_RX_SKB_HEADROOM + 2, GFP_ATOMIC); |
| @@ -2015,10 +2028,10 @@ static int emac_get_regs_len(struct emac_instance *dev) | |||
| 2015 | { | 2028 | { |
| 2016 | if (emac_has_feature(dev, EMAC_FTR_EMAC4)) | 2029 | if (emac_has_feature(dev, EMAC_FTR_EMAC4)) |
| 2017 | return sizeof(struct emac_ethtool_regs_subhdr) + | 2030 | return sizeof(struct emac_ethtool_regs_subhdr) + |
| 2018 | EMAC4_ETHTOOL_REGS_SIZE; | 2031 | EMAC4_ETHTOOL_REGS_SIZE(dev); |
| 2019 | else | 2032 | else |
| 2020 | return sizeof(struct emac_ethtool_regs_subhdr) + | 2033 | return sizeof(struct emac_ethtool_regs_subhdr) + |
| 2021 | EMAC_ETHTOOL_REGS_SIZE; | 2034 | EMAC_ETHTOOL_REGS_SIZE(dev); |
| 2022 | } | 2035 | } |
| 2023 | 2036 | ||
| 2024 | static int emac_ethtool_get_regs_len(struct net_device *ndev) | 2037 | static int emac_ethtool_get_regs_len(struct net_device *ndev) |
| @@ -2045,12 +2058,12 @@ static void *emac_dump_regs(struct emac_instance *dev, void *buf) | |||
| 2045 | hdr->index = dev->cell_index; | 2058 | hdr->index = dev->cell_index; |
| 2046 | if (emac_has_feature(dev, EMAC_FTR_EMAC4)) { | 2059 | if (emac_has_feature(dev, EMAC_FTR_EMAC4)) { |
| 2047 | hdr->version = EMAC4_ETHTOOL_REGS_VER; | 2060 | hdr->version = EMAC4_ETHTOOL_REGS_VER; |
| 2048 | memcpy_fromio(hdr + 1, dev->emacp, EMAC4_ETHTOOL_REGS_SIZE); | 2061 | memcpy_fromio(hdr + 1, dev->emacp, EMAC4_ETHTOOL_REGS_SIZE(dev)); |
| 2049 | return ((void *)(hdr + 1) + EMAC4_ETHTOOL_REGS_SIZE); | 2062 | return ((void *)(hdr + 1) + EMAC4_ETHTOOL_REGS_SIZE(dev)); |
| 2050 | } else { | 2063 | } else { |
| 2051 | hdr->version = EMAC_ETHTOOL_REGS_VER; | 2064 | hdr->version = EMAC_ETHTOOL_REGS_VER; |
| 2052 | memcpy_fromio(hdr + 1, dev->emacp, EMAC_ETHTOOL_REGS_SIZE); | 2065 | memcpy_fromio(hdr + 1, dev->emacp, EMAC_ETHTOOL_REGS_SIZE(dev)); |
| 2053 | return ((void *)(hdr + 1) + EMAC_ETHTOOL_REGS_SIZE); | 2066 | return ((void *)(hdr + 1) + EMAC_ETHTOOL_REGS_SIZE(dev)); |
| 2054 | } | 2067 | } |
| 2055 | } | 2068 | } |
| 2056 | 2069 | ||
| @@ -2540,7 +2553,9 @@ static int __devinit emac_init_config(struct emac_instance *dev) | |||
| 2540 | } | 2553 | } |
| 2541 | 2554 | ||
| 2542 | /* Check EMAC version */ | 2555 | /* Check EMAC version */ |
| 2543 | if (of_device_is_compatible(np, "ibm,emac4")) { | 2556 | if (of_device_is_compatible(np, "ibm,emac4sync")) { |
| 2557 | dev->features |= (EMAC_FTR_EMAC4 | EMAC_FTR_EMAC4SYNC); | ||
| 2558 | } else if (of_device_is_compatible(np, "ibm,emac4")) { | ||
| 2544 | dev->features |= EMAC_FTR_EMAC4; | 2559 | dev->features |= EMAC_FTR_EMAC4; |
| 2545 | if (of_device_is_compatible(np, "ibm,emac-440gx")) | 2560 | if (of_device_is_compatible(np, "ibm,emac-440gx")) |
| 2546 | dev->features |= EMAC_FTR_440GX_PHY_CLK_FIX; | 2561 | dev->features |= EMAC_FTR_440GX_PHY_CLK_FIX; |
| @@ -2601,6 +2616,15 @@ static int __devinit emac_init_config(struct emac_instance *dev) | |||
| 2601 | } | 2616 | } |
| 2602 | memcpy(dev->ndev->dev_addr, p, 6); | 2617 | memcpy(dev->ndev->dev_addr, p, 6); |
| 2603 | 2618 | ||
| 2619 | /* IAHT and GAHT filter parameterization */ | ||
| 2620 | if (emac_has_feature(dev, EMAC_FTR_EMAC4SYNC)) { | ||
| 2621 | dev->xaht_slots_shift = EMAC4SYNC_XAHT_SLOTS_SHIFT; | ||
| 2622 | dev->xaht_width_shift = EMAC4SYNC_XAHT_WIDTH_SHIFT; | ||
| 2623 | } else { | ||
| 2624 | dev->xaht_slots_shift = EMAC4_XAHT_SLOTS_SHIFT; | ||
| 2625 | dev->xaht_width_shift = EMAC4_XAHT_WIDTH_SHIFT; | ||
| 2626 | } | ||
| 2627 | |||
| 2604 | DBG(dev, "features : 0x%08x / 0x%08x\n", dev->features, EMAC_FTRS_POSSIBLE); | 2628 | DBG(dev, "features : 0x%08x / 0x%08x\n", dev->features, EMAC_FTRS_POSSIBLE); |
| 2605 | DBG(dev, "tx_fifo_size : %d (%d gige)\n", dev->tx_fifo_size, dev->tx_fifo_size_gige); | 2629 | DBG(dev, "tx_fifo_size : %d (%d gige)\n", dev->tx_fifo_size, dev->tx_fifo_size_gige); |
| 2606 | DBG(dev, "rx_fifo_size : %d (%d gige)\n", dev->rx_fifo_size, dev->rx_fifo_size_gige); | 2630 | DBG(dev, "rx_fifo_size : %d (%d gige)\n", dev->rx_fifo_size, dev->rx_fifo_size_gige); |
| @@ -2672,7 +2696,8 @@ static int __devinit emac_probe(struct of_device *ofdev, | |||
| 2672 | goto err_irq_unmap; | 2696 | goto err_irq_unmap; |
| 2673 | } | 2697 | } |
| 2674 | // TODO : request_mem_region | 2698 | // TODO : request_mem_region |
| 2675 | dev->emacp = ioremap(dev->rsrc_regs.start, sizeof(struct emac_regs)); | 2699 | dev->emacp = ioremap(dev->rsrc_regs.start, |
| 2700 | dev->rsrc_regs.end - dev->rsrc_regs.start + 1); | ||
| 2676 | if (dev->emacp == NULL) { | 2701 | if (dev->emacp == NULL) { |
| 2677 | printk(KERN_ERR "%s: Can't map device registers!\n", | 2702 | printk(KERN_ERR "%s: Can't map device registers!\n", |
| 2678 | np->full_name); | 2703 | np->full_name); |
| @@ -2719,6 +2744,8 @@ static int __devinit emac_probe(struct of_device *ofdev, | |||
| 2719 | /* Clean rings */ | 2744 | /* Clean rings */ |
| 2720 | memset(dev->tx_desc, 0, NUM_TX_BUFF * sizeof(struct mal_descriptor)); | 2745 | memset(dev->tx_desc, 0, NUM_TX_BUFF * sizeof(struct mal_descriptor)); |
| 2721 | memset(dev->rx_desc, 0, NUM_RX_BUFF * sizeof(struct mal_descriptor)); | 2746 | memset(dev->rx_desc, 0, NUM_RX_BUFF * sizeof(struct mal_descriptor)); |
| 2747 | memset(dev->tx_skb, 0, NUM_TX_BUFF * sizeof(struct sk_buff *)); | ||
| 2748 | memset(dev->rx_skb, 0, NUM_RX_BUFF * sizeof(struct sk_buff *)); | ||
| 2722 | 2749 | ||
| 2723 | /* Attach to ZMII, if needed */ | 2750 | /* Attach to ZMII, if needed */ |
| 2724 | if (emac_has_feature(dev, EMAC_FTR_HAS_ZMII) && | 2751 | if (emac_has_feature(dev, EMAC_FTR_HAS_ZMII) && |
| @@ -2884,6 +2911,10 @@ static struct of_device_id emac_match[] = | |||
| 2884 | .type = "network", | 2911 | .type = "network", |
| 2885 | .compatible = "ibm,emac4", | 2912 | .compatible = "ibm,emac4", |
| 2886 | }, | 2913 | }, |
| 2914 | { | ||
| 2915 | .type = "network", | ||
| 2916 | .compatible = "ibm,emac4sync", | ||
| 2917 | }, | ||
| 2887 | {}, | 2918 | {}, |
| 2888 | }; | 2919 | }; |
| 2889 | 2920 | ||
diff --git a/drivers/net/ibm_newemac/core.h b/drivers/net/ibm_newemac/core.h index 223090466760..6545e69d12c3 100644 --- a/drivers/net/ibm_newemac/core.h +++ b/drivers/net/ibm_newemac/core.h | |||
| @@ -235,6 +235,10 @@ struct emac_instance { | |||
| 235 | u32 fifo_entry_size; | 235 | u32 fifo_entry_size; |
| 236 | u32 mal_burst_size; /* move to MAL ? */ | 236 | u32 mal_burst_size; /* move to MAL ? */ |
| 237 | 237 | ||
| 238 | /* IAHT and GAHT filter parameterization */ | ||
| 239 | u32 xaht_slots_shift; | ||
| 240 | u32 xaht_width_shift; | ||
| 241 | |||
| 238 | /* Descriptor management | 242 | /* Descriptor management |
| 239 | */ | 243 | */ |
| 240 | struct mal_descriptor *tx_desc; | 244 | struct mal_descriptor *tx_desc; |
| @@ -309,6 +313,10 @@ struct emac_instance { | |||
| 309 | * Set if we need phy clock workaround for 440ep or 440gr | 313 | * Set if we need phy clock workaround for 440ep or 440gr |
| 310 | */ | 314 | */ |
| 311 | #define EMAC_FTR_440EP_PHY_CLK_FIX 0x00000100 | 315 | #define EMAC_FTR_440EP_PHY_CLK_FIX 0x00000100 |
| 316 | /* | ||
| 317 | * The 405EX and 460EX contain the EMAC4SYNC core | ||
| 318 | */ | ||
| 319 | #define EMAC_FTR_EMAC4SYNC 0x00000200 | ||
| 312 | 320 | ||
| 313 | 321 | ||
| 314 | /* Right now, we don't quite handle the always/possible masks on the | 322 | /* Right now, we don't quite handle the always/possible masks on the |
| @@ -320,7 +328,8 @@ enum { | |||
| 320 | 328 | ||
| 321 | EMAC_FTRS_POSSIBLE = | 329 | EMAC_FTRS_POSSIBLE = |
| 322 | #ifdef CONFIG_IBM_NEW_EMAC_EMAC4 | 330 | #ifdef CONFIG_IBM_NEW_EMAC_EMAC4 |
| 323 | EMAC_FTR_EMAC4 | EMAC_FTR_HAS_NEW_STACR | | 331 | EMAC_FTR_EMAC4 | EMAC_FTR_EMAC4SYNC | |
| 332 | EMAC_FTR_HAS_NEW_STACR | | ||
| 324 | EMAC_FTR_STACR_OC_INVERT | EMAC_FTR_440GX_PHY_CLK_FIX | | 333 | EMAC_FTR_STACR_OC_INVERT | EMAC_FTR_440GX_PHY_CLK_FIX | |
| 325 | #endif | 334 | #endif |
| 326 | #ifdef CONFIG_IBM_NEW_EMAC_TAH | 335 | #ifdef CONFIG_IBM_NEW_EMAC_TAH |
| @@ -342,6 +351,71 @@ static inline int emac_has_feature(struct emac_instance *dev, | |||
| 342 | (EMAC_FTRS_POSSIBLE & dev->features & feature); | 351 | (EMAC_FTRS_POSSIBLE & dev->features & feature); |
| 343 | } | 352 | } |
| 344 | 353 | ||
| 354 | /* | ||
| 355 | * Various instances of the EMAC core have varying 1) number of | ||
| 356 | * address match slots, 2) width of the registers for handling address | ||
| 357 | * match slots, 3) number of registers for handling address match | ||
| 358 | * slots and 4) base offset for those registers. | ||
| 359 | * | ||
| 360 | * These macros and inlines handle these differences based on | ||
| 361 | * parameters supplied by the device structure which are, in turn, | ||
| 362 | * initialized based on the "compatible" entry in the device tree. | ||
| 363 | */ | ||
| 364 | |||
| 365 | #define EMAC4_XAHT_SLOTS_SHIFT 6 | ||
| 366 | #define EMAC4_XAHT_WIDTH_SHIFT 4 | ||
| 367 | |||
| 368 | #define EMAC4SYNC_XAHT_SLOTS_SHIFT 8 | ||
| 369 | #define EMAC4SYNC_XAHT_WIDTH_SHIFT 5 | ||
| 370 | |||
| 371 | #define EMAC_XAHT_SLOTS(dev) (1 << (dev)->xaht_slots_shift) | ||
| 372 | #define EMAC_XAHT_WIDTH(dev) (1 << (dev)->xaht_width_shift) | ||
| 373 | #define EMAC_XAHT_REGS(dev) (1 << ((dev)->xaht_slots_shift - \ | ||
| 374 | (dev)->xaht_width_shift)) | ||
| 375 | |||
| 376 | #define EMAC_XAHT_CRC_TO_SLOT(dev, crc) \ | ||
| 377 | ((EMAC_XAHT_SLOTS(dev) - 1) - \ | ||
| 378 | ((crc) >> ((sizeof (u32) * BITS_PER_BYTE) - \ | ||
| 379 | (dev)->xaht_slots_shift))) | ||
| 380 | |||
| 381 | #define EMAC_XAHT_SLOT_TO_REG(dev, slot) \ | ||
| 382 | ((slot) >> (dev)->xaht_width_shift) | ||
| 383 | |||
| 384 | #define EMAC_XAHT_SLOT_TO_MASK(dev, slot) \ | ||
| 385 | ((u32)(1 << (EMAC_XAHT_WIDTH(dev) - 1)) >> \ | ||
| 386 | ((slot) & (u32)(EMAC_XAHT_WIDTH(dev) - 1))) | ||
| 387 | |||
| 388 | static inline u32 *emac_xaht_base(struct emac_instance *dev) | ||
| 389 | { | ||
| 390 | struct emac_regs __iomem *p = dev->emacp; | ||
| 391 | int offset; | ||
| 392 | |||
| 393 | /* The first IAHT entry always is the base of the block of | ||
| 394 | * IAHT and GAHT registers. | ||
| 395 | */ | ||
| 396 | if (emac_has_feature(dev, EMAC_FTR_EMAC4SYNC)) | ||
| 397 | offset = offsetof(struct emac_regs, u1.emac4sync.iaht1); | ||
| 398 | else | ||
| 399 | offset = offsetof(struct emac_regs, u0.emac4.iaht1); | ||
| 400 | |||
| 401 | return ((u32 *)((ptrdiff_t)p + offset)); | ||
| 402 | } | ||
| 403 | |||
| 404 | static inline u32 *emac_gaht_base(struct emac_instance *dev) | ||
| 405 | { | ||
| 406 | /* GAHT registers always come after an identical number of | ||
| 407 | * IAHT registers. | ||
| 408 | */ | ||
| 409 | return (emac_xaht_base(dev) + EMAC_XAHT_REGS(dev)); | ||
| 410 | } | ||
| 411 | |||
| 412 | static inline u32 *emac_iaht_base(struct emac_instance *dev) | ||
| 413 | { | ||
| 414 | /* IAHT registers always come before an identical number of | ||
| 415 | * GAHT registers. | ||
| 416 | */ | ||
| 417 | return (emac_xaht_base(dev)); | ||
| 418 | } | ||
| 345 | 419 | ||
| 346 | /* Ethtool get_regs complex data. | 420 | /* Ethtool get_regs complex data. |
| 347 | * We want to get not just EMAC registers, but also MAL, ZMII, RGMII, TAH | 421 | * We want to get not just EMAC registers, but also MAL, ZMII, RGMII, TAH |
| @@ -366,4 +440,11 @@ struct emac_ethtool_regs_subhdr { | |||
| 366 | u32 index; | 440 | u32 index; |
| 367 | }; | 441 | }; |
| 368 | 442 | ||
| 443 | #define EMAC_ETHTOOL_REGS_VER 0 | ||
| 444 | #define EMAC_ETHTOOL_REGS_SIZE(dev) ((dev)->rsrc_regs.end - \ | ||
| 445 | (dev)->rsrc_regs.start + 1) | ||
| 446 | #define EMAC4_ETHTOOL_REGS_VER 1 | ||
| 447 | #define EMAC4_ETHTOOL_REGS_SIZE(dev) ((dev)->rsrc_regs.end - \ | ||
| 448 | (dev)->rsrc_regs.start + 1) | ||
| 449 | |||
| 369 | #endif /* __IBM_NEWEMAC_CORE_H */ | 450 | #endif /* __IBM_NEWEMAC_CORE_H */ |
diff --git a/drivers/net/ibm_newemac/debug.c b/drivers/net/ibm_newemac/debug.c index 86b756a30784..775c850a425a 100644 --- a/drivers/net/ibm_newemac/debug.c +++ b/drivers/net/ibm_newemac/debug.c | |||
| @@ -67,29 +67,55 @@ static void emac_desc_dump(struct emac_instance *p) | |||
| 67 | static void emac_mac_dump(struct emac_instance *dev) | 67 | static void emac_mac_dump(struct emac_instance *dev) |
| 68 | { | 68 | { |
| 69 | struct emac_regs __iomem *p = dev->emacp; | 69 | struct emac_regs __iomem *p = dev->emacp; |
| 70 | const int xaht_regs = EMAC_XAHT_REGS(dev); | ||
| 71 | u32 *gaht_base = emac_gaht_base(dev); | ||
| 72 | u32 *iaht_base = emac_iaht_base(dev); | ||
| 73 | int emac4sync = emac_has_feature(dev, EMAC_FTR_EMAC4SYNC); | ||
| 74 | int n; | ||
| 70 | 75 | ||
| 71 | printk("** EMAC %s registers **\n" | 76 | printk("** EMAC %s registers **\n" |
| 72 | "MR0 = 0x%08x MR1 = 0x%08x TMR0 = 0x%08x TMR1 = 0x%08x\n" | 77 | "MR0 = 0x%08x MR1 = 0x%08x TMR0 = 0x%08x TMR1 = 0x%08x\n" |
| 73 | "RMR = 0x%08x ISR = 0x%08x ISER = 0x%08x\n" | 78 | "RMR = 0x%08x ISR = 0x%08x ISER = 0x%08x\n" |
| 74 | "IAR = %04x%08x VTPID = 0x%04x VTCI = 0x%04x\n" | 79 | "IAR = %04x%08x VTPID = 0x%04x VTCI = 0x%04x\n", |
| 75 | "IAHT: 0x%04x 0x%04x 0x%04x 0x%04x " | ||
| 76 | "GAHT: 0x%04x 0x%04x 0x%04x 0x%04x\n" | ||
| 77 | "LSA = %04x%08x IPGVR = 0x%04x\n" | ||
| 78 | "STACR = 0x%08x TRTR = 0x%08x RWMR = 0x%08x\n" | ||
| 79 | "OCTX = 0x%08x OCRX = 0x%08x IPCR = 0x%08x\n", | ||
| 80 | dev->ofdev->node->full_name, in_be32(&p->mr0), in_be32(&p->mr1), | 80 | dev->ofdev->node->full_name, in_be32(&p->mr0), in_be32(&p->mr1), |
| 81 | in_be32(&p->tmr0), in_be32(&p->tmr1), | 81 | in_be32(&p->tmr0), in_be32(&p->tmr1), |
| 82 | in_be32(&p->rmr), in_be32(&p->isr), in_be32(&p->iser), | 82 | in_be32(&p->rmr), in_be32(&p->isr), in_be32(&p->iser), |
| 83 | in_be32(&p->iahr), in_be32(&p->ialr), in_be32(&p->vtpid), | 83 | in_be32(&p->iahr), in_be32(&p->ialr), in_be32(&p->vtpid), |
| 84 | in_be32(&p->vtci), | 84 | in_be32(&p->vtci) |
| 85 | in_be32(&p->iaht1), in_be32(&p->iaht2), in_be32(&p->iaht3), | 85 | ); |
| 86 | in_be32(&p->iaht4), | 86 | |
| 87 | in_be32(&p->gaht1), in_be32(&p->gaht2), in_be32(&p->gaht3), | 87 | if (emac4sync) |
| 88 | in_be32(&p->gaht4), | 88 | printk("MAR = %04x%08x MMAR = %04x%08x\n", |
| 89 | in_be32(&p->u0.emac4sync.mahr), | ||
| 90 | in_be32(&p->u0.emac4sync.malr), | ||
| 91 | in_be32(&p->u0.emac4sync.mmahr), | ||
| 92 | in_be32(&p->u0.emac4sync.mmalr) | ||
| 93 | ); | ||
| 94 | |||
| 95 | for (n = 0; n < xaht_regs; n++) | ||
| 96 | printk("IAHT%02d = 0x%08x\n", n + 1, in_be32(iaht_base + n)); | ||
| 97 | |||
| 98 | for (n = 0; n < xaht_regs; n++) | ||
| 99 | printk("GAHT%02d = 0x%08x\n", n + 1, in_be32(gaht_base + n)); | ||
| 100 | |||
| 101 | printk("LSA = %04x%08x IPGVR = 0x%04x\n" | ||
| 102 | "STACR = 0x%08x TRTR = 0x%08x RWMR = 0x%08x\n" | ||
| 103 | "OCTX = 0x%08x OCRX = 0x%08x\n", | ||
| 89 | in_be32(&p->lsah), in_be32(&p->lsal), in_be32(&p->ipgvr), | 104 | in_be32(&p->lsah), in_be32(&p->lsal), in_be32(&p->ipgvr), |
| 90 | in_be32(&p->stacr), in_be32(&p->trtr), in_be32(&p->rwmr), | 105 | in_be32(&p->stacr), in_be32(&p->trtr), in_be32(&p->rwmr), |
| 91 | in_be32(&p->octx), in_be32(&p->ocrx), in_be32(&p->ipcr) | 106 | in_be32(&p->octx), in_be32(&p->ocrx) |
| 92 | ); | 107 | ); |
| 108 | |||
| 109 | if (!emac4sync) { | ||
| 110 | printk("IPCR = 0x%08x\n", | ||
| 111 | in_be32(&p->u1.emac4.ipcr) | ||
| 112 | ); | ||
| 113 | } else { | ||
| 114 | printk("REVID = 0x%08x TPC = 0x%08x\n", | ||
| 115 | in_be32(&p->u1.emac4sync.revid), | ||
| 116 | in_be32(&p->u1.emac4sync.tpc) | ||
| 117 | ); | ||
| 118 | } | ||
| 93 | 119 | ||
| 94 | emac_desc_dump(dev); | 120 | emac_desc_dump(dev); |
| 95 | } | 121 | } |
diff --git a/drivers/net/ibm_newemac/emac.h b/drivers/net/ibm_newemac/emac.h index 91cb096ab405..0afc2cf5c52b 100644 --- a/drivers/net/ibm_newemac/emac.h +++ b/drivers/net/ibm_newemac/emac.h | |||
| @@ -27,37 +27,80 @@ | |||
| 27 | 27 | ||
| 28 | #include <linux/types.h> | 28 | #include <linux/types.h> |
| 29 | 29 | ||
| 30 | /* EMAC registers Write Access rules */ | 30 | /* EMAC registers Write Access rules */ |
| 31 | struct emac_regs { | 31 | struct emac_regs { |
| 32 | u32 mr0; /* special */ | 32 | /* Common registers across all EMAC implementations. */ |
| 33 | u32 mr1; /* Reset */ | 33 | u32 mr0; /* Special */ |
| 34 | u32 tmr0; /* special */ | 34 | u32 mr1; /* Reset */ |
| 35 | u32 tmr1; /* special */ | 35 | u32 tmr0; /* Special */ |
| 36 | u32 rmr; /* Reset */ | 36 | u32 tmr1; /* Special */ |
| 37 | u32 isr; /* Always */ | 37 | u32 rmr; /* Reset */ |
| 38 | u32 iser; /* Reset */ | 38 | u32 isr; /* Always */ |
| 39 | u32 iahr; /* Reset, R, T */ | 39 | u32 iser; /* Reset */ |
| 40 | u32 ialr; /* Reset, R, T */ | 40 | u32 iahr; /* Reset, R, T */ |
| 41 | u32 vtpid; /* Reset, R, T */ | 41 | u32 ialr; /* Reset, R, T */ |
| 42 | u32 vtci; /* Reset, R, T */ | 42 | u32 vtpid; /* Reset, R, T */ |
| 43 | u32 ptr; /* Reset, T */ | 43 | u32 vtci; /* Reset, R, T */ |
| 44 | u32 iaht1; /* Reset, R */ | 44 | u32 ptr; /* Reset, T */ |
| 45 | u32 iaht2; /* Reset, R */ | 45 | union { |
| 46 | u32 iaht3; /* Reset, R */ | 46 | /* Registers unique to EMAC4 implementations */ |
| 47 | u32 iaht4; /* Reset, R */ | 47 | struct { |
| 48 | u32 gaht1; /* Reset, R */ | 48 | u32 iaht1; /* Reset, R */ |
| 49 | u32 gaht2; /* Reset, R */ | 49 | u32 iaht2; /* Reset, R */ |
| 50 | u32 gaht3; /* Reset, R */ | 50 | u32 iaht3; /* Reset, R */ |
| 51 | u32 gaht4; /* Reset, R */ | 51 | u32 iaht4; /* Reset, R */ |
| 52 | u32 gaht1; /* Reset, R */ | ||
| 53 | u32 gaht2; /* Reset, R */ | ||
| 54 | u32 gaht3; /* Reset, R */ | ||
| 55 | u32 gaht4; /* Reset, R */ | ||
| 56 | } emac4; | ||
| 57 | /* Registers unique to EMAC4SYNC implementations */ | ||
| 58 | struct { | ||
| 59 | u32 mahr; /* Reset, R, T */ | ||
| 60 | u32 malr; /* Reset, R, T */ | ||
| 61 | u32 mmahr; /* Reset, R, T */ | ||
| 62 | u32 mmalr; /* Reset, R, T */ | ||
| 63 | u32 rsvd0[4]; | ||
| 64 | } emac4sync; | ||
| 65 | } u0; | ||
| 66 | /* Common registers across all EMAC implementations. */ | ||
| 52 | u32 lsah; | 67 | u32 lsah; |
| 53 | u32 lsal; | 68 | u32 lsal; |
| 54 | u32 ipgvr; /* Reset, T */ | 69 | u32 ipgvr; /* Reset, T */ |
| 55 | u32 stacr; /* special */ | 70 | u32 stacr; /* Special */ |
| 56 | u32 trtr; /* special */ | 71 | u32 trtr; /* Special */ |
| 57 | u32 rwmr; /* Reset */ | 72 | u32 rwmr; /* Reset */ |
| 58 | u32 octx; | 73 | u32 octx; |
| 59 | u32 ocrx; | 74 | u32 ocrx; |
| 60 | u32 ipcr; | 75 | union { |
| 76 | /* Registers unique to EMAC4 implementations */ | ||
| 77 | struct { | ||
| 78 | u32 ipcr; | ||
| 79 | } emac4; | ||
| 80 | /* Registers unique to EMAC4SYNC implementations */ | ||
| 81 | struct { | ||
| 82 | u32 rsvd1; | ||
| 83 | u32 revid; | ||
| 84 | u32 rsvd2[2]; | ||
| 85 | u32 iaht1; /* Reset, R */ | ||
| 86 | u32 iaht2; /* Reset, R */ | ||
| 87 | u32 iaht3; /* Reset, R */ | ||
| 88 | u32 iaht4; /* Reset, R */ | ||
| 89 | u32 iaht5; /* Reset, R */ | ||
| 90 | u32 iaht6; /* Reset, R */ | ||
| 91 | u32 iaht7; /* Reset, R */ | ||
| 92 | u32 iaht8; /* Reset, R */ | ||
| 93 | u32 gaht1; /* Reset, R */ | ||
| 94 | u32 gaht2; /* Reset, R */ | ||
| 95 | u32 gaht3; /* Reset, R */ | ||
| 96 | u32 gaht4; /* Reset, R */ | ||
| 97 | u32 gaht5; /* Reset, R */ | ||
| 98 | u32 gaht6; /* Reset, R */ | ||
| 99 | u32 gaht7; /* Reset, R */ | ||
| 100 | u32 gaht8; /* Reset, R */ | ||
| 101 | u32 tpc; /* Reset, T */ | ||
| 102 | } emac4sync; | ||
| 103 | } u1; | ||
| 61 | }; | 104 | }; |
| 62 | 105 | ||
| 63 | /* | 106 | /* |
| @@ -73,12 +116,6 @@ struct emac_regs { | |||
| 73 | #define PHY_MODE_RTBI 7 | 116 | #define PHY_MODE_RTBI 7 |
| 74 | #define PHY_MODE_SGMII 8 | 117 | #define PHY_MODE_SGMII 8 |
| 75 | 118 | ||
| 76 | |||
| 77 | #define EMAC_ETHTOOL_REGS_VER 0 | ||
| 78 | #define EMAC_ETHTOOL_REGS_SIZE (sizeof(struct emac_regs) - sizeof(u32)) | ||
| 79 | #define EMAC4_ETHTOOL_REGS_VER 1 | ||
| 80 | #define EMAC4_ETHTOOL_REGS_SIZE sizeof(struct emac_regs) | ||
| 81 | |||
| 82 | /* EMACx_MR0 */ | 119 | /* EMACx_MR0 */ |
| 83 | #define EMAC_MR0_RXI 0x80000000 | 120 | #define EMAC_MR0_RXI 0x80000000 |
| 84 | #define EMAC_MR0_TXI 0x40000000 | 121 | #define EMAC_MR0_TXI 0x40000000 |
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index ae398f04c7b4..e79a26a886c8 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
| @@ -718,7 +718,8 @@ void igb_down(struct igb_adapter *adapter) | |||
| 718 | adapter->link_speed = 0; | 718 | adapter->link_speed = 0; |
| 719 | adapter->link_duplex = 0; | 719 | adapter->link_duplex = 0; |
| 720 | 720 | ||
| 721 | igb_reset(adapter); | 721 | if (!pci_channel_offline(adapter->pdev)) |
| 722 | igb_reset(adapter); | ||
| 722 | igb_clean_all_tx_rings(adapter); | 723 | igb_clean_all_tx_rings(adapter); |
| 723 | igb_clean_all_rx_rings(adapter); | 724 | igb_clean_all_rx_rings(adapter); |
| 724 | } | 725 | } |
diff --git a/drivers/net/ipg.c b/drivers/net/ipg.c index 679a0826780e..2c03f4e2ccc4 100644 --- a/drivers/net/ipg.c +++ b/drivers/net/ipg.c | |||
| @@ -1271,7 +1271,7 @@ static void ipg_nic_rx_with_end(struct net_device *dev, | |||
| 1271 | 1271 | ||
| 1272 | framelen = le64_to_cpu(rxfd->rfs) & IPG_RFS_RXFRAMELEN; | 1272 | framelen = le64_to_cpu(rxfd->rfs) & IPG_RFS_RXFRAMELEN; |
| 1273 | 1273 | ||
| 1274 | endframeLen = framelen - jumbo->current_size; | 1274 | endframelen = framelen - jumbo->current_size; |
| 1275 | /* | 1275 | /* |
| 1276 | if (framelen > IPG_RXFRAG_SIZE) | 1276 | if (framelen > IPG_RXFRAG_SIZE) |
| 1277 | framelen=IPG_RXFRAG_SIZE; | 1277 | framelen=IPG_RXFRAG_SIZE; |
| @@ -1279,8 +1279,8 @@ static void ipg_nic_rx_with_end(struct net_device *dev, | |||
| 1279 | if (framelen > IPG_RXSUPPORT_SIZE) | 1279 | if (framelen > IPG_RXSUPPORT_SIZE) |
| 1280 | dev_kfree_skb_irq(jumbo->skb); | 1280 | dev_kfree_skb_irq(jumbo->skb); |
| 1281 | else { | 1281 | else { |
| 1282 | memcpy(skb_put(jumbo->skb, endframeLen), | 1282 | memcpy(skb_put(jumbo->skb, endframelen), |
| 1283 | skb->data, endframeLen); | 1283 | skb->data, endframelen); |
| 1284 | 1284 | ||
| 1285 | jumbo->skb->protocol = | 1285 | jumbo->skb->protocol = |
| 1286 | eth_type_trans(jumbo->skb, dev); | 1286 | eth_type_trans(jumbo->skb, dev); |
| @@ -1352,16 +1352,16 @@ static int ipg_nic_rx(struct net_device *dev) | |||
| 1352 | 1352 | ||
| 1353 | switch (ipg_nic_rx_check_frame_type(dev)) { | 1353 | switch (ipg_nic_rx_check_frame_type(dev)) { |
| 1354 | case FRAME_WITH_START_WITH_END: | 1354 | case FRAME_WITH_START_WITH_END: |
| 1355 | ipg_nic_rx_with_start_and_end(dev, tp, rxfd, entry); | 1355 | ipg_nic_rx_with_start_and_end(dev, sp, rxfd, entry); |
| 1356 | break; | 1356 | break; |
| 1357 | case FRAME_WITH_START: | 1357 | case FRAME_WITH_START: |
| 1358 | ipg_nic_rx_with_start(dev, tp, rxfd, entry); | 1358 | ipg_nic_rx_with_start(dev, sp, rxfd, entry); |
| 1359 | break; | 1359 | break; |
| 1360 | case FRAME_WITH_END: | 1360 | case FRAME_WITH_END: |
| 1361 | ipg_nic_rx_with_end(dev, tp, rxfd, entry); | 1361 | ipg_nic_rx_with_end(dev, sp, rxfd, entry); |
| 1362 | break; | 1362 | break; |
| 1363 | case FRAME_NO_START_NO_END: | 1363 | case FRAME_NO_START_NO_END: |
| 1364 | ipg_nic_rx_no_start_no_end(dev, tp, rxfd, entry); | 1364 | ipg_nic_rx_no_start_no_end(dev, sp, rxfd, entry); |
| 1365 | break; | 1365 | break; |
| 1366 | } | 1366 | } |
| 1367 | } | 1367 | } |
| @@ -1808,7 +1808,7 @@ static int ipg_nic_open(struct net_device *dev) | |||
| 1808 | /* initialize JUMBO Frame control variable */ | 1808 | /* initialize JUMBO Frame control variable */ |
| 1809 | sp->jumbo.found_start = 0; | 1809 | sp->jumbo.found_start = 0; |
| 1810 | sp->jumbo.current_size = 0; | 1810 | sp->jumbo.current_size = 0; |
| 1811 | sp->jumbo.skb = 0; | 1811 | sp->jumbo.skb = NULL; |
| 1812 | dev->mtu = IPG_TXFRAG_SIZE; | 1812 | dev->mtu = IPG_TXFRAG_SIZE; |
| 1813 | #endif | 1813 | #endif |
| 1814 | 1814 | ||
diff --git a/drivers/net/irda/nsc-ircc.c b/drivers/net/irda/nsc-ircc.c index a7714da7c283..effc1ce8179a 100644 --- a/drivers/net/irda/nsc-ircc.c +++ b/drivers/net/irda/nsc-ircc.c | |||
| @@ -152,6 +152,7 @@ static chipio_t pnp_info; | |||
| 152 | static const struct pnp_device_id nsc_ircc_pnp_table[] = { | 152 | static const struct pnp_device_id nsc_ircc_pnp_table[] = { |
| 153 | { .id = "NSC6001", .driver_data = 0 }, | 153 | { .id = "NSC6001", .driver_data = 0 }, |
| 154 | { .id = "IBM0071", .driver_data = 0 }, | 154 | { .id = "IBM0071", .driver_data = 0 }, |
| 155 | { .id = "HWPC224", .driver_data = 0 }, | ||
| 155 | { } | 156 | { } |
| 156 | }; | 157 | }; |
| 157 | 158 | ||
diff --git a/drivers/net/irda/via-ircc.c b/drivers/net/irda/via-ircc.c index 58e128784585..04ad3573b159 100644 --- a/drivers/net/irda/via-ircc.c +++ b/drivers/net/irda/via-ircc.c | |||
| @@ -1546,6 +1546,7 @@ static int via_ircc_net_open(struct net_device *dev) | |||
| 1546 | IRDA_WARNING("%s, unable to allocate dma2=%d\n", | 1546 | IRDA_WARNING("%s, unable to allocate dma2=%d\n", |
| 1547 | driver_name, self->io.dma2); | 1547 | driver_name, self->io.dma2); |
| 1548 | free_irq(self->io.irq, self); | 1548 | free_irq(self->io.irq, self); |
| 1549 | free_dma(self->io.dma); | ||
| 1549 | return -EAGAIN; | 1550 | return -EAGAIN; |
| 1550 | } | 1551 | } |
| 1551 | } | 1552 | } |
| @@ -1606,6 +1607,8 @@ static int via_ircc_net_close(struct net_device *dev) | |||
| 1606 | EnAllInt(iobase, OFF); | 1607 | EnAllInt(iobase, OFF); |
| 1607 | free_irq(self->io.irq, dev); | 1608 | free_irq(self->io.irq, dev); |
| 1608 | free_dma(self->io.dma); | 1609 | free_dma(self->io.dma); |
| 1610 | if (self->io.dma2 != self->io.dma) | ||
| 1611 | free_dma(self->io.dma2); | ||
| 1609 | 1612 | ||
| 1610 | return 0; | 1613 | return 0; |
| 1611 | } | 1614 | } |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 7b859220c255..8f0460901153 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -1969,7 +1969,8 @@ void ixgbe_down(struct ixgbe_adapter *adapter) | |||
| 1969 | netif_carrier_off(netdev); | 1969 | netif_carrier_off(netdev); |
| 1970 | netif_stop_queue(netdev); | 1970 | netif_stop_queue(netdev); |
| 1971 | 1971 | ||
| 1972 | ixgbe_reset(adapter); | 1972 | if (!pci_channel_offline(adapter->pdev)) |
| 1973 | ixgbe_reset(adapter); | ||
| 1973 | ixgbe_clean_all_tx_rings(adapter); | 1974 | ixgbe_clean_all_tx_rings(adapter); |
| 1974 | ixgbe_clean_all_rx_rings(adapter); | 1975 | ixgbe_clean_all_rx_rings(adapter); |
| 1975 | 1976 | ||
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 6797ed069f1f..63cd67b931e7 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
| @@ -71,14 +71,18 @@ static irqreturn_t netxen_intr(int irq, void *data); | |||
| 71 | static irqreturn_t netxen_msi_intr(int irq, void *data); | 71 | static irqreturn_t netxen_msi_intr(int irq, void *data); |
| 72 | 72 | ||
| 73 | /* PCI Device ID Table */ | 73 | /* PCI Device ID Table */ |
| 74 | #define ENTRY(device) \ | ||
| 75 | {PCI_DEVICE(0x4040, (device)), \ | ||
| 76 | .class = PCI_CLASS_NETWORK_ETHERNET << 8, .class_mask = ~0} | ||
| 77 | |||
| 74 | static struct pci_device_id netxen_pci_tbl[] __devinitdata = { | 78 | static struct pci_device_id netxen_pci_tbl[] __devinitdata = { |
| 75 | {PCI_DEVICE(0x4040, 0x0001), PCI_DEVICE_CLASS(0x020000, ~0)}, | 79 | ENTRY(0x0001), |
| 76 | {PCI_DEVICE(0x4040, 0x0002), PCI_DEVICE_CLASS(0x020000, ~0)}, | 80 | ENTRY(0x0002), |
| 77 | {PCI_DEVICE(0x4040, 0x0003), PCI_DEVICE_CLASS(0x020000, ~0)}, | 81 | ENTRY(0x0003), |
| 78 | {PCI_DEVICE(0x4040, 0x0004), PCI_DEVICE_CLASS(0x020000, ~0)}, | 82 | ENTRY(0x0004), |
| 79 | {PCI_DEVICE(0x4040, 0x0005), PCI_DEVICE_CLASS(0x020000, ~0)}, | 83 | ENTRY(0x0005), |
| 80 | {PCI_DEVICE(0x4040, 0x0024), PCI_DEVICE_CLASS(0x020000, ~0)}, | 84 | ENTRY(0x0024), |
| 81 | {PCI_DEVICE(0x4040, 0x0025), PCI_DEVICE_CLASS(0x020000, ~0)}, | 85 | ENTRY(0x0025), |
| 82 | {0,} | 86 | {0,} |
| 83 | }; | 87 | }; |
| 84 | 88 | ||
diff --git a/drivers/net/pasemi_mac.c b/drivers/net/pasemi_mac.c index 3b2a6c598088..993d87c9296f 100644 --- a/drivers/net/pasemi_mac.c +++ b/drivers/net/pasemi_mac.c | |||
| @@ -277,7 +277,7 @@ static int get_skb_hdr(struct sk_buff *skb, void **iphdr, | |||
| 277 | *tcph = tcp_hdr(skb); | 277 | *tcph = tcp_hdr(skb); |
| 278 | 278 | ||
| 279 | /* check if ip header and tcp header are complete */ | 279 | /* check if ip header and tcp header are complete */ |
| 280 | if (iph->tot_len < ip_len + tcp_hdrlen(skb)) | 280 | if (ntohs(iph->tot_len) < ip_len + tcp_hdrlen(skb)) |
| 281 | return -1; | 281 | return -1; |
| 282 | 282 | ||
| 283 | *hdr_flags = LRO_IPV4 | LRO_TCP; | 283 | *hdr_flags = LRO_IPV4 | LRO_TCP; |
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c index ce95c5d168fe..70d012e90dcf 100644 --- a/drivers/net/pcmcia/axnet_cs.c +++ b/drivers/net/pcmcia/axnet_cs.c | |||
| @@ -525,12 +525,14 @@ static int axnet_open(struct net_device *dev) | |||
| 525 | int ret; | 525 | int ret; |
| 526 | axnet_dev_t *info = PRIV(dev); | 526 | axnet_dev_t *info = PRIV(dev); |
| 527 | struct pcmcia_device *link = info->p_dev; | 527 | struct pcmcia_device *link = info->p_dev; |
| 528 | unsigned int nic_base = dev->base_addr; | ||
| 528 | 529 | ||
| 529 | DEBUG(2, "axnet_open('%s')\n", dev->name); | 530 | DEBUG(2, "axnet_open('%s')\n", dev->name); |
| 530 | 531 | ||
| 531 | if (!pcmcia_dev_present(link)) | 532 | if (!pcmcia_dev_present(link)) |
| 532 | return -ENODEV; | 533 | return -ENODEV; |
| 533 | 534 | ||
| 535 | outb_p(0xFF, nic_base + EN0_ISR); /* Clear bogus intr. */ | ||
| 534 | ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, "axnet_cs", dev); | 536 | ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, "axnet_cs", dev); |
| 535 | if (ret) | 537 | if (ret) |
| 536 | return ret; | 538 | return ret; |
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index fd8158a86f64..2d4c4ad89b8d 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
| @@ -969,6 +969,7 @@ static int pcnet_open(struct net_device *dev) | |||
| 969 | int ret; | 969 | int ret; |
| 970 | pcnet_dev_t *info = PRIV(dev); | 970 | pcnet_dev_t *info = PRIV(dev); |
| 971 | struct pcmcia_device *link = info->p_dev; | 971 | struct pcmcia_device *link = info->p_dev; |
| 972 | unsigned int nic_base = dev->base_addr; | ||
| 972 | 973 | ||
| 973 | DEBUG(2, "pcnet_open('%s')\n", dev->name); | 974 | DEBUG(2, "pcnet_open('%s')\n", dev->name); |
| 974 | 975 | ||
| @@ -976,6 +977,8 @@ static int pcnet_open(struct net_device *dev) | |||
| 976 | return -ENODEV; | 977 | return -ENODEV; |
| 977 | 978 | ||
| 978 | set_misc_reg(dev); | 979 | set_misc_reg(dev); |
| 980 | |||
| 981 | outb_p(0xFF, nic_base + EN0_ISR); /* Clear bogus intr. */ | ||
| 979 | ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev_info, dev); | 982 | ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev_info, dev); |
| 980 | if (ret) | 983 | if (ret) |
| 981 | return ret; | 984 | return ret; |
diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c index b7f7b2227d56..bccee68bd48a 100644 --- a/drivers/net/qla3xxx.c +++ b/drivers/net/qla3xxx.c | |||
| @@ -3701,7 +3701,9 @@ static int ql_cycle_adapter(struct ql3_adapter *qdev, int reset) | |||
| 3701 | printk(KERN_ERR PFX | 3701 | printk(KERN_ERR PFX |
| 3702 | "%s: Driver up/down cycle failed, " | 3702 | "%s: Driver up/down cycle failed, " |
| 3703 | "closing device\n",qdev->ndev->name); | 3703 | "closing device\n",qdev->ndev->name); |
| 3704 | rtnl_lock(); | ||
| 3704 | dev_close(qdev->ndev); | 3705 | dev_close(qdev->ndev); |
| 3706 | rtnl_unlock(); | ||
| 3705 | return -1; | 3707 | return -1; |
| 3706 | } | 3708 | } |
| 3707 | return 0; | 3709 | return 0; |
diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c index 858b191517b3..504a48ff73c8 100644 --- a/drivers/net/r6040.c +++ b/drivers/net/r6040.c | |||
| @@ -273,7 +273,7 @@ static void r6040_init_ring_desc(struct r6040_descriptor *desc_ring, | |||
| 273 | dma_addr_t mapping = desc_dma; | 273 | dma_addr_t mapping = desc_dma; |
| 274 | 274 | ||
| 275 | while (size-- > 0) { | 275 | while (size-- > 0) { |
| 276 | mapping += sizeof(sizeof(*desc)); | 276 | mapping += sizeof(*desc); |
| 277 | desc->ndesc = cpu_to_le32(mapping); | 277 | desc->ndesc = cpu_to_le32(mapping); |
| 278 | desc->vndescp = desc + 1; | 278 | desc->vndescp = desc + 1; |
| 279 | desc++; | 279 | desc++; |
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index b5c1e663417d..ae7b697456b4 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
| @@ -2625,9 +2625,7 @@ static int fill_rx_buffers(struct ring_info *ring) | |||
| 2625 | rxdp1->Buffer0_ptr = pci_map_single | 2625 | rxdp1->Buffer0_ptr = pci_map_single |
| 2626 | (ring->pdev, skb->data, size - NET_IP_ALIGN, | 2626 | (ring->pdev, skb->data, size - NET_IP_ALIGN, |
| 2627 | PCI_DMA_FROMDEVICE); | 2627 | PCI_DMA_FROMDEVICE); |
| 2628 | if( (rxdp1->Buffer0_ptr == 0) || | 2628 | if(pci_dma_mapping_error(rxdp1->Buffer0_ptr)) |
| 2629 | (rxdp1->Buffer0_ptr == | ||
| 2630 | DMA_ERROR_CODE)) | ||
| 2631 | goto pci_map_failed; | 2629 | goto pci_map_failed; |
| 2632 | 2630 | ||
| 2633 | rxdp->Control_2 = | 2631 | rxdp->Control_2 = |
| @@ -2657,6 +2655,7 @@ static int fill_rx_buffers(struct ring_info *ring) | |||
| 2657 | skb->data = (void *) (unsigned long)tmp; | 2655 | skb->data = (void *) (unsigned long)tmp; |
| 2658 | skb_reset_tail_pointer(skb); | 2656 | skb_reset_tail_pointer(skb); |
| 2659 | 2657 | ||
| 2658 | /* AK: check is wrong. 0 can be valid dma address */ | ||
| 2660 | if (!(rxdp3->Buffer0_ptr)) | 2659 | if (!(rxdp3->Buffer0_ptr)) |
| 2661 | rxdp3->Buffer0_ptr = | 2660 | rxdp3->Buffer0_ptr = |
| 2662 | pci_map_single(ring->pdev, ba->ba_0, | 2661 | pci_map_single(ring->pdev, ba->ba_0, |
| @@ -2665,8 +2664,7 @@ static int fill_rx_buffers(struct ring_info *ring) | |||
| 2665 | pci_dma_sync_single_for_device(ring->pdev, | 2664 | pci_dma_sync_single_for_device(ring->pdev, |
| 2666 | (dma_addr_t) rxdp3->Buffer0_ptr, | 2665 | (dma_addr_t) rxdp3->Buffer0_ptr, |
| 2667 | BUF0_LEN, PCI_DMA_FROMDEVICE); | 2666 | BUF0_LEN, PCI_DMA_FROMDEVICE); |
| 2668 | if( (rxdp3->Buffer0_ptr == 0) || | 2667 | if (pci_dma_mapping_error(rxdp3->Buffer0_ptr)) |
| 2669 | (rxdp3->Buffer0_ptr == DMA_ERROR_CODE)) | ||
| 2670 | goto pci_map_failed; | 2668 | goto pci_map_failed; |
| 2671 | 2669 | ||
| 2672 | rxdp->Control_2 = SET_BUFFER0_SIZE_3(BUF0_LEN); | 2670 | rxdp->Control_2 = SET_BUFFER0_SIZE_3(BUF0_LEN); |
| @@ -2681,18 +2679,17 @@ static int fill_rx_buffers(struct ring_info *ring) | |||
| 2681 | (ring->pdev, skb->data, ring->mtu + 4, | 2679 | (ring->pdev, skb->data, ring->mtu + 4, |
| 2682 | PCI_DMA_FROMDEVICE); | 2680 | PCI_DMA_FROMDEVICE); |
| 2683 | 2681 | ||
| 2684 | if( (rxdp3->Buffer2_ptr == 0) || | 2682 | if (pci_dma_mapping_error(rxdp3->Buffer2_ptr)) |
| 2685 | (rxdp3->Buffer2_ptr == DMA_ERROR_CODE)) | ||
| 2686 | goto pci_map_failed; | 2683 | goto pci_map_failed; |
| 2687 | 2684 | ||
| 2685 | /* AK: check is wrong */ | ||
| 2688 | if (!rxdp3->Buffer1_ptr) | 2686 | if (!rxdp3->Buffer1_ptr) |
| 2689 | rxdp3->Buffer1_ptr = | 2687 | rxdp3->Buffer1_ptr = |
| 2690 | pci_map_single(ring->pdev, | 2688 | pci_map_single(ring->pdev, |
| 2691 | ba->ba_1, BUF1_LEN, | 2689 | ba->ba_1, BUF1_LEN, |
| 2692 | PCI_DMA_FROMDEVICE); | 2690 | PCI_DMA_FROMDEVICE); |
| 2693 | 2691 | ||
| 2694 | if( (rxdp3->Buffer1_ptr == 0) || | 2692 | if (pci_dma_mapping_error(rxdp3->Buffer1_ptr)) { |
| 2695 | (rxdp3->Buffer1_ptr == DMA_ERROR_CODE)) { | ||
| 2696 | pci_unmap_single | 2693 | pci_unmap_single |
| 2697 | (ring->pdev, | 2694 | (ring->pdev, |
| 2698 | (dma_addr_t)(unsigned long) | 2695 | (dma_addr_t)(unsigned long) |
| @@ -4264,16 +4261,14 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 4264 | txdp->Buffer_Pointer = pci_map_single(sp->pdev, | 4261 | txdp->Buffer_Pointer = pci_map_single(sp->pdev, |
| 4265 | fifo->ufo_in_band_v, | 4262 | fifo->ufo_in_band_v, |
| 4266 | sizeof(u64), PCI_DMA_TODEVICE); | 4263 | sizeof(u64), PCI_DMA_TODEVICE); |
| 4267 | if((txdp->Buffer_Pointer == 0) || | 4264 | if (pci_dma_mapping_error(txdp->Buffer_Pointer)) |
| 4268 | (txdp->Buffer_Pointer == DMA_ERROR_CODE)) | ||
| 4269 | goto pci_map_failed; | 4265 | goto pci_map_failed; |
| 4270 | txdp++; | 4266 | txdp++; |
| 4271 | } | 4267 | } |
| 4272 | 4268 | ||
| 4273 | txdp->Buffer_Pointer = pci_map_single | 4269 | txdp->Buffer_Pointer = pci_map_single |
| 4274 | (sp->pdev, skb->data, frg_len, PCI_DMA_TODEVICE); | 4270 | (sp->pdev, skb->data, frg_len, PCI_DMA_TODEVICE); |
| 4275 | if((txdp->Buffer_Pointer == 0) || | 4271 | if (pci_dma_mapping_error(txdp->Buffer_Pointer)) |
| 4276 | (txdp->Buffer_Pointer == DMA_ERROR_CODE)) | ||
| 4277 | goto pci_map_failed; | 4272 | goto pci_map_failed; |
| 4278 | 4273 | ||
| 4279 | txdp->Host_Control = (unsigned long) skb; | 4274 | txdp->Host_Control = (unsigned long) skb; |
| @@ -6884,10 +6879,8 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp, | |||
| 6884 | pci_map_single( sp->pdev, (*skb)->data, | 6879 | pci_map_single( sp->pdev, (*skb)->data, |
| 6885 | size - NET_IP_ALIGN, | 6880 | size - NET_IP_ALIGN, |
| 6886 | PCI_DMA_FROMDEVICE); | 6881 | PCI_DMA_FROMDEVICE); |
| 6887 | if( (rxdp1->Buffer0_ptr == 0) || | 6882 | if (pci_dma_mapping_error(rxdp1->Buffer0_ptr)) |
| 6888 | (rxdp1->Buffer0_ptr == DMA_ERROR_CODE)) { | ||
| 6889 | goto memalloc_failed; | 6883 | goto memalloc_failed; |
| 6890 | } | ||
| 6891 | rxdp->Host_Control = (unsigned long) (*skb); | 6884 | rxdp->Host_Control = (unsigned long) (*skb); |
| 6892 | } | 6885 | } |
| 6893 | } else if ((sp->rxd_mode == RXD_MODE_3B) && (rxdp->Host_Control == 0)) { | 6886 | } else if ((sp->rxd_mode == RXD_MODE_3B) && (rxdp->Host_Control == 0)) { |
| @@ -6913,15 +6906,12 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp, | |||
| 6913 | pci_map_single(sp->pdev, (*skb)->data, | 6906 | pci_map_single(sp->pdev, (*skb)->data, |
| 6914 | dev->mtu + 4, | 6907 | dev->mtu + 4, |
| 6915 | PCI_DMA_FROMDEVICE); | 6908 | PCI_DMA_FROMDEVICE); |
| 6916 | if( (rxdp3->Buffer2_ptr == 0) || | 6909 | if (pci_dma_mapping_error(rxdp3->Buffer2_ptr)) |
| 6917 | (rxdp3->Buffer2_ptr == DMA_ERROR_CODE)) { | ||
| 6918 | goto memalloc_failed; | 6910 | goto memalloc_failed; |
| 6919 | } | ||
| 6920 | rxdp3->Buffer0_ptr = *temp0 = | 6911 | rxdp3->Buffer0_ptr = *temp0 = |
| 6921 | pci_map_single( sp->pdev, ba->ba_0, BUF0_LEN, | 6912 | pci_map_single( sp->pdev, ba->ba_0, BUF0_LEN, |
| 6922 | PCI_DMA_FROMDEVICE); | 6913 | PCI_DMA_FROMDEVICE); |
| 6923 | if( (rxdp3->Buffer0_ptr == 0) || | 6914 | if (pci_dma_mapping_error(rxdp3->Buffer0_ptr)) { |
| 6924 | (rxdp3->Buffer0_ptr == DMA_ERROR_CODE)) { | ||
| 6925 | pci_unmap_single (sp->pdev, | 6915 | pci_unmap_single (sp->pdev, |
| 6926 | (dma_addr_t)rxdp3->Buffer2_ptr, | 6916 | (dma_addr_t)rxdp3->Buffer2_ptr, |
| 6927 | dev->mtu + 4, PCI_DMA_FROMDEVICE); | 6917 | dev->mtu + 4, PCI_DMA_FROMDEVICE); |
| @@ -6933,8 +6923,7 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp, | |||
| 6933 | rxdp3->Buffer1_ptr = *temp1 = | 6923 | rxdp3->Buffer1_ptr = *temp1 = |
| 6934 | pci_map_single(sp->pdev, ba->ba_1, BUF1_LEN, | 6924 | pci_map_single(sp->pdev, ba->ba_1, BUF1_LEN, |
| 6935 | PCI_DMA_FROMDEVICE); | 6925 | PCI_DMA_FROMDEVICE); |
| 6936 | if( (rxdp3->Buffer1_ptr == 0) || | 6926 | if (pci_dma_mapping_error(rxdp3->Buffer1_ptr)) { |
| 6937 | (rxdp3->Buffer1_ptr == DMA_ERROR_CODE)) { | ||
| 6938 | pci_unmap_single (sp->pdev, | 6927 | pci_unmap_single (sp->pdev, |
| 6939 | (dma_addr_t)rxdp3->Buffer0_ptr, | 6928 | (dma_addr_t)rxdp3->Buffer0_ptr, |
| 6940 | BUF0_LEN, PCI_DMA_FROMDEVICE); | 6929 | BUF0_LEN, PCI_DMA_FROMDEVICE); |
diff --git a/drivers/net/s2io.h b/drivers/net/s2io.h index 4706f7f9acb6..1827b6686c98 100644 --- a/drivers/net/s2io.h +++ b/drivers/net/s2io.h | |||
| @@ -75,10 +75,6 @@ static int debug_level = ERR_DBG; | |||
| 75 | /* DEBUG message print. */ | 75 | /* DEBUG message print. */ |
| 76 | #define DBG_PRINT(dbg_level, args...) if(!(debug_level<dbg_level)) printk(args) | 76 | #define DBG_PRINT(dbg_level, args...) if(!(debug_level<dbg_level)) printk(args) |
| 77 | 77 | ||
| 78 | #ifndef DMA_ERROR_CODE | ||
| 79 | #define DMA_ERROR_CODE (~(dma_addr_t)0x0) | ||
| 80 | #endif | ||
| 81 | |||
| 82 | /* Protocol assist features of the NIC */ | 78 | /* Protocol assist features of the NIC */ |
| 83 | #define L3_CKSUM_OK 0xFFFF | 79 | #define L3_CKSUM_OK 0xFFFF |
| 84 | #define L4_CKSUM_OK 0xFFFF | 80 | #define L4_CKSUM_OK 0xFFFF |
diff --git a/drivers/net/tc35815.c b/drivers/net/tc35815.c index 10e4e85da3fc..b07b8cbadeaf 100644 --- a/drivers/net/tc35815.c +++ b/drivers/net/tc35815.c | |||
| @@ -1394,6 +1394,7 @@ tc35815_open(struct net_device *dev) | |||
| 1394 | tc35815_chip_init(dev); | 1394 | tc35815_chip_init(dev); |
| 1395 | spin_unlock_irq(&lp->lock); | 1395 | spin_unlock_irq(&lp->lock); |
| 1396 | 1396 | ||
| 1397 | netif_carrier_off(dev); | ||
| 1397 | /* schedule a link state check */ | 1398 | /* schedule a link state check */ |
| 1398 | phy_start(lp->phy_dev); | 1399 | phy_start(lp->phy_dev); |
| 1399 | 1400 | ||
| @@ -1735,7 +1736,6 @@ tc35815_rx(struct net_device *dev) | |||
| 1735 | skb = lp->rx_skbs[cur_bd].skb; | 1736 | skb = lp->rx_skbs[cur_bd].skb; |
| 1736 | prefetch(skb->data); | 1737 | prefetch(skb->data); |
| 1737 | lp->rx_skbs[cur_bd].skb = NULL; | 1738 | lp->rx_skbs[cur_bd].skb = NULL; |
| 1738 | lp->fbl_count--; | ||
| 1739 | pci_unmap_single(lp->pci_dev, | 1739 | pci_unmap_single(lp->pci_dev, |
| 1740 | lp->rx_skbs[cur_bd].skb_dma, | 1740 | lp->rx_skbs[cur_bd].skb_dma, |
| 1741 | RX_BUF_SIZE, PCI_DMA_FROMDEVICE); | 1741 | RX_BUF_SIZE, PCI_DMA_FROMDEVICE); |
| @@ -1791,6 +1791,7 @@ tc35815_rx(struct net_device *dev) | |||
| 1791 | #ifdef TC35815_USE_PACKEDBUFFER | 1791 | #ifdef TC35815_USE_PACKEDBUFFER |
| 1792 | while (lp->fbl_curid != id) | 1792 | while (lp->fbl_curid != id) |
| 1793 | #else | 1793 | #else |
| 1794 | lp->fbl_count--; | ||
| 1794 | while (lp->fbl_count < RX_BUF_NUM) | 1795 | while (lp->fbl_count < RX_BUF_NUM) |
| 1795 | #endif | 1796 | #endif |
| 1796 | { | 1797 | { |
| @@ -2453,6 +2454,7 @@ static int tc35815_resume(struct pci_dev *pdev) | |||
| 2453 | return 0; | 2454 | return 0; |
| 2454 | pci_set_power_state(pdev, PCI_D0); | 2455 | pci_set_power_state(pdev, PCI_D0); |
| 2455 | tc35815_restart(dev); | 2456 | tc35815_restart(dev); |
| 2457 | netif_carrier_off(dev); | ||
| 2456 | if (lp->phy_dev) | 2458 | if (lp->phy_dev) |
| 2457 | phy_start(lp->phy_dev); | 2459 | phy_start(lp->phy_dev); |
| 2458 | netif_device_attach(dev); | 2460 | netif_device_attach(dev); |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 7ab94c825b57..b9018bfa0a97 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
| @@ -602,6 +602,12 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | |||
| 602 | tun->attached = 1; | 602 | tun->attached = 1; |
| 603 | get_net(dev_net(tun->dev)); | 603 | get_net(dev_net(tun->dev)); |
| 604 | 604 | ||
| 605 | /* Make sure persistent devices do not get stuck in | ||
| 606 | * xoff state. | ||
| 607 | */ | ||
| 608 | if (netif_running(tun->dev)) | ||
| 609 | netif_wake_queue(tun->dev); | ||
| 610 | |||
| 605 | strcpy(ifr->ifr_name, tun->dev->name); | 611 | strcpy(ifr->ifr_name, tun->dev->name); |
| 606 | return 0; | 612 | return 0; |
| 607 | 613 | ||
diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c index 520bb0b1a9a2..6d35155c7145 100644 --- a/drivers/net/wan/hdlc_fr.c +++ b/drivers/net/wan/hdlc_fr.c | |||
| @@ -1008,6 +1008,7 @@ static int fr_rx(struct sk_buff *skb) | |||
| 1008 | stats->rx_bytes += skb->len; | 1008 | stats->rx_bytes += skb->len; |
| 1009 | if (pvc->state.becn) | 1009 | if (pvc->state.becn) |
| 1010 | stats->rx_compressed++; | 1010 | stats->rx_compressed++; |
| 1011 | skb->dev = dev; | ||
| 1011 | netif_rx(skb); | 1012 | netif_rx(skb); |
| 1012 | return NET_RX_SUCCESS; | 1013 | return NET_RX_SUCCESS; |
| 1013 | } else { | 1014 | } else { |
diff --git a/drivers/net/wan/x25_asy.c b/drivers/net/wan/x25_asy.c index 249e18053d5f..069f8bb0a99f 100644 --- a/drivers/net/wan/x25_asy.c +++ b/drivers/net/wan/x25_asy.c | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #include <linux/x25.h> | 32 | #include <linux/x25.h> |
| 33 | #include <linux/lapb.h> | 33 | #include <linux/lapb.h> |
| 34 | #include <linux/init.h> | 34 | #include <linux/init.h> |
| 35 | #include <linux/rtnetlink.h> | ||
| 35 | #include "x25_asy.h" | 36 | #include "x25_asy.h" |
| 36 | 37 | ||
| 37 | #include <net/x25device.h> | 38 | #include <net/x25device.h> |
| @@ -601,8 +602,10 @@ static void x25_asy_close_tty(struct tty_struct *tty) | |||
| 601 | if (!sl || sl->magic != X25_ASY_MAGIC) | 602 | if (!sl || sl->magic != X25_ASY_MAGIC) |
| 602 | return; | 603 | return; |
| 603 | 604 | ||
| 605 | rtnl_lock(); | ||
| 604 | if (sl->dev->flags & IFF_UP) | 606 | if (sl->dev->flags & IFF_UP) |
| 605 | dev_close(sl->dev); | 607 | dev_close(sl->dev); |
| 608 | rtnl_unlock(); | ||
| 606 | 609 | ||
| 607 | tty->disc_data = NULL; | 610 | tty->disc_data = NULL; |
| 608 | sl->tty = NULL; | 611 | sl->tty = NULL; |
diff --git a/drivers/net/wireless/b43/leds.c b/drivers/net/wireless/b43/leds.c index 36a9c42df835..76f4c7bad8b8 100644 --- a/drivers/net/wireless/b43/leds.c +++ b/drivers/net/wireless/b43/leds.c | |||
| @@ -72,6 +72,9 @@ static void b43_led_brightness_set(struct led_classdev *led_dev, | |||
| 72 | struct b43_wldev *dev = led->dev; | 72 | struct b43_wldev *dev = led->dev; |
| 73 | bool radio_enabled; | 73 | bool radio_enabled; |
| 74 | 74 | ||
| 75 | if (unlikely(b43_status(dev) < B43_STAT_INITIALIZED)) | ||
| 76 | return; | ||
| 77 | |||
| 75 | /* Checking the radio-enabled status here is slightly racy, | 78 | /* Checking the radio-enabled status here is slightly racy, |
| 76 | * but we want to avoid the locking overhead and we don't care | 79 | * but we want to avoid the locking overhead and we don't care |
| 77 | * whether the LED has the wrong state for a second. */ | 80 | * whether the LED has the wrong state for a second. */ |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index fa4b0d8b74a2..a70827793086 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
| @@ -2883,12 +2883,11 @@ static int b43_op_tx(struct ieee80211_hw *hw, | |||
| 2883 | 2883 | ||
| 2884 | if (unlikely(skb->len < 2 + 2 + 6)) { | 2884 | if (unlikely(skb->len < 2 + 2 + 6)) { |
| 2885 | /* Too short, this can't be a valid frame. */ | 2885 | /* Too short, this can't be a valid frame. */ |
| 2886 | dev_kfree_skb_any(skb); | 2886 | goto drop_packet; |
| 2887 | return NETDEV_TX_OK; | ||
| 2888 | } | 2887 | } |
| 2889 | B43_WARN_ON(skb_shinfo(skb)->nr_frags); | 2888 | B43_WARN_ON(skb_shinfo(skb)->nr_frags); |
| 2890 | if (unlikely(!dev)) | 2889 | if (unlikely(!dev)) |
| 2891 | return NETDEV_TX_BUSY; | 2890 | goto drop_packet; |
| 2892 | 2891 | ||
| 2893 | /* Transmissions on seperate queues can run concurrently. */ | 2892 | /* Transmissions on seperate queues can run concurrently. */ |
| 2894 | read_lock_irqsave(&wl->tx_lock, flags); | 2893 | read_lock_irqsave(&wl->tx_lock, flags); |
| @@ -2904,7 +2903,12 @@ static int b43_op_tx(struct ieee80211_hw *hw, | |||
| 2904 | read_unlock_irqrestore(&wl->tx_lock, flags); | 2903 | read_unlock_irqrestore(&wl->tx_lock, flags); |
| 2905 | 2904 | ||
| 2906 | if (unlikely(err)) | 2905 | if (unlikely(err)) |
| 2907 | return NETDEV_TX_BUSY; | 2906 | goto drop_packet; |
| 2907 | return NETDEV_TX_OK; | ||
| 2908 | |||
| 2909 | drop_packet: | ||
| 2910 | /* We can not transmit this packet. Drop it. */ | ||
| 2911 | dev_kfree_skb_any(skb); | ||
| 2908 | return NETDEV_TX_OK; | 2912 | return NETDEV_TX_OK; |
| 2909 | } | 2913 | } |
| 2910 | 2914 | ||
diff --git a/drivers/net/wireless/b43legacy/dma.c b/drivers/net/wireless/b43legacy/dma.c index c990f87b107a..93ddc1cbcc8b 100644 --- a/drivers/net/wireless/b43legacy/dma.c +++ b/drivers/net/wireless/b43legacy/dma.c | |||
| @@ -876,6 +876,7 @@ struct b43legacy_dmaring *b43legacy_setup_dmaring(struct b43legacy_wldev *dev, | |||
| 876 | if (!ring) | 876 | if (!ring) |
| 877 | goto out; | 877 | goto out; |
| 878 | ring->type = type; | 878 | ring->type = type; |
| 879 | ring->dev = dev; | ||
| 879 | 880 | ||
| 880 | nr_slots = B43legacy_RXRING_SLOTS; | 881 | nr_slots = B43legacy_RXRING_SLOTS; |
| 881 | if (for_tx) | 882 | if (for_tx) |
| @@ -922,7 +923,6 @@ struct b43legacy_dmaring *b43legacy_setup_dmaring(struct b43legacy_wldev *dev, | |||
| 922 | DMA_TO_DEVICE); | 923 | DMA_TO_DEVICE); |
| 923 | } | 924 | } |
| 924 | 925 | ||
| 925 | ring->dev = dev; | ||
| 926 | ring->nr_slots = nr_slots; | 926 | ring->nr_slots = nr_slots; |
| 927 | ring->mmio_base = b43legacy_dmacontroller_base(type, controller_index); | 927 | ring->mmio_base = b43legacy_dmacontroller_base(type, controller_index); |
| 928 | ring->index = controller_index; | 928 | ring->index = controller_index; |
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c index 204077c13870..3e612d0a13e8 100644 --- a/drivers/net/wireless/b43legacy/main.c +++ b/drivers/net/wireless/b43legacy/main.c | |||
| @@ -2378,8 +2378,10 @@ static int b43legacy_op_tx(struct ieee80211_hw *hw, | |||
| 2378 | } else | 2378 | } else |
| 2379 | err = b43legacy_dma_tx(dev, skb, ctl); | 2379 | err = b43legacy_dma_tx(dev, skb, ctl); |
| 2380 | out: | 2380 | out: |
| 2381 | if (unlikely(err)) | 2381 | if (unlikely(err)) { |
| 2382 | return NETDEV_TX_BUSY; | 2382 | /* Drop the packet. */ |
| 2383 | dev_kfree_skb_any(skb); | ||
| 2384 | } | ||
| 2383 | return NETDEV_TX_OK; | 2385 | return NETDEV_TX_OK; |
| 2384 | } | 2386 | } |
| 2385 | 2387 | ||
diff --git a/drivers/net/wireless/hostap/hostap_80211_rx.c b/drivers/net/wireless/hostap/hostap_80211_rx.c index 4fd73809602e..020f450e9dba 100644 --- a/drivers/net/wireless/hostap/hostap_80211_rx.c +++ b/drivers/net/wireless/hostap/hostap_80211_rx.c | |||
| @@ -64,7 +64,7 @@ int prism2_rx_80211(struct net_device *dev, struct sk_buff *skb, | |||
| 64 | int hdrlen, phdrlen, head_need, tail_need; | 64 | int hdrlen, phdrlen, head_need, tail_need; |
| 65 | u16 fc; | 65 | u16 fc; |
| 66 | int prism_header, ret; | 66 | int prism_header, ret; |
| 67 | struct ieee80211_hdr_4addr *hdr; | 67 | struct ieee80211_hdr_4addr *fhdr; |
| 68 | 68 | ||
| 69 | iface = netdev_priv(dev); | 69 | iface = netdev_priv(dev); |
| 70 | local = iface->local; | 70 | local = iface->local; |
| @@ -83,8 +83,8 @@ int prism2_rx_80211(struct net_device *dev, struct sk_buff *skb, | |||
| 83 | phdrlen = 0; | 83 | phdrlen = 0; |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | hdr = (struct ieee80211_hdr_4addr *) skb->data; | 86 | fhdr = (struct ieee80211_hdr_4addr *) skb->data; |
| 87 | fc = le16_to_cpu(hdr->frame_ctl); | 87 | fc = le16_to_cpu(fhdr->frame_ctl); |
| 88 | 88 | ||
| 89 | if (type == PRISM2_RX_MGMT && (fc & IEEE80211_FCTL_VERS)) { | 89 | if (type == PRISM2_RX_MGMT && (fc & IEEE80211_FCTL_VERS)) { |
| 90 | printk(KERN_DEBUG "%s: dropped management frame with header " | 90 | printk(KERN_DEBUG "%s: dropped management frame with header " |
| @@ -551,7 +551,7 @@ hostap_rx_frame_wds(local_info_t *local, struct ieee80211_hdr_4addr *hdr, | |||
| 551 | hdr->addr1[2] != 0xff || hdr->addr1[3] != 0xff || | 551 | hdr->addr1[2] != 0xff || hdr->addr1[3] != 0xff || |
| 552 | hdr->addr1[4] != 0xff || hdr->addr1[5] != 0xff)) { | 552 | hdr->addr1[4] != 0xff || hdr->addr1[5] != 0xff)) { |
| 553 | /* RA (or BSSID) is not ours - drop */ | 553 | /* RA (or BSSID) is not ours - drop */ |
| 554 | PDEBUG(DEBUG_EXTRA, "%s: received WDS frame with " | 554 | PDEBUG(DEBUG_EXTRA2, "%s: received WDS frame with " |
| 555 | "not own or broadcast %s=%s\n", | 555 | "not own or broadcast %s=%s\n", |
| 556 | local->dev->name, | 556 | local->dev->name, |
| 557 | fc & IEEE80211_FCTL_FROMDS ? "RA" : "BSSID", | 557 | fc & IEEE80211_FCTL_FROMDS ? "RA" : "BSSID", |
diff --git a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c index 0acd9589c48c..ab981afd481d 100644 --- a/drivers/net/wireless/hostap/hostap_ap.c +++ b/drivers/net/wireless/hostap/hostap_ap.c | |||
| @@ -1930,7 +1930,7 @@ static void handle_pspoll(local_info_t *local, | |||
| 1930 | PDEBUG(DEBUG_PS, " PSPOLL and AID[15:14] not set\n"); | 1930 | PDEBUG(DEBUG_PS, " PSPOLL and AID[15:14] not set\n"); |
| 1931 | return; | 1931 | return; |
| 1932 | } | 1932 | } |
| 1933 | aid &= ~BIT(15) & ~BIT(14); | 1933 | aid &= ~(BIT(15) | BIT(14)); |
| 1934 | if (aid == 0 || aid > MAX_AID_TABLE_SIZE) { | 1934 | if (aid == 0 || aid > MAX_AID_TABLE_SIZE) { |
| 1935 | PDEBUG(DEBUG_PS, " invalid aid=%d\n", aid); | 1935 | PDEBUG(DEBUG_PS, " invalid aid=%d\n", aid); |
| 1936 | return; | 1936 | return; |
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index ed4317a17cbb..3b4e55cf33cd 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
| @@ -533,10 +533,10 @@ static void prism2_detach(struct pcmcia_device *link) | |||
| 533 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | 533 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) |
| 534 | 534 | ||
| 535 | #define CFG_CHECK2(fn, retf) \ | 535 | #define CFG_CHECK2(fn, retf) \ |
| 536 | do { int ret = (retf); \ | 536 | do { int _ret = (retf); \ |
| 537 | if (ret != 0) { \ | 537 | if (_ret != 0) { \ |
| 538 | PDEBUG(DEBUG_EXTRA, "CardServices(" #fn ") returned %d\n", ret); \ | 538 | PDEBUG(DEBUG_EXTRA, "CardServices(" #fn ") returned %d\n", _ret); \ |
| 539 | cs_error(link, fn, ret); \ | 539 | cs_error(link, fn, _ret); \ |
| 540 | goto next_entry; \ | 540 | goto next_entry; \ |
| 541 | } \ | 541 | } \ |
| 542 | } while (0) | 542 | } while (0) |
| @@ -777,8 +777,10 @@ static int hostap_cs_suspend(struct pcmcia_device *link) | |||
| 777 | int dev_open = 0; | 777 | int dev_open = 0; |
| 778 | struct hostap_interface *iface = NULL; | 778 | struct hostap_interface *iface = NULL; |
| 779 | 779 | ||
| 780 | if (dev) | 780 | if (!dev) |
| 781 | iface = netdev_priv(dev); | 781 | return -ENODEV; |
| 782 | |||
| 783 | iface = netdev_priv(dev); | ||
| 782 | 784 | ||
| 783 | PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_PM_SUSPEND\n", dev_info); | 785 | PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_PM_SUSPEND\n", dev_info); |
| 784 | if (iface && iface->local) | 786 | if (iface && iface->local) |
| @@ -798,8 +800,10 @@ static int hostap_cs_resume(struct pcmcia_device *link) | |||
| 798 | int dev_open = 0; | 800 | int dev_open = 0; |
| 799 | struct hostap_interface *iface = NULL; | 801 | struct hostap_interface *iface = NULL; |
| 800 | 802 | ||
| 801 | if (dev) | 803 | if (!dev) |
| 802 | iface = netdev_priv(dev); | 804 | return -ENODEV; |
| 805 | |||
| 806 | iface = netdev_priv(dev); | ||
| 803 | 807 | ||
| 804 | PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_PM_RESUME\n", dev_info); | 808 | PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_PM_RESUME\n", dev_info); |
| 805 | 809 | ||
diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c index cdf90c40f11b..936f52e3d95c 100644 --- a/drivers/net/wireless/hostap/hostap_hw.c +++ b/drivers/net/wireless/hostap/hostap_hw.c | |||
| @@ -2835,7 +2835,7 @@ static void hostap_passive_scan(unsigned long data) | |||
| 2835 | { | 2835 | { |
| 2836 | local_info_t *local = (local_info_t *) data; | 2836 | local_info_t *local = (local_info_t *) data; |
| 2837 | struct net_device *dev = local->dev; | 2837 | struct net_device *dev = local->dev; |
| 2838 | u16 channel; | 2838 | u16 chan; |
| 2839 | 2839 | ||
| 2840 | if (local->passive_scan_interval <= 0) | 2840 | if (local->passive_scan_interval <= 0) |
| 2841 | return; | 2841 | return; |
| @@ -2872,11 +2872,11 @@ static void hostap_passive_scan(unsigned long data) | |||
| 2872 | 2872 | ||
| 2873 | printk(KERN_DEBUG "%s: passive scan channel %d\n", | 2873 | printk(KERN_DEBUG "%s: passive scan channel %d\n", |
| 2874 | dev->name, local->passive_scan_channel); | 2874 | dev->name, local->passive_scan_channel); |
| 2875 | channel = local->passive_scan_channel; | 2875 | chan = local->passive_scan_channel; |
| 2876 | local->passive_scan_state = PASSIVE_SCAN_WAIT; | 2876 | local->passive_scan_state = PASSIVE_SCAN_WAIT; |
| 2877 | local->passive_scan_timer.expires = jiffies + HZ / 10; | 2877 | local->passive_scan_timer.expires = jiffies + HZ / 10; |
| 2878 | } else { | 2878 | } else { |
| 2879 | channel = local->channel; | 2879 | chan = local->channel; |
| 2880 | local->passive_scan_state = PASSIVE_SCAN_LISTEN; | 2880 | local->passive_scan_state = PASSIVE_SCAN_LISTEN; |
| 2881 | local->passive_scan_timer.expires = jiffies + | 2881 | local->passive_scan_timer.expires = jiffies + |
| 2882 | local->passive_scan_interval * HZ; | 2882 | local->passive_scan_interval * HZ; |
| @@ -2884,9 +2884,9 @@ static void hostap_passive_scan(unsigned long data) | |||
| 2884 | 2884 | ||
| 2885 | if (hfa384x_cmd_callback(dev, HFA384X_CMDCODE_TEST | | 2885 | if (hfa384x_cmd_callback(dev, HFA384X_CMDCODE_TEST | |
| 2886 | (HFA384X_TEST_CHANGE_CHANNEL << 8), | 2886 | (HFA384X_TEST_CHANGE_CHANNEL << 8), |
| 2887 | channel, NULL, 0)) | 2887 | chan, NULL, 0)) |
| 2888 | printk(KERN_ERR "%s: passive scan channel set %d " | 2888 | printk(KERN_ERR "%s: passive scan channel set %d " |
| 2889 | "failed\n", dev->name, channel); | 2889 | "failed\n", dev->name, chan); |
| 2890 | 2890 | ||
| 2891 | add_timer(&local->passive_scan_timer); | 2891 | add_timer(&local->passive_scan_timer); |
| 2892 | } | 2892 | } |
diff --git a/drivers/net/wireless/hostap/hostap_main.c b/drivers/net/wireless/hostap/hostap_main.c index f7aec9309d04..a38e85f334df 100644 --- a/drivers/net/wireless/hostap/hostap_main.c +++ b/drivers/net/wireless/hostap/hostap_main.c | |||
| @@ -594,7 +594,8 @@ void hostap_dump_tx_header(const char *name, const struct hfa384x_tx_frame *tx) | |||
| 594 | } | 594 | } |
| 595 | 595 | ||
| 596 | 596 | ||
| 597 | int hostap_80211_header_parse(const struct sk_buff *skb, unsigned char *haddr) | 597 | static int hostap_80211_header_parse(const struct sk_buff *skb, |
| 598 | unsigned char *haddr) | ||
| 598 | { | 599 | { |
| 599 | struct hostap_interface *iface = netdev_priv(skb->dev); | 600 | struct hostap_interface *iface = netdev_priv(skb->dev); |
| 600 | local_info_t *local = iface->local; | 601 | local_info_t *local = iface->local; |
| @@ -857,7 +858,6 @@ const struct header_ops hostap_80211_ops = { | |||
| 857 | .rebuild = eth_rebuild_header, | 858 | .rebuild = eth_rebuild_header, |
| 858 | .cache = eth_header_cache, | 859 | .cache = eth_header_cache, |
| 859 | .cache_update = eth_header_cache_update, | 860 | .cache_update = eth_header_cache_update, |
| 860 | |||
| 861 | .parse = hostap_80211_header_parse, | 861 | .parse = hostap_80211_header_parse, |
| 862 | }; | 862 | }; |
| 863 | EXPORT_SYMBOL(hostap_80211_ops); | 863 | EXPORT_SYMBOL(hostap_80211_ops); |
| @@ -1150,7 +1150,6 @@ EXPORT_SYMBOL(hostap_set_roaming); | |||
| 1150 | EXPORT_SYMBOL(hostap_set_auth_algs); | 1150 | EXPORT_SYMBOL(hostap_set_auth_algs); |
| 1151 | EXPORT_SYMBOL(hostap_dump_rx_header); | 1151 | EXPORT_SYMBOL(hostap_dump_rx_header); |
| 1152 | EXPORT_SYMBOL(hostap_dump_tx_header); | 1152 | EXPORT_SYMBOL(hostap_dump_tx_header); |
| 1153 | EXPORT_SYMBOL(hostap_80211_header_parse); | ||
| 1154 | EXPORT_SYMBOL(hostap_80211_get_hdrlen); | 1153 | EXPORT_SYMBOL(hostap_80211_get_hdrlen); |
| 1155 | EXPORT_SYMBOL(hostap_get_stats); | 1154 | EXPORT_SYMBOL(hostap_get_stats); |
| 1156 | EXPORT_SYMBOL(hostap_setup_dev); | 1155 | EXPORT_SYMBOL(hostap_setup_dev); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index 62a3d8f8563e..55ac850744b3 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
| @@ -449,7 +449,7 @@ static void iwl3945_dbg_report_frame(struct iwl3945_priv *priv, | |||
| 449 | 449 | ||
| 450 | if (print_summary) { | 450 | if (print_summary) { |
| 451 | char *title; | 451 | char *title; |
| 452 | u32 rate; | 452 | int rate; |
| 453 | 453 | ||
| 454 | if (hundred) | 454 | if (hundred) |
| 455 | title = "100Frames"; | 455 | title = "100Frames"; |
| @@ -487,7 +487,7 @@ static void iwl3945_dbg_report_frame(struct iwl3945_priv *priv, | |||
| 487 | * but you can hack it to show more, if you'd like to. */ | 487 | * but you can hack it to show more, if you'd like to. */ |
| 488 | if (dataframe) | 488 | if (dataframe) |
| 489 | IWL_DEBUG_RX("%s: mhd=0x%04x, dst=0x%02x, " | 489 | IWL_DEBUG_RX("%s: mhd=0x%04x, dst=0x%02x, " |
| 490 | "len=%u, rssi=%d, chnl=%d, rate=%u, \n", | 490 | "len=%u, rssi=%d, chnl=%d, rate=%d, \n", |
| 491 | title, fc, header->addr1[5], | 491 | title, fc, header->addr1[5], |
| 492 | length, rssi, channel, rate); | 492 | length, rssi, channel, rate); |
| 493 | else { | 493 | else { |
| @@ -588,8 +588,12 @@ static void iwl3945_add_radiotap(struct iwl3945_priv *priv, | |||
| 588 | 588 | ||
| 589 | if (rate == -1) | 589 | if (rate == -1) |
| 590 | iwl3945_rt->rt_rate = 0; | 590 | iwl3945_rt->rt_rate = 0; |
| 591 | else | 591 | else { |
| 592 | if (stats->band == IEEE80211_BAND_5GHZ) | ||
| 593 | rate += IWL_FIRST_OFDM_RATE; | ||
| 594 | |||
| 592 | iwl3945_rt->rt_rate = iwl3945_rates[rate].ieee; | 595 | iwl3945_rt->rt_rate = iwl3945_rates[rate].ieee; |
| 596 | } | ||
| 593 | 597 | ||
| 594 | /* antenna number */ | 598 | /* antenna number */ |
| 595 | antenna = phy_flags_hw & RX_RES_PHY_FLAGS_ANTENNA_MSK; | 599 | antenna = phy_flags_hw & RX_RES_PHY_FLAGS_ANTENNA_MSK; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index bf19eb8aafd0..de330ae0ca95 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
| @@ -3528,8 +3528,12 @@ static void iwl4965_add_radiotap(struct iwl_priv *priv, | |||
| 3528 | 3528 | ||
| 3529 | if (rate == -1) | 3529 | if (rate == -1) |
| 3530 | iwl4965_rt->rt_rate = 0; | 3530 | iwl4965_rt->rt_rate = 0; |
| 3531 | else | 3531 | else { |
| 3532 | if (stats->band == IEEE80211_BAND_5GHZ) | ||
| 3533 | rate += IWL_FIRST_OFDM_RATE; | ||
| 3534 | |||
| 3532 | iwl4965_rt->rt_rate = iwl4965_rates[rate].ieee; | 3535 | iwl4965_rt->rt_rate = iwl4965_rates[rate].ieee; |
| 3536 | } | ||
| 3533 | 3537 | ||
| 3534 | /* | 3538 | /* |
| 3535 | * "antenna number" | 3539 | * "antenna number" |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 13925b627e3b..6027e1119c3f 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -2227,7 +2227,10 @@ static int iwl3945_scan_initiate(struct iwl3945_priv *priv) | |||
| 2227 | } | 2227 | } |
| 2228 | 2228 | ||
| 2229 | IWL_DEBUG_INFO("Starting scan...\n"); | 2229 | IWL_DEBUG_INFO("Starting scan...\n"); |
| 2230 | priv->scan_bands = 2; | 2230 | if (priv->cfg->sku & IWL_SKU_G) |
| 2231 | priv->scan_bands |= BIT(IEEE80211_BAND_2GHZ); | ||
| 2232 | if (priv->cfg->sku & IWL_SKU_A) | ||
| 2233 | priv->scan_bands |= BIT(IEEE80211_BAND_5GHZ); | ||
| 2231 | set_bit(STATUS_SCANNING, &priv->status); | 2234 | set_bit(STATUS_SCANNING, &priv->status); |
| 2232 | priv->scan_start = jiffies; | 2235 | priv->scan_start = jiffies; |
| 2233 | priv->scan_pass_start = priv->scan_start; | 2236 | priv->scan_pass_start = priv->scan_start; |
| @@ -3352,13 +3355,18 @@ static void iwl3945_rx_scan_complete_notif(struct iwl3945_priv *priv, | |||
| 3352 | cancel_delayed_work(&priv->scan_check); | 3355 | cancel_delayed_work(&priv->scan_check); |
| 3353 | 3356 | ||
| 3354 | IWL_DEBUG_INFO("Scan pass on %sGHz took %dms\n", | 3357 | IWL_DEBUG_INFO("Scan pass on %sGHz took %dms\n", |
| 3355 | (priv->scan_bands == 2) ? "2.4" : "5.2", | 3358 | (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) ? |
| 3359 | "2.4" : "5.2", | ||
| 3356 | jiffies_to_msecs(elapsed_jiffies | 3360 | jiffies_to_msecs(elapsed_jiffies |
| 3357 | (priv->scan_pass_start, jiffies))); | 3361 | (priv->scan_pass_start, jiffies))); |
| 3358 | 3362 | ||
| 3359 | /* Remove this scanned band from the list | 3363 | /* Remove this scanned band from the list of pending |
| 3360 | * of pending bands to scan */ | 3364 | * bands to scan, band G precedes A in order of scanning |
| 3361 | priv->scan_bands--; | 3365 | * as seen in iwl3945_bg_request_scan */ |
| 3366 | if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) | ||
| 3367 | priv->scan_bands &= ~BIT(IEEE80211_BAND_2GHZ); | ||
| 3368 | else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) | ||
| 3369 | priv->scan_bands &= ~BIT(IEEE80211_BAND_5GHZ); | ||
| 3362 | 3370 | ||
| 3363 | /* If a request to abort was given, or the scan did not succeed | 3371 | /* If a request to abort was given, or the scan did not succeed |
| 3364 | * then we reset the scan state machine and terminate, | 3372 | * then we reset the scan state machine and terminate, |
| @@ -4972,7 +4980,7 @@ static int iwl3945_get_channels_for_scan(struct iwl3945_priv *priv, | |||
| 4972 | 4980 | ||
| 4973 | ch_info = iwl3945_get_channel_info(priv, band, scan_ch->channel); | 4981 | ch_info = iwl3945_get_channel_info(priv, band, scan_ch->channel); |
| 4974 | if (!is_channel_valid(ch_info)) { | 4982 | if (!is_channel_valid(ch_info)) { |
| 4975 | IWL_DEBUG_SCAN("Channel %d is INVALID for this SKU.\n", | 4983 | IWL_DEBUG_SCAN("Channel %d is INVALID for this band.\n", |
| 4976 | scan_ch->channel); | 4984 | scan_ch->channel); |
| 4977 | continue; | 4985 | continue; |
| 4978 | } | 4986 | } |
| @@ -6315,21 +6323,16 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
| 6315 | 6323 | ||
| 6316 | /* flags + rate selection */ | 6324 | /* flags + rate selection */ |
| 6317 | 6325 | ||
| 6318 | switch (priv->scan_bands) { | 6326 | if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) { |
| 6319 | case 2: | ||
| 6320 | scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; | 6327 | scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; |
| 6321 | scan->tx_cmd.rate = IWL_RATE_1M_PLCP; | 6328 | scan->tx_cmd.rate = IWL_RATE_1M_PLCP; |
| 6322 | scan->good_CRC_th = 0; | 6329 | scan->good_CRC_th = 0; |
| 6323 | band = IEEE80211_BAND_2GHZ; | 6330 | band = IEEE80211_BAND_2GHZ; |
| 6324 | break; | 6331 | } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { |
| 6325 | |||
| 6326 | case 1: | ||
| 6327 | scan->tx_cmd.rate = IWL_RATE_6M_PLCP; | 6332 | scan->tx_cmd.rate = IWL_RATE_6M_PLCP; |
| 6328 | scan->good_CRC_th = IWL_GOOD_CRC_TH; | 6333 | scan->good_CRC_th = IWL_GOOD_CRC_TH; |
| 6329 | band = IEEE80211_BAND_5GHZ; | 6334 | band = IEEE80211_BAND_5GHZ; |
| 6330 | break; | 6335 | } else { |
| 6331 | |||
| 6332 | default: | ||
| 6333 | IWL_WARNING("Invalid scan band count\n"); | 6336 | IWL_WARNING("Invalid scan band count\n"); |
| 6334 | goto done; | 6337 | goto done; |
| 6335 | } | 6338 | } |
| @@ -6684,7 +6687,8 @@ static int iwl3945_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
| 6684 | 6687 | ||
| 6685 | if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) { | 6688 | if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) { |
| 6686 | IWL_DEBUG_MAC80211("leave - monitor\n"); | 6689 | IWL_DEBUG_MAC80211("leave - monitor\n"); |
| 6687 | return -1; | 6690 | dev_kfree_skb_any(skb); |
| 6691 | return 0; | ||
| 6688 | } | 6692 | } |
| 6689 | 6693 | ||
| 6690 | IWL_DEBUG_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len, | 6694 | IWL_DEBUG_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len, |
| @@ -6770,7 +6774,7 @@ static int iwl3945_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *co | |||
| 6770 | ch_info = iwl3945_get_channel_info(priv, conf->channel->band, | 6774 | ch_info = iwl3945_get_channel_info(priv, conf->channel->band, |
| 6771 | conf->channel->hw_value); | 6775 | conf->channel->hw_value); |
| 6772 | if (!is_channel_valid(ch_info)) { | 6776 | if (!is_channel_valid(ch_info)) { |
| 6773 | IWL_DEBUG_SCAN("Channel %d [%d] is INVALID for this SKU.\n", | 6777 | IWL_DEBUG_SCAN("Channel %d [%d] is INVALID for this band.\n", |
| 6774 | conf->channel->hw_value, conf->channel->band); | 6778 | conf->channel->hw_value, conf->channel->band); |
| 6775 | IWL_DEBUG_MAC80211("leave - invalid channel\n"); | 6779 | IWL_DEBUG_MAC80211("leave - invalid channel\n"); |
| 6776 | spin_unlock_irqrestore(&priv->lock, flags); | 6780 | spin_unlock_irqrestore(&priv->lock, flags); |
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c index 883b42f7e998..0bd55bb19739 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c | |||
| @@ -1774,7 +1774,10 @@ static int iwl4965_scan_initiate(struct iwl_priv *priv) | |||
| 1774 | } | 1774 | } |
| 1775 | 1775 | ||
| 1776 | IWL_DEBUG_INFO("Starting scan...\n"); | 1776 | IWL_DEBUG_INFO("Starting scan...\n"); |
| 1777 | priv->scan_bands = 2; | 1777 | if (priv->cfg->sku & IWL_SKU_G) |
| 1778 | priv->scan_bands |= BIT(IEEE80211_BAND_2GHZ); | ||
| 1779 | if (priv->cfg->sku & IWL_SKU_A) | ||
| 1780 | priv->scan_bands |= BIT(IEEE80211_BAND_5GHZ); | ||
| 1778 | set_bit(STATUS_SCANNING, &priv->status); | 1781 | set_bit(STATUS_SCANNING, &priv->status); |
| 1779 | priv->scan_start = jiffies; | 1782 | priv->scan_start = jiffies; |
| 1780 | priv->scan_pass_start = priv->scan_start; | 1783 | priv->scan_pass_start = priv->scan_start; |
| @@ -3023,8 +3026,9 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv, | |||
| 3023 | 3026 | ||
| 3024 | IWL_DEBUG_TX_REPLY("Tx queue reclaim %d\n", index); | 3027 | IWL_DEBUG_TX_REPLY("Tx queue reclaim %d\n", index); |
| 3025 | if (index != -1) { | 3028 | if (index != -1) { |
| 3026 | int freed = iwl4965_tx_queue_reclaim(priv, txq_id, index); | ||
| 3027 | #ifdef CONFIG_IWL4965_HT | 3029 | #ifdef CONFIG_IWL4965_HT |
| 3030 | int freed = iwl4965_tx_queue_reclaim(priv, txq_id, index); | ||
| 3031 | |||
| 3028 | if (tid != MAX_TID_COUNT) | 3032 | if (tid != MAX_TID_COUNT) |
| 3029 | priv->stations[sta_id].tid[tid].tfds_in_queue -= freed; | 3033 | priv->stations[sta_id].tid[tid].tfds_in_queue -= freed; |
| 3030 | if (iwl4965_queue_space(&txq->q) > txq->q.low_mark && | 3034 | if (iwl4965_queue_space(&txq->q) > txq->q.low_mark && |
| @@ -3276,13 +3280,18 @@ static void iwl4965_rx_scan_complete_notif(struct iwl_priv *priv, | |||
| 3276 | cancel_delayed_work(&priv->scan_check); | 3280 | cancel_delayed_work(&priv->scan_check); |
| 3277 | 3281 | ||
| 3278 | IWL_DEBUG_INFO("Scan pass on %sGHz took %dms\n", | 3282 | IWL_DEBUG_INFO("Scan pass on %sGHz took %dms\n", |
| 3279 | (priv->scan_bands == 2) ? "2.4" : "5.2", | 3283 | (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) ? |
| 3284 | "2.4" : "5.2", | ||
| 3280 | jiffies_to_msecs(elapsed_jiffies | 3285 | jiffies_to_msecs(elapsed_jiffies |
| 3281 | (priv->scan_pass_start, jiffies))); | 3286 | (priv->scan_pass_start, jiffies))); |
| 3282 | 3287 | ||
| 3283 | /* Remove this scanned band from the list | 3288 | /* Remove this scanned band from the list of pending |
| 3284 | * of pending bands to scan */ | 3289 | * bands to scan, band G precedes A in order of scanning |
| 3285 | priv->scan_bands--; | 3290 | * as seen in iwl_bg_request_scan */ |
| 3291 | if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) | ||
| 3292 | priv->scan_bands &= ~BIT(IEEE80211_BAND_2GHZ); | ||
| 3293 | else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) | ||
| 3294 | priv->scan_bands &= ~BIT(IEEE80211_BAND_5GHZ); | ||
| 3286 | 3295 | ||
| 3287 | /* If a request to abort was given, or the scan did not succeed | 3296 | /* If a request to abort was given, or the scan did not succeed |
| 3288 | * then we reset the scan state machine and terminate, | 3297 | * then we reset the scan state machine and terminate, |
| @@ -3292,7 +3301,7 @@ static void iwl4965_rx_scan_complete_notif(struct iwl_priv *priv, | |||
| 3292 | clear_bit(STATUS_SCAN_ABORTING, &priv->status); | 3301 | clear_bit(STATUS_SCAN_ABORTING, &priv->status); |
| 3293 | } else { | 3302 | } else { |
| 3294 | /* If there are more bands on this scan pass reschedule */ | 3303 | /* If there are more bands on this scan pass reschedule */ |
| 3295 | if (priv->scan_bands > 0) | 3304 | if (priv->scan_bands) |
| 3296 | goto reschedule; | 3305 | goto reschedule; |
| 3297 | } | 3306 | } |
| 3298 | 3307 | ||
| @@ -4635,10 +4644,9 @@ static int iwl4965_get_channels_for_scan(struct iwl_priv *priv, | |||
| 4635 | 4644 | ||
| 4636 | scan_ch->channel = ieee80211_frequency_to_channel(channels[i].center_freq); | 4645 | scan_ch->channel = ieee80211_frequency_to_channel(channels[i].center_freq); |
| 4637 | 4646 | ||
| 4638 | ch_info = iwl_get_channel_info(priv, band, | 4647 | ch_info = iwl_get_channel_info(priv, band, scan_ch->channel); |
| 4639 | scan_ch->channel); | ||
| 4640 | if (!is_channel_valid(ch_info)) { | 4648 | if (!is_channel_valid(ch_info)) { |
| 4641 | IWL_DEBUG_SCAN("Channel %d is INVALID for this SKU.\n", | 4649 | IWL_DEBUG_SCAN("Channel %d is INVALID for this band.\n", |
| 4642 | scan_ch->channel); | 4650 | scan_ch->channel); |
| 4643 | continue; | 4651 | continue; |
| 4644 | } | 4652 | } |
| @@ -5830,8 +5838,7 @@ static void iwl4965_bg_request_scan(struct work_struct *data) | |||
| 5830 | scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; | 5838 | scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; |
| 5831 | 5839 | ||
| 5832 | 5840 | ||
| 5833 | switch (priv->scan_bands) { | 5841 | if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) { |
| 5834 | case 2: | ||
| 5835 | scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; | 5842 | scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; |
| 5836 | scan->tx_cmd.rate_n_flags = | 5843 | scan->tx_cmd.rate_n_flags = |
| 5837 | iwl4965_hw_set_rate_n_flags(IWL_RATE_1M_PLCP, | 5844 | iwl4965_hw_set_rate_n_flags(IWL_RATE_1M_PLCP, |
| @@ -5839,17 +5846,13 @@ static void iwl4965_bg_request_scan(struct work_struct *data) | |||
| 5839 | 5846 | ||
| 5840 | scan->good_CRC_th = 0; | 5847 | scan->good_CRC_th = 0; |
| 5841 | band = IEEE80211_BAND_2GHZ; | 5848 | band = IEEE80211_BAND_2GHZ; |
| 5842 | break; | 5849 | } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { |
| 5843 | |||
| 5844 | case 1: | ||
| 5845 | scan->tx_cmd.rate_n_flags = | 5850 | scan->tx_cmd.rate_n_flags = |
| 5846 | iwl4965_hw_set_rate_n_flags(IWL_RATE_6M_PLCP, | 5851 | iwl4965_hw_set_rate_n_flags(IWL_RATE_6M_PLCP, |
| 5847 | RATE_MCS_ANT_B_MSK); | 5852 | RATE_MCS_ANT_B_MSK); |
| 5848 | scan->good_CRC_th = IWL_GOOD_CRC_TH; | 5853 | scan->good_CRC_th = IWL_GOOD_CRC_TH; |
| 5849 | band = IEEE80211_BAND_5GHZ; | 5854 | band = IEEE80211_BAND_5GHZ; |
| 5850 | break; | 5855 | } else { |
| 5851 | |||
| 5852 | default: | ||
| 5853 | IWL_WARNING("Invalid scan band count\n"); | 5856 | IWL_WARNING("Invalid scan band count\n"); |
| 5854 | goto done; | 5857 | goto done; |
| 5855 | } | 5858 | } |
| @@ -6234,7 +6237,8 @@ static int iwl4965_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
| 6234 | 6237 | ||
| 6235 | if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) { | 6238 | if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) { |
| 6236 | IWL_DEBUG_MAC80211("leave - monitor\n"); | 6239 | IWL_DEBUG_MAC80211("leave - monitor\n"); |
| 6237 | return -1; | 6240 | dev_kfree_skb_any(skb); |
| 6241 | return 0; | ||
| 6238 | } | 6242 | } |
| 6239 | 6243 | ||
| 6240 | IWL_DEBUG_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len, | 6244 | IWL_DEBUG_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len, |
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c index 8032df72aaab..36288b29abf7 100644 --- a/drivers/net/wireless/libertas/if_usb.c +++ b/drivers/net/wireless/libertas/if_usb.c | |||
| @@ -925,6 +925,7 @@ static struct usb_driver if_usb_driver = { | |||
| 925 | .id_table = if_usb_table, | 925 | .id_table = if_usb_table, |
| 926 | .suspend = if_usb_suspend, | 926 | .suspend = if_usb_suspend, |
| 927 | .resume = if_usb_resume, | 927 | .resume = if_usb_resume, |
| 928 | .reset_resume = if_usb_resume, | ||
| 928 | }; | 929 | }; |
| 929 | 930 | ||
| 930 | static int __init if_usb_init_module(void) | 931 | static int __init if_usb_init_module(void) |
diff --git a/drivers/net/wireless/libertas/scan.c b/drivers/net/wireless/libertas/scan.c index d448c9702a0f..387d4878af2f 100644 --- a/drivers/net/wireless/libertas/scan.c +++ b/drivers/net/wireless/libertas/scan.c | |||
| @@ -567,11 +567,11 @@ static int lbs_process_bss(struct bss_descriptor *bss, | |||
| 567 | pos += 8; | 567 | pos += 8; |
| 568 | 568 | ||
| 569 | /* beacon interval is 2 bytes long */ | 569 | /* beacon interval is 2 bytes long */ |
| 570 | bss->beaconperiod = le16_to_cpup((void *) pos); | 570 | bss->beaconperiod = get_unaligned_le16(pos); |
| 571 | pos += 2; | 571 | pos += 2; |
| 572 | 572 | ||
| 573 | /* capability information is 2 bytes long */ | 573 | /* capability information is 2 bytes long */ |
| 574 | bss->capability = le16_to_cpup((void *) pos); | 574 | bss->capability = get_unaligned_le16(pos); |
| 575 | lbs_deb_scan("process_bss: capabilities 0x%04x\n", bss->capability); | 575 | lbs_deb_scan("process_bss: capabilities 0x%04x\n", bss->capability); |
| 576 | pos += 2; | 576 | pos += 2; |
| 577 | 577 | ||
diff --git a/drivers/net/wireless/prism54/islpci_eth.c b/drivers/net/wireless/prism54/islpci_eth.c index 762e85bef55d..e43bae97ed8f 100644 --- a/drivers/net/wireless/prism54/islpci_eth.c +++ b/drivers/net/wireless/prism54/islpci_eth.c | |||
| @@ -290,7 +290,7 @@ islpci_monitor_rx(islpci_private *priv, struct sk_buff **skb) | |||
| 290 | 290 | ||
| 291 | avs->version = cpu_to_be32(P80211CAPTURE_VERSION); | 291 | avs->version = cpu_to_be32(P80211CAPTURE_VERSION); |
| 292 | avs->length = cpu_to_be32(sizeof (struct avs_80211_1_header)); | 292 | avs->length = cpu_to_be32(sizeof (struct avs_80211_1_header)); |
| 293 | avs->mactime = cpu_to_be64(le64_to_cpu(clock)); | 293 | avs->mactime = cpu_to_be64(clock); |
| 294 | avs->hosttime = cpu_to_be64(jiffies); | 294 | avs->hosttime = cpu_to_be64(jiffies); |
| 295 | avs->phytype = cpu_to_be32(6); /*OFDM: 6 for (g), 8 for (a) */ | 295 | avs->phytype = cpu_to_be32(6); /*OFDM: 6 for (g), 8 for (a) */ |
| 296 | avs->channel = cpu_to_be32(channel_of_freq(freq)); | 296 | avs->channel = cpu_to_be32(channel_of_freq(freq)); |
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c index 560b9c73c0b9..b36ed1c6c746 100644 --- a/drivers/net/wireless/rt2x00/rt2400pci.c +++ b/drivers/net/wireless/rt2x00/rt2400pci.c | |||
| @@ -731,6 +731,17 @@ static int rt2400pci_init_registers(struct rt2x00_dev *rt2x00dev) | |||
| 731 | (rt2x00dev->rx->data_size / 128)); | 731 | (rt2x00dev->rx->data_size / 128)); |
| 732 | rt2x00pci_register_write(rt2x00dev, CSR9, reg); | 732 | rt2x00pci_register_write(rt2x00dev, CSR9, reg); |
| 733 | 733 | ||
| 734 | rt2x00pci_register_read(rt2x00dev, CSR14, ®); | ||
| 735 | rt2x00_set_field32(®, CSR14_TSF_COUNT, 0); | ||
| 736 | rt2x00_set_field32(®, CSR14_TSF_SYNC, 0); | ||
| 737 | rt2x00_set_field32(®, CSR14_TBCN, 0); | ||
| 738 | rt2x00_set_field32(®, CSR14_TCFP, 0); | ||
| 739 | rt2x00_set_field32(®, CSR14_TATIMW, 0); | ||
| 740 | rt2x00_set_field32(®, CSR14_BEACON_GEN, 0); | ||
| 741 | rt2x00_set_field32(®, CSR14_CFP_COUNT_PRELOAD, 0); | ||
| 742 | rt2x00_set_field32(®, CSR14_TBCM_PRELOAD, 0); | ||
| 743 | rt2x00pci_register_write(rt2x00dev, CSR14, reg); | ||
| 744 | |||
| 734 | rt2x00pci_register_write(rt2x00dev, CNT3, 0x3f080000); | 745 | rt2x00pci_register_write(rt2x00dev, CNT3, 0x3f080000); |
| 735 | 746 | ||
| 736 | rt2x00pci_register_read(rt2x00dev, ARCSR0, ®); | 747 | rt2x00pci_register_read(rt2x00dev, ARCSR0, ®); |
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index a5ed54b69262..f7731fb82555 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c | |||
| @@ -824,6 +824,17 @@ static int rt2500pci_init_registers(struct rt2x00_dev *rt2x00dev) | |||
| 824 | rt2x00_set_field32(®, CSR11_CW_SELECT, 0); | 824 | rt2x00_set_field32(®, CSR11_CW_SELECT, 0); |
| 825 | rt2x00pci_register_write(rt2x00dev, CSR11, reg); | 825 | rt2x00pci_register_write(rt2x00dev, CSR11, reg); |
| 826 | 826 | ||
| 827 | rt2x00pci_register_read(rt2x00dev, CSR14, ®); | ||
| 828 | rt2x00_set_field32(®, CSR14_TSF_COUNT, 0); | ||
| 829 | rt2x00_set_field32(®, CSR14_TSF_SYNC, 0); | ||
| 830 | rt2x00_set_field32(®, CSR14_TBCN, 0); | ||
| 831 | rt2x00_set_field32(®, CSR14_TCFP, 0); | ||
| 832 | rt2x00_set_field32(®, CSR14_TATIMW, 0); | ||
| 833 | rt2x00_set_field32(®, CSR14_BEACON_GEN, 0); | ||
| 834 | rt2x00_set_field32(®, CSR14_CFP_COUNT_PRELOAD, 0); | ||
| 835 | rt2x00_set_field32(®, CSR14_TBCM_PRELOAD, 0); | ||
| 836 | rt2x00pci_register_write(rt2x00dev, CSR14, reg); | ||
| 837 | |||
| 827 | rt2x00pci_register_write(rt2x00dev, CNT3, 0); | 838 | rt2x00pci_register_write(rt2x00dev, CNT3, 0); |
| 828 | 839 | ||
| 829 | rt2x00pci_register_read(rt2x00dev, TXCSR8, ®); | 840 | rt2x00pci_register_read(rt2x00dev, TXCSR8, ®); |
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index fdbd0ef2be4b..d90512f97b39 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
| @@ -138,11 +138,8 @@ static void rt2500usb_bbp_write(struct rt2x00_dev *rt2x00dev, | |||
| 138 | * Wait until the BBP becomes ready. | 138 | * Wait until the BBP becomes ready. |
| 139 | */ | 139 | */ |
| 140 | reg = rt2500usb_bbp_check(rt2x00dev); | 140 | reg = rt2500usb_bbp_check(rt2x00dev); |
| 141 | if (rt2x00_get_field16(reg, PHY_CSR8_BUSY)) { | 141 | if (rt2x00_get_field16(reg, PHY_CSR8_BUSY)) |
| 142 | ERROR(rt2x00dev, "PHY_CSR8 register busy. Write failed.\n"); | 142 | goto exit_fail; |
| 143 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 144 | return; | ||
| 145 | } | ||
| 146 | 143 | ||
| 147 | /* | 144 | /* |
| 148 | * Write the data into the BBP. | 145 | * Write the data into the BBP. |
| @@ -155,6 +152,13 @@ static void rt2500usb_bbp_write(struct rt2x00_dev *rt2x00dev, | |||
| 155 | rt2500usb_register_write_lock(rt2x00dev, PHY_CSR7, reg); | 152 | rt2500usb_register_write_lock(rt2x00dev, PHY_CSR7, reg); |
| 156 | 153 | ||
| 157 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | 154 | mutex_unlock(&rt2x00dev->usb_cache_mutex); |
| 155 | |||
| 156 | return; | ||
| 157 | |||
| 158 | exit_fail: | ||
| 159 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 160 | |||
| 161 | ERROR(rt2x00dev, "PHY_CSR8 register busy. Write failed.\n"); | ||
| 158 | } | 162 | } |
| 159 | 163 | ||
| 160 | static void rt2500usb_bbp_read(struct rt2x00_dev *rt2x00dev, | 164 | static void rt2500usb_bbp_read(struct rt2x00_dev *rt2x00dev, |
| @@ -168,10 +172,8 @@ static void rt2500usb_bbp_read(struct rt2x00_dev *rt2x00dev, | |||
| 168 | * Wait until the BBP becomes ready. | 172 | * Wait until the BBP becomes ready. |
| 169 | */ | 173 | */ |
| 170 | reg = rt2500usb_bbp_check(rt2x00dev); | 174 | reg = rt2500usb_bbp_check(rt2x00dev); |
| 171 | if (rt2x00_get_field16(reg, PHY_CSR8_BUSY)) { | 175 | if (rt2x00_get_field16(reg, PHY_CSR8_BUSY)) |
| 172 | ERROR(rt2x00dev, "PHY_CSR8 register busy. Read failed.\n"); | 176 | goto exit_fail; |
| 173 | return; | ||
| 174 | } | ||
| 175 | 177 | ||
| 176 | /* | 178 | /* |
| 177 | * Write the request into the BBP. | 179 | * Write the request into the BBP. |
| @@ -186,17 +188,21 @@ static void rt2500usb_bbp_read(struct rt2x00_dev *rt2x00dev, | |||
| 186 | * Wait until the BBP becomes ready. | 188 | * Wait until the BBP becomes ready. |
| 187 | */ | 189 | */ |
| 188 | reg = rt2500usb_bbp_check(rt2x00dev); | 190 | reg = rt2500usb_bbp_check(rt2x00dev); |
| 189 | if (rt2x00_get_field16(reg, PHY_CSR8_BUSY)) { | 191 | if (rt2x00_get_field16(reg, PHY_CSR8_BUSY)) |
| 190 | ERROR(rt2x00dev, "PHY_CSR8 register busy. Read failed.\n"); | 192 | goto exit_fail; |
| 191 | *value = 0xff; | ||
| 192 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 193 | return; | ||
| 194 | } | ||
| 195 | 193 | ||
| 196 | rt2500usb_register_read_lock(rt2x00dev, PHY_CSR7, ®); | 194 | rt2500usb_register_read_lock(rt2x00dev, PHY_CSR7, ®); |
| 197 | *value = rt2x00_get_field16(reg, PHY_CSR7_DATA); | 195 | *value = rt2x00_get_field16(reg, PHY_CSR7_DATA); |
| 198 | 196 | ||
| 199 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | 197 | mutex_unlock(&rt2x00dev->usb_cache_mutex); |
| 198 | |||
| 199 | return; | ||
| 200 | |||
| 201 | exit_fail: | ||
| 202 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 203 | |||
| 204 | ERROR(rt2x00dev, "PHY_CSR8 register busy. Read failed.\n"); | ||
| 205 | *value = 0xff; | ||
| 200 | } | 206 | } |
| 201 | 207 | ||
| 202 | static void rt2500usb_rf_write(struct rt2x00_dev *rt2x00dev, | 208 | static void rt2500usb_rf_write(struct rt2x00_dev *rt2x00dev, |
| @@ -795,6 +801,13 @@ static int rt2500usb_init_registers(struct rt2x00_dev *rt2x00dev) | |||
| 795 | rt2x00_set_field16(®, TXRX_CSR8_BBP_ID1_VALID, 0); | 801 | rt2x00_set_field16(®, TXRX_CSR8_BBP_ID1_VALID, 0); |
| 796 | rt2500usb_register_write(rt2x00dev, TXRX_CSR8, reg); | 802 | rt2500usb_register_write(rt2x00dev, TXRX_CSR8, reg); |
| 797 | 803 | ||
| 804 | rt2500usb_register_read(rt2x00dev, TXRX_CSR19, ®); | ||
| 805 | rt2x00_set_field16(®, TXRX_CSR19_TSF_COUNT, 0); | ||
| 806 | rt2x00_set_field16(®, TXRX_CSR19_TSF_SYNC, 0); | ||
| 807 | rt2x00_set_field16(®, TXRX_CSR19_TBCN, 0); | ||
| 808 | rt2x00_set_field16(®, TXRX_CSR19_BEACON_GEN, 0); | ||
| 809 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); | ||
| 810 | |||
| 798 | rt2500usb_register_write(rt2x00dev, TXRX_CSR21, 0xe78f); | 811 | rt2500usb_register_write(rt2x00dev, TXRX_CSR21, 0xe78f); |
| 799 | rt2500usb_register_write(rt2x00dev, MAC_CSR9, 0xff1d); | 812 | rt2500usb_register_write(rt2x00dev, MAC_CSR9, 0xff1d); |
| 800 | 813 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index 611d98320593..b4bf1e09cf9a 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
| @@ -821,6 +821,7 @@ struct rt2x00_dev { | |||
| 821 | /* | 821 | /* |
| 822 | * Scheduled work. | 822 | * Scheduled work. |
| 823 | */ | 823 | */ |
| 824 | struct workqueue_struct *workqueue; | ||
| 824 | struct work_struct intf_work; | 825 | struct work_struct intf_work; |
| 825 | struct work_struct filter_work; | 826 | struct work_struct filter_work; |
| 826 | 827 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 2673d568bcac..c997d4f28ab3 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
| @@ -75,7 +75,7 @@ static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev) | |||
| 75 | 75 | ||
| 76 | rt2x00lib_reset_link_tuner(rt2x00dev); | 76 | rt2x00lib_reset_link_tuner(rt2x00dev); |
| 77 | 77 | ||
| 78 | queue_delayed_work(rt2x00dev->hw->workqueue, | 78 | queue_delayed_work(rt2x00dev->workqueue, |
| 79 | &rt2x00dev->link.work, LINK_TUNE_INTERVAL); | 79 | &rt2x00dev->link.work, LINK_TUNE_INTERVAL); |
| 80 | } | 80 | } |
| 81 | 81 | ||
| @@ -137,14 +137,6 @@ void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev) | |||
| 137 | return; | 137 | return; |
| 138 | 138 | ||
| 139 | /* | 139 | /* |
| 140 | * Stop all scheduled work. | ||
| 141 | */ | ||
| 142 | if (work_pending(&rt2x00dev->intf_work)) | ||
| 143 | cancel_work_sync(&rt2x00dev->intf_work); | ||
| 144 | if (work_pending(&rt2x00dev->filter_work)) | ||
| 145 | cancel_work_sync(&rt2x00dev->filter_work); | ||
| 146 | |||
| 147 | /* | ||
| 148 | * Stop the TX queues. | 140 | * Stop the TX queues. |
| 149 | */ | 141 | */ |
| 150 | ieee80211_stop_queues(rt2x00dev->hw); | 142 | ieee80211_stop_queues(rt2x00dev->hw); |
| @@ -398,8 +390,8 @@ static void rt2x00lib_link_tuner(struct work_struct *work) | |||
| 398 | * Increase tuner counter, and reschedule the next link tuner run. | 390 | * Increase tuner counter, and reschedule the next link tuner run. |
| 399 | */ | 391 | */ |
| 400 | rt2x00dev->link.count++; | 392 | rt2x00dev->link.count++; |
| 401 | queue_delayed_work(rt2x00dev->hw->workqueue, &rt2x00dev->link.work, | 393 | queue_delayed_work(rt2x00dev->workqueue, |
| 402 | LINK_TUNE_INTERVAL); | 394 | &rt2x00dev->link.work, LINK_TUNE_INTERVAL); |
| 403 | } | 395 | } |
| 404 | 396 | ||
| 405 | static void rt2x00lib_packetfilter_scheduled(struct work_struct *work) | 397 | static void rt2x00lib_packetfilter_scheduled(struct work_struct *work) |
| @@ -433,6 +425,15 @@ static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac, | |||
| 433 | 425 | ||
| 434 | spin_unlock(&intf->lock); | 426 | spin_unlock(&intf->lock); |
| 435 | 427 | ||
| 428 | /* | ||
| 429 | * It is possible the radio was disabled while the work had been | ||
| 430 | * scheduled. If that happens we should return here immediately, | ||
| 431 | * note that in the spinlock protected area above the delayed_flags | ||
| 432 | * have been cleared correctly. | ||
| 433 | */ | ||
| 434 | if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags)) | ||
| 435 | return; | ||
| 436 | |||
| 436 | if (delayed_flags & DELAYED_UPDATE_BEACON) { | 437 | if (delayed_flags & DELAYED_UPDATE_BEACON) { |
| 437 | skb = ieee80211_beacon_get(rt2x00dev->hw, vif, &control); | 438 | skb = ieee80211_beacon_get(rt2x00dev->hw, vif, &control); |
| 438 | if (skb && rt2x00dev->ops->hw->beacon_update(rt2x00dev->hw, | 439 | if (skb && rt2x00dev->ops->hw->beacon_update(rt2x00dev->hw, |
| @@ -441,7 +442,7 @@ static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac, | |||
| 441 | } | 442 | } |
| 442 | 443 | ||
| 443 | if (delayed_flags & DELAYED_CONFIG_ERP) | 444 | if (delayed_flags & DELAYED_CONFIG_ERP) |
| 444 | rt2x00lib_config_erp(rt2x00dev, intf, &intf->conf); | 445 | rt2x00lib_config_erp(rt2x00dev, intf, &conf); |
| 445 | 446 | ||
| 446 | if (delayed_flags & DELAYED_LED_ASSOC) | 447 | if (delayed_flags & DELAYED_LED_ASSOC) |
| 447 | rt2x00leds_led_assoc(rt2x00dev, !!rt2x00dev->intf_associated); | 448 | rt2x00leds_led_assoc(rt2x00dev, !!rt2x00dev->intf_associated); |
| @@ -487,7 +488,7 @@ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev) | |||
| 487 | rt2x00lib_beacondone_iter, | 488 | rt2x00lib_beacondone_iter, |
| 488 | rt2x00dev); | 489 | rt2x00dev); |
| 489 | 490 | ||
| 490 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->intf_work); | 491 | queue_work(rt2x00dev->workqueue, &rt2x00dev->intf_work); |
| 491 | } | 492 | } |
| 492 | EXPORT_SYMBOL_GPL(rt2x00lib_beacondone); | 493 | EXPORT_SYMBOL_GPL(rt2x00lib_beacondone); |
| 493 | 494 | ||
| @@ -1130,6 +1131,10 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) | |||
| 1130 | /* | 1131 | /* |
| 1131 | * Initialize configuration work. | 1132 | * Initialize configuration work. |
| 1132 | */ | 1133 | */ |
| 1134 | rt2x00dev->workqueue = create_singlethread_workqueue("rt2x00lib"); | ||
| 1135 | if (!rt2x00dev->workqueue) | ||
| 1136 | goto exit; | ||
| 1137 | |||
| 1133 | INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled); | 1138 | INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled); |
| 1134 | INIT_WORK(&rt2x00dev->filter_work, rt2x00lib_packetfilter_scheduled); | 1139 | INIT_WORK(&rt2x00dev->filter_work, rt2x00lib_packetfilter_scheduled); |
| 1135 | INIT_DELAYED_WORK(&rt2x00dev->link.work, rt2x00lib_link_tuner); | 1140 | INIT_DELAYED_WORK(&rt2x00dev->link.work, rt2x00lib_link_tuner); |
| @@ -1190,6 +1195,13 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev) | |||
| 1190 | rt2x00leds_unregister(rt2x00dev); | 1195 | rt2x00leds_unregister(rt2x00dev); |
| 1191 | 1196 | ||
| 1192 | /* | 1197 | /* |
| 1198 | * Stop all queued work. Note that most tasks will already be halted | ||
| 1199 | * during rt2x00lib_disable_radio() and rt2x00lib_uninitialize(). | ||
| 1200 | */ | ||
| 1201 | flush_workqueue(rt2x00dev->workqueue); | ||
| 1202 | destroy_workqueue(rt2x00dev->workqueue); | ||
| 1203 | |||
| 1204 | /* | ||
| 1193 | * Free ieee80211_hw memory. | 1205 | * Free ieee80211_hw memory. |
| 1194 | */ | 1206 | */ |
| 1195 | rt2x00lib_remove_hw(rt2x00dev); | 1207 | rt2x00lib_remove_hw(rt2x00dev); |
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index 87e280a21971..9cb023edd2e9 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
| @@ -428,7 +428,7 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw, | |||
| 428 | if (!test_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags)) | 428 | if (!test_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags)) |
| 429 | rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags); | 429 | rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags); |
| 430 | else | 430 | else |
| 431 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->filter_work); | 431 | queue_work(rt2x00dev->workqueue, &rt2x00dev->filter_work); |
| 432 | } | 432 | } |
| 433 | EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter); | 433 | EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter); |
| 434 | 434 | ||
| @@ -509,7 +509,7 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw, | |||
| 509 | memcpy(&intf->conf, bss_conf, sizeof(*bss_conf)); | 509 | memcpy(&intf->conf, bss_conf, sizeof(*bss_conf)); |
| 510 | if (delayed) { | 510 | if (delayed) { |
| 511 | intf->delayed_flags |= delayed; | 511 | intf->delayed_flags |= delayed; |
| 512 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->intf_work); | 512 | queue_work(rt2x00dev->workqueue, &rt2x00dev->intf_work); |
| 513 | } | 513 | } |
| 514 | spin_unlock(&intf->lock); | 514 | spin_unlock(&intf->lock); |
| 515 | } | 515 | } |
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index 14bc7b281659..c3afb5cbe807 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
| @@ -1201,6 +1201,15 @@ static int rt61pci_init_registers(struct rt2x00_dev *rt2x00dev) | |||
| 1201 | rt2x00_set_field32(®, TXRX_CSR8_ACK_CTS_54MBS, 42); | 1201 | rt2x00_set_field32(®, TXRX_CSR8_ACK_CTS_54MBS, 42); |
| 1202 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR8, reg); | 1202 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR8, reg); |
| 1203 | 1203 | ||
| 1204 | rt2x00pci_register_read(rt2x00dev, TXRX_CSR9, ®); | ||
| 1205 | rt2x00_set_field32(®, TXRX_CSR9_BEACON_INTERVAL, 0); | ||
| 1206 | rt2x00_set_field32(®, TXRX_CSR9_TSF_TICKING, 0); | ||
| 1207 | rt2x00_set_field32(®, TXRX_CSR9_TSF_SYNC, 0); | ||
| 1208 | rt2x00_set_field32(®, TXRX_CSR9_TBTT_ENABLE, 0); | ||
| 1209 | rt2x00_set_field32(®, TXRX_CSR9_BEACON_GEN, 0); | ||
| 1210 | rt2x00_set_field32(®, TXRX_CSR9_TIMESTAMP_COMPENSATE, 0); | ||
| 1211 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, reg); | ||
| 1212 | |||
| 1204 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR15, 0x0000000f); | 1213 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR15, 0x0000000f); |
| 1205 | 1214 | ||
| 1206 | rt2x00pci_register_write(rt2x00dev, MAC_CSR6, 0x00000fff); | 1215 | rt2x00pci_register_write(rt2x00dev, MAC_CSR6, 0x00000fff); |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index fff8386e816b..46e9e081fbf1 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
| @@ -134,11 +134,8 @@ static void rt73usb_bbp_write(struct rt2x00_dev *rt2x00dev, | |||
| 134 | * Wait until the BBP becomes ready. | 134 | * Wait until the BBP becomes ready. |
| 135 | */ | 135 | */ |
| 136 | reg = rt73usb_bbp_check(rt2x00dev); | 136 | reg = rt73usb_bbp_check(rt2x00dev); |
| 137 | if (rt2x00_get_field32(reg, PHY_CSR3_BUSY)) { | 137 | if (rt2x00_get_field32(reg, PHY_CSR3_BUSY)) |
| 138 | ERROR(rt2x00dev, "PHY_CSR3 register busy. Write failed.\n"); | 138 | goto exit_fail; |
| 139 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 140 | return; | ||
| 141 | } | ||
| 142 | 139 | ||
| 143 | /* | 140 | /* |
| 144 | * Write the data into the BBP. | 141 | * Write the data into the BBP. |
| @@ -151,6 +148,13 @@ static void rt73usb_bbp_write(struct rt2x00_dev *rt2x00dev, | |||
| 151 | 148 | ||
| 152 | rt73usb_register_write_lock(rt2x00dev, PHY_CSR3, reg); | 149 | rt73usb_register_write_lock(rt2x00dev, PHY_CSR3, reg); |
| 153 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | 150 | mutex_unlock(&rt2x00dev->usb_cache_mutex); |
| 151 | |||
| 152 | return; | ||
| 153 | |||
| 154 | exit_fail: | ||
| 155 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 156 | |||
| 157 | ERROR(rt2x00dev, "PHY_CSR3 register busy. Write failed.\n"); | ||
| 154 | } | 158 | } |
| 155 | 159 | ||
| 156 | static void rt73usb_bbp_read(struct rt2x00_dev *rt2x00dev, | 160 | static void rt73usb_bbp_read(struct rt2x00_dev *rt2x00dev, |
| @@ -164,11 +168,8 @@ static void rt73usb_bbp_read(struct rt2x00_dev *rt2x00dev, | |||
| 164 | * Wait until the BBP becomes ready. | 168 | * Wait until the BBP becomes ready. |
| 165 | */ | 169 | */ |
| 166 | reg = rt73usb_bbp_check(rt2x00dev); | 170 | reg = rt73usb_bbp_check(rt2x00dev); |
| 167 | if (rt2x00_get_field32(reg, PHY_CSR3_BUSY)) { | 171 | if (rt2x00_get_field32(reg, PHY_CSR3_BUSY)) |
| 168 | ERROR(rt2x00dev, "PHY_CSR3 register busy. Read failed.\n"); | 172 | goto exit_fail; |
| 169 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 170 | return; | ||
| 171 | } | ||
| 172 | 173 | ||
| 173 | /* | 174 | /* |
| 174 | * Write the request into the BBP. | 175 | * Write the request into the BBP. |
| @@ -184,14 +185,19 @@ static void rt73usb_bbp_read(struct rt2x00_dev *rt2x00dev, | |||
| 184 | * Wait until the BBP becomes ready. | 185 | * Wait until the BBP becomes ready. |
| 185 | */ | 186 | */ |
| 186 | reg = rt73usb_bbp_check(rt2x00dev); | 187 | reg = rt73usb_bbp_check(rt2x00dev); |
| 187 | if (rt2x00_get_field32(reg, PHY_CSR3_BUSY)) { | 188 | if (rt2x00_get_field32(reg, PHY_CSR3_BUSY)) |
| 188 | ERROR(rt2x00dev, "PHY_CSR3 register busy. Read failed.\n"); | 189 | goto exit_fail; |
| 189 | *value = 0xff; | ||
| 190 | return; | ||
| 191 | } | ||
| 192 | 190 | ||
| 193 | *value = rt2x00_get_field32(reg, PHY_CSR3_VALUE); | 191 | *value = rt2x00_get_field32(reg, PHY_CSR3_VALUE); |
| 194 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | 192 | mutex_unlock(&rt2x00dev->usb_cache_mutex); |
| 193 | |||
| 194 | return; | ||
| 195 | |||
| 196 | exit_fail: | ||
| 197 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 198 | |||
| 199 | ERROR(rt2x00dev, "PHY_CSR3 register busy. Read failed.\n"); | ||
| 200 | *value = 0xff; | ||
| 195 | } | 201 | } |
| 196 | 202 | ||
| 197 | static void rt73usb_rf_write(struct rt2x00_dev *rt2x00dev, | 203 | static void rt73usb_rf_write(struct rt2x00_dev *rt2x00dev, |
| @@ -1000,6 +1006,15 @@ static int rt73usb_init_registers(struct rt2x00_dev *rt2x00dev) | |||
| 1000 | rt2x00_set_field32(®, TXRX_CSR8_ACK_CTS_54MBS, 42); | 1006 | rt2x00_set_field32(®, TXRX_CSR8_ACK_CTS_54MBS, 42); |
| 1001 | rt73usb_register_write(rt2x00dev, TXRX_CSR8, reg); | 1007 | rt73usb_register_write(rt2x00dev, TXRX_CSR8, reg); |
| 1002 | 1008 | ||
| 1009 | rt73usb_register_read(rt2x00dev, TXRX_CSR9, ®); | ||
| 1010 | rt2x00_set_field32(®, TXRX_CSR9_BEACON_INTERVAL, 0); | ||
| 1011 | rt2x00_set_field32(®, TXRX_CSR9_TSF_TICKING, 0); | ||
| 1012 | rt2x00_set_field32(®, TXRX_CSR9_TSF_SYNC, 0); | ||
| 1013 | rt2x00_set_field32(®, TXRX_CSR9_TBTT_ENABLE, 0); | ||
| 1014 | rt2x00_set_field32(®, TXRX_CSR9_BEACON_GEN, 0); | ||
| 1015 | rt2x00_set_field32(®, TXRX_CSR9_TIMESTAMP_COMPENSATE, 0); | ||
| 1016 | rt73usb_register_write(rt2x00dev, TXRX_CSR9, reg); | ||
| 1017 | |||
| 1003 | rt73usb_register_write(rt2x00dev, TXRX_CSR15, 0x0000000f); | 1018 | rt73usb_register_write(rt2x00dev, TXRX_CSR15, 0x0000000f); |
| 1004 | 1019 | ||
| 1005 | rt73usb_register_read(rt2x00dev, MAC_CSR6, ®); | 1020 | rt73usb_register_read(rt2x00dev, MAC_CSR6, ®); |
diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c index 418606ac1c3b..694e95d35fd4 100644 --- a/drivers/net/wireless/zd1211rw/zd_mac.c +++ b/drivers/net/wireless/zd1211rw/zd_mac.c | |||
| @@ -765,6 +765,7 @@ static void zd_op_remove_interface(struct ieee80211_hw *hw, | |||
| 765 | { | 765 | { |
| 766 | struct zd_mac *mac = zd_hw_mac(hw); | 766 | struct zd_mac *mac = zd_hw_mac(hw); |
| 767 | mac->type = IEEE80211_IF_TYPE_INVALID; | 767 | mac->type = IEEE80211_IF_TYPE_INVALID; |
| 768 | zd_set_beacon_interval(&mac->chip, 0); | ||
| 768 | zd_write_mac_addr(&mac->chip, NULL); | 769 | zd_write_mac_addr(&mac->chip, NULL); |
| 769 | } | 770 | } |
| 770 | 771 | ||
diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c index 8941f5eb96c2..6cdad9764604 100644 --- a/drivers/net/wireless/zd1211rw/zd_usb.c +++ b/drivers/net/wireless/zd1211rw/zd_usb.c | |||
| @@ -64,6 +64,7 @@ static struct usb_device_id usb_ids[] = { | |||
| 64 | { USB_DEVICE(0x079b, 0x0062), .driver_info = DEVICE_ZD1211B }, | 64 | { USB_DEVICE(0x079b, 0x0062), .driver_info = DEVICE_ZD1211B }, |
| 65 | { USB_DEVICE(0x1582, 0x6003), .driver_info = DEVICE_ZD1211B }, | 65 | { USB_DEVICE(0x1582, 0x6003), .driver_info = DEVICE_ZD1211B }, |
| 66 | { USB_DEVICE(0x050d, 0x705c), .driver_info = DEVICE_ZD1211B }, | 66 | { USB_DEVICE(0x050d, 0x705c), .driver_info = DEVICE_ZD1211B }, |
| 67 | { USB_DEVICE(0x083a, 0xe506), .driver_info = DEVICE_ZD1211B }, | ||
| 67 | { USB_DEVICE(0x083a, 0x4505), .driver_info = DEVICE_ZD1211B }, | 68 | { USB_DEVICE(0x083a, 0x4505), .driver_info = DEVICE_ZD1211B }, |
| 68 | { USB_DEVICE(0x0471, 0x1236), .driver_info = DEVICE_ZD1211B }, | 69 | { USB_DEVICE(0x0471, 0x1236), .driver_info = DEVICE_ZD1211B }, |
| 69 | { USB_DEVICE(0x13b1, 0x0024), .driver_info = DEVICE_ZD1211B }, | 70 | { USB_DEVICE(0x13b1, 0x0024), .driver_info = DEVICE_ZD1211B }, |
diff --git a/drivers/pci/access.c b/drivers/pci/access.c index ec8f7002b09d..39bb96b413ef 100644 --- a/drivers/pci/access.c +++ b/drivers/pci/access.c | |||
| @@ -178,8 +178,7 @@ static int pci_vpd_pci22_read(struct pci_dev *dev, int pos, int size, | |||
| 178 | int ret; | 178 | int ret; |
| 179 | int begin, end, i; | 179 | int begin, end, i; |
| 180 | 180 | ||
| 181 | if (pos < 0 || pos > PCI_VPD_PCI22_SIZE || | 181 | if (pos < 0 || pos > vpd->base.len || size > vpd->base.len - pos) |
| 182 | size > PCI_VPD_PCI22_SIZE - pos) | ||
| 183 | return -EINVAL; | 182 | return -EINVAL; |
| 184 | if (size == 0) | 183 | if (size == 0) |
| 185 | return 0; | 184 | return 0; |
| @@ -223,8 +222,8 @@ static int pci_vpd_pci22_write(struct pci_dev *dev, int pos, int size, | |||
| 223 | u32 val; | 222 | u32 val; |
| 224 | int ret; | 223 | int ret; |
| 225 | 224 | ||
| 226 | if (pos < 0 || pos > PCI_VPD_PCI22_SIZE || pos & 3 || | 225 | if (pos < 0 || pos > vpd->base.len || pos & 3 || |
| 227 | size > PCI_VPD_PCI22_SIZE - pos || size < 4) | 226 | size > vpd->base.len - pos || size < 4) |
| 228 | return -EINVAL; | 227 | return -EINVAL; |
| 229 | 228 | ||
| 230 | val = (u8) *buf++; | 229 | val = (u8) *buf++; |
| @@ -255,11 +254,6 @@ out: | |||
| 255 | return 4; | 254 | return 4; |
| 256 | } | 255 | } |
| 257 | 256 | ||
| 258 | static int pci_vpd_pci22_get_size(struct pci_dev *dev) | ||
| 259 | { | ||
| 260 | return PCI_VPD_PCI22_SIZE; | ||
| 261 | } | ||
| 262 | |||
| 263 | static void pci_vpd_pci22_release(struct pci_dev *dev) | 257 | static void pci_vpd_pci22_release(struct pci_dev *dev) |
| 264 | { | 258 | { |
| 265 | kfree(container_of(dev->vpd, struct pci_vpd_pci22, base)); | 259 | kfree(container_of(dev->vpd, struct pci_vpd_pci22, base)); |
| @@ -268,7 +262,6 @@ static void pci_vpd_pci22_release(struct pci_dev *dev) | |||
| 268 | static struct pci_vpd_ops pci_vpd_pci22_ops = { | 262 | static struct pci_vpd_ops pci_vpd_pci22_ops = { |
| 269 | .read = pci_vpd_pci22_read, | 263 | .read = pci_vpd_pci22_read, |
| 270 | .write = pci_vpd_pci22_write, | 264 | .write = pci_vpd_pci22_write, |
| 271 | .get_size = pci_vpd_pci22_get_size, | ||
| 272 | .release = pci_vpd_pci22_release, | 265 | .release = pci_vpd_pci22_release, |
| 273 | }; | 266 | }; |
| 274 | 267 | ||
| @@ -284,6 +277,7 @@ int pci_vpd_pci22_init(struct pci_dev *dev) | |||
| 284 | if (!vpd) | 277 | if (!vpd) |
| 285 | return -ENOMEM; | 278 | return -ENOMEM; |
| 286 | 279 | ||
| 280 | vpd->base.len = PCI_VPD_PCI22_SIZE; | ||
| 287 | vpd->base.ops = &pci_vpd_pci22_ops; | 281 | vpd->base.ops = &pci_vpd_pci22_ops; |
| 288 | spin_lock_init(&vpd->lock); | 282 | spin_lock_init(&vpd->lock); |
| 289 | vpd->cap = cap; | 283 | vpd->cap = cap; |
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index 648596d469f6..91156f85a926 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
| @@ -700,9 +700,10 @@ cleanup_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv) | |||
| 700 | acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, (u32)1, | 700 | acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, (u32)1, |
| 701 | cleanup_p2p_bridge, NULL, NULL); | 701 | cleanup_p2p_bridge, NULL, NULL); |
| 702 | 702 | ||
| 703 | if (!(bridge = acpiphp_handle_to_bridge(handle))) | 703 | bridge = acpiphp_handle_to_bridge(handle); |
| 704 | return AE_OK; | 704 | if (bridge) |
| 705 | cleanup_bridge(bridge); | 705 | cleanup_bridge(bridge); |
| 706 | |||
| 706 | return AE_OK; | 707 | return AE_OK; |
| 707 | } | 708 | } |
| 708 | 709 | ||
| @@ -715,9 +716,19 @@ static void remove_bridge(acpi_handle handle) | |||
| 715 | acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, | 716 | acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, |
| 716 | (u32)1, cleanup_p2p_bridge, NULL, NULL); | 717 | (u32)1, cleanup_p2p_bridge, NULL, NULL); |
| 717 | 718 | ||
| 719 | /* | ||
| 720 | * On root bridges with hotplug slots directly underneath (ie, | ||
| 721 | * no p2p bridge inbetween), we call cleanup_bridge(). | ||
| 722 | * | ||
| 723 | * The else clause cleans up root bridges that either had no | ||
| 724 | * hotplug slots at all, or had a p2p bridge underneath. | ||
| 725 | */ | ||
| 718 | bridge = acpiphp_handle_to_bridge(handle); | 726 | bridge = acpiphp_handle_to_bridge(handle); |
| 719 | if (bridge) | 727 | if (bridge) |
| 720 | cleanup_bridge(bridge); | 728 | cleanup_bridge(bridge); |
| 729 | else | ||
| 730 | acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY, | ||
| 731 | handle_hotplug_event_bridge); | ||
| 721 | } | 732 | } |
| 722 | 733 | ||
| 723 | static struct pci_dev * get_apic_pci_info(acpi_handle handle) | 734 | static struct pci_dev * get_apic_pci_info(acpi_handle handle) |
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 6f3c7446c329..9c718583a237 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
| @@ -736,9 +736,9 @@ int __must_check pci_create_sysfs_dev_files (struct pci_dev *pdev) | |||
| 736 | attr = kzalloc(sizeof(*attr), GFP_ATOMIC); | 736 | attr = kzalloc(sizeof(*attr), GFP_ATOMIC); |
| 737 | if (attr) { | 737 | if (attr) { |
| 738 | pdev->vpd->attr = attr; | 738 | pdev->vpd->attr = attr; |
| 739 | attr->size = pdev->vpd->ops->get_size(pdev); | 739 | attr->size = pdev->vpd->len; |
| 740 | attr->attr.name = "vpd"; | 740 | attr->attr.name = "vpd"; |
| 741 | attr->attr.mode = S_IRUGO | S_IWUSR; | 741 | attr->attr.mode = S_IRUSR | S_IWUSR; |
| 742 | attr->read = pci_read_vpd; | 742 | attr->read = pci_read_vpd; |
| 743 | attr->write = pci_write_vpd; | 743 | attr->write = pci_write_vpd; |
| 744 | retval = sysfs_create_bin_file(&pdev->dev.kobj, attr); | 744 | retval = sysfs_create_bin_file(&pdev->dev.kobj, attr); |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 0a497c1b4227..00408c97e5fc 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
| @@ -21,11 +21,11 @@ extern int pci_user_write_config_dword(struct pci_dev *dev, int where, u32 val); | |||
| 21 | struct pci_vpd_ops { | 21 | struct pci_vpd_ops { |
| 22 | int (*read)(struct pci_dev *dev, int pos, int size, char *buf); | 22 | int (*read)(struct pci_dev *dev, int pos, int size, char *buf); |
| 23 | int (*write)(struct pci_dev *dev, int pos, int size, const char *buf); | 23 | int (*write)(struct pci_dev *dev, int pos, int size, const char *buf); |
| 24 | int (*get_size)(struct pci_dev *dev); | ||
| 25 | void (*release)(struct pci_dev *dev); | 24 | void (*release)(struct pci_dev *dev); |
| 26 | }; | 25 | }; |
| 27 | 26 | ||
| 28 | struct pci_vpd { | 27 | struct pci_vpd { |
| 28 | unsigned int len; | ||
| 29 | struct pci_vpd_ops *ops; | 29 | struct pci_vpd_ops *ops; |
| 30 | struct bin_attribute *attr; /* descriptor for sysfs VPD entry */ | 30 | struct bin_attribute *attr; /* descriptor for sysfs VPD entry */ |
| 31 | }; | 31 | }; |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index dabb563f51d9..338a3f94b4d4 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -1670,6 +1670,48 @@ static void __devinit quirk_via_cx700_pci_parking_caching(struct pci_dev *dev) | |||
| 1670 | } | 1670 | } |
| 1671 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_VIA, 0x324e, quirk_via_cx700_pci_parking_caching); | 1671 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_VIA, 0x324e, quirk_via_cx700_pci_parking_caching); |
| 1672 | 1672 | ||
| 1673 | /* | ||
| 1674 | * For Broadcom 5706, 5708, 5709 rev. A nics, any read beyond the | ||
| 1675 | * VPD end tag will hang the device. This problem was initially | ||
| 1676 | * observed when a vpd entry was created in sysfs | ||
| 1677 | * ('/sys/bus/pci/devices/<id>/vpd'). A read to this sysfs entry | ||
| 1678 | * will dump 32k of data. Reading a full 32k will cause an access | ||
| 1679 | * beyond the VPD end tag causing the device to hang. Once the device | ||
| 1680 | * is hung, the bnx2 driver will not be able to reset the device. | ||
| 1681 | * We believe that it is legal to read beyond the end tag and | ||
| 1682 | * therefore the solution is to limit the read/write length. | ||
| 1683 | */ | ||
| 1684 | static void __devinit quirk_brcm_570x_limit_vpd(struct pci_dev *dev) | ||
| 1685 | { | ||
| 1686 | /* Only disable the VPD capability for 5706, 5708, and 5709 rev. A */ | ||
| 1687 | if ((dev->device == PCI_DEVICE_ID_NX2_5706) || | ||
| 1688 | (dev->device == PCI_DEVICE_ID_NX2_5708) || | ||
| 1689 | ((dev->device == PCI_DEVICE_ID_NX2_5709) && | ||
| 1690 | (dev->revision & 0xf0) == 0x0)) { | ||
| 1691 | if (dev->vpd) | ||
| 1692 | dev->vpd->len = 0x80; | ||
| 1693 | } | ||
| 1694 | } | ||
| 1695 | |||
| 1696 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, | ||
| 1697 | PCI_DEVICE_ID_NX2_5706, | ||
| 1698 | quirk_brcm_570x_limit_vpd); | ||
| 1699 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, | ||
| 1700 | PCI_DEVICE_ID_NX2_5706S, | ||
| 1701 | quirk_brcm_570x_limit_vpd); | ||
| 1702 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, | ||
| 1703 | PCI_DEVICE_ID_NX2_5708, | ||
| 1704 | quirk_brcm_570x_limit_vpd); | ||
| 1705 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, | ||
| 1706 | PCI_DEVICE_ID_NX2_5708S, | ||
| 1707 | quirk_brcm_570x_limit_vpd); | ||
| 1708 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, | ||
| 1709 | PCI_DEVICE_ID_NX2_5709, | ||
| 1710 | quirk_brcm_570x_limit_vpd); | ||
| 1711 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, | ||
| 1712 | PCI_DEVICE_ID_NX2_5709S, | ||
| 1713 | quirk_brcm_570x_limit_vpd); | ||
| 1714 | |||
| 1673 | #ifdef CONFIG_PCI_MSI | 1715 | #ifdef CONFIG_PCI_MSI |
| 1674 | /* Some chipsets do not support MSI. We cannot easily rely on setting | 1716 | /* Some chipsets do not support MSI. We cannot easily rely on setting |
| 1675 | * PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually | 1717 | * PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually |
| @@ -1685,6 +1727,7 @@ static void __init quirk_disable_all_msi(struct pci_dev *dev) | |||
| 1685 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_disable_all_msi); | 1727 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_disable_all_msi); |
| 1686 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_disable_all_msi); | 1728 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_disable_all_msi); |
| 1687 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_all_msi); | 1729 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_all_msi); |
| 1730 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3336, quirk_disable_all_msi); | ||
| 1688 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3351, quirk_disable_all_msi); | 1731 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3351, quirk_disable_all_msi); |
| 1689 | 1732 | ||
| 1690 | /* Disable MSI on chipsets that are known to not support it */ | 1733 | /* Disable MSI on chipsets that are known to not support it */ |
diff --git a/drivers/rapidio/rio-driver.c b/drivers/rapidio/rio-driver.c index 3ce9f3defc12..956d3e79f6aa 100644 --- a/drivers/rapidio/rio-driver.c +++ b/drivers/rapidio/rio-driver.c | |||
| @@ -101,8 +101,8 @@ static int rio_device_probe(struct device *dev) | |||
| 101 | if (error >= 0) { | 101 | if (error >= 0) { |
| 102 | rdev->driver = rdrv; | 102 | rdev->driver = rdrv; |
| 103 | error = 0; | 103 | error = 0; |
| 104 | } else | ||
| 104 | rio_dev_put(rdev); | 105 | rio_dev_put(rdev); |
| 105 | } | ||
| 106 | } | 106 | } |
| 107 | return error; | 107 | return error; |
| 108 | } | 108 | } |
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index 7e3ad4f3b343..58b7336640ff 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c | |||
| @@ -126,12 +126,25 @@ int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | |||
| 126 | int err; | 126 | int err; |
| 127 | struct rtc_time before, now; | 127 | struct rtc_time before, now; |
| 128 | int first_time = 1; | 128 | int first_time = 1; |
| 129 | unsigned long t_now, t_alm; | ||
| 130 | enum { none, day, month, year } missing = none; | ||
| 131 | unsigned days; | ||
| 129 | 132 | ||
| 130 | /* The lower level RTC driver may not be capable of filling | 133 | /* The lower level RTC driver may return -1 in some fields, |
| 131 | * in all fields of the rtc_time struct (eg. rtc-cmos), | 134 | * creating invalid alarm->time values, for reasons like: |
| 132 | * and so might instead return -1 in some fields. | 135 | * |
| 133 | * We deal with that here by grabbing a current RTC timestamp | 136 | * - The hardware may not be capable of filling them in; |
| 134 | * and using values from that for any missing (-1) values. | 137 | * many alarms match only on time-of-day fields, not |
| 138 | * day/month/year calendar data. | ||
| 139 | * | ||
| 140 | * - Some hardware uses illegal values as "wildcard" match | ||
| 141 | * values, which non-Linux firmware (like a BIOS) may try | ||
| 142 | * to set up as e.g. "alarm 15 minutes after each hour". | ||
| 143 | * Linux uses only oneshot alarms. | ||
| 144 | * | ||
| 145 | * When we see that here, we deal with it by using values from | ||
| 146 | * a current RTC timestamp for any missing (-1) values. The | ||
| 147 | * RTC driver prevents "periodic alarm" modes. | ||
| 135 | * | 148 | * |
| 136 | * But this can be racey, because some fields of the RTC timestamp | 149 | * But this can be racey, because some fields of the RTC timestamp |
| 137 | * may have wrapped in the interval since we read the RTC alarm, | 150 | * may have wrapped in the interval since we read the RTC alarm, |
| @@ -174,6 +187,10 @@ int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | |||
| 174 | if (!alarm->enabled) | 187 | if (!alarm->enabled) |
| 175 | return 0; | 188 | return 0; |
| 176 | 189 | ||
| 190 | /* full-function RTCs won't have such missing fields */ | ||
| 191 | if (rtc_valid_tm(&alarm->time) == 0) | ||
| 192 | return 0; | ||
| 193 | |||
| 177 | /* get the "after" timestamp, to detect wrapped fields */ | 194 | /* get the "after" timestamp, to detect wrapped fields */ |
| 178 | err = rtc_read_time(rtc, &now); | 195 | err = rtc_read_time(rtc, &now); |
| 179 | if (err < 0) | 196 | if (err < 0) |
| @@ -183,22 +200,85 @@ int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | |||
| 183 | } while ( before.tm_min != now.tm_min | 200 | } while ( before.tm_min != now.tm_min |
| 184 | || before.tm_hour != now.tm_hour | 201 | || before.tm_hour != now.tm_hour |
| 185 | || before.tm_mon != now.tm_mon | 202 | || before.tm_mon != now.tm_mon |
| 186 | || before.tm_year != now.tm_year | 203 | || before.tm_year != now.tm_year); |
| 187 | || before.tm_isdst != now.tm_isdst); | ||
| 188 | 204 | ||
| 189 | /* Fill in any missing alarm fields using the timestamp */ | 205 | /* Fill in the missing alarm fields using the timestamp; we |
| 206 | * know there's at least one since alarm->time is invalid. | ||
| 207 | */ | ||
| 190 | if (alarm->time.tm_sec == -1) | 208 | if (alarm->time.tm_sec == -1) |
| 191 | alarm->time.tm_sec = now.tm_sec; | 209 | alarm->time.tm_sec = now.tm_sec; |
| 192 | if (alarm->time.tm_min == -1) | 210 | if (alarm->time.tm_min == -1) |
| 193 | alarm->time.tm_min = now.tm_min; | 211 | alarm->time.tm_min = now.tm_min; |
| 194 | if (alarm->time.tm_hour == -1) | 212 | if (alarm->time.tm_hour == -1) |
| 195 | alarm->time.tm_hour = now.tm_hour; | 213 | alarm->time.tm_hour = now.tm_hour; |
| 196 | if (alarm->time.tm_mday == -1) | 214 | |
| 215 | /* For simplicity, only support date rollover for now */ | ||
| 216 | if (alarm->time.tm_mday == -1) { | ||
| 197 | alarm->time.tm_mday = now.tm_mday; | 217 | alarm->time.tm_mday = now.tm_mday; |
| 198 | if (alarm->time.tm_mon == -1) | 218 | missing = day; |
| 219 | } | ||
| 220 | if (alarm->time.tm_mon == -1) { | ||
| 199 | alarm->time.tm_mon = now.tm_mon; | 221 | alarm->time.tm_mon = now.tm_mon; |
| 200 | if (alarm->time.tm_year == -1) | 222 | if (missing == none) |
| 223 | missing = month; | ||
| 224 | } | ||
| 225 | if (alarm->time.tm_year == -1) { | ||
| 201 | alarm->time.tm_year = now.tm_year; | 226 | alarm->time.tm_year = now.tm_year; |
| 227 | if (missing == none) | ||
| 228 | missing = year; | ||
| 229 | } | ||
| 230 | |||
| 231 | /* with luck, no rollover is needed */ | ||
| 232 | rtc_tm_to_time(&now, &t_now); | ||
| 233 | rtc_tm_to_time(&alarm->time, &t_alm); | ||
| 234 | if (t_now < t_alm) | ||
| 235 | goto done; | ||
| 236 | |||
| 237 | switch (missing) { | ||
| 238 | |||
| 239 | /* 24 hour rollover ... if it's now 10am Monday, an alarm that | ||
| 240 | * that will trigger at 5am will do so at 5am Tuesday, which | ||
| 241 | * could also be in the next month or year. This is a common | ||
| 242 | * case, especially for PCs. | ||
| 243 | */ | ||
| 244 | case day: | ||
| 245 | dev_dbg(&rtc->dev, "alarm rollover: %s\n", "day"); | ||
| 246 | t_alm += 24 * 60 * 60; | ||
| 247 | rtc_time_to_tm(t_alm, &alarm->time); | ||
| 248 | break; | ||
| 249 | |||
| 250 | /* Month rollover ... if it's the 31th, an alarm on the 3rd will | ||
| 251 | * be next month. An alarm matching on the 30th, 29th, or 28th | ||
| 252 | * may end up in the month after that! Many newer PCs support | ||
| 253 | * this type of alarm. | ||
| 254 | */ | ||
| 255 | case month: | ||
| 256 | dev_dbg(&rtc->dev, "alarm rollover: %s\n", "month"); | ||
| 257 | do { | ||
| 258 | if (alarm->time.tm_mon < 11) | ||
| 259 | alarm->time.tm_mon++; | ||
| 260 | else { | ||
| 261 | alarm->time.tm_mon = 0; | ||
| 262 | alarm->time.tm_year++; | ||
| 263 | } | ||
| 264 | days = rtc_month_days(alarm->time.tm_mon, | ||
| 265 | alarm->time.tm_year); | ||
| 266 | } while (days < alarm->time.tm_mday); | ||
| 267 | break; | ||
| 268 | |||
| 269 | /* Year rollover ... easy except for leap years! */ | ||
| 270 | case year: | ||
| 271 | dev_dbg(&rtc->dev, "alarm rollover: %s\n", "year"); | ||
| 272 | do { | ||
| 273 | alarm->time.tm_year++; | ||
| 274 | } while (!rtc_valid_tm(&alarm->time)); | ||
| 275 | break; | ||
| 276 | |||
| 277 | default: | ||
| 278 | dev_warn(&rtc->dev, "alarm rollover not handled\n"); | ||
| 279 | } | ||
| 280 | |||
| 281 | done: | ||
| 202 | return 0; | 282 | return 0; |
| 203 | } | 283 | } |
| 204 | EXPORT_SYMBOL_GPL(rtc_read_alarm); | 284 | EXPORT_SYMBOL_GPL(rtc_read_alarm); |
diff --git a/drivers/rtc/rtc-fm3130.c b/drivers/rtc/rtc-fm3130.c index 11644c8fca82..abfdfcbaa059 100644 --- a/drivers/rtc/rtc-fm3130.c +++ b/drivers/rtc/rtc-fm3130.c | |||
| @@ -55,7 +55,7 @@ struct fm3130 { | |||
| 55 | int alarm; | 55 | int alarm; |
| 56 | }; | 56 | }; |
| 57 | static const struct i2c_device_id fm3130_id[] = { | 57 | static const struct i2c_device_id fm3130_id[] = { |
| 58 | { "fm3130-rtc", 0 }, | 58 | { "fm3130", 0 }, |
| 59 | { } | 59 | { } |
| 60 | }; | 60 | }; |
| 61 | MODULE_DEVICE_TABLE(i2c, fm3130_id); | 61 | MODULE_DEVICE_TABLE(i2c, fm3130_id); |
diff --git a/drivers/rtc/rtc-pcf8563.c b/drivers/rtc/rtc-pcf8563.c index 0fc4c3630780..748a502a6355 100644 --- a/drivers/rtc/rtc-pcf8563.c +++ b/drivers/rtc/rtc-pcf8563.c | |||
| @@ -302,6 +302,7 @@ static int pcf8563_remove(struct i2c_client *client) | |||
| 302 | 302 | ||
| 303 | static const struct i2c_device_id pcf8563_id[] = { | 303 | static const struct i2c_device_id pcf8563_id[] = { |
| 304 | { "pcf8563", 0 }, | 304 | { "pcf8563", 0 }, |
| 305 | { "rtc8564", 0 }, | ||
| 305 | { } | 306 | { } |
| 306 | }; | 307 | }; |
| 307 | MODULE_DEVICE_TABLE(i2c, pcf8563_id); | 308 | MODULE_DEVICE_TABLE(i2c, pcf8563_id); |
diff --git a/drivers/rtc/rtc-sa1100.c b/drivers/rtc/rtc-sa1100.c index 82f62d25f921..67421b0d3a7b 100644 --- a/drivers/rtc/rtc-sa1100.c +++ b/drivers/rtc/rtc-sa1100.c | |||
| @@ -331,14 +331,14 @@ static int sa1100_rtc_probe(struct platform_device *pdev) | |||
| 331 | RCNR = 0; | 331 | RCNR = 0; |
| 332 | } | 332 | } |
| 333 | 333 | ||
| 334 | device_init_wakeup(&pdev->dev, 1); | ||
| 335 | |||
| 334 | rtc = rtc_device_register(pdev->name, &pdev->dev, &sa1100_rtc_ops, | 336 | rtc = rtc_device_register(pdev->name, &pdev->dev, &sa1100_rtc_ops, |
| 335 | THIS_MODULE); | 337 | THIS_MODULE); |
| 336 | 338 | ||
| 337 | if (IS_ERR(rtc)) | 339 | if (IS_ERR(rtc)) |
| 338 | return PTR_ERR(rtc); | 340 | return PTR_ERR(rtc); |
| 339 | 341 | ||
| 340 | device_init_wakeup(&pdev->dev, 1); | ||
| 341 | |||
| 342 | platform_set_drvdata(pdev, rtc); | 342 | platform_set_drvdata(pdev, rtc); |
| 343 | 343 | ||
| 344 | return 0; | 344 | return 0; |
diff --git a/drivers/rtc/rtc-x1205.c b/drivers/rtc/rtc-x1205.c index eaf55945f21b..7dcfba1bbfe1 100644 --- a/drivers/rtc/rtc-x1205.c +++ b/drivers/rtc/rtc-x1205.c | |||
| @@ -71,6 +71,7 @@ | |||
| 71 | #define X1205_SR_RTCF 0x01 /* Clock failure */ | 71 | #define X1205_SR_RTCF 0x01 /* Clock failure */ |
| 72 | #define X1205_SR_WEL 0x02 /* Write Enable Latch */ | 72 | #define X1205_SR_WEL 0x02 /* Write Enable Latch */ |
| 73 | #define X1205_SR_RWEL 0x04 /* Register Write Enable */ | 73 | #define X1205_SR_RWEL 0x04 /* Register Write Enable */ |
| 74 | #define X1205_SR_AL0 0x20 /* Alarm 0 match */ | ||
| 74 | 75 | ||
| 75 | #define X1205_DTR_DTR0 0x01 | 76 | #define X1205_DTR_DTR0 0x01 |
| 76 | #define X1205_DTR_DTR1 0x02 | 77 | #define X1205_DTR_DTR1 0x02 |
| @@ -78,6 +79,8 @@ | |||
| 78 | 79 | ||
| 79 | #define X1205_HR_MIL 0x80 /* Set in ccr.hour for 24 hr mode */ | 80 | #define X1205_HR_MIL 0x80 /* Set in ccr.hour for 24 hr mode */ |
| 80 | 81 | ||
| 82 | #define X1205_INT_AL0E 0x20 /* Alarm 0 enable */ | ||
| 83 | |||
| 81 | static struct i2c_driver x1205_driver; | 84 | static struct i2c_driver x1205_driver; |
| 82 | 85 | ||
| 83 | /* | 86 | /* |
| @@ -89,8 +92,8 @@ static int x1205_get_datetime(struct i2c_client *client, struct rtc_time *tm, | |||
| 89 | unsigned char reg_base) | 92 | unsigned char reg_base) |
| 90 | { | 93 | { |
| 91 | unsigned char dt_addr[2] = { 0, reg_base }; | 94 | unsigned char dt_addr[2] = { 0, reg_base }; |
| 92 | |||
| 93 | unsigned char buf[8]; | 95 | unsigned char buf[8]; |
| 96 | int i; | ||
| 94 | 97 | ||
| 95 | struct i2c_msg msgs[] = { | 98 | struct i2c_msg msgs[] = { |
| 96 | { client->addr, 0, 2, dt_addr }, /* setup read ptr */ | 99 | { client->addr, 0, 2, dt_addr }, /* setup read ptr */ |
| @@ -98,7 +101,7 @@ static int x1205_get_datetime(struct i2c_client *client, struct rtc_time *tm, | |||
| 98 | }; | 101 | }; |
| 99 | 102 | ||
| 100 | /* read date registers */ | 103 | /* read date registers */ |
| 101 | if ((i2c_transfer(client->adapter, &msgs[0], 2)) != 2) { | 104 | if (i2c_transfer(client->adapter, &msgs[0], 2) != 2) { |
| 102 | dev_err(&client->dev, "%s: read error\n", __func__); | 105 | dev_err(&client->dev, "%s: read error\n", __func__); |
| 103 | return -EIO; | 106 | return -EIO; |
| 104 | } | 107 | } |
| @@ -110,6 +113,11 @@ static int x1205_get_datetime(struct i2c_client *client, struct rtc_time *tm, | |||
| 110 | buf[0], buf[1], buf[2], buf[3], | 113 | buf[0], buf[1], buf[2], buf[3], |
| 111 | buf[4], buf[5], buf[6], buf[7]); | 114 | buf[4], buf[5], buf[6], buf[7]); |
| 112 | 115 | ||
| 116 | /* Mask out the enable bits if these are alarm registers */ | ||
| 117 | if (reg_base < X1205_CCR_BASE) | ||
| 118 | for (i = 0; i <= 4; i++) | ||
| 119 | buf[i] &= 0x7F; | ||
| 120 | |||
| 113 | tm->tm_sec = BCD2BIN(buf[CCR_SEC]); | 121 | tm->tm_sec = BCD2BIN(buf[CCR_SEC]); |
| 114 | tm->tm_min = BCD2BIN(buf[CCR_MIN]); | 122 | tm->tm_min = BCD2BIN(buf[CCR_MIN]); |
| 115 | tm->tm_hour = BCD2BIN(buf[CCR_HOUR] & 0x3F); /* hr is 0-23 */ | 123 | tm->tm_hour = BCD2BIN(buf[CCR_HOUR] & 0x3F); /* hr is 0-23 */ |
| @@ -138,7 +146,7 @@ static int x1205_get_status(struct i2c_client *client, unsigned char *sr) | |||
| 138 | }; | 146 | }; |
| 139 | 147 | ||
| 140 | /* read status register */ | 148 | /* read status register */ |
| 141 | if ((i2c_transfer(client->adapter, &msgs[0], 2)) != 2) { | 149 | if (i2c_transfer(client->adapter, &msgs[0], 2) != 2) { |
| 142 | dev_err(&client->dev, "%s: read error\n", __func__); | 150 | dev_err(&client->dev, "%s: read error\n", __func__); |
| 143 | return -EIO; | 151 | return -EIO; |
| 144 | } | 152 | } |
| @@ -147,10 +155,11 @@ static int x1205_get_status(struct i2c_client *client, unsigned char *sr) | |||
| 147 | } | 155 | } |
| 148 | 156 | ||
| 149 | static int x1205_set_datetime(struct i2c_client *client, struct rtc_time *tm, | 157 | static int x1205_set_datetime(struct i2c_client *client, struct rtc_time *tm, |
| 150 | int datetoo, u8 reg_base) | 158 | int datetoo, u8 reg_base, unsigned char alm_enable) |
| 151 | { | 159 | { |
| 152 | int i, xfer; | 160 | int i, xfer, nbytes; |
| 153 | unsigned char buf[8]; | 161 | unsigned char buf[8]; |
| 162 | unsigned char rdata[10] = { 0, reg_base }; | ||
| 154 | 163 | ||
| 155 | static const unsigned char wel[3] = { 0, X1205_REG_SR, | 164 | static const unsigned char wel[3] = { 0, X1205_REG_SR, |
| 156 | X1205_SR_WEL }; | 165 | X1205_SR_WEL }; |
| @@ -189,6 +198,11 @@ static int x1205_set_datetime(struct i2c_client *client, struct rtc_time *tm, | |||
| 189 | buf[CCR_Y2K] = BIN2BCD(tm->tm_year / 100); | 198 | buf[CCR_Y2K] = BIN2BCD(tm->tm_year / 100); |
| 190 | } | 199 | } |
| 191 | 200 | ||
| 201 | /* If writing alarm registers, set compare bits on registers 0-4 */ | ||
| 202 | if (reg_base < X1205_CCR_BASE) | ||
| 203 | for (i = 0; i <= 4; i++) | ||
| 204 | buf[i] |= 0x80; | ||
| 205 | |||
| 192 | /* this sequence is required to unlock the chip */ | 206 | /* this sequence is required to unlock the chip */ |
| 193 | if ((xfer = i2c_master_send(client, wel, 3)) != 3) { | 207 | if ((xfer = i2c_master_send(client, wel, 3)) != 3) { |
| 194 | dev_err(&client->dev, "%s: wel - %d\n", __func__, xfer); | 208 | dev_err(&client->dev, "%s: wel - %d\n", __func__, xfer); |
| @@ -200,19 +214,57 @@ static int x1205_set_datetime(struct i2c_client *client, struct rtc_time *tm, | |||
| 200 | return -EIO; | 214 | return -EIO; |
| 201 | } | 215 | } |
| 202 | 216 | ||
| 217 | |||
| 203 | /* write register's data */ | 218 | /* write register's data */ |
| 204 | for (i = 0; i < (datetoo ? 8 : 3); i++) { | 219 | if (datetoo) |
| 205 | unsigned char rdata[3] = { 0, reg_base + i, buf[i] }; | 220 | nbytes = 8; |
| 221 | else | ||
| 222 | nbytes = 3; | ||
| 223 | for (i = 0; i < nbytes; i++) | ||
| 224 | rdata[2+i] = buf[i]; | ||
| 225 | |||
| 226 | xfer = i2c_master_send(client, rdata, nbytes+2); | ||
| 227 | if (xfer != nbytes+2) { | ||
| 228 | dev_err(&client->dev, | ||
| 229 | "%s: result=%d addr=%02x, data=%02x\n", | ||
| 230 | __func__, | ||
| 231 | xfer, rdata[1], rdata[2]); | ||
| 232 | return -EIO; | ||
| 233 | } | ||
| 234 | |||
| 235 | /* If we wrote to the nonvolatile region, wait 10msec for write cycle*/ | ||
| 236 | if (reg_base < X1205_CCR_BASE) { | ||
| 237 | unsigned char al0e[3] = { 0, X1205_REG_INT, 0 }; | ||
| 238 | |||
| 239 | msleep(10); | ||
| 206 | 240 | ||
| 207 | xfer = i2c_master_send(client, rdata, 3); | 241 | /* ...and set or clear the AL0E bit in the INT register */ |
| 242 | |||
| 243 | /* Need to set RWEL again as the write has cleared it */ | ||
| 244 | xfer = i2c_master_send(client, rwel, 3); | ||
| 208 | if (xfer != 3) { | 245 | if (xfer != 3) { |
| 209 | dev_err(&client->dev, | 246 | dev_err(&client->dev, |
| 210 | "%s: xfer=%d addr=%02x, data=%02x\n", | 247 | "%s: aloe rwel - %d\n", |
| 211 | __func__, | 248 | __func__, |
| 212 | xfer, rdata[1], rdata[2]); | 249 | xfer); |
| 250 | return -EIO; | ||
| 251 | } | ||
| 252 | |||
| 253 | if (alm_enable) | ||
| 254 | al0e[2] = X1205_INT_AL0E; | ||
| 255 | |||
| 256 | xfer = i2c_master_send(client, al0e, 3); | ||
| 257 | if (xfer != 3) { | ||
| 258 | dev_err(&client->dev, | ||
| 259 | "%s: al0e - %d\n", | ||
| 260 | __func__, | ||
| 261 | xfer); | ||
| 213 | return -EIO; | 262 | return -EIO; |
| 214 | } | 263 | } |
| 215 | }; | 264 | |
| 265 | /* and wait 10msec again for this write to complete */ | ||
| 266 | msleep(10); | ||
| 267 | } | ||
| 216 | 268 | ||
| 217 | /* disable further writes */ | 269 | /* disable further writes */ |
| 218 | if ((xfer = i2c_master_send(client, diswe, 3)) != 3) { | 270 | if ((xfer = i2c_master_send(client, diswe, 3)) != 3) { |
| @@ -230,9 +282,9 @@ static int x1205_fix_osc(struct i2c_client *client) | |||
| 230 | 282 | ||
| 231 | tm.tm_hour = tm.tm_min = tm.tm_sec = 0; | 283 | tm.tm_hour = tm.tm_min = tm.tm_sec = 0; |
| 232 | 284 | ||
| 233 | if ((err = x1205_set_datetime(client, &tm, 0, X1205_CCR_BASE)) < 0) | 285 | err = x1205_set_datetime(client, &tm, 0, X1205_CCR_BASE, 0); |
| 234 | dev_err(&client->dev, | 286 | if (err < 0) |
| 235 | "unable to restart the oscillator\n"); | 287 | dev_err(&client->dev, "unable to restart the oscillator\n"); |
| 236 | 288 | ||
| 237 | return err; | 289 | return err; |
| 238 | } | 290 | } |
| @@ -248,7 +300,7 @@ static int x1205_get_dtrim(struct i2c_client *client, int *trim) | |||
| 248 | }; | 300 | }; |
| 249 | 301 | ||
| 250 | /* read dtr register */ | 302 | /* read dtr register */ |
| 251 | if ((i2c_transfer(client->adapter, &msgs[0], 2)) != 2) { | 303 | if (i2c_transfer(client->adapter, &msgs[0], 2) != 2) { |
| 252 | dev_err(&client->dev, "%s: read error\n", __func__); | 304 | dev_err(&client->dev, "%s: read error\n", __func__); |
| 253 | return -EIO; | 305 | return -EIO; |
| 254 | } | 306 | } |
| @@ -280,7 +332,7 @@ static int x1205_get_atrim(struct i2c_client *client, int *trim) | |||
| 280 | }; | 332 | }; |
| 281 | 333 | ||
| 282 | /* read atr register */ | 334 | /* read atr register */ |
| 283 | if ((i2c_transfer(client->adapter, &msgs[0], 2)) != 2) { | 335 | if (i2c_transfer(client->adapter, &msgs[0], 2) != 2) { |
| 284 | dev_err(&client->dev, "%s: read error\n", __func__); | 336 | dev_err(&client->dev, "%s: read error\n", __func__); |
| 285 | return -EIO; | 337 | return -EIO; |
| 286 | } | 338 | } |
| @@ -403,14 +455,33 @@ static int x1205_validate_client(struct i2c_client *client) | |||
| 403 | 455 | ||
| 404 | static int x1205_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | 456 | static int x1205_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) |
| 405 | { | 457 | { |
| 406 | return x1205_get_datetime(to_i2c_client(dev), | 458 | int err; |
| 407 | &alrm->time, X1205_ALM0_BASE); | 459 | unsigned char intreg, status; |
| 460 | static unsigned char int_addr[2] = { 0, X1205_REG_INT }; | ||
| 461 | struct i2c_client *client = to_i2c_client(dev); | ||
| 462 | struct i2c_msg msgs[] = { | ||
| 463 | { client->addr, 0, 2, int_addr }, /* setup read ptr */ | ||
| 464 | { client->addr, I2C_M_RD, 1, &intreg }, /* read INT register */ | ||
| 465 | }; | ||
| 466 | |||
| 467 | /* read interrupt register and status register */ | ||
| 468 | if (i2c_transfer(client->adapter, &msgs[0], 2) != 2) { | ||
| 469 | dev_err(&client->dev, "%s: read error\n", __func__); | ||
| 470 | return -EIO; | ||
| 471 | } | ||
| 472 | err = x1205_get_status(client, &status); | ||
| 473 | if (err == 0) { | ||
| 474 | alrm->pending = (status & X1205_SR_AL0) ? 1 : 0; | ||
| 475 | alrm->enabled = (intreg & X1205_INT_AL0E) ? 1 : 0; | ||
| 476 | err = x1205_get_datetime(client, &alrm->time, X1205_ALM0_BASE); | ||
| 477 | } | ||
| 478 | return err; | ||
| 408 | } | 479 | } |
| 409 | 480 | ||
| 410 | static int x1205_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | 481 | static int x1205_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) |
| 411 | { | 482 | { |
| 412 | return x1205_set_datetime(to_i2c_client(dev), | 483 | return x1205_set_datetime(to_i2c_client(dev), |
| 413 | &alrm->time, 1, X1205_ALM0_BASE); | 484 | &alrm->time, 1, X1205_ALM0_BASE, alrm->enabled); |
| 414 | } | 485 | } |
| 415 | 486 | ||
| 416 | static int x1205_rtc_read_time(struct device *dev, struct rtc_time *tm) | 487 | static int x1205_rtc_read_time(struct device *dev, struct rtc_time *tm) |
| @@ -422,7 +493,7 @@ static int x1205_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 422 | static int x1205_rtc_set_time(struct device *dev, struct rtc_time *tm) | 493 | static int x1205_rtc_set_time(struct device *dev, struct rtc_time *tm) |
| 423 | { | 494 | { |
| 424 | return x1205_set_datetime(to_i2c_client(dev), | 495 | return x1205_set_datetime(to_i2c_client(dev), |
| 425 | tm, 1, X1205_CCR_BASE); | 496 | tm, 1, X1205_CCR_BASE, 0); |
| 426 | } | 497 | } |
| 427 | 498 | ||
| 428 | static int x1205_rtc_proc(struct device *dev, struct seq_file *seq) | 499 | static int x1205_rtc_proc(struct device *dev, struct seq_file *seq) |
diff --git a/drivers/scsi/esp_scsi.c b/drivers/scsi/esp_scsi.c index a0b6d414953d..59fbef08d690 100644 --- a/drivers/scsi/esp_scsi.c +++ b/drivers/scsi/esp_scsi.c | |||
| @@ -2359,6 +2359,24 @@ void scsi_esp_unregister(struct esp *esp) | |||
| 2359 | } | 2359 | } |
| 2360 | EXPORT_SYMBOL(scsi_esp_unregister); | 2360 | EXPORT_SYMBOL(scsi_esp_unregister); |
| 2361 | 2361 | ||
| 2362 | static int esp_target_alloc(struct scsi_target *starget) | ||
| 2363 | { | ||
| 2364 | struct esp *esp = shost_priv(dev_to_shost(&starget->dev)); | ||
| 2365 | struct esp_target_data *tp = &esp->target[starget->id]; | ||
| 2366 | |||
| 2367 | tp->starget = starget; | ||
| 2368 | |||
| 2369 | return 0; | ||
| 2370 | } | ||
| 2371 | |||
| 2372 | static void esp_target_destroy(struct scsi_target *starget) | ||
| 2373 | { | ||
| 2374 | struct esp *esp = shost_priv(dev_to_shost(&starget->dev)); | ||
| 2375 | struct esp_target_data *tp = &esp->target[starget->id]; | ||
| 2376 | |||
| 2377 | tp->starget = NULL; | ||
| 2378 | } | ||
| 2379 | |||
| 2362 | static int esp_slave_alloc(struct scsi_device *dev) | 2380 | static int esp_slave_alloc(struct scsi_device *dev) |
| 2363 | { | 2381 | { |
| 2364 | struct esp *esp = shost_priv(dev->host); | 2382 | struct esp *esp = shost_priv(dev->host); |
| @@ -2370,8 +2388,6 @@ static int esp_slave_alloc(struct scsi_device *dev) | |||
| 2370 | return -ENOMEM; | 2388 | return -ENOMEM; |
| 2371 | dev->hostdata = lp; | 2389 | dev->hostdata = lp; |
| 2372 | 2390 | ||
| 2373 | tp->starget = dev->sdev_target; | ||
| 2374 | |||
| 2375 | spi_min_period(tp->starget) = esp->min_period; | 2391 | spi_min_period(tp->starget) = esp->min_period; |
| 2376 | spi_max_offset(tp->starget) = 15; | 2392 | spi_max_offset(tp->starget) = 15; |
| 2377 | 2393 | ||
| @@ -2608,6 +2624,8 @@ struct scsi_host_template scsi_esp_template = { | |||
| 2608 | .name = "esp", | 2624 | .name = "esp", |
| 2609 | .info = esp_info, | 2625 | .info = esp_info, |
| 2610 | .queuecommand = esp_queuecommand, | 2626 | .queuecommand = esp_queuecommand, |
| 2627 | .target_alloc = esp_target_alloc, | ||
| 2628 | .target_destroy = esp_target_destroy, | ||
| 2611 | .slave_alloc = esp_slave_alloc, | 2629 | .slave_alloc = esp_slave_alloc, |
| 2612 | .slave_configure = esp_slave_configure, | 2630 | .slave_configure = esp_slave_configure, |
| 2613 | .slave_destroy = esp_slave_destroy, | 2631 | .slave_destroy = esp_slave_destroy, |
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 999e91ea7451..e7a3a6554425 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
| @@ -71,6 +71,7 @@ | |||
| 71 | #include <linux/module.h> | 71 | #include <linux/module.h> |
| 72 | #include <linux/moduleparam.h> | 72 | #include <linux/moduleparam.h> |
| 73 | #include <linux/libata.h> | 73 | #include <linux/libata.h> |
| 74 | #include <linux/hdreg.h> | ||
| 74 | #include <asm/io.h> | 75 | #include <asm/io.h> |
| 75 | #include <asm/irq.h> | 76 | #include <asm/irq.h> |
| 76 | #include <asm/processor.h> | 77 | #include <asm/processor.h> |
| @@ -4913,8 +4914,11 @@ static int ipr_ioctl(struct scsi_device *sdev, int cmd, void __user *arg) | |||
| 4913 | struct ipr_resource_entry *res; | 4914 | struct ipr_resource_entry *res; |
| 4914 | 4915 | ||
| 4915 | res = (struct ipr_resource_entry *)sdev->hostdata; | 4916 | res = (struct ipr_resource_entry *)sdev->hostdata; |
| 4916 | if (res && ipr_is_gata(res)) | 4917 | if (res && ipr_is_gata(res)) { |
| 4918 | if (cmd == HDIO_GET_IDENTITY) | ||
| 4919 | return -ENOTTY; | ||
| 4917 | return ata_scsi_ioctl(sdev, cmd, arg); | 4920 | return ata_scsi_ioctl(sdev, cmd, arg); |
| 4921 | } | ||
| 4918 | 4922 | ||
| 4919 | return -EINVAL; | 4923 | return -EINVAL; |
| 4920 | } | 4924 | } |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index a82d2fe80fb5..cbf55d59a54c 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
| @@ -207,6 +207,15 @@ int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd, | |||
| 207 | */ | 207 | */ |
| 208 | blk_execute_rq(req->q, NULL, req, 1); | 208 | blk_execute_rq(req->q, NULL, req, 1); |
| 209 | 209 | ||
| 210 | /* | ||
| 211 | * Some devices (USB mass-storage in particular) may transfer | ||
| 212 | * garbage data together with a residue indicating that the data | ||
| 213 | * is invalid. Prevent the garbage from being misinterpreted | ||
| 214 | * and prevent security leaks by zeroing out the excess data. | ||
| 215 | */ | ||
| 216 | if (unlikely(req->data_len > 0 && req->data_len <= bufflen)) | ||
| 217 | memset(buffer + (bufflen - req->data_len), 0, req->data_len); | ||
| 218 | |||
| 210 | ret = req->errors; | 219 | ret = req->errors; |
| 211 | out: | 220 | out: |
| 212 | blk_put_request(req); | 221 | blk_put_request(req); |
diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c index 45df83b9d847..0fe031f003e7 100644 --- a/drivers/scsi/ses.c +++ b/drivers/scsi/ses.c | |||
| @@ -61,7 +61,7 @@ static int ses_probe(struct device *dev) | |||
| 61 | return err; | 61 | return err; |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | #define SES_TIMEOUT 30 | 64 | #define SES_TIMEOUT (30 * HZ) |
| 65 | #define SES_RETRIES 3 | 65 | #define SES_RETRIES 3 |
| 66 | 66 | ||
| 67 | static int ses_recv_diag(struct scsi_device *sdev, int page_code, | 67 | static int ses_recv_diag(struct scsi_device *sdev, int page_code, |
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index 1bc00b721e9d..be95e55b228b 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c | |||
| @@ -2623,6 +2623,9 @@ static struct console serial8250_console = { | |||
| 2623 | 2623 | ||
| 2624 | static int __init serial8250_console_init(void) | 2624 | static int __init serial8250_console_init(void) |
| 2625 | { | 2625 | { |
| 2626 | if (nr_uarts > UART_NR) | ||
| 2627 | nr_uarts = UART_NR; | ||
| 2628 | |||
| 2626 | serial8250_isa_init_ports(); | 2629 | serial8250_isa_init_ports(); |
| 2627 | register_console(&serial8250_console); | 2630 | register_console(&serial8250_console); |
| 2628 | return 0; | 2631 | return 0; |
diff --git a/drivers/serial/cpm_uart/cpm_uart_core.c b/drivers/serial/cpm_uart/cpm_uart_core.c index 43f58dc69fc9..abe129cc927a 100644 --- a/drivers/serial/cpm_uart/cpm_uart_core.c +++ b/drivers/serial/cpm_uart/cpm_uart_core.c | |||
| @@ -491,6 +491,11 @@ static void cpm_uart_set_termios(struct uart_port *port, | |||
| 491 | } | 491 | } |
| 492 | 492 | ||
| 493 | /* | 493 | /* |
| 494 | * Update the timeout | ||
| 495 | */ | ||
| 496 | uart_update_timeout(port, termios->c_cflag, baud); | ||
| 497 | |||
| 498 | /* | ||
| 494 | * Set up parity check flag | 499 | * Set up parity check flag |
| 495 | */ | 500 | */ |
| 496 | #define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) | 501 | #define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) |
| @@ -938,6 +943,7 @@ static int cpm_uart_init_port(struct device_node *np, | |||
| 938 | pinfo->port.type = PORT_CPM; | 943 | pinfo->port.type = PORT_CPM; |
| 939 | pinfo->port.ops = &cpm_uart_pops, | 944 | pinfo->port.ops = &cpm_uart_pops, |
| 940 | pinfo->port.iotype = UPIO_MEM; | 945 | pinfo->port.iotype = UPIO_MEM; |
| 946 | pinfo->port.fifosize = pinfo->tx_nrfifos * pinfo->tx_fifosize; | ||
| 941 | spin_lock_init(&pinfo->port.lock); | 947 | spin_lock_init(&pinfo->port.lock); |
| 942 | 948 | ||
| 943 | pinfo->port.irq = of_irq_to_resource(np, 0, NULL); | 949 | pinfo->port.irq = of_irq_to_resource(np, 0, NULL); |
| @@ -969,6 +975,14 @@ static void cpm_uart_console_write(struct console *co, const char *s, | |||
| 969 | unsigned int i; | 975 | unsigned int i; |
| 970 | cbd_t __iomem *bdp, *bdbase; | 976 | cbd_t __iomem *bdp, *bdbase; |
| 971 | unsigned char *cp; | 977 | unsigned char *cp; |
| 978 | unsigned long flags; | ||
| 979 | int nolock = oops_in_progress; | ||
| 980 | |||
| 981 | if (unlikely(nolock)) { | ||
| 982 | local_irq_save(flags); | ||
| 983 | } else { | ||
| 984 | spin_lock_irqsave(&pinfo->port.lock, flags); | ||
| 985 | } | ||
| 972 | 986 | ||
| 973 | /* Get the address of the host memory buffer. | 987 | /* Get the address of the host memory buffer. |
| 974 | */ | 988 | */ |
| @@ -1030,6 +1044,12 @@ static void cpm_uart_console_write(struct console *co, const char *s, | |||
| 1030 | ; | 1044 | ; |
| 1031 | 1045 | ||
| 1032 | pinfo->tx_cur = bdp; | 1046 | pinfo->tx_cur = bdp; |
| 1047 | |||
| 1048 | if (unlikely(nolock)) { | ||
| 1049 | local_irq_restore(flags); | ||
| 1050 | } else { | ||
| 1051 | spin_unlock_irqrestore(&pinfo->port.lock, flags); | ||
| 1052 | } | ||
| 1033 | } | 1053 | } |
| 1034 | 1054 | ||
| 1035 | 1055 | ||
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c index c9b64e73c987..42d2e108b679 100644 --- a/drivers/serial/serial_core.c +++ b/drivers/serial/serial_core.c | |||
| @@ -1991,7 +1991,9 @@ struct uart_match { | |||
| 1991 | static int serial_match_port(struct device *dev, void *data) | 1991 | static int serial_match_port(struct device *dev, void *data) |
| 1992 | { | 1992 | { |
| 1993 | struct uart_match *match = data; | 1993 | struct uart_match *match = data; |
| 1994 | dev_t devt = MKDEV(match->driver->major, match->driver->minor) + match->port->line; | 1994 | struct tty_driver *tty_drv = match->driver->tty_driver; |
| 1995 | dev_t devt = MKDEV(tty_drv->major, tty_drv->minor_start) + | ||
| 1996 | match->port->line; | ||
| 1995 | 1997 | ||
| 1996 | return dev->devt == devt; /* Actually, only one tty per port */ | 1998 | return dev->devt == devt; /* Actually, only one tty per port */ |
| 1997 | } | 1999 | } |
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c index 799337f7fde1..f5b60c70389b 100644 --- a/drivers/spi/spidev.c +++ b/drivers/spi/spidev.c | |||
| @@ -167,14 +167,14 @@ spidev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) | |||
| 167 | 167 | ||
| 168 | mutex_lock(&spidev->buf_lock); | 168 | mutex_lock(&spidev->buf_lock); |
| 169 | status = spidev_sync_read(spidev, count); | 169 | status = spidev_sync_read(spidev, count); |
| 170 | if (status == 0) { | 170 | if (status > 0) { |
| 171 | unsigned long missing; | 171 | unsigned long missing; |
| 172 | 172 | ||
| 173 | missing = copy_to_user(buf, spidev->buffer, count); | 173 | missing = copy_to_user(buf, spidev->buffer, status); |
| 174 | if (count && missing == count) | 174 | if (missing == status) |
| 175 | status = -EFAULT; | 175 | status = -EFAULT; |
| 176 | else | 176 | else |
| 177 | status = count - missing; | 177 | status = status - missing; |
| 178 | } | 178 | } |
| 179 | mutex_unlock(&spidev->buf_lock); | 179 | mutex_unlock(&spidev->buf_lock); |
| 180 | 180 | ||
| @@ -200,8 +200,6 @@ spidev_write(struct file *filp, const char __user *buf, | |||
| 200 | missing = copy_from_user(spidev->buffer, buf, count); | 200 | missing = copy_from_user(spidev->buffer, buf, count); |
| 201 | if (missing == 0) { | 201 | if (missing == 0) { |
| 202 | status = spidev_sync_write(spidev, count); | 202 | status = spidev_sync_write(spidev, count); |
| 203 | if (status == 0) | ||
| 204 | status = count; | ||
| 205 | } else | 203 | } else |
| 206 | status = -EFAULT; | 204 | status = -EFAULT; |
| 207 | mutex_unlock(&spidev->buf_lock); | 205 | mutex_unlock(&spidev->buf_lock); |
diff --git a/drivers/ssb/driver_pcicore.c b/drivers/ssb/driver_pcicore.c index d28c53868093..538c570df337 100644 --- a/drivers/ssb/driver_pcicore.c +++ b/drivers/ssb/driver_pcicore.c | |||
| @@ -537,6 +537,13 @@ int ssb_pcicore_dev_irqvecs_enable(struct ssb_pcicore *pc, | |||
| 537 | int err = 0; | 537 | int err = 0; |
| 538 | u32 tmp; | 538 | u32 tmp; |
| 539 | 539 | ||
| 540 | if (dev->bus->bustype != SSB_BUSTYPE_PCI) { | ||
| 541 | /* This SSB device is not on a PCI host-bus. So the IRQs are | ||
| 542 | * not routed through the PCI core. | ||
| 543 | * So we must not enable routing through the PCI core. */ | ||
| 544 | goto out; | ||
| 545 | } | ||
| 546 | |||
| 540 | if (!pdev) | 547 | if (!pdev) |
| 541 | goto out; | 548 | goto out; |
| 542 | bus = pdev->bus; | 549 | bus = pdev->bus; |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 63c34043b4d9..c3201affa0b6 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -1125,9 +1125,6 @@ static void stop_data_traffic(struct acm *acm) | |||
| 1125 | for (i = 0; i < acm->rx_buflimit; i++) | 1125 | for (i = 0; i < acm->rx_buflimit; i++) |
| 1126 | usb_kill_urb(acm->ru[i].urb); | 1126 | usb_kill_urb(acm->ru[i].urb); |
| 1127 | 1127 | ||
| 1128 | INIT_LIST_HEAD(&acm->filled_read_bufs); | ||
| 1129 | INIT_LIST_HEAD(&acm->spare_read_bufs); | ||
| 1130 | |||
| 1131 | tasklet_enable(&acm->urb_task); | 1128 | tasklet_enable(&acm->urb_task); |
| 1132 | 1129 | ||
| 1133 | cancel_work_sync(&acm->work); | 1130 | cancel_work_sync(&acm->work); |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 09a53e7f3327..42a436478b78 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
| @@ -924,6 +924,15 @@ static int register_root_hub(struct usb_hcd *hcd) | |||
| 924 | return retval; | 924 | return retval; |
| 925 | } | 925 | } |
| 926 | 926 | ||
| 927 | void usb_enable_root_hub_irq (struct usb_bus *bus) | ||
| 928 | { | ||
| 929 | struct usb_hcd *hcd; | ||
| 930 | |||
| 931 | hcd = container_of (bus, struct usb_hcd, self); | ||
| 932 | if (hcd->driver->hub_irq_enable && hcd->state != HC_STATE_HALT) | ||
| 933 | hcd->driver->hub_irq_enable (hcd); | ||
| 934 | } | ||
| 935 | |||
| 927 | 936 | ||
| 928 | /*-------------------------------------------------------------------------*/ | 937 | /*-------------------------------------------------------------------------*/ |
| 929 | 938 | ||
| @@ -1684,19 +1693,30 @@ EXPORT_SYMBOL_GPL(usb_bus_start_enum); | |||
| 1684 | irqreturn_t usb_hcd_irq (int irq, void *__hcd) | 1693 | irqreturn_t usb_hcd_irq (int irq, void *__hcd) |
| 1685 | { | 1694 | { |
| 1686 | struct usb_hcd *hcd = __hcd; | 1695 | struct usb_hcd *hcd = __hcd; |
| 1687 | int start = hcd->state; | 1696 | unsigned long flags; |
| 1697 | irqreturn_t rc; | ||
| 1688 | 1698 | ||
| 1689 | if (unlikely(start == HC_STATE_HALT || | 1699 | /* IRQF_DISABLED doesn't work correctly with shared IRQs |
| 1690 | !test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))) | 1700 | * when the first handler doesn't use it. So let's just |
| 1691 | return IRQ_NONE; | 1701 | * assume it's never used. |
| 1692 | if (hcd->driver->irq (hcd) == IRQ_NONE) | 1702 | */ |
| 1693 | return IRQ_NONE; | 1703 | local_irq_save(flags); |
| 1694 | 1704 | ||
| 1695 | set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags); | 1705 | if (unlikely(hcd->state == HC_STATE_HALT || |
| 1706 | !test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))) { | ||
| 1707 | rc = IRQ_NONE; | ||
| 1708 | } else if (hcd->driver->irq(hcd) == IRQ_NONE) { | ||
| 1709 | rc = IRQ_NONE; | ||
| 1710 | } else { | ||
| 1711 | set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags); | ||
| 1712 | |||
| 1713 | if (unlikely(hcd->state == HC_STATE_HALT)) | ||
| 1714 | usb_hc_died(hcd); | ||
| 1715 | rc = IRQ_HANDLED; | ||
| 1716 | } | ||
| 1696 | 1717 | ||
| 1697 | if (unlikely(hcd->state == HC_STATE_HALT)) | 1718 | local_irq_restore(flags); |
| 1698 | usb_hc_died (hcd); | 1719 | return rc; |
| 1699 | return IRQ_HANDLED; | ||
| 1700 | } | 1720 | } |
| 1701 | 1721 | ||
| 1702 | /*-------------------------------------------------------------------------*/ | 1722 | /*-------------------------------------------------------------------------*/ |
| @@ -1860,6 +1880,13 @@ int usb_add_hcd(struct usb_hcd *hcd, | |||
| 1860 | 1880 | ||
| 1861 | /* enable irqs just before we start the controller */ | 1881 | /* enable irqs just before we start the controller */ |
| 1862 | if (hcd->driver->irq) { | 1882 | if (hcd->driver->irq) { |
| 1883 | |||
| 1884 | /* IRQF_DISABLED doesn't work as advertised when used together | ||
| 1885 | * with IRQF_SHARED. As usb_hcd_irq() will always disable | ||
| 1886 | * interrupts we can remove it here. | ||
| 1887 | */ | ||
| 1888 | irqflags &= ~IRQF_DISABLED; | ||
| 1889 | |||
| 1863 | snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d", | 1890 | snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d", |
| 1864 | hcd->driver->description, hcd->self.busnum); | 1891 | hcd->driver->description, hcd->self.busnum); |
| 1865 | if ((retval = request_irq(irqnum, &usb_hcd_irq, irqflags, | 1892 | if ((retval = request_irq(irqnum, &usb_hcd_irq, irqflags, |
diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h index a0bf5df6cb6f..b9de1569b39e 100644 --- a/drivers/usb/core/hcd.h +++ b/drivers/usb/core/hcd.h | |||
| @@ -210,6 +210,8 @@ struct hc_driver { | |||
| 210 | int (*bus_suspend)(struct usb_hcd *); | 210 | int (*bus_suspend)(struct usb_hcd *); |
| 211 | int (*bus_resume)(struct usb_hcd *); | 211 | int (*bus_resume)(struct usb_hcd *); |
| 212 | int (*start_port_reset)(struct usb_hcd *, unsigned port_num); | 212 | int (*start_port_reset)(struct usb_hcd *, unsigned port_num); |
| 213 | void (*hub_irq_enable)(struct usb_hcd *); | ||
| 214 | /* Needed only if port-change IRQs are level-triggered */ | ||
| 213 | 215 | ||
| 214 | /* force handover of high-speed port to full-speed companion */ | 216 | /* force handover of high-speed port to full-speed companion */ |
| 215 | void (*relinquish_port)(struct usb_hcd *, int); | 217 | void (*relinquish_port)(struct usb_hcd *, int); |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 94789be54ca3..4cfe32a16c37 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -713,18 +713,11 @@ static void hub_restart(struct usb_hub *hub, int type) | |||
| 713 | } | 713 | } |
| 714 | 714 | ||
| 715 | /* Was the power session lost while we were suspended? */ | 715 | /* Was the power session lost while we were suspended? */ |
| 716 | switch (type) { | 716 | status = hub_port_status(hub, port1, &portstatus, &portchange); |
| 717 | case HUB_RESET_RESUME: | ||
| 718 | portstatus = 0; | ||
| 719 | portchange = USB_PORT_STAT_C_CONNECTION; | ||
| 720 | break; | ||
| 721 | 717 | ||
| 722 | case HUB_RESET: | 718 | /* If the device is gone, khubd will handle it later */ |
| 723 | case HUB_RESUME: | 719 | if (status == 0 && !(portstatus & USB_PORT_STAT_CONNECTION)) |
| 724 | status = hub_port_status(hub, port1, | 720 | continue; |
| 725 | &portstatus, &portchange); | ||
| 726 | break; | ||
| 727 | } | ||
| 728 | 721 | ||
| 729 | /* For "USB_PERSIST"-enabled children we must | 722 | /* For "USB_PERSIST"-enabled children we must |
| 730 | * mark the child device for reset-resume and | 723 | * mark the child device for reset-resume and |
| @@ -2080,6 +2073,8 @@ int usb_port_resume(struct usb_device *udev) | |||
| 2080 | } | 2073 | } |
| 2081 | 2074 | ||
| 2082 | clear_bit(port1, hub->busy_bits); | 2075 | clear_bit(port1, hub->busy_bits); |
| 2076 | if (!hub->hdev->parent && !hub->busy_bits[0]) | ||
| 2077 | usb_enable_root_hub_irq(hub->hdev->bus); | ||
| 2083 | 2078 | ||
| 2084 | if (status == 0) | 2079 | if (status == 0) |
| 2085 | status = finish_port_resume(udev); | 2080 | status = finish_port_resume(udev); |
| @@ -3009,6 +3004,11 @@ static void hub_events(void) | |||
| 3009 | 3004 | ||
| 3010 | hub->activating = 0; | 3005 | hub->activating = 0; |
| 3011 | 3006 | ||
| 3007 | /* If this is a root hub, tell the HCD it's okay to | ||
| 3008 | * re-enable port-change interrupts now. */ | ||
| 3009 | if (!hdev->parent && !hub->busy_bits[0]) | ||
| 3010 | usb_enable_root_hub_irq(hdev->bus); | ||
| 3011 | |||
| 3012 | loop_autopm: | 3012 | loop_autopm: |
| 3013 | /* Allow autosuspend if we're not going to run again */ | 3013 | /* Allow autosuspend if we're not going to run again */ |
| 3014 | if (list_empty(&hub->event_list)) | 3014 | if (list_empty(&hub->event_list)) |
| @@ -3234,6 +3234,8 @@ int usb_reset_device(struct usb_device *udev) | |||
| 3234 | break; | 3234 | break; |
| 3235 | } | 3235 | } |
| 3236 | clear_bit(port1, parent_hub->busy_bits); | 3236 | clear_bit(port1, parent_hub->busy_bits); |
| 3237 | if (!parent_hdev->parent && !parent_hub->busy_bits[0]) | ||
| 3238 | usb_enable_root_hub_irq(parent_hdev->bus); | ||
| 3237 | 3239 | ||
| 3238 | if (ret < 0) | 3240 | if (ret < 0) |
| 3239 | goto re_enumerate; | 3241 | goto re_enumerate; |
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 35a03095757e..90245fd8bac4 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
| @@ -177,6 +177,15 @@ timer_action_done (struct ehci_hcd *ehci, enum ehci_timer_action action) | |||
| 177 | static inline void | 177 | static inline void |
| 178 | timer_action (struct ehci_hcd *ehci, enum ehci_timer_action action) | 178 | timer_action (struct ehci_hcd *ehci, enum ehci_timer_action action) |
| 179 | { | 179 | { |
| 180 | /* Don't override timeouts which shrink or (later) disable | ||
| 181 | * the async ring; just the I/O watchdog. Note that if a | ||
| 182 | * SHRINK were pending, OFF would never be requested. | ||
| 183 | */ | ||
| 184 | if (timer_pending(&ehci->watchdog) | ||
| 185 | && ((BIT(TIMER_ASYNC_SHRINK) | BIT(TIMER_ASYNC_OFF)) | ||
| 186 | & ehci->actions)) | ||
| 187 | return; | ||
| 188 | |||
| 180 | if (!test_and_set_bit (action, &ehci->actions)) { | 189 | if (!test_and_set_bit (action, &ehci->actions)) { |
| 181 | unsigned long t; | 190 | unsigned long t; |
| 182 | 191 | ||
| @@ -192,15 +201,7 @@ timer_action (struct ehci_hcd *ehci, enum ehci_timer_action action) | |||
| 192 | t = EHCI_SHRINK_JIFFIES; | 201 | t = EHCI_SHRINK_JIFFIES; |
| 193 | break; | 202 | break; |
| 194 | } | 203 | } |
| 195 | t += jiffies; | 204 | mod_timer(&ehci->watchdog, t + jiffies); |
| 196 | // all timings except IAA watchdog can be overridden. | ||
| 197 | // async queue SHRINK often precedes IAA. while it's ready | ||
| 198 | // to go OFF neither can matter, and afterwards the IO | ||
| 199 | // watchdog stops unless there's still periodic traffic. | ||
| 200 | if (time_before_eq(t, ehci->watchdog.expires) | ||
| 201 | && timer_pending (&ehci->watchdog)) | ||
| 202 | return; | ||
| 203 | mod_timer (&ehci->watchdog, t); | ||
| 204 | } | 205 | } |
| 205 | } | 206 | } |
| 206 | 207 | ||
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index c96db1153dcf..e534f9de0f05 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
| @@ -261,6 +261,7 @@ static const struct hc_driver ohci_at91_hc_driver = { | |||
| 261 | */ | 261 | */ |
| 262 | .hub_status_data = ohci_hub_status_data, | 262 | .hub_status_data = ohci_hub_status_data, |
| 263 | .hub_control = ohci_hub_control, | 263 | .hub_control = ohci_hub_control, |
| 264 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 264 | #ifdef CONFIG_PM | 265 | #ifdef CONFIG_PM |
| 265 | .bus_suspend = ohci_bus_suspend, | 266 | .bus_suspend = ohci_bus_suspend, |
| 266 | .bus_resume = ohci_bus_resume, | 267 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-au1xxx.c b/drivers/usb/host/ohci-au1xxx.c index 1b9abdba920b..68c17f5ea8ea 100644 --- a/drivers/usb/host/ohci-au1xxx.c +++ b/drivers/usb/host/ohci-au1xxx.c | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | * Bus Glue for AMD Alchemy Au1xxx | 8 | * Bus Glue for AMD Alchemy Au1xxx |
| 9 | * | 9 | * |
| 10 | * Written by Christopher Hoover <ch@hpl.hp.com> | 10 | * Written by Christopher Hoover <ch@hpl.hp.com> |
| 11 | * Based on fragments of previous driver by Rusell King et al. | 11 | * Based on fragments of previous driver by Russell King et al. |
| 12 | * | 12 | * |
| 13 | * Modified for LH7A404 from ohci-sa1111.c | 13 | * Modified for LH7A404 from ohci-sa1111.c |
| 14 | * by Durgesh Pattamatta <pattamattad@sharpsec.com> | 14 | * by Durgesh Pattamatta <pattamattad@sharpsec.com> |
| @@ -288,6 +288,7 @@ static const struct hc_driver ohci_au1xxx_hc_driver = { | |||
| 288 | */ | 288 | */ |
| 289 | .hub_status_data = ohci_hub_status_data, | 289 | .hub_status_data = ohci_hub_status_data, |
| 290 | .hub_control = ohci_hub_control, | 290 | .hub_control = ohci_hub_control, |
| 291 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 291 | #ifdef CONFIG_PM | 292 | #ifdef CONFIG_PM |
| 292 | .bus_suspend = ohci_bus_suspend, | 293 | .bus_suspend = ohci_bus_suspend, |
| 293 | .bus_resume = ohci_bus_resume, | 294 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-ep93xx.c b/drivers/usb/host/ohci-ep93xx.c index 06aadfb0ec29..5adaf36e47d0 100644 --- a/drivers/usb/host/ohci-ep93xx.c +++ b/drivers/usb/host/ohci-ep93xx.c | |||
| @@ -135,6 +135,7 @@ static struct hc_driver ohci_ep93xx_hc_driver = { | |||
| 135 | .get_frame_number = ohci_get_frame, | 135 | .get_frame_number = ohci_get_frame, |
| 136 | .hub_status_data = ohci_hub_status_data, | 136 | .hub_status_data = ohci_hub_status_data, |
| 137 | .hub_control = ohci_hub_control, | 137 | .hub_control = ohci_hub_control, |
| 138 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 138 | #ifdef CONFIG_PM | 139 | #ifdef CONFIG_PM |
| 139 | .bus_suspend = ohci_bus_suspend, | 140 | .bus_suspend = ohci_bus_suspend, |
| 140 | .bus_resume = ohci_bus_resume, | 141 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 33f1c1c32edf..a8160d65f32b 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
| @@ -1054,7 +1054,7 @@ MODULE_LICENSE ("GPL"); | |||
| 1054 | 1054 | ||
| 1055 | #ifdef CONFIG_MFD_SM501 | 1055 | #ifdef CONFIG_MFD_SM501 |
| 1056 | #include "ohci-sm501.c" | 1056 | #include "ohci-sm501.c" |
| 1057 | #define PLATFORM_DRIVER ohci_hcd_sm501_driver | 1057 | #define SM501_OHCI_DRIVER ohci_hcd_sm501_driver |
| 1058 | #endif | 1058 | #endif |
| 1059 | 1059 | ||
| 1060 | #if !defined(PCI_DRIVER) && \ | 1060 | #if !defined(PCI_DRIVER) && \ |
| @@ -1062,6 +1062,7 @@ MODULE_LICENSE ("GPL"); | |||
| 1062 | !defined(OF_PLATFORM_DRIVER) && \ | 1062 | !defined(OF_PLATFORM_DRIVER) && \ |
| 1063 | !defined(SA1111_DRIVER) && \ | 1063 | !defined(SA1111_DRIVER) && \ |
| 1064 | !defined(PS3_SYSTEM_BUS_DRIVER) && \ | 1064 | !defined(PS3_SYSTEM_BUS_DRIVER) && \ |
| 1065 | !defined(SM501_OHCI_DRIVER) && \ | ||
| 1065 | !defined(SSB_OHCI_DRIVER) | 1066 | !defined(SSB_OHCI_DRIVER) |
| 1066 | #error "missing bus glue for ohci-hcd" | 1067 | #error "missing bus glue for ohci-hcd" |
| 1067 | #endif | 1068 | #endif |
| @@ -1121,9 +1122,18 @@ static int __init ohci_hcd_mod_init(void) | |||
| 1121 | goto error_ssb; | 1122 | goto error_ssb; |
| 1122 | #endif | 1123 | #endif |
| 1123 | 1124 | ||
| 1125 | #ifdef SM501_OHCI_DRIVER | ||
| 1126 | retval = platform_driver_register(&SM501_OHCI_DRIVER); | ||
| 1127 | if (retval < 0) | ||
| 1128 | goto error_sm501; | ||
| 1129 | #endif | ||
| 1130 | |||
| 1124 | return retval; | 1131 | return retval; |
| 1125 | 1132 | ||
| 1126 | /* Error path */ | 1133 | /* Error path */ |
| 1134 | #ifdef SM501_OHCI_DRIVER | ||
| 1135 | error_sm501: | ||
| 1136 | #endif | ||
| 1127 | #ifdef SSB_OHCI_DRIVER | 1137 | #ifdef SSB_OHCI_DRIVER |
| 1128 | error_ssb: | 1138 | error_ssb: |
| 1129 | #endif | 1139 | #endif |
| @@ -1159,6 +1169,9 @@ module_init(ohci_hcd_mod_init); | |||
| 1159 | 1169 | ||
| 1160 | static void __exit ohci_hcd_mod_exit(void) | 1170 | static void __exit ohci_hcd_mod_exit(void) |
| 1161 | { | 1171 | { |
| 1172 | #ifdef SM501_OHCI_DRIVER | ||
| 1173 | platform_driver_unregister(&SM501_OHCI_DRIVER); | ||
| 1174 | #endif | ||
| 1162 | #ifdef SSB_OHCI_DRIVER | 1175 | #ifdef SSB_OHCI_DRIVER |
| 1163 | ssb_driver_unregister(&SSB_OHCI_DRIVER); | 1176 | ssb_driver_unregister(&SSB_OHCI_DRIVER); |
| 1164 | #endif | 1177 | #endif |
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 79a78029f896..b56739221d11 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
| @@ -36,6 +36,18 @@ | |||
| 36 | 36 | ||
| 37 | /*-------------------------------------------------------------------------*/ | 37 | /*-------------------------------------------------------------------------*/ |
| 38 | 38 | ||
| 39 | /* hcd->hub_irq_enable() */ | ||
| 40 | static void ohci_rhsc_enable (struct usb_hcd *hcd) | ||
| 41 | { | ||
| 42 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | ||
| 43 | |||
| 44 | spin_lock_irq(&ohci->lock); | ||
| 45 | if (!ohci->autostop) | ||
| 46 | del_timer(&hcd->rh_timer); /* Prevent next poll */ | ||
| 47 | ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable); | ||
| 48 | spin_unlock_irq(&ohci->lock); | ||
| 49 | } | ||
| 50 | |||
| 39 | #define OHCI_SCHED_ENABLES \ | 51 | #define OHCI_SCHED_ENABLES \ |
| 40 | (OHCI_CTRL_CLE|OHCI_CTRL_BLE|OHCI_CTRL_PLE|OHCI_CTRL_IE) | 52 | (OHCI_CTRL_CLE|OHCI_CTRL_BLE|OHCI_CTRL_PLE|OHCI_CTRL_IE) |
| 41 | 53 | ||
| @@ -362,28 +374,18 @@ static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | |||
| 362 | int any_connected) | 374 | int any_connected) |
| 363 | { | 375 | { |
| 364 | int poll_rh = 1; | 376 | int poll_rh = 1; |
| 365 | int rhsc; | ||
| 366 | 377 | ||
| 367 | rhsc = ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC; | ||
| 368 | switch (ohci->hc_control & OHCI_CTRL_HCFS) { | 378 | switch (ohci->hc_control & OHCI_CTRL_HCFS) { |
| 369 | 379 | ||
| 370 | case OHCI_USB_OPER: | 380 | case OHCI_USB_OPER: |
| 371 | /* If no status changes are pending, enable status-change | 381 | /* keep on polling until we know a device is connected |
| 372 | * interrupts. | 382 | * and RHSC is enabled */ |
| 373 | */ | ||
| 374 | if (!rhsc && !changed) { | ||
| 375 | rhsc = OHCI_INTR_RHSC; | ||
| 376 | ohci_writel(ohci, rhsc, &ohci->regs->intrenable); | ||
| 377 | } | ||
| 378 | |||
| 379 | /* Keep on polling until we know a device is connected | ||
| 380 | * and RHSC is enabled, or until we autostop. | ||
| 381 | */ | ||
| 382 | if (!ohci->autostop) { | 383 | if (!ohci->autostop) { |
| 383 | if (any_connected || | 384 | if (any_connected || |
| 384 | !device_may_wakeup(&ohci_to_hcd(ohci) | 385 | !device_may_wakeup(&ohci_to_hcd(ohci) |
| 385 | ->self.root_hub->dev)) { | 386 | ->self.root_hub->dev)) { |
| 386 | if (rhsc) | 387 | if (ohci_readl(ohci, &ohci->regs->intrenable) & |
| 388 | OHCI_INTR_RHSC) | ||
| 387 | poll_rh = 0; | 389 | poll_rh = 0; |
| 388 | } else { | 390 | } else { |
| 389 | ohci->autostop = 1; | 391 | ohci->autostop = 1; |
| @@ -396,13 +398,12 @@ static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | |||
| 396 | ohci->autostop = 0; | 398 | ohci->autostop = 0; |
| 397 | ohci->next_statechange = jiffies + | 399 | ohci->next_statechange = jiffies + |
| 398 | STATECHANGE_DELAY; | 400 | STATECHANGE_DELAY; |
| 399 | } else if (rhsc && time_after_eq(jiffies, | 401 | } else if (time_after_eq(jiffies, |
| 400 | ohci->next_statechange) | 402 | ohci->next_statechange) |
| 401 | && !ohci->ed_rm_list | 403 | && !ohci->ed_rm_list |
| 402 | && !(ohci->hc_control & | 404 | && !(ohci->hc_control & |
| 403 | OHCI_SCHED_ENABLES)) { | 405 | OHCI_SCHED_ENABLES)) { |
| 404 | ohci_rh_suspend(ohci, 1); | 406 | ohci_rh_suspend(ohci, 1); |
| 405 | poll_rh = 0; | ||
| 406 | } | 407 | } |
| 407 | } | 408 | } |
| 408 | break; | 409 | break; |
| @@ -416,12 +417,6 @@ static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | |||
| 416 | else | 417 | else |
| 417 | usb_hcd_resume_root_hub(ohci_to_hcd(ohci)); | 418 | usb_hcd_resume_root_hub(ohci_to_hcd(ohci)); |
| 418 | } else { | 419 | } else { |
| 419 | if (!rhsc && (ohci->autostop || | ||
| 420 | ohci_to_hcd(ohci)->self.root_hub-> | ||
| 421 | do_remote_wakeup)) | ||
| 422 | ohci_writel(ohci, OHCI_INTR_RHSC, | ||
| 423 | &ohci->regs->intrenable); | ||
| 424 | |||
| 425 | /* everything is idle, no need for polling */ | 420 | /* everything is idle, no need for polling */ |
| 426 | poll_rh = 0; | 421 | poll_rh = 0; |
| 427 | } | 422 | } |
| @@ -443,16 +438,12 @@ static inline int ohci_rh_resume(struct ohci_hcd *ohci) | |||
| 443 | static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | 438 | static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, |
| 444 | int any_connected) | 439 | int any_connected) |
| 445 | { | 440 | { |
| 446 | /* If RHSC is enabled, don't poll */ | 441 | int poll_rh = 1; |
| 447 | if (ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC) | ||
| 448 | return 0; | ||
| 449 | 442 | ||
| 450 | /* If no status changes are pending, enable status-change interrupts */ | 443 | /* keep on polling until RHSC is enabled */ |
| 451 | if (!changed) { | 444 | if (ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC) |
| 452 | ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable); | 445 | poll_rh = 0; |
| 453 | return 0; | 446 | return poll_rh; |
| 454 | } | ||
| 455 | return 1; | ||
| 456 | } | 447 | } |
| 457 | 448 | ||
| 458 | #endif /* CONFIG_PM */ | 449 | #endif /* CONFIG_PM */ |
diff --git a/drivers/usb/host/ohci-lh7a404.c b/drivers/usb/host/ohci-lh7a404.c index 96d14fa1d833..1ef5d482c145 100644 --- a/drivers/usb/host/ohci-lh7a404.c +++ b/drivers/usb/host/ohci-lh7a404.c | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | * Bus Glue for Sharp LH7A404 | 8 | * Bus Glue for Sharp LH7A404 |
| 9 | * | 9 | * |
| 10 | * Written by Christopher Hoover <ch@hpl.hp.com> | 10 | * Written by Christopher Hoover <ch@hpl.hp.com> |
| 11 | * Based on fragments of previous driver by Rusell King et al. | 11 | * Based on fragments of previous driver by Russell King et al. |
| 12 | * | 12 | * |
| 13 | * Modified for LH7A404 from ohci-sa1111.c | 13 | * Modified for LH7A404 from ohci-sa1111.c |
| 14 | * by Durgesh Pattamatta <pattamattad@sharpsec.com> | 14 | * by Durgesh Pattamatta <pattamattad@sharpsec.com> |
| @@ -193,6 +193,7 @@ static const struct hc_driver ohci_lh7a404_hc_driver = { | |||
| 193 | */ | 193 | */ |
| 194 | .hub_status_data = ohci_hub_status_data, | 194 | .hub_status_data = ohci_hub_status_data, |
| 195 | .hub_control = ohci_hub_control, | 195 | .hub_control = ohci_hub_control, |
| 196 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 196 | #ifdef CONFIG_PM | 197 | #ifdef CONFIG_PM |
| 197 | .bus_suspend = ohci_bus_suspend, | 198 | .bus_suspend = ohci_bus_suspend, |
| 198 | .bus_resume = ohci_bus_resume, | 199 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c index 6859fb5f1d6f..3a7c24c03671 100644 --- a/drivers/usb/host/ohci-omap.c +++ b/drivers/usb/host/ohci-omap.c | |||
| @@ -466,6 +466,7 @@ static const struct hc_driver ohci_omap_hc_driver = { | |||
| 466 | */ | 466 | */ |
| 467 | .hub_status_data = ohci_hub_status_data, | 467 | .hub_status_data = ohci_hub_status_data, |
| 468 | .hub_control = ohci_hub_control, | 468 | .hub_control = ohci_hub_control, |
| 469 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 469 | #ifdef CONFIG_PM | 470 | #ifdef CONFIG_PM |
| 470 | .bus_suspend = ohci_bus_suspend, | 471 | .bus_suspend = ohci_bus_suspend, |
| 471 | .bus_resume = ohci_bus_resume, | 472 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c index 3bf175d95a23..4696cc912e16 100644 --- a/drivers/usb/host/ohci-pci.c +++ b/drivers/usb/host/ohci-pci.c | |||
| @@ -327,6 +327,7 @@ static const struct hc_driver ohci_pci_hc_driver = { | |||
| 327 | */ | 327 | */ |
| 328 | .hub_status_data = ohci_hub_status_data, | 328 | .hub_status_data = ohci_hub_status_data, |
| 329 | .hub_control = ohci_hub_control, | 329 | .hub_control = ohci_hub_control, |
| 330 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 330 | #ifdef CONFIG_PM | 331 | #ifdef CONFIG_PM |
| 331 | .bus_suspend = ohci_bus_suspend, | 332 | .bus_suspend = ohci_bus_suspend, |
| 332 | .bus_resume = ohci_bus_resume, | 333 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-pnx4008.c b/drivers/usb/host/ohci-pnx4008.c index 664f07ee8732..28b458f20cc3 100644 --- a/drivers/usb/host/ohci-pnx4008.c +++ b/drivers/usb/host/ohci-pnx4008.c | |||
| @@ -280,6 +280,7 @@ static const struct hc_driver ohci_pnx4008_hc_driver = { | |||
| 280 | */ | 280 | */ |
| 281 | .hub_status_data = ohci_hub_status_data, | 281 | .hub_status_data = ohci_hub_status_data, |
| 282 | .hub_control = ohci_hub_control, | 282 | .hub_control = ohci_hub_control, |
| 283 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 283 | #ifdef CONFIG_PM | 284 | #ifdef CONFIG_PM |
| 284 | .bus_suspend = ohci_bus_suspend, | 285 | .bus_suspend = ohci_bus_suspend, |
| 285 | .bus_resume = ohci_bus_resume, | 286 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-pnx8550.c b/drivers/usb/host/ohci-pnx8550.c index 28467e288a93..605d59cba28e 100644 --- a/drivers/usb/host/ohci-pnx8550.c +++ b/drivers/usb/host/ohci-pnx8550.c | |||
| @@ -201,6 +201,7 @@ static const struct hc_driver ohci_pnx8550_hc_driver = { | |||
| 201 | */ | 201 | */ |
| 202 | .hub_status_data = ohci_hub_status_data, | 202 | .hub_status_data = ohci_hub_status_data, |
| 203 | .hub_control = ohci_hub_control, | 203 | .hub_control = ohci_hub_control, |
| 204 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 204 | #ifdef CONFIG_PM | 205 | #ifdef CONFIG_PM |
| 205 | .bus_suspend = ohci_bus_suspend, | 206 | .bus_suspend = ohci_bus_suspend, |
| 206 | .bus_resume = ohci_bus_resume, | 207 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-ppc-of.c b/drivers/usb/host/ohci-ppc-of.c index 50e55db13636..a67252791223 100644 --- a/drivers/usb/host/ohci-ppc-of.c +++ b/drivers/usb/host/ohci-ppc-of.c | |||
| @@ -72,6 +72,7 @@ static const struct hc_driver ohci_ppc_of_hc_driver = { | |||
| 72 | */ | 72 | */ |
| 73 | .hub_status_data = ohci_hub_status_data, | 73 | .hub_status_data = ohci_hub_status_data, |
| 74 | .hub_control = ohci_hub_control, | 74 | .hub_control = ohci_hub_control, |
| 75 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 75 | #ifdef CONFIG_PM | 76 | #ifdef CONFIG_PM |
| 76 | .bus_suspend = ohci_bus_suspend, | 77 | .bus_suspend = ohci_bus_suspend, |
| 77 | .bus_resume = ohci_bus_resume, | 78 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-ppc-soc.c b/drivers/usb/host/ohci-ppc-soc.c index cd3398b675b2..523c30125577 100644 --- a/drivers/usb/host/ohci-ppc-soc.c +++ b/drivers/usb/host/ohci-ppc-soc.c | |||
| @@ -172,6 +172,7 @@ static const struct hc_driver ohci_ppc_soc_hc_driver = { | |||
| 172 | */ | 172 | */ |
| 173 | .hub_status_data = ohci_hub_status_data, | 173 | .hub_status_data = ohci_hub_status_data, |
| 174 | .hub_control = ohci_hub_control, | 174 | .hub_control = ohci_hub_control, |
| 175 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 175 | #ifdef CONFIG_PM | 176 | #ifdef CONFIG_PM |
| 176 | .bus_suspend = ohci_bus_suspend, | 177 | .bus_suspend = ohci_bus_suspend, |
| 177 | .bus_resume = ohci_bus_resume, | 178 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-ps3.c b/drivers/usb/host/ohci-ps3.c index bfdeb0d22d05..c1935ae537f8 100644 --- a/drivers/usb/host/ohci-ps3.c +++ b/drivers/usb/host/ohci-ps3.c | |||
| @@ -68,6 +68,7 @@ static const struct hc_driver ps3_ohci_hc_driver = { | |||
| 68 | .get_frame_number = ohci_get_frame, | 68 | .get_frame_number = ohci_get_frame, |
| 69 | .hub_status_data = ohci_hub_status_data, | 69 | .hub_status_data = ohci_hub_status_data, |
| 70 | .hub_control = ohci_hub_control, | 70 | .hub_control = ohci_hub_control, |
| 71 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 71 | .start_port_reset = ohci_start_port_reset, | 72 | .start_port_reset = ohci_start_port_reset, |
| 72 | #if defined(CONFIG_PM) | 73 | #if defined(CONFIG_PM) |
| 73 | .bus_suspend = ohci_bus_suspend, | 74 | .bus_suspend = ohci_bus_suspend, |
diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c index 70b0d4b459e7..d4ee27d92be8 100644 --- a/drivers/usb/host/ohci-pxa27x.c +++ b/drivers/usb/host/ohci-pxa27x.c | |||
| @@ -298,6 +298,7 @@ static const struct hc_driver ohci_pxa27x_hc_driver = { | |||
| 298 | */ | 298 | */ |
| 299 | .hub_status_data = ohci_hub_status_data, | 299 | .hub_status_data = ohci_hub_status_data, |
| 300 | .hub_control = ohci_hub_control, | 300 | .hub_control = ohci_hub_control, |
| 301 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 301 | #ifdef CONFIG_PM | 302 | #ifdef CONFIG_PM |
| 302 | .bus_suspend = ohci_bus_suspend, | 303 | .bus_suspend = ohci_bus_suspend, |
| 303 | .bus_resume = ohci_bus_resume, | 304 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c index 9c9f3b59186f..9b547407c934 100644 --- a/drivers/usb/host/ohci-q.c +++ b/drivers/usb/host/ohci-q.c | |||
| @@ -952,6 +952,7 @@ rescan_this: | |||
| 952 | struct urb *urb; | 952 | struct urb *urb; |
| 953 | urb_priv_t *urb_priv; | 953 | urb_priv_t *urb_priv; |
| 954 | __hc32 savebits; | 954 | __hc32 savebits; |
| 955 | u32 tdINFO; | ||
| 955 | 956 | ||
| 956 | td = list_entry (entry, struct td, td_list); | 957 | td = list_entry (entry, struct td, td_list); |
| 957 | urb = td->urb; | 958 | urb = td->urb; |
| @@ -966,6 +967,17 @@ rescan_this: | |||
| 966 | savebits = *prev & ~cpu_to_hc32 (ohci, TD_MASK); | 967 | savebits = *prev & ~cpu_to_hc32 (ohci, TD_MASK); |
| 967 | *prev = td->hwNextTD | savebits; | 968 | *prev = td->hwNextTD | savebits; |
| 968 | 969 | ||
| 970 | /* If this was unlinked, the TD may not have been | ||
| 971 | * retired ... so manually save the data toggle. | ||
| 972 | * The controller ignores the value we save for | ||
| 973 | * control and ISO endpoints. | ||
| 974 | */ | ||
| 975 | tdINFO = hc32_to_cpup(ohci, &td->hwINFO); | ||
| 976 | if ((tdINFO & TD_T) == TD_T_DATA0) | ||
| 977 | ed->hwHeadP &= ~cpu_to_hc32(ohci, ED_C); | ||
| 978 | else if ((tdINFO & TD_T) == TD_T_DATA1) | ||
| 979 | ed->hwHeadP |= cpu_to_hc32(ohci, ED_C); | ||
| 980 | |||
| 969 | /* HC may have partly processed this TD */ | 981 | /* HC may have partly processed this TD */ |
| 970 | td_done (ohci, urb, td); | 982 | td_done (ohci, urb, td); |
| 971 | urb_priv->td_cnt++; | 983 | urb_priv->td_cnt++; |
diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c index a73d2ff322e2..3c7a740cfe0c 100644 --- a/drivers/usb/host/ohci-s3c2410.c +++ b/drivers/usb/host/ohci-s3c2410.c | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | * USB Bus Glue for Samsung S3C2410 | 8 | * USB Bus Glue for Samsung S3C2410 |
| 9 | * | 9 | * |
| 10 | * Written by Christopher Hoover <ch@hpl.hp.com> | 10 | * Written by Christopher Hoover <ch@hpl.hp.com> |
| 11 | * Based on fragments of previous driver by Rusell King et al. | 11 | * Based on fragments of previous driver by Russell King et al. |
| 12 | * | 12 | * |
| 13 | * Modified for S3C2410 from ohci-sa1111.c, ohci-omap.c and ohci-lh7a40.c | 13 | * Modified for S3C2410 from ohci-sa1111.c, ohci-omap.c and ohci-lh7a40.c |
| 14 | * by Ben Dooks, <ben@simtec.co.uk> | 14 | * by Ben Dooks, <ben@simtec.co.uk> |
| @@ -466,6 +466,7 @@ static const struct hc_driver ohci_s3c2410_hc_driver = { | |||
| 466 | */ | 466 | */ |
| 467 | .hub_status_data = ohci_s3c2410_hub_status_data, | 467 | .hub_status_data = ohci_s3c2410_hub_status_data, |
| 468 | .hub_control = ohci_s3c2410_hub_control, | 468 | .hub_control = ohci_s3c2410_hub_control, |
| 469 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 469 | #ifdef CONFIG_PM | 470 | #ifdef CONFIG_PM |
| 470 | .bus_suspend = ohci_bus_suspend, | 471 | .bus_suspend = ohci_bus_suspend, |
| 471 | .bus_resume = ohci_bus_resume, | 472 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-sa1111.c b/drivers/usb/host/ohci-sa1111.c index 99438c65981b..2e9dceb9bb99 100644 --- a/drivers/usb/host/ohci-sa1111.c +++ b/drivers/usb/host/ohci-sa1111.c | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | * SA1111 Bus Glue | 8 | * SA1111 Bus Glue |
| 9 | * | 9 | * |
| 10 | * Written by Christopher Hoover <ch@hpl.hp.com> | 10 | * Written by Christopher Hoover <ch@hpl.hp.com> |
| 11 | * Based on fragments of previous driver by Rusell King et al. | 11 | * Based on fragments of previous driver by Russell King et al. |
| 12 | * | 12 | * |
| 13 | * This file is licenced under the GPL. | 13 | * This file is licenced under the GPL. |
| 14 | */ | 14 | */ |
| @@ -231,6 +231,7 @@ static const struct hc_driver ohci_sa1111_hc_driver = { | |||
| 231 | */ | 231 | */ |
| 232 | .hub_status_data = ohci_hub_status_data, | 232 | .hub_status_data = ohci_hub_status_data, |
| 233 | .hub_control = ohci_hub_control, | 233 | .hub_control = ohci_hub_control, |
| 234 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 234 | #ifdef CONFIG_PM | 235 | #ifdef CONFIG_PM |
| 235 | .bus_suspend = ohci_bus_suspend, | 236 | .bus_suspend = ohci_bus_suspend, |
| 236 | .bus_resume = ohci_bus_resume, | 237 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-sh.c b/drivers/usb/host/ohci-sh.c index 60f03cc7ec4f..e7ee607278fe 100644 --- a/drivers/usb/host/ohci-sh.c +++ b/drivers/usb/host/ohci-sh.c | |||
| @@ -68,6 +68,7 @@ static const struct hc_driver ohci_sh_hc_driver = { | |||
| 68 | */ | 68 | */ |
| 69 | .hub_status_data = ohci_hub_status_data, | 69 | .hub_status_data = ohci_hub_status_data, |
| 70 | .hub_control = ohci_hub_control, | 70 | .hub_control = ohci_hub_control, |
| 71 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 71 | #ifdef CONFIG_PM | 72 | #ifdef CONFIG_PM |
| 72 | .bus_suspend = ohci_bus_suspend, | 73 | .bus_suspend = ohci_bus_suspend, |
| 73 | .bus_resume = ohci_bus_resume, | 74 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-sm501.c b/drivers/usb/host/ohci-sm501.c index e899a77dfb83..e610698c6b60 100644 --- a/drivers/usb/host/ohci-sm501.c +++ b/drivers/usb/host/ohci-sm501.c | |||
| @@ -75,6 +75,7 @@ static const struct hc_driver ohci_sm501_hc_driver = { | |||
| 75 | */ | 75 | */ |
| 76 | .hub_status_data = ohci_hub_status_data, | 76 | .hub_status_data = ohci_hub_status_data, |
| 77 | .hub_control = ohci_hub_control, | 77 | .hub_control = ohci_hub_control, |
| 78 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 78 | #ifdef CONFIG_PM | 79 | #ifdef CONFIG_PM |
| 79 | .bus_suspend = ohci_bus_suspend, | 80 | .bus_suspend = ohci_bus_suspend, |
| 80 | .bus_resume = ohci_bus_resume, | 81 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-ssb.c b/drivers/usb/host/ohci-ssb.c index c4265caec780..7275186db315 100644 --- a/drivers/usb/host/ohci-ssb.c +++ b/drivers/usb/host/ohci-ssb.c | |||
| @@ -81,6 +81,7 @@ static const struct hc_driver ssb_ohci_hc_driver = { | |||
| 81 | 81 | ||
| 82 | .hub_status_data = ohci_hub_status_data, | 82 | .hub_status_data = ohci_hub_status_data, |
| 83 | .hub_control = ohci_hub_control, | 83 | .hub_control = ohci_hub_control, |
| 84 | .hub_irq_enable = ohci_rhsc_enable, | ||
| 84 | #ifdef CONFIG_PM | 85 | #ifdef CONFIG_PM |
| 85 | .bus_suspend = ohci_bus_suspend, | 86 | .bus_suspend = ohci_bus_suspend, |
| 86 | .bus_resume = ohci_bus_resume, | 87 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/u132-hcd.c b/drivers/usb/host/u132-hcd.c index f29307405bb3..9b6323f768b2 100644 --- a/drivers/usb/host/u132-hcd.c +++ b/drivers/usb/host/u132-hcd.c | |||
| @@ -2934,6 +2934,16 @@ static int u132_start_port_reset(struct usb_hcd *hcd, unsigned port_num) | |||
| 2934 | return 0; | 2934 | return 0; |
| 2935 | } | 2935 | } |
| 2936 | 2936 | ||
| 2937 | static void u132_hub_irq_enable(struct usb_hcd *hcd) | ||
| 2938 | { | ||
| 2939 | struct u132 *u132 = hcd_to_u132(hcd); | ||
| 2940 | if (u132->going > 1) { | ||
| 2941 | dev_err(&u132->platform_dev->dev, "device has been removed %d\n" | ||
| 2942 | , u132->going); | ||
| 2943 | } else if (u132->going > 0) | ||
| 2944 | dev_err(&u132->platform_dev->dev, "device is being removed\n"); | ||
| 2945 | } | ||
| 2946 | |||
| 2937 | 2947 | ||
| 2938 | #ifdef CONFIG_PM | 2948 | #ifdef CONFIG_PM |
| 2939 | static int u132_bus_suspend(struct usb_hcd *hcd) | 2949 | static int u132_bus_suspend(struct usb_hcd *hcd) |
| @@ -2985,6 +2995,7 @@ static struct hc_driver u132_hc_driver = { | |||
| 2985 | .bus_suspend = u132_bus_suspend, | 2995 | .bus_suspend = u132_bus_suspend, |
| 2986 | .bus_resume = u132_bus_resume, | 2996 | .bus_resume = u132_bus_resume, |
| 2987 | .start_port_reset = u132_start_port_reset, | 2997 | .start_port_reset = u132_start_port_reset, |
| 2998 | .hub_irq_enable = u132_hub_irq_enable, | ||
| 2988 | }; | 2999 | }; |
| 2989 | 3000 | ||
| 2990 | /* | 3001 | /* |
diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c index cb7fa0eaf3ae..33182f4c2267 100644 --- a/drivers/usb/misc/sisusbvga/sisusb.c +++ b/drivers/usb/misc/sisusbvga/sisusb.c | |||
| @@ -3264,8 +3264,6 @@ static void sisusb_disconnect(struct usb_interface *intf) | |||
| 3264 | 3264 | ||
| 3265 | /* decrement our usage count */ | 3265 | /* decrement our usage count */ |
| 3266 | kref_put(&sisusb->kref, sisusb_delete); | 3266 | kref_put(&sisusb->kref, sisusb_delete); |
| 3267 | |||
| 3268 | dev_info(&sisusb->sisusb_dev->dev, "Disconnected\n"); | ||
| 3269 | } | 3267 | } |
| 3270 | 3268 | ||
| 3271 | static struct usb_device_id sisusb_table [] = { | 3269 | static struct usb_device_id sisusb_table [] = { |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 5234e7a3bd2c..0ff4a3971e45 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -637,6 +637,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 637 | { USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID), | 637 | { USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID), |
| 638 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 638 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
| 639 | { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) }, | 639 | { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) }, |
| 640 | { USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) }, | ||
| 640 | { }, /* Optional parameter entry */ | 641 | { }, /* Optional parameter entry */ |
| 641 | { } /* Terminating entry */ | 642 | { } /* Terminating entry */ |
| 642 | }; | 643 | }; |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index 06e0ecabb3eb..8302eca893ea 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
| @@ -828,6 +828,9 @@ | |||
| 828 | /* Propox devices */ | 828 | /* Propox devices */ |
| 829 | #define FTDI_PROPOX_JTAGCABLEII_PID 0xD738 | 829 | #define FTDI_PROPOX_JTAGCABLEII_PID 0xD738 |
| 830 | 830 | ||
| 831 | /* Rig Expert Ukraine devices */ | ||
| 832 | #define FTDI_REU_TINY_PID 0xED22 /* RigExpert Tiny */ | ||
| 833 | |||
| 831 | /* Commands */ | 834 | /* Commands */ |
| 832 | #define FTDI_SIO_RESET 0 /* Reset the port */ | 835 | #define FTDI_SIO_RESET 0 /* Reset the port */ |
| 833 | #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ | 836 | #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ |
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index ea924dc48496..d9fb3768a2d7 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c | |||
| @@ -570,7 +570,12 @@ static struct usb_serial_driver ipaq_device = { | |||
| 570 | .description = "PocketPC PDA", | 570 | .description = "PocketPC PDA", |
| 571 | .usb_driver = &ipaq_driver, | 571 | .usb_driver = &ipaq_driver, |
| 572 | .id_table = ipaq_id_table, | 572 | .id_table = ipaq_id_table, |
| 573 | .num_ports = 2, | 573 | /* |
| 574 | * some devices have an extra endpoint, which | ||
| 575 | * must be ignored as it would make the core | ||
| 576 | * create a second port which oopses when used | ||
| 577 | */ | ||
| 578 | .num_ports = 1, | ||
| 574 | .open = ipaq_open, | 579 | .open = ipaq_open, |
| 575 | .close = ipaq_close, | 580 | .close = ipaq_close, |
| 576 | .attach = ipaq_startup, | 581 | .attach = ipaq_startup, |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 43cfde83a93b..a73420dd052a 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -306,6 +306,7 @@ static struct usb_device_id option_ids[] = { | |||
| 306 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, | 306 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, |
| 307 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) }, | 307 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) }, |
| 308 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, | 308 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, |
| 309 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ | ||
| 309 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ | 310 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
| 310 | { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ | 311 | { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ |
| 311 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, | 312 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, |
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 103195abd417..2a0dd1b50dc4 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
| @@ -57,6 +57,7 @@ static struct usb_device_id id_table [] = { | |||
| 57 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) }, | 57 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) }, |
| 58 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) }, | 58 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) }, |
| 59 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) }, | 59 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) }, |
| 60 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) }, | ||
| 60 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, | 61 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, |
| 61 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, | 62 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, |
| 62 | { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) }, | 63 | { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) }, |
diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h index cff160abb130..6ac3bbcf7a22 100644 --- a/drivers/usb/serial/pl2303.h +++ b/drivers/usb/serial/pl2303.h | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #define PL2303_PRODUCT_ID_RSAQ3 0xaaa2 | 15 | #define PL2303_PRODUCT_ID_RSAQ3 0xaaa2 |
| 16 | #define PL2303_PRODUCT_ID_ALDIGA 0x0611 | 16 | #define PL2303_PRODUCT_ID_ALDIGA 0x0611 |
| 17 | #define PL2303_PRODUCT_ID_MMX 0x0612 | 17 | #define PL2303_PRODUCT_ID_MMX 0x0612 |
| 18 | #define PL2303_PRODUCT_ID_GPRS 0x0609 | ||
| 18 | 19 | ||
| 19 | #define ATEN_VENDOR_ID 0x0557 | 20 | #define ATEN_VENDOR_ID 0x0557 |
| 20 | #define ATEN_VENDOR_ID2 0x0547 | 21 | #define ATEN_VENDOR_ID2 0x0547 |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 45fe3663fa7f..39a7c11795c4 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -402,11 +402,19 @@ UNUSUAL_DEV( 0x04a5, 0x3010, 0x0100, 0x0100, | |||
| 402 | US_FL_IGNORE_RESIDUE ), | 402 | US_FL_IGNORE_RESIDUE ), |
| 403 | 403 | ||
| 404 | #ifdef CONFIG_USB_STORAGE_CYPRESS_ATACB | 404 | #ifdef CONFIG_USB_STORAGE_CYPRESS_ATACB |
| 405 | /* CY7C68300 : support atacb */ | ||
| 405 | UNUSUAL_DEV( 0x04b4, 0x6830, 0x0000, 0x9999, | 406 | UNUSUAL_DEV( 0x04b4, 0x6830, 0x0000, 0x9999, |
| 406 | "Cypress", | 407 | "Cypress", |
| 407 | "Cypress AT2LP", | 408 | "Cypress AT2LP", |
| 408 | US_SC_CYP_ATACB, US_PR_DEVICE, NULL, | 409 | US_SC_CYP_ATACB, US_PR_DEVICE, NULL, |
| 409 | 0), | 410 | 0), |
| 411 | |||
| 412 | /* CY7C68310 : support atacb and atacb2 */ | ||
| 413 | UNUSUAL_DEV( 0x04b4, 0x6831, 0x0000, 0x9999, | ||
| 414 | "Cypress", | ||
| 415 | "Cypress ISD-300LP", | ||
| 416 | US_SC_CYP_ATACB, US_PR_DEVICE, NULL, | ||
| 417 | 0), | ||
| 410 | #endif | 418 | #endif |
| 411 | 419 | ||
| 412 | /* Reported by Simon Levitt <simon@whattf.com> | 420 | /* Reported by Simon Levitt <simon@whattf.com> |
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 002b61b4f0f6..e0c5f96b273d 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig | |||
| @@ -1825,12 +1825,13 @@ config FB_FSL_DIU | |||
| 1825 | 1825 | ||
| 1826 | config FB_W100 | 1826 | config FB_W100 |
| 1827 | tristate "W100 frame buffer support" | 1827 | tristate "W100 frame buffer support" |
| 1828 | depends on FB && PXA_SHARPSL | 1828 | depends on FB && ARCH_PXA |
| 1829 | select FB_CFB_FILLRECT | 1829 | select FB_CFB_FILLRECT |
| 1830 | select FB_CFB_COPYAREA | 1830 | select FB_CFB_COPYAREA |
| 1831 | select FB_CFB_IMAGEBLIT | 1831 | select FB_CFB_IMAGEBLIT |
| 1832 | ---help--- | 1832 | ---help--- |
| 1833 | Frame buffer driver for the w100 as found on the Sharp SL-Cxx series. | 1833 | Frame buffer driver for the w100 as found on the Sharp SL-Cxx series. |
| 1834 | It can also drive the w3220 chip found on iPAQ hx4700. | ||
| 1834 | 1835 | ||
| 1835 | This driver is also available as a module ( = code which can be | 1836 | This driver is also available as a module ( = code which can be |
| 1836 | inserted and removed from the running kernel whenever you want). The | 1837 | inserted and removed from the running kernel whenever you want). The |
diff --git a/drivers/video/fb_defio.c b/drivers/video/fb_defio.c index 24843fdd5395..59df132cc375 100644 --- a/drivers/video/fb_defio.c +++ b/drivers/video/fb_defio.c | |||
| @@ -74,6 +74,7 @@ static int fb_deferred_io_mkwrite(struct vm_area_struct *vma, | |||
| 74 | { | 74 | { |
| 75 | struct fb_info *info = vma->vm_private_data; | 75 | struct fb_info *info = vma->vm_private_data; |
| 76 | struct fb_deferred_io *fbdefio = info->fbdefio; | 76 | struct fb_deferred_io *fbdefio = info->fbdefio; |
| 77 | struct page *cur; | ||
| 77 | 78 | ||
| 78 | /* this is a callback we get when userspace first tries to | 79 | /* this is a callback we get when userspace first tries to |
| 79 | write to the page. we schedule a workqueue. that workqueue | 80 | write to the page. we schedule a workqueue. that workqueue |
| @@ -83,7 +84,24 @@ static int fb_deferred_io_mkwrite(struct vm_area_struct *vma, | |||
| 83 | 84 | ||
| 84 | /* protect against the workqueue changing the page list */ | 85 | /* protect against the workqueue changing the page list */ |
| 85 | mutex_lock(&fbdefio->lock); | 86 | mutex_lock(&fbdefio->lock); |
| 86 | list_add(&page->lru, &fbdefio->pagelist); | 87 | |
| 88 | /* we loop through the pagelist before adding in order | ||
| 89 | to keep the pagelist sorted */ | ||
| 90 | list_for_each_entry(cur, &fbdefio->pagelist, lru) { | ||
| 91 | /* this check is to catch the case where a new | ||
| 92 | process could start writing to the same page | ||
| 93 | through a new pte. this new access can cause the | ||
| 94 | mkwrite even when the original ps's pte is marked | ||
| 95 | writable */ | ||
| 96 | if (unlikely(cur == page)) | ||
| 97 | goto page_already_added; | ||
| 98 | else if (cur->index > page->index) | ||
| 99 | break; | ||
| 100 | } | ||
| 101 | |||
| 102 | list_add_tail(&page->lru, &cur->lru); | ||
| 103 | |||
| 104 | page_already_added: | ||
| 87 | mutex_unlock(&fbdefio->lock); | 105 | mutex_unlock(&fbdefio->lock); |
| 88 | 106 | ||
| 89 | /* come back after delay to process the deferred IO */ | 107 | /* come back after delay to process the deferred IO */ |
diff --git a/drivers/video/fsl-diu-fb.c b/drivers/video/fsl-diu-fb.c index 0a2785361ca3..09d7e22c6fef 100644 --- a/drivers/video/fsl-diu-fb.c +++ b/drivers/video/fsl-diu-fb.c | |||
| @@ -286,7 +286,7 @@ static struct diu_pool pool; | |||
| 286 | * rheap and make the furture large allocation fail. | 286 | * rheap and make the furture large allocation fail. |
| 287 | */ | 287 | */ |
| 288 | 288 | ||
| 289 | void *fsl_diu_alloc(unsigned long size, phys_addr_t *phys) | 289 | static void *fsl_diu_alloc(unsigned long size, phys_addr_t *phys) |
| 290 | { | 290 | { |
| 291 | void *virt; | 291 | void *virt; |
| 292 | 292 | ||
| @@ -311,12 +311,12 @@ void *fsl_diu_alloc(unsigned long size, phys_addr_t *phys) | |||
| 311 | memset(virt, 0, size); | 311 | memset(virt, 0, size); |
| 312 | } | 312 | } |
| 313 | 313 | ||
| 314 | pr_debug("rh virt=%p phys=%lx\n", virt, *phys); | 314 | pr_debug("rh virt=%p phys=%llx\n", virt, (unsigned long long)*phys); |
| 315 | 315 | ||
| 316 | return virt; | 316 | return virt; |
| 317 | } | 317 | } |
| 318 | 318 | ||
| 319 | void fsl_diu_free(void *p, unsigned long size) | 319 | static void fsl_diu_free(void *p, unsigned long size) |
| 320 | { | 320 | { |
| 321 | pr_debug("p=%p size=%lu\n", p, size); | 321 | pr_debug("p=%p size=%lu\n", p, size); |
| 322 | 322 | ||
| @@ -770,7 +770,7 @@ static int map_video_memory(struct fb_info *info) | |||
| 770 | info->fix.smem_len = info->fix.line_length * info->var.yres_virtual; | 770 | info->fix.smem_len = info->fix.line_length * info->var.yres_virtual; |
| 771 | pr_debug("MAP_VIDEO_MEMORY: smem_len = %d\n", info->fix.smem_len); | 771 | pr_debug("MAP_VIDEO_MEMORY: smem_len = %d\n", info->fix.smem_len); |
| 772 | info->screen_base = fsl_diu_alloc(info->fix.smem_len, &phys); | 772 | info->screen_base = fsl_diu_alloc(info->fix.smem_len, &phys); |
| 773 | if (info->screen_base == 0) { | 773 | if (info->screen_base == NULL) { |
| 774 | printk(KERN_ERR "Unable to allocate fb memory\n"); | 774 | printk(KERN_ERR "Unable to allocate fb memory\n"); |
| 775 | return -ENOMEM; | 775 | return -ENOMEM; |
| 776 | } | 776 | } |
| @@ -788,7 +788,7 @@ static int map_video_memory(struct fb_info *info) | |||
| 788 | static void unmap_video_memory(struct fb_info *info) | 788 | static void unmap_video_memory(struct fb_info *info) |
| 789 | { | 789 | { |
| 790 | fsl_diu_free(info->screen_base, info->fix.smem_len); | 790 | fsl_diu_free(info->screen_base, info->fix.smem_len); |
| 791 | info->screen_base = 0; | 791 | info->screen_base = NULL; |
| 792 | info->fix.smem_start = 0; | 792 | info->fix.smem_start = 0; |
| 793 | info->fix.smem_len = 0; | 793 | info->fix.smem_len = 0; |
| 794 | } | 794 | } |
| @@ -1158,7 +1158,7 @@ static int init_fbinfo(struct fb_info *info) | |||
| 1158 | return 0; | 1158 | return 0; |
| 1159 | } | 1159 | } |
| 1160 | 1160 | ||
| 1161 | static int install_fb(struct fb_info *info) | 1161 | static int __devinit install_fb(struct fb_info *info) |
| 1162 | { | 1162 | { |
| 1163 | int rc; | 1163 | int rc; |
| 1164 | struct mfb_info *mfbi = info->par; | 1164 | struct mfb_info *mfbi = info->par; |
| @@ -1233,7 +1233,7 @@ static int install_fb(struct fb_info *info) | |||
| 1233 | return 0; | 1233 | return 0; |
| 1234 | } | 1234 | } |
| 1235 | 1235 | ||
| 1236 | static void __exit uninstall_fb(struct fb_info *info) | 1236 | static void uninstall_fb(struct fb_info *info) |
| 1237 | { | 1237 | { |
| 1238 | struct mfb_info *mfbi = info->par; | 1238 | struct mfb_info *mfbi = info->par; |
| 1239 | 1239 | ||
| @@ -1287,7 +1287,7 @@ static int request_irq_local(int irq) | |||
| 1287 | /* Read to clear the status */ | 1287 | /* Read to clear the status */ |
| 1288 | status = in_be32(&hw->int_status); | 1288 | status = in_be32(&hw->int_status); |
| 1289 | 1289 | ||
| 1290 | ret = request_irq(irq, fsl_diu_isr, 0, "diu", 0); | 1290 | ret = request_irq(irq, fsl_diu_isr, 0, "diu", NULL); |
| 1291 | if (ret) | 1291 | if (ret) |
| 1292 | pr_info("Request diu IRQ failed.\n"); | 1292 | pr_info("Request diu IRQ failed.\n"); |
| 1293 | else { | 1293 | else { |
| @@ -1312,7 +1312,7 @@ static void free_irq_local(int irq) | |||
| 1312 | /* Disable all LCDC interrupt */ | 1312 | /* Disable all LCDC interrupt */ |
| 1313 | out_be32(&hw->int_mask, 0x1f); | 1313 | out_be32(&hw->int_mask, 0x1f); |
| 1314 | 1314 | ||
| 1315 | free_irq(irq, 0); | 1315 | free_irq(irq, NULL); |
| 1316 | } | 1316 | } |
| 1317 | 1317 | ||
| 1318 | #ifdef CONFIG_PM | 1318 | #ifdef CONFIG_PM |
| @@ -1353,7 +1353,8 @@ static int allocate_buf(struct diu_addr *buf, u32 size, u32 bytes_align) | |||
| 1353 | dma_addr_t paddr = 0; | 1353 | dma_addr_t paddr = 0; |
| 1354 | 1354 | ||
| 1355 | ssize = size + bytes_align; | 1355 | ssize = size + bytes_align; |
| 1356 | buf->vaddr = dma_alloc_coherent(0, ssize, &paddr, GFP_DMA | __GFP_ZERO); | 1356 | buf->vaddr = dma_alloc_coherent(NULL, ssize, &paddr, GFP_DMA | |
| 1357 | __GFP_ZERO); | ||
| 1357 | if (!buf->vaddr) | 1358 | if (!buf->vaddr) |
| 1358 | return -ENOMEM; | 1359 | return -ENOMEM; |
| 1359 | 1360 | ||
| @@ -1371,7 +1372,7 @@ static int allocate_buf(struct diu_addr *buf, u32 size, u32 bytes_align) | |||
| 1371 | 1372 | ||
| 1372 | static void free_buf(struct diu_addr *buf, u32 size, u32 bytes_align) | 1373 | static void free_buf(struct diu_addr *buf, u32 size, u32 bytes_align) |
| 1373 | { | 1374 | { |
| 1374 | dma_free_coherent(0, size + bytes_align, | 1375 | dma_free_coherent(NULL, size + bytes_align, |
| 1375 | buf->vaddr, (buf->paddr - buf->offset)); | 1376 | buf->vaddr, (buf->paddr - buf->offset)); |
| 1376 | return; | 1377 | return; |
| 1377 | } | 1378 | } |
| @@ -1411,7 +1412,7 @@ static ssize_t show_monitor(struct device *device, | |||
| 1411 | return diu_ops.show_monitor_port(machine_data->monitor_port, buf); | 1412 | return diu_ops.show_monitor_port(machine_data->monitor_port, buf); |
| 1412 | } | 1413 | } |
| 1413 | 1414 | ||
| 1414 | static int fsl_diu_probe(struct of_device *ofdev, | 1415 | static int __devinit fsl_diu_probe(struct of_device *ofdev, |
| 1415 | const struct of_device_id *match) | 1416 | const struct of_device_id *match) |
| 1416 | { | 1417 | { |
| 1417 | struct device_node *np = ofdev->node; | 1418 | struct device_node *np = ofdev->node; |
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c index 7dcda187d9ba..fafe7db20d6d 100644 --- a/drivers/video/pxafb.c +++ b/drivers/video/pxafb.c | |||
| @@ -1246,7 +1246,7 @@ static int pxafb_resume(struct platform_device *dev) | |||
| 1246 | * cache. Once this area is remapped, all virtual memory | 1246 | * cache. Once this area is remapped, all virtual memory |
| 1247 | * access to the video memory should occur at the new region. | 1247 | * access to the video memory should occur at the new region. |
| 1248 | */ | 1248 | */ |
| 1249 | static int __init pxafb_map_video_memory(struct pxafb_info *fbi) | 1249 | static int __devinit pxafb_map_video_memory(struct pxafb_info *fbi) |
| 1250 | { | 1250 | { |
| 1251 | /* | 1251 | /* |
| 1252 | * We reserve one page for the palette, plus the size | 1252 | * We reserve one page for the palette, plus the size |
| @@ -1348,7 +1348,7 @@ decode_mode: | |||
| 1348 | pxafb_decode_mode_info(fbi, inf->modes, inf->num_modes); | 1348 | pxafb_decode_mode_info(fbi, inf->modes, inf->num_modes); |
| 1349 | } | 1349 | } |
| 1350 | 1350 | ||
| 1351 | static struct pxafb_info * __init pxafb_init_fbinfo(struct device *dev) | 1351 | static struct pxafb_info * __devinit pxafb_init_fbinfo(struct device *dev) |
| 1352 | { | 1352 | { |
| 1353 | struct pxafb_info *fbi; | 1353 | struct pxafb_info *fbi; |
| 1354 | void *addr; | 1354 | void *addr; |
| @@ -1410,7 +1410,7 @@ static struct pxafb_info * __init pxafb_init_fbinfo(struct device *dev) | |||
| 1410 | } | 1410 | } |
| 1411 | 1411 | ||
| 1412 | #ifdef CONFIG_FB_PXA_PARAMETERS | 1412 | #ifdef CONFIG_FB_PXA_PARAMETERS |
| 1413 | static int __init parse_opt_mode(struct device *dev, const char *this_opt) | 1413 | static int __devinit parse_opt_mode(struct device *dev, const char *this_opt) |
| 1414 | { | 1414 | { |
| 1415 | struct pxafb_mach_info *inf = dev->platform_data; | 1415 | struct pxafb_mach_info *inf = dev->platform_data; |
| 1416 | 1416 | ||
| @@ -1469,7 +1469,7 @@ done: | |||
| 1469 | return 0; | 1469 | return 0; |
| 1470 | } | 1470 | } |
| 1471 | 1471 | ||
| 1472 | static int __init parse_opt(struct device *dev, char *this_opt) | 1472 | static int __devinit parse_opt(struct device *dev, char *this_opt) |
| 1473 | { | 1473 | { |
| 1474 | struct pxafb_mach_info *inf = dev->platform_data; | 1474 | struct pxafb_mach_info *inf = dev->platform_data; |
| 1475 | struct pxafb_mode_info *mode = &inf->modes[0]; | 1475 | struct pxafb_mode_info *mode = &inf->modes[0]; |
| @@ -1567,7 +1567,7 @@ static int __init parse_opt(struct device *dev, char *this_opt) | |||
| 1567 | return 0; | 1567 | return 0; |
| 1568 | } | 1568 | } |
| 1569 | 1569 | ||
| 1570 | static int __init pxafb_parse_options(struct device *dev, char *options) | 1570 | static int __devinit pxafb_parse_options(struct device *dev, char *options) |
| 1571 | { | 1571 | { |
| 1572 | char *this_opt; | 1572 | char *this_opt; |
| 1573 | int ret; | 1573 | int ret; |
| @@ -1588,8 +1588,8 @@ static int __init pxafb_parse_options(struct device *dev, char *options) | |||
| 1588 | 1588 | ||
| 1589 | static char g_options[256] __devinitdata = ""; | 1589 | static char g_options[256] __devinitdata = ""; |
| 1590 | 1590 | ||
| 1591 | #ifndef CONFIG_MODULES | 1591 | #ifndef MODULE |
| 1592 | static int __devinit pxafb_setup_options(void) | 1592 | static int __init pxafb_setup_options(void) |
| 1593 | { | 1593 | { |
| 1594 | char *options = NULL; | 1594 | char *options = NULL; |
| 1595 | 1595 | ||
| @@ -1613,7 +1613,7 @@ MODULE_PARM_DESC(options, "LCD parameters (see Documentation/fb/pxafb.txt)"); | |||
| 1613 | #define pxafb_setup_options() (0) | 1613 | #define pxafb_setup_options() (0) |
| 1614 | #endif | 1614 | #endif |
| 1615 | 1615 | ||
| 1616 | static int __init pxafb_probe(struct platform_device *dev) | 1616 | static int __devinit pxafb_probe(struct platform_device *dev) |
| 1617 | { | 1617 | { |
| 1618 | struct pxafb_info *fbi; | 1618 | struct pxafb_info *fbi; |
| 1619 | struct pxafb_mach_info *inf; | 1619 | struct pxafb_mach_info *inf; |
| @@ -1685,14 +1685,14 @@ static int __init pxafb_probe(struct platform_device *dev) | |||
| 1685 | if (r == NULL) { | 1685 | if (r == NULL) { |
| 1686 | dev_err(&dev->dev, "no I/O memory resource defined\n"); | 1686 | dev_err(&dev->dev, "no I/O memory resource defined\n"); |
| 1687 | ret = -ENODEV; | 1687 | ret = -ENODEV; |
| 1688 | goto failed; | 1688 | goto failed_fbi; |
| 1689 | } | 1689 | } |
| 1690 | 1690 | ||
| 1691 | r = request_mem_region(r->start, r->end - r->start + 1, dev->name); | 1691 | r = request_mem_region(r->start, r->end - r->start + 1, dev->name); |
| 1692 | if (r == NULL) { | 1692 | if (r == NULL) { |
| 1693 | dev_err(&dev->dev, "failed to request I/O memory\n"); | 1693 | dev_err(&dev->dev, "failed to request I/O memory\n"); |
| 1694 | ret = -EBUSY; | 1694 | ret = -EBUSY; |
| 1695 | goto failed; | 1695 | goto failed_fbi; |
| 1696 | } | 1696 | } |
| 1697 | 1697 | ||
| 1698 | fbi->mmio_base = ioremap(r->start, r->end - r->start + 1); | 1698 | fbi->mmio_base = ioremap(r->start, r->end - r->start + 1); |
| @@ -1735,8 +1735,17 @@ static int __init pxafb_probe(struct platform_device *dev) | |||
| 1735 | * This makes sure that our colour bitfield | 1735 | * This makes sure that our colour bitfield |
| 1736 | * descriptors are correctly initialised. | 1736 | * descriptors are correctly initialised. |
| 1737 | */ | 1737 | */ |
| 1738 | pxafb_check_var(&fbi->fb.var, &fbi->fb); | 1738 | ret = pxafb_check_var(&fbi->fb.var, &fbi->fb); |
| 1739 | pxafb_set_par(&fbi->fb); | 1739 | if (ret) { |
| 1740 | dev_err(&dev->dev, "failed to get suitable mode\n"); | ||
| 1741 | goto failed_free_irq; | ||
| 1742 | } | ||
| 1743 | |||
| 1744 | ret = pxafb_set_par(&fbi->fb); | ||
| 1745 | if (ret) { | ||
| 1746 | dev_err(&dev->dev, "Failed to set parameters\n"); | ||
| 1747 | goto failed_free_irq; | ||
| 1748 | } | ||
| 1740 | 1749 | ||
| 1741 | platform_set_drvdata(dev, fbi); | 1750 | platform_set_drvdata(dev, fbi); |
| 1742 | 1751 | ||
| @@ -1744,7 +1753,7 @@ static int __init pxafb_probe(struct platform_device *dev) | |||
| 1744 | if (ret < 0) { | 1753 | if (ret < 0) { |
| 1745 | dev_err(&dev->dev, | 1754 | dev_err(&dev->dev, |
| 1746 | "Failed to register framebuffer device: %d\n", ret); | 1755 | "Failed to register framebuffer device: %d\n", ret); |
| 1747 | goto failed_free_irq; | 1756 | goto failed_free_cmap; |
| 1748 | } | 1757 | } |
| 1749 | 1758 | ||
| 1750 | #ifdef CONFIG_CPU_FREQ | 1759 | #ifdef CONFIG_CPU_FREQ |
| @@ -1763,18 +1772,23 @@ static int __init pxafb_probe(struct platform_device *dev) | |||
| 1763 | 1772 | ||
| 1764 | return 0; | 1773 | return 0; |
| 1765 | 1774 | ||
| 1775 | failed_free_cmap: | ||
| 1776 | if (fbi->fb.cmap.len) | ||
| 1777 | fb_dealloc_cmap(&fbi->fb.cmap); | ||
| 1766 | failed_free_irq: | 1778 | failed_free_irq: |
| 1767 | free_irq(irq, fbi); | 1779 | free_irq(irq, fbi); |
| 1768 | failed_free_res: | ||
| 1769 | release_mem_region(r->start, r->end - r->start + 1); | ||
| 1770 | failed_free_io: | ||
| 1771 | iounmap(fbi->mmio_base); | ||
| 1772 | failed_free_mem: | 1780 | failed_free_mem: |
| 1773 | dma_free_writecombine(&dev->dev, fbi->map_size, | 1781 | dma_free_writecombine(&dev->dev, fbi->map_size, |
| 1774 | fbi->map_cpu, fbi->map_dma); | 1782 | fbi->map_cpu, fbi->map_dma); |
| 1775 | failed: | 1783 | failed_free_io: |
| 1784 | iounmap(fbi->mmio_base); | ||
| 1785 | failed_free_res: | ||
| 1786 | release_mem_region(r->start, r->end - r->start + 1); | ||
| 1787 | failed_fbi: | ||
| 1788 | clk_put(fbi->clk); | ||
| 1776 | platform_set_drvdata(dev, NULL); | 1789 | platform_set_drvdata(dev, NULL); |
| 1777 | kfree(fbi); | 1790 | kfree(fbi); |
| 1791 | failed: | ||
| 1778 | return ret; | 1792 | return ret; |
| 1779 | } | 1793 | } |
| 1780 | 1794 | ||
| @@ -1787,7 +1801,7 @@ static struct platform_driver pxafb_driver = { | |||
| 1787 | }, | 1801 | }, |
| 1788 | }; | 1802 | }; |
| 1789 | 1803 | ||
| 1790 | static int __devinit pxafb_init(void) | 1804 | static int __init pxafb_init(void) |
| 1791 | { | 1805 | { |
| 1792 | if (pxafb_setup_options()) | 1806 | if (pxafb_setup_options()) |
| 1793 | return -EINVAL; | 1807 | return -EINVAL; |
diff --git a/drivers/video/w100fb.c b/drivers/video/w100fb.c index 30469bf906e5..d0674f1e3f10 100644 --- a/drivers/video/w100fb.c +++ b/drivers/video/w100fb.c | |||
| @@ -1003,6 +1003,7 @@ static struct w100_pll_info xtal_14318000[] = { | |||
| 1003 | static struct w100_pll_info xtal_16000000[] = { | 1003 | static struct w100_pll_info xtal_16000000[] = { |
| 1004 | /*freq M N_int N_fac tfgoal lock_time */ | 1004 | /*freq M N_int N_fac tfgoal lock_time */ |
| 1005 | { 72, 1, 8, 0, 0xe0, 48}, /* tfgoal guessed */ | 1005 | { 72, 1, 8, 0, 0xe0, 48}, /* tfgoal guessed */ |
| 1006 | { 80, 1, 9, 0, 0xe0, 13}, /* tfgoal guessed */ | ||
| 1006 | { 95, 1, 10, 7, 0xe0, 38}, /* tfgoal guessed */ | 1007 | { 95, 1, 10, 7, 0xe0, 38}, /* tfgoal guessed */ |
| 1007 | { 96, 1, 11, 0, 0xe0, 36}, /* tfgoal guessed */ | 1008 | { 96, 1, 11, 0, 0xe0, 36}, /* tfgoal guessed */ |
| 1008 | { 0, 0, 0, 0, 0, 0}, | 1009 | { 0, 0, 0, 0, 0, 0}, |
diff --git a/fs/9p/v9fs_vfs.h b/fs/9p/v9fs_vfs.h index fd01d90cada5..57997fa14e69 100644 --- a/fs/9p/v9fs_vfs.h +++ b/fs/9p/v9fs_vfs.h | |||
| @@ -51,4 +51,4 @@ int v9fs_dir_release(struct inode *inode, struct file *filp); | |||
| 51 | int v9fs_file_open(struct inode *inode, struct file *file); | 51 | int v9fs_file_open(struct inode *inode, struct file *file); |
| 52 | void v9fs_inode2stat(struct inode *inode, struct p9_stat *stat); | 52 | void v9fs_inode2stat(struct inode *inode, struct p9_stat *stat); |
| 53 | void v9fs_dentry_release(struct dentry *); | 53 | void v9fs_dentry_release(struct dentry *); |
| 54 | int v9fs_uflags2omode(int uflags); | 54 | int v9fs_uflags2omode(int uflags, int extended); |
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index 0d55affe37d4..52944d2249a4 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c | |||
| @@ -59,7 +59,7 @@ int v9fs_file_open(struct inode *inode, struct file *file) | |||
| 59 | 59 | ||
| 60 | P9_DPRINTK(P9_DEBUG_VFS, "inode: %p file: %p \n", inode, file); | 60 | P9_DPRINTK(P9_DEBUG_VFS, "inode: %p file: %p \n", inode, file); |
| 61 | v9ses = v9fs_inode2v9ses(inode); | 61 | v9ses = v9fs_inode2v9ses(inode); |
| 62 | omode = v9fs_uflags2omode(file->f_flags); | 62 | omode = v9fs_uflags2omode(file->f_flags, v9fs_extended(v9ses)); |
| 63 | fid = file->private_data; | 63 | fid = file->private_data; |
| 64 | if (!fid) { | 64 | if (!fid) { |
| 65 | fid = v9fs_fid_clone(file->f_path.dentry); | 65 | fid = v9fs_fid_clone(file->f_path.dentry); |
| @@ -75,6 +75,8 @@ int v9fs_file_open(struct inode *inode, struct file *file) | |||
| 75 | inode->i_size = 0; | 75 | inode->i_size = 0; |
| 76 | inode->i_blocks = 0; | 76 | inode->i_blocks = 0; |
| 77 | } | 77 | } |
| 78 | if ((file->f_flags & O_APPEND) && (!v9fs_extended(v9ses))) | ||
| 79 | generic_file_llseek(file, 0, SEEK_END); | ||
| 78 | } | 80 | } |
| 79 | 81 | ||
| 80 | file->private_data = fid; | 82 | file->private_data = fid; |
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 40fa807bd929..c95295c65045 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
| @@ -132,10 +132,10 @@ static int p9mode2unixmode(struct v9fs_session_info *v9ses, int mode) | |||
| 132 | /** | 132 | /** |
| 133 | * v9fs_uflags2omode- convert posix open flags to plan 9 mode bits | 133 | * v9fs_uflags2omode- convert posix open flags to plan 9 mode bits |
| 134 | * @uflags: flags to convert | 134 | * @uflags: flags to convert |
| 135 | * | 135 | * @extended: if .u extensions are active |
| 136 | */ | 136 | */ |
| 137 | 137 | ||
| 138 | int v9fs_uflags2omode(int uflags) | 138 | int v9fs_uflags2omode(int uflags, int extended) |
| 139 | { | 139 | { |
| 140 | int ret; | 140 | int ret; |
| 141 | 141 | ||
| @@ -155,14 +155,16 @@ int v9fs_uflags2omode(int uflags) | |||
| 155 | break; | 155 | break; |
| 156 | } | 156 | } |
| 157 | 157 | ||
| 158 | if (uflags & O_EXCL) | ||
| 159 | ret |= P9_OEXCL; | ||
| 160 | |||
| 161 | if (uflags & O_TRUNC) | 158 | if (uflags & O_TRUNC) |
| 162 | ret |= P9_OTRUNC; | 159 | ret |= P9_OTRUNC; |
| 163 | 160 | ||
| 164 | if (uflags & O_APPEND) | 161 | if (extended) { |
| 165 | ret |= P9_OAPPEND; | 162 | if (uflags & O_EXCL) |
| 163 | ret |= P9_OEXCL; | ||
| 164 | |||
| 165 | if (uflags & O_APPEND) | ||
| 166 | ret |= P9_OAPPEND; | ||
| 167 | } | ||
| 166 | 168 | ||
| 167 | return ret; | 169 | return ret; |
| 168 | } | 170 | } |
| @@ -506,7 +508,7 @@ v9fs_vfs_create(struct inode *dir, struct dentry *dentry, int mode, | |||
| 506 | flags = O_RDWR; | 508 | flags = O_RDWR; |
| 507 | 509 | ||
| 508 | fid = v9fs_create(v9ses, dir, dentry, NULL, perm, | 510 | fid = v9fs_create(v9ses, dir, dentry, NULL, perm, |
| 509 | v9fs_uflags2omode(flags)); | 511 | v9fs_uflags2omode(flags, v9fs_extended(v9ses))); |
| 510 | if (IS_ERR(fid)) { | 512 | if (IS_ERR(fid)) { |
| 511 | err = PTR_ERR(fid); | 513 | err = PTR_ERR(fid); |
| 512 | fid = NULL; | 514 | fid = NULL; |
diff --git a/fs/Kconfig b/fs/Kconfig index cf12c403b8c7..2694648cbd1b 100644 --- a/fs/Kconfig +++ b/fs/Kconfig | |||
| @@ -830,7 +830,7 @@ config NTFS_FS | |||
| 830 | from the project web site. | 830 | from the project web site. |
| 831 | 831 | ||
| 832 | For more information see <file:Documentation/filesystems/ntfs.txt> | 832 | For more information see <file:Documentation/filesystems/ntfs.txt> |
| 833 | and <http://linux-ntfs.sourceforge.net/>. | 833 | and <http://www.linux-ntfs.org/>. |
| 834 | 834 | ||
| 835 | To compile this file system support as a module, choose M here: the | 835 | To compile this file system support as a module, choose M here: the |
| 836 | module will be called ntfs. | 836 | module will be called ntfs. |
diff --git a/fs/buffer.c b/fs/buffer.c index a073f3f4f013..0f51c0f7c266 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
| @@ -821,7 +821,7 @@ static int fsync_buffers_list(spinlock_t *lock, struct list_head *list) | |||
| 821 | * contents - it is a noop if I/O is still in | 821 | * contents - it is a noop if I/O is still in |
| 822 | * flight on potentially older contents. | 822 | * flight on potentially older contents. |
| 823 | */ | 823 | */ |
| 824 | ll_rw_block(SWRITE, 1, &bh); | 824 | ll_rw_block(SWRITE_SYNC, 1, &bh); |
| 825 | brelse(bh); | 825 | brelse(bh); |
| 826 | spin_lock(lock); | 826 | spin_lock(lock); |
| 827 | } | 827 | } |
| @@ -2940,16 +2940,19 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) | |||
| 2940 | for (i = 0; i < nr; i++) { | 2940 | for (i = 0; i < nr; i++) { |
| 2941 | struct buffer_head *bh = bhs[i]; | 2941 | struct buffer_head *bh = bhs[i]; |
| 2942 | 2942 | ||
| 2943 | if (rw == SWRITE) | 2943 | if (rw == SWRITE || rw == SWRITE_SYNC) |
| 2944 | lock_buffer(bh); | 2944 | lock_buffer(bh); |
| 2945 | else if (test_set_buffer_locked(bh)) | 2945 | else if (test_set_buffer_locked(bh)) |
| 2946 | continue; | 2946 | continue; |
| 2947 | 2947 | ||
| 2948 | if (rw == WRITE || rw == SWRITE) { | 2948 | if (rw == WRITE || rw == SWRITE || rw == SWRITE_SYNC) { |
| 2949 | if (test_clear_buffer_dirty(bh)) { | 2949 | if (test_clear_buffer_dirty(bh)) { |
| 2950 | bh->b_end_io = end_buffer_write_sync; | 2950 | bh->b_end_io = end_buffer_write_sync; |
| 2951 | get_bh(bh); | 2951 | get_bh(bh); |
| 2952 | submit_bh(WRITE, bh); | 2952 | if (rw == SWRITE_SYNC) |
| 2953 | submit_bh(WRITE_SYNC, bh); | ||
| 2954 | else | ||
| 2955 | submit_bh(WRITE, bh); | ||
| 2953 | continue; | 2956 | continue; |
| 2954 | } | 2957 | } |
| 2955 | } else { | 2958 | } else { |
| @@ -2978,7 +2981,7 @@ int sync_dirty_buffer(struct buffer_head *bh) | |||
| 2978 | if (test_clear_buffer_dirty(bh)) { | 2981 | if (test_clear_buffer_dirty(bh)) { |
| 2979 | get_bh(bh); | 2982 | get_bh(bh); |
| 2980 | bh->b_end_io = end_buffer_write_sync; | 2983 | bh->b_end_io = end_buffer_write_sync; |
| 2981 | ret = submit_bh(WRITE, bh); | 2984 | ret = submit_bh(WRITE_SYNC, bh); |
| 2982 | wait_on_buffer(bh); | 2985 | wait_on_buffer(bh); |
| 2983 | if (buffer_eopnotsupp(bh)) { | 2986 | if (buffer_eopnotsupp(bh)) { |
| 2984 | clear_buffer_eopnotsupp(bh); | 2987 | clear_buffer_eopnotsupp(bh); |
diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c index 34902cff5400..0e9fc2ba90ee 100644 --- a/fs/cifs/cifsacl.c +++ b/fs/cifs/cifsacl.c | |||
| @@ -34,11 +34,11 @@ | |||
| 34 | static struct cifs_wksid wksidarr[NUM_WK_SIDS] = { | 34 | static struct cifs_wksid wksidarr[NUM_WK_SIDS] = { |
| 35 | {{1, 0, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, "null user"}, | 35 | {{1, 0, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, "null user"}, |
| 36 | {{1, 1, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0} }, "nobody"}, | 36 | {{1, 1, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0} }, "nobody"}, |
| 37 | {{1, 1, {0, 0, 0, 0, 0, 5}, {cpu_to_le32(11), 0, 0, 0, 0} }, "net-users"}, | 37 | {{1, 1, {0, 0, 0, 0, 0, 5}, {__constant_cpu_to_le32(11), 0, 0, 0, 0} }, "net-users"}, |
| 38 | {{1, 1, {0, 0, 0, 0, 0, 5}, {cpu_to_le32(18), 0, 0, 0, 0} }, "sys"}, | 38 | {{1, 1, {0, 0, 0, 0, 0, 5}, {__constant_cpu_to_le32(18), 0, 0, 0, 0} }, "sys"}, |
| 39 | {{1, 2, {0, 0, 0, 0, 0, 5}, {cpu_to_le32(32), cpu_to_le32(544), 0, 0, 0} }, "root"}, | 39 | {{1, 2, {0, 0, 0, 0, 0, 5}, {__constant_cpu_to_le32(32), __constant_cpu_to_le32(544), 0, 0, 0} }, "root"}, |
| 40 | {{1, 2, {0, 0, 0, 0, 0, 5}, {cpu_to_le32(32), cpu_to_le32(545), 0, 0, 0} }, "users"}, | 40 | {{1, 2, {0, 0, 0, 0, 0, 5}, {__constant_cpu_to_le32(32), __constant_cpu_to_le32(545), 0, 0, 0} }, "users"}, |
| 41 | {{1, 2, {0, 0, 0, 0, 0, 5}, {cpu_to_le32(32), cpu_to_le32(546), 0, 0, 0} }, "guest"} } | 41 | {{1, 2, {0, 0, 0, 0, 0, 5}, {__constant_cpu_to_le32(32), __constant_cpu_to_le32(546), 0, 0, 0} }, "guest"} } |
| 42 | ; | 42 | ; |
| 43 | 43 | ||
| 44 | 44 | ||
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 722be543ceec..2e904bd111c8 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
| @@ -219,15 +219,15 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
| 219 | rc = CIFSSMBUnixQPathInfo(xid, pTcon, full_path, &find_data, | 219 | rc = CIFSSMBUnixQPathInfo(xid, pTcon, full_path, &find_data, |
| 220 | cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & | 220 | cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & |
| 221 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 221 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 222 | if (rc) { | 222 | if (rc == -EREMOTE && !is_dfs_referral) { |
| 223 | if (rc == -EREMOTE && !is_dfs_referral) { | 223 | is_dfs_referral = true; |
| 224 | is_dfs_referral = true; | 224 | cFYI(DBG2, ("DFS ref")); |
| 225 | cFYI(DBG2, ("DFS ref")); | 225 | /* for DFS, server does not give us real inode data */ |
| 226 | /* for DFS, server does not give us real inode data */ | 226 | fill_fake_finddataunix(&find_data, sb); |
| 227 | fill_fake_finddataunix(&find_data, sb); | 227 | rc = 0; |
| 228 | rc = 0; | 228 | } else if (rc) |
| 229 | } | 229 | goto cgiiu_exit; |
| 230 | } | 230 | |
| 231 | num_of_bytes = le64_to_cpu(find_data.NumOfBytes); | 231 | num_of_bytes = le64_to_cpu(find_data.NumOfBytes); |
| 232 | end_of_file = le64_to_cpu(find_data.EndOfFile); | 232 | end_of_file = le64_to_cpu(find_data.EndOfFile); |
| 233 | 233 | ||
| @@ -236,7 +236,7 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
| 236 | *pinode = new_inode(sb); | 236 | *pinode = new_inode(sb); |
| 237 | if (*pinode == NULL) { | 237 | if (*pinode == NULL) { |
| 238 | rc = -ENOMEM; | 238 | rc = -ENOMEM; |
| 239 | goto cgiiu_exit; | 239 | goto cgiiu_exit; |
| 240 | } | 240 | } |
| 241 | /* Is an i_ino of zero legal? */ | 241 | /* Is an i_ino of zero legal? */ |
| 242 | /* note ino incremented to unique num in new_inode */ | 242 | /* note ino incremented to unique num in new_inode */ |
diff --git a/fs/ecryptfs/miscdev.c b/fs/ecryptfs/miscdev.c index 50c994a249a5..09a4522f65e6 100644 --- a/fs/ecryptfs/miscdev.c +++ b/fs/ecryptfs/miscdev.c | |||
| @@ -575,13 +575,11 @@ int ecryptfs_init_ecryptfs_miscdev(void) | |||
| 575 | int rc; | 575 | int rc; |
| 576 | 576 | ||
| 577 | atomic_set(&ecryptfs_num_miscdev_opens, 0); | 577 | atomic_set(&ecryptfs_num_miscdev_opens, 0); |
| 578 | mutex_lock(&ecryptfs_daemon_hash_mux); | ||
| 579 | rc = misc_register(&ecryptfs_miscdev); | 578 | rc = misc_register(&ecryptfs_miscdev); |
| 580 | if (rc) | 579 | if (rc) |
| 581 | printk(KERN_ERR "%s: Failed to register miscellaneous device " | 580 | printk(KERN_ERR "%s: Failed to register miscellaneous device " |
| 582 | "for communications with userspace daemons; rc = [%d]\n", | 581 | "for communications with userspace daemons; rc = [%d]\n", |
| 583 | __func__, rc); | 582 | __func__, rc); |
| 584 | mutex_unlock(&ecryptfs_daemon_hash_mux); | ||
| 585 | return rc; | 583 | return rc; |
| 586 | } | 584 | } |
| 587 | 585 | ||
| @@ -610,7 +610,7 @@ int setup_arg_pages(struct linux_binprm *bprm, | |||
| 610 | bprm->exec -= stack_shift; | 610 | bprm->exec -= stack_shift; |
| 611 | 611 | ||
| 612 | down_write(&mm->mmap_sem); | 612 | down_write(&mm->mmap_sem); |
| 613 | vm_flags = vma->vm_flags; | 613 | vm_flags = VM_STACK_FLAGS; |
| 614 | 614 | ||
| 615 | /* | 615 | /* |
| 616 | * Adjust stack execute permissions; explicitly enable for | 616 | * Adjust stack execute permissions; explicitly enable for |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index fe3119a71ada..2845425077e8 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
| @@ -2875,8 +2875,10 @@ static ssize_t ext3_quota_write(struct super_block *sb, int type, | |||
| 2875 | blk++; | 2875 | blk++; |
| 2876 | } | 2876 | } |
| 2877 | out: | 2877 | out: |
| 2878 | if (len == towrite) | 2878 | if (len == towrite) { |
| 2879 | mutex_unlock(&inode->i_mutex); | ||
| 2879 | return err; | 2880 | return err; |
| 2881 | } | ||
| 2880 | if (inode->i_size < off+len-towrite) { | 2882 | if (inode->i_size < off+len-towrite) { |
| 2881 | i_size_write(inode, off+len-towrite); | 2883 | i_size_write(inode, off+len-towrite); |
| 2882 | EXT3_I(inode)->i_disksize = inode->i_size; | 2884 | EXT3_I(inode)->i_disksize = inode->i_size; |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index cb96f127c366..02bf24343979 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -3337,8 +3337,10 @@ static ssize_t ext4_quota_write(struct super_block *sb, int type, | |||
| 3337 | blk++; | 3337 | blk++; |
| 3338 | } | 3338 | } |
| 3339 | out: | 3339 | out: |
| 3340 | if (len == towrite) | 3340 | if (len == towrite) { |
| 3341 | mutex_unlock(&inode->i_mutex); | ||
| 3341 | return err; | 3342 | return err; |
| 3343 | } | ||
| 3342 | if (inode->i_size < off+len-towrite) { | 3344 | if (inode->i_size < off+len-towrite) { |
| 3343 | i_size_write(inode, off+len-towrite); | 3345 | i_size_write(inode, off+len-towrite); |
| 3344 | EXT4_I(inode)->i_disksize = inode->i_size; | 3346 | EXT4_I(inode)->i_disksize = inode->i_size; |
diff --git a/fs/libfs.c b/fs/libfs.c index 892d41cb3382..baeb71ee1cde 100644 --- a/fs/libfs.c +++ b/fs/libfs.c | |||
| @@ -512,6 +512,20 @@ void simple_release_fs(struct vfsmount **mount, int *count) | |||
| 512 | mntput(mnt); | 512 | mntput(mnt); |
| 513 | } | 513 | } |
| 514 | 514 | ||
| 515 | /** | ||
| 516 | * simple_read_from_buffer - copy data from the buffer to user space | ||
| 517 | * @to: the user space buffer to read to | ||
| 518 | * @count: the maximum number of bytes to read | ||
| 519 | * @ppos: the current position in the buffer | ||
| 520 | * @from: the buffer to read from | ||
| 521 | * @available: the size of the buffer | ||
| 522 | * | ||
| 523 | * The simple_read_from_buffer() function reads up to @count bytes from the | ||
| 524 | * buffer @from at offset @ppos into the user space address starting at @to. | ||
| 525 | * | ||
| 526 | * On success, the number of bytes read is returned and the offset @ppos is | ||
| 527 | * advanced by this number, or negative value is returned on error. | ||
| 528 | **/ | ||
| 515 | ssize_t simple_read_from_buffer(void __user *to, size_t count, loff_t *ppos, | 529 | ssize_t simple_read_from_buffer(void __user *to, size_t count, loff_t *ppos, |
| 516 | const void *from, size_t available) | 530 | const void *from, size_t available) |
| 517 | { | 531 | { |
| @@ -528,6 +542,20 @@ ssize_t simple_read_from_buffer(void __user *to, size_t count, loff_t *ppos, | |||
| 528 | return count; | 542 | return count; |
| 529 | } | 543 | } |
| 530 | 544 | ||
| 545 | /** | ||
| 546 | * memory_read_from_buffer - copy data from the buffer | ||
| 547 | * @to: the kernel space buffer to read to | ||
| 548 | * @count: the maximum number of bytes to read | ||
| 549 | * @ppos: the current position in the buffer | ||
| 550 | * @from: the buffer to read from | ||
| 551 | * @available: the size of the buffer | ||
| 552 | * | ||
| 553 | * The memory_read_from_buffer() function reads up to @count bytes from the | ||
| 554 | * buffer @from at offset @ppos into the kernel space address starting at @to. | ||
| 555 | * | ||
| 556 | * On success, the number of bytes read is returned and the offset @ppos is | ||
| 557 | * advanced by this number, or negative value is returned on error. | ||
| 558 | **/ | ||
| 531 | ssize_t memory_read_from_buffer(void *to, size_t count, loff_t *ppos, | 559 | ssize_t memory_read_from_buffer(void *to, size_t count, loff_t *ppos, |
| 532 | const void *from, size_t available) | 560 | const void *from, size_t available) |
| 533 | { | 561 | { |
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 58d43daec084..982a2064fe4c 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
| @@ -204,7 +204,7 @@ int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page *page) | |||
| 204 | * Note: assumes we have exclusive access to this mapping either | 204 | * Note: assumes we have exclusive access to this mapping either |
| 205 | * through inode->i_mutex or some other mechanism. | 205 | * through inode->i_mutex or some other mechanism. |
| 206 | */ | 206 | */ |
| 207 | if (page->index == 0 && invalidate_inode_pages2_range(inode->i_mapping, PAGE_CACHE_SIZE, -1) < 0) { | 207 | if (invalidate_inode_pages2_range(inode->i_mapping, page->index + 1, -1) < 0) { |
| 208 | /* Should never happen */ | 208 | /* Should never happen */ |
| 209 | nfs_zap_mapping(inode, inode->i_mapping); | 209 | nfs_zap_mapping(inode, inode->i_mapping); |
| 210 | } | 210 | } |
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index efc015c6128a..44f87caf3683 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
| @@ -606,7 +606,9 @@ static void dlm_init_lockres(struct dlm_ctxt *dlm, | |||
| 606 | 606 | ||
| 607 | res->last_used = 0; | 607 | res->last_used = 0; |
| 608 | 608 | ||
| 609 | spin_lock(&dlm->spinlock); | ||
| 609 | list_add_tail(&res->tracking, &dlm->tracking_list); | 610 | list_add_tail(&res->tracking, &dlm->tracking_list); |
| 611 | spin_unlock(&dlm->spinlock); | ||
| 610 | 612 | ||
| 611 | memset(res->lvb, 0, DLM_LVB_LEN); | 613 | memset(res->lvb, 0, DLM_LVB_LEN); |
| 612 | memset(res->refmap, 0, sizeof(res->refmap)); | 614 | memset(res->refmap, 0, sizeof(res->refmap)); |
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c index 394d25a131a5..80e20d9f2780 100644 --- a/fs/ocfs2/dlmglue.c +++ b/fs/ocfs2/dlmglue.c | |||
| @@ -1554,8 +1554,8 @@ out: | |||
| 1554 | */ | 1554 | */ |
| 1555 | int ocfs2_file_lock(struct file *file, int ex, int trylock) | 1555 | int ocfs2_file_lock(struct file *file, int ex, int trylock) |
| 1556 | { | 1556 | { |
| 1557 | int ret, level = ex ? LKM_EXMODE : LKM_PRMODE; | 1557 | int ret, level = ex ? DLM_LOCK_EX : DLM_LOCK_PR; |
| 1558 | unsigned int lkm_flags = trylock ? LKM_NOQUEUE : 0; | 1558 | unsigned int lkm_flags = trylock ? DLM_LKF_NOQUEUE : 0; |
| 1559 | unsigned long flags; | 1559 | unsigned long flags; |
| 1560 | struct ocfs2_file_private *fp = file->private_data; | 1560 | struct ocfs2_file_private *fp = file->private_data; |
| 1561 | struct ocfs2_lock_res *lockres = &fp->fp_flock; | 1561 | struct ocfs2_lock_res *lockres = &fp->fp_flock; |
| @@ -1582,7 +1582,7 @@ int ocfs2_file_lock(struct file *file, int ex, int trylock) | |||
| 1582 | * Get the lock at NLMODE to start - that way we | 1582 | * Get the lock at NLMODE to start - that way we |
| 1583 | * can cancel the upconvert request if need be. | 1583 | * can cancel the upconvert request if need be. |
| 1584 | */ | 1584 | */ |
| 1585 | ret = ocfs2_lock_create(osb, lockres, LKM_NLMODE, 0); | 1585 | ret = ocfs2_lock_create(osb, lockres, DLM_LOCK_NL, 0); |
| 1586 | if (ret < 0) { | 1586 | if (ret < 0) { |
| 1587 | mlog_errno(ret); | 1587 | mlog_errno(ret); |
| 1588 | goto out; | 1588 | goto out; |
| @@ -1597,7 +1597,7 @@ int ocfs2_file_lock(struct file *file, int ex, int trylock) | |||
| 1597 | } | 1597 | } |
| 1598 | 1598 | ||
| 1599 | lockres->l_action = OCFS2_AST_CONVERT; | 1599 | lockres->l_action = OCFS2_AST_CONVERT; |
| 1600 | lkm_flags |= LKM_CONVERT; | 1600 | lkm_flags |= DLM_LKF_CONVERT; |
| 1601 | lockres->l_requested = level; | 1601 | lockres->l_requested = level; |
| 1602 | lockres_or_flags(lockres, OCFS2_LOCK_BUSY); | 1602 | lockres_or_flags(lockres, OCFS2_LOCK_BUSY); |
| 1603 | 1603 | ||
| @@ -1664,7 +1664,7 @@ void ocfs2_file_unlock(struct file *file) | |||
| 1664 | if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED)) | 1664 | if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED)) |
| 1665 | return; | 1665 | return; |
| 1666 | 1666 | ||
| 1667 | if (lockres->l_level == LKM_NLMODE) | 1667 | if (lockres->l_level == DLM_LOCK_NL) |
| 1668 | return; | 1668 | return; |
| 1669 | 1669 | ||
| 1670 | mlog(0, "Unlock: \"%s\" flags: 0x%lx, level: %d, act: %d\n", | 1670 | mlog(0, "Unlock: \"%s\" flags: 0x%lx, level: %d, act: %d\n", |
| @@ -1678,11 +1678,11 @@ void ocfs2_file_unlock(struct file *file) | |||
| 1678 | lockres_or_flags(lockres, OCFS2_LOCK_BLOCKED); | 1678 | lockres_or_flags(lockres, OCFS2_LOCK_BLOCKED); |
| 1679 | lockres->l_blocking = DLM_LOCK_EX; | 1679 | lockres->l_blocking = DLM_LOCK_EX; |
| 1680 | 1680 | ||
| 1681 | gen = ocfs2_prepare_downconvert(lockres, LKM_NLMODE); | 1681 | gen = ocfs2_prepare_downconvert(lockres, DLM_LOCK_NL); |
| 1682 | lockres_add_mask_waiter(lockres, &mw, OCFS2_LOCK_BUSY, 0); | 1682 | lockres_add_mask_waiter(lockres, &mw, OCFS2_LOCK_BUSY, 0); |
| 1683 | spin_unlock_irqrestore(&lockres->l_lock, flags); | 1683 | spin_unlock_irqrestore(&lockres->l_lock, flags); |
| 1684 | 1684 | ||
| 1685 | ret = ocfs2_downconvert_lock(osb, lockres, LKM_NLMODE, 0, gen); | 1685 | ret = ocfs2_downconvert_lock(osb, lockres, DLM_LOCK_NL, 0, gen); |
| 1686 | if (ret) { | 1686 | if (ret) { |
| 1687 | mlog_errno(ret); | 1687 | mlog_errno(ret); |
| 1688 | return; | 1688 | return; |
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/namei.h> | 16 | #include <linux/namei.h> |
| 17 | #include <linux/backing-dev.h> | 17 | #include <linux/backing-dev.h> |
| 18 | #include <linux/capability.h> | 18 | #include <linux/capability.h> |
| 19 | #include <linux/securebits.h> | ||
| 19 | #include <linux/security.h> | 20 | #include <linux/security.h> |
| 20 | #include <linux/mount.h> | 21 | #include <linux/mount.h> |
| 21 | #include <linux/vfs.h> | 22 | #include <linux/vfs.h> |
| @@ -425,7 +426,7 @@ asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode) | |||
| 425 | { | 426 | { |
| 426 | struct nameidata nd; | 427 | struct nameidata nd; |
| 427 | int old_fsuid, old_fsgid; | 428 | int old_fsuid, old_fsgid; |
| 428 | kernel_cap_t old_cap; | 429 | kernel_cap_t uninitialized_var(old_cap); /* !SECURE_NO_SETUID_FIXUP */ |
| 429 | int res; | 430 | int res; |
| 430 | 431 | ||
| 431 | if (mode & ~S_IRWXO) /* where's F_OK, X_OK, W_OK, R_OK? */ | 432 | if (mode & ~S_IRWXO) /* where's F_OK, X_OK, W_OK, R_OK? */ |
| @@ -433,23 +434,27 @@ asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode) | |||
| 433 | 434 | ||
| 434 | old_fsuid = current->fsuid; | 435 | old_fsuid = current->fsuid; |
| 435 | old_fsgid = current->fsgid; | 436 | old_fsgid = current->fsgid; |
| 436 | old_cap = current->cap_effective; | ||
| 437 | 437 | ||
| 438 | current->fsuid = current->uid; | 438 | current->fsuid = current->uid; |
| 439 | current->fsgid = current->gid; | 439 | current->fsgid = current->gid; |
| 440 | 440 | ||
| 441 | /* | 441 | if (!issecure(SECURE_NO_SETUID_FIXUP)) { |
| 442 | * Clear the capabilities if we switch to a non-root user | 442 | /* |
| 443 | * | 443 | * Clear the capabilities if we switch to a non-root user |
| 444 | * FIXME: There is a race here against sys_capset. The | 444 | */ |
| 445 | * capabilities can change yet we will restore the old | 445 | #ifndef CONFIG_SECURITY_FILE_CAPABILITIES |
| 446 | * value below. We should hold task_capabilities_lock, | 446 | /* |
| 447 | * but we cannot because user_path_walk can sleep. | 447 | * FIXME: There is a race here against sys_capset. The |
| 448 | */ | 448 | * capabilities can change yet we will restore the old |
| 449 | if (current->uid) | 449 | * value below. We should hold task_capabilities_lock, |
| 450 | cap_clear(current->cap_effective); | 450 | * but we cannot because user_path_walk can sleep. |
| 451 | else | 451 | */ |
| 452 | current->cap_effective = current->cap_permitted; | 452 | #endif /* ndef CONFIG_SECURITY_FILE_CAPABILITIES */ |
| 453 | if (current->uid) | ||
| 454 | old_cap = cap_set_effective(__cap_empty_set); | ||
| 455 | else | ||
| 456 | old_cap = cap_set_effective(current->cap_permitted); | ||
| 457 | } | ||
| 453 | 458 | ||
| 454 | res = __user_walk_fd(dfd, filename, LOOKUP_FOLLOW|LOOKUP_ACCESS, &nd); | 459 | res = __user_walk_fd(dfd, filename, LOOKUP_FOLLOW|LOOKUP_ACCESS, &nd); |
| 455 | if (res) | 460 | if (res) |
| @@ -478,7 +483,9 @@ out_path_release: | |||
| 478 | out: | 483 | out: |
| 479 | current->fsuid = old_fsuid; | 484 | current->fsuid = old_fsuid; |
| 480 | current->fsgid = old_fsgid; | 485 | current->fsgid = old_fsgid; |
| 481 | current->cap_effective = old_cap; | 486 | |
| 487 | if (!issecure(SECURE_NO_SETUID_FIXUP)) | ||
| 488 | cap_set_effective(old_cap); | ||
| 482 | 489 | ||
| 483 | return res; | 490 | return res; |
| 484 | } | 491 | } |
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index ab8ccc9d14ff..c492449f3b45 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
| @@ -476,10 +476,10 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, | |||
| 476 | return -ESRCH; | 476 | return -ESRCH; |
| 477 | mm = get_task_mm(task); | 477 | mm = get_task_mm(task); |
| 478 | if (mm) { | 478 | if (mm) { |
| 479 | static struct mm_walk clear_refs_walk; | 479 | struct mm_walk clear_refs_walk = { |
| 480 | memset(&clear_refs_walk, 0, sizeof(clear_refs_walk)); | 480 | .pmd_entry = clear_refs_pte_range, |
| 481 | clear_refs_walk.pmd_entry = clear_refs_pte_range; | 481 | .mm = mm, |
| 482 | clear_refs_walk.mm = mm; | 482 | }; |
| 483 | down_read(&mm->mmap_sem); | 483 | down_read(&mm->mmap_sem); |
| 484 | for (vma = mm->mmap; vma; vma = vma->vm_next) { | 484 | for (vma = mm->mmap; vma; vma = vma->vm_next) { |
| 485 | clear_refs_walk.private = vma; | 485 | clear_refs_walk.private = vma; |
| @@ -602,11 +602,6 @@ static int pagemap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, | |||
| 602 | return err; | 602 | return err; |
| 603 | } | 603 | } |
| 604 | 604 | ||
| 605 | static struct mm_walk pagemap_walk = { | ||
| 606 | .pmd_entry = pagemap_pte_range, | ||
| 607 | .pte_hole = pagemap_pte_hole | ||
| 608 | }; | ||
| 609 | |||
| 610 | /* | 605 | /* |
| 611 | * /proc/pid/pagemap - an array mapping virtual pages to pfns | 606 | * /proc/pid/pagemap - an array mapping virtual pages to pfns |
| 612 | * | 607 | * |
| @@ -641,6 +636,11 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, | |||
| 641 | struct pagemapread pm; | 636 | struct pagemapread pm; |
| 642 | int pagecount; | 637 | int pagecount; |
| 643 | int ret = -ESRCH; | 638 | int ret = -ESRCH; |
| 639 | struct mm_walk pagemap_walk; | ||
| 640 | unsigned long src; | ||
| 641 | unsigned long svpfn; | ||
| 642 | unsigned long start_vaddr; | ||
| 643 | unsigned long end_vaddr; | ||
| 644 | 644 | ||
| 645 | if (!task) | 645 | if (!task) |
| 646 | goto out; | 646 | goto out; |
| @@ -659,11 +659,15 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, | |||
| 659 | if (!mm) | 659 | if (!mm) |
| 660 | goto out_task; | 660 | goto out_task; |
| 661 | 661 | ||
| 662 | ret = -ENOMEM; | 662 | |
| 663 | uaddr = (unsigned long)buf & PAGE_MASK; | 663 | uaddr = (unsigned long)buf & PAGE_MASK; |
| 664 | uend = (unsigned long)(buf + count); | 664 | uend = (unsigned long)(buf + count); |
| 665 | pagecount = (PAGE_ALIGN(uend) - uaddr) / PAGE_SIZE; | 665 | pagecount = (PAGE_ALIGN(uend) - uaddr) / PAGE_SIZE; |
| 666 | pages = kmalloc(pagecount * sizeof(struct page *), GFP_KERNEL); | 666 | ret = 0; |
| 667 | if (pagecount == 0) | ||
| 668 | goto out_mm; | ||
| 669 | pages = kcalloc(pagecount, sizeof(struct page *), GFP_KERNEL); | ||
| 670 | ret = -ENOMEM; | ||
| 667 | if (!pages) | 671 | if (!pages) |
| 668 | goto out_mm; | 672 | goto out_mm; |
| 669 | 673 | ||
| @@ -684,33 +688,33 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, | |||
| 684 | pm.out = (u64 *)buf; | 688 | pm.out = (u64 *)buf; |
| 685 | pm.end = (u64 *)(buf + count); | 689 | pm.end = (u64 *)(buf + count); |
| 686 | 690 | ||
| 687 | if (!ptrace_may_attach(task)) { | 691 | pagemap_walk.pmd_entry = pagemap_pte_range; |
| 688 | ret = -EIO; | 692 | pagemap_walk.pte_hole = pagemap_pte_hole; |
| 689 | } else { | 693 | pagemap_walk.mm = mm; |
| 690 | unsigned long src = *ppos; | 694 | pagemap_walk.private = ± |
| 691 | unsigned long svpfn = src / PM_ENTRY_BYTES; | 695 | |
| 692 | unsigned long start_vaddr = svpfn << PAGE_SHIFT; | 696 | src = *ppos; |
| 693 | unsigned long end_vaddr = TASK_SIZE_OF(task); | 697 | svpfn = src / PM_ENTRY_BYTES; |
| 694 | 698 | start_vaddr = svpfn << PAGE_SHIFT; | |
| 695 | /* watch out for wraparound */ | 699 | end_vaddr = TASK_SIZE_OF(task); |
| 696 | if (svpfn > TASK_SIZE_OF(task) >> PAGE_SHIFT) | 700 | |
| 697 | start_vaddr = end_vaddr; | 701 | /* watch out for wraparound */ |
| 698 | 702 | if (svpfn > TASK_SIZE_OF(task) >> PAGE_SHIFT) | |
| 699 | /* | 703 | start_vaddr = end_vaddr; |
| 700 | * The odds are that this will stop walking way | 704 | |
| 701 | * before end_vaddr, because the length of the | 705 | /* |
| 702 | * user buffer is tracked in "pm", and the walk | 706 | * The odds are that this will stop walking way |
| 703 | * will stop when we hit the end of the buffer. | 707 | * before end_vaddr, because the length of the |
| 704 | */ | 708 | * user buffer is tracked in "pm", and the walk |
| 705 | ret = walk_page_range(start_vaddr, end_vaddr, | 709 | * will stop when we hit the end of the buffer. |
| 706 | &pagemap_walk); | 710 | */ |
| 707 | if (ret == PM_END_OF_BUFFER) | 711 | ret = walk_page_range(start_vaddr, end_vaddr, &pagemap_walk); |
| 708 | ret = 0; | 712 | if (ret == PM_END_OF_BUFFER) |
| 709 | /* don't need mmap_sem for these, but this looks cleaner */ | 713 | ret = 0; |
| 710 | *ppos += (char *)pm.out - buf; | 714 | /* don't need mmap_sem for these, but this looks cleaner */ |
| 711 | if (!ret) | 715 | *ppos += (char *)pm.out - buf; |
| 712 | ret = (char *)pm.out - buf; | 716 | if (!ret) |
| 713 | } | 717 | ret = (char *)pm.out - buf; |
| 714 | 718 | ||
| 715 | out_pages: | 719 | out_pages: |
| 716 | for (; pagecount; pagecount--) { | 720 | for (; pagecount; pagecount--) { |
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 57917932212e..192269698a8a 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
| @@ -45,6 +45,8 @@ void reiserfs_delete_inode(struct inode *inode) | |||
| 45 | goto out; | 45 | goto out; |
| 46 | reiserfs_update_inode_transaction(inode); | 46 | reiserfs_update_inode_transaction(inode); |
| 47 | 47 | ||
| 48 | reiserfs_discard_prealloc(&th, inode); | ||
| 49 | |||
| 48 | err = reiserfs_delete_object(&th, inode); | 50 | err = reiserfs_delete_object(&th, inode); |
| 49 | 51 | ||
| 50 | /* Do quota update inside a transaction for journaled quotas. We must do that | 52 | /* Do quota update inside a transaction for journaled quotas. We must do that |
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index ed424d708e69..1d40f2bd1970 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
| @@ -2165,8 +2165,10 @@ static ssize_t reiserfs_quota_write(struct super_block *sb, int type, | |||
| 2165 | blk++; | 2165 | blk++; |
| 2166 | } | 2166 | } |
| 2167 | out: | 2167 | out: |
| 2168 | if (len == towrite) | 2168 | if (len == towrite) { |
| 2169 | mutex_unlock(&inode->i_mutex); | ||
| 2169 | return err; | 2170 | return err; |
| 2171 | } | ||
| 2170 | if (inode->i_size < off + len - towrite) | 2172 | if (inode->i_size < off + len - towrite) |
| 2171 | i_size_write(inode, off + len - towrite); | 2173 | i_size_write(inode, off + len - towrite); |
| 2172 | inode->i_version++; | 2174 | inode->i_version++; |
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index afaee301b0ee..ad3d26ddfe31 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c | |||
| @@ -2427,13 +2427,20 @@ restart: | |||
| 2427 | if (iclog->ic_size - iclog->ic_offset < 2*sizeof(xlog_op_header_t)) { | 2427 | if (iclog->ic_size - iclog->ic_offset < 2*sizeof(xlog_op_header_t)) { |
| 2428 | xlog_state_switch_iclogs(log, iclog, iclog->ic_size); | 2428 | xlog_state_switch_iclogs(log, iclog, iclog->ic_size); |
| 2429 | 2429 | ||
| 2430 | /* If I'm the only one writing to this iclog, sync it to disk */ | 2430 | /* |
| 2431 | if (atomic_read(&iclog->ic_refcnt) == 1) { | 2431 | * If I'm the only one writing to this iclog, sync it to disk. |
| 2432 | * We need to do an atomic compare and decrement here to avoid | ||
| 2433 | * racing with concurrent atomic_dec_and_lock() calls in | ||
| 2434 | * xlog_state_release_iclog() when there is more than one | ||
| 2435 | * reference to the iclog. | ||
| 2436 | */ | ||
| 2437 | if (!atomic_add_unless(&iclog->ic_refcnt, -1, 1)) { | ||
| 2438 | /* we are the only one */ | ||
| 2432 | spin_unlock(&log->l_icloglock); | 2439 | spin_unlock(&log->l_icloglock); |
| 2433 | if ((error = xlog_state_release_iclog(log, iclog))) | 2440 | error = xlog_state_release_iclog(log, iclog); |
| 2441 | if (error) | ||
| 2434 | return error; | 2442 | return error; |
| 2435 | } else { | 2443 | } else { |
| 2436 | atomic_dec(&iclog->ic_refcnt); | ||
| 2437 | spin_unlock(&log->l_icloglock); | 2444 | spin_unlock(&log->l_icloglock); |
| 2438 | } | 2445 | } |
| 2439 | goto restart; | 2446 | goto restart; |
diff --git a/include/asm-avr32/setup.h b/include/asm-avr32/setup.h index ea3070ff13a5..ff5b7cf6be4d 100644 --- a/include/asm-avr32/setup.h +++ b/include/asm-avr32/setup.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Copyright (C) 2004-2006 Atmel Corporation | 2 | * Copyright (C) 2004-2006 Atmel Corporation |
| 3 | * | 3 | * |
| 4 | * Based on linux/include/asm-arm/setup.h | 4 | * Based on linux/include/asm-arm/setup.h |
| 5 | * Copyright (C) 1997-1999 Russel King | 5 | * Copyright (C) 1997-1999 Russell King |
| 6 | * | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
| 8 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
diff --git a/include/asm-frv/system.h b/include/asm-frv/system.h index d3a12a9079f7..7742ec000cc4 100644 --- a/include/asm-frv/system.h +++ b/include/asm-frv/system.h | |||
| @@ -87,7 +87,7 @@ do { \ | |||
| 87 | } while(0) | 87 | } while(0) |
| 88 | 88 | ||
| 89 | #define irqs_disabled() \ | 89 | #define irqs_disabled() \ |
| 90 | ({unsigned long flags; local_save_flags(flags); flags; }) | 90 | ({unsigned long flags; local_save_flags(flags); !!flags; }) |
| 91 | 91 | ||
| 92 | #define local_irq_save(flags) \ | 92 | #define local_irq_save(flags) \ |
| 93 | do { \ | 93 | do { \ |
diff --git a/include/asm-generic/atomic.h b/include/asm-generic/atomic.h index 85fd0aa27a8c..4ec0a296bdec 100644 --- a/include/asm-generic/atomic.h +++ b/include/asm-generic/atomic.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | #define _ASM_GENERIC_ATOMIC_H | 2 | #define _ASM_GENERIC_ATOMIC_H |
| 3 | /* | 3 | /* |
| 4 | * Copyright (C) 2005 Silicon Graphics, Inc. | 4 | * Copyright (C) 2005 Silicon Graphics, Inc. |
| 5 | * Christoph Lameter <clameter@sgi.com> | 5 | * Christoph Lameter |
| 6 | * | 6 | * |
| 7 | * Allows to provide arch independent atomic definitions without the need to | 7 | * Allows to provide arch independent atomic definitions without the need to |
| 8 | * edit all arch specific atomic.h files. | 8 | * edit all arch specific atomic.h files. |
diff --git a/include/asm-mips/atomic.h b/include/asm-mips/atomic.h index a798d6299a79..1232be3885b0 100644 --- a/include/asm-mips/atomic.h +++ b/include/asm-mips/atomic.h | |||
| @@ -283,10 +283,10 @@ static __inline__ int atomic_sub_if_positive(int i, atomic_t * v) | |||
| 283 | " beqz %0, 2f \n" | 283 | " beqz %0, 2f \n" |
| 284 | " subu %0, %1, %3 \n" | 284 | " subu %0, %1, %3 \n" |
| 285 | " .set reorder \n" | 285 | " .set reorder \n" |
| 286 | "1: \n" | ||
| 287 | " .subsection 2 \n" | 286 | " .subsection 2 \n" |
| 288 | "2: b 1b \n" | 287 | "2: b 1b \n" |
| 289 | " .previous \n" | 288 | " .previous \n" |
| 289 | "1: \n" | ||
| 290 | " .set mips0 \n" | 290 | " .set mips0 \n" |
| 291 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) | 291 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) |
| 292 | : "Ir" (i), "m" (v->counter) | 292 | : "Ir" (i), "m" (v->counter) |
| @@ -664,10 +664,10 @@ static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v) | |||
| 664 | " beqz %0, 2f \n" | 664 | " beqz %0, 2f \n" |
| 665 | " dsubu %0, %1, %3 \n" | 665 | " dsubu %0, %1, %3 \n" |
| 666 | " .set reorder \n" | 666 | " .set reorder \n" |
| 667 | "1: \n" | ||
| 668 | " .subsection 2 \n" | 667 | " .subsection 2 \n" |
| 669 | "2: b 1b \n" | 668 | "2: b 1b \n" |
| 670 | " .previous \n" | 669 | " .previous \n" |
| 670 | "1: \n" | ||
| 671 | " .set mips0 \n" | 671 | " .set mips0 \n" |
| 672 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) | 672 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) |
| 673 | : "Ir" (i), "m" (v->counter) | 673 | : "Ir" (i), "m" (v->counter) |
diff --git a/include/asm-powerpc/cputable.h b/include/asm-powerpc/cputable.h index 3171ac904b91..4fd76898975b 100644 --- a/include/asm-powerpc/cputable.h +++ b/include/asm-powerpc/cputable.h | |||
| @@ -186,6 +186,7 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start, | |||
| 186 | #define CPU_FTR_1T_SEGMENT LONG_ASM_CONST(0x0004000000000000) | 186 | #define CPU_FTR_1T_SEGMENT LONG_ASM_CONST(0x0004000000000000) |
| 187 | #define CPU_FTR_NO_SLBIE_B LONG_ASM_CONST(0x0008000000000000) | 187 | #define CPU_FTR_NO_SLBIE_B LONG_ASM_CONST(0x0008000000000000) |
| 188 | #define CPU_FTR_VSX LONG_ASM_CONST(0x0010000000000000) | 188 | #define CPU_FTR_VSX LONG_ASM_CONST(0x0010000000000000) |
| 189 | #define CPU_FTR_SAO LONG_ASM_CONST(0x0020000000000000) | ||
| 189 | 190 | ||
| 190 | #ifndef __ASSEMBLY__ | 191 | #ifndef __ASSEMBLY__ |
| 191 | 192 | ||
| @@ -401,7 +402,7 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start, | |||
| 401 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 402 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
| 402 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ | 403 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ |
| 403 | CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ | 404 | CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ |
| 404 | CPU_FTR_DSCR) | 405 | CPU_FTR_DSCR | CPU_FTR_SAO) |
| 405 | #define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | 406 | #define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ |
| 406 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | 407 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ |
| 407 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 408 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
diff --git a/include/asm-powerpc/dma-mapping.h b/include/asm-powerpc/dma-mapping.h index bbefb69bfb67..74c549780987 100644 --- a/include/asm-powerpc/dma-mapping.h +++ b/include/asm-powerpc/dma-mapping.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | /* need struct page definitions */ | 13 | /* need struct page definitions */ |
| 14 | #include <linux/mm.h> | 14 | #include <linux/mm.h> |
| 15 | #include <linux/scatterlist.h> | 15 | #include <linux/scatterlist.h> |
| 16 | #include <linux/dma-attrs.h> | ||
| 16 | #include <asm/io.h> | 17 | #include <asm/io.h> |
| 17 | 18 | ||
| 18 | #define DMA_ERROR_CODE (~(dma_addr_t)0x0) | 19 | #define DMA_ERROR_CODE (~(dma_addr_t)0x0) |
| @@ -44,6 +45,15 @@ extern void __dma_sync_page(struct page *page, unsigned long offset, | |||
| 44 | #endif /* ! CONFIG_NOT_COHERENT_CACHE */ | 45 | #endif /* ! CONFIG_NOT_COHERENT_CACHE */ |
| 45 | 46 | ||
| 46 | #ifdef CONFIG_PPC64 | 47 | #ifdef CONFIG_PPC64 |
| 48 | |||
| 49 | static inline unsigned long device_to_mask(struct device *dev) | ||
| 50 | { | ||
| 51 | if (dev->dma_mask && *dev->dma_mask) | ||
| 52 | return *dev->dma_mask; | ||
| 53 | /* Assume devices without mask can take 32 bit addresses */ | ||
| 54 | return 0xfffffffful; | ||
| 55 | } | ||
| 56 | |||
| 47 | /* | 57 | /* |
| 48 | * DMA operations are abstracted for G5 vs. i/pSeries, PCI vs. VIO | 58 | * DMA operations are abstracted for G5 vs. i/pSeries, PCI vs. VIO |
| 49 | */ | 59 | */ |
| @@ -53,13 +63,17 @@ struct dma_mapping_ops { | |||
| 53 | void (*free_coherent)(struct device *dev, size_t size, | 63 | void (*free_coherent)(struct device *dev, size_t size, |
| 54 | void *vaddr, dma_addr_t dma_handle); | 64 | void *vaddr, dma_addr_t dma_handle); |
| 55 | dma_addr_t (*map_single)(struct device *dev, void *ptr, | 65 | dma_addr_t (*map_single)(struct device *dev, void *ptr, |
| 56 | size_t size, enum dma_data_direction direction); | 66 | size_t size, enum dma_data_direction direction, |
| 67 | struct dma_attrs *attrs); | ||
| 57 | void (*unmap_single)(struct device *dev, dma_addr_t dma_addr, | 68 | void (*unmap_single)(struct device *dev, dma_addr_t dma_addr, |
| 58 | size_t size, enum dma_data_direction direction); | 69 | size_t size, enum dma_data_direction direction, |
| 70 | struct dma_attrs *attrs); | ||
| 59 | int (*map_sg)(struct device *dev, struct scatterlist *sg, | 71 | int (*map_sg)(struct device *dev, struct scatterlist *sg, |
| 60 | int nents, enum dma_data_direction direction); | 72 | int nents, enum dma_data_direction direction, |
| 73 | struct dma_attrs *attrs); | ||
| 61 | void (*unmap_sg)(struct device *dev, struct scatterlist *sg, | 74 | void (*unmap_sg)(struct device *dev, struct scatterlist *sg, |
| 62 | int nents, enum dma_data_direction direction); | 75 | int nents, enum dma_data_direction direction, |
| 76 | struct dma_attrs *attrs); | ||
| 63 | int (*dma_supported)(struct device *dev, u64 mask); | 77 | int (*dma_supported)(struct device *dev, u64 mask); |
| 64 | int (*set_dma_mask)(struct device *dev, u64 dma_mask); | 78 | int (*set_dma_mask)(struct device *dev, u64 dma_mask); |
| 65 | }; | 79 | }; |
| @@ -109,6 +123,77 @@ static inline int dma_set_mask(struct device *dev, u64 dma_mask) | |||
| 109 | return 0; | 123 | return 0; |
| 110 | } | 124 | } |
| 111 | 125 | ||
| 126 | static inline dma_addr_t dma_map_single_attrs(struct device *dev, | ||
| 127 | void *cpu_addr, | ||
| 128 | size_t size, | ||
| 129 | enum dma_data_direction direction, | ||
| 130 | struct dma_attrs *attrs) | ||
| 131 | { | ||
| 132 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | ||
| 133 | |||
| 134 | BUG_ON(!dma_ops); | ||
| 135 | return dma_ops->map_single(dev, cpu_addr, size, direction, attrs); | ||
| 136 | } | ||
| 137 | |||
| 138 | static inline void dma_unmap_single_attrs(struct device *dev, | ||
| 139 | dma_addr_t dma_addr, | ||
| 140 | size_t size, | ||
| 141 | enum dma_data_direction direction, | ||
| 142 | struct dma_attrs *attrs) | ||
| 143 | { | ||
| 144 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | ||
| 145 | |||
| 146 | BUG_ON(!dma_ops); | ||
| 147 | dma_ops->unmap_single(dev, dma_addr, size, direction, attrs); | ||
| 148 | } | ||
| 149 | |||
| 150 | static inline dma_addr_t dma_map_page_attrs(struct device *dev, | ||
| 151 | struct page *page, | ||
| 152 | unsigned long offset, size_t size, | ||
| 153 | enum dma_data_direction direction, | ||
| 154 | struct dma_attrs *attrs) | ||
| 155 | { | ||
| 156 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | ||
| 157 | |||
| 158 | BUG_ON(!dma_ops); | ||
| 159 | return dma_ops->map_single(dev, page_address(page) + offset, size, | ||
| 160 | direction, attrs); | ||
| 161 | } | ||
| 162 | |||
| 163 | static inline void dma_unmap_page_attrs(struct device *dev, | ||
| 164 | dma_addr_t dma_address, | ||
| 165 | size_t size, | ||
| 166 | enum dma_data_direction direction, | ||
| 167 | struct dma_attrs *attrs) | ||
| 168 | { | ||
| 169 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | ||
| 170 | |||
| 171 | BUG_ON(!dma_ops); | ||
| 172 | dma_ops->unmap_single(dev, dma_address, size, direction, attrs); | ||
| 173 | } | ||
| 174 | |||
| 175 | static inline int dma_map_sg_attrs(struct device *dev, struct scatterlist *sg, | ||
| 176 | int nents, enum dma_data_direction direction, | ||
| 177 | struct dma_attrs *attrs) | ||
| 178 | { | ||
| 179 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | ||
| 180 | |||
| 181 | BUG_ON(!dma_ops); | ||
| 182 | return dma_ops->map_sg(dev, sg, nents, direction, attrs); | ||
| 183 | } | ||
| 184 | |||
| 185 | static inline void dma_unmap_sg_attrs(struct device *dev, | ||
| 186 | struct scatterlist *sg, | ||
| 187 | int nhwentries, | ||
| 188 | enum dma_data_direction direction, | ||
| 189 | struct dma_attrs *attrs) | ||
| 190 | { | ||
| 191 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | ||
| 192 | |||
| 193 | BUG_ON(!dma_ops); | ||
| 194 | dma_ops->unmap_sg(dev, sg, nhwentries, direction, attrs); | ||
| 195 | } | ||
| 196 | |||
| 112 | static inline void *dma_alloc_coherent(struct device *dev, size_t size, | 197 | static inline void *dma_alloc_coherent(struct device *dev, size_t size, |
| 113 | dma_addr_t *dma_handle, gfp_t flag) | 198 | dma_addr_t *dma_handle, gfp_t flag) |
| 114 | { | 199 | { |
| @@ -131,63 +216,43 @@ static inline dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, | |||
| 131 | size_t size, | 216 | size_t size, |
| 132 | enum dma_data_direction direction) | 217 | enum dma_data_direction direction) |
| 133 | { | 218 | { |
| 134 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | 219 | return dma_map_single_attrs(dev, cpu_addr, size, direction, NULL); |
| 135 | |||
| 136 | BUG_ON(!dma_ops); | ||
| 137 | return dma_ops->map_single(dev, cpu_addr, size, direction); | ||
| 138 | } | 220 | } |
| 139 | 221 | ||
| 140 | static inline void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, | 222 | static inline void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, |
| 141 | size_t size, | 223 | size_t size, |
| 142 | enum dma_data_direction direction) | 224 | enum dma_data_direction direction) |
| 143 | { | 225 | { |
| 144 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | 226 | dma_unmap_single_attrs(dev, dma_addr, size, direction, NULL); |
| 145 | |||
| 146 | BUG_ON(!dma_ops); | ||
| 147 | dma_ops->unmap_single(dev, dma_addr, size, direction); | ||
| 148 | } | 227 | } |
| 149 | 228 | ||
| 150 | static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, | 229 | static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, |
| 151 | unsigned long offset, size_t size, | 230 | unsigned long offset, size_t size, |
| 152 | enum dma_data_direction direction) | 231 | enum dma_data_direction direction) |
| 153 | { | 232 | { |
| 154 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | 233 | return dma_map_page_attrs(dev, page, offset, size, direction, NULL); |
| 155 | |||
| 156 | BUG_ON(!dma_ops); | ||
| 157 | return dma_ops->map_single(dev, page_address(page) + offset, size, | ||
| 158 | direction); | ||
| 159 | } | 234 | } |
| 160 | 235 | ||
| 161 | static inline void dma_unmap_page(struct device *dev, dma_addr_t dma_address, | 236 | static inline void dma_unmap_page(struct device *dev, dma_addr_t dma_address, |
| 162 | size_t size, | 237 | size_t size, |
| 163 | enum dma_data_direction direction) | 238 | enum dma_data_direction direction) |
| 164 | { | 239 | { |
| 165 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | 240 | dma_unmap_page_attrs(dev, dma_address, size, direction, NULL); |
| 166 | |||
| 167 | BUG_ON(!dma_ops); | ||
| 168 | dma_ops->unmap_single(dev, dma_address, size, direction); | ||
| 169 | } | 241 | } |
| 170 | 242 | ||
| 171 | static inline int dma_map_sg(struct device *dev, struct scatterlist *sg, | 243 | static inline int dma_map_sg(struct device *dev, struct scatterlist *sg, |
| 172 | int nents, enum dma_data_direction direction) | 244 | int nents, enum dma_data_direction direction) |
| 173 | { | 245 | { |
| 174 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | 246 | return dma_map_sg_attrs(dev, sg, nents, direction, NULL); |
| 175 | |||
| 176 | BUG_ON(!dma_ops); | ||
| 177 | return dma_ops->map_sg(dev, sg, nents, direction); | ||
| 178 | } | 247 | } |
| 179 | 248 | ||
| 180 | static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg, | 249 | static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg, |
| 181 | int nhwentries, | 250 | int nhwentries, |
| 182 | enum dma_data_direction direction) | 251 | enum dma_data_direction direction) |
| 183 | { | 252 | { |
| 184 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | 253 | dma_unmap_sg_attrs(dev, sg, nhwentries, direction, NULL); |
| 185 | |||
| 186 | BUG_ON(!dma_ops); | ||
| 187 | dma_ops->unmap_sg(dev, sg, nhwentries, direction); | ||
| 188 | } | 254 | } |
| 189 | 255 | ||
| 190 | |||
| 191 | /* | 256 | /* |
| 192 | * Available generic sets of operations | 257 | * Available generic sets of operations |
| 193 | */ | 258 | */ |
diff --git a/include/asm-powerpc/iommu.h b/include/asm-powerpc/iommu.h index 852e15f51a1e..51ecfef8d843 100644 --- a/include/asm-powerpc/iommu.h +++ b/include/asm-powerpc/iommu.h | |||
| @@ -79,11 +79,13 @@ extern void iommu_free_table(struct iommu_table *tbl, const char *node_name); | |||
| 79 | extern struct iommu_table *iommu_init_table(struct iommu_table * tbl, | 79 | extern struct iommu_table *iommu_init_table(struct iommu_table * tbl, |
| 80 | int nid); | 80 | int nid); |
| 81 | 81 | ||
| 82 | extern int iommu_map_sg(struct device *dev, struct scatterlist *sglist, | 82 | extern int iommu_map_sg(struct device *dev, struct iommu_table *tbl, |
| 83 | int nelems, unsigned long mask, | 83 | struct scatterlist *sglist, int nelems, |
| 84 | enum dma_data_direction direction); | 84 | unsigned long mask, enum dma_data_direction direction, |
| 85 | struct dma_attrs *attrs); | ||
| 85 | extern void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist, | 86 | extern void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist, |
| 86 | int nelems, enum dma_data_direction direction); | 87 | int nelems, enum dma_data_direction direction, |
| 88 | struct dma_attrs *attrs); | ||
| 87 | 89 | ||
| 88 | extern void *iommu_alloc_coherent(struct device *dev, struct iommu_table *tbl, | 90 | extern void *iommu_alloc_coherent(struct device *dev, struct iommu_table *tbl, |
| 89 | size_t size, dma_addr_t *dma_handle, | 91 | size_t size, dma_addr_t *dma_handle, |
| @@ -92,9 +94,11 @@ extern void iommu_free_coherent(struct iommu_table *tbl, size_t size, | |||
| 92 | void *vaddr, dma_addr_t dma_handle); | 94 | void *vaddr, dma_addr_t dma_handle); |
| 93 | extern dma_addr_t iommu_map_single(struct device *dev, struct iommu_table *tbl, | 95 | extern dma_addr_t iommu_map_single(struct device *dev, struct iommu_table *tbl, |
| 94 | void *vaddr, size_t size, unsigned long mask, | 96 | void *vaddr, size_t size, unsigned long mask, |
| 95 | enum dma_data_direction direction); | 97 | enum dma_data_direction direction, |
| 98 | struct dma_attrs *attrs); | ||
| 96 | extern void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle, | 99 | extern void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle, |
| 97 | size_t size, enum dma_data_direction direction); | 100 | size_t size, enum dma_data_direction direction, |
| 101 | struct dma_attrs *attrs); | ||
| 98 | 102 | ||
| 99 | extern void iommu_init_early_pSeries(void); | 103 | extern void iommu_init_early_pSeries(void); |
| 100 | extern void iommu_init_early_iSeries(void); | 104 | extern void iommu_init_early_iSeries(void); |
diff --git a/include/asm-powerpc/mman.h b/include/asm-powerpc/mman.h index 24cf664a8295..f8a32e20ba04 100644 --- a/include/asm-powerpc/mman.h +++ b/include/asm-powerpc/mman.h | |||
| @@ -1,7 +1,9 @@ | |||
| 1 | #ifndef _ASM_POWERPC_MMAN_H | 1 | #ifndef _ASM_POWERPC_MMAN_H |
| 2 | #define _ASM_POWERPC_MMAN_H | 2 | #define _ASM_POWERPC_MMAN_H |
| 3 | 3 | ||
| 4 | #include <asm/cputable.h> | ||
| 4 | #include <asm-generic/mman.h> | 5 | #include <asm-generic/mman.h> |
| 6 | #include <linux/mm.h> | ||
| 5 | 7 | ||
| 6 | /* | 8 | /* |
| 7 | * This program is free software; you can redistribute it and/or | 9 | * This program is free software; you can redistribute it and/or |
| @@ -10,6 +12,8 @@ | |||
| 10 | * 2 of the License, or (at your option) any later version. | 12 | * 2 of the License, or (at your option) any later version. |
| 11 | */ | 13 | */ |
| 12 | 14 | ||
| 15 | #define PROT_SAO 0x10 /* Strong Access Ordering */ | ||
| 16 | |||
| 13 | #define MAP_RENAME MAP_ANONYMOUS /* In SunOS terminology */ | 17 | #define MAP_RENAME MAP_ANONYMOUS /* In SunOS terminology */ |
| 14 | #define MAP_NORESERVE 0x40 /* don't reserve swap pages */ | 18 | #define MAP_NORESERVE 0x40 /* don't reserve swap pages */ |
| 15 | #define MAP_LOCKED 0x80 | 19 | #define MAP_LOCKED 0x80 |
| @@ -24,4 +28,32 @@ | |||
| 24 | #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ | 28 | #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ |
| 25 | #define MAP_NONBLOCK 0x10000 /* do not block on IO */ | 29 | #define MAP_NONBLOCK 0x10000 /* do not block on IO */ |
| 26 | 30 | ||
| 31 | #ifdef CONFIG_PPC64 | ||
| 32 | /* | ||
| 33 | * This file is included by linux/mman.h, so we can't use cacl_vm_prot_bits() | ||
| 34 | * here. How important is the optimization? | ||
| 35 | */ | ||
| 36 | static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot) | ||
| 37 | { | ||
| 38 | return (prot & PROT_SAO) ? VM_SAO : 0; | ||
| 39 | } | ||
| 40 | #define arch_calc_vm_prot_bits(prot) arch_calc_vm_prot_bits(prot) | ||
| 41 | |||
| 42 | static inline pgprot_t arch_vm_get_page_prot(unsigned long vm_flags) | ||
| 43 | { | ||
| 44 | return (vm_flags & VM_SAO) ? __pgprot(_PAGE_SAO) : 0; | ||
| 45 | } | ||
| 46 | #define arch_vm_get_page_prot(vm_flags) arch_vm_get_page_prot(vm_flags) | ||
| 47 | |||
| 48 | static inline int arch_validate_prot(unsigned long prot) | ||
| 49 | { | ||
| 50 | if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM | PROT_SAO)) | ||
| 51 | return 0; | ||
| 52 | if ((prot & PROT_SAO) && !cpu_has_feature(CPU_FTR_SAO)) | ||
| 53 | return 0; | ||
| 54 | return 1; | ||
| 55 | } | ||
| 56 | #define arch_validate_prot(prot) arch_validate_prot(prot) | ||
| 57 | |||
| 58 | #endif /* CONFIG_PPC64 */ | ||
| 27 | #endif /* _ASM_POWERPC_MMAN_H */ | 59 | #endif /* _ASM_POWERPC_MMAN_H */ |
diff --git a/include/asm-powerpc/pgtable-ppc32.h b/include/asm-powerpc/pgtable-ppc32.h index e1d2bb57f1d5..11eede4a2906 100644 --- a/include/asm-powerpc/pgtable-ppc32.h +++ b/include/asm-powerpc/pgtable-ppc32.h | |||
| @@ -182,6 +182,9 @@ extern int icache_44x_need_flush; | |||
| 182 | #define _PMD_SIZE_16M 0x0e0 | 182 | #define _PMD_SIZE_16M 0x0e0 |
| 183 | #define PMD_PAGE_SIZE(pmdval) (1024 << (((pmdval) & _PMD_SIZE) >> 4)) | 183 | #define PMD_PAGE_SIZE(pmdval) (1024 << (((pmdval) & _PMD_SIZE) >> 4)) |
| 184 | 184 | ||
| 185 | /* Until my rework is finished, 40x still needs atomic PTE updates */ | ||
| 186 | #define PTE_ATOMIC_UPDATES 1 | ||
| 187 | |||
| 185 | #elif defined(CONFIG_44x) | 188 | #elif defined(CONFIG_44x) |
| 186 | /* | 189 | /* |
| 187 | * Definitions for PPC440 | 190 | * Definitions for PPC440 |
| @@ -253,17 +256,17 @@ extern int icache_44x_need_flush; | |||
| 253 | */ | 256 | */ |
| 254 | 257 | ||
| 255 | #define _PAGE_PRESENT 0x00000001 /* S: PTE valid */ | 258 | #define _PAGE_PRESENT 0x00000001 /* S: PTE valid */ |
| 256 | #define _PAGE_RW 0x00000002 /* S: Write permission */ | 259 | #define _PAGE_RW 0x00000002 /* S: Write permission */ |
| 257 | #define _PAGE_FILE 0x00000004 /* S: nonlinear file mapping */ | 260 | #define _PAGE_FILE 0x00000004 /* S: nonlinear file mapping */ |
| 261 | #define _PAGE_HWEXEC 0x00000004 /* H: Execute permission */ | ||
| 258 | #define _PAGE_ACCESSED 0x00000008 /* S: Page referenced */ | 262 | #define _PAGE_ACCESSED 0x00000008 /* S: Page referenced */ |
| 259 | #define _PAGE_HWWRITE 0x00000010 /* H: Dirty & RW */ | 263 | #define _PAGE_DIRTY 0x00000010 /* S: Page dirty */ |
| 260 | #define _PAGE_HWEXEC 0x00000020 /* H: Execute permission */ | 264 | #define _PAGE_USER 0x00000040 /* S: User page */ |
| 261 | #define _PAGE_USER 0x00000040 /* S: User page */ | 265 | #define _PAGE_ENDIAN 0x00000080 /* H: E bit */ |
| 262 | #define _PAGE_ENDIAN 0x00000080 /* H: E bit */ | 266 | #define _PAGE_GUARDED 0x00000100 /* H: G bit */ |
| 263 | #define _PAGE_GUARDED 0x00000100 /* H: G bit */ | 267 | #define _PAGE_COHERENT 0x00000200 /* H: M bit */ |
| 264 | #define _PAGE_DIRTY 0x00000200 /* S: Page dirty */ | 268 | #define _PAGE_NO_CACHE 0x00000400 /* H: I bit */ |
| 265 | #define _PAGE_NO_CACHE 0x00000400 /* H: I bit */ | 269 | #define _PAGE_WRITETHRU 0x00000800 /* H: W bit */ |
| 266 | #define _PAGE_WRITETHRU 0x00000800 /* H: W bit */ | ||
| 267 | 270 | ||
| 268 | /* TODO: Add large page lowmem mapping support */ | 271 | /* TODO: Add large page lowmem mapping support */ |
| 269 | #define _PMD_PRESENT 0 | 272 | #define _PMD_PRESENT 0 |
| @@ -273,6 +276,7 @@ extern int icache_44x_need_flush; | |||
| 273 | /* ERPN in a PTE never gets cleared, ignore it */ | 276 | /* ERPN in a PTE never gets cleared, ignore it */ |
| 274 | #define _PTE_NONE_MASK 0xffffffff00000000ULL | 277 | #define _PTE_NONE_MASK 0xffffffff00000000ULL |
| 275 | 278 | ||
| 279 | |||
| 276 | #elif defined(CONFIG_FSL_BOOKE) | 280 | #elif defined(CONFIG_FSL_BOOKE) |
| 277 | /* | 281 | /* |
| 278 | MMU Assist Register 3: | 282 | MMU Assist Register 3: |
| @@ -315,6 +319,9 @@ extern int icache_44x_need_flush; | |||
| 315 | #define _PMD_PRESENT_MASK (PAGE_MASK) | 319 | #define _PMD_PRESENT_MASK (PAGE_MASK) |
| 316 | #define _PMD_BAD (~PAGE_MASK) | 320 | #define _PMD_BAD (~PAGE_MASK) |
| 317 | 321 | ||
| 322 | /* Until my rework is finished, FSL BookE still needs atomic PTE updates */ | ||
| 323 | #define PTE_ATOMIC_UPDATES 1 | ||
| 324 | |||
| 318 | #elif defined(CONFIG_8xx) | 325 | #elif defined(CONFIG_8xx) |
| 319 | /* Definitions for 8xx embedded chips. */ | 326 | /* Definitions for 8xx embedded chips. */ |
| 320 | #define _PAGE_PRESENT 0x0001 /* Page is valid */ | 327 | #define _PAGE_PRESENT 0x0001 /* Page is valid */ |
| @@ -345,6 +352,9 @@ extern int icache_44x_need_flush; | |||
| 345 | 352 | ||
| 346 | #define _PTE_NONE_MASK _PAGE_ACCESSED | 353 | #define _PTE_NONE_MASK _PAGE_ACCESSED |
| 347 | 354 | ||
| 355 | /* Until my rework is finished, 8xx still needs atomic PTE updates */ | ||
| 356 | #define PTE_ATOMIC_UPDATES 1 | ||
| 357 | |||
| 348 | #else /* CONFIG_6xx */ | 358 | #else /* CONFIG_6xx */ |
| 349 | /* Definitions for 60x, 740/750, etc. */ | 359 | /* Definitions for 60x, 740/750, etc. */ |
| 350 | #define _PAGE_PRESENT 0x001 /* software: pte contains a translation */ | 360 | #define _PAGE_PRESENT 0x001 /* software: pte contains a translation */ |
| @@ -365,6 +375,10 @@ extern int icache_44x_need_flush; | |||
| 365 | #define _PMD_PRESENT 0 | 375 | #define _PMD_PRESENT 0 |
| 366 | #define _PMD_PRESENT_MASK (PAGE_MASK) | 376 | #define _PMD_PRESENT_MASK (PAGE_MASK) |
| 367 | #define _PMD_BAD (~PAGE_MASK) | 377 | #define _PMD_BAD (~PAGE_MASK) |
| 378 | |||
| 379 | /* Hash table based platforms need atomic updates of the linux PTE */ | ||
| 380 | #define PTE_ATOMIC_UPDATES 1 | ||
| 381 | |||
| 368 | #endif | 382 | #endif |
| 369 | 383 | ||
| 370 | /* | 384 | /* |
| @@ -557,9 +571,11 @@ extern void add_hash_page(unsigned context, unsigned long va, | |||
| 557 | * low PTE word since we expect ALL flag bits to be there | 571 | * low PTE word since we expect ALL flag bits to be there |
| 558 | */ | 572 | */ |
| 559 | #ifndef CONFIG_PTE_64BIT | 573 | #ifndef CONFIG_PTE_64BIT |
| 560 | static inline unsigned long pte_update(pte_t *p, unsigned long clr, | 574 | static inline unsigned long pte_update(pte_t *p, |
| 575 | unsigned long clr, | ||
| 561 | unsigned long set) | 576 | unsigned long set) |
| 562 | { | 577 | { |
| 578 | #ifdef PTE_ATOMIC_UPDATES | ||
| 563 | unsigned long old, tmp; | 579 | unsigned long old, tmp; |
| 564 | 580 | ||
| 565 | __asm__ __volatile__("\ | 581 | __asm__ __volatile__("\ |
| @@ -572,16 +588,26 @@ static inline unsigned long pte_update(pte_t *p, unsigned long clr, | |||
| 572 | : "=&r" (old), "=&r" (tmp), "=m" (*p) | 588 | : "=&r" (old), "=&r" (tmp), "=m" (*p) |
| 573 | : "r" (p), "r" (clr), "r" (set), "m" (*p) | 589 | : "r" (p), "r" (clr), "r" (set), "m" (*p) |
| 574 | : "cc" ); | 590 | : "cc" ); |
| 591 | #else /* PTE_ATOMIC_UPDATES */ | ||
| 592 | unsigned long old = pte_val(*p); | ||
| 593 | *p = __pte((old & ~clr) | set); | ||
| 594 | #endif /* !PTE_ATOMIC_UPDATES */ | ||
| 595 | |||
| 575 | #ifdef CONFIG_44x | 596 | #ifdef CONFIG_44x |
| 576 | if ((old & _PAGE_USER) && (old & _PAGE_HWEXEC)) | 597 | if ((old & _PAGE_USER) && (old & _PAGE_HWEXEC)) |
| 577 | icache_44x_need_flush = 1; | 598 | icache_44x_need_flush = 1; |
| 578 | #endif | 599 | #endif |
| 579 | return old; | 600 | return old; |
| 580 | } | 601 | } |
| 581 | #else | 602 | #else /* CONFIG_PTE_64BIT */ |
| 582 | static inline unsigned long long pte_update(pte_t *p, unsigned long clr, | 603 | /* TODO: Change that to only modify the low word and move set_pte_at() |
| 583 | unsigned long set) | 604 | * out of line |
| 605 | */ | ||
| 606 | static inline unsigned long long pte_update(pte_t *p, | ||
| 607 | unsigned long clr, | ||
| 608 | unsigned long set) | ||
| 584 | { | 609 | { |
| 610 | #ifdef PTE_ATOMIC_UPDATES | ||
| 585 | unsigned long long old; | 611 | unsigned long long old; |
| 586 | unsigned long tmp; | 612 | unsigned long tmp; |
| 587 | 613 | ||
| @@ -596,13 +622,18 @@ static inline unsigned long long pte_update(pte_t *p, unsigned long clr, | |||
| 596 | : "=&r" (old), "=&r" (tmp), "=m" (*p) | 622 | : "=&r" (old), "=&r" (tmp), "=m" (*p) |
| 597 | : "r" (p), "r" ((unsigned long)(p) + 4), "r" (clr), "r" (set), "m" (*p) | 623 | : "r" (p), "r" ((unsigned long)(p) + 4), "r" (clr), "r" (set), "m" (*p) |
| 598 | : "cc" ); | 624 | : "cc" ); |
| 625 | #else /* PTE_ATOMIC_UPDATES */ | ||
| 626 | unsigned long long old = pte_val(*p); | ||
| 627 | *p = __pte((old & ~clr) | set); | ||
| 628 | #endif /* !PTE_ATOMIC_UPDATES */ | ||
| 629 | |||
| 599 | #ifdef CONFIG_44x | 630 | #ifdef CONFIG_44x |
| 600 | if ((old & _PAGE_USER) && (old & _PAGE_HWEXEC)) | 631 | if ((old & _PAGE_USER) && (old & _PAGE_HWEXEC)) |
| 601 | icache_44x_need_flush = 1; | 632 | icache_44x_need_flush = 1; |
| 602 | #endif | 633 | #endif |
| 603 | return old; | 634 | return old; |
| 604 | } | 635 | } |
| 605 | #endif | 636 | #endif /* CONFIG_PTE_64BIT */ |
| 606 | 637 | ||
| 607 | /* | 638 | /* |
| 608 | * set_pte stores a linux PTE into the linux page table. | 639 | * set_pte stores a linux PTE into the linux page table. |
| @@ -671,7 +702,7 @@ static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry, int dirty) | |||
| 671 | ({ \ | 702 | ({ \ |
| 672 | int __changed = !pte_same(*(__ptep), __entry); \ | 703 | int __changed = !pte_same(*(__ptep), __entry); \ |
| 673 | if (__changed) { \ | 704 | if (__changed) { \ |
| 674 | __ptep_set_access_flags(__ptep, __entry, __dirty); \ | 705 | __ptep_set_access_flags(__ptep, __entry, __dirty); \ |
| 675 | flush_tlb_page_nohash(__vma, __address); \ | 706 | flush_tlb_page_nohash(__vma, __address); \ |
| 676 | } \ | 707 | } \ |
| 677 | __changed; \ | 708 | __changed; \ |
diff --git a/include/asm-powerpc/pgtable-ppc64.h b/include/asm-powerpc/pgtable-ppc64.h index b2754d46be44..ab98a9c80b28 100644 --- a/include/asm-powerpc/pgtable-ppc64.h +++ b/include/asm-powerpc/pgtable-ppc64.h | |||
| @@ -93,6 +93,9 @@ | |||
| 93 | #define _PAGE_RW 0x0200 /* software: user write access allowed */ | 93 | #define _PAGE_RW 0x0200 /* software: user write access allowed */ |
| 94 | #define _PAGE_BUSY 0x0800 /* software: PTE & hash are busy */ | 94 | #define _PAGE_BUSY 0x0800 /* software: PTE & hash are busy */ |
| 95 | 95 | ||
| 96 | /* Strong Access Ordering */ | ||
| 97 | #define _PAGE_SAO (_PAGE_WRITETHRU | _PAGE_NO_CACHE | _PAGE_COHERENT) | ||
| 98 | |||
| 96 | #define _PAGE_BASE (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_COHERENT) | 99 | #define _PAGE_BASE (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_COHERENT) |
| 97 | 100 | ||
| 98 | #define _PAGE_WRENABLE (_PAGE_RW | _PAGE_DIRTY) | 101 | #define _PAGE_WRENABLE (_PAGE_RW | _PAGE_DIRTY) |
| @@ -312,13 +315,14 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, | |||
| 312 | return; | 315 | return; |
| 313 | old = pte_update(mm, addr, ptep, _PAGE_RW, 0); | 316 | old = pte_update(mm, addr, ptep, _PAGE_RW, 0); |
| 314 | } | 317 | } |
| 318 | |||
| 315 | static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, | 319 | static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, |
| 316 | unsigned long addr, pte_t *ptep) | 320 | unsigned long addr, pte_t *ptep) |
| 317 | { | 321 | { |
| 318 | unsigned long old; | 322 | unsigned long old; |
| 319 | 323 | ||
| 320 | if ((pte_val(*ptep) & _PAGE_RW) == 0) | 324 | if ((pte_val(*ptep) & _PAGE_RW) == 0) |
| 321 | return; | 325 | return; |
| 322 | old = pte_update(mm, addr, ptep, _PAGE_RW, 1); | 326 | old = pte_update(mm, addr, ptep, _PAGE_RW, 1); |
| 323 | } | 327 | } |
| 324 | 328 | ||
diff --git a/include/asm-powerpc/processor.h b/include/asm-powerpc/processor.h index 061cd17ba83b..101ed87f7d84 100644 --- a/include/asm-powerpc/processor.h +++ b/include/asm-powerpc/processor.h | |||
| @@ -234,6 +234,8 @@ struct thread_struct { | |||
| 234 | #define thread_saved_pc(tsk) \ | 234 | #define thread_saved_pc(tsk) \ |
| 235 | ((tsk)->thread.regs? (tsk)->thread.regs->nip: 0) | 235 | ((tsk)->thread.regs? (tsk)->thread.regs->nip: 0) |
| 236 | 236 | ||
| 237 | #define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.regs) | ||
| 238 | |||
| 237 | unsigned long get_wchan(struct task_struct *p); | 239 | unsigned long get_wchan(struct task_struct *p); |
| 238 | 240 | ||
| 239 | #define KSTK_EIP(tsk) ((tsk)->thread.regs? (tsk)->thread.regs->nip: 0) | 241 | #define KSTK_EIP(tsk) ((tsk)->thread.regs? (tsk)->thread.regs->nip: 0) |
diff --git a/include/asm-powerpc/spu.h b/include/asm-powerpc/spu.h index 99348c1f4cab..8b2eb044270a 100644 --- a/include/asm-powerpc/spu.h +++ b/include/asm-powerpc/spu.h | |||
| @@ -191,6 +191,7 @@ struct cbe_spu_info { | |||
| 191 | struct list_head spus; | 191 | struct list_head spus; |
| 192 | int n_spus; | 192 | int n_spus; |
| 193 | int nr_active; | 193 | int nr_active; |
| 194 | atomic_t busy_spus; | ||
| 194 | atomic_t reserved_spus; | 195 | atomic_t reserved_spus; |
| 195 | }; | 196 | }; |
| 196 | 197 | ||
diff --git a/include/asm-s390/pgtable.h b/include/asm-s390/pgtable.h index c7f4f8e3e297..bd0ea191dfa9 100644 --- a/include/asm-s390/pgtable.h +++ b/include/asm-s390/pgtable.h | |||
| @@ -223,6 +223,9 @@ extern char empty_zero_page[PAGE_SIZE]; | |||
| 223 | #define _PAGE_SPECIAL 0x004 /* SW associated with special page */ | 223 | #define _PAGE_SPECIAL 0x004 /* SW associated with special page */ |
| 224 | #define __HAVE_ARCH_PTE_SPECIAL | 224 | #define __HAVE_ARCH_PTE_SPECIAL |
| 225 | 225 | ||
| 226 | /* Set of bits not changed in pte_modify */ | ||
| 227 | #define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_SPECIAL) | ||
| 228 | |||
| 226 | /* Six different types of pages. */ | 229 | /* Six different types of pages. */ |
| 227 | #define _PAGE_TYPE_EMPTY 0x400 | 230 | #define _PAGE_TYPE_EMPTY 0x400 |
| 228 | #define _PAGE_TYPE_NONE 0x401 | 231 | #define _PAGE_TYPE_NONE 0x401 |
| @@ -681,7 +684,7 @@ static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *pt | |||
| 681 | */ | 684 | */ |
| 682 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | 685 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) |
| 683 | { | 686 | { |
| 684 | pte_val(pte) &= PAGE_MASK; | 687 | pte_val(pte) &= _PAGE_CHG_MASK; |
| 685 | pte_val(pte) |= pgprot_val(newprot); | 688 | pte_val(pte) |= pgprot_val(newprot); |
| 686 | return pte; | 689 | return pte; |
| 687 | } | 690 | } |
diff --git a/include/asm-x86/desc.h b/include/asm-x86/desc.h index 268a012bcd79..28bddbcb38be 100644 --- a/include/asm-x86/desc.h +++ b/include/asm-x86/desc.h | |||
| @@ -192,8 +192,8 @@ static inline void native_set_ldt(const void *addr, unsigned int entries) | |||
| 192 | unsigned cpu = smp_processor_id(); | 192 | unsigned cpu = smp_processor_id(); |
| 193 | ldt_desc ldt; | 193 | ldt_desc ldt; |
| 194 | 194 | ||
| 195 | set_tssldt_descriptor(&ldt, (unsigned long)addr, | 195 | set_tssldt_descriptor(&ldt, (unsigned long)addr, DESC_LDT, |
| 196 | DESC_LDT, entries * sizeof(ldt) - 1); | 196 | entries * LDT_ENTRY_SIZE - 1); |
| 197 | write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_LDT, | 197 | write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_LDT, |
| 198 | &ldt, DESC_LDT); | 198 | &ldt, DESC_LDT); |
| 199 | asm volatile("lldt %w0"::"q" (GDT_ENTRY_LDT*8)); | 199 | asm volatile("lldt %w0"::"q" (GDT_ENTRY_LDT*8)); |
diff --git a/include/asm-x86/kvm_para.h b/include/asm-x86/kvm_para.h index bfd9900742bf..76f392146daa 100644 --- a/include/asm-x86/kvm_para.h +++ b/include/asm-x86/kvm_para.h | |||
| @@ -71,7 +71,8 @@ static inline long kvm_hypercall0(unsigned int nr) | |||
| 71 | long ret; | 71 | long ret; |
| 72 | asm volatile(KVM_HYPERCALL | 72 | asm volatile(KVM_HYPERCALL |
| 73 | : "=a"(ret) | 73 | : "=a"(ret) |
| 74 | : "a"(nr)); | 74 | : "a"(nr) |
| 75 | : "memory"); | ||
| 75 | return ret; | 76 | return ret; |
| 76 | } | 77 | } |
| 77 | 78 | ||
| @@ -80,7 +81,8 @@ static inline long kvm_hypercall1(unsigned int nr, unsigned long p1) | |||
| 80 | long ret; | 81 | long ret; |
| 81 | asm volatile(KVM_HYPERCALL | 82 | asm volatile(KVM_HYPERCALL |
| 82 | : "=a"(ret) | 83 | : "=a"(ret) |
| 83 | : "a"(nr), "b"(p1)); | 84 | : "a"(nr), "b"(p1) |
| 85 | : "memory"); | ||
| 84 | return ret; | 86 | return ret; |
| 85 | } | 87 | } |
| 86 | 88 | ||
| @@ -90,7 +92,8 @@ static inline long kvm_hypercall2(unsigned int nr, unsigned long p1, | |||
| 90 | long ret; | 92 | long ret; |
| 91 | asm volatile(KVM_HYPERCALL | 93 | asm volatile(KVM_HYPERCALL |
| 92 | : "=a"(ret) | 94 | : "=a"(ret) |
| 93 | : "a"(nr), "b"(p1), "c"(p2)); | 95 | : "a"(nr), "b"(p1), "c"(p2) |
| 96 | : "memory"); | ||
| 94 | return ret; | 97 | return ret; |
| 95 | } | 98 | } |
| 96 | 99 | ||
| @@ -100,7 +103,8 @@ static inline long kvm_hypercall3(unsigned int nr, unsigned long p1, | |||
| 100 | long ret; | 103 | long ret; |
| 101 | asm volatile(KVM_HYPERCALL | 104 | asm volatile(KVM_HYPERCALL |
| 102 | : "=a"(ret) | 105 | : "=a"(ret) |
| 103 | : "a"(nr), "b"(p1), "c"(p2), "d"(p3)); | 106 | : "a"(nr), "b"(p1), "c"(p2), "d"(p3) |
| 107 | : "memory"); | ||
| 104 | return ret; | 108 | return ret; |
| 105 | } | 109 | } |
| 106 | 110 | ||
| @@ -111,7 +115,8 @@ static inline long kvm_hypercall4(unsigned int nr, unsigned long p1, | |||
| 111 | long ret; | 115 | long ret; |
| 112 | asm volatile(KVM_HYPERCALL | 116 | asm volatile(KVM_HYPERCALL |
| 113 | : "=a"(ret) | 117 | : "=a"(ret) |
| 114 | : "a"(nr), "b"(p1), "c"(p2), "d"(p3), "S"(p4)); | 118 | : "a"(nr), "b"(p1), "c"(p2), "d"(p3), "S"(p4) |
| 119 | : "memory"); | ||
| 115 | return ret; | 120 | return ret; |
| 116 | } | 121 | } |
| 117 | 122 | ||
diff --git a/include/asm-x86/msr.h b/include/asm-x86/msr.h index 3707650a169b..2b5f2c91db25 100644 --- a/include/asm-x86/msr.h +++ b/include/asm-x86/msr.h | |||
| @@ -18,7 +18,7 @@ static inline unsigned long long native_read_tscp(unsigned int *aux) | |||
| 18 | unsigned long low, high; | 18 | unsigned long low, high; |
| 19 | asm volatile(".byte 0x0f,0x01,0xf9" | 19 | asm volatile(".byte 0x0f,0x01,0xf9" |
| 20 | : "=a" (low), "=d" (high), "=c" (*aux)); | 20 | : "=a" (low), "=d" (high), "=c" (*aux)); |
| 21 | return low | ((u64)high >> 32); | 21 | return low | ((u64)high << 32); |
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | /* | 24 | /* |
diff --git a/include/linux/capability.h b/include/linux/capability.h index fa830f8de032..02673846d205 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h | |||
| @@ -501,6 +501,8 @@ extern const kernel_cap_t __cap_empty_set; | |||
| 501 | extern const kernel_cap_t __cap_full_set; | 501 | extern const kernel_cap_t __cap_full_set; |
| 502 | extern const kernel_cap_t __cap_init_eff_set; | 502 | extern const kernel_cap_t __cap_init_eff_set; |
| 503 | 503 | ||
| 504 | kernel_cap_t cap_set_effective(const kernel_cap_t pE_new); | ||
| 505 | |||
| 504 | int capable(int cap); | 506 | int capable(int cap); |
| 505 | int __capable(struct task_struct *t, int cap); | 507 | int __capable(struct task_struct *t, int cap); |
| 506 | 508 | ||
diff --git a/include/linux/cfag12864b.h b/include/linux/cfag12864b.h index 1605dd8aa646..6f9f19d66591 100644 --- a/include/linux/cfag12864b.h +++ b/include/linux/cfag12864b.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Description: cfag12864b LCD driver header | 4 | * Description: cfag12864b LCD driver header |
| 5 | * License: GPLv2 | 5 | * License: GPLv2 |
| 6 | * | 6 | * |
| 7 | * Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com> | 7 | * Author: Copyright (C) Miguel Ojeda Sandonis |
| 8 | * Date: 2006-10-12 | 8 | * Date: 2006-10-12 |
| 9 | * | 9 | * |
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index 5df3db58fcc6..c24875bd9c5b 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h | |||
| @@ -353,6 +353,10 @@ static inline void __cpus_fold(cpumask_t *dstp, const cpumask_t *origp, | |||
| 353 | for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask) | 353 | for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask) |
| 354 | #endif /* NR_CPUS */ | 354 | #endif /* NR_CPUS */ |
| 355 | 355 | ||
| 356 | #define next_cpu_nr(n, src) next_cpu(n, src) | ||
| 357 | #define cpus_weight_nr(cpumask) cpus_weight(cpumask) | ||
| 358 | #define for_each_cpu_mask_nr(cpu, mask) for_each_cpu_mask(cpu, mask) | ||
| 359 | |||
| 356 | /* | 360 | /* |
| 357 | * The following particular system cpumasks and operations manage | 361 | * The following particular system cpumasks and operations manage |
| 358 | * possible, present and online cpus. Each of them is a fixed size | 362 | * possible, present and online cpus. Each of them is a fixed size |
diff --git a/include/linux/debug_locks.h b/include/linux/debug_locks.h index f4a5871767f5..4aaa4afb1cb9 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 | #include <linux/kernel.h> | ||
| 5 | |||
| 4 | struct task_struct; | 6 | struct task_struct; |
| 5 | 7 | ||
| 6 | extern int debug_locks; | 8 | extern int debug_locks; |
| @@ -11,14 +13,6 @@ extern int debug_locks_silent; | |||
| 11 | */ | 13 | */ |
| 12 | extern int debug_locks_off(void); | 14 | extern int debug_locks_off(void); |
| 13 | 15 | ||
| 14 | /* | ||
| 15 | * In the debug case we carry the caller's instruction pointer into | ||
| 16 | * other functions, but we dont want the function argument overhead | ||
| 17 | * in the nondebug case - hence these macros: | ||
| 18 | */ | ||
| 19 | #define _RET_IP_ (unsigned long)__builtin_return_address(0) | ||
| 20 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; }) | ||
| 21 | |||
| 22 | #define DEBUG_LOCKS_WARN_ON(c) \ | 16 | #define DEBUG_LOCKS_WARN_ON(c) \ |
| 23 | ({ \ | 17 | ({ \ |
| 24 | int __ret = 0; \ | 18 | int __ret = 0; \ |
diff --git a/include/linux/firmware.h b/include/linux/firmware.h index 4d10c7328d2d..6c7eff2ebada 100644 --- a/include/linux/firmware.h +++ b/include/linux/firmware.h | |||
| @@ -13,7 +13,7 @@ struct firmware { | |||
| 13 | 13 | ||
| 14 | struct device; | 14 | struct device; |
| 15 | 15 | ||
| 16 | #if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE) | 16 | #if defined(CONFIG_FW_LOADER) || (defined(CONFIG_FW_LOADER_MODULE) && defined(MODULE)) |
| 17 | int request_firmware(const struct firmware **fw, const char *name, | 17 | int request_firmware(const struct firmware **fw, const char *name, |
| 18 | struct device *device); | 18 | struct device *device); |
| 19 | int request_firmware_nowait( | 19 | int request_firmware_nowait( |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 7c1080826832..d8e2762ed14d 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -83,6 +83,7 @@ extern int dir_notify_enable; | |||
| 83 | #define READ_SYNC (READ | (1 << BIO_RW_SYNC)) | 83 | #define READ_SYNC (READ | (1 << BIO_RW_SYNC)) |
| 84 | #define READ_META (READ | (1 << BIO_RW_META)) | 84 | #define READ_META (READ | (1 << BIO_RW_META)) |
| 85 | #define WRITE_SYNC (WRITE | (1 << BIO_RW_SYNC)) | 85 | #define WRITE_SYNC (WRITE | (1 << BIO_RW_SYNC)) |
| 86 | #define SWRITE_SYNC (SWRITE | (1 << BIO_RW_SYNC)) | ||
| 86 | #define WRITE_BARRIER ((1 << BIO_RW) | (1 << BIO_RW_BARRIER)) | 87 | #define WRITE_BARRIER ((1 << BIO_RW) | (1 << BIO_RW_BARRIER)) |
| 87 | 88 | ||
| 88 | #define SEL_IN 1 | 89 | #define SEL_IN 1 |
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index fb9af6a0fe9c..8dc730132192 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h | |||
| @@ -171,7 +171,7 @@ struct i2c_client { | |||
| 171 | struct i2c_adapter *adapter; /* the adapter we sit on */ | 171 | struct i2c_adapter *adapter; /* the adapter we sit on */ |
| 172 | struct i2c_driver *driver; /* and our access routines */ | 172 | struct i2c_driver *driver; /* and our access routines */ |
| 173 | struct device dev; /* the device structure */ | 173 | struct device dev; /* the device structure */ |
| 174 | int irq; /* irq issued by device (or -1) */ | 174 | int irq; /* irq issued by device */ |
| 175 | struct list_head list; /* DEPRECATED */ | 175 | struct list_head list; /* DEPRECATED */ |
| 176 | struct completion released; | 176 | struct completion released; |
| 177 | }; | 177 | }; |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 9918772bf274..eddb6daadf4a 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -189,6 +189,21 @@ static inline void ide_std_init_ports(hw_regs_t *hw, | |||
| 189 | hw->io_ports.ctl_addr = ctl_addr; | 189 | hw->io_ports.ctl_addr = ctl_addr; |
| 190 | } | 190 | } |
| 191 | 191 | ||
| 192 | /* for IDE PCI controllers in legacy mode, temporary */ | ||
| 193 | static inline int __ide_default_irq(unsigned long base) | ||
| 194 | { | ||
| 195 | switch (base) { | ||
| 196 | #ifdef CONFIG_IA64 | ||
| 197 | case 0x1f0: return isa_irq_to_vector(14); | ||
| 198 | case 0x170: return isa_irq_to_vector(15); | ||
| 199 | #else | ||
| 200 | case 0x1f0: return 14; | ||
| 201 | case 0x170: return 15; | ||
| 202 | #endif | ||
| 203 | } | ||
| 204 | return 0; | ||
| 205 | } | ||
| 206 | |||
| 192 | #include <asm/ide.h> | 207 | #include <asm/ide.h> |
| 193 | 208 | ||
| 194 | #if !defined(MAX_HWIFS) || defined(CONFIG_EMBEDDED) | 209 | #if !defined(MAX_HWIFS) || defined(CONFIG_EMBEDDED) |
diff --git a/include/linux/inet_lro.h b/include/linux/inet_lro.h index 80335b7d77c5..c4335faebb63 100644 --- a/include/linux/inet_lro.h +++ b/include/linux/inet_lro.h | |||
| @@ -84,7 +84,11 @@ struct net_lro_mgr { | |||
| 84 | from received packets and eth protocol | 84 | from received packets and eth protocol |
| 85 | is still ETH_P_8021Q */ | 85 | is still ETH_P_8021Q */ |
| 86 | 86 | ||
| 87 | u32 ip_summed; /* Set in non generated SKBs in page mode */ | 87 | /* |
| 88 | * Set for generated SKBs that are not added to | ||
| 89 | * the frag list in fragmented mode | ||
| 90 | */ | ||
| 91 | u32 ip_summed; | ||
| 88 | u32 ip_summed_aggr; /* Set in aggregated SKBs: CHECKSUM_UNNECESSARY | 92 | u32 ip_summed_aggr; /* Set in aggregated SKBs: CHECKSUM_UNNECESSARY |
| 89 | * or CHECKSUM_NONE */ | 93 | * or CHECKSUM_NONE */ |
| 90 | 94 | ||
diff --git a/include/linux/input.h b/include/linux/input.h index e075c4b762fb..d150c57e5f0a 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
| @@ -534,8 +534,8 @@ struct input_absinfo { | |||
| 534 | 534 | ||
| 535 | #define KEY_FRAMEBACK 0x1b4 /* Consumer - transport controls */ | 535 | #define KEY_FRAMEBACK 0x1b4 /* Consumer - transport controls */ |
| 536 | #define KEY_FRAMEFORWARD 0x1b5 | 536 | #define KEY_FRAMEFORWARD 0x1b5 |
| 537 | |||
| 538 | #define KEY_CONTEXT_MENU 0x1b6 /* GenDesc - system context menu */ | 537 | #define KEY_CONTEXT_MENU 0x1b6 /* GenDesc - system context menu */ |
| 538 | #define KEY_MEDIA_REPEAT 0x1b7 /* Consumer - transport control */ | ||
| 539 | 539 | ||
| 540 | #define KEY_DEL_EOL 0x1c0 | 540 | #define KEY_DEL_EOL 0x1c0 |
| 541 | #define KEY_DEL_EOS 0x1c1 | 541 | #define KEY_DEL_EOS 0x1c1 |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 792bf0aa779b..2e70006c7fa8 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
| @@ -46,6 +46,9 @@ extern const char linux_proc_banner[]; | |||
| 46 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) | 46 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) |
| 47 | #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) | 47 | #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) |
| 48 | 48 | ||
| 49 | #define _RET_IP_ (unsigned long)__builtin_return_address(0) | ||
| 50 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; }) | ||
| 51 | |||
| 49 | #ifdef CONFIG_LBD | 52 | #ifdef CONFIG_LBD |
| 50 | # include <asm/div64.h> | 53 | # include <asm/div64.h> |
| 51 | # define sector_div(a, b) do_div(a, b) | 54 | # define sector_div(a, b) do_div(a, b) |
diff --git a/include/linux/ks0108.h b/include/linux/ks0108.h index a2c54acceb4e..cb311798e0bc 100644 --- a/include/linux/ks0108.h +++ b/include/linux/ks0108.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Description: ks0108 LCD Controller driver header | 4 | * Description: ks0108 LCD Controller driver header |
| 5 | * License: GPLv2 | 5 | * License: GPLv2 |
| 6 | * | 6 | * |
| 7 | * Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com> | 7 | * Author: Copyright (C) Miguel Ojeda Sandonis |
| 8 | * Date: 2006-10-31 | 8 | * Date: 2006-10-31 |
| 9 | * | 9 | * |
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
diff --git a/include/linux/mm.h b/include/linux/mm.h index 586a943cab01..689184446fc6 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -108,6 +108,7 @@ extern unsigned int kobjsize(const void *objp); | |||
| 108 | 108 | ||
| 109 | #define VM_CAN_NONLINEAR 0x08000000 /* Has ->fault & does nonlinear pages */ | 109 | #define VM_CAN_NONLINEAR 0x08000000 /* Has ->fault & does nonlinear pages */ |
| 110 | #define VM_MIXEDMAP 0x10000000 /* Can contain "struct page" and pure PFN pages */ | 110 | #define VM_MIXEDMAP 0x10000000 /* Can contain "struct page" and pure PFN pages */ |
| 111 | #define VM_SAO 0x20000000 /* Strong Access Ordering (powerpc) */ | ||
| 111 | 112 | ||
| 112 | #ifndef VM_STACK_DEFAULT_FLAGS /* arch can override this */ | 113 | #ifndef VM_STACK_DEFAULT_FLAGS /* arch can override this */ |
| 113 | #define VM_STACK_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS | 114 | #define VM_STACK_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS |
diff --git a/include/linux/mman.h b/include/linux/mman.h index dab8892e6ff1..30d1073bac3b 100644 --- a/include/linux/mman.h +++ b/include/linux/mman.h | |||
| @@ -34,6 +34,32 @@ static inline void vm_unacct_memory(long pages) | |||
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | /* | 36 | /* |
| 37 | * Allow architectures to handle additional protection bits | ||
| 38 | */ | ||
| 39 | |||
| 40 | #ifndef arch_calc_vm_prot_bits | ||
| 41 | #define arch_calc_vm_prot_bits(prot) 0 | ||
| 42 | #endif | ||
| 43 | |||
| 44 | #ifndef arch_vm_get_page_prot | ||
| 45 | #define arch_vm_get_page_prot(vm_flags) __pgprot(0) | ||
| 46 | #endif | ||
| 47 | |||
| 48 | #ifndef arch_validate_prot | ||
| 49 | /* | ||
| 50 | * This is called from mprotect(). PROT_GROWSDOWN and PROT_GROWSUP have | ||
| 51 | * already been masked out. | ||
| 52 | * | ||
| 53 | * Returns true if the prot flags are valid | ||
| 54 | */ | ||
| 55 | static inline int arch_validate_prot(unsigned long prot) | ||
| 56 | { | ||
| 57 | return (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM)) == 0; | ||
| 58 | } | ||
| 59 | #define arch_validate_prot arch_validate_prot | ||
| 60 | #endif | ||
| 61 | |||
| 62 | /* | ||
| 37 | * Optimisation macro. It is equivalent to: | 63 | * Optimisation macro. It is equivalent to: |
| 38 | * (x & bit1) ? bit2 : 0 | 64 | * (x & bit1) ? bit2 : 0 |
| 39 | * but this version is faster. | 65 | * but this version is faster. |
| @@ -51,7 +77,8 @@ calc_vm_prot_bits(unsigned long prot) | |||
| 51 | { | 77 | { |
| 52 | return _calc_vm_trans(prot, PROT_READ, VM_READ ) | | 78 | return _calc_vm_trans(prot, PROT_READ, VM_READ ) | |
| 53 | _calc_vm_trans(prot, PROT_WRITE, VM_WRITE) | | 79 | _calc_vm_trans(prot, PROT_WRITE, VM_WRITE) | |
| 54 | _calc_vm_trans(prot, PROT_EXEC, VM_EXEC ); | 80 | _calc_vm_trans(prot, PROT_EXEC, VM_EXEC) | |
| 81 | arch_calc_vm_prot_bits(prot); | ||
| 55 | } | 82 | } |
| 56 | 83 | ||
| 57 | /* | 84 | /* |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index f27fd2009334..25f87102ab66 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -88,6 +88,8 @@ struct wireless_dev; | |||
| 88 | #define NETDEV_TX_BUSY 1 /* driver tx path was busy*/ | 88 | #define NETDEV_TX_BUSY 1 /* driver tx path was busy*/ |
| 89 | #define NETDEV_TX_LOCKED -1 /* driver tx lock was already taken */ | 89 | #define NETDEV_TX_LOCKED -1 /* driver tx lock was already taken */ |
| 90 | 90 | ||
| 91 | #ifdef __KERNEL__ | ||
| 92 | |||
| 91 | /* | 93 | /* |
| 92 | * Compute the worst case header length according to the protocols | 94 | * Compute the worst case header length according to the protocols |
| 93 | * used. | 95 | * used. |
| @@ -114,6 +116,8 @@ struct wireless_dev; | |||
| 114 | #define MAX_HEADER (LL_MAX_HEADER + 48) | 116 | #define MAX_HEADER (LL_MAX_HEADER + 48) |
| 115 | #endif | 117 | #endif |
| 116 | 118 | ||
| 119 | #endif /* __KERNEL__ */ | ||
| 120 | |||
| 117 | struct net_device_subqueue | 121 | struct net_device_subqueue |
| 118 | { | 122 | { |
| 119 | /* Give a control state for each queue. This struct may contain | 123 | /* Give a control state for each queue. This struct may contain |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index eafc9d6d2b35..1cf4084b51e8 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -1520,6 +1520,7 @@ | |||
| 1520 | #define PCI_DEVICE_ID_MARVELL_GT64260 0x6430 | 1520 | #define PCI_DEVICE_ID_MARVELL_GT64260 0x6430 |
| 1521 | #define PCI_DEVICE_ID_MARVELL_MV64360 0x6460 | 1521 | #define PCI_DEVICE_ID_MARVELL_MV64360 0x6460 |
| 1522 | #define PCI_DEVICE_ID_MARVELL_MV64460 0x6480 | 1522 | #define PCI_DEVICE_ID_MARVELL_MV64460 0x6480 |
| 1523 | #define PCI_DEVICE_ID_MARVELL_CAFE_SD 0x4101 | ||
| 1523 | 1524 | ||
| 1524 | #define PCI_VENDOR_ID_V3 0x11b0 | 1525 | #define PCI_VENDOR_ID_V3 0x11b0 |
| 1525 | #define PCI_DEVICE_ID_V3_V960 0x0001 | 1526 | #define PCI_DEVICE_ID_V3_V960 0x0001 |
| @@ -2170,6 +2171,8 @@ | |||
| 2170 | #define PCI_DEVICE_ID_MPC8544 0x0033 | 2171 | #define PCI_DEVICE_ID_MPC8544 0x0033 |
| 2171 | #define PCI_DEVICE_ID_MPC8572E 0x0040 | 2172 | #define PCI_DEVICE_ID_MPC8572E 0x0040 |
| 2172 | #define PCI_DEVICE_ID_MPC8572 0x0041 | 2173 | #define PCI_DEVICE_ID_MPC8572 0x0041 |
| 2174 | #define PCI_DEVICE_ID_MPC8536E 0x0050 | ||
| 2175 | #define PCI_DEVICE_ID_MPC8536 0x0051 | ||
| 2173 | #define PCI_DEVICE_ID_MPC8641 0x7010 | 2176 | #define PCI_DEVICE_ID_MPC8641 0x7010 |
| 2174 | #define PCI_DEVICE_ID_MPC8641D 0x7011 | 2177 | #define PCI_DEVICE_ID_MPC8641D 0x7011 |
| 2175 | #define PCI_DEVICE_ID_MPC8610 0x7018 | 2178 | #define PCI_DEVICE_ID_MPC8610 0x7018 |
diff --git a/include/linux/rculist.h b/include/linux/rculist.h new file mode 100644 index 000000000000..bde4586f4382 --- /dev/null +++ b/include/linux/rculist.h | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | #ifndef _LINUX_RCULIST_H | ||
| 2 | #define _LINUX_RCULIST_H | ||
| 3 | |||
| 4 | #include <linux/list.h> | ||
| 5 | |||
| 6 | #endif /* _LINUX_RCULIST_H */ | ||
diff --git a/include/linux/securebits.h b/include/linux/securebits.h index c1f19dbceb05..92f09bdf1175 100644 --- a/include/linux/securebits.h +++ b/include/linux/securebits.h | |||
| @@ -7,14 +7,15 @@ | |||
| 7 | inheritance of root-permissions and suid-root executable under | 7 | inheritance of root-permissions and suid-root executable under |
| 8 | compatibility mode. We raise the effective and inheritable bitmasks | 8 | compatibility mode. We raise the effective and inheritable bitmasks |
| 9 | *of the executable file* if the effective uid of the new process is | 9 | *of the executable file* if the effective uid of the new process is |
| 10 | 0. If the real uid is 0, we raise the inheritable bitmask of the | 10 | 0. If the real uid is 0, we raise the effective (legacy) bit of the |
| 11 | executable file. */ | 11 | executable file. */ |
| 12 | #define SECURE_NOROOT 0 | 12 | #define SECURE_NOROOT 0 |
| 13 | #define SECURE_NOROOT_LOCKED 1 /* make bit-0 immutable */ | 13 | #define SECURE_NOROOT_LOCKED 1 /* make bit-0 immutable */ |
| 14 | 14 | ||
| 15 | /* When set, setuid to/from uid 0 does not trigger capability-"fixes" | 15 | /* When set, setuid to/from uid 0 does not trigger capability-"fixup". |
| 16 | to be compatible with old programs relying on set*uid to loose | 16 | When unset, to provide compatiblility with old programs relying on |
| 17 | privileges. When unset, setuid doesn't change privileges. */ | 17 | set*uid to gain/lose privilege, transitions to/from uid 0 cause |
| 18 | capabilities to be gained/lost. */ | ||
| 18 | #define SECURE_NO_SETUID_FIXUP 2 | 19 | #define SECURE_NO_SETUID_FIXUP 2 |
| 19 | #define SECURE_NO_SETUID_FIXUP_LOCKED 3 /* make bit-2 immutable */ | 20 | #define SECURE_NO_SETUID_FIXUP_LOCKED 3 /* make bit-2 immutable */ |
| 20 | 21 | ||
| @@ -26,10 +27,10 @@ | |||
| 26 | #define SECURE_KEEP_CAPS 4 | 27 | #define SECURE_KEEP_CAPS 4 |
| 27 | #define SECURE_KEEP_CAPS_LOCKED 5 /* make bit-4 immutable */ | 28 | #define SECURE_KEEP_CAPS_LOCKED 5 /* make bit-4 immutable */ |
| 28 | 29 | ||
| 29 | /* Each securesetting is implemented using two bits. One bit specify | 30 | /* Each securesetting is implemented using two bits. One bit specifies |
| 30 | whether the setting is on or off. The other bit specify whether the | 31 | whether the setting is on or off. The other bit specify whether the |
| 31 | setting is fixed or not. A setting which is fixed cannot be changed | 32 | setting is locked or not. A setting which is locked cannot be |
| 32 | from user-level. */ | 33 | changed from user-level. */ |
| 33 | #define issecure_mask(X) (1 << (X)) | 34 | #define issecure_mask(X) (1 << (X)) |
| 34 | #define issecure(X) (issecure_mask(X) & current->securebits) | 35 | #define issecure(X) (issecure_mask(X) & current->securebits) |
| 35 | 36 | ||
diff --git a/include/linux/slab.h b/include/linux/slab.h index c2ad35016599..9aa90a6f20e0 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Written by Mark Hemment, 1996 (markhe@nextd.demon.co.uk). | 2 | * Written by Mark Hemment, 1996 (markhe@nextd.demon.co.uk). |
| 3 | * | 3 | * |
| 4 | * (C) SGI 2006, Christoph Lameter <clameter@sgi.com> | 4 | * (C) SGI 2006, Christoph Lameter |
| 5 | * Cleaned up and restructured to ease the addition of alternative | 5 | * Cleaned up and restructured to ease the addition of alternative |
| 6 | * implementations of SLAB allocators. | 6 | * implementations of SLAB allocators. |
| 7 | */ | 7 | */ |
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index 71e43a12ebbb..d117ea2825a9 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | /* | 4 | /* |
| 5 | * SLUB : A Slab allocator without object queues. | 5 | * SLUB : A Slab allocator without object queues. |
| 6 | * | 6 | * |
| 7 | * (C) 2007 SGI, Christoph Lameter <clameter@sgi.com> | 7 | * (C) 2007 SGI, Christoph Lameter |
| 8 | */ | 8 | */ |
| 9 | #include <linux/types.h> | 9 | #include <linux/types.h> |
| 10 | #include <linux/gfp.h> | 10 | #include <linux/gfp.h> |
| @@ -137,10 +137,12 @@ static __always_inline int kmalloc_index(size_t size) | |||
| 137 | if (size <= KMALLOC_MIN_SIZE) | 137 | if (size <= KMALLOC_MIN_SIZE) |
| 138 | return KMALLOC_SHIFT_LOW; | 138 | return KMALLOC_SHIFT_LOW; |
| 139 | 139 | ||
| 140 | #if KMALLOC_MIN_SIZE <= 64 | ||
| 140 | if (size > 64 && size <= 96) | 141 | if (size > 64 && size <= 96) |
| 141 | return 1; | 142 | return 1; |
| 142 | if (size > 128 && size <= 192) | 143 | if (size > 128 && size <= 192) |
| 143 | return 2; | 144 | return 2; |
| 145 | #endif | ||
| 144 | if (size <= 8) return 3; | 146 | if (size <= 8) return 3; |
| 145 | if (size <= 16) return 4; | 147 | if (size <= 16) return 4; |
| 146 | if (size <= 32) return 5; | 148 | if (size <= 32) return 5; |
diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h index 2ca6bae88721..fb0c215a3051 100644 --- a/include/linux/xfrm.h +++ b/include/linux/xfrm.h | |||
| @@ -339,6 +339,7 @@ struct xfrm_usersa_info { | |||
| 339 | #define XFRM_STATE_NOPMTUDISC 4 | 339 | #define XFRM_STATE_NOPMTUDISC 4 |
| 340 | #define XFRM_STATE_WILDRECV 8 | 340 | #define XFRM_STATE_WILDRECV 8 |
| 341 | #define XFRM_STATE_ICMP 16 | 341 | #define XFRM_STATE_ICMP 16 |
| 342 | #define XFRM_STATE_AF_UNSPEC 32 | ||
| 342 | }; | 343 | }; |
| 343 | 344 | ||
| 344 | struct xfrm_usersa_id { | 345 | struct xfrm_usersa_id { |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index dae3f9ec1154..bcd1623245cb 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
| @@ -595,6 +595,15 @@ enum ieee80211_key_alg { | |||
| 595 | ALG_CCMP, | 595 | ALG_CCMP, |
| 596 | }; | 596 | }; |
| 597 | 597 | ||
| 598 | /** | ||
| 599 | * enum ieee80211_key_len - key length | ||
| 600 | * @WEP40: WEP 5 byte long key | ||
| 601 | * @WEP104: WEP 13 byte long key | ||
| 602 | */ | ||
| 603 | enum ieee80211_key_len { | ||
| 604 | LEN_WEP40 = 5, | ||
| 605 | LEN_WEP104 = 13, | ||
| 606 | }; | ||
| 598 | 607 | ||
| 599 | /** | 608 | /** |
| 600 | * enum ieee80211_key_flags - key flags | 609 | * enum ieee80211_key_flags - key flags |
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index ab502ec1c61c..a87fc0312edc 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
| @@ -178,7 +178,7 @@ extern struct Qdisc *qdisc_alloc(struct net_device *dev, struct Qdisc_ops *ops); | |||
| 178 | extern struct Qdisc *qdisc_create_dflt(struct net_device *dev, | 178 | extern struct Qdisc *qdisc_create_dflt(struct net_device *dev, |
| 179 | struct Qdisc_ops *ops, u32 parentid); | 179 | struct Qdisc_ops *ops, u32 parentid); |
| 180 | extern void tcf_destroy(struct tcf_proto *tp); | 180 | extern void tcf_destroy(struct tcf_proto *tp); |
| 181 | extern void tcf_destroy_chain(struct tcf_proto *fl); | 181 | extern void tcf_destroy_chain(struct tcf_proto **fl); |
| 182 | 182 | ||
| 183 | static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch, | 183 | static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch, |
| 184 | struct sk_buff_head *list) | 184 | struct sk_buff_head *list) |
diff --git a/kernel/capability.c b/kernel/capability.c index cfbe44299488..901e0fdc3fff 100644 --- a/kernel/capability.c +++ b/kernel/capability.c | |||
| @@ -121,6 +121,27 @@ static int cap_validate_magic(cap_user_header_t header, unsigned *tocopy) | |||
| 121 | * uninteresting and/or not to be changed. | 121 | * uninteresting and/or not to be changed. |
| 122 | */ | 122 | */ |
| 123 | 123 | ||
| 124 | /* | ||
| 125 | * Atomically modify the effective capabilities returning the original | ||
| 126 | * value. No permission check is performed here - it is assumed that the | ||
| 127 | * caller is permitted to set the desired effective capabilities. | ||
| 128 | */ | ||
| 129 | kernel_cap_t cap_set_effective(const kernel_cap_t pE_new) | ||
| 130 | { | ||
| 131 | kernel_cap_t pE_old; | ||
| 132 | |||
| 133 | spin_lock(&task_capability_lock); | ||
| 134 | |||
| 135 | pE_old = current->cap_effective; | ||
| 136 | current->cap_effective = pE_new; | ||
| 137 | |||
| 138 | spin_unlock(&task_capability_lock); | ||
| 139 | |||
| 140 | return pE_old; | ||
| 141 | } | ||
| 142 | |||
| 143 | EXPORT_SYMBOL(cap_set_effective); | ||
| 144 | |||
| 124 | /** | 145 | /** |
| 125 | * sys_capget - get the capabilities of a given process. | 146 | * sys_capget - get the capabilities of a given process. |
| 126 | * @header: pointer to struct that contains capability version and | 147 | * @header: pointer to struct that contains capability version and |
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 9fceb97e989c..798b3ab054eb 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
| @@ -1882,7 +1882,7 @@ static void scan_for_empty_cpusets(const struct cpuset *root) | |||
| 1882 | * in order to minimize text size. | 1882 | * in order to minimize text size. |
| 1883 | */ | 1883 | */ |
| 1884 | 1884 | ||
| 1885 | static void common_cpu_mem_hotplug_unplug(void) | 1885 | static void common_cpu_mem_hotplug_unplug(int rebuild_sd) |
| 1886 | { | 1886 | { |
| 1887 | cgroup_lock(); | 1887 | cgroup_lock(); |
| 1888 | 1888 | ||
| @@ -1894,7 +1894,8 @@ static void common_cpu_mem_hotplug_unplug(void) | |||
| 1894 | * Scheduler destroys domains on hotplug events. | 1894 | * Scheduler destroys domains on hotplug events. |
| 1895 | * Rebuild them based on the current settings. | 1895 | * Rebuild them based on the current settings. |
| 1896 | */ | 1896 | */ |
| 1897 | rebuild_sched_domains(); | 1897 | if (rebuild_sd) |
| 1898 | rebuild_sched_domains(); | ||
| 1898 | 1899 | ||
| 1899 | cgroup_unlock(); | 1900 | cgroup_unlock(); |
| 1900 | } | 1901 | } |
| @@ -1912,11 +1913,22 @@ static void common_cpu_mem_hotplug_unplug(void) | |||
| 1912 | static int cpuset_handle_cpuhp(struct notifier_block *unused_nb, | 1913 | static int cpuset_handle_cpuhp(struct notifier_block *unused_nb, |
| 1913 | unsigned long phase, void *unused_cpu) | 1914 | unsigned long phase, void *unused_cpu) |
| 1914 | { | 1915 | { |
| 1915 | if (phase == CPU_DYING || phase == CPU_DYING_FROZEN) | 1916 | switch (phase) { |
| 1917 | case CPU_UP_CANCELED: | ||
| 1918 | case CPU_UP_CANCELED_FROZEN: | ||
| 1919 | case CPU_DOWN_FAILED: | ||
| 1920 | case CPU_DOWN_FAILED_FROZEN: | ||
| 1921 | case CPU_ONLINE: | ||
| 1922 | case CPU_ONLINE_FROZEN: | ||
| 1923 | case CPU_DEAD: | ||
| 1924 | case CPU_DEAD_FROZEN: | ||
| 1925 | common_cpu_mem_hotplug_unplug(1); | ||
| 1926 | break; | ||
| 1927 | default: | ||
| 1916 | return NOTIFY_DONE; | 1928 | return NOTIFY_DONE; |
| 1929 | } | ||
| 1917 | 1930 | ||
| 1918 | common_cpu_mem_hotplug_unplug(); | 1931 | return NOTIFY_OK; |
| 1919 | return 0; | ||
| 1920 | } | 1932 | } |
| 1921 | 1933 | ||
| 1922 | #ifdef CONFIG_MEMORY_HOTPLUG | 1934 | #ifdef CONFIG_MEMORY_HOTPLUG |
| @@ -1929,7 +1941,7 @@ static int cpuset_handle_cpuhp(struct notifier_block *unused_nb, | |||
| 1929 | 1941 | ||
| 1930 | void cpuset_track_online_nodes(void) | 1942 | void cpuset_track_online_nodes(void) |
| 1931 | { | 1943 | { |
| 1932 | common_cpu_mem_hotplug_unplug(); | 1944 | common_cpu_mem_hotplug_unplug(0); |
| 1933 | } | 1945 | } |
| 1934 | #endif | 1946 | #endif |
| 1935 | 1947 | ||
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 421be5fe5cc7..ab80515008f4 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
| @@ -1003,10 +1003,18 @@ hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode) | |||
| 1003 | */ | 1003 | */ |
| 1004 | raise = timer->state == HRTIMER_STATE_PENDING; | 1004 | raise = timer->state == HRTIMER_STATE_PENDING; |
| 1005 | 1005 | ||
| 1006 | /* | ||
| 1007 | * We use preempt_disable to prevent this task from migrating after | ||
| 1008 | * setting up the softirq and raising it. Otherwise, if me migrate | ||
| 1009 | * we will raise the softirq on the wrong CPU. | ||
| 1010 | */ | ||
| 1011 | preempt_disable(); | ||
| 1012 | |||
| 1006 | unlock_hrtimer_base(timer, &flags); | 1013 | unlock_hrtimer_base(timer, &flags); |
| 1007 | 1014 | ||
| 1008 | if (raise) | 1015 | if (raise) |
| 1009 | hrtimer_raise_softirq(); | 1016 | hrtimer_raise_softirq(); |
| 1017 | preempt_enable(); | ||
| 1010 | 1018 | ||
| 1011 | return ret; | 1019 | return ret; |
| 1012 | } | 1020 | } |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index d4998f81e229..1485ca8d0e00 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
| @@ -79,7 +79,7 @@ static DEFINE_PER_CPU(struct kprobe *, kprobe_instance) = NULL; | |||
| 79 | * | 79 | * |
| 80 | * For such cases, we now have a blacklist | 80 | * For such cases, we now have a blacklist |
| 81 | */ | 81 | */ |
| 82 | struct kprobe_blackpoint kprobe_blacklist[] = { | 82 | static struct kprobe_blackpoint kprobe_blacklist[] = { |
| 83 | {"preempt_schedule",}, | 83 | {"preempt_schedule",}, |
| 84 | {NULL} /* Terminator */ | 84 | {NULL} /* Terminator */ |
| 85 | }; | 85 | }; |
diff --git a/kernel/printk.c b/kernel/printk.c index 8fb01c32aa3b..e2129e83fd75 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
| @@ -666,7 +666,7 @@ static int acquire_console_semaphore_for_printk(unsigned int cpu) | |||
| 666 | return retval; | 666 | return retval; |
| 667 | } | 667 | } |
| 668 | 668 | ||
| 669 | const char printk_recursion_bug_msg [] = | 669 | static const char printk_recursion_bug_msg [] = |
| 670 | KERN_CRIT "BUG: recent printk recursion!\n"; | 670 | KERN_CRIT "BUG: recent printk recursion!\n"; |
| 671 | static int printk_recursion_bug; | 671 | static int printk_recursion_bug; |
| 672 | 672 | ||
diff --git a/kernel/rcuclassic.c b/kernel/rcuclassic.c index f4ffbd0f306f..a38895a5b8e2 100644 --- a/kernel/rcuclassic.c +++ b/kernel/rcuclassic.c | |||
| @@ -89,8 +89,22 @@ static void force_quiescent_state(struct rcu_data *rdp, | |||
| 89 | /* | 89 | /* |
| 90 | * Don't send IPI to itself. With irqs disabled, | 90 | * Don't send IPI to itself. With irqs disabled, |
| 91 | * rdp->cpu is the current cpu. | 91 | * rdp->cpu is the current cpu. |
| 92 | * | ||
| 93 | * cpu_online_map is updated by the _cpu_down() | ||
| 94 | * using stop_machine_run(). Since we're in irqs disabled | ||
| 95 | * section, stop_machine_run() is not exectuting, hence | ||
| 96 | * the cpu_online_map is stable. | ||
| 97 | * | ||
| 98 | * However, a cpu might have been offlined _just_ before | ||
| 99 | * we disabled irqs while entering here. | ||
| 100 | * And rcu subsystem might not yet have handled the CPU_DEAD | ||
| 101 | * notification, leading to the offlined cpu's bit | ||
| 102 | * being set in the rcp->cpumask. | ||
| 103 | * | ||
| 104 | * Hence cpumask = (rcp->cpumask & cpu_online_map) to prevent | ||
| 105 | * sending smp_reschedule() to an offlined CPU. | ||
| 92 | */ | 106 | */ |
| 93 | cpumask = rcp->cpumask; | 107 | cpus_and(cpumask, rcp->cpumask, cpu_online_map); |
| 94 | cpu_clear(rdp->cpu, cpumask); | 108 | cpu_clear(rdp->cpu, cpumask); |
| 95 | for_each_cpu_mask(cpu, cpumask) | 109 | for_each_cpu_mask(cpu, cpumask) |
| 96 | smp_send_reschedule(cpu); | 110 | smp_send_reschedule(cpu); |
diff --git a/kernel/rcupreempt.c b/kernel/rcupreempt.c index 5e02b7740702..41d275a81df5 100644 --- a/kernel/rcupreempt.c +++ b/kernel/rcupreempt.c | |||
| @@ -925,26 +925,22 @@ void rcu_offline_cpu(int cpu) | |||
| 925 | spin_unlock_irqrestore(&rdp->lock, flags); | 925 | spin_unlock_irqrestore(&rdp->lock, flags); |
| 926 | } | 926 | } |
| 927 | 927 | ||
| 928 | void __devinit rcu_online_cpu(int cpu) | ||
| 929 | { | ||
| 930 | unsigned long flags; | ||
| 931 | |||
| 932 | spin_lock_irqsave(&rcu_ctrlblk.fliplock, flags); | ||
| 933 | cpu_set(cpu, rcu_cpu_online_map); | ||
| 934 | spin_unlock_irqrestore(&rcu_ctrlblk.fliplock, flags); | ||
| 935 | } | ||
| 936 | |||
| 937 | #else /* #ifdef CONFIG_HOTPLUG_CPU */ | 928 | #else /* #ifdef CONFIG_HOTPLUG_CPU */ |
| 938 | 929 | ||
| 939 | void rcu_offline_cpu(int cpu) | 930 | void rcu_offline_cpu(int cpu) |
| 940 | { | 931 | { |
| 941 | } | 932 | } |
| 942 | 933 | ||
| 943 | void __devinit rcu_online_cpu(int cpu) | 934 | #endif /* #else #ifdef CONFIG_HOTPLUG_CPU */ |
| 935 | |||
| 936 | void __cpuinit rcu_online_cpu(int cpu) | ||
| 944 | { | 937 | { |
| 945 | } | 938 | unsigned long flags; |
| 946 | 939 | ||
| 947 | #endif /* #else #ifdef CONFIG_HOTPLUG_CPU */ | 940 | spin_lock_irqsave(&rcu_ctrlblk.fliplock, flags); |
| 941 | cpu_set(cpu, rcu_cpu_online_map); | ||
| 942 | spin_unlock_irqrestore(&rcu_ctrlblk.fliplock, flags); | ||
| 943 | } | ||
| 948 | 944 | ||
| 949 | static void rcu_process_callbacks(struct softirq_action *unused) | 945 | static void rcu_process_callbacks(struct softirq_action *unused) |
| 950 | { | 946 | { |
diff --git a/kernel/sched.c b/kernel/sched.c index 3aaa5c8cb421..4e2f60335656 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -5622,10 +5622,10 @@ static int __migrate_task(struct task_struct *p, int src_cpu, int dest_cpu) | |||
| 5622 | double_rq_lock(rq_src, rq_dest); | 5622 | double_rq_lock(rq_src, rq_dest); |
| 5623 | /* Already moved. */ | 5623 | /* Already moved. */ |
| 5624 | if (task_cpu(p) != src_cpu) | 5624 | if (task_cpu(p) != src_cpu) |
| 5625 | goto out; | 5625 | goto done; |
| 5626 | /* Affinity changed (again). */ | 5626 | /* Affinity changed (again). */ |
| 5627 | if (!cpu_isset(dest_cpu, p->cpus_allowed)) | 5627 | if (!cpu_isset(dest_cpu, p->cpus_allowed)) |
| 5628 | goto out; | 5628 | goto fail; |
| 5629 | 5629 | ||
| 5630 | on_rq = p->se.on_rq; | 5630 | on_rq = p->se.on_rq; |
| 5631 | if (on_rq) | 5631 | if (on_rq) |
| @@ -5636,8 +5636,9 @@ static int __migrate_task(struct task_struct *p, int src_cpu, int dest_cpu) | |||
| 5636 | activate_task(rq_dest, p, 0); | 5636 | activate_task(rq_dest, p, 0); |
| 5637 | check_preempt_curr(rq_dest, p); | 5637 | check_preempt_curr(rq_dest, p); |
| 5638 | } | 5638 | } |
| 5639 | done: | ||
| 5639 | ret = 1; | 5640 | ret = 1; |
| 5640 | out: | 5641 | fail: |
| 5641 | double_rq_unlock(rq_src, rq_dest); | 5642 | double_rq_unlock(rq_src, rq_dest); |
| 5642 | return ret; | 5643 | return ret; |
| 5643 | } | 5644 | } |
| @@ -5887,6 +5888,7 @@ static void migrate_dead_tasks(unsigned int dead_cpu) | |||
| 5887 | next = pick_next_task(rq, rq->curr); | 5888 | next = pick_next_task(rq, rq->curr); |
| 5888 | if (!next) | 5889 | if (!next) |
| 5889 | break; | 5890 | break; |
| 5891 | next->sched_class->put_prev_task(rq, next); | ||
| 5890 | migrate_dead(dead_cpu, next); | 5892 | migrate_dead(dead_cpu, next); |
| 5891 | 5893 | ||
| 5892 | } | 5894 | } |
| @@ -8501,6 +8503,9 @@ int sched_group_set_rt_period(struct task_group *tg, long rt_period_us) | |||
| 8501 | rt_period = (u64)rt_period_us * NSEC_PER_USEC; | 8503 | rt_period = (u64)rt_period_us * NSEC_PER_USEC; |
| 8502 | rt_runtime = tg->rt_bandwidth.rt_runtime; | 8504 | rt_runtime = tg->rt_bandwidth.rt_runtime; |
| 8503 | 8505 | ||
| 8506 | if (rt_period == 0) | ||
| 8507 | return -EINVAL; | ||
| 8508 | |||
| 8504 | return tg_set_bandwidth(tg, rt_period, rt_runtime); | 8509 | return tg_set_bandwidth(tg, rt_period, rt_runtime); |
| 8505 | } | 8510 | } |
| 8506 | 8511 | ||
diff --git a/kernel/softlockup.c b/kernel/softlockup.c index c828c2339cc9..a272d78185eb 100644 --- a/kernel/softlockup.c +++ b/kernel/softlockup.c | |||
| @@ -120,6 +120,7 @@ void softlockup_tick(void) | |||
| 120 | printk(KERN_ERR "BUG: soft lockup - CPU#%d stuck for %lus! [%s:%d]\n", | 120 | printk(KERN_ERR "BUG: soft lockup - CPU#%d stuck for %lus! [%s:%d]\n", |
| 121 | this_cpu, now - touch_timestamp, | 121 | this_cpu, now - touch_timestamp, |
| 122 | current->comm, task_pid_nr(current)); | 122 | current->comm, task_pid_nr(current)); |
| 123 | print_modules(); | ||
| 123 | if (regs) | 124 | if (regs) |
| 124 | show_regs(regs); | 125 | show_regs(regs); |
| 125 | else | 126 | else |
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 29fc39f1029c..ce7799540c91 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | * Kai Petzke <wpp@marie.physik.tu-berlin.de> | 13 | * Kai Petzke <wpp@marie.physik.tu-berlin.de> |
| 14 | * Theodore Ts'o <tytso@mit.edu> | 14 | * Theodore Ts'o <tytso@mit.edu> |
| 15 | * | 15 | * |
| 16 | * Made to use alloc_percpu by Christoph Lameter <clameter@sgi.com>. | 16 | * Made to use alloc_percpu by Christoph Lameter. |
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| 19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
| @@ -37,6 +37,7 @@ | |||
| 37 | */ | 37 | */ |
| 38 | #include <linux/list.h> | 38 | #include <linux/list.h> |
| 39 | #include <linux/module.h> | 39 | #include <linux/module.h> |
| 40 | #include <linux/kernel.h> | ||
| 40 | #include <linux/bug.h> | 41 | #include <linux/bug.h> |
| 41 | #include <linux/sched.h> | 42 | #include <linux/sched.h> |
| 42 | 43 | ||
| @@ -149,6 +150,7 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs) | |||
| 149 | (void *)bugaddr); | 150 | (void *)bugaddr); |
| 150 | 151 | ||
| 151 | show_regs(regs); | 152 | show_regs(regs); |
| 153 | add_taint(TAINT_WARN); | ||
| 152 | return BUG_TRAP_TYPE_WARN; | 154 | return BUG_TRAP_TYPE_WARN; |
| 153 | } | 155 | } |
| 154 | 156 | ||
diff --git a/lib/debugobjects.c b/lib/debugobjects.c index a76a5e122ae1..85b18d79be89 100644 --- a/lib/debugobjects.c +++ b/lib/debugobjects.c | |||
| @@ -68,6 +68,7 @@ static int fill_pool(void) | |||
| 68 | { | 68 | { |
| 69 | gfp_t gfp = GFP_ATOMIC | __GFP_NORETRY | __GFP_NOWARN; | 69 | gfp_t gfp = GFP_ATOMIC | __GFP_NORETRY | __GFP_NOWARN; |
| 70 | struct debug_obj *new; | 70 | struct debug_obj *new; |
| 71 | unsigned long flags; | ||
| 71 | 72 | ||
| 72 | if (likely(obj_pool_free >= ODEBUG_POOL_MIN_LEVEL)) | 73 | if (likely(obj_pool_free >= ODEBUG_POOL_MIN_LEVEL)) |
| 73 | return obj_pool_free; | 74 | return obj_pool_free; |
| @@ -81,10 +82,10 @@ static int fill_pool(void) | |||
| 81 | if (!new) | 82 | if (!new) |
| 82 | return obj_pool_free; | 83 | return obj_pool_free; |
| 83 | 84 | ||
| 84 | spin_lock(&pool_lock); | 85 | spin_lock_irqsave(&pool_lock, flags); |
| 85 | hlist_add_head(&new->node, &obj_pool); | 86 | hlist_add_head(&new->node, &obj_pool); |
| 86 | obj_pool_free++; | 87 | obj_pool_free++; |
| 87 | spin_unlock(&pool_lock); | 88 | spin_unlock_irqrestore(&pool_lock, flags); |
| 88 | } | 89 | } |
| 89 | return obj_pool_free; | 90 | return obj_pool_free; |
| 90 | } | 91 | } |
| @@ -110,16 +111,13 @@ static struct debug_obj *lookup_object(void *addr, struct debug_bucket *b) | |||
| 110 | } | 111 | } |
| 111 | 112 | ||
| 112 | /* | 113 | /* |
| 113 | * Allocate a new object. If the pool is empty and no refill possible, | 114 | * Allocate a new object. If the pool is empty, switch off the debugger. |
| 114 | * switch off the debugger. | ||
| 115 | */ | 115 | */ |
| 116 | static struct debug_obj * | 116 | static struct debug_obj * |
| 117 | alloc_object(void *addr, struct debug_bucket *b, struct debug_obj_descr *descr) | 117 | alloc_object(void *addr, struct debug_bucket *b, struct debug_obj_descr *descr) |
| 118 | { | 118 | { |
| 119 | struct debug_obj *obj = NULL; | 119 | struct debug_obj *obj = NULL; |
| 120 | int retry = 0; | ||
| 121 | 120 | ||
| 122 | repeat: | ||
| 123 | spin_lock(&pool_lock); | 121 | spin_lock(&pool_lock); |
| 124 | if (obj_pool.first) { | 122 | if (obj_pool.first) { |
| 125 | obj = hlist_entry(obj_pool.first, typeof(*obj), node); | 123 | obj = hlist_entry(obj_pool.first, typeof(*obj), node); |
| @@ -141,9 +139,6 @@ repeat: | |||
| 141 | } | 139 | } |
| 142 | spin_unlock(&pool_lock); | 140 | spin_unlock(&pool_lock); |
| 143 | 141 | ||
| 144 | if (fill_pool() && !obj && !retry++) | ||
| 145 | goto repeat; | ||
| 146 | |||
| 147 | return obj; | 142 | return obj; |
| 148 | } | 143 | } |
| 149 | 144 | ||
| @@ -261,6 +256,8 @@ __debug_object_init(void *addr, struct debug_obj_descr *descr, int onstack) | |||
| 261 | struct debug_obj *obj; | 256 | struct debug_obj *obj; |
| 262 | unsigned long flags; | 257 | unsigned long flags; |
| 263 | 258 | ||
| 259 | fill_pool(); | ||
| 260 | |||
| 264 | db = get_bucket((unsigned long) addr); | 261 | db = get_bucket((unsigned long) addr); |
| 265 | 262 | ||
| 266 | spin_lock_irqsave(&db->lock, flags); | 263 | spin_lock_irqsave(&db->lock, flags); |
diff --git a/lib/radix-tree.c b/lib/radix-tree.c index 169a2f8dabcc..56ec21a7f73d 100644 --- a/lib/radix-tree.c +++ b/lib/radix-tree.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2001 Momchil Velikov | 2 | * Copyright (C) 2001 Momchil Velikov |
| 3 | * Portions Copyright (C) 2001 Christoph Hellwig | 3 | * Portions Copyright (C) 2001 Christoph Hellwig |
| 4 | * Copyright (C) 2005 SGI, Christoph Lameter <clameter@sgi.com> | 4 | * Copyright (C) 2005 SGI, Christoph Lameter |
| 5 | * Copyright (C) 2006 Nick Piggin | 5 | * Copyright (C) 2006 Nick Piggin |
| 6 | * | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
diff --git a/lib/ts_bm.c b/lib/ts_bm.c index d90822c378a4..4a7fce72898e 100644 --- a/lib/ts_bm.c +++ b/lib/ts_bm.c | |||
| @@ -63,7 +63,7 @@ static unsigned int bm_find(struct ts_config *conf, struct ts_state *state) | |||
| 63 | struct ts_bm *bm = ts_config_priv(conf); | 63 | struct ts_bm *bm = ts_config_priv(conf); |
| 64 | unsigned int i, text_len, consumed = state->offset; | 64 | unsigned int i, text_len, consumed = state->offset; |
| 65 | const u8 *text; | 65 | const u8 *text; |
| 66 | int shift = bm->patlen, bs; | 66 | int shift = bm->patlen - 1, bs; |
| 67 | 67 | ||
| 68 | for (;;) { | 68 | for (;;) { |
| 69 | text_len = conf->get_next_block(consumed, &text, conf, state); | 69 | text_len = conf->get_next_block(consumed, &text, conf, state); |
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 6021757a4496..1dc2d1d18fa8 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
| @@ -22,6 +22,8 @@ | |||
| 22 | #include <linux/string.h> | 22 | #include <linux/string.h> |
| 23 | #include <linux/ctype.h> | 23 | #include <linux/ctype.h> |
| 24 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
| 25 | #include <linux/kallsyms.h> | ||
| 26 | #include <linux/uaccess.h> | ||
| 25 | 27 | ||
| 26 | #include <asm/page.h> /* for PAGE_SIZE */ | 28 | #include <asm/page.h> /* for PAGE_SIZE */ |
| 27 | #include <asm/div64.h> | 29 | #include <asm/div64.h> |
| @@ -482,6 +484,89 @@ static char *number(char *buf, char *end, unsigned long long num, int base, int | |||
| 482 | return buf; | 484 | return buf; |
| 483 | } | 485 | } |
| 484 | 486 | ||
| 487 | static char *string(char *buf, char *end, char *s, int field_width, int precision, int flags) | ||
| 488 | { | ||
| 489 | int len, i; | ||
| 490 | |||
| 491 | if ((unsigned long)s < PAGE_SIZE) | ||
| 492 | s = "<NULL>"; | ||
| 493 | |||
| 494 | len = strnlen(s, precision); | ||
| 495 | |||
| 496 | if (!(flags & LEFT)) { | ||
| 497 | while (len < field_width--) { | ||
| 498 | if (buf < end) | ||
| 499 | *buf = ' '; | ||
| 500 | ++buf; | ||
| 501 | } | ||
| 502 | } | ||
| 503 | for (i = 0; i < len; ++i) { | ||
| 504 | if (buf < end) | ||
| 505 | *buf = *s; | ||
| 506 | ++buf; ++s; | ||
| 507 | } | ||
| 508 | while (len < field_width--) { | ||
| 509 | if (buf < end) | ||
| 510 | *buf = ' '; | ||
| 511 | ++buf; | ||
| 512 | } | ||
| 513 | return buf; | ||
| 514 | } | ||
| 515 | |||
| 516 | static inline void *dereference_function_descriptor(void *ptr) | ||
| 517 | { | ||
| 518 | #if defined(CONFIG_IA64) || defined(CONFIG_PPC64) | ||
| 519 | void *p; | ||
| 520 | if (!probe_kernel_address(ptr, p)) | ||
| 521 | ptr = p; | ||
| 522 | #endif | ||
| 523 | return ptr; | ||
| 524 | } | ||
| 525 | |||
| 526 | static char *symbol_string(char *buf, char *end, void *ptr, int field_width, int precision, int flags) | ||
| 527 | { | ||
| 528 | unsigned long value = (unsigned long) ptr; | ||
| 529 | #ifdef CONFIG_KALLSYMS | ||
| 530 | char sym[KSYM_SYMBOL_LEN]; | ||
| 531 | sprint_symbol(sym, value); | ||
| 532 | return string(buf, end, sym, field_width, precision, flags); | ||
| 533 | #else | ||
| 534 | field_width = 2*sizeof(void *); | ||
| 535 | flags |= SPECIAL | SMALL | ZEROPAD; | ||
| 536 | return number(buf, end, value, 16, field_width, precision, flags); | ||
| 537 | #endif | ||
| 538 | } | ||
| 539 | |||
| 540 | /* | ||
| 541 | * Show a '%p' thing. A kernel extension is that the '%p' is followed | ||
| 542 | * by an extra set of alphanumeric characters that are extended format | ||
| 543 | * specifiers. | ||
| 544 | * | ||
| 545 | * Right now we just handle 'F' (for symbolic Function descriptor pointers) | ||
| 546 | * and 'S' (for Symbolic direct pointers), but this can easily be | ||
| 547 | * extended in the future (network address types etc). | ||
| 548 | * | ||
| 549 | * The difference between 'S' and 'F' is that on ia64 and ppc64 function | ||
| 550 | * pointers are really function descriptors, which contain a pointer the | ||
| 551 | * real address. | ||
| 552 | */ | ||
| 553 | static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field_width, int precision, int flags) | ||
| 554 | { | ||
| 555 | switch (*fmt) { | ||
| 556 | case 'F': | ||
| 557 | ptr = dereference_function_descriptor(ptr); | ||
| 558 | /* Fallthrough */ | ||
| 559 | case 'S': | ||
| 560 | return symbol_string(buf, end, ptr, field_width, precision, flags); | ||
| 561 | } | ||
| 562 | flags |= SMALL; | ||
| 563 | if (field_width == -1) { | ||
| 564 | field_width = 2*sizeof(void *); | ||
| 565 | flags |= ZEROPAD; | ||
| 566 | } | ||
| 567 | return number(buf, end, (unsigned long) ptr, 16, field_width, precision, flags); | ||
| 568 | } | ||
| 569 | |||
| 485 | /** | 570 | /** |
| 486 | * vsnprintf - Format a string and place it in a buffer | 571 | * vsnprintf - Format a string and place it in a buffer |
| 487 | * @buf: The buffer to place the result into | 572 | * @buf: The buffer to place the result into |
| @@ -502,11 +587,9 @@ static char *number(char *buf, char *end, unsigned long long num, int base, int | |||
| 502 | */ | 587 | */ |
| 503 | int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) | 588 | int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) |
| 504 | { | 589 | { |
| 505 | int len; | ||
| 506 | unsigned long long num; | 590 | unsigned long long num; |
| 507 | int i, base; | 591 | int base; |
| 508 | char *str, *end, c; | 592 | char *str, *end, c; |
| 509 | const char *s; | ||
| 510 | 593 | ||
| 511 | int flags; /* flags to number() */ | 594 | int flags; /* flags to number() */ |
| 512 | 595 | ||
| @@ -622,43 +705,18 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) | |||
| 622 | continue; | 705 | continue; |
| 623 | 706 | ||
| 624 | case 's': | 707 | case 's': |
| 625 | s = va_arg(args, char *); | 708 | str = string(str, end, va_arg(args, char *), field_width, precision, flags); |
| 626 | if ((unsigned long)s < PAGE_SIZE) | ||
| 627 | s = "<NULL>"; | ||
| 628 | |||
| 629 | len = strnlen(s, precision); | ||
| 630 | |||
| 631 | if (!(flags & LEFT)) { | ||
| 632 | while (len < field_width--) { | ||
| 633 | if (str < end) | ||
| 634 | *str = ' '; | ||
| 635 | ++str; | ||
| 636 | } | ||
| 637 | } | ||
| 638 | for (i = 0; i < len; ++i) { | ||
| 639 | if (str < end) | ||
| 640 | *str = *s; | ||
| 641 | ++str; ++s; | ||
| 642 | } | ||
| 643 | while (len < field_width--) { | ||
| 644 | if (str < end) | ||
| 645 | *str = ' '; | ||
| 646 | ++str; | ||
| 647 | } | ||
| 648 | continue; | 709 | continue; |
| 649 | 710 | ||
| 650 | case 'p': | 711 | case 'p': |
| 651 | flags |= SMALL; | 712 | str = pointer(fmt+1, str, end, |
| 652 | if (field_width == -1) { | 713 | va_arg(args, void *), |
| 653 | field_width = 2*sizeof(void *); | 714 | field_width, precision, flags); |
| 654 | flags |= ZEROPAD; | 715 | /* Skip all alphanumeric pointer suffixes */ |
| 655 | } | 716 | while (isalnum(fmt[1])) |
| 656 | str = number(str, end, | 717 | fmt++; |
| 657 | (unsigned long) va_arg(args, void *), | ||
| 658 | 16, field_width, precision, flags); | ||
| 659 | continue; | 718 | continue; |
| 660 | 719 | ||
| 661 | |||
| 662 | case 'n': | 720 | case 'n': |
| 663 | /* FIXME: | 721 | /* FIXME: |
| 664 | * What does C99 say about the overflow case here? */ | 722 | * What does C99 say about the overflow case here? */ |
diff --git a/mm/allocpercpu.c b/mm/allocpercpu.c index f4026bae6eed..05f2b4009ccc 100644 --- a/mm/allocpercpu.c +++ b/mm/allocpercpu.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/mm/allocpercpu.c | 2 | * linux/mm/allocpercpu.c |
| 3 | * | 3 | * |
| 4 | * Separated from slab.c August 11, 2006 Christoph Lameter <clameter@sgi.com> | 4 | * Separated from slab.c August 11, 2006 Christoph Lameter |
| 5 | */ | 5 | */ |
| 6 | #include <linux/mm.h> | 6 | #include <linux/mm.h> |
| 7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
diff --git a/mm/memory.c b/mm/memory.c index d14b251a25a6..2302d228fe04 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -1151,7 +1151,7 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, | |||
| 1151 | * be processed until returning to user space. | 1151 | * be processed until returning to user space. |
| 1152 | */ | 1152 | */ |
| 1153 | if (unlikely(test_tsk_thread_flag(tsk, TIF_MEMDIE))) | 1153 | if (unlikely(test_tsk_thread_flag(tsk, TIF_MEMDIE))) |
| 1154 | return -ENOMEM; | 1154 | return i ? i : -ENOMEM; |
| 1155 | 1155 | ||
| 1156 | if (write) | 1156 | if (write) |
| 1157 | foll_flags |= FOLL_WRITE; | 1157 | foll_flags |= FOLL_WRITE; |
| @@ -1697,8 +1697,19 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 1697 | struct page *dirty_page = NULL; | 1697 | struct page *dirty_page = NULL; |
| 1698 | 1698 | ||
| 1699 | old_page = vm_normal_page(vma, address, orig_pte); | 1699 | old_page = vm_normal_page(vma, address, orig_pte); |
| 1700 | if (!old_page) | 1700 | if (!old_page) { |
| 1701 | /* | ||
| 1702 | * VM_MIXEDMAP !pfn_valid() case | ||
| 1703 | * | ||
| 1704 | * We should not cow pages in a shared writeable mapping. | ||
| 1705 | * Just mark the pages writable as we can't do any dirty | ||
| 1706 | * accounting on raw pfn maps. | ||
| 1707 | */ | ||
| 1708 | if ((vma->vm_flags & (VM_WRITE|VM_SHARED)) == | ||
| 1709 | (VM_WRITE|VM_SHARED)) | ||
| 1710 | goto reuse; | ||
| 1701 | goto gotten; | 1711 | goto gotten; |
| 1712 | } | ||
| 1702 | 1713 | ||
| 1703 | /* | 1714 | /* |
| 1704 | * Take out anonymous pages first, anonymous shared vmas are | 1715 | * Take out anonymous pages first, anonymous shared vmas are |
| @@ -1751,6 +1762,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 1751 | } | 1762 | } |
| 1752 | 1763 | ||
| 1753 | if (reuse) { | 1764 | if (reuse) { |
| 1765 | reuse: | ||
| 1754 | flush_cache_page(vma, address, pte_pfn(orig_pte)); | 1766 | flush_cache_page(vma, address, pte_pfn(orig_pte)); |
| 1755 | entry = pte_mkyoung(orig_pte); | 1767 | entry = pte_mkyoung(orig_pte); |
| 1756 | entry = maybe_mkwrite(pte_mkdirty(entry), vma); | 1768 | entry = maybe_mkwrite(pte_mkdirty(entry), vma); |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index a37a5034f63d..c94e58b192c3 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
| @@ -729,7 +729,11 @@ static long do_get_mempolicy(int *policy, nodemask_t *nmask, | |||
| 729 | } else { | 729 | } else { |
| 730 | *policy = pol == &default_policy ? MPOL_DEFAULT : | 730 | *policy = pol == &default_policy ? MPOL_DEFAULT : |
| 731 | pol->mode; | 731 | pol->mode; |
| 732 | *policy |= pol->flags; | 732 | /* |
| 733 | * Internal mempolicy flags must be masked off before exposing | ||
| 734 | * the policy to userspace. | ||
| 735 | */ | ||
| 736 | *policy |= (pol->flags & MPOL_MODE_FLAGS); | ||
| 733 | } | 737 | } |
| 734 | 738 | ||
| 735 | if (vma) { | 739 | if (vma) { |
diff --git a/mm/migrate.c b/mm/migrate.c index 112bcaeaa104..55bd355d170d 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | * IWAMOTO Toshihiro <iwamoto@valinux.co.jp> | 9 | * IWAMOTO Toshihiro <iwamoto@valinux.co.jp> |
| 10 | * Hirokazu Takahashi <taka@valinux.co.jp> | 10 | * Hirokazu Takahashi <taka@valinux.co.jp> |
| 11 | * Dave Hansen <haveblue@us.ibm.com> | 11 | * Dave Hansen <haveblue@us.ibm.com> |
| 12 | * Christoph Lameter <clameter@sgi.com> | 12 | * Christoph Lameter |
| 13 | */ | 13 | */ |
| 14 | 14 | ||
| 15 | #include <linux/migrate.h> | 15 | #include <linux/migrate.h> |
| @@ -72,8 +72,9 @@ pgprot_t protection_map[16] = { | |||
| 72 | 72 | ||
| 73 | pgprot_t vm_get_page_prot(unsigned long vm_flags) | 73 | pgprot_t vm_get_page_prot(unsigned long vm_flags) |
| 74 | { | 74 | { |
| 75 | return protection_map[vm_flags & | 75 | return __pgprot(pgprot_val(protection_map[vm_flags & |
| 76 | (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]; | 76 | (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]) | |
| 77 | pgprot_val(arch_vm_get_page_prot(vm_flags))); | ||
| 77 | } | 78 | } |
| 78 | EXPORT_SYMBOL(vm_get_page_prot); | 79 | EXPORT_SYMBOL(vm_get_page_prot); |
| 79 | 80 | ||
diff --git a/mm/mprotect.c b/mm/mprotect.c index a5bf31c27375..ecfaa5844b5f 100644 --- a/mm/mprotect.c +++ b/mm/mprotect.c | |||
| @@ -239,7 +239,7 @@ sys_mprotect(unsigned long start, size_t len, unsigned long prot) | |||
| 239 | end = start + len; | 239 | end = start + len; |
| 240 | if (end <= start) | 240 | if (end <= start) |
| 241 | return -ENOMEM; | 241 | return -ENOMEM; |
| 242 | if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM)) | 242 | if (!arch_validate_prot(prot)) |
| 243 | return -EINVAL; | 243 | return -EINVAL; |
| 244 | 244 | ||
| 245 | reqprot = prot; | 245 | reqprot = prot; |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 2f552955a02f..f32fae3121f0 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -2328,7 +2328,6 @@ static void build_zonelists(pg_data_t *pgdat) | |||
| 2328 | static void build_zonelist_cache(pg_data_t *pgdat) | 2328 | static void build_zonelist_cache(pg_data_t *pgdat) |
| 2329 | { | 2329 | { |
| 2330 | pgdat->node_zonelists[0].zlcache_ptr = NULL; | 2330 | pgdat->node_zonelists[0].zlcache_ptr = NULL; |
| 2331 | pgdat->node_zonelists[1].zlcache_ptr = NULL; | ||
| 2332 | } | 2331 | } |
| 2333 | 2332 | ||
| 2334 | #endif /* CONFIG_NUMA */ | 2333 | #endif /* CONFIG_NUMA */ |
| @@ -5,7 +5,7 @@ | |||
| 5 | * The allocator synchronizes using per slab locks and only | 5 | * The allocator synchronizes using per slab locks and only |
| 6 | * uses a centralized lock to manage a pool of partial slabs. | 6 | * uses a centralized lock to manage a pool of partial slabs. |
| 7 | * | 7 | * |
| 8 | * (C) 2007 SGI, Christoph Lameter <clameter@sgi.com> | 8 | * (C) 2007 SGI, Christoph Lameter |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
| @@ -1628,9 +1628,11 @@ static __always_inline void *slab_alloc(struct kmem_cache *s, | |||
| 1628 | void **object; | 1628 | void **object; |
| 1629 | struct kmem_cache_cpu *c; | 1629 | struct kmem_cache_cpu *c; |
| 1630 | unsigned long flags; | 1630 | unsigned long flags; |
| 1631 | unsigned int objsize; | ||
| 1631 | 1632 | ||
| 1632 | local_irq_save(flags); | 1633 | local_irq_save(flags); |
| 1633 | c = get_cpu_slab(s, smp_processor_id()); | 1634 | c = get_cpu_slab(s, smp_processor_id()); |
| 1635 | objsize = c->objsize; | ||
| 1634 | if (unlikely(!c->freelist || !node_match(c, node))) | 1636 | if (unlikely(!c->freelist || !node_match(c, node))) |
| 1635 | 1637 | ||
| 1636 | object = __slab_alloc(s, gfpflags, node, addr, c); | 1638 | object = __slab_alloc(s, gfpflags, node, addr, c); |
| @@ -1643,7 +1645,7 @@ static __always_inline void *slab_alloc(struct kmem_cache *s, | |||
| 1643 | local_irq_restore(flags); | 1645 | local_irq_restore(flags); |
| 1644 | 1646 | ||
| 1645 | if (unlikely((gfpflags & __GFP_ZERO) && object)) | 1647 | if (unlikely((gfpflags & __GFP_ZERO) && object)) |
| 1646 | memset(object, 0, c->objsize); | 1648 | memset(object, 0, objsize); |
| 1647 | 1649 | ||
| 1648 | return object; | 1650 | return object; |
| 1649 | } | 1651 | } |
| @@ -2995,8 +2997,6 @@ void __init kmem_cache_init(void) | |||
| 2995 | create_kmalloc_cache(&kmalloc_caches[1], | 2997 | create_kmalloc_cache(&kmalloc_caches[1], |
| 2996 | "kmalloc-96", 96, GFP_KERNEL); | 2998 | "kmalloc-96", 96, GFP_KERNEL); |
| 2997 | caches++; | 2999 | caches++; |
| 2998 | } | ||
| 2999 | if (KMALLOC_MIN_SIZE <= 128) { | ||
| 3000 | create_kmalloc_cache(&kmalloc_caches[2], | 3000 | create_kmalloc_cache(&kmalloc_caches[2], |
| 3001 | "kmalloc-192", 192, GFP_KERNEL); | 3001 | "kmalloc-192", 192, GFP_KERNEL); |
| 3002 | caches++; | 3002 | caches++; |
| @@ -3026,6 +3026,16 @@ void __init kmem_cache_init(void) | |||
| 3026 | for (i = 8; i < KMALLOC_MIN_SIZE; i += 8) | 3026 | for (i = 8; i < KMALLOC_MIN_SIZE; i += 8) |
| 3027 | size_index[(i - 1) / 8] = KMALLOC_SHIFT_LOW; | 3027 | size_index[(i - 1) / 8] = KMALLOC_SHIFT_LOW; |
| 3028 | 3028 | ||
| 3029 | if (KMALLOC_MIN_SIZE == 128) { | ||
| 3030 | /* | ||
| 3031 | * The 192 byte sized cache is not used if the alignment | ||
| 3032 | * is 128 byte. Redirect kmalloc to use the 256 byte cache | ||
| 3033 | * instead. | ||
| 3034 | */ | ||
| 3035 | for (i = 128 + 8; i <= 192; i += 8) | ||
| 3036 | size_index[(i - 1) / 8] = 8; | ||
| 3037 | } | ||
| 3038 | |||
| 3029 | slab_state = UP; | 3039 | slab_state = UP; |
| 3030 | 3040 | ||
| 3031 | /* Provide the correct kmalloc names now that the caches are up */ | 3041 | /* Provide the correct kmalloc names now that the caches are up */ |
diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index 99c4f36eb8a3..a91b5f8fcaf6 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Virtual Memory Map support | 2 | * Virtual Memory Map support |
| 3 | * | 3 | * |
| 4 | * (C) 2007 sgi. Christoph Lameter <clameter@sgi.com>. | 4 | * (C) 2007 sgi. Christoph Lameter. |
| 5 | * | 5 | * |
| 6 | * Virtual memory maps allow VM primitives pfn_to_page, page_to_pfn, | 6 | * Virtual memory maps allow VM primitives pfn_to_page, page_to_pfn, |
| 7 | * virt_to_page, page_address() to be implemented as a base offset | 7 | * virt_to_page, page_address() to be implemented as a base offset |
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index c2397f503b0f..f38cc5317b88 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c | |||
| @@ -442,12 +442,16 @@ int br_del_if(struct net_bridge *br, struct net_device *dev) | |||
| 442 | 442 | ||
| 443 | void __exit br_cleanup_bridges(void) | 443 | void __exit br_cleanup_bridges(void) |
| 444 | { | 444 | { |
| 445 | struct net_device *dev, *nxt; | 445 | struct net_device *dev; |
| 446 | 446 | ||
| 447 | rtnl_lock(); | 447 | rtnl_lock(); |
| 448 | for_each_netdev_safe(&init_net, dev, nxt) | 448 | restart: |
| 449 | if (dev->priv_flags & IFF_EBRIDGE) | 449 | for_each_netdev(&init_net, dev) { |
| 450 | if (dev->priv_flags & IFF_EBRIDGE) { | ||
| 450 | del_br(dev->priv); | 451 | del_br(dev->priv); |
| 452 | goto restart; | ||
| 453 | } | ||
| 454 | } | ||
| 451 | rtnl_unlock(); | 455 | rtnl_unlock(); |
| 452 | 456 | ||
| 453 | } | 457 | } |
diff --git a/net/can/af_can.c b/net/can/af_can.c index 7e8ca2836452..484bbf6dd032 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c | |||
| @@ -205,12 +205,19 @@ static int can_create(struct net *net, struct socket *sock, int protocol) | |||
| 205 | * -ENOBUFS on full driver queue (see net_xmit_errno()) | 205 | * -ENOBUFS on full driver queue (see net_xmit_errno()) |
| 206 | * -ENOMEM when local loopback failed at calling skb_clone() | 206 | * -ENOMEM when local loopback failed at calling skb_clone() |
| 207 | * -EPERM when trying to send on a non-CAN interface | 207 | * -EPERM when trying to send on a non-CAN interface |
| 208 | * -EINVAL when the skb->data does not contain a valid CAN frame | ||
| 208 | */ | 209 | */ |
| 209 | int can_send(struct sk_buff *skb, int loop) | 210 | int can_send(struct sk_buff *skb, int loop) |
| 210 | { | 211 | { |
| 211 | struct sk_buff *newskb = NULL; | 212 | struct sk_buff *newskb = NULL; |
| 213 | struct can_frame *cf = (struct can_frame *)skb->data; | ||
| 212 | int err; | 214 | int err; |
| 213 | 215 | ||
| 216 | if (skb->len != sizeof(struct can_frame) || cf->can_dlc > 8) { | ||
| 217 | kfree_skb(skb); | ||
| 218 | return -EINVAL; | ||
| 219 | } | ||
| 220 | |||
| 214 | if (skb->dev->type != ARPHRD_CAN) { | 221 | if (skb->dev->type != ARPHRD_CAN) { |
| 215 | kfree_skb(skb); | 222 | kfree_skb(skb); |
| 216 | return -EPERM; | 223 | return -EPERM; |
| @@ -605,6 +612,7 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev, | |||
| 605 | struct packet_type *pt, struct net_device *orig_dev) | 612 | struct packet_type *pt, struct net_device *orig_dev) |
| 606 | { | 613 | { |
| 607 | struct dev_rcv_lists *d; | 614 | struct dev_rcv_lists *d; |
| 615 | struct can_frame *cf = (struct can_frame *)skb->data; | ||
| 608 | int matches; | 616 | int matches; |
| 609 | 617 | ||
| 610 | if (dev->type != ARPHRD_CAN || dev_net(dev) != &init_net) { | 618 | if (dev->type != ARPHRD_CAN || dev_net(dev) != &init_net) { |
| @@ -612,6 +620,8 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev, | |||
| 612 | return 0; | 620 | return 0; |
| 613 | } | 621 | } |
| 614 | 622 | ||
| 623 | BUG_ON(skb->len != sizeof(struct can_frame) || cf->can_dlc > 8); | ||
| 624 | |||
| 615 | /* update statistics */ | 625 | /* update statistics */ |
| 616 | can_stats.rx_frames++; | 626 | can_stats.rx_frames++; |
| 617 | can_stats.rx_frames_delta++; | 627 | can_stats.rx_frames_delta++; |
diff --git a/net/can/bcm.c b/net/can/bcm.c index d9a3a9d13bed..72c2ce904f83 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c | |||
| @@ -298,7 +298,7 @@ static void bcm_send_to_user(struct bcm_op *op, struct bcm_msg_head *head, | |||
| 298 | 298 | ||
| 299 | if (head->nframes) { | 299 | if (head->nframes) { |
| 300 | /* can_frames starting here */ | 300 | /* can_frames starting here */ |
| 301 | firstframe = (struct can_frame *) skb_tail_pointer(skb); | 301 | firstframe = (struct can_frame *)skb_tail_pointer(skb); |
| 302 | 302 | ||
| 303 | memcpy(skb_put(skb, datalen), frames, datalen); | 303 | memcpy(skb_put(skb, datalen), frames, datalen); |
| 304 | 304 | ||
| @@ -826,6 +826,10 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, | |||
| 826 | for (i = 0; i < msg_head->nframes; i++) { | 826 | for (i = 0; i < msg_head->nframes; i++) { |
| 827 | err = memcpy_fromiovec((u8 *)&op->frames[i], | 827 | err = memcpy_fromiovec((u8 *)&op->frames[i], |
| 828 | msg->msg_iov, CFSIZ); | 828 | msg->msg_iov, CFSIZ); |
| 829 | |||
| 830 | if (op->frames[i].can_dlc > 8) | ||
| 831 | err = -EINVAL; | ||
| 832 | |||
| 829 | if (err < 0) | 833 | if (err < 0) |
| 830 | return err; | 834 | return err; |
| 831 | 835 | ||
| @@ -858,6 +862,10 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, | |||
| 858 | for (i = 0; i < msg_head->nframes; i++) { | 862 | for (i = 0; i < msg_head->nframes; i++) { |
| 859 | err = memcpy_fromiovec((u8 *)&op->frames[i], | 863 | err = memcpy_fromiovec((u8 *)&op->frames[i], |
| 860 | msg->msg_iov, CFSIZ); | 864 | msg->msg_iov, CFSIZ); |
| 865 | |||
| 866 | if (op->frames[i].can_dlc > 8) | ||
| 867 | err = -EINVAL; | ||
| 868 | |||
| 861 | if (err < 0) { | 869 | if (err < 0) { |
| 862 | if (op->frames != &op->sframe) | 870 | if (op->frames != &op->sframe) |
| 863 | kfree(op->frames); | 871 | kfree(op->frames); |
| @@ -1164,9 +1172,12 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk) | |||
| 1164 | 1172 | ||
| 1165 | skb->dev = dev; | 1173 | skb->dev = dev; |
| 1166 | skb->sk = sk; | 1174 | skb->sk = sk; |
| 1167 | can_send(skb, 1); /* send with loopback */ | 1175 | err = can_send(skb, 1); /* send with loopback */ |
| 1168 | dev_put(dev); | 1176 | dev_put(dev); |
| 1169 | 1177 | ||
| 1178 | if (err) | ||
| 1179 | return err; | ||
| 1180 | |||
| 1170 | return CFSIZ + MHSIZ; | 1181 | return CFSIZ + MHSIZ; |
| 1171 | } | 1182 | } |
| 1172 | 1183 | ||
| @@ -1185,6 +1196,10 @@ static int bcm_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1185 | if (!bo->bound) | 1196 | if (!bo->bound) |
| 1186 | return -ENOTCONN; | 1197 | return -ENOTCONN; |
| 1187 | 1198 | ||
| 1199 | /* check for valid message length from userspace */ | ||
| 1200 | if (size < MHSIZ || (size - MHSIZ) % CFSIZ) | ||
| 1201 | return -EINVAL; | ||
| 1202 | |||
| 1188 | /* check for alternative ifindex for this bcm_op */ | 1203 | /* check for alternative ifindex for this bcm_op */ |
| 1189 | 1204 | ||
| 1190 | if (!ifindex && msg->msg_name) { | 1205 | if (!ifindex && msg->msg_name) { |
| @@ -1259,8 +1274,8 @@ static int bcm_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1259 | break; | 1274 | break; |
| 1260 | 1275 | ||
| 1261 | case TX_SEND: | 1276 | case TX_SEND: |
| 1262 | /* we need at least one can_frame */ | 1277 | /* we need exactly one can_frame behind the msg head */ |
| 1263 | if (msg_head.nframes < 1) | 1278 | if ((msg_head.nframes != 1) || (size != CFSIZ + MHSIZ)) |
| 1264 | ret = -EINVAL; | 1279 | ret = -EINVAL; |
| 1265 | else | 1280 | else |
| 1266 | ret = bcm_tx_send(msg, ifindex, sk); | 1281 | ret = bcm_tx_send(msg, ifindex, sk); |
diff --git a/net/can/raw.c b/net/can/raw.c index 69877b8e7e9c..3e46ee36a1aa 100644 --- a/net/can/raw.c +++ b/net/can/raw.c | |||
| @@ -632,6 +632,9 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 632 | } else | 632 | } else |
| 633 | ifindex = ro->ifindex; | 633 | ifindex = ro->ifindex; |
| 634 | 634 | ||
| 635 | if (size != sizeof(struct can_frame)) | ||
| 636 | return -EINVAL; | ||
| 637 | |||
| 635 | dev = dev_get_by_index(&init_net, ifindex); | 638 | dev = dev_get_by_index(&init_net, ifindex); |
| 636 | if (!dev) | 639 | if (!dev) |
| 637 | return -ENXIO; | 640 | return -ENXIO; |
diff --git a/net/core/dev.c b/net/core/dev.c index c421a1f8f0b9..fca23a3bf12c 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -454,7 +454,7 @@ static int netdev_boot_setup_add(char *name, struct ifmap *map) | |||
| 454 | for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) { | 454 | for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) { |
| 455 | if (s[i].name[0] == '\0' || s[i].name[0] == ' ') { | 455 | if (s[i].name[0] == '\0' || s[i].name[0] == ' ') { |
| 456 | memset(s[i].name, 0, sizeof(s[i].name)); | 456 | memset(s[i].name, 0, sizeof(s[i].name)); |
| 457 | strcpy(s[i].name, name); | 457 | strlcpy(s[i].name, name, IFNAMSIZ); |
| 458 | memcpy(&s[i].map, map, sizeof(s[i].map)); | 458 | memcpy(&s[i].map, map, sizeof(s[i].map)); |
| 459 | break; | 459 | break; |
| 460 | } | 460 | } |
| @@ -479,7 +479,7 @@ int netdev_boot_setup_check(struct net_device *dev) | |||
| 479 | 479 | ||
| 480 | for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) { | 480 | for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) { |
| 481 | if (s[i].name[0] != '\0' && s[i].name[0] != ' ' && | 481 | if (s[i].name[0] != '\0' && s[i].name[0] != ' ' && |
| 482 | !strncmp(dev->name, s[i].name, strlen(s[i].name))) { | 482 | !strcmp(dev->name, s[i].name)) { |
| 483 | dev->irq = s[i].map.irq; | 483 | dev->irq = s[i].map.irq; |
| 484 | dev->base_addr = s[i].map.base_addr; | 484 | dev->base_addr = s[i].map.base_addr; |
| 485 | dev->mem_start = s[i].map.mem_start; | 485 | dev->mem_start = s[i].map.mem_start; |
| @@ -2973,7 +2973,7 @@ EXPORT_SYMBOL(dev_unicast_delete); | |||
| 2973 | /** | 2973 | /** |
| 2974 | * dev_unicast_add - add a secondary unicast address | 2974 | * dev_unicast_add - add a secondary unicast address |
| 2975 | * @dev: device | 2975 | * @dev: device |
| 2976 | * @addr: address to delete | 2976 | * @addr: address to add |
| 2977 | * @alen: length of @addr | 2977 | * @alen: length of @addr |
| 2978 | * | 2978 | * |
| 2979 | * Add a secondary unicast address to the device or increase | 2979 | * Add a secondary unicast address to the device or increase |
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c index e3e9ab0f74e3..277a2302eb3a 100644 --- a/net/core/fib_rules.c +++ b/net/core/fib_rules.c | |||
| @@ -226,7 +226,7 @@ static int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) | |||
| 226 | 226 | ||
| 227 | ops = lookup_rules_ops(net, frh->family); | 227 | ops = lookup_rules_ops(net, frh->family); |
| 228 | if (ops == NULL) { | 228 | if (ops == NULL) { |
| 229 | err = EAFNOSUPPORT; | 229 | err = -EAFNOSUPPORT; |
| 230 | goto errout; | 230 | goto errout; |
| 231 | } | 231 | } |
| 232 | 232 | ||
| @@ -365,7 +365,7 @@ static int fib_nl_delrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) | |||
| 365 | 365 | ||
| 366 | ops = lookup_rules_ops(net, frh->family); | 366 | ops = lookup_rules_ops(net, frh->family); |
| 367 | if (ops == NULL) { | 367 | if (ops == NULL) { |
| 368 | err = EAFNOSUPPORT; | 368 | err = -EAFNOSUPPORT; |
| 369 | goto errout; | 369 | goto errout; |
| 370 | } | 370 | } |
| 371 | 371 | ||
diff --git a/net/core/filter.c b/net/core/filter.c index 4f8369729a4e..df3744355839 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
| @@ -68,7 +68,6 @@ static inline void *load_pointer(struct sk_buff *skb, int k, | |||
| 68 | * sk_filter - run a packet through a socket filter | 68 | * sk_filter - run a packet through a socket filter |
| 69 | * @sk: sock associated with &sk_buff | 69 | * @sk: sock associated with &sk_buff |
| 70 | * @skb: buffer to filter | 70 | * @skb: buffer to filter |
| 71 | * @needlock: set to 1 if the sock is not locked by caller. | ||
| 72 | * | 71 | * |
| 73 | * Run the filter code and then cut skb->data to correct size returned by | 72 | * Run the filter code and then cut skb->data to correct size returned by |
| 74 | * sk_run_filter. If pkt_len is 0 we toss packet. If skb->len is smaller | 73 | * sk_run_filter. If pkt_len is 0 we toss packet. If skb->len is smaller |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 1e556d312117..366621610e76 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -1292,12 +1292,14 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset, | |||
| 1292 | { | 1292 | { |
| 1293 | unsigned int nr_pages = spd->nr_pages; | 1293 | unsigned int nr_pages = spd->nr_pages; |
| 1294 | unsigned int poff, plen, len, toff, tlen; | 1294 | unsigned int poff, plen, len, toff, tlen; |
| 1295 | int headlen, seg; | 1295 | int headlen, seg, error = 0; |
| 1296 | 1296 | ||
| 1297 | toff = *offset; | 1297 | toff = *offset; |
| 1298 | tlen = *total_len; | 1298 | tlen = *total_len; |
| 1299 | if (!tlen) | 1299 | if (!tlen) { |
| 1300 | error = 1; | ||
| 1300 | goto err; | 1301 | goto err; |
| 1302 | } | ||
| 1301 | 1303 | ||
| 1302 | /* | 1304 | /* |
| 1303 | * if the offset is greater than the linear part, go directly to | 1305 | * if the offset is greater than the linear part, go directly to |
| @@ -1339,7 +1341,8 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset, | |||
| 1339 | * just jump directly to update and return, no point | 1341 | * just jump directly to update and return, no point |
| 1340 | * in going over fragments when the output is full. | 1342 | * in going over fragments when the output is full. |
| 1341 | */ | 1343 | */ |
| 1342 | if (spd_fill_page(spd, virt_to_page(p), plen, poff, skb)) | 1344 | error = spd_fill_page(spd, virt_to_page(p), plen, poff, skb); |
| 1345 | if (error) | ||
| 1343 | goto done; | 1346 | goto done; |
| 1344 | 1347 | ||
| 1345 | tlen -= plen; | 1348 | tlen -= plen; |
| @@ -1369,7 +1372,8 @@ map_frag: | |||
| 1369 | if (!plen) | 1372 | if (!plen) |
| 1370 | break; | 1373 | break; |
| 1371 | 1374 | ||
| 1372 | if (spd_fill_page(spd, f->page, plen, poff, skb)) | 1375 | error = spd_fill_page(spd, f->page, plen, poff, skb); |
| 1376 | if (error) | ||
| 1373 | break; | 1377 | break; |
| 1374 | 1378 | ||
| 1375 | tlen -= plen; | 1379 | tlen -= plen; |
| @@ -1382,7 +1386,10 @@ done: | |||
| 1382 | return 0; | 1386 | return 0; |
| 1383 | } | 1387 | } |
| 1384 | err: | 1388 | err: |
| 1385 | return 1; | 1389 | /* update the offset to reflect the linear part skip, if any */ |
| 1390 | if (!error) | ||
| 1391 | *offset = toff; | ||
| 1392 | return error; | ||
| 1386 | } | 1393 | } |
| 1387 | 1394 | ||
| 1388 | /* | 1395 | /* |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 4b02d14e7ab9..e1600ad8fb0e 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
| @@ -1359,17 +1359,17 @@ static int check_leaf(struct trie *t, struct leaf *l, | |||
| 1359 | t->stats.semantic_match_miss++; | 1359 | t->stats.semantic_match_miss++; |
| 1360 | #endif | 1360 | #endif |
| 1361 | if (err <= 0) | 1361 | if (err <= 0) |
| 1362 | return plen; | 1362 | return err; |
| 1363 | } | 1363 | } |
| 1364 | 1364 | ||
| 1365 | return -1; | 1365 | return 1; |
| 1366 | } | 1366 | } |
| 1367 | 1367 | ||
| 1368 | static int fn_trie_lookup(struct fib_table *tb, const struct flowi *flp, | 1368 | static int fn_trie_lookup(struct fib_table *tb, const struct flowi *flp, |
| 1369 | struct fib_result *res) | 1369 | struct fib_result *res) |
| 1370 | { | 1370 | { |
| 1371 | struct trie *t = (struct trie *) tb->tb_data; | 1371 | struct trie *t = (struct trie *) tb->tb_data; |
| 1372 | int plen, ret = 0; | 1372 | int ret; |
| 1373 | struct node *n; | 1373 | struct node *n; |
| 1374 | struct tnode *pn; | 1374 | struct tnode *pn; |
| 1375 | int pos, bits; | 1375 | int pos, bits; |
| @@ -1393,10 +1393,7 @@ static int fn_trie_lookup(struct fib_table *tb, const struct flowi *flp, | |||
| 1393 | 1393 | ||
| 1394 | /* Just a leaf? */ | 1394 | /* Just a leaf? */ |
| 1395 | if (IS_LEAF(n)) { | 1395 | if (IS_LEAF(n)) { |
| 1396 | plen = check_leaf(t, (struct leaf *)n, key, flp, res); | 1396 | ret = check_leaf(t, (struct leaf *)n, key, flp, res); |
| 1397 | if (plen < 0) | ||
| 1398 | goto failed; | ||
| 1399 | ret = 0; | ||
| 1400 | goto found; | 1397 | goto found; |
| 1401 | } | 1398 | } |
| 1402 | 1399 | ||
| @@ -1421,11 +1418,9 @@ static int fn_trie_lookup(struct fib_table *tb, const struct flowi *flp, | |||
| 1421 | } | 1418 | } |
| 1422 | 1419 | ||
| 1423 | if (IS_LEAF(n)) { | 1420 | if (IS_LEAF(n)) { |
| 1424 | plen = check_leaf(t, (struct leaf *)n, key, flp, res); | 1421 | ret = check_leaf(t, (struct leaf *)n, key, flp, res); |
| 1425 | if (plen < 0) | 1422 | if (ret > 0) |
| 1426 | goto backtrace; | 1423 | goto backtrace; |
| 1427 | |||
| 1428 | ret = 0; | ||
| 1429 | goto found; | 1424 | goto found; |
| 1430 | } | 1425 | } |
| 1431 | 1426 | ||
diff --git a/net/ipv4/inet_fragment.c b/net/ipv4/inet_fragment.c index 4ed429bd5951..0546a0bc97ea 100644 --- a/net/ipv4/inet_fragment.c +++ b/net/ipv4/inet_fragment.c | |||
| @@ -192,14 +192,21 @@ EXPORT_SYMBOL(inet_frag_evictor); | |||
| 192 | 192 | ||
| 193 | static struct inet_frag_queue *inet_frag_intern(struct netns_frags *nf, | 193 | static struct inet_frag_queue *inet_frag_intern(struct netns_frags *nf, |
| 194 | struct inet_frag_queue *qp_in, struct inet_frags *f, | 194 | struct inet_frag_queue *qp_in, struct inet_frags *f, |
| 195 | unsigned int hash, void *arg) | 195 | void *arg) |
| 196 | { | 196 | { |
| 197 | struct inet_frag_queue *qp; | 197 | struct inet_frag_queue *qp; |
| 198 | #ifdef CONFIG_SMP | 198 | #ifdef CONFIG_SMP |
| 199 | struct hlist_node *n; | 199 | struct hlist_node *n; |
| 200 | #endif | 200 | #endif |
| 201 | unsigned int hash; | ||
| 201 | 202 | ||
| 202 | write_lock(&f->lock); | 203 | write_lock(&f->lock); |
| 204 | /* | ||
| 205 | * While we stayed w/o the lock other CPU could update | ||
| 206 | * the rnd seed, so we need to re-calculate the hash | ||
| 207 | * chain. Fortunatelly the qp_in can be used to get one. | ||
| 208 | */ | ||
| 209 | hash = f->hashfn(qp_in); | ||
| 203 | #ifdef CONFIG_SMP | 210 | #ifdef CONFIG_SMP |
| 204 | /* With SMP race we have to recheck hash table, because | 211 | /* With SMP race we have to recheck hash table, because |
| 205 | * such entry could be created on other cpu, while we | 212 | * such entry could be created on other cpu, while we |
| @@ -247,7 +254,7 @@ static struct inet_frag_queue *inet_frag_alloc(struct netns_frags *nf, | |||
| 247 | } | 254 | } |
| 248 | 255 | ||
| 249 | static struct inet_frag_queue *inet_frag_create(struct netns_frags *nf, | 256 | static struct inet_frag_queue *inet_frag_create(struct netns_frags *nf, |
| 250 | struct inet_frags *f, void *arg, unsigned int hash) | 257 | struct inet_frags *f, void *arg) |
| 251 | { | 258 | { |
| 252 | struct inet_frag_queue *q; | 259 | struct inet_frag_queue *q; |
| 253 | 260 | ||
| @@ -255,7 +262,7 @@ static struct inet_frag_queue *inet_frag_create(struct netns_frags *nf, | |||
| 255 | if (q == NULL) | 262 | if (q == NULL) |
| 256 | return NULL; | 263 | return NULL; |
| 257 | 264 | ||
| 258 | return inet_frag_intern(nf, q, f, hash, arg); | 265 | return inet_frag_intern(nf, q, f, arg); |
| 259 | } | 266 | } |
| 260 | 267 | ||
| 261 | struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, | 268 | struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, |
| @@ -264,7 +271,6 @@ struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, | |||
| 264 | struct inet_frag_queue *q; | 271 | struct inet_frag_queue *q; |
| 265 | struct hlist_node *n; | 272 | struct hlist_node *n; |
| 266 | 273 | ||
| 267 | read_lock(&f->lock); | ||
| 268 | hlist_for_each_entry(q, n, &f->hash[hash], list) { | 274 | hlist_for_each_entry(q, n, &f->hash[hash], list) { |
| 269 | if (q->net == nf && f->match(q, key)) { | 275 | if (q->net == nf && f->match(q, key)) { |
| 270 | atomic_inc(&q->refcnt); | 276 | atomic_inc(&q->refcnt); |
| @@ -274,6 +280,6 @@ struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, | |||
| 274 | } | 280 | } |
| 275 | read_unlock(&f->lock); | 281 | read_unlock(&f->lock); |
| 276 | 282 | ||
| 277 | return inet_frag_create(nf, f, key, hash); | 283 | return inet_frag_create(nf, f, key); |
| 278 | } | 284 | } |
| 279 | EXPORT_SYMBOL(inet_frag_find); | 285 | EXPORT_SYMBOL(inet_frag_find); |
diff --git a/net/ipv4/inet_lro.c b/net/ipv4/inet_lro.c index 4a4d49fca1f2..cfd034a2b96e 100644 --- a/net/ipv4/inet_lro.c +++ b/net/ipv4/inet_lro.c | |||
| @@ -383,8 +383,7 @@ static int __lro_proc_skb(struct net_lro_mgr *lro_mgr, struct sk_buff *skb, | |||
| 383 | out2: /* send aggregated SKBs to stack */ | 383 | out2: /* send aggregated SKBs to stack */ |
| 384 | lro_flush(lro_mgr, lro_desc); | 384 | lro_flush(lro_mgr, lro_desc); |
| 385 | 385 | ||
| 386 | out: /* Original SKB has to be posted to stack */ | 386 | out: |
| 387 | skb->ip_summed = lro_mgr->ip_summed; | ||
| 388 | return 1; | 387 | return 1; |
| 389 | } | 388 | } |
| 390 | 389 | ||
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index cd6ce6ac6358..37221f659159 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
| @@ -229,6 +229,8 @@ static inline struct ipq *ip_find(struct net *net, struct iphdr *iph, u32 user) | |||
| 229 | 229 | ||
| 230 | arg.iph = iph; | 230 | arg.iph = iph; |
| 231 | arg.user = user; | 231 | arg.user = user; |
| 232 | |||
| 233 | read_lock(&ip4_frags.lock); | ||
| 232 | hash = ipqhashfn(iph->id, iph->saddr, iph->daddr, iph->protocol); | 234 | hash = ipqhashfn(iph->id, iph->saddr, iph->daddr, iph->protocol); |
| 233 | 235 | ||
| 234 | q = inet_frag_find(&net->ipv4.frags, &ip4_frags, &arg, hash); | 236 | q = inet_frag_find(&net->ipv4.frags, &ip4_frags, &arg, hash); |
diff --git a/net/ipv4/netfilter/nf_nat_snmp_basic.c b/net/ipv4/netfilter/nf_nat_snmp_basic.c index 7750c97fde7b..ffeaffc3fffe 100644 --- a/net/ipv4/netfilter/nf_nat_snmp_basic.c +++ b/net/ipv4/netfilter/nf_nat_snmp_basic.c | |||
| @@ -439,8 +439,8 @@ static unsigned char asn1_oid_decode(struct asn1_ctx *ctx, | |||
| 439 | unsigned int *len) | 439 | unsigned int *len) |
| 440 | { | 440 | { |
| 441 | unsigned long subid; | 441 | unsigned long subid; |
| 442 | unsigned int size; | ||
| 443 | unsigned long *optr; | 442 | unsigned long *optr; |
| 443 | size_t size; | ||
| 444 | 444 | ||
| 445 | size = eoc - ctx->pointer + 1; | 445 | size = eoc - ctx->pointer + 1; |
| 446 | 446 | ||
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index fc54a48fde1e..1d723de18686 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -255,11 +255,14 @@ | |||
| 255 | #include <linux/init.h> | 255 | #include <linux/init.h> |
| 256 | #include <linux/fs.h> | 256 | #include <linux/fs.h> |
| 257 | #include <linux/skbuff.h> | 257 | #include <linux/skbuff.h> |
| 258 | #include <linux/scatterlist.h> | ||
| 258 | #include <linux/splice.h> | 259 | #include <linux/splice.h> |
| 259 | #include <linux/net.h> | 260 | #include <linux/net.h> |
| 260 | #include <linux/socket.h> | 261 | #include <linux/socket.h> |
| 261 | #include <linux/random.h> | 262 | #include <linux/random.h> |
| 262 | #include <linux/bootmem.h> | 263 | #include <linux/bootmem.h> |
| 264 | #include <linux/highmem.h> | ||
| 265 | #include <linux/swap.h> | ||
| 263 | #include <linux/cache.h> | 266 | #include <linux/cache.h> |
| 264 | #include <linux/err.h> | 267 | #include <linux/err.h> |
| 265 | #include <linux/crypto.h> | 268 | #include <linux/crypto.h> |
| @@ -1206,7 +1209,8 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, | |||
| 1206 | return -ENOTCONN; | 1209 | return -ENOTCONN; |
| 1207 | while ((skb = tcp_recv_skb(sk, seq, &offset)) != NULL) { | 1210 | while ((skb = tcp_recv_skb(sk, seq, &offset)) != NULL) { |
| 1208 | if (offset < skb->len) { | 1211 | if (offset < skb->len) { |
| 1209 | size_t used, len; | 1212 | int used; |
| 1213 | size_t len; | ||
| 1210 | 1214 | ||
| 1211 | len = skb->len - offset; | 1215 | len = skb->len - offset; |
| 1212 | /* Stop reading if we hit a patch of urgent data */ | 1216 | /* Stop reading if we hit a patch of urgent data */ |
| @@ -2620,7 +2624,7 @@ __setup("thash_entries=", set_thash_entries); | |||
| 2620 | void __init tcp_init(void) | 2624 | void __init tcp_init(void) |
| 2621 | { | 2625 | { |
| 2622 | struct sk_buff *skb = NULL; | 2626 | struct sk_buff *skb = NULL; |
| 2623 | unsigned long limit; | 2627 | unsigned long nr_pages, limit; |
| 2624 | int order, i, max_share; | 2628 | int order, i, max_share; |
| 2625 | 2629 | ||
| 2626 | BUILD_BUG_ON(sizeof(struct tcp_skb_cb) > sizeof(skb->cb)); | 2630 | BUILD_BUG_ON(sizeof(struct tcp_skb_cb) > sizeof(skb->cb)); |
| @@ -2689,8 +2693,9 @@ void __init tcp_init(void) | |||
| 2689 | * is up to 1/2 at 256 MB, decreasing toward zero with the amount of | 2693 | * is up to 1/2 at 256 MB, decreasing toward zero with the amount of |
| 2690 | * memory, with a floor of 128 pages. | 2694 | * memory, with a floor of 128 pages. |
| 2691 | */ | 2695 | */ |
| 2692 | limit = min(nr_all_pages, 1UL<<(28-PAGE_SHIFT)) >> (20-PAGE_SHIFT); | 2696 | nr_pages = totalram_pages - totalhigh_pages; |
| 2693 | limit = (limit * (nr_all_pages >> (20-PAGE_SHIFT))) >> (PAGE_SHIFT-11); | 2697 | limit = min(nr_pages, 1UL<<(28-PAGE_SHIFT)) >> (20-PAGE_SHIFT); |
| 2698 | limit = (limit * (nr_pages >> (20-PAGE_SHIFT))) >> (PAGE_SHIFT-11); | ||
| 2694 | limit = max(limit, 128UL); | 2699 | limit = max(limit, 128UL); |
| 2695 | sysctl_tcp_mem[0] = limit / 4 * 3; | 2700 | sysctl_tcp_mem[0] = limit / 4 * 3; |
| 2696 | sysctl_tcp_mem[1] = limit; | 2701 | sysctl_tcp_mem[1] = limit; |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 12695be2c255..ffe869ac1bcf 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -2291,7 +2291,7 @@ static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i, int *len) | |||
| 2291 | } | 2291 | } |
| 2292 | 2292 | ||
| 2293 | seq_printf(f, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX " | 2293 | seq_printf(f, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX " |
| 2294 | "%08X %5d %8d %lu %d %p %u %u %u %u %d%n", | 2294 | "%08X %5d %8d %lu %d %p %lu %lu %u %u %d%n", |
| 2295 | i, src, srcp, dest, destp, sk->sk_state, | 2295 | i, src, srcp, dest, destp, sk->sk_state, |
| 2296 | tp->write_seq - tp->snd_una, | 2296 | tp->write_seq - tp->snd_una, |
| 2297 | sk->sk_state == TCP_LISTEN ? sk->sk_ack_backlog : | 2297 | sk->sk_state == TCP_LISTEN ? sk->sk_ack_backlog : |
| @@ -2303,8 +2303,8 @@ static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i, int *len) | |||
| 2303 | icsk->icsk_probes_out, | 2303 | icsk->icsk_probes_out, |
| 2304 | sock_i_ino(sk), | 2304 | sock_i_ino(sk), |
| 2305 | atomic_read(&sk->sk_refcnt), sk, | 2305 | atomic_read(&sk->sk_refcnt), sk, |
| 2306 | icsk->icsk_rto, | 2306 | jiffies_to_clock_t(icsk->icsk_rto), |
| 2307 | icsk->icsk_ack.ato, | 2307 | jiffies_to_clock_t(icsk->icsk_ack.ato), |
| 2308 | (icsk->icsk_ack.quick << 1) | icsk->icsk_ack.pingpong, | 2308 | (icsk->icsk_ack.quick << 1) | icsk->icsk_ack.pingpong, |
| 2309 | tp->snd_cwnd, | 2309 | tp->snd_cwnd, |
| 2310 | tp->snd_ssthresh >= 0xFFFF ? -1 : tp->snd_ssthresh, | 2310 | tp->snd_ssthresh >= 0xFFFF ? -1 : tp->snd_ssthresh, |
diff --git a/net/ipv4/tcp_probe.c b/net/ipv4/tcp_probe.c index 5ff0ce6e9d39..7ddc30f0744f 100644 --- a/net/ipv4/tcp_probe.c +++ b/net/ipv4/tcp_probe.c | |||
| @@ -224,7 +224,7 @@ static __init int tcpprobe_init(void) | |||
| 224 | if (bufsize < 0) | 224 | if (bufsize < 0) |
| 225 | return -EINVAL; | 225 | return -EINVAL; |
| 226 | 226 | ||
| 227 | tcp_probe.log = kcalloc(sizeof(struct tcp_log), bufsize, GFP_KERNEL); | 227 | tcp_probe.log = kcalloc(bufsize, sizeof(struct tcp_log), GFP_KERNEL); |
| 228 | if (!tcp_probe.log) | 228 | if (!tcp_probe.log) |
| 229 | goto err0; | 229 | goto err0; |
| 230 | 230 | ||
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 147588f4c7c0..ff61a5cdb0b3 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -749,12 +749,12 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp) | |||
| 749 | } | 749 | } |
| 750 | write_unlock_bh(&idev->lock); | 750 | write_unlock_bh(&idev->lock); |
| 751 | 751 | ||
| 752 | addrconf_del_timer(ifp); | ||
| 753 | |||
| 752 | ipv6_ifa_notify(RTM_DELADDR, ifp); | 754 | ipv6_ifa_notify(RTM_DELADDR, ifp); |
| 753 | 755 | ||
| 754 | atomic_notifier_call_chain(&inet6addr_chain, NETDEV_DOWN, ifp); | 756 | atomic_notifier_call_chain(&inet6addr_chain, NETDEV_DOWN, ifp); |
| 755 | 757 | ||
| 756 | addrconf_del_timer(ifp); | ||
| 757 | |||
| 758 | /* | 758 | /* |
| 759 | * Purge or update corresponding prefix | 759 | * Purge or update corresponding prefix |
| 760 | * | 760 | * |
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 3cd1c993d52b..dcf94fdfb863 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c | |||
| @@ -445,7 +445,7 @@ looped_back: | |||
| 445 | kfree_skb(skb); | 445 | kfree_skb(skb); |
| 446 | return -1; | 446 | return -1; |
| 447 | } | 447 | } |
| 448 | if (!ipv6_chk_home_addr(&init_net, addr)) { | 448 | if (!ipv6_chk_home_addr(dev_net(skb->dst->dev), addr)) { |
| 449 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | 449 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), |
| 450 | IPSTATS_MIB_INADDRERRORS); | 450 | IPSTATS_MIB_INADDRERRORS); |
| 451 | kfree_skb(skb); | 451 | kfree_skb(skb); |
diff --git a/net/ipv6/netfilter/ip6table_mangle.c b/net/ipv6/netfilter/ip6table_mangle.c index 27a5e8b48d93..f405cea21a8b 100644 --- a/net/ipv6/netfilter/ip6table_mangle.c +++ b/net/ipv6/netfilter/ip6table_mangle.c | |||
| @@ -129,7 +129,7 @@ static struct nf_hook_ops ip6t_ops[] __read_mostly = { | |||
| 129 | .priority = NF_IP6_PRI_MANGLE, | 129 | .priority = NF_IP6_PRI_MANGLE, |
| 130 | }, | 130 | }, |
| 131 | { | 131 | { |
| 132 | .hook = ip6t_local_hook, | 132 | .hook = ip6t_route_hook, |
| 133 | .owner = THIS_MODULE, | 133 | .owner = THIS_MODULE, |
| 134 | .pf = PF_INET6, | 134 | .pf = PF_INET6, |
| 135 | .hooknum = NF_INET_LOCAL_IN, | 135 | .hooknum = NF_INET_LOCAL_IN, |
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index e65e26e210ee..cf20bc4fd60d 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
| @@ -207,9 +207,10 @@ fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst) | |||
| 207 | arg.id = id; | 207 | arg.id = id; |
| 208 | arg.src = src; | 208 | arg.src = src; |
| 209 | arg.dst = dst; | 209 | arg.dst = dst; |
| 210 | |||
| 211 | read_lock_bh(&nf_frags.lock); | ||
| 210 | hash = ip6qhashfn(id, src, dst); | 212 | hash = ip6qhashfn(id, src, dst); |
| 211 | 213 | ||
| 212 | local_bh_disable(); | ||
| 213 | q = inet_frag_find(&nf_init_frags, &nf_frags, &arg, hash); | 214 | q = inet_frag_find(&nf_init_frags, &nf_frags, &arg, hash); |
| 214 | local_bh_enable(); | 215 | local_bh_enable(); |
| 215 | if (q == NULL) | 216 | if (q == NULL) |
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index 798cabc7535b..a60d7d129713 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
| @@ -247,6 +247,8 @@ fq_find(struct net *net, __be32 id, struct in6_addr *src, struct in6_addr *dst, | |||
| 247 | arg.id = id; | 247 | arg.id = id; |
| 248 | arg.src = src; | 248 | arg.src = src; |
| 249 | arg.dst = dst; | 249 | arg.dst = dst; |
| 250 | |||
| 251 | read_lock(&ip6_frags.lock); | ||
| 250 | hash = ip6qhashfn(id, src, dst); | 252 | hash = ip6qhashfn(id, src, dst); |
| 251 | 253 | ||
| 252 | q = inet_frag_find(&net->ipv6.frags, &ip6_frags, &arg, hash); | 254 | q = inet_frag_find(&net->ipv6.frags, &ip6_frags, &arg, hash); |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index d1f3e19b06c7..7ff687020fa9 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -240,7 +240,7 @@ static inline int rt6_need_strict(struct in6_addr *daddr) | |||
| 240 | static inline struct rt6_info *rt6_device_match(struct net *net, | 240 | static inline struct rt6_info *rt6_device_match(struct net *net, |
| 241 | struct rt6_info *rt, | 241 | struct rt6_info *rt, |
| 242 | int oif, | 242 | int oif, |
| 243 | int strict) | 243 | int flags) |
| 244 | { | 244 | { |
| 245 | struct rt6_info *local = NULL; | 245 | struct rt6_info *local = NULL; |
| 246 | struct rt6_info *sprt; | 246 | struct rt6_info *sprt; |
| @@ -253,7 +253,7 @@ static inline struct rt6_info *rt6_device_match(struct net *net, | |||
| 253 | if (dev->flags & IFF_LOOPBACK) { | 253 | if (dev->flags & IFF_LOOPBACK) { |
| 254 | if (sprt->rt6i_idev == NULL || | 254 | if (sprt->rt6i_idev == NULL || |
| 255 | sprt->rt6i_idev->dev->ifindex != oif) { | 255 | sprt->rt6i_idev->dev->ifindex != oif) { |
| 256 | if (strict && oif) | 256 | if (flags & RT6_LOOKUP_F_IFACE && oif) |
| 257 | continue; | 257 | continue; |
| 258 | if (local && (!oif || | 258 | if (local && (!oif || |
| 259 | local->rt6i_idev->dev->ifindex == oif)) | 259 | local->rt6i_idev->dev->ifindex == oif)) |
| @@ -266,7 +266,7 @@ static inline struct rt6_info *rt6_device_match(struct net *net, | |||
| 266 | if (local) | 266 | if (local) |
| 267 | return local; | 267 | return local; |
| 268 | 268 | ||
| 269 | if (strict) | 269 | if (flags & RT6_LOOKUP_F_IFACE) |
| 270 | return net->ipv6.ip6_null_entry; | 270 | return net->ipv6.ip6_null_entry; |
| 271 | } | 271 | } |
| 272 | return rt; | 272 | return rt; |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index cb46749d4c32..40ea9c36d24b 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
| @@ -2036,7 +2036,7 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i) | |||
| 2036 | 2036 | ||
| 2037 | seq_printf(seq, | 2037 | seq_printf(seq, |
| 2038 | "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X " | 2038 | "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X " |
| 2039 | "%02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %u %u %u %u %d\n", | 2039 | "%02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %lu %lu %u %u %d\n", |
| 2040 | i, | 2040 | i, |
| 2041 | src->s6_addr32[0], src->s6_addr32[1], | 2041 | src->s6_addr32[0], src->s6_addr32[1], |
| 2042 | src->s6_addr32[2], src->s6_addr32[3], srcp, | 2042 | src->s6_addr32[2], src->s6_addr32[3], srcp, |
| @@ -2052,8 +2052,8 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i) | |||
| 2052 | icsk->icsk_probes_out, | 2052 | icsk->icsk_probes_out, |
| 2053 | sock_i_ino(sp), | 2053 | sock_i_ino(sp), |
| 2054 | atomic_read(&sp->sk_refcnt), sp, | 2054 | atomic_read(&sp->sk_refcnt), sp, |
| 2055 | icsk->icsk_rto, | 2055 | jiffies_to_clock_t(icsk->icsk_rto), |
| 2056 | icsk->icsk_ack.ato, | 2056 | jiffies_to_clock_t(icsk->icsk_ack.ato), |
| 2057 | (icsk->icsk_ack.quick << 1 ) | icsk->icsk_ack.pingpong, | 2057 | (icsk->icsk_ack.quick << 1 ) | icsk->icsk_ack.pingpong, |
| 2058 | tp->snd_cwnd, tp->snd_ssthresh>=0xFFFF?-1:tp->snd_ssthresh | 2058 | tp->snd_cwnd, tp->snd_ssthresh>=0xFFFF?-1:tp->snd_ssthresh |
| 2059 | ); | 2059 | ); |
diff --git a/net/irda/irnetlink.c b/net/irda/irnetlink.c index 9e1fb82e3220..2f05ec1037ab 100644 --- a/net/irda/irnetlink.c +++ b/net/irda/irnetlink.c | |||
| @@ -101,8 +101,8 @@ static int irda_nl_get_mode(struct sk_buff *skb, struct genl_info *info) | |||
| 101 | 101 | ||
| 102 | hdr = genlmsg_put(msg, info->snd_pid, info->snd_seq, | 102 | hdr = genlmsg_put(msg, info->snd_pid, info->snd_seq, |
| 103 | &irda_nl_family, 0, IRDA_NL_CMD_GET_MODE); | 103 | &irda_nl_family, 0, IRDA_NL_CMD_GET_MODE); |
| 104 | if (IS_ERR(hdr)) { | 104 | if (hdr == NULL) { |
| 105 | ret = PTR_ERR(hdr); | 105 | ret = -EMSGSIZE; |
| 106 | goto err_out; | 106 | goto err_out; |
| 107 | } | 107 | } |
| 108 | 108 | ||
diff --git a/net/mac80211/key.c b/net/mac80211/key.c index 150d66dbda9d..220e83be3ef4 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c | |||
| @@ -380,6 +380,15 @@ void ieee80211_key_free(struct ieee80211_key *key) | |||
| 380 | if (!key) | 380 | if (!key) |
| 381 | return; | 381 | return; |
| 382 | 382 | ||
| 383 | if (!key->sdata) { | ||
| 384 | /* The key has not been linked yet, simply free it | ||
| 385 | * and don't Oops */ | ||
| 386 | if (key->conf.alg == ALG_CCMP) | ||
| 387 | ieee80211_aes_key_free(key->u.ccmp.tfm); | ||
| 388 | kfree(key); | ||
| 389 | return; | ||
| 390 | } | ||
| 391 | |||
| 383 | spin_lock_irqsave(&key->sdata->local->key_lock, flags); | 392 | spin_lock_irqsave(&key->sdata->local->key_lock, flags); |
| 384 | __ieee80211_key_free(key); | 393 | __ieee80211_key_free(key); |
| 385 | spin_unlock_irqrestore(&key->sdata->local->key_lock, flags); | 394 | spin_unlock_irqrestore(&key->sdata->local->key_lock, flags); |
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 98c0b5e56ecc..df0836ff1a20 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
| @@ -530,8 +530,6 @@ static int ieee80211_stop(struct net_device *dev) | |||
| 530 | local->sta_hw_scanning = 0; | 530 | local->sta_hw_scanning = 0; |
| 531 | } | 531 | } |
| 532 | 532 | ||
| 533 | flush_workqueue(local->hw.workqueue); | ||
| 534 | |||
| 535 | sdata->u.sta.flags &= ~IEEE80211_STA_PRIVACY_INVOKED; | 533 | sdata->u.sta.flags &= ~IEEE80211_STA_PRIVACY_INVOKED; |
| 536 | kfree(sdata->u.sta.extra_ie); | 534 | kfree(sdata->u.sta.extra_ie); |
| 537 | sdata->u.sta.extra_ie = NULL; | 535 | sdata->u.sta.extra_ie = NULL; |
| @@ -555,6 +553,8 @@ static int ieee80211_stop(struct net_device *dev) | |||
| 555 | 553 | ||
| 556 | ieee80211_led_radio(local, 0); | 554 | ieee80211_led_radio(local, 0); |
| 557 | 555 | ||
| 556 | flush_workqueue(local->hw.workqueue); | ||
| 557 | |||
| 558 | tasklet_disable(&local->tx_pending_tasklet); | 558 | tasklet_disable(&local->tx_pending_tasklet); |
| 559 | tasklet_disable(&local->tasklet); | 559 | tasklet_disable(&local->tasklet); |
| 560 | } | 560 | } |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 4d2b582dd055..b404537c0bcd 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -547,15 +547,14 @@ static void ieee80211_set_associated(struct net_device *dev, | |||
| 547 | sdata->bss_conf.ht_bss_conf = &conf->ht_bss_conf; | 547 | sdata->bss_conf.ht_bss_conf = &conf->ht_bss_conf; |
| 548 | } | 548 | } |
| 549 | 549 | ||
| 550 | netif_carrier_on(dev); | ||
| 551 | ifsta->flags |= IEEE80211_STA_PREV_BSSID_SET; | 550 | ifsta->flags |= IEEE80211_STA_PREV_BSSID_SET; |
| 552 | memcpy(ifsta->prev_bssid, sdata->u.sta.bssid, ETH_ALEN); | 551 | memcpy(ifsta->prev_bssid, sdata->u.sta.bssid, ETH_ALEN); |
| 553 | memcpy(wrqu.ap_addr.sa_data, sdata->u.sta.bssid, ETH_ALEN); | 552 | memcpy(wrqu.ap_addr.sa_data, sdata->u.sta.bssid, ETH_ALEN); |
| 554 | ieee80211_sta_send_associnfo(dev, ifsta); | 553 | ieee80211_sta_send_associnfo(dev, ifsta); |
| 555 | } else { | 554 | } else { |
| 555 | netif_carrier_off(dev); | ||
| 556 | ieee80211_sta_tear_down_BA_sessions(dev, ifsta->bssid); | 556 | ieee80211_sta_tear_down_BA_sessions(dev, ifsta->bssid); |
| 557 | ifsta->flags &= ~IEEE80211_STA_ASSOCIATED; | 557 | ifsta->flags &= ~IEEE80211_STA_ASSOCIATED; |
| 558 | netif_carrier_off(dev); | ||
| 559 | ieee80211_reset_erp_info(dev); | 558 | ieee80211_reset_erp_info(dev); |
| 560 | 559 | ||
| 561 | sdata->bss_conf.assoc_ht = 0; | 560 | sdata->bss_conf.assoc_ht = 0; |
| @@ -569,6 +568,10 @@ static void ieee80211_set_associated(struct net_device *dev, | |||
| 569 | 568 | ||
| 570 | sdata->bss_conf.assoc = assoc; | 569 | sdata->bss_conf.assoc = assoc; |
| 571 | ieee80211_bss_info_change_notify(sdata, changed); | 570 | ieee80211_bss_info_change_notify(sdata, changed); |
| 571 | |||
| 572 | if (assoc) | ||
| 573 | netif_carrier_on(dev); | ||
| 574 | |||
| 572 | wrqu.ap_addr.sa_family = ARPHRD_ETHER; | 575 | wrqu.ap_addr.sa_family = ARPHRD_ETHER; |
| 573 | wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL); | 576 | wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL); |
| 574 | } | 577 | } |
| @@ -3611,8 +3614,10 @@ static int ieee80211_sta_find_ibss(struct net_device *dev, | |||
| 3611 | spin_unlock_bh(&local->sta_bss_lock); | 3614 | spin_unlock_bh(&local->sta_bss_lock); |
| 3612 | 3615 | ||
| 3613 | #ifdef CONFIG_MAC80211_IBSS_DEBUG | 3616 | #ifdef CONFIG_MAC80211_IBSS_DEBUG |
| 3614 | printk(KERN_DEBUG " sta_find_ibss: selected %s current " | 3617 | if (found) |
| 3615 | "%s\n", print_mac(mac, bssid), print_mac(mac2, ifsta->bssid)); | 3618 | printk(KERN_DEBUG " sta_find_ibss: selected %s current " |
| 3619 | "%s\n", print_mac(mac, bssid), | ||
| 3620 | print_mac(mac2, ifsta->bssid)); | ||
| 3616 | #endif /* CONFIG_MAC80211_IBSS_DEBUG */ | 3621 | #endif /* CONFIG_MAC80211_IBSS_DEBUG */ |
| 3617 | if (found && memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0 && | 3622 | if (found && memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0 && |
| 3618 | (bss = ieee80211_rx_bss_get(dev, bssid, | 3623 | (bss = ieee80211_rx_bss_get(dev, bssid, |
diff --git a/net/mac80211/rc80211_pid.h b/net/mac80211/rc80211_pid.h index 04afc13ed825..4ea7b97d1af1 100644 --- a/net/mac80211/rc80211_pid.h +++ b/net/mac80211/rc80211_pid.h | |||
| @@ -141,7 +141,6 @@ struct rc_pid_events_file_info { | |||
| 141 | * rate behaviour values (lower means we should trust more what we learnt | 141 | * rate behaviour values (lower means we should trust more what we learnt |
| 142 | * about behaviour of rates, higher means we should trust more the natural | 142 | * about behaviour of rates, higher means we should trust more the natural |
| 143 | * ordering of rates) | 143 | * ordering of rates) |
| 144 | * @fast_start: if Y, push high rates right after initialization | ||
| 145 | */ | 144 | */ |
| 146 | struct rc_pid_debugfs_entries { | 145 | struct rc_pid_debugfs_entries { |
| 147 | struct dentry *dir; | 146 | struct dentry *dir; |
| @@ -154,7 +153,6 @@ struct rc_pid_debugfs_entries { | |||
| 154 | struct dentry *sharpen_factor; | 153 | struct dentry *sharpen_factor; |
| 155 | struct dentry *sharpen_duration; | 154 | struct dentry *sharpen_duration; |
| 156 | struct dentry *norm_offset; | 155 | struct dentry *norm_offset; |
| 157 | struct dentry *fast_start; | ||
| 158 | }; | 156 | }; |
| 159 | 157 | ||
| 160 | void rate_control_pid_event_tx_status(struct rc_pid_event_buffer *buf, | 158 | void rate_control_pid_event_tx_status(struct rc_pid_event_buffer *buf, |
| @@ -267,9 +265,6 @@ struct rc_pid_info { | |||
| 267 | /* Normalization offset. */ | 265 | /* Normalization offset. */ |
| 268 | unsigned int norm_offset; | 266 | unsigned int norm_offset; |
| 269 | 267 | ||
| 270 | /* Fast starst parameter. */ | ||
| 271 | unsigned int fast_start; | ||
| 272 | |||
| 273 | /* Rates information. */ | 268 | /* Rates information. */ |
| 274 | struct rc_pid_rateinfo *rinfo; | 269 | struct rc_pid_rateinfo *rinfo; |
| 275 | 270 | ||
diff --git a/net/mac80211/rc80211_pid_algo.c b/net/mac80211/rc80211_pid_algo.c index a849b745bdb5..bcd27c1d7594 100644 --- a/net/mac80211/rc80211_pid_algo.c +++ b/net/mac80211/rc80211_pid_algo.c | |||
| @@ -398,13 +398,25 @@ static void *rate_control_pid_alloc(struct ieee80211_local *local) | |||
| 398 | return NULL; | 398 | return NULL; |
| 399 | } | 399 | } |
| 400 | 400 | ||
| 401 | pinfo->target = RC_PID_TARGET_PF; | ||
| 402 | pinfo->sampling_period = RC_PID_INTERVAL; | ||
| 403 | pinfo->coeff_p = RC_PID_COEFF_P; | ||
| 404 | pinfo->coeff_i = RC_PID_COEFF_I; | ||
| 405 | pinfo->coeff_d = RC_PID_COEFF_D; | ||
| 406 | pinfo->smoothing_shift = RC_PID_SMOOTHING_SHIFT; | ||
| 407 | pinfo->sharpen_factor = RC_PID_SHARPENING_FACTOR; | ||
| 408 | pinfo->sharpen_duration = RC_PID_SHARPENING_DURATION; | ||
| 409 | pinfo->norm_offset = RC_PID_NORM_OFFSET; | ||
| 410 | pinfo->rinfo = rinfo; | ||
| 411 | pinfo->oldrate = 0; | ||
| 412 | |||
| 401 | /* Sort the rates. This is optimized for the most common case (i.e. | 413 | /* Sort the rates. This is optimized for the most common case (i.e. |
| 402 | * almost-sorted CCK+OFDM rates). Kind of bubble-sort with reversed | 414 | * almost-sorted CCK+OFDM rates). Kind of bubble-sort with reversed |
| 403 | * mapping too. */ | 415 | * mapping too. */ |
| 404 | for (i = 0; i < sband->n_bitrates; i++) { | 416 | for (i = 0; i < sband->n_bitrates; i++) { |
| 405 | rinfo[i].index = i; | 417 | rinfo[i].index = i; |
| 406 | rinfo[i].rev_index = i; | 418 | rinfo[i].rev_index = i; |
| 407 | if (pinfo->fast_start) | 419 | if (RC_PID_FAST_START) |
| 408 | rinfo[i].diff = 0; | 420 | rinfo[i].diff = 0; |
| 409 | else | 421 | else |
| 410 | rinfo[i].diff = i * pinfo->norm_offset; | 422 | rinfo[i].diff = i * pinfo->norm_offset; |
| @@ -425,19 +437,6 @@ static void *rate_control_pid_alloc(struct ieee80211_local *local) | |||
| 425 | break; | 437 | break; |
| 426 | } | 438 | } |
| 427 | 439 | ||
| 428 | pinfo->target = RC_PID_TARGET_PF; | ||
| 429 | pinfo->sampling_period = RC_PID_INTERVAL; | ||
| 430 | pinfo->coeff_p = RC_PID_COEFF_P; | ||
| 431 | pinfo->coeff_i = RC_PID_COEFF_I; | ||
| 432 | pinfo->coeff_d = RC_PID_COEFF_D; | ||
| 433 | pinfo->smoothing_shift = RC_PID_SMOOTHING_SHIFT; | ||
| 434 | pinfo->sharpen_factor = RC_PID_SHARPENING_FACTOR; | ||
| 435 | pinfo->sharpen_duration = RC_PID_SHARPENING_DURATION; | ||
| 436 | pinfo->norm_offset = RC_PID_NORM_OFFSET; | ||
| 437 | pinfo->fast_start = RC_PID_FAST_START; | ||
| 438 | pinfo->rinfo = rinfo; | ||
| 439 | pinfo->oldrate = 0; | ||
| 440 | |||
| 441 | #ifdef CONFIG_MAC80211_DEBUGFS | 440 | #ifdef CONFIG_MAC80211_DEBUGFS |
| 442 | de = &pinfo->dentries; | 441 | de = &pinfo->dentries; |
| 443 | de->dir = debugfs_create_dir("rc80211_pid", | 442 | de->dir = debugfs_create_dir("rc80211_pid", |
| @@ -465,9 +464,6 @@ static void *rate_control_pid_alloc(struct ieee80211_local *local) | |||
| 465 | de->norm_offset = debugfs_create_u32("norm_offset", | 464 | de->norm_offset = debugfs_create_u32("norm_offset", |
| 466 | S_IRUSR | S_IWUSR, de->dir, | 465 | S_IRUSR | S_IWUSR, de->dir, |
| 467 | &pinfo->norm_offset); | 466 | &pinfo->norm_offset); |
| 468 | de->fast_start = debugfs_create_bool("fast_start", | ||
| 469 | S_IRUSR | S_IWUSR, de->dir, | ||
| 470 | &pinfo->fast_start); | ||
| 471 | #endif | 467 | #endif |
| 472 | 468 | ||
| 473 | return pinfo; | 469 | return pinfo; |
| @@ -479,7 +475,6 @@ static void rate_control_pid_free(void *priv) | |||
| 479 | #ifdef CONFIG_MAC80211_DEBUGFS | 475 | #ifdef CONFIG_MAC80211_DEBUGFS |
| 480 | struct rc_pid_debugfs_entries *de = &pinfo->dentries; | 476 | struct rc_pid_debugfs_entries *de = &pinfo->dentries; |
| 481 | 477 | ||
| 482 | debugfs_remove(de->fast_start); | ||
| 483 | debugfs_remove(de->norm_offset); | 478 | debugfs_remove(de->norm_offset); |
| 484 | debugfs_remove(de->sharpen_duration); | 479 | debugfs_remove(de->sharpen_duration); |
| 485 | debugfs_remove(de->sharpen_factor); | 480 | debugfs_remove(de->sharpen_factor); |
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c index 6106cb79060c..e8404212ad57 100644 --- a/net/mac80211/wext.c +++ b/net/mac80211/wext.c | |||
| @@ -95,6 +95,13 @@ static int ieee80211_set_encryption(struct net_device *dev, u8 *sta_addr, | |||
| 95 | } | 95 | } |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | if (alg == ALG_WEP && | ||
| 99 | key_len != LEN_WEP40 && key_len != LEN_WEP104) { | ||
| 100 | ieee80211_key_free(key); | ||
| 101 | err = -EINVAL; | ||
| 102 | goto out_unlock; | ||
| 103 | } | ||
| 104 | |||
| 98 | ieee80211_key_link(key, sdata, sta); | 105 | ieee80211_key_link(key, sdata, sta); |
| 99 | 106 | ||
| 100 | if (set_tx_key || (!sta && !sdata->default_key && key)) | 107 | if (set_tx_key || (!sta && !sdata->default_key && key)) |
diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c index 635b996c8c35..5d09e8698b57 100644 --- a/net/mac80211/wme.c +++ b/net/mac80211/wme.c | |||
| @@ -323,8 +323,7 @@ static void wme_qdiscop_destroy(struct Qdisc* qd) | |||
| 323 | struct ieee80211_hw *hw = &local->hw; | 323 | struct ieee80211_hw *hw = &local->hw; |
| 324 | int queue; | 324 | int queue; |
| 325 | 325 | ||
| 326 | tcf_destroy_chain(q->filter_list); | 326 | tcf_destroy_chain(&q->filter_list); |
| 327 | q->filter_list = NULL; | ||
| 328 | 327 | ||
| 329 | for (queue=0; queue < hw->queues; queue++) { | 328 | for (queue=0; queue < hw->queues; queue++) { |
| 330 | skb_queue_purge(&q->requeued[queue]); | 329 | skb_queue_purge(&q->requeued[queue]); |
diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c index ba94004fe323..dd28fb239a60 100644 --- a/net/netfilter/nf_conntrack_proto_tcp.c +++ b/net/netfilter/nf_conntrack_proto_tcp.c | |||
| @@ -331,12 +331,13 @@ static unsigned int get_conntrack_index(const struct tcphdr *tcph) | |||
| 331 | 331 | ||
| 332 | I. Upper bound for valid data: seq <= sender.td_maxend | 332 | I. Upper bound for valid data: seq <= sender.td_maxend |
| 333 | II. Lower bound for valid data: seq + len >= sender.td_end - receiver.td_maxwin | 333 | II. Lower bound for valid data: seq + len >= sender.td_end - receiver.td_maxwin |
| 334 | III. Upper bound for valid ack: sack <= receiver.td_end | 334 | III. Upper bound for valid (s)ack: sack <= receiver.td_end |
| 335 | IV. Lower bound for valid ack: ack >= receiver.td_end - MAXACKWINDOW | 335 | IV. Lower bound for valid (s)ack: sack >= receiver.td_end - MAXACKWINDOW |
| 336 | 336 | ||
| 337 | where sack is the highest right edge of sack block found in the packet. | 337 | where sack is the highest right edge of sack block found in the packet |
| 338 | or ack in the case of packet without SACK option. | ||
| 338 | 339 | ||
| 339 | The upper bound limit for a valid ack is not ignored - | 340 | The upper bound limit for a valid (s)ack is not ignored - |
| 340 | we doesn't have to deal with fragments. | 341 | we doesn't have to deal with fragments. |
| 341 | */ | 342 | */ |
| 342 | 343 | ||
| @@ -606,12 +607,12 @@ static bool tcp_in_window(const struct nf_conn *ct, | |||
| 606 | before(seq, sender->td_maxend + 1), | 607 | before(seq, sender->td_maxend + 1), |
| 607 | after(end, sender->td_end - receiver->td_maxwin - 1), | 608 | after(end, sender->td_end - receiver->td_maxwin - 1), |
| 608 | before(sack, receiver->td_end + 1), | 609 | before(sack, receiver->td_end + 1), |
| 609 | after(ack, receiver->td_end - MAXACKWINDOW(sender))); | 610 | after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1)); |
| 610 | 611 | ||
| 611 | if (before(seq, sender->td_maxend + 1) && | 612 | if (before(seq, sender->td_maxend + 1) && |
| 612 | after(end, sender->td_end - receiver->td_maxwin - 1) && | 613 | after(end, sender->td_end - receiver->td_maxwin - 1) && |
| 613 | before(sack, receiver->td_end + 1) && | 614 | before(sack, receiver->td_end + 1) && |
| 614 | after(ack, receiver->td_end - MAXACKWINDOW(sender))) { | 615 | after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1)) { |
| 615 | /* | 616 | /* |
| 616 | * Take into account window scaling (RFC 1323). | 617 | * Take into account window scaling (RFC 1323). |
| 617 | */ | 618 | */ |
| @@ -843,9 +844,15 @@ static int tcp_packet(struct nf_conn *ct, | |||
| 843 | /* Attempt to reopen a closed/aborted connection. | 844 | /* Attempt to reopen a closed/aborted connection. |
| 844 | * Delete this connection and look up again. */ | 845 | * Delete this connection and look up again. */ |
| 845 | write_unlock_bh(&tcp_lock); | 846 | write_unlock_bh(&tcp_lock); |
| 846 | if (del_timer(&ct->timeout)) | 847 | /* Only repeat if we can actually remove the timer. |
| 848 | * Destruction may already be in progress in process | ||
| 849 | * context and we must give it a chance to terminate. | ||
| 850 | */ | ||
| 851 | if (del_timer(&ct->timeout)) { | ||
| 847 | ct->timeout.function((unsigned long)ct); | 852 | ct->timeout.function((unsigned long)ct); |
| 848 | return -NF_REPEAT; | 853 | return -NF_REPEAT; |
| 854 | } | ||
| 855 | return -NF_DROP; | ||
| 849 | } | 856 | } |
| 850 | /* Fall through */ | 857 | /* Fall through */ |
| 851 | case TCP_CONNTRACK_IGNORE: | 858 | case TCP_CONNTRACK_IGNORE: |
diff --git a/net/netlabel/netlabel_cipso_v4.c b/net/netlabel/netlabel_cipso_v4.c index fdc14a0d21af..9080c61b71a5 100644 --- a/net/netlabel/netlabel_cipso_v4.c +++ b/net/netlabel/netlabel_cipso_v4.c | |||
| @@ -584,12 +584,7 @@ list_start: | |||
| 584 | rcu_read_unlock(); | 584 | rcu_read_unlock(); |
| 585 | 585 | ||
| 586 | genlmsg_end(ans_skb, data); | 586 | genlmsg_end(ans_skb, data); |
| 587 | 587 | return genlmsg_reply(ans_skb, info); | |
| 588 | ret_val = genlmsg_reply(ans_skb, info); | ||
| 589 | if (ret_val != 0) | ||
| 590 | goto list_failure; | ||
| 591 | |||
| 592 | return 0; | ||
| 593 | 588 | ||
| 594 | list_retry: | 589 | list_retry: |
| 595 | /* XXX - this limit is a guesstimate */ | 590 | /* XXX - this limit is a guesstimate */ |
diff --git a/net/netlabel/netlabel_mgmt.c b/net/netlabel/netlabel_mgmt.c index 22c191267808..44be5d5261f4 100644 --- a/net/netlabel/netlabel_mgmt.c +++ b/net/netlabel/netlabel_mgmt.c | |||
| @@ -386,11 +386,7 @@ static int netlbl_mgmt_listdef(struct sk_buff *skb, struct genl_info *info) | |||
| 386 | rcu_read_unlock(); | 386 | rcu_read_unlock(); |
| 387 | 387 | ||
| 388 | genlmsg_end(ans_skb, data); | 388 | genlmsg_end(ans_skb, data); |
| 389 | 389 | return genlmsg_reply(ans_skb, info); | |
| 390 | ret_val = genlmsg_reply(ans_skb, info); | ||
| 391 | if (ret_val != 0) | ||
| 392 | goto listdef_failure; | ||
| 393 | return 0; | ||
| 394 | 390 | ||
| 395 | listdef_failure_lock: | 391 | listdef_failure_lock: |
| 396 | rcu_read_unlock(); | 392 | rcu_read_unlock(); |
| @@ -501,11 +497,7 @@ static int netlbl_mgmt_version(struct sk_buff *skb, struct genl_info *info) | |||
| 501 | goto version_failure; | 497 | goto version_failure; |
| 502 | 498 | ||
| 503 | genlmsg_end(ans_skb, data); | 499 | genlmsg_end(ans_skb, data); |
| 504 | 500 | return genlmsg_reply(ans_skb, info); | |
| 505 | ret_val = genlmsg_reply(ans_skb, info); | ||
| 506 | if (ret_val != 0) | ||
| 507 | goto version_failure; | ||
| 508 | return 0; | ||
| 509 | 501 | ||
| 510 | version_failure: | 502 | version_failure: |
| 511 | kfree_skb(ans_skb); | 503 | kfree_skb(ans_skb); |
diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index 0099da5b2591..56f80872924e 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c | |||
| @@ -1107,11 +1107,7 @@ static int netlbl_unlabel_list(struct sk_buff *skb, struct genl_info *info) | |||
| 1107 | goto list_failure; | 1107 | goto list_failure; |
| 1108 | 1108 | ||
| 1109 | genlmsg_end(ans_skb, data); | 1109 | genlmsg_end(ans_skb, data); |
| 1110 | 1110 | return genlmsg_reply(ans_skb, info); | |
| 1111 | ret_val = genlmsg_reply(ans_skb, info); | ||
| 1112 | if (ret_val != 0) | ||
| 1113 | goto list_failure; | ||
| 1114 | return 0; | ||
| 1115 | 1111 | ||
| 1116 | list_failure: | 1112 | list_failure: |
| 1117 | kfree_skb(ans_skb); | 1113 | kfree_skb(ans_skb); |
| @@ -1534,7 +1530,7 @@ static int netlbl_unlabel_staticlistdef(struct sk_buff *skb, | |||
| 1534 | } | 1530 | } |
| 1535 | } | 1531 | } |
| 1536 | list_for_each_entry_rcu(addr6, &iface->addr6_list, list) { | 1532 | list_for_each_entry_rcu(addr6, &iface->addr6_list, list) { |
| 1537 | if (addr6->valid || iter_addr6++ < skip_addr6) | 1533 | if (!addr6->valid || iter_addr6++ < skip_addr6) |
| 1538 | continue; | 1534 | continue; |
| 1539 | if (netlbl_unlabel_staticlist_gen(NLBL_UNLABEL_C_STATICLISTDEF, | 1535 | if (netlbl_unlabel_staticlist_gen(NLBL_UNLABEL_C_STATICLISTDEF, |
| 1540 | iface, | 1536 | iface, |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 9b97f8006c9c..349aba189558 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -886,7 +886,7 @@ retry: | |||
| 886 | return netlink_unicast_kernel(sk, skb); | 886 | return netlink_unicast_kernel(sk, skb); |
| 887 | 887 | ||
| 888 | if (sk_filter(sk, skb)) { | 888 | if (sk_filter(sk, skb)) { |
| 889 | int err = skb->len; | 889 | err = skb->len; |
| 890 | kfree_skb(skb); | 890 | kfree_skb(skb); |
| 891 | sock_put(sk); | 891 | sock_put(sk); |
| 892 | return err; | 892 | return err; |
diff --git a/net/netlink/attr.c b/net/netlink/attr.c index 47bbf45ae5d7..2d106cfe1d27 100644 --- a/net/netlink/attr.c +++ b/net/netlink/attr.c | |||
| @@ -132,6 +132,7 @@ errout: | |||
| 132 | * @maxtype: maximum attribute type to be expected | 132 | * @maxtype: maximum attribute type to be expected |
| 133 | * @head: head of attribute stream | 133 | * @head: head of attribute stream |
| 134 | * @len: length of attribute stream | 134 | * @len: length of attribute stream |
| 135 | * @policy: validation policy | ||
| 135 | * | 136 | * |
| 136 | * Parses a stream of attributes and stores a pointer to each attribute in | 137 | * Parses a stream of attributes and stores a pointer to each attribute in |
| 137 | * the tb array accessable via the attribute type. Attributes with a type | 138 | * the tb array accessable via the attribute type. Attributes with a type |
| @@ -194,7 +195,7 @@ struct nlattr *nla_find(struct nlattr *head, int len, int attrtype) | |||
| 194 | /** | 195 | /** |
| 195 | * nla_strlcpy - Copy string attribute payload into a sized buffer | 196 | * nla_strlcpy - Copy string attribute payload into a sized buffer |
| 196 | * @dst: where to copy the string to | 197 | * @dst: where to copy the string to |
| 197 | * @src: attribute to copy the string from | 198 | * @nla: attribute to copy the string from |
| 198 | * @dstsize: size of destination buffer | 199 | * @dstsize: size of destination buffer |
| 199 | * | 200 | * |
| 200 | * Copies at most dstsize - 1 bytes into the destination buffer. | 201 | * Copies at most dstsize - 1 bytes into the destination buffer. |
| @@ -340,9 +341,9 @@ struct nlattr *nla_reserve(struct sk_buff *skb, int attrtype, int attrlen) | |||
| 340 | } | 341 | } |
| 341 | 342 | ||
| 342 | /** | 343 | /** |
| 343 | * nla_reserve - reserve room for attribute without header | 344 | * nla_reserve_nohdr - reserve room for attribute without header |
| 344 | * @skb: socket buffer to reserve room on | 345 | * @skb: socket buffer to reserve room on |
| 345 | * @len: length of attribute payload | 346 | * @attrlen: length of attribute payload |
| 346 | * | 347 | * |
| 347 | * Reserves room for attribute payload without a header. | 348 | * Reserves room for attribute payload without a header. |
| 348 | * | 349 | * |
diff --git a/net/sched/Kconfig b/net/sched/Kconfig index 82adfe6447d7..9437b27ff84d 100644 --- a/net/sched/Kconfig +++ b/net/sched/Kconfig | |||
| @@ -106,17 +106,6 @@ config NET_SCH_PRIO | |||
| 106 | To compile this code as a module, choose M here: the | 106 | To compile this code as a module, choose M here: the |
| 107 | module will be called sch_prio. | 107 | module will be called sch_prio. |
| 108 | 108 | ||
| 109 | config NET_SCH_RR | ||
| 110 | tristate "Multi Band Round Robin Queuing (RR)" | ||
| 111 | select NET_SCH_PRIO | ||
| 112 | ---help--- | ||
| 113 | Say Y here if you want to use an n-band round robin packet | ||
| 114 | scheduler. | ||
| 115 | |||
| 116 | The module uses sch_prio for its framework and is aliased as | ||
| 117 | sch_rr, so it will load sch_prio, although it is referred | ||
| 118 | to using sch_rr. | ||
| 119 | |||
| 120 | config NET_SCH_RED | 109 | config NET_SCH_RED |
| 121 | tristate "Random Early Detection (RED)" | 110 | tristate "Random Early Detection (RED)" |
| 122 | ---help--- | 111 | ---help--- |
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index c40773cdbe45..10f01ad04380 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
| @@ -1252,12 +1252,12 @@ void tcf_destroy(struct tcf_proto *tp) | |||
| 1252 | kfree(tp); | 1252 | kfree(tp); |
| 1253 | } | 1253 | } |
| 1254 | 1254 | ||
| 1255 | void tcf_destroy_chain(struct tcf_proto *fl) | 1255 | void tcf_destroy_chain(struct tcf_proto **fl) |
| 1256 | { | 1256 | { |
| 1257 | struct tcf_proto *tp; | 1257 | struct tcf_proto *tp; |
| 1258 | 1258 | ||
| 1259 | while ((tp = fl) != NULL) { | 1259 | while ((tp = *fl) != NULL) { |
| 1260 | fl = tp->next; | 1260 | *fl = tp->next; |
| 1261 | tcf_destroy(tp); | 1261 | tcf_destroy(tp); |
| 1262 | } | 1262 | } |
| 1263 | } | 1263 | } |
diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c index 335273416384..db0e23ae85f8 100644 --- a/net/sched/sch_atm.c +++ b/net/sched/sch_atm.c | |||
| @@ -160,7 +160,7 @@ static void atm_tc_put(struct Qdisc *sch, unsigned long cl) | |||
| 160 | *prev = flow->next; | 160 | *prev = flow->next; |
| 161 | pr_debug("atm_tc_put: qdisc %p\n", flow->q); | 161 | pr_debug("atm_tc_put: qdisc %p\n", flow->q); |
| 162 | qdisc_destroy(flow->q); | 162 | qdisc_destroy(flow->q); |
| 163 | tcf_destroy_chain(flow->filter_list); | 163 | tcf_destroy_chain(&flow->filter_list); |
| 164 | if (flow->sock) { | 164 | if (flow->sock) { |
| 165 | pr_debug("atm_tc_put: f_count %d\n", | 165 | pr_debug("atm_tc_put: f_count %d\n", |
| 166 | file_count(flow->sock->file)); | 166 | file_count(flow->sock->file)); |
| @@ -586,10 +586,11 @@ static void atm_tc_destroy(struct Qdisc *sch) | |||
| 586 | struct atm_flow_data *flow; | 586 | struct atm_flow_data *flow; |
| 587 | 587 | ||
| 588 | pr_debug("atm_tc_destroy(sch %p,[qdisc %p])\n", sch, p); | 588 | pr_debug("atm_tc_destroy(sch %p,[qdisc %p])\n", sch, p); |
| 589 | for (flow = p->flows; flow; flow = flow->next) | ||
| 590 | tcf_destroy_chain(&flow->filter_list); | ||
| 591 | |||
| 589 | /* races ? */ | 592 | /* races ? */ |
| 590 | while ((flow = p->flows)) { | 593 | while ((flow = p->flows)) { |
| 591 | tcf_destroy_chain(flow->filter_list); | ||
| 592 | flow->filter_list = NULL; | ||
| 593 | if (flow->ref > 1) | 594 | if (flow->ref > 1) |
| 594 | printk(KERN_ERR "atm_destroy: %p->ref = %d\n", flow, | 595 | printk(KERN_ERR "atm_destroy: %p->ref = %d\n", flow, |
| 595 | flow->ref); | 596 | flow->ref); |
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index 09969c1fbc08..2a3c97f7dc63 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c | |||
| @@ -1704,7 +1704,7 @@ static void cbq_destroy_class(struct Qdisc *sch, struct cbq_class *cl) | |||
| 1704 | 1704 | ||
| 1705 | BUG_TRAP(!cl->filters); | 1705 | BUG_TRAP(!cl->filters); |
| 1706 | 1706 | ||
| 1707 | tcf_destroy_chain(cl->filter_list); | 1707 | tcf_destroy_chain(&cl->filter_list); |
| 1708 | qdisc_destroy(cl->q); | 1708 | qdisc_destroy(cl->q); |
| 1709 | qdisc_put_rtab(cl->R_tab); | 1709 | qdisc_put_rtab(cl->R_tab); |
| 1710 | gen_kill_estimator(&cl->bstats, &cl->rate_est); | 1710 | gen_kill_estimator(&cl->bstats, &cl->rate_est); |
| @@ -1728,10 +1728,8 @@ cbq_destroy(struct Qdisc* sch) | |||
| 1728 | * be bound to classes which have been destroyed already. --TGR '04 | 1728 | * be bound to classes which have been destroyed already. --TGR '04 |
| 1729 | */ | 1729 | */ |
| 1730 | for (h = 0; h < 16; h++) { | 1730 | for (h = 0; h < 16; h++) { |
| 1731 | for (cl = q->classes[h]; cl; cl = cl->next) { | 1731 | for (cl = q->classes[h]; cl; cl = cl->next) |
| 1732 | tcf_destroy_chain(cl->filter_list); | 1732 | tcf_destroy_chain(&cl->filter_list); |
| 1733 | cl->filter_list = NULL; | ||
| 1734 | } | ||
| 1735 | } | 1733 | } |
| 1736 | for (h = 0; h < 16; h++) { | 1734 | for (h = 0; h < 16; h++) { |
| 1737 | struct cbq_class *next; | 1735 | struct cbq_class *next; |
diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c index 64465bacbe79..c4c1317cd47d 100644 --- a/net/sched/sch_dsmark.c +++ b/net/sched/sch_dsmark.c | |||
| @@ -416,7 +416,7 @@ static void dsmark_destroy(struct Qdisc *sch) | |||
| 416 | 416 | ||
| 417 | pr_debug("dsmark_destroy(sch %p,[qdisc %p])\n", sch, p); | 417 | pr_debug("dsmark_destroy(sch %p,[qdisc %p])\n", sch, p); |
| 418 | 418 | ||
| 419 | tcf_destroy_chain(p->filter_list); | 419 | tcf_destroy_chain(&p->filter_list); |
| 420 | qdisc_destroy(p->q); | 420 | qdisc_destroy(p->q); |
| 421 | kfree(p->mask); | 421 | kfree(p->mask); |
| 422 | } | 422 | } |
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index d355e5e47fe3..13afa7214392 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
| @@ -468,7 +468,7 @@ struct Qdisc *qdisc_alloc(struct net_device *dev, struct Qdisc_ops *ops) | |||
| 468 | 468 | ||
| 469 | return sch; | 469 | return sch; |
| 470 | errout: | 470 | errout: |
| 471 | return ERR_PTR(-err); | 471 | return ERR_PTR(err); |
| 472 | } | 472 | } |
| 473 | 473 | ||
| 474 | struct Qdisc * qdisc_create_dflt(struct net_device *dev, struct Qdisc_ops *ops, | 474 | struct Qdisc * qdisc_create_dflt(struct net_device *dev, struct Qdisc_ops *ops, |
diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index fdfaa3fcc16d..e817aa00441d 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c | |||
| @@ -1123,7 +1123,7 @@ hfsc_destroy_class(struct Qdisc *sch, struct hfsc_class *cl) | |||
| 1123 | { | 1123 | { |
| 1124 | struct hfsc_sched *q = qdisc_priv(sch); | 1124 | struct hfsc_sched *q = qdisc_priv(sch); |
| 1125 | 1125 | ||
| 1126 | tcf_destroy_chain(cl->filter_list); | 1126 | tcf_destroy_chain(&cl->filter_list); |
| 1127 | qdisc_destroy(cl->qdisc); | 1127 | qdisc_destroy(cl->qdisc); |
| 1128 | gen_kill_estimator(&cl->bstats, &cl->rate_est); | 1128 | gen_kill_estimator(&cl->bstats, &cl->rate_est); |
| 1129 | if (cl != &q->root) | 1129 | if (cl != &q->root) |
| @@ -1541,6 +1541,10 @@ hfsc_destroy_qdisc(struct Qdisc *sch) | |||
| 1541 | unsigned int i; | 1541 | unsigned int i; |
| 1542 | 1542 | ||
| 1543 | for (i = 0; i < HFSC_HSIZE; i++) { | 1543 | for (i = 0; i < HFSC_HSIZE; i++) { |
| 1544 | list_for_each_entry(cl, &q->clhash[i], hlist) | ||
| 1545 | tcf_destroy_chain(&cl->filter_list); | ||
| 1546 | } | ||
| 1547 | for (i = 0; i < HFSC_HSIZE; i++) { | ||
| 1544 | list_for_each_entry_safe(cl, next, &q->clhash[i], hlist) | 1548 | list_for_each_entry_safe(cl, next, &q->clhash[i], hlist) |
| 1545 | hfsc_destroy_class(sch, cl); | 1549 | hfsc_destroy_class(sch, cl); |
| 1546 | } | 1550 | } |
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 6807c97985a5..3fb58f428f72 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
| @@ -1238,7 +1238,7 @@ static void htb_destroy_class(struct Qdisc *sch, struct htb_class *cl) | |||
| 1238 | qdisc_put_rtab(cl->rate); | 1238 | qdisc_put_rtab(cl->rate); |
| 1239 | qdisc_put_rtab(cl->ceil); | 1239 | qdisc_put_rtab(cl->ceil); |
| 1240 | 1240 | ||
| 1241 | tcf_destroy_chain(cl->filter_list); | 1241 | tcf_destroy_chain(&cl->filter_list); |
| 1242 | 1242 | ||
| 1243 | while (!list_empty(&cl->children)) | 1243 | while (!list_empty(&cl->children)) |
| 1244 | htb_destroy_class(sch, list_entry(cl->children.next, | 1244 | htb_destroy_class(sch, list_entry(cl->children.next, |
| @@ -1267,7 +1267,7 @@ static void htb_destroy(struct Qdisc *sch) | |||
| 1267 | and surprisingly it worked in 2.4. But it must precede it | 1267 | and surprisingly it worked in 2.4. But it must precede it |
| 1268 | because filter need its target class alive to be able to call | 1268 | because filter need its target class alive to be able to call |
| 1269 | unbind_filter on it (without Oops). */ | 1269 | unbind_filter on it (without Oops). */ |
| 1270 | tcf_destroy_chain(q->filter_list); | 1270 | tcf_destroy_chain(&q->filter_list); |
| 1271 | 1271 | ||
| 1272 | while (!list_empty(&q->root)) | 1272 | while (!list_empty(&q->root)) |
| 1273 | htb_destroy_class(sch, list_entry(q->root.next, | 1273 | htb_destroy_class(sch, list_entry(q->root.next, |
diff --git a/net/sched/sch_ingress.c b/net/sched/sch_ingress.c index 274b1ddb160c..956c80ad5965 100644 --- a/net/sched/sch_ingress.c +++ b/net/sched/sch_ingress.c | |||
| @@ -104,7 +104,7 @@ static void ingress_destroy(struct Qdisc *sch) | |||
| 104 | { | 104 | { |
| 105 | struct ingress_qdisc_data *p = qdisc_priv(sch); | 105 | struct ingress_qdisc_data *p = qdisc_priv(sch); |
| 106 | 106 | ||
| 107 | tcf_destroy_chain(p->filter_list); | 107 | tcf_destroy_chain(&p->filter_list); |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | static int ingress_dump(struct Qdisc *sch, struct sk_buff *skb) | 110 | static int ingress_dump(struct Qdisc *sch, struct sk_buff *skb) |
diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index 4aa2b45dad0a..5532f1031ab5 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c | |||
| @@ -219,7 +219,7 @@ prio_destroy(struct Qdisc* sch) | |||
| 219 | int prio; | 219 | int prio; |
| 220 | struct prio_sched_data *q = qdisc_priv(sch); | 220 | struct prio_sched_data *q = qdisc_priv(sch); |
| 221 | 221 | ||
| 222 | tcf_destroy_chain(q->filter_list); | 222 | tcf_destroy_chain(&q->filter_list); |
| 223 | for (prio=0; prio<q->bands; prio++) | 223 | for (prio=0; prio<q->bands; prio++) |
| 224 | qdisc_destroy(q->queues[prio]); | 224 | qdisc_destroy(q->queues[prio]); |
| 225 | } | 225 | } |
diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index f0463d757a98..6a97afbfb952 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c | |||
| @@ -520,7 +520,7 @@ static void sfq_destroy(struct Qdisc *sch) | |||
| 520 | { | 520 | { |
| 521 | struct sfq_sched_data *q = qdisc_priv(sch); | 521 | struct sfq_sched_data *q = qdisc_priv(sch); |
| 522 | 522 | ||
| 523 | tcf_destroy_chain(q->filter_list); | 523 | tcf_destroy_chain(&q->filter_list); |
| 524 | q->perturb_period = 0; | 524 | q->perturb_period = 0; |
| 525 | del_timer_sync(&q->perturb_timer); | 525 | del_timer_sync(&q->perturb_timer); |
| 526 | } | 526 | } |
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 0c9d5a6950fe..fcdb45d1071b 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
| @@ -5899,12 +5899,6 @@ static int sctp_eat_data(const struct sctp_association *asoc, | |||
| 5899 | return SCTP_IERROR_NO_DATA; | 5899 | return SCTP_IERROR_NO_DATA; |
| 5900 | } | 5900 | } |
| 5901 | 5901 | ||
| 5902 | /* If definately accepting the DATA chunk, record its TSN, otherwise | ||
| 5903 | * wait for renege processing. | ||
| 5904 | */ | ||
| 5905 | if (SCTP_CMD_CHUNK_ULP == deliver) | ||
| 5906 | sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_TSN, SCTP_U32(tsn)); | ||
| 5907 | |||
| 5908 | chunk->data_accepted = 1; | 5902 | chunk->data_accepted = 1; |
| 5909 | 5903 | ||
| 5910 | /* Note: Some chunks may get overcounted (if we drop) or overcounted | 5904 | /* Note: Some chunks may get overcounted (if we drop) or overcounted |
| @@ -5924,6 +5918,9 @@ static int sctp_eat_data(const struct sctp_association *asoc, | |||
| 5924 | * and discard the DATA chunk. | 5918 | * and discard the DATA chunk. |
| 5925 | */ | 5919 | */ |
| 5926 | if (ntohs(data_hdr->stream) >= asoc->c.sinit_max_instreams) { | 5920 | if (ntohs(data_hdr->stream) >= asoc->c.sinit_max_instreams) { |
| 5921 | /* Mark tsn as received even though we drop it */ | ||
| 5922 | sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_TSN, SCTP_U32(tsn)); | ||
| 5923 | |||
| 5927 | err = sctp_make_op_error(asoc, chunk, SCTP_ERROR_INV_STRM, | 5924 | err = sctp_make_op_error(asoc, chunk, SCTP_ERROR_INV_STRM, |
| 5928 | &data_hdr->stream, | 5925 | &data_hdr->stream, |
| 5929 | sizeof(data_hdr->stream)); | 5926 | sizeof(data_hdr->stream)); |
diff --git a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c index ce6cda6b6994..a1f654aea268 100644 --- a/net/sctp/ulpevent.c +++ b/net/sctp/ulpevent.c | |||
| @@ -710,6 +710,11 @@ struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc, | |||
| 710 | if (!skb) | 710 | if (!skb) |
| 711 | goto fail; | 711 | goto fail; |
| 712 | 712 | ||
| 713 | /* Now that all memory allocations for this chunk succeeded, we | ||
| 714 | * can mark it as received so the tsn_map is updated correctly. | ||
| 715 | */ | ||
| 716 | sctp_tsnmap_mark(&asoc->peer.tsn_map, ntohl(chunk->subh.data_hdr->tsn)); | ||
| 717 | |||
| 713 | /* First calculate the padding, so we don't inadvertently | 718 | /* First calculate the padding, so we don't inadvertently |
| 714 | * pass up the wrong length to the user. | 719 | * pass up the wrong length to the user. |
| 715 | * | 720 | * |
diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c index 5905d56737d6..81ae3d62a0cc 100644 --- a/net/sunrpc/auth_gss/svcauth_gss.c +++ b/net/sunrpc/auth_gss/svcauth_gss.c | |||
| @@ -1144,20 +1144,20 @@ svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp) | |||
| 1144 | case RPC_GSS_SVC_NONE: | 1144 | case RPC_GSS_SVC_NONE: |
| 1145 | break; | 1145 | break; |
| 1146 | case RPC_GSS_SVC_INTEGRITY: | 1146 | case RPC_GSS_SVC_INTEGRITY: |
| 1147 | /* placeholders for length and seq. number: */ | ||
| 1148 | svc_putnl(resv, 0); | ||
| 1149 | svc_putnl(resv, 0); | ||
| 1147 | if (unwrap_integ_data(&rqstp->rq_arg, | 1150 | if (unwrap_integ_data(&rqstp->rq_arg, |
| 1148 | gc->gc_seq, rsci->mechctx)) | 1151 | gc->gc_seq, rsci->mechctx)) |
| 1149 | goto garbage_args; | 1152 | goto garbage_args; |
| 1153 | break; | ||
| 1154 | case RPC_GSS_SVC_PRIVACY: | ||
| 1150 | /* placeholders for length and seq. number: */ | 1155 | /* placeholders for length and seq. number: */ |
| 1151 | svc_putnl(resv, 0); | 1156 | svc_putnl(resv, 0); |
| 1152 | svc_putnl(resv, 0); | 1157 | svc_putnl(resv, 0); |
| 1153 | break; | ||
| 1154 | case RPC_GSS_SVC_PRIVACY: | ||
| 1155 | if (unwrap_priv_data(rqstp, &rqstp->rq_arg, | 1158 | if (unwrap_priv_data(rqstp, &rqstp->rq_arg, |
| 1156 | gc->gc_seq, rsci->mechctx)) | 1159 | gc->gc_seq, rsci->mechctx)) |
| 1157 | goto garbage_args; | 1160 | goto garbage_args; |
| 1158 | /* placeholders for length and seq. number: */ | ||
| 1159 | svc_putnl(resv, 0); | ||
| 1160 | svc_putnl(resv, 0); | ||
| 1161 | break; | 1161 | break; |
| 1162 | default: | 1162 | default: |
| 1163 | goto auth_err; | 1163 | goto auth_err; |
| @@ -1170,8 +1170,6 @@ svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp) | |||
| 1170 | goto out; | 1170 | goto out; |
| 1171 | } | 1171 | } |
| 1172 | garbage_args: | 1172 | garbage_args: |
| 1173 | /* Restore write pointer to its original value: */ | ||
| 1174 | xdr_ressize_check(rqstp, reject_stat); | ||
| 1175 | ret = SVC_GARBAGE; | 1173 | ret = SVC_GARBAGE; |
| 1176 | goto out; | 1174 | goto out; |
| 1177 | auth_err: | 1175 | auth_err: |
diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c index 0517967a68bf..e6fb21b19b86 100644 --- a/net/sunrpc/rpcb_clnt.c +++ b/net/sunrpc/rpcb_clnt.c | |||
| @@ -243,10 +243,10 @@ int rpcb_getport_sync(struct sockaddr_in *sin, u32 prog, u32 vers, int prot) | |||
| 243 | } | 243 | } |
| 244 | EXPORT_SYMBOL_GPL(rpcb_getport_sync); | 244 | EXPORT_SYMBOL_GPL(rpcb_getport_sync); |
| 245 | 245 | ||
| 246 | static struct rpc_task *rpcb_call_async(struct rpc_clnt *rpcb_clnt, struct rpcbind_args *map, int version) | 246 | static struct rpc_task *rpcb_call_async(struct rpc_clnt *rpcb_clnt, struct rpcbind_args *map, struct rpc_procinfo *proc) |
| 247 | { | 247 | { |
| 248 | struct rpc_message msg = { | 248 | struct rpc_message msg = { |
| 249 | .rpc_proc = rpcb_next_version[version].rpc_proc, | 249 | .rpc_proc = proc, |
| 250 | .rpc_argp = map, | 250 | .rpc_argp = map, |
| 251 | .rpc_resp = &map->r_port, | 251 | .rpc_resp = &map->r_port, |
| 252 | }; | 252 | }; |
| @@ -271,6 +271,7 @@ static struct rpc_task *rpcb_call_async(struct rpc_clnt *rpcb_clnt, struct rpcbi | |||
| 271 | void rpcb_getport_async(struct rpc_task *task) | 271 | void rpcb_getport_async(struct rpc_task *task) |
| 272 | { | 272 | { |
| 273 | struct rpc_clnt *clnt = task->tk_client; | 273 | struct rpc_clnt *clnt = task->tk_client; |
| 274 | struct rpc_procinfo *proc; | ||
| 274 | u32 bind_version; | 275 | u32 bind_version; |
| 275 | struct rpc_xprt *xprt = task->tk_xprt; | 276 | struct rpc_xprt *xprt = task->tk_xprt; |
| 276 | struct rpc_clnt *rpcb_clnt; | 277 | struct rpc_clnt *rpcb_clnt; |
| @@ -280,7 +281,6 @@ void rpcb_getport_async(struct rpc_task *task) | |||
| 280 | struct sockaddr *sap = (struct sockaddr *)&addr; | 281 | struct sockaddr *sap = (struct sockaddr *)&addr; |
| 281 | size_t salen; | 282 | size_t salen; |
| 282 | int status; | 283 | int status; |
| 283 | struct rpcb_info *info; | ||
| 284 | 284 | ||
| 285 | dprintk("RPC: %5u %s(%s, %u, %u, %d)\n", | 285 | dprintk("RPC: %5u %s(%s, %u, %u, %d)\n", |
| 286 | task->tk_pid, __func__, | 286 | task->tk_pid, __func__, |
| @@ -313,10 +313,12 @@ void rpcb_getport_async(struct rpc_task *task) | |||
| 313 | /* Don't ever use rpcbind v2 for AF_INET6 requests */ | 313 | /* Don't ever use rpcbind v2 for AF_INET6 requests */ |
| 314 | switch (sap->sa_family) { | 314 | switch (sap->sa_family) { |
| 315 | case AF_INET: | 315 | case AF_INET: |
| 316 | info = rpcb_next_version; | 316 | proc = rpcb_next_version[xprt->bind_index].rpc_proc; |
| 317 | bind_version = rpcb_next_version[xprt->bind_index].rpc_vers; | ||
| 317 | break; | 318 | break; |
| 318 | case AF_INET6: | 319 | case AF_INET6: |
| 319 | info = rpcb_next_version6; | 320 | proc = rpcb_next_version6[xprt->bind_index].rpc_proc; |
| 321 | bind_version = rpcb_next_version6[xprt->bind_index].rpc_vers; | ||
| 320 | break; | 322 | break; |
| 321 | default: | 323 | default: |
| 322 | status = -EAFNOSUPPORT; | 324 | status = -EAFNOSUPPORT; |
| @@ -324,14 +326,13 @@ void rpcb_getport_async(struct rpc_task *task) | |||
| 324 | task->tk_pid, __func__); | 326 | task->tk_pid, __func__); |
| 325 | goto bailout_nofree; | 327 | goto bailout_nofree; |
| 326 | } | 328 | } |
| 327 | if (info[xprt->bind_index].rpc_proc == NULL) { | 329 | if (proc == NULL) { |
| 328 | xprt->bind_index = 0; | 330 | xprt->bind_index = 0; |
| 329 | status = -EPFNOSUPPORT; | 331 | status = -EPFNOSUPPORT; |
| 330 | dprintk("RPC: %5u %s: no more getport versions available\n", | 332 | dprintk("RPC: %5u %s: no more getport versions available\n", |
| 331 | task->tk_pid, __func__); | 333 | task->tk_pid, __func__); |
| 332 | goto bailout_nofree; | 334 | goto bailout_nofree; |
| 333 | } | 335 | } |
| 334 | bind_version = info[xprt->bind_index].rpc_vers; | ||
| 335 | 336 | ||
| 336 | dprintk("RPC: %5u %s: trying rpcbind version %u\n", | 337 | dprintk("RPC: %5u %s: trying rpcbind version %u\n", |
| 337 | task->tk_pid, __func__, bind_version); | 338 | task->tk_pid, __func__, bind_version); |
| @@ -361,22 +362,20 @@ void rpcb_getport_async(struct rpc_task *task) | |||
| 361 | map->r_addr = rpc_peeraddr2str(rpcb_clnt, RPC_DISPLAY_UNIVERSAL_ADDR); | 362 | map->r_addr = rpc_peeraddr2str(rpcb_clnt, RPC_DISPLAY_UNIVERSAL_ADDR); |
| 362 | map->r_owner = RPCB_OWNER_STRING; /* ignored for GETADDR */ | 363 | map->r_owner = RPCB_OWNER_STRING; /* ignored for GETADDR */ |
| 363 | 364 | ||
| 364 | child = rpcb_call_async(rpcb_clnt, map, xprt->bind_index); | 365 | child = rpcb_call_async(rpcb_clnt, map, proc); |
| 365 | rpc_release_client(rpcb_clnt); | 366 | rpc_release_client(rpcb_clnt); |
| 366 | if (IS_ERR(child)) { | 367 | if (IS_ERR(child)) { |
| 367 | status = -EIO; | 368 | status = -EIO; |
| 369 | /* rpcb_map_release() has freed the arguments */ | ||
| 368 | dprintk("RPC: %5u %s: rpc_run_task failed\n", | 370 | dprintk("RPC: %5u %s: rpc_run_task failed\n", |
| 369 | task->tk_pid, __func__); | 371 | task->tk_pid, __func__); |
| 370 | goto bailout; | 372 | goto bailout_nofree; |
| 371 | } | 373 | } |
| 372 | rpc_put_task(child); | 374 | rpc_put_task(child); |
| 373 | 375 | ||
| 374 | task->tk_xprt->stat.bind_count++; | 376 | task->tk_xprt->stat.bind_count++; |
| 375 | return; | 377 | return; |
| 376 | 378 | ||
| 377 | bailout: | ||
| 378 | kfree(map); | ||
| 379 | xprt_put(xprt); | ||
| 380 | bailout_nofree: | 379 | bailout_nofree: |
| 381 | rpcb_wake_rpcbind_waiters(xprt, status); | 380 | rpcb_wake_rpcbind_waiters(xprt, status); |
| 382 | bailout_nowake: | 381 | bailout_nowake: |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 657835f227d3..783317dacd30 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
| @@ -487,8 +487,8 @@ static int unix_socketpair(struct socket *, struct socket *); | |||
| 487 | static int unix_accept(struct socket *, struct socket *, int); | 487 | static int unix_accept(struct socket *, struct socket *, int); |
| 488 | static int unix_getname(struct socket *, struct sockaddr *, int *, int); | 488 | static int unix_getname(struct socket *, struct sockaddr *, int *, int); |
| 489 | static unsigned int unix_poll(struct file *, struct socket *, poll_table *); | 489 | static unsigned int unix_poll(struct file *, struct socket *, poll_table *); |
| 490 | static unsigned int unix_datagram_poll(struct file *, struct socket *, | 490 | static unsigned int unix_dgram_poll(struct file *, struct socket *, |
| 491 | poll_table *); | 491 | poll_table *); |
| 492 | static int unix_ioctl(struct socket *, unsigned int, unsigned long); | 492 | static int unix_ioctl(struct socket *, unsigned int, unsigned long); |
| 493 | static int unix_shutdown(struct socket *, int); | 493 | static int unix_shutdown(struct socket *, int); |
| 494 | static int unix_stream_sendmsg(struct kiocb *, struct socket *, | 494 | static int unix_stream_sendmsg(struct kiocb *, struct socket *, |
| @@ -534,7 +534,7 @@ static const struct proto_ops unix_dgram_ops = { | |||
| 534 | .socketpair = unix_socketpair, | 534 | .socketpair = unix_socketpair, |
| 535 | .accept = sock_no_accept, | 535 | .accept = sock_no_accept, |
| 536 | .getname = unix_getname, | 536 | .getname = unix_getname, |
| 537 | .poll = unix_datagram_poll, | 537 | .poll = unix_dgram_poll, |
| 538 | .ioctl = unix_ioctl, | 538 | .ioctl = unix_ioctl, |
| 539 | .listen = sock_no_listen, | 539 | .listen = sock_no_listen, |
| 540 | .shutdown = unix_shutdown, | 540 | .shutdown = unix_shutdown, |
| @@ -555,7 +555,7 @@ static const struct proto_ops unix_seqpacket_ops = { | |||
| 555 | .socketpair = unix_socketpair, | 555 | .socketpair = unix_socketpair, |
| 556 | .accept = unix_accept, | 556 | .accept = unix_accept, |
| 557 | .getname = unix_getname, | 557 | .getname = unix_getname, |
| 558 | .poll = unix_datagram_poll, | 558 | .poll = unix_dgram_poll, |
| 559 | .ioctl = unix_ioctl, | 559 | .ioctl = unix_ioctl, |
| 560 | .listen = unix_listen, | 560 | .listen = unix_listen, |
| 561 | .shutdown = unix_shutdown, | 561 | .shutdown = unix_shutdown, |
| @@ -1994,29 +1994,13 @@ static unsigned int unix_poll(struct file * file, struct socket *sock, poll_tabl | |||
| 1994 | return mask; | 1994 | return mask; |
| 1995 | } | 1995 | } |
| 1996 | 1996 | ||
| 1997 | static unsigned int unix_datagram_poll(struct file *file, struct socket *sock, | 1997 | static unsigned int unix_dgram_poll(struct file *file, struct socket *sock, |
| 1998 | poll_table *wait) | 1998 | poll_table *wait) |
| 1999 | { | 1999 | { |
| 2000 | struct sock *sk = sock->sk, *peer; | 2000 | struct sock *sk = sock->sk, *other; |
| 2001 | unsigned int mask; | 2001 | unsigned int mask, writable; |
| 2002 | 2002 | ||
| 2003 | poll_wait(file, sk->sk_sleep, wait); | 2003 | poll_wait(file, sk->sk_sleep, wait); |
| 2004 | |||
| 2005 | peer = unix_peer_get(sk); | ||
| 2006 | if (peer) { | ||
| 2007 | if (peer != sk) { | ||
| 2008 | /* | ||
| 2009 | * Writability of a connected socket additionally | ||
| 2010 | * depends on the state of the receive queue of the | ||
| 2011 | * peer. | ||
| 2012 | */ | ||
| 2013 | poll_wait(file, &unix_sk(peer)->peer_wait, wait); | ||
| 2014 | } else { | ||
| 2015 | sock_put(peer); | ||
| 2016 | peer = NULL; | ||
| 2017 | } | ||
| 2018 | } | ||
| 2019 | |||
| 2020 | mask = 0; | 2004 | mask = 0; |
| 2021 | 2005 | ||
| 2022 | /* exceptional events? */ | 2006 | /* exceptional events? */ |
| @@ -2042,14 +2026,26 @@ static unsigned int unix_datagram_poll(struct file *file, struct socket *sock, | |||
| 2042 | } | 2026 | } |
| 2043 | 2027 | ||
| 2044 | /* writable? */ | 2028 | /* writable? */ |
| 2045 | if (unix_writable(sk) && !(peer && unix_recvq_full(peer))) | 2029 | writable = unix_writable(sk); |
| 2030 | if (writable) { | ||
| 2031 | other = unix_peer_get(sk); | ||
| 2032 | if (other) { | ||
| 2033 | if (unix_peer(other) != sk) { | ||
| 2034 | poll_wait(file, &unix_sk(other)->peer_wait, | ||
| 2035 | wait); | ||
| 2036 | if (unix_recvq_full(other)) | ||
| 2037 | writable = 0; | ||
| 2038 | } | ||
| 2039 | |||
| 2040 | sock_put(other); | ||
| 2041 | } | ||
| 2042 | } | ||
| 2043 | |||
| 2044 | if (writable) | ||
| 2046 | mask |= POLLOUT | POLLWRNORM | POLLWRBAND; | 2045 | mask |= POLLOUT | POLLWRNORM | POLLWRBAND; |
| 2047 | else | 2046 | else |
| 2048 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); | 2047 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); |
| 2049 | 2048 | ||
| 2050 | if (peer) | ||
| 2051 | sock_put(peer); | ||
| 2052 | |||
| 2053 | return mask; | 2049 | return mask; |
| 2054 | } | 2050 | } |
| 2055 | 2051 | ||
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 185488da2466..855bff4b3250 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
| @@ -80,6 +80,23 @@ static const struct ieee80211_channel_range ieee80211_JP_channels[] = { | |||
| 80 | IEEE80211_CHAN_RADAR), | 80 | IEEE80211_CHAN_RADAR), |
| 81 | }; | 81 | }; |
| 82 | 82 | ||
| 83 | static const struct ieee80211_channel_range ieee80211_EU_channels[] = { | ||
| 84 | /* IEEE 802.11b/g, channels 1..13 */ | ||
| 85 | RANGE_PWR(2412, 2472, 20, 6, 0), | ||
| 86 | /* IEEE 802.11a, channel 36*/ | ||
| 87 | RANGE_PWR(5180, 5180, 23, 6, IEEE80211_CHAN_PASSIVE_SCAN), | ||
| 88 | /* IEEE 802.11a, channel 40*/ | ||
| 89 | RANGE_PWR(5200, 5200, 23, 6, IEEE80211_CHAN_PASSIVE_SCAN), | ||
| 90 | /* IEEE 802.11a, channel 44*/ | ||
| 91 | RANGE_PWR(5220, 5220, 23, 6, IEEE80211_CHAN_PASSIVE_SCAN), | ||
| 92 | /* IEEE 802.11a, channels 48..64 */ | ||
| 93 | RANGE_PWR(5240, 5320, 23, 6, IEEE80211_CHAN_NO_IBSS | | ||
| 94 | IEEE80211_CHAN_RADAR), | ||
| 95 | /* IEEE 802.11a, channels 100..140 */ | ||
| 96 | RANGE_PWR(5500, 5700, 30, 6, IEEE80211_CHAN_NO_IBSS | | ||
| 97 | IEEE80211_CHAN_RADAR), | ||
| 98 | }; | ||
| 99 | |||
| 83 | #define REGDOM(_code) \ | 100 | #define REGDOM(_code) \ |
| 84 | { \ | 101 | { \ |
| 85 | .code = __stringify(_code), \ | 102 | .code = __stringify(_code), \ |
| @@ -90,6 +107,7 @@ static const struct ieee80211_channel_range ieee80211_JP_channels[] = { | |||
| 90 | static const struct ieee80211_regdomain ieee80211_regdoms[] = { | 107 | static const struct ieee80211_regdomain ieee80211_regdoms[] = { |
| 91 | REGDOM(US), | 108 | REGDOM(US), |
| 92 | REGDOM(JP), | 109 | REGDOM(JP), |
| 110 | REGDOM(EU), | ||
| 93 | }; | 111 | }; |
| 94 | 112 | ||
| 95 | 113 | ||
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index b976d9ed10e4..04c41504f84c 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
| @@ -277,9 +277,8 @@ static void copy_from_user_state(struct xfrm_state *x, struct xfrm_usersa_info * | |||
| 277 | memcpy(&x->props.saddr, &p->saddr, sizeof(x->props.saddr)); | 277 | memcpy(&x->props.saddr, &p->saddr, sizeof(x->props.saddr)); |
| 278 | x->props.flags = p->flags; | 278 | x->props.flags = p->flags; |
| 279 | 279 | ||
| 280 | if (!x->sel.family) | 280 | if (!x->sel.family && !(p->flags & XFRM_STATE_AF_UNSPEC)) |
| 281 | x->sel.family = p->family; | 281 | x->sel.family = p->family; |
| 282 | |||
| 283 | } | 282 | } |
| 284 | 283 | ||
| 285 | /* | 284 | /* |
diff --git a/security/commoncap.c b/security/commoncap.c index 5edabc7542ae..33d343308413 100644 --- a/security/commoncap.c +++ b/security/commoncap.c | |||
| @@ -103,10 +103,16 @@ static inline int cap_inh_is_capped(void) | |||
| 103 | return (cap_capable(current, CAP_SETPCAP) != 0); | 103 | return (cap_capable(current, CAP_SETPCAP) != 0); |
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | static inline int cap_limit_ptraced_target(void) { return 1; } | ||
| 107 | |||
| 106 | #else /* ie., ndef CONFIG_SECURITY_FILE_CAPABILITIES */ | 108 | #else /* ie., ndef CONFIG_SECURITY_FILE_CAPABILITIES */ |
| 107 | 109 | ||
| 108 | static inline int cap_block_setpcap(struct task_struct *t) { return 0; } | 110 | static inline int cap_block_setpcap(struct task_struct *t) { return 0; } |
| 109 | static inline int cap_inh_is_capped(void) { return 1; } | 111 | static inline int cap_inh_is_capped(void) { return 1; } |
| 112 | static inline int cap_limit_ptraced_target(void) | ||
| 113 | { | ||
| 114 | return !capable(CAP_SETPCAP); | ||
| 115 | } | ||
| 110 | 116 | ||
| 111 | #endif /* def CONFIG_SECURITY_FILE_CAPABILITIES */ | 117 | #endif /* def CONFIG_SECURITY_FILE_CAPABILITIES */ |
| 112 | 118 | ||
| @@ -342,9 +348,10 @@ void cap_bprm_apply_creds (struct linux_binprm *bprm, int unsafe) | |||
| 342 | bprm->e_uid = current->uid; | 348 | bprm->e_uid = current->uid; |
| 343 | bprm->e_gid = current->gid; | 349 | bprm->e_gid = current->gid; |
| 344 | } | 350 | } |
| 345 | if (!capable (CAP_SETPCAP)) { | 351 | if (cap_limit_ptraced_target()) { |
| 346 | new_permitted = cap_intersect (new_permitted, | 352 | new_permitted = |
| 347 | current->cap_permitted); | 353 | cap_intersect(new_permitted, |
| 354 | current->cap_permitted); | ||
| 348 | } | 355 | } |
| 349 | } | 356 | } |
| 350 | } | 357 | } |
diff --git a/security/device_cgroup.c b/security/device_cgroup.c index baf348834b66..ddd92cec78ed 100644 --- a/security/device_cgroup.c +++ b/security/device_cgroup.c | |||
| @@ -222,7 +222,7 @@ static void devcgroup_destroy(struct cgroup_subsys *ss, | |||
| 222 | #define DEVCG_DENY 2 | 222 | #define DEVCG_DENY 2 |
| 223 | #define DEVCG_LIST 3 | 223 | #define DEVCG_LIST 3 |
| 224 | 224 | ||
| 225 | #define MAJMINLEN 10 | 225 | #define MAJMINLEN 13 |
| 226 | #define ACCLEN 4 | 226 | #define ACCLEN 4 |
| 227 | 227 | ||
| 228 | static void set_access(char *acc, short access) | 228 | static void set_access(char *acc, short access) |
| @@ -254,7 +254,7 @@ static void set_majmin(char *str, unsigned m) | |||
| 254 | if (m == ~0) | 254 | if (m == ~0) |
| 255 | sprintf(str, "*"); | 255 | sprintf(str, "*"); |
| 256 | else | 256 | else |
| 257 | snprintf(str, MAJMINLEN, "%d", m); | 257 | snprintf(str, MAJMINLEN, "%u", m); |
| 258 | } | 258 | } |
| 259 | 259 | ||
| 260 | static int devcgroup_seq_read(struct cgroup *cgroup, struct cftype *cft, | 260 | static int devcgroup_seq_read(struct cgroup *cgroup, struct cftype *cft, |
| @@ -300,7 +300,7 @@ static int may_access_whitelist(struct dev_cgroup *c, | |||
| 300 | continue; | 300 | continue; |
| 301 | if (whitem->minor != ~0 && whitem->minor != refwh->minor) | 301 | if (whitem->minor != ~0 && whitem->minor != refwh->minor) |
| 302 | continue; | 302 | continue; |
| 303 | if (refwh->access & (~(whitem->access | ACC_MASK))) | 303 | if (refwh->access & (~whitem->access)) |
| 304 | continue; | 304 | continue; |
| 305 | return 1; | 305 | return 1; |
| 306 | } | 306 | } |
| @@ -382,6 +382,8 @@ static ssize_t devcgroup_access_write(struct cgroup *cgroup, struct cftype *cft, | |||
| 382 | case 'a': | 382 | case 'a': |
| 383 | wh.type = DEV_ALL; | 383 | wh.type = DEV_ALL; |
| 384 | wh.access = ACC_MASK; | 384 | wh.access = ACC_MASK; |
| 385 | wh.major = ~0; | ||
| 386 | wh.minor = ~0; | ||
| 385 | goto handle; | 387 | goto handle; |
| 386 | case 'b': | 388 | case 'b': |
| 387 | wh.type = DEV_BLOCK; | 389 | wh.type = DEV_BLOCK; |
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index 1dcf9f3d1107..44589088941f 100644 --- a/virt/kvm/ioapic.c +++ b/virt/kvm/ioapic.c | |||
| @@ -278,7 +278,7 @@ static void __kvm_ioapic_update_eoi(struct kvm_ioapic *ioapic, int gsi) | |||
| 278 | 278 | ||
| 279 | ent->fields.remote_irr = 0; | 279 | ent->fields.remote_irr = 0; |
| 280 | if (!ent->fields.mask && (ioapic->irr & (1 << gsi))) | 280 | if (!ent->fields.mask && (ioapic->irr & (1 << gsi))) |
| 281 | ioapic_deliver(ioapic, gsi); | 281 | ioapic_service(ioapic, gsi); |
| 282 | } | 282 | } |
| 283 | 283 | ||
| 284 | void kvm_ioapic_update_eoi(struct kvm *kvm, int vector) | 284 | void kvm_ioapic_update_eoi(struct kvm *kvm, int vector) |
