diff options
author | David Woodhouse <dwmw2@infradead.org> | 2006-12-01 04:56:43 -0500 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2006-12-01 04:56:43 -0500 |
commit | bd3c97a7c718bfb9f1e4f31c16c383a5c6f815eb (patch) | |
tree | 3f56594e813c6f35cbacbdb3e137ba5bfd0b3069 | |
parent | 6c33cafc794d07c9254c160789120a0e98c088c9 (diff) | |
parent | 0215ffb08ce99e2bb59eca114a99499a4d06e704 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
1188 files changed, 14713 insertions, 10015 deletions
diff --git a/.gitignore b/.gitignore index e1d5c17c12c2..9eb4b7711499 100644 --- a/.gitignore +++ b/.gitignore | |||
@@ -20,6 +20,7 @@ | |||
20 | # Top-level generic files | 20 | # Top-level generic files |
21 | # | 21 | # |
22 | tags | 22 | tags |
23 | TAGS | ||
23 | vmlinux* | 24 | vmlinux* |
24 | System.map | 25 | System.map |
25 | Module.symvers | 26 | Module.symvers |
@@ -45,7 +45,7 @@ S: Longford, Ireland | |||
45 | S: Sydney, Australia | 45 | S: Sydney, Australia |
46 | 46 | ||
47 | N: Tigran A. Aivazian | 47 | N: Tigran A. Aivazian |
48 | E: tigran@veritas.com | 48 | E: tigran@aivazian.fsnet.co.uk |
49 | W: http://www.moses.uklinux.net/patches | 49 | W: http://www.moses.uklinux.net/patches |
50 | D: BFS filesystem | 50 | D: BFS filesystem |
51 | D: Intel IA32 CPU microcode update support | 51 | D: Intel IA32 CPU microcode update support |
@@ -3511,14 +3511,12 @@ D: The Linux Support Team Erlangen | |||
3511 | 3511 | ||
3512 | N: David Weinehall | 3512 | N: David Weinehall |
3513 | E: tao@acc.umu.se | 3513 | E: tao@acc.umu.se |
3514 | P: 1024D/DC47CA16 7ACE 0FB0 7A74 F994 9B36 E1D1 D14E 8526 DC47 CA16 | ||
3514 | W: http://www.acc.umu.se/~tao/ | 3515 | W: http://www.acc.umu.se/~tao/ |
3515 | W: http://www.acc.umu.se/~mcalinux/ | 3516 | D: v2.0 kernel maintainer |
3516 | D: Fixes for the NE/2-driver | 3517 | D: Fixes for the NE/2-driver |
3517 | D: Miscellaneous MCA-support | 3518 | D: Miscellaneous MCA-support |
3518 | D: Cleanup of the Config-files | 3519 | D: Cleanup of the Config-files |
3519 | S: Axtorpsvagen 40:20 | ||
3520 | S: S-903 37 UMEA | ||
3521 | S: Sweden | ||
3522 | 3520 | ||
3523 | N: Matt Welsh | 3521 | N: Matt Welsh |
3524 | E: mdw@metalab.unc.edu | 3522 | E: mdw@metalab.unc.edu |
diff --git a/Documentation/ABI/testing/sysfs-power b/Documentation/ABI/testing/sysfs-power index d882f8093871..dcff4d0623ad 100644 --- a/Documentation/ABI/testing/sysfs-power +++ b/Documentation/ABI/testing/sysfs-power | |||
@@ -21,7 +21,7 @@ Description: | |||
21 | these states. | 21 | these states. |
22 | 22 | ||
23 | What: /sys/power/disk | 23 | What: /sys/power/disk |
24 | Date: August 2006 | 24 | Date: September 2006 |
25 | Contact: Rafael J. Wysocki <rjw@sisk.pl> | 25 | Contact: Rafael J. Wysocki <rjw@sisk.pl> |
26 | Description: | 26 | Description: |
27 | The /sys/power/disk file controls the operating mode of the | 27 | The /sys/power/disk file controls the operating mode of the |
@@ -39,6 +39,19 @@ Description: | |||
39 | 'reboot' - the memory image will be saved by the kernel and | 39 | 'reboot' - the memory image will be saved by the kernel and |
40 | the system will be rebooted. | 40 | the system will be rebooted. |
41 | 41 | ||
42 | Additionally, /sys/power/disk can be used to turn on one of the | ||
43 | two testing modes of the suspend-to-disk mechanism: 'testproc' | ||
44 | or 'test'. If the suspend-to-disk mechanism is in the | ||
45 | 'testproc' mode, writing 'disk' to /sys/power/state will cause | ||
46 | the kernel to disable nonboot CPUs and freeze tasks, wait for 5 | ||
47 | seconds, unfreeze tasks and enable nonboot CPUs. If it is in | ||
48 | the 'test' mode, writing 'disk' to /sys/power/state will cause | ||
49 | the kernel to disable nonboot CPUs and freeze tasks, shrink | ||
50 | memory, suspend devices, wait for 5 seconds, resume devices, | ||
51 | unfreeze tasks and enable nonboot CPUs. Then, we are able to | ||
52 | look in the log messages and work out, for example, which code | ||
53 | is being slow and which device drivers are misbehaving. | ||
54 | |||
42 | The suspend-to-disk method may be chosen by writing to this | 55 | The suspend-to-disk method may be chosen by writing to this |
43 | file one of the accepted strings: | 56 | file one of the accepted strings: |
44 | 57 | ||
@@ -46,6 +59,8 @@ Description: | |||
46 | 'platform' | 59 | 'platform' |
47 | 'shutdown' | 60 | 'shutdown' |
48 | 'reboot' | 61 | 'reboot' |
62 | 'testproc' | ||
63 | 'test' | ||
49 | 64 | ||
50 | It will only change to 'firmware' or 'platform' if the system | 65 | It will only change to 'firmware' or 'platform' if the system |
51 | supports that. | 66 | supports that. |
diff --git a/Documentation/DocBook/Makefile b/Documentation/DocBook/Makefile index 66e1cf733571..db9499adbed4 100644 --- a/Documentation/DocBook/Makefile +++ b/Documentation/DocBook/Makefile | |||
@@ -9,7 +9,7 @@ | |||
9 | DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \ | 9 | DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \ |
10 | kernel-hacking.xml kernel-locking.xml deviceiobook.xml \ | 10 | kernel-hacking.xml kernel-locking.xml deviceiobook.xml \ |
11 | procfs-guide.xml writing_usb_driver.xml \ | 11 | procfs-guide.xml writing_usb_driver.xml \ |
12 | kernel-api.xml journal-api.xml lsm.xml usb.xml \ | 12 | kernel-api.xml filesystems.xml lsm.xml usb.xml \ |
13 | gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \ | 13 | gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \ |
14 | genericirq.xml | 14 | genericirq.xml |
15 | 15 | ||
diff --git a/Documentation/DocBook/journal-api.tmpl b/Documentation/DocBook/filesystems.tmpl index 2077f9a28c19..39fa2aba7f9b 100644 --- a/Documentation/DocBook/journal-api.tmpl +++ b/Documentation/DocBook/filesystems.tmpl | |||
@@ -2,39 +2,11 @@ | |||
2 | <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" | 2 | <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" |
3 | "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []> | 3 | "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []> |
4 | 4 | ||
5 | <book id="LinuxJBDAPI"> | 5 | <book id="Linux-filesystems-API"> |
6 | <bookinfo> | 6 | <bookinfo> |
7 | <title>The Linux Journalling API</title> | 7 | <title>Linux Filesystems API</title> |
8 | <authorgroup> | ||
9 | <author> | ||
10 | <firstname>Roger</firstname> | ||
11 | <surname>Gammans</surname> | ||
12 | <affiliation> | ||
13 | <address> | ||
14 | <email>rgammans@computer-surgery.co.uk</email> | ||
15 | </address> | ||
16 | </affiliation> | ||
17 | </author> | ||
18 | </authorgroup> | ||
19 | |||
20 | <authorgroup> | ||
21 | <author> | ||
22 | <firstname>Stephen</firstname> | ||
23 | <surname>Tweedie</surname> | ||
24 | <affiliation> | ||
25 | <address> | ||
26 | <email>sct@redhat.com</email> | ||
27 | </address> | ||
28 | </affiliation> | ||
29 | </author> | ||
30 | </authorgroup> | ||
31 | 8 | ||
32 | <copyright> | 9 | <legalnotice> |
33 | <year>2002</year> | ||
34 | <holder>Roger Gammans</holder> | ||
35 | </copyright> | ||
36 | |||
37 | <legalnotice> | ||
38 | <para> | 10 | <para> |
39 | This documentation is free software; you can redistribute | 11 | This documentation is free software; you can redistribute |
40 | it and/or modify it under the terms of the GNU General Public | 12 | it and/or modify it under the terms of the GNU General Public |
@@ -42,21 +14,21 @@ | |||
42 | version 2 of the License, or (at your option) any later | 14 | version 2 of the License, or (at your option) any later |
43 | version. | 15 | version. |
44 | </para> | 16 | </para> |
45 | 17 | ||
46 | <para> | 18 | <para> |
47 | This program is distributed in the hope that it will be | 19 | This program is distributed in the hope that it will be |
48 | useful, but WITHOUT ANY WARRANTY; without even the implied | 20 | useful, but WITHOUT ANY WARRANTY; without even the implied |
49 | warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 21 | warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
50 | See the GNU General Public License for more details. | 22 | See the GNU General Public License for more details. |
51 | </para> | 23 | </para> |
52 | 24 | ||
53 | <para> | 25 | <para> |
54 | You should have received a copy of the GNU General Public | 26 | You should have received a copy of the GNU General Public |
55 | License along with this program; if not, write to the Free | 27 | License along with this program; if not, write to the Free |
56 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, | 28 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
57 | MA 02111-1307 USA | 29 | MA 02111-1307 USA |
58 | </para> | 30 | </para> |
59 | 31 | ||
60 | <para> | 32 | <para> |
61 | For more details see the file COPYING in the source | 33 | For more details see the file COPYING in the source |
62 | distribution of Linux. | 34 | distribution of Linux. |
@@ -66,17 +38,113 @@ | |||
66 | 38 | ||
67 | <toc></toc> | 39 | <toc></toc> |
68 | 40 | ||
69 | <chapter id="Overview"> | 41 | <chapter id="vfs"> |
42 | <title>The Linux VFS</title> | ||
43 | <sect1><title>The Filesystem types</title> | ||
44 | !Iinclude/linux/fs.h | ||
45 | </sect1> | ||
46 | <sect1><title>The Directory Cache</title> | ||
47 | !Efs/dcache.c | ||
48 | !Iinclude/linux/dcache.h | ||
49 | </sect1> | ||
50 | <sect1><title>Inode Handling</title> | ||
51 | !Efs/inode.c | ||
52 | !Efs/bad_inode.c | ||
53 | </sect1> | ||
54 | <sect1><title>Registration and Superblocks</title> | ||
55 | !Efs/super.c | ||
56 | </sect1> | ||
57 | <sect1><title>File Locks</title> | ||
58 | !Efs/locks.c | ||
59 | !Ifs/locks.c | ||
60 | </sect1> | ||
61 | <sect1><title>Other Functions</title> | ||
62 | !Efs/mpage.c | ||
63 | !Efs/namei.c | ||
64 | !Efs/buffer.c | ||
65 | !Efs/bio.c | ||
66 | !Efs/seq_file.c | ||
67 | !Efs/filesystems.c | ||
68 | !Efs/fs-writeback.c | ||
69 | !Efs/block_dev.c | ||
70 | </sect1> | ||
71 | </chapter> | ||
72 | |||
73 | <chapter id="proc"> | ||
74 | <title>The proc filesystem</title> | ||
75 | |||
76 | <sect1><title>sysctl interface</title> | ||
77 | !Ekernel/sysctl.c | ||
78 | </sect1> | ||
79 | |||
80 | <sect1><title>proc filesystem interface</title> | ||
81 | !Ifs/proc/base.c | ||
82 | </sect1> | ||
83 | </chapter> | ||
84 | |||
85 | <chapter id="sysfs"> | ||
86 | <title>The Filesystem for Exporting Kernel Objects</title> | ||
87 | !Efs/sysfs/file.c | ||
88 | !Efs/sysfs/symlink.c | ||
89 | !Efs/sysfs/bin.c | ||
90 | </chapter> | ||
91 | |||
92 | <chapter id="debugfs"> | ||
93 | <title>The debugfs filesystem</title> | ||
94 | |||
95 | <sect1><title>debugfs interface</title> | ||
96 | !Efs/debugfs/inode.c | ||
97 | !Efs/debugfs/file.c | ||
98 | </sect1> | ||
99 | </chapter> | ||
100 | |||
101 | <chapter id="LinuxJDBAPI"> | ||
102 | <chapterinfo> | ||
103 | <title>The Linux Journalling API</title> | ||
104 | |||
105 | <authorgroup> | ||
106 | <author> | ||
107 | <firstname>Roger</firstname> | ||
108 | <surname>Gammans</surname> | ||
109 | <affiliation> | ||
110 | <address> | ||
111 | <email>rgammans@computer-surgery.co.uk</email> | ||
112 | </address> | ||
113 | </affiliation> | ||
114 | </author> | ||
115 | </authorgroup> | ||
116 | |||
117 | <authorgroup> | ||
118 | <author> | ||
119 | <firstname>Stephen</firstname> | ||
120 | <surname>Tweedie</surname> | ||
121 | <affiliation> | ||
122 | <address> | ||
123 | <email>sct@redhat.com</email> | ||
124 | </address> | ||
125 | </affiliation> | ||
126 | </author> | ||
127 | </authorgroup> | ||
128 | |||
129 | <copyright> | ||
130 | <year>2002</year> | ||
131 | <holder>Roger Gammans</holder> | ||
132 | </copyright> | ||
133 | </chapterinfo> | ||
134 | |||
135 | <title>The Linux Journalling API</title> | ||
136 | |||
137 | <sect1> | ||
70 | <title>Overview</title> | 138 | <title>Overview</title> |
71 | <sect1> | 139 | <sect2> |
72 | <title>Details</title> | 140 | <title>Details</title> |
73 | <para> | 141 | <para> |
74 | The journalling layer is easy to use. You need to | 142 | The journalling layer is easy to use. You need to |
75 | first of all create a journal_t data structure. There are | 143 | first of all create a journal_t data structure. There are |
76 | two calls to do this dependent on how you decide to allocate the physical | 144 | two calls to do this dependent on how you decide to allocate the physical |
77 | media on which the journal resides. The journal_init_inode() call | 145 | media on which the journal resides. The journal_init_inode() call |
78 | is for journals stored in filesystem inodes, or the journal_init_dev() | 146 | is for journals stored in filesystem inodes, or the journal_init_dev() |
79 | call can be use for journal stored on a raw device (in a continuous range | 147 | call can be use for journal stored on a raw device (in a continuous range |
80 | of blocks). A journal_t is a typedef for a struct pointer, so when | 148 | of blocks). A journal_t is a typedef for a struct pointer, so when |
81 | you are finally finished make sure you call journal_destroy() on it | 149 | you are finally finished make sure you call journal_destroy() on it |
82 | to free up any used kernel memory. | 150 | to free up any used kernel memory. |
@@ -91,27 +159,26 @@ need to call journal_create(). | |||
91 | <para> | 159 | <para> |
92 | Most of the time however your journal file will already have been created, but | 160 | Most of the time however your journal file will already have been created, but |
93 | before you load it you must call journal_wipe() to empty the journal file. | 161 | before you load it you must call journal_wipe() to empty the journal file. |
94 | Hang on, you say , what if the filesystem wasn't cleanly umount()'d . Well, it is the | 162 | Hang on, you say , what if the filesystem wasn't cleanly umount()'d . Well, it is the |
95 | job of the client file system to detect this and skip the call to journal_wipe(). | 163 | job of the client file system to detect this and skip the call to journal_wipe(). |
96 | </para> | 164 | </para> |
97 | 165 | ||
98 | <para> | 166 | <para> |
99 | In either case the next call should be to journal_load() which prepares the | 167 | In either case the next call should be to journal_load() which prepares the |
100 | journal file for use. Note that journal_wipe(..,0) calls journal_skip_recovery() | 168 | journal file for use. Note that journal_wipe(..,0) calls journal_skip_recovery() |
101 | for you if it detects any outstanding transactions in the journal and similarly | 169 | for you if it detects any outstanding transactions in the journal and similarly |
102 | journal_load() will call journal_recover() if necessary. | 170 | journal_load() will call journal_recover() if necessary. |
103 | I would advise reading fs/ext3/super.c for examples on this stage. | 171 | I would advise reading fs/ext3/super.c for examples on this stage. |
104 | [RGG: Why is the journal_wipe() call necessary - doesn't this needlessly | 172 | [RGG: Why is the journal_wipe() call necessary - doesn't this needlessly |
105 | complicate the API. Or isn't a good idea for the journal layer to hide | 173 | complicate the API. Or isn't a good idea for the journal layer to hide |
106 | dirty mounts from the client fs] | 174 | dirty mounts from the client fs] |
107 | </para> | 175 | </para> |
108 | 176 | ||
109 | <para> | 177 | <para> |
110 | Now you can go ahead and start modifying the underlying | 178 | Now you can go ahead and start modifying the underlying |
111 | filesystem. Almost. | 179 | filesystem. Almost. |
112 | </para> | 180 | </para> |
113 | 181 | ||
114 | |||
115 | <para> | 182 | <para> |
116 | 183 | ||
117 | You still need to actually journal your filesystem changes, this | 184 | You still need to actually journal your filesystem changes, this |
@@ -138,10 +205,10 @@ individual buffers (blocks). Before you start to modify a buffer you | |||
138 | need to call journal_get_{create,write,undo}_access() as appropriate, | 205 | need to call journal_get_{create,write,undo}_access() as appropriate, |
139 | this allows the journalling layer to copy the unmodified data if it | 206 | this allows the journalling layer to copy the unmodified data if it |
140 | needs to. After all the buffer may be part of a previously uncommitted | 207 | needs to. After all the buffer may be part of a previously uncommitted |
141 | transaction. | 208 | transaction. |
142 | At this point you are at last ready to modify a buffer, and once | 209 | At this point you are at last ready to modify a buffer, and once |
143 | you are have done so you need to call journal_dirty_{meta,}data(). | 210 | you are have done so you need to call journal_dirty_{meta,}data(). |
144 | Or if you've asked for access to a buffer you now know is now longer | 211 | Or if you've asked for access to a buffer you now know is now longer |
145 | required to be pushed back on the device you can call journal_forget() | 212 | required to be pushed back on the device you can call journal_forget() |
146 | in much the same way as you might have used bforget() in the past. | 213 | in much the same way as you might have used bforget() in the past. |
147 | </para> | 214 | </para> |
@@ -156,7 +223,6 @@ Then at umount time , in your put_super() (2.4) or write_super() (2.5) | |||
156 | you can then call journal_destroy() to clean up your in-core journal object. | 223 | you can then call journal_destroy() to clean up your in-core journal object. |
157 | </para> | 224 | </para> |
158 | 225 | ||
159 | |||
160 | <para> | 226 | <para> |
161 | Unfortunately there a couple of ways the journal layer can cause a deadlock. | 227 | Unfortunately there a couple of ways the journal layer can cause a deadlock. |
162 | The first thing to note is that each task can only have | 228 | The first thing to note is that each task can only have |
@@ -164,19 +230,19 @@ a single outstanding transaction at any one time, remember nothing | |||
164 | commits until the outermost journal_stop(). This means | 230 | commits until the outermost journal_stop(). This means |
165 | you must complete the transaction at the end of each file/inode/address | 231 | you must complete the transaction at the end of each file/inode/address |
166 | etc. operation you perform, so that the journalling system isn't re-entered | 232 | etc. operation you perform, so that the journalling system isn't re-entered |
167 | on another journal. Since transactions can't be nested/batched | 233 | on another journal. Since transactions can't be nested/batched |
168 | across differing journals, and another filesystem other than | 234 | across differing journals, and another filesystem other than |
169 | yours (say ext3) may be modified in a later syscall. | 235 | yours (say ext3) may be modified in a later syscall. |
170 | </para> | 236 | </para> |
171 | 237 | ||
172 | <para> | 238 | <para> |
173 | The second case to bear in mind is that journal_start() can | 239 | The second case to bear in mind is that journal_start() can |
174 | block if there isn't enough space in the journal for your transaction | 240 | block if there isn't enough space in the journal for your transaction |
175 | (based on the passed nblocks param) - when it blocks it merely(!) needs to | 241 | (based on the passed nblocks param) - when it blocks it merely(!) needs to |
176 | wait for transactions to complete and be committed from other tasks, | 242 | wait for transactions to complete and be committed from other tasks, |
177 | so essentially we are waiting for journal_stop(). So to avoid | 243 | so essentially we are waiting for journal_stop(). So to avoid |
178 | deadlocks you must treat journal_start/stop() as if they | 244 | deadlocks you must treat journal_start/stop() as if they |
179 | were semaphores and include them in your semaphore ordering rules to prevent | 245 | were semaphores and include them in your semaphore ordering rules to prevent |
180 | deadlocks. Note that journal_extend() has similar blocking behaviour to | 246 | deadlocks. Note that journal_extend() has similar blocking behaviour to |
181 | journal_start() so you can deadlock here just as easily as on journal_start(). | 247 | journal_start() so you can deadlock here just as easily as on journal_start(). |
182 | </para> | 248 | </para> |
@@ -184,7 +250,7 @@ journal_start() so you can deadlock here just as easily as on journal_start(). | |||
184 | <para> | 250 | <para> |
185 | Try to reserve the right number of blocks the first time. ;-). This will | 251 | Try to reserve the right number of blocks the first time. ;-). This will |
186 | be the maximum number of blocks you are going to touch in this transaction. | 252 | be the maximum number of blocks you are going to touch in this transaction. |
187 | I advise having a look at at least ext3_jbd.h to see the basis on which | 253 | I advise having a look at at least ext3_jbd.h to see the basis on which |
188 | ext3 uses to make these decisions. | 254 | ext3 uses to make these decisions. |
189 | </para> | 255 | </para> |
190 | 256 | ||
@@ -193,13 +259,13 @@ Another wriggle to watch out for is your on-disk block allocation strategy. | |||
193 | why? Because, if you undo a delete, you need to ensure you haven't reused any | 259 | why? Because, if you undo a delete, you need to ensure you haven't reused any |
194 | of the freed blocks in a later transaction. One simple way of doing this | 260 | of the freed blocks in a later transaction. One simple way of doing this |
195 | is make sure any blocks you allocate only have checkpointed transactions | 261 | is make sure any blocks you allocate only have checkpointed transactions |
196 | listed against them. Ext3 does this in ext3_test_allocatable(). | 262 | listed against them. Ext3 does this in ext3_test_allocatable(). |
197 | </para> | 263 | </para> |
198 | 264 | ||
199 | <para> | 265 | <para> |
200 | Lock is also providing through journal_{un,}lock_updates(), | 266 | Lock is also providing through journal_{un,}lock_updates(), |
201 | ext3 uses this when it wants a window with a clean and stable fs for a moment. | 267 | ext3 uses this when it wants a window with a clean and stable fs for a moment. |
202 | eg. | 268 | eg. |
203 | </para> | 269 | </para> |
204 | 270 | ||
205 | <programlisting> | 271 | <programlisting> |
@@ -230,19 +296,19 @@ extend it like this:- | |||
230 | struct journal_callback for_jbd; | 296 | struct journal_callback for_jbd; |
231 | // Stuff for myfs allocated together. | 297 | // Stuff for myfs allocated together. |
232 | myfs_inode* i_commited; | 298 | myfs_inode* i_commited; |
233 | 299 | ||
234 | } | 300 | } |
235 | </programlisting> | 301 | </programlisting> |
236 | 302 | ||
237 | <para> | 303 | <para> |
238 | this would be useful if you needed to know when data was committed to a | 304 | this would be useful if you needed to know when data was committed to a |
239 | particular inode. | 305 | particular inode. |
240 | </para> | 306 | </para> |
241 | 307 | ||
242 | </sect1> | 308 | </sect2> |
243 | 309 | ||
244 | <sect1> | 310 | <sect2> |
245 | <title>Summary</title> | 311 | <title>Summary</title> |
246 | <para> | 312 | <para> |
247 | Using the journal is a matter of wrapping the different context changes, | 313 | Using the journal is a matter of wrapping the different context changes, |
248 | being each mount, each modification (transaction) and each changed buffer | 314 | being each mount, each modification (transaction) and each changed buffer |
@@ -260,15 +326,15 @@ an example. | |||
260 | if (clean) journal_wipe(); | 326 | if (clean) journal_wipe(); |
261 | journal_load(); | 327 | journal_load(); |
262 | 328 | ||
263 | foreach(transaction) { /*transactions must be | 329 | foreach(transaction) { /*transactions must be |
264 | completed before | 330 | completed before |
265 | a syscall returns to | 331 | a syscall returns to |
266 | userspace*/ | 332 | userspace*/ |
267 | 333 | ||
268 | handle_t * xct=journal_start(my_jnrl); | 334 | handle_t * xct=journal_start(my_jnrl); |
269 | foreach(bh) { | 335 | foreach(bh) { |
270 | journal_get_{create,write,undo}_access(xact,bh); | 336 | journal_get_{create,write,undo}_access(xact,bh); |
271 | if ( myfs_modify(bh) ) { /* returns true | 337 | if ( myfs_modify(bh) ) { /* returns true |
272 | if makes changes */ | 338 | if makes changes */ |
273 | journal_dirty_{meta,}data(xact,bh); | 339 | journal_dirty_{meta,}data(xact,bh); |
274 | } else { | 340 | } else { |
@@ -279,55 +345,57 @@ an example. | |||
279 | } | 345 | } |
280 | journal_destroy(my_jrnl); | 346 | journal_destroy(my_jrnl); |
281 | </programlisting> | 347 | </programlisting> |
282 | </sect1> | 348 | </sect2> |
283 | 349 | ||
284 | </chapter> | 350 | </sect1> |
285 | 351 | ||
286 | <chapter id="adt"> | 352 | <sect1> |
287 | <title>Data Types</title> | 353 | <title>Data Types</title> |
288 | <para> | 354 | <para> |
289 | The journalling layer uses typedefs to 'hide' the concrete definitions | 355 | The journalling layer uses typedefs to 'hide' the concrete definitions |
290 | of the structures used. As a client of the JBD layer you can | 356 | of the structures used. As a client of the JBD layer you can |
291 | just rely on the using the pointer as a magic cookie of some sort. | 357 | just rely on the using the pointer as a magic cookie of some sort. |
292 | 358 | ||
293 | Obviously the hiding is not enforced as this is 'C'. | 359 | Obviously the hiding is not enforced as this is 'C'. |
294 | </para> | 360 | </para> |
295 | <sect1><title>Structures</title> | 361 | <sect2><title>Structures</title> |
296 | !Iinclude/linux/jbd.h | 362 | !Iinclude/linux/jbd.h |
297 | </sect1> | 363 | </sect2> |
298 | </chapter> | 364 | </sect1> |
299 | 365 | ||
300 | <chapter id="calls"> | 366 | <sect1> |
301 | <title>Functions</title> | 367 | <title>Functions</title> |
302 | <para> | 368 | <para> |
303 | The functions here are split into two groups those that | 369 | The functions here are split into two groups those that |
304 | affect a journal as a whole, and those which are used to | 370 | affect a journal as a whole, and those which are used to |
305 | manage transactions | 371 | manage transactions |
306 | </para> | 372 | </para> |
307 | <sect1><title>Journal Level</title> | 373 | <sect2><title>Journal Level</title> |
308 | !Efs/jbd/journal.c | 374 | !Efs/jbd/journal.c |
309 | !Ifs/jbd/recovery.c | 375 | !Ifs/jbd/recovery.c |
310 | </sect1> | 376 | </sect2> |
311 | <sect1><title>Transasction Level</title> | 377 | <sect2><title>Transasction Level</title> |
312 | !Efs/jbd/transaction.c | 378 | !Efs/jbd/transaction.c |
313 | </sect1> | 379 | </sect2> |
314 | </chapter> | 380 | </sect1> |
315 | <chapter> | 381 | <sect1> |
316 | <title>See also</title> | 382 | <title>See also</title> |
317 | <para> | 383 | <para> |
318 | <citation> | 384 | <citation> |
319 | <ulink url="ftp://ftp.uk.linux.org/pub/linux/sct/fs/jfs/journal-design.ps.gz"> | 385 | <ulink url="ftp://ftp.uk.linux.org/pub/linux/sct/fs/jfs/journal-design.ps.gz"> |
320 | Journaling the Linux ext2fs Filesystem,LinuxExpo 98, Stephen Tweedie | 386 | Journaling the Linux ext2fs Filesystem, LinuxExpo 98, Stephen Tweedie |
321 | </ulink> | 387 | </ulink> |
322 | </citation> | 388 | </citation> |
323 | </para> | 389 | </para> |
324 | <para> | 390 | <para> |
325 | <citation> | 391 | <citation> |
326 | <ulink url="http://olstrans.sourceforge.net/release/OLS2000-ext3/OLS2000-ext3.html"> | 392 | <ulink url="http://olstrans.sourceforge.net/release/OLS2000-ext3/OLS2000-ext3.html"> |
327 | Ext3 Journalling FileSystem , OLS 2000, Dr. Stephen Tweedie | 393 | Ext3 Journalling FileSystem, OLS 2000, Dr. Stephen Tweedie |
328 | </ulink> | 394 | </ulink> |
329 | </citation> | 395 | </citation> |
330 | </para> | 396 | </para> |
331 | </chapter> | 397 | </sect1> |
398 | |||
399 | </chapter> | ||
332 | 400 | ||
333 | </book> | 401 | </book> |
diff --git a/Documentation/DocBook/kernel-api.tmpl b/Documentation/DocBook/kernel-api.tmpl index 2b5ac604948c..a166675c4303 100644 --- a/Documentation/DocBook/kernel-api.tmpl +++ b/Documentation/DocBook/kernel-api.tmpl | |||
@@ -182,66 +182,6 @@ X!Ilib/string.c | |||
182 | </sect1> | 182 | </sect1> |
183 | </chapter> | 183 | </chapter> |
184 | 184 | ||
185 | <chapter id="vfs"> | ||
186 | <title>The Linux VFS</title> | ||
187 | <sect1><title>The Filesystem types</title> | ||
188 | !Iinclude/linux/fs.h | ||
189 | </sect1> | ||
190 | <sect1><title>The Directory Cache</title> | ||
191 | !Efs/dcache.c | ||
192 | !Iinclude/linux/dcache.h | ||
193 | </sect1> | ||
194 | <sect1><title>Inode Handling</title> | ||
195 | !Efs/inode.c | ||
196 | !Efs/bad_inode.c | ||
197 | </sect1> | ||
198 | <sect1><title>Registration and Superblocks</title> | ||
199 | !Efs/super.c | ||
200 | </sect1> | ||
201 | <sect1><title>File Locks</title> | ||
202 | !Efs/locks.c | ||
203 | !Ifs/locks.c | ||
204 | </sect1> | ||
205 | <sect1><title>Other Functions</title> | ||
206 | !Efs/mpage.c | ||
207 | !Efs/namei.c | ||
208 | !Efs/buffer.c | ||
209 | !Efs/bio.c | ||
210 | !Efs/seq_file.c | ||
211 | !Efs/filesystems.c | ||
212 | !Efs/fs-writeback.c | ||
213 | !Efs/block_dev.c | ||
214 | </sect1> | ||
215 | </chapter> | ||
216 | |||
217 | <chapter id="proc"> | ||
218 | <title>The proc filesystem</title> | ||
219 | |||
220 | <sect1><title>sysctl interface</title> | ||
221 | !Ekernel/sysctl.c | ||
222 | </sect1> | ||
223 | |||
224 | <sect1><title>proc filesystem interface</title> | ||
225 | !Ifs/proc/base.c | ||
226 | </sect1> | ||
227 | </chapter> | ||
228 | |||
229 | <chapter id="sysfs"> | ||
230 | <title>The Filesystem for Exporting Kernel Objects</title> | ||
231 | !Efs/sysfs/file.c | ||
232 | !Efs/sysfs/symlink.c | ||
233 | !Efs/sysfs/bin.c | ||
234 | </chapter> | ||
235 | |||
236 | <chapter id="debugfs"> | ||
237 | <title>The debugfs filesystem</title> | ||
238 | |||
239 | <sect1><title>debugfs interface</title> | ||
240 | !Efs/debugfs/inode.c | ||
241 | !Efs/debugfs/file.c | ||
242 | </sect1> | ||
243 | </chapter> | ||
244 | |||
245 | <chapter id="relayfs"> | 185 | <chapter id="relayfs"> |
246 | <title>relay interface support</title> | 186 | <title>relay interface support</title> |
247 | 187 | ||
diff --git a/Documentation/accounting/getdelays.c b/Documentation/accounting/getdelays.c index b11792abd6b6..bf2b0e2f87e1 100644 --- a/Documentation/accounting/getdelays.c +++ b/Documentation/accounting/getdelays.c | |||
@@ -49,7 +49,7 @@ __u64 stime, utime; | |||
49 | } | 49 | } |
50 | 50 | ||
51 | /* Maximum size of response requested or message sent */ | 51 | /* Maximum size of response requested or message sent */ |
52 | #define MAX_MSG_SIZE 256 | 52 | #define MAX_MSG_SIZE 1024 |
53 | /* Maximum number of cpus expected to be specified in a cpumask */ | 53 | /* Maximum number of cpus expected to be specified in a cpumask */ |
54 | #define MAX_CPUS 32 | 54 | #define MAX_CPUS 32 |
55 | /* Maximum length of pathname to log file */ | 55 | /* Maximum length of pathname to log file */ |
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 1ac3c74646e3..d52c4aaaf17f 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
@@ -53,18 +53,6 @@ Who: Mauro Carvalho Chehab <mchehab@brturbo.com.br> | |||
53 | 53 | ||
54 | --------------------------- | 54 | --------------------------- |
55 | 55 | ||
56 | What: sys_sysctl | ||
57 | When: January 2007 | ||
58 | Why: The same information is available through /proc/sys and that is the | ||
59 | interface user space prefers to use. And there do not appear to be | ||
60 | any existing user in user space of sys_sysctl. The additional | ||
61 | maintenance overhead of keeping a set of binary names gets | ||
62 | in the way of doing a good job of maintaining this interface. | ||
63 | |||
64 | Who: Eric Biederman <ebiederm@xmission.com> | ||
65 | |||
66 | --------------------------- | ||
67 | |||
68 | What: PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl]) | 56 | What: PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl]) |
69 | When: November 2005 | 57 | When: November 2005 |
70 | Files: drivers/pcmcia/: pcmcia_ioctl.c | 58 | Files: drivers/pcmcia/: pcmcia_ioctl.c |
diff --git a/Documentation/filesystems/udf.txt b/Documentation/filesystems/udf.txt index 511b4230c053..fde829a756e6 100644 --- a/Documentation/filesystems/udf.txt +++ b/Documentation/filesystems/udf.txt | |||
@@ -7,8 +7,17 @@ If you encounter problems with reading UDF discs using this driver, | |||
7 | please report them to linux_udf@hpesjro.fc.hp.com, which is the | 7 | please report them to linux_udf@hpesjro.fc.hp.com, which is the |
8 | developer's list. | 8 | developer's list. |
9 | 9 | ||
10 | Write support requires a block driver which supports writing. The current | 10 | Write support requires a block driver which supports writing. Currently |
11 | scsi and ide cdrom drivers do not support writing. | 11 | dvd+rw drives and media support true random sector writes, and so a udf |
12 | filesystem on such devices can be directly mounted read/write. CD-RW | ||
13 | media however, does not support this. Instead the media can be formatted | ||
14 | for packet mode using the utility cdrwtool, then the pktcdvd driver can | ||
15 | be bound to the underlying cd device to provide the required buffering | ||
16 | and read-modify-write cycles to allow the filesystem random sector writes | ||
17 | while providing the hardware with only full packet writes. While not | ||
18 | required for dvd+rw media, use of the pktcdvd driver often enhances | ||
19 | performance due to very poor read-modify-write support supplied internally | ||
20 | by drive firmware. | ||
12 | 21 | ||
13 | ------------------------------------------------------------------------------- | 22 | ------------------------------------------------------------------------------- |
14 | The following mount options are supported: | 23 | The following mount options are supported: |
diff --git a/Documentation/kernel-doc-nano-HOWTO.txt b/Documentation/kernel-doc-nano-HOWTO.txt index c65233d430f0..284e7e198e93 100644 --- a/Documentation/kernel-doc-nano-HOWTO.txt +++ b/Documentation/kernel-doc-nano-HOWTO.txt | |||
@@ -17,7 +17,7 @@ are: | |||
17 | special place-holders for where the extracted documentation should | 17 | special place-holders for where the extracted documentation should |
18 | go. | 18 | go. |
19 | 19 | ||
20 | - scripts/docproc.c | 20 | - scripts/basic/docproc.c |
21 | 21 | ||
22 | This is a program for converting SGML template files into SGML | 22 | This is a program for converting SGML template files into SGML |
23 | files. When a file is referenced it is searched for symbols | 23 | files. When a file is referenced it is searched for symbols |
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index dd00fd556a60..67473849f20e 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -164,6 +164,10 @@ and is between 256 and 4096 characters. It is defined in the file | |||
164 | acpi_skip_timer_override [HW,ACPI] | 164 | acpi_skip_timer_override [HW,ACPI] |
165 | Recognize and ignore IRQ0/pin2 Interrupt Override. | 165 | Recognize and ignore IRQ0/pin2 Interrupt Override. |
166 | For broken nForce2 BIOS resulting in XT-PIC timer. | 166 | For broken nForce2 BIOS resulting in XT-PIC timer. |
167 | acpi_use_timer_override [HW,ACPI} | ||
168 | Use timer override. For some broken Nvidia NF5 boards | ||
169 | that require a timer override, but don't have | ||
170 | HPET | ||
167 | 171 | ||
168 | acpi_dbg_layer= [HW,ACPI] | 172 | acpi_dbg_layer= [HW,ACPI] |
169 | Format: <int> | 173 | Format: <int> |
diff --git a/Documentation/kprobes.txt b/Documentation/kprobes.txt index ba26201d5023..d71fafffce90 100644 --- a/Documentation/kprobes.txt +++ b/Documentation/kprobes.txt | |||
@@ -442,9 +442,10 @@ static int __init kprobe_init(void) | |||
442 | kp.fault_handler = handler_fault; | 442 | kp.fault_handler = handler_fault; |
443 | kp.symbol_name = "do_fork"; | 443 | kp.symbol_name = "do_fork"; |
444 | 444 | ||
445 | if ((ret = register_kprobe(&kp) < 0)) { | 445 | ret = register_kprobe(&kp); |
446 | if (ret < 0) { | ||
446 | printk("register_kprobe failed, returned %d\n", ret); | 447 | printk("register_kprobe failed, returned %d\n", ret); |
447 | return -1; | 448 | return ret; |
448 | } | 449 | } |
449 | printk("kprobe registered\n"); | 450 | printk("kprobe registered\n"); |
450 | return 0; | 451 | return 0; |
diff --git a/Documentation/memory-barriers.txt b/Documentation/memory-barriers.txt index 7f790f66ec68..7751704b6db1 100644 --- a/Documentation/memory-barriers.txt +++ b/Documentation/memory-barriers.txt | |||
@@ -1016,7 +1016,7 @@ There are some more advanced barrier functions: | |||
1016 | 1016 | ||
1017 | (*) set_mb(var, value) | 1017 | (*) set_mb(var, value) |
1018 | 1018 | ||
1019 | This assigns the value to the variable and then inserts at least a write | 1019 | This assigns the value to the variable and then inserts a full memory |
1020 | barrier after it, depending on the function. It isn't guaranteed to | 1020 | barrier after it, depending on the function. It isn't guaranteed to |
1021 | insert anything more than a compiler barrier in a UP compilation. | 1021 | insert anything more than a compiler barrier in a UP compilation. |
1022 | 1022 | ||
diff --git a/Documentation/mips/time.README b/Documentation/mips/time.README index 69ddc5c14b79..a4ce603ed3b3 100644 --- a/Documentation/mips/time.README +++ b/Documentation/mips/time.README | |||
@@ -38,19 +38,14 @@ The new time code provide the following services: | |||
38 | 38 | ||
39 | a) Implements functions required by Linux common code: | 39 | a) Implements functions required by Linux common code: |
40 | time_init | 40 | time_init |
41 | do_gettimeofday | ||
42 | do_settimeofday | ||
43 | 41 | ||
44 | b) provides an abstraction of RTC and null RTC implementation as default. | 42 | b) provides an abstraction of RTC and null RTC implementation as default. |
45 | extern unsigned long (*rtc_get_time)(void); | 43 | extern unsigned long (*rtc_get_time)(void); |
46 | extern int (*rtc_set_time)(unsigned long); | 44 | extern int (*rtc_set_time)(unsigned long); |
47 | 45 | ||
48 | c) a set of gettimeoffset functions for different CPUs and different | 46 | c) high-level and low-level timer interrupt routines where the timer |
49 | needs. | 47 | interrupt source may or may not be the CPU timer. The high-level |
50 | 48 | routine is dispatched through do_IRQ() while the low-level is | |
51 | d) high-level and low-level timer interrupt routines where the timer | ||
52 | interrupt source may or may not be the CPU timer. The high-level | ||
53 | routine is dispatched through do_IRQ() while the low-level is | ||
54 | dispatched in assemably code (usually int-handler.S) | 49 | dispatched in assemably code (usually int-handler.S) |
55 | 50 | ||
56 | 51 | ||
@@ -63,7 +58,7 @@ the following functions or values: | |||
63 | a) board_time_init - a function pointer. Invoked at the beginnig of | 58 | a) board_time_init - a function pointer. Invoked at the beginnig of |
64 | time_init(). It is optional. | 59 | time_init(). It is optional. |
65 | 1. (optional) set up RTC routines | 60 | 1. (optional) set up RTC routines |
66 | 2. (optional) calibrate and set the mips_counter_frequency | 61 | 2. (optional) calibrate and set the mips_hpt_frequency |
67 | 62 | ||
68 | b) plat_timer_setup - a function pointer. Invoked at the end of time_init() | 63 | b) plat_timer_setup - a function pointer. Invoked at the end of time_init() |
69 | 1. (optional) over-ride any decisions made in time_init() | 64 | 1. (optional) over-ride any decisions made in time_init() |
@@ -72,9 +67,8 @@ the following functions or values: | |||
72 | 67 | ||
73 | c) (optional) board-specific RTC routines. | 68 | c) (optional) board-specific RTC routines. |
74 | 69 | ||
75 | d) (optional) mips_counter_frequency - It must be definied if the board | 70 | d) (optional) mips_hpt_frequency - It must be definied if the board |
76 | is using CPU counter for timer interrupt or it is using fixed rate | 71 | is using CPU counter for timer interrupt. |
77 | gettimeoffset(). | ||
78 | 72 | ||
79 | 73 | ||
80 | PORTING GUIDE | 74 | PORTING GUIDE |
@@ -89,22 +83,12 @@ Step 1: decide how you like to implement the time services. | |||
89 | If the answer is no, you need a timer to provide the timer interrupt | 83 | If the answer is no, you need a timer to provide the timer interrupt |
90 | at 100 HZ speed. | 84 | at 100 HZ speed. |
91 | 85 | ||
92 | You cannot use the fast gettimeoffset functions, i.e., | ||
93 | |||
94 | unsigned long fixed_rate_gettimeoffset(void); | ||
95 | unsigned long calibrate_div32_gettimeoffset(void); | ||
96 | unsigned long calibrate_div64_gettimeoffset(void); | ||
97 | |||
98 | You can use null_gettimeoffset() will gives the same time resolution as | ||
99 | jiffy. Or you can implement your own gettimeoffset (probably based on | ||
100 | some ad hoc hardware on your machine.) | ||
101 | |||
102 | c) The following sub steps assume your CPU has counter register. | 86 | c) The following sub steps assume your CPU has counter register. |
103 | Do you plan to use the CPU counter register as the timer interrupt | 87 | Do you plan to use the CPU counter register as the timer interrupt |
104 | or use an exnternal timer? | 88 | or use an exnternal timer? |
105 | 89 | ||
106 | In order to use CPU counter register as the timer interrupt source, you | 90 | In order to use CPU counter register as the timer interrupt source, you |
107 | must know the counter speed (mips_counter_frequency). It is usually the | 91 | must know the counter speed (mips_hpt_frequency). It is usually the |
108 | same as the CPU speed or an integral divisor of it. | 92 | same as the CPU speed or an integral divisor of it. |
109 | 93 | ||
110 | d) decide on whether you want to use high-level or low-level timer | 94 | d) decide on whether you want to use high-level or low-level timer |
@@ -121,10 +105,10 @@ Step 3: implement rtc routines, board_time_init() and plat_timer_setup() | |||
121 | if needed. | 105 | if needed. |
122 | 106 | ||
123 | board_time_init() - | 107 | board_time_init() - |
124 | a) (optional) set up RTC routines, | 108 | a) (optional) set up RTC routines, |
125 | b) (optional) calibrate and set the mips_counter_frequency | 109 | b) (optional) calibrate and set the mips_hpt_frequency |
126 | (only needed if you intended to use fixed_rate_gettimeoffset | 110 | (only needed if you intended to use cpu counter as timer interrupt |
127 | or use cpu counter as timer interrupt source) | 111 | source) |
128 | 112 | ||
129 | plat_timer_setup() - | 113 | plat_timer_setup() - |
130 | a) (optional) over-write any choices made above by time_init(). | 114 | a) (optional) over-write any choices made above by time_init(). |
@@ -154,8 +138,8 @@ for some of the functions in time.c. | |||
154 | For example, you may define your own timer interrupt routine, which does | 138 | For example, you may define your own timer interrupt routine, which does |
155 | some of its own processing and then calls timer_interrupt(). | 139 | some of its own processing and then calls timer_interrupt(). |
156 | 140 | ||
157 | You can also over-ride any of the built-in functions (gettimeoffset, | 141 | You can also over-ride any of the built-in functions (RTC routines |
158 | RTC routines and/or timer interrupt routine). | 142 | and/or timer interrupt routine). |
159 | 143 | ||
160 | 144 | ||
161 | PORTING NOTES FOR SMP | 145 | PORTING NOTES FOR SMP |
@@ -187,10 +171,3 @@ You need to decide on your timer interrupt sources. | |||
187 | 171 | ||
188 | You can also do the low-level version of those interrupt routines, | 172 | You can also do the low-level version of those interrupt routines, |
189 | following similar dispatching routes described above. | 173 | following similar dispatching routes described above. |
190 | |||
191 | Note about do_gettimeoffset(): | ||
192 | |||
193 | It is very likely the CPU counter registers are not sync'ed up in a SMP box. | ||
194 | Therefore you cannot really use the many of the existing routines that | ||
195 | are based on CPU counter. You should wirte your own gettimeoffset rouinte | ||
196 | if you want intra-jiffy resolution. | ||
diff --git a/Documentation/power/interface.txt b/Documentation/power/interface.txt index a66bec222b16..74311d7e0f3c 100644 --- a/Documentation/power/interface.txt +++ b/Documentation/power/interface.txt | |||
@@ -30,6 +30,17 @@ testing). The system will support either 'firmware' or 'platform', and | |||
30 | that is known a priori. But, the user may choose 'shutdown' or | 30 | that is known a priori. But, the user may choose 'shutdown' or |
31 | 'reboot' as alternatives. | 31 | 'reboot' as alternatives. |
32 | 32 | ||
33 | Additionally, /sys/power/disk can be used to turn on one of the two testing | ||
34 | modes of the suspend-to-disk mechanism: 'testproc' or 'test'. If the | ||
35 | suspend-to-disk mechanism is in the 'testproc' mode, writing 'disk' to | ||
36 | /sys/power/state will cause the kernel to disable nonboot CPUs and freeze | ||
37 | tasks, wait for 5 seconds, unfreeze tasks and enable nonboot CPUs. If it is | ||
38 | in the 'test' mode, writing 'disk' to /sys/power/state will cause the kernel | ||
39 | to disable nonboot CPUs and freeze tasks, shrink memory, suspend devices, wait | ||
40 | for 5 seconds, resume devices, unfreeze tasks and enable nonboot CPUs. Then, | ||
41 | we are able to look in the log messages and work out, for example, which code | ||
42 | is being slow and which device drivers are misbehaving. | ||
43 | |||
33 | Reading from this file will display what the mode is currently set | 44 | Reading from this file will display what the mode is currently set |
34 | to. Writing to this file will accept one of | 45 | to. Writing to this file will accept one of |
35 | 46 | ||
@@ -37,6 +48,8 @@ to. Writing to this file will accept one of | |||
37 | 'platform' | 48 | 'platform' |
38 | 'shutdown' | 49 | 'shutdown' |
39 | 'reboot' | 50 | 'reboot' |
51 | 'testproc' | ||
52 | 'test' | ||
40 | 53 | ||
41 | It will only change to 'firmware' or 'platform' if the system supports | 54 | It will only change to 'firmware' or 'platform' if the system supports |
42 | it. | 55 | it. |
diff --git a/Documentation/rtc.txt b/Documentation/rtc.txt index 2a58f985795a..7cf1ec5bcdd3 100644 --- a/Documentation/rtc.txt +++ b/Documentation/rtc.txt | |||
@@ -1,12 +1,49 @@ | |||
1 | 1 | ||
2 | Real Time Clock Driver for Linux | 2 | Real Time Clock (RTC) Drivers for Linux |
3 | ================================ | 3 | ======================================= |
4 | |||
5 | When Linux developers talk about a "Real Time Clock", they usually mean | ||
6 | something that tracks wall clock time and is battery backed so that it | ||
7 | works even with system power off. Such clocks will normally not track | ||
8 | the local time zone or daylight savings time -- unless they dual boot | ||
9 | with MS-Windows -- but will instead be set to Coordinated Universal Time | ||
10 | (UTC, formerly "Greenwich Mean Time"). | ||
11 | |||
12 | The newest non-PC hardware tends to just count seconds, like the time(2) | ||
13 | system call reports, but RTCs also very commonly represent time using | ||
14 | the Gregorian calendar and 24 hour time, as reported by gmtime(3). | ||
15 | |||
16 | Linux has two largely-compatible userspace RTC API families you may | ||
17 | need to know about: | ||
18 | |||
19 | * /dev/rtc ... is the RTC provided by PC compatible systems, | ||
20 | so it's not very portable to non-x86 systems. | ||
21 | |||
22 | * /dev/rtc0, /dev/rtc1 ... are part of a framework that's | ||
23 | supported by a wide variety of RTC chips on all systems. | ||
24 | |||
25 | Programmers need to understand that the PC/AT functionality is not | ||
26 | always available, and some systems can do much more. That is, the | ||
27 | RTCs use the same API to make requests in both RTC frameworks (using | ||
28 | different filenames of course), but the hardware may not offer the | ||
29 | same functionality. For example, not every RTC is hooked up to an | ||
30 | IRQ, so they can't all issue alarms; and where standard PC RTCs can | ||
31 | only issue an alarm up to 24 hours in the future, other hardware may | ||
32 | be able to schedule one any time in the upcoming century. | ||
33 | |||
34 | |||
35 | Old PC/AT-Compatible driver: /dev/rtc | ||
36 | -------------------------------------- | ||
4 | 37 | ||
5 | All PCs (even Alpha machines) have a Real Time Clock built into them. | 38 | All PCs (even Alpha machines) have a Real Time Clock built into them. |
6 | Usually they are built into the chipset of the computer, but some may | 39 | Usually they are built into the chipset of the computer, but some may |
7 | actually have a Motorola MC146818 (or clone) on the board. This is the | 40 | actually have a Motorola MC146818 (or clone) on the board. This is the |
8 | clock that keeps the date and time while your computer is turned off. | 41 | clock that keeps the date and time while your computer is turned off. |
9 | 42 | ||
43 | ACPI has standardized that MC146818 functionality, and extended it in | ||
44 | a few ways (enabling longer alarm periods, and wake-from-hibernate). | ||
45 | That functionality is NOT exposed in the old driver. | ||
46 | |||
10 | However it can also be used to generate signals from a slow 2Hz to a | 47 | However it can also be used to generate signals from a slow 2Hz to a |
11 | relatively fast 8192Hz, in increments of powers of two. These signals | 48 | relatively fast 8192Hz, in increments of powers of two. These signals |
12 | are reported by interrupt number 8. (Oh! So *that* is what IRQ 8 is | 49 | are reported by interrupt number 8. (Oh! So *that* is what IRQ 8 is |
@@ -63,223 +100,331 @@ Rather than write 50 pages describing the ioctl() and so on, it is | |||
63 | perhaps more useful to include a small test program that demonstrates | 100 | perhaps more useful to include a small test program that demonstrates |
64 | how to use them, and demonstrates the features of the driver. This is | 101 | how to use them, and demonstrates the features of the driver. This is |
65 | probably a lot more useful to people interested in writing applications | 102 | probably a lot more useful to people interested in writing applications |
66 | that will be using this driver. | 103 | that will be using this driver. See the code at the end of this document. |
104 | |||
105 | (The original /dev/rtc driver was written by Paul Gortmaker.) | ||
106 | |||
107 | |||
108 | New portable "RTC Class" drivers: /dev/rtcN | ||
109 | -------------------------------------------- | ||
110 | |||
111 | Because Linux supports many non-ACPI and non-PC platforms, some of which | ||
112 | have more than one RTC style clock, it needed a more portable solution | ||
113 | than expecting a single battery-backed MC146818 clone on every system. | ||
114 | Accordingly, a new "RTC Class" framework has been defined. It offers | ||
115 | three different userspace interfaces: | ||
116 | |||
117 | * /dev/rtcN ... much the same as the older /dev/rtc interface | ||
118 | |||
119 | * /sys/class/rtc/rtcN ... sysfs attributes support readonly | ||
120 | access to some RTC attributes. | ||
121 | |||
122 | * /proc/driver/rtc ... the first RTC (rtc0) may expose itself | ||
123 | using a procfs interface. More information is (currently) shown | ||
124 | here than through sysfs. | ||
125 | |||
126 | The RTC Class framework supports a wide variety of RTCs, ranging from those | ||
127 | integrated into embeddable system-on-chip (SOC) processors to discrete chips | ||
128 | using I2C, SPI, or some other bus to communicate with the host CPU. There's | ||
129 | even support for PC-style RTCs ... including the features exposed on newer PCs | ||
130 | through ACPI. | ||
131 | |||
132 | The new framework also removes the "one RTC per system" restriction. For | ||
133 | example, maybe the low-power battery-backed RTC is a discrete I2C chip, but | ||
134 | a high functionality RTC is integrated into the SOC. That system might read | ||
135 | the system clock from the discrete RTC, but use the integrated one for all | ||
136 | other tasks, because of its greater functionality. | ||
137 | |||
138 | The ioctl() calls supported by /dev/rtc are also supported by the RTC class | ||
139 | framework. However, because the chips and systems are not standardized, | ||
140 | some PC/AT functionality might not be provided. And in the same way, some | ||
141 | newer features -- including those enabled by ACPI -- are exposed by the | ||
142 | RTC class framework, but can't be supported by the older driver. | ||
143 | |||
144 | * RTC_RD_TIME, RTC_SET_TIME ... every RTC supports at least reading | ||
145 | time, returning the result as a Gregorian calendar date and 24 hour | ||
146 | wall clock time. To be most useful, this time may also be updated. | ||
147 | |||
148 | * RTC_AIE_ON, RTC_AIE_OFF, RTC_ALM_SET, RTC_ALM_READ ... when the RTC | ||
149 | is connected to an IRQ line, it can often issue an alarm IRQ up to | ||
150 | 24 hours in the future. | ||
151 | |||
152 | * RTC_WKALM_SET, RTC_WKALM_READ ... RTCs that can issue alarms beyond | ||
153 | the next 24 hours use a slightly more powerful API, which supports | ||
154 | setting the longer alarm time and enabling its IRQ using a single | ||
155 | request (using the same model as EFI firmware). | ||
156 | |||
157 | * RTC_UIE_ON, RTC_UIE_OFF ... if the RTC offers IRQs, it probably | ||
158 | also offers update IRQs whenever the "seconds" counter changes. | ||
159 | If needed, the RTC framework can emulate this mechanism. | ||
160 | |||
161 | * RTC_PIE_ON, RTC_PIE_OFF, RTC_IRQP_SET, RTC_IRQP_READ ... another | ||
162 | feature often accessible with an IRQ line is a periodic IRQ, issued | ||
163 | at settable frequencies (usually 2^N Hz). | ||
164 | |||
165 | In many cases, the RTC alarm can be a system wake event, used to force | ||
166 | Linux out of a low power sleep state (or hibernation) back to a fully | ||
167 | operational state. For example, a system could enter a deep power saving | ||
168 | state until it's time to execute some scheduled tasks. | ||
67 | 169 | ||
68 | Paul Gortmaker | ||
69 | 170 | ||
70 | -------------------- 8< ---------------- 8< ----------------------------- | 171 | -------------------- 8< ---------------- 8< ----------------------------- |
71 | 172 | ||
72 | /* | 173 | /* |
73 | * Real Time Clock Driver Test/Example Program | 174 | * Real Time Clock Driver Test/Example Program |
74 | * | 175 | * |
75 | * Compile with: | 176 | * Compile with: |
76 | * gcc -s -Wall -Wstrict-prototypes rtctest.c -o rtctest | 177 | * gcc -s -Wall -Wstrict-prototypes rtctest.c -o rtctest |
77 | * | 178 | * |
78 | * Copyright (C) 1996, Paul Gortmaker. | 179 | * Copyright (C) 1996, Paul Gortmaker. |
79 | * | 180 | * |
80 | * Released under the GNU General Public License, version 2, | 181 | * Released under the GNU General Public License, version 2, |
81 | * included herein by reference. | 182 | * included herein by reference. |
82 | * | 183 | * |
83 | */ | 184 | */ |
84 | 185 | ||
85 | #include <stdio.h> | 186 | #include <stdio.h> |
86 | #include <stdlib.h> | ||
87 | #include <linux/rtc.h> | 187 | #include <linux/rtc.h> |
88 | #include <sys/ioctl.h> | 188 | #include <sys/ioctl.h> |
89 | #include <sys/time.h> | 189 | #include <sys/time.h> |
90 | #include <sys/types.h> | 190 | #include <sys/types.h> |
91 | #include <fcntl.h> | 191 | #include <fcntl.h> |
92 | #include <unistd.h> | 192 | #include <unistd.h> |
193 | #include <stdlib.h> | ||
93 | #include <errno.h> | 194 | #include <errno.h> |
94 | 195 | ||
95 | int main(void) { | ||
96 | |||
97 | int i, fd, retval, irqcount = 0; | ||
98 | unsigned long tmp, data; | ||
99 | struct rtc_time rtc_tm; | ||
100 | 196 | ||
101 | fd = open ("/dev/rtc", O_RDONLY); | 197 | /* |
198 | * This expects the new RTC class driver framework, working with | ||
199 | * clocks that will often not be clones of what the PC-AT had. | ||
200 | * Use the command line to specify another RTC if you need one. | ||
201 | */ | ||
202 | static const char default_rtc[] = "/dev/rtc0"; | ||
203 | |||
204 | |||
205 | int main(int argc, char **argv) | ||
206 | { | ||
207 | int i, fd, retval, irqcount = 0; | ||
208 | unsigned long tmp, data; | ||
209 | struct rtc_time rtc_tm; | ||
210 | const char *rtc = default_rtc; | ||
211 | |||
212 | switch (argc) { | ||
213 | case 2: | ||
214 | rtc = argv[1]; | ||
215 | /* FALLTHROUGH */ | ||
216 | case 1: | ||
217 | break; | ||
218 | default: | ||
219 | fprintf(stderr, "usage: rtctest [rtcdev]\n"); | ||
220 | return 1; | ||
221 | } | ||
102 | 222 | ||
103 | if (fd == -1) { | 223 | fd = open(rtc, O_RDONLY); |
104 | perror("/dev/rtc"); | ||
105 | exit(errno); | ||
106 | } | ||
107 | 224 | ||
108 | fprintf(stderr, "\n\t\t\tRTC Driver Test Example.\n\n"); | 225 | if (fd == -1) { |
226 | perror(rtc); | ||
227 | exit(errno); | ||
228 | } | ||
109 | 229 | ||
110 | /* Turn on update interrupts (one per second) */ | 230 | fprintf(stderr, "\n\t\t\tRTC Driver Test Example.\n\n"); |
111 | retval = ioctl(fd, RTC_UIE_ON, 0); | ||
112 | if (retval == -1) { | ||
113 | perror("ioctl"); | ||
114 | exit(errno); | ||
115 | } | ||
116 | 231 | ||
117 | fprintf(stderr, "Counting 5 update (1/sec) interrupts from reading /dev/rtc:"); | 232 | /* Turn on update interrupts (one per second) */ |
118 | fflush(stderr); | 233 | retval = ioctl(fd, RTC_UIE_ON, 0); |
119 | for (i=1; i<6; i++) { | ||
120 | /* This read will block */ | ||
121 | retval = read(fd, &data, sizeof(unsigned long)); | ||
122 | if (retval == -1) { | 234 | if (retval == -1) { |
123 | perror("read"); | 235 | if (errno == ENOTTY) { |
236 | fprintf(stderr, | ||
237 | "\n...Update IRQs not supported.\n"); | ||
238 | goto test_READ; | ||
239 | } | ||
240 | perror("ioctl"); | ||
124 | exit(errno); | 241 | exit(errno); |
125 | } | 242 | } |
126 | fprintf(stderr, " %d",i); | 243 | |
244 | fprintf(stderr, "Counting 5 update (1/sec) interrupts from reading %s:", | ||
245 | rtc); | ||
127 | fflush(stderr); | 246 | fflush(stderr); |
128 | irqcount++; | 247 | for (i=1; i<6; i++) { |
129 | } | 248 | /* This read will block */ |
249 | retval = read(fd, &data, sizeof(unsigned long)); | ||
250 | if (retval == -1) { | ||
251 | perror("read"); | ||
252 | exit(errno); | ||
253 | } | ||
254 | fprintf(stderr, " %d",i); | ||
255 | fflush(stderr); | ||
256 | irqcount++; | ||
257 | } | ||
130 | 258 | ||
131 | fprintf(stderr, "\nAgain, from using select(2) on /dev/rtc:"); | 259 | fprintf(stderr, "\nAgain, from using select(2) on /dev/rtc:"); |
132 | fflush(stderr); | 260 | fflush(stderr); |
133 | for (i=1; i<6; i++) { | 261 | for (i=1; i<6; i++) { |
134 | struct timeval tv = {5, 0}; /* 5 second timeout on select */ | 262 | struct timeval tv = {5, 0}; /* 5 second timeout on select */ |
135 | fd_set readfds; | 263 | fd_set readfds; |
264 | |||
265 | FD_ZERO(&readfds); | ||
266 | FD_SET(fd, &readfds); | ||
267 | /* The select will wait until an RTC interrupt happens. */ | ||
268 | retval = select(fd+1, &readfds, NULL, NULL, &tv); | ||
269 | if (retval == -1) { | ||
270 | perror("select"); | ||
271 | exit(errno); | ||
272 | } | ||
273 | /* This read won't block unlike the select-less case above. */ | ||
274 | retval = read(fd, &data, sizeof(unsigned long)); | ||
275 | if (retval == -1) { | ||
276 | perror("read"); | ||
277 | exit(errno); | ||
278 | } | ||
279 | fprintf(stderr, " %d",i); | ||
280 | fflush(stderr); | ||
281 | irqcount++; | ||
282 | } | ||
136 | 283 | ||
137 | FD_ZERO(&readfds); | 284 | /* Turn off update interrupts */ |
138 | FD_SET(fd, &readfds); | 285 | retval = ioctl(fd, RTC_UIE_OFF, 0); |
139 | /* The select will wait until an RTC interrupt happens. */ | ||
140 | retval = select(fd+1, &readfds, NULL, NULL, &tv); | ||
141 | if (retval == -1) { | 286 | if (retval == -1) { |
142 | perror("select"); | 287 | perror("ioctl"); |
143 | exit(errno); | 288 | exit(errno); |
144 | } | 289 | } |
145 | /* This read won't block unlike the select-less case above. */ | 290 | |
146 | retval = read(fd, &data, sizeof(unsigned long)); | 291 | test_READ: |
292 | /* Read the RTC time/date */ | ||
293 | retval = ioctl(fd, RTC_RD_TIME, &rtc_tm); | ||
147 | if (retval == -1) { | 294 | if (retval == -1) { |
148 | perror("read"); | 295 | perror("ioctl"); |
149 | exit(errno); | 296 | exit(errno); |
150 | } | 297 | } |
151 | fprintf(stderr, " %d",i); | ||
152 | fflush(stderr); | ||
153 | irqcount++; | ||
154 | } | ||
155 | |||
156 | /* Turn off update interrupts */ | ||
157 | retval = ioctl(fd, RTC_UIE_OFF, 0); | ||
158 | if (retval == -1) { | ||
159 | perror("ioctl"); | ||
160 | exit(errno); | ||
161 | } | ||
162 | |||
163 | /* Read the RTC time/date */ | ||
164 | retval = ioctl(fd, RTC_RD_TIME, &rtc_tm); | ||
165 | if (retval == -1) { | ||
166 | perror("ioctl"); | ||
167 | exit(errno); | ||
168 | } | ||
169 | |||
170 | fprintf(stderr, "\n\nCurrent RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n", | ||
171 | rtc_tm.tm_mday, rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900, | ||
172 | rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); | ||
173 | |||
174 | /* Set the alarm to 5 sec in the future, and check for rollover */ | ||
175 | rtc_tm.tm_sec += 5; | ||
176 | if (rtc_tm.tm_sec >= 60) { | ||
177 | rtc_tm.tm_sec %= 60; | ||
178 | rtc_tm.tm_min++; | ||
179 | } | ||
180 | if (rtc_tm.tm_min == 60) { | ||
181 | rtc_tm.tm_min = 0; | ||
182 | rtc_tm.tm_hour++; | ||
183 | } | ||
184 | if (rtc_tm.tm_hour == 24) | ||
185 | rtc_tm.tm_hour = 0; | ||
186 | |||
187 | retval = ioctl(fd, RTC_ALM_SET, &rtc_tm); | ||
188 | if (retval == -1) { | ||
189 | perror("ioctl"); | ||
190 | exit(errno); | ||
191 | } | ||
192 | |||
193 | /* Read the current alarm settings */ | ||
194 | retval = ioctl(fd, RTC_ALM_READ, &rtc_tm); | ||
195 | if (retval == -1) { | ||
196 | perror("ioctl"); | ||
197 | exit(errno); | ||
198 | } | ||
199 | |||
200 | fprintf(stderr, "Alarm time now set to %02d:%02d:%02d.\n", | ||
201 | rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); | ||
202 | 298 | ||
203 | /* Enable alarm interrupts */ | 299 | fprintf(stderr, "\n\nCurrent RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n", |
204 | retval = ioctl(fd, RTC_AIE_ON, 0); | 300 | rtc_tm.tm_mday, rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900, |
205 | if (retval == -1) { | 301 | rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); |
206 | perror("ioctl"); | ||
207 | exit(errno); | ||
208 | } | ||
209 | 302 | ||
210 | fprintf(stderr, "Waiting 5 seconds for alarm..."); | 303 | /* Set the alarm to 5 sec in the future, and check for rollover */ |
211 | fflush(stderr); | 304 | rtc_tm.tm_sec += 5; |
212 | /* This blocks until the alarm ring causes an interrupt */ | 305 | if (rtc_tm.tm_sec >= 60) { |
213 | retval = read(fd, &data, sizeof(unsigned long)); | 306 | rtc_tm.tm_sec %= 60; |
214 | if (retval == -1) { | 307 | rtc_tm.tm_min++; |
215 | perror("read"); | 308 | } |
216 | exit(errno); | 309 | if (rtc_tm.tm_min == 60) { |
217 | } | 310 | rtc_tm.tm_min = 0; |
218 | irqcount++; | 311 | rtc_tm.tm_hour++; |
219 | fprintf(stderr, " okay. Alarm rang.\n"); | 312 | } |
220 | 313 | if (rtc_tm.tm_hour == 24) | |
221 | /* Disable alarm interrupts */ | 314 | rtc_tm.tm_hour = 0; |
222 | retval = ioctl(fd, RTC_AIE_OFF, 0); | ||
223 | if (retval == -1) { | ||
224 | perror("ioctl"); | ||
225 | exit(errno); | ||
226 | } | ||
227 | 315 | ||
228 | /* Read periodic IRQ rate */ | 316 | retval = ioctl(fd, RTC_ALM_SET, &rtc_tm); |
229 | retval = ioctl(fd, RTC_IRQP_READ, &tmp); | 317 | if (retval == -1) { |
230 | if (retval == -1) { | 318 | if (errno == ENOTTY) { |
231 | perror("ioctl"); | 319 | fprintf(stderr, |
232 | exit(errno); | 320 | "\n...Alarm IRQs not supported.\n"); |
233 | } | 321 | goto test_PIE; |
234 | fprintf(stderr, "\nPeriodic IRQ rate was %ldHz.\n", tmp); | 322 | } |
323 | perror("ioctl"); | ||
324 | exit(errno); | ||
325 | } | ||
235 | 326 | ||
236 | fprintf(stderr, "Counting 20 interrupts at:"); | 327 | /* Read the current alarm settings */ |
237 | fflush(stderr); | 328 | retval = ioctl(fd, RTC_ALM_READ, &rtc_tm); |
329 | if (retval == -1) { | ||
330 | perror("ioctl"); | ||
331 | exit(errno); | ||
332 | } | ||
238 | 333 | ||
239 | /* The frequencies 128Hz, 256Hz, ... 8192Hz are only allowed for root. */ | 334 | fprintf(stderr, "Alarm time now set to %02d:%02d:%02d.\n", |
240 | for (tmp=2; tmp<=64; tmp*=2) { | 335 | rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); |
241 | 336 | ||
242 | retval = ioctl(fd, RTC_IRQP_SET, tmp); | 337 | /* Enable alarm interrupts */ |
338 | retval = ioctl(fd, RTC_AIE_ON, 0); | ||
243 | if (retval == -1) { | 339 | if (retval == -1) { |
244 | perror("ioctl"); | 340 | perror("ioctl"); |
245 | exit(errno); | 341 | exit(errno); |
246 | } | 342 | } |
247 | 343 | ||
248 | fprintf(stderr, "\n%ldHz:\t", tmp); | 344 | fprintf(stderr, "Waiting 5 seconds for alarm..."); |
249 | fflush(stderr); | 345 | fflush(stderr); |
346 | /* This blocks until the alarm ring causes an interrupt */ | ||
347 | retval = read(fd, &data, sizeof(unsigned long)); | ||
348 | if (retval == -1) { | ||
349 | perror("read"); | ||
350 | exit(errno); | ||
351 | } | ||
352 | irqcount++; | ||
353 | fprintf(stderr, " okay. Alarm rang.\n"); | ||
250 | 354 | ||
251 | /* Enable periodic interrupts */ | 355 | /* Disable alarm interrupts */ |
252 | retval = ioctl(fd, RTC_PIE_ON, 0); | 356 | retval = ioctl(fd, RTC_AIE_OFF, 0); |
253 | if (retval == -1) { | 357 | if (retval == -1) { |
254 | perror("ioctl"); | 358 | perror("ioctl"); |
255 | exit(errno); | 359 | exit(errno); |
256 | } | 360 | } |
257 | 361 | ||
258 | for (i=1; i<21; i++) { | 362 | test_PIE: |
259 | /* This blocks */ | 363 | /* Read periodic IRQ rate */ |
260 | retval = read(fd, &data, sizeof(unsigned long)); | 364 | retval = ioctl(fd, RTC_IRQP_READ, &tmp); |
365 | if (retval == -1) { | ||
366 | /* not all RTCs support periodic IRQs */ | ||
367 | if (errno == ENOTTY) { | ||
368 | fprintf(stderr, "\nNo periodic IRQ support\n"); | ||
369 | return 0; | ||
370 | } | ||
371 | perror("ioctl"); | ||
372 | exit(errno); | ||
373 | } | ||
374 | fprintf(stderr, "\nPeriodic IRQ rate is %ldHz.\n", tmp); | ||
375 | |||
376 | fprintf(stderr, "Counting 20 interrupts at:"); | ||
377 | fflush(stderr); | ||
378 | |||
379 | /* The frequencies 128Hz, 256Hz, ... 8192Hz are only allowed for root. */ | ||
380 | for (tmp=2; tmp<=64; tmp*=2) { | ||
381 | |||
382 | retval = ioctl(fd, RTC_IRQP_SET, tmp); | ||
261 | if (retval == -1) { | 383 | if (retval == -1) { |
262 | perror("read"); | 384 | /* not all RTCs can change their periodic IRQ rate */ |
263 | exit(errno); | 385 | if (errno == ENOTTY) { |
386 | fprintf(stderr, | ||
387 | "\n...Periodic IRQ rate is fixed\n"); | ||
388 | goto done; | ||
389 | } | ||
390 | perror("ioctl"); | ||
391 | exit(errno); | ||
264 | } | 392 | } |
265 | fprintf(stderr, " %d",i); | 393 | |
394 | fprintf(stderr, "\n%ldHz:\t", tmp); | ||
266 | fflush(stderr); | 395 | fflush(stderr); |
267 | irqcount++; | ||
268 | } | ||
269 | 396 | ||
270 | /* Disable periodic interrupts */ | 397 | /* Enable periodic interrupts */ |
271 | retval = ioctl(fd, RTC_PIE_OFF, 0); | 398 | retval = ioctl(fd, RTC_PIE_ON, 0); |
272 | if (retval == -1) { | 399 | if (retval == -1) { |
273 | perror("ioctl"); | 400 | perror("ioctl"); |
274 | exit(errno); | 401 | exit(errno); |
402 | } | ||
403 | |||
404 | for (i=1; i<21; i++) { | ||
405 | /* This blocks */ | ||
406 | retval = read(fd, &data, sizeof(unsigned long)); | ||
407 | if (retval == -1) { | ||
408 | perror("read"); | ||
409 | exit(errno); | ||
410 | } | ||
411 | fprintf(stderr, " %d",i); | ||
412 | fflush(stderr); | ||
413 | irqcount++; | ||
414 | } | ||
415 | |||
416 | /* Disable periodic interrupts */ | ||
417 | retval = ioctl(fd, RTC_PIE_OFF, 0); | ||
418 | if (retval == -1) { | ||
419 | perror("ioctl"); | ||
420 | exit(errno); | ||
421 | } | ||
275 | } | 422 | } |
276 | } | ||
277 | 423 | ||
278 | fprintf(stderr, "\n\n\t\t\t *** Test complete ***\n"); | 424 | done: |
279 | fprintf(stderr, "\nTyping \"cat /proc/interrupts\" will show %d more events on IRQ 8.\n\n", | 425 | fprintf(stderr, "\n\n\t\t\t *** Test complete ***\n"); |
280 | irqcount); | ||
281 | 426 | ||
282 | close(fd); | 427 | close(fd); |
283 | return 0; | ||
284 | 428 | ||
285 | } /* end main */ | 429 | return 0; |
430 | } | ||
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt index 138673a907f5..3472d9c4ef1b 100644 --- a/Documentation/sound/alsa/ALSA-Configuration.txt +++ b/Documentation/sound/alsa/ALSA-Configuration.txt | |||
@@ -753,7 +753,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
753 | position_fix - Fix DMA pointer (0 = auto, 1 = none, 2 = POSBUF, 3 = FIFO size) | 753 | position_fix - Fix DMA pointer (0 = auto, 1 = none, 2 = POSBUF, 3 = FIFO size) |
754 | single_cmd - Use single immediate commands to communicate with | 754 | single_cmd - Use single immediate commands to communicate with |
755 | codecs (for debugging only) | 755 | codecs (for debugging only) |
756 | disable_msi - Disable Message Signaled Interrupt (MSI) | 756 | enable_msi - Enable Message Signaled Interrupt (MSI) (default = off) |
757 | 757 | ||
758 | This module supports one card and autoprobe. | 758 | This module supports one card and autoprobe. |
759 | 759 | ||
diff --git a/Documentation/usb/usb-serial.txt b/Documentation/usb/usb-serial.txt index 8dc2bacc8f1f..50436e1663ea 100644 --- a/Documentation/usb/usb-serial.txt +++ b/Documentation/usb/usb-serial.txt | |||
@@ -428,12 +428,6 @@ Options supported: | |||
428 | See http://www.uuhaus.de/linux/palmconnect.html for up-to-date | 428 | See http://www.uuhaus.de/linux/palmconnect.html for up-to-date |
429 | information on this driver. | 429 | information on this driver. |
430 | 430 | ||
431 | AIRcable USB Dongle Bluetooth driver | ||
432 | If there is the cdc_acm driver loaded in the system, you will find that the | ||
433 | cdc_acm claims the device before AIRcable can. This is simply corrected | ||
434 | by unloading both modules and then loading the aircable module before | ||
435 | cdc_acm module | ||
436 | |||
437 | Generic Serial driver | 431 | Generic Serial driver |
438 | 432 | ||
439 | If your device is not one of the above listed devices, compatible with | 433 | If your device is not one of the above listed devices, compatible with |
diff --git a/Documentation/watchdog/src/watchdog-simple.c b/Documentation/watchdog/src/watchdog-simple.c index 85cf17c48669..47801bc7e742 100644 --- a/Documentation/watchdog/src/watchdog-simple.c +++ b/Documentation/watchdog/src/watchdog-simple.c | |||
@@ -1,4 +1,6 @@ | |||
1 | #include <stdio.h> | ||
1 | #include <stdlib.h> | 2 | #include <stdlib.h> |
3 | #include <unistd.h> | ||
2 | #include <fcntl.h> | 4 | #include <fcntl.h> |
3 | 5 | ||
4 | int main(int argc, const char *argv[]) { | 6 | int main(int argc, const char *argv[]) { |
diff --git a/MAINTAINERS b/MAINTAINERS index d708702aba2f..e182992ff799 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -353,6 +353,12 @@ P: Richard Purdie | |||
353 | M: rpurdie@rpsys.net | 353 | M: rpurdie@rpsys.net |
354 | S: Maintained | 354 | S: Maintained |
355 | 355 | ||
356 | ARM/HP JORNADA 7XX MACHINE SUPPORT | ||
357 | P: Kristoffer Ericson | ||
358 | M: kristoffer_e1@hotmail.com | ||
359 | W: www.jlime.com | ||
360 | S: Maintained | ||
361 | |||
356 | ARM/TOSA MACHINE SUPPORT | 362 | ARM/TOSA MACHINE SUPPORT |
357 | P: Dirk Opfer | 363 | P: Dirk Opfer |
358 | M: dirk@opfer-online.de | 364 | M: dirk@opfer-online.de |
@@ -493,7 +499,7 @@ S: Maintained | |||
493 | 499 | ||
494 | BFS FILE SYSTEM | 500 | BFS FILE SYSTEM |
495 | P: Tigran A. Aivazian | 501 | P: Tigran A. Aivazian |
496 | M: tigran@veritas.com | 502 | M: tigran@aivazian.fsnet.co.uk |
497 | L: linux-kernel@vger.kernel.org | 503 | L: linux-kernel@vger.kernel.org |
498 | S: Maintained | 504 | S: Maintained |
499 | 505 | ||
@@ -1513,7 +1519,7 @@ S: Maintained | |||
1513 | 1519 | ||
1514 | INTEL IA32 MICROCODE UPDATE SUPPORT | 1520 | INTEL IA32 MICROCODE UPDATE SUPPORT |
1515 | P: Tigran Aivazian | 1521 | P: Tigran Aivazian |
1516 | M: tigran@veritas.com | 1522 | M: tigran@aivazian.fsnet.co.uk |
1517 | S: Maintained | 1523 | S: Maintained |
1518 | 1524 | ||
1519 | INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT | 1525 | INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT |
@@ -3072,6 +3078,13 @@ L: video4linux-list@redhat.com | |||
3072 | W: http://www.linux-projects.org | 3078 | W: http://www.linux-projects.org |
3073 | S: Maintained | 3079 | S: Maintained |
3074 | 3080 | ||
3081 | USB GADGET/PERIPHERAL SUBSYSTEM | ||
3082 | P: David Brownell | ||
3083 | M: dbrownell@users.sourceforge.net | ||
3084 | L: linux-usb-devel@lists.sourceforge.net | ||
3085 | W: http://www.linux-usb.org/gadget | ||
3086 | S: Maintained | ||
3087 | |||
3075 | USB HID/HIDBP DRIVERS | 3088 | USB HID/HIDBP DRIVERS |
3076 | P: Vojtech Pavlik | 3089 | P: Vojtech Pavlik |
3077 | M: vojtech@suse.cz | 3090 | M: vojtech@suse.cz |
@@ -3255,10 +3268,11 @@ L: linux-usb-users@lists.sourceforge.net | |||
3255 | L: linux-usb-devel@lists.sourceforge.net | 3268 | L: linux-usb-devel@lists.sourceforge.net |
3256 | S: Maintained | 3269 | S: Maintained |
3257 | 3270 | ||
3258 | USB "USBNET" DRIVER | 3271 | USB "USBNET" DRIVER FRAMEWORK |
3259 | P: David Brownell | 3272 | P: David Brownell |
3260 | M: dbrownell@users.sourceforge.net | 3273 | M: dbrownell@users.sourceforge.net |
3261 | L: linux-usb-devel@lists.sourceforge.net | 3274 | L: linux-usb-devel@lists.sourceforge.net |
3275 | W: http://www.linux-usb.org/usbnet | ||
3262 | S: Maintained | 3276 | S: Maintained |
3263 | 3277 | ||
3264 | USB W996[87]CF DRIVER | 3278 | USB W996[87]CF DRIVER |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 2 | 1 | VERSION = 2 |
2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
3 | SUBLEVEL = 19 | 3 | SUBLEVEL = 19 |
4 | EXTRAVERSION =-rc2 | 4 | EXTRAVERSION = |
5 | NAME=Avast! A bilge rat! | 5 | NAME=Avast! A bilge rat! |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
@@ -499,6 +499,7 @@ endif | |||
499 | 499 | ||
500 | ifdef CONFIG_UNWIND_INFO | 500 | ifdef CONFIG_UNWIND_INFO |
501 | CFLAGS += -fasynchronous-unwind-tables | 501 | CFLAGS += -fasynchronous-unwind-tables |
502 | LDFLAGS_vmlinux += --eh-frame-hdr | ||
502 | endif | 503 | endif |
503 | 504 | ||
504 | ifdef CONFIG_DEBUG_INFO | 505 | ifdef CONFIG_DEBUG_INFO |
diff --git a/arch/alpha/kernel/srm_env.c b/arch/alpha/kernel/srm_env.c index 990ac61028f8..f7dd081d57ff 100644 --- a/arch/alpha/kernel/srm_env.c +++ b/arch/alpha/kernel/srm_env.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * srm_env.c - Access to SRM environment | 2 | * srm_env.c - Access to SRM environment |
3 | * variables through linux' procfs | 3 | * variables through linux' procfs |
4 | * | 4 | * |
5 | * Copyright (C) 2001-2002 Jan-Benedict Glaw <jbglaw@lug-owl.de> | 5 | * (C) 2001,2002,2006 by Jan-Benedict Glaw <jbglaw@lug-owl.de> |
6 | * | 6 | * |
7 | * This driver is at all a modified version of Erik Mouw's | 7 | * This driver is at all a modified version of Erik Mouw's |
8 | * Documentation/DocBook/procfs_example.c, so: thank | 8 | * Documentation/DocBook/procfs_example.c, so: thank |
@@ -21,7 +21,7 @@ | |||
21 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | 21 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
22 | * PURPOSE. See the GNU General Public License for more | 22 | * PURPOSE. See the GNU General Public License for more |
23 | * details. | 23 | * details. |
24 | * | 24 | * |
25 | * You should have received a copy of the GNU General Public | 25 | * You should have received a copy of the GNU General Public |
26 | * License along with this program; if not, write to the | 26 | * License along with this program; if not, write to the |
27 | * Free Software Foundation, Inc., 59 Temple Place, | 27 | * Free Software Foundation, Inc., 59 Temple Place, |
@@ -29,33 +29,6 @@ | |||
29 | * | 29 | * |
30 | */ | 30 | */ |
31 | 31 | ||
32 | /* | ||
33 | * Changelog | ||
34 | * ~~~~~~~~~ | ||
35 | * | ||
36 | * Thu, 22 Aug 2002 15:10:43 +0200 | ||
37 | * - Update Config.help entry. I got a number of emails asking | ||
38 | * me to tell their senders if they could make use of this | ||
39 | * piece of code... So: "SRM is something like BIOS for your | ||
40 | * Alpha" | ||
41 | * - Update code formatting a bit to better conform CodingStyle | ||
42 | * rules. | ||
43 | * - So this is v0.0.5, with no changes (except formatting) | ||
44 | * | ||
45 | * Wed, 22 May 2002 00:11:21 +0200 | ||
46 | * - Fix typo on comment (SRC -> SRM) | ||
47 | * - Call this "Version 0.0.4" | ||
48 | * | ||
49 | * Tue, 9 Apr 2002 18:44:40 +0200 | ||
50 | * - Implement access by variable name and additionally | ||
51 | * by number. This is done by creating two subdirectories | ||
52 | * where one holds all names (like the old directory | ||
53 | * did) and the other holding 256 files named like "0", | ||
54 | * "1" and so on. | ||
55 | * - Call this "Version 0.0.3" | ||
56 | * | ||
57 | */ | ||
58 | |||
59 | #include <linux/kernel.h> | 32 | #include <linux/kernel.h> |
60 | #include <linux/module.h> | 33 | #include <linux/module.h> |
61 | #include <linux/init.h> | 34 | #include <linux/init.h> |
@@ -67,7 +40,7 @@ | |||
67 | #define BASE_DIR "srm_environment" /* Subdir in /proc/ */ | 40 | #define BASE_DIR "srm_environment" /* Subdir in /proc/ */ |
68 | #define NAMED_DIR "named_variables" /* Subdir for known variables */ | 41 | #define NAMED_DIR "named_variables" /* Subdir for known variables */ |
69 | #define NUMBERED_DIR "numbered_variables" /* Subdir for all variables */ | 42 | #define NUMBERED_DIR "numbered_variables" /* Subdir for all variables */ |
70 | #define VERSION "0.0.5" /* Module version */ | 43 | #define VERSION "0.0.6" /* Module version */ |
71 | #define NAME "srm_env" /* Module name */ | 44 | #define NAME "srm_env" /* Module name */ |
72 | 45 | ||
73 | MODULE_AUTHOR("Jan-Benedict Glaw <jbglaw@lug-owl.de>"); | 46 | MODULE_AUTHOR("Jan-Benedict Glaw <jbglaw@lug-owl.de>"); |
@@ -106,7 +79,6 @@ static srm_env_t srm_named_entries[] = { | |||
106 | static srm_env_t srm_numbered_entries[256]; | 79 | static srm_env_t srm_numbered_entries[256]; |
107 | 80 | ||
108 | 81 | ||
109 | |||
110 | static int | 82 | static int |
111 | srm_env_read(char *page, char **start, off_t off, int count, int *eof, | 83 | srm_env_read(char *page, char **start, off_t off, int count, int *eof, |
112 | void *data) | 84 | void *data) |
@@ -115,21 +87,23 @@ srm_env_read(char *page, char **start, off_t off, int count, int *eof, | |||
115 | unsigned long ret; | 87 | unsigned long ret; |
116 | srm_env_t *entry; | 88 | srm_env_t *entry; |
117 | 89 | ||
118 | if(off != 0) | 90 | if (off != 0) { |
119 | return -EFAULT; | 91 | *eof = 1; |
92 | return 0; | ||
93 | } | ||
120 | 94 | ||
121 | entry = (srm_env_t *) data; | 95 | entry = (srm_env_t *) data; |
122 | ret = callback_getenv(entry->id, page, count); | 96 | ret = callback_getenv(entry->id, page, count); |
123 | 97 | ||
124 | if((ret >> 61) == 0) | 98 | if ((ret >> 61) == 0) { |
125 | nbytes = (int) ret; | 99 | nbytes = (int) ret; |
126 | else | 100 | *eof = 1; |
101 | } else | ||
127 | nbytes = -EFAULT; | 102 | nbytes = -EFAULT; |
128 | 103 | ||
129 | return nbytes; | 104 | return nbytes; |
130 | } | 105 | } |
131 | 106 | ||
132 | |||
133 | static int | 107 | static int |
134 | srm_env_write(struct file *file, const char __user *buffer, unsigned long count, | 108 | srm_env_write(struct file *file, const char __user *buffer, unsigned long count, |
135 | void *data) | 109 | void *data) |
@@ -155,7 +129,7 @@ srm_env_write(struct file *file, const char __user *buffer, unsigned long count, | |||
155 | 129 | ||
156 | ret1 = callback_setenv(entry->id, buf, count); | 130 | ret1 = callback_setenv(entry->id, buf, count); |
157 | if ((ret1 >> 61) == 0) { | 131 | if ((ret1 >> 61) == 0) { |
158 | do | 132 | do |
159 | ret2 = callback_save_env(); | 133 | ret2 = callback_save_env(); |
160 | while((ret2 >> 61) == 1); | 134 | while((ret2 >> 61) == 1); |
161 | res = (int) ret1; | 135 | res = (int) ret1; |
@@ -172,14 +146,14 @@ srm_env_cleanup(void) | |||
172 | srm_env_t *entry; | 146 | srm_env_t *entry; |
173 | unsigned long var_num; | 147 | unsigned long var_num; |
174 | 148 | ||
175 | if(base_dir) { | 149 | if (base_dir) { |
176 | /* | 150 | /* |
177 | * Remove named entries | 151 | * Remove named entries |
178 | */ | 152 | */ |
179 | if(named_dir) { | 153 | if (named_dir) { |
180 | entry = srm_named_entries; | 154 | entry = srm_named_entries; |
181 | while(entry->name != NULL && entry->id != 0) { | 155 | while (entry->name != NULL && entry->id != 0) { |
182 | if(entry->proc_entry) { | 156 | if (entry->proc_entry) { |
183 | remove_proc_entry(entry->name, | 157 | remove_proc_entry(entry->name, |
184 | named_dir); | 158 | named_dir); |
185 | entry->proc_entry = NULL; | 159 | entry->proc_entry = NULL; |
@@ -192,11 +166,11 @@ srm_env_cleanup(void) | |||
192 | /* | 166 | /* |
193 | * Remove numbered entries | 167 | * Remove numbered entries |
194 | */ | 168 | */ |
195 | if(numbered_dir) { | 169 | if (numbered_dir) { |
196 | for(var_num = 0; var_num <= 255; var_num++) { | 170 | for (var_num = 0; var_num <= 255; var_num++) { |
197 | entry = &srm_numbered_entries[var_num]; | 171 | entry = &srm_numbered_entries[var_num]; |
198 | 172 | ||
199 | if(entry->proc_entry) { | 173 | if (entry->proc_entry) { |
200 | remove_proc_entry(entry->name, | 174 | remove_proc_entry(entry->name, |
201 | numbered_dir); | 175 | numbered_dir); |
202 | entry->proc_entry = NULL; | 176 | entry->proc_entry = NULL; |
@@ -212,7 +186,6 @@ srm_env_cleanup(void) | |||
212 | return; | 186 | return; |
213 | } | 187 | } |
214 | 188 | ||
215 | |||
216 | static int __init | 189 | static int __init |
217 | srm_env_init(void) | 190 | srm_env_init(void) |
218 | { | 191 | { |
@@ -222,7 +195,7 @@ srm_env_init(void) | |||
222 | /* | 195 | /* |
223 | * Check system | 196 | * Check system |
224 | */ | 197 | */ |
225 | if(!alpha_using_srm) { | 198 | if (!alpha_using_srm) { |
226 | printk(KERN_INFO "%s: This Alpha system doesn't " | 199 | printk(KERN_INFO "%s: This Alpha system doesn't " |
227 | "know about SRM (or you've booted " | 200 | "know about SRM (or you've booted " |
228 | "SRM->MILO->Linux, which gets " | 201 | "SRM->MILO->Linux, which gets " |
@@ -233,14 +206,14 @@ srm_env_init(void) | |||
233 | /* | 206 | /* |
234 | * Init numbers | 207 | * Init numbers |
235 | */ | 208 | */ |
236 | for(var_num = 0; var_num <= 255; var_num++) | 209 | for (var_num = 0; var_num <= 255; var_num++) |
237 | sprintf(number[var_num], "%ld", var_num); | 210 | sprintf(number[var_num], "%ld", var_num); |
238 | 211 | ||
239 | /* | 212 | /* |
240 | * Create base directory | 213 | * Create base directory |
241 | */ | 214 | */ |
242 | base_dir = proc_mkdir(BASE_DIR, NULL); | 215 | base_dir = proc_mkdir(BASE_DIR, NULL); |
243 | if(base_dir == NULL) { | 216 | if (!base_dir) { |
244 | printk(KERN_ERR "Couldn't create base dir /proc/%s\n", | 217 | printk(KERN_ERR "Couldn't create base dir /proc/%s\n", |
245 | BASE_DIR); | 218 | BASE_DIR); |
246 | goto cleanup; | 219 | goto cleanup; |
@@ -251,7 +224,7 @@ srm_env_init(void) | |||
251 | * Create per-name subdirectory | 224 | * Create per-name subdirectory |
252 | */ | 225 | */ |
253 | named_dir = proc_mkdir(NAMED_DIR, base_dir); | 226 | named_dir = proc_mkdir(NAMED_DIR, base_dir); |
254 | if(named_dir == NULL) { | 227 | if (!named_dir) { |
255 | printk(KERN_ERR "Couldn't create dir /proc/%s/%s\n", | 228 | printk(KERN_ERR "Couldn't create dir /proc/%s/%s\n", |
256 | BASE_DIR, NAMED_DIR); | 229 | BASE_DIR, NAMED_DIR); |
257 | goto cleanup; | 230 | goto cleanup; |
@@ -262,7 +235,7 @@ srm_env_init(void) | |||
262 | * Create per-number subdirectory | 235 | * Create per-number subdirectory |
263 | */ | 236 | */ |
264 | numbered_dir = proc_mkdir(NUMBERED_DIR, base_dir); | 237 | numbered_dir = proc_mkdir(NUMBERED_DIR, base_dir); |
265 | if(numbered_dir == NULL) { | 238 | if (!numbered_dir) { |
266 | printk(KERN_ERR "Couldn't create dir /proc/%s/%s\n", | 239 | printk(KERN_ERR "Couldn't create dir /proc/%s/%s\n", |
267 | BASE_DIR, NUMBERED_DIR); | 240 | BASE_DIR, NUMBERED_DIR); |
268 | goto cleanup; | 241 | goto cleanup; |
@@ -274,10 +247,10 @@ srm_env_init(void) | |||
274 | * Create all named nodes | 247 | * Create all named nodes |
275 | */ | 248 | */ |
276 | entry = srm_named_entries; | 249 | entry = srm_named_entries; |
277 | while(entry->name != NULL && entry->id != 0) { | 250 | while (entry->name && entry->id) { |
278 | entry->proc_entry = create_proc_entry(entry->name, | 251 | entry->proc_entry = create_proc_entry(entry->name, |
279 | 0644, named_dir); | 252 | 0644, named_dir); |
280 | if(entry->proc_entry == NULL) | 253 | if (!entry->proc_entry) |
281 | goto cleanup; | 254 | goto cleanup; |
282 | 255 | ||
283 | entry->proc_entry->data = (void *) entry; | 256 | entry->proc_entry->data = (void *) entry; |
@@ -291,13 +264,13 @@ srm_env_init(void) | |||
291 | /* | 264 | /* |
292 | * Create all numbered nodes | 265 | * Create all numbered nodes |
293 | */ | 266 | */ |
294 | for(var_num = 0; var_num <= 255; var_num++) { | 267 | for (var_num = 0; var_num <= 255; var_num++) { |
295 | entry = &srm_numbered_entries[var_num]; | 268 | entry = &srm_numbered_entries[var_num]; |
296 | entry->name = number[var_num]; | 269 | entry->name = number[var_num]; |
297 | 270 | ||
298 | entry->proc_entry = create_proc_entry(entry->name, | 271 | entry->proc_entry = create_proc_entry(entry->name, |
299 | 0644, numbered_dir); | 272 | 0644, numbered_dir); |
300 | if(entry->proc_entry == NULL) | 273 | if (!entry->proc_entry) |
301 | goto cleanup; | 274 | goto cleanup; |
302 | 275 | ||
303 | entry->id = var_num; | 276 | entry->id = var_num; |
@@ -318,7 +291,6 @@ cleanup: | |||
318 | return -ENOMEM; | 291 | return -ENOMEM; |
319 | } | 292 | } |
320 | 293 | ||
321 | |||
322 | static void __exit | 294 | static void __exit |
323 | srm_env_exit(void) | 295 | srm_env_exit(void) |
324 | { | 296 | { |
@@ -328,7 +300,5 @@ srm_env_exit(void) | |||
328 | return; | 300 | return; |
329 | } | 301 | } |
330 | 302 | ||
331 | |||
332 | module_init(srm_env_init); | 303 | module_init(srm_env_init); |
333 | module_exit(srm_env_exit); | 304 | module_exit(srm_env_exit); |
334 | |||
diff --git a/arch/alpha/kernel/vmlinux.lds.S b/arch/alpha/kernel/vmlinux.lds.S index 71470e9d93ba..76bf071e376c 100644 --- a/arch/alpha/kernel/vmlinux.lds.S +++ b/arch/alpha/kernel/vmlinux.lds.S | |||
@@ -48,13 +48,7 @@ SECTIONS | |||
48 | . = ALIGN(8); | 48 | . = ALIGN(8); |
49 | __initcall_start = .; | 49 | __initcall_start = .; |
50 | .initcall.init : { | 50 | .initcall.init : { |
51 | *(.initcall1.init) | 51 | INITCALLS |
52 | *(.initcall2.init) | ||
53 | *(.initcall3.init) | ||
54 | *(.initcall4.init) | ||
55 | *(.initcall5.init) | ||
56 | *(.initcall6.init) | ||
57 | *(.initcall7.init) | ||
58 | } | 52 | } |
59 | __initcall_end = .; | 53 | __initcall_end = .; |
60 | 54 | ||
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index adb05de40e24..ce00c570459d 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -879,6 +879,8 @@ endif | |||
879 | 879 | ||
880 | source "drivers/scsi/Kconfig" | 880 | source "drivers/scsi/Kconfig" |
881 | 881 | ||
882 | source "drivers/ata/Kconfig" | ||
883 | |||
882 | source "drivers/md/Kconfig" | 884 | source "drivers/md/Kconfig" |
883 | 885 | ||
884 | source "drivers/message/fusion/Kconfig" | 886 | source "drivers/message/fusion/Kconfig" |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 2a0b2c8a1fe0..6f4f8bf36071 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
@@ -174,11 +174,13 @@ libs-y := arch/arm/lib/ $(libs-y) | |||
174 | 174 | ||
175 | # Default target when executing plain make | 175 | # Default target when executing plain make |
176 | ifeq ($(CONFIG_XIP_KERNEL),y) | 176 | ifeq ($(CONFIG_XIP_KERNEL),y) |
177 | all: xipImage | 177 | KBUILD_IMAGE := xipImage |
178 | else | 178 | else |
179 | all: zImage | 179 | KBUILD_IMAGE := zImage |
180 | endif | 180 | endif |
181 | 181 | ||
182 | all: $(KBUILD_IMAGE) | ||
183 | |||
182 | boot := arch/arm/boot | 184 | boot := arch/arm/boot |
183 | 185 | ||
184 | # Update machine arch and proc symlinks if something which affects | 186 | # Update machine arch and proc symlinks if something which affects |
diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c index 028bdc9228fb..2e635b814c14 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c | |||
@@ -662,7 +662,8 @@ EXPORT_SYMBOL(dma_map_single); | |||
662 | EXPORT_SYMBOL(dma_unmap_single); | 662 | EXPORT_SYMBOL(dma_unmap_single); |
663 | EXPORT_SYMBOL(dma_map_sg); | 663 | EXPORT_SYMBOL(dma_map_sg); |
664 | EXPORT_SYMBOL(dma_unmap_sg); | 664 | EXPORT_SYMBOL(dma_unmap_sg); |
665 | EXPORT_SYMBOL(dma_sync_single); | 665 | EXPORT_SYMBOL(dma_sync_single_for_cpu); |
666 | EXPORT_SYMBOL(dma_sync_single_for_device); | ||
666 | EXPORT_SYMBOL(dma_sync_sg); | 667 | EXPORT_SYMBOL(dma_sync_sg); |
667 | EXPORT_SYMBOL(dmabounce_register_dev); | 668 | EXPORT_SYMBOL(dmabounce_register_dev); |
668 | EXPORT_SYMBOL(dmabounce_unregister_dev); | 669 | EXPORT_SYMBOL(dmabounce_unregister_dev); |
diff --git a/arch/arm/configs/assabet_defconfig b/arch/arm/configs/assabet_defconfig index 089c9d598409..b1cd331aaecf 100644 --- a/arch/arm/configs/assabet_defconfig +++ b/arch/arm/configs/assabet_defconfig | |||
@@ -184,6 +184,7 @@ CONFIG_BINFMT_ELF=y | |||
184 | # Power management options | 184 | # Power management options |
185 | # | 185 | # |
186 | CONFIG_PM=y | 186 | CONFIG_PM=y |
187 | # CONFIG_PM_LEGACY is not set | ||
187 | # CONFIG_APM is not set | 188 | # CONFIG_APM is not set |
188 | 189 | ||
189 | # | 190 | # |
diff --git a/arch/arm/configs/at91rm9200dk_defconfig b/arch/arm/configs/at91rm9200dk_defconfig index c82e4667f45e..b43041476e02 100644 --- a/arch/arm/configs/at91rm9200dk_defconfig +++ b/arch/arm/configs/at91rm9200dk_defconfig | |||
@@ -577,7 +577,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y | |||
577 | # Watchdog Device Drivers | 577 | # Watchdog Device Drivers |
578 | # | 578 | # |
579 | # CONFIG_SOFT_WATCHDOG is not set | 579 | # CONFIG_SOFT_WATCHDOG is not set |
580 | CONFIG_AT91_WATCHDOG=y | 580 | CONFIG_AT91RM9200_WATCHDOG=y |
581 | 581 | ||
582 | # | 582 | # |
583 | # USB-based Watchdog Cards | 583 | # USB-based Watchdog Cards |
diff --git a/arch/arm/configs/at91rm9200ek_defconfig b/arch/arm/configs/at91rm9200ek_defconfig index b983fc59aa42..d96fc8386e2f 100644 --- a/arch/arm/configs/at91rm9200ek_defconfig +++ b/arch/arm/configs/at91rm9200ek_defconfig | |||
@@ -558,7 +558,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y | |||
558 | # Watchdog Device Drivers | 558 | # Watchdog Device Drivers |
559 | # | 559 | # |
560 | # CONFIG_SOFT_WATCHDOG is not set | 560 | # CONFIG_SOFT_WATCHDOG is not set |
561 | CONFIG_AT91_WATCHDOG=y | 561 | CONFIG_AT91RM9200_WATCHDOG=y |
562 | 562 | ||
563 | # | 563 | # |
564 | # USB-based Watchdog Cards | 564 | # USB-based Watchdog Cards |
diff --git a/arch/arm/configs/ateb9200_defconfig b/arch/arm/configs/ateb9200_defconfig index 15e6b0bbbde8..3de5c643848c 100644 --- a/arch/arm/configs/ateb9200_defconfig +++ b/arch/arm/configs/ateb9200_defconfig | |||
@@ -217,7 +217,7 @@ CONFIG_BINFMT_ELF=y | |||
217 | # Power management options | 217 | # Power management options |
218 | # | 218 | # |
219 | CONFIG_PM=y | 219 | CONFIG_PM=y |
220 | CONFIG_PM_LEGACY=y | 220 | # CONFIG_PM_LEGACY is not set |
221 | # CONFIG_PM_DEBUG is not set | 221 | # CONFIG_PM_DEBUG is not set |
222 | # CONFIG_APM is not set | 222 | # CONFIG_APM is not set |
223 | 223 | ||
diff --git a/arch/arm/configs/cerfcube_defconfig b/arch/arm/configs/cerfcube_defconfig index f81a60005cd3..09b7acd7f647 100644 --- a/arch/arm/configs/cerfcube_defconfig +++ b/arch/arm/configs/cerfcube_defconfig | |||
@@ -194,6 +194,7 @@ CONFIG_BINFMT_ELF=y | |||
194 | # Power management options | 194 | # Power management options |
195 | # | 195 | # |
196 | CONFIG_PM=y | 196 | CONFIG_PM=y |
197 | # CONFIG_PM_LEGACY is not set | ||
197 | # CONFIG_APM is not set | 198 | # CONFIG_APM is not set |
198 | 199 | ||
199 | # | 200 | # |
diff --git a/arch/arm/configs/collie_defconfig b/arch/arm/configs/collie_defconfig index 074c47a4fb2e..a3758913c0bb 100644 --- a/arch/arm/configs/collie_defconfig +++ b/arch/arm/configs/collie_defconfig | |||
@@ -219,7 +219,7 @@ CONFIG_BINFMT_ELF=y | |||
219 | # Power management options | 219 | # Power management options |
220 | # | 220 | # |
221 | CONFIG_PM=y | 221 | CONFIG_PM=y |
222 | CONFIG_PM_LEGACY=y | 222 | # CONFIG_PM_LEGACY is not set |
223 | # CONFIG_PM_DEBUG is not set | 223 | # CONFIG_PM_DEBUG is not set |
224 | CONFIG_APM=y | 224 | CONFIG_APM=y |
225 | 225 | ||
diff --git a/arch/arm/configs/corgi_defconfig b/arch/arm/configs/corgi_defconfig index 3c3461e83398..c41c04fa5020 100644 --- a/arch/arm/configs/corgi_defconfig +++ b/arch/arm/configs/corgi_defconfig | |||
@@ -208,6 +208,7 @@ CONFIG_BINFMT_MISC=m | |||
208 | # Power management options | 208 | # Power management options |
209 | # | 209 | # |
210 | CONFIG_PM=y | 210 | CONFIG_PM=y |
211 | # CONFIG_PM_LEGACY is not set | ||
211 | CONFIG_APM=y | 212 | CONFIG_APM=y |
212 | 213 | ||
213 | # | 214 | # |
diff --git a/arch/arm/configs/csb337_defconfig b/arch/arm/configs/csb337_defconfig index a2d6fd398f16..20e68250d835 100644 --- a/arch/arm/configs/csb337_defconfig +++ b/arch/arm/configs/csb337_defconfig | |||
@@ -615,7 +615,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y | |||
615 | # Watchdog Device Drivers | 615 | # Watchdog Device Drivers |
616 | # | 616 | # |
617 | # CONFIG_SOFT_WATCHDOG is not set | 617 | # CONFIG_SOFT_WATCHDOG is not set |
618 | CONFIG_AT91_WATCHDOG=y | 618 | CONFIG_AT91RM9200_WATCHDOG=y |
619 | 619 | ||
620 | # | 620 | # |
621 | # USB-based Watchdog Cards | 621 | # USB-based Watchdog Cards |
diff --git a/arch/arm/configs/csb637_defconfig b/arch/arm/configs/csb637_defconfig index 2a1ac6c60abc..df8595ac031f 100644 --- a/arch/arm/configs/csb637_defconfig +++ b/arch/arm/configs/csb637_defconfig | |||
@@ -615,7 +615,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y | |||
615 | # Watchdog Device Drivers | 615 | # Watchdog Device Drivers |
616 | # | 616 | # |
617 | # CONFIG_SOFT_WATCHDOG is not set | 617 | # CONFIG_SOFT_WATCHDOG is not set |
618 | CONFIG_AT91_WATCHDOG=y | 618 | CONFIG_AT91RM9200_WATCHDOG=y |
619 | 619 | ||
620 | # | 620 | # |
621 | # USB-based Watchdog Cards | 621 | # USB-based Watchdog Cards |
diff --git a/arch/arm/configs/h3600_defconfig b/arch/arm/configs/h3600_defconfig index 7a0da0b7facb..8f986e9f1c62 100644 --- a/arch/arm/configs/h3600_defconfig +++ b/arch/arm/configs/h3600_defconfig | |||
@@ -194,6 +194,7 @@ CONFIG_BINFMT_ELF=y | |||
194 | # Power management options | 194 | # Power management options |
195 | # | 195 | # |
196 | CONFIG_PM=y | 196 | CONFIG_PM=y |
197 | # CONFIG_PM_LEGACY is not set | ||
197 | # CONFIG_APM is not set | 198 | # CONFIG_APM is not set |
198 | 199 | ||
199 | # | 200 | # |
diff --git a/arch/arm/configs/integrator_defconfig b/arch/arm/configs/integrator_defconfig index d1ba7fdde818..692ab57ba1ca 100644 --- a/arch/arm/configs/integrator_defconfig +++ b/arch/arm/configs/integrator_defconfig | |||
@@ -190,6 +190,7 @@ CONFIG_BINFMT_ELF=y | |||
190 | # Power management options | 190 | # Power management options |
191 | # | 191 | # |
192 | CONFIG_PM=y | 192 | CONFIG_PM=y |
193 | # CONFIG_PM_LEGACY is not set | ||
193 | # CONFIG_APM is not set | 194 | # CONFIG_APM is not set |
194 | 195 | ||
195 | # | 196 | # |
diff --git a/arch/arm/configs/ixp4xx_defconfig b/arch/arm/configs/ixp4xx_defconfig index 4975b914f923..fac7c3b240c0 100644 --- a/arch/arm/configs/ixp4xx_defconfig +++ b/arch/arm/configs/ixp4xx_defconfig | |||
@@ -206,10 +206,8 @@ CONFIG_BINFMT_ELF=y | |||
206 | # | 206 | # |
207 | # Power management options | 207 | # Power management options |
208 | # | 208 | # |
209 | CONFIG_PM=y | 209 | # CONFIG_PM is not set |
210 | CONFIG_PM_LEGACY=y | 210 | # CONFIG_APM is not set |
211 | # CONFIG_PM_DEBUG is not set | ||
212 | CONFIG_APM=y | ||
213 | 211 | ||
214 | # | 212 | # |
215 | # Networking | 213 | # Networking |
diff --git a/arch/arm/configs/jornada720_defconfig b/arch/arm/configs/jornada720_defconfig index ad1048db96fb..80a6fd97eb32 100644 --- a/arch/arm/configs/jornada720_defconfig +++ b/arch/arm/configs/jornada720_defconfig | |||
@@ -182,6 +182,7 @@ CONFIG_BINFMT_AOUT=m | |||
182 | # Power management options | 182 | # Power management options |
183 | # | 183 | # |
184 | CONFIG_PM=y | 184 | CONFIG_PM=y |
185 | # CONFIG_PM_LEGACY is not set | ||
185 | # CONFIG_APM is not set | 186 | # CONFIG_APM is not set |
186 | 187 | ||
187 | # | 188 | # |
diff --git a/arch/arm/configs/kafa_defconfig b/arch/arm/configs/kafa_defconfig index 54fcd75779da..a4cdafc1548a 100644 --- a/arch/arm/configs/kafa_defconfig +++ b/arch/arm/configs/kafa_defconfig | |||
@@ -560,7 +560,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y | |||
560 | # Watchdog Device Drivers | 560 | # Watchdog Device Drivers |
561 | # | 561 | # |
562 | # CONFIG_SOFT_WATCHDOG is not set | 562 | # CONFIG_SOFT_WATCHDOG is not set |
563 | CONFIG_AT91_WATCHDOG=y | 563 | CONFIG_AT91RM9200_WATCHDOG=y |
564 | # CONFIG_NVRAM is not set | 564 | # CONFIG_NVRAM is not set |
565 | # CONFIG_DTLK is not set | 565 | # CONFIG_DTLK is not set |
566 | # CONFIG_R3964 is not set | 566 | # CONFIG_R3964 is not set |
diff --git a/arch/arm/configs/lart_defconfig b/arch/arm/configs/lart_defconfig index c3a932844160..a1cc34f25602 100644 --- a/arch/arm/configs/lart_defconfig +++ b/arch/arm/configs/lart_defconfig | |||
@@ -180,6 +180,7 @@ CONFIG_BINFMT_AOUT=y | |||
180 | # Power management options | 180 | # Power management options |
181 | # | 181 | # |
182 | CONFIG_PM=y | 182 | CONFIG_PM=y |
183 | # CONFIG_PM_LEGACY is not set | ||
183 | CONFIG_APM=m | 184 | CONFIG_APM=m |
184 | 185 | ||
185 | # | 186 | # |
diff --git a/arch/arm/configs/neponset_defconfig b/arch/arm/configs/neponset_defconfig index 3d35255c64ed..df8168e57b7c 100644 --- a/arch/arm/configs/neponset_defconfig +++ b/arch/arm/configs/neponset_defconfig | |||
@@ -190,6 +190,7 @@ CONFIG_BINFMT_AOUT=y | |||
190 | # Power management options | 190 | # Power management options |
191 | # | 191 | # |
192 | CONFIG_PM=y | 192 | CONFIG_PM=y |
193 | # CONFIG_PM_LEGACY is not set | ||
193 | CONFIG_APM=y | 194 | CONFIG_APM=y |
194 | 195 | ||
195 | # | 196 | # |
diff --git a/arch/arm/configs/omap_h2_1610_defconfig b/arch/arm/configs/omap_h2_1610_defconfig index 05adb0b34e72..b0efd4ca9935 100644 --- a/arch/arm/configs/omap_h2_1610_defconfig +++ b/arch/arm/configs/omap_h2_1610_defconfig | |||
@@ -257,7 +257,7 @@ CONFIG_BINFMT_AOUT=y | |||
257 | # Power management options | 257 | # Power management options |
258 | # | 258 | # |
259 | CONFIG_PM=y | 259 | CONFIG_PM=y |
260 | CONFIG_PM_LEGACY=y | 260 | # CONFIG_PM_LEGACY is not set |
261 | # CONFIG_PM_DEBUG is not set | 261 | # CONFIG_PM_DEBUG is not set |
262 | # CONFIG_APM is not set | 262 | # CONFIG_APM is not set |
263 | 263 | ||
diff --git a/arch/arm/configs/onearm_defconfig b/arch/arm/configs/onearm_defconfig index cb1d94f9049e..9b9f2155af35 100644 --- a/arch/arm/configs/onearm_defconfig +++ b/arch/arm/configs/onearm_defconfig | |||
@@ -607,7 +607,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y | |||
607 | # Watchdog Device Drivers | 607 | # Watchdog Device Drivers |
608 | # | 608 | # |
609 | # CONFIG_SOFT_WATCHDOG is not set | 609 | # CONFIG_SOFT_WATCHDOG is not set |
610 | CONFIG_AT91_WATCHDOG=y | 610 | CONFIG_AT91RM9200_WATCHDOG=y |
611 | 611 | ||
612 | # | 612 | # |
613 | # USB-based Watchdog Cards | 613 | # USB-based Watchdog Cards |
diff --git a/arch/arm/configs/bast_defconfig b/arch/arm/configs/realview-smp_defconfig index 4a8564f386af..ffd905ff19f1 100644 --- a/arch/arm/configs/bast_defconfig +++ b/arch/arm/configs/realview-smp_defconfig | |||
@@ -1,136 +1,168 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.12-rc1-bk2 | 3 | # Linux kernel version: 2.6.19-rc3 |
4 | # Sun Mar 27 02:24:16 2005 | 4 | # Wed Oct 25 14:12:00 2006 |
5 | # | 5 | # |
6 | CONFIG_ARM=y | 6 | CONFIG_ARM=y |
7 | # CONFIG_GENERIC_TIME is not set | ||
7 | CONFIG_MMU=y | 8 | CONFIG_MMU=y |
8 | CONFIG_UID16=y | 9 | CONFIG_GENERIC_HARDIRQS=y |
10 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
11 | CONFIG_HARDIRQS_SW_RESEND=y | ||
12 | CONFIG_GENERIC_IRQ_PROBE=y | ||
9 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | 13 | CONFIG_RWSEM_GENERIC_SPINLOCK=y |
14 | CONFIG_GENERIC_HWEIGHT=y | ||
10 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 15 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
11 | CONFIG_GENERIC_IOMAP=y | 16 | CONFIG_VECTORS_BASE=0xffff0000 |
17 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
12 | 18 | ||
13 | # | 19 | # |
14 | # Code maturity level options | 20 | # Code maturity level options |
15 | # | 21 | # |
16 | CONFIG_EXPERIMENTAL=y | 22 | CONFIG_EXPERIMENTAL=y |
17 | CONFIG_CLEAN_COMPILE=y | 23 | CONFIG_LOCK_KERNEL=y |
18 | CONFIG_BROKEN_ON_SMP=y | 24 | CONFIG_INIT_ENV_ARG_LIMIT=32 |
19 | 25 | ||
20 | # | 26 | # |
21 | # General setup | 27 | # General setup |
22 | # | 28 | # |
23 | CONFIG_LOCALVERSION="" | 29 | CONFIG_LOCALVERSION="" |
24 | CONFIG_SWAP=y | 30 | CONFIG_LOCALVERSION_AUTO=y |
31 | # CONFIG_SWAP is not set | ||
25 | CONFIG_SYSVIPC=y | 32 | CONFIG_SYSVIPC=y |
33 | # CONFIG_IPC_NS is not set | ||
26 | # CONFIG_POSIX_MQUEUE is not set | 34 | # CONFIG_POSIX_MQUEUE is not set |
27 | # CONFIG_BSD_PROCESS_ACCT is not set | 35 | # CONFIG_BSD_PROCESS_ACCT is not set |
28 | CONFIG_SYSCTL=y | 36 | # CONFIG_TASKSTATS is not set |
37 | # CONFIG_UTS_NS is not set | ||
29 | # CONFIG_AUDIT is not set | 38 | # CONFIG_AUDIT is not set |
30 | # CONFIG_HOTPLUG is not set | ||
31 | CONFIG_KOBJECT_UEVENT=y | ||
32 | # CONFIG_IKCONFIG is not set | 39 | # CONFIG_IKCONFIG is not set |
40 | # CONFIG_CPUSETS is not set | ||
41 | # CONFIG_RELAY is not set | ||
42 | CONFIG_INITRAMFS_SOURCE="" | ||
43 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
44 | CONFIG_SYSCTL=y | ||
33 | # CONFIG_EMBEDDED is not set | 45 | # CONFIG_EMBEDDED is not set |
46 | CONFIG_UID16=y | ||
47 | # CONFIG_SYSCTL_SYSCALL is not set | ||
34 | CONFIG_KALLSYMS=y | 48 | CONFIG_KALLSYMS=y |
35 | # CONFIG_KALLSYMS_ALL is not set | 49 | CONFIG_KALLSYMS_ALL=y |
36 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | 50 | # CONFIG_KALLSYMS_EXTRA_PASS is not set |
51 | CONFIG_HOTPLUG=y | ||
52 | CONFIG_PRINTK=y | ||
53 | CONFIG_BUG=y | ||
54 | CONFIG_ELF_CORE=y | ||
37 | CONFIG_BASE_FULL=y | 55 | CONFIG_BASE_FULL=y |
38 | CONFIG_FUTEX=y | 56 | CONFIG_FUTEX=y |
39 | CONFIG_EPOLL=y | 57 | CONFIG_EPOLL=y |
40 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
41 | CONFIG_SHMEM=y | 58 | CONFIG_SHMEM=y |
42 | CONFIG_CC_ALIGN_FUNCTIONS=0 | 59 | CONFIG_SLAB=y |
43 | CONFIG_CC_ALIGN_LABELS=0 | 60 | CONFIG_VM_EVENT_COUNTERS=y |
44 | CONFIG_CC_ALIGN_LOOPS=0 | 61 | CONFIG_RT_MUTEXES=y |
45 | CONFIG_CC_ALIGN_JUMPS=0 | ||
46 | # CONFIG_TINY_SHMEM is not set | 62 | # CONFIG_TINY_SHMEM is not set |
47 | CONFIG_BASE_SMALL=0 | 63 | CONFIG_BASE_SMALL=0 |
64 | # CONFIG_SLOB is not set | ||
48 | 65 | ||
49 | # | 66 | # |
50 | # Loadable module support | 67 | # Loadable module support |
51 | # | 68 | # |
52 | CONFIG_MODULES=y | 69 | CONFIG_MODULES=y |
53 | # CONFIG_MODULE_UNLOAD is not set | 70 | CONFIG_MODULE_UNLOAD=y |
54 | CONFIG_OBSOLETE_MODPARM=y | 71 | # CONFIG_MODULE_FORCE_UNLOAD is not set |
55 | # CONFIG_MODVERSIONS is not set | 72 | # CONFIG_MODVERSIONS is not set |
56 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 73 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
57 | CONFIG_KMOD=y | 74 | # CONFIG_KMOD is not set |
75 | CONFIG_STOP_MACHINE=y | ||
76 | |||
77 | # | ||
78 | # Block layer | ||
79 | # | ||
80 | CONFIG_BLOCK=y | ||
81 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
82 | |||
83 | # | ||
84 | # IO Schedulers | ||
85 | # | ||
86 | CONFIG_IOSCHED_NOOP=y | ||
87 | # CONFIG_IOSCHED_AS is not set | ||
88 | CONFIG_IOSCHED_DEADLINE=y | ||
89 | # CONFIG_IOSCHED_CFQ is not set | ||
90 | # CONFIG_DEFAULT_AS is not set | ||
91 | CONFIG_DEFAULT_DEADLINE=y | ||
92 | # CONFIG_DEFAULT_CFQ is not set | ||
93 | # CONFIG_DEFAULT_NOOP is not set | ||
94 | CONFIG_DEFAULT_IOSCHED="deadline" | ||
58 | 95 | ||
59 | # | 96 | # |
60 | # System Type | 97 | # System Type |
61 | # | 98 | # |
99 | # CONFIG_ARCH_AAEC2000 is not set | ||
100 | # CONFIG_ARCH_INTEGRATOR is not set | ||
101 | CONFIG_ARCH_REALVIEW=y | ||
102 | # CONFIG_ARCH_VERSATILE is not set | ||
103 | # CONFIG_ARCH_AT91 is not set | ||
62 | # CONFIG_ARCH_CLPS7500 is not set | 104 | # CONFIG_ARCH_CLPS7500 is not set |
63 | # CONFIG_ARCH_CLPS711X is not set | 105 | # CONFIG_ARCH_CLPS711X is not set |
64 | # CONFIG_ARCH_CO285 is not set | 106 | # CONFIG_ARCH_CO285 is not set |
65 | # CONFIG_ARCH_EBSA110 is not set | 107 | # CONFIG_ARCH_EBSA110 is not set |
108 | # CONFIG_ARCH_EP93XX is not set | ||
66 | # CONFIG_ARCH_FOOTBRIDGE is not set | 109 | # CONFIG_ARCH_FOOTBRIDGE is not set |
67 | # CONFIG_ARCH_INTEGRATOR is not set | 110 | # CONFIG_ARCH_NETX is not set |
68 | # CONFIG_ARCH_IOP3XX is not set | 111 | # CONFIG_ARCH_H720X is not set |
112 | # CONFIG_ARCH_IMX is not set | ||
113 | # CONFIG_ARCH_IOP32X is not set | ||
114 | # CONFIG_ARCH_IOP33X is not set | ||
69 | # CONFIG_ARCH_IXP4XX is not set | 115 | # CONFIG_ARCH_IXP4XX is not set |
70 | # CONFIG_ARCH_IXP2000 is not set | 116 | # CONFIG_ARCH_IXP2000 is not set |
117 | # CONFIG_ARCH_IXP23XX is not set | ||
71 | # CONFIG_ARCH_L7200 is not set | 118 | # CONFIG_ARCH_L7200 is not set |
119 | # CONFIG_ARCH_PNX4008 is not set | ||
72 | # CONFIG_ARCH_PXA is not set | 120 | # CONFIG_ARCH_PXA is not set |
73 | # CONFIG_ARCH_RPC is not set | 121 | # CONFIG_ARCH_RPC is not set |
74 | # CONFIG_ARCH_SA1100 is not set | 122 | # CONFIG_ARCH_SA1100 is not set |
75 | CONFIG_ARCH_S3C2410=y | 123 | # CONFIG_ARCH_S3C2410 is not set |
76 | # CONFIG_ARCH_SHARK is not set | 124 | # CONFIG_ARCH_SHARK is not set |
77 | # CONFIG_ARCH_LH7A40X is not set | 125 | # CONFIG_ARCH_LH7A40X is not set |
78 | # CONFIG_ARCH_OMAP is not set | 126 | # CONFIG_ARCH_OMAP is not set |
79 | # CONFIG_ARCH_VERSATILE is not set | ||
80 | # CONFIG_ARCH_IMX is not set | ||
81 | # CONFIG_ARCH_H720X is not set | ||
82 | |||
83 | # | ||
84 | # S3C24XX Implementations | ||
85 | # | ||
86 | CONFIG_ARCH_BAST=y | ||
87 | # CONFIG_ARCH_H1940 is not set | ||
88 | # CONFIG_MACH_N30 is not set | ||
89 | # CONFIG_ARCH_SMDK2410 is not set | ||
90 | # CONFIG_ARCH_S3C2440 is not set | ||
91 | CONFIG_MACH_VR1000=y | ||
92 | # CONFIG_MACH_RX3715 is not set | ||
93 | # CONFIG_MACH_OTOM is not set | ||
94 | # CONFIG_MACH_NEXCODER_2440 is not set | ||
95 | CONFIG_CPU_S3C2410=y | ||
96 | |||
97 | # | ||
98 | # S3C2410 Boot | ||
99 | # | ||
100 | # CONFIG_S3C2410_BOOT_WATCHDOG is not set | ||
101 | 127 | ||
102 | # | 128 | # |
103 | # S3C2410 Setup | 129 | # RealView platform type |
104 | # | 130 | # |
105 | CONFIG_S3C2410_DMA=y | 131 | CONFIG_MACH_REALVIEW_EB=y |
106 | # CONFIG_S3C2410_DMA_DEBUG is not set | 132 | CONFIG_REALVIEW_MPCORE=y |
107 | # CONFIG_S3C2410_PM_DEBUG is not set | ||
108 | # CONFIG_S3C2410_PM_CHECK is not set | ||
109 | CONFIG_S3C2410_LOWLEVEL_UART_PORT=0 | ||
110 | 133 | ||
111 | # | 134 | # |
112 | # Processor Type | 135 | # Processor Type |
113 | # | 136 | # |
114 | CONFIG_CPU_32=y | 137 | CONFIG_CPU_32=y |
115 | CONFIG_CPU_ARM920T=y | 138 | # CONFIG_CPU_ARM926T is not set |
116 | CONFIG_CPU_32v4=y | 139 | CONFIG_CPU_V6=y |
117 | CONFIG_CPU_ABRT_EV4T=y | 140 | CONFIG_CPU_32v6K=y |
118 | CONFIG_CPU_CACHE_V4WT=y | 141 | CONFIG_CPU_32v6=y |
119 | CONFIG_CPU_CACHE_VIVT=y | 142 | CONFIG_CPU_ABRT_EV6=y |
120 | CONFIG_CPU_COPY_V4WB=y | 143 | CONFIG_CPU_CACHE_V6=y |
121 | CONFIG_CPU_TLB_V4WBI=y | 144 | CONFIG_CPU_CACHE_VIPT=y |
145 | CONFIG_CPU_COPY_V6=y | ||
146 | CONFIG_CPU_TLB_V6=y | ||
147 | CONFIG_CPU_CP15=y | ||
148 | CONFIG_CPU_CP15_MMU=y | ||
122 | 149 | ||
123 | # | 150 | # |
124 | # Processor Features | 151 | # Processor Features |
125 | # | 152 | # |
126 | # CONFIG_ARM_THUMB is not set | 153 | CONFIG_ARM_THUMB=y |
127 | # CONFIG_CPU_ICACHE_DISABLE is not set | 154 | # CONFIG_CPU_ICACHE_DISABLE is not set |
128 | # CONFIG_CPU_DCACHE_DISABLE is not set | 155 | # CONFIG_CPU_DCACHE_DISABLE is not set |
129 | # CONFIG_CPU_DCACHE_WRITETHROUGH is not set | 156 | # CONFIG_CPU_DCACHE_WRITETHROUGH is not set |
157 | # CONFIG_CPU_BPREDICT_DISABLE is not set | ||
158 | CONFIG_HAS_TLS_REG=y | ||
159 | CONFIG_ARM_GIC=y | ||
160 | CONFIG_ICST307=y | ||
130 | 161 | ||
131 | # | 162 | # |
132 | # Bus support | 163 | # Bus support |
133 | # | 164 | # |
165 | CONFIG_ARM_AMBA=y | ||
134 | 166 | ||
135 | # | 167 | # |
136 | # PCCARD (PCMCIA/CardBus) support | 168 | # PCCARD (PCMCIA/CardBus) support |
@@ -140,7 +172,24 @@ CONFIG_CPU_TLB_V4WBI=y | |||
140 | # | 172 | # |
141 | # Kernel Features | 173 | # Kernel Features |
142 | # | 174 | # |
175 | CONFIG_SMP=y | ||
176 | CONFIG_NR_CPUS=4 | ||
177 | CONFIG_HOTPLUG_CPU=y | ||
178 | CONFIG_LOCAL_TIMERS=y | ||
143 | # CONFIG_PREEMPT is not set | 179 | # CONFIG_PREEMPT is not set |
180 | # CONFIG_NO_IDLE_HZ is not set | ||
181 | CONFIG_HZ=100 | ||
182 | # CONFIG_AEABI is not set | ||
183 | # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||
184 | CONFIG_SELECT_MEMORY_MODEL=y | ||
185 | CONFIG_FLATMEM_MANUAL=y | ||
186 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
187 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
188 | CONFIG_FLATMEM=y | ||
189 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
190 | # CONFIG_SPARSEMEM_STATIC is not set | ||
191 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
192 | # CONFIG_RESOURCES_64BIT is not set | ||
144 | CONFIG_ALIGNMENT_TRAP=y | 193 | CONFIG_ALIGNMENT_TRAP=y |
145 | 194 | ||
146 | # | 195 | # |
@@ -148,7 +197,7 @@ CONFIG_ALIGNMENT_TRAP=y | |||
148 | # | 197 | # |
149 | CONFIG_ZBOOT_ROM_TEXT=0x0 | 198 | CONFIG_ZBOOT_ROM_TEXT=0x0 |
150 | CONFIG_ZBOOT_ROM_BSS=0x0 | 199 | CONFIG_ZBOOT_ROM_BSS=0x0 |
151 | CONFIG_CMDLINE="root=/dev/hda1 ro init=/bin/bash console=ttySAC0" | 200 | CONFIG_CMDLINE="root=/dev/nfs nfsroot=10.1.69.3:/work/nfsroot ip=dhcp console=ttyAMA0 mem=128M" |
152 | # CONFIG_XIP_KERNEL is not set | 201 | # CONFIG_XIP_KERNEL is not set |
153 | 202 | ||
154 | # | 203 | # |
@@ -161,20 +210,105 @@ CONFIG_CMDLINE="root=/dev/hda1 ro init=/bin/bash console=ttySAC0" | |||
161 | CONFIG_FPE_NWFPE=y | 210 | CONFIG_FPE_NWFPE=y |
162 | # CONFIG_FPE_NWFPE_XP is not set | 211 | # CONFIG_FPE_NWFPE_XP is not set |
163 | # CONFIG_FPE_FASTFPE is not set | 212 | # CONFIG_FPE_FASTFPE is not set |
213 | CONFIG_VFP=y | ||
164 | 214 | ||
165 | # | 215 | # |
166 | # Userspace binary formats | 216 | # Userspace binary formats |
167 | # | 217 | # |
168 | CONFIG_BINFMT_ELF=y | 218 | CONFIG_BINFMT_ELF=y |
169 | CONFIG_BINFMT_AOUT=y | 219 | # CONFIG_BINFMT_AOUT is not set |
170 | # CONFIG_BINFMT_MISC is not set | 220 | # CONFIG_BINFMT_MISC is not set |
171 | # CONFIG_ARTHUR is not set | 221 | # CONFIG_ARTHUR is not set |
172 | 222 | ||
173 | # | 223 | # |
174 | # Power management options | 224 | # Power management options |
175 | # | 225 | # |
176 | CONFIG_PM=y | 226 | # CONFIG_PM is not set |
177 | CONFIG_APM=y | 227 | # CONFIG_APM is not set |
228 | |||
229 | # | ||
230 | # Networking | ||
231 | # | ||
232 | CONFIG_NET=y | ||
233 | |||
234 | # | ||
235 | # Networking options | ||
236 | # | ||
237 | # CONFIG_NETDEBUG is not set | ||
238 | CONFIG_PACKET=y | ||
239 | # CONFIG_PACKET_MMAP is not set | ||
240 | CONFIG_UNIX=y | ||
241 | # CONFIG_NET_KEY is not set | ||
242 | CONFIG_INET=y | ||
243 | # CONFIG_IP_MULTICAST is not set | ||
244 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
245 | CONFIG_IP_FIB_HASH=y | ||
246 | CONFIG_IP_PNP=y | ||
247 | CONFIG_IP_PNP_DHCP=y | ||
248 | CONFIG_IP_PNP_BOOTP=y | ||
249 | # CONFIG_IP_PNP_RARP is not set | ||
250 | # CONFIG_NET_IPIP is not set | ||
251 | # CONFIG_NET_IPGRE is not set | ||
252 | # CONFIG_ARPD is not set | ||
253 | # CONFIG_SYN_COOKIES is not set | ||
254 | # CONFIG_INET_AH is not set | ||
255 | # CONFIG_INET_ESP is not set | ||
256 | # CONFIG_INET_IPCOMP is not set | ||
257 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
258 | # CONFIG_INET_TUNNEL is not set | ||
259 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
260 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
261 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
262 | CONFIG_INET_DIAG=y | ||
263 | CONFIG_INET_TCP_DIAG=y | ||
264 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
265 | CONFIG_TCP_CONG_CUBIC=y | ||
266 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
267 | # CONFIG_IPV6 is not set | ||
268 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
269 | # CONFIG_INET6_TUNNEL is not set | ||
270 | # CONFIG_NETWORK_SECMARK is not set | ||
271 | # CONFIG_NETFILTER is not set | ||
272 | |||
273 | # | ||
274 | # DCCP Configuration (EXPERIMENTAL) | ||
275 | # | ||
276 | # CONFIG_IP_DCCP is not set | ||
277 | |||
278 | # | ||
279 | # SCTP Configuration (EXPERIMENTAL) | ||
280 | # | ||
281 | # CONFIG_IP_SCTP is not set | ||
282 | |||
283 | # | ||
284 | # TIPC Configuration (EXPERIMENTAL) | ||
285 | # | ||
286 | # CONFIG_TIPC is not set | ||
287 | # CONFIG_ATM is not set | ||
288 | # CONFIG_BRIDGE is not set | ||
289 | # CONFIG_VLAN_8021Q is not set | ||
290 | # CONFIG_DECNET is not set | ||
291 | # CONFIG_LLC2 is not set | ||
292 | # CONFIG_IPX is not set | ||
293 | # CONFIG_ATALK is not set | ||
294 | # CONFIG_X25 is not set | ||
295 | # CONFIG_LAPB is not set | ||
296 | # CONFIG_ECONET is not set | ||
297 | # CONFIG_WAN_ROUTER is not set | ||
298 | |||
299 | # | ||
300 | # QoS and/or fair queueing | ||
301 | # | ||
302 | # CONFIG_NET_SCHED is not set | ||
303 | |||
304 | # | ||
305 | # Network testing | ||
306 | # | ||
307 | # CONFIG_NET_PKTGEN is not set | ||
308 | # CONFIG_HAMRADIO is not set | ||
309 | # CONFIG_IRDA is not set | ||
310 | # CONFIG_BT is not set | ||
311 | # CONFIG_IEEE80211 is not set | ||
178 | 312 | ||
179 | # | 313 | # |
180 | # Device Drivers | 314 | # Device Drivers |
@@ -187,6 +321,12 @@ CONFIG_STANDALONE=y | |||
187 | CONFIG_PREVENT_FIRMWARE_BUILD=y | 321 | CONFIG_PREVENT_FIRMWARE_BUILD=y |
188 | # CONFIG_FW_LOADER is not set | 322 | # CONFIG_FW_LOADER is not set |
189 | # CONFIG_DEBUG_DRIVER is not set | 323 | # CONFIG_DEBUG_DRIVER is not set |
324 | # CONFIG_SYS_HYPERVISOR is not set | ||
325 | |||
326 | # | ||
327 | # Connector - unified userspace <-> kernelspace linker | ||
328 | # | ||
329 | # CONFIG_CONNECTOR is not set | ||
190 | 330 | ||
191 | # | 331 | # |
192 | # Memory Technology Devices (MTD) | 332 | # Memory Technology Devices (MTD) |
@@ -195,10 +335,7 @@ CONFIG_MTD=y | |||
195 | # CONFIG_MTD_DEBUG is not set | 335 | # CONFIG_MTD_DEBUG is not set |
196 | # CONFIG_MTD_CONCAT is not set | 336 | # CONFIG_MTD_CONCAT is not set |
197 | CONFIG_MTD_PARTITIONS=y | 337 | CONFIG_MTD_PARTITIONS=y |
198 | CONFIG_MTD_REDBOOT_PARTS=y | 338 | # CONFIG_MTD_REDBOOT_PARTS is not set |
199 | CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 | ||
200 | CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y | ||
201 | # CONFIG_MTD_REDBOOT_PARTS_READONLY is not set | ||
202 | CONFIG_MTD_CMDLINE_PARTS=y | 339 | CONFIG_MTD_CMDLINE_PARTS=y |
203 | # CONFIG_MTD_AFS_PARTS is not set | 340 | # CONFIG_MTD_AFS_PARTS is not set |
204 | 341 | ||
@@ -210,44 +347,42 @@ CONFIG_MTD_BLOCK=y | |||
210 | # CONFIG_FTL is not set | 347 | # CONFIG_FTL is not set |
211 | # CONFIG_NFTL is not set | 348 | # CONFIG_NFTL is not set |
212 | # CONFIG_INFTL is not set | 349 | # CONFIG_INFTL is not set |
350 | # CONFIG_RFD_FTL is not set | ||
351 | # CONFIG_SSFDC is not set | ||
213 | 352 | ||
214 | # | 353 | # |
215 | # RAM/ROM/Flash chip drivers | 354 | # RAM/ROM/Flash chip drivers |
216 | # | 355 | # |
217 | CONFIG_MTD_CFI=y | 356 | CONFIG_MTD_CFI=y |
218 | CONFIG_MTD_JEDECPROBE=y | 357 | # CONFIG_MTD_JEDECPROBE is not set |
219 | CONFIG_MTD_GEN_PROBE=y | 358 | CONFIG_MTD_GEN_PROBE=y |
220 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | 359 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set |
221 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | 360 | CONFIG_MTD_MAP_BANK_WIDTH_1=y |
222 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | 361 | CONFIG_MTD_MAP_BANK_WIDTH_2=y |
223 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | 362 | CONFIG_MTD_MAP_BANK_WIDTH_4=y |
224 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | 363 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set |
225 | CONFIG_MTD_MAP_BANK_WIDTH_16=y | 364 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set |
226 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | 365 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set |
227 | CONFIG_MTD_CFI_I1=y | 366 | CONFIG_MTD_CFI_I1=y |
228 | CONFIG_MTD_CFI_I2=y | 367 | CONFIG_MTD_CFI_I2=y |
229 | # CONFIG_MTD_CFI_I4 is not set | 368 | # CONFIG_MTD_CFI_I4 is not set |
230 | # CONFIG_MTD_CFI_I8 is not set | 369 | # CONFIG_MTD_CFI_I8 is not set |
231 | CONFIG_MTD_CFI_INTELEXT=y | 370 | CONFIG_MTD_CFI_INTELEXT=y |
232 | # CONFIG_MTD_CFI_AMDSTD is not set | 371 | CONFIG_MTD_CFI_AMDSTD=y |
233 | # CONFIG_MTD_CFI_STAA is not set | 372 | # CONFIG_MTD_CFI_STAA is not set |
234 | CONFIG_MTD_CFI_UTIL=y | 373 | CONFIG_MTD_CFI_UTIL=y |
235 | # CONFIG_MTD_RAM is not set | 374 | # CONFIG_MTD_RAM is not set |
236 | # CONFIG_MTD_ROM is not set | 375 | # CONFIG_MTD_ROM is not set |
237 | # CONFIG_MTD_ABSENT is not set | 376 | # CONFIG_MTD_ABSENT is not set |
238 | # CONFIG_MTD_OBSOLETE_CHIPS is not set | 377 | # CONFIG_MTD_OBSOLETE_CHIPS is not set |
239 | # CONFIG_MTD_XIP is not set | ||
240 | 378 | ||
241 | # | 379 | # |
242 | # Mapping drivers for chip access | 380 | # Mapping drivers for chip access |
243 | # | 381 | # |
244 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | 382 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set |
245 | # CONFIG_MTD_PHYSMAP is not set | 383 | # CONFIG_MTD_PHYSMAP is not set |
246 | # CONFIG_MTD_ARM_INTEGRATOR is not set | 384 | CONFIG_MTD_ARM_INTEGRATOR=y |
247 | # CONFIG_MTD_EDB7312 is not set | 385 | # CONFIG_MTD_PLATRAM is not set |
248 | # CONFIG_MTD_IMPA7 is not set | ||
249 | CONFIG_MTD_BAST=y | ||
250 | CONFIG_MTD_BAST_MAXSIZE=4 | ||
251 | 386 | ||
252 | # | 387 | # |
253 | # Self-contained MTD device drivers | 388 | # Self-contained MTD device drivers |
@@ -255,7 +390,6 @@ CONFIG_MTD_BAST_MAXSIZE=4 | |||
255 | # CONFIG_MTD_SLRAM is not set | 390 | # CONFIG_MTD_SLRAM is not set |
256 | # CONFIG_MTD_PHRAM is not set | 391 | # CONFIG_MTD_PHRAM is not set |
257 | # CONFIG_MTD_MTDRAM is not set | 392 | # CONFIG_MTD_MTDRAM is not set |
258 | # CONFIG_MTD_BLKMTD is not set | ||
259 | # CONFIG_MTD_BLOCK2MTD is not set | 393 | # CONFIG_MTD_BLOCK2MTD is not set |
260 | 394 | ||
261 | # | 395 | # |
@@ -268,23 +402,17 @@ CONFIG_MTD_BAST_MAXSIZE=4 | |||
268 | # | 402 | # |
269 | # NAND Flash Device Drivers | 403 | # NAND Flash Device Drivers |
270 | # | 404 | # |
271 | CONFIG_MTD_NAND=y | 405 | # CONFIG_MTD_NAND is not set |
272 | # CONFIG_MTD_NAND_VERIFY_WRITE is not set | 406 | |
273 | CONFIG_MTD_NAND_IDS=y | 407 | # |
274 | CONFIG_MTD_NAND_S3C2410=y | 408 | # OneNAND Flash Device Drivers |
275 | # CONFIG_MTD_NAND_S3C2410_DEBUG is not set | 409 | # |
276 | # CONFIG_MTD_NAND_S3C2410_HWECC is not set | 410 | # CONFIG_MTD_ONENAND is not set |
277 | # CONFIG_MTD_NAND_DISKONCHIP is not set | ||
278 | # CONFIG_MTD_NAND_NANDSIM is not set | ||
279 | 411 | ||
280 | # | 412 | # |
281 | # Parallel port support | 413 | # Parallel port support |
282 | # | 414 | # |
283 | CONFIG_PARPORT=y | 415 | # CONFIG_PARPORT is not set |
284 | # CONFIG_PARPORT_PC is not set | ||
285 | # CONFIG_PARPORT_ARC is not set | ||
286 | # CONFIG_PARPORT_GSC is not set | ||
287 | CONFIG_PARPORT_1284=y | ||
288 | 416 | ||
289 | # | 417 | # |
290 | # Plug and Play support | 418 | # Plug and Play support |
@@ -293,59 +421,20 @@ CONFIG_PARPORT_1284=y | |||
293 | # | 421 | # |
294 | # Block devices | 422 | # Block devices |
295 | # | 423 | # |
296 | # CONFIG_BLK_DEV_FD is not set | ||
297 | # CONFIG_PARIDE is not set | ||
298 | # CONFIG_BLK_DEV_COW_COMMON is not set | 424 | # CONFIG_BLK_DEV_COW_COMMON is not set |
299 | CONFIG_BLK_DEV_LOOP=y | 425 | # CONFIG_BLK_DEV_LOOP is not set |
300 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | 426 | # CONFIG_BLK_DEV_NBD is not set |
301 | CONFIG_BLK_DEV_NBD=m | 427 | # CONFIG_BLK_DEV_RAM is not set |
302 | CONFIG_BLK_DEV_RAM=y | ||
303 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
304 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
305 | CONFIG_BLK_DEV_INITRD=y | 428 | CONFIG_BLK_DEV_INITRD=y |
306 | CONFIG_INITRAMFS_SOURCE="" | ||
307 | # CONFIG_CDROM_PKTCDVD is not set | 429 | # CONFIG_CDROM_PKTCDVD is not set |
308 | |||
309 | # | ||
310 | # IO Schedulers | ||
311 | # | ||
312 | CONFIG_IOSCHED_NOOP=y | ||
313 | CONFIG_IOSCHED_AS=y | ||
314 | CONFIG_IOSCHED_DEADLINE=y | ||
315 | CONFIG_IOSCHED_CFQ=y | ||
316 | # CONFIG_ATA_OVER_ETH is not set | 430 | # CONFIG_ATA_OVER_ETH is not set |
317 | 431 | ||
318 | # | 432 | # |
319 | # ATA/ATAPI/MFM/RLL support | ||
320 | # | ||
321 | CONFIG_IDE=y | ||
322 | CONFIG_BLK_DEV_IDE=y | ||
323 | |||
324 | # | ||
325 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
326 | # | ||
327 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
328 | CONFIG_BLK_DEV_IDEDISK=y | ||
329 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
330 | CONFIG_BLK_DEV_IDECD=y | ||
331 | CONFIG_BLK_DEV_IDETAPE=m | ||
332 | CONFIG_BLK_DEV_IDEFLOPPY=m | ||
333 | # CONFIG_IDE_TASK_IOCTL is not set | ||
334 | |||
335 | # | ||
336 | # IDE chipset support/bugfixes | ||
337 | # | ||
338 | CONFIG_IDE_GENERIC=y | ||
339 | # CONFIG_IDE_ARM is not set | ||
340 | CONFIG_BLK_DEV_IDE_BAST=y | ||
341 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
342 | # CONFIG_IDEDMA_AUTO is not set | ||
343 | # CONFIG_BLK_DEV_HD is not set | ||
344 | |||
345 | # | ||
346 | # SCSI device support | 433 | # SCSI device support |
347 | # | 434 | # |
435 | # CONFIG_RAID_ATTRS is not set | ||
348 | # CONFIG_SCSI is not set | 436 | # CONFIG_SCSI is not set |
437 | # CONFIG_SCSI_NETLINK is not set | ||
349 | 438 | ||
350 | # | 439 | # |
351 | # Multi-device support (RAID and LVM) | 440 | # Multi-device support (RAID and LVM) |
@@ -355,6 +444,7 @@ CONFIG_BLK_DEV_IDE_BAST=y | |||
355 | # | 444 | # |
356 | # Fusion MPT device support | 445 | # Fusion MPT device support |
357 | # | 446 | # |
447 | # CONFIG_FUSION is not set | ||
358 | 448 | ||
359 | # | 449 | # |
360 | # IEEE 1394 (FireWire) support | 450 | # IEEE 1394 (FireWire) support |
@@ -365,69 +455,8 @@ CONFIG_BLK_DEV_IDE_BAST=y | |||
365 | # | 455 | # |
366 | 456 | ||
367 | # | 457 | # |
368 | # Networking support | 458 | # Network device support |
369 | # | ||
370 | CONFIG_NET=y | ||
371 | |||
372 | # | ||
373 | # Networking options | ||
374 | # | ||
375 | # CONFIG_PACKET is not set | ||
376 | # CONFIG_NETLINK_DEV is not set | ||
377 | CONFIG_UNIX=y | ||
378 | # CONFIG_NET_KEY is not set | ||
379 | CONFIG_INET=y | ||
380 | # CONFIG_IP_MULTICAST is not set | ||
381 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
382 | CONFIG_IP_PNP=y | ||
383 | # CONFIG_IP_PNP_DHCP is not set | ||
384 | CONFIG_IP_PNP_BOOTP=y | ||
385 | # CONFIG_IP_PNP_RARP is not set | ||
386 | # CONFIG_NET_IPIP is not set | ||
387 | # CONFIG_NET_IPGRE is not set | ||
388 | # CONFIG_ARPD is not set | ||
389 | # CONFIG_SYN_COOKIES is not set | ||
390 | # CONFIG_INET_AH is not set | ||
391 | # CONFIG_INET_ESP is not set | ||
392 | # CONFIG_INET_IPCOMP is not set | ||
393 | # CONFIG_INET_TUNNEL is not set | ||
394 | CONFIG_IP_TCPDIAG=y | ||
395 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
396 | # CONFIG_IPV6 is not set | ||
397 | # CONFIG_NETFILTER is not set | ||
398 | |||
399 | # | ||
400 | # SCTP Configuration (EXPERIMENTAL) | ||
401 | # | ||
402 | # CONFIG_IP_SCTP is not set | ||
403 | # CONFIG_ATM is not set | ||
404 | # CONFIG_BRIDGE is not set | ||
405 | # CONFIG_VLAN_8021Q is not set | ||
406 | # CONFIG_DECNET is not set | ||
407 | # CONFIG_LLC2 is not set | ||
408 | # CONFIG_IPX is not set | ||
409 | # CONFIG_ATALK is not set | ||
410 | # CONFIG_X25 is not set | ||
411 | # CONFIG_LAPB is not set | ||
412 | # CONFIG_NET_DIVERT is not set | ||
413 | # CONFIG_ECONET is not set | ||
414 | # CONFIG_WAN_ROUTER is not set | ||
415 | |||
416 | # | ||
417 | # QoS and/or fair queueing | ||
418 | # | ||
419 | # CONFIG_NET_SCHED is not set | ||
420 | # CONFIG_NET_CLS_ROUTE is not set | ||
421 | |||
422 | # | ||
423 | # Network testing | ||
424 | # | 459 | # |
425 | # CONFIG_NET_PKTGEN is not set | ||
426 | # CONFIG_NETPOLL is not set | ||
427 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
428 | # CONFIG_HAMRADIO is not set | ||
429 | # CONFIG_IRDA is not set | ||
430 | # CONFIG_BT is not set | ||
431 | CONFIG_NETDEVICES=y | 460 | CONFIG_NETDEVICES=y |
432 | # CONFIG_DUMMY is not set | 461 | # CONFIG_DUMMY is not set |
433 | # CONFIG_BONDING is not set | 462 | # CONFIG_BONDING is not set |
@@ -435,11 +464,17 @@ CONFIG_NETDEVICES=y | |||
435 | # CONFIG_TUN is not set | 464 | # CONFIG_TUN is not set |
436 | 465 | ||
437 | # | 466 | # |
467 | # PHY device support | ||
468 | # | ||
469 | # CONFIG_PHYLIB is not set | ||
470 | |||
471 | # | ||
438 | # Ethernet (10 or 100Mbit) | 472 | # Ethernet (10 or 100Mbit) |
439 | # | 473 | # |
440 | CONFIG_NET_ETHERNET=y | 474 | CONFIG_NET_ETHERNET=y |
441 | # CONFIG_MII is not set | 475 | CONFIG_MII=y |
442 | # CONFIG_SMC91X is not set | 476 | CONFIG_SMC91X=y |
477 | # CONFIG_DM9000 is not set | ||
443 | 478 | ||
444 | # | 479 | # |
445 | # Ethernet (1000 Mbit) | 480 | # Ethernet (1000 Mbit) |
@@ -462,11 +497,12 @@ CONFIG_NET_ETHERNET=y | |||
462 | # Wan interfaces | 497 | # Wan interfaces |
463 | # | 498 | # |
464 | # CONFIG_WAN is not set | 499 | # CONFIG_WAN is not set |
465 | # CONFIG_PLIP is not set | ||
466 | # CONFIG_PPP is not set | 500 | # CONFIG_PPP is not set |
467 | # CONFIG_SLIP is not set | 501 | # CONFIG_SLIP is not set |
468 | # CONFIG_SHAPER is not set | 502 | # CONFIG_SHAPER is not set |
469 | # CONFIG_NETCONSOLE is not set | 503 | # CONFIG_NETCONSOLE is not set |
504 | # CONFIG_NETPOLL is not set | ||
505 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
470 | 506 | ||
471 | # | 507 | # |
472 | # ISDN subsystem | 508 | # ISDN subsystem |
@@ -477,6 +513,7 @@ CONFIG_NET_ETHERNET=y | |||
477 | # Input device support | 513 | # Input device support |
478 | # | 514 | # |
479 | CONFIG_INPUT=y | 515 | CONFIG_INPUT=y |
516 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
480 | 517 | ||
481 | # | 518 | # |
482 | # Userland interfaces | 519 | # Userland interfaces |
@@ -499,6 +536,7 @@ CONFIG_KEYBOARD_ATKBD=y | |||
499 | # CONFIG_KEYBOARD_LKKBD is not set | 536 | # CONFIG_KEYBOARD_LKKBD is not set |
500 | # CONFIG_KEYBOARD_XTKBD is not set | 537 | # CONFIG_KEYBOARD_XTKBD is not set |
501 | # CONFIG_KEYBOARD_NEWTON is not set | 538 | # CONFIG_KEYBOARD_NEWTON is not set |
539 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
502 | CONFIG_INPUT_MOUSE=y | 540 | CONFIG_INPUT_MOUSE=y |
503 | CONFIG_MOUSE_PS2=y | 541 | CONFIG_MOUSE_PS2=y |
504 | # CONFIG_MOUSE_SERIAL is not set | 542 | # CONFIG_MOUSE_SERIAL is not set |
@@ -511,12 +549,11 @@ CONFIG_MOUSE_PS2=y | |||
511 | # Hardware I/O ports | 549 | # Hardware I/O ports |
512 | # | 550 | # |
513 | CONFIG_SERIO=y | 551 | CONFIG_SERIO=y |
514 | CONFIG_SERIO_SERPORT=y | 552 | # CONFIG_SERIO_SERPORT is not set |
515 | # CONFIG_SERIO_PARKBD is not set | 553 | CONFIG_SERIO_AMBAKMI=y |
516 | CONFIG_SERIO_LIBPS2=y | 554 | CONFIG_SERIO_LIBPS2=y |
517 | # CONFIG_SERIO_RAW is not set | 555 | # CONFIG_SERIO_RAW is not set |
518 | # CONFIG_GAMEPORT is not set | 556 | # CONFIG_GAMEPORT is not set |
519 | CONFIG_SOUND_GAMEPORT=y | ||
520 | 557 | ||
521 | # | 558 | # |
522 | # Character devices | 559 | # Character devices |
@@ -524,49 +561,25 @@ CONFIG_SOUND_GAMEPORT=y | |||
524 | CONFIG_VT=y | 561 | CONFIG_VT=y |
525 | CONFIG_VT_CONSOLE=y | 562 | CONFIG_VT_CONSOLE=y |
526 | CONFIG_HW_CONSOLE=y | 563 | CONFIG_HW_CONSOLE=y |
527 | CONFIG_SERIAL_NONSTANDARD=y | 564 | # CONFIG_VT_HW_CONSOLE_BINDING is not set |
528 | # CONFIG_COMPUTONE is not set | 565 | # CONFIG_SERIAL_NONSTANDARD is not set |
529 | # CONFIG_ROCKETPORT is not set | ||
530 | # CONFIG_CYCLADES is not set | ||
531 | # CONFIG_DIGIEPCA is not set | ||
532 | # CONFIG_MOXA_INTELLIO is not set | ||
533 | # CONFIG_MOXA_SMARTIO is not set | ||
534 | # CONFIG_ISI is not set | ||
535 | # CONFIG_SYNCLINKMP is not set | ||
536 | # CONFIG_N_HDLC is not set | ||
537 | # CONFIG_RISCOM8 is not set | ||
538 | # CONFIG_SPECIALIX is not set | ||
539 | # CONFIG_SX is not set | ||
540 | # CONFIG_RIO is not set | ||
541 | # CONFIG_STALDRV is not set | ||
542 | 566 | ||
543 | # | 567 | # |
544 | # Serial drivers | 568 | # Serial drivers |
545 | # | 569 | # |
546 | CONFIG_SERIAL_8250=y | 570 | # CONFIG_SERIAL_8250 is not set |
547 | CONFIG_SERIAL_8250_CONSOLE=y | ||
548 | CONFIG_SERIAL_8250_NR_UARTS=8 | ||
549 | CONFIG_SERIAL_8250_EXTENDED=y | ||
550 | CONFIG_SERIAL_8250_MANY_PORTS=y | ||
551 | CONFIG_SERIAL_8250_SHARE_IRQ=y | ||
552 | # CONFIG_SERIAL_8250_DETECT_IRQ is not set | ||
553 | # CONFIG_SERIAL_8250_MULTIPORT is not set | ||
554 | # CONFIG_SERIAL_8250_RSA is not set | ||
555 | 571 | ||
556 | # | 572 | # |
557 | # Non-8250 serial port support | 573 | # Non-8250 serial port support |
558 | # | 574 | # |
559 | CONFIG_SERIAL_S3C2410=y | 575 | # CONFIG_SERIAL_AMBA_PL010 is not set |
560 | CONFIG_SERIAL_S3C2410_CONSOLE=y | 576 | CONFIG_SERIAL_AMBA_PL011=y |
577 | CONFIG_SERIAL_AMBA_PL011_CONSOLE=y | ||
561 | CONFIG_SERIAL_CORE=y | 578 | CONFIG_SERIAL_CORE=y |
562 | CONFIG_SERIAL_CORE_CONSOLE=y | 579 | CONFIG_SERIAL_CORE_CONSOLE=y |
563 | CONFIG_UNIX98_PTYS=y | 580 | CONFIG_UNIX98_PTYS=y |
564 | CONFIG_LEGACY_PTYS=y | 581 | CONFIG_LEGACY_PTYS=y |
565 | CONFIG_LEGACY_PTY_COUNT=256 | 582 | CONFIG_LEGACY_PTY_COUNT=16 |
566 | CONFIG_PRINTER=y | ||
567 | # CONFIG_LP_CONSOLE is not set | ||
568 | CONFIG_PPDEV=y | ||
569 | # CONFIG_TIPAR is not set | ||
570 | 583 | ||
571 | # | 584 | # |
572 | # IPMI | 585 | # IPMI |
@@ -576,24 +589,15 @@ CONFIG_PPDEV=y | |||
576 | # | 589 | # |
577 | # Watchdog Cards | 590 | # Watchdog Cards |
578 | # | 591 | # |
579 | CONFIG_WATCHDOG=y | 592 | # CONFIG_WATCHDOG is not set |
580 | # CONFIG_WATCHDOG_NOWAYOUT is not set | 593 | # CONFIG_HW_RANDOM is not set |
581 | |||
582 | # | ||
583 | # Watchdog Device Drivers | ||
584 | # | ||
585 | # CONFIG_SOFT_WATCHDOG is not set | ||
586 | CONFIG_S3C2410_WATCHDOG=y | ||
587 | # CONFIG_NVRAM is not set | 594 | # CONFIG_NVRAM is not set |
588 | # CONFIG_RTC is not set | ||
589 | CONFIG_S3C2410_RTC=y | ||
590 | # CONFIG_DTLK is not set | 595 | # CONFIG_DTLK is not set |
591 | # CONFIG_R3964 is not set | 596 | # CONFIG_R3964 is not set |
592 | 597 | ||
593 | # | 598 | # |
594 | # Ftape, the floppy tape device driver | 599 | # Ftape, the floppy tape device driver |
595 | # | 600 | # |
596 | # CONFIG_DRM is not set | ||
597 | # CONFIG_RAW_DRIVER is not set | 601 | # CONFIG_RAW_DRIVER is not set |
598 | 602 | ||
599 | # | 603 | # |
@@ -604,73 +608,43 @@ CONFIG_S3C2410_RTC=y | |||
604 | # | 608 | # |
605 | # I2C support | 609 | # I2C support |
606 | # | 610 | # |
607 | CONFIG_I2C=y | 611 | # CONFIG_I2C is not set |
608 | CONFIG_I2C_CHARDEV=m | 612 | |
609 | 613 | # | |
610 | # | 614 | # SPI support |
611 | # I2C Algorithms | 615 | # |
612 | # | 616 | # CONFIG_SPI is not set |
613 | CONFIG_I2C_ALGOBIT=m | 617 | # CONFIG_SPI_MASTER is not set |
614 | # CONFIG_I2C_ALGOPCF is not set | 618 | |
615 | # CONFIG_I2C_ALGOPCA is not set | 619 | # |
616 | 620 | # Dallas's 1-wire bus | |
617 | # | 621 | # |
618 | # I2C Hardware Bus support | 622 | # CONFIG_W1 is not set |
619 | # | 623 | |
620 | # CONFIG_I2C_ISA is not set | 624 | # |
621 | # CONFIG_I2C_PARPORT is not set | 625 | # Hardware Monitoring support |
622 | # CONFIG_I2C_PARPORT_LIGHT is not set | 626 | # |
623 | CONFIG_I2C_S3C2410=y | 627 | # CONFIG_HWMON is not set |
624 | # CONFIG_I2C_STUB is not set | 628 | # CONFIG_HWMON_VID is not set |
625 | # CONFIG_I2C_PCA_ISA is not set | ||
626 | |||
627 | # | ||
628 | # Hardware Sensors Chip support | ||
629 | # | ||
630 | CONFIG_I2C_SENSOR=m | ||
631 | # CONFIG_SENSORS_ADM1021 is not set | ||
632 | # CONFIG_SENSORS_ADM1025 is not set | ||
633 | # CONFIG_SENSORS_ADM1026 is not set | ||
634 | # CONFIG_SENSORS_ADM1031 is not set | ||
635 | # CONFIG_SENSORS_ASB100 is not set | ||
636 | # CONFIG_SENSORS_DS1621 is not set | ||
637 | # CONFIG_SENSORS_FSCHER is not set | ||
638 | # CONFIG_SENSORS_FSCPOS is not set | ||
639 | # CONFIG_SENSORS_GL518SM is not set | ||
640 | # CONFIG_SENSORS_GL520SM is not set | ||
641 | # CONFIG_SENSORS_IT87 is not set | ||
642 | # CONFIG_SENSORS_LM63 is not set | ||
643 | CONFIG_SENSORS_LM75=m | ||
644 | # CONFIG_SENSORS_LM77 is not set | ||
645 | CONFIG_SENSORS_LM78=m | ||
646 | # CONFIG_SENSORS_LM80 is not set | ||
647 | # CONFIG_SENSORS_LM83 is not set | ||
648 | CONFIG_SENSORS_LM85=m | ||
649 | # CONFIG_SENSORS_LM87 is not set | ||
650 | # CONFIG_SENSORS_LM90 is not set | ||
651 | # CONFIG_SENSORS_MAX1619 is not set | ||
652 | # CONFIG_SENSORS_PC87360 is not set | ||
653 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
654 | # CONFIG_SENSORS_SMSC47M1 is not set | ||
655 | # CONFIG_SENSORS_W83781D is not set | ||
656 | # CONFIG_SENSORS_W83L785TS is not set | ||
657 | # CONFIG_SENSORS_W83627HF is not set | ||
658 | |||
659 | # | ||
660 | # Other I2C Chip support | ||
661 | # | ||
662 | CONFIG_SENSORS_EEPROM=m | ||
663 | # CONFIG_SENSORS_PCF8574 is not set | ||
664 | # CONFIG_SENSORS_PCF8591 is not set | ||
665 | # CONFIG_SENSORS_RTC8564 is not set | ||
666 | # CONFIG_I2C_DEBUG_CORE is not set | ||
667 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
668 | # CONFIG_I2C_DEBUG_BUS is not set | ||
669 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
670 | 629 | ||
671 | # | 630 | # |
672 | # Misc devices | 631 | # Misc devices |
673 | # | 632 | # |
633 | # CONFIG_SGI_IOC4 is not set | ||
634 | # CONFIG_TIFM_CORE is not set | ||
635 | |||
636 | # | ||
637 | # LED devices | ||
638 | # | ||
639 | # CONFIG_NEW_LEDS is not set | ||
640 | |||
641 | # | ||
642 | # LED drivers | ||
643 | # | ||
644 | |||
645 | # | ||
646 | # LED Triggers | ||
647 | # | ||
674 | 648 | ||
675 | # | 649 | # |
676 | # Multimedia devices | 650 | # Multimedia devices |
@@ -685,13 +659,17 @@ CONFIG_SENSORS_EEPROM=m | |||
685 | # | 659 | # |
686 | # Graphics support | 660 | # Graphics support |
687 | # | 661 | # |
662 | # CONFIG_FIRMWARE_EDID is not set | ||
688 | CONFIG_FB=y | 663 | CONFIG_FB=y |
689 | # CONFIG_FB_CFB_FILLRECT is not set | 664 | CONFIG_FB_CFB_FILLRECT=y |
690 | # CONFIG_FB_CFB_COPYAREA is not set | 665 | CONFIG_FB_CFB_COPYAREA=y |
691 | # CONFIG_FB_CFB_IMAGEBLIT is not set | 666 | CONFIG_FB_CFB_IMAGEBLIT=y |
692 | # CONFIG_FB_SOFT_CURSOR is not set | 667 | # CONFIG_FB_MACMODES is not set |
693 | CONFIG_FB_MODE_HELPERS=y | 668 | # CONFIG_FB_BACKLIGHT is not set |
669 | # CONFIG_FB_MODE_HELPERS is not set | ||
694 | # CONFIG_FB_TILEBLITTING is not set | 670 | # CONFIG_FB_TILEBLITTING is not set |
671 | CONFIG_FB_ARMCLCD=y | ||
672 | # CONFIG_FB_S1D13XXX is not set | ||
695 | # CONFIG_FB_VIRTUAL is not set | 673 | # CONFIG_FB_VIRTUAL is not set |
696 | 674 | ||
697 | # | 675 | # |
@@ -699,27 +677,76 @@ CONFIG_FB_MODE_HELPERS=y | |||
699 | # | 677 | # |
700 | # CONFIG_VGA_CONSOLE is not set | 678 | # CONFIG_VGA_CONSOLE is not set |
701 | CONFIG_DUMMY_CONSOLE=y | 679 | CONFIG_DUMMY_CONSOLE=y |
702 | # CONFIG_FRAMEBUFFER_CONSOLE is not set | 680 | CONFIG_FRAMEBUFFER_CONSOLE=y |
681 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
682 | # CONFIG_FONTS is not set | ||
683 | CONFIG_FONT_8x8=y | ||
684 | CONFIG_FONT_8x16=y | ||
703 | 685 | ||
704 | # | 686 | # |
705 | # Logo configuration | 687 | # Logo configuration |
706 | # | 688 | # |
707 | # CONFIG_LOGO is not set | 689 | CONFIG_LOGO=y |
690 | # CONFIG_LOGO_LINUX_MONO is not set | ||
691 | # CONFIG_LOGO_LINUX_VGA16 is not set | ||
692 | CONFIG_LOGO_LINUX_CLUT224=y | ||
708 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 693 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
709 | 694 | ||
710 | # | 695 | # |
711 | # Sound | 696 | # Sound |
712 | # | 697 | # |
713 | # CONFIG_SOUND is not set | 698 | CONFIG_SOUND=y |
699 | |||
700 | # | ||
701 | # Advanced Linux Sound Architecture | ||
702 | # | ||
703 | CONFIG_SND=y | ||
704 | CONFIG_SND_TIMER=y | ||
705 | CONFIG_SND_PCM=y | ||
706 | # CONFIG_SND_SEQUENCER is not set | ||
707 | CONFIG_SND_OSSEMUL=y | ||
708 | CONFIG_SND_MIXER_OSS=y | ||
709 | CONFIG_SND_PCM_OSS=y | ||
710 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
711 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
712 | CONFIG_SND_SUPPORT_OLD_API=y | ||
713 | CONFIG_SND_VERBOSE_PROCFS=y | ||
714 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
715 | # CONFIG_SND_DEBUG is not set | ||
716 | |||
717 | # | ||
718 | # Generic devices | ||
719 | # | ||
720 | CONFIG_SND_AC97_CODEC=m | ||
721 | CONFIG_SND_AC97_BUS=m | ||
722 | # CONFIG_SND_DUMMY is not set | ||
723 | # CONFIG_SND_MTPAV is not set | ||
724 | # CONFIG_SND_SERIAL_U16550 is not set | ||
725 | # CONFIG_SND_MPU401 is not set | ||
726 | |||
727 | # | ||
728 | # ALSA ARM devices | ||
729 | # | ||
730 | CONFIG_SND_ARMAACI=m | ||
731 | |||
732 | # | ||
733 | # Open Sound System | ||
734 | # | ||
735 | # CONFIG_SOUND_PRIME is not set | ||
714 | 736 | ||
715 | # | 737 | # |
716 | # USB support | 738 | # USB support |
717 | # | 739 | # |
718 | CONFIG_USB_ARCH_HAS_HCD=y | 740 | CONFIG_USB_ARCH_HAS_HCD=y |
719 | # CONFIG_USB_ARCH_HAS_OHCI is not set | 741 | # CONFIG_USB_ARCH_HAS_OHCI is not set |
742 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
720 | # CONFIG_USB is not set | 743 | # CONFIG_USB is not set |
721 | 744 | ||
722 | # | 745 | # |
746 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
747 | # | ||
748 | |||
749 | # | ||
723 | # USB Gadget Support | 750 | # USB Gadget Support |
724 | # | 751 | # |
725 | # CONFIG_USB_GADGET is not set | 752 | # CONFIG_USB_GADGET is not set |
@@ -727,33 +754,62 @@ CONFIG_USB_ARCH_HAS_HCD=y | |||
727 | # | 754 | # |
728 | # MMC/SD Card support | 755 | # MMC/SD Card support |
729 | # | 756 | # |
730 | # CONFIG_MMC is not set | 757 | CONFIG_MMC=y |
758 | # CONFIG_MMC_DEBUG is not set | ||
759 | CONFIG_MMC_BLOCK=y | ||
760 | CONFIG_MMC_ARMMMCI=y | ||
761 | # CONFIG_MMC_TIFM_SD is not set | ||
762 | |||
763 | # | ||
764 | # Real Time Clock | ||
765 | # | ||
766 | CONFIG_RTC_LIB=y | ||
767 | CONFIG_RTC_CLASS=y | ||
768 | CONFIG_RTC_HCTOSYS=y | ||
769 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
770 | # CONFIG_RTC_DEBUG is not set | ||
771 | |||
772 | # | ||
773 | # RTC interfaces | ||
774 | # | ||
775 | CONFIG_RTC_INTF_SYSFS=y | ||
776 | CONFIG_RTC_INTF_PROC=y | ||
777 | CONFIG_RTC_INTF_DEV=y | ||
778 | CONFIG_RTC_INTF_DEV_UIE_EMUL=y | ||
779 | |||
780 | # | ||
781 | # RTC drivers | ||
782 | # | ||
783 | # CONFIG_RTC_DRV_DS1553 is not set | ||
784 | # CONFIG_RTC_DRV_DS1742 is not set | ||
785 | # CONFIG_RTC_DRV_M48T86 is not set | ||
786 | CONFIG_RTC_DRV_PL031=y | ||
787 | # CONFIG_RTC_DRV_TEST is not set | ||
788 | # CONFIG_RTC_DRV_V3020 is not set | ||
731 | 789 | ||
732 | # | 790 | # |
733 | # File systems | 791 | # File systems |
734 | # | 792 | # |
735 | CONFIG_EXT2_FS=y | 793 | CONFIG_EXT2_FS=y |
736 | # CONFIG_EXT2_FS_XATTR is not set | 794 | # CONFIG_EXT2_FS_XATTR is not set |
737 | CONFIG_EXT3_FS=y | 795 | # CONFIG_EXT2_FS_XIP is not set |
738 | CONFIG_EXT3_FS_XATTR=y | 796 | # CONFIG_EXT3_FS is not set |
739 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 797 | # CONFIG_EXT4DEV_FS is not set |
740 | # CONFIG_EXT3_FS_SECURITY is not set | ||
741 | CONFIG_JBD=y | ||
742 | # CONFIG_JBD_DEBUG is not set | ||
743 | CONFIG_FS_MBCACHE=y | ||
744 | # CONFIG_REISERFS_FS is not set | 798 | # CONFIG_REISERFS_FS is not set |
745 | # CONFIG_JFS_FS is not set | 799 | # CONFIG_JFS_FS is not set |
746 | 800 | # CONFIG_FS_POSIX_ACL is not set | |
747 | # | ||
748 | # XFS support | ||
749 | # | ||
750 | # CONFIG_XFS_FS is not set | 801 | # CONFIG_XFS_FS is not set |
802 | # CONFIG_GFS2_FS is not set | ||
803 | # CONFIG_OCFS2_FS is not set | ||
751 | # CONFIG_MINIX_FS is not set | 804 | # CONFIG_MINIX_FS is not set |
752 | CONFIG_ROMFS_FS=y | 805 | # CONFIG_ROMFS_FS is not set |
806 | CONFIG_INOTIFY=y | ||
807 | # CONFIG_INOTIFY_USER is not set | ||
753 | # CONFIG_QUOTA is not set | 808 | # CONFIG_QUOTA is not set |
754 | CONFIG_DNOTIFY=y | 809 | CONFIG_DNOTIFY=y |
755 | # CONFIG_AUTOFS_FS is not set | 810 | # CONFIG_AUTOFS_FS is not set |
756 | # CONFIG_AUTOFS4_FS is not set | 811 | # CONFIG_AUTOFS4_FS is not set |
812 | # CONFIG_FUSE_FS is not set | ||
757 | 813 | ||
758 | # | 814 | # |
759 | # CD-ROM/DVD Filesystems | 815 | # CD-ROM/DVD Filesystems |
@@ -765,7 +821,7 @@ CONFIG_DNOTIFY=y | |||
765 | # DOS/FAT/NT Filesystems | 821 | # DOS/FAT/NT Filesystems |
766 | # | 822 | # |
767 | CONFIG_FAT_FS=y | 823 | CONFIG_FAT_FS=y |
768 | CONFIG_MSDOS_FS=y | 824 | # CONFIG_MSDOS_FS is not set |
769 | CONFIG_VFAT_FS=y | 825 | CONFIG_VFAT_FS=y |
770 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | 826 | CONFIG_FAT_DEFAULT_CODEPAGE=437 |
771 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | 827 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" |
@@ -775,12 +831,13 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | |||
775 | # Pseudo filesystems | 831 | # Pseudo filesystems |
776 | # | 832 | # |
777 | CONFIG_PROC_FS=y | 833 | CONFIG_PROC_FS=y |
834 | CONFIG_PROC_SYSCTL=y | ||
778 | CONFIG_SYSFS=y | 835 | CONFIG_SYSFS=y |
779 | # CONFIG_DEVFS_FS is not set | 836 | CONFIG_TMPFS=y |
780 | # CONFIG_DEVPTS_FS_XATTR is not set | 837 | # CONFIG_TMPFS_POSIX_ACL is not set |
781 | # CONFIG_TMPFS is not set | ||
782 | # CONFIG_HUGETLB_PAGE is not set | 838 | # CONFIG_HUGETLB_PAGE is not set |
783 | CONFIG_RAMFS=y | 839 | CONFIG_RAMFS=y |
840 | # CONFIG_CONFIGFS_FS is not set | ||
784 | 841 | ||
785 | # | 842 | # |
786 | # Miscellaneous filesystems | 843 | # Miscellaneous filesystems |
@@ -792,18 +849,9 @@ CONFIG_RAMFS=y | |||
792 | # CONFIG_BEFS_FS is not set | 849 | # CONFIG_BEFS_FS is not set |
793 | # CONFIG_BFS_FS is not set | 850 | # CONFIG_BFS_FS is not set |
794 | # CONFIG_EFS_FS is not set | 851 | # CONFIG_EFS_FS is not set |
795 | CONFIG_JFFS_FS=y | 852 | # CONFIG_JFFS_FS is not set |
796 | CONFIG_JFFS_FS_VERBOSE=0 | 853 | # CONFIG_JFFS2_FS is not set |
797 | # CONFIG_JFFS_PROC_FS is not set | 854 | CONFIG_CRAMFS=y |
798 | CONFIG_JFFS2_FS=y | ||
799 | CONFIG_JFFS2_FS_DEBUG=0 | ||
800 | # CONFIG_JFFS2_FS_NAND is not set | ||
801 | # CONFIG_JFFS2_FS_NOR_ECC is not set | ||
802 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||
803 | CONFIG_JFFS2_ZLIB=y | ||
804 | CONFIG_JFFS2_RTIME=y | ||
805 | # CONFIG_JFFS2_RUBIN is not set | ||
806 | # CONFIG_CRAMFS is not set | ||
807 | # CONFIG_VXFS_FS is not set | 855 | # CONFIG_VXFS_FS is not set |
808 | # CONFIG_HPFS_FS is not set | 856 | # CONFIG_HPFS_FS is not set |
809 | # CONFIG_QNX4FS_FS is not set | 857 | # CONFIG_QNX4FS_FS is not set |
@@ -814,12 +862,15 @@ CONFIG_JFFS2_RTIME=y | |||
814 | # Network File Systems | 862 | # Network File Systems |
815 | # | 863 | # |
816 | CONFIG_NFS_FS=y | 864 | CONFIG_NFS_FS=y |
817 | # CONFIG_NFS_V3 is not set | 865 | CONFIG_NFS_V3=y |
866 | # CONFIG_NFS_V3_ACL is not set | ||
818 | # CONFIG_NFS_V4 is not set | 867 | # CONFIG_NFS_V4 is not set |
819 | # CONFIG_NFS_DIRECTIO is not set | 868 | # CONFIG_NFS_DIRECTIO is not set |
820 | # CONFIG_NFSD is not set | 869 | # CONFIG_NFSD is not set |
821 | CONFIG_ROOT_NFS=y | 870 | CONFIG_ROOT_NFS=y |
822 | CONFIG_LOCKD=y | 871 | CONFIG_LOCKD=y |
872 | CONFIG_LOCKD_V4=y | ||
873 | CONFIG_NFS_COMMON=y | ||
823 | CONFIG_SUNRPC=y | 874 | CONFIG_SUNRPC=y |
824 | # CONFIG_RPCSEC_GSS_KRB5 is not set | 875 | # CONFIG_RPCSEC_GSS_KRB5 is not set |
825 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 876 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
@@ -828,33 +879,20 @@ CONFIG_SUNRPC=y | |||
828 | # CONFIG_NCP_FS is not set | 879 | # CONFIG_NCP_FS is not set |
829 | # CONFIG_CODA_FS is not set | 880 | # CONFIG_CODA_FS is not set |
830 | # CONFIG_AFS_FS is not set | 881 | # CONFIG_AFS_FS is not set |
882 | # CONFIG_9P_FS is not set | ||
831 | 883 | ||
832 | # | 884 | # |
833 | # Partition Types | 885 | # Partition Types |
834 | # | 886 | # |
835 | CONFIG_PARTITION_ADVANCED=y | 887 | # CONFIG_PARTITION_ADVANCED is not set |
836 | # CONFIG_ACORN_PARTITION is not set | ||
837 | # CONFIG_OSF_PARTITION is not set | ||
838 | # CONFIG_AMIGA_PARTITION is not set | ||
839 | # CONFIG_ATARI_PARTITION is not set | ||
840 | # CONFIG_MAC_PARTITION is not set | ||
841 | CONFIG_MSDOS_PARTITION=y | 888 | CONFIG_MSDOS_PARTITION=y |
842 | CONFIG_BSD_DISKLABEL=y | ||
843 | # CONFIG_MINIX_SUBPARTITION is not set | ||
844 | CONFIG_SOLARIS_X86_PARTITION=y | ||
845 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
846 | # CONFIG_LDM_PARTITION is not set | ||
847 | # CONFIG_SGI_PARTITION is not set | ||
848 | # CONFIG_ULTRIX_PARTITION is not set | ||
849 | # CONFIG_SUN_PARTITION is not set | ||
850 | # CONFIG_EFI_PARTITION is not set | ||
851 | 889 | ||
852 | # | 890 | # |
853 | # Native Language Support | 891 | # Native Language Support |
854 | # | 892 | # |
855 | CONFIG_NLS=y | 893 | CONFIG_NLS=y |
856 | CONFIG_NLS_DEFAULT="iso8859-1" | 894 | CONFIG_NLS_DEFAULT="iso8859-1" |
857 | # CONFIG_NLS_CODEPAGE_437 is not set | 895 | CONFIG_NLS_CODEPAGE_437=y |
858 | # CONFIG_NLS_CODEPAGE_737 is not set | 896 | # CONFIG_NLS_CODEPAGE_737 is not set |
859 | # CONFIG_NLS_CODEPAGE_775 is not set | 897 | # CONFIG_NLS_CODEPAGE_775 is not set |
860 | # CONFIG_NLS_CODEPAGE_850 is not set | 898 | # CONFIG_NLS_CODEPAGE_850 is not set |
@@ -878,7 +916,7 @@ CONFIG_NLS_DEFAULT="iso8859-1" | |||
878 | # CONFIG_NLS_CODEPAGE_1250 is not set | 916 | # CONFIG_NLS_CODEPAGE_1250 is not set |
879 | # CONFIG_NLS_CODEPAGE_1251 is not set | 917 | # CONFIG_NLS_CODEPAGE_1251 is not set |
880 | # CONFIG_NLS_ASCII is not set | 918 | # CONFIG_NLS_ASCII is not set |
881 | # CONFIG_NLS_ISO8859_1 is not set | 919 | CONFIG_NLS_ISO8859_1=y |
882 | # CONFIG_NLS_ISO8859_2 is not set | 920 | # CONFIG_NLS_ISO8859_2 is not set |
883 | # CONFIG_NLS_ISO8859_3 is not set | 921 | # CONFIG_NLS_ISO8859_3 is not set |
884 | # CONFIG_NLS_ISO8859_4 is not set | 922 | # CONFIG_NLS_ISO8859_4 is not set |
@@ -902,25 +940,37 @@ CONFIG_NLS_DEFAULT="iso8859-1" | |||
902 | # Kernel hacking | 940 | # Kernel hacking |
903 | # | 941 | # |
904 | # CONFIG_PRINTK_TIME is not set | 942 | # CONFIG_PRINTK_TIME is not set |
943 | # CONFIG_ENABLE_MUST_CHECK is not set | ||
944 | CONFIG_MAGIC_SYSRQ=y | ||
945 | # CONFIG_UNUSED_SYMBOLS is not set | ||
905 | CONFIG_DEBUG_KERNEL=y | 946 | CONFIG_DEBUG_KERNEL=y |
906 | # CONFIG_MAGIC_SYSRQ is not set | 947 | CONFIG_LOG_BUF_SHIFT=14 |
907 | CONFIG_LOG_BUF_SHIFT=16 | 948 | CONFIG_DETECT_SOFTLOCKUP=y |
908 | # CONFIG_SCHEDSTATS is not set | 949 | # CONFIG_SCHEDSTATS is not set |
909 | # CONFIG_DEBUG_SLAB is not set | 950 | # CONFIG_DEBUG_SLAB is not set |
910 | # CONFIG_DEBUG_SPINLOCK is not set | 951 | # CONFIG_DEBUG_RT_MUTEXES is not set |
952 | # CONFIG_RT_MUTEX_TESTER is not set | ||
953 | CONFIG_DEBUG_SPINLOCK=y | ||
954 | CONFIG_DEBUG_MUTEXES=y | ||
955 | CONFIG_DEBUG_RWSEMS=y | ||
911 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 956 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
957 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
912 | # CONFIG_DEBUG_KOBJECT is not set | 958 | # CONFIG_DEBUG_KOBJECT is not set |
913 | CONFIG_DEBUG_BUGVERBOSE=y | 959 | CONFIG_DEBUG_BUGVERBOSE=y |
914 | CONFIG_DEBUG_INFO=y | 960 | # CONFIG_DEBUG_INFO is not set |
915 | # CONFIG_DEBUG_FS is not set | 961 | # CONFIG_DEBUG_FS is not set |
962 | # CONFIG_DEBUG_VM is not set | ||
963 | # CONFIG_DEBUG_LIST is not set | ||
916 | CONFIG_FRAME_POINTER=y | 964 | CONFIG_FRAME_POINTER=y |
965 | # CONFIG_UNWIND_INFO is not set | ||
966 | CONFIG_FORCED_INLINING=y | ||
967 | # CONFIG_HEADERS_CHECK is not set | ||
968 | # CONFIG_RCU_TORTURE_TEST is not set | ||
917 | CONFIG_DEBUG_USER=y | 969 | CONFIG_DEBUG_USER=y |
918 | # CONFIG_DEBUG_WAITQ is not set | 970 | # CONFIG_DEBUG_WAITQ is not set |
919 | # CONFIG_DEBUG_ERRORS is not set | 971 | CONFIG_DEBUG_ERRORS=y |
920 | CONFIG_DEBUG_LL=y | 972 | CONFIG_DEBUG_LL=y |
921 | # CONFIG_DEBUG_ICEDCC is not set | 973 | # CONFIG_DEBUG_ICEDCC is not set |
922 | CONFIG_DEBUG_S3C2410_PORT=y | ||
923 | CONFIG_DEBUG_S3C2410_UART=0 | ||
924 | 974 | ||
925 | # | 975 | # |
926 | # Security options | 976 | # Security options |
@@ -934,14 +984,11 @@ CONFIG_DEBUG_S3C2410_UART=0 | |||
934 | # CONFIG_CRYPTO is not set | 984 | # CONFIG_CRYPTO is not set |
935 | 985 | ||
936 | # | 986 | # |
937 | # Hardware crypto devices | ||
938 | # | ||
939 | |||
940 | # | ||
941 | # Library routines | 987 | # Library routines |
942 | # | 988 | # |
943 | # CONFIG_CRC_CCITT is not set | 989 | # CONFIG_CRC_CCITT is not set |
990 | # CONFIG_CRC16 is not set | ||
944 | CONFIG_CRC32=y | 991 | CONFIG_CRC32=y |
945 | # CONFIG_LIBCRC32C is not set | 992 | # CONFIG_LIBCRC32C is not set |
946 | CONFIG_ZLIB_INFLATE=y | 993 | CONFIG_ZLIB_INFLATE=y |
947 | CONFIG_ZLIB_DEFLATE=y | 994 | CONFIG_PLIST=y |
diff --git a/arch/arm/configs/s3c2410_defconfig b/arch/arm/configs/s3c2410_defconfig index a83222641045..c0152393e494 100644 --- a/arch/arm/configs/s3c2410_defconfig +++ b/arch/arm/configs/s3c2410_defconfig | |||
@@ -1,9 +1,10 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.18 | 3 | # Linux kernel version: 2.6.19-rc4 |
4 | # Wed Sep 20 20:27:31 2006 | 4 | # Fri Nov 3 17:41:31 2006 |
5 | # | 5 | # |
6 | CONFIG_ARM=y | 6 | CONFIG_ARM=y |
7 | # CONFIG_GENERIC_TIME is not set | ||
7 | CONFIG_MMU=y | 8 | CONFIG_MMU=y |
8 | CONFIG_GENERIC_HARDIRQS=y | 9 | CONFIG_GENERIC_HARDIRQS=y |
9 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | 10 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y |
@@ -29,17 +30,20 @@ CONFIG_LOCALVERSION="" | |||
29 | CONFIG_LOCALVERSION_AUTO=y | 30 | CONFIG_LOCALVERSION_AUTO=y |
30 | CONFIG_SWAP=y | 31 | CONFIG_SWAP=y |
31 | CONFIG_SYSVIPC=y | 32 | CONFIG_SYSVIPC=y |
33 | # CONFIG_IPC_NS is not set | ||
32 | # CONFIG_POSIX_MQUEUE is not set | 34 | # CONFIG_POSIX_MQUEUE is not set |
33 | # CONFIG_BSD_PROCESS_ACCT is not set | 35 | # CONFIG_BSD_PROCESS_ACCT is not set |
34 | # CONFIG_TASKSTATS is not set | 36 | # CONFIG_TASKSTATS is not set |
37 | # CONFIG_UTS_NS is not set | ||
35 | # CONFIG_AUDIT is not set | 38 | # CONFIG_AUDIT is not set |
36 | # CONFIG_IKCONFIG is not set | 39 | # CONFIG_IKCONFIG is not set |
37 | # CONFIG_RELAY is not set | 40 | # CONFIG_RELAY is not set |
38 | CONFIG_INITRAMFS_SOURCE="" | 41 | CONFIG_INITRAMFS_SOURCE="" |
39 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 42 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
43 | CONFIG_SYSCTL=y | ||
40 | # CONFIG_EMBEDDED is not set | 44 | # CONFIG_EMBEDDED is not set |
41 | CONFIG_UID16=y | 45 | CONFIG_UID16=y |
42 | CONFIG_SYSCTL=y | 46 | # CONFIG_SYSCTL_SYSCALL is not set |
43 | CONFIG_KALLSYMS=y | 47 | CONFIG_KALLSYMS=y |
44 | # CONFIG_KALLSYMS_ALL is not set | 48 | # CONFIG_KALLSYMS_ALL is not set |
45 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | 49 | # CONFIG_KALLSYMS_EXTRA_PASS is not set |
@@ -62,7 +66,8 @@ CONFIG_BASE_SMALL=0 | |||
62 | # Loadable module support | 66 | # Loadable module support |
63 | # | 67 | # |
64 | CONFIG_MODULES=y | 68 | CONFIG_MODULES=y |
65 | # CONFIG_MODULE_UNLOAD is not set | 69 | CONFIG_MODULE_UNLOAD=y |
70 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
66 | # CONFIG_MODVERSIONS is not set | 71 | # CONFIG_MODVERSIONS is not set |
67 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 72 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
68 | CONFIG_KMOD=y | 73 | CONFIG_KMOD=y |
@@ -70,6 +75,7 @@ CONFIG_KMOD=y | |||
70 | # | 75 | # |
71 | # Block layer | 76 | # Block layer |
72 | # | 77 | # |
78 | CONFIG_BLOCK=y | ||
73 | # CONFIG_BLK_DEV_IO_TRACE is not set | 79 | # CONFIG_BLK_DEV_IO_TRACE is not set |
74 | 80 | ||
75 | # | 81 | # |
@@ -120,6 +126,7 @@ CONFIG_ARCH_S3C2410=y | |||
120 | # | 126 | # |
121 | # S3C24XX Implementations | 127 | # S3C24XX Implementations |
122 | # | 128 | # |
129 | # CONFIG_MACH_AML_M5900 is not set | ||
123 | CONFIG_MACH_ANUBIS=y | 130 | CONFIG_MACH_ANUBIS=y |
124 | CONFIG_MACH_OSIRIS=y | 131 | CONFIG_MACH_OSIRIS=y |
125 | CONFIG_ARCH_BAST=y | 132 | CONFIG_ARCH_BAST=y |
@@ -178,6 +185,8 @@ CONFIG_CPU_CACHE_V4WT=y | |||
178 | CONFIG_CPU_CACHE_VIVT=y | 185 | CONFIG_CPU_CACHE_VIVT=y |
179 | CONFIG_CPU_COPY_V4WB=y | 186 | CONFIG_CPU_COPY_V4WB=y |
180 | CONFIG_CPU_TLB_V4WBI=y | 187 | CONFIG_CPU_TLB_V4WBI=y |
188 | CONFIG_CPU_CP15=y | ||
189 | CONFIG_CPU_CP15_MMU=y | ||
181 | 190 | ||
182 | # | 191 | # |
183 | # Processor Features | 192 | # Processor Features |
@@ -249,8 +258,9 @@ CONFIG_BINFMT_AOUT=y | |||
249 | # Power management options | 258 | # Power management options |
250 | # | 259 | # |
251 | CONFIG_PM=y | 260 | CONFIG_PM=y |
252 | CONFIG_PM_LEGACY=y | 261 | # CONFIG_PM_LEGACY is not set |
253 | # CONFIG_PM_DEBUG is not set | 262 | # CONFIG_PM_DEBUG is not set |
263 | # CONFIG_PM_SYSFS_DEPRECATED is not set | ||
254 | CONFIG_APM=y | 264 | CONFIG_APM=y |
255 | 265 | ||
256 | # | 266 | # |
@@ -266,6 +276,7 @@ CONFIG_NET=y | |||
266 | CONFIG_UNIX=y | 276 | CONFIG_UNIX=y |
267 | CONFIG_XFRM=y | 277 | CONFIG_XFRM=y |
268 | # CONFIG_XFRM_USER is not set | 278 | # CONFIG_XFRM_USER is not set |
279 | # CONFIG_XFRM_SUB_POLICY is not set | ||
269 | # CONFIG_NET_KEY is not set | 280 | # CONFIG_NET_KEY is not set |
270 | CONFIG_INET=y | 281 | CONFIG_INET=y |
271 | # CONFIG_IP_MULTICAST is not set | 282 | # CONFIG_IP_MULTICAST is not set |
@@ -286,10 +297,12 @@ CONFIG_IP_PNP_BOOTP=y | |||
286 | # CONFIG_INET_TUNNEL is not set | 297 | # CONFIG_INET_TUNNEL is not set |
287 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | 298 | CONFIG_INET_XFRM_MODE_TRANSPORT=y |
288 | CONFIG_INET_XFRM_MODE_TUNNEL=y | 299 | CONFIG_INET_XFRM_MODE_TUNNEL=y |
300 | CONFIG_INET_XFRM_MODE_BEET=y | ||
289 | CONFIG_INET_DIAG=y | 301 | CONFIG_INET_DIAG=y |
290 | CONFIG_INET_TCP_DIAG=y | 302 | CONFIG_INET_TCP_DIAG=y |
291 | # CONFIG_TCP_CONG_ADVANCED is not set | 303 | # CONFIG_TCP_CONG_ADVANCED is not set |
292 | CONFIG_TCP_CONG_BIC=y | 304 | CONFIG_TCP_CONG_CUBIC=y |
305 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
293 | # CONFIG_IPV6 is not set | 306 | # CONFIG_IPV6 is not set |
294 | # CONFIG_INET6_XFRM_TUNNEL is not set | 307 | # CONFIG_INET6_XFRM_TUNNEL is not set |
295 | # CONFIG_INET6_TUNNEL is not set | 308 | # CONFIG_INET6_TUNNEL is not set |
@@ -377,6 +390,7 @@ CONFIG_MTD_BLOCK=y | |||
377 | # CONFIG_NFTL is not set | 390 | # CONFIG_NFTL is not set |
378 | # CONFIG_INFTL is not set | 391 | # CONFIG_INFTL is not set |
379 | # CONFIG_RFD_FTL is not set | 392 | # CONFIG_RFD_FTL is not set |
393 | # CONFIG_SSFDC is not set | ||
380 | 394 | ||
381 | # | 395 | # |
382 | # RAM/ROM/Flash chip drivers | 396 | # RAM/ROM/Flash chip drivers |
@@ -418,6 +432,8 @@ CONFIG_MTD_BAST_MAXSIZE=4 | |||
418 | # | 432 | # |
419 | # Self-contained MTD device drivers | 433 | # Self-contained MTD device drivers |
420 | # | 434 | # |
435 | # CONFIG_MTD_DATAFLASH is not set | ||
436 | # CONFIG_MTD_M25P80 is not set | ||
421 | # CONFIG_MTD_SLRAM is not set | 437 | # CONFIG_MTD_SLRAM is not set |
422 | # CONFIG_MTD_PHRAM is not set | 438 | # CONFIG_MTD_PHRAM is not set |
423 | # CONFIG_MTD_MTDRAM is not set | 439 | # CONFIG_MTD_MTDRAM is not set |
@@ -512,6 +528,7 @@ CONFIG_BLK_DEV_IDE_BAST=y | |||
512 | # | 528 | # |
513 | # CONFIG_RAID_ATTRS is not set | 529 | # CONFIG_RAID_ATTRS is not set |
514 | # CONFIG_SCSI is not set | 530 | # CONFIG_SCSI is not set |
531 | # CONFIG_SCSI_NETLINK is not set | ||
515 | 532 | ||
516 | # | 533 | # |
517 | # Multi-device support (RAID and LVM) | 534 | # Multi-device support (RAID and LVM) |
@@ -606,6 +623,7 @@ CONFIG_DM9000=y | |||
606 | # Input device support | 623 | # Input device support |
607 | # | 624 | # |
608 | CONFIG_INPUT=y | 625 | CONFIG_INPUT=y |
626 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
609 | 627 | ||
610 | # | 628 | # |
611 | # Userland interfaces | 629 | # Userland interfaces |
@@ -628,6 +646,7 @@ CONFIG_KEYBOARD_ATKBD=y | |||
628 | # CONFIG_KEYBOARD_LKKBD is not set | 646 | # CONFIG_KEYBOARD_LKKBD is not set |
629 | # CONFIG_KEYBOARD_XTKBD is not set | 647 | # CONFIG_KEYBOARD_XTKBD is not set |
630 | # CONFIG_KEYBOARD_NEWTON is not set | 648 | # CONFIG_KEYBOARD_NEWTON is not set |
649 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
631 | CONFIG_INPUT_MOUSE=y | 650 | CONFIG_INPUT_MOUSE=y |
632 | CONFIG_MOUSE_PS2=y | 651 | CONFIG_MOUSE_PS2=y |
633 | # CONFIG_MOUSE_SERIAL is not set | 652 | # CONFIG_MOUSE_SERIAL is not set |
@@ -734,7 +753,6 @@ CONFIG_S3C2410_WATCHDOG=y | |||
734 | # CONFIG_USBPCWATCHDOG is not set | 753 | # CONFIG_USBPCWATCHDOG is not set |
735 | CONFIG_HW_RANDOM=y | 754 | CONFIG_HW_RANDOM=y |
736 | # CONFIG_NVRAM is not set | 755 | # CONFIG_NVRAM is not set |
737 | CONFIG_S3C2410_RTC=y | ||
738 | # CONFIG_DTLK is not set | 756 | # CONFIG_DTLK is not set |
739 | # CONFIG_R3964 is not set | 757 | # CONFIG_R3964 is not set |
740 | 758 | ||
@@ -747,7 +765,6 @@ CONFIG_S3C2410_RTC=y | |||
747 | # TPM devices | 765 | # TPM devices |
748 | # | 766 | # |
749 | # CONFIG_TCG_TPM is not set | 767 | # CONFIG_TCG_TPM is not set |
750 | # CONFIG_TELCLOCK is not set | ||
751 | 768 | ||
752 | # | 769 | # |
753 | # I2C support | 770 | # I2C support |
@@ -792,12 +809,26 @@ CONFIG_SENSORS_EEPROM=m | |||
792 | # | 809 | # |
793 | # SPI support | 810 | # SPI support |
794 | # | 811 | # |
795 | # CONFIG_SPI is not set | 812 | CONFIG_SPI=y |
796 | # CONFIG_SPI_MASTER is not set | 813 | # CONFIG_SPI_DEBUG is not set |
814 | CONFIG_SPI_MASTER=y | ||
815 | |||
816 | # | ||
817 | # SPI Master Controller Drivers | ||
818 | # | ||
819 | CONFIG_SPI_BITBANG=m | ||
820 | # CONFIG_SPI_BUTTERFLY is not set | ||
821 | CONFIG_SPI_S3C24XX_GPIO=m | ||
822 | CONFIG_SPI_S3C24XX=m | ||
823 | |||
824 | # | ||
825 | # SPI Protocol Masters | ||
826 | # | ||
797 | 827 | ||
798 | # | 828 | # |
799 | # Dallas's 1-wire bus | 829 | # Dallas's 1-wire bus |
800 | # | 830 | # |
831 | # CONFIG_W1 is not set | ||
801 | 832 | ||
802 | # | 833 | # |
803 | # Hardware Monitoring support | 834 | # Hardware Monitoring support |
@@ -820,6 +851,7 @@ CONFIG_HWMON_VID=m | |||
820 | # CONFIG_SENSORS_GL520SM is not set | 851 | # CONFIG_SENSORS_GL520SM is not set |
821 | # CONFIG_SENSORS_IT87 is not set | 852 | # CONFIG_SENSORS_IT87 is not set |
822 | # CONFIG_SENSORS_LM63 is not set | 853 | # CONFIG_SENSORS_LM63 is not set |
854 | # CONFIG_SENSORS_LM70 is not set | ||
823 | CONFIG_SENSORS_LM75=m | 855 | CONFIG_SENSORS_LM75=m |
824 | # CONFIG_SENSORS_LM77 is not set | 856 | # CONFIG_SENSORS_LM77 is not set |
825 | CONFIG_SENSORS_LM78=m | 857 | CONFIG_SENSORS_LM78=m |
@@ -834,6 +866,7 @@ CONFIG_SENSORS_LM85=m | |||
834 | # CONFIG_SENSORS_SMSC47M1 is not set | 866 | # CONFIG_SENSORS_SMSC47M1 is not set |
835 | # CONFIG_SENSORS_SMSC47M192 is not set | 867 | # CONFIG_SENSORS_SMSC47M192 is not set |
836 | # CONFIG_SENSORS_SMSC47B397 is not set | 868 | # CONFIG_SENSORS_SMSC47B397 is not set |
869 | # CONFIG_SENSORS_VT1211 is not set | ||
837 | # CONFIG_SENSORS_W83781D is not set | 870 | # CONFIG_SENSORS_W83781D is not set |
838 | # CONFIG_SENSORS_W83791D is not set | 871 | # CONFIG_SENSORS_W83791D is not set |
839 | # CONFIG_SENSORS_W83792D is not set | 872 | # CONFIG_SENSORS_W83792D is not set |
@@ -845,25 +878,31 @@ CONFIG_SENSORS_LM85=m | |||
845 | # | 878 | # |
846 | # Misc devices | 879 | # Misc devices |
847 | # | 880 | # |
881 | # CONFIG_TIFM_CORE is not set | ||
848 | 882 | ||
849 | # | 883 | # |
850 | # LED devices | 884 | # LED devices |
851 | # | 885 | # |
852 | # CONFIG_NEW_LEDS is not set | 886 | CONFIG_NEW_LEDS=y |
887 | CONFIG_LEDS_CLASS=m | ||
853 | 888 | ||
854 | # | 889 | # |
855 | # LED drivers | 890 | # LED drivers |
856 | # | 891 | # |
892 | CONFIG_LEDS_S3C24XX=m | ||
857 | 893 | ||
858 | # | 894 | # |
859 | # LED Triggers | 895 | # LED Triggers |
860 | # | 896 | # |
897 | CONFIG_LEDS_TRIGGERS=y | ||
898 | CONFIG_LEDS_TRIGGER_TIMER=m | ||
899 | # CONFIG_LEDS_TRIGGER_IDE_DISK is not set | ||
900 | CONFIG_LEDS_TRIGGER_HEARTBEAT=m | ||
861 | 901 | ||
862 | # | 902 | # |
863 | # Multimedia devices | 903 | # Multimedia devices |
864 | # | 904 | # |
865 | # CONFIG_VIDEO_DEV is not set | 905 | # CONFIG_VIDEO_DEV is not set |
866 | CONFIG_VIDEO_V4L2=y | ||
867 | 906 | ||
868 | # | 907 | # |
869 | # Digital Video Broadcasting Devices | 908 | # Digital Video Broadcasting Devices |
@@ -876,6 +915,7 @@ CONFIG_VIDEO_V4L2=y | |||
876 | # | 915 | # |
877 | CONFIG_FIRMWARE_EDID=y | 916 | CONFIG_FIRMWARE_EDID=y |
878 | CONFIG_FB=y | 917 | CONFIG_FB=y |
918 | # CONFIG_FB_DDC is not set | ||
879 | CONFIG_FB_CFB_FILLRECT=y | 919 | CONFIG_FB_CFB_FILLRECT=y |
880 | CONFIG_FB_CFB_COPYAREA=y | 920 | CONFIG_FB_CFB_COPYAREA=y |
881 | CONFIG_FB_CFB_IMAGEBLIT=y | 921 | CONFIG_FB_CFB_IMAGEBLIT=y |
@@ -951,7 +991,6 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y | |||
951 | # | 991 | # |
952 | # may also be needed; see USB_STORAGE Help for more information | 992 | # may also be needed; see USB_STORAGE Help for more information |
953 | # | 993 | # |
954 | # CONFIG_USB_STORAGE is not set | ||
955 | # CONFIG_USB_LIBUSUAL is not set | 994 | # CONFIG_USB_LIBUSUAL is not set |
956 | 995 | ||
957 | # | 996 | # |
@@ -1007,6 +1046,7 @@ CONFIG_USB_MON=y | |||
1007 | # | 1046 | # |
1008 | # CONFIG_USB_EMI62 is not set | 1047 | # CONFIG_USB_EMI62 is not set |
1009 | # CONFIG_USB_EMI26 is not set | 1048 | # CONFIG_USB_EMI26 is not set |
1049 | # CONFIG_USB_ADUTUX is not set | ||
1010 | # CONFIG_USB_AUERSWALD is not set | 1050 | # CONFIG_USB_AUERSWALD is not set |
1011 | # CONFIG_USB_RIO500 is not set | 1051 | # CONFIG_USB_RIO500 is not set |
1012 | # CONFIG_USB_LEGOTOWER is not set | 1052 | # CONFIG_USB_LEGOTOWER is not set |
@@ -1014,11 +1054,12 @@ CONFIG_USB_MON=y | |||
1014 | # CONFIG_USB_LED is not set | 1054 | # CONFIG_USB_LED is not set |
1015 | # CONFIG_USB_CYPRESS_CY7C63 is not set | 1055 | # CONFIG_USB_CYPRESS_CY7C63 is not set |
1016 | # CONFIG_USB_CYTHERM is not set | 1056 | # CONFIG_USB_CYTHERM is not set |
1017 | # CONFIG_USB_PHIDGETKIT is not set | 1057 | # CONFIG_USB_PHIDGET is not set |
1018 | # CONFIG_USB_PHIDGETSERVO is not set | ||
1019 | # CONFIG_USB_IDMOUSE is not set | 1058 | # CONFIG_USB_IDMOUSE is not set |
1059 | # CONFIG_USB_FTDI_ELAN is not set | ||
1020 | # CONFIG_USB_APPLEDISPLAY is not set | 1060 | # CONFIG_USB_APPLEDISPLAY is not set |
1021 | # CONFIG_USB_LD is not set | 1061 | # CONFIG_USB_LD is not set |
1062 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
1022 | # CONFIG_USB_TEST is not set | 1063 | # CONFIG_USB_TEST is not set |
1023 | 1064 | ||
1024 | # | 1065 | # |
@@ -1039,7 +1080,37 @@ CONFIG_USB_MON=y | |||
1039 | # Real Time Clock | 1080 | # Real Time Clock |
1040 | # | 1081 | # |
1041 | CONFIG_RTC_LIB=y | 1082 | CONFIG_RTC_LIB=y |
1042 | # CONFIG_RTC_CLASS is not set | 1083 | CONFIG_RTC_CLASS=y |
1084 | CONFIG_RTC_HCTOSYS=y | ||
1085 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
1086 | # CONFIG_RTC_DEBUG is not set | ||
1087 | |||
1088 | # | ||
1089 | # RTC interfaces | ||
1090 | # | ||
1091 | CONFIG_RTC_INTF_SYSFS=y | ||
1092 | CONFIG_RTC_INTF_PROC=y | ||
1093 | CONFIG_RTC_INTF_DEV=y | ||
1094 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
1095 | |||
1096 | # | ||
1097 | # RTC drivers | ||
1098 | # | ||
1099 | # CONFIG_RTC_DRV_X1205 is not set | ||
1100 | # CONFIG_RTC_DRV_DS1307 is not set | ||
1101 | # CONFIG_RTC_DRV_DS1553 is not set | ||
1102 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
1103 | # CONFIG_RTC_DRV_DS1672 is not set | ||
1104 | # CONFIG_RTC_DRV_DS1742 is not set | ||
1105 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
1106 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
1107 | # CONFIG_RTC_DRV_RS5C348 is not set | ||
1108 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
1109 | CONFIG_RTC_DRV_S3C=y | ||
1110 | # CONFIG_RTC_DRV_M48T86 is not set | ||
1111 | # CONFIG_RTC_DRV_TEST is not set | ||
1112 | # CONFIG_RTC_DRV_MAX6902 is not set | ||
1113 | # CONFIG_RTC_DRV_V3020 is not set | ||
1043 | 1114 | ||
1044 | # | 1115 | # |
1045 | # File systems | 1116 | # File systems |
@@ -1051,6 +1122,7 @@ CONFIG_EXT3_FS=y | |||
1051 | CONFIG_EXT3_FS_XATTR=y | 1122 | CONFIG_EXT3_FS_XATTR=y |
1052 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 1123 | # CONFIG_EXT3_FS_POSIX_ACL is not set |
1053 | # CONFIG_EXT3_FS_SECURITY is not set | 1124 | # CONFIG_EXT3_FS_SECURITY is not set |
1125 | # CONFIG_EXT4DEV_FS is not set | ||
1054 | CONFIG_JBD=y | 1126 | CONFIG_JBD=y |
1055 | # CONFIG_JBD_DEBUG is not set | 1127 | # CONFIG_JBD_DEBUG is not set |
1056 | CONFIG_FS_MBCACHE=y | 1128 | CONFIG_FS_MBCACHE=y |
@@ -1058,6 +1130,7 @@ CONFIG_FS_MBCACHE=y | |||
1058 | # CONFIG_JFS_FS is not set | 1130 | # CONFIG_JFS_FS is not set |
1059 | # CONFIG_FS_POSIX_ACL is not set | 1131 | # CONFIG_FS_POSIX_ACL is not set |
1060 | # CONFIG_XFS_FS is not set | 1132 | # CONFIG_XFS_FS is not set |
1133 | # CONFIG_GFS2_FS is not set | ||
1061 | # CONFIG_OCFS2_FS is not set | 1134 | # CONFIG_OCFS2_FS is not set |
1062 | # CONFIG_MINIX_FS is not set | 1135 | # CONFIG_MINIX_FS is not set |
1063 | CONFIG_ROMFS_FS=y | 1136 | CONFIG_ROMFS_FS=y |
@@ -1089,6 +1162,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | |||
1089 | # Pseudo filesystems | 1162 | # Pseudo filesystems |
1090 | # | 1163 | # |
1091 | CONFIG_PROC_FS=y | 1164 | CONFIG_PROC_FS=y |
1165 | CONFIG_PROC_SYSCTL=y | ||
1092 | CONFIG_SYSFS=y | 1166 | CONFIG_SYSFS=y |
1093 | # CONFIG_TMPFS is not set | 1167 | # CONFIG_TMPFS is not set |
1094 | # CONFIG_HUGETLB_PAGE is not set | 1168 | # CONFIG_HUGETLB_PAGE is not set |
@@ -1219,6 +1293,7 @@ CONFIG_NLS_DEFAULT="iso8859-1" | |||
1219 | # Kernel hacking | 1293 | # Kernel hacking |
1220 | # | 1294 | # |
1221 | # CONFIG_PRINTK_TIME is not set | 1295 | # CONFIG_PRINTK_TIME is not set |
1296 | CONFIG_ENABLE_MUST_CHECK=y | ||
1222 | CONFIG_MAGIC_SYSRQ=y | 1297 | CONFIG_MAGIC_SYSRQ=y |
1223 | # CONFIG_UNUSED_SYMBOLS is not set | 1298 | # CONFIG_UNUSED_SYMBOLS is not set |
1224 | CONFIG_DEBUG_KERNEL=y | 1299 | CONFIG_DEBUG_KERNEL=y |
@@ -1238,9 +1313,10 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
1238 | CONFIG_DEBUG_INFO=y | 1313 | CONFIG_DEBUG_INFO=y |
1239 | # CONFIG_DEBUG_FS is not set | 1314 | # CONFIG_DEBUG_FS is not set |
1240 | # CONFIG_DEBUG_VM is not set | 1315 | # CONFIG_DEBUG_VM is not set |
1316 | # CONFIG_DEBUG_LIST is not set | ||
1241 | CONFIG_FRAME_POINTER=y | 1317 | CONFIG_FRAME_POINTER=y |
1242 | # CONFIG_UNWIND_INFO is not set | ||
1243 | CONFIG_FORCED_INLINING=y | 1318 | CONFIG_FORCED_INLINING=y |
1319 | # CONFIG_HEADERS_CHECK is not set | ||
1244 | # CONFIG_RCU_TORTURE_TEST is not set | 1320 | # CONFIG_RCU_TORTURE_TEST is not set |
1245 | CONFIG_DEBUG_USER=y | 1321 | CONFIG_DEBUG_USER=y |
1246 | # CONFIG_DEBUG_WAITQ is not set | 1322 | # CONFIG_DEBUG_WAITQ is not set |
@@ -1262,10 +1338,6 @@ CONFIG_DEBUG_S3C2410_UART=0 | |||
1262 | # CONFIG_CRYPTO is not set | 1338 | # CONFIG_CRYPTO is not set |
1263 | 1339 | ||
1264 | # | 1340 | # |
1265 | # Hardware crypto devices | ||
1266 | # | ||
1267 | |||
1268 | # | ||
1269 | # Library routines | 1341 | # Library routines |
1270 | # | 1342 | # |
1271 | # CONFIG_CRC_CCITT is not set | 1343 | # CONFIG_CRC_CCITT is not set |
diff --git a/arch/arm/configs/simpad_defconfig b/arch/arm/configs/simpad_defconfig index 2e5a616cc98d..140056a3507f 100644 --- a/arch/arm/configs/simpad_defconfig +++ b/arch/arm/configs/simpad_defconfig | |||
@@ -180,6 +180,7 @@ CONFIG_BINFMT_MISC=m | |||
180 | # Power management options | 180 | # Power management options |
181 | # | 181 | # |
182 | CONFIG_PM=y | 182 | CONFIG_PM=y |
183 | # CONFIG_PM_LEGACY is not set | ||
183 | CONFIG_APM=y | 184 | CONFIG_APM=y |
184 | 185 | ||
185 | # | 186 | # |
diff --git a/arch/arm/configs/smdk2410_defconfig b/arch/arm/configs/smdk2410_defconfig deleted file mode 100644 index 4d123d33c7df..000000000000 --- a/arch/arm/configs/smdk2410_defconfig +++ /dev/null | |||
@@ -1,735 +0,0 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.12-rc1-bk2 | ||
4 | # Sun Mar 27 22:42:40 2005 | ||
5 | # | ||
6 | CONFIG_ARM=y | ||
7 | CONFIG_MMU=y | ||
8 | CONFIG_UID16=y | ||
9 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
10 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
11 | CONFIG_GENERIC_IOMAP=y | ||
12 | |||
13 | # | ||
14 | # Code maturity level options | ||
15 | # | ||
16 | CONFIG_EXPERIMENTAL=y | ||
17 | CONFIG_CLEAN_COMPILE=y | ||
18 | CONFIG_BROKEN_ON_SMP=y | ||
19 | |||
20 | # | ||
21 | # General setup | ||
22 | # | ||
23 | CONFIG_LOCALVERSION="" | ||
24 | CONFIG_SWAP=y | ||
25 | CONFIG_SYSVIPC=y | ||
26 | # CONFIG_POSIX_MQUEUE is not set | ||
27 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
28 | CONFIG_SYSCTL=y | ||
29 | # CONFIG_AUDIT is not set | ||
30 | # CONFIG_HOTPLUG is not set | ||
31 | CONFIG_KOBJECT_UEVENT=y | ||
32 | # CONFIG_IKCONFIG is not set | ||
33 | # CONFIG_EMBEDDED is not set | ||
34 | CONFIG_KALLSYMS=y | ||
35 | # CONFIG_KALLSYMS_ALL is not set | ||
36 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
37 | CONFIG_BASE_FULL=y | ||
38 | CONFIG_FUTEX=y | ||
39 | CONFIG_EPOLL=y | ||
40 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
41 | CONFIG_SHMEM=y | ||
42 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
43 | CONFIG_CC_ALIGN_LABELS=0 | ||
44 | CONFIG_CC_ALIGN_LOOPS=0 | ||
45 | CONFIG_CC_ALIGN_JUMPS=0 | ||
46 | # CONFIG_TINY_SHMEM is not set | ||
47 | CONFIG_BASE_SMALL=0 | ||
48 | |||
49 | # | ||
50 | # Loadable module support | ||
51 | # | ||
52 | # CONFIG_MODULES is not set | ||
53 | |||
54 | # | ||
55 | # System Type | ||
56 | # | ||
57 | # CONFIG_ARCH_CLPS7500 is not set | ||
58 | # CONFIG_ARCH_CLPS711X is not set | ||
59 | # CONFIG_ARCH_CO285 is not set | ||
60 | # CONFIG_ARCH_EBSA110 is not set | ||
61 | # CONFIG_ARCH_FOOTBRIDGE is not set | ||
62 | # CONFIG_ARCH_INTEGRATOR is not set | ||
63 | # CONFIG_ARCH_IOP3XX is not set | ||
64 | # CONFIG_ARCH_IXP4XX is not set | ||
65 | # CONFIG_ARCH_IXP2000 is not set | ||
66 | # CONFIG_ARCH_L7200 is not set | ||
67 | # CONFIG_ARCH_PXA is not set | ||
68 | # CONFIG_ARCH_RPC is not set | ||
69 | # CONFIG_ARCH_SA1100 is not set | ||
70 | CONFIG_ARCH_S3C2410=y | ||
71 | # CONFIG_ARCH_SHARK is not set | ||
72 | # CONFIG_ARCH_LH7A40X is not set | ||
73 | # CONFIG_ARCH_OMAP is not set | ||
74 | # CONFIG_ARCH_VERSATILE is not set | ||
75 | # CONFIG_ARCH_IMX is not set | ||
76 | # CONFIG_ARCH_H720X is not set | ||
77 | |||
78 | # | ||
79 | # S3C24XX Implementations | ||
80 | # | ||
81 | # CONFIG_ARCH_BAST is not set | ||
82 | # CONFIG_ARCH_H1940 is not set | ||
83 | # CONFIG_MACH_N30 is not set | ||
84 | CONFIG_ARCH_SMDK2410=y | ||
85 | # CONFIG_ARCH_S3C2440 is not set | ||
86 | # CONFIG_MACH_VR1000 is not set | ||
87 | # CONFIG_MACH_RX3715 is not set | ||
88 | # CONFIG_MACH_OTOM is not set | ||
89 | # CONFIG_MACH_NEXCODER_2440 is not set | ||
90 | CONFIG_CPU_S3C2410=y | ||
91 | |||
92 | # | ||
93 | # S3C2410 Boot | ||
94 | # | ||
95 | |||
96 | # | ||
97 | # S3C2410 Setup | ||
98 | # | ||
99 | # CONFIG_S3C2410_DMA is not set | ||
100 | CONFIG_S3C2410_LOWLEVEL_UART_PORT=0 | ||
101 | |||
102 | # | ||
103 | # Processor Type | ||
104 | # | ||
105 | CONFIG_CPU_32=y | ||
106 | CONFIG_CPU_ARM920T=y | ||
107 | CONFIG_CPU_32v4=y | ||
108 | CONFIG_CPU_ABRT_EV4T=y | ||
109 | CONFIG_CPU_CACHE_V4WT=y | ||
110 | CONFIG_CPU_CACHE_VIVT=y | ||
111 | CONFIG_CPU_COPY_V4WB=y | ||
112 | CONFIG_CPU_TLB_V4WBI=y | ||
113 | |||
114 | # | ||
115 | # Processor Features | ||
116 | # | ||
117 | CONFIG_ARM_THUMB=y | ||
118 | # CONFIG_CPU_ICACHE_DISABLE is not set | ||
119 | # CONFIG_CPU_DCACHE_DISABLE is not set | ||
120 | # CONFIG_CPU_DCACHE_WRITETHROUGH is not set | ||
121 | |||
122 | # | ||
123 | # Bus support | ||
124 | # | ||
125 | |||
126 | # | ||
127 | # PCCARD (PCMCIA/CardBus) support | ||
128 | # | ||
129 | # CONFIG_PCCARD is not set | ||
130 | |||
131 | # | ||
132 | # Kernel Features | ||
133 | # | ||
134 | # CONFIG_PREEMPT is not set | ||
135 | CONFIG_ALIGNMENT_TRAP=y | ||
136 | |||
137 | # | ||
138 | # Boot options | ||
139 | # | ||
140 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
141 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
142 | CONFIG_CMDLINE="root=1f04 mem=32M" | ||
143 | # CONFIG_XIP_KERNEL is not set | ||
144 | |||
145 | # | ||
146 | # Floating point emulation | ||
147 | # | ||
148 | |||
149 | # | ||
150 | # At least one emulation must be selected | ||
151 | # | ||
152 | # CONFIG_FPE_NWFPE is not set | ||
153 | # CONFIG_FPE_FASTFPE is not set | ||
154 | |||
155 | # | ||
156 | # Userspace binary formats | ||
157 | # | ||
158 | CONFIG_BINFMT_ELF=y | ||
159 | CONFIG_BINFMT_AOUT=y | ||
160 | # CONFIG_BINFMT_MISC is not set | ||
161 | # CONFIG_ARTHUR is not set | ||
162 | |||
163 | # | ||
164 | # Power management options | ||
165 | # | ||
166 | # CONFIG_PM is not set | ||
167 | |||
168 | # | ||
169 | # Device Drivers | ||
170 | # | ||
171 | |||
172 | # | ||
173 | # Generic Driver Options | ||
174 | # | ||
175 | CONFIG_STANDALONE=y | ||
176 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
177 | # CONFIG_FW_LOADER is not set | ||
178 | # CONFIG_DEBUG_DRIVER is not set | ||
179 | |||
180 | # | ||
181 | # Memory Technology Devices (MTD) | ||
182 | # | ||
183 | CONFIG_MTD=y | ||
184 | # CONFIG_MTD_DEBUG is not set | ||
185 | # CONFIG_MTD_CONCAT is not set | ||
186 | # CONFIG_MTD_PARTITIONS is not set | ||
187 | |||
188 | # | ||
189 | # User Modules And Translation Layers | ||
190 | # | ||
191 | CONFIG_MTD_CHAR=y | ||
192 | CONFIG_MTD_BLOCK=y | ||
193 | # CONFIG_FTL is not set | ||
194 | # CONFIG_NFTL is not set | ||
195 | # CONFIG_INFTL is not set | ||
196 | |||
197 | # | ||
198 | # RAM/ROM/Flash chip drivers | ||
199 | # | ||
200 | CONFIG_MTD_CFI=y | ||
201 | # CONFIG_MTD_JEDECPROBE is not set | ||
202 | CONFIG_MTD_GEN_PROBE=y | ||
203 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
204 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
205 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
206 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
207 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
208 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
209 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
210 | CONFIG_MTD_CFI_I1=y | ||
211 | CONFIG_MTD_CFI_I2=y | ||
212 | # CONFIG_MTD_CFI_I4 is not set | ||
213 | # CONFIG_MTD_CFI_I8 is not set | ||
214 | CONFIG_MTD_CFI_INTELEXT=y | ||
215 | # CONFIG_MTD_CFI_AMDSTD is not set | ||
216 | # CONFIG_MTD_CFI_STAA is not set | ||
217 | CONFIG_MTD_CFI_UTIL=y | ||
218 | # CONFIG_MTD_RAM is not set | ||
219 | # CONFIG_MTD_ROM is not set | ||
220 | # CONFIG_MTD_ABSENT is not set | ||
221 | # CONFIG_MTD_XIP is not set | ||
222 | |||
223 | # | ||
224 | # Mapping drivers for chip access | ||
225 | # | ||
226 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
227 | # CONFIG_MTD_PHYSMAP is not set | ||
228 | # CONFIG_MTD_ARM_INTEGRATOR is not set | ||
229 | # CONFIG_MTD_EDB7312 is not set | ||
230 | |||
231 | # | ||
232 | # Self-contained MTD device drivers | ||
233 | # | ||
234 | # CONFIG_MTD_SLRAM is not set | ||
235 | # CONFIG_MTD_PHRAM is not set | ||
236 | # CONFIG_MTD_MTDRAM is not set | ||
237 | # CONFIG_MTD_BLKMTD is not set | ||
238 | # CONFIG_MTD_BLOCK2MTD is not set | ||
239 | |||
240 | # | ||
241 | # Disk-On-Chip Device Drivers | ||
242 | # | ||
243 | # CONFIG_MTD_DOC2000 is not set | ||
244 | # CONFIG_MTD_DOC2001 is not set | ||
245 | # CONFIG_MTD_DOC2001PLUS is not set | ||
246 | |||
247 | # | ||
248 | # NAND Flash Device Drivers | ||
249 | # | ||
250 | # CONFIG_MTD_NAND is not set | ||
251 | |||
252 | # | ||
253 | # Parallel port support | ||
254 | # | ||
255 | # CONFIG_PARPORT is not set | ||
256 | |||
257 | # | ||
258 | # Plug and Play support | ||
259 | # | ||
260 | |||
261 | # | ||
262 | # Block devices | ||
263 | # | ||
264 | # CONFIG_BLK_DEV_FD is not set | ||
265 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
266 | # CONFIG_BLK_DEV_LOOP is not set | ||
267 | # CONFIG_BLK_DEV_NBD is not set | ||
268 | CONFIG_BLK_DEV_RAM=y | ||
269 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
270 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
271 | # CONFIG_BLK_DEV_INITRD is not set | ||
272 | CONFIG_INITRAMFS_SOURCE="" | ||
273 | # CONFIG_CDROM_PKTCDVD is not set | ||
274 | |||
275 | # | ||
276 | # IO Schedulers | ||
277 | # | ||
278 | CONFIG_IOSCHED_NOOP=y | ||
279 | CONFIG_IOSCHED_AS=y | ||
280 | CONFIG_IOSCHED_DEADLINE=y | ||
281 | CONFIG_IOSCHED_CFQ=y | ||
282 | # CONFIG_ATA_OVER_ETH is not set | ||
283 | |||
284 | # | ||
285 | # ATA/ATAPI/MFM/RLL support | ||
286 | # | ||
287 | # CONFIG_IDE is not set | ||
288 | |||
289 | # | ||
290 | # SCSI device support | ||
291 | # | ||
292 | # CONFIG_SCSI is not set | ||
293 | |||
294 | # | ||
295 | # Multi-device support (RAID and LVM) | ||
296 | # | ||
297 | # CONFIG_MD is not set | ||
298 | |||
299 | # | ||
300 | # Fusion MPT device support | ||
301 | # | ||
302 | |||
303 | # | ||
304 | # IEEE 1394 (FireWire) support | ||
305 | # | ||
306 | |||
307 | # | ||
308 | # I2O device support | ||
309 | # | ||
310 | |||
311 | # | ||
312 | # Networking support | ||
313 | # | ||
314 | CONFIG_NET=y | ||
315 | |||
316 | # | ||
317 | # Networking options | ||
318 | # | ||
319 | # CONFIG_PACKET is not set | ||
320 | # CONFIG_NETLINK_DEV is not set | ||
321 | CONFIG_UNIX=y | ||
322 | # CONFIG_NET_KEY is not set | ||
323 | CONFIG_INET=y | ||
324 | # CONFIG_IP_MULTICAST is not set | ||
325 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
326 | CONFIG_IP_PNP=y | ||
327 | # CONFIG_IP_PNP_DHCP is not set | ||
328 | CONFIG_IP_PNP_BOOTP=y | ||
329 | # CONFIG_IP_PNP_RARP is not set | ||
330 | # CONFIG_NET_IPIP is not set | ||
331 | # CONFIG_NET_IPGRE is not set | ||
332 | # CONFIG_ARPD is not set | ||
333 | # CONFIG_SYN_COOKIES is not set | ||
334 | # CONFIG_INET_AH is not set | ||
335 | # CONFIG_INET_ESP is not set | ||
336 | # CONFIG_INET_IPCOMP is not set | ||
337 | # CONFIG_INET_TUNNEL is not set | ||
338 | # CONFIG_IP_TCPDIAG is not set | ||
339 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
340 | # CONFIG_IPV6 is not set | ||
341 | # CONFIG_NETFILTER is not set | ||
342 | |||
343 | # | ||
344 | # SCTP Configuration (EXPERIMENTAL) | ||
345 | # | ||
346 | # CONFIG_IP_SCTP is not set | ||
347 | # CONFIG_ATM is not set | ||
348 | # CONFIG_BRIDGE is not set | ||
349 | # CONFIG_VLAN_8021Q is not set | ||
350 | # CONFIG_DECNET is not set | ||
351 | # CONFIG_LLC2 is not set | ||
352 | # CONFIG_IPX is not set | ||
353 | # CONFIG_ATALK is not set | ||
354 | # CONFIG_X25 is not set | ||
355 | # CONFIG_LAPB is not set | ||
356 | # CONFIG_NET_DIVERT is not set | ||
357 | # CONFIG_ECONET is not set | ||
358 | # CONFIG_WAN_ROUTER is not set | ||
359 | |||
360 | # | ||
361 | # QoS and/or fair queueing | ||
362 | # | ||
363 | # CONFIG_NET_SCHED is not set | ||
364 | # CONFIG_NET_CLS_ROUTE is not set | ||
365 | |||
366 | # | ||
367 | # Network testing | ||
368 | # | ||
369 | # CONFIG_NET_PKTGEN is not set | ||
370 | # CONFIG_NETPOLL is not set | ||
371 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
372 | # CONFIG_HAMRADIO is not set | ||
373 | # CONFIG_IRDA is not set | ||
374 | # CONFIG_BT is not set | ||
375 | CONFIG_NETDEVICES=y | ||
376 | # CONFIG_DUMMY is not set | ||
377 | # CONFIG_BONDING is not set | ||
378 | # CONFIG_EQUALIZER is not set | ||
379 | # CONFIG_TUN is not set | ||
380 | |||
381 | # | ||
382 | # Ethernet (10 or 100Mbit) | ||
383 | # | ||
384 | CONFIG_NET_ETHERNET=y | ||
385 | # CONFIG_MII is not set | ||
386 | # CONFIG_SMC91X is not set | ||
387 | |||
388 | # | ||
389 | # Ethernet (1000 Mbit) | ||
390 | # | ||
391 | |||
392 | # | ||
393 | # Ethernet (10000 Mbit) | ||
394 | # | ||
395 | |||
396 | # | ||
397 | # Token Ring devices | ||
398 | # | ||
399 | |||
400 | # | ||
401 | # Wireless LAN (non-hamradio) | ||
402 | # | ||
403 | # CONFIG_NET_RADIO is not set | ||
404 | |||
405 | # | ||
406 | # Wan interfaces | ||
407 | # | ||
408 | # CONFIG_WAN is not set | ||
409 | # CONFIG_PPP is not set | ||
410 | # CONFIG_SLIP is not set | ||
411 | # CONFIG_SHAPER is not set | ||
412 | # CONFIG_NETCONSOLE is not set | ||
413 | |||
414 | # | ||
415 | # ISDN subsystem | ||
416 | # | ||
417 | # CONFIG_ISDN is not set | ||
418 | |||
419 | # | ||
420 | # Input device support | ||
421 | # | ||
422 | CONFIG_INPUT=y | ||
423 | |||
424 | # | ||
425 | # Userland interfaces | ||
426 | # | ||
427 | CONFIG_INPUT_MOUSEDEV=y | ||
428 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | ||
429 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
430 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
431 | # CONFIG_INPUT_JOYDEV is not set | ||
432 | # CONFIG_INPUT_TSDEV is not set | ||
433 | # CONFIG_INPUT_EVDEV is not set | ||
434 | # CONFIG_INPUT_EVBUG is not set | ||
435 | |||
436 | # | ||
437 | # Input Device Drivers | ||
438 | # | ||
439 | CONFIG_INPUT_KEYBOARD=y | ||
440 | CONFIG_KEYBOARD_ATKBD=y | ||
441 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
442 | # CONFIG_KEYBOARD_LKKBD is not set | ||
443 | # CONFIG_KEYBOARD_XTKBD is not set | ||
444 | # CONFIG_KEYBOARD_NEWTON is not set | ||
445 | CONFIG_INPUT_MOUSE=y | ||
446 | CONFIG_MOUSE_PS2=y | ||
447 | # CONFIG_MOUSE_SERIAL is not set | ||
448 | # CONFIG_MOUSE_VSXXXAA is not set | ||
449 | # CONFIG_INPUT_JOYSTICK is not set | ||
450 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
451 | # CONFIG_INPUT_MISC is not set | ||
452 | |||
453 | # | ||
454 | # Hardware I/O ports | ||
455 | # | ||
456 | CONFIG_SERIO=y | ||
457 | CONFIG_SERIO_SERPORT=y | ||
458 | CONFIG_SERIO_LIBPS2=y | ||
459 | # CONFIG_SERIO_RAW is not set | ||
460 | # CONFIG_GAMEPORT is not set | ||
461 | CONFIG_SOUND_GAMEPORT=y | ||
462 | |||
463 | # | ||
464 | # Character devices | ||
465 | # | ||
466 | CONFIG_VT=y | ||
467 | CONFIG_VT_CONSOLE=y | ||
468 | CONFIG_HW_CONSOLE=y | ||
469 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
470 | |||
471 | # | ||
472 | # Serial drivers | ||
473 | # | ||
474 | # CONFIG_SERIAL_8250 is not set | ||
475 | |||
476 | # | ||
477 | # Non-8250 serial port support | ||
478 | # | ||
479 | CONFIG_SERIAL_S3C2410=y | ||
480 | CONFIG_SERIAL_S3C2410_CONSOLE=y | ||
481 | CONFIG_SERIAL_CORE=y | ||
482 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
483 | CONFIG_UNIX98_PTYS=y | ||
484 | CONFIG_LEGACY_PTYS=y | ||
485 | CONFIG_LEGACY_PTY_COUNT=256 | ||
486 | |||
487 | # | ||
488 | # IPMI | ||
489 | # | ||
490 | # CONFIG_IPMI_HANDLER is not set | ||
491 | |||
492 | # | ||
493 | # Watchdog Cards | ||
494 | # | ||
495 | # CONFIG_WATCHDOG is not set | ||
496 | # CONFIG_NVRAM is not set | ||
497 | # CONFIG_RTC is not set | ||
498 | # CONFIG_S3C2410_RTC is not set | ||
499 | # CONFIG_DTLK is not set | ||
500 | # CONFIG_R3964 is not set | ||
501 | |||
502 | # | ||
503 | # Ftape, the floppy tape device driver | ||
504 | # | ||
505 | # CONFIG_DRM is not set | ||
506 | # CONFIG_RAW_DRIVER is not set | ||
507 | |||
508 | # | ||
509 | # TPM devices | ||
510 | # | ||
511 | # CONFIG_TCG_TPM is not set | ||
512 | |||
513 | # | ||
514 | # I2C support | ||
515 | # | ||
516 | # CONFIG_I2C is not set | ||
517 | |||
518 | # | ||
519 | # Misc devices | ||
520 | # | ||
521 | |||
522 | # | ||
523 | # Multimedia devices | ||
524 | # | ||
525 | # CONFIG_VIDEO_DEV is not set | ||
526 | |||
527 | # | ||
528 | # Digital Video Broadcasting Devices | ||
529 | # | ||
530 | # CONFIG_DVB is not set | ||
531 | |||
532 | # | ||
533 | # Graphics support | ||
534 | # | ||
535 | CONFIG_FB=y | ||
536 | CONFIG_FB_CFB_FILLRECT=y | ||
537 | CONFIG_FB_CFB_COPYAREA=y | ||
538 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
539 | CONFIG_FB_SOFT_CURSOR=y | ||
540 | # CONFIG_FB_MODE_HELPERS is not set | ||
541 | # CONFIG_FB_TILEBLITTING is not set | ||
542 | CONFIG_FB_VIRTUAL=y | ||
543 | |||
544 | # | ||
545 | # Console display driver support | ||
546 | # | ||
547 | # CONFIG_VGA_CONSOLE is not set | ||
548 | CONFIG_DUMMY_CONSOLE=y | ||
549 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
550 | # CONFIG_FONTS is not set | ||
551 | CONFIG_FONT_8x8=y | ||
552 | CONFIG_FONT_8x16=y | ||
553 | |||
554 | # | ||
555 | # Logo configuration | ||
556 | # | ||
557 | # CONFIG_LOGO is not set | ||
558 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
559 | |||
560 | # | ||
561 | # Sound | ||
562 | # | ||
563 | # CONFIG_SOUND is not set | ||
564 | |||
565 | # | ||
566 | # USB support | ||
567 | # | ||
568 | CONFIG_USB_ARCH_HAS_HCD=y | ||
569 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
570 | # CONFIG_USB is not set | ||
571 | |||
572 | # | ||
573 | # USB Gadget Support | ||
574 | # | ||
575 | # CONFIG_USB_GADGET is not set | ||
576 | |||
577 | # | ||
578 | # MMC/SD Card support | ||
579 | # | ||
580 | # CONFIG_MMC is not set | ||
581 | |||
582 | # | ||
583 | # File systems | ||
584 | # | ||
585 | CONFIG_EXT2_FS=y | ||
586 | # CONFIG_EXT2_FS_XATTR is not set | ||
587 | # CONFIG_EXT3_FS is not set | ||
588 | # CONFIG_JBD is not set | ||
589 | # CONFIG_REISERFS_FS is not set | ||
590 | # CONFIG_JFS_FS is not set | ||
591 | |||
592 | # | ||
593 | # XFS support | ||
594 | # | ||
595 | # CONFIG_XFS_FS is not set | ||
596 | # CONFIG_MINIX_FS is not set | ||
597 | CONFIG_ROMFS_FS=y | ||
598 | # CONFIG_QUOTA is not set | ||
599 | CONFIG_DNOTIFY=y | ||
600 | # CONFIG_AUTOFS_FS is not set | ||
601 | # CONFIG_AUTOFS4_FS is not set | ||
602 | |||
603 | # | ||
604 | # CD-ROM/DVD Filesystems | ||
605 | # | ||
606 | # CONFIG_ISO9660_FS is not set | ||
607 | # CONFIG_UDF_FS is not set | ||
608 | |||
609 | # | ||
610 | # DOS/FAT/NT Filesystems | ||
611 | # | ||
612 | # CONFIG_MSDOS_FS is not set | ||
613 | # CONFIG_VFAT_FS is not set | ||
614 | # CONFIG_NTFS_FS is not set | ||
615 | |||
616 | # | ||
617 | # Pseudo filesystems | ||
618 | # | ||
619 | CONFIG_PROC_FS=y | ||
620 | CONFIG_SYSFS=y | ||
621 | # CONFIG_DEVFS_FS is not set | ||
622 | # CONFIG_DEVPTS_FS_XATTR is not set | ||
623 | # CONFIG_TMPFS is not set | ||
624 | # CONFIG_HUGETLB_PAGE is not set | ||
625 | CONFIG_RAMFS=y | ||
626 | |||
627 | # | ||
628 | # Miscellaneous filesystems | ||
629 | # | ||
630 | # CONFIG_ADFS_FS is not set | ||
631 | # CONFIG_AFFS_FS is not set | ||
632 | # CONFIG_HFS_FS is not set | ||
633 | # CONFIG_HFSPLUS_FS is not set | ||
634 | # CONFIG_BEFS_FS is not set | ||
635 | # CONFIG_BFS_FS is not set | ||
636 | # CONFIG_EFS_FS is not set | ||
637 | # CONFIG_JFFS_FS is not set | ||
638 | # CONFIG_JFFS2_FS is not set | ||
639 | # CONFIG_CRAMFS is not set | ||
640 | # CONFIG_VXFS_FS is not set | ||
641 | # CONFIG_HPFS_FS is not set | ||
642 | # CONFIG_QNX4FS_FS is not set | ||
643 | # CONFIG_SYSV_FS is not set | ||
644 | # CONFIG_UFS_FS is not set | ||
645 | |||
646 | # | ||
647 | # Network File Systems | ||
648 | # | ||
649 | CONFIG_NFS_FS=y | ||
650 | # CONFIG_NFS_V3 is not set | ||
651 | # CONFIG_NFS_V4 is not set | ||
652 | # CONFIG_NFS_DIRECTIO is not set | ||
653 | # CONFIG_NFSD is not set | ||
654 | CONFIG_ROOT_NFS=y | ||
655 | CONFIG_LOCKD=y | ||
656 | CONFIG_SUNRPC=y | ||
657 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
658 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
659 | # CONFIG_SMB_FS is not set | ||
660 | # CONFIG_CIFS is not set | ||
661 | # CONFIG_NCP_FS is not set | ||
662 | # CONFIG_CODA_FS is not set | ||
663 | # CONFIG_AFS_FS is not set | ||
664 | |||
665 | # | ||
666 | # Partition Types | ||
667 | # | ||
668 | CONFIG_PARTITION_ADVANCED=y | ||
669 | # CONFIG_ACORN_PARTITION is not set | ||
670 | # CONFIG_OSF_PARTITION is not set | ||
671 | # CONFIG_AMIGA_PARTITION is not set | ||
672 | # CONFIG_ATARI_PARTITION is not set | ||
673 | # CONFIG_MAC_PARTITION is not set | ||
674 | # CONFIG_MSDOS_PARTITION is not set | ||
675 | # CONFIG_LDM_PARTITION is not set | ||
676 | # CONFIG_SGI_PARTITION is not set | ||
677 | # CONFIG_ULTRIX_PARTITION is not set | ||
678 | # CONFIG_SUN_PARTITION is not set | ||
679 | # CONFIG_EFI_PARTITION is not set | ||
680 | |||
681 | # | ||
682 | # Native Language Support | ||
683 | # | ||
684 | # CONFIG_NLS is not set | ||
685 | |||
686 | # | ||
687 | # Profiling support | ||
688 | # | ||
689 | # CONFIG_PROFILING is not set | ||
690 | |||
691 | # | ||
692 | # Kernel hacking | ||
693 | # | ||
694 | # CONFIG_PRINTK_TIME is not set | ||
695 | CONFIG_DEBUG_KERNEL=y | ||
696 | # CONFIG_MAGIC_SYSRQ is not set | ||
697 | CONFIG_LOG_BUF_SHIFT=14 | ||
698 | # CONFIG_SCHEDSTATS is not set | ||
699 | # CONFIG_DEBUG_SLAB is not set | ||
700 | # CONFIG_DEBUG_SPINLOCK is not set | ||
701 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
702 | # CONFIG_DEBUG_KOBJECT is not set | ||
703 | CONFIG_DEBUG_BUGVERBOSE=y | ||
704 | # CONFIG_DEBUG_INFO is not set | ||
705 | # CONFIG_DEBUG_FS is not set | ||
706 | CONFIG_FRAME_POINTER=y | ||
707 | CONFIG_DEBUG_USER=y | ||
708 | # CONFIG_DEBUG_WAITQ is not set | ||
709 | # CONFIG_DEBUG_ERRORS is not set | ||
710 | CONFIG_DEBUG_LL=y | ||
711 | # CONFIG_DEBUG_ICEDCC is not set | ||
712 | CONFIG_DEBUG_S3C2410_PORT=y | ||
713 | CONFIG_DEBUG_S3C2410_UART=0 | ||
714 | |||
715 | # | ||
716 | # Security options | ||
717 | # | ||
718 | # CONFIG_KEYS is not set | ||
719 | # CONFIG_SECURITY is not set | ||
720 | |||
721 | # | ||
722 | # Cryptographic options | ||
723 | # | ||
724 | # CONFIG_CRYPTO is not set | ||
725 | |||
726 | # | ||
727 | # Hardware crypto devices | ||
728 | # | ||
729 | |||
730 | # | ||
731 | # Library routines | ||
732 | # | ||
733 | # CONFIG_CRC_CCITT is not set | ||
734 | CONFIG_CRC32=y | ||
735 | CONFIG_LIBCRC32C=y | ||
diff --git a/arch/arm/configs/spitz_defconfig b/arch/arm/configs/spitz_defconfig index d1ace3abfd8a..bd03238968c1 100644 --- a/arch/arm/configs/spitz_defconfig +++ b/arch/arm/configs/spitz_defconfig | |||
@@ -207,6 +207,7 @@ CONFIG_BINFMT_MISC=m | |||
207 | # Power management options | 207 | # Power management options |
208 | # | 208 | # |
209 | CONFIG_PM=y | 209 | CONFIG_PM=y |
210 | # CONFIG_PM_LEGACY is not set | ||
210 | CONFIG_APM=y | 211 | CONFIG_APM=y |
211 | 212 | ||
212 | # | 213 | # |
diff --git a/arch/arm/configs/versatile_defconfig b/arch/arm/configs/versatile_defconfig index 96b7a7762426..f7bf6ef27d19 100644 --- a/arch/arm/configs/versatile_defconfig +++ b/arch/arm/configs/versatile_defconfig | |||
@@ -200,7 +200,7 @@ CONFIG_BINFMT_ELF=y | |||
200 | # Power management options | 200 | # Power management options |
201 | # | 201 | # |
202 | CONFIG_PM=y | 202 | CONFIG_PM=y |
203 | CONFIG_PM_LEGACY=y | 203 | # CONFIG_PM_LEGACY is not set |
204 | # CONFIG_PM_DEBUG is not set | 204 | # CONFIG_PM_DEBUG is not set |
205 | # CONFIG_APM is not set | 205 | # CONFIG_APM is not set |
206 | 206 | ||
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 6bbd93dd186a..29efc9f82057 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -357,6 +357,9 @@ static void __init setup_processor(void) | |||
357 | #ifndef CONFIG_VFP | 357 | #ifndef CONFIG_VFP |
358 | elf_hwcap &= ~HWCAP_VFP; | 358 | elf_hwcap &= ~HWCAP_VFP; |
359 | #endif | 359 | #endif |
360 | #ifndef CONFIG_IWMMXT | ||
361 | elf_hwcap &= ~HWCAP_IWMMXT; | ||
362 | #endif | ||
360 | 363 | ||
361 | cpu_proc_init(); | 364 | cpu_proc_init(); |
362 | } | 365 | } |
@@ -854,6 +857,7 @@ static const char *hwcap_str[] = { | |||
854 | "vfp", | 857 | "vfp", |
855 | "edsp", | 858 | "edsp", |
856 | "java", | 859 | "java", |
860 | "iwmmxt", | ||
857 | NULL | 861 | NULL |
858 | }; | 862 | }; |
859 | 863 | ||
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 421329f5e18e..070bcb7a6306 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | #include <linux/module.h> | ||
10 | #include <linux/delay.h> | 11 | #include <linux/delay.h> |
11 | #include <linux/init.h> | 12 | #include <linux/init.h> |
12 | #include <linux/spinlock.h> | 13 | #include <linux/spinlock.h> |
@@ -19,6 +20,7 @@ | |||
19 | #include <linux/cpu.h> | 20 | #include <linux/cpu.h> |
20 | #include <linux/smp.h> | 21 | #include <linux/smp.h> |
21 | #include <linux/seq_file.h> | 22 | #include <linux/seq_file.h> |
23 | #include <linux/irq.h> | ||
22 | 24 | ||
23 | #include <asm/atomic.h> | 25 | #include <asm/atomic.h> |
24 | #include <asm/cacheflush.h> | 26 | #include <asm/cacheflush.h> |
@@ -449,6 +451,7 @@ int smp_call_function(void (*func)(void *info), void *info, int retry, | |||
449 | return smp_call_function_on_cpu(func, info, retry, wait, | 451 | return smp_call_function_on_cpu(func, info, retry, wait, |
450 | cpu_online_map); | 452 | cpu_online_map); |
451 | } | 453 | } |
454 | EXPORT_SYMBOL_GPL(smp_call_function); | ||
452 | 455 | ||
453 | void show_ipi_list(struct seq_file *p) | 456 | void show_ipi_list(struct seq_file *p) |
454 | { | 457 | { |
@@ -474,25 +477,26 @@ void show_local_irqs(struct seq_file *p) | |||
474 | seq_putc(p, '\n'); | 477 | seq_putc(p, '\n'); |
475 | } | 478 | } |
476 | 479 | ||
477 | static void ipi_timer(struct pt_regs *regs) | 480 | static void ipi_timer(void) |
478 | { | 481 | { |
479 | int user = user_mode(regs); | ||
480 | |||
481 | irq_enter(); | 482 | irq_enter(); |
482 | profile_tick(CPU_PROFILING, regs); | 483 | profile_tick(CPU_PROFILING); |
483 | update_process_times(user); | 484 | update_process_times(user_mode(get_irq_regs())); |
484 | irq_exit(); | 485 | irq_exit(); |
485 | } | 486 | } |
486 | 487 | ||
487 | #ifdef CONFIG_LOCAL_TIMERS | 488 | #ifdef CONFIG_LOCAL_TIMERS |
488 | asmlinkage void do_local_timer(struct pt_regs *regs) | 489 | asmlinkage void do_local_timer(struct pt_regs *regs) |
489 | { | 490 | { |
491 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
490 | int cpu = smp_processor_id(); | 492 | int cpu = smp_processor_id(); |
491 | 493 | ||
492 | if (local_timer_ack()) { | 494 | if (local_timer_ack()) { |
493 | irq_stat[cpu].local_timer_irqs++; | 495 | irq_stat[cpu].local_timer_irqs++; |
494 | ipi_timer(regs); | 496 | ipi_timer(); |
495 | } | 497 | } |
498 | |||
499 | set_irq_regs(old_regs); | ||
496 | } | 500 | } |
497 | #endif | 501 | #endif |
498 | 502 | ||
@@ -551,6 +555,7 @@ asmlinkage void do_IPI(struct pt_regs *regs) | |||
551 | { | 555 | { |
552 | unsigned int cpu = smp_processor_id(); | 556 | unsigned int cpu = smp_processor_id(); |
553 | struct ipi_data *ipi = &per_cpu(ipi_data, cpu); | 557 | struct ipi_data *ipi = &per_cpu(ipi_data, cpu); |
558 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
554 | 559 | ||
555 | ipi->ipi_count++; | 560 | ipi->ipi_count++; |
556 | 561 | ||
@@ -574,7 +579,7 @@ asmlinkage void do_IPI(struct pt_regs *regs) | |||
574 | 579 | ||
575 | switch (nextmsg) { | 580 | switch (nextmsg) { |
576 | case IPI_TIMER: | 581 | case IPI_TIMER: |
577 | ipi_timer(regs); | 582 | ipi_timer(); |
578 | break; | 583 | break; |
579 | 584 | ||
580 | case IPI_RESCHEDULE: | 585 | case IPI_RESCHEDULE: |
@@ -599,6 +604,8 @@ asmlinkage void do_IPI(struct pt_regs *regs) | |||
599 | } | 604 | } |
600 | } while (msgs); | 605 | } while (msgs); |
601 | } | 606 | } |
607 | |||
608 | set_irq_regs(old_regs); | ||
602 | } | 609 | } |
603 | 610 | ||
604 | void smp_send_reschedule(int cpu) | 611 | void smp_send_reschedule(int cpu) |
diff --git a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c index c03cab5c4c79..6ff5e3ff6cb5 100644 --- a/arch/arm/kernel/time.c +++ b/arch/arm/kernel/time.c | |||
@@ -220,10 +220,10 @@ EXPORT_SYMBOL(leds_event); | |||
220 | #ifdef CONFIG_LEDS_TIMER | 220 | #ifdef CONFIG_LEDS_TIMER |
221 | static inline void do_leds(void) | 221 | static inline void do_leds(void) |
222 | { | 222 | { |
223 | static unsigned int count = 50; | 223 | static unsigned int count = HZ/2; |
224 | 224 | ||
225 | if (--count == 0) { | 225 | if (--count == 0) { |
226 | count = 50; | 226 | count = HZ/2; |
227 | leds_event(led_timer); | 227 | leds_event(led_timer); |
228 | } | 228 | } |
229 | } | 229 | } |
@@ -327,13 +327,12 @@ EXPORT_SYMBOL(restore_time_delta); | |||
327 | */ | 327 | */ |
328 | void timer_tick(void) | 328 | void timer_tick(void) |
329 | { | 329 | { |
330 | struct pt_regs *regs = get_irq_regs(); | ||
331 | profile_tick(CPU_PROFILING); | 330 | profile_tick(CPU_PROFILING); |
332 | do_leds(); | 331 | do_leds(); |
333 | do_set_rtc(); | 332 | do_set_rtc(); |
334 | do_timer(1); | 333 | do_timer(1); |
335 | #ifndef CONFIG_SMP | 334 | #ifndef CONFIG_SMP |
336 | update_process_times(user_mode(regs)); | 335 | update_process_times(user_mode(get_irq_regs())); |
337 | #endif | 336 | #endif |
338 | } | 337 | } |
339 | 338 | ||
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 3ca574ee2772..a8fa75ea07a9 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
@@ -45,13 +45,7 @@ SECTIONS | |||
45 | *(.early_param.init) | 45 | *(.early_param.init) |
46 | __early_end = .; | 46 | __early_end = .; |
47 | __initcall_start = .; | 47 | __initcall_start = .; |
48 | *(.initcall1.init) | 48 | INITCALLS |
49 | *(.initcall2.init) | ||
50 | *(.initcall3.init) | ||
51 | *(.initcall4.init) | ||
52 | *(.initcall5.init) | ||
53 | *(.initcall6.init) | ||
54 | *(.initcall7.init) | ||
55 | __initcall_end = .; | 49 | __initcall_end = .; |
56 | __con_initcall_start = .; | 50 | __con_initcall_start = .; |
57 | *(.con_initcall.init) | 51 | *(.con_initcall.init) |
diff --git a/arch/arm/mach-ebsa110/io.c b/arch/arm/mach-ebsa110/io.c index c648bfb676a1..db38afb2aa88 100644 --- a/arch/arm/mach-ebsa110/io.c +++ b/arch/arm/mach-ebsa110/io.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include <asm/io.h> | 28 | #include <asm/io.h> |
29 | #include <asm/page.h> | 29 | #include <asm/page.h> |
30 | 30 | ||
31 | static void __iomem *__isamem_convert_addr(void __iomem *addr) | 31 | static void __iomem *__isamem_convert_addr(const volatile void __iomem *addr) |
32 | { | 32 | { |
33 | u32 ret, a = (u32 __force) addr; | 33 | u32 ret, a = (u32 __force) addr; |
34 | 34 | ||
@@ -63,7 +63,7 @@ static void __iomem *__isamem_convert_addr(void __iomem *addr) | |||
63 | /* | 63 | /* |
64 | * read[bwl] and write[bwl] | 64 | * read[bwl] and write[bwl] |
65 | */ | 65 | */ |
66 | u8 __readb(void __iomem *addr) | 66 | u8 __readb(const volatile void __iomem *addr) |
67 | { | 67 | { |
68 | void __iomem *a = __isamem_convert_addr(addr); | 68 | void __iomem *a = __isamem_convert_addr(addr); |
69 | u32 ret; | 69 | u32 ret; |
@@ -75,7 +75,7 @@ u8 __readb(void __iomem *addr) | |||
75 | return ret; | 75 | return ret; |
76 | } | 76 | } |
77 | 77 | ||
78 | u16 __readw(void __iomem *addr) | 78 | u16 __readw(const volatile void __iomem *addr) |
79 | { | 79 | { |
80 | void __iomem *a = __isamem_convert_addr(addr); | 80 | void __iomem *a = __isamem_convert_addr(addr); |
81 | 81 | ||
@@ -85,7 +85,7 @@ u16 __readw(void __iomem *addr) | |||
85 | return __raw_readw(a); | 85 | return __raw_readw(a); |
86 | } | 86 | } |
87 | 87 | ||
88 | u32 __readl(void __iomem *addr) | 88 | u32 __readl(const volatile void __iomem *addr) |
89 | { | 89 | { |
90 | void __iomem *a = __isamem_convert_addr(addr); | 90 | void __iomem *a = __isamem_convert_addr(addr); |
91 | u32 ret; | 91 | u32 ret; |
diff --git a/arch/arm/mach-iop32x/n2100.c b/arch/arm/mach-iop32x/n2100.c index a2c94a47b2b2..2499a7707e3c 100644 --- a/arch/arm/mach-iop32x/n2100.c +++ b/arch/arm/mach-iop32x/n2100.c | |||
@@ -85,7 +85,7 @@ n2100_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | |||
85 | irq = IRQ_IOP32X_XINT0; | 85 | irq = IRQ_IOP32X_XINT0; |
86 | } else if (PCI_SLOT(dev->devfn) == 2) { | 86 | } else if (PCI_SLOT(dev->devfn) == 2) { |
87 | /* RTL8110SB #2 */ | 87 | /* RTL8110SB #2 */ |
88 | irq = IRQ_IOP32X_XINT1; | 88 | irq = IRQ_IOP32X_XINT3; |
89 | } else if (PCI_SLOT(dev->devfn) == 3) { | 89 | } else if (PCI_SLOT(dev->devfn) == 3) { |
90 | /* Sil3512 */ | 90 | /* Sil3512 */ |
91 | irq = IRQ_IOP32X_XINT2; | 91 | irq = IRQ_IOP32X_XINT2; |
diff --git a/arch/arm/mach-ixp2000/ixdp2400.c b/arch/arm/mach-ixp2000/ixdp2400.c index 9ee63834e603..0fdd03ab36e6 100644 --- a/arch/arm/mach-ixp2000/ixdp2400.c +++ b/arch/arm/mach-ixp2000/ixdp2400.c | |||
@@ -135,11 +135,11 @@ static void ixdp2400_pci_postinit(void) | |||
135 | if (ixdp2x00_master_npu()) { | 135 | if (ixdp2x00_master_npu()) { |
136 | dev = pci_get_bus_and_slot(1, IXDP2400_SLAVE_ENET_DEVFN); | 136 | dev = pci_get_bus_and_slot(1, IXDP2400_SLAVE_ENET_DEVFN); |
137 | pci_remove_bus_device(dev); | 137 | pci_remove_bus_device(dev); |
138 | pci_dev_put(dev) | 138 | pci_dev_put(dev); |
139 | } else { | 139 | } else { |
140 | dev = pci_get_bus_and_slot(1, IXDP2400_MASTER_ENET_DEVFN); | 140 | dev = pci_get_bus_and_slot(1, IXDP2400_MASTER_ENET_DEVFN); |
141 | pci_remove_bus_device(dev); | 141 | pci_remove_bus_device(dev); |
142 | pci_dev_put(dev) | 142 | pci_dev_put(dev); |
143 | 143 | ||
144 | ixdp2x00_slave_pci_postinit(); | 144 | ixdp2x00_slave_pci_postinit(); |
145 | } | 145 | } |
diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c index c7513f6eb50c..fbe288a8da65 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c | |||
@@ -86,7 +86,8 @@ enum ixp4xx_irq_type { | |||
86 | IXP4XX_IRQ_LEVEL, IXP4XX_IRQ_EDGE | 86 | IXP4XX_IRQ_LEVEL, IXP4XX_IRQ_EDGE |
87 | }; | 87 | }; |
88 | 88 | ||
89 | static void ixp4xx_config_irq(unsigned irq, enum ixp4xx_irq_type type); | 89 | /* Each bit represents an IRQ: 1: edge-triggered, 0: level triggered */ |
90 | static unsigned long long ixp4xx_irq_edge = 0; | ||
90 | 91 | ||
91 | /* | 92 | /* |
92 | * IRQ -> GPIO mapping table | 93 | * IRQ -> GPIO mapping table |
@@ -135,7 +136,11 @@ static int ixp4xx_set_irq_type(unsigned int irq, unsigned int type) | |||
135 | default: | 136 | default: |
136 | return -EINVAL; | 137 | return -EINVAL; |
137 | } | 138 | } |
138 | ixp4xx_config_irq(irq, irq_type); | 139 | |
140 | if (irq_type == IXP4XX_IRQ_EDGE) | ||
141 | ixp4xx_irq_edge |= (1 << irq); | ||
142 | else | ||
143 | ixp4xx_irq_edge &= ~(1 << irq); | ||
139 | 144 | ||
140 | if (line >= 8) { /* pins 8-15 */ | 145 | if (line >= 8) { /* pins 8-15 */ |
141 | line -= 8; | 146 | line -= 8; |
@@ -167,14 +172,6 @@ static void ixp4xx_irq_mask(unsigned int irq) | |||
167 | *IXP4XX_ICMR &= ~(1 << irq); | 172 | *IXP4XX_ICMR &= ~(1 << irq); |
168 | } | 173 | } |
169 | 174 | ||
170 | static void ixp4xx_irq_unmask(unsigned int irq) | ||
171 | { | ||
172 | if (cpu_is_ixp46x() && irq >= 32) | ||
173 | *IXP4XX_ICMR2 |= (1 << (irq - 32)); | ||
174 | else | ||
175 | *IXP4XX_ICMR |= (1 << irq); | ||
176 | } | ||
177 | |||
178 | static void ixp4xx_irq_ack(unsigned int irq) | 175 | static void ixp4xx_irq_ack(unsigned int irq) |
179 | { | 176 | { |
180 | int line = (irq < 32) ? irq2gpio[irq] : -1; | 177 | int line = (irq < 32) ? irq2gpio[irq] : -1; |
@@ -187,41 +184,25 @@ static void ixp4xx_irq_ack(unsigned int irq) | |||
187 | * Level triggered interrupts on GPIO lines can only be cleared when the | 184 | * Level triggered interrupts on GPIO lines can only be cleared when the |
188 | * interrupt condition disappears. | 185 | * interrupt condition disappears. |
189 | */ | 186 | */ |
190 | static void ixp4xx_irq_level_unmask(unsigned int irq) | 187 | static void ixp4xx_irq_unmask(unsigned int irq) |
191 | { | 188 | { |
192 | ixp4xx_irq_ack(irq); | 189 | if (!(ixp4xx_irq_edge & (1 << irq))) |
193 | ixp4xx_irq_unmask(irq); | 190 | ixp4xx_irq_ack(irq); |
194 | } | ||
195 | 191 | ||
196 | static struct irqchip ixp4xx_irq_level_chip = { | 192 | if (cpu_is_ixp46x() && irq >= 32) |
197 | .ack = ixp4xx_irq_mask, | 193 | *IXP4XX_ICMR2 |= (1 << (irq - 32)); |
198 | .mask = ixp4xx_irq_mask, | 194 | else |
199 | .unmask = ixp4xx_irq_level_unmask, | 195 | *IXP4XX_ICMR |= (1 << irq); |
200 | .set_type = ixp4xx_set_irq_type, | 196 | } |
201 | }; | ||
202 | 197 | ||
203 | static struct irqchip ixp4xx_irq_edge_chip = { | 198 | static struct irqchip ixp4xx_irq_chip = { |
199 | .name = "IXP4xx", | ||
204 | .ack = ixp4xx_irq_ack, | 200 | .ack = ixp4xx_irq_ack, |
205 | .mask = ixp4xx_irq_mask, | 201 | .mask = ixp4xx_irq_mask, |
206 | .unmask = ixp4xx_irq_unmask, | 202 | .unmask = ixp4xx_irq_unmask, |
207 | .set_type = ixp4xx_set_irq_type, | 203 | .set_type = ixp4xx_set_irq_type, |
208 | }; | 204 | }; |
209 | 205 | ||
210 | static void ixp4xx_config_irq(unsigned irq, enum ixp4xx_irq_type type) | ||
211 | { | ||
212 | switch (type) { | ||
213 | case IXP4XX_IRQ_LEVEL: | ||
214 | set_irq_chip(irq, &ixp4xx_irq_level_chip); | ||
215 | set_irq_handler(irq, do_level_IRQ); | ||
216 | break; | ||
217 | case IXP4XX_IRQ_EDGE: | ||
218 | set_irq_chip(irq, &ixp4xx_irq_edge_chip); | ||
219 | set_irq_handler(irq, do_edge_IRQ); | ||
220 | break; | ||
221 | } | ||
222 | set_irq_flags(irq, IRQF_VALID); | ||
223 | } | ||
224 | |||
225 | void __init ixp4xx_init_irq(void) | 206 | void __init ixp4xx_init_irq(void) |
226 | { | 207 | { |
227 | int i = 0; | 208 | int i = 0; |
@@ -241,8 +222,11 @@ void __init ixp4xx_init_irq(void) | |||
241 | } | 222 | } |
242 | 223 | ||
243 | /* Default to all level triggered */ | 224 | /* Default to all level triggered */ |
244 | for(i = 0; i < NR_IRQS; i++) | 225 | for(i = 0; i < NR_IRQS; i++) { |
245 | ixp4xx_config_irq(i, IXP4XX_IRQ_LEVEL); | 226 | set_irq_chip(i, &ixp4xx_irq_chip); |
227 | set_irq_handler(i, do_level_IRQ); | ||
228 | set_irq_flags(i, IRQF_VALID); | ||
229 | } | ||
246 | } | 230 | } |
247 | 231 | ||
248 | 232 | ||
diff --git a/arch/arm/mach-lh7a40x/Kconfig b/arch/arm/mach-lh7a40x/Kconfig index 558a34f53b1c..147b01928a9b 100644 --- a/arch/arm/mach-lh7a40x/Kconfig +++ b/arch/arm/mach-lh7a40x/Kconfig | |||
@@ -14,7 +14,7 @@ config MACH_LPD7A400 | |||
14 | bool "LPD7A400 Card Engine" | 14 | bool "LPD7A400 Card Engine" |
15 | select ARCH_LH7A400 | 15 | select ARCH_LH7A400 |
16 | # select IDE_POLL | 16 | # select IDE_POLL |
17 | select HAS_TOUCHSCREEN_ADS7843_LH7 | 17 | # select HAS_TOUCHSCREEN_ADS7843_LH7 |
18 | help | 18 | help |
19 | Say Y here if you are using Logic Product Development's | 19 | Say Y here if you are using Logic Product Development's |
20 | LPD7A400 CardEngine. For the time being, the LPD7A400 and | 20 | LPD7A400 CardEngine. For the time being, the LPD7A400 and |
@@ -24,7 +24,7 @@ config MACH_LPD7A404 | |||
24 | bool "LPD7A404 Card Engine" | 24 | bool "LPD7A404 Card Engine" |
25 | select ARCH_LH7A404 | 25 | select ARCH_LH7A404 |
26 | # select IDE_POLL | 26 | # select IDE_POLL |
27 | select HAS_TOUCHSCREEN_ADC_LH7 | 27 | # select HAS_TOUCHSCREEN_ADC_LH7 |
28 | help | 28 | help |
29 | Say Y here if you are using Logic Product Development's | 29 | Say Y here if you are using Logic Product Development's |
30 | LPD7A404 CardEngine. For the time being, the LPD7A400 and | 30 | LPD7A404 CardEngine. For the time being, the LPD7A400 and |
diff --git a/arch/arm/mach-pnx4008/core.c b/arch/arm/mach-pnx4008/core.c index 3d73c1e93752..429c796938be 100644 --- a/arch/arm/mach-pnx4008/core.c +++ b/arch/arm/mach-pnx4008/core.c | |||
@@ -133,10 +133,79 @@ static struct platform_device serial_device = { | |||
133 | }, | 133 | }, |
134 | }; | 134 | }; |
135 | 135 | ||
136 | static struct platform_device nand_flash_device = { | ||
137 | .name = "pnx4008-flash", | ||
138 | .id = -1, | ||
139 | .dev = { | ||
140 | .coherent_dma_mask = 0xFFFFFFFF, | ||
141 | }, | ||
142 | }; | ||
143 | |||
144 | /* The dmamask must be set for OHCI to work */ | ||
145 | static u64 ohci_dmamask = ~(u32) 0; | ||
146 | |||
147 | static struct resource ohci_resources[] = { | ||
148 | { | ||
149 | .start = IO_ADDRESS(PNX4008_USB_CONFIG_BASE), | ||
150 | .end = IO_ADDRESS(PNX4008_USB_CONFIG_BASE + 0x100), | ||
151 | .flags = IORESOURCE_MEM, | ||
152 | }, { | ||
153 | .start = USB_HOST_INT, | ||
154 | .flags = IORESOURCE_IRQ, | ||
155 | }, | ||
156 | }; | ||
157 | |||
158 | static struct platform_device ohci_device = { | ||
159 | .name = "pnx4008-usb-ohci", | ||
160 | .id = -1, | ||
161 | .dev = { | ||
162 | .dma_mask = &ohci_dmamask, | ||
163 | .coherent_dma_mask = 0xffffffff, | ||
164 | }, | ||
165 | .num_resources = ARRAY_SIZE(ohci_resources), | ||
166 | .resource = ohci_resources, | ||
167 | }; | ||
168 | |||
169 | static struct platform_device sdum_device = { | ||
170 | .name = "pnx4008-sdum", | ||
171 | .id = 0, | ||
172 | .dev = { | ||
173 | .coherent_dma_mask = 0xffffffff, | ||
174 | }, | ||
175 | }; | ||
176 | |||
177 | static struct platform_device rgbfb_device = { | ||
178 | .name = "pnx4008-rgbfb", | ||
179 | .id = 0, | ||
180 | .dev = { | ||
181 | .coherent_dma_mask = 0xffffffff, | ||
182 | } | ||
183 | }; | ||
184 | |||
185 | struct resource watchdog_resources[] = { | ||
186 | { | ||
187 | .start = PNX4008_WDOG_BASE, | ||
188 | .end = PNX4008_WDOG_BASE + SZ_4K - 1, | ||
189 | .flags = IORESOURCE_MEM, | ||
190 | }, | ||
191 | }; | ||
192 | |||
193 | static struct platform_device watchdog_device = { | ||
194 | .name = "pnx4008-watchdog", | ||
195 | .id = -1, | ||
196 | .num_resources = ARRAY_SIZE(watchdog_resources), | ||
197 | .resource = watchdog_resources, | ||
198 | }; | ||
199 | |||
136 | static struct platform_device *devices[] __initdata = { | 200 | static struct platform_device *devices[] __initdata = { |
137 | &spipnx_1, | 201 | &spipnx_1, |
138 | &spipnx_2, | 202 | &spipnx_2, |
139 | &serial_device, | 203 | &serial_device, |
204 | &ohci_device, | ||
205 | &nand_flash_device, | ||
206 | &sdum_device, | ||
207 | &rgbfb_device, | ||
208 | &watchdog_device, | ||
140 | }; | 209 | }; |
141 | 210 | ||
142 | 211 | ||
diff --git a/arch/arm/mach-s3c2410/gpio.c b/arch/arm/mach-s3c2410/gpio.c index db6393c99860..ba346546150b 100644 --- a/arch/arm/mach-s3c2410/gpio.c +++ b/arch/arm/mach-s3c2410/gpio.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * Copyright (c) 2004-2005 Simtec Electronics | 3 | * Copyright (c) 2004-2005 Simtec Electronics |
4 | * Ben Dooks <ben@simtec.co.uk> | 4 | * Ben Dooks <ben@simtec.co.uk> |
5 | * | 5 | * |
6 | * S3C2410 GPIO support | 6 | * S3C24XX GPIO support |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -163,3 +163,22 @@ unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change) | |||
163 | } | 163 | } |
164 | 164 | ||
165 | EXPORT_SYMBOL(s3c2410_modify_misccr); | 165 | EXPORT_SYMBOL(s3c2410_modify_misccr); |
166 | |||
167 | int s3c2410_gpio_getirq(unsigned int pin) | ||
168 | { | ||
169 | if (pin < S3C2410_GPF0 || pin > S3C2410_GPG15) | ||
170 | return -1; /* not valid interrupts */ | ||
171 | |||
172 | if (pin < S3C2410_GPG0 && pin > S3C2410_GPF7) | ||
173 | return -1; /* not valid pin */ | ||
174 | |||
175 | if (pin < S3C2410_GPF4) | ||
176 | return (pin - S3C2410_GPF0) + IRQ_EINT0; | ||
177 | |||
178 | if (pin < S3C2410_GPG0) | ||
179 | return (pin - S3C2410_GPF4) + IRQ_EINT4; | ||
180 | |||
181 | return (pin - S3C2410_GPG0) + IRQ_EINT8; | ||
182 | } | ||
183 | |||
184 | EXPORT_SYMBOL(s3c2410_gpio_getirq); | ||
diff --git a/arch/arm/mach-s3c2410/s3c2410-gpio.c b/arch/arm/mach-s3c2410/s3c2410-gpio.c index a2098f692d83..ec3a276cc3cf 100644 --- a/arch/arm/mach-s3c2410/s3c2410-gpio.c +++ b/arch/arm/mach-s3c2410/s3c2410-gpio.c | |||
@@ -69,22 +69,3 @@ int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on, | |||
69 | } | 69 | } |
70 | 70 | ||
71 | EXPORT_SYMBOL(s3c2410_gpio_irqfilter); | 71 | EXPORT_SYMBOL(s3c2410_gpio_irqfilter); |
72 | |||
73 | int s3c2410_gpio_getirq(unsigned int pin) | ||
74 | { | ||
75 | if (pin < S3C2410_GPF0 || pin > S3C2410_GPG15) | ||
76 | return -1; /* not valid interrupts */ | ||
77 | |||
78 | if (pin < S3C2410_GPG0 && pin > S3C2410_GPF7) | ||
79 | return -1; /* not valid pin */ | ||
80 | |||
81 | if (pin < S3C2410_GPF4) | ||
82 | return (pin - S3C2410_GPF0) + IRQ_EINT0; | ||
83 | |||
84 | if (pin < S3C2410_GPG0) | ||
85 | return (pin - S3C2410_GPF4) + IRQ_EINT4; | ||
86 | |||
87 | return (pin - S3C2410_GPG0) + IRQ_EINT8; | ||
88 | } | ||
89 | |||
90 | EXPORT_SYMBOL(s3c2410_gpio_getirq); | ||
diff --git a/arch/arm/mach-sa1100/cpu-sa1110.c b/arch/arm/mach-sa1100/cpu-sa1110.c index 90a4130114a6..78f4c1346044 100644 --- a/arch/arm/mach-sa1100/cpu-sa1110.c +++ b/arch/arm/mach-sa1100/cpu-sa1110.c | |||
@@ -83,7 +83,7 @@ static struct sdram_params sdram_tbl[] __initdata = { | |||
83 | .refresh = 64000, | 83 | .refresh = 64000, |
84 | .cas_latency = 3, | 84 | .cas_latency = 3, |
85 | }, { /* Samsung K4S281632B-1H */ | 85 | }, { /* Samsung K4S281632B-1H */ |
86 | .name = "K4S281632b-1H", | 86 | .name = "K4S281632B-1H", |
87 | .rows = 12, | 87 | .rows = 12, |
88 | .tck = 10, | 88 | .tck = 10, |
89 | .trp = 20, | 89 | .trp = 20, |
diff --git a/arch/arm/mm/consistent.c b/arch/arm/mm/consistent.c index 50e6b6bfb2e2..b797217e82be 100644 --- a/arch/arm/mm/consistent.c +++ b/arch/arm/mm/consistent.c | |||
@@ -476,6 +476,9 @@ core_initcall(consistent_init); | |||
476 | 476 | ||
477 | /* | 477 | /* |
478 | * Make an area consistent for devices. | 478 | * Make an area consistent for devices. |
479 | * Note: Drivers should NOT use this function directly, as it will break | ||
480 | * platforms with CONFIG_DMABOUNCE. | ||
481 | * Use the driver DMA support - see dma-mapping.h (dma_sync_*) | ||
479 | */ | 482 | */ |
480 | void consistent_sync(void *vaddr, size_t size, int direction) | 483 | void consistent_sync(void *vaddr, size_t size, int direction) |
481 | { | 484 | { |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 22217fe2650b..b5814b4b6f35 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -32,40 +32,51 @@ extern unsigned long phys_initrd_start; | |||
32 | extern unsigned long phys_initrd_size; | 32 | extern unsigned long phys_initrd_size; |
33 | 33 | ||
34 | /* | 34 | /* |
35 | * The sole use of this is to pass memory configuration | 35 | * This is used to pass memory configuration data from paging_init |
36 | * data from paging_init to mem_init. | 36 | * to mem_init, and by show_mem() to skip holes in the memory map. |
37 | */ | 37 | */ |
38 | static struct meminfo meminfo __initdata = { 0, }; | 38 | static struct meminfo meminfo = { 0, }; |
39 | |||
40 | #define for_each_nodebank(iter,mi,no) \ | ||
41 | for (iter = 0; iter < mi->nr_banks; iter++) \ | ||
42 | if (mi->bank[iter].node == no) | ||
39 | 43 | ||
40 | void show_mem(void) | 44 | void show_mem(void) |
41 | { | 45 | { |
42 | int free = 0, total = 0, reserved = 0; | 46 | int free = 0, total = 0, reserved = 0; |
43 | int shared = 0, cached = 0, slab = 0, node; | 47 | int shared = 0, cached = 0, slab = 0, node, i; |
48 | struct meminfo * mi = &meminfo; | ||
44 | 49 | ||
45 | printk("Mem-info:\n"); | 50 | printk("Mem-info:\n"); |
46 | show_free_areas(); | 51 | show_free_areas(); |
47 | printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); | 52 | printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); |
48 | 53 | ||
49 | for_each_online_node(node) { | 54 | for_each_online_node(node) { |
50 | struct page *page, *end; | 55 | for_each_nodebank (i,mi,node) { |
51 | 56 | unsigned int pfn1, pfn2; | |
52 | page = NODE_MEM_MAP(node); | 57 | struct page *page, *end; |
53 | end = page + NODE_DATA(node)->node_spanned_pages; | 58 | |
54 | 59 | pfn1 = mi->bank[i].start >> PAGE_SHIFT; | |
55 | do { | 60 | pfn2 = (mi->bank[i].size + mi->bank[i].start) >> PAGE_SHIFT; |
56 | total++; | 61 | |
57 | if (PageReserved(page)) | 62 | page = NODE_MEM_MAP(node) + pfn1; |
58 | reserved++; | 63 | end = NODE_MEM_MAP(node) + pfn2; |
59 | else if (PageSwapCache(page)) | 64 | |
60 | cached++; | 65 | do { |
61 | else if (PageSlab(page)) | 66 | total++; |
62 | slab++; | 67 | if (PageReserved(page)) |
63 | else if (!page_count(page)) | 68 | reserved++; |
64 | free++; | 69 | else if (PageSwapCache(page)) |
65 | else | 70 | cached++; |
66 | shared += page_count(page) - 1; | 71 | else if (PageSlab(page)) |
67 | page++; | 72 | slab++; |
68 | } while (page < end); | 73 | else if (!page_count(page)) |
74 | free++; | ||
75 | else | ||
76 | shared += page_count(page) - 1; | ||
77 | page++; | ||
78 | } while (page < end); | ||
79 | } | ||
69 | } | 80 | } |
70 | 81 | ||
71 | printk("%d pages of RAM\n", total); | 82 | printk("%d pages of RAM\n", total); |
@@ -76,10 +87,6 @@ void show_mem(void) | |||
76 | printk("%d pages swap cached\n", cached); | 87 | printk("%d pages swap cached\n", cached); |
77 | } | 88 | } |
78 | 89 | ||
79 | #define for_each_nodebank(iter,mi,no) \ | ||
80 | for (iter = 0; iter < mi->nr_banks; iter++) \ | ||
81 | if (mi->bank[iter].node == no) | ||
82 | |||
83 | /* | 90 | /* |
84 | * FIXME: We really want to avoid allocating the bootmap bitmap | 91 | * FIXME: We really want to avoid allocating the bootmap bitmap |
85 | * over the top of the initrd. Hopefully, this is located towards | 92 | * over the top of the initrd. Hopefully, this is located towards |
diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S index e8b377d637f6..2749c1f88d7d 100644 --- a/arch/arm/mm/proc-xscale.S +++ b/arch/arm/mm/proc-xscale.S | |||
@@ -909,7 +909,7 @@ __pxa270_proc_info: | |||
909 | b __xscale_setup | 909 | b __xscale_setup |
910 | .long cpu_arch_name | 910 | .long cpu_arch_name |
911 | .long cpu_elf_name | 911 | .long cpu_elf_name |
912 | .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP | 912 | .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_IWMMXT |
913 | .long cpu_pxa270_name | 913 | .long cpu_pxa270_name |
914 | .long xscale_processor_functions | 914 | .long xscale_processor_functions |
915 | .long v4wbi_tlb_fns | 915 | .long v4wbi_tlb_fns |
diff --git a/arch/arm/oprofile/op_counter.h b/arch/arm/oprofile/op_counter.h index 8c5351d751cf..ca942a63b52f 100644 --- a/arch/arm/oprofile/op_counter.h +++ b/arch/arm/oprofile/op_counter.h | |||
@@ -10,8 +10,6 @@ | |||
10 | #ifndef OP_COUNTER_H | 10 | #ifndef OP_COUNTER_H |
11 | #define OP_COUNTER_H | 11 | #define OP_COUNTER_H |
12 | 12 | ||
13 | #define OP_MAX_COUNTER 5 | ||
14 | |||
15 | /* Per performance monitor configuration as set via | 13 | /* Per performance monitor configuration as set via |
16 | * oprofilefs. | 14 | * oprofilefs. |
17 | */ | 15 | */ |
diff --git a/arch/arm/vfp/vfpdouble.c b/arch/arm/vfp/vfpdouble.c index 4fc05ee0a2ef..e44b9ed0f81f 100644 --- a/arch/arm/vfp/vfpdouble.c +++ b/arch/arm/vfp/vfpdouble.c | |||
@@ -56,7 +56,7 @@ static void vfp_double_normalise_denormal(struct vfp_double *vd) | |||
56 | { | 56 | { |
57 | int bits = 31 - fls(vd->significand >> 32); | 57 | int bits = 31 - fls(vd->significand >> 32); |
58 | if (bits == 31) | 58 | if (bits == 31) |
59 | bits = 62 - fls(vd->significand); | 59 | bits = 63 - fls(vd->significand); |
60 | 60 | ||
61 | vfp_double_dump("normalise_denormal: in", vd); | 61 | vfp_double_dump("normalise_denormal: in", vd); |
62 | 62 | ||
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c index a657a28f08db..f08eafbddcc1 100644 --- a/arch/arm/vfp/vfpmodule.c +++ b/arch/arm/vfp/vfpmodule.c | |||
@@ -148,6 +148,7 @@ static void vfp_raise_exceptions(u32 exceptions, u32 inst, u32 fpscr, struct pt_ | |||
148 | /* | 148 | /* |
149 | * These are arranged in priority order, least to highest. | 149 | * These are arranged in priority order, least to highest. |
150 | */ | 150 | */ |
151 | RAISE(FPSCR_DZC, FPSCR_DZE, FPE_FLTDIV); | ||
151 | RAISE(FPSCR_IXC, FPSCR_IXE, FPE_FLTRES); | 152 | RAISE(FPSCR_IXC, FPSCR_IXE, FPE_FLTRES); |
152 | RAISE(FPSCR_UFC, FPSCR_UFE, FPE_FLTUND); | 153 | RAISE(FPSCR_UFC, FPSCR_UFE, FPE_FLTUND); |
153 | RAISE(FPSCR_OFC, FPSCR_OFE, FPE_FLTOVF); | 154 | RAISE(FPSCR_OFC, FPSCR_OFE, FPE_FLTOVF); |
diff --git a/arch/avr32/Makefile b/arch/avr32/Makefile index cefc95a73980..7b842e98efed 100644 --- a/arch/avr32/Makefile +++ b/arch/avr32/Makefile | |||
@@ -7,7 +7,7 @@ | |||
7 | 7 | ||
8 | # Default target when executing plain make | 8 | # Default target when executing plain make |
9 | .PHONY: all | 9 | .PHONY: all |
10 | all: uImage vmlinux.elf linux.lst | 10 | all: uImage vmlinux.elf |
11 | 11 | ||
12 | KBUILD_DEFCONFIG := atstk1002_defconfig | 12 | KBUILD_DEFCONFIG := atstk1002_defconfig |
13 | 13 | ||
@@ -21,9 +21,7 @@ cpuflags-$(CONFIG_CPU_AP7000) += -mcpu=ap7000 | |||
21 | CFLAGS += $(cpuflags-y) | 21 | CFLAGS += $(cpuflags-y) |
22 | AFLAGS += $(cpuflags-y) | 22 | AFLAGS += $(cpuflags-y) |
23 | 23 | ||
24 | CHECKFLAGS += -D__avr32__ | 24 | CHECKFLAGS += -D__avr32__ -D__BIG_ENDIAN |
25 | |||
26 | LIBGCC := $(shell $(CC) $(CFLAGS) -print-libgcc-file-name) | ||
27 | 25 | ||
28 | head-$(CONFIG_LOADER_U_BOOT) += arch/avr32/boot/u-boot/head.o | 26 | head-$(CONFIG_LOADER_U_BOOT) += arch/avr32/boot/u-boot/head.o |
29 | head-y += arch/avr32/kernel/head.o | 27 | head-y += arch/avr32/kernel/head.o |
@@ -32,7 +30,7 @@ core-$(CONFIG_BOARD_ATSTK1000) += arch/avr32/boards/atstk1000/ | |||
32 | core-$(CONFIG_LOADER_U_BOOT) += arch/avr32/boot/u-boot/ | 30 | core-$(CONFIG_LOADER_U_BOOT) += arch/avr32/boot/u-boot/ |
33 | core-y += arch/avr32/kernel/ | 31 | core-y += arch/avr32/kernel/ |
34 | core-y += arch/avr32/mm/ | 32 | core-y += arch/avr32/mm/ |
35 | libs-y += arch/avr32/lib/ #$(LIBGCC) | 33 | libs-y += arch/avr32/lib/ |
36 | 34 | ||
37 | archincdir-$(CONFIG_PLATFORM_AT32AP) := arch-at32ap | 35 | archincdir-$(CONFIG_PLATFORM_AT32AP) := arch-at32ap |
38 | 36 | ||
@@ -48,6 +46,8 @@ endif | |||
48 | 46 | ||
49 | archprepare: include/asm-avr32/.arch | 47 | archprepare: include/asm-avr32/.arch |
50 | 48 | ||
49 | CLEAN_FILES += include/asm-avr32/.arch include/asm-avr32/arch | ||
50 | |||
51 | BOOT_TARGETS := vmlinux.elf vmlinux.bin uImage uImage.srec | 51 | BOOT_TARGETS := vmlinux.elf vmlinux.bin uImage uImage.srec |
52 | 52 | ||
53 | .PHONY: $(BOOT_TARGETS) install | 53 | .PHONY: $(BOOT_TARGETS) install |
@@ -71,14 +71,19 @@ vmlinux.elf vmlinux.bin uImage.srec uImage vmlinux.cso: vmlinux | |||
71 | install: vmlinux | 71 | install: vmlinux |
72 | $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@ | 72 | $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@ |
73 | 73 | ||
74 | linux.s: vmlinux | 74 | vmlinux.s: vmlinux |
75 | $(call if_changed,disasm) | 75 | $(call if_changed,disasm) |
76 | 76 | ||
77 | linux.lst: vmlinux | 77 | vmlinux.lst: vmlinux |
78 | $(call if_changed,listing) | 78 | $(call if_changed,listing) |
79 | 79 | ||
80 | CLEAN_FILES += vmlinux.s vmlinux.lst | ||
81 | |||
82 | archclean: | ||
83 | $(Q)$(MAKE) $(clean)=$(boot) | ||
84 | |||
80 | define archhelp | 85 | define archhelp |
81 | @echo '* vmlinux.elf - ELF image with load address 0' | 86 | @echo '* vmlinux.elf - ELF image with load address 0' |
82 | @echo ' vmlinux.cso - PathFinder CSO image' | 87 | @echo ' vmlinux.cso - PathFinder CSO image' |
83 | @echo ' uImage - Create a bootable image for U-Boot' | 88 | @echo '* uImage - Create a bootable image for U-Boot' |
84 | endef | 89 | endef |
diff --git a/arch/avr32/boards/atstk1000/setup.c b/arch/avr32/boards/atstk1000/setup.c index 191ab85de9a3..272c011802a7 100644 --- a/arch/avr32/boards/atstk1000/setup.c +++ b/arch/avr32/boards/atstk1000/setup.c | |||
@@ -21,15 +21,6 @@ struct tag *bootloader_tags __initdata; | |||
21 | 21 | ||
22 | struct lcdc_platform_data __initdata atstk1000_fb0_data; | 22 | struct lcdc_platform_data __initdata atstk1000_fb0_data; |
23 | 23 | ||
24 | asmlinkage void __init board_early_init(void) | ||
25 | { | ||
26 | extern void sdram_init(void); | ||
27 | |||
28 | #ifdef CONFIG_LOADER_STANDALONE | ||
29 | sdram_init(); | ||
30 | #endif | ||
31 | } | ||
32 | |||
33 | void __init board_setup_fbmem(unsigned long fbmem_start, | 24 | void __init board_setup_fbmem(unsigned long fbmem_start, |
34 | unsigned long fbmem_size) | 25 | unsigned long fbmem_size) |
35 | { | 26 | { |
diff --git a/arch/avr32/boot/images/Makefile b/arch/avr32/boot/images/Makefile index ccd74eeecec3..219720a47bf9 100644 --- a/arch/avr32/boot/images/Makefile +++ b/arch/avr32/boot/images/Makefile | |||
@@ -37,14 +37,12 @@ OBJCOPYFLAGS_vmlinux.elf := --change-section-lma .text-0x80000000 \ | |||
37 | --change-section-lma .data-0x80000000 \ | 37 | --change-section-lma .data-0x80000000 \ |
38 | --change-section-lma .init-0x80000000 \ | 38 | --change-section-lma .init-0x80000000 \ |
39 | --change-section-lma .bss-0x80000000 \ | 39 | --change-section-lma .bss-0x80000000 \ |
40 | --change-section-lma .initrd-0x80000000 \ | ||
41 | --change-section-lma __param-0x80000000 \ | 40 | --change-section-lma __param-0x80000000 \ |
42 | --change-section-lma __ksymtab-0x80000000 \ | 41 | --change-section-lma __ksymtab-0x80000000 \ |
43 | --change-section-lma __ksymtab_gpl-0x80000000 \ | 42 | --change-section-lma __ksymtab_gpl-0x80000000 \ |
44 | --change-section-lma __kcrctab-0x80000000 \ | 43 | --change-section-lma __kcrctab-0x80000000 \ |
45 | --change-section-lma __kcrctab_gpl-0x80000000 \ | 44 | --change-section-lma __kcrctab_gpl-0x80000000 \ |
46 | --change-section-lma __ksymtab_strings-0x80000000 \ | 45 | --change-section-lma __ksymtab_strings-0x80000000 \ |
47 | --change-section-lma .got-0x80000000 \ | ||
48 | --set-start 0xa0000000 | 46 | --set-start 0xa0000000 |
49 | $(obj)/vmlinux.elf: vmlinux FORCE | 47 | $(obj)/vmlinux.elf: vmlinux FORCE |
50 | $(call if_changed,objcopy) | 48 | $(call if_changed,objcopy) |
@@ -59,4 +57,4 @@ install: $(BOOTIMAGE) | |||
59 | sh $(srctree)/install-kernel.sh $< | 57 | sh $(srctree)/install-kernel.sh $< |
60 | 58 | ||
61 | # Generated files to be removed upon make clean | 59 | # Generated files to be removed upon make clean |
62 | clean-files := vmlinux* uImage uImage.srec | 60 | clean-files := vmlinux.elf vmlinux.bin vmlinux.gz uImage uImage.srec |
diff --git a/arch/avr32/configs/atstk1002_defconfig b/arch/avr32/configs/atstk1002_defconfig index 6c2c5e00dfc7..ae92a14ef9a0 100644 --- a/arch/avr32/configs/atstk1002_defconfig +++ b/arch/avr32/configs/atstk1002_defconfig | |||
@@ -1,13 +1,14 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.18-rc1 | 3 | # Linux kernel version: 2.6.19-rc2 |
4 | # Tue Jul 11 12:41:36 2006 | 4 | # Fri Oct 20 11:52:37 2006 |
5 | # | 5 | # |
6 | CONFIG_AVR32=y | 6 | CONFIG_AVR32=y |
7 | CONFIG_GENERIC_HARDIRQS=y | 7 | CONFIG_GENERIC_HARDIRQS=y |
8 | CONFIG_HARDIRQS_SW_RESEND=y | 8 | CONFIG_HARDIRQS_SW_RESEND=y |
9 | CONFIG_GENERIC_IRQ_PROBE=y | 9 | CONFIG_GENERIC_IRQ_PROBE=y |
10 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | 10 | CONFIG_RWSEM_GENERIC_SPINLOCK=y |
11 | CONFIG_GENERIC_TIME=y | ||
11 | CONFIG_GENERIC_HWEIGHT=y | 12 | CONFIG_GENERIC_HWEIGHT=y |
12 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 13 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
13 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 14 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
@@ -25,16 +26,23 @@ CONFIG_INIT_ENV_ARG_LIMIT=32 | |||
25 | CONFIG_LOCALVERSION="" | 26 | CONFIG_LOCALVERSION="" |
26 | # CONFIG_LOCALVERSION_AUTO is not set | 27 | # CONFIG_LOCALVERSION_AUTO is not set |
27 | CONFIG_SWAP=y | 28 | CONFIG_SWAP=y |
28 | # CONFIG_SYSVIPC is not set | 29 | CONFIG_SYSVIPC=y |
29 | # CONFIG_POSIX_MQUEUE is not set | 30 | # CONFIG_IPC_NS is not set |
30 | # CONFIG_BSD_PROCESS_ACCT is not set | 31 | CONFIG_POSIX_MQUEUE=y |
31 | CONFIG_SYSCTL=y | 32 | CONFIG_BSD_PROCESS_ACCT=y |
32 | # CONFIG_AUDIT is not set | 33 | CONFIG_BSD_PROCESS_ACCT_V3=y |
34 | CONFIG_TASKSTATS=y | ||
35 | CONFIG_TASK_DELAY_ACCT=y | ||
36 | # CONFIG_UTS_NS is not set | ||
37 | CONFIG_AUDIT=y | ||
33 | # CONFIG_IKCONFIG is not set | 38 | # CONFIG_IKCONFIG is not set |
34 | # CONFIG_RELAY is not set | 39 | CONFIG_RELAY=y |
35 | CONFIG_INITRAMFS_SOURCE="" | 40 | CONFIG_INITRAMFS_SOURCE="" |
36 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 41 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
42 | # CONFIG_TASK_XACCT is not set | ||
43 | CONFIG_SYSCTL=y | ||
37 | CONFIG_EMBEDDED=y | 44 | CONFIG_EMBEDDED=y |
45 | # CONFIG_SYSCTL_SYSCALL is not set | ||
38 | CONFIG_KALLSYMS=y | 46 | CONFIG_KALLSYMS=y |
39 | # CONFIG_KALLSYMS_ALL is not set | 47 | # CONFIG_KALLSYMS_ALL is not set |
40 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | 48 | # CONFIG_KALLSYMS_EXTRA_PASS is not set |
@@ -43,14 +51,15 @@ CONFIG_PRINTK=y | |||
43 | CONFIG_BUG=y | 51 | CONFIG_BUG=y |
44 | CONFIG_ELF_CORE=y | 52 | CONFIG_ELF_CORE=y |
45 | # CONFIG_BASE_FULL is not set | 53 | # CONFIG_BASE_FULL is not set |
46 | # CONFIG_FUTEX is not set | 54 | CONFIG_FUTEX=y |
47 | # CONFIG_EPOLL is not set | 55 | CONFIG_EPOLL=y |
48 | CONFIG_SHMEM=y | 56 | CONFIG_SHMEM=y |
49 | # CONFIG_SLAB is not set | 57 | CONFIG_SLAB=y |
50 | # CONFIG_VM_EVENT_COUNTERS is not set | 58 | CONFIG_VM_EVENT_COUNTERS=y |
59 | CONFIG_RT_MUTEXES=y | ||
51 | # CONFIG_TINY_SHMEM is not set | 60 | # CONFIG_TINY_SHMEM is not set |
52 | CONFIG_BASE_SMALL=1 | 61 | CONFIG_BASE_SMALL=1 |
53 | CONFIG_SLOB=y | 62 | # CONFIG_SLOB is not set |
54 | 63 | ||
55 | # | 64 | # |
56 | # Loadable module support | 65 | # Loadable module support |
@@ -65,6 +74,7 @@ CONFIG_MODULE_UNLOAD=y | |||
65 | # | 74 | # |
66 | # Block layer | 75 | # Block layer |
67 | # | 76 | # |
77 | CONFIG_BLOCK=y | ||
68 | # CONFIG_BLK_DEV_IO_TRACE is not set | 78 | # CONFIG_BLK_DEV_IO_TRACE is not set |
69 | 79 | ||
70 | # | 80 | # |
@@ -166,10 +176,12 @@ CONFIG_IP_PNP_DHCP=y | |||
166 | # CONFIG_INET_TUNNEL is not set | 176 | # CONFIG_INET_TUNNEL is not set |
167 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | 177 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set |
168 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | 178 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set |
179 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
169 | CONFIG_INET_DIAG=y | 180 | CONFIG_INET_DIAG=y |
170 | CONFIG_INET_TCP_DIAG=y | 181 | CONFIG_INET_TCP_DIAG=y |
171 | # CONFIG_TCP_CONG_ADVANCED is not set | 182 | # CONFIG_TCP_CONG_ADVANCED is not set |
172 | CONFIG_TCP_CONG_BIC=y | 183 | CONFIG_TCP_CONG_CUBIC=y |
184 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
173 | # CONFIG_IPV6 is not set | 185 | # CONFIG_IPV6 is not set |
174 | # CONFIG_INET6_XFRM_TUNNEL is not set | 186 | # CONFIG_INET6_XFRM_TUNNEL is not set |
175 | # CONFIG_INET6_TUNNEL is not set | 187 | # CONFIG_INET6_TUNNEL is not set |
@@ -199,7 +211,6 @@ CONFIG_TCP_CONG_BIC=y | |||
199 | # CONFIG_ATALK is not set | 211 | # CONFIG_ATALK is not set |
200 | # CONFIG_X25 is not set | 212 | # CONFIG_X25 is not set |
201 | # CONFIG_LAPB is not set | 213 | # CONFIG_LAPB is not set |
202 | # CONFIG_NET_DIVERT is not set | ||
203 | # CONFIG_ECONET is not set | 214 | # CONFIG_ECONET is not set |
204 | # CONFIG_WAN_ROUTER is not set | 215 | # CONFIG_WAN_ROUTER is not set |
205 | 216 | ||
@@ -212,7 +223,6 @@ CONFIG_TCP_CONG_BIC=y | |||
212 | # Network testing | 223 | # Network testing |
213 | # | 224 | # |
214 | # CONFIG_NET_PKTGEN is not set | 225 | # CONFIG_NET_PKTGEN is not set |
215 | # CONFIG_NET_TCPPROBE is not set | ||
216 | # CONFIG_HAMRADIO is not set | 226 | # CONFIG_HAMRADIO is not set |
217 | # CONFIG_IRDA is not set | 227 | # CONFIG_IRDA is not set |
218 | # CONFIG_BT is not set | 228 | # CONFIG_BT is not set |
@@ -239,7 +249,84 @@ CONFIG_STANDALONE=y | |||
239 | # | 249 | # |
240 | # Memory Technology Devices (MTD) | 250 | # Memory Technology Devices (MTD) |
241 | # | 251 | # |
242 | # CONFIG_MTD is not set | 252 | CONFIG_MTD=y |
253 | # CONFIG_MTD_DEBUG is not set | ||
254 | # CONFIG_MTD_CONCAT is not set | ||
255 | CONFIG_MTD_PARTITIONS=y | ||
256 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
257 | CONFIG_MTD_CMDLINE_PARTS=y | ||
258 | |||
259 | # | ||
260 | # User Modules And Translation Layers | ||
261 | # | ||
262 | CONFIG_MTD_CHAR=y | ||
263 | CONFIG_MTD_BLOCK=y | ||
264 | # CONFIG_FTL is not set | ||
265 | # CONFIG_NFTL is not set | ||
266 | # CONFIG_INFTL is not set | ||
267 | # CONFIG_RFD_FTL is not set | ||
268 | # CONFIG_SSFDC is not set | ||
269 | |||
270 | # | ||
271 | # RAM/ROM/Flash chip drivers | ||
272 | # | ||
273 | CONFIG_MTD_CFI=y | ||
274 | # CONFIG_MTD_JEDECPROBE is not set | ||
275 | CONFIG_MTD_GEN_PROBE=y | ||
276 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
277 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
278 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
279 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
280 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
281 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
282 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
283 | CONFIG_MTD_CFI_I1=y | ||
284 | CONFIG_MTD_CFI_I2=y | ||
285 | # CONFIG_MTD_CFI_I4 is not set | ||
286 | # CONFIG_MTD_CFI_I8 is not set | ||
287 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
288 | CONFIG_MTD_CFI_AMDSTD=y | ||
289 | # CONFIG_MTD_CFI_STAA is not set | ||
290 | CONFIG_MTD_CFI_UTIL=y | ||
291 | # CONFIG_MTD_RAM is not set | ||
292 | # CONFIG_MTD_ROM is not set | ||
293 | # CONFIG_MTD_ABSENT is not set | ||
294 | # CONFIG_MTD_OBSOLETE_CHIPS is not set | ||
295 | |||
296 | # | ||
297 | # Mapping drivers for chip access | ||
298 | # | ||
299 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
300 | CONFIG_MTD_PHYSMAP=y | ||
301 | CONFIG_MTD_PHYSMAP_START=0x8000000 | ||
302 | CONFIG_MTD_PHYSMAP_LEN=0x0 | ||
303 | CONFIG_MTD_PHYSMAP_BANKWIDTH=2 | ||
304 | # CONFIG_MTD_PLATRAM is not set | ||
305 | |||
306 | # | ||
307 | # Self-contained MTD device drivers | ||
308 | # | ||
309 | # CONFIG_MTD_SLRAM is not set | ||
310 | # CONFIG_MTD_PHRAM is not set | ||
311 | # CONFIG_MTD_MTDRAM is not set | ||
312 | # CONFIG_MTD_BLOCK2MTD is not set | ||
313 | |||
314 | # | ||
315 | # Disk-On-Chip Device Drivers | ||
316 | # | ||
317 | # CONFIG_MTD_DOC2000 is not set | ||
318 | # CONFIG_MTD_DOC2001 is not set | ||
319 | # CONFIG_MTD_DOC2001PLUS is not set | ||
320 | |||
321 | # | ||
322 | # NAND Flash Device Drivers | ||
323 | # | ||
324 | # CONFIG_MTD_NAND is not set | ||
325 | |||
326 | # | ||
327 | # OneNAND Flash Device Drivers | ||
328 | # | ||
329 | # CONFIG_MTD_ONENAND is not set | ||
243 | 330 | ||
244 | # | 331 | # |
245 | # Parallel port support | 332 | # Parallel port support |
@@ -260,11 +347,18 @@ CONFIG_BLK_DEV_NBD=m | |||
260 | CONFIG_BLK_DEV_RAM=m | 347 | CONFIG_BLK_DEV_RAM=m |
261 | CONFIG_BLK_DEV_RAM_COUNT=16 | 348 | CONFIG_BLK_DEV_RAM_COUNT=16 |
262 | CONFIG_BLK_DEV_RAM_SIZE=4096 | 349 | CONFIG_BLK_DEV_RAM_SIZE=4096 |
350 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
263 | CONFIG_BLK_DEV_INITRD=y | 351 | CONFIG_BLK_DEV_INITRD=y |
264 | # CONFIG_CDROM_PKTCDVD is not set | 352 | # CONFIG_CDROM_PKTCDVD is not set |
265 | # CONFIG_ATA_OVER_ETH is not set | 353 | # CONFIG_ATA_OVER_ETH is not set |
266 | 354 | ||
267 | # | 355 | # |
356 | # Misc devices | ||
357 | # | ||
358 | # CONFIG_SGI_IOC4 is not set | ||
359 | # CONFIG_TIFM_CORE is not set | ||
360 | |||
361 | # | ||
268 | # ATA/ATAPI/MFM/RLL support | 362 | # ATA/ATAPI/MFM/RLL support |
269 | # | 363 | # |
270 | # CONFIG_IDE is not set | 364 | # CONFIG_IDE is not set |
@@ -274,6 +368,12 @@ CONFIG_BLK_DEV_INITRD=y | |||
274 | # | 368 | # |
275 | # CONFIG_RAID_ATTRS is not set | 369 | # CONFIG_RAID_ATTRS is not set |
276 | # CONFIG_SCSI is not set | 370 | # CONFIG_SCSI is not set |
371 | # CONFIG_SCSI_NETLINK is not set | ||
372 | |||
373 | # | ||
374 | # Serial ATA (prod) and Parallel ATA (experimental) drivers | ||
375 | # | ||
376 | # CONFIG_ATA is not set | ||
277 | 377 | ||
278 | # | 378 | # |
279 | # Multi-device support (RAID and LVM) | 379 | # Multi-device support (RAID and LVM) |
@@ -305,14 +405,11 @@ CONFIG_TUN=m | |||
305 | # | 405 | # |
306 | # PHY device support | 406 | # PHY device support |
307 | # | 407 | # |
308 | # CONFIG_PHYLIB is not set | ||
309 | 408 | ||
310 | # | 409 | # |
311 | # Ethernet (10 or 100Mbit) | 410 | # Ethernet (10 or 100Mbit) |
312 | # | 411 | # |
313 | CONFIG_NET_ETHERNET=y | 412 | # CONFIG_NET_ETHERNET is not set |
314 | CONFIG_MII=y | ||
315 | CONFIG_MACB=y | ||
316 | 413 | ||
317 | # | 414 | # |
318 | # Ethernet (1000 Mbit) | 415 | # Ethernet (1000 Mbit) |
@@ -341,10 +438,11 @@ CONFIG_PPP=m | |||
341 | CONFIG_PPP_ASYNC=m | 438 | CONFIG_PPP_ASYNC=m |
342 | # CONFIG_PPP_SYNC_TTY is not set | 439 | # CONFIG_PPP_SYNC_TTY is not set |
343 | CONFIG_PPP_DEFLATE=m | 440 | CONFIG_PPP_DEFLATE=m |
344 | # CONFIG_PPP_BSDCOMP is not set | 441 | CONFIG_PPP_BSDCOMP=m |
345 | # CONFIG_PPP_MPPE is not set | 442 | # CONFIG_PPP_MPPE is not set |
346 | # CONFIG_PPPOE is not set | 443 | # CONFIG_PPPOE is not set |
347 | # CONFIG_SLIP is not set | 444 | # CONFIG_SLIP is not set |
445 | CONFIG_SLHC=m | ||
348 | # CONFIG_SHAPER is not set | 446 | # CONFIG_SHAPER is not set |
349 | # CONFIG_NETCONSOLE is not set | 447 | # CONFIG_NETCONSOLE is not set |
350 | # CONFIG_NETPOLL is not set | 448 | # CONFIG_NETPOLL is not set |
@@ -417,7 +515,6 @@ CONFIG_UNIX98_PTYS=y | |||
417 | # TPM devices | 515 | # TPM devices |
418 | # | 516 | # |
419 | # CONFIG_TCG_TPM is not set | 517 | # CONFIG_TCG_TPM is not set |
420 | # CONFIG_TELCLOCK is not set | ||
421 | 518 | ||
422 | # | 519 | # |
423 | # I2C support | 520 | # I2C support |
@@ -427,23 +524,13 @@ CONFIG_UNIX98_PTYS=y | |||
427 | # | 524 | # |
428 | # SPI support | 525 | # SPI support |
429 | # | 526 | # |
430 | CONFIG_SPI=y | 527 | # CONFIG_SPI is not set |
431 | # CONFIG_SPI_DEBUG is not set | 528 | # CONFIG_SPI_MASTER is not set |
432 | CONFIG_SPI_MASTER=y | ||
433 | |||
434 | # | ||
435 | # SPI Master Controller Drivers | ||
436 | # | ||
437 | CONFIG_SPI_ATMEL=m | ||
438 | # CONFIG_SPI_BITBANG is not set | ||
439 | |||
440 | # | ||
441 | # SPI Protocol Masters | ||
442 | # | ||
443 | 529 | ||
444 | # | 530 | # |
445 | # Dallas's 1-wire bus | 531 | # Dallas's 1-wire bus |
446 | # | 532 | # |
533 | # CONFIG_W1 is not set | ||
447 | 534 | ||
448 | # | 535 | # |
449 | # Hardware Monitoring support | 536 | # Hardware Monitoring support |
@@ -452,14 +539,9 @@ CONFIG_SPI_ATMEL=m | |||
452 | # CONFIG_HWMON_VID is not set | 539 | # CONFIG_HWMON_VID is not set |
453 | 540 | ||
454 | # | 541 | # |
455 | # Misc devices | ||
456 | # | ||
457 | |||
458 | # | ||
459 | # Multimedia devices | 542 | # Multimedia devices |
460 | # | 543 | # |
461 | # CONFIG_VIDEO_DEV is not set | 544 | # CONFIG_VIDEO_DEV is not set |
462 | CONFIG_VIDEO_V4L2=y | ||
463 | 545 | ||
464 | # | 546 | # |
465 | # Digital Video Broadcasting Devices | 547 | # Digital Video Broadcasting Devices |
@@ -470,28 +552,8 @@ CONFIG_VIDEO_V4L2=y | |||
470 | # Graphics support | 552 | # Graphics support |
471 | # | 553 | # |
472 | # CONFIG_FIRMWARE_EDID is not set | 554 | # CONFIG_FIRMWARE_EDID is not set |
473 | CONFIG_FB=m | 555 | # CONFIG_FB is not set |
474 | CONFIG_FB_CFB_FILLRECT=m | 556 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
475 | CONFIG_FB_CFB_COPYAREA=m | ||
476 | CONFIG_FB_CFB_IMAGEBLIT=m | ||
477 | # CONFIG_FB_MACMODES is not set | ||
478 | # CONFIG_FB_BACKLIGHT is not set | ||
479 | # CONFIG_FB_MODE_HELPERS is not set | ||
480 | # CONFIG_FB_TILEBLITTING is not set | ||
481 | CONFIG_FB_SIDSA=m | ||
482 | CONFIG_FB_SIDSA_DEFAULT_BPP=24 | ||
483 | # CONFIG_FB_S1D13XXX is not set | ||
484 | # CONFIG_FB_VIRTUAL is not set | ||
485 | |||
486 | # | ||
487 | # Logo configuration | ||
488 | # | ||
489 | # CONFIG_LOGO is not set | ||
490 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
491 | # CONFIG_BACKLIGHT_CLASS_DEVICE is not set | ||
492 | CONFIG_LCD_CLASS_DEVICE=m | ||
493 | CONFIG_LCD_DEVICE=y | ||
494 | CONFIG_LCD_LTV350QV=m | ||
495 | 557 | ||
496 | # | 558 | # |
497 | # Sound | 559 | # Sound |
@@ -561,18 +623,21 @@ CONFIG_LCD_LTV350QV=m | |||
561 | # | 623 | # |
562 | # File systems | 624 | # File systems |
563 | # | 625 | # |
564 | CONFIG_EXT2_FS=y | 626 | CONFIG_EXT2_FS=m |
565 | # CONFIG_EXT2_FS_XATTR is not set | 627 | # CONFIG_EXT2_FS_XATTR is not set |
566 | # CONFIG_EXT2_FS_XIP is not set | 628 | # CONFIG_EXT2_FS_XIP is not set |
567 | # CONFIG_EXT3_FS is not set | 629 | # CONFIG_EXT3_FS is not set |
630 | # CONFIG_EXT4DEV_FS is not set | ||
568 | # CONFIG_REISERFS_FS is not set | 631 | # CONFIG_REISERFS_FS is not set |
569 | # CONFIG_JFS_FS is not set | 632 | # CONFIG_JFS_FS is not set |
570 | # CONFIG_FS_POSIX_ACL is not set | 633 | # CONFIG_FS_POSIX_ACL is not set |
571 | # CONFIG_XFS_FS is not set | 634 | # CONFIG_XFS_FS is not set |
635 | # CONFIG_GFS2_FS is not set | ||
572 | # CONFIG_OCFS2_FS is not set | 636 | # CONFIG_OCFS2_FS is not set |
573 | CONFIG_MINIX_FS=m | 637 | CONFIG_MINIX_FS=m |
574 | CONFIG_ROMFS_FS=m | 638 | # CONFIG_ROMFS_FS is not set |
575 | # CONFIG_INOTIFY is not set | 639 | CONFIG_INOTIFY=y |
640 | CONFIG_INOTIFY_USER=y | ||
576 | # CONFIG_QUOTA is not set | 641 | # CONFIG_QUOTA is not set |
577 | # CONFIG_DNOTIFY is not set | 642 | # CONFIG_DNOTIFY is not set |
578 | # CONFIG_AUTOFS_FS is not set | 643 | # CONFIG_AUTOFS_FS is not set |
@@ -600,8 +665,10 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | |||
600 | # | 665 | # |
601 | CONFIG_PROC_FS=y | 666 | CONFIG_PROC_FS=y |
602 | CONFIG_PROC_KCORE=y | 667 | CONFIG_PROC_KCORE=y |
668 | CONFIG_PROC_SYSCTL=y | ||
603 | CONFIG_SYSFS=y | 669 | CONFIG_SYSFS=y |
604 | CONFIG_TMPFS=y | 670 | CONFIG_TMPFS=y |
671 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
605 | # CONFIG_HUGETLB_PAGE is not set | 672 | # CONFIG_HUGETLB_PAGE is not set |
606 | CONFIG_RAMFS=y | 673 | CONFIG_RAMFS=y |
607 | CONFIG_CONFIGFS_FS=m | 674 | CONFIG_CONFIGFS_FS=m |
@@ -616,6 +683,16 @@ CONFIG_CONFIGFS_FS=m | |||
616 | # CONFIG_BEFS_FS is not set | 683 | # CONFIG_BEFS_FS is not set |
617 | # CONFIG_BFS_FS is not set | 684 | # CONFIG_BFS_FS is not set |
618 | # CONFIG_EFS_FS is not set | 685 | # CONFIG_EFS_FS is not set |
686 | # CONFIG_JFFS_FS is not set | ||
687 | CONFIG_JFFS2_FS=y | ||
688 | CONFIG_JFFS2_FS_DEBUG=0 | ||
689 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
690 | # CONFIG_JFFS2_SUMMARY is not set | ||
691 | # CONFIG_JFFS2_FS_XATTR is not set | ||
692 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||
693 | CONFIG_JFFS2_ZLIB=y | ||
694 | CONFIG_JFFS2_RTIME=y | ||
695 | # CONFIG_JFFS2_RUBIN is not set | ||
619 | # CONFIG_CRAMFS is not set | 696 | # CONFIG_CRAMFS is not set |
620 | # CONFIG_VXFS_FS is not set | 697 | # CONFIG_VXFS_FS is not set |
621 | # CONFIG_HPFS_FS is not set | 698 | # CONFIG_HPFS_FS is not set |
@@ -626,26 +703,10 @@ CONFIG_CONFIGFS_FS=m | |||
626 | # | 703 | # |
627 | # Network File Systems | 704 | # Network File Systems |
628 | # | 705 | # |
629 | CONFIG_NFS_FS=y | 706 | # CONFIG_NFS_FS is not set |
630 | CONFIG_NFS_V3=y | ||
631 | # CONFIG_NFS_V3_ACL is not set | ||
632 | # CONFIG_NFS_V4 is not set | ||
633 | # CONFIG_NFS_DIRECTIO is not set | ||
634 | # CONFIG_NFSD is not set | 707 | # CONFIG_NFSD is not set |
635 | CONFIG_ROOT_NFS=y | ||
636 | CONFIG_LOCKD=y | ||
637 | CONFIG_LOCKD_V4=y | ||
638 | CONFIG_NFS_COMMON=y | ||
639 | CONFIG_SUNRPC=y | ||
640 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
641 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
642 | # CONFIG_SMB_FS is not set | 708 | # CONFIG_SMB_FS is not set |
643 | CONFIG_CIFS=m | 709 | # CONFIG_CIFS is not set |
644 | # CONFIG_CIFS_STATS is not set | ||
645 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
646 | # CONFIG_CIFS_XATTR is not set | ||
647 | # CONFIG_CIFS_DEBUG2 is not set | ||
648 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
649 | # CONFIG_NCP_FS is not set | 710 | # CONFIG_NCP_FS is not set |
650 | # CONFIG_CODA_FS is not set | 711 | # CONFIG_CODA_FS is not set |
651 | # CONFIG_AFS_FS is not set | 712 | # CONFIG_AFS_FS is not set |
@@ -665,7 +726,7 @@ CONFIG_NLS_DEFAULT="iso8859-1" | |||
665 | CONFIG_NLS_CODEPAGE_437=m | 726 | CONFIG_NLS_CODEPAGE_437=m |
666 | # CONFIG_NLS_CODEPAGE_737 is not set | 727 | # CONFIG_NLS_CODEPAGE_737 is not set |
667 | # CONFIG_NLS_CODEPAGE_775 is not set | 728 | # CONFIG_NLS_CODEPAGE_775 is not set |
668 | CONFIG_NLS_CODEPAGE_850=m | 729 | # CONFIG_NLS_CODEPAGE_850 is not set |
669 | # CONFIG_NLS_CODEPAGE_852 is not set | 730 | # CONFIG_NLS_CODEPAGE_852 is not set |
670 | # CONFIG_NLS_CODEPAGE_855 is not set | 731 | # CONFIG_NLS_CODEPAGE_855 is not set |
671 | # CONFIG_NLS_CODEPAGE_857 is not set | 732 | # CONFIG_NLS_CODEPAGE_857 is not set |
@@ -705,13 +766,17 @@ CONFIG_NLS_UTF8=m | |||
705 | # Kernel hacking | 766 | # Kernel hacking |
706 | # | 767 | # |
707 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | 768 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y |
708 | CONFIG_PRINTK_TIME=y | 769 | # CONFIG_PRINTK_TIME is not set |
770 | CONFIG_ENABLE_MUST_CHECK=y | ||
709 | CONFIG_MAGIC_SYSRQ=y | 771 | CONFIG_MAGIC_SYSRQ=y |
710 | # CONFIG_UNUSED_SYMBOLS is not set | 772 | # CONFIG_UNUSED_SYMBOLS is not set |
711 | CONFIG_DEBUG_KERNEL=y | 773 | CONFIG_DEBUG_KERNEL=y |
712 | CONFIG_LOG_BUF_SHIFT=14 | 774 | CONFIG_LOG_BUF_SHIFT=14 |
713 | CONFIG_DETECT_SOFTLOCKUP=y | 775 | CONFIG_DETECT_SOFTLOCKUP=y |
714 | # CONFIG_SCHEDSTATS is not set | 776 | # CONFIG_SCHEDSTATS is not set |
777 | # CONFIG_DEBUG_SLAB is not set | ||
778 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
779 | # CONFIG_RT_MUTEX_TESTER is not set | ||
715 | # CONFIG_DEBUG_SPINLOCK is not set | 780 | # CONFIG_DEBUG_SPINLOCK is not set |
716 | # CONFIG_DEBUG_MUTEXES is not set | 781 | # CONFIG_DEBUG_MUTEXES is not set |
717 | # CONFIG_DEBUG_RWSEMS is not set | 782 | # CONFIG_DEBUG_RWSEMS is not set |
@@ -722,11 +787,13 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
722 | # CONFIG_DEBUG_INFO is not set | 787 | # CONFIG_DEBUG_INFO is not set |
723 | CONFIG_DEBUG_FS=y | 788 | CONFIG_DEBUG_FS=y |
724 | # CONFIG_DEBUG_VM is not set | 789 | # CONFIG_DEBUG_VM is not set |
790 | # CONFIG_DEBUG_LIST is not set | ||
725 | CONFIG_FRAME_POINTER=y | 791 | CONFIG_FRAME_POINTER=y |
726 | # CONFIG_UNWIND_INFO is not set | 792 | # CONFIG_UNWIND_INFO is not set |
727 | CONFIG_FORCED_INLINING=y | 793 | CONFIG_FORCED_INLINING=y |
794 | # CONFIG_HEADERS_CHECK is not set | ||
728 | # CONFIG_RCU_TORTURE_TEST is not set | 795 | # CONFIG_RCU_TORTURE_TEST is not set |
729 | CONFIG_KPROBES=y | 796 | # CONFIG_KPROBES is not set |
730 | 797 | ||
731 | # | 798 | # |
732 | # Security options | 799 | # Security options |
@@ -740,15 +807,13 @@ CONFIG_KPROBES=y | |||
740 | # CONFIG_CRYPTO is not set | 807 | # CONFIG_CRYPTO is not set |
741 | 808 | ||
742 | # | 809 | # |
743 | # Hardware crypto devices | ||
744 | # | ||
745 | |||
746 | # | ||
747 | # Library routines | 810 | # Library routines |
748 | # | 811 | # |
749 | CONFIG_CRC_CCITT=m | 812 | CONFIG_CRC_CCITT=m |
750 | # CONFIG_CRC16 is not set | 813 | # CONFIG_CRC16 is not set |
751 | CONFIG_CRC32=m | 814 | CONFIG_CRC32=y |
752 | # CONFIG_LIBCRC32C is not set | 815 | # CONFIG_LIBCRC32C is not set |
753 | CONFIG_ZLIB_INFLATE=m | 816 | CONFIG_AUDIT_GENERIC=y |
754 | CONFIG_ZLIB_DEFLATE=m | 817 | CONFIG_ZLIB_INFLATE=y |
818 | CONFIG_ZLIB_DEFLATE=y | ||
819 | CONFIG_PLIST=y | ||
diff --git a/arch/avr32/kernel/avr32_ksyms.c b/arch/avr32/kernel/avr32_ksyms.c index 04f767a272b7..372e3f8b2417 100644 --- a/arch/avr32/kernel/avr32_ksyms.c +++ b/arch/avr32/kernel/avr32_ksyms.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | #include <linux/io.h> | ||
10 | #include <linux/module.h> | 11 | #include <linux/module.h> |
11 | 12 | ||
12 | #include <asm/checksum.h> | 13 | #include <asm/checksum.h> |
@@ -53,3 +54,11 @@ EXPORT_SYMBOL(find_next_zero_bit); | |||
53 | EXPORT_SYMBOL(find_first_bit); | 54 | EXPORT_SYMBOL(find_first_bit); |
54 | EXPORT_SYMBOL(find_next_bit); | 55 | EXPORT_SYMBOL(find_next_bit); |
55 | EXPORT_SYMBOL(generic_find_next_zero_le_bit); | 56 | EXPORT_SYMBOL(generic_find_next_zero_le_bit); |
57 | |||
58 | /* I/O primitives (lib/io-*.S) */ | ||
59 | EXPORT_SYMBOL(__raw_readsb); | ||
60 | EXPORT_SYMBOL(__raw_readsw); | ||
61 | EXPORT_SYMBOL(__raw_readsl); | ||
62 | EXPORT_SYMBOL(__raw_writesb); | ||
63 | EXPORT_SYMBOL(__raw_writesw); | ||
64 | EXPORT_SYMBOL(__raw_writesl); | ||
diff --git a/arch/avr32/kernel/head.S b/arch/avr32/kernel/head.S index 773b7ad87be9..6163bd0acb95 100644 --- a/arch/avr32/kernel/head.S +++ b/arch/avr32/kernel/head.S | |||
@@ -30,9 +30,6 @@ kernel_entry: | |||
30 | mov r7, 0 | 30 | mov r7, 0 |
31 | #endif | 31 | #endif |
32 | 32 | ||
33 | /* Set up the PIO, SDRAM controller, early printk, etc. */ | ||
34 | rcall board_early_init | ||
35 | |||
36 | /* Start the show */ | 33 | /* Start the show */ |
37 | lddpc pc, kernel_start_addr | 34 | lddpc pc, kernel_start_addr |
38 | 35 | ||
diff --git a/arch/avr32/kernel/kprobes.c b/arch/avr32/kernel/kprobes.c index 6caf9e8d8080..ca41fc1edbe1 100644 --- a/arch/avr32/kernel/kprobes.c +++ b/arch/avr32/kernel/kprobes.c | |||
@@ -109,7 +109,7 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) | |||
109 | void *addr = (void *)regs->pc; | 109 | void *addr = (void *)regs->pc; |
110 | int ret = 0; | 110 | int ret = 0; |
111 | 111 | ||
112 | pr_debug("kprobe_handler: kprobe_running=%d\n", | 112 | pr_debug("kprobe_handler: kprobe_running=%p\n", |
113 | kprobe_running()); | 113 | kprobe_running()); |
114 | 114 | ||
115 | /* | 115 | /* |
diff --git a/arch/avr32/kernel/module.c b/arch/avr32/kernel/module.c index dfc32f2817b6..b599eae64576 100644 --- a/arch/avr32/kernel/module.c +++ b/arch/avr32/kernel/module.c | |||
@@ -263,7 +263,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, | |||
263 | * value of PC. Just subtract the value of | 263 | * value of PC. Just subtract the value of |
264 | * GOT, and we're done. | 264 | * GOT, and we're done. |
265 | */ | 265 | */ |
266 | pr_debug("GOTPC: PC=0x%lx, got_offset=0x%lx, core=0x%p\n", | 266 | pr_debug("GOTPC: PC=0x%x, got_offset=0x%lx, core=0x%p\n", |
267 | relocation, module->arch.got_offset, | 267 | relocation, module->arch.got_offset, |
268 | module->module_core); | 268 | module->module_core); |
269 | relocation -= ((unsigned long)module->module_core | 269 | relocation -= ((unsigned long)module->module_core |
@@ -282,7 +282,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, | |||
282 | && (relocation & 0xffff0000) != 0xffff0000) | 282 | && (relocation & 0xffff0000) != 0xffff0000) |
283 | return reloc_overflow(module, "R_AVR32_GOT16S", | 283 | return reloc_overflow(module, "R_AVR32_GOT16S", |
284 | relocation); | 284 | relocation); |
285 | pr_debug("GOT reloc @ 0x%lx -> %lu\n", | 285 | pr_debug("GOT reloc @ 0x%x -> %u\n", |
286 | rel->r_offset, relocation); | 286 | rel->r_offset, relocation); |
287 | value = *location; | 287 | value = *location; |
288 | value = ((value & 0xffff0000) | 288 | value = ((value & 0xffff0000) |
diff --git a/arch/avr32/kernel/ptrace.c b/arch/avr32/kernel/ptrace.c index 3c89e59029ab..f2e81cd79002 100644 --- a/arch/avr32/kernel/ptrace.c +++ b/arch/avr32/kernel/ptrace.c | |||
@@ -157,7 +157,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
157 | unsigned long tmp; | 157 | unsigned long tmp; |
158 | int ret; | 158 | int ret; |
159 | 159 | ||
160 | pr_debug("arch_ptrace(%ld, %ld, %#lx, %#lx)\n", | 160 | pr_debug("arch_ptrace(%ld, %d, %#lx, %#lx)\n", |
161 | request, child->pid, addr, data); | 161 | request, child->pid, addr, data); |
162 | 162 | ||
163 | pr_debug("ptrace: Enabling monitor mode...\n"); | 163 | pr_debug("ptrace: Enabling monitor mode...\n"); |
diff --git a/arch/avr32/kernel/syscall-stubs.S b/arch/avr32/kernel/syscall-stubs.S index 7589a9b426cb..890286a1e62b 100644 --- a/arch/avr32/kernel/syscall-stubs.S +++ b/arch/avr32/kernel/syscall-stubs.S | |||
@@ -100,3 +100,12 @@ __sys_splice: | |||
100 | rcall sys_splice | 100 | rcall sys_splice |
101 | sub sp, -4 | 101 | sub sp, -4 |
102 | popm pc | 102 | popm pc |
103 | |||
104 | .global __sys_epoll_pwait | ||
105 | .type __sys_epoll_pwait,@function | ||
106 | __sys_epoll_pwait: | ||
107 | pushm lr | ||
108 | st.w --sp, ARG6 | ||
109 | rcall sys_epoll_pwait | ||
110 | sub sp, -4 | ||
111 | popm pc | ||
diff --git a/arch/avr32/kernel/syscall_table.S b/arch/avr32/kernel/syscall_table.S index 63b206965d05..db8f8b55ffdf 100644 --- a/arch/avr32/kernel/syscall_table.S +++ b/arch/avr32/kernel/syscall_table.S | |||
@@ -286,4 +286,5 @@ sys_call_table: | |||
286 | .long sys_sync_file_range | 286 | .long sys_sync_file_range |
287 | .long sys_tee | 287 | .long sys_tee |
288 | .long sys_vmsplice | 288 | .long sys_vmsplice |
289 | .long __sys_epoll_pwait /* 265 */ | ||
289 | .long sys_ni_syscall /* r8 is saturated at nr_syscalls */ | 290 | .long sys_ni_syscall /* r8 is saturated at nr_syscalls */ |
diff --git a/arch/avr32/kernel/vmlinux.lds.c b/arch/avr32/kernel/vmlinux.lds.c index cdd627c6b7dc..5c4424e362b5 100644 --- a/arch/avr32/kernel/vmlinux.lds.c +++ b/arch/avr32/kernel/vmlinux.lds.c | |||
@@ -38,13 +38,7 @@ SECTIONS | |||
38 | __setup_end = .; | 38 | __setup_end = .; |
39 | . = ALIGN(4); | 39 | . = ALIGN(4); |
40 | __initcall_start = .; | 40 | __initcall_start = .; |
41 | *(.initcall1.init) | 41 | INITCALLS |
42 | *(.initcall2.init) | ||
43 | *(.initcall3.init) | ||
44 | *(.initcall4.init) | ||
45 | *(.initcall5.init) | ||
46 | *(.initcall6.init) | ||
47 | *(.initcall7.init) | ||
48 | __initcall_end = .; | 42 | __initcall_end = .; |
49 | __con_initcall_start = .; | 43 | __con_initcall_start = .; |
50 | *(.con_initcall.init) | 44 | *(.con_initcall.init) |
diff --git a/arch/avr32/lib/Makefile b/arch/avr32/lib/Makefile index 09ac43e40522..084d95bac5e7 100644 --- a/arch/avr32/lib/Makefile +++ b/arch/avr32/lib/Makefile | |||
@@ -7,4 +7,5 @@ lib-y += strncpy_from_user.o strnlen_user.o | |||
7 | lib-y += delay.o memset.o memcpy.o findbit.o | 7 | lib-y += delay.o memset.o memcpy.o findbit.o |
8 | lib-y += csum_partial.o csum_partial_copy_generic.o | 8 | lib-y += csum_partial.o csum_partial_copy_generic.o |
9 | lib-y += io-readsw.o io-readsl.o io-writesw.o io-writesl.o | 9 | lib-y += io-readsw.o io-readsl.o io-writesw.o io-writesl.o |
10 | lib-y += io-readsb.o io-writesb.o | ||
10 | lib-y += __avr32_lsl64.o __avr32_lsr64.o __avr32_asr64.o | 11 | lib-y += __avr32_lsl64.o __avr32_lsr64.o __avr32_asr64.o |
diff --git a/arch/avr32/lib/findbit.S b/arch/avr32/lib/findbit.S index 2b4856f4bf7c..c6b91dee857c 100644 --- a/arch/avr32/lib/findbit.S +++ b/arch/avr32/lib/findbit.S | |||
@@ -136,6 +136,7 @@ ENTRY(generic_find_next_zero_le_bit) | |||
136 | /* offset is not word-aligned. Handle the first (32 - r10) bits */ | 136 | /* offset is not word-aligned. Handle the first (32 - r10) bits */ |
137 | ldswp.w r8, r12[0] | 137 | ldswp.w r8, r12[0] |
138 | sub r12, -4 | 138 | sub r12, -4 |
139 | com r8 | ||
139 | lsr r8, r8, r10 | 140 | lsr r8, r8, r10 |
140 | brne .L_found | 141 | brne .L_found |
141 | 142 | ||
@@ -146,7 +147,7 @@ ENTRY(generic_find_next_zero_le_bit) | |||
146 | 147 | ||
147 | /* Main loop. offset must be word-aligned */ | 148 | /* Main loop. offset must be word-aligned */ |
148 | 1: ldswp.w r8, r12[0] | 149 | 1: ldswp.w r8, r12[0] |
149 | cp.w r8, 0 | 150 | com r8 |
150 | brne .L_found | 151 | brne .L_found |
151 | sub r12, -4 | 152 | sub r12, -4 |
152 | sub r9, 32 | 153 | sub r9, 32 |
diff --git a/arch/avr32/lib/io-readsb.S b/arch/avr32/lib/io-readsb.S new file mode 100644 index 000000000000..2be5da7ed26b --- /dev/null +++ b/arch/avr32/lib/io-readsb.S | |||
@@ -0,0 +1,49 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2004-2006 Atmel Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | .text | ||
10 | .Lnot_word_aligned: | ||
11 | 1: ld.ub r8, r12[0] | ||
12 | sub r10, 1 | ||
13 | st.b r11++, r8 | ||
14 | reteq r12 | ||
15 | tst r11, r9 | ||
16 | brne 1b | ||
17 | |||
18 | /* fall through */ | ||
19 | |||
20 | .global __raw_readsb | ||
21 | .type __raw_readsb,@function | ||
22 | __raw_readsb: | ||
23 | cp.w r10, 0 | ||
24 | mov r9, 3 | ||
25 | reteq r12 | ||
26 | |||
27 | tst r11, r9 | ||
28 | brne .Lnot_word_aligned | ||
29 | |||
30 | sub r10, 4 | ||
31 | brlt 2f | ||
32 | |||
33 | 1: ldins.b r8:t, r12[0] | ||
34 | ldins.b r8:u, r12[0] | ||
35 | ldins.b r8:l, r12[0] | ||
36 | ldins.b r8:b, r12[0] | ||
37 | st.w r11++, r8 | ||
38 | sub r10, 4 | ||
39 | brge 1b | ||
40 | |||
41 | 2: sub r10, -4 | ||
42 | reteq r12 | ||
43 | |||
44 | 3: ld.uh r8, r12[0] | ||
45 | sub r10, 1 | ||
46 | st.b r11++, r8 | ||
47 | brne 3b | ||
48 | |||
49 | retal r12 | ||
diff --git a/arch/avr32/lib/io-writesb.S b/arch/avr32/lib/io-writesb.S new file mode 100644 index 000000000000..b4ebaacccf68 --- /dev/null +++ b/arch/avr32/lib/io-writesb.S | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2004-2006 Atmel Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | .text | ||
10 | .Lnot_word_aligned: | ||
11 | 1: ld.ub r8, r11++ | ||
12 | sub r10, 1 | ||
13 | st.b r12[0], r8 | ||
14 | reteq r12 | ||
15 | tst r11, r9 | ||
16 | brne 1b | ||
17 | |||
18 | /* fall through */ | ||
19 | |||
20 | .global __raw_writesb | ||
21 | .type __raw_writesb,@function | ||
22 | __raw_writesb: | ||
23 | cp.w r10, 0 | ||
24 | mov r9, 3 | ||
25 | reteq r12 | ||
26 | |||
27 | tst r11, r9 | ||
28 | brne .Lnot_word_aligned | ||
29 | |||
30 | sub r10, 4 | ||
31 | brlt 2f | ||
32 | |||
33 | 1: ld.w r8, r11++ | ||
34 | bfextu r9, r8, 24, 8 | ||
35 | st.b r12[0], r9 | ||
36 | bfextu r9, r8, 16, 8 | ||
37 | st.b r12[0], r9 | ||
38 | bfextu r9, r8, 8, 8 | ||
39 | st.b r12[0], r9 | ||
40 | st.b r12[0], r8 | ||
41 | sub r10, 4 | ||
42 | brge 1b | ||
43 | |||
44 | 2: sub r10, -4 | ||
45 | reteq r12 | ||
46 | |||
47 | 3: ld.ub r8, r11++ | ||
48 | sub r10, 1 | ||
49 | st.b r12[0], r8 | ||
50 | brne 3b | ||
51 | |||
52 | retal r12 | ||
diff --git a/arch/avr32/mach-at32ap/hsmc.h b/arch/avr32/mach-at32ap/hsmc.h index 5681276fafdb..d1d48e26e393 100644 --- a/arch/avr32/mach-at32ap/hsmc.h +++ b/arch/avr32/mach-at32ap/hsmc.h | |||
@@ -120,8 +120,8 @@ | |||
120 | 120 | ||
121 | /* Register access macros */ | 121 | /* Register access macros */ |
122 | #define hsmc_readl(port,reg) \ | 122 | #define hsmc_readl(port,reg) \ |
123 | readl((port)->regs + HSMC_##reg) | 123 | __raw_readl((port)->regs + HSMC_##reg) |
124 | #define hsmc_writel(port,reg,value) \ | 124 | #define hsmc_writel(port,reg,value) \ |
125 | writel((value), (port)->regs + HSMC_##reg) | 125 | __raw_writel((value), (port)->regs + HSMC_##reg) |
126 | 126 | ||
127 | #endif /* __ASM_AVR32_HSMC_H__ */ | 127 | #endif /* __ASM_AVR32_HSMC_H__ */ |
diff --git a/arch/avr32/mach-at32ap/intc.h b/arch/avr32/mach-at32ap/intc.h index d289ca2fff13..4d3664e43a8e 100644 --- a/arch/avr32/mach-at32ap/intc.h +++ b/arch/avr32/mach-at32ap/intc.h | |||
@@ -321,7 +321,9 @@ | |||
321 | #define INTC_MKBF(name, value) (((value) & ((1 << INTC_##name##_SIZE) - 1)) << INTC_##name##_OFFSET) | 321 | #define INTC_MKBF(name, value) (((value) & ((1 << INTC_##name##_SIZE) - 1)) << INTC_##name##_OFFSET) |
322 | #define INTC_GETBF(name, value) (((value) >> INTC_##name##_OFFSET) & ((1 << INTC_##name##_SIZE) - 1)) | 322 | #define INTC_GETBF(name, value) (((value) >> INTC_##name##_OFFSET) & ((1 << INTC_##name##_SIZE) - 1)) |
323 | 323 | ||
324 | #define intc_readl(port,reg) readl((port)->regs + INTC_##reg) | 324 | #define intc_readl(port,reg) \ |
325 | #define intc_writel(port,reg,value) writel((value), (port)->regs + INTC_##reg) | 325 | __raw_readl((port)->regs + INTC_##reg) |
326 | #define intc_writel(port,reg,value) \ | ||
327 | __raw_writel((value), (port)->regs + INTC_##reg) | ||
326 | 328 | ||
327 | #endif /* __ASM_AVR32_PERIHP_INTC_H__ */ | 329 | #endif /* __ASM_AVR32_PERIHP_INTC_H__ */ |
diff --git a/arch/avr32/mach-at32ap/pio.h b/arch/avr32/mach-at32ap/pio.h index cfea12351599..50fa3aca32c5 100644 --- a/arch/avr32/mach-at32ap/pio.h +++ b/arch/avr32/mach-at32ap/pio.h | |||
@@ -170,8 +170,10 @@ | |||
170 | #define PIO_BFINS(name,value,old) (((old) & ~(((1 << PIO_##name##_SIZE) - 1) << PIO_##name##_OFFSET)) | PIO_BF(name,value)) | 170 | #define PIO_BFINS(name,value,old) (((old) & ~(((1 << PIO_##name##_SIZE) - 1) << PIO_##name##_OFFSET)) | PIO_BF(name,value)) |
171 | 171 | ||
172 | /* Register access macros */ | 172 | /* Register access macros */ |
173 | #define pio_readl(port,reg) readl((port)->regs + PIO_##reg) | 173 | #define pio_readl(port,reg) \ |
174 | #define pio_writel(port,reg,value) writel((value), (port)->regs + PIO_##reg) | 174 | __raw_readl((port)->regs + PIO_##reg) |
175 | #define pio_writel(port,reg,value) \ | ||
176 | __raw_writel((value), (port)->regs + PIO_##reg) | ||
175 | 177 | ||
176 | void at32_init_pio(struct platform_device *pdev); | 178 | void at32_init_pio(struct platform_device *pdev); |
177 | 179 | ||
diff --git a/arch/avr32/mach-at32ap/sm.h b/arch/avr32/mach-at32ap/sm.h index 27565822ae2a..cad02b512bcb 100644 --- a/arch/avr32/mach-at32ap/sm.h +++ b/arch/avr32/mach-at32ap/sm.h | |||
@@ -234,7 +234,9 @@ | |||
234 | #define SM_BFINS(name,value,old) (((old) & ~(((1 << SM_##name##_SIZE) - 1) << SM_##name##_OFFSET)) | SM_BF(name,value)) | 234 | #define SM_BFINS(name,value,old) (((old) & ~(((1 << SM_##name##_SIZE) - 1) << SM_##name##_OFFSET)) | SM_BF(name,value)) |
235 | 235 | ||
236 | /* Register access macros */ | 236 | /* Register access macros */ |
237 | #define sm_readl(port,reg) readl((port)->regs + SM_##reg) | 237 | #define sm_readl(port,reg) \ |
238 | #define sm_writel(port,reg,value) writel((value), (port)->regs + SM_##reg) | 238 | __raw_readl((port)->regs + SM_##reg) |
239 | #define sm_writel(port,reg,value) \ | ||
240 | __raw_writel((value), (port)->regs + SM_##reg) | ||
239 | 241 | ||
240 | #endif /* __ASM_AVR32_SM_H__ */ | 242 | #endif /* __ASM_AVR32_SM_H__ */ |
diff --git a/arch/avr32/mm/init.c b/arch/avr32/mm/init.c index 3e6c41039808..70da6894acc1 100644 --- a/arch/avr32/mm/init.c +++ b/arch/avr32/mm/init.c | |||
@@ -206,7 +206,7 @@ void __init setup_bootmem(void) | |||
206 | 206 | ||
207 | if (mem_ramdisk) { | 207 | if (mem_ramdisk) { |
208 | #ifdef CONFIG_BLK_DEV_INITRD | 208 | #ifdef CONFIG_BLK_DEV_INITRD |
209 | initrd_start = __va(mem_ramdisk->addr); | 209 | initrd_start = (unsigned long)__va(mem_ramdisk->addr); |
210 | initrd_end = initrd_start + mem_ramdisk->size; | 210 | initrd_end = initrd_start + mem_ramdisk->size; |
211 | 211 | ||
212 | print_memory_map("RAMDISK images", mem_ramdisk); | 212 | print_memory_map("RAMDISK images", mem_ramdisk); |
diff --git a/arch/avr32/mm/ioremap.c b/arch/avr32/mm/ioremap.c index 8cfec65e37f7..3437c82434ac 100644 --- a/arch/avr32/mm/ioremap.c +++ b/arch/avr32/mm/ioremap.c | |||
@@ -77,6 +77,8 @@ void __iounmap(void __iomem *addr) | |||
77 | 77 | ||
78 | if ((unsigned long)addr >= P4SEG) | 78 | if ((unsigned long)addr >= P4SEG) |
79 | return; | 79 | return; |
80 | if (PXSEG(addr) == P2SEG) | ||
81 | return; | ||
80 | 82 | ||
81 | p = remove_vm_area((void *)(PAGE_MASK & (unsigned long __force)addr)); | 83 | p = remove_vm_area((void *)(PAGE_MASK & (unsigned long __force)addr)); |
82 | if (unlikely(!p)) { | 84 | if (unlikely(!p)) { |
diff --git a/arch/cris/arch-v32/drivers/cryptocop.c b/arch/cris/arch-v32/drivers/cryptocop.c index ba096ebb0b15..2449637e6fc0 100644 --- a/arch/cris/arch-v32/drivers/cryptocop.c +++ b/arch/cris/arch-v32/drivers/cryptocop.c | |||
@@ -2051,7 +2051,6 @@ static void cryptocop_job_queue_close(void) | |||
2051 | spin_lock_irqsave(&cryptocop_process_lock, process_flags); | 2051 | spin_lock_irqsave(&cryptocop_process_lock, process_flags); |
2052 | 2052 | ||
2053 | /* Empty the job queue. */ | 2053 | /* Empty the job queue. */ |
2054 | spin_lock_irqsave(&cryptocop_process_lock, process_flags); | ||
2055 | for (i = 0; i < cryptocop_prio_no_prios; i++){ | 2054 | for (i = 0; i < cryptocop_prio_no_prios; i++){ |
2056 | if (!list_empty(&(cryptocop_job_queues[i].jobs))){ | 2055 | if (!list_empty(&(cryptocop_job_queues[i].jobs))){ |
2057 | list_for_each_safe(node, tmp, &(cryptocop_job_queues[i].jobs)) { | 2056 | list_for_each_safe(node, tmp, &(cryptocop_job_queues[i].jobs)) { |
diff --git a/arch/frv/kernel/vmlinux.lds.S b/arch/frv/kernel/vmlinux.lds.S index f474534ba78a..9c1fb12367fa 100644 --- a/arch/frv/kernel/vmlinux.lds.S +++ b/arch/frv/kernel/vmlinux.lds.S | |||
@@ -44,13 +44,7 @@ SECTIONS | |||
44 | 44 | ||
45 | __initcall_start = .; | 45 | __initcall_start = .; |
46 | .initcall.init : { | 46 | .initcall.init : { |
47 | *(.initcall1.init) | 47 | INITCALLS |
48 | *(.initcall2.init) | ||
49 | *(.initcall3.init) | ||
50 | *(.initcall4.init) | ||
51 | *(.initcall5.init) | ||
52 | *(.initcall6.init) | ||
53 | *(.initcall7.init) | ||
54 | } | 48 | } |
55 | __initcall_end = .; | 49 | __initcall_end = .; |
56 | __con_initcall_start = .; | 50 | __con_initcall_start = .; |
diff --git a/arch/h8300/kernel/vmlinux.lds.S b/arch/h8300/kernel/vmlinux.lds.S index 6406c388f88a..756325dd480e 100644 --- a/arch/h8300/kernel/vmlinux.lds.S +++ b/arch/h8300/kernel/vmlinux.lds.S | |||
@@ -118,13 +118,7 @@ SECTIONS | |||
118 | . = ALIGN(0x4) ; | 118 | . = ALIGN(0x4) ; |
119 | ___setup_end = .; | 119 | ___setup_end = .; |
120 | ___initcall_start = .; | 120 | ___initcall_start = .; |
121 | *(.initcall1.init) | 121 | INITCALLS |
122 | *(.initcall2.init) | ||
123 | *(.initcall3.init) | ||
124 | *(.initcall4.init) | ||
125 | *(.initcall5.init) | ||
126 | *(.initcall6.init) | ||
127 | *(.initcall7.init) | ||
128 | ___initcall_end = .; | 122 | ___initcall_end = .; |
129 | ___con_initcall_start = .; | 123 | ___con_initcall_start = .; |
130 | *(.con_initcall.init) | 124 | *(.con_initcall.init) |
diff --git a/arch/i386/Makefile b/arch/i386/Makefile index 7cc0b189b82b..0677908dfa06 100644 --- a/arch/i386/Makefile +++ b/arch/i386/Makefile | |||
@@ -42,6 +42,10 @@ cflags-$(CONFIG_REGPARM) += -mregparm=3 | |||
42 | # temporary until string.h is fixed | 42 | # temporary until string.h is fixed |
43 | cflags-y += -ffreestanding | 43 | cflags-y += -ffreestanding |
44 | 44 | ||
45 | # this works around some issues with generating unwind tables in older gccs | ||
46 | # newer gccs do it by default | ||
47 | cflags-y += -maccumulate-outgoing-args | ||
48 | |||
45 | # Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use | 49 | # Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use |
46 | # a lot more stack due to the lack of sharing of stacklots: | 50 | # a lot more stack due to the lack of sharing of stacklots: |
47 | CFLAGS += $(shell if [ $(call cc-version) -lt 0400 ] ; then echo $(call cc-option,-fno-unit-at-a-time); fi ;) | 51 | CFLAGS += $(shell if [ $(call cc-version) -lt 0400 ] ; then echo $(call cc-option,-fno-unit-at-a-time); fi ;) |
@@ -51,8 +55,8 @@ cflags-y += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,) | |||
51 | AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,) | 55 | AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,) |
52 | 56 | ||
53 | # is .cfi_signal_frame supported too? | 57 | # is .cfi_signal_frame supported too? |
54 | cflags-y += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,) | 58 | cflags-y += $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1,) |
55 | AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,) | 59 | AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1,) |
56 | 60 | ||
57 | CFLAGS += $(cflags-y) | 61 | CFLAGS += $(cflags-y) |
58 | 62 | ||
diff --git a/arch/i386/defconfig b/arch/i386/defconfig index 60c0c02574f0..97aacd6bd7d8 100644 --- a/arch/i386/defconfig +++ b/arch/i386/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.19-rc1 | 3 | # Linux kernel version: 2.6.19-rc2-git4 |
4 | # Thu Oct 5 13:04:53 2006 | 4 | # Sat Oct 21 03:38:56 2006 |
5 | # | 5 | # |
6 | CONFIG_X86_32=y | 6 | CONFIG_X86_32=y |
7 | CONFIG_GENERIC_TIME=y | 7 | CONFIG_GENERIC_TIME=y |
@@ -380,8 +380,8 @@ CONFIG_INET6_XFRM_MODE_TRANSPORT=y | |||
380 | CONFIG_INET6_XFRM_MODE_TUNNEL=y | 380 | CONFIG_INET6_XFRM_MODE_TUNNEL=y |
381 | # CONFIG_INET6_XFRM_MODE_BEET is not set | 381 | # CONFIG_INET6_XFRM_MODE_BEET is not set |
382 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | 382 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set |
383 | CONFIG_IPV6_SIT=y | ||
383 | # CONFIG_IPV6_TUNNEL is not set | 384 | # CONFIG_IPV6_TUNNEL is not set |
384 | # CONFIG_IPV6_SUBTREES is not set | ||
385 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | 385 | # CONFIG_IPV6_MULTIPLE_TABLES is not set |
386 | # CONFIG_NETWORK_SECMARK is not set | 386 | # CONFIG_NETWORK_SECMARK is not set |
387 | # CONFIG_NETFILTER is not set | 387 | # CONFIG_NETFILTER is not set |
@@ -483,6 +483,13 @@ CONFIG_BLK_DEV_INITRD=y | |||
483 | # CONFIG_ATA_OVER_ETH is not set | 483 | # CONFIG_ATA_OVER_ETH is not set |
484 | 484 | ||
485 | # | 485 | # |
486 | # Misc devices | ||
487 | # | ||
488 | # CONFIG_IBM_ASM is not set | ||
489 | # CONFIG_SGI_IOC4 is not set | ||
490 | # CONFIG_TIFM_CORE is not set | ||
491 | |||
492 | # | ||
486 | # ATA/ATAPI/MFM/RLL support | 493 | # ATA/ATAPI/MFM/RLL support |
487 | # | 494 | # |
488 | CONFIG_IDE=y | 495 | CONFIG_IDE=y |
@@ -1024,6 +1031,7 @@ CONFIG_HANGCHECK_TIMER=y | |||
1024 | # | 1031 | # |
1025 | # Dallas's 1-wire bus | 1032 | # Dallas's 1-wire bus |
1026 | # | 1033 | # |
1034 | # CONFIG_W1 is not set | ||
1027 | 1035 | ||
1028 | # | 1036 | # |
1029 | # Hardware Monitoring support | 1037 | # Hardware Monitoring support |
@@ -1032,12 +1040,6 @@ CONFIG_HANGCHECK_TIMER=y | |||
1032 | # CONFIG_HWMON_VID is not set | 1040 | # CONFIG_HWMON_VID is not set |
1033 | 1041 | ||
1034 | # | 1042 | # |
1035 | # Misc devices | ||
1036 | # | ||
1037 | # CONFIG_IBM_ASM is not set | ||
1038 | # CONFIG_TIFM_CORE is not set | ||
1039 | |||
1040 | # | ||
1041 | # Multimedia devices | 1043 | # Multimedia devices |
1042 | # | 1044 | # |
1043 | # CONFIG_VIDEO_DEV is not set | 1045 | # CONFIG_VIDEO_DEV is not set |
@@ -1169,7 +1171,6 @@ CONFIG_USB_HIDINPUT=y | |||
1169 | # CONFIG_USB_ATI_REMOTE2 is not set | 1171 | # CONFIG_USB_ATI_REMOTE2 is not set |
1170 | # CONFIG_USB_KEYSPAN_REMOTE is not set | 1172 | # CONFIG_USB_KEYSPAN_REMOTE is not set |
1171 | # CONFIG_USB_APPLETOUCH is not set | 1173 | # CONFIG_USB_APPLETOUCH is not set |
1172 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
1173 | 1174 | ||
1174 | # | 1175 | # |
1175 | # USB Imaging devices | 1176 | # USB Imaging devices |
@@ -1215,6 +1216,7 @@ CONFIG_USB_MON=y | |||
1215 | # CONFIG_USB_APPLEDISPLAY is not set | 1216 | # CONFIG_USB_APPLEDISPLAY is not set |
1216 | # CONFIG_USB_SISUSBVGA is not set | 1217 | # CONFIG_USB_SISUSBVGA is not set |
1217 | # CONFIG_USB_LD is not set | 1218 | # CONFIG_USB_LD is not set |
1219 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
1218 | # CONFIG_USB_TEST is not set | 1220 | # CONFIG_USB_TEST is not set |
1219 | 1221 | ||
1220 | # | 1222 | # |
@@ -1284,6 +1286,7 @@ CONFIG_EXT3_FS=y | |||
1284 | CONFIG_EXT3_FS_XATTR=y | 1286 | CONFIG_EXT3_FS_XATTR=y |
1285 | CONFIG_EXT3_FS_POSIX_ACL=y | 1287 | CONFIG_EXT3_FS_POSIX_ACL=y |
1286 | # CONFIG_EXT3_FS_SECURITY is not set | 1288 | # CONFIG_EXT3_FS_SECURITY is not set |
1289 | # CONFIG_EXT4DEV_FS is not set | ||
1287 | CONFIG_JBD=y | 1290 | CONFIG_JBD=y |
1288 | # CONFIG_JBD_DEBUG is not set | 1291 | # CONFIG_JBD_DEBUG is not set |
1289 | CONFIG_FS_MBCACHE=y | 1292 | CONFIG_FS_MBCACHE=y |
@@ -1307,6 +1310,7 @@ CONFIG_DNOTIFY=y | |||
1307 | # CONFIG_AUTOFS_FS is not set | 1310 | # CONFIG_AUTOFS_FS is not set |
1308 | CONFIG_AUTOFS4_FS=y | 1311 | CONFIG_AUTOFS4_FS=y |
1309 | # CONFIG_FUSE_FS is not set | 1312 | # CONFIG_FUSE_FS is not set |
1313 | CONFIG_GENERIC_ACL=y | ||
1310 | 1314 | ||
1311 | # | 1315 | # |
1312 | # CD-ROM/DVD Filesystems | 1316 | # CD-ROM/DVD Filesystems |
@@ -1384,7 +1388,6 @@ CONFIG_SUNRPC=y | |||
1384 | # CONFIG_CODA_FS is not set | 1388 | # CONFIG_CODA_FS is not set |
1385 | # CONFIG_AFS_FS is not set | 1389 | # CONFIG_AFS_FS is not set |
1386 | # CONFIG_9P_FS is not set | 1390 | # CONFIG_9P_FS is not set |
1387 | CONFIG_GENERIC_ACL=y | ||
1388 | 1391 | ||
1389 | # | 1392 | # |
1390 | # Partition Types | 1393 | # Partition Types |
@@ -1437,10 +1440,6 @@ CONFIG_NLS_ISO8859_15=y | |||
1437 | CONFIG_NLS_UTF8=y | 1440 | CONFIG_NLS_UTF8=y |
1438 | 1441 | ||
1439 | # | 1442 | # |
1440 | # Distributed Lock Manager | ||
1441 | # | ||
1442 | |||
1443 | # | ||
1444 | # Instrumentation Support | 1443 | # Instrumentation Support |
1445 | # | 1444 | # |
1446 | CONFIG_PROFILING=y | 1445 | CONFIG_PROFILING=y |
@@ -1480,6 +1479,7 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
1480 | CONFIG_UNWIND_INFO=y | 1479 | CONFIG_UNWIND_INFO=y |
1481 | CONFIG_STACK_UNWIND=y | 1480 | CONFIG_STACK_UNWIND=y |
1482 | # CONFIG_FORCED_INLINING is not set | 1481 | # CONFIG_FORCED_INLINING is not set |
1482 | # CONFIG_HEADERS_CHECK is not set | ||
1483 | # CONFIG_RCU_TORTURE_TEST is not set | 1483 | # CONFIG_RCU_TORTURE_TEST is not set |
1484 | # CONFIG_LKDTM is not set | 1484 | # CONFIG_LKDTM is not set |
1485 | CONFIG_EARLY_PRINTK=y | 1485 | CONFIG_EARLY_PRINTK=y |
diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c index ab974ff97073..d12fb97a5337 100644 --- a/arch/i386/kernel/acpi/boot.c +++ b/arch/i386/kernel/acpi/boot.c | |||
@@ -70,7 +70,7 @@ static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) { return | |||
70 | 70 | ||
71 | #define PREFIX "ACPI: " | 71 | #define PREFIX "ACPI: " |
72 | 72 | ||
73 | int acpi_noirq __initdata; /* skip ACPI IRQ initialization */ | 73 | int acpi_noirq; /* skip ACPI IRQ initialization */ |
74 | int acpi_pci_disabled __initdata; /* skip ACPI PCI scan and IRQ initialization */ | 74 | int acpi_pci_disabled __initdata; /* skip ACPI PCI scan and IRQ initialization */ |
75 | int acpi_ht __initdata = 1; /* enable HT */ | 75 | int acpi_ht __initdata = 1; /* enable HT */ |
76 | 76 | ||
@@ -82,6 +82,7 @@ EXPORT_SYMBOL(acpi_strict); | |||
82 | acpi_interrupt_flags acpi_sci_flags __initdata; | 82 | acpi_interrupt_flags acpi_sci_flags __initdata; |
83 | int acpi_sci_override_gsi __initdata; | 83 | int acpi_sci_override_gsi __initdata; |
84 | int acpi_skip_timer_override __initdata; | 84 | int acpi_skip_timer_override __initdata; |
85 | int acpi_use_timer_override __initdata; | ||
85 | 86 | ||
86 | #ifdef CONFIG_X86_LOCAL_APIC | 87 | #ifdef CONFIG_X86_LOCAL_APIC |
87 | static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; | 88 | static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; |
@@ -1300,6 +1301,13 @@ static int __init parse_acpi_skip_timer_override(char *arg) | |||
1300 | return 0; | 1301 | return 0; |
1301 | } | 1302 | } |
1302 | early_param("acpi_skip_timer_override", parse_acpi_skip_timer_override); | 1303 | early_param("acpi_skip_timer_override", parse_acpi_skip_timer_override); |
1304 | |||
1305 | static int __init parse_acpi_use_timer_override(char *arg) | ||
1306 | { | ||
1307 | acpi_use_timer_override = 1; | ||
1308 | return 0; | ||
1309 | } | ||
1310 | early_param("acpi_use_timer_override", parse_acpi_use_timer_override); | ||
1303 | #endif /* CONFIG_X86_IO_APIC */ | 1311 | #endif /* CONFIG_X86_IO_APIC */ |
1304 | 1312 | ||
1305 | static int __init setup_acpi_sci(char *s) | 1313 | static int __init setup_acpi_sci(char *s) |
diff --git a/arch/i386/kernel/acpi/earlyquirk.c b/arch/i386/kernel/acpi/earlyquirk.c index fe799b11ac0a..c9841692bb7c 100644 --- a/arch/i386/kernel/acpi/earlyquirk.c +++ b/arch/i386/kernel/acpi/earlyquirk.c | |||
@@ -27,11 +27,17 @@ static int __init check_bridge(int vendor, int device) | |||
27 | #ifdef CONFIG_ACPI | 27 | #ifdef CONFIG_ACPI |
28 | /* According to Nvidia all timer overrides are bogus unless HPET | 28 | /* According to Nvidia all timer overrides are bogus unless HPET |
29 | is enabled. */ | 29 | is enabled. */ |
30 | if (vendor == PCI_VENDOR_ID_NVIDIA) { | 30 | if (!acpi_use_timer_override && vendor == PCI_VENDOR_ID_NVIDIA) { |
31 | nvidia_hpet_detected = 0; | 31 | nvidia_hpet_detected = 0; |
32 | acpi_table_parse(ACPI_HPET, nvidia_hpet_check); | 32 | acpi_table_parse(ACPI_HPET, nvidia_hpet_check); |
33 | if (nvidia_hpet_detected == 0) { | 33 | if (nvidia_hpet_detected == 0) { |
34 | acpi_skip_timer_override = 1; | 34 | acpi_skip_timer_override = 1; |
35 | printk(KERN_INFO "Nvidia board " | ||
36 | "detected. Ignoring ACPI " | ||
37 | "timer override.\n"); | ||
38 | printk(KERN_INFO "If you got timer trouble " | ||
39 | "try acpi_use_timer_override\n"); | ||
40 | |||
35 | } | 41 | } |
36 | } | 42 | } |
37 | #endif | 43 | #endif |
diff --git a/arch/i386/kernel/apm.c b/arch/i386/kernel/apm.c index 2af65858d322..a60358fe9a49 100644 --- a/arch/i386/kernel/apm.c +++ b/arch/i386/kernel/apm.c | |||
@@ -198,7 +198,7 @@ | |||
198 | * (APM) BIOS Interface Specification, Revision 1.2, February 1996. | 198 | * (APM) BIOS Interface Specification, Revision 1.2, February 1996. |
199 | * | 199 | * |
200 | * [This document is available from Microsoft at: | 200 | * [This document is available from Microsoft at: |
201 | * http://www.microsoft.com/hwdev/busbios/amp_12.htm] | 201 | * http://www.microsoft.com/whdc/archive/amp_12.mspx] |
202 | */ | 202 | */ |
203 | 203 | ||
204 | #include <linux/module.h> | 204 | #include <linux/module.h> |
diff --git a/arch/i386/kernel/head.S b/arch/i386/kernel/head.S index be9d883c62ce..ca31f18d277c 100644 --- a/arch/i386/kernel/head.S +++ b/arch/i386/kernel/head.S | |||
@@ -317,7 +317,7 @@ is386: movl $2,%ecx # set MP | |||
317 | movl %eax,%gs | 317 | movl %eax,%gs |
318 | lldt %ax | 318 | lldt %ax |
319 | cld # gcc2 wants the direction flag cleared at all times | 319 | cld # gcc2 wants the direction flag cleared at all times |
320 | pushl %eax # fake return address | 320 | pushl $0 # fake return address for unwinder |
321 | #ifdef CONFIG_SMP | 321 | #ifdef CONFIG_SMP |
322 | movb ready, %cl | 322 | movb ready, %cl |
323 | movb $1, ready | 323 | movb $1, ready |
diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c index 350192d6ab98..3b7a63e0ed1a 100644 --- a/arch/i386/kernel/io_apic.c +++ b/arch/i386/kernel/io_apic.c | |||
@@ -91,6 +91,46 @@ static struct irq_pin_list { | |||
91 | int apic, pin, next; | 91 | int apic, pin, next; |
92 | } irq_2_pin[PIN_MAP_SIZE]; | 92 | } irq_2_pin[PIN_MAP_SIZE]; |
93 | 93 | ||
94 | struct io_apic { | ||
95 | unsigned int index; | ||
96 | unsigned int unused[3]; | ||
97 | unsigned int data; | ||
98 | }; | ||
99 | |||
100 | static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx) | ||
101 | { | ||
102 | return (void __iomem *) __fix_to_virt(FIX_IO_APIC_BASE_0 + idx) | ||
103 | + (mp_ioapics[idx].mpc_apicaddr & ~PAGE_MASK); | ||
104 | } | ||
105 | |||
106 | static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) | ||
107 | { | ||
108 | struct io_apic __iomem *io_apic = io_apic_base(apic); | ||
109 | writel(reg, &io_apic->index); | ||
110 | return readl(&io_apic->data); | ||
111 | } | ||
112 | |||
113 | static inline void io_apic_write(unsigned int apic, unsigned int reg, unsigned int value) | ||
114 | { | ||
115 | struct io_apic __iomem *io_apic = io_apic_base(apic); | ||
116 | writel(reg, &io_apic->index); | ||
117 | writel(value, &io_apic->data); | ||
118 | } | ||
119 | |||
120 | /* | ||
121 | * Re-write a value: to be used for read-modify-write | ||
122 | * cycles where the read already set up the index register. | ||
123 | * | ||
124 | * Older SiS APIC requires we rewrite the index register | ||
125 | */ | ||
126 | static inline void io_apic_modify(unsigned int apic, unsigned int reg, unsigned int value) | ||
127 | { | ||
128 | volatile struct io_apic *io_apic = io_apic_base(apic); | ||
129 | if (sis_apic_bug) | ||
130 | writel(reg, &io_apic->index); | ||
131 | writel(value, &io_apic->data); | ||
132 | } | ||
133 | |||
94 | union entry_union { | 134 | union entry_union { |
95 | struct { u32 w1, w2; }; | 135 | struct { u32 w1, w2; }; |
96 | struct IO_APIC_route_entry entry; | 136 | struct IO_APIC_route_entry entry; |
@@ -107,12 +147,34 @@ static struct IO_APIC_route_entry ioapic_read_entry(int apic, int pin) | |||
107 | return eu.entry; | 147 | return eu.entry; |
108 | } | 148 | } |
109 | 149 | ||
150 | /* | ||
151 | * When we write a new IO APIC routing entry, we need to write the high | ||
152 | * word first! If the mask bit in the low word is clear, we will enable | ||
153 | * the interrupt, and we need to make sure the entry is fully populated | ||
154 | * before that happens. | ||
155 | */ | ||
110 | static void ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e) | 156 | static void ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e) |
111 | { | 157 | { |
112 | unsigned long flags; | 158 | unsigned long flags; |
113 | union entry_union eu; | 159 | union entry_union eu; |
114 | eu.entry = e; | 160 | eu.entry = e; |
115 | spin_lock_irqsave(&ioapic_lock, flags); | 161 | spin_lock_irqsave(&ioapic_lock, flags); |
162 | io_apic_write(apic, 0x11 + 2*pin, eu.w2); | ||
163 | io_apic_write(apic, 0x10 + 2*pin, eu.w1); | ||
164 | spin_unlock_irqrestore(&ioapic_lock, flags); | ||
165 | } | ||
166 | |||
167 | /* | ||
168 | * When we mask an IO APIC routing entry, we need to write the low | ||
169 | * word first, in order to set the mask bit before we change the | ||
170 | * high bits! | ||
171 | */ | ||
172 | static void ioapic_mask_entry(int apic, int pin) | ||
173 | { | ||
174 | unsigned long flags; | ||
175 | union entry_union eu = { .entry.mask = 1 }; | ||
176 | |||
177 | spin_lock_irqsave(&ioapic_lock, flags); | ||
116 | io_apic_write(apic, 0x10 + 2*pin, eu.w1); | 178 | io_apic_write(apic, 0x10 + 2*pin, eu.w1); |
117 | io_apic_write(apic, 0x11 + 2*pin, eu.w2); | 179 | io_apic_write(apic, 0x11 + 2*pin, eu.w2); |
118 | spin_unlock_irqrestore(&ioapic_lock, flags); | 180 | spin_unlock_irqrestore(&ioapic_lock, flags); |
@@ -234,9 +296,7 @@ static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin) | |||
234 | /* | 296 | /* |
235 | * Disable it in the IO-APIC irq-routing table: | 297 | * Disable it in the IO-APIC irq-routing table: |
236 | */ | 298 | */ |
237 | memset(&entry, 0, sizeof(entry)); | 299 | ioapic_mask_entry(apic, pin); |
238 | entry.mask = 1; | ||
239 | ioapic_write_entry(apic, pin, entry); | ||
240 | } | 300 | } |
241 | 301 | ||
242 | static void clear_IO_APIC (void) | 302 | static void clear_IO_APIC (void) |
@@ -1227,9 +1287,11 @@ static void ioapic_register_intr(int irq, int vector, unsigned long trigger) | |||
1227 | trigger == IOAPIC_LEVEL) | 1287 | trigger == IOAPIC_LEVEL) |
1228 | set_irq_chip_and_handler_name(irq, &ioapic_chip, | 1288 | set_irq_chip_and_handler_name(irq, &ioapic_chip, |
1229 | handle_fasteoi_irq, "fasteoi"); | 1289 | handle_fasteoi_irq, "fasteoi"); |
1230 | else | 1290 | else { |
1291 | irq_desc[irq].status |= IRQ_DELAYED_DISABLE; | ||
1231 | set_irq_chip_and_handler_name(irq, &ioapic_chip, | 1292 | set_irq_chip_and_handler_name(irq, &ioapic_chip, |
1232 | handle_edge_irq, "edge"); | 1293 | handle_edge_irq, "edge"); |
1294 | } | ||
1233 | set_intr_gate(vector, interrupt[irq]); | 1295 | set_intr_gate(vector, interrupt[irq]); |
1234 | } | 1296 | } |
1235 | 1297 | ||
@@ -2564,18 +2626,16 @@ void arch_teardown_msi_irq(unsigned int irq) | |||
2564 | 2626 | ||
2565 | static void target_ht_irq(unsigned int irq, unsigned int dest) | 2627 | static void target_ht_irq(unsigned int irq, unsigned int dest) |
2566 | { | 2628 | { |
2567 | u32 low, high; | 2629 | struct ht_irq_msg msg; |
2568 | low = read_ht_irq_low(irq); | 2630 | fetch_ht_irq_msg(irq, &msg); |
2569 | high = read_ht_irq_high(irq); | ||
2570 | 2631 | ||
2571 | low &= ~(HT_IRQ_LOW_DEST_ID_MASK); | 2632 | msg.address_lo &= ~(HT_IRQ_LOW_DEST_ID_MASK); |
2572 | high &= ~(HT_IRQ_HIGH_DEST_ID_MASK); | 2633 | msg.address_hi &= ~(HT_IRQ_HIGH_DEST_ID_MASK); |
2573 | 2634 | ||
2574 | low |= HT_IRQ_LOW_DEST_ID(dest); | 2635 | msg.address_lo |= HT_IRQ_LOW_DEST_ID(dest); |
2575 | high |= HT_IRQ_HIGH_DEST_ID(dest); | 2636 | msg.address_hi |= HT_IRQ_HIGH_DEST_ID(dest); |
2576 | 2637 | ||
2577 | write_ht_irq_low(irq, low); | 2638 | write_ht_irq_msg(irq, &msg); |
2578 | write_ht_irq_high(irq, high); | ||
2579 | } | 2639 | } |
2580 | 2640 | ||
2581 | static void set_ht_irq_affinity(unsigned int irq, cpumask_t mask) | 2641 | static void set_ht_irq_affinity(unsigned int irq, cpumask_t mask) |
@@ -2613,7 +2673,7 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) | |||
2613 | 2673 | ||
2614 | vector = assign_irq_vector(irq); | 2674 | vector = assign_irq_vector(irq); |
2615 | if (vector >= 0) { | 2675 | if (vector >= 0) { |
2616 | u32 low, high; | 2676 | struct ht_irq_msg msg; |
2617 | unsigned dest; | 2677 | unsigned dest; |
2618 | cpumask_t tmp; | 2678 | cpumask_t tmp; |
2619 | 2679 | ||
@@ -2621,9 +2681,10 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) | |||
2621 | cpu_set(vector >> 8, tmp); | 2681 | cpu_set(vector >> 8, tmp); |
2622 | dest = cpu_mask_to_apicid(tmp); | 2682 | dest = cpu_mask_to_apicid(tmp); |
2623 | 2683 | ||
2624 | high = HT_IRQ_HIGH_DEST_ID(dest); | 2684 | msg.address_hi = HT_IRQ_HIGH_DEST_ID(dest); |
2625 | 2685 | ||
2626 | low = HT_IRQ_LOW_BASE | | 2686 | msg.address_lo = |
2687 | HT_IRQ_LOW_BASE | | ||
2627 | HT_IRQ_LOW_DEST_ID(dest) | | 2688 | HT_IRQ_LOW_DEST_ID(dest) | |
2628 | HT_IRQ_LOW_VECTOR(vector) | | 2689 | HT_IRQ_LOW_VECTOR(vector) | |
2629 | ((INT_DEST_MODE == 0) ? | 2690 | ((INT_DEST_MODE == 0) ? |
@@ -2635,8 +2696,7 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) | |||
2635 | HT_IRQ_LOW_MT_ARBITRATED) | | 2696 | HT_IRQ_LOW_MT_ARBITRATED) | |
2636 | HT_IRQ_LOW_IRQ_MASKED; | 2697 | HT_IRQ_LOW_IRQ_MASKED; |
2637 | 2698 | ||
2638 | write_ht_irq_low(irq, low); | 2699 | write_ht_irq_msg(irq, &msg); |
2639 | write_ht_irq_high(irq, high); | ||
2640 | 2700 | ||
2641 | set_irq_chip_and_handler_name(irq, &ht_irq_chip, | 2701 | set_irq_chip_and_handler_name(irq, &ht_irq_chip, |
2642 | handle_edge_irq, "edge"); | 2702 | handle_edge_irq, "edge"); |
diff --git a/arch/i386/kernel/kprobes.c b/arch/i386/kernel/kprobes.c index d98e44b16fe2..fc79e1e859c4 100644 --- a/arch/i386/kernel/kprobes.c +++ b/arch/i386/kernel/kprobes.c | |||
@@ -361,8 +361,11 @@ no_kprobe: | |||
361 | asm volatile ( ".global kretprobe_trampoline\n" | 361 | asm volatile ( ".global kretprobe_trampoline\n" |
362 | "kretprobe_trampoline: \n" | 362 | "kretprobe_trampoline: \n" |
363 | " pushf\n" | 363 | " pushf\n" |
364 | /* skip cs, eip, orig_eax, es, ds */ | 364 | /* skip cs, eip, orig_eax */ |
365 | " subl $20, %esp\n" | 365 | " subl $12, %esp\n" |
366 | " pushl %gs\n" | ||
367 | " pushl %ds\n" | ||
368 | " pushl %es\n" | ||
366 | " pushl %eax\n" | 369 | " pushl %eax\n" |
367 | " pushl %ebp\n" | 370 | " pushl %ebp\n" |
368 | " pushl %edi\n" | 371 | " pushl %edi\n" |
@@ -373,10 +376,10 @@ no_kprobe: | |||
373 | " movl %esp, %eax\n" | 376 | " movl %esp, %eax\n" |
374 | " call trampoline_handler\n" | 377 | " call trampoline_handler\n" |
375 | /* move eflags to cs */ | 378 | /* move eflags to cs */ |
376 | " movl 48(%esp), %edx\n" | 379 | " movl 52(%esp), %edx\n" |
377 | " movl %edx, 44(%esp)\n" | 380 | " movl %edx, 48(%esp)\n" |
378 | /* save true return address on eflags */ | 381 | /* save true return address on eflags */ |
379 | " movl %eax, 48(%esp)\n" | 382 | " movl %eax, 52(%esp)\n" |
380 | " popl %ebx\n" | 383 | " popl %ebx\n" |
381 | " popl %ecx\n" | 384 | " popl %ecx\n" |
382 | " popl %edx\n" | 385 | " popl %edx\n" |
@@ -384,8 +387,8 @@ no_kprobe: | |||
384 | " popl %edi\n" | 387 | " popl %edi\n" |
385 | " popl %ebp\n" | 388 | " popl %ebp\n" |
386 | " popl %eax\n" | 389 | " popl %eax\n" |
387 | /* skip eip, orig_eax, es, ds */ | 390 | /* skip eip, orig_eax, es, ds, gs */ |
388 | " addl $16, %esp\n" | 391 | " addl $20, %esp\n" |
389 | " popf\n" | 392 | " popf\n" |
390 | " ret\n"); | 393 | " ret\n"); |
391 | } | 394 | } |
@@ -404,6 +407,10 @@ fastcall void *__kprobes trampoline_handler(struct pt_regs *regs) | |||
404 | INIT_HLIST_HEAD(&empty_rp); | 407 | INIT_HLIST_HEAD(&empty_rp); |
405 | spin_lock_irqsave(&kretprobe_lock, flags); | 408 | spin_lock_irqsave(&kretprobe_lock, flags); |
406 | head = kretprobe_inst_table_head(current); | 409 | head = kretprobe_inst_table_head(current); |
410 | /* fixup registers */ | ||
411 | regs->xcs = __KERNEL_CS; | ||
412 | regs->eip = trampoline_address; | ||
413 | regs->orig_eax = 0xffffffff; | ||
407 | 414 | ||
408 | /* | 415 | /* |
409 | * It is possible to have multiple instances associated with a given | 416 | * It is possible to have multiple instances associated with a given |
@@ -425,6 +432,7 @@ fastcall void *__kprobes trampoline_handler(struct pt_regs *regs) | |||
425 | 432 | ||
426 | if (ri->rp && ri->rp->handler){ | 433 | if (ri->rp && ri->rp->handler){ |
427 | __get_cpu_var(current_kprobe) = &ri->rp->kp; | 434 | __get_cpu_var(current_kprobe) = &ri->rp->kp; |
435 | get_kprobe_ctlblk()->kprobe_status = KPROBE_HIT_ACTIVE; | ||
428 | ri->rp->handler(ri, regs); | 436 | ri->rp->handler(ri, regs); |
429 | __get_cpu_var(current_kprobe) = NULL; | 437 | __get_cpu_var(current_kprobe) = NULL; |
430 | } | 438 | } |
diff --git a/arch/i386/kernel/microcode.c b/arch/i386/kernel/microcode.c index c4d0291b519f..23f5984d0654 100644 --- a/arch/i386/kernel/microcode.c +++ b/arch/i386/kernel/microcode.c | |||
@@ -577,7 +577,7 @@ static void microcode_init_cpu(int cpu) | |||
577 | set_cpus_allowed(current, cpumask_of_cpu(cpu)); | 577 | set_cpus_allowed(current, cpumask_of_cpu(cpu)); |
578 | mutex_lock(µcode_mutex); | 578 | mutex_lock(µcode_mutex); |
579 | collect_cpu_info(cpu); | 579 | collect_cpu_info(cpu); |
580 | if (uci->valid) | 580 | if (uci->valid && system_state == SYSTEM_RUNNING) |
581 | cpu_request_microcode(cpu); | 581 | cpu_request_microcode(cpu); |
582 | mutex_unlock(µcode_mutex); | 582 | mutex_unlock(µcode_mutex); |
583 | set_cpus_allowed(current, old); | 583 | set_cpus_allowed(current, old); |
diff --git a/arch/i386/kernel/nmi.c b/arch/i386/kernel/nmi.c index 3e8e3adb0489..eaafe233a5da 100644 --- a/arch/i386/kernel/nmi.c +++ b/arch/i386/kernel/nmi.c | |||
@@ -219,11 +219,11 @@ static int __init check_nmi_watchdog(void) | |||
219 | int cpu; | 219 | int cpu; |
220 | 220 | ||
221 | /* Enable NMI watchdog for newer systems. | 221 | /* Enable NMI watchdog for newer systems. |
222 | Actually it should be safe for most systems before 2004 too except | 222 | Probably safe on most older systems too, but let's be careful. |
223 | for some IBM systems that corrupt registers when NMI happens | 223 | IBM ThinkPads use INT10 inside SMM and that allows early NMI inside SMM |
224 | during SMM. Unfortunately we don't have more exact information | 224 | which hangs the system. Disable watchdog for all thinkpads */ |
225 | on these and use this coarse check. */ | 225 | if (nmi_watchdog == NMI_DEFAULT && dmi_get_year(DMI_BIOS_DATE) >= 2004 && |
226 | if (nmi_watchdog == NMI_DEFAULT && dmi_get_year(DMI_BIOS_DATE) >= 2004) | 226 | !dmi_name_in_vendors("ThinkPad")) |
227 | nmi_watchdog = NMI_LOCAL_APIC; | 227 | nmi_watchdog = NMI_LOCAL_APIC; |
228 | 228 | ||
229 | if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DEFAULT)) | 229 | if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DEFAULT)) |
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index 57d375900afb..dd53c58f64f1 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c | |||
@@ -205,7 +205,7 @@ void cpu_idle(void) | |||
205 | void cpu_idle_wait(void) | 205 | void cpu_idle_wait(void) |
206 | { | 206 | { |
207 | unsigned int cpu, this_cpu = get_cpu(); | 207 | unsigned int cpu, this_cpu = get_cpu(); |
208 | cpumask_t map; | 208 | cpumask_t map, tmp = current->cpus_allowed; |
209 | 209 | ||
210 | set_cpus_allowed(current, cpumask_of_cpu(this_cpu)); | 210 | set_cpus_allowed(current, cpumask_of_cpu(this_cpu)); |
211 | put_cpu(); | 211 | put_cpu(); |
@@ -227,6 +227,8 @@ void cpu_idle_wait(void) | |||
227 | } | 227 | } |
228 | cpus_and(map, map, cpu_online_map); | 228 | cpus_and(map, map, cpu_online_map); |
229 | } while (!cpus_empty(map)); | 229 | } while (!cpus_empty(map)); |
230 | |||
231 | set_cpus_allowed(current, tmp); | ||
230 | } | 232 | } |
231 | EXPORT_SYMBOL_GPL(cpu_idle_wait); | 233 | EXPORT_SYMBOL_GPL(cpu_idle_wait); |
232 | 234 | ||
@@ -336,7 +338,6 @@ extern void kernel_thread_helper(void); | |||
336 | int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) | 338 | int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) |
337 | { | 339 | { |
338 | struct pt_regs regs; | 340 | struct pt_regs regs; |
339 | int err; | ||
340 | 341 | ||
341 | memset(®s, 0, sizeof(regs)); | 342 | memset(®s, 0, sizeof(regs)); |
342 | 343 | ||
@@ -351,10 +352,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) | |||
351 | regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2; | 352 | regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2; |
352 | 353 | ||
353 | /* Ok, create the new process.. */ | 354 | /* Ok, create the new process.. */ |
354 | err = do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); | 355 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); |
355 | if (err == 0) /* terminate kernel stack */ | ||
356 | task_pt_regs(current)->eip = 0; | ||
357 | return err; | ||
358 | } | 356 | } |
359 | EXPORT_SYMBOL(kernel_thread); | 357 | EXPORT_SYMBOL(kernel_thread); |
360 | 358 | ||
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index 519e63c3c130..141041dde74d 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c | |||
@@ -846,7 +846,7 @@ efi_find_max_pfn(unsigned long start, unsigned long end, void *arg) | |||
846 | static int __init | 846 | static int __init |
847 | efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg) | 847 | efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg) |
848 | { | 848 | { |
849 | memory_present(0, start, end); | 849 | memory_present(0, PFN_UP(start), PFN_DOWN(end)); |
850 | return 0; | 850 | return 0; |
851 | } | 851 | } |
852 | 852 | ||
diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index 00489b706d27..fe9c5e8e7e6f 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c | |||
@@ -129,15 +129,19 @@ static inline unsigned long print_context_stack(struct thread_info *tinfo, | |||
129 | 129 | ||
130 | #ifdef CONFIG_FRAME_POINTER | 130 | #ifdef CONFIG_FRAME_POINTER |
131 | while (valid_stack_ptr(tinfo, (void *)ebp)) { | 131 | while (valid_stack_ptr(tinfo, (void *)ebp)) { |
132 | unsigned long new_ebp; | ||
132 | addr = *(unsigned long *)(ebp + 4); | 133 | addr = *(unsigned long *)(ebp + 4); |
133 | ops->address(data, addr); | 134 | ops->address(data, addr); |
134 | /* | 135 | /* |
135 | * break out of recursive entries (such as | 136 | * break out of recursive entries (such as |
136 | * end_of_stack_stop_unwind_function): | 137 | * end_of_stack_stop_unwind_function). Also, |
138 | * we can never allow a frame pointer to | ||
139 | * move downwards! | ||
137 | */ | 140 | */ |
138 | if (ebp == *(unsigned long *)ebp) | 141 | new_ebp = *(unsigned long *)ebp; |
142 | if (new_ebp <= ebp) | ||
139 | break; | 143 | break; |
140 | ebp = *(unsigned long *)ebp; | 144 | ebp = new_ebp; |
141 | } | 145 | } |
142 | #else | 146 | #else |
143 | while (valid_stack_ptr(tinfo, stack)) { | 147 | while (valid_stack_ptr(tinfo, stack)) { |
diff --git a/arch/i386/kernel/vmlinux.lds.S b/arch/i386/kernel/vmlinux.lds.S index 1e7ac1c44ddc..c6f84a0322ba 100644 --- a/arch/i386/kernel/vmlinux.lds.S +++ b/arch/i386/kernel/vmlinux.lds.S | |||
@@ -51,6 +51,7 @@ SECTIONS | |||
51 | __tracedata_end = .; | 51 | __tracedata_end = .; |
52 | 52 | ||
53 | /* writeable */ | 53 | /* writeable */ |
54 | . = ALIGN(4096); | ||
54 | .data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */ | 55 | .data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */ |
55 | *(.data) | 56 | *(.data) |
56 | CONSTRUCTORS | 57 | CONSTRUCTORS |
@@ -126,13 +127,7 @@ SECTIONS | |||
126 | __setup_end = .; | 127 | __setup_end = .; |
127 | __initcall_start = .; | 128 | __initcall_start = .; |
128 | .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { | 129 | .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { |
129 | *(.initcall1.init) | 130 | INITCALLS |
130 | *(.initcall2.init) | ||
131 | *(.initcall3.init) | ||
132 | *(.initcall4.init) | ||
133 | *(.initcall5.init) | ||
134 | *(.initcall6.init) | ||
135 | *(.initcall7.init) | ||
136 | } | 131 | } |
137 | __initcall_end = .; | 132 | __initcall_end = .; |
138 | __con_initcall_start = .; | 133 | __con_initcall_start = .; |
diff --git a/arch/i386/mach-visws/visws_apic.c b/arch/i386/mach-visws/visws_apic.c index 07097ed48890..38c2b13124d9 100644 --- a/arch/i386/mach-visws/visws_apic.c +++ b/arch/i386/mach-visws/visws_apic.c | |||
@@ -122,7 +122,7 @@ static void end_cobalt_irq(unsigned int irq) | |||
122 | spin_unlock_irqrestore(&cobalt_lock, flags); | 122 | spin_unlock_irqrestore(&cobalt_lock, flags); |
123 | } | 123 | } |
124 | 124 | ||
125 | static struct hw_interrupt_type cobalt_irq_type = { | 125 | static struct irq_chip cobalt_irq_type = { |
126 | .typename = "Cobalt-APIC", | 126 | .typename = "Cobalt-APIC", |
127 | .startup = startup_cobalt_irq, | 127 | .startup = startup_cobalt_irq, |
128 | .shutdown = disable_cobalt_irq, | 128 | .shutdown = disable_cobalt_irq, |
@@ -159,7 +159,7 @@ static void end_piix4_master_irq(unsigned int irq) | |||
159 | spin_unlock_irqrestore(&cobalt_lock, flags); | 159 | spin_unlock_irqrestore(&cobalt_lock, flags); |
160 | } | 160 | } |
161 | 161 | ||
162 | static struct hw_interrupt_type piix4_master_irq_type = { | 162 | static struct irq_chip piix4_master_irq_type = { |
163 | .typename = "PIIX4-master", | 163 | .typename = "PIIX4-master", |
164 | .startup = startup_piix4_master_irq, | 164 | .startup = startup_piix4_master_irq, |
165 | .ack = ack_cobalt_irq, | 165 | .ack = ack_cobalt_irq, |
@@ -167,9 +167,8 @@ static struct hw_interrupt_type piix4_master_irq_type = { | |||
167 | }; | 167 | }; |
168 | 168 | ||
169 | 169 | ||
170 | static struct hw_interrupt_type piix4_virtual_irq_type = { | 170 | static struct irq_chip piix4_virtual_irq_type = { |
171 | .typename = "PIIX4-virtual", | 171 | .typename = "PIIX4-virtual", |
172 | .startup = startup_8259A_irq, | ||
173 | .shutdown = disable_8259A_irq, | 172 | .shutdown = disable_8259A_irq, |
174 | .enable = enable_8259A_irq, | 173 | .enable = enable_8259A_irq, |
175 | .disable = disable_8259A_irq, | 174 | .disable = disable_8259A_irq, |
diff --git a/arch/i386/pci/common.c b/arch/i386/pci/common.c index 6d5ace845e44..cdfcf971098b 100644 --- a/arch/i386/pci/common.c +++ b/arch/i386/pci/common.c | |||
@@ -343,7 +343,6 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) | |||
343 | 343 | ||
344 | void pcibios_disable_device (struct pci_dev *dev) | 344 | void pcibios_disable_device (struct pci_dev *dev) |
345 | { | 345 | { |
346 | pcibios_disable_resources(dev); | ||
347 | if (pcibios_disable_irq) | 346 | if (pcibios_disable_irq) |
348 | pcibios_disable_irq(dev); | 347 | pcibios_disable_irq(dev); |
349 | } | 348 | } |
diff --git a/arch/i386/pci/fixup.c b/arch/i386/pci/fixup.c index 908b410f4c93..c1949ff38d61 100644 --- a/arch/i386/pci/fixup.c +++ b/arch/i386/pci/fixup.c | |||
@@ -343,6 +343,61 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PC, pcie_ro | |||
343 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PC1, pcie_rootport_aspm_quirk ); | 343 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PC1, pcie_rootport_aspm_quirk ); |
344 | 344 | ||
345 | /* | 345 | /* |
346 | * Fixup to mark boot BIOS video selected by BIOS before it changes | ||
347 | * | ||
348 | * From information provided by "Jon Smirl" <jonsmirl@gmail.com> | ||
349 | * | ||
350 | * The standard boot ROM sequence for an x86 machine uses the BIOS | ||
351 | * to select an initial video card for boot display. This boot video | ||
352 | * card will have it's BIOS copied to C0000 in system RAM. | ||
353 | * IORESOURCE_ROM_SHADOW is used to associate the boot video | ||
354 | * card with this copy. On laptops this copy has to be used since | ||
355 | * the main ROM may be compressed or combined with another image. | ||
356 | * See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW | ||
357 | * is marked here since the boot video device will be the only enabled | ||
358 | * video device at this point. | ||
359 | */ | ||
360 | |||
361 | static void __devinit pci_fixup_video(struct pci_dev *pdev) | ||
362 | { | ||
363 | struct pci_dev *bridge; | ||
364 | struct pci_bus *bus; | ||
365 | u16 config; | ||
366 | |||
367 | if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA) | ||
368 | return; | ||
369 | |||
370 | /* Is VGA routed to us? */ | ||
371 | bus = pdev->bus; | ||
372 | while (bus) { | ||
373 | bridge = bus->self; | ||
374 | |||
375 | /* | ||
376 | * From information provided by | ||
377 | * "David Miller" <davem@davemloft.net> | ||
378 | * The bridge control register is valid for PCI header | ||
379 | * type BRIDGE, or CARDBUS. Host to PCI controllers use | ||
380 | * PCI header type NORMAL. | ||
381 | */ | ||
382 | if (bridge | ||
383 | &&((bridge->hdr_type == PCI_HEADER_TYPE_BRIDGE) | ||
384 | ||(bridge->hdr_type == PCI_HEADER_TYPE_CARDBUS))) { | ||
385 | pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, | ||
386 | &config); | ||
387 | if (!(config & PCI_BRIDGE_CTL_VGA)) | ||
388 | return; | ||
389 | } | ||
390 | bus = bus->parent; | ||
391 | } | ||
392 | pci_read_config_word(pdev, PCI_COMMAND, &config); | ||
393 | if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { | ||
394 | pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; | ||
395 | printk(KERN_DEBUG "Boot video device is %s\n", pci_name(pdev)); | ||
396 | } | ||
397 | } | ||
398 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_video); | ||
399 | |||
400 | /* | ||
346 | * Some Toshiba laptops need extra code to enable their TI TSB43AB22/A. | 401 | * Some Toshiba laptops need extra code to enable their TI TSB43AB22/A. |
347 | * | 402 | * |
348 | * We pretend to bring them out of full D3 state, and restore the proper | 403 | * We pretend to bring them out of full D3 state, and restore the proper |
diff --git a/arch/i386/pci/i386.c b/arch/i386/pci/i386.c index 10154a2cac68..98580292f0d4 100644 --- a/arch/i386/pci/i386.c +++ b/arch/i386/pci/i386.c | |||
@@ -242,15 +242,6 @@ int pcibios_enable_resources(struct pci_dev *dev, int mask) | |||
242 | return 0; | 242 | return 0; |
243 | } | 243 | } |
244 | 244 | ||
245 | void pcibios_disable_resources(struct pci_dev *dev) | ||
246 | { | ||
247 | u16 cmd; | ||
248 | |||
249 | pci_read_config_word(dev, PCI_COMMAND, &cmd); | ||
250 | cmd &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY); | ||
251 | pci_write_config_word(dev, PCI_COMMAND, cmd); | ||
252 | } | ||
253 | |||
254 | /* | 245 | /* |
255 | * If we set up a device for bus mastering, we need to check the latency | 246 | * If we set up a device for bus mastering, we need to check the latency |
256 | * timer as certain crappy BIOSes forget to set it properly. | 247 | * timer as certain crappy BIOSes forget to set it properly. |
diff --git a/arch/i386/pci/irq.c b/arch/i386/pci/irq.c index dbc4aae91959..69163998adeb 100644 --- a/arch/i386/pci/irq.c +++ b/arch/i386/pci/irq.c | |||
@@ -255,13 +255,13 @@ static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, i | |||
255 | */ | 255 | */ |
256 | static int pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | 256 | static int pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
257 | { | 257 | { |
258 | static const unsigned int pirqmap[4] = { 3, 2, 5, 1 }; | 258 | static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 }; |
259 | return read_config_nybble(router, 0x55, pirqmap[pirq-1]); | 259 | return read_config_nybble(router, 0x55, pirqmap[pirq-1]); |
260 | } | 260 | } |
261 | 261 | ||
262 | static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | 262 | static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
263 | { | 263 | { |
264 | static const unsigned int pirqmap[4] = { 3, 2, 5, 1 }; | 264 | static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 }; |
265 | write_config_nybble(router, 0x55, pirqmap[pirq-1], irq); | 265 | write_config_nybble(router, 0x55, pirqmap[pirq-1], irq); |
266 | return 1; | 266 | return 1; |
267 | } | 267 | } |
diff --git a/arch/i386/pci/mmconfig.c b/arch/i386/pci/mmconfig.c index d0c3da3aa2aa..c6b6d9bbc453 100644 --- a/arch/i386/pci/mmconfig.c +++ b/arch/i386/pci/mmconfig.c | |||
@@ -154,38 +154,6 @@ static struct pci_raw_ops pci_mmcfg = { | |||
154 | .write = pci_mmcfg_write, | 154 | .write = pci_mmcfg_write, |
155 | }; | 155 | }; |
156 | 156 | ||
157 | |||
158 | static __init void pci_mmcfg_insert_resources(void) | ||
159 | { | ||
160 | #define PCI_MMCFG_RESOURCE_NAME_LEN 19 | ||
161 | int i; | ||
162 | struct resource *res; | ||
163 | char *names; | ||
164 | unsigned num_buses; | ||
165 | |||
166 | res = kcalloc(PCI_MMCFG_RESOURCE_NAME_LEN + sizeof(*res), | ||
167 | pci_mmcfg_config_num, GFP_KERNEL); | ||
168 | |||
169 | if (!res) { | ||
170 | printk(KERN_ERR "PCI: Unable to allocate MMCONFIG resources\n"); | ||
171 | return; | ||
172 | } | ||
173 | |||
174 | names = (void *)&res[pci_mmcfg_config_num]; | ||
175 | for (i = 0; i < pci_mmcfg_config_num; i++, res++) { | ||
176 | num_buses = pci_mmcfg_config[i].end_bus_number - | ||
177 | pci_mmcfg_config[i].start_bus_number + 1; | ||
178 | res->name = names; | ||
179 | snprintf(names, PCI_MMCFG_RESOURCE_NAME_LEN, "PCI MMCONFIG %u", | ||
180 | pci_mmcfg_config[i].pci_segment_group_number); | ||
181 | res->start = pci_mmcfg_config[i].base_address; | ||
182 | res->end = res->start + (num_buses << 20) - 1; | ||
183 | res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; | ||
184 | insert_resource(&iomem_resource, res); | ||
185 | names += PCI_MMCFG_RESOURCE_NAME_LEN; | ||
186 | } | ||
187 | } | ||
188 | |||
189 | /* K8 systems have some devices (typically in the builtin northbridge) | 157 | /* K8 systems have some devices (typically in the builtin northbridge) |
190 | that are only accessible using type1 | 158 | that are only accessible using type1 |
191 | Normally this can be expressed in the MCFG by not listing them | 159 | Normally this can be expressed in the MCFG by not listing them |
@@ -222,8 +190,6 @@ static __init void unreachable_devices(void) | |||
222 | } | 190 | } |
223 | } | 191 | } |
224 | 192 | ||
225 | |||
226 | |||
227 | void __init pci_mmcfg_init(int type) | 193 | void __init pci_mmcfg_init(int type) |
228 | { | 194 | { |
229 | if ((pci_probe & PCI_PROBE_MMCONF) == 0) | 195 | if ((pci_probe & PCI_PROBE_MMCONF) == 0) |
@@ -251,5 +217,4 @@ void __init pci_mmcfg_init(int type) | |||
251 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; | 217 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; |
252 | 218 | ||
253 | unreachable_devices(); | 219 | unreachable_devices(); |
254 | pci_mmcfg_insert_resources(); | ||
255 | } | 220 | } |
diff --git a/arch/i386/pci/pci.h b/arch/i386/pci/pci.h index ad065cebd7b9..a0a25180b61a 100644 --- a/arch/i386/pci/pci.h +++ b/arch/i386/pci/pci.h | |||
@@ -43,7 +43,6 @@ extern unsigned int pcibios_max_latency; | |||
43 | 43 | ||
44 | void pcibios_resource_survey(void); | 44 | void pcibios_resource_survey(void); |
45 | int pcibios_enable_resources(struct pci_dev *, int); | 45 | int pcibios_enable_resources(struct pci_dev *, int); |
46 | void pcibios_disable_resources(struct pci_dev *); | ||
47 | 46 | ||
48 | /* pci-pc.c */ | 47 | /* pci-pc.c */ |
49 | 48 | ||
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 70f7eb9fed35..683b12c6f76c 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -341,6 +341,7 @@ config NUMA | |||
341 | bool "NUMA support" | 341 | bool "NUMA support" |
342 | depends on !IA64_HP_SIM && !FLATMEM | 342 | depends on !IA64_HP_SIM && !FLATMEM |
343 | default y if IA64_SGI_SN2 | 343 | default y if IA64_SGI_SN2 |
344 | select ACPI_NUMA if ACPI | ||
344 | help | 345 | help |
345 | Say Y to compile the kernel to support NUMA (Non-Uniform Memory | 346 | Say Y to compile the kernel to support NUMA (Non-Uniform Memory |
346 | Access). This option is for configuring high-end multiprocessor | 347 | Access). This option is for configuring high-end multiprocessor |
@@ -483,6 +484,15 @@ source "net/Kconfig" | |||
483 | 484 | ||
484 | source "drivers/Kconfig" | 485 | source "drivers/Kconfig" |
485 | 486 | ||
487 | config MSPEC | ||
488 | tristate "Memory special operations driver" | ||
489 | depends on IA64 | ||
490 | select IA64_UNCACHED_ALLOCATOR | ||
491 | help | ||
492 | If you have an ia64 and you want to enable memory special | ||
493 | operations support (formerly known as fetchop), say Y here, | ||
494 | otherwise say N. | ||
495 | |||
486 | source "fs/Kconfig" | 496 | source "fs/Kconfig" |
487 | 497 | ||
488 | source "lib/Kconfig" | 498 | source "lib/Kconfig" |
diff --git a/arch/ia64/hp/sim/Kconfig b/arch/ia64/hp/sim/Kconfig index 18ccb1266e18..f92306bbedb8 100644 --- a/arch/ia64/hp/sim/Kconfig +++ b/arch/ia64/hp/sim/Kconfig | |||
@@ -13,8 +13,8 @@ config HP_SIMSERIAL_CONSOLE | |||
13 | depends on HP_SIMSERIAL | 13 | depends on HP_SIMSERIAL |
14 | 14 | ||
15 | config HP_SIMSCSI | 15 | config HP_SIMSCSI |
16 | tristate "Simulated SCSI disk" | 16 | bool "Simulated SCSI disk" |
17 | depends on SCSI | 17 | depends on SCSI=y |
18 | 18 | ||
19 | endmenu | 19 | endmenu |
20 | 20 | ||
diff --git a/arch/ia64/hp/sim/hpsim_irq.c b/arch/ia64/hp/sim/hpsim_irq.c index 8145547bb52d..c2f58ff364e7 100644 --- a/arch/ia64/hp/sim/hpsim_irq.c +++ b/arch/ia64/hp/sim/hpsim_irq.c | |||
@@ -27,7 +27,7 @@ hpsim_set_affinity_noop (unsigned int a, cpumask_t b) | |||
27 | } | 27 | } |
28 | 28 | ||
29 | static struct hw_interrupt_type irq_type_hp_sim = { | 29 | static struct hw_interrupt_type irq_type_hp_sim = { |
30 | .typename = "hpsim", | 30 | .name = "hpsim", |
31 | .startup = hpsim_irq_startup, | 31 | .startup = hpsim_irq_startup, |
32 | .shutdown = hpsim_irq_noop, | 32 | .shutdown = hpsim_irq_noop, |
33 | .enable = hpsim_irq_noop, | 33 | .enable = hpsim_irq_noop, |
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index 9bf15fefa7e4..60d64950e3c2 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
@@ -426,7 +426,7 @@ iosapic_end_level_irq (unsigned int irq) | |||
426 | #define iosapic_ack_level_irq nop | 426 | #define iosapic_ack_level_irq nop |
427 | 427 | ||
428 | struct hw_interrupt_type irq_type_iosapic_level = { | 428 | struct hw_interrupt_type irq_type_iosapic_level = { |
429 | .typename = "IO-SAPIC-level", | 429 | .name = "IO-SAPIC-level", |
430 | .startup = iosapic_startup_level_irq, | 430 | .startup = iosapic_startup_level_irq, |
431 | .shutdown = iosapic_shutdown_level_irq, | 431 | .shutdown = iosapic_shutdown_level_irq, |
432 | .enable = iosapic_enable_level_irq, | 432 | .enable = iosapic_enable_level_irq, |
@@ -473,7 +473,7 @@ iosapic_ack_edge_irq (unsigned int irq) | |||
473 | #define iosapic_end_edge_irq nop | 473 | #define iosapic_end_edge_irq nop |
474 | 474 | ||
475 | struct hw_interrupt_type irq_type_iosapic_edge = { | 475 | struct hw_interrupt_type irq_type_iosapic_edge = { |
476 | .typename = "IO-SAPIC-edge", | 476 | .name = "IO-SAPIC-edge", |
477 | .startup = iosapic_startup_edge_irq, | 477 | .startup = iosapic_startup_edge_irq, |
478 | .shutdown = iosapic_disable_edge_irq, | 478 | .shutdown = iosapic_disable_edge_irq, |
479 | .enable = iosapic_enable_edge_irq, | 479 | .enable = iosapic_enable_edge_irq, |
@@ -664,7 +664,7 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery, | |||
664 | printk(KERN_WARNING | 664 | printk(KERN_WARNING |
665 | "%s: changing vector %d from %s to %s\n", | 665 | "%s: changing vector %d from %s to %s\n", |
666 | __FUNCTION__, vector, | 666 | __FUNCTION__, vector, |
667 | idesc->chip->typename, irq_type->typename); | 667 | idesc->chip->name, irq_type->name); |
668 | idesc->chip = irq_type; | 668 | idesc->chip = irq_type; |
669 | } | 669 | } |
670 | return 0; | 670 | return 0; |
diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c index f07c0864b0b4..54d55e4d64f7 100644 --- a/arch/ia64/kernel/irq.c +++ b/arch/ia64/kernel/irq.c | |||
@@ -76,7 +76,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
76 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 76 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
77 | } | 77 | } |
78 | #endif | 78 | #endif |
79 | seq_printf(p, " %14s", irq_desc[i].chip->typename); | 79 | seq_printf(p, " %14s", irq_desc[i].chip->name); |
80 | seq_printf(p, " %s", action->name); | 80 | seq_printf(p, " %s", action->name); |
81 | 81 | ||
82 | for (action=action->next; action; action = action->next) | 82 | for (action=action->next; action; action = action->next) |
@@ -197,7 +197,7 @@ void fixup_irqs(void) | |||
197 | struct pt_regs *old_regs = set_irq_regs(NULL); | 197 | struct pt_regs *old_regs = set_irq_regs(NULL); |
198 | 198 | ||
199 | vectors_in_migration[irq]=0; | 199 | vectors_in_migration[irq]=0; |
200 | __do_IRQ(irq); | 200 | generic_handle_irq(irq); |
201 | set_irq_regs(old_regs); | 201 | set_irq_regs(old_regs); |
202 | } | 202 | } |
203 | } | 203 | } |
diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c index 9c6dafa2d0df..ba3ba8bc50be 100644 --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c | |||
@@ -186,7 +186,7 @@ ia64_handle_irq (ia64_vector vector, struct pt_regs *regs) | |||
186 | ia64_setreg(_IA64_REG_CR_TPR, vector); | 186 | ia64_setreg(_IA64_REG_CR_TPR, vector); |
187 | ia64_srlz_d(); | 187 | ia64_srlz_d(); |
188 | 188 | ||
189 | __do_IRQ(local_vector_to_irq(vector)); | 189 | generic_handle_irq(local_vector_to_irq(vector)); |
190 | 190 | ||
191 | /* | 191 | /* |
192 | * Disable interrupts and send EOI: | 192 | * Disable interrupts and send EOI: |
@@ -242,7 +242,7 @@ void ia64_process_pending_intr(void) | |||
242 | * Probably could shared code. | 242 | * Probably could shared code. |
243 | */ | 243 | */ |
244 | vectors_in_migration[local_vector_to_irq(vector)]=0; | 244 | vectors_in_migration[local_vector_to_irq(vector)]=0; |
245 | __do_IRQ(local_vector_to_irq(vector)); | 245 | generic_handle_irq(local_vector_to_irq(vector)); |
246 | set_irq_regs(old_regs); | 246 | set_irq_regs(old_regs); |
247 | 247 | ||
248 | /* | 248 | /* |
diff --git a/arch/ia64/kernel/irq_lsapic.c b/arch/ia64/kernel/irq_lsapic.c index 1ab58b09f3d7..c2f07beb1759 100644 --- a/arch/ia64/kernel/irq_lsapic.c +++ b/arch/ia64/kernel/irq_lsapic.c | |||
@@ -34,7 +34,7 @@ static int lsapic_retrigger(unsigned int irq) | |||
34 | } | 34 | } |
35 | 35 | ||
36 | struct hw_interrupt_type irq_type_ia64_lsapic = { | 36 | struct hw_interrupt_type irq_type_ia64_lsapic = { |
37 | .typename = "LSAPIC", | 37 | .name = "LSAPIC", |
38 | .startup = lsapic_noop_startup, | 38 | .startup = lsapic_noop_startup, |
39 | .shutdown = lsapic_noop, | 39 | .shutdown = lsapic_noop, |
40 | .enable = lsapic_noop, | 40 | .enable = lsapic_noop, |
diff --git a/arch/ia64/kernel/mca_drv.c b/arch/ia64/kernel/mca_drv.c index a45009d2bc90..afc1403799c9 100644 --- a/arch/ia64/kernel/mca_drv.c +++ b/arch/ia64/kernel/mca_drv.c | |||
@@ -435,6 +435,50 @@ is_mca_global(peidx_table_t *peidx, pal_bus_check_info_t *pbci, | |||
435 | } | 435 | } |
436 | 436 | ||
437 | /** | 437 | /** |
438 | * get_target_identifier - Get the valid Cache or Bus check target identifier. | ||
439 | * @peidx: pointer of index of processor error section | ||
440 | * | ||
441 | * Return value: | ||
442 | * target address on Success / 0 on Failue | ||
443 | */ | ||
444 | static u64 | ||
445 | get_target_identifier(peidx_table_t *peidx) | ||
446 | { | ||
447 | u64 target_address = 0; | ||
448 | sal_log_mod_error_info_t *smei; | ||
449 | pal_cache_check_info_t *pcci; | ||
450 | int i, level = 9; | ||
451 | |||
452 | /* | ||
453 | * Look through the cache checks for a valid target identifier | ||
454 | * If more than one valid target identifier, return the one | ||
455 | * with the lowest cache level. | ||
456 | */ | ||
457 | for (i = 0; i < peidx_cache_check_num(peidx); i++) { | ||
458 | smei = (sal_log_mod_error_info_t *)peidx_cache_check(peidx, i); | ||
459 | if (smei->valid.target_identifier && smei->target_identifier) { | ||
460 | pcci = (pal_cache_check_info_t *)&(smei->check_info); | ||
461 | if (!target_address || (pcci->level < level)) { | ||
462 | target_address = smei->target_identifier; | ||
463 | level = pcci->level; | ||
464 | continue; | ||
465 | } | ||
466 | } | ||
467 | } | ||
468 | if (target_address) | ||
469 | return target_address; | ||
470 | |||
471 | /* | ||
472 | * Look at the bus check for a valid target identifier | ||
473 | */ | ||
474 | smei = peidx_bus_check(peidx, 0); | ||
475 | if (smei && smei->valid.target_identifier) | ||
476 | return smei->target_identifier; | ||
477 | |||
478 | return 0; | ||
479 | } | ||
480 | |||
481 | /** | ||
438 | * recover_from_read_error - Try to recover the errors which type are "read"s. | 482 | * recover_from_read_error - Try to recover the errors which type are "read"s. |
439 | * @slidx: pointer of index of SAL error record | 483 | * @slidx: pointer of index of SAL error record |
440 | * @peidx: pointer of index of processor error section | 484 | * @peidx: pointer of index of processor error section |
@@ -450,13 +494,14 @@ recover_from_read_error(slidx_table_t *slidx, | |||
450 | peidx_table_t *peidx, pal_bus_check_info_t *pbci, | 494 | peidx_table_t *peidx, pal_bus_check_info_t *pbci, |
451 | struct ia64_sal_os_state *sos) | 495 | struct ia64_sal_os_state *sos) |
452 | { | 496 | { |
453 | sal_log_mod_error_info_t *smei; | 497 | u64 target_identifier; |
454 | pal_min_state_area_t *pmsa; | 498 | pal_min_state_area_t *pmsa; |
455 | struct ia64_psr *psr1, *psr2; | 499 | struct ia64_psr *psr1, *psr2; |
456 | ia64_fptr_t *mca_hdlr_bh = (ia64_fptr_t*)mca_handler_bhhook; | 500 | ia64_fptr_t *mca_hdlr_bh = (ia64_fptr_t*)mca_handler_bhhook; |
457 | 501 | ||
458 | /* Is target address valid? */ | 502 | /* Is target address valid? */ |
459 | if (!pbci->tv) | 503 | target_identifier = get_target_identifier(peidx); |
504 | if (!target_identifier) | ||
460 | return fatal_mca("target address not valid"); | 505 | return fatal_mca("target address not valid"); |
461 | 506 | ||
462 | /* | 507 | /* |
@@ -487,32 +532,28 @@ recover_from_read_error(slidx_table_t *slidx, | |||
487 | pmsa = sos->pal_min_state; | 532 | pmsa = sos->pal_min_state; |
488 | if (psr1->cpl != 0 || | 533 | if (psr1->cpl != 0 || |
489 | ((psr2->cpl != 0) && mca_recover_range(pmsa->pmsa_iip))) { | 534 | ((psr2->cpl != 0) && mca_recover_range(pmsa->pmsa_iip))) { |
490 | smei = peidx_bus_check(peidx, 0); | 535 | /* |
491 | if (smei->valid.target_identifier) { | 536 | * setup for resume to bottom half of MCA, |
492 | /* | 537 | * "mca_handler_bhhook" |
493 | * setup for resume to bottom half of MCA, | 538 | */ |
494 | * "mca_handler_bhhook" | 539 | /* pass to bhhook as argument (gr8, ...) */ |
495 | */ | 540 | pmsa->pmsa_gr[8-1] = target_identifier; |
496 | /* pass to bhhook as argument (gr8, ...) */ | 541 | pmsa->pmsa_gr[9-1] = pmsa->pmsa_iip; |
497 | pmsa->pmsa_gr[8-1] = smei->target_identifier; | 542 | pmsa->pmsa_gr[10-1] = pmsa->pmsa_ipsr; |
498 | pmsa->pmsa_gr[9-1] = pmsa->pmsa_iip; | 543 | /* set interrupted return address (but no use) */ |
499 | pmsa->pmsa_gr[10-1] = pmsa->pmsa_ipsr; | 544 | pmsa->pmsa_br0 = pmsa->pmsa_iip; |
500 | /* set interrupted return address (but no use) */ | 545 | /* change resume address to bottom half */ |
501 | pmsa->pmsa_br0 = pmsa->pmsa_iip; | 546 | pmsa->pmsa_iip = mca_hdlr_bh->fp; |
502 | /* change resume address to bottom half */ | 547 | pmsa->pmsa_gr[1-1] = mca_hdlr_bh->gp; |
503 | pmsa->pmsa_iip = mca_hdlr_bh->fp; | 548 | /* set cpl with kernel mode */ |
504 | pmsa->pmsa_gr[1-1] = mca_hdlr_bh->gp; | 549 | psr2 = (struct ia64_psr *)&pmsa->pmsa_ipsr; |
505 | /* set cpl with kernel mode */ | 550 | psr2->cpl = 0; |
506 | psr2 = (struct ia64_psr *)&pmsa->pmsa_ipsr; | 551 | psr2->ri = 0; |
507 | psr2->cpl = 0; | 552 | psr2->bn = 1; |
508 | psr2->ri = 0; | 553 | psr2->i = 0; |
509 | psr2->bn = 1; | 554 | |
510 | psr2->i = 0; | 555 | return mca_recovered("user memory corruption. " |
511 | |||
512 | return mca_recovered("user memory corruption. " | ||
513 | "kill affected process - recovered."); | 556 | "kill affected process - recovered."); |
514 | } | ||
515 | |||
516 | } | 557 | } |
517 | 558 | ||
518 | return fatal_mca("kernel context not recovered, iip 0x%lx\n", | 559 | return fatal_mca("kernel context not recovered, iip 0x%lx\n", |
diff --git a/arch/ia64/kernel/sal.c b/arch/ia64/kernel/sal.c index 642fdc7b969d..20bad78b5073 100644 --- a/arch/ia64/kernel/sal.c +++ b/arch/ia64/kernel/sal.c | |||
@@ -223,12 +223,13 @@ static void __init sal_desc_ap_wakeup(void *p) { } | |||
223 | */ | 223 | */ |
224 | static int sal_cache_flush_drops_interrupts; | 224 | static int sal_cache_flush_drops_interrupts; |
225 | 225 | ||
226 | static void __init | 226 | void __init |
227 | check_sal_cache_flush (void) | 227 | check_sal_cache_flush (void) |
228 | { | 228 | { |
229 | unsigned long flags; | 229 | unsigned long flags; |
230 | int cpu; | 230 | int cpu; |
231 | u64 vector; | 231 | u64 vector, cache_type = 3; |
232 | struct ia64_sal_retval isrv; | ||
232 | 233 | ||
233 | cpu = get_cpu(); | 234 | cpu = get_cpu(); |
234 | local_irq_save(flags); | 235 | local_irq_save(flags); |
@@ -243,7 +244,10 @@ check_sal_cache_flush (void) | |||
243 | while (!ia64_get_irr(IA64_TIMER_VECTOR)) | 244 | while (!ia64_get_irr(IA64_TIMER_VECTOR)) |
244 | cpu_relax(); | 245 | cpu_relax(); |
245 | 246 | ||
246 | ia64_sal_cache_flush(3); | 247 | SAL_CALL(isrv, SAL_CACHE_FLUSH, cache_type, 0, 0, 0, 0, 0, 0); |
248 | |||
249 | if (isrv.status) | ||
250 | printk(KERN_ERR "SAL_CAL_FLUSH failed with %ld\n", isrv.status); | ||
247 | 251 | ||
248 | if (ia64_get_irr(IA64_TIMER_VECTOR)) { | 252 | if (ia64_get_irr(IA64_TIMER_VECTOR)) { |
249 | vector = ia64_get_ivr(); | 253 | vector = ia64_get_ivr(); |
@@ -331,7 +335,6 @@ ia64_sal_init (struct ia64_sal_systab *systab) | |||
331 | p += SAL_DESC_SIZE(*p); | 335 | p += SAL_DESC_SIZE(*p); |
332 | } | 336 | } |
333 | 337 | ||
334 | check_sal_cache_flush(); | ||
335 | } | 338 | } |
336 | 339 | ||
337 | int | 340 | int |
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index c4caa8003492..d10404a41756 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
@@ -457,6 +457,8 @@ setup_arch (char **cmdline_p) | |||
457 | cpu_init(); /* initialize the bootstrap CPU */ | 457 | cpu_init(); /* initialize the bootstrap CPU */ |
458 | mmu_context_init(); /* initialize context_id bitmap */ | 458 | mmu_context_init(); /* initialize context_id bitmap */ |
459 | 459 | ||
460 | check_sal_cache_flush(); | ||
461 | |||
460 | #ifdef CONFIG_ACPI | 462 | #ifdef CONFIG_ACPI |
461 | acpi_boot_init(); | 463 | acpi_boot_init(); |
462 | #endif | 464 | #endif |
diff --git a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c index 657ac99a451c..6ab95ceaf9d4 100644 --- a/arch/ia64/kernel/smp.c +++ b/arch/ia64/kernel/smp.c | |||
@@ -108,7 +108,7 @@ cpu_die(void) | |||
108 | } | 108 | } |
109 | 109 | ||
110 | irqreturn_t | 110 | irqreturn_t |
111 | handle_IPI (int irq, void *dev_id, struct pt_regs *regs) | 111 | handle_IPI (int irq, void *dev_id) |
112 | { | 112 | { |
113 | int this_cpu = get_cpu(); | 113 | int this_cpu = get_cpu(); |
114 | unsigned long *pending_ipis = &__ia64_per_cpu_var(ipi_operation); | 114 | unsigned long *pending_ipis = &__ia64_per_cpu_var(ipi_operation); |
@@ -328,10 +328,14 @@ int | |||
328 | smp_call_function (void (*func) (void *info), void *info, int nonatomic, int wait) | 328 | smp_call_function (void (*func) (void *info), void *info, int nonatomic, int wait) |
329 | { | 329 | { |
330 | struct call_data_struct data; | 330 | struct call_data_struct data; |
331 | int cpus = num_online_cpus()-1; | 331 | int cpus; |
332 | 332 | ||
333 | if (!cpus) | 333 | spin_lock(&call_lock); |
334 | cpus = num_online_cpus() - 1; | ||
335 | if (!cpus) { | ||
336 | spin_unlock(&call_lock); | ||
334 | return 0; | 337 | return 0; |
338 | } | ||
335 | 339 | ||
336 | /* Can deadlock when called with interrupts disabled */ | 340 | /* Can deadlock when called with interrupts disabled */ |
337 | WARN_ON(irqs_disabled()); | 341 | WARN_ON(irqs_disabled()); |
@@ -343,8 +347,6 @@ smp_call_function (void (*func) (void *info), void *info, int nonatomic, int wai | |||
343 | if (wait) | 347 | if (wait) |
344 | atomic_set(&data.finished, 0); | 348 | atomic_set(&data.finished, 0); |
345 | 349 | ||
346 | spin_lock(&call_lock); | ||
347 | |||
348 | call_data = &data; | 350 | call_data = &data; |
349 | mb(); /* ensure store to call_data precedes setting of IPI_CALL_FUNC */ | 351 | mb(); /* ensure store to call_data precedes setting of IPI_CALL_FUNC */ |
350 | send_IPI_allbutself(IPI_CALL_FUNC); | 352 | send_IPI_allbutself(IPI_CALL_FUNC); |
diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S index b3b2e389d6b2..d6083a0936f4 100644 --- a/arch/ia64/kernel/vmlinux.lds.S +++ b/arch/ia64/kernel/vmlinux.lds.S | |||
@@ -128,13 +128,7 @@ SECTIONS | |||
128 | .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) | 128 | .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) |
129 | { | 129 | { |
130 | __initcall_start = .; | 130 | __initcall_start = .; |
131 | *(.initcall1.init) | 131 | INITCALLS |
132 | *(.initcall2.init) | ||
133 | *(.initcall3.init) | ||
134 | *(.initcall4.init) | ||
135 | *(.initcall5.init) | ||
136 | *(.initcall6.init) | ||
137 | *(.initcall7.init) | ||
138 | __initcall_end = .; | 132 | __initcall_end = .; |
139 | } | 133 | } |
140 | 134 | ||
diff --git a/arch/ia64/mm/hugetlbpage.c b/arch/ia64/mm/hugetlbpage.c index eee5c1cfbe32..f3a9585e98a8 100644 --- a/arch/ia64/mm/hugetlbpage.c +++ b/arch/ia64/mm/hugetlbpage.c | |||
@@ -70,8 +70,10 @@ huge_pte_offset (struct mm_struct *mm, unsigned long addr) | |||
70 | * Don't actually need to do any preparation, but need to make sure | 70 | * Don't actually need to do any preparation, but need to make sure |
71 | * the address is in the right region. | 71 | * the address is in the right region. |
72 | */ | 72 | */ |
73 | int prepare_hugepage_range(unsigned long addr, unsigned long len) | 73 | int prepare_hugepage_range(unsigned long addr, unsigned long len, pgoff_t pgoff) |
74 | { | 74 | { |
75 | if (pgoff & (~HPAGE_MASK >> PAGE_SHIFT)) | ||
76 | return -EINVAL; | ||
75 | if (len & ~HPAGE_MASK) | 77 | if (len & ~HPAGE_MASK) |
76 | return -EINVAL; | 78 | return -EINVAL; |
77 | if (addr & ~HPAGE_MASK) | 79 | if (addr & ~HPAGE_MASK) |
diff --git a/arch/ia64/pci/Makefile b/arch/ia64/pci/Makefile index e66889e6922a..fb14dc520d2d 100644 --- a/arch/ia64/pci/Makefile +++ b/arch/ia64/pci/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | # | 1 | # |
2 | # Makefile for the ia64-specific parts of the pci bus | 2 | # Makefile for the ia64-specific parts of the pci bus |
3 | # | 3 | # |
4 | obj-y := pci.o | 4 | obj-y := pci.o fixup.o |
diff --git a/arch/ia64/pci/fixup.c b/arch/ia64/pci/fixup.c new file mode 100644 index 000000000000..245dc1fedc24 --- /dev/null +++ b/arch/ia64/pci/fixup.c | |||
@@ -0,0 +1,69 @@ | |||
1 | /* | ||
2 | * Exceptions for specific devices. Usually work-arounds for fatal design flaws. | ||
3 | * Derived from fixup.c of i386 tree. | ||
4 | */ | ||
5 | |||
6 | #include <linux/pci.h> | ||
7 | #include <linux/init.h> | ||
8 | |||
9 | #include <asm/machvec.h> | ||
10 | |||
11 | /* | ||
12 | * Fixup to mark boot BIOS video selected by BIOS before it changes | ||
13 | * | ||
14 | * From information provided by "Jon Smirl" <jonsmirl@gmail.com> | ||
15 | * | ||
16 | * The standard boot ROM sequence for an x86 machine uses the BIOS | ||
17 | * to select an initial video card for boot display. This boot video | ||
18 | * card will have it's BIOS copied to C0000 in system RAM. | ||
19 | * IORESOURCE_ROM_SHADOW is used to associate the boot video | ||
20 | * card with this copy. On laptops this copy has to be used since | ||
21 | * the main ROM may be compressed or combined with another image. | ||
22 | * See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW | ||
23 | * is marked here since the boot video device will be the only enabled | ||
24 | * video device at this point. | ||
25 | */ | ||
26 | |||
27 | static void __devinit pci_fixup_video(struct pci_dev *pdev) | ||
28 | { | ||
29 | struct pci_dev *bridge; | ||
30 | struct pci_bus *bus; | ||
31 | u16 config; | ||
32 | |||
33 | if ((strcmp(platform_name, "dig") != 0) | ||
34 | && (strcmp(platform_name, "hpzx1") != 0)) | ||
35 | return; | ||
36 | /* Maybe, this machine supports legacy memory map. */ | ||
37 | |||
38 | if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA) | ||
39 | return; | ||
40 | |||
41 | /* Is VGA routed to us? */ | ||
42 | bus = pdev->bus; | ||
43 | while (bus) { | ||
44 | bridge = bus->self; | ||
45 | |||
46 | /* | ||
47 | * From information provided by | ||
48 | * "David Miller" <davem@davemloft.net> | ||
49 | * The bridge control register is valid for PCI header | ||
50 | * type BRIDGE, or CARDBUS. Host to PCI controllers use | ||
51 | * PCI header type NORMAL. | ||
52 | */ | ||
53 | if (bridge | ||
54 | &&((bridge->hdr_type == PCI_HEADER_TYPE_BRIDGE) | ||
55 | ||(bridge->hdr_type == PCI_HEADER_TYPE_CARDBUS))) { | ||
56 | pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, | ||
57 | &config); | ||
58 | if (!(config & PCI_BRIDGE_CTL_VGA)) | ||
59 | return; | ||
60 | } | ||
61 | bus = bus->parent; | ||
62 | } | ||
63 | pci_read_config_word(pdev, PCI_COMMAND, &config); | ||
64 | if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { | ||
65 | pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; | ||
66 | printk(KERN_DEBUG "Boot video device is %s\n", pci_name(pdev)); | ||
67 | } | ||
68 | } | ||
69 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_video); | ||
diff --git a/arch/ia64/sn/kernel/bte.c b/arch/ia64/sn/kernel/bte.c index 7f73ad4408aa..ff1c55601178 100644 --- a/arch/ia64/sn/kernel/bte.c +++ b/arch/ia64/sn/kernel/bte.c | |||
@@ -381,14 +381,13 @@ bte_result_t bte_unaligned_copy(u64 src, u64 dest, u64 len, u64 mode) | |||
381 | * bcopy to the destination. | 381 | * bcopy to the destination. |
382 | */ | 382 | */ |
383 | 383 | ||
384 | /* Add the leader from source */ | ||
385 | headBteLen = len + (src & L1_CACHE_MASK); | ||
386 | /* Add the trailing bytes from footer. */ | ||
387 | headBteLen += L1_CACHE_BYTES - (headBteLen & L1_CACHE_MASK); | ||
388 | headBteSource = src & ~L1_CACHE_MASK; | ||
389 | headBcopySrcOffset = src & L1_CACHE_MASK; | 384 | headBcopySrcOffset = src & L1_CACHE_MASK; |
390 | headBcopyDest = dest; | 385 | headBcopyDest = dest; |
391 | headBcopyLen = len; | 386 | headBcopyLen = len; |
387 | |||
388 | headBteSource = src - headBcopySrcOffset; | ||
389 | /* Add the leading and trailing bytes from source */ | ||
390 | headBteLen = L1_CACHE_ALIGN(len + headBcopySrcOffset); | ||
392 | } | 391 | } |
393 | 392 | ||
394 | if (headBcopyLen > 0) { | 393 | if (headBcopyLen > 0) { |
diff --git a/arch/ia64/sn/kernel/irq.c b/arch/ia64/sn/kernel/irq.c index 7bb6ad188ba3..0b49459a878a 100644 --- a/arch/ia64/sn/kernel/irq.c +++ b/arch/ia64/sn/kernel/irq.c | |||
@@ -201,7 +201,7 @@ static void sn_set_affinity_irq(unsigned int irq, cpumask_t mask) | |||
201 | } | 201 | } |
202 | 202 | ||
203 | struct hw_interrupt_type irq_type_sn = { | 203 | struct hw_interrupt_type irq_type_sn = { |
204 | .typename = "SN hub", | 204 | .name = "SN hub", |
205 | .startup = sn_startup_irq, | 205 | .startup = sn_startup_irq, |
206 | .shutdown = sn_shutdown_irq, | 206 | .shutdown = sn_shutdown_irq, |
207 | .enable = sn_enable_irq, | 207 | .enable = sn_enable_irq, |
diff --git a/arch/m32r/kernel/vmlinux.lds.S b/arch/m32r/kernel/vmlinux.lds.S index 13c7bb698e37..358b9cee2c65 100644 --- a/arch/m32r/kernel/vmlinux.lds.S +++ b/arch/m32r/kernel/vmlinux.lds.S | |||
@@ -83,13 +83,7 @@ SECTIONS | |||
83 | __setup_end = .; | 83 | __setup_end = .; |
84 | __initcall_start = .; | 84 | __initcall_start = .; |
85 | .initcall.init : { | 85 | .initcall.init : { |
86 | *(.initcall1.init) | 86 | INITCALLS |
87 | *(.initcall2.init) | ||
88 | *(.initcall3.init) | ||
89 | *(.initcall4.init) | ||
90 | *(.initcall5.init) | ||
91 | *(.initcall6.init) | ||
92 | *(.initcall7.init) | ||
93 | } | 87 | } |
94 | __initcall_end = .; | 88 | __initcall_end = .; |
95 | __con_initcall_start = .; | 89 | __con_initcall_start = .; |
diff --git a/arch/m68k/kernel/vmlinux-std.lds b/arch/m68k/kernel/vmlinux-std.lds index 69d1d3d30c78..d2794452b195 100644 --- a/arch/m68k/kernel/vmlinux-std.lds +++ b/arch/m68k/kernel/vmlinux-std.lds | |||
@@ -54,13 +54,7 @@ SECTIONS | |||
54 | __setup_end = .; | 54 | __setup_end = .; |
55 | __initcall_start = .; | 55 | __initcall_start = .; |
56 | .initcall.init : { | 56 | .initcall.init : { |
57 | *(.initcall1.init) | 57 | INITCALLS |
58 | *(.initcall2.init) | ||
59 | *(.initcall3.init) | ||
60 | *(.initcall4.init) | ||
61 | *(.initcall5.init) | ||
62 | *(.initcall6.init) | ||
63 | *(.initcall7.init) | ||
64 | } | 58 | } |
65 | __initcall_end = .; | 59 | __initcall_end = .; |
66 | __con_initcall_start = .; | 60 | __con_initcall_start = .; |
diff --git a/arch/m68k/kernel/vmlinux-sun3.lds b/arch/m68k/kernel/vmlinux-sun3.lds index 65cc39c24185..2550b4ae2732 100644 --- a/arch/m68k/kernel/vmlinux-sun3.lds +++ b/arch/m68k/kernel/vmlinux-sun3.lds | |||
@@ -48,13 +48,7 @@ __init_begin = .; | |||
48 | __setup_end = .; | 48 | __setup_end = .; |
49 | __initcall_start = .; | 49 | __initcall_start = .; |
50 | .initcall.init : { | 50 | .initcall.init : { |
51 | *(.initcall1.init) | 51 | INITCALLS |
52 | *(.initcall2.init) | ||
53 | *(.initcall3.init) | ||
54 | *(.initcall4.init) | ||
55 | *(.initcall5.init) | ||
56 | *(.initcall6.init) | ||
57 | *(.initcall7.init) | ||
58 | } | 52 | } |
59 | __initcall_end = .; | 53 | __initcall_end = .; |
60 | __con_initcall_start = .; | 54 | __con_initcall_start = .; |
diff --git a/arch/m68knommu/kernel/setup.c b/arch/m68knommu/kernel/setup.c index bde9811cf98c..7b21959eaeae 100644 --- a/arch/m68knommu/kernel/setup.c +++ b/arch/m68knommu/kernel/setup.c | |||
@@ -62,7 +62,7 @@ int (*mach_kbdrate) (struct kbd_repeat *); | |||
62 | void (*mach_kbd_leds) (unsigned int); | 62 | void (*mach_kbd_leds) (unsigned int); |
63 | /* machine dependent irq functions */ | 63 | /* machine dependent irq functions */ |
64 | void (*mach_init_IRQ) (void); | 64 | void (*mach_init_IRQ) (void); |
65 | irqreturn_t (*(*mach_default_handler)[]) (int, void *, struct pt_regs *); | 65 | irq_handler_t mach_default_handler; |
66 | int (*mach_get_irq_list) (struct seq_file *, void *); | 66 | int (*mach_get_irq_list) (struct seq_file *, void *); |
67 | void (*mach_process_int) (int irq, struct pt_regs *fp); | 67 | void (*mach_process_int) (int irq, struct pt_regs *fp); |
68 | void (*mach_trap_init) (void); | 68 | void (*mach_trap_init) (void); |
diff --git a/arch/m68knommu/kernel/time.c b/arch/m68knommu/kernel/time.c index c5667bdddd5e..9226264abf1a 100644 --- a/arch/m68knommu/kernel/time.c +++ b/arch/m68knommu/kernel/time.c | |||
@@ -54,7 +54,7 @@ static irqreturn_t timer_interrupt(int irq, void *dummy, struct pt_regs * regs) | |||
54 | update_process_times(user_mode(regs)); | 54 | update_process_times(user_mode(regs)); |
55 | #endif | 55 | #endif |
56 | if (current->pid) | 56 | if (current->pid) |
57 | profile_tick(CPU_PROFILING, regs); | 57 | profile_tick(CPU_PROFILING); |
58 | 58 | ||
59 | /* | 59 | /* |
60 | * If we have an externally synchronized Linux clock, then update | 60 | * If we have an externally synchronized Linux clock, then update |
diff --git a/arch/m68knommu/kernel/vmlinux.lds.S b/arch/m68knommu/kernel/vmlinux.lds.S index ccd2ceb05cfb..58afa8be604e 100644 --- a/arch/m68knommu/kernel/vmlinux.lds.S +++ b/arch/m68knommu/kernel/vmlinux.lds.S | |||
@@ -140,13 +140,7 @@ SECTIONS { | |||
140 | *(.init.setup) | 140 | *(.init.setup) |
141 | __setup_end = .; | 141 | __setup_end = .; |
142 | __initcall_start = .; | 142 | __initcall_start = .; |
143 | *(.initcall1.init) | 143 | INITCALLS |
144 | *(.initcall2.init) | ||
145 | *(.initcall3.init) | ||
146 | *(.initcall4.init) | ||
147 | *(.initcall5.init) | ||
148 | *(.initcall6.init) | ||
149 | *(.initcall7.init) | ||
150 | __initcall_end = .; | 144 | __initcall_end = .; |
151 | __con_initcall_start = .; | 145 | __con_initcall_start = .; |
152 | *(.con_initcall.init) | 146 | *(.con_initcall.init) |
diff --git a/arch/m68knommu/platform/5307/ints.c b/arch/m68knommu/platform/5307/ints.c index b4b55093ae7e..a57239ec6c8c 100644 --- a/arch/m68knommu/platform/5307/ints.c +++ b/arch/m68knommu/platform/5307/ints.c | |||
@@ -33,7 +33,7 @@ | |||
33 | /* | 33 | /* |
34 | * This table stores the address info for each vector handler. | 34 | * This table stores the address info for each vector handler. |
35 | */ | 35 | */ |
36 | irq_handler_t irq_list[SYS_IRQS]; | 36 | struct irq_entry irq_list[SYS_IRQS]; |
37 | 37 | ||
38 | #define NUM_IRQ_NODES 16 | 38 | #define NUM_IRQ_NODES 16 |
39 | static irq_node_t nodes[NUM_IRQ_NODES]; | 39 | static irq_node_t nodes[NUM_IRQ_NODES]; |
@@ -44,7 +44,7 @@ volatile unsigned int num_spurious; | |||
44 | unsigned int local_bh_count[NR_CPUS]; | 44 | unsigned int local_bh_count[NR_CPUS]; |
45 | unsigned int local_irq_count[NR_CPUS]; | 45 | unsigned int local_irq_count[NR_CPUS]; |
46 | 46 | ||
47 | static irqreturn_t default_irq_handler(int irq, void *ptr, struct pt_regs *regs) | 47 | static irqreturn_t default_irq_handler(int irq, void *ptr) |
48 | { | 48 | { |
49 | #if 1 | 49 | #if 1 |
50 | printk(KERN_INFO "%s(%d): default irq handler vec=%d [0x%x]\n", | 50 | printk(KERN_INFO "%s(%d): default irq handler vec=%d [0x%x]\n", |
@@ -70,7 +70,7 @@ void __init init_IRQ(void) | |||
70 | 70 | ||
71 | for (i = 0; i < SYS_IRQS; i++) { | 71 | for (i = 0; i < SYS_IRQS; i++) { |
72 | if (mach_default_handler) | 72 | if (mach_default_handler) |
73 | irq_list[i].handler = (*mach_default_handler)[i]; | 73 | irq_list[i].handler = mach_default_handler; |
74 | else | 74 | else |
75 | irq_list[i].handler = default_irq_handler; | 75 | irq_list[i].handler = default_irq_handler; |
76 | irq_list[i].flags = IRQ_FLG_STD; | 76 | irq_list[i].flags = IRQ_FLG_STD; |
@@ -100,7 +100,7 @@ irq_node_t *new_irq_node(void) | |||
100 | 100 | ||
101 | int request_irq( | 101 | int request_irq( |
102 | unsigned int irq, | 102 | unsigned int irq, |
103 | irqreturn_t (*handler)(int, void *, struct pt_regs *), | 103 | irq_handler_t handler, |
104 | unsigned long flags, | 104 | unsigned long flags, |
105 | const char *devname, | 105 | const char *devname, |
106 | void *dev_id) | 106 | void *dev_id) |
@@ -157,7 +157,7 @@ void free_irq(unsigned int irq, void *dev_id) | |||
157 | } | 157 | } |
158 | 158 | ||
159 | if (mach_default_handler) | 159 | if (mach_default_handler) |
160 | irq_list[irq].handler = (*mach_default_handler)[irq]; | 160 | irq_list[irq].handler = mach_default_handler; |
161 | else | 161 | else |
162 | irq_list[irq].handler = default_irq_handler; | 162 | irq_list[irq].handler = default_irq_handler; |
163 | irq_list[irq].flags = IRQ_FLG_STD; | 163 | irq_list[irq].flags = IRQ_FLG_STD; |
@@ -168,8 +168,7 @@ void free_irq(unsigned int irq, void *dev_id) | |||
168 | EXPORT_SYMBOL(free_irq); | 168 | EXPORT_SYMBOL(free_irq); |
169 | 169 | ||
170 | 170 | ||
171 | int sys_request_irq(unsigned int irq, | 171 | int sys_request_irq(unsigned int irq, irq_handler_t handler, |
172 | irqreturn_t (*handler)(int, void *, struct pt_regs *), | ||
173 | unsigned long flags, const char *devname, void *dev_id) | 172 | unsigned long flags, const char *devname, void *dev_id) |
174 | { | 173 | { |
175 | if (irq > IRQ7) { | 174 | if (irq > IRQ7) { |
@@ -211,7 +210,7 @@ void sys_free_irq(unsigned int irq, void *dev_id) | |||
211 | printk(KERN_WARNING "%s: Removing probably wrong IRQ %d from %s\n", | 210 | printk(KERN_WARNING "%s: Removing probably wrong IRQ %d from %s\n", |
212 | __FUNCTION__, irq, irq_list[irq].devname); | 211 | __FUNCTION__, irq, irq_list[irq].devname); |
213 | 212 | ||
214 | irq_list[irq].handler = (*mach_default_handler)[irq]; | 213 | irq_list[irq].handler = mach_default_handler; |
215 | irq_list[irq].flags = 0; | 214 | irq_list[irq].flags = 0; |
216 | irq_list[irq].dev_id = NULL; | 215 | irq_list[irq].dev_id = NULL; |
217 | irq_list[irq].devname = NULL; | 216 | irq_list[irq].devname = NULL; |
@@ -241,7 +240,7 @@ asmlinkage void process_int(unsigned long vec, struct pt_regs *fp) | |||
241 | if (vec >= VEC_INT1 && vec <= VEC_INT7) { | 240 | if (vec >= VEC_INT1 && vec <= VEC_INT7) { |
242 | vec -= VEC_SPUR; | 241 | vec -= VEC_SPUR; |
243 | kstat_cpu(0).irqs[vec]++; | 242 | kstat_cpu(0).irqs[vec]++; |
244 | irq_list[vec].handler(vec, irq_list[vec].dev_id, fp); | 243 | irq_list[vec].handler(vec, irq_list[vec].dev_id); |
245 | } else { | 244 | } else { |
246 | if (mach_process_int) | 245 | if (mach_process_int) |
247 | mach_process_int(vec, fp); | 246 | mach_process_int(vec, fp); |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 14af6cce2fa2..1443024b1c7c 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -425,9 +425,8 @@ config MOMENCO_OCELOT_G | |||
425 | select SWAP_IO_SPACE | 425 | select SWAP_IO_SPACE |
426 | select SYS_HAS_CPU_RM7000 | 426 | select SYS_HAS_CPU_RM7000 |
427 | select SYS_SUPPORTS_32BIT_KERNEL | 427 | select SYS_SUPPORTS_32BIT_KERNEL |
428 | select SYS_SUPPORTS_64BIT_KERNEL | 428 | select SYS_SUPPORTS_64BIT_KERNEL if BROKEN |
429 | select SYS_SUPPORTS_BIG_ENDIAN | 429 | select SYS_SUPPORTS_BIG_ENDIAN |
430 | select ARCH_SPARSEMEM_ENABLE | ||
431 | help | 430 | help |
432 | The Ocelot is a MIPS-based Single Board Computer (SBC) made by | 431 | The Ocelot is a MIPS-based Single Board Computer (SBC) made by |
433 | Momentum Computer <http://www.momenco.com/>. | 432 | Momentum Computer <http://www.momenco.com/>. |
@@ -560,6 +559,7 @@ config SGI_IP27 | |||
560 | select SYS_SUPPORTS_64BIT_KERNEL | 559 | select SYS_SUPPORTS_64BIT_KERNEL |
561 | select SYS_SUPPORTS_BIG_ENDIAN | 560 | select SYS_SUPPORTS_BIG_ENDIAN |
562 | select SYS_SUPPORTS_NUMA | 561 | select SYS_SUPPORTS_NUMA |
562 | select SYS_SUPPORTS_SMP | ||
563 | help | 563 | help |
564 | This are the SGI Origin 200, Origin 2000 and Onyx 2 Graphics | 564 | This are the SGI Origin 200, Origin 2000 and Onyx 2 Graphics |
565 | workstations. To compile a Linux kernel that runs on these, say Y | 565 | workstations. To compile a Linux kernel that runs on these, say Y |
@@ -1633,9 +1633,6 @@ config ARCH_DISCONTIGMEM_ENABLE | |||
1633 | 1633 | ||
1634 | config ARCH_SPARSEMEM_ENABLE | 1634 | config ARCH_SPARSEMEM_ENABLE |
1635 | bool | 1635 | bool |
1636 | |||
1637 | config ARCH_SPARSEMEM_ENABLE | ||
1638 | bool | ||
1639 | select SPARSEMEM_STATIC | 1636 | select SPARSEMEM_STATIC |
1640 | 1637 | ||
1641 | config NUMA | 1638 | config NUMA |
@@ -1690,6 +1687,7 @@ config NR_CPUS | |||
1690 | depends on SMP | 1687 | depends on SMP |
1691 | default "64" if SGI_IP27 | 1688 | default "64" if SGI_IP27 |
1692 | default "2" | 1689 | default "2" |
1690 | default "8" if MIPS_MT_SMTC | ||
1693 | help | 1691 | help |
1694 | This allows you to specify the maximum number of CPUs which this | 1692 | This allows you to specify the maximum number of CPUs which this |
1695 | kernel will support. The maximum supported value is 32 for 32-bit | 1693 | kernel will support. The maximum supported value is 32 for 32-bit |
diff --git a/arch/mips/Makefile b/arch/mips/Makefile index 641aa30b3638..d580d46f967b 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile | |||
@@ -63,7 +63,9 @@ cflags-y += -mabi=64 | |||
63 | ifdef CONFIG_BUILD_ELF64 | 63 | ifdef CONFIG_BUILD_ELF64 |
64 | cflags-y += $(call cc-option,-mno-explicit-relocs) | 64 | cflags-y += $(call cc-option,-mno-explicit-relocs) |
65 | else | 65 | else |
66 | cflags-y += $(call cc-option,-msym32) | 66 | # -msym32 can not be used for modules since they are loaded into XKSEG |
67 | CFLAGS_MODULE += $(call cc-option,-mno-explicit-relocs) | ||
68 | CFLAGS_KERNEL += $(call cc-option,-msym32) | ||
67 | endif | 69 | endif |
68 | endif | 70 | endif |
69 | 71 | ||
diff --git a/arch/mips/au1000/common/prom.c b/arch/mips/au1000/common/prom.c index b4b010a2fe36..6fce60af005d 100644 --- a/arch/mips/au1000/common/prom.c +++ b/arch/mips/au1000/common/prom.c | |||
@@ -47,7 +47,7 @@ extern int prom_argc; | |||
47 | extern char **prom_argv, **prom_envp; | 47 | extern char **prom_argv, **prom_envp; |
48 | 48 | ||
49 | 49 | ||
50 | char * prom_getcmdline(void) | 50 | char * __init_or_module prom_getcmdline(void) |
51 | { | 51 | { |
52 | return &(arcs_cmdline[0]); | 52 | return &(arcs_cmdline[0]); |
53 | } | 53 | } |
diff --git a/arch/mips/au1000/common/setup.c b/arch/mips/au1000/common/setup.c index 377ae0d8ff00..919172db560c 100644 --- a/arch/mips/au1000/common/setup.c +++ b/arch/mips/au1000/common/setup.c | |||
@@ -43,7 +43,7 @@ | |||
43 | #include <asm/mach-au1x00/au1000.h> | 43 | #include <asm/mach-au1x00/au1000.h> |
44 | #include <asm/time.h> | 44 | #include <asm/time.h> |
45 | 45 | ||
46 | extern char * __init prom_getcmdline(void); | 46 | extern char * prom_getcmdline(void); |
47 | extern void __init board_setup(void); | 47 | extern void __init board_setup(void); |
48 | extern void au1000_restart(char *); | 48 | extern void au1000_restart(char *); |
49 | extern void au1000_halt(void); | 49 | extern void au1000_halt(void); |
diff --git a/arch/mips/au1000/common/time.c b/arch/mips/au1000/common/time.c index 94f09194d63d..fa1c62f05515 100644 --- a/arch/mips/au1000/common/time.c +++ b/arch/mips/au1000/common/time.c | |||
@@ -53,9 +53,6 @@ static unsigned long r4k_cur; /* What counter should be at next timer irq */ | |||
53 | int no_au1xxx_32khz; | 53 | int no_au1xxx_32khz; |
54 | extern int allow_au1k_wait; /* default off for CP0 Counter */ | 54 | extern int allow_au1k_wait; /* default off for CP0 Counter */ |
55 | 55 | ||
56 | /* Cycle counter value at the previous timer interrupt.. */ | ||
57 | static unsigned int timerhi = 0, timerlo = 0; | ||
58 | |||
59 | #ifdef CONFIG_PM | 56 | #ifdef CONFIG_PM |
60 | #if HZ < 100 || HZ > 1000 | 57 | #if HZ < 100 || HZ > 1000 |
61 | #error "unsupported HZ value! Must be in [100,1000]" | 58 | #error "unsupported HZ value! Must be in [100,1000]" |
@@ -82,7 +79,6 @@ unsigned long wtimer; | |||
82 | void mips_timer_interrupt(void) | 79 | void mips_timer_interrupt(void) |
83 | { | 80 | { |
84 | int irq = 63; | 81 | int irq = 63; |
85 | unsigned long count; | ||
86 | 82 | ||
87 | irq_enter(); | 83 | irq_enter(); |
88 | kstat_this_cpu.irqs[irq]++; | 84 | kstat_this_cpu.irqs[irq]++; |
@@ -91,10 +87,6 @@ void mips_timer_interrupt(void) | |||
91 | goto null; | 87 | goto null; |
92 | 88 | ||
93 | do { | 89 | do { |
94 | count = read_c0_count(); | ||
95 | timerhi += (count < timerlo); /* Wrap around */ | ||
96 | timerlo = count; | ||
97 | |||
98 | kstat_this_cpu.irqs[irq]++; | 90 | kstat_this_cpu.irqs[irq]++; |
99 | do_timer(1); | 91 | do_timer(1); |
100 | #ifndef CONFIG_SMP | 92 | #ifndef CONFIG_SMP |
@@ -231,7 +223,6 @@ wakeup_counter0_set(int ticks) | |||
231 | */ | 223 | */ |
232 | unsigned long cal_r4koff(void) | 224 | unsigned long cal_r4koff(void) |
233 | { | 225 | { |
234 | unsigned long count; | ||
235 | unsigned long cpu_speed; | 226 | unsigned long cpu_speed; |
236 | unsigned long flags; | 227 | unsigned long flags; |
237 | unsigned long counter; | 228 | unsigned long counter; |
@@ -258,7 +249,7 @@ unsigned long cal_r4koff(void) | |||
258 | 249 | ||
259 | #if defined(CONFIG_AU1000_USE32K) | 250 | #if defined(CONFIG_AU1000_USE32K) |
260 | { | 251 | { |
261 | unsigned long start, end; | 252 | unsigned long start, end, count; |
262 | 253 | ||
263 | start = au_readl(SYS_RTCREAD); | 254 | start = au_readl(SYS_RTCREAD); |
264 | start += 2; | 255 | start += 2; |
@@ -282,7 +273,6 @@ unsigned long cal_r4koff(void) | |||
282 | #else | 273 | #else |
283 | cpu_speed = (au_readl(SYS_CPUPLL) & 0x0000003f) * | 274 | cpu_speed = (au_readl(SYS_CPUPLL) & 0x0000003f) * |
284 | AU1000_SRC_CLK; | 275 | AU1000_SRC_CLK; |
285 | count = cpu_speed / 2; | ||
286 | #endif | 276 | #endif |
287 | } | 277 | } |
288 | else { | 278 | else { |
@@ -291,98 +281,15 @@ unsigned long cal_r4koff(void) | |||
291 | * NOTE: some old silicon doesn't allow reading the PLL. | 281 | * NOTE: some old silicon doesn't allow reading the PLL. |
292 | */ | 282 | */ |
293 | cpu_speed = (au_readl(SYS_CPUPLL) & 0x0000003f) * AU1000_SRC_CLK; | 283 | cpu_speed = (au_readl(SYS_CPUPLL) & 0x0000003f) * AU1000_SRC_CLK; |
294 | count = cpu_speed / 2; | ||
295 | no_au1xxx_32khz = 1; | 284 | no_au1xxx_32khz = 1; |
296 | } | 285 | } |
297 | mips_hpt_frequency = count; | 286 | mips_hpt_frequency = cpu_speed; |
298 | // Equation: Baudrate = CPU / (SD * 2 * CLKDIV * 16) | 287 | // Equation: Baudrate = CPU / (SD * 2 * CLKDIV * 16) |
299 | set_au1x00_uart_baud_base(cpu_speed / (2 * ((int)(au_readl(SYS_POWERCTRL)&0x03) + 2) * 16)); | 288 | set_au1x00_uart_baud_base(cpu_speed / (2 * ((int)(au_readl(SYS_POWERCTRL)&0x03) + 2) * 16)); |
300 | spin_unlock_irqrestore(&time_lock, flags); | 289 | spin_unlock_irqrestore(&time_lock, flags); |
301 | return (cpu_speed / HZ); | 290 | return (cpu_speed / HZ); |
302 | } | 291 | } |
303 | 292 | ||
304 | /* This is for machines which generate the exact clock. */ | ||
305 | #define USECS_PER_JIFFY (1000000/HZ) | ||
306 | #define USECS_PER_JIFFY_FRAC (0x100000000LL*1000000/HZ&0xffffffff) | ||
307 | |||
308 | static unsigned long | ||
309 | div64_32(unsigned long v1, unsigned long v2, unsigned long v3) | ||
310 | { | ||
311 | unsigned long r0; | ||
312 | do_div64_32(r0, v1, v2, v3); | ||
313 | return r0; | ||
314 | } | ||
315 | |||
316 | static unsigned long do_fast_cp0_gettimeoffset(void) | ||
317 | { | ||
318 | u32 count; | ||
319 | unsigned long res, tmp; | ||
320 | unsigned long r0; | ||
321 | |||
322 | /* Last jiffy when do_fast_gettimeoffset() was called. */ | ||
323 | static unsigned long last_jiffies=0; | ||
324 | unsigned long quotient; | ||
325 | |||
326 | /* | ||
327 | * Cached "1/(clocks per usec)*2^32" value. | ||
328 | * It has to be recalculated once each jiffy. | ||
329 | */ | ||
330 | static unsigned long cached_quotient=0; | ||
331 | |||
332 | tmp = jiffies; | ||
333 | |||
334 | quotient = cached_quotient; | ||
335 | |||
336 | if (tmp && last_jiffies != tmp) { | ||
337 | last_jiffies = tmp; | ||
338 | if (last_jiffies != 0) { | ||
339 | r0 = div64_32(timerhi, timerlo, tmp); | ||
340 | quotient = div64_32(USECS_PER_JIFFY, USECS_PER_JIFFY_FRAC, r0); | ||
341 | cached_quotient = quotient; | ||
342 | } | ||
343 | } | ||
344 | |||
345 | /* Get last timer tick in absolute kernel time */ | ||
346 | count = read_c0_count(); | ||
347 | |||
348 | /* .. relative to previous jiffy (32 bits is enough) */ | ||
349 | count -= timerlo; | ||
350 | |||
351 | __asm__("multu\t%1,%2\n\t" | ||
352 | "mfhi\t%0" | ||
353 | : "=r" (res) | ||
354 | : "r" (count), "r" (quotient) | ||
355 | : "hi", "lo", GCC_REG_ACCUM); | ||
356 | |||
357 | /* | ||
358 | * Due to possible jiffies inconsistencies, we need to check | ||
359 | * the result so that we'll get a timer that is monotonic. | ||
360 | */ | ||
361 | if (res >= USECS_PER_JIFFY) | ||
362 | res = USECS_PER_JIFFY-1; | ||
363 | |||
364 | return res; | ||
365 | } | ||
366 | |||
367 | #ifdef CONFIG_PM | ||
368 | static unsigned long do_fast_pm_gettimeoffset(void) | ||
369 | { | ||
370 | unsigned long pc0; | ||
371 | unsigned long offset; | ||
372 | |||
373 | pc0 = au_readl(SYS_TOYREAD); | ||
374 | au_sync(); | ||
375 | offset = pc0 - last_pc0; | ||
376 | if (offset > 2*MATCH20_INC) { | ||
377 | printk("huge offset %x, last_pc0 %x last_match20 %x pc0 %x\n", | ||
378 | (unsigned)offset, (unsigned)last_pc0, | ||
379 | (unsigned)last_match20, (unsigned)pc0); | ||
380 | } | ||
381 | offset = (unsigned long)((offset * 305) / 10); | ||
382 | return offset; | ||
383 | } | ||
384 | #endif | ||
385 | |||
386 | void __init plat_timer_setup(struct irqaction *irq) | 293 | void __init plat_timer_setup(struct irqaction *irq) |
387 | { | 294 | { |
388 | unsigned int est_freq; | 295 | unsigned int est_freq; |
@@ -420,7 +327,6 @@ void __init plat_timer_setup(struct irqaction *irq) | |||
420 | unsigned int c0_status; | 327 | unsigned int c0_status; |
421 | 328 | ||
422 | printk("WARNING: no 32KHz clock found.\n"); | 329 | printk("WARNING: no 32KHz clock found.\n"); |
423 | do_gettimeoffset = do_fast_cp0_gettimeoffset; | ||
424 | 330 | ||
425 | /* Ensure we get CPO_COUNTER interrupts. | 331 | /* Ensure we get CPO_COUNTER interrupts. |
426 | */ | 332 | */ |
@@ -445,19 +351,11 @@ void __init plat_timer_setup(struct irqaction *irq) | |||
445 | while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_M20); | 351 | while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_M20); |
446 | startup_match20_interrupt(counter0_irq); | 352 | startup_match20_interrupt(counter0_irq); |
447 | 353 | ||
448 | do_gettimeoffset = do_fast_pm_gettimeoffset; | ||
449 | |||
450 | /* We can use the real 'wait' instruction. | 354 | /* We can use the real 'wait' instruction. |
451 | */ | 355 | */ |
452 | allow_au1k_wait = 1; | 356 | allow_au1k_wait = 1; |
453 | } | 357 | } |
454 | 358 | ||
455 | #else | ||
456 | /* We have to do this here instead of in timer_init because | ||
457 | * the generic code in arch/mips/kernel/time.c will write | ||
458 | * over our function pointer. | ||
459 | */ | ||
460 | do_gettimeoffset = do_fast_cp0_gettimeoffset; | ||
461 | #endif | 359 | #endif |
462 | } | 360 | } |
463 | 361 | ||
diff --git a/arch/mips/dec/time.c b/arch/mips/dec/time.c index 4cf0c06e2414..69e424e9ab6f 100644 --- a/arch/mips/dec/time.c +++ b/arch/mips/dec/time.c | |||
@@ -160,11 +160,6 @@ static unsigned int dec_ioasic_hpt_read(void) | |||
160 | return ioasic_read(IO_REG_FCTR); | 160 | return ioasic_read(IO_REG_FCTR); |
161 | } | 161 | } |
162 | 162 | ||
163 | static void dec_ioasic_hpt_init(unsigned int count) | ||
164 | { | ||
165 | ioasic_write(IO_REG_FCTR, ioasic_read(IO_REG_FCTR) - count); | ||
166 | } | ||
167 | |||
168 | 163 | ||
169 | void __init dec_time_init(void) | 164 | void __init dec_time_init(void) |
170 | { | 165 | { |
@@ -174,11 +169,9 @@ void __init dec_time_init(void) | |||
174 | mips_timer_state = dec_timer_state; | 169 | mips_timer_state = dec_timer_state; |
175 | mips_timer_ack = dec_timer_ack; | 170 | mips_timer_ack = dec_timer_ack; |
176 | 171 | ||
177 | if (!cpu_has_counter && IOASIC) { | 172 | if (!cpu_has_counter && IOASIC) |
178 | /* For pre-R4k systems we use the I/O ASIC's counter. */ | 173 | /* For pre-R4k systems we use the I/O ASIC's counter. */ |
179 | mips_hpt_read = dec_ioasic_hpt_read; | 174 | mips_hpt_read = dec_ioasic_hpt_read; |
180 | mips_hpt_init = dec_ioasic_hpt_init; | ||
181 | } | ||
182 | 175 | ||
183 | /* Set up the rate of periodic DS1287 interrupts. */ | 176 | /* Set up the rate of periodic DS1287 interrupts. */ |
184 | CMOS_WRITE(RTC_REF_CLCK_32KHZ | (16 - __ffs(HZ)), RTC_REG_A); | 177 | CMOS_WRITE(RTC_REF_CLCK_32KHZ | (16 - __ffs(HZ)), RTC_REG_A); |
diff --git a/arch/mips/emma2rh/common/irq_emma2rh.c b/arch/mips/emma2rh/common/irq_emma2rh.c index 7c930860c921..197ed4c2ba04 100644 --- a/arch/mips/emma2rh/common/irq_emma2rh.c +++ b/arch/mips/emma2rh/common/irq_emma2rh.c | |||
@@ -97,7 +97,7 @@ void emma2rh_irq_init(u32 irq_base) | |||
97 | irq_desc[i].status = IRQ_DISABLED; | 97 | irq_desc[i].status = IRQ_DISABLED; |
98 | irq_desc[i].action = NULL; | 98 | irq_desc[i].action = NULL; |
99 | irq_desc[i].depth = 1; | 99 | irq_desc[i].depth = 1; |
100 | irq_desc[i].handler = &emma2rh_irq_controller; | 100 | irq_desc[i].chip = &emma2rh_irq_controller; |
101 | } | 101 | } |
102 | 102 | ||
103 | emma2rh_irq_base = irq_base; | 103 | emma2rh_irq_base = irq_base; |
diff --git a/arch/mips/emma2rh/markeins/irq_markeins.c b/arch/mips/emma2rh/markeins/irq_markeins.c index f23ae9fcffa0..0b36eb001e62 100644 --- a/arch/mips/emma2rh/markeins/irq_markeins.c +++ b/arch/mips/emma2rh/markeins/irq_markeins.c | |||
@@ -86,7 +86,7 @@ void emma2rh_sw_irq_init(u32 irq_base) | |||
86 | irq_desc[i].status = IRQ_DISABLED; | 86 | irq_desc[i].status = IRQ_DISABLED; |
87 | irq_desc[i].action = NULL; | 87 | irq_desc[i].action = NULL; |
88 | irq_desc[i].depth = 2; | 88 | irq_desc[i].depth = 2; |
89 | irq_desc[i].handler = &emma2rh_sw_irq_controller; | 89 | irq_desc[i].chip = &emma2rh_sw_irq_controller; |
90 | } | 90 | } |
91 | 91 | ||
92 | emma2rh_sw_irq_base = irq_base; | 92 | emma2rh_sw_irq_base = irq_base; |
@@ -166,7 +166,7 @@ void emma2rh_gpio_irq_init(u32 irq_base) | |||
166 | irq_desc[i].status = IRQ_DISABLED; | 166 | irq_desc[i].status = IRQ_DISABLED; |
167 | irq_desc[i].action = NULL; | 167 | irq_desc[i].action = NULL; |
168 | irq_desc[i].depth = 2; | 168 | irq_desc[i].depth = 2; |
169 | irq_desc[i].handler = &emma2rh_gpio_irq_controller; | 169 | irq_desc[i].chip = &emma2rh_gpio_irq_controller; |
170 | } | 170 | } |
171 | 171 | ||
172 | emma2rh_gpio_irq_base = irq_base; | 172 | emma2rh_gpio_irq_base = irq_base; |
diff --git a/arch/mips/emma2rh/markeins/platform.c b/arch/mips/emma2rh/markeins/platform.c index 15cc61df3622..11567702b155 100644 --- a/arch/mips/emma2rh/markeins/platform.c +++ b/arch/mips/emma2rh/markeins/platform.c | |||
@@ -44,18 +44,45 @@ | |||
44 | #define I2C_EMMA2RH "emma2rh-iic" /* must be in sync with IIC driver */ | 44 | #define I2C_EMMA2RH "emma2rh-iic" /* must be in sync with IIC driver */ |
45 | 45 | ||
46 | static struct resource i2c_emma_resources_0[] = { | 46 | static struct resource i2c_emma_resources_0[] = { |
47 | { NULL, EMMA2RH_IRQ_PIIC0, EMMA2RH_IRQ_PIIC0, IORESOURCE_IRQ }, | 47 | { |
48 | { NULL, KSEG1ADDR(EMMA2RH_PIIC0_BASE), KSEG1ADDR(EMMA2RH_PIIC0_BASE + 0x1000), 0 }, | 48 | .name = NULL, |
49 | .start = EMMA2RH_IRQ_PIIC0, | ||
50 | .end = EMMA2RH_IRQ_PIIC0, | ||
51 | .flags = IORESOURCE_IRQ | ||
52 | }, { | ||
53 | .name = NULL, | ||
54 | .start = EMMA2RH_PIIC0_BASE, | ||
55 | .end = EMMA2RH_PIIC0_BASE + 0x1000, | ||
56 | .flags = 0 | ||
57 | }, | ||
49 | }; | 58 | }; |
50 | 59 | ||
51 | struct resource i2c_emma_resources_1[] = { | 60 | struct resource i2c_emma_resources_1[] = { |
52 | { NULL, EMMA2RH_IRQ_PIIC1, EMMA2RH_IRQ_PIIC1, IORESOURCE_IRQ }, | 61 | { |
53 | { NULL, KSEG1ADDR(EMMA2RH_PIIC1_BASE), KSEG1ADDR(EMMA2RH_PIIC1_BASE + 0x1000), 0 }, | 62 | .name = NULL, |
63 | .start = EMMA2RH_IRQ_PIIC1, | ||
64 | .end = EMMA2RH_IRQ_PIIC1, | ||
65 | .flags = IORESOURCE_IRQ | ||
66 | }, { | ||
67 | .name = NULL, | ||
68 | .start = EMMA2RH_PIIC1_BASE, | ||
69 | .end = EMMA2RH_PIIC1_BASE + 0x1000, | ||
70 | .flags = 0 | ||
71 | }, | ||
54 | }; | 72 | }; |
55 | 73 | ||
56 | struct resource i2c_emma_resources_2[] = { | 74 | struct resource i2c_emma_resources_2[] = { |
57 | { NULL, EMMA2RH_IRQ_PIIC2, EMMA2RH_IRQ_PIIC2, IORESOURCE_IRQ }, | 75 | { |
58 | { NULL, KSEG1ADDR(EMMA2RH_PIIC2_BASE), KSEG1ADDR(EMMA2RH_PIIC2_BASE + 0x1000), 0 }, | 76 | .name = NULL, |
77 | .start = EMMA2RH_IRQ_PIIC2, | ||
78 | .end = EMMA2RH_IRQ_PIIC2, | ||
79 | .flags = IORESOURCE_IRQ | ||
80 | }, { | ||
81 | .name = NULL, | ||
82 | .start = EMMA2RH_PIIC2_BASE, | ||
83 | .end = EMMA2RH_PIIC2_BASE + 0x1000, | ||
84 | .flags = 0 | ||
85 | }, | ||
59 | }; | 86 | }; |
60 | 87 | ||
61 | struct platform_device i2c_emma_devices[] = { | 88 | struct platform_device i2c_emma_devices[] = { |
@@ -83,32 +110,29 @@ struct platform_device i2c_emma_devices[] = { | |||
83 | #define EMMA2RH_SERIAL_FLAGS UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | 110 | #define EMMA2RH_SERIAL_FLAGS UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
84 | 111 | ||
85 | static struct plat_serial8250_port platform_serial_ports[] = { | 112 | static struct plat_serial8250_port platform_serial_ports[] = { |
86 | [0] = { | 113 | [0] = { |
87 | .membase = (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR0_BASE + 3), | 114 | .membase= (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR0_BASE + 3), |
88 | .irq = EMMA2RH_IRQ_PFUR0, | 115 | .irq = EMMA2RH_IRQ_PFUR0, |
89 | .uartclk = EMMA2RH_SERIAL_CLOCK, | 116 | .uartclk = EMMA2RH_SERIAL_CLOCK, |
90 | .regshift = 4, | 117 | .regshift = 4, |
91 | .iotype = UPIO_MEM, | 118 | .iotype = UPIO_MEM, |
92 | .flags = EMMA2RH_SERIAL_FLAGS, | 119 | .flags = EMMA2RH_SERIAL_FLAGS, |
93 | }, | 120 | }, [1] = { |
94 | [1] = { | 121 | .membase = (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR1_BASE + 3), |
95 | .membase = (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR1_BASE + 3), | 122 | .irq = EMMA2RH_IRQ_PFUR1, |
96 | .irq = EMMA2RH_IRQ_PFUR1, | 123 | .uartclk = EMMA2RH_SERIAL_CLOCK, |
97 | .uartclk = EMMA2RH_SERIAL_CLOCK, | 124 | .regshift = 4, |
98 | .regshift = 4, | 125 | .iotype = UPIO_MEM, |
99 | .iotype = UPIO_MEM, | 126 | .flags = EMMA2RH_SERIAL_FLAGS, |
100 | .flags = EMMA2RH_SERIAL_FLAGS, | 127 | }, [2] = { |
101 | }, | 128 | .membase = (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR2_BASE + 3), |
102 | [2] = { | 129 | .irq = EMMA2RH_IRQ_PFUR2, |
103 | .membase = (void __iomem*)KSEG1ADDR(EMMA2RH_PFUR2_BASE + 3), | 130 | .uartclk = EMMA2RH_SERIAL_CLOCK, |
104 | .irq = EMMA2RH_IRQ_PFUR2, | 131 | .regshift = 4, |
105 | .uartclk = EMMA2RH_SERIAL_CLOCK, | 132 | .iotype = UPIO_MEM, |
106 | .regshift = 4, | 133 | .flags = EMMA2RH_SERIAL_FLAGS, |
107 | .iotype = UPIO_MEM, | 134 | }, [3] = { |
108 | .flags = EMMA2RH_SERIAL_FLAGS, | 135 | .flags = 0, |
109 | }, | ||
110 | [3] = { | ||
111 | .flags = 0, | ||
112 | }, | 136 | }, |
113 | }; | 137 | }; |
114 | 138 | ||
diff --git a/arch/mips/gt64120/common/time.c b/arch/mips/gt64120/common/time.c index c83ae6acd601..c47eeb768192 100644 --- a/arch/mips/gt64120/common/time.c +++ b/arch/mips/gt64120/common/time.c | |||
@@ -64,14 +64,14 @@ static irqreturn_t gt64120_irq(int irq, void *dev_id) | |||
64 | * as *irq (=irq0 in ../kernel/time.c). We will do our own timer interrupt | 64 | * as *irq (=irq0 in ../kernel/time.c). We will do our own timer interrupt |
65 | * handling. | 65 | * handling. |
66 | */ | 66 | */ |
67 | void gt64120_time_init(void) | 67 | void __init plat_timer_setup(struct irqaction *irq) |
68 | { | 68 | { |
69 | static struct irqaction timer; | 69 | static struct irqaction timer; |
70 | 70 | ||
71 | /* Disable timer first */ | 71 | /* Disable timer first */ |
72 | GT_WRITE(GT_TC_CONTROL_OFS, 0); | 72 | GT_WRITE(GT_TC_CONTROL_OFS, 0); |
73 | /* Load timer value for 100 Hz */ | 73 | /* Load timer value for 100 Hz */ |
74 | GT_WRITE(GT_TC3_OFS, Sys_clock / 100); | 74 | GT_WRITE(GT_TC3_OFS, Sys_clock / HZ); |
75 | 75 | ||
76 | /* | 76 | /* |
77 | * Create the IRQ structure entry for the timer. Since we're too early | 77 | * Create the IRQ structure entry for the timer. Since we're too early |
diff --git a/arch/mips/gt64120/ev64120/setup.c b/arch/mips/gt64120/ev64120/setup.c index 91c2d3f41617..99c8d42212e2 100644 --- a/arch/mips/gt64120/ev64120/setup.c +++ b/arch/mips/gt64120/ev64120/setup.c | |||
@@ -68,7 +68,6 @@ unsigned long __init prom_free_prom_memory(void) | |||
68 | * Initializes basic routines and structures pointers, memory size (as | 68 | * Initializes basic routines and structures pointers, memory size (as |
69 | * given by the bios and saves the command line. | 69 | * given by the bios and saves the command line. |
70 | */ | 70 | */ |
71 | extern void gt64120_time_init(void); | ||
72 | 71 | ||
73 | void __init plat_mem_setup(void) | 72 | void __init plat_mem_setup(void) |
74 | { | 73 | { |
@@ -76,7 +75,6 @@ void __init plat_mem_setup(void) | |||
76 | _machine_halt = galileo_machine_halt; | 75 | _machine_halt = galileo_machine_halt; |
77 | pm_power_off = galileo_machine_power_off; | 76 | pm_power_off = galileo_machine_power_off; |
78 | 77 | ||
79 | board_time_init = gt64120_time_init; | ||
80 | set_io_port_base(KSEG1); | 78 | set_io_port_base(KSEG1); |
81 | } | 79 | } |
82 | 80 | ||
diff --git a/arch/mips/gt64120/momenco_ocelot/setup.c b/arch/mips/gt64120/momenco_ocelot/setup.c index 0e5bbee2d5b7..94f94ebbda6c 100644 --- a/arch/mips/gt64120/momenco_ocelot/setup.c +++ b/arch/mips/gt64120/momenco_ocelot/setup.c | |||
@@ -70,7 +70,6 @@ extern void momenco_ocelot_restart(char *command); | |||
70 | extern void momenco_ocelot_halt(void); | 70 | extern void momenco_ocelot_halt(void); |
71 | extern void momenco_ocelot_power_off(void); | 71 | extern void momenco_ocelot_power_off(void); |
72 | 72 | ||
73 | extern void gt64120_time_init(void); | ||
74 | extern void momenco_ocelot_irq_setup(void); | 73 | extern void momenco_ocelot_irq_setup(void); |
75 | 74 | ||
76 | static char reset_reason; | 75 | static char reset_reason; |
@@ -156,8 +155,6 @@ void __init plat_mem_setup(void) | |||
156 | void (*l3func)(unsigned long)=KSEG1ADDR(&setup_l3cache); | 155 | void (*l3func)(unsigned long)=KSEG1ADDR(&setup_l3cache); |
157 | unsigned int tmpword; | 156 | unsigned int tmpword; |
158 | 157 | ||
159 | board_time_init = gt64120_time_init; | ||
160 | |||
161 | _machine_restart = momenco_ocelot_restart; | 158 | _machine_restart = momenco_ocelot_restart; |
162 | _machine_halt = momenco_ocelot_halt; | 159 | _machine_halt = momenco_ocelot_halt; |
163 | pm_power_off = momenco_ocelot_power_off; | 160 | pm_power_off = momenco_ocelot_power_off; |
diff --git a/arch/mips/jmr3927/rbhma3100/irq.c b/arch/mips/jmr3927/rbhma3100/irq.c index 39a0243bed9a..de4a238c28be 100644 --- a/arch/mips/jmr3927/rbhma3100/irq.c +++ b/arch/mips/jmr3927/rbhma3100/irq.c | |||
@@ -288,6 +288,8 @@ static void tx_branch_likely_bug_fixup(void) | |||
288 | 288 | ||
289 | static void jmr3927_spurious(void) | 289 | static void jmr3927_spurious(void) |
290 | { | 290 | { |
291 | struct pt_regs * regs = get_irq_regs(); | ||
292 | |||
291 | #ifdef CONFIG_TX_BRANCH_LIKELY_BUG_WORKAROUND | 293 | #ifdef CONFIG_TX_BRANCH_LIKELY_BUG_WORKAROUND |
292 | tx_branch_likely_bug_fixup(); | 294 | tx_branch_likely_bug_fixup(); |
293 | #endif | 295 | #endif |
@@ -297,6 +299,7 @@ static void jmr3927_spurious(void) | |||
297 | 299 | ||
298 | asmlinkage void plat_irq_dispatch(void) | 300 | asmlinkage void plat_irq_dispatch(void) |
299 | { | 301 | { |
302 | struct pt_regs * regs = get_irq_regs(); | ||
300 | int irq; | 303 | int irq; |
301 | 304 | ||
302 | #ifdef CONFIG_TX_BRANCH_LIKELY_BUG_WORKAROUND | 305 | #ifdef CONFIG_TX_BRANCH_LIKELY_BUG_WORKAROUND |
diff --git a/arch/mips/jmr3927/rbhma3100/setup.c b/arch/mips/jmr3927/rbhma3100/setup.c index 025434054ed0..16e5dfe7aa8a 100644 --- a/arch/mips/jmr3927/rbhma3100/setup.c +++ b/arch/mips/jmr3927/rbhma3100/setup.c | |||
@@ -170,12 +170,20 @@ static void jmr3927_machine_power_off(void) | |||
170 | while (1); | 170 | while (1); |
171 | } | 171 | } |
172 | 172 | ||
173 | static unsigned int jmr3927_hpt_read(void) | ||
174 | { | ||
175 | /* We assume this function is called xtime_lock held. */ | ||
176 | return jiffies * (JMR3927_TIMER_CLK / HZ) + jmr3927_tmrptr->trr; | ||
177 | } | ||
178 | |||
173 | #define USE_RTC_DS1742 | 179 | #define USE_RTC_DS1742 |
174 | #ifdef USE_RTC_DS1742 | 180 | #ifdef USE_RTC_DS1742 |
175 | extern void rtc_ds1742_init(unsigned long base); | 181 | extern void rtc_ds1742_init(unsigned long base); |
176 | #endif | 182 | #endif |
177 | static void __init jmr3927_time_init(void) | 183 | static void __init jmr3927_time_init(void) |
178 | { | 184 | { |
185 | mips_hpt_read = jmr3927_hpt_read; | ||
186 | mips_hpt_frequency = JMR3927_TIMER_CLK; | ||
179 | #ifdef USE_RTC_DS1742 | 187 | #ifdef USE_RTC_DS1742 |
180 | if (jmr3927_have_nvram()) { | 188 | if (jmr3927_have_nvram()) { |
181 | rtc_ds1742_init(JMR3927_IOC_NVRAMB_ADDR); | 189 | rtc_ds1742_init(JMR3927_IOC_NVRAMB_ADDR); |
@@ -183,12 +191,8 @@ static void __init jmr3927_time_init(void) | |||
183 | #endif | 191 | #endif |
184 | } | 192 | } |
185 | 193 | ||
186 | unsigned long jmr3927_do_gettimeoffset(void); | ||
187 | |||
188 | void __init plat_timer_setup(struct irqaction *irq) | 194 | void __init plat_timer_setup(struct irqaction *irq) |
189 | { | 195 | { |
190 | do_gettimeoffset = jmr3927_do_gettimeoffset; | ||
191 | |||
192 | jmr3927_tmrptr->cpra = JMR3927_TIMER_CLK / HZ; | 196 | jmr3927_tmrptr->cpra = JMR3927_TIMER_CLK / HZ; |
193 | jmr3927_tmrptr->itmr = TXx927_TMTITMR_TIIE | TXx927_TMTITMR_TZCE; | 197 | jmr3927_tmrptr->itmr = TXx927_TMTITMR_TIIE | TXx927_TMTITMR_TZCE; |
194 | jmr3927_tmrptr->ccdr = JMR3927_TIMER_CCD; | 198 | jmr3927_tmrptr->ccdr = JMR3927_TIMER_CCD; |
@@ -200,34 +204,6 @@ void __init plat_timer_setup(struct irqaction *irq) | |||
200 | 204 | ||
201 | #define USECS_PER_JIFFY (1000000/HZ) | 205 | #define USECS_PER_JIFFY (1000000/HZ) |
202 | 206 | ||
203 | unsigned long jmr3927_do_gettimeoffset(void) | ||
204 | { | ||
205 | unsigned long count; | ||
206 | unsigned long res = 0; | ||
207 | |||
208 | /* MUST read TRR before TISR. */ | ||
209 | count = jmr3927_tmrptr->trr; | ||
210 | |||
211 | if (jmr3927_tmrptr->tisr & TXx927_TMTISR_TIIS) { | ||
212 | /* timer interrupt is pending. use Max value. */ | ||
213 | res = USECS_PER_JIFFY - 1; | ||
214 | } else { | ||
215 | /* convert to usec */ | ||
216 | /* res = count / (JMR3927_TIMER_CLK / 1000000); */ | ||
217 | res = (count << 7) / ((JMR3927_TIMER_CLK << 7) / 1000000); | ||
218 | |||
219 | /* | ||
220 | * Due to possible jiffies inconsistencies, we need to check | ||
221 | * the result so that we'll get a timer that is monotonic. | ||
222 | */ | ||
223 | if (res >= USECS_PER_JIFFY) | ||
224 | res = USECS_PER_JIFFY-1; | ||
225 | } | ||
226 | |||
227 | return res; | ||
228 | } | ||
229 | |||
230 | |||
231 | //#undef DO_WRITE_THROUGH | 207 | //#undef DO_WRITE_THROUGH |
232 | #define DO_WRITE_THROUGH | 208 | #define DO_WRITE_THROUGH |
233 | #define DO_ENABLE_CACHE | 209 | #define DO_ENABLE_CACHE |
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index cd9cec9e39e9..6bfbbed0897e 100644 --- a/arch/mips/kernel/Makefile +++ b/arch/mips/kernel/Makefile | |||
@@ -6,7 +6,7 @@ extra-y := head.o init_task.o vmlinux.lds | |||
6 | 6 | ||
7 | obj-y += cpu-probe.o branch.o entry.o genex.o irq.o process.o \ | 7 | obj-y += cpu-probe.o branch.o entry.o genex.o irq.o process.o \ |
8 | ptrace.o reset.o semaphore.o setup.o signal.o syscall.o \ | 8 | ptrace.o reset.o semaphore.o setup.o signal.o syscall.o \ |
9 | time.o traps.o unaligned.o | 9 | time.o topology.o traps.o unaligned.o |
10 | 10 | ||
11 | binfmt_irix-objs := irixelf.o irixinv.o irixioctl.o irixsig.o \ | 11 | binfmt_irix-objs := irixelf.o irixinv.o irixioctl.o irixsig.o \ |
12 | irix5sys.o sysirix.o | 12 | irix5sys.o sysirix.o |
diff --git a/arch/mips/kernel/asm-offsets.c b/arch/mips/kernel/asm-offsets.c index e9ce5b3721af..ff88b06f89df 100644 --- a/arch/mips/kernel/asm-offsets.c +++ b/arch/mips/kernel/asm-offsets.c | |||
@@ -22,7 +22,7 @@ | |||
22 | #define offset(string, ptr, member) \ | 22 | #define offset(string, ptr, member) \ |
23 | __asm__("\n@@@" string "%0" : : "i" (_offset(ptr, member))) | 23 | __asm__("\n@@@" string "%0" : : "i" (_offset(ptr, member))) |
24 | #define constant(string, member) \ | 24 | #define constant(string, member) \ |
25 | __asm__("\n@@@" string "%x0" : : "ri" (member)) | 25 | __asm__("\n@@@" string "%X0" : : "ri" (member)) |
26 | #define size(string, size) \ | 26 | #define size(string, size) \ |
27 | __asm__("\n@@@" string "%0" : : "i" (sizeof(size))) | 27 | __asm__("\n@@@" string "%0" : : "i" (sizeof(size))) |
28 | #define linefeed text("") | 28 | #define linefeed text("") |
diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S index 417c08ac76eb..f10b6a19f8bf 100644 --- a/arch/mips/kernel/entry.S +++ b/arch/mips/kernel/entry.S | |||
@@ -83,7 +83,10 @@ FEXPORT(syscall_exit) | |||
83 | FEXPORT(restore_all) # restore full frame | 83 | FEXPORT(restore_all) # restore full frame |
84 | #ifdef CONFIG_MIPS_MT_SMTC | 84 | #ifdef CONFIG_MIPS_MT_SMTC |
85 | /* Detect and execute deferred IPI "interrupts" */ | 85 | /* Detect and execute deferred IPI "interrupts" */ |
86 | LONG_L s0, TI_REGS($28) | ||
87 | LONG_S sp, TI_REGS($28) | ||
86 | jal deferred_smtc_ipi | 88 | jal deferred_smtc_ipi |
89 | LONG_S s0, TI_REGS($28) | ||
87 | /* Re-arm any temporarily masked interrupts not explicitly "acked" */ | 90 | /* Re-arm any temporarily masked interrupts not explicitly "acked" */ |
88 | mfc0 v0, CP0_TCSTATUS | 91 | mfc0 v0, CP0_TCSTATUS |
89 | ori v1, v0, TCSTATUS_IXMT | 92 | ori v1, v0, TCSTATUS_IXMT |
diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S index 8c6db0fc72f0..ddc1b71c9378 100644 --- a/arch/mips/kernel/head.S +++ b/arch/mips/kernel/head.S | |||
@@ -189,7 +189,8 @@ NESTED(kernel_entry, 16, sp) # kernel entry point | |||
189 | 189 | ||
190 | MTC0 zero, CP0_CONTEXT # clear context register | 190 | MTC0 zero, CP0_CONTEXT # clear context register |
191 | PTR_LA $28, init_thread_union | 191 | PTR_LA $28, init_thread_union |
192 | PTR_ADDIU sp, $28, _THREAD_SIZE - 32 | 192 | PTR_LI sp, _THREAD_SIZE - 32 |
193 | PTR_ADDU sp, $28 | ||
193 | set_saved_sp sp, t0, t1 | 194 | set_saved_sp sp, t0, t1 |
194 | PTR_SUBU sp, 4 * SZREG # init stack pointer | 195 | PTR_SUBU sp, 4 * SZREG # init stack pointer |
195 | 196 | ||
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c index dd24434392b6..9b0e49d63d7b 100644 --- a/arch/mips/kernel/irq.c +++ b/arch/mips/kernel/irq.c | |||
@@ -26,6 +26,48 @@ | |||
26 | #include <asm/system.h> | 26 | #include <asm/system.h> |
27 | #include <asm/uaccess.h> | 27 | #include <asm/uaccess.h> |
28 | 28 | ||
29 | static unsigned long irq_map[NR_IRQS / BITS_PER_LONG]; | ||
30 | |||
31 | int __devinit allocate_irqno(void) | ||
32 | { | ||
33 | int irq; | ||
34 | |||
35 | again: | ||
36 | irq = find_first_zero_bit(irq_map, NR_IRQS); | ||
37 | |||
38 | if (irq >= NR_IRQS) | ||
39 | return -ENOSPC; | ||
40 | |||
41 | if (test_and_set_bit(irq, irq_map)) | ||
42 | goto again; | ||
43 | |||
44 | return irq; | ||
45 | } | ||
46 | |||
47 | EXPORT_SYMBOL_GPL(allocate_irqno); | ||
48 | |||
49 | /* | ||
50 | * Allocate the 16 legacy interrupts for i8259 devices. This happens early | ||
51 | * in the kernel initialization so treating allocation failure as BUG() is | ||
52 | * ok. | ||
53 | */ | ||
54 | void __init alloc_legacy_irqno(void) | ||
55 | { | ||
56 | int i; | ||
57 | |||
58 | for (i = 0; i <= 16; i++) | ||
59 | BUG_ON(test_and_set_bit(i, irq_map)); | ||
60 | } | ||
61 | |||
62 | void __devinit free_irqno(unsigned int irq) | ||
63 | { | ||
64 | smp_mb__before_clear_bit(); | ||
65 | clear_bit(irq, irq_map); | ||
66 | smp_mb__after_clear_bit(); | ||
67 | } | ||
68 | |||
69 | EXPORT_SYMBOL_GPL(free_irqno); | ||
70 | |||
29 | /* | 71 | /* |
30 | * 'what should we do if we get a hw irq event on an illegal vector'. | 72 | * 'what should we do if we get a hw irq event on an illegal vector'. |
31 | * each architecture has to answer this themselves. | 73 | * each architecture has to answer this themselves. |
diff --git a/arch/mips/kernel/r4k_switch.S b/arch/mips/kernel/r4k_switch.S index d5c8b82fed72..cc566cf12246 100644 --- a/arch/mips/kernel/r4k_switch.S +++ b/arch/mips/kernel/r4k_switch.S | |||
@@ -85,7 +85,12 @@ | |||
85 | move $28, a2 | 85 | move $28, a2 |
86 | cpu_restore_nonscratch a1 | 86 | cpu_restore_nonscratch a1 |
87 | 87 | ||
88 | #if (_THREAD_SIZE - 32) < 0x10000 | ||
88 | PTR_ADDIU t0, $28, _THREAD_SIZE - 32 | 89 | PTR_ADDIU t0, $28, _THREAD_SIZE - 32 |
90 | #else | ||
91 | PTR_LI t0, _THREAD_SIZE - 32 | ||
92 | PTR_ADDU t0, $28 | ||
93 | #endif | ||
89 | set_saved_sp t0, t1, t2 | 94 | set_saved_sp t0, t1, t2 |
90 | #ifdef CONFIG_MIPS_MT_SMTC | 95 | #ifdef CONFIG_MIPS_MT_SMTC |
91 | /* Read-modify-writes of Status must be atomic on a VPE */ | 96 | /* Read-modify-writes of Status must be atomic on a VPE */ |
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index 720fac3435d5..a95f37de080e 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S | |||
@@ -654,6 +654,8 @@ einval: li v0, -EINVAL | |||
654 | sys sys_set_robust_list 2 | 654 | sys sys_set_robust_list 2 |
655 | sys sys_get_robust_list 3 /* 4310 */ | 655 | sys sys_get_robust_list 3 /* 4310 */ |
656 | sys sys_ni_syscall 0 | 656 | sys sys_ni_syscall 0 |
657 | sys sys_getcpu 3 | ||
658 | sys sys_epoll_pwait 6 | ||
657 | .endm | 659 | .endm |
658 | 660 | ||
659 | /* We pre-compute the number of _instruction_ bytes needed to | 661 | /* We pre-compute the number of _instruction_ bytes needed to |
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index 3a34f62c8b1b..8fb0f60f657b 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S | |||
@@ -469,3 +469,5 @@ sys_call_table: | |||
469 | PTR sys_set_robust_list | 469 | PTR sys_set_robust_list |
470 | PTR sys_get_robust_list | 470 | PTR sys_get_robust_list |
471 | PTR sys_ni_syscall /* 5270 */ | 471 | PTR sys_ni_syscall /* 5270 */ |
472 | PTR sys_getcpu | ||
473 | PTR sys_epoll_pwait | ||
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 67b92a1d6c72..0da5ca2040ff 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
@@ -395,3 +395,5 @@ EXPORT(sysn32_call_table) | |||
395 | PTR compat_sys_set_robust_list | 395 | PTR compat_sys_set_robust_list |
396 | PTR compat_sys_get_robust_list | 396 | PTR compat_sys_get_robust_list |
397 | PTR sys_ni_syscall | 397 | PTR sys_ni_syscall |
398 | PTR sys_getcpu | ||
399 | PTR sys_epoll_pwait | ||
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index 2875c4a3fa58..b9d00cae8b5f 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
@@ -517,4 +517,6 @@ sys_call_table: | |||
517 | PTR compat_sys_set_robust_list | 517 | PTR compat_sys_set_robust_list |
518 | PTR compat_sys_get_robust_list /* 4310 */ | 518 | PTR compat_sys_get_robust_list /* 4310 */ |
519 | PTR sys_ni_syscall | 519 | PTR sys_ni_syscall |
520 | PTR sys_getcpu | ||
521 | PTR sys_epoll_pwait | ||
520 | .size sys_call_table,.-sys_call_table | 522 | .size sys_call_table,.-sys_call_table |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index fdbb508661c5..8f6e89697ccf 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
@@ -223,7 +223,11 @@ disable: | |||
223 | 223 | ||
224 | #else /* !CONFIG_BLK_DEV_INITRD */ | 224 | #else /* !CONFIG_BLK_DEV_INITRD */ |
225 | 225 | ||
226 | #define init_initrd() 0 | 226 | static unsigned long __init init_initrd(void) |
227 | { | ||
228 | return 0; | ||
229 | } | ||
230 | |||
227 | #define finalize_initrd() do {} while (0) | 231 | #define finalize_initrd() do {} while (0) |
228 | 232 | ||
229 | #endif | 233 | #endif |
diff --git a/arch/mips/kernel/smp-mt.c b/arch/mips/kernel/smp-mt.c index 3b5f3b632622..2ac19a6cbf68 100644 --- a/arch/mips/kernel/smp-mt.c +++ b/arch/mips/kernel/smp-mt.c | |||
@@ -140,15 +140,90 @@ static struct irqaction irq_call = { | |||
140 | .name = "IPI_call" | 140 | .name = "IPI_call" |
141 | }; | 141 | }; |
142 | 142 | ||
143 | static void __init smp_copy_vpe_config(void) | ||
144 | { | ||
145 | write_vpe_c0_status( | ||
146 | (read_c0_status() & ~(ST0_IM | ST0_IE | ST0_KSU)) | ST0_CU0); | ||
147 | |||
148 | /* set config to be the same as vpe0, particularly kseg0 coherency alg */ | ||
149 | write_vpe_c0_config( read_c0_config()); | ||
150 | |||
151 | /* make sure there are no software interrupts pending */ | ||
152 | write_vpe_c0_cause(0); | ||
153 | |||
154 | /* Propagate Config7 */ | ||
155 | write_vpe_c0_config7(read_c0_config7()); | ||
156 | |||
157 | write_vpe_c0_count(read_c0_count()); | ||
158 | } | ||
159 | |||
160 | static unsigned int __init smp_vpe_init(unsigned int tc, unsigned int mvpconf0, | ||
161 | unsigned int ncpu) | ||
162 | { | ||
163 | if (tc > ((mvpconf0 & MVPCONF0_PVPE) >> MVPCONF0_PVPE_SHIFT)) | ||
164 | return ncpu; | ||
165 | |||
166 | /* Deactivate all but VPE 0 */ | ||
167 | if (tc != 0) { | ||
168 | unsigned long tmp = read_vpe_c0_vpeconf0(); | ||
169 | |||
170 | tmp &= ~VPECONF0_VPA; | ||
171 | |||
172 | /* master VPE */ | ||
173 | tmp |= VPECONF0_MVP; | ||
174 | write_vpe_c0_vpeconf0(tmp); | ||
175 | |||
176 | /* Record this as available CPU */ | ||
177 | cpu_set(tc, phys_cpu_present_map); | ||
178 | __cpu_number_map[tc] = ++ncpu; | ||
179 | __cpu_logical_map[ncpu] = tc; | ||
180 | } | ||
181 | |||
182 | /* Disable multi-threading with TC's */ | ||
183 | write_vpe_c0_vpecontrol(read_vpe_c0_vpecontrol() & ~VPECONTROL_TE); | ||
184 | |||
185 | if (tc != 0) | ||
186 | smp_copy_vpe_config(); | ||
187 | |||
188 | return ncpu; | ||
189 | } | ||
190 | |||
191 | static void __init smp_tc_init(unsigned int tc, unsigned int mvpconf0) | ||
192 | { | ||
193 | unsigned long tmp; | ||
194 | |||
195 | if (!tc) | ||
196 | return; | ||
197 | |||
198 | /* bind a TC to each VPE, May as well put all excess TC's | ||
199 | on the last VPE */ | ||
200 | if (tc >= (((mvpconf0 & MVPCONF0_PVPE) >> MVPCONF0_PVPE_SHIFT)+1)) | ||
201 | write_tc_c0_tcbind(read_tc_c0_tcbind() | ((mvpconf0 & MVPCONF0_PVPE) >> MVPCONF0_PVPE_SHIFT)); | ||
202 | else { | ||
203 | write_tc_c0_tcbind(read_tc_c0_tcbind() | tc); | ||
204 | |||
205 | /* and set XTC */ | ||
206 | write_vpe_c0_vpeconf0(read_vpe_c0_vpeconf0() | (tc << VPECONF0_XTC_SHIFT)); | ||
207 | } | ||
208 | |||
209 | tmp = read_tc_c0_tcstatus(); | ||
210 | |||
211 | /* mark not allocated and not dynamically allocatable */ | ||
212 | tmp &= ~(TCSTATUS_A | TCSTATUS_DA); | ||
213 | tmp |= TCSTATUS_IXMT; /* interrupt exempt */ | ||
214 | write_tc_c0_tcstatus(tmp); | ||
215 | |||
216 | write_tc_c0_tchalt(TCHALT_H); | ||
217 | } | ||
218 | |||
143 | /* | 219 | /* |
144 | * Common setup before any secondaries are started | 220 | * Common setup before any secondaries are started |
145 | * Make sure all CPU's are in a sensible state before we boot any of the | 221 | * Make sure all CPU's are in a sensible state before we boot any of the |
146 | * secondarys | 222 | * secondarys |
147 | */ | 223 | */ |
148 | void plat_smp_setup(void) | 224 | void __init plat_smp_setup(void) |
149 | { | 225 | { |
150 | unsigned long val; | 226 | unsigned int mvpconf0, ntc, tc, ncpu = 0; |
151 | int i, num; | ||
152 | 227 | ||
153 | #ifdef CONFIG_MIPS_MT_FPAFF | 228 | #ifdef CONFIG_MIPS_MT_FPAFF |
154 | /* If we have an FPU, enroll ourselves in the FPU-full mask */ | 229 | /* If we have an FPU, enroll ourselves in the FPU-full mask */ |
@@ -167,75 +242,16 @@ void plat_smp_setup(void) | |||
167 | /* Put MVPE's into 'configuration state' */ | 242 | /* Put MVPE's into 'configuration state' */ |
168 | set_c0_mvpcontrol(MVPCONTROL_VPC); | 243 | set_c0_mvpcontrol(MVPCONTROL_VPC); |
169 | 244 | ||
170 | val = read_c0_mvpconf0(); | 245 | mvpconf0 = read_c0_mvpconf0(); |
246 | ntc = (mvpconf0 & MVPCONF0_PTC) >> MVPCONF0_PTC_SHIFT; | ||
171 | 247 | ||
172 | /* we'll always have more TC's than VPE's, so loop setting everything | 248 | /* we'll always have more TC's than VPE's, so loop setting everything |
173 | to a sensible state */ | 249 | to a sensible state */ |
174 | for (i = 0, num = 0; i <= ((val & MVPCONF0_PTC) >> MVPCONF0_PTC_SHIFT); i++) { | 250 | for (tc = 0; tc <= ntc; tc++) { |
175 | settc(i); | 251 | settc(tc); |
176 | |||
177 | /* VPE's */ | ||
178 | if (i <= ((val & MVPCONF0_PVPE) >> MVPCONF0_PVPE_SHIFT)) { | ||
179 | |||
180 | /* deactivate all but vpe0 */ | ||
181 | if (i != 0) { | ||
182 | unsigned long tmp = read_vpe_c0_vpeconf0(); | ||
183 | |||
184 | tmp &= ~VPECONF0_VPA; | ||
185 | |||
186 | /* master VPE */ | ||
187 | tmp |= VPECONF0_MVP; | ||
188 | write_vpe_c0_vpeconf0(tmp); | ||
189 | |||
190 | /* Record this as available CPU */ | ||
191 | cpu_set(i, phys_cpu_present_map); | ||
192 | __cpu_number_map[i] = ++num; | ||
193 | __cpu_logical_map[num] = i; | ||
194 | } | ||
195 | |||
196 | /* disable multi-threading with TC's */ | ||
197 | write_vpe_c0_vpecontrol(read_vpe_c0_vpecontrol() & ~VPECONTROL_TE); | ||
198 | |||
199 | if (i != 0) { | ||
200 | write_vpe_c0_status((read_c0_status() & ~(ST0_IM | ST0_IE | ST0_KSU)) | ST0_CU0); | ||
201 | 252 | ||
202 | /* set config to be the same as vpe0, particularly kseg0 coherency alg */ | 253 | smp_tc_init(tc, mvpconf0); |
203 | write_vpe_c0_config( read_c0_config()); | 254 | ncpu = smp_vpe_init(tc, mvpconf0, ncpu); |
204 | |||
205 | /* make sure there are no software interrupts pending */ | ||
206 | write_vpe_c0_cause(0); | ||
207 | |||
208 | /* Propagate Config7 */ | ||
209 | write_vpe_c0_config7(read_c0_config7()); | ||
210 | } | ||
211 | |||
212 | } | ||
213 | |||
214 | /* TC's */ | ||
215 | |||
216 | if (i != 0) { | ||
217 | unsigned long tmp; | ||
218 | |||
219 | /* bind a TC to each VPE, May as well put all excess TC's | ||
220 | on the last VPE */ | ||
221 | if ( i >= (((val & MVPCONF0_PVPE) >> MVPCONF0_PVPE_SHIFT)+1) ) | ||
222 | write_tc_c0_tcbind(read_tc_c0_tcbind() | ((val & MVPCONF0_PVPE) >> MVPCONF0_PVPE_SHIFT) ); | ||
223 | else { | ||
224 | write_tc_c0_tcbind( read_tc_c0_tcbind() | i); | ||
225 | |||
226 | /* and set XTC */ | ||
227 | write_vpe_c0_vpeconf0( read_vpe_c0_vpeconf0() | (i << VPECONF0_XTC_SHIFT)); | ||
228 | } | ||
229 | |||
230 | tmp = read_tc_c0_tcstatus(); | ||
231 | |||
232 | /* mark not allocated and not dynamically allocatable */ | ||
233 | tmp &= ~(TCSTATUS_A | TCSTATUS_DA); | ||
234 | tmp |= TCSTATUS_IXMT; /* interrupt exempt */ | ||
235 | write_tc_c0_tcstatus(tmp); | ||
236 | |||
237 | write_tc_c0_tchalt(TCHALT_H); | ||
238 | } | ||
239 | } | 255 | } |
240 | 256 | ||
241 | /* Release config state */ | 257 | /* Release config state */ |
@@ -243,7 +259,7 @@ void plat_smp_setup(void) | |||
243 | 259 | ||
244 | /* We'll wait until starting the secondaries before starting MVPE */ | 260 | /* We'll wait until starting the secondaries before starting MVPE */ |
245 | 261 | ||
246 | printk(KERN_INFO "Detected %i available secondary CPU(s)\n", num); | 262 | printk(KERN_INFO "Detected %i available secondary CPU(s)\n", ncpu); |
247 | } | 263 | } |
248 | 264 | ||
249 | void __init plat_prepare_cpus(unsigned int max_cpus) | 265 | void __init plat_prepare_cpus(unsigned int max_cpus) |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index db80957ada89..49db516789e0 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
@@ -463,28 +463,5 @@ void flush_tlb_one(unsigned long vaddr) | |||
463 | smp_on_each_tlb(flush_tlb_one_ipi, (void *) vaddr); | 463 | smp_on_each_tlb(flush_tlb_one_ipi, (void *) vaddr); |
464 | } | 464 | } |
465 | 465 | ||
466 | static DEFINE_PER_CPU(struct cpu, cpu_devices); | ||
467 | |||
468 | static int __init topology_init(void) | ||
469 | { | ||
470 | int i, ret; | ||
471 | |||
472 | #ifdef CONFIG_NUMA | ||
473 | for_each_online_node(i) | ||
474 | register_one_node(i); | ||
475 | #endif /* CONFIG_NUMA */ | ||
476 | |||
477 | for_each_present_cpu(i) { | ||
478 | ret = register_cpu(&per_cpu(cpu_devices, i), i); | ||
479 | if (ret) | ||
480 | printk(KERN_WARNING "topology_init: register_cpu %d " | ||
481 | "failed (%d)\n", i, ret); | ||
482 | } | ||
483 | |||
484 | return 0; | ||
485 | } | ||
486 | |||
487 | subsys_initcall(topology_init); | ||
488 | |||
489 | EXPORT_SYMBOL(flush_tlb_page); | 466 | EXPORT_SYMBOL(flush_tlb_page); |
490 | EXPORT_SYMBOL(flush_tlb_one); | 467 | EXPORT_SYMBOL(flush_tlb_one); |
diff --git a/arch/mips/kernel/smtc-asm.S b/arch/mips/kernel/smtc-asm.S index 1cb9441f1474..921207c4a83c 100644 --- a/arch/mips/kernel/smtc-asm.S +++ b/arch/mips/kernel/smtc-asm.S | |||
@@ -101,7 +101,9 @@ FEXPORT(__smtc_ipi_vector) | |||
101 | lw t0,PT_PADSLOT5(sp) | 101 | lw t0,PT_PADSLOT5(sp) |
102 | /* Argument from sender passed in stack pad slot 4 */ | 102 | /* Argument from sender passed in stack pad slot 4 */ |
103 | lw a0,PT_PADSLOT4(sp) | 103 | lw a0,PT_PADSLOT4(sp) |
104 | PTR_LA ra, _ret_from_irq | 104 | LONG_L s0, TI_REGS($28) |
105 | LONG_S sp, TI_REGS($28) | ||
106 | PTR_LA ra, ret_from_irq | ||
105 | jr t0 | 107 | jr t0 |
106 | 108 | ||
107 | /* | 109 | /* |
@@ -119,7 +121,10 @@ LEAF(self_ipi) | |||
119 | subu t1,sp,PT_SIZE | 121 | subu t1,sp,PT_SIZE |
120 | sw ra,PT_EPC(t1) | 122 | sw ra,PT_EPC(t1) |
121 | sw a0,PT_PADSLOT4(t1) | 123 | sw a0,PT_PADSLOT4(t1) |
124 | LONG_L s0, TI_REGS($28) | ||
125 | LONG_S sp, TI_REGS($28) | ||
122 | la t2,ipi_decode | 126 | la t2,ipi_decode |
127 | LONG_S s0, TI_REGS($28) | ||
123 | sw t2,PT_PADSLOT5(t1) | 128 | sw t2,PT_PADSLOT5(t1) |
124 | /* Save pre-disable value of TCStatus */ | 129 | /* Save pre-disable value of TCStatus */ |
125 | sw t0,PT_TCSTATUS(t1) | 130 | sw t0,PT_TCSTATUS(t1) |
diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c index cc1f7474f7d7..3b78caf112f5 100644 --- a/arch/mips/kernel/smtc.c +++ b/arch/mips/kernel/smtc.c | |||
@@ -476,6 +476,7 @@ void mipsmt_prepare_cpus(void) | |||
476 | write_vpe_c0_compare(0); | 476 | write_vpe_c0_compare(0); |
477 | /* Propagate Config7 */ | 477 | /* Propagate Config7 */ |
478 | write_vpe_c0_config7(read_c0_config7()); | 478 | write_vpe_c0_config7(read_c0_config7()); |
479 | write_vpe_c0_count(read_c0_count()); | ||
479 | } | 480 | } |
480 | /* enable multi-threading within VPE */ | 481 | /* enable multi-threading within VPE */ |
481 | write_vpe_c0_vpecontrol(read_vpe_c0_vpecontrol() | VPECONTROL_TE); | 482 | write_vpe_c0_vpecontrol(read_vpe_c0_vpecontrol() | VPECONTROL_TE); |
diff --git a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c index debe86c2f691..e535f86efa2f 100644 --- a/arch/mips/kernel/time.c +++ b/arch/mips/kernel/time.c | |||
@@ -11,6 +11,7 @@ | |||
11 | * Free Software Foundation; either version 2 of the License, or (at your | 11 | * Free Software Foundation; either version 2 of the License, or (at your |
12 | * option) any later version. | 12 | * option) any later version. |
13 | */ | 13 | */ |
14 | #include <linux/clocksource.h> | ||
14 | #include <linux/types.h> | 15 | #include <linux/types.h> |
15 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
16 | #include <linux/init.h> | 17 | #include <linux/init.h> |
@@ -67,15 +68,9 @@ int (*rtc_mips_set_time)(unsigned long) = null_rtc_set_time; | |||
67 | int (*rtc_mips_set_mmss)(unsigned long); | 68 | int (*rtc_mips_set_mmss)(unsigned long); |
68 | 69 | ||
69 | 70 | ||
70 | /* usecs per counter cycle, shifted to left by 32 bits */ | ||
71 | static unsigned int sll32_usecs_per_cycle; | ||
72 | |||
73 | /* how many counter cycles in a jiffy */ | 71 | /* how many counter cycles in a jiffy */ |
74 | static unsigned long cycles_per_jiffy __read_mostly; | 72 | static unsigned long cycles_per_jiffy __read_mostly; |
75 | 73 | ||
76 | /* Cycle counter value at the previous timer interrupt.. */ | ||
77 | static unsigned int timerhi, timerlo; | ||
78 | |||
79 | /* expirelo is the count value for next CPU timer interrupt */ | 74 | /* expirelo is the count value for next CPU timer interrupt */ |
80 | static unsigned int expirelo; | 75 | static unsigned int expirelo; |
81 | 76 | ||
@@ -93,7 +88,7 @@ static unsigned int null_hpt_read(void) | |||
93 | return 0; | 88 | return 0; |
94 | } | 89 | } |
95 | 90 | ||
96 | static void null_hpt_init(unsigned int count) | 91 | static void __init null_hpt_init(void) |
97 | { | 92 | { |
98 | /* nothing */ | 93 | /* nothing */ |
99 | } | 94 | } |
@@ -128,186 +123,18 @@ static unsigned int c0_hpt_read(void) | |||
128 | return read_c0_count(); | 123 | return read_c0_count(); |
129 | } | 124 | } |
130 | 125 | ||
131 | /* For use solely as a high precision timer. */ | ||
132 | static void c0_hpt_init(unsigned int count) | ||
133 | { | ||
134 | write_c0_count(read_c0_count() - count); | ||
135 | } | ||
136 | |||
137 | /* For use both as a high precision timer and an interrupt source. */ | 126 | /* For use both as a high precision timer and an interrupt source. */ |
138 | static void c0_hpt_timer_init(unsigned int count) | 127 | static void __init c0_hpt_timer_init(void) |
139 | { | 128 | { |
140 | count = read_c0_count() - count; | 129 | expirelo = read_c0_count() + cycles_per_jiffy; |
141 | expirelo = (count / cycles_per_jiffy + 1) * cycles_per_jiffy; | ||
142 | write_c0_count(expirelo - cycles_per_jiffy); | ||
143 | write_c0_compare(expirelo); | 130 | write_c0_compare(expirelo); |
144 | write_c0_count(count); | ||
145 | } | 131 | } |
146 | 132 | ||
147 | int (*mips_timer_state)(void); | 133 | int (*mips_timer_state)(void); |
148 | void (*mips_timer_ack)(void); | 134 | void (*mips_timer_ack)(void); |
149 | unsigned int (*mips_hpt_read)(void); | 135 | unsigned int (*mips_hpt_read)(void); |
150 | void (*mips_hpt_init)(unsigned int); | 136 | void (*mips_hpt_init)(void) __initdata = null_hpt_init; |
151 | 137 | unsigned int mips_hpt_mask = 0xffffffff; | |
152 | /* | ||
153 | * Gettimeoffset routines. These routines returns the time duration | ||
154 | * since last timer interrupt in usecs. | ||
155 | * | ||
156 | * If the exact CPU counter frequency is known, use fixed_rate_gettimeoffset. | ||
157 | * Otherwise use calibrate_gettimeoffset() | ||
158 | * | ||
159 | * If the CPU does not have the counter register, you can either supply | ||
160 | * your own gettimeoffset() routine, or use null_gettimeoffset(), which | ||
161 | * gives the same resolution as HZ. | ||
162 | */ | ||
163 | |||
164 | static unsigned long null_gettimeoffset(void) | ||
165 | { | ||
166 | return 0; | ||
167 | } | ||
168 | |||
169 | |||
170 | /* The function pointer to one of the gettimeoffset funcs. */ | ||
171 | unsigned long (*do_gettimeoffset)(void) = null_gettimeoffset; | ||
172 | |||
173 | |||
174 | static unsigned long fixed_rate_gettimeoffset(void) | ||
175 | { | ||
176 | u32 count; | ||
177 | unsigned long res; | ||
178 | |||
179 | /* Get last timer tick in absolute kernel time */ | ||
180 | count = mips_hpt_read(); | ||
181 | |||
182 | /* .. relative to previous jiffy (32 bits is enough) */ | ||
183 | count -= timerlo; | ||
184 | |||
185 | __asm__("multu %1,%2" | ||
186 | : "=h" (res) | ||
187 | : "r" (count), "r" (sll32_usecs_per_cycle) | ||
188 | : "lo", GCC_REG_ACCUM); | ||
189 | |||
190 | /* | ||
191 | * Due to possible jiffies inconsistencies, we need to check | ||
192 | * the result so that we'll get a timer that is monotonic. | ||
193 | */ | ||
194 | if (res >= USECS_PER_JIFFY) | ||
195 | res = USECS_PER_JIFFY - 1; | ||
196 | |||
197 | return res; | ||
198 | } | ||
199 | |||
200 | |||
201 | /* | ||
202 | * Cached "1/(clocks per usec) * 2^32" value. | ||
203 | * It has to be recalculated once each jiffy. | ||
204 | */ | ||
205 | static unsigned long cached_quotient; | ||
206 | |||
207 | /* Last jiffy when calibrate_divXX_gettimeoffset() was called. */ | ||
208 | static unsigned long last_jiffies; | ||
209 | |||
210 | /* | ||
211 | * This is moved from dec/time.c:do_ioasic_gettimeoffset() by Maciej. | ||
212 | */ | ||
213 | static unsigned long calibrate_div32_gettimeoffset(void) | ||
214 | { | ||
215 | u32 count; | ||
216 | unsigned long res, tmp; | ||
217 | unsigned long quotient; | ||
218 | |||
219 | tmp = jiffies; | ||
220 | |||
221 | quotient = cached_quotient; | ||
222 | |||
223 | if (last_jiffies != tmp) { | ||
224 | last_jiffies = tmp; | ||
225 | if (last_jiffies != 0) { | ||
226 | unsigned long r0; | ||
227 | do_div64_32(r0, timerhi, timerlo, tmp); | ||
228 | do_div64_32(quotient, USECS_PER_JIFFY, | ||
229 | USECS_PER_JIFFY_FRAC, r0); | ||
230 | cached_quotient = quotient; | ||
231 | } | ||
232 | } | ||
233 | |||
234 | /* Get last timer tick in absolute kernel time */ | ||
235 | count = mips_hpt_read(); | ||
236 | |||
237 | /* .. relative to previous jiffy (32 bits is enough) */ | ||
238 | count -= timerlo; | ||
239 | |||
240 | __asm__("multu %1,%2" | ||
241 | : "=h" (res) | ||
242 | : "r" (count), "r" (quotient) | ||
243 | : "lo", GCC_REG_ACCUM); | ||
244 | |||
245 | /* | ||
246 | * Due to possible jiffies inconsistencies, we need to check | ||
247 | * the result so that we'll get a timer that is monotonic. | ||
248 | */ | ||
249 | if (res >= USECS_PER_JIFFY) | ||
250 | res = USECS_PER_JIFFY - 1; | ||
251 | |||
252 | return res; | ||
253 | } | ||
254 | |||
255 | static unsigned long calibrate_div64_gettimeoffset(void) | ||
256 | { | ||
257 | u32 count; | ||
258 | unsigned long res, tmp; | ||
259 | unsigned long quotient; | ||
260 | |||
261 | tmp = jiffies; | ||
262 | |||
263 | quotient = cached_quotient; | ||
264 | |||
265 | if (last_jiffies != tmp) { | ||
266 | last_jiffies = tmp; | ||
267 | if (last_jiffies) { | ||
268 | unsigned long r0; | ||
269 | __asm__(".set push\n\t" | ||
270 | ".set mips3\n\t" | ||
271 | "lwu %0,%3\n\t" | ||
272 | "dsll32 %1,%2,0\n\t" | ||
273 | "or %1,%1,%0\n\t" | ||
274 | "ddivu $0,%1,%4\n\t" | ||
275 | "mflo %1\n\t" | ||
276 | "dsll32 %0,%5,0\n\t" | ||
277 | "or %0,%0,%6\n\t" | ||
278 | "ddivu $0,%0,%1\n\t" | ||
279 | "mflo %0\n\t" | ||
280 | ".set pop" | ||
281 | : "=&r" (quotient), "=&r" (r0) | ||
282 | : "r" (timerhi), "m" (timerlo), | ||
283 | "r" (tmp), "r" (USECS_PER_JIFFY), | ||
284 | "r" (USECS_PER_JIFFY_FRAC) | ||
285 | : "hi", "lo", GCC_REG_ACCUM); | ||
286 | cached_quotient = quotient; | ||
287 | } | ||
288 | } | ||
289 | |||
290 | /* Get last timer tick in absolute kernel time */ | ||
291 | count = mips_hpt_read(); | ||
292 | |||
293 | /* .. relative to previous jiffy (32 bits is enough) */ | ||
294 | count -= timerlo; | ||
295 | |||
296 | __asm__("multu %1,%2" | ||
297 | : "=h" (res) | ||
298 | : "r" (count), "r" (quotient) | ||
299 | : "lo", GCC_REG_ACCUM); | ||
300 | |||
301 | /* | ||
302 | * Due to possible jiffies inconsistencies, we need to check | ||
303 | * the result so that we'll get a timer that is monotonic. | ||
304 | */ | ||
305 | if (res >= USECS_PER_JIFFY) | ||
306 | res = USECS_PER_JIFFY - 1; | ||
307 | |||
308 | return res; | ||
309 | } | ||
310 | |||
311 | 138 | ||
312 | /* last time when xtime and rtc are sync'ed up */ | 139 | /* last time when xtime and rtc are sync'ed up */ |
313 | static long last_rtc_update; | 140 | static long last_rtc_update; |
@@ -334,18 +161,10 @@ void local_timer_interrupt(int irq, void *dev_id) | |||
334 | */ | 161 | */ |
335 | irqreturn_t timer_interrupt(int irq, void *dev_id) | 162 | irqreturn_t timer_interrupt(int irq, void *dev_id) |
336 | { | 163 | { |
337 | unsigned long j; | ||
338 | unsigned int count; | ||
339 | |||
340 | write_seqlock(&xtime_lock); | 164 | write_seqlock(&xtime_lock); |
341 | 165 | ||
342 | count = mips_hpt_read(); | ||
343 | mips_timer_ack(); | 166 | mips_timer_ack(); |
344 | 167 | ||
345 | /* Update timerhi/timerlo for intra-jiffy calibration. */ | ||
346 | timerhi += count < timerlo; /* Wrap around */ | ||
347 | timerlo = count; | ||
348 | |||
349 | /* | 168 | /* |
350 | * call the generic timer interrupt handling | 169 | * call the generic timer interrupt handling |
351 | */ | 170 | */ |
@@ -368,47 +187,6 @@ irqreturn_t timer_interrupt(int irq, void *dev_id) | |||
368 | } | 187 | } |
369 | } | 188 | } |
370 | 189 | ||
371 | /* | ||
372 | * If jiffies has overflown in this timer_interrupt, we must | ||
373 | * update the timer[hi]/[lo] to make fast gettimeoffset funcs | ||
374 | * quotient calc still valid. -arca | ||
375 | * | ||
376 | * The first timer interrupt comes late as interrupts are | ||
377 | * enabled long after timers are initialized. Therefore the | ||
378 | * high precision timer is fast, leading to wrong gettimeoffset() | ||
379 | * calculations. We deal with it by setting it based on the | ||
380 | * number of its ticks between the second and the third interrupt. | ||
381 | * That is still somewhat imprecise, but it's a good estimate. | ||
382 | * --macro | ||
383 | */ | ||
384 | j = jiffies; | ||
385 | if (j < 4) { | ||
386 | static unsigned int prev_count; | ||
387 | static int hpt_initialized; | ||
388 | |||
389 | switch (j) { | ||
390 | case 0: | ||
391 | timerhi = timerlo = 0; | ||
392 | mips_hpt_init(count); | ||
393 | break; | ||
394 | case 2: | ||
395 | prev_count = count; | ||
396 | break; | ||
397 | case 3: | ||
398 | if (!hpt_initialized) { | ||
399 | unsigned int c3 = 3 * (count - prev_count); | ||
400 | |||
401 | timerhi = 0; | ||
402 | timerlo = c3; | ||
403 | mips_hpt_init(count - c3); | ||
404 | hpt_initialized = 1; | ||
405 | } | ||
406 | break; | ||
407 | default: | ||
408 | break; | ||
409 | } | ||
410 | } | ||
411 | |||
412 | write_sequnlock(&xtime_lock); | 190 | write_sequnlock(&xtime_lock); |
413 | 191 | ||
414 | /* | 192 | /* |
@@ -476,12 +254,11 @@ asmlinkage void ll_local_timer_interrupt(int irq) | |||
476 | * 1) board_time_init() - | 254 | * 1) board_time_init() - |
477 | * a) (optional) set up RTC routines, | 255 | * a) (optional) set up RTC routines, |
478 | * b) (optional) calibrate and set the mips_hpt_frequency | 256 | * b) (optional) calibrate and set the mips_hpt_frequency |
479 | * (only needed if you intended to use fixed_rate_gettimeoffset | 257 | * (only needed if you intended to use cpu counter as timer interrupt |
480 | * or use cpu counter as timer interrupt source) | 258 | * source) |
481 | * 2) setup xtime based on rtc_mips_get_time(). | 259 | * 2) setup xtime based on rtc_mips_get_time(). |
482 | * 3) choose a appropriate gettimeoffset routine. | 260 | * 3) calculate a couple of cached variables for later usage |
483 | * 4) calculate a couple of cached variables for later usage | 261 | * 4) plat_timer_setup() - |
484 | * 5) plat_timer_setup() - | ||
485 | * a) (optional) over-write any choices made above by time_init(). | 262 | * a) (optional) over-write any choices made above by time_init(). |
486 | * b) machine specific code should setup the timer irqaction. | 263 | * b) machine specific code should setup the timer irqaction. |
487 | * c) enable the timer interrupt | 264 | * c) enable the timer interrupt |
@@ -533,13 +310,48 @@ static unsigned int __init calibrate_hpt(void) | |||
533 | } while (--i); | 310 | } while (--i); |
534 | hpt_end = mips_hpt_read(); | 311 | hpt_end = mips_hpt_read(); |
535 | 312 | ||
536 | hpt_count = hpt_end - hpt_start; | 313 | hpt_count = (hpt_end - hpt_start) & mips_hpt_mask; |
537 | hz = HZ; | 314 | hz = HZ; |
538 | frequency = (u64)hpt_count * (u64)hz; | 315 | frequency = (u64)hpt_count * (u64)hz; |
539 | 316 | ||
540 | return frequency >> log_2_loops; | 317 | return frequency >> log_2_loops; |
541 | } | 318 | } |
542 | 319 | ||
320 | static cycle_t read_mips_hpt(void) | ||
321 | { | ||
322 | return (cycle_t)mips_hpt_read(); | ||
323 | } | ||
324 | |||
325 | static struct clocksource clocksource_mips = { | ||
326 | .name = "MIPS", | ||
327 | .read = read_mips_hpt, | ||
328 | .is_continuous = 1, | ||
329 | }; | ||
330 | |||
331 | static void __init init_mips_clocksource(void) | ||
332 | { | ||
333 | u64 temp; | ||
334 | u32 shift; | ||
335 | |||
336 | if (!mips_hpt_frequency || mips_hpt_read == null_hpt_read) | ||
337 | return; | ||
338 | |||
339 | /* Calclate a somewhat reasonable rating value */ | ||
340 | clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000; | ||
341 | /* Find a shift value */ | ||
342 | for (shift = 32; shift > 0; shift--) { | ||
343 | temp = (u64) NSEC_PER_SEC << shift; | ||
344 | do_div(temp, mips_hpt_frequency); | ||
345 | if ((temp >> 32) == 0) | ||
346 | break; | ||
347 | } | ||
348 | clocksource_mips.shift = shift; | ||
349 | clocksource_mips.mult = (u32)temp; | ||
350 | clocksource_mips.mask = mips_hpt_mask; | ||
351 | |||
352 | clocksource_register(&clocksource_mips); | ||
353 | } | ||
354 | |||
543 | void __init time_init(void) | 355 | void __init time_init(void) |
544 | { | 356 | { |
545 | if (board_time_init) | 357 | if (board_time_init) |
@@ -555,41 +367,21 @@ void __init time_init(void) | |||
555 | -xtime.tv_sec, -xtime.tv_nsec); | 367 | -xtime.tv_sec, -xtime.tv_nsec); |
556 | 368 | ||
557 | /* Choose appropriate high precision timer routines. */ | 369 | /* Choose appropriate high precision timer routines. */ |
558 | if (!cpu_has_counter && !mips_hpt_read) { | 370 | if (!cpu_has_counter && !mips_hpt_read) |
559 | /* No high precision timer -- sorry. */ | 371 | /* No high precision timer -- sorry. */ |
560 | mips_hpt_read = null_hpt_read; | 372 | mips_hpt_read = null_hpt_read; |
561 | mips_hpt_init = null_hpt_init; | 373 | else if (!mips_hpt_frequency && !mips_timer_state) { |
562 | } else if (!mips_hpt_frequency && !mips_timer_state) { | ||
563 | /* A high precision timer of unknown frequency. */ | 374 | /* A high precision timer of unknown frequency. */ |
564 | if (!mips_hpt_read) { | 375 | if (!mips_hpt_read) |
565 | /* No external high precision timer -- use R4k. */ | 376 | /* No external high precision timer -- use R4k. */ |
566 | mips_hpt_read = c0_hpt_read; | 377 | mips_hpt_read = c0_hpt_read; |
567 | mips_hpt_init = c0_hpt_init; | ||
568 | } | ||
569 | |||
570 | if (cpu_has_mips32r1 || cpu_has_mips32r2 || | ||
571 | (current_cpu_data.isa_level == MIPS_CPU_ISA_I) || | ||
572 | (current_cpu_data.isa_level == MIPS_CPU_ISA_II)) | ||
573 | /* | ||
574 | * We need to calibrate the counter but we don't have | ||
575 | * 64-bit division. | ||
576 | */ | ||
577 | do_gettimeoffset = calibrate_div32_gettimeoffset; | ||
578 | else | ||
579 | /* | ||
580 | * We need to calibrate the counter but we *do* have | ||
581 | * 64-bit division. | ||
582 | */ | ||
583 | do_gettimeoffset = calibrate_div64_gettimeoffset; | ||
584 | } else { | 378 | } else { |
585 | /* We know counter frequency. Or we can get it. */ | 379 | /* We know counter frequency. Or we can get it. */ |
586 | if (!mips_hpt_read) { | 380 | if (!mips_hpt_read) { |
587 | /* No external high precision timer -- use R4k. */ | 381 | /* No external high precision timer -- use R4k. */ |
588 | mips_hpt_read = c0_hpt_read; | 382 | mips_hpt_read = c0_hpt_read; |
589 | 383 | ||
590 | if (mips_timer_state) | 384 | if (!mips_timer_state) { |
591 | mips_hpt_init = c0_hpt_init; | ||
592 | else { | ||
593 | /* No external timer interrupt -- use R4k. */ | 385 | /* No external timer interrupt -- use R4k. */ |
594 | mips_hpt_init = c0_hpt_timer_init; | 386 | mips_hpt_init = c0_hpt_timer_init; |
595 | mips_timer_ack = c0_timer_ack; | 387 | mips_timer_ack = c0_timer_ack; |
@@ -598,16 +390,9 @@ void __init time_init(void) | |||
598 | if (!mips_hpt_frequency) | 390 | if (!mips_hpt_frequency) |
599 | mips_hpt_frequency = calibrate_hpt(); | 391 | mips_hpt_frequency = calibrate_hpt(); |
600 | 392 | ||
601 | do_gettimeoffset = fixed_rate_gettimeoffset; | ||
602 | |||
603 | /* Calculate cache parameters. */ | 393 | /* Calculate cache parameters. */ |
604 | cycles_per_jiffy = (mips_hpt_frequency + HZ / 2) / HZ; | 394 | cycles_per_jiffy = (mips_hpt_frequency + HZ / 2) / HZ; |
605 | 395 | ||
606 | /* sll32_usecs_per_cycle = 10^6 * 2^32 / mips_counter_freq */ | ||
607 | do_div64_32(sll32_usecs_per_cycle, | ||
608 | 1000000, mips_hpt_frequency / 2, | ||
609 | mips_hpt_frequency); | ||
610 | |||
611 | /* Report the high precision timer rate for a reference. */ | 396 | /* Report the high precision timer rate for a reference. */ |
612 | printk("Using %u.%03u MHz high precision timer.\n", | 397 | printk("Using %u.%03u MHz high precision timer.\n", |
613 | ((mips_hpt_frequency + 500) / 1000) / 1000, | 398 | ((mips_hpt_frequency + 500) / 1000) / 1000, |
@@ -619,7 +404,7 @@ void __init time_init(void) | |||
619 | mips_timer_ack = null_timer_ack; | 404 | mips_timer_ack = null_timer_ack; |
620 | 405 | ||
621 | /* This sets up the high precision timer for the first interrupt. */ | 406 | /* This sets up the high precision timer for the first interrupt. */ |
622 | mips_hpt_init(mips_hpt_read()); | 407 | mips_hpt_init(); |
623 | 408 | ||
624 | /* | 409 | /* |
625 | * Call board specific timer interrupt setup. | 410 | * Call board specific timer interrupt setup. |
@@ -633,6 +418,8 @@ void __init time_init(void) | |||
633 | * is not invoked accidentally. | 418 | * is not invoked accidentally. |
634 | */ | 419 | */ |
635 | plat_timer_setup(&timer_irqaction); | 420 | plat_timer_setup(&timer_irqaction); |
421 | |||
422 | init_mips_clocksource(); | ||
636 | } | 423 | } |
637 | 424 | ||
638 | #define FEBRUARY 2 | 425 | #define FEBRUARY 2 |
diff --git a/arch/mips/kernel/topology.c b/arch/mips/kernel/topology.c new file mode 100644 index 000000000000..660e44ed44d7 --- /dev/null +++ b/arch/mips/kernel/topology.c | |||
@@ -0,0 +1,29 @@ | |||
1 | #include <linux/cpu.h> | ||
2 | #include <linux/cpumask.h> | ||
3 | #include <linux/init.h> | ||
4 | #include <linux/node.h> | ||
5 | #include <linux/nodemask.h> | ||
6 | #include <linux/percpu.h> | ||
7 | |||
8 | static DEFINE_PER_CPU(struct cpu, cpu_devices); | ||
9 | |||
10 | static int __init topology_init(void) | ||
11 | { | ||
12 | int i, ret; | ||
13 | |||
14 | #ifdef CONFIG_NUMA | ||
15 | for_each_online_node(i) | ||
16 | register_one_node(i); | ||
17 | #endif /* CONFIG_NUMA */ | ||
18 | |||
19 | for_each_present_cpu(i) { | ||
20 | ret = register_cpu(&per_cpu(cpu_devices, i), i); | ||
21 | if (ret) | ||
22 | printk(KERN_WARNING "topology_init: register_cpu %d " | ||
23 | "failed (%d)\n", i, ret); | ||
24 | } | ||
25 | |||
26 | return 0; | ||
27 | } | ||
28 | |||
29 | subsys_initcall(topology_init); | ||
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index cce8313ec27d..9fda1b8be3a7 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -1111,7 +1111,7 @@ static struct shadow_registers { | |||
1111 | static void mips_srs_init(void) | 1111 | static void mips_srs_init(void) |
1112 | { | 1112 | { |
1113 | shadow_registers.sr_supported = ((read_c0_srsctl() >> 26) & 0x0f) + 1; | 1113 | shadow_registers.sr_supported = ((read_c0_srsctl() >> 26) & 0x0f) + 1; |
1114 | printk(KERN_INFO "%d MIPSR2 register sets available\n", | 1114 | printk(KERN_INFO "%ld MIPSR2 register sets available\n", |
1115 | shadow_registers.sr_supported); | 1115 | shadow_registers.sr_supported); |
1116 | shadow_registers.sr_allocated = 1; /* Set 0 used by kernel */ | 1116 | shadow_registers.sr_allocated = 1; /* Set 0 used by kernel */ |
1117 | } | 1117 | } |
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 0bb9cd889456..79f0317d84ac 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S | |||
@@ -50,6 +50,16 @@ SECTIONS | |||
50 | /* writeable */ | 50 | /* writeable */ |
51 | .data : { /* Data */ | 51 | .data : { /* Data */ |
52 | . = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */ | 52 | . = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */ |
53 | /* | ||
54 | * This ALIGN is needed as a workaround for a bug a gcc bug upto 4.1 which | ||
55 | * limits the maximum alignment to at most 32kB and results in the following | ||
56 | * warning: | ||
57 | * | ||
58 | * CC arch/mips/kernel/init_task.o | ||
59 | * arch/mips/kernel/init_task.c:30: warning: alignment of ‘init_thread_union’ | ||
60 | * is greater than maximum object file alignment. Using 32768 | ||
61 | */ | ||
62 | . = ALIGN(_PAGE_SIZE); | ||
53 | *(.data.init_task) | 63 | *(.data.init_task) |
54 | 64 | ||
55 | *(.data) | 65 | *(.data) |
@@ -91,13 +101,7 @@ SECTIONS | |||
91 | 101 | ||
92 | __initcall_start = .; | 102 | __initcall_start = .; |
93 | .initcall.init : { | 103 | .initcall.init : { |
94 | *(.initcall1.init) | 104 | INITCALLS |
95 | *(.initcall2.init) | ||
96 | *(.initcall3.init) | ||
97 | *(.initcall4.init) | ||
98 | *(.initcall5.init) | ||
99 | *(.initcall6.init) | ||
100 | *(.initcall7.init) | ||
101 | } | 105 | } |
102 | __initcall_end = .; | 106 | __initcall_end = .; |
103 | 107 | ||
diff --git a/arch/mips/lib-64/dump_tlb.c b/arch/mips/lib-64/dump_tlb.c index be8261be679b..594df1a05ecc 100644 --- a/arch/mips/lib-64/dump_tlb.c +++ b/arch/mips/lib-64/dump_tlb.c | |||
@@ -149,7 +149,7 @@ void dump_list_process(struct task_struct *t, void *address) | |||
149 | printk("Addr == %08lx\n", addr); | 149 | printk("Addr == %08lx\n", addr); |
150 | printk("tasks->mm.pgd == %08lx\n", (unsigned long) t->mm->pgd); | 150 | printk("tasks->mm.pgd == %08lx\n", (unsigned long) t->mm->pgd); |
151 | 151 | ||
152 | page_dir = pgd_offset(t->mm, 0); | 152 | page_dir = pgd_offset(t->mm, 0UL); |
153 | printk("page_dir == %016lx\n", (unsigned long) page_dir); | 153 | printk("page_dir == %016lx\n", (unsigned long) page_dir); |
154 | 154 | ||
155 | pgd = pgd_offset(t->mm, addr); | 155 | pgd = pgd_offset(t->mm, addr); |
@@ -184,13 +184,13 @@ void dump_list_current(void *address) | |||
184 | dump_list_process(current, address); | 184 | dump_list_process(current, address); |
185 | } | 185 | } |
186 | 186 | ||
187 | unsigned int vtop(void *address) | 187 | unsigned long vtop(void *address) |
188 | { | 188 | { |
189 | pgd_t *pgd; | 189 | pgd_t *pgd; |
190 | pud_t *pud; | 190 | pud_t *pud; |
191 | pmd_t *pmd; | 191 | pmd_t *pmd; |
192 | pte_t *pte; | 192 | pte_t *pte; |
193 | unsigned int addr, paddr; | 193 | unsigned long addr, paddr; |
194 | 194 | ||
195 | addr = (unsigned long) address; | 195 | addr = (unsigned long) address; |
196 | pgd = pgd_offset(current->mm, addr); | 196 | pgd = pgd_offset(current->mm, addr); |
diff --git a/arch/mips/mips-boards/generic/memory.c b/arch/mips/mips-boards/generic/memory.c index be80c5dd4a0c..eeed944e0f83 100644 --- a/arch/mips/mips-boards/generic/memory.c +++ b/arch/mips/mips-boards/generic/memory.c | |||
@@ -176,7 +176,7 @@ unsigned long __init prom_free_prom_memory(void) | |||
176 | if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA) | 176 | if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA) |
177 | continue; | 177 | continue; |
178 | 178 | ||
179 | addr = boot_mem_map.map[i].addr; | 179 | addr = PAGE_ALIGN(boot_mem_map.map[i].addr); |
180 | while (addr < boot_mem_map.map[i].addr | 180 | while (addr < boot_mem_map.map[i].addr |
181 | + boot_mem_map.map[i].size) { | 181 | + boot_mem_map.map[i].size) { |
182 | ClearPageReserved(virt_to_page(__va(addr))); | 182 | ClearPageReserved(virt_to_page(__va(addr))); |
diff --git a/arch/mips/mips-boards/generic/pci.c b/arch/mips/mips-boards/generic/pci.c index 9337f6c8873a..3192a14698c8 100644 --- a/arch/mips/mips-boards/generic/pci.c +++ b/arch/mips/mips-boards/generic/pci.c | |||
@@ -90,7 +90,7 @@ static struct pci_controller msc_controller = { | |||
90 | void __init mips_pcibios_init(void) | 90 | void __init mips_pcibios_init(void) |
91 | { | 91 | { |
92 | struct pci_controller *controller; | 92 | struct pci_controller *controller; |
93 | unsigned long start, end, map, start1, end1, map1, map2, map3, mask; | 93 | resource_size_t start, end, map, start1, end1, map1, map2, map3, mask; |
94 | 94 | ||
95 | switch (mips_revision_corid) { | 95 | switch (mips_revision_corid) { |
96 | case MIPS_REVISION_CORID_QED_RM5261: | 96 | case MIPS_REVISION_CORID_QED_RM5261: |
diff --git a/arch/mips/mips-boards/generic/time.c b/arch/mips/mips-boards/generic/time.c index 6f8a9fe7c1e3..d817c60c5ca5 100644 --- a/arch/mips/mips-boards/generic/time.c +++ b/arch/mips/mips-boards/generic/time.c | |||
@@ -187,7 +187,7 @@ out: | |||
187 | } | 187 | } |
188 | 188 | ||
189 | /* | 189 | /* |
190 | * Estimate CPU frequency. Sets mips_counter_frequency as a side-effect | 190 | * Estimate CPU frequency. Sets mips_hpt_frequency as a side-effect |
191 | */ | 191 | */ |
192 | static unsigned int __init estimate_cpu_frequency(void) | 192 | static unsigned int __init estimate_cpu_frequency(void) |
193 | { | 193 | { |
@@ -208,7 +208,8 @@ static unsigned int __init estimate_cpu_frequency(void) | |||
208 | count = 6000000; | 208 | count = 6000000; |
209 | #endif | 209 | #endif |
210 | #if defined(CONFIG_MIPS_ATLAS) || defined(CONFIG_MIPS_MALTA) | 210 | #if defined(CONFIG_MIPS_ATLAS) || defined(CONFIG_MIPS_MALTA) |
211 | unsigned int flags; | 211 | unsigned long flags; |
212 | unsigned int start; | ||
212 | 213 | ||
213 | local_irq_save(flags); | 214 | local_irq_save(flags); |
214 | 215 | ||
@@ -217,13 +218,13 @@ static unsigned int __init estimate_cpu_frequency(void) | |||
217 | while (!(CMOS_READ(RTC_REG_A) & RTC_UIP)); | 218 | while (!(CMOS_READ(RTC_REG_A) & RTC_UIP)); |
218 | 219 | ||
219 | /* Start r4k counter. */ | 220 | /* Start r4k counter. */ |
220 | write_c0_count(0); | 221 | start = read_c0_count(); |
221 | 222 | ||
222 | /* Read counter exactly on falling edge of update flag */ | 223 | /* Read counter exactly on falling edge of update flag */ |
223 | while (CMOS_READ(RTC_REG_A) & RTC_UIP); | 224 | while (CMOS_READ(RTC_REG_A) & RTC_UIP); |
224 | while (!(CMOS_READ(RTC_REG_A) & RTC_UIP)); | 225 | while (!(CMOS_READ(RTC_REG_A) & RTC_UIP)); |
225 | 226 | ||
226 | count = read_c0_count(); | 227 | count = read_c0_count() - start; |
227 | 228 | ||
228 | /* restore interrupts */ | 229 | /* restore interrupts */ |
229 | local_irq_restore(flags); | 230 | local_irq_restore(flags); |
diff --git a/arch/mips/mips-boards/malta/malta_setup.c b/arch/mips/mips-boards/malta/malta_setup.c index ab460f805bef..282f3e52eea3 100644 --- a/arch/mips/mips-boards/malta/malta_setup.c +++ b/arch/mips/mips-boards/malta/malta_setup.c | |||
@@ -159,7 +159,7 @@ void __init plat_mem_setup(void) | |||
159 | BONITO_PCIMEMBASECFG |= | 159 | BONITO_PCIMEMBASECFG |= |
160 | (BONITO_PCIMEMBASECFG_MEMBASE0_CACHED | | 160 | (BONITO_PCIMEMBASECFG_MEMBASE0_CACHED | |
161 | BONITO_PCIMEMBASECFG_MEMBASE1_CACHED); | 161 | BONITO_PCIMEMBASECFG_MEMBASE1_CACHED); |
162 | printk("Disabled Bonito IOBC coherency\n"); | 162 | printk("Enabled Bonito IOBC coherency\n"); |
163 | } | 163 | } |
164 | } | 164 | } |
165 | else | 165 | else |
diff --git a/arch/mips/mips-boards/sim/sim_time.c b/arch/mips/mips-boards/sim/sim_time.c index c566b9bd0427..24a4ed00cc0a 100644 --- a/arch/mips/mips-boards/sim/sim_time.c +++ b/arch/mips/mips-boards/sim/sim_time.c | |||
@@ -102,7 +102,7 @@ irqreturn_t sim_timer_interrupt(int irq, void *dev_id) | |||
102 | 102 | ||
103 | 103 | ||
104 | /* | 104 | /* |
105 | * Estimate CPU frequency. Sets mips_counter_frequency as a side-effect | 105 | * Estimate CPU frequency. Sets mips_hpt_frequency as a side-effect |
106 | */ | 106 | */ |
107 | static unsigned int __init estimate_cpu_frequency(void) | 107 | static unsigned int __init estimate_cpu_frequency(void) |
108 | { | 108 | { |
diff --git a/arch/mips/mm/c-sb1.c b/arch/mips/mm/c-sb1.c index 5537558f19f7..3a8afd47feaa 100644 --- a/arch/mips/mm/c-sb1.c +++ b/arch/mips/mm/c-sb1.c | |||
@@ -19,6 +19,7 @@ | |||
19 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 19 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
20 | */ | 20 | */ |
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/hardirq.h> | ||
22 | 23 | ||
23 | #include <asm/asm.h> | 24 | #include <asm/asm.h> |
24 | #include <asm/bootinfo.h> | 25 | #include <asm/bootinfo.h> |
@@ -49,6 +50,15 @@ static unsigned short dcache_sets; | |||
49 | static unsigned int icache_range_cutoff; | 50 | static unsigned int icache_range_cutoff; |
50 | static unsigned int dcache_range_cutoff; | 51 | static unsigned int dcache_range_cutoff; |
51 | 52 | ||
53 | static inline void sb1_on_each_cpu(void (*func) (void *info), void *info, | ||
54 | int retry, int wait) | ||
55 | { | ||
56 | preempt_disable(); | ||
57 | smp_call_function(func, info, retry, wait); | ||
58 | func(info); | ||
59 | preempt_enable(); | ||
60 | } | ||
61 | |||
52 | /* | 62 | /* |
53 | * The dcache is fully coherent to the system, with one | 63 | * The dcache is fully coherent to the system, with one |
54 | * big caveat: the instruction stream. In other words, | 64 | * big caveat: the instruction stream. In other words, |
@@ -226,13 +236,32 @@ static void sb1_flush_cache_page(struct vm_area_struct *vma, unsigned long addr, | |||
226 | args.vma = vma; | 236 | args.vma = vma; |
227 | args.addr = addr; | 237 | args.addr = addr; |
228 | args.pfn = pfn; | 238 | args.pfn = pfn; |
229 | on_each_cpu(sb1_flush_cache_page_ipi, (void *) &args, 1, 1); | 239 | sb1_on_each_cpu(sb1_flush_cache_page_ipi, (void *) &args, 1, 1); |
230 | } | 240 | } |
231 | #else | 241 | #else |
232 | void sb1_flush_cache_page(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn) | 242 | void sb1_flush_cache_page(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn) |
233 | __attribute__((alias("local_sb1_flush_cache_page"))); | 243 | __attribute__((alias("local_sb1_flush_cache_page"))); |
234 | #endif | 244 | #endif |
235 | 245 | ||
246 | #ifdef CONFIG_SMP | ||
247 | static void sb1_flush_cache_data_page_ipi(void *info) | ||
248 | { | ||
249 | unsigned long start = (unsigned long)info; | ||
250 | |||
251 | __sb1_writeback_inv_dcache_range(start, start + PAGE_SIZE); | ||
252 | } | ||
253 | |||
254 | static void sb1_flush_cache_data_page(unsigned long addr) | ||
255 | { | ||
256 | if (in_atomic()) | ||
257 | __sb1_writeback_inv_dcache_range(addr, addr + PAGE_SIZE); | ||
258 | else | ||
259 | on_each_cpu(sb1_flush_cache_data_page_ipi, (void *) addr, 1, 1); | ||
260 | } | ||
261 | #else | ||
262 | void sb1_flush_cache_data_page(unsigned long) | ||
263 | __attribute__((alias("local_sb1_flush_cache_data_page"))); | ||
264 | #endif | ||
236 | 265 | ||
237 | /* | 266 | /* |
238 | * Invalidate all caches on this CPU | 267 | * Invalidate all caches on this CPU |
@@ -249,7 +278,7 @@ void sb1___flush_cache_all_ipi(void *ignored) | |||
249 | 278 | ||
250 | static void sb1___flush_cache_all(void) | 279 | static void sb1___flush_cache_all(void) |
251 | { | 280 | { |
252 | on_each_cpu(sb1___flush_cache_all_ipi, 0, 1, 1); | 281 | sb1_on_each_cpu(sb1___flush_cache_all_ipi, 0, 1, 1); |
253 | } | 282 | } |
254 | #else | 283 | #else |
255 | void sb1___flush_cache_all(void) | 284 | void sb1___flush_cache_all(void) |
@@ -299,7 +328,7 @@ void sb1_flush_icache_range(unsigned long start, unsigned long end) | |||
299 | 328 | ||
300 | args.start = start; | 329 | args.start = start; |
301 | args.end = end; | 330 | args.end = end; |
302 | on_each_cpu(sb1_flush_icache_range_ipi, &args, 1, 1); | 331 | sb1_on_each_cpu(sb1_flush_icache_range_ipi, &args, 1, 1); |
303 | } | 332 | } |
304 | #else | 333 | #else |
305 | void sb1_flush_icache_range(unsigned long start, unsigned long end) | 334 | void sb1_flush_icache_range(unsigned long start, unsigned long end) |
@@ -326,7 +355,7 @@ static void sb1_flush_cache_sigtramp_ipi(void *info) | |||
326 | 355 | ||
327 | static void sb1_flush_cache_sigtramp(unsigned long addr) | 356 | static void sb1_flush_cache_sigtramp(unsigned long addr) |
328 | { | 357 | { |
329 | on_each_cpu(sb1_flush_cache_sigtramp_ipi, (void *) addr, 1, 1); | 358 | sb1_on_each_cpu(sb1_flush_cache_sigtramp_ipi, (void *) addr, 1, 1); |
330 | } | 359 | } |
331 | #else | 360 | #else |
332 | void sb1_flush_cache_sigtramp(unsigned long addr) | 361 | void sb1_flush_cache_sigtramp(unsigned long addr) |
@@ -444,7 +473,6 @@ static __init void probe_cache_sizes(void) | |||
444 | void sb1_cache_init(void) | 473 | void sb1_cache_init(void) |
445 | { | 474 | { |
446 | extern char except_vec2_sb1; | 475 | extern char except_vec2_sb1; |
447 | extern char handle_vec2_sb1; | ||
448 | 476 | ||
449 | /* Special cache error handler for SB1 */ | 477 | /* Special cache error handler for SB1 */ |
450 | set_uncached_handler (0x100, &except_vec2_sb1, 0x80); | 478 | set_uncached_handler (0x100, &except_vec2_sb1, 0x80); |
@@ -473,7 +501,7 @@ void sb1_cache_init(void) | |||
473 | 501 | ||
474 | flush_cache_sigtramp = sb1_flush_cache_sigtramp; | 502 | flush_cache_sigtramp = sb1_flush_cache_sigtramp; |
475 | local_flush_data_cache_page = (void *) sb1_nop; | 503 | local_flush_data_cache_page = (void *) sb1_nop; |
476 | flush_data_cache_page = (void *) sb1_nop; | 504 | flush_data_cache_page = sb1_flush_cache_data_page; |
477 | 505 | ||
478 | /* Full flush */ | 506 | /* Full flush */ |
479 | __flush_cache_all = sb1___flush_cache_all; | 507 | __flush_cache_all = sb1___flush_cache_all; |
@@ -497,5 +525,5 @@ void sb1_cache_init(void) | |||
497 | : | 525 | : |
498 | : "memory"); | 526 | : "memory"); |
499 | 527 | ||
500 | flush_cache_all(); | 528 | local_sb1___flush_cache_all(); |
501 | } | 529 | } |
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c index 88b72c9a8495..2de4d3c367a2 100644 --- a/arch/mips/mm/init.c +++ b/arch/mips/mm/init.c | |||
@@ -30,11 +30,34 @@ | |||
30 | #include <asm/cachectl.h> | 30 | #include <asm/cachectl.h> |
31 | #include <asm/cpu.h> | 31 | #include <asm/cpu.h> |
32 | #include <asm/dma.h> | 32 | #include <asm/dma.h> |
33 | #include <asm/kmap_types.h> | ||
33 | #include <asm/mmu_context.h> | 34 | #include <asm/mmu_context.h> |
34 | #include <asm/sections.h> | 35 | #include <asm/sections.h> |
35 | #include <asm/pgtable.h> | 36 | #include <asm/pgtable.h> |
36 | #include <asm/pgalloc.h> | 37 | #include <asm/pgalloc.h> |
37 | #include <asm/tlb.h> | 38 | #include <asm/tlb.h> |
39 | #include <asm/fixmap.h> | ||
40 | |||
41 | /* Atomicity and interruptability */ | ||
42 | #ifdef CONFIG_MIPS_MT_SMTC | ||
43 | |||
44 | #include <asm/mipsmtregs.h> | ||
45 | |||
46 | #define ENTER_CRITICAL(flags) \ | ||
47 | { \ | ||
48 | unsigned int mvpflags; \ | ||
49 | local_irq_save(flags);\ | ||
50 | mvpflags = dvpe() | ||
51 | #define EXIT_CRITICAL(flags) \ | ||
52 | evpe(mvpflags); \ | ||
53 | local_irq_restore(flags); \ | ||
54 | } | ||
55 | #else | ||
56 | |||
57 | #define ENTER_CRITICAL(flags) local_irq_save(flags) | ||
58 | #define EXIT_CRITICAL(flags) local_irq_restore(flags) | ||
59 | |||
60 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
38 | 61 | ||
39 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 62 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
40 | 63 | ||
@@ -80,13 +103,142 @@ unsigned long setup_zero_pages(void) | |||
80 | return 1UL << order; | 103 | return 1UL << order; |
81 | } | 104 | } |
82 | 105 | ||
83 | #ifdef CONFIG_HIGHMEM | 106 | /* |
84 | pte_t *kmap_pte; | 107 | * These are almost like kmap_atomic / kunmap_atmic except they take an |
85 | pgprot_t kmap_prot; | 108 | * additional address argument as the hint. |
109 | */ | ||
86 | 110 | ||
87 | #define kmap_get_fixmap_pte(vaddr) \ | 111 | #define kmap_get_fixmap_pte(vaddr) \ |
88 | pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)), (vaddr)) | 112 | pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)), (vaddr)) |
89 | 113 | ||
114 | #ifdef CONFIG_MIPS_MT_SMTC | ||
115 | static pte_t *kmap_coherent_pte; | ||
116 | static void __init kmap_coherent_init(void) | ||
117 | { | ||
118 | unsigned long vaddr; | ||
119 | |||
120 | /* cache the first coherent kmap pte */ | ||
121 | vaddr = __fix_to_virt(FIX_CMAP_BEGIN); | ||
122 | kmap_coherent_pte = kmap_get_fixmap_pte(vaddr); | ||
123 | } | ||
124 | #else | ||
125 | static inline void kmap_coherent_init(void) {} | ||
126 | #endif | ||
127 | |||
128 | static inline void *kmap_coherent(struct page *page, unsigned long addr) | ||
129 | { | ||
130 | enum fixed_addresses idx; | ||
131 | unsigned long vaddr, flags, entrylo; | ||
132 | unsigned long old_ctx; | ||
133 | pte_t pte; | ||
134 | int tlbidx; | ||
135 | |||
136 | inc_preempt_count(); | ||
137 | idx = (addr >> PAGE_SHIFT) & (FIX_N_COLOURS - 1); | ||
138 | #ifdef CONFIG_MIPS_MT_SMTC | ||
139 | idx += FIX_N_COLOURS * smp_processor_id(); | ||
140 | #endif | ||
141 | vaddr = __fix_to_virt(FIX_CMAP_END - idx); | ||
142 | pte = mk_pte(page, PAGE_KERNEL); | ||
143 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1) | ||
144 | entrylo = pte.pte_high; | ||
145 | #else | ||
146 | entrylo = pte_val(pte) >> 6; | ||
147 | #endif | ||
148 | |||
149 | ENTER_CRITICAL(flags); | ||
150 | old_ctx = read_c0_entryhi(); | ||
151 | write_c0_entryhi(vaddr & (PAGE_MASK << 1)); | ||
152 | write_c0_entrylo0(entrylo); | ||
153 | write_c0_entrylo1(entrylo); | ||
154 | #ifdef CONFIG_MIPS_MT_SMTC | ||
155 | set_pte(kmap_coherent_pte - (FIX_CMAP_END - idx), pte); | ||
156 | /* preload TLB instead of local_flush_tlb_one() */ | ||
157 | mtc0_tlbw_hazard(); | ||
158 | tlb_probe(); | ||
159 | tlb_probe_hazard(); | ||
160 | tlbidx = read_c0_index(); | ||
161 | mtc0_tlbw_hazard(); | ||
162 | if (tlbidx < 0) | ||
163 | tlb_write_random(); | ||
164 | else | ||
165 | tlb_write_indexed(); | ||
166 | #else | ||
167 | tlbidx = read_c0_wired(); | ||
168 | write_c0_wired(tlbidx + 1); | ||
169 | write_c0_index(tlbidx); | ||
170 | mtc0_tlbw_hazard(); | ||
171 | tlb_write_indexed(); | ||
172 | #endif | ||
173 | tlbw_use_hazard(); | ||
174 | write_c0_entryhi(old_ctx); | ||
175 | EXIT_CRITICAL(flags); | ||
176 | |||
177 | return (void*) vaddr; | ||
178 | } | ||
179 | |||
180 | #define UNIQUE_ENTRYHI(idx) (CKSEG0 + ((idx) << (PAGE_SHIFT + 1))) | ||
181 | |||
182 | static inline void kunmap_coherent(struct page *page) | ||
183 | { | ||
184 | #ifndef CONFIG_MIPS_MT_SMTC | ||
185 | unsigned int wired; | ||
186 | unsigned long flags, old_ctx; | ||
187 | |||
188 | ENTER_CRITICAL(flags); | ||
189 | old_ctx = read_c0_entryhi(); | ||
190 | wired = read_c0_wired() - 1; | ||
191 | write_c0_wired(wired); | ||
192 | write_c0_index(wired); | ||
193 | write_c0_entryhi(UNIQUE_ENTRYHI(wired)); | ||
194 | write_c0_entrylo0(0); | ||
195 | write_c0_entrylo1(0); | ||
196 | mtc0_tlbw_hazard(); | ||
197 | tlb_write_indexed(); | ||
198 | tlbw_use_hazard(); | ||
199 | write_c0_entryhi(old_ctx); | ||
200 | EXIT_CRITICAL(flags); | ||
201 | #endif | ||
202 | dec_preempt_count(); | ||
203 | preempt_check_resched(); | ||
204 | } | ||
205 | |||
206 | void copy_to_user_page(struct vm_area_struct *vma, | ||
207 | struct page *page, unsigned long vaddr, void *dst, const void *src, | ||
208 | unsigned long len) | ||
209 | { | ||
210 | if (cpu_has_dc_aliases) { | ||
211 | void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK); | ||
212 | memcpy(vto, src, len); | ||
213 | kunmap_coherent(page); | ||
214 | } else | ||
215 | memcpy(dst, src, len); | ||
216 | if ((vma->vm_flags & VM_EXEC) && !cpu_has_ic_fills_f_dc) | ||
217 | flush_cache_page(vma, vaddr, page_to_pfn(page)); | ||
218 | } | ||
219 | |||
220 | EXPORT_SYMBOL(copy_to_user_page); | ||
221 | |||
222 | void copy_from_user_page(struct vm_area_struct *vma, | ||
223 | struct page *page, unsigned long vaddr, void *dst, const void *src, | ||
224 | unsigned long len) | ||
225 | { | ||
226 | if (cpu_has_dc_aliases) { | ||
227 | void *vfrom = | ||
228 | kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK); | ||
229 | memcpy(dst, vfrom, len); | ||
230 | kunmap_coherent(page); | ||
231 | } else | ||
232 | memcpy(dst, src, len); | ||
233 | } | ||
234 | |||
235 | EXPORT_SYMBOL(copy_from_user_page); | ||
236 | |||
237 | |||
238 | #ifdef CONFIG_HIGHMEM | ||
239 | pte_t *kmap_pte; | ||
240 | pgprot_t kmap_prot; | ||
241 | |||
90 | static void __init kmap_init(void) | 242 | static void __init kmap_init(void) |
91 | { | 243 | { |
92 | unsigned long kmap_vstart; | 244 | unsigned long kmap_vstart; |
@@ -97,11 +249,12 @@ static void __init kmap_init(void) | |||
97 | 249 | ||
98 | kmap_prot = PAGE_KERNEL; | 250 | kmap_prot = PAGE_KERNEL; |
99 | } | 251 | } |
252 | #endif /* CONFIG_HIGHMEM */ | ||
100 | 253 | ||
101 | #ifdef CONFIG_32BIT | ||
102 | void __init fixrange_init(unsigned long start, unsigned long end, | 254 | void __init fixrange_init(unsigned long start, unsigned long end, |
103 | pgd_t *pgd_base) | 255 | pgd_t *pgd_base) |
104 | { | 256 | { |
257 | #if defined(CONFIG_HIGHMEM) || defined(CONFIG_MIPS_MT_SMTC) | ||
105 | pgd_t *pgd; | 258 | pgd_t *pgd; |
106 | pud_t *pud; | 259 | pud_t *pud; |
107 | pmd_t *pmd; | 260 | pmd_t *pmd; |
@@ -122,7 +275,7 @@ void __init fixrange_init(unsigned long start, unsigned long end, | |||
122 | for (; (k < PTRS_PER_PMD) && (vaddr != end); pmd++, k++) { | 275 | for (; (k < PTRS_PER_PMD) && (vaddr != end); pmd++, k++) { |
123 | if (pmd_none(*pmd)) { | 276 | if (pmd_none(*pmd)) { |
124 | pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE); | 277 | pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE); |
125 | set_pmd(pmd, __pmd(pte)); | 278 | set_pmd(pmd, __pmd((unsigned long)pte)); |
126 | if (pte != pte_offset_kernel(pmd, 0)) | 279 | if (pte != pte_offset_kernel(pmd, 0)) |
127 | BUG(); | 280 | BUG(); |
128 | } | 281 | } |
@@ -132,9 +285,8 @@ void __init fixrange_init(unsigned long start, unsigned long end, | |||
132 | } | 285 | } |
133 | j = 0; | 286 | j = 0; |
134 | } | 287 | } |
288 | #endif | ||
135 | } | 289 | } |
136 | #endif /* CONFIG_32BIT */ | ||
137 | #endif /* CONFIG_HIGHMEM */ | ||
138 | 290 | ||
139 | #ifndef CONFIG_NEED_MULTIPLE_NODES | 291 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
140 | extern void pagetable_init(void); | 292 | extern void pagetable_init(void); |
@@ -175,6 +327,7 @@ void __init paging_init(void) | |||
175 | #ifdef CONFIG_HIGHMEM | 327 | #ifdef CONFIG_HIGHMEM |
176 | kmap_init(); | 328 | kmap_init(); |
177 | #endif | 329 | #endif |
330 | kmap_coherent_init(); | ||
178 | 331 | ||
179 | max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT; | 332 | max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT; |
180 | low = max_low_pfn; | 333 | low = max_low_pfn; |
diff --git a/arch/mips/mm/pg-r4k.c b/arch/mips/mm/pg-r4k.c index b7c749232ffe..d41fc5885e87 100644 --- a/arch/mips/mm/pg-r4k.c +++ b/arch/mips/mm/pg-r4k.c | |||
@@ -270,6 +270,20 @@ static inline void build_addiu_a2_a0(unsigned long offset) | |||
270 | emit_instruction(mi); | 270 | emit_instruction(mi); |
271 | } | 271 | } |
272 | 272 | ||
273 | static inline void build_addiu_a2(unsigned long offset) | ||
274 | { | ||
275 | union mips_instruction mi; | ||
276 | |||
277 | BUG_ON(offset > 0x7fff); | ||
278 | |||
279 | mi.i_format.opcode = cpu_has_64bit_gp_regs ? daddiu_op : addiu_op; | ||
280 | mi.i_format.rs = 6; /* $a2 */ | ||
281 | mi.i_format.rt = 6; /* $a2 */ | ||
282 | mi.i_format.simmediate = offset; | ||
283 | |||
284 | emit_instruction(mi); | ||
285 | } | ||
286 | |||
273 | static inline void build_addiu_a1(unsigned long offset) | 287 | static inline void build_addiu_a1(unsigned long offset) |
274 | { | 288 | { |
275 | union mips_instruction mi; | 289 | union mips_instruction mi; |
@@ -333,6 +347,7 @@ static inline void build_jr_ra(void) | |||
333 | void __init build_clear_page(void) | 347 | void __init build_clear_page(void) |
334 | { | 348 | { |
335 | unsigned int loop_start; | 349 | unsigned int loop_start; |
350 | unsigned long off; | ||
336 | 351 | ||
337 | epc = (unsigned int *) &clear_page_array; | 352 | epc = (unsigned int *) &clear_page_array; |
338 | instruction_pending = 0; | 353 | instruction_pending = 0; |
@@ -369,7 +384,12 @@ void __init build_clear_page(void) | |||
369 | } | 384 | } |
370 | } | 385 | } |
371 | 386 | ||
372 | build_addiu_a2_a0(PAGE_SIZE - (cpu_has_prefetch ? pref_offset_clear : 0)); | 387 | off = PAGE_SIZE - (cpu_has_prefetch ? pref_offset_clear : 0); |
388 | if (off > 0x7fff) { | ||
389 | build_addiu_a2_a0(off >> 1); | ||
390 | build_addiu_a2(off >> 1); | ||
391 | } else | ||
392 | build_addiu_a2_a0(off); | ||
373 | 393 | ||
374 | if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x()) | 394 | if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x()) |
375 | build_insn_word(0x3c01a000); /* lui $at, 0xa000 */ | 395 | build_insn_word(0x3c01a000); /* lui $at, 0xa000 */ |
@@ -420,12 +440,18 @@ dest = label(); | |||
420 | void __init build_copy_page(void) | 440 | void __init build_copy_page(void) |
421 | { | 441 | { |
422 | unsigned int loop_start; | 442 | unsigned int loop_start; |
443 | unsigned long off; | ||
423 | 444 | ||
424 | epc = (unsigned int *) ©_page_array; | 445 | epc = (unsigned int *) ©_page_array; |
425 | store_offset = load_offset = 0; | 446 | store_offset = load_offset = 0; |
426 | instruction_pending = 0; | 447 | instruction_pending = 0; |
427 | 448 | ||
428 | build_addiu_a2_a0(PAGE_SIZE - (cpu_has_prefetch ? pref_offset_copy : 0)); | 449 | off = PAGE_SIZE - (cpu_has_prefetch ? pref_offset_copy : 0); |
450 | if (off > 0x7fff) { | ||
451 | build_addiu_a2_a0(off >> 1); | ||
452 | build_addiu_a2(off >> 1); | ||
453 | } else | ||
454 | build_addiu_a2_a0(off); | ||
429 | 455 | ||
430 | if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x()) | 456 | if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x()) |
431 | build_insn_word(0x3c01a000); /* lui $at, 0xa000 */ | 457 | build_insn_word(0x3c01a000); /* lui $at, 0xa000 */ |
diff --git a/arch/mips/mm/pgtable-32.c b/arch/mips/mm/pgtable-32.c index 4bdaa05f485b..4a61e624b0ec 100644 --- a/arch/mips/mm/pgtable-32.c +++ b/arch/mips/mm/pgtable-32.c | |||
@@ -31,9 +31,10 @@ void pgd_init(unsigned long page) | |||
31 | 31 | ||
32 | void __init pagetable_init(void) | 32 | void __init pagetable_init(void) |
33 | { | 33 | { |
34 | #ifdef CONFIG_HIGHMEM | ||
35 | unsigned long vaddr; | 34 | unsigned long vaddr; |
36 | pgd_t *pgd, *pgd_base; | 35 | pgd_t *pgd_base; |
36 | #ifdef CONFIG_HIGHMEM | ||
37 | pgd_t *pgd; | ||
37 | pud_t *pud; | 38 | pud_t *pud; |
38 | pmd_t *pmd; | 39 | pmd_t *pmd; |
39 | pte_t *pte; | 40 | pte_t *pte; |
@@ -44,7 +45,6 @@ void __init pagetable_init(void) | |||
44 | pgd_init((unsigned long)swapper_pg_dir | 45 | pgd_init((unsigned long)swapper_pg_dir |
45 | + sizeof(pgd_t) * USER_PTRS_PER_PGD); | 46 | + sizeof(pgd_t) * USER_PTRS_PER_PGD); |
46 | 47 | ||
47 | #ifdef CONFIG_HIGHMEM | ||
48 | pgd_base = swapper_pg_dir; | 48 | pgd_base = swapper_pg_dir; |
49 | 49 | ||
50 | /* | 50 | /* |
@@ -53,6 +53,7 @@ void __init pagetable_init(void) | |||
53 | vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK; | 53 | vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK; |
54 | fixrange_init(vaddr, 0, pgd_base); | 54 | fixrange_init(vaddr, 0, pgd_base); |
55 | 55 | ||
56 | #ifdef CONFIG_HIGHMEM | ||
56 | /* | 57 | /* |
57 | * Permanent kmaps: | 58 | * Permanent kmaps: |
58 | */ | 59 | */ |
diff --git a/arch/mips/mm/pgtable-64.c b/arch/mips/mm/pgtable-64.c index 44b5e97fff65..8d600d307d5d 100644 --- a/arch/mips/mm/pgtable-64.c +++ b/arch/mips/mm/pgtable-64.c | |||
@@ -8,6 +8,7 @@ | |||
8 | */ | 8 | */ |
9 | #include <linux/init.h> | 9 | #include <linux/init.h> |
10 | #include <linux/mm.h> | 10 | #include <linux/mm.h> |
11 | #include <asm/fixmap.h> | ||
11 | #include <asm/pgtable.h> | 12 | #include <asm/pgtable.h> |
12 | 13 | ||
13 | void pgd_init(unsigned long page) | 14 | void pgd_init(unsigned long page) |
@@ -52,7 +53,17 @@ void pmd_init(unsigned long addr, unsigned long pagetable) | |||
52 | 53 | ||
53 | void __init pagetable_init(void) | 54 | void __init pagetable_init(void) |
54 | { | 55 | { |
56 | unsigned long vaddr; | ||
57 | pgd_t *pgd_base; | ||
58 | |||
55 | /* Initialize the entire pgd. */ | 59 | /* Initialize the entire pgd. */ |
56 | pgd_init((unsigned long)swapper_pg_dir); | 60 | pgd_init((unsigned long)swapper_pg_dir); |
57 | pmd_init((unsigned long)invalid_pmd_table, (unsigned long)invalid_pte_table); | 61 | pmd_init((unsigned long)invalid_pmd_table, (unsigned long)invalid_pte_table); |
62 | |||
63 | pgd_base = swapper_pg_dir; | ||
64 | /* | ||
65 | * Fixed mappings: | ||
66 | */ | ||
67 | vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK; | ||
68 | fixrange_init(vaddr, 0, pgd_base); | ||
58 | } | 69 | } |
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index 6f8b25cfa6f0..fec318a1c8c5 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c | |||
@@ -102,7 +102,7 @@ enum opcode { | |||
102 | insn_addu, insn_addiu, insn_and, insn_andi, insn_beq, | 102 | insn_addu, insn_addiu, insn_and, insn_andi, insn_beq, |
103 | insn_beql, insn_bgez, insn_bgezl, insn_bltz, insn_bltzl, | 103 | insn_beql, insn_bgez, insn_bgezl, insn_bltz, insn_bltzl, |
104 | insn_bne, insn_daddu, insn_daddiu, insn_dmfc0, insn_dmtc0, | 104 | insn_bne, insn_daddu, insn_daddiu, insn_dmfc0, insn_dmtc0, |
105 | insn_dsll, insn_dsll32, insn_dsra, insn_dsrl, | 105 | insn_dsll, insn_dsll32, insn_dsra, insn_dsrl, insn_dsrl32, |
106 | insn_dsubu, insn_eret, insn_j, insn_jal, insn_jr, insn_ld, | 106 | insn_dsubu, insn_eret, insn_j, insn_jal, insn_jr, insn_ld, |
107 | insn_ll, insn_lld, insn_lui, insn_lw, insn_mfc0, insn_mtc0, | 107 | insn_ll, insn_lld, insn_lui, insn_lw, insn_mfc0, insn_mtc0, |
108 | insn_ori, insn_rfe, insn_sc, insn_scd, insn_sd, insn_sll, | 108 | insn_ori, insn_rfe, insn_sc, insn_scd, insn_sd, insn_sll, |
@@ -145,6 +145,7 @@ static __initdata struct insn insn_table[] = { | |||
145 | { insn_dsll32, M(spec_op,0,0,0,0,dsll32_op), RT | RD | RE }, | 145 | { insn_dsll32, M(spec_op,0,0,0,0,dsll32_op), RT | RD | RE }, |
146 | { insn_dsra, M(spec_op,0,0,0,0,dsra_op), RT | RD | RE }, | 146 | { insn_dsra, M(spec_op,0,0,0,0,dsra_op), RT | RD | RE }, |
147 | { insn_dsrl, M(spec_op,0,0,0,0,dsrl_op), RT | RD | RE }, | 147 | { insn_dsrl, M(spec_op,0,0,0,0,dsrl_op), RT | RD | RE }, |
148 | { insn_dsrl32, M(spec_op,0,0,0,0,dsrl32_op), RT | RD | RE }, | ||
148 | { insn_dsubu, M(spec_op,0,0,0,0,dsubu_op), RS | RT | RD }, | 149 | { insn_dsubu, M(spec_op,0,0,0,0,dsubu_op), RS | RT | RD }, |
149 | { insn_eret, M(cop0_op,cop_op,0,0,0,eret_op), 0 }, | 150 | { insn_eret, M(cop0_op,cop_op,0,0,0,eret_op), 0 }, |
150 | { insn_j, M(j_op,0,0,0,0,0), JIMM }, | 151 | { insn_j, M(j_op,0,0,0,0,0), JIMM }, |
@@ -385,6 +386,7 @@ I_u2u1u3(_dsll); | |||
385 | I_u2u1u3(_dsll32); | 386 | I_u2u1u3(_dsll32); |
386 | I_u2u1u3(_dsra); | 387 | I_u2u1u3(_dsra); |
387 | I_u2u1u3(_dsrl); | 388 | I_u2u1u3(_dsrl); |
389 | I_u2u1u3(_dsrl32); | ||
388 | I_u3u1u2(_dsubu); | 390 | I_u3u1u2(_dsubu); |
389 | I_0(_eret); | 391 | I_0(_eret); |
390 | I_u1(_j); | 392 | I_u1(_j); |
@@ -996,7 +998,12 @@ build_get_pmde64(u32 **p, struct label **l, struct reloc **r, | |||
996 | #endif | 998 | #endif |
997 | 999 | ||
998 | l_vmalloc_done(l, *p); | 1000 | l_vmalloc_done(l, *p); |
999 | i_dsrl(p, tmp, tmp, PGDIR_SHIFT-3); /* get pgd offset in bytes */ | 1001 | |
1002 | if (PGDIR_SHIFT - 3 < 32) /* get pgd offset in bytes */ | ||
1003 | i_dsrl(p, tmp, tmp, PGDIR_SHIFT-3); | ||
1004 | else | ||
1005 | i_dsrl32(p, tmp, tmp, PGDIR_SHIFT - 3 - 32); | ||
1006 | |||
1000 | i_andi(p, tmp, tmp, (PTRS_PER_PGD - 1)<<3); | 1007 | i_andi(p, tmp, tmp, (PTRS_PER_PGD - 1)<<3); |
1001 | i_daddu(p, ptr, ptr, tmp); /* add in pgd offset */ | 1008 | i_daddu(p, ptr, ptr, tmp); /* add in pgd offset */ |
1002 | i_dmfc0(p, tmp, C0_BADVADDR); /* get faulting address */ | 1009 | i_dmfc0(p, tmp, C0_BADVADDR); /* get faulting address */ |
@@ -1073,7 +1080,7 @@ build_get_pgde32(u32 **p, unsigned int tmp, unsigned int ptr) | |||
1073 | 1080 | ||
1074 | static __init void build_adjust_context(u32 **p, unsigned int ctx) | 1081 | static __init void build_adjust_context(u32 **p, unsigned int ctx) |
1075 | { | 1082 | { |
1076 | unsigned int shift = 4 - (PTE_T_LOG2 + 1); | 1083 | unsigned int shift = 4 - (PTE_T_LOG2 + 1) + PAGE_SHIFT - 12; |
1077 | unsigned int mask = (PTRS_PER_PTE / 2 - 1) << (PTE_T_LOG2 + 1); | 1084 | unsigned int mask = (PTRS_PER_PTE / 2 - 1) << (PTE_T_LOG2 + 1); |
1078 | 1085 | ||
1079 | switch (current_cpu_data.cputype) { | 1086 | switch (current_cpu_data.cputype) { |
diff --git a/arch/mips/momentum/ocelot_3/Makefile b/arch/mips/momentum/ocelot_3/Makefile index 8bcea64dd27b..d5a090a85a15 100644 --- a/arch/mips/momentum/ocelot_3/Makefile +++ b/arch/mips/momentum/ocelot_3/Makefile | |||
@@ -5,4 +5,4 @@ | |||
5 | # removes any old dependencies. DON'T put your own dependencies here | 5 | # removes any old dependencies. DON'T put your own dependencies here |
6 | # unless it's something special (ie not a .c file). | 6 | # unless it's something special (ie not a .c file). |
7 | # | 7 | # |
8 | obj-y += irq.o prom.o reset.o setup.o | 8 | obj-y += irq.o platform.o prom.o reset.o setup.o |
diff --git a/arch/mips/momentum/ocelot_3/ocelot_3_fpga.h b/arch/mips/momentum/ocelot_3/ocelot_3_fpga.h index 227e429fe720..5710a9029f1c 100644 --- a/arch/mips/momentum/ocelot_3/ocelot_3_fpga.h +++ b/arch/mips/momentum/ocelot_3/ocelot_3_fpga.h | |||
@@ -51,7 +51,9 @@ | |||
51 | 51 | ||
52 | extern unsigned long ocelot_fpga_base; | 52 | extern unsigned long ocelot_fpga_base; |
53 | 53 | ||
54 | #define OCELOT_FPGA_WRITE(x, y) writeb(x, ocelot_fpga_base + OCELOT_3_REG_##y) | 54 | #define __FPGA_REG_TO_ADDR(reg) \ |
55 | #define OCELOT_FPGA_READ(x) readb(ocelot_fpga_base + OCELOT_3_REG_##x) | 55 | ((void *) ocelot_fpga_base + OCELOT_3_REG_##reg) |
56 | #define OCELOT_FPGA_WRITE(x, reg) writeb(x, __FPGA_REG_TO_ADDR(reg)) | ||
57 | #define OCELOT_FPGA_READ(reg) readb(__FPGA_REG_TO_ADDR(reg)) | ||
56 | 58 | ||
57 | #endif | 59 | #endif |
diff --git a/arch/mips/momentum/ocelot_3/platform.c b/arch/mips/momentum/ocelot_3/platform.c new file mode 100644 index 000000000000..eefe5841fbb2 --- /dev/null +++ b/arch/mips/momentum/ocelot_3/platform.c | |||
@@ -0,0 +1,235 @@ | |||
1 | #include <linux/delay.h> | ||
2 | #include <linux/if_ether.h> | ||
3 | #include <linux/ioport.h> | ||
4 | #include <linux/mv643xx.h> | ||
5 | #include <linux/platform_device.h> | ||
6 | |||
7 | #include "ocelot_3_fpga.h" | ||
8 | |||
9 | #if defined(CONFIG_MV643XX_ETH) || defined(CONFIG_MV643XX_ETH_MODULE) | ||
10 | |||
11 | static struct resource mv643xx_eth_shared_resources[] = { | ||
12 | [0] = { | ||
13 | .name = "ethernet shared base", | ||
14 | .start = 0xf1000000 + MV643XX_ETH_SHARED_REGS, | ||
15 | .end = 0xf1000000 + MV643XX_ETH_SHARED_REGS + | ||
16 | MV643XX_ETH_SHARED_REGS_SIZE - 1, | ||
17 | .flags = IORESOURCE_MEM, | ||
18 | }, | ||
19 | }; | ||
20 | |||
21 | static struct platform_device mv643xx_eth_shared_device = { | ||
22 | .name = MV643XX_ETH_SHARED_NAME, | ||
23 | .id = 0, | ||
24 | .num_resources = ARRAY_SIZE(mv643xx_eth_shared_resources), | ||
25 | .resource = mv643xx_eth_shared_resources, | ||
26 | }; | ||
27 | |||
28 | #define MV_SRAM_BASE 0xfe000000UL | ||
29 | #define MV_SRAM_SIZE (256 * 1024) | ||
30 | |||
31 | #define MV_SRAM_RXRING_SIZE (MV_SRAM_SIZE / 4) | ||
32 | #define MV_SRAM_TXRING_SIZE (MV_SRAM_SIZE / 4) | ||
33 | |||
34 | #define MV_SRAM_BASE_ETH0 MV_SRAM_BASE | ||
35 | #define MV_SRAM_BASE_ETH1 (MV_SRAM_BASE + (MV_SRAM_SIZE / 2)) | ||
36 | |||
37 | #define MV64x60_IRQ_ETH_0 48 | ||
38 | #define MV64x60_IRQ_ETH_1 49 | ||
39 | #define MV64x60_IRQ_ETH_2 50 | ||
40 | |||
41 | #ifdef CONFIG_MV643XX_ETH_0 | ||
42 | |||
43 | static struct resource mv64x60_eth0_resources[] = { | ||
44 | [0] = { | ||
45 | .name = "eth0 irq", | ||
46 | .start = MV64x60_IRQ_ETH_0, | ||
47 | .end = MV64x60_IRQ_ETH_0, | ||
48 | .flags = IORESOURCE_IRQ, | ||
49 | }, | ||
50 | }; | ||
51 | |||
52 | static char eth0_mac_addr[ETH_ALEN]; | ||
53 | |||
54 | static struct mv643xx_eth_platform_data eth0_pd = { | ||
55 | .mac_addr = eth0_mac_addr, | ||
56 | |||
57 | .tx_sram_addr = MV_SRAM_BASE_ETH0, | ||
58 | .tx_sram_size = MV_SRAM_TXRING_SIZE, | ||
59 | .tx_queue_size = MV_SRAM_TXRING_SIZE / 16, | ||
60 | |||
61 | .rx_sram_addr = MV_SRAM_BASE_ETH0 + MV_SRAM_TXRING_SIZE, | ||
62 | .rx_sram_size = MV_SRAM_RXRING_SIZE, | ||
63 | .rx_queue_size = MV_SRAM_RXRING_SIZE / 16, | ||
64 | }; | ||
65 | |||
66 | static struct platform_device eth0_device = { | ||
67 | .name = MV643XX_ETH_NAME, | ||
68 | .id = 0, | ||
69 | .num_resources = ARRAY_SIZE(mv64x60_eth0_resources), | ||
70 | .resource = mv64x60_eth0_resources, | ||
71 | .dev = { | ||
72 | .platform_data = ð0_pd, | ||
73 | }, | ||
74 | }; | ||
75 | #endif /* CONFIG_MV643XX_ETH_0 */ | ||
76 | |||
77 | #ifdef CONFIG_MV643XX_ETH_1 | ||
78 | |||
79 | static struct resource mv64x60_eth1_resources[] = { | ||
80 | [0] = { | ||
81 | .name = "eth1 irq", | ||
82 | .start = MV64x60_IRQ_ETH_1, | ||
83 | .end = MV64x60_IRQ_ETH_1, | ||
84 | .flags = IORESOURCE_IRQ, | ||
85 | }, | ||
86 | }; | ||
87 | |||
88 | static char eth1_mac_addr[ETH_ALEN]; | ||
89 | |||
90 | static struct mv643xx_eth_platform_data eth1_pd = { | ||
91 | .mac_addr = eth1_mac_addr, | ||
92 | |||
93 | .tx_sram_addr = MV_SRAM_BASE_ETH1, | ||
94 | .tx_sram_size = MV_SRAM_TXRING_SIZE, | ||
95 | .tx_queue_size = MV_SRAM_TXRING_SIZE / 16, | ||
96 | |||
97 | .rx_sram_addr = MV_SRAM_BASE_ETH1 + MV_SRAM_TXRING_SIZE, | ||
98 | .rx_sram_size = MV_SRAM_RXRING_SIZE, | ||
99 | .rx_queue_size = MV_SRAM_RXRING_SIZE / 16, | ||
100 | }; | ||
101 | |||
102 | static struct platform_device eth1_device = { | ||
103 | .name = MV643XX_ETH_NAME, | ||
104 | .id = 1, | ||
105 | .num_resources = ARRAY_SIZE(mv64x60_eth1_resources), | ||
106 | .resource = mv64x60_eth1_resources, | ||
107 | .dev = { | ||
108 | .platform_data = ð1_pd, | ||
109 | }, | ||
110 | }; | ||
111 | #endif /* CONFIG_MV643XX_ETH_1 */ | ||
112 | |||
113 | #ifdef CONFIG_MV643XX_ETH_2 | ||
114 | |||
115 | static struct resource mv64x60_eth2_resources[] = { | ||
116 | [0] = { | ||
117 | .name = "eth2 irq", | ||
118 | .start = MV64x60_IRQ_ETH_2, | ||
119 | .end = MV64x60_IRQ_ETH_2, | ||
120 | .flags = IORESOURCE_IRQ, | ||
121 | }, | ||
122 | }; | ||
123 | |||
124 | static char eth2_mac_addr[ETH_ALEN]; | ||
125 | |||
126 | static struct mv643xx_eth_platform_data eth2_pd = { | ||
127 | .mac_addr = eth2_mac_addr, | ||
128 | }; | ||
129 | |||
130 | static struct platform_device eth2_device = { | ||
131 | .name = MV643XX_ETH_NAME, | ||
132 | .id = 1, | ||
133 | .num_resources = ARRAY_SIZE(mv64x60_eth2_resources), | ||
134 | .resource = mv64x60_eth2_resources, | ||
135 | .dev = { | ||
136 | .platform_data = ð2_pd, | ||
137 | }, | ||
138 | }; | ||
139 | #endif /* CONFIG_MV643XX_ETH_2 */ | ||
140 | |||
141 | static struct platform_device *mv643xx_eth_pd_devs[] __initdata = { | ||
142 | &mv643xx_eth_shared_device, | ||
143 | #ifdef CONFIG_MV643XX_ETH_0 | ||
144 | ð0_device, | ||
145 | #endif | ||
146 | #ifdef CONFIG_MV643XX_ETH_1 | ||
147 | ð1_device, | ||
148 | #endif | ||
149 | #ifdef CONFIG_MV643XX_ETH_2 | ||
150 | ð2_device, | ||
151 | #endif | ||
152 | }; | ||
153 | |||
154 | static u8 __init exchange_bit(u8 val, u8 cs) | ||
155 | { | ||
156 | /* place the data */ | ||
157 | OCELOT_FPGA_WRITE((val << 2) | cs, EEPROM_MODE); | ||
158 | udelay(1); | ||
159 | |||
160 | /* turn the clock on */ | ||
161 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x2, EEPROM_MODE); | ||
162 | udelay(1); | ||
163 | |||
164 | /* turn the clock off and read-strobe */ | ||
165 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x10, EEPROM_MODE); | ||
166 | |||
167 | /* return the data */ | ||
168 | return (OCELOT_FPGA_READ(EEPROM_MODE) >> 3) & 0x1; | ||
169 | } | ||
170 | |||
171 | static void __init get_mac(char dest[6]) | ||
172 | { | ||
173 | u8 read_opcode[12] = {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | ||
174 | int i,j; | ||
175 | |||
176 | for (i = 0; i < 12; i++) | ||
177 | exchange_bit(read_opcode[i], 1); | ||
178 | |||
179 | for (j = 0; j < 6; j++) { | ||
180 | dest[j] = 0; | ||
181 | for (i = 0; i < 8; i++) { | ||
182 | dest[j] <<= 1; | ||
183 | dest[j] |= exchange_bit(0, 1); | ||
184 | } | ||
185 | } | ||
186 | |||
187 | /* turn off CS */ | ||
188 | exchange_bit(0,0); | ||
189 | } | ||
190 | |||
191 | /* | ||
192 | * Copy and increment ethernet MAC address by a small value. | ||
193 | * | ||
194 | * This is useful for systems where the only one MAC address is stored in | ||
195 | * non-volatile memory for multiple ports. | ||
196 | */ | ||
197 | static inline void eth_mac_add(unsigned char *dst, unsigned char *src, | ||
198 | unsigned int add) | ||
199 | { | ||
200 | int i; | ||
201 | |||
202 | BUG_ON(add >= 256); | ||
203 | |||
204 | for (i = ETH_ALEN; i >= 0; i--) { | ||
205 | dst[i] = src[i] + add; | ||
206 | add = dst[i] < src[i]; /* compute carry */ | ||
207 | } | ||
208 | |||
209 | WARN_ON(add); | ||
210 | } | ||
211 | |||
212 | static int __init mv643xx_eth_add_pds(void) | ||
213 | { | ||
214 | unsigned char mac[ETH_ALEN]; | ||
215 | int ret; | ||
216 | |||
217 | get_mac(mac); | ||
218 | #ifdef CONFIG_MV643XX_ETH_0 | ||
219 | eth_mac_add(eth1_mac_addr, mac, 0); | ||
220 | #endif | ||
221 | #ifdef CONFIG_MV643XX_ETH_1 | ||
222 | eth_mac_add(eth1_mac_addr, mac, 1); | ||
223 | #endif | ||
224 | #ifdef CONFIG_MV643XX_ETH_2 | ||
225 | eth_mac_add(eth2_mac_addr, mac, 2); | ||
226 | #endif | ||
227 | ret = platform_add_devices(mv643xx_eth_pd_devs, | ||
228 | ARRAY_SIZE(mv643xx_eth_pd_devs)); | ||
229 | |||
230 | return ret; | ||
231 | } | ||
232 | |||
233 | device_initcall(mv643xx_eth_add_pds); | ||
234 | |||
235 | #endif /* defined(CONFIG_MV643XX_ETH) || defined(CONFIG_MV643XX_ETH_MODULE) */ | ||
diff --git a/arch/mips/momentum/ocelot_3/prom.c b/arch/mips/momentum/ocelot_3/prom.c index 296d945bc248..6ce9b7fdb824 100644 --- a/arch/mips/momentum/ocelot_3/prom.c +++ b/arch/mips/momentum/ocelot_3/prom.c | |||
@@ -34,64 +34,11 @@ struct callvectors* debug_vectors; | |||
34 | extern unsigned long marvell_base; | 34 | extern unsigned long marvell_base; |
35 | extern unsigned long cpu_clock; | 35 | extern unsigned long cpu_clock; |
36 | 36 | ||
37 | #ifdef CONFIG_MV643XX_ETH | ||
38 | extern unsigned char prom_mac_addr_base[6]; | ||
39 | #endif | ||
40 | |||
41 | const char *get_system_type(void) | 37 | const char *get_system_type(void) |
42 | { | 38 | { |
43 | return "Momentum Ocelot-3"; | 39 | return "Momentum Ocelot-3"; |
44 | } | 40 | } |
45 | 41 | ||
46 | #ifdef CONFIG_MV643XX_ETH | ||
47 | void burn_clocks(void) | ||
48 | { | ||
49 | int i; | ||
50 | |||
51 | /* this loop should burn at least 1us -- this should be plenty */ | ||
52 | for (i = 0; i < 0x10000; i++) | ||
53 | ; | ||
54 | } | ||
55 | |||
56 | u8 exchange_bit(u8 val, u8 cs) | ||
57 | { | ||
58 | /* place the data */ | ||
59 | OCELOT_FPGA_WRITE((val << 2) | cs, EEPROM_MODE); | ||
60 | burn_clocks(); | ||
61 | |||
62 | /* turn the clock on */ | ||
63 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x2, EEPROM_MODE); | ||
64 | burn_clocks(); | ||
65 | |||
66 | /* turn the clock off and read-strobe */ | ||
67 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x10, EEPROM_MODE); | ||
68 | |||
69 | /* return the data */ | ||
70 | return ((OCELOT_FPGA_READ(EEPROM_MODE) >> 3) & 0x1); | ||
71 | } | ||
72 | |||
73 | void get_mac(char dest[6]) | ||
74 | { | ||
75 | u8 read_opcode[12] = {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | ||
76 | int i,j; | ||
77 | |||
78 | for (i = 0; i < 12; i++) | ||
79 | exchange_bit(read_opcode[i], 1); | ||
80 | |||
81 | for (j = 0; j < 6; j++) { | ||
82 | dest[j] = 0; | ||
83 | for (i = 0; i < 8; i++) { | ||
84 | dest[j] <<= 1; | ||
85 | dest[j] |= exchange_bit(0, 1); | ||
86 | } | ||
87 | } | ||
88 | |||
89 | /* turn off CS */ | ||
90 | exchange_bit(0,0); | ||
91 | } | ||
92 | #endif | ||
93 | |||
94 | |||
95 | #ifdef CONFIG_64BIT | 42 | #ifdef CONFIG_64BIT |
96 | 43 | ||
97 | unsigned long signext(unsigned long addr) | 44 | unsigned long signext(unsigned long addr) |
@@ -228,11 +175,6 @@ void __init prom_init(void) | |||
228 | mips_machgroup = MACH_GROUP_MOMENCO; | 175 | mips_machgroup = MACH_GROUP_MOMENCO; |
229 | mips_machtype = MACH_MOMENCO_OCELOT_3; | 176 | mips_machtype = MACH_MOMENCO_OCELOT_3; |
230 | 177 | ||
231 | #ifdef CONFIG_MV643XX_ETH | ||
232 | /* get the base MAC address for on-board ethernet ports */ | ||
233 | get_mac(prom_mac_addr_base); | ||
234 | #endif | ||
235 | |||
236 | #ifndef CONFIG_64BIT | 178 | #ifndef CONFIG_64BIT |
237 | debug_vectors->printf("Booting Linux kernel...\n"); | 179 | debug_vectors->printf("Booting Linux kernel...\n"); |
238 | #endif | 180 | #endif |
diff --git a/arch/mips/momentum/ocelot_3/setup.c b/arch/mips/momentum/ocelot_3/setup.c index 7d74f8c54129..ff0829f81116 100644 --- a/arch/mips/momentum/ocelot_3/setup.c +++ b/arch/mips/momentum/ocelot_3/setup.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * BRIEF MODULE DESCRIPTION | 4 | * BRIEF MODULE DESCRIPTION |
5 | * Momentum Computer Ocelot-3 board dependent boot routines | 5 | * Momentum Computer Ocelot-3 board dependent boot routines |
6 | * | 6 | * |
7 | * Copyright (C) 1996, 1997, 01, 05 Ralf Baechle | 7 | * Copyright (C) 1996, 1997, 01, 05 - 06 Ralf Baechle |
8 | * Copyright (C) 2000 RidgeRun, Inc. | 8 | * Copyright (C) 2000 RidgeRun, Inc. |
9 | * Copyright (C) 2001 Red Hat, Inc. | 9 | * Copyright (C) 2001 Red Hat, Inc. |
10 | * Copyright (C) 2002 Momentum Computer | 10 | * Copyright (C) 2002 Momentum Computer |
diff --git a/arch/mips/momentum/ocelot_c/Makefile b/arch/mips/momentum/ocelot_c/Makefile index 94802b4db472..d69161aa1675 100644 --- a/arch/mips/momentum/ocelot_c/Makefile +++ b/arch/mips/momentum/ocelot_c/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for Momentum Computer's Ocelot-C and -CS boards. | 2 | # Makefile for Momentum Computer's Ocelot-C and -CS boards. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y += cpci-irq.o irq.o prom.o reset.o \ | 5 | obj-y += cpci-irq.o irq.o platform.o prom.o reset.o \ |
6 | setup.o uart-irq.o | 6 | setup.o uart-irq.o |
7 | 7 | ||
8 | obj-$(CONFIG_KGDB) += dbg_io.o | 8 | obj-$(CONFIG_KGDB) += dbg_io.o |
diff --git a/arch/mips/momentum/ocelot_c/ocelot_c_fpga.h b/arch/mips/momentum/ocelot_c/ocelot_c_fpga.h index 7228cd19e5ea..f0f5581dcb50 100644 --- a/arch/mips/momentum/ocelot_c/ocelot_c_fpga.h +++ b/arch/mips/momentum/ocelot_c/ocelot_c_fpga.h | |||
@@ -53,7 +53,9 @@ | |||
53 | #define OCELOT_C_REG_INTSET 0xe | 53 | #define OCELOT_C_REG_INTSET 0xe |
54 | #define OCELOT_C_REG_INTCLR 0xf | 54 | #define OCELOT_C_REG_INTCLR 0xf |
55 | 55 | ||
56 | #define OCELOT_FPGA_WRITE(x, y) writeb(x, OCELOT_C_CS0_ADDR + OCELOT_C_REG_##y) | 56 | #define __FPGA_REG_TO_ADDR(reg) \ |
57 | #define OCELOT_FPGA_READ(x) readb(OCELOT_C_CS0_ADDR + OCELOT_C_REG_##x) | 57 | ((void *) OCELOT_C_CS0_ADDR + OCELOT_C_REG_##reg) |
58 | #define OCELOT_FPGA_WRITE(x, reg) writeb(x, __FPGA_REG_TO_ADDR(reg)) | ||
59 | #define OCELOT_FPGA_READ(reg) readb(__FPGA_REG_TO_ADDR(reg)) | ||
58 | 60 | ||
59 | #endif | 61 | #endif |
diff --git a/arch/mips/momentum/ocelot_c/platform.c b/arch/mips/momentum/ocelot_c/platform.c new file mode 100644 index 000000000000..6c495b2f1560 --- /dev/null +++ b/arch/mips/momentum/ocelot_c/platform.c | |||
@@ -0,0 +1,201 @@ | |||
1 | #include <linux/delay.h> | ||
2 | #include <linux/if_ether.h> | ||
3 | #include <linux/ioport.h> | ||
4 | #include <linux/mv643xx.h> | ||
5 | #include <linux/platform_device.h> | ||
6 | |||
7 | #include "ocelot_c_fpga.h" | ||
8 | |||
9 | #if defined(CONFIG_MV643XX_ETH) || defined(CONFIG_MV643XX_ETH_MODULE) | ||
10 | |||
11 | static struct resource mv643xx_eth_shared_resources[] = { | ||
12 | [0] = { | ||
13 | .name = "ethernet shared base", | ||
14 | .start = 0xf1000000 + MV643XX_ETH_SHARED_REGS, | ||
15 | .end = 0xf1000000 + MV643XX_ETH_SHARED_REGS + | ||
16 | MV643XX_ETH_SHARED_REGS_SIZE - 1, | ||
17 | .flags = IORESOURCE_MEM, | ||
18 | }, | ||
19 | }; | ||
20 | |||
21 | static struct platform_device mv643xx_eth_shared_device = { | ||
22 | .name = MV643XX_ETH_SHARED_NAME, | ||
23 | .id = 0, | ||
24 | .num_resources = ARRAY_SIZE(mv643xx_eth_shared_resources), | ||
25 | .resource = mv643xx_eth_shared_resources, | ||
26 | }; | ||
27 | |||
28 | #define MV_SRAM_BASE 0xfe000000UL | ||
29 | #define MV_SRAM_SIZE (256 * 1024) | ||
30 | |||
31 | #define MV_SRAM_RXRING_SIZE (MV_SRAM_SIZE / 4) | ||
32 | #define MV_SRAM_TXRING_SIZE (MV_SRAM_SIZE / 4) | ||
33 | |||
34 | #define MV_SRAM_BASE_ETH0 MV_SRAM_BASE | ||
35 | #define MV_SRAM_BASE_ETH1 (MV_SRAM_BASE + (MV_SRAM_SIZE / 2)) | ||
36 | |||
37 | #define MV64x60_IRQ_ETH_0 48 | ||
38 | #define MV64x60_IRQ_ETH_1 49 | ||
39 | |||
40 | #ifdef CONFIG_MV643XX_ETH_0 | ||
41 | |||
42 | static struct resource mv64x60_eth0_resources[] = { | ||
43 | [0] = { | ||
44 | .name = "eth0 irq", | ||
45 | .start = MV64x60_IRQ_ETH_0, | ||
46 | .end = MV64x60_IRQ_ETH_0, | ||
47 | .flags = IORESOURCE_IRQ, | ||
48 | }, | ||
49 | }; | ||
50 | |||
51 | static char eth0_mac_addr[ETH_ALEN]; | ||
52 | |||
53 | static struct mv643xx_eth_platform_data eth0_pd = { | ||
54 | .mac_addr = eth0_mac_addr, | ||
55 | |||
56 | .tx_sram_addr = MV_SRAM_BASE_ETH0, | ||
57 | .tx_sram_size = MV_SRAM_TXRING_SIZE, | ||
58 | .tx_queue_size = MV_SRAM_TXRING_SIZE / 16, | ||
59 | |||
60 | .rx_sram_addr = MV_SRAM_BASE_ETH0 + MV_SRAM_TXRING_SIZE, | ||
61 | .rx_sram_size = MV_SRAM_RXRING_SIZE, | ||
62 | .rx_queue_size = MV_SRAM_RXRING_SIZE / 16, | ||
63 | }; | ||
64 | |||
65 | static struct platform_device eth0_device = { | ||
66 | .name = MV643XX_ETH_NAME, | ||
67 | .id = 0, | ||
68 | .num_resources = ARRAY_SIZE(mv64x60_eth0_resources), | ||
69 | .resource = mv64x60_eth0_resources, | ||
70 | .dev = { | ||
71 | .platform_data = ð0_pd, | ||
72 | }, | ||
73 | }; | ||
74 | #endif /* CONFIG_MV643XX_ETH_0 */ | ||
75 | |||
76 | #ifdef CONFIG_MV643XX_ETH_1 | ||
77 | |||
78 | static struct resource mv64x60_eth1_resources[] = { | ||
79 | [0] = { | ||
80 | .name = "eth1 irq", | ||
81 | .start = MV64x60_IRQ_ETH_1, | ||
82 | .end = MV64x60_IRQ_ETH_1, | ||
83 | .flags = IORESOURCE_IRQ, | ||
84 | }, | ||
85 | }; | ||
86 | |||
87 | static char eth1_mac_addr[ETH_ALEN]; | ||
88 | |||
89 | static struct mv643xx_eth_platform_data eth1_pd = { | ||
90 | .mac_addr = eth1_mac_addr, | ||
91 | |||
92 | .tx_sram_addr = MV_SRAM_BASE_ETH1, | ||
93 | .tx_sram_size = MV_SRAM_TXRING_SIZE, | ||
94 | .tx_queue_size = MV_SRAM_TXRING_SIZE / 16, | ||
95 | |||
96 | .rx_sram_addr = MV_SRAM_BASE_ETH1 + MV_SRAM_TXRING_SIZE, | ||
97 | .rx_sram_size = MV_SRAM_RXRING_SIZE, | ||
98 | .rx_queue_size = MV_SRAM_RXRING_SIZE / 16, | ||
99 | }; | ||
100 | |||
101 | static struct platform_device eth1_device = { | ||
102 | .name = MV643XX_ETH_NAME, | ||
103 | .id = 1, | ||
104 | .num_resources = ARRAY_SIZE(mv64x60_eth1_resources), | ||
105 | .resource = mv64x60_eth1_resources, | ||
106 | .dev = { | ||
107 | .platform_data = ð1_pd, | ||
108 | }, | ||
109 | }; | ||
110 | #endif /* CONFIG_MV643XX_ETH_1 */ | ||
111 | |||
112 | static struct platform_device *mv643xx_eth_pd_devs[] __initdata = { | ||
113 | &mv643xx_eth_shared_device, | ||
114 | #ifdef CONFIG_MV643XX_ETH_0 | ||
115 | ð0_device, | ||
116 | #endif | ||
117 | #ifdef CONFIG_MV643XX_ETH_1 | ||
118 | ð1_device, | ||
119 | #endif | ||
120 | /* The third port is not wired up on the Ocelot C */ | ||
121 | }; | ||
122 | |||
123 | static u8 __init exchange_bit(u8 val, u8 cs) | ||
124 | { | ||
125 | /* place the data */ | ||
126 | OCELOT_FPGA_WRITE((val << 2) | cs, EEPROM_MODE); | ||
127 | udelay(1); | ||
128 | |||
129 | /* turn the clock on */ | ||
130 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x2, EEPROM_MODE); | ||
131 | udelay(1); | ||
132 | |||
133 | /* turn the clock off and read-strobe */ | ||
134 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x10, EEPROM_MODE); | ||
135 | |||
136 | /* return the data */ | ||
137 | return (OCELOT_FPGA_READ(EEPROM_MODE) >> 3) & 0x1; | ||
138 | } | ||
139 | |||
140 | static void __init get_mac(char dest[6]) | ||
141 | { | ||
142 | u8 read_opcode[12] = {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | ||
143 | int i,j; | ||
144 | |||
145 | for (i = 0; i < 12; i++) | ||
146 | exchange_bit(read_opcode[i], 1); | ||
147 | |||
148 | for (j = 0; j < 6; j++) { | ||
149 | dest[j] = 0; | ||
150 | for (i = 0; i < 8; i++) { | ||
151 | dest[j] <<= 1; | ||
152 | dest[j] |= exchange_bit(0, 1); | ||
153 | } | ||
154 | } | ||
155 | |||
156 | /* turn off CS */ | ||
157 | exchange_bit(0,0); | ||
158 | } | ||
159 | |||
160 | /* | ||
161 | * Copy and increment ethernet MAC address by a small value. | ||
162 | * | ||
163 | * This is useful for systems where the only one MAC address is stored in | ||
164 | * non-volatile memory for multiple ports. | ||
165 | */ | ||
166 | static inline void eth_mac_add(unsigned char *dst, unsigned char *src, | ||
167 | unsigned int add) | ||
168 | { | ||
169 | int i; | ||
170 | |||
171 | BUG_ON(add >= 256); | ||
172 | |||
173 | for (i = ETH_ALEN; i >= 0; i--) { | ||
174 | dst[i] = src[i] + add; | ||
175 | add = dst[i] < src[i]; /* compute carry */ | ||
176 | } | ||
177 | |||
178 | WARN_ON(add); | ||
179 | } | ||
180 | |||
181 | static int __init mv643xx_eth_add_pds(void) | ||
182 | { | ||
183 | unsigned char mac[ETH_ALEN]; | ||
184 | int ret; | ||
185 | |||
186 | get_mac(mac); | ||
187 | #ifdef CONFIG_MV643XX_ETH_0 | ||
188 | eth_mac_add(eth1_mac_addr, mac, 0); | ||
189 | #endif | ||
190 | #ifdef CONFIG_MV643XX_ETH_1 | ||
191 | eth_mac_add(eth1_mac_addr, mac, 1); | ||
192 | #endif | ||
193 | ret = platform_add_devices(mv643xx_eth_pd_devs, | ||
194 | ARRAY_SIZE(mv643xx_eth_pd_devs)); | ||
195 | |||
196 | return ret; | ||
197 | } | ||
198 | |||
199 | device_initcall(mv643xx_eth_add_pds); | ||
200 | |||
201 | #endif /* defined(CONFIG_MV643XX_ETH) || defined(CONFIG_MV643XX_ETH_MODULE) */ | ||
diff --git a/arch/mips/momentum/ocelot_c/prom.c b/arch/mips/momentum/ocelot_c/prom.c index 4c50a147f429..d0b77e101d74 100644 --- a/arch/mips/momentum/ocelot_c/prom.c +++ b/arch/mips/momentum/ocelot_c/prom.c | |||
@@ -29,11 +29,7 @@ | |||
29 | struct callvectors* debug_vectors; | 29 | struct callvectors* debug_vectors; |
30 | 30 | ||
31 | extern unsigned long marvell_base; | 31 | extern unsigned long marvell_base; |
32 | extern unsigned long cpu_clock; | 32 | extern unsigned int cpu_clock; |
33 | |||
34 | #ifdef CONFIG_MV643XX_ETH | ||
35 | extern unsigned char prom_mac_addr_base[6]; | ||
36 | #endif | ||
37 | 33 | ||
38 | const char *get_system_type(void) | 34 | const char *get_system_type(void) |
39 | { | 35 | { |
@@ -44,55 +40,6 @@ const char *get_system_type(void) | |||
44 | #endif | 40 | #endif |
45 | } | 41 | } |
46 | 42 | ||
47 | #ifdef CONFIG_MV643XX_ETH | ||
48 | static void burn_clocks(void) | ||
49 | { | ||
50 | int i; | ||
51 | |||
52 | /* this loop should burn at least 1us -- this should be plenty */ | ||
53 | for (i = 0; i < 0x10000; i++) | ||
54 | ; | ||
55 | } | ||
56 | |||
57 | static u8 exchange_bit(u8 val, u8 cs) | ||
58 | { | ||
59 | /* place the data */ | ||
60 | OCELOT_FPGA_WRITE((val << 2) | cs, EEPROM_MODE); | ||
61 | burn_clocks(); | ||
62 | |||
63 | /* turn the clock on */ | ||
64 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x2, EEPROM_MODE); | ||
65 | burn_clocks(); | ||
66 | |||
67 | /* turn the clock off and read-strobe */ | ||
68 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x10, EEPROM_MODE); | ||
69 | |||
70 | /* return the data */ | ||
71 | return ((OCELOT_FPGA_READ(EEPROM_MODE) >> 3) & 0x1); | ||
72 | } | ||
73 | |||
74 | void get_mac(char dest[6]) | ||
75 | { | ||
76 | u8 read_opcode[12] = {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | ||
77 | int i,j; | ||
78 | |||
79 | for (i = 0; i < 12; i++) | ||
80 | exchange_bit(read_opcode[i], 1); | ||
81 | |||
82 | for (j = 0; j < 6; j++) { | ||
83 | dest[j] = 0; | ||
84 | for (i = 0; i < 8; i++) { | ||
85 | dest[j] <<= 1; | ||
86 | dest[j] |= exchange_bit(0, 1); | ||
87 | } | ||
88 | } | ||
89 | |||
90 | /* turn off CS */ | ||
91 | exchange_bit(0,0); | ||
92 | } | ||
93 | #endif | ||
94 | |||
95 | |||
96 | #ifdef CONFIG_64BIT | 43 | #ifdef CONFIG_64BIT |
97 | 44 | ||
98 | unsigned long signext(unsigned long addr) | 45 | unsigned long signext(unsigned long addr) |
@@ -226,11 +173,6 @@ void __init prom_init(void) | |||
226 | mips_machgroup = MACH_GROUP_MOMENCO; | 173 | mips_machgroup = MACH_GROUP_MOMENCO; |
227 | mips_machtype = MACH_MOMENCO_OCELOT_C; | 174 | mips_machtype = MACH_MOMENCO_OCELOT_C; |
228 | 175 | ||
229 | #ifdef CONFIG_MV643XX_ETH | ||
230 | /* get the base MAC address for on-board ethernet ports */ | ||
231 | get_mac(prom_mac_addr_base); | ||
232 | #endif | ||
233 | |||
234 | #ifndef CONFIG_64BIT | 176 | #ifndef CONFIG_64BIT |
235 | debug_vectors->printf("Booting Linux kernel...\n"); | 177 | debug_vectors->printf("Booting Linux kernel...\n"); |
236 | #endif | 178 | #endif |
diff --git a/arch/mips/momentum/ocelot_c/setup.c b/arch/mips/momentum/ocelot_c/setup.c index 9c0c462af650..0b6b2338cfb4 100644 --- a/arch/mips/momentum/ocelot_c/setup.c +++ b/arch/mips/momentum/ocelot_c/setup.c | |||
@@ -69,8 +69,7 @@ | |||
69 | #include "ocelot_c_fpga.h" | 69 | #include "ocelot_c_fpga.h" |
70 | 70 | ||
71 | unsigned long marvell_base; | 71 | unsigned long marvell_base; |
72 | extern unsigned long mv64340_sram_base; | 72 | unsigned int cpu_clock; |
73 | unsigned long cpu_clock; | ||
74 | 73 | ||
75 | /* These functions are used for rebooting or halting the machine*/ | 74 | /* These functions are used for rebooting or halting the machine*/ |
76 | extern void momenco_ocelot_restart(char *command); | 75 | extern void momenco_ocelot_restart(char *command); |
@@ -119,7 +118,6 @@ void PMON_v2_setup(void) | |||
119 | add_wired_entry(ENTRYLO(0xfe000000), ENTRYLO(0xff000000), 0xfffffffffe000000, PM_16M); | 118 | add_wired_entry(ENTRYLO(0xfe000000), ENTRYLO(0xff000000), 0xfffffffffe000000, PM_16M); |
120 | 119 | ||
121 | marvell_base = 0xfffffffff4000000; | 120 | marvell_base = 0xfffffffff4000000; |
122 | mv64340_sram_base = 0xfffffffffe000000; | ||
123 | #else | 121 | #else |
124 | /* marvell and extra space */ | 122 | /* marvell and extra space */ |
125 | add_wired_entry(ENTRYLO(0xf4000000), ENTRYLO(0xf4010000), 0xf4000000, PM_64K); | 123 | add_wired_entry(ENTRYLO(0xf4000000), ENTRYLO(0xf4010000), 0xf4000000, PM_64K); |
@@ -129,7 +127,6 @@ void PMON_v2_setup(void) | |||
129 | add_wired_entry(ENTRYLO(0xfe000000), ENTRYLO(0xff000000), 0xfe000000, PM_16M); | 127 | add_wired_entry(ENTRYLO(0xfe000000), ENTRYLO(0xff000000), 0xfe000000, PM_16M); |
130 | 128 | ||
131 | marvell_base = 0xf4000000; | 129 | marvell_base = 0xf4000000; |
132 | mv64340_sram_base = 0xfe000000; | ||
133 | #endif | 130 | #endif |
134 | } | 131 | } |
135 | 132 | ||
@@ -346,22 +343,20 @@ void __init plat_mem_setup(void) | |||
346 | } | 343 | } |
347 | } | 344 | } |
348 | 345 | ||
349 | #ifndef CONFIG_64BIT | 346 | /* |
350 | /* This needs to be one of the first initcalls, because no I/O port access | 347 | * This needs to be one of the first initcalls, because no I/O port access |
351 | can work before this */ | 348 | * can work before this |
349 | */ | ||
352 | static int io_base_ioremap(void) | 350 | static int io_base_ioremap(void) |
353 | { | 351 | { |
354 | /* we're mapping PCI accesses from 0xc0000000 to 0xf0000000 */ | 352 | void __iomem * io_remap_range = ioremap(0xc0000000UL, 0x10000); |
355 | void *io_remap_range = ioremap(0xc0000000, 0x30000000); | ||
356 | 353 | ||
357 | if (!io_remap_range) { | 354 | if (!io_remap_range) |
358 | panic("Could not ioremap I/O port range"); | 355 | panic("Could not ioremap I/O port range"); |
359 | } | 356 | |
360 | printk("io_remap_range set at 0x%08x\n", (uint32_t)io_remap_range); | 357 | set_io_port_base((unsigned long) io_remap_range); |
361 | set_io_port_base(io_remap_range - 0xc0000000); | ||
362 | 358 | ||
363 | return 0; | 359 | return 0; |
364 | } | 360 | } |
365 | 361 | ||
366 | module_init(io_base_ioremap); | 362 | module_init(io_base_ioremap); |
367 | #endif | ||
diff --git a/arch/mips/momentum/ocelot_g/gt-irq.c b/arch/mips/momentum/ocelot_g/gt-irq.c index 7b5cc6648f7e..e5576bd50fa9 100644 --- a/arch/mips/momentum/ocelot_g/gt-irq.c +++ b/arch/mips/momentum/ocelot_g/gt-irq.c | |||
@@ -27,7 +27,7 @@ unsigned long bus_clock; | |||
27 | * be handled and ack'ed differently than other MIPS interrupts. | 27 | * be handled and ack'ed differently than other MIPS interrupts. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #if CURRENTLY_UNUSED | 30 | #if 0 |
31 | 31 | ||
32 | struct tq_struct irq_handlers[MAX_CAUSE_REGS][MAX_CAUSE_REG_WIDTH]; | 32 | struct tq_struct irq_handlers[MAX_CAUSE_REGS][MAX_CAUSE_REG_WIDTH]; |
33 | void hook_irq_handler(int int_cause, int bit_num, void *isr_ptr); | 33 | void hook_irq_handler(int int_cause, int bit_num, void *isr_ptr); |
@@ -95,7 +95,7 @@ int disable_galileo_irq(int int_cause, int bit_num) | |||
95 | return 0; | 95 | return 0; |
96 | return 1; | 96 | return 1; |
97 | } | 97 | } |
98 | #endif /* UNUSED */ | 98 | #endif /* 0 */ |
99 | 99 | ||
100 | /* | 100 | /* |
101 | * Interrupt handler for interrupts coming from the Galileo chip via P0_INT#. | 101 | * Interrupt handler for interrupts coming from the Galileo chip via P0_INT#. |
@@ -196,7 +196,7 @@ void gt64240_time_init(void) | |||
196 | 196 | ||
197 | void gt64240_irq_init(void) | 197 | void gt64240_irq_init(void) |
198 | { | 198 | { |
199 | #if CURRENTLY_UNUSED | 199 | #if 0 |
200 | int i, j; | 200 | int i, j; |
201 | 201 | ||
202 | /* Reset irq handlers pointers to NULL */ | 202 | /* Reset irq handlers pointers to NULL */ |
@@ -208,5 +208,5 @@ void gt64240_irq_init(void) | |||
208 | irq_handlers[i][j].data = NULL; | 208 | irq_handlers[i][j].data = NULL; |
209 | } | 209 | } |
210 | } | 210 | } |
211 | #endif | 211 | #endif /* 0 */ |
212 | } | 212 | } |
diff --git a/arch/mips/momentum/ocelot_g/ocelot_pld.h b/arch/mips/momentum/ocelot_g/ocelot_pld.h index fcb8275e219d..95e0534026d0 100644 --- a/arch/mips/momentum/ocelot_g/ocelot_pld.h +++ b/arch/mips/momentum/ocelot_g/ocelot_pld.h | |||
@@ -23,8 +23,8 @@ | |||
23 | #define OCELOT_REG_INTSET (12) | 23 | #define OCELOT_REG_INTSET (12) |
24 | #define OCELOT_REG_INTCLR (13) | 24 | #define OCELOT_REG_INTCLR (13) |
25 | 25 | ||
26 | #define OCELOT_PLD_WRITE(x, y) writeb(x, OCELOT_CS0_ADDR + OCELOT_REG_##y) | 26 | #define __PLD_REG_TO_ADDR(reg) ((void *) OCELOT_CS0_ADDR + OCELOT_REG_##reg) |
27 | #define OCELOT_PLD_READ(x) readb(OCELOT_CS0_ADDR + OCELOT_REG_##x) | 27 | #define OCELOT_PLD_WRITE(x, reg) writeb(x, __PLD_REG_TO_ADDR(reg)) |
28 | 28 | #define OCELOT_PLD_READ(reg) readb(__PLD_REG_TO_ADDR(reg)) | |
29 | 29 | ||
30 | #endif /* __MOMENCO_OCELOT_PLD_H__ */ | 30 | #endif /* __MOMENCO_OCELOT_PLD_H__ */ |
diff --git a/arch/mips/momentum/ocelot_g/setup.c b/arch/mips/momentum/ocelot_g/setup.c index 56ec47039c16..d288f7b01842 100644 --- a/arch/mips/momentum/ocelot_g/setup.c +++ b/arch/mips/momentum/ocelot_g/setup.c | |||
@@ -57,6 +57,7 @@ | |||
57 | #include <asm/gt64240.h> | 57 | #include <asm/gt64240.h> |
58 | #include <asm/irq.h> | 58 | #include <asm/irq.h> |
59 | #include <asm/pci.h> | 59 | #include <asm/pci.h> |
60 | #include <asm/pgtable.h> | ||
60 | #include <asm/processor.h> | 61 | #include <asm/processor.h> |
61 | #include <asm/reboot.h> | 62 | #include <asm/reboot.h> |
62 | #include <linux/bootmem.h> | 63 | #include <linux/bootmem.h> |
@@ -160,6 +161,10 @@ static void __init setup_l3cache(unsigned long size) | |||
160 | printk("Done\n"); | 161 | printk("Done\n"); |
161 | } | 162 | } |
162 | 163 | ||
164 | void __init plat_timer_setup(struct irqaction *irq) | ||
165 | { | ||
166 | } | ||
167 | |||
163 | void __init plat_mem_setup(void) | 168 | void __init plat_mem_setup(void) |
164 | { | 169 | { |
165 | void (*l3func)(unsigned long) = (void *) KSEG1ADDR(setup_l3cache); | 170 | void (*l3func)(unsigned long) = (void *) KSEG1ADDR(setup_l3cache); |
diff --git a/arch/mips/oprofile/op_model_mipsxx.c b/arch/mips/oprofile/op_model_mipsxx.c index dd0aec9c3ce1..1fb240c57bac 100644 --- a/arch/mips/oprofile/op_model_mipsxx.c +++ b/arch/mips/oprofile/op_model_mipsxx.c | |||
@@ -31,16 +31,18 @@ | |||
31 | #define M_COUNTER_OVERFLOW (1UL << 31) | 31 | #define M_COUNTER_OVERFLOW (1UL << 31) |
32 | 32 | ||
33 | #ifdef CONFIG_MIPS_MT_SMP | 33 | #ifdef CONFIG_MIPS_MT_SMP |
34 | #define WHAT (M_TC_EN_VPE | M_PERFCTL_VPEID(smp_processor_id())) | 34 | #define WHAT (M_TC_EN_VPE | M_PERFCTL_VPEID(smp_processor_id())) |
35 | #define vpe_id() smp_processor_id() | ||
35 | #else | 36 | #else |
36 | #define WHAT 0 | 37 | #define WHAT 0 |
38 | #define vpe_id() smp_processor_id() | ||
37 | #endif | 39 | #endif |
38 | 40 | ||
39 | #define __define_perf_accessors(r, n, np) \ | 41 | #define __define_perf_accessors(r, n, np) \ |
40 | \ | 42 | \ |
41 | static inline unsigned int r_c0_ ## r ## n(void) \ | 43 | static inline unsigned int r_c0_ ## r ## n(void) \ |
42 | { \ | 44 | { \ |
43 | unsigned int cpu = smp_processor_id(); \ | 45 | unsigned int cpu = vpe_id(); \ |
44 | \ | 46 | \ |
45 | switch (cpu) { \ | 47 | switch (cpu) { \ |
46 | case 0: \ | 48 | case 0: \ |
@@ -55,7 +57,7 @@ static inline unsigned int r_c0_ ## r ## n(void) \ | |||
55 | \ | 57 | \ |
56 | static inline void w_c0_ ## r ## n(unsigned int value) \ | 58 | static inline void w_c0_ ## r ## n(unsigned int value) \ |
57 | { \ | 59 | { \ |
58 | unsigned int cpu = smp_processor_id(); \ | 60 | unsigned int cpu = vpe_id(); \ |
59 | \ | 61 | \ |
60 | switch (cpu) { \ | 62 | switch (cpu) { \ |
61 | case 0: \ | 63 | case 0: \ |
@@ -218,7 +220,7 @@ static inline int n_counters(void) | |||
218 | { | 220 | { |
219 | int counters = __n_counters(); | 221 | int counters = __n_counters(); |
220 | 222 | ||
221 | #ifndef CONFIG_SMP | 223 | #ifdef CONFIG_MIPS_MT_SMP |
222 | if (current_cpu_data.cputype == CPU_34K) | 224 | if (current_cpu_data.cputype == CPU_34K) |
223 | return counters >> 1; | 225 | return counters >> 1; |
224 | #endif | 226 | #endif |
diff --git a/arch/mips/pci/Makefile b/arch/mips/pci/Makefile index 3cf0dd4ba548..70cb55b89df6 100644 --- a/arch/mips/pci/Makefile +++ b/arch/mips/pci/Makefile | |||
@@ -26,7 +26,7 @@ obj-$(CONFIG_DDB5477) += fixup-ddb5477.o pci-ddb5477.o ops-ddb5477.o | |||
26 | obj-$(CONFIG_LASAT) += pci-lasat.o | 26 | obj-$(CONFIG_LASAT) += pci-lasat.o |
27 | obj-$(CONFIG_MIPS_ATLAS) += fixup-atlas.o | 27 | obj-$(CONFIG_MIPS_ATLAS) += fixup-atlas.o |
28 | obj-$(CONFIG_MIPS_COBALT) += fixup-cobalt.o | 28 | obj-$(CONFIG_MIPS_COBALT) += fixup-cobalt.o |
29 | obj-$(CONFIG_MIPS_EV64120) += fixup-ev64120.o | 29 | obj-$(CONFIG_MIPS_EV64120) += pci-ev64120.o |
30 | obj-$(CONFIG_SOC_AU1500) += fixup-au1000.o ops-au1000.o | 30 | obj-$(CONFIG_SOC_AU1500) += fixup-au1000.o ops-au1000.o |
31 | obj-$(CONFIG_SOC_AU1550) += fixup-au1000.o ops-au1000.o | 31 | obj-$(CONFIG_SOC_AU1550) += fixup-au1000.o ops-au1000.o |
32 | obj-$(CONFIG_SOC_PNX8550) += fixup-pnx8550.o ops-pnx8550.o | 32 | obj-$(CONFIG_SOC_PNX8550) += fixup-pnx8550.o ops-pnx8550.o |
diff --git a/arch/mips/pci/fixup-ev64120.c b/arch/mips/pci/fixup-ev64120.c deleted file mode 100644 index 8dbb90d63f0a..000000000000 --- a/arch/mips/pci/fixup-ev64120.c +++ /dev/null | |||
@@ -1,34 +0,0 @@ | |||
1 | #include <linux/pci.h> | ||
2 | #include <linux/init.h> | ||
3 | |||
4 | int pci_range_ck(unsigned char bus, unsigned char dev) | ||
5 | { | ||
6 | if (((bus == 0) || (bus == 1)) && (dev >= 6) && (dev <= 8)) | ||
7 | return 0; | ||
8 | |||
9 | return -1; | ||
10 | } | ||
11 | |||
12 | /* | ||
13 | * After detecting all agents over the PCI , this function is called | ||
14 | * in order to give an interrupt number for each PCI device starting | ||
15 | * from IRQ 20. It does also enables master for each device. | ||
16 | */ | ||
17 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) | ||
18 | { | ||
19 | unsigned int irq = 20; | ||
20 | struct pci_bus *current_bus = bus; | ||
21 | struct pci_dev *dev; | ||
22 | struct list_head *devices_link; | ||
23 | |||
24 | list_for_each(devices_link, &(current_bus->devices)) { | ||
25 | dev = pci_dev_b(devices_link); | ||
26 | if (dev != NULL) { | ||
27 | dev->irq = irq++; | ||
28 | |||
29 | /* Assign an interrupt number for the device */ | ||
30 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); | ||
31 | pcibios_set_master(dev); | ||
32 | } | ||
33 | } | ||
34 | } | ||
diff --git a/arch/mips/pci/pci-ev64120.c b/arch/mips/pci/pci-ev64120.c new file mode 100644 index 000000000000..9cd859ef1842 --- /dev/null +++ b/arch/mips/pci/pci-ev64120.c | |||
@@ -0,0 +1,21 @@ | |||
1 | #include <linux/pci.h> | ||
2 | |||
3 | int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||
4 | { | ||
5 | int irq; | ||
6 | |||
7 | if (!pin) | ||
8 | return 0; | ||
9 | |||
10 | irq = allocate_irqno(); | ||
11 | if (irq < 0) | ||
12 | return 0; | ||
13 | |||
14 | return irq; | ||
15 | } | ||
16 | |||
17 | /* Do platform specific device initialization at pci_enable_device() time */ | ||
18 | int pcibios_plat_dev_init(struct pci_dev *dev) | ||
19 | { | ||
20 | return 0; | ||
21 | } | ||
diff --git a/arch/mips/philips/pnx8550/common/time.c b/arch/mips/philips/pnx8550/common/time.c index 0af655b1f330..65c440e8480b 100644 --- a/arch/mips/philips/pnx8550/common/time.c +++ b/arch/mips/philips/pnx8550/common/time.c | |||
@@ -41,8 +41,8 @@ extern unsigned int mips_hpt_frequency; | |||
41 | * 1) board_time_init() - | 41 | * 1) board_time_init() - |
42 | * a) (optional) set up RTC routines, | 42 | * a) (optional) set up RTC routines, |
43 | * b) (optional) calibrate and set the mips_hpt_frequency | 43 | * b) (optional) calibrate and set the mips_hpt_frequency |
44 | * (only needed if you intended to use fixed_rate_gettimeoffset | 44 | * (only needed if you intended to use cpu counter as timer interrupt |
45 | * or use cpu counter as timer interrupt source) | 45 | * source) |
46 | */ | 46 | */ |
47 | 47 | ||
48 | void pnx8550_time_init(void) | 48 | void pnx8550_time_init(void) |
diff --git a/arch/mips/pmc-sierra/yosemite/i2c-yosemite.c b/arch/mips/pmc-sierra/yosemite/i2c-yosemite.c index 416da22b3bf4..85b14c73c226 100644 --- a/arch/mips/pmc-sierra/yosemite/i2c-yosemite.c +++ b/arch/mips/pmc-sierra/yosemite/i2c-yosemite.c | |||
@@ -74,7 +74,7 @@ static int titan_i2c_poll(void) | |||
74 | int titan_i2c_xfer(unsigned int slave_addr, titan_i2c_command * cmd, | 74 | int titan_i2c_xfer(unsigned int slave_addr, titan_i2c_command * cmd, |
75 | int size, unsigned int *addr) | 75 | int size, unsigned int *addr) |
76 | { | 76 | { |
77 | int loop = 0, bytes, i; | 77 | int loop, bytes = 0, i; |
78 | unsigned int *write_data, data, *read_data; | 78 | unsigned int *write_data, data, *read_data; |
79 | unsigned long reg_val, val; | 79 | unsigned long reg_val, val; |
80 | 80 | ||
diff --git a/arch/mips/pmc-sierra/yosemite/smp.c b/arch/mips/pmc-sierra/yosemite/smp.c index 65fa3a23ea5e..3cc0436db6cf 100644 --- a/arch/mips/pmc-sierra/yosemite/smp.c +++ b/arch/mips/pmc-sierra/yosemite/smp.c | |||
@@ -3,9 +3,7 @@ | |||
3 | 3 | ||
4 | #include <asm/pmon.h> | 4 | #include <asm/pmon.h> |
5 | #include <asm/titan_dep.h> | 5 | #include <asm/titan_dep.h> |
6 | 6 | #include <asm/time.h> | |
7 | extern unsigned int (*mips_hpt_read)(void); | ||
8 | extern void (*mips_hpt_init)(unsigned int); | ||
9 | 7 | ||
10 | #define LAUNCHSTACK_SIZE 256 | 8 | #define LAUNCHSTACK_SIZE 256 |
11 | 9 | ||
@@ -101,7 +99,7 @@ void prom_cpus_done(void) | |||
101 | */ | 99 | */ |
102 | void prom_init_secondary(void) | 100 | void prom_init_secondary(void) |
103 | { | 101 | { |
104 | mips_hpt_init(mips_hpt_read()); | 102 | mips_hpt_init(); |
105 | 103 | ||
106 | set_c0_status(ST0_CO | ST0_IE | ST0_IM); | 104 | set_c0_status(ST0_CO | ST0_IE | ST0_IM); |
107 | } | 105 | } |
diff --git a/arch/mips/sgi-ip27/ip27-irq.c b/arch/mips/sgi-ip27/ip27-irq.c index f01ba1f90770..270ecd3e6b4a 100644 --- a/arch/mips/sgi-ip27/ip27-irq.c +++ b/arch/mips/sgi-ip27/ip27-irq.c | |||
@@ -354,29 +354,6 @@ static struct irq_chip bridge_irq_type = { | |||
354 | .end = end_bridge_irq, | 354 | .end = end_bridge_irq, |
355 | }; | 355 | }; |
356 | 356 | ||
357 | static unsigned long irq_map[NR_IRQS / BITS_PER_LONG]; | ||
358 | |||
359 | int allocate_irqno(void) | ||
360 | { | ||
361 | int irq; | ||
362 | |||
363 | again: | ||
364 | irq = find_first_zero_bit(irq_map, NR_IRQS); | ||
365 | |||
366 | if (irq >= NR_IRQS) | ||
367 | return -ENOSPC; | ||
368 | |||
369 | if (test_and_set_bit(irq, irq_map)) | ||
370 | goto again; | ||
371 | |||
372 | return irq; | ||
373 | } | ||
374 | |||
375 | void free_irqno(unsigned int irq) | ||
376 | { | ||
377 | clear_bit(irq, irq_map); | ||
378 | } | ||
379 | |||
380 | void __devinit register_bridge_irq(unsigned int irq) | 357 | void __devinit register_bridge_irq(unsigned int irq) |
381 | { | 358 | { |
382 | irq_desc[irq].status = IRQ_DISABLED; | 359 | irq_desc[irq].status = IRQ_DISABLED; |
diff --git a/arch/mips/sgi-ip27/ip27-timer.c b/arch/mips/sgi-ip27/ip27-timer.c index 4e870fc4469b..5e82a268e3c9 100644 --- a/arch/mips/sgi-ip27/ip27-timer.c +++ b/arch/mips/sgi-ip27/ip27-timer.c | |||
@@ -134,13 +134,6 @@ again: | |||
134 | irq_exit(); | 134 | irq_exit(); |
135 | } | 135 | } |
136 | 136 | ||
137 | unsigned long ip27_do_gettimeoffset(void) | ||
138 | { | ||
139 | unsigned long ct_cur1; | ||
140 | ct_cur1 = REMOTE_HUB_L(cputonasid(0), PI_RT_COUNT) + CYCLES_PER_JIFFY; | ||
141 | return (ct_cur1 - ct_cur[0]) * NSEC_PER_CYCLE / 1000; | ||
142 | } | ||
143 | |||
144 | /* Includes for ioc3_init(). */ | 137 | /* Includes for ioc3_init(). */ |
145 | #include <asm/sn/types.h> | 138 | #include <asm/sn/types.h> |
146 | #include <asm/sn/sn0/addrs.h> | 139 | #include <asm/sn/sn0/addrs.h> |
@@ -221,8 +214,6 @@ static struct irqaction rt_irqaction = { | |||
221 | .name = "timer" | 214 | .name = "timer" |
222 | }; | 215 | }; |
223 | 216 | ||
224 | extern int allocate_irqno(void); | ||
225 | |||
226 | void __init plat_timer_setup(struct irqaction *irq) | 217 | void __init plat_timer_setup(struct irqaction *irq) |
227 | { | 218 | { |
228 | int irqno = allocate_irqno(); | 219 | int irqno = allocate_irqno(); |
@@ -248,12 +239,17 @@ void __init plat_timer_setup(struct irqaction *irq) | |||
248 | setup_irq(irqno, &rt_irqaction); | 239 | setup_irq(irqno, &rt_irqaction); |
249 | } | 240 | } |
250 | 241 | ||
242 | static unsigned int ip27_hpt_read(void) | ||
243 | { | ||
244 | return REMOTE_HUB_L(cputonasid(0), PI_RT_COUNT); | ||
245 | } | ||
246 | |||
251 | void __init ip27_time_init(void) | 247 | void __init ip27_time_init(void) |
252 | { | 248 | { |
249 | mips_hpt_read = ip27_hpt_read; | ||
250 | mips_hpt_frequency = CYCLES_PER_SEC; | ||
253 | xtime.tv_sec = get_m48t35_time(); | 251 | xtime.tv_sec = get_m48t35_time(); |
254 | xtime.tv_nsec = 0; | 252 | xtime.tv_nsec = 0; |
255 | |||
256 | do_gettimeoffset = ip27_do_gettimeoffset; | ||
257 | } | 253 | } |
258 | 254 | ||
259 | void __init cpu_time_init(void) | 255 | void __init cpu_time_init(void) |
diff --git a/arch/mips/sibyte/bcm1480/time.c b/arch/mips/sibyte/bcm1480/time.c index bf12af46132e..e136bde5248e 100644 --- a/arch/mips/sibyte/bcm1480/time.c +++ b/arch/mips/sibyte/bcm1480/time.c | |||
@@ -47,6 +47,12 @@ | |||
47 | #define IMR_IP3_VAL K_BCM1480_INT_MAP_I1 | 47 | #define IMR_IP3_VAL K_BCM1480_INT_MAP_I1 |
48 | #define IMR_IP4_VAL K_BCM1480_INT_MAP_I2 | 48 | #define IMR_IP4_VAL K_BCM1480_INT_MAP_I2 |
49 | 49 | ||
50 | #ifdef CONFIG_SIMULATION | ||
51 | #define BCM1480_HPT_VALUE 50000 | ||
52 | #else | ||
53 | #define BCM1480_HPT_VALUE 1000000 | ||
54 | #endif | ||
55 | |||
50 | extern int bcm1480_steal_irq(int irq); | 56 | extern int bcm1480_steal_irq(int irq); |
51 | 57 | ||
52 | void bcm1480_time_init(void) | 58 | void bcm1480_time_init(void) |
@@ -59,11 +65,6 @@ void bcm1480_time_init(void) | |||
59 | BUG(); | 65 | BUG(); |
60 | } | 66 | } |
61 | 67 | ||
62 | if (!cpu) { | ||
63 | /* Use our own gettimeoffset() routine */ | ||
64 | do_gettimeoffset = bcm1480_gettimeoffset; | ||
65 | } | ||
66 | |||
67 | bcm1480_mask_irq(cpu, irq); | 68 | bcm1480_mask_irq(cpu, irq); |
68 | 69 | ||
69 | /* Map the timer interrupt to ip[4] of this cpu */ | 70 | /* Map the timer interrupt to ip[4] of this cpu */ |
@@ -74,11 +75,7 @@ void bcm1480_time_init(void) | |||
74 | /* Disable the timer and set up the count */ | 75 | /* Disable the timer and set up the count */ |
75 | __raw_writeq(0, IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); | 76 | __raw_writeq(0, IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); |
76 | __raw_writeq( | 77 | __raw_writeq( |
77 | #ifndef CONFIG_SIMULATION | 78 | BCM1480_HPT_VALUE/HZ |
78 | 1000000/HZ | ||
79 | #else | ||
80 | 50000/HZ | ||
81 | #endif | ||
82 | , IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT))); | 79 | , IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT))); |
83 | 80 | ||
84 | /* Set the timer running */ | 81 | /* Set the timer running */ |
@@ -122,16 +119,16 @@ void bcm1480_timer_interrupt(void) | |||
122 | } | 119 | } |
123 | } | 120 | } |
124 | 121 | ||
125 | /* | 122 | static unsigned int bcm1480_hpt_read(void) |
126 | * We use our own do_gettimeoffset() instead of the generic one, | ||
127 | * because the generic one does not work for SMP case. | ||
128 | * In addition, since we use general timer 0 for system time, | ||
129 | * we can get accurate intra-jiffy offset without calibration. | ||
130 | */ | ||
131 | unsigned long bcm1480_gettimeoffset(void) | ||
132 | { | 123 | { |
124 | /* We assume this function is called xtime_lock held. */ | ||
133 | unsigned long count = | 125 | unsigned long count = |
134 | __raw_readq(IOADDR(A_SCD_TIMER_REGISTER(0, R_SCD_TIMER_CNT))); | 126 | __raw_readq(IOADDR(A_SCD_TIMER_REGISTER(0, R_SCD_TIMER_CNT))); |
127 | return (jiffies + 1) * (BCM1480_HPT_VALUE / HZ) - count; | ||
128 | } | ||
135 | 129 | ||
136 | return 1000000/HZ - count; | 130 | void __init bcm1480_hpt_setup(void) |
131 | { | ||
132 | mips_hpt_read = bcm1480_hpt_read; | ||
133 | mips_hpt_frequency = BCM1480_HPT_VALUE; | ||
137 | } | 134 | } |
diff --git a/arch/mips/sibyte/sb1250/time.c b/arch/mips/sibyte/sb1250/time.c index 0ccf1796dd78..bcb74f2c1948 100644 --- a/arch/mips/sibyte/sb1250/time.c +++ b/arch/mips/sibyte/sb1250/time.c | |||
@@ -47,15 +47,11 @@ | |||
47 | 47 | ||
48 | #define SB1250_HPT_NUM 3 | 48 | #define SB1250_HPT_NUM 3 |
49 | #define SB1250_HPT_VALUE M_SCD_TIMER_CNT /* max value */ | 49 | #define SB1250_HPT_VALUE M_SCD_TIMER_CNT /* max value */ |
50 | #define SB1250_HPT_SHIFT ((sizeof(unsigned int)*8)-V_SCD_TIMER_WIDTH) | ||
51 | 50 | ||
52 | 51 | ||
53 | extern int sb1250_steal_irq(int irq); | 52 | extern int sb1250_steal_irq(int irq); |
54 | 53 | ||
55 | static unsigned int sb1250_hpt_read(void); | 54 | static unsigned int sb1250_hpt_read(void); |
56 | static void sb1250_hpt_init(unsigned int); | ||
57 | |||
58 | static unsigned int hpt_offset; | ||
59 | 55 | ||
60 | void __init sb1250_hpt_setup(void) | 56 | void __init sb1250_hpt_setup(void) |
61 | { | 57 | { |
@@ -69,13 +65,9 @@ void __init sb1250_hpt_setup(void) | |||
69 | __raw_writeq(M_SCD_TIMER_ENABLE | M_SCD_TIMER_MODE_CONTINUOUS, | 65 | __raw_writeq(M_SCD_TIMER_ENABLE | M_SCD_TIMER_MODE_CONTINUOUS, |
70 | IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, R_SCD_TIMER_CFG))); | 66 | IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, R_SCD_TIMER_CFG))); |
71 | 67 | ||
72 | /* | 68 | mips_hpt_frequency = V_SCD_TIMER_FREQ; |
73 | * we need to fill 32 bits, so just use the upper 23 bits and pretend | ||
74 | * the timer is going 512Mhz instead of 1Mhz | ||
75 | */ | ||
76 | mips_hpt_frequency = V_SCD_TIMER_FREQ << SB1250_HPT_SHIFT; | ||
77 | mips_hpt_init = sb1250_hpt_init; | ||
78 | mips_hpt_read = sb1250_hpt_read; | 69 | mips_hpt_read = sb1250_hpt_read; |
70 | mips_hpt_mask = M_SCD_TIMER_INIT; | ||
79 | } | 71 | } |
80 | } | 72 | } |
81 | 73 | ||
@@ -149,11 +141,7 @@ void sb1250_timer_interrupt(void) | |||
149 | 141 | ||
150 | /* | 142 | /* |
151 | * The HPT is free running from SB1250_HPT_VALUE down to 0 then starts over | 143 | * The HPT is free running from SB1250_HPT_VALUE down to 0 then starts over |
152 | * again. There's no easy way to set to a specific value so store init value | 144 | * again. |
153 | * in hpt_offset and subtract each time. | ||
154 | * | ||
155 | * Note: Timer isn't full 32bits so shift it into the upper part making | ||
156 | * it appear to run at a higher frequency. | ||
157 | */ | 145 | */ |
158 | static unsigned int sb1250_hpt_read(void) | 146 | static unsigned int sb1250_hpt_read(void) |
159 | { | 147 | { |
@@ -161,13 +149,5 @@ static unsigned int sb1250_hpt_read(void) | |||
161 | 149 | ||
162 | count = G_SCD_TIMER_CNT(__raw_readq(IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, R_SCD_TIMER_CNT)))); | 150 | count = G_SCD_TIMER_CNT(__raw_readq(IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, R_SCD_TIMER_CNT)))); |
163 | 151 | ||
164 | count = (SB1250_HPT_VALUE - count) << SB1250_HPT_SHIFT; | 152 | return SB1250_HPT_VALUE - count; |
165 | |||
166 | return count - hpt_offset; | ||
167 | } | ||
168 | |||
169 | static void sb1250_hpt_init(unsigned int count) | ||
170 | { | ||
171 | hpt_offset = count; | ||
172 | return; | ||
173 | } | 153 | } |
diff --git a/arch/mips/tx4927/common/smsc_fdc37m81x.c b/arch/mips/tx4927/common/smsc_fdc37m81x.c new file mode 100644 index 000000000000..33f517bc9a08 --- /dev/null +++ b/arch/mips/tx4927/common/smsc_fdc37m81x.c | |||
@@ -0,0 +1,172 @@ | |||
1 | /* | ||
2 | * Interface for smsc fdc48m81x Super IO chip | ||
3 | * | ||
4 | * Author: MontaVista Software, Inc. source@mvista.com | ||
5 | * | ||
6 | * 2001-2003 (c) MontaVista Software, Inc. This file is licensed under | ||
7 | * the terms of the GNU General Public License version 2. This program | ||
8 | * is licensed "as is" without any warranty of any kind, whether express | ||
9 | * or implied. | ||
10 | * | ||
11 | * Copyright 2004 (c) MontaVista Software, Inc. | ||
12 | */ | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <asm/io.h> | ||
16 | #include <asm/tx4927/smsc_fdc37m81x.h> | ||
17 | |||
18 | #define DEBUG | ||
19 | |||
20 | /* Common Registers */ | ||
21 | #define SMSC_FDC37M81X_CONFIG_INDEX 0x00 | ||
22 | #define SMSC_FDC37M81X_CONFIG_DATA 0x01 | ||
23 | #define SMSC_FDC37M81X_CONF 0x02 | ||
24 | #define SMSC_FDC37M81X_INDEX 0x03 | ||
25 | #define SMSC_FDC37M81X_DNUM 0x07 | ||
26 | #define SMSC_FDC37M81X_DID 0x20 | ||
27 | #define SMSC_FDC37M81X_DREV 0x21 | ||
28 | #define SMSC_FDC37M81X_PCNT 0x22 | ||
29 | #define SMSC_FDC37M81X_PMGT 0x23 | ||
30 | #define SMSC_FDC37M81X_OSC 0x24 | ||
31 | #define SMSC_FDC37M81X_CONFPA0 0x26 | ||
32 | #define SMSC_FDC37M81X_CONFPA1 0x27 | ||
33 | #define SMSC_FDC37M81X_TEST4 0x2B | ||
34 | #define SMSC_FDC37M81X_TEST5 0x2C | ||
35 | #define SMSC_FDC37M81X_TEST1 0x2D | ||
36 | #define SMSC_FDC37M81X_TEST2 0x2E | ||
37 | #define SMSC_FDC37M81X_TEST3 0x2F | ||
38 | |||
39 | /* Logical device numbers */ | ||
40 | #define SMSC_FDC37M81X_FDD 0x00 | ||
41 | #define SMSC_FDC37M81X_SERIAL1 0x04 | ||
42 | #define SMSC_FDC37M81X_SERIAL2 0x05 | ||
43 | #define SMSC_FDC37M81X_KBD 0x07 | ||
44 | |||
45 | /* Logical device Config Registers */ | ||
46 | #define SMSC_FDC37M81X_ACTIVE 0x30 | ||
47 | #define SMSC_FDC37M81X_BASEADDR0 0x60 | ||
48 | #define SMSC_FDC37M81X_BASEADDR1 0x61 | ||
49 | #define SMSC_FDC37M81X_INT 0x70 | ||
50 | #define SMSC_FDC37M81X_INT2 0x72 | ||
51 | #define SMSC_FDC37M81X_MODE 0xF0 | ||
52 | |||
53 | /* Chip Config Values */ | ||
54 | #define SMSC_FDC37M81X_CONFIG_ENTER 0x55 | ||
55 | #define SMSC_FDC37M81X_CONFIG_EXIT 0xaa | ||
56 | #define SMSC_FDC37M81X_CHIP_ID 0x4d | ||
57 | |||
58 | static unsigned long g_smsc_fdc37m81x_base = 0; | ||
59 | |||
60 | static inline unsigned char smsc_fdc37m81x_rd(unsigned char index) | ||
61 | { | ||
62 | outb(index, g_smsc_fdc37m81x_base + SMSC_FDC37M81X_CONFIG_INDEX); | ||
63 | |||
64 | return inb(g_smsc_fdc37m81x_base + SMSC_FDC37M81X_CONFIG_DATA); | ||
65 | } | ||
66 | |||
67 | static inline void smsc_dc37m81x_wr(unsigned char index, unsigned char data) | ||
68 | { | ||
69 | outb(index, g_smsc_fdc37m81x_base + SMSC_FDC37M81X_CONFIG_INDEX); | ||
70 | outb(data, g_smsc_fdc37m81x_base + SMSC_FDC37M81X_CONFIG_DATA); | ||
71 | } | ||
72 | |||
73 | void smsc_fdc37m81x_config_beg(void) | ||
74 | { | ||
75 | if (g_smsc_fdc37m81x_base) { | ||
76 | outb(SMSC_FDC37M81X_CONFIG_ENTER, | ||
77 | g_smsc_fdc37m81x_base + SMSC_FDC37M81X_CONFIG_INDEX); | ||
78 | } | ||
79 | } | ||
80 | |||
81 | void smsc_fdc37m81x_config_end(void) | ||
82 | { | ||
83 | if (g_smsc_fdc37m81x_base) | ||
84 | outb(SMSC_FDC37M81X_CONFIG_EXIT, | ||
85 | g_smsc_fdc37m81x_base + SMSC_FDC37M81X_CONFIG_INDEX); | ||
86 | } | ||
87 | |||
88 | u8 smsc_fdc37m81x_config_get(u8 reg) | ||
89 | { | ||
90 | u8 val = 0; | ||
91 | |||
92 | if (g_smsc_fdc37m81x_base) | ||
93 | val = smsc_fdc37m81x_rd(reg); | ||
94 | |||
95 | return val; | ||
96 | } | ||
97 | |||
98 | void smsc_fdc37m81x_config_set(u8 reg, u8 val) | ||
99 | { | ||
100 | if (g_smsc_fdc37m81x_base) | ||
101 | smsc_dc37m81x_wr(reg, val); | ||
102 | } | ||
103 | |||
104 | unsigned long __init smsc_fdc37m81x_init(unsigned long port) | ||
105 | { | ||
106 | const int field = sizeof(unsigned long) * 2; | ||
107 | u8 chip_id; | ||
108 | |||
109 | if (g_smsc_fdc37m81x_base) | ||
110 | printk("smsc_fdc37m81x_init() stepping on old base=0x%0*lx\n", | ||
111 | field, g_smsc_fdc37m81x_base); | ||
112 | |||
113 | g_smsc_fdc37m81x_base = port; | ||
114 | |||
115 | smsc_fdc37m81x_config_beg(); | ||
116 | |||
117 | chip_id = smsc_fdc37m81x_rd(SMSC_FDC37M81X_DID); | ||
118 | if (chip_id == SMSC_FDC37M81X_CHIP_ID) | ||
119 | smsc_fdc37m81x_config_end(); | ||
120 | else { | ||
121 | printk("smsc_fdc37m81x_init() unknow chip id 0x%02x\n", | ||
122 | chip_id); | ||
123 | g_smsc_fdc37m81x_base = 0; | ||
124 | } | ||
125 | |||
126 | return g_smsc_fdc37m81x_base; | ||
127 | } | ||
128 | |||
129 | #ifdef DEBUG | ||
130 | void smsc_fdc37m81x_config_dump_one(char *key, u8 dev, u8 reg) | ||
131 | { | ||
132 | printk("%s: dev=0x%02x reg=0x%02x val=0x%02x\n", key, dev, reg, | ||
133 | smsc_fdc37m81x_rd(reg)); | ||
134 | } | ||
135 | |||
136 | void smsc_fdc37m81x_config_dump(void) | ||
137 | { | ||
138 | u8 orig; | ||
139 | char *fname = "smsc_fdc37m81x_config_dump()"; | ||
140 | |||
141 | smsc_fdc37m81x_config_beg(); | ||
142 | |||
143 | orig = smsc_fdc37m81x_rd(SMSC_FDC37M81X_DNUM); | ||
144 | |||
145 | printk("%s: common\n", fname); | ||
146 | smsc_fdc37m81x_config_dump_one(fname, SMSC_FDC37M81X_NONE, | ||
147 | SMSC_FDC37M81X_DNUM); | ||
148 | smsc_fdc37m81x_config_dump_one(fname, SMSC_FDC37M81X_NONE, | ||
149 | SMSC_FDC37M81X_DID); | ||
150 | smsc_fdc37m81x_config_dump_one(fname, SMSC_FDC37M81X_NONE, | ||
151 | SMSC_FDC37M81X_DREV); | ||
152 | smsc_fdc37m81x_config_dump_one(fname, SMSC_FDC37M81X_NONE, | ||
153 | SMSC_FDC37M81X_PCNT); | ||
154 | smsc_fdc37m81x_config_dump_one(fname, SMSC_FDC37M81X_NONE, | ||
155 | SMSC_FDC37M81X_PMGT); | ||
156 | |||
157 | printk("%s: keyboard\n", fname); | ||
158 | smsc_dc37m81x_wr(SMSC_FDC37M81X_DNUM, SMSC_FDC37M81X_KBD); | ||
159 | smsc_fdc37m81x_config_dump_one(fname, SMSC_FDC37M81X_KBD, | ||
160 | SMSC_FDC37M81X_ACTIVE); | ||
161 | smsc_fdc37m81x_config_dump_one(fname, SMSC_FDC37M81X_KBD, | ||
162 | SMSC_FDC37M81X_INT); | ||
163 | smsc_fdc37m81x_config_dump_one(fname, SMSC_FDC37M81X_KBD, | ||
164 | SMSC_FDC37M81X_INT2); | ||
165 | smsc_fdc37m81x_config_dump_one(fname, SMSC_FDC37M81X_KBD, | ||
166 | SMSC_FDC37M81X_LDCR_F0); | ||
167 | |||
168 | smsc_dc37m81x_wr(SMSC_FDC37M81X_DNUM, orig); | ||
169 | |||
170 | smsc_fdc37m81x_config_end(); | ||
171 | } | ||
172 | #endif | ||
diff --git a/arch/mips/tx4927/common/tx4927_setup.c b/arch/mips/tx4927/common/tx4927_setup.c index 4658b2ae4833..941c441729b0 100644 --- a/arch/mips/tx4927/common/tx4927_setup.c +++ b/arch/mips/tx4927/common/tx4927_setup.c | |||
@@ -112,8 +112,6 @@ void print_cp0(char *key, int num, char *name, u32 val) | |||
112 | return; | 112 | return; |
113 | } | 113 | } |
114 | 114 | ||
115 | indent: Standard input:25: Error:Unexpected end of file | ||
116 | |||
117 | void | 115 | void |
118 | dump_cp0(char *key) | 116 | dump_cp0(char *key) |
119 | { | 117 | { |
diff --git a/arch/mips/tx4938/toshiba_rbtx4938/spi_txx9.c b/arch/mips/tx4938/toshiba_rbtx4938/spi_txx9.c index b926e6a75c29..08b20cdfd7b3 100644 --- a/arch/mips/tx4938/toshiba_rbtx4938/spi_txx9.c +++ b/arch/mips/tx4938/toshiba_rbtx4938/spi_txx9.c | |||
@@ -36,14 +36,18 @@ void __init txx9_spi_init(unsigned long base, int (*cs_func)(int chipid, int on) | |||
36 | 36 | ||
37 | static DECLARE_WAIT_QUEUE_HEAD(txx9_spi_wait); | 37 | static DECLARE_WAIT_QUEUE_HEAD(txx9_spi_wait); |
38 | 38 | ||
39 | static void txx9_spi_interrupt(int irq, void *dev_id) | 39 | static irqreturn_t txx9_spi_interrupt(int irq, void *dev_id) |
40 | { | 40 | { |
41 | /* disable rx intr */ | 41 | /* disable rx intr */ |
42 | tx4938_spiptr->cr0 &= ~TXx9_SPCR0_RBSIE; | 42 | tx4938_spiptr->cr0 &= ~TXx9_SPCR0_RBSIE; |
43 | wake_up(&txx9_spi_wait); | 43 | wake_up(&txx9_spi_wait); |
44 | |||
45 | return IRQ_HANDLED; | ||
44 | } | 46 | } |
47 | |||
45 | static struct irqaction txx9_spi_action = { | 48 | static struct irqaction txx9_spi_action = { |
46 | txx9_spi_interrupt, 0, 0, "spi", NULL, NULL, | 49 | .handler = txx9_spi_interrupt, |
50 | .name = "spi", | ||
47 | }; | 51 | }; |
48 | 52 | ||
49 | void __init txx9_spi_irqinit(int irc_irq) | 53 | void __init txx9_spi_irqinit(int irc_irq) |
diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index b3677fc8eef5..7b943b45f7cd 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S | |||
@@ -153,13 +153,7 @@ SECTIONS | |||
153 | __setup_end = .; | 153 | __setup_end = .; |
154 | __initcall_start = .; | 154 | __initcall_start = .; |
155 | .initcall.init : { | 155 | .initcall.init : { |
156 | *(.initcall1.init) | 156 | INITCALLS |
157 | *(.initcall2.init) | ||
158 | *(.initcall3.init) | ||
159 | *(.initcall4.init) | ||
160 | *(.initcall5.init) | ||
161 | *(.initcall6.init) | ||
162 | *(.initcall7.init) | ||
163 | } | 157 | } |
164 | __initcall_end = .; | 158 | __initcall_end = .; |
165 | __con_initcall_start = .; | 159 | __con_initcall_start = .; |
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 8b6910465578..0673dbedb241 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -740,7 +740,7 @@ config ARCH_SPARSEMEM_ENABLE | |||
740 | 740 | ||
741 | config ARCH_SPARSEMEM_DEFAULT | 741 | config ARCH_SPARSEMEM_DEFAULT |
742 | def_bool y | 742 | def_bool y |
743 | depends on SMP && PPC_PSERIES | 743 | depends on (SMP && PPC_PSERIES) || PPC_CELL |
744 | 744 | ||
745 | config ARCH_POPULATES_NODE_MAP | 745 | config ARCH_POPULATES_NODE_MAP |
746 | def_bool y | 746 | def_bool y |
@@ -751,6 +751,15 @@ config ARCH_MEMORY_PROBE | |||
751 | def_bool y | 751 | def_bool y |
752 | depends on MEMORY_HOTPLUG | 752 | depends on MEMORY_HOTPLUG |
753 | 753 | ||
754 | # Some NUMA nodes have memory ranges that span | ||
755 | # other nodes. Even though a pfn is valid and | ||
756 | # between a node's start and end pfns, it may not | ||
757 | # reside on that node. See memmap_init_zone() | ||
758 | # for details. | ||
759 | config NODES_SPAN_OTHER_NODES | ||
760 | def_bool y | ||
761 | depends on NEED_MULTIPLE_NODES | ||
762 | |||
754 | config PPC_64K_PAGES | 763 | config PPC_64K_PAGES |
755 | bool "64k page size" | 764 | bool "64k page size" |
756 | depends on PPC64 | 765 | depends on PPC64 |
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index 37ddfcab0003..4b2be611f77f 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile | |||
@@ -115,7 +115,7 @@ endif | |||
115 | quiet_cmd_wrap = WRAP $@ | 115 | quiet_cmd_wrap = WRAP $@ |
116 | cmd_wrap =$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) vmlinux | 116 | cmd_wrap =$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) vmlinux |
117 | quiet_cmd_wrap_initrd = WRAP $@ | 117 | quiet_cmd_wrap_initrd = WRAP $@ |
118 | cmd_wrap_initrd =$(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \ | 118 | cmd_wrap_initrd =$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \ |
119 | -i $(obj)/ramdisk.image.gz vmlinux | 119 | -i $(obj)/ramdisk.image.gz vmlinux |
120 | 120 | ||
121 | $(obj)/zImage.chrp: vmlinux $(wrapperbits) | 121 | $(obj)/zImage.chrp: vmlinux $(wrapperbits) |
diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper index eab7318729e9..b5fb1fee76f8 100755 --- a/arch/powerpc/boot/wrapper +++ b/arch/powerpc/boot/wrapper | |||
@@ -179,11 +179,11 @@ if [ -z "$cacheit" ]; then | |||
179 | fi | 179 | fi |
180 | 180 | ||
181 | if [ -n "$initrd" ]; then | 181 | if [ -n "$initrd" ]; then |
182 | addsec $tmp "$initrd" initrd | 182 | addsec $tmp "$initrd" $isection |
183 | fi | 183 | fi |
184 | 184 | ||
185 | if [ -n "$dtb" ]; then | 185 | if [ -n "$dtb" ]; then |
186 | addsec $tmp "$dtb" dtb | 186 | addsec $tmp "$dtb" .kernel:dtb |
187 | fi | 187 | fi |
188 | 188 | ||
189 | if [ "$platform" != "miboot" ]; then | 189 | if [ "$platform" != "miboot" ]; then |
diff --git a/arch/powerpc/boot/zImage.lds.S b/arch/powerpc/boot/zImage.lds.S index 4b6bb3ffe3dc..4be3c6414b04 100644 --- a/arch/powerpc/boot/zImage.lds.S +++ b/arch/powerpc/boot/zImage.lds.S | |||
@@ -21,6 +21,11 @@ SECTIONS | |||
21 | __got2_end = .; | 21 | __got2_end = .; |
22 | } | 22 | } |
23 | 23 | ||
24 | . = ALIGN(8); | ||
25 | _dtb_start = .; | ||
26 | .kernel:dtb : { *(.kernel:dtb) } | ||
27 | _dtb_end = .; | ||
28 | |||
24 | . = ALIGN(4096); | 29 | . = ALIGN(4096); |
25 | _vmlinux_start = .; | 30 | _vmlinux_start = .; |
26 | .kernel:vmlinux.strip : { *(.kernel:vmlinux.strip) } | 31 | .kernel:vmlinux.strip : { *(.kernel:vmlinux.strip) } |
diff --git a/arch/powerpc/configs/cell_defconfig b/arch/powerpc/configs/cell_defconfig index 892d5dd3254e..0aba06d7d2ec 100644 --- a/arch/powerpc/configs/cell_defconfig +++ b/arch/powerpc/configs/cell_defconfig | |||
@@ -254,6 +254,7 @@ CONFIG_SYN_COOKIES=y | |||
254 | CONFIG_INET_TUNNEL=y | 254 | CONFIG_INET_TUNNEL=y |
255 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | 255 | CONFIG_INET_XFRM_MODE_TRANSPORT=y |
256 | CONFIG_INET_XFRM_MODE_TUNNEL=y | 256 | CONFIG_INET_XFRM_MODE_TUNNEL=y |
257 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
257 | CONFIG_INET_DIAG=y | 258 | CONFIG_INET_DIAG=y |
258 | CONFIG_INET_TCP_DIAG=y | 259 | CONFIG_INET_TCP_DIAG=y |
259 | # CONFIG_TCP_CONG_ADVANCED is not set | 260 | # CONFIG_TCP_CONG_ADVANCED is not set |
@@ -275,7 +276,9 @@ CONFIG_INET6_XFRM_TUNNEL=m | |||
275 | CONFIG_INET6_TUNNEL=m | 276 | CONFIG_INET6_TUNNEL=m |
276 | CONFIG_INET6_XFRM_MODE_TRANSPORT=y | 277 | CONFIG_INET6_XFRM_MODE_TRANSPORT=y |
277 | CONFIG_INET6_XFRM_MODE_TUNNEL=y | 278 | CONFIG_INET6_XFRM_MODE_TUNNEL=y |
279 | # CONFIG_INET6_XFRM_MODE_BEET is not set | ||
278 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | 280 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set |
281 | # CONFIG_IPV6_SIT is not set | ||
279 | CONFIG_IPV6_TUNNEL=m | 282 | CONFIG_IPV6_TUNNEL=m |
280 | # CONFIG_IPV6_SUBTREES is not set | 283 | # CONFIG_IPV6_SUBTREES is not set |
281 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | 284 | # CONFIG_IPV6_MULTIPLE_TABLES is not set |
@@ -406,6 +409,12 @@ CONFIG_BLK_DEV_INITRD=y | |||
406 | # CONFIG_ATA_OVER_ETH is not set | 409 | # CONFIG_ATA_OVER_ETH is not set |
407 | 410 | ||
408 | # | 411 | # |
412 | # Misc devices | ||
413 | # | ||
414 | # CONFIG_SGI_IOC4 is not set | ||
415 | # CONFIG_TIFM_CORE is not set | ||
416 | |||
417 | # | ||
409 | # ATA/ATAPI/MFM/RLL support | 418 | # ATA/ATAPI/MFM/RLL support |
410 | # | 419 | # |
411 | CONFIG_IDE=y | 420 | CONFIG_IDE=y |
@@ -738,7 +747,6 @@ CONFIG_GEN_RTC=y | |||
738 | # TPM devices | 747 | # TPM devices |
739 | # | 748 | # |
740 | # CONFIG_TCG_TPM is not set | 749 | # CONFIG_TCG_TPM is not set |
741 | # CONFIG_TELCLOCK is not set | ||
742 | 750 | ||
743 | # | 751 | # |
744 | # I2C support | 752 | # I2C support |
@@ -802,6 +810,7 @@ CONFIG_I2C_ALGOBIT=y | |||
802 | # | 810 | # |
803 | # Dallas's 1-wire bus | 811 | # Dallas's 1-wire bus |
804 | # | 812 | # |
813 | # CONFIG_W1 is not set | ||
805 | 814 | ||
806 | # | 815 | # |
807 | # Hardware Monitoring support | 816 | # Hardware Monitoring support |
@@ -810,14 +819,9 @@ CONFIG_I2C_ALGOBIT=y | |||
810 | # CONFIG_HWMON_VID is not set | 819 | # CONFIG_HWMON_VID is not set |
811 | 820 | ||
812 | # | 821 | # |
813 | # Misc devices | ||
814 | # | ||
815 | |||
816 | # | ||
817 | # Multimedia devices | 822 | # Multimedia devices |
818 | # | 823 | # |
819 | # CONFIG_VIDEO_DEV is not set | 824 | # CONFIG_VIDEO_DEV is not set |
820 | CONFIG_VIDEO_V4L2=y | ||
821 | 825 | ||
822 | # | 826 | # |
823 | # Digital Video Broadcasting Devices | 827 | # Digital Video Broadcasting Devices |
@@ -923,6 +927,7 @@ CONFIG_EXT3_FS=y | |||
923 | CONFIG_EXT3_FS_XATTR=y | 927 | CONFIG_EXT3_FS_XATTR=y |
924 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 928 | # CONFIG_EXT3_FS_POSIX_ACL is not set |
925 | # CONFIG_EXT3_FS_SECURITY is not set | 929 | # CONFIG_EXT3_FS_SECURITY is not set |
930 | # CONFIG_EXT4DEV_FS is not set | ||
926 | CONFIG_JBD=y | 931 | CONFIG_JBD=y |
927 | # CONFIG_JBD_DEBUG is not set | 932 | # CONFIG_JBD_DEBUG is not set |
928 | CONFIG_FS_MBCACHE=y | 933 | CONFIG_FS_MBCACHE=y |
@@ -930,6 +935,7 @@ CONFIG_FS_MBCACHE=y | |||
930 | # CONFIG_JFS_FS is not set | 935 | # CONFIG_JFS_FS is not set |
931 | CONFIG_FS_POSIX_ACL=y | 936 | CONFIG_FS_POSIX_ACL=y |
932 | # CONFIG_XFS_FS is not set | 937 | # CONFIG_XFS_FS is not set |
938 | # CONFIG_GFS2_FS is not set | ||
933 | # CONFIG_OCFS2_FS is not set | 939 | # CONFIG_OCFS2_FS is not set |
934 | # CONFIG_MINIX_FS is not set | 940 | # CONFIG_MINIX_FS is not set |
935 | # CONFIG_ROMFS_FS is not set | 941 | # CONFIG_ROMFS_FS is not set |
@@ -1129,6 +1135,7 @@ CONFIG_DEBUG_FS=y | |||
1129 | # CONFIG_DEBUG_VM is not set | 1135 | # CONFIG_DEBUG_VM is not set |
1130 | # CONFIG_DEBUG_LIST is not set | 1136 | # CONFIG_DEBUG_LIST is not set |
1131 | # CONFIG_FORCED_INLINING is not set | 1137 | # CONFIG_FORCED_INLINING is not set |
1138 | # CONFIG_HEADERS_CHECK is not set | ||
1132 | # CONFIG_RCU_TORTURE_TEST is not set | 1139 | # CONFIG_RCU_TORTURE_TEST is not set |
1133 | # CONFIG_DEBUG_STACKOVERFLOW is not set | 1140 | # CONFIG_DEBUG_STACKOVERFLOW is not set |
1134 | # CONFIG_DEBUG_STACK_USAGE is not set | 1141 | # CONFIG_DEBUG_STACK_USAGE is not set |
diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig index 9828663652e9..d2833c1a1f3d 100644 --- a/arch/powerpc/configs/pseries_defconfig +++ b/arch/powerpc/configs/pseries_defconfig | |||
@@ -184,6 +184,7 @@ CONFIG_SPLIT_PTLOCK_CPUS=4 | |||
184 | CONFIG_MIGRATION=y | 184 | CONFIG_MIGRATION=y |
185 | CONFIG_RESOURCES_64BIT=y | 185 | CONFIG_RESOURCES_64BIT=y |
186 | CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y | 186 | CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y |
187 | CONFIG_NODES_SPAN_OTHER_NODES=y | ||
187 | # CONFIG_PPC_64K_PAGES is not set | 188 | # CONFIG_PPC_64K_PAGES is not set |
188 | CONFIG_SCHED_SMT=y | 189 | CONFIG_SCHED_SMT=y |
189 | CONFIG_PROC_DEVICETREE=y | 190 | CONFIG_PROC_DEVICETREE=y |
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 8b133afbdc20..7af23c43fd4b 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
@@ -38,7 +38,6 @@ obj-$(CONFIG_6xx) += idle_6xx.o l2cr_6xx.o cpu_setup_6xx.o | |||
38 | obj-$(CONFIG_TAU) += tau_6xx.o | 38 | obj-$(CONFIG_TAU) += tau_6xx.o |
39 | obj32-$(CONFIG_SOFTWARE_SUSPEND) += swsusp_32.o | 39 | obj32-$(CONFIG_SOFTWARE_SUSPEND) += swsusp_32.o |
40 | obj32-$(CONFIG_MODULES) += module_32.o | 40 | obj32-$(CONFIG_MODULES) += module_32.o |
41 | obj-$(CONFIG_E500) += perfmon_fsl_booke.o | ||
42 | 41 | ||
43 | ifeq ($(CONFIG_PPC_MERGE),y) | 42 | ifeq ($(CONFIG_PPC_MERGE),y) |
44 | 43 | ||
diff --git a/arch/powerpc/kernel/btext.c b/arch/powerpc/kernel/btext.c index 995fcef156fd..93f21aaf7c8e 100644 --- a/arch/powerpc/kernel/btext.c +++ b/arch/powerpc/kernel/btext.c | |||
@@ -182,7 +182,7 @@ int btext_initialize(struct device_node *np) | |||
182 | prop = get_property(np, "linux,bootx-linebytes", NULL); | 182 | prop = get_property(np, "linux,bootx-linebytes", NULL); |
183 | if (prop == NULL) | 183 | if (prop == NULL) |
184 | prop = get_property(np, "linebytes", NULL); | 184 | prop = get_property(np, "linebytes", NULL); |
185 | if (prop) | 185 | if (prop && *prop != 0xffffffffu) |
186 | pitch = *prop; | 186 | pitch = *prop; |
187 | if (pitch == 1) | 187 | if (pitch == 1) |
188 | pitch = 0x1000; | 188 | pitch = 0x1000; |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 95382f994404..bfd499ee3753 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -18,6 +18,7 @@ | |||
18 | 18 | ||
19 | #include <asm/oprofile_impl.h> | 19 | #include <asm/oprofile_impl.h> |
20 | #include <asm/cputable.h> | 20 | #include <asm/cputable.h> |
21 | #include <asm/prom.h> /* for PTRRELOC on ARCH=ppc */ | ||
21 | 22 | ||
22 | struct cpu_spec* cur_cpu_spec = NULL; | 23 | struct cpu_spec* cur_cpu_spec = NULL; |
23 | EXPORT_SYMBOL(cur_cpu_spec); | 24 | EXPORT_SYMBOL(cur_cpu_spec); |
@@ -73,7 +74,7 @@ extern void __restore_cpu_ppc970(void); | |||
73 | #define PPC_FEATURE_SPE_COMP 0 | 74 | #define PPC_FEATURE_SPE_COMP 0 |
74 | #endif | 75 | #endif |
75 | 76 | ||
76 | struct cpu_spec cpu_specs[] = { | 77 | static struct cpu_spec cpu_specs[] = { |
77 | #ifdef CONFIG_PPC64 | 78 | #ifdef CONFIG_PPC64 |
78 | { /* Power3 */ | 79 | { /* Power3 */ |
79 | .pvr_mask = 0xffff0000, | 80 | .pvr_mask = 0xffff0000, |
@@ -227,6 +228,21 @@ struct cpu_spec cpu_specs[] = { | |||
227 | .oprofile_type = PPC_OPROFILE_POWER4, | 228 | .oprofile_type = PPC_OPROFILE_POWER4, |
228 | .platform = "ppc970", | 229 | .platform = "ppc970", |
229 | }, | 230 | }, |
231 | { /* PPC970GX */ | ||
232 | .pvr_mask = 0xffff0000, | ||
233 | .pvr_value = 0x00450000, | ||
234 | .cpu_name = "PPC970GX", | ||
235 | .cpu_features = CPU_FTRS_PPC970, | ||
236 | .cpu_user_features = COMMON_USER_POWER4 | | ||
237 | PPC_FEATURE_HAS_ALTIVEC_COMP, | ||
238 | .icache_bsize = 128, | ||
239 | .dcache_bsize = 128, | ||
240 | .num_pmcs = 8, | ||
241 | .cpu_setup = __setup_cpu_ppc970, | ||
242 | .oprofile_cpu_type = "ppc64/970", | ||
243 | .oprofile_type = PPC_OPROFILE_POWER4, | ||
244 | .platform = "ppc970", | ||
245 | }, | ||
230 | { /* Power5 GR */ | 246 | { /* Power5 GR */ |
231 | .pvr_mask = 0xffff0000, | 247 | .pvr_mask = 0xffff0000, |
232 | .pvr_value = 0x003a0000, | 248 | .pvr_value = 0x003a0000, |
@@ -1152,3 +1168,71 @@ struct cpu_spec cpu_specs[] = { | |||
1152 | #endif /* !CLASSIC_PPC */ | 1168 | #endif /* !CLASSIC_PPC */ |
1153 | #endif /* CONFIG_PPC32 */ | 1169 | #endif /* CONFIG_PPC32 */ |
1154 | }; | 1170 | }; |
1171 | |||
1172 | struct cpu_spec *identify_cpu(unsigned long offset) | ||
1173 | { | ||
1174 | struct cpu_spec *s = cpu_specs; | ||
1175 | struct cpu_spec **cur = &cur_cpu_spec; | ||
1176 | unsigned int pvr = mfspr(SPRN_PVR); | ||
1177 | int i; | ||
1178 | |||
1179 | s = PTRRELOC(s); | ||
1180 | cur = PTRRELOC(cur); | ||
1181 | |||
1182 | if (*cur != NULL) | ||
1183 | return PTRRELOC(*cur); | ||
1184 | |||
1185 | for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++) | ||
1186 | if ((pvr & s->pvr_mask) == s->pvr_value) { | ||
1187 | *cur = cpu_specs + i; | ||
1188 | #ifdef CONFIG_PPC64 | ||
1189 | /* ppc64 expects identify_cpu to also call setup_cpu | ||
1190 | * for that processor. I will consolidate that at a | ||
1191 | * later time, for now, just use our friend #ifdef. | ||
1192 | * we also don't need to PTRRELOC the function pointer | ||
1193 | * on ppc64 as we are running at 0 in real mode. | ||
1194 | */ | ||
1195 | if (s->cpu_setup) { | ||
1196 | s->cpu_setup(offset, s); | ||
1197 | } | ||
1198 | #endif /* CONFIG_PPC64 */ | ||
1199 | return s; | ||
1200 | } | ||
1201 | BUG(); | ||
1202 | return NULL; | ||
1203 | } | ||
1204 | |||
1205 | void do_feature_fixups(unsigned long value, void *fixup_start, void *fixup_end) | ||
1206 | { | ||
1207 | struct fixup_entry { | ||
1208 | unsigned long mask; | ||
1209 | unsigned long value; | ||
1210 | long start_off; | ||
1211 | long end_off; | ||
1212 | } *fcur, *fend; | ||
1213 | |||
1214 | fcur = fixup_start; | ||
1215 | fend = fixup_end; | ||
1216 | |||
1217 | for (; fcur < fend; fcur++) { | ||
1218 | unsigned int *pstart, *pend, *p; | ||
1219 | |||
1220 | if ((value & fcur->mask) == fcur->value) | ||
1221 | continue; | ||
1222 | |||
1223 | /* These PTRRELOCs will disappear once the new scheme for | ||
1224 | * modules and vdso is implemented | ||
1225 | */ | ||
1226 | pstart = ((unsigned int *)fcur) + (fcur->start_off / 4); | ||
1227 | pend = ((unsigned int *)fcur) + (fcur->end_off / 4); | ||
1228 | |||
1229 | for (p = pstart; p < pend; p++) { | ||
1230 | *p = 0x60000000u; | ||
1231 | asm volatile ("dcbst 0, %0" : : "r" (p)); | ||
1232 | } | ||
1233 | asm volatile ("sync" : : : "memory"); | ||
1234 | for (p = pstart; p < pend; p++) | ||
1235 | asm volatile ("icbi 0,%0" : : "r" (p)); | ||
1236 | asm volatile ("sync; isync" : : : "memory"); | ||
1237 | } | ||
1238 | } | ||
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index 645c7f10fb28..e720729f3e55 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
@@ -487,7 +487,7 @@ BEGIN_FTR_SECTION | |||
487 | rlwimi r13,r12,16,0x20 | 487 | rlwimi r13,r12,16,0x20 |
488 | mfcr r12 | 488 | mfcr r12 |
489 | cmpwi r13,0x2c | 489 | cmpwi r13,0x2c |
490 | beq .do_stab_bolted_pSeries | 490 | beq do_stab_bolted_pSeries |
491 | mtcrf 0x80,r12 | 491 | mtcrf 0x80,r12 |
492 | mfspr r12,SPRN_SPRG2 | 492 | mfspr r12,SPRN_SPRG2 |
493 | END_FTR_SECTION_IFCLR(CPU_FTR_SLB) | 493 | END_FTR_SECTION_IFCLR(CPU_FTR_SLB) |
@@ -600,7 +600,7 @@ system_call_pSeries: | |||
600 | STD_EXCEPTION_PSERIES(., performance_monitor) | 600 | STD_EXCEPTION_PSERIES(., performance_monitor) |
601 | 601 | ||
602 | .align 7 | 602 | .align 7 |
603 | _GLOBAL(do_stab_bolted_pSeries) | 603 | do_stab_bolted_pSeries: |
604 | mtcrf 0x80,r12 | 604 | mtcrf 0x80,r12 |
605 | mfspr r12,SPRN_SPRG2 | 605 | mfspr r12,SPRN_SPRG2 |
606 | EXCEPTION_PROLOG_PSERIES(PACA_EXSLB, .do_stab_bolted) | 606 | EXCEPTION_PROLOG_PSERIES(PACA_EXSLB, .do_stab_bolted) |
@@ -1046,7 +1046,7 @@ slb_miss_fault: | |||
1046 | li r5,0 | 1046 | li r5,0 |
1047 | std r4,_DAR(r1) | 1047 | std r4,_DAR(r1) |
1048 | std r5,_DSISR(r1) | 1048 | std r5,_DSISR(r1) |
1049 | b .handle_page_fault | 1049 | b handle_page_fault |
1050 | 1050 | ||
1051 | unrecov_user_slb: | 1051 | unrecov_user_slb: |
1052 | EXCEPTION_PROLOG_COMMON(0x4200, PACA_EXGEN) | 1052 | EXCEPTION_PROLOG_COMMON(0x4200, PACA_EXGEN) |
@@ -1174,12 +1174,13 @@ program_check_common: | |||
1174 | .globl fp_unavailable_common | 1174 | .globl fp_unavailable_common |
1175 | fp_unavailable_common: | 1175 | fp_unavailable_common: |
1176 | EXCEPTION_PROLOG_COMMON(0x800, PACA_EXGEN) | 1176 | EXCEPTION_PROLOG_COMMON(0x800, PACA_EXGEN) |
1177 | bne .load_up_fpu /* if from user, just load it up */ | 1177 | bne 1f /* if from user, just load it up */ |
1178 | bl .save_nvgprs | 1178 | bl .save_nvgprs |
1179 | addi r3,r1,STACK_FRAME_OVERHEAD | 1179 | addi r3,r1,STACK_FRAME_OVERHEAD |
1180 | ENABLE_INTS | 1180 | ENABLE_INTS |
1181 | bl .kernel_fp_unavailable_exception | 1181 | bl .kernel_fp_unavailable_exception |
1182 | BUG_OPCODE | 1182 | BUG_OPCODE |
1183 | 1: b .load_up_fpu | ||
1183 | 1184 | ||
1184 | .align 7 | 1185 | .align 7 |
1185 | .globl altivec_unavailable_common | 1186 | .globl altivec_unavailable_common |
@@ -1279,10 +1280,10 @@ _GLOBAL(do_hash_page) | |||
1279 | std r4,_DSISR(r1) | 1280 | std r4,_DSISR(r1) |
1280 | 1281 | ||
1281 | andis. r0,r4,0xa450 /* weird error? */ | 1282 | andis. r0,r4,0xa450 /* weird error? */ |
1282 | bne- .handle_page_fault /* if not, try to insert a HPTE */ | 1283 | bne- handle_page_fault /* if not, try to insert a HPTE */ |
1283 | BEGIN_FTR_SECTION | 1284 | BEGIN_FTR_SECTION |
1284 | andis. r0,r4,0x0020 /* Is it a segment table fault? */ | 1285 | andis. r0,r4,0x0020 /* Is it a segment table fault? */ |
1285 | bne- .do_ste_alloc /* If so handle it */ | 1286 | bne- do_ste_alloc /* If so handle it */ |
1286 | END_FTR_SECTION_IFCLR(CPU_FTR_SLB) | 1287 | END_FTR_SECTION_IFCLR(CPU_FTR_SLB) |
1287 | 1288 | ||
1288 | /* | 1289 | /* |
@@ -1324,7 +1325,7 @@ BEGIN_FW_FTR_SECTION | |||
1324 | * because ret_from_except_lite will check for and handle pending | 1325 | * because ret_from_except_lite will check for and handle pending |
1325 | * interrupts if necessary. | 1326 | * interrupts if necessary. |
1326 | */ | 1327 | */ |
1327 | beq .ret_from_except_lite | 1328 | beq 13f |
1328 | /* For a hash failure, we don't bother re-enabling interrupts */ | 1329 | /* For a hash failure, we don't bother re-enabling interrupts */ |
1329 | ble- 12f | 1330 | ble- 12f |
1330 | 1331 | ||
@@ -1346,14 +1347,14 @@ BEGIN_FW_FTR_SECTION | |||
1346 | END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES) | 1347 | END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES) |
1347 | 1348 | ||
1348 | /* Here we have a page fault that hash_page can't handle. */ | 1349 | /* Here we have a page fault that hash_page can't handle. */ |
1349 | _GLOBAL(handle_page_fault) | 1350 | handle_page_fault: |
1350 | ENABLE_INTS | 1351 | ENABLE_INTS |
1351 | 11: ld r4,_DAR(r1) | 1352 | 11: ld r4,_DAR(r1) |
1352 | ld r5,_DSISR(r1) | 1353 | ld r5,_DSISR(r1) |
1353 | addi r3,r1,STACK_FRAME_OVERHEAD | 1354 | addi r3,r1,STACK_FRAME_OVERHEAD |
1354 | bl .do_page_fault | 1355 | bl .do_page_fault |
1355 | cmpdi r3,0 | 1356 | cmpdi r3,0 |
1356 | beq+ .ret_from_except_lite | 1357 | beq+ 13f |
1357 | bl .save_nvgprs | 1358 | bl .save_nvgprs |
1358 | mr r5,r3 | 1359 | mr r5,r3 |
1359 | addi r3,r1,STACK_FRAME_OVERHEAD | 1360 | addi r3,r1,STACK_FRAME_OVERHEAD |
@@ -1370,12 +1371,14 @@ _GLOBAL(handle_page_fault) | |||
1370 | bl .low_hash_fault | 1371 | bl .low_hash_fault |
1371 | b .ret_from_except | 1372 | b .ret_from_except |
1372 | 1373 | ||
1374 | 13: b .ret_from_except_lite | ||
1375 | |||
1373 | /* here we have a segment miss */ | 1376 | /* here we have a segment miss */ |
1374 | _GLOBAL(do_ste_alloc) | 1377 | do_ste_alloc: |
1375 | bl .ste_allocate /* try to insert stab entry */ | 1378 | bl .ste_allocate /* try to insert stab entry */ |
1376 | cmpdi r3,0 | 1379 | cmpdi r3,0 |
1377 | beq+ fast_exception_return | 1380 | bne- handle_page_fault |
1378 | b .handle_page_fault | 1381 | b fast_exception_return |
1379 | 1382 | ||
1380 | /* | 1383 | /* |
1381 | * r13 points to the PACA, r9 contains the saved CR, | 1384 | * r13 points to the PACA, r9 contains the saved CR, |
@@ -1580,11 +1583,6 @@ _STATIC(__start_initialization_iSeries) | |||
1580 | li r0,0 | 1583 | li r0,0 |
1581 | stdu r0,-STACK_FRAME_OVERHEAD(r1) | 1584 | stdu r0,-STACK_FRAME_OVERHEAD(r1) |
1582 | 1585 | ||
1583 | LOAD_REG_IMMEDIATE(r3,cpu_specs) | ||
1584 | LOAD_REG_IMMEDIATE(r4,cur_cpu_spec) | ||
1585 | li r5,0 | ||
1586 | bl .identify_cpu | ||
1587 | |||
1588 | LOAD_REG_IMMEDIATE(r2,__toc_start) | 1586 | LOAD_REG_IMMEDIATE(r2,__toc_start) |
1589 | addi r2,r2,0x4000 | 1587 | addi r2,r2,0x4000 |
1590 | addi r2,r2,0x4000 | 1588 | addi r2,r2,0x4000 |
@@ -1646,6 +1644,8 @@ _GLOBAL(__start_initialization_multiplatform) | |||
1646 | cmpwi r0,0x3c /* 970FX */ | 1644 | cmpwi r0,0x3c /* 970FX */ |
1647 | beq 1f | 1645 | beq 1f |
1648 | cmpwi r0,0x44 /* 970MP */ | 1646 | cmpwi r0,0x44 /* 970MP */ |
1647 | beq 1f | ||
1648 | cmpwi r0,0x45 /* 970GX */ | ||
1649 | bne 2f | 1649 | bne 2f |
1650 | 1: bl .__cpu_preinit_ppc970 | 1650 | 1: bl .__cpu_preinit_ppc970 |
1651 | 2: | 1651 | 2: |
@@ -1964,13 +1964,6 @@ _STATIC(start_here_multiplatform) | |||
1964 | addi r2,r2,0x4000 | 1964 | addi r2,r2,0x4000 |
1965 | add r2,r2,r26 | 1965 | add r2,r2,r26 |
1966 | 1966 | ||
1967 | LOAD_REG_IMMEDIATE(r3, cpu_specs) | ||
1968 | add r3,r3,r26 | ||
1969 | LOAD_REG_IMMEDIATE(r4,cur_cpu_spec) | ||
1970 | add r4,r4,r26 | ||
1971 | mr r5,r26 | ||
1972 | bl .identify_cpu | ||
1973 | |||
1974 | /* Do very early kernel initializations, including initial hash table, | 1967 | /* Do very early kernel initializations, including initial hash table, |
1975 | * stab and slb setup before we turn on relocation. */ | 1968 | * stab and slb setup before we turn on relocation. */ |
1976 | 1969 | ||
@@ -2000,13 +1993,6 @@ _STATIC(start_here_common) | |||
2000 | li r0,0 | 1993 | li r0,0 |
2001 | stdu r0,-STACK_FRAME_OVERHEAD(r1) | 1994 | stdu r0,-STACK_FRAME_OVERHEAD(r1) |
2002 | 1995 | ||
2003 | /* Apply the CPUs-specific fixups (nop out sections not relevant | ||
2004 | * to this CPU | ||
2005 | */ | ||
2006 | li r3,0 | ||
2007 | bl .do_cpu_ftr_fixups | ||
2008 | bl .do_fw_ftr_fixups | ||
2009 | |||
2010 | /* ptr to current */ | 1996 | /* ptr to current */ |
2011 | LOAD_REG_IMMEDIATE(r4, init_task) | 1997 | LOAD_REG_IMMEDIATE(r4, init_task) |
2012 | std r4,PACACURRENT(r13) | 1998 | std r4,PACACURRENT(r13) |
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index f88a2a675d90..ba6b7256084b 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c | |||
@@ -47,6 +47,17 @@ static int novmerge = 0; | |||
47 | static int novmerge = 1; | 47 | static int novmerge = 1; |
48 | #endif | 48 | #endif |
49 | 49 | ||
50 | static inline unsigned long iommu_num_pages(unsigned long vaddr, | ||
51 | unsigned long slen) | ||
52 | { | ||
53 | unsigned long npages; | ||
54 | |||
55 | npages = IOMMU_PAGE_ALIGN(vaddr + slen) - (vaddr & IOMMU_PAGE_MASK); | ||
56 | npages >>= IOMMU_PAGE_SHIFT; | ||
57 | |||
58 | return npages; | ||
59 | } | ||
60 | |||
50 | static int __init setup_iommu(char *str) | 61 | static int __init setup_iommu(char *str) |
51 | { | 62 | { |
52 | if (!strcmp(str, "novmerge")) | 63 | if (!strcmp(str, "novmerge")) |
@@ -178,10 +189,10 @@ static dma_addr_t iommu_alloc(struct iommu_table *tbl, void *page, | |||
178 | } | 189 | } |
179 | 190 | ||
180 | entry += tbl->it_offset; /* Offset into real TCE table */ | 191 | entry += tbl->it_offset; /* Offset into real TCE table */ |
181 | ret = entry << PAGE_SHIFT; /* Set the return dma address */ | 192 | ret = entry << IOMMU_PAGE_SHIFT; /* Set the return dma address */ |
182 | 193 | ||
183 | /* Put the TCEs in the HW table */ | 194 | /* Put the TCEs in the HW table */ |
184 | ppc_md.tce_build(tbl, entry, npages, (unsigned long)page & PAGE_MASK, | 195 | ppc_md.tce_build(tbl, entry, npages, (unsigned long)page & IOMMU_PAGE_MASK, |
185 | direction); | 196 | direction); |
186 | 197 | ||
187 | 198 | ||
@@ -203,7 +214,7 @@ static void __iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr, | |||
203 | unsigned long entry, free_entry; | 214 | unsigned long entry, free_entry; |
204 | unsigned long i; | 215 | unsigned long i; |
205 | 216 | ||
206 | entry = dma_addr >> PAGE_SHIFT; | 217 | entry = dma_addr >> IOMMU_PAGE_SHIFT; |
207 | free_entry = entry - tbl->it_offset; | 218 | free_entry = entry - tbl->it_offset; |
208 | 219 | ||
209 | if (((free_entry + npages) > tbl->it_size) || | 220 | if (((free_entry + npages) > tbl->it_size) || |
@@ -270,7 +281,7 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl, | |||
270 | /* Init first segment length for backout at failure */ | 281 | /* Init first segment length for backout at failure */ |
271 | outs->dma_length = 0; | 282 | outs->dma_length = 0; |
272 | 283 | ||
273 | DBG("mapping %d elements:\n", nelems); | 284 | DBG("sg mapping %d elements:\n", nelems); |
274 | 285 | ||
275 | spin_lock_irqsave(&(tbl->it_lock), flags); | 286 | spin_lock_irqsave(&(tbl->it_lock), flags); |
276 | 287 | ||
@@ -285,9 +296,8 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl, | |||
285 | } | 296 | } |
286 | /* Allocate iommu entries for that segment */ | 297 | /* Allocate iommu entries for that segment */ |
287 | vaddr = (unsigned long)page_address(s->page) + s->offset; | 298 | vaddr = (unsigned long)page_address(s->page) + s->offset; |
288 | npages = PAGE_ALIGN(vaddr + slen) - (vaddr & PAGE_MASK); | 299 | npages = iommu_num_pages(vaddr, slen); |
289 | npages >>= PAGE_SHIFT; | 300 | entry = iommu_range_alloc(tbl, npages, &handle, mask >> IOMMU_PAGE_SHIFT, 0); |
290 | entry = iommu_range_alloc(tbl, npages, &handle, mask >> PAGE_SHIFT, 0); | ||
291 | 301 | ||
292 | DBG(" - vaddr: %lx, size: %lx\n", vaddr, slen); | 302 | DBG(" - vaddr: %lx, size: %lx\n", vaddr, slen); |
293 | 303 | ||
@@ -301,14 +311,14 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl, | |||
301 | 311 | ||
302 | /* Convert entry to a dma_addr_t */ | 312 | /* Convert entry to a dma_addr_t */ |
303 | entry += tbl->it_offset; | 313 | entry += tbl->it_offset; |
304 | dma_addr = entry << PAGE_SHIFT; | 314 | dma_addr = entry << IOMMU_PAGE_SHIFT; |
305 | dma_addr |= s->offset; | 315 | dma_addr |= (s->offset & ~IOMMU_PAGE_MASK); |
306 | 316 | ||
307 | DBG(" - %lx pages, entry: %lx, dma_addr: %lx\n", | 317 | DBG(" - %lu pages, entry: %lx, dma_addr: %lx\n", |
308 | npages, entry, dma_addr); | 318 | npages, entry, dma_addr); |
309 | 319 | ||
310 | /* Insert into HW table */ | 320 | /* Insert into HW table */ |
311 | ppc_md.tce_build(tbl, entry, npages, vaddr & PAGE_MASK, direction); | 321 | ppc_md.tce_build(tbl, entry, npages, vaddr & IOMMU_PAGE_MASK, direction); |
312 | 322 | ||
313 | /* If we are in an open segment, try merging */ | 323 | /* If we are in an open segment, try merging */ |
314 | if (segstart != s) { | 324 | if (segstart != s) { |
@@ -323,7 +333,7 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl, | |||
323 | DBG(" can't merge, new segment.\n"); | 333 | DBG(" can't merge, new segment.\n"); |
324 | } else { | 334 | } else { |
325 | outs->dma_length += s->length; | 335 | outs->dma_length += s->length; |
326 | DBG(" merged, new len: %lx\n", outs->dma_length); | 336 | DBG(" merged, new len: %ux\n", outs->dma_length); |
327 | } | 337 | } |
328 | } | 338 | } |
329 | 339 | ||
@@ -367,9 +377,8 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl, | |||
367 | if (s->dma_length != 0) { | 377 | if (s->dma_length != 0) { |
368 | unsigned long vaddr, npages; | 378 | unsigned long vaddr, npages; |
369 | 379 | ||
370 | vaddr = s->dma_address & PAGE_MASK; | 380 | vaddr = s->dma_address & IOMMU_PAGE_MASK; |
371 | npages = (PAGE_ALIGN(s->dma_address + s->dma_length) - vaddr) | 381 | npages = iommu_num_pages(s->dma_address, s->dma_length); |
372 | >> PAGE_SHIFT; | ||
373 | __iommu_free(tbl, vaddr, npages); | 382 | __iommu_free(tbl, vaddr, npages); |
374 | s->dma_address = DMA_ERROR_CODE; | 383 | s->dma_address = DMA_ERROR_CODE; |
375 | s->dma_length = 0; | 384 | s->dma_length = 0; |
@@ -398,8 +407,7 @@ void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist, | |||
398 | 407 | ||
399 | if (sglist->dma_length == 0) | 408 | if (sglist->dma_length == 0) |
400 | break; | 409 | break; |
401 | npages = (PAGE_ALIGN(dma_handle + sglist->dma_length) | 410 | npages = iommu_num_pages(dma_handle,sglist->dma_length); |
402 | - (dma_handle & PAGE_MASK)) >> PAGE_SHIFT; | ||
403 | __iommu_free(tbl, dma_handle, npages); | 411 | __iommu_free(tbl, dma_handle, npages); |
404 | sglist++; | 412 | sglist++; |
405 | } | 413 | } |
@@ -532,12 +540,11 @@ dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr, | |||
532 | BUG_ON(direction == DMA_NONE); | 540 | BUG_ON(direction == DMA_NONE); |
533 | 541 | ||
534 | uaddr = (unsigned long)vaddr; | 542 | uaddr = (unsigned long)vaddr; |
535 | npages = PAGE_ALIGN(uaddr + size) - (uaddr & PAGE_MASK); | 543 | npages = iommu_num_pages(uaddr, size); |
536 | npages >>= PAGE_SHIFT; | ||
537 | 544 | ||
538 | if (tbl) { | 545 | if (tbl) { |
539 | dma_handle = iommu_alloc(tbl, vaddr, npages, direction, | 546 | dma_handle = iommu_alloc(tbl, vaddr, npages, direction, |
540 | mask >> PAGE_SHIFT, 0); | 547 | mask >> IOMMU_PAGE_SHIFT, 0); |
541 | if (dma_handle == DMA_ERROR_CODE) { | 548 | if (dma_handle == DMA_ERROR_CODE) { |
542 | if (printk_ratelimit()) { | 549 | if (printk_ratelimit()) { |
543 | printk(KERN_INFO "iommu_alloc failed, " | 550 | printk(KERN_INFO "iommu_alloc failed, " |
@@ -545,7 +552,7 @@ dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr, | |||
545 | tbl, vaddr, npages); | 552 | tbl, vaddr, npages); |
546 | } | 553 | } |
547 | } else | 554 | } else |
548 | dma_handle |= (uaddr & ~PAGE_MASK); | 555 | dma_handle |= (uaddr & ~IOMMU_PAGE_MASK); |
549 | } | 556 | } |
550 | 557 | ||
551 | return dma_handle; | 558 | return dma_handle; |
@@ -554,11 +561,14 @@ dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr, | |||
554 | void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle, | 561 | void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle, |
555 | size_t size, enum dma_data_direction direction) | 562 | size_t size, enum dma_data_direction direction) |
556 | { | 563 | { |
564 | unsigned int npages; | ||
565 | |||
557 | BUG_ON(direction == DMA_NONE); | 566 | BUG_ON(direction == DMA_NONE); |
558 | 567 | ||
559 | if (tbl) | 568 | if (tbl) { |
560 | iommu_free(tbl, dma_handle, (PAGE_ALIGN(dma_handle + size) - | 569 | npages = iommu_num_pages(dma_handle, size); |
561 | (dma_handle & PAGE_MASK)) >> PAGE_SHIFT); | 570 | iommu_free(tbl, dma_handle, npages); |
571 | } | ||
562 | } | 572 | } |
563 | 573 | ||
564 | /* Allocates a contiguous real buffer and creates mappings over it. | 574 | /* Allocates a contiguous real buffer and creates mappings over it. |
@@ -570,11 +580,11 @@ void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size, | |||
570 | { | 580 | { |
571 | void *ret = NULL; | 581 | void *ret = NULL; |
572 | dma_addr_t mapping; | 582 | dma_addr_t mapping; |
573 | unsigned int npages, order; | 583 | unsigned int order; |
584 | unsigned int nio_pages, io_order; | ||
574 | struct page *page; | 585 | struct page *page; |
575 | 586 | ||
576 | size = PAGE_ALIGN(size); | 587 | size = PAGE_ALIGN(size); |
577 | npages = size >> PAGE_SHIFT; | ||
578 | order = get_order(size); | 588 | order = get_order(size); |
579 | 589 | ||
580 | /* | 590 | /* |
@@ -598,8 +608,10 @@ void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size, | |||
598 | memset(ret, 0, size); | 608 | memset(ret, 0, size); |
599 | 609 | ||
600 | /* Set up tces to cover the allocated range */ | 610 | /* Set up tces to cover the allocated range */ |
601 | mapping = iommu_alloc(tbl, ret, npages, DMA_BIDIRECTIONAL, | 611 | nio_pages = size >> IOMMU_PAGE_SHIFT; |
602 | mask >> PAGE_SHIFT, order); | 612 | io_order = get_iommu_order(size); |
613 | mapping = iommu_alloc(tbl, ret, nio_pages, DMA_BIDIRECTIONAL, | ||
614 | mask >> IOMMU_PAGE_SHIFT, io_order); | ||
603 | if (mapping == DMA_ERROR_CODE) { | 615 | if (mapping == DMA_ERROR_CODE) { |
604 | free_pages((unsigned long)ret, order); | 616 | free_pages((unsigned long)ret, order); |
605 | return NULL; | 617 | return NULL; |
@@ -611,12 +623,13 @@ void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size, | |||
611 | void iommu_free_coherent(struct iommu_table *tbl, size_t size, | 623 | void iommu_free_coherent(struct iommu_table *tbl, size_t size, |
612 | void *vaddr, dma_addr_t dma_handle) | 624 | void *vaddr, dma_addr_t dma_handle) |
613 | { | 625 | { |
614 | unsigned int npages; | ||
615 | |||
616 | if (tbl) { | 626 | if (tbl) { |
627 | unsigned int nio_pages; | ||
628 | |||
629 | size = PAGE_ALIGN(size); | ||
630 | nio_pages = size >> IOMMU_PAGE_SHIFT; | ||
631 | iommu_free(tbl, dma_handle, nio_pages); | ||
617 | size = PAGE_ALIGN(size); | 632 | size = PAGE_ALIGN(size); |
618 | npages = size >> PAGE_SHIFT; | ||
619 | iommu_free(tbl, dma_handle, npages); | ||
620 | free_pages((unsigned long)vaddr, get_order(size)); | 633 | free_pages((unsigned long)vaddr, get_order(size)); |
621 | } | 634 | } |
622 | } | 635 | } |
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index 88fd73fdf048..412bea3cf813 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S | |||
@@ -102,80 +102,6 @@ _GLOBAL(reloc_got2) | |||
102 | blr | 102 | blr |
103 | 103 | ||
104 | /* | 104 | /* |
105 | * identify_cpu, | ||
106 | * called with r3 = data offset and r4 = CPU number | ||
107 | * doesn't change r3 | ||
108 | */ | ||
109 | _GLOBAL(identify_cpu) | ||
110 | addis r8,r3,cpu_specs@ha | ||
111 | addi r8,r8,cpu_specs@l | ||
112 | mfpvr r7 | ||
113 | 1: | ||
114 | lwz r5,CPU_SPEC_PVR_MASK(r8) | ||
115 | and r5,r5,r7 | ||
116 | lwz r6,CPU_SPEC_PVR_VALUE(r8) | ||
117 | cmplw 0,r6,r5 | ||
118 | beq 1f | ||
119 | addi r8,r8,CPU_SPEC_ENTRY_SIZE | ||
120 | b 1b | ||
121 | 1: | ||
122 | addis r6,r3,cur_cpu_spec@ha | ||
123 | addi r6,r6,cur_cpu_spec@l | ||
124 | sub r8,r8,r3 | ||
125 | stw r8,0(r6) | ||
126 | blr | ||
127 | |||
128 | /* | ||
129 | * do_cpu_ftr_fixups - goes through the list of CPU feature fixups | ||
130 | * and writes nop's over sections of code that don't apply for this cpu. | ||
131 | * r3 = data offset (not changed) | ||
132 | */ | ||
133 | _GLOBAL(do_cpu_ftr_fixups) | ||
134 | /* Get CPU 0 features */ | ||
135 | addis r6,r3,cur_cpu_spec@ha | ||
136 | addi r6,r6,cur_cpu_spec@l | ||
137 | lwz r4,0(r6) | ||
138 | add r4,r4,r3 | ||
139 | lwz r4,CPU_SPEC_FEATURES(r4) | ||
140 | |||
141 | /* Get the fixup table */ | ||
142 | addis r6,r3,__start___ftr_fixup@ha | ||
143 | addi r6,r6,__start___ftr_fixup@l | ||
144 | addis r7,r3,__stop___ftr_fixup@ha | ||
145 | addi r7,r7,__stop___ftr_fixup@l | ||
146 | |||
147 | /* Do the fixup */ | ||
148 | 1: cmplw 0,r6,r7 | ||
149 | bgelr | ||
150 | addi r6,r6,16 | ||
151 | lwz r8,-16(r6) /* mask */ | ||
152 | and r8,r8,r4 | ||
153 | lwz r9,-12(r6) /* value */ | ||
154 | cmplw 0,r8,r9 | ||
155 | beq 1b | ||
156 | lwz r8,-8(r6) /* section begin */ | ||
157 | lwz r9,-4(r6) /* section end */ | ||
158 | subf. r9,r8,r9 | ||
159 | beq 1b | ||
160 | /* write nops over the section of code */ | ||
161 | /* todo: if large section, add a branch at the start of it */ | ||
162 | srwi r9,r9,2 | ||
163 | mtctr r9 | ||
164 | add r8,r8,r3 | ||
165 | lis r0,0x60000000@h /* nop */ | ||
166 | 3: stw r0,0(r8) | ||
167 | andi. r10,r4,CPU_FTR_SPLIT_ID_CACHE@l | ||
168 | beq 2f | ||
169 | dcbst 0,r8 /* suboptimal, but simpler */ | ||
170 | sync | ||
171 | icbi 0,r8 | ||
172 | 2: addi r8,r8,4 | ||
173 | bdnz 3b | ||
174 | sync /* additional sync needed on g4 */ | ||
175 | isync | ||
176 | b 1b | ||
177 | |||
178 | /* | ||
179 | * call_setup_cpu - call the setup_cpu function for this cpu | 105 | * call_setup_cpu - call the setup_cpu function for this cpu |
180 | * r3 = data offset, r24 = cpu number | 106 | * r3 = data offset, r24 = cpu number |
181 | * | 107 | * |
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index c70e20708a1f..21fd2c662a99 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
@@ -246,130 +246,6 @@ _GLOBAL(__flush_dcache_icache) | |||
246 | isync | 246 | isync |
247 | blr | 247 | blr |
248 | 248 | ||
249 | /* | ||
250 | * identify_cpu and calls setup_cpu | ||
251 | * In: r3 = base of the cpu_specs array | ||
252 | * r4 = address of cur_cpu_spec | ||
253 | * r5 = relocation offset | ||
254 | */ | ||
255 | _GLOBAL(identify_cpu) | ||
256 | mfpvr r7 | ||
257 | 1: | ||
258 | lwz r8,CPU_SPEC_PVR_MASK(r3) | ||
259 | and r8,r8,r7 | ||
260 | lwz r9,CPU_SPEC_PVR_VALUE(r3) | ||
261 | cmplw 0,r9,r8 | ||
262 | beq 1f | ||
263 | addi r3,r3,CPU_SPEC_ENTRY_SIZE | ||
264 | b 1b | ||
265 | 1: | ||
266 | sub r0,r3,r5 | ||
267 | std r0,0(r4) | ||
268 | ld r4,CPU_SPEC_SETUP(r3) | ||
269 | cmpdi 0,r4,0 | ||
270 | add r4,r4,r5 | ||
271 | beqlr | ||
272 | ld r4,0(r4) | ||
273 | add r4,r4,r5 | ||
274 | mtctr r4 | ||
275 | /* Calling convention for cpu setup is r3=offset, r4=cur_cpu_spec */ | ||
276 | mr r4,r3 | ||
277 | mr r3,r5 | ||
278 | bctr | ||
279 | |||
280 | /* | ||
281 | * do_cpu_ftr_fixups - goes through the list of CPU feature fixups | ||
282 | * and writes nop's over sections of code that don't apply for this cpu. | ||
283 | * r3 = data offset (not changed) | ||
284 | */ | ||
285 | _GLOBAL(do_cpu_ftr_fixups) | ||
286 | /* Get CPU 0 features */ | ||
287 | LOAD_REG_IMMEDIATE(r6,cur_cpu_spec) | ||
288 | sub r6,r6,r3 | ||
289 | ld r4,0(r6) | ||
290 | sub r4,r4,r3 | ||
291 | ld r4,CPU_SPEC_FEATURES(r4) | ||
292 | /* Get the fixup table */ | ||
293 | LOAD_REG_IMMEDIATE(r6,__start___ftr_fixup) | ||
294 | sub r6,r6,r3 | ||
295 | LOAD_REG_IMMEDIATE(r7,__stop___ftr_fixup) | ||
296 | sub r7,r7,r3 | ||
297 | /* Do the fixup */ | ||
298 | 1: cmpld r6,r7 | ||
299 | bgelr | ||
300 | addi r6,r6,32 | ||
301 | ld r8,-32(r6) /* mask */ | ||
302 | and r8,r8,r4 | ||
303 | ld r9,-24(r6) /* value */ | ||
304 | cmpld r8,r9 | ||
305 | beq 1b | ||
306 | ld r8,-16(r6) /* section begin */ | ||
307 | ld r9,-8(r6) /* section end */ | ||
308 | subf. r9,r8,r9 | ||
309 | beq 1b | ||
310 | /* write nops over the section of code */ | ||
311 | /* todo: if large section, add a branch at the start of it */ | ||
312 | srwi r9,r9,2 | ||
313 | mtctr r9 | ||
314 | sub r8,r8,r3 | ||
315 | lis r0,0x60000000@h /* nop */ | ||
316 | 3: stw r0,0(r8) | ||
317 | andi. r10,r4,CPU_FTR_SPLIT_ID_CACHE@l | ||
318 | beq 2f | ||
319 | dcbst 0,r8 /* suboptimal, but simpler */ | ||
320 | sync | ||
321 | icbi 0,r8 | ||
322 | 2: addi r8,r8,4 | ||
323 | bdnz 3b | ||
324 | sync /* additional sync needed on g4 */ | ||
325 | isync | ||
326 | b 1b | ||
327 | |||
328 | /* | ||
329 | * do_fw_ftr_fixups - goes through the list of firmware feature fixups | ||
330 | * and writes nop's over sections of code that don't apply for this firmware. | ||
331 | * r3 = data offset (not changed) | ||
332 | */ | ||
333 | _GLOBAL(do_fw_ftr_fixups) | ||
334 | /* Get firmware features */ | ||
335 | LOAD_REG_IMMEDIATE(r6,powerpc_firmware_features) | ||
336 | sub r6,r6,r3 | ||
337 | ld r4,0(r6) | ||
338 | /* Get the fixup table */ | ||
339 | LOAD_REG_IMMEDIATE(r6,__start___fw_ftr_fixup) | ||
340 | sub r6,r6,r3 | ||
341 | LOAD_REG_IMMEDIATE(r7,__stop___fw_ftr_fixup) | ||
342 | sub r7,r7,r3 | ||
343 | /* Do the fixup */ | ||
344 | 1: cmpld r6,r7 | ||
345 | bgelr | ||
346 | addi r6,r6,32 | ||
347 | ld r8,-32(r6) /* mask */ | ||
348 | and r8,r8,r4 | ||
349 | ld r9,-24(r6) /* value */ | ||
350 | cmpld r8,r9 | ||
351 | beq 1b | ||
352 | ld r8,-16(r6) /* section begin */ | ||
353 | ld r9,-8(r6) /* section end */ | ||
354 | subf. r9,r8,r9 | ||
355 | beq 1b | ||
356 | /* write nops over the section of code */ | ||
357 | /* todo: if large section, add a branch at the start of it */ | ||
358 | srwi r9,r9,2 | ||
359 | mtctr r9 | ||
360 | sub r8,r8,r3 | ||
361 | lis r0,0x60000000@h /* nop */ | ||
362 | 3: stw r0,0(r8) | ||
363 | BEGIN_FTR_SECTION | ||
364 | dcbst 0,r8 /* suboptimal, but simpler */ | ||
365 | sync | ||
366 | icbi 0,r8 | ||
367 | END_FTR_SECTION_IFSET(CPU_FTR_SPLIT_ID_CACHE) | ||
368 | addi r8,r8,4 | ||
369 | bdnz 3b | ||
370 | sync /* additional sync needed on g4 */ | ||
371 | isync | ||
372 | b 1b | ||
373 | 249 | ||
374 | #if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) | 250 | #if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) |
375 | /* | 251 | /* |
diff --git a/arch/powerpc/kernel/module_32.c b/arch/powerpc/kernel/module_32.c index 92f4e5f64f02..e2c3c6a85f33 100644 --- a/arch/powerpc/kernel/module_32.c +++ b/arch/powerpc/kernel/module_32.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
25 | #include <linux/cache.h> | 25 | #include <linux/cache.h> |
26 | 26 | ||
27 | #include "setup.h" | ||
28 | |||
27 | #if 0 | 29 | #if 0 |
28 | #define DEBUGP printk | 30 | #define DEBUGP printk |
29 | #else | 31 | #else |
@@ -269,33 +271,50 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, | |||
269 | return 0; | 271 | return 0; |
270 | } | 272 | } |
271 | 273 | ||
274 | static const Elf_Shdr *find_section(const Elf_Ehdr *hdr, | ||
275 | const Elf_Shdr *sechdrs, | ||
276 | const char *name) | ||
277 | { | ||
278 | char *secstrings; | ||
279 | unsigned int i; | ||
280 | |||
281 | secstrings = (char *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | ||
282 | for (i = 1; i < hdr->e_shnum; i++) | ||
283 | if (strcmp(secstrings+sechdrs[i].sh_name, name) == 0) | ||
284 | return &sechdrs[i]; | ||
285 | return NULL; | ||
286 | } | ||
287 | |||
272 | int module_finalize(const Elf_Ehdr *hdr, | 288 | int module_finalize(const Elf_Ehdr *hdr, |
273 | const Elf_Shdr *sechdrs, | 289 | const Elf_Shdr *sechdrs, |
274 | struct module *me) | 290 | struct module *me) |
275 | { | 291 | { |
276 | char *secstrings; | 292 | const Elf_Shdr *sect; |
277 | unsigned int i; | ||
278 | 293 | ||
279 | me->arch.bug_table = NULL; | 294 | me->arch.bug_table = NULL; |
280 | me->arch.num_bugs = 0; | 295 | me->arch.num_bugs = 0; |
281 | 296 | ||
282 | /* Find the __bug_table section, if present */ | 297 | /* Find the __bug_table section, if present */ |
283 | secstrings = (char *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | 298 | sect = find_section(hdr, sechdrs, "__bug_table"); |
284 | for (i = 1; i < hdr->e_shnum; i++) { | 299 | if (sect != NULL) { |
285 | if (strcmp(secstrings+sechdrs[i].sh_name, "__bug_table")) | 300 | me->arch.bug_table = (void *) sect->sh_addr; |
286 | continue; | 301 | me->arch.num_bugs = sect->sh_size / sizeof(struct bug_entry); |
287 | me->arch.bug_table = (void *) sechdrs[i].sh_addr; | ||
288 | me->arch.num_bugs = sechdrs[i].sh_size / sizeof(struct bug_entry); | ||
289 | break; | ||
290 | } | 302 | } |
291 | 303 | ||
292 | /* | 304 | /* |
293 | * Strictly speaking this should have a spinlock to protect against | 305 | * Strictly speaking this should have a spinlock to protect against |
294 | * traversals, but since we only traverse on BUG()s, a spinlock | 306 | * traversals, but since we only traverse on BUG()s, a spinlock |
295 | * could potentially lead to deadlock and thus be counter-productive. | 307 | * could potentially lead to deadlock and thus be counter-productive. |
296 | */ | 308 | */ |
297 | list_add(&me->arch.bug_list, &module_bug_list); | 309 | list_add(&me->arch.bug_list, &module_bug_list); |
298 | 310 | ||
311 | /* Apply feature fixups */ | ||
312 | sect = find_section(hdr, sechdrs, "__ftr_fixup"); | ||
313 | if (sect != NULL) | ||
314 | do_feature_fixups(cur_cpu_spec->cpu_features, | ||
315 | (void *)sect->sh_addr, | ||
316 | (void *)sect->sh_addr + sect->sh_size); | ||
317 | |||
299 | return 0; | 318 | return 0; |
300 | } | 319 | } |
301 | 320 | ||
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c index ba34001fca8e..8dd1f0aae5d6 100644 --- a/arch/powerpc/kernel/module_64.c +++ b/arch/powerpc/kernel/module_64.c | |||
@@ -22,6 +22,9 @@ | |||
22 | #include <linux/vmalloc.h> | 22 | #include <linux/vmalloc.h> |
23 | #include <asm/module.h> | 23 | #include <asm/module.h> |
24 | #include <asm/uaccess.h> | 24 | #include <asm/uaccess.h> |
25 | #include <asm/firmware.h> | ||
26 | |||
27 | #include "setup.h" | ||
25 | 28 | ||
26 | /* FIXME: We don't do .init separately. To do this, we'd need to have | 29 | /* FIXME: We don't do .init separately. To do this, we'd need to have |
27 | a separate r2 value in the init and core section, and stub between | 30 | a separate r2 value in the init and core section, and stub between |
@@ -400,6 +403,11 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
400 | | (value & 0x03fffffc); | 403 | | (value & 0x03fffffc); |
401 | break; | 404 | break; |
402 | 405 | ||
406 | case R_PPC64_REL64: | ||
407 | /* 64 bits relative (used by features fixups) */ | ||
408 | *location = value - (unsigned long)location; | ||
409 | break; | ||
410 | |||
403 | default: | 411 | default: |
404 | printk("%s: Unknown ADD relocation: %lu\n", | 412 | printk("%s: Unknown ADD relocation: %lu\n", |
405 | me->name, | 413 | me->name, |
@@ -413,23 +421,33 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
413 | 421 | ||
414 | LIST_HEAD(module_bug_list); | 422 | LIST_HEAD(module_bug_list); |
415 | 423 | ||
416 | int module_finalize(const Elf_Ehdr *hdr, | 424 | static const Elf_Shdr *find_section(const Elf_Ehdr *hdr, |
417 | const Elf_Shdr *sechdrs, struct module *me) | 425 | const Elf_Shdr *sechdrs, |
426 | const char *name) | ||
418 | { | 427 | { |
419 | char *secstrings; | 428 | char *secstrings; |
420 | unsigned int i; | 429 | unsigned int i; |
421 | 430 | ||
431 | secstrings = (char *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | ||
432 | for (i = 1; i < hdr->e_shnum; i++) | ||
433 | if (strcmp(secstrings+sechdrs[i].sh_name, name) == 0) | ||
434 | return &sechdrs[i]; | ||
435 | return NULL; | ||
436 | } | ||
437 | |||
438 | int module_finalize(const Elf_Ehdr *hdr, | ||
439 | const Elf_Shdr *sechdrs, struct module *me) | ||
440 | { | ||
441 | const Elf_Shdr *sect; | ||
442 | |||
422 | me->arch.bug_table = NULL; | 443 | me->arch.bug_table = NULL; |
423 | me->arch.num_bugs = 0; | 444 | me->arch.num_bugs = 0; |
424 | 445 | ||
425 | /* Find the __bug_table section, if present */ | 446 | /* Find the __bug_table section, if present */ |
426 | secstrings = (char *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | 447 | sect = find_section(hdr, sechdrs, "__bug_table"); |
427 | for (i = 1; i < hdr->e_shnum; i++) { | 448 | if (sect != NULL) { |
428 | if (strcmp(secstrings+sechdrs[i].sh_name, "__bug_table")) | 449 | me->arch.bug_table = (void *) sect->sh_addr; |
429 | continue; | 450 | me->arch.num_bugs = sect->sh_size / sizeof(struct bug_entry); |
430 | me->arch.bug_table = (void *) sechdrs[i].sh_addr; | ||
431 | me->arch.num_bugs = sechdrs[i].sh_size / sizeof(struct bug_entry); | ||
432 | break; | ||
433 | } | 451 | } |
434 | 452 | ||
435 | /* | 453 | /* |
@@ -439,6 +457,19 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
439 | */ | 457 | */ |
440 | list_add(&me->arch.bug_list, &module_bug_list); | 458 | list_add(&me->arch.bug_list, &module_bug_list); |
441 | 459 | ||
460 | /* Apply feature fixups */ | ||
461 | sect = find_section(hdr, sechdrs, "__ftr_fixup"); | ||
462 | if (sect != NULL) | ||
463 | do_feature_fixups(cur_cpu_spec->cpu_features, | ||
464 | (void *)sect->sh_addr, | ||
465 | (void *)sect->sh_addr + sect->sh_size); | ||
466 | |||
467 | sect = find_section(hdr, sechdrs, "__fw_ftr_fixup"); | ||
468 | if (sect != NULL) | ||
469 | do_feature_fixups(powerpc_firmware_features, | ||
470 | (void *)sect->sh_addr, | ||
471 | (void *)sect->sh_addr + sect->sh_size); | ||
472 | |||
442 | return 0; | 473 | return 0; |
443 | } | 474 | } |
444 | 475 | ||
diff --git a/arch/powerpc/kernel/perfmon_fsl_booke.c b/arch/powerpc/kernel/perfmon_fsl_booke.c deleted file mode 100644 index e0dcf2b41fbe..000000000000 --- a/arch/powerpc/kernel/perfmon_fsl_booke.c +++ /dev/null | |||
@@ -1,221 +0,0 @@ | |||
1 | /* arch/powerpc/kernel/perfmon_fsl_booke.c | ||
2 | * Freescale Book-E Performance Monitor code | ||
3 | * | ||
4 | * Author: Andy Fleming | ||
5 | * Copyright (c) 2004 Freescale Semiconductor, Inc | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version | ||
10 | * 2 of the License, or (at your option) any later version. | ||
11 | */ | ||
12 | |||
13 | #include <linux/errno.h> | ||
14 | #include <linux/sched.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/mm.h> | ||
17 | #include <linux/stddef.h> | ||
18 | #include <linux/unistd.h> | ||
19 | #include <linux/ptrace.h> | ||
20 | #include <linux/slab.h> | ||
21 | #include <linux/user.h> | ||
22 | #include <linux/a.out.h> | ||
23 | #include <linux/interrupt.h> | ||
24 | #include <linux/init.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/prctl.h> | ||
27 | |||
28 | #include <asm/pgtable.h> | ||
29 | #include <asm/uaccess.h> | ||
30 | #include <asm/system.h> | ||
31 | #include <asm/io.h> | ||
32 | #include <asm/reg.h> | ||
33 | #include <asm/xmon.h> | ||
34 | #include <asm/pmc.h> | ||
35 | |||
36 | static inline u32 get_pmlca(int ctr); | ||
37 | static inline void set_pmlca(int ctr, u32 pmlca); | ||
38 | |||
39 | static inline u32 get_pmlca(int ctr) | ||
40 | { | ||
41 | u32 pmlca; | ||
42 | |||
43 | switch (ctr) { | ||
44 | case 0: | ||
45 | pmlca = mfpmr(PMRN_PMLCA0); | ||
46 | break; | ||
47 | case 1: | ||
48 | pmlca = mfpmr(PMRN_PMLCA1); | ||
49 | break; | ||
50 | case 2: | ||
51 | pmlca = mfpmr(PMRN_PMLCA2); | ||
52 | break; | ||
53 | case 3: | ||
54 | pmlca = mfpmr(PMRN_PMLCA3); | ||
55 | break; | ||
56 | default: | ||
57 | panic("Bad ctr number\n"); | ||
58 | } | ||
59 | |||
60 | return pmlca; | ||
61 | } | ||
62 | |||
63 | static inline void set_pmlca(int ctr, u32 pmlca) | ||
64 | { | ||
65 | switch (ctr) { | ||
66 | case 0: | ||
67 | mtpmr(PMRN_PMLCA0, pmlca); | ||
68 | break; | ||
69 | case 1: | ||
70 | mtpmr(PMRN_PMLCA1, pmlca); | ||
71 | break; | ||
72 | case 2: | ||
73 | mtpmr(PMRN_PMLCA2, pmlca); | ||
74 | break; | ||
75 | case 3: | ||
76 | mtpmr(PMRN_PMLCA3, pmlca); | ||
77 | break; | ||
78 | default: | ||
79 | panic("Bad ctr number\n"); | ||
80 | } | ||
81 | } | ||
82 | |||
83 | void init_pmc_stop(int ctr) | ||
84 | { | ||
85 | u32 pmlca = (PMLCA_FC | PMLCA_FCS | PMLCA_FCU | | ||
86 | PMLCA_FCM1 | PMLCA_FCM0); | ||
87 | u32 pmlcb = 0; | ||
88 | |||
89 | switch (ctr) { | ||
90 | case 0: | ||
91 | mtpmr(PMRN_PMLCA0, pmlca); | ||
92 | mtpmr(PMRN_PMLCB0, pmlcb); | ||
93 | break; | ||
94 | case 1: | ||
95 | mtpmr(PMRN_PMLCA1, pmlca); | ||
96 | mtpmr(PMRN_PMLCB1, pmlcb); | ||
97 | break; | ||
98 | case 2: | ||
99 | mtpmr(PMRN_PMLCA2, pmlca); | ||
100 | mtpmr(PMRN_PMLCB2, pmlcb); | ||
101 | break; | ||
102 | case 3: | ||
103 | mtpmr(PMRN_PMLCA3, pmlca); | ||
104 | mtpmr(PMRN_PMLCB3, pmlcb); | ||
105 | break; | ||
106 | default: | ||
107 | panic("Bad ctr number!\n"); | ||
108 | } | ||
109 | } | ||
110 | |||
111 | void set_pmc_event(int ctr, int event) | ||
112 | { | ||
113 | u32 pmlca; | ||
114 | |||
115 | pmlca = get_pmlca(ctr); | ||
116 | |||
117 | pmlca = (pmlca & ~PMLCA_EVENT_MASK) | | ||
118 | ((event << PMLCA_EVENT_SHIFT) & | ||
119 | PMLCA_EVENT_MASK); | ||
120 | |||
121 | set_pmlca(ctr, pmlca); | ||
122 | } | ||
123 | |||
124 | void set_pmc_user_kernel(int ctr, int user, int kernel) | ||
125 | { | ||
126 | u32 pmlca; | ||
127 | |||
128 | pmlca = get_pmlca(ctr); | ||
129 | |||
130 | if(user) | ||
131 | pmlca &= ~PMLCA_FCU; | ||
132 | else | ||
133 | pmlca |= PMLCA_FCU; | ||
134 | |||
135 | if(kernel) | ||
136 | pmlca &= ~PMLCA_FCS; | ||
137 | else | ||
138 | pmlca |= PMLCA_FCS; | ||
139 | |||
140 | set_pmlca(ctr, pmlca); | ||
141 | } | ||
142 | |||
143 | void set_pmc_marked(int ctr, int mark0, int mark1) | ||
144 | { | ||
145 | u32 pmlca = get_pmlca(ctr); | ||
146 | |||
147 | if(mark0) | ||
148 | pmlca &= ~PMLCA_FCM0; | ||
149 | else | ||
150 | pmlca |= PMLCA_FCM0; | ||
151 | |||
152 | if(mark1) | ||
153 | pmlca &= ~PMLCA_FCM1; | ||
154 | else | ||
155 | pmlca |= PMLCA_FCM1; | ||
156 | |||
157 | set_pmlca(ctr, pmlca); | ||
158 | } | ||
159 | |||
160 | void pmc_start_ctr(int ctr, int enable) | ||
161 | { | ||
162 | u32 pmlca = get_pmlca(ctr); | ||
163 | |||
164 | pmlca &= ~PMLCA_FC; | ||
165 | |||
166 | if (enable) | ||
167 | pmlca |= PMLCA_CE; | ||
168 | else | ||
169 | pmlca &= ~PMLCA_CE; | ||
170 | |||
171 | set_pmlca(ctr, pmlca); | ||
172 | } | ||
173 | |||
174 | void pmc_start_ctrs(int enable) | ||
175 | { | ||
176 | u32 pmgc0 = mfpmr(PMRN_PMGC0); | ||
177 | |||
178 | pmgc0 &= ~PMGC0_FAC; | ||
179 | pmgc0 |= PMGC0_FCECE; | ||
180 | |||
181 | if (enable) | ||
182 | pmgc0 |= PMGC0_PMIE; | ||
183 | else | ||
184 | pmgc0 &= ~PMGC0_PMIE; | ||
185 | |||
186 | mtpmr(PMRN_PMGC0, pmgc0); | ||
187 | } | ||
188 | |||
189 | void pmc_stop_ctrs(void) | ||
190 | { | ||
191 | u32 pmgc0 = mfpmr(PMRN_PMGC0); | ||
192 | |||
193 | pmgc0 |= PMGC0_FAC; | ||
194 | |||
195 | pmgc0 &= ~(PMGC0_PMIE | PMGC0_FCECE); | ||
196 | |||
197 | mtpmr(PMRN_PMGC0, pmgc0); | ||
198 | } | ||
199 | |||
200 | void dump_pmcs(void) | ||
201 | { | ||
202 | printk("pmgc0: %x\n", mfpmr(PMRN_PMGC0)); | ||
203 | printk("pmc\t\tpmlca\t\tpmlcb\n"); | ||
204 | printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC0), | ||
205 | mfpmr(PMRN_PMLCA0), mfpmr(PMRN_PMLCB0)); | ||
206 | printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC1), | ||
207 | mfpmr(PMRN_PMLCA1), mfpmr(PMRN_PMLCB1)); | ||
208 | printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC2), | ||
209 | mfpmr(PMRN_PMLCA2), mfpmr(PMRN_PMLCB2)); | ||
210 | printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC3), | ||
211 | mfpmr(PMRN_PMLCA3), mfpmr(PMRN_PMLCB3)); | ||
212 | } | ||
213 | |||
214 | EXPORT_SYMBOL(init_pmc_stop); | ||
215 | EXPORT_SYMBOL(set_pmc_event); | ||
216 | EXPORT_SYMBOL(set_pmc_user_kernel); | ||
217 | EXPORT_SYMBOL(set_pmc_marked); | ||
218 | EXPORT_SYMBOL(pmc_start_ctr); | ||
219 | EXPORT_SYMBOL(pmc_start_ctrs); | ||
220 | EXPORT_SYMBOL(pmc_stop_ctrs); | ||
221 | EXPORT_SYMBOL(dump_pmcs); | ||
diff --git a/arch/powerpc/kernel/pmc.c b/arch/powerpc/kernel/pmc.c index a0a2efadeabf..3d8f6f44641e 100644 --- a/arch/powerpc/kernel/pmc.c +++ b/arch/powerpc/kernel/pmc.c | |||
@@ -71,7 +71,7 @@ int reserve_pmc_hardware(perf_irq_t new_perf_irq) | |||
71 | } | 71 | } |
72 | 72 | ||
73 | pmc_owner_caller = __builtin_return_address(0); | 73 | pmc_owner_caller = __builtin_return_address(0); |
74 | perf_irq = new_perf_irq ? : dummy_perf; | 74 | perf_irq = new_perf_irq ? new_perf_irq : dummy_perf; |
75 | 75 | ||
76 | out: | 76 | out: |
77 | spin_unlock(&pmc_owner_lock); | 77 | spin_unlock(&pmc_owner_lock); |
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 865b9648d0d5..bdb412d4b748 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -1014,7 +1014,7 @@ EXPORT_SYMBOL(find_all_nodes); | |||
1014 | /** Checks if the given "compat" string matches one of the strings in | 1014 | /** Checks if the given "compat" string matches one of the strings in |
1015 | * the device's "compatible" property | 1015 | * the device's "compatible" property |
1016 | */ | 1016 | */ |
1017 | int device_is_compatible(struct device_node *device, const char *compat) | 1017 | int device_is_compatible(const struct device_node *device, const char *compat) |
1018 | { | 1018 | { |
1019 | const char* cp; | 1019 | const char* cp; |
1020 | int cplen, l; | 1020 | int cplen, l; |
@@ -1491,7 +1491,8 @@ static int __init prom_reconfig_setup(void) | |||
1491 | __initcall(prom_reconfig_setup); | 1491 | __initcall(prom_reconfig_setup); |
1492 | #endif | 1492 | #endif |
1493 | 1493 | ||
1494 | struct property *of_find_property(struct device_node *np, const char *name, | 1494 | struct property *of_find_property(const struct device_node *np, |
1495 | const char *name, | ||
1495 | int *lenp) | 1496 | int *lenp) |
1496 | { | 1497 | { |
1497 | struct property *pp; | 1498 | struct property *pp; |
@@ -1512,7 +1513,8 @@ struct property *of_find_property(struct device_node *np, const char *name, | |||
1512 | * Find a property with a given name for a given node | 1513 | * Find a property with a given name for a given node |
1513 | * and return the value. | 1514 | * and return the value. |
1514 | */ | 1515 | */ |
1515 | const void *get_property(struct device_node *np, const char *name, int *lenp) | 1516 | const void *get_property(const struct device_node *np, const char *name, |
1517 | int *lenp) | ||
1516 | { | 1518 | { |
1517 | struct property *pp = of_find_property(np,name,lenp); | 1519 | struct property *pp = of_find_property(np,name,lenp); |
1518 | return pp ? pp->value : NULL; | 1520 | return pp ? pp->value : NULL; |
diff --git a/arch/powerpc/kernel/rtas_flash.c b/arch/powerpc/kernel/rtas_flash.c index 1442b63a75da..6f6fc977cb39 100644 --- a/arch/powerpc/kernel/rtas_flash.c +++ b/arch/powerpc/kernel/rtas_flash.c | |||
@@ -72,6 +72,10 @@ | |||
72 | #define VALIDATE_BUF_SIZE 4096 | 72 | #define VALIDATE_BUF_SIZE 4096 |
73 | #define RTAS_MSG_MAXLEN 64 | 73 | #define RTAS_MSG_MAXLEN 64 |
74 | 74 | ||
75 | /* Quirk - RTAS requires 4k list length and block size */ | ||
76 | #define RTAS_BLKLIST_LENGTH 4096 | ||
77 | #define RTAS_BLK_SIZE 4096 | ||
78 | |||
75 | struct flash_block { | 79 | struct flash_block { |
76 | char *data; | 80 | char *data; |
77 | unsigned long length; | 81 | unsigned long length; |
@@ -83,7 +87,7 @@ struct flash_block { | |||
83 | * into a version/length and translate the pointers | 87 | * into a version/length and translate the pointers |
84 | * to absolute. | 88 | * to absolute. |
85 | */ | 89 | */ |
86 | #define FLASH_BLOCKS_PER_NODE ((PAGE_SIZE - 16) / sizeof(struct flash_block)) | 90 | #define FLASH_BLOCKS_PER_NODE ((RTAS_BLKLIST_LENGTH - 16) / sizeof(struct flash_block)) |
87 | struct flash_block_list { | 91 | struct flash_block_list { |
88 | unsigned long num_blocks; | 92 | unsigned long num_blocks; |
89 | struct flash_block_list *next; | 93 | struct flash_block_list *next; |
@@ -96,6 +100,9 @@ struct flash_block_list_header { /* just the header of flash_block_list */ | |||
96 | 100 | ||
97 | static struct flash_block_list_header rtas_firmware_flash_list = {0, NULL}; | 101 | static struct flash_block_list_header rtas_firmware_flash_list = {0, NULL}; |
98 | 102 | ||
103 | /* Use slab cache to guarantee 4k alignment */ | ||
104 | static kmem_cache_t *flash_block_cache = NULL; | ||
105 | |||
99 | #define FLASH_BLOCK_LIST_VERSION (1UL) | 106 | #define FLASH_BLOCK_LIST_VERSION (1UL) |
100 | 107 | ||
101 | /* Local copy of the flash block list. | 108 | /* Local copy of the flash block list. |
@@ -153,7 +160,7 @@ static int flash_list_valid(struct flash_block_list *flist) | |||
153 | return FLASH_IMG_NULL_DATA; | 160 | return FLASH_IMG_NULL_DATA; |
154 | } | 161 | } |
155 | block_size = f->blocks[i].length; | 162 | block_size = f->blocks[i].length; |
156 | if (block_size <= 0 || block_size > PAGE_SIZE) { | 163 | if (block_size <= 0 || block_size > RTAS_BLK_SIZE) { |
157 | return FLASH_IMG_BAD_LEN; | 164 | return FLASH_IMG_BAD_LEN; |
158 | } | 165 | } |
159 | image_size += block_size; | 166 | image_size += block_size; |
@@ -177,9 +184,9 @@ static void free_flash_list(struct flash_block_list *f) | |||
177 | 184 | ||
178 | while (f) { | 185 | while (f) { |
179 | for (i = 0; i < f->num_blocks; i++) | 186 | for (i = 0; i < f->num_blocks; i++) |
180 | free_page((unsigned long)(f->blocks[i].data)); | 187 | kmem_cache_free(flash_block_cache, f->blocks[i].data); |
181 | next = f->next; | 188 | next = f->next; |
182 | free_page((unsigned long)f); | 189 | kmem_cache_free(flash_block_cache, f); |
183 | f = next; | 190 | f = next; |
184 | } | 191 | } |
185 | } | 192 | } |
@@ -278,6 +285,12 @@ static ssize_t rtas_flash_read(struct file *file, char __user *buf, | |||
278 | return msglen; | 285 | return msglen; |
279 | } | 286 | } |
280 | 287 | ||
288 | /* constructor for flash_block_cache */ | ||
289 | void rtas_block_ctor(void *ptr, kmem_cache_t *cache, unsigned long flags) | ||
290 | { | ||
291 | memset(ptr, 0, RTAS_BLK_SIZE); | ||
292 | } | ||
293 | |||
281 | /* We could be much more efficient here. But to keep this function | 294 | /* We could be much more efficient here. But to keep this function |
282 | * simple we allocate a page to the block list no matter how small the | 295 | * simple we allocate a page to the block list no matter how small the |
283 | * count is. If the system is low on memory it will be just as well | 296 | * count is. If the system is low on memory it will be just as well |
@@ -302,7 +315,7 @@ static ssize_t rtas_flash_write(struct file *file, const char __user *buffer, | |||
302 | * proc file | 315 | * proc file |
303 | */ | 316 | */ |
304 | if (uf->flist == NULL) { | 317 | if (uf->flist == NULL) { |
305 | uf->flist = (struct flash_block_list *) get_zeroed_page(GFP_KERNEL); | 318 | uf->flist = kmem_cache_alloc(flash_block_cache, GFP_KERNEL); |
306 | if (!uf->flist) | 319 | if (!uf->flist) |
307 | return -ENOMEM; | 320 | return -ENOMEM; |
308 | } | 321 | } |
@@ -313,21 +326,21 @@ static ssize_t rtas_flash_write(struct file *file, const char __user *buffer, | |||
313 | next_free = fl->num_blocks; | 326 | next_free = fl->num_blocks; |
314 | if (next_free == FLASH_BLOCKS_PER_NODE) { | 327 | if (next_free == FLASH_BLOCKS_PER_NODE) { |
315 | /* Need to allocate another block_list */ | 328 | /* Need to allocate another block_list */ |
316 | fl->next = (struct flash_block_list *)get_zeroed_page(GFP_KERNEL); | 329 | fl->next = kmem_cache_alloc(flash_block_cache, GFP_KERNEL); |
317 | if (!fl->next) | 330 | if (!fl->next) |
318 | return -ENOMEM; | 331 | return -ENOMEM; |
319 | fl = fl->next; | 332 | fl = fl->next; |
320 | next_free = 0; | 333 | next_free = 0; |
321 | } | 334 | } |
322 | 335 | ||
323 | if (count > PAGE_SIZE) | 336 | if (count > RTAS_BLK_SIZE) |
324 | count = PAGE_SIZE; | 337 | count = RTAS_BLK_SIZE; |
325 | p = (char *)get_zeroed_page(GFP_KERNEL); | 338 | p = kmem_cache_alloc(flash_block_cache, GFP_KERNEL); |
326 | if (!p) | 339 | if (!p) |
327 | return -ENOMEM; | 340 | return -ENOMEM; |
328 | 341 | ||
329 | if(copy_from_user(p, buffer, count)) { | 342 | if(copy_from_user(p, buffer, count)) { |
330 | free_page((unsigned long)p); | 343 | kmem_cache_free(flash_block_cache, p); |
331 | return -EFAULT; | 344 | return -EFAULT; |
332 | } | 345 | } |
333 | fl->blocks[next_free].data = p; | 346 | fl->blocks[next_free].data = p; |
@@ -791,6 +804,16 @@ int __init rtas_flash_init(void) | |||
791 | goto cleanup; | 804 | goto cleanup; |
792 | 805 | ||
793 | rtas_flash_term_hook = rtas_flash_firmware; | 806 | rtas_flash_term_hook = rtas_flash_firmware; |
807 | |||
808 | flash_block_cache = kmem_cache_create("rtas_flash_cache", | ||
809 | RTAS_BLK_SIZE, RTAS_BLK_SIZE, 0, | ||
810 | rtas_block_ctor, NULL); | ||
811 | if (!flash_block_cache) { | ||
812 | printk(KERN_ERR "%s: failed to create block cache\n", | ||
813 | __FUNCTION__); | ||
814 | rc = -ENOMEM; | ||
815 | goto cleanup; | ||
816 | } | ||
794 | return 0; | 817 | return 0; |
795 | 818 | ||
796 | cleanup: | 819 | cleanup: |
@@ -805,6 +828,10 @@ cleanup: | |||
805 | void __exit rtas_flash_cleanup(void) | 828 | void __exit rtas_flash_cleanup(void) |
806 | { | 829 | { |
807 | rtas_flash_term_hook = NULL; | 830 | rtas_flash_term_hook = NULL; |
831 | |||
832 | if (flash_block_cache) | ||
833 | kmem_cache_destroy(flash_block_cache); | ||
834 | |||
808 | remove_flash_pde(firmware_flash_pde); | 835 | remove_flash_pde(firmware_flash_pde); |
809 | remove_flash_pde(firmware_update_pde); | 836 | remove_flash_pde(firmware_update_pde); |
810 | remove_flash_pde(validate_pde); | 837 | remove_flash_pde(validate_pde); |
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c index 191d0ab09222..a4c2964a3ca6 100644 --- a/arch/powerpc/kernel/setup_32.c +++ b/arch/powerpc/kernel/setup_32.c | |||
@@ -91,6 +91,7 @@ int ucache_bsize; | |||
91 | unsigned long __init early_init(unsigned long dt_ptr) | 91 | unsigned long __init early_init(unsigned long dt_ptr) |
92 | { | 92 | { |
93 | unsigned long offset = reloc_offset(); | 93 | unsigned long offset = reloc_offset(); |
94 | struct cpu_spec *spec; | ||
94 | 95 | ||
95 | /* First zero the BSS -- use memset_io, some platforms don't have | 96 | /* First zero the BSS -- use memset_io, some platforms don't have |
96 | * caches on yet */ | 97 | * caches on yet */ |
@@ -100,8 +101,11 @@ unsigned long __init early_init(unsigned long dt_ptr) | |||
100 | * Identify the CPU type and fix up code sections | 101 | * Identify the CPU type and fix up code sections |
101 | * that depend on which cpu we have. | 102 | * that depend on which cpu we have. |
102 | */ | 103 | */ |
103 | identify_cpu(offset, 0); | 104 | spec = identify_cpu(offset); |
104 | do_cpu_ftr_fixups(offset); | 105 | |
106 | do_feature_fixups(spec->cpu_features, | ||
107 | PTRRELOC(&__start___ftr_fixup), | ||
108 | PTRRELOC(&__stop___ftr_fixup)); | ||
105 | 109 | ||
106 | return KERNELBASE + offset; | 110 | return KERNELBASE + offset; |
107 | } | 111 | } |
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 4b2e32eab9dc..16278968dab6 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -170,6 +170,9 @@ void __init setup_paca(int cpu) | |||
170 | 170 | ||
171 | void __init early_setup(unsigned long dt_ptr) | 171 | void __init early_setup(unsigned long dt_ptr) |
172 | { | 172 | { |
173 | /* Identify CPU type */ | ||
174 | identify_cpu(0); | ||
175 | |||
173 | /* Assume we're on cpu 0 for now. Don't write to the paca yet! */ | 176 | /* Assume we're on cpu 0 for now. Don't write to the paca yet! */ |
174 | setup_paca(0); | 177 | setup_paca(0); |
175 | 178 | ||
@@ -348,6 +351,14 @@ void __init setup_system(void) | |||
348 | { | 351 | { |
349 | DBG(" -> setup_system()\n"); | 352 | DBG(" -> setup_system()\n"); |
350 | 353 | ||
354 | /* Apply the CPUs-specific and firmware specific fixups to kernel | ||
355 | * text (nop out sections not relevant to this CPU or this firmware) | ||
356 | */ | ||
357 | do_feature_fixups(cur_cpu_spec->cpu_features, | ||
358 | &__start___ftr_fixup, &__stop___ftr_fixup); | ||
359 | do_feature_fixups(powerpc_firmware_features, | ||
360 | &__start___fw_ftr_fixup, &__stop___fw_ftr_fixup); | ||
361 | |||
351 | /* | 362 | /* |
352 | * Unflatten the device-tree passed by prom_init or kexec | 363 | * Unflatten the device-tree passed by prom_init or kexec |
353 | */ | 364 | */ |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 5b59bc18dfe7..46a24de36fec 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
@@ -220,11 +220,8 @@ static void account_process_time(struct pt_regs *regs) | |||
220 | */ | 220 | */ |
221 | struct cpu_purr_data { | 221 | struct cpu_purr_data { |
222 | int initialized; /* thread is running */ | 222 | int initialized; /* thread is running */ |
223 | u64 tb0; /* timebase at origin time */ | ||
224 | u64 purr0; /* PURR at origin time */ | ||
225 | u64 tb; /* last TB value read */ | 223 | u64 tb; /* last TB value read */ |
226 | u64 purr; /* last PURR value read */ | 224 | u64 purr; /* last PURR value read */ |
227 | u64 stolen; /* stolen time so far */ | ||
228 | spinlock_t lock; | 225 | spinlock_t lock; |
229 | }; | 226 | }; |
230 | 227 | ||
@@ -234,10 +231,8 @@ static void snapshot_tb_and_purr(void *data) | |||
234 | { | 231 | { |
235 | struct cpu_purr_data *p = &__get_cpu_var(cpu_purr_data); | 232 | struct cpu_purr_data *p = &__get_cpu_var(cpu_purr_data); |
236 | 233 | ||
237 | p->tb0 = mftb(); | 234 | p->tb = mftb(); |
238 | p->purr0 = mfspr(SPRN_PURR); | 235 | p->purr = mfspr(SPRN_PURR); |
239 | p->tb = p->tb0; | ||
240 | p->purr = 0; | ||
241 | wmb(); | 236 | wmb(); |
242 | p->initialized = 1; | 237 | p->initialized = 1; |
243 | } | 238 | } |
@@ -258,37 +253,24 @@ void snapshot_timebases(void) | |||
258 | 253 | ||
259 | void calculate_steal_time(void) | 254 | void calculate_steal_time(void) |
260 | { | 255 | { |
261 | u64 tb, purr, t0; | 256 | u64 tb, purr; |
262 | s64 stolen; | 257 | s64 stolen; |
263 | struct cpu_purr_data *p0, *pme, *phim; | 258 | struct cpu_purr_data *pme; |
264 | int cpu; | ||
265 | 259 | ||
266 | if (!cpu_has_feature(CPU_FTR_PURR)) | 260 | if (!cpu_has_feature(CPU_FTR_PURR)) |
267 | return; | 261 | return; |
268 | cpu = smp_processor_id(); | 262 | pme = &per_cpu(cpu_purr_data, smp_processor_id()); |
269 | pme = &per_cpu(cpu_purr_data, cpu); | ||
270 | if (!pme->initialized) | 263 | if (!pme->initialized) |
271 | return; /* this can happen in early boot */ | 264 | return; /* this can happen in early boot */ |
272 | p0 = &per_cpu(cpu_purr_data, cpu & ~1); | 265 | spin_lock(&pme->lock); |
273 | phim = &per_cpu(cpu_purr_data, cpu ^ 1); | ||
274 | spin_lock(&p0->lock); | ||
275 | tb = mftb(); | 266 | tb = mftb(); |
276 | purr = mfspr(SPRN_PURR) - pme->purr0; | 267 | purr = mfspr(SPRN_PURR); |
277 | if (!phim->initialized || !cpu_online(cpu ^ 1)) { | 268 | stolen = (tb - pme->tb) - (purr - pme->purr); |
278 | stolen = (tb - pme->tb) - (purr - pme->purr); | 269 | if (stolen > 0) |
279 | } else { | ||
280 | t0 = pme->tb0; | ||
281 | if (phim->tb0 < t0) | ||
282 | t0 = phim->tb0; | ||
283 | stolen = phim->tb - t0 - phim->purr - purr - p0->stolen; | ||
284 | } | ||
285 | if (stolen > 0) { | ||
286 | account_steal_time(current, stolen); | 270 | account_steal_time(current, stolen); |
287 | p0->stolen += stolen; | ||
288 | } | ||
289 | pme->tb = tb; | 271 | pme->tb = tb; |
290 | pme->purr = purr; | 272 | pme->purr = purr; |
291 | spin_unlock(&p0->lock); | 273 | spin_unlock(&pme->lock); |
292 | } | 274 | } |
293 | 275 | ||
294 | /* | 276 | /* |
@@ -297,30 +279,17 @@ void calculate_steal_time(void) | |||
297 | */ | 279 | */ |
298 | static void snapshot_purr(void) | 280 | static void snapshot_purr(void) |
299 | { | 281 | { |
300 | int cpu; | 282 | struct cpu_purr_data *pme; |
301 | u64 purr; | ||
302 | struct cpu_purr_data *p0, *pme, *phim; | ||
303 | unsigned long flags; | 283 | unsigned long flags; |
304 | 284 | ||
305 | if (!cpu_has_feature(CPU_FTR_PURR)) | 285 | if (!cpu_has_feature(CPU_FTR_PURR)) |
306 | return; | 286 | return; |
307 | cpu = smp_processor_id(); | 287 | pme = &per_cpu(cpu_purr_data, smp_processor_id()); |
308 | pme = &per_cpu(cpu_purr_data, cpu); | 288 | spin_lock_irqsave(&pme->lock, flags); |
309 | p0 = &per_cpu(cpu_purr_data, cpu & ~1); | 289 | pme->tb = mftb(); |
310 | phim = &per_cpu(cpu_purr_data, cpu ^ 1); | 290 | pme->purr = mfspr(SPRN_PURR); |
311 | spin_lock_irqsave(&p0->lock, flags); | ||
312 | pme->tb = pme->tb0 = mftb(); | ||
313 | purr = mfspr(SPRN_PURR); | ||
314 | if (!phim->initialized) { | ||
315 | pme->purr = 0; | ||
316 | pme->purr0 = purr; | ||
317 | } else { | ||
318 | /* set p->purr and p->purr0 for no change in p0->stolen */ | ||
319 | pme->purr = phim->tb - phim->tb0 - phim->purr - p0->stolen; | ||
320 | pme->purr0 = purr - pme->purr; | ||
321 | } | ||
322 | pme->initialized = 1; | 291 | pme->initialized = 1; |
323 | spin_unlock_irqrestore(&p0->lock, flags); | 292 | spin_unlock_irqrestore(&pme->lock, flags); |
324 | } | 293 | } |
325 | 294 | ||
326 | #endif /* CONFIG_PPC_SPLPAR */ | 295 | #endif /* CONFIG_PPC_SPLPAR */ |
@@ -1045,48 +1014,6 @@ void __init time_init(void) | |||
1045 | set_dec(tb_ticks_per_jiffy); | 1014 | set_dec(tb_ticks_per_jiffy); |
1046 | } | 1015 | } |
1047 | 1016 | ||
1048 | #ifdef CONFIG_RTC_CLASS | ||
1049 | static int set_rtc_class_time(struct rtc_time *tm) | ||
1050 | { | ||
1051 | int err; | ||
1052 | struct class_device *class_dev = | ||
1053 | rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE); | ||
1054 | |||
1055 | if (class_dev == NULL) | ||
1056 | return -ENODEV; | ||
1057 | |||
1058 | err = rtc_set_time(class_dev, tm); | ||
1059 | |||
1060 | rtc_class_close(class_dev); | ||
1061 | |||
1062 | return 0; | ||
1063 | } | ||
1064 | |||
1065 | static void get_rtc_class_time(struct rtc_time *tm) | ||
1066 | { | ||
1067 | int err; | ||
1068 | struct class_device *class_dev = | ||
1069 | rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE); | ||
1070 | |||
1071 | if (class_dev == NULL) | ||
1072 | return; | ||
1073 | |||
1074 | err = rtc_read_time(class_dev, tm); | ||
1075 | |||
1076 | rtc_class_close(class_dev); | ||
1077 | |||
1078 | return; | ||
1079 | } | ||
1080 | |||
1081 | int __init rtc_class_hookup(void) | ||
1082 | { | ||
1083 | ppc_md.get_rtc_time = get_rtc_class_time; | ||
1084 | ppc_md.set_rtc_time = set_rtc_class_time; | ||
1085 | |||
1086 | return 0; | ||
1087 | } | ||
1088 | #endif /* CONFIG_RTC_CLASS */ | ||
1089 | |||
1090 | 1017 | ||
1091 | #define FEBRUARY 2 | 1018 | #define FEBRUARY 2 |
1092 | #define STARTOFTIME 1970 | 1019 | #define STARTOFTIME 1970 |
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 5ed4c2ceb5ca..c66b4771ef44 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
@@ -843,7 +843,7 @@ void __kprobes program_check_exception(struct pt_regs *regs) | |||
843 | 843 | ||
844 | void alignment_exception(struct pt_regs *regs) | 844 | void alignment_exception(struct pt_regs *regs) |
845 | { | 845 | { |
846 | int fixed = 0; | 846 | int sig, code, fixed = 0; |
847 | 847 | ||
848 | /* we don't implement logging of alignment exceptions */ | 848 | /* we don't implement logging of alignment exceptions */ |
849 | if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS)) | 849 | if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS)) |
@@ -857,14 +857,16 @@ void alignment_exception(struct pt_regs *regs) | |||
857 | 857 | ||
858 | /* Operand address was bad */ | 858 | /* Operand address was bad */ |
859 | if (fixed == -EFAULT) { | 859 | if (fixed == -EFAULT) { |
860 | if (user_mode(regs)) | 860 | sig = SIGSEGV; |
861 | _exception(SIGSEGV, regs, SEGV_ACCERR, regs->dar); | 861 | code = SEGV_ACCERR; |
862 | else | 862 | } else { |
863 | /* Search exception table */ | 863 | sig = SIGBUS; |
864 | bad_page_fault(regs, regs->dar, SIGSEGV); | 864 | code = BUS_ADRALN; |
865 | return; | ||
866 | } | 865 | } |
867 | _exception(SIGBUS, regs, BUS_ADRALN, regs->dar); | 866 | if (user_mode(regs)) |
867 | _exception(sig, regs, code, regs->dar); | ||
868 | else | ||
869 | bad_page_fault(regs, regs->dar, sig); | ||
868 | } | 870 | } |
869 | 871 | ||
870 | void StackOverflow(struct pt_regs *regs) | 872 | void StackOverflow(struct pt_regs *regs) |
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c index 1a7e19cdab39..c913ad5cad29 100644 --- a/arch/powerpc/kernel/vdso.c +++ b/arch/powerpc/kernel/vdso.c | |||
@@ -36,6 +36,8 @@ | |||
36 | #include <asm/vdso.h> | 36 | #include <asm/vdso.h> |
37 | #include <asm/vdso_datapage.h> | 37 | #include <asm/vdso_datapage.h> |
38 | 38 | ||
39 | #include "setup.h" | ||
40 | |||
39 | #undef DEBUG | 41 | #undef DEBUG |
40 | 42 | ||
41 | #ifdef DEBUG | 43 | #ifdef DEBUG |
@@ -586,6 +588,43 @@ static __init int vdso_fixup_datapage(struct lib32_elfinfo *v32, | |||
586 | return 0; | 588 | return 0; |
587 | } | 589 | } |
588 | 590 | ||
591 | |||
592 | static __init int vdso_fixup_features(struct lib32_elfinfo *v32, | ||
593 | struct lib64_elfinfo *v64) | ||
594 | { | ||
595 | void *start32; | ||
596 | unsigned long size32; | ||
597 | |||
598 | #ifdef CONFIG_PPC64 | ||
599 | void *start64; | ||
600 | unsigned long size64; | ||
601 | |||
602 | start64 = find_section64(v64->hdr, "__ftr_fixup", &size64); | ||
603 | if (start64) | ||
604 | do_feature_fixups(cur_cpu_spec->cpu_features, | ||
605 | start64, start64 + size64); | ||
606 | |||
607 | start64 = find_section64(v64->hdr, "__fw_ftr_fixup", &size64); | ||
608 | if (start64) | ||
609 | do_feature_fixups(powerpc_firmware_features, | ||
610 | start64, start64 + size64); | ||
611 | #endif /* CONFIG_PPC64 */ | ||
612 | |||
613 | start32 = find_section32(v32->hdr, "__ftr_fixup", &size32); | ||
614 | if (start32) | ||
615 | do_feature_fixups(cur_cpu_spec->cpu_features, | ||
616 | start32, start32 + size32); | ||
617 | |||
618 | #ifdef CONFIG_PPC64 | ||
619 | start32 = find_section32(v32->hdr, "__fw_ftr_fixup", &size32); | ||
620 | if (start32) | ||
621 | do_feature_fixups(powerpc_firmware_features, | ||
622 | start32, start32 + size32); | ||
623 | #endif /* CONFIG_PPC64 */ | ||
624 | |||
625 | return 0; | ||
626 | } | ||
627 | |||
589 | static __init int vdso_fixup_alt_funcs(struct lib32_elfinfo *v32, | 628 | static __init int vdso_fixup_alt_funcs(struct lib32_elfinfo *v32, |
590 | struct lib64_elfinfo *v64) | 629 | struct lib64_elfinfo *v64) |
591 | { | 630 | { |
@@ -634,6 +673,9 @@ static __init int vdso_setup(void) | |||
634 | if (vdso_fixup_datapage(&v32, &v64)) | 673 | if (vdso_fixup_datapage(&v32, &v64)) |
635 | return -1; | 674 | return -1; |
636 | 675 | ||
676 | if (vdso_fixup_features(&v32, &v64)) | ||
677 | return -1; | ||
678 | |||
637 | if (vdso_fixup_alt_funcs(&v32, &v64)) | 679 | if (vdso_fixup_alt_funcs(&v32, &v64)) |
638 | return -1; | 680 | return -1; |
639 | 681 | ||
@@ -714,6 +756,7 @@ void __init vdso_init(void) | |||
714 | * Setup the syscall map in the vDOS | 756 | * Setup the syscall map in the vDOS |
715 | */ | 757 | */ |
716 | vdso_setup_syscall_map(); | 758 | vdso_setup_syscall_map(); |
759 | |||
717 | /* | 760 | /* |
718 | * Initialize the vDSO images in memory, that is do necessary | 761 | * Initialize the vDSO images in memory, that is do necessary |
719 | * fixups of vDSO symbols, locate trampolines, etc... | 762 | * fixups of vDSO symbols, locate trampolines, etc... |
diff --git a/arch/powerpc/kernel/vdso32/vdso32.lds.S b/arch/powerpc/kernel/vdso32/vdso32.lds.S index 6187af2d54c3..26e138c4ce17 100644 --- a/arch/powerpc/kernel/vdso32/vdso32.lds.S +++ b/arch/powerpc/kernel/vdso32/vdso32.lds.S | |||
@@ -32,6 +32,18 @@ SECTIONS | |||
32 | PROVIDE (_etext = .); | 32 | PROVIDE (_etext = .); |
33 | PROVIDE (etext = .); | 33 | PROVIDE (etext = .); |
34 | 34 | ||
35 | . = ALIGN(8); | ||
36 | __ftr_fixup : { | ||
37 | *(__ftr_fixup) | ||
38 | } | ||
39 | |||
40 | #ifdef CONFIG_PPC64 | ||
41 | . = ALIGN(8); | ||
42 | __fw_ftr_fixup : { | ||
43 | *(__fw_ftr_fixup) | ||
44 | } | ||
45 | #endif | ||
46 | |||
35 | /* Other stuff is appended to the text segment: */ | 47 | /* Other stuff is appended to the text segment: */ |
36 | .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } | 48 | .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } |
37 | .rodata1 : { *(.rodata1) } | 49 | .rodata1 : { *(.rodata1) } |
diff --git a/arch/powerpc/kernel/vdso64/gettimeofday.S b/arch/powerpc/kernel/vdso64/gettimeofday.S index 56e76ff5498f..40ffd9b6cef7 100644 --- a/arch/powerpc/kernel/vdso64/gettimeofday.S +++ b/arch/powerpc/kernel/vdso64/gettimeofday.S | |||
@@ -229,8 +229,10 @@ V_FUNCTION_BEGIN(__do_get_xsec) | |||
229 | xor r0,r8,r8 /* create dependency */ | 229 | xor r0,r8,r8 /* create dependency */ |
230 | add r3,r3,r0 | 230 | add r3,r3,r0 |
231 | 231 | ||
232 | /* Get TB & offset it */ | 232 | /* Get TB & offset it. We use the MFTB macro which will generate |
233 | mftb r7 | 233 | * workaround code for Cell. |
234 | */ | ||
235 | MFTB(r7) | ||
234 | ld r9,CFG_TB_ORIG_STAMP(r3) | 236 | ld r9,CFG_TB_ORIG_STAMP(r3) |
235 | subf r7,r9,r7 | 237 | subf r7,r9,r7 |
236 | 238 | ||
diff --git a/arch/powerpc/kernel/vdso64/vdso64.lds.S b/arch/powerpc/kernel/vdso64/vdso64.lds.S index 4a2b6dc0960c..2d70f35d50b5 100644 --- a/arch/powerpc/kernel/vdso64/vdso64.lds.S +++ b/arch/powerpc/kernel/vdso64/vdso64.lds.S | |||
@@ -31,6 +31,16 @@ SECTIONS | |||
31 | PROVIDE (_etext = .); | 31 | PROVIDE (_etext = .); |
32 | PROVIDE (etext = .); | 32 | PROVIDE (etext = .); |
33 | 33 | ||
34 | . = ALIGN(8); | ||
35 | __ftr_fixup : { | ||
36 | *(__ftr_fixup) | ||
37 | } | ||
38 | |||
39 | . = ALIGN(8); | ||
40 | __fw_ftr_fixup : { | ||
41 | *(__fw_ftr_fixup) | ||
42 | } | ||
43 | |||
34 | /* Other stuff is appended to the text segment: */ | 44 | /* Other stuff is appended to the text segment: */ |
35 | .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } | 45 | .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } |
36 | .rodata1 : { *(.rodata1) } | 46 | .rodata1 : { *(.rodata1) } |
diff --git a/arch/powerpc/kernel/vio.c b/arch/powerpc/kernel/vio.c index cb87e71eec66..ed007878d1bf 100644 --- a/arch/powerpc/kernel/vio.c +++ b/arch/powerpc/kernel/vio.c | |||
@@ -92,9 +92,9 @@ static struct iommu_table *vio_build_iommu_table(struct vio_dev *dev) | |||
92 | &tbl->it_index, &offset, &size); | 92 | &tbl->it_index, &offset, &size); |
93 | 93 | ||
94 | /* TCE table size - measured in tce entries */ | 94 | /* TCE table size - measured in tce entries */ |
95 | tbl->it_size = size >> PAGE_SHIFT; | 95 | tbl->it_size = size >> IOMMU_PAGE_SHIFT; |
96 | /* offset for VIO should always be 0 */ | 96 | /* offset for VIO should always be 0 */ |
97 | tbl->it_offset = offset >> PAGE_SHIFT; | 97 | tbl->it_offset = offset >> IOMMU_PAGE_SHIFT; |
98 | tbl->it_busno = 0; | 98 | tbl->it_busno = 0; |
99 | tbl->it_type = TCE_VB; | 99 | tbl->it_type = TCE_VB; |
100 | 100 | ||
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index cb0e8d46c3e8..e8342d867536 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S | |||
@@ -108,13 +108,7 @@ SECTIONS | |||
108 | 108 | ||
109 | .initcall.init : { | 109 | .initcall.init : { |
110 | __initcall_start = .; | 110 | __initcall_start = .; |
111 | *(.initcall1.init) | 111 | INITCALLS |
112 | *(.initcall2.init) | ||
113 | *(.initcall3.init) | ||
114 | *(.initcall4.init) | ||
115 | *(.initcall5.init) | ||
116 | *(.initcall6.init) | ||
117 | *(.initcall7.init) | ||
118 | __initcall_end = .; | 112 | __initcall_end = .; |
119 | } | 113 | } |
120 | 114 | ||
diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c index 9590ba780b98..7e8ded051b5b 100644 --- a/arch/powerpc/lib/sstep.c +++ b/arch/powerpc/lib/sstep.c | |||
@@ -9,6 +9,7 @@ | |||
9 | * 2 of the License, or (at your option) any later version. | 9 | * 2 of the License, or (at your option) any later version. |
10 | */ | 10 | */ |
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/kprobes.h> | ||
12 | #include <linux/ptrace.h> | 13 | #include <linux/ptrace.h> |
13 | #include <asm/sstep.h> | 14 | #include <asm/sstep.h> |
14 | #include <asm/processor.h> | 15 | #include <asm/processor.h> |
@@ -25,7 +26,7 @@ extern char system_call_common[]; | |||
25 | /* | 26 | /* |
26 | * Determine whether a conditional branch instruction would branch. | 27 | * Determine whether a conditional branch instruction would branch. |
27 | */ | 28 | */ |
28 | static int branch_taken(unsigned int instr, struct pt_regs *regs) | 29 | static int __kprobes branch_taken(unsigned int instr, struct pt_regs *regs) |
29 | { | 30 | { |
30 | unsigned int bo = (instr >> 21) & 0x1f; | 31 | unsigned int bo = (instr >> 21) & 0x1f; |
31 | unsigned int bi; | 32 | unsigned int bi; |
@@ -51,7 +52,7 @@ static int branch_taken(unsigned int instr, struct pt_regs *regs) | |||
51 | * or -1 if the instruction is one that should not be stepped, | 52 | * or -1 if the instruction is one that should not be stepped, |
52 | * such as an rfid, or a mtmsrd that would clear MSR_RI. | 53 | * such as an rfid, or a mtmsrd that would clear MSR_RI. |
53 | */ | 54 | */ |
54 | int emulate_step(struct pt_regs *regs, unsigned int instr) | 55 | int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) |
55 | { | 56 | { |
56 | unsigned int opcode, rd; | 57 | unsigned int opcode, rd; |
57 | unsigned long int imm; | 58 | unsigned long int imm; |
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c index 5615acc29527..506d89768d45 100644 --- a/arch/powerpc/mm/hugetlbpage.c +++ b/arch/powerpc/mm/hugetlbpage.c | |||
@@ -480,9 +480,6 @@ static int open_high_hpage_areas(struct mm_struct *mm, u16 newareas) | |||
480 | 480 | ||
481 | mm->context.high_htlb_areas |= newareas; | 481 | mm->context.high_htlb_areas |= newareas; |
482 | 482 | ||
483 | /* update the paca copy of the context struct */ | ||
484 | get_paca()->context = mm->context; | ||
485 | |||
486 | /* the context change must make it to memory before the flush, | 483 | /* the context change must make it to memory before the flush, |
487 | * so that further SLB misses do the right thing. */ | 484 | * so that further SLB misses do the right thing. */ |
488 | mb(); | 485 | mb(); |
@@ -494,11 +491,15 @@ static int open_high_hpage_areas(struct mm_struct *mm, u16 newareas) | |||
494 | return 0; | 491 | return 0; |
495 | } | 492 | } |
496 | 493 | ||
497 | int prepare_hugepage_range(unsigned long addr, unsigned long len) | 494 | int prepare_hugepage_range(unsigned long addr, unsigned long len, pgoff_t pgoff) |
498 | { | 495 | { |
499 | int err = 0; | 496 | int err = 0; |
500 | 497 | ||
501 | if ( (addr+len) < addr ) | 498 | if (pgoff & (~HPAGE_MASK >> PAGE_SHIFT)) |
499 | return -EINVAL; | ||
500 | if (len & ~HPAGE_MASK) | ||
501 | return -EINVAL; | ||
502 | if (addr & ~HPAGE_MASK) | ||
502 | return -EINVAL; | 503 | return -EINVAL; |
503 | 504 | ||
504 | if (addr < 0x100000000UL) | 505 | if (addr < 0x100000000UL) |
diff --git a/arch/powerpc/oprofile/Makefile b/arch/powerpc/oprofile/Makefile index 3145d610b5b0..0b5df9c96ae0 100644 --- a/arch/powerpc/oprofile/Makefile +++ b/arch/powerpc/oprofile/Makefile | |||
@@ -13,4 +13,4 @@ DRIVER_OBJS := $(addprefix ../../../drivers/oprofile/, \ | |||
13 | oprofile-y := $(DRIVER_OBJS) common.o backtrace.o | 13 | oprofile-y := $(DRIVER_OBJS) common.o backtrace.o |
14 | oprofile-$(CONFIG_PPC64) += op_model_rs64.o op_model_power4.o | 14 | oprofile-$(CONFIG_PPC64) += op_model_rs64.o op_model_power4.o |
15 | oprofile-$(CONFIG_FSL_BOOKE) += op_model_fsl_booke.o | 15 | oprofile-$(CONFIG_FSL_BOOKE) += op_model_fsl_booke.o |
16 | oprofile-$(CONFIG_PPC32) += op_model_7450.o | 16 | oprofile-$(CONFIG_6xx) += op_model_7450.o |
diff --git a/arch/powerpc/oprofile/common.c b/arch/powerpc/oprofile/common.c index fd0bbbe7a4de..63bbef3b63f1 100644 --- a/arch/powerpc/oprofile/common.c +++ b/arch/powerpc/oprofile/common.c | |||
@@ -34,6 +34,11 @@ static void op_handle_interrupt(struct pt_regs *regs) | |||
34 | model->handle_interrupt(regs, ctr); | 34 | model->handle_interrupt(regs, ctr); |
35 | } | 35 | } |
36 | 36 | ||
37 | static void op_powerpc_cpu_setup(void *dummy) | ||
38 | { | ||
39 | model->cpu_setup(ctr); | ||
40 | } | ||
41 | |||
37 | static int op_powerpc_setup(void) | 42 | static int op_powerpc_setup(void) |
38 | { | 43 | { |
39 | int err; | 44 | int err; |
@@ -47,7 +52,7 @@ static int op_powerpc_setup(void) | |||
47 | model->reg_setup(ctr, &sys, model->num_counters); | 52 | model->reg_setup(ctr, &sys, model->num_counters); |
48 | 53 | ||
49 | /* Configure the registers on all cpus. */ | 54 | /* Configure the registers on all cpus. */ |
50 | on_each_cpu(model->cpu_setup, NULL, 0, 1); | 55 | on_each_cpu(op_powerpc_cpu_setup, NULL, 0, 1); |
51 | 56 | ||
52 | return 0; | 57 | return 0; |
53 | } | 58 | } |
@@ -142,7 +147,8 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | |||
142 | case PPC_OPROFILE_POWER4: | 147 | case PPC_OPROFILE_POWER4: |
143 | model = &op_model_power4; | 148 | model = &op_model_power4; |
144 | break; | 149 | break; |
145 | #else | 150 | #endif |
151 | #ifdef CONFIG_6xx | ||
146 | case PPC_OPROFILE_G4: | 152 | case PPC_OPROFILE_G4: |
147 | model = &op_model_7450; | 153 | model = &op_model_7450; |
148 | break; | 154 | break; |
diff --git a/arch/powerpc/oprofile/op_model_7450.c b/arch/powerpc/oprofile/op_model_7450.c index d8ee3aea83f8..f481c0ed5e67 100644 --- a/arch/powerpc/oprofile/op_model_7450.c +++ b/arch/powerpc/oprofile/op_model_7450.c | |||
@@ -81,7 +81,7 @@ static void pmc_stop_ctrs(void) | |||
81 | 81 | ||
82 | /* Configures the counters on this CPU based on the global | 82 | /* Configures the counters on this CPU based on the global |
83 | * settings */ | 83 | * settings */ |
84 | static void fsl7450_cpu_setup(void *unused) | 84 | static void fsl7450_cpu_setup(struct op_counter_config *ctr) |
85 | { | 85 | { |
86 | /* freeze all counters */ | 86 | /* freeze all counters */ |
87 | pmc_stop_ctrs(); | 87 | pmc_stop_ctrs(); |
diff --git a/arch/powerpc/oprofile/op_model_fsl_booke.c b/arch/powerpc/oprofile/op_model_fsl_booke.c index e29dede31423..0b3c31f5209e 100644 --- a/arch/powerpc/oprofile/op_model_fsl_booke.c +++ b/arch/powerpc/oprofile/op_model_fsl_booke.c | |||
@@ -32,42 +32,152 @@ static unsigned long reset_value[OP_MAX_COUNTER]; | |||
32 | static int num_counters; | 32 | static int num_counters; |
33 | static int oprofile_running; | 33 | static int oprofile_running; |
34 | 34 | ||
35 | static inline unsigned int ctr_read(unsigned int i) | 35 | static void init_pmc_stop(int ctr) |
36 | { | 36 | { |
37 | switch(i) { | 37 | u32 pmlca = (PMLCA_FC | PMLCA_FCS | PMLCA_FCU | |
38 | case 0: | 38 | PMLCA_FCM1 | PMLCA_FCM0); |
39 | return mfpmr(PMRN_PMC0); | 39 | u32 pmlcb = 0; |
40 | case 1: | ||
41 | return mfpmr(PMRN_PMC1); | ||
42 | case 2: | ||
43 | return mfpmr(PMRN_PMC2); | ||
44 | case 3: | ||
45 | return mfpmr(PMRN_PMC3); | ||
46 | default: | ||
47 | return 0; | ||
48 | } | ||
49 | } | ||
50 | 40 | ||
51 | static inline void ctr_write(unsigned int i, unsigned int val) | 41 | switch (ctr) { |
52 | { | ||
53 | switch(i) { | ||
54 | case 0: | 42 | case 0: |
55 | mtpmr(PMRN_PMC0, val); | 43 | mtpmr(PMRN_PMLCA0, pmlca); |
44 | mtpmr(PMRN_PMLCB0, pmlcb); | ||
56 | break; | 45 | break; |
57 | case 1: | 46 | case 1: |
58 | mtpmr(PMRN_PMC1, val); | 47 | mtpmr(PMRN_PMLCA1, pmlca); |
48 | mtpmr(PMRN_PMLCB1, pmlcb); | ||
59 | break; | 49 | break; |
60 | case 2: | 50 | case 2: |
61 | mtpmr(PMRN_PMC2, val); | 51 | mtpmr(PMRN_PMLCA2, pmlca); |
52 | mtpmr(PMRN_PMLCB2, pmlcb); | ||
62 | break; | 53 | break; |
63 | case 3: | 54 | case 3: |
64 | mtpmr(PMRN_PMC3, val); | 55 | mtpmr(PMRN_PMLCA3, pmlca); |
56 | mtpmr(PMRN_PMLCB3, pmlcb); | ||
65 | break; | 57 | break; |
66 | default: | 58 | default: |
67 | break; | 59 | panic("Bad ctr number!\n"); |
68 | } | 60 | } |
69 | } | 61 | } |
70 | 62 | ||
63 | static void set_pmc_event(int ctr, int event) | ||
64 | { | ||
65 | u32 pmlca; | ||
66 | |||
67 | pmlca = get_pmlca(ctr); | ||
68 | |||
69 | pmlca = (pmlca & ~PMLCA_EVENT_MASK) | | ||
70 | ((event << PMLCA_EVENT_SHIFT) & | ||
71 | PMLCA_EVENT_MASK); | ||
72 | |||
73 | set_pmlca(ctr, pmlca); | ||
74 | } | ||
75 | |||
76 | static void set_pmc_user_kernel(int ctr, int user, int kernel) | ||
77 | { | ||
78 | u32 pmlca; | ||
79 | |||
80 | pmlca = get_pmlca(ctr); | ||
81 | |||
82 | if(user) | ||
83 | pmlca &= ~PMLCA_FCU; | ||
84 | else | ||
85 | pmlca |= PMLCA_FCU; | ||
86 | |||
87 | if(kernel) | ||
88 | pmlca &= ~PMLCA_FCS; | ||
89 | else | ||
90 | pmlca |= PMLCA_FCS; | ||
91 | |||
92 | set_pmlca(ctr, pmlca); | ||
93 | } | ||
94 | |||
95 | static void set_pmc_marked(int ctr, int mark0, int mark1) | ||
96 | { | ||
97 | u32 pmlca = get_pmlca(ctr); | ||
98 | |||
99 | if(mark0) | ||
100 | pmlca &= ~PMLCA_FCM0; | ||
101 | else | ||
102 | pmlca |= PMLCA_FCM0; | ||
103 | |||
104 | if(mark1) | ||
105 | pmlca &= ~PMLCA_FCM1; | ||
106 | else | ||
107 | pmlca |= PMLCA_FCM1; | ||
108 | |||
109 | set_pmlca(ctr, pmlca); | ||
110 | } | ||
111 | |||
112 | static void pmc_start_ctr(int ctr, int enable) | ||
113 | { | ||
114 | u32 pmlca = get_pmlca(ctr); | ||
115 | |||
116 | pmlca &= ~PMLCA_FC; | ||
117 | |||
118 | if (enable) | ||
119 | pmlca |= PMLCA_CE; | ||
120 | else | ||
121 | pmlca &= ~PMLCA_CE; | ||
122 | |||
123 | set_pmlca(ctr, pmlca); | ||
124 | } | ||
125 | |||
126 | static void pmc_start_ctrs(int enable) | ||
127 | { | ||
128 | u32 pmgc0 = mfpmr(PMRN_PMGC0); | ||
129 | |||
130 | pmgc0 &= ~PMGC0_FAC; | ||
131 | pmgc0 |= PMGC0_FCECE; | ||
132 | |||
133 | if (enable) | ||
134 | pmgc0 |= PMGC0_PMIE; | ||
135 | else | ||
136 | pmgc0 &= ~PMGC0_PMIE; | ||
137 | |||
138 | mtpmr(PMRN_PMGC0, pmgc0); | ||
139 | } | ||
140 | |||
141 | static void pmc_stop_ctrs(void) | ||
142 | { | ||
143 | u32 pmgc0 = mfpmr(PMRN_PMGC0); | ||
144 | |||
145 | pmgc0 |= PMGC0_FAC; | ||
146 | |||
147 | pmgc0 &= ~(PMGC0_PMIE | PMGC0_FCECE); | ||
148 | |||
149 | mtpmr(PMRN_PMGC0, pmgc0); | ||
150 | } | ||
151 | |||
152 | static void dump_pmcs(void) | ||
153 | { | ||
154 | printk("pmgc0: %x\n", mfpmr(PMRN_PMGC0)); | ||
155 | printk("pmc\t\tpmlca\t\tpmlcb\n"); | ||
156 | printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC0), | ||
157 | mfpmr(PMRN_PMLCA0), mfpmr(PMRN_PMLCB0)); | ||
158 | printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC1), | ||
159 | mfpmr(PMRN_PMLCA1), mfpmr(PMRN_PMLCB1)); | ||
160 | printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC2), | ||
161 | mfpmr(PMRN_PMLCA2), mfpmr(PMRN_PMLCB2)); | ||
162 | printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC3), | ||
163 | mfpmr(PMRN_PMLCA3), mfpmr(PMRN_PMLCB3)); | ||
164 | } | ||
165 | |||
166 | static void fsl_booke_cpu_setup(struct op_counter_config *ctr) | ||
167 | { | ||
168 | int i; | ||
169 | |||
170 | /* freeze all counters */ | ||
171 | pmc_stop_ctrs(); | ||
172 | |||
173 | for (i = 0;i < num_counters;i++) { | ||
174 | init_pmc_stop(i); | ||
175 | |||
176 | set_pmc_event(i, ctr[i].event); | ||
177 | |||
178 | set_pmc_user_kernel(i, ctr[i].user, ctr[i].kernel); | ||
179 | } | ||
180 | } | ||
71 | 181 | ||
72 | static void fsl_booke_reg_setup(struct op_counter_config *ctr, | 182 | static void fsl_booke_reg_setup(struct op_counter_config *ctr, |
73 | struct op_system_config *sys, | 183 | struct op_system_config *sys, |
@@ -77,23 +187,14 @@ static void fsl_booke_reg_setup(struct op_counter_config *ctr, | |||
77 | 187 | ||
78 | num_counters = num_ctrs; | 188 | num_counters = num_ctrs; |
79 | 189 | ||
80 | /* freeze all counters */ | ||
81 | pmc_stop_ctrs(); | ||
82 | |||
83 | /* Our counters count up, and "count" refers to | 190 | /* Our counters count up, and "count" refers to |
84 | * how much before the next interrupt, and we interrupt | 191 | * how much before the next interrupt, and we interrupt |
85 | * on overflow. So we calculate the starting value | 192 | * on overflow. So we calculate the starting value |
86 | * which will give us "count" until overflow. | 193 | * which will give us "count" until overflow. |
87 | * Then we set the events on the enabled counters */ | 194 | * Then we set the events on the enabled counters */ |
88 | for (i = 0; i < num_counters; ++i) { | 195 | for (i = 0; i < num_counters; ++i) |
89 | reset_value[i] = 0x80000000UL - ctr[i].count; | 196 | reset_value[i] = 0x80000000UL - ctr[i].count; |
90 | 197 | ||
91 | init_pmc_stop(i); | ||
92 | |||
93 | set_pmc_event(i, ctr[i].event); | ||
94 | |||
95 | set_pmc_user_kernel(i, ctr[i].user, ctr[i].kernel); | ||
96 | } | ||
97 | } | 198 | } |
98 | 199 | ||
99 | static void fsl_booke_start(struct op_counter_config *ctr) | 200 | static void fsl_booke_start(struct op_counter_config *ctr) |
@@ -105,8 +206,8 @@ static void fsl_booke_start(struct op_counter_config *ctr) | |||
105 | for (i = 0; i < num_counters; ++i) { | 206 | for (i = 0; i < num_counters; ++i) { |
106 | if (ctr[i].enabled) { | 207 | if (ctr[i].enabled) { |
107 | ctr_write(i, reset_value[i]); | 208 | ctr_write(i, reset_value[i]); |
108 | /* Set Each enabled counterd to only | 209 | /* Set each enabled counter to only |
109 | * count when the Mark bit is not set */ | 210 | * count when the Mark bit is *not* set */ |
110 | set_pmc_marked(i, 1, 0); | 211 | set_pmc_marked(i, 1, 0); |
111 | pmc_start_ctr(i, 1); | 212 | pmc_start_ctr(i, 1); |
112 | } else { | 213 | } else { |
@@ -177,6 +278,7 @@ static void fsl_booke_handle_interrupt(struct pt_regs *regs, | |||
177 | 278 | ||
178 | struct op_powerpc_model op_model_fsl_booke = { | 279 | struct op_powerpc_model op_model_fsl_booke = { |
179 | .reg_setup = fsl_booke_reg_setup, | 280 | .reg_setup = fsl_booke_reg_setup, |
281 | .cpu_setup = fsl_booke_cpu_setup, | ||
180 | .start = fsl_booke_start, | 282 | .start = fsl_booke_start, |
181 | .stop = fsl_booke_stop, | 283 | .stop = fsl_booke_stop, |
182 | .handle_interrupt = fsl_booke_handle_interrupt, | 284 | .handle_interrupt = fsl_booke_handle_interrupt, |
diff --git a/arch/powerpc/oprofile/op_model_power4.c b/arch/powerpc/oprofile/op_model_power4.c index 506f6b79f893..356709d515b9 100644 --- a/arch/powerpc/oprofile/op_model_power4.c +++ b/arch/powerpc/oprofile/op_model_power4.c | |||
@@ -76,13 +76,13 @@ static inline int mmcra_must_set_sample(void) | |||
76 | { | 76 | { |
77 | if (__is_processor(PV_POWER4) || __is_processor(PV_POWER4p) || | 77 | if (__is_processor(PV_POWER4) || __is_processor(PV_POWER4p) || |
78 | __is_processor(PV_970) || __is_processor(PV_970FX) || | 78 | __is_processor(PV_970) || __is_processor(PV_970FX) || |
79 | __is_processor(PV_970MP)) | 79 | __is_processor(PV_970MP) || __is_processor(PV_970GX)) |
80 | return 1; | 80 | return 1; |
81 | 81 | ||
82 | return 0; | 82 | return 0; |
83 | } | 83 | } |
84 | 84 | ||
85 | static void power4_cpu_setup(void *unused) | 85 | static void power4_cpu_setup(struct op_counter_config *ctr) |
86 | { | 86 | { |
87 | unsigned int mmcr0 = mmcr0_val; | 87 | unsigned int mmcr0 = mmcr0_val; |
88 | unsigned long mmcra = mmcra_val; | 88 | unsigned long mmcra = mmcra_val; |
diff --git a/arch/powerpc/oprofile/op_model_rs64.c b/arch/powerpc/oprofile/op_model_rs64.c index 042f8f4867ad..19c5ee089bc9 100644 --- a/arch/powerpc/oprofile/op_model_rs64.c +++ b/arch/powerpc/oprofile/op_model_rs64.c | |||
@@ -102,7 +102,7 @@ static void rs64_reg_setup(struct op_counter_config *ctr, | |||
102 | /* XXX setup user and kernel profiling */ | 102 | /* XXX setup user and kernel profiling */ |
103 | } | 103 | } |
104 | 104 | ||
105 | static void rs64_cpu_setup(void *unused) | 105 | static void rs64_cpu_setup(struct op_counter_config *ctr) |
106 | { | 106 | { |
107 | unsigned int mmcr0; | 107 | unsigned int mmcr0; |
108 | 108 | ||
diff --git a/arch/powerpc/platforms/83xx/mpc832x_mds.c b/arch/powerpc/platforms/83xx/mpc832x_mds.c index 54dea9d42dc9..a43ac71ab740 100644 --- a/arch/powerpc/platforms/83xx/mpc832x_mds.c +++ b/arch/powerpc/platforms/83xx/mpc832x_mds.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/root_dev.h> | 24 | #include <linux/root_dev.h> |
25 | #include <linux/initrd.h> | 25 | #include <linux/initrd.h> |
26 | 26 | ||
27 | #include <asm/of_device.h> | ||
27 | #include <asm/system.h> | 28 | #include <asm/system.h> |
28 | #include <asm/atomic.h> | 29 | #include <asm/atomic.h> |
29 | #include <asm/time.h> | 30 | #include <asm/time.h> |
@@ -136,6 +137,24 @@ static void __init mpc832x_sys_setup_arch(void) | |||
136 | #endif | 137 | #endif |
137 | } | 138 | } |
138 | 139 | ||
140 | static int __init mpc832x_declare_of_platform_devices(void) | ||
141 | { | ||
142 | struct device_node *np; | ||
143 | |||
144 | for (np = NULL; (np = of_find_compatible_node(np, "network", | ||
145 | "ucc_geth")) != NULL;) { | ||
146 | int ucc_num; | ||
147 | char bus_id[BUS_ID_SIZE]; | ||
148 | |||
149 | ucc_num = *((uint *) get_property(np, "device-id", NULL)) - 1; | ||
150 | snprintf(bus_id, BUS_ID_SIZE, "ucc_geth.%u", ucc_num); | ||
151 | of_platform_device_create(np, bus_id, NULL); | ||
152 | } | ||
153 | |||
154 | return 0; | ||
155 | } | ||
156 | device_initcall(mpc832x_declare_of_platform_devices); | ||
157 | |||
139 | void __init mpc832x_sys_init_IRQ(void) | 158 | void __init mpc832x_sys_init_IRQ(void) |
140 | { | 159 | { |
141 | 160 | ||
diff --git a/arch/powerpc/platforms/83xx/mpc834x_itx.c b/arch/powerpc/platforms/83xx/mpc834x_itx.c index 5446bab08eca..e2bcaaf6b329 100644 --- a/arch/powerpc/platforms/83xx/mpc834x_itx.c +++ b/arch/powerpc/platforms/83xx/mpc834x_itx.c | |||
@@ -108,10 +108,6 @@ static int __init mpc834x_itx_probe(void) | |||
108 | return 1; | 108 | return 1; |
109 | } | 109 | } |
110 | 110 | ||
111 | #ifdef CONFIG_RTC_CLASS | ||
112 | late_initcall(rtc_class_hookup); | ||
113 | #endif | ||
114 | |||
115 | define_machine(mpc834x_itx) { | 111 | define_machine(mpc834x_itx) { |
116 | .name = "MPC834x ITX", | 112 | .name = "MPC834x ITX", |
117 | .probe = mpc834x_itx_probe, | 113 | .probe = mpc834x_itx_probe, |
diff --git a/arch/powerpc/platforms/cell/spu_base.c b/arch/powerpc/platforms/cell/spu_base.c index d0fb959e3ef1..7aa809d5a244 100644 --- a/arch/powerpc/platforms/cell/spu_base.c +++ b/arch/powerpc/platforms/cell/spu_base.c | |||
@@ -655,14 +655,19 @@ static int __init spu_map_interrupts(struct spu *spu, struct device_node *np) | |||
655 | 655 | ||
656 | for (i=0; i < 3; i++) { | 656 | for (i=0; i < 3; i++) { |
657 | ret = of_irq_map_one(np, i, &oirq); | 657 | ret = of_irq_map_one(np, i, &oirq); |
658 | if (ret) | 658 | if (ret) { |
659 | pr_debug("spu_new: failed to get irq %d\n", i); | ||
659 | goto err; | 660 | goto err; |
660 | 661 | } | |
661 | ret = -EINVAL; | 662 | ret = -EINVAL; |
663 | pr_debug(" irq %d no 0x%x on %s\n", i, oirq.specifier[0], | ||
664 | oirq.controller->full_name); | ||
662 | spu->irqs[i] = irq_create_of_mapping(oirq.controller, | 665 | spu->irqs[i] = irq_create_of_mapping(oirq.controller, |
663 | oirq.specifier, oirq.size); | 666 | oirq.specifier, oirq.size); |
664 | if (spu->irqs[i] == NO_IRQ) | 667 | if (spu->irqs[i] == NO_IRQ) { |
668 | pr_debug("spu_new: failed to map it !\n"); | ||
665 | goto err; | 669 | goto err; |
670 | } | ||
666 | } | 671 | } |
667 | return 0; | 672 | return 0; |
668 | 673 | ||
@@ -681,7 +686,7 @@ static int spu_map_resource(struct device_node *node, int nr, | |||
681 | struct resource resource = { }; | 686 | struct resource resource = { }; |
682 | int ret; | 687 | int ret; |
683 | 688 | ||
684 | ret = of_address_to_resource(node, 0, &resource); | 689 | ret = of_address_to_resource(node, nr, &resource); |
685 | if (ret) | 690 | if (ret) |
686 | goto out; | 691 | goto out; |
687 | 692 | ||
@@ -704,22 +709,42 @@ static int __init spu_map_device(struct spu *spu, struct device_node *node) | |||
704 | 709 | ||
705 | ret = spu_map_resource(node, 0, (void __iomem**)&spu->local_store, | 710 | ret = spu_map_resource(node, 0, (void __iomem**)&spu->local_store, |
706 | &spu->local_store_phys); | 711 | &spu->local_store_phys); |
707 | if (ret) | 712 | if (ret) { |
713 | pr_debug("spu_new: failed to map %s resource 0\n", | ||
714 | node->full_name); | ||
708 | goto out; | 715 | goto out; |
716 | } | ||
709 | ret = spu_map_resource(node, 1, (void __iomem**)&spu->problem, | 717 | ret = spu_map_resource(node, 1, (void __iomem**)&spu->problem, |
710 | &spu->problem_phys); | 718 | &spu->problem_phys); |
711 | if (ret) | 719 | if (ret) { |
720 | pr_debug("spu_new: failed to map %s resource 1\n", | ||
721 | node->full_name); | ||
712 | goto out_unmap; | 722 | goto out_unmap; |
723 | } | ||
713 | ret = spu_map_resource(node, 2, (void __iomem**)&spu->priv2, | 724 | ret = spu_map_resource(node, 2, (void __iomem**)&spu->priv2, |
714 | NULL); | 725 | NULL); |
715 | if (ret) | 726 | if (ret) { |
727 | pr_debug("spu_new: failed to map %s resource 2\n", | ||
728 | node->full_name); | ||
716 | goto out_unmap; | 729 | goto out_unmap; |
730 | } | ||
717 | 731 | ||
718 | if (!firmware_has_feature(FW_FEATURE_LPAR)) | 732 | if (!firmware_has_feature(FW_FEATURE_LPAR)) |
719 | ret = spu_map_resource(node, 3, (void __iomem**)&spu->priv1, | 733 | ret = spu_map_resource(node, 3, (void __iomem**)&spu->priv1, |
720 | NULL); | 734 | NULL); |
721 | if (ret) | 735 | if (ret) { |
736 | pr_debug("spu_new: failed to map %s resource 3\n", | ||
737 | node->full_name); | ||
722 | goto out_unmap; | 738 | goto out_unmap; |
739 | } | ||
740 | pr_debug("spu_new: %s maps:\n", node->full_name); | ||
741 | pr_debug(" local store : 0x%016lx -> 0x%p\n", | ||
742 | spu->local_store_phys, spu->local_store); | ||
743 | pr_debug(" problem state : 0x%016lx -> 0x%p\n", | ||
744 | spu->problem_phys, spu->problem); | ||
745 | pr_debug(" priv2 : 0x%p\n", spu->priv2); | ||
746 | pr_debug(" priv1 : 0x%p\n", spu->priv1); | ||
747 | |||
723 | return 0; | 748 | return 0; |
724 | 749 | ||
725 | out_unmap: | 750 | out_unmap: |
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c index 0de8e114e6b6..533e2723e184 100644 --- a/arch/powerpc/platforms/cell/spufs/file.c +++ b/arch/powerpc/platforms/cell/spufs/file.c | |||
@@ -385,7 +385,7 @@ static ssize_t spufs_mbox_read(struct file *file, char __user *buf, | |||
385 | udata = (void __user *)buf; | 385 | udata = (void __user *)buf; |
386 | 386 | ||
387 | spu_acquire(ctx); | 387 | spu_acquire(ctx); |
388 | for (count = 0; count <= len; count += 4, udata++) { | 388 | for (count = 0; (count + 4) <= len; count += 4, udata++) { |
389 | int ret; | 389 | int ret; |
390 | ret = ctx->ops->mbox_read(ctx, &mbox_data); | 390 | ret = ctx->ops->mbox_read(ctx, &mbox_data); |
391 | if (ret == 0) | 391 | if (ret == 0) |
diff --git a/arch/powerpc/platforms/cell/spufs/hw_ops.c b/arch/powerpc/platforms/cell/spufs/hw_ops.c index efc452e71ab0..d805ffed892d 100644 --- a/arch/powerpc/platforms/cell/spufs/hw_ops.c +++ b/arch/powerpc/platforms/cell/spufs/hw_ops.c | |||
@@ -147,7 +147,7 @@ static void spu_hw_signal1_write(struct spu_context *ctx, u32 data) | |||
147 | 147 | ||
148 | static u32 spu_hw_signal2_read(struct spu_context *ctx) | 148 | static u32 spu_hw_signal2_read(struct spu_context *ctx) |
149 | { | 149 | { |
150 | return in_be32(&ctx->spu->problem->signal_notify1); | 150 | return in_be32(&ctx->spu->problem->signal_notify2); |
151 | } | 151 | } |
152 | 152 | ||
153 | static void spu_hw_signal2_write(struct spu_context *ctx, u32 data) | 153 | static void spu_hw_signal2_write(struct spu_context *ctx, u32 data) |
diff --git a/arch/powerpc/platforms/chrp/setup.c b/arch/powerpc/platforms/chrp/setup.c index cae3d13229b9..49b8dabcbc99 100644 --- a/arch/powerpc/platforms/chrp/setup.c +++ b/arch/powerpc/platforms/chrp/setup.c | |||
@@ -477,8 +477,10 @@ static void __init chrp_find_8259(void) | |||
477 | " address, polling\n"); | 477 | " address, polling\n"); |
478 | 478 | ||
479 | i8259_init(pic, chrp_int_ack); | 479 | i8259_init(pic, chrp_int_ack); |
480 | if (ppc_md.get_irq == NULL) | 480 | if (ppc_md.get_irq == NULL) { |
481 | ppc_md.get_irq = i8259_irq; | 481 | ppc_md.get_irq = i8259_irq; |
482 | irq_set_default_host(i8259_get_host()); | ||
483 | } | ||
482 | if (chrp_mpic != NULL) { | 484 | if (chrp_mpic != NULL) { |
483 | cascade_irq = irq_of_parse_and_map(pic, 0); | 485 | cascade_irq = irq_of_parse_and_map(pic, 0); |
484 | if (cascade_irq == NO_IRQ) | 486 | if (cascade_irq == NO_IRQ) |
diff --git a/arch/powerpc/platforms/iseries/iommu.c b/arch/powerpc/platforms/iseries/iommu.c index f4cbbcf8773a..218817d13c5c 100644 --- a/arch/powerpc/platforms/iseries/iommu.c +++ b/arch/powerpc/platforms/iseries/iommu.c | |||
@@ -43,9 +43,6 @@ static void tce_build_iSeries(struct iommu_table *tbl, long index, long npages, | |||
43 | u64 rc; | 43 | u64 rc; |
44 | u64 tce, rpn; | 44 | u64 tce, rpn; |
45 | 45 | ||
46 | index <<= TCE_PAGE_FACTOR; | ||
47 | npages <<= TCE_PAGE_FACTOR; | ||
48 | |||
49 | while (npages--) { | 46 | while (npages--) { |
50 | rpn = virt_to_abs(uaddr) >> TCE_SHIFT; | 47 | rpn = virt_to_abs(uaddr) >> TCE_SHIFT; |
51 | tce = (rpn & TCE_RPN_MASK) << TCE_RPN_SHIFT; | 48 | tce = (rpn & TCE_RPN_MASK) << TCE_RPN_SHIFT; |
@@ -75,9 +72,6 @@ static void tce_free_iSeries(struct iommu_table *tbl, long index, long npages) | |||
75 | { | 72 | { |
76 | u64 rc; | 73 | u64 rc; |
77 | 74 | ||
78 | npages <<= TCE_PAGE_FACTOR; | ||
79 | index <<= TCE_PAGE_FACTOR; | ||
80 | |||
81 | while (npages--) { | 75 | while (npages--) { |
82 | rc = HvCallXm_setTce((u64)tbl->it_index, (u64)index, 0); | 76 | rc = HvCallXm_setTce((u64)tbl->it_index, (u64)index, 0); |
83 | if (rc) | 77 | if (rc) |
@@ -136,10 +130,9 @@ void iommu_table_getparms_iSeries(unsigned long busno, | |||
136 | panic("PCI_DMA: parms->size is zero, parms is 0x%p", parms); | 130 | panic("PCI_DMA: parms->size is zero, parms is 0x%p", parms); |
137 | 131 | ||
138 | /* itc_size is in pages worth of table, it_size is in # of entries */ | 132 | /* itc_size is in pages worth of table, it_size is in # of entries */ |
139 | tbl->it_size = ((parms->itc_size * TCE_PAGE_SIZE) / | 133 | tbl->it_size = (parms->itc_size * TCE_PAGE_SIZE) / TCE_ENTRY_SIZE; |
140 | TCE_ENTRY_SIZE) >> TCE_PAGE_FACTOR; | ||
141 | tbl->it_busno = parms->itc_busno; | 134 | tbl->it_busno = parms->itc_busno; |
142 | tbl->it_offset = parms->itc_offset >> TCE_PAGE_FACTOR; | 135 | tbl->it_offset = parms->itc_offset; |
143 | tbl->it_index = parms->itc_index; | 136 | tbl->it_index = parms->itc_index; |
144 | tbl->it_blocksize = 1; | 137 | tbl->it_blocksize = 1; |
145 | tbl->it_type = virtbus ? TCE_VB : TCE_PCI; | 138 | tbl->it_type = virtbus ? TCE_VB : TCE_PCI; |
diff --git a/arch/powerpc/platforms/iseries/setup.c b/arch/powerpc/platforms/iseries/setup.c index a0ff7ba7d666..6f73469fd3b0 100644 --- a/arch/powerpc/platforms/iseries/setup.c +++ b/arch/powerpc/platforms/iseries/setup.c | |||
@@ -694,6 +694,11 @@ void * __init iSeries_early_setup(void) | |||
694 | { | 694 | { |
695 | unsigned long phys_mem_size; | 695 | unsigned long phys_mem_size; |
696 | 696 | ||
697 | /* Identify CPU type. This is done again by the common code later | ||
698 | * on but calling this function multiple times is fine. | ||
699 | */ | ||
700 | identify_cpu(0); | ||
701 | |||
697 | powerpc_firmware_features |= FW_FEATURE_ISERIES; | 702 | powerpc_firmware_features |= FW_FEATURE_ISERIES; |
698 | powerpc_firmware_features |= FW_FEATURE_LPAR; | 703 | powerpc_firmware_features |= FW_FEATURE_LPAR; |
699 | 704 | ||
diff --git a/arch/powerpc/platforms/powermac/sleep.S b/arch/powerpc/platforms/powermac/sleep.S index 1174ca128efa..adee28da353f 100644 --- a/arch/powerpc/platforms/powermac/sleep.S +++ b/arch/powerpc/platforms/powermac/sleep.S | |||
@@ -45,7 +45,8 @@ | |||
45 | .section .text | 45 | .section .text |
46 | .align 5 | 46 | .align 5 |
47 | 47 | ||
48 | #if defined(CONFIG_PM) || defined(CONFIG_CPU_FREQ_PMAC) | 48 | #if defined(CONFIG_PM) || defined(CONFIG_CPU_FREQ_PMAC) || \ |
49 | (defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PPC32)) | ||
49 | 50 | ||
50 | /* This gets called by via-pmu.c late during the sleep process. | 51 | /* This gets called by via-pmu.c late during the sleep process. |
51 | * The PMU was already send the sleep command and will shut us down | 52 | * The PMU was already send the sleep command and will shut us down |
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c index d24ba547e53f..556c279a789d 100644 --- a/arch/powerpc/platforms/pseries/iommu.c +++ b/arch/powerpc/platforms/pseries/iommu.c | |||
@@ -57,9 +57,6 @@ static void tce_build_pSeries(struct iommu_table *tbl, long index, | |||
57 | u64 *tcep; | 57 | u64 *tcep; |
58 | u64 rpn; | 58 | u64 rpn; |
59 | 59 | ||
60 | index <<= TCE_PAGE_FACTOR; | ||
61 | npages <<= TCE_PAGE_FACTOR; | ||
62 | |||
63 | proto_tce = TCE_PCI_READ; // Read allowed | 60 | proto_tce = TCE_PCI_READ; // Read allowed |
64 | 61 | ||
65 | if (direction != DMA_TO_DEVICE) | 62 | if (direction != DMA_TO_DEVICE) |
@@ -82,9 +79,6 @@ static void tce_free_pSeries(struct iommu_table *tbl, long index, long npages) | |||
82 | { | 79 | { |
83 | u64 *tcep; | 80 | u64 *tcep; |
84 | 81 | ||
85 | npages <<= TCE_PAGE_FACTOR; | ||
86 | index <<= TCE_PAGE_FACTOR; | ||
87 | |||
88 | tcep = ((u64 *)tbl->it_base) + index; | 82 | tcep = ((u64 *)tbl->it_base) + index; |
89 | 83 | ||
90 | while (npages--) | 84 | while (npages--) |
@@ -95,7 +89,6 @@ static unsigned long tce_get_pseries(struct iommu_table *tbl, long index) | |||
95 | { | 89 | { |
96 | u64 *tcep; | 90 | u64 *tcep; |
97 | 91 | ||
98 | index <<= TCE_PAGE_FACTOR; | ||
99 | tcep = ((u64 *)tbl->it_base) + index; | 92 | tcep = ((u64 *)tbl->it_base) + index; |
100 | 93 | ||
101 | return *tcep; | 94 | return *tcep; |
@@ -109,9 +102,6 @@ static void tce_build_pSeriesLP(struct iommu_table *tbl, long tcenum, | |||
109 | u64 proto_tce, tce; | 102 | u64 proto_tce, tce; |
110 | u64 rpn; | 103 | u64 rpn; |
111 | 104 | ||
112 | tcenum <<= TCE_PAGE_FACTOR; | ||
113 | npages <<= TCE_PAGE_FACTOR; | ||
114 | |||
115 | rpn = (virt_to_abs(uaddr)) >> TCE_SHIFT; | 105 | rpn = (virt_to_abs(uaddr)) >> TCE_SHIFT; |
116 | proto_tce = TCE_PCI_READ; | 106 | proto_tce = TCE_PCI_READ; |
117 | if (direction != DMA_TO_DEVICE) | 107 | if (direction != DMA_TO_DEVICE) |
@@ -146,7 +136,7 @@ static void tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, | |||
146 | u64 rpn; | 136 | u64 rpn; |
147 | long l, limit; | 137 | long l, limit; |
148 | 138 | ||
149 | if (TCE_PAGE_FACTOR == 0 && npages == 1) | 139 | if (npages == 1) |
150 | return tce_build_pSeriesLP(tbl, tcenum, npages, uaddr, | 140 | return tce_build_pSeriesLP(tbl, tcenum, npages, uaddr, |
151 | direction); | 141 | direction); |
152 | 142 | ||
@@ -164,9 +154,6 @@ static void tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, | |||
164 | __get_cpu_var(tce_page) = tcep; | 154 | __get_cpu_var(tce_page) = tcep; |
165 | } | 155 | } |
166 | 156 | ||
167 | tcenum <<= TCE_PAGE_FACTOR; | ||
168 | npages <<= TCE_PAGE_FACTOR; | ||
169 | |||
170 | rpn = (virt_to_abs(uaddr)) >> TCE_SHIFT; | 157 | rpn = (virt_to_abs(uaddr)) >> TCE_SHIFT; |
171 | proto_tce = TCE_PCI_READ; | 158 | proto_tce = TCE_PCI_READ; |
172 | if (direction != DMA_TO_DEVICE) | 159 | if (direction != DMA_TO_DEVICE) |
@@ -207,9 +194,6 @@ static void tce_free_pSeriesLP(struct iommu_table *tbl, long tcenum, long npages | |||
207 | { | 194 | { |
208 | u64 rc; | 195 | u64 rc; |
209 | 196 | ||
210 | tcenum <<= TCE_PAGE_FACTOR; | ||
211 | npages <<= TCE_PAGE_FACTOR; | ||
212 | |||
213 | while (npages--) { | 197 | while (npages--) { |
214 | rc = plpar_tce_put((u64)tbl->it_index, (u64)tcenum << 12, 0); | 198 | rc = plpar_tce_put((u64)tbl->it_index, (u64)tcenum << 12, 0); |
215 | 199 | ||
@@ -229,9 +213,6 @@ static void tce_freemulti_pSeriesLP(struct iommu_table *tbl, long tcenum, long n | |||
229 | { | 213 | { |
230 | u64 rc; | 214 | u64 rc; |
231 | 215 | ||
232 | tcenum <<= TCE_PAGE_FACTOR; | ||
233 | npages <<= TCE_PAGE_FACTOR; | ||
234 | |||
235 | rc = plpar_tce_stuff((u64)tbl->it_index, (u64)tcenum << 12, 0, npages); | 216 | rc = plpar_tce_stuff((u64)tbl->it_index, (u64)tcenum << 12, 0, npages); |
236 | 217 | ||
237 | if (rc && printk_ratelimit()) { | 218 | if (rc && printk_ratelimit()) { |
@@ -248,7 +229,6 @@ static unsigned long tce_get_pSeriesLP(struct iommu_table *tbl, long tcenum) | |||
248 | u64 rc; | 229 | u64 rc; |
249 | unsigned long tce_ret; | 230 | unsigned long tce_ret; |
250 | 231 | ||
251 | tcenum <<= TCE_PAGE_FACTOR; | ||
252 | rc = plpar_tce_get((u64)tbl->it_index, (u64)tcenum << 12, &tce_ret); | 232 | rc = plpar_tce_get((u64)tbl->it_index, (u64)tcenum << 12, &tce_ret); |
253 | 233 | ||
254 | if (rc && printk_ratelimit()) { | 234 | if (rc && printk_ratelimit()) { |
@@ -289,7 +269,7 @@ static void iommu_table_setparms(struct pci_controller *phb, | |||
289 | tbl->it_busno = phb->bus->number; | 269 | tbl->it_busno = phb->bus->number; |
290 | 270 | ||
291 | /* Units of tce entries */ | 271 | /* Units of tce entries */ |
292 | tbl->it_offset = phb->dma_window_base_cur >> PAGE_SHIFT; | 272 | tbl->it_offset = phb->dma_window_base_cur >> IOMMU_PAGE_SHIFT; |
293 | 273 | ||
294 | /* Test if we are going over 2GB of DMA space */ | 274 | /* Test if we are going over 2GB of DMA space */ |
295 | if (phb->dma_window_base_cur + phb->dma_window_size > 0x80000000ul) { | 275 | if (phb->dma_window_base_cur + phb->dma_window_size > 0x80000000ul) { |
@@ -300,7 +280,7 @@ static void iommu_table_setparms(struct pci_controller *phb, | |||
300 | phb->dma_window_base_cur += phb->dma_window_size; | 280 | phb->dma_window_base_cur += phb->dma_window_size; |
301 | 281 | ||
302 | /* Set the tce table size - measured in entries */ | 282 | /* Set the tce table size - measured in entries */ |
303 | tbl->it_size = phb->dma_window_size >> PAGE_SHIFT; | 283 | tbl->it_size = phb->dma_window_size >> IOMMU_PAGE_SHIFT; |
304 | 284 | ||
305 | tbl->it_index = 0; | 285 | tbl->it_index = 0; |
306 | tbl->it_blocksize = 16; | 286 | tbl->it_blocksize = 16; |
@@ -325,8 +305,8 @@ static void iommu_table_setparms_lpar(struct pci_controller *phb, | |||
325 | tbl->it_base = 0; | 305 | tbl->it_base = 0; |
326 | tbl->it_blocksize = 16; | 306 | tbl->it_blocksize = 16; |
327 | tbl->it_type = TCE_PCI; | 307 | tbl->it_type = TCE_PCI; |
328 | tbl->it_offset = offset >> PAGE_SHIFT; | 308 | tbl->it_offset = offset >> IOMMU_PAGE_SHIFT; |
329 | tbl->it_size = size >> PAGE_SHIFT; | 309 | tbl->it_size = size >> IOMMU_PAGE_SHIFT; |
330 | } | 310 | } |
331 | 311 | ||
332 | static void iommu_bus_setup_pSeries(struct pci_bus *bus) | 312 | static void iommu_bus_setup_pSeries(struct pci_bus *bus) |
@@ -522,8 +502,6 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev) | |||
522 | const void *dma_window = NULL; | 502 | const void *dma_window = NULL; |
523 | struct pci_dn *pci; | 503 | struct pci_dn *pci; |
524 | 504 | ||
525 | DBG("iommu_dev_setup_pSeriesLP, dev %p (%s)\n", dev, pci_name(dev)); | ||
526 | |||
527 | /* dev setup for LPAR is a little tricky, since the device tree might | 505 | /* dev setup for LPAR is a little tricky, since the device tree might |
528 | * contain the dma-window properties per-device and not neccesarily | 506 | * contain the dma-window properties per-device and not neccesarily |
529 | * for the bus. So we need to search upwards in the tree until we | 507 | * for the bus. So we need to search upwards in the tree until we |
@@ -532,6 +510,9 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev) | |||
532 | */ | 510 | */ |
533 | dn = pci_device_to_OF_node(dev); | 511 | dn = pci_device_to_OF_node(dev); |
534 | 512 | ||
513 | DBG("iommu_dev_setup_pSeriesLP, dev %p (%s) %s\n", | ||
514 | dev, pci_name(dev), dn->full_name); | ||
515 | |||
535 | for (pdn = dn; pdn && PCI_DN(pdn) && !PCI_DN(pdn)->iommu_table; | 516 | for (pdn = dn; pdn && PCI_DN(pdn) && !PCI_DN(pdn)->iommu_table; |
536 | pdn = pdn->parent) { | 517 | pdn = pdn->parent) { |
537 | dma_window = get_property(pdn, "ibm,dma-window", NULL); | 518 | dma_window = get_property(pdn, "ibm,dma-window", NULL); |
diff --git a/arch/powerpc/sysdev/dart.h b/arch/powerpc/sysdev/dart.h index 1c8817c4835e..ff202edb0591 100644 --- a/arch/powerpc/sysdev/dart.h +++ b/arch/powerpc/sysdev/dart.h | |||
@@ -72,7 +72,6 @@ | |||
72 | 72 | ||
73 | #define DART_PAGE_SHIFT 12 | 73 | #define DART_PAGE_SHIFT 12 |
74 | #define DART_PAGE_SIZE (1 << DART_PAGE_SHIFT) | 74 | #define DART_PAGE_SIZE (1 << DART_PAGE_SHIFT) |
75 | #define DART_PAGE_FACTOR (PAGE_SHIFT - DART_PAGE_SHIFT) | ||
76 | 75 | ||
77 | 76 | ||
78 | #endif /* _POWERPC_SYSDEV_DART_H */ | 77 | #endif /* _POWERPC_SYSDEV_DART_H */ |
diff --git a/arch/powerpc/sysdev/dart_iommu.c b/arch/powerpc/sysdev/dart_iommu.c index 03b4477dd7f0..572b7846cc77 100644 --- a/arch/powerpc/sysdev/dart_iommu.c +++ b/arch/powerpc/sysdev/dart_iommu.c | |||
@@ -156,9 +156,6 @@ static void dart_build(struct iommu_table *tbl, long index, | |||
156 | 156 | ||
157 | DBG("dart: build at: %lx, %lx, addr: %x\n", index, npages, uaddr); | 157 | DBG("dart: build at: %lx, %lx, addr: %x\n", index, npages, uaddr); |
158 | 158 | ||
159 | index <<= DART_PAGE_FACTOR; | ||
160 | npages <<= DART_PAGE_FACTOR; | ||
161 | |||
162 | dp = ((unsigned int*)tbl->it_base) + index; | 159 | dp = ((unsigned int*)tbl->it_base) + index; |
163 | 160 | ||
164 | /* On U3, all memory is contigous, so we can move this | 161 | /* On U3, all memory is contigous, so we can move this |
@@ -199,9 +196,6 @@ static void dart_free(struct iommu_table *tbl, long index, long npages) | |||
199 | 196 | ||
200 | DBG("dart: free at: %lx, %lx\n", index, npages); | 197 | DBG("dart: free at: %lx, %lx\n", index, npages); |
201 | 198 | ||
202 | index <<= DART_PAGE_FACTOR; | ||
203 | npages <<= DART_PAGE_FACTOR; | ||
204 | |||
205 | dp = ((unsigned int *)tbl->it_base) + index; | 199 | dp = ((unsigned int *)tbl->it_base) + index; |
206 | 200 | ||
207 | while (npages--) | 201 | while (npages--) |
@@ -281,7 +275,7 @@ static void iommu_table_dart_setup(void) | |||
281 | iommu_table_dart.it_busno = 0; | 275 | iommu_table_dart.it_busno = 0; |
282 | iommu_table_dart.it_offset = 0; | 276 | iommu_table_dart.it_offset = 0; |
283 | /* it_size is in number of entries */ | 277 | /* it_size is in number of entries */ |
284 | iommu_table_dart.it_size = (dart_tablesize / sizeof(u32)) >> DART_PAGE_FACTOR; | 278 | iommu_table_dart.it_size = dart_tablesize / sizeof(u32); |
285 | 279 | ||
286 | /* Initialize the common IOMMU code */ | 280 | /* Initialize the common IOMMU code */ |
287 | iommu_table_dart.it_base = (unsigned long)dart_vbase; | 281 | iommu_table_dart.it_base = (unsigned long)dart_vbase; |
diff --git a/arch/powerpc/sysdev/i8259.c b/arch/powerpc/sysdev/i8259.c index 0450265d73bb..ad87adc975bc 100644 --- a/arch/powerpc/sysdev/i8259.c +++ b/arch/powerpc/sysdev/i8259.c | |||
@@ -224,6 +224,11 @@ static struct irq_host_ops i8259_host_ops = { | |||
224 | .xlate = i8259_host_xlate, | 224 | .xlate = i8259_host_xlate, |
225 | }; | 225 | }; |
226 | 226 | ||
227 | struct irq_host *i8259_get_host(void) | ||
228 | { | ||
229 | return i8259_host; | ||
230 | } | ||
231 | |||
227 | /** | 232 | /** |
228 | * i8259_init - Initialize the legacy controller | 233 | * i8259_init - Initialize the legacy controller |
229 | * @node: device node of the legacy PIC (can be NULL, but then, it will match | 234 | * @node: device node of the legacy PIC (can be NULL, but then, it will match |
diff --git a/arch/powerpc/sysdev/ipic.c b/arch/powerpc/sysdev/ipic.c index bc4d4a7f9657..746f78c15375 100644 --- a/arch/powerpc/sysdev/ipic.c +++ b/arch/powerpc/sysdev/ipic.c | |||
@@ -473,9 +473,9 @@ static int ipic_set_irq_type(unsigned int virq, unsigned int flow_type) | |||
473 | desc->status |= flow_type & IRQ_TYPE_SENSE_MASK; | 473 | desc->status |= flow_type & IRQ_TYPE_SENSE_MASK; |
474 | if (flow_type & IRQ_TYPE_LEVEL_LOW) { | 474 | if (flow_type & IRQ_TYPE_LEVEL_LOW) { |
475 | desc->status |= IRQ_LEVEL; | 475 | desc->status |= IRQ_LEVEL; |
476 | set_irq_handler(virq, handle_level_irq); | 476 | desc->handle_irq = handle_level_irq; |
477 | } else { | 477 | } else { |
478 | set_irq_handler(virq, handle_edge_irq); | 478 | desc->handle_irq = handle_edge_irq; |
479 | } | 479 | } |
480 | 480 | ||
481 | /* only EXT IRQ senses are programmable on ipic | 481 | /* only EXT IRQ senses are programmable on ipic |
diff --git a/arch/powerpc/sysdev/qe_lib/qe.c b/arch/powerpc/sysdev/qe_lib/qe.c index 2bae632d3ad7..e4223226a7a8 100644 --- a/arch/powerpc/sysdev/qe_lib/qe.c +++ b/arch/powerpc/sysdev/qe_lib/qe.c | |||
@@ -122,8 +122,7 @@ int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input) | |||
122 | mcn_shift = QE_CR_MCN_NORMAL_SHIFT; | 122 | mcn_shift = QE_CR_MCN_NORMAL_SHIFT; |
123 | } | 123 | } |
124 | 124 | ||
125 | out_be32(&qe_immr->cp.cecdr, | 125 | out_be32(&qe_immr->cp.cecdr, cmd_input); |
126 | immrbar_virt_to_phys((void *)cmd_input)); | ||
127 | out_be32(&qe_immr->cp.cecr, | 126 | out_be32(&qe_immr->cp.cecr, |
128 | (cmd | QE_CR_FLG | ((u32) device << dev_shift) | (u32) | 127 | (cmd | QE_CR_FLG | ((u32) device << dev_shift) | (u32) |
129 | mcn_protocol << mcn_shift)); | 128 | mcn_protocol << mcn_shift)); |
diff --git a/arch/powerpc/sysdev/qe_lib/ucc.c b/arch/powerpc/sysdev/qe_lib/ucc.c index 916c9e5df57f..ac12a44d516f 100644 --- a/arch/powerpc/sysdev/qe_lib/ucc.c +++ b/arch/powerpc/sysdev/qe_lib/ucc.c | |||
@@ -207,6 +207,7 @@ int ucc_set_qe_mux_rxtx(int ucc_num, enum qe_clock clock, enum comm_dir mode) | |||
207 | case QE_CLK18: source = 8; break; | 207 | case QE_CLK18: source = 8; break; |
208 | case QE_CLK7: source = 9; break; | 208 | case QE_CLK7: source = 9; break; |
209 | case QE_CLK8: source = 10; break; | 209 | case QE_CLK8: source = 10; break; |
210 | case QE_CLK16: source = 11; break; | ||
210 | default: source = -1; break; | 211 | default: source = -1; break; |
211 | } | 212 | } |
212 | break; | 213 | break; |
@@ -222,6 +223,7 @@ int ucc_set_qe_mux_rxtx(int ucc_num, enum qe_clock clock, enum comm_dir mode) | |||
222 | case QE_CLK22: source = 8; break; | 223 | case QE_CLK22: source = 8; break; |
223 | case QE_CLK7: source = 9; break; | 224 | case QE_CLK7: source = 9; break; |
224 | case QE_CLK8: source = 10; break; | 225 | case QE_CLK8: source = 10; break; |
226 | case QE_CLK16: source = 11; break; | ||
225 | default: source = -1; break; | 227 | default: source = -1; break; |
226 | } | 228 | } |
227 | break; | 229 | break; |
diff --git a/arch/powerpc/sysdev/qe_lib/ucc_fast.c b/arch/powerpc/sysdev/qe_lib/ucc_fast.c index c2be7348fcbd..75fa3104a43a 100644 --- a/arch/powerpc/sysdev/qe_lib/ucc_fast.c +++ b/arch/powerpc/sysdev/qe_lib/ucc_fast.c | |||
@@ -163,7 +163,7 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** ucc | |||
163 | 163 | ||
164 | /* check if the UCC port number is in range. */ | 164 | /* check if the UCC port number is in range. */ |
165 | if ((uf_info->ucc_num < 0) || (uf_info->ucc_num > UCC_MAX_NUM - 1)) { | 165 | if ((uf_info->ucc_num < 0) || (uf_info->ucc_num > UCC_MAX_NUM - 1)) { |
166 | uccf_err("ucc_fast_init: Illagal UCC number!"); | 166 | uccf_err("ucc_fast_init: Illegal UCC number!"); |
167 | return -EINVAL; | 167 | return -EINVAL; |
168 | } | 168 | } |
169 | 169 | ||
diff --git a/arch/powerpc/sysdev/qe_lib/ucc_slow.c b/arch/powerpc/sysdev/qe_lib/ucc_slow.c index 1fb88ef7cf06..a49da6b73ecf 100644 --- a/arch/powerpc/sysdev/qe_lib/ucc_slow.c +++ b/arch/powerpc/sysdev/qe_lib/ucc_slow.c | |||
@@ -152,7 +152,7 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc | |||
152 | 152 | ||
153 | /* check if the UCC port number is in range. */ | 153 | /* check if the UCC port number is in range. */ |
154 | if ((us_info->ucc_num < 0) || (us_info->ucc_num > UCC_MAX_NUM - 1)) { | 154 | if ((us_info->ucc_num < 0) || (us_info->ucc_num > UCC_MAX_NUM - 1)) { |
155 | uccs_err("ucc_slow_init: Illagal UCC number!"); | 155 | uccs_err("ucc_slow_init: Illegal UCC number!"); |
156 | return -EINVAL; | 156 | return -EINVAL; |
157 | } | 157 | } |
158 | 158 | ||
diff --git a/arch/powerpc/sysdev/tsi108_dev.c b/arch/powerpc/sysdev/tsi108_dev.c index 11de090eb901..97f37ef4bbbf 100644 --- a/arch/powerpc/sysdev/tsi108_dev.c +++ b/arch/powerpc/sysdev/tsi108_dev.c | |||
@@ -48,7 +48,7 @@ phys_addr_t get_csrbase(void) | |||
48 | tsi = of_find_node_by_type(NULL, "tsi-bridge"); | 48 | tsi = of_find_node_by_type(NULL, "tsi-bridge"); |
49 | if (tsi) { | 49 | if (tsi) { |
50 | unsigned int size; | 50 | unsigned int size; |
51 | void *prop = get_property(tsi, "reg", &size); | 51 | const void *prop = get_property(tsi, "reg", &size); |
52 | tsi108_csr_base = of_translate_address(tsi, prop); | 52 | tsi108_csr_base = of_translate_address(tsi, prop); |
53 | of_node_put(tsi); | 53 | of_node_put(tsi); |
54 | }; | 54 | }; |
@@ -79,7 +79,7 @@ static int __init tsi108_eth_of_init(void) | |||
79 | hw_info tsi_eth_data; | 79 | hw_info tsi_eth_data; |
80 | unsigned int *id; | 80 | unsigned int *id; |
81 | unsigned int *phy_id; | 81 | unsigned int *phy_id; |
82 | void *mac_addr; | 82 | const void *mac_addr; |
83 | phandle *ph; | 83 | phandle *ph; |
84 | 84 | ||
85 | memset(r, 0, sizeof(r)); | 85 | memset(r, 0, sizeof(r)); |
diff --git a/arch/ppc/boot/simple/relocate.S b/arch/ppc/boot/simple/relocate.S index 0c021556d78e..1bbbcd2f2bcb 100644 --- a/arch/ppc/boot/simple/relocate.S +++ b/arch/ppc/boot/simple/relocate.S | |||
@@ -154,8 +154,8 @@ do_relocate_out: | |||
154 | 154 | ||
155 | start_ldr: | 155 | start_ldr: |
156 | /* Clear all of BSS and set up stack for C calls */ | 156 | /* Clear all of BSS and set up stack for C calls */ |
157 | lis r3,edata@h | 157 | lis r3,__bss_start@h |
158 | ori r3,r3,edata@l | 158 | ori r3,r3,__bss_start@l |
159 | lis r4,end@h | 159 | lis r4,end@h |
160 | ori r4,r4,end@l | 160 | ori r4,r4,end@l |
161 | subi r3,r3,4 | 161 | subi r3,r3,4 |
@@ -163,7 +163,7 @@ start_ldr: | |||
163 | li r0,0 | 163 | li r0,0 |
164 | 50: stwu r0,4(r3) | 164 | 50: stwu r0,4(r3) |
165 | cmpw cr0,r3,r4 | 165 | cmpw cr0,r3,r4 |
166 | bne 50b | 166 | blt 50b |
167 | 90: mr r9,r1 /* Save old stack pointer (in case it matters) */ | 167 | 90: mr r9,r1 /* Save old stack pointer (in case it matters) */ |
168 | lis r1,.stack@h | 168 | lis r1,.stack@h |
169 | ori r1,r1,.stack@l | 169 | ori r1,r1,.stack@l |
diff --git a/arch/ppc/kernel/misc.S b/arch/ppc/kernel/misc.S index 5f6684012ded..d319f9ba2379 100644 --- a/arch/ppc/kernel/misc.S +++ b/arch/ppc/kernel/misc.S | |||
@@ -110,80 +110,6 @@ _GLOBAL(reloc_got2) | |||
110 | blr | 110 | blr |
111 | 111 | ||
112 | /* | 112 | /* |
113 | * identify_cpu, | ||
114 | * called with r3 = data offset and r4 = CPU number | ||
115 | * doesn't change r3 | ||
116 | */ | ||
117 | _GLOBAL(identify_cpu) | ||
118 | addis r8,r3,cpu_specs@ha | ||
119 | addi r8,r8,cpu_specs@l | ||
120 | mfpvr r7 | ||
121 | 1: | ||
122 | lwz r5,CPU_SPEC_PVR_MASK(r8) | ||
123 | and r5,r5,r7 | ||
124 | lwz r6,CPU_SPEC_PVR_VALUE(r8) | ||
125 | cmplw 0,r6,r5 | ||
126 | beq 1f | ||
127 | addi r8,r8,CPU_SPEC_ENTRY_SIZE | ||
128 | b 1b | ||
129 | 1: | ||
130 | addis r6,r3,cur_cpu_spec@ha | ||
131 | addi r6,r6,cur_cpu_spec@l | ||
132 | sub r8,r8,r3 | ||
133 | stw r8,0(r6) | ||
134 | blr | ||
135 | |||
136 | /* | ||
137 | * do_cpu_ftr_fixups - goes through the list of CPU feature fixups | ||
138 | * and writes nop's over sections of code that don't apply for this cpu. | ||
139 | * r3 = data offset (not changed) | ||
140 | */ | ||
141 | _GLOBAL(do_cpu_ftr_fixups) | ||
142 | /* Get CPU 0 features */ | ||
143 | addis r6,r3,cur_cpu_spec@ha | ||
144 | addi r6,r6,cur_cpu_spec@l | ||
145 | lwz r4,0(r6) | ||
146 | add r4,r4,r3 | ||
147 | lwz r4,CPU_SPEC_FEATURES(r4) | ||
148 | |||
149 | /* Get the fixup table */ | ||
150 | addis r6,r3,__start___ftr_fixup@ha | ||
151 | addi r6,r6,__start___ftr_fixup@l | ||
152 | addis r7,r3,__stop___ftr_fixup@ha | ||
153 | addi r7,r7,__stop___ftr_fixup@l | ||
154 | |||
155 | /* Do the fixup */ | ||
156 | 1: cmplw 0,r6,r7 | ||
157 | bgelr | ||
158 | addi r6,r6,16 | ||
159 | lwz r8,-16(r6) /* mask */ | ||
160 | and r8,r8,r4 | ||
161 | lwz r9,-12(r6) /* value */ | ||
162 | cmplw 0,r8,r9 | ||
163 | beq 1b | ||
164 | lwz r8,-8(r6) /* section begin */ | ||
165 | lwz r9,-4(r6) /* section end */ | ||
166 | subf. r9,r8,r9 | ||
167 | beq 1b | ||
168 | /* write nops over the section of code */ | ||
169 | /* todo: if large section, add a branch at the start of it */ | ||
170 | srwi r9,r9,2 | ||
171 | mtctr r9 | ||
172 | add r8,r8,r3 | ||
173 | lis r0,0x60000000@h /* nop */ | ||
174 | 3: stw r0,0(r8) | ||
175 | andi. r10,r4,CPU_FTR_SPLIT_ID_CACHE@l | ||
176 | beq 2f | ||
177 | dcbst 0,r8 /* suboptimal, but simpler */ | ||
178 | sync | ||
179 | icbi 0,r8 | ||
180 | 2: addi r8,r8,4 | ||
181 | bdnz 3b | ||
182 | sync /* additional sync needed on g4 */ | ||
183 | isync | ||
184 | b 1b | ||
185 | |||
186 | /* | ||
187 | * call_setup_cpu - call the setup_cpu function for this cpu | 113 | * call_setup_cpu - call the setup_cpu function for this cpu |
188 | * r3 = data offset, r24 = cpu number | 114 | * r3 = data offset, r24 = cpu number |
189 | * | 115 | * |
diff --git a/arch/ppc/kernel/setup.c b/arch/ppc/kernel/setup.c index 75fe13815be2..27faeca2c7a2 100644 --- a/arch/ppc/kernel/setup.c +++ b/arch/ppc/kernel/setup.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <asm/nvram.h> | 38 | #include <asm/nvram.h> |
39 | #include <asm/xmon.h> | 39 | #include <asm/xmon.h> |
40 | #include <asm/ocp.h> | 40 | #include <asm/ocp.h> |
41 | #include <asm/prom.h> | ||
41 | 42 | ||
42 | #define USES_PPC_SYS (defined(CONFIG_85xx) || defined(CONFIG_83xx) || \ | 43 | #define USES_PPC_SYS (defined(CONFIG_85xx) || defined(CONFIG_83xx) || \ |
43 | defined(CONFIG_MPC10X_BRIDGE) || defined(CONFIG_8260) || \ | 44 | defined(CONFIG_MPC10X_BRIDGE) || defined(CONFIG_8260) || \ |
@@ -53,8 +54,6 @@ | |||
53 | 54 | ||
54 | extern void platform_init(unsigned long r3, unsigned long r4, | 55 | extern void platform_init(unsigned long r3, unsigned long r4, |
55 | unsigned long r5, unsigned long r6, unsigned long r7); | 56 | unsigned long r5, unsigned long r6, unsigned long r7); |
56 | extern void identify_cpu(unsigned long offset, unsigned long cpu); | ||
57 | extern void do_cpu_ftr_fixups(unsigned long offset); | ||
58 | extern void reloc_got2(unsigned long offset); | 57 | extern void reloc_got2(unsigned long offset); |
59 | 58 | ||
60 | extern void ppc6xx_idle(void); | 59 | extern void ppc6xx_idle(void); |
@@ -301,6 +300,7 @@ early_init(int r3, int r4, int r5) | |||
301 | { | 300 | { |
302 | unsigned long phys; | 301 | unsigned long phys; |
303 | unsigned long offset = reloc_offset(); | 302 | unsigned long offset = reloc_offset(); |
303 | struct cpu_spec *spec; | ||
304 | 304 | ||
305 | /* Default */ | 305 | /* Default */ |
306 | phys = offset + KERNELBASE; | 306 | phys = offset + KERNELBASE; |
@@ -313,8 +313,10 @@ early_init(int r3, int r4, int r5) | |||
313 | * Identify the CPU type and fix up code sections | 313 | * Identify the CPU type and fix up code sections |
314 | * that depend on which cpu we have. | 314 | * that depend on which cpu we have. |
315 | */ | 315 | */ |
316 | identify_cpu(offset, 0); | 316 | spec = identify_cpu(offset); |
317 | do_cpu_ftr_fixups(offset); | 317 | do_feature_fixups(spec->cpu_features, |
318 | PTRRELOC(&__start___ftr_fixup), | ||
319 | PTRRELOC(&__stop___ftr_fixup)); | ||
318 | 320 | ||
319 | return phys; | 321 | return phys; |
320 | } | 322 | } |
diff --git a/arch/ppc/kernel/traps.c b/arch/ppc/kernel/traps.c index aafc8e8893d1..9661a91183b3 100644 --- a/arch/ppc/kernel/traps.c +++ b/arch/ppc/kernel/traps.c | |||
@@ -708,7 +708,7 @@ void single_step_exception(struct pt_regs *regs) | |||
708 | 708 | ||
709 | void alignment_exception(struct pt_regs *regs) | 709 | void alignment_exception(struct pt_regs *regs) |
710 | { | 710 | { |
711 | int fixed; | 711 | int sig, code, fixed = 0; |
712 | 712 | ||
713 | fixed = fix_alignment(regs); | 713 | fixed = fix_alignment(regs); |
714 | if (fixed == 1) { | 714 | if (fixed == 1) { |
@@ -717,14 +717,16 @@ void alignment_exception(struct pt_regs *regs) | |||
717 | return; | 717 | return; |
718 | } | 718 | } |
719 | if (fixed == -EFAULT) { | 719 | if (fixed == -EFAULT) { |
720 | /* fixed == -EFAULT means the operand address was bad */ | 720 | sig = SIGSEGV; |
721 | if (user_mode(regs)) | 721 | code = SEGV_ACCERR; |
722 | _exception(SIGSEGV, regs, SEGV_ACCERR, regs->dar); | 722 | } else { |
723 | else | 723 | sig = SIGBUS; |
724 | bad_page_fault(regs, regs->dar, SIGSEGV); | 724 | code = BUS_ADRALN; |
725 | return; | ||
726 | } | 725 | } |
727 | _exception(SIGBUS, regs, BUS_ADRALN, regs->dar); | 726 | if (user_mode(regs)) |
727 | _exception(sig, regs, code, regs->dar); | ||
728 | else | ||
729 | bad_page_fault(regs, regs->dar, sig); | ||
728 | } | 730 | } |
729 | 731 | ||
730 | void StackOverflow(struct pt_regs *regs) | 732 | void StackOverflow(struct pt_regs *regs) |
diff --git a/arch/ppc/kernel/vmlinux.lds.S b/arch/ppc/kernel/vmlinux.lds.S index 095fd3323323..16e8661e1fec 100644 --- a/arch/ppc/kernel/vmlinux.lds.S +++ b/arch/ppc/kernel/vmlinux.lds.S | |||
@@ -115,13 +115,7 @@ SECTIONS | |||
115 | __setup_end = .; | 115 | __setup_end = .; |
116 | __initcall_start = .; | 116 | __initcall_start = .; |
117 | .initcall.init : { | 117 | .initcall.init : { |
118 | *(.initcall1.init) | 118 | INITCALLS |
119 | *(.initcall2.init) | ||
120 | *(.initcall3.init) | ||
121 | *(.initcall4.init) | ||
122 | *(.initcall5.init) | ||
123 | *(.initcall6.init) | ||
124 | *(.initcall7.init) | ||
125 | } | 119 | } |
126 | __initcall_end = .; | 120 | __initcall_end = .; |
127 | 121 | ||
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 608193cfe43f..245b81bc7157 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -236,9 +236,6 @@ config WARN_STACK_SIZE | |||
236 | This allows you to specify the maximum frame size a function may | 236 | This allows you to specify the maximum frame size a function may |
237 | have without the compiler complaining about it. | 237 | have without the compiler complaining about it. |
238 | 238 | ||
239 | config ARCH_POPULATES_NODE_MAP | ||
240 | def_bool y | ||
241 | |||
242 | source "mm/Kconfig" | 239 | source "mm/Kconfig" |
243 | 240 | ||
244 | comment "I/O subsystem configuration" | 241 | comment "I/O subsystem configuration" |
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index 45c9fa7d7545..af1e8fc7d985 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
@@ -310,6 +310,7 @@ appldata_interval_handler(ctl_table *ctl, int write, struct file *filp, | |||
310 | if (copy_from_user(buf, buffer, len > sizeof(buf) ? sizeof(buf) : len)) { | 310 | if (copy_from_user(buf, buffer, len > sizeof(buf) ? sizeof(buf) : len)) { |
311 | return -EFAULT; | 311 | return -EFAULT; |
312 | } | 312 | } |
313 | interval = 0; | ||
313 | sscanf(buf, "%i", &interval); | 314 | sscanf(buf, "%i", &interval); |
314 | if (interval <= 0) { | 315 | if (interval <= 0) { |
315 | P_ERROR("Timer CPU interval has to be > 0!\n"); | 316 | P_ERROR("Timer CPU interval has to be > 0!\n"); |
diff --git a/arch/s390/defconfig b/arch/s390/defconfig index c313e9a9304f..7cd51e73e274 100644 --- a/arch/s390/defconfig +++ b/arch/s390/defconfig | |||
@@ -119,7 +119,6 @@ CONFIG_PACK_STACK=y | |||
119 | CONFIG_CHECK_STACK=y | 119 | CONFIG_CHECK_STACK=y |
120 | CONFIG_STACK_GUARD=256 | 120 | CONFIG_STACK_GUARD=256 |
121 | # CONFIG_WARN_STACK is not set | 121 | # CONFIG_WARN_STACK is not set |
122 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
123 | CONFIG_SELECT_MEMORY_MODEL=y | 122 | CONFIG_SELECT_MEMORY_MODEL=y |
124 | CONFIG_FLATMEM_MANUAL=y | 123 | CONFIG_FLATMEM_MANUAL=y |
125 | # CONFIG_DISCONTIGMEM_MANUAL is not set | 124 | # CONFIG_DISCONTIGMEM_MANUAL is not set |
diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 2001767e1dc7..5b33f823863a 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c | |||
@@ -757,7 +757,9 @@ asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args) | |||
757 | put_user(oldlen, (u32 __user *)compat_ptr(tmp.oldlenp))) | 757 | put_user(oldlen, (u32 __user *)compat_ptr(tmp.oldlenp))) |
758 | error = -EFAULT; | 758 | error = -EFAULT; |
759 | } | 759 | } |
760 | copy_to_user(args->__unused, tmp.__unused, sizeof(tmp.__unused)); | 760 | if (copy_to_user(args->__unused, tmp.__unused, |
761 | sizeof(tmp.__unused))) | ||
762 | error = -EFAULT; | ||
761 | } | 763 | } |
762 | return error; | 764 | return error; |
763 | } | 765 | } |
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index d49b876a83bf..861888ab8c13 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/arch/s390/kernel/compat_signal.c | |||
@@ -169,12 +169,12 @@ sys32_sigaction(int sig, const struct old_sigaction32 __user *act, | |||
169 | compat_old_sigset_t mask; | 169 | compat_old_sigset_t mask; |
170 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | 170 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || |
171 | __get_user(sa_handler, &act->sa_handler) || | 171 | __get_user(sa_handler, &act->sa_handler) || |
172 | __get_user(sa_restorer, &act->sa_restorer)) | 172 | __get_user(sa_restorer, &act->sa_restorer) || |
173 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
174 | __get_user(mask, &act->sa_mask)) | ||
173 | return -EFAULT; | 175 | return -EFAULT; |
174 | new_ka.sa.sa_handler = (__sighandler_t) sa_handler; | 176 | new_ka.sa.sa_handler = (__sighandler_t) sa_handler; |
175 | new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer; | 177 | new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer; |
176 | __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
177 | __get_user(mask, &act->sa_mask); | ||
178 | siginitset(&new_ka.sa.sa_mask, mask); | 178 | siginitset(&new_ka.sa.sa_mask, mask); |
179 | } | 179 | } |
180 | 180 | ||
@@ -185,10 +185,10 @@ sys32_sigaction(int sig, const struct old_sigaction32 __user *act, | |||
185 | sa_restorer = (unsigned long) old_ka.sa.sa_restorer; | 185 | sa_restorer = (unsigned long) old_ka.sa.sa_restorer; |
186 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | 186 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || |
187 | __put_user(sa_handler, &oact->sa_handler) || | 187 | __put_user(sa_handler, &oact->sa_handler) || |
188 | __put_user(sa_restorer, &oact->sa_restorer)) | 188 | __put_user(sa_restorer, &oact->sa_restorer) || |
189 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
190 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
189 | return -EFAULT; | 191 | return -EFAULT; |
190 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
191 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
192 | } | 192 | } |
193 | 193 | ||
194 | return ret; | 194 | return ret; |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index cb0efae6802f..71e54ef0931e 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
@@ -1664,4 +1664,4 @@ sys_getcpu_wrapper: | |||
1664 | llgtr %r2,%r2 # unsigned * | 1664 | llgtr %r2,%r2 # unsigned * |
1665 | llgtr %r3,%r3 # unsigned * | 1665 | llgtr %r3,%r3 # unsigned * |
1666 | llgtr %r4,%r4 # struct getcpu_cache * | 1666 | llgtr %r4,%r4 # struct getcpu_cache * |
1667 | jg sys_tee | 1667 | jg sys_getcpu |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 49f2b68e32b1..2aa13e8e000a 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -70,6 +70,7 @@ struct { | |||
70 | #define CHUNK_READ_WRITE 0 | 70 | #define CHUNK_READ_WRITE 0 |
71 | #define CHUNK_READ_ONLY 1 | 71 | #define CHUNK_READ_ONLY 1 |
72 | volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */ | 72 | volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */ |
73 | unsigned long __initdata zholes_size[MAX_NR_ZONES]; | ||
73 | static unsigned long __initdata memory_end; | 74 | static unsigned long __initdata memory_end; |
74 | 75 | ||
75 | /* | 76 | /* |
@@ -357,6 +358,21 @@ void machine_power_off(void) | |||
357 | */ | 358 | */ |
358 | void (*pm_power_off)(void) = machine_power_off; | 359 | void (*pm_power_off)(void) = machine_power_off; |
359 | 360 | ||
361 | static void __init | ||
362 | add_memory_hole(unsigned long start, unsigned long end) | ||
363 | { | ||
364 | unsigned long dma_pfn = MAX_DMA_ADDRESS >> PAGE_SHIFT; | ||
365 | |||
366 | if (end <= dma_pfn) | ||
367 | zholes_size[ZONE_DMA] += end - start + 1; | ||
368 | else if (start > dma_pfn) | ||
369 | zholes_size[ZONE_NORMAL] += end - start + 1; | ||
370 | else { | ||
371 | zholes_size[ZONE_DMA] += dma_pfn - start + 1; | ||
372 | zholes_size[ZONE_NORMAL] += end - dma_pfn; | ||
373 | } | ||
374 | } | ||
375 | |||
360 | static int __init early_parse_mem(char *p) | 376 | static int __init early_parse_mem(char *p) |
361 | { | 377 | { |
362 | memory_end = memparse(p, &p); | 378 | memory_end = memparse(p, &p); |
@@ -434,7 +450,7 @@ setup_lowcore(void) | |||
434 | lc->extended_save_area_addr = (__u32) | 450 | lc->extended_save_area_addr = (__u32) |
435 | __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0); | 451 | __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0); |
436 | /* enable extended save area */ | 452 | /* enable extended save area */ |
437 | ctl_set_bit(14, 29); | 453 | __ctl_set_bit(14, 29); |
438 | } | 454 | } |
439 | #endif | 455 | #endif |
440 | set_prefix((u32)(unsigned long) lc); | 456 | set_prefix((u32)(unsigned long) lc); |
@@ -478,6 +494,7 @@ setup_memory(void) | |||
478 | { | 494 | { |
479 | unsigned long bootmap_size; | 495 | unsigned long bootmap_size; |
480 | unsigned long start_pfn, end_pfn, init_pfn; | 496 | unsigned long start_pfn, end_pfn, init_pfn; |
497 | unsigned long last_rw_end; | ||
481 | int i; | 498 | int i; |
482 | 499 | ||
483 | /* | 500 | /* |
@@ -533,27 +550,39 @@ setup_memory(void) | |||
533 | /* | 550 | /* |
534 | * Register RAM areas with the bootmem allocator. | 551 | * Register RAM areas with the bootmem allocator. |
535 | */ | 552 | */ |
553 | last_rw_end = start_pfn; | ||
536 | 554 | ||
537 | for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) { | 555 | for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) { |
538 | unsigned long start_chunk, end_chunk, pfn; | 556 | unsigned long start_chunk, end_chunk; |
539 | 557 | ||
540 | if (memory_chunk[i].type != CHUNK_READ_WRITE) | 558 | if (memory_chunk[i].type != CHUNK_READ_WRITE) |
541 | continue; | 559 | continue; |
542 | start_chunk = PFN_DOWN(memory_chunk[i].addr); | 560 | start_chunk = (memory_chunk[i].addr + PAGE_SIZE - 1); |
543 | end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size) - 1; | 561 | start_chunk >>= PAGE_SHIFT; |
544 | end_chunk = min(end_chunk, end_pfn); | 562 | end_chunk = (memory_chunk[i].addr + memory_chunk[i].size); |
545 | if (start_chunk >= end_chunk) | 563 | end_chunk >>= PAGE_SHIFT; |
546 | continue; | 564 | if (start_chunk < start_pfn) |
547 | add_active_range(0, start_chunk, end_chunk); | 565 | start_chunk = start_pfn; |
548 | pfn = max(start_chunk, start_pfn); | 566 | if (end_chunk > end_pfn) |
549 | for (; pfn <= end_chunk; pfn++) | 567 | end_chunk = end_pfn; |
550 | page_set_storage_key(PFN_PHYS(pfn), PAGE_DEFAULT_KEY); | 568 | if (start_chunk < end_chunk) { |
569 | /* Initialize storage key for RAM pages */ | ||
570 | for (init_pfn = start_chunk ; init_pfn < end_chunk; | ||
571 | init_pfn++) | ||
572 | page_set_storage_key(init_pfn << PAGE_SHIFT, | ||
573 | PAGE_DEFAULT_KEY); | ||
574 | free_bootmem(start_chunk << PAGE_SHIFT, | ||
575 | (end_chunk - start_chunk) << PAGE_SHIFT); | ||
576 | if (last_rw_end < start_chunk) | ||
577 | add_memory_hole(last_rw_end, start_chunk - 1); | ||
578 | last_rw_end = end_chunk; | ||
579 | } | ||
551 | } | 580 | } |
552 | 581 | ||
553 | psw_set_key(PAGE_DEFAULT_KEY); | 582 | psw_set_key(PAGE_DEFAULT_KEY); |
554 | 583 | ||
555 | free_bootmem_with_active_regions(0, max_pfn); | 584 | if (last_rw_end < end_pfn - 1) |
556 | reserve_bootmem(0, PFN_PHYS(start_pfn)); | 585 | add_memory_hole(last_rw_end, end_pfn - 1); |
557 | 586 | ||
558 | /* | 587 | /* |
559 | * Reserve the bootmem bitmap itself as well. We do this in two | 588 | * Reserve the bootmem bitmap itself as well. We do this in two |
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index 4392a77cbae8..4c8a7954ef48 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
@@ -80,10 +80,10 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
80 | old_sigset_t mask; | 80 | old_sigset_t mask; |
81 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | 81 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || |
82 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | 82 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || |
83 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) | 83 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || |
84 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
85 | __get_user(mask, &act->sa_mask)) | ||
84 | return -EFAULT; | 86 | return -EFAULT; |
85 | __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
86 | __get_user(mask, &act->sa_mask); | ||
87 | siginitset(&new_ka.sa.sa_mask, mask); | 87 | siginitset(&new_ka.sa.sa_mask, mask); |
88 | } | 88 | } |
89 | 89 | ||
@@ -92,10 +92,10 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
92 | if (!ret && oact) { | 92 | if (!ret && oact) { |
93 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | 93 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || |
94 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | 94 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || |
95 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) | 95 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || |
96 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
97 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
96 | return -EFAULT; | 98 | return -EFAULT; |
97 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
98 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
99 | } | 99 | } |
100 | 100 | ||
101 | return ret; | 101 | return ret; |
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index 66375a5e3d12..92ecffbc8d82 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c | |||
@@ -462,7 +462,8 @@ asmlinkage void illegal_op(struct pt_regs * regs, long interruption_code) | |||
462 | local_irq_enable(); | 462 | local_irq_enable(); |
463 | 463 | ||
464 | if (regs->psw.mask & PSW_MASK_PSTATE) { | 464 | if (regs->psw.mask & PSW_MASK_PSTATE) { |
465 | get_user(*((__u16 *) opcode), (__u16 __user *) location); | 465 | if (get_user(*((__u16 *) opcode), (__u16 __user *) location)) |
466 | return; | ||
466 | if (*((__u16 *) opcode) == S390_BREAKPOINT_U16) { | 467 | if (*((__u16 *) opcode) == S390_BREAKPOINT_U16) { |
467 | if (current->ptrace & PT_PTRACED) | 468 | if (current->ptrace & PT_PTRACED) |
468 | force_sig(SIGTRAP, current); | 469 | force_sig(SIGTRAP, current); |
@@ -470,20 +471,25 @@ asmlinkage void illegal_op(struct pt_regs * regs, long interruption_code) | |||
470 | signal = SIGILL; | 471 | signal = SIGILL; |
471 | #ifdef CONFIG_MATHEMU | 472 | #ifdef CONFIG_MATHEMU |
472 | } else if (opcode[0] == 0xb3) { | 473 | } else if (opcode[0] == 0xb3) { |
473 | get_user(*((__u16 *) (opcode+2)), location+1); | 474 | if (get_user(*((__u16 *) (opcode+2)), location+1)) |
475 | return; | ||
474 | signal = math_emu_b3(opcode, regs); | 476 | signal = math_emu_b3(opcode, regs); |
475 | } else if (opcode[0] == 0xed) { | 477 | } else if (opcode[0] == 0xed) { |
476 | get_user(*((__u32 *) (opcode+2)), | 478 | if (get_user(*((__u32 *) (opcode+2)), |
477 | (__u32 __user *)(location+1)); | 479 | (__u32 __user *)(location+1))) |
480 | return; | ||
478 | signal = math_emu_ed(opcode, regs); | 481 | signal = math_emu_ed(opcode, regs); |
479 | } else if (*((__u16 *) opcode) == 0xb299) { | 482 | } else if (*((__u16 *) opcode) == 0xb299) { |
480 | get_user(*((__u16 *) (opcode+2)), location+1); | 483 | if (get_user(*((__u16 *) (opcode+2)), location+1)) |
484 | return; | ||
481 | signal = math_emu_srnm(opcode, regs); | 485 | signal = math_emu_srnm(opcode, regs); |
482 | } else if (*((__u16 *) opcode) == 0xb29c) { | 486 | } else if (*((__u16 *) opcode) == 0xb29c) { |
483 | get_user(*((__u16 *) (opcode+2)), location+1); | 487 | if (get_user(*((__u16 *) (opcode+2)), location+1)) |
488 | return; | ||
484 | signal = math_emu_stfpc(opcode, regs); | 489 | signal = math_emu_stfpc(opcode, regs); |
485 | } else if (*((__u16 *) opcode) == 0xb29d) { | 490 | } else if (*((__u16 *) opcode) == 0xb29d) { |
486 | get_user(*((__u16 *) (opcode+2)), location+1); | 491 | if (get_user(*((__u16 *) (opcode+2)), location+1)) |
492 | return; | ||
487 | signal = math_emu_lfpc(opcode, regs); | 493 | signal = math_emu_lfpc(opcode, regs); |
488 | #endif | 494 | #endif |
489 | } else | 495 | } else |
diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index af9e69a03011..fe0f2e97ba7b 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S | |||
@@ -83,13 +83,7 @@ SECTIONS | |||
83 | __setup_end = .; | 83 | __setup_end = .; |
84 | __initcall_start = .; | 84 | __initcall_start = .; |
85 | .initcall.init : { | 85 | .initcall.init : { |
86 | *(.initcall1.init) | 86 | INITCALLS |
87 | *(.initcall2.init) | ||
88 | *(.initcall3.init) | ||
89 | *(.initcall4.init) | ||
90 | *(.initcall5.init) | ||
91 | *(.initcall6.init) | ||
92 | *(.initcall7.init) | ||
93 | } | 87 | } |
94 | __initcall_end = .; | 88 | __initcall_end = .; |
95 | __con_initcall_start = .; | 89 | __con_initcall_start = .; |
diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index d99891718709..e1881c31b1cb 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c | |||
@@ -84,6 +84,7 @@ void show_mem(void) | |||
84 | printk("%d pages swap cached\n",cached); | 84 | printk("%d pages swap cached\n",cached); |
85 | } | 85 | } |
86 | 86 | ||
87 | extern unsigned long __initdata zholes_size[]; | ||
87 | /* | 88 | /* |
88 | * paging_init() sets up the page tables | 89 | * paging_init() sets up the page tables |
89 | */ | 90 | */ |
@@ -100,15 +101,16 @@ void __init paging_init(void) | |||
100 | unsigned long pgdir_k = (__pa(swapper_pg_dir) & PAGE_MASK) | _KERNSEG_TABLE; | 101 | unsigned long pgdir_k = (__pa(swapper_pg_dir) & PAGE_MASK) | _KERNSEG_TABLE; |
101 | static const int ssm_mask = 0x04000000L; | 102 | static const int ssm_mask = 0x04000000L; |
102 | unsigned long ro_start_pfn, ro_end_pfn; | 103 | unsigned long ro_start_pfn, ro_end_pfn; |
103 | unsigned long max_zone_pfns[MAX_NR_ZONES]; | 104 | unsigned long zones_size[MAX_NR_ZONES]; |
104 | 105 | ||
105 | ro_start_pfn = PFN_DOWN((unsigned long)&__start_rodata); | 106 | ro_start_pfn = PFN_DOWN((unsigned long)&__start_rodata); |
106 | ro_end_pfn = PFN_UP((unsigned long)&__end_rodata); | 107 | ro_end_pfn = PFN_UP((unsigned long)&__end_rodata); |
107 | 108 | ||
108 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); | 109 | memset(zones_size, 0, sizeof(zones_size)); |
109 | max_zone_pfns[ZONE_DMA] = max_low_pfn; | 110 | zones_size[ZONE_DMA] = max_low_pfn; |
110 | max_zone_pfns[ZONE_NORMAL] = max_low_pfn; | 111 | free_area_init_node(0, &contig_page_data, zones_size, |
111 | free_area_init_nodes(max_zone_pfns); | 112 | __pa(PAGE_OFFSET) >> PAGE_SHIFT, |
113 | zholes_size); | ||
112 | 114 | ||
113 | /* unmap whole virtual address space */ | 115 | /* unmap whole virtual address space */ |
114 | 116 | ||
@@ -168,16 +170,26 @@ void __init paging_init(void) | |||
168 | unsigned long pgdir_k = (__pa(swapper_pg_dir) & PAGE_MASK) | | 170 | unsigned long pgdir_k = (__pa(swapper_pg_dir) & PAGE_MASK) | |
169 | _KERN_REGION_TABLE; | 171 | _KERN_REGION_TABLE; |
170 | static const int ssm_mask = 0x04000000L; | 172 | static const int ssm_mask = 0x04000000L; |
173 | unsigned long zones_size[MAX_NR_ZONES]; | ||
174 | unsigned long dma_pfn, high_pfn; | ||
171 | unsigned long ro_start_pfn, ro_end_pfn; | 175 | unsigned long ro_start_pfn, ro_end_pfn; |
172 | unsigned long max_zone_pfns[MAX_NR_ZONES]; | ||
173 | 176 | ||
177 | memset(zones_size, 0, sizeof(zones_size)); | ||
178 | dma_pfn = MAX_DMA_ADDRESS >> PAGE_SHIFT; | ||
179 | high_pfn = max_low_pfn; | ||
174 | ro_start_pfn = PFN_DOWN((unsigned long)&__start_rodata); | 180 | ro_start_pfn = PFN_DOWN((unsigned long)&__start_rodata); |
175 | ro_end_pfn = PFN_UP((unsigned long)&__end_rodata); | 181 | ro_end_pfn = PFN_UP((unsigned long)&__end_rodata); |
176 | 182 | ||
177 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); | 183 | if (dma_pfn > high_pfn) |
178 | max_zone_pfns[ZONE_DMA] = PFN_DOWN(MAX_DMA_ADDRESS); | 184 | zones_size[ZONE_DMA] = high_pfn; |
179 | max_zone_pfns[ZONE_NORMAL] = max_low_pfn; | 185 | else { |
180 | free_area_init_nodes(max_zone_pfns); | 186 | zones_size[ZONE_DMA] = dma_pfn; |
187 | zones_size[ZONE_NORMAL] = high_pfn - dma_pfn; | ||
188 | } | ||
189 | |||
190 | /* Initialize mem_map[]. */ | ||
191 | free_area_init_node(0, &contig_page_data, zones_size, | ||
192 | __pa(PAGE_OFFSET) >> PAGE_SHIFT, zholes_size); | ||
181 | 193 | ||
182 | /* | 194 | /* |
183 | * map whole physical memory to virtual memory (identity mapping) | 195 | * map whole physical memory to virtual memory (identity mapping) |
diff --git a/arch/sh/boards/hp6xx/hp6xx_apm.c b/arch/sh/boards/hp6xx/hp6xx_apm.c index 219179114f0f..d146cdaa0b8b 100644 --- a/arch/sh/boards/hp6xx/hp6xx_apm.c +++ b/arch/sh/boards/hp6xx/hp6xx_apm.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <asm/io.h> | 14 | #include <asm/io.h> |
15 | #include <asm/apm.h> | 15 | #include <asm/apm.h> |
16 | #include <asm/adc.h> | 16 | #include <asm/adc.h> |
17 | #include <asm/hp6xx/hp6xx.h> | 17 | #include <asm/hp6xx.h> |
18 | 18 | ||
19 | #define SH7709_PGDR 0xa400012c | 19 | #define SH7709_PGDR 0xa400012c |
20 | 20 | ||
diff --git a/arch/sh/boards/hp6xx/pm.c b/arch/sh/boards/hp6xx/pm.c index 83d327212064..d1947732fb3e 100644 --- a/arch/sh/boards/hp6xx/pm.c +++ b/arch/sh/boards/hp6xx/pm.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/time.h> | 12 | #include <linux/time.h> |
13 | #include <asm/io.h> | 13 | #include <asm/io.h> |
14 | #include <asm/hd64461.h> | 14 | #include <asm/hd64461.h> |
15 | #include <asm/hp6xx/hp6xx.h> | 15 | #include <asm/hp6xx.h> |
16 | #include <asm/cpu/dac.h> | 16 | #include <asm/cpu/dac.h> |
17 | #include <asm/pm.h> | 17 | #include <asm/pm.h> |
18 | 18 | ||
diff --git a/arch/sh/boards/hp6xx/setup.c b/arch/sh/boards/hp6xx/setup.c index 2d3a5b4faf58..b5a96649ed26 100644 --- a/arch/sh/boards/hp6xx/setup.c +++ b/arch/sh/boards/hp6xx/setup.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <asm/hd64461.h> | 13 | #include <asm/hd64461.h> |
14 | #include <asm/io.h> | 14 | #include <asm/io.h> |
15 | #include <asm/irq.h> | 15 | #include <asm/irq.h> |
16 | #include <asm/hp6xx/hp6xx.h> | 16 | #include <asm/hp6xx.h> |
17 | #include <asm/cpu/dac.h> | 17 | #include <asm/cpu/dac.h> |
18 | 18 | ||
19 | #define SCPCR 0xa4000116 | 19 | #define SCPCR 0xa4000116 |
diff --git a/arch/sh/boards/renesas/hs7751rvoip/io.c b/arch/sh/boards/renesas/hs7751rvoip/io.c index 51f3f6574210..bb9aa0d62852 100644 --- a/arch/sh/boards/renesas/hs7751rvoip/io.c +++ b/arch/sh/boards/renesas/hs7751rvoip/io.c | |||
@@ -15,7 +15,7 @@ | |||
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/pci.h> | 16 | #include <linux/pci.h> |
17 | #include <asm/io.h> | 17 | #include <asm/io.h> |
18 | #include <asm/hs7751rvoip/hs7751rvoip.h> | 18 | #include <asm/hs7751rvoip.h> |
19 | #include <asm/addrspace.h> | 19 | #include <asm/addrspace.h> |
20 | 20 | ||
21 | extern void *area6_io8_base; /* Area 6 8bit I/O Base address */ | 21 | extern void *area6_io8_base; /* Area 6 8bit I/O Base address */ |
diff --git a/arch/sh/boards/renesas/hs7751rvoip/irq.c b/arch/sh/boards/renesas/hs7751rvoip/irq.c index c617b188258a..943f93aa6052 100644 --- a/arch/sh/boards/renesas/hs7751rvoip/irq.c +++ b/arch/sh/boards/renesas/hs7751rvoip/irq.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <linux/irq.h> | 14 | #include <linux/irq.h> |
15 | #include <asm/io.h> | 15 | #include <asm/io.h> |
16 | #include <asm/irq.h> | 16 | #include <asm/irq.h> |
17 | #include <asm/hs7751rvoip/hs7751rvoip.h> | 17 | #include <asm/hs7751rvoip.h> |
18 | 18 | ||
19 | static int mask_pos[] = {8, 9, 10, 11, 12, 13, 0, 1, 2, 3, 4, 5, 6, 7}; | 19 | static int mask_pos[] = {8, 9, 10, 11, 12, 13, 0, 1, 2, 3, 4, 5, 6, 7}; |
20 | 20 | ||
diff --git a/arch/sh/boards/renesas/hs7751rvoip/setup.c b/arch/sh/boards/renesas/hs7751rvoip/setup.c index 0414c15c3458..f7d0e304d899 100644 --- a/arch/sh/boards/renesas/hs7751rvoip/setup.c +++ b/arch/sh/boards/renesas/hs7751rvoip/setup.c | |||
@@ -10,22 +10,21 @@ | |||
10 | #include <linux/init.h> | 10 | #include <linux/init.h> |
11 | #include <linux/irq.h> | 11 | #include <linux/irq.h> |
12 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
13 | #include <linux/vmalloc.h> | ||
14 | #include <linux/hdreg.h> | ||
15 | #include <linux/ide.h> | ||
16 | #include <linux/pm.h> | 13 | #include <linux/pm.h> |
14 | #include <asm/hs7751rvoip.h> | ||
17 | #include <asm/io.h> | 15 | #include <asm/io.h> |
18 | #include <asm/hs7751rvoip/hs7751rvoip.h> | ||
19 | #include <asm/machvec.h> | 16 | #include <asm/machvec.h> |
20 | #include <asm/rtc.h> | ||
21 | #include <asm/irq.h> | ||
22 | 17 | ||
23 | static void __init hs7751rvoip_init_irq(void) | 18 | static struct ipr_data hs77501rvoip_ipr_map[] = { |
24 | { | ||
25 | #if defined(CONFIG_HS7751RVOIP_CODEC) | 19 | #if defined(CONFIG_HS7751RVOIP_CODEC) |
26 | make_ipr_irq(DMTE0_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | 20 | { DMTE0_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, |
27 | make_ipr_irq(DMTE1_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | 21 | { DMTE1_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, |
28 | #endif | 22 | #endif |
23 | }; | ||
24 | |||
25 | static void __init hs7751rvoip_init_irq(void) | ||
26 | { | ||
27 | make_ipr_irq(hs77501rvoip_ipr_map, ARRAY_SIZE(hs77501rvoip_ipr_map)); | ||
29 | 28 | ||
30 | init_hs7751rvoip_IRQ(); | 29 | init_hs7751rvoip_IRQ(); |
31 | } | 30 | } |
diff --git a/arch/sh/boards/renesas/r7780rp/io.c b/arch/sh/boards/renesas/r7780rp/io.c index db92d6e6ae99..311ccccba718 100644 --- a/arch/sh/boards/renesas/r7780rp/io.c +++ b/arch/sh/boards/renesas/r7780rp/io.c | |||
@@ -11,7 +11,7 @@ | |||
11 | #include <linux/pci.h> | 11 | #include <linux/pci.h> |
12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
13 | #include <linux/types.h> | 13 | #include <linux/types.h> |
14 | #include <asm/r7780rp/r7780rp.h> | 14 | #include <asm/r7780rp.h> |
15 | #include <asm/addrspace.h> | 15 | #include <asm/addrspace.h> |
16 | #include <asm/io.h> | 16 | #include <asm/io.h> |
17 | 17 | ||
diff --git a/arch/sh/boards/renesas/r7780rp/irq.c b/arch/sh/boards/renesas/r7780rp/irq.c index b544772cbc72..aa15ec5bc69e 100644 --- a/arch/sh/boards/renesas/r7780rp/irq.c +++ b/arch/sh/boards/renesas/r7780rp/irq.c | |||
@@ -10,7 +10,8 @@ | |||
10 | */ | 10 | */ |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/irq.h> | 12 | #include <linux/irq.h> |
13 | #include <asm/io.h> | 13 | #include <linux/io.h> |
14 | #include <asm/r7780rp.h> | ||
14 | 15 | ||
15 | #ifdef CONFIG_SH_R7780MP | 16 | #ifdef CONFIG_SH_R7780MP |
16 | static int mask_pos[] = {12, 11, 9, 14, 15, 8, 13, 6, 5, 4, 3, 2, 0, 0, 1, 0}; | 17 | static int mask_pos[] = {12, 11, 9, 14, 15, 8, 13, 6, 5, 4, 3, 2, 0, 0, 1, 0}; |
@@ -32,7 +33,7 @@ static void disable_r7780rp_irq(unsigned int irq) | |||
32 | } | 33 | } |
33 | 34 | ||
34 | static struct irq_chip r7780rp_irq_chip __read_mostly = { | 35 | static struct irq_chip r7780rp_irq_chip __read_mostly = { |
35 | .name = "r7780rp", | 36 | .name = "R7780RP", |
36 | .mask = disable_r7780rp_irq, | 37 | .mask = disable_r7780rp_irq, |
37 | .unmask = enable_r7780rp_irq, | 38 | .unmask = enable_r7780rp_irq, |
38 | .mask_ack = disable_r7780rp_irq, | 39 | .mask_ack = disable_r7780rp_irq, |
@@ -47,8 +48,8 @@ void __init init_r7780rp_IRQ(void) | |||
47 | 48 | ||
48 | for (i = 0; i < 15; i++) { | 49 | for (i = 0; i < 15; i++) { |
49 | disable_irq_nosync(i); | 50 | disable_irq_nosync(i); |
50 | set_irq_chip_and_handler(i, &r7780rp_irq_chip, | 51 | set_irq_chip_and_handler_name(i, &r7780rp_irq_chip, |
51 | handle_level_irq); | 52 | handle_level_irq, "level"); |
52 | enable_r7780rp_irq(i); | 53 | enable_r7780rp_irq(i); |
53 | } | 54 | } |
54 | } | 55 | } |
diff --git a/arch/sh/boards/renesas/r7780rp/setup.c b/arch/sh/boards/renesas/r7780rp/setup.c index b941aa0aa34e..c331caeb694b 100644 --- a/arch/sh/boards/renesas/r7780rp/setup.c +++ b/arch/sh/boards/renesas/r7780rp/setup.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
15 | #include <asm/machvec.h> | 15 | #include <asm/machvec.h> |
16 | #include <asm/r7780rp/r7780rp.h> | 16 | #include <asm/r7780rp.h> |
17 | #include <asm/clock.h> | 17 | #include <asm/clock.h> |
18 | #include <asm/io.h> | 18 | #include <asm/io.h> |
19 | 19 | ||
diff --git a/arch/sh/boards/renesas/rts7751r2d/io.c b/arch/sh/boards/renesas/rts7751r2d/io.c index 135aa0b5e62d..f2507a804979 100644 --- a/arch/sh/boards/renesas/rts7751r2d/io.c +++ b/arch/sh/boards/renesas/rts7751r2d/io.c | |||
@@ -11,8 +11,8 @@ | |||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/types.h> | 12 | #include <linux/types.h> |
13 | #include <linux/pci.h> | 13 | #include <linux/pci.h> |
14 | #include <asm/rts7751r2d/rts7751r2d.h> | 14 | #include <linux/io.h> |
15 | #include <asm/io.h> | 15 | #include <asm/rts7751r2d.h> |
16 | #include <asm/addrspace.h> | 16 | #include <asm/addrspace.h> |
17 | 17 | ||
18 | /* | 18 | /* |
diff --git a/arch/sh/boards/renesas/rts7751r2d/irq.c b/arch/sh/boards/renesas/rts7751r2d/irq.c index c915e7a3693a..cb0eb20d1b43 100644 --- a/arch/sh/boards/renesas/rts7751r2d/irq.c +++ b/arch/sh/boards/renesas/rts7751r2d/irq.c | |||
@@ -8,12 +8,10 @@ | |||
8 | * Modified for RTS7751R2D by | 8 | * Modified for RTS7751R2D by |
9 | * Atom Create Engineering Co., Ltd. 2002. | 9 | * Atom Create Engineering Co., Ltd. 2002. |
10 | */ | 10 | */ |
11 | |||
12 | #include <linux/init.h> | 11 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 12 | #include <linux/irq.h> |
14 | #include <asm/io.h> | 13 | #include <linux/io.h> |
15 | #include <asm/irq.h> | 14 | #include <asm/rts7751r2d.h> |
16 | #include <asm/rts7751r2d/rts7751r2d.h> | ||
17 | 15 | ||
18 | #if defined(CONFIG_RTS7751R2D_REV11) | 16 | #if defined(CONFIG_RTS7751R2D_REV11) |
19 | static int mask_pos[] = {11, 9, 8, 12, 10, 6, 5, 4, 7, 14, 13, 0, 0, 0, 0}; | 17 | static int mask_pos[] = {11, 9, 8, 12, 10, 6, 5, 4, 7, 14, 13, 0, 0, 0, 0}; |
diff --git a/arch/sh/boards/renesas/rts7751r2d/led.c b/arch/sh/boards/renesas/rts7751r2d/led.c index a7ce66c1e4f0..509f548bdce0 100644 --- a/arch/sh/boards/renesas/rts7751r2d/led.c +++ b/arch/sh/boards/renesas/rts7751r2d/led.c | |||
@@ -8,13 +8,9 @@ | |||
8 | * | 8 | * |
9 | * This file contains Renesas Technology Sales RTS7751R2D specific LED code. | 9 | * This file contains Renesas Technology Sales RTS7751R2D specific LED code. |
10 | */ | 10 | */ |
11 | 11 | #include <linux/io.h> | |
12 | #include <asm/io.h> | ||
13 | #include <asm/rts7751r2d/rts7751r2d.h> | ||
14 | |||
15 | #ifdef CONFIG_HEARTBEAT | ||
16 | |||
17 | #include <linux/sched.h> | 12 | #include <linux/sched.h> |
13 | #include <asm/rts7751r2d.h> | ||
18 | 14 | ||
19 | /* Cycle the LED's in the clasic Knightriger/Sun pattern */ | 15 | /* Cycle the LED's in the clasic Knightriger/Sun pattern */ |
20 | void heartbeat_rts7751r2d(void) | 16 | void heartbeat_rts7751r2d(void) |
@@ -46,10 +42,3 @@ void heartbeat_rts7751r2d(void) | |||
46 | else | 42 | else |
47 | bit--; | 43 | bit--; |
48 | } | 44 | } |
49 | #endif /* CONFIG_HEARTBEAT */ | ||
50 | |||
51 | void rts7751r2d_led(unsigned short value) | ||
52 | { | ||
53 | ctrl_outw(value, PA_OUTPORT); | ||
54 | } | ||
55 | |||
diff --git a/arch/sh/boards/renesas/rts7751r2d/setup.c b/arch/sh/boards/renesas/rts7751r2d/setup.c index 20597a6e6702..5c042d35ec91 100644 --- a/arch/sh/boards/renesas/rts7751r2d/setup.c +++ b/arch/sh/boards/renesas/rts7751r2d/setup.c | |||
@@ -12,9 +12,9 @@ | |||
12 | #include <linux/platform_device.h> | 12 | #include <linux/platform_device.h> |
13 | #include <linux/serial_8250.h> | 13 | #include <linux/serial_8250.h> |
14 | #include <linux/pm.h> | 14 | #include <linux/pm.h> |
15 | #include <asm/io.h> | ||
16 | #include <asm/machvec.h> | 15 | #include <asm/machvec.h> |
17 | #include <asm/mach/rts7751r2d.h> | 16 | #include <asm/mach/rts7751r2d.h> |
17 | #include <asm/io.h> | ||
18 | #include <asm/voyagergx.h> | 18 | #include <asm/voyagergx.h> |
19 | 19 | ||
20 | extern void heartbeat_rts7751r2d(void); | 20 | extern void heartbeat_rts7751r2d(void); |
diff --git a/arch/sh/boards/renesas/sh7710voipgw/setup.c b/arch/sh/boards/renesas/sh7710voipgw/setup.c index e57e7afab8c6..180810b12107 100644 --- a/arch/sh/boards/renesas/sh7710voipgw/setup.c +++ b/arch/sh/boards/renesas/sh7710voipgw/setup.c | |||
@@ -13,6 +13,51 @@ | |||
13 | #include <asm/io.h> | 13 | #include <asm/io.h> |
14 | #include <asm/irq.h> | 14 | #include <asm/irq.h> |
15 | 15 | ||
16 | static struct ipr_data sh7710voipgw_ipr_map[] = { | ||
17 | { TIMER2_IRQ, TIMER2_IPR_ADDR, TIMER2_IPR_POS, TIMER2_PRIORITY }, | ||
18 | { WDT_IRQ, WDT_IPR_ADDR, WDT_IPR_POS, WDT_PRIORITY }, | ||
19 | |||
20 | /* SCIF0 */ | ||
21 | { SCIF0_ERI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY }, | ||
22 | { SCIF0_RXI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY }, | ||
23 | { SCIF0_BRI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY }, | ||
24 | { SCIF0_TXI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY }, | ||
25 | |||
26 | /* DMAC-1 */ | ||
27 | { DMTE0_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, | ||
28 | { DMTE1_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, | ||
29 | { DMTE2_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, | ||
30 | { DMTE3_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, | ||
31 | |||
32 | /* DMAC-2 */ | ||
33 | { DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY }, | ||
34 | { DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY }, | ||
35 | |||
36 | /* IPSEC */ | ||
37 | { IPSEC_IRQ, IPSEC_IPR_ADDR, IPSEC_IPR_POS, IPSEC_PRIORITY }, | ||
38 | |||
39 | /* EDMAC */ | ||
40 | { EDMAC0_IRQ, EDMAC0_IPR_ADDR, EDMAC0_IPR_POS, EDMAC0_PRIORITY }, | ||
41 | { EDMAC1_IRQ, EDMAC1_IPR_ADDR, EDMAC1_IPR_POS, EDMAC1_PRIORITY }, | ||
42 | { EDMAC2_IRQ, EDMAC2_IPR_ADDR, EDMAC2_IPR_POS, EDMAC2_PRIORITY }, | ||
43 | |||
44 | /* SIOF0 */ | ||
45 | { SIOF0_ERI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY }, | ||
46 | { SIOF0_TXI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY }, | ||
47 | { SIOF0_RXI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY }, | ||
48 | { SIOF0_CCI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY }, | ||
49 | |||
50 | /* SIOF1 */ | ||
51 | { SIOF1_ERI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, SIOF1_PRIORITY }, | ||
52 | { SIOF1_TXI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, SIOF1_PRIORITY }, | ||
53 | { SIOF1_RXI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, SIOF1_PRIORITY }, | ||
54 | { SIOF1_CCI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, SIOF1_PRIORITY }, | ||
55 | |||
56 | /* SLIC IRQ's */ | ||
57 | { IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, IRQ1_PRIORITY }, | ||
58 | { IRQ2_IRQ, IRQ2_IPR_ADDR, IRQ2_IPR_POS, IRQ2_PRIORITY }, | ||
59 | }; | ||
60 | |||
16 | /* | 61 | /* |
17 | * Initialize IRQ setting | 62 | * Initialize IRQ setting |
18 | */ | 63 | */ |
@@ -37,65 +82,7 @@ static void __init sh7710voipgw_init_irq(void) | |||
37 | */ | 82 | */ |
38 | ctrl_outw(0x2aa, INTC_ICR1); | 83 | ctrl_outw(0x2aa, INTC_ICR1); |
39 | 84 | ||
40 | /* Now make IPR interrupts */ | 85 | make_ipr_irq(sh7710voipgw_ipr_map, ARRAY_SIZE(sh7710voipgw_ipr_map)); |
41 | make_ipr_irq(TIMER2_IRQ, TIMER2_IPR_ADDR, | ||
42 | TIMER2_IPR_POS, TIMER2_PRIORITY); | ||
43 | make_ipr_irq(WDT_IRQ, WDT_IPR_ADDR, WDT_IPR_POS, WDT_PRIORITY); | ||
44 | |||
45 | /* SCIF0 */ | ||
46 | make_ipr_irq(SCIF0_ERI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, | ||
47 | SCIF0_PRIORITY); | ||
48 | make_ipr_irq(SCIF0_RXI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, | ||
49 | SCIF0_PRIORITY); | ||
50 | make_ipr_irq(SCIF0_BRI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, | ||
51 | SCIF0_PRIORITY); | ||
52 | make_ipr_irq(SCIF0_TXI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, | ||
53 | SCIF0_PRIORITY); | ||
54 | |||
55 | /* DMAC-1 */ | ||
56 | make_ipr_irq(DMTE0_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | ||
57 | make_ipr_irq(DMTE1_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | ||
58 | make_ipr_irq(DMTE2_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | ||
59 | make_ipr_irq(DMTE3_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | ||
60 | |||
61 | /* DMAC-2 */ | ||
62 | make_ipr_irq(DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY); | ||
63 | make_ipr_irq(DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY); | ||
64 | |||
65 | /* IPSEC */ | ||
66 | make_ipr_irq(IPSEC_IRQ, IPSEC_IPR_ADDR, IPSEC_IPR_POS, IPSEC_PRIORITY); | ||
67 | |||
68 | /* EDMAC */ | ||
69 | make_ipr_irq(EDMAC0_IRQ, EDMAC0_IPR_ADDR, EDMAC0_IPR_POS, | ||
70 | EDMAC0_PRIORITY); | ||
71 | make_ipr_irq(EDMAC1_IRQ, EDMAC1_IPR_ADDR, EDMAC1_IPR_POS, | ||
72 | EDMAC1_PRIORITY); | ||
73 | make_ipr_irq(EDMAC2_IRQ, EDMAC2_IPR_ADDR, EDMAC2_IPR_POS, | ||
74 | EDMAC2_PRIORITY); | ||
75 | |||
76 | /* SIOF0 */ | ||
77 | make_ipr_irq(SIOF0_ERI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, | ||
78 | SIOF0_PRIORITY); | ||
79 | make_ipr_irq(SIOF0_TXI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, | ||
80 | SIOF0_PRIORITY); | ||
81 | make_ipr_irq(SIOF0_RXI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, | ||
82 | SIOF0_PRIORITY); | ||
83 | make_ipr_irq(SIOF0_CCI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, | ||
84 | SIOF0_PRIORITY); | ||
85 | |||
86 | /* SIOF1 */ | ||
87 | make_ipr_irq(SIOF1_ERI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, | ||
88 | SIOF1_PRIORITY); | ||
89 | make_ipr_irq(SIOF1_TXI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, | ||
90 | SIOF1_PRIORITY); | ||
91 | make_ipr_irq(SIOF1_RXI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, | ||
92 | SIOF1_PRIORITY); | ||
93 | make_ipr_irq(SIOF1_CCI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, | ||
94 | SIOF1_PRIORITY); | ||
95 | |||
96 | /* SLIC IRQ's */ | ||
97 | make_ipr_irq(IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, IRQ1_PRIORITY); | ||
98 | make_ipr_irq(IRQ2_IRQ, IRQ2_IPR_ADDR, IRQ2_IPR_POS, IRQ2_PRIORITY); | ||
99 | } | 86 | } |
100 | 87 | ||
101 | /* | 88 | /* |
diff --git a/arch/sh/boards/se/7300/irq.c b/arch/sh/boards/se/7300/irq.c index ad1034f98a29..1279d776d60f 100644 --- a/arch/sh/boards/se/7300/irq.c +++ b/arch/sh/boards/se/7300/irq.c | |||
@@ -13,6 +13,17 @@ | |||
13 | #include <asm/io.h> | 13 | #include <asm/io.h> |
14 | #include <asm/se7300.h> | 14 | #include <asm/se7300.h> |
15 | 15 | ||
16 | static struct ipr_data se7300_ipr_map[] = { | ||
17 | /* PC_IRQ[0-3] -> IRQ0 (32) */ | ||
18 | { IRQ0_IRQ, IRQ0_IPR_ADDR, IRQ0_IPR_POS, 0x0f - IRQ0_IRQ }, | ||
19 | /* A_IRQ[0-3] -> IRQ1 (33) */ | ||
20 | { IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, 0x0f - IRQ1_IRQ }, | ||
21 | { SIOF0_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY }, | ||
22 | { DMTE2_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY }, | ||
23 | { DMTE3_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY }, | ||
24 | { VIO_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY }, | ||
25 | }; | ||
26 | |||
16 | /* | 27 | /* |
17 | * Initialize IRQ setting | 28 | * Initialize IRQ setting |
18 | */ | 29 | */ |
@@ -23,14 +34,7 @@ init_7300se_IRQ(void) | |||
23 | ctrl_outw(0xa000, INTC_ICR1); /* IRQ mode; IRQ0,1 enable. */ | 34 | ctrl_outw(0xa000, INTC_ICR1); /* IRQ mode; IRQ0,1 enable. */ |
24 | ctrl_outw(0x0000, PORT_PFCR); /* use F for IRQ[3:0] and SIU. */ | 35 | ctrl_outw(0x0000, PORT_PFCR); /* use F for IRQ[3:0] and SIU. */ |
25 | 36 | ||
26 | /* PC_IRQ[0-3] -> IRQ0 (32) */ | 37 | make_ipr_irq(se7300_ipr_map, ARRAY_SIZE(se7300_ipr_map)); |
27 | make_ipr_irq(IRQ0_IRQ, IRQ0_IPR_ADDR, IRQ0_IPR_POS, 0x0f - IRQ0_IRQ); | ||
28 | /* A_IRQ[0-3] -> IRQ1 (33) */ | ||
29 | make_ipr_irq(IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, 0x0f - IRQ1_IRQ); | ||
30 | make_ipr_irq(SIOF0_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY); | ||
31 | make_ipr_irq(DMTE2_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY); | ||
32 | make_ipr_irq(DMTE3_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY); | ||
33 | make_ipr_irq(VIO_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY); | ||
34 | 38 | ||
35 | ctrl_outw(0x2000, PA_MRSHPC + 0x0c); /* mrshpc irq enable */ | 39 | ctrl_outw(0x2000, PA_MRSHPC + 0x0c); /* mrshpc irq enable */ |
36 | } | 40 | } |
diff --git a/arch/sh/boards/se/73180/irq.c b/arch/sh/boards/se/73180/irq.c index 2c62b8ea350e..e7200c56bb45 100644 --- a/arch/sh/boards/se/73180/irq.c +++ b/arch/sh/boards/se/73180/irq.c | |||
@@ -87,13 +87,38 @@ shmse_irq_demux(int irq) | |||
87 | return irq; | 87 | return irq; |
88 | } | 88 | } |
89 | 89 | ||
90 | static struct ipr_data se73180_siof0_ipr_map[] = { | ||
91 | { SIOF0_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY }, | ||
92 | }; | ||
93 | static struct ipr_data se73180_vpu_ipr_map[] = { | ||
94 | { VPU_IRQ, VPU_IPR_ADDR, VPU_IPR_POS, 8 }, | ||
95 | }; | ||
96 | static struct ipr_data se73180_other_ipr_map[] = { | ||
97 | { DMTE2_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY }, | ||
98 | { DMTE3_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY }, | ||
99 | { DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY }, | ||
100 | { IIC0_ALI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, IIC0_PRIORITY }, | ||
101 | { IIC0_TACKI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, IIC0_PRIORITY }, | ||
102 | { IIC0_WAITI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, IIC0_PRIORITY }, | ||
103 | { IIC0_DTEI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, IIC0_PRIORITY }, | ||
104 | { SIOF0_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY }, | ||
105 | { SIU_IRQ, SIU_IPR_ADDR, SIU_IPR_POS, SIU_PRIORITY }, | ||
106 | |||
107 | /* VIO interrupt */ | ||
108 | { CEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY }, | ||
109 | { BEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY }, | ||
110 | { VEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY }, | ||
111 | |||
112 | { LCDC_IRQ, LCDC_IPR_ADDR, LCDC_IPR_POS, LCDC_PRIORITY }, | ||
113 | }; | ||
114 | |||
90 | /* | 115 | /* |
91 | * Initialize IRQ setting | 116 | * Initialize IRQ setting |
92 | */ | 117 | */ |
93 | void __init | 118 | void __init |
94 | init_73180se_IRQ(void) | 119 | init_73180se_IRQ(void) |
95 | { | 120 | { |
96 | make_ipr_irq(SIOF0_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY); | 121 | make_ipr_irq(se73180_siof0_ipr_map, ARRAY_SIZE(se73180_siof0_ipr_map)); |
97 | 122 | ||
98 | ctrl_outw(0x2000, 0xb03fffec); /* mrshpc irq enable */ | 123 | ctrl_outw(0x2000, 0xb03fffec); /* mrshpc irq enable */ |
99 | ctrl_outw(0x2000, 0xb07fffec); /* mrshpc irq enable */ | 124 | ctrl_outw(0x2000, 0xb07fffec); /* mrshpc irq enable */ |
@@ -101,27 +126,11 @@ init_73180se_IRQ(void) | |||
101 | ctrl_outw(2 << ((7 - 5) * 2), INTC_ICR1); /* low-level irq */ | 126 | ctrl_outw(2 << ((7 - 5) * 2), INTC_ICR1); /* low-level irq */ |
102 | make_intreq_irq(10); | 127 | make_intreq_irq(10); |
103 | 128 | ||
104 | make_ipr_irq(VPU_IRQ, VPU_IPR_ADDR, VPU_IPR_POS, 8); | 129 | make_ipr_irq(se73180_vpu_ipr_map, ARRAY_SIZE(se73180_vpu_ipr_map)); |
105 | 130 | ||
106 | ctrl_outb(0x0f, INTC_IMCR5); /* enable SCIF IRQ */ | 131 | ctrl_outb(0x0f, INTC_IMCR5); /* enable SCIF IRQ */ |
107 | 132 | ||
108 | make_ipr_irq(DMTE2_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY); | 133 | make_ipr_irq(se73180_other_ipr_map, ARRAY_SIZE(se73180_other_ipr_map)); |
109 | make_ipr_irq(DMTE3_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY); | ||
110 | make_ipr_irq(DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY); | ||
111 | make_ipr_irq(IIC0_ALI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, IIC0_PRIORITY); | ||
112 | make_ipr_irq(IIC0_TACKI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, | ||
113 | IIC0_PRIORITY); | ||
114 | make_ipr_irq(IIC0_WAITI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, | ||
115 | IIC0_PRIORITY); | ||
116 | make_ipr_irq(IIC0_DTEI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, IIC0_PRIORITY); | ||
117 | make_ipr_irq(SIOF0_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY); | ||
118 | make_ipr_irq(SIU_IRQ, SIU_IPR_ADDR, SIU_IPR_POS, SIU_PRIORITY); | ||
119 | |||
120 | /* VIO interrupt */ | ||
121 | make_ipr_irq(CEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY); | ||
122 | make_ipr_irq(BEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY); | ||
123 | make_ipr_irq(VEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY); | ||
124 | 134 | ||
125 | make_ipr_irq(LCDC_IRQ, LCDC_IPR_ADDR, LCDC_IPR_POS, LCDC_PRIORITY); | ||
126 | ctrl_outw(0x2000, PA_MRSHPC + 0x0c); /* mrshpc irq enable */ | 135 | ctrl_outw(0x2000, PA_MRSHPC + 0x0c); /* mrshpc irq enable */ |
127 | } | 136 | } |
diff --git a/arch/sh/boards/se/7343/irq.c b/arch/sh/boards/se/7343/irq.c index 288b62f59419..360153ecc55b 100644 --- a/arch/sh/boards/se/7343/irq.c +++ b/arch/sh/boards/se/7343/irq.c | |||
@@ -102,6 +102,51 @@ shmse_irq_demux(int irq) | |||
102 | static struct irqaction irq5 = { no_action, 0, CPU_MASK_NONE, "IRQ5-cascade", | 102 | static struct irqaction irq5 = { no_action, 0, CPU_MASK_NONE, "IRQ5-cascade", |
103 | NULL, NULL}; | 103 | NULL, NULL}; |
104 | 104 | ||
105 | static struct ipr_data se7343_irq5_ipr_map[] = { | ||
106 | { IRQ5_IRQ, IRQ5_IPR_ADDR+2, IRQ5_IPR_POS, IRQ5_PRIORITY }, | ||
107 | }; | ||
108 | static struct ipr_data se7343_siof0_vpu_ipr_map[] = { | ||
109 | { SIOF0_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY }, | ||
110 | { VPU_IRQ, VPU_IPR_ADDR, VPU_IPR_POS, 8 }, | ||
111 | }; | ||
112 | static struct ipr_data se7343_other_ipr_map[] = { | ||
113 | { DMTE0_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY }, | ||
114 | { DMTE1_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY }, | ||
115 | { DMTE2_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY }, | ||
116 | { DMTE3_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY }, | ||
117 | { DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY }, | ||
118 | { DMTE5_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY }, | ||
119 | |||
120 | /* I2C block */ | ||
121 | { IIC0_ALI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, IIC0_PRIORITY }, | ||
122 | { IIC0_TACKI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, IIC0_PRIORITY }, | ||
123 | { IIC0_WAITI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, IIC0_PRIORITY }, | ||
124 | { IIC0_DTEI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, IIC0_PRIORITY }, | ||
125 | |||
126 | { IIC1_ALI_IRQ, IIC1_IPR_ADDR, IIC1_IPR_POS, IIC1_PRIORITY }, | ||
127 | { IIC1_TACKI_IRQ, IIC1_IPR_ADDR, IIC1_IPR_POS, IIC1_PRIORITY }, | ||
128 | { IIC1_WAITI_IRQ, IIC1_IPR_ADDR, IIC1_IPR_POS, IIC1_PRIORITY }, | ||
129 | { IIC1_DTEI_IRQ, IIC1_IPR_ADDR, IIC1_IPR_POS, IIC1_PRIORITY }, | ||
130 | |||
131 | /* SIOF */ | ||
132 | { SIOF0_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY }, | ||
133 | |||
134 | /* SIU */ | ||
135 | { SIU_IRQ, SIU_IPR_ADDR, SIU_IPR_POS, SIU_PRIORITY }, | ||
136 | |||
137 | /* VIO interrupt */ | ||
138 | { CEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY }, | ||
139 | { BEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY }, | ||
140 | { VEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY }, | ||
141 | |||
142 | /*MFI interrupt*/ | ||
143 | |||
144 | { MFI_IRQ, MFI_IPR_ADDR, MFI_IPR_POS, MFI_PRIORITY }, | ||
145 | |||
146 | /* LCD controller */ | ||
147 | { LCDC_IRQ, LCDC_IPR_ADDR, LCDC_IPR_POS, LCDC_PRIORITY }, | ||
148 | }; | ||
149 | |||
105 | /* | 150 | /* |
106 | * Initialize IRQ setting | 151 | * Initialize IRQ setting |
107 | */ | 152 | */ |
@@ -138,54 +183,17 @@ init_7343se_IRQ(void) | |||
138 | /* Setup all external interrupts to be active low */ | 183 | /* Setup all external interrupts to be active low */ |
139 | ctrl_outw(0xaaaa, INTC_ICR1); | 184 | ctrl_outw(0xaaaa, INTC_ICR1); |
140 | 185 | ||
141 | make_ipr_irq(IRQ5_IRQ, IRQ5_IPR_ADDR+2, IRQ5_IPR_POS, IRQ5_PRIORITY); | 186 | make_ipr_irq(se7343_irq5_ipr_map, ARRAY_SIZE(se7343_irq5_ipr_map)); |
187 | |||
142 | setup_irq(IRQ5_IRQ, &irq5); | 188 | setup_irq(IRQ5_IRQ, &irq5); |
143 | /* Set port control to use IRQ5 */ | 189 | /* Set port control to use IRQ5 */ |
144 | *(u16 *)0xA4050108 &= ~0xc; | 190 | *(u16 *)0xA4050108 &= ~0xc; |
145 | 191 | ||
146 | make_ipr_irq(SIOF0_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY); | 192 | make_ipr_irq(se7343_siof0_vpu_ipr_map, ARRAY_SIZE(se7343_siof0_vpu_ipr_map)); |
147 | make_ipr_irq(VPU_IRQ, VPU_IPR_ADDR, VPU_IPR_POS, 8); | ||
148 | 193 | ||
149 | ctrl_outb(0x0f, INTC_IMCR5); /* enable SCIF IRQ */ | 194 | ctrl_outb(0x0f, INTC_IMCR5); /* enable SCIF IRQ */ |
150 | 195 | ||
151 | make_ipr_irq(DMTE0_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY); | 196 | make_ipr_irq(se7343_other_ipr_map, ARRAY_SIZE(se7343_other_ipr_map)); |
152 | make_ipr_irq(DMTE1_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY); | ||
153 | make_ipr_irq(DMTE2_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY); | ||
154 | make_ipr_irq(DMTE3_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY); | ||
155 | make_ipr_irq(DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY); | ||
156 | make_ipr_irq(DMTE5_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY); | ||
157 | |||
158 | /* I2C block */ | ||
159 | make_ipr_irq(IIC0_ALI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, IIC0_PRIORITY); | ||
160 | make_ipr_irq(IIC0_TACKI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, | ||
161 | IIC0_PRIORITY); | ||
162 | make_ipr_irq(IIC0_WAITI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, | ||
163 | IIC0_PRIORITY); | ||
164 | make_ipr_irq(IIC0_DTEI_IRQ, IIC0_IPR_ADDR, IIC0_IPR_POS, IIC0_PRIORITY); | ||
165 | |||
166 | make_ipr_irq(IIC1_ALI_IRQ, IIC1_IPR_ADDR, IIC1_IPR_POS, IIC1_PRIORITY); | ||
167 | make_ipr_irq(IIC1_TACKI_IRQ, IIC1_IPR_ADDR, IIC1_IPR_POS, | ||
168 | IIC1_PRIORITY); | ||
169 | make_ipr_irq(IIC1_WAITI_IRQ, IIC1_IPR_ADDR, IIC1_IPR_POS, | ||
170 | IIC1_PRIORITY); | ||
171 | make_ipr_irq(IIC1_DTEI_IRQ, IIC1_IPR_ADDR, IIC1_IPR_POS, IIC1_PRIORITY); | ||
172 | |||
173 | /* SIOF */ | ||
174 | make_ipr_irq(SIOF0_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY); | ||
175 | 197 | ||
176 | /* SIU */ | ||
177 | make_ipr_irq(SIU_IRQ, SIU_IPR_ADDR, SIU_IPR_POS, SIU_PRIORITY); | ||
178 | |||
179 | /* VIO interrupt */ | ||
180 | make_ipr_irq(CEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY); | ||
181 | make_ipr_irq(BEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY); | ||
182 | make_ipr_irq(VEU_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY); | ||
183 | |||
184 | /*MFI interrupt*/ | ||
185 | |||
186 | make_ipr_irq(MFI_IRQ, MFI_IPR_ADDR, MFI_IPR_POS, MFI_PRIORITY); | ||
187 | |||
188 | /* LCD controller */ | ||
189 | make_ipr_irq(LCDC_IRQ, LCDC_IPR_ADDR, LCDC_IPR_POS, LCDC_PRIORITY); | ||
190 | ctrl_outw(0x2000, PA_MRSHPC + 0x0c); /* mrshpc irq enable */ | 198 | ctrl_outw(0x2000, PA_MRSHPC + 0x0c); /* mrshpc irq enable */ |
191 | } | 199 | } |
diff --git a/arch/sh/boards/se/770x/irq.c b/arch/sh/boards/se/770x/irq.c index cff6700bbafd..fcd7cd7fa05f 100644 --- a/arch/sh/boards/se/770x/irq.c +++ b/arch/sh/boards/se/770x/irq.c | |||
@@ -13,6 +13,48 @@ | |||
13 | #include <asm/io.h> | 13 | #include <asm/io.h> |
14 | #include <asm/se.h> | 14 | #include <asm/se.h> |
15 | 15 | ||
16 | static struct ipr_data se770x_ipr_map[] = { | ||
17 | #if defined(CONFIG_CPU_SUBTYPE_SH7705) | ||
18 | /* This is default value */ | ||
19 | { 0xf-0x2, BCR_ILCRA, 2, 0x2 }, | ||
20 | { 0xf-0xa, BCR_ILCRA, 1, 0xa }, | ||
21 | { 0xf-0x5, BCR_ILCRB, 0, 0x5 }, | ||
22 | { 0xf-0x8, BCR_ILCRC, 1, 0x8 }, | ||
23 | { 0xf-0xc, BCR_ILCRC, 0, 0xc }, | ||
24 | { 0xf-0xe, BCR_ILCRD, 3, 0xe }, | ||
25 | { 0xf-0x3, BCR_ILCRD, 1, 0x3 }, /* LAN */ | ||
26 | { 0xf-0xd, BCR_ILCRE, 2, 0xd }, | ||
27 | { 0xf-0x9, BCR_ILCRE, 1, 0x9 }, | ||
28 | { 0xf-0x1, BCR_ILCRE, 0, 0x1 }, | ||
29 | { 0xf-0xf, BCR_ILCRF, 3, 0xf }, | ||
30 | { 0xf-0xb, BCR_ILCRF, 1, 0xb }, | ||
31 | { 0xf-0x7, BCR_ILCRG, 3, 0x7 }, | ||
32 | { 0xf-0x6, BCR_ILCRG, 2, 0x6 }, | ||
33 | { 0xf-0x4, BCR_ILCRG, 1, 0x4 }, | ||
34 | #else | ||
35 | { 14, BCR_ILCRA, 2, 0x0f-14 }, | ||
36 | { 12, BCR_ILCRA, 1, 0x0f-12 }, | ||
37 | { 8, BCR_ILCRB, 1, 0x0f- 8 }, | ||
38 | { 6, BCR_ILCRC, 3, 0x0f- 6 }, | ||
39 | { 5, BCR_ILCRC, 2, 0x0f- 5 }, | ||
40 | { 4, BCR_ILCRC, 1, 0x0f- 4 }, | ||
41 | { 3, BCR_ILCRC, 0, 0x0f- 3 }, | ||
42 | { 1, BCR_ILCRD, 3, 0x0f- 1 }, | ||
43 | |||
44 | { 10, BCR_ILCRD, 1, 0x0f-10 }, /* LAN */ | ||
45 | |||
46 | { 0, BCR_ILCRE, 3, 0x0f- 0 }, /* PCIRQ3 */ | ||
47 | { 11, BCR_ILCRE, 2, 0x0f-11 }, /* PCIRQ2 */ | ||
48 | { 9, BCR_ILCRE, 1, 0x0f- 9 }, /* PCIRQ1 */ | ||
49 | { 7, BCR_ILCRE, 0, 0x0f- 7 }, /* PCIRQ0 */ | ||
50 | |||
51 | /* #2, #13 are allocated for SLOT IRQ #1 and #2 (for now) */ | ||
52 | /* NOTE: #2 and #13 are not used on PC */ | ||
53 | { 13, BCR_ILCRG, 1, 0x0f-13 }, /* SLOTIRQ2 */ | ||
54 | { 2, BCR_ILCRG, 0, 0x0f- 2 }, /* SLOTIRQ1 */ | ||
55 | #endif | ||
56 | }; | ||
57 | |||
16 | /* | 58 | /* |
17 | * Initialize IRQ setting | 59 | * Initialize IRQ setting |
18 | */ | 60 | */ |
@@ -38,42 +80,6 @@ void __init init_se_IRQ(void) | |||
38 | ctrl_outw(0, BCR_ILCRE); | 80 | ctrl_outw(0, BCR_ILCRE); |
39 | ctrl_outw(0, BCR_ILCRF); | 81 | ctrl_outw(0, BCR_ILCRF); |
40 | ctrl_outw(0, BCR_ILCRG); | 82 | ctrl_outw(0, BCR_ILCRG); |
41 | /* This is default value */ | ||
42 | make_ipr_irq(0xf-0x2, BCR_ILCRA, 2, 0x2); | ||
43 | make_ipr_irq(0xf-0xa, BCR_ILCRA, 1, 0xa); | ||
44 | make_ipr_irq(0xf-0x5, BCR_ILCRB, 0, 0x5); | ||
45 | make_ipr_irq(0xf-0x8, BCR_ILCRC, 1, 0x8); | ||
46 | make_ipr_irq(0xf-0xc, BCR_ILCRC, 0, 0xc); | ||
47 | make_ipr_irq(0xf-0xe, BCR_ILCRD, 3, 0xe); | ||
48 | make_ipr_irq(0xf-0x3, BCR_ILCRD, 1, 0x3); /* LAN */ | ||
49 | make_ipr_irq(0xf-0xd, BCR_ILCRE, 2, 0xd); | ||
50 | make_ipr_irq(0xf-0x9, BCR_ILCRE, 1, 0x9); | ||
51 | make_ipr_irq(0xf-0x1, BCR_ILCRE, 0, 0x1); | ||
52 | make_ipr_irq(0xf-0xf, BCR_ILCRF, 3, 0xf); | ||
53 | make_ipr_irq(0xf-0xb, BCR_ILCRF, 1, 0xb); | ||
54 | make_ipr_irq(0xf-0x7, BCR_ILCRG, 3, 0x7); | ||
55 | make_ipr_irq(0xf-0x6, BCR_ILCRG, 2, 0x6); | ||
56 | make_ipr_irq(0xf-0x4, BCR_ILCRG, 1, 0x4); | ||
57 | #else | ||
58 | make_ipr_irq(14, BCR_ILCRA, 2, 0x0f-14); | ||
59 | make_ipr_irq(12, BCR_ILCRA, 1, 0x0f-12); | ||
60 | make_ipr_irq( 8, BCR_ILCRB, 1, 0x0f- 8); | ||
61 | make_ipr_irq( 6, BCR_ILCRC, 3, 0x0f- 6); | ||
62 | make_ipr_irq( 5, BCR_ILCRC, 2, 0x0f- 5); | ||
63 | make_ipr_irq( 4, BCR_ILCRC, 1, 0x0f- 4); | ||
64 | make_ipr_irq( 3, BCR_ILCRC, 0, 0x0f- 3); | ||
65 | make_ipr_irq( 1, BCR_ILCRD, 3, 0x0f- 1); | ||
66 | |||
67 | make_ipr_irq(10, BCR_ILCRD, 1, 0x0f-10); /* LAN */ | ||
68 | |||
69 | make_ipr_irq( 0, BCR_ILCRE, 3, 0x0f- 0); /* PCIRQ3 */ | ||
70 | make_ipr_irq(11, BCR_ILCRE, 2, 0x0f-11); /* PCIRQ2 */ | ||
71 | make_ipr_irq( 9, BCR_ILCRE, 1, 0x0f- 9); /* PCIRQ1 */ | ||
72 | make_ipr_irq( 7, BCR_ILCRE, 0, 0x0f- 7); /* PCIRQ0 */ | ||
73 | |||
74 | /* #2, #13 are allocated for SLOT IRQ #1 and #2 (for now) */ | ||
75 | /* NOTE: #2 and #13 are not used on PC */ | ||
76 | make_ipr_irq(13, BCR_ILCRG, 1, 0x0f-13); /* SLOTIRQ2 */ | ||
77 | make_ipr_irq( 2, BCR_ILCRG, 0, 0x0f- 2); /* SLOTIRQ1 */ | ||
78 | #endif | 83 | #endif |
84 | make_ipr_irq(se770x_ipr_map, ARRAY_SIZE(se770x_ipr_map)); | ||
79 | } | 85 | } |
diff --git a/arch/sh/boards/se/7751/irq.c b/arch/sh/boards/se/7751/irq.c index c607b0a48479..e4c63a48296c 100644 --- a/arch/sh/boards/se/7751/irq.c +++ b/arch/sh/boards/se/7751/irq.c | |||
@@ -14,53 +14,50 @@ | |||
14 | #include <asm/irq.h> | 14 | #include <asm/irq.h> |
15 | #include <asm/se7751.h> | 15 | #include <asm/se7751.h> |
16 | 16 | ||
17 | /* | 17 | static struct ipr_data se7751_ipr_map[] = { |
18 | * Initialize IRQ setting | ||
19 | */ | ||
20 | void __init init_7751se_IRQ(void) | ||
21 | { | ||
22 | |||
23 | /* Leave old Solution Engine code in for reference. */ | 18 | /* Leave old Solution Engine code in for reference. */ |
24 | #if defined(CONFIG_SH_SOLUTION_ENGINE) | 19 | #if defined(CONFIG_SH_SOLUTION_ENGINE) |
25 | /* | 20 | /* |
26 | * Super I/O (Just mimic PC): | 21 | * Super I/O (Just mimic PC): |
27 | * 1: keyboard | 22 | * 1: keyboard |
28 | * 3: serial 0 | 23 | * 3: serial 0 |
29 | * 4: serial 1 | 24 | * 4: serial 1 |
30 | * 5: printer | 25 | * 5: printer |
31 | * 6: floppy | 26 | * 6: floppy |
32 | * 8: rtc | 27 | * 8: rtc |
33 | * 12: mouse | 28 | * 12: mouse |
34 | * 14: ide0 | 29 | * 14: ide0 |
35 | */ | 30 | */ |
36 | make_ipr_irq(14, BCR_ILCRA, 2, 0x0f-14); | 31 | { 14, BCR_ILCRA, 2, 0x0f-14 }, |
37 | make_ipr_irq(12, BCR_ILCRA, 1, 0x0f-12); | 32 | { 12, BCR_ILCRA, 1, 0x0f-12 }, |
38 | make_ipr_irq( 8, BCR_ILCRB, 1, 0x0f- 8); | 33 | { 8, BCR_ILCRB, 1, 0x0f- 8 }, |
39 | make_ipr_irq( 6, BCR_ILCRC, 3, 0x0f- 6); | 34 | { 6, BCR_ILCRC, 3, 0x0f- 6 }, |
40 | make_ipr_irq( 5, BCR_ILCRC, 2, 0x0f- 5); | 35 | { 5, BCR_ILCRC, 2, 0x0f- 5 }, |
41 | make_ipr_irq( 4, BCR_ILCRC, 1, 0x0f- 4); | 36 | { 4, BCR_ILCRC, 1, 0x0f- 4 }, |
42 | make_ipr_irq( 3, BCR_ILCRC, 0, 0x0f- 3); | 37 | { 3, BCR_ILCRC, 0, 0x0f- 3 }, |
43 | make_ipr_irq( 1, BCR_ILCRD, 3, 0x0f- 1); | 38 | { 1, BCR_ILCRD, 3, 0x0f- 1 }, |
44 | 39 | ||
45 | make_ipr_irq(10, BCR_ILCRD, 1, 0x0f-10); /* LAN */ | 40 | { 10, BCR_ILCRD, 1, 0x0f-10 }, /* LAN */ |
46 | 41 | ||
47 | make_ipr_irq( 0, BCR_ILCRE, 3, 0x0f- 0); /* PCIRQ3 */ | 42 | { 0, BCR_ILCRE, 3, 0x0f- 0 }, /* PCIRQ3 */ |
48 | make_ipr_irq(11, BCR_ILCRE, 2, 0x0f-11); /* PCIRQ2 */ | 43 | { 11, BCR_ILCRE, 2, 0x0f-11 }, /* PCIRQ2 */ |
49 | make_ipr_irq( 9, BCR_ILCRE, 1, 0x0f- 9); /* PCIRQ1 */ | 44 | { 9, BCR_ILCRE, 1, 0x0f- 9 }, /* PCIRQ1 */ |
50 | make_ipr_irq( 7, BCR_ILCRE, 0, 0x0f- 7); /* PCIRQ0 */ | 45 | { 7, BCR_ILCRE, 0, 0x0f- 7 }, /* PCIRQ0 */ |
51 | 46 | ||
52 | /* #2, #13 are allocated for SLOT IRQ #1 and #2 (for now) */ | 47 | /* #2, #13 are allocated for SLOT IRQ #1 and #2 (for now) */ |
53 | /* NOTE: #2 and #13 are not used on PC */ | 48 | /* NOTE: #2 and #13 are not used on PC */ |
54 | make_ipr_irq(13, BCR_ILCRG, 1, 0x0f-13); /* SLOTIRQ2 */ | 49 | { 13, BCR_ILCRG, 1, 0x0f-13 }, /* SLOTIRQ2 */ |
55 | make_ipr_irq( 2, BCR_ILCRG, 0, 0x0f- 2); /* SLOTIRQ1 */ | 50 | { 2, BCR_ILCRG, 0, 0x0f- 2 }, /* SLOTIRQ1 */ |
56 | |||
57 | #elif defined(CONFIG_SH_7751_SOLUTION_ENGINE) | 51 | #elif defined(CONFIG_SH_7751_SOLUTION_ENGINE) |
58 | 52 | { 13, BCR_ILCRD, 3, 2 }, | |
59 | make_ipr_irq(13, BCR_ILCRD, 3, 2); | 53 | /* Add additional entries here as drivers are added and tested. */ |
60 | |||
61 | /* Add additional calls to make_ipr_irq() as drivers are added | ||
62 | * and tested. | ||
63 | */ | ||
64 | #endif | 54 | #endif |
55 | }; | ||
65 | 56 | ||
57 | /* | ||
58 | * Initialize IRQ setting | ||
59 | */ | ||
60 | void __init init_7751se_IRQ(void) | ||
61 | { | ||
62 | make_ipr_irq(se7751_ipr_map, ARRAY_SIZE(se7751_ipr_map)); | ||
66 | } | 63 | } |
diff --git a/arch/sh/boards/sh03/setup.c b/arch/sh/boards/sh03/setup.c index 137e2ba9243e..5ad1e19771be 100644 --- a/arch/sh/boards/sh03/setup.c +++ b/arch/sh/boards/sh03/setup.c | |||
@@ -14,14 +14,17 @@ | |||
14 | #include <asm/sh03/sh03.h> | 14 | #include <asm/sh03/sh03.h> |
15 | #include <asm/addrspace.h> | 15 | #include <asm/addrspace.h> |
16 | 16 | ||
17 | static struct ipr_data sh03_ipr_map[] = { | ||
18 | { IRL0_IRQ, IRL0_IPR_ADDR, IRL0_IPR_POS, IRL0_PRIORITY }, | ||
19 | { IRL1_IRQ, IRL1_IPR_ADDR, IRL1_IPR_POS, IRL1_PRIORITY }, | ||
20 | { IRL2_IRQ, IRL2_IPR_ADDR, IRL2_IPR_POS, IRL2_PRIORITY }, | ||
21 | { IRL3_IRQ, IRL3_IPR_ADDR, IRL3_IPR_POS, IRL3_PRIORITY }, | ||
22 | }; | ||
23 | |||
17 | static void __init init_sh03_IRQ(void) | 24 | static void __init init_sh03_IRQ(void) |
18 | { | 25 | { |
19 | ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); | 26 | ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); |
20 | 27 | make_ipr_irq(sh03_ipr_map, ARRAY_SIZE(sh03_ipr_map)); | |
21 | make_ipr_irq(IRL0_IRQ, IRL0_IPR_ADDR, IRL0_IPR_POS, IRL0_PRIORITY); | ||
22 | make_ipr_irq(IRL1_IRQ, IRL1_IPR_ADDR, IRL1_IPR_POS, IRL1_PRIORITY); | ||
23 | make_ipr_irq(IRL2_IRQ, IRL2_IPR_ADDR, IRL2_IPR_POS, IRL2_PRIORITY); | ||
24 | make_ipr_irq(IRL3_IRQ, IRL3_IPR_ADDR, IRL3_IPR_POS, IRL3_PRIORITY); | ||
25 | } | 28 | } |
26 | 29 | ||
27 | extern void *cf_io_base; | 30 | extern void *cf_io_base; |
diff --git a/arch/sh/boards/shmin/setup.c b/arch/sh/boards/shmin/setup.c index 2f0c19706cf9..a31a1d1e2681 100644 --- a/arch/sh/boards/shmin/setup.c +++ b/arch/sh/boards/shmin/setup.c | |||
@@ -7,7 +7,7 @@ | |||
7 | */ | 7 | */ |
8 | #include <linux/init.h> | 8 | #include <linux/init.h> |
9 | #include <asm/machvec.h> | 9 | #include <asm/machvec.h> |
10 | #include <asm/shmin/shmin.h> | 10 | #include <asm/shmin.h> |
11 | #include <asm/clock.h> | 11 | #include <asm/clock.h> |
12 | #include <asm/irq.h> | 12 | #include <asm/irq.h> |
13 | #include <asm/io.h> | 13 | #include <asm/io.h> |
diff --git a/arch/sh/boards/snapgear/setup.c b/arch/sh/boards/snapgear/setup.c index 540d0bf16446..650fb3645947 100644 --- a/arch/sh/boards/snapgear/setup.c +++ b/arch/sh/boards/snapgear/setup.c | |||
@@ -68,6 +68,13 @@ module_init(eraseconfig_init); | |||
68 | * IRL3 = crypto | 68 | * IRL3 = crypto |
69 | */ | 69 | */ |
70 | 70 | ||
71 | static struct ipr_data snapgear_ipr_map[] = { | ||
72 | make_ipr_irq(IRL0_IRQ, IRL0_IPR_ADDR, IRL0_IPR_POS, IRL0_PRIORITY); | ||
73 | make_ipr_irq(IRL1_IRQ, IRL1_IPR_ADDR, IRL1_IPR_POS, IRL1_PRIORITY); | ||
74 | make_ipr_irq(IRL2_IRQ, IRL2_IPR_ADDR, IRL2_IPR_POS, IRL2_PRIORITY); | ||
75 | make_ipr_irq(IRL3_IRQ, IRL3_IPR_ADDR, IRL3_IPR_POS, IRL3_PRIORITY); | ||
76 | }; | ||
77 | |||
71 | static void __init init_snapgear_IRQ(void) | 78 | static void __init init_snapgear_IRQ(void) |
72 | { | 79 | { |
73 | /* enable individual interrupt mode for externals */ | 80 | /* enable individual interrupt mode for externals */ |
@@ -75,10 +82,7 @@ static void __init init_snapgear_IRQ(void) | |||
75 | 82 | ||
76 | printk("Setup SnapGear IRQ/IPR ...\n"); | 83 | printk("Setup SnapGear IRQ/IPR ...\n"); |
77 | 84 | ||
78 | make_ipr_irq(IRL0_IRQ, IRL0_IPR_ADDR, IRL0_IPR_POS, IRL0_PRIORITY); | 85 | make_ipr_irq(snapgear_ipr_map, ARRAY_SIZE(snapgear_ipr_map)); |
79 | make_ipr_irq(IRL1_IRQ, IRL1_IPR_ADDR, IRL1_IPR_POS, IRL1_PRIORITY); | ||
80 | make_ipr_irq(IRL2_IRQ, IRL2_IPR_ADDR, IRL2_IPR_POS, IRL2_PRIORITY); | ||
81 | make_ipr_irq(IRL3_IRQ, IRL3_IPR_ADDR, IRL3_IPR_POS, IRL3_PRIORITY); | ||
82 | } | 86 | } |
83 | 87 | ||
84 | /* | 88 | /* |
diff --git a/arch/sh/boards/titan/setup.c b/arch/sh/boards/titan/setup.c index 52b66d8b8d2a..a6046d93758b 100644 --- a/arch/sh/boards/titan/setup.c +++ b/arch/sh/boards/titan/setup.c | |||
@@ -9,15 +9,19 @@ | |||
9 | 9 | ||
10 | extern void __init pcibios_init_platform(void); | 10 | extern void __init pcibios_init_platform(void); |
11 | 11 | ||
12 | static struct ipr_data titan_ipr_map[] = { | ||
13 | { TITAN_IRQ_WAN, IRL0_IPR_ADDR, IRL0_IPR_POS, IRL0_PRIORITY }, | ||
14 | { TITAN_IRQ_LAN, IRL1_IPR_ADDR, IRL1_IPR_POS, IRL1_PRIORITY }, | ||
15 | { TITAN_IRQ_MPCIA, IRL2_IPR_ADDR, IRL2_IPR_POS, IRL2_PRIORITY }, | ||
16 | { TITAN_IRQ_USB, IRL3_IPR_ADDR, IRL3_IPR_POS, IRL3_PRIORITY }, | ||
17 | }; | ||
18 | |||
12 | static void __init init_titan_irq(void) | 19 | static void __init init_titan_irq(void) |
13 | { | 20 | { |
14 | /* enable individual interrupt mode for externals */ | 21 | /* enable individual interrupt mode for externals */ |
15 | ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); | 22 | ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); |
16 | 23 | ||
17 | make_ipr_irq( TITAN_IRQ_WAN, IRL0_IPR_ADDR, IRL0_IPR_POS, IRL0_PRIORITY); /* PCIRQ0 */ | 24 | make_ipr_irq(titan_ipr_map, ARRAY_SIZE(titan_ipr_map)); |
18 | make_ipr_irq( TITAN_IRQ_LAN, IRL1_IPR_ADDR, IRL1_IPR_POS, IRL1_PRIORITY); /* PCIRQ1 */ | ||
19 | make_ipr_irq( TITAN_IRQ_MPCIA, IRL2_IPR_ADDR, IRL2_IPR_POS, IRL2_PRIORITY); /* PCIRQ2 */ | ||
20 | make_ipr_irq( TITAN_IRQ_USB, IRL3_IPR_ADDR, IRL3_IPR_POS, IRL3_PRIORITY); /* PCIRQ3 */ | ||
21 | } | 25 | } |
22 | 26 | ||
23 | struct sh_machine_vector mv_titan __initmv = { | 27 | struct sh_machine_vector mv_titan __initmv = { |
diff --git a/arch/sh/cchips/voyagergx/irq.c b/arch/sh/cchips/voyagergx/irq.c index bf1b28feca06..f7ea700d05ae 100644 --- a/arch/sh/cchips/voyagergx/irq.c +++ b/arch/sh/cchips/voyagergx/irq.c | |||
@@ -17,29 +17,18 @@ | |||
17 | 17 | ||
18 | Copyright 2003 (c) Lineo uSolutions,Inc. | 18 | Copyright 2003 (c) Lineo uSolutions,Inc. |
19 | */ | 19 | */ |
20 | /* -------------------------------------------------------------------- */ | ||
21 | |||
22 | #undef DEBUG | ||
23 | |||
24 | #include <linux/sched.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/kernel.h> | ||
27 | #include <linux/param.h> | ||
28 | #include <linux/ioport.h> | ||
29 | #include <linux/interrupt.h> | 20 | #include <linux/interrupt.h> |
30 | #include <linux/init.h> | 21 | #include <linux/init.h> |
31 | #include <linux/irq.h> | 22 | #include <linux/io.h> |
32 | |||
33 | #include <asm/io.h> | ||
34 | #include <asm/irq.h> | ||
35 | #include <asm/voyagergx.h> | 23 | #include <asm/voyagergx.h> |
24 | #include <asm/rts7751r2d.h> | ||
36 | 25 | ||
37 | static void disable_voyagergx_irq(unsigned int irq) | 26 | static void disable_voyagergx_irq(unsigned int irq) |
38 | { | 27 | { |
39 | unsigned long val; | 28 | unsigned long val; |
40 | unsigned long mask = 1 << (irq - VOYAGER_IRQ_BASE); | 29 | unsigned long mask = 1 << (irq - VOYAGER_IRQ_BASE); |
41 | 30 | ||
42 | pr_debug("disable_voyagergx_irq(%d): mask=%x\n", irq, mask); | 31 | pr_debug("disable_voyagergx_irq(%d): mask=%lx\n", irq, mask); |
43 | val = inl(VOYAGER_INT_MASK); | 32 | val = inl(VOYAGER_INT_MASK); |
44 | val &= ~mask; | 33 | val &= ~mask; |
45 | outl(val, VOYAGER_INT_MASK); | 34 | outl(val, VOYAGER_INT_MASK); |
@@ -50,7 +39,7 @@ static void enable_voyagergx_irq(unsigned int irq) | |||
50 | unsigned long val; | 39 | unsigned long val; |
51 | unsigned long mask = 1 << (irq - VOYAGER_IRQ_BASE); | 40 | unsigned long mask = 1 << (irq - VOYAGER_IRQ_BASE); |
52 | 41 | ||
53 | pr_debug("disable_voyagergx_irq(%d): mask=%x\n", irq, mask); | 42 | pr_debug("disable_voyagergx_irq(%d): mask=%lx\n", irq, mask); |
54 | val = inl(VOYAGER_INT_MASK); | 43 | val = inl(VOYAGER_INT_MASK); |
55 | val |= mask; | 44 | val |= mask; |
56 | outl(val, VOYAGER_INT_MASK); | 45 | outl(val, VOYAGER_INT_MASK); |
@@ -137,7 +126,7 @@ int voyagergx_irq_demux(int irq) | |||
137 | } else { | 126 | } else { |
138 | printk("Unexpected IRQ irq = %d status = 0x%08lx\n", irq, val); | 127 | printk("Unexpected IRQ irq = %d status = 0x%08lx\n", irq, val); |
139 | } | 128 | } |
140 | pr_debug("voyagergx_irq_demux %d \n", i); | 129 | pr_debug("voyagergx_irq_demux %ld\n", i); |
141 | #else | 130 | #else |
142 | for (bit = 1, i = 0 ; i < VOYAGER_IRQ_NUM ; bit <<= 1, i++) | 131 | for (bit = 1, i = 0 ; i < VOYAGER_IRQ_NUM ; bit <<= 1, i++) |
143 | if (val & bit) | 132 | if (val & bit) |
@@ -185,4 +174,3 @@ void __init setup_voyagergx_irq(void) | |||
185 | 174 | ||
186 | setup_irq(IRQ_VOYAGER, &irq0); | 175 | setup_irq(IRQ_VOYAGER, &irq0); |
187 | } | 176 | } |
188 | |||
diff --git a/arch/sh/configs/r7780rp_defconfig b/arch/sh/configs/r7780rp_defconfig index 2470364948e7..34e2046c3213 100644 --- a/arch/sh/configs/r7780rp_defconfig +++ b/arch/sh/configs/r7780rp_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.18 | 3 | # Linux kernel version: 2.6.19-rc3 |
4 | # Tue Oct 3 11:32:47 2006 | 4 | # Tue Oct 31 12:32:06 2006 |
5 | # | 5 | # |
6 | CONFIG_SUPERH=y | 6 | CONFIG_SUPERH=y |
7 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | 7 | CONFIG_RWSEM_GENERIC_SPINLOCK=y |
@@ -10,6 +10,7 @@ CONFIG_GENERIC_HWEIGHT=y | |||
10 | CONFIG_GENERIC_HARDIRQS=y | 10 | CONFIG_GENERIC_HARDIRQS=y |
11 | CONFIG_GENERIC_IRQ_PROBE=y | 11 | CONFIG_GENERIC_IRQ_PROBE=y |
12 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 12 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
13 | # CONFIG_GENERIC_TIME is not set | ||
13 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 14 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
14 | 15 | ||
15 | # | 16 | # |
@@ -178,7 +179,7 @@ CONFIG_MMU=y | |||
178 | CONFIG_PAGE_OFFSET=0x80000000 | 179 | CONFIG_PAGE_OFFSET=0x80000000 |
179 | CONFIG_MEMORY_START=0x08000000 | 180 | CONFIG_MEMORY_START=0x08000000 |
180 | CONFIG_MEMORY_SIZE=0x08000000 | 181 | CONFIG_MEMORY_SIZE=0x08000000 |
181 | CONFIG_32BIT=y | 182 | # CONFIG_32BIT is not set |
182 | CONFIG_VSYSCALL=y | 183 | CONFIG_VSYSCALL=y |
183 | CONFIG_HUGETLB_PAGE_SIZE_64K=y | 184 | CONFIG_HUGETLB_PAGE_SIZE_64K=y |
184 | # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set | 185 | # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set |
@@ -229,9 +230,7 @@ CONFIG_SH_PCLK_FREQ=32000000 | |||
229 | # | 230 | # |
230 | # DMA support | 231 | # DMA support |
231 | # | 232 | # |
232 | CONFIG_SH_DMA=y | 233 | # CONFIG_SH_DMA is not set |
233 | CONFIG_NR_ONCHIP_DMA_CHANNELS=6 | ||
234 | # CONFIG_NR_DMA_CHANNELS_BOOL is not set | ||
235 | 234 | ||
236 | # | 235 | # |
237 | # Companion Chips | 236 | # Companion Chips |
@@ -259,7 +258,7 @@ CONFIG_ZERO_PAGE_OFFSET=0x00001000 | |||
259 | CONFIG_BOOT_LINK_OFFSET=0x00800000 | 258 | CONFIG_BOOT_LINK_OFFSET=0x00800000 |
260 | # CONFIG_UBC_WAKEUP is not set | 259 | # CONFIG_UBC_WAKEUP is not set |
261 | CONFIG_CMDLINE_BOOL=y | 260 | CONFIG_CMDLINE_BOOL=y |
262 | CONFIG_CMDLINE="mem=128M console=ttySC0,115200 root=/dev/hda1" | 261 | CONFIG_CMDLINE="mem=128M console=ttySC0,115200 root=/dev/sda1" |
263 | 262 | ||
264 | # | 263 | # |
265 | # Bus options | 264 | # Bus options |
@@ -336,6 +335,7 @@ CONFIG_IP_PNP_DHCP=y | |||
336 | # CONFIG_INET_TUNNEL is not set | 335 | # CONFIG_INET_TUNNEL is not set |
337 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | 336 | CONFIG_INET_XFRM_MODE_TRANSPORT=y |
338 | CONFIG_INET_XFRM_MODE_TUNNEL=y | 337 | CONFIG_INET_XFRM_MODE_TUNNEL=y |
338 | CONFIG_INET_XFRM_MODE_BEET=y | ||
339 | CONFIG_INET_DIAG=y | 339 | CONFIG_INET_DIAG=y |
340 | CONFIG_INET_TCP_DIAG=y | 340 | CONFIG_INET_TCP_DIAG=y |
341 | # CONFIG_TCP_CONG_ADVANCED is not set | 341 | # CONFIG_TCP_CONG_ADVANCED is not set |
@@ -441,76 +441,28 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | |||
441 | # CONFIG_ATA_OVER_ETH is not set | 441 | # CONFIG_ATA_OVER_ETH is not set |
442 | 442 | ||
443 | # | 443 | # |
444 | # Misc devices | ||
445 | # | ||
446 | # CONFIG_SGI_IOC4 is not set | ||
447 | # CONFIG_TIFM_CORE is not set | ||
448 | |||
449 | # | ||
444 | # ATA/ATAPI/MFM/RLL support | 450 | # ATA/ATAPI/MFM/RLL support |
445 | # | 451 | # |
446 | CONFIG_IDE=m | 452 | # CONFIG_IDE is not set |
447 | CONFIG_IDE_MAX_HWIFS=4 | ||
448 | CONFIG_BLK_DEV_IDE=m | ||
449 | |||
450 | # | ||
451 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
452 | # | ||
453 | CONFIG_BLK_DEV_IDE_SATA=y | ||
454 | CONFIG_BLK_DEV_IDEDISK=m | ||
455 | CONFIG_IDEDISK_MULTI_MODE=y | ||
456 | # CONFIG_BLK_DEV_IDECD is not set | ||
457 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
458 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
459 | CONFIG_BLK_DEV_IDESCSI=m | ||
460 | # CONFIG_IDE_TASK_IOCTL is not set | ||
461 | |||
462 | # | ||
463 | # IDE chipset support/bugfixes | ||
464 | # | ||
465 | CONFIG_IDE_GENERIC=m | ||
466 | CONFIG_BLK_DEV_IDEPCI=y | ||
467 | CONFIG_IDEPCI_SHARE_IRQ=y | ||
468 | # CONFIG_BLK_DEV_OFFBOARD is not set | ||
469 | CONFIG_BLK_DEV_GENERIC=m | ||
470 | # CONFIG_BLK_DEV_OPTI621 is not set | ||
471 | CONFIG_BLK_DEV_IDEDMA_PCI=y | ||
472 | # CONFIG_BLK_DEV_IDEDMA_FORCED is not set | ||
473 | CONFIG_IDEDMA_PCI_AUTO=y | ||
474 | # CONFIG_IDEDMA_ONLYDISK is not set | ||
475 | CONFIG_BLK_DEV_AEC62XX=m | ||
476 | # CONFIG_BLK_DEV_ALI15X3 is not set | ||
477 | # CONFIG_BLK_DEV_AMD74XX is not set | ||
478 | # CONFIG_BLK_DEV_CMD64X is not set | ||
479 | # CONFIG_BLK_DEV_TRIFLEX is not set | ||
480 | # CONFIG_BLK_DEV_CY82C693 is not set | ||
481 | # CONFIG_BLK_DEV_CS5520 is not set | ||
482 | # CONFIG_BLK_DEV_CS5530 is not set | ||
483 | # CONFIG_BLK_DEV_HPT34X is not set | ||
484 | # CONFIG_BLK_DEV_HPT366 is not set | ||
485 | # CONFIG_BLK_DEV_SC1200 is not set | ||
486 | # CONFIG_BLK_DEV_PIIX is not set | ||
487 | # CONFIG_BLK_DEV_IT821X is not set | ||
488 | # CONFIG_BLK_DEV_NS87415 is not set | ||
489 | # CONFIG_BLK_DEV_PDC202XX_OLD is not set | ||
490 | CONFIG_BLK_DEV_PDC202XX_NEW=m | ||
491 | # CONFIG_BLK_DEV_SVWKS is not set | ||
492 | CONFIG_BLK_DEV_SIIMAGE=m | ||
493 | # CONFIG_BLK_DEV_SLC90E66 is not set | ||
494 | # CONFIG_BLK_DEV_TRM290 is not set | ||
495 | # CONFIG_BLK_DEV_VIA82CXXX is not set | ||
496 | # CONFIG_IDE_ARM is not set | ||
497 | CONFIG_BLK_DEV_IDEDMA=y | ||
498 | # CONFIG_IDEDMA_IVB is not set | ||
499 | CONFIG_IDEDMA_AUTO=y | ||
500 | # CONFIG_BLK_DEV_HD is not set | ||
501 | 453 | ||
502 | # | 454 | # |
503 | # SCSI device support | 455 | # SCSI device support |
504 | # | 456 | # |
505 | # CONFIG_RAID_ATTRS is not set | 457 | # CONFIG_RAID_ATTRS is not set |
506 | CONFIG_SCSI=m | 458 | CONFIG_SCSI=y |
507 | # CONFIG_SCSI_NETLINK is not set | 459 | # CONFIG_SCSI_NETLINK is not set |
508 | CONFIG_SCSI_PROC_FS=y | 460 | CONFIG_SCSI_PROC_FS=y |
509 | 461 | ||
510 | # | 462 | # |
511 | # SCSI support type (disk, tape, CD-ROM) | 463 | # SCSI support type (disk, tape, CD-ROM) |
512 | # | 464 | # |
513 | CONFIG_BLK_DEV_SD=m | 465 | CONFIG_BLK_DEV_SD=y |
514 | # CONFIG_CHR_DEV_ST is not set | 466 | # CONFIG_CHR_DEV_ST is not set |
515 | # CONFIG_CHR_DEV_OSST is not set | 467 | # CONFIG_CHR_DEV_OSST is not set |
516 | # CONFIG_BLK_DEV_SR is not set | 468 | # CONFIG_BLK_DEV_SR is not set |
@@ -561,6 +513,7 @@ CONFIG_CHR_DEV_SG=m | |||
561 | # CONFIG_SCSI_IPR is not set | 513 | # CONFIG_SCSI_IPR is not set |
562 | # CONFIG_SCSI_QLOGIC_1280 is not set | 514 | # CONFIG_SCSI_QLOGIC_1280 is not set |
563 | # CONFIG_SCSI_QLA_FC is not set | 515 | # CONFIG_SCSI_QLA_FC is not set |
516 | # CONFIG_SCSI_QLA_ISCSI is not set | ||
564 | # CONFIG_SCSI_LPFC is not set | 517 | # CONFIG_SCSI_LPFC is not set |
565 | # CONFIG_SCSI_DC395x is not set | 518 | # CONFIG_SCSI_DC395x is not set |
566 | # CONFIG_SCSI_DC390T is not set | 519 | # CONFIG_SCSI_DC390T is not set |
@@ -570,7 +523,55 @@ CONFIG_CHR_DEV_SG=m | |||
570 | # | 523 | # |
571 | # Serial ATA (prod) and Parallel ATA (experimental) drivers | 524 | # Serial ATA (prod) and Parallel ATA (experimental) drivers |
572 | # | 525 | # |
573 | # CONFIG_ATA is not set | 526 | CONFIG_ATA=y |
527 | # CONFIG_SATA_AHCI is not set | ||
528 | # CONFIG_SATA_SVW is not set | ||
529 | # CONFIG_ATA_PIIX is not set | ||
530 | # CONFIG_SATA_MV is not set | ||
531 | # CONFIG_SATA_NV is not set | ||
532 | # CONFIG_PDC_ADMA is not set | ||
533 | # CONFIG_SATA_QSTOR is not set | ||
534 | # CONFIG_SATA_PROMISE is not set | ||
535 | # CONFIG_SATA_SX4 is not set | ||
536 | CONFIG_SATA_SIL=y | ||
537 | # CONFIG_SATA_SIL24 is not set | ||
538 | # CONFIG_SATA_SIS is not set | ||
539 | # CONFIG_SATA_ULI is not set | ||
540 | # CONFIG_SATA_VIA is not set | ||
541 | # CONFIG_SATA_VITESSE is not set | ||
542 | # CONFIG_PATA_ALI is not set | ||
543 | # CONFIG_PATA_AMD is not set | ||
544 | # CONFIG_PATA_ARTOP is not set | ||
545 | # CONFIG_PATA_ATIIXP is not set | ||
546 | # CONFIG_PATA_CMD64X is not set | ||
547 | # CONFIG_PATA_CS5520 is not set | ||
548 | # CONFIG_PATA_CS5530 is not set | ||
549 | # CONFIG_PATA_CYPRESS is not set | ||
550 | # CONFIG_PATA_EFAR is not set | ||
551 | # CONFIG_ATA_GENERIC is not set | ||
552 | # CONFIG_PATA_HPT366 is not set | ||
553 | # CONFIG_PATA_HPT37X is not set | ||
554 | # CONFIG_PATA_HPT3X2N is not set | ||
555 | # CONFIG_PATA_HPT3X3 is not set | ||
556 | # CONFIG_PATA_IT821X is not set | ||
557 | # CONFIG_PATA_JMICRON is not set | ||
558 | # CONFIG_PATA_TRIFLEX is not set | ||
559 | # CONFIG_PATA_MPIIX is not set | ||
560 | # CONFIG_PATA_OLDPIIX is not set | ||
561 | # CONFIG_PATA_NETCELL is not set | ||
562 | # CONFIG_PATA_NS87410 is not set | ||
563 | # CONFIG_PATA_OPTI is not set | ||
564 | # CONFIG_PATA_OPTIDMA is not set | ||
565 | # CONFIG_PATA_PDC_OLD is not set | ||
566 | # CONFIG_PATA_RADISYS is not set | ||
567 | # CONFIG_PATA_RZ1000 is not set | ||
568 | # CONFIG_PATA_SC1200 is not set | ||
569 | # CONFIG_PATA_SERVERWORKS is not set | ||
570 | # CONFIG_PATA_PDC2027X is not set | ||
571 | # CONFIG_PATA_SIL680 is not set | ||
572 | # CONFIG_PATA_SIS is not set | ||
573 | # CONFIG_PATA_VIA is not set | ||
574 | # CONFIG_PATA_WINBOND is not set | ||
574 | 575 | ||
575 | # | 576 | # |
576 | # Multi-device support (RAID and LVM) | 577 | # Multi-device support (RAID and LVM) |
@@ -840,7 +841,6 @@ CONFIG_HW_RANDOM=y | |||
840 | # TPM devices | 841 | # TPM devices |
841 | # | 842 | # |
842 | # CONFIG_TCG_TPM is not set | 843 | # CONFIG_TCG_TPM is not set |
843 | # CONFIG_TELCLOCK is not set | ||
844 | 844 | ||
845 | # | 845 | # |
846 | # I2C support | 846 | # I2C support |
@@ -856,6 +856,7 @@ CONFIG_HW_RANDOM=y | |||
856 | # | 856 | # |
857 | # Dallas's 1-wire bus | 857 | # Dallas's 1-wire bus |
858 | # | 858 | # |
859 | # CONFIG_W1 is not set | ||
859 | 860 | ||
860 | # | 861 | # |
861 | # Hardware Monitoring support | 862 | # Hardware Monitoring support |
@@ -868,14 +869,9 @@ CONFIG_HWMON=y | |||
868 | # CONFIG_HWMON_DEBUG_CHIP is not set | 869 | # CONFIG_HWMON_DEBUG_CHIP is not set |
869 | 870 | ||
870 | # | 871 | # |
871 | # Misc devices | ||
872 | # | ||
873 | |||
874 | # | ||
875 | # Multimedia devices | 872 | # Multimedia devices |
876 | # | 873 | # |
877 | # CONFIG_VIDEO_DEV is not set | 874 | # CONFIG_VIDEO_DEV is not set |
878 | CONFIG_VIDEO_V4L2=y | ||
879 | 875 | ||
880 | # | 876 | # |
881 | # Digital Video Broadcasting Devices | 877 | # Digital Video Broadcasting Devices |
@@ -959,7 +955,29 @@ CONFIG_USB_ARCH_HAS_EHCI=y | |||
959 | # | 955 | # |
960 | # Real Time Clock | 956 | # Real Time Clock |
961 | # | 957 | # |
962 | # CONFIG_RTC_CLASS is not set | 958 | CONFIG_RTC_LIB=y |
959 | CONFIG_RTC_CLASS=y | ||
960 | CONFIG_RTC_HCTOSYS=y | ||
961 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
962 | # CONFIG_RTC_DEBUG is not set | ||
963 | |||
964 | # | ||
965 | # RTC interfaces | ||
966 | # | ||
967 | CONFIG_RTC_INTF_SYSFS=y | ||
968 | CONFIG_RTC_INTF_PROC=y | ||
969 | CONFIG_RTC_INTF_DEV=y | ||
970 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
971 | |||
972 | # | ||
973 | # RTC drivers | ||
974 | # | ||
975 | # CONFIG_RTC_DRV_DS1553 is not set | ||
976 | # CONFIG_RTC_DRV_DS1742 is not set | ||
977 | # CONFIG_RTC_DRV_M48T86 is not set | ||
978 | CONFIG_RTC_DRV_SH=y | ||
979 | # CONFIG_RTC_DRV_TEST is not set | ||
980 | # CONFIG_RTC_DRV_V3020 is not set | ||
963 | 981 | ||
964 | # | 982 | # |
965 | # DMA Engine support | 983 | # DMA Engine support |
@@ -984,6 +1002,7 @@ CONFIG_EXT3_FS=y | |||
984 | CONFIG_EXT3_FS_XATTR=y | 1002 | CONFIG_EXT3_FS_XATTR=y |
985 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 1003 | # CONFIG_EXT3_FS_POSIX_ACL is not set |
986 | # CONFIG_EXT3_FS_SECURITY is not set | 1004 | # CONFIG_EXT3_FS_SECURITY is not set |
1005 | # CONFIG_EXT4DEV_FS is not set | ||
987 | CONFIG_JBD=y | 1006 | CONFIG_JBD=y |
988 | # CONFIG_JBD_DEBUG is not set | 1007 | # CONFIG_JBD_DEBUG is not set |
989 | CONFIG_FS_MBCACHE=y | 1008 | CONFIG_FS_MBCACHE=y |
@@ -991,6 +1010,7 @@ CONFIG_FS_MBCACHE=y | |||
991 | # CONFIG_JFS_FS is not set | 1010 | # CONFIG_JFS_FS is not set |
992 | CONFIG_FS_POSIX_ACL=y | 1011 | CONFIG_FS_POSIX_ACL=y |
993 | # CONFIG_XFS_FS is not set | 1012 | # CONFIG_XFS_FS is not set |
1013 | # CONFIG_GFS2_FS is not set | ||
994 | # CONFIG_OCFS2_FS is not set | 1014 | # CONFIG_OCFS2_FS is not set |
995 | CONFIG_MINIX_FS=y | 1015 | CONFIG_MINIX_FS=y |
996 | # CONFIG_ROMFS_FS is not set | 1016 | # CONFIG_ROMFS_FS is not set |
@@ -1027,7 +1047,8 @@ CONFIG_PROC_FS=y | |||
1027 | CONFIG_PROC_KCORE=y | 1047 | CONFIG_PROC_KCORE=y |
1028 | CONFIG_PROC_SYSCTL=y | 1048 | CONFIG_PROC_SYSCTL=y |
1029 | CONFIG_SYSFS=y | 1049 | CONFIG_SYSFS=y |
1030 | # CONFIG_TMPFS is not set | 1050 | CONFIG_TMPFS=y |
1051 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
1031 | CONFIG_HUGETLBFS=y | 1052 | CONFIG_HUGETLBFS=y |
1032 | CONFIG_HUGETLB_PAGE=y | 1053 | CONFIG_HUGETLB_PAGE=y |
1033 | CONFIG_RAMFS=y | 1054 | CONFIG_RAMFS=y |
@@ -1159,6 +1180,7 @@ CONFIG_DEBUG_FS=y | |||
1159 | # CONFIG_DEBUG_LIST is not set | 1180 | # CONFIG_DEBUG_LIST is not set |
1160 | CONFIG_FRAME_POINTER=y | 1181 | CONFIG_FRAME_POINTER=y |
1161 | CONFIG_FORCED_INLINING=y | 1182 | CONFIG_FORCED_INLINING=y |
1183 | # CONFIG_HEADERS_CHECK is not set | ||
1162 | # CONFIG_RCU_TORTURE_TEST is not set | 1184 | # CONFIG_RCU_TORTURE_TEST is not set |
1163 | # CONFIG_SH_STANDARD_BIOS is not set | 1185 | # CONFIG_SH_STANDARD_BIOS is not set |
1164 | # CONFIG_EARLY_SCIF_CONSOLE is not set | 1186 | # CONFIG_EARLY_SCIF_CONSOLE is not set |
@@ -1178,9 +1200,9 @@ CONFIG_FORCED_INLINING=y | |||
1178 | # | 1200 | # |
1179 | CONFIG_CRYPTO=y | 1201 | CONFIG_CRYPTO=y |
1180 | CONFIG_CRYPTO_ALGAPI=y | 1202 | CONFIG_CRYPTO_ALGAPI=y |
1181 | CONFIG_CRYPTO_BLKCIPHER=m | 1203 | CONFIG_CRYPTO_BLKCIPHER=y |
1182 | CONFIG_CRYPTO_HASH=y | 1204 | CONFIG_CRYPTO_HASH=y |
1183 | CONFIG_CRYPTO_MANAGER=m | 1205 | CONFIG_CRYPTO_MANAGER=y |
1184 | CONFIG_CRYPTO_HMAC=y | 1206 | CONFIG_CRYPTO_HMAC=y |
1185 | # CONFIG_CRYPTO_NULL is not set | 1207 | # CONFIG_CRYPTO_NULL is not set |
1186 | # CONFIG_CRYPTO_MD4 is not set | 1208 | # CONFIG_CRYPTO_MD4 is not set |
@@ -1191,7 +1213,7 @@ CONFIG_CRYPTO_MD5=y | |||
1191 | # CONFIG_CRYPTO_WP512 is not set | 1213 | # CONFIG_CRYPTO_WP512 is not set |
1192 | # CONFIG_CRYPTO_TGR192 is not set | 1214 | # CONFIG_CRYPTO_TGR192 is not set |
1193 | CONFIG_CRYPTO_ECB=m | 1215 | CONFIG_CRYPTO_ECB=m |
1194 | CONFIG_CRYPTO_CBC=m | 1216 | CONFIG_CRYPTO_CBC=y |
1195 | CONFIG_CRYPTO_DES=y | 1217 | CONFIG_CRYPTO_DES=y |
1196 | # CONFIG_CRYPTO_BLOWFISH is not set | 1218 | # CONFIG_CRYPTO_BLOWFISH is not set |
1197 | # CONFIG_CRYPTO_TWOFISH is not set | 1219 | # CONFIG_CRYPTO_TWOFISH is not set |
diff --git a/arch/sh/configs/titan_defconfig b/arch/sh/configs/titan_defconfig index 5e8175461138..41049cf14b79 100644 --- a/arch/sh/configs/titan_defconfig +++ b/arch/sh/configs/titan_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.18 | 3 | # Linux kernel version: 2.6.19-rc3 |
4 | # Tue Oct 3 12:59:14 2006 | 4 | # Mon Oct 30 18:04:49 2006 |
5 | # | 5 | # |
6 | CONFIG_SUPERH=y | 6 | CONFIG_SUPERH=y |
7 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | 7 | CONFIG_RWSEM_GENERIC_SPINLOCK=y |
@@ -10,6 +10,7 @@ CONFIG_GENERIC_HWEIGHT=y | |||
10 | CONFIG_GENERIC_HARDIRQS=y | 10 | CONFIG_GENERIC_HARDIRQS=y |
11 | CONFIG_GENERIC_IRQ_PROBE=y | 11 | CONFIG_GENERIC_IRQ_PROBE=y |
12 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 12 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
13 | # CONFIG_GENERIC_TIME is not set | ||
13 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 14 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
14 | 15 | ||
15 | # | 16 | # |
@@ -23,7 +24,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32 | |||
23 | # General setup | 24 | # General setup |
24 | # | 25 | # |
25 | CONFIG_LOCALVERSION="" | 26 | CONFIG_LOCALVERSION="" |
26 | CONFIG_LOCALVERSION_AUTO=y | 27 | # CONFIG_LOCALVERSION_AUTO is not set |
27 | CONFIG_SWAP=y | 28 | CONFIG_SWAP=y |
28 | CONFIG_SYSVIPC=y | 29 | CONFIG_SYSVIPC=y |
29 | # CONFIG_IPC_NS is not set | 30 | # CONFIG_IPC_NS is not set |
@@ -236,8 +237,8 @@ CONFIG_HZ_250=y | |||
236 | CONFIG_HZ=250 | 237 | CONFIG_HZ=250 |
237 | # CONFIG_KEXEC is not set | 238 | # CONFIG_KEXEC is not set |
238 | # CONFIG_SMP is not set | 239 | # CONFIG_SMP is not set |
239 | CONFIG_PREEMPT_NONE=y | 240 | # CONFIG_PREEMPT_NONE is not set |
240 | # CONFIG_PREEMPT_VOLUNTARY is not set | 241 | CONFIG_PREEMPT_VOLUNTARY=y |
241 | # CONFIG_PREEMPT is not set | 242 | # CONFIG_PREEMPT is not set |
242 | 243 | ||
243 | # | 244 | # |
@@ -247,7 +248,7 @@ CONFIG_ZERO_PAGE_OFFSET=0x00001000 | |||
247 | CONFIG_BOOT_LINK_OFFSET=0x009e0000 | 248 | CONFIG_BOOT_LINK_OFFSET=0x009e0000 |
248 | # CONFIG_UBC_WAKEUP is not set | 249 | # CONFIG_UBC_WAKEUP is not set |
249 | CONFIG_CMDLINE_BOOL=y | 250 | CONFIG_CMDLINE_BOOL=y |
250 | CONFIG_CMDLINE="console=ttySC1,38400N81 root=/dev/nfs ip=:::::eth1:autoconf" | 251 | CONFIG_CMDLINE="console=ttySC1,38400N81 root=/dev/nfs ip=:::::eth1:autoconf rw" |
251 | 252 | ||
252 | # | 253 | # |
253 | # Bus options | 254 | # Bus options |
@@ -334,6 +335,7 @@ CONFIG_INET_XFRM_TUNNEL=y | |||
334 | CONFIG_INET_TUNNEL=y | 335 | CONFIG_INET_TUNNEL=y |
335 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | 336 | CONFIG_INET_XFRM_MODE_TRANSPORT=y |
336 | CONFIG_INET_XFRM_MODE_TUNNEL=y | 337 | CONFIG_INET_XFRM_MODE_TUNNEL=y |
338 | CONFIG_INET_XFRM_MODE_BEET=y | ||
337 | CONFIG_INET_DIAG=m | 339 | CONFIG_INET_DIAG=m |
338 | CONFIG_INET_TCP_DIAG=m | 340 | CONFIG_INET_TCP_DIAG=m |
339 | # CONFIG_TCP_CONG_ADVANCED is not set | 341 | # CONFIG_TCP_CONG_ADVANCED is not set |
@@ -355,9 +357,10 @@ CONFIG_INET6_XFRM_TUNNEL=y | |||
355 | CONFIG_INET6_TUNNEL=y | 357 | CONFIG_INET6_TUNNEL=y |
356 | CONFIG_INET6_XFRM_MODE_TRANSPORT=y | 358 | CONFIG_INET6_XFRM_MODE_TRANSPORT=y |
357 | CONFIG_INET6_XFRM_MODE_TUNNEL=y | 359 | CONFIG_INET6_XFRM_MODE_TUNNEL=y |
360 | CONFIG_INET6_XFRM_MODE_BEET=y | ||
358 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | 361 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set |
362 | CONFIG_IPV6_SIT=m | ||
359 | CONFIG_IPV6_TUNNEL=y | 363 | CONFIG_IPV6_TUNNEL=y |
360 | # CONFIG_IPV6_SUBTREES is not set | ||
361 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | 364 | # CONFIG_IPV6_MULTIPLE_TABLES is not set |
362 | # CONFIG_NETWORK_SECMARK is not set | 365 | # CONFIG_NETWORK_SECMARK is not set |
363 | CONFIG_NETFILTER=y | 366 | CONFIG_NETFILTER=y |
@@ -714,6 +717,12 @@ CONFIG_BLK_DEV_INITRD=y | |||
714 | CONFIG_ATA_OVER_ETH=m | 717 | CONFIG_ATA_OVER_ETH=m |
715 | 718 | ||
716 | # | 719 | # |
720 | # Misc devices | ||
721 | # | ||
722 | # CONFIG_SGI_IOC4 is not set | ||
723 | # CONFIG_TIFM_CORE is not set | ||
724 | |||
725 | # | ||
717 | # ATA/ATAPI/MFM/RLL support | 726 | # ATA/ATAPI/MFM/RLL support |
718 | # | 727 | # |
719 | # CONFIG_IDE is not set | 728 | # CONFIG_IDE is not set |
@@ -778,9 +787,9 @@ CONFIG_CHR_DEV_SG=m | |||
778 | # CONFIG_SCSI_INIA100 is not set | 787 | # CONFIG_SCSI_INIA100 is not set |
779 | # CONFIG_SCSI_STEX is not set | 788 | # CONFIG_SCSI_STEX is not set |
780 | # CONFIG_SCSI_SYM53C8XX_2 is not set | 789 | # CONFIG_SCSI_SYM53C8XX_2 is not set |
781 | # CONFIG_SCSI_IPR is not set | ||
782 | # CONFIG_SCSI_QLOGIC_1280 is not set | 790 | # CONFIG_SCSI_QLOGIC_1280 is not set |
783 | # CONFIG_SCSI_QLA_FC is not set | 791 | # CONFIG_SCSI_QLA_FC is not set |
792 | # CONFIG_SCSI_QLA_ISCSI is not set | ||
784 | # CONFIG_SCSI_LPFC is not set | 793 | # CONFIG_SCSI_LPFC is not set |
785 | # CONFIG_SCSI_DC395x is not set | 794 | # CONFIG_SCSI_DC395x is not set |
786 | # CONFIG_SCSI_DC390T is not set | 795 | # CONFIG_SCSI_DC390T is not set |
@@ -1095,7 +1104,6 @@ CONFIG_HW_RANDOM=y | |||
1095 | # TPM devices | 1104 | # TPM devices |
1096 | # | 1105 | # |
1097 | # CONFIG_TCG_TPM is not set | 1106 | # CONFIG_TCG_TPM is not set |
1098 | # CONFIG_TELCLOCK is not set | ||
1099 | 1107 | ||
1100 | # | 1108 | # |
1101 | # I2C support | 1109 | # I2C support |
@@ -1124,14 +1132,9 @@ CONFIG_HWMON=y | |||
1124 | # CONFIG_HWMON_DEBUG_CHIP is not set | 1132 | # CONFIG_HWMON_DEBUG_CHIP is not set |
1125 | 1133 | ||
1126 | # | 1134 | # |
1127 | # Misc devices | ||
1128 | # | ||
1129 | |||
1130 | # | ||
1131 | # Multimedia devices | 1135 | # Multimedia devices |
1132 | # | 1136 | # |
1133 | # CONFIG_VIDEO_DEV is not set | 1137 | # CONFIG_VIDEO_DEV is not set |
1134 | CONFIG_VIDEO_V4L2=y | ||
1135 | 1138 | ||
1136 | # | 1139 | # |
1137 | # Digital Video Broadcasting Devices | 1140 | # Digital Video Broadcasting Devices |
@@ -1177,9 +1180,9 @@ CONFIG_USB_DEVICEFS=y | |||
1177 | # USB Host Controller Drivers | 1180 | # USB Host Controller Drivers |
1178 | # | 1181 | # |
1179 | CONFIG_USB_EHCI_HCD=y | 1182 | CONFIG_USB_EHCI_HCD=y |
1180 | # CONFIG_USB_EHCI_SPLIT_ISO is not set | 1183 | CONFIG_USB_EHCI_SPLIT_ISO=y |
1181 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | 1184 | CONFIG_USB_EHCI_ROOT_HUB_TT=y |
1182 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | 1185 | CONFIG_USB_EHCI_TT_NEWSCHED=y |
1183 | # CONFIG_USB_ISP116X_HCD is not set | 1186 | # CONFIG_USB_ISP116X_HCD is not set |
1184 | CONFIG_USB_OHCI_HCD=y | 1187 | CONFIG_USB_OHCI_HCD=y |
1185 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set | 1188 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set |
@@ -1235,7 +1238,6 @@ CONFIG_USB_STORAGE=y | |||
1235 | # CONFIG_USB_ATI_REMOTE2 is not set | 1238 | # CONFIG_USB_ATI_REMOTE2 is not set |
1236 | # CONFIG_USB_KEYSPAN_REMOTE is not set | 1239 | # CONFIG_USB_KEYSPAN_REMOTE is not set |
1237 | # CONFIG_USB_APPLETOUCH is not set | 1240 | # CONFIG_USB_APPLETOUCH is not set |
1238 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
1239 | 1241 | ||
1240 | # | 1242 | # |
1241 | # USB Imaging devices | 1243 | # USB Imaging devices |
@@ -1246,11 +1248,20 @@ CONFIG_USB_STORAGE=y | |||
1246 | # | 1248 | # |
1247 | # USB Network Adapters | 1249 | # USB Network Adapters |
1248 | # | 1250 | # |
1249 | # CONFIG_USB_CATC is not set | 1251 | CONFIG_USB_CATC=m |
1250 | # CONFIG_USB_KAWETH is not set | 1252 | CONFIG_USB_KAWETH=m |
1251 | # CONFIG_USB_PEGASUS is not set | 1253 | CONFIG_USB_PEGASUS=m |
1252 | # CONFIG_USB_RTL8150 is not set | 1254 | CONFIG_USB_RTL8150=m |
1253 | # CONFIG_USB_USBNET is not set | 1255 | CONFIG_USB_USBNET=m |
1256 | CONFIG_USB_NET_AX8817X=m | ||
1257 | CONFIG_USB_NET_CDCETHER=m | ||
1258 | # CONFIG_USB_NET_GL620A is not set | ||
1259 | CONFIG_USB_NET_NET1080=m | ||
1260 | CONFIG_USB_NET_PLUSB=m | ||
1261 | # CONFIG_USB_NET_MCS7830 is not set | ||
1262 | # CONFIG_USB_NET_RNDIS_HOST is not set | ||
1263 | # CONFIG_USB_NET_CDC_SUBSET is not set | ||
1264 | CONFIG_USB_NET_ZAURUS=m | ||
1254 | CONFIG_USB_MON=y | 1265 | CONFIG_USB_MON=y |
1255 | 1266 | ||
1256 | # | 1267 | # |
@@ -1285,6 +1296,7 @@ CONFIG_USB_SERIAL_ARK3116=m | |||
1285 | # CONFIG_USB_SERIAL_KLSI is not set | 1296 | # CONFIG_USB_SERIAL_KLSI is not set |
1286 | # CONFIG_USB_SERIAL_KOBIL_SCT is not set | 1297 | # CONFIG_USB_SERIAL_KOBIL_SCT is not set |
1287 | # CONFIG_USB_SERIAL_MCT_U232 is not set | 1298 | # CONFIG_USB_SERIAL_MCT_U232 is not set |
1299 | # CONFIG_USB_SERIAL_MOS7720 is not set | ||
1288 | # CONFIG_USB_SERIAL_MOS7840 is not set | 1300 | # CONFIG_USB_SERIAL_MOS7840 is not set |
1289 | # CONFIG_USB_SERIAL_NAVMAN is not set | 1301 | # CONFIG_USB_SERIAL_NAVMAN is not set |
1290 | CONFIG_USB_SERIAL_PL2303=m | 1302 | CONFIG_USB_SERIAL_PL2303=m |
@@ -1316,6 +1328,7 @@ CONFIG_USB_SERIAL_PL2303=m | |||
1316 | # CONFIG_USB_APPLEDISPLAY is not set | 1328 | # CONFIG_USB_APPLEDISPLAY is not set |
1317 | # CONFIG_USB_SISUSBVGA is not set | 1329 | # CONFIG_USB_SISUSBVGA is not set |
1318 | # CONFIG_USB_LD is not set | 1330 | # CONFIG_USB_LD is not set |
1331 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
1319 | # CONFIG_USB_TEST is not set | 1332 | # CONFIG_USB_TEST is not set |
1320 | 1333 | ||
1321 | # | 1334 | # |
@@ -1357,7 +1370,26 @@ CONFIG_USB_SERIAL_PL2303=m | |||
1357 | # | 1370 | # |
1358 | # Real Time Clock | 1371 | # Real Time Clock |
1359 | # | 1372 | # |
1360 | # CONFIG_RTC_CLASS is not set | 1373 | CONFIG_RTC_LIB=m |
1374 | CONFIG_RTC_CLASS=m | ||
1375 | |||
1376 | # | ||
1377 | # RTC interfaces | ||
1378 | # | ||
1379 | CONFIG_RTC_INTF_SYSFS=m | ||
1380 | CONFIG_RTC_INTF_PROC=m | ||
1381 | CONFIG_RTC_INTF_DEV=m | ||
1382 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
1383 | |||
1384 | # | ||
1385 | # RTC drivers | ||
1386 | # | ||
1387 | # CONFIG_RTC_DRV_DS1553 is not set | ||
1388 | # CONFIG_RTC_DRV_DS1742 is not set | ||
1389 | # CONFIG_RTC_DRV_M48T86 is not set | ||
1390 | CONFIG_RTC_DRV_SH=m | ||
1391 | # CONFIG_RTC_DRV_TEST is not set | ||
1392 | # CONFIG_RTC_DRV_V3020 is not set | ||
1361 | 1393 | ||
1362 | # | 1394 | # |
1363 | # DMA Engine support | 1395 | # DMA Engine support |
@@ -1380,8 +1412,12 @@ CONFIG_EXT2_FS=y | |||
1380 | # CONFIG_EXT2_FS_XIP is not set | 1412 | # CONFIG_EXT2_FS_XIP is not set |
1381 | CONFIG_EXT3_FS=y | 1413 | CONFIG_EXT3_FS=y |
1382 | # CONFIG_EXT3_FS_XATTR is not set | 1414 | # CONFIG_EXT3_FS_XATTR is not set |
1415 | CONFIG_EXT4DEV_FS=m | ||
1416 | # CONFIG_EXT4DEV_FS_XATTR is not set | ||
1383 | CONFIG_JBD=y | 1417 | CONFIG_JBD=y |
1384 | # CONFIG_JBD_DEBUG is not set | 1418 | # CONFIG_JBD_DEBUG is not set |
1419 | CONFIG_JBD2=m | ||
1420 | # CONFIG_JBD2_DEBUG is not set | ||
1385 | CONFIG_REISERFS_FS=m | 1421 | CONFIG_REISERFS_FS=m |
1386 | # CONFIG_REISERFS_CHECK is not set | 1422 | # CONFIG_REISERFS_CHECK is not set |
1387 | # CONFIG_REISERFS_PROC_INFO is not set | 1423 | # CONFIG_REISERFS_PROC_INFO is not set |
@@ -1393,9 +1429,10 @@ CONFIG_XFS_FS=m | |||
1393 | # CONFIG_XFS_SECURITY is not set | 1429 | # CONFIG_XFS_SECURITY is not set |
1394 | # CONFIG_XFS_POSIX_ACL is not set | 1430 | # CONFIG_XFS_POSIX_ACL is not set |
1395 | # CONFIG_XFS_RT is not set | 1431 | # CONFIG_XFS_RT is not set |
1432 | # CONFIG_GFS2_FS is not set | ||
1396 | # CONFIG_OCFS2_FS is not set | 1433 | # CONFIG_OCFS2_FS is not set |
1397 | # CONFIG_MINIX_FS is not set | 1434 | # CONFIG_MINIX_FS is not set |
1398 | # CONFIG_ROMFS_FS is not set | 1435 | CONFIG_ROMFS_FS=y |
1399 | CONFIG_INOTIFY=y | 1436 | CONFIG_INOTIFY=y |
1400 | CONFIG_INOTIFY_USER=y | 1437 | CONFIG_INOTIFY_USER=y |
1401 | # CONFIG_QUOTA is not set | 1438 | # CONFIG_QUOTA is not set |
@@ -1480,7 +1517,12 @@ CONFIG_SUNRPC=y | |||
1480 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 1517 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
1481 | CONFIG_SMB_FS=m | 1518 | CONFIG_SMB_FS=m |
1482 | # CONFIG_SMB_NLS_DEFAULT is not set | 1519 | # CONFIG_SMB_NLS_DEFAULT is not set |
1483 | # CONFIG_CIFS is not set | 1520 | CONFIG_CIFS=m |
1521 | # CONFIG_CIFS_STATS is not set | ||
1522 | CONFIG_CIFS_WEAK_PW_HASH=y | ||
1523 | # CONFIG_CIFS_XATTR is not set | ||
1524 | # CONFIG_CIFS_DEBUG2 is not set | ||
1525 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
1484 | # CONFIG_NCP_FS is not set | 1526 | # CONFIG_NCP_FS is not set |
1485 | # CONFIG_CODA_FS is not set | 1527 | # CONFIG_CODA_FS is not set |
1486 | # CONFIG_AFS_FS is not set | 1528 | # CONFIG_AFS_FS is not set |
@@ -1583,9 +1625,10 @@ CONFIG_LOG_BUF_SHIFT=16 | |||
1583 | # CONFIG_DEBUG_LIST is not set | 1625 | # CONFIG_DEBUG_LIST is not set |
1584 | # CONFIG_FRAME_POINTER is not set | 1626 | # CONFIG_FRAME_POINTER is not set |
1585 | # CONFIG_FORCED_INLINING is not set | 1627 | # CONFIG_FORCED_INLINING is not set |
1628 | # CONFIG_HEADERS_CHECK is not set | ||
1586 | # CONFIG_RCU_TORTURE_TEST is not set | 1629 | # CONFIG_RCU_TORTURE_TEST is not set |
1587 | # CONFIG_SH_STANDARD_BIOS is not set | 1630 | # CONFIG_SH_STANDARD_BIOS is not set |
1588 | CONFIG_EARLY_SCIF_CONSOLE=y | 1631 | # CONFIG_EARLY_SCIF_CONSOLE is not set |
1589 | # CONFIG_EARLY_PRINTK is not set | 1632 | # CONFIG_EARLY_PRINTK is not set |
1590 | # CONFIG_DEBUG_STACKOVERFLOW is not set | 1633 | # CONFIG_DEBUG_STACKOVERFLOW is not set |
1591 | # CONFIG_DEBUG_STACK_USAGE is not set | 1634 | # CONFIG_DEBUG_STACK_USAGE is not set |
@@ -1605,7 +1648,7 @@ CONFIG_CRYPTO=y | |||
1605 | CONFIG_CRYPTO_ALGAPI=y | 1648 | CONFIG_CRYPTO_ALGAPI=y |
1606 | CONFIG_CRYPTO_BLKCIPHER=y | 1649 | CONFIG_CRYPTO_BLKCIPHER=y |
1607 | CONFIG_CRYPTO_HASH=y | 1650 | CONFIG_CRYPTO_HASH=y |
1608 | CONFIG_CRYPTO_MANAGER=m | 1651 | CONFIG_CRYPTO_MANAGER=y |
1609 | CONFIG_CRYPTO_HMAC=y | 1652 | CONFIG_CRYPTO_HMAC=y |
1610 | CONFIG_CRYPTO_NULL=m | 1653 | CONFIG_CRYPTO_NULL=m |
1611 | CONFIG_CRYPTO_MD4=m | 1654 | CONFIG_CRYPTO_MD4=m |
@@ -1615,7 +1658,7 @@ CONFIG_CRYPTO_SHA256=m | |||
1615 | CONFIG_CRYPTO_SHA512=m | 1658 | CONFIG_CRYPTO_SHA512=m |
1616 | CONFIG_CRYPTO_WP512=m | 1659 | CONFIG_CRYPTO_WP512=m |
1617 | CONFIG_CRYPTO_TGR192=m | 1660 | CONFIG_CRYPTO_TGR192=m |
1618 | CONFIG_CRYPTO_ECB=m | 1661 | CONFIG_CRYPTO_ECB=y |
1619 | CONFIG_CRYPTO_CBC=y | 1662 | CONFIG_CRYPTO_CBC=y |
1620 | CONFIG_CRYPTO_DES=y | 1663 | CONFIG_CRYPTO_DES=y |
1621 | CONFIG_CRYPTO_BLOWFISH=m | 1664 | CONFIG_CRYPTO_BLOWFISH=m |
diff --git a/arch/sh/drivers/dma/dma-sh.c b/arch/sh/drivers/dma/dma-sh.c index d8ece20bb2cf..660786013350 100644 --- a/arch/sh/drivers/dma/dma-sh.c +++ b/arch/sh/drivers/dma/dma-sh.c | |||
@@ -19,23 +19,34 @@ | |||
19 | #include <asm/io.h> | 19 | #include <asm/io.h> |
20 | #include "dma-sh.h" | 20 | #include "dma-sh.h" |
21 | 21 | ||
22 | static inline unsigned int get_dmte_irq(unsigned int chan) | ||
23 | { | ||
24 | unsigned int irq = 0; | ||
25 | 22 | ||
23 | |||
24 | #ifdef CONFIG_CPU_SH4 | ||
25 | static struct ipr_data dmae_ipr_map[] = { | ||
26 | { DMAE_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, | ||
27 | }; | ||
28 | #endif | ||
29 | static struct ipr_data dmte_ipr_map[] = { | ||
26 | /* | 30 | /* |
27 | * Normally we could just do DMTE0_IRQ + chan outright, though in the | 31 | * Normally we could just do DMTE0_IRQ + chan outright, though in the |
28 | * case of the 7751R, the DMTE IRQs for channels > 4 start right above | 32 | * case of the 7751R, the DMTE IRQs for channels > 4 start right above |
29 | * the SCIF | 33 | * the SCIF |
30 | */ | 34 | */ |
31 | if (chan < 4) { | 35 | { DMTE0_IRQ + 0, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, |
32 | irq = DMTE0_IRQ + chan; | 36 | { DMTE0_IRQ + 1, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, |
33 | } else { | 37 | { DMTE0_IRQ + 2, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, |
34 | #ifdef DMTE4_IRQ | 38 | { DMTE0_IRQ + 3, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, |
35 | irq = DMTE4_IRQ + chan - 4; | 39 | { DMTE4_IRQ + 0, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, |
36 | #endif | 40 | { DMTE4_IRQ + 1, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, |
37 | } | 41 | { DMTE4_IRQ + 2, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, |
42 | { DMTE4_IRQ + 3, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, | ||
43 | }; | ||
38 | 44 | ||
45 | static inline unsigned int get_dmte_irq(unsigned int chan) | ||
46 | { | ||
47 | unsigned int irq = 0; | ||
48 | if (chan < ARRAY_SIZE(dmte_ipr_map)) | ||
49 | irq = dmte_ipr_map[chan].irq; | ||
39 | return irq; | 50 | return irq; |
40 | } | 51 | } |
41 | 52 | ||
@@ -258,17 +269,16 @@ static int __init sh_dmac_init(void) | |||
258 | int i; | 269 | int i; |
259 | 270 | ||
260 | #ifdef CONFIG_CPU_SH4 | 271 | #ifdef CONFIG_CPU_SH4 |
261 | make_ipr_irq(DMAE_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | 272 | make_ipr_irq(dmae_ipr_map, ARRAY_SIZE(dmae_ipr_map)); |
262 | i = request_irq(DMAE_IRQ, dma_err, IRQF_DISABLED, "DMAC Address Error", 0); | 273 | i = request_irq(DMAE_IRQ, dma_err, IRQF_DISABLED, "DMAC Address Error", 0); |
263 | if (unlikely(i < 0)) | 274 | if (unlikely(i < 0)) |
264 | return i; | 275 | return i; |
265 | #endif | 276 | #endif |
266 | 277 | ||
267 | for (i = 0; i < info->nr_channels; i++) { | 278 | i = info->nr_channels; |
268 | int irq = get_dmte_irq(i); | 279 | if (i > ARRAY_SIZE(dmte_ipr_map)) |
269 | 280 | i = ARRAY_SIZE(dmte_ipr_map); | |
270 | make_ipr_irq(irq, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY); | 281 | make_ipr_irq(dmte_ipr_map, i); |
271 | } | ||
272 | 282 | ||
273 | /* | 283 | /* |
274 | * Initialize DMAOR, and clean up any error flags that may have | 284 | * Initialize DMAOR, and clean up any error flags that may have |
diff --git a/arch/sh/drivers/pci/ops-r7780rp.c b/arch/sh/drivers/pci/ops-r7780rp.c index 6e3ba9c65b40..eeea1577e112 100644 --- a/arch/sh/drivers/pci/ops-r7780rp.c +++ b/arch/sh/drivers/pci/ops-r7780rp.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/delay.h> | 14 | #include <linux/delay.h> |
15 | #include <linux/pci.h> | 15 | #include <linux/pci.h> |
16 | #include <asm/r7780rp/r7780rp.h> | 16 | #include <asm/r7780rp.h> |
17 | #include <asm/io.h> | 17 | #include <asm/io.h> |
18 | #include "pci-sh4.h" | 18 | #include "pci-sh4.h" |
19 | 19 | ||
diff --git a/arch/sh/drivers/pci/ops-rts7751r2d.c b/arch/sh/drivers/pci/ops-rts7751r2d.c index b68824c8b81e..4a518d948049 100644 --- a/arch/sh/drivers/pci/ops-rts7751r2d.c +++ b/arch/sh/drivers/pci/ops-rts7751r2d.c | |||
@@ -10,28 +10,24 @@ | |||
10 | * | 10 | * |
11 | * PCI initialization for the Renesas SH7751R RTS7751R2D board | 11 | * PCI initialization for the Renesas SH7751R RTS7751R2D board |
12 | */ | 12 | */ |
13 | |||
14 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
15 | #include <linux/types.h> | 14 | #include <linux/types.h> |
16 | #include <linux/init.h> | 15 | #include <linux/init.h> |
17 | #include <linux/delay.h> | ||
18 | #include <linux/pci.h> | 16 | #include <linux/pci.h> |
19 | #include <linux/module.h> | 17 | #include <linux/io.h> |
20 | #include <asm/rts7751r2d/rts7751r2d.h> | 18 | #include <asm/rts7751r2d.h> |
21 | #include <asm/io.h> | ||
22 | #include "pci-sh4.h" | 19 | #include "pci-sh4.h" |
23 | 20 | ||
21 | static u8 rts7751r2d_irq_tab[] __initdata = { | ||
22 | IRQ_PCISLOT1, | ||
23 | IRQ_PCISLOT2, | ||
24 | IRQ_PCMCIA, | ||
25 | IRQ_PCIETH, | ||
26 | }; | ||
27 | |||
24 | int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin) | 28 | int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin) |
25 | { | 29 | { |
26 | switch (slot) { | 30 | return rts7751r2d_irq_tab[slot]; |
27 | case 0: return IRQ_PCISLOT1; /* PCI Extend slot #1 */ | ||
28 | case 1: return IRQ_PCISLOT2; /* PCI Extend slot #2 */ | ||
29 | case 2: return IRQ_PCMCIA; /* PCI Cardbus Bridge */ | ||
30 | case 3: return IRQ_PCIETH; /* Realtek Ethernet controller */ | ||
31 | default: | ||
32 | printk("PCI: Bad IRQ mapping request for slot %d\n", slot); | ||
33 | return -1; | ||
34 | } | ||
35 | } | 31 | } |
36 | 32 | ||
37 | static struct resource sh7751_io_resource = { | 33 | static struct resource sh7751_io_resource = { |
diff --git a/arch/sh/kernel/cpu/irq/intc2.c b/arch/sh/kernel/cpu/irq/intc2.c index d4b2bb7e08c7..74ca576a7ce5 100644 --- a/arch/sh/kernel/cpu/irq/intc2.c +++ b/arch/sh/kernel/cpu/irq/intc2.c | |||
@@ -11,10 +11,9 @@ | |||
11 | * Hitachi 7751, the STM ST40 STB1, SH7760, and SH7780. | 11 | * Hitachi 7751, the STM ST40 STB1, SH7760, and SH7780. |
12 | */ | 12 | */ |
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/init.h> | ||
15 | #include <linux/irq.h> | 14 | #include <linux/irq.h> |
15 | #include <linux/io.h> | ||
16 | #include <asm/system.h> | 16 | #include <asm/system.h> |
17 | #include <asm/io.h> | ||
18 | 17 | ||
19 | static void disable_intc2_irq(unsigned int irq) | 18 | static void disable_intc2_irq(unsigned int irq) |
20 | { | 19 | { |
@@ -31,7 +30,7 @@ static void enable_intc2_irq(unsigned int irq) | |||
31 | } | 30 | } |
32 | 31 | ||
33 | static struct irq_chip intc2_irq_chip = { | 32 | static struct irq_chip intc2_irq_chip = { |
34 | .typename = "intc2", | 33 | .name = "INTC2", |
35 | .mask = disable_intc2_irq, | 34 | .mask = disable_intc2_irq, |
36 | .unmask = enable_intc2_irq, | 35 | .unmask = enable_intc2_irq, |
37 | .mask_ack = disable_intc2_irq, | 36 | .mask_ack = disable_intc2_irq, |
@@ -45,150 +44,36 @@ static struct irq_chip intc2_irq_chip = { | |||
45 | * PIO1 which is INTPRI00[19,16] and INTMSK00[13] | 44 | * PIO1 which is INTPRI00[19,16] and INTMSK00[13] |
46 | * would be: ^ ^ ^ ^ | 45 | * would be: ^ ^ ^ ^ |
47 | * | | | | | 46 | * | | | | |
48 | * make_intc2_irq(84, 0, 16, 0, 13); | 47 | * { 84, 0, 16, 0, 13 }, |
48 | * | ||
49 | * in the intc2_data table. | ||
49 | */ | 50 | */ |
50 | void make_intc2_irq(struct intc2_data *p) | 51 | void make_intc2_irq(struct intc2_data *table, unsigned int nr_irqs) |
51 | { | 52 | { |
52 | unsigned int flags; | 53 | int i; |
53 | unsigned long ipr; | ||
54 | |||
55 | disable_irq_nosync(p->irq); | ||
56 | |||
57 | /* Set the priority level */ | ||
58 | local_irq_save(flags); | ||
59 | |||
60 | ipr = ctrl_inl(INTC2_BASE + INTC2_INTPRI_OFFSET + p->ipr_offset); | ||
61 | ipr &= ~(0xf << p->ipr_shift); | ||
62 | ipr |= p->priority << p->ipr_shift; | ||
63 | ctrl_outl(ipr, INTC2_BASE + INTC2_INTPRI_OFFSET + p->ipr_offset); | ||
64 | |||
65 | local_irq_restore(flags); | ||
66 | 54 | ||
67 | set_irq_chip_and_handler(p->irq, &intc2_irq_chip, handle_level_irq); | 55 | for (i = 0; i < nr_irqs; i++) { |
68 | set_irq_chip_data(p->irq, p); | 56 | unsigned long ipr, flags; |
57 | struct intc2_data *p = table + i; | ||
69 | 58 | ||
70 | enable_intc2_irq(p->irq); | 59 | disable_irq_nosync(p->irq); |
71 | } | ||
72 | 60 | ||
73 | static struct intc2_data intc2_irq_table[] = { | 61 | /* Set the priority level */ |
74 | #if defined(CONFIG_CPU_SUBTYPE_ST40) | 62 | local_irq_save(flags); |
75 | {64, 0, 0, 0, 0, 13}, /* PCI serr */ | ||
76 | {65, 0, 4, 0, 1, 13}, /* PCI err */ | ||
77 | {66, 0, 4, 0, 2, 13}, /* PCI ad */ | ||
78 | {67, 0, 4, 0, 3, 13}, /* PCI pwd down */ | ||
79 | {72, 0, 8, 0, 5, 13}, /* DMAC INT0 */ | ||
80 | {73, 0, 8, 0, 6, 13}, /* DMAC INT1 */ | ||
81 | {74, 0, 8, 0, 7, 13}, /* DMAC INT2 */ | ||
82 | {75, 0, 8, 0, 8, 13}, /* DMAC INT3 */ | ||
83 | {76, 0, 8, 0, 9, 13}, /* DMAC INT4 */ | ||
84 | {78, 0, 8, 0, 11, 13}, /* DMAC ERR */ | ||
85 | {80, 0, 12, 0, 12, 13}, /* PIO0 */ | ||
86 | {84, 0, 16, 0, 13, 13}, /* PIO1 */ | ||
87 | {88, 0, 20, 0, 14, 13}, /* PIO2 */ | ||
88 | {112, 4, 0, 4, 0, 13}, /* Mailbox */ | ||
89 | #ifdef CONFIG_CPU_SUBTYPE_ST40GX1 | ||
90 | {116, 4, 4, 4, 4, 13}, /* SSC0 */ | ||
91 | {120, 4, 8, 4, 8, 13}, /* IR Blaster */ | ||
92 | {124, 4, 12, 4, 12, 13}, /* USB host */ | ||
93 | {128, 4, 16, 4, 16, 13}, /* Video processor BLITTER */ | ||
94 | {132, 4, 20, 4, 20, 13}, /* UART0 */ | ||
95 | {134, 4, 20, 4, 22, 13}, /* UART2 */ | ||
96 | {136, 4, 24, 4, 24, 13}, /* IO_PIO0 */ | ||
97 | {140, 4, 28, 4, 28, 13}, /* EMPI */ | ||
98 | {144, 8, 0, 8, 0, 13}, /* MAFE */ | ||
99 | {148, 8, 4, 8, 4, 13}, /* PWM */ | ||
100 | {152, 8, 8, 8, 8, 13}, /* SSC1 */ | ||
101 | {156, 8, 12, 8, 12, 13}, /* IO_PIO1 */ | ||
102 | {160, 8, 16, 8, 16, 13}, /* USB target */ | ||
103 | {164, 8, 20, 8, 20, 13}, /* UART1 */ | ||
104 | {168, 8, 24, 8, 24, 13}, /* Teletext */ | ||
105 | {172, 8, 28, 8, 28, 13}, /* VideoSync VTG */ | ||
106 | {173, 8, 28, 8, 29, 13}, /* VideoSync DVP0 */ | ||
107 | {174, 8, 28, 8, 30, 13}, /* VideoSync DVP1 */ | ||
108 | #endif | ||
109 | #elif defined(CONFIG_CPU_SUBTYPE_SH7760) | ||
110 | /* | ||
111 | * SH7760 INTC2-Style interrupts, vectors IRQ48-111 INTEVT 0x800-0xFE0 | ||
112 | */ | ||
113 | /* INTPRIO0 | INTMSK0 */ | ||
114 | {48, 0, 28, 0, 31, 3}, /* IRQ 4 */ | ||
115 | {49, 0, 24, 0, 30, 3}, /* IRQ 3 */ | ||
116 | {50, 0, 20, 0, 29, 3}, /* IRQ 2 */ | ||
117 | {51, 0, 16, 0, 28, 3}, /* IRQ 1 */ | ||
118 | /* 52-55 (INTEVT 0x880-0x8E0) unused/reserved */ | ||
119 | /* INTPRIO4 | INTMSK0 */ | ||
120 | {56, 4, 28, 0, 25, 3}, /* HCAN2_CHAN0 */ | ||
121 | {57, 4, 24, 0, 24, 3}, /* HCAN2_CHAN1 */ | ||
122 | {58, 4, 20, 0, 23, 3}, /* I2S_CHAN0 */ | ||
123 | {59, 4, 16, 0, 22, 3}, /* I2S_CHAN1 */ | ||
124 | {60, 4, 12, 0, 21, 3}, /* AC97_CHAN0 */ | ||
125 | {61, 4, 8, 0, 20, 3}, /* AC97_CHAN1 */ | ||
126 | {62, 4, 4, 0, 19, 3}, /* I2C_CHAN0 */ | ||
127 | {63, 4, 0, 0, 18, 3}, /* I2C_CHAN1 */ | ||
128 | /* INTPRIO8 | INTMSK0 */ | ||
129 | {52, 8, 16, 0, 11, 3}, /* SCIF0_ERI_IRQ */ | ||
130 | {53, 8, 16, 0, 10, 3}, /* SCIF0_RXI_IRQ */ | ||
131 | {54, 8, 16, 0, 9, 3}, /* SCIF0_BRI_IRQ */ | ||
132 | {55, 8, 16, 0, 8, 3}, /* SCIF0_TXI_IRQ */ | ||
133 | {64, 8, 28, 0, 17, 3}, /* USBHI_IRQ */ | ||
134 | {65, 8, 24, 0, 16, 3}, /* LCDC */ | ||
135 | /* 66, 67 unused */ | ||
136 | {68, 8, 20, 0, 14, 13}, /* DMABRGI0_IRQ */ | ||
137 | {69, 8, 20, 0, 13, 13}, /* DMABRGI1_IRQ */ | ||
138 | {70, 8, 20, 0, 12, 13}, /* DMABRGI2_IRQ */ | ||
139 | /* 71 unused */ | ||
140 | {72, 8, 12, 0, 7, 3}, /* SCIF1_ERI_IRQ */ | ||
141 | {73, 8, 12, 0, 6, 3}, /* SCIF1_RXI_IRQ */ | ||
142 | {74, 8, 12, 0, 5, 3}, /* SCIF1_BRI_IRQ */ | ||
143 | {75, 8, 12, 0, 4, 3}, /* SCIF1_TXI_IRQ */ | ||
144 | {76, 8, 8, 0, 3, 3}, /* SCIF2_ERI_IRQ */ | ||
145 | {77, 8, 8, 0, 2, 3}, /* SCIF2_RXI_IRQ */ | ||
146 | {78, 8, 8, 0, 1, 3}, /* SCIF2_BRI_IRQ */ | ||
147 | {79, 8, 8, 0, 0, 3}, /* SCIF2_TXI_IRQ */ | ||
148 | /* | INTMSK4 */ | ||
149 | {80, 8, 4, 4, 23, 3}, /* SIM_ERI */ | ||
150 | {81, 8, 4, 4, 22, 3}, /* SIM_RXI */ | ||
151 | {82, 8, 4, 4, 21, 3}, /* SIM_TXI */ | ||
152 | {83, 8, 4, 4, 20, 3}, /* SIM_TEI */ | ||
153 | {84, 8, 0, 4, 19, 3}, /* HSPII */ | ||
154 | /* INTPRIOC | INTMSK4 */ | ||
155 | /* 85-87 unused/reserved */ | ||
156 | {88, 12, 20, 4, 18, 3}, /* MMCI0 */ | ||
157 | {89, 12, 20, 4, 17, 3}, /* MMCI1 */ | ||
158 | {90, 12, 20, 4, 16, 3}, /* MMCI2 */ | ||
159 | {91, 12, 20, 4, 15, 3}, /* MMCI3 */ | ||
160 | {92, 12, 12, 4, 6, 3}, /* MFI (unsure, bug? in my 7760 manual*/ | ||
161 | /* 93-107 reserved/undocumented */ | ||
162 | {108,12, 4, 4, 1, 3}, /* ADC */ | ||
163 | {109,12, 0, 4, 0, 3}, /* CMTI */ | ||
164 | /* 110-111 reserved/unused */ | ||
165 | #elif defined(CONFIG_CPU_SUBTYPE_SH7780) | ||
166 | { TIMER_IRQ, 0, 24, 0, INTC_TMU0_MSK, 2}, | ||
167 | { 21, 1, 0, 0, INTC_RTC_MSK, TIMER_PRIORITY }, | ||
168 | { 22, 1, 1, 0, INTC_RTC_MSK, TIMER_PRIORITY }, | ||
169 | { 23, 1, 2, 0, INTC_RTC_MSK, TIMER_PRIORITY }, | ||
170 | { SCIF0_ERI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY }, | ||
171 | { SCIF0_RXI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY }, | ||
172 | { SCIF0_BRI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY }, | ||
173 | { SCIF0_TXI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY }, | ||
174 | 63 | ||
175 | { SCIF1_ERI_IRQ, 8, 16, 0, INTC_SCIF1_MSK, SCIF1_PRIORITY }, | 64 | ipr = ctrl_inl(INTC2_BASE + INTC2_INTPRI_OFFSET + |
176 | { SCIF1_RXI_IRQ, 8, 16, 0, INTC_SCIF1_MSK, SCIF1_PRIORITY }, | 65 | p->ipr_offset); |
177 | { SCIF1_BRI_IRQ, 8, 16, 0, INTC_SCIF1_MSK, SCIF1_PRIORITY }, | 66 | ipr &= ~(0xf << p->ipr_shift); |
178 | { SCIF1_TXI_IRQ, 8, 16, 0, INTC_SCIF1_MSK, SCIF1_PRIORITY }, | 67 | ipr |= p->priority << p->ipr_shift; |
68 | ctrl_outl(ipr, INTC2_BASE + INTC2_INTPRI_OFFSET + | ||
69 | p->ipr_offset); | ||
179 | 70 | ||
180 | { PCIC0_IRQ, 0x10, 8, 0, INTC_PCIC0_MSK, PCIC0_PRIORITY }, | 71 | local_irq_restore(flags); |
181 | { PCIC1_IRQ, 0x10, 0, 0, INTC_PCIC1_MSK, PCIC1_PRIORITY }, | ||
182 | { PCIC2_IRQ, 0x14, 24, 0, INTC_PCIC2_MSK, PCIC2_PRIORITY }, | ||
183 | { PCIC3_IRQ, 0x14, 16, 0, INTC_PCIC3_MSK, PCIC3_PRIORITY }, | ||
184 | { PCIC4_IRQ, 0x14, 8, 0, INTC_PCIC4_MSK, PCIC4_PRIORITY }, | ||
185 | #endif | ||
186 | }; | ||
187 | 72 | ||
188 | void __init init_IRQ_intc2(void) | 73 | set_irq_chip_and_handler_name(p->irq, &intc2_irq_chip, |
189 | { | 74 | handle_level_irq, "level"); |
190 | int i; | 75 | set_irq_chip_data(p->irq, p); |
191 | 76 | ||
192 | for (i = 0; i < ARRAY_SIZE(intc2_irq_table); i++) | 77 | enable_intc2_irq(p->irq); |
193 | make_intc2_irq(intc2_irq_table + i); | 78 | } |
194 | } | 79 | } |
diff --git a/arch/sh/kernel/cpu/irq/ipr.c b/arch/sh/kernel/cpu/irq/ipr.c index 8944abdf6e1c..a0089563cbfc 100644 --- a/arch/sh/kernel/cpu/irq/ipr.c +++ b/arch/sh/kernel/cpu/irq/ipr.c | |||
@@ -23,93 +23,81 @@ | |||
23 | #include <asm/io.h> | 23 | #include <asm/io.h> |
24 | #include <asm/machvec.h> | 24 | #include <asm/machvec.h> |
25 | 25 | ||
26 | struct ipr_data { | ||
27 | unsigned int addr; /* Address of Interrupt Priority Register */ | ||
28 | int shift; /* Shifts of the 16-bit data */ | ||
29 | int priority; /* The priority */ | ||
30 | }; | ||
31 | 26 | ||
32 | static void disable_ipr_irq(unsigned int irq) | 27 | static void disable_ipr_irq(unsigned int irq) |
33 | { | 28 | { |
34 | struct ipr_data *p = get_irq_chip_data(irq); | 29 | struct ipr_data *p = get_irq_chip_data(irq); |
30 | int shift = p->shift*4; | ||
35 | /* Set the priority in IPR to 0 */ | 31 | /* Set the priority in IPR to 0 */ |
36 | ctrl_outw(ctrl_inw(p->addr) & (0xffff ^ (0xf << p->shift)), p->addr); | 32 | ctrl_outw(ctrl_inw(p->addr) & (0xffff ^ (0xf << shift)), p->addr); |
37 | } | 33 | } |
38 | 34 | ||
39 | static void enable_ipr_irq(unsigned int irq) | 35 | static void enable_ipr_irq(unsigned int irq) |
40 | { | 36 | { |
41 | struct ipr_data *p = get_irq_chip_data(irq); | 37 | struct ipr_data *p = get_irq_chip_data(irq); |
38 | int shift = p->shift*4; | ||
42 | /* Set priority in IPR back to original value */ | 39 | /* Set priority in IPR back to original value */ |
43 | ctrl_outw(ctrl_inw(p->addr) | (p->priority << p->shift), p->addr); | 40 | ctrl_outw(ctrl_inw(p->addr) | (p->priority << shift), p->addr); |
44 | } | 41 | } |
45 | 42 | ||
46 | static struct irq_chip ipr_irq_chip = { | 43 | static struct irq_chip ipr_irq_chip = { |
47 | .name = "ipr", | 44 | .name = "IPR", |
48 | .mask = disable_ipr_irq, | 45 | .mask = disable_ipr_irq, |
49 | .unmask = enable_ipr_irq, | 46 | .unmask = enable_ipr_irq, |
50 | .mask_ack = disable_ipr_irq, | 47 | .mask_ack = disable_ipr_irq, |
51 | }; | 48 | }; |
52 | 49 | ||
53 | void make_ipr_irq(unsigned int irq, unsigned int addr, int pos, int priority) | 50 | void make_ipr_irq(struct ipr_data *table, unsigned int nr_irqs) |
54 | { | 51 | { |
55 | struct ipr_data ipr_data; | 52 | int i; |
56 | 53 | ||
57 | disable_irq_nosync(irq); | 54 | for (i = 0; i < nr_irqs; i++) { |
58 | 55 | unsigned int irq = table[i].irq; | |
59 | ipr_data.addr = addr; | 56 | disable_irq_nosync(irq); |
60 | ipr_data.shift = pos*4; /* POSition (0-3) x 4 means shift */ | 57 | set_irq_chip_and_handler_name(irq, &ipr_irq_chip, |
61 | ipr_data.priority = priority; | 58 | handle_level_irq, "level"); |
62 | 59 | set_irq_chip_data(irq, &table[i]); | |
63 | set_irq_chip_and_handler(irq, &ipr_irq_chip, handle_level_irq); | 60 | enable_ipr_irq(irq); |
64 | set_irq_chip_data(irq, &ipr_data); | 61 | } |
65 | |||
66 | enable_ipr_irq(irq); | ||
67 | } | 62 | } |
63 | EXPORT_SYMBOL(make_ipr_irq); | ||
68 | 64 | ||
69 | /* XXX: This needs to die a horrible death.. */ | 65 | static struct ipr_data sys_ipr_map[] = { |
70 | void __init init_IRQ(void) | ||
71 | { | ||
72 | #ifndef CONFIG_CPU_SUBTYPE_SH7780 | 66 | #ifndef CONFIG_CPU_SUBTYPE_SH7780 |
73 | make_ipr_irq(TIMER_IRQ, TIMER_IPR_ADDR, TIMER_IPR_POS, TIMER_PRIORITY); | 67 | { TIMER_IRQ, TIMER_IPR_ADDR, TIMER_IPR_POS, TIMER_PRIORITY }, |
74 | make_ipr_irq(TIMER1_IRQ, TIMER1_IPR_ADDR, TIMER1_IPR_POS, TIMER1_PRIORITY); | 68 | { TIMER1_IRQ, TIMER1_IPR_ADDR, TIMER1_IPR_POS, TIMER1_PRIORITY }, |
75 | #ifdef RTC_IRQ | 69 | #ifdef RTC_IRQ |
76 | make_ipr_irq(RTC_IRQ, RTC_IPR_ADDR, RTC_IPR_POS, RTC_PRIORITY); | 70 | { RTC_IRQ, RTC_IPR_ADDR, RTC_IPR_POS, RTC_PRIORITY }, |
77 | #endif | 71 | #endif |
78 | |||
79 | #ifdef SCI_ERI_IRQ | 72 | #ifdef SCI_ERI_IRQ |
80 | make_ipr_irq(SCI_ERI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY); | 73 | { SCI_ERI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY }, |
81 | make_ipr_irq(SCI_RXI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY); | 74 | { SCI_RXI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY }, |
82 | make_ipr_irq(SCI_TXI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY); | 75 | { SCI_TXI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY }, |
83 | #endif | 76 | #endif |
84 | |||
85 | #ifdef SCIF1_ERI_IRQ | 77 | #ifdef SCIF1_ERI_IRQ |
86 | make_ipr_irq(SCIF1_ERI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY); | 78 | { SCIF1_ERI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY }, |
87 | make_ipr_irq(SCIF1_RXI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY); | 79 | { SCIF1_RXI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY }, |
88 | make_ipr_irq(SCIF1_BRI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY); | 80 | { SCIF1_BRI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY }, |
89 | make_ipr_irq(SCIF1_TXI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY); | 81 | { SCIF1_TXI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY }, |
90 | #endif | 82 | #endif |
91 | |||
92 | #if defined(CONFIG_CPU_SUBTYPE_SH7300) | 83 | #if defined(CONFIG_CPU_SUBTYPE_SH7300) |
93 | make_ipr_irq(SCIF0_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY); | 84 | { SCIF0_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY }, |
94 | make_ipr_irq(DMTE2_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY); | 85 | { DMTE2_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY }, |
95 | make_ipr_irq(DMTE3_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY); | 86 | { DMTE3_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY }, |
96 | make_ipr_irq(VIO_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY); | 87 | { VIO_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY }, |
97 | #endif | 88 | #endif |
98 | |||
99 | #ifdef SCIF_ERI_IRQ | 89 | #ifdef SCIF_ERI_IRQ |
100 | make_ipr_irq(SCIF_ERI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY); | 90 | { SCIF_ERI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY }, |
101 | make_ipr_irq(SCIF_RXI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY); | 91 | { SCIF_RXI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY }, |
102 | make_ipr_irq(SCIF_BRI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY); | 92 | { SCIF_BRI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY }, |
103 | make_ipr_irq(SCIF_TXI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY); | 93 | { SCIF_TXI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY }, |
104 | #endif | 94 | #endif |
105 | |||
106 | #ifdef IRDA_ERI_IRQ | 95 | #ifdef IRDA_ERI_IRQ |
107 | make_ipr_irq(IRDA_ERI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY); | 96 | { IRDA_ERI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY }, |
108 | make_ipr_irq(IRDA_RXI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY); | 97 | { IRDA_RXI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY }, |
109 | make_ipr_irq(IRDA_BRI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY); | 98 | { IRDA_BRI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY }, |
110 | make_ipr_irq(IRDA_TXI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY); | 99 | { IRDA_TXI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY }, |
111 | #endif | 100 | #endif |
112 | |||
113 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \ | 101 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \ |
114 | defined(CONFIG_CPU_SUBTYPE_SH7706) || \ | 102 | defined(CONFIG_CPU_SUBTYPE_SH7706) || \ |
115 | defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705) | 103 | defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705) |
@@ -123,14 +111,19 @@ void __init init_IRQ(void) | |||
123 | * You should set corresponding bits of PFC to "00" | 111 | * You should set corresponding bits of PFC to "00" |
124 | * to enable these interrupts. | 112 | * to enable these interrupts. |
125 | */ | 113 | */ |
126 | make_ipr_irq(IRQ0_IRQ, IRQ0_IPR_ADDR, IRQ0_IPR_POS, IRQ0_PRIORITY); | 114 | { IRQ0_IRQ, IRQ0_IPR_ADDR, IRQ0_IPR_POS, IRQ0_PRIORITY }, |
127 | make_ipr_irq(IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, IRQ1_PRIORITY); | 115 | { IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, IRQ1_PRIORITY }, |
128 | make_ipr_irq(IRQ2_IRQ, IRQ2_IPR_ADDR, IRQ2_IPR_POS, IRQ2_PRIORITY); | 116 | { IRQ2_IRQ, IRQ2_IPR_ADDR, IRQ2_IPR_POS, IRQ2_PRIORITY }, |
129 | make_ipr_irq(IRQ3_IRQ, IRQ3_IPR_ADDR, IRQ3_IPR_POS, IRQ3_PRIORITY); | 117 | { IRQ3_IRQ, IRQ3_IPR_ADDR, IRQ3_IPR_POS, IRQ3_PRIORITY }, |
130 | make_ipr_irq(IRQ4_IRQ, IRQ4_IPR_ADDR, IRQ4_IPR_POS, IRQ4_PRIORITY); | 118 | { IRQ4_IRQ, IRQ4_IPR_ADDR, IRQ4_IPR_POS, IRQ4_PRIORITY }, |
131 | make_ipr_irq(IRQ5_IRQ, IRQ5_IPR_ADDR, IRQ5_IPR_POS, IRQ5_PRIORITY); | 119 | { IRQ5_IRQ, IRQ5_IPR_ADDR, IRQ5_IPR_POS, IRQ5_PRIORITY }, |
132 | #endif | 120 | #endif |
133 | #endif | 121 | #endif |
122 | }; | ||
123 | |||
124 | void __init init_IRQ(void) | ||
125 | { | ||
126 | make_ipr_irq(sys_ipr_map, ARRAY_SIZE(sys_ipr_map)); | ||
134 | 127 | ||
135 | #ifdef CONFIG_CPU_HAS_PINT_IRQ | 128 | #ifdef CONFIG_CPU_HAS_PINT_IRQ |
136 | init_IRQ_pint(); | 129 | init_IRQ_pint(); |
@@ -152,5 +145,3 @@ int ipr_irq_demux(int irq) | |||
152 | return irq; | 145 | return irq; |
153 | } | 146 | } |
154 | #endif | 147 | #endif |
155 | |||
156 | EXPORT_SYMBOL(make_ipr_irq); | ||
diff --git a/arch/sh/kernel/cpu/irq/pint.c b/arch/sh/kernel/cpu/irq/pint.c index 17f47b373d6e..f60007783a21 100644 --- a/arch/sh/kernel/cpu/irq/pint.c +++ b/arch/sh/kernel/cpu/irq/pint.c | |||
@@ -84,12 +84,16 @@ void make_pint_irq(unsigned int irq) | |||
84 | disable_pint_irq(irq); | 84 | disable_pint_irq(irq); |
85 | } | 85 | } |
86 | 86 | ||
87 | static struct ipr_data pint_ipr_map[] = { | ||
88 | { PINT0_IRQ, PINT0_IPR_ADDR, PINT0_IPR_POS, PINT0_PRIORITY }, | ||
89 | { PINT8_IRQ, PINT8_IPR_ADDR, PINT8_IPR_POS, PINT8_PRIORITY }, | ||
90 | }; | ||
91 | |||
87 | void __init init_IRQ_pint(void) | 92 | void __init init_IRQ_pint(void) |
88 | { | 93 | { |
89 | int i; | 94 | int i; |
90 | 95 | ||
91 | make_ipr_irq(PINT0_IRQ, PINT0_IPR_ADDR, PINT0_IPR_POS, PINT0_PRIORITY); | 96 | make_ipr_irq(pint_ipr_map, ARRAY_SIZE(pint_ipr_map)); |
92 | make_ipr_irq(PINT8_IRQ, PINT8_IPR_ADDR, PINT8_IPR_POS, PINT8_PRIORITY); | ||
93 | 97 | ||
94 | enable_irq(PINT0_IRQ); | 98 | enable_irq(PINT0_IRQ); |
95 | enable_irq(PINT8_IRQ); | 99 | enable_irq(PINT8_IRQ); |
diff --git a/arch/sh/kernel/cpu/sh3/ex.S b/arch/sh/kernel/cpu/sh3/ex.S index 6be46f0686b7..ba3082d640b5 100644 --- a/arch/sh/kernel/cpu/sh3/ex.S +++ b/arch/sh/kernel/cpu/sh3/ex.S | |||
@@ -4,7 +4,7 @@ | |||
4 | * The SH-3 exception vector table. | 4 | * The SH-3 exception vector table. |
5 | 5 | ||
6 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka | 6 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka |
7 | * Copyright (C) 2003 Paul Mundt | 7 | * Copyright (C) 2003 - 2006 Paul Mundt |
8 | * | 8 | * |
9 | * This file is subject to the terms and conditions of the GNU General Public | 9 | * This file is subject to the terms and conditions of the GNU General Public |
10 | * License. See the file "COPYING" in the main directory of this archive | 10 | * License. See the file "COPYING" in the main directory of this archive |
@@ -49,3 +49,10 @@ ENTRY(nmi_slot) | |||
49 | #endif | 49 | #endif |
50 | ENTRY(user_break_point_trap) | 50 | ENTRY(user_break_point_trap) |
51 | .long break_point_trap /* 1E0 */ | 51 | .long break_point_trap /* 1E0 */ |
52 | |||
53 | /* | ||
54 | * Pad the remainder of the table out, exceptions residing in far | ||
55 | * away offsets can be manually inserted in to their appropriate | ||
56 | * location via set_exception_table_{evt,vec}(). | ||
57 | */ | ||
58 | .balign 4096,0,4096 | ||
diff --git a/arch/sh/kernel/cpu/sh4/ex.S b/arch/sh/kernel/cpu/sh4/ex.S index 3f4cd043e900..ac8ab57413cc 100644 --- a/arch/sh/kernel/cpu/sh4/ex.S +++ b/arch/sh/kernel/cpu/sh4/ex.S | |||
@@ -4,7 +4,7 @@ | |||
4 | * The SH-4 exception vector table. | 4 | * The SH-4 exception vector table. |
5 | 5 | ||
6 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka | 6 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka |
7 | * Copyright (C) 2003 Paul Mundt | 7 | * Copyright (C) 2003 - 2006 Paul Mundt |
8 | * | 8 | * |
9 | * This file is subject to the terms and conditions of the GNU General Public | 9 | * This file is subject to the terms and conditions of the GNU General Public |
10 | * License. See the file "COPYING" in the main directory of this archive | 10 | * License. See the file "COPYING" in the main directory of this archive |
@@ -53,3 +53,10 @@ ENTRY(nmi_slot) | |||
53 | #endif | 53 | #endif |
54 | ENTRY(user_break_point_trap) | 54 | ENTRY(user_break_point_trap) |
55 | .long break_point_trap /* 1E0 */ | 55 | .long break_point_trap /* 1E0 */ |
56 | |||
57 | /* | ||
58 | * Pad the remainder of the table out, exceptions residing in far | ||
59 | * away offsets can be manually inserted in to their appropriate | ||
60 | * location via set_exception_table_{evt,vec}(). | ||
61 | */ | ||
62 | .balign 4096,0,4096 | ||
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7760.c b/arch/sh/kernel/cpu/sh4/setup-sh7760.c index 97f1c9af35d6..07e5377bf550 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh7760.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh7760.c | |||
@@ -51,3 +51,66 @@ static int __init sh7760_devices_setup(void) | |||
51 | ARRAY_SIZE(sh7760_devices)); | 51 | ARRAY_SIZE(sh7760_devices)); |
52 | } | 52 | } |
53 | __initcall(sh7760_devices_setup); | 53 | __initcall(sh7760_devices_setup); |
54 | |||
55 | /* | ||
56 | * SH7760 INTC2-Style interrupts, vectors IRQ48-111 INTEVT 0x800-0xFE0 | ||
57 | */ | ||
58 | static struct intc2_data intc2_irq_table[] = { | ||
59 | /* INTPRIO0 | INTMSK0 */ | ||
60 | {48, 0, 28, 0, 31, 3}, /* IRQ 4 */ | ||
61 | {49, 0, 24, 0, 30, 3}, /* IRQ 3 */ | ||
62 | {50, 0, 20, 0, 29, 3}, /* IRQ 2 */ | ||
63 | {51, 0, 16, 0, 28, 3}, /* IRQ 1 */ | ||
64 | /* 52-55 (INTEVT 0x880-0x8E0) unused/reserved */ | ||
65 | /* INTPRIO4 | INTMSK0 */ | ||
66 | {56, 4, 28, 0, 25, 3}, /* HCAN2_CHAN0 */ | ||
67 | {57, 4, 24, 0, 24, 3}, /* HCAN2_CHAN1 */ | ||
68 | {58, 4, 20, 0, 23, 3}, /* I2S_CHAN0 */ | ||
69 | {59, 4, 16, 0, 22, 3}, /* I2S_CHAN1 */ | ||
70 | {60, 4, 12, 0, 21, 3}, /* AC97_CHAN0 */ | ||
71 | {61, 4, 8, 0, 20, 3}, /* AC97_CHAN1 */ | ||
72 | {62, 4, 4, 0, 19, 3}, /* I2C_CHAN0 */ | ||
73 | {63, 4, 0, 0, 18, 3}, /* I2C_CHAN1 */ | ||
74 | /* INTPRIO8 | INTMSK0 */ | ||
75 | {52, 8, 16, 0, 11, 3}, /* SCIF0_ERI_IRQ */ | ||
76 | {53, 8, 16, 0, 10, 3}, /* SCIF0_RXI_IRQ */ | ||
77 | {54, 8, 16, 0, 9, 3}, /* SCIF0_BRI_IRQ */ | ||
78 | {55, 8, 16, 0, 8, 3}, /* SCIF0_TXI_IRQ */ | ||
79 | {64, 8, 28, 0, 17, 3}, /* USBHI_IRQ */ | ||
80 | {65, 8, 24, 0, 16, 3}, /* LCDC */ | ||
81 | /* 66, 67 unused */ | ||
82 | {68, 8, 20, 0, 14, 13}, /* DMABRGI0_IRQ */ | ||
83 | {69, 8, 20, 0, 13, 13}, /* DMABRGI1_IRQ */ | ||
84 | {70, 8, 20, 0, 12, 13}, /* DMABRGI2_IRQ */ | ||
85 | /* 71 unused */ | ||
86 | {72, 8, 12, 0, 7, 3}, /* SCIF1_ERI_IRQ */ | ||
87 | {73, 8, 12, 0, 6, 3}, /* SCIF1_RXI_IRQ */ | ||
88 | {74, 8, 12, 0, 5, 3}, /* SCIF1_BRI_IRQ */ | ||
89 | {75, 8, 12, 0, 4, 3}, /* SCIF1_TXI_IRQ */ | ||
90 | {76, 8, 8, 0, 3, 3}, /* SCIF2_ERI_IRQ */ | ||
91 | {77, 8, 8, 0, 2, 3}, /* SCIF2_RXI_IRQ */ | ||
92 | {78, 8, 8, 0, 1, 3}, /* SCIF2_BRI_IRQ */ | ||
93 | {79, 8, 8, 0, 0, 3}, /* SCIF2_TXI_IRQ */ | ||
94 | /* | INTMSK4 */ | ||
95 | {80, 8, 4, 4, 23, 3}, /* SIM_ERI */ | ||
96 | {81, 8, 4, 4, 22, 3}, /* SIM_RXI */ | ||
97 | {82, 8, 4, 4, 21, 3}, /* SIM_TXI */ | ||
98 | {83, 8, 4, 4, 20, 3}, /* SIM_TEI */ | ||
99 | {84, 8, 0, 4, 19, 3}, /* HSPII */ | ||
100 | /* INTPRIOC | INTMSK4 */ | ||
101 | /* 85-87 unused/reserved */ | ||
102 | {88, 12, 20, 4, 18, 3}, /* MMCI0 */ | ||
103 | {89, 12, 20, 4, 17, 3}, /* MMCI1 */ | ||
104 | {90, 12, 20, 4, 16, 3}, /* MMCI2 */ | ||
105 | {91, 12, 20, 4, 15, 3}, /* MMCI3 */ | ||
106 | {92, 12, 12, 4, 6, 3}, /* MFI (unsure, bug? in my 7760 manual*/ | ||
107 | /* 93-107 reserved/undocumented */ | ||
108 | {108,12, 4, 4, 1, 3}, /* ADC */ | ||
109 | {109,12, 0, 4, 0, 3}, /* CMTI */ | ||
110 | /* 110-111 reserved/unused */ | ||
111 | }; | ||
112 | |||
113 | void __init init_IRQ_intc2(void) | ||
114 | { | ||
115 | make_intc2_irq(intc2_irq_table, ARRAY_SIZE(intc2_irq_table)); | ||
116 | } | ||
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7780.c b/arch/sh/kernel/cpu/sh4/setup-sh7780.c index 72493f259edc..814ddb226531 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh7780.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh7780.c | |||
@@ -77,3 +77,30 @@ static int __init sh7780_devices_setup(void) | |||
77 | ARRAY_SIZE(sh7780_devices)); | 77 | ARRAY_SIZE(sh7780_devices)); |
78 | } | 78 | } |
79 | __initcall(sh7780_devices_setup); | 79 | __initcall(sh7780_devices_setup); |
80 | |||
81 | static struct intc2_data intc2_irq_table[] = { | ||
82 | { TIMER_IRQ, 0, 24, 0, INTC_TMU0_MSK, 2 }, | ||
83 | { 21, 1, 0, 0, INTC_RTC_MSK, TIMER_PRIORITY }, | ||
84 | { 22, 1, 1, 0, INTC_RTC_MSK, TIMER_PRIORITY }, | ||
85 | { 23, 1, 2, 0, INTC_RTC_MSK, TIMER_PRIORITY }, | ||
86 | { SCIF0_ERI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY }, | ||
87 | { SCIF0_RXI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY }, | ||
88 | { SCIF0_BRI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY }, | ||
89 | { SCIF0_TXI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY }, | ||
90 | |||
91 | { SCIF1_ERI_IRQ, 8, 16, 0, INTC_SCIF1_MSK, SCIF1_PRIORITY }, | ||
92 | { SCIF1_RXI_IRQ, 8, 16, 0, INTC_SCIF1_MSK, SCIF1_PRIORITY }, | ||
93 | { SCIF1_BRI_IRQ, 8, 16, 0, INTC_SCIF1_MSK, SCIF1_PRIORITY }, | ||
94 | { SCIF1_TXI_IRQ, 8, 16, 0, INTC_SCIF1_MSK, SCIF1_PRIORITY }, | ||
95 | |||
96 | { PCIC0_IRQ, 0x10, 8, 0, INTC_PCIC0_MSK, PCIC0_PRIORITY }, | ||
97 | { PCIC1_IRQ, 0x10, 0, 0, INTC_PCIC1_MSK, PCIC1_PRIORITY }, | ||
98 | { PCIC2_IRQ, 0x14, 24, 0, INTC_PCIC2_MSK, PCIC2_PRIORITY }, | ||
99 | { PCIC3_IRQ, 0x14, 16, 0, INTC_PCIC3_MSK, PCIC3_PRIORITY }, | ||
100 | { PCIC4_IRQ, 0x14, 8, 0, INTC_PCIC4_MSK, PCIC4_PRIORITY }, | ||
101 | }; | ||
102 | |||
103 | void __init init_IRQ_intc2(void) | ||
104 | { | ||
105 | make_intc2_irq(intc2_irq_table, ARRAY_SIZE(intc2_irq_table)); | ||
106 | } | ||
diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c index acf2602569c4..944128ce9706 100644 --- a/arch/sh/kernel/irq.c +++ b/arch/sh/kernel/irq.c | |||
@@ -54,7 +54,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
54 | for_each_online_cpu(j) | 54 | for_each_online_cpu(j) |
55 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 55 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
56 | seq_printf(p, " %14s", irq_desc[i].chip->name); | 56 | seq_printf(p, " %14s", irq_desc[i].chip->name); |
57 | seq_printf(p, "-%s", handle_irq_name(irq_desc[i].handle_irq)); | 57 | seq_printf(p, "-%-8s", irq_desc[i].name); |
58 | seq_printf(p, " %s", action->name); | 58 | seq_printf(p, " %s", action->name); |
59 | 59 | ||
60 | for (action=action->next; action; action = action->next) | 60 | for (action=action->next; action; action = action->next) |
diff --git a/arch/sh/kernel/process.c b/arch/sh/kernel/process.c index 91516dca4a85..a52b13ac6b7f 100644 --- a/arch/sh/kernel/process.c +++ b/arch/sh/kernel/process.c | |||
@@ -105,7 +105,7 @@ void show_regs(struct pt_regs * regs) | |||
105 | { | 105 | { |
106 | printk("\n"); | 106 | printk("\n"); |
107 | printk("Pid : %d, Comm: %20s\n", current->pid, current->comm); | 107 | printk("Pid : %d, Comm: %20s\n", current->pid, current->comm); |
108 | print_symbol("PC is at %s\n", regs->pc); | 108 | print_symbol("PC is at %s\n", instruction_pointer(regs)); |
109 | printk("PC : %08lx SP : %08lx SR : %08lx ", | 109 | printk("PC : %08lx SP : %08lx SR : %08lx ", |
110 | regs->pc, regs->regs[15], regs->sr); | 110 | regs->pc, regs->regs[15], regs->sr); |
111 | #ifdef CONFIG_MMU | 111 | #ifdef CONFIG_MMU |
@@ -130,15 +130,7 @@ void show_regs(struct pt_regs * regs) | |||
130 | printk("MACH: %08lx MACL: %08lx GBR : %08lx PR : %08lx\n", | 130 | printk("MACH: %08lx MACL: %08lx GBR : %08lx PR : %08lx\n", |
131 | regs->mach, regs->macl, regs->gbr, regs->pr); | 131 | regs->mach, regs->macl, regs->gbr, regs->pr); |
132 | 132 | ||
133 | /* | 133 | show_trace(NULL, (unsigned long *)regs->regs[15], regs); |
134 | * If we're in kernel mode, dump the stack too.. | ||
135 | */ | ||
136 | if (!user_mode(regs)) { | ||
137 | extern void show_task(unsigned long *sp); | ||
138 | unsigned long sp = regs->regs[15]; | ||
139 | |||
140 | show_task((unsigned long *)sp); | ||
141 | } | ||
142 | } | 134 | } |
143 | 135 | ||
144 | /* | 136 | /* |
diff --git a/arch/sh/kernel/syscalls.S b/arch/sh/kernel/syscalls.S index 768334e95075..ca81976e9e34 100644 --- a/arch/sh/kernel/syscalls.S +++ b/arch/sh/kernel/syscalls.S | |||
@@ -351,3 +351,6 @@ ENTRY(sys_call_table) | |||
351 | .long sys_sync_file_range | 351 | .long sys_sync_file_range |
352 | .long sys_tee /* 315 */ | 352 | .long sys_tee /* 315 */ |
353 | .long sys_vmsplice | 353 | .long sys_vmsplice |
354 | .long sys_move_pages | ||
355 | .long sys_getcpu | ||
356 | .long sys_epoll_pwait | ||
diff --git a/arch/sh/kernel/traps.c b/arch/sh/kernel/traps.c index c2c597e09482..53dfa55f3156 100644 --- a/arch/sh/kernel/traps.c +++ b/arch/sh/kernel/traps.c | |||
@@ -1,38 +1,25 @@ | |||
1 | /* $Id: traps.c,v 1.17 2004/05/02 01:46:30 sugioka Exp $ | 1 | /* |
2 | * | 2 | * 'traps.c' handles hardware traps and faults after we have saved some |
3 | * linux/arch/sh/traps.c | 3 | * state in 'entry.S'. |
4 | * | 4 | * |
5 | * SuperH version: Copyright (C) 1999 Niibe Yutaka | 5 | * SuperH version: Copyright (C) 1999 Niibe Yutaka |
6 | * Copyright (C) 2000 Philipp Rumpf | 6 | * Copyright (C) 2000 Philipp Rumpf |
7 | * Copyright (C) 2000 David Howells | 7 | * Copyright (C) 2000 David Howells |
8 | * Copyright (C) 2002, 2003 Paul Mundt | 8 | * Copyright (C) 2002 - 2006 Paul Mundt |
9 | */ | 9 | * |
10 | 10 | * This file is subject to the terms and conditions of the GNU General Public | |
11 | /* | 11 | * License. See the file "COPYING" in the main directory of this archive |
12 | * 'Traps.c' handles hardware traps and faults after we have saved some | 12 | * for more details. |
13 | * state in 'entry.S'. | ||
14 | */ | 13 | */ |
15 | #include <linux/sched.h> | ||
16 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
17 | #include <linux/string.h> | ||
18 | #include <linux/errno.h> | ||
19 | #include <linux/ptrace.h> | 15 | #include <linux/ptrace.h> |
20 | #include <linux/timer.h> | ||
21 | #include <linux/mm.h> | ||
22 | #include <linux/smp.h> | ||
23 | #include <linux/smp_lock.h> | ||
24 | #include <linux/init.h> | 16 | #include <linux/init.h> |
25 | #include <linux/delay.h> | ||
26 | #include <linux/spinlock.h> | 17 | #include <linux/spinlock.h> |
27 | #include <linux/module.h> | 18 | #include <linux/module.h> |
28 | #include <linux/kallsyms.h> | 19 | #include <linux/kallsyms.h> |
29 | 20 | #include <linux/io.h> | |
30 | #include <asm/system.h> | 21 | #include <asm/system.h> |
31 | #include <asm/uaccess.h> | 22 | #include <asm/uaccess.h> |
32 | #include <asm/io.h> | ||
33 | #include <asm/atomic.h> | ||
34 | #include <asm/processor.h> | ||
35 | #include <asm/sections.h> | ||
36 | 23 | ||
37 | #ifdef CONFIG_SH_KGDB | 24 | #ifdef CONFIG_SH_KGDB |
38 | #include <asm/kgdb.h> | 25 | #include <asm/kgdb.h> |
@@ -53,13 +40,32 @@ | |||
53 | #define TRAP_ILLEGAL_SLOT_INST 13 | 40 | #define TRAP_ILLEGAL_SLOT_INST 13 |
54 | #endif | 41 | #endif |
55 | 42 | ||
56 | /* | 43 | static void dump_mem(const char *str, unsigned long bottom, unsigned long top) |
57 | * These constants are for searching for possible module text | 44 | { |
58 | * segments. VMALLOC_OFFSET comes from mm/vmalloc.c; MODULE_RANGE is | 45 | unsigned long p; |
59 | * a guess of how much space is likely to be vmalloced. | 46 | int i; |
60 | */ | 47 | |
61 | #define VMALLOC_OFFSET (8*1024*1024) | 48 | printk("%s(0x%08lx to 0x%08lx)\n", str, bottom, top); |
62 | #define MODULE_RANGE (8*1024*1024) | 49 | |
50 | for (p = bottom & ~31; p < top; ) { | ||
51 | printk("%04lx: ", p & 0xffff); | ||
52 | |||
53 | for (i = 0; i < 8; i++, p += 4) { | ||
54 | unsigned int val; | ||
55 | |||
56 | if (p < bottom || p >= top) | ||
57 | printk(" "); | ||
58 | else { | ||
59 | if (__get_user(val, (unsigned int __user *)p)) { | ||
60 | printk("\n"); | ||
61 | return; | ||
62 | } | ||
63 | printk("%08x ", val); | ||
64 | } | ||
65 | } | ||
66 | printk("\n"); | ||
67 | } | ||
68 | } | ||
63 | 69 | ||
64 | DEFINE_SPINLOCK(die_lock); | 70 | DEFINE_SPINLOCK(die_lock); |
65 | 71 | ||
@@ -69,14 +75,28 @@ void die(const char * str, struct pt_regs * regs, long err) | |||
69 | 75 | ||
70 | console_verbose(); | 76 | console_verbose(); |
71 | spin_lock_irq(&die_lock); | 77 | spin_lock_irq(&die_lock); |
78 | bust_spinlocks(1); | ||
79 | |||
72 | printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); | 80 | printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); |
81 | |||
73 | CHK_REMOTE_DEBUG(regs); | 82 | CHK_REMOTE_DEBUG(regs); |
83 | print_modules(); | ||
74 | show_regs(regs); | 84 | show_regs(regs); |
85 | |||
86 | printk("Process: %s (pid: %d, stack limit = %p)\n", | ||
87 | current->comm, current->pid, task_stack_page(current) + 1); | ||
88 | |||
89 | if (!user_mode(regs) || in_interrupt()) | ||
90 | dump_mem("Stack: ", regs->regs[15], THREAD_SIZE + | ||
91 | (unsigned long)task_stack_page(current)); | ||
92 | |||
93 | bust_spinlocks(0); | ||
75 | spin_unlock_irq(&die_lock); | 94 | spin_unlock_irq(&die_lock); |
76 | do_exit(SIGSEGV); | 95 | do_exit(SIGSEGV); |
77 | } | 96 | } |
78 | 97 | ||
79 | static inline void die_if_kernel(const char * str, struct pt_regs * regs, long err) | 98 | static inline void die_if_kernel(const char *str, struct pt_regs *regs, |
99 | long err) | ||
80 | { | 100 | { |
81 | if (!user_mode(regs)) | 101 | if (!user_mode(regs)) |
82 | die(str, regs, err); | 102 | die(str, regs, err); |
@@ -93,8 +113,7 @@ static int handle_unaligned_notify_count = 10; | |||
93 | */ | 113 | */ |
94 | static int die_if_no_fixup(const char * str, struct pt_regs * regs, long err) | 114 | static int die_if_no_fixup(const char * str, struct pt_regs * regs, long err) |
95 | { | 115 | { |
96 | if (!user_mode(regs)) | 116 | if (!user_mode(regs)) { |
97 | { | ||
98 | const struct exception_table_entry *fixup; | 117 | const struct exception_table_entry *fixup; |
99 | fixup = search_exception_tables(regs->pc); | 118 | fixup = search_exception_tables(regs->pc); |
100 | if (fixup) { | 119 | if (fixup) { |
@@ -550,7 +569,10 @@ int is_dsp_inst(struct pt_regs *regs) | |||
550 | #define is_dsp_inst(regs) (0) | 569 | #define is_dsp_inst(regs) (0) |
551 | #endif /* CONFIG_SH_DSP */ | 570 | #endif /* CONFIG_SH_DSP */ |
552 | 571 | ||
553 | extern int do_fpu_inst(unsigned short, struct pt_regs*); | 572 | /* arch/sh/kernel/cpu/sh4/fpu.c */ |
573 | extern int do_fpu_inst(unsigned short, struct pt_regs *); | ||
574 | extern asmlinkage void do_fpu_state_restore(unsigned long r4, unsigned long r5, | ||
575 | unsigned long r6, unsigned long r7, struct pt_regs regs); | ||
554 | 576 | ||
555 | asmlinkage void do_reserved_inst(unsigned long r4, unsigned long r5, | 577 | asmlinkage void do_reserved_inst(unsigned long r4, unsigned long r5, |
556 | unsigned long r6, unsigned long r7, | 578 | unsigned long r6, unsigned long r7, |
@@ -709,14 +731,20 @@ void __init per_cpu_trap_init(void) | |||
709 | : "memory"); | 731 | : "memory"); |
710 | } | 732 | } |
711 | 733 | ||
712 | void __init trap_init(void) | 734 | void *set_exception_table_vec(unsigned int vec, void *handler) |
713 | { | 735 | { |
714 | extern void *exception_handling_table[]; | 736 | extern void *exception_handling_table[]; |
737 | void *old_handler; | ||
738 | |||
739 | old_handler = exception_handling_table[vec]; | ||
740 | exception_handling_table[vec] = handler; | ||
741 | return old_handler; | ||
742 | } | ||
715 | 743 | ||
716 | exception_handling_table[TRAP_RESERVED_INST] | 744 | void __init trap_init(void) |
717 | = (void *)do_reserved_inst; | 745 | { |
718 | exception_handling_table[TRAP_ILLEGAL_SLOT_INST] | 746 | set_exception_table_vec(TRAP_RESERVED_INST, do_reserved_inst); |
719 | = (void *)do_illegal_slot_inst; | 747 | set_exception_table_vec(TRAP_ILLEGAL_SLOT_INST, do_illegal_slot_inst); |
720 | 748 | ||
721 | #if defined(CONFIG_CPU_SH4) && !defined(CONFIG_SH_FPU) || \ | 749 | #if defined(CONFIG_CPU_SH4) && !defined(CONFIG_SH_FPU) || \ |
722 | defined(CONFIG_SH_FPU_EMU) | 750 | defined(CONFIG_SH_FPU_EMU) |
@@ -725,61 +753,54 @@ void __init trap_init(void) | |||
725 | * reserved. They'll be handled in the math-emu case, or faulted on | 753 | * reserved. They'll be handled in the math-emu case, or faulted on |
726 | * otherwise. | 754 | * otherwise. |
727 | */ | 755 | */ |
728 | /* entry 64 corresponds to EXPEVT=0x800 */ | 756 | set_exception_table_evt(0x800, do_reserved_inst); |
729 | exception_handling_table[64] = (void *)do_reserved_inst; | 757 | set_exception_table_evt(0x820, do_illegal_slot_inst); |
730 | exception_handling_table[65] = (void *)do_illegal_slot_inst; | 758 | #elif defined(CONFIG_SH_FPU) |
759 | set_exception_table_evt(0x800, do_fpu_state_restore); | ||
760 | set_exception_table_evt(0x820, do_fpu_state_restore); | ||
731 | #endif | 761 | #endif |
732 | 762 | ||
733 | /* Setup VBR for boot cpu */ | 763 | /* Setup VBR for boot cpu */ |
734 | per_cpu_trap_init(); | 764 | per_cpu_trap_init(); |
735 | } | 765 | } |
736 | 766 | ||
737 | void show_stack(struct task_struct *tsk, unsigned long *sp) | 767 | void show_trace(struct task_struct *tsk, unsigned long *sp, |
768 | struct pt_regs *regs) | ||
738 | { | 769 | { |
739 | unsigned long *stack, addr; | 770 | unsigned long addr; |
740 | unsigned long module_start = VMALLOC_START; | ||
741 | unsigned long module_end = VMALLOC_END; | ||
742 | int i = 1; | ||
743 | |||
744 | if (!tsk) | ||
745 | tsk = current; | ||
746 | if (tsk == current) | ||
747 | sp = (unsigned long *)current_stack_pointer; | ||
748 | else | ||
749 | sp = (unsigned long *)tsk->thread.sp; | ||
750 | 771 | ||
751 | stack = sp; | 772 | if (regs && user_mode(regs)) |
773 | return; | ||
752 | 774 | ||
753 | printk("\nCall trace: "); | 775 | printk("\nCall trace: "); |
754 | #ifdef CONFIG_KALLSYMS | 776 | #ifdef CONFIG_KALLSYMS |
755 | printk("\n"); | 777 | printk("\n"); |
756 | #endif | 778 | #endif |
757 | 779 | ||
758 | while (!kstack_end(stack)) { | 780 | while (!kstack_end(sp)) { |
759 | addr = *stack++; | 781 | addr = *sp++; |
760 | if (((addr >= (unsigned long)_text) && | 782 | if (kernel_text_address(addr)) |
761 | (addr <= (unsigned long)_etext)) || | 783 | print_ip_sym(addr); |
762 | ((addr >= module_start) && (addr <= module_end))) { | ||
763 | /* | ||
764 | * For 80-columns display, 6 entry is maximum. | ||
765 | * NOTE: '[<8c00abcd>] ' consumes 13 columns . | ||
766 | */ | ||
767 | #ifndef CONFIG_KALLSYMS | ||
768 | if (i && ((i % 6) == 0)) | ||
769 | printk("\n "); | ||
770 | #endif | ||
771 | printk("[<%08lx>] ", addr); | ||
772 | print_symbol("%s\n", addr); | ||
773 | i++; | ||
774 | } | ||
775 | } | 784 | } |
776 | 785 | ||
777 | printk("\n"); | 786 | printk("\n"); |
778 | } | 787 | } |
779 | 788 | ||
780 | void show_task(unsigned long *sp) | 789 | void show_stack(struct task_struct *tsk, unsigned long *sp) |
781 | { | 790 | { |
782 | show_stack(NULL, sp); | 791 | unsigned long stack; |
792 | |||
793 | if (!tsk) | ||
794 | tsk = current; | ||
795 | if (tsk == current) | ||
796 | sp = (unsigned long *)current_stack_pointer; | ||
797 | else | ||
798 | sp = (unsigned long *)tsk->thread.sp; | ||
799 | |||
800 | stack = (unsigned long)sp; | ||
801 | dump_mem("Stack: ", stack, THREAD_SIZE + | ||
802 | (unsigned long)task_stack_page(tsk)); | ||
803 | show_trace(tsk, sp, NULL); | ||
783 | } | 804 | } |
784 | 805 | ||
785 | void dump_stack(void) | 806 | void dump_stack(void) |
diff --git a/arch/sh/kernel/vmlinux.lds.S b/arch/sh/kernel/vmlinux.lds.S index 5eb930918186..77b4026d5688 100644 --- a/arch/sh/kernel/vmlinux.lds.S +++ b/arch/sh/kernel/vmlinux.lds.S | |||
@@ -76,13 +76,7 @@ SECTIONS | |||
76 | __setup_end = .; | 76 | __setup_end = .; |
77 | __initcall_start = .; | 77 | __initcall_start = .; |
78 | .initcall.init : { | 78 | .initcall.init : { |
79 | *(.initcall1.init) | 79 | INITCALLS |
80 | *(.initcall2.init) | ||
81 | *(.initcall3.init) | ||
82 | *(.initcall4.init) | ||
83 | *(.initcall5.init) | ||
84 | *(.initcall6.init) | ||
85 | *(.initcall7.init) | ||
86 | } | 80 | } |
87 | __initcall_end = .; | 81 | __initcall_end = .; |
88 | __con_initcall_start = .; | 82 | __con_initcall_start = .; |
diff --git a/arch/sh64/kernel/vmlinux.lds.S b/arch/sh64/kernel/vmlinux.lds.S index a8fcc3a71585..95c4d753e357 100644 --- a/arch/sh64/kernel/vmlinux.lds.S +++ b/arch/sh64/kernel/vmlinux.lds.S | |||
@@ -108,13 +108,7 @@ SECTIONS | |||
108 | __setup_end = .; | 108 | __setup_end = .; |
109 | __initcall_start = .; | 109 | __initcall_start = .; |
110 | .initcall.init : C_PHYS(.initcall.init) { | 110 | .initcall.init : C_PHYS(.initcall.init) { |
111 | *(.initcall1.init) | 111 | INITCALLS |
112 | *(.initcall2.init) | ||
113 | *(.initcall3.init) | ||
114 | *(.initcall4.init) | ||
115 | *(.initcall5.init) | ||
116 | *(.initcall6.init) | ||
117 | *(.initcall7.init) | ||
118 | } | 112 | } |
119 | __initcall_end = .; | 113 | __initcall_end = .; |
120 | __con_initcall_start = .; | 114 | __con_initcall_start = .; |
diff --git a/arch/sparc/kernel/ebus.c b/arch/sparc/kernel/ebus.c index 75ac24d229b1..ba58c3a061fd 100644 --- a/arch/sparc/kernel/ebus.c +++ b/arch/sparc/kernel/ebus.c | |||
@@ -237,12 +237,12 @@ void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_device *d | |||
237 | dev->ofdev.node = dp; | 237 | dev->ofdev.node = dp; |
238 | dev->ofdev.dev.parent = &dev->bus->ofdev.dev; | 238 | dev->ofdev.dev.parent = &dev->bus->ofdev.dev; |
239 | dev->ofdev.dev.bus = &ebus_bus_type; | 239 | dev->ofdev.dev.bus = &ebus_bus_type; |
240 | strcpy(dev->ofdev.dev.bus_id, dp->path_component_name); | 240 | sprintf(dev->ofdev.dev.bus_id, "ebus[%08x]", dp->node); |
241 | 241 | ||
242 | /* Register with core */ | 242 | /* Register with core */ |
243 | if (of_device_register(&dev->ofdev) != 0) | 243 | if (of_device_register(&dev->ofdev) != 0) |
244 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", | 244 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", |
245 | dev->ofdev.dev.bus_id); | 245 | dp->path_component_name); |
246 | 246 | ||
247 | if ((dp = dp->child) != NULL) { | 247 | if ((dp = dp->child) != NULL) { |
248 | dev->children = (struct linux_ebus_child *) | 248 | dev->children = (struct linux_ebus_child *) |
@@ -332,12 +332,12 @@ void __init ebus_init(void) | |||
332 | ebus->ofdev.node = dp; | 332 | ebus->ofdev.node = dp; |
333 | ebus->ofdev.dev.parent = &pdev->dev; | 333 | ebus->ofdev.dev.parent = &pdev->dev; |
334 | ebus->ofdev.dev.bus = &ebus_bus_type; | 334 | ebus->ofdev.dev.bus = &ebus_bus_type; |
335 | strcpy(ebus->ofdev.dev.bus_id, dp->path_component_name); | 335 | sprintf(ebus->ofdev.dev.bus_id, "ebus%d", num_ebus); |
336 | 336 | ||
337 | /* Register with core */ | 337 | /* Register with core */ |
338 | if (of_device_register(&ebus->ofdev) != 0) | 338 | if (of_device_register(&ebus->ofdev) != 0) |
339 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", | 339 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", |
340 | ebus->ofdev.dev.bus_id); | 340 | dp->path_component_name); |
341 | 341 | ||
342 | 342 | ||
343 | nd = dp->child; | 343 | nd = dp->child; |
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S index a4edff4c3be3..831f540251f8 100644 --- a/arch/sparc/kernel/entry.S +++ b/arch/sparc/kernel/entry.S | |||
@@ -32,13 +32,12 @@ | |||
32 | #include <asm/mxcc.h> | 32 | #include <asm/mxcc.h> |
33 | #include <asm/thread_info.h> | 33 | #include <asm/thread_info.h> |
34 | #include <asm/param.h> | 34 | #include <asm/param.h> |
35 | #include <asm/unistd.h> | ||
35 | 36 | ||
36 | #include <asm/asmmacro.h> | 37 | #include <asm/asmmacro.h> |
37 | 38 | ||
38 | #define curptr g6 | 39 | #define curptr g6 |
39 | 40 | ||
40 | #define NR_SYSCALLS 300 /* Each OS is different... */ | ||
41 | |||
42 | /* These are just handy. */ | 41 | /* These are just handy. */ |
43 | #define _SV save %sp, -STACKFRAME_SZ, %sp | 42 | #define _SV save %sp, -STACKFRAME_SZ, %sp |
44 | #define _RS restore | 43 | #define _RS restore |
diff --git a/arch/sparc/kernel/of_device.c b/arch/sparc/kernel/of_device.c index 74bef2a2d37f..46200c43ffb1 100644 --- a/arch/sparc/kernel/of_device.c +++ b/arch/sparc/kernel/of_device.c | |||
@@ -651,7 +651,7 @@ build_resources: | |||
651 | if (!parent) | 651 | if (!parent) |
652 | strcpy(op->dev.bus_id, "root"); | 652 | strcpy(op->dev.bus_id, "root"); |
653 | else | 653 | else |
654 | strcpy(op->dev.bus_id, dp->path_component_name); | 654 | sprintf(op->dev.bus_id, "%08x", dp->node); |
655 | 655 | ||
656 | if (of_device_register(op)) { | 656 | if (of_device_register(op)) { |
657 | printk("%s: Could not register of device.\n", | 657 | printk("%s: Could not register of device.\n", |
diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S index 10df38eeae08..ea75ca569052 100644 --- a/arch/sparc/kernel/systbls.S +++ b/arch/sparc/kernel/systbls.S | |||
@@ -78,7 +78,7 @@ sys_call_table: | |||
78 | /*285*/ .long sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64 | 78 | /*285*/ .long sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64 |
79 | /*290*/ .long sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat | 79 | /*290*/ .long sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat |
80 | /*295*/ .long sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare | 80 | /*295*/ .long sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare |
81 | /*300*/ .long sys_set_robust_list, sys_get_robust_list | 81 | /*300*/ .long sys_set_robust_list, sys_get_robust_list, sys_migrate_pages |
82 | 82 | ||
83 | #ifdef CONFIG_SUNOS_EMUL | 83 | #ifdef CONFIG_SUNOS_EMUL |
84 | /* Now the SunOS syscall table. */ | 84 | /* Now the SunOS syscall table. */ |
@@ -190,6 +190,7 @@ sunos_sys_table: | |||
190 | /*290*/ .long sunos_nosys, sunos_nosys, sunos_nosys | 190 | /*290*/ .long sunos_nosys, sunos_nosys, sunos_nosys |
191 | .long sunos_nosys, sunos_nosys, sunos_nosys | 191 | .long sunos_nosys, sunos_nosys, sunos_nosys |
192 | .long sunos_nosys, sunos_nosys, sunos_nosys | 192 | .long sunos_nosys, sunos_nosys, sunos_nosys |
193 | .long sunos_nosys, sunos_nosys, sunos_nosys | 193 | .long sunos_nosys |
194 | /*300*/ .long sunos_nosys, sunos_nosys, sunos_nosys | ||
194 | 195 | ||
195 | #endif | 196 | #endif |
diff --git a/arch/sparc/kernel/vmlinux.lds.S b/arch/sparc/kernel/vmlinux.lds.S index 1dd78c84888a..5cc5ff7f8824 100644 --- a/arch/sparc/kernel/vmlinux.lds.S +++ b/arch/sparc/kernel/vmlinux.lds.S | |||
@@ -49,13 +49,7 @@ SECTIONS | |||
49 | __setup_end = .; | 49 | __setup_end = .; |
50 | __initcall_start = .; | 50 | __initcall_start = .; |
51 | .initcall.init : { | 51 | .initcall.init : { |
52 | *(.initcall1.init) | 52 | INITCALLS |
53 | *(.initcall2.init) | ||
54 | *(.initcall3.init) | ||
55 | *(.initcall4.init) | ||
56 | *(.initcall5.init) | ||
57 | *(.initcall6.init) | ||
58 | *(.initcall7.init) | ||
59 | } | 53 | } |
60 | __initcall_end = .; | 54 | __initcall_end = .; |
61 | __con_initcall_start = .; | 55 | __con_initcall_start = .; |
diff --git a/arch/sparc64/kernel/central.c b/arch/sparc64/kernel/central.c index b66336db00ee..e724c54af029 100644 --- a/arch/sparc64/kernel/central.c +++ b/arch/sparc64/kernel/central.c | |||
@@ -126,6 +126,10 @@ static void probe_other_fhcs(void) | |||
126 | int board; | 126 | int board; |
127 | u32 tmp; | 127 | u32 tmp; |
128 | 128 | ||
129 | if (dp->parent && | ||
130 | dp->parent->parent != NULL) | ||
131 | continue; | ||
132 | |||
129 | fhc = (struct linux_fhc *) | 133 | fhc = (struct linux_fhc *) |
130 | central_alloc_bootmem(sizeof(struct linux_fhc)); | 134 | central_alloc_bootmem(sizeof(struct linux_fhc)); |
131 | if (fhc == NULL) | 135 | if (fhc == NULL) |
diff --git a/arch/sparc64/kernel/ebus.c b/arch/sparc64/kernel/ebus.c index 2df25c2b4071..35bf895fdeee 100644 --- a/arch/sparc64/kernel/ebus.c +++ b/arch/sparc64/kernel/ebus.c | |||
@@ -389,12 +389,12 @@ static void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_de | |||
389 | dev->ofdev.node = dp; | 389 | dev->ofdev.node = dp; |
390 | dev->ofdev.dev.parent = &dev->bus->ofdev.dev; | 390 | dev->ofdev.dev.parent = &dev->bus->ofdev.dev; |
391 | dev->ofdev.dev.bus = &ebus_bus_type; | 391 | dev->ofdev.dev.bus = &ebus_bus_type; |
392 | strcpy(dev->ofdev.dev.bus_id, dp->path_component_name); | 392 | sprintf(dev->ofdev.dev.bus_id, "ebus[%08x]", dp->node); |
393 | 393 | ||
394 | /* Register with core */ | 394 | /* Register with core */ |
395 | if (of_device_register(&dev->ofdev) != 0) | 395 | if (of_device_register(&dev->ofdev) != 0) |
396 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", | 396 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", |
397 | dev->ofdev.dev.bus_id); | 397 | dp->path_component_name); |
398 | 398 | ||
399 | dp = dp->child; | 399 | dp = dp->child; |
400 | if (dp) { | 400 | if (dp) { |
@@ -494,12 +494,12 @@ void __init ebus_init(void) | |||
494 | ebus->ofdev.node = dp; | 494 | ebus->ofdev.node = dp; |
495 | ebus->ofdev.dev.parent = &pdev->dev; | 495 | ebus->ofdev.dev.parent = &pdev->dev; |
496 | ebus->ofdev.dev.bus = &ebus_bus_type; | 496 | ebus->ofdev.dev.bus = &ebus_bus_type; |
497 | strcpy(ebus->ofdev.dev.bus_id, dp->path_component_name); | 497 | sprintf(ebus->ofdev.dev.bus_id, "ebus%d", num_ebus); |
498 | 498 | ||
499 | /* Register with core */ | 499 | /* Register with core */ |
500 | if (of_device_register(&ebus->ofdev) != 0) | 500 | if (of_device_register(&ebus->ofdev) != 0) |
501 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", | 501 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", |
502 | ebus->ofdev.dev.bus_id); | 502 | dp->path_component_name); |
503 | 503 | ||
504 | 504 | ||
505 | child = dp->child; | 505 | child = dp->child; |
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index 0aaa35fc5a9c..6f28bec0a9bf 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S | |||
@@ -22,11 +22,10 @@ | |||
22 | #include <asm/auxio.h> | 22 | #include <asm/auxio.h> |
23 | #include <asm/sfafsr.h> | 23 | #include <asm/sfafsr.h> |
24 | #include <asm/pil.h> | 24 | #include <asm/pil.h> |
25 | #include <asm/unistd.h> | ||
25 | 26 | ||
26 | #define curptr g6 | 27 | #define curptr g6 |
27 | 28 | ||
28 | #define NR_SYSCALLS 300 /* Each OS is different... */ | ||
29 | |||
30 | .text | 29 | .text |
31 | .align 32 | 30 | .align 32 |
32 | 31 | ||
diff --git a/arch/sparc64/kernel/isa.c b/arch/sparc64/kernel/isa.c index 0f3aec72ef5f..f028e68b23f2 100644 --- a/arch/sparc64/kernel/isa.c +++ b/arch/sparc64/kernel/isa.c | |||
@@ -115,12 +115,12 @@ static void __init isa_fill_devices(struct sparc_isa_bridge *isa_br) | |||
115 | isa_dev->ofdev.node = dp; | 115 | isa_dev->ofdev.node = dp; |
116 | isa_dev->ofdev.dev.parent = &isa_br->ofdev.dev; | 116 | isa_dev->ofdev.dev.parent = &isa_br->ofdev.dev; |
117 | isa_dev->ofdev.dev.bus = &isa_bus_type; | 117 | isa_dev->ofdev.dev.bus = &isa_bus_type; |
118 | strcpy(isa_dev->ofdev.dev.bus_id, dp->path_component_name); | 118 | sprintf(isa_dev->ofdev.dev.bus_id, "isa[%08x]", dp->node); |
119 | 119 | ||
120 | /* Register with core */ | 120 | /* Register with core */ |
121 | if (of_device_register(&isa_dev->ofdev) != 0) { | 121 | if (of_device_register(&isa_dev->ofdev) != 0) { |
122 | printk(KERN_DEBUG "isa: device registration error for %s!\n", | 122 | printk(KERN_DEBUG "isa: device registration error for %s!\n", |
123 | isa_dev->ofdev.dev.bus_id); | 123 | dp->path_component_name); |
124 | kfree(isa_dev); | 124 | kfree(isa_dev); |
125 | goto next_sibling; | 125 | goto next_sibling; |
126 | } | 126 | } |
@@ -191,12 +191,12 @@ void __init isa_init(void) | |||
191 | isa_br->ofdev.node = dp; | 191 | isa_br->ofdev.node = dp; |
192 | isa_br->ofdev.dev.parent = &pdev->dev; | 192 | isa_br->ofdev.dev.parent = &pdev->dev; |
193 | isa_br->ofdev.dev.bus = &isa_bus_type; | 193 | isa_br->ofdev.dev.bus = &isa_bus_type; |
194 | strcpy(isa_br->ofdev.dev.bus_id, dp->path_component_name); | 194 | sprintf(isa_br->ofdev.dev.bus_id, "isa%d", index); |
195 | 195 | ||
196 | /* Register with core */ | 196 | /* Register with core */ |
197 | if (of_device_register(&isa_br->ofdev) != 0) { | 197 | if (of_device_register(&isa_br->ofdev) != 0) { |
198 | printk(KERN_DEBUG "isa: device registration error for %s!\n", | 198 | printk(KERN_DEBUG "isa: device registration error for %s!\n", |
199 | isa_br->ofdev.dev.bus_id); | 199 | dp->path_component_name); |
200 | kfree(isa_br); | 200 | kfree(isa_br); |
201 | return; | 201 | return; |
202 | } | 202 | } |
diff --git a/arch/sparc64/kernel/of_device.c b/arch/sparc64/kernel/of_device.c index d3dfb2a36d47..8cc14fc6b6f1 100644 --- a/arch/sparc64/kernel/of_device.c +++ b/arch/sparc64/kernel/of_device.c | |||
@@ -402,16 +402,22 @@ static void of_bus_sbus_count_cells(struct device_node *child, | |||
402 | *sizec = 1; | 402 | *sizec = 1; |
403 | } | 403 | } |
404 | 404 | ||
405 | static int of_bus_sbus_map(u32 *addr, const u32 *range, int na, int ns, int pna) | 405 | /* |
406 | { | 406 | * FHC/Central bus specific translator. |
407 | return of_bus_default_map(addr, range, na, ns, pna); | 407 | * |
408 | } | 408 | * This is just needed to hard-code the address and size cell |
409 | 409 | * counts. 'fhc' and 'central' nodes lack the #address-cells and | |
410 | static unsigned int of_bus_sbus_get_flags(u32 *addr) | 410 | * #size-cells properties, and if you walk to the root on such |
411 | * Enterprise boxes all you'll get is a #size-cells of 2 which is | ||
412 | * not what we want to use. | ||
413 | */ | ||
414 | static int of_bus_fhc_match(struct device_node *np) | ||
411 | { | 415 | { |
412 | return IORESOURCE_MEM; | 416 | return !strcmp(np->name, "fhc") || |
417 | !strcmp(np->name, "central"); | ||
413 | } | 418 | } |
414 | 419 | ||
420 | #define of_bus_fhc_count_cells of_bus_sbus_count_cells | ||
415 | 421 | ||
416 | /* | 422 | /* |
417 | * Array of bus specific translators | 423 | * Array of bus specific translators |
@@ -433,8 +439,17 @@ static struct of_bus of_busses[] = { | |||
433 | .addr_prop_name = "reg", | 439 | .addr_prop_name = "reg", |
434 | .match = of_bus_sbus_match, | 440 | .match = of_bus_sbus_match, |
435 | .count_cells = of_bus_sbus_count_cells, | 441 | .count_cells = of_bus_sbus_count_cells, |
436 | .map = of_bus_sbus_map, | 442 | .map = of_bus_default_map, |
437 | .get_flags = of_bus_sbus_get_flags, | 443 | .get_flags = of_bus_default_get_flags, |
444 | }, | ||
445 | /* FHC */ | ||
446 | { | ||
447 | .name = "fhc", | ||
448 | .addr_prop_name = "reg", | ||
449 | .match = of_bus_fhc_match, | ||
450 | .count_cells = of_bus_fhc_count_cells, | ||
451 | .map = of_bus_default_map, | ||
452 | .get_flags = of_bus_default_get_flags, | ||
438 | }, | 453 | }, |
439 | /* Default */ | 454 | /* Default */ |
440 | { | 455 | { |
@@ -846,7 +861,7 @@ static struct of_device * __init scan_one_device(struct device_node *dp, | |||
846 | if (!parent) | 861 | if (!parent) |
847 | strcpy(op->dev.bus_id, "root"); | 862 | strcpy(op->dev.bus_id, "root"); |
848 | else | 863 | else |
849 | sprintf(op->dev.bus_id, "%s@%08x", dp->name, dp->node); | 864 | sprintf(op->dev.bus_id, "%08x", dp->node); |
850 | 865 | ||
851 | if (of_device_register(op)) { | 866 | if (of_device_register(op)) { |
852 | printk("%s: Could not register of device.\n", | 867 | printk("%s: Could not register of device.\n", |
diff --git a/arch/sparc64/kernel/pci_iommu.c b/arch/sparc64/kernel/pci_iommu.c index 82e5455134c6..2e7f1427088a 100644 --- a/arch/sparc64/kernel/pci_iommu.c +++ b/arch/sparc64/kernel/pci_iommu.c | |||
@@ -281,7 +281,7 @@ static void pci_4u_free_consistent(struct pci_dev *pdev, size_t size, void *cpu, | |||
281 | 281 | ||
282 | spin_lock_irqsave(&iommu->lock, flags); | 282 | spin_lock_irqsave(&iommu->lock, flags); |
283 | 283 | ||
284 | free_npages(iommu, dvma, npages); | 284 | free_npages(iommu, dvma - iommu->page_table_map_base, npages); |
285 | 285 | ||
286 | spin_unlock_irqrestore(&iommu->lock, flags); | 286 | spin_unlock_irqrestore(&iommu->lock, flags); |
287 | 287 | ||
diff --git a/arch/sparc64/kernel/prom.c b/arch/sparc64/kernel/prom.c index e21cd6afa709..0917c24c4f08 100644 --- a/arch/sparc64/kernel/prom.c +++ b/arch/sparc64/kernel/prom.c | |||
@@ -793,7 +793,7 @@ static unsigned int schizo_irq_build(struct device_node *dp, | |||
793 | return virt_irq; | 793 | return virt_irq; |
794 | } | 794 | } |
795 | 795 | ||
796 | static void schizo_irq_trans_init(struct device_node *dp) | 796 | static void __schizo_irq_trans_init(struct device_node *dp, int is_tomatillo) |
797 | { | 797 | { |
798 | struct linux_prom64_registers *regs; | 798 | struct linux_prom64_registers *regs; |
799 | struct schizo_irq_data *irq_data; | 799 | struct schizo_irq_data *irq_data; |
@@ -807,11 +807,24 @@ static void schizo_irq_trans_init(struct device_node *dp) | |||
807 | dp->irq_trans->data = irq_data; | 807 | dp->irq_trans->data = irq_data; |
808 | 808 | ||
809 | irq_data->pbm_regs = regs[0].phys_addr; | 809 | irq_data->pbm_regs = regs[0].phys_addr; |
810 | irq_data->sync_reg = regs[3].phys_addr + 0x1a18UL; | 810 | if (is_tomatillo) |
811 | irq_data->sync_reg = regs[3].phys_addr + 0x1a18UL; | ||
812 | else | ||
813 | irq_data->sync_reg = 0UL; | ||
811 | irq_data->portid = of_getintprop_default(dp, "portid", 0); | 814 | irq_data->portid = of_getintprop_default(dp, "portid", 0); |
812 | irq_data->chip_version = of_getintprop_default(dp, "version#", 0); | 815 | irq_data->chip_version = of_getintprop_default(dp, "version#", 0); |
813 | } | 816 | } |
814 | 817 | ||
818 | static void schizo_irq_trans_init(struct device_node *dp) | ||
819 | { | ||
820 | __schizo_irq_trans_init(dp, 0); | ||
821 | } | ||
822 | |||
823 | static void tomatillo_irq_trans_init(struct device_node *dp) | ||
824 | { | ||
825 | __schizo_irq_trans_init(dp, 1); | ||
826 | } | ||
827 | |||
815 | static unsigned int pci_sun4v_irq_build(struct device_node *dp, | 828 | static unsigned int pci_sun4v_irq_build(struct device_node *dp, |
816 | unsigned int devino, | 829 | unsigned int devino, |
817 | void *_data) | 830 | void *_data) |
@@ -1050,8 +1063,8 @@ static struct irq_trans pci_irq_trans_table[] = { | |||
1050 | { "pci108e,8001", schizo_irq_trans_init }, | 1063 | { "pci108e,8001", schizo_irq_trans_init }, |
1051 | { "SUNW,schizo+", schizo_irq_trans_init }, | 1064 | { "SUNW,schizo+", schizo_irq_trans_init }, |
1052 | { "pci108e,8002", schizo_irq_trans_init }, | 1065 | { "pci108e,8002", schizo_irq_trans_init }, |
1053 | { "SUNW,tomatillo", schizo_irq_trans_init }, | 1066 | { "SUNW,tomatillo", tomatillo_irq_trans_init }, |
1054 | { "pci108e,a801", schizo_irq_trans_init }, | 1067 | { "pci108e,a801", tomatillo_irq_trans_init }, |
1055 | { "SUNW,sun4v-pci", pci_sun4v_irq_trans_init }, | 1068 | { "SUNW,sun4v-pci", pci_sun4v_irq_trans_init }, |
1056 | }; | 1069 | }; |
1057 | #endif | 1070 | #endif |
@@ -1079,23 +1092,22 @@ static void sun4v_vdev_irq_trans_init(struct device_node *dp) | |||
1079 | 1092 | ||
1080 | static void irq_trans_init(struct device_node *dp) | 1093 | static void irq_trans_init(struct device_node *dp) |
1081 | { | 1094 | { |
1082 | const char *model; | ||
1083 | #ifdef CONFIG_PCI | 1095 | #ifdef CONFIG_PCI |
1096 | const char *model; | ||
1084 | int i; | 1097 | int i; |
1085 | #endif | 1098 | #endif |
1086 | 1099 | ||
1100 | #ifdef CONFIG_PCI | ||
1087 | model = of_get_property(dp, "model", NULL); | 1101 | model = of_get_property(dp, "model", NULL); |
1088 | if (!model) | 1102 | if (!model) |
1089 | model = of_get_property(dp, "compatible", NULL); | 1103 | model = of_get_property(dp, "compatible", NULL); |
1090 | if (!model) | 1104 | if (model) { |
1091 | return; | 1105 | for (i = 0; i < ARRAY_SIZE(pci_irq_trans_table); i++) { |
1092 | 1106 | struct irq_trans *t = &pci_irq_trans_table[i]; | |
1093 | #ifdef CONFIG_PCI | ||
1094 | for (i = 0; i < ARRAY_SIZE(pci_irq_trans_table); i++) { | ||
1095 | struct irq_trans *t = &pci_irq_trans_table[i]; | ||
1096 | 1107 | ||
1097 | if (!strcmp(model, t->name)) | 1108 | if (!strcmp(model, t->name)) |
1098 | return t->init(dp); | 1109 | return t->init(dp); |
1110 | } | ||
1099 | } | 1111 | } |
1100 | #endif | 1112 | #endif |
1101 | #ifdef CONFIG_SBUS | 1113 | #ifdef CONFIG_SBUS |
@@ -1103,8 +1115,9 @@ static void irq_trans_init(struct device_node *dp) | |||
1103 | !strcmp(dp->name, "sbi")) | 1115 | !strcmp(dp->name, "sbi")) |
1104 | return sbus_irq_trans_init(dp); | 1116 | return sbus_irq_trans_init(dp); |
1105 | #endif | 1117 | #endif |
1106 | if (!strcmp(dp->name, "central")) | 1118 | if (!strcmp(dp->name, "fhc") && |
1107 | return central_irq_trans_init(dp->child); | 1119 | !strcmp(dp->parent->name, "central")) |
1120 | return central_irq_trans_init(dp); | ||
1108 | if (!strcmp(dp->name, "virtual-devices")) | 1121 | if (!strcmp(dp->name, "virtual-devices")) |
1109 | return sun4v_vdev_irq_trans_init(dp); | 1122 | return sun4v_vdev_irq_trans_init(dp); |
1110 | } | 1123 | } |
@@ -1516,7 +1529,7 @@ static char * __init get_one_property(phandle node, const char *name) | |||
1516 | return buf; | 1529 | return buf; |
1517 | } | 1530 | } |
1518 | 1531 | ||
1519 | static struct device_node * __init create_node(phandle node) | 1532 | static struct device_node * __init create_node(phandle node, struct device_node *parent) |
1520 | { | 1533 | { |
1521 | struct device_node *dp; | 1534 | struct device_node *dp; |
1522 | 1535 | ||
@@ -1525,6 +1538,7 @@ static struct device_node * __init create_node(phandle node) | |||
1525 | 1538 | ||
1526 | dp = prom_early_alloc(sizeof(*dp)); | 1539 | dp = prom_early_alloc(sizeof(*dp)); |
1527 | dp->unique_id = unique_id++; | 1540 | dp->unique_id = unique_id++; |
1541 | dp->parent = parent; | ||
1528 | 1542 | ||
1529 | kref_init(&dp->kref); | 1543 | kref_init(&dp->kref); |
1530 | 1544 | ||
@@ -1543,12 +1557,11 @@ static struct device_node * __init build_tree(struct device_node *parent, phandl | |||
1543 | { | 1557 | { |
1544 | struct device_node *dp; | 1558 | struct device_node *dp; |
1545 | 1559 | ||
1546 | dp = create_node(node); | 1560 | dp = create_node(node, parent); |
1547 | if (dp) { | 1561 | if (dp) { |
1548 | *(*nextp) = dp; | 1562 | *(*nextp) = dp; |
1549 | *nextp = &dp->allnext; | 1563 | *nextp = &dp->allnext; |
1550 | 1564 | ||
1551 | dp->parent = parent; | ||
1552 | dp->path_component_name = build_path_component(dp); | 1565 | dp->path_component_name = build_path_component(dp); |
1553 | dp->full_name = build_full_name(dp); | 1566 | dp->full_name = build_full_name(dp); |
1554 | 1567 | ||
@@ -1564,7 +1577,7 @@ void __init prom_build_devicetree(void) | |||
1564 | { | 1577 | { |
1565 | struct device_node **nextp; | 1578 | struct device_node **nextp; |
1566 | 1579 | ||
1567 | allnodes = create_node(prom_root_node); | 1580 | allnodes = create_node(prom_root_node, NULL); |
1568 | allnodes->path_component_name = ""; | 1581 | allnodes->path_component_name = ""; |
1569 | allnodes->full_name = "/"; | 1582 | allnodes->full_name = "/"; |
1570 | 1583 | ||
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index 419a63fca172..9a8026797ac0 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S | |||
@@ -79,7 +79,7 @@ sys_call_table32: | |||
79 | .word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64 | 79 | .word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64 |
80 | /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat | 80 | /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat |
81 | .word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare | 81 | .word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare |
82 | /*300*/ .word compat_sys_set_robust_list, compat_sys_get_robust_list | 82 | /*300*/ .word compat_sys_set_robust_list, compat_sys_get_robust_list, compat_sys_migrate_pages |
83 | 83 | ||
84 | #endif /* CONFIG_COMPAT */ | 84 | #endif /* CONFIG_COMPAT */ |
85 | 85 | ||
@@ -149,7 +149,7 @@ sys_call_table: | |||
149 | .word sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64 | 149 | .word sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64 |
150 | /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat | 150 | /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat |
151 | .word sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare | 151 | .word sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare |
152 | /*300*/ .word sys_set_robust_list, sys_get_robust_list | 152 | /*300*/ .word sys_set_robust_list, sys_get_robust_list, sys_migrate_pages |
153 | 153 | ||
154 | #if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \ | 154 | #if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \ |
155 | defined(CONFIG_SOLARIS_EMUL_MODULE) | 155 | defined(CONFIG_SOLARIS_EMUL_MODULE) |
@@ -262,5 +262,7 @@ sunos_sys_table: | |||
262 | /*290*/ .word sunos_nosys, sunos_nosys, sunos_nosys | 262 | /*290*/ .word sunos_nosys, sunos_nosys, sunos_nosys |
263 | .word sunos_nosys, sunos_nosys, sunos_nosys | 263 | .word sunos_nosys, sunos_nosys, sunos_nosys |
264 | .word sunos_nosys, sunos_nosys, sunos_nosys | 264 | .word sunos_nosys, sunos_nosys, sunos_nosys |
265 | .word sunos_nosys, sunos_nosys, sunos_nosys | 265 | .word sunos_nosys |
266 | /*300*/ .word sunos_nosys, sunos_nosys, sunos_nosys | ||
267 | |||
266 | #endif | 268 | #endif |
diff --git a/arch/sparc64/kernel/traps.c b/arch/sparc64/kernel/traps.c index 68420e2dad0e..fe1796c939c3 100644 --- a/arch/sparc64/kernel/traps.c +++ b/arch/sparc64/kernel/traps.c | |||
@@ -87,6 +87,7 @@ static void dump_tl1_traplog(struct tl1_traplog *p) | |||
87 | i + 1, | 87 | i + 1, |
88 | p->trapstack[i].tstate, p->trapstack[i].tpc, | 88 | p->trapstack[i].tstate, p->trapstack[i].tpc, |
89 | p->trapstack[i].tnpc, p->trapstack[i].tt); | 89 | p->trapstack[i].tnpc, p->trapstack[i].tt); |
90 | print_symbol("TRAPLOG: TPC<%s>\n", p->trapstack[i].tpc); | ||
90 | } | 91 | } |
91 | } | 92 | } |
92 | 93 | ||
@@ -1134,6 +1135,9 @@ static void cheetah_log_errors(struct pt_regs *regs, struct cheetah_err_info *in | |||
1134 | printk("%s" "ERROR(%d): TPC[%lx] TNPC[%lx] O7[%lx] TSTATE[%lx]\n", | 1135 | printk("%s" "ERROR(%d): TPC[%lx] TNPC[%lx] O7[%lx] TSTATE[%lx]\n", |
1135 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), | 1136 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), |
1136 | regs->tpc, regs->tnpc, regs->u_regs[UREG_I7], regs->tstate); | 1137 | regs->tpc, regs->tnpc, regs->u_regs[UREG_I7], regs->tstate); |
1138 | printk("%s" "ERROR(%d): ", | ||
1139 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id()); | ||
1140 | print_symbol("TPC<%s>\n", regs->tpc); | ||
1137 | printk("%s" "ERROR(%d): M_SYND(%lx), E_SYND(%lx)%s%s\n", | 1141 | printk("%s" "ERROR(%d): M_SYND(%lx), E_SYND(%lx)%s%s\n", |
1138 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), | 1142 | (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), |
1139 | (afsr & CHAFSR_M_SYNDROME) >> CHAFSR_M_SYNDROME_SHIFT, | 1143 | (afsr & CHAFSR_M_SYNDROME) >> CHAFSR_M_SYNDROME_SHIFT, |
@@ -1741,6 +1745,7 @@ void cheetah_plus_parity_error(int type, struct pt_regs *regs) | |||
1741 | smp_processor_id(), | 1745 | smp_processor_id(), |
1742 | (type & 0x1) ? 'I' : 'D', | 1746 | (type & 0x1) ? 'I' : 'D', |
1743 | regs->tpc); | 1747 | regs->tpc); |
1748 | print_symbol(KERN_EMERG "TPC<%s>\n", regs->tpc); | ||
1744 | panic("Irrecoverable Cheetah+ parity error."); | 1749 | panic("Irrecoverable Cheetah+ parity error."); |
1745 | } | 1750 | } |
1746 | 1751 | ||
@@ -1748,6 +1753,7 @@ void cheetah_plus_parity_error(int type, struct pt_regs *regs) | |||
1748 | smp_processor_id(), | 1753 | smp_processor_id(), |
1749 | (type & 0x1) ? 'I' : 'D', | 1754 | (type & 0x1) ? 'I' : 'D', |
1750 | regs->tpc); | 1755 | regs->tpc); |
1756 | print_symbol(KERN_WARNING "TPC<%s>\n", regs->tpc); | ||
1751 | } | 1757 | } |
1752 | 1758 | ||
1753 | struct sun4v_error_entry { | 1759 | struct sun4v_error_entry { |
@@ -1946,6 +1952,7 @@ void sun4v_itlb_error_report(struct pt_regs *regs, int tl) | |||
1946 | 1952 | ||
1947 | printk(KERN_EMERG "SUN4V-ITLB: Error at TPC[%lx], tl %d\n", | 1953 | printk(KERN_EMERG "SUN4V-ITLB: Error at TPC[%lx], tl %d\n", |
1948 | regs->tpc, tl); | 1954 | regs->tpc, tl); |
1955 | print_symbol(KERN_EMERG "SUN4V-ITLB: TPC<%s>\n", regs->tpc); | ||
1949 | printk(KERN_EMERG "SUN4V-ITLB: vaddr[%lx] ctx[%lx] " | 1956 | printk(KERN_EMERG "SUN4V-ITLB: vaddr[%lx] ctx[%lx] " |
1950 | "pte[%lx] error[%lx]\n", | 1957 | "pte[%lx] error[%lx]\n", |
1951 | sun4v_err_itlb_vaddr, sun4v_err_itlb_ctx, | 1958 | sun4v_err_itlb_vaddr, sun4v_err_itlb_ctx, |
@@ -1966,6 +1973,7 @@ void sun4v_dtlb_error_report(struct pt_regs *regs, int tl) | |||
1966 | 1973 | ||
1967 | printk(KERN_EMERG "SUN4V-DTLB: Error at TPC[%lx], tl %d\n", | 1974 | printk(KERN_EMERG "SUN4V-DTLB: Error at TPC[%lx], tl %d\n", |
1968 | regs->tpc, tl); | 1975 | regs->tpc, tl); |
1976 | print_symbol(KERN_EMERG "SUN4V-DTLB: TPC<%s>\n", regs->tpc); | ||
1969 | printk(KERN_EMERG "SUN4V-DTLB: vaddr[%lx] ctx[%lx] " | 1977 | printk(KERN_EMERG "SUN4V-DTLB: vaddr[%lx] ctx[%lx] " |
1970 | "pte[%lx] error[%lx]\n", | 1978 | "pte[%lx] error[%lx]\n", |
1971 | sun4v_err_dtlb_vaddr, sun4v_err_dtlb_ctx, | 1979 | sun4v_err_dtlb_vaddr, sun4v_err_dtlb_ctx, |
diff --git a/arch/sparc64/kernel/vmlinux.lds.S b/arch/sparc64/kernel/vmlinux.lds.S index b097379a49a8..bd9de8c2a2aa 100644 --- a/arch/sparc64/kernel/vmlinux.lds.S +++ b/arch/sparc64/kernel/vmlinux.lds.S | |||
@@ -57,13 +57,7 @@ SECTIONS | |||
57 | __setup_end = .; | 57 | __setup_end = .; |
58 | __initcall_start = .; | 58 | __initcall_start = .; |
59 | .initcall.init : { | 59 | .initcall.init : { |
60 | *(.initcall1.init) | 60 | INITCALLS |
61 | *(.initcall2.init) | ||
62 | *(.initcall3.init) | ||
63 | *(.initcall4.init) | ||
64 | *(.initcall5.init) | ||
65 | *(.initcall6.init) | ||
66 | *(.initcall7.init) | ||
67 | } | 61 | } |
68 | __initcall_end = .; | 62 | __initcall_end = .; |
69 | __con_initcall_start = .; | 63 | __con_initcall_start = .; |
diff --git a/arch/um/Makefile b/arch/um/Makefile index c8016a98483b..5d5ed726faa0 100644 --- a/arch/um/Makefile +++ b/arch/um/Makefile | |||
@@ -64,9 +64,14 @@ CFLAGS += $(CFLAGS-y) -D__arch_um__ -DSUBARCH=\"$(SUBARCH)\" \ | |||
64 | 64 | ||
65 | AFLAGS += $(ARCH_INCLUDE) | 65 | AFLAGS += $(ARCH_INCLUDE) |
66 | 66 | ||
67 | USER_CFLAGS := $(patsubst -I%,,$(CFLAGS)) | 67 | USER_CFLAGS = $(patsubst $(KERNEL_DEFINES),,$(patsubst -D__KERNEL__,,\ |
68 | USER_CFLAGS := $(patsubst -D__KERNEL__,,$(USER_CFLAGS)) $(ARCH_INCLUDE) \ | 68 | $(patsubst -I%,,$(CFLAGS)))) $(ARCH_INCLUDE) $(MODE_INCLUDE) \ |
69 | $(MODE_INCLUDE) -D_FILE_OFFSET_BITS=64 | 69 | -D_FILE_OFFSET_BITS=64 |
70 | |||
71 | include $(srctree)/$(ARCH_DIR)/Makefile-$(SUBARCH) | ||
72 | |||
73 | #This will adjust *FLAGS accordingly to the platform. | ||
74 | include $(srctree)/$(ARCH_DIR)/Makefile-os-$(OS) | ||
70 | 75 | ||
71 | # -Derrno=kernel_errno - This turns all kernel references to errno into | 76 | # -Derrno=kernel_errno - This turns all kernel references to errno into |
72 | # kernel_errno to separate them from the libc errno. This allows -fno-common | 77 | # kernel_errno to separate them from the libc errno. This allows -fno-common |
@@ -74,15 +79,11 @@ USER_CFLAGS := $(patsubst -D__KERNEL__,,$(USER_CFLAGS)) $(ARCH_INCLUDE) \ | |||
74 | # errnos. | 79 | # errnos. |
75 | # These apply to kernelspace only. | 80 | # These apply to kernelspace only. |
76 | 81 | ||
77 | CFLAGS += -Derrno=kernel_errno -Dsigprocmask=kernel_sigprocmask \ | 82 | KERNEL_DEFINES = -Derrno=kernel_errno -Dsigprocmask=kernel_sigprocmask \ |
78 | -Dmktime=kernel_mktime | 83 | -Dmktime=kernel_mktime $(ARCH_KERNEL_DEFINES) |
84 | CFLAGS += $(KERNEL_DEFINES) | ||
79 | CFLAGS += $(call cc-option,-fno-unit-at-a-time,) | 85 | CFLAGS += $(call cc-option,-fno-unit-at-a-time,) |
80 | 86 | ||
81 | include $(srctree)/$(ARCH_DIR)/Makefile-$(SUBARCH) | ||
82 | |||
83 | #This will adjust *FLAGS accordingly to the platform. | ||
84 | include $(srctree)/$(ARCH_DIR)/Makefile-os-$(OS) | ||
85 | |||
86 | # These are needed for clean and mrproper, since in that case .config is not | 87 | # These are needed for clean and mrproper, since in that case .config is not |
87 | # included; the values here are meaningless | 88 | # included; the values here are meaningless |
88 | 89 | ||
diff --git a/arch/um/Makefile-i386 b/arch/um/Makefile-i386 index b65ca115ef77..c9f1c5b24c9a 100644 --- a/arch/um/Makefile-i386 +++ b/arch/um/Makefile-i386 | |||
@@ -16,7 +16,6 @@ OBJCOPYFLAGS := -O binary -R .note -R .comment -S | |||
16 | ifeq ("$(origin SUBARCH)", "command line") | 16 | ifeq ("$(origin SUBARCH)", "command line") |
17 | ifneq ("$(shell uname -m | sed -e s/i.86/i386/)", "$(SUBARCH)") | 17 | ifneq ("$(shell uname -m | sed -e s/i.86/i386/)", "$(SUBARCH)") |
18 | CFLAGS += $(call cc-option,-m32) | 18 | CFLAGS += $(call cc-option,-m32) |
19 | USER_CFLAGS += $(call cc-option,-m32) | ||
20 | AFLAGS += $(call cc-option,-m32) | 19 | AFLAGS += $(call cc-option,-m32) |
21 | LINK-y += $(call cc-option,-m32) | 20 | LINK-y += $(call cc-option,-m32) |
22 | UML_OBJCOPYFLAGS += -F $(ELF_FORMAT) | 21 | UML_OBJCOPYFLAGS += -F $(ELF_FORMAT) |
@@ -25,7 +24,7 @@ export LDFLAGS HOSTCFLAGS HOSTLDFLAGS UML_OBJCOPYFLAGS | |||
25 | endif | 24 | endif |
26 | endif | 25 | endif |
27 | 26 | ||
28 | CFLAGS += -U__$(SUBARCH)__ -U$(SUBARCH) | 27 | ARCH_KERNEL_DEFINES += -U__$(SUBARCH)__ -U$(SUBARCH) |
29 | 28 | ||
30 | # First of all, tune CFLAGS for the specific CPU. This actually sets cflags-y. | 29 | # First of all, tune CFLAGS for the specific CPU. This actually sets cflags-y. |
31 | include $(srctree)/arch/i386/Makefile.cpu | 30 | include $(srctree)/arch/i386/Makefile.cpu |
@@ -38,4 +37,3 @@ cflags-y += $(call cc-option,-mpreferred-stack-boundary=2) | |||
38 | cflags-y += -ffreestanding | 37 | cflags-y += -ffreestanding |
39 | 38 | ||
40 | CFLAGS += $(cflags-y) | 39 | CFLAGS += $(cflags-y) |
41 | USER_CFLAGS += $(cflags-y) | ||
diff --git a/arch/um/Makefile-x86_64 b/arch/um/Makefile-x86_64 index d278682dd799..69ecea63fdae 100644 --- a/arch/um/Makefile-x86_64 +++ b/arch/um/Makefile-x86_64 | |||
@@ -8,8 +8,8 @@ _extra_flags_ = -fno-builtin -m64 | |||
8 | 8 | ||
9 | #We #undef __x86_64__ for kernelspace, not for userspace where | 9 | #We #undef __x86_64__ for kernelspace, not for userspace where |
10 | #it's needed for headers to work! | 10 | #it's needed for headers to work! |
11 | CFLAGS += -U__$(SUBARCH)__ $(_extra_flags_) | 11 | ARCH_KERNEL_DEFINES = -U__$(SUBARCH)__ |
12 | USER_CFLAGS += $(_extra_flags_) | 12 | CFLAGS += $(_extra_flags_) |
13 | 13 | ||
14 | CHECKFLAGS += -m64 | 14 | CHECKFLAGS += -m64 |
15 | AFLAGS += -m64 | 15 | AFLAGS += -m64 |
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c index d08bd036ccb8..7b172160fe04 100644 --- a/arch/um/drivers/mconsole_kern.c +++ b/arch/um/drivers/mconsole_kern.c | |||
@@ -79,7 +79,7 @@ static irqreturn_t mconsole_interrupt(int irq, void *dev_id) | |||
79 | /* long to avoid size mismatch warnings from gcc */ | 79 | /* long to avoid size mismatch warnings from gcc */ |
80 | long fd; | 80 | long fd; |
81 | struct mconsole_entry *new; | 81 | struct mconsole_entry *new; |
82 | struct mc_request req; | 82 | static struct mc_request req; /* that's OK */ |
83 | 83 | ||
84 | fd = (long) dev_id; | 84 | fd = (long) dev_id; |
85 | while (mconsole_get_request(fd, &req)){ | 85 | while (mconsole_get_request(fd, &req)){ |
@@ -91,6 +91,7 @@ static irqreturn_t mconsole_interrupt(int irq, void *dev_id) | |||
91 | mconsole_reply(&req, "Out of memory", 1, 0); | 91 | mconsole_reply(&req, "Out of memory", 1, 0); |
92 | else { | 92 | else { |
93 | new->request = req; | 93 | new->request = req; |
94 | new->request.regs = get_irq_regs()->regs; | ||
94 | list_add(&new->list, &mc_requests); | 95 | list_add(&new->list, &mc_requests); |
95 | } | 96 | } |
96 | } | 97 | } |
@@ -314,9 +315,21 @@ void mconsole_stop(struct mc_request *req) | |||
314 | { | 315 | { |
315 | deactivate_fd(req->originating_fd, MCONSOLE_IRQ); | 316 | deactivate_fd(req->originating_fd, MCONSOLE_IRQ); |
316 | os_set_fd_block(req->originating_fd, 1); | 317 | os_set_fd_block(req->originating_fd, 1); |
317 | mconsole_reply(req, "", 0, 0); | 318 | mconsole_reply(req, "stopped", 0, 0); |
318 | while(mconsole_get_request(req->originating_fd, req)){ | 319 | while (mconsole_get_request(req->originating_fd, req)) { |
319 | if(req->cmd->handler == mconsole_go) break; | 320 | if (req->cmd->handler == mconsole_go) |
321 | break; | ||
322 | if (req->cmd->handler == mconsole_stop) { | ||
323 | mconsole_reply(req, "Already stopped", 1, 0); | ||
324 | continue; | ||
325 | } | ||
326 | if (req->cmd->handler == mconsole_sysrq) { | ||
327 | struct pt_regs *old_regs; | ||
328 | old_regs = set_irq_regs((struct pt_regs *)&req->regs); | ||
329 | mconsole_sysrq(req); | ||
330 | set_irq_regs(old_regs); | ||
331 | continue; | ||
332 | } | ||
320 | (*req->cmd->handler)(req); | 333 | (*req->cmd->handler)(req); |
321 | } | 334 | } |
322 | os_set_fd_block(req->originating_fd, 0); | 335 | os_set_fd_block(req->originating_fd, 0); |
@@ -673,9 +686,7 @@ static void with_console(struct mc_request *req, void (*proc)(void *), | |||
673 | static void sysrq_proc(void *arg) | 686 | static void sysrq_proc(void *arg) |
674 | { | 687 | { |
675 | char *op = arg; | 688 | char *op = arg; |
676 | struct pt_regs *old_regs = set_irq_regs(¤t->thread.regs); | ||
677 | handle_sysrq(*op, NULL); | 689 | handle_sysrq(*op, NULL); |
678 | set_irq_regs(old_regs); | ||
679 | } | 690 | } |
680 | 691 | ||
681 | void mconsole_sysrq(struct mc_request *req) | 692 | void mconsole_sysrq(struct mc_request *req) |
diff --git a/arch/um/drivers/mconsole_user.c b/arch/um/drivers/mconsole_user.c index 17068eb746c0..75aef6f7ef6e 100644 --- a/arch/um/drivers/mconsole_user.c +++ b/arch/um/drivers/mconsole_user.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <sys/un.h> | 14 | #include <sys/un.h> |
15 | #include <unistd.h> | 15 | #include <unistd.h> |
16 | #include "user.h" | 16 | #include "user.h" |
17 | #include "sysdep/ptrace.h" | ||
17 | #include "mconsole.h" | 18 | #include "mconsole.h" |
18 | #include "umid.h" | 19 | #include "umid.h" |
19 | #include "user_util.h" | 20 | #include "user_util.h" |
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c index bc458f57921b..49c047b75cc5 100644 --- a/arch/um/drivers/ubd_kern.c +++ b/arch/um/drivers/ubd_kern.c | |||
@@ -106,10 +106,15 @@ static inline void ubd_set_bit(__u64 bit, unsigned char *data) | |||
106 | 106 | ||
107 | #define DRIVER_NAME "uml-blkdev" | 107 | #define DRIVER_NAME "uml-blkdev" |
108 | 108 | ||
109 | /* Can be taken in interrupt context, and is passed to the block layer to lock | ||
110 | * the request queue. Kernel side code knows that. */ | ||
109 | static DEFINE_SPINLOCK(ubd_io_lock); | 111 | static DEFINE_SPINLOCK(ubd_io_lock); |
110 | static DEFINE_SPINLOCK(ubd_lock); | ||
111 | 112 | ||
112 | static void (*do_ubd)(void); | 113 | static DEFINE_MUTEX(ubd_lock); |
114 | |||
115 | /* XXX - this made sense in 2.4 days, now it's only used as a boolean, and | ||
116 | * probably it doesn't make sense even for that. */ | ||
117 | static int do_ubd; | ||
113 | 118 | ||
114 | static int ubd_open(struct inode * inode, struct file * filp); | 119 | static int ubd_open(struct inode * inode, struct file * filp); |
115 | static int ubd_release(struct inode * inode, struct file * file); | 120 | static int ubd_release(struct inode * inode, struct file * file); |
@@ -117,7 +122,7 @@ static int ubd_ioctl(struct inode * inode, struct file * file, | |||
117 | unsigned int cmd, unsigned long arg); | 122 | unsigned int cmd, unsigned long arg); |
118 | static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo); | 123 | static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo); |
119 | 124 | ||
120 | #define MAX_DEV (8) | 125 | #define MAX_DEV (16) |
121 | 126 | ||
122 | static struct block_device_operations ubd_blops = { | 127 | static struct block_device_operations ubd_blops = { |
123 | .owner = THIS_MODULE, | 128 | .owner = THIS_MODULE, |
@@ -150,8 +155,9 @@ static struct gendisk *fake_gendisk[MAX_DEV]; | |||
150 | static struct openflags global_openflags = OPEN_FLAGS; | 155 | static struct openflags global_openflags = OPEN_FLAGS; |
151 | 156 | ||
152 | struct cow { | 157 | struct cow { |
153 | /* This is the backing file, actually */ | 158 | /* backing file name */ |
154 | char *file; | 159 | char *file; |
160 | /* backing file fd */ | ||
155 | int fd; | 161 | int fd; |
156 | unsigned long *bitmap; | 162 | unsigned long *bitmap; |
157 | unsigned long bitmap_len; | 163 | unsigned long bitmap_len; |
@@ -160,14 +166,16 @@ struct cow { | |||
160 | }; | 166 | }; |
161 | 167 | ||
162 | struct ubd { | 168 | struct ubd { |
169 | /* name (and fd, below) of the file opened for writing, either the | ||
170 | * backing or the cow file. */ | ||
163 | char *file; | 171 | char *file; |
164 | int count; | 172 | int count; |
165 | int fd; | 173 | int fd; |
166 | __u64 size; | 174 | __u64 size; |
167 | struct openflags boot_openflags; | 175 | struct openflags boot_openflags; |
168 | struct openflags openflags; | 176 | struct openflags openflags; |
169 | int shared; | 177 | unsigned shared:1; |
170 | int no_cow; | 178 | unsigned no_cow:1; |
171 | struct cow cow; | 179 | struct cow cow; |
172 | struct platform_device pdev; | 180 | struct platform_device pdev; |
173 | }; | 181 | }; |
@@ -192,18 +200,7 @@ struct ubd { | |||
192 | .cow = DEFAULT_COW, \ | 200 | .cow = DEFAULT_COW, \ |
193 | } | 201 | } |
194 | 202 | ||
195 | struct ubd ubd_dev[MAX_DEV] = { [ 0 ... MAX_DEV - 1 ] = DEFAULT_UBD }; | 203 | struct ubd ubd_devs[MAX_DEV] = { [ 0 ... MAX_DEV - 1 ] = DEFAULT_UBD }; |
196 | |||
197 | static int ubd0_init(void) | ||
198 | { | ||
199 | struct ubd *dev = &ubd_dev[0]; | ||
200 | |||
201 | if(dev->file == NULL) | ||
202 | dev->file = "root_fs"; | ||
203 | return(0); | ||
204 | } | ||
205 | |||
206 | __initcall(ubd0_init); | ||
207 | 204 | ||
208 | /* Only changed by fake_ide_setup which is a setup */ | 205 | /* Only changed by fake_ide_setup which is a setup */ |
209 | static int fake_ide = 0; | 206 | static int fake_ide = 0; |
@@ -277,7 +274,7 @@ static int parse_unit(char **ptr) | |||
277 | return(-1); | 274 | return(-1); |
278 | *ptr = end; | 275 | *ptr = end; |
279 | } | 276 | } |
280 | else if (('a' <= *str) && (*str <= 'h')) { | 277 | else if (('a' <= *str) && (*str <= 'z')) { |
281 | n = *str - 'a'; | 278 | n = *str - 'a'; |
282 | str++; | 279 | str++; |
283 | *ptr = str; | 280 | *ptr = str; |
@@ -285,9 +282,13 @@ static int parse_unit(char **ptr) | |||
285 | return(n); | 282 | return(n); |
286 | } | 283 | } |
287 | 284 | ||
285 | /* If *index_out == -1 at exit, the passed option was a general one; | ||
286 | * otherwise, the str pointer is used (and owned) inside ubd_devs array, so it | ||
287 | * should not be freed on exit. | ||
288 | */ | ||
288 | static int ubd_setup_common(char *str, int *index_out) | 289 | static int ubd_setup_common(char *str, int *index_out) |
289 | { | 290 | { |
290 | struct ubd *dev; | 291 | struct ubd *ubd_dev; |
291 | struct openflags flags = global_openflags; | 292 | struct openflags flags = global_openflags; |
292 | char *backing_file; | 293 | char *backing_file; |
293 | int n, err, i; | 294 | int n, err, i; |
@@ -311,7 +312,7 @@ static int ubd_setup_common(char *str, int *index_out) | |||
311 | } | 312 | } |
312 | 313 | ||
313 | err = 1; | 314 | err = 1; |
314 | spin_lock(&ubd_lock); | 315 | mutex_lock(&ubd_lock); |
315 | if(fake_major != MAJOR_NR){ | 316 | if(fake_major != MAJOR_NR){ |
316 | printk(KERN_ERR "Can't assign a fake major twice\n"); | 317 | printk(KERN_ERR "Can't assign a fake major twice\n"); |
317 | goto out1; | 318 | goto out1; |
@@ -323,7 +324,7 @@ static int ubd_setup_common(char *str, int *index_out) | |||
323 | major); | 324 | major); |
324 | err = 0; | 325 | err = 0; |
325 | out1: | 326 | out1: |
326 | spin_unlock(&ubd_lock); | 327 | mutex_unlock(&ubd_lock); |
327 | return(err); | 328 | return(err); |
328 | } | 329 | } |
329 | 330 | ||
@@ -340,10 +341,10 @@ static int ubd_setup_common(char *str, int *index_out) | |||
340 | } | 341 | } |
341 | 342 | ||
342 | err = 1; | 343 | err = 1; |
343 | spin_lock(&ubd_lock); | 344 | mutex_lock(&ubd_lock); |
344 | 345 | ||
345 | dev = &ubd_dev[n]; | 346 | ubd_dev = &ubd_devs[n]; |
346 | if(dev->file != NULL){ | 347 | if(ubd_dev->file != NULL){ |
347 | printk(KERN_ERR "ubd_setup : device already configured\n"); | 348 | printk(KERN_ERR "ubd_setup : device already configured\n"); |
348 | goto out; | 349 | goto out; |
349 | } | 350 | } |
@@ -360,10 +361,10 @@ static int ubd_setup_common(char *str, int *index_out) | |||
360 | flags.s = 1; | 361 | flags.s = 1; |
361 | break; | 362 | break; |
362 | case 'd': | 363 | case 'd': |
363 | dev->no_cow = 1; | 364 | ubd_dev->no_cow = 1; |
364 | break; | 365 | break; |
365 | case 'c': | 366 | case 'c': |
366 | dev->shared = 1; | 367 | ubd_dev->shared = 1; |
367 | break; | 368 | break; |
368 | case '=': | 369 | case '=': |
369 | str++; | 370 | str++; |
@@ -390,7 +391,7 @@ break_loop: | |||
390 | } | 391 | } |
391 | 392 | ||
392 | if(backing_file){ | 393 | if(backing_file){ |
393 | if(dev->no_cow) | 394 | if(ubd_dev->no_cow) |
394 | printk(KERN_ERR "Can't specify both 'd' and a " | 395 | printk(KERN_ERR "Can't specify both 'd' and a " |
395 | "cow file\n"); | 396 | "cow file\n"); |
396 | else { | 397 | else { |
@@ -398,11 +399,11 @@ break_loop: | |||
398 | backing_file++; | 399 | backing_file++; |
399 | } | 400 | } |
400 | } | 401 | } |
401 | dev->file = str; | 402 | ubd_dev->file = str; |
402 | dev->cow.file = backing_file; | 403 | ubd_dev->cow.file = backing_file; |
403 | dev->boot_openflags = flags; | 404 | ubd_dev->boot_openflags = flags; |
404 | out: | 405 | out: |
405 | spin_unlock(&ubd_lock); | 406 | mutex_unlock(&ubd_lock); |
406 | return(err); | 407 | return(err); |
407 | } | 408 | } |
408 | 409 | ||
@@ -472,8 +473,9 @@ int thread_fd = -1; | |||
472 | 473 | ||
473 | /* Changed by ubd_handler, which is serialized because interrupts only | 474 | /* Changed by ubd_handler, which is serialized because interrupts only |
474 | * happen on CPU 0. | 475 | * happen on CPU 0. |
476 | * XXX: currently unused. | ||
475 | */ | 477 | */ |
476 | int intr_count = 0; | 478 | static int intr_count = 0; |
477 | 479 | ||
478 | /* call ubd_finish if you need to serialize */ | 480 | /* call ubd_finish if you need to serialize */ |
479 | static void __ubd_finish(struct request *req, int error) | 481 | static void __ubd_finish(struct request *req, int error) |
@@ -493,6 +495,8 @@ static void __ubd_finish(struct request *req, int error) | |||
493 | end_request(req, 1); | 495 | end_request(req, 1); |
494 | } | 496 | } |
495 | 497 | ||
498 | /* Callable only from interrupt context - otherwise you need to do | ||
499 | * spin_lock_irq()/spin_lock_irqsave() */ | ||
496 | static inline void ubd_finish(struct request *req, int error) | 500 | static inline void ubd_finish(struct request *req, int error) |
497 | { | 501 | { |
498 | spin_lock(&ubd_io_lock); | 502 | spin_lock(&ubd_io_lock); |
@@ -500,14 +504,15 @@ static inline void ubd_finish(struct request *req, int error) | |||
500 | spin_unlock(&ubd_io_lock); | 504 | spin_unlock(&ubd_io_lock); |
501 | } | 505 | } |
502 | 506 | ||
503 | /* Called without ubd_io_lock held */ | 507 | /* XXX - move this inside ubd_intr. */ |
508 | /* Called without ubd_io_lock held, and only in interrupt context. */ | ||
504 | static void ubd_handler(void) | 509 | static void ubd_handler(void) |
505 | { | 510 | { |
506 | struct io_thread_req req; | 511 | struct io_thread_req req; |
507 | struct request *rq = elv_next_request(ubd_queue); | 512 | struct request *rq = elv_next_request(ubd_queue); |
508 | int n; | 513 | int n; |
509 | 514 | ||
510 | do_ubd = NULL; | 515 | do_ubd = 0; |
511 | intr_count++; | 516 | intr_count++; |
512 | n = os_read_file(thread_fd, &req, sizeof(req)); | 517 | n = os_read_file(thread_fd, &req, sizeof(req)); |
513 | if(n != sizeof(req)){ | 518 | if(n != sizeof(req)){ |
@@ -521,7 +526,9 @@ static void ubd_handler(void) | |||
521 | 526 | ||
522 | ubd_finish(rq, req.error); | 527 | ubd_finish(rq, req.error); |
523 | reactivate_fd(thread_fd, UBD_IRQ); | 528 | reactivate_fd(thread_fd, UBD_IRQ); |
529 | spin_lock(&ubd_io_lock); | ||
524 | do_ubd_request(ubd_queue); | 530 | do_ubd_request(ubd_queue); |
531 | spin_unlock(&ubd_io_lock); | ||
525 | } | 532 | } |
526 | 533 | ||
527 | static irqreturn_t ubd_intr(int irq, void *dev) | 534 | static irqreturn_t ubd_intr(int irq, void *dev) |
@@ -541,87 +548,90 @@ void kill_io_thread(void) | |||
541 | 548 | ||
542 | __uml_exitcall(kill_io_thread); | 549 | __uml_exitcall(kill_io_thread); |
543 | 550 | ||
544 | static int ubd_file_size(struct ubd *dev, __u64 *size_out) | 551 | static inline int ubd_file_size(struct ubd *ubd_dev, __u64 *size_out) |
545 | { | 552 | { |
546 | char *file; | 553 | char *file; |
547 | 554 | ||
548 | file = dev->cow.file ? dev->cow.file : dev->file; | 555 | file = ubd_dev->cow.file ? ubd_dev->cow.file : ubd_dev->file; |
549 | return(os_file_size(file, size_out)); | 556 | return(os_file_size(file, size_out)); |
550 | } | 557 | } |
551 | 558 | ||
552 | static void ubd_close(struct ubd *dev) | 559 | static void ubd_close_dev(struct ubd *ubd_dev) |
553 | { | 560 | { |
554 | os_close_file(dev->fd); | 561 | os_close_file(ubd_dev->fd); |
555 | if(dev->cow.file == NULL) | 562 | if(ubd_dev->cow.file == NULL) |
556 | return; | 563 | return; |
557 | 564 | ||
558 | os_close_file(dev->cow.fd); | 565 | os_close_file(ubd_dev->cow.fd); |
559 | vfree(dev->cow.bitmap); | 566 | vfree(ubd_dev->cow.bitmap); |
560 | dev->cow.bitmap = NULL; | 567 | ubd_dev->cow.bitmap = NULL; |
561 | } | 568 | } |
562 | 569 | ||
563 | static int ubd_open_dev(struct ubd *dev) | 570 | static int ubd_open_dev(struct ubd *ubd_dev) |
564 | { | 571 | { |
565 | struct openflags flags; | 572 | struct openflags flags; |
566 | char **back_ptr; | 573 | char **back_ptr; |
567 | int err, create_cow, *create_ptr; | 574 | int err, create_cow, *create_ptr; |
575 | int fd; | ||
568 | 576 | ||
569 | dev->openflags = dev->boot_openflags; | 577 | ubd_dev->openflags = ubd_dev->boot_openflags; |
570 | create_cow = 0; | 578 | create_cow = 0; |
571 | create_ptr = (dev->cow.file != NULL) ? &create_cow : NULL; | 579 | create_ptr = (ubd_dev->cow.file != NULL) ? &create_cow : NULL; |
572 | back_ptr = dev->no_cow ? NULL : &dev->cow.file; | 580 | back_ptr = ubd_dev->no_cow ? NULL : &ubd_dev->cow.file; |
573 | dev->fd = open_ubd_file(dev->file, &dev->openflags, dev->shared, | 581 | |
574 | back_ptr, &dev->cow.bitmap_offset, | 582 | fd = open_ubd_file(ubd_dev->file, &ubd_dev->openflags, ubd_dev->shared, |
575 | &dev->cow.bitmap_len, &dev->cow.data_offset, | 583 | back_ptr, &ubd_dev->cow.bitmap_offset, |
584 | &ubd_dev->cow.bitmap_len, &ubd_dev->cow.data_offset, | ||
576 | create_ptr); | 585 | create_ptr); |
577 | 586 | ||
578 | if((dev->fd == -ENOENT) && create_cow){ | 587 | if((fd == -ENOENT) && create_cow){ |
579 | dev->fd = create_cow_file(dev->file, dev->cow.file, | 588 | fd = create_cow_file(ubd_dev->file, ubd_dev->cow.file, |
580 | dev->openflags, 1 << 9, PAGE_SIZE, | 589 | ubd_dev->openflags, 1 << 9, PAGE_SIZE, |
581 | &dev->cow.bitmap_offset, | 590 | &ubd_dev->cow.bitmap_offset, |
582 | &dev->cow.bitmap_len, | 591 | &ubd_dev->cow.bitmap_len, |
583 | &dev->cow.data_offset); | 592 | &ubd_dev->cow.data_offset); |
584 | if(dev->fd >= 0){ | 593 | if(fd >= 0){ |
585 | printk(KERN_INFO "Creating \"%s\" as COW file for " | 594 | printk(KERN_INFO "Creating \"%s\" as COW file for " |
586 | "\"%s\"\n", dev->file, dev->cow.file); | 595 | "\"%s\"\n", ubd_dev->file, ubd_dev->cow.file); |
587 | } | 596 | } |
588 | } | 597 | } |
589 | 598 | ||
590 | if(dev->fd < 0){ | 599 | if(fd < 0){ |
591 | printk("Failed to open '%s', errno = %d\n", dev->file, | 600 | printk("Failed to open '%s', errno = %d\n", ubd_dev->file, |
592 | -dev->fd); | 601 | -fd); |
593 | return(dev->fd); | 602 | return fd; |
594 | } | 603 | } |
604 | ubd_dev->fd = fd; | ||
595 | 605 | ||
596 | if(dev->cow.file != NULL){ | 606 | if(ubd_dev->cow.file != NULL){ |
597 | err = -ENOMEM; | 607 | err = -ENOMEM; |
598 | dev->cow.bitmap = (void *) vmalloc(dev->cow.bitmap_len); | 608 | ubd_dev->cow.bitmap = (void *) vmalloc(ubd_dev->cow.bitmap_len); |
599 | if(dev->cow.bitmap == NULL){ | 609 | if(ubd_dev->cow.bitmap == NULL){ |
600 | printk(KERN_ERR "Failed to vmalloc COW bitmap\n"); | 610 | printk(KERN_ERR "Failed to vmalloc COW bitmap\n"); |
601 | goto error; | 611 | goto error; |
602 | } | 612 | } |
603 | flush_tlb_kernel_vm(); | 613 | flush_tlb_kernel_vm(); |
604 | 614 | ||
605 | err = read_cow_bitmap(dev->fd, dev->cow.bitmap, | 615 | err = read_cow_bitmap(ubd_dev->fd, ubd_dev->cow.bitmap, |
606 | dev->cow.bitmap_offset, | 616 | ubd_dev->cow.bitmap_offset, |
607 | dev->cow.bitmap_len); | 617 | ubd_dev->cow.bitmap_len); |
608 | if(err < 0) | 618 | if(err < 0) |
609 | goto error; | 619 | goto error; |
610 | 620 | ||
611 | flags = dev->openflags; | 621 | flags = ubd_dev->openflags; |
612 | flags.w = 0; | 622 | flags.w = 0; |
613 | err = open_ubd_file(dev->cow.file, &flags, dev->shared, NULL, | 623 | err = open_ubd_file(ubd_dev->cow.file, &flags, ubd_dev->shared, NULL, |
614 | NULL, NULL, NULL, NULL); | 624 | NULL, NULL, NULL, NULL); |
615 | if(err < 0) goto error; | 625 | if(err < 0) goto error; |
616 | dev->cow.fd = err; | 626 | ubd_dev->cow.fd = err; |
617 | } | 627 | } |
618 | return(0); | 628 | return(0); |
619 | error: | 629 | error: |
620 | os_close_file(dev->fd); | 630 | os_close_file(ubd_dev->fd); |
621 | return(err); | 631 | return(err); |
622 | } | 632 | } |
623 | 633 | ||
624 | static int ubd_new_disk(int major, u64 size, int unit, | 634 | static int ubd_disk_register(int major, u64 size, int unit, |
625 | struct gendisk **disk_out) | 635 | struct gendisk **disk_out) |
626 | 636 | ||
627 | { | 637 | { |
@@ -642,13 +652,13 @@ static int ubd_new_disk(int major, u64 size, int unit, | |||
642 | 652 | ||
643 | /* sysfs register (not for ide fake devices) */ | 653 | /* sysfs register (not for ide fake devices) */ |
644 | if (major == MAJOR_NR) { | 654 | if (major == MAJOR_NR) { |
645 | ubd_dev[unit].pdev.id = unit; | 655 | ubd_devs[unit].pdev.id = unit; |
646 | ubd_dev[unit].pdev.name = DRIVER_NAME; | 656 | ubd_devs[unit].pdev.name = DRIVER_NAME; |
647 | platform_device_register(&ubd_dev[unit].pdev); | 657 | platform_device_register(&ubd_devs[unit].pdev); |
648 | disk->driverfs_dev = &ubd_dev[unit].pdev.dev; | 658 | disk->driverfs_dev = &ubd_devs[unit].pdev.dev; |
649 | } | 659 | } |
650 | 660 | ||
651 | disk->private_data = &ubd_dev[unit]; | 661 | disk->private_data = &ubd_devs[unit]; |
652 | disk->queue = ubd_queue; | 662 | disk->queue = ubd_queue; |
653 | add_disk(disk); | 663 | add_disk(disk); |
654 | 664 | ||
@@ -660,25 +670,25 @@ static int ubd_new_disk(int major, u64 size, int unit, | |||
660 | 670 | ||
661 | static int ubd_add(int n) | 671 | static int ubd_add(int n) |
662 | { | 672 | { |
663 | struct ubd *dev = &ubd_dev[n]; | 673 | struct ubd *ubd_dev = &ubd_devs[n]; |
664 | int err; | 674 | int err; |
665 | 675 | ||
666 | err = -ENODEV; | 676 | err = -ENODEV; |
667 | if(dev->file == NULL) | 677 | if(ubd_dev->file == NULL) |
668 | goto out; | 678 | goto out; |
669 | 679 | ||
670 | err = ubd_file_size(dev, &dev->size); | 680 | err = ubd_file_size(ubd_dev, &ubd_dev->size); |
671 | if(err < 0) | 681 | if(err < 0) |
672 | goto out; | 682 | goto out; |
673 | 683 | ||
674 | dev->size = ROUND_BLOCK(dev->size); | 684 | ubd_dev->size = ROUND_BLOCK(ubd_dev->size); |
675 | 685 | ||
676 | err = ubd_new_disk(MAJOR_NR, dev->size, n, &ubd_gendisk[n]); | 686 | err = ubd_disk_register(MAJOR_NR, ubd_dev->size, n, &ubd_gendisk[n]); |
677 | if(err) | 687 | if(err) |
678 | goto out; | 688 | goto out; |
679 | 689 | ||
680 | if(fake_major != MAJOR_NR) | 690 | if(fake_major != MAJOR_NR) |
681 | ubd_new_disk(fake_major, dev->size, n, | 691 | ubd_disk_register(fake_major, ubd_dev->size, n, |
682 | &fake_gendisk[n]); | 692 | &fake_gendisk[n]); |
683 | 693 | ||
684 | /* perhaps this should also be under the "if (fake_major)" above */ | 694 | /* perhaps this should also be under the "if (fake_major)" above */ |
@@ -693,32 +703,41 @@ out: | |||
693 | 703 | ||
694 | static int ubd_config(char *str) | 704 | static int ubd_config(char *str) |
695 | { | 705 | { |
696 | int n, err; | 706 | int n, ret; |
697 | 707 | ||
698 | str = kstrdup(str, GFP_KERNEL); | 708 | str = kstrdup(str, GFP_KERNEL); |
699 | if(str == NULL){ | 709 | if (str == NULL) { |
700 | printk(KERN_ERR "ubd_config failed to strdup string\n"); | 710 | printk(KERN_ERR "ubd_config failed to strdup string\n"); |
701 | return(1); | 711 | ret = 1; |
712 | goto out; | ||
702 | } | 713 | } |
703 | err = ubd_setup_common(str, &n); | 714 | ret = ubd_setup_common(str, &n); |
704 | if(err){ | 715 | if (ret) { |
705 | kfree(str); | 716 | ret = -1; |
706 | return(-1); | 717 | goto err_free; |
718 | } | ||
719 | if (n == -1) { | ||
720 | ret = 0; | ||
721 | goto err_free; | ||
707 | } | 722 | } |
708 | if(n == -1) return(0); | ||
709 | 723 | ||
710 | spin_lock(&ubd_lock); | 724 | mutex_lock(&ubd_lock); |
711 | err = ubd_add(n); | 725 | ret = ubd_add(n); |
712 | if(err) | 726 | if (ret) |
713 | ubd_dev[n].file = NULL; | 727 | ubd_devs[n].file = NULL; |
714 | spin_unlock(&ubd_lock); | 728 | mutex_unlock(&ubd_lock); |
715 | 729 | ||
716 | return(err); | 730 | out: |
731 | return ret; | ||
732 | |||
733 | err_free: | ||
734 | kfree(str); | ||
735 | goto out; | ||
717 | } | 736 | } |
718 | 737 | ||
719 | static int ubd_get_config(char *name, char *str, int size, char **error_out) | 738 | static int ubd_get_config(char *name, char *str, int size, char **error_out) |
720 | { | 739 | { |
721 | struct ubd *dev; | 740 | struct ubd *ubd_dev; |
722 | int n, len = 0; | 741 | int n, len = 0; |
723 | 742 | ||
724 | n = parse_unit(&name); | 743 | n = parse_unit(&name); |
@@ -727,24 +746,24 @@ static int ubd_get_config(char *name, char *str, int size, char **error_out) | |||
727 | return(-1); | 746 | return(-1); |
728 | } | 747 | } |
729 | 748 | ||
730 | dev = &ubd_dev[n]; | 749 | ubd_dev = &ubd_devs[n]; |
731 | spin_lock(&ubd_lock); | 750 | mutex_lock(&ubd_lock); |
732 | 751 | ||
733 | if(dev->file == NULL){ | 752 | if(ubd_dev->file == NULL){ |
734 | CONFIG_CHUNK(str, size, len, "", 1); | 753 | CONFIG_CHUNK(str, size, len, "", 1); |
735 | goto out; | 754 | goto out; |
736 | } | 755 | } |
737 | 756 | ||
738 | CONFIG_CHUNK(str, size, len, dev->file, 0); | 757 | CONFIG_CHUNK(str, size, len, ubd_dev->file, 0); |
739 | 758 | ||
740 | if(dev->cow.file != NULL){ | 759 | if(ubd_dev->cow.file != NULL){ |
741 | CONFIG_CHUNK(str, size, len, ",", 0); | 760 | CONFIG_CHUNK(str, size, len, ",", 0); |
742 | CONFIG_CHUNK(str, size, len, dev->cow.file, 1); | 761 | CONFIG_CHUNK(str, size, len, ubd_dev->cow.file, 1); |
743 | } | 762 | } |
744 | else CONFIG_CHUNK(str, size, len, "", 1); | 763 | else CONFIG_CHUNK(str, size, len, "", 1); |
745 | 764 | ||
746 | out: | 765 | out: |
747 | spin_unlock(&ubd_lock); | 766 | mutex_unlock(&ubd_lock); |
748 | return(len); | 767 | return(len); |
749 | } | 768 | } |
750 | 769 | ||
@@ -760,22 +779,22 @@ static int ubd_id(char **str, int *start_out, int *end_out) | |||
760 | 779 | ||
761 | static int ubd_remove(int n) | 780 | static int ubd_remove(int n) |
762 | { | 781 | { |
763 | struct ubd *dev; | 782 | struct ubd *ubd_dev; |
764 | int err = -ENODEV; | 783 | int err = -ENODEV; |
765 | 784 | ||
766 | spin_lock(&ubd_lock); | 785 | mutex_lock(&ubd_lock); |
767 | 786 | ||
768 | if(ubd_gendisk[n] == NULL) | 787 | if(ubd_gendisk[n] == NULL) |
769 | goto out; | 788 | goto out; |
770 | 789 | ||
771 | dev = &ubd_dev[n]; | 790 | ubd_dev = &ubd_devs[n]; |
772 | 791 | ||
773 | if(dev->file == NULL) | 792 | if(ubd_dev->file == NULL) |
774 | goto out; | 793 | goto out; |
775 | 794 | ||
776 | /* you cannot remove a open disk */ | 795 | /* you cannot remove a open disk */ |
777 | err = -EBUSY; | 796 | err = -EBUSY; |
778 | if(dev->count > 0) | 797 | if(ubd_dev->count > 0) |
779 | goto out; | 798 | goto out; |
780 | 799 | ||
781 | del_gendisk(ubd_gendisk[n]); | 800 | del_gendisk(ubd_gendisk[n]); |
@@ -788,14 +807,15 @@ static int ubd_remove(int n) | |||
788 | fake_gendisk[n] = NULL; | 807 | fake_gendisk[n] = NULL; |
789 | } | 808 | } |
790 | 809 | ||
791 | platform_device_unregister(&dev->pdev); | 810 | platform_device_unregister(&ubd_dev->pdev); |
792 | *dev = ((struct ubd) DEFAULT_UBD); | 811 | *ubd_dev = ((struct ubd) DEFAULT_UBD); |
793 | err = 0; | 812 | err = 0; |
794 | out: | 813 | out: |
795 | spin_unlock(&ubd_lock); | 814 | mutex_unlock(&ubd_lock); |
796 | return err; | 815 | return err; |
797 | } | 816 | } |
798 | 817 | ||
818 | /* All these are called by mconsole in process context and without ubd-specific locks. */ | ||
799 | static struct mc_device ubd_mc = { | 819 | static struct mc_device ubd_mc = { |
800 | .name = "ubd", | 820 | .name = "ubd", |
801 | .config = ubd_config, | 821 | .config = ubd_config, |
@@ -804,7 +824,7 @@ static struct mc_device ubd_mc = { | |||
804 | .remove = ubd_remove, | 824 | .remove = ubd_remove, |
805 | }; | 825 | }; |
806 | 826 | ||
807 | static int ubd_mc_init(void) | 827 | static int __init ubd_mc_init(void) |
808 | { | 828 | { |
809 | mconsole_register_dev(&ubd_mc); | 829 | mconsole_register_dev(&ubd_mc); |
810 | return 0; | 830 | return 0; |
@@ -812,13 +832,24 @@ static int ubd_mc_init(void) | |||
812 | 832 | ||
813 | __initcall(ubd_mc_init); | 833 | __initcall(ubd_mc_init); |
814 | 834 | ||
835 | static int __init ubd0_init(void) | ||
836 | { | ||
837 | struct ubd *ubd_dev = &ubd_devs[0]; | ||
838 | |||
839 | if(ubd_dev->file == NULL) | ||
840 | ubd_dev->file = "root_fs"; | ||
841 | return(0); | ||
842 | } | ||
843 | |||
844 | __initcall(ubd0_init); | ||
845 | |||
815 | static struct platform_driver ubd_driver = { | 846 | static struct platform_driver ubd_driver = { |
816 | .driver = { | 847 | .driver = { |
817 | .name = DRIVER_NAME, | 848 | .name = DRIVER_NAME, |
818 | }, | 849 | }, |
819 | }; | 850 | }; |
820 | 851 | ||
821 | int ubd_init(void) | 852 | static int __init ubd_init(void) |
822 | { | 853 | { |
823 | int i; | 854 | int i; |
824 | 855 | ||
@@ -846,7 +877,7 @@ int ubd_init(void) | |||
846 | 877 | ||
847 | late_initcall(ubd_init); | 878 | late_initcall(ubd_init); |
848 | 879 | ||
849 | int ubd_driver_init(void){ | 880 | static int __init ubd_driver_init(void){ |
850 | unsigned long stack; | 881 | unsigned long stack; |
851 | int err; | 882 | int err; |
852 | 883 | ||
@@ -867,7 +898,7 @@ int ubd_driver_init(void){ | |||
867 | return(0); | 898 | return(0); |
868 | } | 899 | } |
869 | err = um_request_irq(UBD_IRQ, thread_fd, IRQ_READ, ubd_intr, | 900 | err = um_request_irq(UBD_IRQ, thread_fd, IRQ_READ, ubd_intr, |
870 | IRQF_DISABLED, "ubd", ubd_dev); | 901 | IRQF_DISABLED, "ubd", ubd_devs); |
871 | if(err != 0) | 902 | if(err != 0) |
872 | printk(KERN_ERR "um_request_irq failed - errno = %d\n", -err); | 903 | printk(KERN_ERR "um_request_irq failed - errno = %d\n", -err); |
873 | return 0; | 904 | return 0; |
@@ -878,24 +909,24 @@ device_initcall(ubd_driver_init); | |||
878 | static int ubd_open(struct inode *inode, struct file *filp) | 909 | static int ubd_open(struct inode *inode, struct file *filp) |
879 | { | 910 | { |
880 | struct gendisk *disk = inode->i_bdev->bd_disk; | 911 | struct gendisk *disk = inode->i_bdev->bd_disk; |
881 | struct ubd *dev = disk->private_data; | 912 | struct ubd *ubd_dev = disk->private_data; |
882 | int err = 0; | 913 | int err = 0; |
883 | 914 | ||
884 | if(dev->count == 0){ | 915 | if(ubd_dev->count == 0){ |
885 | err = ubd_open_dev(dev); | 916 | err = ubd_open_dev(ubd_dev); |
886 | if(err){ | 917 | if(err){ |
887 | printk(KERN_ERR "%s: Can't open \"%s\": errno = %d\n", | 918 | printk(KERN_ERR "%s: Can't open \"%s\": errno = %d\n", |
888 | disk->disk_name, dev->file, -err); | 919 | disk->disk_name, ubd_dev->file, -err); |
889 | goto out; | 920 | goto out; |
890 | } | 921 | } |
891 | } | 922 | } |
892 | dev->count++; | 923 | ubd_dev->count++; |
893 | set_disk_ro(disk, !dev->openflags.w); | 924 | set_disk_ro(disk, !ubd_dev->openflags.w); |
894 | 925 | ||
895 | /* This should no more be needed. And it didn't work anyway to exclude | 926 | /* This should no more be needed. And it didn't work anyway to exclude |
896 | * read-write remounting of filesystems.*/ | 927 | * read-write remounting of filesystems.*/ |
897 | /*if((filp->f_mode & FMODE_WRITE) && !dev->openflags.w){ | 928 | /*if((filp->f_mode & FMODE_WRITE) && !ubd_dev->openflags.w){ |
898 | if(--dev->count == 0) ubd_close(dev); | 929 | if(--ubd_dev->count == 0) ubd_close_dev(ubd_dev); |
899 | err = -EROFS; | 930 | err = -EROFS; |
900 | }*/ | 931 | }*/ |
901 | out: | 932 | out: |
@@ -905,10 +936,10 @@ static int ubd_open(struct inode *inode, struct file *filp) | |||
905 | static int ubd_release(struct inode * inode, struct file * file) | 936 | static int ubd_release(struct inode * inode, struct file * file) |
906 | { | 937 | { |
907 | struct gendisk *disk = inode->i_bdev->bd_disk; | 938 | struct gendisk *disk = inode->i_bdev->bd_disk; |
908 | struct ubd *dev = disk->private_data; | 939 | struct ubd *ubd_dev = disk->private_data; |
909 | 940 | ||
910 | if(--dev->count == 0) | 941 | if(--ubd_dev->count == 0) |
911 | ubd_close(dev); | 942 | ubd_close_dev(ubd_dev); |
912 | return(0); | 943 | return(0); |
913 | } | 944 | } |
914 | 945 | ||
@@ -976,12 +1007,12 @@ static void cowify_req(struct io_thread_req *req, unsigned long *bitmap, | |||
976 | static int prepare_request(struct request *req, struct io_thread_req *io_req) | 1007 | static int prepare_request(struct request *req, struct io_thread_req *io_req) |
977 | { | 1008 | { |
978 | struct gendisk *disk = req->rq_disk; | 1009 | struct gendisk *disk = req->rq_disk; |
979 | struct ubd *dev = disk->private_data; | 1010 | struct ubd *ubd_dev = disk->private_data; |
980 | __u64 offset; | 1011 | __u64 offset; |
981 | int len; | 1012 | int len; |
982 | 1013 | ||
983 | /* This should be impossible now */ | 1014 | /* This should be impossible now */ |
984 | if((rq_data_dir(req) == WRITE) && !dev->openflags.w){ | 1015 | if((rq_data_dir(req) == WRITE) && !ubd_dev->openflags.w){ |
985 | printk("Write attempted on readonly ubd device %s\n", | 1016 | printk("Write attempted on readonly ubd device %s\n", |
986 | disk->disk_name); | 1017 | disk->disk_name); |
987 | end_request(req, 0); | 1018 | end_request(req, 0); |
@@ -991,8 +1022,8 @@ static int prepare_request(struct request *req, struct io_thread_req *io_req) | |||
991 | offset = ((__u64) req->sector) << 9; | 1022 | offset = ((__u64) req->sector) << 9; |
992 | len = req->current_nr_sectors << 9; | 1023 | len = req->current_nr_sectors << 9; |
993 | 1024 | ||
994 | io_req->fds[0] = (dev->cow.file != NULL) ? dev->cow.fd : dev->fd; | 1025 | io_req->fds[0] = (ubd_dev->cow.file != NULL) ? ubd_dev->cow.fd : ubd_dev->fd; |
995 | io_req->fds[1] = dev->fd; | 1026 | io_req->fds[1] = ubd_dev->fd; |
996 | io_req->cow_offset = -1; | 1027 | io_req->cow_offset = -1; |
997 | io_req->offset = offset; | 1028 | io_req->offset = offset; |
998 | io_req->length = len; | 1029 | io_req->length = len; |
@@ -1001,13 +1032,13 @@ static int prepare_request(struct request *req, struct io_thread_req *io_req) | |||
1001 | 1032 | ||
1002 | io_req->op = (rq_data_dir(req) == READ) ? UBD_READ : UBD_WRITE; | 1033 | io_req->op = (rq_data_dir(req) == READ) ? UBD_READ : UBD_WRITE; |
1003 | io_req->offsets[0] = 0; | 1034 | io_req->offsets[0] = 0; |
1004 | io_req->offsets[1] = dev->cow.data_offset; | 1035 | io_req->offsets[1] = ubd_dev->cow.data_offset; |
1005 | io_req->buffer = req->buffer; | 1036 | io_req->buffer = req->buffer; |
1006 | io_req->sectorsize = 1 << 9; | 1037 | io_req->sectorsize = 1 << 9; |
1007 | 1038 | ||
1008 | if(dev->cow.file != NULL) | 1039 | if(ubd_dev->cow.file != NULL) |
1009 | cowify_req(io_req, dev->cow.bitmap, dev->cow.bitmap_offset, | 1040 | cowify_req(io_req, ubd_dev->cow.bitmap, ubd_dev->cow.bitmap_offset, |
1010 | dev->cow.bitmap_len); | 1041 | ubd_dev->cow.bitmap_len); |
1011 | 1042 | ||
1012 | return(0); | 1043 | return(0); |
1013 | } | 1044 | } |
@@ -1033,7 +1064,7 @@ static void do_ubd_request(request_queue_t *q) | |||
1033 | return; | 1064 | return; |
1034 | err = prepare_request(req, &io_req); | 1065 | err = prepare_request(req, &io_req); |
1035 | if(!err){ | 1066 | if(!err){ |
1036 | do_ubd = ubd_handler; | 1067 | do_ubd = 1; |
1037 | n = os_write_file(thread_fd, (char *) &io_req, | 1068 | n = os_write_file(thread_fd, (char *) &io_req, |
1038 | sizeof(io_req)); | 1069 | sizeof(io_req)); |
1039 | if(n != sizeof(io_req)) | 1070 | if(n != sizeof(io_req)) |
@@ -1045,18 +1076,18 @@ static void do_ubd_request(request_queue_t *q) | |||
1045 | 1076 | ||
1046 | static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | 1077 | static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo) |
1047 | { | 1078 | { |
1048 | struct ubd *dev = bdev->bd_disk->private_data; | 1079 | struct ubd *ubd_dev = bdev->bd_disk->private_data; |
1049 | 1080 | ||
1050 | geo->heads = 128; | 1081 | geo->heads = 128; |
1051 | geo->sectors = 32; | 1082 | geo->sectors = 32; |
1052 | geo->cylinders = dev->size / (128 * 32 * 512); | 1083 | geo->cylinders = ubd_dev->size / (128 * 32 * 512); |
1053 | return 0; | 1084 | return 0; |
1054 | } | 1085 | } |
1055 | 1086 | ||
1056 | static int ubd_ioctl(struct inode * inode, struct file * file, | 1087 | static int ubd_ioctl(struct inode * inode, struct file * file, |
1057 | unsigned int cmd, unsigned long arg) | 1088 | unsigned int cmd, unsigned long arg) |
1058 | { | 1089 | { |
1059 | struct ubd *dev = inode->i_bdev->bd_disk->private_data; | 1090 | struct ubd *ubd_dev = inode->i_bdev->bd_disk->private_data; |
1060 | struct hd_driveid ubd_id = { | 1091 | struct hd_driveid ubd_id = { |
1061 | .cyls = 0, | 1092 | .cyls = 0, |
1062 | .heads = 128, | 1093 | .heads = 128, |
@@ -1066,7 +1097,7 @@ static int ubd_ioctl(struct inode * inode, struct file * file, | |||
1066 | switch (cmd) { | 1097 | switch (cmd) { |
1067 | struct cdrom_volctrl volume; | 1098 | struct cdrom_volctrl volume; |
1068 | case HDIO_GET_IDENTITY: | 1099 | case HDIO_GET_IDENTITY: |
1069 | ubd_id.cyls = dev->size / (128 * 32 * 512); | 1100 | ubd_id.cyls = ubd_dev->size / (128 * 32 * 512); |
1070 | if(copy_to_user((char __user *) arg, (char *) &ubd_id, | 1101 | if(copy_to_user((char __user *) arg, (char *) &ubd_id, |
1071 | sizeof(ubd_id))) | 1102 | sizeof(ubd_id))) |
1072 | return(-EFAULT); | 1103 | return(-EFAULT); |
@@ -1353,8 +1384,8 @@ void do_io(struct io_thread_req *req) | |||
1353 | */ | 1384 | */ |
1354 | int kernel_fd = -1; | 1385 | int kernel_fd = -1; |
1355 | 1386 | ||
1356 | /* Only changed by the io thread */ | 1387 | /* Only changed by the io thread. XXX: currently unused. */ |
1357 | int io_count = 0; | 1388 | static int io_count = 0; |
1358 | 1389 | ||
1359 | int io_thread(void *arg) | 1390 | int io_thread(void *arg) |
1360 | { | 1391 | { |
diff --git a/arch/um/include/mconsole.h b/arch/um/include/mconsole.h index 58f67d391105..2666815b6af5 100644 --- a/arch/um/include/mconsole.h +++ b/arch/um/include/mconsole.h | |||
@@ -61,6 +61,7 @@ struct mc_request | |||
61 | 61 | ||
62 | struct mconsole_request request; | 62 | struct mconsole_request request; |
63 | struct mconsole_command *cmd; | 63 | struct mconsole_command *cmd; |
64 | union uml_pt_regs regs; | ||
64 | }; | 65 | }; |
65 | 66 | ||
66 | extern char mconsole_socket_name[]; | 67 | extern char mconsole_socket_name[]; |
diff --git a/arch/um/include/mconsole_kern.h b/arch/um/include/mconsole_kern.h index d0b690197fd7..1ea6d928e1cd 100644 --- a/arch/um/include/mconsole_kern.h +++ b/arch/um/include/mconsole_kern.h | |||
@@ -14,6 +14,7 @@ struct mconsole_entry { | |||
14 | struct mc_request request; | 14 | struct mc_request request; |
15 | }; | 15 | }; |
16 | 16 | ||
17 | /* All these methods are called in process context. */ | ||
17 | struct mc_device { | 18 | struct mc_device { |
18 | struct list_head list; | 19 | struct list_head list; |
19 | char *name; | 20 | char *name; |
diff --git a/arch/um/include/os.h b/arch/um/include/os.h index 6516f6dca96d..13a86bd383d3 100644 --- a/arch/um/include/os.h +++ b/arch/um/include/os.h | |||
@@ -233,6 +233,8 @@ extern unsigned long __do_user_copy(void *to, const void *from, int n, | |||
233 | void (*op)(void *to, const void *from, | 233 | void (*op)(void *to, const void *from, |
234 | int n), int *faulted_out); | 234 | int n), int *faulted_out); |
235 | 235 | ||
236 | /* execvp.c */ | ||
237 | extern int execvp_noalloc(char *buf, const char *file, char *const argv[]); | ||
236 | /* helper.c */ | 238 | /* helper.c */ |
237 | extern int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv, | 239 | extern int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv, |
238 | unsigned long *stack_out); | 240 | unsigned long *stack_out); |
diff --git a/arch/um/include/sysdep-i386/barrier.h b/arch/um/include/sysdep-i386/barrier.h new file mode 100644 index 000000000000..b58d52c5b2f4 --- /dev/null +++ b/arch/um/include/sysdep-i386/barrier.h | |||
@@ -0,0 +1,9 @@ | |||
1 | #ifndef __SYSDEP_I386_BARRIER_H | ||
2 | #define __SYSDEP_I386_BARRIER_H | ||
3 | |||
4 | /* Copied from include/asm-i386 for use by userspace. i386 has the option | ||
5 | * of using mfence, but I'm just using this, which works everywhere, for now. | ||
6 | */ | ||
7 | #define mb() asm volatile("lock; addl $0,0(%esp)") | ||
8 | |||
9 | #endif | ||
diff --git a/arch/um/include/sysdep-x86_64/barrier.h b/arch/um/include/sysdep-x86_64/barrier.h new file mode 100644 index 000000000000..7b610befdc8f --- /dev/null +++ b/arch/um/include/sysdep-x86_64/barrier.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef __SYSDEP_X86_64_BARRIER_H | ||
2 | #define __SYSDEP_X86_64_BARRIER_H | ||
3 | |||
4 | /* Copied from include/asm-x86_64 for use by userspace. */ | ||
5 | #define mb() asm volatile("mfence":::"memory") | ||
6 | |||
7 | #endif | ||
diff --git a/arch/um/kernel/dyn.lds.S b/arch/um/kernel/dyn.lds.S index 68ed24df5c8f..e36f92b463ce 100644 --- a/arch/um/kernel/dyn.lds.S +++ b/arch/um/kernel/dyn.lds.S | |||
@@ -14,6 +14,7 @@ SECTIONS | |||
14 | * is remapped.*/ | 14 | * is remapped.*/ |
15 | __binary_start = .; | 15 | __binary_start = .; |
16 | . = ALIGN(4096); /* Init code and data */ | 16 | . = ALIGN(4096); /* Init code and data */ |
17 | _text = .; | ||
17 | _stext = .; | 18 | _stext = .; |
18 | __init_begin = .; | 19 | __init_begin = .; |
19 | .init.text : { | 20 | .init.text : { |
diff --git a/arch/um/kernel/tt/tracer.c b/arch/um/kernel/tt/tracer.c index 9882342206ec..b9195355075a 100644 --- a/arch/um/kernel/tt/tracer.c +++ b/arch/um/kernel/tt/tracer.c | |||
@@ -176,7 +176,6 @@ struct { | |||
176 | int signal_index[32]; | 176 | int signal_index[32]; |
177 | int nsignals = 0; | 177 | int nsignals = 0; |
178 | int debug_trace = 0; | 178 | int debug_trace = 0; |
179 | extern int io_nsignals, io_count, intr_count; | ||
180 | 179 | ||
181 | extern void signal_usr1(int sig); | 180 | extern void signal_usr1(int sig); |
182 | 181 | ||
diff --git a/arch/um/kernel/uml.lds.S b/arch/um/kernel/uml.lds.S index 8eca47a6ff08..f6301274cf3c 100644 --- a/arch/um/kernel/uml.lds.S +++ b/arch/um/kernel/uml.lds.S | |||
@@ -25,6 +25,7 @@ SECTIONS | |||
25 | . = ALIGN(4096); /* Init code and data */ | 25 | . = ALIGN(4096); /* Init code and data */ |
26 | #endif | 26 | #endif |
27 | 27 | ||
28 | _text = .; | ||
28 | _stext = .; | 29 | _stext = .; |
29 | __init_begin = .; | 30 | __init_begin = .; |
30 | .init.text : { | 31 | .init.text : { |
diff --git a/arch/um/os-Linux/Makefile b/arch/um/os-Linux/Makefile index b4183929b32c..2f8c79464015 100644 --- a/arch/um/os-Linux/Makefile +++ b/arch/um/os-Linux/Makefile | |||
@@ -3,8 +3,8 @@ | |||
3 | # Licensed under the GPL | 3 | # Licensed under the GPL |
4 | # | 4 | # |
5 | 5 | ||
6 | obj-y = aio.o elf_aux.o file.o helper.o irq.o main.o mem.o process.o sigio.o \ | 6 | obj-y = aio.o elf_aux.o execvp.o file.o helper.o irq.o main.o mem.o process.o \ |
7 | signal.o start_up.o time.o trap.o tty.o uaccess.o umid.o tls.o \ | 7 | sigio.o signal.o start_up.o time.o trap.o tty.o uaccess.o umid.o tls.o \ |
8 | user_syms.o util.o drivers/ sys-$(SUBARCH)/ | 8 | user_syms.o util.o drivers/ sys-$(SUBARCH)/ |
9 | 9 | ||
10 | obj-$(CONFIG_MODE_SKAS) += skas/ | 10 | obj-$(CONFIG_MODE_SKAS) += skas/ |
@@ -15,9 +15,9 @@ user-objs-$(CONFIG_MODE_TT) += tt.o | |||
15 | obj-$(CONFIG_TTY_LOG) += tty_log.o | 15 | obj-$(CONFIG_TTY_LOG) += tty_log.o |
16 | user-objs-$(CONFIG_TTY_LOG) += tty_log.o | 16 | user-objs-$(CONFIG_TTY_LOG) += tty_log.o |
17 | 17 | ||
18 | USER_OBJS := $(user-objs-y) aio.o elf_aux.o file.o helper.o irq.o main.o mem.o \ | 18 | USER_OBJS := $(user-objs-y) aio.o elf_aux.o execvp.o file.o helper.o irq.o \ |
19 | process.o sigio.o signal.o start_up.o time.o trap.o tty.o tls.o \ | 19 | main.o mem.o process.o sigio.o signal.o start_up.o time.o trap.o tty.o \ |
20 | uaccess.o umid.o util.o | 20 | tls.o uaccess.o umid.o util.o |
21 | 21 | ||
22 | CFLAGS_user_syms.o += -DSUBARCH_$(SUBARCH) | 22 | CFLAGS_user_syms.o += -DSUBARCH_$(SUBARCH) |
23 | 23 | ||
diff --git a/arch/um/os-Linux/execvp.c b/arch/um/os-Linux/execvp.c new file mode 100644 index 000000000000..66e583a4031b --- /dev/null +++ b/arch/um/os-Linux/execvp.c | |||
@@ -0,0 +1,149 @@ | |||
1 | /* Copyright (C) 2006 by Paolo Giarrusso - modified from glibc' execvp.c. | ||
2 | Original copyright notice follows: | ||
3 | |||
4 | Copyright (C) 1991,92,1995-99,2002,2004 Free Software Foundation, Inc. | ||
5 | This file is part of the GNU C Library. | ||
6 | |||
7 | The GNU C Library is free software; you can redistribute it and/or | ||
8 | modify it under the terms of the GNU Lesser General Public | ||
9 | License as published by the Free Software Foundation; either | ||
10 | version 2.1 of the License, or (at your option) any later version. | ||
11 | |||
12 | The GNU C Library is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | Lesser General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU Lesser General Public | ||
18 | License along with the GNU C Library; if not, write to the Free | ||
19 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
20 | 02111-1307 USA. */ | ||
21 | #include <unistd.h> | ||
22 | |||
23 | #include <stdbool.h> | ||
24 | #include <stdlib.h> | ||
25 | #include <string.h> | ||
26 | #include <errno.h> | ||
27 | #include <limits.h> | ||
28 | |||
29 | #ifndef TEST | ||
30 | #include "um_malloc.h" | ||
31 | #else | ||
32 | #include <stdio.h> | ||
33 | #define um_kmalloc malloc | ||
34 | #endif | ||
35 | #include "os.h" | ||
36 | |||
37 | /* Execute FILE, searching in the `PATH' environment variable if it contains | ||
38 | no slashes, with arguments ARGV and environment from `environ'. */ | ||
39 | int execvp_noalloc(char *buf, const char *file, char *const argv[]) | ||
40 | { | ||
41 | if (*file == '\0') { | ||
42 | return -ENOENT; | ||
43 | } | ||
44 | |||
45 | if (strchr (file, '/') != NULL) { | ||
46 | /* Don't search when it contains a slash. */ | ||
47 | execv(file, argv); | ||
48 | } else { | ||
49 | int got_eacces; | ||
50 | size_t len, pathlen; | ||
51 | char *name, *p; | ||
52 | char *path = getenv("PATH"); | ||
53 | if (path == NULL) | ||
54 | path = ":/bin:/usr/bin"; | ||
55 | |||
56 | len = strlen(file) + 1; | ||
57 | pathlen = strlen(path); | ||
58 | /* Copy the file name at the top. */ | ||
59 | name = memcpy(buf + pathlen + 1, file, len); | ||
60 | /* And add the slash. */ | ||
61 | *--name = '/'; | ||
62 | |||
63 | got_eacces = 0; | ||
64 | p = path; | ||
65 | do { | ||
66 | char *startp; | ||
67 | |||
68 | path = p; | ||
69 | //Let's avoid this GNU extension. | ||
70 | //p = strchrnul (path, ':'); | ||
71 | p = strchr(path, ':'); | ||
72 | if (!p) | ||
73 | p = strchr(path, '\0'); | ||
74 | |||
75 | if (p == path) | ||
76 | /* Two adjacent colons, or a colon at the beginning or the end | ||
77 | of `PATH' means to search the current directory. */ | ||
78 | startp = name + 1; | ||
79 | else | ||
80 | startp = memcpy(name - (p - path), path, p - path); | ||
81 | |||
82 | /* Try to execute this name. If it works, execv will not return. */ | ||
83 | execv(startp, argv); | ||
84 | |||
85 | /* | ||
86 | if (errno == ENOEXEC) { | ||
87 | } | ||
88 | */ | ||
89 | |||
90 | switch (errno) { | ||
91 | case EACCES: | ||
92 | /* Record the we got a `Permission denied' error. If we end | ||
93 | up finding no executable we can use, we want to diagnose | ||
94 | that we did find one but were denied access. */ | ||
95 | got_eacces = 1; | ||
96 | case ENOENT: | ||
97 | case ESTALE: | ||
98 | case ENOTDIR: | ||
99 | /* Those errors indicate the file is missing or not executable | ||
100 | by us, in which case we want to just try the next path | ||
101 | directory. */ | ||
102 | case ENODEV: | ||
103 | case ETIMEDOUT: | ||
104 | /* Some strange filesystems like AFS return even | ||
105 | stranger error numbers. They cannot reasonably mean | ||
106 | anything else so ignore those, too. */ | ||
107 | case ENOEXEC: | ||
108 | /* We won't go searching for the shell | ||
109 | * if it is not executable - the Linux | ||
110 | * kernel already handles this enough, | ||
111 | * for us. */ | ||
112 | break; | ||
113 | |||
114 | default: | ||
115 | /* Some other error means we found an executable file, but | ||
116 | something went wrong executing it; return the error to our | ||
117 | caller. */ | ||
118 | return -errno; | ||
119 | } | ||
120 | } while (*p++ != '\0'); | ||
121 | |||
122 | /* We tried every element and none of them worked. */ | ||
123 | if (got_eacces) | ||
124 | /* At least one failure was due to permissions, so report that | ||
125 | error. */ | ||
126 | return -EACCES; | ||
127 | } | ||
128 | |||
129 | /* Return the error from the last attempt (probably ENOENT). */ | ||
130 | return -errno; | ||
131 | } | ||
132 | #ifdef TEST | ||
133 | int main(int argc, char**argv) | ||
134 | { | ||
135 | char buf[PATH_MAX]; | ||
136 | int ret; | ||
137 | argc--; | ||
138 | if (!argc) { | ||
139 | fprintf(stderr, "Not enough arguments\n"); | ||
140 | return 1; | ||
141 | } | ||
142 | argv++; | ||
143 | if (ret = execvp_noalloc(buf, argv[0], argv)) { | ||
144 | errno = -ret; | ||
145 | perror("execvp_noalloc"); | ||
146 | } | ||
147 | return 0; | ||
148 | } | ||
149 | #endif | ||
diff --git a/arch/um/os-Linux/helper.c b/arch/um/os-Linux/helper.c index d13299cfa318..c7ad6306e22f 100644 --- a/arch/um/os-Linux/helper.c +++ b/arch/um/os-Linux/helper.c | |||
@@ -8,18 +8,21 @@ | |||
8 | #include <unistd.h> | 8 | #include <unistd.h> |
9 | #include <errno.h> | 9 | #include <errno.h> |
10 | #include <sched.h> | 10 | #include <sched.h> |
11 | #include <limits.h> | ||
11 | #include <sys/signal.h> | 12 | #include <sys/signal.h> |
12 | #include <sys/wait.h> | 13 | #include <sys/wait.h> |
13 | #include "user.h" | 14 | #include "user.h" |
14 | #include "kern_util.h" | 15 | #include "kern_util.h" |
15 | #include "user_util.h" | 16 | #include "user_util.h" |
16 | #include "os.h" | 17 | #include "os.h" |
18 | #include "um_malloc.h" | ||
17 | 19 | ||
18 | struct helper_data { | 20 | struct helper_data { |
19 | void (*pre_exec)(void*); | 21 | void (*pre_exec)(void*); |
20 | void *pre_data; | 22 | void *pre_data; |
21 | char **argv; | 23 | char **argv; |
22 | int fd; | 24 | int fd; |
25 | char *buf; | ||
23 | }; | 26 | }; |
24 | 27 | ||
25 | /* Debugging aid, changed only from gdb */ | 28 | /* Debugging aid, changed only from gdb */ |
@@ -41,9 +44,8 @@ static int helper_child(void *arg) | |||
41 | } | 44 | } |
42 | if (data->pre_exec != NULL) | 45 | if (data->pre_exec != NULL) |
43 | (*data->pre_exec)(data->pre_data); | 46 | (*data->pre_exec)(data->pre_data); |
44 | execvp(argv[0], argv); | 47 | errval = execvp_noalloc(data->buf, argv[0], argv); |
45 | errval = -errno; | 48 | printk("helper_child - execvp of '%s' failed - errno = %d\n", argv[0], -errval); |
46 | printk("helper_child - execve of '%s' failed - errno = %d\n", argv[0], errno); | ||
47 | os_write_file(data->fd, &errval, sizeof(errval)); | 49 | os_write_file(data->fd, &errval, sizeof(errval)); |
48 | kill(os_getpid(), SIGKILL); | 50 | kill(os_getpid(), SIGKILL); |
49 | return 0; | 51 | return 0; |
@@ -84,11 +86,13 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv, | |||
84 | data.pre_data = pre_data; | 86 | data.pre_data = pre_data; |
85 | data.argv = argv; | 87 | data.argv = argv; |
86 | data.fd = fds[1]; | 88 | data.fd = fds[1]; |
89 | data.buf = __cant_sleep() ? um_kmalloc_atomic(PATH_MAX) : | ||
90 | um_kmalloc(PATH_MAX); | ||
87 | pid = clone(helper_child, (void *) sp, CLONE_VM | SIGCHLD, &data); | 91 | pid = clone(helper_child, (void *) sp, CLONE_VM | SIGCHLD, &data); |
88 | if (pid < 0) { | 92 | if (pid < 0) { |
89 | ret = -errno; | 93 | ret = -errno; |
90 | printk("run_helper : clone failed, errno = %d\n", errno); | 94 | printk("run_helper : clone failed, errno = %d\n", errno); |
91 | goto out_close; | 95 | goto out_free2; |
92 | } | 96 | } |
93 | 97 | ||
94 | close(fds[1]); | 98 | close(fds[1]); |
@@ -109,6 +113,8 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv, | |||
109 | CATCH_EINTR(waitpid(pid, NULL, 0)); | 113 | CATCH_EINTR(waitpid(pid, NULL, 0)); |
110 | } | 114 | } |
111 | 115 | ||
116 | out_free2: | ||
117 | kfree(data.buf); | ||
112 | out_close: | 118 | out_close: |
113 | if (fds[1] != -1) | 119 | if (fds[1] != -1) |
114 | close(fds[1]); | 120 | close(fds[1]); |
diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index 51f0893640a6..c692a192957a 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c | |||
@@ -7,7 +7,6 @@ | |||
7 | #include <stdio.h> | 7 | #include <stdio.h> |
8 | #include <errno.h> | 8 | #include <errno.h> |
9 | #include <signal.h> | 9 | #include <signal.h> |
10 | #include <linux/unistd.h> | ||
11 | #include <sys/mman.h> | 10 | #include <sys/mman.h> |
12 | #include <sys/wait.h> | 11 | #include <sys/wait.h> |
13 | #include <sys/mman.h> | 12 | #include <sys/mman.h> |
diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c index 6b81739279d1..b897e8592d77 100644 --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include "user.h" | 15 | #include "user.h" |
16 | #include "signal_kern.h" | 16 | #include "signal_kern.h" |
17 | #include "sysdep/sigcontext.h" | 17 | #include "sysdep/sigcontext.h" |
18 | #include "sysdep/barrier.h" | ||
18 | #include "sigcontext.h" | 19 | #include "sigcontext.h" |
19 | #include "mode.h" | 20 | #include "mode.h" |
20 | #include "os.h" | 21 | #include "os.h" |
@@ -34,8 +35,12 @@ | |||
34 | #define SIGALRM_BIT 2 | 35 | #define SIGALRM_BIT 2 |
35 | #define SIGALRM_MASK (1 << SIGALRM_BIT) | 36 | #define SIGALRM_MASK (1 << SIGALRM_BIT) |
36 | 37 | ||
37 | static int signals_enabled = 1; | 38 | /* These are used by both the signal handlers and |
38 | static int pending = 0; | 39 | * block/unblock_signals. I don't want modifications cached in a |
40 | * register - they must go straight to memory. | ||
41 | */ | ||
42 | static volatile int signals_enabled = 1; | ||
43 | static volatile int pending = 0; | ||
39 | 44 | ||
40 | void sig_handler(int sig, struct sigcontext *sc) | 45 | void sig_handler(int sig, struct sigcontext *sc) |
41 | { | 46 | { |
@@ -152,6 +157,12 @@ int change_sig(int signal, int on) | |||
152 | void block_signals(void) | 157 | void block_signals(void) |
153 | { | 158 | { |
154 | signals_enabled = 0; | 159 | signals_enabled = 0; |
160 | /* This must return with signals disabled, so this barrier | ||
161 | * ensures that writes are flushed out before the return. | ||
162 | * This might matter if gcc figures out how to inline this and | ||
163 | * decides to shuffle this code into the caller. | ||
164 | */ | ||
165 | mb(); | ||
155 | } | 166 | } |
156 | 167 | ||
157 | void unblock_signals(void) | 168 | void unblock_signals(void) |
@@ -171,9 +182,23 @@ void unblock_signals(void) | |||
171 | */ | 182 | */ |
172 | signals_enabled = 1; | 183 | signals_enabled = 1; |
173 | 184 | ||
185 | /* Setting signals_enabled and reading pending must | ||
186 | * happen in this order. | ||
187 | */ | ||
188 | mb(); | ||
189 | |||
174 | save_pending = pending; | 190 | save_pending = pending; |
175 | if(save_pending == 0) | 191 | if(save_pending == 0){ |
192 | /* This must return with signals enabled, so | ||
193 | * this barrier ensures that writes are | ||
194 | * flushed out before the return. This might | ||
195 | * matter if gcc figures out how to inline | ||
196 | * this (unlikely, given its size) and decides | ||
197 | * to shuffle this code into the caller. | ||
198 | */ | ||
199 | mb(); | ||
176 | return; | 200 | return; |
201 | } | ||
177 | 202 | ||
178 | pending = 0; | 203 | pending = 0; |
179 | 204 | ||
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index cb9ab54146cc..9b34fe65949a 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <sys/mman.h> | 14 | #include <sys/mman.h> |
15 | #include <sys/user.h> | 15 | #include <sys/user.h> |
16 | #include <sys/time.h> | 16 | #include <sys/time.h> |
17 | #include <asm/unistd.h> | 17 | #include <sys/syscall.h> |
18 | #include <asm/types.h> | 18 | #include <asm/types.h> |
19 | #include "user.h" | 19 | #include "user.h" |
20 | #include "sysdep/ptrace.h" | 20 | #include "sysdep/ptrace.h" |
diff --git a/arch/um/os-Linux/sys-i386/tls.c b/arch/um/os-Linux/sys-i386/tls.c index 6e945ab45843..256532034c62 100644 --- a/arch/um/os-Linux/sys-i386/tls.c +++ b/arch/um/os-Linux/sys-i386/tls.c | |||
@@ -1,6 +1,9 @@ | |||
1 | #include <errno.h> | 1 | #include <errno.h> |
2 | #include <linux/unistd.h> | 2 | #include <linux/unistd.h> |
3 | |||
3 | #include <sys/syscall.h> | 4 | #include <sys/syscall.h> |
5 | #include <unistd.h> | ||
6 | |||
4 | #include "sysdep/tls.h" | 7 | #include "sysdep/tls.h" |
5 | #include "user_util.h" | 8 | #include "user_util.h" |
6 | 9 | ||
diff --git a/arch/um/os-Linux/tls.c b/arch/um/os-Linux/tls.c index a2de2580b8af..16215b990804 100644 --- a/arch/um/os-Linux/tls.c +++ b/arch/um/os-Linux/tls.c | |||
@@ -1,4 +1,5 @@ | |||
1 | #include <errno.h> | 1 | #include <errno.h> |
2 | #include <unistd.h> | ||
2 | #include <sys/ptrace.h> | 3 | #include <sys/ptrace.h> |
3 | #include <sys/syscall.h> | 4 | #include <sys/syscall.h> |
4 | #include <asm/ldt.h> | 5 | #include <asm/ldt.h> |
diff --git a/arch/um/sys-i386/unmap.c b/arch/um/sys-i386/unmap.c index 8e55cd5d3d07..1b0ad0e4adcd 100644 --- a/arch/um/sys-i386/unmap.c +++ b/arch/um/sys-i386/unmap.c | |||
@@ -5,17 +5,20 @@ | |||
5 | 5 | ||
6 | #include <linux/mman.h> | 6 | #include <linux/mman.h> |
7 | #include <asm/unistd.h> | 7 | #include <asm/unistd.h> |
8 | #include <sys/syscall.h> | ||
9 | 8 | ||
9 | static int errno; | ||
10 | |||
11 | static inline _syscall2(int,munmap,void *,start,size_t,len) | ||
12 | static inline _syscall6(void *,mmap2,void *,addr,size_t,len,int,prot,int,flags,int,fd,off_t,offset) | ||
10 | int switcheroo(int fd, int prot, void *from, void *to, int size) | 13 | int switcheroo(int fd, int prot, void *from, void *to, int size) |
11 | { | 14 | { |
12 | if (syscall(__NR_munmap, to, size) < 0){ | 15 | if(munmap(to, size) < 0){ |
13 | return(-1); | 16 | return(-1); |
14 | } | 17 | } |
15 | if (syscall(__NR_mmap2, to, size, prot, MAP_SHARED | MAP_FIXED, fd, 0) == (void*) -1 ){ | 18 | if(mmap2(to, size, prot, MAP_SHARED | MAP_FIXED, fd, 0) == (void*) -1 ){ |
16 | return(-1); | 19 | return(-1); |
17 | } | 20 | } |
18 | if (syscall(__NR_munmap, from, size) < 0){ | 21 | if(munmap(from, size) < 0){ |
19 | return(-1); | 22 | return(-1); |
20 | } | 23 | } |
21 | return(0); | 24 | return(0); |
diff --git a/arch/um/sys-x86_64/unmap.c b/arch/um/sys-x86_64/unmap.c index 57c9286a701b..f4a4bffd8a18 100644 --- a/arch/um/sys-x86_64/unmap.c +++ b/arch/um/sys-x86_64/unmap.c | |||
@@ -5,17 +5,20 @@ | |||
5 | 5 | ||
6 | #include <linux/mman.h> | 6 | #include <linux/mman.h> |
7 | #include <asm/unistd.h> | 7 | #include <asm/unistd.h> |
8 | #include <sys/syscall.h> | ||
9 | 8 | ||
9 | static int errno; | ||
10 | |||
11 | static inline _syscall2(int,munmap,void *,start,size_t,len) | ||
12 | static inline _syscall6(void *,mmap,void *,addr,size_t,len,int,prot,int,flags,int,fd,off_t,offset) | ||
10 | int switcheroo(int fd, int prot, void *from, void *to, int size) | 13 | int switcheroo(int fd, int prot, void *from, void *to, int size) |
11 | { | 14 | { |
12 | if (syscall(__NR_munmap, to, size) < 0){ | 15 | if(munmap(to, size) < 0){ |
13 | return(-1); | 16 | return(-1); |
14 | } | 17 | } |
15 | if (syscall(__NR_mmap, to, size, prot, MAP_SHARED | MAP_FIXED, fd, 0) == (void*) -1){ | 18 | if(mmap(to, size, prot, MAP_SHARED | MAP_FIXED, fd, 0) == (void*) -1){ |
16 | return(-1); | 19 | return(-1); |
17 | } | 20 | } |
18 | if (syscall(__NR_munmap, from, size) < 0){ | 21 | if(munmap(from, size) < 0){ |
19 | return(-1); | 22 | return(-1); |
20 | } | 23 | } |
21 | return(0); | 24 | return(0); |
diff --git a/arch/v850/kernel/vmlinux.lds.S b/arch/v850/kernel/vmlinux.lds.S index 63399219cd9f..88d087f527c9 100644 --- a/arch/v850/kernel/vmlinux.lds.S +++ b/arch/v850/kernel/vmlinux.lds.S | |||
@@ -140,13 +140,7 @@ | |||
140 | ___setup_end = . ; \ | 140 | ___setup_end = . ; \ |
141 | ___initcall_start = . ; \ | 141 | ___initcall_start = . ; \ |
142 | *(.initcall.init) \ | 142 | *(.initcall.init) \ |
143 | *(.initcall1.init) \ | 143 | INITCALLS \ |
144 | *(.initcall2.init) \ | ||
145 | *(.initcall3.init) \ | ||
146 | *(.initcall4.init) \ | ||
147 | *(.initcall5.init) \ | ||
148 | *(.initcall6.init) \ | ||
149 | *(.initcall7.init) \ | ||
150 | . = ALIGN (4) ; \ | 144 | . = ALIGN (4) ; \ |
151 | ___initcall_end = . ; \ | 145 | ___initcall_end = . ; \ |
152 | ___con_initcall_start = .; \ | 146 | ___con_initcall_start = .; \ |
diff --git a/arch/x86_64/Makefile b/arch/x86_64/Makefile index 1c0f18d4f887..6e38d4daeed7 100644 --- a/arch/x86_64/Makefile +++ b/arch/x86_64/Makefile | |||
@@ -54,6 +54,10 @@ endif | |||
54 | cflags-y += $(call cc-option,-funit-at-a-time) | 54 | cflags-y += $(call cc-option,-funit-at-a-time) |
55 | # prevent gcc from generating any FP code by mistake | 55 | # prevent gcc from generating any FP code by mistake |
56 | cflags-y += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow,) | 56 | cflags-y += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow,) |
57 | # this works around some issues with generating unwind tables in older gccs | ||
58 | # newer gccs do it by default | ||
59 | cflags-y += -maccumulate-outgoing-args | ||
60 | |||
57 | # do binutils support CFI? | 61 | # do binutils support CFI? |
58 | cflags-y += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,) | 62 | cflags-y += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,) |
59 | AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,) | 63 | AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,) |
@@ -62,8 +66,8 @@ AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,) | |||
62 | cflags-y += $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1,) | 66 | cflags-y += $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1,) |
63 | AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1,) | 67 | AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1,) |
64 | 68 | ||
65 | cflags-$(CONFIG_CC_STACKPROTECTOR) += $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-x86_64-has-stack-protector.sh $(CC) -fstack-protector ) | 69 | cflags-$(CONFIG_CC_STACKPROTECTOR) += $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-x86_64-has-stack-protector.sh "$(CC)" -fstack-protector ) |
66 | cflags-$(CONFIG_CC_STACKPROTECTOR_ALL) += $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-x86_64-has-stack-protector.sh $(CC) -fstack-protector-all ) | 70 | cflags-$(CONFIG_CC_STACKPROTECTOR_ALL) += $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-x86_64-has-stack-protector.sh "$(CC)" -fstack-protector-all ) |
67 | 71 | ||
68 | CFLAGS += $(cflags-y) | 72 | CFLAGS += $(cflags-y) |
69 | CFLAGS_KERNEL += $(cflags-kernel-y) | 73 | CFLAGS_KERNEL += $(cflags-kernel-y) |
diff --git a/arch/x86_64/boot/setup.S b/arch/x86_64/boot/setup.S index c3bfd223ab49..770940cc0108 100644 --- a/arch/x86_64/boot/setup.S +++ b/arch/x86_64/boot/setup.S | |||
@@ -836,13 +836,12 @@ gdt: | |||
836 | .word 0x9200 # data read/write | 836 | .word 0x9200 # data read/write |
837 | .word 0x00CF # granularity = 4096, 386 | 837 | .word 0x00CF # granularity = 4096, 386 |
838 | # (+5th nibble of limit) | 838 | # (+5th nibble of limit) |
839 | gdt_end: | ||
839 | idt_48: | 840 | idt_48: |
840 | .word 0 # idt limit = 0 | 841 | .word 0 # idt limit = 0 |
841 | .word 0, 0 # idt base = 0L | 842 | .word 0, 0 # idt base = 0L |
842 | gdt_48: | 843 | gdt_48: |
843 | .word 0x8000 # gdt limit=2048, | 844 | .word gdt_end-gdt-1 # gdt limit |
844 | # 256 GDT entries | ||
845 | |||
846 | .word 0, 0 # gdt base (filled in later) | 845 | .word 0, 0 # gdt base (filled in later) |
847 | 846 | ||
848 | # Include video setup & detection code | 847 | # Include video setup & detection code |
diff --git a/arch/x86_64/defconfig b/arch/x86_64/defconfig index 47bfba6e9dc4..0f5d44e86be5 100644 --- a/arch/x86_64/defconfig +++ b/arch/x86_64/defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.19-rc1 | 3 | # Linux kernel version: 2.6.19-rc2-git4 |
4 | # Thu Oct 5 13:04:43 2006 | 4 | # Sat Oct 21 03:38:52 2006 |
5 | # | 5 | # |
6 | CONFIG_X86_64=y | 6 | CONFIG_X86_64=y |
7 | CONFIG_64BIT=y | 7 | CONFIG_64BIT=y |
@@ -335,8 +335,8 @@ CONFIG_IPV6=y | |||
335 | # CONFIG_INET6_XFRM_MODE_TUNNEL is not set | 335 | # CONFIG_INET6_XFRM_MODE_TUNNEL is not set |
336 | # CONFIG_INET6_XFRM_MODE_BEET is not set | 336 | # CONFIG_INET6_XFRM_MODE_BEET is not set |
337 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | 337 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set |
338 | CONFIG_IPV6_SIT=y | ||
338 | # CONFIG_IPV6_TUNNEL is not set | 339 | # CONFIG_IPV6_TUNNEL is not set |
339 | # CONFIG_IPV6_SUBTREES is not set | ||
340 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | 340 | # CONFIG_IPV6_MULTIPLE_TABLES is not set |
341 | # CONFIG_NETWORK_SECMARK is not set | 341 | # CONFIG_NETWORK_SECMARK is not set |
342 | # CONFIG_NETFILTER is not set | 342 | # CONFIG_NETFILTER is not set |
@@ -438,6 +438,13 @@ CONFIG_BLK_DEV_INITRD=y | |||
438 | # CONFIG_ATA_OVER_ETH is not set | 438 | # CONFIG_ATA_OVER_ETH is not set |
439 | 439 | ||
440 | # | 440 | # |
441 | # Misc devices | ||
442 | # | ||
443 | # CONFIG_IBM_ASM is not set | ||
444 | # CONFIG_SGI_IOC4 is not set | ||
445 | # CONFIG_TIFM_CORE is not set | ||
446 | |||
447 | # | ||
441 | # ATA/ATAPI/MFM/RLL support | 448 | # ATA/ATAPI/MFM/RLL support |
442 | # | 449 | # |
443 | CONFIG_IDE=y | 450 | CONFIG_IDE=y |
@@ -1008,6 +1015,7 @@ CONFIG_I2C_ISA=m | |||
1008 | # | 1015 | # |
1009 | # Dallas's 1-wire bus | 1016 | # Dallas's 1-wire bus |
1010 | # | 1017 | # |
1018 | # CONFIG_W1 is not set | ||
1011 | 1019 | ||
1012 | # | 1020 | # |
1013 | # Hardware Monitoring support | 1021 | # Hardware Monitoring support |
@@ -1059,12 +1067,6 @@ CONFIG_SENSORS_SMSC47B397=m | |||
1059 | # CONFIG_HWMON_DEBUG_CHIP is not set | 1067 | # CONFIG_HWMON_DEBUG_CHIP is not set |
1060 | 1068 | ||
1061 | # | 1069 | # |
1062 | # Misc devices | ||
1063 | # | ||
1064 | # CONFIG_IBM_ASM is not set | ||
1065 | # CONFIG_TIFM_CORE is not set | ||
1066 | |||
1067 | # | ||
1068 | # Multimedia devices | 1070 | # Multimedia devices |
1069 | # | 1071 | # |
1070 | # CONFIG_VIDEO_DEV is not set | 1072 | # CONFIG_VIDEO_DEV is not set |
@@ -1196,7 +1198,6 @@ CONFIG_USB_HIDINPUT=y | |||
1196 | # CONFIG_USB_ATI_REMOTE2 is not set | 1198 | # CONFIG_USB_ATI_REMOTE2 is not set |
1197 | # CONFIG_USB_KEYSPAN_REMOTE is not set | 1199 | # CONFIG_USB_KEYSPAN_REMOTE is not set |
1198 | # CONFIG_USB_APPLETOUCH is not set | 1200 | # CONFIG_USB_APPLETOUCH is not set |
1199 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
1200 | 1201 | ||
1201 | # | 1202 | # |
1202 | # USB Imaging devices | 1203 | # USB Imaging devices |
@@ -1242,6 +1243,7 @@ CONFIG_USB_MON=y | |||
1242 | # CONFIG_USB_APPLEDISPLAY is not set | 1243 | # CONFIG_USB_APPLEDISPLAY is not set |
1243 | # CONFIG_USB_SISUSBVGA is not set | 1244 | # CONFIG_USB_SISUSBVGA is not set |
1244 | # CONFIG_USB_LD is not set | 1245 | # CONFIG_USB_LD is not set |
1246 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
1245 | # CONFIG_USB_TEST is not set | 1247 | # CONFIG_USB_TEST is not set |
1246 | 1248 | ||
1247 | # | 1249 | # |
@@ -1318,6 +1320,7 @@ CONFIG_EXT3_FS=y | |||
1318 | CONFIG_EXT3_FS_XATTR=y | 1320 | CONFIG_EXT3_FS_XATTR=y |
1319 | CONFIG_EXT3_FS_POSIX_ACL=y | 1321 | CONFIG_EXT3_FS_POSIX_ACL=y |
1320 | # CONFIG_EXT3_FS_SECURITY is not set | 1322 | # CONFIG_EXT3_FS_SECURITY is not set |
1323 | # CONFIG_EXT4DEV_FS is not set | ||
1321 | CONFIG_JBD=y | 1324 | CONFIG_JBD=y |
1322 | # CONFIG_JBD_DEBUG is not set | 1325 | # CONFIG_JBD_DEBUG is not set |
1323 | CONFIG_FS_MBCACHE=y | 1326 | CONFIG_FS_MBCACHE=y |
@@ -1341,6 +1344,7 @@ CONFIG_DNOTIFY=y | |||
1341 | # CONFIG_AUTOFS_FS is not set | 1344 | # CONFIG_AUTOFS_FS is not set |
1342 | CONFIG_AUTOFS4_FS=y | 1345 | CONFIG_AUTOFS4_FS=y |
1343 | # CONFIG_FUSE_FS is not set | 1346 | # CONFIG_FUSE_FS is not set |
1347 | CONFIG_GENERIC_ACL=y | ||
1344 | 1348 | ||
1345 | # | 1349 | # |
1346 | # CD-ROM/DVD Filesystems | 1350 | # CD-ROM/DVD Filesystems |
@@ -1418,7 +1422,6 @@ CONFIG_SUNRPC=y | |||
1418 | # CONFIG_CODA_FS is not set | 1422 | # CONFIG_CODA_FS is not set |
1419 | # CONFIG_AFS_FS is not set | 1423 | # CONFIG_AFS_FS is not set |
1420 | # CONFIG_9P_FS is not set | 1424 | # CONFIG_9P_FS is not set |
1421 | CONFIG_GENERIC_ACL=y | ||
1422 | 1425 | ||
1423 | # | 1426 | # |
1424 | # Partition Types | 1427 | # Partition Types |
@@ -1471,10 +1474,6 @@ CONFIG_NLS_ISO8859_15=y | |||
1471 | CONFIG_NLS_UTF8=y | 1474 | CONFIG_NLS_UTF8=y |
1472 | 1475 | ||
1473 | # | 1476 | # |
1474 | # Distributed Lock Manager | ||
1475 | # | ||
1476 | |||
1477 | # | ||
1478 | # Instrumentation Support | 1477 | # Instrumentation Support |
1479 | # | 1478 | # |
1480 | CONFIG_PROFILING=y | 1479 | CONFIG_PROFILING=y |
@@ -1512,6 +1511,7 @@ CONFIG_DEBUG_FS=y | |||
1512 | CONFIG_UNWIND_INFO=y | 1511 | CONFIG_UNWIND_INFO=y |
1513 | CONFIG_STACK_UNWIND=y | 1512 | CONFIG_STACK_UNWIND=y |
1514 | # CONFIG_FORCED_INLINING is not set | 1513 | # CONFIG_FORCED_INLINING is not set |
1514 | # CONFIG_HEADERS_CHECK is not set | ||
1515 | # CONFIG_RCU_TORTURE_TEST is not set | 1515 | # CONFIG_RCU_TORTURE_TEST is not set |
1516 | # CONFIG_LKDTM is not set | 1516 | # CONFIG_LKDTM is not set |
1517 | # CONFIG_DEBUG_RODATA is not set | 1517 | # CONFIG_DEBUG_RODATA is not set |
diff --git a/arch/x86_64/ia32/ia32_signal.c b/arch/x86_64/ia32/ia32_signal.c index a6ba9951e86c..0e0a266d976f 100644 --- a/arch/x86_64/ia32/ia32_signal.c +++ b/arch/x86_64/ia32/ia32_signal.c | |||
@@ -579,6 +579,11 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
579 | regs->rsp = (unsigned long) frame; | 579 | regs->rsp = (unsigned long) frame; |
580 | regs->rip = (unsigned long) ka->sa.sa_handler; | 580 | regs->rip = (unsigned long) ka->sa.sa_handler; |
581 | 581 | ||
582 | /* Make -mregparm=3 work */ | ||
583 | regs->rax = sig; | ||
584 | regs->rdx = (unsigned long) &frame->info; | ||
585 | regs->rcx = (unsigned long) &frame->uc; | ||
586 | |||
582 | asm volatile("movl %0,%%ds" :: "r" (__USER32_DS)); | 587 | asm volatile("movl %0,%%ds" :: "r" (__USER32_DS)); |
583 | asm volatile("movl %0,%%es" :: "r" (__USER32_DS)); | 588 | asm volatile("movl %0,%%es" :: "r" (__USER32_DS)); |
584 | 589 | ||
diff --git a/arch/x86_64/ia32/ptrace32.c b/arch/x86_64/ia32/ptrace32.c index 3a7561d4703e..04566fe5de49 100644 --- a/arch/x86_64/ia32/ptrace32.c +++ b/arch/x86_64/ia32/ptrace32.c | |||
@@ -244,6 +244,8 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data) | |||
244 | case PTRACE_DETACH: | 244 | case PTRACE_DETACH: |
245 | case PTRACE_SYSCALL: | 245 | case PTRACE_SYSCALL: |
246 | case PTRACE_SETOPTIONS: | 246 | case PTRACE_SETOPTIONS: |
247 | case PTRACE_SET_THREAD_AREA: | ||
248 | case PTRACE_GET_THREAD_AREA: | ||
247 | return sys_ptrace(request, pid, addr, data); | 249 | return sys_ptrace(request, pid, addr, data); |
248 | 250 | ||
249 | default: | 251 | default: |
diff --git a/arch/x86_64/kernel/e820.c b/arch/x86_64/kernel/e820.c index b3f0908668ec..6fe191c58084 100644 --- a/arch/x86_64/kernel/e820.c +++ b/arch/x86_64/kernel/e820.c | |||
@@ -54,13 +54,13 @@ static inline int bad_addr(unsigned long *addrp, unsigned long size) | |||
54 | 54 | ||
55 | /* various gunk below that needed for SMP startup */ | 55 | /* various gunk below that needed for SMP startup */ |
56 | if (addr < 0x8000) { | 56 | if (addr < 0x8000) { |
57 | *addrp = 0x8000; | 57 | *addrp = PAGE_ALIGN(0x8000); |
58 | return 1; | 58 | return 1; |
59 | } | 59 | } |
60 | 60 | ||
61 | /* direct mapping tables of the kernel */ | 61 | /* direct mapping tables of the kernel */ |
62 | if (last >= table_start<<PAGE_SHIFT && addr < table_end<<PAGE_SHIFT) { | 62 | if (last >= table_start<<PAGE_SHIFT && addr < table_end<<PAGE_SHIFT) { |
63 | *addrp = table_end << PAGE_SHIFT; | 63 | *addrp = PAGE_ALIGN(table_end << PAGE_SHIFT); |
64 | return 1; | 64 | return 1; |
65 | } | 65 | } |
66 | 66 | ||
@@ -68,18 +68,18 @@ static inline int bad_addr(unsigned long *addrp, unsigned long size) | |||
68 | #ifdef CONFIG_BLK_DEV_INITRD | 68 | #ifdef CONFIG_BLK_DEV_INITRD |
69 | if (LOADER_TYPE && INITRD_START && last >= INITRD_START && | 69 | if (LOADER_TYPE && INITRD_START && last >= INITRD_START && |
70 | addr < INITRD_START+INITRD_SIZE) { | 70 | addr < INITRD_START+INITRD_SIZE) { |
71 | *addrp = INITRD_START + INITRD_SIZE; | 71 | *addrp = PAGE_ALIGN(INITRD_START + INITRD_SIZE); |
72 | return 1; | 72 | return 1; |
73 | } | 73 | } |
74 | #endif | 74 | #endif |
75 | /* kernel code */ | 75 | /* kernel code */ |
76 | if (last >= __pa_symbol(&_text) && last < __pa_symbol(&_end)) { | 76 | if (last >= __pa_symbol(&_text) && addr < __pa_symbol(&_end)) { |
77 | *addrp = __pa_symbol(&_end); | 77 | *addrp = PAGE_ALIGN(__pa_symbol(&_end)); |
78 | return 1; | 78 | return 1; |
79 | } | 79 | } |
80 | 80 | ||
81 | if (last >= ebda_addr && addr < ebda_addr + ebda_size) { | 81 | if (last >= ebda_addr && addr < ebda_addr + ebda_size) { |
82 | *addrp = ebda_addr + ebda_size; | 82 | *addrp = PAGE_ALIGN(ebda_addr + ebda_size); |
83 | return 1; | 83 | return 1; |
84 | } | 84 | } |
85 | 85 | ||
@@ -152,7 +152,7 @@ unsigned long __init find_e820_area(unsigned long start, unsigned long end, unsi | |||
152 | continue; | 152 | continue; |
153 | while (bad_addr(&addr, size) && addr+size <= ei->addr+ei->size) | 153 | while (bad_addr(&addr, size) && addr+size <= ei->addr+ei->size) |
154 | ; | 154 | ; |
155 | last = addr + size; | 155 | last = PAGE_ALIGN(addr) + size; |
156 | if (last > ei->addr + ei->size) | 156 | if (last > ei->addr + ei->size) |
157 | continue; | 157 | continue; |
158 | if (last > end) | 158 | if (last > end) |
@@ -278,7 +278,7 @@ e820_register_active_regions(int nid, unsigned long start_pfn, | |||
278 | >> PAGE_SHIFT; | 278 | >> PAGE_SHIFT; |
279 | 279 | ||
280 | /* Skip map entries smaller than a page */ | 280 | /* Skip map entries smaller than a page */ |
281 | if (ei_startpfn > ei_endpfn) | 281 | if (ei_startpfn >= ei_endpfn) |
282 | continue; | 282 | continue; |
283 | 283 | ||
284 | /* Check if end_pfn_map should be updated */ | 284 | /* Check if end_pfn_map should be updated */ |
@@ -594,7 +594,9 @@ static int __init parse_memmap_opt(char *p) | |||
594 | * size before original memory map is | 594 | * size before original memory map is |
595 | * reset. | 595 | * reset. |
596 | */ | 596 | */ |
597 | e820_register_active_regions(0, 0, -1UL); | ||
597 | saved_max_pfn = e820_end_of_ram(); | 598 | saved_max_pfn = e820_end_of_ram(); |
599 | remove_all_active_ranges(); | ||
598 | #endif | 600 | #endif |
599 | end_pfn_map = 0; | 601 | end_pfn_map = 0; |
600 | e820.nr_map = 0; | 602 | e820.nr_map = 0; |
diff --git a/arch/x86_64/kernel/early-quirks.c b/arch/x86_64/kernel/early-quirks.c index 208e38a372c1..68273bff58cc 100644 --- a/arch/x86_64/kernel/early-quirks.c +++ b/arch/x86_64/kernel/early-quirks.c | |||
@@ -45,7 +45,13 @@ static void nvidia_bugs(void) | |||
45 | /* | 45 | /* |
46 | * All timer overrides on Nvidia are | 46 | * All timer overrides on Nvidia are |
47 | * wrong unless HPET is enabled. | 47 | * wrong unless HPET is enabled. |
48 | * Unfortunately that's not true on many Asus boards. | ||
49 | * We don't know yet how to detect this automatically, but | ||
50 | * at least allow a command line override. | ||
48 | */ | 51 | */ |
52 | if (acpi_use_timer_override) | ||
53 | return; | ||
54 | |||
49 | nvidia_hpet_detected = 0; | 55 | nvidia_hpet_detected = 0; |
50 | acpi_table_parse(ACPI_HPET, nvidia_hpet_check); | 56 | acpi_table_parse(ACPI_HPET, nvidia_hpet_check); |
51 | if (nvidia_hpet_detected == 0) { | 57 | if (nvidia_hpet_detected == 0) { |
@@ -53,6 +59,8 @@ static void nvidia_bugs(void) | |||
53 | printk(KERN_INFO "Nvidia board " | 59 | printk(KERN_INFO "Nvidia board " |
54 | "detected. Ignoring ACPI " | 60 | "detected. Ignoring ACPI " |
55 | "timer override.\n"); | 61 | "timer override.\n"); |
62 | printk(KERN_INFO "If you got timer trouble " | ||
63 | "try acpi_use_timer_override\n"); | ||
56 | } | 64 | } |
57 | #endif | 65 | #endif |
58 | /* RED-PEN skip them on mptables too? */ | 66 | /* RED-PEN skip them on mptables too? */ |
@@ -61,10 +69,11 @@ static void nvidia_bugs(void) | |||
61 | 69 | ||
62 | static void ati_bugs(void) | 70 | static void ati_bugs(void) |
63 | { | 71 | { |
64 | #if 1 /* for testing */ | 72 | if (timer_over_8254 == 1) { |
65 | printk("ATI board detected\n"); | 73 | timer_over_8254 = 0; |
66 | #endif | 74 | printk(KERN_INFO |
67 | /* No bugs right now */ | 75 | "ATI board detected. Disabling timer routing over 8254.\n"); |
76 | } | ||
68 | } | 77 | } |
69 | 78 | ||
70 | struct chipset { | 79 | struct chipset { |
diff --git a/arch/x86_64/kernel/early_printk.c b/arch/x86_64/kernel/early_printk.c index e22ecd54870d..47b6d90349da 100644 --- a/arch/x86_64/kernel/early_printk.c +++ b/arch/x86_64/kernel/early_printk.c | |||
@@ -224,7 +224,7 @@ static int __init setup_early_printk(char *buf) | |||
224 | return 0; | 224 | return 0; |
225 | early_console_initialized = 1; | 225 | early_console_initialized = 1; |
226 | 226 | ||
227 | if (!strcmp(buf,"keep")) | 227 | if (strstr(buf, "keep")) |
228 | keep_early = 1; | 228 | keep_early = 1; |
229 | 229 | ||
230 | if (!strncmp(buf, "serial", 6)) { | 230 | if (!strncmp(buf, "serial", 6)) { |
diff --git a/arch/x86_64/kernel/entry.S b/arch/x86_64/kernel/entry.S index 38a7b2d528e2..7d401b00d822 100644 --- a/arch/x86_64/kernel/entry.S +++ b/arch/x86_64/kernel/entry.S | |||
@@ -315,6 +315,8 @@ tracesys: | |||
315 | LOAD_ARGS ARGOFFSET /* reload args from stack in case ptrace changed it */ | 315 | LOAD_ARGS ARGOFFSET /* reload args from stack in case ptrace changed it */ |
316 | RESTORE_REST | 316 | RESTORE_REST |
317 | cmpq $__NR_syscall_max,%rax | 317 | cmpq $__NR_syscall_max,%rax |
318 | movq $-ENOSYS,%rcx | ||
319 | cmova %rcx,%rax | ||
318 | ja 1f | 320 | ja 1f |
319 | movq %r10,%rcx /* fixup for C */ | 321 | movq %r10,%rcx /* fixup for C */ |
320 | call *sys_call_table(,%rax,8) | 322 | call *sys_call_table(,%rax,8) |
@@ -535,8 +537,6 @@ END(stub_rt_sigreturn) | |||
535 | 1: incl %gs:pda_irqcount | 537 | 1: incl %gs:pda_irqcount |
536 | cmoveq %gs:pda_irqstackptr,%rsp | 538 | cmoveq %gs:pda_irqstackptr,%rsp |
537 | push %rbp # backlink for old unwinder | 539 | push %rbp # backlink for old unwinder |
538 | CFI_ADJUST_CFA_OFFSET 8 | ||
539 | CFI_REL_OFFSET rbp,0 | ||
540 | /* | 540 | /* |
541 | * We entered an interrupt context - irqs are off: | 541 | * We entered an interrupt context - irqs are off: |
542 | */ | 542 | */ |
@@ -980,11 +980,6 @@ ENTRY(kernel_thread) | |||
980 | call do_fork | 980 | call do_fork |
981 | movq %rax,RAX(%rsp) | 981 | movq %rax,RAX(%rsp) |
982 | xorl %edi,%edi | 982 | xorl %edi,%edi |
983 | test %rax,%rax | ||
984 | jnz 1f | ||
985 | /* terminate stack in child */ | ||
986 | movq %rdi,RIP(%rsp) | ||
987 | 1: | ||
988 | 983 | ||
989 | /* | 984 | /* |
990 | * It isn't worth to check for reschedule here, | 985 | * It isn't worth to check for reschedule here, |
@@ -1176,7 +1171,6 @@ ENTRY(call_softirq) | |||
1176 | incl %gs:pda_irqcount | 1171 | incl %gs:pda_irqcount |
1177 | cmove %gs:pda_irqstackptr,%rsp | 1172 | cmove %gs:pda_irqstackptr,%rsp |
1178 | push %rbp # backlink for old unwinder | 1173 | push %rbp # backlink for old unwinder |
1179 | CFI_ADJUST_CFA_OFFSET 8 | ||
1180 | call __do_softirq | 1174 | call __do_softirq |
1181 | leaveq | 1175 | leaveq |
1182 | CFI_DEF_CFA_REGISTER rsp | 1176 | CFI_DEF_CFA_REGISTER rsp |
diff --git a/arch/x86_64/kernel/genapic_flat.c b/arch/x86_64/kernel/genapic_flat.c index 0dfc223c1839..7c01db8fa9d1 100644 --- a/arch/x86_64/kernel/genapic_flat.c +++ b/arch/x86_64/kernel/genapic_flat.c | |||
@@ -153,7 +153,7 @@ struct genapic apic_flat = { | |||
153 | 153 | ||
154 | static cpumask_t physflat_target_cpus(void) | 154 | static cpumask_t physflat_target_cpus(void) |
155 | { | 155 | { |
156 | return cpumask_of_cpu(0); | 156 | return cpu_online_map; |
157 | } | 157 | } |
158 | 158 | ||
159 | static cpumask_t physflat_vector_allocation_domain(int cpu) | 159 | static cpumask_t physflat_vector_allocation_domain(int cpu) |
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c index 49e94f7994c5..c80081a6ba41 100644 --- a/arch/x86_64/kernel/io_apic.c +++ b/arch/x86_64/kernel/io_apic.c | |||
@@ -57,13 +57,13 @@ static int no_timer_check; | |||
57 | 57 | ||
58 | static int disable_timer_pin_1 __initdata; | 58 | static int disable_timer_pin_1 __initdata; |
59 | 59 | ||
60 | int timer_over_8254 __initdata = 0; | 60 | int timer_over_8254 __initdata = 1; |
61 | 61 | ||
62 | /* Where if anywhere is the i8259 connect in external int mode */ | 62 | /* Where if anywhere is the i8259 connect in external int mode */ |
63 | static struct { int pin, apic; } ioapic_i8259 = { -1, -1 }; | 63 | static struct { int pin, apic; } ioapic_i8259 = { -1, -1 }; |
64 | 64 | ||
65 | static DEFINE_SPINLOCK(ioapic_lock); | 65 | static DEFINE_SPINLOCK(ioapic_lock); |
66 | static DEFINE_SPINLOCK(vector_lock); | 66 | DEFINE_SPINLOCK(vector_lock); |
67 | 67 | ||
68 | /* | 68 | /* |
69 | * # of IRQ routing registers | 69 | * # of IRQ routing registers |
@@ -88,6 +88,52 @@ static struct irq_pin_list { | |||
88 | short apic, pin, next; | 88 | short apic, pin, next; |
89 | } irq_2_pin[PIN_MAP_SIZE]; | 89 | } irq_2_pin[PIN_MAP_SIZE]; |
90 | 90 | ||
91 | struct io_apic { | ||
92 | unsigned int index; | ||
93 | unsigned int unused[3]; | ||
94 | unsigned int data; | ||
95 | }; | ||
96 | |||
97 | static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx) | ||
98 | { | ||
99 | return (void __iomem *) __fix_to_virt(FIX_IO_APIC_BASE_0 + idx) | ||
100 | + (mp_ioapics[idx].mpc_apicaddr & ~PAGE_MASK); | ||
101 | } | ||
102 | |||
103 | static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) | ||
104 | { | ||
105 | struct io_apic __iomem *io_apic = io_apic_base(apic); | ||
106 | writel(reg, &io_apic->index); | ||
107 | return readl(&io_apic->data); | ||
108 | } | ||
109 | |||
110 | static inline void io_apic_write(unsigned int apic, unsigned int reg, unsigned int value) | ||
111 | { | ||
112 | struct io_apic __iomem *io_apic = io_apic_base(apic); | ||
113 | writel(reg, &io_apic->index); | ||
114 | writel(value, &io_apic->data); | ||
115 | } | ||
116 | |||
117 | /* | ||
118 | * Re-write a value: to be used for read-modify-write | ||
119 | * cycles where the read already set up the index register. | ||
120 | */ | ||
121 | static inline void io_apic_modify(unsigned int apic, unsigned int value) | ||
122 | { | ||
123 | struct io_apic __iomem *io_apic = io_apic_base(apic); | ||
124 | writel(value, &io_apic->data); | ||
125 | } | ||
126 | |||
127 | /* | ||
128 | * Synchronize the IO-APIC and the CPU by doing | ||
129 | * a dummy read from the IO-APIC | ||
130 | */ | ||
131 | static inline void io_apic_sync(unsigned int apic) | ||
132 | { | ||
133 | struct io_apic __iomem *io_apic = io_apic_base(apic); | ||
134 | readl(&io_apic->data); | ||
135 | } | ||
136 | |||
91 | #define __DO_ACTION(R, ACTION, FINAL) \ | 137 | #define __DO_ACTION(R, ACTION, FINAL) \ |
92 | \ | 138 | \ |
93 | { \ | 139 | { \ |
@@ -126,12 +172,34 @@ static struct IO_APIC_route_entry ioapic_read_entry(int apic, int pin) | |||
126 | return eu.entry; | 172 | return eu.entry; |
127 | } | 173 | } |
128 | 174 | ||
175 | /* | ||
176 | * When we write a new IO APIC routing entry, we need to write the high | ||
177 | * word first! If the mask bit in the low word is clear, we will enable | ||
178 | * the interrupt, and we need to make sure the entry is fully populated | ||
179 | * before that happens. | ||
180 | */ | ||
129 | static void ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e) | 181 | static void ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e) |
130 | { | 182 | { |
131 | unsigned long flags; | 183 | unsigned long flags; |
132 | union entry_union eu; | 184 | union entry_union eu; |
133 | eu.entry = e; | 185 | eu.entry = e; |
134 | spin_lock_irqsave(&ioapic_lock, flags); | 186 | spin_lock_irqsave(&ioapic_lock, flags); |
187 | io_apic_write(apic, 0x11 + 2*pin, eu.w2); | ||
188 | io_apic_write(apic, 0x10 + 2*pin, eu.w1); | ||
189 | spin_unlock_irqrestore(&ioapic_lock, flags); | ||
190 | } | ||
191 | |||
192 | /* | ||
193 | * When we mask an IO APIC routing entry, we need to write the low | ||
194 | * word first, in order to set the mask bit before we change the | ||
195 | * high bits! | ||
196 | */ | ||
197 | static void ioapic_mask_entry(int apic, int pin) | ||
198 | { | ||
199 | unsigned long flags; | ||
200 | union entry_union eu = { .entry.mask = 1 }; | ||
201 | |||
202 | spin_lock_irqsave(&ioapic_lock, flags); | ||
135 | io_apic_write(apic, 0x10 + 2*pin, eu.w1); | 203 | io_apic_write(apic, 0x10 + 2*pin, eu.w1); |
136 | io_apic_write(apic, 0x11 + 2*pin, eu.w2); | 204 | io_apic_write(apic, 0x11 + 2*pin, eu.w2); |
137 | spin_unlock_irqrestore(&ioapic_lock, flags); | 205 | spin_unlock_irqrestore(&ioapic_lock, flags); |
@@ -256,9 +324,7 @@ static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin) | |||
256 | /* | 324 | /* |
257 | * Disable it in the IO-APIC irq-routing table: | 325 | * Disable it in the IO-APIC irq-routing table: |
258 | */ | 326 | */ |
259 | memset(&entry, 0, sizeof(entry)); | 327 | ioapic_mask_entry(apic, pin); |
260 | entry.mask = 1; | ||
261 | ioapic_write_entry(apic, pin, entry); | ||
262 | } | 328 | } |
263 | 329 | ||
264 | static void clear_IO_APIC (void) | 330 | static void clear_IO_APIC (void) |
@@ -612,15 +678,15 @@ static int __assign_irq_vector(int irq, cpumask_t mask, cpumask_t *result) | |||
612 | * Also, we've got to be careful not to trash gate | 678 | * Also, we've got to be careful not to trash gate |
613 | * 0x80, because int 0x80 is hm, kind of importantish. ;) | 679 | * 0x80, because int 0x80 is hm, kind of importantish. ;) |
614 | */ | 680 | */ |
615 | static struct { | 681 | static int current_vector = FIRST_DEVICE_VECTOR, current_offset = 0; |
616 | int vector; | ||
617 | int offset; | ||
618 | } pos[NR_CPUS] = { [ 0 ... NR_CPUS - 1] = {FIRST_DEVICE_VECTOR, 0} }; | ||
619 | int old_vector = -1; | 682 | int old_vector = -1; |
620 | int cpu; | 683 | int cpu; |
621 | 684 | ||
622 | BUG_ON((unsigned)irq >= NR_IRQ_VECTORS); | 685 | BUG_ON((unsigned)irq >= NR_IRQ_VECTORS); |
623 | 686 | ||
687 | /* Only try and allocate irqs on cpus that are present */ | ||
688 | cpus_and(mask, mask, cpu_online_map); | ||
689 | |||
624 | if (irq_vector[irq] > 0) | 690 | if (irq_vector[irq] > 0) |
625 | old_vector = irq_vector[irq]; | 691 | old_vector = irq_vector[irq]; |
626 | if (old_vector > 0) { | 692 | if (old_vector > 0) { |
@@ -630,15 +696,15 @@ static int __assign_irq_vector(int irq, cpumask_t mask, cpumask_t *result) | |||
630 | } | 696 | } |
631 | 697 | ||
632 | for_each_cpu_mask(cpu, mask) { | 698 | for_each_cpu_mask(cpu, mask) { |
633 | cpumask_t domain; | 699 | cpumask_t domain, new_mask; |
634 | int first, new_cpu; | 700 | int new_cpu; |
635 | int vector, offset; | 701 | int vector, offset; |
636 | 702 | ||
637 | domain = vector_allocation_domain(cpu); | 703 | domain = vector_allocation_domain(cpu); |
638 | first = first_cpu(domain); | 704 | cpus_and(new_mask, domain, cpu_online_map); |
639 | 705 | ||
640 | vector = pos[first].vector; | 706 | vector = current_vector; |
641 | offset = pos[first].offset; | 707 | offset = current_offset; |
642 | next: | 708 | next: |
643 | vector += 8; | 709 | vector += 8; |
644 | if (vector >= FIRST_SYSTEM_VECTOR) { | 710 | if (vector >= FIRST_SYSTEM_VECTOR) { |
@@ -646,24 +712,24 @@ next: | |||
646 | offset = (offset + 1) % 8; | 712 | offset = (offset + 1) % 8; |
647 | vector = FIRST_DEVICE_VECTOR + offset; | 713 | vector = FIRST_DEVICE_VECTOR + offset; |
648 | } | 714 | } |
649 | if (unlikely(pos[first].vector == vector)) | 715 | if (unlikely(current_vector == vector)) |
650 | continue; | 716 | continue; |
651 | if (vector == IA32_SYSCALL_VECTOR) | 717 | if (vector == IA32_SYSCALL_VECTOR) |
652 | goto next; | 718 | goto next; |
653 | for_each_cpu_mask(new_cpu, domain) | 719 | for_each_cpu_mask(new_cpu, new_mask) |
654 | if (per_cpu(vector_irq, cpu)[vector] != -1) | 720 | if (per_cpu(vector_irq, new_cpu)[vector] != -1) |
655 | goto next; | 721 | goto next; |
656 | /* Found one! */ | 722 | /* Found one! */ |
657 | for_each_cpu_mask(new_cpu, domain) { | 723 | current_vector = vector; |
658 | pos[cpu].vector = vector; | 724 | current_offset = offset; |
659 | pos[cpu].offset = offset; | ||
660 | } | ||
661 | if (old_vector >= 0) { | 725 | if (old_vector >= 0) { |
726 | cpumask_t old_mask; | ||
662 | int old_cpu; | 727 | int old_cpu; |
663 | for_each_cpu_mask(old_cpu, irq_domain[irq]) | 728 | cpus_and(old_mask, irq_domain[irq], cpu_online_map); |
729 | for_each_cpu_mask(old_cpu, old_mask) | ||
664 | per_cpu(vector_irq, old_cpu)[old_vector] = -1; | 730 | per_cpu(vector_irq, old_cpu)[old_vector] = -1; |
665 | } | 731 | } |
666 | for_each_cpu_mask(new_cpu, domain) | 732 | for_each_cpu_mask(new_cpu, new_mask) |
667 | per_cpu(vector_irq, new_cpu)[vector] = irq; | 733 | per_cpu(vector_irq, new_cpu)[vector] = irq; |
668 | irq_vector[irq] = vector; | 734 | irq_vector[irq] = vector; |
669 | irq_domain[irq] = domain; | 735 | irq_domain[irq] = domain; |
@@ -684,6 +750,30 @@ static int assign_irq_vector(int irq, cpumask_t mask, cpumask_t *result) | |||
684 | return vector; | 750 | return vector; |
685 | } | 751 | } |
686 | 752 | ||
753 | void __setup_vector_irq(int cpu) | ||
754 | { | ||
755 | /* Initialize vector_irq on a new cpu */ | ||
756 | /* This function must be called with vector_lock held */ | ||
757 | int irq, vector; | ||
758 | |||
759 | /* Mark the inuse vectors */ | ||
760 | for (irq = 0; irq < NR_IRQ_VECTORS; ++irq) { | ||
761 | if (!cpu_isset(cpu, irq_domain[irq])) | ||
762 | continue; | ||
763 | vector = irq_vector[irq]; | ||
764 | per_cpu(vector_irq, cpu)[vector] = irq; | ||
765 | } | ||
766 | /* Mark the free vectors */ | ||
767 | for (vector = 0; vector < NR_VECTORS; ++vector) { | ||
768 | irq = per_cpu(vector_irq, cpu)[vector]; | ||
769 | if (irq < 0) | ||
770 | continue; | ||
771 | if (!cpu_isset(cpu, irq_domain[irq])) | ||
772 | per_cpu(vector_irq, cpu)[vector] = -1; | ||
773 | } | ||
774 | } | ||
775 | |||
776 | |||
687 | extern void (*interrupt[NR_IRQS])(void); | 777 | extern void (*interrupt[NR_IRQS])(void); |
688 | 778 | ||
689 | static struct irq_chip ioapic_chip; | 779 | static struct irq_chip ioapic_chip; |
@@ -698,9 +788,11 @@ static void ioapic_register_intr(int irq, int vector, unsigned long trigger) | |||
698 | trigger == IOAPIC_LEVEL) | 788 | trigger == IOAPIC_LEVEL) |
699 | set_irq_chip_and_handler_name(irq, &ioapic_chip, | 789 | set_irq_chip_and_handler_name(irq, &ioapic_chip, |
700 | handle_fasteoi_irq, "fasteoi"); | 790 | handle_fasteoi_irq, "fasteoi"); |
701 | else | 791 | else { |
792 | irq_desc[irq].status |= IRQ_DELAYED_DISABLE; | ||
702 | set_irq_chip_and_handler_name(irq, &ioapic_chip, | 793 | set_irq_chip_and_handler_name(irq, &ioapic_chip, |
703 | handle_edge_irq, "edge"); | 794 | handle_edge_irq, "edge"); |
795 | } | ||
704 | } | 796 | } |
705 | 797 | ||
706 | static void __init setup_IO_APIC_irqs(void) | 798 | static void __init setup_IO_APIC_irqs(void) |
@@ -1255,12 +1347,15 @@ static int ioapic_retrigger_irq(unsigned int irq) | |||
1255 | { | 1347 | { |
1256 | cpumask_t mask; | 1348 | cpumask_t mask; |
1257 | unsigned vector; | 1349 | unsigned vector; |
1350 | unsigned long flags; | ||
1258 | 1351 | ||
1352 | spin_lock_irqsave(&vector_lock, flags); | ||
1259 | vector = irq_vector[irq]; | 1353 | vector = irq_vector[irq]; |
1260 | cpus_clear(mask); | 1354 | cpus_clear(mask); |
1261 | cpu_set(vector >> 8, mask); | 1355 | cpu_set(first_cpu(irq_domain[irq]), mask); |
1262 | 1356 | ||
1263 | send_IPI_mask(mask, vector & 0xff); | 1357 | send_IPI_mask(mask, vector); |
1358 | spin_unlock_irqrestore(&vector_lock, flags); | ||
1264 | 1359 | ||
1265 | return 1; | 1360 | return 1; |
1266 | } | 1361 | } |
@@ -1860,18 +1955,16 @@ void arch_teardown_msi_irq(unsigned int irq) | |||
1860 | 1955 | ||
1861 | static void target_ht_irq(unsigned int irq, unsigned int dest, u8 vector) | 1956 | static void target_ht_irq(unsigned int irq, unsigned int dest, u8 vector) |
1862 | { | 1957 | { |
1863 | u32 low, high; | 1958 | struct ht_irq_msg msg; |
1864 | low = read_ht_irq_low(irq); | 1959 | fetch_ht_irq_msg(irq, &msg); |
1865 | high = read_ht_irq_high(irq); | ||
1866 | 1960 | ||
1867 | low &= ~(HT_IRQ_LOW_VECTOR_MASK | HT_IRQ_LOW_DEST_ID_MASK); | 1961 | msg.address_lo &= ~(HT_IRQ_LOW_VECTOR_MASK | HT_IRQ_LOW_DEST_ID_MASK); |
1868 | high &= ~(HT_IRQ_HIGH_DEST_ID_MASK); | 1962 | msg.address_hi &= ~(HT_IRQ_HIGH_DEST_ID_MASK); |
1869 | 1963 | ||
1870 | low |= HT_IRQ_LOW_VECTOR(vector) | HT_IRQ_LOW_DEST_ID(dest); | 1964 | msg.address_lo |= HT_IRQ_LOW_VECTOR(vector) | HT_IRQ_LOW_DEST_ID(dest); |
1871 | high |= HT_IRQ_HIGH_DEST_ID(dest); | 1965 | msg.address_hi |= HT_IRQ_HIGH_DEST_ID(dest); |
1872 | 1966 | ||
1873 | write_ht_irq_low(irq, low); | 1967 | write_ht_irq_msg(irq, &msg); |
1874 | write_ht_irq_high(irq, high); | ||
1875 | } | 1968 | } |
1876 | 1969 | ||
1877 | static void set_ht_irq_affinity(unsigned int irq, cpumask_t mask) | 1970 | static void set_ht_irq_affinity(unsigned int irq, cpumask_t mask) |
@@ -1892,7 +1985,7 @@ static void set_ht_irq_affinity(unsigned int irq, cpumask_t mask) | |||
1892 | 1985 | ||
1893 | dest = cpu_mask_to_apicid(tmp); | 1986 | dest = cpu_mask_to_apicid(tmp); |
1894 | 1987 | ||
1895 | target_ht_irq(irq, dest, vector & 0xff); | 1988 | target_ht_irq(irq, dest, vector); |
1896 | set_native_irq_info(irq, mask); | 1989 | set_native_irq_info(irq, mask); |
1897 | } | 1990 | } |
1898 | #endif | 1991 | #endif |
@@ -1915,14 +2008,15 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) | |||
1915 | 2008 | ||
1916 | vector = assign_irq_vector(irq, TARGET_CPUS, &tmp); | 2009 | vector = assign_irq_vector(irq, TARGET_CPUS, &tmp); |
1917 | if (vector >= 0) { | 2010 | if (vector >= 0) { |
1918 | u32 low, high; | 2011 | struct ht_irq_msg msg; |
1919 | unsigned dest; | 2012 | unsigned dest; |
1920 | 2013 | ||
1921 | dest = cpu_mask_to_apicid(tmp); | 2014 | dest = cpu_mask_to_apicid(tmp); |
1922 | 2015 | ||
1923 | high = HT_IRQ_HIGH_DEST_ID(dest); | 2016 | msg.address_hi = HT_IRQ_HIGH_DEST_ID(dest); |
1924 | 2017 | ||
1925 | low = HT_IRQ_LOW_BASE | | 2018 | msg.address_lo = |
2019 | HT_IRQ_LOW_BASE | | ||
1926 | HT_IRQ_LOW_DEST_ID(dest) | | 2020 | HT_IRQ_LOW_DEST_ID(dest) | |
1927 | HT_IRQ_LOW_VECTOR(vector) | | 2021 | HT_IRQ_LOW_VECTOR(vector) | |
1928 | ((INT_DEST_MODE == 0) ? | 2022 | ((INT_DEST_MODE == 0) ? |
@@ -1931,10 +2025,10 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) | |||
1931 | HT_IRQ_LOW_RQEOI_EDGE | | 2025 | HT_IRQ_LOW_RQEOI_EDGE | |
1932 | ((INT_DELIVERY_MODE != dest_LowestPrio) ? | 2026 | ((INT_DELIVERY_MODE != dest_LowestPrio) ? |
1933 | HT_IRQ_LOW_MT_FIXED : | 2027 | HT_IRQ_LOW_MT_FIXED : |
1934 | HT_IRQ_LOW_MT_ARBITRATED); | 2028 | HT_IRQ_LOW_MT_ARBITRATED) | |
2029 | HT_IRQ_LOW_IRQ_MASKED; | ||
1935 | 2030 | ||
1936 | write_ht_irq_low(irq, low); | 2031 | write_ht_irq_msg(irq, &msg); |
1937 | write_ht_irq_high(irq, high); | ||
1938 | 2032 | ||
1939 | set_irq_chip_and_handler_name(irq, &ht_irq_chip, | 2033 | set_irq_chip_and_handler_name(irq, &ht_irq_chip, |
1940 | handle_edge_irq, "edge"); | 2034 | handle_edge_irq, "edge"); |
diff --git a/arch/x86_64/kernel/pci-calgary.c b/arch/x86_64/kernel/pci-calgary.c index b3296cc2f2f2..37a770859e71 100644 --- a/arch/x86_64/kernel/pci-calgary.c +++ b/arch/x86_64/kernel/pci-calgary.c | |||
@@ -52,7 +52,8 @@ | |||
52 | #define ONE_BASED_CHASSIS_NUM 1 | 52 | #define ONE_BASED_CHASSIS_NUM 1 |
53 | 53 | ||
54 | /* register offsets inside the host bridge space */ | 54 | /* register offsets inside the host bridge space */ |
55 | #define PHB_CSR_OFFSET 0x0110 | 55 | #define CALGARY_CONFIG_REG 0x0108 |
56 | #define PHB_CSR_OFFSET 0x0110 /* Channel Status */ | ||
56 | #define PHB_PLSSR_OFFSET 0x0120 | 57 | #define PHB_PLSSR_OFFSET 0x0120 |
57 | #define PHB_CONFIG_RW_OFFSET 0x0160 | 58 | #define PHB_CONFIG_RW_OFFSET 0x0160 |
58 | #define PHB_IOBASE_BAR_LOW 0x0170 | 59 | #define PHB_IOBASE_BAR_LOW 0x0170 |
@@ -83,6 +84,8 @@ | |||
83 | #define TAR_VALID 0x0000000000000008UL | 84 | #define TAR_VALID 0x0000000000000008UL |
84 | /* CSR (Channel/DMA Status Register) */ | 85 | /* CSR (Channel/DMA Status Register) */ |
85 | #define CSR_AGENT_MASK 0xffe0ffff | 86 | #define CSR_AGENT_MASK 0xffe0ffff |
87 | /* CCR (Calgary Configuration Register) */ | ||
88 | #define CCR_2SEC_TIMEOUT 0x000000000000000EUL | ||
86 | 89 | ||
87 | #define MAX_NUM_OF_PHBS 8 /* how many PHBs in total? */ | 90 | #define MAX_NUM_OF_PHBS 8 /* how many PHBs in total? */ |
88 | #define MAX_NUM_CHASSIS 8 /* max number of chassis */ | 91 | #define MAX_NUM_CHASSIS 8 /* max number of chassis */ |
@@ -732,6 +735,38 @@ static void calgary_watchdog(unsigned long data) | |||
732 | } | 735 | } |
733 | } | 736 | } |
734 | 737 | ||
738 | static void __init calgary_increase_split_completion_timeout(void __iomem *bbar, | ||
739 | unsigned char busnum) | ||
740 | { | ||
741 | u64 val64; | ||
742 | void __iomem *target; | ||
743 | unsigned long phb_shift = -1; | ||
744 | u64 mask; | ||
745 | |||
746 | switch (busno_to_phbid(busnum)) { | ||
747 | case 0: phb_shift = (63 - 19); | ||
748 | break; | ||
749 | case 1: phb_shift = (63 - 23); | ||
750 | break; | ||
751 | case 2: phb_shift = (63 - 27); | ||
752 | break; | ||
753 | case 3: phb_shift = (63 - 35); | ||
754 | break; | ||
755 | default: | ||
756 | BUG_ON(busno_to_phbid(busnum)); | ||
757 | } | ||
758 | |||
759 | target = calgary_reg(bbar, CALGARY_CONFIG_REG); | ||
760 | val64 = be64_to_cpu(readq(target)); | ||
761 | |||
762 | /* zero out this PHB's timer bits */ | ||
763 | mask = ~(0xFUL << phb_shift); | ||
764 | val64 &= mask; | ||
765 | val64 |= (CCR_2SEC_TIMEOUT << phb_shift); | ||
766 | writeq(cpu_to_be64(val64), target); | ||
767 | readq(target); /* flush */ | ||
768 | } | ||
769 | |||
735 | static void __init calgary_enable_translation(struct pci_dev *dev) | 770 | static void __init calgary_enable_translation(struct pci_dev *dev) |
736 | { | 771 | { |
737 | u32 val32; | 772 | u32 val32; |
@@ -756,6 +791,13 @@ static void __init calgary_enable_translation(struct pci_dev *dev) | |||
756 | writel(cpu_to_be32(val32), target); | 791 | writel(cpu_to_be32(val32), target); |
757 | readl(target); /* flush */ | 792 | readl(target); /* flush */ |
758 | 793 | ||
794 | /* | ||
795 | * Give split completion a longer timeout on bus 1 for aic94xx | ||
796 | * http://bugzilla.kernel.org/show_bug.cgi?id=7180 | ||
797 | */ | ||
798 | if (busnum == 1) | ||
799 | calgary_increase_split_completion_timeout(bbar, busnum); | ||
800 | |||
759 | init_timer(&tbl->watchdog_timer); | 801 | init_timer(&tbl->watchdog_timer); |
760 | tbl->watchdog_timer.function = &calgary_watchdog; | 802 | tbl->watchdog_timer.function = &calgary_watchdog; |
761 | tbl->watchdog_timer.data = (unsigned long)dev; | 803 | tbl->watchdog_timer.data = (unsigned long)dev; |
diff --git a/arch/x86_64/kernel/process.c b/arch/x86_64/kernel/process.c index 49f7fac6229e..7451a4c43c16 100644 --- a/arch/x86_64/kernel/process.c +++ b/arch/x86_64/kernel/process.c | |||
@@ -88,9 +88,8 @@ void enter_idle(void) | |||
88 | 88 | ||
89 | static void __exit_idle(void) | 89 | static void __exit_idle(void) |
90 | { | 90 | { |
91 | if (read_pda(isidle) == 0) | 91 | if (test_and_clear_bit_pda(0, isidle) == 0) |
92 | return; | 92 | return; |
93 | write_pda(isidle, 0); | ||
94 | atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL); | 93 | atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL); |
95 | } | 94 | } |
96 | 95 | ||
@@ -145,7 +144,7 @@ static void poll_idle (void) | |||
145 | void cpu_idle_wait(void) | 144 | void cpu_idle_wait(void) |
146 | { | 145 | { |
147 | unsigned int cpu, this_cpu = get_cpu(); | 146 | unsigned int cpu, this_cpu = get_cpu(); |
148 | cpumask_t map; | 147 | cpumask_t map, tmp = current->cpus_allowed; |
149 | 148 | ||
150 | set_cpus_allowed(current, cpumask_of_cpu(this_cpu)); | 149 | set_cpus_allowed(current, cpumask_of_cpu(this_cpu)); |
151 | put_cpu(); | 150 | put_cpu(); |
@@ -168,6 +167,8 @@ void cpu_idle_wait(void) | |||
168 | } | 167 | } |
169 | cpus_and(map, map, cpu_online_map); | 168 | cpus_and(map, map, cpu_online_map); |
170 | } while (!cpus_empty(map)); | 169 | } while (!cpus_empty(map)); |
170 | |||
171 | set_cpus_allowed(current, tmp); | ||
171 | } | 172 | } |
172 | EXPORT_SYMBOL_GPL(cpu_idle_wait); | 173 | EXPORT_SYMBOL_GPL(cpu_idle_wait); |
173 | 174 | ||
diff --git a/arch/x86_64/kernel/smp.c b/arch/x86_64/kernel/smp.c index 4f67697f5036..9f74c883568c 100644 --- a/arch/x86_64/kernel/smp.c +++ b/arch/x86_64/kernel/smp.c | |||
@@ -376,9 +376,8 @@ int smp_call_function_single (int cpu, void (*func) (void *info), void *info, | |||
376 | /* prevent preemption and reschedule on another processor */ | 376 | /* prevent preemption and reschedule on another processor */ |
377 | int me = get_cpu(); | 377 | int me = get_cpu(); |
378 | if (cpu == me) { | 378 | if (cpu == me) { |
379 | WARN_ON(1); | ||
380 | put_cpu(); | 379 | put_cpu(); |
381 | return -EBUSY; | 380 | return 0; |
382 | } | 381 | } |
383 | spin_lock_bh(&call_lock); | 382 | spin_lock_bh(&call_lock); |
384 | __smp_call_function_single(cpu, func, info, nonatomic, wait); | 383 | __smp_call_function_single(cpu, func, info, nonatomic, wait); |
diff --git a/arch/x86_64/kernel/smpboot.c b/arch/x86_64/kernel/smpboot.c index 7b7a6870288a..62c2e747af58 100644 --- a/arch/x86_64/kernel/smpboot.c +++ b/arch/x86_64/kernel/smpboot.c | |||
@@ -581,12 +581,16 @@ void __cpuinit start_secondary(void) | |||
581 | * smp_call_function(). | 581 | * smp_call_function(). |
582 | */ | 582 | */ |
583 | lock_ipi_call_lock(); | 583 | lock_ipi_call_lock(); |
584 | spin_lock(&vector_lock); | ||
584 | 585 | ||
586 | /* Setup the per cpu irq handling data structures */ | ||
587 | __setup_vector_irq(smp_processor_id()); | ||
585 | /* | 588 | /* |
586 | * Allow the master to continue. | 589 | * Allow the master to continue. |
587 | */ | 590 | */ |
588 | cpu_set(smp_processor_id(), cpu_online_map); | 591 | cpu_set(smp_processor_id(), cpu_online_map); |
589 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; | 592 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; |
593 | spin_unlock(&vector_lock); | ||
590 | unlock_ipi_call_lock(); | 594 | unlock_ipi_call_lock(); |
591 | 595 | ||
592 | cpu_idle(); | 596 | cpu_idle(); |
@@ -799,7 +803,6 @@ static int __cpuinit do_boot_cpu(int cpu, int apicid) | |||
799 | cpu, node); | 803 | cpu, node); |
800 | } | 804 | } |
801 | 805 | ||
802 | |||
803 | alternatives_smp_switch(1); | 806 | alternatives_smp_switch(1); |
804 | 807 | ||
805 | c_idle.idle = get_idle_for_cpu(cpu); | 808 | c_idle.idle = get_idle_for_cpu(cpu); |
@@ -1246,8 +1249,10 @@ int __cpu_disable(void) | |||
1246 | local_irq_disable(); | 1249 | local_irq_disable(); |
1247 | remove_siblinginfo(cpu); | 1250 | remove_siblinginfo(cpu); |
1248 | 1251 | ||
1252 | spin_lock(&vector_lock); | ||
1249 | /* It's now safe to remove this processor from the online map */ | 1253 | /* It's now safe to remove this processor from the online map */ |
1250 | cpu_clear(cpu, cpu_online_map); | 1254 | cpu_clear(cpu, cpu_online_map); |
1255 | spin_unlock(&vector_lock); | ||
1251 | remove_cpu_from_maps(); | 1256 | remove_cpu_from_maps(); |
1252 | fixup_irqs(cpu_online_map); | 1257 | fixup_irqs(cpu_online_map); |
1253 | return 0; | 1258 | return 0; |
diff --git a/arch/x86_64/kernel/time.c b/arch/x86_64/kernel/time.c index 1ba5a442ac32..e3ef544d2cfb 100644 --- a/arch/x86_64/kernel/time.c +++ b/arch/x86_64/kernel/time.c | |||
@@ -876,15 +876,6 @@ static struct irqaction irq0 = { | |||
876 | timer_interrupt, IRQF_DISABLED, CPU_MASK_NONE, "timer", NULL, NULL | 876 | timer_interrupt, IRQF_DISABLED, CPU_MASK_NONE, "timer", NULL, NULL |
877 | }; | 877 | }; |
878 | 878 | ||
879 | static int __cpuinit | ||
880 | time_cpu_notifier(struct notifier_block *nb, unsigned long action, void *hcpu) | ||
881 | { | ||
882 | unsigned cpu = (unsigned long) hcpu; | ||
883 | if (action == CPU_ONLINE) | ||
884 | vsyscall_set_cpu(cpu); | ||
885 | return NOTIFY_DONE; | ||
886 | } | ||
887 | |||
888 | void __init time_init(void) | 879 | void __init time_init(void) |
889 | { | 880 | { |
890 | if (nohpet) | 881 | if (nohpet) |
@@ -925,8 +916,6 @@ void __init time_init(void) | |||
925 | vxtime.last_tsc = get_cycles_sync(); | 916 | vxtime.last_tsc = get_cycles_sync(); |
926 | set_cyc2ns_scale(cpu_khz); | 917 | set_cyc2ns_scale(cpu_khz); |
927 | setup_irq(0, &irq0); | 918 | setup_irq(0, &irq0); |
928 | hotcpu_notifier(time_cpu_notifier, 0); | ||
929 | time_cpu_notifier(NULL, CPU_ONLINE, (void *)(long)smp_processor_id()); | ||
930 | 919 | ||
931 | #ifndef CONFIG_SMP | 920 | #ifndef CONFIG_SMP |
932 | time_init_gtod(); | 921 | time_init_gtod(); |
@@ -948,7 +937,7 @@ __cpuinit int unsynchronized_tsc(void) | |||
948 | if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) { | 937 | if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) { |
949 | #ifdef CONFIG_ACPI | 938 | #ifdef CONFIG_ACPI |
950 | /* But TSC doesn't tick in C3 so don't use it there */ | 939 | /* But TSC doesn't tick in C3 so don't use it there */ |
951 | if (acpi_fadt.length > 0 && acpi_fadt.plvl3_lat < 100) | 940 | if (acpi_fadt.length > 0 && acpi_fadt.plvl3_lat < 1000) |
952 | return 1; | 941 | return 1; |
953 | #endif | 942 | #endif |
954 | return 0; | 943 | return 0; |
diff --git a/arch/x86_64/kernel/traps.c b/arch/x86_64/kernel/traps.c index 7819022a8db5..0d65b22f229c 100644 --- a/arch/x86_64/kernel/traps.c +++ b/arch/x86_64/kernel/traps.c | |||
@@ -242,12 +242,19 @@ static int dump_trace_unwind(struct unwind_frame_info *info, void *context) | |||
242 | * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack | 242 | * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack |
243 | */ | 243 | */ |
244 | 244 | ||
245 | static inline int valid_stack_ptr(struct thread_info *tinfo, void *p) | ||
246 | { | ||
247 | void *t = (void *)tinfo; | ||
248 | return p > t && p < t + THREAD_SIZE - 3; | ||
249 | } | ||
250 | |||
245 | void dump_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * stack, | 251 | void dump_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * stack, |
246 | struct stacktrace_ops *ops, void *data) | 252 | struct stacktrace_ops *ops, void *data) |
247 | { | 253 | { |
248 | const unsigned cpu = smp_processor_id(); | 254 | const unsigned cpu = smp_processor_id(); |
249 | unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr; | 255 | unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr; |
250 | unsigned used = 0; | 256 | unsigned used = 0; |
257 | struct thread_info *tinfo; | ||
251 | 258 | ||
252 | if (!tsk) | 259 | if (!tsk) |
253 | tsk = current; | 260 | tsk = current; |
@@ -290,6 +297,12 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s | |||
290 | if (tsk && tsk != current) | 297 | if (tsk && tsk != current) |
291 | stack = (unsigned long *)tsk->thread.rsp; | 298 | stack = (unsigned long *)tsk->thread.rsp; |
292 | } | 299 | } |
300 | /* | ||
301 | * Align the stack pointer on word boundary, later loops | ||
302 | * rely on that (and corruption / debug info bugs can cause | ||
303 | * unaligned values here): | ||
304 | */ | ||
305 | stack = (unsigned long *)((unsigned long)stack & ~(sizeof(long)-1)); | ||
293 | 306 | ||
294 | /* | 307 | /* |
295 | * Print function call entries within a stack. 'cond' is the | 308 | * Print function call entries within a stack. 'cond' is the |
@@ -364,7 +377,8 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s | |||
364 | /* | 377 | /* |
365 | * This handles the process stack: | 378 | * This handles the process stack: |
366 | */ | 379 | */ |
367 | HANDLE_STACK (((long) stack & (THREAD_SIZE-1)) != 0); | 380 | tinfo = current_thread_info(); |
381 | HANDLE_STACK (valid_stack_ptr(tinfo, stack)); | ||
368 | #undef HANDLE_STACK | 382 | #undef HANDLE_STACK |
369 | } | 383 | } |
370 | EXPORT_SYMBOL(dump_trace); | 384 | EXPORT_SYMBOL(dump_trace); |
diff --git a/arch/x86_64/kernel/vmlinux.lds.S b/arch/x86_64/kernel/vmlinux.lds.S index b9df2ab6529f..d9534e750d4f 100644 --- a/arch/x86_64/kernel/vmlinux.lds.S +++ b/arch/x86_64/kernel/vmlinux.lds.S | |||
@@ -17,6 +17,7 @@ PHDRS { | |||
17 | text PT_LOAD FLAGS(5); /* R_E */ | 17 | text PT_LOAD FLAGS(5); /* R_E */ |
18 | data PT_LOAD FLAGS(7); /* RWE */ | 18 | data PT_LOAD FLAGS(7); /* RWE */ |
19 | user PT_LOAD FLAGS(7); /* RWE */ | 19 | user PT_LOAD FLAGS(7); /* RWE */ |
20 | data.init PT_LOAD FLAGS(7); /* RWE */ | ||
20 | note PT_NOTE FLAGS(4); /* R__ */ | 21 | note PT_NOTE FLAGS(4); /* R__ */ |
21 | } | 22 | } |
22 | SECTIONS | 23 | SECTIONS |
@@ -59,6 +60,7 @@ SECTIONS | |||
59 | } | 60 | } |
60 | #endif | 61 | #endif |
61 | 62 | ||
63 | . = ALIGN(PAGE_SIZE); /* Align data segment to page size boundary */ | ||
62 | /* Data */ | 64 | /* Data */ |
63 | .data : AT(ADDR(.data) - LOAD_OFFSET) { | 65 | .data : AT(ADDR(.data) - LOAD_OFFSET) { |
64 | *(.data) | 66 | *(.data) |
@@ -131,7 +133,7 @@ SECTIONS | |||
131 | . = ALIGN(8192); /* init_task */ | 133 | . = ALIGN(8192); /* init_task */ |
132 | .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) { | 134 | .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) { |
133 | *(.data.init_task) | 135 | *(.data.init_task) |
134 | } :data | 136 | }:data.init |
135 | 137 | ||
136 | . = ALIGN(4096); | 138 | . = ALIGN(4096); |
137 | .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) { | 139 | .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) { |
@@ -174,13 +176,7 @@ SECTIONS | |||
174 | __setup_end = .; | 176 | __setup_end = .; |
175 | __initcall_start = .; | 177 | __initcall_start = .; |
176 | .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { | 178 | .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { |
177 | *(.initcall1.init) | 179 | INITCALLS |
178 | *(.initcall2.init) | ||
179 | *(.initcall3.init) | ||
180 | *(.initcall4.init) | ||
181 | *(.initcall5.init) | ||
182 | *(.initcall6.init) | ||
183 | *(.initcall7.init) | ||
184 | } | 180 | } |
185 | __initcall_end = .; | 181 | __initcall_end = .; |
186 | __con_initcall_start = .; | 182 | __con_initcall_start = .; |
diff --git a/arch/x86_64/kernel/vsyscall.c b/arch/x86_64/kernel/vsyscall.c index a98b460af6a1..92546c1526f1 100644 --- a/arch/x86_64/kernel/vsyscall.c +++ b/arch/x86_64/kernel/vsyscall.c | |||
@@ -27,6 +27,9 @@ | |||
27 | #include <linux/jiffies.h> | 27 | #include <linux/jiffies.h> |
28 | #include <linux/sysctl.h> | 28 | #include <linux/sysctl.h> |
29 | #include <linux/getcpu.h> | 29 | #include <linux/getcpu.h> |
30 | #include <linux/cpu.h> | ||
31 | #include <linux/smp.h> | ||
32 | #include <linux/notifier.h> | ||
30 | 33 | ||
31 | #include <asm/vsyscall.h> | 34 | #include <asm/vsyscall.h> |
32 | #include <asm/pgtable.h> | 35 | #include <asm/pgtable.h> |
@@ -243,32 +246,17 @@ static ctl_table kernel_root_table2[] = { | |||
243 | 246 | ||
244 | #endif | 247 | #endif |
245 | 248 | ||
246 | static void __cpuinit write_rdtscp_cb(void *info) | 249 | /* Assume __initcall executes before all user space. Hopefully kmod |
247 | { | 250 | doesn't violate that. We'll find out if it does. */ |
248 | write_rdtscp_aux((unsigned long)info); | 251 | static void __cpuinit vsyscall_set_cpu(int cpu) |
249 | } | ||
250 | |||
251 | void __cpuinit vsyscall_set_cpu(int cpu) | ||
252 | { | 252 | { |
253 | unsigned long *d; | 253 | unsigned long *d; |
254 | unsigned long node = 0; | 254 | unsigned long node = 0; |
255 | #ifdef CONFIG_NUMA | 255 | #ifdef CONFIG_NUMA |
256 | node = cpu_to_node[cpu]; | 256 | node = cpu_to_node[cpu]; |
257 | #endif | 257 | #endif |
258 | if (cpu_has(&cpu_data[cpu], X86_FEATURE_RDTSCP)) { | 258 | if (cpu_has(&cpu_data[cpu], X86_FEATURE_RDTSCP)) |
259 | void *info = (void *)((node << 12) | cpu); | 259 | write_rdtscp_aux((node << 12) | cpu); |
260 | /* Can happen on preemptive kernel */ | ||
261 | if (get_cpu() == cpu) | ||
262 | write_rdtscp_cb(info); | ||
263 | #ifdef CONFIG_SMP | ||
264 | else { | ||
265 | /* the notifier is unfortunately not executed on the | ||
266 | target CPU */ | ||
267 | smp_call_function_single(cpu,write_rdtscp_cb,info,0,1); | ||
268 | } | ||
269 | #endif | ||
270 | put_cpu(); | ||
271 | } | ||
272 | 260 | ||
273 | /* Store cpu number in limit so that it can be loaded quickly | 261 | /* Store cpu number in limit so that it can be loaded quickly |
274 | in user space in vgetcpu. | 262 | in user space in vgetcpu. |
@@ -280,6 +268,23 @@ void __cpuinit vsyscall_set_cpu(int cpu) | |||
280 | *d |= (node >> 4) << 48; | 268 | *d |= (node >> 4) << 48; |
281 | } | 269 | } |
282 | 270 | ||
271 | static void __cpuinit cpu_vsyscall_init(void *arg) | ||
272 | { | ||
273 | /* preemption should be already off */ | ||
274 | vsyscall_set_cpu(raw_smp_processor_id()); | ||
275 | } | ||
276 | |||
277 | #ifdef CONFIG_HOTPLUG_CPU | ||
278 | static int __cpuinit | ||
279 | cpu_vsyscall_notifier(struct notifier_block *n, unsigned long action, void *arg) | ||
280 | { | ||
281 | long cpu = (long)arg; | ||
282 | if (action == CPU_ONLINE) | ||
283 | smp_call_function_single(cpu, cpu_vsyscall_init, NULL, 0, 1); | ||
284 | return NOTIFY_DONE; | ||
285 | } | ||
286 | #endif | ||
287 | |||
283 | static void __init map_vsyscall(void) | 288 | static void __init map_vsyscall(void) |
284 | { | 289 | { |
285 | extern char __vsyscall_0; | 290 | extern char __vsyscall_0; |
@@ -299,6 +304,8 @@ static int __init vsyscall_init(void) | |||
299 | #ifdef CONFIG_SYSCTL | 304 | #ifdef CONFIG_SYSCTL |
300 | register_sysctl_table(kernel_root_table2, 0); | 305 | register_sysctl_table(kernel_root_table2, 0); |
301 | #endif | 306 | #endif |
307 | on_each_cpu(cpu_vsyscall_init, NULL, 0, 1); | ||
308 | hotcpu_notifier(cpu_vsyscall_notifier, 0); | ||
302 | return 0; | 309 | return 0; |
303 | } | 310 | } |
304 | 311 | ||
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c index 971dc1181e69..4c0c00ef3ca7 100644 --- a/arch/x86_64/mm/init.c +++ b/arch/x86_64/mm/init.c | |||
@@ -496,7 +496,7 @@ int remove_memory(u64 start, u64 size) | |||
496 | } | 496 | } |
497 | EXPORT_SYMBOL_GPL(remove_memory); | 497 | EXPORT_SYMBOL_GPL(remove_memory); |
498 | 498 | ||
499 | #ifndef CONFIG_ACPI_NUMA | 499 | #if !defined(CONFIG_ACPI_NUMA) && defined(CONFIG_NUMA) |
500 | int memory_add_physaddr_to_nid(u64 start) | 500 | int memory_add_physaddr_to_nid(u64 start) |
501 | { | 501 | { |
502 | return 0; | 502 | return 0; |
@@ -504,13 +504,6 @@ int memory_add_physaddr_to_nid(u64 start) | |||
504 | EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid); | 504 | EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid); |
505 | #endif | 505 | #endif |
506 | 506 | ||
507 | #ifndef CONFIG_ACPI_NUMA | ||
508 | int memory_add_physaddr_to_nid(u64 start) | ||
509 | { | ||
510 | return 0; | ||
511 | } | ||
512 | #endif | ||
513 | |||
514 | #endif /* CONFIG_MEMORY_HOTPLUG */ | 507 | #endif /* CONFIG_MEMORY_HOTPLUG */ |
515 | 508 | ||
516 | #ifdef CONFIG_MEMORY_HOTPLUG_RESERVE | 509 | #ifdef CONFIG_MEMORY_HOTPLUG_RESERVE |
@@ -655,9 +648,22 @@ void free_initrd_mem(unsigned long start, unsigned long end) | |||
655 | 648 | ||
656 | void __init reserve_bootmem_generic(unsigned long phys, unsigned len) | 649 | void __init reserve_bootmem_generic(unsigned long phys, unsigned len) |
657 | { | 650 | { |
658 | /* Should check here against the e820 map to avoid double free */ | ||
659 | #ifdef CONFIG_NUMA | 651 | #ifdef CONFIG_NUMA |
660 | int nid = phys_to_nid(phys); | 652 | int nid = phys_to_nid(phys); |
653 | #endif | ||
654 | unsigned long pfn = phys >> PAGE_SHIFT; | ||
655 | if (pfn >= end_pfn) { | ||
656 | /* This can happen with kdump kernels when accessing firmware | ||
657 | tables. */ | ||
658 | if (pfn < end_pfn_map) | ||
659 | return; | ||
660 | printk(KERN_ERR "reserve_bootmem: illegal reserve %lx %u\n", | ||
661 | phys, len); | ||
662 | return; | ||
663 | } | ||
664 | |||
665 | /* Should check here against the e820 map to avoid double free */ | ||
666 | #ifdef CONFIG_NUMA | ||
661 | reserve_bootmem_node(NODE_DATA(nid), phys, len); | 667 | reserve_bootmem_node(NODE_DATA(nid), phys, len); |
662 | #else | 668 | #else |
663 | reserve_bootmem(phys, len); | 669 | reserve_bootmem(phys, len); |
diff --git a/arch/x86_64/mm/srat.c b/arch/x86_64/mm/srat.c index 3cc0544e25f5..1087e150a218 100644 --- a/arch/x86_64/mm/srat.c +++ b/arch/x86_64/mm/srat.c | |||
@@ -207,7 +207,7 @@ static inline int save_add_info(void) | |||
207 | return hotadd_percent > 0; | 207 | return hotadd_percent > 0; |
208 | } | 208 | } |
209 | #else | 209 | #else |
210 | int update_end_of_memory(unsigned long end) {return 0;} | 210 | int update_end_of_memory(unsigned long end) {return -1;} |
211 | static int hotadd_enough_memory(struct bootnode *nd) {return 1;} | 211 | static int hotadd_enough_memory(struct bootnode *nd) {return 1;} |
212 | #ifdef CONFIG_MEMORY_HOTPLUG_SPARSE | 212 | #ifdef CONFIG_MEMORY_HOTPLUG_SPARSE |
213 | static inline int save_add_info(void) {return 1;} | 213 | static inline int save_add_info(void) {return 1;} |
@@ -337,7 +337,7 @@ acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma) | |||
337 | push_node_boundaries(node, nd->start >> PAGE_SHIFT, | 337 | push_node_boundaries(node, nd->start >> PAGE_SHIFT, |
338 | nd->end >> PAGE_SHIFT); | 338 | nd->end >> PAGE_SHIFT); |
339 | 339 | ||
340 | if (ma->flags.hot_pluggable && !reserve_hotadd(node, start, end) < 0) { | 340 | if (ma->flags.hot_pluggable && (reserve_hotadd(node, start, end) < 0)) { |
341 | /* Ignore hotadd region. Undo damage */ | 341 | /* Ignore hotadd region. Undo damage */ |
342 | printk(KERN_NOTICE "SRAT: Hotplug region ignored\n"); | 342 | printk(KERN_NOTICE "SRAT: Hotplug region ignored\n"); |
343 | *nd = oldnode; | 343 | *nd = oldnode; |
diff --git a/arch/x86_64/pci/Makefile b/arch/x86_64/pci/Makefile index 1eb18f421edf..149aba05a5b8 100644 --- a/arch/x86_64/pci/Makefile +++ b/arch/x86_64/pci/Makefile | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | # Reuse the i386 PCI subsystem | 4 | # Reuse the i386 PCI subsystem |
5 | # | 5 | # |
6 | CFLAGS += -Iarch/i386/pci | 6 | EXTRA_CFLAGS += -Iarch/i386/pci |
7 | 7 | ||
8 | obj-y := i386.o | 8 | obj-y := i386.o |
9 | obj-$(CONFIG_PCI_DIRECT)+= direct.o | 9 | obj-$(CONFIG_PCI_DIRECT)+= direct.o |
diff --git a/arch/x86_64/pci/mmconfig.c b/arch/x86_64/pci/mmconfig.c index 7732f4254d21..f8b6b2800a62 100644 --- a/arch/x86_64/pci/mmconfig.c +++ b/arch/x86_64/pci/mmconfig.c | |||
@@ -163,37 +163,6 @@ static __init void unreachable_devices(void) | |||
163 | } | 163 | } |
164 | } | 164 | } |
165 | 165 | ||
166 | static __init void pci_mmcfg_insert_resources(void) | ||
167 | { | ||
168 | #define PCI_MMCFG_RESOURCE_NAME_LEN 19 | ||
169 | int i; | ||
170 | struct resource *res; | ||
171 | char *names; | ||
172 | unsigned num_buses; | ||
173 | |||
174 | res = kcalloc(PCI_MMCFG_RESOURCE_NAME_LEN + sizeof(*res), | ||
175 | pci_mmcfg_config_num, GFP_KERNEL); | ||
176 | |||
177 | if (!res) { | ||
178 | printk(KERN_ERR "PCI: Unable to allocate MMCONFIG resources\n"); | ||
179 | return; | ||
180 | } | ||
181 | |||
182 | names = (void *)&res[pci_mmcfg_config_num]; | ||
183 | for (i = 0; i < pci_mmcfg_config_num; i++, res++) { | ||
184 | num_buses = pci_mmcfg_config[i].end_bus_number - | ||
185 | pci_mmcfg_config[i].start_bus_number + 1; | ||
186 | res->name = names; | ||
187 | snprintf(names, PCI_MMCFG_RESOURCE_NAME_LEN, "PCI MMCONFIG %u", | ||
188 | pci_mmcfg_config[i].pci_segment_group_number); | ||
189 | res->start = pci_mmcfg_config[i].base_address; | ||
190 | res->end = res->start + (num_buses << 20) - 1; | ||
191 | res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; | ||
192 | insert_resource(&iomem_resource, res); | ||
193 | names += PCI_MMCFG_RESOURCE_NAME_LEN; | ||
194 | } | ||
195 | } | ||
196 | |||
197 | void __init pci_mmcfg_init(int type) | 166 | void __init pci_mmcfg_init(int type) |
198 | { | 167 | { |
199 | int i; | 168 | int i; |
@@ -220,7 +189,7 @@ void __init pci_mmcfg_init(int type) | |||
220 | 189 | ||
221 | pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num, GFP_KERNEL); | 190 | pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num, GFP_KERNEL); |
222 | if (pci_mmcfg_virt == NULL) { | 191 | if (pci_mmcfg_virt == NULL) { |
223 | printk("PCI: Can not allocate memory for mmconfig structures\n"); | 192 | printk(KERN_ERR "PCI: Can not allocate memory for mmconfig structures\n"); |
224 | return; | 193 | return; |
225 | } | 194 | } |
226 | for (i = 0; i < pci_mmcfg_config_num; ++i) { | 195 | for (i = 0; i < pci_mmcfg_config_num; ++i) { |
@@ -228,7 +197,8 @@ void __init pci_mmcfg_init(int type) | |||
228 | pci_mmcfg_virt[i].virt = ioremap_nocache(pci_mmcfg_config[i].base_address, | 197 | pci_mmcfg_virt[i].virt = ioremap_nocache(pci_mmcfg_config[i].base_address, |
229 | MMCONFIG_APER_MAX); | 198 | MMCONFIG_APER_MAX); |
230 | if (!pci_mmcfg_virt[i].virt) { | 199 | if (!pci_mmcfg_virt[i].virt) { |
231 | printk("PCI: Cannot map mmconfig aperture for segment %d\n", | 200 | printk(KERN_ERR "PCI: Cannot map mmconfig aperture for " |
201 | "segment %d\n", | ||
232 | pci_mmcfg_config[i].pci_segment_group_number); | 202 | pci_mmcfg_config[i].pci_segment_group_number); |
233 | return; | 203 | return; |
234 | } | 204 | } |
@@ -236,7 +206,6 @@ void __init pci_mmcfg_init(int type) | |||
236 | } | 206 | } |
237 | 207 | ||
238 | unreachable_devices(); | 208 | unreachable_devices(); |
239 | pci_mmcfg_insert_resources(); | ||
240 | 209 | ||
241 | raw_pci_ops = &pci_mmcfg; | 210 | raw_pci_ops = &pci_mmcfg; |
242 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; | 211 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; |
diff --git a/arch/xtensa/kernel/vmlinux.lds.S b/arch/xtensa/kernel/vmlinux.lds.S index ab6cdbd5eb68..cfe75f528725 100644 --- a/arch/xtensa/kernel/vmlinux.lds.S +++ b/arch/xtensa/kernel/vmlinux.lds.S | |||
@@ -184,13 +184,7 @@ SECTIONS | |||
184 | 184 | ||
185 | __initcall_start = .; | 185 | __initcall_start = .; |
186 | .initcall.init : { | 186 | .initcall.init : { |
187 | *(.initcall1.init) | 187 | INITCALLS |
188 | *(.initcall2.init) | ||
189 | *(.initcall3.init) | ||
190 | *(.initcall4.init) | ||
191 | *(.initcall5.init) | ||
192 | *(.initcall6.init) | ||
193 | *(.initcall7.init) | ||
194 | } | 188 | } |
195 | __initcall_end = .; | 189 | __initcall_end = .; |
196 | 190 | ||
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index d3d76136f53a..1d9c3c70a9a0 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -456,6 +456,9 @@ static void cfq_add_rq_rb(struct request *rq) | |||
456 | */ | 456 | */ |
457 | while ((__alias = elv_rb_add(&cfqq->sort_list, rq)) != NULL) | 457 | while ((__alias = elv_rb_add(&cfqq->sort_list, rq)) != NULL) |
458 | cfq_dispatch_insert(cfqd->queue, __alias); | 458 | cfq_dispatch_insert(cfqd->queue, __alias); |
459 | |||
460 | if (!cfq_cfqq_on_rr(cfqq)) | ||
461 | cfq_add_cfqq_rr(cfqd, cfqq); | ||
459 | } | 462 | } |
460 | 463 | ||
461 | static inline void | 464 | static inline void |
@@ -1215,11 +1218,12 @@ static inline void changed_ioprio(struct cfq_io_context *cic) | |||
1215 | { | 1218 | { |
1216 | struct cfq_data *cfqd = cic->key; | 1219 | struct cfq_data *cfqd = cic->key; |
1217 | struct cfq_queue *cfqq; | 1220 | struct cfq_queue *cfqq; |
1221 | unsigned long flags; | ||
1218 | 1222 | ||
1219 | if (unlikely(!cfqd)) | 1223 | if (unlikely(!cfqd)) |
1220 | return; | 1224 | return; |
1221 | 1225 | ||
1222 | spin_lock(cfqd->queue->queue_lock); | 1226 | spin_lock_irqsave(cfqd->queue->queue_lock, flags); |
1223 | 1227 | ||
1224 | cfqq = cic->cfqq[ASYNC]; | 1228 | cfqq = cic->cfqq[ASYNC]; |
1225 | if (cfqq) { | 1229 | if (cfqq) { |
@@ -1236,7 +1240,7 @@ static inline void changed_ioprio(struct cfq_io_context *cic) | |||
1236 | if (cfqq) | 1240 | if (cfqq) |
1237 | cfq_mark_cfqq_prio_changed(cfqq); | 1241 | cfq_mark_cfqq_prio_changed(cfqq); |
1238 | 1242 | ||
1239 | spin_unlock(cfqd->queue->queue_lock); | 1243 | spin_unlock_irqrestore(cfqd->queue->queue_lock, flags); |
1240 | } | 1244 | } |
1241 | 1245 | ||
1242 | static void cfq_ioc_set_ioprio(struct io_context *ioc) | 1246 | static void cfq_ioc_set_ioprio(struct io_context *ioc) |
@@ -1362,6 +1366,7 @@ cfq_cic_link(struct cfq_data *cfqd, struct io_context *ioc, | |||
1362 | struct rb_node **p; | 1366 | struct rb_node **p; |
1363 | struct rb_node *parent; | 1367 | struct rb_node *parent; |
1364 | struct cfq_io_context *__cic; | 1368 | struct cfq_io_context *__cic; |
1369 | unsigned long flags; | ||
1365 | void *k; | 1370 | void *k; |
1366 | 1371 | ||
1367 | cic->ioc = ioc; | 1372 | cic->ioc = ioc; |
@@ -1391,9 +1396,9 @@ restart: | |||
1391 | rb_link_node(&cic->rb_node, parent, p); | 1396 | rb_link_node(&cic->rb_node, parent, p); |
1392 | rb_insert_color(&cic->rb_node, &ioc->cic_root); | 1397 | rb_insert_color(&cic->rb_node, &ioc->cic_root); |
1393 | 1398 | ||
1394 | spin_lock_irq(cfqd->queue->queue_lock); | 1399 | spin_lock_irqsave(cfqd->queue->queue_lock, flags); |
1395 | list_add(&cic->queue_list, &cfqd->cic_list); | 1400 | list_add(&cic->queue_list, &cfqd->cic_list); |
1396 | spin_unlock_irq(cfqd->queue->queue_lock); | 1401 | spin_unlock_irqrestore(cfqd->queue->queue_lock, flags); |
1397 | } | 1402 | } |
1398 | 1403 | ||
1399 | /* | 1404 | /* |
@@ -1650,9 +1655,6 @@ static void cfq_insert_request(request_queue_t *q, struct request *rq) | |||
1650 | 1655 | ||
1651 | cfq_add_rq_rb(rq); | 1656 | cfq_add_rq_rb(rq); |
1652 | 1657 | ||
1653 | if (!cfq_cfqq_on_rr(cfqq)) | ||
1654 | cfq_add_cfqq_rr(cfqd, cfqq); | ||
1655 | |||
1656 | list_add_tail(&rq->queuelist, &cfqq->fifo); | 1658 | list_add_tail(&rq->queuelist, &cfqq->fifo); |
1657 | 1659 | ||
1658 | cfq_rq_enqueued(cfqd, cfqq, rq); | 1660 | cfq_rq_enqueued(cfqd, cfqq, rq); |
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c index 136066583c68..9eaee6640535 100644 --- a/block/ll_rw_blk.c +++ b/block/ll_rw_blk.c | |||
@@ -2999,6 +2999,7 @@ void generic_make_request(struct bio *bio) | |||
2999 | { | 2999 | { |
3000 | request_queue_t *q; | 3000 | request_queue_t *q; |
3001 | sector_t maxsector; | 3001 | sector_t maxsector; |
3002 | sector_t old_sector; | ||
3002 | int ret, nr_sectors = bio_sectors(bio); | 3003 | int ret, nr_sectors = bio_sectors(bio); |
3003 | dev_t old_dev; | 3004 | dev_t old_dev; |
3004 | 3005 | ||
@@ -3027,7 +3028,7 @@ void generic_make_request(struct bio *bio) | |||
3027 | * NOTE: we don't repeat the blk_size check for each new device. | 3028 | * NOTE: we don't repeat the blk_size check for each new device. |
3028 | * Stacking drivers are expected to know what they are doing. | 3029 | * Stacking drivers are expected to know what they are doing. |
3029 | */ | 3030 | */ |
3030 | maxsector = -1; | 3031 | old_sector = -1; |
3031 | old_dev = 0; | 3032 | old_dev = 0; |
3032 | do { | 3033 | do { |
3033 | char b[BDEVNAME_SIZE]; | 3034 | char b[BDEVNAME_SIZE]; |
@@ -3061,15 +3062,31 @@ end_io: | |||
3061 | */ | 3062 | */ |
3062 | blk_partition_remap(bio); | 3063 | blk_partition_remap(bio); |
3063 | 3064 | ||
3064 | if (maxsector != -1) | 3065 | if (old_sector != -1) |
3065 | blk_add_trace_remap(q, bio, old_dev, bio->bi_sector, | 3066 | blk_add_trace_remap(q, bio, old_dev, bio->bi_sector, |
3066 | maxsector); | 3067 | old_sector); |
3067 | 3068 | ||
3068 | blk_add_trace_bio(q, bio, BLK_TA_QUEUE); | 3069 | blk_add_trace_bio(q, bio, BLK_TA_QUEUE); |
3069 | 3070 | ||
3070 | maxsector = bio->bi_sector; | 3071 | old_sector = bio->bi_sector; |
3071 | old_dev = bio->bi_bdev->bd_dev; | 3072 | old_dev = bio->bi_bdev->bd_dev; |
3072 | 3073 | ||
3074 | maxsector = bio->bi_bdev->bd_inode->i_size >> 9; | ||
3075 | if (maxsector) { | ||
3076 | sector_t sector = bio->bi_sector; | ||
3077 | |||
3078 | if (maxsector < nr_sectors || | ||
3079 | maxsector - nr_sectors < sector) { | ||
3080 | /* | ||
3081 | * This may well happen - partitions are not | ||
3082 | * checked to make sure they are within the size | ||
3083 | * of the whole device. | ||
3084 | */ | ||
3085 | handle_bad_sector(bio); | ||
3086 | goto end_io; | ||
3087 | } | ||
3088 | } | ||
3089 | |||
3073 | ret = q->make_request_fn(q, bio); | 3090 | ret = q->make_request_fn(q, bio); |
3074 | } while (ret); | 3091 | } while (ret); |
3075 | } | 3092 | } |
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index 2dc326421a24..e55a75621437 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c | |||
@@ -246,10 +246,10 @@ static int sg_io(struct file *file, request_queue_t *q, | |||
246 | switch (hdr->dxfer_direction) { | 246 | switch (hdr->dxfer_direction) { |
247 | default: | 247 | default: |
248 | return -EINVAL; | 248 | return -EINVAL; |
249 | case SG_DXFER_TO_FROM_DEV: | ||
250 | case SG_DXFER_TO_DEV: | 249 | case SG_DXFER_TO_DEV: |
251 | writing = 1; | 250 | writing = 1; |
252 | break; | 251 | break; |
252 | case SG_DXFER_TO_FROM_DEV: | ||
253 | case SG_DXFER_FROM_DEV: | 253 | case SG_DXFER_FROM_DEV: |
254 | break; | 254 | break; |
255 | } | 255 | } |
@@ -286,9 +286,8 @@ static int sg_io(struct file *file, request_queue_t *q, | |||
286 | * fill in request structure | 286 | * fill in request structure |
287 | */ | 287 | */ |
288 | rq->cmd_len = hdr->cmd_len; | 288 | rq->cmd_len = hdr->cmd_len; |
289 | memset(rq->cmd, 0, BLK_MAX_CDB); /* ATAPI hates garbage after CDB */ | ||
289 | memcpy(rq->cmd, cmd, hdr->cmd_len); | 290 | memcpy(rq->cmd, cmd, hdr->cmd_len); |
290 | if (sizeof(rq->cmd) != hdr->cmd_len) | ||
291 | memset(rq->cmd + hdr->cmd_len, 0, sizeof(rq->cmd) - hdr->cmd_len); | ||
292 | 291 | ||
293 | memset(sense, 0, sizeof(sense)); | 292 | memset(sense, 0, sizeof(sense)); |
294 | rq->sense = sense; | 293 | rq->sense = sense; |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index c84286cbbe25..068fe4f100b0 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
@@ -73,7 +73,6 @@ static unsigned int acpi_irq_irq; | |||
73 | static acpi_osd_handler acpi_irq_handler; | 73 | static acpi_osd_handler acpi_irq_handler; |
74 | static void *acpi_irq_context; | 74 | static void *acpi_irq_context; |
75 | static struct workqueue_struct *kacpid_wq; | 75 | static struct workqueue_struct *kacpid_wq; |
76 | static struct workqueue_struct *kacpi_notify_wq; | ||
77 | 76 | ||
78 | acpi_status acpi_os_initialize(void) | 77 | acpi_status acpi_os_initialize(void) |
79 | { | 78 | { |
@@ -92,9 +91,8 @@ acpi_status acpi_os_initialize1(void) | |||
92 | return AE_NULL_ENTRY; | 91 | return AE_NULL_ENTRY; |
93 | } | 92 | } |
94 | kacpid_wq = create_singlethread_workqueue("kacpid"); | 93 | kacpid_wq = create_singlethread_workqueue("kacpid"); |
95 | kacpi_notify_wq = create_singlethread_workqueue("kacpi_notify"); | ||
96 | BUG_ON(!kacpid_wq); | 94 | BUG_ON(!kacpid_wq); |
97 | BUG_ON(!kacpi_notify_wq); | 95 | |
98 | return AE_OK; | 96 | return AE_OK; |
99 | } | 97 | } |
100 | 98 | ||
@@ -106,7 +104,6 @@ acpi_status acpi_os_terminate(void) | |||
106 | } | 104 | } |
107 | 105 | ||
108 | destroy_workqueue(kacpid_wq); | 106 | destroy_workqueue(kacpid_wq); |
109 | destroy_workqueue(kacpi_notify_wq); | ||
110 | 107 | ||
111 | return AE_OK; | 108 | return AE_OK; |
112 | } | 109 | } |
@@ -569,7 +566,10 @@ void acpi_os_derive_pci_id(acpi_handle rhandle, /* upper bound */ | |||
569 | 566 | ||
570 | static void acpi_os_execute_deferred(void *context) | 567 | static void acpi_os_execute_deferred(void *context) |
571 | { | 568 | { |
572 | struct acpi_os_dpc *dpc = (struct acpi_os_dpc *)context; | 569 | struct acpi_os_dpc *dpc = NULL; |
570 | |||
571 | |||
572 | dpc = (struct acpi_os_dpc *)context; | ||
573 | if (!dpc) { | 573 | if (!dpc) { |
574 | printk(KERN_ERR PREFIX "Invalid (NULL) context\n"); | 574 | printk(KERN_ERR PREFIX "Invalid (NULL) context\n"); |
575 | return; | 575 | return; |
@@ -604,12 +604,14 @@ acpi_status acpi_os_execute(acpi_execute_type type, | |||
604 | struct acpi_os_dpc *dpc; | 604 | struct acpi_os_dpc *dpc; |
605 | struct work_struct *task; | 605 | struct work_struct *task; |
606 | 606 | ||
607 | ACPI_FUNCTION_TRACE("os_queue_for_execution"); | ||
608 | |||
607 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | 609 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, |
608 | "Scheduling function [%p(%p)] for deferred execution.\n", | 610 | "Scheduling function [%p(%p)] for deferred execution.\n", |
609 | function, context)); | 611 | function, context)); |
610 | 612 | ||
611 | if (!function) | 613 | if (!function) |
612 | return AE_BAD_PARAMETER; | 614 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
613 | 615 | ||
614 | /* | 616 | /* |
615 | * Allocate/initialize DPC structure. Note that this memory will be | 617 | * Allocate/initialize DPC structure. Note that this memory will be |
@@ -622,20 +624,26 @@ acpi_status acpi_os_execute(acpi_execute_type type, | |||
622 | * from the same memory. | 624 | * from the same memory. |
623 | */ | 625 | */ |
624 | 626 | ||
625 | dpc = kmalloc(sizeof(struct acpi_os_dpc) + | 627 | dpc = |
626 | sizeof(struct work_struct), GFP_ATOMIC); | 628 | kmalloc(sizeof(struct acpi_os_dpc) + sizeof(struct work_struct), |
629 | GFP_ATOMIC); | ||
627 | if (!dpc) | 630 | if (!dpc) |
628 | return AE_NO_MEMORY; | 631 | return_ACPI_STATUS(AE_NO_MEMORY); |
632 | |||
629 | dpc->function = function; | 633 | dpc->function = function; |
630 | dpc->context = context; | 634 | dpc->context = context; |
635 | |||
631 | task = (void *)(dpc + 1); | 636 | task = (void *)(dpc + 1); |
632 | INIT_WORK(task, acpi_os_execute_deferred, (void *)dpc); | 637 | INIT_WORK(task, acpi_os_execute_deferred, (void *)dpc); |
633 | if (!queue_work((type == OSL_NOTIFY_HANDLER)? | 638 | |
634 | kacpi_notify_wq : kacpid_wq, task)) { | 639 | if (!queue_work(kacpid_wq, task)) { |
635 | status = AE_ERROR; | 640 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
641 | "Call to queue_work() failed.\n")); | ||
636 | kfree(dpc); | 642 | kfree(dpc); |
643 | status = AE_ERROR; | ||
637 | } | 644 | } |
638 | return status; | 645 | |
646 | return_ACPI_STATUS(status); | ||
639 | } | 647 | } |
640 | 648 | ||
641 | EXPORT_SYMBOL(acpi_os_execute); | 649 | EXPORT_SYMBOL(acpi_os_execute); |
diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c index 7ba5e49ab302..6fd174a37149 100644 --- a/drivers/acpi/processor_perflib.c +++ b/drivers/acpi/processor_perflib.c | |||
@@ -83,10 +83,8 @@ static int acpi_processor_ppc_notifier(struct notifier_block *nb, | |||
83 | goto out; | 83 | goto out; |
84 | 84 | ||
85 | ppc = (unsigned int)pr->performance_platform_limit; | 85 | ppc = (unsigned int)pr->performance_platform_limit; |
86 | if (!ppc) | ||
87 | goto out; | ||
88 | 86 | ||
89 | if (ppc > pr->performance->state_count) | 87 | if (ppc >= pr->performance->state_count) |
90 | goto out; | 88 | goto out; |
91 | 89 | ||
92 | cpufreq_verify_within_limits(policy, 0, | 90 | cpufreq_verify_within_limits(policy, 0, |
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index 3f4aa0c99ee4..03f6338acc8f 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
@@ -6,6 +6,7 @@ menu "Serial ATA (prod) and Parallel ATA (experimental) drivers" | |||
6 | 6 | ||
7 | config ATA | 7 | config ATA |
8 | tristate "ATA device support" | 8 | tristate "ATA device support" |
9 | depends on BLOCK | ||
9 | depends on !(M32R || M68K) || BROKEN | 10 | depends on !(M32R || M68K) || BROKEN |
10 | depends on !SUN4 || BROKEN | 11 | depends on !SUN4 || BROKEN |
11 | select SCSI | 12 | select SCSI |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 25929123ffff..f510e1196dc6 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -314,6 +314,17 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
314 | { PCI_VDEVICE(INTEL, 0x2824), board_ahci }, /* ICH8 */ | 314 | { PCI_VDEVICE(INTEL, 0x2824), board_ahci }, /* ICH8 */ |
315 | { PCI_VDEVICE(INTEL, 0x2829), board_ahci }, /* ICH8M */ | 315 | { PCI_VDEVICE(INTEL, 0x2829), board_ahci }, /* ICH8M */ |
316 | { PCI_VDEVICE(INTEL, 0x282a), board_ahci }, /* ICH8M */ | 316 | { PCI_VDEVICE(INTEL, 0x282a), board_ahci }, /* ICH8M */ |
317 | { PCI_VDEVICE(INTEL, 0x2922), board_ahci }, /* ICH9 */ | ||
318 | { PCI_VDEVICE(INTEL, 0x2923), board_ahci }, /* ICH9 */ | ||
319 | { PCI_VDEVICE(INTEL, 0x2924), board_ahci }, /* ICH9 */ | ||
320 | { PCI_VDEVICE(INTEL, 0x2925), board_ahci }, /* ICH9 */ | ||
321 | { PCI_VDEVICE(INTEL, 0x2927), board_ahci }, /* ICH9 */ | ||
322 | { PCI_VDEVICE(INTEL, 0x2929), board_ahci }, /* ICH9M */ | ||
323 | { PCI_VDEVICE(INTEL, 0x292a), board_ahci }, /* ICH9M */ | ||
324 | { PCI_VDEVICE(INTEL, 0x292b), board_ahci }, /* ICH9M */ | ||
325 | { PCI_VDEVICE(INTEL, 0x292f), board_ahci }, /* ICH9M */ | ||
326 | { PCI_VDEVICE(INTEL, 0x294d), board_ahci }, /* ICH9 */ | ||
327 | { PCI_VDEVICE(INTEL, 0x294e), board_ahci }, /* ICH9M */ | ||
317 | 328 | ||
318 | /* JMicron */ | 329 | /* JMicron */ |
319 | { PCI_VDEVICE(JMICRON, 0x2360), board_ahci }, /* JMicron JMB360 */ | 330 | { PCI_VDEVICE(JMICRON, 0x2360), board_ahci }, /* JMicron JMB360 */ |
@@ -334,6 +345,14 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
334 | { PCI_VDEVICE(NVIDIA, 0x044d), board_ahci }, /* MCP65 */ | 345 | { PCI_VDEVICE(NVIDIA, 0x044d), board_ahci }, /* MCP65 */ |
335 | { PCI_VDEVICE(NVIDIA, 0x044e), board_ahci }, /* MCP65 */ | 346 | { PCI_VDEVICE(NVIDIA, 0x044e), board_ahci }, /* MCP65 */ |
336 | { PCI_VDEVICE(NVIDIA, 0x044f), board_ahci }, /* MCP65 */ | 347 | { PCI_VDEVICE(NVIDIA, 0x044f), board_ahci }, /* MCP65 */ |
348 | { PCI_VDEVICE(NVIDIA, 0x0554), board_ahci }, /* MCP67 */ | ||
349 | { PCI_VDEVICE(NVIDIA, 0x0555), board_ahci }, /* MCP67 */ | ||
350 | { PCI_VDEVICE(NVIDIA, 0x0556), board_ahci }, /* MCP67 */ | ||
351 | { PCI_VDEVICE(NVIDIA, 0x0557), board_ahci }, /* MCP67 */ | ||
352 | { PCI_VDEVICE(NVIDIA, 0x0558), board_ahci }, /* MCP67 */ | ||
353 | { PCI_VDEVICE(NVIDIA, 0x0559), board_ahci }, /* MCP67 */ | ||
354 | { PCI_VDEVICE(NVIDIA, 0x055a), board_ahci }, /* MCP67 */ | ||
355 | { PCI_VDEVICE(NVIDIA, 0x055b), board_ahci }, /* MCP67 */ | ||
337 | 356 | ||
338 | /* SiS */ | 357 | /* SiS */ |
339 | { PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */ | 358 | { PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */ |
@@ -736,8 +755,7 @@ static int ahci_softreset(struct ata_port *ap, unsigned int *class) | |||
736 | } | 755 | } |
737 | 756 | ||
738 | /* check BUSY/DRQ, perform Command List Override if necessary */ | 757 | /* check BUSY/DRQ, perform Command List Override if necessary */ |
739 | ahci_tf_read(ap, &tf); | 758 | if (ahci_check_status(ap) & (ATA_BUSY | ATA_DRQ)) { |
740 | if (tf.command & (ATA_BUSY | ATA_DRQ)) { | ||
741 | rc = ahci_clo(ap); | 759 | rc = ahci_clo(ap); |
742 | 760 | ||
743 | if (rc == -EOPNOTSUPP) { | 761 | if (rc == -EOPNOTSUPP) { |
@@ -1041,7 +1059,7 @@ static void ahci_host_intr(struct ata_port *ap) | |||
1041 | /* hmmm... a spurious interupt */ | 1059 | /* hmmm... a spurious interupt */ |
1042 | 1060 | ||
1043 | /* some devices send D2H reg with I bit set during NCQ command phase */ | 1061 | /* some devices send D2H reg with I bit set during NCQ command phase */ |
1044 | if (ap->sactive && status & PORT_IRQ_D2H_REG_FIS) | 1062 | if (ap->sactive && (status & PORT_IRQ_D2H_REG_FIS)) |
1045 | return; | 1063 | return; |
1046 | 1064 | ||
1047 | /* ignore interim PIO setup fis interrupts */ | 1065 | /* ignore interim PIO setup fis interrupts */ |
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 5719704eb0ee..720174d628fa 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
@@ -126,8 +126,7 @@ enum { | |||
126 | ich6_sata = 7, | 126 | ich6_sata = 7, |
127 | ich6_sata_ahci = 8, | 127 | ich6_sata_ahci = 8, |
128 | ich6m_sata_ahci = 9, | 128 | ich6m_sata_ahci = 9, |
129 | ich7m_sata_ahci = 10, | 129 | ich8_sata_ahci = 10, |
130 | ich8_sata_ahci = 11, | ||
131 | 130 | ||
132 | /* constants for mapping table */ | 131 | /* constants for mapping table */ |
133 | P0 = 0, /* port 0 */ | 132 | P0 = 0, /* port 0 */ |
@@ -227,7 +226,7 @@ static const struct pci_device_id piix_pci_tbl[] = { | |||
227 | /* 82801GB/GR/GH (ICH7, identical to ICH6) */ | 226 | /* 82801GB/GR/GH (ICH7, identical to ICH6) */ |
228 | { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, | 227 | { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, |
229 | /* 2801GBM/GHM (ICH7M, identical to ICH6M) */ | 228 | /* 2801GBM/GHM (ICH7M, identical to ICH6M) */ |
230 | { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7m_sata_ahci }, | 229 | { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata_ahci }, |
231 | /* Enterprise Southbridge 2 (where's the datasheet?) */ | 230 | /* Enterprise Southbridge 2 (where's the datasheet?) */ |
232 | { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, | 231 | { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, |
233 | /* SATA Controller 1 IDE (ICH8, no datasheet yet) */ | 232 | /* SATA Controller 1 IDE (ICH8, no datasheet yet) */ |
@@ -399,23 +398,10 @@ static const struct piix_map_db ich6m_map_db = { | |||
399 | .mask = 0x3, | 398 | .mask = 0x3, |
400 | .port_enable = 0x5, | 399 | .port_enable = 0x5, |
401 | .present_shift = 4, | 400 | .present_shift = 4, |
402 | .map = { | ||
403 | /* PM PS SM SS MAP */ | ||
404 | { P0, P2, RV, RV }, /* 00b */ | ||
405 | { RV, RV, RV, RV }, | ||
406 | { P0, P2, IDE, IDE }, /* 10b */ | ||
407 | { RV, RV, RV, RV }, | ||
408 | }, | ||
409 | }; | ||
410 | |||
411 | static const struct piix_map_db ich7m_map_db = { | ||
412 | .mask = 0x3, | ||
413 | .port_enable = 0x5, | ||
414 | .present_shift = 4, | ||
415 | 401 | ||
416 | /* Map 01b isn't specified in the doc but some notebooks use | 402 | /* Map 01b isn't specified in the doc but some notebooks use |
417 | * it anyway. ATM, the only case spotted carries subsystem ID | 403 | * it anyway. MAP 01b have been spotted on both ICH6M and |
418 | * 1025:0107. This is the only difference from ich6m. | 404 | * ICH7M. |
419 | */ | 405 | */ |
420 | .map = { | 406 | .map = { |
421 | /* PM PS SM SS MAP */ | 407 | /* PM PS SM SS MAP */ |
@@ -432,9 +418,9 @@ static const struct piix_map_db ich8_map_db = { | |||
432 | .present_shift = 8, | 418 | .present_shift = 8, |
433 | .map = { | 419 | .map = { |
434 | /* PM PS SM SS MAP */ | 420 | /* PM PS SM SS MAP */ |
435 | { P0, NA, P1, NA }, /* 00b (hardwired) */ | 421 | { P0, P2, P1, P3 }, /* 00b (hardwired when in AHCI) */ |
436 | { RV, RV, RV, RV }, | 422 | { RV, RV, RV, RV }, |
437 | { RV, RV, RV, RV }, /* 10b (never) */ | 423 | { IDE, IDE, NA, NA }, /* 10b (IDE mode) */ |
438 | { RV, RV, RV, RV }, | 424 | { RV, RV, RV, RV }, |
439 | }, | 425 | }, |
440 | }; | 426 | }; |
@@ -445,7 +431,6 @@ static const struct piix_map_db *piix_map_db_table[] = { | |||
445 | [ich6_sata] = &ich6_map_db, | 431 | [ich6_sata] = &ich6_map_db, |
446 | [ich6_sata_ahci] = &ich6_map_db, | 432 | [ich6_sata_ahci] = &ich6_map_db, |
447 | [ich6m_sata_ahci] = &ich6m_map_db, | 433 | [ich6m_sata_ahci] = &ich6m_map_db, |
448 | [ich7m_sata_ahci] = &ich7m_map_db, | ||
449 | [ich8_sata_ahci] = &ich8_map_db, | 434 | [ich8_sata_ahci] = &ich8_map_db, |
450 | }; | 435 | }; |
451 | 436 | ||
@@ -556,19 +541,7 @@ static struct ata_port_info piix_port_info[] = { | |||
556 | .port_ops = &piix_sata_ops, | 541 | .port_ops = &piix_sata_ops, |
557 | }, | 542 | }, |
558 | 543 | ||
559 | /* ich7m_sata_ahci: 10 */ | 544 | /* ich8_sata_ahci: 10 */ |
560 | { | ||
561 | .sht = &piix_sht, | ||
562 | .flags = ATA_FLAG_SATA | | ||
563 | PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR | | ||
564 | PIIX_FLAG_AHCI, | ||
565 | .pio_mask = 0x1f, /* pio0-4 */ | ||
566 | .mwdma_mask = 0x07, /* mwdma0-2 */ | ||
567 | .udma_mask = 0x7f, /* udma0-6 */ | ||
568 | .port_ops = &piix_sata_ops, | ||
569 | }, | ||
570 | |||
571 | /* ich8_sata_ahci: 11 */ | ||
572 | { | 545 | { |
573 | .sht = &piix_sht, | 546 | .sht = &piix_sht, |
574 | .flags = ATA_FLAG_SATA | | 547 | .flags = ATA_FLAG_SATA | |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 83728a9457ad..915a55a6cc14 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -5957,7 +5957,7 @@ static void __exit ata_exit(void) | |||
5957 | destroy_workqueue(ata_aux_wq); | 5957 | destroy_workqueue(ata_aux_wq); |
5958 | } | 5958 | } |
5959 | 5959 | ||
5960 | module_init(ata_init); | 5960 | subsys_initcall(ata_init); |
5961 | module_exit(ata_exit); | 5961 | module_exit(ata_exit); |
5962 | 5962 | ||
5963 | static unsigned long ratelimit_time; | 5963 | static unsigned long ratelimit_time; |
@@ -6122,7 +6122,6 @@ EXPORT_SYMBOL_GPL(ata_std_prereset); | |||
6122 | EXPORT_SYMBOL_GPL(ata_std_softreset); | 6122 | EXPORT_SYMBOL_GPL(ata_std_softreset); |
6123 | EXPORT_SYMBOL_GPL(sata_std_hardreset); | 6123 | EXPORT_SYMBOL_GPL(sata_std_hardreset); |
6124 | EXPORT_SYMBOL_GPL(ata_std_postreset); | 6124 | EXPORT_SYMBOL_GPL(ata_std_postreset); |
6125 | EXPORT_SYMBOL_GPL(ata_dev_revalidate); | ||
6126 | EXPORT_SYMBOL_GPL(ata_dev_classify); | 6125 | EXPORT_SYMBOL_GPL(ata_dev_classify); |
6127 | EXPORT_SYMBOL_GPL(ata_dev_pair); | 6126 | EXPORT_SYMBOL_GPL(ata_dev_pair); |
6128 | EXPORT_SYMBOL_GPL(ata_port_disable); | 6127 | EXPORT_SYMBOL_GPL(ata_port_disable); |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 7af2a4ba4990..47ea111d5ace 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -1451,6 +1451,7 @@ nothing_to_do: | |||
1451 | 1451 | ||
1452 | static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) | 1452 | static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) |
1453 | { | 1453 | { |
1454 | struct ata_port *ap = qc->ap; | ||
1454 | struct scsi_cmnd *cmd = qc->scsicmd; | 1455 | struct scsi_cmnd *cmd = qc->scsicmd; |
1455 | u8 *cdb = cmd->cmnd; | 1456 | u8 *cdb = cmd->cmnd; |
1456 | int need_sense = (qc->err_mask != 0); | 1457 | int need_sense = (qc->err_mask != 0); |
@@ -1459,11 +1460,12 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) | |||
1459 | * schedule EH_REVALIDATE operation to update the IDENTIFY DEVICE | 1460 | * schedule EH_REVALIDATE operation to update the IDENTIFY DEVICE |
1460 | * cache | 1461 | * cache |
1461 | */ | 1462 | */ |
1462 | if (!need_sense && (qc->tf.command == ATA_CMD_SET_FEATURES) && | 1463 | if (ap->ops->error_handler && |
1464 | !need_sense && (qc->tf.command == ATA_CMD_SET_FEATURES) && | ||
1463 | ((qc->tf.feature == SETFEATURES_WC_ON) || | 1465 | ((qc->tf.feature == SETFEATURES_WC_ON) || |
1464 | (qc->tf.feature == SETFEATURES_WC_OFF))) { | 1466 | (qc->tf.feature == SETFEATURES_WC_OFF))) { |
1465 | qc->ap->eh_info.action |= ATA_EH_REVALIDATE; | 1467 | ap->eh_info.action |= ATA_EH_REVALIDATE; |
1466 | ata_port_schedule_eh(qc->ap); | 1468 | ata_port_schedule_eh(ap); |
1467 | } | 1469 | } |
1468 | 1470 | ||
1469 | /* For ATA pass thru (SAT) commands, generate a sense block if | 1471 | /* For ATA pass thru (SAT) commands, generate a sense block if |
@@ -1490,8 +1492,8 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) | |||
1490 | } | 1492 | } |
1491 | } | 1493 | } |
1492 | 1494 | ||
1493 | if (need_sense && !qc->ap->ops->error_handler) | 1495 | if (need_sense && !ap->ops->error_handler) |
1494 | ata_dump_status(qc->ap->id, &qc->result_tf); | 1496 | ata_dump_status(ap->id, &qc->result_tf); |
1495 | 1497 | ||
1496 | qc->scsidone(cmd); | 1498 | qc->scsidone(cmd); |
1497 | 1499 | ||
@@ -1612,9 +1614,9 @@ early_finish: | |||
1612 | 1614 | ||
1613 | err_did: | 1615 | err_did: |
1614 | ata_qc_free(qc); | 1616 | ata_qc_free(qc); |
1615 | err_mem: | ||
1616 | cmd->result = (DID_ERROR << 16); | 1617 | cmd->result = (DID_ERROR << 16); |
1617 | done(cmd); | 1618 | done(cmd); |
1619 | err_mem: | ||
1618 | DPRINTK("EXIT - internal\n"); | 1620 | DPRINTK("EXIT - internal\n"); |
1619 | return 0; | 1621 | return 0; |
1620 | 1622 | ||
@@ -3345,20 +3347,23 @@ EXPORT_SYMBOL_GPL(ata_sas_slave_configure); | |||
3345 | * @ap: ATA port to which the command is being sent | 3347 | * @ap: ATA port to which the command is being sent |
3346 | * | 3348 | * |
3347 | * RETURNS: | 3349 | * RETURNS: |
3348 | * Zero. | 3350 | * Return value from __ata_scsi_queuecmd() if @cmd can be queued, |
3351 | * 0 otherwise. | ||
3349 | */ | 3352 | */ |
3350 | 3353 | ||
3351 | int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), | 3354 | int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), |
3352 | struct ata_port *ap) | 3355 | struct ata_port *ap) |
3353 | { | 3356 | { |
3357 | int rc = 0; | ||
3358 | |||
3354 | ata_scsi_dump_cdb(ap, cmd); | 3359 | ata_scsi_dump_cdb(ap, cmd); |
3355 | 3360 | ||
3356 | if (likely(ata_scsi_dev_enabled(ap->device))) | 3361 | if (likely(ata_scsi_dev_enabled(ap->device))) |
3357 | __ata_scsi_queuecmd(cmd, done, ap->device); | 3362 | rc = __ata_scsi_queuecmd(cmd, done, ap->device); |
3358 | else { | 3363 | else { |
3359 | cmd->result = (DID_BAD_TARGET << 16); | 3364 | cmd->result = (DID_BAD_TARGET << 16); |
3360 | done(cmd); | 3365 | done(cmd); |
3361 | } | 3366 | } |
3362 | return 0; | 3367 | return rc; |
3363 | } | 3368 | } |
3364 | EXPORT_SYMBOL_GPL(ata_sas_queuecmd); | 3369 | EXPORT_SYMBOL_GPL(ata_sas_queuecmd); |
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 06daaa3736a2..7645f2b30ccf 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -981,6 +981,15 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info, | |||
981 | mask = (1 << 2) | (1 << 0); | 981 | mask = (1 << 2) | (1 << 0); |
982 | if ((tmp8 & mask) != mask) | 982 | if ((tmp8 & mask) != mask) |
983 | legacy_mode = (1 << 3); | 983 | legacy_mode = (1 << 3); |
984 | #if defined(CONFIG_NO_ATA_LEGACY) | ||
985 | /* Some platforms with PCI limits cannot address compat | ||
986 | port space. In that case we punt if their firmware has | ||
987 | left a device in compatibility mode */ | ||
988 | if (legacy_mode) { | ||
989 | printk(KERN_ERR "ata: Compatibility mode ATA is not supported on this platform, skipping.\n"); | ||
990 | return -EOPNOTSUPP; | ||
991 | } | ||
992 | #endif | ||
984 | } | 993 | } |
985 | 994 | ||
986 | rc = pci_request_regions(pdev, DRV_NAME); | 995 | rc = pci_request_regions(pdev, DRV_NAME); |
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index a5ecb71390a9..0ed263be652a 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h | |||
@@ -53,6 +53,7 @@ extern unsigned ata_exec_internal(struct ata_device *dev, | |||
53 | extern unsigned int ata_do_simple_cmd(struct ata_device *dev, u8 cmd); | 53 | extern unsigned int ata_do_simple_cmd(struct ata_device *dev, u8 cmd); |
54 | extern int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class, | 54 | extern int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class, |
55 | int post_reset, u16 *id); | 55 | int post_reset, u16 *id); |
56 | extern int ata_dev_revalidate(struct ata_device *dev, int post_reset); | ||
56 | extern int ata_dev_configure(struct ata_device *dev, int print_info); | 57 | extern int ata_dev_configure(struct ata_device *dev, int print_info); |
57 | extern int sata_down_spd_limit(struct ata_port *ap); | 58 | extern int sata_down_spd_limit(struct ata_port *ap); |
58 | extern int sata_set_spd_needed(struct ata_port *ap); | 59 | extern int sata_set_spd_needed(struct ata_port *ap); |
diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c index 29234c897118..5c47a9e0e0ca 100644 --- a/drivers/ata/pata_amd.c +++ b/drivers/ata/pata_amd.c | |||
@@ -677,6 +677,8 @@ static const struct pci_device_id amd[] = { | |||
677 | { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE), 8 }, | 677 | { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE), 8 }, |
678 | { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE), 8 }, | 678 | { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE), 8 }, |
679 | { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE), 8 }, | 679 | { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE), 8 }, |
680 | { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE), 8 }, | ||
681 | { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE), 8 }, | ||
680 | { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CS5536_IDE), 9 }, | 682 | { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CS5536_IDE), 9 }, |
681 | 683 | ||
682 | { }, | 684 | { }, |
diff --git a/drivers/ata/pata_artop.c b/drivers/ata/pata_artop.c index 690828eb5226..96a098020a8f 100644 --- a/drivers/ata/pata_artop.c +++ b/drivers/ata/pata_artop.c | |||
@@ -92,7 +92,7 @@ static int artop6260_pre_reset(struct ata_port *ap) | |||
92 | return -ENOENT; | 92 | return -ENOENT; |
93 | 93 | ||
94 | pci_read_config_byte(pdev, 0x49, &tmp); | 94 | pci_read_config_byte(pdev, 0x49, &tmp); |
95 | if (tmp & (1 >> ap->port_no)) | 95 | if (tmp & (1 << ap->port_no)) |
96 | ap->cbl = ATA_CBL_PATA40; | 96 | ap->cbl = ATA_CBL_PATA40; |
97 | else | 97 | else |
98 | ap->cbl = ATA_CBL_PATA80; | 98 | ap->cbl = ATA_CBL_PATA80; |
diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c index 7350443948c1..fce3fcdc7e79 100644 --- a/drivers/ata/pata_hpt37x.c +++ b/drivers/ata/pata_hpt37x.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <linux/libata.h> | 25 | #include <linux/libata.h> |
26 | 26 | ||
27 | #define DRV_NAME "pata_hpt37x" | 27 | #define DRV_NAME "pata_hpt37x" |
28 | #define DRV_VERSION "0.5" | 28 | #define DRV_VERSION "0.5.1" |
29 | 29 | ||
30 | struct hpt_clock { | 30 | struct hpt_clock { |
31 | u8 xfer_speed; | 31 | u8 xfer_speed; |
@@ -453,7 +453,13 @@ static int hpt37x_pre_reset(struct ata_port *ap) | |||
453 | { | 453 | { |
454 | u8 scr2, ata66; | 454 | u8 scr2, ata66; |
455 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 455 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
456 | 456 | static const struct pci_bits hpt37x_enable_bits[] = { | |
457 | { 0x50, 1, 0x04, 0x04 }, | ||
458 | { 0x54, 1, 0x04, 0x04 } | ||
459 | }; | ||
460 | if (!pci_test_config_bits(pdev, &hpt37x_enable_bits[ap->port_no])) | ||
461 | return -ENOENT; | ||
462 | |||
457 | pci_read_config_byte(pdev, 0x5B, &scr2); | 463 | pci_read_config_byte(pdev, 0x5B, &scr2); |
458 | pci_write_config_byte(pdev, 0x5B, scr2 & ~0x01); | 464 | pci_write_config_byte(pdev, 0x5B, scr2 & ~0x01); |
459 | /* Cable register now active */ | 465 | /* Cable register now active */ |
@@ -488,10 +494,17 @@ static void hpt37x_error_handler(struct ata_port *ap) | |||
488 | 494 | ||
489 | static int hpt374_pre_reset(struct ata_port *ap) | 495 | static int hpt374_pre_reset(struct ata_port *ap) |
490 | { | 496 | { |
497 | static const struct pci_bits hpt37x_enable_bits[] = { | ||
498 | { 0x50, 1, 0x04, 0x04 }, | ||
499 | { 0x54, 1, 0x04, 0x04 } | ||
500 | }; | ||
491 | u16 mcr3, mcr6; | 501 | u16 mcr3, mcr6; |
492 | u8 ata66; | 502 | u8 ata66; |
493 | |||
494 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 503 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
504 | |||
505 | if (!pci_test_config_bits(pdev, &hpt37x_enable_bits[ap->port_no])) | ||
506 | return -ENOENT; | ||
507 | |||
495 | /* Do the extra channel work */ | 508 | /* Do the extra channel work */ |
496 | pci_read_config_word(pdev, 0x52, &mcr3); | 509 | pci_read_config_word(pdev, 0x52, &mcr3); |
497 | pci_read_config_word(pdev, 0x56, &mcr6); | 510 | pci_read_config_word(pdev, 0x56, &mcr6); |
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index 323b60710806..d65ebfd7c7b2 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c | |||
@@ -117,10 +117,14 @@ static const struct pci_device_id nv_pci_tbl[] = { | |||
117 | { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA), GENERIC }, | 117 | { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA), GENERIC }, |
118 | { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA2), GENERIC }, | 118 | { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA2), GENERIC }, |
119 | { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3), GENERIC }, | 119 | { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3), GENERIC }, |
120 | { PCI_VDEVICE(NVIDIA, 0x045c), GENERIC }, | 120 | { PCI_VDEVICE(NVIDIA, 0x045c), GENERIC }, /* MCP65 */ |
121 | { PCI_VDEVICE(NVIDIA, 0x045d), GENERIC }, | 121 | { PCI_VDEVICE(NVIDIA, 0x045d), GENERIC }, /* MCP65 */ |
122 | { PCI_VDEVICE(NVIDIA, 0x045e), GENERIC }, | 122 | { PCI_VDEVICE(NVIDIA, 0x045e), GENERIC }, /* MCP65 */ |
123 | { PCI_VDEVICE(NVIDIA, 0x045f), GENERIC }, | 123 | { PCI_VDEVICE(NVIDIA, 0x045f), GENERIC }, /* MCP65 */ |
124 | { PCI_VDEVICE(NVIDIA, 0x0550), GENERIC }, /* MCP67 */ | ||
125 | { PCI_VDEVICE(NVIDIA, 0x0551), GENERIC }, /* MCP67 */ | ||
126 | { PCI_VDEVICE(NVIDIA, 0x0552), GENERIC }, /* MCP67 */ | ||
127 | { PCI_VDEVICE(NVIDIA, 0x0553), GENERIC }, /* MCP67 */ | ||
124 | { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, | 128 | { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, |
125 | PCI_ANY_ID, PCI_ANY_ID, | 129 | PCI_ANY_ID, PCI_ANY_ID, |
126 | PCI_CLASS_STORAGE_IDE<<8, 0xffff00, GENERIC }, | 130 | PCI_CLASS_STORAGE_IDE<<8, 0xffff00, GENERIC }, |
diff --git a/drivers/ata/sata_sis.c b/drivers/ata/sata_sis.c index 0738f52463a9..9d1235ba06b1 100644 --- a/drivers/ata/sata_sis.c +++ b/drivers/ata/sata_sis.c | |||
@@ -240,7 +240,7 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
240 | struct ata_probe_ent *probe_ent = NULL; | 240 | struct ata_probe_ent *probe_ent = NULL; |
241 | int rc; | 241 | int rc; |
242 | u32 genctl; | 242 | u32 genctl; |
243 | struct ata_port_info *ppi[2]; | 243 | struct ata_port_info pi = sis_port_info, *ppi[2] = { &pi, &pi }; |
244 | int pci_dev_busy = 0; | 244 | int pci_dev_busy = 0; |
245 | u8 pmr; | 245 | u8 pmr; |
246 | u8 port2_start; | 246 | u8 port2_start; |
@@ -265,27 +265,20 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
265 | if (rc) | 265 | if (rc) |
266 | goto err_out_regions; | 266 | goto err_out_regions; |
267 | 267 | ||
268 | ppi[0] = ppi[1] = &sis_port_info; | ||
269 | probe_ent = ata_pci_init_native_mode(pdev, ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY); | ||
270 | if (!probe_ent) { | ||
271 | rc = -ENOMEM; | ||
272 | goto err_out_regions; | ||
273 | } | ||
274 | |||
275 | /* check and see if the SCRs are in IO space or PCI cfg space */ | 268 | /* check and see if the SCRs are in IO space or PCI cfg space */ |
276 | pci_read_config_dword(pdev, SIS_GENCTL, &genctl); | 269 | pci_read_config_dword(pdev, SIS_GENCTL, &genctl); |
277 | if ((genctl & GENCTL_IOMAPPED_SCR) == 0) | 270 | if ((genctl & GENCTL_IOMAPPED_SCR) == 0) |
278 | probe_ent->port_flags |= SIS_FLAG_CFGSCR; | 271 | pi.flags |= SIS_FLAG_CFGSCR; |
279 | 272 | ||
280 | /* if hardware thinks SCRs are in IO space, but there are | 273 | /* if hardware thinks SCRs are in IO space, but there are |
281 | * no IO resources assigned, change to PCI cfg space. | 274 | * no IO resources assigned, change to PCI cfg space. |
282 | */ | 275 | */ |
283 | if ((!(probe_ent->port_flags & SIS_FLAG_CFGSCR)) && | 276 | if ((!(pi.flags & SIS_FLAG_CFGSCR)) && |
284 | ((pci_resource_start(pdev, SIS_SCR_PCI_BAR) == 0) || | 277 | ((pci_resource_start(pdev, SIS_SCR_PCI_BAR) == 0) || |
285 | (pci_resource_len(pdev, SIS_SCR_PCI_BAR) < 128))) { | 278 | (pci_resource_len(pdev, SIS_SCR_PCI_BAR) < 128))) { |
286 | genctl &= ~GENCTL_IOMAPPED_SCR; | 279 | genctl &= ~GENCTL_IOMAPPED_SCR; |
287 | pci_write_config_dword(pdev, SIS_GENCTL, genctl); | 280 | pci_write_config_dword(pdev, SIS_GENCTL, genctl); |
288 | probe_ent->port_flags |= SIS_FLAG_CFGSCR; | 281 | pi.flags |= SIS_FLAG_CFGSCR; |
289 | } | 282 | } |
290 | 283 | ||
291 | pci_read_config_byte(pdev, SIS_PMR, &pmr); | 284 | pci_read_config_byte(pdev, SIS_PMR, &pmr); |
@@ -306,6 +299,12 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
306 | port2_start = 0x20; | 299 | port2_start = 0x20; |
307 | } | 300 | } |
308 | 301 | ||
302 | probe_ent = ata_pci_init_native_mode(pdev, ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY); | ||
303 | if (!probe_ent) { | ||
304 | rc = -ENOMEM; | ||
305 | goto err_out_regions; | ||
306 | } | ||
307 | |||
309 | if (!(probe_ent->port_flags & SIS_FLAG_CFGSCR)) { | 308 | if (!(probe_ent->port_flags & SIS_FLAG_CFGSCR)) { |
310 | probe_ent->port[0].scr_addr = | 309 | probe_ent->port[0].scr_addr = |
311 | pci_resource_start(pdev, SIS_SCR_PCI_BAR); | 310 | pci_resource_start(pdev, SIS_SCR_PCI_BAR); |
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index f4455a1efe2d..1c7f19aecc25 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c | |||
@@ -230,7 +230,7 @@ static int vt6420_prereset(struct ata_port *ap) | |||
230 | int online; | 230 | int online; |
231 | 231 | ||
232 | /* don't do any SCR stuff if we're not loading */ | 232 | /* don't do any SCR stuff if we're not loading */ |
233 | if (!ATA_PFLAG_LOADING) | 233 | if (!(ap->pflags & ATA_PFLAG_LOADING)) |
234 | goto skip_scr; | 234 | goto skip_scr; |
235 | 235 | ||
236 | /* Resume phy. This is the old resume sequence from | 236 | /* Resume phy. This is the old resume sequence from |
diff --git a/drivers/atm/ambassador.c b/drivers/atm/ambassador.c index 323592de047b..9fffa7af6db1 100644 --- a/drivers/atm/ambassador.c +++ b/drivers/atm/ambassador.c | |||
@@ -2452,8 +2452,8 @@ static int __init amb_module_init (void) | |||
2452 | static void __exit amb_module_exit (void) | 2452 | static void __exit amb_module_exit (void) |
2453 | { | 2453 | { |
2454 | PRINTD (DBG_FLOW|DBG_INIT, "cleanup_module"); | 2454 | PRINTD (DBG_FLOW|DBG_INIT, "cleanup_module"); |
2455 | 2455 | ||
2456 | return pci_unregister_driver(&amb_driver); | 2456 | pci_unregister_driver(&amb_driver); |
2457 | } | 2457 | } |
2458 | 2458 | ||
2459 | module_init(amb_module_init); | 2459 | module_init(amb_module_init); |
diff --git a/drivers/atm/firestream.c b/drivers/atm/firestream.c index 40ab9b65fae9..697ad82f6634 100644 --- a/drivers/atm/firestream.c +++ b/drivers/atm/firestream.c | |||
@@ -1002,6 +1002,10 @@ static int fs_open(struct atm_vcc *atm_vcc) | |||
1002 | r = ROUND_UP; | 1002 | r = ROUND_UP; |
1003 | } | 1003 | } |
1004 | error = make_rate (pcr, r, &tmc0, NULL); | 1004 | error = make_rate (pcr, r, &tmc0, NULL); |
1005 | if (error) { | ||
1006 | kfree(tc); | ||
1007 | return error; | ||
1008 | } | ||
1005 | } | 1009 | } |
1006 | fs_dprintk (FS_DEBUG_OPEN, "pcr = %d.\n", pcr); | 1010 | fs_dprintk (FS_DEBUG_OPEN, "pcr = %d.\n", pcr); |
1007 | } | 1011 | } |
diff --git a/drivers/atm/horizon.c b/drivers/atm/horizon.c index f59349206dd2..4dc10105d610 100644 --- a/drivers/atm/horizon.c +++ b/drivers/atm/horizon.c | |||
@@ -1789,7 +1789,7 @@ static inline void CLOCK_IT (const hrz_dev *dev, u32 ctrl) | |||
1789 | WRITE_IT_WAIT(dev, ctrl | SEEPROM_SK); | 1789 | WRITE_IT_WAIT(dev, ctrl | SEEPROM_SK); |
1790 | } | 1790 | } |
1791 | 1791 | ||
1792 | static u16 __init read_bia (const hrz_dev * dev, u16 addr) | 1792 | static u16 __devinit read_bia (const hrz_dev * dev, u16 addr) |
1793 | { | 1793 | { |
1794 | u32 ctrl = rd_regl (dev, CONTROL_0_REG); | 1794 | u32 ctrl = rd_regl (dev, CONTROL_0_REG); |
1795 | 1795 | ||
@@ -2932,8 +2932,8 @@ static int __init hrz_module_init (void) { | |||
2932 | 2932 | ||
2933 | static void __exit hrz_module_exit (void) { | 2933 | static void __exit hrz_module_exit (void) { |
2934 | PRINTD (DBG_FLOW, "cleanup_module"); | 2934 | PRINTD (DBG_FLOW, "cleanup_module"); |
2935 | 2935 | ||
2936 | return pci_unregister_driver(&hrz_driver); | 2936 | pci_unregister_driver(&hrz_driver); |
2937 | } | 2937 | } |
2938 | 2938 | ||
2939 | module_init(hrz_module_init); | 2939 | module_init(hrz_module_init); |
diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c index 632ede552761..bd0904594805 100644 --- a/drivers/atm/nicstar.c +++ b/drivers/atm/nicstar.c | |||
@@ -2759,7 +2759,7 @@ static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg) | |||
2759 | { | 2759 | { |
2760 | ns_dev *card; | 2760 | ns_dev *card; |
2761 | pool_levels pl; | 2761 | pool_levels pl; |
2762 | int btype; | 2762 | long btype; |
2763 | unsigned long flags; | 2763 | unsigned long flags; |
2764 | 2764 | ||
2765 | card = dev->dev_data; | 2765 | card = dev->dev_data; |
@@ -2859,7 +2859,7 @@ static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg) | |||
2859 | case NS_ADJBUFLEV: | 2859 | case NS_ADJBUFLEV: |
2860 | if (!capable(CAP_NET_ADMIN)) | 2860 | if (!capable(CAP_NET_ADMIN)) |
2861 | return -EPERM; | 2861 | return -EPERM; |
2862 | btype = (int) arg; /* an int is the same size as a pointer */ | 2862 | btype = (long) arg; /* a long is the same size as a pointer or bigger */ |
2863 | switch (btype) | 2863 | switch (btype) |
2864 | { | 2864 | { |
2865 | case NS_BUFTYPE_SMALL: | 2865 | case NS_BUFTYPE_SMALL: |
diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig index 0b4e22436935..1429f3a2629e 100644 --- a/drivers/base/Kconfig +++ b/drivers/base/Kconfig | |||
@@ -37,8 +37,8 @@ config DEBUG_DRIVER | |||
37 | 37 | ||
38 | If you are unsure about this, say N here. | 38 | If you are unsure about this, say N here. |
39 | 39 | ||
40 | endmenu | ||
41 | |||
42 | config SYS_HYPERVISOR | 40 | config SYS_HYPERVISOR |
43 | bool | 41 | bool |
44 | default n | 42 | default n |
43 | |||
44 | endmenu | ||
diff --git a/drivers/base/core.c b/drivers/base/core.c index 68ad11af22b4..002fde46d38d 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -591,8 +591,10 @@ void device_del(struct device * dev) | |||
591 | 591 | ||
592 | if (parent) | 592 | if (parent) |
593 | klist_del(&dev->knode_parent); | 593 | klist_del(&dev->knode_parent); |
594 | if (dev->devt_attr) | 594 | if (dev->devt_attr) { |
595 | device_remove_file(dev, dev->devt_attr); | 595 | device_remove_file(dev, dev->devt_attr); |
596 | kfree(dev->devt_attr); | ||
597 | } | ||
596 | if (dev->class) { | 598 | if (dev->class) { |
597 | sysfs_remove_link(&dev->kobj, "subsystem"); | 599 | sysfs_remove_link(&dev->kobj, "subsystem"); |
598 | sysfs_remove_link(&dev->class->subsys.kset.kobj, dev->bus_id); | 600 | sysfs_remove_link(&dev->class->subsys.kset.kobj, dev->bus_id); |
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index db01b95a47a5..c5d6bb4290ad 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/device.h> | 18 | #include <linux/device.h> |
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/kthread.h> | 20 | #include <linux/kthread.h> |
21 | #include <linux/wait.h> | ||
21 | 22 | ||
22 | #include "base.h" | 23 | #include "base.h" |
23 | #include "power/power.h" | 24 | #include "power/power.h" |
@@ -70,6 +71,8 @@ struct stupid_thread_structure { | |||
70 | }; | 71 | }; |
71 | 72 | ||
72 | static atomic_t probe_count = ATOMIC_INIT(0); | 73 | static atomic_t probe_count = ATOMIC_INIT(0); |
74 | static DECLARE_WAIT_QUEUE_HEAD(probe_waitqueue); | ||
75 | |||
73 | static int really_probe(void *void_data) | 76 | static int really_probe(void *void_data) |
74 | { | 77 | { |
75 | struct stupid_thread_structure *data = void_data; | 78 | struct stupid_thread_structure *data = void_data; |
@@ -121,6 +124,7 @@ probe_failed: | |||
121 | done: | 124 | done: |
122 | kfree(data); | 125 | kfree(data); |
123 | atomic_dec(&probe_count); | 126 | atomic_dec(&probe_count); |
127 | wake_up(&probe_waitqueue); | ||
124 | return ret; | 128 | return ret; |
125 | } | 129 | } |
126 | 130 | ||
@@ -337,6 +341,32 @@ void driver_detach(struct device_driver * drv) | |||
337 | } | 341 | } |
338 | } | 342 | } |
339 | 343 | ||
344 | #ifdef CONFIG_PCI_MULTITHREAD_PROBE | ||
345 | static int __init wait_for_probes(void) | ||
346 | { | ||
347 | DEFINE_WAIT(wait); | ||
348 | |||
349 | printk(KERN_INFO "%s: waiting for %d threads\n", __FUNCTION__, | ||
350 | atomic_read(&probe_count)); | ||
351 | if (!atomic_read(&probe_count)) | ||
352 | return 0; | ||
353 | while (atomic_read(&probe_count)) { | ||
354 | prepare_to_wait(&probe_waitqueue, &wait, TASK_UNINTERRUPTIBLE); | ||
355 | if (atomic_read(&probe_count)) | ||
356 | schedule(); | ||
357 | } | ||
358 | finish_wait(&probe_waitqueue, &wait); | ||
359 | return 0; | ||
360 | } | ||
361 | |||
362 | core_initcall_sync(wait_for_probes); | ||
363 | postcore_initcall_sync(wait_for_probes); | ||
364 | arch_initcall_sync(wait_for_probes); | ||
365 | subsys_initcall_sync(wait_for_probes); | ||
366 | fs_initcall_sync(wait_for_probes); | ||
367 | device_initcall_sync(wait_for_probes); | ||
368 | late_initcall_sync(wait_for_probes); | ||
369 | #endif | ||
340 | 370 | ||
341 | EXPORT_SYMBOL_GPL(device_bind_driver); | 371 | EXPORT_SYMBOL_GPL(device_bind_driver); |
342 | EXPORT_SYMBOL_GPL(device_release_driver); | 372 | EXPORT_SYMBOL_GPL(device_release_driver); |
diff --git a/drivers/block/aoe/aoeblk.c b/drivers/block/aoe/aoeblk.c index d433f27e0ce2..aa25f8b09fe3 100644 --- a/drivers/block/aoe/aoeblk.c +++ b/drivers/block/aoe/aoeblk.c | |||
@@ -68,6 +68,7 @@ static struct attribute *aoe_attrs[] = { | |||
68 | &disk_attr_mac.attr, | 68 | &disk_attr_mac.attr, |
69 | &disk_attr_netif.attr, | 69 | &disk_attr_netif.attr, |
70 | &disk_attr_fwver.attr, | 70 | &disk_attr_fwver.attr, |
71 | NULL | ||
71 | }; | 72 | }; |
72 | 73 | ||
73 | static const struct attribute_group attr_group = { | 74 | static const struct attribute_group attr_group = { |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index dcccaf2782f3..4105c3bf3476 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -1300,6 +1300,12 @@ static void cciss_softirq_done(struct request *rq) | |||
1300 | 1300 | ||
1301 | complete_buffers(rq->bio, rq->errors); | 1301 | complete_buffers(rq->bio, rq->errors); |
1302 | 1302 | ||
1303 | if (blk_fs_request(rq)) { | ||
1304 | const int rw = rq_data_dir(rq); | ||
1305 | |||
1306 | disk_stat_add(rq->rq_disk, sectors[rw], rq->nr_sectors); | ||
1307 | } | ||
1308 | |||
1303 | #ifdef CCISS_DEBUG | 1309 | #ifdef CCISS_DEBUG |
1304 | printk("Done with %p\n", rq); | 1310 | printk("Done with %p\n", rq); |
1305 | #endif /* CCISS_DEBUG */ | 1311 | #endif /* CCISS_DEBUG */ |
@@ -1923,7 +1929,6 @@ static void cciss_geometry_inquiry(int ctlr, int logvol, | |||
1923 | { | 1929 | { |
1924 | int return_code; | 1930 | int return_code; |
1925 | unsigned long t; | 1931 | unsigned long t; |
1926 | unsigned long rem; | ||
1927 | 1932 | ||
1928 | memset(inq_buff, 0, sizeof(InquiryData_struct)); | 1933 | memset(inq_buff, 0, sizeof(InquiryData_struct)); |
1929 | if (withirq) | 1934 | if (withirq) |
@@ -1939,26 +1944,23 @@ static void cciss_geometry_inquiry(int ctlr, int logvol, | |||
1939 | printk(KERN_WARNING | 1944 | printk(KERN_WARNING |
1940 | "cciss: reading geometry failed, volume " | 1945 | "cciss: reading geometry failed, volume " |
1941 | "does not support reading geometry\n"); | 1946 | "does not support reading geometry\n"); |
1942 | drv->block_size = block_size; | ||
1943 | drv->nr_blocks = total_size; | ||
1944 | drv->heads = 255; | 1947 | drv->heads = 255; |
1945 | drv->sectors = 32; // Sectors per track | 1948 | drv->sectors = 32; // Sectors per track |
1946 | t = drv->heads * drv->sectors; | ||
1947 | drv->cylinders = total_size; | ||
1948 | rem = do_div(drv->cylinders, t); | ||
1949 | } else { | 1949 | } else { |
1950 | drv->block_size = block_size; | ||
1951 | drv->nr_blocks = total_size; | ||
1952 | drv->heads = inq_buff->data_byte[6]; | 1950 | drv->heads = inq_buff->data_byte[6]; |
1953 | drv->sectors = inq_buff->data_byte[7]; | 1951 | drv->sectors = inq_buff->data_byte[7]; |
1954 | drv->cylinders = (inq_buff->data_byte[4] & 0xff) << 8; | 1952 | drv->cylinders = (inq_buff->data_byte[4] & 0xff) << 8; |
1955 | drv->cylinders += inq_buff->data_byte[5]; | 1953 | drv->cylinders += inq_buff->data_byte[5]; |
1956 | drv->raid_level = inq_buff->data_byte[8]; | 1954 | drv->raid_level = inq_buff->data_byte[8]; |
1957 | t = drv->heads * drv->sectors; | 1955 | } |
1958 | if (t > 1) { | 1956 | drv->block_size = block_size; |
1959 | drv->cylinders = total_size; | 1957 | drv->nr_blocks = total_size; |
1960 | rem = do_div(drv->cylinders, t); | 1958 | t = drv->heads * drv->sectors; |
1961 | } | 1959 | if (t > 1) { |
1960 | unsigned rem = sector_div(total_size, t); | ||
1961 | if (rem) | ||
1962 | total_size++; | ||
1963 | drv->cylinders = total_size; | ||
1962 | } | 1964 | } |
1963 | } else { /* Get geometry failed */ | 1965 | } else { /* Get geometry failed */ |
1964 | printk(KERN_WARNING "cciss: reading geometry failed\n"); | 1966 | printk(KERN_WARNING "cciss: reading geometry failed\n"); |
@@ -1996,8 +1998,8 @@ cciss_read_capacity(int ctlr, int logvol, int withirq, sector_t *total_size, | |||
1996 | *block_size = BLOCK_SIZE; | 1998 | *block_size = BLOCK_SIZE; |
1997 | } | 1999 | } |
1998 | if (*total_size != (__u32) 0) | 2000 | if (*total_size != (__u32) 0) |
1999 | printk(KERN_INFO " blocks= %lld block_size= %d\n", | 2001 | printk(KERN_INFO " blocks= %llu block_size= %d\n", |
2000 | *total_size, *block_size); | 2002 | (unsigned long long)*total_size, *block_size); |
2001 | kfree(buf); | 2003 | kfree(buf); |
2002 | return; | 2004 | return; |
2003 | } | 2005 | } |
@@ -2031,8 +2033,8 @@ cciss_read_capacity_16(int ctlr, int logvol, int withirq, sector_t *total_size, | |||
2031 | *total_size = 0; | 2033 | *total_size = 0; |
2032 | *block_size = BLOCK_SIZE; | 2034 | *block_size = BLOCK_SIZE; |
2033 | } | 2035 | } |
2034 | printk(KERN_INFO " blocks= %lld block_size= %d\n", | 2036 | printk(KERN_INFO " blocks= %llu block_size= %d\n", |
2035 | *total_size, *block_size); | 2037 | (unsigned long long)*total_size, *block_size); |
2036 | kfree(buf); | 2038 | kfree(buf); |
2037 | return; | 2039 | return; |
2038 | } | 2040 | } |
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index 570d2f049323..d5f519ebbc08 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c | |||
@@ -998,6 +998,7 @@ static inline void complete_buffers(struct bio *bio, int ok) | |||
998 | */ | 998 | */ |
999 | static inline void complete_command(cmdlist_t *cmd, int timeout) | 999 | static inline void complete_command(cmdlist_t *cmd, int timeout) |
1000 | { | 1000 | { |
1001 | struct request *rq = cmd->rq; | ||
1001 | int ok=1; | 1002 | int ok=1; |
1002 | int i, ddir; | 1003 | int i, ddir; |
1003 | 1004 | ||
@@ -1029,12 +1030,18 @@ static inline void complete_command(cmdlist_t *cmd, int timeout) | |||
1029 | pci_unmap_page(hba[cmd->ctlr]->pci_dev, cmd->req.sg[i].addr, | 1030 | pci_unmap_page(hba[cmd->ctlr]->pci_dev, cmd->req.sg[i].addr, |
1030 | cmd->req.sg[i].size, ddir); | 1031 | cmd->req.sg[i].size, ddir); |
1031 | 1032 | ||
1032 | complete_buffers(cmd->rq->bio, ok); | 1033 | complete_buffers(rq->bio, ok); |
1033 | 1034 | ||
1034 | add_disk_randomness(cmd->rq->rq_disk); | 1035 | if (blk_fs_request(rq)) { |
1036 | const int rw = rq_data_dir(rq); | ||
1035 | 1037 | ||
1036 | DBGPX(printk("Done with %p\n", cmd->rq);); | 1038 | disk_stat_add(rq->rq_disk, sectors[rw], rq->nr_sectors); |
1037 | end_that_request_last(cmd->rq, ok ? 1 : -EIO); | 1039 | } |
1040 | |||
1041 | add_disk_randomness(rq->rq_disk); | ||
1042 | |||
1043 | DBGPX(printk("Done with %p\n", rq);); | ||
1044 | end_that_request_last(rq, ok ? 1 : -EIO); | ||
1038 | } | 1045 | } |
1039 | 1046 | ||
1040 | /* | 1047 | /* |
diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c index 845b8680032a..cbc07250b898 100644 --- a/drivers/bluetooth/bluecard_cs.c +++ b/drivers/bluetooth/bluecard_cs.c | |||
@@ -282,7 +282,7 @@ static void bluecard_write_wakeup(bluecard_info_t *info) | |||
282 | clear_bit(ready_bit, &(info->tx_state)); | 282 | clear_bit(ready_bit, &(info->tx_state)); |
283 | 283 | ||
284 | if (bt_cb(skb)->pkt_type & 0x80) { | 284 | if (bt_cb(skb)->pkt_type & 0x80) { |
285 | DECLARE_WAIT_QUEUE_HEAD(wq); | 285 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); |
286 | DEFINE_WAIT(wait); | 286 | DEFINE_WAIT(wait); |
287 | 287 | ||
288 | unsigned char baud_reg; | 288 | unsigned char baud_reg; |
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 39a9f8cc6412..2af12fc45115 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -409,14 +409,6 @@ config SGI_MBCS | |||
409 | If you have an SGI Altix with an attached SABrick | 409 | If you have an SGI Altix with an attached SABrick |
410 | say Y or M here, otherwise say N. | 410 | say Y or M here, otherwise say N. |
411 | 411 | ||
412 | config MSPEC | ||
413 | tristate "Memory special operations driver" | ||
414 | depends on IA64 | ||
415 | help | ||
416 | If you have an ia64 and you want to enable memory special | ||
417 | operations support (formerly known as fetchop), say Y here, | ||
418 | otherwise say N. | ||
419 | |||
420 | source "drivers/serial/Kconfig" | 412 | source "drivers/serial/Kconfig" |
421 | 413 | ||
422 | config UNIX98_PTYS | 414 | config UNIX98_PTYS |
diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c index c39200161688..5ff457b41efb 100644 --- a/drivers/char/agp/generic.c +++ b/drivers/char/agp/generic.c | |||
@@ -1054,7 +1054,7 @@ void *agp_generic_alloc_page(struct agp_bridge_data *bridge) | |||
1054 | { | 1054 | { |
1055 | struct page * page; | 1055 | struct page * page; |
1056 | 1056 | ||
1057 | page = alloc_page(GFP_KERNEL); | 1057 | page = alloc_page(GFP_KERNEL | GFP_DMA32); |
1058 | if (page == NULL) | 1058 | if (page == NULL) |
1059 | return NULL; | 1059 | return NULL; |
1060 | 1060 | ||
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index d1ede7db5a12..555b3a8ab49c 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c | |||
@@ -169,7 +169,7 @@ static void *i8xx_alloc_pages(void) | |||
169 | { | 169 | { |
170 | struct page * page; | 170 | struct page * page; |
171 | 171 | ||
172 | page = alloc_pages(GFP_KERNEL, 2); | 172 | page = alloc_pages(GFP_KERNEL | GFP_DMA32, 2); |
173 | if (page == NULL) | 173 | if (page == NULL) |
174 | return NULL; | 174 | return NULL; |
175 | 175 | ||
@@ -387,11 +387,7 @@ static void intel_i830_init_gtt_entries(void) | |||
387 | /* We obtain the size of the GTT, which is also stored (for some | 387 | /* We obtain the size of the GTT, which is also stored (for some |
388 | * reason) at the top of stolen memory. Then we add 4KB to that | 388 | * reason) at the top of stolen memory. Then we add 4KB to that |
389 | * for the video BIOS popup, which is also stored in there. */ | 389 | * for the video BIOS popup, which is also stored in there. */ |
390 | 390 | size = agp_bridge->driver->fetch_size() + 4; | |
391 | if (IS_I965) | ||
392 | size = 512 + 4; | ||
393 | else | ||
394 | size = agp_bridge->driver->fetch_size() + 4; | ||
395 | 391 | ||
396 | if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB || | 392 | if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB || |
397 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) { | 393 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) { |
@@ -805,6 +801,26 @@ static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge) | |||
805 | 801 | ||
806 | return 0; | 802 | return 0; |
807 | } | 803 | } |
804 | |||
805 | /* | ||
806 | * The i965 supports 36-bit physical addresses, but to keep | ||
807 | * the format of the GTT the same, the bits that don't fit | ||
808 | * in a 32-bit word are shifted down to bits 4..7. | ||
809 | * | ||
810 | * Gcc is smart enough to notice that "(addr >> 28) & 0xf0" | ||
811 | * is always zero on 32-bit architectures, so no need to make | ||
812 | * this conditional. | ||
813 | */ | ||
814 | static unsigned long intel_i965_mask_memory(struct agp_bridge_data *bridge, | ||
815 | unsigned long addr, int type) | ||
816 | { | ||
817 | /* Shift high bits down */ | ||
818 | addr |= (addr >> 28) & 0xf0; | ||
819 | |||
820 | /* Type checking must be done elsewhere */ | ||
821 | return addr | bridge->driver->masks[type].mask; | ||
822 | } | ||
823 | |||
808 | static int intel_i965_fetch_size(void) | 824 | static int intel_i965_fetch_size(void) |
809 | { | 825 | { |
810 | struct aper_size_info_fixed *values; | 826 | struct aper_size_info_fixed *values; |
@@ -832,7 +848,8 @@ static int intel_i965_fetch_size(void) | |||
832 | 848 | ||
833 | agp_bridge->previous_size = agp_bridge->current_size = (void *)(values + offset); | 849 | agp_bridge->previous_size = agp_bridge->current_size = (void *)(values + offset); |
834 | 850 | ||
835 | return values[offset].size; | 851 | /* The i965 GTT is always sized as if it had a 512kB aperture size */ |
852 | return 512; | ||
836 | } | 853 | } |
837 | 854 | ||
838 | /* The intel i965 automatically initializes the agp aperture during POST. | 855 | /* The intel i965 automatically initializes the agp aperture during POST. |
@@ -1584,7 +1601,7 @@ static struct agp_bridge_driver intel_i965_driver = { | |||
1584 | .fetch_size = intel_i965_fetch_size, | 1601 | .fetch_size = intel_i965_fetch_size, |
1585 | .cleanup = intel_i915_cleanup, | 1602 | .cleanup = intel_i915_cleanup, |
1586 | .tlb_flush = intel_i810_tlbflush, | 1603 | .tlb_flush = intel_i810_tlbflush, |
1587 | .mask_memory = intel_i810_mask_memory, | 1604 | .mask_memory = intel_i965_mask_memory, |
1588 | .masks = intel_i810_masks, | 1605 | .masks = intel_i810_masks, |
1589 | .agp_enable = intel_i810_agp_enable, | 1606 | .agp_enable = intel_i810_agp_enable, |
1590 | .cache_flush = global_cache_flush, | 1607 | .cache_flush = global_cache_flush, |
diff --git a/drivers/char/agp/uninorth-agp.c b/drivers/char/agp/uninorth-agp.c index 91b71e750ee1..dffc19382f7e 100644 --- a/drivers/char/agp/uninorth-agp.c +++ b/drivers/char/agp/uninorth-agp.c | |||
@@ -27,32 +27,42 @@ | |||
27 | static int uninorth_rev; | 27 | static int uninorth_rev; |
28 | static int is_u3; | 28 | static int is_u3; |
29 | 29 | ||
30 | static char __devinitdata *aperture = NULL; | ||
30 | 31 | ||
31 | static int uninorth_fetch_size(void) | 32 | static int uninorth_fetch_size(void) |
32 | { | 33 | { |
33 | int i; | 34 | int i, size = 0; |
34 | u32 temp; | 35 | struct aper_size_info_32 *values = |
35 | struct aper_size_info_32 *values; | 36 | A_SIZE_32(agp_bridge->driver->aperture_sizes); |
36 | 37 | ||
37 | pci_read_config_dword(agp_bridge->dev, UNI_N_CFG_GART_BASE, &temp); | 38 | if (aperture) { |
38 | temp &= ~(0xfffff000); | 39 | char *save = aperture; |
39 | values = A_SIZE_32(agp_bridge->driver->aperture_sizes); | 40 | |
40 | 41 | size = memparse(aperture, &aperture) >> 20; | |
41 | for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) { | 42 | aperture = save; |
42 | if (temp == values[i].size_value) { | 43 | |
43 | agp_bridge->previous_size = | 44 | for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) |
44 | agp_bridge->current_size = (void *) (values + i); | 45 | if (size == values[i].size) |
45 | agp_bridge->aperture_size_idx = i; | 46 | break; |
46 | return values[i].size; | 47 | |
48 | if (i == agp_bridge->driver->num_aperture_sizes) { | ||
49 | printk(KERN_ERR PFX "Invalid aperture size, using" | ||
50 | " default\n"); | ||
51 | size = 0; | ||
52 | aperture = NULL; | ||
47 | } | 53 | } |
48 | } | 54 | } |
49 | 55 | ||
50 | agp_bridge->previous_size = | 56 | if (!size) { |
51 | agp_bridge->current_size = (void *) (values + 1); | 57 | for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) |
52 | agp_bridge->aperture_size_idx = 1; | 58 | if (values[i].size == 32) |
53 | return values[1].size; | 59 | break; |
60 | } | ||
54 | 61 | ||
55 | return 0; | 62 | agp_bridge->previous_size = |
63 | agp_bridge->current_size = (void *)(values + i); | ||
64 | agp_bridge->aperture_size_idx = i; | ||
65 | return values[i].size; | ||
56 | } | 66 | } |
57 | 67 | ||
58 | static void uninorth_tlbflush(struct agp_memory *mem) | 68 | static void uninorth_tlbflush(struct agp_memory *mem) |
@@ -683,5 +693,11 @@ static void __exit agp_uninorth_cleanup(void) | |||
683 | module_init(agp_uninorth_init); | 693 | module_init(agp_uninorth_init); |
684 | module_exit(agp_uninorth_cleanup); | 694 | module_exit(agp_uninorth_cleanup); |
685 | 695 | ||
696 | module_param(aperture, charp, 0); | ||
697 | MODULE_PARM_DESC(aperture, | ||
698 | "Aperture size, must be power of two between 4MB and an\n" | ||
699 | "\t\tupper limit specific to the UniNorth revision.\n" | ||
700 | "\t\tDefault: 32M"); | ||
701 | |||
686 | MODULE_AUTHOR("Ben Herrenschmidt & Paul Mackerras"); | 702 | MODULE_AUTHOR("Ben Herrenschmidt & Paul Mackerras"); |
687 | MODULE_LICENSE("GPL"); | 703 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/char/drm/drm_bufs.c b/drivers/char/drm/drm_bufs.c index 029baea33b62..6eafff13dab6 100644 --- a/drivers/char/drm/drm_bufs.c +++ b/drivers/char/drm/drm_bufs.c | |||
@@ -237,6 +237,8 @@ static int drm_addmap_core(drm_device_t * dev, unsigned int offset, | |||
237 | 237 | ||
238 | list = drm_alloc(sizeof(*list), DRM_MEM_MAPS); | 238 | list = drm_alloc(sizeof(*list), DRM_MEM_MAPS); |
239 | if (!list) { | 239 | if (!list) { |
240 | if (map->type == _DRM_REGISTERS) | ||
241 | drm_ioremapfree(map->handle, map->size, dev); | ||
240 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 242 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); |
241 | return -EINVAL; | 243 | return -EINVAL; |
242 | } | 244 | } |
@@ -252,6 +254,8 @@ static int drm_addmap_core(drm_device_t * dev, unsigned int offset, | |||
252 | map->offset; | 254 | map->offset; |
253 | ret = drm_map_handle(dev, &list->hash, user_token, 0); | 255 | ret = drm_map_handle(dev, &list->hash, user_token, 0); |
254 | if (ret) { | 256 | if (ret) { |
257 | if (map->type == _DRM_REGISTERS) | ||
258 | drm_ioremapfree(map->handle, map->size, dev); | ||
255 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 259 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); |
256 | drm_free(list, sizeof(*list), DRM_MEM_MAPS); | 260 | drm_free(list, sizeof(*list), DRM_MEM_MAPS); |
257 | mutex_unlock(&dev->struct_mutex); | 261 | mutex_unlock(&dev->struct_mutex); |
diff --git a/drivers/char/drm/drm_sysfs.c b/drivers/char/drm/drm_sysfs.c index 51ad98c685c3..ba4b8de83cf0 100644 --- a/drivers/char/drm/drm_sysfs.c +++ b/drivers/char/drm/drm_sysfs.c | |||
@@ -42,13 +42,24 @@ static CLASS_ATTR(version, S_IRUGO, version_show, NULL); | |||
42 | struct class *drm_sysfs_create(struct module *owner, char *name) | 42 | struct class *drm_sysfs_create(struct module *owner, char *name) |
43 | { | 43 | { |
44 | struct class *class; | 44 | struct class *class; |
45 | int err; | ||
45 | 46 | ||
46 | class = class_create(owner, name); | 47 | class = class_create(owner, name); |
47 | if (!class) | 48 | if (!class) { |
48 | return class; | 49 | err = -ENOMEM; |
50 | goto err_out; | ||
51 | } | ||
52 | |||
53 | err = class_create_file(class, &class_attr_version); | ||
54 | if (err) | ||
55 | goto err_out_class; | ||
49 | 56 | ||
50 | class_create_file(class, &class_attr_version); | ||
51 | return class; | 57 | return class; |
58 | |||
59 | err_out_class: | ||
60 | class_destroy(class); | ||
61 | err_out: | ||
62 | return ERR_PTR(err); | ||
52 | } | 63 | } |
53 | 64 | ||
54 | /** | 65 | /** |
@@ -96,20 +107,36 @@ static struct class_device_attribute class_device_attrs[] = { | |||
96 | struct class_device *drm_sysfs_device_add(struct class *cs, drm_head_t *head) | 107 | struct class_device *drm_sysfs_device_add(struct class *cs, drm_head_t *head) |
97 | { | 108 | { |
98 | struct class_device *class_dev; | 109 | struct class_device *class_dev; |
99 | int i; | 110 | int i, j, err; |
100 | 111 | ||
101 | class_dev = class_device_create(cs, NULL, | 112 | class_dev = class_device_create(cs, NULL, |
102 | MKDEV(DRM_MAJOR, head->minor), | 113 | MKDEV(DRM_MAJOR, head->minor), |
103 | &(head->dev->pdev)->dev, | 114 | &(head->dev->pdev)->dev, |
104 | "card%d", head->minor); | 115 | "card%d", head->minor); |
105 | if (!class_dev) | 116 | if (!class_dev) { |
106 | return NULL; | 117 | err = -ENOMEM; |
118 | goto err_out; | ||
119 | } | ||
107 | 120 | ||
108 | class_set_devdata(class_dev, head); | 121 | class_set_devdata(class_dev, head); |
109 | 122 | ||
110 | for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) | 123 | for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) { |
111 | class_device_create_file(class_dev, &class_device_attrs[i]); | 124 | err = class_device_create_file(class_dev, |
125 | &class_device_attrs[i]); | ||
126 | if (err) | ||
127 | goto err_out_files; | ||
128 | } | ||
129 | |||
112 | return class_dev; | 130 | return class_dev; |
131 | |||
132 | err_out_files: | ||
133 | if (i > 0) | ||
134 | for (j = 0; j < i; j++) | ||
135 | class_device_remove_file(class_dev, | ||
136 | &class_device_attrs[i]); | ||
137 | class_device_unregister(class_dev); | ||
138 | err_out: | ||
139 | return ERR_PTR(err); | ||
113 | } | 140 | } |
114 | 141 | ||
115 | /** | 142 | /** |
diff --git a/drivers/char/drm/mga_drv.c b/drivers/char/drm/mga_drv.c index e30f556b79f1..be49dbb9ec3f 100644 --- a/drivers/char/drm/mga_drv.c +++ b/drivers/char/drm/mga_drv.c | |||
@@ -47,6 +47,7 @@ static struct drm_driver driver = { | |||
47 | DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | | 47 | DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | |
48 | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | | 48 | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | |
49 | DRIVER_IRQ_VBL, | 49 | DRIVER_IRQ_VBL, |
50 | .dev_priv_size = sizeof(drm_mga_buf_priv_t), | ||
50 | .load = mga_driver_load, | 51 | .load = mga_driver_load, |
51 | .unload = mga_driver_unload, | 52 | .unload = mga_driver_unload, |
52 | .lastclose = mga_driver_lastclose, | 53 | .lastclose = mga_driver_lastclose, |
diff --git a/drivers/char/drm/r300_cmdbuf.c b/drivers/char/drm/r300_cmdbuf.c index 26bdf2ca59d7..d14477ba3679 100644 --- a/drivers/char/drm/r300_cmdbuf.c +++ b/drivers/char/drm/r300_cmdbuf.c | |||
@@ -538,6 +538,36 @@ static __inline__ int r300_emit_bitblt_multi(drm_radeon_private_t *dev_priv, | |||
538 | return 0; | 538 | return 0; |
539 | } | 539 | } |
540 | 540 | ||
541 | static __inline__ int r300_emit_indx_buffer(drm_radeon_private_t *dev_priv, | ||
542 | drm_radeon_kcmd_buffer_t *cmdbuf) | ||
543 | { | ||
544 | u32 *cmd = (u32 *) cmdbuf->buf; | ||
545 | int count, ret; | ||
546 | RING_LOCALS; | ||
547 | |||
548 | count=(cmd[0]>>16) & 0x3fff; | ||
549 | |||
550 | if ((cmd[1] & 0x8000ffff) != 0x80000810) { | ||
551 | DRM_ERROR("Invalid indx_buffer reg address %08X\n", cmd[1]); | ||
552 | return DRM_ERR(EINVAL); | ||
553 | } | ||
554 | ret = r300_check_offset(dev_priv, cmd[2]); | ||
555 | if (ret) { | ||
556 | DRM_ERROR("Invalid indx_buffer offset is %08X\n", cmd[2]); | ||
557 | return DRM_ERR(EINVAL); | ||
558 | } | ||
559 | |||
560 | BEGIN_RING(count+2); | ||
561 | OUT_RING(cmd[0]); | ||
562 | OUT_RING_TABLE((int *)(cmdbuf->buf + 4), count + 1); | ||
563 | ADVANCE_RING(); | ||
564 | |||
565 | cmdbuf->buf += (count+2)*4; | ||
566 | cmdbuf->bufsz -= (count+2)*4; | ||
567 | |||
568 | return 0; | ||
569 | } | ||
570 | |||
541 | static __inline__ int r300_emit_raw_packet3(drm_radeon_private_t *dev_priv, | 571 | static __inline__ int r300_emit_raw_packet3(drm_radeon_private_t *dev_priv, |
542 | drm_radeon_kcmd_buffer_t *cmdbuf) | 572 | drm_radeon_kcmd_buffer_t *cmdbuf) |
543 | { | 573 | { |
@@ -578,10 +608,11 @@ static __inline__ int r300_emit_raw_packet3(drm_radeon_private_t *dev_priv, | |||
578 | case RADEON_CNTL_BITBLT_MULTI: | 608 | case RADEON_CNTL_BITBLT_MULTI: |
579 | return r300_emit_bitblt_multi(dev_priv, cmdbuf); | 609 | return r300_emit_bitblt_multi(dev_priv, cmdbuf); |
580 | 610 | ||
611 | case RADEON_CP_INDX_BUFFER: /* DRAW_INDX_2 without INDX_BUFFER seems to lock up the gpu */ | ||
612 | return r300_emit_indx_buffer(dev_priv, cmdbuf); | ||
581 | case RADEON_CP_3D_DRAW_IMMD_2: /* triggers drawing using in-packet vertex data */ | 613 | case RADEON_CP_3D_DRAW_IMMD_2: /* triggers drawing using in-packet vertex data */ |
582 | case RADEON_CP_3D_DRAW_VBUF_2: /* triggers drawing of vertex buffers setup elsewhere */ | 614 | case RADEON_CP_3D_DRAW_VBUF_2: /* triggers drawing of vertex buffers setup elsewhere */ |
583 | case RADEON_CP_3D_DRAW_INDX_2: /* triggers drawing using indices to vertex buffer */ | 615 | case RADEON_CP_3D_DRAW_INDX_2: /* triggers drawing using indices to vertex buffer */ |
584 | case RADEON_CP_INDX_BUFFER: /* DRAW_INDX_2 without INDX_BUFFER seems to lock up the gpu */ | ||
585 | case RADEON_WAIT_FOR_IDLE: | 616 | case RADEON_WAIT_FOR_IDLE: |
586 | case RADEON_CP_NOP: | 617 | case RADEON_CP_NOP: |
587 | /* these packets are safe */ | 618 | /* these packets are safe */ |
diff --git a/drivers/char/drm/radeon_state.c b/drivers/char/drm/radeon_state.c index feac5f005d47..6e04fdd732ac 100644 --- a/drivers/char/drm/radeon_state.c +++ b/drivers/char/drm/radeon_state.c | |||
@@ -275,6 +275,8 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t * | |||
275 | unsigned int *cmdsz) | 275 | unsigned int *cmdsz) |
276 | { | 276 | { |
277 | u32 *cmd = (u32 *) cmdbuf->buf; | 277 | u32 *cmd = (u32 *) cmdbuf->buf; |
278 | u32 offset, narrays; | ||
279 | int count, i, k; | ||
278 | 280 | ||
279 | *cmdsz = 2 + ((cmd[0] & RADEON_CP_PACKET_COUNT_MASK) >> 16); | 281 | *cmdsz = 2 + ((cmd[0] & RADEON_CP_PACKET_COUNT_MASK) >> 16); |
280 | 282 | ||
@@ -288,10 +290,106 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t * | |||
288 | return DRM_ERR(EINVAL); | 290 | return DRM_ERR(EINVAL); |
289 | } | 291 | } |
290 | 292 | ||
291 | /* Check client state and fix it up if necessary */ | 293 | switch(cmd[0] & 0xff00) { |
292 | if (cmd[0] & 0x8000) { /* MSB of opcode: next DWORD GUI_CNTL */ | 294 | /* XXX Are there old drivers needing other packets? */ |
293 | u32 offset; | ||
294 | 295 | ||
296 | case RADEON_3D_DRAW_IMMD: | ||
297 | case RADEON_3D_DRAW_VBUF: | ||
298 | case RADEON_3D_DRAW_INDX: | ||
299 | case RADEON_WAIT_FOR_IDLE: | ||
300 | case RADEON_CP_NOP: | ||
301 | case RADEON_3D_CLEAR_ZMASK: | ||
302 | /* case RADEON_CP_NEXT_CHAR: | ||
303 | case RADEON_CP_PLY_NEXTSCAN: | ||
304 | case RADEON_CP_SET_SCISSORS: */ /* probably safe but will never need them? */ | ||
305 | /* these packets are safe */ | ||
306 | break; | ||
307 | |||
308 | case RADEON_CP_3D_DRAW_IMMD_2: | ||
309 | case RADEON_CP_3D_DRAW_VBUF_2: | ||
310 | case RADEON_CP_3D_DRAW_INDX_2: | ||
311 | case RADEON_3D_CLEAR_HIZ: | ||
312 | /* safe but r200 only */ | ||
313 | if (dev_priv->microcode_version != UCODE_R200) { | ||
314 | DRM_ERROR("Invalid 3d packet for r100-class chip\n"); | ||
315 | return DRM_ERR(EINVAL); | ||
316 | } | ||
317 | break; | ||
318 | |||
319 | case RADEON_3D_LOAD_VBPNTR: | ||
320 | count = (cmd[0] >> 16) & 0x3fff; | ||
321 | |||
322 | if (count > 18) { /* 12 arrays max */ | ||
323 | DRM_ERROR("Too large payload in 3D_LOAD_VBPNTR (count=%d)\n", | ||
324 | count); | ||
325 | return DRM_ERR(EINVAL); | ||
326 | } | ||
327 | |||
328 | /* carefully check packet contents */ | ||
329 | narrays = cmd[1] & ~0xc000; | ||
330 | k = 0; | ||
331 | i = 2; | ||
332 | while ((k < narrays) && (i < (count + 2))) { | ||
333 | i++; /* skip attribute field */ | ||
334 | if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[i])) { | ||
335 | DRM_ERROR | ||
336 | ("Invalid offset (k=%d i=%d) in 3D_LOAD_VBPNTR packet.\n", | ||
337 | k, i); | ||
338 | return DRM_ERR(EINVAL); | ||
339 | } | ||
340 | k++; | ||
341 | i++; | ||
342 | if (k == narrays) | ||
343 | break; | ||
344 | /* have one more to process, they come in pairs */ | ||
345 | if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[i])) { | ||
346 | DRM_ERROR | ||
347 | ("Invalid offset (k=%d i=%d) in 3D_LOAD_VBPNTR packet.\n", | ||
348 | k, i); | ||
349 | return DRM_ERR(EINVAL); | ||
350 | } | ||
351 | k++; | ||
352 | i++; | ||
353 | } | ||
354 | /* do the counts match what we expect ? */ | ||
355 | if ((k != narrays) || (i != (count + 2))) { | ||
356 | DRM_ERROR | ||
357 | ("Malformed 3D_LOAD_VBPNTR packet (k=%d i=%d narrays=%d count+1=%d).\n", | ||
358 | k, i, narrays, count + 1); | ||
359 | return DRM_ERR(EINVAL); | ||
360 | } | ||
361 | break; | ||
362 | |||
363 | case RADEON_3D_RNDR_GEN_INDX_PRIM: | ||
364 | if (dev_priv->microcode_version != UCODE_R100) { | ||
365 | DRM_ERROR("Invalid 3d packet for r200-class chip\n"); | ||
366 | return DRM_ERR(EINVAL); | ||
367 | } | ||
368 | if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[1])) { | ||
369 | DRM_ERROR("Invalid rndr_gen_indx offset\n"); | ||
370 | return DRM_ERR(EINVAL); | ||
371 | } | ||
372 | break; | ||
373 | |||
374 | case RADEON_CP_INDX_BUFFER: | ||
375 | if (dev_priv->microcode_version != UCODE_R200) { | ||
376 | DRM_ERROR("Invalid 3d packet for r100-class chip\n"); | ||
377 | return DRM_ERR(EINVAL); | ||
378 | } | ||
379 | if ((cmd[1] & 0x8000ffff) != 0x80000810) { | ||
380 | DRM_ERROR("Invalid indx_buffer reg address %08X\n", cmd[1]); | ||
381 | return DRM_ERR(EINVAL); | ||
382 | } | ||
383 | if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[2])) { | ||
384 | DRM_ERROR("Invalid indx_buffer offset is %08X\n", cmd[2]); | ||
385 | return DRM_ERR(EINVAL); | ||
386 | } | ||
387 | break; | ||
388 | |||
389 | case RADEON_CNTL_HOSTDATA_BLT: | ||
390 | case RADEON_CNTL_PAINT_MULTI: | ||
391 | case RADEON_CNTL_BITBLT_MULTI: | ||
392 | /* MSB of opcode: next DWORD GUI_CNTL */ | ||
295 | if (cmd[1] & (RADEON_GMC_SRC_PITCH_OFFSET_CNTL | 393 | if (cmd[1] & (RADEON_GMC_SRC_PITCH_OFFSET_CNTL |
296 | | RADEON_GMC_DST_PITCH_OFFSET_CNTL)) { | 394 | | RADEON_GMC_DST_PITCH_OFFSET_CNTL)) { |
297 | offset = cmd[2] << 10; | 395 | offset = cmd[2] << 10; |
@@ -313,6 +411,11 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t * | |||
313 | } | 411 | } |
314 | cmd[3] = (cmd[3] & 0xffc00000) | offset >> 10; | 412 | cmd[3] = (cmd[3] & 0xffc00000) | offset >> 10; |
315 | } | 413 | } |
414 | break; | ||
415 | |||
416 | default: | ||
417 | DRM_ERROR("Invalid packet type %x\n", cmd[0] & 0xff00); | ||
418 | return DRM_ERR(EINVAL); | ||
316 | } | 419 | } |
317 | 420 | ||
318 | return 0; | 421 | return 0; |
diff --git a/drivers/char/drm/savage_bci.c b/drivers/char/drm/savage_bci.c index 59c7520bf9a2..a9a84f88df5e 100644 --- a/drivers/char/drm/savage_bci.c +++ b/drivers/char/drm/savage_bci.c | |||
@@ -728,6 +728,7 @@ static int savage_do_init_bci(drm_device_t * dev, drm_savage_init_t * init) | |||
728 | dev_priv->status = NULL; | 728 | dev_priv->status = NULL; |
729 | } | 729 | } |
730 | if (dev_priv->dma_type == SAVAGE_DMA_AGP && init->buffers_offset) { | 730 | if (dev_priv->dma_type == SAVAGE_DMA_AGP && init->buffers_offset) { |
731 | dev->agp_buffer_token = init->buffers_offset; | ||
731 | dev->agp_buffer_map = drm_core_findmap(dev, | 732 | dev->agp_buffer_map = drm_core_findmap(dev, |
732 | init->buffers_offset); | 733 | init->buffers_offset); |
733 | if (!dev->agp_buffer_map) { | 734 | if (!dev->agp_buffer_map) { |
diff --git a/drivers/char/drm/savage_state.c b/drivers/char/drm/savage_state.c index ef2581d16146..1ca1e9cb5a33 100644 --- a/drivers/char/drm/savage_state.c +++ b/drivers/char/drm/savage_state.c | |||
@@ -994,7 +994,7 @@ int savage_bci_cmdbuf(DRM_IOCTL_ARGS) | |||
994 | if (cmdbuf.size) { | 994 | if (cmdbuf.size) { |
995 | kcmd_addr = drm_alloc(cmdbuf.size * 8, DRM_MEM_DRIVER); | 995 | kcmd_addr = drm_alloc(cmdbuf.size * 8, DRM_MEM_DRIVER); |
996 | if (kcmd_addr == NULL) | 996 | if (kcmd_addr == NULL) |
997 | return ENOMEM; | 997 | return DRM_ERR(ENOMEM); |
998 | 998 | ||
999 | if (DRM_COPY_FROM_USER(kcmd_addr, cmdbuf.cmd_addr, | 999 | if (DRM_COPY_FROM_USER(kcmd_addr, cmdbuf.cmd_addr, |
1000 | cmdbuf.size * 8)) | 1000 | cmdbuf.size * 8)) |
diff --git a/drivers/char/ftape/zftape/zftape-buffers.c b/drivers/char/ftape/zftape/zftape-buffers.c index da06f138334e..7ebce2ec7897 100644 --- a/drivers/char/ftape/zftape/zftape-buffers.c +++ b/drivers/char/ftape/zftape/zftape-buffers.c | |||
@@ -85,7 +85,7 @@ int zft_vmalloc_once(void *new, size_t size) | |||
85 | peak_memory = used_memory; | 85 | peak_memory = used_memory; |
86 | } | 86 | } |
87 | TRACE_ABORT(0, ft_t_noise, | 87 | TRACE_ABORT(0, ft_t_noise, |
88 | "allocated buffer @ %p, %d bytes", *(void **)new, size); | 88 | "allocated buffer @ %p, %zd bytes", *(void **)new, size); |
89 | } | 89 | } |
90 | int zft_vmalloc_always(void *new, size_t size) | 90 | int zft_vmalloc_always(void *new, size_t size) |
91 | { | 91 | { |
@@ -101,7 +101,7 @@ void zft_vfree(void *old, size_t size) | |||
101 | if (*(void **)old) { | 101 | if (*(void **)old) { |
102 | vfree(*(void **)old); | 102 | vfree(*(void **)old); |
103 | used_memory -= size; | 103 | used_memory -= size; |
104 | TRACE(ft_t_noise, "released buffer @ %p, %d bytes", | 104 | TRACE(ft_t_noise, "released buffer @ %p, %zd bytes", |
105 | *(void **)old, size); | 105 | *(void **)old, size); |
106 | *(void **)old = NULL; | 106 | *(void **)old = NULL; |
107 | } | 107 | } |
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index 34a4fd13fa81..c47add8e47df 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c | |||
@@ -376,13 +376,23 @@ static void free_recv_msg_list(struct list_head *q) | |||
376 | } | 376 | } |
377 | } | 377 | } |
378 | 378 | ||
379 | static void free_smi_msg_list(struct list_head *q) | ||
380 | { | ||
381 | struct ipmi_smi_msg *msg, *msg2; | ||
382 | |||
383 | list_for_each_entry_safe(msg, msg2, q, link) { | ||
384 | list_del(&msg->link); | ||
385 | ipmi_free_smi_msg(msg); | ||
386 | } | ||
387 | } | ||
388 | |||
379 | static void clean_up_interface_data(ipmi_smi_t intf) | 389 | static void clean_up_interface_data(ipmi_smi_t intf) |
380 | { | 390 | { |
381 | int i; | 391 | int i; |
382 | struct cmd_rcvr *rcvr, *rcvr2; | 392 | struct cmd_rcvr *rcvr, *rcvr2; |
383 | struct list_head list; | 393 | struct list_head list; |
384 | 394 | ||
385 | free_recv_msg_list(&intf->waiting_msgs); | 395 | free_smi_msg_list(&intf->waiting_msgs); |
386 | free_recv_msg_list(&intf->waiting_events); | 396 | free_recv_msg_list(&intf->waiting_events); |
387 | 397 | ||
388 | /* Wholesale remove all the entries from the list in the | 398 | /* Wholesale remove all the entries from the list in the |
@@ -1844,7 +1854,7 @@ static ssize_t provides_dev_sdrs_show(struct device *dev, | |||
1844 | struct bmc_device *bmc = dev_get_drvdata(dev); | 1854 | struct bmc_device *bmc = dev_get_drvdata(dev); |
1845 | 1855 | ||
1846 | return snprintf(buf, 10, "%u\n", | 1856 | return snprintf(buf, 10, "%u\n", |
1847 | bmc->id.device_revision && 0x80 >> 7); | 1857 | (bmc->id.device_revision & 0x80) >> 7); |
1848 | } | 1858 | } |
1849 | 1859 | ||
1850 | static ssize_t revision_show(struct device *dev, struct device_attribute *attr, | 1860 | static ssize_t revision_show(struct device *dev, struct device_attribute *attr, |
@@ -1853,7 +1863,7 @@ static ssize_t revision_show(struct device *dev, struct device_attribute *attr, | |||
1853 | struct bmc_device *bmc = dev_get_drvdata(dev); | 1863 | struct bmc_device *bmc = dev_get_drvdata(dev); |
1854 | 1864 | ||
1855 | return snprintf(buf, 20, "%u\n", | 1865 | return snprintf(buf, 20, "%u\n", |
1856 | bmc->id.device_revision && 0x0F); | 1866 | bmc->id.device_revision & 0x0F); |
1857 | } | 1867 | } |
1858 | 1868 | ||
1859 | static ssize_t firmware_rev_show(struct device *dev, | 1869 | static ssize_t firmware_rev_show(struct device *dev, |
@@ -2108,7 +2118,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf) | |||
2108 | dev_set_drvdata(&bmc->dev->dev, bmc); | 2118 | dev_set_drvdata(&bmc->dev->dev, bmc); |
2109 | kref_init(&bmc->refcount); | 2119 | kref_init(&bmc->refcount); |
2110 | 2120 | ||
2111 | rv = platform_device_register(bmc->dev); | 2121 | rv = platform_device_add(bmc->dev); |
2112 | mutex_unlock(&ipmidriver_mutex); | 2122 | mutex_unlock(&ipmidriver_mutex); |
2113 | if (rv) { | 2123 | if (rv) { |
2114 | printk(KERN_ERR | 2124 | printk(KERN_ERR |
@@ -3232,7 +3242,9 @@ void ipmi_smi_msg_received(ipmi_smi_t intf, | |||
3232 | report the error immediately. */ | 3242 | report the error immediately. */ |
3233 | if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0) | 3243 | if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0) |
3234 | && (msg->rsp[2] != IPMI_NODE_BUSY_ERR) | 3244 | && (msg->rsp[2] != IPMI_NODE_BUSY_ERR) |
3235 | && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR)) | 3245 | && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR) |
3246 | && (msg->rsp[2] != IPMI_BUS_ERR) | ||
3247 | && (msg->rsp[2] != IPMI_NAK_ON_WRITE_ERR)) | ||
3236 | { | 3248 | { |
3237 | int chan = msg->rsp[3] & 0xf; | 3249 | int chan = msg->rsp[3] & 0xf; |
3238 | 3250 | ||
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index e5cfb1fa47d1..bb1fac104fda 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -1211,7 +1211,7 @@ static void intf_mem_outb(struct si_sm_io *io, unsigned int offset, | |||
1211 | static unsigned char intf_mem_inw(struct si_sm_io *io, unsigned int offset) | 1211 | static unsigned char intf_mem_inw(struct si_sm_io *io, unsigned int offset) |
1212 | { | 1212 | { |
1213 | return (readw((io->addr)+(offset * io->regspacing)) >> io->regshift) | 1213 | return (readw((io->addr)+(offset * io->regspacing)) >> io->regshift) |
1214 | && 0xff; | 1214 | & 0xff; |
1215 | } | 1215 | } |
1216 | 1216 | ||
1217 | static void intf_mem_outw(struct si_sm_io *io, unsigned int offset, | 1217 | static void intf_mem_outw(struct si_sm_io *io, unsigned int offset, |
@@ -1223,7 +1223,7 @@ static void intf_mem_outw(struct si_sm_io *io, unsigned int offset, | |||
1223 | static unsigned char intf_mem_inl(struct si_sm_io *io, unsigned int offset) | 1223 | static unsigned char intf_mem_inl(struct si_sm_io *io, unsigned int offset) |
1224 | { | 1224 | { |
1225 | return (readl((io->addr)+(offset * io->regspacing)) >> io->regshift) | 1225 | return (readl((io->addr)+(offset * io->regspacing)) >> io->regshift) |
1226 | && 0xff; | 1226 | & 0xff; |
1227 | } | 1227 | } |
1228 | 1228 | ||
1229 | static void intf_mem_outl(struct si_sm_io *io, unsigned int offset, | 1229 | static void intf_mem_outl(struct si_sm_io *io, unsigned int offset, |
@@ -1236,7 +1236,7 @@ static void intf_mem_outl(struct si_sm_io *io, unsigned int offset, | |||
1236 | static unsigned char mem_inq(struct si_sm_io *io, unsigned int offset) | 1236 | static unsigned char mem_inq(struct si_sm_io *io, unsigned int offset) |
1237 | { | 1237 | { |
1238 | return (readq((io->addr)+(offset * io->regspacing)) >> io->regshift) | 1238 | return (readq((io->addr)+(offset * io->regspacing)) >> io->regshift) |
1239 | && 0xff; | 1239 | & 0xff; |
1240 | } | 1240 | } |
1241 | 1241 | ||
1242 | static void mem_outq(struct si_sm_io *io, unsigned int offset, | 1242 | static void mem_outq(struct si_sm_io *io, unsigned int offset, |
@@ -1867,7 +1867,7 @@ static int ipmi_pci_resume(struct pci_dev *pdev) | |||
1867 | 1867 | ||
1868 | static struct pci_device_id ipmi_pci_devices[] = { | 1868 | static struct pci_device_id ipmi_pci_devices[] = { |
1869 | { PCI_DEVICE(PCI_HP_VENDOR_ID, PCI_MMC_DEVICE_ID) }, | 1869 | { PCI_DEVICE(PCI_HP_VENDOR_ID, PCI_MMC_DEVICE_ID) }, |
1870 | { PCI_DEVICE_CLASS(PCI_ERMC_CLASSCODE, PCI_ERMC_CLASSCODE) } | 1870 | { PCI_DEVICE_CLASS(PCI_ERMC_CLASSCODE, PCI_ERMC_CLASSCODE_MASK) } |
1871 | }; | 1871 | }; |
1872 | MODULE_DEVICE_TABLE(pci, ipmi_pci_devices); | 1872 | MODULE_DEVICE_TABLE(pci, ipmi_pci_devices); |
1873 | 1873 | ||
@@ -2346,7 +2346,7 @@ static int try_smi_init(struct smi_info *new_smi) | |||
2346 | new_smi->dev = &new_smi->pdev->dev; | 2346 | new_smi->dev = &new_smi->pdev->dev; |
2347 | new_smi->dev->driver = &ipmi_driver; | 2347 | new_smi->dev->driver = &ipmi_driver; |
2348 | 2348 | ||
2349 | rv = platform_device_register(new_smi->pdev); | 2349 | rv = platform_device_add(new_smi->pdev); |
2350 | if (rv) { | 2350 | if (rv) { |
2351 | printk(KERN_ERR | 2351 | printk(KERN_ERR |
2352 | "ipmi_si_intf:" | 2352 | "ipmi_si_intf:" |
diff --git a/drivers/char/isicom.c b/drivers/char/isicom.c index e9e9bf31c369..58c955e390b3 100644 --- a/drivers/char/isicom.c +++ b/drivers/char/isicom.c | |||
@@ -1062,11 +1062,12 @@ static void isicom_shutdown_port(struct isi_port *port) | |||
1062 | static void isicom_close(struct tty_struct *tty, struct file *filp) | 1062 | static void isicom_close(struct tty_struct *tty, struct file *filp) |
1063 | { | 1063 | { |
1064 | struct isi_port *port = tty->driver_data; | 1064 | struct isi_port *port = tty->driver_data; |
1065 | struct isi_board *card = port->card; | 1065 | struct isi_board *card; |
1066 | unsigned long flags; | 1066 | unsigned long flags; |
1067 | 1067 | ||
1068 | if (!port) | 1068 | if (!port) |
1069 | return; | 1069 | return; |
1070 | card = port->card; | ||
1070 | if (isicom_paranoia_check(port, tty->name, "isicom_close")) | 1071 | if (isicom_paranoia_check(port, tty->name, "isicom_close")) |
1071 | return; | 1072 | return; |
1072 | 1073 | ||
diff --git a/drivers/char/moxa.c b/drivers/char/moxa.c index b401383808c2..96cb1f07332b 100644 --- a/drivers/char/moxa.c +++ b/drivers/char/moxa.c | |||
@@ -130,6 +130,7 @@ static moxa_isa_board_conf moxa_isa_boards[] = | |||
130 | typedef struct _moxa_pci_devinfo { | 130 | typedef struct _moxa_pci_devinfo { |
131 | ushort busNum; | 131 | ushort busNum; |
132 | ushort devNum; | 132 | ushort devNum; |
133 | struct pci_dev *pdev; | ||
133 | } moxa_pci_devinfo; | 134 | } moxa_pci_devinfo; |
134 | 135 | ||
135 | typedef struct _moxa_board_conf { | 136 | typedef struct _moxa_board_conf { |
@@ -324,6 +325,9 @@ static int moxa_get_PCI_conf(struct pci_dev *p, int board_type, moxa_board_conf | |||
324 | board->busType = MOXA_BUS_TYPE_PCI; | 325 | board->busType = MOXA_BUS_TYPE_PCI; |
325 | board->pciInfo.busNum = p->bus->number; | 326 | board->pciInfo.busNum = p->bus->number; |
326 | board->pciInfo.devNum = p->devfn >> 3; | 327 | board->pciInfo.devNum = p->devfn >> 3; |
328 | board->pciInfo.pdev = p; | ||
329 | /* don't lose the reference in the next pci_get_device iteration */ | ||
330 | pci_dev_get(p); | ||
327 | 331 | ||
328 | return (0); | 332 | return (0); |
329 | } | 333 | } |
@@ -493,6 +497,11 @@ static void __exit moxa_exit(void) | |||
493 | if (tty_unregister_driver(moxaDriver)) | 497 | if (tty_unregister_driver(moxaDriver)) |
494 | printk("Couldn't unregister MOXA Intellio family serial driver\n"); | 498 | printk("Couldn't unregister MOXA Intellio family serial driver\n"); |
495 | put_tty_driver(moxaDriver); | 499 | put_tty_driver(moxaDriver); |
500 | |||
501 | for (i = 0; i < MAX_BOARDS; i++) | ||
502 | if (moxa_boards[i].busType == MOXA_BUS_TYPE_PCI) | ||
503 | pci_dev_put(moxa_boards[i].pciInfo.pdev); | ||
504 | |||
496 | if (verbose) | 505 | if (verbose) |
497 | printk("Done\n"); | 506 | printk("Done\n"); |
498 | } | 507 | } |
diff --git a/drivers/char/mspec.c b/drivers/char/mspec.c index 5c0dec39cf6c..235e89226112 100644 --- a/drivers/char/mspec.c +++ b/drivers/char/mspec.c | |||
@@ -72,7 +72,11 @@ enum { | |||
72 | MSPEC_UNCACHED | 72 | MSPEC_UNCACHED |
73 | }; | 73 | }; |
74 | 74 | ||
75 | #ifdef CONFIG_SGI_SN | ||
75 | static int is_sn2; | 76 | static int is_sn2; |
77 | #else | ||
78 | #define is_sn2 0 | ||
79 | #endif | ||
76 | 80 | ||
77 | /* | 81 | /* |
78 | * One of these structures is allocated when an mspec region is mmaped. The | 82 | * One of these structures is allocated when an mspec region is mmaped. The |
@@ -211,7 +215,7 @@ mspec_nopfn(struct vm_area_struct *vma, unsigned long address) | |||
211 | if (vdata->type == MSPEC_FETCHOP) | 215 | if (vdata->type == MSPEC_FETCHOP) |
212 | paddr = TO_AMO(maddr); | 216 | paddr = TO_AMO(maddr); |
213 | else | 217 | else |
214 | paddr = __pa(TO_CAC(maddr)); | 218 | paddr = maddr & ~__IA64_UNCACHED_OFFSET; |
215 | 219 | ||
216 | pfn = paddr >> PAGE_SHIFT; | 220 | pfn = paddr >> PAGE_SHIFT; |
217 | 221 | ||
@@ -335,6 +339,7 @@ mspec_init(void) | |||
335 | * The fetchop device only works on SN2 hardware, uncached and cached | 339 | * The fetchop device only works on SN2 hardware, uncached and cached |
336 | * memory drivers should both be valid on all ia64 hardware | 340 | * memory drivers should both be valid on all ia64 hardware |
337 | */ | 341 | */ |
342 | #ifdef CONFIG_SGI_SN | ||
338 | if (ia64_platform_is("sn2")) { | 343 | if (ia64_platform_is("sn2")) { |
339 | is_sn2 = 1; | 344 | is_sn2 = 1; |
340 | if (is_shub2()) { | 345 | if (is_shub2()) { |
@@ -363,6 +368,7 @@ mspec_init(void) | |||
363 | goto free_scratch_pages; | 368 | goto free_scratch_pages; |
364 | } | 369 | } |
365 | } | 370 | } |
371 | #endif | ||
366 | ret = misc_register(&cached_miscdev); | 372 | ret = misc_register(&cached_miscdev); |
367 | if (ret) { | 373 | if (ret) { |
368 | printk(KERN_ERR "%s: failed to register device %i\n", | 374 | printk(KERN_ERR "%s: failed to register device %i\n", |
diff --git a/drivers/char/rio/host.h b/drivers/char/rio/host.h index ee2ddea7a63a..23d0681fe491 100644 --- a/drivers/char/rio/host.h +++ b/drivers/char/rio/host.h | |||
@@ -44,6 +44,7 @@ | |||
44 | ** the host. | 44 | ** the host. |
45 | */ | 45 | */ |
46 | struct Host { | 46 | struct Host { |
47 | struct pci_dev *pdev; | ||
47 | unsigned char Type; /* RIO_EISA, RIO_MCA, ... */ | 48 | unsigned char Type; /* RIO_EISA, RIO_MCA, ... */ |
48 | unsigned char Ivec; /* POLLED or ivec number */ | 49 | unsigned char Ivec; /* POLLED or ivec number */ |
49 | unsigned char Mode; /* Control stuff */ | 50 | unsigned char Mode; /* Control stuff */ |
diff --git a/drivers/char/rio/rio_linux.c b/drivers/char/rio/rio_linux.c index c382df0f82f6..7ac68cb3bedd 100644 --- a/drivers/char/rio/rio_linux.c +++ b/drivers/char/rio/rio_linux.c | |||
@@ -1017,6 +1017,10 @@ static int __init rio_init(void) | |||
1017 | rio_dprintk(RIO_DEBUG_PROBE, "Hmm Tested ok, uniqid = %x.\n", p->RIOHosts[p->RIONumHosts].UniqueNum); | 1017 | rio_dprintk(RIO_DEBUG_PROBE, "Hmm Tested ok, uniqid = %x.\n", p->RIOHosts[p->RIONumHosts].UniqueNum); |
1018 | 1018 | ||
1019 | fix_rio_pci(pdev); | 1019 | fix_rio_pci(pdev); |
1020 | |||
1021 | p->RIOHosts[p->RIONumHosts].pdev = pdev; | ||
1022 | pci_dev_get(pdev); | ||
1023 | |||
1020 | p->RIOLastPCISearch = 0; | 1024 | p->RIOLastPCISearch = 0; |
1021 | p->RIONumHosts++; | 1025 | p->RIONumHosts++; |
1022 | found++; | 1026 | found++; |
@@ -1066,6 +1070,9 @@ static int __init rio_init(void) | |||
1066 | ((readb(&p->RIOHosts[p->RIONumHosts].Unique[1]) & 0xFF) << 8) | ((readb(&p->RIOHosts[p->RIONumHosts].Unique[2]) & 0xFF) << 16) | ((readb(&p->RIOHosts[p->RIONumHosts].Unique[3]) & 0xFF) << 24); | 1070 | ((readb(&p->RIOHosts[p->RIONumHosts].Unique[1]) & 0xFF) << 8) | ((readb(&p->RIOHosts[p->RIONumHosts].Unique[2]) & 0xFF) << 16) | ((readb(&p->RIOHosts[p->RIONumHosts].Unique[3]) & 0xFF) << 24); |
1067 | rio_dprintk(RIO_DEBUG_PROBE, "Hmm Tested ok, uniqid = %x.\n", p->RIOHosts[p->RIONumHosts].UniqueNum); | 1071 | rio_dprintk(RIO_DEBUG_PROBE, "Hmm Tested ok, uniqid = %x.\n", p->RIOHosts[p->RIONumHosts].UniqueNum); |
1068 | 1072 | ||
1073 | p->RIOHosts[p->RIONumHosts].pdev = pdev; | ||
1074 | pci_dev_get(pdev); | ||
1075 | |||
1069 | p->RIOLastPCISearch = 0; | 1076 | p->RIOLastPCISearch = 0; |
1070 | p->RIONumHosts++; | 1077 | p->RIONumHosts++; |
1071 | found++; | 1078 | found++; |
@@ -1181,6 +1188,8 @@ static void __exit rio_exit(void) | |||
1181 | } | 1188 | } |
1182 | /* It is safe/allowed to del_timer a non-active timer */ | 1189 | /* It is safe/allowed to del_timer a non-active timer */ |
1183 | del_timer(&hp->timer); | 1190 | del_timer(&hp->timer); |
1191 | if (hp->Type == RIO_PCI) | ||
1192 | pci_dev_put(hp->pdev); | ||
1184 | } | 1193 | } |
1185 | 1194 | ||
1186 | if (misc_deregister(&rio_fw_device) < 0) { | 1195 | if (misc_deregister(&rio_fw_device) < 0) { |
diff --git a/drivers/char/tlclk.c b/drivers/char/tlclk.c index 2444a0e24b31..244d30a03fef 100644 --- a/drivers/char/tlclk.c +++ b/drivers/char/tlclk.c | |||
@@ -792,15 +792,14 @@ static int __init tlclk_init(void) | |||
792 | ret = misc_register(&tlclk_miscdev); | 792 | ret = misc_register(&tlclk_miscdev); |
793 | if (ret < 0) { | 793 | if (ret < 0) { |
794 | printk(KERN_ERR "tlclk: misc_register returns %d.\n", ret); | 794 | printk(KERN_ERR "tlclk: misc_register returns %d.\n", ret); |
795 | ret = -EBUSY; | ||
796 | goto out3; | 795 | goto out3; |
797 | } | 796 | } |
798 | 797 | ||
799 | tlclk_device = platform_device_register_simple("telco_clock", | 798 | tlclk_device = platform_device_register_simple("telco_clock", |
800 | -1, NULL, 0); | 799 | -1, NULL, 0); |
801 | if (!tlclk_device) { | 800 | if (IS_ERR(tlclk_device)) { |
802 | printk(KERN_ERR "tlclk: platform_device_register failed.\n"); | 801 | printk(KERN_ERR "tlclk: platform_device_register failed.\n"); |
803 | ret = -EBUSY; | 802 | ret = PTR_ERR(tlclk_device); |
804 | goto out4; | 803 | goto out4; |
805 | } | 804 | } |
806 | 805 | ||
diff --git a/drivers/char/watchdog/Kconfig b/drivers/char/watchdog/Kconfig index 89e46d6dfc4e..0187b1185323 100644 --- a/drivers/char/watchdog/Kconfig +++ b/drivers/char/watchdog/Kconfig | |||
@@ -13,7 +13,7 @@ config WATCHDOG | |||
13 | subsequently opening the file and then failing to write to it for | 13 | subsequently opening the file and then failing to write to it for |
14 | longer than 1 minute will result in rebooting the machine. This | 14 | longer than 1 minute will result in rebooting the machine. This |
15 | could be useful for a networked machine that needs to come back | 15 | could be useful for a networked machine that needs to come back |
16 | online as fast as possible after a lock-up. There's both a watchdog | 16 | on-line as fast as possible after a lock-up. There's both a watchdog |
17 | implementation entirely in software (which can sometimes fail to | 17 | implementation entirely in software (which can sometimes fail to |
18 | reboot the machine) and a driver for hardware watchdog boards, which | 18 | reboot the machine) and a driver for hardware watchdog boards, which |
19 | are more robust and can also keep track of the temperature inside | 19 | are more robust and can also keep track of the temperature inside |
@@ -60,7 +60,7 @@ config SOFT_WATCHDOG | |||
60 | 60 | ||
61 | # ARM Architecture | 61 | # ARM Architecture |
62 | 62 | ||
63 | config AT91_WATCHDOG | 63 | config AT91RM9200_WATCHDOG |
64 | tristate "AT91RM9200 watchdog" | 64 | tristate "AT91RM9200 watchdog" |
65 | depends on WATCHDOG && ARCH_AT91RM9200 | 65 | depends on WATCHDOG && ARCH_AT91RM9200 |
66 | help | 66 | help |
@@ -71,7 +71,7 @@ config 21285_WATCHDOG | |||
71 | tristate "DC21285 watchdog" | 71 | tristate "DC21285 watchdog" |
72 | depends on WATCHDOG && FOOTBRIDGE | 72 | depends on WATCHDOG && FOOTBRIDGE |
73 | help | 73 | help |
74 | The Intel Footbridge chip contains a builtin watchdog circuit. Say Y | 74 | The Intel Footbridge chip contains a built-in watchdog circuit. Say Y |
75 | here if you wish to use this. Alternatively say M to compile the | 75 | here if you wish to use this. Alternatively say M to compile the |
76 | driver as a module, which will be called wdt285. | 76 | driver as a module, which will be called wdt285. |
77 | 77 | ||
@@ -269,11 +269,11 @@ config IB700_WDT | |||
269 | Most people will say N. | 269 | Most people will say N. |
270 | 270 | ||
271 | config IBMASR | 271 | config IBMASR |
272 | tristate "IBM Automatic Server Restart" | 272 | tristate "IBM Automatic Server Restart" |
273 | depends on WATCHDOG && X86 | 273 | depends on WATCHDOG && X86 |
274 | help | 274 | help |
275 | This is the driver for the IBM Automatic Server Restart watchdog | 275 | This is the driver for the IBM Automatic Server Restart watchdog |
276 | timer builtin into some eServer xSeries machines. | 276 | timer built-in into some eServer xSeries machines. |
277 | 277 | ||
278 | To compile this driver as a module, choose M here: the | 278 | To compile this driver as a module, choose M here: the |
279 | module will be called ibmasr. | 279 | module will be called ibmasr. |
@@ -316,13 +316,16 @@ config I8XX_TCO | |||
316 | To compile this driver as a module, choose M here: the | 316 | To compile this driver as a module, choose M here: the |
317 | module will be called i8xx_tco. | 317 | module will be called i8xx_tco. |
318 | 318 | ||
319 | Note: This driver will be removed in the near future. Please | ||
320 | use the Intel TCO Timer/Watchdog driver. | ||
321 | |||
319 | config ITCO_WDT | 322 | config ITCO_WDT |
320 | tristate "Intel TCO Timer/Watchdog (EXPERIMENTAL)" | 323 | tristate "Intel TCO Timer/Watchdog" |
321 | depends on WATCHDOG && (X86 || IA64) && PCI && EXPERIMENTAL | 324 | depends on WATCHDOG && (X86 || IA64) && PCI |
322 | ---help--- | 325 | ---help--- |
323 | Hardware driver for the intel TCO timer based watchdog devices. | 326 | Hardware driver for the intel TCO timer based watchdog devices. |
324 | These drivers are included in the Intel 82801 I/O Controller | 327 | These drivers are included in the Intel 82801 I/O Controller |
325 | Hub family 'from ICH0 up to ICH7) and in the Intel 6300ESB | 328 | Hub family (from ICH0 up to ICH8) and in the Intel 6300ESB |
326 | controller hub. | 329 | controller hub. |
327 | 330 | ||
328 | The TCO (Total Cost of Ownership) timer is a watchdog timer | 331 | The TCO (Total Cost of Ownership) timer is a watchdog timer |
@@ -395,6 +398,26 @@ config CPU5_WDT | |||
395 | To compile this driver as a module, choose M here: the | 398 | To compile this driver as a module, choose M here: the |
396 | module will be called cpu5wdt. | 399 | module will be called cpu5wdt. |
397 | 400 | ||
401 | config SMSC37B787_WDT | ||
402 | tristate "Winbond SMsC37B787 Watchdog Timer" | ||
403 | depends on WATCHDOG && X86 | ||
404 | ---help--- | ||
405 | This is the driver for the hardware watchdog component on the | ||
406 | Winbond SMsC37B787 chipset as used on the NetRunner Mainboard | ||
407 | from Vision Systems and maybe others. | ||
408 | |||
409 | This watchdog simply watches your kernel to make sure it doesn't | ||
410 | freeze, and if it does, it reboots your computer after a certain | ||
411 | amount of time. | ||
412 | |||
413 | Usually a userspace daemon will notify the kernel WDT driver that | ||
414 | userspace is still alive, at regular intervals. | ||
415 | |||
416 | To compile this driver as a module, choose M here: the | ||
417 | module will be called smsc37b787_wdt. | ||
418 | |||
419 | Most people will say N. | ||
420 | |||
398 | config W83627HF_WDT | 421 | config W83627HF_WDT |
399 | tristate "W83627HF Watchdog Timer" | 422 | tristate "W83627HF Watchdog Timer" |
400 | depends on WATCHDOG && X86 | 423 | depends on WATCHDOG && X86 |
@@ -410,6 +433,21 @@ config W83627HF_WDT | |||
410 | 433 | ||
411 | Most people will say N. | 434 | Most people will say N. |
412 | 435 | ||
436 | config W83697HF_WDT | ||
437 | tristate "W83697HF/W83697HG Watchdog Timer" | ||
438 | depends on WATCHDOG && X86 | ||
439 | ---help--- | ||
440 | This is the driver for the hardware watchdog on the W83697HF/HG | ||
441 | chipset as used in Dedibox/VIA motherboards (and likely others). | ||
442 | This watchdog simply watches your kernel to make sure it doesn't | ||
443 | freeze, and if it does, it reboots your computer after a certain | ||
444 | amount of time. | ||
445 | |||
446 | To compile this driver as a module, choose M here: the | ||
447 | module will be called w83697hf_wdt. | ||
448 | |||
449 | Most people will say N. | ||
450 | |||
413 | config W83877F_WDT | 451 | config W83877F_WDT |
414 | tristate "W83877F (EMACS) Watchdog Timer" | 452 | tristate "W83877F (EMACS) Watchdog Timer" |
415 | depends on WATCHDOG && X86 | 453 | depends on WATCHDOG && X86 |
@@ -443,7 +481,7 @@ config MACHZ_WDT | |||
443 | depends on WATCHDOG && X86 | 481 | depends on WATCHDOG && X86 |
444 | ---help--- | 482 | ---help--- |
445 | If you are using a ZF Micro MachZ processor, say Y here, otherwise | 483 | If you are using a ZF Micro MachZ processor, say Y here, otherwise |
446 | N. This is the driver for the watchdog timer builtin on that | 484 | N. This is the driver for the watchdog timer built-in on that |
447 | processor using ZF-Logic interface. This watchdog simply watches | 485 | processor using ZF-Logic interface. This watchdog simply watches |
448 | your kernel to make sure it doesn't freeze, and if it does, it | 486 | your kernel to make sure it doesn't freeze, and if it does, it |
449 | reboots your computer after a certain amount of time. | 487 | reboots your computer after a certain amount of time. |
@@ -472,7 +510,6 @@ config SBC_EPX_C3_WATCHDOG | |||
472 | To compile this driver as a module, choose M here: the | 510 | To compile this driver as a module, choose M here: the |
473 | module will be called sbc_epx_c3. | 511 | module will be called sbc_epx_c3. |
474 | 512 | ||
475 | |||
476 | # PowerPC Architecture | 513 | # PowerPC Architecture |
477 | 514 | ||
478 | config 8xx_WDT | 515 | config 8xx_WDT |
@@ -502,7 +539,7 @@ config WATCHDOG_RTAS | |||
502 | help | 539 | help |
503 | This driver adds watchdog support for the RTAS watchdog. | 540 | This driver adds watchdog support for the RTAS watchdog. |
504 | 541 | ||
505 | To compile this driver as a module, choose M here. The module | 542 | To compile this driver as a module, choose M here. The module |
506 | will be called wdrtas. | 543 | will be called wdrtas. |
507 | 544 | ||
508 | # MIPS Architecture | 545 | # MIPS Architecture |
@@ -556,7 +593,7 @@ config SH_WDT_MMAP | |||
556 | help | 593 | help |
557 | If you say Y here, user applications will be able to mmap the | 594 | If you say Y here, user applications will be able to mmap the |
558 | WDT/CPG registers. | 595 | WDT/CPG registers. |
559 | # | 596 | |
560 | # SPARC64 Architecture | 597 | # SPARC64 Architecture |
561 | 598 | ||
562 | config WATCHDOG_CP1XXX | 599 | config WATCHDOG_CP1XXX |
diff --git a/drivers/char/watchdog/Makefile b/drivers/char/watchdog/Makefile index 7f70abad465a..36440497047c 100644 --- a/drivers/char/watchdog/Makefile +++ b/drivers/char/watchdog/Makefile | |||
@@ -23,7 +23,7 @@ obj-$(CONFIG_WDTPCI) += wdt_pci.o | |||
23 | obj-$(CONFIG_USBPCWATCHDOG) += pcwd_usb.o | 23 | obj-$(CONFIG_USBPCWATCHDOG) += pcwd_usb.o |
24 | 24 | ||
25 | # ARM Architecture | 25 | # ARM Architecture |
26 | obj-$(CONFIG_AT91_WATCHDOG) += at91_wdt.o | 26 | obj-$(CONFIG_AT91RM9200_WATCHDOG) += at91rm9200_wdt.o |
27 | obj-$(CONFIG_OMAP_WATCHDOG) += omap_wdt.o | 27 | obj-$(CONFIG_OMAP_WATCHDOG) += omap_wdt.o |
28 | obj-$(CONFIG_21285_WATCHDOG) += wdt285.o | 28 | obj-$(CONFIG_21285_WATCHDOG) += wdt285.o |
29 | obj-$(CONFIG_977_WATCHDOG) += wdt977.o | 29 | obj-$(CONFIG_977_WATCHDOG) += wdt977.o |
@@ -53,7 +53,9 @@ obj-$(CONFIG_SCx200_WDT) += scx200_wdt.o | |||
53 | obj-$(CONFIG_60XX_WDT) += sbc60xxwdt.o | 53 | obj-$(CONFIG_60XX_WDT) += sbc60xxwdt.o |
54 | obj-$(CONFIG_SBC8360_WDT) += sbc8360.o | 54 | obj-$(CONFIG_SBC8360_WDT) += sbc8360.o |
55 | obj-$(CONFIG_CPU5_WDT) += cpu5wdt.o | 55 | obj-$(CONFIG_CPU5_WDT) += cpu5wdt.o |
56 | obj-$(CONFIG_SMSC37B787_WDT) += smsc37b787_wdt.o | ||
56 | obj-$(CONFIG_W83627HF_WDT) += w83627hf_wdt.o | 57 | obj-$(CONFIG_W83627HF_WDT) += w83627hf_wdt.o |
58 | obj-$(CONFIG_W83697HF_WDT) += w83697hf_wdt.o | ||
57 | obj-$(CONFIG_W83877F_WDT) += w83877f_wdt.o | 59 | obj-$(CONFIG_W83877F_WDT) += w83877f_wdt.o |
58 | obj-$(CONFIG_W83977F_WDT) += w83977f_wdt.o | 60 | obj-$(CONFIG_W83977F_WDT) += w83977f_wdt.o |
59 | obj-$(CONFIG_MACHZ_WDT) += machzwd.o | 61 | obj-$(CONFIG_MACHZ_WDT) += machzwd.o |
diff --git a/drivers/char/watchdog/at91_wdt.c b/drivers/char/watchdog/at91rm9200_wdt.c index 4e7a1145e78f..4e7a1145e78f 100644 --- a/drivers/char/watchdog/at91_wdt.c +++ b/drivers/char/watchdog/at91rm9200_wdt.c | |||
diff --git a/drivers/char/watchdog/iTCO_wdt.c b/drivers/char/watchdog/iTCO_wdt.c index aaac94db0d8b..b6f29cb8bd39 100644 --- a/drivers/char/watchdog/iTCO_wdt.c +++ b/drivers/char/watchdog/iTCO_wdt.c | |||
@@ -35,6 +35,10 @@ | |||
35 | * 82801GDH (ICH7DH) : document number 307013-002, 307014-009, | 35 | * 82801GDH (ICH7DH) : document number 307013-002, 307014-009, |
36 | * 82801GBM (ICH7-M) : document number 307013-002, 307014-009, | 36 | * 82801GBM (ICH7-M) : document number 307013-002, 307014-009, |
37 | * 82801GHM (ICH7-M DH) : document number 307013-002, 307014-009, | 37 | * 82801GHM (ICH7-M DH) : document number 307013-002, 307014-009, |
38 | * 82801HB (ICH8) : document number 313056-002, 313057-004, | ||
39 | * 82801HR (ICH8R) : document number 313056-002, 313057-004, | ||
40 | * 82801HH (ICH8DH) : document number 313056-002, 313057-004, | ||
41 | * 82801HO (ICH8DO) : document number 313056-002, 313057-004, | ||
38 | * 6300ESB (6300ESB) : document number 300641-003 | 42 | * 6300ESB (6300ESB) : document number 300641-003 |
39 | */ | 43 | */ |
40 | 44 | ||
@@ -45,7 +49,7 @@ | |||
45 | /* Module and version information */ | 49 | /* Module and version information */ |
46 | #define DRV_NAME "iTCO_wdt" | 50 | #define DRV_NAME "iTCO_wdt" |
47 | #define DRV_VERSION "1.00" | 51 | #define DRV_VERSION "1.00" |
48 | #define DRV_RELDATE "30-Jul-2006" | 52 | #define DRV_RELDATE "08-Oct-2006" |
49 | #define PFX DRV_NAME ": " | 53 | #define PFX DRV_NAME ": " |
50 | 54 | ||
51 | /* Includes */ | 55 | /* Includes */ |
@@ -85,6 +89,9 @@ enum iTCO_chipsets { | |||
85 | TCO_ICH7, /* ICH7 & ICH7R */ | 89 | TCO_ICH7, /* ICH7 & ICH7R */ |
86 | TCO_ICH7M, /* ICH7-M */ | 90 | TCO_ICH7M, /* ICH7-M */ |
87 | TCO_ICH7MDH, /* ICH7-M DH */ | 91 | TCO_ICH7MDH, /* ICH7-M DH */ |
92 | TCO_ICH8, /* ICH8 & ICH8R */ | ||
93 | TCO_ICH8DH, /* ICH8DH */ | ||
94 | TCO_ICH8DO, /* ICH8DO */ | ||
88 | }; | 95 | }; |
89 | 96 | ||
90 | static struct { | 97 | static struct { |
@@ -108,6 +115,9 @@ static struct { | |||
108 | {"ICH7 or ICH7R", 2}, | 115 | {"ICH7 or ICH7R", 2}, |
109 | {"ICH7-M", 2}, | 116 | {"ICH7-M", 2}, |
110 | {"ICH7-M DH", 2}, | 117 | {"ICH7-M DH", 2}, |
118 | {"ICH8 or ICH8R", 2}, | ||
119 | {"ICH8DH", 2}, | ||
120 | {"ICH8DO", 2}, | ||
111 | {NULL,0} | 121 | {NULL,0} |
112 | }; | 122 | }; |
113 | 123 | ||
@@ -135,6 +145,9 @@ static struct pci_device_id iTCO_wdt_pci_tbl[] = { | |||
135 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH7 }, | 145 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH7 }, |
136 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH7M }, | 146 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH7M }, |
137 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_31, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH7MDH }, | 147 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_31, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH7MDH }, |
148 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH8 }, | ||
149 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH8DH }, | ||
150 | { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TCO_ICH8DO }, | ||
138 | { 0, }, /* End of list */ | 151 | { 0, }, /* End of list */ |
139 | }; | 152 | }; |
140 | MODULE_DEVICE_TABLE (pci, iTCO_wdt_pci_tbl); | 153 | MODULE_DEVICE_TABLE (pci, iTCO_wdt_pci_tbl); |
@@ -355,7 +368,8 @@ static int iTCO_wdt_get_timeleft (int *time_left) | |||
355 | spin_unlock(&iTCO_wdt_private.io_lock); | 368 | spin_unlock(&iTCO_wdt_private.io_lock); |
356 | 369 | ||
357 | *time_left = (val8 * 6) / 10; | 370 | *time_left = (val8 * 6) / 10; |
358 | } | 371 | } else |
372 | return -EINVAL; | ||
359 | return 0; | 373 | return 0; |
360 | } | 374 | } |
361 | 375 | ||
@@ -426,7 +440,6 @@ static int iTCO_wdt_ioctl (struct inode *inode, struct file *file, | |||
426 | { | 440 | { |
427 | int new_options, retval = -EINVAL; | 441 | int new_options, retval = -EINVAL; |
428 | int new_heartbeat; | 442 | int new_heartbeat; |
429 | int time_left; | ||
430 | void __user *argp = (void __user *)arg; | 443 | void __user *argp = (void __user *)arg; |
431 | int __user *p = argp; | 444 | int __user *p = argp; |
432 | static struct watchdog_info ident = { | 445 | static struct watchdog_info ident = { |
@@ -486,6 +499,8 @@ static int iTCO_wdt_ioctl (struct inode *inode, struct file *file, | |||
486 | 499 | ||
487 | case WDIOC_GETTIMELEFT: | 500 | case WDIOC_GETTIMELEFT: |
488 | { | 501 | { |
502 | int time_left; | ||
503 | |||
489 | if (iTCO_wdt_get_timeleft(&time_left)) | 504 | if (iTCO_wdt_get_timeleft(&time_left)) |
490 | return -EINVAL; | 505 | return -EINVAL; |
491 | 506 | ||
diff --git a/drivers/char/watchdog/s3c2410_wdt.c b/drivers/char/watchdog/s3c2410_wdt.c index 68b1ca976d53..18cb050c3862 100644 --- a/drivers/char/watchdog/s3c2410_wdt.c +++ b/drivers/char/watchdog/s3c2410_wdt.c | |||
@@ -380,18 +380,21 @@ static int s3c2410wdt_probe(struct platform_device *pdev) | |||
380 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 380 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
381 | if (res == NULL) { | 381 | if (res == NULL) { |
382 | printk(KERN_INFO PFX "failed to get irq resource\n"); | 382 | printk(KERN_INFO PFX "failed to get irq resource\n"); |
383 | iounmap(wdt_base); | ||
383 | return -ENOENT; | 384 | return -ENOENT; |
384 | } | 385 | } |
385 | 386 | ||
386 | ret = request_irq(res->start, s3c2410wdt_irq, 0, pdev->name, pdev); | 387 | ret = request_irq(res->start, s3c2410wdt_irq, 0, pdev->name, pdev); |
387 | if (ret != 0) { | 388 | if (ret != 0) { |
388 | printk(KERN_INFO PFX "failed to install irq (%d)\n", ret); | 389 | printk(KERN_INFO PFX "failed to install irq (%d)\n", ret); |
390 | iounmap(wdt_base); | ||
389 | return ret; | 391 | return ret; |
390 | } | 392 | } |
391 | 393 | ||
392 | wdt_clock = clk_get(&pdev->dev, "watchdog"); | 394 | wdt_clock = clk_get(&pdev->dev, "watchdog"); |
393 | if (wdt_clock == NULL) { | 395 | if (wdt_clock == NULL) { |
394 | printk(KERN_INFO PFX "failed to find watchdog clock source\n"); | 396 | printk(KERN_INFO PFX "failed to find watchdog clock source\n"); |
397 | iounmap(wdt_base); | ||
395 | return -ENOENT; | 398 | return -ENOENT; |
396 | } | 399 | } |
397 | 400 | ||
@@ -415,6 +418,7 @@ static int s3c2410wdt_probe(struct platform_device *pdev) | |||
415 | if (ret) { | 418 | if (ret) { |
416 | printk (KERN_ERR PFX "cannot register miscdev on minor=%d (%d)\n", | 419 | printk (KERN_ERR PFX "cannot register miscdev on minor=%d (%d)\n", |
417 | WATCHDOG_MINOR, ret); | 420 | WATCHDOG_MINOR, ret); |
421 | iounmap(wdt_base); | ||
418 | return ret; | 422 | return ret; |
419 | } | 423 | } |
420 | 424 | ||
@@ -451,6 +455,7 @@ static int s3c2410wdt_remove(struct platform_device *dev) | |||
451 | wdt_clock = NULL; | 455 | wdt_clock = NULL; |
452 | } | 456 | } |
453 | 457 | ||
458 | iounmap(wdt_base); | ||
454 | misc_deregister(&s3c2410wdt_miscdev); | 459 | misc_deregister(&s3c2410wdt_miscdev); |
455 | return 0; | 460 | return 0; |
456 | } | 461 | } |
diff --git a/drivers/char/watchdog/sc1200wdt.c b/drivers/char/watchdog/sc1200wdt.c index d8d0f28e0acf..e3239833e4b0 100644 --- a/drivers/char/watchdog/sc1200wdt.c +++ b/drivers/char/watchdog/sc1200wdt.c | |||
@@ -392,7 +392,7 @@ static int __init sc1200wdt_init(void) | |||
392 | if (io == -1) { | 392 | if (io == -1) { |
393 | printk(KERN_ERR PFX "io parameter must be specified\n"); | 393 | printk(KERN_ERR PFX "io parameter must be specified\n"); |
394 | ret = -EINVAL; | 394 | ret = -EINVAL; |
395 | goto out_clean; | 395 | goto out_pnp; |
396 | } | 396 | } |
397 | 397 | ||
398 | #if defined CONFIG_PNP | 398 | #if defined CONFIG_PNP |
@@ -405,7 +405,7 @@ static int __init sc1200wdt_init(void) | |||
405 | if (!request_region(io, io_len, SC1200_MODULE_NAME)) { | 405 | if (!request_region(io, io_len, SC1200_MODULE_NAME)) { |
406 | printk(KERN_ERR PFX "Unable to register IO port %#x\n", io); | 406 | printk(KERN_ERR PFX "Unable to register IO port %#x\n", io); |
407 | ret = -EBUSY; | 407 | ret = -EBUSY; |
408 | goto out_clean; | 408 | goto out_pnp; |
409 | } | 409 | } |
410 | 410 | ||
411 | ret = sc1200wdt_probe(); | 411 | ret = sc1200wdt_probe(); |
@@ -435,6 +435,11 @@ out_rbt: | |||
435 | out_io: | 435 | out_io: |
436 | release_region(io, io_len); | 436 | release_region(io, io_len); |
437 | 437 | ||
438 | out_pnp: | ||
439 | #if defined CONFIG_PNP | ||
440 | if (isapnp) | ||
441 | pnp_unregister_driver(&scl200wdt_pnp_driver); | ||
442 | #endif | ||
438 | goto out_clean; | 443 | goto out_clean; |
439 | } | 444 | } |
440 | 445 | ||
diff --git a/drivers/char/watchdog/smsc37b787_wdt.c b/drivers/char/watchdog/smsc37b787_wdt.c new file mode 100644 index 000000000000..9f56913b484f --- /dev/null +++ b/drivers/char/watchdog/smsc37b787_wdt.c | |||
@@ -0,0 +1,627 @@ | |||
1 | /* | ||
2 | * SMsC 37B787 Watchdog Timer driver for Linux 2.6.x.x | ||
3 | * | ||
4 | * Based on acquirewdt.c by Alan Cox <alan@redhat.com> | ||
5 | * and some other existing drivers | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version | ||
10 | * 2 of the License, or (at your option) any later version. | ||
11 | * | ||
12 | * The authors do NOT admit liability nor provide warranty for | ||
13 | * any of this software. This material is provided "AS-IS" in | ||
14 | * the hope that it may be useful for others. | ||
15 | * | ||
16 | * (C) Copyright 2003-2006 Sven Anders <anders@anduras.de> | ||
17 | * | ||
18 | * History: | ||
19 | * 2003 - Created version 1.0 for Linux 2.4.x. | ||
20 | * 2006 - Ported to Linux 2.6, added nowayout and MAGICCLOSE | ||
21 | * features. Released version 1.1 | ||
22 | * | ||
23 | * Theory of operation: | ||
24 | * | ||
25 | * A Watchdog Timer (WDT) is a hardware circuit that can | ||
26 | * reset the computer system in case of a software fault. | ||
27 | * You probably knew that already. | ||
28 | * | ||
29 | * Usually a userspace daemon will notify the kernel WDT driver | ||
30 | * via the /dev/watchdog special device file that userspace is | ||
31 | * still alive, at regular intervals. When such a notification | ||
32 | * occurs, the driver will usually tell the hardware watchdog | ||
33 | * that everything is in order, and that the watchdog should wait | ||
34 | * for yet another little while to reset the system. | ||
35 | * If userspace fails (RAM error, kernel bug, whatever), the | ||
36 | * notifications cease to occur, and the hardware watchdog will | ||
37 | * reset the system (causing a reboot) after the timeout occurs. | ||
38 | * | ||
39 | * Create device with: | ||
40 | * mknod /dev/watchdog c 10 130 | ||
41 | * | ||
42 | * For an example userspace keep-alive daemon, see: | ||
43 | * Documentation/watchdog/watchdog.txt | ||
44 | */ | ||
45 | |||
46 | #include <linux/module.h> | ||
47 | #include <linux/moduleparam.h> | ||
48 | #include <linux/types.h> | ||
49 | #include <linux/miscdevice.h> | ||
50 | #include <linux/watchdog.h> | ||
51 | #include <linux/delay.h> | ||
52 | #include <linux/fs.h> | ||
53 | #include <linux/ioport.h> | ||
54 | #include <linux/notifier.h> | ||
55 | #include <linux/reboot.h> | ||
56 | #include <linux/init.h> | ||
57 | #include <linux/spinlock.h> | ||
58 | |||
59 | #include <asm/io.h> | ||
60 | #include <asm/uaccess.h> | ||
61 | #include <asm/system.h> | ||
62 | |||
63 | /* enable support for minutes as units? */ | ||
64 | /* (does not always work correctly, so disabled by default!) */ | ||
65 | #define SMSC_SUPPORT_MINUTES | ||
66 | #undef SMSC_SUPPORT_MINUTES | ||
67 | |||
68 | #define MAX_TIMEOUT 255 | ||
69 | |||
70 | #define UNIT_SECOND 0 | ||
71 | #define UNIT_MINUTE 1 | ||
72 | |||
73 | #define MODNAME "smsc37b787_wdt: " | ||
74 | #define VERSION "1.1" | ||
75 | |||
76 | #define IOPORT 0x3F0 | ||
77 | #define IOPORT_SIZE 2 | ||
78 | #define IODEV_NO 8 | ||
79 | |||
80 | static int unit = UNIT_SECOND; /* timer's unit */ | ||
81 | static int timeout = 60; /* timeout value: default is 60 "units" */ | ||
82 | static unsigned long timer_enabled = 0; /* is the timer enabled? */ | ||
83 | |||
84 | static char expect_close; /* is the close expected? */ | ||
85 | |||
86 | static spinlock_t io_lock; /* to guard the watchdog from io races */ | ||
87 | |||
88 | static int nowayout = WATCHDOG_NOWAYOUT; | ||
89 | |||
90 | /* -- Low level function ----------------------------------------*/ | ||
91 | |||
92 | /* unlock the IO chip */ | ||
93 | |||
94 | static inline void open_io_config(void) | ||
95 | { | ||
96 | outb(0x55, IOPORT); | ||
97 | mdelay(1); | ||
98 | outb(0x55, IOPORT); | ||
99 | } | ||
100 | |||
101 | /* lock the IO chip */ | ||
102 | static inline void close_io_config(void) | ||
103 | { | ||
104 | outb(0xAA, IOPORT); | ||
105 | } | ||
106 | |||
107 | /* select the IO device */ | ||
108 | static inline void select_io_device(unsigned char devno) | ||
109 | { | ||
110 | outb(0x07, IOPORT); | ||
111 | outb(devno, IOPORT+1); | ||
112 | } | ||
113 | |||
114 | /* write to the control register */ | ||
115 | static inline void write_io_cr(unsigned char reg, unsigned char data) | ||
116 | { | ||
117 | outb(reg, IOPORT); | ||
118 | outb(data, IOPORT+1); | ||
119 | } | ||
120 | |||
121 | /* read from the control register */ | ||
122 | static inline char read_io_cr(unsigned char reg) | ||
123 | { | ||
124 | outb(reg, IOPORT); | ||
125 | return inb(IOPORT+1); | ||
126 | } | ||
127 | |||
128 | /* -- Medium level functions ------------------------------------*/ | ||
129 | |||
130 | static inline void gpio_bit12(unsigned char reg) | ||
131 | { | ||
132 | // -- General Purpose I/O Bit 1.2 -- | ||
133 | // Bit 0, In/Out: 0 = Output, 1 = Input | ||
134 | // Bit 1, Polarity: 0 = No Invert, 1 = Invert | ||
135 | // Bit 2, Group Enable Intr.: 0 = Disable, 1 = Enable | ||
136 | // Bit 3/4, Function select: 00 = GPI/O, 01 = WDT, 10 = P17, | ||
137 | // 11 = Either Edge Triggered Intr. 2 | ||
138 | // Bit 5/6 (Reserved) | ||
139 | // Bit 7, Output Type: 0 = Push Pull Bit, 1 = Open Drain | ||
140 | write_io_cr(0xE2, reg); | ||
141 | } | ||
142 | |||
143 | static inline void gpio_bit13(unsigned char reg) | ||
144 | { | ||
145 | // -- General Purpose I/O Bit 1.3 -- | ||
146 | // Bit 0, In/Out: 0 = Output, 1 = Input | ||
147 | // Bit 1, Polarity: 0 = No Invert, 1 = Invert | ||
148 | // Bit 2, Group Enable Intr.: 0 = Disable, 1 = Enable | ||
149 | // Bit 3, Function select: 0 = GPI/O, 1 = LED | ||
150 | // Bit 4-6 (Reserved) | ||
151 | // Bit 7, Output Type: 0 = Push Pull Bit, 1 = Open Drain | ||
152 | write_io_cr(0xE3, reg); | ||
153 | } | ||
154 | |||
155 | static inline void wdt_timer_units(unsigned char new_units) | ||
156 | { | ||
157 | // -- Watchdog timer units -- | ||
158 | // Bit 0-6 (Reserved) | ||
159 | // Bit 7, WDT Time-out Value Units Select | ||
160 | // (0 = Minutes, 1 = Seconds) | ||
161 | write_io_cr(0xF1, new_units); | ||
162 | } | ||
163 | |||
164 | static inline void wdt_timeout_value(unsigned char new_timeout) | ||
165 | { | ||
166 | // -- Watchdog Timer Time-out Value -- | ||
167 | // Bit 0-7 Binary coded units (0=Disabled, 1..255) | ||
168 | write_io_cr(0xF2, new_timeout); | ||
169 | } | ||
170 | |||
171 | static inline void wdt_timer_conf(unsigned char conf) | ||
172 | { | ||
173 | // -- Watchdog timer configuration -- | ||
174 | // Bit 0 Joystick enable: 0* = No Reset, 1 = Reset WDT upon Gameport I/O | ||
175 | // Bit 1 Keyboard enable: 0* = No Reset, 1 = Reset WDT upon KBD Intr. | ||
176 | // Bit 2 Mouse enable: 0* = No Reset, 1 = Reset WDT upon Mouse Intr. | ||
177 | // Bit 3 Reset the timer | ||
178 | // (Wrong in SMsC documentation? Given as: PowerLED Timout Enabled) | ||
179 | // Bit 4-7 WDT Interrupt Mapping: (0000* = Disabled, | ||
180 | // 0001=IRQ1, 0010=(Invalid), 0011=IRQ3 to 1111=IRQ15) | ||
181 | write_io_cr(0xF3, conf); | ||
182 | } | ||
183 | |||
184 | static inline void wdt_timer_ctrl(unsigned char reg) | ||
185 | { | ||
186 | // -- Watchdog timer control -- | ||
187 | // Bit 0 Status Bit: 0 = Timer counting, 1 = Timeout occured | ||
188 | // Bit 1 Power LED Toggle: 0 = Disable Toggle, 1 = Toggle at 1 Hz | ||
189 | // Bit 2 Force Timeout: 1 = Forces WD timeout event (self-cleaning) | ||
190 | // Bit 3 P20 Force Timeout enabled: | ||
191 | // 0 = P20 activity does not generate the WD timeout event | ||
192 | // 1 = P20 Allows rising edge of P20, from the keyboard | ||
193 | // controller, to force the WD timeout event. | ||
194 | // Bit 4 (Reserved) | ||
195 | // -- Soft power management -- | ||
196 | // Bit 5 Stop Counter: 1 = Stop software power down counter | ||
197 | // set via register 0xB8, (self-cleaning) | ||
198 | // (Upon read: 0 = Counter running, 1 = Counter stopped) | ||
199 | // Bit 6 Restart Counter: 1 = Restart software power down counter | ||
200 | // set via register 0xB8, (self-cleaning) | ||
201 | // Bit 7 SPOFF: 1 = Force software power down (self-cleaning) | ||
202 | |||
203 | write_io_cr(0xF4, reg); | ||
204 | } | ||
205 | |||
206 | /* -- Higher level functions ------------------------------------*/ | ||
207 | |||
208 | /* initialize watchdog */ | ||
209 | |||
210 | static void wb_smsc_wdt_initialize(void) | ||
211 | { | ||
212 | unsigned char old; | ||
213 | |||
214 | spin_lock(&io_lock); | ||
215 | open_io_config(); | ||
216 | select_io_device(IODEV_NO); | ||
217 | |||
218 | // enable the watchdog | ||
219 | gpio_bit13(0x08); // Select pin 80 = LED not GPIO | ||
220 | gpio_bit12(0x0A); // Set pin 79 = WDT not GPIO/Output/Polarity=Invert | ||
221 | |||
222 | // disable the timeout | ||
223 | wdt_timeout_value(0); | ||
224 | |||
225 | // reset control register | ||
226 | wdt_timer_ctrl(0x00); | ||
227 | |||
228 | // reset configuration register | ||
229 | wdt_timer_conf(0x00); | ||
230 | |||
231 | // read old (timer units) register | ||
232 | old = read_io_cr(0xF1) & 0x7F; | ||
233 | if (unit == UNIT_SECOND) old |= 0x80; // set to seconds | ||
234 | |||
235 | // set the watchdog timer units | ||
236 | wdt_timer_units(old); | ||
237 | |||
238 | close_io_config(); | ||
239 | spin_unlock(&io_lock); | ||
240 | } | ||
241 | |||
242 | /* shutdown the watchdog */ | ||
243 | |||
244 | static void wb_smsc_wdt_shutdown(void) | ||
245 | { | ||
246 | spin_lock(&io_lock); | ||
247 | open_io_config(); | ||
248 | select_io_device(IODEV_NO); | ||
249 | |||
250 | // disable the watchdog | ||
251 | gpio_bit13(0x09); | ||
252 | gpio_bit12(0x09); | ||
253 | |||
254 | // reset watchdog config register | ||
255 | wdt_timer_conf(0x00); | ||
256 | |||
257 | // reset watchdog control register | ||
258 | wdt_timer_ctrl(0x00); | ||
259 | |||
260 | // disable timeout | ||
261 | wdt_timeout_value(0x00); | ||
262 | |||
263 | close_io_config(); | ||
264 | spin_unlock(&io_lock); | ||
265 | } | ||
266 | |||
267 | /* set timeout => enable watchdog */ | ||
268 | |||
269 | static void wb_smsc_wdt_set_timeout(unsigned char new_timeout) | ||
270 | { | ||
271 | spin_lock(&io_lock); | ||
272 | open_io_config(); | ||
273 | select_io_device(IODEV_NO); | ||
274 | |||
275 | // set Power LED to blink, if we enable the timeout | ||
276 | wdt_timer_ctrl((new_timeout == 0) ? 0x00 : 0x02); | ||
277 | |||
278 | // set timeout value | ||
279 | wdt_timeout_value(new_timeout); | ||
280 | |||
281 | close_io_config(); | ||
282 | spin_unlock(&io_lock); | ||
283 | } | ||
284 | |||
285 | /* get timeout */ | ||
286 | |||
287 | static unsigned char wb_smsc_wdt_get_timeout(void) | ||
288 | { | ||
289 | unsigned char set_timeout; | ||
290 | |||
291 | spin_lock(&io_lock); | ||
292 | open_io_config(); | ||
293 | select_io_device(IODEV_NO); | ||
294 | set_timeout = read_io_cr(0xF2); | ||
295 | close_io_config(); | ||
296 | spin_unlock(&io_lock); | ||
297 | |||
298 | return set_timeout; | ||
299 | } | ||
300 | |||
301 | /* disable watchdog */ | ||
302 | |||
303 | static void wb_smsc_wdt_disable(void) | ||
304 | { | ||
305 | // set the timeout to 0 to disable the watchdog | ||
306 | wb_smsc_wdt_set_timeout(0); | ||
307 | } | ||
308 | |||
309 | /* enable watchdog by setting the current timeout */ | ||
310 | |||
311 | static void wb_smsc_wdt_enable(void) | ||
312 | { | ||
313 | // set the current timeout... | ||
314 | wb_smsc_wdt_set_timeout(timeout); | ||
315 | } | ||
316 | |||
317 | /* reset the timer */ | ||
318 | |||
319 | static void wb_smsc_wdt_reset_timer(void) | ||
320 | { | ||
321 | spin_lock(&io_lock); | ||
322 | open_io_config(); | ||
323 | select_io_device(IODEV_NO); | ||
324 | |||
325 | // reset the timer | ||
326 | wdt_timeout_value(timeout); | ||
327 | wdt_timer_conf(0x08); | ||
328 | |||
329 | close_io_config(); | ||
330 | spin_unlock(&io_lock); | ||
331 | } | ||
332 | |||
333 | /* return, if the watchdog is enabled (timeout is set...) */ | ||
334 | |||
335 | static int wb_smsc_wdt_status(void) | ||
336 | { | ||
337 | return (wb_smsc_wdt_get_timeout() == 0) ? 0 : WDIOF_KEEPALIVEPING; | ||
338 | } | ||
339 | |||
340 | |||
341 | /* -- File operations -------------------------------------------*/ | ||
342 | |||
343 | /* open => enable watchdog and set initial timeout */ | ||
344 | |||
345 | static int wb_smsc_wdt_open(struct inode *inode, struct file *file) | ||
346 | { | ||
347 | /* /dev/watchdog can only be opened once */ | ||
348 | |||
349 | if (test_and_set_bit(0, &timer_enabled)) | ||
350 | return -EBUSY; | ||
351 | |||
352 | if (nowayout) | ||
353 | __module_get(THIS_MODULE); | ||
354 | |||
355 | /* Reload and activate timer */ | ||
356 | wb_smsc_wdt_enable(); | ||
357 | |||
358 | printk(KERN_INFO MODNAME "Watchdog enabled. Timeout set to %d %s.\n", timeout, (unit == UNIT_SECOND) ? "second(s)" : "minute(s)"); | ||
359 | |||
360 | return nonseekable_open(inode, file); | ||
361 | } | ||
362 | |||
363 | /* close => shut off the timer */ | ||
364 | |||
365 | static int wb_smsc_wdt_release(struct inode *inode, struct file *file) | ||
366 | { | ||
367 | /* Shut off the timer. */ | ||
368 | |||
369 | if (expect_close == 42) { | ||
370 | wb_smsc_wdt_disable(); | ||
371 | printk(KERN_INFO MODNAME "Watchdog disabled, sleeping again...\n"); | ||
372 | } else { | ||
373 | printk(KERN_CRIT MODNAME "Unexpected close, not stopping watchdog!\n"); | ||
374 | wb_smsc_wdt_reset_timer(); | ||
375 | } | ||
376 | |||
377 | clear_bit(0, &timer_enabled); | ||
378 | expect_close = 0; | ||
379 | return 0; | ||
380 | } | ||
381 | |||
382 | /* write => update the timer to keep the machine alive */ | ||
383 | |||
384 | static ssize_t wb_smsc_wdt_write(struct file *file, const char __user *data, | ||
385 | size_t len, loff_t *ppos) | ||
386 | { | ||
387 | /* See if we got the magic character 'V' and reload the timer */ | ||
388 | if (len) { | ||
389 | if (!nowayout) { | ||
390 | size_t i; | ||
391 | |||
392 | /* reset expect flag */ | ||
393 | expect_close = 0; | ||
394 | |||
395 | /* scan to see whether or not we got the magic character */ | ||
396 | for (i = 0; i != len; i++) { | ||
397 | char c; | ||
398 | if (get_user(c, data+i)) | ||
399 | return -EFAULT; | ||
400 | if (c == 'V') | ||
401 | expect_close = 42; | ||
402 | } | ||
403 | } | ||
404 | |||
405 | /* someone wrote to us, we should reload the timer */ | ||
406 | wb_smsc_wdt_reset_timer(); | ||
407 | } | ||
408 | return len; | ||
409 | } | ||
410 | |||
411 | /* ioctl => control interface */ | ||
412 | |||
413 | static int wb_smsc_wdt_ioctl(struct inode *inode, struct file *file, | ||
414 | unsigned int cmd, unsigned long arg) | ||
415 | { | ||
416 | int new_timeout; | ||
417 | |||
418 | union { | ||
419 | struct watchdog_info __user *ident; | ||
420 | int __user *i; | ||
421 | } uarg; | ||
422 | |||
423 | static struct watchdog_info ident = { | ||
424 | .options = WDIOF_KEEPALIVEPING | | ||
425 | WDIOF_SETTIMEOUT | | ||
426 | WDIOF_MAGICCLOSE, | ||
427 | .firmware_version = 0, | ||
428 | .identity = "SMsC 37B787 Watchdog" | ||
429 | }; | ||
430 | |||
431 | uarg.i = (int __user *)arg; | ||
432 | |||
433 | switch (cmd) { | ||
434 | default: | ||
435 | return -ENOTTY; | ||
436 | |||
437 | case WDIOC_GETSUPPORT: | ||
438 | return copy_to_user(uarg.ident, &ident, | ||
439 | sizeof(ident)) ? -EFAULT : 0; | ||
440 | |||
441 | case WDIOC_GETSTATUS: | ||
442 | return put_user(wb_smsc_wdt_status(), uarg.i); | ||
443 | |||
444 | case WDIOC_GETBOOTSTATUS: | ||
445 | return put_user(0, uarg.i); | ||
446 | |||
447 | case WDIOC_KEEPALIVE: | ||
448 | wb_smsc_wdt_reset_timer(); | ||
449 | return 0; | ||
450 | |||
451 | case WDIOC_SETTIMEOUT: | ||
452 | if (get_user(new_timeout, uarg.i)) | ||
453 | return -EFAULT; | ||
454 | |||
455 | // the API states this is given in secs | ||
456 | if (unit == UNIT_MINUTE) | ||
457 | new_timeout /= 60; | ||
458 | |||
459 | if (new_timeout < 0 || new_timeout > MAX_TIMEOUT) | ||
460 | return -EINVAL; | ||
461 | |||
462 | timeout = new_timeout; | ||
463 | wb_smsc_wdt_set_timeout(timeout); | ||
464 | |||
465 | // fall through and return the new timeout... | ||
466 | |||
467 | case WDIOC_GETTIMEOUT: | ||
468 | |||
469 | new_timeout = timeout; | ||
470 | |||
471 | if (unit == UNIT_MINUTE) | ||
472 | new_timeout *= 60; | ||
473 | |||
474 | return put_user(new_timeout, uarg.i); | ||
475 | |||
476 | case WDIOC_SETOPTIONS: | ||
477 | { | ||
478 | int options, retval = -EINVAL; | ||
479 | |||
480 | if (get_user(options, uarg.i)) | ||
481 | return -EFAULT; | ||
482 | |||
483 | if (options & WDIOS_DISABLECARD) { | ||
484 | wb_smsc_wdt_disable(); | ||
485 | retval = 0; | ||
486 | } | ||
487 | |||
488 | if (options & WDIOS_ENABLECARD) { | ||
489 | wb_smsc_wdt_enable(); | ||
490 | retval = 0; | ||
491 | } | ||
492 | |||
493 | return retval; | ||
494 | } | ||
495 | } | ||
496 | } | ||
497 | |||
498 | /* -- Notifier funtions -----------------------------------------*/ | ||
499 | |||
500 | static int wb_smsc_wdt_notify_sys(struct notifier_block *this, unsigned long code, void *unused) | ||
501 | { | ||
502 | if (code == SYS_DOWN || code == SYS_HALT) | ||
503 | { | ||
504 | // set timeout to 0, to avoid possible race-condition | ||
505 | timeout = 0; | ||
506 | wb_smsc_wdt_disable(); | ||
507 | } | ||
508 | return NOTIFY_DONE; | ||
509 | } | ||
510 | |||
511 | /* -- Module's structures ---------------------------------------*/ | ||
512 | |||
513 | static struct file_operations wb_smsc_wdt_fops = | ||
514 | { | ||
515 | .owner = THIS_MODULE, | ||
516 | .llseek = no_llseek, | ||
517 | .write = wb_smsc_wdt_write, | ||
518 | .ioctl = wb_smsc_wdt_ioctl, | ||
519 | .open = wb_smsc_wdt_open, | ||
520 | .release = wb_smsc_wdt_release, | ||
521 | }; | ||
522 | |||
523 | static struct notifier_block wb_smsc_wdt_notifier = | ||
524 | { | ||
525 | .notifier_call = wb_smsc_wdt_notify_sys, | ||
526 | }; | ||
527 | |||
528 | static struct miscdevice wb_smsc_wdt_miscdev = | ||
529 | { | ||
530 | .minor = WATCHDOG_MINOR, | ||
531 | .name = "watchdog", | ||
532 | .fops = &wb_smsc_wdt_fops, | ||
533 | }; | ||
534 | |||
535 | /* -- Module init functions -------------------------------------*/ | ||
536 | |||
537 | /* module's "constructor" */ | ||
538 | |||
539 | static int __init wb_smsc_wdt_init(void) | ||
540 | { | ||
541 | int ret; | ||
542 | |||
543 | spin_lock_init(&io_lock); | ||
544 | |||
545 | printk("SMsC 37B787 watchdog component driver " VERSION " initialising...\n"); | ||
546 | |||
547 | if (!request_region(IOPORT, IOPORT_SIZE, "SMsC 37B787 watchdog")) { | ||
548 | printk(KERN_ERR MODNAME "Unable to register IO port %#x\n", IOPORT); | ||
549 | ret = -EBUSY; | ||
550 | goto out_pnp; | ||
551 | } | ||
552 | |||
553 | // set new maximum, if it's too big | ||
554 | if (timeout > MAX_TIMEOUT) | ||
555 | timeout = MAX_TIMEOUT; | ||
556 | |||
557 | // init the watchdog timer | ||
558 | wb_smsc_wdt_initialize(); | ||
559 | |||
560 | ret = register_reboot_notifier(&wb_smsc_wdt_notifier); | ||
561 | if (ret) { | ||
562 | printk(KERN_ERR MODNAME "Unable to register reboot notifier err = %d\n", ret); | ||
563 | goto out_io; | ||
564 | } | ||
565 | |||
566 | ret = misc_register(&wb_smsc_wdt_miscdev); | ||
567 | if (ret) { | ||
568 | printk(KERN_ERR MODNAME "Unable to register miscdev on minor %d\n", WATCHDOG_MINOR); | ||
569 | goto out_rbt; | ||
570 | } | ||
571 | |||
572 | // output info | ||
573 | printk(KERN_INFO MODNAME "Timeout set to %d %s.\n", timeout, (unit == UNIT_SECOND) ? "second(s)" : "minute(s)"); | ||
574 | printk(KERN_INFO MODNAME "Watchdog initialized and sleeping (nowayout=%d)...\n", nowayout); | ||
575 | |||
576 | // ret = 0 | ||
577 | |||
578 | out_clean: | ||
579 | return ret; | ||
580 | |||
581 | out_rbt: | ||
582 | unregister_reboot_notifier(&wb_smsc_wdt_notifier); | ||
583 | |||
584 | out_io: | ||
585 | release_region(IOPORT, IOPORT_SIZE); | ||
586 | |||
587 | out_pnp: | ||
588 | goto out_clean; | ||
589 | } | ||
590 | |||
591 | /* module's "destructor" */ | ||
592 | |||
593 | static void __exit wb_smsc_wdt_exit(void) | ||
594 | { | ||
595 | /* Stop the timer before we leave */ | ||
596 | if (!nowayout) | ||
597 | { | ||
598 | wb_smsc_wdt_shutdown(); | ||
599 | printk(KERN_INFO MODNAME "Watchdog disabled.\n"); | ||
600 | } | ||
601 | |||
602 | misc_deregister(&wb_smsc_wdt_miscdev); | ||
603 | unregister_reboot_notifier(&wb_smsc_wdt_notifier); | ||
604 | release_region(IOPORT, IOPORT_SIZE); | ||
605 | |||
606 | printk("SMsC 37B787 watchdog component driver removed.\n"); | ||
607 | } | ||
608 | |||
609 | module_init(wb_smsc_wdt_init); | ||
610 | module_exit(wb_smsc_wdt_exit); | ||
611 | |||
612 | MODULE_AUTHOR("Sven Anders <anders@anduras.de>"); | ||
613 | MODULE_DESCRIPTION("Driver for SMsC 37B787 watchdog component (Version " VERSION ")"); | ||
614 | MODULE_LICENSE("GPL"); | ||
615 | |||
616 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); | ||
617 | |||
618 | #ifdef SMSC_SUPPORT_MINUTES | ||
619 | module_param(unit, int, 0); | ||
620 | MODULE_PARM_DESC(unit, "set unit to use, 0=seconds or 1=minutes, default is 0"); | ||
621 | #endif | ||
622 | |||
623 | module_param(timeout, int, 0); | ||
624 | MODULE_PARM_DESC(timeout, "range is 1-255 units, default is 60"); | ||
625 | |||
626 | module_param(nowayout, int, 0); | ||
627 | MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)"); | ||
diff --git a/drivers/char/watchdog/w83627hf_wdt.c b/drivers/char/watchdog/w83627hf_wdt.c index b4adc527e687..07d4bff27226 100644 --- a/drivers/char/watchdog/w83627hf_wdt.c +++ b/drivers/char/watchdog/w83627hf_wdt.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/notifier.h> | 33 | #include <linux/notifier.h> |
34 | #include <linux/reboot.h> | 34 | #include <linux/reboot.h> |
35 | #include <linux/init.h> | 35 | #include <linux/init.h> |
36 | #include <linux/spinlock.h> | ||
36 | 37 | ||
37 | #include <asm/io.h> | 38 | #include <asm/io.h> |
38 | #include <asm/uaccess.h> | 39 | #include <asm/uaccess.h> |
@@ -44,6 +45,7 @@ | |||
44 | 45 | ||
45 | static unsigned long wdt_is_open; | 46 | static unsigned long wdt_is_open; |
46 | static char expect_close; | 47 | static char expect_close; |
48 | static spinlock_t io_lock; | ||
47 | 49 | ||
48 | /* You must set this - there is no sane way to probe for this board. */ | 50 | /* You must set this - there is no sane way to probe for this board. */ |
49 | static int wdt_io = 0x2E; | 51 | static int wdt_io = 0x2E; |
@@ -110,12 +112,16 @@ w83627hf_init(void) | |||
110 | static void | 112 | static void |
111 | wdt_ctrl(int timeout) | 113 | wdt_ctrl(int timeout) |
112 | { | 114 | { |
115 | spin_lock(&io_lock); | ||
116 | |||
113 | w83627hf_select_wd_register(); | 117 | w83627hf_select_wd_register(); |
114 | 118 | ||
115 | outb_p(0xF6, WDT_EFER); /* Select CRF6 */ | 119 | outb_p(0xF6, WDT_EFER); /* Select CRF6 */ |
116 | outb_p(timeout, WDT_EFDR); /* Write Timeout counter to CRF6 */ | 120 | outb_p(timeout, WDT_EFDR); /* Write Timeout counter to CRF6 */ |
117 | 121 | ||
118 | w83627hf_unselect_wd_register(); | 122 | w83627hf_unselect_wd_register(); |
123 | |||
124 | spin_unlock(&io_lock); | ||
119 | } | 125 | } |
120 | 126 | ||
121 | static int | 127 | static int |
@@ -303,6 +309,8 @@ wdt_init(void) | |||
303 | { | 309 | { |
304 | int ret; | 310 | int ret; |
305 | 311 | ||
312 | spin_lock_init(&io_lock); | ||
313 | |||
306 | printk(KERN_INFO "WDT driver for the Winbond(TM) W83627HF Super I/O chip initialising.\n"); | 314 | printk(KERN_INFO "WDT driver for the Winbond(TM) W83627HF Super I/O chip initialising.\n"); |
307 | 315 | ||
308 | if (wdt_set_heartbeat(timeout)) { | 316 | if (wdt_set_heartbeat(timeout)) { |
diff --git a/drivers/char/watchdog/w83697hf_wdt.c b/drivers/char/watchdog/w83697hf_wdt.c new file mode 100644 index 000000000000..7768b55487c8 --- /dev/null +++ b/drivers/char/watchdog/w83697hf_wdt.c | |||
@@ -0,0 +1,450 @@ | |||
1 | /* | ||
2 | * w83697hf/hg WDT driver | ||
3 | * | ||
4 | * (c) Copyright 2006 Samuel Tardieu <sam@rfc1149.net> | ||
5 | * (c) Copyright 2006 Marcus Junker <junker@anduras.de> | ||
6 | * | ||
7 | * Based on w83627hf_wdt.c which is based on advantechwdt.c | ||
8 | * which is based on wdt.c. | ||
9 | * Original copyright messages: | ||
10 | * | ||
11 | * (c) Copyright 2003 Pádraig Brady <P@draigBrady.com> | ||
12 | * | ||
13 | * (c) Copyright 2000-2001 Marek Michalkiewicz <marekm@linux.org.pl> | ||
14 | * | ||
15 | * (c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved. | ||
16 | * http://www.redhat.com | ||
17 | * | ||
18 | * This program is free software; you can redistribute it and/or | ||
19 | * modify it under the terms of the GNU General Public License | ||
20 | * as published by the Free Software Foundation; either version | ||
21 | * 2 of the License, or (at your option) any later version. | ||
22 | * | ||
23 | * Neither Marcus Junker nor ANDURAS AG admit liability nor provide | ||
24 | * warranty for any of this software. This material is provided | ||
25 | * "AS-IS" and at no charge. | ||
26 | */ | ||
27 | |||
28 | #include <linux/module.h> | ||
29 | #include <linux/moduleparam.h> | ||
30 | #include <linux/types.h> | ||
31 | #include <linux/miscdevice.h> | ||
32 | #include <linux/watchdog.h> | ||
33 | #include <linux/fs.h> | ||
34 | #include <linux/ioport.h> | ||
35 | #include <linux/notifier.h> | ||
36 | #include <linux/reboot.h> | ||
37 | #include <linux/init.h> | ||
38 | #include <linux/spinlock.h> | ||
39 | |||
40 | #include <asm/io.h> | ||
41 | #include <asm/uaccess.h> | ||
42 | #include <asm/system.h> | ||
43 | |||
44 | #define WATCHDOG_NAME "w83697hf/hg WDT" | ||
45 | #define PFX WATCHDOG_NAME ": " | ||
46 | #define WATCHDOG_TIMEOUT 60 /* 60 sec default timeout */ | ||
47 | |||
48 | static unsigned long wdt_is_open; | ||
49 | static char expect_close; | ||
50 | static spinlock_t io_lock; | ||
51 | |||
52 | /* You must set this - there is no sane way to probe for this board. */ | ||
53 | static int wdt_io = 0x2e; | ||
54 | module_param(wdt_io, int, 0); | ||
55 | MODULE_PARM_DESC(wdt_io, "w83697hf/hg WDT io port (default 0x2e, 0 = autodetect)"); | ||
56 | |||
57 | static int timeout = WATCHDOG_TIMEOUT; /* in seconds */ | ||
58 | module_param(timeout, int, 0); | ||
59 | MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=255, default=" __MODULE_STRING(WATCHDOG_TIMEOUT) "."); | ||
60 | |||
61 | static int nowayout = WATCHDOG_NOWAYOUT; | ||
62 | module_param(nowayout, int, 0); | ||
63 | MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)"); | ||
64 | |||
65 | /* | ||
66 | * Kernel methods. | ||
67 | */ | ||
68 | |||
69 | #define W83697HF_EFER (wdt_io+0) /* Extended Function Enable Register */ | ||
70 | #define W83697HF_EFIR (wdt_io+0) /* Extended Function Index Register (same as EFER) */ | ||
71 | #define W83697HF_EFDR (wdt_io+1) /* Extended Function Data Register */ | ||
72 | |||
73 | static inline void | ||
74 | w83697hf_unlock(void) | ||
75 | { | ||
76 | outb_p(0x87, W83697HF_EFER); /* Enter extended function mode */ | ||
77 | outb_p(0x87, W83697HF_EFER); /* Again according to manual */ | ||
78 | } | ||
79 | |||
80 | static inline void | ||
81 | w83697hf_lock(void) | ||
82 | { | ||
83 | outb_p(0xAA, W83697HF_EFER); /* Leave extended function mode */ | ||
84 | } | ||
85 | |||
86 | /* | ||
87 | * The three functions w83697hf_get_reg(), w83697hf_set_reg() and | ||
88 | * w83697hf_write_timeout() must be called with the device unlocked. | ||
89 | */ | ||
90 | |||
91 | static unsigned char | ||
92 | w83697hf_get_reg(unsigned char reg) | ||
93 | { | ||
94 | outb_p(reg, W83697HF_EFIR); | ||
95 | return inb_p(W83697HF_EFDR); | ||
96 | } | ||
97 | |||
98 | static void | ||
99 | w83697hf_set_reg(unsigned char reg, unsigned char data) | ||
100 | { | ||
101 | outb_p(reg, W83697HF_EFIR); | ||
102 | outb_p(data, W83697HF_EFDR); | ||
103 | } | ||
104 | |||
105 | static void | ||
106 | w83697hf_write_timeout(int timeout) | ||
107 | { | ||
108 | w83697hf_set_reg(0xF4, timeout); /* Write Timeout counter to CRF4 */ | ||
109 | } | ||
110 | |||
111 | static void | ||
112 | w83697hf_select_wdt(void) | ||
113 | { | ||
114 | w83697hf_unlock(); | ||
115 | w83697hf_set_reg(0x07, 0x08); /* Switch to logic device 8 (GPIO2) */ | ||
116 | } | ||
117 | |||
118 | static inline void | ||
119 | w83697hf_deselect_wdt(void) | ||
120 | { | ||
121 | w83697hf_lock(); | ||
122 | } | ||
123 | |||
124 | static void | ||
125 | w83697hf_init(void) | ||
126 | { | ||
127 | unsigned char bbuf; | ||
128 | |||
129 | w83697hf_select_wdt(); | ||
130 | |||
131 | bbuf = w83697hf_get_reg(0x29); | ||
132 | bbuf &= ~0x60; | ||
133 | bbuf |= 0x20; | ||
134 | w83697hf_set_reg(0x29, bbuf); /* Set pin 119 to WDTO# mode (= CR29, WDT0) */ | ||
135 | |||
136 | bbuf = w83697hf_get_reg(0xF3); | ||
137 | bbuf &= ~0x04; | ||
138 | w83697hf_set_reg(0xF3, bbuf); /* Count mode is seconds */ | ||
139 | |||
140 | w83697hf_deselect_wdt(); | ||
141 | } | ||
142 | |||
143 | static int | ||
144 | wdt_ping(void) | ||
145 | { | ||
146 | spin_lock(&io_lock); | ||
147 | w83697hf_select_wdt(); | ||
148 | |||
149 | w83697hf_write_timeout(timeout); | ||
150 | |||
151 | w83697hf_deselect_wdt(); | ||
152 | spin_unlock(&io_lock); | ||
153 | return 0; | ||
154 | } | ||
155 | |||
156 | static int | ||
157 | wdt_enable(void) | ||
158 | { | ||
159 | spin_lock(&io_lock); | ||
160 | w83697hf_select_wdt(); | ||
161 | |||
162 | w83697hf_write_timeout(timeout); | ||
163 | w83697hf_set_reg(0x30, 1); /* Enable timer */ | ||
164 | |||
165 | w83697hf_deselect_wdt(); | ||
166 | spin_unlock(&io_lock); | ||
167 | return 0; | ||
168 | } | ||
169 | |||
170 | static int | ||
171 | wdt_disable(void) | ||
172 | { | ||
173 | spin_lock(&io_lock); | ||
174 | w83697hf_select_wdt(); | ||
175 | |||
176 | w83697hf_set_reg(0x30, 0); /* Disable timer */ | ||
177 | w83697hf_write_timeout(0); | ||
178 | |||
179 | w83697hf_deselect_wdt(); | ||
180 | spin_unlock(&io_lock); | ||
181 | return 0; | ||
182 | } | ||
183 | |||
184 | static int | ||
185 | wdt_set_heartbeat(int t) | ||
186 | { | ||
187 | if ((t < 1) || (t > 255)) | ||
188 | return -EINVAL; | ||
189 | |||
190 | timeout = t; | ||
191 | return 0; | ||
192 | } | ||
193 | |||
194 | static ssize_t | ||
195 | wdt_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) | ||
196 | { | ||
197 | if (count) { | ||
198 | if (!nowayout) { | ||
199 | size_t i; | ||
200 | |||
201 | expect_close = 0; | ||
202 | |||
203 | for (i = 0; i != count; i++) { | ||
204 | char c; | ||
205 | if (get_user(c, buf+i)) | ||
206 | return -EFAULT; | ||
207 | if (c == 'V') | ||
208 | expect_close = 42; | ||
209 | } | ||
210 | } | ||
211 | wdt_ping(); | ||
212 | } | ||
213 | return count; | ||
214 | } | ||
215 | |||
216 | static int | ||
217 | wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | ||
218 | unsigned long arg) | ||
219 | { | ||
220 | void __user *argp = (void __user *)arg; | ||
221 | int __user *p = argp; | ||
222 | int new_timeout; | ||
223 | static struct watchdog_info ident = { | ||
224 | .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE, | ||
225 | .firmware_version = 1, | ||
226 | .identity = "W83697HF WDT", | ||
227 | }; | ||
228 | |||
229 | switch (cmd) { | ||
230 | case WDIOC_GETSUPPORT: | ||
231 | if (copy_to_user(argp, &ident, sizeof(ident))) | ||
232 | return -EFAULT; | ||
233 | break; | ||
234 | |||
235 | case WDIOC_GETSTATUS: | ||
236 | case WDIOC_GETBOOTSTATUS: | ||
237 | return put_user(0, p); | ||
238 | |||
239 | case WDIOC_KEEPALIVE: | ||
240 | wdt_ping(); | ||
241 | break; | ||
242 | |||
243 | case WDIOC_SETTIMEOUT: | ||
244 | if (get_user(new_timeout, p)) | ||
245 | return -EFAULT; | ||
246 | if (wdt_set_heartbeat(new_timeout)) | ||
247 | return -EINVAL; | ||
248 | wdt_ping(); | ||
249 | /* Fall */ | ||
250 | |||
251 | case WDIOC_GETTIMEOUT: | ||
252 | return put_user(timeout, p); | ||
253 | |||
254 | case WDIOC_SETOPTIONS: | ||
255 | { | ||
256 | int options, retval = -EINVAL; | ||
257 | |||
258 | if (get_user(options, p)) | ||
259 | return -EFAULT; | ||
260 | |||
261 | if (options & WDIOS_DISABLECARD) { | ||
262 | wdt_disable(); | ||
263 | retval = 0; | ||
264 | } | ||
265 | |||
266 | if (options & WDIOS_ENABLECARD) { | ||
267 | wdt_enable(); | ||
268 | retval = 0; | ||
269 | } | ||
270 | |||
271 | return retval; | ||
272 | } | ||
273 | |||
274 | default: | ||
275 | return -ENOTTY; | ||
276 | } | ||
277 | return 0; | ||
278 | } | ||
279 | |||
280 | static int | ||
281 | wdt_open(struct inode *inode, struct file *file) | ||
282 | { | ||
283 | if (test_and_set_bit(0, &wdt_is_open)) | ||
284 | return -EBUSY; | ||
285 | /* | ||
286 | * Activate | ||
287 | */ | ||
288 | |||
289 | wdt_enable(); | ||
290 | return nonseekable_open(inode, file); | ||
291 | } | ||
292 | |||
293 | static int | ||
294 | wdt_close(struct inode *inode, struct file *file) | ||
295 | { | ||
296 | if (expect_close == 42) { | ||
297 | wdt_disable(); | ||
298 | } else { | ||
299 | printk (KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); | ||
300 | wdt_ping(); | ||
301 | } | ||
302 | expect_close = 0; | ||
303 | clear_bit(0, &wdt_is_open); | ||
304 | return 0; | ||
305 | } | ||
306 | |||
307 | /* | ||
308 | * Notifier for system down | ||
309 | */ | ||
310 | |||
311 | static int | ||
312 | wdt_notify_sys(struct notifier_block *this, unsigned long code, | ||
313 | void *unused) | ||
314 | { | ||
315 | if (code == SYS_DOWN || code == SYS_HALT) { | ||
316 | /* Turn the WDT off */ | ||
317 | wdt_disable(); | ||
318 | } | ||
319 | return NOTIFY_DONE; | ||
320 | } | ||
321 | |||
322 | /* | ||
323 | * Kernel Interfaces | ||
324 | */ | ||
325 | |||
326 | static struct file_operations wdt_fops = { | ||
327 | .owner = THIS_MODULE, | ||
328 | .llseek = no_llseek, | ||
329 | .write = wdt_write, | ||
330 | .ioctl = wdt_ioctl, | ||
331 | .open = wdt_open, | ||
332 | .release = wdt_close, | ||
333 | }; | ||
334 | |||
335 | static struct miscdevice wdt_miscdev = { | ||
336 | .minor = WATCHDOG_MINOR, | ||
337 | .name = "watchdog", | ||
338 | .fops = &wdt_fops, | ||
339 | }; | ||
340 | |||
341 | /* | ||
342 | * The WDT needs to learn about soft shutdowns in order to | ||
343 | * turn the timebomb registers off. | ||
344 | */ | ||
345 | |||
346 | static struct notifier_block wdt_notifier = { | ||
347 | .notifier_call = wdt_notify_sys, | ||
348 | }; | ||
349 | |||
350 | static int | ||
351 | w83697hf_check_wdt(void) | ||
352 | { | ||
353 | if (!request_region(wdt_io, 2, WATCHDOG_NAME)) { | ||
354 | printk (KERN_ERR PFX "I/O address 0x%x already in use\n", wdt_io); | ||
355 | return -EIO; | ||
356 | } | ||
357 | |||
358 | printk (KERN_DEBUG PFX "Looking for watchdog at address 0x%x\n", wdt_io); | ||
359 | w83697hf_unlock(); | ||
360 | if (w83697hf_get_reg(0x20) == 0x60) { | ||
361 | printk (KERN_INFO PFX "watchdog found at address 0x%x\n", wdt_io); | ||
362 | w83697hf_lock(); | ||
363 | return 0; | ||
364 | } | ||
365 | w83697hf_lock(); /* Reprotect in case it was a compatible device */ | ||
366 | |||
367 | printk (KERN_INFO PFX "watchdog not found at address 0x%x\n", wdt_io); | ||
368 | release_region(wdt_io, 2); | ||
369 | return -EIO; | ||
370 | } | ||
371 | |||
372 | static int w83697hf_ioports[] = { 0x2e, 0x4e, 0x00 }; | ||
373 | |||
374 | static int __init | ||
375 | wdt_init(void) | ||
376 | { | ||
377 | int ret, i, found = 0; | ||
378 | |||
379 | spin_lock_init(&io_lock); | ||
380 | |||
381 | printk (KERN_INFO PFX "WDT driver for W83697HF/HG initializing\n"); | ||
382 | |||
383 | if (wdt_io == 0) { | ||
384 | /* we will autodetect the W83697HF/HG watchdog */ | ||
385 | for (i = 0; ((!found) && (w83697hf_ioports[i] != 0)); i++) { | ||
386 | wdt_io = w83697hf_ioports[i]; | ||
387 | if (!w83697hf_check_wdt()) | ||
388 | found++; | ||
389 | } | ||
390 | } else { | ||
391 | if (!w83697hf_check_wdt()) | ||
392 | found++; | ||
393 | } | ||
394 | |||
395 | if (!found) { | ||
396 | printk (KERN_ERR PFX "No W83697HF/HG could be found\n"); | ||
397 | ret = -EIO; | ||
398 | goto out; | ||
399 | } | ||
400 | |||
401 | w83697hf_init(); | ||
402 | wdt_disable(); /* Disable watchdog until first use */ | ||
403 | |||
404 | if (wdt_set_heartbeat(timeout)) { | ||
405 | wdt_set_heartbeat(WATCHDOG_TIMEOUT); | ||
406 | printk (KERN_INFO PFX "timeout value must be 1<=timeout<=255, using %d\n", | ||
407 | WATCHDOG_TIMEOUT); | ||
408 | } | ||
409 | |||
410 | ret = register_reboot_notifier(&wdt_notifier); | ||
411 | if (ret != 0) { | ||
412 | printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", | ||
413 | ret); | ||
414 | goto unreg_regions; | ||
415 | } | ||
416 | |||
417 | ret = misc_register(&wdt_miscdev); | ||
418 | if (ret != 0) { | ||
419 | printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", | ||
420 | WATCHDOG_MINOR, ret); | ||
421 | goto unreg_reboot; | ||
422 | } | ||
423 | |||
424 | printk (KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n", | ||
425 | timeout, nowayout); | ||
426 | |||
427 | out: | ||
428 | return ret; | ||
429 | unreg_reboot: | ||
430 | unregister_reboot_notifier(&wdt_notifier); | ||
431 | unreg_regions: | ||
432 | release_region(wdt_io, 2); | ||
433 | goto out; | ||
434 | } | ||
435 | |||
436 | static void __exit | ||
437 | wdt_exit(void) | ||
438 | { | ||
439 | misc_deregister(&wdt_miscdev); | ||
440 | unregister_reboot_notifier(&wdt_notifier); | ||
441 | release_region(wdt_io, 2); | ||
442 | } | ||
443 | |||
444 | module_init(wdt_init); | ||
445 | module_exit(wdt_exit); | ||
446 | |||
447 | MODULE_LICENSE("GPL"); | ||
448 | MODULE_AUTHOR("Marcus Junker <junker@anduras.de>, Samuel Tardieu <sam@rfc1149.net>"); | ||
449 | MODULE_DESCRIPTION("w83697hf/hg WDT driver"); | ||
450 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); | ||
diff --git a/drivers/clocksource/acpi_pm.c b/drivers/clocksource/acpi_pm.c index 7ad3be8c0f49..7fcb77a9d011 100644 --- a/drivers/clocksource/acpi_pm.c +++ b/drivers/clocksource/acpi_pm.c | |||
@@ -54,8 +54,8 @@ static cycle_t acpi_pm_read_verified(void) | |||
54 | v1 = read_pmtmr(); | 54 | v1 = read_pmtmr(); |
55 | v2 = read_pmtmr(); | 55 | v2 = read_pmtmr(); |
56 | v3 = read_pmtmr(); | 56 | v3 = read_pmtmr(); |
57 | } while ((v1 > v2 && v1 < v3) || (v2 > v3 && v2 < v1) | 57 | } while (unlikely((v1 > v2 && v1 < v3) || (v2 > v3 && v2 < v1) |
58 | || (v3 > v1 && v3 < v2)); | 58 | || (v3 > v1 && v3 < v2))); |
59 | 59 | ||
60 | return (cycle_t)v2; | 60 | return (cycle_t)v2; |
61 | } | 61 | } |
@@ -138,6 +138,8 @@ static void __devinit acpi_pm_check_graylist(struct pci_dev *dev) | |||
138 | } | 138 | } |
139 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, | 139 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, |
140 | acpi_pm_check_graylist); | 140 | acpi_pm_check_graylist); |
141 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_LE, | ||
142 | acpi_pm_check_graylist); | ||
141 | #endif | 143 | #endif |
142 | 144 | ||
143 | 145 | ||
diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig index 2cc71b66231e..491779af8d55 100644 --- a/drivers/cpufreq/Kconfig +++ b/drivers/cpufreq/Kconfig | |||
@@ -107,6 +107,7 @@ config CPU_FREQ_GOV_USERSPACE | |||
107 | 107 | ||
108 | config CPU_FREQ_GOV_ONDEMAND | 108 | config CPU_FREQ_GOV_ONDEMAND |
109 | tristate "'ondemand' cpufreq policy governor" | 109 | tristate "'ondemand' cpufreq policy governor" |
110 | select CPU_FREQ_TABLE | ||
110 | help | 111 | help |
111 | 'ondemand' - This driver adds a dynamic cpufreq policy governor. | 112 | 'ondemand' - This driver adds a dynamic cpufreq policy governor. |
112 | The governor does a periodic polling and | 113 | The governor does a periodic polling and |
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 86e69b7f9122..dd0c2623e27b 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -59,7 +59,7 @@ static int __init init_cpufreq_transition_notifier_list(void) | |||
59 | srcu_init_notifier_head(&cpufreq_transition_notifier_list); | 59 | srcu_init_notifier_head(&cpufreq_transition_notifier_list); |
60 | return 0; | 60 | return 0; |
61 | } | 61 | } |
62 | core_initcall(init_cpufreq_transition_notifier_list); | 62 | pure_initcall(init_cpufreq_transition_notifier_list); |
63 | 63 | ||
64 | static LIST_HEAD(cpufreq_governor_list); | 64 | static LIST_HEAD(cpufreq_governor_list); |
65 | static DEFINE_MUTEX (cpufreq_governor_mutex); | 65 | static DEFINE_MUTEX (cpufreq_governor_mutex); |
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c index 4bde30bb3be7..75e9e38330ff 100644 --- a/drivers/edac/edac_mc.c +++ b/drivers/edac/edac_mc.c | |||
@@ -230,34 +230,43 @@ static struct kobj_type ktype_memctrl = { | |||
230 | */ | 230 | */ |
231 | static int edac_sysfs_memctrl_setup(void) | 231 | static int edac_sysfs_memctrl_setup(void) |
232 | { | 232 | { |
233 | int err=0; | 233 | int err = 0; |
234 | 234 | ||
235 | debugf1("%s()\n", __func__); | 235 | debugf1("%s()\n", __func__); |
236 | 236 | ||
237 | /* create the /sys/devices/system/edac directory */ | 237 | /* create the /sys/devices/system/edac directory */ |
238 | err = sysdev_class_register(&edac_class); | 238 | err = sysdev_class_register(&edac_class); |
239 | 239 | ||
240 | if (!err) { | 240 | if (err) { |
241 | /* Init the MC's kobject */ | 241 | debugf1("%s() error=%d\n", __func__, err); |
242 | memset(&edac_memctrl_kobj, 0, sizeof (edac_memctrl_kobj)); | 242 | return err; |
243 | edac_memctrl_kobj.parent = &edac_class.kset.kobj; | 243 | } |
244 | edac_memctrl_kobj.ktype = &ktype_memctrl; | ||
245 | 244 | ||
246 | /* generate sysfs "..../edac/mc" */ | 245 | /* Init the MC's kobject */ |
247 | err = kobject_set_name(&edac_memctrl_kobj,"mc"); | 246 | memset(&edac_memctrl_kobj, 0, sizeof (edac_memctrl_kobj)); |
247 | edac_memctrl_kobj.parent = &edac_class.kset.kobj; | ||
248 | edac_memctrl_kobj.ktype = &ktype_memctrl; | ||
248 | 249 | ||
249 | if (!err) { | 250 | /* generate sysfs "..../edac/mc" */ |
250 | /* FIXME: maybe new sysdev_create_subdir() */ | 251 | err = kobject_set_name(&edac_memctrl_kobj,"mc"); |
251 | err = kobject_register(&edac_memctrl_kobj); | ||
252 | 252 | ||
253 | if (err) | 253 | if (err) |
254 | debugf1("Failed to register '.../edac/mc'\n"); | 254 | goto fail; |
255 | else | 255 | |
256 | debugf1("Registered '.../edac/mc' kobject\n"); | 256 | /* FIXME: maybe new sysdev_create_subdir() */ |
257 | } | 257 | err = kobject_register(&edac_memctrl_kobj); |
258 | } else | 258 | |
259 | debugf1("%s() error=%d\n", __func__, err); | 259 | if (err) { |
260 | debugf1("Failed to register '.../edac/mc'\n"); | ||
261 | goto fail; | ||
262 | } | ||
260 | 263 | ||
264 | debugf1("Registered '.../edac/mc' kobject\n"); | ||
265 | |||
266 | return 0; | ||
267 | |||
268 | fail: | ||
269 | sysdev_class_unregister(&edac_class); | ||
261 | return err; | 270 | return err; |
262 | } | 271 | } |
263 | 272 | ||
diff --git a/drivers/fc4/fc.c b/drivers/fc4/fc.c index 22d17474755f..ca4e67a022d0 100644 --- a/drivers/fc4/fc.c +++ b/drivers/fc4/fc.c | |||
@@ -70,9 +70,9 @@ | |||
70 | 70 | ||
71 | #define FCP_CMND(SCpnt) ((fcp_cmnd *)&(SCpnt->SCp)) | 71 | #define FCP_CMND(SCpnt) ((fcp_cmnd *)&(SCpnt->SCp)) |
72 | #define FC_SCMND(SCpnt) ((fc_channel *)(SCpnt->device->host->hostdata[0])) | 72 | #define FC_SCMND(SCpnt) ((fc_channel *)(SCpnt->device->host->hostdata[0])) |
73 | #define SC_FCMND(fcmnd) ((Scsi_Cmnd *)((long)fcmnd - (long)&(((Scsi_Cmnd *)0)->SCp))) | 73 | #define SC_FCMND(fcmnd) ((struct scsi_cmnd *)((long)fcmnd - (long)&(((struct scsi_cmnd *)0)->SCp))) |
74 | 74 | ||
75 | static int fcp_scsi_queue_it(fc_channel *, Scsi_Cmnd *, fcp_cmnd *, int); | 75 | static int fcp_scsi_queue_it(fc_channel *, struct scsi_cmnd *, fcp_cmnd *, int); |
76 | void fcp_queue_empty(fc_channel *); | 76 | void fcp_queue_empty(fc_channel *); |
77 | 77 | ||
78 | static void fcp_scsi_insert_queue (fc_channel *fc, fcp_cmnd *fcmd) | 78 | static void fcp_scsi_insert_queue (fc_channel *fc, fcp_cmnd *fcmd) |
@@ -378,14 +378,14 @@ void fcp_register(fc_channel *fc, u8 type, int unregister) | |||
378 | printk ("FC: %segistering unknown type %02x\n", unregister ? "Unr" : "R", type); | 378 | printk ("FC: %segistering unknown type %02x\n", unregister ? "Unr" : "R", type); |
379 | } | 379 | } |
380 | 380 | ||
381 | static void fcp_scsi_done(Scsi_Cmnd *SCpnt); | 381 | static void fcp_scsi_done(struct scsi_cmnd *SCpnt); |
382 | 382 | ||
383 | static inline void fcp_scsi_receive(fc_channel *fc, int token, int status, fc_hdr *fch) | 383 | static inline void fcp_scsi_receive(fc_channel *fc, int token, int status, fc_hdr *fch) |
384 | { | 384 | { |
385 | fcp_cmnd *fcmd; | 385 | fcp_cmnd *fcmd; |
386 | fcp_rsp *rsp; | 386 | fcp_rsp *rsp; |
387 | int host_status; | 387 | int host_status; |
388 | Scsi_Cmnd *SCpnt; | 388 | struct scsi_cmnd *SCpnt; |
389 | int sense_len; | 389 | int sense_len; |
390 | int rsp_status; | 390 | int rsp_status; |
391 | 391 | ||
@@ -757,13 +757,14 @@ void fcp_release(fc_channel *fcchain, int count) /* count must > 0 */ | |||
757 | } | 757 | } |
758 | 758 | ||
759 | 759 | ||
760 | static void fcp_scsi_done (Scsi_Cmnd *SCpnt) | 760 | static void fcp_scsi_done(struct scsi_cmnd *SCpnt) |
761 | { | 761 | { |
762 | if (FCP_CMND(SCpnt)->done) | 762 | if (FCP_CMND(SCpnt)->done) |
763 | FCP_CMND(SCpnt)->done(SCpnt); | 763 | FCP_CMND(SCpnt)->done(SCpnt); |
764 | } | 764 | } |
765 | 765 | ||
766 | static int fcp_scsi_queue_it(fc_channel *fc, Scsi_Cmnd *SCpnt, fcp_cmnd *fcmd, int prepare) | 766 | static int fcp_scsi_queue_it(fc_channel *fc, struct scsi_cmnd *SCpnt, |
767 | fcp_cmnd *fcmd, int prepare) | ||
767 | { | 768 | { |
768 | long i; | 769 | long i; |
769 | fcp_cmd *cmd; | 770 | fcp_cmd *cmd; |
@@ -837,7 +838,8 @@ static int fcp_scsi_queue_it(fc_channel *fc, Scsi_Cmnd *SCpnt, fcp_cmnd *fcmd, i | |||
837 | return 0; | 838 | return 0; |
838 | } | 839 | } |
839 | 840 | ||
840 | int fcp_scsi_queuecommand(Scsi_Cmnd *SCpnt, void (* done)(Scsi_Cmnd *)) | 841 | int fcp_scsi_queuecommand(struct scsi_cmnd *SCpnt, |
842 | void (* done)(struct scsi_cmnd *)) | ||
841 | { | 843 | { |
842 | fcp_cmnd *fcmd = FCP_CMND(SCpnt); | 844 | fcp_cmnd *fcmd = FCP_CMND(SCpnt); |
843 | fc_channel *fc = FC_SCMND(SCpnt); | 845 | fc_channel *fc = FC_SCMND(SCpnt); |
@@ -873,7 +875,7 @@ void fcp_queue_empty(fc_channel *fc) | |||
873 | } | 875 | } |
874 | } | 876 | } |
875 | 877 | ||
876 | int fcp_scsi_abort(Scsi_Cmnd *SCpnt) | 878 | int fcp_scsi_abort(struct scsi_cmnd *SCpnt) |
877 | { | 879 | { |
878 | /* Internal bookkeeping only. Lose 1 cmd_slots slot. */ | 880 | /* Internal bookkeeping only. Lose 1 cmd_slots slot. */ |
879 | fcp_cmnd *fcmd = FCP_CMND(SCpnt); | 881 | fcp_cmnd *fcmd = FCP_CMND(SCpnt); |
@@ -910,7 +912,7 @@ int fcp_scsi_abort(Scsi_Cmnd *SCpnt) | |||
910 | } | 912 | } |
911 | 913 | ||
912 | #if 0 | 914 | #if 0 |
913 | void fcp_scsi_reset_done(Scsi_Cmnd *SCpnt) | 915 | void fcp_scsi_reset_done(struct scsi_cmnd *SCpnt) |
914 | { | 916 | { |
915 | fc_channel *fc = FC_SCMND(SCpnt); | 917 | fc_channel *fc = FC_SCMND(SCpnt); |
916 | 918 | ||
@@ -921,7 +923,7 @@ void fcp_scsi_reset_done(Scsi_Cmnd *SCpnt) | |||
921 | 923 | ||
922 | #define FCP_RESET_TIMEOUT (2*HZ) | 924 | #define FCP_RESET_TIMEOUT (2*HZ) |
923 | 925 | ||
924 | int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt) | 926 | int fcp_scsi_dev_reset(struct scsi_cmnd *SCpnt) |
925 | { | 927 | { |
926 | #if 0 /* broken junk, but if davem wants to compile this driver, let him.. */ | 928 | #if 0 /* broken junk, but if davem wants to compile this driver, let him.. */ |
927 | unsigned long flags; | 929 | unsigned long flags; |
@@ -931,7 +933,7 @@ int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt) | |||
931 | DECLARE_MUTEX_LOCKED(sem); | 933 | DECLARE_MUTEX_LOCKED(sem); |
932 | 934 | ||
933 | if (!fc->rst_pkt) { | 935 | if (!fc->rst_pkt) { |
934 | fc->rst_pkt = (Scsi_Cmnd *) kmalloc(sizeof(SCpnt), GFP_KERNEL); | 936 | fc->rst_pkt = (struct scsi_cmnd *) kmalloc(sizeof(SCpnt), GFP_KERNEL); |
935 | if (!fc->rst_pkt) return FAILED; | 937 | if (!fc->rst_pkt) return FAILED; |
936 | 938 | ||
937 | fcmd = FCP_CMND(fc->rst_pkt); | 939 | fcmd = FCP_CMND(fc->rst_pkt); |
@@ -999,7 +1001,7 @@ int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt) | |||
999 | return SUCCESS; | 1001 | return SUCCESS; |
1000 | } | 1002 | } |
1001 | 1003 | ||
1002 | static int __fcp_scsi_host_reset(Scsi_Cmnd *SCpnt) | 1004 | static int __fcp_scsi_host_reset(struct scsi_cmnd *SCpnt) |
1003 | { | 1005 | { |
1004 | fc_channel *fc = FC_SCMND(SCpnt); | 1006 | fc_channel *fc = FC_SCMND(SCpnt); |
1005 | fcp_cmnd *fcmd = FCP_CMND(SCpnt); | 1007 | fcp_cmnd *fcmd = FCP_CMND(SCpnt); |
@@ -1020,7 +1022,7 @@ static int __fcp_scsi_host_reset(Scsi_Cmnd *SCpnt) | |||
1020 | else return FAILED; | 1022 | else return FAILED; |
1021 | } | 1023 | } |
1022 | 1024 | ||
1023 | int fcp_scsi_host_reset(Scsi_Cmnd *SCpnt) | 1025 | int fcp_scsi_host_reset(struct scsi_cmnd *SCpnt) |
1024 | { | 1026 | { |
1025 | unsigned long flags; | 1027 | unsigned long flags; |
1026 | int rc; | 1028 | int rc; |
diff --git a/drivers/fc4/fcp_impl.h b/drivers/fc4/fcp_impl.h index c397c84bef63..1ac61330592e 100644 --- a/drivers/fc4/fcp_impl.h +++ b/drivers/fc4/fcp_impl.h | |||
@@ -39,7 +39,7 @@ struct _fc_channel; | |||
39 | typedef struct fcp_cmnd { | 39 | typedef struct fcp_cmnd { |
40 | struct fcp_cmnd *next; | 40 | struct fcp_cmnd *next; |
41 | struct fcp_cmnd *prev; | 41 | struct fcp_cmnd *prev; |
42 | void (*done)(Scsi_Cmnd *); | 42 | void (*done)(struct scsi_cmnd *); |
43 | unsigned short proto; | 43 | unsigned short proto; |
44 | unsigned short token; | 44 | unsigned short token; |
45 | unsigned int did; | 45 | unsigned int did; |
@@ -94,14 +94,14 @@ typedef struct _fc_channel { | |||
94 | long *scsi_bitmap; | 94 | long *scsi_bitmap; |
95 | long scsi_bitmap_end; | 95 | long scsi_bitmap_end; |
96 | int scsi_free; | 96 | int scsi_free; |
97 | int (*encode_addr)(Scsi_Cmnd *, u16 *, struct _fc_channel *, fcp_cmnd *); | 97 | int (*encode_addr)(struct scsi_cmnd *, u16 *, struct _fc_channel *, fcp_cmnd *); |
98 | fcp_cmnd *scsi_que; | 98 | fcp_cmnd *scsi_que; |
99 | char scsi_name[4]; | 99 | char scsi_name[4]; |
100 | fcp_cmnd **cmd_slots; | 100 | fcp_cmnd **cmd_slots; |
101 | int channels; | 101 | int channels; |
102 | int targets; | 102 | int targets; |
103 | long *ages; | 103 | long *ages; |
104 | Scsi_Cmnd *rst_pkt; | 104 | struct scsi_cmnd *rst_pkt; |
105 | fcp_posmap *posmap; | 105 | fcp_posmap *posmap; |
106 | /* LOGIN stuff */ | 106 | /* LOGIN stuff */ |
107 | fcp_cmnd *login; | 107 | fcp_cmnd *login; |
@@ -155,9 +155,10 @@ int fc_do_prli(fc_channel *, unsigned char); | |||
155 | for_each_fc_channel(fc) \ | 155 | for_each_fc_channel(fc) \ |
156 | if (fc->state == FC_STATE_ONLINE) | 156 | if (fc->state == FC_STATE_ONLINE) |
157 | 157 | ||
158 | int fcp_scsi_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); | 158 | int fcp_scsi_queuecommand(struct scsi_cmnd *, |
159 | int fcp_scsi_abort(Scsi_Cmnd *); | 159 | void (* done) (struct scsi_cmnd *)); |
160 | int fcp_scsi_dev_reset(Scsi_Cmnd *); | 160 | int fcp_scsi_abort(struct scsi_cmnd *); |
161 | int fcp_scsi_host_reset(Scsi_Cmnd *); | 161 | int fcp_scsi_dev_reset(struct scsi_cmnd *); |
162 | int fcp_scsi_host_reset(struct scsi_cmnd *); | ||
162 | 163 | ||
163 | #endif /* !(_FCP_SCSI_H) */ | 164 | #endif /* !(_FCP_SCSI_H) */ |
diff --git a/drivers/firmware/dell_rbu.c b/drivers/firmware/dell_rbu.c index 08b161798443..fc702e40bd43 100644 --- a/drivers/firmware/dell_rbu.c +++ b/drivers/firmware/dell_rbu.c | |||
@@ -705,17 +705,16 @@ static struct bin_attribute rbu_packet_size_attr = { | |||
705 | 705 | ||
706 | static int __init dcdrbu_init(void) | 706 | static int __init dcdrbu_init(void) |
707 | { | 707 | { |
708 | int rc = 0; | 708 | int rc; |
709 | spin_lock_init(&rbu_data.lock); | 709 | spin_lock_init(&rbu_data.lock); |
710 | 710 | ||
711 | init_packet_head(); | 711 | init_packet_head(); |
712 | rbu_device = | 712 | rbu_device = platform_device_register_simple("dell_rbu", -1, NULL, 0); |
713 | platform_device_register_simple("dell_rbu", -1, NULL, 0); | 713 | if (IS_ERR(rbu_device)) { |
714 | if (!rbu_device) { | ||
715 | printk(KERN_ERR | 714 | printk(KERN_ERR |
716 | "dell_rbu:%s:platform_device_register_simple " | 715 | "dell_rbu:%s:platform_device_register_simple " |
717 | "failed\n", __FUNCTION__); | 716 | "failed\n", __FUNCTION__); |
718 | return -EIO; | 717 | return PTR_ERR(rbu_device); |
719 | } | 718 | } |
720 | 719 | ||
721 | rc = sysfs_create_bin_file(&rbu_device->dev.kobj, &rbu_data_attr); | 720 | rc = sysfs_create_bin_file(&rbu_device->dev.kobj, &rbu_data_attr); |
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c index b8b596d5778d..37deee6c0c1c 100644 --- a/drivers/firmware/dmi_scan.c +++ b/drivers/firmware/dmi_scan.c | |||
@@ -326,6 +326,26 @@ char *dmi_get_system_info(int field) | |||
326 | } | 326 | } |
327 | EXPORT_SYMBOL(dmi_get_system_info); | 327 | EXPORT_SYMBOL(dmi_get_system_info); |
328 | 328 | ||
329 | |||
330 | /** | ||
331 | * dmi_name_in_vendors - Check if string is anywhere in the DMI vendor information. | ||
332 | * @str: Case sensitive Name | ||
333 | */ | ||
334 | int dmi_name_in_vendors(char *str) | ||
335 | { | ||
336 | static int fields[] = { DMI_BIOS_VENDOR, DMI_BIOS_VERSION, DMI_SYS_VENDOR, | ||
337 | DMI_PRODUCT_NAME, DMI_PRODUCT_VERSION, DMI_BOARD_VENDOR, | ||
338 | DMI_BOARD_NAME, DMI_BOARD_VERSION, DMI_NONE }; | ||
339 | int i; | ||
340 | for (i = 0; fields[i] != DMI_NONE; i++) { | ||
341 | int f = fields[i]; | ||
342 | if (dmi_ident[f] && strstr(dmi_ident[f], str)) | ||
343 | return 1; | ||
344 | } | ||
345 | return 0; | ||
346 | } | ||
347 | EXPORT_SYMBOL(dmi_name_in_vendors); | ||
348 | |||
329 | /** | 349 | /** |
330 | * dmi_find_device - find onboard device by type/name | 350 | * dmi_find_device - find onboard device by type/name |
331 | * @type: device type or %DMI_DEV_TYPE_ANY to match all device types | 351 | * @type: device type or %DMI_DEV_TYPE_ANY to match all device types |
diff --git a/drivers/i2c/busses/i2c-ixp4xx.c b/drivers/i2c/busses/i2c-ixp4xx.c index 1ce01fb0ac09..68fe863f9d54 100644 --- a/drivers/i2c/busses/i2c-ixp4xx.c +++ b/drivers/i2c/busses/i2c-ixp4xx.c | |||
@@ -137,7 +137,8 @@ static int ixp4xx_i2c_probe(struct platform_device *plat_dev) | |||
137 | gpio_line_set(gpio->scl_pin, 0); | 137 | gpio_line_set(gpio->scl_pin, 0); |
138 | gpio_line_set(gpio->sda_pin, 0); | 138 | gpio_line_set(gpio->sda_pin, 0); |
139 | 139 | ||
140 | if ((err = i2c_bit_add_bus(&drv_data->adapter) != 0)) { | 140 | err = i2c_bit_add_bus(&drv_data->adapter); |
141 | if (err) { | ||
141 | printk(KERN_ERR "ERROR: Could not install %s\n", plat_dev->dev.bus_id); | 142 | printk(KERN_ERR "ERROR: Could not install %s\n", plat_dev->dev.bus_id); |
142 | 143 | ||
143 | kfree(drv_data); | 144 | kfree(drv_data); |
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index 81050d3c9b21..c95a6c154165 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c | |||
@@ -272,7 +272,8 @@ static int i2c_pxa_wait_slave(struct pxa_i2c *i2c) | |||
272 | dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n", | 272 | dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n", |
273 | __func__, (long)jiffies, ISR, ICR, IBMR); | 273 | __func__, (long)jiffies, ISR, ICR, IBMR); |
274 | 274 | ||
275 | if ((ISR & (ISR_UB|ISR_IBB|ISR_SAD)) == ISR_SAD || | 275 | if ((ISR & (ISR_UB|ISR_IBB)) == 0 || |
276 | (ISR & ISR_SAD) != 0 || | ||
276 | (ICR & ICR_SCLE) == 0) { | 277 | (ICR & ICR_SCLE) == 0) { |
277 | if (i2c_debug > 1) | 278 | if (i2c_debug > 1) |
278 | dev_dbg(&i2c->adap.dev, "%s: done\n", __func__); | 279 | dev_dbg(&i2c->adap.dev, "%s: done\n", __func__); |
@@ -492,7 +493,10 @@ static void i2c_pxa_slave_txempty(struct pxa_i2c *i2c, u32 isr) | |||
492 | if (isr & ISR_BED) { | 493 | if (isr & ISR_BED) { |
493 | /* what should we do here? */ | 494 | /* what should we do here? */ |
494 | } else { | 495 | } else { |
495 | int ret = i2c->slave->read(i2c->slave->data); | 496 | int ret = 0; |
497 | |||
498 | if (i2c->slave != NULL) | ||
499 | ret = i2c->slave->read(i2c->slave->data); | ||
496 | 500 | ||
497 | IDBR = ret; | 501 | IDBR = ret; |
498 | ICR |= ICR_TB; /* allow next byte */ | 502 | ICR |= ICR_TB; /* allow next byte */ |
diff --git a/drivers/i2c/busses/scx200_acb.c b/drivers/i2c/busses/scx200_acb.c index 32aab0d34ee9..714bae780953 100644 --- a/drivers/i2c/busses/scx200_acb.c +++ b/drivers/i2c/busses/scx200_acb.c | |||
@@ -494,11 +494,12 @@ static __init int scx200_create_pci(const char *text, struct pci_dev *pdev, | |||
494 | iface->pdev = pdev; | 494 | iface->pdev = pdev; |
495 | iface->bar = bar; | 495 | iface->bar = bar; |
496 | 496 | ||
497 | pci_enable_device_bars(iface->pdev, 1 << iface->bar); | 497 | rc = pci_enable_device_bars(iface->pdev, 1 << iface->bar); |
498 | if (rc) | ||
499 | goto errout_free; | ||
498 | 500 | ||
499 | rc = pci_request_region(iface->pdev, iface->bar, iface->adapter.name); | 501 | rc = pci_request_region(iface->pdev, iface->bar, iface->adapter.name); |
500 | 502 | if (rc) { | |
501 | if (rc != 0) { | ||
502 | printk(KERN_ERR NAME ": can't allocate PCI BAR %d\n", | 503 | printk(KERN_ERR NAME ": can't allocate PCI BAR %d\n", |
503 | iface->bar); | 504 | iface->bar); |
504 | goto errout_free; | 505 | goto errout_free; |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index bddfebdf91d8..88214943d00a 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -724,7 +724,7 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret) | |||
724 | * if we have an error, pass back CHECK_CONDITION as the | 724 | * if we have an error, pass back CHECK_CONDITION as the |
725 | * scsi status byte | 725 | * scsi status byte |
726 | */ | 726 | */ |
727 | if (!rq->errors) | 727 | if (blk_pc_request(rq) && !rq->errors) |
728 | rq->errors = SAM_STAT_CHECK_CONDITION; | 728 | rq->errors = SAM_STAT_CHECK_CONDITION; |
729 | 729 | ||
730 | /* Check for tray open. */ | 730 | /* Check for tray open. */ |
diff --git a/drivers/ide/legacy/hd.c b/drivers/ide/legacy/hd.c index b1d5291531b7..45ed03591cd8 100644 --- a/drivers/ide/legacy/hd.c +++ b/drivers/ide/legacy/hd.c | |||
@@ -459,7 +459,7 @@ ok_to_read: | |||
459 | #ifdef DEBUG | 459 | #ifdef DEBUG |
460 | printk("%s: read: sector %ld, remaining = %ld, buffer=%p\n", | 460 | printk("%s: read: sector %ld, remaining = %ld, buffer=%p\n", |
461 | req->rq_disk->disk_name, req->sector, req->nr_sectors, | 461 | req->rq_disk->disk_name, req->sector, req->nr_sectors, |
462 | req->buffer+512)); | 462 | req->buffer+512); |
463 | #endif | 463 | #endif |
464 | if (req->current_nr_sectors <= 0) | 464 | if (req->current_nr_sectors <= 0) |
465 | end_request(req, 1); | 465 | end_request(req, 1); |
diff --git a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c index 2b0ea8b6608d..753fe0e21456 100644 --- a/drivers/ide/pci/amd74xx.c +++ b/drivers/ide/pci/amd74xx.c | |||
@@ -75,6 +75,7 @@ static struct amd_ide_chip { | |||
75 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE, 0x50, AMD_UDMA_133 }, | 75 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE, 0x50, AMD_UDMA_133 }, |
76 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, 0x50, AMD_UDMA_133 }, | 76 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, 0x50, AMD_UDMA_133 }, |
77 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE, 0x50, AMD_UDMA_133 }, | 77 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE, 0x50, AMD_UDMA_133 }, |
78 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE, 0x50, AMD_UDMA_133 }, | ||
78 | { PCI_DEVICE_ID_AMD_CS5536_IDE, 0x40, AMD_UDMA_100 }, | 79 | { PCI_DEVICE_ID_AMD_CS5536_IDE, 0x40, AMD_UDMA_100 }, |
79 | { 0 } | 80 | { 0 } |
80 | }; | 81 | }; |
@@ -491,7 +492,8 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { | |||
491 | /* 16 */ DECLARE_NV_DEV("NFORCE-MCP55"), | 492 | /* 16 */ DECLARE_NV_DEV("NFORCE-MCP55"), |
492 | /* 17 */ DECLARE_NV_DEV("NFORCE-MCP61"), | 493 | /* 17 */ DECLARE_NV_DEV("NFORCE-MCP61"), |
493 | /* 18 */ DECLARE_NV_DEV("NFORCE-MCP65"), | 494 | /* 18 */ DECLARE_NV_DEV("NFORCE-MCP65"), |
494 | /* 19 */ DECLARE_AMD_DEV("AMD5536"), | 495 | /* 19 */ DECLARE_NV_DEV("NFORCE-MCP67"), |
496 | /* 20 */ DECLARE_AMD_DEV("AMD5536"), | ||
495 | }; | 497 | }; |
496 | 498 | ||
497 | static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id) | 499 | static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id) |
@@ -530,7 +532,8 @@ static struct pci_device_id amd74xx_pci_tbl[] = { | |||
530 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16 }, | 532 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16 }, |
531 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17 }, | 533 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17 }, |
532 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18 }, | 534 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18 }, |
533 | { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 19 }, | 535 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 19 }, |
536 | { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 20 }, | ||
534 | { 0, }, | 537 | { 0, }, |
535 | }; | 538 | }; |
536 | MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl); | 539 | MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl); |
diff --git a/drivers/ide/pci/generic.c b/drivers/ide/pci/generic.c index 5b77a5bcbf0c..9f306880491a 100644 --- a/drivers/ide/pci/generic.c +++ b/drivers/ide/pci/generic.c | |||
@@ -40,6 +40,19 @@ | |||
40 | 40 | ||
41 | static int ide_generic_all; /* Set to claim all devices */ | 41 | static int ide_generic_all; /* Set to claim all devices */ |
42 | 42 | ||
43 | /* | ||
44 | * the module_param_named() was added for the modular case | ||
45 | * the __setup() is left as compatibility for existing setups | ||
46 | */ | ||
47 | #ifndef MODULE | ||
48 | static int __init ide_generic_all_on(char *unused) | ||
49 | { | ||
50 | ide_generic_all = 1; | ||
51 | printk(KERN_INFO "IDE generic will claim all unknown PCI IDE storage controllers.\n"); | ||
52 | return 1; | ||
53 | } | ||
54 | __setup("all-generic-ide", ide_generic_all_on); | ||
55 | #endif | ||
43 | module_param_named(all_generic_ide, ide_generic_all, bool, 0444); | 56 | module_param_named(all_generic_ide, ide_generic_all, bool, 0444); |
44 | MODULE_PARM_DESC(all_generic_ide, "IDE generic will claim all unknown PCI IDE storage controllers."); | 57 | MODULE_PARM_DESC(all_generic_ide, "IDE generic will claim all unknown PCI IDE storage controllers."); |
45 | 58 | ||
@@ -234,8 +247,10 @@ static int __devinit generic_init_one(struct pci_dev *dev, const struct pci_devi | |||
234 | (!(PCI_FUNC(dev->devfn) & 1))) | 247 | (!(PCI_FUNC(dev->devfn) & 1))) |
235 | goto out; | 248 | goto out; |
236 | 249 | ||
237 | if (dev->vendor == PCI_VENDOR_ID_JMICRON && PCI_FUNC(dev->devfn) != 1) | 250 | if (dev->vendor == PCI_VENDOR_ID_JMICRON) { |
238 | goto out; | 251 | if (dev->device != PCI_DEVICE_ID_JMICRON_JMB368 && PCI_FUNC(dev->devfn) != 1) |
252 | goto out; | ||
253 | } | ||
239 | 254 | ||
240 | if (dev->vendor != PCI_VENDOR_ID_JMICRON) { | 255 | if (dev->vendor != PCI_VENDOR_ID_JMICRON) { |
241 | pci_read_config_word(dev, PCI_COMMAND, &command); | 256 | pci_read_config_word(dev, PCI_COMMAND, &command); |
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c index 244f7eb7006d..cfad09accf52 100644 --- a/drivers/ide/pci/sgiioc4.c +++ b/drivers/ide/pci/sgiioc4.c | |||
@@ -768,14 +768,7 @@ ioc4_ide_init(void) | |||
768 | return ioc4_register_submodule(&ioc4_ide_submodule); | 768 | return ioc4_register_submodule(&ioc4_ide_submodule); |
769 | } | 769 | } |
770 | 770 | ||
771 | static void __devexit | ||
772 | ioc4_ide_exit(void) | ||
773 | { | ||
774 | ioc4_unregister_submodule(&ioc4_ide_submodule); | ||
775 | } | ||
776 | |||
777 | late_initcall(ioc4_ide_init); /* Call only after IDE init is done */ | 771 | late_initcall(ioc4_ide_init); /* Call only after IDE init is done */ |
778 | module_exit(ioc4_ide_exit); | ||
779 | 772 | ||
780 | MODULE_AUTHOR("Aniket Malatpure/Jeremy Higdon"); | 773 | MODULE_AUTHOR("Aniket Malatpure/Jeremy Higdon"); |
781 | MODULE_DESCRIPTION("IDE PCI driver module for SGI IOC4 Base-IO Card"); | 774 | MODULE_DESCRIPTION("IDE PCI driver module for SGI IOC4 Base-IO Card"); |
diff --git a/drivers/ieee1394/eth1394.c b/drivers/ieee1394/eth1394.c index 8a7b8fab6238..31e5cc49d61a 100644 --- a/drivers/ieee1394/eth1394.c +++ b/drivers/ieee1394/eth1394.c | |||
@@ -64,6 +64,7 @@ | |||
64 | #include <linux/ethtool.h> | 64 | #include <linux/ethtool.h> |
65 | #include <asm/uaccess.h> | 65 | #include <asm/uaccess.h> |
66 | #include <asm/delay.h> | 66 | #include <asm/delay.h> |
67 | #include <asm/unaligned.h> | ||
67 | #include <net/arp.h> | 68 | #include <net/arp.h> |
68 | 69 | ||
69 | #include "config_roms.h" | 70 | #include "config_roms.h" |
@@ -491,7 +492,7 @@ static void ether1394_reset_priv (struct net_device *dev, int set_mtu) | |||
491 | int i; | 492 | int i; |
492 | struct eth1394_priv *priv = netdev_priv(dev); | 493 | struct eth1394_priv *priv = netdev_priv(dev); |
493 | struct hpsb_host *host = priv->host; | 494 | struct hpsb_host *host = priv->host; |
494 | u64 guid = *((u64*)&(host->csr.rom->bus_info_data[3])); | 495 | u64 guid = get_unaligned((u64*)&(host->csr.rom->bus_info_data[3])); |
495 | u16 maxpayload = 1 << (host->csr.max_rec + 1); | 496 | u16 maxpayload = 1 << (host->csr.max_rec + 1); |
496 | int max_speed = IEEE1394_SPEED_MAX; | 497 | int max_speed = IEEE1394_SPEED_MAX; |
497 | 498 | ||
@@ -514,8 +515,8 @@ static void ether1394_reset_priv (struct net_device *dev, int set_mtu) | |||
514 | ETHER1394_GASP_OVERHEAD))); | 515 | ETHER1394_GASP_OVERHEAD))); |
515 | 516 | ||
516 | /* Set our hardware address while we're at it */ | 517 | /* Set our hardware address while we're at it */ |
517 | *(u64*)dev->dev_addr = guid; | 518 | memcpy(dev->dev_addr, &guid, sizeof(u64)); |
518 | *(u64*)dev->broadcast = ~0x0ULL; | 519 | memset(dev->broadcast, 0xff, sizeof(u64)); |
519 | } | 520 | } |
520 | 521 | ||
521 | spin_unlock_irqrestore (&priv->lock, flags); | 522 | spin_unlock_irqrestore (&priv->lock, flags); |
@@ -894,6 +895,7 @@ static inline u16 ether1394_parse_encap(struct sk_buff *skb, | |||
894 | u16 maxpayload; | 895 | u16 maxpayload; |
895 | struct eth1394_node_ref *node; | 896 | struct eth1394_node_ref *node; |
896 | struct eth1394_node_info *node_info; | 897 | struct eth1394_node_info *node_info; |
898 | __be64 guid; | ||
897 | 899 | ||
898 | /* Sanity check. MacOSX seems to be sending us 131 in this | 900 | /* Sanity check. MacOSX seems to be sending us 131 in this |
899 | * field (atleast on my Panther G5). Not sure why. */ | 901 | * field (atleast on my Panther G5). Not sure why. */ |
@@ -902,8 +904,9 @@ static inline u16 ether1394_parse_encap(struct sk_buff *skb, | |||
902 | 904 | ||
903 | maxpayload = min(eth1394_speedto_maxpayload[sspd], (u16)(1 << (max_rec + 1))); | 905 | maxpayload = min(eth1394_speedto_maxpayload[sspd], (u16)(1 << (max_rec + 1))); |
904 | 906 | ||
907 | guid = get_unaligned(&arp1394->s_uniq_id); | ||
905 | node = eth1394_find_node_guid(&priv->ip_node_list, | 908 | node = eth1394_find_node_guid(&priv->ip_node_list, |
906 | be64_to_cpu(arp1394->s_uniq_id)); | 909 | be64_to_cpu(guid)); |
907 | if (!node) { | 910 | if (!node) { |
908 | return 0; | 911 | return 0; |
909 | } | 912 | } |
@@ -931,10 +934,9 @@ static inline u16 ether1394_parse_encap(struct sk_buff *skb, | |||
931 | arp_ptr += arp->ar_pln; /* skip over sender IP addr */ | 934 | arp_ptr += arp->ar_pln; /* skip over sender IP addr */ |
932 | 935 | ||
933 | if (arp->ar_op == htons(ARPOP_REQUEST)) | 936 | if (arp->ar_op == htons(ARPOP_REQUEST)) |
934 | /* just set ARP req target unique ID to 0 */ | 937 | memset(arp_ptr, 0, sizeof(u64)); |
935 | *((u64*)arp_ptr) = 0; | ||
936 | else | 938 | else |
937 | *((u64*)arp_ptr) = *((u64*)dev->dev_addr); | 939 | memcpy(arp_ptr, dev->dev_addr, sizeof(u64)); |
938 | } | 940 | } |
939 | 941 | ||
940 | /* Now add the ethernet header. */ | 942 | /* Now add the ethernet header. */ |
@@ -1675,8 +1677,10 @@ static int ether1394_tx (struct sk_buff *skb, struct net_device *dev) | |||
1675 | if (max_payload < dg_size + hdr_type_len[ETH1394_HDR_LF_UF]) | 1677 | if (max_payload < dg_size + hdr_type_len[ETH1394_HDR_LF_UF]) |
1676 | priv->bc_dgl++; | 1678 | priv->bc_dgl++; |
1677 | } else { | 1679 | } else { |
1680 | __be64 guid = get_unaligned((u64 *)eth->h_dest); | ||
1681 | |||
1678 | node = eth1394_find_node_guid(&priv->ip_node_list, | 1682 | node = eth1394_find_node_guid(&priv->ip_node_list, |
1679 | be64_to_cpu(*(u64*)eth->h_dest)); | 1683 | be64_to_cpu(guid)); |
1680 | if (!node) { | 1684 | if (!node) { |
1681 | ret = -EAGAIN; | 1685 | ret = -EAGAIN; |
1682 | goto fail; | 1686 | goto fail; |
diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index dea13525df88..6e8ea9110c46 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c | |||
@@ -3552,12 +3552,21 @@ static int ohci1394_pci_suspend (struct pci_dev *pdev, pm_message_t state) | |||
3552 | { | 3552 | { |
3553 | int err; | 3553 | int err; |
3554 | 3554 | ||
3555 | printk(KERN_INFO "%s does not fully support suspend and resume yet\n", | ||
3556 | OHCI1394_DRIVER_NAME); | ||
3557 | |||
3555 | err = pci_save_state(pdev); | 3558 | err = pci_save_state(pdev); |
3556 | if (err) | 3559 | if (err) { |
3557 | goto out; | 3560 | printk(KERN_ERR "%s: pci_save_state failed with %d\n", |
3561 | OHCI1394_DRIVER_NAME, err); | ||
3562 | return err; | ||
3563 | } | ||
3558 | err = pci_set_power_state(pdev, pci_choose_state(pdev, state)); | 3564 | err = pci_set_power_state(pdev, pci_choose_state(pdev, state)); |
3565 | #ifdef OHCI1394_DEBUG | ||
3559 | if (err) | 3566 | if (err) |
3560 | goto out; | 3567 | printk(KERN_DEBUG "%s: pci_set_power_state failed with %d\n", |
3568 | OHCI1394_DRIVER_NAME, err); | ||
3569 | #endif /* OHCI1394_DEBUG */ | ||
3561 | 3570 | ||
3562 | /* PowerMac suspend code comes last */ | 3571 | /* PowerMac suspend code comes last */ |
3563 | #ifdef CONFIG_PPC_PMAC | 3572 | #ifdef CONFIG_PPC_PMAC |
@@ -3570,8 +3579,8 @@ static int ohci1394_pci_suspend (struct pci_dev *pdev, pm_message_t state) | |||
3570 | pmac_call_feature(PMAC_FTR_1394_ENABLE, of_node, 0, 0); | 3579 | pmac_call_feature(PMAC_FTR_1394_ENABLE, of_node, 0, 0); |
3571 | } | 3580 | } |
3572 | #endif /* CONFIG_PPC_PMAC */ | 3581 | #endif /* CONFIG_PPC_PMAC */ |
3573 | out: | 3582 | |
3574 | return err; | 3583 | return 0; |
3575 | } | 3584 | } |
3576 | #endif /* CONFIG_PM */ | 3585 | #endif /* CONFIG_PM */ |
3577 | 3586 | ||
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c index 60d3fbdd216c..e11187ecc931 100644 --- a/drivers/infiniband/core/addr.c +++ b/drivers/infiniband/core/addr.c | |||
@@ -47,6 +47,7 @@ struct addr_req { | |||
47 | struct sockaddr src_addr; | 47 | struct sockaddr src_addr; |
48 | struct sockaddr dst_addr; | 48 | struct sockaddr dst_addr; |
49 | struct rdma_dev_addr *addr; | 49 | struct rdma_dev_addr *addr; |
50 | struct rdma_addr_client *client; | ||
50 | void *context; | 51 | void *context; |
51 | void (*callback)(int status, struct sockaddr *src_addr, | 52 | void (*callback)(int status, struct sockaddr *src_addr, |
52 | struct rdma_dev_addr *addr, void *context); | 53 | struct rdma_dev_addr *addr, void *context); |
@@ -61,6 +62,26 @@ static LIST_HEAD(req_list); | |||
61 | static DECLARE_WORK(work, process_req, NULL); | 62 | static DECLARE_WORK(work, process_req, NULL); |
62 | static struct workqueue_struct *addr_wq; | 63 | static struct workqueue_struct *addr_wq; |
63 | 64 | ||
65 | void rdma_addr_register_client(struct rdma_addr_client *client) | ||
66 | { | ||
67 | atomic_set(&client->refcount, 1); | ||
68 | init_completion(&client->comp); | ||
69 | } | ||
70 | EXPORT_SYMBOL(rdma_addr_register_client); | ||
71 | |||
72 | static inline void put_client(struct rdma_addr_client *client) | ||
73 | { | ||
74 | if (atomic_dec_and_test(&client->refcount)) | ||
75 | complete(&client->comp); | ||
76 | } | ||
77 | |||
78 | void rdma_addr_unregister_client(struct rdma_addr_client *client) | ||
79 | { | ||
80 | put_client(client); | ||
81 | wait_for_completion(&client->comp); | ||
82 | } | ||
83 | EXPORT_SYMBOL(rdma_addr_unregister_client); | ||
84 | |||
64 | int rdma_copy_addr(struct rdma_dev_addr *dev_addr, struct net_device *dev, | 85 | int rdma_copy_addr(struct rdma_dev_addr *dev_addr, struct net_device *dev, |
65 | const unsigned char *dst_dev_addr) | 86 | const unsigned char *dst_dev_addr) |
66 | { | 87 | { |
@@ -229,6 +250,7 @@ static void process_req(void *data) | |||
229 | list_del(&req->list); | 250 | list_del(&req->list); |
230 | req->callback(req->status, &req->src_addr, req->addr, | 251 | req->callback(req->status, &req->src_addr, req->addr, |
231 | req->context); | 252 | req->context); |
253 | put_client(req->client); | ||
232 | kfree(req); | 254 | kfree(req); |
233 | } | 255 | } |
234 | } | 256 | } |
@@ -264,7 +286,8 @@ static int addr_resolve_local(struct sockaddr_in *src_in, | |||
264 | return ret; | 286 | return ret; |
265 | } | 287 | } |
266 | 288 | ||
267 | int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr, | 289 | int rdma_resolve_ip(struct rdma_addr_client *client, |
290 | struct sockaddr *src_addr, struct sockaddr *dst_addr, | ||
268 | struct rdma_dev_addr *addr, int timeout_ms, | 291 | struct rdma_dev_addr *addr, int timeout_ms, |
269 | void (*callback)(int status, struct sockaddr *src_addr, | 292 | void (*callback)(int status, struct sockaddr *src_addr, |
270 | struct rdma_dev_addr *addr, void *context), | 293 | struct rdma_dev_addr *addr, void *context), |
@@ -285,6 +308,8 @@ int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr, | |||
285 | req->addr = addr; | 308 | req->addr = addr; |
286 | req->callback = callback; | 309 | req->callback = callback; |
287 | req->context = context; | 310 | req->context = context; |
311 | req->client = client; | ||
312 | atomic_inc(&client->refcount); | ||
288 | 313 | ||
289 | src_in = (struct sockaddr_in *) &req->src_addr; | 314 | src_in = (struct sockaddr_in *) &req->src_addr; |
290 | dst_in = (struct sockaddr_in *) &req->dst_addr; | 315 | dst_in = (struct sockaddr_in *) &req->dst_addr; |
@@ -305,6 +330,7 @@ int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr, | |||
305 | break; | 330 | break; |
306 | default: | 331 | default: |
307 | ret = req->status; | 332 | ret = req->status; |
333 | atomic_dec(&client->refcount); | ||
308 | kfree(req); | 334 | kfree(req); |
309 | break; | 335 | break; |
310 | } | 336 | } |
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 9ae4f3a67c70..845090b0859c 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c | |||
@@ -63,6 +63,7 @@ static struct ib_client cma_client = { | |||
63 | }; | 63 | }; |
64 | 64 | ||
65 | static struct ib_sa_client sa_client; | 65 | static struct ib_sa_client sa_client; |
66 | static struct rdma_addr_client addr_client; | ||
66 | static LIST_HEAD(dev_list); | 67 | static LIST_HEAD(dev_list); |
67 | static LIST_HEAD(listen_any_list); | 68 | static LIST_HEAD(listen_any_list); |
68 | static DEFINE_MUTEX(lock); | 69 | static DEFINE_MUTEX(lock); |
@@ -1625,8 +1626,8 @@ int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr, | |||
1625 | if (cma_any_addr(dst_addr)) | 1626 | if (cma_any_addr(dst_addr)) |
1626 | ret = cma_resolve_loopback(id_priv); | 1627 | ret = cma_resolve_loopback(id_priv); |
1627 | else | 1628 | else |
1628 | ret = rdma_resolve_ip(&id->route.addr.src_addr, dst_addr, | 1629 | ret = rdma_resolve_ip(&addr_client, &id->route.addr.src_addr, |
1629 | &id->route.addr.dev_addr, | 1630 | dst_addr, &id->route.addr.dev_addr, |
1630 | timeout_ms, addr_handler, id_priv); | 1631 | timeout_ms, addr_handler, id_priv); |
1631 | if (ret) | 1632 | if (ret) |
1632 | goto err; | 1633 | goto err; |
@@ -1762,22 +1763,29 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr) | |||
1762 | 1763 | ||
1763 | if (!cma_any_addr(addr)) { | 1764 | if (!cma_any_addr(addr)) { |
1764 | ret = rdma_translate_ip(addr, &id->route.addr.dev_addr); | 1765 | ret = rdma_translate_ip(addr, &id->route.addr.dev_addr); |
1765 | if (!ret) { | ||
1766 | mutex_lock(&lock); | ||
1767 | ret = cma_acquire_dev(id_priv); | ||
1768 | mutex_unlock(&lock); | ||
1769 | } | ||
1770 | if (ret) | 1766 | if (ret) |
1771 | goto err; | 1767 | goto err1; |
1768 | |||
1769 | mutex_lock(&lock); | ||
1770 | ret = cma_acquire_dev(id_priv); | ||
1771 | mutex_unlock(&lock); | ||
1772 | if (ret) | ||
1773 | goto err1; | ||
1772 | } | 1774 | } |
1773 | 1775 | ||
1774 | memcpy(&id->route.addr.src_addr, addr, ip_addr_size(addr)); | 1776 | memcpy(&id->route.addr.src_addr, addr, ip_addr_size(addr)); |
1775 | ret = cma_get_port(id_priv); | 1777 | ret = cma_get_port(id_priv); |
1776 | if (ret) | 1778 | if (ret) |
1777 | goto err; | 1779 | goto err2; |
1778 | 1780 | ||
1779 | return 0; | 1781 | return 0; |
1780 | err: | 1782 | err2: |
1783 | if (!cma_any_addr(addr)) { | ||
1784 | mutex_lock(&lock); | ||
1785 | cma_detach_from_dev(id_priv); | ||
1786 | mutex_unlock(&lock); | ||
1787 | } | ||
1788 | err1: | ||
1781 | cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_IDLE); | 1789 | cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_IDLE); |
1782 | return ret; | 1790 | return ret; |
1783 | } | 1791 | } |
@@ -2210,6 +2218,7 @@ static int cma_init(void) | |||
2210 | return -ENOMEM; | 2218 | return -ENOMEM; |
2211 | 2219 | ||
2212 | ib_sa_register_client(&sa_client); | 2220 | ib_sa_register_client(&sa_client); |
2221 | rdma_addr_register_client(&addr_client); | ||
2213 | 2222 | ||
2214 | ret = ib_register_client(&cma_client); | 2223 | ret = ib_register_client(&cma_client); |
2215 | if (ret) | 2224 | if (ret) |
@@ -2217,6 +2226,7 @@ static int cma_init(void) | |||
2217 | return 0; | 2226 | return 0; |
2218 | 2227 | ||
2219 | err: | 2228 | err: |
2229 | rdma_addr_unregister_client(&addr_client); | ||
2220 | ib_sa_unregister_client(&sa_client); | 2230 | ib_sa_unregister_client(&sa_client); |
2221 | destroy_workqueue(cma_wq); | 2231 | destroy_workqueue(cma_wq); |
2222 | return ret; | 2232 | return ret; |
@@ -2225,6 +2235,7 @@ err: | |||
2225 | static void cma_cleanup(void) | 2235 | static void cma_cleanup(void) |
2226 | { | 2236 | { |
2227 | ib_unregister_client(&cma_client); | 2237 | ib_unregister_client(&cma_client); |
2238 | rdma_addr_unregister_client(&addr_client); | ||
2228 | ib_sa_unregister_client(&sa_client); | 2239 | ib_sa_unregister_client(&sa_client); |
2229 | destroy_workqueue(cma_wq); | 2240 | destroy_workqueue(cma_wq); |
2230 | idr_destroy(&sdp_ps); | 2241 | idr_destroy(&sdp_ps); |
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c index 493f4c65c7a2..a72bcea46ff6 100644 --- a/drivers/infiniband/core/mad.c +++ b/drivers/infiniband/core/mad.c | |||
@@ -1750,7 +1750,7 @@ ib_find_send_mad(struct ib_mad_agent_private *mad_agent_priv, | |||
1750 | */ | 1750 | */ |
1751 | (is_direct(wc->recv_buf.mad->mad_hdr.mgmt_class) || | 1751 | (is_direct(wc->recv_buf.mad->mad_hdr.mgmt_class) || |
1752 | rcv_has_same_gid(mad_agent_priv, wr, wc))) | 1752 | rcv_has_same_gid(mad_agent_priv, wr, wc))) |
1753 | return wr; | 1753 | return (wr->status == IB_WC_SUCCESS) ? wr : NULL; |
1754 | } | 1754 | } |
1755 | 1755 | ||
1756 | /* | 1756 | /* |
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index b72c7f69ca90..743247ec065e 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c | |||
@@ -1214,7 +1214,7 @@ ssize_t ib_uverbs_query_qp(struct ib_uverbs_file *file, | |||
1214 | resp.qp_access_flags = attr->qp_access_flags; | 1214 | resp.qp_access_flags = attr->qp_access_flags; |
1215 | resp.pkey_index = attr->pkey_index; | 1215 | resp.pkey_index = attr->pkey_index; |
1216 | resp.alt_pkey_index = attr->alt_pkey_index; | 1216 | resp.alt_pkey_index = attr->alt_pkey_index; |
1217 | resp.en_sqd_async_notify = attr->en_sqd_async_notify; | 1217 | resp.sq_draining = attr->sq_draining; |
1218 | resp.max_rd_atomic = attr->max_rd_atomic; | 1218 | resp.max_rd_atomic = attr->max_rd_atomic; |
1219 | resp.max_dest_rd_atomic = attr->max_dest_rd_atomic; | 1219 | resp.max_dest_rd_atomic = attr->max_dest_rd_atomic; |
1220 | resp.min_rnr_timer = attr->min_rnr_timer; | 1220 | resp.min_rnr_timer = attr->min_rnr_timer; |
diff --git a/drivers/infiniband/hw/amso1100/c2.c b/drivers/infiniband/hw/amso1100/c2.c index 9e7bd94b958a..27fe242ed435 100644 --- a/drivers/infiniband/hw/amso1100/c2.c +++ b/drivers/infiniband/hw/amso1100/c2.c | |||
@@ -1155,7 +1155,8 @@ static int __devinit c2_probe(struct pci_dev *pcidev, | |||
1155 | goto bail10; | 1155 | goto bail10; |
1156 | } | 1156 | } |
1157 | 1157 | ||
1158 | c2_register_device(c2dev); | 1158 | if (c2_register_device(c2dev)) |
1159 | goto bail10; | ||
1159 | 1160 | ||
1160 | return 0; | 1161 | return 0; |
1161 | 1162 | ||
diff --git a/drivers/infiniband/hw/amso1100/c2_alloc.c b/drivers/infiniband/hw/amso1100/c2_alloc.c index 028a60bbfca9..0315f99e4191 100644 --- a/drivers/infiniband/hw/amso1100/c2_alloc.c +++ b/drivers/infiniband/hw/amso1100/c2_alloc.c | |||
@@ -42,13 +42,14 @@ static int c2_alloc_mqsp_chunk(struct c2_dev *c2dev, gfp_t gfp_mask, | |||
42 | { | 42 | { |
43 | int i; | 43 | int i; |
44 | struct sp_chunk *new_head; | 44 | struct sp_chunk *new_head; |
45 | dma_addr_t dma_addr; | ||
45 | 46 | ||
46 | new_head = (struct sp_chunk *) __get_free_page(gfp_mask); | 47 | new_head = dma_alloc_coherent(&c2dev->pcidev->dev, PAGE_SIZE, |
48 | &dma_addr, gfp_mask); | ||
47 | if (new_head == NULL) | 49 | if (new_head == NULL) |
48 | return -ENOMEM; | 50 | return -ENOMEM; |
49 | 51 | ||
50 | new_head->dma_addr = dma_map_single(c2dev->ibdev.dma_device, new_head, | 52 | new_head->dma_addr = dma_addr; |
51 | PAGE_SIZE, DMA_FROM_DEVICE); | ||
52 | pci_unmap_addr_set(new_head, mapping, new_head->dma_addr); | 53 | pci_unmap_addr_set(new_head, mapping, new_head->dma_addr); |
53 | 54 | ||
54 | new_head->next = NULL; | 55 | new_head->next = NULL; |
@@ -80,10 +81,8 @@ void c2_free_mqsp_pool(struct c2_dev *c2dev, struct sp_chunk *root) | |||
80 | 81 | ||
81 | while (root) { | 82 | while (root) { |
82 | next = root->next; | 83 | next = root->next; |
83 | dma_unmap_single(c2dev->ibdev.dma_device, | 84 | dma_free_coherent(&c2dev->pcidev->dev, PAGE_SIZE, root, |
84 | pci_unmap_addr(root, mapping), PAGE_SIZE, | 85 | pci_unmap_addr(root, mapping)); |
85 | DMA_FROM_DEVICE); | ||
86 | __free_page((struct page *) root); | ||
87 | root = next; | 86 | root = next; |
88 | } | 87 | } |
89 | } | 88 | } |
diff --git a/drivers/infiniband/hw/amso1100/c2_cq.c b/drivers/infiniband/hw/amso1100/c2_cq.c index 9d7bcc5ade93..05c9154d46f4 100644 --- a/drivers/infiniband/hw/amso1100/c2_cq.c +++ b/drivers/infiniband/hw/amso1100/c2_cq.c | |||
@@ -246,20 +246,17 @@ int c2_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify notify) | |||
246 | 246 | ||
247 | static void c2_free_cq_buf(struct c2_dev *c2dev, struct c2_mq *mq) | 247 | static void c2_free_cq_buf(struct c2_dev *c2dev, struct c2_mq *mq) |
248 | { | 248 | { |
249 | 249 | dma_free_coherent(&c2dev->pcidev->dev, mq->q_size * mq->msg_size, | |
250 | dma_unmap_single(c2dev->ibdev.dma_device, pci_unmap_addr(mq, mapping), | 250 | mq->msg_pool.host, pci_unmap_addr(mq, mapping)); |
251 | mq->q_size * mq->msg_size, DMA_FROM_DEVICE); | ||
252 | free_pages((unsigned long) mq->msg_pool.host, | ||
253 | get_order(mq->q_size * mq->msg_size)); | ||
254 | } | 251 | } |
255 | 252 | ||
256 | static int c2_alloc_cq_buf(struct c2_dev *c2dev, struct c2_mq *mq, int q_size, | 253 | static int c2_alloc_cq_buf(struct c2_dev *c2dev, struct c2_mq *mq, int q_size, |
257 | int msg_size) | 254 | int msg_size) |
258 | { | 255 | { |
259 | unsigned long pool_start; | 256 | u8 *pool_start; |
260 | 257 | ||
261 | pool_start = __get_free_pages(GFP_KERNEL, | 258 | pool_start = dma_alloc_coherent(&c2dev->pcidev->dev, q_size * msg_size, |
262 | get_order(q_size * msg_size)); | 259 | &mq->host_dma, GFP_KERNEL); |
263 | if (!pool_start) | 260 | if (!pool_start) |
264 | return -ENOMEM; | 261 | return -ENOMEM; |
265 | 262 | ||
@@ -267,13 +264,10 @@ static int c2_alloc_cq_buf(struct c2_dev *c2dev, struct c2_mq *mq, int q_size, | |||
267 | 0, /* index (currently unknown) */ | 264 | 0, /* index (currently unknown) */ |
268 | q_size, | 265 | q_size, |
269 | msg_size, | 266 | msg_size, |
270 | (u8 *) pool_start, | 267 | pool_start, |
271 | NULL, /* peer (currently unknown) */ | 268 | NULL, /* peer (currently unknown) */ |
272 | C2_MQ_HOST_TARGET); | 269 | C2_MQ_HOST_TARGET); |
273 | 270 | ||
274 | mq->host_dma = dma_map_single(c2dev->ibdev.dma_device, | ||
275 | (void *)pool_start, | ||
276 | q_size * msg_size, DMA_FROM_DEVICE); | ||
277 | pci_unmap_addr_set(mq, mapping, mq->host_dma); | 271 | pci_unmap_addr_set(mq, mapping, mq->host_dma); |
278 | 272 | ||
279 | return 0; | 273 | return 0; |
diff --git a/drivers/infiniband/hw/amso1100/c2_provider.c b/drivers/infiniband/hw/amso1100/c2_provider.c index da98d9f71429..fef972752912 100644 --- a/drivers/infiniband/hw/amso1100/c2_provider.c +++ b/drivers/infiniband/hw/amso1100/c2_provider.c | |||
@@ -757,20 +757,17 @@ static struct net_device *c2_pseudo_netdev_init(struct c2_dev *c2dev) | |||
757 | 757 | ||
758 | int c2_register_device(struct c2_dev *dev) | 758 | int c2_register_device(struct c2_dev *dev) |
759 | { | 759 | { |
760 | int ret; | 760 | int ret = -ENOMEM; |
761 | int i; | 761 | int i; |
762 | 762 | ||
763 | /* Register pseudo network device */ | 763 | /* Register pseudo network device */ |
764 | dev->pseudo_netdev = c2_pseudo_netdev_init(dev); | 764 | dev->pseudo_netdev = c2_pseudo_netdev_init(dev); |
765 | if (dev->pseudo_netdev) { | 765 | if (!dev->pseudo_netdev) |
766 | ret = register_netdev(dev->pseudo_netdev); | 766 | goto out3; |
767 | if (ret) { | 767 | |
768 | printk(KERN_ERR PFX | 768 | ret = register_netdev(dev->pseudo_netdev); |
769 | "Unable to register netdev, ret = %d\n", ret); | 769 | if (ret) |
770 | free_netdev(dev->pseudo_netdev); | 770 | goto out2; |
771 | return ret; | ||
772 | } | ||
773 | } | ||
774 | 771 | ||
775 | pr_debug("%s:%u\n", __FUNCTION__, __LINE__); | 772 | pr_debug("%s:%u\n", __FUNCTION__, __LINE__); |
776 | strlcpy(dev->ibdev.name, "amso%d", IB_DEVICE_NAME_MAX); | 773 | strlcpy(dev->ibdev.name, "amso%d", IB_DEVICE_NAME_MAX); |
@@ -848,21 +845,25 @@ int c2_register_device(struct c2_dev *dev) | |||
848 | 845 | ||
849 | ret = ib_register_device(&dev->ibdev); | 846 | ret = ib_register_device(&dev->ibdev); |
850 | if (ret) | 847 | if (ret) |
851 | return ret; | 848 | goto out1; |
852 | 849 | ||
853 | for (i = 0; i < ARRAY_SIZE(c2_class_attributes); ++i) { | 850 | for (i = 0; i < ARRAY_SIZE(c2_class_attributes); ++i) { |
854 | ret = class_device_create_file(&dev->ibdev.class_dev, | 851 | ret = class_device_create_file(&dev->ibdev.class_dev, |
855 | c2_class_attributes[i]); | 852 | c2_class_attributes[i]); |
856 | if (ret) { | 853 | if (ret) |
857 | unregister_netdev(dev->pseudo_netdev); | 854 | goto out0; |
858 | free_netdev(dev->pseudo_netdev); | ||
859 | ib_unregister_device(&dev->ibdev); | ||
860 | return ret; | ||
861 | } | ||
862 | } | 855 | } |
856 | goto out3; | ||
863 | 857 | ||
864 | pr_debug("%s:%u\n", __FUNCTION__, __LINE__); | 858 | out0: |
865 | return 0; | 859 | ib_unregister_device(&dev->ibdev); |
860 | out1: | ||
861 | unregister_netdev(dev->pseudo_netdev); | ||
862 | out2: | ||
863 | free_netdev(dev->pseudo_netdev); | ||
864 | out3: | ||
865 | pr_debug("%s:%u ret=%d\n", __FUNCTION__, __LINE__, ret); | ||
866 | return ret; | ||
866 | } | 867 | } |
867 | 868 | ||
868 | void c2_unregister_device(struct c2_dev *dev) | 869 | void c2_unregister_device(struct c2_dev *dev) |
diff --git a/drivers/infiniband/hw/amso1100/c2_rnic.c b/drivers/infiniband/hw/amso1100/c2_rnic.c index 30409e179606..623dc95f91df 100644 --- a/drivers/infiniband/hw/amso1100/c2_rnic.c +++ b/drivers/infiniband/hw/amso1100/c2_rnic.c | |||
@@ -157,8 +157,8 @@ static int c2_rnic_query(struct c2_dev *c2dev, struct ib_device_attr *props) | |||
157 | 157 | ||
158 | props->fw_ver = | 158 | props->fw_ver = |
159 | ((u64)be32_to_cpu(reply->fw_ver_major) << 32) | | 159 | ((u64)be32_to_cpu(reply->fw_ver_major) << 32) | |
160 | ((be32_to_cpu(reply->fw_ver_minor) && 0xFFFF) << 16) | | 160 | ((be32_to_cpu(reply->fw_ver_minor) & 0xFFFF) << 16) | |
161 | (be32_to_cpu(reply->fw_ver_patch) && 0xFFFF); | 161 | (be32_to_cpu(reply->fw_ver_patch) & 0xFFFF); |
162 | memcpy(&props->sys_image_guid, c2dev->netdev->dev_addr, 6); | 162 | memcpy(&props->sys_image_guid, c2dev->netdev->dev_addr, 6); |
163 | props->max_mr_size = 0xFFFFFFFF; | 163 | props->max_mr_size = 0xFFFFFFFF; |
164 | props->page_size_cap = ~(C2_MIN_PAGESIZE-1); | 164 | props->page_size_cap = ~(C2_MIN_PAGESIZE-1); |
@@ -517,14 +517,12 @@ int c2_rnic_init(struct c2_dev *c2dev) | |||
517 | /* Initialize the Verbs Reply Queue */ | 517 | /* Initialize the Verbs Reply Queue */ |
518 | qsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q1_QSIZE)); | 518 | qsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q1_QSIZE)); |
519 | msgsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q1_MSGSIZE)); | 519 | msgsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q1_MSGSIZE)); |
520 | q1_pages = kmalloc(qsize * msgsize, GFP_KERNEL); | 520 | q1_pages = dma_alloc_coherent(&c2dev->pcidev->dev, qsize * msgsize, |
521 | &c2dev->rep_vq.host_dma, GFP_KERNEL); | ||
521 | if (!q1_pages) { | 522 | if (!q1_pages) { |
522 | err = -ENOMEM; | 523 | err = -ENOMEM; |
523 | goto bail1; | 524 | goto bail1; |
524 | } | 525 | } |
525 | c2dev->rep_vq.host_dma = dma_map_single(c2dev->ibdev.dma_device, | ||
526 | (void *)q1_pages, qsize * msgsize, | ||
527 | DMA_FROM_DEVICE); | ||
528 | pci_unmap_addr_set(&c2dev->rep_vq, mapping, c2dev->rep_vq.host_dma); | 526 | pci_unmap_addr_set(&c2dev->rep_vq, mapping, c2dev->rep_vq.host_dma); |
529 | pr_debug("%s rep_vq va %p dma %llx\n", __FUNCTION__, q1_pages, | 527 | pr_debug("%s rep_vq va %p dma %llx\n", __FUNCTION__, q1_pages, |
530 | (unsigned long long) c2dev->rep_vq.host_dma); | 528 | (unsigned long long) c2dev->rep_vq.host_dma); |
@@ -540,17 +538,15 @@ int c2_rnic_init(struct c2_dev *c2dev) | |||
540 | /* Initialize the Asynchronus Event Queue */ | 538 | /* Initialize the Asynchronus Event Queue */ |
541 | qsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q2_QSIZE)); | 539 | qsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q2_QSIZE)); |
542 | msgsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q2_MSGSIZE)); | 540 | msgsize = be32_to_cpu(readl(mmio_regs + C2_REGS_Q2_MSGSIZE)); |
543 | q2_pages = kmalloc(qsize * msgsize, GFP_KERNEL); | 541 | q2_pages = dma_alloc_coherent(&c2dev->pcidev->dev, qsize * msgsize, |
542 | &c2dev->aeq.host_dma, GFP_KERNEL); | ||
544 | if (!q2_pages) { | 543 | if (!q2_pages) { |
545 | err = -ENOMEM; | 544 | err = -ENOMEM; |
546 | goto bail2; | 545 | goto bail2; |
547 | } | 546 | } |
548 | c2dev->aeq.host_dma = dma_map_single(c2dev->ibdev.dma_device, | ||
549 | (void *)q2_pages, qsize * msgsize, | ||
550 | DMA_FROM_DEVICE); | ||
551 | pci_unmap_addr_set(&c2dev->aeq, mapping, c2dev->aeq.host_dma); | 547 | pci_unmap_addr_set(&c2dev->aeq, mapping, c2dev->aeq.host_dma); |
552 | pr_debug("%s aeq va %p dma %llx\n", __FUNCTION__, q1_pages, | 548 | pr_debug("%s aeq va %p dma %llx\n", __FUNCTION__, q2_pages, |
553 | (unsigned long long) c2dev->rep_vq.host_dma); | 549 | (unsigned long long) c2dev->aeq.host_dma); |
554 | c2_mq_rep_init(&c2dev->aeq, | 550 | c2_mq_rep_init(&c2dev->aeq, |
555 | 2, | 551 | 2, |
556 | qsize, | 552 | qsize, |
@@ -597,17 +593,13 @@ int c2_rnic_init(struct c2_dev *c2dev) | |||
597 | bail4: | 593 | bail4: |
598 | vq_term(c2dev); | 594 | vq_term(c2dev); |
599 | bail3: | 595 | bail3: |
600 | dma_unmap_single(c2dev->ibdev.dma_device, | 596 | dma_free_coherent(&c2dev->pcidev->dev, |
601 | pci_unmap_addr(&c2dev->aeq, mapping), | 597 | c2dev->aeq.q_size * c2dev->aeq.msg_size, |
602 | c2dev->aeq.q_size * c2dev->aeq.msg_size, | 598 | q2_pages, pci_unmap_addr(&c2dev->aeq, mapping)); |
603 | DMA_FROM_DEVICE); | ||
604 | kfree(q2_pages); | ||
605 | bail2: | 599 | bail2: |
606 | dma_unmap_single(c2dev->ibdev.dma_device, | 600 | dma_free_coherent(&c2dev->pcidev->dev, |
607 | pci_unmap_addr(&c2dev->rep_vq, mapping), | 601 | c2dev->rep_vq.q_size * c2dev->rep_vq.msg_size, |
608 | c2dev->rep_vq.q_size * c2dev->rep_vq.msg_size, | 602 | q1_pages, pci_unmap_addr(&c2dev->rep_vq, mapping)); |
609 | DMA_FROM_DEVICE); | ||
610 | kfree(q1_pages); | ||
611 | bail1: | 603 | bail1: |
612 | c2_free_mqsp_pool(c2dev, c2dev->kern_mqsp_pool); | 604 | c2_free_mqsp_pool(c2dev, c2dev->kern_mqsp_pool); |
613 | bail0: | 605 | bail0: |
@@ -640,19 +632,17 @@ void c2_rnic_term(struct c2_dev *c2dev) | |||
640 | /* Free the verbs request allocator */ | 632 | /* Free the verbs request allocator */ |
641 | vq_term(c2dev); | 633 | vq_term(c2dev); |
642 | 634 | ||
643 | /* Unmap and free the asynchronus event queue */ | 635 | /* Free the asynchronus event queue */ |
644 | dma_unmap_single(c2dev->ibdev.dma_device, | 636 | dma_free_coherent(&c2dev->pcidev->dev, |
645 | pci_unmap_addr(&c2dev->aeq, mapping), | 637 | c2dev->aeq.q_size * c2dev->aeq.msg_size, |
646 | c2dev->aeq.q_size * c2dev->aeq.msg_size, | 638 | c2dev->aeq.msg_pool.host, |
647 | DMA_FROM_DEVICE); | 639 | pci_unmap_addr(&c2dev->aeq, mapping)); |
648 | kfree(c2dev->aeq.msg_pool.host); | 640 | |
649 | 641 | /* Free the verbs reply queue */ | |
650 | /* Unmap and free the verbs reply queue */ | 642 | dma_free_coherent(&c2dev->pcidev->dev, |
651 | dma_unmap_single(c2dev->ibdev.dma_device, | 643 | c2dev->rep_vq.q_size * c2dev->rep_vq.msg_size, |
652 | pci_unmap_addr(&c2dev->rep_vq, mapping), | 644 | c2dev->rep_vq.msg_pool.host, |
653 | c2dev->rep_vq.q_size * c2dev->rep_vq.msg_size, | 645 | pci_unmap_addr(&c2dev->rep_vq, mapping)); |
654 | DMA_FROM_DEVICE); | ||
655 | kfree(c2dev->rep_vq.msg_pool.host); | ||
656 | 646 | ||
657 | /* Free the MQ shared pointer pool */ | 647 | /* Free the MQ shared pointer pool */ |
658 | c2_free_mqsp_pool(c2dev, c2dev->kern_mqsp_pool); | 648 | c2_free_mqsp_pool(c2dev, c2dev->kern_mqsp_pool); |
diff --git a/drivers/infiniband/hw/ehca/Kconfig b/drivers/infiniband/hw/ehca/Kconfig index 922389b64394..727b10d89686 100644 --- a/drivers/infiniband/hw/ehca/Kconfig +++ b/drivers/infiniband/hw/ehca/Kconfig | |||
@@ -10,6 +10,7 @@ config INFINIBAND_EHCA | |||
10 | config INFINIBAND_EHCA_SCALING | 10 | config INFINIBAND_EHCA_SCALING |
11 | bool "Scaling support (EXPERIMENTAL)" | 11 | bool "Scaling support (EXPERIMENTAL)" |
12 | depends on IBMEBUS && INFINIBAND_EHCA && HOTPLUG_CPU && EXPERIMENTAL | 12 | depends on IBMEBUS && INFINIBAND_EHCA && HOTPLUG_CPU && EXPERIMENTAL |
13 | default y | ||
13 | ---help--- | 14 | ---help--- |
14 | eHCA scaling support schedules the CQ callbacks to different CPUs. | 15 | eHCA scaling support schedules the CQ callbacks to different CPUs. |
15 | 16 | ||
diff --git a/drivers/infiniband/hw/ehca/ehca_av.c b/drivers/infiniband/hw/ehca/ehca_av.c index 3bac197f9014..214e2fdddeef 100644 --- a/drivers/infiniband/hw/ehca/ehca_av.c +++ b/drivers/infiniband/hw/ehca/ehca_av.c | |||
@@ -118,8 +118,7 @@ struct ib_ah *ehca_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr) | |||
118 | } | 118 | } |
119 | memcpy(&av->av.grh.word_1, &gid, sizeof(gid)); | 119 | memcpy(&av->av.grh.word_1, &gid, sizeof(gid)); |
120 | } | 120 | } |
121 | /* for the time being we use a hard coded PMTU of 2048 Bytes */ | 121 | av->av.pmtu = EHCA_MAX_MTU; |
122 | av->av.pmtu = 4; | ||
123 | 122 | ||
124 | /* dgid comes in grh.word_3 */ | 123 | /* dgid comes in grh.word_3 */ |
125 | memcpy(&av->av.grh.word_3, &ah_attr->grh.dgid, | 124 | memcpy(&av->av.grh.word_3, &ah_attr->grh.dgid, |
@@ -193,7 +192,7 @@ int ehca_modify_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr) | |||
193 | memcpy(&new_ehca_av.grh.word_1, &gid, sizeof(gid)); | 192 | memcpy(&new_ehca_av.grh.word_1, &gid, sizeof(gid)); |
194 | } | 193 | } |
195 | 194 | ||
196 | new_ehca_av.pmtu = 4; /* see also comment in create_ah() */ | 195 | new_ehca_av.pmtu = EHCA_MAX_MTU; |
197 | 196 | ||
198 | memcpy(&new_ehca_av.grh.word_3, &ah_attr->grh.dgid, | 197 | memcpy(&new_ehca_av.grh.word_3, &ah_attr->grh.dgid, |
199 | sizeof(ah_attr->grh.dgid)); | 198 | sizeof(ah_attr->grh.dgid)); |
diff --git a/drivers/infiniband/hw/ehca/ehca_hca.c b/drivers/infiniband/hw/ehca/ehca_hca.c index 5eae6ac48425..e1b618c5f685 100644 --- a/drivers/infiniband/hw/ehca/ehca_hca.c +++ b/drivers/infiniband/hw/ehca/ehca_hca.c | |||
@@ -40,6 +40,7 @@ | |||
40 | */ | 40 | */ |
41 | 41 | ||
42 | #include "ehca_tools.h" | 42 | #include "ehca_tools.h" |
43 | #include "ehca_iverbs.h" | ||
43 | #include "hcp_if.h" | 44 | #include "hcp_if.h" |
44 | 45 | ||
45 | int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props) | 46 | int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props) |
@@ -49,7 +50,7 @@ int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props) | |||
49 | ib_device); | 50 | ib_device); |
50 | struct hipz_query_hca *rblock; | 51 | struct hipz_query_hca *rblock; |
51 | 52 | ||
52 | rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 53 | rblock = ehca_alloc_fw_ctrlblock(); |
53 | if (!rblock) { | 54 | if (!rblock) { |
54 | ehca_err(&shca->ib_device, "Can't allocate rblock memory."); | 55 | ehca_err(&shca->ib_device, "Can't allocate rblock memory."); |
55 | return -ENOMEM; | 56 | return -ENOMEM; |
@@ -96,7 +97,7 @@ int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props) | |||
96 | = min_t(int, rblock->max_total_mcast_qp_attach, INT_MAX); | 97 | = min_t(int, rblock->max_total_mcast_qp_attach, INT_MAX); |
97 | 98 | ||
98 | query_device1: | 99 | query_device1: |
99 | kfree(rblock); | 100 | ehca_free_fw_ctrlblock(rblock); |
100 | 101 | ||
101 | return ret; | 102 | return ret; |
102 | } | 103 | } |
@@ -109,7 +110,7 @@ int ehca_query_port(struct ib_device *ibdev, | |||
109 | ib_device); | 110 | ib_device); |
110 | struct hipz_query_port *rblock; | 111 | struct hipz_query_port *rblock; |
111 | 112 | ||
112 | rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 113 | rblock = ehca_alloc_fw_ctrlblock(); |
113 | if (!rblock) { | 114 | if (!rblock) { |
114 | ehca_err(&shca->ib_device, "Can't allocate rblock memory."); | 115 | ehca_err(&shca->ib_device, "Can't allocate rblock memory."); |
115 | return -ENOMEM; | 116 | return -ENOMEM; |
@@ -162,7 +163,7 @@ int ehca_query_port(struct ib_device *ibdev, | |||
162 | props->active_speed = 0x1; | 163 | props->active_speed = 0x1; |
163 | 164 | ||
164 | query_port1: | 165 | query_port1: |
165 | kfree(rblock); | 166 | ehca_free_fw_ctrlblock(rblock); |
166 | 167 | ||
167 | return ret; | 168 | return ret; |
168 | } | 169 | } |
@@ -178,7 +179,7 @@ int ehca_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey) | |||
178 | return -EINVAL; | 179 | return -EINVAL; |
179 | } | 180 | } |
180 | 181 | ||
181 | rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 182 | rblock = ehca_alloc_fw_ctrlblock(); |
182 | if (!rblock) { | 183 | if (!rblock) { |
183 | ehca_err(&shca->ib_device, "Can't allocate rblock memory."); | 184 | ehca_err(&shca->ib_device, "Can't allocate rblock memory."); |
184 | return -ENOMEM; | 185 | return -ENOMEM; |
@@ -193,7 +194,7 @@ int ehca_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey) | |||
193 | memcpy(pkey, &rblock->pkey_entries + index, sizeof(u16)); | 194 | memcpy(pkey, &rblock->pkey_entries + index, sizeof(u16)); |
194 | 195 | ||
195 | query_pkey1: | 196 | query_pkey1: |
196 | kfree(rblock); | 197 | ehca_free_fw_ctrlblock(rblock); |
197 | 198 | ||
198 | return ret; | 199 | return ret; |
199 | } | 200 | } |
@@ -211,7 +212,7 @@ int ehca_query_gid(struct ib_device *ibdev, u8 port, | |||
211 | return -EINVAL; | 212 | return -EINVAL; |
212 | } | 213 | } |
213 | 214 | ||
214 | rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 215 | rblock = ehca_alloc_fw_ctrlblock(); |
215 | if (!rblock) { | 216 | if (!rblock) { |
216 | ehca_err(&shca->ib_device, "Can't allocate rblock memory."); | 217 | ehca_err(&shca->ib_device, "Can't allocate rblock memory."); |
217 | return -ENOMEM; | 218 | return -ENOMEM; |
@@ -227,7 +228,7 @@ int ehca_query_gid(struct ib_device *ibdev, u8 port, | |||
227 | memcpy(&gid->raw[8], &rblock->guid_entries[index], sizeof(u64)); | 228 | memcpy(&gid->raw[8], &rblock->guid_entries[index], sizeof(u64)); |
228 | 229 | ||
229 | query_gid1: | 230 | query_gid1: |
230 | kfree(rblock); | 231 | ehca_free_fw_ctrlblock(rblock); |
231 | 232 | ||
232 | return ret; | 233 | return ret; |
233 | } | 234 | } |
diff --git a/drivers/infiniband/hw/ehca/ehca_irq.c b/drivers/infiniband/hw/ehca/ehca_irq.c index 048cc443d1e7..c3ea746e9045 100644 --- a/drivers/infiniband/hw/ehca/ehca_irq.c +++ b/drivers/infiniband/hw/ehca/ehca_irq.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include "ehca_tools.h" | 45 | #include "ehca_tools.h" |
46 | #include "hcp_if.h" | 46 | #include "hcp_if.h" |
47 | #include "hipz_fns.h" | 47 | #include "hipz_fns.h" |
48 | #include "ipz_pt_fn.h" | ||
48 | 49 | ||
49 | #define EQE_COMPLETION_EVENT EHCA_BMASK_IBM(1,1) | 50 | #define EQE_COMPLETION_EVENT EHCA_BMASK_IBM(1,1) |
50 | #define EQE_CQ_QP_NUMBER EHCA_BMASK_IBM(8,31) | 51 | #define EQE_CQ_QP_NUMBER EHCA_BMASK_IBM(8,31) |
@@ -137,38 +138,36 @@ int ehca_error_data(struct ehca_shca *shca, void *data, | |||
137 | u64 *rblock; | 138 | u64 *rblock; |
138 | unsigned long block_count; | 139 | unsigned long block_count; |
139 | 140 | ||
140 | rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 141 | rblock = ehca_alloc_fw_ctrlblock(); |
141 | if (!rblock) { | 142 | if (!rblock) { |
142 | ehca_err(&shca->ib_device, "Cannot allocate rblock memory."); | 143 | ehca_err(&shca->ib_device, "Cannot allocate rblock memory."); |
143 | ret = -ENOMEM; | 144 | ret = -ENOMEM; |
144 | goto error_data1; | 145 | goto error_data1; |
145 | } | 146 | } |
146 | 147 | ||
148 | /* rblock must be 4K aligned and should be 4K large */ | ||
147 | ret = hipz_h_error_data(shca->ipz_hca_handle, | 149 | ret = hipz_h_error_data(shca->ipz_hca_handle, |
148 | resource, | 150 | resource, |
149 | rblock, | 151 | rblock, |
150 | &block_count); | 152 | &block_count); |
151 | 153 | ||
152 | if (ret == H_R_STATE) { | 154 | if (ret == H_R_STATE) |
153 | ehca_err(&shca->ib_device, | 155 | ehca_err(&shca->ib_device, |
154 | "No error data is available: %lx.", resource); | 156 | "No error data is available: %lx.", resource); |
155 | } | ||
156 | else if (ret == H_SUCCESS) { | 157 | else if (ret == H_SUCCESS) { |
157 | int length; | 158 | int length; |
158 | 159 | ||
159 | length = EHCA_BMASK_GET(ERROR_DATA_LENGTH, rblock[0]); | 160 | length = EHCA_BMASK_GET(ERROR_DATA_LENGTH, rblock[0]); |
160 | 161 | ||
161 | if (length > PAGE_SIZE) | 162 | if (length > EHCA_PAGESIZE) |
162 | length = PAGE_SIZE; | 163 | length = EHCA_PAGESIZE; |
163 | 164 | ||
164 | print_error_data(shca, data, rblock, length); | 165 | print_error_data(shca, data, rblock, length); |
165 | } | 166 | } else |
166 | else { | ||
167 | ehca_err(&shca->ib_device, | 167 | ehca_err(&shca->ib_device, |
168 | "Error data could not be fetched: %lx", resource); | 168 | "Error data could not be fetched: %lx", resource); |
169 | } | ||
170 | 169 | ||
171 | kfree(rblock); | 170 | ehca_free_fw_ctrlblock(rblock); |
172 | 171 | ||
173 | error_data1: | 172 | error_data1: |
174 | return ret; | 173 | return ret; |
diff --git a/drivers/infiniband/hw/ehca/ehca_iverbs.h b/drivers/infiniband/hw/ehca/ehca_iverbs.h index 319c39d47f3a..3720e3032cce 100644 --- a/drivers/infiniband/hw/ehca/ehca_iverbs.h +++ b/drivers/infiniband/hw/ehca/ehca_iverbs.h | |||
@@ -179,4 +179,12 @@ int ehca_mmap_register(u64 physical,void **mapped, | |||
179 | 179 | ||
180 | int ehca_munmap(unsigned long addr, size_t len); | 180 | int ehca_munmap(unsigned long addr, size_t len); |
181 | 181 | ||
182 | #ifdef CONFIG_PPC_64K_PAGES | ||
183 | void *ehca_alloc_fw_ctrlblock(void); | ||
184 | void ehca_free_fw_ctrlblock(void *ptr); | ||
185 | #else | ||
186 | #define ehca_alloc_fw_ctrlblock() ((void *) get_zeroed_page(GFP_KERNEL)) | ||
187 | #define ehca_free_fw_ctrlblock(ptr) free_page((unsigned long)(ptr)) | ||
188 | #endif | ||
189 | |||
182 | #endif | 190 | #endif |
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c index 024d511c4b58..01f5aa9cb56d 100644 --- a/drivers/infiniband/hw/ehca/ehca_main.c +++ b/drivers/infiniband/hw/ehca/ehca_main.c | |||
@@ -40,6 +40,9 @@ | |||
40 | * POSSIBILITY OF SUCH DAMAGE. | 40 | * POSSIBILITY OF SUCH DAMAGE. |
41 | */ | 41 | */ |
42 | 42 | ||
43 | #ifdef CONFIG_PPC_64K_PAGES | ||
44 | #include <linux/slab.h> | ||
45 | #endif | ||
43 | #include "ehca_classes.h" | 46 | #include "ehca_classes.h" |
44 | #include "ehca_iverbs.h" | 47 | #include "ehca_iverbs.h" |
45 | #include "ehca_mrmw.h" | 48 | #include "ehca_mrmw.h" |
@@ -49,7 +52,7 @@ | |||
49 | MODULE_LICENSE("Dual BSD/GPL"); | 52 | MODULE_LICENSE("Dual BSD/GPL"); |
50 | MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>"); | 53 | MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>"); |
51 | MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver"); | 54 | MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver"); |
52 | MODULE_VERSION("SVNEHCA_0017"); | 55 | MODULE_VERSION("SVNEHCA_0018"); |
53 | 56 | ||
54 | int ehca_open_aqp1 = 0; | 57 | int ehca_open_aqp1 = 0; |
55 | int ehca_debug_level = 0; | 58 | int ehca_debug_level = 0; |
@@ -94,11 +97,31 @@ spinlock_t ehca_cq_idr_lock; | |||
94 | DEFINE_IDR(ehca_qp_idr); | 97 | DEFINE_IDR(ehca_qp_idr); |
95 | DEFINE_IDR(ehca_cq_idr); | 98 | DEFINE_IDR(ehca_cq_idr); |
96 | 99 | ||
100 | |||
97 | static struct list_head shca_list; /* list of all registered ehcas */ | 101 | static struct list_head shca_list; /* list of all registered ehcas */ |
98 | static spinlock_t shca_list_lock; | 102 | static spinlock_t shca_list_lock; |
99 | 103 | ||
100 | static struct timer_list poll_eqs_timer; | 104 | static struct timer_list poll_eqs_timer; |
101 | 105 | ||
106 | #ifdef CONFIG_PPC_64K_PAGES | ||
107 | static struct kmem_cache *ctblk_cache = NULL; | ||
108 | |||
109 | void *ehca_alloc_fw_ctrlblock(void) | ||
110 | { | ||
111 | void *ret = kmem_cache_zalloc(ctblk_cache, SLAB_KERNEL); | ||
112 | if (!ret) | ||
113 | ehca_gen_err("Out of memory for ctblk"); | ||
114 | return ret; | ||
115 | } | ||
116 | |||
117 | void ehca_free_fw_ctrlblock(void *ptr) | ||
118 | { | ||
119 | if (ptr) | ||
120 | kmem_cache_free(ctblk_cache, ptr); | ||
121 | |||
122 | } | ||
123 | #endif | ||
124 | |||
102 | static int ehca_create_slab_caches(void) | 125 | static int ehca_create_slab_caches(void) |
103 | { | 126 | { |
104 | int ret; | 127 | int ret; |
@@ -133,6 +156,17 @@ static int ehca_create_slab_caches(void) | |||
133 | goto create_slab_caches5; | 156 | goto create_slab_caches5; |
134 | } | 157 | } |
135 | 158 | ||
159 | #ifdef CONFIG_PPC_64K_PAGES | ||
160 | ctblk_cache = kmem_cache_create("ehca_cache_ctblk", | ||
161 | EHCA_PAGESIZE, H_CB_ALIGNMENT, | ||
162 | SLAB_HWCACHE_ALIGN, | ||
163 | NULL, NULL); | ||
164 | if (!ctblk_cache) { | ||
165 | ehca_gen_err("Cannot create ctblk SLAB cache."); | ||
166 | ehca_cleanup_mrmw_cache(); | ||
167 | goto create_slab_caches5; | ||
168 | } | ||
169 | #endif | ||
136 | return 0; | 170 | return 0; |
137 | 171 | ||
138 | create_slab_caches5: | 172 | create_slab_caches5: |
@@ -157,6 +191,10 @@ static void ehca_destroy_slab_caches(void) | |||
157 | ehca_cleanup_qp_cache(); | 191 | ehca_cleanup_qp_cache(); |
158 | ehca_cleanup_cq_cache(); | 192 | ehca_cleanup_cq_cache(); |
159 | ehca_cleanup_pd_cache(); | 193 | ehca_cleanup_pd_cache(); |
194 | #ifdef CONFIG_PPC_64K_PAGES | ||
195 | if (ctblk_cache) | ||
196 | kmem_cache_destroy(ctblk_cache); | ||
197 | #endif | ||
160 | } | 198 | } |
161 | 199 | ||
162 | #define EHCA_HCAAVER EHCA_BMASK_IBM(32,39) | 200 | #define EHCA_HCAAVER EHCA_BMASK_IBM(32,39) |
@@ -168,7 +206,7 @@ int ehca_sense_attributes(struct ehca_shca *shca) | |||
168 | u64 h_ret; | 206 | u64 h_ret; |
169 | struct hipz_query_hca *rblock; | 207 | struct hipz_query_hca *rblock; |
170 | 208 | ||
171 | rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 209 | rblock = ehca_alloc_fw_ctrlblock(); |
172 | if (!rblock) { | 210 | if (!rblock) { |
173 | ehca_gen_err("Cannot allocate rblock memory."); | 211 | ehca_gen_err("Cannot allocate rblock memory."); |
174 | return -ENOMEM; | 212 | return -ENOMEM; |
@@ -211,7 +249,7 @@ int ehca_sense_attributes(struct ehca_shca *shca) | |||
211 | shca->sport[1].rate = IB_RATE_30_GBPS; | 249 | shca->sport[1].rate = IB_RATE_30_GBPS; |
212 | 250 | ||
213 | num_ports1: | 251 | num_ports1: |
214 | kfree(rblock); | 252 | ehca_free_fw_ctrlblock(rblock); |
215 | return ret; | 253 | return ret; |
216 | } | 254 | } |
217 | 255 | ||
@@ -220,7 +258,7 @@ static int init_node_guid(struct ehca_shca *shca) | |||
220 | int ret = 0; | 258 | int ret = 0; |
221 | struct hipz_query_hca *rblock; | 259 | struct hipz_query_hca *rblock; |
222 | 260 | ||
223 | rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 261 | rblock = ehca_alloc_fw_ctrlblock(); |
224 | if (!rblock) { | 262 | if (!rblock) { |
225 | ehca_err(&shca->ib_device, "Can't allocate rblock memory."); | 263 | ehca_err(&shca->ib_device, "Can't allocate rblock memory."); |
226 | return -ENOMEM; | 264 | return -ENOMEM; |
@@ -235,7 +273,7 @@ static int init_node_guid(struct ehca_shca *shca) | |||
235 | memcpy(&shca->ib_device.node_guid, &rblock->node_guid, sizeof(u64)); | 273 | memcpy(&shca->ib_device.node_guid, &rblock->node_guid, sizeof(u64)); |
236 | 274 | ||
237 | init_node_guid1: | 275 | init_node_guid1: |
238 | kfree(rblock); | 276 | ehca_free_fw_ctrlblock(rblock); |
239 | return ret; | 277 | return ret; |
240 | } | 278 | } |
241 | 279 | ||
@@ -431,7 +469,7 @@ static ssize_t ehca_show_##name(struct device *dev, \ | |||
431 | \ | 469 | \ |
432 | shca = dev->driver_data; \ | 470 | shca = dev->driver_data; \ |
433 | \ | 471 | \ |
434 | rblock = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); \ | 472 | rblock = ehca_alloc_fw_ctrlblock(); \ |
435 | if (!rblock) { \ | 473 | if (!rblock) { \ |
436 | dev_err(dev, "Can't allocate rblock memory."); \ | 474 | dev_err(dev, "Can't allocate rblock memory."); \ |
437 | return 0; \ | 475 | return 0; \ |
@@ -439,12 +477,12 @@ static ssize_t ehca_show_##name(struct device *dev, \ | |||
439 | \ | 477 | \ |
440 | if (hipz_h_query_hca(shca->ipz_hca_handle, rblock) != H_SUCCESS) { \ | 478 | if (hipz_h_query_hca(shca->ipz_hca_handle, rblock) != H_SUCCESS) { \ |
441 | dev_err(dev, "Can't query device properties"); \ | 479 | dev_err(dev, "Can't query device properties"); \ |
442 | kfree(rblock); \ | 480 | ehca_free_fw_ctrlblock(rblock); \ |
443 | return 0; \ | 481 | return 0; \ |
444 | } \ | 482 | } \ |
445 | \ | 483 | \ |
446 | data = rblock->name; \ | 484 | data = rblock->name; \ |
447 | kfree(rblock); \ | 485 | ehca_free_fw_ctrlblock(rblock); \ |
448 | \ | 486 | \ |
449 | if ((strcmp(#name, "num_ports") == 0) && (ehca_nr_ports == 1)) \ | 487 | if ((strcmp(#name, "num_ports") == 0) && (ehca_nr_ports == 1)) \ |
450 | return snprintf(buf, 256, "1\n"); \ | 488 | return snprintf(buf, 256, "1\n"); \ |
@@ -752,7 +790,7 @@ int __init ehca_module_init(void) | |||
752 | int ret; | 790 | int ret; |
753 | 791 | ||
754 | printk(KERN_INFO "eHCA Infiniband Device Driver " | 792 | printk(KERN_INFO "eHCA Infiniband Device Driver " |
755 | "(Rel.: SVNEHCA_0017)\n"); | 793 | "(Rel.: SVNEHCA_0018)\n"); |
756 | idr_init(&ehca_qp_idr); | 794 | idr_init(&ehca_qp_idr); |
757 | idr_init(&ehca_cq_idr); | 795 | idr_init(&ehca_cq_idr); |
758 | spin_lock_init(&ehca_qp_idr_lock); | 796 | spin_lock_init(&ehca_qp_idr_lock); |
diff --git a/drivers/infiniband/hw/ehca/ehca_mrmw.c b/drivers/infiniband/hw/ehca/ehca_mrmw.c index 5ca65441e1da..abce676c0ae0 100644 --- a/drivers/infiniband/hw/ehca/ehca_mrmw.c +++ b/drivers/infiniband/hw/ehca/ehca_mrmw.c | |||
@@ -1013,7 +1013,7 @@ int ehca_reg_mr_rpages(struct ehca_shca *shca, | |||
1013 | u32 i; | 1013 | u32 i; |
1014 | u64 *kpage; | 1014 | u64 *kpage; |
1015 | 1015 | ||
1016 | kpage = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 1016 | kpage = ehca_alloc_fw_ctrlblock(); |
1017 | if (!kpage) { | 1017 | if (!kpage) { |
1018 | ehca_err(&shca->ib_device, "kpage alloc failed"); | 1018 | ehca_err(&shca->ib_device, "kpage alloc failed"); |
1019 | ret = -ENOMEM; | 1019 | ret = -ENOMEM; |
@@ -1092,7 +1092,7 @@ int ehca_reg_mr_rpages(struct ehca_shca *shca, | |||
1092 | 1092 | ||
1093 | 1093 | ||
1094 | ehca_reg_mr_rpages_exit1: | 1094 | ehca_reg_mr_rpages_exit1: |
1095 | kfree(kpage); | 1095 | ehca_free_fw_ctrlblock(kpage); |
1096 | ehca_reg_mr_rpages_exit0: | 1096 | ehca_reg_mr_rpages_exit0: |
1097 | if (ret) | 1097 | if (ret) |
1098 | ehca_err(&shca->ib_device, "ret=%x shca=%p e_mr=%p pginfo=%p " | 1098 | ehca_err(&shca->ib_device, "ret=%x shca=%p e_mr=%p pginfo=%p " |
@@ -1124,7 +1124,7 @@ inline int ehca_rereg_mr_rereg1(struct ehca_shca *shca, | |||
1124 | ehca_mrmw_map_acl(acl, &hipz_acl); | 1124 | ehca_mrmw_map_acl(acl, &hipz_acl); |
1125 | ehca_mrmw_set_pgsize_hipz_acl(&hipz_acl); | 1125 | ehca_mrmw_set_pgsize_hipz_acl(&hipz_acl); |
1126 | 1126 | ||
1127 | kpage = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 1127 | kpage = ehca_alloc_fw_ctrlblock(); |
1128 | if (!kpage) { | 1128 | if (!kpage) { |
1129 | ehca_err(&shca->ib_device, "kpage alloc failed"); | 1129 | ehca_err(&shca->ib_device, "kpage alloc failed"); |
1130 | ret = -ENOMEM; | 1130 | ret = -ENOMEM; |
@@ -1181,7 +1181,7 @@ inline int ehca_rereg_mr_rereg1(struct ehca_shca *shca, | |||
1181 | } | 1181 | } |
1182 | 1182 | ||
1183 | ehca_rereg_mr_rereg1_exit1: | 1183 | ehca_rereg_mr_rereg1_exit1: |
1184 | kfree(kpage); | 1184 | ehca_free_fw_ctrlblock(kpage); |
1185 | ehca_rereg_mr_rereg1_exit0: | 1185 | ehca_rereg_mr_rereg1_exit0: |
1186 | if ( ret && (ret != -EAGAIN) ) | 1186 | if ( ret && (ret != -EAGAIN) ) |
1187 | ehca_err(&shca->ib_device, "ret=%x lkey=%x rkey=%x " | 1187 | ehca_err(&shca->ib_device, "ret=%x lkey=%x rkey=%x " |
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c index 4394123cdbd7..cf3e50ee2d06 100644 --- a/drivers/infiniband/hw/ehca/ehca_qp.c +++ b/drivers/infiniband/hw/ehca/ehca_qp.c | |||
@@ -811,8 +811,8 @@ static int internal_modify_qp(struct ib_qp *ibqp, | |||
811 | unsigned long spl_flags = 0; | 811 | unsigned long spl_flags = 0; |
812 | 812 | ||
813 | /* do query_qp to obtain current attr values */ | 813 | /* do query_qp to obtain current attr values */ |
814 | mqpcb = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 814 | mqpcb = ehca_alloc_fw_ctrlblock(); |
815 | if (mqpcb == NULL) { | 815 | if (!mqpcb) { |
816 | ehca_err(ibqp->device, "Could not get zeroed page for mqpcb " | 816 | ehca_err(ibqp->device, "Could not get zeroed page for mqpcb " |
817 | "ehca_qp=%p qp_num=%x ", my_qp, ibqp->qp_num); | 817 | "ehca_qp=%p qp_num=%x ", my_qp, ibqp->qp_num); |
818 | return -ENOMEM; | 818 | return -ENOMEM; |
@@ -1225,7 +1225,7 @@ modify_qp_exit2: | |||
1225 | } | 1225 | } |
1226 | 1226 | ||
1227 | modify_qp_exit1: | 1227 | modify_qp_exit1: |
1228 | kfree(mqpcb); | 1228 | ehca_free_fw_ctrlblock(mqpcb); |
1229 | 1229 | ||
1230 | return ret; | 1230 | return ret; |
1231 | } | 1231 | } |
@@ -1277,7 +1277,7 @@ int ehca_query_qp(struct ib_qp *qp, | |||
1277 | return -EINVAL; | 1277 | return -EINVAL; |
1278 | } | 1278 | } |
1279 | 1279 | ||
1280 | qpcb = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL ); | 1280 | qpcb = ehca_alloc_fw_ctrlblock(); |
1281 | if (!qpcb) { | 1281 | if (!qpcb) { |
1282 | ehca_err(qp->device,"Out of memory for qpcb " | 1282 | ehca_err(qp->device,"Out of memory for qpcb " |
1283 | "ehca_qp=%p qp_num=%x", my_qp, qp->qp_num); | 1283 | "ehca_qp=%p qp_num=%x", my_qp, qp->qp_num); |
@@ -1401,7 +1401,7 @@ int ehca_query_qp(struct ib_qp *qp, | |||
1401 | ehca_dmp(qpcb, 4*70, "qp_num=%x", qp->qp_num); | 1401 | ehca_dmp(qpcb, 4*70, "qp_num=%x", qp->qp_num); |
1402 | 1402 | ||
1403 | query_qp_exit1: | 1403 | query_qp_exit1: |
1404 | kfree(qpcb); | 1404 | ehca_free_fw_ctrlblock(qpcb); |
1405 | 1405 | ||
1406 | return ret; | 1406 | return ret; |
1407 | } | 1407 | } |
diff --git a/drivers/infiniband/hw/ehca/ehca_tools.h b/drivers/infiniband/hw/ehca/ehca_tools.h index 809da3ef706b..973c4b591545 100644 --- a/drivers/infiniband/hw/ehca/ehca_tools.h +++ b/drivers/infiniband/hw/ehca/ehca_tools.h | |||
@@ -63,6 +63,7 @@ | |||
63 | #include <asm/ibmebus.h> | 63 | #include <asm/ibmebus.h> |
64 | #include <asm/io.h> | 64 | #include <asm/io.h> |
65 | #include <asm/pgtable.h> | 65 | #include <asm/pgtable.h> |
66 | #include <asm/hvcall.h> | ||
66 | 67 | ||
67 | extern int ehca_debug_level; | 68 | extern int ehca_debug_level; |
68 | 69 | ||
diff --git a/drivers/infiniband/hw/ehca/hipz_hw.h b/drivers/infiniband/hw/ehca/hipz_hw.h index 3fc92b031c50..fad91368dc5a 100644 --- a/drivers/infiniband/hw/ehca/hipz_hw.h +++ b/drivers/infiniband/hw/ehca/hipz_hw.h | |||
@@ -45,6 +45,8 @@ | |||
45 | 45 | ||
46 | #include "ehca_tools.h" | 46 | #include "ehca_tools.h" |
47 | 47 | ||
48 | #define EHCA_MAX_MTU 4 | ||
49 | |||
48 | /* QP Table Entry Memory Map */ | 50 | /* QP Table Entry Memory Map */ |
49 | struct hipz_qptemm { | 51 | struct hipz_qptemm { |
50 | u64 qpx_hcr; | 52 | u64 qpx_hcr; |
diff --git a/drivers/infiniband/hw/ipath/Kconfig b/drivers/infiniband/hw/ipath/Kconfig index 574a678e7fdd..90c14543677d 100644 --- a/drivers/infiniband/hw/ipath/Kconfig +++ b/drivers/infiniband/hw/ipath/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config INFINIBAND_IPATH | 1 | config INFINIBAND_IPATH |
2 | tristate "QLogic InfiniPath Driver" | 2 | tristate "QLogic InfiniPath Driver" |
3 | depends on PCI_MSI && 64BIT && INFINIBAND | 3 | depends on (PCI_MSI || HT_IRQ) && 64BIT && INFINIBAND && NET |
4 | ---help--- | 4 | ---help--- |
5 | This is a driver for QLogic InfiniPath host channel adapters, | 5 | This is a driver for QLogic InfiniPath host channel adapters, |
6 | including InfiniBand verbs support. This driver allows these | 6 | including InfiniBand verbs support. This driver allows these |
diff --git a/drivers/infiniband/hw/ipath/Makefile b/drivers/infiniband/hw/ipath/Makefile index 5e29cb0095e5..7dc10551cf18 100644 --- a/drivers/infiniband/hw/ipath/Makefile +++ b/drivers/infiniband/hw/ipath/Makefile | |||
@@ -10,8 +10,6 @@ ib_ipath-y := \ | |||
10 | ipath_eeprom.o \ | 10 | ipath_eeprom.o \ |
11 | ipath_file_ops.o \ | 11 | ipath_file_ops.o \ |
12 | ipath_fs.o \ | 12 | ipath_fs.o \ |
13 | ipath_iba6110.o \ | ||
14 | ipath_iba6120.o \ | ||
15 | ipath_init_chip.o \ | 13 | ipath_init_chip.o \ |
16 | ipath_intr.o \ | 14 | ipath_intr.o \ |
17 | ipath_keys.o \ | 15 | ipath_keys.o \ |
@@ -31,5 +29,8 @@ ib_ipath-y := \ | |||
31 | ipath_verbs_mcast.o \ | 29 | ipath_verbs_mcast.o \ |
32 | ipath_verbs.o | 30 | ipath_verbs.o |
33 | 31 | ||
32 | ib_ipath-$(CONFIG_HT_IRQ) += ipath_iba6110.o | ||
33 | ib_ipath-$(CONFIG_PCI_MSI) += ipath_iba6120.o | ||
34 | |||
34 | ib_ipath-$(CONFIG_X86_64) += ipath_wc_x86_64.o | 35 | ib_ipath-$(CONFIG_X86_64) += ipath_wc_x86_64.o |
35 | ib_ipath-$(CONFIG_PPC64) += ipath_wc_ppc64.o | 36 | ib_ipath-$(CONFIG_PPC64) += ipath_wc_ppc64.o |
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c index b4ffaa7bcbb7..1aeddb48e355 100644 --- a/drivers/infiniband/hw/ipath/ipath_driver.c +++ b/drivers/infiniband/hw/ipath/ipath_driver.c | |||
@@ -304,7 +304,7 @@ static int __devinit ipath_init_one(struct pci_dev *pdev, | |||
304 | } | 304 | } |
305 | addr = pci_resource_start(pdev, 0); | 305 | addr = pci_resource_start(pdev, 0); |
306 | len = pci_resource_len(pdev, 0); | 306 | len = pci_resource_len(pdev, 0); |
307 | ipath_cdbg(VERBOSE, "regbase (0) %llx len %d irq %x, vend %x/%x " | 307 | ipath_cdbg(VERBOSE, "regbase (0) %llx len %d pdev->irq %d, vend %x/%x " |
308 | "driver_data %lx\n", addr, len, pdev->irq, ent->vendor, | 308 | "driver_data %lx\n", addr, len, pdev->irq, ent->vendor, |
309 | ent->device, ent->driver_data); | 309 | ent->device, ent->driver_data); |
310 | 310 | ||
@@ -390,12 +390,16 @@ static int __devinit ipath_init_one(struct pci_dev *pdev, | |||
390 | 390 | ||
391 | /* setup the chip-specific functions, as early as possible. */ | 391 | /* setup the chip-specific functions, as early as possible. */ |
392 | switch (ent->device) { | 392 | switch (ent->device) { |
393 | #ifdef CONFIG_HT_IRQ | ||
393 | case PCI_DEVICE_ID_INFINIPATH_HT: | 394 | case PCI_DEVICE_ID_INFINIPATH_HT: |
394 | ipath_init_iba6110_funcs(dd); | 395 | ipath_init_iba6110_funcs(dd); |
395 | break; | 396 | break; |
397 | #endif | ||
398 | #ifdef CONFIG_PCI_MSI | ||
396 | case PCI_DEVICE_ID_INFINIPATH_PE800: | 399 | case PCI_DEVICE_ID_INFINIPATH_PE800: |
397 | ipath_init_iba6120_funcs(dd); | 400 | ipath_init_iba6120_funcs(dd); |
398 | break; | 401 | break; |
402 | #endif | ||
399 | default: | 403 | default: |
400 | ipath_dev_err(dd, "Found unknown QLogic deviceid 0x%x, " | 404 | ipath_dev_err(dd, "Found unknown QLogic deviceid 0x%x, " |
401 | "failing\n", ent->device); | 405 | "failing\n", ent->device); |
@@ -467,15 +471,15 @@ static int __devinit ipath_init_one(struct pci_dev *pdev, | |||
467 | * check 0 irq after we return from chip-specific bus setup, since | 471 | * check 0 irq after we return from chip-specific bus setup, since |
468 | * that can affect this due to setup | 472 | * that can affect this due to setup |
469 | */ | 473 | */ |
470 | if (!pdev->irq) | 474 | if (!dd->ipath_irq) |
471 | ipath_dev_err(dd, "irq is 0, BIOS error? Interrupts won't " | 475 | ipath_dev_err(dd, "irq is 0, BIOS error? Interrupts won't " |
472 | "work\n"); | 476 | "work\n"); |
473 | else { | 477 | else { |
474 | ret = request_irq(pdev->irq, ipath_intr, IRQF_SHARED, | 478 | ret = request_irq(dd->ipath_irq, ipath_intr, IRQF_SHARED, |
475 | IPATH_DRV_NAME, dd); | 479 | IPATH_DRV_NAME, dd); |
476 | if (ret) { | 480 | if (ret) { |
477 | ipath_dev_err(dd, "Couldn't setup irq handler, " | 481 | ipath_dev_err(dd, "Couldn't setup irq handler, " |
478 | "irq=%u: %d\n", pdev->irq, ret); | 482 | "irq=%d: %d\n", dd->ipath_irq, ret); |
479 | goto bail_iounmap; | 483 | goto bail_iounmap; |
480 | } | 484 | } |
481 | } | 485 | } |
@@ -637,11 +641,10 @@ static void __devexit ipath_remove_one(struct pci_dev *pdev) | |||
637 | * free up port 0 (kernel) rcvhdr, egr bufs, and eventually tid bufs | 641 | * free up port 0 (kernel) rcvhdr, egr bufs, and eventually tid bufs |
638 | * for all versions of the driver, if they were allocated | 642 | * for all versions of the driver, if they were allocated |
639 | */ | 643 | */ |
640 | if (pdev->irq) { | 644 | if (dd->ipath_irq) { |
641 | ipath_cdbg(VERBOSE, | 645 | ipath_cdbg(VERBOSE, "unit %u free irq %d\n", |
642 | "unit %u free_irq of irq %x\n", | 646 | dd->ipath_unit, dd->ipath_irq); |
643 | dd->ipath_unit, pdev->irq); | 647 | dd->ipath_f_free_irq(dd); |
644 | free_irq(pdev->irq, dd); | ||
645 | } else | 648 | } else |
646 | ipath_dbg("irq is 0, not doing free_irq " | 649 | ipath_dbg("irq is 0, not doing free_irq " |
647 | "for unit %u\n", dd->ipath_unit); | 650 | "for unit %u\n", dd->ipath_unit); |
diff --git a/drivers/infiniband/hw/ipath/ipath_iba6110.c b/drivers/infiniband/hw/ipath/ipath_iba6110.c index 9e4e8d4c6e20..e57c7a351cb5 100644 --- a/drivers/infiniband/hw/ipath/ipath_iba6110.c +++ b/drivers/infiniband/hw/ipath/ipath_iba6110.c | |||
@@ -38,6 +38,7 @@ | |||
38 | 38 | ||
39 | #include <linux/pci.h> | 39 | #include <linux/pci.h> |
40 | #include <linux/delay.h> | 40 | #include <linux/delay.h> |
41 | #include <linux/htirq.h> | ||
41 | 42 | ||
42 | #include "ipath_kernel.h" | 43 | #include "ipath_kernel.h" |
43 | #include "ipath_registers.h" | 44 | #include "ipath_registers.h" |
@@ -913,49 +914,40 @@ static void slave_or_pri_blk(struct ipath_devdata *dd, struct pci_dev *pdev, | |||
913 | } | 914 | } |
914 | } | 915 | } |
915 | 916 | ||
916 | static int set_int_handler(struct ipath_devdata *dd, struct pci_dev *pdev, | 917 | static int ipath_ht_intconfig(struct ipath_devdata *dd) |
917 | int pos) | ||
918 | { | 918 | { |
919 | u32 int_handler_addr_lower; | 919 | int ret; |
920 | u32 int_handler_addr_upper; | ||
921 | u64 ihandler; | ||
922 | u32 intvec; | ||
923 | 920 | ||
924 | /* use indirection register to get the intr handler */ | 921 | if (dd->ipath_intconfig) { |
925 | pci_write_config_byte(pdev, pos + HT_INTR_REG_INDEX, 0x10); | 922 | ipath_write_kreg(dd, dd->ipath_kregs->kr_interruptconfig, |
926 | pci_read_config_dword(pdev, pos + 4, &int_handler_addr_lower); | 923 | dd->ipath_intconfig); /* interrupt address */ |
927 | pci_write_config_byte(pdev, pos + HT_INTR_REG_INDEX, 0x11); | 924 | ret = 0; |
928 | pci_read_config_dword(pdev, pos + 4, &int_handler_addr_upper); | 925 | } else { |
926 | ipath_dev_err(dd, "No interrupts enabled, couldn't setup " | ||
927 | "interrupt address\n"); | ||
928 | ret = -EINVAL; | ||
929 | } | ||
929 | 930 | ||
930 | ihandler = (u64) int_handler_addr_lower | | 931 | return ret; |
931 | ((u64) int_handler_addr_upper << 32); | 932 | } |
933 | |||
934 | static void ipath_ht_irq_update(struct pci_dev *dev, int irq, | ||
935 | struct ht_irq_msg *msg) | ||
936 | { | ||
937 | struct ipath_devdata *dd = pci_get_drvdata(dev); | ||
938 | u64 prev_intconfig = dd->ipath_intconfig; | ||
939 | |||
940 | dd->ipath_intconfig = msg->address_lo; | ||
941 | dd->ipath_intconfig |= ((u64) msg->address_hi) << 32; | ||
932 | 942 | ||
933 | /* | 943 | /* |
934 | * kernels with CONFIG_PCI_MSI set the vector in the irq field of | 944 | * If the previous value of dd->ipath_intconfig is zero, we're |
935 | * struct pci_device, so we use that to program the internal | 945 | * getting configured for the first time, and must not program the |
936 | * interrupt register (not config space) with that value. The BIOS | 946 | * intconfig register here (it will be programmed later, when the |
937 | * must still have done the basic MSI setup. | 947 | * hardware is ready). Otherwise, we should. |
938 | */ | ||
939 | intvec = pdev->irq; | ||
940 | /* | ||
941 | * clear any vector bits there; normally not set but we'll overload | ||
942 | * this for some debug purposes (setting the HTC debug register | ||
943 | * value from software, rather than GPIOs), so it might be set on a | ||
944 | * driver reload. | ||
945 | */ | 948 | */ |
946 | ihandler &= ~0xff0000; | 949 | if (prev_intconfig) |
947 | /* x86 vector goes in intrinfo[23:16] */ | 950 | ipath_ht_intconfig(dd); |
948 | ihandler |= intvec << 16; | ||
949 | ipath_cdbg(VERBOSE, "ihandler lower %x, upper %x, intvec %x, " | ||
950 | "interruptconfig %llx\n", int_handler_addr_lower, | ||
951 | int_handler_addr_upper, intvec, | ||
952 | (unsigned long long) ihandler); | ||
953 | |||
954 | /* can't program yet, so save for interrupt setup */ | ||
955 | dd->ipath_intconfig = ihandler; | ||
956 | /* keep going, so we find link control stuff also */ | ||
957 | |||
958 | return ihandler != 0; | ||
959 | } | 951 | } |
960 | 952 | ||
961 | /** | 953 | /** |
@@ -971,12 +963,19 @@ static int set_int_handler(struct ipath_devdata *dd, struct pci_dev *pdev, | |||
971 | static int ipath_setup_ht_config(struct ipath_devdata *dd, | 963 | static int ipath_setup_ht_config(struct ipath_devdata *dd, |
972 | struct pci_dev *pdev) | 964 | struct pci_dev *pdev) |
973 | { | 965 | { |
974 | int pos, ret = 0; | 966 | int pos, ret; |
975 | int ihandler = 0; | 967 | |
968 | ret = __ht_create_irq(pdev, 0, ipath_ht_irq_update); | ||
969 | if (ret < 0) { | ||
970 | ipath_dev_err(dd, "Couldn't create interrupt handler: " | ||
971 | "err %d\n", ret); | ||
972 | goto bail; | ||
973 | } | ||
974 | dd->ipath_irq = ret; | ||
975 | ret = 0; | ||
976 | 976 | ||
977 | /* | 977 | /* |
978 | * Read the capability info to find the interrupt info, and also | 978 | * Handle clearing CRC errors in linkctrl register if necessary. We |
979 | * handle clearing CRC errors in linkctrl register if necessary. We | ||
980 | * do this early, before we ever enable errors or hardware errors, | 979 | * do this early, before we ever enable errors or hardware errors, |
981 | * mostly to avoid causing the chip to enter freeze mode. | 980 | * mostly to avoid causing the chip to enter freeze mode. |
982 | */ | 981 | */ |
@@ -1000,17 +999,9 @@ static int ipath_setup_ht_config(struct ipath_devdata *dd, | |||
1000 | } | 999 | } |
1001 | if (!(cap_type & 0xE0)) | 1000 | if (!(cap_type & 0xE0)) |
1002 | slave_or_pri_blk(dd, pdev, pos, cap_type); | 1001 | slave_or_pri_blk(dd, pdev, pos, cap_type); |
1003 | else if (cap_type == HT_INTR_DISC_CONFIG) | ||
1004 | ihandler = set_int_handler(dd, pdev, pos); | ||
1005 | } while ((pos = pci_find_next_capability(pdev, pos, | 1002 | } while ((pos = pci_find_next_capability(pdev, pos, |
1006 | PCI_CAP_ID_HT))); | 1003 | PCI_CAP_ID_HT))); |
1007 | 1004 | ||
1008 | if (!ihandler) { | ||
1009 | ipath_dev_err(dd, "Couldn't find interrupt handler in " | ||
1010 | "config space\n"); | ||
1011 | ret = -ENODEV; | ||
1012 | } | ||
1013 | |||
1014 | bail: | 1005 | bail: |
1015 | return ret; | 1006 | return ret; |
1016 | } | 1007 | } |
@@ -1360,25 +1351,6 @@ static void ipath_ht_quiet_serdes(struct ipath_devdata *dd) | |||
1360 | ipath_write_kreg(dd, dd->ipath_kregs->kr_serdesconfig0, val); | 1351 | ipath_write_kreg(dd, dd->ipath_kregs->kr_serdesconfig0, val); |
1361 | } | 1352 | } |
1362 | 1353 | ||
1363 | static int ipath_ht_intconfig(struct ipath_devdata *dd) | ||
1364 | { | ||
1365 | int ret; | ||
1366 | |||
1367 | if (!dd->ipath_intconfig) { | ||
1368 | ipath_dev_err(dd, "No interrupts enabled, couldn't setup " | ||
1369 | "interrupt address\n"); | ||
1370 | ret = 1; | ||
1371 | goto bail; | ||
1372 | } | ||
1373 | |||
1374 | ipath_write_kreg(dd, dd->ipath_kregs->kr_interruptconfig, | ||
1375 | dd->ipath_intconfig); /* interrupt address */ | ||
1376 | ret = 0; | ||
1377 | |||
1378 | bail: | ||
1379 | return ret; | ||
1380 | } | ||
1381 | |||
1382 | /** | 1354 | /** |
1383 | * ipath_pe_put_tid - write a TID in chip | 1355 | * ipath_pe_put_tid - write a TID in chip |
1384 | * @dd: the infinipath device | 1356 | * @dd: the infinipath device |
@@ -1575,6 +1547,14 @@ static int ipath_ht_get_base_info(struct ipath_portdata *pd, void *kbase) | |||
1575 | return 0; | 1547 | return 0; |
1576 | } | 1548 | } |
1577 | 1549 | ||
1550 | static void ipath_ht_free_irq(struct ipath_devdata *dd) | ||
1551 | { | ||
1552 | free_irq(dd->ipath_irq, dd); | ||
1553 | ht_destroy_irq(dd->ipath_irq); | ||
1554 | dd->ipath_irq = 0; | ||
1555 | dd->ipath_intconfig = 0; | ||
1556 | } | ||
1557 | |||
1578 | /** | 1558 | /** |
1579 | * ipath_init_iba6110_funcs - set up the chip-specific function pointers | 1559 | * ipath_init_iba6110_funcs - set up the chip-specific function pointers |
1580 | * @dd: the infinipath device | 1560 | * @dd: the infinipath device |
@@ -1598,6 +1578,7 @@ void ipath_init_iba6110_funcs(struct ipath_devdata *dd) | |||
1598 | dd->ipath_f_cleanup = ipath_setup_ht_cleanup; | 1578 | dd->ipath_f_cleanup = ipath_setup_ht_cleanup; |
1599 | dd->ipath_f_setextled = ipath_setup_ht_setextled; | 1579 | dd->ipath_f_setextled = ipath_setup_ht_setextled; |
1600 | dd->ipath_f_get_base_info = ipath_ht_get_base_info; | 1580 | dd->ipath_f_get_base_info = ipath_ht_get_base_info; |
1581 | dd->ipath_f_free_irq = ipath_ht_free_irq; | ||
1601 | 1582 | ||
1602 | /* | 1583 | /* |
1603 | * initialize chip-specific variables | 1584 | * initialize chip-specific variables |
diff --git a/drivers/infiniband/hw/ipath/ipath_iba6120.c b/drivers/infiniband/hw/ipath/ipath_iba6120.c index a72ab9de386a..6af89683f710 100644 --- a/drivers/infiniband/hw/ipath/ipath_iba6120.c +++ b/drivers/infiniband/hw/ipath/ipath_iba6120.c | |||
@@ -851,6 +851,7 @@ static int ipath_setup_pe_config(struct ipath_devdata *dd, | |||
851 | int pos, ret; | 851 | int pos, ret; |
852 | 852 | ||
853 | dd->ipath_msi_lo = 0; /* used as a flag during reset processing */ | 853 | dd->ipath_msi_lo = 0; /* used as a flag during reset processing */ |
854 | dd->ipath_irq = pdev->irq; | ||
854 | ret = pci_enable_msi(dd->pcidev); | 855 | ret = pci_enable_msi(dd->pcidev); |
855 | if (ret) | 856 | if (ret) |
856 | ipath_dev_err(dd, "pci_enable_msi failed: %d, " | 857 | ipath_dev_err(dd, "pci_enable_msi failed: %d, " |
@@ -1323,6 +1324,12 @@ done: | |||
1323 | return 0; | 1324 | return 0; |
1324 | } | 1325 | } |
1325 | 1326 | ||
1327 | static void ipath_pe_free_irq(struct ipath_devdata *dd) | ||
1328 | { | ||
1329 | free_irq(dd->ipath_irq, dd); | ||
1330 | dd->ipath_irq = 0; | ||
1331 | } | ||
1332 | |||
1326 | /** | 1333 | /** |
1327 | * ipath_init_iba6120_funcs - set up the chip-specific function pointers | 1334 | * ipath_init_iba6120_funcs - set up the chip-specific function pointers |
1328 | * @dd: the infinipath device | 1335 | * @dd: the infinipath device |
@@ -1349,6 +1356,7 @@ void ipath_init_iba6120_funcs(struct ipath_devdata *dd) | |||
1349 | dd->ipath_f_cleanup = ipath_setup_pe_cleanup; | 1356 | dd->ipath_f_cleanup = ipath_setup_pe_cleanup; |
1350 | dd->ipath_f_setextled = ipath_setup_pe_setextled; | 1357 | dd->ipath_f_setextled = ipath_setup_pe_setextled; |
1351 | dd->ipath_f_get_base_info = ipath_pe_get_base_info; | 1358 | dd->ipath_f_get_base_info = ipath_pe_get_base_info; |
1359 | dd->ipath_f_free_irq = ipath_pe_free_irq; | ||
1352 | 1360 | ||
1353 | /* initialize chip-specific variables */ | 1361 | /* initialize chip-specific variables */ |
1354 | dd->ipath_f_tidtemplate = ipath_pe_tidtemplate; | 1362 | dd->ipath_f_tidtemplate = ipath_pe_tidtemplate; |
diff --git a/drivers/infiniband/hw/ipath/ipath_intr.c b/drivers/infiniband/hw/ipath/ipath_intr.c index d9079ee12030..5652a550d442 100644 --- a/drivers/infiniband/hw/ipath/ipath_intr.c +++ b/drivers/infiniband/hw/ipath/ipath_intr.c | |||
@@ -710,14 +710,14 @@ static void ipath_bad_intr(struct ipath_devdata *dd, u32 * unexpectp) | |||
710 | * linuxbios development work, and it may happen in | 710 | * linuxbios development work, and it may happen in |
711 | * the future again. | 711 | * the future again. |
712 | */ | 712 | */ |
713 | if (dd->pcidev && dd->pcidev->irq) { | 713 | if (dd->pcidev && dd->ipath_irq) { |
714 | ipath_dev_err(dd, "Now %u unexpected " | 714 | ipath_dev_err(dd, "Now %u unexpected " |
715 | "interrupts, unregistering " | 715 | "interrupts, unregistering " |
716 | "interrupt handler\n", | 716 | "interrupt handler\n", |
717 | *unexpectp); | 717 | *unexpectp); |
718 | ipath_dbg("free_irq of irq %x\n", | 718 | ipath_dbg("free_irq of irq %d\n", |
719 | dd->pcidev->irq); | 719 | dd->ipath_irq); |
720 | free_irq(dd->pcidev->irq, dd); | 720 | dd->ipath_f_free_irq(dd); |
721 | } | 721 | } |
722 | } | 722 | } |
723 | if (ipath_read_kreg32(dd, dd->ipath_kregs->kr_intmask)) { | 723 | if (ipath_read_kreg32(dd, dd->ipath_kregs->kr_intmask)) { |
@@ -753,7 +753,7 @@ static void ipath_bad_regread(struct ipath_devdata *dd) | |||
753 | if (allbits == 2) { | 753 | if (allbits == 2) { |
754 | ipath_dev_err(dd, "Still bad interrupt status, " | 754 | ipath_dev_err(dd, "Still bad interrupt status, " |
755 | "unregistering interrupt\n"); | 755 | "unregistering interrupt\n"); |
756 | free_irq(dd->pcidev->irq, dd); | 756 | dd->ipath_f_free_irq(dd); |
757 | } else if (allbits > 2) { | 757 | } else if (allbits > 2) { |
758 | if ((allbits % 10000) == 0) | 758 | if ((allbits % 10000) == 0) |
759 | printk("."); | 759 | printk("."); |
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h index 06d5020a2f60..986b2125b8f5 100644 --- a/drivers/infiniband/hw/ipath/ipath_kernel.h +++ b/drivers/infiniband/hw/ipath/ipath_kernel.h | |||
@@ -213,6 +213,8 @@ struct ipath_devdata { | |||
213 | void (*ipath_f_setextled)(struct ipath_devdata *, u64, u64); | 213 | void (*ipath_f_setextled)(struct ipath_devdata *, u64, u64); |
214 | /* fill out chip-specific fields */ | 214 | /* fill out chip-specific fields */ |
215 | int (*ipath_f_get_base_info)(struct ipath_portdata *, void *); | 215 | int (*ipath_f_get_base_info)(struct ipath_portdata *, void *); |
216 | /* free irq */ | ||
217 | void (*ipath_f_free_irq)(struct ipath_devdata *); | ||
216 | struct ipath_ibdev *verbs_dev; | 218 | struct ipath_ibdev *verbs_dev; |
217 | struct timer_list verbs_timer; | 219 | struct timer_list verbs_timer; |
218 | /* total dwords sent (summed from counter) */ | 220 | /* total dwords sent (summed from counter) */ |
@@ -328,6 +330,8 @@ struct ipath_devdata { | |||
328 | /* so we can rewrite it after a chip reset */ | 330 | /* so we can rewrite it after a chip reset */ |
329 | u32 ipath_pcibar1; | 331 | u32 ipath_pcibar1; |
330 | 332 | ||
333 | /* interrupt number */ | ||
334 | int ipath_irq; | ||
331 | /* HT/PCI Vendor ID (here for NodeInfo) */ | 335 | /* HT/PCI Vendor ID (here for NodeInfo) */ |
332 | u16 ipath_vendorid; | 336 | u16 ipath_vendorid; |
333 | /* HT/PCI Device ID (here for NodeInfo) */ | 337 | /* HT/PCI Device ID (here for NodeInfo) */ |
diff --git a/drivers/infiniband/hw/mthca/mthca_cmd.c b/drivers/infiniband/hw/mthca/mthca_cmd.c index 99a94d710935..768df7265b81 100644 --- a/drivers/infiniband/hw/mthca/mthca_cmd.c +++ b/drivers/infiniband/hw/mthca/mthca_cmd.c | |||
@@ -1820,11 +1820,11 @@ int mthca_MAD_IFC(struct mthca_dev *dev, int ignore_mkey, int ignore_bkey, | |||
1820 | 1820 | ||
1821 | #define MAD_IFC_BOX_SIZE 0x400 | 1821 | #define MAD_IFC_BOX_SIZE 0x400 |
1822 | #define MAD_IFC_MY_QPN_OFFSET 0x100 | 1822 | #define MAD_IFC_MY_QPN_OFFSET 0x100 |
1823 | #define MAD_IFC_RQPN_OFFSET 0x104 | 1823 | #define MAD_IFC_RQPN_OFFSET 0x108 |
1824 | #define MAD_IFC_SL_OFFSET 0x108 | 1824 | #define MAD_IFC_SL_OFFSET 0x10c |
1825 | #define MAD_IFC_G_PATH_OFFSET 0x109 | 1825 | #define MAD_IFC_G_PATH_OFFSET 0x10d |
1826 | #define MAD_IFC_RLID_OFFSET 0x10a | 1826 | #define MAD_IFC_RLID_OFFSET 0x10e |
1827 | #define MAD_IFC_PKEY_OFFSET 0x10e | 1827 | #define MAD_IFC_PKEY_OFFSET 0x112 |
1828 | #define MAD_IFC_GRH_OFFSET 0x140 | 1828 | #define MAD_IFC_GRH_OFFSET 0x140 |
1829 | 1829 | ||
1830 | inmailbox = mthca_alloc_mailbox(dev, GFP_KERNEL); | 1830 | inmailbox = mthca_alloc_mailbox(dev, GFP_KERNEL); |
@@ -1862,7 +1862,7 @@ int mthca_MAD_IFC(struct mthca_dev *dev, int ignore_mkey, int ignore_bkey, | |||
1862 | 1862 | ||
1863 | val = in_wc->dlid_path_bits | | 1863 | val = in_wc->dlid_path_bits | |
1864 | (in_wc->wc_flags & IB_WC_GRH ? 0x80 : 0); | 1864 | (in_wc->wc_flags & IB_WC_GRH ? 0x80 : 0); |
1865 | MTHCA_PUT(inbox, val, MAD_IFC_GRH_OFFSET); | 1865 | MTHCA_PUT(inbox, val, MAD_IFC_G_PATH_OFFSET); |
1866 | 1866 | ||
1867 | MTHCA_PUT(inbox, in_wc->slid, MAD_IFC_RLID_OFFSET); | 1867 | MTHCA_PUT(inbox, in_wc->slid, MAD_IFC_RLID_OFFSET); |
1868 | MTHCA_PUT(inbox, in_wc->pkey_index, MAD_IFC_PKEY_OFFSET); | 1868 | MTHCA_PUT(inbox, in_wc->pkey_index, MAD_IFC_PKEY_OFFSET); |
@@ -1870,7 +1870,7 @@ int mthca_MAD_IFC(struct mthca_dev *dev, int ignore_mkey, int ignore_bkey, | |||
1870 | if (in_grh) | 1870 | if (in_grh) |
1871 | memcpy(inbox + MAD_IFC_GRH_OFFSET, in_grh, 40); | 1871 | memcpy(inbox + MAD_IFC_GRH_OFFSET, in_grh, 40); |
1872 | 1872 | ||
1873 | op_modifier |= 0x10; | 1873 | op_modifier |= 0x4; |
1874 | 1874 | ||
1875 | in_modifier |= in_wc->slid << 16; | 1875 | in_modifier |= in_wc->slid << 16; |
1876 | } | 1876 | } |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 1eaf00e9862c..85522daeb946 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
@@ -49,6 +49,8 @@ | |||
49 | 49 | ||
50 | #include <net/dst.h> | 50 | #include <net/dst.h> |
51 | 51 | ||
52 | #define IPOIB_QPN(ha) (be32_to_cpup((__be32 *) ha) & 0xffffff) | ||
53 | |||
52 | MODULE_AUTHOR("Roland Dreier"); | 54 | MODULE_AUTHOR("Roland Dreier"); |
53 | MODULE_DESCRIPTION("IP-over-InfiniBand net driver"); | 55 | MODULE_DESCRIPTION("IP-over-InfiniBand net driver"); |
54 | MODULE_LICENSE("Dual BSD/GPL"); | 56 | MODULE_LICENSE("Dual BSD/GPL"); |
@@ -520,8 +522,7 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) | |||
520 | memcpy(&neigh->dgid.raw, &path->pathrec.dgid.raw, | 522 | memcpy(&neigh->dgid.raw, &path->pathrec.dgid.raw, |
521 | sizeof(union ib_gid)); | 523 | sizeof(union ib_gid)); |
522 | 524 | ||
523 | ipoib_send(dev, skb, path->ah, | 525 | ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb->dst->neighbour->ha)); |
524 | be32_to_cpup((__be32 *) skb->dst->neighbour->ha)); | ||
525 | } else { | 526 | } else { |
526 | neigh->ah = NULL; | 527 | neigh->ah = NULL; |
527 | __skb_queue_tail(&neigh->queue, skb); | 528 | __skb_queue_tail(&neigh->queue, skb); |
@@ -599,8 +600,7 @@ static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev, | |||
599 | ipoib_dbg(priv, "Send unicast ARP to %04x\n", | 600 | ipoib_dbg(priv, "Send unicast ARP to %04x\n", |
600 | be16_to_cpu(path->pathrec.dlid)); | 601 | be16_to_cpu(path->pathrec.dlid)); |
601 | 602 | ||
602 | ipoib_send(dev, skb, path->ah, | 603 | ipoib_send(dev, skb, path->ah, IPOIB_QPN(phdr->hwaddr)); |
603 | be32_to_cpup((__be32 *) phdr->hwaddr)); | ||
604 | } else if ((path->query || !path_rec_start(dev, path)) && | 604 | } else if ((path->query || !path_rec_start(dev, path)) && |
605 | skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) { | 605 | skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) { |
606 | /* put pseudoheader back on for next time */ | 606 | /* put pseudoheader back on for next time */ |
@@ -661,8 +661,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
661 | goto out; | 661 | goto out; |
662 | } | 662 | } |
663 | 663 | ||
664 | ipoib_send(dev, skb, neigh->ah, | 664 | ipoib_send(dev, skb, neigh->ah, IPOIB_QPN(skb->dst->neighbour->ha)); |
665 | be32_to_cpup((__be32 *) skb->dst->neighbour->ha)); | ||
666 | goto out; | 665 | goto out; |
667 | } | 666 | } |
668 | 667 | ||
@@ -694,7 +693,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
694 | IPOIB_GID_FMT "\n", | 693 | IPOIB_GID_FMT "\n", |
695 | skb->dst ? "neigh" : "dst", | 694 | skb->dst ? "neigh" : "dst", |
696 | be16_to_cpup((__be16 *) skb->data), | 695 | be16_to_cpup((__be16 *) skb->data), |
697 | be32_to_cpup((__be32 *) phdr->hwaddr), | 696 | IPOIB_QPN(phdr->hwaddr), |
698 | IPOIB_GID_RAW_ARG(phdr->hwaddr + 4)); | 697 | IPOIB_GID_RAW_ARG(phdr->hwaddr + 4)); |
699 | dev_kfree_skb_any(skb); | 698 | dev_kfree_skb_any(skb); |
700 | ++priv->stats.tx_dropped; | 699 | ++priv->stats.tx_dropped; |
@@ -777,7 +776,7 @@ static void ipoib_neigh_destructor(struct neighbour *n) | |||
777 | 776 | ||
778 | ipoib_dbg(priv, | 777 | ipoib_dbg(priv, |
779 | "neigh_destructor for %06x " IPOIB_GID_FMT "\n", | 778 | "neigh_destructor for %06x " IPOIB_GID_FMT "\n", |
780 | be32_to_cpup((__be32 *) n->ha), | 779 | IPOIB_QPN(n->ha), |
781 | IPOIB_GID_RAW_ARG(n->ha + 4)); | 780 | IPOIB_GID_RAW_ARG(n->ha + 4)); |
782 | 781 | ||
783 | spin_lock_irqsave(&priv->lock, flags); | 782 | spin_lock_irqsave(&priv->lock, flags); |
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c index eb6f98d82289..9b2041e25d59 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.c +++ b/drivers/infiniband/ulp/iser/iscsi_iser.c | |||
@@ -363,11 +363,11 @@ iscsi_iser_conn_start(struct iscsi_cls_conn *cls_conn) | |||
363 | struct iscsi_conn *conn = cls_conn->dd_data; | 363 | struct iscsi_conn *conn = cls_conn->dd_data; |
364 | int err; | 364 | int err; |
365 | 365 | ||
366 | err = iscsi_conn_start(cls_conn); | 366 | err = iser_conn_set_full_featured_mode(conn); |
367 | if (err) | 367 | if (err) |
368 | return err; | 368 | return err; |
369 | 369 | ||
370 | return iser_conn_set_full_featured_mode(conn); | 370 | return iscsi_conn_start(cls_conn); |
371 | } | 371 | } |
372 | 372 | ||
373 | static struct iscsi_transport iscsi_iser_transport; | 373 | static struct iscsi_transport iscsi_iser_transport; |
diff --git a/drivers/input/keyboard/lkkbd.c b/drivers/input/keyboard/lkkbd.c index 708d5a1bc3d2..979b93e33da7 100644 --- a/drivers/input/keyboard/lkkbd.c +++ b/drivers/input/keyboard/lkkbd.c | |||
@@ -59,11 +59,6 @@ | |||
59 | * You should have received a copy of the GNU General Public License | 59 | * You should have received a copy of the GNU General Public License |
60 | * along with this program; if not, write to the Free Software | 60 | * along with this program; if not, write to the Free Software |
61 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 61 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
62 | * | ||
63 | * Should you need to contact me, the author, you can do so either by | ||
64 | * email or by paper mail: | ||
65 | * Jan-Benedict Glaw, Lilienstraße 16, 33790 Hörste (near Halle/Westf.), | ||
66 | * Germany. | ||
67 | */ | 62 | */ |
68 | 63 | ||
69 | #include <linux/delay.h> | 64 | #include <linux/delay.h> |
diff --git a/drivers/input/touchscreen/hp680_ts_input.c b/drivers/input/touchscreen/hp680_ts_input.c index e31c6c55b2e2..58fca316786c 100644 --- a/drivers/input/touchscreen/hp680_ts_input.c +++ b/drivers/input/touchscreen/hp680_ts_input.c | |||
@@ -6,7 +6,7 @@ | |||
6 | #include <asm/io.h> | 6 | #include <asm/io.h> |
7 | #include <asm/delay.h> | 7 | #include <asm/delay.h> |
8 | #include <asm/adc.h> | 8 | #include <asm/adc.h> |
9 | #include <asm/hp6xx/hp6xx.h> | 9 | #include <asm/hp6xx.h> |
10 | 10 | ||
11 | #define MODNAME "hp680_ts_input" | 11 | #define MODNAME "hp680_ts_input" |
12 | 12 | ||
diff --git a/drivers/isdn/gigaset/common.c b/drivers/isdn/gigaset/common.c index aca165d43aa0..5800beeebb85 100644 --- a/drivers/isdn/gigaset/common.c +++ b/drivers/isdn/gigaset/common.c | |||
@@ -616,7 +616,7 @@ static struct bc_state *gigaset_initbcs(struct bc_state *bcs, | |||
616 | } else if ((bcs->skb = dev_alloc_skb(SBUFSIZE + HW_HDR_LEN)) != NULL) | 616 | } else if ((bcs->skb = dev_alloc_skb(SBUFSIZE + HW_HDR_LEN)) != NULL) |
617 | skb_reserve(bcs->skb, HW_HDR_LEN); | 617 | skb_reserve(bcs->skb, HW_HDR_LEN); |
618 | else { | 618 | else { |
619 | dev_warn(cs->dev, "could not allocate skb\n"); | 619 | warn("could not allocate skb\n"); |
620 | bcs->inputstate |= INS_skip_frame; | 620 | bcs->inputstate |= INS_skip_frame; |
621 | } | 621 | } |
622 | 622 | ||
diff --git a/drivers/isdn/hisax/Kconfig b/drivers/isdn/hisax/Kconfig index eb57a988e048..cfd2718a490d 100644 --- a/drivers/isdn/hisax/Kconfig +++ b/drivers/isdn/hisax/Kconfig | |||
@@ -344,7 +344,7 @@ config HISAX_HFC_SX | |||
344 | 344 | ||
345 | config HISAX_ENTERNOW_PCI | 345 | config HISAX_ENTERNOW_PCI |
346 | bool "Formula-n enter:now PCI card" | 346 | bool "Formula-n enter:now PCI card" |
347 | depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K || FRV)) | 347 | depends on HISAX_NETJET && PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K || FRV)) |
348 | help | 348 | help |
349 | This enables HiSax support for the Formula-n enter:now PCI | 349 | This enables HiSax support for the Formula-n enter:now PCI |
350 | ISDN card. | 350 | ISDN card. |
diff --git a/drivers/isdn/hysdn/hysdn_sched.c b/drivers/isdn/hysdn/hysdn_sched.c index 1fadf0133e9b..18758772b744 100644 --- a/drivers/isdn/hysdn/hysdn_sched.c +++ b/drivers/isdn/hysdn/hysdn_sched.c | |||
@@ -155,21 +155,17 @@ hysdn_tx_cfgline(hysdn_card *card, unsigned char *line, unsigned short chan) | |||
155 | if (card->debug_flags & LOG_SCHED_ASYN) | 155 | if (card->debug_flags & LOG_SCHED_ASYN) |
156 | hysdn_addlog(card, "async tx-cfg chan=%d len=%d", chan, strlen(line) + 1); | 156 | hysdn_addlog(card, "async tx-cfg chan=%d len=%d", chan, strlen(line) + 1); |
157 | 157 | ||
158 | spin_lock_irqsave(&card->hysdn_lock, flags); | ||
159 | while (card->async_busy) { | 158 | while (card->async_busy) { |
160 | sti(); | ||
161 | 159 | ||
162 | if (card->debug_flags & LOG_SCHED_ASYN) | 160 | if (card->debug_flags & LOG_SCHED_ASYN) |
163 | hysdn_addlog(card, "async tx-cfg delayed"); | 161 | hysdn_addlog(card, "async tx-cfg delayed"); |
164 | 162 | ||
165 | msleep_interruptible(20); /* Timeout 20ms */ | 163 | msleep_interruptible(20); /* Timeout 20ms */ |
166 | if (!--cnt) { | 164 | if (!--cnt) |
167 | spin_unlock_irqrestore(&card->hysdn_lock, flags); | ||
168 | return (-ERR_ASYNC_TIME); /* timed out */ | 165 | return (-ERR_ASYNC_TIME); /* timed out */ |
169 | } | ||
170 | cli(); | ||
171 | } /* wait for buffer to become free */ | 166 | } /* wait for buffer to become free */ |
172 | 167 | ||
168 | spin_lock_irqsave(&card->hysdn_lock, flags); | ||
173 | strcpy(card->async_data, line); | 169 | strcpy(card->async_data, line); |
174 | card->async_len = strlen(line) + 1; | 170 | card->async_len = strlen(line) + 1; |
175 | card->async_channel = chan; | 171 | card->async_channel = chan; |
@@ -177,30 +173,23 @@ hysdn_tx_cfgline(hysdn_card *card, unsigned char *line, unsigned short chan) | |||
177 | 173 | ||
178 | /* now queue the task */ | 174 | /* now queue the task */ |
179 | schedule_work(&card->irq_queue); | 175 | schedule_work(&card->irq_queue); |
180 | sti(); | 176 | spin_unlock_irqrestore(&card->hysdn_lock, flags); |
181 | 177 | ||
182 | if (card->debug_flags & LOG_SCHED_ASYN) | 178 | if (card->debug_flags & LOG_SCHED_ASYN) |
183 | hysdn_addlog(card, "async tx-cfg data queued"); | 179 | hysdn_addlog(card, "async tx-cfg data queued"); |
184 | 180 | ||
185 | cnt++; /* short delay */ | 181 | cnt++; /* short delay */ |
186 | cli(); | ||
187 | 182 | ||
188 | while (card->async_busy) { | 183 | while (card->async_busy) { |
189 | sti(); | ||
190 | 184 | ||
191 | if (card->debug_flags & LOG_SCHED_ASYN) | 185 | if (card->debug_flags & LOG_SCHED_ASYN) |
192 | hysdn_addlog(card, "async tx-cfg waiting for tx-ready"); | 186 | hysdn_addlog(card, "async tx-cfg waiting for tx-ready"); |
193 | 187 | ||
194 | msleep_interruptible(20); /* Timeout 20ms */ | 188 | msleep_interruptible(20); /* Timeout 20ms */ |
195 | if (!--cnt) { | 189 | if (!--cnt) |
196 | spin_unlock_irqrestore(&card->hysdn_lock, flags); | ||
197 | return (-ERR_ASYNC_TIME); /* timed out */ | 190 | return (-ERR_ASYNC_TIME); /* timed out */ |
198 | } | ||
199 | cli(); | ||
200 | } /* wait for buffer to become free again */ | 191 | } /* wait for buffer to become free again */ |
201 | 192 | ||
202 | spin_unlock_irqrestore(&card->hysdn_lock, flags); | ||
203 | |||
204 | if (card->debug_flags & LOG_SCHED_ASYN) | 193 | if (card->debug_flags & LOG_SCHED_ASYN) |
205 | hysdn_addlog(card, "async tx-cfg data send"); | 194 | hysdn_addlog(card, "async tx-cfg data send"); |
206 | 195 | ||
diff --git a/drivers/macintosh/windfarm_pm112.c b/drivers/macintosh/windfarm_pm112.c index fa4b13f89369..b3fbb45bc90a 100644 --- a/drivers/macintosh/windfarm_pm112.c +++ b/drivers/macintosh/windfarm_pm112.c | |||
@@ -685,6 +685,17 @@ static int __init wf_pm112_init(void) | |||
685 | ++nr_cores; | 685 | ++nr_cores; |
686 | 686 | ||
687 | printk(KERN_INFO "windfarm: initializing for dual-core desktop G5\n"); | 687 | printk(KERN_INFO "windfarm: initializing for dual-core desktop G5\n"); |
688 | |||
689 | #ifdef MODULE | ||
690 | request_module("windfarm_smu_controls"); | ||
691 | request_module("windfarm_smu_sensors"); | ||
692 | request_module("windfarm_smu_sat"); | ||
693 | request_module("windfarm_lm75_sensor"); | ||
694 | request_module("windfarm_max6690_sensor"); | ||
695 | request_module("windfarm_cpufreq_clamp"); | ||
696 | |||
697 | #endif /* MODULE */ | ||
698 | |||
688 | platform_driver_register(&wf_pm112_driver); | 699 | platform_driver_register(&wf_pm112_driver); |
689 | return 0; | 700 | return 0; |
690 | } | 701 | } |
diff --git a/drivers/macintosh/windfarm_pm81.c b/drivers/macintosh/windfarm_pm81.c index 2a944851b8e1..f24fa734046a 100644 --- a/drivers/macintosh/windfarm_pm81.c +++ b/drivers/macintosh/windfarm_pm81.c | |||
@@ -788,6 +788,7 @@ static int __init wf_smu_init(void) | |||
788 | request_module("windfarm_smu_controls"); | 788 | request_module("windfarm_smu_controls"); |
789 | request_module("windfarm_smu_sensors"); | 789 | request_module("windfarm_smu_sensors"); |
790 | request_module("windfarm_lm75_sensor"); | 790 | request_module("windfarm_lm75_sensor"); |
791 | request_module("windfarm_cpufreq_clamp"); | ||
791 | 792 | ||
792 | #endif /* MODULE */ | 793 | #endif /* MODULE */ |
793 | platform_driver_register(&wf_smu_driver); | 794 | platform_driver_register(&wf_smu_driver); |
diff --git a/drivers/macintosh/windfarm_pm91.c b/drivers/macintosh/windfarm_pm91.c index 9961a67b4f85..26eee69ebe6d 100644 --- a/drivers/macintosh/windfarm_pm91.c +++ b/drivers/macintosh/windfarm_pm91.c | |||
@@ -719,6 +719,7 @@ static int __init wf_smu_init(void) | |||
719 | request_module("windfarm_smu_controls"); | 719 | request_module("windfarm_smu_controls"); |
720 | request_module("windfarm_smu_sensors"); | 720 | request_module("windfarm_smu_sensors"); |
721 | request_module("windfarm_lm75_sensor"); | 721 | request_module("windfarm_lm75_sensor"); |
722 | request_module("windfarm_cpufreq_clamp"); | ||
722 | 723 | ||
723 | #endif /* MODULE */ | 724 | #endif /* MODULE */ |
724 | platform_driver_register(&wf_smu_driver); | 725 | platform_driver_register(&wf_smu_driver); |
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index d47d38ac71b1..d6f614738bbd 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
@@ -536,7 +536,7 @@ static int bitmap_read_sb(struct bitmap *bitmap) | |||
536 | printk(KERN_INFO "%s: bitmap file is out of date (%llu < %llu) " | 536 | printk(KERN_INFO "%s: bitmap file is out of date (%llu < %llu) " |
537 | "-- forcing full recovery\n", bmname(bitmap), events, | 537 | "-- forcing full recovery\n", bmname(bitmap), events, |
538 | (unsigned long long) bitmap->mddev->events); | 538 | (unsigned long long) bitmap->mddev->events); |
539 | sb->state |= BITMAP_STALE; | 539 | sb->state |= cpu_to_le32(BITMAP_STALE); |
540 | } | 540 | } |
541 | success: | 541 | success: |
542 | /* assign fields using values from superblock */ | 542 | /* assign fields using values from superblock */ |
@@ -544,11 +544,11 @@ success: | |||
544 | bitmap->daemon_sleep = daemon_sleep; | 544 | bitmap->daemon_sleep = daemon_sleep; |
545 | bitmap->daemon_lastrun = jiffies; | 545 | bitmap->daemon_lastrun = jiffies; |
546 | bitmap->max_write_behind = write_behind; | 546 | bitmap->max_write_behind = write_behind; |
547 | bitmap->flags |= sb->state; | 547 | bitmap->flags |= le32_to_cpu(sb->state); |
548 | if (le32_to_cpu(sb->version) == BITMAP_MAJOR_HOSTENDIAN) | 548 | if (le32_to_cpu(sb->version) == BITMAP_MAJOR_HOSTENDIAN) |
549 | bitmap->flags |= BITMAP_HOSTENDIAN; | 549 | bitmap->flags |= BITMAP_HOSTENDIAN; |
550 | bitmap->events_cleared = le64_to_cpu(sb->events_cleared); | 550 | bitmap->events_cleared = le64_to_cpu(sb->events_cleared); |
551 | if (sb->state & BITMAP_STALE) | 551 | if (sb->state & cpu_to_le32(BITMAP_STALE)) |
552 | bitmap->events_cleared = bitmap->mddev->events; | 552 | bitmap->events_cleared = bitmap->mddev->events; |
553 | err = 0; | 553 | err = 0; |
554 | out: | 554 | out: |
@@ -578,9 +578,9 @@ static void bitmap_mask_state(struct bitmap *bitmap, enum bitmap_state bits, | |||
578 | spin_unlock_irqrestore(&bitmap->lock, flags); | 578 | spin_unlock_irqrestore(&bitmap->lock, flags); |
579 | sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0); | 579 | sb = (bitmap_super_t *)kmap_atomic(bitmap->sb_page, KM_USER0); |
580 | switch (op) { | 580 | switch (op) { |
581 | case MASK_SET: sb->state |= bits; | 581 | case MASK_SET: sb->state |= cpu_to_le32(bits); |
582 | break; | 582 | break; |
583 | case MASK_UNSET: sb->state &= ~bits; | 583 | case MASK_UNSET: sb->state &= cpu_to_le32(~bits); |
584 | break; | 584 | break; |
585 | default: BUG(); | 585 | default: BUG(); |
586 | } | 586 | } |
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index a625576fdeeb..08a40f4e4f60 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c | |||
@@ -915,8 +915,6 @@ static int crypt_status(struct dm_target *ti, status_type_t type, | |||
915 | char *result, unsigned int maxlen) | 915 | char *result, unsigned int maxlen) |
916 | { | 916 | { |
917 | struct crypt_config *cc = (struct crypt_config *) ti->private; | 917 | struct crypt_config *cc = (struct crypt_config *) ti->private; |
918 | const char *cipher; | ||
919 | const char *chainmode = NULL; | ||
920 | unsigned int sz = 0; | 918 | unsigned int sz = 0; |
921 | 919 | ||
922 | switch (type) { | 920 | switch (type) { |
@@ -925,14 +923,11 @@ static int crypt_status(struct dm_target *ti, status_type_t type, | |||
925 | break; | 923 | break; |
926 | 924 | ||
927 | case STATUSTYPE_TABLE: | 925 | case STATUSTYPE_TABLE: |
928 | cipher = crypto_blkcipher_name(cc->tfm); | ||
929 | |||
930 | chainmode = cc->chainmode; | ||
931 | |||
932 | if (cc->iv_mode) | 926 | if (cc->iv_mode) |
933 | DMEMIT("%s-%s-%s ", cipher, chainmode, cc->iv_mode); | 927 | DMEMIT("%s-%s-%s ", cc->cipher, cc->chainmode, |
928 | cc->iv_mode); | ||
934 | else | 929 | else |
935 | DMEMIT("%s-%s ", cipher, chainmode); | 930 | DMEMIT("%s-%s ", cc->cipher, cc->chainmode); |
936 | 931 | ||
937 | if (cc->key_size > 0) { | 932 | if (cc->key_size > 0) { |
938 | if ((maxlen - sz) < ((cc->key_size << 1) + 1)) | 933 | if ((maxlen - sz) < ((cc->key_size << 1) + 1)) |
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index d13bb15a8a02..4510ad8f971c 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c | |||
@@ -606,9 +606,14 @@ static struct hash_cell *__find_device_hash_cell(struct dm_ioctl *param) | |||
606 | return __get_name_cell(param->name); | 606 | return __get_name_cell(param->name); |
607 | 607 | ||
608 | md = dm_get_md(huge_decode_dev(param->dev)); | 608 | md = dm_get_md(huge_decode_dev(param->dev)); |
609 | if (md) | 609 | if (!md) |
610 | mdptr = dm_get_mdptr(md); | 610 | goto out; |
611 | 611 | ||
612 | mdptr = dm_get_mdptr(md); | ||
613 | if (!mdptr) | ||
614 | dm_put(md); | ||
615 | |||
616 | out: | ||
612 | return mdptr; | 617 | return mdptr; |
613 | } | 618 | } |
614 | 619 | ||
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index 659224cb7c53..48a653b3f518 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c | |||
@@ -24,6 +24,7 @@ | |||
24 | 24 | ||
25 | static struct workqueue_struct *_kmirrord_wq; | 25 | static struct workqueue_struct *_kmirrord_wq; |
26 | static struct work_struct _kmirrord_work; | 26 | static struct work_struct _kmirrord_work; |
27 | static DECLARE_WAIT_QUEUE_HEAD(_kmirrord_recovery_stopped); | ||
27 | 28 | ||
28 | static inline void wake(void) | 29 | static inline void wake(void) |
29 | { | 30 | { |
@@ -83,6 +84,7 @@ struct region_hash { | |||
83 | struct list_head *buckets; | 84 | struct list_head *buckets; |
84 | 85 | ||
85 | spinlock_t region_lock; | 86 | spinlock_t region_lock; |
87 | atomic_t recovery_in_flight; | ||
86 | struct semaphore recovery_count; | 88 | struct semaphore recovery_count; |
87 | struct list_head clean_regions; | 89 | struct list_head clean_regions; |
88 | struct list_head quiesced_regions; | 90 | struct list_head quiesced_regions; |
@@ -191,6 +193,7 @@ static int rh_init(struct region_hash *rh, struct mirror_set *ms, | |||
191 | 193 | ||
192 | spin_lock_init(&rh->region_lock); | 194 | spin_lock_init(&rh->region_lock); |
193 | sema_init(&rh->recovery_count, 0); | 195 | sema_init(&rh->recovery_count, 0); |
196 | atomic_set(&rh->recovery_in_flight, 0); | ||
194 | INIT_LIST_HEAD(&rh->clean_regions); | 197 | INIT_LIST_HEAD(&rh->clean_regions); |
195 | INIT_LIST_HEAD(&rh->quiesced_regions); | 198 | INIT_LIST_HEAD(&rh->quiesced_regions); |
196 | INIT_LIST_HEAD(&rh->recovered_regions); | 199 | INIT_LIST_HEAD(&rh->recovered_regions); |
@@ -382,6 +385,8 @@ static void rh_update_states(struct region_hash *rh) | |||
382 | rh->log->type->clear_region(rh->log, reg->key); | 385 | rh->log->type->clear_region(rh->log, reg->key); |
383 | rh->log->type->complete_resync_work(rh->log, reg->key, 1); | 386 | rh->log->type->complete_resync_work(rh->log, reg->key, 1); |
384 | dispatch_bios(rh->ms, ®->delayed_bios); | 387 | dispatch_bios(rh->ms, ®->delayed_bios); |
388 | if (atomic_dec_and_test(&rh->recovery_in_flight)) | ||
389 | wake_up_all(&_kmirrord_recovery_stopped); | ||
385 | up(&rh->recovery_count); | 390 | up(&rh->recovery_count); |
386 | mempool_free(reg, rh->region_pool); | 391 | mempool_free(reg, rh->region_pool); |
387 | } | 392 | } |
@@ -502,11 +507,21 @@ static int __rh_recovery_prepare(struct region_hash *rh) | |||
502 | 507 | ||
503 | static void rh_recovery_prepare(struct region_hash *rh) | 508 | static void rh_recovery_prepare(struct region_hash *rh) |
504 | { | 509 | { |
505 | while (!down_trylock(&rh->recovery_count)) | 510 | /* Extra reference to avoid race with rh_stop_recovery */ |
511 | atomic_inc(&rh->recovery_in_flight); | ||
512 | |||
513 | while (!down_trylock(&rh->recovery_count)) { | ||
514 | atomic_inc(&rh->recovery_in_flight); | ||
506 | if (__rh_recovery_prepare(rh) <= 0) { | 515 | if (__rh_recovery_prepare(rh) <= 0) { |
516 | atomic_dec(&rh->recovery_in_flight); | ||
507 | up(&rh->recovery_count); | 517 | up(&rh->recovery_count); |
508 | break; | 518 | break; |
509 | } | 519 | } |
520 | } | ||
521 | |||
522 | /* Drop the extra reference */ | ||
523 | if (atomic_dec_and_test(&rh->recovery_in_flight)) | ||
524 | wake_up_all(&_kmirrord_recovery_stopped); | ||
510 | } | 525 | } |
511 | 526 | ||
512 | /* | 527 | /* |
@@ -1177,6 +1192,11 @@ static void mirror_postsuspend(struct dm_target *ti) | |||
1177 | struct dirty_log *log = ms->rh.log; | 1192 | struct dirty_log *log = ms->rh.log; |
1178 | 1193 | ||
1179 | rh_stop_recovery(&ms->rh); | 1194 | rh_stop_recovery(&ms->rh); |
1195 | |||
1196 | /* Wait for all I/O we generated to complete */ | ||
1197 | wait_event(_kmirrord_recovery_stopped, | ||
1198 | !atomic_read(&ms->rh.recovery_in_flight)); | ||
1199 | |||
1180 | if (log->type->suspend && log->type->suspend(log)) | 1200 | if (log->type->suspend && log->type->suspend(log)) |
1181 | /* FIXME: need better error handling */ | 1201 | /* FIXME: need better error handling */ |
1182 | DMWARN("log suspend failed"); | 1202 | DMWARN("log suspend failed"); |
diff --git a/drivers/md/dm-round-robin.c b/drivers/md/dm-round-robin.c index c5a16c550122..6f9fcd4db9b5 100644 --- a/drivers/md/dm-round-robin.c +++ b/drivers/md/dm-round-robin.c | |||
@@ -136,7 +136,7 @@ static int rr_add_path(struct path_selector *ps, struct path *path, | |||
136 | 136 | ||
137 | path->pscontext = pi; | 137 | path->pscontext = pi; |
138 | 138 | ||
139 | list_add(&pi->list, &s->valid_paths); | 139 | list_add_tail(&pi->list, &s->valid_paths); |
140 | 140 | ||
141 | return 0; | 141 | return 0; |
142 | } | 142 | } |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index b5764a86c8b5..fc4f743f3b53 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -1285,7 +1285,7 @@ int dm_suspend(struct mapped_device *md, int do_lockfs) | |||
1285 | down(&md->suspend_lock); | 1285 | down(&md->suspend_lock); |
1286 | 1286 | ||
1287 | if (dm_suspended(md)) | 1287 | if (dm_suspended(md)) |
1288 | goto out; | 1288 | goto out_unlock; |
1289 | 1289 | ||
1290 | map = dm_get_table(md); | 1290 | map = dm_get_table(md); |
1291 | 1291 | ||
@@ -1361,6 +1361,8 @@ out: | |||
1361 | } | 1361 | } |
1362 | 1362 | ||
1363 | dm_table_put(map); | 1363 | dm_table_put(map); |
1364 | |||
1365 | out_unlock: | ||
1364 | up(&md->suspend_lock); | 1366 | up(&md->suspend_lock); |
1365 | return r; | 1367 | return r; |
1366 | } | 1368 | } |
diff --git a/drivers/md/md.c b/drivers/md/md.c index f7f19088f3be..8cbf9c9df1c3 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -974,12 +974,13 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev) | |||
974 | * version 1 superblock | 974 | * version 1 superblock |
975 | */ | 975 | */ |
976 | 976 | ||
977 | static unsigned int calc_sb_1_csum(struct mdp_superblock_1 * sb) | 977 | static __le32 calc_sb_1_csum(struct mdp_superblock_1 * sb) |
978 | { | 978 | { |
979 | unsigned int disk_csum, csum; | 979 | __le32 disk_csum; |
980 | u32 csum; | ||
980 | unsigned long long newcsum; | 981 | unsigned long long newcsum; |
981 | int size = 256 + le32_to_cpu(sb->max_dev)*2; | 982 | int size = 256 + le32_to_cpu(sb->max_dev)*2; |
982 | unsigned int *isuper = (unsigned int*)sb; | 983 | __le32 *isuper = (__le32*)sb; |
983 | int i; | 984 | int i; |
984 | 985 | ||
985 | disk_csum = sb->sb_csum; | 986 | disk_csum = sb->sb_csum; |
@@ -989,7 +990,7 @@ static unsigned int calc_sb_1_csum(struct mdp_superblock_1 * sb) | |||
989 | newcsum += le32_to_cpu(*isuper++); | 990 | newcsum += le32_to_cpu(*isuper++); |
990 | 991 | ||
991 | if (size == 2) | 992 | if (size == 2) |
992 | newcsum += le16_to_cpu(*(unsigned short*) isuper); | 993 | newcsum += le16_to_cpu(*(__le16*) isuper); |
993 | 994 | ||
994 | csum = (newcsum & 0xffffffff) + (newcsum >> 32); | 995 | csum = (newcsum & 0xffffffff) + (newcsum >> 32); |
995 | sb->sb_csum = disk_csum; | 996 | sb->sb_csum = disk_csum; |
@@ -1106,7 +1107,7 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version) | |||
1106 | if (le32_to_cpu(sb->chunksize)) | 1107 | if (le32_to_cpu(sb->chunksize)) |
1107 | rdev->size &= ~((sector_t)le32_to_cpu(sb->chunksize)/2 - 1); | 1108 | rdev->size &= ~((sector_t)le32_to_cpu(sb->chunksize)/2 - 1); |
1108 | 1109 | ||
1109 | if (le32_to_cpu(sb->size) > rdev->size*2) | 1110 | if (le64_to_cpu(sb->size) > rdev->size*2) |
1110 | return -EINVAL; | 1111 | return -EINVAL; |
1111 | return ret; | 1112 | return ret; |
1112 | } | 1113 | } |
@@ -1228,7 +1229,7 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1228 | else | 1229 | else |
1229 | sb->resync_offset = cpu_to_le64(0); | 1230 | sb->resync_offset = cpu_to_le64(0); |
1230 | 1231 | ||
1231 | sb->cnt_corrected_read = atomic_read(&rdev->corrected_errors); | 1232 | sb->cnt_corrected_read = cpu_to_le32(atomic_read(&rdev->corrected_errors)); |
1232 | 1233 | ||
1233 | sb->raid_disks = cpu_to_le32(mddev->raid_disks); | 1234 | sb->raid_disks = cpu_to_le32(mddev->raid_disks); |
1234 | sb->size = cpu_to_le64(mddev->size<<1); | 1235 | sb->size = cpu_to_le64(mddev->size<<1); |
@@ -2002,6 +2003,7 @@ static mdk_rdev_t *md_import_device(dev_t newdev, int super_format, int super_mi | |||
2002 | kobject_init(&rdev->kobj); | 2003 | kobject_init(&rdev->kobj); |
2003 | 2004 | ||
2004 | rdev->desc_nr = -1; | 2005 | rdev->desc_nr = -1; |
2006 | rdev->saved_raid_disk = -1; | ||
2005 | rdev->flags = 0; | 2007 | rdev->flags = 0; |
2006 | rdev->data_offset = 0; | 2008 | rdev->data_offset = 0; |
2007 | rdev->sb_events = 0; | 2009 | rdev->sb_events = 0; |
@@ -3198,6 +3200,7 @@ static int do_md_run(mddev_t * mddev) | |||
3198 | 3200 | ||
3199 | mddev->changed = 1; | 3201 | mddev->changed = 1; |
3200 | md_new_event(mddev); | 3202 | md_new_event(mddev); |
3203 | kobject_uevent(&mddev->gendisk->kobj, KOBJ_CHANGE); | ||
3201 | return 0; | 3204 | return 0; |
3202 | } | 3205 | } |
3203 | 3206 | ||
@@ -4043,11 +4046,8 @@ static int update_size(mddev_t *mddev, unsigned long size) | |||
4043 | return -EBUSY; | 4046 | return -EBUSY; |
4044 | ITERATE_RDEV(mddev,rdev,tmp) { | 4047 | ITERATE_RDEV(mddev,rdev,tmp) { |
4045 | sector_t avail; | 4048 | sector_t avail; |
4046 | if (rdev->sb_offset > rdev->data_offset) | 4049 | avail = rdev->size * 2; |
4047 | avail = (rdev->sb_offset*2) - rdev->data_offset; | 4050 | |
4048 | else | ||
4049 | avail = get_capacity(rdev->bdev->bd_disk) | ||
4050 | - rdev->data_offset; | ||
4051 | if (fit && (size == 0 || size > avail/2)) | 4051 | if (fit && (size == 0 || size > avail/2)) |
4052 | size = avail/2; | 4052 | size = avail/2; |
4053 | if (avail < ((sector_t)size << 1)) | 4053 | if (avail < ((sector_t)size << 1)) |
@@ -4486,6 +4486,7 @@ static int md_thread(void * arg) | |||
4486 | * many dirty RAID5 blocks. | 4486 | * many dirty RAID5 blocks. |
4487 | */ | 4487 | */ |
4488 | 4488 | ||
4489 | current->flags |= PF_NOFREEZE; | ||
4489 | allow_signal(SIGKILL); | 4490 | allow_signal(SIGKILL); |
4490 | while (!kthread_should_stop()) { | 4491 | while (!kthread_should_stop()) { |
4491 | 4492 | ||
@@ -4502,7 +4503,6 @@ static int md_thread(void * arg) | |||
4502 | test_bit(THREAD_WAKEUP, &thread->flags) | 4503 | test_bit(THREAD_WAKEUP, &thread->flags) |
4503 | || kthread_should_stop(), | 4504 | || kthread_should_stop(), |
4504 | thread->timeout); | 4505 | thread->timeout); |
4505 | try_to_freeze(); | ||
4506 | 4506 | ||
4507 | clear_bit(THREAD_WAKEUP, &thread->flags); | 4507 | clear_bit(THREAD_WAKEUP, &thread->flags); |
4508 | 4508 | ||
diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index 171ff41b52b0..14da37fee37b 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c | |||
@@ -277,6 +277,7 @@ static void multipath_error (mddev_t *mddev, mdk_rdev_t *rdev) | |||
277 | set_bit(Faulty, &rdev->flags); | 277 | set_bit(Faulty, &rdev->flags); |
278 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | 278 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
279 | conf->working_disks--; | 279 | conf->working_disks--; |
280 | mddev->degraded++; | ||
280 | printk(KERN_ALERT "multipath: IO failure on %s," | 281 | printk(KERN_ALERT "multipath: IO failure on %s," |
281 | " disabling IO path. \n Operation continuing" | 282 | " disabling IO path. \n Operation continuing" |
282 | " on %d IO paths.\n", | 283 | " on %d IO paths.\n", |
@@ -336,6 +337,7 @@ static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) | |||
336 | blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9); | 337 | blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9); |
337 | 338 | ||
338 | conf->working_disks++; | 339 | conf->working_disks++; |
340 | mddev->degraded--; | ||
339 | rdev->raid_disk = path; | 341 | rdev->raid_disk = path; |
340 | set_bit(In_sync, &rdev->flags); | 342 | set_bit(In_sync, &rdev->flags); |
341 | rcu_assign_pointer(p->rdev, rdev); | 343 | rcu_assign_pointer(p->rdev, rdev); |
@@ -501,7 +503,7 @@ static int multipath_run (mddev_t *mddev) | |||
501 | mdname(mddev)); | 503 | mdname(mddev)); |
502 | goto out_free_conf; | 504 | goto out_free_conf; |
503 | } | 505 | } |
504 | mddev->degraded = conf->raid_disks = conf->working_disks; | 506 | mddev->degraded = conf->raid_disks - conf->working_disks; |
505 | 507 | ||
506 | conf->pool = mempool_create_kzalloc_pool(NR_RESERVED_BUFS, | 508 | conf->pool = mempool_create_kzalloc_pool(NR_RESERVED_BUFS, |
507 | sizeof(struct multipath_bh)); | 509 | sizeof(struct multipath_bh)); |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index dc9d2def0270..656fae912fe3 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -1474,8 +1474,8 @@ static void fix_read_error(conf_t *conf, int read_disk, | |||
1474 | "raid1:%s: read error corrected " | 1474 | "raid1:%s: read error corrected " |
1475 | "(%d sectors at %llu on %s)\n", | 1475 | "(%d sectors at %llu on %s)\n", |
1476 | mdname(mddev), s, | 1476 | mdname(mddev), s, |
1477 | (unsigned long long)sect + | 1477 | (unsigned long long)(sect + |
1478 | rdev->data_offset, | 1478 | rdev->data_offset), |
1479 | bdevname(rdev->bdev, b)); | 1479 | bdevname(rdev->bdev, b)); |
1480 | } | 1480 | } |
1481 | } | 1481 | } |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 1250f0eab4af..7492d6033ac6 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -1470,8 +1470,8 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio) | |||
1470 | "raid10:%s: read error corrected" | 1470 | "raid10:%s: read error corrected" |
1471 | " (%d sectors at %llu on %s)\n", | 1471 | " (%d sectors at %llu on %s)\n", |
1472 | mdname(mddev), s, | 1472 | mdname(mddev), s, |
1473 | (unsigned long long)sect+ | 1473 | (unsigned long long)(sect+ |
1474 | rdev->data_offset, | 1474 | rdev->data_offset), |
1475 | bdevname(rdev->bdev, b)); | 1475 | bdevname(rdev->bdev, b)); |
1476 | 1476 | ||
1477 | rdev_dec_pending(rdev, mddev); | 1477 | rdev_dec_pending(rdev, mddev); |
@@ -2079,7 +2079,7 @@ static int run(mddev_t *mddev) | |||
2079 | disk = conf->mirrors + i; | 2079 | disk = conf->mirrors + i; |
2080 | 2080 | ||
2081 | if (!disk->rdev || | 2081 | if (!disk->rdev || |
2082 | !test_bit(In_sync, &rdev->flags)) { | 2082 | !test_bit(In_sync, &disk->rdev->flags)) { |
2083 | disk->head_position = 0; | 2083 | disk->head_position = 0; |
2084 | mddev->degraded++; | 2084 | mddev->degraded++; |
2085 | } | 2085 | } |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index e14f45780720..69c3e201fa3b 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -3659,7 +3659,7 @@ static void end_reshape(raid5_conf_t *conf) | |||
3659 | bdev = bdget_disk(conf->mddev->gendisk, 0); | 3659 | bdev = bdget_disk(conf->mddev->gendisk, 0); |
3660 | if (bdev) { | 3660 | if (bdev) { |
3661 | mutex_lock(&bdev->bd_inode->i_mutex); | 3661 | mutex_lock(&bdev->bd_inode->i_mutex); |
3662 | i_size_write(bdev->bd_inode, conf->mddev->array_size << 10); | 3662 | i_size_write(bdev->bd_inode, (loff_t)conf->mddev->array_size << 10); |
3663 | mutex_unlock(&bdev->bd_inode->i_mutex); | 3663 | mutex_unlock(&bdev->bd_inode->i_mutex); |
3664 | bdput(bdev); | 3664 | bdput(bdev); |
3665 | } | 3665 | } |
diff --git a/drivers/media/common/saa7146_i2c.c b/drivers/media/common/saa7146_i2c.c index d9953f7a8b6b..5297a365c928 100644 --- a/drivers/media/common/saa7146_i2c.c +++ b/drivers/media/common/saa7146_i2c.c | |||
@@ -217,11 +217,9 @@ static int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword, int short_d | |||
217 | } | 217 | } |
218 | /* wait until we get a transfer done or error */ | 218 | /* wait until we get a transfer done or error */ |
219 | timeout = jiffies + HZ/100 + 1; /* 10ms */ | 219 | timeout = jiffies + HZ/100 + 1; /* 10ms */ |
220 | /* first read usually delivers bogus results... */ | ||
221 | saa7146_i2c_status(dev); | ||
220 | while(1) { | 222 | while(1) { |
221 | /** | ||
222 | * first read usually delivers bogus results... | ||
223 | */ | ||
224 | saa7146_i2c_status(dev); | ||
225 | status = saa7146_i2c_status(dev); | 223 | status = saa7146_i2c_status(dev); |
226 | if ((status & 0x3) != 1) | 224 | if ((status & 0x3) != 1) |
227 | break; | 225 | break; |
@@ -232,10 +230,10 @@ static int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword, int short_d | |||
232 | DEB_I2C(("saa7146_i2c_writeout: timed out waiting for end of xfer\n")); | 230 | DEB_I2C(("saa7146_i2c_writeout: timed out waiting for end of xfer\n")); |
233 | return -EIO; | 231 | return -EIO; |
234 | } | 232 | } |
235 | if ((++trial < 20) && short_delay) | 233 | if (++trial < 50 && short_delay) |
236 | udelay(10); | 234 | udelay(10); |
237 | else | 235 | else |
238 | msleep(1); | 236 | msleep(1); |
239 | } | 237 | } |
240 | } | 238 | } |
241 | 239 | ||
diff --git a/drivers/media/dvb/b2c2/flexcop-usb.c b/drivers/media/dvb/b2c2/flexcop-usb.c index 2853ea1bdaf1..87fb75f0d1cf 100644 --- a/drivers/media/dvb/b2c2/flexcop-usb.c +++ b/drivers/media/dvb/b2c2/flexcop-usb.c | |||
@@ -246,7 +246,7 @@ static int flexcop_usb_i2c_req(struct flexcop_usb *fc_usb, | |||
246 | wIndex = (chipaddr << 8 ) | addr; | 246 | wIndex = (chipaddr << 8 ) | addr; |
247 | 247 | ||
248 | deb_i2c("i2c %2d: %02x %02x %02x %02x %02x %02x\n",func,request_type,req, | 248 | deb_i2c("i2c %2d: %02x %02x %02x %02x %02x %02x\n",func,request_type,req, |
249 | ((wValue && 0xff) << 8),wValue >> 8,((wIndex && 0xff) << 8),wIndex >> 8); | 249 | wValue & 0xff, wValue >> 8, wIndex & 0xff, wIndex >> 8); |
250 | 250 | ||
251 | len = usb_control_msg(fc_usb->udev,pipe, | 251 | len = usb_control_msg(fc_usb->udev,pipe, |
252 | req, | 252 | req, |
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 53304e6991ac..a2ab2eebfc68 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c | |||
@@ -348,7 +348,7 @@ static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wra | |||
348 | 348 | ||
349 | static void dvb_frontend_swzigzag(struct dvb_frontend *fe) | 349 | static void dvb_frontend_swzigzag(struct dvb_frontend *fe) |
350 | { | 350 | { |
351 | fe_status_t s; | 351 | fe_status_t s = 0; |
352 | struct dvb_frontend_private *fepriv = fe->frontend_priv; | 352 | struct dvb_frontend_private *fepriv = fe->frontend_priv; |
353 | 353 | ||
354 | /* if we've got no parameters, just keep idling */ | 354 | /* if we've got no parameters, just keep idling */ |
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig index 2cc5caa26a0a..a263b3f3c21d 100644 --- a/drivers/media/dvb/dvb-usb/Kconfig +++ b/drivers/media/dvb/dvb-usb/Kconfig | |||
@@ -26,7 +26,7 @@ config DVB_USB_A800 | |||
26 | tristate "AVerMedia AverTV DVB-T USB 2.0 (A800)" | 26 | tristate "AVerMedia AverTV DVB-T USB 2.0 (A800)" |
27 | depends on DVB_USB | 27 | depends on DVB_USB |
28 | select DVB_DIB3000MC | 28 | select DVB_DIB3000MC |
29 | select DVB_TUNER_MT2060 | 29 | select DVB_TUNER_MT2060 if !DVB_FE_CUSTOMISE |
30 | help | 30 | help |
31 | Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 (A800) receiver. | 31 | Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 (A800) receiver. |
32 | 32 | ||
@@ -34,7 +34,7 @@ config DVB_USB_DIBUSB_MB | |||
34 | tristate "DiBcom USB DVB-T devices (based on the DiB3000M-B) (see help for device list)" | 34 | tristate "DiBcom USB DVB-T devices (based on the DiB3000M-B) (see help for device list)" |
35 | depends on DVB_USB | 35 | depends on DVB_USB |
36 | select DVB_DIB3000MB | 36 | select DVB_DIB3000MB |
37 | select DVB_TUNER_MT2060 | 37 | select DVB_TUNER_MT2060 if !DVB_FE_CUSTOMISE |
38 | help | 38 | help |
39 | Support for USB 1.1 and 2.0 DVB-T receivers based on reference designs made by | 39 | Support for USB 1.1 and 2.0 DVB-T receivers based on reference designs made by |
40 | DiBcom (<http://www.dibcom.fr>) equipped with a DiB3000M-B demodulator. | 40 | DiBcom (<http://www.dibcom.fr>) equipped with a DiB3000M-B demodulator. |
@@ -55,7 +55,7 @@ config DVB_USB_DIBUSB_MC | |||
55 | tristate "DiBcom USB DVB-T devices (based on the DiB3000M-C/P) (see help for device list)" | 55 | tristate "DiBcom USB DVB-T devices (based on the DiB3000M-C/P) (see help for device list)" |
56 | depends on DVB_USB | 56 | depends on DVB_USB |
57 | select DVB_DIB3000MC | 57 | select DVB_DIB3000MC |
58 | select DVB_TUNER_MT2060 | 58 | select DVB_TUNER_MT2060 if !DVB_FE_CUSTOMISE |
59 | help | 59 | help |
60 | Support for USB2.0 DVB-T receivers based on reference designs made by | 60 | Support for USB2.0 DVB-T receivers based on reference designs made by |
61 | DiBcom (<http://www.dibcom.fr>) equipped with a DiB3000M-C/P demodulator. | 61 | DiBcom (<http://www.dibcom.fr>) equipped with a DiB3000M-C/P demodulator. |
@@ -70,7 +70,7 @@ config DVB_USB_DIB0700 | |||
70 | tristate "DiBcom DiB0700 USB DVB devices (see help for supported devices)" | 70 | tristate "DiBcom DiB0700 USB DVB devices (see help for supported devices)" |
71 | depends on DVB_USB | 71 | depends on DVB_USB |
72 | select DVB_DIB3000MC | 72 | select DVB_DIB3000MC |
73 | select DVB_TUNER_MT2060 | 73 | select DVB_TUNER_MT2060 if !DVB_FE_CUSTOMISE |
74 | help | 74 | help |
75 | Support for USB2.0/1.1 DVB receivers based on the DiB0700 USB bridge. The | 75 | Support for USB2.0/1.1 DVB receivers based on the DiB0700 USB bridge. The |
76 | USB bridge is also present in devices having the DiB7700 DVB-T-USB | 76 | USB bridge is also present in devices having the DiB7700 DVB-T-USB |
@@ -87,7 +87,7 @@ config DVB_USB_UMT_010 | |||
87 | tristate "HanfTek UMT-010 DVB-T USB2.0 support" | 87 | tristate "HanfTek UMT-010 DVB-T USB2.0 support" |
88 | depends on DVB_USB | 88 | depends on DVB_USB |
89 | select DVB_DIB3000MC | 89 | select DVB_DIB3000MC |
90 | select DVB_TUNER_MT2060 | 90 | select DVB_TUNER_MT2060 if !DVB_FE_CUSTOMISE |
91 | help | 91 | help |
92 | Say Y here to support the HanfTek UMT-010 USB2.0 stick-sized DVB-T receiver. | 92 | Say Y here to support the HanfTek UMT-010 USB2.0 stick-sized DVB-T receiver. |
93 | 93 | ||
@@ -153,7 +153,7 @@ config DVB_USB_NOVA_T_USB2 | |||
153 | tristate "Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 support" | 153 | tristate "Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 support" |
154 | depends on DVB_USB | 154 | depends on DVB_USB |
155 | select DVB_DIB3000MC | 155 | select DVB_DIB3000MC |
156 | select DVB_TUNER_MT2060 | 156 | select DVB_TUNER_MT2060 if !DVB_FE_CUSTOMISE |
157 | help | 157 | help |
158 | Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 receiver. | 158 | Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 receiver. |
159 | 159 | ||
diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig index 080fa257a0bc..aebb8d6f26f8 100644 --- a/drivers/media/dvb/frontends/Kconfig +++ b/drivers/media/dvb/frontends/Kconfig | |||
@@ -276,6 +276,8 @@ config DVB_TDA826X | |||
276 | 276 | ||
277 | config DVB_TUNER_MT2060 | 277 | config DVB_TUNER_MT2060 |
278 | tristate "Microtune MT2060 silicon IF tuner" | 278 | tristate "Microtune MT2060 silicon IF tuner" |
279 | depends on I2C | ||
280 | default m if DVB_FE_CUSTOMISE | ||
279 | help | 281 | help |
280 | A driver for the silicon IF tuner MT2060 from Microtune. | 282 | A driver for the silicon IF tuner MT2060 from Microtune. |
281 | 283 | ||
diff --git a/drivers/media/dvb/frontends/bcm3510.h b/drivers/media/dvb/frontends/bcm3510.h index 6dfa839a7022..7e4f95e1734b 100644 --- a/drivers/media/dvb/frontends/bcm3510.h +++ b/drivers/media/dvb/frontends/bcm3510.h | |||
@@ -34,7 +34,7 @@ struct bcm3510_config | |||
34 | int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name); | 34 | int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name); |
35 | }; | 35 | }; |
36 | 36 | ||
37 | #if defined(CONFIG_DVB_BCM3510) || defined(CONFIG_DVB_BCM3510_MODULE) | 37 | #if defined(CONFIG_DVB_BCM3510) || (defined(CONFIG_DVB_BCM3510_MODULE) && defined(MODULE)) |
38 | extern struct dvb_frontend* bcm3510_attach(const struct bcm3510_config* config, | 38 | extern struct dvb_frontend* bcm3510_attach(const struct bcm3510_config* config, |
39 | struct i2c_adapter* i2c); | 39 | struct i2c_adapter* i2c); |
40 | #else | 40 | #else |
diff --git a/drivers/media/dvb/frontends/cx22700.h b/drivers/media/dvb/frontends/cx22700.h index 10286cc29fb4..7ac33690cdcc 100644 --- a/drivers/media/dvb/frontends/cx22700.h +++ b/drivers/media/dvb/frontends/cx22700.h | |||
@@ -31,7 +31,7 @@ struct cx22700_config | |||
31 | u8 demod_address; | 31 | u8 demod_address; |
32 | }; | 32 | }; |
33 | 33 | ||
34 | #if defined(CONFIG_DVB_CX22700) || defined(CONFIG_DVB_CX22700_MODULE) | 34 | #if defined(CONFIG_DVB_CX22700) || (defined(CONFIG_DVB_CX22700_MODULE) && defined(MODULE)) |
35 | extern struct dvb_frontend* cx22700_attach(const struct cx22700_config* config, | 35 | extern struct dvb_frontend* cx22700_attach(const struct cx22700_config* config, |
36 | struct i2c_adapter* i2c); | 36 | struct i2c_adapter* i2c); |
37 | #else | 37 | #else |
diff --git a/drivers/media/dvb/frontends/cx22702.h b/drivers/media/dvb/frontends/cx22702.h index bc217ddf02c0..9cd64da6ee40 100644 --- a/drivers/media/dvb/frontends/cx22702.h +++ b/drivers/media/dvb/frontends/cx22702.h | |||
@@ -41,7 +41,7 @@ struct cx22702_config | |||
41 | u8 output_mode; | 41 | u8 output_mode; |
42 | }; | 42 | }; |
43 | 43 | ||
44 | #if defined(CONFIG_DVB_CX22702) || defined(CONFIG_DVB_CX22702_MODULE) | 44 | #if defined(CONFIG_DVB_CX22702) || (defined(CONFIG_DVB_CX22702_MODULE) && defined(MODULE)) |
45 | extern struct dvb_frontend* cx22702_attach(const struct cx22702_config* config, | 45 | extern struct dvb_frontend* cx22702_attach(const struct cx22702_config* config, |
46 | struct i2c_adapter* i2c); | 46 | struct i2c_adapter* i2c); |
47 | #else | 47 | #else |
diff --git a/drivers/media/dvb/frontends/cx24110.h b/drivers/media/dvb/frontends/cx24110.h index c9d5ae250ebb..0ca3af4db513 100644 --- a/drivers/media/dvb/frontends/cx24110.h +++ b/drivers/media/dvb/frontends/cx24110.h | |||
@@ -41,7 +41,7 @@ static inline int cx24110_pll_write(struct dvb_frontend *fe, u32 val) { | |||
41 | return r; | 41 | return r; |
42 | } | 42 | } |
43 | 43 | ||
44 | #if defined(CONFIG_DVB_CX24110) || defined(CONFIG_DVB_CX24110_MODULE) | 44 | #if defined(CONFIG_DVB_CX24110) || (defined(CONFIG_DVB_CX24110_MODULE) && defined(MODULE)) |
45 | extern struct dvb_frontend* cx24110_attach(const struct cx24110_config* config, | 45 | extern struct dvb_frontend* cx24110_attach(const struct cx24110_config* config, |
46 | struct i2c_adapter* i2c); | 46 | struct i2c_adapter* i2c); |
47 | #else | 47 | #else |
diff --git a/drivers/media/dvb/frontends/cx24123.h b/drivers/media/dvb/frontends/cx24123.h index 57a1dae1dc40..84f9e4f5c15e 100644 --- a/drivers/media/dvb/frontends/cx24123.h +++ b/drivers/media/dvb/frontends/cx24123.h | |||
@@ -35,7 +35,7 @@ struct cx24123_config | |||
35 | int lnb_polarity; | 35 | int lnb_polarity; |
36 | }; | 36 | }; |
37 | 37 | ||
38 | #if defined(CONFIG_DVB_CX24123) || defined(CONFIG_DVB_CX24123_MODULE) | 38 | #if defined(CONFIG_DVB_CX24123) || (defined(CONFIG_DVB_CX24123_MODULE) && defined(MODULE)) |
39 | extern struct dvb_frontend* cx24123_attach(const struct cx24123_config* config, | 39 | extern struct dvb_frontend* cx24123_attach(const struct cx24123_config* config, |
40 | struct i2c_adapter* i2c); | 40 | struct i2c_adapter* i2c); |
41 | #else | 41 | #else |
diff --git a/drivers/media/dvb/frontends/dib3000.h b/drivers/media/dvb/frontends/dib3000.h index 0caac3f0f279..a6d3854a67bc 100644 --- a/drivers/media/dvb/frontends/dib3000.h +++ b/drivers/media/dvb/frontends/dib3000.h | |||
@@ -41,7 +41,7 @@ struct dib_fe_xfer_ops | |||
41 | int (*tuner_pass_ctrl)(struct dvb_frontend *fe, int onoff, u8 pll_ctrl); | 41 | int (*tuner_pass_ctrl)(struct dvb_frontend *fe, int onoff, u8 pll_ctrl); |
42 | }; | 42 | }; |
43 | 43 | ||
44 | #if defined(CONFIG_DVB_DIB3000MB) || defined(CONFIG_DVB_DIB3000MB_MODULE) | 44 | #if defined(CONFIG_DVB_DIB3000MB) || (defined(CONFIG_DVB_DIB3000MB_MODULE) && defined(MODULE)) |
45 | extern struct dvb_frontend* dib3000mb_attach(const struct dib3000_config* config, | 45 | extern struct dvb_frontend* dib3000mb_attach(const struct dib3000_config* config, |
46 | struct i2c_adapter* i2c, struct dib_fe_xfer_ops *xfer_ops); | 46 | struct i2c_adapter* i2c, struct dib_fe_xfer_ops *xfer_ops); |
47 | #else | 47 | #else |
diff --git a/drivers/media/dvb/frontends/dib3000mc.h b/drivers/media/dvb/frontends/dib3000mc.h index 0d6fdef77538..72d4757601d8 100644 --- a/drivers/media/dvb/frontends/dib3000mc.h +++ b/drivers/media/dvb/frontends/dib3000mc.h | |||
@@ -39,7 +39,7 @@ struct dib3000mc_config { | |||
39 | #define DEFAULT_DIB3000MC_I2C_ADDRESS 16 | 39 | #define DEFAULT_DIB3000MC_I2C_ADDRESS 16 |
40 | #define DEFAULT_DIB3000P_I2C_ADDRESS 24 | 40 | #define DEFAULT_DIB3000P_I2C_ADDRESS 24 |
41 | 41 | ||
42 | #if defined(CONFIG_DVB_DIB3000MC) || defined(CONFIG_DVB_DIB3000MC_MODULE) | 42 | #if defined(CONFIG_DVB_DIB3000MC) || (defined(CONFIG_DVB_DIB3000MC_MODULE) && defined(MODULE)) |
43 | extern struct dvb_frontend * dib3000mc_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib3000mc_config *cfg); | 43 | extern struct dvb_frontend * dib3000mc_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib3000mc_config *cfg); |
44 | #else | 44 | #else |
45 | static inline struct dvb_frontend * dib3000mc_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib3000mc_config *cfg) | 45 | static inline struct dvb_frontend * dib3000mc_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib3000mc_config *cfg) |
diff --git a/drivers/media/dvb/frontends/isl6421.h b/drivers/media/dvb/frontends/isl6421.h index 1916e3eb2df3..ea7f78a7d3cd 100644 --- a/drivers/media/dvb/frontends/isl6421.h +++ b/drivers/media/dvb/frontends/isl6421.h | |||
@@ -39,7 +39,7 @@ | |||
39 | #define ISL6421_ISEL1 0x20 | 39 | #define ISL6421_ISEL1 0x20 |
40 | #define ISL6421_DCL 0x40 | 40 | #define ISL6421_DCL 0x40 |
41 | 41 | ||
42 | #if defined(CONFIG_DVB_ISL6421) || defined(CONFIG_DVB_ISL6421_MODULE) | 42 | #if defined(CONFIG_DVB_ISL6421) || (defined(CONFIG_DVB_ISL6421_MODULE) && defined(MODULE)) |
43 | /* override_set and override_clear control which system register bits (above) to always set & clear */ | 43 | /* override_set and override_clear control which system register bits (above) to always set & clear */ |
44 | extern struct dvb_frontend *isl6421_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, u8 i2c_addr, | 44 | extern struct dvb_frontend *isl6421_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, u8 i2c_addr, |
45 | u8 override_set, u8 override_clear); | 45 | u8 override_set, u8 override_clear); |
diff --git a/drivers/media/dvb/frontends/l64781.h b/drivers/media/dvb/frontends/l64781.h index 21ba4a230760..cd15f76ff28d 100644 --- a/drivers/media/dvb/frontends/l64781.h +++ b/drivers/media/dvb/frontends/l64781.h | |||
@@ -31,7 +31,7 @@ struct l64781_config | |||
31 | u8 demod_address; | 31 | u8 demod_address; |
32 | }; | 32 | }; |
33 | 33 | ||
34 | #if defined(CONFIG_DVB_L64781) || defined(CONFIG_DVB_L64781_MODULE) | 34 | #if defined(CONFIG_DVB_L64781) || (defined(CONFIG_DVB_L64781_MODULE) && defined(MODULE)) |
35 | extern struct dvb_frontend* l64781_attach(const struct l64781_config* config, | 35 | extern struct dvb_frontend* l64781_attach(const struct l64781_config* config, |
36 | struct i2c_adapter* i2c); | 36 | struct i2c_adapter* i2c); |
37 | #else | 37 | #else |
diff --git a/drivers/media/dvb/frontends/lgdt330x.h b/drivers/media/dvb/frontends/lgdt330x.h index 3f96b485584c..995059004b10 100644 --- a/drivers/media/dvb/frontends/lgdt330x.h +++ b/drivers/media/dvb/frontends/lgdt330x.h | |||
@@ -52,7 +52,7 @@ struct lgdt330x_config | |||
52 | int clock_polarity_flip; | 52 | int clock_polarity_flip; |
53 | }; | 53 | }; |
54 | 54 | ||
55 | #if defined(CONFIG_DVB_LGDT330X) || defined(CONFIG_DVB_LGDT330X_MODULE) | 55 | #if defined(CONFIG_DVB_LGDT330X) || (defined(CONFIG_DVB_LGDT330X_MODULE) && defined(MODULE)) |
56 | extern struct dvb_frontend* lgdt330x_attach(const struct lgdt330x_config* config, | 56 | extern struct dvb_frontend* lgdt330x_attach(const struct lgdt330x_config* config, |
57 | struct i2c_adapter* i2c); | 57 | struct i2c_adapter* i2c); |
58 | #else | 58 | #else |
diff --git a/drivers/media/dvb/frontends/lnbp21.h b/drivers/media/dvb/frontends/lnbp21.h index 1fe1dd179312..68906acf7d63 100644 --- a/drivers/media/dvb/frontends/lnbp21.h +++ b/drivers/media/dvb/frontends/lnbp21.h | |||
@@ -39,7 +39,7 @@ | |||
39 | 39 | ||
40 | #include <linux/dvb/frontend.h> | 40 | #include <linux/dvb/frontend.h> |
41 | 41 | ||
42 | #if defined(CONFIG_DVB_LNBP21) || defined(CONFIG_DVB_LNBP21_MODULE) | 42 | #if defined(CONFIG_DVB_LNBP21) || (defined(CONFIG_DVB_LNBP21_MODULE) && defined(MODULE)) |
43 | /* override_set and override_clear control which system register bits (above) to always set & clear */ | 43 | /* override_set and override_clear control which system register bits (above) to always set & clear */ |
44 | extern struct dvb_frontend *lnbp21_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, u8 override_set, u8 override_clear); | 44 | extern struct dvb_frontend *lnbp21_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, u8 override_set, u8 override_clear); |
45 | #else | 45 | #else |
diff --git a/drivers/media/dvb/frontends/mt2060.h b/drivers/media/dvb/frontends/mt2060.h index 34a37c2b556f..0a86eab3a954 100644 --- a/drivers/media/dvb/frontends/mt2060.h +++ b/drivers/media/dvb/frontends/mt2060.h | |||
@@ -30,6 +30,14 @@ struct mt2060_config { | |||
30 | u8 clock_out; /* 0 = off, 1 = CLK/4, 2 = CLK/2, 3 = CLK/1 */ | 30 | u8 clock_out; /* 0 = off, 1 = CLK/4, 2 = CLK/2, 3 = CLK/1 */ |
31 | }; | 31 | }; |
32 | 32 | ||
33 | #if defined(CONFIG_DVB_TUNER_MT2060) || (defined(CONFIG_DVB_TUNER_MT2060_MODULE) && defined(MODULE)) | ||
33 | extern struct dvb_frontend * mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct mt2060_config *cfg, u16 if1); | 34 | extern struct dvb_frontend * mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct mt2060_config *cfg, u16 if1); |
35 | #else | ||
36 | static inline struct dvb_frontend * mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct mt2060_config *cfg, u16 if1) | ||
37 | { | ||
38 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__); | ||
39 | return NULL; | ||
40 | } | ||
41 | #endif // CONFIG_DVB_TUNER_MT2060 | ||
34 | 42 | ||
35 | #endif | 43 | #endif |
diff --git a/drivers/media/dvb/frontends/mt312.h b/drivers/media/dvb/frontends/mt312.h index 7112fb4d58ac..cf9a1505ad4b 100644 --- a/drivers/media/dvb/frontends/mt312.h +++ b/drivers/media/dvb/frontends/mt312.h | |||
@@ -34,7 +34,7 @@ struct mt312_config | |||
34 | u8 demod_address; | 34 | u8 demod_address; |
35 | }; | 35 | }; |
36 | 36 | ||
37 | #if defined(CONFIG_DVB_MT312) || defined(CONFIG_DVB_MT312_MODULE) | 37 | #if defined(CONFIG_DVB_MT312) || (defined(CONFIG_DVB_MT312_MODULE) && defined(MODULE)) |
38 | struct dvb_frontend* vp310_mt312_attach(const struct mt312_config* config, | 38 | struct dvb_frontend* vp310_mt312_attach(const struct mt312_config* config, |
39 | struct i2c_adapter* i2c); | 39 | struct i2c_adapter* i2c); |
40 | #else | 40 | #else |
diff --git a/drivers/media/dvb/frontends/mt352.h b/drivers/media/dvb/frontends/mt352.h index 0035c2e2d7c2..e9964081fd84 100644 --- a/drivers/media/dvb/frontends/mt352.h +++ b/drivers/media/dvb/frontends/mt352.h | |||
@@ -51,7 +51,7 @@ struct mt352_config | |||
51 | int (*demod_init)(struct dvb_frontend* fe); | 51 | int (*demod_init)(struct dvb_frontend* fe); |
52 | }; | 52 | }; |
53 | 53 | ||
54 | #if defined(CONFIG_DVB_MT352) || defined(CONFIG_DVB_MT352_MODULE) | 54 | #if defined(CONFIG_DVB_MT352) || (defined(CONFIG_DVB_MT352_MODULE) && defined(MODULE)) |
55 | extern struct dvb_frontend* mt352_attach(const struct mt352_config* config, | 55 | extern struct dvb_frontend* mt352_attach(const struct mt352_config* config, |
56 | struct i2c_adapter* i2c); | 56 | struct i2c_adapter* i2c); |
57 | #else | 57 | #else |
diff --git a/drivers/media/dvb/frontends/nxt200x.h b/drivers/media/dvb/frontends/nxt200x.h index 2eb220e98062..28bc5591b319 100644 --- a/drivers/media/dvb/frontends/nxt200x.h +++ b/drivers/media/dvb/frontends/nxt200x.h | |||
@@ -45,7 +45,7 @@ struct nxt200x_config | |||
45 | int (*set_ts_params)(struct dvb_frontend* fe, int is_punctured); | 45 | int (*set_ts_params)(struct dvb_frontend* fe, int is_punctured); |
46 | }; | 46 | }; |
47 | 47 | ||
48 | #if defined(CONFIG_DVB_NXT200X) || defined(CONFIG_DVB_NXT200X_MODULE) | 48 | #if defined(CONFIG_DVB_NXT200X) || (defined(CONFIG_DVB_NXT200X_MODULE) && defined(MODULE)) |
49 | extern struct dvb_frontend* nxt200x_attach(const struct nxt200x_config* config, | 49 | extern struct dvb_frontend* nxt200x_attach(const struct nxt200x_config* config, |
50 | struct i2c_adapter* i2c); | 50 | struct i2c_adapter* i2c); |
51 | #else | 51 | #else |
diff --git a/drivers/media/dvb/frontends/nxt6000.h b/drivers/media/dvb/frontends/nxt6000.h index 9397393a6bd1..13d22518356e 100644 --- a/drivers/media/dvb/frontends/nxt6000.h +++ b/drivers/media/dvb/frontends/nxt6000.h | |||
@@ -33,7 +33,7 @@ struct nxt6000_config | |||
33 | u8 clock_inversion:1; | 33 | u8 clock_inversion:1; |
34 | }; | 34 | }; |
35 | 35 | ||
36 | #if defined(CONFIG_DVB_NXT6000) || defined(CONFIG_DVB_NXT6000_MODULE) | 36 | #if defined(CONFIG_DVB_NXT6000) || (defined(CONFIG_DVB_NXT6000_MODULE) && defined(MODULE)) |
37 | extern struct dvb_frontend* nxt6000_attach(const struct nxt6000_config* config, | 37 | extern struct dvb_frontend* nxt6000_attach(const struct nxt6000_config* config, |
38 | struct i2c_adapter* i2c); | 38 | struct i2c_adapter* i2c); |
39 | #else | 39 | #else |
diff --git a/drivers/media/dvb/frontends/or51132.h b/drivers/media/dvb/frontends/or51132.h index 9718be4fb835..add24f0a743b 100644 --- a/drivers/media/dvb/frontends/or51132.h +++ b/drivers/media/dvb/frontends/or51132.h | |||
@@ -34,7 +34,7 @@ struct or51132_config | |||
34 | int (*set_ts_params)(struct dvb_frontend* fe, int is_punctured); | 34 | int (*set_ts_params)(struct dvb_frontend* fe, int is_punctured); |
35 | }; | 35 | }; |
36 | 36 | ||
37 | #if defined(CONFIG_DVB_OR51132) || defined(CONFIG_DVB_OR51132_MODULE) | 37 | #if defined(CONFIG_DVB_OR51132) || (defined(CONFIG_DVB_OR51132_MODULE) && defined(MODULE)) |
38 | extern struct dvb_frontend* or51132_attach(const struct or51132_config* config, | 38 | extern struct dvb_frontend* or51132_attach(const struct or51132_config* config, |
39 | struct i2c_adapter* i2c); | 39 | struct i2c_adapter* i2c); |
40 | #else | 40 | #else |
diff --git a/drivers/media/dvb/frontends/or51211.h b/drivers/media/dvb/frontends/or51211.h index 10a5419f9e00..8aad8402d615 100644 --- a/drivers/media/dvb/frontends/or51211.h +++ b/drivers/media/dvb/frontends/or51211.h | |||
@@ -37,7 +37,7 @@ struct or51211_config | |||
37 | void (*sleep)(struct dvb_frontend * fe); | 37 | void (*sleep)(struct dvb_frontend * fe); |
38 | }; | 38 | }; |
39 | 39 | ||
40 | #if defined(CONFIG_DVB_OR51211) || defined(CONFIG_DVB_OR51211_MODULE) | 40 | #if defined(CONFIG_DVB_OR51211) || (defined(CONFIG_DVB_OR51211_MODULE) && defined(MODULE)) |
41 | extern struct dvb_frontend* or51211_attach(const struct or51211_config* config, | 41 | extern struct dvb_frontend* or51211_attach(const struct or51211_config* config, |
42 | struct i2c_adapter* i2c); | 42 | struct i2c_adapter* i2c); |
43 | #else | 43 | #else |
diff --git a/drivers/media/dvb/frontends/s5h1420.h b/drivers/media/dvb/frontends/s5h1420.h index efc54d7f3c55..1555870f7226 100644 --- a/drivers/media/dvb/frontends/s5h1420.h +++ b/drivers/media/dvb/frontends/s5h1420.h | |||
@@ -34,7 +34,7 @@ struct s5h1420_config | |||
34 | u8 invert:1; | 34 | u8 invert:1; |
35 | }; | 35 | }; |
36 | 36 | ||
37 | #if defined(CONFIG_DVB_S5H1420) || defined(CONFIG_DVB_S5H1420_MODULE) | 37 | #if defined(CONFIG_DVB_S5H1420) || (defined(CONFIG_DVB_S5H1420_MODULE) && defined(MODULE)) |
38 | extern struct dvb_frontend* s5h1420_attach(const struct s5h1420_config* config, | 38 | extern struct dvb_frontend* s5h1420_attach(const struct s5h1420_config* config, |
39 | struct i2c_adapter* i2c); | 39 | struct i2c_adapter* i2c); |
40 | #else | 40 | #else |
diff --git a/drivers/media/dvb/frontends/sp8870.h b/drivers/media/dvb/frontends/sp8870.h index 4cf27d3b10f2..909cefe7139e 100644 --- a/drivers/media/dvb/frontends/sp8870.h +++ b/drivers/media/dvb/frontends/sp8870.h | |||
@@ -35,7 +35,7 @@ struct sp8870_config | |||
35 | int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name); | 35 | int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name); |
36 | }; | 36 | }; |
37 | 37 | ||
38 | #if defined(CONFIG_DVB_SP8870) || defined(CONFIG_DVB_SP8870_MODULE) | 38 | #if defined(CONFIG_DVB_SP8870) || (defined(CONFIG_DVB_SP8870_MODULE) && defined(MODULE)) |
39 | extern struct dvb_frontend* sp8870_attach(const struct sp8870_config* config, | 39 | extern struct dvb_frontend* sp8870_attach(const struct sp8870_config* config, |
40 | struct i2c_adapter* i2c); | 40 | struct i2c_adapter* i2c); |
41 | #else | 41 | #else |
diff --git a/drivers/media/dvb/frontends/sp887x.h b/drivers/media/dvb/frontends/sp887x.h index cab7ea644dfa..7ee78d7d916d 100644 --- a/drivers/media/dvb/frontends/sp887x.h +++ b/drivers/media/dvb/frontends/sp887x.h | |||
@@ -17,7 +17,7 @@ struct sp887x_config | |||
17 | int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name); | 17 | int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name); |
18 | }; | 18 | }; |
19 | 19 | ||
20 | #if defined(CONFIG_DVB_SP887X) || defined(CONFIG_DVB_SP887X_MODULE) | 20 | #if defined(CONFIG_DVB_SP887X) || (defined(CONFIG_DVB_SP887X_MODULE) && defined(MODULE)) |
21 | extern struct dvb_frontend* sp887x_attach(const struct sp887x_config* config, | 21 | extern struct dvb_frontend* sp887x_attach(const struct sp887x_config* config, |
22 | struct i2c_adapter* i2c); | 22 | struct i2c_adapter* i2c); |
23 | #else | 23 | #else |
diff --git a/drivers/media/dvb/frontends/stv0297.h b/drivers/media/dvb/frontends/stv0297.h index 760b80db43a5..69f4515df2b9 100644 --- a/drivers/media/dvb/frontends/stv0297.h +++ b/drivers/media/dvb/frontends/stv0297.h | |||
@@ -42,7 +42,7 @@ struct stv0297_config | |||
42 | u8 stop_during_read:1; | 42 | u8 stop_during_read:1; |
43 | }; | 43 | }; |
44 | 44 | ||
45 | #if defined(CONFIG_DVB_STV0297) || defined(CONFIG_DVB_STV0297_MODULE) | 45 | #if defined(CONFIG_DVB_STV0297) || (defined(CONFIG_DVB_STV0297_MODULE) && defined(MODULE)) |
46 | extern struct dvb_frontend* stv0297_attach(const struct stv0297_config* config, | 46 | extern struct dvb_frontend* stv0297_attach(const struct stv0297_config* config, |
47 | struct i2c_adapter* i2c); | 47 | struct i2c_adapter* i2c); |
48 | #else | 48 | #else |
diff --git a/drivers/media/dvb/frontends/stv0299.h b/drivers/media/dvb/frontends/stv0299.h index 7ef25207081d..33df9495908f 100644 --- a/drivers/media/dvb/frontends/stv0299.h +++ b/drivers/media/dvb/frontends/stv0299.h | |||
@@ -89,7 +89,7 @@ struct stv0299_config | |||
89 | int (*set_symbol_rate)(struct dvb_frontend* fe, u32 srate, u32 ratio); | 89 | int (*set_symbol_rate)(struct dvb_frontend* fe, u32 srate, u32 ratio); |
90 | }; | 90 | }; |
91 | 91 | ||
92 | #if defined(CONFIG_DVB_STV0299) || defined(CONFIG_DVB_STV0299_MODULE) | 92 | #if defined(CONFIG_DVB_STV0299) || (defined(CONFIG_DVB_STV0299_MODULE) && defined(MODULE)) |
93 | extern struct dvb_frontend* stv0299_attach(const struct stv0299_config* config, | 93 | extern struct dvb_frontend* stv0299_attach(const struct stv0299_config* config, |
94 | struct i2c_adapter* i2c); | 94 | struct i2c_adapter* i2c); |
95 | #else | 95 | #else |
diff --git a/drivers/media/dvb/frontends/tda10021.h b/drivers/media/dvb/frontends/tda10021.h index d68ae20c8412..e3da780108f6 100644 --- a/drivers/media/dvb/frontends/tda10021.h +++ b/drivers/media/dvb/frontends/tda10021.h | |||
@@ -32,7 +32,7 @@ struct tda10021_config | |||
32 | u8 demod_address; | 32 | u8 demod_address; |
33 | }; | 33 | }; |
34 | 34 | ||
35 | #if defined(CONFIG_DVB_TDA10021) || defined(CONFIG_DVB_TDA10021_MODULE) | 35 | #if defined(CONFIG_DVB_TDA10021) || (defined(CONFIG_DVB_TDA10021_MODULE) && defined(MODULE)) |
36 | extern struct dvb_frontend* tda10021_attach(const struct tda10021_config* config, | 36 | extern struct dvb_frontend* tda10021_attach(const struct tda10021_config* config, |
37 | struct i2c_adapter* i2c, u8 pwm); | 37 | struct i2c_adapter* i2c, u8 pwm); |
38 | #else | 38 | #else |
diff --git a/drivers/media/dvb/frontends/tda1004x.h b/drivers/media/dvb/frontends/tda1004x.h index e28fca05734c..605ad2dfc09d 100644 --- a/drivers/media/dvb/frontends/tda1004x.h +++ b/drivers/media/dvb/frontends/tda1004x.h | |||
@@ -71,7 +71,7 @@ struct tda1004x_config | |||
71 | int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name); | 71 | int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name); |
72 | }; | 72 | }; |
73 | 73 | ||
74 | #if defined(CONFIG_DVB_TDA1004X) || defined(CONFIG_DVB_TDA1004X_MODULE) | 74 | #if defined(CONFIG_DVB_TDA1004X) || (defined(CONFIG_DVB_TDA1004X_MODULE) && defined(MODULE)) |
75 | extern struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config, | 75 | extern struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config, |
76 | struct i2c_adapter* i2c); | 76 | struct i2c_adapter* i2c); |
77 | 77 | ||
diff --git a/drivers/media/dvb/frontends/tda10086.c b/drivers/media/dvb/frontends/tda10086.c index 7456b0b9976b..4c27a2d90a38 100644 --- a/drivers/media/dvb/frontends/tda10086.c +++ b/drivers/media/dvb/frontends/tda10086.c | |||
@@ -441,6 +441,10 @@ static int tda10086_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_pa | |||
441 | 441 | ||
442 | dprintk ("%s\n", __FUNCTION__); | 442 | dprintk ("%s\n", __FUNCTION__); |
443 | 443 | ||
444 | // check for invalid symbol rate | ||
445 | if (fe_params->u.qpsk.symbol_rate < 500000) | ||
446 | return -EINVAL; | ||
447 | |||
444 | // calculate the updated frequency (note: we convert from Hz->kHz) | 448 | // calculate the updated frequency (note: we convert from Hz->kHz) |
445 | tmp64 = tda10086_read_byte(state, 0x52); | 449 | tmp64 = tda10086_read_byte(state, 0x52); |
446 | tmp64 |= (tda10086_read_byte(state, 0x51) << 8); | 450 | tmp64 |= (tda10086_read_byte(state, 0x51) << 8); |
diff --git a/drivers/media/dvb/frontends/tda10086.h b/drivers/media/dvb/frontends/tda10086.h index 18457adee30b..ed584a8f4a89 100644 --- a/drivers/media/dvb/frontends/tda10086.h +++ b/drivers/media/dvb/frontends/tda10086.h | |||
@@ -35,7 +35,7 @@ struct tda10086_config | |||
35 | u8 invert; | 35 | u8 invert; |
36 | }; | 36 | }; |
37 | 37 | ||
38 | #if defined(CONFIG_DVB_TDA10086) || defined(CONFIG_DVB_TDA10086_MODULE) | 38 | #if defined(CONFIG_DVB_TDA10086) || (defined(CONFIG_DVB_TDA10086_MODULE) && defined(MODULE)) |
39 | extern struct dvb_frontend* tda10086_attach(const struct tda10086_config* config, | 39 | extern struct dvb_frontend* tda10086_attach(const struct tda10086_config* config, |
40 | struct i2c_adapter* i2c); | 40 | struct i2c_adapter* i2c); |
41 | #else | 41 | #else |
diff --git a/drivers/media/dvb/frontends/tda8083.h b/drivers/media/dvb/frontends/tda8083.h index aae15bdce6eb..2d3307999f21 100644 --- a/drivers/media/dvb/frontends/tda8083.h +++ b/drivers/media/dvb/frontends/tda8083.h | |||
@@ -35,7 +35,7 @@ struct tda8083_config | |||
35 | u8 demod_address; | 35 | u8 demod_address; |
36 | }; | 36 | }; |
37 | 37 | ||
38 | #if defined(CONFIG_DVB_TDA8083) || defined(CONFIG_DVB_TDA8083_MODULE) | 38 | #if defined(CONFIG_DVB_TDA8083) || (defined(CONFIG_DVB_TDA8083_MODULE) && defined(MODULE)) |
39 | extern struct dvb_frontend* tda8083_attach(const struct tda8083_config* config, | 39 | extern struct dvb_frontend* tda8083_attach(const struct tda8083_config* config, |
40 | struct i2c_adapter* i2c); | 40 | struct i2c_adapter* i2c); |
41 | #else | 41 | #else |
diff --git a/drivers/media/dvb/frontends/tda826x.c b/drivers/media/dvb/frontends/tda826x.c index eeab26bd36ed..34815b0b97e4 100644 --- a/drivers/media/dvb/frontends/tda826x.c +++ b/drivers/media/dvb/frontends/tda826x.c | |||
@@ -121,7 +121,7 @@ static struct dvb_tuner_ops tda826x_tuner_ops = { | |||
121 | .info = { | 121 | .info = { |
122 | .name = "Philips TDA826X", | 122 | .name = "Philips TDA826X", |
123 | .frequency_min = 950000, | 123 | .frequency_min = 950000, |
124 | .frequency_min = 2175000 | 124 | .frequency_max = 2175000 |
125 | }, | 125 | }, |
126 | .release = tda826x_release, | 126 | .release = tda826x_release, |
127 | .sleep = tda826x_sleep, | 127 | .sleep = tda826x_sleep, |
diff --git a/drivers/media/dvb/frontends/tda826x.h b/drivers/media/dvb/frontends/tda826x.h index 83998c001196..ad9981195961 100644 --- a/drivers/media/dvb/frontends/tda826x.h +++ b/drivers/media/dvb/frontends/tda826x.h | |||
@@ -35,7 +35,7 @@ | |||
35 | * @param has_loopthrough Set to 1 if the card has a loopthrough RF connector. | 35 | * @param has_loopthrough Set to 1 if the card has a loopthrough RF connector. |
36 | * @return FE pointer on success, NULL on failure. | 36 | * @return FE pointer on success, NULL on failure. |
37 | */ | 37 | */ |
38 | #if defined(CONFIG_DVB_TDA826X) || defined(CONFIG_DVB_TDA826X_MODULE) | 38 | #if defined(CONFIG_DVB_TDA826X) || (defined(CONFIG_DVB_TDA826X_MODULE) && defined(MODULE)) |
39 | extern struct dvb_frontend* tda826x_attach(struct dvb_frontend *fe, int addr, | 39 | extern struct dvb_frontend* tda826x_attach(struct dvb_frontend *fe, int addr, |
40 | struct i2c_adapter *i2c, | 40 | struct i2c_adapter *i2c, |
41 | int has_loopthrough); | 41 | int has_loopthrough); |
diff --git a/drivers/media/dvb/frontends/tua6100.h b/drivers/media/dvb/frontends/tua6100.h index 8f98033ffa7b..03a665e7df6d 100644 --- a/drivers/media/dvb/frontends/tua6100.h +++ b/drivers/media/dvb/frontends/tua6100.h | |||
@@ -34,7 +34,7 @@ | |||
34 | #include <linux/i2c.h> | 34 | #include <linux/i2c.h> |
35 | #include "dvb_frontend.h" | 35 | #include "dvb_frontend.h" |
36 | 36 | ||
37 | #if defined(CONFIG_DVB_TUA6100) || defined(CONFIG_DVB_TUA6100_MODULE) | 37 | #if defined(CONFIG_DVB_TUA6100) || (defined(CONFIG_DVB_TUA6100_MODULE) && defined(MODULE)) |
38 | extern struct dvb_frontend *tua6100_attach(struct dvb_frontend *fe, int addr, struct i2c_adapter *i2c); | 38 | extern struct dvb_frontend *tua6100_attach(struct dvb_frontend *fe, int addr, struct i2c_adapter *i2c); |
39 | #else | 39 | #else |
40 | static inline struct dvb_frontend* tua6100_attach(struct dvb_frontend *fe, int addr, struct i2c_adapter *i2c) | 40 | static inline struct dvb_frontend* tua6100_attach(struct dvb_frontend *fe, int addr, struct i2c_adapter *i2c) |
diff --git a/drivers/media/dvb/frontends/ves1820.h b/drivers/media/dvb/frontends/ves1820.h index f0c9dded39d7..e4a2a324046a 100644 --- a/drivers/media/dvb/frontends/ves1820.h +++ b/drivers/media/dvb/frontends/ves1820.h | |||
@@ -41,7 +41,7 @@ struct ves1820_config | |||
41 | u8 selagc:1; | 41 | u8 selagc:1; |
42 | }; | 42 | }; |
43 | 43 | ||
44 | #if defined(CONFIG_DVB_VES1820) || defined(CONFIG_DVB_VES1820_MODULE) | 44 | #if defined(CONFIG_DVB_VES1820) || (defined(CONFIG_DVB_VES1820_MODULE) && defined(MODULE)) |
45 | extern struct dvb_frontend* ves1820_attach(const struct ves1820_config* config, | 45 | extern struct dvb_frontend* ves1820_attach(const struct ves1820_config* config, |
46 | struct i2c_adapter* i2c, u8 pwm); | 46 | struct i2c_adapter* i2c, u8 pwm); |
47 | #else | 47 | #else |
diff --git a/drivers/media/dvb/frontends/ves1x93.h b/drivers/media/dvb/frontends/ves1x93.h index 395fed39b286..d507f8966f81 100644 --- a/drivers/media/dvb/frontends/ves1x93.h +++ b/drivers/media/dvb/frontends/ves1x93.h | |||
@@ -40,7 +40,7 @@ struct ves1x93_config | |||
40 | u8 invert_pwm:1; | 40 | u8 invert_pwm:1; |
41 | }; | 41 | }; |
42 | 42 | ||
43 | #if defined(CONFIG_DVB_VES1X93) || defined(CONFIG_DVB_VES1X93_MODULE) | 43 | #if defined(CONFIG_DVB_VES1X93) || (defined(CONFIG_DVB_VES1X93_MODULE) && defined(MODULE)) |
44 | extern struct dvb_frontend* ves1x93_attach(const struct ves1x93_config* config, | 44 | extern struct dvb_frontend* ves1x93_attach(const struct ves1x93_config* config, |
45 | struct i2c_adapter* i2c); | 45 | struct i2c_adapter* i2c); |
46 | #else | 46 | #else |
diff --git a/drivers/media/dvb/frontends/zl10353.h b/drivers/media/dvb/frontends/zl10353.h index 79a947215c4d..0bc0109737f1 100644 --- a/drivers/media/dvb/frontends/zl10353.h +++ b/drivers/media/dvb/frontends/zl10353.h | |||
@@ -36,7 +36,7 @@ struct zl10353_config | |||
36 | int parallel_ts; | 36 | int parallel_ts; |
37 | }; | 37 | }; |
38 | 38 | ||
39 | #if defined(CONFIG_DVB_ZL10353) || defined(CONFIG_DVB_ZL10353_MODULE) | 39 | #if defined(CONFIG_DVB_ZL10353) || (defined(CONFIG_DVB_ZL10353_MODULE) && defined(MODULE)) |
40 | extern struct dvb_frontend* zl10353_attach(const struct zl10353_config *config, | 40 | extern struct dvb_frontend* zl10353_attach(const struct zl10353_config *config, |
41 | struct i2c_adapter *i2c); | 41 | struct i2c_adapter *i2c); |
42 | #else | 42 | #else |
diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c index 2a2e9b400613..cd5ec489af1c 100644 --- a/drivers/media/dvb/ttpci/budget-ci.c +++ b/drivers/media/dvb/ttpci/budget-ci.c | |||
@@ -46,7 +46,14 @@ | |||
46 | #include "bsbe1.h" | 46 | #include "bsbe1.h" |
47 | #include "bsru6.h" | 47 | #include "bsru6.h" |
48 | 48 | ||
49 | #define DEBIADDR_IR 0x1234 | 49 | /* |
50 | * Regarding DEBIADDR_IR: | ||
51 | * Some CI modules hang if random addresses are read. | ||
52 | * Using address 0x4000 for the IR read means that we | ||
53 | * use the same address as for CI version, which should | ||
54 | * be a safe default. | ||
55 | */ | ||
56 | #define DEBIADDR_IR 0x4000 | ||
50 | #define DEBIADDR_CICONTROL 0x0000 | 57 | #define DEBIADDR_CICONTROL 0x0000 |
51 | #define DEBIADDR_CIVERSION 0x4000 | 58 | #define DEBIADDR_CIVERSION 0x4000 |
52 | #define DEBIADDR_IO 0x1000 | 59 | #define DEBIADDR_IO 0x1000 |
@@ -1028,6 +1035,7 @@ static void frontend_init(struct budget_ci *budget_ci) | |||
1028 | 1035 | ||
1029 | case 0x1012: // TT DVB-T CI budget (tda10046/Philips tdm1316l(tda6651tt)) | 1036 | case 0x1012: // TT DVB-T CI budget (tda10046/Philips tdm1316l(tda6651tt)) |
1030 | budget_ci->tuner_pll_address = 0x60; | 1037 | budget_ci->tuner_pll_address = 0x60; |
1038 | philips_tdm1316l_config.invert = 1; | ||
1031 | budget_ci->budget.dvb_frontend = | 1039 | budget_ci->budget.dvb_frontend = |
1032 | dvb_attach(tda10046_attach, &philips_tdm1316l_config, &budget_ci->budget.i2c_adap); | 1040 | dvb_attach(tda10046_attach, &philips_tdm1316l_config, &budget_ci->budget.i2c_adap); |
1033 | if (budget_ci->budget.dvb_frontend) { | 1041 | if (budget_ci->budget.dvb_frontend) { |
diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c index e58f0391e9d1..56f1c80defc6 100644 --- a/drivers/media/dvb/ttpci/budget.c +++ b/drivers/media/dvb/ttpci/budget.c | |||
@@ -46,6 +46,10 @@ | |||
46 | #include "lnbp21.h" | 46 | #include "lnbp21.h" |
47 | #include "bsru6.h" | 47 | #include "bsru6.h" |
48 | 48 | ||
49 | static int diseqc_method; | ||
50 | module_param(diseqc_method, int, 0444); | ||
51 | MODULE_PARM_DESC(diseqc_method, "Select DiSEqC method for subsystem id 13c2:1003, 0: default, 1: more reliable (for newer revisions only)"); | ||
52 | |||
49 | static void Set22K (struct budget *budget, int state) | 53 | static void Set22K (struct budget *budget, int state) |
50 | { | 54 | { |
51 | struct saa7146_dev *dev=budget->dev; | 55 | struct saa7146_dev *dev=budget->dev; |
@@ -382,6 +386,11 @@ static void frontend_init(struct budget *budget) | |||
382 | if (budget->dvb_frontend) { | 386 | if (budget->dvb_frontend) { |
383 | budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; | 387 | budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; |
384 | budget->dvb_frontend->tuner_priv = &budget->i2c_adap; | 388 | budget->dvb_frontend->tuner_priv = &budget->i2c_adap; |
389 | if (budget->dev->pci->subsystem_device == 0x1003 && diseqc_method == 0) { | ||
390 | budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; | ||
391 | budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; | ||
392 | budget->dvb_frontend->ops.set_tone = budget_set_tone; | ||
393 | } | ||
385 | break; | 394 | break; |
386 | } | 395 | } |
387 | break; | 396 | break; |
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index fbe5b6168cc2..bf267552941f 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig | |||
@@ -186,7 +186,7 @@ config VIDEO_KS0127 | |||
186 | 186 | ||
187 | config VIDEO_SAA7110 | 187 | config VIDEO_SAA7110 |
188 | tristate "Philips SAA7110 video decoder" | 188 | tristate "Philips SAA7110 video decoder" |
189 | depends on VIDEO_V4L1 | 189 | depends on VIDEO_V4L1 && I2C |
190 | ---help--- | 190 | ---help--- |
191 | Support for the Philips SAA7110 video decoders. | 191 | Support for the Philips SAA7110 video decoders. |
192 | 192 | ||
diff --git a/drivers/media/video/bt8xx/bttv-cards.c b/drivers/media/video/bt8xx/bttv-cards.c index a84903e0d810..21ebe8f13815 100644 --- a/drivers/media/video/bt8xx/bttv-cards.c +++ b/drivers/media/video/bt8xx/bttv-cards.c | |||
@@ -4001,7 +4001,7 @@ static void __devinit init_PXC200(struct bttv *btv) | |||
4001 | * - sleep 1ms | 4001 | * - sleep 1ms |
4002 | * - write 0x0E | 4002 | * - write 0x0E |
4003 | * read from GPIO_DATA into buf (uint_32) | 4003 | * read from GPIO_DATA into buf (uint_32) |
4004 | * - if ( buf>>18 & 0x01 ) || ( buf>>19 && 0x01 != 0 ) | 4004 | * - if ( buf>>18 & 0x01 ) || ( buf>>19 & 0x01 != 0 ) |
4005 | * error. ERROR_CPLD_Check_Failed. | 4005 | * error. ERROR_CPLD_Check_Failed. |
4006 | */ | 4006 | */ |
4007 | /* ----------------------------------------------------------------------- */ | 4007 | /* ----------------------------------------------------------------------- */ |
diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c index ee48995a4ab5..57e1c024a547 100644 --- a/drivers/media/video/cx88/cx88-input.c +++ b/drivers/media/video/cx88/cx88-input.c | |||
@@ -202,13 +202,19 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) | |||
202 | ir->sampling = 1; | 202 | ir->sampling = 1; |
203 | break; | 203 | break; |
204 | case CX88_BOARD_WINFAST_DTV2000H: | 204 | case CX88_BOARD_WINFAST_DTV2000H: |
205 | case CX88_BOARD_WINFAST2000XP_EXPERT: | ||
206 | ir_codes = ir_codes_winfast; | 205 | ir_codes = ir_codes_winfast; |
207 | ir->gpio_addr = MO_GP0_IO; | 206 | ir->gpio_addr = MO_GP0_IO; |
208 | ir->mask_keycode = 0x8f8; | 207 | ir->mask_keycode = 0x8f8; |
209 | ir->mask_keyup = 0x100; | 208 | ir->mask_keyup = 0x100; |
210 | ir->polling = 50; /* ms */ | 209 | ir->polling = 50; /* ms */ |
211 | break; | 210 | break; |
211 | case CX88_BOARD_WINFAST2000XP_EXPERT: | ||
212 | ir_codes = ir_codes_winfast; | ||
213 | ir->gpio_addr = MO_GP0_IO; | ||
214 | ir->mask_keycode = 0x8f8; | ||
215 | ir->mask_keyup = 0x100; | ||
216 | ir->polling = 1; /* ms */ | ||
217 | break; | ||
212 | case CX88_BOARD_IODATA_GVBCTV7E: | 218 | case CX88_BOARD_IODATA_GVBCTV7E: |
213 | ir_codes = ir_codes_iodata_bctv7e; | 219 | ir_codes = ir_codes_iodata_bctv7e; |
214 | ir->gpio_addr = MO_GP0_IO; | 220 | ir->gpio_addr = MO_GP0_IO; |
@@ -216,7 +222,7 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) | |||
216 | ir->mask_keydown = 0x02; | 222 | ir->mask_keydown = 0x02; |
217 | ir->polling = 5; /* ms */ | 223 | ir->polling = 5; /* ms */ |
218 | break; | 224 | break; |
219 | case CX88_BOARD_PROLINK_PLAYTVPVR: | 225 | case CX88_BOARD_PROLINK_PLAYTVPVR: |
220 | case CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO: | 226 | case CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO: |
221 | ir_codes = ir_codes_pixelview; | 227 | ir_codes = ir_codes_pixelview; |
222 | ir->gpio_addr = MO_GP1_IO; | 228 | ir->gpio_addr = MO_GP1_IO; |
diff --git a/drivers/media/video/et61x251/et61x251_core.c b/drivers/media/video/et61x251/et61x251_core.c index f786ab11d2cd..86e353b26b53 100644 --- a/drivers/media/video/et61x251/et61x251_core.c +++ b/drivers/media/video/et61x251/et61x251_core.c | |||
@@ -1182,8 +1182,6 @@ static void et61x251_release_resources(struct et61x251_device* cam) | |||
1182 | video_set_drvdata(cam->v4ldev, NULL); | 1182 | video_set_drvdata(cam->v4ldev, NULL); |
1183 | video_unregister_device(cam->v4ldev); | 1183 | video_unregister_device(cam->v4ldev); |
1184 | 1184 | ||
1185 | usb_put_dev(cam->usbdev); | ||
1186 | |||
1187 | mutex_unlock(&et61x251_sysfs_lock); | 1185 | mutex_unlock(&et61x251_sysfs_lock); |
1188 | 1186 | ||
1189 | kfree(cam->control_buffer); | 1187 | kfree(cam->control_buffer); |
@@ -1275,6 +1273,7 @@ static int et61x251_release(struct inode* inode, struct file* filp) | |||
1275 | 1273 | ||
1276 | if (cam->state & DEV_DISCONNECTED) { | 1274 | if (cam->state & DEV_DISCONNECTED) { |
1277 | et61x251_release_resources(cam); | 1275 | et61x251_release_resources(cam); |
1276 | usb_put_dev(cam->usbdev); | ||
1278 | mutex_unlock(&cam->dev_mutex); | 1277 | mutex_unlock(&cam->dev_mutex); |
1279 | kfree(cam); | 1278 | kfree(cam); |
1280 | return 0; | 1279 | return 0; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c b/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c index df8feac16aee..c80c26be6e4d 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c +++ b/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c | |||
@@ -221,7 +221,7 @@ static unsigned int decoder_describe(struct pvr2_v4l_cx2584x *ctxt, | |||
221 | static void decoder_reset(struct pvr2_v4l_cx2584x *ctxt) | 221 | static void decoder_reset(struct pvr2_v4l_cx2584x *ctxt) |
222 | { | 222 | { |
223 | int ret; | 223 | int ret; |
224 | ret = pvr2_i2c_client_cmd(ctxt->client,VIDIOC_INT_RESET,0); | 224 | ret = pvr2_i2c_client_cmd(ctxt->client,VIDIOC_INT_RESET,NULL); |
225 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c cx25840 decoder_reset (ret=%d)",ret); | 225 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c cx25840 decoder_reset (ret=%d)",ret); |
226 | } | 226 | } |
227 | 227 | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c index 97e974d9b9c3..bb40e9085977 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c +++ b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c | |||
@@ -711,8 +711,8 @@ static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip) | |||
711 | dip->devbase.minor,pvr2_config_get_name(dip->config)); | 711 | dip->devbase.minor,pvr2_config_get_name(dip->config)); |
712 | 712 | ||
713 | /* Paranoia */ | 713 | /* Paranoia */ |
714 | dip->v4lp = 0; | 714 | dip->v4lp = NULL; |
715 | dip->stream = 0; | 715 | dip->stream = NULL; |
716 | 716 | ||
717 | /* Actual deallocation happens later when all internal references | 717 | /* Actual deallocation happens later when all internal references |
718 | are gone. */ | 718 | are gone. */ |
@@ -1076,7 +1076,7 @@ struct pvr2_v4l2 *pvr2_v4l2_create(struct pvr2_context *mnp) | |||
1076 | vp->vdev = kmalloc(sizeof(*vp->vdev),GFP_KERNEL); | 1076 | vp->vdev = kmalloc(sizeof(*vp->vdev),GFP_KERNEL); |
1077 | if (!vp->vdev) { | 1077 | if (!vp->vdev) { |
1078 | kfree(vp); | 1078 | kfree(vp); |
1079 | return 0; | 1079 | return NULL; |
1080 | } | 1080 | } |
1081 | memset(vp->vdev,0,sizeof(*vp->vdev)); | 1081 | memset(vp->vdev,0,sizeof(*vp->vdev)); |
1082 | pvr2_channel_init(&vp->channel,mnp); | 1082 | pvr2_channel_init(&vp->channel,mnp); |
diff --git a/drivers/media/video/saa6588.c b/drivers/media/video/saa6588.c index a81285ca7d5b..7b9859c33018 100644 --- a/drivers/media/video/saa6588.c +++ b/drivers/media/video/saa6588.c | |||
@@ -212,8 +212,10 @@ static void read_from_buf(struct saa6588 *s, struct rds_command *a) | |||
212 | if (rd_blocks > s->block_count) | 212 | if (rd_blocks > s->block_count) |
213 | rd_blocks = s->block_count; | 213 | rd_blocks = s->block_count; |
214 | 214 | ||
215 | if (!rd_blocks) | 215 | if (!rd_blocks) { |
216 | spin_unlock_irqrestore(&s->lock, flags); | ||
216 | return; | 217 | return; |
218 | } | ||
217 | 219 | ||
218 | for (i = 0; i < rd_blocks; i++) { | 220 | for (i = 0; i < rd_blocks; i++) { |
219 | if (block_to_user_buf(s, buf_ptr)) { | 221 | if (block_to_user_buf(s, buf_ptr)) { |
diff --git a/drivers/media/video/saa7115.c b/drivers/media/video/saa7115.c index c5719f7bd1ac..f28398dd9d93 100644 --- a/drivers/media/video/saa7115.c +++ b/drivers/media/video/saa7115.c | |||
@@ -1464,8 +1464,6 @@ static int saa711x_attach(struct i2c_adapter *adapter, int address, int kind) | |||
1464 | client->driver = &i2c_driver_saa711x; | 1464 | client->driver = &i2c_driver_saa711x; |
1465 | snprintf(client->name, sizeof(client->name) - 1, "saa7115"); | 1465 | snprintf(client->name, sizeof(client->name) - 1, "saa7115"); |
1466 | 1466 | ||
1467 | v4l_dbg(1, debug, client, "detecting saa7115 client on address 0x%x\n", address << 1); | ||
1468 | |||
1469 | for (i=0;i<0x0f;i++) { | 1467 | for (i=0;i<0x0f;i++) { |
1470 | saa711x_write(client, 0, i); | 1468 | saa711x_write(client, 0, i); |
1471 | name[i] = (saa711x_read(client, 0) &0x0f) +'0'; | 1469 | name[i] = (saa711x_read(client, 0) &0x0f) +'0'; |
@@ -1477,6 +1475,13 @@ static int saa711x_attach(struct i2c_adapter *adapter, int address, int kind) | |||
1477 | saa711x_write(client, 0, 5); | 1475 | saa711x_write(client, 0, 5); |
1478 | chip_id = saa711x_read(client, 0) & 0x0f; | 1476 | chip_id = saa711x_read(client, 0) & 0x0f; |
1479 | 1477 | ||
1478 | /* Check whether this chip is part of the saa711x series */ | ||
1479 | if (memcmp(name, "1f711", 5)) { | ||
1480 | v4l_dbg(1, debug, client, "chip found @ 0x%x (ID %s) does not match a known saa711x chip.\n", | ||
1481 | address << 1, name); | ||
1482 | return 0; | ||
1483 | } | ||
1484 | |||
1480 | snprintf(client->name, sizeof(client->name) - 1, "saa711%d",chip_id); | 1485 | snprintf(client->name, sizeof(client->name) - 1, "saa711%d",chip_id); |
1481 | v4l_info(client, "saa711%d found (%s) @ 0x%x (%s)\n", chip_id, name, address << 1, adapter->name); | 1486 | v4l_info(client, "saa711%d found (%s) @ 0x%x (%s)\n", chip_id, name, address << 1, adapter->name); |
1482 | 1487 | ||
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c index c9d8e3b9cc37..51f0cfdcb680 100644 --- a/drivers/media/video/saa7134/saa7134-cards.c +++ b/drivers/media/video/saa7134/saa7134-cards.c | |||
@@ -2969,7 +2969,7 @@ struct saa7134_board saa7134_boards[] = { | |||
2969 | /* Petr Baudis <pasky@ucw.cz> */ | 2969 | /* Petr Baudis <pasky@ucw.cz> */ |
2970 | .name = "AVerMedia TV Hybrid A16AR", | 2970 | .name = "AVerMedia TV Hybrid A16AR", |
2971 | .audio_clock = 0x187de7, | 2971 | .audio_clock = 0x187de7, |
2972 | .tuner_type = TUNER_PHILIPS_TDA8290, /* untested */ | 2972 | .tuner_type = TUNER_PHILIPS_TD1316, /* untested */ |
2973 | .radio_type = TUNER_TEA5767, /* untested */ | 2973 | .radio_type = TUNER_TEA5767, /* untested */ |
2974 | .tuner_addr = ADDR_UNSET, | 2974 | .tuner_addr = ADDR_UNSET, |
2975 | .radio_addr = ADDR_UNSET, | 2975 | .radio_addr = ADDR_UNSET, |
@@ -3718,6 +3718,7 @@ int saa7134_board_init1(struct saa7134_dev *dev) | |||
3718 | case SAA7134_BOARD_AVERMEDIA_STUDIO_307: | 3718 | case SAA7134_BOARD_AVERMEDIA_STUDIO_307: |
3719 | case SAA7134_BOARD_AVERMEDIA_307: | 3719 | case SAA7134_BOARD_AVERMEDIA_307: |
3720 | case SAA7134_BOARD_AVERMEDIA_GO_007_FM: | 3720 | case SAA7134_BOARD_AVERMEDIA_GO_007_FM: |
3721 | case SAA7134_BOARD_AVERMEDIA_777: | ||
3721 | /* case SAA7134_BOARD_SABRENT_SBTTVFM: */ /* not finished yet */ | 3722 | /* case SAA7134_BOARD_SABRENT_SBTTVFM: */ /* not finished yet */ |
3722 | case SAA7134_BOARD_VIDEOMATE_TV_PVR: | 3723 | case SAA7134_BOARD_VIDEOMATE_TV_PVR: |
3723 | case SAA7134_BOARD_VIDEOMATE_GOLD_PLUS: | 3724 | case SAA7134_BOARD_VIDEOMATE_GOLD_PLUS: |
@@ -3734,6 +3735,7 @@ int saa7134_board_init1(struct saa7134_dev *dev) | |||
3734 | case SAA7134_BOARD_FLYDVBT_LR301: | 3735 | case SAA7134_BOARD_FLYDVBT_LR301: |
3735 | case SAA7134_BOARD_FLYDVBTDUO: | 3736 | case SAA7134_BOARD_FLYDVBTDUO: |
3736 | case SAA7134_BOARD_PROTEUS_2309: | 3737 | case SAA7134_BOARD_PROTEUS_2309: |
3738 | case SAA7134_BOARD_AVERMEDIA_A16AR: | ||
3737 | dev->has_remote = SAA7134_REMOTE_GPIO; | 3739 | dev->has_remote = SAA7134_REMOTE_GPIO; |
3738 | break; | 3740 | break; |
3739 | case SAA7134_BOARD_FLYDVBS_LR300: | 3741 | case SAA7134_BOARD_FLYDVBS_LR300: |
@@ -3772,7 +3774,6 @@ int saa7134_board_init1(struct saa7134_dev *dev) | |||
3772 | saa_writeb(SAA7134_GPIO_GPMODE3, 0x08); | 3774 | saa_writeb(SAA7134_GPIO_GPMODE3, 0x08); |
3773 | saa_writeb(SAA7134_GPIO_GPSTATUS3, 0x00); | 3775 | saa_writeb(SAA7134_GPIO_GPSTATUS3, 0x00); |
3774 | break; | 3776 | break; |
3775 | case SAA7134_BOARD_AVERMEDIA_A16AR: | ||
3776 | case SAA7134_BOARD_AVERMEDIA_CARDBUS: | 3777 | case SAA7134_BOARD_AVERMEDIA_CARDBUS: |
3777 | /* power-up tuner chip */ | 3778 | /* power-up tuner chip */ |
3778 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0xffffffff, 0xffffffff); | 3779 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0xffffffff, 0xffffffff); |
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c index 1ba53b525ad2..6b61d9b2fcb5 100644 --- a/drivers/media/video/saa7134/saa7134-dvb.c +++ b/drivers/media/video/saa7134/saa7134-dvb.c | |||
@@ -1147,6 +1147,8 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1147 | &philips_europa_config, | 1147 | &philips_europa_config, |
1148 | &dev->i2c_adap); | 1148 | &dev->i2c_adap); |
1149 | if (dev->dvb.frontend) { | 1149 | if (dev->dvb.frontend) { |
1150 | dev->original_demod_sleep = dev->dvb.frontend->ops.sleep; | ||
1151 | dev->dvb.frontend->ops.sleep = philips_europa_demod_sleep; | ||
1150 | dev->dvb.frontend->ops.tuner_ops.init = philips_europa_tuner_init; | 1152 | dev->dvb.frontend->ops.tuner_ops.init = philips_europa_tuner_init; |
1151 | dev->dvb.frontend->ops.tuner_ops.sleep = philips_europa_tuner_sleep; | 1153 | dev->dvb.frontend->ops.tuner_ops.sleep = philips_europa_tuner_sleep; |
1152 | dev->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params; | 1154 | dev->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params; |
diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c index ff5991136f4e..dee83552e681 100644 --- a/drivers/media/video/saa7134/saa7134-input.c +++ b/drivers/media/video/saa7134/saa7134-input.c | |||
@@ -185,7 +185,6 @@ int saa7134_input_init1(struct saa7134_dev *dev) | |||
185 | case SAA7134_BOARD_AVERMEDIA_STUDIO_305: | 185 | case SAA7134_BOARD_AVERMEDIA_STUDIO_305: |
186 | case SAA7134_BOARD_AVERMEDIA_STUDIO_307: | 186 | case SAA7134_BOARD_AVERMEDIA_STUDIO_307: |
187 | case SAA7134_BOARD_AVERMEDIA_GO_007_FM: | 187 | case SAA7134_BOARD_AVERMEDIA_GO_007_FM: |
188 | case SAA7134_BOARD_AVERMEDIA_A16AR: | ||
189 | ir_codes = ir_codes_avermedia; | 188 | ir_codes = ir_codes_avermedia; |
190 | mask_keycode = 0x0007C8; | 189 | mask_keycode = 0x0007C8; |
191 | mask_keydown = 0x000010; | 190 | mask_keydown = 0x000010; |
@@ -194,6 +193,16 @@ int saa7134_input_init1(struct saa7134_dev *dev) | |||
194 | saa_setb(SAA7134_GPIO_GPMODE0, 0x4); | 193 | saa_setb(SAA7134_GPIO_GPMODE0, 0x4); |
195 | saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4); | 194 | saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4); |
196 | break; | 195 | break; |
196 | case SAA7134_BOARD_AVERMEDIA_777: | ||
197 | case SAA7134_BOARD_AVERMEDIA_A16AR: | ||
198 | ir_codes = ir_codes_avermedia; | ||
199 | mask_keycode = 0x02F200; | ||
200 | mask_keydown = 0x000400; | ||
201 | polling = 50; // ms | ||
202 | /* Without this we won't receive key up events */ | ||
203 | saa_setb(SAA7134_GPIO_GPMODE1, 0x1); | ||
204 | saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1); | ||
205 | break; | ||
197 | case SAA7134_BOARD_KWORLD_TERMINATOR: | 206 | case SAA7134_BOARD_KWORLD_TERMINATOR: |
198 | ir_codes = ir_codes_pixelview; | 207 | ir_codes = ir_codes_pixelview; |
199 | mask_keycode = 0x00001f; | 208 | mask_keycode = 0x00001f; |
diff --git a/drivers/media/video/sn9c102/sn9c102_core.c b/drivers/media/video/sn9c102/sn9c102_core.c index a4702d3c2aca..42fb60d985b9 100644 --- a/drivers/media/video/sn9c102/sn9c102_core.c +++ b/drivers/media/video/sn9c102/sn9c102_core.c | |||
@@ -1462,8 +1462,6 @@ static void sn9c102_release_resources(struct sn9c102_device* cam) | |||
1462 | video_set_drvdata(cam->v4ldev, NULL); | 1462 | video_set_drvdata(cam->v4ldev, NULL); |
1463 | video_unregister_device(cam->v4ldev); | 1463 | video_unregister_device(cam->v4ldev); |
1464 | 1464 | ||
1465 | usb_put_dev(cam->usbdev); | ||
1466 | |||
1467 | mutex_unlock(&sn9c102_sysfs_lock); | 1465 | mutex_unlock(&sn9c102_sysfs_lock); |
1468 | 1466 | ||
1469 | kfree(cam->control_buffer); | 1467 | kfree(cam->control_buffer); |
@@ -1555,6 +1553,7 @@ static int sn9c102_release(struct inode* inode, struct file* filp) | |||
1555 | 1553 | ||
1556 | if (cam->state & DEV_DISCONNECTED) { | 1554 | if (cam->state & DEV_DISCONNECTED) { |
1557 | sn9c102_release_resources(cam); | 1555 | sn9c102_release_resources(cam); |
1556 | usb_put_dev(cam->usbdev); | ||
1558 | mutex_unlock(&cam->dev_mutex); | 1557 | mutex_unlock(&cam->dev_mutex); |
1559 | kfree(cam); | 1558 | kfree(cam); |
1560 | return 0; | 1559 | return 0; |
diff --git a/drivers/media/video/tveeprom.c b/drivers/media/video/tveeprom.c index e6baaee038bf..6b9ef731b83a 100644 --- a/drivers/media/video/tveeprom.c +++ b/drivers/media/video/tveeprom.c | |||
@@ -468,7 +468,7 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee, | |||
468 | (eeprom_data[i+6] << 8) + | 468 | (eeprom_data[i+6] << 8) + |
469 | (eeprom_data[i+7] << 16); | 469 | (eeprom_data[i+7] << 16); |
470 | 470 | ||
471 | if ( (eeprom_data[i + 8] && 0xf0) && | 471 | if ( (eeprom_data[i + 8] & 0xf0) && |
472 | (tvee->serial_number < 0xffffff) ) { | 472 | (tvee->serial_number < 0xffffff) ) { |
473 | tvee->MAC_address[0] = 0x00; | 473 | tvee->MAC_address[0] = 0x00; |
474 | tvee->MAC_address[1] = 0x0D; | 474 | tvee->MAC_address[1] = 0x0D; |
diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h index c537d71c18e4..a4afad4ecab2 100644 --- a/drivers/message/fusion/mptbase.h +++ b/drivers/message/fusion/mptbase.h | |||
@@ -75,8 +75,8 @@ | |||
75 | #define COPYRIGHT "Copyright (c) 1999-2005 " MODULEAUTHOR | 75 | #define COPYRIGHT "Copyright (c) 1999-2005 " MODULEAUTHOR |
76 | #endif | 76 | #endif |
77 | 77 | ||
78 | #define MPT_LINUX_VERSION_COMMON "3.04.01" | 78 | #define MPT_LINUX_VERSION_COMMON "3.04.02" |
79 | #define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.01" | 79 | #define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.02" |
80 | #define WHAT_MAGIC_STRING "@" "(" "#" ")" | 80 | #define WHAT_MAGIC_STRING "@" "(" "#" ")" |
81 | 81 | ||
82 | #define show_mptmod_ver(s,ver) \ | 82 | #define show_mptmod_ver(s,ver) \ |
diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c index e57bb035a021..1dd491773150 100644 --- a/drivers/message/fusion/mptfc.c +++ b/drivers/message/fusion/mptfc.c | |||
@@ -96,6 +96,10 @@ static int mptfc_qcmd(struct scsi_cmnd *SCpnt, | |||
96 | static void mptfc_target_destroy(struct scsi_target *starget); | 96 | static void mptfc_target_destroy(struct scsi_target *starget); |
97 | static void mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout); | 97 | static void mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout); |
98 | static void __devexit mptfc_remove(struct pci_dev *pdev); | 98 | static void __devexit mptfc_remove(struct pci_dev *pdev); |
99 | static int mptfc_abort(struct scsi_cmnd *SCpnt); | ||
100 | static int mptfc_dev_reset(struct scsi_cmnd *SCpnt); | ||
101 | static int mptfc_bus_reset(struct scsi_cmnd *SCpnt); | ||
102 | static int mptfc_host_reset(struct scsi_cmnd *SCpnt); | ||
99 | 103 | ||
100 | static struct scsi_host_template mptfc_driver_template = { | 104 | static struct scsi_host_template mptfc_driver_template = { |
101 | .module = THIS_MODULE, | 105 | .module = THIS_MODULE, |
@@ -110,10 +114,10 @@ static struct scsi_host_template mptfc_driver_template = { | |||
110 | .target_destroy = mptfc_target_destroy, | 114 | .target_destroy = mptfc_target_destroy, |
111 | .slave_destroy = mptscsih_slave_destroy, | 115 | .slave_destroy = mptscsih_slave_destroy, |
112 | .change_queue_depth = mptscsih_change_queue_depth, | 116 | .change_queue_depth = mptscsih_change_queue_depth, |
113 | .eh_abort_handler = mptscsih_abort, | 117 | .eh_abort_handler = mptfc_abort, |
114 | .eh_device_reset_handler = mptscsih_dev_reset, | 118 | .eh_device_reset_handler = mptfc_dev_reset, |
115 | .eh_bus_reset_handler = mptscsih_bus_reset, | 119 | .eh_bus_reset_handler = mptfc_bus_reset, |
116 | .eh_host_reset_handler = mptscsih_host_reset, | 120 | .eh_host_reset_handler = mptfc_host_reset, |
117 | .bios_param = mptscsih_bios_param, | 121 | .bios_param = mptscsih_bios_param, |
118 | .can_queue = MPT_FC_CAN_QUEUE, | 122 | .can_queue = MPT_FC_CAN_QUEUE, |
119 | .this_id = -1, | 123 | .this_id = -1, |
@@ -171,6 +175,77 @@ static struct fc_function_template mptfc_transport_functions = { | |||
171 | .show_host_symbolic_name = 1, | 175 | .show_host_symbolic_name = 1, |
172 | }; | 176 | }; |
173 | 177 | ||
178 | static int | ||
179 | mptfc_block_error_handler(struct scsi_cmnd *SCpnt, | ||
180 | int (*func)(struct scsi_cmnd *SCpnt), | ||
181 | const char *caller) | ||
182 | { | ||
183 | struct scsi_device *sdev = SCpnt->device; | ||
184 | struct Scsi_Host *shost = sdev->host; | ||
185 | struct fc_rport *rport = starget_to_rport(scsi_target(sdev)); | ||
186 | unsigned long flags; | ||
187 | int ready; | ||
188 | |||
189 | spin_lock_irqsave(shost->host_lock, flags); | ||
190 | while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY) { | ||
191 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
192 | dfcprintk ((MYIOC_s_INFO_FMT | ||
193 | "mptfc_block_error_handler.%d: %d:%d, port status is " | ||
194 | "DID_IMM_RETRY, deferring %s recovery.\n", | ||
195 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, | ||
196 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, | ||
197 | SCpnt->device->id,SCpnt->device->lun,caller)); | ||
198 | msleep(1000); | ||
199 | spin_lock_irqsave(shost->host_lock, flags); | ||
200 | } | ||
201 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
202 | |||
203 | if (ready == DID_NO_CONNECT || !SCpnt->device->hostdata) { | ||
204 | dfcprintk ((MYIOC_s_INFO_FMT | ||
205 | "%s.%d: %d:%d, failing recovery, " | ||
206 | "port state %d, vdev %p.\n", caller, | ||
207 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, | ||
208 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, | ||
209 | SCpnt->device->id,SCpnt->device->lun,ready, | ||
210 | SCpnt->device->hostdata)); | ||
211 | return FAILED; | ||
212 | } | ||
213 | dfcprintk ((MYIOC_s_INFO_FMT | ||
214 | "%s.%d: %d:%d, executing recovery.\n", caller, | ||
215 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, | ||
216 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, | ||
217 | SCpnt->device->id,SCpnt->device->lun)); | ||
218 | return (*func)(SCpnt); | ||
219 | } | ||
220 | |||
221 | static int | ||
222 | mptfc_abort(struct scsi_cmnd *SCpnt) | ||
223 | { | ||
224 | return | ||
225 | mptfc_block_error_handler(SCpnt, mptscsih_abort, __FUNCTION__); | ||
226 | } | ||
227 | |||
228 | static int | ||
229 | mptfc_dev_reset(struct scsi_cmnd *SCpnt) | ||
230 | { | ||
231 | return | ||
232 | mptfc_block_error_handler(SCpnt, mptscsih_dev_reset, __FUNCTION__); | ||
233 | } | ||
234 | |||
235 | static int | ||
236 | mptfc_bus_reset(struct scsi_cmnd *SCpnt) | ||
237 | { | ||
238 | return | ||
239 | mptfc_block_error_handler(SCpnt, mptscsih_bus_reset, __FUNCTION__); | ||
240 | } | ||
241 | |||
242 | static int | ||
243 | mptfc_host_reset(struct scsi_cmnd *SCpnt) | ||
244 | { | ||
245 | return | ||
246 | mptfc_block_error_handler(SCpnt, mptscsih_host_reset, __FUNCTION__); | ||
247 | } | ||
248 | |||
174 | static void | 249 | static void |
175 | mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout) | 250 | mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout) |
176 | { | 251 | { |
@@ -562,6 +637,12 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) | |||
562 | return 0; | 637 | return 0; |
563 | } | 638 | } |
564 | 639 | ||
640 | if (!SCpnt->device->hostdata) { /* vdev */ | ||
641 | SCpnt->result = DID_NO_CONNECT << 16; | ||
642 | done(SCpnt); | ||
643 | return 0; | ||
644 | } | ||
645 | |||
565 | /* dd_data is null until finished adding target */ | 646 | /* dd_data is null until finished adding target */ |
566 | ri = *((struct mptfc_rport_info **)rport->dd_data); | 647 | ri = *((struct mptfc_rport_info **)rport->dd_data); |
567 | if (unlikely(!ri)) { | 648 | if (unlikely(!ri)) { |
diff --git a/drivers/message/i2o/exec-osm.c b/drivers/message/i2o/exec-osm.c index 91f95d172ca5..a2350640384b 100644 --- a/drivers/message/i2o/exec-osm.c +++ b/drivers/message/i2o/exec-osm.c | |||
@@ -124,10 +124,10 @@ static void i2o_exec_wait_free(struct i2o_exec_wait *wait) | |||
124 | int i2o_msg_post_wait_mem(struct i2o_controller *c, struct i2o_message *msg, | 124 | int i2o_msg_post_wait_mem(struct i2o_controller *c, struct i2o_message *msg, |
125 | unsigned long timeout, struct i2o_dma *dma) | 125 | unsigned long timeout, struct i2o_dma *dma) |
126 | { | 126 | { |
127 | DECLARE_WAIT_QUEUE_HEAD(wq); | 127 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); |
128 | struct i2o_exec_wait *wait; | 128 | struct i2o_exec_wait *wait; |
129 | static u32 tcntxt = 0x80000000; | 129 | static u32 tcntxt = 0x80000000; |
130 | long flags; | 130 | unsigned long flags; |
131 | int rc = 0; | 131 | int rc = 0; |
132 | 132 | ||
133 | wait = i2o_exec_wait_alloc(); | 133 | wait = i2o_exec_wait_alloc(); |
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index b6c045dc97b4..00db31c314e0 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig | |||
@@ -30,6 +30,7 @@ config IBM_ASM | |||
30 | 30 | ||
31 | config SGI_IOC4 | 31 | config SGI_IOC4 |
32 | tristate "SGI IOC4 Base IO support" | 32 | tristate "SGI IOC4 Base IO support" |
33 | depends on PCI | ||
33 | ---help--- | 34 | ---help--- |
34 | This option enables basic support for the IOC4 chip on certain | 35 | This option enables basic support for the IOC4 chip on certain |
35 | SGI IO controller cards (IO9, IO10, and PCI-RT). This option | 36 | SGI IO controller cards (IO9, IO10, and PCI-RT). This option |
diff --git a/drivers/misc/ioc4.c b/drivers/misc/ioc4.c index 1c3c14a3839c..b995a15b7526 100644 --- a/drivers/misc/ioc4.c +++ b/drivers/misc/ioc4.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/ktime.h> | 32 | #include <linux/ktime.h> |
33 | #include <linux/mutex.h> | 33 | #include <linux/mutex.h> |
34 | #include <linux/time.h> | 34 | #include <linux/time.h> |
35 | #include <asm/io.h> | ||
35 | 36 | ||
36 | /*************** | 37 | /*************** |
37 | * Definitions * | 38 | * Definitions * |
@@ -209,8 +210,8 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd) | |||
209 | 210 | ||
210 | do_div(ns, IOC4_EXTINT_COUNT_DIVISOR); | 211 | do_div(ns, IOC4_EXTINT_COUNT_DIVISOR); |
211 | printk(KERN_DEBUG | 212 | printk(KERN_DEBUG |
212 | "IOC4 %s: PCI clock is %lld ns.\n", | 213 | "IOC4 %s: PCI clock is %llu ns.\n", |
213 | pci_name(idd->idd_pdev), ns); | 214 | pci_name(idd->idd_pdev), (unsigned long long)ns); |
214 | } | 215 | } |
215 | 216 | ||
216 | /* Remember results. We store the extint clock period rather | 217 | /* Remember results. We store the extint clock period rather |
diff --git a/drivers/misc/lkdtm.c b/drivers/misc/lkdtm.c index bbdba7b37e11..db9d7df75ae0 100644 --- a/drivers/misc/lkdtm.c +++ b/drivers/misc/lkdtm.c | |||
@@ -44,12 +44,14 @@ | |||
44 | */ | 44 | */ |
45 | 45 | ||
46 | #include <linux/kernel.h> | 46 | #include <linux/kernel.h> |
47 | #include <linux/fs.h> | ||
47 | #include <linux/module.h> | 48 | #include <linux/module.h> |
49 | #include <linux/buffer_head.h> | ||
48 | #include <linux/kprobes.h> | 50 | #include <linux/kprobes.h> |
49 | #include <linux/kallsyms.h> | 51 | #include <linux/list.h> |
50 | #include <linux/init.h> | 52 | #include <linux/init.h> |
51 | #include <linux/irq.h> | ||
52 | #include <linux/interrupt.h> | 53 | #include <linux/interrupt.h> |
54 | #include <linux/hrtimer.h> | ||
53 | #include <scsi/scsi_cmnd.h> | 55 | #include <scsi/scsi_cmnd.h> |
54 | 56 | ||
55 | #ifdef CONFIG_IDE | 57 | #ifdef CONFIG_IDE |
@@ -116,16 +118,16 @@ static enum ctype cptype = NONE; | |||
116 | static int count = DEFAULT_COUNT; | 118 | static int count = DEFAULT_COUNT; |
117 | 119 | ||
118 | module_param(recur_count, int, 0644); | 120 | module_param(recur_count, int, 0644); |
119 | MODULE_PARM_DESC(recur_count, "Recurcion level for the stack overflow test,\ | 121 | MODULE_PARM_DESC(recur_count, " Recursion level for the stack overflow test, "\ |
120 | default is 10"); | 122 | "default is 10"); |
121 | module_param(cpoint_name, charp, 0644); | 123 | module_param(cpoint_name, charp, 0644); |
122 | MODULE_PARM_DESC(cpoint_name, "Crash Point, where kernel is to be crashed"); | 124 | MODULE_PARM_DESC(cpoint_name, " Crash Point, where kernel is to be crashed"); |
123 | module_param(cpoint_type, charp, 06444); | 125 | module_param(cpoint_type, charp, 0644); |
124 | MODULE_PARM_DESC(cpoint_type, "Crash Point Type, action to be taken on\ | 126 | MODULE_PARM_DESC(cpoint_type, " Crash Point Type, action to be taken on "\ |
125 | hitting the crash point"); | 127 | "hitting the crash point"); |
126 | module_param(cpoint_count, int, 06444); | 128 | module_param(cpoint_count, int, 0644); |
127 | MODULE_PARM_DESC(cpoint_count, "Crash Point Count, number of times the \ | 129 | MODULE_PARM_DESC(cpoint_count, " Crash Point Count, number of times the "\ |
128 | crash point is to be hit to trigger action"); | 130 | "crash point is to be hit to trigger action"); |
129 | 131 | ||
130 | unsigned int jp_do_irq(unsigned int irq) | 132 | unsigned int jp_do_irq(unsigned int irq) |
131 | { | 133 | { |
@@ -155,8 +157,8 @@ void jp_ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) | |||
155 | 157 | ||
156 | struct scan_control; | 158 | struct scan_control; |
157 | 159 | ||
158 | unsigned long jp_shrink_page_list(struct list_head *page_list, | 160 | unsigned long jp_shrink_inactive_list(unsigned long max_scan, |
159 | struct scan_control *sc) | 161 | struct zone *zone, struct scan_control *sc) |
160 | { | 162 | { |
161 | lkdtm_handler(); | 163 | lkdtm_handler(); |
162 | jprobe_return(); | 164 | jprobe_return(); |
@@ -295,8 +297,8 @@ int lkdtm_module_init(void) | |||
295 | lkdtm.entry = (kprobe_opcode_t*) jp_ll_rw_block; | 297 | lkdtm.entry = (kprobe_opcode_t*) jp_ll_rw_block; |
296 | break; | 298 | break; |
297 | case MEM_SWAPOUT: | 299 | case MEM_SWAPOUT: |
298 | lkdtm.kp.symbol_name = "shrink_page_list"; | 300 | lkdtm.kp.symbol_name = "shrink_inactive_list"; |
299 | lkdtm.entry = (kprobe_opcode_t*) jp_shrink_page_list; | 301 | lkdtm.entry = (kprobe_opcode_t*) jp_shrink_inactive_list; |
300 | break; | 302 | break; |
301 | case TIMERADD: | 303 | case TIMERADD: |
302 | lkdtm.kp.symbol_name = "hrtimer_start"; | 304 | lkdtm.kp.symbol_name = "hrtimer_start"; |
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index ee8863c123e3..766bc54406e5 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c | |||
@@ -475,7 +475,7 @@ static u32 mmc_select_voltage(struct mmc_host *host, u32 ocr) | |||
475 | if (bit) { | 475 | if (bit) { |
476 | bit -= 1; | 476 | bit -= 1; |
477 | 477 | ||
478 | ocr = 3 << bit; | 478 | ocr &= 3 << bit; |
479 | 479 | ||
480 | host->ios.vdd = bit; | 480 | host->ios.vdd = bit; |
481 | mmc_set_ios(host); | 481 | mmc_set_ios(host); |
@@ -1178,14 +1178,29 @@ static void mmc_rescan(void *data) | |||
1178 | { | 1178 | { |
1179 | struct mmc_host *host = data; | 1179 | struct mmc_host *host = data; |
1180 | struct list_head *l, *n; | 1180 | struct list_head *l, *n; |
1181 | unsigned char power_mode; | ||
1181 | 1182 | ||
1182 | mmc_claim_host(host); | 1183 | mmc_claim_host(host); |
1183 | 1184 | ||
1184 | if (host->ios.power_mode == MMC_POWER_ON) | 1185 | /* |
1186 | * Check for removed cards and newly inserted ones. We check for | ||
1187 | * removed cards first so we can intelligently re-select the VDD. | ||
1188 | */ | ||
1189 | power_mode = host->ios.power_mode; | ||
1190 | if (power_mode == MMC_POWER_ON) | ||
1185 | mmc_check_cards(host); | 1191 | mmc_check_cards(host); |
1186 | 1192 | ||
1187 | mmc_setup(host); | 1193 | mmc_setup(host); |
1188 | 1194 | ||
1195 | /* | ||
1196 | * Some broken cards process CMD1 even in stand-by state. There is | ||
1197 | * no reply, but an ILLEGAL_COMMAND error is cached and returned | ||
1198 | * after next command. We poll for card status here to clear any | ||
1199 | * possibly pending error. | ||
1200 | */ | ||
1201 | if (power_mode == MMC_POWER_ON) | ||
1202 | mmc_check_cards(host); | ||
1203 | |||
1189 | if (!list_empty(&host->cards)) { | 1204 | if (!list_empty(&host->cards)) { |
1190 | /* | 1205 | /* |
1191 | * (Re-)calculate the fastest clock rate which the | 1206 | * (Re-)calculate the fastest clock rate which the |
diff --git a/drivers/mmc/tifm_sd.c b/drivers/mmc/tifm_sd.c index 2bacff60913d..0fdc55b08a6d 100644 --- a/drivers/mmc/tifm_sd.c +++ b/drivers/mmc/tifm_sd.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/mmc/protocol.h> | 14 | #include <linux/mmc/protocol.h> |
15 | #include <linux/mmc/host.h> | 15 | #include <linux/mmc/host.h> |
16 | #include <linux/highmem.h> | 16 | #include <linux/highmem.h> |
17 | #include <asm/io.h> | ||
17 | 18 | ||
18 | #define DRIVER_NAME "tifm_sd" | 19 | #define DRIVER_NAME "tifm_sd" |
19 | #define DRIVER_VERSION "0.6" | 20 | #define DRIVER_VERSION "0.6" |
diff --git a/drivers/mtd/chips/cfi_cmdset_0001.c b/drivers/mtd/chips/cfi_cmdset_0001.c index 11de54535526..f69184a92eb2 100644 --- a/drivers/mtd/chips/cfi_cmdset_0001.c +++ b/drivers/mtd/chips/cfi_cmdset_0001.c | |||
@@ -1086,7 +1086,7 @@ static int inval_cache_and_wait_for_operation( | |||
1086 | } | 1086 | } |
1087 | spin_lock(chip->mutex); | 1087 | spin_lock(chip->mutex); |
1088 | 1088 | ||
1089 | if (chip->state != chip_state) { | 1089 | while (chip->state != chip_state) { |
1090 | /* Someone's suspended the operation: sleep */ | 1090 | /* Someone's suspended the operation: sleep */ |
1091 | DECLARE_WAITQUEUE(wait, current); | 1091 | DECLARE_WAITQUEUE(wait, current); |
1092 | set_current_state(TASK_UNINTERRUPTIBLE); | 1092 | set_current_state(TASK_UNINTERRUPTIBLE); |
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index eed3271b99cc..dfe56e03e48b 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
@@ -1493,6 +1493,7 @@ static void nand_write_page_syndrome(struct mtd_info *mtd, | |||
1493 | * @buf: the data to write | 1493 | * @buf: the data to write |
1494 | * @page: page number to write | 1494 | * @page: page number to write |
1495 | * @cached: cached programming | 1495 | * @cached: cached programming |
1496 | * @raw: use _raw version of write_page | ||
1496 | */ | 1497 | */ |
1497 | static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip, | 1498 | static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip, |
1498 | const uint8_t *buf, int page, int cached, int raw) | 1499 | const uint8_t *buf, int page, int cached, int raw) |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index ab92cc794c64..6e863aa9894c 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -486,7 +486,7 @@ config SGI_IOC3_ETH_HW_TX_CSUM | |||
486 | 486 | ||
487 | config MIPS_SIM_NET | 487 | config MIPS_SIM_NET |
488 | tristate "MIPS simulator Network device (EXPERIMENTAL)" | 488 | tristate "MIPS simulator Network device (EXPERIMENTAL)" |
489 | depends on NETDEVICES && MIPS_SIM && EXPERIMENTAL | 489 | depends on MIPS_SIM && EXPERIMENTAL |
490 | help | 490 | help |
491 | The MIPSNET device is a simple Ethernet network device which is | 491 | The MIPSNET device is a simple Ethernet network device which is |
492 | emulated by the MIPS Simulator. | 492 | emulated by the MIPS Simulator. |
@@ -2112,7 +2112,7 @@ config SKGE | |||
2112 | 2112 | ||
2113 | config SKY2 | 2113 | config SKY2 |
2114 | tristate "SysKonnect Yukon2 support (EXPERIMENTAL)" | 2114 | tristate "SysKonnect Yukon2 support (EXPERIMENTAL)" |
2115 | depends on PCI && EXPERIMENTAL | 2115 | depends on PCI |
2116 | select CRC32 | 2116 | select CRC32 |
2117 | ---help--- | 2117 | ---help--- |
2118 | This driver supports Gigabit Ethernet adapters based on the | 2118 | This driver supports Gigabit Ethernet adapters based on the |
@@ -2120,8 +2120,8 @@ config SKY2 | |||
2120 | Marvell 88E8021/88E8022/88E8035/88E8036/88E8038/88E8050/88E8052/ | 2120 | Marvell 88E8021/88E8022/88E8035/88E8036/88E8038/88E8050/88E8052/ |
2121 | 88E8053/88E8055/88E8061/88E8062, SysKonnect SK-9E21D/SK-9S21 | 2121 | 88E8053/88E8055/88E8061/88E8062, SysKonnect SK-9E21D/SK-9S21 |
2122 | 2122 | ||
2123 | This driver does not support the original Yukon chipset: a seperate | 2123 | There is companion driver for the older Marvell Yukon and |
2124 | driver, skge, is provided for Yukon-based adapters. | 2124 | Genesis based adapters: skge. |
2125 | 2125 | ||
2126 | To compile this driver as a module, choose M here: the module | 2126 | To compile this driver as a module, choose M here: the module |
2127 | will be called sky2. This is recommended. | 2127 | will be called sky2. This is recommended. |
@@ -2288,7 +2288,7 @@ config UGETH_TX_ON_DEMOND | |||
2288 | 2288 | ||
2289 | config UGETH_HAS_GIGA | 2289 | config UGETH_HAS_GIGA |
2290 | bool | 2290 | bool |
2291 | depends on UCC_GETH && MPC836x | 2291 | depends on UCC_GETH && PPC_MPC836x |
2292 | 2292 | ||
2293 | config MV643XX_ETH | 2293 | config MV643XX_ETH |
2294 | tristate "MV-643XX Ethernet support" | 2294 | tristate "MV-643XX Ethernet support" |
@@ -2467,7 +2467,7 @@ config ISERIES_VETH | |||
2467 | 2467 | ||
2468 | config RIONET | 2468 | config RIONET |
2469 | tristate "RapidIO Ethernet over messaging driver support" | 2469 | tristate "RapidIO Ethernet over messaging driver support" |
2470 | depends on NETDEVICES && RAPIDIO | 2470 | depends on RAPIDIO |
2471 | 2471 | ||
2472 | config RIONET_TX_SIZE | 2472 | config RIONET_TX_SIZE |
2473 | int "Number of outbound queue entries" | 2473 | int "Number of outbound queue entries" |
@@ -2717,6 +2717,7 @@ config PPP_MPPE | |||
2717 | select CRYPTO | 2717 | select CRYPTO |
2718 | select CRYPTO_SHA1 | 2718 | select CRYPTO_SHA1 |
2719 | select CRYPTO_ARC4 | 2719 | select CRYPTO_ARC4 |
2720 | select CRYPTO_ECB | ||
2720 | ---help--- | 2721 | ---help--- |
2721 | Support for the MPPE Encryption protocol, as employed by the | 2722 | Support for the MPPE Encryption protocol, as employed by the |
2722 | Microsoft Point-to-Point Tunneling Protocol. | 2723 | Microsoft Point-to-Point Tunneling Protocol. |
@@ -2832,7 +2833,7 @@ config NET_FC | |||
2832 | "SCSI generic support". | 2833 | "SCSI generic support". |
2833 | 2834 | ||
2834 | config SHAPER | 2835 | config SHAPER |
2835 | tristate "Traffic Shaper (EXPERIMENTAL)" | 2836 | tristate "Traffic Shaper (OBSOLETE)" |
2836 | depends on EXPERIMENTAL | 2837 | depends on EXPERIMENTAL |
2837 | ---help--- | 2838 | ---help--- |
2838 | The traffic shaper is a virtual network device that allows you to | 2839 | The traffic shaper is a virtual network device that allows you to |
@@ -2841,9 +2842,9 @@ config SHAPER | |||
2841 | these virtual devices. See | 2842 | these virtual devices. See |
2842 | <file:Documentation/networking/shaper.txt> for more information. | 2843 | <file:Documentation/networking/shaper.txt> for more information. |
2843 | 2844 | ||
2844 | An alternative to this traffic shaper is the experimental | 2845 | An alternative to this traffic shaper are traffic schedulers which |
2845 | Class-Based Queuing (CBQ) scheduling support which you get if you | 2846 | you'll get if you say Y to "QoS and/or fair queuing" in |
2846 | say Y to "QoS and/or fair queuing" above. | 2847 | "Networking options". |
2847 | 2848 | ||
2848 | To compile this driver as a module, choose M here: the module | 2849 | To compile this driver as a module, choose M here: the module |
2849 | will be called shaper. If unsure, say N. | 2850 | will be called shaper. If unsure, say N. |
diff --git a/drivers/net/arcnet/com20020.c b/drivers/net/arcnet/com20020.c index 0dc70c7b7940..aa9dd8f11269 100644 --- a/drivers/net/arcnet/com20020.c +++ b/drivers/net/arcnet/com20020.c | |||
@@ -337,13 +337,16 @@ static void com20020_set_mc_list(struct net_device *dev) | |||
337 | } | 337 | } |
338 | } | 338 | } |
339 | 339 | ||
340 | #ifdef MODULE | 340 | #if defined(CONFIG_ARCNET_COM20020_PCI_MODULE) || \ |
341 | 341 | defined(CONFIG_ARCNET_COM20020_ISA_MODULE) | |
342 | EXPORT_SYMBOL(com20020_check); | 342 | EXPORT_SYMBOL(com20020_check); |
343 | EXPORT_SYMBOL(com20020_found); | 343 | EXPORT_SYMBOL(com20020_found); |
344 | #endif | ||
344 | 345 | ||
345 | MODULE_LICENSE("GPL"); | 346 | MODULE_LICENSE("GPL"); |
346 | 347 | ||
348 | #ifdef MODULE | ||
349 | |||
347 | int init_module(void) | 350 | int init_module(void) |
348 | { | 351 | { |
349 | BUGLVL(D_NORMAL) printk(VERSION); | 352 | BUGLVL(D_NORMAL) printk(VERSION); |
diff --git a/drivers/net/arm/ep93xx_eth.c b/drivers/net/arm/ep93xx_eth.c index 127561c782fd..8ebd68e2af98 100644 --- a/drivers/net/arm/ep93xx_eth.c +++ b/drivers/net/arm/ep93xx_eth.c | |||
@@ -193,12 +193,9 @@ static struct net_device_stats *ep93xx_get_stats(struct net_device *dev) | |||
193 | static int ep93xx_rx(struct net_device *dev, int *budget) | 193 | static int ep93xx_rx(struct net_device *dev, int *budget) |
194 | { | 194 | { |
195 | struct ep93xx_priv *ep = netdev_priv(dev); | 195 | struct ep93xx_priv *ep = netdev_priv(dev); |
196 | int tail_offset; | ||
197 | int rx_done; | 196 | int rx_done; |
198 | int processed; | 197 | int processed; |
199 | 198 | ||
200 | tail_offset = rdl(ep, REG_RXSTSQCURADD) - ep->descs_dma_addr; | ||
201 | |||
202 | rx_done = 0; | 199 | rx_done = 0; |
203 | processed = 0; | 200 | processed = 0; |
204 | while (*budget > 0) { | 201 | while (*budget > 0) { |
@@ -211,36 +208,28 @@ static int ep93xx_rx(struct net_device *dev, int *budget) | |||
211 | 208 | ||
212 | entry = ep->rx_pointer; | 209 | entry = ep->rx_pointer; |
213 | rstat = ep->descs->rstat + entry; | 210 | rstat = ep->descs->rstat + entry; |
214 | if ((void *)rstat - (void *)ep->descs == tail_offset) { | 211 | |
212 | rstat0 = rstat->rstat0; | ||
213 | rstat1 = rstat->rstat1; | ||
214 | if (!(rstat0 & RSTAT0_RFP) || !(rstat1 & RSTAT1_RFP)) { | ||
215 | rx_done = 1; | 215 | rx_done = 1; |
216 | break; | 216 | break; |
217 | } | 217 | } |
218 | 218 | ||
219 | rstat0 = rstat->rstat0; | ||
220 | rstat1 = rstat->rstat1; | ||
221 | rstat->rstat0 = 0; | 219 | rstat->rstat0 = 0; |
222 | rstat->rstat1 = 0; | 220 | rstat->rstat1 = 0; |
223 | 221 | ||
224 | if (!(rstat0 & RSTAT0_RFP)) | ||
225 | printk(KERN_CRIT "ep93xx_rx: buffer not done " | ||
226 | " %.8x %.8x\n", rstat0, rstat1); | ||
227 | if (!(rstat0 & RSTAT0_EOF)) | 222 | if (!(rstat0 & RSTAT0_EOF)) |
228 | printk(KERN_CRIT "ep93xx_rx: not end-of-frame " | 223 | printk(KERN_CRIT "ep93xx_rx: not end-of-frame " |
229 | " %.8x %.8x\n", rstat0, rstat1); | 224 | " %.8x %.8x\n", rstat0, rstat1); |
230 | if (!(rstat0 & RSTAT0_EOB)) | 225 | if (!(rstat0 & RSTAT0_EOB)) |
231 | printk(KERN_CRIT "ep93xx_rx: not end-of-buffer " | 226 | printk(KERN_CRIT "ep93xx_rx: not end-of-buffer " |
232 | " %.8x %.8x\n", rstat0, rstat1); | 227 | " %.8x %.8x\n", rstat0, rstat1); |
233 | if (!(rstat1 & RSTAT1_RFP)) | ||
234 | printk(KERN_CRIT "ep93xx_rx: buffer1 not done " | ||
235 | " %.8x %.8x\n", rstat0, rstat1); | ||
236 | if ((rstat1 & RSTAT1_BUFFER_INDEX) >> 16 != entry) | 228 | if ((rstat1 & RSTAT1_BUFFER_INDEX) >> 16 != entry) |
237 | printk(KERN_CRIT "ep93xx_rx: entry mismatch " | 229 | printk(KERN_CRIT "ep93xx_rx: entry mismatch " |
238 | " %.8x %.8x\n", rstat0, rstat1); | 230 | " %.8x %.8x\n", rstat0, rstat1); |
239 | 231 | ||
240 | if (!(rstat0 & RSTAT0_RWE)) { | 232 | if (!(rstat0 & RSTAT0_RWE)) { |
241 | printk(KERN_NOTICE "ep93xx_rx: receive error " | ||
242 | " %.8x %.8x\n", rstat0, rstat1); | ||
243 | |||
244 | ep->stats.rx_errors++; | 233 | ep->stats.rx_errors++; |
245 | if (rstat0 & RSTAT0_OE) | 234 | if (rstat0 & RSTAT0_OE) |
246 | ep->stats.rx_fifo_errors++; | 235 | ep->stats.rx_fifo_errors++; |
@@ -301,13 +290,8 @@ err: | |||
301 | 290 | ||
302 | static int ep93xx_have_more_rx(struct ep93xx_priv *ep) | 291 | static int ep93xx_have_more_rx(struct ep93xx_priv *ep) |
303 | { | 292 | { |
304 | struct ep93xx_rstat *rstat; | 293 | struct ep93xx_rstat *rstat = ep->descs->rstat + ep->rx_pointer; |
305 | int tail_offset; | 294 | return !!((rstat->rstat0 & RSTAT0_RFP) && (rstat->rstat1 & RSTAT1_RFP)); |
306 | |||
307 | rstat = ep->descs->rstat + ep->rx_pointer; | ||
308 | tail_offset = rdl(ep, REG_RXSTSQCURADD) - ep->descs_dma_addr; | ||
309 | |||
310 | return !((void *)rstat - (void *)ep->descs == tail_offset); | ||
311 | } | 295 | } |
312 | 296 | ||
313 | static int ep93xx_poll(struct net_device *dev, int *budget) | 297 | static int ep93xx_poll(struct net_device *dev, int *budget) |
@@ -347,7 +331,7 @@ static int ep93xx_xmit(struct sk_buff *skb, struct net_device *dev) | |||
347 | struct ep93xx_priv *ep = netdev_priv(dev); | 331 | struct ep93xx_priv *ep = netdev_priv(dev); |
348 | int entry; | 332 | int entry; |
349 | 333 | ||
350 | if (unlikely(skb->len) > MAX_PKT_SIZE) { | 334 | if (unlikely(skb->len > MAX_PKT_SIZE)) { |
351 | ep->stats.tx_dropped++; | 335 | ep->stats.tx_dropped++; |
352 | dev_kfree_skb(skb); | 336 | dev_kfree_skb(skb); |
353 | return NETDEV_TX_OK; | 337 | return NETDEV_TX_OK; |
@@ -379,10 +363,8 @@ static int ep93xx_xmit(struct sk_buff *skb, struct net_device *dev) | |||
379 | static void ep93xx_tx_complete(struct net_device *dev) | 363 | static void ep93xx_tx_complete(struct net_device *dev) |
380 | { | 364 | { |
381 | struct ep93xx_priv *ep = netdev_priv(dev); | 365 | struct ep93xx_priv *ep = netdev_priv(dev); |
382 | int tail_offset; | ||
383 | int wake; | 366 | int wake; |
384 | 367 | ||
385 | tail_offset = rdl(ep, REG_TXSTSQCURADD) - ep->descs_dma_addr; | ||
386 | wake = 0; | 368 | wake = 0; |
387 | 369 | ||
388 | spin_lock(&ep->tx_pending_lock); | 370 | spin_lock(&ep->tx_pending_lock); |
@@ -393,15 +375,13 @@ static void ep93xx_tx_complete(struct net_device *dev) | |||
393 | 375 | ||
394 | entry = ep->tx_clean_pointer; | 376 | entry = ep->tx_clean_pointer; |
395 | tstat = ep->descs->tstat + entry; | 377 | tstat = ep->descs->tstat + entry; |
396 | if ((void *)tstat - (void *)ep->descs == tail_offset) | ||
397 | break; | ||
398 | 378 | ||
399 | tstat0 = tstat->tstat0; | 379 | tstat0 = tstat->tstat0; |
380 | if (!(tstat0 & TSTAT0_TXFP)) | ||
381 | break; | ||
382 | |||
400 | tstat->tstat0 = 0; | 383 | tstat->tstat0 = 0; |
401 | 384 | ||
402 | if (!(tstat0 & TSTAT0_TXFP)) | ||
403 | printk(KERN_CRIT "ep93xx_tx_complete: buffer not done " | ||
404 | " %.8x\n", tstat0); | ||
405 | if (tstat0 & TSTAT0_FA) | 385 | if (tstat0 & TSTAT0_FA) |
406 | printk(KERN_CRIT "ep93xx_tx_complete: frame aborted " | 386 | printk(KERN_CRIT "ep93xx_tx_complete: frame aborted " |
407 | " %.8x\n", tstat0); | 387 | " %.8x\n", tstat0); |
diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c index 4873dc610d22..7db3c8af0894 100644 --- a/drivers/net/au1000_eth.c +++ b/drivers/net/au1000_eth.c | |||
@@ -102,7 +102,7 @@ static void enable_mac(struct net_device *, int); | |||
102 | // externs | 102 | // externs |
103 | extern int get_ethernet_addr(char *ethernet_addr); | 103 | extern int get_ethernet_addr(char *ethernet_addr); |
104 | extern void str2eaddr(unsigned char *ea, unsigned char *str); | 104 | extern void str2eaddr(unsigned char *ea, unsigned char *str); |
105 | extern char * __init prom_getcmdline(void); | 105 | extern char * prom_getcmdline(void); |
106 | 106 | ||
107 | /* | 107 | /* |
108 | * Theory of operation | 108 | * Theory of operation |
diff --git a/drivers/net/b44.c b/drivers/net/b44.c index 1ec217433b4c..474a4e3438db 100644 --- a/drivers/net/b44.c +++ b/drivers/net/b44.c | |||
@@ -908,8 +908,9 @@ static irqreturn_t b44_interrupt(int irq, void *dev_id) | |||
908 | istat = br32(bp, B44_ISTAT); | 908 | istat = br32(bp, B44_ISTAT); |
909 | imask = br32(bp, B44_IMASK); | 909 | imask = br32(bp, B44_IMASK); |
910 | 910 | ||
911 | /* ??? What the fuck is the purpose of the interrupt mask | 911 | /* The interrupt mask register controls which interrupt bits |
912 | * ??? register if we have to mask it out by hand anyways? | 912 | * will actually raise an interrupt to the CPU when set by hw/firmware, |
913 | * but doesn't mask off the bits. | ||
913 | */ | 914 | */ |
914 | istat &= imask; | 915 | istat &= imask; |
915 | if (istat) { | 916 | if (istat) { |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index c0bbddae4ec4..17a461152d39 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -4692,6 +4692,8 @@ static int bond_check_params(struct bond_params *params) | |||
4692 | return 0; | 4692 | return 0; |
4693 | } | 4693 | } |
4694 | 4694 | ||
4695 | static struct lock_class_key bonding_netdev_xmit_lock_key; | ||
4696 | |||
4695 | /* Create a new bond based on the specified name and bonding parameters. | 4697 | /* Create a new bond based on the specified name and bonding parameters. |
4696 | * Caller must NOT hold rtnl_lock; we need to release it here before we | 4698 | * Caller must NOT hold rtnl_lock; we need to release it here before we |
4697 | * set up our sysfs entries. | 4699 | * set up our sysfs entries. |
@@ -4727,6 +4729,9 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond | |||
4727 | if (res < 0) { | 4729 | if (res < 0) { |
4728 | goto out_bond; | 4730 | goto out_bond; |
4729 | } | 4731 | } |
4732 | |||
4733 | lockdep_set_class(&bond_dev->_xmit_lock, &bonding_netdev_xmit_lock_key); | ||
4734 | |||
4730 | if (newbond) | 4735 | if (newbond) |
4731 | *newbond = bond_dev->priv; | 4736 | *newbond = bond_dev->priv; |
4732 | 4737 | ||
diff --git a/drivers/net/cris/eth_v10.c b/drivers/net/cris/eth_v10.c index 966b563e42bb..a03d781f6d0a 100644 --- a/drivers/net/cris/eth_v10.c +++ b/drivers/net/cris/eth_v10.c | |||
@@ -509,6 +509,8 @@ etrax_ethernet_init(void) | |||
509 | * does not share cacheline with any other data (to avoid cache bug) | 509 | * does not share cacheline with any other data (to avoid cache bug) |
510 | */ | 510 | */ |
511 | RxDescList[i].skb = dev_alloc_skb(MAX_MEDIA_DATA_SIZE + 2 * L1_CACHE_BYTES); | 511 | RxDescList[i].skb = dev_alloc_skb(MAX_MEDIA_DATA_SIZE + 2 * L1_CACHE_BYTES); |
512 | if (!RxDescList[i].skb) | ||
513 | return -ENOMEM; | ||
512 | RxDescList[i].descr.ctrl = 0; | 514 | RxDescList[i].descr.ctrl = 0; |
513 | RxDescList[i].descr.sw_len = MAX_MEDIA_DATA_SIZE; | 515 | RxDescList[i].descr.sw_len = MAX_MEDIA_DATA_SIZE; |
514 | RxDescList[i].descr.next = virt_to_phys(&RxDescList[i + 1]); | 516 | RxDescList[i].descr.next = virt_to_phys(&RxDescList[i + 1]); |
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index a3a08a5dd185..19ab3441269c 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
@@ -2719,7 +2719,10 @@ static int e100_suspend(struct pci_dev *pdev, pm_message_t state) | |||
2719 | struct net_device *netdev = pci_get_drvdata(pdev); | 2719 | struct net_device *netdev = pci_get_drvdata(pdev); |
2720 | struct nic *nic = netdev_priv(netdev); | 2720 | struct nic *nic = netdev_priv(netdev); |
2721 | 2721 | ||
2722 | netif_poll_disable(nic->netdev); | 2722 | #ifdef CONFIG_E100_NAPI |
2723 | if (netif_running(netdev)) | ||
2724 | netif_poll_disable(nic->netdev); | ||
2725 | #endif | ||
2723 | del_timer_sync(&nic->watchdog); | 2726 | del_timer_sync(&nic->watchdog); |
2724 | netif_carrier_off(nic->netdev); | 2727 | netif_carrier_off(nic->netdev); |
2725 | 2728 | ||
@@ -2763,7 +2766,10 @@ static void e100_shutdown(struct pci_dev *pdev) | |||
2763 | struct net_device *netdev = pci_get_drvdata(pdev); | 2766 | struct net_device *netdev = pci_get_drvdata(pdev); |
2764 | struct nic *nic = netdev_priv(netdev); | 2767 | struct nic *nic = netdev_priv(netdev); |
2765 | 2768 | ||
2766 | netif_poll_disable(nic->netdev); | 2769 | #ifdef CONFIG_E100_NAPI |
2770 | if (netif_running(netdev)) | ||
2771 | netif_poll_disable(nic->netdev); | ||
2772 | #endif | ||
2767 | del_timer_sync(&nic->watchdog); | 2773 | del_timer_sync(&nic->watchdog); |
2768 | netif_carrier_off(nic->netdev); | 2774 | netif_carrier_off(nic->netdev); |
2769 | 2775 | ||
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index 773821e4cf57..c564adbd669b 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c | |||
@@ -461,7 +461,8 @@ e1000_get_regs(struct net_device *netdev, | |||
461 | regs_buff[24] = (uint32_t)phy_data; /* phy local receiver status */ | 461 | regs_buff[24] = (uint32_t)phy_data; /* phy local receiver status */ |
462 | regs_buff[25] = regs_buff[24]; /* phy remote receiver status */ | 462 | regs_buff[25] = regs_buff[24]; /* phy remote receiver status */ |
463 | if (hw->mac_type >= e1000_82540 && | 463 | if (hw->mac_type >= e1000_82540 && |
464 | hw->media_type == e1000_media_type_copper) { | 464 | hw->mac_type < e1000_82571 && |
465 | hw->media_type == e1000_media_type_copper) { | ||
465 | regs_buff[26] = E1000_READ_REG(hw, MANC); | 466 | regs_buff[26] = E1000_READ_REG(hw, MANC); |
466 | } | 467 | } |
467 | } | 468 | } |
@@ -1690,6 +1691,7 @@ static int e1000_wol_exclusion(struct e1000_adapter *adapter, struct ethtool_wol | |||
1690 | int retval = 1; /* fail by default */ | 1691 | int retval = 1; /* fail by default */ |
1691 | 1692 | ||
1692 | switch (hw->device_id) { | 1693 | switch (hw->device_id) { |
1694 | case E1000_DEV_ID_82542: | ||
1693 | case E1000_DEV_ID_82543GC_FIBER: | 1695 | case E1000_DEV_ID_82543GC_FIBER: |
1694 | case E1000_DEV_ID_82543GC_COPPER: | 1696 | case E1000_DEV_ID_82543GC_COPPER: |
1695 | case E1000_DEV_ID_82544EI_FIBER: | 1697 | case E1000_DEV_ID_82544EI_FIBER: |
diff --git a/drivers/net/e1000/e1000_hw.h b/drivers/net/e1000/e1000_hw.h index 112447fd8bf2..449a60303e07 100644 --- a/drivers/net/e1000/e1000_hw.h +++ b/drivers/net/e1000/e1000_hw.h | |||
@@ -1961,9 +1961,9 @@ struct e1000_hw { | |||
1961 | #define E1000_RXDCTL_GRAN 0x01000000 /* RXDCTL Granularity */ | 1961 | #define E1000_RXDCTL_GRAN 0x01000000 /* RXDCTL Granularity */ |
1962 | 1962 | ||
1963 | /* Transmit Descriptor Control */ | 1963 | /* Transmit Descriptor Control */ |
1964 | #define E1000_TXDCTL_PTHRESH 0x000000FF /* TXDCTL Prefetch Threshold */ | 1964 | #define E1000_TXDCTL_PTHRESH 0x0000003F /* TXDCTL Prefetch Threshold */ |
1965 | #define E1000_TXDCTL_HTHRESH 0x0000FF00 /* TXDCTL Host Threshold */ | 1965 | #define E1000_TXDCTL_HTHRESH 0x00003F00 /* TXDCTL Host Threshold */ |
1966 | #define E1000_TXDCTL_WTHRESH 0x00FF0000 /* TXDCTL Writeback Threshold */ | 1966 | #define E1000_TXDCTL_WTHRESH 0x003F0000 /* TXDCTL Writeback Threshold */ |
1967 | #define E1000_TXDCTL_GRAN 0x01000000 /* TXDCTL Granularity */ | 1967 | #define E1000_TXDCTL_GRAN 0x01000000 /* TXDCTL Granularity */ |
1968 | #define E1000_TXDCTL_LWTHRESH 0xFE000000 /* TXDCTL Low Threshold */ | 1968 | #define E1000_TXDCTL_LWTHRESH 0xFE000000 /* TXDCTL Low Threshold */ |
1969 | #define E1000_TXDCTL_FULL_TX_DESC_WB 0x01010000 /* GRAN=1, WTHRESH=1 */ | 1969 | #define E1000_TXDCTL_FULL_TX_DESC_WB 0x01010000 /* GRAN=1, WTHRESH=1 */ |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index ce0d35fe3947..726ec5e88ab2 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -35,7 +35,7 @@ static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; | |||
35 | #else | 35 | #else |
36 | #define DRIVERNAPI "-NAPI" | 36 | #define DRIVERNAPI "-NAPI" |
37 | #endif | 37 | #endif |
38 | #define DRV_VERSION "7.2.9-k2"DRIVERNAPI | 38 | #define DRV_VERSION "7.2.9-k4"DRIVERNAPI |
39 | char e1000_driver_version[] = DRV_VERSION; | 39 | char e1000_driver_version[] = DRV_VERSION; |
40 | static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; | 40 | static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; |
41 | 41 | ||
@@ -699,7 +699,10 @@ e1000_reset(struct e1000_adapter *adapter) | |||
699 | phy_data); | 699 | phy_data); |
700 | } | 700 | } |
701 | 701 | ||
702 | if ((adapter->en_mng_pt) && (adapter->hw.mac_type < e1000_82571)) { | 702 | if ((adapter->en_mng_pt) && |
703 | (adapter->hw.mac_type >= e1000_82540) && | ||
704 | (adapter->hw.mac_type < e1000_82571) && | ||
705 | (adapter->hw.media_type == e1000_media_type_copper)) { | ||
703 | manc = E1000_READ_REG(&adapter->hw, MANC); | 706 | manc = E1000_READ_REG(&adapter->hw, MANC); |
704 | manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST); | 707 | manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST); |
705 | E1000_WRITE_REG(&adapter->hw, MANC, manc); | 708 | E1000_WRITE_REG(&adapter->hw, MANC, manc); |
@@ -1076,8 +1079,9 @@ e1000_remove(struct pci_dev *pdev) | |||
1076 | 1079 | ||
1077 | flush_scheduled_work(); | 1080 | flush_scheduled_work(); |
1078 | 1081 | ||
1079 | if (adapter->hw.mac_type < e1000_82571 && | 1082 | if (adapter->hw.mac_type >= e1000_82540 && |
1080 | adapter->hw.media_type == e1000_media_type_copper) { | 1083 | adapter->hw.mac_type < e1000_82571 && |
1084 | adapter->hw.media_type == e1000_media_type_copper) { | ||
1081 | manc = E1000_READ_REG(&adapter->hw, MANC); | 1085 | manc = E1000_READ_REG(&adapter->hw, MANC); |
1082 | if (manc & E1000_MANC_SMBUS_EN) { | 1086 | if (manc & E1000_MANC_SMBUS_EN) { |
1083 | manc |= E1000_MANC_ARP_EN; | 1087 | manc |= E1000_MANC_ARP_EN; |
@@ -1804,9 +1808,11 @@ e1000_setup_rctl(struct e1000_adapter *adapter) | |||
1804 | * followed by the page buffers. Therefore, skb->data is | 1808 | * followed by the page buffers. Therefore, skb->data is |
1805 | * sized to hold the largest protocol header. | 1809 | * sized to hold the largest protocol header. |
1806 | */ | 1810 | */ |
1811 | /* allocations using alloc_page take too long for regular MTU | ||
1812 | * so only enable packet split for jumbo frames */ | ||
1807 | pages = PAGE_USE_COUNT(adapter->netdev->mtu); | 1813 | pages = PAGE_USE_COUNT(adapter->netdev->mtu); |
1808 | if ((adapter->hw.mac_type > e1000_82547_rev_2) && (pages <= 3) && | 1814 | if ((adapter->hw.mac_type >= e1000_82571) && (pages <= 3) && |
1809 | PAGE_SIZE <= 16384) | 1815 | PAGE_SIZE <= 16384 && (rctl & E1000_RCTL_LPE)) |
1810 | adapter->rx_ps_pages = pages; | 1816 | adapter->rx_ps_pages = pages; |
1811 | else | 1817 | else |
1812 | adapter->rx_ps_pages = 0; | 1818 | adapter->rx_ps_pages = 0; |
@@ -2986,6 +2992,11 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
2986 | return NETDEV_TX_OK; | 2992 | return NETDEV_TX_OK; |
2987 | } | 2993 | } |
2988 | 2994 | ||
2995 | /* 82571 and newer doesn't need the workaround that limited descriptor | ||
2996 | * length to 4kB */ | ||
2997 | if (adapter->hw.mac_type >= e1000_82571) | ||
2998 | max_per_txd = 8192; | ||
2999 | |||
2989 | #ifdef NETIF_F_TSO | 3000 | #ifdef NETIF_F_TSO |
2990 | mss = skb_shinfo(skb)->gso_size; | 3001 | mss = skb_shinfo(skb)->gso_size; |
2991 | /* The controller does a simple calculation to | 3002 | /* The controller does a simple calculation to |
@@ -3775,9 +3786,6 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
3775 | 3786 | ||
3776 | length = le16_to_cpu(rx_desc->length); | 3787 | length = le16_to_cpu(rx_desc->length); |
3777 | 3788 | ||
3778 | /* adjust length to remove Ethernet CRC */ | ||
3779 | length -= 4; | ||
3780 | |||
3781 | if (unlikely(!(status & E1000_RXD_STAT_EOP))) { | 3789 | if (unlikely(!(status & E1000_RXD_STAT_EOP))) { |
3782 | /* All receives must fit into a single buffer */ | 3790 | /* All receives must fit into a single buffer */ |
3783 | E1000_DBG("%s: Receive packet consumed multiple" | 3791 | E1000_DBG("%s: Receive packet consumed multiple" |
@@ -3805,6 +3813,10 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
3805 | } | 3813 | } |
3806 | } | 3814 | } |
3807 | 3815 | ||
3816 | /* adjust length to remove Ethernet CRC, this must be | ||
3817 | * done after the TBI_ACCEPT workaround above */ | ||
3818 | length -= 4; | ||
3819 | |||
3808 | /* code added for copybreak, this should improve | 3820 | /* code added for copybreak, this should improve |
3809 | * performance for small packets with large amounts | 3821 | * performance for small packets with large amounts |
3810 | * of reassembly being done in the stack */ | 3822 | * of reassembly being done in the stack */ |
@@ -4773,8 +4785,9 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state) | |||
4773 | pci_enable_wake(pdev, PCI_D3cold, 0); | 4785 | pci_enable_wake(pdev, PCI_D3cold, 0); |
4774 | } | 4786 | } |
4775 | 4787 | ||
4776 | if (adapter->hw.mac_type < e1000_82571 && | 4788 | if (adapter->hw.mac_type >= e1000_82540 && |
4777 | adapter->hw.media_type == e1000_media_type_copper) { | 4789 | adapter->hw.mac_type < e1000_82571 && |
4790 | adapter->hw.media_type == e1000_media_type_copper) { | ||
4778 | manc = E1000_READ_REG(&adapter->hw, MANC); | 4791 | manc = E1000_READ_REG(&adapter->hw, MANC); |
4779 | if (manc & E1000_MANC_SMBUS_EN) { | 4792 | if (manc & E1000_MANC_SMBUS_EN) { |
4780 | manc |= E1000_MANC_ARP_EN; | 4793 | manc |= E1000_MANC_ARP_EN; |
@@ -4787,6 +4800,9 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state) | |||
4787 | if (adapter->hw.phy_type == e1000_phy_igp_3) | 4800 | if (adapter->hw.phy_type == e1000_phy_igp_3) |
4788 | e1000_phy_powerdown_workaround(&adapter->hw); | 4801 | e1000_phy_powerdown_workaround(&adapter->hw); |
4789 | 4802 | ||
4803 | if (netif_running(netdev)) | ||
4804 | e1000_free_irq(adapter); | ||
4805 | |||
4790 | /* Release control of h/w to f/w. If f/w is AMT enabled, this | 4806 | /* Release control of h/w to f/w. If f/w is AMT enabled, this |
4791 | * would have already happened in close and is redundant. */ | 4807 | * would have already happened in close and is redundant. */ |
4792 | e1000_release_hw_control(adapter); | 4808 | e1000_release_hw_control(adapter); |
@@ -4817,6 +4833,10 @@ e1000_resume(struct pci_dev *pdev) | |||
4817 | pci_enable_wake(pdev, PCI_D3hot, 0); | 4833 | pci_enable_wake(pdev, PCI_D3hot, 0); |
4818 | pci_enable_wake(pdev, PCI_D3cold, 0); | 4834 | pci_enable_wake(pdev, PCI_D3cold, 0); |
4819 | 4835 | ||
4836 | if (netif_running(netdev) && (err = e1000_request_irq(adapter))) | ||
4837 | return err; | ||
4838 | |||
4839 | e1000_power_up_phy(adapter); | ||
4820 | e1000_reset(adapter); | 4840 | e1000_reset(adapter); |
4821 | E1000_WRITE_REG(&adapter->hw, WUS, ~0); | 4841 | E1000_WRITE_REG(&adapter->hw, WUS, ~0); |
4822 | 4842 | ||
@@ -4825,8 +4845,9 @@ e1000_resume(struct pci_dev *pdev) | |||
4825 | 4845 | ||
4826 | netif_device_attach(netdev); | 4846 | netif_device_attach(netdev); |
4827 | 4847 | ||
4828 | if (adapter->hw.mac_type < e1000_82571 && | 4848 | if (adapter->hw.mac_type >= e1000_82540 && |
4829 | adapter->hw.media_type == e1000_media_type_copper) { | 4849 | adapter->hw.mac_type < e1000_82571 && |
4850 | adapter->hw.media_type == e1000_media_type_copper) { | ||
4830 | manc = E1000_READ_REG(&adapter->hw, MANC); | 4851 | manc = E1000_READ_REG(&adapter->hw, MANC); |
4831 | manc &= ~(E1000_MANC_ARP_EN); | 4852 | manc &= ~(E1000_MANC_ARP_EN); |
4832 | E1000_WRITE_REG(&adapter->hw, MANC, manc); | 4853 | E1000_WRITE_REG(&adapter->hw, MANC, manc); |
@@ -4914,10 +4935,6 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev) | |||
4914 | pci_enable_wake(pdev, PCI_D3hot, 0); | 4935 | pci_enable_wake(pdev, PCI_D3hot, 0); |
4915 | pci_enable_wake(pdev, PCI_D3cold, 0); | 4936 | pci_enable_wake(pdev, PCI_D3cold, 0); |
4916 | 4937 | ||
4917 | /* Perform card reset only on one instance of the card */ | ||
4918 | if (PCI_FUNC (pdev->devfn) != 0) | ||
4919 | return PCI_ERS_RESULT_RECOVERED; | ||
4920 | |||
4921 | e1000_reset(adapter); | 4938 | e1000_reset(adapter); |
4922 | E1000_WRITE_REG(&adapter->hw, WUS, ~0); | 4939 | E1000_WRITE_REG(&adapter->hw, WUS, ~0); |
4923 | 4940 | ||
@@ -4948,6 +4965,7 @@ static void e1000_io_resume(struct pci_dev *pdev) | |||
4948 | netif_device_attach(netdev); | 4965 | netif_device_attach(netdev); |
4949 | 4966 | ||
4950 | if (adapter->hw.mac_type >= e1000_82540 && | 4967 | if (adapter->hw.mac_type >= e1000_82540 && |
4968 | adapter->hw.mac_type < e1000_82571 && | ||
4951 | adapter->hw.media_type == e1000_media_type_copper) { | 4969 | adapter->hw.media_type == e1000_media_type_copper) { |
4952 | manc = E1000_READ_REG(&adapter->hw, MANC); | 4970 | manc = E1000_READ_REG(&adapter->hw, MANC); |
4953 | manc &= ~(E1000_MANC_ARP_EN); | 4971 | manc &= ~(E1000_MANC_ARP_EN); |
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index b40724fc6b74..39ad9f73d1ec 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
@@ -39,7 +39,7 @@ | |||
39 | #include <asm/io.h> | 39 | #include <asm/io.h> |
40 | 40 | ||
41 | #define DRV_NAME "ehea" | 41 | #define DRV_NAME "ehea" |
42 | #define DRV_VERSION "EHEA_0034" | 42 | #define DRV_VERSION "EHEA_0043" |
43 | 43 | ||
44 | #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ | 44 | #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ |
45 | | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR) | 45 | | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR) |
@@ -105,9 +105,6 @@ | |||
105 | #define EHEA_BCMC_VLANID_ALL 0x01 | 105 | #define EHEA_BCMC_VLANID_ALL 0x01 |
106 | #define EHEA_BCMC_VLANID_SINGLE 0x00 | 106 | #define EHEA_BCMC_VLANID_SINGLE 0x00 |
107 | 107 | ||
108 | /* Use this define to kmallocate pHYP control blocks */ | ||
109 | #define H_CB_ALIGNMENT 4096 | ||
110 | |||
111 | #define EHEA_CACHE_LINE 128 | 108 | #define EHEA_CACHE_LINE 128 |
112 | 109 | ||
113 | /* Memory Regions */ | 110 | /* Memory Regions */ |
diff --git a/drivers/net/ehea/ehea_ethtool.c b/drivers/net/ehea/ehea_ethtool.c index 82eb2fb8c75e..9f57c2e78ced 100644 --- a/drivers/net/ehea/ehea_ethtool.c +++ b/drivers/net/ehea/ehea_ethtool.c | |||
@@ -238,7 +238,7 @@ static void ehea_get_ethtool_stats(struct net_device *dev, | |||
238 | data[i++] = port->port_res[0].swqe_refill_th; | 238 | data[i++] = port->port_res[0].swqe_refill_th; |
239 | data[i++] = port->resets; | 239 | data[i++] = port->resets; |
240 | 240 | ||
241 | cb6 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 241 | cb6 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
242 | if (!cb6) { | 242 | if (!cb6) { |
243 | ehea_error("no mem for cb6"); | 243 | ehea_error("no mem for cb6"); |
244 | return; | 244 | return; |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index eb7d44de59ff..6ad696101418 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
@@ -92,7 +92,7 @@ static struct net_device_stats *ehea_get_stats(struct net_device *dev) | |||
92 | 92 | ||
93 | memset(stats, 0, sizeof(*stats)); | 93 | memset(stats, 0, sizeof(*stats)); |
94 | 94 | ||
95 | cb2 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 95 | cb2 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
96 | if (!cb2) { | 96 | if (!cb2) { |
97 | ehea_error("no mem for cb2"); | 97 | ehea_error("no mem for cb2"); |
98 | goto out; | 98 | goto out; |
@@ -586,8 +586,8 @@ int ehea_sense_port_attr(struct ehea_port *port) | |||
586 | u64 hret; | 586 | u64 hret; |
587 | struct hcp_ehea_port_cb0 *cb0; | 587 | struct hcp_ehea_port_cb0 *cb0; |
588 | 588 | ||
589 | cb0 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 589 | cb0 = kzalloc(PAGE_SIZE, GFP_ATOMIC); /* May be called via */ |
590 | if (!cb0) { | 590 | if (!cb0) { /* ehea_neq_tasklet() */ |
591 | ehea_error("no mem for cb0"); | 591 | ehea_error("no mem for cb0"); |
592 | ret = -ENOMEM; | 592 | ret = -ENOMEM; |
593 | goto out; | 593 | goto out; |
@@ -670,7 +670,7 @@ int ehea_set_portspeed(struct ehea_port *port, u32 port_speed) | |||
670 | u64 hret; | 670 | u64 hret; |
671 | int ret = 0; | 671 | int ret = 0; |
672 | 672 | ||
673 | cb4 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 673 | cb4 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
674 | if (!cb4) { | 674 | if (!cb4) { |
675 | ehea_error("no mem for cb4"); | 675 | ehea_error("no mem for cb4"); |
676 | ret = -ENOMEM; | 676 | ret = -ENOMEM; |
@@ -765,8 +765,7 @@ static void ehea_parse_eqe(struct ehea_adapter *adapter, u64 eqe) | |||
765 | 765 | ||
766 | if (EHEA_BMASK_GET(NEQE_PORT_UP, eqe)) { | 766 | if (EHEA_BMASK_GET(NEQE_PORT_UP, eqe)) { |
767 | if (!netif_carrier_ok(port->netdev)) { | 767 | if (!netif_carrier_ok(port->netdev)) { |
768 | ret = ehea_sense_port_attr( | 768 | ret = ehea_sense_port_attr(port); |
769 | port); | ||
770 | if (ret) { | 769 | if (ret) { |
771 | ehea_error("failed resensing port " | 770 | ehea_error("failed resensing port " |
772 | "attributes"); | 771 | "attributes"); |
@@ -986,7 +985,7 @@ static int ehea_configure_port(struct ehea_port *port) | |||
986 | struct hcp_ehea_port_cb0 *cb0; | 985 | struct hcp_ehea_port_cb0 *cb0; |
987 | 986 | ||
988 | ret = -ENOMEM; | 987 | ret = -ENOMEM; |
989 | cb0 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 988 | cb0 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
990 | if (!cb0) | 989 | if (!cb0) |
991 | goto out; | 990 | goto out; |
992 | 991 | ||
@@ -1444,7 +1443,7 @@ static int ehea_set_mac_addr(struct net_device *dev, void *sa) | |||
1444 | goto out; | 1443 | goto out; |
1445 | } | 1444 | } |
1446 | 1445 | ||
1447 | cb0 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 1446 | cb0 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
1448 | if (!cb0) { | 1447 | if (!cb0) { |
1449 | ehea_error("no mem for cb0"); | 1448 | ehea_error("no mem for cb0"); |
1450 | ret = -ENOMEM; | 1449 | ret = -ENOMEM; |
@@ -1502,7 +1501,7 @@ static void ehea_promiscuous(struct net_device *dev, int enable) | |||
1502 | if ((enable && port->promisc) || (!enable && !port->promisc)) | 1501 | if ((enable && port->promisc) || (!enable && !port->promisc)) |
1503 | return; | 1502 | return; |
1504 | 1503 | ||
1505 | cb7 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 1504 | cb7 = kzalloc(PAGE_SIZE, GFP_ATOMIC); |
1506 | if (!cb7) { | 1505 | if (!cb7) { |
1507 | ehea_error("no mem for cb7"); | 1506 | ehea_error("no mem for cb7"); |
1508 | goto out; | 1507 | goto out; |
@@ -1606,7 +1605,7 @@ static void ehea_add_multicast_entry(struct ehea_port* port, u8* mc_mac_addr) | |||
1606 | struct ehea_mc_list *ehea_mcl_entry; | 1605 | struct ehea_mc_list *ehea_mcl_entry; |
1607 | u64 hret; | 1606 | u64 hret; |
1608 | 1607 | ||
1609 | ehea_mcl_entry = kzalloc(sizeof(*ehea_mcl_entry), GFP_KERNEL); | 1608 | ehea_mcl_entry = kzalloc(sizeof(*ehea_mcl_entry), GFP_ATOMIC); |
1610 | if (!ehea_mcl_entry) { | 1609 | if (!ehea_mcl_entry) { |
1611 | ehea_error("no mem for mcl_entry"); | 1610 | ehea_error("no mem for mcl_entry"); |
1612 | return; | 1611 | return; |
@@ -1871,7 +1870,7 @@ static void ehea_vlan_rx_register(struct net_device *dev, | |||
1871 | 1870 | ||
1872 | port->vgrp = grp; | 1871 | port->vgrp = grp; |
1873 | 1872 | ||
1874 | cb1 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 1873 | cb1 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
1875 | if (!cb1) { | 1874 | if (!cb1) { |
1876 | ehea_error("no mem for cb1"); | 1875 | ehea_error("no mem for cb1"); |
1877 | goto out; | 1876 | goto out; |
@@ -1900,7 +1899,7 @@ static void ehea_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) | |||
1900 | int index; | 1899 | int index; |
1901 | u64 hret; | 1900 | u64 hret; |
1902 | 1901 | ||
1903 | cb1 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 1902 | cb1 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
1904 | if (!cb1) { | 1903 | if (!cb1) { |
1905 | ehea_error("no mem for cb1"); | 1904 | ehea_error("no mem for cb1"); |
1906 | goto out; | 1905 | goto out; |
@@ -1936,7 +1935,7 @@ static void ehea_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
1936 | if (port->vgrp) | 1935 | if (port->vgrp) |
1937 | port->vgrp->vlan_devices[vid] = NULL; | 1936 | port->vgrp->vlan_devices[vid] = NULL; |
1938 | 1937 | ||
1939 | cb1 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 1938 | cb1 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
1940 | if (!cb1) { | 1939 | if (!cb1) { |
1941 | ehea_error("no mem for cb1"); | 1940 | ehea_error("no mem for cb1"); |
1942 | goto out; | 1941 | goto out; |
@@ -1969,7 +1968,7 @@ int ehea_activate_qp(struct ehea_adapter *adapter, struct ehea_qp *qp) | |||
1969 | u64 dummy64 = 0; | 1968 | u64 dummy64 = 0; |
1970 | struct hcp_modify_qp_cb0* cb0; | 1969 | struct hcp_modify_qp_cb0* cb0; |
1971 | 1970 | ||
1972 | cb0 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 1971 | cb0 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
1973 | if (!cb0) { | 1972 | if (!cb0) { |
1974 | ret = -ENOMEM; | 1973 | ret = -ENOMEM; |
1975 | goto out; | 1974 | goto out; |
@@ -2270,7 +2269,7 @@ int ehea_sense_adapter_attr(struct ehea_adapter *adapter) | |||
2270 | u64 hret; | 2269 | u64 hret; |
2271 | int ret; | 2270 | int ret; |
2272 | 2271 | ||
2273 | cb = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 2272 | cb = kzalloc(PAGE_SIZE, GFP_KERNEL); |
2274 | if (!cb) { | 2273 | if (!cb) { |
2275 | ret = -ENOMEM; | 2274 | ret = -ENOMEM; |
2276 | goto out; | 2275 | goto out; |
@@ -2341,7 +2340,7 @@ static int ehea_setup_single_port(struct ehea_port *port, | |||
2341 | goto out; | 2340 | goto out; |
2342 | 2341 | ||
2343 | /* Enable Jumbo frames */ | 2342 | /* Enable Jumbo frames */ |
2344 | cb4 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 2343 | cb4 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
2345 | if (!cb4) { | 2344 | if (!cb4) { |
2346 | ehea_error("no mem for cb4"); | 2345 | ehea_error("no mem for cb4"); |
2347 | } else { | 2346 | } else { |
diff --git a/drivers/net/ehea/ehea_phyp.c b/drivers/net/ehea/ehea_phyp.c index 0b51a8cea077..0cfc2bc1a27b 100644 --- a/drivers/net/ehea/ehea_phyp.c +++ b/drivers/net/ehea/ehea_phyp.c | |||
@@ -506,7 +506,7 @@ u64 ehea_h_register_rpage_mr(const u64 adapter_handle, const u64 mr_handle, | |||
506 | const u8 pagesize, const u8 queue_type, | 506 | const u8 pagesize, const u8 queue_type, |
507 | const u64 log_pageaddr, const u64 count) | 507 | const u64 log_pageaddr, const u64 count) |
508 | { | 508 | { |
509 | if ((count > 1) && (log_pageaddr & 0xfff)) { | 509 | if ((count > 1) && (log_pageaddr & ~PAGE_MASK)) { |
510 | ehea_error("not on pageboundary"); | 510 | ehea_error("not on pageboundary"); |
511 | return H_PARAMETER; | 511 | return H_PARAMETER; |
512 | } | 512 | } |
diff --git a/drivers/net/ehea/ehea_phyp.h b/drivers/net/ehea/ehea_phyp.h index fa51e3b5bb05..919f94b75933 100644 --- a/drivers/net/ehea/ehea_phyp.h +++ b/drivers/net/ehea/ehea_phyp.h | |||
@@ -81,14 +81,16 @@ static inline u32 get_longbusy_msecs(int long_busy_ret_code) | |||
81 | static inline void hcp_epas_ctor(struct h_epas *epas, u64 paddr_kernel, | 81 | static inline void hcp_epas_ctor(struct h_epas *epas, u64 paddr_kernel, |
82 | u64 paddr_user) | 82 | u64 paddr_user) |
83 | { | 83 | { |
84 | epas->kernel.addr = ioremap(paddr_kernel, PAGE_SIZE); | 84 | /* To support 64k pages we must round to 64k page boundary */ |
85 | epas->kernel.addr = ioremap((paddr_kernel & PAGE_MASK), PAGE_SIZE) + | ||
86 | (paddr_kernel & ~PAGE_MASK); | ||
85 | epas->user.addr = paddr_user; | 87 | epas->user.addr = paddr_user; |
86 | } | 88 | } |
87 | 89 | ||
88 | static inline void hcp_epas_dtor(struct h_epas *epas) | 90 | static inline void hcp_epas_dtor(struct h_epas *epas) |
89 | { | 91 | { |
90 | if (epas->kernel.addr) | 92 | if (epas->kernel.addr) |
91 | iounmap(epas->kernel.addr); | 93 | iounmap((void __iomem*)((u64)epas->kernel.addr & PAGE_MASK)); |
92 | 94 | ||
93 | epas->user.addr = 0; | 95 | epas->user.addr = 0; |
94 | epas->kernel.addr = 0; | 96 | epas->kernel.addr = 0; |
diff --git a/drivers/net/ehea/ehea_qmr.c b/drivers/net/ehea/ehea_qmr.c index 3e1862326c88..72ef7bde3346 100644 --- a/drivers/net/ehea/ehea_qmr.c +++ b/drivers/net/ehea/ehea_qmr.c | |||
@@ -209,11 +209,11 @@ int ehea_destroy_cq(struct ehea_cq *cq) | |||
209 | { | 209 | { |
210 | u64 adapter_handle, hret; | 210 | u64 adapter_handle, hret; |
211 | 211 | ||
212 | adapter_handle = cq->adapter->handle; | ||
213 | |||
214 | if (!cq) | 212 | if (!cq) |
215 | return 0; | 213 | return 0; |
216 | 214 | ||
215 | adapter_handle = cq->adapter->handle; | ||
216 | |||
217 | /* deregister all previous registered pages */ | 217 | /* deregister all previous registered pages */ |
218 | hret = ehea_h_free_resource(adapter_handle, cq->fw_handle); | 218 | hret = ehea_h_free_resource(adapter_handle, cq->fw_handle); |
219 | if (hret != H_SUCCESS) { | 219 | if (hret != H_SUCCESS) { |
@@ -512,7 +512,7 @@ int ehea_reg_mr_adapter(struct ehea_adapter *adapter) | |||
512 | 512 | ||
513 | start = KERNELBASE; | 513 | start = KERNELBASE; |
514 | end = (u64)high_memory; | 514 | end = (u64)high_memory; |
515 | nr_pages = (end - start) / PAGE_SIZE; | 515 | nr_pages = (end - start) / EHEA_PAGESIZE; |
516 | 516 | ||
517 | pt = kzalloc(PAGE_SIZE, GFP_KERNEL); | 517 | pt = kzalloc(PAGE_SIZE, GFP_KERNEL); |
518 | if (!pt) { | 518 | if (!pt) { |
@@ -538,9 +538,9 @@ int ehea_reg_mr_adapter(struct ehea_adapter *adapter) | |||
538 | if (nr_pages > 1) { | 538 | if (nr_pages > 1) { |
539 | u64 num_pages = min(nr_pages, (u64)512); | 539 | u64 num_pages = min(nr_pages, (u64)512); |
540 | for (i = 0; i < num_pages; i++) | 540 | for (i = 0; i < num_pages; i++) |
541 | pt[i] = virt_to_abs((void*)(((u64)start) | 541 | pt[i] = virt_to_abs((void*)(((u64)start) + |
542 | + ((k++) * | 542 | ((k++) * |
543 | PAGE_SIZE))); | 543 | EHEA_PAGESIZE))); |
544 | 544 | ||
545 | hret = ehea_h_register_rpage_mr(adapter->handle, | 545 | hret = ehea_h_register_rpage_mr(adapter->handle, |
546 | adapter->mr.handle, 0, | 546 | adapter->mr.handle, 0, |
@@ -548,8 +548,9 @@ int ehea_reg_mr_adapter(struct ehea_adapter *adapter) | |||
548 | num_pages); | 548 | num_pages); |
549 | nr_pages -= num_pages; | 549 | nr_pages -= num_pages; |
550 | } else { | 550 | } else { |
551 | u64 abs_adr = virt_to_abs((void*)(((u64)start) | 551 | u64 abs_adr = virt_to_abs((void*)(((u64)start) + |
552 | + (k * PAGE_SIZE))); | 552 | (k * EHEA_PAGESIZE))); |
553 | |||
553 | hret = ehea_h_register_rpage_mr(adapter->handle, | 554 | hret = ehea_h_register_rpage_mr(adapter->handle, |
554 | adapter->mr.handle, 0, | 555 | adapter->mr.handle, 0, |
555 | 0, abs_adr,1); | 556 | 0, abs_adr,1); |
diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c index 86b3bb9bec2d..92420f007b97 100644 --- a/drivers/net/hamradio/6pack.c +++ b/drivers/net/hamradio/6pack.c | |||
@@ -914,7 +914,7 @@ static void decode_prio_command(struct sixpack *sp, unsigned char cmd) | |||
914 | printk(KERN_DEBUG "6pack: protocol violation\n"); | 914 | printk(KERN_DEBUG "6pack: protocol violation\n"); |
915 | else | 915 | else |
916 | sp->status = 0; | 916 | sp->status = 0; |
917 | cmd &= !SIXP_RX_DCD_MASK; | 917 | cmd &= ~SIXP_RX_DCD_MASK; |
918 | } | 918 | } |
919 | sp->status = cmd & SIXP_PRIO_DATA_MASK; | 919 | sp->status = cmd & SIXP_PRIO_DATA_MASK; |
920 | } else { /* output watchdog char if idle */ | 920 | } else { /* output watchdog char if idle */ |
diff --git a/drivers/net/ibmveth.c b/drivers/net/ibmveth.c index 2802db23d3cb..44c9f993dcc4 100644 --- a/drivers/net/ibmveth.c +++ b/drivers/net/ibmveth.c | |||
@@ -212,8 +212,8 @@ static void ibmveth_replenish_buffer_pool(struct ibmveth_adapter *adapter, struc | |||
212 | break; | 212 | break; |
213 | } | 213 | } |
214 | 214 | ||
215 | free_index = pool->consumer_index++ % pool->size; | 215 | free_index = pool->consumer_index; |
216 | pool->consumer_index = free_index; | 216 | pool->consumer_index = (pool->consumer_index + 1) % pool->size; |
217 | index = pool->free_map[free_index]; | 217 | index = pool->free_map[free_index]; |
218 | 218 | ||
219 | ibmveth_assert(index != IBM_VETH_INVALID_MAP); | 219 | ibmveth_assert(index != IBM_VETH_INVALID_MAP); |
@@ -329,8 +329,10 @@ static void ibmveth_remove_buffer_from_pool(struct ibmveth_adapter *adapter, u64 | |||
329 | adapter->rx_buff_pool[pool].buff_size, | 329 | adapter->rx_buff_pool[pool].buff_size, |
330 | DMA_FROM_DEVICE); | 330 | DMA_FROM_DEVICE); |
331 | 331 | ||
332 | free_index = adapter->rx_buff_pool[pool].producer_index++ % adapter->rx_buff_pool[pool].size; | 332 | free_index = adapter->rx_buff_pool[pool].producer_index; |
333 | adapter->rx_buff_pool[pool].producer_index = free_index; | 333 | adapter->rx_buff_pool[pool].producer_index |
334 | = (adapter->rx_buff_pool[pool].producer_index + 1) | ||
335 | % adapter->rx_buff_pool[pool].size; | ||
334 | adapter->rx_buff_pool[pool].free_map[free_index] = index; | 336 | adapter->rx_buff_pool[pool].free_map[free_index] = index; |
335 | 337 | ||
336 | mb(); | 338 | mb(); |
diff --git a/drivers/net/ioc3-eth.c b/drivers/net/ioc3-eth.c index e963dbf816be..f56b00ee385e 100644 --- a/drivers/net/ioc3-eth.c +++ b/drivers/net/ioc3-eth.c | |||
@@ -1017,7 +1017,7 @@ static void ioc3_init(struct net_device *dev) | |||
1017 | struct ioc3_private *ip = netdev_priv(dev); | 1017 | struct ioc3_private *ip = netdev_priv(dev); |
1018 | struct ioc3 *ioc3 = ip->regs; | 1018 | struct ioc3 *ioc3 = ip->regs; |
1019 | 1019 | ||
1020 | del_timer(&ip->ioc3_timer); /* Kill if running */ | 1020 | del_timer_sync(&ip->ioc3_timer); /* Kill if running */ |
1021 | 1021 | ||
1022 | ioc3_w_emcr(EMCR_RST); /* Reset */ | 1022 | ioc3_w_emcr(EMCR_RST); /* Reset */ |
1023 | (void) ioc3_r_emcr(); /* Flush WB */ | 1023 | (void) ioc3_r_emcr(); /* Flush WB */ |
@@ -1081,7 +1081,7 @@ static int ioc3_close(struct net_device *dev) | |||
1081 | { | 1081 | { |
1082 | struct ioc3_private *ip = netdev_priv(dev); | 1082 | struct ioc3_private *ip = netdev_priv(dev); |
1083 | 1083 | ||
1084 | del_timer(&ip->ioc3_timer); | 1084 | del_timer_sync(&ip->ioc3_timer); |
1085 | 1085 | ||
1086 | netif_stop_queue(dev); | 1086 | netif_stop_queue(dev); |
1087 | 1087 | ||
diff --git a/drivers/net/irda/stir4200.c b/drivers/net/irda/stir4200.c index be8a66e702b0..3b4c47875935 100644 --- a/drivers/net/irda/stir4200.c +++ b/drivers/net/irda/stir4200.c | |||
@@ -15,8 +15,7 @@ | |||
15 | * | 15 | * |
16 | * This program is free software; you can redistribute it and/or modify | 16 | * This program is free software; you can redistribute it and/or modify |
17 | * it under the terms of the GNU General Public License as published by | 17 | * it under the terms of the GNU General Public License as published by |
18 | * the Free Software Foundation; either version 2 of the License, or | 18 | * the Free Software Foundation; either version 2 of the License. |
19 | * (at your option) any later version. | ||
20 | * | 19 | * |
21 | * This program is distributed in the hope that it will be useful, | 20 | * This program is distributed in the hope that it will be useful, |
22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index fdbb0d7213b0..806081b59733 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -2416,7 +2416,6 @@ static void myri10ge_enable_ecrc(struct myri10ge_priv *mgp) | |||
2416 | * firmware image, and set tx.boundary to 4KB. | 2416 | * firmware image, and set tx.boundary to 4KB. |
2417 | */ | 2417 | */ |
2418 | 2418 | ||
2419 | #define PCI_DEVICE_ID_SERVERWORKS_HT2000_PCIE 0x0132 | ||
2420 | #define PCI_DEVICE_ID_INTEL_E5000_PCIE23 0x25f7 | 2419 | #define PCI_DEVICE_ID_INTEL_E5000_PCIE23 0x25f7 |
2421 | #define PCI_DEVICE_ID_INTEL_E5000_PCIE47 0x25fa | 2420 | #define PCI_DEVICE_ID_INTEL_E5000_PCIE47 0x25fa |
2422 | 2421 | ||
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index f1c75751cab7..b977ed85ff39 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -214,6 +214,7 @@ static struct pci_device_id rtl8169_pci_tbl[] = { | |||
214 | { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8168), 0, 0, RTL_CFG_2 }, | 214 | { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8168), 0, 0, RTL_CFG_2 }, |
215 | { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8169), 0, 0, RTL_CFG_0 }, | 215 | { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8169), 0, 0, RTL_CFG_0 }, |
216 | { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4300), 0, 0, RTL_CFG_0 }, | 216 | { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4300), 0, 0, RTL_CFG_0 }, |
217 | { PCI_DEVICE(0x1259, 0xc107), 0, 0, RTL_CFG_0 }, | ||
217 | { PCI_DEVICE(0x16ec, 0x0116), 0, 0, RTL_CFG_0 }, | 218 | { PCI_DEVICE(0x16ec, 0x0116), 0, 0, RTL_CFG_0 }, |
218 | { PCI_VENDOR_ID_LINKSYS, 0x1032, | 219 | { PCI_VENDOR_ID_LINKSYS, 0x1032, |
219 | PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 }, | 220 | PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 }, |
@@ -1396,41 +1397,6 @@ static void rtl8169_netpoll(struct net_device *dev) | |||
1396 | } | 1397 | } |
1397 | #endif | 1398 | #endif |
1398 | 1399 | ||
1399 | static void __rtl8169_set_mac_addr(struct net_device *dev, void __iomem *ioaddr) | ||
1400 | { | ||
1401 | unsigned int i, j; | ||
1402 | |||
1403 | RTL_W8(Cfg9346, Cfg9346_Unlock); | ||
1404 | for (i = 0; i < 2; i++) { | ||
1405 | __le32 l = 0; | ||
1406 | |||
1407 | for (j = 0; j < 4; j++) { | ||
1408 | l <<= 8; | ||
1409 | l |= dev->dev_addr[4*i + j]; | ||
1410 | } | ||
1411 | RTL_W32(MAC0 + 4*i, cpu_to_be32(l)); | ||
1412 | } | ||
1413 | RTL_W8(Cfg9346, Cfg9346_Lock); | ||
1414 | } | ||
1415 | |||
1416 | static int rtl8169_set_mac_addr(struct net_device *dev, void *p) | ||
1417 | { | ||
1418 | struct rtl8169_private *tp = netdev_priv(dev); | ||
1419 | struct sockaddr *addr = p; | ||
1420 | |||
1421 | if (!is_valid_ether_addr(addr->sa_data)) | ||
1422 | return -EINVAL; | ||
1423 | |||
1424 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); | ||
1425 | |||
1426 | if (netif_running(dev)) { | ||
1427 | spin_lock_irq(&tp->lock); | ||
1428 | __rtl8169_set_mac_addr(dev, tp->mmio_addr); | ||
1429 | spin_unlock_irq(&tp->lock); | ||
1430 | } | ||
1431 | return 0; | ||
1432 | } | ||
1433 | |||
1434 | static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev, | 1400 | static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev, |
1435 | void __iomem *ioaddr) | 1401 | void __iomem *ioaddr) |
1436 | { | 1402 | { |
@@ -1507,8 +1473,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1507 | struct rtl8169_private *tp; | 1473 | struct rtl8169_private *tp; |
1508 | struct net_device *dev; | 1474 | struct net_device *dev; |
1509 | void __iomem *ioaddr; | 1475 | void __iomem *ioaddr; |
1510 | unsigned int i, pm_cap; | 1476 | unsigned int pm_cap; |
1511 | int rc; | 1477 | int i, rc; |
1512 | 1478 | ||
1513 | if (netif_msg_drv(&debug)) { | 1479 | if (netif_msg_drv(&debug)) { |
1514 | printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n", | 1480 | printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n", |
@@ -1680,7 +1646,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1680 | dev->stop = rtl8169_close; | 1646 | dev->stop = rtl8169_close; |
1681 | dev->tx_timeout = rtl8169_tx_timeout; | 1647 | dev->tx_timeout = rtl8169_tx_timeout; |
1682 | dev->set_multicast_list = rtl8169_set_rx_mode; | 1648 | dev->set_multicast_list = rtl8169_set_rx_mode; |
1683 | dev->set_mac_address = rtl8169_set_mac_addr; | ||
1684 | dev->watchdog_timeo = RTL8169_TX_TIMEOUT; | 1649 | dev->watchdog_timeo = RTL8169_TX_TIMEOUT; |
1685 | dev->irq = pdev->irq; | 1650 | dev->irq = pdev->irq; |
1686 | dev->base_addr = (unsigned long) ioaddr; | 1651 | dev->base_addr = (unsigned long) ioaddr; |
@@ -1928,8 +1893,6 @@ rtl8169_hw_start(struct net_device *dev) | |||
1928 | /* Enable all known interrupts by setting the interrupt mask. */ | 1893 | /* Enable all known interrupts by setting the interrupt mask. */ |
1929 | RTL_W16(IntrMask, rtl8169_intr_mask); | 1894 | RTL_W16(IntrMask, rtl8169_intr_mask); |
1930 | 1895 | ||
1931 | __rtl8169_set_mac_addr(dev, ioaddr); | ||
1932 | |||
1933 | netif_start_queue(dev); | 1896 | netif_start_queue(dev); |
1934 | } | 1897 | } |
1935 | 1898 | ||
@@ -2700,6 +2663,7 @@ static void rtl8169_down(struct net_device *dev) | |||
2700 | struct rtl8169_private *tp = netdev_priv(dev); | 2663 | struct rtl8169_private *tp = netdev_priv(dev); |
2701 | void __iomem *ioaddr = tp->mmio_addr; | 2664 | void __iomem *ioaddr = tp->mmio_addr; |
2702 | unsigned int poll_locked = 0; | 2665 | unsigned int poll_locked = 0; |
2666 | unsigned int intrmask; | ||
2703 | 2667 | ||
2704 | rtl8169_delete_timer(dev); | 2668 | rtl8169_delete_timer(dev); |
2705 | 2669 | ||
@@ -2738,8 +2702,11 @@ core_down: | |||
2738 | * 2) dev->change_mtu | 2702 | * 2) dev->change_mtu |
2739 | * -> rtl8169_poll can not be issued again and re-enable the | 2703 | * -> rtl8169_poll can not be issued again and re-enable the |
2740 | * interruptions. Let's simply issue the IRQ down sequence again. | 2704 | * interruptions. Let's simply issue the IRQ down sequence again. |
2705 | * | ||
2706 | * No loop if hotpluged or major error (0xffff). | ||
2741 | */ | 2707 | */ |
2742 | if (RTL_R16(IntrMask)) | 2708 | intrmask = RTL_R16(IntrMask); |
2709 | if (intrmask && (intrmask != 0xffff)) | ||
2743 | goto core_down; | 2710 | goto core_down; |
2744 | 2711 | ||
2745 | rtl8169_tx_clear(tp); | 2712 | rtl8169_tx_clear(tp); |
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index a231ab7d28dd..33569ec9dbfc 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
@@ -5985,6 +5985,11 @@ static int set_rxd_buffer_pointer(nic_t *sp, RxD_t *rxdp, buffAdd_t *ba, | |||
5985 | ((RxD3_t*)rxdp)->Buffer1_ptr = *temp1; | 5985 | ((RxD3_t*)rxdp)->Buffer1_ptr = *temp1; |
5986 | } else { | 5986 | } else { |
5987 | *skb = dev_alloc_skb(size); | 5987 | *skb = dev_alloc_skb(size); |
5988 | if (!(*skb)) { | ||
5989 | DBG_PRINT(ERR_DBG, "%s: dev_alloc_skb failed\n", | ||
5990 | dev->name); | ||
5991 | return -ENOMEM; | ||
5992 | } | ||
5988 | ((RxD3_t*)rxdp)->Buffer2_ptr = *temp2 = | 5993 | ((RxD3_t*)rxdp)->Buffer2_ptr = *temp2 = |
5989 | pci_map_single(sp->pdev, (*skb)->data, | 5994 | pci_map_single(sp->pdev, (*skb)->data, |
5990 | dev->mtu + 4, | 5995 | dev->mtu + 4, |
@@ -6007,7 +6012,11 @@ static int set_rxd_buffer_pointer(nic_t *sp, RxD_t *rxdp, buffAdd_t *ba, | |||
6007 | ((RxD3_t*)rxdp)->Buffer2_ptr = *temp2; | 6012 | ((RxD3_t*)rxdp)->Buffer2_ptr = *temp2; |
6008 | } else { | 6013 | } else { |
6009 | *skb = dev_alloc_skb(size); | 6014 | *skb = dev_alloc_skb(size); |
6010 | 6015 | if (!(*skb)) { | |
6016 | DBG_PRINT(ERR_DBG, "%s: dev_alloc_skb failed\n", | ||
6017 | dev->name); | ||
6018 | return -ENOMEM; | ||
6019 | } | ||
6011 | ((RxD3_t*)rxdp)->Buffer0_ptr = *temp0 = | 6020 | ((RxD3_t*)rxdp)->Buffer0_ptr = *temp0 = |
6012 | pci_map_single(sp->pdev, ba->ba_0, BUF0_LEN, | 6021 | pci_map_single(sp->pdev, ba->ba_0, BUF0_LEN, |
6013 | PCI_DMA_FROMDEVICE); | 6022 | PCI_DMA_FROMDEVICE); |
diff --git a/drivers/net/sb1250-mac.c b/drivers/net/sb1250-mac.c index db2324939b69..1eae16b72b4b 100644 --- a/drivers/net/sb1250-mac.c +++ b/drivers/net/sb1250-mac.c | |||
@@ -2903,7 +2903,7 @@ sbmac_init_module(void) | |||
2903 | 2903 | ||
2904 | dev = alloc_etherdev(sizeof(struct sbmac_softc)); | 2904 | dev = alloc_etherdev(sizeof(struct sbmac_softc)); |
2905 | if (!dev) | 2905 | if (!dev) |
2906 | return -ENOMEM; /* return ENOMEM */ | 2906 | return -ENOMEM; |
2907 | 2907 | ||
2908 | printk(KERN_DEBUG "sbmac: configuring MAC at %lx\n", port); | 2908 | printk(KERN_DEBUG "sbmac: configuring MAC at %lx\n", port); |
2909 | 2909 | ||
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index e7e414928f89..b2949035f66a 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
@@ -11,8 +11,7 @@ | |||
11 | * | 11 | * |
12 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
13 | * it under the terms of the GNU General Public License as published by | 13 | * it under the terms of the GNU General Public License as published by |
14 | * the Free Software Foundation; either version 2 of the License, or | 14 | * the Free Software Foundation; either version 2 of the License. |
15 | * (at your option) any later version. | ||
16 | * | 15 | * |
17 | * This program is distributed in the hope that it will be useful, | 16 | * This program is distributed in the hope that it will be useful, |
18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 67ecd66f26d6..16616f5440d0 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -10,8 +10,7 @@ | |||
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 |
12 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License as published by |
13 | * the Free Software Foundation; either version 2 of the License, or | 13 | * the Free Software Foundation; either version 2 of the License. |
14 | * (at your option) any later version. | ||
15 | * | 14 | * |
16 | * This program is distributed in the hope that it will be useful, | 15 | * This program is distributed in the hope that it will be useful, |
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
@@ -699,16 +698,10 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port) | |||
699 | 698 | ||
700 | } | 699 | } |
701 | 700 | ||
702 | /* Assign Ram Buffer allocation. | 701 | /* Assign Ram Buffer allocation in units of 64bit (8 bytes) */ |
703 | * start and end are in units of 4k bytes | 702 | static void sky2_ramset(struct sky2_hw *hw, u16 q, u32 start, u32 end) |
704 | * ram registers are in units of 64bit words | ||
705 | */ | ||
706 | static void sky2_ramset(struct sky2_hw *hw, u16 q, u8 startk, u8 endk) | ||
707 | { | 703 | { |
708 | u32 start, end; | 704 | pr_debug(PFX "q %d %#x %#x\n", q, start, end); |
709 | |||
710 | start = startk * 4096/8; | ||
711 | end = (endk * 4096/8) - 1; | ||
712 | 705 | ||
713 | sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_RST_CLR); | 706 | sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_RST_CLR); |
714 | sky2_write32(hw, RB_ADDR(q, RB_START), start); | 707 | sky2_write32(hw, RB_ADDR(q, RB_START), start); |
@@ -717,7 +710,7 @@ static void sky2_ramset(struct sky2_hw *hw, u16 q, u8 startk, u8 endk) | |||
717 | sky2_write32(hw, RB_ADDR(q, RB_RP), start); | 710 | sky2_write32(hw, RB_ADDR(q, RB_RP), start); |
718 | 711 | ||
719 | if (q == Q_R1 || q == Q_R2) { | 712 | if (q == Q_R1 || q == Q_R2) { |
720 | u32 space = (endk - startk) * 4096/8; | 713 | u32 space = end - start + 1; |
721 | u32 tp = space - space/4; | 714 | u32 tp = space - space/4; |
722 | 715 | ||
723 | /* On receive queue's set the thresholds | 716 | /* On receive queue's set the thresholds |
@@ -1199,19 +1192,16 @@ static int sky2_up(struct net_device *dev) | |||
1199 | 1192 | ||
1200 | sky2_mac_init(hw, port); | 1193 | sky2_mac_init(hw, port); |
1201 | 1194 | ||
1202 | /* Determine available ram buffer space (in 4K blocks). | 1195 | /* Determine available ram buffer space in qwords. */ |
1203 | * Note: not sure about the FE setting below yet | 1196 | ramsize = sky2_read8(hw, B2_E_0) * 4096/8; |
1204 | */ | ||
1205 | if (hw->chip_id == CHIP_ID_YUKON_FE) | ||
1206 | ramsize = 4; | ||
1207 | else | ||
1208 | ramsize = sky2_read8(hw, B2_E_0); | ||
1209 | 1197 | ||
1210 | /* Give transmitter one third (rounded up) */ | 1198 | if (ramsize > 6*1024/8) |
1211 | rxspace = ramsize - (ramsize + 2) / 3; | 1199 | rxspace = ramsize - (ramsize + 2) / 3; |
1200 | else | ||
1201 | rxspace = ramsize / 2; | ||
1212 | 1202 | ||
1213 | sky2_ramset(hw, rxqaddr[port], 0, rxspace); | 1203 | sky2_ramset(hw, rxqaddr[port], 0, rxspace-1); |
1214 | sky2_ramset(hw, txqaddr[port], rxspace, ramsize); | 1204 | sky2_ramset(hw, txqaddr[port], rxspace, ramsize-1); |
1215 | 1205 | ||
1216 | /* Make sure SyncQ is disabled */ | 1206 | /* Make sure SyncQ is disabled */ |
1217 | sky2_write8(hw, RB_ADDR(port == 0 ? Q_XS1 : Q_XS2, RB_CTRL), | 1207 | sky2_write8(hw, RB_ADDR(port == 0 ? Q_XS1 : Q_XS2, RB_CTRL), |
@@ -3248,7 +3238,11 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw, | |||
3248 | dev->poll = sky2_poll; | 3238 | dev->poll = sky2_poll; |
3249 | dev->weight = NAPI_WEIGHT; | 3239 | dev->weight = NAPI_WEIGHT; |
3250 | #ifdef CONFIG_NET_POLL_CONTROLLER | 3240 | #ifdef CONFIG_NET_POLL_CONTROLLER |
3251 | dev->poll_controller = sky2_netpoll; | 3241 | /* Network console (only works on port 0) |
3242 | * because netpoll makes assumptions about NAPI | ||
3243 | */ | ||
3244 | if (port == 0) | ||
3245 | dev->poll_controller = sky2_netpoll; | ||
3252 | #endif | 3246 | #endif |
3253 | 3247 | ||
3254 | sky2 = netdev_priv(dev); | 3248 | sky2 = netdev_priv(dev); |
diff --git a/drivers/net/smc91x.h b/drivers/net/smc91x.h index 0c9f1e7dab2e..a8640169fc77 100644 --- a/drivers/net/smc91x.h +++ b/drivers/net/smc91x.h | |||
@@ -416,6 +416,24 @@ static inline void LPD7_SMC_outsw (unsigned char* a, int r, | |||
416 | 416 | ||
417 | #define SMC_IRQ_FLAGS (0) | 417 | #define SMC_IRQ_FLAGS (0) |
418 | 418 | ||
419 | #elif defined(CONFIG_ARCH_VERSATILE) | ||
420 | |||
421 | #define SMC_CAN_USE_8BIT 1 | ||
422 | #define SMC_CAN_USE_16BIT 1 | ||
423 | #define SMC_CAN_USE_32BIT 1 | ||
424 | #define SMC_NOWAIT 1 | ||
425 | |||
426 | #define SMC_inb(a, r) readb((a) + (r)) | ||
427 | #define SMC_inw(a, r) readw((a) + (r)) | ||
428 | #define SMC_inl(a, r) readl((a) + (r)) | ||
429 | #define SMC_outb(v, a, r) writeb(v, (a) + (r)) | ||
430 | #define SMC_outw(v, a, r) writew(v, (a) + (r)) | ||
431 | #define SMC_outl(v, a, r) writel(v, (a) + (r)) | ||
432 | #define SMC_insl(a, r, p, l) readsl((a) + (r), p, l) | ||
433 | #define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l) | ||
434 | |||
435 | #define SMC_IRQ_FLAGS (0) | ||
436 | |||
419 | #else | 437 | #else |
420 | 438 | ||
421 | #define SMC_CAN_USE_8BIT 1 | 439 | #define SMC_CAN_USE_8BIT 1 |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 8e398499c045..c20bb998e0e5 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -68,8 +68,8 @@ | |||
68 | 68 | ||
69 | #define DRV_MODULE_NAME "tg3" | 69 | #define DRV_MODULE_NAME "tg3" |
70 | #define PFX DRV_MODULE_NAME ": " | 70 | #define PFX DRV_MODULE_NAME ": " |
71 | #define DRV_MODULE_VERSION "3.67" | 71 | #define DRV_MODULE_VERSION "3.69" |
72 | #define DRV_MODULE_RELDATE "October 18, 2006" | 72 | #define DRV_MODULE_RELDATE "November 15, 2006" |
73 | 73 | ||
74 | #define TG3_DEF_MAC_MODE 0 | 74 | #define TG3_DEF_MAC_MODE 0 |
75 | #define TG3_DEF_RX_MODE 0 | 75 | #define TG3_DEF_RX_MODE 0 |
@@ -4728,10 +4728,11 @@ static int tg3_poll_fw(struct tg3 *tp) | |||
4728 | u32 val; | 4728 | u32 val; |
4729 | 4729 | ||
4730 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | 4730 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { |
4731 | for (i = 0; i < 400; i++) { | 4731 | /* Wait up to 20ms for init done. */ |
4732 | for (i = 0; i < 200; i++) { | ||
4732 | if (tr32(VCPU_STATUS) & VCPU_STATUS_INIT_DONE) | 4733 | if (tr32(VCPU_STATUS) & VCPU_STATUS_INIT_DONE) |
4733 | return 0; | 4734 | return 0; |
4734 | udelay(10); | 4735 | udelay(100); |
4735 | } | 4736 | } |
4736 | return -ENODEV; | 4737 | return -ENODEV; |
4737 | } | 4738 | } |
@@ -6014,7 +6015,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
6014 | tg3_abort_hw(tp, 1); | 6015 | tg3_abort_hw(tp, 1); |
6015 | } | 6016 | } |
6016 | 6017 | ||
6017 | if ((tp->tg3_flags2 & TG3_FLG2_MII_SERDES) && reset_phy) | 6018 | if (reset_phy) |
6018 | tg3_phy_reset(tp); | 6019 | tg3_phy_reset(tp); |
6019 | 6020 | ||
6020 | err = tg3_chip_reset(tp); | 6021 | err = tg3_chip_reset(tp); |
@@ -6574,7 +6575,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
6574 | tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl); | 6575 | tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl); |
6575 | } | 6576 | } |
6576 | 6577 | ||
6577 | err = tg3_setup_phy(tp, reset_phy); | 6578 | err = tg3_setup_phy(tp, 0); |
6578 | if (err) | 6579 | if (err) |
6579 | return err; | 6580 | return err; |
6580 | 6581 | ||
@@ -6978,8 +6979,10 @@ static int tg3_open(struct net_device *dev) | |||
6978 | tg3_full_lock(tp, 0); | 6979 | tg3_full_lock(tp, 0); |
6979 | 6980 | ||
6980 | err = tg3_set_power_state(tp, PCI_D0); | 6981 | err = tg3_set_power_state(tp, PCI_D0); |
6981 | if (err) | 6982 | if (err) { |
6983 | tg3_full_unlock(tp); | ||
6982 | return err; | 6984 | return err; |
6985 | } | ||
6983 | 6986 | ||
6984 | tg3_disable_ints(tp); | 6987 | tg3_disable_ints(tp); |
6985 | tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE; | 6988 | tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE; |
@@ -10212,7 +10215,7 @@ skip_phy_reset: | |||
10212 | static void __devinit tg3_read_partno(struct tg3 *tp) | 10215 | static void __devinit tg3_read_partno(struct tg3 *tp) |
10213 | { | 10216 | { |
10214 | unsigned char vpd_data[256]; | 10217 | unsigned char vpd_data[256]; |
10215 | int i; | 10218 | unsigned int i; |
10216 | u32 magic; | 10219 | u32 magic; |
10217 | 10220 | ||
10218 | if (tg3_nvram_read_swab(tp, 0x0, &magic)) | 10221 | if (tg3_nvram_read_swab(tp, 0x0, &magic)) |
@@ -10258,9 +10261,9 @@ static void __devinit tg3_read_partno(struct tg3 *tp) | |||
10258 | } | 10261 | } |
10259 | 10262 | ||
10260 | /* Now parse and find the part number. */ | 10263 | /* Now parse and find the part number. */ |
10261 | for (i = 0; i < 256; ) { | 10264 | for (i = 0; i < 254; ) { |
10262 | unsigned char val = vpd_data[i]; | 10265 | unsigned char val = vpd_data[i]; |
10263 | int block_end; | 10266 | unsigned int block_end; |
10264 | 10267 | ||
10265 | if (val == 0x82 || val == 0x91) { | 10268 | if (val == 0x82 || val == 0x91) { |
10266 | i = (i + 3 + | 10269 | i = (i + 3 + |
@@ -10276,21 +10279,26 @@ static void __devinit tg3_read_partno(struct tg3 *tp) | |||
10276 | (vpd_data[i + 1] + | 10279 | (vpd_data[i + 1] + |
10277 | (vpd_data[i + 2] << 8))); | 10280 | (vpd_data[i + 2] << 8))); |
10278 | i += 3; | 10281 | i += 3; |
10279 | while (i < block_end) { | 10282 | |
10283 | if (block_end > 256) | ||
10284 | goto out_not_found; | ||
10285 | |||
10286 | while (i < (block_end - 2)) { | ||
10280 | if (vpd_data[i + 0] == 'P' && | 10287 | if (vpd_data[i + 0] == 'P' && |
10281 | vpd_data[i + 1] == 'N') { | 10288 | vpd_data[i + 1] == 'N') { |
10282 | int partno_len = vpd_data[i + 2]; | 10289 | int partno_len = vpd_data[i + 2]; |
10283 | 10290 | ||
10284 | if (partno_len > 24) | 10291 | i += 3; |
10292 | if (partno_len > 24 || (partno_len + i) > 256) | ||
10285 | goto out_not_found; | 10293 | goto out_not_found; |
10286 | 10294 | ||
10287 | memcpy(tp->board_part_number, | 10295 | memcpy(tp->board_part_number, |
10288 | &vpd_data[i + 3], | 10296 | &vpd_data[i], partno_len); |
10289 | partno_len); | ||
10290 | 10297 | ||
10291 | /* Success. */ | 10298 | /* Success. */ |
10292 | return; | 10299 | return; |
10293 | } | 10300 | } |
10301 | i += 3 + vpd_data[i + 2]; | ||
10294 | } | 10302 | } |
10295 | 10303 | ||
10296 | /* Part number not found. */ | 10304 | /* Part number not found. */ |
@@ -10360,7 +10368,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
10360 | u32 pci_state_reg, grc_misc_cfg; | 10368 | u32 pci_state_reg, grc_misc_cfg; |
10361 | u32 val; | 10369 | u32 val; |
10362 | u16 pci_cmd; | 10370 | u16 pci_cmd; |
10363 | int err; | 10371 | int err, pcie_cap; |
10364 | 10372 | ||
10365 | /* Force memory write invalidate off. If we leave it on, | 10373 | /* Force memory write invalidate off. If we leave it on, |
10366 | * then on 5700_BX chips we have to enable a workaround. | 10374 | * then on 5700_BX chips we have to enable a workaround. |
@@ -10535,8 +10543,19 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
10535 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) | 10543 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) |
10536 | tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE; | 10544 | tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE; |
10537 | 10545 | ||
10538 | if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0) | 10546 | pcie_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_EXP); |
10547 | if (pcie_cap != 0) { | ||
10539 | tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS; | 10548 | tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS; |
10549 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
10550 | u16 lnkctl; | ||
10551 | |||
10552 | pci_read_config_word(tp->pdev, | ||
10553 | pcie_cap + PCI_EXP_LNKCTL, | ||
10554 | &lnkctl); | ||
10555 | if (lnkctl & PCI_EXP_LNKCTL_CLKREQ_EN) | ||
10556 | tp->tg3_flags2 &= ~TG3_FLG2_HW_TSO_2; | ||
10557 | } | ||
10558 | } | ||
10540 | 10559 | ||
10541 | /* If we have an AMD 762 or VIA K8T800 chipset, write | 10560 | /* If we have an AMD 762 or VIA K8T800 chipset, write |
10542 | * reordering to the mailbox registers done by the host | 10561 | * reordering to the mailbox registers done by the host |
@@ -11803,6 +11822,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
11803 | else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || | 11822 | else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || |
11804 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 || | 11823 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 || |
11805 | tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 || | 11824 | tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 || |
11825 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 || | ||
11806 | (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) { | 11826 | (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) { |
11807 | tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE; | 11827 | tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE; |
11808 | } else { | 11828 | } else { |
diff --git a/drivers/net/tokenring/proteon.c b/drivers/net/tokenring/proteon.c index 4f756960db2a..cb7dbb63c9d9 100644 --- a/drivers/net/tokenring/proteon.c +++ b/drivers/net/tokenring/proteon.c | |||
@@ -370,6 +370,10 @@ static int __init proteon_init(void) | |||
370 | dev->dma = dma[i]; | 370 | dev->dma = dma[i]; |
371 | pdev = platform_device_register_simple("proteon", | 371 | pdev = platform_device_register_simple("proteon", |
372 | i, NULL, 0); | 372 | i, NULL, 0); |
373 | if (IS_ERR(pdev)) { | ||
374 | free_netdev(dev); | ||
375 | continue; | ||
376 | } | ||
373 | err = setup_card(dev, &pdev->dev); | 377 | err = setup_card(dev, &pdev->dev); |
374 | if (!err) { | 378 | if (!err) { |
375 | proteon_dev[i] = pdev; | 379 | proteon_dev[i] = pdev; |
@@ -385,9 +389,10 @@ static int __init proteon_init(void) | |||
385 | /* Probe for cards. */ | 389 | /* Probe for cards. */ |
386 | if (num == 0) { | 390 | if (num == 0) { |
387 | printk(KERN_NOTICE "proteon.c: No cards found.\n"); | 391 | printk(KERN_NOTICE "proteon.c: No cards found.\n"); |
388 | return (-ENODEV); | 392 | platform_driver_unregister(&proteon_driver); |
393 | return -ENODEV; | ||
389 | } | 394 | } |
390 | return (0); | 395 | return 0; |
391 | } | 396 | } |
392 | 397 | ||
393 | static void __exit proteon_cleanup(void) | 398 | static void __exit proteon_cleanup(void) |
diff --git a/drivers/net/tokenring/skisa.c b/drivers/net/tokenring/skisa.c index d6ba41cf3110..33afea31d87b 100644 --- a/drivers/net/tokenring/skisa.c +++ b/drivers/net/tokenring/skisa.c | |||
@@ -380,6 +380,10 @@ static int __init sk_isa_init(void) | |||
380 | dev->dma = dma[i]; | 380 | dev->dma = dma[i]; |
381 | pdev = platform_device_register_simple("skisa", | 381 | pdev = platform_device_register_simple("skisa", |
382 | i, NULL, 0); | 382 | i, NULL, 0); |
383 | if (IS_ERR(pdev)) { | ||
384 | free_netdev(dev); | ||
385 | continue; | ||
386 | } | ||
383 | err = setup_card(dev, &pdev->dev); | 387 | err = setup_card(dev, &pdev->dev); |
384 | if (!err) { | 388 | if (!err) { |
385 | sk_isa_dev[i] = pdev; | 389 | sk_isa_dev[i] = pdev; |
@@ -395,9 +399,10 @@ static int __init sk_isa_init(void) | |||
395 | /* Probe for cards. */ | 399 | /* Probe for cards. */ |
396 | if (num == 0) { | 400 | if (num == 0) { |
397 | printk(KERN_NOTICE "skisa.c: No cards found.\n"); | 401 | printk(KERN_NOTICE "skisa.c: No cards found.\n"); |
398 | return (-ENODEV); | 402 | platform_driver_unregister(&sk_isa_driver); |
403 | return -ENODEV; | ||
399 | } | 404 | } |
400 | return (0); | 405 | return 0; |
401 | } | 406 | } |
402 | 407 | ||
403 | static void __exit sk_isa_cleanup(void) | 408 | static void __exit sk_isa_cleanup(void) |
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index 12cd7b561f35..b37888011067 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c | |||
@@ -2,14 +2,11 @@ | |||
2 | * Copyright (C) Freescale Semicondutor, Inc. 2006. All rights reserved. | 2 | * Copyright (C) Freescale Semicondutor, Inc. 2006. All rights reserved. |
3 | * | 3 | * |
4 | * Author: Shlomi Gridish <gridish@freescale.com> | 4 | * Author: Shlomi Gridish <gridish@freescale.com> |
5 | * Li Yang <leoli@freescale.com> | ||
5 | * | 6 | * |
6 | * Description: | 7 | * Description: |
7 | * QE UCC Gigabit Ethernet Driver | 8 | * QE UCC Gigabit Ethernet Driver |
8 | * | 9 | * |
9 | * Changelog: | ||
10 | * Jul 6, 2006 Li Yang <LeoLi@freescale.com> | ||
11 | * - Rearrange code and style fixes | ||
12 | * | ||
13 | * This program is free software; you can redistribute it and/or modify it | 10 | * This program is free software; you can redistribute it and/or modify it |
14 | * under the terms of the GNU General Public License as published by the | 11 | * under the terms of the GNU General Public License as published by the |
15 | * Free Software Foundation; either version 2 of the License, or (at your | 12 | * Free Software Foundation; either version 2 of the License, or (at your |
@@ -31,9 +28,9 @@ | |||
31 | #include <linux/dma-mapping.h> | 28 | #include <linux/dma-mapping.h> |
32 | #include <linux/fsl_devices.h> | 29 | #include <linux/fsl_devices.h> |
33 | #include <linux/ethtool.h> | 30 | #include <linux/ethtool.h> |
34 | #include <linux/platform_device.h> | ||
35 | #include <linux/mii.h> | 31 | #include <linux/mii.h> |
36 | 32 | ||
33 | #include <asm/of_device.h> | ||
37 | #include <asm/uaccess.h> | 34 | #include <asm/uaccess.h> |
38 | #include <asm/irq.h> | 35 | #include <asm/irq.h> |
39 | #include <asm/io.h> | 36 | #include <asm/io.h> |
@@ -70,7 +67,7 @@ | |||
70 | 67 | ||
71 | static DEFINE_SPINLOCK(ugeth_lock); | 68 | static DEFINE_SPINLOCK(ugeth_lock); |
72 | 69 | ||
73 | static ucc_geth_info_t ugeth_primary_info = { | 70 | static struct ucc_geth_info ugeth_primary_info = { |
74 | .uf_info = { | 71 | .uf_info = { |
75 | .bd_mem_part = MEM_PART_SYSTEM, | 72 | .bd_mem_part = MEM_PART_SYSTEM, |
76 | .rtsm = UCC_FAST_SEND_IDLES_BETWEEN_FRAMES, | 73 | .rtsm = UCC_FAST_SEND_IDLES_BETWEEN_FRAMES, |
@@ -163,7 +160,7 @@ static ucc_geth_info_t ugeth_primary_info = { | |||
163 | .riscRx = QE_RISC_ALLOCATION_RISC1_AND_RISC2, | 160 | .riscRx = QE_RISC_ALLOCATION_RISC1_AND_RISC2, |
164 | }; | 161 | }; |
165 | 162 | ||
166 | static ucc_geth_info_t ugeth_info[8]; | 163 | static struct ucc_geth_info ugeth_info[8]; |
167 | 164 | ||
168 | #ifdef DEBUG | 165 | #ifdef DEBUG |
169 | static void mem_disp(u8 *addr, int size) | 166 | static void mem_disp(u8 *addr, int size) |
@@ -219,8 +216,8 @@ static struct list_head *dequeue(struct list_head *lh) | |||
219 | } | 216 | } |
220 | } | 217 | } |
221 | 218 | ||
222 | static int get_interface_details(enet_interface_e enet_interface, | 219 | static int get_interface_details(enum enet_interface enet_interface, |
223 | enet_speed_e *speed, | 220 | enum enet_speed *speed, |
224 | int *r10m, | 221 | int *r10m, |
225 | int *rmm, | 222 | int *rmm, |
226 | int *rpm, | 223 | int *rpm, |
@@ -283,7 +280,7 @@ static int get_interface_details(enet_interface_e enet_interface, | |||
283 | return 0; | 280 | return 0; |
284 | } | 281 | } |
285 | 282 | ||
286 | static struct sk_buff *get_new_skb(ucc_geth_private_t *ugeth, u8 *bd) | 283 | static struct sk_buff *get_new_skb(struct ucc_geth_private *ugeth, u8 *bd) |
287 | { | 284 | { |
288 | struct sk_buff *skb = NULL; | 285 | struct sk_buff *skb = NULL; |
289 | 286 | ||
@@ -303,21 +300,19 @@ static struct sk_buff *get_new_skb(ucc_geth_private_t *ugeth, u8 *bd) | |||
303 | 300 | ||
304 | skb->dev = ugeth->dev; | 301 | skb->dev = ugeth->dev; |
305 | 302 | ||
306 | BD_BUFFER_SET(bd, | 303 | out_be32(&((struct qe_bd *)bd)->buf, |
307 | dma_map_single(NULL, | 304 | dma_map_single(NULL, |
308 | skb->data, | 305 | skb->data, |
309 | ugeth->ug_info->uf_info.max_rx_buf_length + | 306 | ugeth->ug_info->uf_info.max_rx_buf_length + |
310 | UCC_GETH_RX_DATA_BUF_ALIGNMENT, | 307 | UCC_GETH_RX_DATA_BUF_ALIGNMENT, |
311 | DMA_FROM_DEVICE)); | 308 | DMA_FROM_DEVICE)); |
312 | 309 | ||
313 | BD_STATUS_AND_LENGTH_SET(bd, | 310 | out_be32((u32 *)bd, (R_E | R_I | (in_be32((u32 *)bd) & R_W))); |
314 | (R_E | R_I | | ||
315 | (BD_STATUS_AND_LENGTH(bd) & R_W))); | ||
316 | 311 | ||
317 | return skb; | 312 | return skb; |
318 | } | 313 | } |
319 | 314 | ||
320 | static int rx_bd_buffer_set(ucc_geth_private_t *ugeth, u8 rxQ) | 315 | static int rx_bd_buffer_set(struct ucc_geth_private *ugeth, u8 rxQ) |
321 | { | 316 | { |
322 | u8 *bd; | 317 | u8 *bd; |
323 | u32 bd_status; | 318 | u32 bd_status; |
@@ -328,7 +323,7 @@ static int rx_bd_buffer_set(ucc_geth_private_t *ugeth, u8 rxQ) | |||
328 | i = 0; | 323 | i = 0; |
329 | 324 | ||
330 | do { | 325 | do { |
331 | bd_status = BD_STATUS_AND_LENGTH(bd); | 326 | bd_status = in_be32((u32*)bd); |
332 | skb = get_new_skb(ugeth, bd); | 327 | skb = get_new_skb(ugeth, bd); |
333 | 328 | ||
334 | if (!skb) /* If can not allocate data buffer, | 329 | if (!skb) /* If can not allocate data buffer, |
@@ -338,19 +333,19 @@ static int rx_bd_buffer_set(ucc_geth_private_t *ugeth, u8 rxQ) | |||
338 | ugeth->rx_skbuff[rxQ][i] = skb; | 333 | ugeth->rx_skbuff[rxQ][i] = skb; |
339 | 334 | ||
340 | /* advance the BD pointer */ | 335 | /* advance the BD pointer */ |
341 | bd += UCC_GETH_SIZE_OF_BD; | 336 | bd += sizeof(struct qe_bd); |
342 | i++; | 337 | i++; |
343 | } while (!(bd_status & R_W)); | 338 | } while (!(bd_status & R_W)); |
344 | 339 | ||
345 | return 0; | 340 | return 0; |
346 | } | 341 | } |
347 | 342 | ||
348 | static int fill_init_enet_entries(ucc_geth_private_t *ugeth, | 343 | static int fill_init_enet_entries(struct ucc_geth_private *ugeth, |
349 | volatile u32 *p_start, | 344 | volatile u32 *p_start, |
350 | u8 num_entries, | 345 | u8 num_entries, |
351 | u32 thread_size, | 346 | u32 thread_size, |
352 | u32 thread_alignment, | 347 | u32 thread_alignment, |
353 | qe_risc_allocation_e risc, | 348 | enum qe_risc_allocation risc, |
354 | int skip_page_for_first_entry) | 349 | int skip_page_for_first_entry) |
355 | { | 350 | { |
356 | u32 init_enet_offset; | 351 | u32 init_enet_offset; |
@@ -383,10 +378,10 @@ static int fill_init_enet_entries(ucc_geth_private_t *ugeth, | |||
383 | return 0; | 378 | return 0; |
384 | } | 379 | } |
385 | 380 | ||
386 | static int return_init_enet_entries(ucc_geth_private_t *ugeth, | 381 | static int return_init_enet_entries(struct ucc_geth_private *ugeth, |
387 | volatile u32 *p_start, | 382 | volatile u32 *p_start, |
388 | u8 num_entries, | 383 | u8 num_entries, |
389 | qe_risc_allocation_e risc, | 384 | enum qe_risc_allocation risc, |
390 | int skip_page_for_first_entry) | 385 | int skip_page_for_first_entry) |
391 | { | 386 | { |
392 | u32 init_enet_offset; | 387 | u32 init_enet_offset; |
@@ -416,11 +411,11 @@ static int return_init_enet_entries(ucc_geth_private_t *ugeth, | |||
416 | } | 411 | } |
417 | 412 | ||
418 | #ifdef DEBUG | 413 | #ifdef DEBUG |
419 | static int dump_init_enet_entries(ucc_geth_private_t *ugeth, | 414 | static int dump_init_enet_entries(struct ucc_geth_private *ugeth, |
420 | volatile u32 *p_start, | 415 | volatile u32 *p_start, |
421 | u8 num_entries, | 416 | u8 num_entries, |
422 | u32 thread_size, | 417 | u32 thread_size, |
423 | qe_risc_allocation_e risc, | 418 | enum qe_risc_allocation risc, |
424 | int skip_page_for_first_entry) | 419 | int skip_page_for_first_entry) |
425 | { | 420 | { |
426 | u32 init_enet_offset; | 421 | u32 init_enet_offset; |
@@ -456,14 +451,14 @@ static int dump_init_enet_entries(ucc_geth_private_t *ugeth, | |||
456 | #endif | 451 | #endif |
457 | 452 | ||
458 | #ifdef CONFIG_UGETH_FILTERING | 453 | #ifdef CONFIG_UGETH_FILTERING |
459 | static enet_addr_container_t *get_enet_addr_container(void) | 454 | static struct enet_addr_container *get_enet_addr_container(void) |
460 | { | 455 | { |
461 | enet_addr_container_t *enet_addr_cont; | 456 | struct enet_addr_container *enet_addr_cont; |
462 | 457 | ||
463 | /* allocate memory */ | 458 | /* allocate memory */ |
464 | enet_addr_cont = kmalloc(sizeof(enet_addr_container_t), GFP_KERNEL); | 459 | enet_addr_cont = kmalloc(sizeof(struct enet_addr_container), GFP_KERNEL); |
465 | if (!enet_addr_cont) { | 460 | if (!enet_addr_cont) { |
466 | ugeth_err("%s: No memory for enet_addr_container_t object.", | 461 | ugeth_err("%s: No memory for enet_addr_container object.", |
467 | __FUNCTION__); | 462 | __FUNCTION__); |
468 | return NULL; | 463 | return NULL; |
469 | } | 464 | } |
@@ -472,45 +467,43 @@ static enet_addr_container_t *get_enet_addr_container(void) | |||
472 | } | 467 | } |
473 | #endif /* CONFIG_UGETH_FILTERING */ | 468 | #endif /* CONFIG_UGETH_FILTERING */ |
474 | 469 | ||
475 | static void put_enet_addr_container(enet_addr_container_t *enet_addr_cont) | 470 | static void put_enet_addr_container(struct enet_addr_container *enet_addr_cont) |
476 | { | 471 | { |
477 | kfree(enet_addr_cont); | 472 | kfree(enet_addr_cont); |
478 | } | 473 | } |
479 | 474 | ||
475 | static int set_mac_addr(__be16 __iomem *reg, u8 *mac) | ||
476 | { | ||
477 | out_be16(®[0], ((u16)mac[5] << 8) | mac[4]); | ||
478 | out_be16(®[1], ((u16)mac[3] << 8) | mac[2]); | ||
479 | out_be16(®[2], ((u16)mac[1] << 8) | mac[0]); | ||
480 | } | ||
481 | |||
480 | #ifdef CONFIG_UGETH_FILTERING | 482 | #ifdef CONFIG_UGETH_FILTERING |
481 | static int hw_add_addr_in_paddr(ucc_geth_private_t *ugeth, | 483 | static int hw_add_addr_in_paddr(struct ucc_geth_private *ugeth, |
482 | enet_addr_t *p_enet_addr, u8 paddr_num) | 484 | u8 *p_enet_addr, u8 paddr_num) |
483 | { | 485 | { |
484 | ucc_geth_82xx_address_filtering_pram_t *p_82xx_addr_filt; | 486 | struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt; |
485 | 487 | ||
486 | if (!(paddr_num < NUM_OF_PADDRS)) { | 488 | if (!(paddr_num < NUM_OF_PADDRS)) { |
487 | ugeth_warn("%s: Illagel paddr_num.", __FUNCTION__); | 489 | ugeth_warn("%s: Illegal paddr_num.", __FUNCTION__); |
488 | return -EINVAL; | 490 | return -EINVAL; |
489 | } | 491 | } |
490 | 492 | ||
491 | p_82xx_addr_filt = | 493 | p_82xx_addr_filt = |
492 | (ucc_geth_82xx_address_filtering_pram_t *) ugeth->p_rx_glbl_pram-> | 494 | (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram-> |
493 | addressfiltering; | 495 | addressfiltering; |
494 | 496 | ||
495 | /* Ethernet frames are defined in Little Endian mode, */ | 497 | /* Ethernet frames are defined in Little Endian mode, */ |
496 | /* therefore to insert the address we reverse the bytes. */ | 498 | /* therefore to insert the address we reverse the bytes. */ |
497 | out_be16(&p_82xx_addr_filt->paddr[paddr_num].h, | 499 | set_mac_addr(&p_82xx_addr_filt->paddr[paddr_num].h, p_enet_addr); |
498 | (u16) (((u16) (((u16) ((*p_enet_addr)[5])) << 8)) | | ||
499 | (u16) (*p_enet_addr)[4])); | ||
500 | out_be16(&p_82xx_addr_filt->paddr[paddr_num].m, | ||
501 | (u16) (((u16) (((u16) ((*p_enet_addr)[3])) << 8)) | | ||
502 | (u16) (*p_enet_addr)[2])); | ||
503 | out_be16(&p_82xx_addr_filt->paddr[paddr_num].l, | ||
504 | (u16) (((u16) (((u16) ((*p_enet_addr)[1])) << 8)) | | ||
505 | (u16) (*p_enet_addr)[0])); | ||
506 | |||
507 | return 0; | 500 | return 0; |
508 | } | 501 | } |
509 | #endif /* CONFIG_UGETH_FILTERING */ | 502 | #endif /* CONFIG_UGETH_FILTERING */ |
510 | 503 | ||
511 | static int hw_clear_addr_in_paddr(ucc_geth_private_t *ugeth, u8 paddr_num) | 504 | static int hw_clear_addr_in_paddr(struct ucc_geth_private *ugeth, u8 paddr_num) |
512 | { | 505 | { |
513 | ucc_geth_82xx_address_filtering_pram_t *p_82xx_addr_filt; | 506 | struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt; |
514 | 507 | ||
515 | if (!(paddr_num < NUM_OF_PADDRS)) { | 508 | if (!(paddr_num < NUM_OF_PADDRS)) { |
516 | ugeth_warn("%s: Illagel paddr_num.", __FUNCTION__); | 509 | ugeth_warn("%s: Illagel paddr_num.", __FUNCTION__); |
@@ -518,7 +511,7 @@ static int hw_clear_addr_in_paddr(ucc_geth_private_t *ugeth, u8 paddr_num) | |||
518 | } | 511 | } |
519 | 512 | ||
520 | p_82xx_addr_filt = | 513 | p_82xx_addr_filt = |
521 | (ucc_geth_82xx_address_filtering_pram_t *) ugeth->p_rx_glbl_pram-> | 514 | (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram-> |
522 | addressfiltering; | 515 | addressfiltering; |
523 | 516 | ||
524 | /* Writing address ff.ff.ff.ff.ff.ff disables address | 517 | /* Writing address ff.ff.ff.ff.ff.ff disables address |
@@ -530,14 +523,14 @@ static int hw_clear_addr_in_paddr(ucc_geth_private_t *ugeth, u8 paddr_num) | |||
530 | return 0; | 523 | return 0; |
531 | } | 524 | } |
532 | 525 | ||
533 | static void hw_add_addr_in_hash(ucc_geth_private_t *ugeth, | 526 | static void hw_add_addr_in_hash(struct ucc_geth_private *ugeth, |
534 | enet_addr_t *p_enet_addr) | 527 | u8 *p_enet_addr) |
535 | { | 528 | { |
536 | ucc_geth_82xx_address_filtering_pram_t *p_82xx_addr_filt; | 529 | struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt; |
537 | u32 cecr_subblock; | 530 | u32 cecr_subblock; |
538 | 531 | ||
539 | p_82xx_addr_filt = | 532 | p_82xx_addr_filt = |
540 | (ucc_geth_82xx_address_filtering_pram_t *) ugeth->p_rx_glbl_pram-> | 533 | (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram-> |
541 | addressfiltering; | 534 | addressfiltering; |
542 | 535 | ||
543 | cecr_subblock = | 536 | cecr_subblock = |
@@ -546,25 +539,18 @@ static void hw_add_addr_in_hash(ucc_geth_private_t *ugeth, | |||
546 | /* Ethernet frames are defined in Little Endian mode, | 539 | /* Ethernet frames are defined in Little Endian mode, |
547 | therefor to insert */ | 540 | therefor to insert */ |
548 | /* the address to the hash (Big Endian mode), we reverse the bytes.*/ | 541 | /* the address to the hash (Big Endian mode), we reverse the bytes.*/ |
549 | out_be16(&p_82xx_addr_filt->taddr.h, | 542 | |
550 | (u16) (((u16) (((u16) ((*p_enet_addr)[5])) << 8)) | | 543 | set_mac_addr(&p_82xx_addr_filt->taddr.h, p_enet_addr); |
551 | (u16) (*p_enet_addr)[4])); | ||
552 | out_be16(&p_82xx_addr_filt->taddr.m, | ||
553 | (u16) (((u16) (((u16) ((*p_enet_addr)[3])) << 8)) | | ||
554 | (u16) (*p_enet_addr)[2])); | ||
555 | out_be16(&p_82xx_addr_filt->taddr.l, | ||
556 | (u16) (((u16) (((u16) ((*p_enet_addr)[1])) << 8)) | | ||
557 | (u16) (*p_enet_addr)[0])); | ||
558 | 544 | ||
559 | qe_issue_cmd(QE_SET_GROUP_ADDRESS, cecr_subblock, | 545 | qe_issue_cmd(QE_SET_GROUP_ADDRESS, cecr_subblock, |
560 | (u8) QE_CR_PROTOCOL_ETHERNET, 0); | 546 | QE_CR_PROTOCOL_ETHERNET, 0); |
561 | } | 547 | } |
562 | 548 | ||
563 | #ifdef CONFIG_UGETH_MAGIC_PACKET | 549 | #ifdef CONFIG_UGETH_MAGIC_PACKET |
564 | static void magic_packet_detection_enable(ucc_geth_private_t *ugeth) | 550 | static void magic_packet_detection_enable(struct ucc_geth_private *ugeth) |
565 | { | 551 | { |
566 | ucc_fast_private_t *uccf; | 552 | struct ucc_fast_private *uccf; |
567 | ucc_geth_t *ug_regs; | 553 | struct ucc_geth *ug_regs; |
568 | u32 maccfg2, uccm; | 554 | u32 maccfg2, uccm; |
569 | 555 | ||
570 | uccf = ugeth->uccf; | 556 | uccf = ugeth->uccf; |
@@ -581,10 +567,10 @@ static void magic_packet_detection_enable(ucc_geth_private_t *ugeth) | |||
581 | out_be32(&ug_regs->maccfg2, maccfg2); | 567 | out_be32(&ug_regs->maccfg2, maccfg2); |
582 | } | 568 | } |
583 | 569 | ||
584 | static void magic_packet_detection_disable(ucc_geth_private_t *ugeth) | 570 | static void magic_packet_detection_disable(struct ucc_geth_private *ugeth) |
585 | { | 571 | { |
586 | ucc_fast_private_t *uccf; | 572 | struct ucc_fast_private *uccf; |
587 | ucc_geth_t *ug_regs; | 573 | struct ucc_geth *ug_regs; |
588 | u32 maccfg2, uccm; | 574 | u32 maccfg2, uccm; |
589 | 575 | ||
590 | uccf = ugeth->uccf; | 576 | uccf = ugeth->uccf; |
@@ -602,26 +588,26 @@ static void magic_packet_detection_disable(ucc_geth_private_t *ugeth) | |||
602 | } | 588 | } |
603 | #endif /* MAGIC_PACKET */ | 589 | #endif /* MAGIC_PACKET */ |
604 | 590 | ||
605 | static inline int compare_addr(enet_addr_t *addr1, enet_addr_t *addr2) | 591 | static inline int compare_addr(u8 **addr1, u8 **addr2) |
606 | { | 592 | { |
607 | return memcmp(addr1, addr2, ENET_NUM_OCTETS_PER_ADDRESS); | 593 | return memcmp(addr1, addr2, ENET_NUM_OCTETS_PER_ADDRESS); |
608 | } | 594 | } |
609 | 595 | ||
610 | #ifdef DEBUG | 596 | #ifdef DEBUG |
611 | static void get_statistics(ucc_geth_private_t *ugeth, | 597 | static void get_statistics(struct ucc_geth_private *ugeth, |
612 | ucc_geth_tx_firmware_statistics_t * | 598 | struct ucc_geth_tx_firmware_statistics * |
613 | tx_firmware_statistics, | 599 | tx_firmware_statistics, |
614 | ucc_geth_rx_firmware_statistics_t * | 600 | struct ucc_geth_rx_firmware_statistics * |
615 | rx_firmware_statistics, | 601 | rx_firmware_statistics, |
616 | ucc_geth_hardware_statistics_t *hardware_statistics) | 602 | struct ucc_geth_hardware_statistics *hardware_statistics) |
617 | { | 603 | { |
618 | ucc_fast_t *uf_regs; | 604 | struct ucc_fast *uf_regs; |
619 | ucc_geth_t *ug_regs; | 605 | struct ucc_geth *ug_regs; |
620 | ucc_geth_tx_firmware_statistics_pram_t *p_tx_fw_statistics_pram; | 606 | struct ucc_geth_tx_firmware_statistics_pram *p_tx_fw_statistics_pram; |
621 | ucc_geth_rx_firmware_statistics_pram_t *p_rx_fw_statistics_pram; | 607 | struct ucc_geth_rx_firmware_statistics_pram *p_rx_fw_statistics_pram; |
622 | 608 | ||
623 | ug_regs = ugeth->ug_regs; | 609 | ug_regs = ugeth->ug_regs; |
624 | uf_regs = (ucc_fast_t *) ug_regs; | 610 | uf_regs = (struct ucc_fast *) ug_regs; |
625 | p_tx_fw_statistics_pram = ugeth->p_tx_fw_statistics_pram; | 611 | p_tx_fw_statistics_pram = ugeth->p_tx_fw_statistics_pram; |
626 | p_rx_fw_statistics_pram = ugeth->p_rx_fw_statistics_pram; | 612 | p_rx_fw_statistics_pram = ugeth->p_rx_fw_statistics_pram; |
627 | 613 | ||
@@ -727,7 +713,7 @@ static void get_statistics(ucc_geth_private_t *ugeth, | |||
727 | } | 713 | } |
728 | } | 714 | } |
729 | 715 | ||
730 | static void dump_bds(ucc_geth_private_t *ugeth) | 716 | static void dump_bds(struct ucc_geth_private *ugeth) |
731 | { | 717 | { |
732 | int i; | 718 | int i; |
733 | int length; | 719 | int length; |
@@ -736,7 +722,7 @@ static void dump_bds(ucc_geth_private_t *ugeth) | |||
736 | if (ugeth->p_tx_bd_ring[i]) { | 722 | if (ugeth->p_tx_bd_ring[i]) { |
737 | length = | 723 | length = |
738 | (ugeth->ug_info->bdRingLenTx[i] * | 724 | (ugeth->ug_info->bdRingLenTx[i] * |
739 | UCC_GETH_SIZE_OF_BD); | 725 | sizeof(struct qe_bd)); |
740 | ugeth_info("TX BDs[%d]", i); | 726 | ugeth_info("TX BDs[%d]", i); |
741 | mem_disp(ugeth->p_tx_bd_ring[i], length); | 727 | mem_disp(ugeth->p_tx_bd_ring[i], length); |
742 | } | 728 | } |
@@ -745,14 +731,14 @@ static void dump_bds(ucc_geth_private_t *ugeth) | |||
745 | if (ugeth->p_rx_bd_ring[i]) { | 731 | if (ugeth->p_rx_bd_ring[i]) { |
746 | length = | 732 | length = |
747 | (ugeth->ug_info->bdRingLenRx[i] * | 733 | (ugeth->ug_info->bdRingLenRx[i] * |
748 | UCC_GETH_SIZE_OF_BD); | 734 | sizeof(struct qe_bd)); |
749 | ugeth_info("RX BDs[%d]", i); | 735 | ugeth_info("RX BDs[%d]", i); |
750 | mem_disp(ugeth->p_rx_bd_ring[i], length); | 736 | mem_disp(ugeth->p_rx_bd_ring[i], length); |
751 | } | 737 | } |
752 | } | 738 | } |
753 | } | 739 | } |
754 | 740 | ||
755 | static void dump_regs(ucc_geth_private_t *ugeth) | 741 | static void dump_regs(struct ucc_geth_private *ugeth) |
756 | { | 742 | { |
757 | int i; | 743 | int i; |
758 | 744 | ||
@@ -893,7 +879,7 @@ static void dump_regs(ucc_geth_private_t *ugeth) | |||
893 | ugeth_info("Base address: 0x%08x", | 879 | ugeth_info("Base address: 0x%08x", |
894 | (u32) & ugeth->p_thread_data_tx[i]); | 880 | (u32) & ugeth->p_thread_data_tx[i]); |
895 | mem_disp((u8 *) & ugeth->p_thread_data_tx[i], | 881 | mem_disp((u8 *) & ugeth->p_thread_data_tx[i], |
896 | sizeof(ucc_geth_thread_data_tx_t)); | 882 | sizeof(struct ucc_geth_thread_data_tx)); |
897 | } | 883 | } |
898 | } | 884 | } |
899 | if (ugeth->p_thread_data_rx) { | 885 | if (ugeth->p_thread_data_rx) { |
@@ -927,7 +913,7 @@ static void dump_regs(ucc_geth_private_t *ugeth) | |||
927 | ugeth_info("Base address: 0x%08x", | 913 | ugeth_info("Base address: 0x%08x", |
928 | (u32) & ugeth->p_thread_data_rx[i]); | 914 | (u32) & ugeth->p_thread_data_rx[i]); |
929 | mem_disp((u8 *) & ugeth->p_thread_data_rx[i], | 915 | mem_disp((u8 *) & ugeth->p_thread_data_rx[i], |
930 | sizeof(ucc_geth_thread_data_rx_t)); | 916 | sizeof(struct ucc_geth_thread_data_rx)); |
931 | } | 917 | } |
932 | } | 918 | } |
933 | if (ugeth->p_exf_glbl_param) { | 919 | if (ugeth->p_exf_glbl_param) { |
@@ -1105,7 +1091,7 @@ static void dump_regs(ucc_geth_private_t *ugeth) | |||
1105 | ugeth_info("Base address: 0x%08x", | 1091 | ugeth_info("Base address: 0x%08x", |
1106 | (u32) & ugeth->p_send_q_mem_reg->sqqd[i]); | 1092 | (u32) & ugeth->p_send_q_mem_reg->sqqd[i]); |
1107 | mem_disp((u8 *) & ugeth->p_send_q_mem_reg->sqqd[i], | 1093 | mem_disp((u8 *) & ugeth->p_send_q_mem_reg->sqqd[i], |
1108 | sizeof(ucc_geth_send_queue_qd_t)); | 1094 | sizeof(struct ucc_geth_send_queue_qd)); |
1109 | } | 1095 | } |
1110 | } | 1096 | } |
1111 | if (ugeth->p_scheduler) { | 1097 | if (ugeth->p_scheduler) { |
@@ -1187,7 +1173,7 @@ static void dump_regs(ucc_geth_private_t *ugeth) | |||
1187 | qe_muram_addr(in_be32 | 1173 | qe_muram_addr(in_be32 |
1188 | (&ugeth->p_rx_bd_qs_tbl[i]. | 1174 | (&ugeth->p_rx_bd_qs_tbl[i]. |
1189 | bdbaseptr)), | 1175 | bdbaseptr)), |
1190 | sizeof(ucc_geth_rx_prefetched_bds_t)); | 1176 | sizeof(struct ucc_geth_rx_prefetched_bds)); |
1191 | } | 1177 | } |
1192 | } | 1178 | } |
1193 | if (ugeth->p_init_enet_param_shadow) { | 1179 | if (ugeth->p_init_enet_param_shadow) { |
@@ -1198,7 +1184,7 @@ static void dump_regs(ucc_geth_private_t *ugeth) | |||
1198 | mem_disp((u8 *) ugeth->p_init_enet_param_shadow, | 1184 | mem_disp((u8 *) ugeth->p_init_enet_param_shadow, |
1199 | sizeof(*ugeth->p_init_enet_param_shadow)); | 1185 | sizeof(*ugeth->p_init_enet_param_shadow)); |
1200 | 1186 | ||
1201 | size = sizeof(ucc_geth_thread_rx_pram_t); | 1187 | size = sizeof(struct ucc_geth_thread_rx_pram); |
1202 | if (ugeth->ug_info->rxExtendedFiltering) { | 1188 | if (ugeth->ug_info->rxExtendedFiltering) { |
1203 | size += | 1189 | size += |
1204 | THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING; | 1190 | THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING; |
@@ -1216,7 +1202,7 @@ static void dump_regs(ucc_geth_private_t *ugeth) | |||
1216 | &(ugeth->p_init_enet_param_shadow-> | 1202 | &(ugeth->p_init_enet_param_shadow-> |
1217 | txthread[0]), | 1203 | txthread[0]), |
1218 | ENET_INIT_PARAM_MAX_ENTRIES_TX, | 1204 | ENET_INIT_PARAM_MAX_ENTRIES_TX, |
1219 | sizeof(ucc_geth_thread_tx_pram_t), | 1205 | sizeof(struct ucc_geth_thread_tx_pram), |
1220 | ugeth->ug_info->riscTx, 0); | 1206 | ugeth->ug_info->riscTx, 0); |
1221 | dump_init_enet_entries(ugeth, | 1207 | dump_init_enet_entries(ugeth, |
1222 | &(ugeth->p_init_enet_param_shadow-> | 1208 | &(ugeth->p_init_enet_param_shadow-> |
@@ -1578,12 +1564,12 @@ static int init_min_frame_len(u16 min_frame_length, | |||
1578 | return 0; | 1564 | return 0; |
1579 | } | 1565 | } |
1580 | 1566 | ||
1581 | static int adjust_enet_interface(ucc_geth_private_t *ugeth) | 1567 | static int adjust_enet_interface(struct ucc_geth_private *ugeth) |
1582 | { | 1568 | { |
1583 | ucc_geth_info_t *ug_info; | 1569 | struct ucc_geth_info *ug_info; |
1584 | ucc_geth_t *ug_regs; | 1570 | struct ucc_geth *ug_regs; |
1585 | ucc_fast_t *uf_regs; | 1571 | struct ucc_fast *uf_regs; |
1586 | enet_speed_e speed; | 1572 | enum enet_speed speed; |
1587 | int ret_val, rpm = 0, tbi = 0, r10m = 0, rmm = | 1573 | int ret_val, rpm = 0, tbi = 0, r10m = 0, rmm = |
1588 | 0, limited_to_full_duplex = 0; | 1574 | 0, limited_to_full_duplex = 0; |
1589 | u32 upsmr, maccfg2, utbipar, tbiBaseAddress; | 1575 | u32 upsmr, maccfg2, utbipar, tbiBaseAddress; |
@@ -1691,8 +1677,8 @@ static int adjust_enet_interface(ucc_geth_private_t *ugeth) | |||
1691 | */ | 1677 | */ |
1692 | static void adjust_link(struct net_device *dev) | 1678 | static void adjust_link(struct net_device *dev) |
1693 | { | 1679 | { |
1694 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 1680 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
1695 | ucc_geth_t *ug_regs; | 1681 | struct ucc_geth *ug_regs; |
1696 | u32 tempval; | 1682 | u32 tempval; |
1697 | struct ugeth_mii_info *mii_info = ugeth->mii_info; | 1683 | struct ugeth_mii_info *mii_info = ugeth->mii_info; |
1698 | 1684 | ||
@@ -1722,7 +1708,7 @@ static void adjust_link(struct net_device *dev) | |||
1722 | if (mii_info->speed != ugeth->oldspeed) { | 1708 | if (mii_info->speed != ugeth->oldspeed) { |
1723 | switch (mii_info->speed) { | 1709 | switch (mii_info->speed) { |
1724 | case 1000: | 1710 | case 1000: |
1725 | #ifdef CONFIG_MPC836x | 1711 | #ifdef CONFIG_PPC_MPC836x |
1726 | /* FIXME: This code is for 100Mbs BUG fixing, | 1712 | /* FIXME: This code is for 100Mbs BUG fixing, |
1727 | remove this when it is fixed!!! */ | 1713 | remove this when it is fixed!!! */ |
1728 | if (ugeth->ug_info->enet_interface == | 1714 | if (ugeth->ug_info->enet_interface == |
@@ -1768,7 +1754,7 @@ remove this when it is fixed!!! */ | |||
1768 | break; | 1754 | break; |
1769 | case 100: | 1755 | case 100: |
1770 | case 10: | 1756 | case 10: |
1771 | #ifdef CONFIG_MPC836x | 1757 | #ifdef CONFIG_PPC_MPC836x |
1772 | /* FIXME: This code is for 100Mbs BUG fixing, | 1758 | /* FIXME: This code is for 100Mbs BUG fixing, |
1773 | remove this lines when it will be fixed!!! */ | 1759 | remove this lines when it will be fixed!!! */ |
1774 | ugeth->ug_info->enet_interface = ENET_100_RGMII; | 1760 | ugeth->ug_info->enet_interface = ENET_100_RGMII; |
@@ -1827,9 +1813,9 @@ remove this lines when it will be fixed!!! */ | |||
1827 | */ | 1813 | */ |
1828 | static int init_phy(struct net_device *dev) | 1814 | static int init_phy(struct net_device *dev) |
1829 | { | 1815 | { |
1830 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 1816 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
1831 | struct phy_info *curphy; | 1817 | struct phy_info *curphy; |
1832 | ucc_mii_mng_t *mii_regs; | 1818 | struct ucc_mii_mng *mii_regs; |
1833 | struct ugeth_mii_info *mii_info; | 1819 | struct ugeth_mii_info *mii_info; |
1834 | int err; | 1820 | int err; |
1835 | 1821 | ||
@@ -1914,17 +1900,17 @@ static int init_phy(struct net_device *dev) | |||
1914 | } | 1900 | } |
1915 | 1901 | ||
1916 | #ifdef CONFIG_UGETH_TX_ON_DEMOND | 1902 | #ifdef CONFIG_UGETH_TX_ON_DEMOND |
1917 | static int ugeth_transmit_on_demand(ucc_geth_private_t *ugeth) | 1903 | static int ugeth_transmit_on_demand(struct ucc_geth_private *ugeth) |
1918 | { | 1904 | { |
1919 | ucc_fast_transmit_on_demand(ugeth->uccf); | 1905 | struct ucc_fastransmit_on_demand(ugeth->uccf); |
1920 | 1906 | ||
1921 | return 0; | 1907 | return 0; |
1922 | } | 1908 | } |
1923 | #endif | 1909 | #endif |
1924 | 1910 | ||
1925 | static int ugeth_graceful_stop_tx(ucc_geth_private_t *ugeth) | 1911 | static int ugeth_graceful_stop_tx(struct ucc_geth_private *ugeth) |
1926 | { | 1912 | { |
1927 | ucc_fast_private_t *uccf; | 1913 | struct ucc_fast_private *uccf; |
1928 | u32 cecr_subblock; | 1914 | u32 cecr_subblock; |
1929 | u32 temp; | 1915 | u32 temp; |
1930 | 1916 | ||
@@ -1940,7 +1926,7 @@ static int ugeth_graceful_stop_tx(ucc_geth_private_t *ugeth) | |||
1940 | cecr_subblock = | 1926 | cecr_subblock = |
1941 | ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num); | 1927 | ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num); |
1942 | qe_issue_cmd(QE_GRACEFUL_STOP_TX, cecr_subblock, | 1928 | qe_issue_cmd(QE_GRACEFUL_STOP_TX, cecr_subblock, |
1943 | (u8) QE_CR_PROTOCOL_ETHERNET, 0); | 1929 | QE_CR_PROTOCOL_ETHERNET, 0); |
1944 | 1930 | ||
1945 | /* Wait for command to complete */ | 1931 | /* Wait for command to complete */ |
1946 | do { | 1932 | do { |
@@ -1952,9 +1938,9 @@ static int ugeth_graceful_stop_tx(ucc_geth_private_t *ugeth) | |||
1952 | return 0; | 1938 | return 0; |
1953 | } | 1939 | } |
1954 | 1940 | ||
1955 | static int ugeth_graceful_stop_rx(ucc_geth_private_t * ugeth) | 1941 | static int ugeth_graceful_stop_rx(struct ucc_geth_private * ugeth) |
1956 | { | 1942 | { |
1957 | ucc_fast_private_t *uccf; | 1943 | struct ucc_fast_private *uccf; |
1958 | u32 cecr_subblock; | 1944 | u32 cecr_subblock; |
1959 | u8 temp; | 1945 | u8 temp; |
1960 | 1946 | ||
@@ -1973,7 +1959,7 @@ static int ugeth_graceful_stop_rx(ucc_geth_private_t * ugeth) | |||
1973 | ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info. | 1959 | ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info. |
1974 | ucc_num); | 1960 | ucc_num); |
1975 | qe_issue_cmd(QE_GRACEFUL_STOP_RX, cecr_subblock, | 1961 | qe_issue_cmd(QE_GRACEFUL_STOP_RX, cecr_subblock, |
1976 | (u8) QE_CR_PROTOCOL_ETHERNET, 0); | 1962 | QE_CR_PROTOCOL_ETHERNET, 0); |
1977 | 1963 | ||
1978 | temp = ugeth->p_rx_glbl_pram->rxgstpack; | 1964 | temp = ugeth->p_rx_glbl_pram->rxgstpack; |
1979 | } while (!(temp & GRACEFUL_STOP_ACKNOWLEDGE_RX)); | 1965 | } while (!(temp & GRACEFUL_STOP_ACKNOWLEDGE_RX)); |
@@ -1983,41 +1969,40 @@ static int ugeth_graceful_stop_rx(ucc_geth_private_t * ugeth) | |||
1983 | return 0; | 1969 | return 0; |
1984 | } | 1970 | } |
1985 | 1971 | ||
1986 | static int ugeth_restart_tx(ucc_geth_private_t *ugeth) | 1972 | static int ugeth_restart_tx(struct ucc_geth_private *ugeth) |
1987 | { | 1973 | { |
1988 | ucc_fast_private_t *uccf; | 1974 | struct ucc_fast_private *uccf; |
1989 | u32 cecr_subblock; | 1975 | u32 cecr_subblock; |
1990 | 1976 | ||
1991 | uccf = ugeth->uccf; | 1977 | uccf = ugeth->uccf; |
1992 | 1978 | ||
1993 | cecr_subblock = | 1979 | cecr_subblock = |
1994 | ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num); | 1980 | ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num); |
1995 | qe_issue_cmd(QE_RESTART_TX, cecr_subblock, (u8) QE_CR_PROTOCOL_ETHERNET, | 1981 | qe_issue_cmd(QE_RESTART_TX, cecr_subblock, QE_CR_PROTOCOL_ETHERNET, 0); |
1996 | 0); | ||
1997 | uccf->stopped_tx = 0; | 1982 | uccf->stopped_tx = 0; |
1998 | 1983 | ||
1999 | return 0; | 1984 | return 0; |
2000 | } | 1985 | } |
2001 | 1986 | ||
2002 | static int ugeth_restart_rx(ucc_geth_private_t *ugeth) | 1987 | static int ugeth_restart_rx(struct ucc_geth_private *ugeth) |
2003 | { | 1988 | { |
2004 | ucc_fast_private_t *uccf; | 1989 | struct ucc_fast_private *uccf; |
2005 | u32 cecr_subblock; | 1990 | u32 cecr_subblock; |
2006 | 1991 | ||
2007 | uccf = ugeth->uccf; | 1992 | uccf = ugeth->uccf; |
2008 | 1993 | ||
2009 | cecr_subblock = | 1994 | cecr_subblock = |
2010 | ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num); | 1995 | ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num); |
2011 | qe_issue_cmd(QE_RESTART_RX, cecr_subblock, (u8) QE_CR_PROTOCOL_ETHERNET, | 1996 | qe_issue_cmd(QE_RESTART_RX, cecr_subblock, QE_CR_PROTOCOL_ETHERNET, |
2012 | 0); | 1997 | 0); |
2013 | uccf->stopped_rx = 0; | 1998 | uccf->stopped_rx = 0; |
2014 | 1999 | ||
2015 | return 0; | 2000 | return 0; |
2016 | } | 2001 | } |
2017 | 2002 | ||
2018 | static int ugeth_enable(ucc_geth_private_t *ugeth, comm_dir_e mode) | 2003 | static int ugeth_enable(struct ucc_geth_private *ugeth, enum comm_dir mode) |
2019 | { | 2004 | { |
2020 | ucc_fast_private_t *uccf; | 2005 | struct ucc_fast_private *uccf; |
2021 | int enabled_tx, enabled_rx; | 2006 | int enabled_tx, enabled_rx; |
2022 | 2007 | ||
2023 | uccf = ugeth->uccf; | 2008 | uccf = ugeth->uccf; |
@@ -2044,9 +2029,9 @@ static int ugeth_enable(ucc_geth_private_t *ugeth, comm_dir_e mode) | |||
2044 | 2029 | ||
2045 | } | 2030 | } |
2046 | 2031 | ||
2047 | static int ugeth_disable(ucc_geth_private_t * ugeth, comm_dir_e mode) | 2032 | static int ugeth_disable(struct ucc_geth_private * ugeth, enum comm_dir mode) |
2048 | { | 2033 | { |
2049 | ucc_fast_private_t *uccf; | 2034 | struct ucc_fast_private *uccf; |
2050 | 2035 | ||
2051 | uccf = ugeth->uccf; | 2036 | uccf = ugeth->uccf; |
2052 | 2037 | ||
@@ -2069,7 +2054,7 @@ static int ugeth_disable(ucc_geth_private_t * ugeth, comm_dir_e mode) | |||
2069 | return 0; | 2054 | return 0; |
2070 | } | 2055 | } |
2071 | 2056 | ||
2072 | static void ugeth_dump_regs(ucc_geth_private_t *ugeth) | 2057 | static void ugeth_dump_regs(struct ucc_geth_private *ugeth) |
2073 | { | 2058 | { |
2074 | #ifdef DEBUG | 2059 | #ifdef DEBUG |
2075 | ucc_fast_dump_regs(ugeth->uccf); | 2060 | ucc_fast_dump_regs(ugeth->uccf); |
@@ -2079,9 +2064,9 @@ static void ugeth_dump_regs(ucc_geth_private_t *ugeth) | |||
2079 | } | 2064 | } |
2080 | 2065 | ||
2081 | #ifdef CONFIG_UGETH_FILTERING | 2066 | #ifdef CONFIG_UGETH_FILTERING |
2082 | static int ugeth_ext_filtering_serialize_tad(ucc_geth_tad_params_t * | 2067 | static int ugeth_ext_filtering_serialize_tad(struct ucc_geth_tad_params * |
2083 | p_UccGethTadParams, | 2068 | p_UccGethTadParams, |
2084 | qe_fltr_tad_t *qe_fltr_tad) | 2069 | struct qe_fltr_tad *qe_fltr_tad) |
2085 | { | 2070 | { |
2086 | u16 temp; | 2071 | u16 temp; |
2087 | 2072 | ||
@@ -2119,11 +2104,11 @@ static int ugeth_ext_filtering_serialize_tad(ucc_geth_tad_params_t * | |||
2119 | return 0; | 2104 | return 0; |
2120 | } | 2105 | } |
2121 | 2106 | ||
2122 | static enet_addr_container_t | 2107 | static struct enet_addr_container_t |
2123 | *ugeth_82xx_filtering_get_match_addr_in_hash(ucc_geth_private_t *ugeth, | 2108 | *ugeth_82xx_filtering_get_match_addr_in_hash(struct ucc_geth_private *ugeth, |
2124 | enet_addr_t *p_enet_addr) | 2109 | struct enet_addr *p_enet_addr) |
2125 | { | 2110 | { |
2126 | enet_addr_container_t *enet_addr_cont; | 2111 | struct enet_addr_container *enet_addr_cont; |
2127 | struct list_head *p_lh; | 2112 | struct list_head *p_lh; |
2128 | u16 i, num; | 2113 | u16 i, num; |
2129 | int32_t j; | 2114 | int32_t j; |
@@ -2144,7 +2129,7 @@ static enet_addr_container_t | |||
2144 | 2129 | ||
2145 | for (i = 0; i < num; i++) { | 2130 | for (i = 0; i < num; i++) { |
2146 | enet_addr_cont = | 2131 | enet_addr_cont = |
2147 | (enet_addr_container_t *) | 2132 | (struct enet_addr_container *) |
2148 | ENET_ADDR_CONT_ENTRY(dequeue(p_lh)); | 2133 | ENET_ADDR_CONT_ENTRY(dequeue(p_lh)); |
2149 | for (j = ENET_NUM_OCTETS_PER_ADDRESS - 1; j >= 0; j--) { | 2134 | for (j = ENET_NUM_OCTETS_PER_ADDRESS - 1; j >= 0; j--) { |
2150 | if ((*p_enet_addr)[j] != (enet_addr_cont->address)[j]) | 2135 | if ((*p_enet_addr)[j] != (enet_addr_cont->address)[j]) |
@@ -2157,11 +2142,11 @@ static enet_addr_container_t | |||
2157 | return NULL; | 2142 | return NULL; |
2158 | } | 2143 | } |
2159 | 2144 | ||
2160 | static int ugeth_82xx_filtering_add_addr_in_hash(ucc_geth_private_t *ugeth, | 2145 | static int ugeth_82xx_filtering_add_addr_in_hash(struct ucc_geth_private *ugeth, |
2161 | enet_addr_t *p_enet_addr) | 2146 | struct enet_addr *p_enet_addr) |
2162 | { | 2147 | { |
2163 | ucc_geth_enet_address_recognition_location_e location; | 2148 | enum ucc_geth_enet_address_recognition_location location; |
2164 | enet_addr_container_t *enet_addr_cont; | 2149 | struct enet_addr_container *enet_addr_cont; |
2165 | struct list_head *p_lh; | 2150 | struct list_head *p_lh; |
2166 | u8 i; | 2151 | u8 i; |
2167 | u32 limit; | 2152 | u32 limit; |
@@ -2196,18 +2181,17 @@ static int ugeth_82xx_filtering_add_addr_in_hash(ucc_geth_private_t *ugeth, | |||
2196 | enqueue(p_lh, &enet_addr_cont->node); /* Put it back */ | 2181 | enqueue(p_lh, &enet_addr_cont->node); /* Put it back */ |
2197 | ++(*p_counter); | 2182 | ++(*p_counter); |
2198 | 2183 | ||
2199 | hw_add_addr_in_hash(ugeth, &(enet_addr_cont->address)); | 2184 | hw_add_addr_in_hash(ugeth, enet_addr_cont->address); |
2200 | |||
2201 | return 0; | 2185 | return 0; |
2202 | } | 2186 | } |
2203 | 2187 | ||
2204 | static int ugeth_82xx_filtering_clear_addr_in_hash(ucc_geth_private_t *ugeth, | 2188 | static int ugeth_82xx_filtering_clear_addr_in_hash(struct ucc_geth_private *ugeth, |
2205 | enet_addr_t *p_enet_addr) | 2189 | struct enet_addr *p_enet_addr) |
2206 | { | 2190 | { |
2207 | ucc_geth_82xx_address_filtering_pram_t *p_82xx_addr_filt; | 2191 | struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt; |
2208 | enet_addr_container_t *enet_addr_cont; | 2192 | struct enet_addr_container *enet_addr_cont; |
2209 | ucc_fast_private_t *uccf; | 2193 | struct ucc_fast_private *uccf; |
2210 | comm_dir_e comm_dir; | 2194 | enum comm_dir comm_dir; |
2211 | u16 i, num; | 2195 | u16 i, num; |
2212 | struct list_head *p_lh; | 2196 | struct list_head *p_lh; |
2213 | u32 *addr_h, *addr_l; | 2197 | u32 *addr_h, *addr_l; |
@@ -2216,7 +2200,7 @@ static int ugeth_82xx_filtering_clear_addr_in_hash(ucc_geth_private_t *ugeth, | |||
2216 | uccf = ugeth->uccf; | 2200 | uccf = ugeth->uccf; |
2217 | 2201 | ||
2218 | p_82xx_addr_filt = | 2202 | p_82xx_addr_filt = |
2219 | (ucc_geth_82xx_address_filtering_pram_t *) ugeth->p_rx_glbl_pram-> | 2203 | (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram-> |
2220 | addressfiltering; | 2204 | addressfiltering; |
2221 | 2205 | ||
2222 | if (! | 2206 | if (! |
@@ -2256,9 +2240,9 @@ static int ugeth_82xx_filtering_clear_addr_in_hash(ucc_geth_private_t *ugeth, | |||
2256 | num = --(*p_counter); | 2240 | num = --(*p_counter); |
2257 | for (i = 0; i < num; i++) { | 2241 | for (i = 0; i < num; i++) { |
2258 | enet_addr_cont = | 2242 | enet_addr_cont = |
2259 | (enet_addr_container_t *) | 2243 | (struct enet_addr_container *) |
2260 | ENET_ADDR_CONT_ENTRY(dequeue(p_lh)); | 2244 | ENET_ADDR_CONT_ENTRY(dequeue(p_lh)); |
2261 | hw_add_addr_in_hash(ugeth, &(enet_addr_cont->address)); | 2245 | hw_add_addr_in_hash(ugeth, enet_addr_cont->address); |
2262 | enqueue(p_lh, &enet_addr_cont->node); /* Put it back */ | 2246 | enqueue(p_lh, &enet_addr_cont->node); /* Put it back */ |
2263 | } | 2247 | } |
2264 | 2248 | ||
@@ -2269,14 +2253,14 @@ static int ugeth_82xx_filtering_clear_addr_in_hash(ucc_geth_private_t *ugeth, | |||
2269 | } | 2253 | } |
2270 | #endif /* CONFIG_UGETH_FILTERING */ | 2254 | #endif /* CONFIG_UGETH_FILTERING */ |
2271 | 2255 | ||
2272 | static int ugeth_82xx_filtering_clear_all_addr_in_hash(ucc_geth_private_t * | 2256 | static int ugeth_82xx_filtering_clear_all_addr_in_hash(struct ucc_geth_private * |
2273 | ugeth, | 2257 | ugeth, |
2274 | enet_addr_type_e | 2258 | enum enet_addr_type |
2275 | enet_addr_type) | 2259 | enet_addr_type) |
2276 | { | 2260 | { |
2277 | ucc_geth_82xx_address_filtering_pram_t *p_82xx_addr_filt; | 2261 | struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt; |
2278 | ucc_fast_private_t *uccf; | 2262 | struct ucc_fast_private *uccf; |
2279 | comm_dir_e comm_dir; | 2263 | enum comm_dir comm_dir; |
2280 | struct list_head *p_lh; | 2264 | struct list_head *p_lh; |
2281 | u16 i, num; | 2265 | u16 i, num; |
2282 | u32 *addr_h, *addr_l; | 2266 | u32 *addr_h, *addr_l; |
@@ -2285,7 +2269,7 @@ static int ugeth_82xx_filtering_clear_all_addr_in_hash(ucc_geth_private_t * | |||
2285 | uccf = ugeth->uccf; | 2269 | uccf = ugeth->uccf; |
2286 | 2270 | ||
2287 | p_82xx_addr_filt = | 2271 | p_82xx_addr_filt = |
2288 | (ucc_geth_82xx_address_filtering_pram_t *) ugeth->p_rx_glbl_pram-> | 2272 | (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram-> |
2289 | addressfiltering; | 2273 | addressfiltering; |
2290 | 2274 | ||
2291 | if (enet_addr_type == ENET_ADDR_TYPE_GROUP) { | 2275 | if (enet_addr_type == ENET_ADDR_TYPE_GROUP) { |
@@ -2331,8 +2315,8 @@ static int ugeth_82xx_filtering_clear_all_addr_in_hash(ucc_geth_private_t * | |||
2331 | } | 2315 | } |
2332 | 2316 | ||
2333 | #ifdef CONFIG_UGETH_FILTERING | 2317 | #ifdef CONFIG_UGETH_FILTERING |
2334 | static int ugeth_82xx_filtering_add_addr_in_paddr(ucc_geth_private_t *ugeth, | 2318 | static int ugeth_82xx_filtering_add_addr_in_paddr(struct ucc_geth_private *ugeth, |
2335 | enet_addr_t *p_enet_addr, | 2319 | struct enet_addr *p_enet_addr, |
2336 | u8 paddr_num) | 2320 | u8 paddr_num) |
2337 | { | 2321 | { |
2338 | int i; | 2322 | int i; |
@@ -2352,14 +2336,14 @@ static int ugeth_82xx_filtering_add_addr_in_paddr(ucc_geth_private_t *ugeth, | |||
2352 | } | 2336 | } |
2353 | #endif /* CONFIG_UGETH_FILTERING */ | 2337 | #endif /* CONFIG_UGETH_FILTERING */ |
2354 | 2338 | ||
2355 | static int ugeth_82xx_filtering_clear_addr_in_paddr(ucc_geth_private_t *ugeth, | 2339 | static int ugeth_82xx_filtering_clear_addr_in_paddr(struct ucc_geth_private *ugeth, |
2356 | u8 paddr_num) | 2340 | u8 paddr_num) |
2357 | { | 2341 | { |
2358 | ugeth->indAddrRegUsed[paddr_num] = 0; /* mark this paddr as not used */ | 2342 | ugeth->indAddrRegUsed[paddr_num] = 0; /* mark this paddr as not used */ |
2359 | return hw_clear_addr_in_paddr(ugeth, paddr_num);/* clear in hardware */ | 2343 | return hw_clear_addr_in_paddr(ugeth, paddr_num);/* clear in hardware */ |
2360 | } | 2344 | } |
2361 | 2345 | ||
2362 | static void ucc_geth_memclean(ucc_geth_private_t *ugeth) | 2346 | static void ucc_geth_memclean(struct ucc_geth_private *ugeth) |
2363 | { | 2347 | { |
2364 | u16 i, j; | 2348 | u16 i, j; |
2365 | u8 *bd; | 2349 | u8 *bd; |
@@ -2433,8 +2417,8 @@ static void ucc_geth_memclean(ucc_geth_private_t *ugeth) | |||
2433 | for (j = 0; j < ugeth->ug_info->bdRingLenTx[i]; j++) { | 2417 | for (j = 0; j < ugeth->ug_info->bdRingLenTx[i]; j++) { |
2434 | if (ugeth->tx_skbuff[i][j]) { | 2418 | if (ugeth->tx_skbuff[i][j]) { |
2435 | dma_unmap_single(NULL, | 2419 | dma_unmap_single(NULL, |
2436 | BD_BUFFER_ARG(bd), | 2420 | ((qe_bd_t *)bd)->buf, |
2437 | (BD_STATUS_AND_LENGTH(bd) & | 2421 | (in_be32((u32 *)bd) & |
2438 | BD_LENGTH_MASK), | 2422 | BD_LENGTH_MASK), |
2439 | DMA_TO_DEVICE); | 2423 | DMA_TO_DEVICE); |
2440 | dev_kfree_skb_any(ugeth->tx_skbuff[i][j]); | 2424 | dev_kfree_skb_any(ugeth->tx_skbuff[i][j]); |
@@ -2460,18 +2444,17 @@ static void ucc_geth_memclean(ucc_geth_private_t *ugeth) | |||
2460 | bd = ugeth->p_rx_bd_ring[i]; | 2444 | bd = ugeth->p_rx_bd_ring[i]; |
2461 | for (j = 0; j < ugeth->ug_info->bdRingLenRx[i]; j++) { | 2445 | for (j = 0; j < ugeth->ug_info->bdRingLenRx[i]; j++) { |
2462 | if (ugeth->rx_skbuff[i][j]) { | 2446 | if (ugeth->rx_skbuff[i][j]) { |
2463 | dma_unmap_single(NULL, BD_BUFFER(bd), | 2447 | dma_unmap_single(NULL, |
2464 | ugeth->ug_info-> | 2448 | ((struct qe_bd *)bd)->buf, |
2465 | uf_info. | 2449 | ugeth->ug_info-> |
2466 | max_rx_buf_length + | 2450 | uf_info.max_rx_buf_length + |
2467 | UCC_GETH_RX_DATA_BUF_ALIGNMENT, | 2451 | UCC_GETH_RX_DATA_BUF_ALIGNMENT, |
2468 | DMA_FROM_DEVICE); | 2452 | DMA_FROM_DEVICE); |
2469 | 2453 | dev_kfree_skb_any( | |
2470 | dev_kfree_skb_any(ugeth-> | 2454 | ugeth->rx_skbuff[i][j]); |
2471 | rx_skbuff[i][j]); | ||
2472 | ugeth->rx_skbuff[i][j] = NULL; | 2455 | ugeth->rx_skbuff[i][j] = NULL; |
2473 | } | 2456 | } |
2474 | bd += UCC_GETH_SIZE_OF_BD; | 2457 | bd += sizeof(struct qe_bd); |
2475 | } | 2458 | } |
2476 | 2459 | ||
2477 | kfree(ugeth->rx_skbuff[i]); | 2460 | kfree(ugeth->rx_skbuff[i]); |
@@ -2496,11 +2479,11 @@ static void ucc_geth_memclean(ucc_geth_private_t *ugeth) | |||
2496 | 2479 | ||
2497 | static void ucc_geth_set_multi(struct net_device *dev) | 2480 | static void ucc_geth_set_multi(struct net_device *dev) |
2498 | { | 2481 | { |
2499 | ucc_geth_private_t *ugeth; | 2482 | struct ucc_geth_private *ugeth; |
2500 | struct dev_mc_list *dmi; | 2483 | struct dev_mc_list *dmi; |
2501 | ucc_fast_t *uf_regs; | 2484 | struct ucc_fast *uf_regs; |
2502 | ucc_geth_82xx_address_filtering_pram_t *p_82xx_addr_filt; | 2485 | struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt; |
2503 | enet_addr_t tempaddr; | 2486 | u8 tempaddr[6]; |
2504 | u8 *mcptr, *tdptr; | 2487 | u8 *mcptr, *tdptr; |
2505 | int i, j; | 2488 | int i, j; |
2506 | 2489 | ||
@@ -2517,7 +2500,7 @@ static void ucc_geth_set_multi(struct net_device *dev) | |||
2517 | uf_regs->upsmr &= ~UPSMR_PRO; | 2500 | uf_regs->upsmr &= ~UPSMR_PRO; |
2518 | 2501 | ||
2519 | p_82xx_addr_filt = | 2502 | p_82xx_addr_filt = |
2520 | (ucc_geth_82xx_address_filtering_pram_t *) ugeth-> | 2503 | (struct ucc_geth_82xx_address_filtering_pram *) ugeth-> |
2521 | p_rx_glbl_pram->addressfiltering; | 2504 | p_rx_glbl_pram->addressfiltering; |
2522 | 2505 | ||
2523 | if (dev->flags & IFF_ALLMULTI) { | 2506 | if (dev->flags & IFF_ALLMULTI) { |
@@ -2546,23 +2529,22 @@ static void ucc_geth_set_multi(struct net_device *dev) | |||
2546 | * copy bytes MSB first from dmi_addr. | 2529 | * copy bytes MSB first from dmi_addr. |
2547 | */ | 2530 | */ |
2548 | mcptr = (u8 *) dmi->dmi_addr + 5; | 2531 | mcptr = (u8 *) dmi->dmi_addr + 5; |
2549 | tdptr = (u8 *) & tempaddr; | 2532 | tdptr = (u8 *) tempaddr; |
2550 | for (j = 0; j < 6; j++) | 2533 | for (j = 0; j < 6; j++) |
2551 | *tdptr++ = *mcptr--; | 2534 | *tdptr++ = *mcptr--; |
2552 | 2535 | ||
2553 | /* Ask CPM to run CRC and set bit in | 2536 | /* Ask CPM to run CRC and set bit in |
2554 | * filter mask. | 2537 | * filter mask. |
2555 | */ | 2538 | */ |
2556 | hw_add_addr_in_hash(ugeth, &tempaddr); | 2539 | hw_add_addr_in_hash(ugeth, tempaddr); |
2557 | |||
2558 | } | 2540 | } |
2559 | } | 2541 | } |
2560 | } | 2542 | } |
2561 | } | 2543 | } |
2562 | 2544 | ||
2563 | static void ucc_geth_stop(ucc_geth_private_t *ugeth) | 2545 | static void ucc_geth_stop(struct ucc_geth_private *ugeth) |
2564 | { | 2546 | { |
2565 | ucc_geth_t *ug_regs = ugeth->ug_regs; | 2547 | struct ucc_geth *ug_regs = ugeth->ug_regs; |
2566 | u32 tempval; | 2548 | u32 tempval; |
2567 | 2549 | ||
2568 | ugeth_vdbg("%s: IN", __FUNCTION__); | 2550 | ugeth_vdbg("%s: IN", __FUNCTION__); |
@@ -2605,15 +2587,15 @@ static void ucc_geth_stop(ucc_geth_private_t *ugeth) | |||
2605 | ucc_geth_memclean(ugeth); | 2587 | ucc_geth_memclean(ugeth); |
2606 | } | 2588 | } |
2607 | 2589 | ||
2608 | static int ucc_geth_startup(ucc_geth_private_t *ugeth) | 2590 | static int ucc_geth_startup(struct ucc_geth_private *ugeth) |
2609 | { | 2591 | { |
2610 | ucc_geth_82xx_address_filtering_pram_t *p_82xx_addr_filt; | 2592 | struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt; |
2611 | ucc_geth_init_pram_t *p_init_enet_pram; | 2593 | struct ucc_geth_init_pram *p_init_enet_pram; |
2612 | ucc_fast_private_t *uccf; | 2594 | struct ucc_fast_private *uccf; |
2613 | ucc_geth_info_t *ug_info; | 2595 | struct ucc_geth_info *ug_info; |
2614 | ucc_fast_info_t *uf_info; | 2596 | struct ucc_fast_info *uf_info; |
2615 | ucc_fast_t *uf_regs; | 2597 | struct ucc_fast *uf_regs; |
2616 | ucc_geth_t *ug_regs; | 2598 | struct ucc_geth *ug_regs; |
2617 | int ret_val = -EINVAL; | 2599 | int ret_val = -EINVAL; |
2618 | u32 remoder = UCC_GETH_REMODER_INIT; | 2600 | u32 remoder = UCC_GETH_REMODER_INIT; |
2619 | u32 init_enet_pram_offset, cecr_subblock, command, maccfg1; | 2601 | u32 init_enet_pram_offset, cecr_subblock, command, maccfg1; |
@@ -2788,7 +2770,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
2788 | UCC_GETH_VLAN_OPERATION_NON_TAGGED_NOP); | 2770 | UCC_GETH_VLAN_OPERATION_NON_TAGGED_NOP); |
2789 | 2771 | ||
2790 | uf_regs = uccf->uf_regs; | 2772 | uf_regs = uccf->uf_regs; |
2791 | ug_regs = (ucc_geth_t *) (uccf->uf_regs); | 2773 | ug_regs = (struct ucc_geth *) (uccf->uf_regs); |
2792 | ugeth->ug_regs = ug_regs; | 2774 | ugeth->ug_regs = ug_regs; |
2793 | 2775 | ||
2794 | init_default_reg_vals(&uf_regs->upsmr, | 2776 | init_default_reg_vals(&uf_regs->upsmr, |
@@ -2869,10 +2851,10 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
2869 | /* Allocate in multiple of | 2851 | /* Allocate in multiple of |
2870 | UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT, | 2852 | UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT, |
2871 | according to spec */ | 2853 | according to spec */ |
2872 | length = ((ug_info->bdRingLenTx[j] * UCC_GETH_SIZE_OF_BD) | 2854 | length = ((ug_info->bdRingLenTx[j] * sizeof(struct qe_bd)) |
2873 | / UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT) | 2855 | / UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT) |
2874 | * UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT; | 2856 | * UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT; |
2875 | if ((ug_info->bdRingLenTx[j] * UCC_GETH_SIZE_OF_BD) % | 2857 | if ((ug_info->bdRingLenTx[j] * sizeof(struct qe_bd)) % |
2876 | UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT) | 2858 | UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT) |
2877 | length += UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT; | 2859 | length += UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT; |
2878 | if (uf_info->bd_mem_part == MEM_PART_SYSTEM) { | 2860 | if (uf_info->bd_mem_part == MEM_PART_SYSTEM) { |
@@ -2904,13 +2886,13 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
2904 | } | 2886 | } |
2905 | /* Zero unused end of bd ring, according to spec */ | 2887 | /* Zero unused end of bd ring, according to spec */ |
2906 | memset(ugeth->p_tx_bd_ring[j] + | 2888 | memset(ugeth->p_tx_bd_ring[j] + |
2907 | ug_info->bdRingLenTx[j] * UCC_GETH_SIZE_OF_BD, 0, | 2889 | ug_info->bdRingLenTx[j] * sizeof(struct qe_bd), 0, |
2908 | length - ug_info->bdRingLenTx[j] * UCC_GETH_SIZE_OF_BD); | 2890 | length - ug_info->bdRingLenTx[j] * sizeof(struct qe_bd)); |
2909 | } | 2891 | } |
2910 | 2892 | ||
2911 | /* Allocate Rx bds */ | 2893 | /* Allocate Rx bds */ |
2912 | for (j = 0; j < ug_info->numQueuesRx; j++) { | 2894 | for (j = 0; j < ug_info->numQueuesRx; j++) { |
2913 | length = ug_info->bdRingLenRx[j] * UCC_GETH_SIZE_OF_BD; | 2895 | length = ug_info->bdRingLenRx[j] * sizeof(struct qe_bd); |
2914 | if (uf_info->bd_mem_part == MEM_PART_SYSTEM) { | 2896 | if (uf_info->bd_mem_part == MEM_PART_SYSTEM) { |
2915 | u32 align = 4; | 2897 | u32 align = 4; |
2916 | if (UCC_GETH_RX_BD_RING_ALIGNMENT > 4) | 2898 | if (UCC_GETH_RX_BD_RING_ALIGNMENT > 4) |
@@ -2960,12 +2942,15 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
2960 | ugeth->skb_curtx[j] = ugeth->skb_dirtytx[j] = 0; | 2942 | ugeth->skb_curtx[j] = ugeth->skb_dirtytx[j] = 0; |
2961 | bd = ugeth->confBd[j] = ugeth->txBd[j] = ugeth->p_tx_bd_ring[j]; | 2943 | bd = ugeth->confBd[j] = ugeth->txBd[j] = ugeth->p_tx_bd_ring[j]; |
2962 | for (i = 0; i < ug_info->bdRingLenTx[j]; i++) { | 2944 | for (i = 0; i < ug_info->bdRingLenTx[j]; i++) { |
2963 | BD_BUFFER_CLEAR(bd); | 2945 | /* clear bd buffer */ |
2964 | BD_STATUS_AND_LENGTH_SET(bd, 0); | 2946 | out_be32(&((struct qe_bd *)bd)->buf, 0); |
2965 | bd += UCC_GETH_SIZE_OF_BD; | 2947 | /* set bd status and length */ |
2948 | out_be32((u32 *)bd, 0); | ||
2949 | bd += sizeof(struct qe_bd); | ||
2966 | } | 2950 | } |
2967 | bd -= UCC_GETH_SIZE_OF_BD; | 2951 | bd -= sizeof(struct qe_bd); |
2968 | BD_STATUS_AND_LENGTH_SET(bd, T_W);/* for last BD set Wrap bit */ | 2952 | /* set bd status and length */ |
2953 | out_be32((u32 *)bd, T_W); /* for last BD set Wrap bit */ | ||
2969 | } | 2954 | } |
2970 | 2955 | ||
2971 | /* Init Rx bds */ | 2956 | /* Init Rx bds */ |
@@ -2989,12 +2974,15 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
2989 | ugeth->skb_currx[j] = 0; | 2974 | ugeth->skb_currx[j] = 0; |
2990 | bd = ugeth->rxBd[j] = ugeth->p_rx_bd_ring[j]; | 2975 | bd = ugeth->rxBd[j] = ugeth->p_rx_bd_ring[j]; |
2991 | for (i = 0; i < ug_info->bdRingLenRx[j]; i++) { | 2976 | for (i = 0; i < ug_info->bdRingLenRx[j]; i++) { |
2992 | BD_STATUS_AND_LENGTH_SET(bd, R_I); | 2977 | /* set bd status and length */ |
2993 | BD_BUFFER_CLEAR(bd); | 2978 | out_be32((u32 *)bd, R_I); |
2994 | bd += UCC_GETH_SIZE_OF_BD; | 2979 | /* clear bd buffer */ |
2980 | out_be32(&((struct qe_bd *)bd)->buf, 0); | ||
2981 | bd += sizeof(struct qe_bd); | ||
2995 | } | 2982 | } |
2996 | bd -= UCC_GETH_SIZE_OF_BD; | 2983 | bd -= sizeof(struct qe_bd); |
2997 | BD_STATUS_AND_LENGTH_SET(bd, R_W);/* for last BD set Wrap bit */ | 2984 | /* set bd status and length */ |
2985 | out_be32((u32 *)bd, R_W); /* for last BD set Wrap bit */ | ||
2998 | } | 2986 | } |
2999 | 2987 | ||
3000 | /* | 2988 | /* |
@@ -3003,7 +2991,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3003 | /* Tx global PRAM */ | 2991 | /* Tx global PRAM */ |
3004 | /* Allocate global tx parameter RAM page */ | 2992 | /* Allocate global tx parameter RAM page */ |
3005 | ugeth->tx_glbl_pram_offset = | 2993 | ugeth->tx_glbl_pram_offset = |
3006 | qe_muram_alloc(sizeof(ucc_geth_tx_global_pram_t), | 2994 | qe_muram_alloc(sizeof(struct ucc_geth_tx_global_pram), |
3007 | UCC_GETH_TX_GLOBAL_PRAM_ALIGNMENT); | 2995 | UCC_GETH_TX_GLOBAL_PRAM_ALIGNMENT); |
3008 | if (IS_MURAM_ERR(ugeth->tx_glbl_pram_offset)) { | 2996 | if (IS_MURAM_ERR(ugeth->tx_glbl_pram_offset)) { |
3009 | ugeth_err | 2997 | ugeth_err |
@@ -3013,10 +3001,10 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3013 | return -ENOMEM; | 3001 | return -ENOMEM; |
3014 | } | 3002 | } |
3015 | ugeth->p_tx_glbl_pram = | 3003 | ugeth->p_tx_glbl_pram = |
3016 | (ucc_geth_tx_global_pram_t *) qe_muram_addr(ugeth-> | 3004 | (struct ucc_geth_tx_global_pram *) qe_muram_addr(ugeth-> |
3017 | tx_glbl_pram_offset); | 3005 | tx_glbl_pram_offset); |
3018 | /* Zero out p_tx_glbl_pram */ | 3006 | /* Zero out p_tx_glbl_pram */ |
3019 | memset(ugeth->p_tx_glbl_pram, 0, sizeof(ucc_geth_tx_global_pram_t)); | 3007 | memset(ugeth->p_tx_glbl_pram, 0, sizeof(struct ucc_geth_tx_global_pram)); |
3020 | 3008 | ||
3021 | /* Fill global PRAM */ | 3009 | /* Fill global PRAM */ |
3022 | 3010 | ||
@@ -3024,7 +3012,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3024 | /* Size varies with number of Tx threads */ | 3012 | /* Size varies with number of Tx threads */ |
3025 | ugeth->thread_dat_tx_offset = | 3013 | ugeth->thread_dat_tx_offset = |
3026 | qe_muram_alloc(numThreadsTxNumerical * | 3014 | qe_muram_alloc(numThreadsTxNumerical * |
3027 | sizeof(ucc_geth_thread_data_tx_t) + | 3015 | sizeof(struct ucc_geth_thread_data_tx) + |
3028 | 32 * (numThreadsTxNumerical == 1), | 3016 | 32 * (numThreadsTxNumerical == 1), |
3029 | UCC_GETH_THREAD_DATA_ALIGNMENT); | 3017 | UCC_GETH_THREAD_DATA_ALIGNMENT); |
3030 | if (IS_MURAM_ERR(ugeth->thread_dat_tx_offset)) { | 3018 | if (IS_MURAM_ERR(ugeth->thread_dat_tx_offset)) { |
@@ -3036,7 +3024,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3036 | } | 3024 | } |
3037 | 3025 | ||
3038 | ugeth->p_thread_data_tx = | 3026 | ugeth->p_thread_data_tx = |
3039 | (ucc_geth_thread_data_tx_t *) qe_muram_addr(ugeth-> | 3027 | (struct ucc_geth_thread_data_tx *) qe_muram_addr(ugeth-> |
3040 | thread_dat_tx_offset); | 3028 | thread_dat_tx_offset); |
3041 | out_be32(&ugeth->p_tx_glbl_pram->tqptr, ugeth->thread_dat_tx_offset); | 3029 | out_be32(&ugeth->p_tx_glbl_pram->tqptr, ugeth->thread_dat_tx_offset); |
3042 | 3030 | ||
@@ -3053,7 +3041,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3053 | /* Size varies with number of Tx queues */ | 3041 | /* Size varies with number of Tx queues */ |
3054 | ugeth->send_q_mem_reg_offset = | 3042 | ugeth->send_q_mem_reg_offset = |
3055 | qe_muram_alloc(ug_info->numQueuesTx * | 3043 | qe_muram_alloc(ug_info->numQueuesTx * |
3056 | sizeof(ucc_geth_send_queue_qd_t), | 3044 | sizeof(struct ucc_geth_send_queue_qd), |
3057 | UCC_GETH_SEND_QUEUE_QUEUE_DESCRIPTOR_ALIGNMENT); | 3045 | UCC_GETH_SEND_QUEUE_QUEUE_DESCRIPTOR_ALIGNMENT); |
3058 | if (IS_MURAM_ERR(ugeth->send_q_mem_reg_offset)) { | 3046 | if (IS_MURAM_ERR(ugeth->send_q_mem_reg_offset)) { |
3059 | ugeth_err | 3047 | ugeth_err |
@@ -3064,7 +3052,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3064 | } | 3052 | } |
3065 | 3053 | ||
3066 | ugeth->p_send_q_mem_reg = | 3054 | ugeth->p_send_q_mem_reg = |
3067 | (ucc_geth_send_queue_mem_region_t *) qe_muram_addr(ugeth-> | 3055 | (struct ucc_geth_send_queue_mem_region *) qe_muram_addr(ugeth-> |
3068 | send_q_mem_reg_offset); | 3056 | send_q_mem_reg_offset); |
3069 | out_be32(&ugeth->p_tx_glbl_pram->sqptr, ugeth->send_q_mem_reg_offset); | 3057 | out_be32(&ugeth->p_tx_glbl_pram->sqptr, ugeth->send_q_mem_reg_offset); |
3070 | 3058 | ||
@@ -3073,7 +3061,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3073 | for (i = 0; i < ug_info->numQueuesTx; i++) { | 3061 | for (i = 0; i < ug_info->numQueuesTx; i++) { |
3074 | endOfRing = | 3062 | endOfRing = |
3075 | ugeth->p_tx_bd_ring[i] + (ug_info->bdRingLenTx[i] - | 3063 | ugeth->p_tx_bd_ring[i] + (ug_info->bdRingLenTx[i] - |
3076 | 1) * UCC_GETH_SIZE_OF_BD; | 3064 | 1) * sizeof(struct qe_bd); |
3077 | if (ugeth->ug_info->uf_info.bd_mem_part == MEM_PART_SYSTEM) { | 3065 | if (ugeth->ug_info->uf_info.bd_mem_part == MEM_PART_SYSTEM) { |
3078 | out_be32(&ugeth->p_send_q_mem_reg->sqqd[i].bd_ring_base, | 3066 | out_be32(&ugeth->p_send_q_mem_reg->sqqd[i].bd_ring_base, |
3079 | (u32) virt_to_phys(ugeth->p_tx_bd_ring[i])); | 3067 | (u32) virt_to_phys(ugeth->p_tx_bd_ring[i])); |
@@ -3096,7 +3084,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3096 | if (ug_info->numQueuesTx > 1) { | 3084 | if (ug_info->numQueuesTx > 1) { |
3097 | /* scheduler exists only if more than 1 tx queue */ | 3085 | /* scheduler exists only if more than 1 tx queue */ |
3098 | ugeth->scheduler_offset = | 3086 | ugeth->scheduler_offset = |
3099 | qe_muram_alloc(sizeof(ucc_geth_scheduler_t), | 3087 | qe_muram_alloc(sizeof(struct ucc_geth_scheduler), |
3100 | UCC_GETH_SCHEDULER_ALIGNMENT); | 3088 | UCC_GETH_SCHEDULER_ALIGNMENT); |
3101 | if (IS_MURAM_ERR(ugeth->scheduler_offset)) { | 3089 | if (IS_MURAM_ERR(ugeth->scheduler_offset)) { |
3102 | ugeth_err | 3090 | ugeth_err |
@@ -3107,12 +3095,12 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3107 | } | 3095 | } |
3108 | 3096 | ||
3109 | ugeth->p_scheduler = | 3097 | ugeth->p_scheduler = |
3110 | (ucc_geth_scheduler_t *) qe_muram_addr(ugeth-> | 3098 | (struct ucc_geth_scheduler *) qe_muram_addr(ugeth-> |
3111 | scheduler_offset); | 3099 | scheduler_offset); |
3112 | out_be32(&ugeth->p_tx_glbl_pram->schedulerbasepointer, | 3100 | out_be32(&ugeth->p_tx_glbl_pram->schedulerbasepointer, |
3113 | ugeth->scheduler_offset); | 3101 | ugeth->scheduler_offset); |
3114 | /* Zero out p_scheduler */ | 3102 | /* Zero out p_scheduler */ |
3115 | memset(ugeth->p_scheduler, 0, sizeof(ucc_geth_scheduler_t)); | 3103 | memset(ugeth->p_scheduler, 0, sizeof(struct ucc_geth_scheduler)); |
3116 | 3104 | ||
3117 | /* Set values in scheduler */ | 3105 | /* Set values in scheduler */ |
3118 | out_be32(&ugeth->p_scheduler->mblinterval, | 3106 | out_be32(&ugeth->p_scheduler->mblinterval, |
@@ -3144,7 +3132,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3144 | statisticsMode & UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_TX) { | 3132 | statisticsMode & UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_TX) { |
3145 | ugeth->tx_fw_statistics_pram_offset = | 3133 | ugeth->tx_fw_statistics_pram_offset = |
3146 | qe_muram_alloc(sizeof | 3134 | qe_muram_alloc(sizeof |
3147 | (ucc_geth_tx_firmware_statistics_pram_t), | 3135 | (struct ucc_geth_tx_firmware_statistics_pram), |
3148 | UCC_GETH_TX_STATISTICS_ALIGNMENT); | 3136 | UCC_GETH_TX_STATISTICS_ALIGNMENT); |
3149 | if (IS_MURAM_ERR(ugeth->tx_fw_statistics_pram_offset)) { | 3137 | if (IS_MURAM_ERR(ugeth->tx_fw_statistics_pram_offset)) { |
3150 | ugeth_err | 3138 | ugeth_err |
@@ -3154,11 +3142,11 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3154 | return -ENOMEM; | 3142 | return -ENOMEM; |
3155 | } | 3143 | } |
3156 | ugeth->p_tx_fw_statistics_pram = | 3144 | ugeth->p_tx_fw_statistics_pram = |
3157 | (ucc_geth_tx_firmware_statistics_pram_t *) | 3145 | (struct ucc_geth_tx_firmware_statistics_pram *) |
3158 | qe_muram_addr(ugeth->tx_fw_statistics_pram_offset); | 3146 | qe_muram_addr(ugeth->tx_fw_statistics_pram_offset); |
3159 | /* Zero out p_tx_fw_statistics_pram */ | 3147 | /* Zero out p_tx_fw_statistics_pram */ |
3160 | memset(ugeth->p_tx_fw_statistics_pram, | 3148 | memset(ugeth->p_tx_fw_statistics_pram, |
3161 | 0, sizeof(ucc_geth_tx_firmware_statistics_pram_t)); | 3149 | 0, sizeof(struct ucc_geth_tx_firmware_statistics_pram)); |
3162 | } | 3150 | } |
3163 | 3151 | ||
3164 | /* temoder */ | 3152 | /* temoder */ |
@@ -3183,7 +3171,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3183 | /* Rx global PRAM */ | 3171 | /* Rx global PRAM */ |
3184 | /* Allocate global rx parameter RAM page */ | 3172 | /* Allocate global rx parameter RAM page */ |
3185 | ugeth->rx_glbl_pram_offset = | 3173 | ugeth->rx_glbl_pram_offset = |
3186 | qe_muram_alloc(sizeof(ucc_geth_rx_global_pram_t), | 3174 | qe_muram_alloc(sizeof(struct ucc_geth_rx_global_pram), |
3187 | UCC_GETH_RX_GLOBAL_PRAM_ALIGNMENT); | 3175 | UCC_GETH_RX_GLOBAL_PRAM_ALIGNMENT); |
3188 | if (IS_MURAM_ERR(ugeth->rx_glbl_pram_offset)) { | 3176 | if (IS_MURAM_ERR(ugeth->rx_glbl_pram_offset)) { |
3189 | ugeth_err | 3177 | ugeth_err |
@@ -3193,10 +3181,10 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3193 | return -ENOMEM; | 3181 | return -ENOMEM; |
3194 | } | 3182 | } |
3195 | ugeth->p_rx_glbl_pram = | 3183 | ugeth->p_rx_glbl_pram = |
3196 | (ucc_geth_rx_global_pram_t *) qe_muram_addr(ugeth-> | 3184 | (struct ucc_geth_rx_global_pram *) qe_muram_addr(ugeth-> |
3197 | rx_glbl_pram_offset); | 3185 | rx_glbl_pram_offset); |
3198 | /* Zero out p_rx_glbl_pram */ | 3186 | /* Zero out p_rx_glbl_pram */ |
3199 | memset(ugeth->p_rx_glbl_pram, 0, sizeof(ucc_geth_rx_global_pram_t)); | 3187 | memset(ugeth->p_rx_glbl_pram, 0, sizeof(struct ucc_geth_rx_global_pram)); |
3200 | 3188 | ||
3201 | /* Fill global PRAM */ | 3189 | /* Fill global PRAM */ |
3202 | 3190 | ||
@@ -3204,7 +3192,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3204 | /* Size varies with number of Rx threads */ | 3192 | /* Size varies with number of Rx threads */ |
3205 | ugeth->thread_dat_rx_offset = | 3193 | ugeth->thread_dat_rx_offset = |
3206 | qe_muram_alloc(numThreadsRxNumerical * | 3194 | qe_muram_alloc(numThreadsRxNumerical * |
3207 | sizeof(ucc_geth_thread_data_rx_t), | 3195 | sizeof(struct ucc_geth_thread_data_rx), |
3208 | UCC_GETH_THREAD_DATA_ALIGNMENT); | 3196 | UCC_GETH_THREAD_DATA_ALIGNMENT); |
3209 | if (IS_MURAM_ERR(ugeth->thread_dat_rx_offset)) { | 3197 | if (IS_MURAM_ERR(ugeth->thread_dat_rx_offset)) { |
3210 | ugeth_err | 3198 | ugeth_err |
@@ -3215,7 +3203,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3215 | } | 3203 | } |
3216 | 3204 | ||
3217 | ugeth->p_thread_data_rx = | 3205 | ugeth->p_thread_data_rx = |
3218 | (ucc_geth_thread_data_rx_t *) qe_muram_addr(ugeth-> | 3206 | (struct ucc_geth_thread_data_rx *) qe_muram_addr(ugeth-> |
3219 | thread_dat_rx_offset); | 3207 | thread_dat_rx_offset); |
3220 | out_be32(&ugeth->p_rx_glbl_pram->rqptr, ugeth->thread_dat_rx_offset); | 3208 | out_be32(&ugeth->p_rx_glbl_pram->rqptr, ugeth->thread_dat_rx_offset); |
3221 | 3209 | ||
@@ -3227,7 +3215,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3227 | statisticsMode & UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_RX) { | 3215 | statisticsMode & UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_RX) { |
3228 | ugeth->rx_fw_statistics_pram_offset = | 3216 | ugeth->rx_fw_statistics_pram_offset = |
3229 | qe_muram_alloc(sizeof | 3217 | qe_muram_alloc(sizeof |
3230 | (ucc_geth_rx_firmware_statistics_pram_t), | 3218 | (struct ucc_geth_rx_firmware_statistics_pram), |
3231 | UCC_GETH_RX_STATISTICS_ALIGNMENT); | 3219 | UCC_GETH_RX_STATISTICS_ALIGNMENT); |
3232 | if (IS_MURAM_ERR(ugeth->rx_fw_statistics_pram_offset)) { | 3220 | if (IS_MURAM_ERR(ugeth->rx_fw_statistics_pram_offset)) { |
3233 | ugeth_err | 3221 | ugeth_err |
@@ -3237,11 +3225,11 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3237 | return -ENOMEM; | 3225 | return -ENOMEM; |
3238 | } | 3226 | } |
3239 | ugeth->p_rx_fw_statistics_pram = | 3227 | ugeth->p_rx_fw_statistics_pram = |
3240 | (ucc_geth_rx_firmware_statistics_pram_t *) | 3228 | (struct ucc_geth_rx_firmware_statistics_pram *) |
3241 | qe_muram_addr(ugeth->rx_fw_statistics_pram_offset); | 3229 | qe_muram_addr(ugeth->rx_fw_statistics_pram_offset); |
3242 | /* Zero out p_rx_fw_statistics_pram */ | 3230 | /* Zero out p_rx_fw_statistics_pram */ |
3243 | memset(ugeth->p_rx_fw_statistics_pram, 0, | 3231 | memset(ugeth->p_rx_fw_statistics_pram, 0, |
3244 | sizeof(ucc_geth_rx_firmware_statistics_pram_t)); | 3232 | sizeof(struct ucc_geth_rx_firmware_statistics_pram)); |
3245 | } | 3233 | } |
3246 | 3234 | ||
3247 | /* intCoalescingPtr */ | 3235 | /* intCoalescingPtr */ |
@@ -3249,7 +3237,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3249 | /* Size varies with number of Rx queues */ | 3237 | /* Size varies with number of Rx queues */ |
3250 | ugeth->rx_irq_coalescing_tbl_offset = | 3238 | ugeth->rx_irq_coalescing_tbl_offset = |
3251 | qe_muram_alloc(ug_info->numQueuesRx * | 3239 | qe_muram_alloc(ug_info->numQueuesRx * |
3252 | sizeof(ucc_geth_rx_interrupt_coalescing_entry_t), | 3240 | sizeof(struct ucc_geth_rx_interrupt_coalescing_entry), |
3253 | UCC_GETH_RX_INTERRUPT_COALESCING_ALIGNMENT); | 3241 | UCC_GETH_RX_INTERRUPT_COALESCING_ALIGNMENT); |
3254 | if (IS_MURAM_ERR(ugeth->rx_irq_coalescing_tbl_offset)) { | 3242 | if (IS_MURAM_ERR(ugeth->rx_irq_coalescing_tbl_offset)) { |
3255 | ugeth_err | 3243 | ugeth_err |
@@ -3260,7 +3248,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3260 | } | 3248 | } |
3261 | 3249 | ||
3262 | ugeth->p_rx_irq_coalescing_tbl = | 3250 | ugeth->p_rx_irq_coalescing_tbl = |
3263 | (ucc_geth_rx_interrupt_coalescing_table_t *) | 3251 | (struct ucc_geth_rx_interrupt_coalescing_table *) |
3264 | qe_muram_addr(ugeth->rx_irq_coalescing_tbl_offset); | 3252 | qe_muram_addr(ugeth->rx_irq_coalescing_tbl_offset); |
3265 | out_be32(&ugeth->p_rx_glbl_pram->intcoalescingptr, | 3253 | out_be32(&ugeth->p_rx_glbl_pram->intcoalescingptr, |
3266 | ugeth->rx_irq_coalescing_tbl_offset); | 3254 | ugeth->rx_irq_coalescing_tbl_offset); |
@@ -3300,7 +3288,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3300 | l3qt = 0; | 3288 | l3qt = 0; |
3301 | for (i = 0; i < 8; i++) | 3289 | for (i = 0; i < 8; i++) |
3302 | l3qt |= (ug_info->l3qt[j + i] << (28 - 4 * i)); | 3290 | l3qt |= (ug_info->l3qt[j + i] << (28 - 4 * i)); |
3303 | out_be32(&ugeth->p_rx_glbl_pram->l3qt[j], l3qt); | 3291 | out_be32(&ugeth->p_rx_glbl_pram->l3qt[j/8], l3qt); |
3304 | } | 3292 | } |
3305 | 3293 | ||
3306 | /* vlantype */ | 3294 | /* vlantype */ |
@@ -3316,8 +3304,8 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3316 | /* Size varies with number of Rx queues */ | 3304 | /* Size varies with number of Rx queues */ |
3317 | ugeth->rx_bd_qs_tbl_offset = | 3305 | ugeth->rx_bd_qs_tbl_offset = |
3318 | qe_muram_alloc(ug_info->numQueuesRx * | 3306 | qe_muram_alloc(ug_info->numQueuesRx * |
3319 | (sizeof(ucc_geth_rx_bd_queues_entry_t) + | 3307 | (sizeof(struct ucc_geth_rx_bd_queues_entry) + |
3320 | sizeof(ucc_geth_rx_prefetched_bds_t)), | 3308 | sizeof(struct ucc_geth_rx_prefetched_bds)), |
3321 | UCC_GETH_RX_BD_QUEUES_ALIGNMENT); | 3309 | UCC_GETH_RX_BD_QUEUES_ALIGNMENT); |
3322 | if (IS_MURAM_ERR(ugeth->rx_bd_qs_tbl_offset)) { | 3310 | if (IS_MURAM_ERR(ugeth->rx_bd_qs_tbl_offset)) { |
3323 | ugeth_err | 3311 | ugeth_err |
@@ -3328,14 +3316,14 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3328 | } | 3316 | } |
3329 | 3317 | ||
3330 | ugeth->p_rx_bd_qs_tbl = | 3318 | ugeth->p_rx_bd_qs_tbl = |
3331 | (ucc_geth_rx_bd_queues_entry_t *) qe_muram_addr(ugeth-> | 3319 | (struct ucc_geth_rx_bd_queues_entry *) qe_muram_addr(ugeth-> |
3332 | rx_bd_qs_tbl_offset); | 3320 | rx_bd_qs_tbl_offset); |
3333 | out_be32(&ugeth->p_rx_glbl_pram->rbdqptr, ugeth->rx_bd_qs_tbl_offset); | 3321 | out_be32(&ugeth->p_rx_glbl_pram->rbdqptr, ugeth->rx_bd_qs_tbl_offset); |
3334 | /* Zero out p_rx_bd_qs_tbl */ | 3322 | /* Zero out p_rx_bd_qs_tbl */ |
3335 | memset(ugeth->p_rx_bd_qs_tbl, | 3323 | memset(ugeth->p_rx_bd_qs_tbl, |
3336 | 0, | 3324 | 0, |
3337 | ug_info->numQueuesRx * (sizeof(ucc_geth_rx_bd_queues_entry_t) + | 3325 | ug_info->numQueuesRx * (sizeof(struct ucc_geth_rx_bd_queues_entry) + |
3338 | sizeof(ucc_geth_rx_prefetched_bds_t))); | 3326 | sizeof(struct ucc_geth_rx_prefetched_bds))); |
3339 | 3327 | ||
3340 | /* Setup the table */ | 3328 | /* Setup the table */ |
3341 | /* Assume BD rings are already established */ | 3329 | /* Assume BD rings are already established */ |
@@ -3406,7 +3394,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3406 | /* Allocate memory for extended filtering Mode Global | 3394 | /* Allocate memory for extended filtering Mode Global |
3407 | Parameters */ | 3395 | Parameters */ |
3408 | ugeth->exf_glbl_param_offset = | 3396 | ugeth->exf_glbl_param_offset = |
3409 | qe_muram_alloc(sizeof(ucc_geth_exf_global_pram_t), | 3397 | qe_muram_alloc(sizeof(struct ucc_geth_exf_global_pram), |
3410 | UCC_GETH_RX_EXTENDED_FILTERING_GLOBAL_PARAMETERS_ALIGNMENT); | 3398 | UCC_GETH_RX_EXTENDED_FILTERING_GLOBAL_PARAMETERS_ALIGNMENT); |
3411 | if (IS_MURAM_ERR(ugeth->exf_glbl_param_offset)) { | 3399 | if (IS_MURAM_ERR(ugeth->exf_glbl_param_offset)) { |
3412 | ugeth_err | 3400 | ugeth_err |
@@ -3417,7 +3405,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3417 | } | 3405 | } |
3418 | 3406 | ||
3419 | ugeth->p_exf_glbl_param = | 3407 | ugeth->p_exf_glbl_param = |
3420 | (ucc_geth_exf_global_pram_t *) qe_muram_addr(ugeth-> | 3408 | (struct ucc_geth_exf_global_pram *) qe_muram_addr(ugeth-> |
3421 | exf_glbl_param_offset); | 3409 | exf_glbl_param_offset); |
3422 | out_be32(&ugeth->p_rx_glbl_pram->exfGlobalParam, | 3410 | out_be32(&ugeth->p_rx_glbl_pram->exfGlobalParam, |
3423 | ugeth->exf_glbl_param_offset); | 3411 | ugeth->exf_glbl_param_offset); |
@@ -3439,7 +3427,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3439 | INIT_LIST_HEAD(&ugeth->ind_hash_q); | 3427 | INIT_LIST_HEAD(&ugeth->ind_hash_q); |
3440 | } | 3428 | } |
3441 | p_82xx_addr_filt = | 3429 | p_82xx_addr_filt = |
3442 | (ucc_geth_82xx_address_filtering_pram_t *) ugeth-> | 3430 | (struct ucc_geth_82xx_address_filtering_pram *) ugeth-> |
3443 | p_rx_glbl_pram->addressfiltering; | 3431 | p_rx_glbl_pram->addressfiltering; |
3444 | 3432 | ||
3445 | ugeth_82xx_filtering_clear_all_addr_in_hash(ugeth, | 3433 | ugeth_82xx_filtering_clear_all_addr_in_hash(ugeth, |
@@ -3462,7 +3450,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3462 | * allocated resources can be released when the channel is freed. | 3450 | * allocated resources can be released when the channel is freed. |
3463 | */ | 3451 | */ |
3464 | if (!(ugeth->p_init_enet_param_shadow = | 3452 | if (!(ugeth->p_init_enet_param_shadow = |
3465 | (ucc_geth_init_pram_t *) kmalloc(sizeof(ucc_geth_init_pram_t), | 3453 | (struct ucc_geth_init_pram *) kmalloc(sizeof(struct ucc_geth_init_pram), |
3466 | GFP_KERNEL))) { | 3454 | GFP_KERNEL))) { |
3467 | ugeth_err | 3455 | ugeth_err |
3468 | ("%s: Can not allocate memory for" | 3456 | ("%s: Can not allocate memory for" |
@@ -3472,7 +3460,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3472 | } | 3460 | } |
3473 | /* Zero out *p_init_enet_param_shadow */ | 3461 | /* Zero out *p_init_enet_param_shadow */ |
3474 | memset((char *)ugeth->p_init_enet_param_shadow, | 3462 | memset((char *)ugeth->p_init_enet_param_shadow, |
3475 | 0, sizeof(ucc_geth_init_pram_t)); | 3463 | 0, sizeof(struct ucc_geth_init_pram)); |
3476 | 3464 | ||
3477 | /* Fill shadow InitEnet command parameter structure */ | 3465 | /* Fill shadow InitEnet command parameter structure */ |
3478 | 3466 | ||
@@ -3506,7 +3494,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3506 | } | 3494 | } |
3507 | ugeth->p_init_enet_param_shadow->largestexternallookupkeysize = | 3495 | ugeth->p_init_enet_param_shadow->largestexternallookupkeysize = |
3508 | ug_info->largestexternallookupkeysize; | 3496 | ug_info->largestexternallookupkeysize; |
3509 | size = sizeof(ucc_geth_thread_rx_pram_t); | 3497 | size = sizeof(struct ucc_geth_thread_rx_pram); |
3510 | if (ug_info->rxExtendedFiltering) { | 3498 | if (ug_info->rxExtendedFiltering) { |
3511 | size += THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING; | 3499 | size += THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING; |
3512 | if (ug_info->largestexternallookupkeysize == | 3500 | if (ug_info->largestexternallookupkeysize == |
@@ -3537,7 +3525,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3537 | fill_init_enet_entries(ugeth, | 3525 | fill_init_enet_entries(ugeth, |
3538 | &(ugeth->p_init_enet_param_shadow-> | 3526 | &(ugeth->p_init_enet_param_shadow-> |
3539 | txthread[0]), numThreadsTxNumerical, | 3527 | txthread[0]), numThreadsTxNumerical, |
3540 | sizeof(ucc_geth_thread_tx_pram_t), | 3528 | sizeof(struct ucc_geth_thread_tx_pram), |
3541 | UCC_GETH_THREAD_TX_PRAM_ALIGNMENT, | 3529 | UCC_GETH_THREAD_TX_PRAM_ALIGNMENT, |
3542 | ug_info->riscTx, 0)) != 0) { | 3530 | ug_info->riscTx, 0)) != 0) { |
3543 | ugeth_err("%s: Can not fill p_init_enet_param_shadow.", | 3531 | ugeth_err("%s: Can not fill p_init_enet_param_shadow.", |
@@ -3557,7 +3545,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3557 | } | 3545 | } |
3558 | 3546 | ||
3559 | /* Allocate InitEnet command parameter structure */ | 3547 | /* Allocate InitEnet command parameter structure */ |
3560 | init_enet_pram_offset = qe_muram_alloc(sizeof(ucc_geth_init_pram_t), 4); | 3548 | init_enet_pram_offset = qe_muram_alloc(sizeof(struct ucc_geth_init_pram), 4); |
3561 | if (IS_MURAM_ERR(init_enet_pram_offset)) { | 3549 | if (IS_MURAM_ERR(init_enet_pram_offset)) { |
3562 | ugeth_err | 3550 | ugeth_err |
3563 | ("%s: Can not allocate DPRAM memory for p_init_enet_pram.", | 3551 | ("%s: Can not allocate DPRAM memory for p_init_enet_pram.", |
@@ -3566,7 +3554,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3566 | return -ENOMEM; | 3554 | return -ENOMEM; |
3567 | } | 3555 | } |
3568 | p_init_enet_pram = | 3556 | p_init_enet_pram = |
3569 | (ucc_geth_init_pram_t *) qe_muram_addr(init_enet_pram_offset); | 3557 | (struct ucc_geth_init_pram *) qe_muram_addr(init_enet_pram_offset); |
3570 | 3558 | ||
3571 | /* Copy shadow InitEnet command parameter structure into PRAM */ | 3559 | /* Copy shadow InitEnet command parameter structure into PRAM */ |
3572 | p_init_enet_pram->resinit1 = ugeth->p_init_enet_param_shadow->resinit1; | 3560 | p_init_enet_pram->resinit1 = ugeth->p_init_enet_param_shadow->resinit1; |
@@ -3591,7 +3579,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3591 | /* Issue QE command */ | 3579 | /* Issue QE command */ |
3592 | cecr_subblock = | 3580 | cecr_subblock = |
3593 | ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num); | 3581 | ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num); |
3594 | qe_issue_cmd(command, cecr_subblock, (u8) QE_CR_PROTOCOL_ETHERNET, | 3582 | qe_issue_cmd(command, cecr_subblock, QE_CR_PROTOCOL_ETHERNET, |
3595 | init_enet_pram_offset); | 3583 | init_enet_pram_offset); |
3596 | 3584 | ||
3597 | /* Free InitEnet command parameter */ | 3585 | /* Free InitEnet command parameter */ |
@@ -3603,7 +3591,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth) | |||
3603 | /* returns a net_device_stats structure pointer */ | 3591 | /* returns a net_device_stats structure pointer */ |
3604 | static struct net_device_stats *ucc_geth_get_stats(struct net_device *dev) | 3592 | static struct net_device_stats *ucc_geth_get_stats(struct net_device *dev) |
3605 | { | 3593 | { |
3606 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 3594 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
3607 | 3595 | ||
3608 | return &(ugeth->stats); | 3596 | return &(ugeth->stats); |
3609 | } | 3597 | } |
@@ -3614,7 +3602,7 @@ static struct net_device_stats *ucc_geth_get_stats(struct net_device *dev) | |||
3614 | * starting over will fix the problem. */ | 3602 | * starting over will fix the problem. */ |
3615 | static void ucc_geth_timeout(struct net_device *dev) | 3603 | static void ucc_geth_timeout(struct net_device *dev) |
3616 | { | 3604 | { |
3617 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 3605 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
3618 | 3606 | ||
3619 | ugeth_vdbg("%s: IN", __FUNCTION__); | 3607 | ugeth_vdbg("%s: IN", __FUNCTION__); |
3620 | 3608 | ||
@@ -3634,7 +3622,7 @@ static void ucc_geth_timeout(struct net_device *dev) | |||
3634 | /* It is pointed to by the dev->hard_start_xmit function pointer */ | 3622 | /* It is pointed to by the dev->hard_start_xmit function pointer */ |
3635 | static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev) | 3623 | static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev) |
3636 | { | 3624 | { |
3637 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 3625 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
3638 | u8 *bd; /* BD pointer */ | 3626 | u8 *bd; /* BD pointer */ |
3639 | u32 bd_status; | 3627 | u32 bd_status; |
3640 | u8 txQ = 0; | 3628 | u8 txQ = 0; |
@@ -3647,7 +3635,7 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3647 | 3635 | ||
3648 | /* Start from the next BD that should be filled */ | 3636 | /* Start from the next BD that should be filled */ |
3649 | bd = ugeth->txBd[txQ]; | 3637 | bd = ugeth->txBd[txQ]; |
3650 | bd_status = BD_STATUS_AND_LENGTH(bd); | 3638 | bd_status = in_be32((u32 *)bd); |
3651 | /* Save the skb pointer so we can free it later */ | 3639 | /* Save the skb pointer so we can free it later */ |
3652 | ugeth->tx_skbuff[txQ][ugeth->skb_curtx[txQ]] = skb; | 3640 | ugeth->tx_skbuff[txQ][ugeth->skb_curtx[txQ]] = skb; |
3653 | 3641 | ||
@@ -3657,20 +3645,21 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3657 | 1) & TX_RING_MOD_MASK(ugeth->ug_info->bdRingLenTx[txQ]); | 3645 | 1) & TX_RING_MOD_MASK(ugeth->ug_info->bdRingLenTx[txQ]); |
3658 | 3646 | ||
3659 | /* set up the buffer descriptor */ | 3647 | /* set up the buffer descriptor */ |
3660 | BD_BUFFER_SET(bd, | 3648 | out_be32(&((struct qe_bd *)bd)->buf, |
3661 | dma_map_single(NULL, skb->data, skb->len, DMA_TO_DEVICE)); | 3649 | dma_map_single(NULL, skb->data, skb->len, DMA_TO_DEVICE)); |
3662 | 3650 | ||
3663 | //printk(KERN_DEBUG"skb->data is 0x%x\n",skb->data); | 3651 | /* printk(KERN_DEBUG"skb->data is 0x%x\n",skb->data); */ |
3664 | 3652 | ||
3665 | bd_status = (bd_status & T_W) | T_R | T_I | T_L | skb->len; | 3653 | bd_status = (bd_status & T_W) | T_R | T_I | T_L | skb->len; |
3666 | 3654 | ||
3667 | BD_STATUS_AND_LENGTH_SET(bd, bd_status); | 3655 | /* set bd status and length */ |
3656 | out_be32((u32 *)bd, bd_status); | ||
3668 | 3657 | ||
3669 | dev->trans_start = jiffies; | 3658 | dev->trans_start = jiffies; |
3670 | 3659 | ||
3671 | /* Move to next BD in the ring */ | 3660 | /* Move to next BD in the ring */ |
3672 | if (!(bd_status & T_W)) | 3661 | if (!(bd_status & T_W)) |
3673 | ugeth->txBd[txQ] = bd + UCC_GETH_SIZE_OF_BD; | 3662 | ugeth->txBd[txQ] = bd + sizeof(struct qe_bd); |
3674 | else | 3663 | else |
3675 | ugeth->txBd[txQ] = ugeth->p_tx_bd_ring[txQ]; | 3664 | ugeth->txBd[txQ] = ugeth->p_tx_bd_ring[txQ]; |
3676 | 3665 | ||
@@ -3695,7 +3684,7 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3695 | return 0; | 3684 | return 0; |
3696 | } | 3685 | } |
3697 | 3686 | ||
3698 | static int ucc_geth_rx(ucc_geth_private_t *ugeth, u8 rxQ, int rx_work_limit) | 3687 | static int ucc_geth_rx(struct ucc_geth_private *ugeth, u8 rxQ, int rx_work_limit) |
3699 | { | 3688 | { |
3700 | struct sk_buff *skb; | 3689 | struct sk_buff *skb; |
3701 | u8 *bd; | 3690 | u8 *bd; |
@@ -3709,11 +3698,11 @@ static int ucc_geth_rx(ucc_geth_private_t *ugeth, u8 rxQ, int rx_work_limit) | |||
3709 | /* collect received buffers */ | 3698 | /* collect received buffers */ |
3710 | bd = ugeth->rxBd[rxQ]; | 3699 | bd = ugeth->rxBd[rxQ]; |
3711 | 3700 | ||
3712 | bd_status = BD_STATUS_AND_LENGTH(bd); | 3701 | bd_status = in_be32((u32 *)bd); |
3713 | 3702 | ||
3714 | /* while there are received buffers and BD is full (~R_E) */ | 3703 | /* while there are received buffers and BD is full (~R_E) */ |
3715 | while (!((bd_status & (R_E)) || (--rx_work_limit < 0))) { | 3704 | while (!((bd_status & (R_E)) || (--rx_work_limit < 0))) { |
3716 | bdBuffer = (u8 *) BD_BUFFER(bd); | 3705 | bdBuffer = (u8 *) in_be32(&((struct qe_bd *)bd)->buf); |
3717 | length = (u16) ((bd_status & BD_LENGTH_MASK) - 4); | 3706 | length = (u16) ((bd_status & BD_LENGTH_MASK) - 4); |
3718 | skb = ugeth->rx_skbuff[rxQ][ugeth->skb_currx[rxQ]]; | 3707 | skb = ugeth->rx_skbuff[rxQ][ugeth->skb_currx[rxQ]]; |
3719 | 3708 | ||
@@ -3768,9 +3757,9 @@ static int ucc_geth_rx(ucc_geth_private_t *ugeth, u8 rxQ, int rx_work_limit) | |||
3768 | if (bd_status & R_W) | 3757 | if (bd_status & R_W) |
3769 | bd = ugeth->p_rx_bd_ring[rxQ]; | 3758 | bd = ugeth->p_rx_bd_ring[rxQ]; |
3770 | else | 3759 | else |
3771 | bd += UCC_GETH_SIZE_OF_BD; | 3760 | bd += sizeof(struct qe_bd); |
3772 | 3761 | ||
3773 | bd_status = BD_STATUS_AND_LENGTH(bd); | 3762 | bd_status = in_be32((u32 *)bd); |
3774 | } | 3763 | } |
3775 | 3764 | ||
3776 | ugeth->rxBd[rxQ] = bd; | 3765 | ugeth->rxBd[rxQ] = bd; |
@@ -3781,12 +3770,12 @@ static int ucc_geth_rx(ucc_geth_private_t *ugeth, u8 rxQ, int rx_work_limit) | |||
3781 | static int ucc_geth_tx(struct net_device *dev, u8 txQ) | 3770 | static int ucc_geth_tx(struct net_device *dev, u8 txQ) |
3782 | { | 3771 | { |
3783 | /* Start from the next BD that should be filled */ | 3772 | /* Start from the next BD that should be filled */ |
3784 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 3773 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
3785 | u8 *bd; /* BD pointer */ | 3774 | u8 *bd; /* BD pointer */ |
3786 | u32 bd_status; | 3775 | u32 bd_status; |
3787 | 3776 | ||
3788 | bd = ugeth->confBd[txQ]; | 3777 | bd = ugeth->confBd[txQ]; |
3789 | bd_status = BD_STATUS_AND_LENGTH(bd); | 3778 | bd_status = in_be32((u32 *)bd); |
3790 | 3779 | ||
3791 | /* Normal processing. */ | 3780 | /* Normal processing. */ |
3792 | while ((bd_status & T_R) == 0) { | 3781 | while ((bd_status & T_R) == 0) { |
@@ -3813,7 +3802,7 @@ static int ucc_geth_tx(struct net_device *dev, u8 txQ) | |||
3813 | 3802 | ||
3814 | /* Advance the confirmation BD pointer */ | 3803 | /* Advance the confirmation BD pointer */ |
3815 | if (!(bd_status & T_W)) | 3804 | if (!(bd_status & T_W)) |
3816 | ugeth->confBd[txQ] += UCC_GETH_SIZE_OF_BD; | 3805 | ugeth->confBd[txQ] += sizeof(struct qe_bd); |
3817 | else | 3806 | else |
3818 | ugeth->confBd[txQ] = ugeth->p_tx_bd_ring[txQ]; | 3807 | ugeth->confBd[txQ] = ugeth->p_tx_bd_ring[txQ]; |
3819 | } | 3808 | } |
@@ -3823,7 +3812,7 @@ static int ucc_geth_tx(struct net_device *dev, u8 txQ) | |||
3823 | #ifdef CONFIG_UGETH_NAPI | 3812 | #ifdef CONFIG_UGETH_NAPI |
3824 | static int ucc_geth_poll(struct net_device *dev, int *budget) | 3813 | static int ucc_geth_poll(struct net_device *dev, int *budget) |
3825 | { | 3814 | { |
3826 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 3815 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
3827 | int howmany; | 3816 | int howmany; |
3828 | int rx_work_limit = *budget; | 3817 | int rx_work_limit = *budget; |
3829 | u8 rxQ = 0; | 3818 | u8 rxQ = 0; |
@@ -3847,9 +3836,9 @@ static int ucc_geth_poll(struct net_device *dev, int *budget) | |||
3847 | static irqreturn_t ucc_geth_irq_handler(int irq, void *info) | 3836 | static irqreturn_t ucc_geth_irq_handler(int irq, void *info) |
3848 | { | 3837 | { |
3849 | struct net_device *dev = (struct net_device *)info; | 3838 | struct net_device *dev = (struct net_device *)info; |
3850 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 3839 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
3851 | ucc_fast_private_t *uccf; | 3840 | struct ucc_fast_private *uccf; |
3852 | ucc_geth_info_t *ug_info; | 3841 | struct ucc_geth_info *ug_info; |
3853 | register u32 ucce = 0; | 3842 | register u32 ucce = 0; |
3854 | register u32 bit_mask = UCCE_RXBF_SINGLE_MASK; | 3843 | register u32 bit_mask = UCCE_RXBF_SINGLE_MASK; |
3855 | register u32 tx_mask = UCCE_TXBF_SINGLE_MASK; | 3844 | register u32 tx_mask = UCCE_TXBF_SINGLE_MASK; |
@@ -3912,7 +3901,7 @@ static irqreturn_t ucc_geth_irq_handler(int irq, void *info) | |||
3912 | static irqreturn_t phy_interrupt(int irq, void *dev_id) | 3901 | static irqreturn_t phy_interrupt(int irq, void *dev_id) |
3913 | { | 3902 | { |
3914 | struct net_device *dev = (struct net_device *)dev_id; | 3903 | struct net_device *dev = (struct net_device *)dev_id; |
3915 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 3904 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
3916 | 3905 | ||
3917 | ugeth_vdbg("%s: IN", __FUNCTION__); | 3906 | ugeth_vdbg("%s: IN", __FUNCTION__); |
3918 | 3907 | ||
@@ -3932,8 +3921,8 @@ static irqreturn_t phy_interrupt(int irq, void *dev_id) | |||
3932 | static void ugeth_phy_change(void *data) | 3921 | static void ugeth_phy_change(void *data) |
3933 | { | 3922 | { |
3934 | struct net_device *dev = (struct net_device *)data; | 3923 | struct net_device *dev = (struct net_device *)data; |
3935 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 3924 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
3936 | ucc_geth_t *ug_regs; | 3925 | struct ucc_geth *ug_regs; |
3937 | int result = 0; | 3926 | int result = 0; |
3938 | 3927 | ||
3939 | ugeth_vdbg("%s: IN", __FUNCTION__); | 3928 | ugeth_vdbg("%s: IN", __FUNCTION__); |
@@ -3963,7 +3952,7 @@ static void ugeth_phy_change(void *data) | |||
3963 | static void ugeth_phy_timer(unsigned long data) | 3952 | static void ugeth_phy_timer(unsigned long data) |
3964 | { | 3953 | { |
3965 | struct net_device *dev = (struct net_device *)data; | 3954 | struct net_device *dev = (struct net_device *)data; |
3966 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 3955 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
3967 | 3956 | ||
3968 | schedule_work(&ugeth->tq); | 3957 | schedule_work(&ugeth->tq); |
3969 | 3958 | ||
@@ -3979,7 +3968,7 @@ static void ugeth_phy_timer(unsigned long data) | |||
3979 | static void ugeth_phy_startup_timer(unsigned long data) | 3968 | static void ugeth_phy_startup_timer(unsigned long data) |
3980 | { | 3969 | { |
3981 | struct ugeth_mii_info *mii_info = (struct ugeth_mii_info *)data; | 3970 | struct ugeth_mii_info *mii_info = (struct ugeth_mii_info *)data; |
3982 | ucc_geth_private_t *ugeth = netdev_priv(mii_info->dev); | 3971 | struct ucc_geth_private *ugeth = netdev_priv(mii_info->dev); |
3983 | static int secondary = UGETH_AN_TIMEOUT; | 3972 | static int secondary = UGETH_AN_TIMEOUT; |
3984 | int result; | 3973 | int result; |
3985 | 3974 | ||
@@ -4034,7 +4023,7 @@ static void ugeth_phy_startup_timer(unsigned long data) | |||
4034 | /* Returns 0 for success. */ | 4023 | /* Returns 0 for success. */ |
4035 | static int ucc_geth_open(struct net_device *dev) | 4024 | static int ucc_geth_open(struct net_device *dev) |
4036 | { | 4025 | { |
4037 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 4026 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
4038 | int err; | 4027 | int err; |
4039 | 4028 | ||
4040 | ugeth_vdbg("%s: IN", __FUNCTION__); | 4029 | ugeth_vdbg("%s: IN", __FUNCTION__); |
@@ -4111,7 +4100,7 @@ static int ucc_geth_open(struct net_device *dev) | |||
4111 | /* Stops the kernel queue, and halts the controller */ | 4100 | /* Stops the kernel queue, and halts the controller */ |
4112 | static int ucc_geth_close(struct net_device *dev) | 4101 | static int ucc_geth_close(struct net_device *dev) |
4113 | { | 4102 | { |
4114 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 4103 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
4115 | 4104 | ||
4116 | ugeth_vdbg("%s: IN", __FUNCTION__); | 4105 | ugeth_vdbg("%s: IN", __FUNCTION__); |
4117 | 4106 | ||
@@ -4130,30 +4119,53 @@ static int ucc_geth_close(struct net_device *dev) | |||
4130 | 4119 | ||
4131 | const struct ethtool_ops ucc_geth_ethtool_ops = { }; | 4120 | const struct ethtool_ops ucc_geth_ethtool_ops = { }; |
4132 | 4121 | ||
4133 | static int ucc_geth_probe(struct device *device) | 4122 | static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *match) |
4134 | { | 4123 | { |
4135 | struct platform_device *pdev = to_platform_device(device); | 4124 | struct device *device = &ofdev->dev; |
4136 | struct ucc_geth_platform_data *ugeth_pdata; | 4125 | struct device_node *np = ofdev->node; |
4137 | struct net_device *dev = NULL; | 4126 | struct net_device *dev = NULL; |
4138 | struct ucc_geth_private *ugeth = NULL; | 4127 | struct ucc_geth_private *ugeth = NULL; |
4139 | struct ucc_geth_info *ug_info; | 4128 | struct ucc_geth_info *ug_info; |
4140 | int err; | 4129 | struct resource res; |
4130 | struct device_node *phy; | ||
4131 | int err, ucc_num, phy_interface; | ||
4141 | static int mii_mng_configured = 0; | 4132 | static int mii_mng_configured = 0; |
4133 | const phandle *ph; | ||
4134 | const unsigned int *prop; | ||
4142 | 4135 | ||
4143 | ugeth_vdbg("%s: IN", __FUNCTION__); | 4136 | ugeth_vdbg("%s: IN", __FUNCTION__); |
4144 | 4137 | ||
4145 | ugeth_pdata = (struct ucc_geth_platform_data *)pdev->dev.platform_data; | 4138 | prop = get_property(np, "device-id", NULL); |
4139 | ucc_num = *prop - 1; | ||
4140 | if ((ucc_num < 0) || (ucc_num > 7)) | ||
4141 | return -ENODEV; | ||
4142 | |||
4143 | ug_info = &ugeth_info[ucc_num]; | ||
4144 | ug_info->uf_info.ucc_num = ucc_num; | ||
4145 | prop = get_property(np, "rx-clock", NULL); | ||
4146 | ug_info->uf_info.rx_clock = *prop; | ||
4147 | prop = get_property(np, "tx-clock", NULL); | ||
4148 | ug_info->uf_info.tx_clock = *prop; | ||
4149 | err = of_address_to_resource(np, 0, &res); | ||
4150 | if (err) | ||
4151 | return -EINVAL; | ||
4152 | |||
4153 | ug_info->uf_info.regs = res.start; | ||
4154 | ug_info->uf_info.irq = irq_of_parse_and_map(np, 0); | ||
4155 | |||
4156 | ph = get_property(np, "phy-handle", NULL); | ||
4157 | phy = of_find_node_by_phandle(*ph); | ||
4146 | 4158 | ||
4147 | ug_info = &ugeth_info[pdev->id]; | 4159 | if (phy == NULL) |
4148 | ug_info->uf_info.ucc_num = pdev->id; | 4160 | return -ENODEV; |
4149 | ug_info->uf_info.rx_clock = ugeth_pdata->rx_clock; | 4161 | |
4150 | ug_info->uf_info.tx_clock = ugeth_pdata->tx_clock; | 4162 | prop = get_property(phy, "reg", NULL); |
4151 | ug_info->uf_info.regs = ugeth_pdata->phy_reg_addr; | 4163 | ug_info->phy_address = *prop; |
4152 | ug_info->uf_info.irq = platform_get_irq(pdev, 0); | 4164 | prop = get_property(phy, "interface", NULL); |
4153 | ug_info->phy_address = ugeth_pdata->phy_id; | 4165 | ug_info->enet_interface = *prop; |
4154 | ug_info->enet_interface = ugeth_pdata->phy_interface; | 4166 | ug_info->phy_interrupt = irq_of_parse_and_map(phy, 0); |
4155 | ug_info->board_flags = ugeth_pdata->board_flags; | 4167 | ug_info->board_flags = (ug_info->phy_interrupt == NO_IRQ)? |
4156 | ug_info->phy_interrupt = ugeth_pdata->phy_interrupt; | 4168 | 0:FSL_UGETH_BRD_HAS_PHY_INTR; |
4157 | 4169 | ||
4158 | printk(KERN_INFO "ucc_geth: UCC%1d at 0x%8x (irq = %d) \n", | 4170 | printk(KERN_INFO "ucc_geth: UCC%1d at 0x%8x (irq = %d) \n", |
4159 | ug_info->uf_info.ucc_num + 1, ug_info->uf_info.regs, | 4171 | ug_info->uf_info.ucc_num + 1, ug_info->uf_info.regs, |
@@ -4161,12 +4173,44 @@ static int ucc_geth_probe(struct device *device) | |||
4161 | 4173 | ||
4162 | if (ug_info == NULL) { | 4174 | if (ug_info == NULL) { |
4163 | ugeth_err("%s: [%d] Missing additional data!", __FUNCTION__, | 4175 | ugeth_err("%s: [%d] Missing additional data!", __FUNCTION__, |
4164 | pdev->id); | 4176 | ucc_num); |
4165 | return -ENODEV; | 4177 | return -ENODEV; |
4166 | } | 4178 | } |
4167 | 4179 | ||
4180 | /* FIXME: Work around for early chip rev. */ | ||
4181 | /* There's a bug in initial chip rev(s) in the RGMII ac */ | ||
4182 | /* timing. */ | ||
4183 | /* The following compensates by writing to the reserved */ | ||
4184 | /* QE Port Output Hold Registers (CPOH1?). */ | ||
4185 | prop = get_property(phy, "interface", NULL); | ||
4186 | phy_interface = *prop; | ||
4187 | if ((phy_interface == ENET_1000_RGMII) || | ||
4188 | (phy_interface == ENET_100_RGMII) || | ||
4189 | (phy_interface == ENET_10_RGMII)) { | ||
4190 | struct device_node *soc; | ||
4191 | phys_addr_t immrbase = -1; | ||
4192 | u32 *tmp_reg; | ||
4193 | u32 tmp_val; | ||
4194 | |||
4195 | soc = of_find_node_by_type(NULL, "soc"); | ||
4196 | if (soc) { | ||
4197 | unsigned int size; | ||
4198 | const void *prop = get_property(soc, "reg", &size); | ||
4199 | immrbase = of_translate_address(soc, prop); | ||
4200 | of_node_put(soc); | ||
4201 | }; | ||
4202 | |||
4203 | tmp_reg = (u32 *) ioremap(immrbase + 0x14A8, 0x4); | ||
4204 | tmp_val = in_be32(tmp_reg); | ||
4205 | if (ucc_num == 1) | ||
4206 | out_be32(tmp_reg, tmp_val | 0x00003000); | ||
4207 | else if (ucc_num == 2) | ||
4208 | out_be32(tmp_reg, tmp_val | 0x0c000000); | ||
4209 | iounmap(tmp_reg); | ||
4210 | } | ||
4211 | |||
4168 | if (!mii_mng_configured) { | 4212 | if (!mii_mng_configured) { |
4169 | ucc_set_qe_mux_mii_mng(ug_info->uf_info.ucc_num); | 4213 | ucc_set_qe_mux_mii_mng(ucc_num); |
4170 | mii_mng_configured = 1; | 4214 | mii_mng_configured = 1; |
4171 | } | 4215 | } |
4172 | 4216 | ||
@@ -4213,13 +4257,14 @@ static int ucc_geth_probe(struct device *device) | |||
4213 | 4257 | ||
4214 | ugeth->ug_info = ug_info; | 4258 | ugeth->ug_info = ug_info; |
4215 | ugeth->dev = dev; | 4259 | ugeth->dev = dev; |
4216 | memcpy(dev->dev_addr, ugeth_pdata->mac_addr, 6); | 4260 | memcpy(dev->dev_addr, get_property(np, "mac-address", NULL), 6); |
4217 | 4261 | ||
4218 | return 0; | 4262 | return 0; |
4219 | } | 4263 | } |
4220 | 4264 | ||
4221 | static int ucc_geth_remove(struct device *device) | 4265 | static int ucc_geth_remove(struct of_device* ofdev) |
4222 | { | 4266 | { |
4267 | struct device *device = &ofdev->dev; | ||
4223 | struct net_device *dev = dev_get_drvdata(device); | 4268 | struct net_device *dev = dev_get_drvdata(device); |
4224 | struct ucc_geth_private *ugeth = netdev_priv(dev); | 4269 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
4225 | 4270 | ||
@@ -4230,28 +4275,38 @@ static int ucc_geth_remove(struct device *device) | |||
4230 | return 0; | 4275 | return 0; |
4231 | } | 4276 | } |
4232 | 4277 | ||
4233 | /* Structure for a device driver */ | 4278 | static struct of_device_id ucc_geth_match[] = { |
4234 | static struct device_driver ucc_geth_driver = { | 4279 | { |
4235 | .name = DRV_NAME, | 4280 | .type = "network", |
4236 | .bus = &platform_bus_type, | 4281 | .compatible = "ucc_geth", |
4237 | .probe = ucc_geth_probe, | 4282 | }, |
4238 | .remove = ucc_geth_remove, | 4283 | {}, |
4284 | }; | ||
4285 | |||
4286 | MODULE_DEVICE_TABLE(of, ucc_geth_match); | ||
4287 | |||
4288 | static struct of_platform_driver ucc_geth_driver = { | ||
4289 | .name = DRV_NAME, | ||
4290 | .match_table = ucc_geth_match, | ||
4291 | .probe = ucc_geth_probe, | ||
4292 | .remove = ucc_geth_remove, | ||
4239 | }; | 4293 | }; |
4240 | 4294 | ||
4241 | static int __init ucc_geth_init(void) | 4295 | static int __init ucc_geth_init(void) |
4242 | { | 4296 | { |
4243 | int i; | 4297 | int i; |
4298 | |||
4244 | printk(KERN_INFO "ucc_geth: " DRV_DESC "\n"); | 4299 | printk(KERN_INFO "ucc_geth: " DRV_DESC "\n"); |
4245 | for (i = 0; i < 8; i++) | 4300 | for (i = 0; i < 8; i++) |
4246 | memcpy(&(ugeth_info[i]), &ugeth_primary_info, | 4301 | memcpy(&(ugeth_info[i]), &ugeth_primary_info, |
4247 | sizeof(ugeth_primary_info)); | 4302 | sizeof(ugeth_primary_info)); |
4248 | 4303 | ||
4249 | return driver_register(&ucc_geth_driver); | 4304 | return of_register_driver(&ucc_geth_driver); |
4250 | } | 4305 | } |
4251 | 4306 | ||
4252 | static void __exit ucc_geth_exit(void) | 4307 | static void __exit ucc_geth_exit(void) |
4253 | { | 4308 | { |
4254 | driver_unregister(&ucc_geth_driver); | 4309 | of_unregister_driver(&ucc_geth_driver); |
4255 | } | 4310 | } |
4256 | 4311 | ||
4257 | module_init(ucc_geth_init); | 4312 | module_init(ucc_geth_init); |
diff --git a/drivers/net/ucc_geth.h b/drivers/net/ucc_geth.h index 005965f5dd9b..a66561253593 100644 --- a/drivers/net/ucc_geth.h +++ b/drivers/net/ucc_geth.h | |||
@@ -36,24 +36,24 @@ | |||
36 | #define ENET_INIT_PARAM_MAX_ENTRIES_RX 9 | 36 | #define ENET_INIT_PARAM_MAX_ENTRIES_RX 9 |
37 | #define ENET_INIT_PARAM_MAX_ENTRIES_TX 8 | 37 | #define ENET_INIT_PARAM_MAX_ENTRIES_TX 8 |
38 | 38 | ||
39 | typedef struct ucc_mii_mng { | 39 | struct ucc_mii_mng { |
40 | u32 miimcfg; /* MII management configuration reg */ | 40 | u32 miimcfg; /* MII management configuration reg */ |
41 | u32 miimcom; /* MII management command reg */ | 41 | u32 miimcom; /* MII management command reg */ |
42 | u32 miimadd; /* MII management address reg */ | 42 | u32 miimadd; /* MII management address reg */ |
43 | u32 miimcon; /* MII management control reg */ | 43 | u32 miimcon; /* MII management control reg */ |
44 | u32 miimstat; /* MII management status reg */ | 44 | u32 miimstat; /* MII management status reg */ |
45 | u32 miimind; /* MII management indication reg */ | 45 | u32 miimind; /* MII management indication reg */ |
46 | } __attribute__ ((packed)) ucc_mii_mng_t; | 46 | } __attribute__ ((packed)); |
47 | 47 | ||
48 | typedef struct ucc_geth { | 48 | struct ucc_geth { |
49 | ucc_fast_t uccf; | 49 | struct ucc_fast uccf; |
50 | 50 | ||
51 | u32 maccfg1; /* mac configuration reg. 1 */ | 51 | u32 maccfg1; /* mac configuration reg. 1 */ |
52 | u32 maccfg2; /* mac configuration reg. 2 */ | 52 | u32 maccfg2; /* mac configuration reg. 2 */ |
53 | u32 ipgifg; /* interframe gap reg. */ | 53 | u32 ipgifg; /* interframe gap reg. */ |
54 | u32 hafdup; /* half-duplex reg. */ | 54 | u32 hafdup; /* half-duplex reg. */ |
55 | u8 res1[0x10]; | 55 | u8 res1[0x10]; |
56 | ucc_mii_mng_t miimng; /* MII management structure */ | 56 | struct ucc_mii_mng miimng; /* MII management structure */ |
57 | u32 ifctl; /* interface control reg */ | 57 | u32 ifctl; /* interface control reg */ |
58 | u32 ifstat; /* interface statux reg */ | 58 | u32 ifstat; /* interface statux reg */ |
59 | u32 macstnaddr1; /* mac station address part 1 reg */ | 59 | u32 macstnaddr1; /* mac station address part 1 reg */ |
@@ -111,7 +111,7 @@ typedef struct ucc_geth { | |||
111 | u32 scar; /* Statistics carry register */ | 111 | u32 scar; /* Statistics carry register */ |
112 | u32 scam; /* Statistics caryy mask register */ | 112 | u32 scam; /* Statistics caryy mask register */ |
113 | u8 res5[0x200 - 0x1c4]; | 113 | u8 res5[0x200 - 0x1c4]; |
114 | } __attribute__ ((packed)) ucc_geth_t; | 114 | } __attribute__ ((packed)); |
115 | 115 | ||
116 | /* UCC GETH TEMODR Register */ | 116 | /* UCC GETH TEMODR Register */ |
117 | #define TEMODER_TX_RMON_STATISTICS_ENABLE 0x0100 /* enable Tx statistics | 117 | #define TEMODER_TX_RMON_STATISTICS_ENABLE 0x0100 /* enable Tx statistics |
@@ -508,39 +508,39 @@ typedef struct ucc_geth { | |||
508 | /* UCC GETH UDSR (Data Synchronization Register) */ | 508 | /* UCC GETH UDSR (Data Synchronization Register) */ |
509 | #define UDSR_MAGIC 0x067E | 509 | #define UDSR_MAGIC 0x067E |
510 | 510 | ||
511 | typedef struct ucc_geth_thread_data_tx { | 511 | struct ucc_geth_thread_data_tx { |
512 | u8 res0[104]; | 512 | u8 res0[104]; |
513 | } __attribute__ ((packed)) ucc_geth_thread_data_tx_t; | 513 | } __attribute__ ((packed)); |
514 | 514 | ||
515 | typedef struct ucc_geth_thread_data_rx { | 515 | struct ucc_geth_thread_data_rx { |
516 | u8 res0[40]; | 516 | u8 res0[40]; |
517 | } __attribute__ ((packed)) ucc_geth_thread_data_rx_t; | 517 | } __attribute__ ((packed)); |
518 | 518 | ||
519 | /* Send Queue Queue-Descriptor */ | 519 | /* Send Queue Queue-Descriptor */ |
520 | typedef struct ucc_geth_send_queue_qd { | 520 | struct ucc_geth_send_queue_qd { |
521 | u32 bd_ring_base; /* pointer to BD ring base address */ | 521 | u32 bd_ring_base; /* pointer to BD ring base address */ |
522 | u8 res0[0x8]; | 522 | u8 res0[0x8]; |
523 | u32 last_bd_completed_address;/* initialize to last entry in BD ring */ | 523 | u32 last_bd_completed_address;/* initialize to last entry in BD ring */ |
524 | u8 res1[0x30]; | 524 | u8 res1[0x30]; |
525 | } __attribute__ ((packed)) ucc_geth_send_queue_qd_t; | 525 | } __attribute__ ((packed)); |
526 | 526 | ||
527 | typedef struct ucc_geth_send_queue_mem_region { | 527 | struct ucc_geth_send_queue_mem_region { |
528 | ucc_geth_send_queue_qd_t sqqd[NUM_TX_QUEUES]; | 528 | struct ucc_geth_send_queue_qd sqqd[NUM_TX_QUEUES]; |
529 | } __attribute__ ((packed)) ucc_geth_send_queue_mem_region_t; | 529 | } __attribute__ ((packed)); |
530 | 530 | ||
531 | typedef struct ucc_geth_thread_tx_pram { | 531 | struct ucc_geth_thread_tx_pram { |
532 | u8 res0[64]; | 532 | u8 res0[64]; |
533 | } __attribute__ ((packed)) ucc_geth_thread_tx_pram_t; | 533 | } __attribute__ ((packed)); |
534 | 534 | ||
535 | typedef struct ucc_geth_thread_rx_pram { | 535 | struct ucc_geth_thread_rx_pram { |
536 | u8 res0[128]; | 536 | u8 res0[128]; |
537 | } __attribute__ ((packed)) ucc_geth_thread_rx_pram_t; | 537 | } __attribute__ ((packed)); |
538 | 538 | ||
539 | #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING 64 | 539 | #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING 64 |
540 | #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING_8 64 | 540 | #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING_8 64 |
541 | #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING_16 96 | 541 | #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING_16 96 |
542 | 542 | ||
543 | typedef struct ucc_geth_scheduler { | 543 | struct ucc_geth_scheduler { |
544 | u16 cpucount0; /* CPU packet counter */ | 544 | u16 cpucount0; /* CPU packet counter */ |
545 | u16 cpucount1; /* CPU packet counter */ | 545 | u16 cpucount1; /* CPU packet counter */ |
546 | u16 cecount0; /* QE packet counter */ | 546 | u16 cecount0; /* QE packet counter */ |
@@ -574,9 +574,9 @@ typedef struct ucc_geth_scheduler { | |||
574 | /**< weight factor for queues */ | 574 | /**< weight factor for queues */ |
575 | u32 minw; /* temporary variable handled by QE */ | 575 | u32 minw; /* temporary variable handled by QE */ |
576 | u8 res1[0x70 - 0x64]; | 576 | u8 res1[0x70 - 0x64]; |
577 | } __attribute__ ((packed)) ucc_geth_scheduler_t; | 577 | } __attribute__ ((packed)); |
578 | 578 | ||
579 | typedef struct ucc_geth_tx_firmware_statistics_pram { | 579 | struct ucc_geth_tx_firmware_statistics_pram { |
580 | u32 sicoltx; /* single collision */ | 580 | u32 sicoltx; /* single collision */ |
581 | u32 mulcoltx; /* multiple collision */ | 581 | u32 mulcoltx; /* multiple collision */ |
582 | u32 latecoltxfr; /* late collision */ | 582 | u32 latecoltxfr; /* late collision */ |
@@ -596,9 +596,9 @@ typedef struct ucc_geth_tx_firmware_statistics_pram { | |||
596 | and 1518 octets */ | 596 | and 1518 octets */ |
597 | u32 txpktsjumbo; /* total packets (including bad) between 1024 | 597 | u32 txpktsjumbo; /* total packets (including bad) between 1024 |
598 | and MAXLength octets */ | 598 | and MAXLength octets */ |
599 | } __attribute__ ((packed)) ucc_geth_tx_firmware_statistics_pram_t; | 599 | } __attribute__ ((packed)); |
600 | 600 | ||
601 | typedef struct ucc_geth_rx_firmware_statistics_pram { | 601 | struct ucc_geth_rx_firmware_statistics_pram { |
602 | u32 frrxfcser; /* frames with crc error */ | 602 | u32 frrxfcser; /* frames with crc error */ |
603 | u32 fraligner; /* frames with alignment error */ | 603 | u32 fraligner; /* frames with alignment error */ |
604 | u32 inrangelenrxer; /* in range length error */ | 604 | u32 inrangelenrxer; /* in range length error */ |
@@ -630,33 +630,33 @@ typedef struct ucc_geth_rx_firmware_statistics_pram { | |||
630 | replaced */ | 630 | replaced */ |
631 | u32 insertvlan; /* total frames that had their VLAN tag | 631 | u32 insertvlan; /* total frames that had their VLAN tag |
632 | inserted */ | 632 | inserted */ |
633 | } __attribute__ ((packed)) ucc_geth_rx_firmware_statistics_pram_t; | 633 | } __attribute__ ((packed)); |
634 | 634 | ||
635 | typedef struct ucc_geth_rx_interrupt_coalescing_entry { | 635 | struct ucc_geth_rx_interrupt_coalescing_entry { |
636 | u32 interruptcoalescingmaxvalue; /* interrupt coalescing max | 636 | u32 interruptcoalescingmaxvalue; /* interrupt coalescing max |
637 | value */ | 637 | value */ |
638 | u32 interruptcoalescingcounter; /* interrupt coalescing counter, | 638 | u32 interruptcoalescingcounter; /* interrupt coalescing counter, |
639 | initialize to | 639 | initialize to |
640 | interruptcoalescingmaxvalue */ | 640 | interruptcoalescingmaxvalue */ |
641 | } __attribute__ ((packed)) ucc_geth_rx_interrupt_coalescing_entry_t; | 641 | } __attribute__ ((packed)); |
642 | 642 | ||
643 | typedef struct ucc_geth_rx_interrupt_coalescing_table { | 643 | struct ucc_geth_rx_interrupt_coalescing_table { |
644 | ucc_geth_rx_interrupt_coalescing_entry_t coalescingentry[NUM_RX_QUEUES]; | 644 | struct ucc_geth_rx_interrupt_coalescing_entry coalescingentry[NUM_RX_QUEUES]; |
645 | /**< interrupt coalescing entry */ | 645 | /**< interrupt coalescing entry */ |
646 | } __attribute__ ((packed)) ucc_geth_rx_interrupt_coalescing_table_t; | 646 | } __attribute__ ((packed)); |
647 | 647 | ||
648 | typedef struct ucc_geth_rx_prefetched_bds { | 648 | struct ucc_geth_rx_prefetched_bds { |
649 | qe_bd_t bd[NUM_BDS_IN_PREFETCHED_BDS]; /* prefetched bd */ | 649 | struct qe_bd bd[NUM_BDS_IN_PREFETCHED_BDS]; /* prefetched bd */ |
650 | } __attribute__ ((packed)) ucc_geth_rx_prefetched_bds_t; | 650 | } __attribute__ ((packed)); |
651 | 651 | ||
652 | typedef struct ucc_geth_rx_bd_queues_entry { | 652 | struct ucc_geth_rx_bd_queues_entry { |
653 | u32 bdbaseptr; /* BD base pointer */ | 653 | u32 bdbaseptr; /* BD base pointer */ |
654 | u32 bdptr; /* BD pointer */ | 654 | u32 bdptr; /* BD pointer */ |
655 | u32 externalbdbaseptr; /* external BD base pointer */ | 655 | u32 externalbdbaseptr; /* external BD base pointer */ |
656 | u32 externalbdptr; /* external BD pointer */ | 656 | u32 externalbdptr; /* external BD pointer */ |
657 | } __attribute__ ((packed)) ucc_geth_rx_bd_queues_entry_t; | 657 | } __attribute__ ((packed)); |
658 | 658 | ||
659 | typedef struct ucc_geth_tx_global_pram { | 659 | struct ucc_geth_tx_global_pram { |
660 | u16 temoder; | 660 | u16 temoder; |
661 | u8 res0[0x38 - 0x02]; | 661 | u8 res0[0x38 - 0x02]; |
662 | u32 sqptr; /* a base pointer to send queue memory region */ | 662 | u32 sqptr; /* a base pointer to send queue memory region */ |
@@ -670,15 +670,15 @@ typedef struct ucc_geth_tx_global_pram { | |||
670 | u32 tqptr; /* a base pointer to the Tx Queues Memory | 670 | u32 tqptr; /* a base pointer to the Tx Queues Memory |
671 | Region */ | 671 | Region */ |
672 | u8 res2[0x80 - 0x74]; | 672 | u8 res2[0x80 - 0x74]; |
673 | } __attribute__ ((packed)) ucc_geth_tx_global_pram_t; | 673 | } __attribute__ ((packed)); |
674 | 674 | ||
675 | /* structure representing Extended Filtering Global Parameters in PRAM */ | 675 | /* structure representing Extended Filtering Global Parameters in PRAM */ |
676 | typedef struct ucc_geth_exf_global_pram { | 676 | struct ucc_geth_exf_global_pram { |
677 | u32 l2pcdptr; /* individual address filter, high */ | 677 | u32 l2pcdptr; /* individual address filter, high */ |
678 | u8 res0[0x10 - 0x04]; | 678 | u8 res0[0x10 - 0x04]; |
679 | } __attribute__ ((packed)) ucc_geth_exf_global_pram_t; | 679 | } __attribute__ ((packed)); |
680 | 680 | ||
681 | typedef struct ucc_geth_rx_global_pram { | 681 | struct ucc_geth_rx_global_pram { |
682 | u32 remoder; /* ethernet mode reg. */ | 682 | u32 remoder; /* ethernet mode reg. */ |
683 | u32 rqptr; /* base pointer to the Rx Queues Memory Region*/ | 683 | u32 rqptr; /* base pointer to the Rx Queues Memory Region*/ |
684 | u32 res0[0x1]; | 684 | u32 res0[0x1]; |
@@ -710,12 +710,12 @@ typedef struct ucc_geth_rx_global_pram { | |||
710 | u32 exfGlobalParam; /* base address for extended filtering global | 710 | u32 exfGlobalParam; /* base address for extended filtering global |
711 | parameters */ | 711 | parameters */ |
712 | u8 res6[0x100 - 0xC4]; /* Initialize to zero */ | 712 | u8 res6[0x100 - 0xC4]; /* Initialize to zero */ |
713 | } __attribute__ ((packed)) ucc_geth_rx_global_pram_t; | 713 | } __attribute__ ((packed)); |
714 | 714 | ||
715 | #define GRACEFUL_STOP_ACKNOWLEDGE_RX 0x01 | 715 | #define GRACEFUL_STOP_ACKNOWLEDGE_RX 0x01 |
716 | 716 | ||
717 | /* structure representing InitEnet command */ | 717 | /* structure representing InitEnet command */ |
718 | typedef struct ucc_geth_init_pram { | 718 | struct ucc_geth_init_pram { |
719 | u8 resinit1; | 719 | u8 resinit1; |
720 | u8 resinit2; | 720 | u8 resinit2; |
721 | u8 resinit3; | 721 | u8 resinit3; |
@@ -729,7 +729,7 @@ typedef struct ucc_geth_init_pram { | |||
729 | u32 txglobal; /* tx global */ | 729 | u32 txglobal; /* tx global */ |
730 | u32 txthread[ENET_INIT_PARAM_MAX_ENTRIES_TX]; /* tx threads */ | 730 | u32 txthread[ENET_INIT_PARAM_MAX_ENTRIES_TX]; /* tx threads */ |
731 | u8 res3[0x1]; | 731 | u8 res3[0x1]; |
732 | } __attribute__ ((packed)) ucc_geth_init_pram_t; | 732 | } __attribute__ ((packed)); |
733 | 733 | ||
734 | #define ENET_INIT_PARAM_RGF_SHIFT (32 - 4) | 734 | #define ENET_INIT_PARAM_RGF_SHIFT (32 - 4) |
735 | #define ENET_INIT_PARAM_TGF_SHIFT (32 - 8) | 735 | #define ENET_INIT_PARAM_TGF_SHIFT (32 - 8) |
@@ -746,27 +746,27 @@ typedef struct ucc_geth_init_pram { | |||
746 | #define ENET_INIT_PARAM_MAGIC_RES_INIT5 0x0400 | 746 | #define ENET_INIT_PARAM_MAGIC_RES_INIT5 0x0400 |
747 | 747 | ||
748 | /* structure representing 82xx Address Filtering Enet Address in PRAM */ | 748 | /* structure representing 82xx Address Filtering Enet Address in PRAM */ |
749 | typedef struct ucc_geth_82xx_enet_address { | 749 | struct ucc_geth_82xx_enet_address { |
750 | u8 res1[0x2]; | 750 | u8 res1[0x2]; |
751 | u16 h; /* address (MSB) */ | 751 | u16 h; /* address (MSB) */ |
752 | u16 m; /* address */ | 752 | u16 m; /* address */ |
753 | u16 l; /* address (LSB) */ | 753 | u16 l; /* address (LSB) */ |
754 | } __attribute__ ((packed)) ucc_geth_82xx_enet_address_t; | 754 | } __attribute__ ((packed)); |
755 | 755 | ||
756 | /* structure representing 82xx Address Filtering PRAM */ | 756 | /* structure representing 82xx Address Filtering PRAM */ |
757 | typedef struct ucc_geth_82xx_address_filtering_pram { | 757 | struct ucc_geth_82xx_address_filtering_pram { |
758 | u32 iaddr_h; /* individual address filter, high */ | 758 | u32 iaddr_h; /* individual address filter, high */ |
759 | u32 iaddr_l; /* individual address filter, low */ | 759 | u32 iaddr_l; /* individual address filter, low */ |
760 | u32 gaddr_h; /* group address filter, high */ | 760 | u32 gaddr_h; /* group address filter, high */ |
761 | u32 gaddr_l; /* group address filter, low */ | 761 | u32 gaddr_l; /* group address filter, low */ |
762 | ucc_geth_82xx_enet_address_t taddr; | 762 | struct ucc_geth_82xx_enet_address taddr; |
763 | ucc_geth_82xx_enet_address_t paddr[NUM_OF_PADDRS]; | 763 | struct ucc_geth_82xx_enet_address paddr[NUM_OF_PADDRS]; |
764 | u8 res0[0x40 - 0x38]; | 764 | u8 res0[0x40 - 0x38]; |
765 | } __attribute__ ((packed)) ucc_geth_82xx_address_filtering_pram_t; | 765 | } __attribute__ ((packed)); |
766 | 766 | ||
767 | /* GETH Tx firmware statistics structure, used when calling | 767 | /* GETH Tx firmware statistics structure, used when calling |
768 | UCC_GETH_GetStatistics. */ | 768 | UCC_GETH_GetStatistics. */ |
769 | typedef struct ucc_geth_tx_firmware_statistics { | 769 | struct ucc_geth_tx_firmware_statistics { |
770 | u32 sicoltx; /* single collision */ | 770 | u32 sicoltx; /* single collision */ |
771 | u32 mulcoltx; /* multiple collision */ | 771 | u32 mulcoltx; /* multiple collision */ |
772 | u32 latecoltxfr; /* late collision */ | 772 | u32 latecoltxfr; /* late collision */ |
@@ -786,11 +786,11 @@ typedef struct ucc_geth_tx_firmware_statistics { | |||
786 | and 1518 octets */ | 786 | and 1518 octets */ |
787 | u32 txpktsjumbo; /* total packets (including bad) between 1024 | 787 | u32 txpktsjumbo; /* total packets (including bad) between 1024 |
788 | and MAXLength octets */ | 788 | and MAXLength octets */ |
789 | } __attribute__ ((packed)) ucc_geth_tx_firmware_statistics_t; | 789 | } __attribute__ ((packed)); |
790 | 790 | ||
791 | /* GETH Rx firmware statistics structure, used when calling | 791 | /* GETH Rx firmware statistics structure, used when calling |
792 | UCC_GETH_GetStatistics. */ | 792 | UCC_GETH_GetStatistics. */ |
793 | typedef struct ucc_geth_rx_firmware_statistics { | 793 | struct ucc_geth_rx_firmware_statistics { |
794 | u32 frrxfcser; /* frames with crc error */ | 794 | u32 frrxfcser; /* frames with crc error */ |
795 | u32 fraligner; /* frames with alignment error */ | 795 | u32 fraligner; /* frames with alignment error */ |
796 | u32 inrangelenrxer; /* in range length error */ | 796 | u32 inrangelenrxer; /* in range length error */ |
@@ -822,11 +822,11 @@ typedef struct ucc_geth_rx_firmware_statistics { | |||
822 | replaced */ | 822 | replaced */ |
823 | u32 insertvlan; /* total frames that had their VLAN tag | 823 | u32 insertvlan; /* total frames that had their VLAN tag |
824 | inserted */ | 824 | inserted */ |
825 | } __attribute__ ((packed)) ucc_geth_rx_firmware_statistics_t; | 825 | } __attribute__ ((packed)); |
826 | 826 | ||
827 | /* GETH hardware statistics structure, used when calling | 827 | /* GETH hardware statistics structure, used when calling |
828 | UCC_GETH_GetStatistics. */ | 828 | UCC_GETH_GetStatistics. */ |
829 | typedef struct ucc_geth_hardware_statistics { | 829 | struct ucc_geth_hardware_statistics { |
830 | u32 tx64; /* Total number of frames (including bad | 830 | u32 tx64; /* Total number of frames (including bad |
831 | frames) transmitted that were exactly of the | 831 | frames) transmitted that were exactly of the |
832 | minimal length (64 for un tagged, 68 for | 832 | minimal length (64 for un tagged, 68 for |
@@ -871,7 +871,7 @@ typedef struct ucc_geth_hardware_statistics { | |||
871 | u32 rbca; /* Total number of frames received succesfully | 871 | u32 rbca; /* Total number of frames received succesfully |
872 | that had destination address equal to the | 872 | that had destination address equal to the |
873 | broadcast address */ | 873 | broadcast address */ |
874 | } __attribute__ ((packed)) ucc_geth_hardware_statistics_t; | 874 | } __attribute__ ((packed)); |
875 | 875 | ||
876 | /* UCC GETH Tx errors returned via TxConf callback */ | 876 | /* UCC GETH Tx errors returned via TxConf callback */ |
877 | #define TX_ERRORS_DEF 0x0200 | 877 | #define TX_ERRORS_DEF 0x0200 |
@@ -1013,21 +1013,21 @@ typedef struct ucc_geth_hardware_statistics { | |||
1013 | (MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_112) | 1013 | (MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_112) |
1014 | 1014 | ||
1015 | /* Ethernet speed */ | 1015 | /* Ethernet speed */ |
1016 | typedef enum enet_speed { | 1016 | enum enet_speed { |
1017 | ENET_SPEED_10BT, /* 10 Base T */ | 1017 | ENET_SPEED_10BT, /* 10 Base T */ |
1018 | ENET_SPEED_100BT, /* 100 Base T */ | 1018 | ENET_SPEED_100BT, /* 100 Base T */ |
1019 | ENET_SPEED_1000BT /* 1000 Base T */ | 1019 | ENET_SPEED_1000BT /* 1000 Base T */ |
1020 | } enet_speed_e; | 1020 | }; |
1021 | 1021 | ||
1022 | /* Ethernet Address Type. */ | 1022 | /* Ethernet Address Type. */ |
1023 | typedef enum enet_addr_type { | 1023 | enum enet_addr_type { |
1024 | ENET_ADDR_TYPE_INDIVIDUAL, | 1024 | ENET_ADDR_TYPE_INDIVIDUAL, |
1025 | ENET_ADDR_TYPE_GROUP, | 1025 | ENET_ADDR_TYPE_GROUP, |
1026 | ENET_ADDR_TYPE_BROADCAST | 1026 | ENET_ADDR_TYPE_BROADCAST |
1027 | } enet_addr_type_e; | 1027 | }; |
1028 | 1028 | ||
1029 | /* TBI / MII Set Register */ | 1029 | /* TBI / MII Set Register */ |
1030 | typedef enum enet_tbi_mii_reg { | 1030 | enum enet_tbi_mii_reg { |
1031 | ENET_TBI_MII_CR = 0x00, /* Control (CR ) */ | 1031 | ENET_TBI_MII_CR = 0x00, /* Control (CR ) */ |
1032 | ENET_TBI_MII_SR = 0x01, /* Status (SR ) */ | 1032 | ENET_TBI_MII_SR = 0x01, /* Status (SR ) */ |
1033 | ENET_TBI_MII_ANA = 0x04, /* AN advertisement (ANA ) */ | 1033 | ENET_TBI_MII_ANA = 0x04, /* AN advertisement (ANA ) */ |
@@ -1040,10 +1040,10 @@ typedef enum enet_tbi_mii_reg { | |||
1040 | ENET_TBI_MII_EXST = 0x0F, /* Extended status (EXST ) */ | 1040 | ENET_TBI_MII_EXST = 0x0F, /* Extended status (EXST ) */ |
1041 | ENET_TBI_MII_JD = 0x10, /* Jitter diagnostics (JD ) */ | 1041 | ENET_TBI_MII_JD = 0x10, /* Jitter diagnostics (JD ) */ |
1042 | ENET_TBI_MII_TBICON = 0x11 /* TBI control (TBICON ) */ | 1042 | ENET_TBI_MII_TBICON = 0x11 /* TBI control (TBICON ) */ |
1043 | } enet_tbi_mii_reg_e; | 1043 | }; |
1044 | 1044 | ||
1045 | /* UCC GETH 82xx Ethernet Address Recognition Location */ | 1045 | /* UCC GETH 82xx Ethernet Address Recognition Location */ |
1046 | typedef enum ucc_geth_enet_address_recognition_location { | 1046 | enum ucc_geth_enet_address_recognition_location { |
1047 | UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_STATION_ADDRESS,/* station | 1047 | UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_STATION_ADDRESS,/* station |
1048 | address */ | 1048 | address */ |
1049 | UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_PADDR_FIRST, /* additional | 1049 | UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_PADDR_FIRST, /* additional |
@@ -1065,10 +1065,10 @@ typedef enum ucc_geth_enet_address_recognition_location { | |||
1065 | UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_GROUP_HASH, /* group hash */ | 1065 | UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_GROUP_HASH, /* group hash */ |
1066 | UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_INDIVIDUAL_HASH /* individual | 1066 | UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_INDIVIDUAL_HASH /* individual |
1067 | hash */ | 1067 | hash */ |
1068 | } ucc_geth_enet_address_recognition_location_e; | 1068 | }; |
1069 | 1069 | ||
1070 | /* UCC GETH vlan operation tagged */ | 1070 | /* UCC GETH vlan operation tagged */ |
1071 | typedef enum ucc_geth_vlan_operation_tagged { | 1071 | enum ucc_geth_vlan_operation_tagged { |
1072 | UCC_GETH_VLAN_OPERATION_TAGGED_NOP = 0x0, /* Tagged - nop */ | 1072 | UCC_GETH_VLAN_OPERATION_TAGGED_NOP = 0x0, /* Tagged - nop */ |
1073 | UCC_GETH_VLAN_OPERATION_TAGGED_REPLACE_VID_PORTION_OF_Q_TAG | 1073 | UCC_GETH_VLAN_OPERATION_TAGGED_REPLACE_VID_PORTION_OF_Q_TAG |
1074 | = 0x1, /* Tagged - replace vid portion of q tag */ | 1074 | = 0x1, /* Tagged - replace vid portion of q tag */ |
@@ -1076,18 +1076,18 @@ typedef enum ucc_geth_vlan_operation_tagged { | |||
1076 | = 0x2, /* Tagged - if vid0 replace vid with default value */ | 1076 | = 0x2, /* Tagged - if vid0 replace vid with default value */ |
1077 | UCC_GETH_VLAN_OPERATION_TAGGED_EXTRACT_Q_TAG_FROM_FRAME | 1077 | UCC_GETH_VLAN_OPERATION_TAGGED_EXTRACT_Q_TAG_FROM_FRAME |
1078 | = 0x3 /* Tagged - extract q tag from frame */ | 1078 | = 0x3 /* Tagged - extract q tag from frame */ |
1079 | } ucc_geth_vlan_operation_tagged_e; | 1079 | }; |
1080 | 1080 | ||
1081 | /* UCC GETH vlan operation non-tagged */ | 1081 | /* UCC GETH vlan operation non-tagged */ |
1082 | typedef enum ucc_geth_vlan_operation_non_tagged { | 1082 | enum ucc_geth_vlan_operation_non_tagged { |
1083 | UCC_GETH_VLAN_OPERATION_NON_TAGGED_NOP = 0x0, /* Non tagged - nop */ | 1083 | UCC_GETH_VLAN_OPERATION_NON_TAGGED_NOP = 0x0, /* Non tagged - nop */ |
1084 | UCC_GETH_VLAN_OPERATION_NON_TAGGED_Q_TAG_INSERT = 0x1 /* Non tagged - | 1084 | UCC_GETH_VLAN_OPERATION_NON_TAGGED_Q_TAG_INSERT = 0x1 /* Non tagged - |
1085 | q tag insert | 1085 | q tag insert |
1086 | */ | 1086 | */ |
1087 | } ucc_geth_vlan_operation_non_tagged_e; | 1087 | }; |
1088 | 1088 | ||
1089 | /* UCC GETH Rx Quality of Service Mode */ | 1089 | /* UCC GETH Rx Quality of Service Mode */ |
1090 | typedef enum ucc_geth_qos_mode { | 1090 | enum ucc_geth_qos_mode { |
1091 | UCC_GETH_QOS_MODE_DEFAULT = 0x0, /* default queue */ | 1091 | UCC_GETH_QOS_MODE_DEFAULT = 0x0, /* default queue */ |
1092 | UCC_GETH_QOS_MODE_QUEUE_NUM_FROM_L2_CRITERIA = 0x1, /* queue | 1092 | UCC_GETH_QOS_MODE_QUEUE_NUM_FROM_L2_CRITERIA = 0x1, /* queue |
1093 | determined | 1093 | determined |
@@ -1097,11 +1097,11 @@ typedef enum ucc_geth_qos_mode { | |||
1097 | determined | 1097 | determined |
1098 | by L3 | 1098 | by L3 |
1099 | criteria */ | 1099 | criteria */ |
1100 | } ucc_geth_qos_mode_e; | 1100 | }; |
1101 | 1101 | ||
1102 | /* UCC GETH Statistics Gathering Mode - These are bit flags, 'or' them together | 1102 | /* UCC GETH Statistics Gathering Mode - These are bit flags, 'or' them together |
1103 | for combined functionality */ | 1103 | for combined functionality */ |
1104 | typedef enum ucc_geth_statistics_gathering_mode { | 1104 | enum ucc_geth_statistics_gathering_mode { |
1105 | UCC_GETH_STATISTICS_GATHERING_MODE_NONE = 0x00000000, /* No | 1105 | UCC_GETH_STATISTICS_GATHERING_MODE_NONE = 0x00000000, /* No |
1106 | statistics | 1106 | statistics |
1107 | gathering */ | 1107 | gathering */ |
@@ -1122,10 +1122,10 @@ typedef enum ucc_geth_statistics_gathering_mode { | |||
1122 | statistics | 1122 | statistics |
1123 | gathering | 1123 | gathering |
1124 | */ | 1124 | */ |
1125 | } ucc_geth_statistics_gathering_mode_e; | 1125 | }; |
1126 | 1126 | ||
1127 | /* UCC GETH Pad and CRC Mode - Note, Padding without CRC is not possible */ | 1127 | /* UCC GETH Pad and CRC Mode - Note, Padding without CRC is not possible */ |
1128 | typedef enum ucc_geth_maccfg2_pad_and_crc_mode { | 1128 | enum ucc_geth_maccfg2_pad_and_crc_mode { |
1129 | UCC_GETH_PAD_AND_CRC_MODE_NONE | 1129 | UCC_GETH_PAD_AND_CRC_MODE_NONE |
1130 | = MACCFG2_PAD_AND_CRC_MODE_NONE, /* Neither Padding | 1130 | = MACCFG2_PAD_AND_CRC_MODE_NONE, /* Neither Padding |
1131 | short frames | 1131 | short frames |
@@ -1135,61 +1135,59 @@ typedef enum ucc_geth_maccfg2_pad_and_crc_mode { | |||
1135 | CRC only */ | 1135 | CRC only */ |
1136 | UCC_GETH_PAD_AND_CRC_MODE_PAD_AND_CRC = | 1136 | UCC_GETH_PAD_AND_CRC_MODE_PAD_AND_CRC = |
1137 | MACCFG2_PAD_AND_CRC_MODE_PAD_AND_CRC | 1137 | MACCFG2_PAD_AND_CRC_MODE_PAD_AND_CRC |
1138 | } ucc_geth_maccfg2_pad_and_crc_mode_e; | 1138 | }; |
1139 | 1139 | ||
1140 | /* UCC GETH upsmr Flow Control Mode */ | 1140 | /* UCC GETH upsmr Flow Control Mode */ |
1141 | typedef enum ucc_geth_flow_control_mode { | 1141 | enum ucc_geth_flow_control_mode { |
1142 | UPSMR_AUTOMATIC_FLOW_CONTROL_MODE_NONE = 0x00000000, /* No automatic | 1142 | UPSMR_AUTOMATIC_FLOW_CONTROL_MODE_NONE = 0x00000000, /* No automatic |
1143 | flow control | 1143 | flow control |
1144 | */ | 1144 | */ |
1145 | UPSMR_AUTOMATIC_FLOW_CONTROL_MODE_PAUSE_WHEN_EMERGENCY | 1145 | UPSMR_AUTOMATIC_FLOW_CONTROL_MODE_PAUSE_WHEN_EMERGENCY |
1146 | = 0x00004000 /* Send pause frame when RxFIFO reaches its | 1146 | = 0x00004000 /* Send pause frame when RxFIFO reaches its |
1147 | emergency threshold */ | 1147 | emergency threshold */ |
1148 | } ucc_geth_flow_control_mode_e; | 1148 | }; |
1149 | 1149 | ||
1150 | /* UCC GETH number of threads */ | 1150 | /* UCC GETH number of threads */ |
1151 | typedef enum ucc_geth_num_of_threads { | 1151 | enum ucc_geth_num_of_threads { |
1152 | UCC_GETH_NUM_OF_THREADS_1 = 0x1, /* 1 */ | 1152 | UCC_GETH_NUM_OF_THREADS_1 = 0x1, /* 1 */ |
1153 | UCC_GETH_NUM_OF_THREADS_2 = 0x2, /* 2 */ | 1153 | UCC_GETH_NUM_OF_THREADS_2 = 0x2, /* 2 */ |
1154 | UCC_GETH_NUM_OF_THREADS_4 = 0x0, /* 4 */ | 1154 | UCC_GETH_NUM_OF_THREADS_4 = 0x0, /* 4 */ |
1155 | UCC_GETH_NUM_OF_THREADS_6 = 0x3, /* 6 */ | 1155 | UCC_GETH_NUM_OF_THREADS_6 = 0x3, /* 6 */ |
1156 | UCC_GETH_NUM_OF_THREADS_8 = 0x4 /* 8 */ | 1156 | UCC_GETH_NUM_OF_THREADS_8 = 0x4 /* 8 */ |
1157 | } ucc_geth_num_of_threads_e; | 1157 | }; |
1158 | 1158 | ||
1159 | /* UCC GETH number of station addresses */ | 1159 | /* UCC GETH number of station addresses */ |
1160 | typedef enum ucc_geth_num_of_station_addresses { | 1160 | enum ucc_geth_num_of_station_addresses { |
1161 | UCC_GETH_NUM_OF_STATION_ADDRESSES_1, /* 1 */ | 1161 | UCC_GETH_NUM_OF_STATION_ADDRESSES_1, /* 1 */ |
1162 | UCC_GETH_NUM_OF_STATION_ADDRESSES_5 /* 5 */ | 1162 | UCC_GETH_NUM_OF_STATION_ADDRESSES_5 /* 5 */ |
1163 | } ucc_geth_num_of_station_addresses_e; | 1163 | }; |
1164 | |||
1165 | typedef u8 enet_addr_t[ENET_NUM_OCTETS_PER_ADDRESS]; | ||
1166 | 1164 | ||
1167 | /* UCC GETH 82xx Ethernet Address Container */ | 1165 | /* UCC GETH 82xx Ethernet Address Container */ |
1168 | typedef struct enet_addr_container { | 1166 | struct enet_addr_container { |
1169 | enet_addr_t address; /* ethernet address */ | 1167 | u8 address[ENET_NUM_OCTETS_PER_ADDRESS]; /* ethernet address */ |
1170 | ucc_geth_enet_address_recognition_location_e location; /* location in | 1168 | enum ucc_geth_enet_address_recognition_location location; /* location in |
1171 | 82xx address | 1169 | 82xx address |
1172 | recognition | 1170 | recognition |
1173 | hardware */ | 1171 | hardware */ |
1174 | struct list_head node; | 1172 | struct list_head node; |
1175 | } enet_addr_container_t; | 1173 | }; |
1176 | 1174 | ||
1177 | #define ENET_ADDR_CONT_ENTRY(ptr) list_entry(ptr, enet_addr_container_t, node) | 1175 | #define ENET_ADDR_CONT_ENTRY(ptr) list_entry(ptr, struct enet_addr_container, node) |
1178 | 1176 | ||
1179 | /* UCC GETH Termination Action Descriptor (TAD) structure. */ | 1177 | /* UCC GETH Termination Action Descriptor (TAD) structure. */ |
1180 | typedef struct ucc_geth_tad_params { | 1178 | struct ucc_geth_tad_params { |
1181 | int rx_non_dynamic_extended_features_mode; | 1179 | int rx_non_dynamic_extended_features_mode; |
1182 | int reject_frame; | 1180 | int reject_frame; |
1183 | ucc_geth_vlan_operation_tagged_e vtag_op; | 1181 | enum ucc_geth_vlan_operation_tagged vtag_op; |
1184 | ucc_geth_vlan_operation_non_tagged_e vnontag_op; | 1182 | enum ucc_geth_vlan_operation_non_tagged vnontag_op; |
1185 | ucc_geth_qos_mode_e rqos; | 1183 | enum ucc_geth_qos_mode rqos; |
1186 | u8 vpri; | 1184 | u8 vpri; |
1187 | u16 vid; | 1185 | u16 vid; |
1188 | } ucc_geth_tad_params_t; | 1186 | }; |
1189 | 1187 | ||
1190 | /* GETH protocol initialization structure */ | 1188 | /* GETH protocol initialization structure */ |
1191 | typedef struct ucc_geth_info { | 1189 | struct ucc_geth_info { |
1192 | ucc_fast_info_t uf_info; | 1190 | struct ucc_fast_info uf_info; |
1193 | u8 numQueuesTx; | 1191 | u8 numQueuesTx; |
1194 | u8 numQueuesRx; | 1192 | u8 numQueuesRx; |
1195 | int ipCheckSumCheck; | 1193 | int ipCheckSumCheck; |
@@ -1251,51 +1249,51 @@ typedef struct ucc_geth_info { | |||
1251 | u8 iphoffset[TX_IP_OFFSET_ENTRY_MAX]; | 1249 | u8 iphoffset[TX_IP_OFFSET_ENTRY_MAX]; |
1252 | u16 bdRingLenTx[NUM_TX_QUEUES]; | 1250 | u16 bdRingLenTx[NUM_TX_QUEUES]; |
1253 | u16 bdRingLenRx[NUM_RX_QUEUES]; | 1251 | u16 bdRingLenRx[NUM_RX_QUEUES]; |
1254 | enet_interface_e enet_interface; | 1252 | enum enet_interface enet_interface; |
1255 | ucc_geth_num_of_station_addresses_e numStationAddresses; | 1253 | enum ucc_geth_num_of_station_addresses numStationAddresses; |
1256 | qe_fltr_largest_external_tbl_lookup_key_size_e | 1254 | enum qe_fltr_largest_external_tbl_lookup_key_size |
1257 | largestexternallookupkeysize; | 1255 | largestexternallookupkeysize; |
1258 | ucc_geth_statistics_gathering_mode_e statisticsMode; | 1256 | enum ucc_geth_statistics_gathering_mode statisticsMode; |
1259 | ucc_geth_vlan_operation_tagged_e vlanOperationTagged; | 1257 | enum ucc_geth_vlan_operation_tagged vlanOperationTagged; |
1260 | ucc_geth_vlan_operation_non_tagged_e vlanOperationNonTagged; | 1258 | enum ucc_geth_vlan_operation_non_tagged vlanOperationNonTagged; |
1261 | ucc_geth_qos_mode_e rxQoSMode; | 1259 | enum ucc_geth_qos_mode rxQoSMode; |
1262 | ucc_geth_flow_control_mode_e aufc; | 1260 | enum ucc_geth_flow_control_mode aufc; |
1263 | ucc_geth_maccfg2_pad_and_crc_mode_e padAndCrc; | 1261 | enum ucc_geth_maccfg2_pad_and_crc_mode padAndCrc; |
1264 | ucc_geth_num_of_threads_e numThreadsTx; | 1262 | enum ucc_geth_num_of_threads numThreadsTx; |
1265 | ucc_geth_num_of_threads_e numThreadsRx; | 1263 | enum ucc_geth_num_of_threads numThreadsRx; |
1266 | qe_risc_allocation_e riscTx; | 1264 | enum qe_risc_allocation riscTx; |
1267 | qe_risc_allocation_e riscRx; | 1265 | enum qe_risc_allocation riscRx; |
1268 | } ucc_geth_info_t; | 1266 | }; |
1269 | 1267 | ||
1270 | /* structure representing UCC GETH */ | 1268 | /* structure representing UCC GETH */ |
1271 | typedef struct ucc_geth_private { | 1269 | struct ucc_geth_private { |
1272 | ucc_geth_info_t *ug_info; | 1270 | struct ucc_geth_info *ug_info; |
1273 | ucc_fast_private_t *uccf; | 1271 | struct ucc_fast_private *uccf; |
1274 | struct net_device *dev; | 1272 | struct net_device *dev; |
1275 | struct net_device_stats stats; /* linux network statistics */ | 1273 | struct net_device_stats stats; /* linux network statistics */ |
1276 | ucc_geth_t *ug_regs; | 1274 | struct ucc_geth *ug_regs; |
1277 | ucc_geth_init_pram_t *p_init_enet_param_shadow; | 1275 | struct ucc_geth_init_pram *p_init_enet_param_shadow; |
1278 | ucc_geth_exf_global_pram_t *p_exf_glbl_param; | 1276 | struct ucc_geth_exf_global_pram *p_exf_glbl_param; |
1279 | u32 exf_glbl_param_offset; | 1277 | u32 exf_glbl_param_offset; |
1280 | ucc_geth_rx_global_pram_t *p_rx_glbl_pram; | 1278 | struct ucc_geth_rx_global_pram *p_rx_glbl_pram; |
1281 | u32 rx_glbl_pram_offset; | 1279 | u32 rx_glbl_pram_offset; |
1282 | ucc_geth_tx_global_pram_t *p_tx_glbl_pram; | 1280 | struct ucc_geth_tx_global_pram *p_tx_glbl_pram; |
1283 | u32 tx_glbl_pram_offset; | 1281 | u32 tx_glbl_pram_offset; |
1284 | ucc_geth_send_queue_mem_region_t *p_send_q_mem_reg; | 1282 | struct ucc_geth_send_queue_mem_region *p_send_q_mem_reg; |
1285 | u32 send_q_mem_reg_offset; | 1283 | u32 send_q_mem_reg_offset; |
1286 | ucc_geth_thread_data_tx_t *p_thread_data_tx; | 1284 | struct ucc_geth_thread_data_tx *p_thread_data_tx; |
1287 | u32 thread_dat_tx_offset; | 1285 | u32 thread_dat_tx_offset; |
1288 | ucc_geth_thread_data_rx_t *p_thread_data_rx; | 1286 | struct ucc_geth_thread_data_rx *p_thread_data_rx; |
1289 | u32 thread_dat_rx_offset; | 1287 | u32 thread_dat_rx_offset; |
1290 | ucc_geth_scheduler_t *p_scheduler; | 1288 | struct ucc_geth_scheduler *p_scheduler; |
1291 | u32 scheduler_offset; | 1289 | u32 scheduler_offset; |
1292 | ucc_geth_tx_firmware_statistics_pram_t *p_tx_fw_statistics_pram; | 1290 | struct ucc_geth_tx_firmware_statistics_pram *p_tx_fw_statistics_pram; |
1293 | u32 tx_fw_statistics_pram_offset; | 1291 | u32 tx_fw_statistics_pram_offset; |
1294 | ucc_geth_rx_firmware_statistics_pram_t *p_rx_fw_statistics_pram; | 1292 | struct ucc_geth_rx_firmware_statistics_pram *p_rx_fw_statistics_pram; |
1295 | u32 rx_fw_statistics_pram_offset; | 1293 | u32 rx_fw_statistics_pram_offset; |
1296 | ucc_geth_rx_interrupt_coalescing_table_t *p_rx_irq_coalescing_tbl; | 1294 | struct ucc_geth_rx_interrupt_coalescing_table *p_rx_irq_coalescing_tbl; |
1297 | u32 rx_irq_coalescing_tbl_offset; | 1295 | u32 rx_irq_coalescing_tbl_offset; |
1298 | ucc_geth_rx_bd_queues_entry_t *p_rx_bd_qs_tbl; | 1296 | struct ucc_geth_rx_bd_queues_entry *p_rx_bd_qs_tbl; |
1299 | u32 rx_bd_qs_tbl_offset; | 1297 | u32 rx_bd_qs_tbl_offset; |
1300 | u8 *p_tx_bd_ring[NUM_TX_QUEUES]; | 1298 | u8 *p_tx_bd_ring[NUM_TX_QUEUES]; |
1301 | u32 tx_bd_ring_offset[NUM_TX_QUEUES]; | 1299 | u32 tx_bd_ring_offset[NUM_TX_QUEUES]; |
@@ -1308,7 +1306,7 @@ typedef struct ucc_geth_private { | |||
1308 | u16 cpucount[NUM_TX_QUEUES]; | 1306 | u16 cpucount[NUM_TX_QUEUES]; |
1309 | volatile u16 *p_cpucount[NUM_TX_QUEUES]; | 1307 | volatile u16 *p_cpucount[NUM_TX_QUEUES]; |
1310 | int indAddrRegUsed[NUM_OF_PADDRS]; | 1308 | int indAddrRegUsed[NUM_OF_PADDRS]; |
1311 | enet_addr_t paddr[NUM_OF_PADDRS]; | 1309 | u8 paddr[NUM_OF_PADDRS][ENET_NUM_OCTETS_PER_ADDRESS]; /* ethernet address */ |
1312 | u8 numGroupAddrInHash; | 1310 | u8 numGroupAddrInHash; |
1313 | u8 numIndAddrInHash; | 1311 | u8 numIndAddrInHash; |
1314 | u8 numIndAddrInReg; | 1312 | u8 numIndAddrInReg; |
@@ -1334,6 +1332,6 @@ typedef struct ucc_geth_private { | |||
1334 | int oldspeed; | 1332 | int oldspeed; |
1335 | int oldduplex; | 1333 | int oldduplex; |
1336 | int oldlink; | 1334 | int oldlink; |
1337 | } ucc_geth_private_t; | 1335 | }; |
1338 | 1336 | ||
1339 | #endif /* __UCC_GETH_H__ */ | 1337 | #endif /* __UCC_GETH_H__ */ |
diff --git a/drivers/net/ucc_geth_phy.c b/drivers/net/ucc_geth_phy.c index 67260eb3188a..5360ec05eaa3 100644 --- a/drivers/net/ucc_geth_phy.c +++ b/drivers/net/ucc_geth_phy.c | |||
@@ -42,7 +42,6 @@ | |||
42 | 42 | ||
43 | #include "ucc_geth.h" | 43 | #include "ucc_geth.h" |
44 | #include "ucc_geth_phy.h" | 44 | #include "ucc_geth_phy.h" |
45 | #include <platforms/83xx/mpc8360e_pb.h> | ||
46 | 45 | ||
47 | #define ugphy_printk(level, format, arg...) \ | 46 | #define ugphy_printk(level, format, arg...) \ |
48 | printk(level format "\n", ## arg) | 47 | printk(level format "\n", ## arg) |
@@ -72,16 +71,14 @@ static int genmii_read_status(struct ugeth_mii_info *mii_info); | |||
72 | u16 phy_read(struct ugeth_mii_info *mii_info, u16 regnum); | 71 | u16 phy_read(struct ugeth_mii_info *mii_info, u16 regnum); |
73 | void phy_write(struct ugeth_mii_info *mii_info, u16 regnum, u16 val); | 72 | void phy_write(struct ugeth_mii_info *mii_info, u16 regnum, u16 val); |
74 | 73 | ||
75 | static u8 *bcsr_regs = NULL; | ||
76 | |||
77 | /* Write value to the PHY for this device to the register at regnum, */ | 74 | /* Write value to the PHY for this device to the register at regnum, */ |
78 | /* waiting until the write is done before it returns. All PHY */ | 75 | /* waiting until the write is done before it returns. All PHY */ |
79 | /* configuration has to be done through the TSEC1 MIIM regs */ | 76 | /* configuration has to be done through the TSEC1 MIIM regs */ |
80 | void write_phy_reg(struct net_device *dev, int mii_id, int regnum, int value) | 77 | void write_phy_reg(struct net_device *dev, int mii_id, int regnum, int value) |
81 | { | 78 | { |
82 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 79 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
83 | ucc_mii_mng_t *mii_regs; | 80 | struct ucc_mii_mng *mii_regs; |
84 | enet_tbi_mii_reg_e mii_reg = (enet_tbi_mii_reg_e) regnum; | 81 | enum enet_tbi_mii_reg mii_reg = (enum enet_tbi_mii_reg) regnum; |
85 | u32 tmp_reg; | 82 | u32 tmp_reg; |
86 | 83 | ||
87 | ugphy_vdbg("%s: IN", __FUNCTION__); | 84 | ugphy_vdbg("%s: IN", __FUNCTION__); |
@@ -116,9 +113,9 @@ void write_phy_reg(struct net_device *dev, int mii_id, int regnum, int value) | |||
116 | /* configuration has to be done through the TSEC1 MIIM regs */ | 113 | /* configuration has to be done through the TSEC1 MIIM regs */ |
117 | int read_phy_reg(struct net_device *dev, int mii_id, int regnum) | 114 | int read_phy_reg(struct net_device *dev, int mii_id, int regnum) |
118 | { | 115 | { |
119 | ucc_geth_private_t *ugeth = netdev_priv(dev); | 116 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
120 | ucc_mii_mng_t *mii_regs; | 117 | struct ucc_mii_mng *mii_regs; |
121 | enet_tbi_mii_reg_e mii_reg = (enet_tbi_mii_reg_e) regnum; | 118 | enum enet_tbi_mii_reg mii_reg = (enum enet_tbi_mii_reg) regnum; |
122 | u32 tmp_reg; | 119 | u32 tmp_reg; |
123 | u16 value; | 120 | u16 value; |
124 | 121 | ||
@@ -634,11 +631,6 @@ static void dm9161_close(struct ugeth_mii_info *mii_info) | |||
634 | 631 | ||
635 | static int dm9161_ack_interrupt(struct ugeth_mii_info *mii_info) | 632 | static int dm9161_ack_interrupt(struct ugeth_mii_info *mii_info) |
636 | { | 633 | { |
637 | /* FIXME: This lines are for BUG fixing in the mpc8325. | ||
638 | Remove this from here when it's fixed */ | ||
639 | if (bcsr_regs == NULL) | ||
640 | bcsr_regs = (u8 *) ioremap(BCSR_PHYS_ADDR, BCSR_SIZE); | ||
641 | bcsr_regs[14] |= 0x40; | ||
642 | ugphy_vdbg("%s: IN", __FUNCTION__); | 634 | ugphy_vdbg("%s: IN", __FUNCTION__); |
643 | 635 | ||
644 | /* Clear the interrupts by reading the reg */ | 636 | /* Clear the interrupts by reading the reg */ |
@@ -650,12 +642,6 @@ Remove this from here when it's fixed */ | |||
650 | 642 | ||
651 | static int dm9161_config_intr(struct ugeth_mii_info *mii_info) | 643 | static int dm9161_config_intr(struct ugeth_mii_info *mii_info) |
652 | { | 644 | { |
653 | /* FIXME: This lines are for BUG fixing in the mpc8325. | ||
654 | Remove this from here when it's fixed */ | ||
655 | if (bcsr_regs == NULL) { | ||
656 | bcsr_regs = (u8 *) ioremap(BCSR_PHYS_ADDR, BCSR_SIZE); | ||
657 | bcsr_regs[14] &= ~0x40; | ||
658 | } | ||
659 | ugphy_vdbg("%s: IN", __FUNCTION__); | 645 | ugphy_vdbg("%s: IN", __FUNCTION__); |
660 | 646 | ||
661 | if (mii_info->interrupts == MII_INTERRUPT_ENABLED) | 647 | if (mii_info->interrupts == MII_INTERRUPT_ENABLED) |
diff --git a/drivers/net/ucc_geth_phy.h b/drivers/net/ucc_geth_phy.h index 2f98b8f1bb0a..f5740783670f 100644 --- a/drivers/net/ucc_geth_phy.h +++ b/drivers/net/ucc_geth_phy.h | |||
@@ -126,7 +126,7 @@ struct ugeth_mii_info { | |||
126 | /* And management functions */ | 126 | /* And management functions */ |
127 | struct phy_info *phyinfo; | 127 | struct phy_info *phyinfo; |
128 | 128 | ||
129 | ucc_mii_mng_t *mii_regs; | 129 | struct ucc_mii_mng *mii_regs; |
130 | 130 | ||
131 | /* forced speed & duplex (no autoneg) | 131 | /* forced speed & duplex (no autoneg) |
132 | * partner speed & duplex & pause (autoneg) | 132 | * partner speed & duplex & pause (autoneg) |
diff --git a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig index 58b7efbb0750..b5d0d7fb647a 100644 --- a/drivers/net/wan/Kconfig +++ b/drivers/net/wan/Kconfig | |||
@@ -127,7 +127,7 @@ config LANMEDIA | |||
127 | # There is no way to detect a Sealevel board. Force it modular | 127 | # There is no way to detect a Sealevel board. Force it modular |
128 | config SEALEVEL_4021 | 128 | config SEALEVEL_4021 |
129 | tristate "Sealevel Systems 4021 support" | 129 | tristate "Sealevel Systems 4021 support" |
130 | depends on WAN && ISA && m && ISA_DMA_API | 130 | depends on WAN && ISA && m && ISA_DMA_API && INET |
131 | help | 131 | help |
132 | This is a driver for the Sealevel Systems ACB 56 serial I/O adapter. | 132 | This is a driver for the Sealevel Systems ACB 56 serial I/O adapter. |
133 | 133 | ||
diff --git a/drivers/net/wan/n2.c b/drivers/net/wan/n2.c index dcf46add3adf..5c322dfb79f6 100644 --- a/drivers/net/wan/n2.c +++ b/drivers/net/wan/n2.c | |||
@@ -500,7 +500,7 @@ static int __init n2_init(void) | |||
500 | #ifdef MODULE | 500 | #ifdef MODULE |
501 | printk(KERN_INFO "n2: no card initialized\n"); | 501 | printk(KERN_INFO "n2: no card initialized\n"); |
502 | #endif | 502 | #endif |
503 | return -ENOSYS; /* no parameters specified, abort */ | 503 | return -EINVAL; /* no parameters specified, abort */ |
504 | } | 504 | } |
505 | 505 | ||
506 | printk(KERN_INFO "%s\n", version); | 506 | printk(KERN_INFO "%s\n", version); |
@@ -538,11 +538,11 @@ static int __init n2_init(void) | |||
538 | n2_run(io, irq, ram, valid[0], valid[1]); | 538 | n2_run(io, irq, ram, valid[0], valid[1]); |
539 | 539 | ||
540 | if (*hw == '\x0') | 540 | if (*hw == '\x0') |
541 | return first_card ? 0 : -ENOSYS; | 541 | return first_card ? 0 : -EINVAL; |
542 | }while(*hw++ == ':'); | 542 | }while(*hw++ == ':'); |
543 | 543 | ||
544 | printk(KERN_ERR "n2: invalid hardware parameters\n"); | 544 | printk(KERN_ERR "n2: invalid hardware parameters\n"); |
545 | return first_card ? 0 : -ENOSYS; | 545 | return first_card ? 0 : -EINVAL; |
546 | } | 546 | } |
547 | 547 | ||
548 | 548 | ||
diff --git a/drivers/net/wan/pc300_drv.c b/drivers/net/wan/pc300_drv.c index 5823e3bca178..36d1c3ff7078 100644 --- a/drivers/net/wan/pc300_drv.c +++ b/drivers/net/wan/pc300_drv.c | |||
@@ -2867,7 +2867,6 @@ static int ch_config(pc300dev_t * d) | |||
2867 | uclong clktype = chan->conf.phys_settings.clock_type; | 2867 | uclong clktype = chan->conf.phys_settings.clock_type; |
2868 | ucshort encoding = chan->conf.proto_settings.encoding; | 2868 | ucshort encoding = chan->conf.proto_settings.encoding; |
2869 | ucshort parity = chan->conf.proto_settings.parity; | 2869 | ucshort parity = chan->conf.proto_settings.parity; |
2870 | int tmc, br; | ||
2871 | ucchar md0, md2; | 2870 | ucchar md0, md2; |
2872 | 2871 | ||
2873 | /* Reset the channel */ | 2872 | /* Reset the channel */ |
@@ -2940,8 +2939,12 @@ static int ch_config(pc300dev_t * d) | |||
2940 | case PC300_RSV: | 2939 | case PC300_RSV: |
2941 | case PC300_X21: | 2940 | case PC300_X21: |
2942 | if (clktype == CLOCK_INT || clktype == CLOCK_TXINT) { | 2941 | if (clktype == CLOCK_INT || clktype == CLOCK_TXINT) { |
2942 | int tmc, br; | ||
2943 | |||
2943 | /* Calculate the clkrate parameters */ | 2944 | /* Calculate the clkrate parameters */ |
2944 | tmc = clock_rate_calc(clkrate, card->hw.clock, &br); | 2945 | tmc = clock_rate_calc(clkrate, card->hw.clock, &br); |
2946 | if (tmc < 0) | ||
2947 | return -EIO; | ||
2945 | cpc_writeb(scabase + M_REG(TMCT, ch), tmc); | 2948 | cpc_writeb(scabase + M_REG(TMCT, ch), tmc); |
2946 | cpc_writeb(scabase + M_REG(TXS, ch), | 2949 | cpc_writeb(scabase + M_REG(TXS, ch), |
2947 | (TXS_DTRXC | TXS_IBRG | br)); | 2950 | (TXS_DTRXC | TXS_IBRG | br)); |
@@ -3097,14 +3100,16 @@ static int cpc_attach(struct net_device *dev, unsigned short encoding, | |||
3097 | return 0; | 3100 | return 0; |
3098 | } | 3101 | } |
3099 | 3102 | ||
3100 | static void cpc_opench(pc300dev_t * d) | 3103 | static int cpc_opench(pc300dev_t * d) |
3101 | { | 3104 | { |
3102 | pc300ch_t *chan = (pc300ch_t *) d->chan; | 3105 | pc300ch_t *chan = (pc300ch_t *) d->chan; |
3103 | pc300_t *card = (pc300_t *) chan->card; | 3106 | pc300_t *card = (pc300_t *) chan->card; |
3104 | int ch = chan->channel; | 3107 | int ch = chan->channel, rc; |
3105 | void __iomem *scabase = card->hw.scabase; | 3108 | void __iomem *scabase = card->hw.scabase; |
3106 | 3109 | ||
3107 | ch_config(d); | 3110 | rc = ch_config(d); |
3111 | if (rc) | ||
3112 | return rc; | ||
3108 | 3113 | ||
3109 | rx_config(d); | 3114 | rx_config(d); |
3110 | 3115 | ||
@@ -3113,6 +3118,8 @@ static void cpc_opench(pc300dev_t * d) | |||
3113 | /* Assert RTS and DTR */ | 3118 | /* Assert RTS and DTR */ |
3114 | cpc_writeb(scabase + M_REG(CTL, ch), | 3119 | cpc_writeb(scabase + M_REG(CTL, ch), |
3115 | cpc_readb(scabase + M_REG(CTL, ch)) & ~(CTL_RTS | CTL_DTR)); | 3120 | cpc_readb(scabase + M_REG(CTL, ch)) & ~(CTL_RTS | CTL_DTR)); |
3121 | |||
3122 | return 0; | ||
3116 | } | 3123 | } |
3117 | 3124 | ||
3118 | static void cpc_closech(pc300dev_t * d) | 3125 | static void cpc_closech(pc300dev_t * d) |
@@ -3168,9 +3175,16 @@ int cpc_open(struct net_device *dev) | |||
3168 | } | 3175 | } |
3169 | 3176 | ||
3170 | sprintf(ifr.ifr_name, "%s", dev->name); | 3177 | sprintf(ifr.ifr_name, "%s", dev->name); |
3171 | cpc_opench(d); | 3178 | result = cpc_opench(d); |
3179 | if (result) | ||
3180 | goto err_out; | ||
3181 | |||
3172 | netif_start_queue(dev); | 3182 | netif_start_queue(dev); |
3173 | return 0; | 3183 | return 0; |
3184 | |||
3185 | err_out: | ||
3186 | hdlc_close(dev); | ||
3187 | return result; | ||
3174 | } | 3188 | } |
3175 | 3189 | ||
3176 | static int cpc_close(struct net_device *dev) | 3190 | static int cpc_close(struct net_device *dev) |
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c index 0a33c8a56e13..efcdaf1c5f73 100644 --- a/drivers/net/wireless/airo.c +++ b/drivers/net/wireless/airo.c | |||
@@ -2897,6 +2897,8 @@ static struct net_device *_init_airo_card( unsigned short irq, int port, | |||
2897 | goto err_out_map; | 2897 | goto err_out_map; |
2898 | } | 2898 | } |
2899 | ai->wifidev = init_wifidev(ai, dev); | 2899 | ai->wifidev = init_wifidev(ai, dev); |
2900 | if (!ai->wifidev) | ||
2901 | goto err_out_reg; | ||
2900 | 2902 | ||
2901 | set_bit(FLAG_REGISTERED,&ai->flags); | 2903 | set_bit(FLAG_REGISTERED,&ai->flags); |
2902 | airo_print_info(dev->name, "MAC enabled %x:%x:%x:%x:%x:%x", | 2904 | airo_print_info(dev->name, "MAC enabled %x:%x:%x:%x:%x:%x", |
@@ -2908,11 +2910,18 @@ static struct net_device *_init_airo_card( unsigned short irq, int port, | |||
2908 | for( i = 0; i < MAX_FIDS; i++ ) | 2910 | for( i = 0; i < MAX_FIDS; i++ ) |
2909 | ai->fids[i] = transmit_allocate(ai,AIRO_DEF_MTU,i>=MAX_FIDS/2); | 2911 | ai->fids[i] = transmit_allocate(ai,AIRO_DEF_MTU,i>=MAX_FIDS/2); |
2910 | 2912 | ||
2911 | setup_proc_entry( dev, dev->priv ); /* XXX check for failure */ | 2913 | if (setup_proc_entry(dev, dev->priv) < 0) |
2914 | goto err_out_wifi; | ||
2915 | |||
2912 | netif_start_queue(dev); | 2916 | netif_start_queue(dev); |
2913 | SET_MODULE_OWNER(dev); | 2917 | SET_MODULE_OWNER(dev); |
2914 | return dev; | 2918 | return dev; |
2915 | 2919 | ||
2920 | err_out_wifi: | ||
2921 | unregister_netdev(ai->wifidev); | ||
2922 | free_netdev(ai->wifidev); | ||
2923 | err_out_reg: | ||
2924 | unregister_netdev(dev); | ||
2916 | err_out_map: | 2925 | err_out_map: |
2917 | if (test_bit(FLAG_MPI,&ai->flags) && pci) { | 2926 | if (test_bit(FLAG_MPI,&ai->flags) && pci) { |
2918 | pci_free_consistent(pci, PCI_SHARED_LEN, ai->shared, ai->shared_dma); | 2927 | pci_free_consistent(pci, PCI_SHARED_LEN, ai->shared, ai->shared_dma); |
@@ -3089,7 +3098,8 @@ static int airo_thread(void *data) { | |||
3089 | set_bit(JOB_AUTOWEP, &ai->jobs); | 3098 | set_bit(JOB_AUTOWEP, &ai->jobs); |
3090 | break; | 3099 | break; |
3091 | } | 3100 | } |
3092 | if (!kthread_should_stop()) { | 3101 | if (!kthread_should_stop() && |
3102 | !freezing(current)) { | ||
3093 | unsigned long wake_at; | 3103 | unsigned long wake_at; |
3094 | if (!ai->expires || !ai->scan_timeout) { | 3104 | if (!ai->expires || !ai->scan_timeout) { |
3095 | wake_at = max(ai->expires, | 3105 | wake_at = max(ai->expires, |
@@ -3101,7 +3111,8 @@ static int airo_thread(void *data) { | |||
3101 | schedule_timeout(wake_at - jiffies); | 3111 | schedule_timeout(wake_at - jiffies); |
3102 | continue; | 3112 | continue; |
3103 | } | 3113 | } |
3104 | } else if (!kthread_should_stop()) { | 3114 | } else if (!kthread_should_stop() && |
3115 | !freezing(current)) { | ||
3105 | schedule(); | 3116 | schedule(); |
3106 | continue; | 3117 | continue; |
3107 | } | 3118 | } |
@@ -4495,91 +4506,128 @@ static int setup_proc_entry( struct net_device *dev, | |||
4495 | apriv->proc_entry = create_proc_entry(apriv->proc_name, | 4506 | apriv->proc_entry = create_proc_entry(apriv->proc_name, |
4496 | S_IFDIR|airo_perm, | 4507 | S_IFDIR|airo_perm, |
4497 | airo_entry); | 4508 | airo_entry); |
4498 | apriv->proc_entry->uid = proc_uid; | 4509 | if (!apriv->proc_entry) |
4499 | apriv->proc_entry->gid = proc_gid; | 4510 | goto fail; |
4500 | apriv->proc_entry->owner = THIS_MODULE; | 4511 | apriv->proc_entry->uid = proc_uid; |
4512 | apriv->proc_entry->gid = proc_gid; | ||
4513 | apriv->proc_entry->owner = THIS_MODULE; | ||
4501 | 4514 | ||
4502 | /* Setup the StatsDelta */ | 4515 | /* Setup the StatsDelta */ |
4503 | entry = create_proc_entry("StatsDelta", | 4516 | entry = create_proc_entry("StatsDelta", |
4504 | S_IFREG | (S_IRUGO&proc_perm), | 4517 | S_IFREG | (S_IRUGO&proc_perm), |
4505 | apriv->proc_entry); | 4518 | apriv->proc_entry); |
4506 | entry->uid = proc_uid; | 4519 | if (!entry) |
4507 | entry->gid = proc_gid; | 4520 | goto fail_stats_delta; |
4521 | entry->uid = proc_uid; | ||
4522 | entry->gid = proc_gid; | ||
4508 | entry->data = dev; | 4523 | entry->data = dev; |
4509 | entry->owner = THIS_MODULE; | 4524 | entry->owner = THIS_MODULE; |
4510 | SETPROC_OPS(entry, proc_statsdelta_ops); | 4525 | SETPROC_OPS(entry, proc_statsdelta_ops); |
4511 | 4526 | ||
4512 | /* Setup the Stats */ | 4527 | /* Setup the Stats */ |
4513 | entry = create_proc_entry("Stats", | 4528 | entry = create_proc_entry("Stats", |
4514 | S_IFREG | (S_IRUGO&proc_perm), | 4529 | S_IFREG | (S_IRUGO&proc_perm), |
4515 | apriv->proc_entry); | 4530 | apriv->proc_entry); |
4516 | entry->uid = proc_uid; | 4531 | if (!entry) |
4517 | entry->gid = proc_gid; | 4532 | goto fail_stats; |
4533 | entry->uid = proc_uid; | ||
4534 | entry->gid = proc_gid; | ||
4518 | entry->data = dev; | 4535 | entry->data = dev; |
4519 | entry->owner = THIS_MODULE; | 4536 | entry->owner = THIS_MODULE; |
4520 | SETPROC_OPS(entry, proc_stats_ops); | 4537 | SETPROC_OPS(entry, proc_stats_ops); |
4521 | 4538 | ||
4522 | /* Setup the Status */ | 4539 | /* Setup the Status */ |
4523 | entry = create_proc_entry("Status", | 4540 | entry = create_proc_entry("Status", |
4524 | S_IFREG | (S_IRUGO&proc_perm), | 4541 | S_IFREG | (S_IRUGO&proc_perm), |
4525 | apriv->proc_entry); | 4542 | apriv->proc_entry); |
4526 | entry->uid = proc_uid; | 4543 | if (!entry) |
4527 | entry->gid = proc_gid; | 4544 | goto fail_status; |
4545 | entry->uid = proc_uid; | ||
4546 | entry->gid = proc_gid; | ||
4528 | entry->data = dev; | 4547 | entry->data = dev; |
4529 | entry->owner = THIS_MODULE; | 4548 | entry->owner = THIS_MODULE; |
4530 | SETPROC_OPS(entry, proc_status_ops); | 4549 | SETPROC_OPS(entry, proc_status_ops); |
4531 | 4550 | ||
4532 | /* Setup the Config */ | 4551 | /* Setup the Config */ |
4533 | entry = create_proc_entry("Config", | 4552 | entry = create_proc_entry("Config", |
4534 | S_IFREG | proc_perm, | 4553 | S_IFREG | proc_perm, |
4535 | apriv->proc_entry); | 4554 | apriv->proc_entry); |
4536 | entry->uid = proc_uid; | 4555 | if (!entry) |
4537 | entry->gid = proc_gid; | 4556 | goto fail_config; |
4557 | entry->uid = proc_uid; | ||
4558 | entry->gid = proc_gid; | ||
4538 | entry->data = dev; | 4559 | entry->data = dev; |
4539 | entry->owner = THIS_MODULE; | 4560 | entry->owner = THIS_MODULE; |
4540 | SETPROC_OPS(entry, proc_config_ops); | 4561 | SETPROC_OPS(entry, proc_config_ops); |
4541 | 4562 | ||
4542 | /* Setup the SSID */ | 4563 | /* Setup the SSID */ |
4543 | entry = create_proc_entry("SSID", | 4564 | entry = create_proc_entry("SSID", |
4544 | S_IFREG | proc_perm, | 4565 | S_IFREG | proc_perm, |
4545 | apriv->proc_entry); | 4566 | apriv->proc_entry); |
4546 | entry->uid = proc_uid; | 4567 | if (!entry) |
4547 | entry->gid = proc_gid; | 4568 | goto fail_ssid; |
4569 | entry->uid = proc_uid; | ||
4570 | entry->gid = proc_gid; | ||
4548 | entry->data = dev; | 4571 | entry->data = dev; |
4549 | entry->owner = THIS_MODULE; | 4572 | entry->owner = THIS_MODULE; |
4550 | SETPROC_OPS(entry, proc_SSID_ops); | 4573 | SETPROC_OPS(entry, proc_SSID_ops); |
4551 | 4574 | ||
4552 | /* Setup the APList */ | 4575 | /* Setup the APList */ |
4553 | entry = create_proc_entry("APList", | 4576 | entry = create_proc_entry("APList", |
4554 | S_IFREG | proc_perm, | 4577 | S_IFREG | proc_perm, |
4555 | apriv->proc_entry); | 4578 | apriv->proc_entry); |
4556 | entry->uid = proc_uid; | 4579 | if (!entry) |
4557 | entry->gid = proc_gid; | 4580 | goto fail_aplist; |
4581 | entry->uid = proc_uid; | ||
4582 | entry->gid = proc_gid; | ||
4558 | entry->data = dev; | 4583 | entry->data = dev; |
4559 | entry->owner = THIS_MODULE; | 4584 | entry->owner = THIS_MODULE; |
4560 | SETPROC_OPS(entry, proc_APList_ops); | 4585 | SETPROC_OPS(entry, proc_APList_ops); |
4561 | 4586 | ||
4562 | /* Setup the BSSList */ | 4587 | /* Setup the BSSList */ |
4563 | entry = create_proc_entry("BSSList", | 4588 | entry = create_proc_entry("BSSList", |
4564 | S_IFREG | proc_perm, | 4589 | S_IFREG | proc_perm, |
4565 | apriv->proc_entry); | 4590 | apriv->proc_entry); |
4591 | if (!entry) | ||
4592 | goto fail_bsslist; | ||
4566 | entry->uid = proc_uid; | 4593 | entry->uid = proc_uid; |
4567 | entry->gid = proc_gid; | 4594 | entry->gid = proc_gid; |
4568 | entry->data = dev; | 4595 | entry->data = dev; |
4569 | entry->owner = THIS_MODULE; | 4596 | entry->owner = THIS_MODULE; |
4570 | SETPROC_OPS(entry, proc_BSSList_ops); | 4597 | SETPROC_OPS(entry, proc_BSSList_ops); |
4571 | 4598 | ||
4572 | /* Setup the WepKey */ | 4599 | /* Setup the WepKey */ |
4573 | entry = create_proc_entry("WepKey", | 4600 | entry = create_proc_entry("WepKey", |
4574 | S_IFREG | proc_perm, | 4601 | S_IFREG | proc_perm, |
4575 | apriv->proc_entry); | 4602 | apriv->proc_entry); |
4576 | entry->uid = proc_uid; | 4603 | if (!entry) |
4577 | entry->gid = proc_gid; | 4604 | goto fail_wepkey; |
4605 | entry->uid = proc_uid; | ||
4606 | entry->gid = proc_gid; | ||
4578 | entry->data = dev; | 4607 | entry->data = dev; |
4579 | entry->owner = THIS_MODULE; | 4608 | entry->owner = THIS_MODULE; |
4580 | SETPROC_OPS(entry, proc_wepkey_ops); | 4609 | SETPROC_OPS(entry, proc_wepkey_ops); |
4581 | 4610 | ||
4582 | return 0; | 4611 | return 0; |
4612 | |||
4613 | fail_wepkey: | ||
4614 | remove_proc_entry("BSSList", apriv->proc_entry); | ||
4615 | fail_bsslist: | ||
4616 | remove_proc_entry("APList", apriv->proc_entry); | ||
4617 | fail_aplist: | ||
4618 | remove_proc_entry("SSID", apriv->proc_entry); | ||
4619 | fail_ssid: | ||
4620 | remove_proc_entry("Config", apriv->proc_entry); | ||
4621 | fail_config: | ||
4622 | remove_proc_entry("Status", apriv->proc_entry); | ||
4623 | fail_status: | ||
4624 | remove_proc_entry("Stats", apriv->proc_entry); | ||
4625 | fail_stats: | ||
4626 | remove_proc_entry("StatsDelta", apriv->proc_entry); | ||
4627 | fail_stats_delta: | ||
4628 | remove_proc_entry(apriv->proc_name, airo_entry); | ||
4629 | fail: | ||
4630 | return -ENOMEM; | ||
4583 | } | 4631 | } |
4584 | 4632 | ||
4585 | static int takedown_proc_entry( struct net_device *dev, | 4633 | static int takedown_proc_entry( struct net_device *dev, |
@@ -5924,7 +5972,6 @@ static int airo_get_essid(struct net_device *dev, | |||
5924 | 5972 | ||
5925 | /* Get the current SSID */ | 5973 | /* Get the current SSID */ |
5926 | memcpy(extra, status_rid.SSID, status_rid.SSIDlen); | 5974 | memcpy(extra, status_rid.SSID, status_rid.SSIDlen); |
5927 | extra[status_rid.SSIDlen] = '\0'; | ||
5928 | /* If none, we may want to get the one that was set */ | 5975 | /* If none, we may want to get the one that was set */ |
5929 | 5976 | ||
5930 | /* Push it out ! */ | 5977 | /* Push it out ! */ |
diff --git a/drivers/net/wireless/atmel.c b/drivers/net/wireless/atmel.c index 31eed85de60f..0c07b8b7250d 100644 --- a/drivers/net/wireless/atmel.c +++ b/drivers/net/wireless/atmel.c | |||
@@ -1678,11 +1678,9 @@ static int atmel_get_essid(struct net_device *dev, | |||
1678 | /* Get the current SSID */ | 1678 | /* Get the current SSID */ |
1679 | if (priv->new_SSID_size != 0) { | 1679 | if (priv->new_SSID_size != 0) { |
1680 | memcpy(extra, priv->new_SSID, priv->new_SSID_size); | 1680 | memcpy(extra, priv->new_SSID, priv->new_SSID_size); |
1681 | extra[priv->new_SSID_size] = '\0'; | ||
1682 | dwrq->length = priv->new_SSID_size; | 1681 | dwrq->length = priv->new_SSID_size; |
1683 | } else { | 1682 | } else { |
1684 | memcpy(extra, priv->SSID, priv->SSID_size); | 1683 | memcpy(extra, priv->SSID, priv->SSID_size); |
1685 | extra[priv->SSID_size] = '\0'; | ||
1686 | dwrq->length = priv->SSID_size; | 1684 | dwrq->length = priv->SSID_size; |
1687 | } | 1685 | } |
1688 | 1686 | ||
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_dma.c b/drivers/net/wireless/bcm43xx/bcm43xx_dma.c index 76e3aed4b471..978ed099e285 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_dma.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_dma.c | |||
@@ -705,11 +705,30 @@ int bcm43xx_dma_init(struct bcm43xx_private *bcm) | |||
705 | struct bcm43xx_dmaring *ring; | 705 | struct bcm43xx_dmaring *ring; |
706 | int err = -ENOMEM; | 706 | int err = -ENOMEM; |
707 | int dma64 = 0; | 707 | int dma64 = 0; |
708 | u32 sbtmstatehi; | 708 | u64 mask = bcm43xx_get_supported_dma_mask(bcm); |
709 | int nobits; | ||
709 | 710 | ||
710 | sbtmstatehi = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATEHIGH); | 711 | if (mask == DMA_64BIT_MASK) { |
711 | if (sbtmstatehi & BCM43xx_SBTMSTATEHIGH_DMA64BIT) | ||
712 | dma64 = 1; | 712 | dma64 = 1; |
713 | nobits = 64; | ||
714 | } else if (mask == DMA_32BIT_MASK) | ||
715 | nobits = 32; | ||
716 | else | ||
717 | nobits = 30; | ||
718 | err = pci_set_dma_mask(bcm->pci_dev, mask); | ||
719 | err |= pci_set_consistent_dma_mask(bcm->pci_dev, mask); | ||
720 | if (err) { | ||
721 | #ifdef CONFIG_BCM43XX_PIO | ||
722 | printk(KERN_WARNING PFX "DMA not supported on this device." | ||
723 | " Falling back to PIO.\n"); | ||
724 | bcm->__using_pio = 1; | ||
725 | return -ENOSYS; | ||
726 | #else | ||
727 | printk(KERN_ERR PFX "FATAL: DMA not supported and PIO not configured. " | ||
728 | "Please recompile the driver with PIO support.\n"); | ||
729 | return -ENODEV; | ||
730 | #endif /* CONFIG_BCM43XX_PIO */ | ||
731 | } | ||
713 | 732 | ||
714 | /* setup TX DMA channels. */ | 733 | /* setup TX DMA channels. */ |
715 | ring = bcm43xx_setup_dmaring(bcm, 0, 1, dma64); | 734 | ring = bcm43xx_setup_dmaring(bcm, 0, 1, dma64); |
@@ -755,8 +774,7 @@ int bcm43xx_dma_init(struct bcm43xx_private *bcm) | |||
755 | dma->rx_ring3 = ring; | 774 | dma->rx_ring3 = ring; |
756 | } | 775 | } |
757 | 776 | ||
758 | dprintk(KERN_INFO PFX "%s DMA initialized\n", | 777 | dprintk(KERN_INFO PFX "%d-bit DMA initialized\n", nobits); |
759 | dma64 ? "64-bit" : "32-bit"); | ||
760 | err = 0; | 778 | err = 0; |
761 | out: | 779 | out: |
762 | return err; | 780 | return err; |
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_dma.h b/drivers/net/wireless/bcm43xx/bcm43xx_dma.h index e04bcaddd1d0..d1105e569a41 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_dma.h +++ b/drivers/net/wireless/bcm43xx/bcm43xx_dma.h | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <linux/list.h> | 4 | #include <linux/list.h> |
5 | #include <linux/spinlock.h> | 5 | #include <linux/spinlock.h> |
6 | #include <linux/workqueue.h> | 6 | #include <linux/workqueue.h> |
7 | #include <linux/dma-mapping.h> | ||
7 | #include <linux/linkage.h> | 8 | #include <linux/linkage.h> |
8 | #include <asm/atomic.h> | 9 | #include <asm/atomic.h> |
9 | 10 | ||
@@ -314,6 +315,23 @@ int bcm43xx_dma_tx(struct bcm43xx_private *bcm, | |||
314 | struct ieee80211_txb *txb); | 315 | struct ieee80211_txb *txb); |
315 | void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring); | 316 | void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring); |
316 | 317 | ||
318 | /* Helper function that returns the dma mask for this device. */ | ||
319 | static inline | ||
320 | u64 bcm43xx_get_supported_dma_mask(struct bcm43xx_private *bcm) | ||
321 | { | ||
322 | int dma64 = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATEHIGH) & | ||
323 | BCM43xx_SBTMSTATEHIGH_DMA64BIT; | ||
324 | u16 mmio_base = bcm43xx_dmacontroller_base(dma64, 0); | ||
325 | u32 mask = BCM43xx_DMA32_TXADDREXT_MASK; | ||
326 | |||
327 | if (dma64) | ||
328 | return DMA_64BIT_MASK; | ||
329 | bcm43xx_write32(bcm, mmio_base + BCM43xx_DMA32_TXCTL, mask); | ||
330 | if (bcm43xx_read32(bcm, mmio_base + BCM43xx_DMA32_TXCTL) & mask) | ||
331 | return DMA_32BIT_MASK; | ||
332 | return DMA_30BIT_MASK; | ||
333 | } | ||
334 | |||
317 | #else /* CONFIG_BCM43XX_DMA */ | 335 | #else /* CONFIG_BCM43XX_DMA */ |
318 | 336 | ||
319 | 337 | ||
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_leds.c b/drivers/net/wireless/bcm43xx/bcm43xx_leds.c index c3f90c8563d9..7d383a27b927 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_leds.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_leds.c | |||
@@ -189,20 +189,24 @@ void bcm43xx_leds_update(struct bcm43xx_private *bcm, int activity) | |||
189 | case BCM43xx_LED_INACTIVE: | 189 | case BCM43xx_LED_INACTIVE: |
190 | continue; | 190 | continue; |
191 | case BCM43xx_LED_OFF: | 191 | case BCM43xx_LED_OFF: |
192 | case BCM43xx_LED_BCM4303_3: | ||
192 | break; | 193 | break; |
193 | case BCM43xx_LED_ON: | 194 | case BCM43xx_LED_ON: |
194 | turn_on = 1; | 195 | turn_on = 1; |
195 | break; | 196 | break; |
196 | case BCM43xx_LED_ACTIVITY: | 197 | case BCM43xx_LED_ACTIVITY: |
198 | case BCM43xx_LED_BCM4303_0: | ||
197 | turn_on = activity; | 199 | turn_on = activity; |
198 | break; | 200 | break; |
199 | case BCM43xx_LED_RADIO_ALL: | 201 | case BCM43xx_LED_RADIO_ALL: |
200 | turn_on = radio->enabled; | 202 | turn_on = radio->enabled; |
201 | break; | 203 | break; |
202 | case BCM43xx_LED_RADIO_A: | 204 | case BCM43xx_LED_RADIO_A: |
205 | case BCM43xx_LED_BCM4303_2: | ||
203 | turn_on = (radio->enabled && phy->type == BCM43xx_PHYTYPE_A); | 206 | turn_on = (radio->enabled && phy->type == BCM43xx_PHYTYPE_A); |
204 | break; | 207 | break; |
205 | case BCM43xx_LED_RADIO_B: | 208 | case BCM43xx_LED_RADIO_B: |
209 | case BCM43xx_LED_BCM4303_1: | ||
206 | turn_on = (radio->enabled && | 210 | turn_on = (radio->enabled && |
207 | (phy->type == BCM43xx_PHYTYPE_B || | 211 | (phy->type == BCM43xx_PHYTYPE_B || |
208 | phy->type == BCM43xx_PHYTYPE_G)); | 212 | phy->type == BCM43xx_PHYTYPE_G)); |
@@ -242,7 +246,7 @@ void bcm43xx_leds_update(struct bcm43xx_private *bcm, int activity) | |||
242 | //TODO | 246 | //TODO |
243 | break; | 247 | break; |
244 | case BCM43xx_LED_ASSOC: | 248 | case BCM43xx_LED_ASSOC: |
245 | if (bcm->softmac->associated) | 249 | if (bcm->softmac->associnfo.associated) |
246 | turn_on = 1; | 250 | turn_on = 1; |
247 | break; | 251 | break; |
248 | #ifdef CONFIG_BCM43XX_DEBUG | 252 | #ifdef CONFIG_BCM43XX_DEBUG |
@@ -257,7 +261,8 @@ void bcm43xx_leds_update(struct bcm43xx_private *bcm, int activity) | |||
257 | continue; | 261 | continue; |
258 | #endif /* CONFIG_BCM43XX_DEBUG */ | 262 | #endif /* CONFIG_BCM43XX_DEBUG */ |
259 | default: | 263 | default: |
260 | assert(0); | 264 | dprintkl(KERN_INFO PFX "Bad value in leds_update," |
265 | " led->behaviour: 0x%x\n", led->behaviour); | ||
261 | }; | 266 | }; |
262 | 267 | ||
263 | if (led->activelow) | 268 | if (led->activelow) |
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_leds.h b/drivers/net/wireless/bcm43xx/bcm43xx_leds.h index d3716cf3aebc..811e14a81198 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_leds.h +++ b/drivers/net/wireless/bcm43xx/bcm43xx_leds.h | |||
@@ -46,6 +46,12 @@ enum { /* LED behaviour values */ | |||
46 | BCM43xx_LED_TEST_BLINKSLOW, | 46 | BCM43xx_LED_TEST_BLINKSLOW, |
47 | BCM43xx_LED_TEST_BLINKMEDIUM, | 47 | BCM43xx_LED_TEST_BLINKMEDIUM, |
48 | BCM43xx_LED_TEST_BLINKFAST, | 48 | BCM43xx_LED_TEST_BLINKFAST, |
49 | |||
50 | /* Misc values for BCM4303 */ | ||
51 | BCM43xx_LED_BCM4303_0 = 0x2B, | ||
52 | BCM43xx_LED_BCM4303_1 = 0x78, | ||
53 | BCM43xx_LED_BCM4303_2 = 0x2E, | ||
54 | BCM43xx_LED_BCM4303_3 = 0x19, | ||
49 | }; | 55 | }; |
50 | 56 | ||
51 | int bcm43xx_leds_init(struct bcm43xx_private *bcm); | 57 | int bcm43xx_leds_init(struct bcm43xx_private *bcm); |
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_main.c b/drivers/net/wireless/bcm43xx/bcm43xx_main.c index bad3452ea893..a1b783813d8e 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_main.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_main.c | |||
@@ -746,7 +746,7 @@ int bcm43xx_sprom_write(struct bcm43xx_private *bcm, const u16 *sprom) | |||
746 | if (err) | 746 | if (err) |
747 | goto err_ctlreg; | 747 | goto err_ctlreg; |
748 | spromctl |= 0x10; /* SPROM WRITE enable. */ | 748 | spromctl |= 0x10; /* SPROM WRITE enable. */ |
749 | bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_SPROMCTL, spromctl); | 749 | err = bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_SPROMCTL, spromctl); |
750 | if (err) | 750 | if (err) |
751 | goto err_ctlreg; | 751 | goto err_ctlreg; |
752 | /* We must burn lots of CPU cycles here, but that does not | 752 | /* We must burn lots of CPU cycles here, but that does not |
@@ -768,7 +768,7 @@ int bcm43xx_sprom_write(struct bcm43xx_private *bcm, const u16 *sprom) | |||
768 | mdelay(20); | 768 | mdelay(20); |
769 | } | 769 | } |
770 | spromctl &= ~0x10; /* SPROM WRITE enable. */ | 770 | spromctl &= ~0x10; /* SPROM WRITE enable. */ |
771 | bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_SPROMCTL, spromctl); | 771 | err = bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_SPROMCTL, spromctl); |
772 | if (err) | 772 | if (err) |
773 | goto err_ctlreg; | 773 | goto err_ctlreg; |
774 | mdelay(500); | 774 | mdelay(500); |
@@ -1463,6 +1463,23 @@ static void handle_irq_transmit_status(struct bcm43xx_private *bcm) | |||
1463 | } | 1463 | } |
1464 | } | 1464 | } |
1465 | 1465 | ||
1466 | static void drain_txstatus_queue(struct bcm43xx_private *bcm) | ||
1467 | { | ||
1468 | u32 dummy; | ||
1469 | |||
1470 | if (bcm->current_core->rev < 5) | ||
1471 | return; | ||
1472 | /* Read all entries from the microcode TXstatus FIFO | ||
1473 | * and throw them away. | ||
1474 | */ | ||
1475 | while (1) { | ||
1476 | dummy = bcm43xx_read32(bcm, BCM43xx_MMIO_XMITSTAT_0); | ||
1477 | if (!dummy) | ||
1478 | break; | ||
1479 | dummy = bcm43xx_read32(bcm, BCM43xx_MMIO_XMITSTAT_1); | ||
1480 | } | ||
1481 | } | ||
1482 | |||
1466 | static void bcm43xx_generate_noise_sample(struct bcm43xx_private *bcm) | 1483 | static void bcm43xx_generate_noise_sample(struct bcm43xx_private *bcm) |
1467 | { | 1484 | { |
1468 | bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x408, 0x7F7F); | 1485 | bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x408, 0x7F7F); |
@@ -2925,10 +2942,13 @@ static int bcm43xx_wireless_core_init(struct bcm43xx_private *bcm, | |||
2925 | bcm43xx_write16(bcm, 0x043C, 0x000C); | 2942 | bcm43xx_write16(bcm, 0x043C, 0x000C); |
2926 | 2943 | ||
2927 | if (active_wlcore) { | 2944 | if (active_wlcore) { |
2928 | if (bcm43xx_using_pio(bcm)) | 2945 | if (bcm43xx_using_pio(bcm)) { |
2929 | err = bcm43xx_pio_init(bcm); | 2946 | err = bcm43xx_pio_init(bcm); |
2930 | else | 2947 | } else { |
2931 | err = bcm43xx_dma_init(bcm); | 2948 | err = bcm43xx_dma_init(bcm); |
2949 | if (err == -ENOSYS) | ||
2950 | err = bcm43xx_pio_init(bcm); | ||
2951 | } | ||
2932 | if (err) | 2952 | if (err) |
2933 | goto err_chip_cleanup; | 2953 | goto err_chip_cleanup; |
2934 | } | 2954 | } |
@@ -3160,17 +3180,30 @@ static int estimate_periodic_work_badness(unsigned int state) | |||
3160 | static void bcm43xx_periodic_work_handler(void *d) | 3180 | static void bcm43xx_periodic_work_handler(void *d) |
3161 | { | 3181 | { |
3162 | struct bcm43xx_private *bcm = d; | 3182 | struct bcm43xx_private *bcm = d; |
3183 | struct net_device *net_dev = bcm->net_dev; | ||
3163 | unsigned long flags; | 3184 | unsigned long flags; |
3164 | u32 savedirqs = 0; | 3185 | u32 savedirqs = 0; |
3165 | int badness; | 3186 | int badness; |
3187 | unsigned long orig_trans_start = 0; | ||
3166 | 3188 | ||
3189 | mutex_lock(&bcm->mutex); | ||
3167 | badness = estimate_periodic_work_badness(bcm->periodic_state); | 3190 | badness = estimate_periodic_work_badness(bcm->periodic_state); |
3168 | if (badness > BADNESS_LIMIT) { | 3191 | if (badness > BADNESS_LIMIT) { |
3169 | /* Periodic work will take a long time, so we want it to | 3192 | /* Periodic work will take a long time, so we want it to |
3170 | * be preemtible. | 3193 | * be preemtible. |
3171 | */ | 3194 | */ |
3172 | mutex_lock(&bcm->mutex); | 3195 | |
3173 | netif_tx_disable(bcm->net_dev); | 3196 | netif_tx_lock_bh(net_dev); |
3197 | /* We must fake a started transmission here, as we are going to | ||
3198 | * disable TX. If we wouldn't fake a TX, it would be possible to | ||
3199 | * trigger the netdev watchdog, if the last real TX is already | ||
3200 | * some time on the past (slightly less than 5secs) | ||
3201 | */ | ||
3202 | orig_trans_start = net_dev->trans_start; | ||
3203 | net_dev->trans_start = jiffies; | ||
3204 | netif_stop_queue(net_dev); | ||
3205 | netif_tx_unlock_bh(net_dev); | ||
3206 | |||
3174 | spin_lock_irqsave(&bcm->irq_lock, flags); | 3207 | spin_lock_irqsave(&bcm->irq_lock, flags); |
3175 | bcm43xx_mac_suspend(bcm); | 3208 | bcm43xx_mac_suspend(bcm); |
3176 | if (bcm43xx_using_pio(bcm)) | 3209 | if (bcm43xx_using_pio(bcm)) |
@@ -3182,7 +3215,6 @@ static void bcm43xx_periodic_work_handler(void *d) | |||
3182 | /* Periodic work should take short time, so we want low | 3215 | /* Periodic work should take short time, so we want low |
3183 | * locking overhead. | 3216 | * locking overhead. |
3184 | */ | 3217 | */ |
3185 | mutex_lock(&bcm->mutex); | ||
3186 | spin_lock_irqsave(&bcm->irq_lock, flags); | 3218 | spin_lock_irqsave(&bcm->irq_lock, flags); |
3187 | } | 3219 | } |
3188 | 3220 | ||
@@ -3196,6 +3228,7 @@ static void bcm43xx_periodic_work_handler(void *d) | |||
3196 | bcm43xx_pio_thaw_txqueues(bcm); | 3228 | bcm43xx_pio_thaw_txqueues(bcm); |
3197 | bcm43xx_mac_enable(bcm); | 3229 | bcm43xx_mac_enable(bcm); |
3198 | netif_wake_queue(bcm->net_dev); | 3230 | netif_wake_queue(bcm->net_dev); |
3231 | net_dev->trans_start = orig_trans_start; | ||
3199 | } | 3232 | } |
3200 | mmiowb(); | 3233 | mmiowb(); |
3201 | spin_unlock_irqrestore(&bcm->irq_lock, flags); | 3234 | spin_unlock_irqrestore(&bcm->irq_lock, flags); |
@@ -3516,6 +3549,7 @@ int bcm43xx_select_wireless_core(struct bcm43xx_private *bcm, | |||
3516 | bcm43xx_macfilter_clear(bcm, BCM43xx_MACFILTER_ASSOC); | 3549 | bcm43xx_macfilter_clear(bcm, BCM43xx_MACFILTER_ASSOC); |
3517 | bcm43xx_macfilter_set(bcm, BCM43xx_MACFILTER_SELF, (u8 *)(bcm->net_dev->dev_addr)); | 3550 | bcm43xx_macfilter_set(bcm, BCM43xx_MACFILTER_SELF, (u8 *)(bcm->net_dev->dev_addr)); |
3518 | bcm43xx_security_init(bcm); | 3551 | bcm43xx_security_init(bcm); |
3552 | drain_txstatus_queue(bcm); | ||
3519 | ieee80211softmac_start(bcm->net_dev); | 3553 | ieee80211softmac_start(bcm->net_dev); |
3520 | 3554 | ||
3521 | /* Let's go! Be careful after enabling the IRQs. | 3555 | /* Let's go! Be careful after enabling the IRQs. |
@@ -3993,8 +4027,6 @@ static int bcm43xx_init_private(struct bcm43xx_private *bcm, | |||
3993 | struct net_device *net_dev, | 4027 | struct net_device *net_dev, |
3994 | struct pci_dev *pci_dev) | 4028 | struct pci_dev *pci_dev) |
3995 | { | 4029 | { |
3996 | int err; | ||
3997 | |||
3998 | bcm43xx_set_status(bcm, BCM43xx_STAT_UNINIT); | 4030 | bcm43xx_set_status(bcm, BCM43xx_STAT_UNINIT); |
3999 | bcm->ieee = netdev_priv(net_dev); | 4031 | bcm->ieee = netdev_priv(net_dev); |
4000 | bcm->softmac = ieee80211_priv(net_dev); | 4032 | bcm->softmac = ieee80211_priv(net_dev); |
@@ -4012,22 +4044,8 @@ static int bcm43xx_init_private(struct bcm43xx_private *bcm, | |||
4012 | (void (*)(unsigned long))bcm43xx_interrupt_tasklet, | 4044 | (void (*)(unsigned long))bcm43xx_interrupt_tasklet, |
4013 | (unsigned long)bcm); | 4045 | (unsigned long)bcm); |
4014 | tasklet_disable_nosync(&bcm->isr_tasklet); | 4046 | tasklet_disable_nosync(&bcm->isr_tasklet); |
4015 | if (modparam_pio) { | 4047 | if (modparam_pio) |
4016 | bcm->__using_pio = 1; | 4048 | bcm->__using_pio = 1; |
4017 | } else { | ||
4018 | err = pci_set_dma_mask(pci_dev, DMA_30BIT_MASK); | ||
4019 | err |= pci_set_consistent_dma_mask(pci_dev, DMA_30BIT_MASK); | ||
4020 | if (err) { | ||
4021 | #ifdef CONFIG_BCM43XX_PIO | ||
4022 | printk(KERN_WARNING PFX "DMA not supported. Falling back to PIO.\n"); | ||
4023 | bcm->__using_pio = 1; | ||
4024 | #else | ||
4025 | printk(KERN_ERR PFX "FATAL: DMA not supported and PIO not configured. " | ||
4026 | "Recompile the driver with PIO support, please.\n"); | ||
4027 | return -ENODEV; | ||
4028 | #endif /* CONFIG_BCM43XX_PIO */ | ||
4029 | } | ||
4030 | } | ||
4031 | bcm->rts_threshold = BCM43xx_DEFAULT_RTS_THRESHOLD; | 4049 | bcm->rts_threshold = BCM43xx_DEFAULT_RTS_THRESHOLD; |
4032 | 4050 | ||
4033 | /* default to sw encryption for now */ | 4051 | /* default to sw encryption for now */ |
@@ -4208,7 +4226,11 @@ static int bcm43xx_resume(struct pci_dev *pdev) | |||
4208 | dprintk(KERN_INFO PFX "Resuming...\n"); | 4226 | dprintk(KERN_INFO PFX "Resuming...\n"); |
4209 | 4227 | ||
4210 | pci_set_power_state(pdev, 0); | 4228 | pci_set_power_state(pdev, 0); |
4211 | pci_enable_device(pdev); | 4229 | err = pci_enable_device(pdev); |
4230 | if (err) { | ||
4231 | printk(KERN_ERR PFX "Failure with pci_enable_device!\n"); | ||
4232 | return err; | ||
4233 | } | ||
4212 | pci_restore_state(pdev); | 4234 | pci_restore_state(pdev); |
4213 | 4235 | ||
4214 | bcm43xx_chipset_attach(bcm); | 4236 | bcm43xx_chipset_attach(bcm); |
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c index 9b7b15cf6561..d27016f8c736 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c | |||
@@ -847,7 +847,7 @@ static struct iw_statistics *bcm43xx_get_wireless_stats(struct net_device *net_d | |||
847 | unsigned long flags; | 847 | unsigned long flags; |
848 | 848 | ||
849 | wstats = &bcm->stats.wstats; | 849 | wstats = &bcm->stats.wstats; |
850 | if (!mac->associated) { | 850 | if (!mac->associnfo.associated) { |
851 | wstats->miss.beacon = 0; | 851 | wstats->miss.beacon = 0; |
852 | // bcm->ieee->ieee_stats.tx_retry_limit_exceeded = 0; // FIXME: should this be cleared here? | 852 | // bcm->ieee->ieee_stats.tx_retry_limit_exceeded = 0; // FIXME: should this be cleared here? |
853 | wstats->discard.retries = 0; | 853 | wstats->discard.retries = 0; |
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index 686d895116de..f63909e4bc32 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
@@ -887,6 +887,13 @@ static struct pcmcia_device_id hostap_cs_ids[] = { | |||
887 | PCMCIA_DEVICE_PROD_ID123( | 887 | PCMCIA_DEVICE_PROD_ID123( |
888 | "U.S. Robotics", "IEEE 802.11b PC-CARD", "Version 01.02", | 888 | "U.S. Robotics", "IEEE 802.11b PC-CARD", "Version 01.02", |
889 | 0xc7b8df9d, 0x1700d087, 0x4b74baa0), | 889 | 0xc7b8df9d, 0x1700d087, 0x4b74baa0), |
890 | PCMCIA_DEVICE_PROD_ID123( | ||
891 | "Allied Telesyn", "AT-WCL452 Wireless PCMCIA Radio", | ||
892 | "Ver. 1.00", | ||
893 | 0x5cd01705, 0x4271660f, 0x9d08ee12), | ||
894 | PCMCIA_DEVICE_PROD_ID123( | ||
895 | "corega", "WL PCCL-11", "ISL37300P", | ||
896 | 0xa21501a, 0x59868926, 0xc9049a39), | ||
890 | PCMCIA_DEVICE_NULL | 897 | PCMCIA_DEVICE_NULL |
891 | }; | 898 | }; |
892 | MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids); | 899 | MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids); |
diff --git a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c index 6dfa041be66d..bc81b13a5a2a 100644 --- a/drivers/net/wireless/hostap/hostap_plx.c +++ b/drivers/net/wireless/hostap/hostap_plx.c | |||
@@ -364,7 +364,7 @@ static int prism2_plx_check_cis(void __iomem *attr_mem, int attr_len, | |||
364 | 364 | ||
365 | pos = 0; | 365 | pos = 0; |
366 | while (pos < CIS_MAX_LEN - 1 && cis[pos] != CISTPL_END) { | 366 | while (pos < CIS_MAX_LEN - 1 && cis[pos] != CISTPL_END) { |
367 | if (pos + cis[pos + 1] >= CIS_MAX_LEN) | 367 | if (pos + 2 + cis[pos + 1] > CIS_MAX_LEN) |
368 | goto cis_error; | 368 | goto cis_error; |
369 | 369 | ||
370 | switch (cis[pos]) { | 370 | switch (cis[pos]) { |
@@ -391,7 +391,7 @@ static int prism2_plx_check_cis(void __iomem *attr_mem, int attr_len, | |||
391 | break; | 391 | break; |
392 | 392 | ||
393 | case CISTPL_MANFID: | 393 | case CISTPL_MANFID: |
394 | if (cis[pos + 1] < 5) | 394 | if (cis[pos + 1] < 4) |
395 | goto cis_error; | 395 | goto cis_error; |
396 | manfid1 = cis[pos + 2] + (cis[pos + 3] << 8); | 396 | manfid1 = cis[pos + 2] + (cis[pos + 3] << 8); |
397 | manfid2 = cis[pos + 4] + (cis[pos + 5] << 8); | 397 | manfid2 = cis[pos + 4] + (cis[pos + 5] << 8); |
diff --git a/drivers/net/wireless/orinoco.c b/drivers/net/wireless/orinoco.c index b779c7dcc1a8..336cabac13b3 100644 --- a/drivers/net/wireless/orinoco.c +++ b/drivers/net/wireless/orinoco.c | |||
@@ -2457,6 +2457,7 @@ void free_orinocodev(struct net_device *dev) | |||
2457 | /* Wireless extensions */ | 2457 | /* Wireless extensions */ |
2458 | /********************************************************************/ | 2458 | /********************************************************************/ |
2459 | 2459 | ||
2460 | /* Return : < 0 -> error code ; >= 0 -> length */ | ||
2460 | static int orinoco_hw_get_essid(struct orinoco_private *priv, int *active, | 2461 | static int orinoco_hw_get_essid(struct orinoco_private *priv, int *active, |
2461 | char buf[IW_ESSID_MAX_SIZE+1]) | 2462 | char buf[IW_ESSID_MAX_SIZE+1]) |
2462 | { | 2463 | { |
@@ -2501,9 +2502,9 @@ static int orinoco_hw_get_essid(struct orinoco_private *priv, int *active, | |||
2501 | len = le16_to_cpu(essidbuf.len); | 2502 | len = le16_to_cpu(essidbuf.len); |
2502 | BUG_ON(len > IW_ESSID_MAX_SIZE); | 2503 | BUG_ON(len > IW_ESSID_MAX_SIZE); |
2503 | 2504 | ||
2504 | memset(buf, 0, IW_ESSID_MAX_SIZE+1); | 2505 | memset(buf, 0, IW_ESSID_MAX_SIZE); |
2505 | memcpy(buf, p, len); | 2506 | memcpy(buf, p, len); |
2506 | buf[len] = '\0'; | 2507 | err = len; |
2507 | 2508 | ||
2508 | fail_unlock: | 2509 | fail_unlock: |
2509 | orinoco_unlock(priv, &flags); | 2510 | orinoco_unlock(priv, &flags); |
@@ -3027,17 +3028,18 @@ static int orinoco_ioctl_getessid(struct net_device *dev, | |||
3027 | 3028 | ||
3028 | if (netif_running(dev)) { | 3029 | if (netif_running(dev)) { |
3029 | err = orinoco_hw_get_essid(priv, &active, essidbuf); | 3030 | err = orinoco_hw_get_essid(priv, &active, essidbuf); |
3030 | if (err) | 3031 | if (err < 0) |
3031 | return err; | 3032 | return err; |
3033 | erq->length = err; | ||
3032 | } else { | 3034 | } else { |
3033 | if (orinoco_lock(priv, &flags) != 0) | 3035 | if (orinoco_lock(priv, &flags) != 0) |
3034 | return -EBUSY; | 3036 | return -EBUSY; |
3035 | memcpy(essidbuf, priv->desired_essid, IW_ESSID_MAX_SIZE + 1); | 3037 | memcpy(essidbuf, priv->desired_essid, IW_ESSID_MAX_SIZE); |
3038 | erq->length = strlen(priv->desired_essid); | ||
3036 | orinoco_unlock(priv, &flags); | 3039 | orinoco_unlock(priv, &flags); |
3037 | } | 3040 | } |
3038 | 3041 | ||
3039 | erq->flags = 1; | 3042 | erq->flags = 1; |
3040 | erq->length = strlen(essidbuf); | ||
3041 | 3043 | ||
3042 | return 0; | 3044 | return 0; |
3043 | } | 3045 | } |
@@ -3075,10 +3077,10 @@ static int orinoco_ioctl_getnick(struct net_device *dev, | |||
3075 | if (orinoco_lock(priv, &flags) != 0) | 3077 | if (orinoco_lock(priv, &flags) != 0) |
3076 | return -EBUSY; | 3078 | return -EBUSY; |
3077 | 3079 | ||
3078 | memcpy(nickbuf, priv->nick, IW_ESSID_MAX_SIZE+1); | 3080 | memcpy(nickbuf, priv->nick, IW_ESSID_MAX_SIZE); |
3079 | orinoco_unlock(priv, &flags); | 3081 | orinoco_unlock(priv, &flags); |
3080 | 3082 | ||
3081 | nrq->length = strlen(nickbuf); | 3083 | nrq->length = strlen(priv->nick); |
3082 | 3084 | ||
3083 | return 0; | 3085 | return 0; |
3084 | } | 3086 | } |
diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c index 0b381d77015c..7fbfc9e41d07 100644 --- a/drivers/net/wireless/ray_cs.c +++ b/drivers/net/wireless/ray_cs.c | |||
@@ -1198,7 +1198,6 @@ static int ray_get_essid(struct net_device *dev, | |||
1198 | 1198 | ||
1199 | /* Get the essid that was set */ | 1199 | /* Get the essid that was set */ |
1200 | memcpy(extra, local->sparm.b5.a_current_ess_id, IW_ESSID_MAX_SIZE); | 1200 | memcpy(extra, local->sparm.b5.a_current_ess_id, IW_ESSID_MAX_SIZE); |
1201 | extra[IW_ESSID_MAX_SIZE] = '\0'; | ||
1202 | 1201 | ||
1203 | /* Push it out ! */ | 1202 | /* Push it out ! */ |
1204 | dwrq->length = strlen(extra); | 1203 | dwrq->length = strlen(extra); |
diff --git a/drivers/net/wireless/zd1201.c b/drivers/net/wireless/zd1201.c index 30057a335a7b..36b29ff05814 100644 --- a/drivers/net/wireless/zd1201.c +++ b/drivers/net/wireless/zd1201.c | |||
@@ -193,10 +193,8 @@ static void zd1201_usbrx(struct urb *urb) | |||
193 | struct sk_buff *skb; | 193 | struct sk_buff *skb; |
194 | unsigned char type; | 194 | unsigned char type; |
195 | 195 | ||
196 | if (!zd) { | 196 | if (!zd) |
197 | free = 1; | 197 | return; |
198 | goto exit; | ||
199 | } | ||
200 | 198 | ||
201 | switch(urb->status) { | 199 | switch(urb->status) { |
202 | case -EILSEQ: | 200 | case -EILSEQ: |
diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c index 2d12837052b0..a7d29bddb298 100644 --- a/drivers/net/wireless/zd1211rw/zd_mac.c +++ b/drivers/net/wireless/zd1211rw/zd_mac.c | |||
@@ -1099,7 +1099,7 @@ static void link_led_handler(void *p) | |||
1099 | int r; | 1099 | int r; |
1100 | 1100 | ||
1101 | spin_lock_irq(&mac->lock); | 1101 | spin_lock_irq(&mac->lock); |
1102 | is_associated = sm->associated != 0; | 1102 | is_associated = sm->associnfo.associated != 0; |
1103 | spin_unlock_irq(&mac->lock); | 1103 | spin_unlock_irq(&mac->lock); |
1104 | 1104 | ||
1105 | r = zd_chip_control_leds(chip, | 1105 | r = zd_chip_control_leds(chip, |
diff --git a/drivers/parport/parport_ip32.c b/drivers/parport/parport_ip32.c index e3e19277030a..ec44efdbb84e 100644 --- a/drivers/parport/parport_ip32.c +++ b/drivers/parport/parport_ip32.c | |||
@@ -780,7 +780,7 @@ static irqreturn_t parport_ip32_interrupt(int irq, void *dev_id) | |||
780 | enum parport_ip32_irq_mode irq_mode = priv->irq_mode; | 780 | enum parport_ip32_irq_mode irq_mode = priv->irq_mode; |
781 | switch (irq_mode) { | 781 | switch (irq_mode) { |
782 | case PARPORT_IP32_IRQ_FWD: | 782 | case PARPORT_IP32_IRQ_FWD: |
783 | parport_generic_irq(irq, p, regs); | 783 | parport_generic_irq(irq, p); |
784 | break; | 784 | break; |
785 | case PARPORT_IP32_IRQ_HERE: | 785 | case PARPORT_IP32_IRQ_HERE: |
786 | parport_ip32_wakeup(p); | 786 | parport_ip32_wakeup(p); |
diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig index ecc50db8585a..5f1b9f58070e 100644 --- a/drivers/pci/Kconfig +++ b/drivers/pci/Kconfig | |||
@@ -19,7 +19,7 @@ config PCI_MSI | |||
19 | 19 | ||
20 | config PCI_MULTITHREAD_PROBE | 20 | config PCI_MULTITHREAD_PROBE |
21 | bool "PCI Multi-threaded probe (EXPERIMENTAL)" | 21 | bool "PCI Multi-threaded probe (EXPERIMENTAL)" |
22 | depends on PCI && EXPERIMENTAL | 22 | depends on PCI && EXPERIMENTAL && BROKEN |
23 | help | 23 | help |
24 | Say Y here if you want the PCI core to spawn a new thread for | 24 | Say Y here if you want the PCI core to spawn a new thread for |
25 | every PCI device that is probed. This can cause a huge | 25 | every PCI device that is probed. This can cause a huge |
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index c44311ac2fd3..16167b016266 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
@@ -1807,8 +1807,8 @@ u8 acpiphp_get_power_status(struct acpiphp_slot *slot) | |||
1807 | 1807 | ||
1808 | 1808 | ||
1809 | /* | 1809 | /* |
1810 | * latch closed: 1 | 1810 | * latch open: 1 |
1811 | * latch open: 0 | 1811 | * latch closed: 0 |
1812 | */ | 1812 | */ |
1813 | u8 acpiphp_get_latch_status(struct acpiphp_slot *slot) | 1813 | u8 acpiphp_get_latch_status(struct acpiphp_slot *slot) |
1814 | { | 1814 | { |
@@ -1816,7 +1816,7 @@ u8 acpiphp_get_latch_status(struct acpiphp_slot *slot) | |||
1816 | 1816 | ||
1817 | sta = get_slot_status(slot); | 1817 | sta = get_slot_status(slot); |
1818 | 1818 | ||
1819 | return (sta & ACPI_STA_SHOW_IN_UI) ? 1 : 0; | 1819 | return (sta & ACPI_STA_SHOW_IN_UI) ? 0 : 1; |
1820 | } | 1820 | } |
1821 | 1821 | ||
1822 | 1822 | ||
diff --git a/drivers/pci/htirq.c b/drivers/pci/htirq.c index 0e27f2404a83..0a8d1cce9fa0 100644 --- a/drivers/pci/htirq.c +++ b/drivers/pci/htirq.c | |||
@@ -25,97 +25,72 @@ static DEFINE_SPINLOCK(ht_irq_lock); | |||
25 | 25 | ||
26 | struct ht_irq_cfg { | 26 | struct ht_irq_cfg { |
27 | struct pci_dev *dev; | 27 | struct pci_dev *dev; |
28 | /* Update callback used to cope with buggy hardware */ | ||
29 | ht_irq_update_t *update; | ||
28 | unsigned pos; | 30 | unsigned pos; |
29 | unsigned idx; | 31 | unsigned idx; |
32 | struct ht_irq_msg msg; | ||
30 | }; | 33 | }; |
31 | 34 | ||
32 | void write_ht_irq_low(unsigned int irq, u32 data) | ||
33 | { | ||
34 | struct ht_irq_cfg *cfg = get_irq_data(irq); | ||
35 | unsigned long flags; | ||
36 | spin_lock_irqsave(&ht_irq_lock, flags); | ||
37 | pci_write_config_byte(cfg->dev, cfg->pos + 2, cfg->idx); | ||
38 | pci_write_config_dword(cfg->dev, cfg->pos + 4, data); | ||
39 | spin_unlock_irqrestore(&ht_irq_lock, flags); | ||
40 | } | ||
41 | 35 | ||
42 | void write_ht_irq_high(unsigned int irq, u32 data) | 36 | void write_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg) |
43 | { | 37 | { |
44 | struct ht_irq_cfg *cfg = get_irq_data(irq); | 38 | struct ht_irq_cfg *cfg = get_irq_data(irq); |
45 | unsigned long flags; | 39 | unsigned long flags; |
46 | spin_lock_irqsave(&ht_irq_lock, flags); | 40 | spin_lock_irqsave(&ht_irq_lock, flags); |
47 | pci_write_config_byte(cfg->dev, cfg->pos + 2, cfg->idx + 1); | 41 | if (cfg->msg.address_lo != msg->address_lo) { |
48 | pci_write_config_dword(cfg->dev, cfg->pos + 4, data); | 42 | pci_write_config_byte(cfg->dev, cfg->pos + 2, cfg->idx); |
49 | spin_unlock_irqrestore(&ht_irq_lock, flags); | 43 | pci_write_config_dword(cfg->dev, cfg->pos + 4, msg->address_lo); |
50 | } | 44 | } |
51 | 45 | if (cfg->msg.address_hi != msg->address_hi) { | |
52 | u32 read_ht_irq_low(unsigned int irq) | 46 | pci_write_config_byte(cfg->dev, cfg->pos + 2, cfg->idx + 1); |
53 | { | 47 | pci_write_config_dword(cfg->dev, cfg->pos + 4, msg->address_hi); |
54 | struct ht_irq_cfg *cfg = get_irq_data(irq); | 48 | } |
55 | unsigned long flags; | 49 | if (cfg->update) |
56 | u32 data; | 50 | cfg->update(cfg->dev, irq, msg); |
57 | spin_lock_irqsave(&ht_irq_lock, flags); | ||
58 | pci_write_config_byte(cfg->dev, cfg->pos + 2, cfg->idx); | ||
59 | pci_read_config_dword(cfg->dev, cfg->pos + 4, &data); | ||
60 | spin_unlock_irqrestore(&ht_irq_lock, flags); | 51 | spin_unlock_irqrestore(&ht_irq_lock, flags); |
61 | return data; | 52 | cfg->msg = *msg; |
62 | } | 53 | } |
63 | 54 | ||
64 | u32 read_ht_irq_high(unsigned int irq) | 55 | void fetch_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg) |
65 | { | 56 | { |
66 | struct ht_irq_cfg *cfg = get_irq_data(irq); | 57 | struct ht_irq_cfg *cfg = get_irq_data(irq); |
67 | unsigned long flags; | 58 | *msg = cfg->msg; |
68 | u32 data; | ||
69 | spin_lock_irqsave(&ht_irq_lock, flags); | ||
70 | pci_write_config_byte(cfg->dev, cfg->pos + 2, cfg->idx + 1); | ||
71 | pci_read_config_dword(cfg->dev, cfg->pos + 4, &data); | ||
72 | spin_unlock_irqrestore(&ht_irq_lock, flags); | ||
73 | return data; | ||
74 | } | 59 | } |
75 | 60 | ||
76 | void mask_ht_irq(unsigned int irq) | 61 | void mask_ht_irq(unsigned int irq) |
77 | { | 62 | { |
78 | struct ht_irq_cfg *cfg; | 63 | struct ht_irq_cfg *cfg; |
79 | unsigned long flags; | 64 | struct ht_irq_msg msg; |
80 | u32 data; | ||
81 | 65 | ||
82 | cfg = get_irq_data(irq); | 66 | cfg = get_irq_data(irq); |
83 | 67 | ||
84 | spin_lock_irqsave(&ht_irq_lock, flags); | 68 | msg = cfg->msg; |
85 | pci_write_config_byte(cfg->dev, cfg->pos + 2, cfg->idx); | 69 | msg.address_lo |= 1; |
86 | pci_read_config_dword(cfg->dev, cfg->pos + 4, &data); | 70 | write_ht_irq_msg(irq, &msg); |
87 | data |= 1; | ||
88 | pci_write_config_dword(cfg->dev, cfg->pos + 4, data); | ||
89 | spin_unlock_irqrestore(&ht_irq_lock, flags); | ||
90 | } | 71 | } |
91 | 72 | ||
92 | void unmask_ht_irq(unsigned int irq) | 73 | void unmask_ht_irq(unsigned int irq) |
93 | { | 74 | { |
94 | struct ht_irq_cfg *cfg; | 75 | struct ht_irq_cfg *cfg; |
95 | unsigned long flags; | 76 | struct ht_irq_msg msg; |
96 | u32 data; | ||
97 | 77 | ||
98 | cfg = get_irq_data(irq); | 78 | cfg = get_irq_data(irq); |
99 | 79 | ||
100 | spin_lock_irqsave(&ht_irq_lock, flags); | 80 | msg = cfg->msg; |
101 | pci_write_config_byte(cfg->dev, cfg->pos + 2, cfg->idx); | 81 | msg.address_lo &= ~1; |
102 | pci_read_config_dword(cfg->dev, cfg->pos + 4, &data); | 82 | write_ht_irq_msg(irq, &msg); |
103 | data &= ~1; | ||
104 | pci_write_config_dword(cfg->dev, cfg->pos + 4, data); | ||
105 | spin_unlock_irqrestore(&ht_irq_lock, flags); | ||
106 | } | 83 | } |
107 | 84 | ||
108 | /** | 85 | /** |
109 | * ht_create_irq - create an irq and attach it to a device. | 86 | * __ht_create_irq - create an irq and attach it to a device. |
110 | * @dev: The hypertransport device to find the irq capability on. | 87 | * @dev: The hypertransport device to find the irq capability on. |
111 | * @idx: Which of the possible irqs to attach to. | 88 | * @idx: Which of the possible irqs to attach to. |
112 | * | 89 | * @update: Function to be called when changing the htirq message |
113 | * ht_create_irq is needs to be called for all hypertransport devices | ||
114 | * that generate irqs. | ||
115 | * | 90 | * |
116 | * The irq number of the new irq or a negative error value is returned. | 91 | * The irq number of the new irq or a negative error value is returned. |
117 | */ | 92 | */ |
118 | int ht_create_irq(struct pci_dev *dev, int idx) | 93 | int __ht_create_irq(struct pci_dev *dev, int idx, ht_irq_update_t *update) |
119 | { | 94 | { |
120 | struct ht_irq_cfg *cfg; | 95 | struct ht_irq_cfg *cfg; |
121 | unsigned long flags; | 96 | unsigned long flags; |
@@ -150,8 +125,12 @@ int ht_create_irq(struct pci_dev *dev, int idx) | |||
150 | return -ENOMEM; | 125 | return -ENOMEM; |
151 | 126 | ||
152 | cfg->dev = dev; | 127 | cfg->dev = dev; |
128 | cfg->update = update; | ||
153 | cfg->pos = pos; | 129 | cfg->pos = pos; |
154 | cfg->idx = 0x10 + (idx * 2); | 130 | cfg->idx = 0x10 + (idx * 2); |
131 | /* Initialize msg to a value that will never match the first write. */ | ||
132 | cfg->msg.address_lo = 0xffffffff; | ||
133 | cfg->msg.address_hi = 0xffffffff; | ||
155 | 134 | ||
156 | irq = create_irq(); | 135 | irq = create_irq(); |
157 | if (irq < 0) { | 136 | if (irq < 0) { |
@@ -169,6 +148,21 @@ int ht_create_irq(struct pci_dev *dev, int idx) | |||
169 | } | 148 | } |
170 | 149 | ||
171 | /** | 150 | /** |
151 | * ht_create_irq - create an irq and attach it to a device. | ||
152 | * @dev: The hypertransport device to find the irq capability on. | ||
153 | * @idx: Which of the possible irqs to attach to. | ||
154 | * | ||
155 | * ht_create_irq needs to be called for all hypertransport devices | ||
156 | * that generate irqs. | ||
157 | * | ||
158 | * The irq number of the new irq or a negative error value is returned. | ||
159 | */ | ||
160 | int ht_create_irq(struct pci_dev *dev, int idx) | ||
161 | { | ||
162 | return __ht_create_irq(dev, idx, NULL); | ||
163 | } | ||
164 | |||
165 | /** | ||
172 | * ht_destroy_irq - destroy an irq created with ht_create_irq | 166 | * ht_destroy_irq - destroy an irq created with ht_create_irq |
173 | * | 167 | * |
174 | * This reverses ht_create_irq removing the specified irq from | 168 | * This reverses ht_create_irq removing the specified irq from |
@@ -186,5 +180,6 @@ void ht_destroy_irq(unsigned int irq) | |||
186 | kfree(cfg); | 180 | kfree(cfg); |
187 | } | 181 | } |
188 | 182 | ||
183 | EXPORT_SYMBOL(__ht_create_irq); | ||
189 | EXPORT_SYMBOL(ht_create_irq); | 184 | EXPORT_SYMBOL(ht_create_irq); |
190 | EXPORT_SYMBOL(ht_destroy_irq); | 185 | EXPORT_SYMBOL(ht_destroy_irq); |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index b1c0c707d96c..194f1d21d3d7 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
@@ -265,6 +265,13 @@ static int pci_device_remove(struct device * dev) | |||
265 | } | 265 | } |
266 | 266 | ||
267 | /* | 267 | /* |
268 | * If the device is still on, set the power state as "unknown", | ||
269 | * since it might change by the next time we load the driver. | ||
270 | */ | ||
271 | if (pci_dev->current_state == PCI_D0) | ||
272 | pci_dev->current_state = PCI_UNKNOWN; | ||
273 | |||
274 | /* | ||
268 | * We would love to complain here if pci_dev->is_enabled is set, that | 275 | * We would love to complain here if pci_dev->is_enabled is set, that |
269 | * the driver should have called pci_disable_device(), but the | 276 | * the driver should have called pci_disable_device(), but the |
270 | * unfortunate fact is there are too many odd BIOS and bridge setups | 277 | * unfortunate fact is there are too many odd BIOS and bridge setups |
@@ -288,6 +295,12 @@ static int pci_device_suspend(struct device * dev, pm_message_t state) | |||
288 | suspend_report_result(drv->suspend, i); | 295 | suspend_report_result(drv->suspend, i); |
289 | } else { | 296 | } else { |
290 | pci_save_state(pci_dev); | 297 | pci_save_state(pci_dev); |
298 | /* | ||
299 | * mark its power state as "unknown", since we don't know if | ||
300 | * e.g. the BIOS will change its device state when we suspend. | ||
301 | */ | ||
302 | if (pci_dev->current_state == PCI_D0) | ||
303 | pci_dev->current_state = PCI_UNKNOWN; | ||
291 | } | 304 | } |
292 | return i; | 305 | return i; |
293 | } | 306 | } |
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index a1d2e979b17f..f952bfea48a6 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
@@ -642,6 +642,9 @@ err: | |||
642 | */ | 642 | */ |
643 | void pci_remove_sysfs_dev_files(struct pci_dev *pdev) | 643 | void pci_remove_sysfs_dev_files(struct pci_dev *pdev) |
644 | { | 644 | { |
645 | if (!sysfs_initialized) | ||
646 | return; | ||
647 | |||
645 | if (pdev->cfg_size < 4096) | 648 | if (pdev->cfg_size < 4096) |
646 | sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr); | 649 | sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr); |
647 | else | 650 | else |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index e8a7f1b1b2bc..5b4483811691 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -714,33 +714,6 @@ static void __devinit quirk_vt82c598_id(struct pci_dev *dev) | |||
714 | } | 714 | } |
715 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_vt82c598_id ); | 715 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_vt82c598_id ); |
716 | 716 | ||
717 | #ifdef CONFIG_ACPI_SLEEP | ||
718 | |||
719 | /* | ||
720 | * Some VIA systems boot with the abnormal status flag set. This can cause | ||
721 | * the BIOS to re-POST the system on resume rather than passing control | ||
722 | * back to the OS. Clear the flag on boot | ||
723 | */ | ||
724 | static void __devinit quirk_via_abnormal_poweroff(struct pci_dev *dev) | ||
725 | { | ||
726 | u32 reg; | ||
727 | |||
728 | acpi_hw_register_read(ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_STATUS, | ||
729 | ®); | ||
730 | |||
731 | if (reg & 0x800) { | ||
732 | printk("Clearing abnormal poweroff flag\n"); | ||
733 | acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK, | ||
734 | ACPI_REGISTER_PM1_STATUS, | ||
735 | (u16)0x800); | ||
736 | } | ||
737 | } | ||
738 | |||
739 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_via_abnormal_poweroff); | ||
740 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, quirk_via_abnormal_poweroff); | ||
741 | |||
742 | #endif | ||
743 | |||
744 | /* | 717 | /* |
745 | * CardBus controllers have a legacy base address that enables them | 718 | * CardBus controllers have a legacy base address that enables them |
746 | * to respond as i82365 pcmcia controllers. We don't want them to | 719 | * to respond as i82365 pcmcia controllers. We don't want them to |
@@ -1487,33 +1460,6 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2609, quirk_intel_pcie_pm); | |||
1487 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260a, quirk_intel_pcie_pm); | 1460 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260a, quirk_intel_pcie_pm); |
1488 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260b, quirk_intel_pcie_pm); | 1461 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260b, quirk_intel_pcie_pm); |
1489 | 1462 | ||
1490 | /* | ||
1491 | * Fixup the cardbus bridges on the IBM Dock II docking station | ||
1492 | */ | ||
1493 | static void __devinit quirk_ibm_dock2_cardbus(struct pci_dev *dev) | ||
1494 | { | ||
1495 | u32 val; | ||
1496 | |||
1497 | /* | ||
1498 | * tie the 2 interrupt pins to INTA, and configure the | ||
1499 | * multifunction routing register to handle this. | ||
1500 | */ | ||
1501 | if ((dev->subsystem_vendor == PCI_VENDOR_ID_IBM) && | ||
1502 | (dev->subsystem_device == 0x0148)) { | ||
1503 | printk(KERN_INFO "PCI: Found IBM Dock II Cardbus Bridge " | ||
1504 | "applying quirk\n"); | ||
1505 | pci_read_config_dword(dev, 0x8c, &val); | ||
1506 | val = ((val & 0xffffff00) | 0x1002); | ||
1507 | pci_write_config_dword(dev, 0x8c, val); | ||
1508 | pci_read_config_dword(dev, 0x80, &val); | ||
1509 | val = ((val & 0x00ffff00) | 0x2864c077); | ||
1510 | pci_write_config_dword(dev, 0x80, val); | ||
1511 | } | ||
1512 | } | ||
1513 | |||
1514 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1420, | ||
1515 | quirk_ibm_dock2_cardbus); | ||
1516 | |||
1517 | static void __devinit quirk_netmos(struct pci_dev *dev) | 1463 | static void __devinit quirk_netmos(struct pci_dev *dev) |
1518 | { | 1464 | { |
1519 | unsigned int num_parallel = (dev->subsystem_device & 0xf0) >> 4; | 1465 | unsigned int num_parallel = (dev->subsystem_device & 0xf0) >> 4; |
@@ -1619,52 +1565,6 @@ static void __devinit fixup_rev1_53c810(struct pci_dev* dev) | |||
1619 | } | 1565 | } |
1620 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810); | 1566 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810); |
1621 | 1567 | ||
1622 | /* | ||
1623 | * Fixup to mark boot BIOS video selected by BIOS before it changes | ||
1624 | * | ||
1625 | * From information provided by "Jon Smirl" <jonsmirl@gmail.com> | ||
1626 | * | ||
1627 | * The standard boot ROM sequence for an x86 machine uses the BIOS | ||
1628 | * to select an initial video card for boot display. This boot video | ||
1629 | * card will have it's BIOS copied to C0000 in system RAM. | ||
1630 | * IORESOURCE_ROM_SHADOW is used to associate the boot video | ||
1631 | * card with this copy. On laptops this copy has to be used since | ||
1632 | * the main ROM may be compressed or combined with another image. | ||
1633 | * See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW | ||
1634 | * is marked here since the boot video device will be the only enabled | ||
1635 | * video device at this point. | ||
1636 | */ | ||
1637 | |||
1638 | static void __devinit fixup_video(struct pci_dev *pdev) | ||
1639 | { | ||
1640 | struct pci_dev *bridge; | ||
1641 | struct pci_bus *bus; | ||
1642 | u16 config; | ||
1643 | |||
1644 | if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA) | ||
1645 | return; | ||
1646 | |||
1647 | /* Is VGA routed to us? */ | ||
1648 | bus = pdev->bus; | ||
1649 | while (bus) { | ||
1650 | bridge = bus->self; | ||
1651 | if (bridge) { | ||
1652 | pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, | ||
1653 | &config); | ||
1654 | if (!(config & PCI_BRIDGE_CTL_VGA)) | ||
1655 | return; | ||
1656 | } | ||
1657 | bus = bus->parent; | ||
1658 | } | ||
1659 | pci_read_config_word(pdev, PCI_COMMAND, &config); | ||
1660 | if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { | ||
1661 | pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; | ||
1662 | printk(KERN_DEBUG "Boot video device is %s\n", pci_name(pdev)); | ||
1663 | } | ||
1664 | } | ||
1665 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, fixup_video); | ||
1666 | |||
1667 | |||
1668 | static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, struct pci_fixup *end) | 1568 | static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, struct pci_fixup *end) |
1669 | { | 1569 | { |
1670 | while (f < end) { | 1570 | while (f < end) { |
diff --git a/drivers/pci/rom.c b/drivers/pci/rom.c index 43e4a49f2cc4..e1dcefc69bb4 100644 --- a/drivers/pci/rom.c +++ b/drivers/pci/rom.c | |||
@@ -72,8 +72,9 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size) | |||
72 | int last_image; | 72 | int last_image; |
73 | 73 | ||
74 | /* | 74 | /* |
75 | * IORESOURCE_ROM_SHADOW set if the VGA enable bit of the Bridge Control | 75 | * IORESOURCE_ROM_SHADOW set on x86, x86_64 and IA64 supports legacy |
76 | * register is set for embedded VGA. | 76 | * memory map if the VGA enable bit of the Bridge Control register is |
77 | * set for embedded VGA. | ||
77 | */ | 78 | */ |
78 | if (res->flags & IORESOURCE_ROM_SHADOW) { | 79 | if (res->flags & IORESOURCE_ROM_SHADOW) { |
79 | /* primary video rom always starts here */ | 80 | /* primary video rom always starts here */ |
diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c index 7f5df9a9f393..3bcb7dc32995 100644 --- a/drivers/pcmcia/at91_cf.c +++ b/drivers/pcmcia/at91_cf.c | |||
@@ -241,12 +241,6 @@ static int __init at91_cf_probe(struct platform_device *pdev) | |||
241 | csa = at91_sys_read(AT91_EBI_CSA); | 241 | csa = at91_sys_read(AT91_EBI_CSA); |
242 | at91_sys_write(AT91_EBI_CSA, csa | AT91_EBI_CS4A_SMC_COMPACTFLASH); | 242 | at91_sys_write(AT91_EBI_CSA, csa | AT91_EBI_CS4A_SMC_COMPACTFLASH); |
243 | 243 | ||
244 | /* force poweron defaults for these pins ... */ | ||
245 | (void) at91_set_A_periph(AT91_PIN_PC9, 0); /* A25/CFRNW */ | ||
246 | (void) at91_set_A_periph(AT91_PIN_PC10, 0); /* NCS4/CFCS */ | ||
247 | (void) at91_set_A_periph(AT91_PIN_PC11, 0); /* NCS5/CFCE1 */ | ||
248 | (void) at91_set_A_periph(AT91_PIN_PC12, 0); /* NCS6/CFCE2 */ | ||
249 | |||
250 | /* nWAIT is _not_ a default setting */ | 244 | /* nWAIT is _not_ a default setting */ |
251 | (void) at91_set_A_periph(AT91_PIN_PC6, 1); /* nWAIT */ | 245 | (void) at91_set_A_periph(AT91_PIN_PC6, 1); /* nWAIT */ |
252 | 246 | ||
@@ -316,12 +310,14 @@ static int __init at91_cf_probe(struct platform_device *pdev) | |||
316 | return 0; | 310 | return 0; |
317 | 311 | ||
318 | fail2: | 312 | fail2: |
319 | iounmap((void __iomem *) cf->socket.io_offset); | ||
320 | release_mem_region(io->start, io->end + 1 - io->start); | 313 | release_mem_region(io->start, io->end + 1 - io->start); |
321 | fail1: | 314 | fail1: |
315 | if (cf->socket.io_offset) | ||
316 | iounmap((void __iomem *) cf->socket.io_offset); | ||
322 | if (board->irq_pin) | 317 | if (board->irq_pin) |
323 | free_irq(board->irq_pin, cf); | 318 | free_irq(board->irq_pin, cf); |
324 | fail0a: | 319 | fail0a: |
320 | device_init_wakeup(&pdev->dev, 0); | ||
325 | free_irq(board->det_pin, cf); | 321 | free_irq(board->det_pin, cf); |
326 | device_init_wakeup(&pdev->dev, 0); | 322 | device_init_wakeup(&pdev->dev, 0); |
327 | fail0: | 323 | fail0: |
@@ -360,26 +356,20 @@ static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg) | |||
360 | struct at91_cf_data *board = cf->board; | 356 | struct at91_cf_data *board = cf->board; |
361 | 357 | ||
362 | pcmcia_socket_dev_suspend(&pdev->dev, mesg); | 358 | pcmcia_socket_dev_suspend(&pdev->dev, mesg); |
363 | if (device_may_wakeup(&pdev->dev)) | 359 | if (device_may_wakeup(&pdev->dev)) { |
364 | enable_irq_wake(board->det_pin); | 360 | enable_irq_wake(board->det_pin); |
365 | else { | 361 | if (board->irq_pin) |
362 | enable_irq_wake(board->irq_pin); | ||
363 | } else { | ||
366 | disable_irq_wake(board->det_pin); | 364 | disable_irq_wake(board->det_pin); |
367 | disable_irq(board->det_pin); | 365 | if (board->irq_pin) |
366 | disable_irq_wake(board->irq_pin); | ||
368 | } | 367 | } |
369 | if (board->irq_pin) | ||
370 | disable_irq(board->irq_pin); | ||
371 | return 0; | 368 | return 0; |
372 | } | 369 | } |
373 | 370 | ||
374 | static int at91_cf_resume(struct platform_device *pdev) | 371 | static int at91_cf_resume(struct platform_device *pdev) |
375 | { | 372 | { |
376 | struct at91_cf_socket *cf = platform_get_drvdata(pdev); | ||
377 | struct at91_cf_data *board = cf->board; | ||
378 | |||
379 | if (board->irq_pin) | ||
380 | enable_irq(board->irq_pin); | ||
381 | if (!device_may_wakeup(&pdev->dev)) | ||
382 | enable_irq(board->det_pin); | ||
383 | pcmcia_socket_dev_resume(&pdev->dev); | 373 | pcmcia_socket_dev_resume(&pdev->dev); |
384 | return 0; | 374 | return 0; |
385 | } | 375 | } |
diff --git a/drivers/pcmcia/au1000_generic.c b/drivers/pcmcia/au1000_generic.c index d5dd0ce65536..551bde5d9430 100644 --- a/drivers/pcmcia/au1000_generic.c +++ b/drivers/pcmcia/au1000_generic.c | |||
@@ -351,6 +351,7 @@ struct skt_dev_info { | |||
351 | int au1x00_pcmcia_socket_probe(struct device *dev, struct pcmcia_low_level *ops, int first, int nr) | 351 | int au1x00_pcmcia_socket_probe(struct device *dev, struct pcmcia_low_level *ops, int first, int nr) |
352 | { | 352 | { |
353 | struct skt_dev_info *sinfo; | 353 | struct skt_dev_info *sinfo; |
354 | struct au1000_pcmcia_socket *skt; | ||
354 | int ret, i; | 355 | int ret, i; |
355 | 356 | ||
356 | sinfo = kzalloc(sizeof(struct skt_dev_info), GFP_KERNEL); | 357 | sinfo = kzalloc(sizeof(struct skt_dev_info), GFP_KERNEL); |
@@ -365,7 +366,7 @@ int au1x00_pcmcia_socket_probe(struct device *dev, struct pcmcia_low_level *ops, | |||
365 | * Initialise the per-socket structure. | 366 | * Initialise the per-socket structure. |
366 | */ | 367 | */ |
367 | for (i = 0; i < nr; i++) { | 368 | for (i = 0; i < nr; i++) { |
368 | struct au1000_pcmcia_socket *skt = PCMCIA_SOCKET(i); | 369 | skt = PCMCIA_SOCKET(i); |
369 | memset(skt, 0, sizeof(*skt)); | 370 | memset(skt, 0, sizeof(*skt)); |
370 | 371 | ||
371 | skt->socket.resource_ops = &pccard_static_ops; | 372 | skt->socket.resource_ops = &pccard_static_ops; |
@@ -438,17 +439,29 @@ int au1x00_pcmcia_socket_probe(struct device *dev, struct pcmcia_low_level *ops, | |||
438 | dev_set_drvdata(dev, sinfo); | 439 | dev_set_drvdata(dev, sinfo); |
439 | return 0; | 440 | return 0; |
440 | 441 | ||
441 | do { | 442 | |
442 | struct au1000_pcmcia_socket *skt = PCMCIA_SOCKET(i); | 443 | out_err: |
444 | flush_scheduled_work(); | ||
445 | ops->hw_shutdown(skt); | ||
446 | while (i-- > 0) { | ||
447 | skt = PCMCIA_SOCKET(i); | ||
443 | 448 | ||
444 | del_timer_sync(&skt->poll_timer); | 449 | del_timer_sync(&skt->poll_timer); |
445 | pcmcia_unregister_socket(&skt->socket); | 450 | pcmcia_unregister_socket(&skt->socket); |
446 | out_err: | ||
447 | flush_scheduled_work(); | 451 | flush_scheduled_work(); |
452 | if (i == 0) { | ||
453 | iounmap(skt->virt_io + (u32)mips_io_port_base); | ||
454 | skt->virt_io = NULL; | ||
455 | } | ||
456 | #ifndef CONFIG_MIPS_XXS1500 | ||
457 | else { | ||
458 | iounmap(skt->virt_io + (u32)mips_io_port_base); | ||
459 | skt->virt_io = NULL; | ||
460 | } | ||
461 | #endif | ||
448 | ops->hw_shutdown(skt); | 462 | ops->hw_shutdown(skt); |
449 | 463 | ||
450 | i--; | 464 | } |
451 | } while (i > 0); | ||
452 | kfree(sinfo); | 465 | kfree(sinfo); |
453 | out: | 466 | out: |
454 | return ret; | 467 | return ret; |
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 74b3124e8247..21d83a895b21 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
@@ -717,6 +717,7 @@ static int pcmcia_requery(struct device *dev, void * _data) | |||
717 | static void pcmcia_bus_rescan(struct pcmcia_socket *skt) | 717 | static void pcmcia_bus_rescan(struct pcmcia_socket *skt) |
718 | { | 718 | { |
719 | int no_devices=0; | 719 | int no_devices=0; |
720 | int ret = 0; | ||
720 | unsigned long flags; | 721 | unsigned long flags; |
721 | 722 | ||
722 | /* must be called with skt_mutex held */ | 723 | /* must be called with skt_mutex held */ |
@@ -729,7 +730,7 @@ static void pcmcia_bus_rescan(struct pcmcia_socket *skt) | |||
729 | * missing resource information or other trouble, we need to | 730 | * missing resource information or other trouble, we need to |
730 | * do this now. */ | 731 | * do this now. */ |
731 | if (no_devices) { | 732 | if (no_devices) { |
732 | int ret = pcmcia_card_add(skt); | 733 | ret = pcmcia_card_add(skt); |
733 | if (ret) | 734 | if (ret) |
734 | return; | 735 | return; |
735 | } | 736 | } |
@@ -741,7 +742,9 @@ static void pcmcia_bus_rescan(struct pcmcia_socket *skt) | |||
741 | 742 | ||
742 | /* we re-scan all devices, not just the ones connected to this | 743 | /* we re-scan all devices, not just the ones connected to this |
743 | * socket. This does not matter, though. */ | 744 | * socket. This does not matter, though. */ |
744 | bus_rescan_devices(&pcmcia_bus_type); | 745 | ret = bus_rescan_devices(&pcmcia_bus_type); |
746 | if (ret) | ||
747 | printk(KERN_INFO "pcmcia: bus_rescan_devices failed\n"); | ||
745 | } | 748 | } |
746 | 749 | ||
747 | static inline int pcmcia_devmatch(struct pcmcia_device *dev, | 750 | static inline int pcmcia_devmatch(struct pcmcia_device *dev, |
@@ -1001,6 +1004,7 @@ static ssize_t pcmcia_store_allow_func_id_match(struct device *dev, | |||
1001 | struct device_attribute *attr, const char *buf, size_t count) | 1004 | struct device_attribute *attr, const char *buf, size_t count) |
1002 | { | 1005 | { |
1003 | struct pcmcia_device *p_dev = to_pcmcia_dev(dev); | 1006 | struct pcmcia_device *p_dev = to_pcmcia_dev(dev); |
1007 | int ret; | ||
1004 | 1008 | ||
1005 | if (!count) | 1009 | if (!count) |
1006 | return -EINVAL; | 1010 | return -EINVAL; |
@@ -1009,7 +1013,10 @@ static ssize_t pcmcia_store_allow_func_id_match(struct device *dev, | |||
1009 | p_dev->allow_func_id_match = 1; | 1013 | p_dev->allow_func_id_match = 1; |
1010 | mutex_unlock(&p_dev->socket->skt_mutex); | 1014 | mutex_unlock(&p_dev->socket->skt_mutex); |
1011 | 1015 | ||
1012 | bus_rescan_devices(&pcmcia_bus_type); | 1016 | ret = bus_rescan_devices(&pcmcia_bus_type); |
1017 | if (ret) | ||
1018 | printk(KERN_INFO "pcmcia: bus_rescan_devices failed after " | ||
1019 | "allowing func_id matches\n"); | ||
1013 | 1020 | ||
1014 | return count; | 1021 | return count; |
1015 | } | 1022 | } |
@@ -1264,6 +1271,11 @@ static void pcmcia_bus_remove_socket(struct class_device *class_dev, | |||
1264 | socket->pcmcia_state.dead = 1; | 1271 | socket->pcmcia_state.dead = 1; |
1265 | pccard_register_pcmcia(socket, NULL); | 1272 | pccard_register_pcmcia(socket, NULL); |
1266 | 1273 | ||
1274 | /* unregister any unbound devices */ | ||
1275 | mutex_lock(&socket->skt_mutex); | ||
1276 | pcmcia_card_remove(socket, NULL); | ||
1277 | mutex_unlock(&socket->skt_mutex); | ||
1278 | |||
1267 | pcmcia_put_socket(socket); | 1279 | pcmcia_put_socket(socket); |
1268 | 1280 | ||
1269 | return; | 1281 | return; |
@@ -1292,10 +1304,22 @@ struct bus_type pcmcia_bus_type = { | |||
1292 | 1304 | ||
1293 | static int __init init_pcmcia_bus(void) | 1305 | static int __init init_pcmcia_bus(void) |
1294 | { | 1306 | { |
1307 | int ret; | ||
1308 | |||
1295 | spin_lock_init(&pcmcia_dev_list_lock); | 1309 | spin_lock_init(&pcmcia_dev_list_lock); |
1296 | 1310 | ||
1297 | bus_register(&pcmcia_bus_type); | 1311 | ret = bus_register(&pcmcia_bus_type); |
1298 | class_interface_register(&pcmcia_bus_interface); | 1312 | if (ret < 0) { |
1313 | printk(KERN_WARNING "pcmcia: bus_register error: %d\n", ret); | ||
1314 | return ret; | ||
1315 | } | ||
1316 | ret = class_interface_register(&pcmcia_bus_interface); | ||
1317 | if (ret < 0) { | ||
1318 | printk(KERN_WARNING | ||
1319 | "pcmcia: class_interface_register error: %d\n", ret); | ||
1320 | bus_unregister(&pcmcia_bus_type); | ||
1321 | return ret; | ||
1322 | } | ||
1299 | 1323 | ||
1300 | pcmcia_setup_ioctl(); | 1324 | pcmcia_setup_ioctl(); |
1301 | 1325 | ||
diff --git a/drivers/pcmcia/i82092.c b/drivers/pcmcia/i82092.c index 82715f448957..c2ea07aa7a12 100644 --- a/drivers/pcmcia/i82092.c +++ b/drivers/pcmcia/i82092.c | |||
@@ -41,6 +41,7 @@ static struct pci_device_id i82092aa_pci_ids[] = { | |||
41 | }; | 41 | }; |
42 | MODULE_DEVICE_TABLE(pci, i82092aa_pci_ids); | 42 | MODULE_DEVICE_TABLE(pci, i82092aa_pci_ids); |
43 | 43 | ||
44 | #ifdef CONFIG_PM | ||
44 | static int i82092aa_socket_suspend (struct pci_dev *dev, pm_message_t state) | 45 | static int i82092aa_socket_suspend (struct pci_dev *dev, pm_message_t state) |
45 | { | 46 | { |
46 | return pcmcia_socket_dev_suspend(&dev->dev, state); | 47 | return pcmcia_socket_dev_suspend(&dev->dev, state); |
@@ -50,14 +51,17 @@ static int i82092aa_socket_resume (struct pci_dev *dev) | |||
50 | { | 51 | { |
51 | return pcmcia_socket_dev_resume(&dev->dev); | 52 | return pcmcia_socket_dev_resume(&dev->dev); |
52 | } | 53 | } |
54 | #endif | ||
53 | 55 | ||
54 | static struct pci_driver i82092aa_pci_drv = { | 56 | static struct pci_driver i82092aa_pci_drv = { |
55 | .name = "i82092aa", | 57 | .name = "i82092aa", |
56 | .id_table = i82092aa_pci_ids, | 58 | .id_table = i82092aa_pci_ids, |
57 | .probe = i82092aa_pci_probe, | 59 | .probe = i82092aa_pci_probe, |
58 | .remove = __devexit_p(i82092aa_pci_remove), | 60 | .remove = __devexit_p(i82092aa_pci_remove), |
61 | #ifdef CONFIG_PM | ||
59 | .suspend = i82092aa_socket_suspend, | 62 | .suspend = i82092aa_socket_suspend, |
60 | .resume = i82092aa_socket_resume, | 63 | .resume = i82092aa_socket_resume, |
64 | #endif | ||
61 | }; | 65 | }; |
62 | 66 | ||
63 | 67 | ||
@@ -705,10 +709,7 @@ static int i82092aa_set_mem_map(struct pcmcia_socket *socket, struct pccard_mem_ | |||
705 | 709 | ||
706 | static int i82092aa_module_init(void) | 710 | static int i82092aa_module_init(void) |
707 | { | 711 | { |
708 | enter("i82092aa_module_init"); | 712 | return pci_register_driver(&i82092aa_pci_drv); |
709 | pci_register_driver(&i82092aa_pci_drv); | ||
710 | leave("i82092aa_module_init"); | ||
711 | return 0; | ||
712 | } | 713 | } |
713 | 714 | ||
714 | static void i82092aa_module_exit(void) | 715 | static void i82092aa_module_exit(void) |
diff --git a/drivers/pcmcia/m8xx_pcmcia.c b/drivers/pcmcia/m8xx_pcmcia.c index e070a2896769..3b72be880401 100644 --- a/drivers/pcmcia/m8xx_pcmcia.c +++ b/drivers/pcmcia/m8xx_pcmcia.c | |||
@@ -427,7 +427,7 @@ static int voltage_set(int slot, int vcc, int vpp) | |||
427 | reg |= BCSR1_PCCVCC1; | 427 | reg |= BCSR1_PCCVCC1; |
428 | break; | 428 | break; |
429 | default: | 429 | default: |
430 | return 1; | 430 | goto out_unmap; |
431 | } | 431 | } |
432 | 432 | ||
433 | switch(vpp) { | 433 | switch(vpp) { |
@@ -438,15 +438,15 @@ static int voltage_set(int slot, int vcc, int vpp) | |||
438 | if(vcc == vpp) | 438 | if(vcc == vpp) |
439 | reg |= BCSR1_PCCVPP1; | 439 | reg |= BCSR1_PCCVPP1; |
440 | else | 440 | else |
441 | return 1; | 441 | goto out_unmap; |
442 | break; | 442 | break; |
443 | case 120: | 443 | case 120: |
444 | if ((vcc == 33) || (vcc == 50)) | 444 | if ((vcc == 33) || (vcc == 50)) |
445 | reg |= BCSR1_PCCVPP0; | 445 | reg |= BCSR1_PCCVPP0; |
446 | else | 446 | else |
447 | return 1; | 447 | goto out_unmap; |
448 | default: | 448 | default: |
449 | return 1; | 449 | goto out_unmap; |
450 | } | 450 | } |
451 | 451 | ||
452 | /* first, turn off all power */ | 452 | /* first, turn off all power */ |
@@ -457,6 +457,10 @@ static int voltage_set(int slot, int vcc, int vpp) | |||
457 | 457 | ||
458 | iounmap(bcsr_io); | 458 | iounmap(bcsr_io); |
459 | return 0; | 459 | return 0; |
460 | |||
461 | out_unmap: | ||
462 | iounmap(bcsr_io); | ||
463 | return 1; | ||
460 | } | 464 | } |
461 | 465 | ||
462 | #define socket_get(_slot_) PCMCIA_SOCKET_KEY_5V | 466 | #define socket_get(_slot_) PCMCIA_SOCKET_KEY_5V |
diff --git a/drivers/pcmcia/omap_cf.c b/drivers/pcmcia/omap_cf.c index c8e838c69766..06bf7f48836e 100644 --- a/drivers/pcmcia/omap_cf.c +++ b/drivers/pcmcia/omap_cf.c | |||
@@ -309,9 +309,10 @@ static int __devinit omap_cf_probe(struct device *dev) | |||
309 | return 0; | 309 | return 0; |
310 | 310 | ||
311 | fail2: | 311 | fail2: |
312 | iounmap((void __iomem *) cf->socket.io_offset); | ||
313 | release_mem_region(cf->phys_cf, SZ_8K); | 312 | release_mem_region(cf->phys_cf, SZ_8K); |
314 | fail1: | 313 | fail1: |
314 | if (cf->socket.io_offset) | ||
315 | iounmap((void __iomem *) cf->socket.io_offset); | ||
315 | free_irq(irq, cf); | 316 | free_irq(irq, cf); |
316 | fail0: | 317 | fail0: |
317 | kfree(cf); | 318 | kfree(cf); |
diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c index 9ad18e62658d..310ede575caa 100644 --- a/drivers/pcmcia/pcmcia_ioctl.c +++ b/drivers/pcmcia/pcmcia_ioctl.c | |||
@@ -128,9 +128,12 @@ static int proc_read_drivers(char *buf, char **start, off_t pos, | |||
128 | int count, int *eof, void *data) | 128 | int count, int *eof, void *data) |
129 | { | 129 | { |
130 | char *p = buf; | 130 | char *p = buf; |
131 | int rc; | ||
131 | 132 | ||
132 | bus_for_each_drv(&pcmcia_bus_type, NULL, | 133 | rc = bus_for_each_drv(&pcmcia_bus_type, NULL, |
133 | (void *) &p, proc_read_drivers_callback); | 134 | (void *) &p, proc_read_drivers_callback); |
135 | if (rc < 0) | ||
136 | return rc; | ||
134 | 137 | ||
135 | return (p - buf); | 138 | return (p - buf); |
136 | } | 139 | } |
@@ -269,8 +272,10 @@ rescan: | |||
269 | * Prevent this racing with a card insertion. | 272 | * Prevent this racing with a card insertion. |
270 | */ | 273 | */ |
271 | mutex_lock(&s->skt_mutex); | 274 | mutex_lock(&s->skt_mutex); |
272 | bus_rescan_devices(&pcmcia_bus_type); | 275 | ret = bus_rescan_devices(&pcmcia_bus_type); |
273 | mutex_unlock(&s->skt_mutex); | 276 | mutex_unlock(&s->skt_mutex); |
277 | if (ret) | ||
278 | goto err_put_module; | ||
274 | 279 | ||
275 | /* check whether the driver indeed matched. I don't care if this | 280 | /* check whether the driver indeed matched. I don't care if this |
276 | * is racy or not, because it can only happen on cardmgr access | 281 | * is racy or not, because it can only happen on cardmgr access |
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index 74cebd424032..b9201c2ec38b 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
@@ -95,7 +95,7 @@ static int alloc_io_space(struct pcmcia_socket *s, u_int attr, ioaddr_t *base, | |||
95 | * potential conflicts, just the most obvious ones. | 95 | * potential conflicts, just the most obvious ones. |
96 | */ | 96 | */ |
97 | for (i = 0; i < MAX_IO_WIN; i++) | 97 | for (i = 0; i < MAX_IO_WIN; i++) |
98 | if ((s->io[i].res) && | 98 | if ((s->io[i].res) && *base && |
99 | ((s->io[i].res->start & (align-1)) == *base)) | 99 | ((s->io[i].res->start & (align-1)) == *base)) |
100 | return 1; | 100 | return 1; |
101 | for (i = 0; i < MAX_IO_WIN; i++) { | 101 | for (i = 0; i < MAX_IO_WIN; i++) { |
diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c index c83a0a6b158f..a70f97fdbbdd 100644 --- a/drivers/pcmcia/pd6729.c +++ b/drivers/pcmcia/pd6729.c | |||
@@ -755,6 +755,7 @@ static void __devexit pd6729_pci_remove(struct pci_dev *dev) | |||
755 | kfree(socket); | 755 | kfree(socket); |
756 | } | 756 | } |
757 | 757 | ||
758 | #ifdef CONFIG_PM | ||
758 | static int pd6729_socket_suspend(struct pci_dev *dev, pm_message_t state) | 759 | static int pd6729_socket_suspend(struct pci_dev *dev, pm_message_t state) |
759 | { | 760 | { |
760 | return pcmcia_socket_dev_suspend(&dev->dev, state); | 761 | return pcmcia_socket_dev_suspend(&dev->dev, state); |
@@ -764,6 +765,7 @@ static int pd6729_socket_resume(struct pci_dev *dev) | |||
764 | { | 765 | { |
765 | return pcmcia_socket_dev_resume(&dev->dev); | 766 | return pcmcia_socket_dev_resume(&dev->dev); |
766 | } | 767 | } |
768 | #endif | ||
767 | 769 | ||
768 | static struct pci_device_id pd6729_pci_ids[] = { | 770 | static struct pci_device_id pd6729_pci_ids[] = { |
769 | { | 771 | { |
@@ -781,8 +783,10 @@ static struct pci_driver pd6729_pci_drv = { | |||
781 | .id_table = pd6729_pci_ids, | 783 | .id_table = pd6729_pci_ids, |
782 | .probe = pd6729_pci_probe, | 784 | .probe = pd6729_pci_probe, |
783 | .remove = __devexit_p(pd6729_pci_remove), | 785 | .remove = __devexit_p(pd6729_pci_remove), |
786 | #ifdef CONFIG_PM | ||
784 | .suspend = pd6729_socket_suspend, | 787 | .suspend = pd6729_socket_suspend, |
785 | .resume = pd6729_socket_resume, | 788 | .resume = pd6729_socket_resume, |
789 | #endif | ||
786 | }; | 790 | }; |
787 | 791 | ||
788 | static int pd6729_module_init(void) | 792 | static int pd6729_module_init(void) |
diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c index b3518131ea0d..dca9f8549b32 100644 --- a/drivers/pcmcia/pxa2xx_base.c +++ b/drivers/pcmcia/pxa2xx_base.c | |||
@@ -166,7 +166,7 @@ pxa2xx_pcmcia_frequency_change(struct soc_pcmcia_socket *skt, | |||
166 | } | 166 | } |
167 | #endif | 167 | #endif |
168 | 168 | ||
169 | int pxa2xx_drv_pcmcia_probe(struct device *dev) | 169 | int __pxa2xx_drv_pcmcia_probe(struct device *dev) |
170 | { | 170 | { |
171 | int ret; | 171 | int ret; |
172 | struct pcmcia_low_level *ops; | 172 | struct pcmcia_low_level *ops; |
@@ -203,35 +203,52 @@ int pxa2xx_drv_pcmcia_probe(struct device *dev) | |||
203 | 203 | ||
204 | return ret; | 204 | return ret; |
205 | } | 205 | } |
206 | EXPORT_SYMBOL(pxa2xx_drv_pcmcia_probe); | 206 | EXPORT_SYMBOL(__pxa2xx_drv_pcmcia_probe); |
207 | 207 | ||
208 | static int pxa2xx_drv_pcmcia_resume(struct device *dev) | 208 | |
209 | static int pxa2xx_drv_pcmcia_probe(struct platform_device *dev) | ||
210 | { | ||
211 | return __pxa2xx_drv_pcmcia_probe(&dev->dev); | ||
212 | } | ||
213 | |||
214 | static int pxa2xx_drv_pcmcia_remove(struct platform_device *dev) | ||
215 | { | ||
216 | return soc_common_drv_pcmcia_remove(&dev->dev); | ||
217 | } | ||
218 | |||
219 | static int pxa2xx_drv_pcmcia_suspend(struct platform_device *dev, pm_message_t state) | ||
220 | { | ||
221 | return pcmcia_socket_dev_suspend(&dev->dev, state); | ||
222 | } | ||
223 | |||
224 | static int pxa2xx_drv_pcmcia_resume(struct platform_device *dev) | ||
209 | { | 225 | { |
210 | struct pcmcia_low_level *ops = dev->platform_data; | 226 | struct pcmcia_low_level *ops = dev->dev.platform_data; |
211 | int nr = ops ? ops->nr : 0; | 227 | int nr = ops ? ops->nr : 0; |
212 | 228 | ||
213 | MECR = nr > 1 ? MECR_CIT | MECR_NOS : (nr > 0 ? MECR_CIT : 0); | 229 | MECR = nr > 1 ? MECR_CIT | MECR_NOS : (nr > 0 ? MECR_CIT : 0); |
214 | 230 | ||
215 | return pcmcia_socket_dev_resume(dev); | 231 | return pcmcia_socket_dev_resume(&dev->dev); |
216 | } | 232 | } |
217 | 233 | ||
218 | static struct device_driver pxa2xx_pcmcia_driver = { | 234 | static struct platform_driver pxa2xx_pcmcia_driver = { |
219 | .probe = pxa2xx_drv_pcmcia_probe, | 235 | .probe = pxa2xx_drv_pcmcia_probe, |
220 | .remove = soc_common_drv_pcmcia_remove, | 236 | .remove = pxa2xx_drv_pcmcia_remove, |
221 | .suspend = pcmcia_socket_dev_suspend, | 237 | .suspend = pxa2xx_drv_pcmcia_suspend, |
222 | .resume = pxa2xx_drv_pcmcia_resume, | 238 | .resume = pxa2xx_drv_pcmcia_resume, |
223 | .name = "pxa2xx-pcmcia", | 239 | .driver = { |
224 | .bus = &platform_bus_type, | 240 | .name = "pxa2xx-pcmcia", |
241 | }, | ||
225 | }; | 242 | }; |
226 | 243 | ||
227 | static int __init pxa2xx_pcmcia_init(void) | 244 | static int __init pxa2xx_pcmcia_init(void) |
228 | { | 245 | { |
229 | return driver_register(&pxa2xx_pcmcia_driver); | 246 | return platform_driver_register(&pxa2xx_pcmcia_driver); |
230 | } | 247 | } |
231 | 248 | ||
232 | static void __exit pxa2xx_pcmcia_exit(void) | 249 | static void __exit pxa2xx_pcmcia_exit(void) |
233 | { | 250 | { |
234 | driver_unregister(&pxa2xx_pcmcia_driver); | 251 | platform_driver_unregister(&pxa2xx_pcmcia_driver); |
235 | } | 252 | } |
236 | 253 | ||
237 | fs_initcall(pxa2xx_pcmcia_init); | 254 | fs_initcall(pxa2xx_pcmcia_init); |
diff --git a/drivers/pcmcia/pxa2xx_base.h b/drivers/pcmcia/pxa2xx_base.h index e46cff345d47..235d681652c3 100644 --- a/drivers/pcmcia/pxa2xx_base.h +++ b/drivers/pcmcia/pxa2xx_base.h | |||
@@ -1,3 +1,3 @@ | |||
1 | /* temporary measure */ | 1 | /* temporary measure */ |
2 | extern int pxa2xx_drv_pcmcia_probe(struct device *); | 2 | extern int __pxa2xx_drv_pcmcia_probe(struct device *); |
3 | 3 | ||
diff --git a/drivers/pcmcia/pxa2xx_lubbock.c b/drivers/pcmcia/pxa2xx_lubbock.c index fd1f691c7c2c..a92f11143c43 100644 --- a/drivers/pcmcia/pxa2xx_lubbock.c +++ b/drivers/pcmcia/pxa2xx_lubbock.c | |||
@@ -260,7 +260,7 @@ int __init pcmcia_lubbock_init(struct sa1111_dev *sadev) | |||
260 | lubbock_set_misc_wr((1 << 15) | (1 << 14), 0); | 260 | lubbock_set_misc_wr((1 << 15) | (1 << 14), 0); |
261 | 261 | ||
262 | sadev->dev.platform_data = &lubbock_pcmcia_ops; | 262 | sadev->dev.platform_data = &lubbock_pcmcia_ops; |
263 | ret = pxa2xx_drv_pcmcia_probe(&sadev->dev); | 263 | ret = __pxa2xx_drv_pcmcia_probe(&sadev->dev); |
264 | } | 264 | } |
265 | 265 | ||
266 | return ret; | 266 | return ret; |
diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c index 3627e52e0c27..e433704e026a 100644 --- a/drivers/pcmcia/soc_common.c +++ b/drivers/pcmcia/soc_common.c | |||
@@ -824,3 +824,4 @@ int soc_common_drv_pcmcia_remove(struct device *dev) | |||
824 | 824 | ||
825 | return 0; | 825 | return 0; |
826 | } | 826 | } |
827 | EXPORT_SYMBOL(soc_common_drv_pcmcia_remove); | ||
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index 26229d9da762..da471bddc972 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c | |||
@@ -1197,8 +1197,12 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i | |||
1197 | ret = pcmcia_register_socket(&socket->socket); | 1197 | ret = pcmcia_register_socket(&socket->socket); |
1198 | if (ret == 0) { | 1198 | if (ret == 0) { |
1199 | /* Add the yenta register attributes */ | 1199 | /* Add the yenta register attributes */ |
1200 | device_create_file(&dev->dev, &dev_attr_yenta_registers); | 1200 | ret = device_create_file(&dev->dev, &dev_attr_yenta_registers); |
1201 | goto out; | 1201 | if (ret == 0) |
1202 | goto out; | ||
1203 | |||
1204 | /* error path... */ | ||
1205 | pcmcia_unregister_socket(&socket->socket); | ||
1202 | } | 1206 | } |
1203 | 1207 | ||
1204 | unmap: | 1208 | unmap: |
@@ -1213,7 +1217,7 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i | |||
1213 | return ret; | 1217 | return ret; |
1214 | } | 1218 | } |
1215 | 1219 | ||
1216 | 1220 | #ifdef CONFIG_PM | |
1217 | static int yenta_dev_suspend (struct pci_dev *dev, pm_message_t state) | 1221 | static int yenta_dev_suspend (struct pci_dev *dev, pm_message_t state) |
1218 | { | 1222 | { |
1219 | struct yenta_socket *socket = pci_get_drvdata(dev); | 1223 | struct yenta_socket *socket = pci_get_drvdata(dev); |
@@ -1248,12 +1252,18 @@ static int yenta_dev_resume (struct pci_dev *dev) | |||
1248 | struct yenta_socket *socket = pci_get_drvdata(dev); | 1252 | struct yenta_socket *socket = pci_get_drvdata(dev); |
1249 | 1253 | ||
1250 | if (socket) { | 1254 | if (socket) { |
1255 | int rc; | ||
1256 | |||
1251 | pci_set_power_state(dev, 0); | 1257 | pci_set_power_state(dev, 0); |
1252 | /* FIXME: pci_restore_state needs to have a better interface */ | 1258 | /* FIXME: pci_restore_state needs to have a better interface */ |
1253 | pci_restore_state(dev); | 1259 | pci_restore_state(dev); |
1254 | pci_write_config_dword(dev, 16*4, socket->saved_state[0]); | 1260 | pci_write_config_dword(dev, 16*4, socket->saved_state[0]); |
1255 | pci_write_config_dword(dev, 17*4, socket->saved_state[1]); | 1261 | pci_write_config_dword(dev, 17*4, socket->saved_state[1]); |
1256 | pci_enable_device(dev); | 1262 | |
1263 | rc = pci_enable_device(dev); | ||
1264 | if (rc) | ||
1265 | return rc; | ||
1266 | |||
1257 | pci_set_master(dev); | 1267 | pci_set_master(dev); |
1258 | 1268 | ||
1259 | if (socket->type && socket->type->restore_state) | 1269 | if (socket->type && socket->type->restore_state) |
@@ -1262,7 +1272,7 @@ static int yenta_dev_resume (struct pci_dev *dev) | |||
1262 | 1272 | ||
1263 | return pcmcia_socket_dev_resume(&dev->dev); | 1273 | return pcmcia_socket_dev_resume(&dev->dev); |
1264 | } | 1274 | } |
1265 | 1275 | #endif | |
1266 | 1276 | ||
1267 | #define CB_ID(vend,dev,type) \ | 1277 | #define CB_ID(vend,dev,type) \ |
1268 | { \ | 1278 | { \ |
@@ -1359,8 +1369,10 @@ static struct pci_driver yenta_cardbus_driver = { | |||
1359 | .id_table = yenta_table, | 1369 | .id_table = yenta_table, |
1360 | .probe = yenta_probe, | 1370 | .probe = yenta_probe, |
1361 | .remove = __devexit_p(yenta_close), | 1371 | .remove = __devexit_p(yenta_close), |
1372 | #ifdef CONFIG_PM | ||
1362 | .suspend = yenta_dev_suspend, | 1373 | .suspend = yenta_dev_suspend, |
1363 | .resume = yenta_dev_resume, | 1374 | .resume = yenta_dev_resume, |
1375 | #endif | ||
1364 | }; | 1376 | }; |
1365 | 1377 | ||
1366 | 1378 | ||
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index 579cd667b16f..6f11f6dfdd9d 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c | |||
@@ -145,6 +145,13 @@ int rtc_set_alarm(struct class_device *class_dev, struct rtc_wkalrm *alarm) | |||
145 | } | 145 | } |
146 | EXPORT_SYMBOL_GPL(rtc_set_alarm); | 146 | EXPORT_SYMBOL_GPL(rtc_set_alarm); |
147 | 147 | ||
148 | /** | ||
149 | * rtc_update_irq - report RTC periodic, alarm, and/or update irqs | ||
150 | * @class_dev: the rtc's class device | ||
151 | * @num: how many irqs are being reported (usually one) | ||
152 | * @events: mask of RTC_IRQF with one or more of RTC_PF, RTC_AF, RTC_UF | ||
153 | * Context: in_interrupt(), irqs blocked | ||
154 | */ | ||
148 | void rtc_update_irq(struct class_device *class_dev, | 155 | void rtc_update_irq(struct class_device *class_dev, |
149 | unsigned long num, unsigned long events) | 156 | unsigned long num, unsigned long events) |
150 | { | 157 | { |
@@ -201,12 +208,12 @@ int rtc_irq_register(struct class_device *class_dev, struct rtc_task *task) | |||
201 | if (task == NULL || task->func == NULL) | 208 | if (task == NULL || task->func == NULL) |
202 | return -EINVAL; | 209 | return -EINVAL; |
203 | 210 | ||
204 | spin_lock(&rtc->irq_task_lock); | 211 | spin_lock_irq(&rtc->irq_task_lock); |
205 | if (rtc->irq_task == NULL) { | 212 | if (rtc->irq_task == NULL) { |
206 | rtc->irq_task = task; | 213 | rtc->irq_task = task; |
207 | retval = 0; | 214 | retval = 0; |
208 | } | 215 | } |
209 | spin_unlock(&rtc->irq_task_lock); | 216 | spin_unlock_irq(&rtc->irq_task_lock); |
210 | 217 | ||
211 | return retval; | 218 | return retval; |
212 | } | 219 | } |
@@ -216,10 +223,10 @@ void rtc_irq_unregister(struct class_device *class_dev, struct rtc_task *task) | |||
216 | { | 223 | { |
217 | struct rtc_device *rtc = to_rtc_device(class_dev); | 224 | struct rtc_device *rtc = to_rtc_device(class_dev); |
218 | 225 | ||
219 | spin_lock(&rtc->irq_task_lock); | 226 | spin_lock_irq(&rtc->irq_task_lock); |
220 | if (rtc->irq_task == task) | 227 | if (rtc->irq_task == task) |
221 | rtc->irq_task = NULL; | 228 | rtc->irq_task = NULL; |
222 | spin_unlock(&rtc->irq_task_lock); | 229 | spin_unlock_irq(&rtc->irq_task_lock); |
223 | } | 230 | } |
224 | EXPORT_SYMBOL_GPL(rtc_irq_unregister); | 231 | EXPORT_SYMBOL_GPL(rtc_irq_unregister); |
225 | 232 | ||
@@ -265,3 +272,4 @@ int rtc_irq_set_freq(struct class_device *class_dev, struct rtc_task *task, int | |||
265 | } | 272 | } |
266 | return err; | 273 | return err; |
267 | } | 274 | } |
275 | EXPORT_SYMBOL_GPL(rtc_irq_set_freq); | ||
diff --git a/drivers/rtc/rtc-at91.c b/drivers/rtc/rtc-at91.c index bd61e99540a3..5c8addcaf1fb 100644 --- a/drivers/rtc/rtc-at91.c +++ b/drivers/rtc/rtc-at91.c | |||
@@ -292,7 +292,8 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
292 | AT91_RTC_CALEV); | 292 | AT91_RTC_CALEV); |
293 | 293 | ||
294 | ret = request_irq(AT91_ID_SYS, at91_rtc_interrupt, | 294 | ret = request_irq(AT91_ID_SYS, at91_rtc_interrupt, |
295 | IRQF_SHARED, "at91_rtc", pdev); | 295 | IRQF_DISABLED | IRQF_SHARED, |
296 | "at91_rtc", pdev); | ||
296 | if (ret) { | 297 | if (ret) { |
297 | printk(KERN_ERR "at91_rtc: IRQ %d already in use.\n", | 298 | printk(KERN_ERR "at91_rtc: IRQ %d already in use.\n", |
298 | AT91_ID_SYS); | 299 | AT91_ID_SYS); |
diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/rtc-dev.c index 583789c66cdb..814b9e1873f5 100644 --- a/drivers/rtc/rtc-dev.c +++ b/drivers/rtc/rtc-dev.c | |||
@@ -61,7 +61,9 @@ static void rtc_uie_task(void *data) | |||
61 | int err; | 61 | int err; |
62 | 62 | ||
63 | err = rtc_read_time(&rtc->class_dev, &tm); | 63 | err = rtc_read_time(&rtc->class_dev, &tm); |
64 | spin_lock_irq(&rtc->irq_lock); | 64 | |
65 | local_irq_disable(); | ||
66 | spin_lock(&rtc->irq_lock); | ||
65 | if (rtc->stop_uie_polling || err) { | 67 | if (rtc->stop_uie_polling || err) { |
66 | rtc->uie_task_active = 0; | 68 | rtc->uie_task_active = 0; |
67 | } else if (rtc->oldsecs != tm.tm_sec) { | 69 | } else if (rtc->oldsecs != tm.tm_sec) { |
@@ -74,11 +76,11 @@ static void rtc_uie_task(void *data) | |||
74 | } else if (schedule_work(&rtc->uie_task) == 0) { | 76 | } else if (schedule_work(&rtc->uie_task) == 0) { |
75 | rtc->uie_task_active = 0; | 77 | rtc->uie_task_active = 0; |
76 | } | 78 | } |
77 | spin_unlock_irq(&rtc->irq_lock); | 79 | spin_unlock(&rtc->irq_lock); |
78 | if (num) | 80 | if (num) |
79 | rtc_update_irq(&rtc->class_dev, num, RTC_UF | RTC_IRQF); | 81 | rtc_update_irq(&rtc->class_dev, num, RTC_UF | RTC_IRQF); |
82 | local_irq_enable(); | ||
80 | } | 83 | } |
81 | |||
82 | static void rtc_uie_timer(unsigned long data) | 84 | static void rtc_uie_timer(unsigned long data) |
83 | { | 85 | { |
84 | struct rtc_device *rtc = (struct rtc_device *)data; | 86 | struct rtc_device *rtc = (struct rtc_device *)data; |
@@ -214,7 +216,7 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file, | |||
214 | struct rtc_wkalrm alarm; | 216 | struct rtc_wkalrm alarm; |
215 | void __user *uarg = (void __user *) arg; | 217 | void __user *uarg = (void __user *) arg; |
216 | 218 | ||
217 | /* check that the calles has appropriate permissions | 219 | /* check that the calling task has appropriate permissions |
218 | * for certain ioctls. doing this check here is useful | 220 | * for certain ioctls. doing this check here is useful |
219 | * to avoid duplicate code in each driver. | 221 | * to avoid duplicate code in each driver. |
220 | */ | 222 | */ |
@@ -238,10 +240,10 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file, | |||
238 | 240 | ||
239 | /* avoid conflicting IRQ users */ | 241 | /* avoid conflicting IRQ users */ |
240 | if (cmd == RTC_PIE_ON || cmd == RTC_PIE_OFF || cmd == RTC_IRQP_SET) { | 242 | if (cmd == RTC_PIE_ON || cmd == RTC_PIE_OFF || cmd == RTC_IRQP_SET) { |
241 | spin_lock(&rtc->irq_task_lock); | 243 | spin_lock_irq(&rtc->irq_task_lock); |
242 | if (rtc->irq_task) | 244 | if (rtc->irq_task) |
243 | err = -EBUSY; | 245 | err = -EBUSY; |
244 | spin_unlock(&rtc->irq_task_lock); | 246 | spin_unlock_irq(&rtc->irq_task_lock); |
245 | 247 | ||
246 | if (err < 0) | 248 | if (err < 0) |
247 | return err; | 249 | return err; |
@@ -299,6 +301,17 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file, | |||
299 | 301 | ||
300 | err = rtc_set_time(class_dev, &tm); | 302 | err = rtc_set_time(class_dev, &tm); |
301 | break; | 303 | break; |
304 | |||
305 | case RTC_IRQP_READ: | ||
306 | if (ops->irq_set_freq) | ||
307 | err = put_user(rtc->irq_freq, (unsigned long *) arg); | ||
308 | break; | ||
309 | |||
310 | case RTC_IRQP_SET: | ||
311 | if (ops->irq_set_freq) | ||
312 | err = rtc_irq_set_freq(class_dev, rtc->irq_task, arg); | ||
313 | break; | ||
314 | |||
302 | #if 0 | 315 | #if 0 |
303 | case RTC_EPOCH_SET: | 316 | case RTC_EPOCH_SET: |
304 | #ifndef rtc_epoch | 317 | #ifndef rtc_epoch |
diff --git a/drivers/rtc/rtc-ds1553.c b/drivers/rtc/rtc-ds1553.c index 78552e6e76aa..001eb1123a65 100644 --- a/drivers/rtc/rtc-ds1553.c +++ b/drivers/rtc/rtc-ds1553.c | |||
@@ -340,7 +340,8 @@ static int __init ds1553_rtc_probe(struct platform_device *pdev) | |||
340 | 340 | ||
341 | if (pdata->irq >= 0) { | 341 | if (pdata->irq >= 0) { |
342 | writeb(0, ioaddr + RTC_INTERRUPTS); | 342 | writeb(0, ioaddr + RTC_INTERRUPTS); |
343 | if (request_irq(pdata->irq, ds1553_rtc_interrupt, IRQF_SHARED, | 343 | if (request_irq(pdata->irq, ds1553_rtc_interrupt, |
344 | IRQF_DISABLED | IRQF_SHARED, | ||
344 | pdev->name, pdev) < 0) { | 345 | pdev->name, pdev) < 0) { |
345 | dev_warn(&pdev->dev, "interrupt not available.\n"); | 346 | dev_warn(&pdev->dev, "interrupt not available.\n"); |
346 | pdata->irq = -1; | 347 | pdata->irq = -1; |
diff --git a/drivers/rtc/rtc-rs5c372.c b/drivers/rtc/rtc-rs5c372.c index 2a86632580f1..a44fe4efa216 100644 --- a/drivers/rtc/rtc-rs5c372.c +++ b/drivers/rtc/rtc-rs5c372.c | |||
@@ -126,13 +126,13 @@ static int rs5c372_get_trim(struct i2c_client *client, int *osc, int *trim) | |||
126 | return -EIO; | 126 | return -EIO; |
127 | } | 127 | } |
128 | 128 | ||
129 | dev_dbg(&client->dev, "%s: raw trim=%x\n", __FUNCTION__, *trim); | ||
130 | |||
131 | if (osc) | 129 | if (osc) |
132 | *osc = (buf & RS5C372_TRIM_XSL) ? 32000 : 32768; | 130 | *osc = (buf & RS5C372_TRIM_XSL) ? 32000 : 32768; |
133 | 131 | ||
134 | if (trim) | 132 | if (trim) { |
135 | *trim = buf & RS5C372_TRIM_MASK; | 133 | *trim = buf & RS5C372_TRIM_MASK; |
134 | dev_dbg(&client->dev, "%s: raw trim=%x\n", __FUNCTION__, *trim); | ||
135 | } | ||
136 | 136 | ||
137 | return 0; | 137 | return 0; |
138 | } | 138 | } |
diff --git a/drivers/rtc/rtc-test.c b/drivers/rtc/rtc-test.c index bc4bd24508a2..6ef9c62d5032 100644 --- a/drivers/rtc/rtc-test.c +++ b/drivers/rtc/rtc-test.c | |||
@@ -99,6 +99,7 @@ static ssize_t test_irq_store(struct device *dev, | |||
99 | struct rtc_device *rtc = platform_get_drvdata(plat_dev); | 99 | struct rtc_device *rtc = platform_get_drvdata(plat_dev); |
100 | 100 | ||
101 | retval = count; | 101 | retval = count; |
102 | local_irq_disable(); | ||
102 | if (strncmp(buf, "tick", 4) == 0) | 103 | if (strncmp(buf, "tick", 4) == 0) |
103 | rtc_update_irq(&rtc->class_dev, 1, RTC_PF | RTC_IRQF); | 104 | rtc_update_irq(&rtc->class_dev, 1, RTC_PF | RTC_IRQF); |
104 | else if (strncmp(buf, "alarm", 5) == 0) | 105 | else if (strncmp(buf, "alarm", 5) == 0) |
@@ -107,6 +108,7 @@ static ssize_t test_irq_store(struct device *dev, | |||
107 | rtc_update_irq(&rtc->class_dev, 1, RTC_UF | RTC_IRQF); | 108 | rtc_update_irq(&rtc->class_dev, 1, RTC_UF | RTC_IRQF); |
108 | else | 109 | else |
109 | retval = -EINVAL; | 110 | retval = -EINVAL; |
111 | local_irq_enable(); | ||
110 | 112 | ||
111 | return retval; | 113 | return retval; |
112 | } | 114 | } |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index a2dee5bf5a17..ad7f7e1c0163 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -271,10 +271,6 @@ static int css_evaluate_known_subchannel(struct subchannel *sch, int slow) | |||
271 | /* Reset intparm to zeroes. */ | 271 | /* Reset intparm to zeroes. */ |
272 | sch->schib.pmcw.intparm = 0; | 272 | sch->schib.pmcw.intparm = 0; |
273 | cio_modify(sch); | 273 | cio_modify(sch); |
274 | |||
275 | /* Probe if necessary. */ | ||
276 | if (action == UNREGISTER_PROBE) | ||
277 | ret = css_probe_device(sch->schid); | ||
278 | break; | 274 | break; |
279 | case REPROBE: | 275 | case REPROBE: |
280 | device_trigger_reprobe(sch); | 276 | device_trigger_reprobe(sch); |
@@ -283,6 +279,9 @@ static int css_evaluate_known_subchannel(struct subchannel *sch, int slow) | |||
283 | break; | 279 | break; |
284 | } | 280 | } |
285 | spin_unlock_irqrestore(&sch->lock, flags); | 281 | spin_unlock_irqrestore(&sch->lock, flags); |
282 | /* Probe if necessary. */ | ||
283 | if (action == UNREGISTER_PROBE) | ||
284 | ret = css_probe_device(sch->schid); | ||
286 | 285 | ||
287 | return ret; | 286 | return ret; |
288 | } | 287 | } |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 94bdd4d8a4c9..39c98f940507 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -532,8 +532,7 @@ device_remove_files(struct device *dev) | |||
532 | 532 | ||
533 | /* this is a simple abstraction for device_register that sets the | 533 | /* this is a simple abstraction for device_register that sets the |
534 | * correct bus type and adds the bus specific files */ | 534 | * correct bus type and adds the bus specific files */ |
535 | int | 535 | static int ccw_device_register(struct ccw_device *cdev) |
536 | ccw_device_register(struct ccw_device *cdev) | ||
537 | { | 536 | { |
538 | struct device *dev = &cdev->dev; | 537 | struct device *dev = &cdev->dev; |
539 | int ret; | 538 | int ret; |
diff --git a/drivers/s390/cio/device.h b/drivers/s390/cio/device.h index c6140cc97a80..9233b5c0bcc8 100644 --- a/drivers/s390/cio/device.h +++ b/drivers/s390/cio/device.h | |||
@@ -78,7 +78,6 @@ void io_subchannel_recog_done(struct ccw_device *cdev); | |||
78 | 78 | ||
79 | int ccw_device_cancel_halt_clear(struct ccw_device *); | 79 | int ccw_device_cancel_halt_clear(struct ccw_device *); |
80 | 80 | ||
81 | int ccw_device_register(struct ccw_device *); | ||
82 | void ccw_device_do_unreg_rereg(void *); | 81 | void ccw_device_do_unreg_rereg(void *); |
83 | void ccw_device_call_sch_unregister(void *); | 82 | void ccw_device_call_sch_unregister(void *); |
84 | 83 | ||
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index c5ccd20b110c..79d89c368919 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c | |||
@@ -739,11 +739,16 @@ static void ap_scan_bus(void *data) | |||
739 | dev = bus_find_device(&ap_bus_type, NULL, | 739 | dev = bus_find_device(&ap_bus_type, NULL, |
740 | (void *)(unsigned long)qid, | 740 | (void *)(unsigned long)qid, |
741 | __ap_scan_bus); | 741 | __ap_scan_bus); |
742 | rc = ap_query_queue(qid, &queue_depth, &device_type); | ||
743 | if (dev && rc) { | ||
744 | put_device(dev); | ||
745 | device_unregister(dev); | ||
746 | continue; | ||
747 | } | ||
742 | if (dev) { | 748 | if (dev) { |
743 | put_device(dev); | 749 | put_device(dev); |
744 | continue; | 750 | continue; |
745 | } | 751 | } |
746 | rc = ap_query_queue(qid, &queue_depth, &device_type); | ||
747 | if (rc) | 752 | if (rc) |
748 | continue; | 753 | continue; |
749 | rc = ap_init_queue(qid); | 754 | rc = ap_init_queue(qid); |
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index 8f882690994d..74c0eac083e4 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h | |||
@@ -107,6 +107,10 @@ zfcp_address_to_sg(void *address, struct scatterlist *list) | |||
107 | (ZFCP_MAX_SBALS_PER_REQ * ZFCP_MAX_SBALES_PER_SBAL - 2) | 107 | (ZFCP_MAX_SBALS_PER_REQ * ZFCP_MAX_SBALES_PER_SBAL - 2) |
108 | /* request ID + QTCB in SBALE 0 + 1 of first SBAL in chain */ | 108 | /* request ID + QTCB in SBALE 0 + 1 of first SBAL in chain */ |
109 | 109 | ||
110 | #define ZFCP_MAX_SECTORS (ZFCP_MAX_SBALES_PER_REQ * 8) | ||
111 | /* max. number of (data buffer) SBALEs in largest SBAL chain | ||
112 | multiplied with number of sectors per 4k block */ | ||
113 | |||
110 | /* FIXME(tune): free space should be one max. SBAL chain plus what? */ | 114 | /* FIXME(tune): free space should be one max. SBAL chain plus what? */ |
111 | #define ZFCP_QDIO_PCI_INTERVAL (QDIO_MAX_BUFFERS_PER_Q \ | 115 | #define ZFCP_QDIO_PCI_INTERVAL (QDIO_MAX_BUFFERS_PER_Q \ |
112 | - (ZFCP_MAX_SBALS_PER_REQ + 4)) | 116 | - (ZFCP_MAX_SBALS_PER_REQ + 4)) |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 4d2bc7981324..452d96f92a14 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -58,6 +58,7 @@ struct zfcp_data zfcp_data = { | |||
58 | .cmd_per_lun = 1, | 58 | .cmd_per_lun = 1, |
59 | .use_clustering = 1, | 59 | .use_clustering = 1, |
60 | .sdev_attrs = zfcp_sysfs_sdev_attrs, | 60 | .sdev_attrs = zfcp_sysfs_sdev_attrs, |
61 | .max_sectors = ZFCP_MAX_SECTORS, | ||
61 | }, | 62 | }, |
62 | .driver_version = ZFCP_VERSION, | 63 | .driver_version = ZFCP_VERSION, |
63 | }; | 64 | }; |
diff --git a/drivers/sbus/sbus.c b/drivers/sbus/sbus.c index 935952ef88f1..98fcbb3d5560 100644 --- a/drivers/sbus/sbus.c +++ b/drivers/sbus/sbus.c | |||
@@ -61,11 +61,11 @@ static void __init fill_sbus_device(struct device_node *dp, struct sbus_dev *sde | |||
61 | else | 61 | else |
62 | sdev->ofdev.dev.parent = &sdev->bus->ofdev.dev; | 62 | sdev->ofdev.dev.parent = &sdev->bus->ofdev.dev; |
63 | sdev->ofdev.dev.bus = &sbus_bus_type; | 63 | sdev->ofdev.dev.bus = &sbus_bus_type; |
64 | strcpy(sdev->ofdev.dev.bus_id, dp->path_component_name); | 64 | sprintf(sdev->ofdev.dev.bus_id, "sbus[%08x]", dp->node); |
65 | 65 | ||
66 | if (of_device_register(&sdev->ofdev) != 0) | 66 | if (of_device_register(&sdev->ofdev) != 0) |
67 | printk(KERN_DEBUG "sbus: device registration error for %s!\n", | 67 | printk(KERN_DEBUG "sbus: device registration error for %s!\n", |
68 | sdev->ofdev.dev.bus_id); | 68 | dp->path_component_name); |
69 | } | 69 | } |
70 | 70 | ||
71 | static void __init sbus_bus_ranges_init(struct device_node *dp, struct sbus_bus *sbus) | 71 | static void __init sbus_bus_ranges_init(struct device_node *dp, struct sbus_bus *sbus) |
diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c index 5f8c26cd66ca..b091a0fc4eb0 100644 --- a/drivers/scsi/3w-9xxx.c +++ b/drivers/scsi/3w-9xxx.c | |||
@@ -66,6 +66,9 @@ | |||
66 | 2.26.02.006 - Fix 9550SX pchip reset timeout. | 66 | 2.26.02.006 - Fix 9550SX pchip reset timeout. |
67 | Add big endian support. | 67 | Add big endian support. |
68 | 2.26.02.007 - Disable local interrupts during kmap/unmap_atomic(). | 68 | 2.26.02.007 - Disable local interrupts during kmap/unmap_atomic(). |
69 | 2.26.02.008 - Free irq handler in __twa_shutdown(). | ||
70 | Serialize reset code. | ||
71 | Add support for 9650SE controllers. | ||
69 | */ | 72 | */ |
70 | 73 | ||
71 | #include <linux/module.h> | 74 | #include <linux/module.h> |
@@ -89,7 +92,7 @@ | |||
89 | #include "3w-9xxx.h" | 92 | #include "3w-9xxx.h" |
90 | 93 | ||
91 | /* Globals */ | 94 | /* Globals */ |
92 | #define TW_DRIVER_VERSION "2.26.02.007" | 95 | #define TW_DRIVER_VERSION "2.26.02.008" |
93 | static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; | 96 | static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; |
94 | static unsigned int twa_device_extension_count; | 97 | static unsigned int twa_device_extension_count; |
95 | static int twa_major = -1; | 98 | static int twa_major = -1; |
@@ -566,9 +569,9 @@ static int twa_check_srl(TW_Device_Extension *tw_dev, int *flashed) | |||
566 | goto out; | 569 | goto out; |
567 | } | 570 | } |
568 | 571 | ||
569 | tw_dev->working_srl = fw_on_ctlr_srl; | 572 | tw_dev->tw_compat_info.working_srl = fw_on_ctlr_srl; |
570 | tw_dev->working_branch = fw_on_ctlr_branch; | 573 | tw_dev->tw_compat_info.working_branch = fw_on_ctlr_branch; |
571 | tw_dev->working_build = fw_on_ctlr_build; | 574 | tw_dev->tw_compat_info.working_build = fw_on_ctlr_build; |
572 | 575 | ||
573 | /* Try base mode compatibility */ | 576 | /* Try base mode compatibility */ |
574 | if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) { | 577 | if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) { |
@@ -590,10 +593,23 @@ static int twa_check_srl(TW_Device_Extension *tw_dev, int *flashed) | |||
590 | } | 593 | } |
591 | goto out; | 594 | goto out; |
592 | } | 595 | } |
593 | tw_dev->working_srl = TW_BASE_FW_SRL; | 596 | tw_dev->tw_compat_info.working_srl = TW_BASE_FW_SRL; |
594 | tw_dev->working_branch = TW_BASE_FW_BRANCH; | 597 | tw_dev->tw_compat_info.working_branch = TW_BASE_FW_BRANCH; |
595 | tw_dev->working_build = TW_BASE_FW_BUILD; | 598 | tw_dev->tw_compat_info.working_build = TW_BASE_FW_BUILD; |
596 | } | 599 | } |
600 | |||
601 | /* Load rest of compatibility struct */ | ||
602 | strncpy(tw_dev->tw_compat_info.driver_version, TW_DRIVER_VERSION, strlen(TW_DRIVER_VERSION)); | ||
603 | tw_dev->tw_compat_info.driver_srl_high = TW_CURRENT_DRIVER_SRL; | ||
604 | tw_dev->tw_compat_info.driver_branch_high = TW_CURRENT_DRIVER_BRANCH; | ||
605 | tw_dev->tw_compat_info.driver_build_high = TW_CURRENT_DRIVER_BUILD; | ||
606 | tw_dev->tw_compat_info.driver_srl_low = TW_BASE_FW_SRL; | ||
607 | tw_dev->tw_compat_info.driver_branch_low = TW_BASE_FW_BRANCH; | ||
608 | tw_dev->tw_compat_info.driver_build_low = TW_BASE_FW_BUILD; | ||
609 | tw_dev->tw_compat_info.fw_on_ctlr_srl = fw_on_ctlr_srl; | ||
610 | tw_dev->tw_compat_info.fw_on_ctlr_branch = fw_on_ctlr_branch; | ||
611 | tw_dev->tw_compat_info.fw_on_ctlr_build = fw_on_ctlr_build; | ||
612 | |||
597 | retval = 0; | 613 | retval = 0; |
598 | out: | 614 | out: |
599 | return retval; | 615 | return retval; |
@@ -631,7 +647,7 @@ static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int | |||
631 | goto out2; | 647 | goto out2; |
632 | 648 | ||
633 | /* Check data buffer size */ | 649 | /* Check data buffer size */ |
634 | if (driver_command.buffer_length > TW_MAX_SECTORS * 512) { | 650 | if (driver_command.buffer_length > TW_MAX_SECTORS * 2048) { |
635 | retval = TW_IOCTL_ERROR_OS_EINVAL; | 651 | retval = TW_IOCTL_ERROR_OS_EINVAL; |
636 | goto out2; | 652 | goto out2; |
637 | } | 653 | } |
@@ -680,13 +696,6 @@ static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int | |||
680 | /* Now wait for command to complete */ | 696 | /* Now wait for command to complete */ |
681 | timeout = wait_event_timeout(tw_dev->ioctl_wqueue, tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE, timeout); | 697 | timeout = wait_event_timeout(tw_dev->ioctl_wqueue, tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE, timeout); |
682 | 698 | ||
683 | /* See if we reset while waiting for the ioctl to complete */ | ||
684 | if (test_bit(TW_IN_RESET, &tw_dev->flags)) { | ||
685 | clear_bit(TW_IN_RESET, &tw_dev->flags); | ||
686 | retval = TW_IOCTL_ERROR_OS_ERESTARTSYS; | ||
687 | goto out3; | ||
688 | } | ||
689 | |||
690 | /* We timed out, and didn't get an interrupt */ | 699 | /* We timed out, and didn't get an interrupt */ |
691 | if (tw_dev->chrdev_request_id != TW_IOCTL_CHRDEV_FREE) { | 700 | if (tw_dev->chrdev_request_id != TW_IOCTL_CHRDEV_FREE) { |
692 | /* Now we need to reset the board */ | 701 | /* Now we need to reset the board */ |
@@ -694,11 +703,6 @@ static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int | |||
694 | tw_dev->host->host_no, TW_DRIVER, 0xc, | 703 | tw_dev->host->host_no, TW_DRIVER, 0xc, |
695 | cmd); | 704 | cmd); |
696 | retval = TW_IOCTL_ERROR_OS_EIO; | 705 | retval = TW_IOCTL_ERROR_OS_EIO; |
697 | spin_lock_irqsave(tw_dev->host->host_lock, flags); | ||
698 | tw_dev->state[request_id] = TW_S_COMPLETED; | ||
699 | twa_free_request_id(tw_dev, request_id); | ||
700 | tw_dev->posted_request_count--; | ||
701 | spin_unlock_irqrestore(tw_dev->host->host_lock, flags); | ||
702 | twa_reset_device_extension(tw_dev, 1); | 706 | twa_reset_device_extension(tw_dev, 1); |
703 | goto out3; | 707 | goto out3; |
704 | } | 708 | } |
@@ -717,16 +721,7 @@ static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int | |||
717 | tw_ioctl->driver_command.status = 0; | 721 | tw_ioctl->driver_command.status = 0; |
718 | /* Copy compatiblity struct into ioctl data buffer */ | 722 | /* Copy compatiblity struct into ioctl data buffer */ |
719 | tw_compat_info = (TW_Compatibility_Info *)tw_ioctl->data_buffer; | 723 | tw_compat_info = (TW_Compatibility_Info *)tw_ioctl->data_buffer; |
720 | strncpy(tw_compat_info->driver_version, TW_DRIVER_VERSION, strlen(TW_DRIVER_VERSION)); | 724 | memcpy(tw_compat_info, &tw_dev->tw_compat_info, sizeof(TW_Compatibility_Info)); |
721 | tw_compat_info->working_srl = tw_dev->working_srl; | ||
722 | tw_compat_info->working_branch = tw_dev->working_branch; | ||
723 | tw_compat_info->working_build = tw_dev->working_build; | ||
724 | tw_compat_info->driver_srl_high = TW_CURRENT_DRIVER_SRL; | ||
725 | tw_compat_info->driver_branch_high = TW_CURRENT_DRIVER_BRANCH; | ||
726 | tw_compat_info->driver_build_high = TW_CURRENT_DRIVER_BUILD; | ||
727 | tw_compat_info->driver_srl_low = TW_BASE_FW_SRL; | ||
728 | tw_compat_info->driver_branch_low = TW_BASE_FW_BRANCH; | ||
729 | tw_compat_info->driver_build_low = TW_BASE_FW_BUILD; | ||
730 | break; | 725 | break; |
731 | case TW_IOCTL_GET_LAST_EVENT: | 726 | case TW_IOCTL_GET_LAST_EVENT: |
732 | if (tw_dev->event_queue_wrapped) { | 727 | if (tw_dev->event_queue_wrapped) { |
@@ -895,7 +890,8 @@ static int twa_decode_bits(TW_Device_Extension *tw_dev, u32 status_reg_value) | |||
895 | } | 890 | } |
896 | 891 | ||
897 | if (status_reg_value & TW_STATUS_QUEUE_ERROR) { | 892 | if (status_reg_value & TW_STATUS_QUEUE_ERROR) { |
898 | TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Controller Queue Error: clearing"); | 893 | if ((tw_dev->tw_pci_dev->device != PCI_DEVICE_ID_3WARE_9650SE) || (!test_bit(TW_IN_RESET, &tw_dev->flags))) |
894 | TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Controller Queue Error: clearing"); | ||
899 | writel(TW_CONTROL_CLEAR_QUEUE_ERROR, TW_CONTROL_REG_ADDR(tw_dev)); | 895 | writel(TW_CONTROL_CLEAR_QUEUE_ERROR, TW_CONTROL_REG_ADDR(tw_dev)); |
900 | } | 896 | } |
901 | 897 | ||
@@ -939,10 +935,12 @@ static int twa_empty_response_queue_large(TW_Device_Extension *tw_dev) | |||
939 | unsigned long before; | 935 | unsigned long before; |
940 | int retval = 1; | 936 | int retval = 1; |
941 | 937 | ||
942 | if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9550SX) { | 938 | if ((tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9550SX) || |
939 | (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE)) { | ||
943 | before = jiffies; | 940 | before = jiffies; |
944 | while ((response_que_value & TW_9550SX_DRAIN_COMPLETED) != TW_9550SX_DRAIN_COMPLETED) { | 941 | while ((response_que_value & TW_9550SX_DRAIN_COMPLETED) != TW_9550SX_DRAIN_COMPLETED) { |
945 | response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR_LARGE(tw_dev)); | 942 | response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR_LARGE(tw_dev)); |
943 | msleep(1); | ||
946 | if (time_after(jiffies, before + HZ * 30)) | 944 | if (time_after(jiffies, before + HZ * 30)) |
947 | goto out; | 945 | goto out; |
948 | } | 946 | } |
@@ -1214,6 +1212,10 @@ static irqreturn_t twa_interrupt(int irq, void *dev_instance) | |||
1214 | 1212 | ||
1215 | handled = 1; | 1213 | handled = 1; |
1216 | 1214 | ||
1215 | /* If we are resetting, bail */ | ||
1216 | if (test_bit(TW_IN_RESET, &tw_dev->flags)) | ||
1217 | goto twa_interrupt_bail; | ||
1218 | |||
1217 | /* Check controller for errors */ | 1219 | /* Check controller for errors */ |
1218 | if (twa_check_bits(status_reg_value)) { | 1220 | if (twa_check_bits(status_reg_value)) { |
1219 | if (twa_decode_bits(tw_dev, status_reg_value)) { | 1221 | if (twa_decode_bits(tw_dev, status_reg_value)) { |
@@ -1355,8 +1357,8 @@ static void twa_load_sgl(TW_Command_Full *full_command_packet, int request_id, d | |||
1355 | 1357 | ||
1356 | if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) { | 1358 | if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) { |
1357 | newcommand = &full_command_packet->command.newcommand; | 1359 | newcommand = &full_command_packet->command.newcommand; |
1358 | newcommand->request_id__lunl = | 1360 | newcommand->request_id__lunl = |
1359 | TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id); | 1361 | cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id)); |
1360 | newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1); | 1362 | newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1); |
1361 | newcommand->sg_list[0].length = cpu_to_le32(length); | 1363 | newcommand->sg_list[0].length = cpu_to_le32(length); |
1362 | newcommand->sgl_entries__lunh = | 1364 | newcommand->sgl_entries__lunh = |
@@ -1531,6 +1533,13 @@ static int twa_post_command_packet(TW_Device_Extension *tw_dev, int request_id, | |||
1531 | int retval = 1; | 1533 | int retval = 1; |
1532 | 1534 | ||
1533 | command_que_value = tw_dev->command_packet_phys[request_id]; | 1535 | command_que_value = tw_dev->command_packet_phys[request_id]; |
1536 | |||
1537 | /* For 9650SE write low 4 bytes first */ | ||
1538 | if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE) { | ||
1539 | command_que_value += TW_COMMAND_OFFSET; | ||
1540 | writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR_LARGE(tw_dev)); | ||
1541 | } | ||
1542 | |||
1534 | status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev)); | 1543 | status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev)); |
1535 | 1544 | ||
1536 | if (twa_check_bits(status_reg_value)) | 1545 | if (twa_check_bits(status_reg_value)) |
@@ -1557,13 +1566,17 @@ static int twa_post_command_packet(TW_Device_Extension *tw_dev, int request_id, | |||
1557 | TW_UNMASK_COMMAND_INTERRUPT(tw_dev); | 1566 | TW_UNMASK_COMMAND_INTERRUPT(tw_dev); |
1558 | goto out; | 1567 | goto out; |
1559 | } else { | 1568 | } else { |
1560 | /* We successfully posted the command packet */ | 1569 | if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE) { |
1561 | if (sizeof(dma_addr_t) > 4) { | 1570 | /* Now write upper 4 bytes */ |
1562 | command_que_value += TW_COMMAND_OFFSET; | 1571 | writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR_LARGE(tw_dev) + 0x4); |
1563 | writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev)); | ||
1564 | writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR(tw_dev) + 0x4); | ||
1565 | } else { | 1572 | } else { |
1566 | writel(TW_COMMAND_OFFSET + command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev)); | 1573 | if (sizeof(dma_addr_t) > 4) { |
1574 | command_que_value += TW_COMMAND_OFFSET; | ||
1575 | writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev)); | ||
1576 | writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR(tw_dev) + 0x4); | ||
1577 | } else { | ||
1578 | writel(TW_COMMAND_OFFSET + command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev)); | ||
1579 | } | ||
1567 | } | 1580 | } |
1568 | tw_dev->state[request_id] = TW_S_POSTED; | 1581 | tw_dev->state[request_id] = TW_S_POSTED; |
1569 | tw_dev->posted_request_count++; | 1582 | tw_dev->posted_request_count++; |
@@ -1620,14 +1633,9 @@ static int twa_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_res | |||
1620 | goto out; | 1633 | goto out; |
1621 | 1634 | ||
1622 | TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev); | 1635 | TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev); |
1636 | clear_bit(TW_IN_RESET, &tw_dev->flags); | ||
1637 | tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; | ||
1623 | 1638 | ||
1624 | /* Wake up any ioctl that was pending before the reset */ | ||
1625 | if ((tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE) || (ioctl_reset)) { | ||
1626 | clear_bit(TW_IN_RESET, &tw_dev->flags); | ||
1627 | } else { | ||
1628 | tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; | ||
1629 | wake_up(&tw_dev->ioctl_wqueue); | ||
1630 | } | ||
1631 | retval = 0; | 1639 | retval = 0; |
1632 | out: | 1640 | out: |
1633 | return retval; | 1641 | return retval; |
@@ -1736,6 +1744,9 @@ static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt) | |||
1736 | "WARNING: (0x%02X:0x%04X): Command (0x%x) timed out, resetting card.\n", | 1744 | "WARNING: (0x%02X:0x%04X): Command (0x%x) timed out, resetting card.\n", |
1737 | TW_DRIVER, 0x2c, SCpnt->cmnd[0]); | 1745 | TW_DRIVER, 0x2c, SCpnt->cmnd[0]); |
1738 | 1746 | ||
1747 | /* Make sure we are not issuing an ioctl or resetting from ioctl */ | ||
1748 | mutex_lock(&tw_dev->ioctl_lock); | ||
1749 | |||
1739 | /* Now reset the card and some of the device extension data */ | 1750 | /* Now reset the card and some of the device extension data */ |
1740 | if (twa_reset_device_extension(tw_dev, 0)) { | 1751 | if (twa_reset_device_extension(tw_dev, 0)) { |
1741 | TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2b, "Controller reset failed during scsi host reset"); | 1752 | TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2b, "Controller reset failed during scsi host reset"); |
@@ -1744,6 +1755,7 @@ static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt) | |||
1744 | 1755 | ||
1745 | retval = SUCCESS; | 1756 | retval = SUCCESS; |
1746 | out: | 1757 | out: |
1758 | mutex_unlock(&tw_dev->ioctl_lock); | ||
1747 | return retval; | 1759 | return retval; |
1748 | } /* End twa_scsi_eh_reset() */ | 1760 | } /* End twa_scsi_eh_reset() */ |
1749 | 1761 | ||
@@ -1753,8 +1765,14 @@ static int twa_scsi_queue(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd | |||
1753 | int request_id, retval; | 1765 | int request_id, retval; |
1754 | TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata; | 1766 | TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata; |
1755 | 1767 | ||
1768 | /* If we are resetting due to timed out ioctl, report as busy */ | ||
1769 | if (test_bit(TW_IN_RESET, &tw_dev->flags)) { | ||
1770 | retval = SCSI_MLQUEUE_HOST_BUSY; | ||
1771 | goto out; | ||
1772 | } | ||
1773 | |||
1756 | /* Check if this FW supports luns */ | 1774 | /* Check if this FW supports luns */ |
1757 | if ((SCpnt->device->lun != 0) && (tw_dev->working_srl < TW_FW_SRL_LUNS_SUPPORTED)) { | 1775 | if ((SCpnt->device->lun != 0) && (tw_dev->tw_compat_info.working_srl < TW_FW_SRL_LUNS_SUPPORTED)) { |
1758 | SCpnt->result = (DID_BAD_TARGET << 16); | 1776 | SCpnt->result = (DID_BAD_TARGET << 16); |
1759 | done(SCpnt); | 1777 | done(SCpnt); |
1760 | retval = 0; | 1778 | retval = 0; |
@@ -1960,6 +1978,9 @@ static void __twa_shutdown(TW_Device_Extension *tw_dev) | |||
1960 | /* Disable interrupts */ | 1978 | /* Disable interrupts */ |
1961 | TW_DISABLE_INTERRUPTS(tw_dev); | 1979 | TW_DISABLE_INTERRUPTS(tw_dev); |
1962 | 1980 | ||
1981 | /* Free up the IRQ */ | ||
1982 | free_irq(tw_dev->tw_pci_dev->irq, tw_dev); | ||
1983 | |||
1963 | printk(KERN_WARNING "3w-9xxx: Shutting down host %d.\n", tw_dev->host->host_no); | 1984 | printk(KERN_WARNING "3w-9xxx: Shutting down host %d.\n", tw_dev->host->host_no); |
1964 | 1985 | ||
1965 | /* Tell the card we are shutting down */ | 1986 | /* Tell the card we are shutting down */ |
@@ -2091,21 +2112,25 @@ static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id | |||
2091 | 2112 | ||
2092 | /* Initialize the card */ | 2113 | /* Initialize the card */ |
2093 | if (twa_reset_sequence(tw_dev, 0)) | 2114 | if (twa_reset_sequence(tw_dev, 0)) |
2094 | goto out_release_mem_region; | 2115 | goto out_iounmap; |
2095 | 2116 | ||
2096 | /* Set host specific parameters */ | 2117 | /* Set host specific parameters */ |
2097 | host->max_id = TW_MAX_UNITS; | 2118 | if (pdev->device == PCI_DEVICE_ID_3WARE_9650SE) |
2119 | host->max_id = TW_MAX_UNITS_9650SE; | ||
2120 | else | ||
2121 | host->max_id = TW_MAX_UNITS; | ||
2122 | |||
2098 | host->max_cmd_len = TW_MAX_CDB_LEN; | 2123 | host->max_cmd_len = TW_MAX_CDB_LEN; |
2099 | 2124 | ||
2100 | /* Channels aren't supported by adapter */ | 2125 | /* Channels aren't supported by adapter */ |
2101 | host->max_lun = TW_MAX_LUNS(tw_dev->working_srl); | 2126 | host->max_lun = TW_MAX_LUNS(tw_dev->tw_compat_info.working_srl); |
2102 | host->max_channel = 0; | 2127 | host->max_channel = 0; |
2103 | 2128 | ||
2104 | /* Register the card with the kernel SCSI layer */ | 2129 | /* Register the card with the kernel SCSI layer */ |
2105 | retval = scsi_add_host(host, &pdev->dev); | 2130 | retval = scsi_add_host(host, &pdev->dev); |
2106 | if (retval) { | 2131 | if (retval) { |
2107 | TW_PRINTK(tw_dev->host, TW_DRIVER, 0x27, "scsi add host failed"); | 2132 | TW_PRINTK(tw_dev->host, TW_DRIVER, 0x27, "scsi add host failed"); |
2108 | goto out_release_mem_region; | 2133 | goto out_iounmap; |
2109 | } | 2134 | } |
2110 | 2135 | ||
2111 | pci_set_drvdata(pdev, host); | 2136 | pci_set_drvdata(pdev, host); |
@@ -2145,6 +2170,8 @@ static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id | |||
2145 | 2170 | ||
2146 | out_remove_host: | 2171 | out_remove_host: |
2147 | scsi_remove_host(host); | 2172 | scsi_remove_host(host); |
2173 | out_iounmap: | ||
2174 | iounmap(tw_dev->base_addr); | ||
2148 | out_release_mem_region: | 2175 | out_release_mem_region: |
2149 | pci_release_regions(pdev); | 2176 | pci_release_regions(pdev); |
2150 | out_free_device_extension: | 2177 | out_free_device_extension: |
@@ -2170,12 +2197,12 @@ static void twa_remove(struct pci_dev *pdev) | |||
2170 | twa_major = -1; | 2197 | twa_major = -1; |
2171 | } | 2198 | } |
2172 | 2199 | ||
2173 | /* Free up the IRQ */ | ||
2174 | free_irq(tw_dev->tw_pci_dev->irq, tw_dev); | ||
2175 | |||
2176 | /* Shutdown the card */ | 2200 | /* Shutdown the card */ |
2177 | __twa_shutdown(tw_dev); | 2201 | __twa_shutdown(tw_dev); |
2178 | 2202 | ||
2203 | /* Free IO remapping */ | ||
2204 | iounmap(tw_dev->base_addr); | ||
2205 | |||
2179 | /* Free up the mem region */ | 2206 | /* Free up the mem region */ |
2180 | pci_release_regions(pdev); | 2207 | pci_release_regions(pdev); |
2181 | 2208 | ||
@@ -2193,6 +2220,8 @@ static struct pci_device_id twa_pci_tbl[] __devinitdata = { | |||
2193 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 2220 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, |
2194 | { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX, | 2221 | { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX, |
2195 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 2222 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, |
2223 | { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9650SE, | ||
2224 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | ||
2196 | { } | 2225 | { } |
2197 | }; | 2226 | }; |
2198 | MODULE_DEVICE_TABLE(pci, twa_pci_tbl); | 2227 | MODULE_DEVICE_TABLE(pci, twa_pci_tbl); |
diff --git a/drivers/scsi/3w-9xxx.h b/drivers/scsi/3w-9xxx.h index e5685be96f45..7901517d4513 100644 --- a/drivers/scsi/3w-9xxx.h +++ b/drivers/scsi/3w-9xxx.h | |||
@@ -289,7 +289,6 @@ static twa_message_type twa_error_table[] = { | |||
289 | #define TW_STATUS_VALID_INTERRUPT 0x00DF0000 | 289 | #define TW_STATUS_VALID_INTERRUPT 0x00DF0000 |
290 | 290 | ||
291 | /* PCI related defines */ | 291 | /* PCI related defines */ |
292 | #define TW_NUMDEVICES 1 | ||
293 | #define TW_PCI_CLEAR_PARITY_ERRORS 0xc100 | 292 | #define TW_PCI_CLEAR_PARITY_ERRORS 0xc100 |
294 | #define TW_PCI_CLEAR_PCI_ABORT 0x2000 | 293 | #define TW_PCI_CLEAR_PCI_ABORT 0x2000 |
295 | 294 | ||
@@ -335,6 +334,7 @@ static twa_message_type twa_error_table[] = { | |||
335 | #define TW_ALIGNMENT_9000 4 /* 4 bytes */ | 334 | #define TW_ALIGNMENT_9000 4 /* 4 bytes */ |
336 | #define TW_ALIGNMENT_9000_SGL 0x3 | 335 | #define TW_ALIGNMENT_9000_SGL 0x3 |
337 | #define TW_MAX_UNITS 16 | 336 | #define TW_MAX_UNITS 16 |
337 | #define TW_MAX_UNITS_9650SE 32 | ||
338 | #define TW_INIT_MESSAGE_CREDITS 0x100 | 338 | #define TW_INIT_MESSAGE_CREDITS 0x100 |
339 | #define TW_INIT_COMMAND_PACKET_SIZE 0x3 | 339 | #define TW_INIT_COMMAND_PACKET_SIZE 0x3 |
340 | #define TW_INIT_COMMAND_PACKET_SIZE_EXTENDED 0x6 | 340 | #define TW_INIT_COMMAND_PACKET_SIZE_EXTENDED 0x6 |
@@ -354,7 +354,6 @@ static twa_message_type twa_error_table[] = { | |||
354 | #define TW_MAX_RESPONSE_DRAIN 256 | 354 | #define TW_MAX_RESPONSE_DRAIN 256 |
355 | #define TW_MAX_AEN_DRAIN 40 | 355 | #define TW_MAX_AEN_DRAIN 40 |
356 | #define TW_IN_RESET 2 | 356 | #define TW_IN_RESET 2 |
357 | #define TW_IN_CHRDEV_IOCTL 3 | ||
358 | #define TW_IN_ATTENTION_LOOP 4 | 357 | #define TW_IN_ATTENTION_LOOP 4 |
359 | #define TW_MAX_SECTORS 256 | 358 | #define TW_MAX_SECTORS 256 |
360 | #define TW_AEN_WAIT_TIME 1000 | 359 | #define TW_AEN_WAIT_TIME 1000 |
@@ -417,6 +416,9 @@ static twa_message_type twa_error_table[] = { | |||
417 | #ifndef PCI_DEVICE_ID_3WARE_9550SX | 416 | #ifndef PCI_DEVICE_ID_3WARE_9550SX |
418 | #define PCI_DEVICE_ID_3WARE_9550SX 0x1003 | 417 | #define PCI_DEVICE_ID_3WARE_9550SX 0x1003 |
419 | #endif | 418 | #endif |
419 | #ifndef PCI_DEVICE_ID_3WARE_9650SE | ||
420 | #define PCI_DEVICE_ID_3WARE_9650SE 0x1004 | ||
421 | #endif | ||
420 | 422 | ||
421 | /* Bitmask macros to eliminate bitfields */ | 423 | /* Bitmask macros to eliminate bitfields */ |
422 | 424 | ||
@@ -442,6 +444,7 @@ static twa_message_type twa_error_table[] = { | |||
442 | #define TW_CONTROL_REG_ADDR(x) (x->base_addr) | 444 | #define TW_CONTROL_REG_ADDR(x) (x->base_addr) |
443 | #define TW_STATUS_REG_ADDR(x) ((unsigned char __iomem *)x->base_addr + 0x4) | 445 | #define TW_STATUS_REG_ADDR(x) ((unsigned char __iomem *)x->base_addr + 0x4) |
444 | #define TW_COMMAND_QUEUE_REG_ADDR(x) (sizeof(dma_addr_t) > 4 ? ((unsigned char __iomem *)x->base_addr + 0x20) : ((unsigned char __iomem *)x->base_addr + 0x8)) | 446 | #define TW_COMMAND_QUEUE_REG_ADDR(x) (sizeof(dma_addr_t) > 4 ? ((unsigned char __iomem *)x->base_addr + 0x20) : ((unsigned char __iomem *)x->base_addr + 0x8)) |
447 | #define TW_COMMAND_QUEUE_REG_ADDR_LARGE(x) ((unsigned char __iomem *)x->base_addr + 0x20) | ||
445 | #define TW_RESPONSE_QUEUE_REG_ADDR(x) ((unsigned char __iomem *)x->base_addr + 0xC) | 448 | #define TW_RESPONSE_QUEUE_REG_ADDR(x) ((unsigned char __iomem *)x->base_addr + 0xC) |
446 | #define TW_RESPONSE_QUEUE_REG_ADDR_LARGE(x) ((unsigned char __iomem *)x->base_addr + 0x30) | 449 | #define TW_RESPONSE_QUEUE_REG_ADDR_LARGE(x) ((unsigned char __iomem *)x->base_addr + 0x30) |
447 | #define TW_CLEAR_ALL_INTERRUPTS(x) (writel(TW_STATUS_VALID_INTERRUPT, TW_CONTROL_REG_ADDR(x))) | 450 | #define TW_CLEAR_ALL_INTERRUPTS(x) (writel(TW_STATUS_VALID_INTERRUPT, TW_CONTROL_REG_ADDR(x))) |
@@ -626,6 +629,9 @@ typedef struct TAG_TW_Compatibility_Info | |||
626 | unsigned short driver_srl_low; | 629 | unsigned short driver_srl_low; |
627 | unsigned short driver_branch_low; | 630 | unsigned short driver_branch_low; |
628 | unsigned short driver_build_low; | 631 | unsigned short driver_build_low; |
632 | unsigned short fw_on_ctlr_srl; | ||
633 | unsigned short fw_on_ctlr_branch; | ||
634 | unsigned short fw_on_ctlr_build; | ||
629 | } TW_Compatibility_Info; | 635 | } TW_Compatibility_Info; |
630 | 636 | ||
631 | #pragma pack() | 637 | #pragma pack() |
@@ -668,9 +674,7 @@ typedef struct TAG_TW_Device_Extension { | |||
668 | wait_queue_head_t ioctl_wqueue; | 674 | wait_queue_head_t ioctl_wqueue; |
669 | struct mutex ioctl_lock; | 675 | struct mutex ioctl_lock; |
670 | char aen_clobber; | 676 | char aen_clobber; |
671 | unsigned short working_srl; | 677 | TW_Compatibility_Info tw_compat_info; |
672 | unsigned short working_branch; | ||
673 | unsigned short working_build; | ||
674 | } TW_Device_Extension; | 678 | } TW_Device_Extension; |
675 | 679 | ||
676 | #endif /* _3W_9XXX_H */ | 680 | #endif /* _3W_9XXX_H */ |
diff --git a/drivers/scsi/aic7xxx/aic79xx.h b/drivers/scsi/aic7xxx/aic79xx.h index df3346b5caf8..170a4344cbb2 100644 --- a/drivers/scsi/aic7xxx/aic79xx.h +++ b/drivers/scsi/aic7xxx/aic79xx.h | |||
@@ -53,14 +53,6 @@ struct ahd_platform_data; | |||
53 | struct scb_platform_data; | 53 | struct scb_platform_data; |
54 | 54 | ||
55 | /****************************** Useful Macros *********************************/ | 55 | /****************************** Useful Macros *********************************/ |
56 | #ifndef MAX | ||
57 | #define MAX(a,b) (((a) > (b)) ? (a) : (b)) | ||
58 | #endif | ||
59 | |||
60 | #ifndef MIN | ||
61 | #define MIN(a,b) (((a) < (b)) ? (a) : (b)) | ||
62 | #endif | ||
63 | |||
64 | #ifndef TRUE | 56 | #ifndef TRUE |
65 | #define TRUE 1 | 57 | #define TRUE 1 |
66 | #endif | 58 | #endif |
@@ -972,8 +964,6 @@ int ahd_read_seeprom(struct ahd_softc *ahd, uint16_t *buf, | |||
972 | 964 | ||
973 | int ahd_write_seeprom(struct ahd_softc *ahd, uint16_t *buf, | 965 | int ahd_write_seeprom(struct ahd_softc *ahd, uint16_t *buf, |
974 | u_int start_addr, u_int count); | 966 | u_int start_addr, u_int count); |
975 | int ahd_wait_seeprom(struct ahd_softc *ahd); | ||
976 | int ahd_verify_vpd_cksum(struct vpd_config *vpd); | ||
977 | int ahd_verify_cksum(struct seeprom_config *sc); | 967 | int ahd_verify_cksum(struct seeprom_config *sc); |
978 | int ahd_acquire_seeprom(struct ahd_softc *ahd); | 968 | int ahd_acquire_seeprom(struct ahd_softc *ahd); |
979 | void ahd_release_seeprom(struct ahd_softc *ahd); | 969 | void ahd_release_seeprom(struct ahd_softc *ahd); |
@@ -1320,8 +1310,6 @@ struct ahd_pci_identity { | |||
1320 | char *name; | 1310 | char *name; |
1321 | ahd_device_setup_t *setup; | 1311 | ahd_device_setup_t *setup; |
1322 | }; | 1312 | }; |
1323 | extern struct ahd_pci_identity ahd_pci_ident_table []; | ||
1324 | extern const u_int ahd_num_pci_devs; | ||
1325 | 1313 | ||
1326 | /***************************** VL/EISA Declarations ***************************/ | 1314 | /***************************** VL/EISA Declarations ***************************/ |
1327 | struct aic7770_identity { | 1315 | struct aic7770_identity { |
@@ -1339,15 +1327,6 @@ extern const int ahd_num_aic7770_devs; | |||
1339 | /*************************** Function Declarations ****************************/ | 1327 | /*************************** Function Declarations ****************************/ |
1340 | /******************************************************************************/ | 1328 | /******************************************************************************/ |
1341 | void ahd_reset_cmds_pending(struct ahd_softc *ahd); | 1329 | void ahd_reset_cmds_pending(struct ahd_softc *ahd); |
1342 | u_int ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl); | ||
1343 | void ahd_busy_tcl(struct ahd_softc *ahd, | ||
1344 | u_int tcl, u_int busyid); | ||
1345 | static __inline void ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl); | ||
1346 | static __inline void | ||
1347 | ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl) | ||
1348 | { | ||
1349 | ahd_busy_tcl(ahd, tcl, SCB_LIST_NULL); | ||
1350 | } | ||
1351 | 1330 | ||
1352 | /***************************** PCI Front End *********************************/ | 1331 | /***************************** PCI Front End *********************************/ |
1353 | struct ahd_pci_identity *ahd_find_pci_device(ahd_dev_softc_t); | 1332 | struct ahd_pci_identity *ahd_find_pci_device(ahd_dev_softc_t); |
@@ -1356,7 +1335,6 @@ int ahd_pci_config(struct ahd_softc *, | |||
1356 | int ahd_pci_test_register_access(struct ahd_softc *); | 1335 | int ahd_pci_test_register_access(struct ahd_softc *); |
1357 | 1336 | ||
1358 | /************************** SCB and SCB queue management **********************/ | 1337 | /************************** SCB and SCB queue management **********************/ |
1359 | int ahd_probe_scbs(struct ahd_softc *); | ||
1360 | void ahd_qinfifo_requeue_tail(struct ahd_softc *ahd, | 1338 | void ahd_qinfifo_requeue_tail(struct ahd_softc *ahd, |
1361 | struct scb *scb); | 1339 | struct scb *scb); |
1362 | int ahd_match_scb(struct ahd_softc *ahd, struct scb *scb, | 1340 | int ahd_match_scb(struct ahd_softc *ahd, struct scb *scb, |
@@ -1374,33 +1352,20 @@ int ahd_parse_vpddata(struct ahd_softc *ahd, | |||
1374 | int ahd_parse_cfgdata(struct ahd_softc *ahd, | 1352 | int ahd_parse_cfgdata(struct ahd_softc *ahd, |
1375 | struct seeprom_config *sc); | 1353 | struct seeprom_config *sc); |
1376 | void ahd_intr_enable(struct ahd_softc *ahd, int enable); | 1354 | void ahd_intr_enable(struct ahd_softc *ahd, int enable); |
1377 | void ahd_update_coalescing_values(struct ahd_softc *ahd, | ||
1378 | u_int timer, | ||
1379 | u_int maxcmds, | ||
1380 | u_int mincmds); | ||
1381 | void ahd_enable_coalescing(struct ahd_softc *ahd, | ||
1382 | int enable); | ||
1383 | void ahd_pause_and_flushwork(struct ahd_softc *ahd); | 1355 | void ahd_pause_and_flushwork(struct ahd_softc *ahd); |
1384 | int ahd_suspend(struct ahd_softc *ahd); | 1356 | int ahd_suspend(struct ahd_softc *ahd); |
1385 | int ahd_resume(struct ahd_softc *ahd); | ||
1386 | void ahd_set_unit(struct ahd_softc *, int); | 1357 | void ahd_set_unit(struct ahd_softc *, int); |
1387 | void ahd_set_name(struct ahd_softc *, char *); | 1358 | void ahd_set_name(struct ahd_softc *, char *); |
1388 | struct scb *ahd_get_scb(struct ahd_softc *ahd, u_int col_idx); | 1359 | struct scb *ahd_get_scb(struct ahd_softc *ahd, u_int col_idx); |
1389 | void ahd_free_scb(struct ahd_softc *ahd, struct scb *scb); | 1360 | void ahd_free_scb(struct ahd_softc *ahd, struct scb *scb); |
1390 | void ahd_alloc_scbs(struct ahd_softc *ahd); | ||
1391 | void ahd_free(struct ahd_softc *ahd); | 1361 | void ahd_free(struct ahd_softc *ahd); |
1392 | int ahd_reset(struct ahd_softc *ahd, int reinit); | 1362 | int ahd_reset(struct ahd_softc *ahd, int reinit); |
1393 | void ahd_shutdown(void *arg); | ||
1394 | int ahd_write_flexport(struct ahd_softc *ahd, | 1363 | int ahd_write_flexport(struct ahd_softc *ahd, |
1395 | u_int addr, u_int value); | 1364 | u_int addr, u_int value); |
1396 | int ahd_read_flexport(struct ahd_softc *ahd, u_int addr, | 1365 | int ahd_read_flexport(struct ahd_softc *ahd, u_int addr, |
1397 | uint8_t *value); | 1366 | uint8_t *value); |
1398 | int ahd_wait_flexport(struct ahd_softc *ahd); | ||
1399 | 1367 | ||
1400 | /*************************** Interrupt Services *******************************/ | 1368 | /*************************** Interrupt Services *******************************/ |
1401 | void ahd_pci_intr(struct ahd_softc *ahd); | ||
1402 | void ahd_clear_intstat(struct ahd_softc *ahd); | ||
1403 | void ahd_flush_qoutfifo(struct ahd_softc *ahd); | ||
1404 | void ahd_run_qoutfifo(struct ahd_softc *ahd); | 1369 | void ahd_run_qoutfifo(struct ahd_softc *ahd); |
1405 | #ifdef AHD_TARGET_MODE | 1370 | #ifdef AHD_TARGET_MODE |
1406 | void ahd_run_tqinfifo(struct ahd_softc *ahd, int paused); | 1371 | void ahd_run_tqinfifo(struct ahd_softc *ahd, int paused); |
@@ -1409,7 +1374,6 @@ void ahd_handle_hwerrint(struct ahd_softc *ahd); | |||
1409 | void ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat); | 1374 | void ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat); |
1410 | void ahd_handle_scsiint(struct ahd_softc *ahd, | 1375 | void ahd_handle_scsiint(struct ahd_softc *ahd, |
1411 | u_int intstat); | 1376 | u_int intstat); |
1412 | void ahd_clear_critical_section(struct ahd_softc *ahd); | ||
1413 | 1377 | ||
1414 | /***************************** Error Recovery *********************************/ | 1378 | /***************************** Error Recovery *********************************/ |
1415 | typedef enum { | 1379 | typedef enum { |
@@ -1426,23 +1390,9 @@ int ahd_search_disc_list(struct ahd_softc *ahd, int target, | |||
1426 | char channel, int lun, u_int tag, | 1390 | char channel, int lun, u_int tag, |
1427 | int stop_on_first, int remove, | 1391 | int stop_on_first, int remove, |
1428 | int save_state); | 1392 | int save_state); |
1429 | void ahd_freeze_devq(struct ahd_softc *ahd, struct scb *scb); | ||
1430 | int ahd_reset_channel(struct ahd_softc *ahd, char channel, | 1393 | int ahd_reset_channel(struct ahd_softc *ahd, char channel, |
1431 | int initiate_reset); | 1394 | int initiate_reset); |
1432 | int ahd_abort_scbs(struct ahd_softc *ahd, int target, | ||
1433 | char channel, int lun, u_int tag, | ||
1434 | role_t role, uint32_t status); | ||
1435 | void ahd_restart(struct ahd_softc *ahd); | ||
1436 | void ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo); | ||
1437 | void ahd_handle_scb_status(struct ahd_softc *ahd, | ||
1438 | struct scb *scb); | ||
1439 | void ahd_handle_scsi_status(struct ahd_softc *ahd, | ||
1440 | struct scb *scb); | ||
1441 | void ahd_calc_residual(struct ahd_softc *ahd, | ||
1442 | struct scb *scb); | ||
1443 | /*************************** Utility Functions ********************************/ | 1395 | /*************************** Utility Functions ********************************/ |
1444 | struct ahd_phase_table_entry* | ||
1445 | ahd_lookup_phase_entry(int phase); | ||
1446 | void ahd_compile_devinfo(struct ahd_devinfo *devinfo, | 1396 | void ahd_compile_devinfo(struct ahd_devinfo *devinfo, |
1447 | u_int our_id, u_int target, | 1397 | u_int our_id, u_int target, |
1448 | u_int lun, char channel, | 1398 | u_int lun, char channel, |
@@ -1450,14 +1400,6 @@ void ahd_compile_devinfo(struct ahd_devinfo *devinfo, | |||
1450 | /************************** Transfer Negotiation ******************************/ | 1400 | /************************** Transfer Negotiation ******************************/ |
1451 | void ahd_find_syncrate(struct ahd_softc *ahd, u_int *period, | 1401 | void ahd_find_syncrate(struct ahd_softc *ahd, u_int *period, |
1452 | u_int *ppr_options, u_int maxsync); | 1402 | u_int *ppr_options, u_int maxsync); |
1453 | void ahd_validate_offset(struct ahd_softc *ahd, | ||
1454 | struct ahd_initiator_tinfo *tinfo, | ||
1455 | u_int period, u_int *offset, | ||
1456 | int wide, role_t role); | ||
1457 | void ahd_validate_width(struct ahd_softc *ahd, | ||
1458 | struct ahd_initiator_tinfo *tinfo, | ||
1459 | u_int *bus_width, | ||
1460 | role_t role); | ||
1461 | /* | 1403 | /* |
1462 | * Negotiation types. These are used to qualify if we should renegotiate | 1404 | * Negotiation types. These are used to qualify if we should renegotiate |
1463 | * even if our goal and current transport parameters are identical. | 1405 | * even if our goal and current transport parameters are identical. |
@@ -1486,11 +1428,6 @@ typedef enum { | |||
1486 | AHD_QUEUE_TAGGED | 1428 | AHD_QUEUE_TAGGED |
1487 | } ahd_queue_alg; | 1429 | } ahd_queue_alg; |
1488 | 1430 | ||
1489 | void ahd_set_tags(struct ahd_softc *ahd, | ||
1490 | struct scsi_cmnd *cmd, | ||
1491 | struct ahd_devinfo *devinfo, | ||
1492 | ahd_queue_alg alg); | ||
1493 | |||
1494 | /**************************** Target Mode *************************************/ | 1431 | /**************************** Target Mode *************************************/ |
1495 | #ifdef AHD_TARGET_MODE | 1432 | #ifdef AHD_TARGET_MODE |
1496 | void ahd_send_lstate_events(struct ahd_softc *, | 1433 | void ahd_send_lstate_events(struct ahd_softc *, |
@@ -1528,10 +1465,8 @@ extern uint32_t ahd_debug; | |||
1528 | #define AHD_SHOW_INT_COALESCING 0x10000 | 1465 | #define AHD_SHOW_INT_COALESCING 0x10000 |
1529 | #define AHD_DEBUG_SEQUENCER 0x20000 | 1466 | #define AHD_DEBUG_SEQUENCER 0x20000 |
1530 | #endif | 1467 | #endif |
1531 | void ahd_print_scb(struct scb *scb); | ||
1532 | void ahd_print_devinfo(struct ahd_softc *ahd, | 1468 | void ahd_print_devinfo(struct ahd_softc *ahd, |
1533 | struct ahd_devinfo *devinfo); | 1469 | struct ahd_devinfo *devinfo); |
1534 | void ahd_dump_sglist(struct scb *scb); | ||
1535 | void ahd_dump_card_state(struct ahd_softc *ahd); | 1470 | void ahd_dump_card_state(struct ahd_softc *ahd); |
1536 | int ahd_print_register(ahd_reg_parse_entry_t *table, | 1471 | int ahd_print_register(ahd_reg_parse_entry_t *table, |
1537 | u_int num_entries, | 1472 | u_int num_entries, |
@@ -1540,5 +1475,4 @@ int ahd_print_register(ahd_reg_parse_entry_t *table, | |||
1540 | u_int value, | 1475 | u_int value, |
1541 | u_int *cur_column, | 1476 | u_int *cur_column, |
1542 | u_int wrap_point); | 1477 | u_int wrap_point); |
1543 | void ahd_dump_scbs(struct ahd_softc *ahd); | ||
1544 | #endif /* _AIC79XX_H_ */ | 1478 | #endif /* _AIC79XX_H_ */ |
diff --git a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c index 653818d2f802..07a86a30f676 100644 --- a/drivers/scsi/aic7xxx/aic79xx_core.c +++ b/drivers/scsi/aic7xxx/aic79xx_core.c | |||
@@ -52,7 +52,7 @@ | |||
52 | 52 | ||
53 | 53 | ||
54 | /***************************** Lookup Tables **********************************/ | 54 | /***************************** Lookup Tables **********************************/ |
55 | char *ahd_chip_names[] = | 55 | static char *ahd_chip_names[] = |
56 | { | 56 | { |
57 | "NONE", | 57 | "NONE", |
58 | "aic7901", | 58 | "aic7901", |
@@ -237,10 +237,33 @@ static int ahd_handle_target_cmd(struct ahd_softc *ahd, | |||
237 | struct target_cmd *cmd); | 237 | struct target_cmd *cmd); |
238 | #endif | 238 | #endif |
239 | 239 | ||
240 | static int ahd_abort_scbs(struct ahd_softc *ahd, int target, | ||
241 | char channel, int lun, u_int tag, | ||
242 | role_t role, uint32_t status); | ||
243 | static void ahd_alloc_scbs(struct ahd_softc *ahd); | ||
244 | static void ahd_busy_tcl(struct ahd_softc *ahd, u_int tcl, | ||
245 | u_int scbid); | ||
246 | static void ahd_calc_residual(struct ahd_softc *ahd, | ||
247 | struct scb *scb); | ||
248 | static void ahd_clear_critical_section(struct ahd_softc *ahd); | ||
249 | static void ahd_clear_intstat(struct ahd_softc *ahd); | ||
250 | static void ahd_enable_coalescing(struct ahd_softc *ahd, | ||
251 | int enable); | ||
252 | static u_int ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl); | ||
253 | static void ahd_freeze_devq(struct ahd_softc *ahd, | ||
254 | struct scb *scb); | ||
255 | static void ahd_handle_scb_status(struct ahd_softc *ahd, | ||
256 | struct scb *scb); | ||
257 | static struct ahd_phase_table_entry* ahd_lookup_phase_entry(int phase); | ||
258 | static void ahd_shutdown(void *arg); | ||
259 | static void ahd_update_coalescing_values(struct ahd_softc *ahd, | ||
260 | u_int timer, | ||
261 | u_int maxcmds, | ||
262 | u_int mincmds); | ||
263 | static int ahd_verify_vpd_cksum(struct vpd_config *vpd); | ||
264 | static int ahd_wait_seeprom(struct ahd_softc *ahd); | ||
265 | |||
240 | /******************************** Private Inlines *****************************/ | 266 | /******************************** Private Inlines *****************************/ |
241 | static __inline void ahd_assert_atn(struct ahd_softc *ahd); | ||
242 | static __inline int ahd_currently_packetized(struct ahd_softc *ahd); | ||
243 | static __inline int ahd_set_active_fifo(struct ahd_softc *ahd); | ||
244 | 267 | ||
245 | static __inline void | 268 | static __inline void |
246 | ahd_assert_atn(struct ahd_softc *ahd) | 269 | ahd_assert_atn(struct ahd_softc *ahd) |
@@ -294,11 +317,44 @@ ahd_set_active_fifo(struct ahd_softc *ahd) | |||
294 | } | 317 | } |
295 | } | 318 | } |
296 | 319 | ||
320 | static __inline void | ||
321 | ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl) | ||
322 | { | ||
323 | ahd_busy_tcl(ahd, tcl, SCB_LIST_NULL); | ||
324 | } | ||
325 | |||
326 | /* | ||
327 | * Determine whether the sequencer reported a residual | ||
328 | * for this SCB/transaction. | ||
329 | */ | ||
330 | static __inline void | ||
331 | ahd_update_residual(struct ahd_softc *ahd, struct scb *scb) | ||
332 | { | ||
333 | uint32_t sgptr; | ||
334 | |||
335 | sgptr = ahd_le32toh(scb->hscb->sgptr); | ||
336 | if ((sgptr & SG_STATUS_VALID) != 0) | ||
337 | ahd_calc_residual(ahd, scb); | ||
338 | } | ||
339 | |||
340 | static __inline void | ||
341 | ahd_complete_scb(struct ahd_softc *ahd, struct scb *scb) | ||
342 | { | ||
343 | uint32_t sgptr; | ||
344 | |||
345 | sgptr = ahd_le32toh(scb->hscb->sgptr); | ||
346 | if ((sgptr & SG_STATUS_VALID) != 0) | ||
347 | ahd_handle_scb_status(ahd, scb); | ||
348 | else | ||
349 | ahd_done(ahd, scb); | ||
350 | } | ||
351 | |||
352 | |||
297 | /************************* Sequencer Execution Control ************************/ | 353 | /************************* Sequencer Execution Control ************************/ |
298 | /* | 354 | /* |
299 | * Restart the sequencer program from address zero | 355 | * Restart the sequencer program from address zero |
300 | */ | 356 | */ |
301 | void | 357 | static void |
302 | ahd_restart(struct ahd_softc *ahd) | 358 | ahd_restart(struct ahd_softc *ahd) |
303 | { | 359 | { |
304 | 360 | ||
@@ -342,7 +398,7 @@ ahd_restart(struct ahd_softc *ahd) | |||
342 | ahd_unpause(ahd); | 398 | ahd_unpause(ahd); |
343 | } | 399 | } |
344 | 400 | ||
345 | void | 401 | static void |
346 | ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo) | 402 | ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo) |
347 | { | 403 | { |
348 | ahd_mode_state saved_modes; | 404 | ahd_mode_state saved_modes; |
@@ -366,7 +422,7 @@ ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo) | |||
366 | * Flush and completed commands that are sitting in the command | 422 | * Flush and completed commands that are sitting in the command |
367 | * complete queues down on the chip but have yet to be dma'ed back up. | 423 | * complete queues down on the chip but have yet to be dma'ed back up. |
368 | */ | 424 | */ |
369 | void | 425 | static void |
370 | ahd_flush_qoutfifo(struct ahd_softc *ahd) | 426 | ahd_flush_qoutfifo(struct ahd_softc *ahd) |
371 | { | 427 | { |
372 | struct scb *scb; | 428 | struct scb *scb; |
@@ -905,6 +961,51 @@ ahd_handle_hwerrint(struct ahd_softc *ahd) | |||
905 | ahd_free(ahd); | 961 | ahd_free(ahd); |
906 | } | 962 | } |
907 | 963 | ||
964 | #ifdef AHD_DEBUG | ||
965 | static void | ||
966 | ahd_dump_sglist(struct scb *scb) | ||
967 | { | ||
968 | int i; | ||
969 | |||
970 | if (scb->sg_count > 0) { | ||
971 | if ((scb->ahd_softc->flags & AHD_64BIT_ADDRESSING) != 0) { | ||
972 | struct ahd_dma64_seg *sg_list; | ||
973 | |||
974 | sg_list = (struct ahd_dma64_seg*)scb->sg_list; | ||
975 | for (i = 0; i < scb->sg_count; i++) { | ||
976 | uint64_t addr; | ||
977 | uint32_t len; | ||
978 | |||
979 | addr = ahd_le64toh(sg_list[i].addr); | ||
980 | len = ahd_le32toh(sg_list[i].len); | ||
981 | printf("sg[%d] - Addr 0x%x%x : Length %d%s\n", | ||
982 | i, | ||
983 | (uint32_t)((addr >> 32) & 0xFFFFFFFF), | ||
984 | (uint32_t)(addr & 0xFFFFFFFF), | ||
985 | sg_list[i].len & AHD_SG_LEN_MASK, | ||
986 | (sg_list[i].len & AHD_DMA_LAST_SEG) | ||
987 | ? " Last" : ""); | ||
988 | } | ||
989 | } else { | ||
990 | struct ahd_dma_seg *sg_list; | ||
991 | |||
992 | sg_list = (struct ahd_dma_seg*)scb->sg_list; | ||
993 | for (i = 0; i < scb->sg_count; i++) { | ||
994 | uint32_t len; | ||
995 | |||
996 | len = ahd_le32toh(sg_list[i].len); | ||
997 | printf("sg[%d] - Addr 0x%x%x : Length %d%s\n", | ||
998 | i, | ||
999 | (len & AHD_SG_HIGH_ADDR_MASK) >> 24, | ||
1000 | ahd_le32toh(sg_list[i].addr), | ||
1001 | len & AHD_SG_LEN_MASK, | ||
1002 | len & AHD_DMA_LAST_SEG ? " Last" : ""); | ||
1003 | } | ||
1004 | } | ||
1005 | } | ||
1006 | } | ||
1007 | #endif /* AHD_DEBUG */ | ||
1008 | |||
908 | void | 1009 | void |
909 | ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) | 1010 | ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) |
910 | { | 1011 | { |
@@ -1053,10 +1154,12 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) | |||
1053 | * If a target takes us into the command phase | 1154 | * If a target takes us into the command phase |
1054 | * assume that it has been externally reset and | 1155 | * assume that it has been externally reset and |
1055 | * has thus lost our previous packetized negotiation | 1156 | * has thus lost our previous packetized negotiation |
1056 | * agreement. | 1157 | * agreement. Since we have not sent an identify |
1057 | * Revert to async/narrow transfers until we | 1158 | * message and may not have fully qualified the |
1058 | * can renegotiate with the device and notify | 1159 | * connection, we change our command to TUR, assert |
1059 | * the OSM about the reset. | 1160 | * ATN and ABORT the task when we go to message in |
1161 | * phase. The OSM will see the REQUEUE_REQUEST | ||
1162 | * status and retry the command. | ||
1060 | */ | 1163 | */ |
1061 | scbid = ahd_get_scbptr(ahd); | 1164 | scbid = ahd_get_scbptr(ahd); |
1062 | scb = ahd_lookup_scb(ahd, scbid); | 1165 | scb = ahd_lookup_scb(ahd, scbid); |
@@ -1083,7 +1186,28 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) | |||
1083 | ahd_set_syncrate(ahd, &devinfo, /*period*/0, | 1186 | ahd_set_syncrate(ahd, &devinfo, /*period*/0, |
1084 | /*offset*/0, /*ppr_options*/0, | 1187 | /*offset*/0, /*ppr_options*/0, |
1085 | AHD_TRANS_ACTIVE, /*paused*/TRUE); | 1188 | AHD_TRANS_ACTIVE, /*paused*/TRUE); |
1086 | scb->flags |= SCB_EXTERNAL_RESET; | 1189 | /* Hand-craft TUR command */ |
1190 | ahd_outb(ahd, SCB_CDB_STORE, 0); | ||
1191 | ahd_outb(ahd, SCB_CDB_STORE+1, 0); | ||
1192 | ahd_outb(ahd, SCB_CDB_STORE+2, 0); | ||
1193 | ahd_outb(ahd, SCB_CDB_STORE+3, 0); | ||
1194 | ahd_outb(ahd, SCB_CDB_STORE+4, 0); | ||
1195 | ahd_outb(ahd, SCB_CDB_STORE+5, 0); | ||
1196 | ahd_outb(ahd, SCB_CDB_LEN, 6); | ||
1197 | scb->hscb->control &= ~(TAG_ENB|SCB_TAG_TYPE); | ||
1198 | scb->hscb->control |= MK_MESSAGE; | ||
1199 | ahd_outb(ahd, SCB_CONTROL, scb->hscb->control); | ||
1200 | ahd_outb(ahd, MSG_OUT, HOST_MSG); | ||
1201 | ahd_outb(ahd, SAVED_SCSIID, scb->hscb->scsiid); | ||
1202 | /* | ||
1203 | * The lun is 0, regardless of the SCB's lun | ||
1204 | * as we have not sent an identify message. | ||
1205 | */ | ||
1206 | ahd_outb(ahd, SAVED_LUN, 0); | ||
1207 | ahd_outb(ahd, SEQ_FLAGS, 0); | ||
1208 | ahd_assert_atn(ahd); | ||
1209 | scb->flags &= ~SCB_PACKETIZED; | ||
1210 | scb->flags |= SCB_ABORT|SCB_EXTERNAL_RESET; | ||
1087 | ahd_freeze_devq(ahd, scb); | 1211 | ahd_freeze_devq(ahd, scb); |
1088 | ahd_set_transaction_status(scb, CAM_REQUEUE_REQ); | 1212 | ahd_set_transaction_status(scb, CAM_REQUEUE_REQ); |
1089 | ahd_freeze_scb(scb); | 1213 | ahd_freeze_scb(scb); |
@@ -1519,8 +1643,10 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) | |||
1519 | /* | 1643 | /* |
1520 | * Ignore external resets after a bus reset. | 1644 | * Ignore external resets after a bus reset. |
1521 | */ | 1645 | */ |
1522 | if (((status & SCSIRSTI) != 0) && (ahd->flags & AHD_BUS_RESET_ACTIVE)) | 1646 | if (((status & SCSIRSTI) != 0) && (ahd->flags & AHD_BUS_RESET_ACTIVE)) { |
1647 | ahd_outb(ahd, CLRSINT1, CLRSCSIRSTI); | ||
1523 | return; | 1648 | return; |
1649 | } | ||
1524 | 1650 | ||
1525 | /* | 1651 | /* |
1526 | * Clear bus reset flag | 1652 | * Clear bus reset flag |
@@ -2200,6 +2326,22 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd) | |||
2200 | if (sent_msg == MSG_ABORT_TAG) | 2326 | if (sent_msg == MSG_ABORT_TAG) |
2201 | tag = SCB_GET_TAG(scb); | 2327 | tag = SCB_GET_TAG(scb); |
2202 | 2328 | ||
2329 | if ((scb->flags & SCB_EXTERNAL_RESET) != 0) { | ||
2330 | /* | ||
2331 | * This abort is in response to an | ||
2332 | * unexpected switch to command phase | ||
2333 | * for a packetized connection. Since | ||
2334 | * the identify message was never sent, | ||
2335 | * "saved lun" is 0. We really want to | ||
2336 | * abort only the SCB that encountered | ||
2337 | * this error, which could have a different | ||
2338 | * lun. The SCB will be retried so the OS | ||
2339 | * will see the UA after renegotiating to | ||
2340 | * packetized. | ||
2341 | */ | ||
2342 | tag = SCB_GET_TAG(scb); | ||
2343 | saved_lun = scb->hscb->lun; | ||
2344 | } | ||
2203 | found = ahd_abort_scbs(ahd, target, 'A', saved_lun, | 2345 | found = ahd_abort_scbs(ahd, target, 'A', saved_lun, |
2204 | tag, ROLE_INITIATOR, | 2346 | tag, ROLE_INITIATOR, |
2205 | CAM_REQ_ABORTED); | 2347 | CAM_REQ_ABORTED); |
@@ -2523,7 +2665,7 @@ ahd_force_renegotiation(struct ahd_softc *ahd, struct ahd_devinfo *devinfo) | |||
2523 | } | 2665 | } |
2524 | 2666 | ||
2525 | #define AHD_MAX_STEPS 2000 | 2667 | #define AHD_MAX_STEPS 2000 |
2526 | void | 2668 | static void |
2527 | ahd_clear_critical_section(struct ahd_softc *ahd) | 2669 | ahd_clear_critical_section(struct ahd_softc *ahd) |
2528 | { | 2670 | { |
2529 | ahd_mode_state saved_modes; | 2671 | ahd_mode_state saved_modes; |
@@ -2646,7 +2788,7 @@ ahd_clear_critical_section(struct ahd_softc *ahd) | |||
2646 | /* | 2788 | /* |
2647 | * Clear any pending interrupt status. | 2789 | * Clear any pending interrupt status. |
2648 | */ | 2790 | */ |
2649 | void | 2791 | static void |
2650 | ahd_clear_intstat(struct ahd_softc *ahd) | 2792 | ahd_clear_intstat(struct ahd_softc *ahd) |
2651 | { | 2793 | { |
2652 | AHD_ASSERT_MODES(ahd, ~(AHD_MODE_UNKNOWN_MSK|AHD_MODE_CFG_MSK), | 2794 | AHD_ASSERT_MODES(ahd, ~(AHD_MODE_UNKNOWN_MSK|AHD_MODE_CFG_MSK), |
@@ -2677,6 +2819,8 @@ ahd_clear_intstat(struct ahd_softc *ahd) | |||
2677 | #ifdef AHD_DEBUG | 2819 | #ifdef AHD_DEBUG |
2678 | uint32_t ahd_debug = AHD_DEBUG_OPTS; | 2820 | uint32_t ahd_debug = AHD_DEBUG_OPTS; |
2679 | #endif | 2821 | #endif |
2822 | |||
2823 | #if 0 | ||
2680 | void | 2824 | void |
2681 | ahd_print_scb(struct scb *scb) | 2825 | ahd_print_scb(struct scb *scb) |
2682 | { | 2826 | { |
@@ -2701,49 +2845,7 @@ ahd_print_scb(struct scb *scb) | |||
2701 | SCB_GET_TAG(scb)); | 2845 | SCB_GET_TAG(scb)); |
2702 | ahd_dump_sglist(scb); | 2846 | ahd_dump_sglist(scb); |
2703 | } | 2847 | } |
2704 | 2848 | #endif /* 0 */ | |
2705 | void | ||
2706 | ahd_dump_sglist(struct scb *scb) | ||
2707 | { | ||
2708 | int i; | ||
2709 | |||
2710 | if (scb->sg_count > 0) { | ||
2711 | if ((scb->ahd_softc->flags & AHD_64BIT_ADDRESSING) != 0) { | ||
2712 | struct ahd_dma64_seg *sg_list; | ||
2713 | |||
2714 | sg_list = (struct ahd_dma64_seg*)scb->sg_list; | ||
2715 | for (i = 0; i < scb->sg_count; i++) { | ||
2716 | uint64_t addr; | ||
2717 | uint32_t len; | ||
2718 | |||
2719 | addr = ahd_le64toh(sg_list[i].addr); | ||
2720 | len = ahd_le32toh(sg_list[i].len); | ||
2721 | printf("sg[%d] - Addr 0x%x%x : Length %d%s\n", | ||
2722 | i, | ||
2723 | (uint32_t)((addr >> 32) & 0xFFFFFFFF), | ||
2724 | (uint32_t)(addr & 0xFFFFFFFF), | ||
2725 | sg_list[i].len & AHD_SG_LEN_MASK, | ||
2726 | (sg_list[i].len & AHD_DMA_LAST_SEG) | ||
2727 | ? " Last" : ""); | ||
2728 | } | ||
2729 | } else { | ||
2730 | struct ahd_dma_seg *sg_list; | ||
2731 | |||
2732 | sg_list = (struct ahd_dma_seg*)scb->sg_list; | ||
2733 | for (i = 0; i < scb->sg_count; i++) { | ||
2734 | uint32_t len; | ||
2735 | |||
2736 | len = ahd_le32toh(sg_list[i].len); | ||
2737 | printf("sg[%d] - Addr 0x%x%x : Length %d%s\n", | ||
2738 | i, | ||
2739 | (len & AHD_SG_HIGH_ADDR_MASK) >> 24, | ||
2740 | ahd_le32toh(sg_list[i].addr), | ||
2741 | len & AHD_SG_LEN_MASK, | ||
2742 | len & AHD_DMA_LAST_SEG ? " Last" : ""); | ||
2743 | } | ||
2744 | } | ||
2745 | } | ||
2746 | } | ||
2747 | 2849 | ||
2748 | /************************* Transfer Negotiation *******************************/ | 2850 | /************************* Transfer Negotiation *******************************/ |
2749 | /* | 2851 | /* |
@@ -2850,14 +2952,14 @@ ahd_devlimited_syncrate(struct ahd_softc *ahd, | |||
2850 | transinfo = &tinfo->goal; | 2952 | transinfo = &tinfo->goal; |
2851 | *ppr_options &= (transinfo->ppr_options|MSG_EXT_PPR_PCOMP_EN); | 2953 | *ppr_options &= (transinfo->ppr_options|MSG_EXT_PPR_PCOMP_EN); |
2852 | if (transinfo->width == MSG_EXT_WDTR_BUS_8_BIT) { | 2954 | if (transinfo->width == MSG_EXT_WDTR_BUS_8_BIT) { |
2853 | maxsync = MAX(maxsync, AHD_SYNCRATE_ULTRA2); | 2955 | maxsync = max(maxsync, (u_int)AHD_SYNCRATE_ULTRA2); |
2854 | *ppr_options &= ~MSG_EXT_PPR_DT_REQ; | 2956 | *ppr_options &= ~MSG_EXT_PPR_DT_REQ; |
2855 | } | 2957 | } |
2856 | if (transinfo->period == 0) { | 2958 | if (transinfo->period == 0) { |
2857 | *period = 0; | 2959 | *period = 0; |
2858 | *ppr_options = 0; | 2960 | *ppr_options = 0; |
2859 | } else { | 2961 | } else { |
2860 | *period = MAX(*period, transinfo->period); | 2962 | *period = max(*period, (u_int)transinfo->period); |
2861 | ahd_find_syncrate(ahd, period, ppr_options, maxsync); | 2963 | ahd_find_syncrate(ahd, period, ppr_options, maxsync); |
2862 | } | 2964 | } |
2863 | } | 2965 | } |
@@ -2906,7 +3008,7 @@ ahd_find_syncrate(struct ahd_softc *ahd, u_int *period, | |||
2906 | * Truncate the given synchronous offset to a value the | 3008 | * Truncate the given synchronous offset to a value the |
2907 | * current adapter type and syncrate are capable of. | 3009 | * current adapter type and syncrate are capable of. |
2908 | */ | 3010 | */ |
2909 | void | 3011 | static void |
2910 | ahd_validate_offset(struct ahd_softc *ahd, | 3012 | ahd_validate_offset(struct ahd_softc *ahd, |
2911 | struct ahd_initiator_tinfo *tinfo, | 3013 | struct ahd_initiator_tinfo *tinfo, |
2912 | u_int period, u_int *offset, int wide, | 3014 | u_int period, u_int *offset, int wide, |
@@ -2924,12 +3026,12 @@ ahd_validate_offset(struct ahd_softc *ahd, | |||
2924 | maxoffset = MAX_OFFSET_PACED; | 3026 | maxoffset = MAX_OFFSET_PACED; |
2925 | } else | 3027 | } else |
2926 | maxoffset = MAX_OFFSET_NON_PACED; | 3028 | maxoffset = MAX_OFFSET_NON_PACED; |
2927 | *offset = MIN(*offset, maxoffset); | 3029 | *offset = min(*offset, maxoffset); |
2928 | if (tinfo != NULL) { | 3030 | if (tinfo != NULL) { |
2929 | if (role == ROLE_TARGET) | 3031 | if (role == ROLE_TARGET) |
2930 | *offset = MIN(*offset, tinfo->user.offset); | 3032 | *offset = min(*offset, (u_int)tinfo->user.offset); |
2931 | else | 3033 | else |
2932 | *offset = MIN(*offset, tinfo->goal.offset); | 3034 | *offset = min(*offset, (u_int)tinfo->goal.offset); |
2933 | } | 3035 | } |
2934 | } | 3036 | } |
2935 | 3037 | ||
@@ -2937,7 +3039,7 @@ ahd_validate_offset(struct ahd_softc *ahd, | |||
2937 | * Truncate the given transfer width parameter to a value the | 3039 | * Truncate the given transfer width parameter to a value the |
2938 | * current adapter type is capable of. | 3040 | * current adapter type is capable of. |
2939 | */ | 3041 | */ |
2940 | void | 3042 | static void |
2941 | ahd_validate_width(struct ahd_softc *ahd, struct ahd_initiator_tinfo *tinfo, | 3043 | ahd_validate_width(struct ahd_softc *ahd, struct ahd_initiator_tinfo *tinfo, |
2942 | u_int *bus_width, role_t role) | 3044 | u_int *bus_width, role_t role) |
2943 | { | 3045 | { |
@@ -2955,9 +3057,9 @@ ahd_validate_width(struct ahd_softc *ahd, struct ahd_initiator_tinfo *tinfo, | |||
2955 | } | 3057 | } |
2956 | if (tinfo != NULL) { | 3058 | if (tinfo != NULL) { |
2957 | if (role == ROLE_TARGET) | 3059 | if (role == ROLE_TARGET) |
2958 | *bus_width = MIN(tinfo->user.width, *bus_width); | 3060 | *bus_width = min((u_int)tinfo->user.width, *bus_width); |
2959 | else | 3061 | else |
2960 | *bus_width = MIN(tinfo->goal.width, *bus_width); | 3062 | *bus_width = min((u_int)tinfo->goal.width, *bus_width); |
2961 | } | 3063 | } |
2962 | } | 3064 | } |
2963 | 3065 | ||
@@ -3210,7 +3312,7 @@ ahd_set_width(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, | |||
3210 | /* | 3312 | /* |
3211 | * Update the current state of tagged queuing for a given target. | 3313 | * Update the current state of tagged queuing for a given target. |
3212 | */ | 3314 | */ |
3213 | void | 3315 | static void |
3214 | ahd_set_tags(struct ahd_softc *ahd, struct scsi_cmnd *cmd, | 3316 | ahd_set_tags(struct ahd_softc *ahd, struct scsi_cmnd *cmd, |
3215 | struct ahd_devinfo *devinfo, ahd_queue_alg alg) | 3317 | struct ahd_devinfo *devinfo, ahd_queue_alg alg) |
3216 | { | 3318 | { |
@@ -3466,7 +3568,7 @@ ahd_print_devinfo(struct ahd_softc *ahd, struct ahd_devinfo *devinfo) | |||
3466 | devinfo->target, devinfo->lun); | 3568 | devinfo->target, devinfo->lun); |
3467 | } | 3569 | } |
3468 | 3570 | ||
3469 | struct ahd_phase_table_entry* | 3571 | static struct ahd_phase_table_entry* |
3470 | ahd_lookup_phase_entry(int phase) | 3572 | ahd_lookup_phase_entry(int phase) |
3471 | { | 3573 | { |
3472 | struct ahd_phase_table_entry *entry; | 3574 | struct ahd_phase_table_entry *entry; |
@@ -5351,7 +5453,7 @@ ahd_free(struct ahd_softc *ahd) | |||
5351 | return; | 5453 | return; |
5352 | } | 5454 | } |
5353 | 5455 | ||
5354 | void | 5456 | static void |
5355 | ahd_shutdown(void *arg) | 5457 | ahd_shutdown(void *arg) |
5356 | { | 5458 | { |
5357 | struct ahd_softc *ahd; | 5459 | struct ahd_softc *ahd; |
@@ -5480,7 +5582,7 @@ ahd_reset(struct ahd_softc *ahd, int reinit) | |||
5480 | /* | 5582 | /* |
5481 | * Determine the number of SCBs available on the controller | 5583 | * Determine the number of SCBs available on the controller |
5482 | */ | 5584 | */ |
5483 | int | 5585 | static int |
5484 | ahd_probe_scbs(struct ahd_softc *ahd) { | 5586 | ahd_probe_scbs(struct ahd_softc *ahd) { |
5485 | int i; | 5587 | int i; |
5486 | 5588 | ||
@@ -5929,7 +6031,7 @@ ahd_free_scb(struct ahd_softc *ahd, struct scb *scb) | |||
5929 | ahd_platform_scb_free(ahd, scb); | 6031 | ahd_platform_scb_free(ahd, scb); |
5930 | } | 6032 | } |
5931 | 6033 | ||
5932 | void | 6034 | static void |
5933 | ahd_alloc_scbs(struct ahd_softc *ahd) | 6035 | ahd_alloc_scbs(struct ahd_softc *ahd) |
5934 | { | 6036 | { |
5935 | struct scb_data *scb_data; | 6037 | struct scb_data *scb_data; |
@@ -6057,9 +6159,9 @@ ahd_alloc_scbs(struct ahd_softc *ahd) | |||
6057 | #endif | 6159 | #endif |
6058 | } | 6160 | } |
6059 | 6161 | ||
6060 | newcount = MIN(scb_data->sense_left, scb_data->scbs_left); | 6162 | newcount = min(scb_data->sense_left, scb_data->scbs_left); |
6061 | newcount = MIN(newcount, scb_data->sgs_left); | 6163 | newcount = min(newcount, scb_data->sgs_left); |
6062 | newcount = MIN(newcount, (AHD_SCB_MAX_ALLOC - scb_data->numscbs)); | 6164 | newcount = min(newcount, (AHD_SCB_MAX_ALLOC - scb_data->numscbs)); |
6063 | for (i = 0; i < newcount; i++) { | 6165 | for (i = 0; i < newcount; i++) { |
6064 | struct scb_platform_data *pdata; | 6166 | struct scb_platform_data *pdata; |
6065 | u_int col_tag; | 6167 | u_int col_tag; |
@@ -6982,7 +7084,7 @@ ahd_intr_enable(struct ahd_softc *ahd, int enable) | |||
6982 | ahd_outb(ahd, HCNTRL, hcntrl); | 7084 | ahd_outb(ahd, HCNTRL, hcntrl); |
6983 | } | 7085 | } |
6984 | 7086 | ||
6985 | void | 7087 | static void |
6986 | ahd_update_coalescing_values(struct ahd_softc *ahd, u_int timer, u_int maxcmds, | 7088 | ahd_update_coalescing_values(struct ahd_softc *ahd, u_int timer, u_int maxcmds, |
6987 | u_int mincmds) | 7089 | u_int mincmds) |
6988 | { | 7090 | { |
@@ -7000,7 +7102,7 @@ ahd_update_coalescing_values(struct ahd_softc *ahd, u_int timer, u_int maxcmds, | |||
7000 | ahd_outb(ahd, INT_COALESCING_MINCMDS, -mincmds); | 7102 | ahd_outb(ahd, INT_COALESCING_MINCMDS, -mincmds); |
7001 | } | 7103 | } |
7002 | 7104 | ||
7003 | void | 7105 | static void |
7004 | ahd_enable_coalescing(struct ahd_softc *ahd, int enable) | 7106 | ahd_enable_coalescing(struct ahd_softc *ahd, int enable) |
7005 | { | 7107 | { |
7006 | 7108 | ||
@@ -7070,6 +7172,7 @@ ahd_pause_and_flushwork(struct ahd_softc *ahd) | |||
7070 | ahd->flags &= ~AHD_ALL_INTERRUPTS; | 7172 | ahd->flags &= ~AHD_ALL_INTERRUPTS; |
7071 | } | 7173 | } |
7072 | 7174 | ||
7175 | #if 0 | ||
7073 | int | 7176 | int |
7074 | ahd_suspend(struct ahd_softc *ahd) | 7177 | ahd_suspend(struct ahd_softc *ahd) |
7075 | { | 7178 | { |
@@ -7083,7 +7186,9 @@ ahd_suspend(struct ahd_softc *ahd) | |||
7083 | ahd_shutdown(ahd); | 7186 | ahd_shutdown(ahd); |
7084 | return (0); | 7187 | return (0); |
7085 | } | 7188 | } |
7189 | #endif /* 0 */ | ||
7086 | 7190 | ||
7191 | #if 0 | ||
7087 | int | 7192 | int |
7088 | ahd_resume(struct ahd_softc *ahd) | 7193 | ahd_resume(struct ahd_softc *ahd) |
7089 | { | 7194 | { |
@@ -7093,6 +7198,7 @@ ahd_resume(struct ahd_softc *ahd) | |||
7093 | ahd_restart(ahd); | 7198 | ahd_restart(ahd); |
7094 | return (0); | 7199 | return (0); |
7095 | } | 7200 | } |
7201 | #endif /* 0 */ | ||
7096 | 7202 | ||
7097 | /************************** Busy Target Table *********************************/ | 7203 | /************************** Busy Target Table *********************************/ |
7098 | /* | 7204 | /* |
@@ -7125,7 +7231,7 @@ ahd_index_busy_tcl(struct ahd_softc *ahd, u_int *saved_scbid, u_int tcl) | |||
7125 | /* | 7231 | /* |
7126 | * Return the untagged transaction id for a given target/channel lun. | 7232 | * Return the untagged transaction id for a given target/channel lun. |
7127 | */ | 7233 | */ |
7128 | u_int | 7234 | static u_int |
7129 | ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl) | 7235 | ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl) |
7130 | { | 7236 | { |
7131 | u_int scbid; | 7237 | u_int scbid; |
@@ -7138,7 +7244,7 @@ ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl) | |||
7138 | return (scbid); | 7244 | return (scbid); |
7139 | } | 7245 | } |
7140 | 7246 | ||
7141 | void | 7247 | static void |
7142 | ahd_busy_tcl(struct ahd_softc *ahd, u_int tcl, u_int scbid) | 7248 | ahd_busy_tcl(struct ahd_softc *ahd, u_int tcl, u_int scbid) |
7143 | { | 7249 | { |
7144 | u_int scb_offset; | 7250 | u_int scb_offset; |
@@ -7186,7 +7292,7 @@ ahd_match_scb(struct ahd_softc *ahd, struct scb *scb, int target, | |||
7186 | return match; | 7292 | return match; |
7187 | } | 7293 | } |
7188 | 7294 | ||
7189 | void | 7295 | static void |
7190 | ahd_freeze_devq(struct ahd_softc *ahd, struct scb *scb) | 7296 | ahd_freeze_devq(struct ahd_softc *ahd, struct scb *scb) |
7191 | { | 7297 | { |
7192 | int target; | 7298 | int target; |
@@ -7690,7 +7796,7 @@ ahd_add_scb_to_free_list(struct ahd_softc *ahd, u_int scbid) | |||
7690 | * been modified from CAM_REQ_INPROG. This routine assumes that the sequencer | 7796 | * been modified from CAM_REQ_INPROG. This routine assumes that the sequencer |
7691 | * is paused before it is called. | 7797 | * is paused before it is called. |
7692 | */ | 7798 | */ |
7693 | int | 7799 | static int |
7694 | ahd_abort_scbs(struct ahd_softc *ahd, int target, char channel, | 7800 | ahd_abort_scbs(struct ahd_softc *ahd, int target, char channel, |
7695 | int lun, u_int tag, role_t role, uint32_t status) | 7801 | int lun, u_int tag, role_t role, uint32_t status) |
7696 | { | 7802 | { |
@@ -7920,6 +8026,11 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) | |||
7920 | ahd_clear_fifo(ahd, 1); | 8026 | ahd_clear_fifo(ahd, 1); |
7921 | 8027 | ||
7922 | /* | 8028 | /* |
8029 | * Clear SCSI interrupt status | ||
8030 | */ | ||
8031 | ahd_outb(ahd, CLRSINT1, CLRSCSIRSTI); | ||
8032 | |||
8033 | /* | ||
7923 | * Reenable selections | 8034 | * Reenable selections |
7924 | */ | 8035 | */ |
7925 | ahd_outb(ahd, SIMODE1, ahd_inb(ahd, SIMODE1) | ENSCSIRST); | 8036 | ahd_outb(ahd, SIMODE1, ahd_inb(ahd, SIMODE1) | ENSCSIRST); |
@@ -7952,10 +8063,6 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) | |||
7952 | } | 8063 | } |
7953 | } | 8064 | } |
7954 | #endif | 8065 | #endif |
7955 | /* Notify the XPT that a bus reset occurred */ | ||
7956 | ahd_send_async(ahd, devinfo.channel, CAM_TARGET_WILDCARD, | ||
7957 | CAM_LUN_WILDCARD, AC_BUS_RESET); | ||
7958 | |||
7959 | /* | 8066 | /* |
7960 | * Revert to async/narrow transfers until we renegotiate. | 8067 | * Revert to async/narrow transfers until we renegotiate. |
7961 | */ | 8068 | */ |
@@ -7977,6 +8084,10 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) | |||
7977 | } | 8084 | } |
7978 | } | 8085 | } |
7979 | 8086 | ||
8087 | /* Notify the XPT that a bus reset occurred */ | ||
8088 | ahd_send_async(ahd, devinfo.channel, CAM_TARGET_WILDCARD, | ||
8089 | CAM_LUN_WILDCARD, AC_BUS_RESET); | ||
8090 | |||
7980 | ahd_restart(ahd); | 8091 | ahd_restart(ahd); |
7981 | 8092 | ||
7982 | return (found); | 8093 | return (found); |
@@ -8019,18 +8130,8 @@ ahd_stat_timer(void *arg) | |||
8019 | } | 8130 | } |
8020 | 8131 | ||
8021 | /****************************** Status Processing *****************************/ | 8132 | /****************************** Status Processing *****************************/ |
8022 | void | ||
8023 | ahd_handle_scb_status(struct ahd_softc *ahd, struct scb *scb) | ||
8024 | { | ||
8025 | if (scb->hscb->shared_data.istatus.scsi_status != 0) { | ||
8026 | ahd_handle_scsi_status(ahd, scb); | ||
8027 | } else { | ||
8028 | ahd_calc_residual(ahd, scb); | ||
8029 | ahd_done(ahd, scb); | ||
8030 | } | ||
8031 | } | ||
8032 | 8133 | ||
8033 | void | 8134 | static void |
8034 | ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb) | 8135 | ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb) |
8035 | { | 8136 | { |
8036 | struct hardware_scb *hscb; | 8137 | struct hardware_scb *hscb; |
@@ -8238,10 +8339,21 @@ ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb) | |||
8238 | } | 8339 | } |
8239 | } | 8340 | } |
8240 | 8341 | ||
8342 | static void | ||
8343 | ahd_handle_scb_status(struct ahd_softc *ahd, struct scb *scb) | ||
8344 | { | ||
8345 | if (scb->hscb->shared_data.istatus.scsi_status != 0) { | ||
8346 | ahd_handle_scsi_status(ahd, scb); | ||
8347 | } else { | ||
8348 | ahd_calc_residual(ahd, scb); | ||
8349 | ahd_done(ahd, scb); | ||
8350 | } | ||
8351 | } | ||
8352 | |||
8241 | /* | 8353 | /* |
8242 | * Calculate the residual for a just completed SCB. | 8354 | * Calculate the residual for a just completed SCB. |
8243 | */ | 8355 | */ |
8244 | void | 8356 | static void |
8245 | ahd_calc_residual(struct ahd_softc *ahd, struct scb *scb) | 8357 | ahd_calc_residual(struct ahd_softc *ahd, struct scb *scb) |
8246 | { | 8358 | { |
8247 | struct hardware_scb *hscb; | 8359 | struct hardware_scb *hscb; |
@@ -8668,7 +8780,7 @@ ahd_resolve_seqaddr(struct ahd_softc *ahd, u_int address) | |||
8668 | if (skip_addr > i) { | 8780 | if (skip_addr > i) { |
8669 | int end_addr; | 8781 | int end_addr; |
8670 | 8782 | ||
8671 | end_addr = MIN(address, skip_addr); | 8783 | end_addr = min(address, skip_addr); |
8672 | address_offset += end_addr - i; | 8784 | address_offset += end_addr - i; |
8673 | i = skip_addr; | 8785 | i = skip_addr; |
8674 | } else { | 8786 | } else { |
@@ -9092,6 +9204,7 @@ ahd_dump_card_state(struct ahd_softc *ahd) | |||
9092 | ahd_unpause(ahd); | 9204 | ahd_unpause(ahd); |
9093 | } | 9205 | } |
9094 | 9206 | ||
9207 | #if 0 | ||
9095 | void | 9208 | void |
9096 | ahd_dump_scbs(struct ahd_softc *ahd) | 9209 | ahd_dump_scbs(struct ahd_softc *ahd) |
9097 | { | 9210 | { |
@@ -9117,6 +9230,7 @@ ahd_dump_scbs(struct ahd_softc *ahd) | |||
9117 | ahd_set_scbptr(ahd, saved_scb_index); | 9230 | ahd_set_scbptr(ahd, saved_scb_index); |
9118 | ahd_restore_modes(ahd, saved_modes); | 9231 | ahd_restore_modes(ahd, saved_modes); |
9119 | } | 9232 | } |
9233 | #endif /* 0 */ | ||
9120 | 9234 | ||
9121 | /**************************** Flexport Logic **********************************/ | 9235 | /**************************** Flexport Logic **********************************/ |
9122 | /* | 9236 | /* |
@@ -9219,7 +9333,7 @@ ahd_write_seeprom(struct ahd_softc *ahd, uint16_t *buf, | |||
9219 | /* | 9333 | /* |
9220 | * Wait ~100us for the serial eeprom to satisfy our request. | 9334 | * Wait ~100us for the serial eeprom to satisfy our request. |
9221 | */ | 9335 | */ |
9222 | int | 9336 | static int |
9223 | ahd_wait_seeprom(struct ahd_softc *ahd) | 9337 | ahd_wait_seeprom(struct ahd_softc *ahd) |
9224 | { | 9338 | { |
9225 | int cnt; | 9339 | int cnt; |
@@ -9237,7 +9351,7 @@ ahd_wait_seeprom(struct ahd_softc *ahd) | |||
9237 | * Validate the two checksums in the per_channel | 9351 | * Validate the two checksums in the per_channel |
9238 | * vital product data struct. | 9352 | * vital product data struct. |
9239 | */ | 9353 | */ |
9240 | int | 9354 | static int |
9241 | ahd_verify_vpd_cksum(struct vpd_config *vpd) | 9355 | ahd_verify_vpd_cksum(struct vpd_config *vpd) |
9242 | { | 9356 | { |
9243 | int i; | 9357 | int i; |
@@ -9316,6 +9430,24 @@ ahd_release_seeprom(struct ahd_softc *ahd) | |||
9316 | /* Currently a no-op */ | 9430 | /* Currently a no-op */ |
9317 | } | 9431 | } |
9318 | 9432 | ||
9433 | /* | ||
9434 | * Wait at most 2 seconds for flexport arbitration to succeed. | ||
9435 | */ | ||
9436 | static int | ||
9437 | ahd_wait_flexport(struct ahd_softc *ahd) | ||
9438 | { | ||
9439 | int cnt; | ||
9440 | |||
9441 | AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK); | ||
9442 | cnt = 1000000 * 2 / 5; | ||
9443 | while ((ahd_inb(ahd, BRDCTL) & FLXARBACK) == 0 && --cnt) | ||
9444 | ahd_delay(5); | ||
9445 | |||
9446 | if (cnt == 0) | ||
9447 | return (ETIMEDOUT); | ||
9448 | return (0); | ||
9449 | } | ||
9450 | |||
9319 | int | 9451 | int |
9320 | ahd_write_flexport(struct ahd_softc *ahd, u_int addr, u_int value) | 9452 | ahd_write_flexport(struct ahd_softc *ahd, u_int addr, u_int value) |
9321 | { | 9453 | { |
@@ -9357,24 +9489,6 @@ ahd_read_flexport(struct ahd_softc *ahd, u_int addr, uint8_t *value) | |||
9357 | return (0); | 9489 | return (0); |
9358 | } | 9490 | } |
9359 | 9491 | ||
9360 | /* | ||
9361 | * Wait at most 2 seconds for flexport arbitration to succeed. | ||
9362 | */ | ||
9363 | int | ||
9364 | ahd_wait_flexport(struct ahd_softc *ahd) | ||
9365 | { | ||
9366 | int cnt; | ||
9367 | |||
9368 | AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK); | ||
9369 | cnt = 1000000 * 2 / 5; | ||
9370 | while ((ahd_inb(ahd, BRDCTL) & FLXARBACK) == 0 && --cnt) | ||
9371 | ahd_delay(5); | ||
9372 | |||
9373 | if (cnt == 0) | ||
9374 | return (ETIMEDOUT); | ||
9375 | return (0); | ||
9376 | } | ||
9377 | |||
9378 | /************************* Target Mode ****************************************/ | 9492 | /************************* Target Mode ****************************************/ |
9379 | #ifdef AHD_TARGET_MODE | 9493 | #ifdef AHD_TARGET_MODE |
9380 | cam_status | 9494 | cam_status |
diff --git a/drivers/scsi/aic7xxx/aic79xx_inline.h b/drivers/scsi/aic7xxx/aic79xx_inline.h index a3266e066c00..2ceb67f4af2a 100644 --- a/drivers/scsi/aic7xxx/aic79xx_inline.h +++ b/drivers/scsi/aic7xxx/aic79xx_inline.h | |||
@@ -418,10 +418,6 @@ ahd_targetcmd_offset(struct ahd_softc *ahd, u_int index) | |||
418 | } | 418 | } |
419 | 419 | ||
420 | /*********************** Miscelaneous Support Functions ***********************/ | 420 | /*********************** Miscelaneous Support Functions ***********************/ |
421 | static __inline void ahd_complete_scb(struct ahd_softc *ahd, | ||
422 | struct scb *scb); | ||
423 | static __inline void ahd_update_residual(struct ahd_softc *ahd, | ||
424 | struct scb *scb); | ||
425 | static __inline struct ahd_initiator_tinfo * | 421 | static __inline struct ahd_initiator_tinfo * |
426 | ahd_fetch_transinfo(struct ahd_softc *ahd, | 422 | ahd_fetch_transinfo(struct ahd_softc *ahd, |
427 | char channel, u_int our_id, | 423 | char channel, u_int our_id, |
@@ -467,32 +463,6 @@ static __inline uint32_t | |||
467 | ahd_get_sense_bufaddr(struct ahd_softc *ahd, | 463 | ahd_get_sense_bufaddr(struct ahd_softc *ahd, |
468 | struct scb *scb); | 464 | struct scb *scb); |
469 | 465 | ||
470 | static __inline void | ||
471 | ahd_complete_scb(struct ahd_softc *ahd, struct scb *scb) | ||
472 | { | ||
473 | uint32_t sgptr; | ||
474 | |||
475 | sgptr = ahd_le32toh(scb->hscb->sgptr); | ||
476 | if ((sgptr & SG_STATUS_VALID) != 0) | ||
477 | ahd_handle_scb_status(ahd, scb); | ||
478 | else | ||
479 | ahd_done(ahd, scb); | ||
480 | } | ||
481 | |||
482 | /* | ||
483 | * Determine whether the sequencer reported a residual | ||
484 | * for this SCB/transaction. | ||
485 | */ | ||
486 | static __inline void | ||
487 | ahd_update_residual(struct ahd_softc *ahd, struct scb *scb) | ||
488 | { | ||
489 | uint32_t sgptr; | ||
490 | |||
491 | sgptr = ahd_le32toh(scb->hscb->sgptr); | ||
492 | if ((sgptr & SG_STATUS_VALID) != 0) | ||
493 | ahd_calc_residual(ahd, scb); | ||
494 | } | ||
495 | |||
496 | /* | 466 | /* |
497 | * Return pointers to the transfer negotiation information | 467 | * Return pointers to the transfer negotiation information |
498 | * for the specified our_id/remote_id pair. | 468 | * for the specified our_id/remote_id pair. |
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c index f8e60486167d..9bfcca5ede08 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c | |||
@@ -293,7 +293,7 @@ static uint32_t aic79xx_seltime; | |||
293 | * force all outstanding transactions to be serviced prior to a new | 293 | * force all outstanding transactions to be serviced prior to a new |
294 | * transaction. | 294 | * transaction. |
295 | */ | 295 | */ |
296 | uint32_t aic79xx_periodic_otag; | 296 | static uint32_t aic79xx_periodic_otag; |
297 | 297 | ||
298 | /* Some storage boxes are using an LSI chip which has a bug making it | 298 | /* Some storage boxes are using an LSI chip which has a bug making it |
299 | * impossible to use aic79xx Rev B chip in 320 speeds. The following | 299 | * impossible to use aic79xx Rev B chip in 320 speeds. The following |
@@ -773,6 +773,7 @@ struct scsi_host_template aic79xx_driver_template = { | |||
773 | #endif | 773 | #endif |
774 | .can_queue = AHD_MAX_QUEUE, | 774 | .can_queue = AHD_MAX_QUEUE, |
775 | .this_id = -1, | 775 | .this_id = -1, |
776 | .max_sectors = 8192, | ||
776 | .cmd_per_lun = 2, | 777 | .cmd_per_lun = 2, |
777 | .use_clustering = ENABLE_CLUSTERING, | 778 | .use_clustering = ENABLE_CLUSTERING, |
778 | .slave_alloc = ahd_linux_slave_alloc, | 779 | .slave_alloc = ahd_linux_slave_alloc, |
@@ -1813,9 +1814,9 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd, | |||
1813 | u_int sense_offset; | 1814 | u_int sense_offset; |
1814 | 1815 | ||
1815 | if (scb->flags & SCB_SENSE) { | 1816 | if (scb->flags & SCB_SENSE) { |
1816 | sense_size = MIN(sizeof(struct scsi_sense_data) | 1817 | sense_size = min(sizeof(struct scsi_sense_data) |
1817 | - ahd_get_sense_residual(scb), | 1818 | - ahd_get_sense_residual(scb), |
1818 | sizeof(cmd->sense_buffer)); | 1819 | (u_long)sizeof(cmd->sense_buffer)); |
1819 | sense_offset = 0; | 1820 | sense_offset = 0; |
1820 | } else { | 1821 | } else { |
1821 | /* | 1822 | /* |
@@ -1824,7 +1825,8 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd, | |||
1824 | */ | 1825 | */ |
1825 | siu = (struct scsi_status_iu_header *) | 1826 | siu = (struct scsi_status_iu_header *) |
1826 | scb->sense_data; | 1827 | scb->sense_data; |
1827 | sense_size = MIN(scsi_4btoul(siu->sense_length), | 1828 | sense_size = min_t(size_t, |
1829 | scsi_4btoul(siu->sense_length), | ||
1828 | sizeof(cmd->sense_buffer)); | 1830 | sizeof(cmd->sense_buffer)); |
1829 | sense_offset = SIU_SENSE_OFFSET(siu); | 1831 | sense_offset = SIU_SENSE_OFFSET(siu); |
1830 | } | 1832 | } |
@@ -2634,8 +2636,22 @@ static void ahd_linux_set_pcomp_en(struct scsi_target *starget, int pcomp) | |||
2634 | pcomp ? "Enable" : "Disable"); | 2636 | pcomp ? "Enable" : "Disable"); |
2635 | #endif | 2637 | #endif |
2636 | 2638 | ||
2637 | if (pcomp) | 2639 | if (pcomp) { |
2640 | uint8_t precomp; | ||
2641 | |||
2642 | if (ahd->unit < ARRAY_SIZE(aic79xx_iocell_info)) { | ||
2643 | struct ahd_linux_iocell_opts *iocell_opts; | ||
2644 | |||
2645 | iocell_opts = &aic79xx_iocell_info[ahd->unit]; | ||
2646 | precomp = iocell_opts->precomp; | ||
2647 | } else { | ||
2648 | precomp = AIC79XX_DEFAULT_PRECOMP; | ||
2649 | } | ||
2638 | ppr_options |= MSG_EXT_PPR_PCOMP_EN; | 2650 | ppr_options |= MSG_EXT_PPR_PCOMP_EN; |
2651 | AHD_SET_PRECOMP(ahd, precomp); | ||
2652 | } else { | ||
2653 | AHD_SET_PRECOMP(ahd, 0); | ||
2654 | } | ||
2639 | 2655 | ||
2640 | ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0, | 2656 | ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0, |
2641 | starget->channel + 'A', ROLE_INITIATOR); | 2657 | starget->channel + 'A', ROLE_INITIATOR); |
@@ -2678,7 +2694,25 @@ static void ahd_linux_set_hold_mcs(struct scsi_target *starget, int hold) | |||
2678 | ahd_unlock(ahd, &flags); | 2694 | ahd_unlock(ahd, &flags); |
2679 | } | 2695 | } |
2680 | 2696 | ||
2697 | static void ahd_linux_get_signalling(struct Scsi_Host *shost) | ||
2698 | { | ||
2699 | struct ahd_softc *ahd = *(struct ahd_softc **)shost->hostdata; | ||
2700 | unsigned long flags; | ||
2701 | u8 mode; | ||
2702 | |||
2703 | ahd_lock(ahd, &flags); | ||
2704 | ahd_pause(ahd); | ||
2705 | mode = ahd_inb(ahd, SBLKCTL); | ||
2706 | ahd_unpause(ahd); | ||
2707 | ahd_unlock(ahd, &flags); | ||
2681 | 2708 | ||
2709 | if (mode & ENAB40) | ||
2710 | spi_signalling(shost) = SPI_SIGNAL_LVD; | ||
2711 | else if (mode & ENAB20) | ||
2712 | spi_signalling(shost) = SPI_SIGNAL_SE; | ||
2713 | else | ||
2714 | spi_signalling(shost) = SPI_SIGNAL_UNKNOWN; | ||
2715 | } | ||
2682 | 2716 | ||
2683 | static struct spi_function_template ahd_linux_transport_functions = { | 2717 | static struct spi_function_template ahd_linux_transport_functions = { |
2684 | .set_offset = ahd_linux_set_offset, | 2718 | .set_offset = ahd_linux_set_offset, |
@@ -2703,6 +2737,7 @@ static struct spi_function_template ahd_linux_transport_functions = { | |||
2703 | .show_pcomp_en = 1, | 2737 | .show_pcomp_en = 1, |
2704 | .set_hold_mcs = ahd_linux_set_hold_mcs, | 2738 | .set_hold_mcs = ahd_linux_set_hold_mcs, |
2705 | .show_hold_mcs = 1, | 2739 | .show_hold_mcs = 1, |
2740 | .get_signalling = ahd_linux_get_signalling, | ||
2706 | }; | 2741 | }; |
2707 | 2742 | ||
2708 | static int __init | 2743 | static int __init |
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.h b/drivers/scsi/aic7xxx/aic79xx_osm.h index fb3d4dd54413..3a67fc578d78 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.h +++ b/drivers/scsi/aic7xxx/aic79xx_osm.h | |||
@@ -506,9 +506,6 @@ struct info_str { | |||
506 | int pos; | 506 | int pos; |
507 | }; | 507 | }; |
508 | 508 | ||
509 | void ahd_format_transinfo(struct info_str *info, | ||
510 | struct ahd_transinfo *tinfo); | ||
511 | |||
512 | /******************************** Locking *************************************/ | 509 | /******************************** Locking *************************************/ |
513 | static __inline void | 510 | static __inline void |
514 | ahd_lockinit(struct ahd_softc *ahd) | 511 | ahd_lockinit(struct ahd_softc *ahd) |
@@ -582,8 +579,6 @@ ahd_unlock(struct ahd_softc *ahd, unsigned long *flags) | |||
582 | #define PCIXM_STATUS_MAXCRDS 0x1C00 /* Maximum Cumulative Read Size */ | 579 | #define PCIXM_STATUS_MAXCRDS 0x1C00 /* Maximum Cumulative Read Size */ |
583 | #define PCIXM_STATUS_RCVDSCEM 0x2000 /* Received a Split Comp w/Error msg */ | 580 | #define PCIXM_STATUS_RCVDSCEM 0x2000 /* Received a Split Comp w/Error msg */ |
584 | 581 | ||
585 | extern struct pci_driver aic79xx_pci_driver; | ||
586 | |||
587 | typedef enum | 582 | typedef enum |
588 | { | 583 | { |
589 | AHD_POWER_STATE_D0, | 584 | AHD_POWER_STATE_D0, |
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm_pci.c b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c index 4b5354201807..2001fe890e71 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm_pci.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c | |||
@@ -82,7 +82,7 @@ static struct pci_device_id ahd_linux_pci_id_table[] = { | |||
82 | 82 | ||
83 | MODULE_DEVICE_TABLE(pci, ahd_linux_pci_id_table); | 83 | MODULE_DEVICE_TABLE(pci, ahd_linux_pci_id_table); |
84 | 84 | ||
85 | struct pci_driver aic79xx_pci_driver = { | 85 | static struct pci_driver aic79xx_pci_driver = { |
86 | .name = "aic79xx", | 86 | .name = "aic79xx", |
87 | .probe = ahd_linux_pci_dev_probe, | 87 | .probe = ahd_linux_pci_dev_probe, |
88 | .remove = ahd_linux_pci_dev_remove, | 88 | .remove = ahd_linux_pci_dev_remove, |
diff --git a/drivers/scsi/aic7xxx/aic79xx_pci.c b/drivers/scsi/aic7xxx/aic79xx_pci.c index 14850f31aafa..c07735819cd1 100644 --- a/drivers/scsi/aic7xxx/aic79xx_pci.c +++ b/drivers/scsi/aic7xxx/aic79xx_pci.c | |||
@@ -97,7 +97,7 @@ static ahd_device_setup_t ahd_aic7901A_setup; | |||
97 | static ahd_device_setup_t ahd_aic7902_setup; | 97 | static ahd_device_setup_t ahd_aic7902_setup; |
98 | static ahd_device_setup_t ahd_aic790X_setup; | 98 | static ahd_device_setup_t ahd_aic790X_setup; |
99 | 99 | ||
100 | struct ahd_pci_identity ahd_pci_ident_table [] = | 100 | static struct ahd_pci_identity ahd_pci_ident_table [] = |
101 | { | 101 | { |
102 | /* aic7901 based controllers */ | 102 | /* aic7901 based controllers */ |
103 | { | 103 | { |
@@ -201,7 +201,7 @@ struct ahd_pci_identity ahd_pci_ident_table [] = | |||
201 | } | 201 | } |
202 | }; | 202 | }; |
203 | 203 | ||
204 | const u_int ahd_num_pci_devs = ARRAY_SIZE(ahd_pci_ident_table); | 204 | static const u_int ahd_num_pci_devs = ARRAY_SIZE(ahd_pci_ident_table); |
205 | 205 | ||
206 | #define DEVCONFIG 0x40 | 206 | #define DEVCONFIG 0x40 |
207 | #define PCIXINITPAT 0x0000E000ul | 207 | #define PCIXINITPAT 0x0000E000ul |
@@ -245,6 +245,7 @@ static int ahd_check_extport(struct ahd_softc *ahd); | |||
245 | static void ahd_configure_termination(struct ahd_softc *ahd, | 245 | static void ahd_configure_termination(struct ahd_softc *ahd, |
246 | u_int adapter_control); | 246 | u_int adapter_control); |
247 | static void ahd_pci_split_intr(struct ahd_softc *ahd, u_int intstat); | 247 | static void ahd_pci_split_intr(struct ahd_softc *ahd, u_int intstat); |
248 | static void ahd_pci_intr(struct ahd_softc *ahd); | ||
248 | 249 | ||
249 | struct ahd_pci_identity * | 250 | struct ahd_pci_identity * |
250 | ahd_find_pci_device(ahd_dev_softc_t pci) | 251 | ahd_find_pci_device(ahd_dev_softc_t pci) |
@@ -757,7 +758,7 @@ static const char *pci_status_strings[] = | |||
757 | "%s: Address or Write Phase Parity Error Detected in %s.\n" | 758 | "%s: Address or Write Phase Parity Error Detected in %s.\n" |
758 | }; | 759 | }; |
759 | 760 | ||
760 | void | 761 | static void |
761 | ahd_pci_intr(struct ahd_softc *ahd) | 762 | ahd_pci_intr(struct ahd_softc *ahd) |
762 | { | 763 | { |
763 | uint8_t pci_status[8]; | 764 | uint8_t pci_status[8]; |
diff --git a/drivers/scsi/aic7xxx/aic79xx_proc.c b/drivers/scsi/aic7xxx/aic79xx_proc.c index c5f0ee591509..6b28bebcbca0 100644 --- a/drivers/scsi/aic7xxx/aic79xx_proc.c +++ b/drivers/scsi/aic7xxx/aic79xx_proc.c | |||
@@ -136,7 +136,7 @@ copy_info(struct info_str *info, char *fmt, ...) | |||
136 | return (len); | 136 | return (len); |
137 | } | 137 | } |
138 | 138 | ||
139 | void | 139 | static void |
140 | ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo) | 140 | ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo) |
141 | { | 141 | { |
142 | u_int speed; | 142 | u_int speed; |
diff --git a/drivers/scsi/aic7xxx/aic7xxx.h b/drivers/scsi/aic7xxx/aic7xxx.h index 62ff8c3dc2bb..954c7c24501d 100644 --- a/drivers/scsi/aic7xxx/aic7xxx.h +++ b/drivers/scsi/aic7xxx/aic7xxx.h | |||
@@ -54,14 +54,6 @@ struct scb_platform_data; | |||
54 | struct seeprom_descriptor; | 54 | struct seeprom_descriptor; |
55 | 55 | ||
56 | /****************************** Useful Macros *********************************/ | 56 | /****************************** Useful Macros *********************************/ |
57 | #ifndef MAX | ||
58 | #define MAX(a,b) (((a) > (b)) ? (a) : (b)) | ||
59 | #endif | ||
60 | |||
61 | #ifndef MIN | ||
62 | #define MIN(a,b) (((a) < (b)) ? (a) : (b)) | ||
63 | #endif | ||
64 | |||
65 | #ifndef TRUE | 57 | #ifndef TRUE |
66 | #define TRUE 1 | 58 | #define TRUE 1 |
67 | #endif | 59 | #endif |
@@ -1135,8 +1127,6 @@ struct ahc_pci_identity { | |||
1135 | char *name; | 1127 | char *name; |
1136 | ahc_device_setup_t *setup; | 1128 | ahc_device_setup_t *setup; |
1137 | }; | 1129 | }; |
1138 | extern struct ahc_pci_identity ahc_pci_ident_table[]; | ||
1139 | extern const u_int ahc_num_pci_devs; | ||
1140 | 1130 | ||
1141 | /***************************** VL/EISA Declarations ***************************/ | 1131 | /***************************** VL/EISA Declarations ***************************/ |
1142 | struct aic7770_identity { | 1132 | struct aic7770_identity { |
@@ -1289,6 +1279,7 @@ typedef enum { | |||
1289 | } ahc_queue_alg; | 1279 | } ahc_queue_alg; |
1290 | 1280 | ||
1291 | void ahc_set_tags(struct ahc_softc *ahc, | 1281 | void ahc_set_tags(struct ahc_softc *ahc, |
1282 | struct scsi_cmnd *cmd, | ||
1292 | struct ahc_devinfo *devinfo, | 1283 | struct ahc_devinfo *devinfo, |
1293 | ahc_queue_alg alg); | 1284 | ahc_queue_alg alg); |
1294 | 1285 | ||
diff --git a/drivers/scsi/aic7xxx/aic7xxx_core.c b/drivers/scsi/aic7xxx/aic7xxx_core.c index 93e4e40944b6..50ef785224de 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_core.c +++ b/drivers/scsi/aic7xxx/aic7xxx_core.c | |||
@@ -1671,7 +1671,7 @@ ahc_devlimited_syncrate(struct ahc_softc *ahc, | |||
1671 | transinfo = &tinfo->goal; | 1671 | transinfo = &tinfo->goal; |
1672 | *ppr_options &= transinfo->ppr_options; | 1672 | *ppr_options &= transinfo->ppr_options; |
1673 | if (transinfo->width == MSG_EXT_WDTR_BUS_8_BIT) { | 1673 | if (transinfo->width == MSG_EXT_WDTR_BUS_8_BIT) { |
1674 | maxsync = MAX(maxsync, AHC_SYNCRATE_ULTRA2); | 1674 | maxsync = max(maxsync, (u_int)AHC_SYNCRATE_ULTRA2); |
1675 | *ppr_options &= ~MSG_EXT_PPR_DT_REQ; | 1675 | *ppr_options &= ~MSG_EXT_PPR_DT_REQ; |
1676 | } | 1676 | } |
1677 | if (transinfo->period == 0) { | 1677 | if (transinfo->period == 0) { |
@@ -1679,7 +1679,7 @@ ahc_devlimited_syncrate(struct ahc_softc *ahc, | |||
1679 | *ppr_options = 0; | 1679 | *ppr_options = 0; |
1680 | return (NULL); | 1680 | return (NULL); |
1681 | } | 1681 | } |
1682 | *period = MAX(*period, transinfo->period); | 1682 | *period = max(*period, (u_int)transinfo->period); |
1683 | return (ahc_find_syncrate(ahc, period, ppr_options, maxsync)); | 1683 | return (ahc_find_syncrate(ahc, period, ppr_options, maxsync)); |
1684 | } | 1684 | } |
1685 | 1685 | ||
@@ -1804,12 +1804,12 @@ ahc_validate_offset(struct ahc_softc *ahc, | |||
1804 | else | 1804 | else |
1805 | maxoffset = MAX_OFFSET_8BIT; | 1805 | maxoffset = MAX_OFFSET_8BIT; |
1806 | } | 1806 | } |
1807 | *offset = MIN(*offset, maxoffset); | 1807 | *offset = min(*offset, maxoffset); |
1808 | if (tinfo != NULL) { | 1808 | if (tinfo != NULL) { |
1809 | if (role == ROLE_TARGET) | 1809 | if (role == ROLE_TARGET) |
1810 | *offset = MIN(*offset, tinfo->user.offset); | 1810 | *offset = min(*offset, (u_int)tinfo->user.offset); |
1811 | else | 1811 | else |
1812 | *offset = MIN(*offset, tinfo->goal.offset); | 1812 | *offset = min(*offset, (u_int)tinfo->goal.offset); |
1813 | } | 1813 | } |
1814 | } | 1814 | } |
1815 | 1815 | ||
@@ -1835,9 +1835,9 @@ ahc_validate_width(struct ahc_softc *ahc, struct ahc_initiator_tinfo *tinfo, | |||
1835 | } | 1835 | } |
1836 | if (tinfo != NULL) { | 1836 | if (tinfo != NULL) { |
1837 | if (role == ROLE_TARGET) | 1837 | if (role == ROLE_TARGET) |
1838 | *bus_width = MIN(tinfo->user.width, *bus_width); | 1838 | *bus_width = min((u_int)tinfo->user.width, *bus_width); |
1839 | else | 1839 | else |
1840 | *bus_width = MIN(tinfo->goal.width, *bus_width); | 1840 | *bus_width = min((u_int)tinfo->goal.width, *bus_width); |
1841 | } | 1841 | } |
1842 | } | 1842 | } |
1843 | 1843 | ||
@@ -1986,7 +1986,7 @@ ahc_set_syncrate(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, | |||
1986 | tinfo->curr.ppr_options = ppr_options; | 1986 | tinfo->curr.ppr_options = ppr_options; |
1987 | 1987 | ||
1988 | ahc_send_async(ahc, devinfo->channel, devinfo->target, | 1988 | ahc_send_async(ahc, devinfo->channel, devinfo->target, |
1989 | CAM_LUN_WILDCARD, AC_TRANSFER_NEG, NULL); | 1989 | CAM_LUN_WILDCARD, AC_TRANSFER_NEG); |
1990 | if (bootverbose) { | 1990 | if (bootverbose) { |
1991 | if (offset != 0) { | 1991 | if (offset != 0) { |
1992 | printf("%s: target %d synchronous at %sMHz%s, " | 1992 | printf("%s: target %d synchronous at %sMHz%s, " |
@@ -2056,7 +2056,7 @@ ahc_set_width(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, | |||
2056 | tinfo->curr.width = width; | 2056 | tinfo->curr.width = width; |
2057 | 2057 | ||
2058 | ahc_send_async(ahc, devinfo->channel, devinfo->target, | 2058 | ahc_send_async(ahc, devinfo->channel, devinfo->target, |
2059 | CAM_LUN_WILDCARD, AC_TRANSFER_NEG, NULL); | 2059 | CAM_LUN_WILDCARD, AC_TRANSFER_NEG); |
2060 | if (bootverbose) { | 2060 | if (bootverbose) { |
2061 | printf("%s: target %d using %dbit transfers\n", | 2061 | printf("%s: target %d using %dbit transfers\n", |
2062 | ahc_name(ahc), devinfo->target, | 2062 | ahc_name(ahc), devinfo->target, |
@@ -2074,12 +2074,14 @@ ahc_set_width(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, | |||
2074 | * Update the current state of tagged queuing for a given target. | 2074 | * Update the current state of tagged queuing for a given target. |
2075 | */ | 2075 | */ |
2076 | void | 2076 | void |
2077 | ahc_set_tags(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, | 2077 | ahc_set_tags(struct ahc_softc *ahc, struct scsi_cmnd *cmd, |
2078 | ahc_queue_alg alg) | 2078 | struct ahc_devinfo *devinfo, ahc_queue_alg alg) |
2079 | { | 2079 | { |
2080 | ahc_platform_set_tags(ahc, devinfo, alg); | 2080 | struct scsi_device *sdev = cmd->device; |
2081 | |||
2082 | ahc_platform_set_tags(ahc, sdev, devinfo, alg); | ||
2081 | ahc_send_async(ahc, devinfo->channel, devinfo->target, | 2083 | ahc_send_async(ahc, devinfo->channel, devinfo->target, |
2082 | devinfo->lun, AC_TRANSFER_NEG, &alg); | 2084 | devinfo->lun, AC_TRANSFER_NEG); |
2083 | } | 2085 | } |
2084 | 2086 | ||
2085 | /* | 2087 | /* |
@@ -3489,7 +3491,7 @@ ahc_handle_msg_reject(struct ahc_softc *ahc, struct ahc_devinfo *devinfo) | |||
3489 | printf("(%s:%c:%d:%d): refuses tagged commands. " | 3491 | printf("(%s:%c:%d:%d): refuses tagged commands. " |
3490 | "Performing non-tagged I/O\n", ahc_name(ahc), | 3492 | "Performing non-tagged I/O\n", ahc_name(ahc), |
3491 | devinfo->channel, devinfo->target, devinfo->lun); | 3493 | devinfo->channel, devinfo->target, devinfo->lun); |
3492 | ahc_set_tags(ahc, devinfo, AHC_QUEUE_NONE); | 3494 | ahc_set_tags(ahc, scb->io_ctx, devinfo, AHC_QUEUE_NONE); |
3493 | mask = ~0x23; | 3495 | mask = ~0x23; |
3494 | } else { | 3496 | } else { |
3495 | printf("(%s:%c:%d:%d): refuses %s tagged commands. " | 3497 | printf("(%s:%c:%d:%d): refuses %s tagged commands. " |
@@ -3497,7 +3499,7 @@ ahc_handle_msg_reject(struct ahc_softc *ahc, struct ahc_devinfo *devinfo) | |||
3497 | ahc_name(ahc), devinfo->channel, devinfo->target, | 3499 | ahc_name(ahc), devinfo->channel, devinfo->target, |
3498 | devinfo->lun, tag_type == MSG_ORDERED_TASK | 3500 | devinfo->lun, tag_type == MSG_ORDERED_TASK |
3499 | ? "ordered" : "head of queue"); | 3501 | ? "ordered" : "head of queue"); |
3500 | ahc_set_tags(ahc, devinfo, AHC_QUEUE_BASIC); | 3502 | ahc_set_tags(ahc, scb->io_ctx, devinfo, AHC_QUEUE_BASIC); |
3501 | mask = ~0x03; | 3503 | mask = ~0x03; |
3502 | } | 3504 | } |
3503 | 3505 | ||
@@ -3763,7 +3765,7 @@ ahc_handle_devreset(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, | |||
3763 | 3765 | ||
3764 | if (status != CAM_SEL_TIMEOUT) | 3766 | if (status != CAM_SEL_TIMEOUT) |
3765 | ahc_send_async(ahc, devinfo->channel, devinfo->target, | 3767 | ahc_send_async(ahc, devinfo->channel, devinfo->target, |
3766 | CAM_LUN_WILDCARD, AC_SENT_BDR, NULL); | 3768 | CAM_LUN_WILDCARD, AC_SENT_BDR); |
3767 | 3769 | ||
3768 | if (message != NULL | 3770 | if (message != NULL |
3769 | && (verbose_level <= bootverbose)) | 3771 | && (verbose_level <= bootverbose)) |
@@ -4406,7 +4408,7 @@ ahc_alloc_scbs(struct ahc_softc *ahc) | |||
4406 | physaddr = sg_map->sg_physaddr; | 4408 | physaddr = sg_map->sg_physaddr; |
4407 | 4409 | ||
4408 | newcount = (PAGE_SIZE / (AHC_NSEG * sizeof(struct ahc_dma_seg))); | 4410 | newcount = (PAGE_SIZE / (AHC_NSEG * sizeof(struct ahc_dma_seg))); |
4409 | newcount = MIN(newcount, (AHC_SCB_MAX_ALLOC - scb_data->numscbs)); | 4411 | newcount = min(newcount, (AHC_SCB_MAX_ALLOC - scb_data->numscbs)); |
4410 | for (i = 0; i < newcount; i++) { | 4412 | for (i = 0; i < newcount; i++) { |
4411 | struct scb_platform_data *pdata; | 4413 | struct scb_platform_data *pdata; |
4412 | #ifndef __linux__ | 4414 | #ifndef __linux__ |
@@ -6018,7 +6020,7 @@ ahc_reset_channel(struct ahc_softc *ahc, char channel, int initiate_reset) | |||
6018 | #endif | 6020 | #endif |
6019 | /* Notify the XPT that a bus reset occurred */ | 6021 | /* Notify the XPT that a bus reset occurred */ |
6020 | ahc_send_async(ahc, devinfo.channel, CAM_TARGET_WILDCARD, | 6022 | ahc_send_async(ahc, devinfo.channel, CAM_TARGET_WILDCARD, |
6021 | CAM_LUN_WILDCARD, AC_BUS_RESET, NULL); | 6023 | CAM_LUN_WILDCARD, AC_BUS_RESET); |
6022 | 6024 | ||
6023 | /* | 6025 | /* |
6024 | * Revert to async/narrow transfers until we renegotiate. | 6026 | * Revert to async/narrow transfers until we renegotiate. |
@@ -6442,7 +6444,7 @@ ahc_download_instr(struct ahc_softc *ahc, u_int instrptr, uint8_t *dconsts) | |||
6442 | if (skip_addr > i) { | 6444 | if (skip_addr > i) { |
6443 | int end_addr; | 6445 | int end_addr; |
6444 | 6446 | ||
6445 | end_addr = MIN(address, skip_addr); | 6447 | end_addr = min(address, skip_addr); |
6446 | address_offset += end_addr - i; | 6448 | address_offset += end_addr - i; |
6447 | i = skip_addr; | 6449 | i = skip_addr; |
6448 | } else { | 6450 | } else { |
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c index 43ab753d2739..660f26e23a38 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c | |||
@@ -328,7 +328,7 @@ static uint32_t aic7xxx_seltime; | |||
328 | * force all outstanding transactions to be serviced prior to a new | 328 | * force all outstanding transactions to be serviced prior to a new |
329 | * transaction. | 329 | * transaction. |
330 | */ | 330 | */ |
331 | uint32_t aic7xxx_periodic_otag; | 331 | static uint32_t aic7xxx_periodic_otag; |
332 | 332 | ||
333 | /* | 333 | /* |
334 | * Module information and settable options. | 334 | * Module information and settable options. |
@@ -512,7 +512,6 @@ ahc_linux_target_alloc(struct scsi_target *starget) | |||
512 | struct seeprom_config *sc = ahc->seep_config; | 512 | struct seeprom_config *sc = ahc->seep_config; |
513 | unsigned long flags; | 513 | unsigned long flags; |
514 | struct scsi_target **ahc_targp = ahc_linux_target_in_softc(starget); | 514 | struct scsi_target **ahc_targp = ahc_linux_target_in_softc(starget); |
515 | struct ahc_linux_target *targ = scsi_transport_target_data(starget); | ||
516 | unsigned short scsirate; | 515 | unsigned short scsirate; |
517 | struct ahc_devinfo devinfo; | 516 | struct ahc_devinfo devinfo; |
518 | struct ahc_initiator_tinfo *tinfo; | 517 | struct ahc_initiator_tinfo *tinfo; |
@@ -533,7 +532,6 @@ ahc_linux_target_alloc(struct scsi_target *starget) | |||
533 | BUG_ON(*ahc_targp != NULL); | 532 | BUG_ON(*ahc_targp != NULL); |
534 | 533 | ||
535 | *ahc_targp = starget; | 534 | *ahc_targp = starget; |
536 | memset(targ, 0, sizeof(*targ)); | ||
537 | 535 | ||
538 | if (sc) { | 536 | if (sc) { |
539 | int maxsync = AHC_SYNCRATE_DT; | 537 | int maxsync = AHC_SYNCRATE_DT; |
@@ -594,14 +592,11 @@ ahc_linux_slave_alloc(struct scsi_device *sdev) | |||
594 | struct ahc_softc *ahc = | 592 | struct ahc_softc *ahc = |
595 | *((struct ahc_softc **)sdev->host->hostdata); | 593 | *((struct ahc_softc **)sdev->host->hostdata); |
596 | struct scsi_target *starget = sdev->sdev_target; | 594 | struct scsi_target *starget = sdev->sdev_target; |
597 | struct ahc_linux_target *targ = scsi_transport_target_data(starget); | ||
598 | struct ahc_linux_device *dev; | 595 | struct ahc_linux_device *dev; |
599 | 596 | ||
600 | if (bootverbose) | 597 | if (bootverbose) |
601 | printf("%s: Slave Alloc %d\n", ahc_name(ahc), sdev->id); | 598 | printf("%s: Slave Alloc %d\n", ahc_name(ahc), sdev->id); |
602 | 599 | ||
603 | BUG_ON(targ->sdev[sdev->lun] != NULL); | ||
604 | |||
605 | dev = scsi_transport_device_data(sdev); | 600 | dev = scsi_transport_device_data(sdev); |
606 | memset(dev, 0, sizeof(*dev)); | 601 | memset(dev, 0, sizeof(*dev)); |
607 | 602 | ||
@@ -618,8 +613,6 @@ ahc_linux_slave_alloc(struct scsi_device *sdev) | |||
618 | */ | 613 | */ |
619 | dev->maxtags = 0; | 614 | dev->maxtags = 0; |
620 | 615 | ||
621 | targ->sdev[sdev->lun] = sdev; | ||
622 | |||
623 | spi_period(starget) = 0; | 616 | spi_period(starget) = 0; |
624 | 617 | ||
625 | return 0; | 618 | return 0; |
@@ -644,22 +637,6 @@ ahc_linux_slave_configure(struct scsi_device *sdev) | |||
644 | return 0; | 637 | return 0; |
645 | } | 638 | } |
646 | 639 | ||
647 | static void | ||
648 | ahc_linux_slave_destroy(struct scsi_device *sdev) | ||
649 | { | ||
650 | struct ahc_softc *ahc; | ||
651 | struct ahc_linux_device *dev = scsi_transport_device_data(sdev); | ||
652 | struct ahc_linux_target *targ = scsi_transport_target_data(sdev->sdev_target); | ||
653 | |||
654 | ahc = *((struct ahc_softc **)sdev->host->hostdata); | ||
655 | if (bootverbose) | ||
656 | printf("%s: Slave Destroy %d\n", ahc_name(ahc), sdev->id); | ||
657 | |||
658 | BUG_ON(dev->active); | ||
659 | |||
660 | targ->sdev[sdev->lun] = NULL; | ||
661 | } | ||
662 | |||
663 | #if defined(__i386__) | 640 | #if defined(__i386__) |
664 | /* | 641 | /* |
665 | * Return the disk geometry for the given SCSI device. | 642 | * Return the disk geometry for the given SCSI device. |
@@ -777,11 +754,11 @@ struct scsi_host_template aic7xxx_driver_template = { | |||
777 | #endif | 754 | #endif |
778 | .can_queue = AHC_MAX_QUEUE, | 755 | .can_queue = AHC_MAX_QUEUE, |
779 | .this_id = -1, | 756 | .this_id = -1, |
757 | .max_sectors = 8192, | ||
780 | .cmd_per_lun = 2, | 758 | .cmd_per_lun = 2, |
781 | .use_clustering = ENABLE_CLUSTERING, | 759 | .use_clustering = ENABLE_CLUSTERING, |
782 | .slave_alloc = ahc_linux_slave_alloc, | 760 | .slave_alloc = ahc_linux_slave_alloc, |
783 | .slave_configure = ahc_linux_slave_configure, | 761 | .slave_configure = ahc_linux_slave_configure, |
784 | .slave_destroy = ahc_linux_slave_destroy, | ||
785 | .target_alloc = ahc_linux_target_alloc, | 762 | .target_alloc = ahc_linux_target_alloc, |
786 | .target_destroy = ahc_linux_target_destroy, | 763 | .target_destroy = ahc_linux_target_destroy, |
787 | }; | 764 | }; |
@@ -1203,21 +1180,13 @@ void | |||
1203 | ahc_platform_free(struct ahc_softc *ahc) | 1180 | ahc_platform_free(struct ahc_softc *ahc) |
1204 | { | 1181 | { |
1205 | struct scsi_target *starget; | 1182 | struct scsi_target *starget; |
1206 | int i, j; | 1183 | int i; |
1207 | 1184 | ||
1208 | if (ahc->platform_data != NULL) { | 1185 | if (ahc->platform_data != NULL) { |
1209 | /* destroy all of the device and target objects */ | 1186 | /* destroy all of the device and target objects */ |
1210 | for (i = 0; i < AHC_NUM_TARGETS; i++) { | 1187 | for (i = 0; i < AHC_NUM_TARGETS; i++) { |
1211 | starget = ahc->platform_data->starget[i]; | 1188 | starget = ahc->platform_data->starget[i]; |
1212 | if (starget != NULL) { | 1189 | if (starget != NULL) { |
1213 | for (j = 0; j < AHC_NUM_LUNS; j++) { | ||
1214 | struct ahc_linux_target *targ = | ||
1215 | scsi_transport_target_data(starget); | ||
1216 | |||
1217 | if (targ->sdev[j] == NULL) | ||
1218 | continue; | ||
1219 | targ->sdev[j] = NULL; | ||
1220 | } | ||
1221 | ahc->platform_data->starget[i] = NULL; | 1190 | ahc->platform_data->starget[i] = NULL; |
1222 | } | 1191 | } |
1223 | } | 1192 | } |
@@ -1251,24 +1220,13 @@ ahc_platform_freeze_devq(struct ahc_softc *ahc, struct scb *scb) | |||
1251 | } | 1220 | } |
1252 | 1221 | ||
1253 | void | 1222 | void |
1254 | ahc_platform_set_tags(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, | 1223 | ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev, |
1255 | ahc_queue_alg alg) | 1224 | struct ahc_devinfo *devinfo, ahc_queue_alg alg) |
1256 | { | 1225 | { |
1257 | struct scsi_target *starget; | ||
1258 | struct ahc_linux_target *targ; | ||
1259 | struct ahc_linux_device *dev; | 1226 | struct ahc_linux_device *dev; |
1260 | struct scsi_device *sdev; | ||
1261 | u_int target_offset; | ||
1262 | int was_queuing; | 1227 | int was_queuing; |
1263 | int now_queuing; | 1228 | int now_queuing; |
1264 | 1229 | ||
1265 | target_offset = devinfo->target; | ||
1266 | if (devinfo->channel != 'A') | ||
1267 | target_offset += 8; | ||
1268 | starget = ahc->platform_data->starget[target_offset]; | ||
1269 | targ = scsi_transport_target_data(starget); | ||
1270 | BUG_ON(targ == NULL); | ||
1271 | sdev = targ->sdev[devinfo->lun]; | ||
1272 | if (sdev == NULL) | 1230 | if (sdev == NULL) |
1273 | return; | 1231 | return; |
1274 | dev = scsi_transport_device_data(sdev); | 1232 | dev = scsi_transport_device_data(sdev); |
@@ -1401,11 +1359,15 @@ ahc_linux_device_queue_depth(struct scsi_device *sdev) | |||
1401 | tags = ahc_linux_user_tagdepth(ahc, &devinfo); | 1359 | tags = ahc_linux_user_tagdepth(ahc, &devinfo); |
1402 | if (tags != 0 && sdev->tagged_supported != 0) { | 1360 | if (tags != 0 && sdev->tagged_supported != 0) { |
1403 | 1361 | ||
1404 | ahc_set_tags(ahc, &devinfo, AHC_QUEUE_TAGGED); | 1362 | ahc_platform_set_tags(ahc, sdev, &devinfo, AHC_QUEUE_TAGGED); |
1363 | ahc_send_async(ahc, devinfo.channel, devinfo.target, | ||
1364 | devinfo.lun, AC_TRANSFER_NEG); | ||
1405 | ahc_print_devinfo(ahc, &devinfo); | 1365 | ahc_print_devinfo(ahc, &devinfo); |
1406 | printf("Tagged Queuing enabled. Depth %d\n", tags); | 1366 | printf("Tagged Queuing enabled. Depth %d\n", tags); |
1407 | } else { | 1367 | } else { |
1408 | ahc_set_tags(ahc, &devinfo, AHC_QUEUE_NONE); | 1368 | ahc_platform_set_tags(ahc, sdev, &devinfo, AHC_QUEUE_NONE); |
1369 | ahc_send_async(ahc, devinfo.channel, devinfo.target, | ||
1370 | devinfo.lun, AC_TRANSFER_NEG); | ||
1409 | } | 1371 | } |
1410 | } | 1372 | } |
1411 | 1373 | ||
@@ -1629,7 +1591,7 @@ ahc_platform_flushwork(struct ahc_softc *ahc) | |||
1629 | 1591 | ||
1630 | void | 1592 | void |
1631 | ahc_send_async(struct ahc_softc *ahc, char channel, | 1593 | ahc_send_async(struct ahc_softc *ahc, char channel, |
1632 | u_int target, u_int lun, ac_code code, void *arg) | 1594 | u_int target, u_int lun, ac_code code) |
1633 | { | 1595 | { |
1634 | switch (code) { | 1596 | switch (code) { |
1635 | case AC_TRANSFER_NEG: | 1597 | case AC_TRANSFER_NEG: |
@@ -1875,9 +1837,9 @@ ahc_linux_handle_scsi_status(struct ahc_softc *ahc, | |||
1875 | if (scb->flags & SCB_SENSE) { | 1837 | if (scb->flags & SCB_SENSE) { |
1876 | u_int sense_size; | 1838 | u_int sense_size; |
1877 | 1839 | ||
1878 | sense_size = MIN(sizeof(struct scsi_sense_data) | 1840 | sense_size = min(sizeof(struct scsi_sense_data) |
1879 | - ahc_get_sense_residual(scb), | 1841 | - ahc_get_sense_residual(scb), |
1880 | sizeof(cmd->sense_buffer)); | 1842 | (u_long)sizeof(cmd->sense_buffer)); |
1881 | memcpy(cmd->sense_buffer, | 1843 | memcpy(cmd->sense_buffer, |
1882 | ahc_get_sense_buf(ahc, scb), sense_size); | 1844 | ahc_get_sense_buf(ahc, scb), sense_size); |
1883 | if (sense_size < sizeof(cmd->sense_buffer)) | 1845 | if (sense_size < sizeof(cmd->sense_buffer)) |
@@ -1946,7 +1908,7 @@ ahc_linux_handle_scsi_status(struct ahc_softc *ahc, | |||
1946 | } | 1908 | } |
1947 | ahc_set_transaction_status(scb, CAM_REQUEUE_REQ); | 1909 | ahc_set_transaction_status(scb, CAM_REQUEUE_REQ); |
1948 | ahc_set_scsi_status(scb, SCSI_STATUS_OK); | 1910 | ahc_set_scsi_status(scb, SCSI_STATUS_OK); |
1949 | ahc_platform_set_tags(ahc, &devinfo, | 1911 | ahc_platform_set_tags(ahc, sdev, &devinfo, |
1950 | (dev->flags & AHC_DEV_Q_BASIC) | 1912 | (dev->flags & AHC_DEV_Q_BASIC) |
1951 | ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED); | 1913 | ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED); |
1952 | break; | 1914 | break; |
@@ -1957,7 +1919,7 @@ ahc_linux_handle_scsi_status(struct ahc_softc *ahc, | |||
1957 | */ | 1919 | */ |
1958 | dev->openings = 1; | 1920 | dev->openings = 1; |
1959 | ahc_set_scsi_status(scb, SCSI_STATUS_BUSY); | 1921 | ahc_set_scsi_status(scb, SCSI_STATUS_BUSY); |
1960 | ahc_platform_set_tags(ahc, &devinfo, | 1922 | ahc_platform_set_tags(ahc, sdev, &devinfo, |
1961 | (dev->flags & AHC_DEV_Q_BASIC) | 1923 | (dev->flags & AHC_DEV_Q_BASIC) |
1962 | ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED); | 1924 | ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED); |
1963 | break; | 1925 | break; |
@@ -2599,8 +2561,6 @@ ahc_linux_init(void) | |||
2599 | if (!ahc_linux_transport_template) | 2561 | if (!ahc_linux_transport_template) |
2600 | return -ENODEV; | 2562 | return -ENODEV; |
2601 | 2563 | ||
2602 | scsi_transport_reserve_target(ahc_linux_transport_template, | ||
2603 | sizeof(struct ahc_linux_target)); | ||
2604 | scsi_transport_reserve_device(ahc_linux_transport_template, | 2564 | scsi_transport_reserve_device(ahc_linux_transport_template, |
2605 | sizeof(struct ahc_linux_device)); | 2565 | sizeof(struct ahc_linux_device)); |
2606 | 2566 | ||
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.h b/drivers/scsi/aic7xxx/aic7xxx_osm.h index a87a4ce090df..85ae5d836fa4 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.h +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.h | |||
@@ -256,7 +256,6 @@ typedef enum { | |||
256 | AHC_DEV_PERIODIC_OTAG = 0x40, /* Send OTAG to prevent starvation */ | 256 | AHC_DEV_PERIODIC_OTAG = 0x40, /* Send OTAG to prevent starvation */ |
257 | } ahc_linux_dev_flags; | 257 | } ahc_linux_dev_flags; |
258 | 258 | ||
259 | struct ahc_linux_target; | ||
260 | struct ahc_linux_device { | 259 | struct ahc_linux_device { |
261 | /* | 260 | /* |
262 | * The number of transactions currently | 261 | * The number of transactions currently |
@@ -329,12 +328,6 @@ struct ahc_linux_device { | |||
329 | #define AHC_OTAG_THRESH 500 | 328 | #define AHC_OTAG_THRESH 500 |
330 | }; | 329 | }; |
331 | 330 | ||
332 | struct ahc_linux_target { | ||
333 | struct scsi_device *sdev[AHC_NUM_LUNS]; | ||
334 | struct ahc_transinfo last_tinfo; | ||
335 | struct ahc_softc *ahc; | ||
336 | }; | ||
337 | |||
338 | /********************* Definitions Required by the Core ***********************/ | 331 | /********************* Definitions Required by the Core ***********************/ |
339 | /* | 332 | /* |
340 | * Number of SG segments we require. So long as the S/G segments for | 333 | * Number of SG segments we require. So long as the S/G segments for |
@@ -533,8 +526,6 @@ ahc_unlock(struct ahc_softc *ahc, unsigned long *flags) | |||
533 | #define PCIR_SUBVEND_0 0x2c | 526 | #define PCIR_SUBVEND_0 0x2c |
534 | #define PCIR_SUBDEV_0 0x2e | 527 | #define PCIR_SUBDEV_0 0x2e |
535 | 528 | ||
536 | extern struct pci_driver aic7xxx_pci_driver; | ||
537 | |||
538 | typedef enum | 529 | typedef enum |
539 | { | 530 | { |
540 | AHC_POWER_STATE_D0, | 531 | AHC_POWER_STATE_D0, |
@@ -824,7 +815,7 @@ ahc_freeze_scb(struct scb *scb) | |||
824 | } | 815 | } |
825 | } | 816 | } |
826 | 817 | ||
827 | void ahc_platform_set_tags(struct ahc_softc *ahc, | 818 | void ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev, |
828 | struct ahc_devinfo *devinfo, ahc_queue_alg); | 819 | struct ahc_devinfo *devinfo, ahc_queue_alg); |
829 | int ahc_platform_abort_scbs(struct ahc_softc *ahc, int target, | 820 | int ahc_platform_abort_scbs(struct ahc_softc *ahc, int target, |
830 | char channel, int lun, u_int tag, | 821 | char channel, int lun, u_int tag, |
@@ -834,7 +825,7 @@ irqreturn_t | |||
834 | void ahc_platform_flushwork(struct ahc_softc *ahc); | 825 | void ahc_platform_flushwork(struct ahc_softc *ahc); |
835 | void ahc_done(struct ahc_softc*, struct scb*); | 826 | void ahc_done(struct ahc_softc*, struct scb*); |
836 | void ahc_send_async(struct ahc_softc *, char channel, | 827 | void ahc_send_async(struct ahc_softc *, char channel, |
837 | u_int target, u_int lun, ac_code, void *); | 828 | u_int target, u_int lun, ac_code); |
838 | void ahc_print_path(struct ahc_softc *, struct scb *); | 829 | void ahc_print_path(struct ahc_softc *, struct scb *); |
839 | void ahc_platform_dump_card_state(struct ahc_softc *ahc); | 830 | void ahc_platform_dump_card_state(struct ahc_softc *ahc); |
840 | 831 | ||
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c b/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c index d20ca514e9f3..ea5687df732d 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c | |||
@@ -130,7 +130,7 @@ static struct pci_device_id ahc_linux_pci_id_table[] = { | |||
130 | 130 | ||
131 | MODULE_DEVICE_TABLE(pci, ahc_linux_pci_id_table); | 131 | MODULE_DEVICE_TABLE(pci, ahc_linux_pci_id_table); |
132 | 132 | ||
133 | struct pci_driver aic7xxx_pci_driver = { | 133 | static struct pci_driver aic7xxx_pci_driver = { |
134 | .name = "aic7xxx", | 134 | .name = "aic7xxx", |
135 | .probe = ahc_linux_pci_dev_probe, | 135 | .probe = ahc_linux_pci_dev_probe, |
136 | .remove = ahc_linux_pci_dev_remove, | 136 | .remove = ahc_linux_pci_dev_remove, |
diff --git a/drivers/scsi/aic7xxx/aic7xxx_pci.c b/drivers/scsi/aic7xxx/aic7xxx_pci.c index 63cab2d74552..09c8172c9e5e 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_pci.c +++ b/drivers/scsi/aic7xxx/aic7xxx_pci.c | |||
@@ -168,7 +168,7 @@ static ahc_device_setup_t ahc_aha394XX_setup; | |||
168 | static ahc_device_setup_t ahc_aha494XX_setup; | 168 | static ahc_device_setup_t ahc_aha494XX_setup; |
169 | static ahc_device_setup_t ahc_aha398XX_setup; | 169 | static ahc_device_setup_t ahc_aha398XX_setup; |
170 | 170 | ||
171 | struct ahc_pci_identity ahc_pci_ident_table [] = | 171 | static struct ahc_pci_identity ahc_pci_ident_table [] = |
172 | { | 172 | { |
173 | /* aic7850 based controllers */ | 173 | /* aic7850 based controllers */ |
174 | { | 174 | { |
@@ -559,7 +559,7 @@ struct ahc_pci_identity ahc_pci_ident_table [] = | |||
559 | } | 559 | } |
560 | }; | 560 | }; |
561 | 561 | ||
562 | const u_int ahc_num_pci_devs = ARRAY_SIZE(ahc_pci_ident_table); | 562 | static const u_int ahc_num_pci_devs = ARRAY_SIZE(ahc_pci_ident_table); |
563 | 563 | ||
564 | #define AHC_394X_SLOT_CHANNEL_A 4 | 564 | #define AHC_394X_SLOT_CHANNEL_A 4 |
565 | #define AHC_394X_SLOT_CHANNEL_B 5 | 565 | #define AHC_394X_SLOT_CHANNEL_B 5 |
diff --git a/drivers/scsi/aic7xxx/aic7xxx_proc.c b/drivers/scsi/aic7xxx/aic7xxx_proc.c index 5914b4aa4a8f..99e5443e7535 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_proc.c +++ b/drivers/scsi/aic7xxx/aic7xxx_proc.c | |||
@@ -182,7 +182,6 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info, | |||
182 | u_int our_id, char channel, u_int target_id, | 182 | u_int our_id, char channel, u_int target_id, |
183 | u_int target_offset) | 183 | u_int target_offset) |
184 | { | 184 | { |
185 | struct ahc_linux_target *targ; | ||
186 | struct scsi_target *starget; | 185 | struct scsi_target *starget; |
187 | struct ahc_initiator_tinfo *tinfo; | 186 | struct ahc_initiator_tinfo *tinfo; |
188 | struct ahc_tmode_tstate *tstate; | 187 | struct ahc_tmode_tstate *tstate; |
@@ -198,7 +197,6 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info, | |||
198 | starget = ahc->platform_data->starget[target_offset]; | 197 | starget = ahc->platform_data->starget[target_offset]; |
199 | if (!starget) | 198 | if (!starget) |
200 | return; | 199 | return; |
201 | targ = scsi_transport_target_data(starget); | ||
202 | 200 | ||
203 | copy_info(info, "\tGoal: "); | 201 | copy_info(info, "\tGoal: "); |
204 | ahc_format_transinfo(info, &tinfo->goal); | 202 | ahc_format_transinfo(info, &tinfo->goal); |
@@ -208,7 +206,7 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info, | |||
208 | for (lun = 0; lun < AHC_NUM_LUNS; lun++) { | 206 | for (lun = 0; lun < AHC_NUM_LUNS; lun++) { |
209 | struct scsi_device *sdev; | 207 | struct scsi_device *sdev; |
210 | 208 | ||
211 | sdev = targ->sdev[lun]; | 209 | sdev = scsi_device_lookup_by_target(starget, lun); |
212 | 210 | ||
213 | if (sdev == NULL) | 211 | if (sdev == NULL) |
214 | continue; | 212 | continue; |
@@ -383,11 +381,11 @@ ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start, | |||
383 | } | 381 | } |
384 | copy_info(&info, "\n"); | 382 | copy_info(&info, "\n"); |
385 | 383 | ||
386 | max_targ = 15; | 384 | max_targ = 16; |
387 | if ((ahc->features & (AHC_WIDE|AHC_TWIN)) == 0) | 385 | if ((ahc->features & (AHC_WIDE|AHC_TWIN)) == 0) |
388 | max_targ = 7; | 386 | max_targ = 8; |
389 | 387 | ||
390 | for (i = 0; i <= max_targ; i++) { | 388 | for (i = 0; i < max_targ; i++) { |
391 | u_int our_id; | 389 | u_int our_id; |
392 | u_int target_id; | 390 | u_int target_id; |
393 | char channel; | 391 | char channel; |
diff --git a/drivers/scsi/aic7xxx_old.c b/drivers/scsi/aic7xxx_old.c index bcd7fffab907..46eed10b25d9 100644 --- a/drivers/scsi/aic7xxx_old.c +++ b/drivers/scsi/aic7xxx_old.c | |||
@@ -2646,7 +2646,7 @@ static void aic7xxx_done_cmds_complete(struct aic7xxx_host *p) | |||
2646 | 2646 | ||
2647 | while (p->completeq.head != NULL) { | 2647 | while (p->completeq.head != NULL) { |
2648 | cmd = p->completeq.head; | 2648 | cmd = p->completeq.head; |
2649 | p->completeq.head = (struct scsi_Cmnd *) cmd->host_scribble; | 2649 | p->completeq.head = (struct scsi_cmnd *) cmd->host_scribble; |
2650 | cmd->host_scribble = NULL; | 2650 | cmd->host_scribble = NULL; |
2651 | cmd->scsi_done(cmd); | 2651 | cmd->scsi_done(cmd); |
2652 | } | 2652 | } |
diff --git a/drivers/scsi/aic94xx/aic94xx_hwi.c b/drivers/scsi/aic94xx/aic94xx_hwi.c index 3c2d7a379931..af7e01134364 100644 --- a/drivers/scsi/aic94xx/aic94xx_hwi.c +++ b/drivers/scsi/aic94xx/aic94xx_hwi.c | |||
@@ -112,6 +112,21 @@ static int asd_init_phy(struct asd_phy *phy) | |||
112 | return 0; | 112 | return 0; |
113 | } | 113 | } |
114 | 114 | ||
115 | static void asd_init_ports(struct asd_ha_struct *asd_ha) | ||
116 | { | ||
117 | int i; | ||
118 | |||
119 | spin_lock_init(&asd_ha->asd_ports_lock); | ||
120 | for (i = 0; i < ASD_MAX_PHYS; i++) { | ||
121 | struct asd_port *asd_port = &asd_ha->asd_ports[i]; | ||
122 | |||
123 | memset(asd_port->sas_addr, 0, SAS_ADDR_SIZE); | ||
124 | memset(asd_port->attached_sas_addr, 0, SAS_ADDR_SIZE); | ||
125 | asd_port->phy_mask = 0; | ||
126 | asd_port->num_phys = 0; | ||
127 | } | ||
128 | } | ||
129 | |||
115 | static int asd_init_phys(struct asd_ha_struct *asd_ha) | 130 | static int asd_init_phys(struct asd_ha_struct *asd_ha) |
116 | { | 131 | { |
117 | u8 i; | 132 | u8 i; |
@@ -121,6 +136,7 @@ static int asd_init_phys(struct asd_ha_struct *asd_ha) | |||
121 | struct asd_phy *phy = &asd_ha->phys[i]; | 136 | struct asd_phy *phy = &asd_ha->phys[i]; |
122 | 137 | ||
123 | phy->phy_desc = &asd_ha->hw_prof.phy_desc[i]; | 138 | phy->phy_desc = &asd_ha->hw_prof.phy_desc[i]; |
139 | phy->asd_port = NULL; | ||
124 | 140 | ||
125 | phy->sas_phy.enabled = 0; | 141 | phy->sas_phy.enabled = 0; |
126 | phy->sas_phy.id = i; | 142 | phy->sas_phy.id = i; |
@@ -658,6 +674,8 @@ int asd_init_hw(struct asd_ha_struct *asd_ha) | |||
658 | goto Out; | 674 | goto Out; |
659 | } | 675 | } |
660 | 676 | ||
677 | asd_init_ports(asd_ha); | ||
678 | |||
661 | err = asd_init_scbs(asd_ha); | 679 | err = asd_init_scbs(asd_ha); |
662 | if (err) { | 680 | if (err) { |
663 | asd_printk("couldn't initialize scbs for %s\n", | 681 | asd_printk("couldn't initialize scbs for %s\n", |
diff --git a/drivers/scsi/aic94xx/aic94xx_hwi.h b/drivers/scsi/aic94xx/aic94xx_hwi.h index 14319d1d6804..c6c3d18222fa 100644 --- a/drivers/scsi/aic94xx/aic94xx_hwi.h +++ b/drivers/scsi/aic94xx/aic94xx_hwi.h | |||
@@ -46,6 +46,7 @@ | |||
46 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR10 0x410 | 46 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR10 0x410 |
47 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR12 0x412 | 47 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR12 0x412 |
48 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR1E 0x41E | 48 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR1E 0x41E |
49 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR1F 0x41F | ||
49 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR30 0x430 | 50 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR30 0x430 |
50 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR32 0x432 | 51 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR32 0x432 |
51 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR3E 0x43E | 52 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR3E 0x43E |
@@ -192,6 +193,16 @@ struct asd_seq_data { | |||
192 | struct asd_ascb **escb_arr; /* array of pointers to escbs */ | 193 | struct asd_ascb **escb_arr; /* array of pointers to escbs */ |
193 | }; | 194 | }; |
194 | 195 | ||
196 | /* This is an internal port structure. These are used to get accurate | ||
197 | * phy_mask for updating DDB 0. | ||
198 | */ | ||
199 | struct asd_port { | ||
200 | u8 sas_addr[SAS_ADDR_SIZE]; | ||
201 | u8 attached_sas_addr[SAS_ADDR_SIZE]; | ||
202 | u32 phy_mask; | ||
203 | int num_phys; | ||
204 | }; | ||
205 | |||
195 | /* This is the Host Adapter structure. It describes the hardware | 206 | /* This is the Host Adapter structure. It describes the hardware |
196 | * SAS adapter. | 207 | * SAS adapter. |
197 | */ | 208 | */ |
@@ -210,6 +221,8 @@ struct asd_ha_struct { | |||
210 | struct hw_profile hw_prof; | 221 | struct hw_profile hw_prof; |
211 | 222 | ||
212 | struct asd_phy phys[ASD_MAX_PHYS]; | 223 | struct asd_phy phys[ASD_MAX_PHYS]; |
224 | spinlock_t asd_ports_lock; | ||
225 | struct asd_port asd_ports[ASD_MAX_PHYS]; | ||
213 | struct asd_sas_port ports[ASD_MAX_PHYS]; | 226 | struct asd_sas_port ports[ASD_MAX_PHYS]; |
214 | 227 | ||
215 | struct dma_pool *scb_pool; | 228 | struct dma_pool *scb_pool; |
diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c index 99743ca29ca1..57c5ba4043f2 100644 --- a/drivers/scsi/aic94xx/aic94xx_init.c +++ b/drivers/scsi/aic94xx/aic94xx_init.c | |||
@@ -786,8 +786,6 @@ static void asd_remove_driver_attrs(struct device_driver *driver) | |||
786 | } | 786 | } |
787 | 787 | ||
788 | static struct sas_domain_function_template aic94xx_transport_functions = { | 788 | static struct sas_domain_function_template aic94xx_transport_functions = { |
789 | .lldd_port_formed = asd_update_port_links, | ||
790 | |||
791 | .lldd_dev_found = asd_dev_found, | 789 | .lldd_dev_found = asd_dev_found, |
792 | .lldd_dev_gone = asd_dev_gone, | 790 | .lldd_dev_gone = asd_dev_gone, |
793 | 791 | ||
@@ -814,6 +812,8 @@ static const struct pci_device_id aic94xx_pci_table[] __devinitdata = { | |||
814 | 0, 0, 1}, | 812 | 0, 0, 1}, |
815 | {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR1E), | 813 | {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR1E), |
816 | 0, 0, 1}, | 814 | 0, 0, 1}, |
815 | {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR1F), | ||
816 | 0, 0, 1}, | ||
817 | {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR30), | 817 | {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR30), |
818 | 0, 0, 2}, | 818 | 0, 0, 2}, |
819 | {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR32), | 819 | {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR32), |
diff --git a/drivers/scsi/aic94xx/aic94xx_sas.h b/drivers/scsi/aic94xx/aic94xx_sas.h index 64d231712345..9050e93bfd5e 100644 --- a/drivers/scsi/aic94xx/aic94xx_sas.h +++ b/drivers/scsi/aic94xx/aic94xx_sas.h | |||
@@ -733,6 +733,7 @@ struct asd_phy { | |||
733 | 733 | ||
734 | struct sas_identify_frame *identify_frame; | 734 | struct sas_identify_frame *identify_frame; |
735 | struct asd_dma_tok *id_frm_tok; | 735 | struct asd_dma_tok *id_frm_tok; |
736 | struct asd_port *asd_port; | ||
736 | 737 | ||
737 | u8 frame_rcvd[ASD_EDB_SIZE]; | 738 | u8 frame_rcvd[ASD_EDB_SIZE]; |
738 | }; | 739 | }; |
diff --git a/drivers/scsi/aic94xx/aic94xx_scb.c b/drivers/scsi/aic94xx/aic94xx_scb.c index 7ee49b51b724..b15caf1c8fa2 100644 --- a/drivers/scsi/aic94xx/aic94xx_scb.c +++ b/drivers/scsi/aic94xx/aic94xx_scb.c | |||
@@ -168,6 +168,70 @@ static inline void asd_get_attached_sas_addr(struct asd_phy *phy, u8 *sas_addr) | |||
168 | } | 168 | } |
169 | } | 169 | } |
170 | 170 | ||
171 | static void asd_form_port(struct asd_ha_struct *asd_ha, struct asd_phy *phy) | ||
172 | { | ||
173 | int i; | ||
174 | struct asd_port *free_port = NULL; | ||
175 | struct asd_port *port; | ||
176 | struct asd_sas_phy *sas_phy = &phy->sas_phy; | ||
177 | unsigned long flags; | ||
178 | |||
179 | spin_lock_irqsave(&asd_ha->asd_ports_lock, flags); | ||
180 | if (!phy->asd_port) { | ||
181 | for (i = 0; i < ASD_MAX_PHYS; i++) { | ||
182 | port = &asd_ha->asd_ports[i]; | ||
183 | |||
184 | /* Check for wide port */ | ||
185 | if (port->num_phys > 0 && | ||
186 | memcmp(port->sas_addr, sas_phy->sas_addr, | ||
187 | SAS_ADDR_SIZE) == 0 && | ||
188 | memcmp(port->attached_sas_addr, | ||
189 | sas_phy->attached_sas_addr, | ||
190 | SAS_ADDR_SIZE) == 0) { | ||
191 | break; | ||
192 | } | ||
193 | |||
194 | /* Find a free port */ | ||
195 | if (port->num_phys == 0 && free_port == NULL) { | ||
196 | free_port = port; | ||
197 | } | ||
198 | } | ||
199 | |||
200 | /* Use a free port if this doesn't form a wide port */ | ||
201 | if (i >= ASD_MAX_PHYS) { | ||
202 | port = free_port; | ||
203 | BUG_ON(!port); | ||
204 | memcpy(port->sas_addr, sas_phy->sas_addr, | ||
205 | SAS_ADDR_SIZE); | ||
206 | memcpy(port->attached_sas_addr, | ||
207 | sas_phy->attached_sas_addr, | ||
208 | SAS_ADDR_SIZE); | ||
209 | } | ||
210 | port->num_phys++; | ||
211 | port->phy_mask |= (1U << sas_phy->id); | ||
212 | phy->asd_port = port; | ||
213 | } | ||
214 | ASD_DPRINTK("%s: updating phy_mask 0x%x for phy%d\n", | ||
215 | __FUNCTION__, phy->asd_port->phy_mask, sas_phy->id); | ||
216 | asd_update_port_links(asd_ha, phy); | ||
217 | spin_unlock_irqrestore(&asd_ha->asd_ports_lock, flags); | ||
218 | } | ||
219 | |||
220 | static void asd_deform_port(struct asd_ha_struct *asd_ha, struct asd_phy *phy) | ||
221 | { | ||
222 | struct asd_port *port = phy->asd_port; | ||
223 | struct asd_sas_phy *sas_phy = &phy->sas_phy; | ||
224 | unsigned long flags; | ||
225 | |||
226 | spin_lock_irqsave(&asd_ha->asd_ports_lock, flags); | ||
227 | if (port) { | ||
228 | port->num_phys--; | ||
229 | port->phy_mask &= ~(1U << sas_phy->id); | ||
230 | phy->asd_port = NULL; | ||
231 | } | ||
232 | spin_unlock_irqrestore(&asd_ha->asd_ports_lock, flags); | ||
233 | } | ||
234 | |||
171 | static inline void asd_bytes_dmaed_tasklet(struct asd_ascb *ascb, | 235 | static inline void asd_bytes_dmaed_tasklet(struct asd_ascb *ascb, |
172 | struct done_list_struct *dl, | 236 | struct done_list_struct *dl, |
173 | int edb_id, int phy_id) | 237 | int edb_id, int phy_id) |
@@ -187,6 +251,7 @@ static inline void asd_bytes_dmaed_tasklet(struct asd_ascb *ascb, | |||
187 | asd_get_attached_sas_addr(phy, phy->sas_phy.attached_sas_addr); | 251 | asd_get_attached_sas_addr(phy, phy->sas_phy.attached_sas_addr); |
188 | spin_unlock_irqrestore(&phy->sas_phy.frame_rcvd_lock, flags); | 252 | spin_unlock_irqrestore(&phy->sas_phy.frame_rcvd_lock, flags); |
189 | asd_dump_frame_rcvd(phy, dl); | 253 | asd_dump_frame_rcvd(phy, dl); |
254 | asd_form_port(ascb->ha, phy); | ||
190 | sas_ha->notify_port_event(&phy->sas_phy, PORTE_BYTES_DMAED); | 255 | sas_ha->notify_port_event(&phy->sas_phy, PORTE_BYTES_DMAED); |
191 | } | 256 | } |
192 | 257 | ||
@@ -197,6 +262,7 @@ static inline void asd_link_reset_err_tasklet(struct asd_ascb *ascb, | |||
197 | struct asd_ha_struct *asd_ha = ascb->ha; | 262 | struct asd_ha_struct *asd_ha = ascb->ha; |
198 | struct sas_ha_struct *sas_ha = &asd_ha->sas_ha; | 263 | struct sas_ha_struct *sas_ha = &asd_ha->sas_ha; |
199 | struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id]; | 264 | struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id]; |
265 | struct asd_phy *phy = &asd_ha->phys[phy_id]; | ||
200 | u8 lr_error = dl->status_block[1]; | 266 | u8 lr_error = dl->status_block[1]; |
201 | u8 retries_left = dl->status_block[2]; | 267 | u8 retries_left = dl->status_block[2]; |
202 | 268 | ||
@@ -221,6 +287,7 @@ static inline void asd_link_reset_err_tasklet(struct asd_ascb *ascb, | |||
221 | 287 | ||
222 | asd_turn_led(asd_ha, phy_id, 0); | 288 | asd_turn_led(asd_ha, phy_id, 0); |
223 | sas_phy_disconnected(sas_phy); | 289 | sas_phy_disconnected(sas_phy); |
290 | asd_deform_port(asd_ha, phy); | ||
224 | sas_ha->notify_port_event(sas_phy, PORTE_LINK_RESET_ERR); | 291 | sas_ha->notify_port_event(sas_phy, PORTE_LINK_RESET_ERR); |
225 | 292 | ||
226 | if (retries_left == 0) { | 293 | if (retries_left == 0) { |
@@ -248,6 +315,8 @@ static inline void asd_primitive_rcvd_tasklet(struct asd_ascb *ascb, | |||
248 | unsigned long flags; | 315 | unsigned long flags; |
249 | struct sas_ha_struct *sas_ha = &ascb->ha->sas_ha; | 316 | struct sas_ha_struct *sas_ha = &ascb->ha->sas_ha; |
250 | struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id]; | 317 | struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id]; |
318 | struct asd_ha_struct *asd_ha = ascb->ha; | ||
319 | struct asd_phy *phy = &asd_ha->phys[phy_id]; | ||
251 | u8 reg = dl->status_block[1]; | 320 | u8 reg = dl->status_block[1]; |
252 | u32 cont = dl->status_block[2] << ((reg & 3)*8); | 321 | u32 cont = dl->status_block[2] << ((reg & 3)*8); |
253 | 322 | ||
@@ -284,6 +353,7 @@ static inline void asd_primitive_rcvd_tasklet(struct asd_ascb *ascb, | |||
284 | phy_id); | 353 | phy_id); |
285 | /* The sequencer disables all phys on that port. | 354 | /* The sequencer disables all phys on that port. |
286 | * We have to re-enable the phys ourselves. */ | 355 | * We have to re-enable the phys ourselves. */ |
356 | asd_deform_port(asd_ha, phy); | ||
287 | sas_ha->notify_port_event(sas_phy, PORTE_HARD_RESET); | 357 | sas_ha->notify_port_event(sas_phy, PORTE_HARD_RESET); |
288 | break; | 358 | break; |
289 | 359 | ||
@@ -351,6 +421,7 @@ static void escb_tasklet_complete(struct asd_ascb *ascb, | |||
351 | u8 sb_opcode = dl->status_block[0]; | 421 | u8 sb_opcode = dl->status_block[0]; |
352 | int phy_id = sb_opcode & DL_PHY_MASK; | 422 | int phy_id = sb_opcode & DL_PHY_MASK; |
353 | struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id]; | 423 | struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id]; |
424 | struct asd_phy *phy = &asd_ha->phys[phy_id]; | ||
354 | 425 | ||
355 | if (edb > 6 || edb < 0) { | 426 | if (edb > 6 || edb < 0) { |
356 | ASD_DPRINTK("edb is 0x%x! dl->opcode is 0x%x\n", | 427 | ASD_DPRINTK("edb is 0x%x! dl->opcode is 0x%x\n", |
@@ -395,6 +466,7 @@ static void escb_tasklet_complete(struct asd_ascb *ascb, | |||
395 | asd_turn_led(asd_ha, phy_id, 0); | 466 | asd_turn_led(asd_ha, phy_id, 0); |
396 | /* the device is gone */ | 467 | /* the device is gone */ |
397 | sas_phy_disconnected(sas_phy); | 468 | sas_phy_disconnected(sas_phy); |
469 | asd_deform_port(asd_ha, phy); | ||
398 | sas_ha->notify_port_event(sas_phy, PORTE_TIMER_EVENT); | 470 | sas_ha->notify_port_event(sas_phy, PORTE_TIMER_EVENT); |
399 | break; | 471 | break; |
400 | case REQ_TASK_ABORT: | 472 | case REQ_TASK_ABORT: |
diff --git a/drivers/scsi/aic94xx/aic94xx_sds.c b/drivers/scsi/aic94xx/aic94xx_sds.c index 83574b5b4e69..de7c04d4254d 100644 --- a/drivers/scsi/aic94xx/aic94xx_sds.c +++ b/drivers/scsi/aic94xx/aic94xx_sds.c | |||
@@ -630,10 +630,6 @@ static int asd_flash_getid(struct asd_ha_struct *asd_ha) | |||
630 | 630 | ||
631 | reg = asd_read_reg_dword(asd_ha, EXSICNFGR); | 631 | reg = asd_read_reg_dword(asd_ha, EXSICNFGR); |
632 | 632 | ||
633 | if (!(reg & FLASHEX)) { | ||
634 | ASD_DPRINTK("flash doesn't exist\n"); | ||
635 | return -ENOENT; | ||
636 | } | ||
637 | if (pci_read_config_dword(asd_ha->pcidev, PCI_CONF_FLSH_BAR, | 633 | if (pci_read_config_dword(asd_ha->pcidev, PCI_CONF_FLSH_BAR, |
638 | &asd_ha->hw_prof.flash.bar)) { | 634 | &asd_ha->hw_prof.flash.bar)) { |
639 | asd_printk("couldn't read PCI_CONF_FLSH_BAR of %s\n", | 635 | asd_printk("couldn't read PCI_CONF_FLSH_BAR of %s\n", |
diff --git a/drivers/scsi/aic94xx/aic94xx_seq.c b/drivers/scsi/aic94xx/aic94xx_seq.c index 56e4b3ba6a08..845112539d05 100644 --- a/drivers/scsi/aic94xx/aic94xx_seq.c +++ b/drivers/scsi/aic94xx/aic94xx_seq.c | |||
@@ -1369,10 +1369,9 @@ int asd_start_seqs(struct asd_ha_struct *asd_ha) | |||
1369 | * port_map_by_links is also used as the conn_mask byte in the | 1369 | * port_map_by_links is also used as the conn_mask byte in the |
1370 | * initiator/target port DDB. | 1370 | * initiator/target port DDB. |
1371 | */ | 1371 | */ |
1372 | void asd_update_port_links(struct asd_sas_phy *sas_phy) | 1372 | void asd_update_port_links(struct asd_ha_struct *asd_ha, struct asd_phy *phy) |
1373 | { | 1373 | { |
1374 | struct asd_ha_struct *asd_ha = sas_phy->ha->lldd_ha; | 1374 | const u8 phy_mask = (u8) phy->asd_port->phy_mask; |
1375 | const u8 phy_mask = (u8) sas_phy->port->phy_mask; | ||
1376 | u8 phy_is_up; | 1375 | u8 phy_is_up; |
1377 | u8 mask; | 1376 | u8 mask; |
1378 | int i, err; | 1377 | int i, err; |
diff --git a/drivers/scsi/aic94xx/aic94xx_seq.h b/drivers/scsi/aic94xx/aic94xx_seq.h index 42281c36153b..9e715e5496af 100644 --- a/drivers/scsi/aic94xx/aic94xx_seq.h +++ b/drivers/scsi/aic94xx/aic94xx_seq.h | |||
@@ -64,7 +64,7 @@ int asd_unpause_lseq(struct asd_ha_struct *asd_ha, u8 lseq_mask); | |||
64 | int asd_init_seqs(struct asd_ha_struct *asd_ha); | 64 | int asd_init_seqs(struct asd_ha_struct *asd_ha); |
65 | int asd_start_seqs(struct asd_ha_struct *asd_ha); | 65 | int asd_start_seqs(struct asd_ha_struct *asd_ha); |
66 | 66 | ||
67 | void asd_update_port_links(struct asd_sas_phy *phy); | 67 | void asd_update_port_links(struct asd_ha_struct *asd_ha, struct asd_phy *phy); |
68 | #endif | 68 | #endif |
69 | 69 | ||
70 | #endif | 70 | #endif |
diff --git a/drivers/scsi/dpt/dpti_i2o.h b/drivers/scsi/dpt/dpti_i2o.h index b3fa7ed71faf..5a49216fe4cf 100644 --- a/drivers/scsi/dpt/dpti_i2o.h +++ b/drivers/scsi/dpt/dpti_i2o.h | |||
@@ -49,7 +49,7 @@ | |||
49 | 49 | ||
50 | #include <linux/wait.h> | 50 | #include <linux/wait.h> |
51 | typedef wait_queue_head_t adpt_wait_queue_head_t; | 51 | typedef wait_queue_head_t adpt_wait_queue_head_t; |
52 | #define ADPT_DECLARE_WAIT_QUEUE_HEAD(wait) DECLARE_WAIT_QUEUE_HEAD(wait) | 52 | #define ADPT_DECLARE_WAIT_QUEUE_HEAD(wait) DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wait) |
53 | typedef wait_queue_t adpt_wait_queue_t; | 53 | typedef wait_queue_t adpt_wait_queue_t; |
54 | 54 | ||
55 | /* | 55 | /* |
diff --git a/drivers/scsi/fdomain.c b/drivers/scsi/fdomain.c index 65e6e7b7ba07..5d4ea6f77953 100644 --- a/drivers/scsi/fdomain.c +++ b/drivers/scsi/fdomain.c | |||
@@ -387,6 +387,7 @@ static void __iomem * bios_mem; | |||
387 | static int bios_major; | 387 | static int bios_major; |
388 | static int bios_minor; | 388 | static int bios_minor; |
389 | static int PCI_bus; | 389 | static int PCI_bus; |
390 | static struct pci_dev *PCI_dev; | ||
390 | static int Quantum; /* Quantum board variant */ | 391 | static int Quantum; /* Quantum board variant */ |
391 | static int interrupt_level; | 392 | static int interrupt_level; |
392 | static volatile int in_command; | 393 | static volatile int in_command; |
@@ -812,9 +813,10 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_ | |||
812 | PCI_DEVICE_ID_FD_36C70 ); | 813 | PCI_DEVICE_ID_FD_36C70 ); |
813 | #endif | 814 | #endif |
814 | 815 | ||
815 | if ((pdev = pci_find_device(PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70, pdev)) == NULL) | 816 | if ((pdev = pci_get_device(PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70, pdev)) == NULL) |
816 | return 0; | 817 | return 0; |
817 | if (pci_enable_device(pdev)) return 0; | 818 | if (pci_enable_device(pdev)) |
819 | goto fail; | ||
818 | 820 | ||
819 | #if DEBUG_DETECT | 821 | #if DEBUG_DETECT |
820 | printk( "scsi: <fdomain> TMC-3260 detect:" | 822 | printk( "scsi: <fdomain> TMC-3260 detect:" |
@@ -831,7 +833,7 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_ | |||
831 | pci_irq = pdev->irq; | 833 | pci_irq = pdev->irq; |
832 | 834 | ||
833 | if (!request_region( pci_base, 0x10, "fdomain" )) | 835 | if (!request_region( pci_base, 0x10, "fdomain" )) |
834 | return 0; | 836 | goto fail; |
835 | 837 | ||
836 | /* Now we have the I/O base address and interrupt from the PCI | 838 | /* Now we have the I/O base address and interrupt from the PCI |
837 | configuration registers. */ | 839 | configuration registers. */ |
@@ -848,17 +850,22 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_ | |||
848 | if (!fdomain_is_valid_port(pci_base)) { | 850 | if (!fdomain_is_valid_port(pci_base)) { |
849 | printk(KERN_ERR "scsi: <fdomain> PCI card detected, but driver not loaded (invalid port)\n" ); | 851 | printk(KERN_ERR "scsi: <fdomain> PCI card detected, but driver not loaded (invalid port)\n" ); |
850 | release_region(pci_base, 0x10); | 852 | release_region(pci_base, 0x10); |
851 | return 0; | 853 | goto fail; |
852 | } | 854 | } |
853 | 855 | ||
854 | /* Fill in a few global variables. Ugh. */ | 856 | /* Fill in a few global variables. Ugh. */ |
855 | bios_major = bios_minor = -1; | 857 | bios_major = bios_minor = -1; |
856 | PCI_bus = 1; | 858 | PCI_bus = 1; |
859 | PCI_dev = pdev; | ||
857 | Quantum = 0; | 860 | Quantum = 0; |
858 | bios_base = 0; | 861 | bios_base = 0; |
859 | 862 | ||
860 | return 1; | 863 | return 1; |
864 | fail: | ||
865 | pci_dev_put(pdev); | ||
866 | return 0; | ||
861 | } | 867 | } |
868 | |||
862 | #endif | 869 | #endif |
863 | 870 | ||
864 | struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) | 871 | struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) |
@@ -909,8 +916,7 @@ struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) | |||
909 | if (setup_called) { | 916 | if (setup_called) { |
910 | printk(KERN_ERR "scsi: <fdomain> Bad LILO/INSMOD parameters?\n"); | 917 | printk(KERN_ERR "scsi: <fdomain> Bad LILO/INSMOD parameters?\n"); |
911 | } | 918 | } |
912 | release_region(port_base, 0x10); | 919 | goto fail; |
913 | return NULL; | ||
914 | } | 920 | } |
915 | 921 | ||
916 | if (this_id) { | 922 | if (this_id) { |
@@ -942,8 +948,7 @@ struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) | |||
942 | /* Log IRQ with kernel */ | 948 | /* Log IRQ with kernel */ |
943 | if (!interrupt_level) { | 949 | if (!interrupt_level) { |
944 | printk(KERN_ERR "scsi: <fdomain> Card Detected, but driver not loaded (no IRQ)\n" ); | 950 | printk(KERN_ERR "scsi: <fdomain> Card Detected, but driver not loaded (no IRQ)\n" ); |
945 | release_region(port_base, 0x10); | 951 | goto fail; |
946 | return NULL; | ||
947 | } else { | 952 | } else { |
948 | /* Register the IRQ with the kernel */ | 953 | /* Register the IRQ with the kernel */ |
949 | 954 | ||
@@ -964,11 +969,14 @@ struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) | |||
964 | printk(KERN_ERR " Send mail to faith@acm.org\n" ); | 969 | printk(KERN_ERR " Send mail to faith@acm.org\n" ); |
965 | } | 970 | } |
966 | printk(KERN_ERR "scsi: <fdomain> Detected, but driver not loaded (IRQ)\n" ); | 971 | printk(KERN_ERR "scsi: <fdomain> Detected, but driver not loaded (IRQ)\n" ); |
967 | release_region(port_base, 0x10); | 972 | goto fail; |
968 | return NULL; | ||
969 | } | 973 | } |
970 | } | 974 | } |
971 | return shpnt; | 975 | return shpnt; |
976 | fail: | ||
977 | pci_dev_put(pdev); | ||
978 | release_region(port_base, 0x10); | ||
979 | return NULL; | ||
972 | } | 980 | } |
973 | 981 | ||
974 | static int fdomain_16x0_detect(struct scsi_host_template *tpnt) | 982 | static int fdomain_16x0_detect(struct scsi_host_template *tpnt) |
@@ -1714,6 +1722,8 @@ static int fdomain_16x0_release(struct Scsi_Host *shpnt) | |||
1714 | free_irq(shpnt->irq, shpnt); | 1722 | free_irq(shpnt->irq, shpnt); |
1715 | if (shpnt->io_port && shpnt->n_io_port) | 1723 | if (shpnt->io_port && shpnt->n_io_port) |
1716 | release_region(shpnt->io_port, shpnt->n_io_port); | 1724 | release_region(shpnt->io_port, shpnt->n_io_port); |
1725 | if (PCI_bus) | ||
1726 | pci_dev_put(PCI_dev); | ||
1717 | return 0; | 1727 | return 0; |
1718 | } | 1728 | } |
1719 | 1729 | ||
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 4bc14ad92e22..4c698a71f66f 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c | |||
@@ -3531,7 +3531,7 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id) | |||
3531 | IStatus &= ~0x80; | 3531 | IStatus &= ~0x80; |
3532 | #ifdef INT_COAL | 3532 | #ifdef INT_COAL |
3533 | if (coalesced) | 3533 | if (coalesced) |
3534 | ha->status = pcs->ext_status && 0xffff; | 3534 | ha->status = pcs->ext_status & 0xffff; |
3535 | else | 3535 | else |
3536 | #endif | 3536 | #endif |
3537 | ha->status = gdth_readw(&dp6m_ptr->i960r.status); | 3537 | ha->status = gdth_readw(&dp6m_ptr->i960r.status); |
@@ -3543,7 +3543,7 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id) | |||
3543 | if (coalesced) { | 3543 | if (coalesced) { |
3544 | ha->info = pcs->info0; | 3544 | ha->info = pcs->info0; |
3545 | ha->info2 = pcs->info1; | 3545 | ha->info2 = pcs->info1; |
3546 | ha->service = (pcs->ext_status >> 16) && 0xffff; | 3546 | ha->service = (pcs->ext_status >> 16) & 0xffff; |
3547 | } else | 3547 | } else |
3548 | #endif | 3548 | #endif |
3549 | { | 3549 | { |
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c index 669ea4fff166..fbc1d5c3b0a7 100644 --- a/drivers/scsi/ibmvscsi/ibmvscsi.c +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c | |||
@@ -1213,7 +1213,7 @@ void ibmvscsi_handle_crq(struct viosrp_crq *crq, | |||
1213 | "ibmvscsi: Re-enabling adapter!\n"); | 1213 | "ibmvscsi: Re-enabling adapter!\n"); |
1214 | purge_requests(hostdata, DID_REQUEUE); | 1214 | purge_requests(hostdata, DID_REQUEUE); |
1215 | if ((ibmvscsi_reenable_crq_queue(&hostdata->queue, | 1215 | if ((ibmvscsi_reenable_crq_queue(&hostdata->queue, |
1216 | hostdata) == 0) || | 1216 | hostdata)) || |
1217 | (ibmvscsi_send_crq(hostdata, | 1217 | (ibmvscsi_send_crq(hostdata, |
1218 | 0xC001000000000000LL, 0))) { | 1218 | 0xC001000000000000LL, 0))) { |
1219 | atomic_set(&hostdata->request_limit, | 1219 | atomic_set(&hostdata->request_limit, |
diff --git a/drivers/scsi/imm.c b/drivers/scsi/imm.c index 2d95ac9c32c1..e31f6122106f 100644 --- a/drivers/scsi/imm.c +++ b/drivers/scsi/imm.c | |||
@@ -1153,7 +1153,7 @@ static int __imm_attach(struct parport *pb) | |||
1153 | { | 1153 | { |
1154 | struct Scsi_Host *host; | 1154 | struct Scsi_Host *host; |
1155 | imm_struct *dev; | 1155 | imm_struct *dev; |
1156 | DECLARE_WAIT_QUEUE_HEAD(waiting); | 1156 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(waiting); |
1157 | DEFINE_WAIT(wait); | 1157 | DEFINE_WAIT(wait); |
1158 | int ports; | 1158 | int ports; |
1159 | int modes, ppb; | 1159 | int modes, ppb; |
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 0a9dbc59663f..d0b139cccbbc 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c | |||
@@ -415,8 +415,8 @@ iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) | |||
415 | iscsi_solicit_data_init(conn, ctask, r2t); | 415 | iscsi_solicit_data_init(conn, ctask, r2t); |
416 | 416 | ||
417 | tcp_ctask->exp_r2tsn = r2tsn + 1; | 417 | tcp_ctask->exp_r2tsn = r2tsn + 1; |
418 | tcp_ctask->xmstate |= XMSTATE_SOL_HDR; | ||
419 | __kfifo_put(tcp_ctask->r2tqueue, (void*)&r2t, sizeof(void*)); | 418 | __kfifo_put(tcp_ctask->r2tqueue, (void*)&r2t, sizeof(void*)); |
419 | tcp_ctask->xmstate |= XMSTATE_SOL_HDR; | ||
420 | list_move_tail(&ctask->running, &conn->xmitqueue); | 420 | list_move_tail(&ctask->running, &conn->xmitqueue); |
421 | 421 | ||
422 | scsi_queue_work(session->host, &conn->xmitwork); | 422 | scsi_queue_work(session->host, &conn->xmitwork); |
@@ -1627,9 +1627,12 @@ static int iscsi_send_sol_pdu(struct iscsi_conn *conn, | |||
1627 | if (tcp_ctask->xmstate & XMSTATE_SOL_HDR) { | 1627 | if (tcp_ctask->xmstate & XMSTATE_SOL_HDR) { |
1628 | tcp_ctask->xmstate &= ~XMSTATE_SOL_HDR; | 1628 | tcp_ctask->xmstate &= ~XMSTATE_SOL_HDR; |
1629 | tcp_ctask->xmstate |= XMSTATE_SOL_DATA; | 1629 | tcp_ctask->xmstate |= XMSTATE_SOL_DATA; |
1630 | if (!tcp_ctask->r2t) | 1630 | if (!tcp_ctask->r2t) { |
1631 | spin_lock_bh(&session->lock); | ||
1631 | __kfifo_get(tcp_ctask->r2tqueue, (void*)&tcp_ctask->r2t, | 1632 | __kfifo_get(tcp_ctask->r2tqueue, (void*)&tcp_ctask->r2t, |
1632 | sizeof(void*)); | 1633 | sizeof(void*)); |
1634 | spin_unlock_bh(&session->lock); | ||
1635 | } | ||
1633 | send_hdr: | 1636 | send_hdr: |
1634 | r2t = tcp_ctask->r2t; | 1637 | r2t = tcp_ctask->r2t; |
1635 | dtask = &r2t->dtask; | 1638 | dtask = &r2t->dtask; |
@@ -1816,21 +1819,14 @@ iscsi_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn) | |||
1816 | { | 1819 | { |
1817 | struct iscsi_conn *conn = cls_conn->dd_data; | 1820 | struct iscsi_conn *conn = cls_conn->dd_data; |
1818 | struct iscsi_tcp_conn *tcp_conn = conn->dd_data; | 1821 | struct iscsi_tcp_conn *tcp_conn = conn->dd_data; |
1819 | int digest = 0; | ||
1820 | |||
1821 | if (conn->hdrdgst_en || conn->datadgst_en) | ||
1822 | digest = 1; | ||
1823 | 1822 | ||
1824 | iscsi_tcp_release_conn(conn); | 1823 | iscsi_tcp_release_conn(conn); |
1825 | iscsi_conn_teardown(cls_conn); | 1824 | iscsi_conn_teardown(cls_conn); |
1826 | 1825 | ||
1827 | /* now free tcp_conn */ | 1826 | if (tcp_conn->tx_hash.tfm) |
1828 | if (digest) { | 1827 | crypto_free_hash(tcp_conn->tx_hash.tfm); |
1829 | if (tcp_conn->tx_hash.tfm) | 1828 | if (tcp_conn->rx_hash.tfm) |
1830 | crypto_free_hash(tcp_conn->tx_hash.tfm); | 1829 | crypto_free_hash(tcp_conn->rx_hash.tfm); |
1831 | if (tcp_conn->rx_hash.tfm) | ||
1832 | crypto_free_hash(tcp_conn->rx_hash.tfm); | ||
1833 | } | ||
1834 | 1830 | ||
1835 | kfree(tcp_conn); | 1831 | kfree(tcp_conn); |
1836 | } | 1832 | } |
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index c542d0e95e68..5d8862189485 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c | |||
@@ -481,8 +481,8 @@ int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, | |||
481 | break; | 481 | break; |
482 | case ISCSI_OP_ASYNC_EVENT: | 482 | case ISCSI_OP_ASYNC_EVENT: |
483 | conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; | 483 | conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; |
484 | /* we need sth like iscsi_async_event_rsp() */ | 484 | if (iscsi_recv_pdu(conn->cls_conn, hdr, data, datalen)) |
485 | rc = ISCSI_ERR_BAD_OPCODE; | 485 | rc = ISCSI_ERR_CONN_FAILED; |
486 | break; | 486 | break; |
487 | default: | 487 | default: |
488 | rc = ISCSI_ERR_BAD_OPCODE; | 488 | rc = ISCSI_ERR_BAD_OPCODE; |
@@ -578,6 +578,27 @@ void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err) | |||
578 | } | 578 | } |
579 | EXPORT_SYMBOL_GPL(iscsi_conn_failure); | 579 | EXPORT_SYMBOL_GPL(iscsi_conn_failure); |
580 | 580 | ||
581 | static int iscsi_xmit_imm_task(struct iscsi_conn *conn) | ||
582 | { | ||
583 | struct iscsi_hdr *hdr = conn->mtask->hdr; | ||
584 | int rc, was_logout = 0; | ||
585 | |||
586 | if ((hdr->opcode & ISCSI_OPCODE_MASK) == ISCSI_OP_LOGOUT) { | ||
587 | conn->session->state = ISCSI_STATE_IN_RECOVERY; | ||
588 | iscsi_block_session(session_to_cls(conn->session)); | ||
589 | was_logout = 1; | ||
590 | } | ||
591 | rc = conn->session->tt->xmit_mgmt_task(conn, conn->mtask); | ||
592 | if (rc) | ||
593 | return rc; | ||
594 | |||
595 | if (was_logout) { | ||
596 | set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); | ||
597 | return -ENODATA; | ||
598 | } | ||
599 | return 0; | ||
600 | } | ||
601 | |||
581 | /** | 602 | /** |
582 | * iscsi_data_xmit - xmit any command into the scheduled connection | 603 | * iscsi_data_xmit - xmit any command into the scheduled connection |
583 | * @conn: iscsi connection | 604 | * @conn: iscsi connection |
@@ -623,7 +644,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn) | |||
623 | conn->ctask = NULL; | 644 | conn->ctask = NULL; |
624 | } | 645 | } |
625 | if (conn->mtask) { | 646 | if (conn->mtask) { |
626 | rc = tt->xmit_mgmt_task(conn, conn->mtask); | 647 | rc = iscsi_xmit_imm_task(conn); |
627 | if (rc) | 648 | if (rc) |
628 | goto again; | 649 | goto again; |
629 | /* done with this in-progress mtask */ | 650 | /* done with this in-progress mtask */ |
@@ -638,7 +659,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn) | |||
638 | list_add_tail(&conn->mtask->running, | 659 | list_add_tail(&conn->mtask->running, |
639 | &conn->mgmt_run_list); | 660 | &conn->mgmt_run_list); |
640 | spin_unlock_bh(&conn->session->lock); | 661 | spin_unlock_bh(&conn->session->lock); |
641 | rc = tt->xmit_mgmt_task(conn, conn->mtask); | 662 | rc = iscsi_xmit_imm_task(conn); |
642 | if (rc) | 663 | if (rc) |
643 | goto again; | 664 | goto again; |
644 | } | 665 | } |
@@ -661,8 +682,6 @@ static int iscsi_data_xmit(struct iscsi_conn *conn) | |||
661 | spin_unlock_bh(&conn->session->lock); | 682 | spin_unlock_bh(&conn->session->lock); |
662 | 683 | ||
663 | rc = tt->xmit_cmd_task(conn, conn->ctask); | 684 | rc = tt->xmit_cmd_task(conn, conn->ctask); |
664 | if (rc) | ||
665 | goto again; | ||
666 | 685 | ||
667 | spin_lock_bh(&conn->session->lock); | 686 | spin_lock_bh(&conn->session->lock); |
668 | __iscsi_put_ctask(conn->ctask); | 687 | __iscsi_put_ctask(conn->ctask); |
@@ -778,6 +797,10 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)) | |||
778 | } | 797 | } |
779 | 798 | ||
780 | conn = session->leadconn; | 799 | conn = session->leadconn; |
800 | if (!conn) { | ||
801 | reason = FAILURE_SESSION_FREED; | ||
802 | goto fault; | ||
803 | } | ||
781 | 804 | ||
782 | if (!__kfifo_get(session->cmdpool.queue, (void*)&ctask, | 805 | if (!__kfifo_get(session->cmdpool.queue, (void*)&ctask, |
783 | sizeof(void*))) { | 806 | sizeof(void*))) { |
@@ -952,13 +975,13 @@ int iscsi_eh_host_reset(struct scsi_cmnd *sc) | |||
952 | if (session->state == ISCSI_STATE_TERMINATE) { | 975 | if (session->state == ISCSI_STATE_TERMINATE) { |
953 | failed: | 976 | failed: |
954 | debug_scsi("failing host reset: session terminated " | 977 | debug_scsi("failing host reset: session terminated " |
955 | "[CID %d age %d]", conn->id, session->age); | 978 | "[CID %d age %d]\n", conn->id, session->age); |
956 | spin_unlock_bh(&session->lock); | 979 | spin_unlock_bh(&session->lock); |
957 | return FAILED; | 980 | return FAILED; |
958 | } | 981 | } |
959 | 982 | ||
960 | if (sc->SCp.phase == session->age) { | 983 | if (sc->SCp.phase == session->age) { |
961 | debug_scsi("failing connection CID %d due to SCSI host reset", | 984 | debug_scsi("failing connection CID %d due to SCSI host reset\n", |
962 | conn->id); | 985 | conn->id); |
963 | fail_session = 1; | 986 | fail_session = 1; |
964 | } | 987 | } |
@@ -1031,7 +1054,8 @@ static int iscsi_exec_abort_task(struct scsi_cmnd *sc, | |||
1031 | NULL, 0); | 1054 | NULL, 0); |
1032 | if (rc) { | 1055 | if (rc) { |
1033 | iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); | 1056 | iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); |
1034 | debug_scsi("abort sent failure [itt 0x%x] %d", ctask->itt, rc); | 1057 | debug_scsi("abort sent failure [itt 0x%x] %d\n", ctask->itt, |
1058 | rc); | ||
1035 | return rc; | 1059 | return rc; |
1036 | } | 1060 | } |
1037 | 1061 | ||
@@ -1048,7 +1072,7 @@ static int iscsi_exec_abort_task(struct scsi_cmnd *sc, | |||
1048 | conn->tmabort_timer.function = iscsi_tmabort_timedout; | 1072 | conn->tmabort_timer.function = iscsi_tmabort_timedout; |
1049 | conn->tmabort_timer.data = (unsigned long)ctask; | 1073 | conn->tmabort_timer.data = (unsigned long)ctask; |
1050 | add_timer(&conn->tmabort_timer); | 1074 | add_timer(&conn->tmabort_timer); |
1051 | debug_scsi("abort set timeout [itt 0x%x]", ctask->itt); | 1075 | debug_scsi("abort set timeout [itt 0x%x]\n", ctask->itt); |
1052 | } | 1076 | } |
1053 | spin_unlock_bh(&session->lock); | 1077 | spin_unlock_bh(&session->lock); |
1054 | mutex_unlock(&conn->xmitmutex); | 1078 | mutex_unlock(&conn->xmitmutex); |
@@ -1377,7 +1401,6 @@ iscsi_session_setup(struct iscsi_transport *iscsit, | |||
1377 | } | 1401 | } |
1378 | 1402 | ||
1379 | spin_lock_init(&session->lock); | 1403 | spin_lock_init(&session->lock); |
1380 | INIT_LIST_HEAD(&session->connections); | ||
1381 | 1404 | ||
1382 | /* initialize immediate command pool */ | 1405 | /* initialize immediate command pool */ |
1383 | if (iscsi_pool_init(&session->mgmtpool, session->mgmtpool_max, | 1406 | if (iscsi_pool_init(&session->mgmtpool, session->mgmtpool_max, |
@@ -1580,16 +1603,11 @@ void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn) | |||
1580 | kfree(conn->persistent_address); | 1603 | kfree(conn->persistent_address); |
1581 | __kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask, | 1604 | __kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask, |
1582 | sizeof(void*)); | 1605 | sizeof(void*)); |
1583 | list_del(&conn->item); | 1606 | if (session->leadconn == conn) { |
1584 | if (list_empty(&session->connections)) | ||
1585 | session->leadconn = NULL; | 1607 | session->leadconn = NULL; |
1586 | if (session->leadconn && session->leadconn == conn) | ||
1587 | session->leadconn = container_of(session->connections.next, | ||
1588 | struct iscsi_conn, item); | ||
1589 | |||
1590 | if (session->leadconn == NULL) | ||
1591 | /* no connections exits.. reset sequencing */ | 1608 | /* no connections exits.. reset sequencing */ |
1592 | session->cmdsn = session->max_cmdsn = session->exp_cmdsn = 1; | 1609 | session->cmdsn = session->max_cmdsn = session->exp_cmdsn = 1; |
1610 | } | ||
1593 | spin_unlock_bh(&session->lock); | 1611 | spin_unlock_bh(&session->lock); |
1594 | 1612 | ||
1595 | kfifo_free(conn->immqueue); | 1613 | kfifo_free(conn->immqueue); |
@@ -1777,32 +1795,12 @@ int iscsi_conn_bind(struct iscsi_cls_session *cls_session, | |||
1777 | struct iscsi_cls_conn *cls_conn, int is_leading) | 1795 | struct iscsi_cls_conn *cls_conn, int is_leading) |
1778 | { | 1796 | { |
1779 | struct iscsi_session *session = class_to_transport_session(cls_session); | 1797 | struct iscsi_session *session = class_to_transport_session(cls_session); |
1780 | struct iscsi_conn *tmp = ERR_PTR(-EEXIST), *conn = cls_conn->dd_data; | 1798 | struct iscsi_conn *conn = cls_conn->dd_data; |
1781 | 1799 | ||
1782 | /* lookup for existing connection */ | ||
1783 | spin_lock_bh(&session->lock); | 1800 | spin_lock_bh(&session->lock); |
1784 | list_for_each_entry(tmp, &session->connections, item) { | ||
1785 | if (tmp == conn) { | ||
1786 | if (conn->c_stage != ISCSI_CONN_STOPPED || | ||
1787 | conn->stop_stage == STOP_CONN_TERM) { | ||
1788 | printk(KERN_ERR "iscsi: can't bind " | ||
1789 | "non-stopped connection (%d:%d)\n", | ||
1790 | conn->c_stage, conn->stop_stage); | ||
1791 | spin_unlock_bh(&session->lock); | ||
1792 | return -EIO; | ||
1793 | } | ||
1794 | break; | ||
1795 | } | ||
1796 | } | ||
1797 | if (tmp != conn) { | ||
1798 | /* bind new iSCSI connection to session */ | ||
1799 | conn->session = session; | ||
1800 | list_add(&conn->item, &session->connections); | ||
1801 | } | ||
1802 | spin_unlock_bh(&session->lock); | ||
1803 | |||
1804 | if (is_leading) | 1801 | if (is_leading) |
1805 | session->leadconn = conn; | 1802 | session->leadconn = conn; |
1803 | spin_unlock_bh(&session->lock); | ||
1806 | 1804 | ||
1807 | /* | 1805 | /* |
1808 | * Unblock xmitworker(), Login Phase will pass through. | 1806 | * Unblock xmitworker(), Login Phase will pass through. |
diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c index 30b8014bcc7a..e34a93435497 100644 --- a/drivers/scsi/libsas/sas_expander.c +++ b/drivers/scsi/libsas/sas_expander.c | |||
@@ -71,55 +71,65 @@ static void smp_task_done(struct sas_task *task) | |||
71 | static int smp_execute_task(struct domain_device *dev, void *req, int req_size, | 71 | static int smp_execute_task(struct domain_device *dev, void *req, int req_size, |
72 | void *resp, int resp_size) | 72 | void *resp, int resp_size) |
73 | { | 73 | { |
74 | int res; | 74 | int res, retry; |
75 | struct sas_task *task = sas_alloc_task(GFP_KERNEL); | 75 | struct sas_task *task = NULL; |
76 | struct sas_internal *i = | 76 | struct sas_internal *i = |
77 | to_sas_internal(dev->port->ha->core.shost->transportt); | 77 | to_sas_internal(dev->port->ha->core.shost->transportt); |
78 | 78 | ||
79 | if (!task) | 79 | for (retry = 0; retry < 3; retry++) { |
80 | return -ENOMEM; | 80 | task = sas_alloc_task(GFP_KERNEL); |
81 | 81 | if (!task) | |
82 | task->dev = dev; | 82 | return -ENOMEM; |
83 | task->task_proto = dev->tproto; | ||
84 | sg_init_one(&task->smp_task.smp_req, req, req_size); | ||
85 | sg_init_one(&task->smp_task.smp_resp, resp, resp_size); | ||
86 | 83 | ||
87 | task->task_done = smp_task_done; | 84 | task->dev = dev; |
85 | task->task_proto = dev->tproto; | ||
86 | sg_init_one(&task->smp_task.smp_req, req, req_size); | ||
87 | sg_init_one(&task->smp_task.smp_resp, resp, resp_size); | ||
88 | 88 | ||
89 | task->timer.data = (unsigned long) task; | 89 | task->task_done = smp_task_done; |
90 | task->timer.function = smp_task_timedout; | ||
91 | task->timer.expires = jiffies + SMP_TIMEOUT*HZ; | ||
92 | add_timer(&task->timer); | ||
93 | 90 | ||
94 | res = i->dft->lldd_execute_task(task, 1, GFP_KERNEL); | 91 | task->timer.data = (unsigned long) task; |
92 | task->timer.function = smp_task_timedout; | ||
93 | task->timer.expires = jiffies + SMP_TIMEOUT*HZ; | ||
94 | add_timer(&task->timer); | ||
95 | 95 | ||
96 | if (res) { | 96 | res = i->dft->lldd_execute_task(task, 1, GFP_KERNEL); |
97 | del_timer(&task->timer); | ||
98 | SAS_DPRINTK("executing SMP task failed:%d\n", res); | ||
99 | goto ex_err; | ||
100 | } | ||
101 | 97 | ||
102 | wait_for_completion(&task->completion); | 98 | if (res) { |
103 | res = -ETASK; | 99 | del_timer(&task->timer); |
104 | if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { | 100 | SAS_DPRINTK("executing SMP task failed:%d\n", res); |
105 | SAS_DPRINTK("smp task timed out or aborted\n"); | ||
106 | i->dft->lldd_abort_task(task); | ||
107 | if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { | ||
108 | SAS_DPRINTK("SMP task aborted and not done\n"); | ||
109 | goto ex_err; | 101 | goto ex_err; |
110 | } | 102 | } |
103 | |||
104 | wait_for_completion(&task->completion); | ||
105 | res = -ETASK; | ||
106 | if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { | ||
107 | SAS_DPRINTK("smp task timed out or aborted\n"); | ||
108 | i->dft->lldd_abort_task(task); | ||
109 | if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { | ||
110 | SAS_DPRINTK("SMP task aborted and not done\n"); | ||
111 | goto ex_err; | ||
112 | } | ||
113 | } | ||
114 | if (task->task_status.resp == SAS_TASK_COMPLETE && | ||
115 | task->task_status.stat == SAM_GOOD) { | ||
116 | res = 0; | ||
117 | break; | ||
118 | } else { | ||
119 | SAS_DPRINTK("%s: task to dev %016llx response: 0x%x " | ||
120 | "status 0x%x\n", __FUNCTION__, | ||
121 | SAS_ADDR(dev->sas_addr), | ||
122 | task->task_status.resp, | ||
123 | task->task_status.stat); | ||
124 | sas_free_task(task); | ||
125 | task = NULL; | ||
126 | } | ||
111 | } | 127 | } |
112 | if (task->task_status.resp == SAS_TASK_COMPLETE && | ||
113 | task->task_status.stat == SAM_GOOD) | ||
114 | res = 0; | ||
115 | else | ||
116 | SAS_DPRINTK("%s: task to dev %016llx response: 0x%x " | ||
117 | "status 0x%x\n", __FUNCTION__, | ||
118 | SAS_ADDR(dev->sas_addr), | ||
119 | task->task_status.resp, | ||
120 | task->task_status.stat); | ||
121 | ex_err: | 128 | ex_err: |
122 | sas_free_task(task); | 129 | BUG_ON(retry == 3 && task != NULL); |
130 | if (task != NULL) { | ||
131 | sas_free_task(task); | ||
132 | } | ||
123 | return res; | 133 | return res; |
124 | } | 134 | } |
125 | 135 | ||
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index 9496e87c135e..2a4e02e7a392 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c | |||
@@ -594,7 +594,8 @@ lpfc_soft_wwpn_show(struct class_device *cdev, char *buf) | |||
594 | { | 594 | { |
595 | struct Scsi_Host *host = class_to_shost(cdev); | 595 | struct Scsi_Host *host = class_to_shost(cdev); |
596 | struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; | 596 | struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; |
597 | return snprintf(buf, PAGE_SIZE, "0x%llx\n", phba->cfg_soft_wwpn); | 597 | return snprintf(buf, PAGE_SIZE, "0x%llx\n", |
598 | (unsigned long long)phba->cfg_soft_wwpn); | ||
598 | } | 599 | } |
599 | 600 | ||
600 | 601 | ||
diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c index 1b53afb1cb57..3add7c237859 100644 --- a/drivers/scsi/lpfc/lpfc_ct.c +++ b/drivers/scsi/lpfc/lpfc_ct.c | |||
@@ -188,7 +188,8 @@ lpfc_alloc_ct_rsp(struct lpfc_hba * phba, int cmdcode, struct ulp_bde64 * bpl, | |||
188 | 188 | ||
189 | if (!mp->virt) { | 189 | if (!mp->virt) { |
190 | kfree(mp); | 190 | kfree(mp); |
191 | lpfc_free_ct_rsp(phba, mlist); | 191 | if (mlist) |
192 | lpfc_free_ct_rsp(phba, mlist); | ||
192 | return NULL; | 193 | return NULL; |
193 | } | 194 | } |
194 | 195 | ||
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index d586c3d3b0d0..19c79a0549a7 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -305,7 +305,7 @@ lpfc_do_work(void *p) | |||
305 | { | 305 | { |
306 | struct lpfc_hba *phba = p; | 306 | struct lpfc_hba *phba = p; |
307 | int rc; | 307 | int rc; |
308 | DECLARE_WAIT_QUEUE_HEAD(work_waitq); | 308 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(work_waitq); |
309 | 309 | ||
310 | set_user_nice(current, -20); | 310 | set_user_nice(current, -20); |
311 | phba->work_wait = &work_waitq; | 311 | phba->work_wait = &work_waitq; |
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 24a1779b9af4..582f5ea4e84e 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -2983,7 +2983,7 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba * phba, | |||
2983 | struct lpfc_iocbq * prspiocbq, | 2983 | struct lpfc_iocbq * prspiocbq, |
2984 | uint32_t timeout) | 2984 | uint32_t timeout) |
2985 | { | 2985 | { |
2986 | DECLARE_WAIT_QUEUE_HEAD(done_q); | 2986 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(done_q); |
2987 | long timeleft, timeout_req = 0; | 2987 | long timeleft, timeout_req = 0; |
2988 | int retval = IOCB_SUCCESS; | 2988 | int retval = IOCB_SUCCESS; |
2989 | uint32_t creg_val; | 2989 | uint32_t creg_val; |
@@ -3061,7 +3061,7 @@ int | |||
3061 | lpfc_sli_issue_mbox_wait(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq, | 3061 | lpfc_sli_issue_mbox_wait(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq, |
3062 | uint32_t timeout) | 3062 | uint32_t timeout) |
3063 | { | 3063 | { |
3064 | DECLARE_WAIT_QUEUE_HEAD(done_q); | 3064 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(done_q); |
3065 | DECLARE_WAITQUEUE(wq_entry, current); | 3065 | DECLARE_WAITQUEUE(wq_entry, current); |
3066 | uint32_t timeleft = 0; | 3066 | uint32_t timeleft = 0; |
3067 | int retval; | 3067 | int retval; |
diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index b1d346049525..f2d79c3f0b8e 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c | |||
@@ -183,7 +183,7 @@ static void nsp_cs_dmessage(const char *func, int line, int mask, char *fmt, ... | |||
183 | * Clenaup parameters and call done() functions. | 183 | * Clenaup parameters and call done() functions. |
184 | * You must be set SCpnt->result before call this function. | 184 | * You must be set SCpnt->result before call this function. |
185 | */ | 185 | */ |
186 | static void nsp_scsi_done(Scsi_Cmnd *SCpnt) | 186 | static void nsp_scsi_done(struct scsi_cmnd *SCpnt) |
187 | { | 187 | { |
188 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 188 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
189 | 189 | ||
@@ -192,7 +192,8 @@ static void nsp_scsi_done(Scsi_Cmnd *SCpnt) | |||
192 | SCpnt->scsi_done(SCpnt); | 192 | SCpnt->scsi_done(SCpnt); |
193 | } | 193 | } |
194 | 194 | ||
195 | static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) | 195 | static int nsp_queuecommand(struct scsi_cmnd *SCpnt, |
196 | void (*done)(struct scsi_cmnd *)) | ||
196 | { | 197 | { |
197 | #ifdef NSP_DEBUG | 198 | #ifdef NSP_DEBUG |
198 | /*unsigned int host_id = SCpnt->device->host->this_id;*/ | 199 | /*unsigned int host_id = SCpnt->device->host->this_id;*/ |
@@ -365,7 +366,7 @@ static int nsphw_init(nsp_hw_data *data) | |||
365 | /* | 366 | /* |
366 | * Start selection phase | 367 | * Start selection phase |
367 | */ | 368 | */ |
368 | static int nsphw_start_selection(Scsi_Cmnd *SCpnt) | 369 | static int nsphw_start_selection(struct scsi_cmnd *SCpnt) |
369 | { | 370 | { |
370 | unsigned int host_id = SCpnt->device->host->this_id; | 371 | unsigned int host_id = SCpnt->device->host->this_id; |
371 | unsigned int base = SCpnt->device->host->io_port; | 372 | unsigned int base = SCpnt->device->host->io_port; |
@@ -446,7 +447,7 @@ static struct nsp_sync_table nsp_sync_table_20M[] = { | |||
446 | /* | 447 | /* |
447 | * setup synchronous data transfer mode | 448 | * setup synchronous data transfer mode |
448 | */ | 449 | */ |
449 | static int nsp_analyze_sdtr(Scsi_Cmnd *SCpnt) | 450 | static int nsp_analyze_sdtr(struct scsi_cmnd *SCpnt) |
450 | { | 451 | { |
451 | unsigned char target = scmd_id(SCpnt); | 452 | unsigned char target = scmd_id(SCpnt); |
452 | // unsigned char lun = SCpnt->device->lun; | 453 | // unsigned char lun = SCpnt->device->lun; |
@@ -504,7 +505,7 @@ static int nsp_analyze_sdtr(Scsi_Cmnd *SCpnt) | |||
504 | /* | 505 | /* |
505 | * start ninja hardware timer | 506 | * start ninja hardware timer |
506 | */ | 507 | */ |
507 | static void nsp_start_timer(Scsi_Cmnd *SCpnt, int time) | 508 | static void nsp_start_timer(struct scsi_cmnd *SCpnt, int time) |
508 | { | 509 | { |
509 | unsigned int base = SCpnt->device->host->io_port; | 510 | unsigned int base = SCpnt->device->host->io_port; |
510 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 511 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
@@ -517,7 +518,8 @@ static void nsp_start_timer(Scsi_Cmnd *SCpnt, int time) | |||
517 | /* | 518 | /* |
518 | * wait for bus phase change | 519 | * wait for bus phase change |
519 | */ | 520 | */ |
520 | static int nsp_negate_signal(Scsi_Cmnd *SCpnt, unsigned char mask, char *str) | 521 | static int nsp_negate_signal(struct scsi_cmnd *SCpnt, unsigned char mask, |
522 | char *str) | ||
521 | { | 523 | { |
522 | unsigned int base = SCpnt->device->host->io_port; | 524 | unsigned int base = SCpnt->device->host->io_port; |
523 | unsigned char reg; | 525 | unsigned char reg; |
@@ -544,9 +546,9 @@ static int nsp_negate_signal(Scsi_Cmnd *SCpnt, unsigned char mask, char *str) | |||
544 | /* | 546 | /* |
545 | * expect Ninja Irq | 547 | * expect Ninja Irq |
546 | */ | 548 | */ |
547 | static int nsp_expect_signal(Scsi_Cmnd *SCpnt, | 549 | static int nsp_expect_signal(struct scsi_cmnd *SCpnt, |
548 | unsigned char current_phase, | 550 | unsigned char current_phase, |
549 | unsigned char mask) | 551 | unsigned char mask) |
550 | { | 552 | { |
551 | unsigned int base = SCpnt->device->host->io_port; | 553 | unsigned int base = SCpnt->device->host->io_port; |
552 | int time_out; | 554 | int time_out; |
@@ -579,7 +581,7 @@ static int nsp_expect_signal(Scsi_Cmnd *SCpnt, | |||
579 | /* | 581 | /* |
580 | * transfer SCSI message | 582 | * transfer SCSI message |
581 | */ | 583 | */ |
582 | static int nsp_xfer(Scsi_Cmnd *SCpnt, int phase) | 584 | static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase) |
583 | { | 585 | { |
584 | unsigned int base = SCpnt->device->host->io_port; | 586 | unsigned int base = SCpnt->device->host->io_port; |
585 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 587 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
@@ -619,7 +621,7 @@ static int nsp_xfer(Scsi_Cmnd *SCpnt, int phase) | |||
619 | /* | 621 | /* |
620 | * get extra SCSI data from fifo | 622 | * get extra SCSI data from fifo |
621 | */ | 623 | */ |
622 | static int nsp_dataphase_bypass(Scsi_Cmnd *SCpnt) | 624 | static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt) |
623 | { | 625 | { |
624 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 626 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
625 | unsigned int count; | 627 | unsigned int count; |
@@ -651,7 +653,7 @@ static int nsp_dataphase_bypass(Scsi_Cmnd *SCpnt) | |||
651 | /* | 653 | /* |
652 | * accept reselection | 654 | * accept reselection |
653 | */ | 655 | */ |
654 | static int nsp_reselected(Scsi_Cmnd *SCpnt) | 656 | static int nsp_reselected(struct scsi_cmnd *SCpnt) |
655 | { | 657 | { |
656 | unsigned int base = SCpnt->device->host->io_port; | 658 | unsigned int base = SCpnt->device->host->io_port; |
657 | unsigned int host_id = SCpnt->device->host->this_id; | 659 | unsigned int host_id = SCpnt->device->host->this_id; |
@@ -690,7 +692,7 @@ static int nsp_reselected(Scsi_Cmnd *SCpnt) | |||
690 | /* | 692 | /* |
691 | * count how many data transferd | 693 | * count how many data transferd |
692 | */ | 694 | */ |
693 | static int nsp_fifo_count(Scsi_Cmnd *SCpnt) | 695 | static int nsp_fifo_count(struct scsi_cmnd *SCpnt) |
694 | { | 696 | { |
695 | unsigned int base = SCpnt->device->host->io_port; | 697 | unsigned int base = SCpnt->device->host->io_port; |
696 | unsigned int count; | 698 | unsigned int count; |
@@ -717,7 +719,7 @@ static int nsp_fifo_count(Scsi_Cmnd *SCpnt) | |||
717 | /* | 719 | /* |
718 | * read data in DATA IN phase | 720 | * read data in DATA IN phase |
719 | */ | 721 | */ |
720 | static void nsp_pio_read(Scsi_Cmnd *SCpnt) | 722 | static void nsp_pio_read(struct scsi_cmnd *SCpnt) |
721 | { | 723 | { |
722 | unsigned int base = SCpnt->device->host->io_port; | 724 | unsigned int base = SCpnt->device->host->io_port; |
723 | unsigned long mmio_base = SCpnt->device->host->base; | 725 | unsigned long mmio_base = SCpnt->device->host->base; |
@@ -812,7 +814,7 @@ static void nsp_pio_read(Scsi_Cmnd *SCpnt) | |||
812 | /* | 814 | /* |
813 | * write data in DATA OUT phase | 815 | * write data in DATA OUT phase |
814 | */ | 816 | */ |
815 | static void nsp_pio_write(Scsi_Cmnd *SCpnt) | 817 | static void nsp_pio_write(struct scsi_cmnd *SCpnt) |
816 | { | 818 | { |
817 | unsigned int base = SCpnt->device->host->io_port; | 819 | unsigned int base = SCpnt->device->host->io_port; |
818 | unsigned long mmio_base = SCpnt->device->host->base; | 820 | unsigned long mmio_base = SCpnt->device->host->base; |
@@ -905,7 +907,7 @@ static void nsp_pio_write(Scsi_Cmnd *SCpnt) | |||
905 | /* | 907 | /* |
906 | * setup synchronous/asynchronous data transfer mode | 908 | * setup synchronous/asynchronous data transfer mode |
907 | */ | 909 | */ |
908 | static int nsp_nexus(Scsi_Cmnd *SCpnt) | 910 | static int nsp_nexus(struct scsi_cmnd *SCpnt) |
909 | { | 911 | { |
910 | unsigned int base = SCpnt->device->host->io_port; | 912 | unsigned int base = SCpnt->device->host->io_port; |
911 | unsigned char target = scmd_id(SCpnt); | 913 | unsigned char target = scmd_id(SCpnt); |
@@ -952,7 +954,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) | |||
952 | { | 954 | { |
953 | unsigned int base; | 955 | unsigned int base; |
954 | unsigned char irq_status, irq_phase, phase; | 956 | unsigned char irq_status, irq_phase, phase; |
955 | Scsi_Cmnd *tmpSC; | 957 | struct scsi_cmnd *tmpSC; |
956 | unsigned char target, lun; | 958 | unsigned char target, lun; |
957 | unsigned int *sync_neg; | 959 | unsigned int *sync_neg; |
958 | int i, tmp; | 960 | int i, tmp; |
@@ -1530,7 +1532,7 @@ nsp_proc_info( | |||
1530 | /*---------------------------------------------------------------*/ | 1532 | /*---------------------------------------------------------------*/ |
1531 | 1533 | ||
1532 | /* | 1534 | /* |
1533 | static int nsp_eh_abort(Scsi_Cmnd *SCpnt) | 1535 | static int nsp_eh_abort(struct scsi_cmnd *SCpnt) |
1534 | { | 1536 | { |
1535 | nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt); | 1537 | nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt); |
1536 | 1538 | ||
@@ -1558,7 +1560,7 @@ static int nsp_bus_reset(nsp_hw_data *data) | |||
1558 | return SUCCESS; | 1560 | return SUCCESS; |
1559 | } | 1561 | } |
1560 | 1562 | ||
1561 | static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt) | 1563 | static int nsp_eh_bus_reset(struct scsi_cmnd *SCpnt) |
1562 | { | 1564 | { |
1563 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 1565 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
1564 | 1566 | ||
@@ -1567,7 +1569,7 @@ static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt) | |||
1567 | return nsp_bus_reset(data); | 1569 | return nsp_bus_reset(data); |
1568 | } | 1570 | } |
1569 | 1571 | ||
1570 | static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt) | 1572 | static int nsp_eh_host_reset(struct scsi_cmnd *SCpnt) |
1571 | { | 1573 | { |
1572 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 1574 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
1573 | 1575 | ||
diff --git a/drivers/scsi/pcmcia/nsp_cs.h b/drivers/scsi/pcmcia/nsp_cs.h index a88714f4c05b..625ca97da52d 100644 --- a/drivers/scsi/pcmcia/nsp_cs.h +++ b/drivers/scsi/pcmcia/nsp_cs.h | |||
@@ -266,7 +266,7 @@ typedef struct _nsp_hw_data { | |||
266 | 266 | ||
267 | int TimerCount; | 267 | int TimerCount; |
268 | int SelectionTimeOut; | 268 | int SelectionTimeOut; |
269 | Scsi_Cmnd *CurrentSC; | 269 | struct scsi_cmnd *CurrentSC; |
270 | //int CurrnetTarget; | 270 | //int CurrnetTarget; |
271 | 271 | ||
272 | int FifoCount; | 272 | int FifoCount; |
@@ -319,30 +319,34 @@ static int nsp_proc_info ( | |||
319 | int hostno, | 319 | int hostno, |
320 | #endif | 320 | #endif |
321 | int inout); | 321 | int inout); |
322 | static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (* done)(Scsi_Cmnd *SCpnt)); | 322 | static int nsp_queuecommand(struct scsi_cmnd *SCpnt, |
323 | void (* done)(struct scsi_cmnd *SCpnt)); | ||
323 | 324 | ||
324 | /* Error handler */ | 325 | /* Error handler */ |
325 | /*static int nsp_eh_abort (Scsi_Cmnd *SCpnt);*/ | 326 | /*static int nsp_eh_abort (struct scsi_cmnd *SCpnt);*/ |
326 | /*static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt);*/ | 327 | /*static int nsp_eh_device_reset(struct scsi_cmnd *SCpnt);*/ |
327 | static int nsp_eh_bus_reset (Scsi_Cmnd *SCpnt); | 328 | static int nsp_eh_bus_reset (struct scsi_cmnd *SCpnt); |
328 | static int nsp_eh_host_reset (Scsi_Cmnd *SCpnt); | 329 | static int nsp_eh_host_reset (struct scsi_cmnd *SCpnt); |
329 | static int nsp_bus_reset (nsp_hw_data *data); | 330 | static int nsp_bus_reset (nsp_hw_data *data); |
330 | 331 | ||
331 | /* */ | 332 | /* */ |
332 | static int nsphw_init (nsp_hw_data *data); | 333 | static int nsphw_init (nsp_hw_data *data); |
333 | static int nsphw_start_selection(Scsi_Cmnd *SCpnt); | 334 | static int nsphw_start_selection(struct scsi_cmnd *SCpnt); |
334 | static void nsp_start_timer (Scsi_Cmnd *SCpnt, int time); | 335 | static void nsp_start_timer (struct scsi_cmnd *SCpnt, int time); |
335 | static int nsp_fifo_count (Scsi_Cmnd *SCpnt); | 336 | static int nsp_fifo_count (struct scsi_cmnd *SCpnt); |
336 | static void nsp_pio_read (Scsi_Cmnd *SCpnt); | 337 | static void nsp_pio_read (struct scsi_cmnd *SCpnt); |
337 | static void nsp_pio_write (Scsi_Cmnd *SCpnt); | 338 | static void nsp_pio_write (struct scsi_cmnd *SCpnt); |
338 | static int nsp_nexus (Scsi_Cmnd *SCpnt); | 339 | static int nsp_nexus (struct scsi_cmnd *SCpnt); |
339 | static void nsp_scsi_done (Scsi_Cmnd *SCpnt); | 340 | static void nsp_scsi_done (struct scsi_cmnd *SCpnt); |
340 | static int nsp_analyze_sdtr (Scsi_Cmnd *SCpnt); | 341 | static int nsp_analyze_sdtr (struct scsi_cmnd *SCpnt); |
341 | static int nsp_negate_signal (Scsi_Cmnd *SCpnt, unsigned char mask, char *str); | 342 | static int nsp_negate_signal (struct scsi_cmnd *SCpnt, |
342 | static int nsp_expect_signal (Scsi_Cmnd *SCpnt, unsigned char current_phase, unsigned char mask); | 343 | unsigned char mask, char *str); |
343 | static int nsp_xfer (Scsi_Cmnd *SCpnt, int phase); | 344 | static int nsp_expect_signal (struct scsi_cmnd *SCpnt, |
344 | static int nsp_dataphase_bypass (Scsi_Cmnd *SCpnt); | 345 | unsigned char current_phase, |
345 | static int nsp_reselected (Scsi_Cmnd *SCpnt); | 346 | unsigned char mask); |
347 | static int nsp_xfer (struct scsi_cmnd *SCpnt, int phase); | ||
348 | static int nsp_dataphase_bypass (struct scsi_cmnd *SCpnt); | ||
349 | static int nsp_reselected (struct scsi_cmnd *SCpnt); | ||
346 | static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht); | 350 | static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht); |
347 | 351 | ||
348 | /* Interrupt handler */ | 352 | /* Interrupt handler */ |
@@ -355,8 +359,8 @@ static void __exit nsp_cs_exit(void); | |||
355 | 359 | ||
356 | /* Debug */ | 360 | /* Debug */ |
357 | #ifdef NSP_DEBUG | 361 | #ifdef NSP_DEBUG |
358 | static void show_command (Scsi_Cmnd *SCpnt); | 362 | static void show_command (struct scsi_cmnd *SCpnt); |
359 | static void show_phase (Scsi_Cmnd *SCpnt); | 363 | static void show_phase (struct scsi_cmnd *SCpnt); |
360 | static void show_busphase(unsigned char stat); | 364 | static void show_busphase(unsigned char stat); |
361 | static void show_message (nsp_hw_data *data); | 365 | static void show_message (nsp_hw_data *data); |
362 | #else | 366 | #else |
diff --git a/drivers/scsi/pcmcia/nsp_debug.c b/drivers/scsi/pcmcia/nsp_debug.c index 62e5c60067fd..2f75fe6e35a7 100644 --- a/drivers/scsi/pcmcia/nsp_debug.c +++ b/drivers/scsi/pcmcia/nsp_debug.c | |||
@@ -138,12 +138,12 @@ static void print_commandk (unsigned char *command) | |||
138 | printk("\n"); | 138 | printk("\n"); |
139 | } | 139 | } |
140 | 140 | ||
141 | static void show_command(Scsi_Cmnd *SCpnt) | 141 | static void show_command(struct scsi_cmnd *SCpnt) |
142 | { | 142 | { |
143 | print_commandk(SCpnt->cmnd); | 143 | print_commandk(SCpnt->cmnd); |
144 | } | 144 | } |
145 | 145 | ||
146 | static void show_phase(Scsi_Cmnd *SCpnt) | 146 | static void show_phase(struct scsi_cmnd *SCpnt) |
147 | { | 147 | { |
148 | int i = SCpnt->SCp.phase; | 148 | int i = SCpnt->SCp.phase; |
149 | 149 | ||
diff --git a/drivers/scsi/pcmcia/nsp_message.c b/drivers/scsi/pcmcia/nsp_message.c index d7057737ff34..ef593b70d0f0 100644 --- a/drivers/scsi/pcmcia/nsp_message.c +++ b/drivers/scsi/pcmcia/nsp_message.c | |||
@@ -8,7 +8,7 @@ | |||
8 | 8 | ||
9 | /* $Id: nsp_message.c,v 1.6 2003/07/26 14:21:09 elca Exp $ */ | 9 | /* $Id: nsp_message.c,v 1.6 2003/07/26 14:21:09 elca Exp $ */ |
10 | 10 | ||
11 | static void nsp_message_in(Scsi_Cmnd *SCpnt) | 11 | static void nsp_message_in(struct scsi_cmnd *SCpnt) |
12 | { | 12 | { |
13 | unsigned int base = SCpnt->device->host->io_port; | 13 | unsigned int base = SCpnt->device->host->io_port; |
14 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 14 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
@@ -50,7 +50,7 @@ static void nsp_message_in(Scsi_Cmnd *SCpnt) | |||
50 | 50 | ||
51 | } | 51 | } |
52 | 52 | ||
53 | static void nsp_message_out(Scsi_Cmnd *SCpnt) | 53 | static void nsp_message_out(struct scsi_cmnd *SCpnt) |
54 | { | 54 | { |
55 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 55 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
56 | int ret = 1; | 56 | int ret = 1; |
diff --git a/drivers/scsi/ppa.c b/drivers/scsi/ppa.c index b0eba39f208a..89a2a9f11e41 100644 --- a/drivers/scsi/ppa.c +++ b/drivers/scsi/ppa.c | |||
@@ -1012,7 +1012,7 @@ static LIST_HEAD(ppa_hosts); | |||
1012 | static int __ppa_attach(struct parport *pb) | 1012 | static int __ppa_attach(struct parport *pb) |
1013 | { | 1013 | { |
1014 | struct Scsi_Host *host; | 1014 | struct Scsi_Host *host; |
1015 | DECLARE_WAIT_QUEUE_HEAD(waiting); | 1015 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(waiting); |
1016 | DEFINE_WAIT(wait); | 1016 | DEFINE_WAIT(wait); |
1017 | ppa_struct *dev; | 1017 | ppa_struct *dev; |
1018 | int ports; | 1018 | int ports; |
diff --git a/drivers/scsi/psi240i.c b/drivers/scsi/psi240i.c index a720c9265e66..899e89d6fe67 100644 --- a/drivers/scsi/psi240i.c +++ b/drivers/scsi/psi240i.c | |||
@@ -87,11 +87,11 @@ typedef struct | |||
87 | { | 87 | { |
88 | USHORT ports[13]; | 88 | USHORT ports[13]; |
89 | OUR_DEVICE device[8]; | 89 | OUR_DEVICE device[8]; |
90 | Scsi_Cmnd *pSCmnd; | 90 | struct scsi_cmnd *pSCmnd; |
91 | IDE_STRUCT ide; | 91 | IDE_STRUCT ide; |
92 | ULONG startSector; | 92 | ULONG startSector; |
93 | USHORT sectorCount; | 93 | USHORT sectorCount; |
94 | Scsi_Cmnd *SCpnt; | 94 | struct scsi_cmnd *SCpnt; |
95 | VOID *buffer; | 95 | VOID *buffer; |
96 | USHORT expectingIRQ; | 96 | USHORT expectingIRQ; |
97 | } ADAPTER240I, *PADAPTER240I; | 97 | } ADAPTER240I, *PADAPTER240I; |
@@ -253,12 +253,12 @@ static ULONG DecodeError (struct Scsi_Host *pshost, UCHAR status) | |||
253 | ****************************************************************/ | 253 | ****************************************************************/ |
254 | static void Irq_Handler (int irq, void *dev_id) | 254 | static void Irq_Handler (int irq, void *dev_id) |
255 | { | 255 | { |
256 | struct Scsi_Host *shost; // Pointer to host data block | 256 | struct Scsi_Host *shost; // Pointer to host data block |
257 | PADAPTER240I padapter; // Pointer to adapter control structure | 257 | PADAPTER240I padapter; // Pointer to adapter control structure |
258 | USHORT *pports; // I/O port array | 258 | USHORT *pports; // I/O port array |
259 | Scsi_Cmnd *SCpnt; | 259 | struct scsi_cmnd *SCpnt; |
260 | UCHAR status; | 260 | UCHAR status; |
261 | int z; | 261 | int z; |
262 | 262 | ||
263 | DEB(printk ("\npsi240i received interrupt\n")); | 263 | DEB(printk ("\npsi240i received interrupt\n")); |
264 | 264 | ||
@@ -328,7 +328,7 @@ static void Irq_Handler (int irq, void *dev_id) | |||
328 | pinquiryData->AdditionalLength = 35 - 4; | 328 | pinquiryData->AdditionalLength = 35 - 4; |
329 | 329 | ||
330 | // Fill in vendor identification fields. | 330 | // Fill in vendor identification fields. |
331 | for ( z = 0; z < 20; z += 2 ) | 331 | for ( z = 0; z < 8; z += 2 ) |
332 | { | 332 | { |
333 | pinquiryData->VendorId[z] = ((UCHAR *)identifyData.ModelNumber)[z + 1]; | 333 | pinquiryData->VendorId[z] = ((UCHAR *)identifyData.ModelNumber)[z + 1]; |
334 | pinquiryData->VendorId[z + 1] = ((UCHAR *)identifyData.ModelNumber)[z]; | 334 | pinquiryData->VendorId[z + 1] = ((UCHAR *)identifyData.ModelNumber)[z]; |
@@ -389,12 +389,17 @@ static irqreturn_t do_Irq_Handler (int irq, void *dev_id) | |||
389 | * Returns: Status code. | 389 | * Returns: Status code. |
390 | * | 390 | * |
391 | ****************************************************************/ | 391 | ****************************************************************/ |
392 | static int Psi240i_QueueCommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) | 392 | static int Psi240i_QueueCommand(struct scsi_cmnd *SCpnt, |
393 | void (*done)(struct scsi_cmnd *)) | ||
393 | { | 394 | { |
394 | UCHAR *cdb = (UCHAR *)SCpnt->cmnd; // Pointer to SCSI CDB | 395 | UCHAR *cdb = (UCHAR *)SCpnt->cmnd; |
395 | PADAPTER240I padapter = HOSTDATA (SCpnt->device->host); // Pointer to adapter control structure | 396 | // Pointer to SCSI CDB |
396 | POUR_DEVICE pdev = &padapter->device [SCpnt->device->id];// Pointer to device information | 397 | PADAPTER240I padapter = HOSTDATA (SCpnt->device->host); |
397 | UCHAR rc; // command return code | 398 | // Pointer to adapter control structure |
399 | POUR_DEVICE pdev = &padapter->device [SCpnt->device->id]; | ||
400 | // Pointer to device information | ||
401 | UCHAR rc; | ||
402 | // command return code | ||
398 | 403 | ||
399 | SCpnt->scsi_done = done; | 404 | SCpnt->scsi_done = done; |
400 | padapter->ide.ide.ides.spigot = pdev->spigot; | 405 | padapter->ide.ide.ides.spigot = pdev->spigot; |
diff --git a/drivers/scsi/psi240i.h b/drivers/scsi/psi240i.h index 6a598766df51..21ebb9214004 100644 --- a/drivers/scsi/psi240i.h +++ b/drivers/scsi/psi240i.h | |||
@@ -309,7 +309,7 @@ typedef struct _IDENTIFY_DATA2 { | |||
309 | #endif // PSI_EIDE_SCSIOP | 309 | #endif // PSI_EIDE_SCSIOP |
310 | 310 | ||
311 | // function prototypes | 311 | // function prototypes |
312 | int Psi240i_Command (Scsi_Cmnd *SCpnt); | 312 | int Psi240i_Command(struct scsi_cmnd *SCpnt); |
313 | int Psi240i_Abort (Scsi_Cmnd *SCpnt); | 313 | int Psi240i_Abort(struct scsi_cmnd *SCpnt); |
314 | int Psi240i_Reset (Scsi_Cmnd *SCpnt, unsigned int flags); | 314 | int Psi240i_Reset(struct scsi_cmnd *SCpnt, unsigned int flags); |
315 | #endif | 315 | #endif |
diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c index 2521d548dd59..16af5b79e587 100644 --- a/drivers/scsi/qla1280.c +++ b/drivers/scsi/qla1280.c | |||
@@ -931,11 +931,10 @@ qla1280_error_action(struct scsi_cmnd *cmd, enum action action) | |||
931 | 931 | ||
932 | case BUS_RESET: | 932 | case BUS_RESET: |
933 | if (qla1280_verbose) | 933 | if (qla1280_verbose) |
934 | printk(KERN_INFO "qla1280(%ld:%d): Issuing BUS " | 934 | printk(KERN_INFO "qla1280(%ld:%d): Issued bus " |
935 | "DEVICE RESET\n", ha->host_no, bus); | 935 | "reset.\n", ha->host_no, bus); |
936 | if (qla1280_bus_reset(ha, bus == 0)) | 936 | if (qla1280_bus_reset(ha, bus) == 0) |
937 | result = SUCCESS; | 937 | result = SUCCESS; |
938 | |||
939 | break; | 938 | break; |
940 | 939 | ||
941 | case ADAPTER_RESET: | 940 | case ADAPTER_RESET: |
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index ee75a71f3c66..285c8e8ff1a0 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
@@ -379,21 +379,37 @@ static struct bin_attribute sysfs_sfp_attr = { | |||
379 | .read = qla2x00_sysfs_read_sfp, | 379 | .read = qla2x00_sysfs_read_sfp, |
380 | }; | 380 | }; |
381 | 381 | ||
382 | static struct sysfs_entry { | ||
383 | char *name; | ||
384 | struct bin_attribute *attr; | ||
385 | int is4GBp_only; | ||
386 | } bin_file_entries[] = { | ||
387 | { "fw_dump", &sysfs_fw_dump_attr, }, | ||
388 | { "nvram", &sysfs_nvram_attr, }, | ||
389 | { "optrom", &sysfs_optrom_attr, }, | ||
390 | { "optrom_ctl", &sysfs_optrom_ctl_attr, }, | ||
391 | { "vpd", &sysfs_vpd_attr, 1 }, | ||
392 | { "sfp", &sysfs_sfp_attr, 1 }, | ||
393 | { 0 }, | ||
394 | }; | ||
395 | |||
382 | void | 396 | void |
383 | qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha) | 397 | qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha) |
384 | { | 398 | { |
385 | struct Scsi_Host *host = ha->host; | 399 | struct Scsi_Host *host = ha->host; |
400 | struct sysfs_entry *iter; | ||
401 | int ret; | ||
386 | 402 | ||
387 | sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr); | 403 | for (iter = bin_file_entries; iter->name; iter++) { |
388 | sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr); | 404 | if (iter->is4GBp_only && (!IS_QLA24XX(ha) && !IS_QLA54XX(ha))) |
389 | sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_optrom_attr); | 405 | continue; |
390 | sysfs_create_bin_file(&host->shost_gendev.kobj, | 406 | |
391 | &sysfs_optrom_ctl_attr); | 407 | ret = sysfs_create_bin_file(&host->shost_gendev.kobj, |
392 | if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { | 408 | iter->attr); |
393 | sysfs_create_bin_file(&host->shost_gendev.kobj, | 409 | if (ret) |
394 | &sysfs_vpd_attr); | 410 | qla_printk(KERN_INFO, ha, |
395 | sysfs_create_bin_file(&host->shost_gendev.kobj, | 411 | "Unable to create sysfs %s binary attribute " |
396 | &sysfs_sfp_attr); | 412 | "(%d).\n", iter->name, ret); |
397 | } | 413 | } |
398 | } | 414 | } |
399 | 415 | ||
@@ -401,17 +417,14 @@ void | |||
401 | qla2x00_free_sysfs_attr(scsi_qla_host_t *ha) | 417 | qla2x00_free_sysfs_attr(scsi_qla_host_t *ha) |
402 | { | 418 | { |
403 | struct Scsi_Host *host = ha->host; | 419 | struct Scsi_Host *host = ha->host; |
420 | struct sysfs_entry *iter; | ||
421 | |||
422 | for (iter = bin_file_entries; iter->name; iter++) { | ||
423 | if (iter->is4GBp_only && (!IS_QLA24XX(ha) && !IS_QLA54XX(ha))) | ||
424 | continue; | ||
404 | 425 | ||
405 | sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr); | ||
406 | sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr); | ||
407 | sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_optrom_attr); | ||
408 | sysfs_remove_bin_file(&host->shost_gendev.kobj, | ||
409 | &sysfs_optrom_ctl_attr); | ||
410 | if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { | ||
411 | sysfs_remove_bin_file(&host->shost_gendev.kobj, | ||
412 | &sysfs_vpd_attr); | ||
413 | sysfs_remove_bin_file(&host->shost_gendev.kobj, | 426 | sysfs_remove_bin_file(&host->shost_gendev.kobj, |
414 | &sysfs_sfp_attr); | 427 | iter->attr); |
415 | } | 428 | } |
416 | 429 | ||
417 | if (ha->beacon_blink_led == 1) | 430 | if (ha->beacon_blink_led == 1) |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h index 90dad7e88985..5b12278968e0 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.h +++ b/drivers/scsi/qla2xxx/qla_dbg.h | |||
@@ -38,7 +38,7 @@ | |||
38 | * Macros use for debugging the driver. | 38 | * Macros use for debugging the driver. |
39 | */ | 39 | */ |
40 | 40 | ||
41 | #define DEBUG(x) do { if (qla2_extended_error_logging) { x; } } while (0) | 41 | #define DEBUG(x) do { if (ql2xextended_error_logging) { x; } } while (0) |
42 | 42 | ||
43 | #if defined(QL_DEBUG_LEVEL_1) | 43 | #if defined(QL_DEBUG_LEVEL_1) |
44 | #define DEBUG1(x) do {x;} while (0) | 44 | #define DEBUG1(x) do {x;} while (0) |
@@ -46,12 +46,12 @@ | |||
46 | #define DEBUG1(x) do {} while (0) | 46 | #define DEBUG1(x) do {} while (0) |
47 | #endif | 47 | #endif |
48 | 48 | ||
49 | #define DEBUG2(x) do { if (qla2_extended_error_logging) { x; } } while (0) | 49 | #define DEBUG2(x) do { if (ql2xextended_error_logging) { x; } } while (0) |
50 | #define DEBUG2_3(x) do { if (qla2_extended_error_logging) { x; } } while (0) | 50 | #define DEBUG2_3(x) do { if (ql2xextended_error_logging) { x; } } while (0) |
51 | #define DEBUG2_3_11(x) do { if (qla2_extended_error_logging) { x; } } while (0) | 51 | #define DEBUG2_3_11(x) do { if (ql2xextended_error_logging) { x; } } while (0) |
52 | #define DEBUG2_9_10(x) do { if (qla2_extended_error_logging) { x; } } while (0) | 52 | #define DEBUG2_9_10(x) do { if (ql2xextended_error_logging) { x; } } while (0) |
53 | #define DEBUG2_11(x) do { if (qla2_extended_error_logging) { x; } } while (0) | 53 | #define DEBUG2_11(x) do { if (ql2xextended_error_logging) { x; } } while (0) |
54 | #define DEBUG2_13(x) do { if (qla2_extended_error_logging) { x; } } while (0) | 54 | #define DEBUG2_13(x) do { if (ql2xextended_error_logging) { x; } } while (0) |
55 | 55 | ||
56 | #if defined(QL_DEBUG_LEVEL_3) | 56 | #if defined(QL_DEBUG_LEVEL_3) |
57 | #define DEBUG3(x) do {x;} while (0) | 57 | #define DEBUG3(x) do {x;} while (0) |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index bab33f6d0bdb..c4fc40f8e8ca 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -1545,6 +1545,9 @@ typedef struct fc_port { | |||
1545 | spinlock_t rport_lock; | 1545 | spinlock_t rport_lock; |
1546 | struct fc_rport *rport, *drport; | 1546 | struct fc_rport *rport, *drport; |
1547 | u32 supported_classes; | 1547 | u32 supported_classes; |
1548 | |||
1549 | unsigned long last_queue_full; | ||
1550 | unsigned long last_ramp_up; | ||
1548 | } fc_port_t; | 1551 | } fc_port_t; |
1549 | 1552 | ||
1550 | /* | 1553 | /* |
@@ -2255,6 +2258,7 @@ typedef struct scsi_qla_host { | |||
2255 | uint16_t mgmt_svr_loop_id; | 2258 | uint16_t mgmt_svr_loop_id; |
2256 | 2259 | ||
2257 | uint32_t login_retry_count; | 2260 | uint32_t login_retry_count; |
2261 | int max_q_depth; | ||
2258 | 2262 | ||
2259 | /* Fibre Channel Device List. */ | 2263 | /* Fibre Channel Device List. */ |
2260 | struct list_head fcports; | 2264 | struct list_head fcports; |
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 7da69832d74c..32ebeec45ff0 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
@@ -48,6 +48,7 @@ extern void qla2x00_update_fcport(scsi_qla_host_t *, fc_port_t *); | |||
48 | extern void qla2x00_reg_remote_port(scsi_qla_host_t *, fc_port_t *); | 48 | extern void qla2x00_reg_remote_port(scsi_qla_host_t *, fc_port_t *); |
49 | 49 | ||
50 | extern void qla2x00_alloc_fw_dump(scsi_qla_host_t *); | 50 | extern void qla2x00_alloc_fw_dump(scsi_qla_host_t *); |
51 | extern void qla2x00_try_to_stop_firmware(scsi_qla_host_t *); | ||
51 | 52 | ||
52 | /* | 53 | /* |
53 | * Global Data in qla_os.c source file. | 54 | * Global Data in qla_os.c source file. |
@@ -60,7 +61,8 @@ extern int ql2xplogiabsentdevice; | |||
60 | extern int ql2xloginretrycount; | 61 | extern int ql2xloginretrycount; |
61 | extern int ql2xfdmienable; | 62 | extern int ql2xfdmienable; |
62 | extern int ql2xallocfwdump; | 63 | extern int ql2xallocfwdump; |
63 | extern int qla2_extended_error_logging; | 64 | extern int ql2xextended_error_logging; |
65 | extern int ql2xqfullrampup; | ||
64 | 66 | ||
65 | extern void qla2x00_sp_compl(scsi_qla_host_t *, srb_t *); | 67 | extern void qla2x00_sp_compl(scsi_qla_host_t *, srb_t *); |
66 | 68 | ||
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 833b93085fd3..08cb5e3fb553 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -1644,7 +1644,7 @@ qla2x00_nvram_config(scsi_qla_host_t *ha) | |||
1644 | * Set host adapter parameters. | 1644 | * Set host adapter parameters. |
1645 | */ | 1645 | */ |
1646 | if (nv->host_p[0] & BIT_7) | 1646 | if (nv->host_p[0] & BIT_7) |
1647 | qla2_extended_error_logging = 1; | 1647 | ql2xextended_error_logging = 1; |
1648 | ha->flags.disable_risc_code_load = ((nv->host_p[0] & BIT_4) ? 1 : 0); | 1648 | ha->flags.disable_risc_code_load = ((nv->host_p[0] & BIT_4) ? 1 : 0); |
1649 | /* Always load RISC code on non ISP2[12]00 chips. */ | 1649 | /* Always load RISC code on non ISP2[12]00 chips. */ |
1650 | if (!IS_QLA2100(ha) && !IS_QLA2200(ha)) | 1650 | if (!IS_QLA2100(ha) && !IS_QLA2200(ha)) |
@@ -3948,3 +3948,24 @@ qla24xx_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) | |||
3948 | fail_fw_integrity: | 3948 | fail_fw_integrity: |
3949 | return QLA_FUNCTION_FAILED; | 3949 | return QLA_FUNCTION_FAILED; |
3950 | } | 3950 | } |
3951 | |||
3952 | void | ||
3953 | qla2x00_try_to_stop_firmware(scsi_qla_host_t *ha) | ||
3954 | { | ||
3955 | int ret, retries; | ||
3956 | |||
3957 | if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)) | ||
3958 | return; | ||
3959 | |||
3960 | ret = qla2x00_stop_firmware(ha); | ||
3961 | for (retries = 5; ret != QLA_SUCCESS && retries ; retries--) { | ||
3962 | qla2x00_reset_chip(ha); | ||
3963 | if (qla2x00_chip_diag(ha) != QLA_SUCCESS) | ||
3964 | continue; | ||
3965 | if (qla2x00_setup_chip(ha) != QLA_SUCCESS) | ||
3966 | continue; | ||
3967 | qla_printk(KERN_INFO, ha, | ||
3968 | "Attempting retry of stop-firmware command...\n"); | ||
3969 | ret = qla2x00_stop_firmware(ha); | ||
3970 | } | ||
3971 | } | ||
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 626c7178a434..d3b6df4d55c8 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -6,6 +6,8 @@ | |||
6 | */ | 6 | */ |
7 | #include "qla_def.h" | 7 | #include "qla_def.h" |
8 | 8 | ||
9 | #include <scsi/scsi_tcq.h> | ||
10 | |||
9 | static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t); | 11 | static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t); |
10 | static void qla2x00_async_event(scsi_qla_host_t *, uint16_t *); | 12 | static void qla2x00_async_event(scsi_qla_host_t *, uint16_t *); |
11 | static void qla2x00_process_completed_request(struct scsi_qla_host *, uint32_t); | 13 | static void qla2x00_process_completed_request(struct scsi_qla_host *, uint32_t); |
@@ -593,6 +595,67 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) | |||
593 | } | 595 | } |
594 | } | 596 | } |
595 | 597 | ||
598 | static void | ||
599 | qla2x00_adjust_sdev_qdepth_up(struct scsi_device *sdev, void *data) | ||
600 | { | ||
601 | fc_port_t *fcport = data; | ||
602 | |||
603 | if (fcport->ha->max_q_depth <= sdev->queue_depth) | ||
604 | return; | ||
605 | |||
606 | if (sdev->ordered_tags) | ||
607 | scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, | ||
608 | sdev->queue_depth + 1); | ||
609 | else | ||
610 | scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, | ||
611 | sdev->queue_depth + 1); | ||
612 | |||
613 | fcport->last_ramp_up = jiffies; | ||
614 | |||
615 | DEBUG2(qla_printk(KERN_INFO, fcport->ha, | ||
616 | "scsi(%ld:%d:%d:%d): Queue depth adjusted-up to %d.\n", | ||
617 | fcport->ha->host_no, sdev->channel, sdev->id, sdev->lun, | ||
618 | sdev->queue_depth)); | ||
619 | } | ||
620 | |||
621 | static void | ||
622 | qla2x00_adjust_sdev_qdepth_down(struct scsi_device *sdev, void *data) | ||
623 | { | ||
624 | fc_port_t *fcport = data; | ||
625 | |||
626 | if (!scsi_track_queue_full(sdev, sdev->queue_depth - 1)) | ||
627 | return; | ||
628 | |||
629 | DEBUG2(qla_printk(KERN_INFO, fcport->ha, | ||
630 | "scsi(%ld:%d:%d:%d): Queue depth adjusted-down to %d.\n", | ||
631 | fcport->ha->host_no, sdev->channel, sdev->id, sdev->lun, | ||
632 | sdev->queue_depth)); | ||
633 | } | ||
634 | |||
635 | static inline void | ||
636 | qla2x00_ramp_up_queue_depth(scsi_qla_host_t *ha, srb_t *sp) | ||
637 | { | ||
638 | fc_port_t *fcport; | ||
639 | struct scsi_device *sdev; | ||
640 | |||
641 | sdev = sp->cmd->device; | ||
642 | if (sdev->queue_depth >= ha->max_q_depth) | ||
643 | return; | ||
644 | |||
645 | fcport = sp->fcport; | ||
646 | if (time_before(jiffies, | ||
647 | fcport->last_ramp_up + ql2xqfullrampup * HZ)) | ||
648 | return; | ||
649 | if (time_before(jiffies, | ||
650 | fcport->last_queue_full + ql2xqfullrampup * HZ)) | ||
651 | return; | ||
652 | |||
653 | spin_unlock_irq(&ha->hardware_lock); | ||
654 | starget_for_each_device(sdev->sdev_target, fcport, | ||
655 | qla2x00_adjust_sdev_qdepth_up); | ||
656 | spin_lock_irq(&ha->hardware_lock); | ||
657 | } | ||
658 | |||
596 | /** | 659 | /** |
597 | * qla2x00_process_completed_request() - Process a Fast Post response. | 660 | * qla2x00_process_completed_request() - Process a Fast Post response. |
598 | * @ha: SCSI driver HA context | 661 | * @ha: SCSI driver HA context |
@@ -624,6 +687,8 @@ qla2x00_process_completed_request(struct scsi_qla_host *ha, uint32_t index) | |||
624 | 687 | ||
625 | /* Save ISP completion status */ | 688 | /* Save ISP completion status */ |
626 | sp->cmd->result = DID_OK << 16; | 689 | sp->cmd->result = DID_OK << 16; |
690 | |||
691 | qla2x00_ramp_up_queue_depth(ha, sp); | ||
627 | qla2x00_sp_compl(ha, sp); | 692 | qla2x00_sp_compl(ha, sp); |
628 | } else { | 693 | } else { |
629 | DEBUG2(printk("scsi(%ld): Invalid ISP SCSI completion handle\n", | 694 | DEBUG2(printk("scsi(%ld): Invalid ISP SCSI completion handle\n", |
@@ -823,6 +888,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
823 | */ | 888 | */ |
824 | switch (comp_status) { | 889 | switch (comp_status) { |
825 | case CS_COMPLETE: | 890 | case CS_COMPLETE: |
891 | case CS_QUEUE_FULL: | ||
826 | if (scsi_status == 0) { | 892 | if (scsi_status == 0) { |
827 | cp->result = DID_OK << 16; | 893 | cp->result = DID_OK << 16; |
828 | break; | 894 | break; |
@@ -849,6 +915,20 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
849 | } | 915 | } |
850 | cp->result = DID_OK << 16 | lscsi_status; | 916 | cp->result = DID_OK << 16 | lscsi_status; |
851 | 917 | ||
918 | if (lscsi_status == SAM_STAT_TASK_SET_FULL) { | ||
919 | DEBUG2(printk(KERN_INFO | ||
920 | "scsi(%ld): QUEUE FULL status detected " | ||
921 | "0x%x-0x%x.\n", ha->host_no, comp_status, | ||
922 | scsi_status)); | ||
923 | |||
924 | /* Adjust queue depth for all luns on the port. */ | ||
925 | fcport->last_queue_full = jiffies; | ||
926 | spin_unlock_irq(&ha->hardware_lock); | ||
927 | starget_for_each_device(cp->device->sdev_target, | ||
928 | fcport, qla2x00_adjust_sdev_qdepth_down); | ||
929 | spin_lock_irq(&ha->hardware_lock); | ||
930 | break; | ||
931 | } | ||
852 | if (lscsi_status != SS_CHECK_CONDITION) | 932 | if (lscsi_status != SS_CHECK_CONDITION) |
853 | break; | 933 | break; |
854 | 934 | ||
@@ -1066,17 +1146,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
1066 | qla2x00_mark_device_lost(ha, fcport, 1, 1); | 1146 | qla2x00_mark_device_lost(ha, fcport, 1, 1); |
1067 | break; | 1147 | break; |
1068 | 1148 | ||
1069 | case CS_QUEUE_FULL: | ||
1070 | DEBUG2(printk(KERN_INFO | ||
1071 | "scsi(%ld): QUEUE FULL status detected 0x%x-0x%x.\n", | ||
1072 | ha->host_no, comp_status, scsi_status)); | ||
1073 | |||
1074 | /* SCSI Mid-Layer handles device queue full */ | ||
1075 | |||
1076 | cp->result = DID_OK << 16 | lscsi_status; | ||
1077 | |||
1078 | break; | ||
1079 | |||
1080 | default: | 1149 | default: |
1081 | DEBUG3(printk("scsi(%ld): Error detected (unknown status) " | 1150 | DEBUG3(printk("scsi(%ld): Error detected (unknown status) " |
1082 | "0x%x-0x%x.\n", ha->host_no, comp_status, scsi_status)); | 1151 | "0x%x-0x%x.\n", ha->host_no, comp_status, scsi_status)); |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 3f20d765563e..208607be78c7 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -61,9 +61,9 @@ MODULE_PARM_DESC(ql2xallocfwdump, | |||
61 | "during HBA initialization. Memory allocation requirements " | 61 | "during HBA initialization. Memory allocation requirements " |
62 | "vary by ISP type. Default is 1 - allocate memory."); | 62 | "vary by ISP type. Default is 1 - allocate memory."); |
63 | 63 | ||
64 | int qla2_extended_error_logging; | 64 | int ql2xextended_error_logging; |
65 | module_param(qla2_extended_error_logging, int, S_IRUGO|S_IRUSR); | 65 | module_param(ql2xextended_error_logging, int, S_IRUGO|S_IRUSR); |
66 | MODULE_PARM_DESC(qla2_extended_error_logging, | 66 | MODULE_PARM_DESC(ql2xextended_error_logging, |
67 | "Option to enable extended error logging, " | 67 | "Option to enable extended error logging, " |
68 | "Default is 0 - no logging. 1 - log errors."); | 68 | "Default is 0 - no logging. 1 - log errors."); |
69 | 69 | ||
@@ -77,6 +77,19 @@ MODULE_PARM_DESC(ql2xfdmienable, | |||
77 | "Enables FDMI registratons " | 77 | "Enables FDMI registratons " |
78 | "Default is 0 - no FDMI. 1 - perfom FDMI."); | 78 | "Default is 0 - no FDMI. 1 - perfom FDMI."); |
79 | 79 | ||
80 | #define MAX_Q_DEPTH 32 | ||
81 | static int ql2xmaxqdepth = MAX_Q_DEPTH; | ||
82 | module_param(ql2xmaxqdepth, int, S_IRUGO|S_IWUSR); | ||
83 | MODULE_PARM_DESC(ql2xmaxqdepth, | ||
84 | "Maximum queue depth to report for target devices."); | ||
85 | |||
86 | int ql2xqfullrampup = 120; | ||
87 | module_param(ql2xqfullrampup, int, S_IRUGO|S_IWUSR); | ||
88 | MODULE_PARM_DESC(ql2xqfullrampup, | ||
89 | "Number of seconds to wait to begin to ramp-up the queue " | ||
90 | "depth for a device after a queue-full condition has been " | ||
91 | "detected. Default is 120 seconds."); | ||
92 | |||
80 | /* | 93 | /* |
81 | * SCSI host template entry points | 94 | * SCSI host template entry points |
82 | */ | 95 | */ |
@@ -1104,9 +1117,9 @@ qla2xxx_slave_configure(struct scsi_device *sdev) | |||
1104 | struct fc_rport *rport = starget_to_rport(sdev->sdev_target); | 1117 | struct fc_rport *rport = starget_to_rport(sdev->sdev_target); |
1105 | 1118 | ||
1106 | if (sdev->tagged_supported) | 1119 | if (sdev->tagged_supported) |
1107 | scsi_activate_tcq(sdev, 32); | 1120 | scsi_activate_tcq(sdev, ha->max_q_depth); |
1108 | else | 1121 | else |
1109 | scsi_deactivate_tcq(sdev, 32); | 1122 | scsi_deactivate_tcq(sdev, ha->max_q_depth); |
1110 | 1123 | ||
1111 | rport->dev_loss_tmo = ha->port_down_retry_count + 5; | 1124 | rport->dev_loss_tmo = ha->port_down_retry_count + 5; |
1112 | 1125 | ||
@@ -1413,6 +1426,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1413 | ha->link_data_rate = PORT_SPEED_UNKNOWN; | 1426 | ha->link_data_rate = PORT_SPEED_UNKNOWN; |
1414 | ha->optrom_size = OPTROM_SIZE_2300; | 1427 | ha->optrom_size = OPTROM_SIZE_2300; |
1415 | 1428 | ||
1429 | ha->max_q_depth = MAX_Q_DEPTH; | ||
1430 | if (ql2xmaxqdepth != 0 && ql2xmaxqdepth <= 0xffffU) | ||
1431 | ha->max_q_depth = ql2xmaxqdepth; | ||
1432 | |||
1416 | /* Assign ISP specific operations. */ | 1433 | /* Assign ISP specific operations. */ |
1417 | ha->isp_ops.pci_config = qla2100_pci_config; | 1434 | ha->isp_ops.pci_config = qla2100_pci_config; |
1418 | ha->isp_ops.reset_chip = qla2x00_reset_chip; | 1435 | ha->isp_ops.reset_chip = qla2x00_reset_chip; |
@@ -1712,8 +1729,10 @@ qla2x00_free_device(scsi_qla_host_t *ha) | |||
1712 | if (ha->eft) | 1729 | if (ha->eft) |
1713 | qla2x00_trace_control(ha, TC_DISABLE, 0, 0); | 1730 | qla2x00_trace_control(ha, TC_DISABLE, 0, 0); |
1714 | 1731 | ||
1732 | ha->flags.online = 0; | ||
1733 | |||
1715 | /* Stop currently executing firmware. */ | 1734 | /* Stop currently executing firmware. */ |
1716 | qla2x00_stop_firmware(ha); | 1735 | qla2x00_try_to_stop_firmware(ha); |
1717 | 1736 | ||
1718 | /* turn-off interrupts on the card */ | 1737 | /* turn-off interrupts on the card */ |
1719 | if (ha->interrupts_on) | 1738 | if (ha->interrupts_on) |
@@ -1721,8 +1740,6 @@ qla2x00_free_device(scsi_qla_host_t *ha) | |||
1721 | 1740 | ||
1722 | qla2x00_mem_free(ha); | 1741 | qla2x00_mem_free(ha); |
1723 | 1742 | ||
1724 | ha->flags.online = 0; | ||
1725 | |||
1726 | /* Detach interrupts */ | 1743 | /* Detach interrupts */ |
1727 | if (ha->host->irq) | 1744 | if (ha->host->irq) |
1728 | free_irq(ha->host->irq, ha); | 1745 | free_irq(ha->host->irq, ha); |
@@ -2697,7 +2714,7 @@ qla2x00_module_init(void) | |||
2697 | 2714 | ||
2698 | /* Derive version string. */ | 2715 | /* Derive version string. */ |
2699 | strcpy(qla2x00_version_str, QLA2XXX_VERSION); | 2716 | strcpy(qla2x00_version_str, QLA2XXX_VERSION); |
2700 | if (qla2_extended_error_logging) | 2717 | if (ql2xextended_error_logging) |
2701 | strcat(qla2x00_version_str, "-debug"); | 2718 | strcat(qla2x00_version_str, "-debug"); |
2702 | 2719 | ||
2703 | qla2xxx_transport_template = | 2720 | qla2xxx_transport_template = |
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index e57bf45a3393..1fa0bce6b24e 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h | |||
@@ -7,7 +7,7 @@ | |||
7 | /* | 7 | /* |
8 | * Driver version | 8 | * Driver version |
9 | */ | 9 | */ |
10 | #define QLA2XXX_VERSION "8.01.07-k2" | 10 | #define QLA2XXX_VERSION "8.01.07-k3" |
11 | 11 | ||
12 | #define QLA_DRIVER_MAJOR_VER 8 | 12 | #define QLA_DRIVER_MAJOR_VER 8 |
13 | #define QLA_DRIVER_MINOR_VER 1 | 13 | #define QLA_DRIVER_MINOR_VER 1 |
diff --git a/drivers/scsi/qla4xxx/Kconfig b/drivers/scsi/qla4xxx/Kconfig index 08a07f0b8d94..69cbff3f57cf 100644 --- a/drivers/scsi/qla4xxx/Kconfig +++ b/drivers/scsi/qla4xxx/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config SCSI_QLA_ISCSI | 1 | config SCSI_QLA_ISCSI |
2 | tristate "QLogic ISP4XXX host adapter family support" | 2 | tristate "QLogic ISP4XXX host adapter family support" |
3 | depends on PCI && SCSI | 3 | depends on PCI && SCSI && NET |
4 | select SCSI_ISCSI_ATTRS | 4 | select SCSI_ISCSI_ATTRS |
5 | ---help--- | 5 | ---help--- |
6 | This driver supports the QLogic 40xx (ISP4XXX) iSCSI host | 6 | This driver supports the QLogic 40xx (ISP4XXX) iSCSI host |
diff --git a/drivers/scsi/qla4xxx/ql4_dbg.h b/drivers/scsi/qla4xxx/ql4_dbg.h index 3e99dcfd5a9f..d861c3b411c8 100644 --- a/drivers/scsi/qla4xxx/ql4_dbg.h +++ b/drivers/scsi/qla4xxx/ql4_dbg.h | |||
@@ -22,14 +22,14 @@ | |||
22 | #endif | 22 | #endif |
23 | 23 | ||
24 | #if defined(QL_DEBUG_LEVEL_2) | 24 | #if defined(QL_DEBUG_LEVEL_2) |
25 | #define DEBUG2(x) do {if(qla4_extended_error_logging == 2) x;} while (0); | 25 | #define DEBUG2(x) do {if(ql4xextended_error_logging == 2) x;} while (0); |
26 | #define DEBUG2_3(x) do {x;} while (0); | 26 | #define DEBUG2_3(x) do {x;} while (0); |
27 | #else /* */ | 27 | #else /* */ |
28 | #define DEBUG2(x) do {} while (0); | 28 | #define DEBUG2(x) do {} while (0); |
29 | #endif /* */ | 29 | #endif /* */ |
30 | 30 | ||
31 | #if defined(QL_DEBUG_LEVEL_3) | 31 | #if defined(QL_DEBUG_LEVEL_3) |
32 | #define DEBUG3(x) do {if(qla4_extended_error_logging == 3) x;} while (0); | 32 | #define DEBUG3(x) do {if(ql4xextended_error_logging == 3) x;} while (0); |
33 | #else /* */ | 33 | #else /* */ |
34 | #define DEBUG3(x) do {} while (0); | 34 | #define DEBUG3(x) do {} while (0); |
35 | #if !defined(QL_DEBUG_LEVEL_2) | 35 | #if !defined(QL_DEBUG_LEVEL_2) |
diff --git a/drivers/scsi/qla4xxx/ql4_glbl.h b/drivers/scsi/qla4xxx/ql4_glbl.h index 2c803edf2de8..1b221ff0f6f7 100644 --- a/drivers/scsi/qla4xxx/ql4_glbl.h +++ b/drivers/scsi/qla4xxx/ql4_glbl.h | |||
@@ -72,7 +72,7 @@ int qla4xxx_reinitialize_ddb_list(struct scsi_qla_host * ha); | |||
72 | int qla4xxx_process_ddb_changed(struct scsi_qla_host * ha, | 72 | int qla4xxx_process_ddb_changed(struct scsi_qla_host * ha, |
73 | uint32_t fw_ddb_index, uint32_t state); | 73 | uint32_t fw_ddb_index, uint32_t state); |
74 | 74 | ||
75 | extern int qla4_extended_error_logging; | 75 | extern int ql4xextended_error_logging; |
76 | extern int ql4xdiscoverywait; | 76 | extern int ql4xdiscoverywait; |
77 | extern int ql4xdontresethba; | 77 | extern int ql4xdontresethba; |
78 | #endif /* _QLA4x_GBL_H */ | 78 | #endif /* _QLA4x_GBL_H */ |
diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c index ef82399c0858..b721dc5dd711 100644 --- a/drivers/scsi/qla4xxx/ql4_mbx.c +++ b/drivers/scsi/qla4xxx/ql4_mbx.c | |||
@@ -701,7 +701,7 @@ void qla4xxx_get_conn_event_log(struct scsi_qla_host * ha) | |||
701 | DEBUG3(printk("scsi%ld: Connection Event Log Dump (%d entries):\n", | 701 | DEBUG3(printk("scsi%ld: Connection Event Log Dump (%d entries):\n", |
702 | ha->host_no, num_valid_entries)); | 702 | ha->host_no, num_valid_entries)); |
703 | 703 | ||
704 | if (qla4_extended_error_logging == 3) { | 704 | if (ql4xextended_error_logging == 3) { |
705 | if (oldest_entry == 0) { | 705 | if (oldest_entry == 0) { |
706 | /* Circular Buffer has not wrapped around */ | 706 | /* Circular Buffer has not wrapped around */ |
707 | for (i=0; i < num_valid_entries; i++) { | 707 | for (i=0; i < num_valid_entries; i++) { |
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index 178fcddcfd81..5b8db6109536 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c | |||
@@ -34,9 +34,9 @@ MODULE_PARM_DESC(ql4xdontresethba, | |||
34 | " default it will reset hba :0" | 34 | " default it will reset hba :0" |
35 | " set to 1 to avoid resetting HBA"); | 35 | " set to 1 to avoid resetting HBA"); |
36 | 36 | ||
37 | int qla4_extended_error_logging = 0; /* 0 = off, 1 = log errors */ | 37 | int ql4xextended_error_logging = 0; /* 0 = off, 1 = log errors */ |
38 | module_param(qla4_extended_error_logging, int, S_IRUGO | S_IRUSR); | 38 | module_param(ql4xextended_error_logging, int, S_IRUGO | S_IRUSR); |
39 | MODULE_PARM_DESC(qla4_extended_error_logging, | 39 | MODULE_PARM_DESC(ql4xextended_error_logging, |
40 | "Option to enable extended error logging, " | 40 | "Option to enable extended error logging, " |
41 | "Default is 0 - no logging, 1 - debug logging"); | 41 | "Default is 0 - no logging, 1 - debug logging"); |
42 | 42 | ||
@@ -1714,7 +1714,7 @@ static int __init qla4xxx_module_init(void) | |||
1714 | 1714 | ||
1715 | /* Derive version string. */ | 1715 | /* Derive version string. */ |
1716 | strcpy(qla4xxx_version_str, QLA4XXX_DRIVER_VERSION); | 1716 | strcpy(qla4xxx_version_str, QLA4XXX_DRIVER_VERSION); |
1717 | if (qla4_extended_error_logging) | 1717 | if (ql4xextended_error_logging) |
1718 | strcat(qla4xxx_version_str, "-debug"); | 1718 | strcat(qla4xxx_version_str, "-debug"); |
1719 | 1719 | ||
1720 | qla4xxx_scsi_transport = | 1720 | qla4xxx_scsi_transport = |
@@ -1724,13 +1724,13 @@ static int __init qla4xxx_module_init(void) | |||
1724 | goto release_srb_cache; | 1724 | goto release_srb_cache; |
1725 | } | 1725 | } |
1726 | 1726 | ||
1727 | printk(KERN_INFO "QLogic iSCSI HBA Driver\n"); | ||
1728 | ret = pci_register_driver(&qla4xxx_pci_driver); | 1727 | ret = pci_register_driver(&qla4xxx_pci_driver); |
1729 | if (ret) | 1728 | if (ret) |
1730 | goto unregister_transport; | 1729 | goto unregister_transport; |
1731 | 1730 | ||
1732 | printk(KERN_INFO "QLogic iSCSI HBA Driver\n"); | 1731 | printk(KERN_INFO "QLogic iSCSI HBA Driver\n"); |
1733 | return 0; | 1732 | return 0; |
1733 | |||
1734 | unregister_transport: | 1734 | unregister_transport: |
1735 | iscsi_unregister_transport(&qla4xxx_iscsi_transport); | 1735 | iscsi_unregister_transport(&qla4xxx_iscsi_transport); |
1736 | release_srb_cache: | 1736 | release_srb_cache: |
diff --git a/drivers/scsi/qlogicfas408.c b/drivers/scsi/qlogicfas408.c index e0725353c99c..2e7db18f5aef 100644 --- a/drivers/scsi/qlogicfas408.c +++ b/drivers/scsi/qlogicfas408.c | |||
@@ -209,7 +209,7 @@ static int ql_wai(struct qlogicfas408_priv *priv) | |||
209 | * caller must hold host lock | 209 | * caller must hold host lock |
210 | */ | 210 | */ |
211 | 211 | ||
212 | static void ql_icmd(Scsi_Cmnd * cmd) | 212 | static void ql_icmd(struct scsi_cmnd *cmd) |
213 | { | 213 | { |
214 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); | 214 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); |
215 | int qbase = priv->qbase; | 215 | int qbase = priv->qbase; |
@@ -256,7 +256,7 @@ static void ql_icmd(Scsi_Cmnd * cmd) | |||
256 | * Process scsi command - usually after interrupt | 256 | * Process scsi command - usually after interrupt |
257 | */ | 257 | */ |
258 | 258 | ||
259 | static unsigned int ql_pcmd(Scsi_Cmnd * cmd) | 259 | static unsigned int ql_pcmd(struct scsi_cmnd *cmd) |
260 | { | 260 | { |
261 | unsigned int i, j; | 261 | unsigned int i, j; |
262 | unsigned long k; | 262 | unsigned long k; |
@@ -407,7 +407,7 @@ static unsigned int ql_pcmd(Scsi_Cmnd * cmd) | |||
407 | 407 | ||
408 | static void ql_ihandl(void *dev_id) | 408 | static void ql_ihandl(void *dev_id) |
409 | { | 409 | { |
410 | Scsi_Cmnd *icmd; | 410 | struct scsi_cmnd *icmd; |
411 | struct Scsi_Host *host = dev_id; | 411 | struct Scsi_Host *host = dev_id; |
412 | struct qlogicfas408_priv *priv = get_priv_by_host(host); | 412 | struct qlogicfas408_priv *priv = get_priv_by_host(host); |
413 | int qbase = priv->qbase; | 413 | int qbase = priv->qbase; |
@@ -447,7 +447,8 @@ irqreturn_t qlogicfas408_ihandl(int irq, void *dev_id) | |||
447 | * Queued command | 447 | * Queued command |
448 | */ | 448 | */ |
449 | 449 | ||
450 | int qlogicfas408_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) | 450 | int qlogicfas408_queuecommand(struct scsi_cmnd *cmd, |
451 | void (*done) (struct scsi_cmnd *)) | ||
451 | { | 452 | { |
452 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); | 453 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); |
453 | if (scmd_id(cmd) == priv->qinitid) { | 454 | if (scmd_id(cmd) == priv->qinitid) { |
@@ -470,9 +471,8 @@ int qlogicfas408_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) | |||
470 | * Return bios parameters | 471 | * Return bios parameters |
471 | */ | 472 | */ |
472 | 473 | ||
473 | int qlogicfas408_biosparam(struct scsi_device * disk, | 474 | int qlogicfas408_biosparam(struct scsi_device *disk, struct block_device *dev, |
474 | struct block_device *dev, | 475 | sector_t capacity, int ip[]) |
475 | sector_t capacity, int ip[]) | ||
476 | { | 476 | { |
477 | /* This should mimic the DOS Qlogic driver's behavior exactly */ | 477 | /* This should mimic the DOS Qlogic driver's behavior exactly */ |
478 | ip[0] = 0x40; | 478 | ip[0] = 0x40; |
@@ -494,7 +494,7 @@ int qlogicfas408_biosparam(struct scsi_device * disk, | |||
494 | * Abort a command in progress | 494 | * Abort a command in progress |
495 | */ | 495 | */ |
496 | 496 | ||
497 | int qlogicfas408_abort(Scsi_Cmnd * cmd) | 497 | int qlogicfas408_abort(struct scsi_cmnd *cmd) |
498 | { | 498 | { |
499 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); | 499 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); |
500 | priv->qabort = 1; | 500 | priv->qabort = 1; |
@@ -508,7 +508,7 @@ int qlogicfas408_abort(Scsi_Cmnd * cmd) | |||
508 | * the PCMCIA qlogic_stub code. This wants fixing | 508 | * the PCMCIA qlogic_stub code. This wants fixing |
509 | */ | 509 | */ |
510 | 510 | ||
511 | int qlogicfas408_bus_reset(Scsi_Cmnd * cmd) | 511 | int qlogicfas408_bus_reset(struct scsi_cmnd *cmd) |
512 | { | 512 | { |
513 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); | 513 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); |
514 | unsigned long flags; | 514 | unsigned long flags; |
diff --git a/drivers/scsi/qlogicfas408.h b/drivers/scsi/qlogicfas408.h index 8fd5555c75b1..260626427a32 100644 --- a/drivers/scsi/qlogicfas408.h +++ b/drivers/scsi/qlogicfas408.h | |||
@@ -75,15 +75,15 @@ | |||
75 | /*----------------------------------------------------------------*/ | 75 | /*----------------------------------------------------------------*/ |
76 | 76 | ||
77 | struct qlogicfas408_priv { | 77 | struct qlogicfas408_priv { |
78 | int qbase; /* Port */ | 78 | int qbase; /* Port */ |
79 | int qinitid; /* initiator ID */ | 79 | int qinitid; /* initiator ID */ |
80 | int qabort; /* Flag to cause an abort */ | 80 | int qabort; /* Flag to cause an abort */ |
81 | int qlirq; /* IRQ being used */ | 81 | int qlirq; /* IRQ being used */ |
82 | int int_type; /* type of irq, 2 for ISA board, 0 for PCMCIA */ | 82 | int int_type; /* type of irq, 2 for ISA board, 0 for PCMCIA */ |
83 | char qinfo[80]; /* description */ | 83 | char qinfo[80]; /* description */ |
84 | Scsi_Cmnd *qlcmd; /* current command being processed */ | 84 | struct scsi_cmnd *qlcmd; /* current command being processed */ |
85 | struct Scsi_Host *shost; /* pointer back to host */ | 85 | struct Scsi_Host *shost; /* pointer back to host */ |
86 | struct qlogicfas408_priv *next; /* next private struct */ | 86 | struct qlogicfas408_priv *next; /* next private struct */ |
87 | }; | 87 | }; |
88 | 88 | ||
89 | /* The qlogic card uses two register maps - These macros select which one */ | 89 | /* The qlogic card uses two register maps - These macros select which one */ |
@@ -103,12 +103,13 @@ struct qlogicfas408_priv { | |||
103 | #define get_priv_by_host(x) (struct qlogicfas408_priv *)&((x)->hostdata[0]) | 103 | #define get_priv_by_host(x) (struct qlogicfas408_priv *)&((x)->hostdata[0]) |
104 | 104 | ||
105 | irqreturn_t qlogicfas408_ihandl(int irq, void *dev_id); | 105 | irqreturn_t qlogicfas408_ihandl(int irq, void *dev_id); |
106 | int qlogicfas408_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)); | 106 | int qlogicfas408_queuecommand(struct scsi_cmnd * cmd, |
107 | void (*done) (struct scsi_cmnd *)); | ||
107 | int qlogicfas408_biosparam(struct scsi_device * disk, | 108 | int qlogicfas408_biosparam(struct scsi_device * disk, |
108 | struct block_device *dev, | 109 | struct block_device *dev, |
109 | sector_t capacity, int ip[]); | 110 | sector_t capacity, int ip[]); |
110 | int qlogicfas408_abort(Scsi_Cmnd * cmd); | 111 | int qlogicfas408_abort(struct scsi_cmnd * cmd); |
111 | int qlogicfas408_bus_reset(Scsi_Cmnd * cmd); | 112 | int qlogicfas408_bus_reset(struct scsi_cmnd * cmd); |
112 | const char *qlogicfas408_info(struct Scsi_Host *host); | 113 | const char *qlogicfas408_info(struct Scsi_Host *host); |
113 | int qlogicfas408_get_chip_type(int qbase, int int_type); | 114 | int qlogicfas408_get_chip_type(int qbase, int int_type); |
114 | void qlogicfas408_setup(int qbase, int id, int int_type); | 115 | void qlogicfas408_setup(int qbase, int id, int int_type); |
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 9c0f35820e3e..30ee3d72c021 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c | |||
@@ -52,7 +52,7 @@ | |||
52 | #include "scsi_debug.h" | 52 | #include "scsi_debug.h" |
53 | 53 | ||
54 | #define SCSI_DEBUG_VERSION "1.80" | 54 | #define SCSI_DEBUG_VERSION "1.80" |
55 | static const char * scsi_debug_version_date = "20060914"; | 55 | static const char * scsi_debug_version_date = "20061018"; |
56 | 56 | ||
57 | /* Additional Sense Code (ASC) used */ | 57 | /* Additional Sense Code (ASC) used */ |
58 | #define NO_ADDITIONAL_SENSE 0x0 | 58 | #define NO_ADDITIONAL_SENSE 0x0 |
@@ -254,6 +254,8 @@ static int resp_requests(struct scsi_cmnd * SCpnt, | |||
254 | struct sdebug_dev_info * devip); | 254 | struct sdebug_dev_info * devip); |
255 | static int resp_start_stop(struct scsi_cmnd * scp, | 255 | static int resp_start_stop(struct scsi_cmnd * scp, |
256 | struct sdebug_dev_info * devip); | 256 | struct sdebug_dev_info * devip); |
257 | static int resp_report_tgtpgs(struct scsi_cmnd * scp, | ||
258 | struct sdebug_dev_info * devip); | ||
257 | static int resp_readcap(struct scsi_cmnd * SCpnt, | 259 | static int resp_readcap(struct scsi_cmnd * SCpnt, |
258 | struct sdebug_dev_info * devip); | 260 | struct sdebug_dev_info * devip); |
259 | static int resp_readcap16(struct scsi_cmnd * SCpnt, | 261 | static int resp_readcap16(struct scsi_cmnd * SCpnt, |
@@ -287,9 +289,9 @@ static void __init sdebug_build_parts(unsigned char * ramp); | |||
287 | static void __init init_all_queued(void); | 289 | static void __init init_all_queued(void); |
288 | static void stop_all_queued(void); | 290 | static void stop_all_queued(void); |
289 | static int stop_queued_cmnd(struct scsi_cmnd * cmnd); | 291 | static int stop_queued_cmnd(struct scsi_cmnd * cmnd); |
290 | static int inquiry_evpd_83(unsigned char * arr, int target_dev_id, | 292 | static int inquiry_evpd_83(unsigned char * arr, int port_group_id, |
291 | int dev_id_num, const char * dev_id_str, | 293 | int target_dev_id, int dev_id_num, |
292 | int dev_id_str_len); | 294 | const char * dev_id_str, int dev_id_str_len); |
293 | static int inquiry_evpd_88(unsigned char * arr, int target_dev_id); | 295 | static int inquiry_evpd_88(unsigned char * arr, int target_dev_id); |
294 | static int do_create_driverfs_files(void); | 296 | static int do_create_driverfs_files(void); |
295 | static void do_remove_driverfs_files(void); | 297 | static void do_remove_driverfs_files(void); |
@@ -422,6 +424,15 @@ int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done) | |||
422 | } | 424 | } |
423 | errsts = resp_readcap16(SCpnt, devip); | 425 | errsts = resp_readcap16(SCpnt, devip); |
424 | break; | 426 | break; |
427 | case MAINTENANCE_IN: | ||
428 | if (MI_REPORT_TARGET_PGS != cmd[1]) { | ||
429 | mk_sense_buffer(devip, ILLEGAL_REQUEST, | ||
430 | INVALID_OPCODE, 0); | ||
431 | errsts = check_condition_result; | ||
432 | break; | ||
433 | } | ||
434 | errsts = resp_report_tgtpgs(SCpnt, devip); | ||
435 | break; | ||
425 | case READ_16: | 436 | case READ_16: |
426 | case READ_12: | 437 | case READ_12: |
427 | case READ_10: | 438 | case READ_10: |
@@ -665,8 +676,9 @@ static const char * inq_vendor_id = "Linux "; | |||
665 | static const char * inq_product_id = "scsi_debug "; | 676 | static const char * inq_product_id = "scsi_debug "; |
666 | static const char * inq_product_rev = "0004"; | 677 | static const char * inq_product_rev = "0004"; |
667 | 678 | ||
668 | static int inquiry_evpd_83(unsigned char * arr, int target_dev_id, | 679 | static int inquiry_evpd_83(unsigned char * arr, int port_group_id, |
669 | int dev_id_num, const char * dev_id_str, | 680 | int target_dev_id, int dev_id_num, |
681 | const char * dev_id_str, | ||
670 | int dev_id_str_len) | 682 | int dev_id_str_len) |
671 | { | 683 | { |
672 | int num, port_a; | 684 | int num, port_a; |
@@ -720,6 +732,15 @@ static int inquiry_evpd_83(unsigned char * arr, int target_dev_id, | |||
720 | arr[num++] = (port_a >> 16) & 0xff; | 732 | arr[num++] = (port_a >> 16) & 0xff; |
721 | arr[num++] = (port_a >> 8) & 0xff; | 733 | arr[num++] = (port_a >> 8) & 0xff; |
722 | arr[num++] = port_a & 0xff; | 734 | arr[num++] = port_a & 0xff; |
735 | /* NAA-5, Target port group identifier */ | ||
736 | arr[num++] = 0x61; /* proto=sas, binary */ | ||
737 | arr[num++] = 0x95; /* piv=1, target port group id */ | ||
738 | arr[num++] = 0x0; | ||
739 | arr[num++] = 0x4; | ||
740 | arr[num++] = 0; | ||
741 | arr[num++] = 0; | ||
742 | arr[num++] = (port_group_id >> 8) & 0xff; | ||
743 | arr[num++] = port_group_id & 0xff; | ||
723 | /* NAA-5, Target device identifier */ | 744 | /* NAA-5, Target device identifier */ |
724 | arr[num++] = 0x61; /* proto=sas, binary */ | 745 | arr[num++] = 0x61; /* proto=sas, binary */ |
725 | arr[num++] = 0xa3; /* piv=1, target device, naa */ | 746 | arr[num++] = 0xa3; /* piv=1, target device, naa */ |
@@ -928,12 +949,12 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target, | |||
928 | struct sdebug_dev_info * devip) | 949 | struct sdebug_dev_info * devip) |
929 | { | 950 | { |
930 | unsigned char pq_pdt; | 951 | unsigned char pq_pdt; |
931 | unsigned char arr[SDEBUG_MAX_INQ_ARR_SZ]; | 952 | unsigned char * arr; |
932 | unsigned char *cmd = (unsigned char *)scp->cmnd; | 953 | unsigned char *cmd = (unsigned char *)scp->cmnd; |
933 | int alloc_len, n; | 954 | int alloc_len, n, ret; |
934 | 955 | ||
935 | alloc_len = (cmd[3] << 8) + cmd[4]; | 956 | alloc_len = (cmd[3] << 8) + cmd[4]; |
936 | memset(arr, 0, SDEBUG_MAX_INQ_ARR_SZ); | 957 | arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_KERNEL); |
937 | if (devip->wlun) | 958 | if (devip->wlun) |
938 | pq_pdt = 0x1e; /* present, wlun */ | 959 | pq_pdt = 0x1e; /* present, wlun */ |
939 | else if (scsi_debug_no_lun_0 && (0 == devip->lun)) | 960 | else if (scsi_debug_no_lun_0 && (0 == devip->lun)) |
@@ -944,12 +965,15 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target, | |||
944 | if (0x2 & cmd[1]) { /* CMDDT bit set */ | 965 | if (0x2 & cmd[1]) { /* CMDDT bit set */ |
945 | mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, | 966 | mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, |
946 | 0); | 967 | 0); |
968 | kfree(arr); | ||
947 | return check_condition_result; | 969 | return check_condition_result; |
948 | } else if (0x1 & cmd[1]) { /* EVPD bit set */ | 970 | } else if (0x1 & cmd[1]) { /* EVPD bit set */ |
949 | int lu_id_num, target_dev_id, len; | 971 | int lu_id_num, port_group_id, target_dev_id, len; |
950 | char lu_id_str[6]; | 972 | char lu_id_str[6]; |
951 | int host_no = devip->sdbg_host->shost->host_no; | 973 | int host_no = devip->sdbg_host->shost->host_no; |
952 | 974 | ||
975 | port_group_id = (((host_no + 1) & 0x7f) << 8) + | ||
976 | (devip->channel & 0x7f); | ||
953 | if (0 == scsi_debug_vpd_use_hostno) | 977 | if (0 == scsi_debug_vpd_use_hostno) |
954 | host_no = 0; | 978 | host_no = 0; |
955 | lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) + | 979 | lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) + |
@@ -977,8 +1001,9 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target, | |||
977 | memcpy(&arr[4], lu_id_str, len); | 1001 | memcpy(&arr[4], lu_id_str, len); |
978 | } else if (0x83 == cmd[2]) { /* device identification */ | 1002 | } else if (0x83 == cmd[2]) { /* device identification */ |
979 | arr[1] = cmd[2]; /*sanity */ | 1003 | arr[1] = cmd[2]; /*sanity */ |
980 | arr[3] = inquiry_evpd_83(&arr[4], target_dev_id, | 1004 | arr[3] = inquiry_evpd_83(&arr[4], port_group_id, |
981 | lu_id_num, lu_id_str, len); | 1005 | target_dev_id, lu_id_num, |
1006 | lu_id_str, len); | ||
982 | } else if (0x84 == cmd[2]) { /* Software interface ident. */ | 1007 | } else if (0x84 == cmd[2]) { /* Software interface ident. */ |
983 | arr[1] = cmd[2]; /*sanity */ | 1008 | arr[1] = cmd[2]; /*sanity */ |
984 | arr[3] = inquiry_evpd_84(&arr[4]); | 1009 | arr[3] = inquiry_evpd_84(&arr[4]); |
@@ -1012,17 +1037,22 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target, | |||
1012 | /* Illegal request, invalid field in cdb */ | 1037 | /* Illegal request, invalid field in cdb */ |
1013 | mk_sense_buffer(devip, ILLEGAL_REQUEST, | 1038 | mk_sense_buffer(devip, ILLEGAL_REQUEST, |
1014 | INVALID_FIELD_IN_CDB, 0); | 1039 | INVALID_FIELD_IN_CDB, 0); |
1040 | kfree(arr); | ||
1015 | return check_condition_result; | 1041 | return check_condition_result; |
1016 | } | 1042 | } |
1017 | len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len); | 1043 | len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len); |
1018 | return fill_from_dev_buffer(scp, arr, | 1044 | ret = fill_from_dev_buffer(scp, arr, |
1019 | min(len, SDEBUG_MAX_INQ_ARR_SZ)); | 1045 | min(len, SDEBUG_MAX_INQ_ARR_SZ)); |
1046 | kfree(arr); | ||
1047 | return ret; | ||
1020 | } | 1048 | } |
1021 | /* drops through here for a standard inquiry */ | 1049 | /* drops through here for a standard inquiry */ |
1022 | arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0; /* Removable disk */ | 1050 | arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0; /* Removable disk */ |
1023 | arr[2] = scsi_debug_scsi_level; | 1051 | arr[2] = scsi_debug_scsi_level; |
1024 | arr[3] = 2; /* response_data_format==2 */ | 1052 | arr[3] = 2; /* response_data_format==2 */ |
1025 | arr[4] = SDEBUG_LONG_INQ_SZ - 5; | 1053 | arr[4] = SDEBUG_LONG_INQ_SZ - 5; |
1054 | if (0 == scsi_debug_vpd_use_hostno) | ||
1055 | arr[5] = 0x10; /* claim: implicit TGPS */ | ||
1026 | arr[6] = 0x10; /* claim: MultiP */ | 1056 | arr[6] = 0x10; /* claim: MultiP */ |
1027 | /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */ | 1057 | /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */ |
1028 | arr[7] = 0xa; /* claim: LINKED + CMDQUE */ | 1058 | arr[7] = 0xa; /* claim: LINKED + CMDQUE */ |
@@ -1039,8 +1069,10 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target, | |||
1039 | arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */ | 1069 | arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */ |
1040 | } | 1070 | } |
1041 | arr[n++] = 0xc; arr[n++] = 0xf; /* SAS-1.1 rev 10 */ | 1071 | arr[n++] = 0xc; arr[n++] = 0xf; /* SAS-1.1 rev 10 */ |
1042 | return fill_from_dev_buffer(scp, arr, | 1072 | ret = fill_from_dev_buffer(scp, arr, |
1043 | min(alloc_len, SDEBUG_LONG_INQ_SZ)); | 1073 | min(alloc_len, SDEBUG_LONG_INQ_SZ)); |
1074 | kfree(arr); | ||
1075 | return ret; | ||
1044 | } | 1076 | } |
1045 | 1077 | ||
1046 | static int resp_requests(struct scsi_cmnd * scp, | 1078 | static int resp_requests(struct scsi_cmnd * scp, |
@@ -1171,6 +1203,87 @@ static int resp_readcap16(struct scsi_cmnd * scp, | |||
1171 | min(alloc_len, SDEBUG_READCAP16_ARR_SZ)); | 1203 | min(alloc_len, SDEBUG_READCAP16_ARR_SZ)); |
1172 | } | 1204 | } |
1173 | 1205 | ||
1206 | #define SDEBUG_MAX_TGTPGS_ARR_SZ 1412 | ||
1207 | |||
1208 | static int resp_report_tgtpgs(struct scsi_cmnd * scp, | ||
1209 | struct sdebug_dev_info * devip) | ||
1210 | { | ||
1211 | unsigned char *cmd = (unsigned char *)scp->cmnd; | ||
1212 | unsigned char * arr; | ||
1213 | int host_no = devip->sdbg_host->shost->host_no; | ||
1214 | int n, ret, alen, rlen; | ||
1215 | int port_group_a, port_group_b, port_a, port_b; | ||
1216 | |||
1217 | alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8) | ||
1218 | + cmd[9]); | ||
1219 | |||
1220 | arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_KERNEL); | ||
1221 | /* | ||
1222 | * EVPD page 0x88 states we have two ports, one | ||
1223 | * real and a fake port with no device connected. | ||
1224 | * So we create two port groups with one port each | ||
1225 | * and set the group with port B to unavailable. | ||
1226 | */ | ||
1227 | port_a = 0x1; /* relative port A */ | ||
1228 | port_b = 0x2; /* relative port B */ | ||
1229 | port_group_a = (((host_no + 1) & 0x7f) << 8) + | ||
1230 | (devip->channel & 0x7f); | ||
1231 | port_group_b = (((host_no + 1) & 0x7f) << 8) + | ||
1232 | (devip->channel & 0x7f) + 0x80; | ||
1233 | |||
1234 | /* | ||
1235 | * The asymmetric access state is cycled according to the host_id. | ||
1236 | */ | ||
1237 | n = 4; | ||
1238 | if (0 == scsi_debug_vpd_use_hostno) { | ||
1239 | arr[n++] = host_no % 3; /* Asymm access state */ | ||
1240 | arr[n++] = 0x0F; /* claim: all states are supported */ | ||
1241 | } else { | ||
1242 | arr[n++] = 0x0; /* Active/Optimized path */ | ||
1243 | arr[n++] = 0x01; /* claim: only support active/optimized paths */ | ||
1244 | } | ||
1245 | arr[n++] = (port_group_a >> 8) & 0xff; | ||
1246 | arr[n++] = port_group_a & 0xff; | ||
1247 | arr[n++] = 0; /* Reserved */ | ||
1248 | arr[n++] = 0; /* Status code */ | ||
1249 | arr[n++] = 0; /* Vendor unique */ | ||
1250 | arr[n++] = 0x1; /* One port per group */ | ||
1251 | arr[n++] = 0; /* Reserved */ | ||
1252 | arr[n++] = 0; /* Reserved */ | ||
1253 | arr[n++] = (port_a >> 8) & 0xff; | ||
1254 | arr[n++] = port_a & 0xff; | ||
1255 | arr[n++] = 3; /* Port unavailable */ | ||
1256 | arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */ | ||
1257 | arr[n++] = (port_group_b >> 8) & 0xff; | ||
1258 | arr[n++] = port_group_b & 0xff; | ||
1259 | arr[n++] = 0; /* Reserved */ | ||
1260 | arr[n++] = 0; /* Status code */ | ||
1261 | arr[n++] = 0; /* Vendor unique */ | ||
1262 | arr[n++] = 0x1; /* One port per group */ | ||
1263 | arr[n++] = 0; /* Reserved */ | ||
1264 | arr[n++] = 0; /* Reserved */ | ||
1265 | arr[n++] = (port_b >> 8) & 0xff; | ||
1266 | arr[n++] = port_b & 0xff; | ||
1267 | |||
1268 | rlen = n - 4; | ||
1269 | arr[0] = (rlen >> 24) & 0xff; | ||
1270 | arr[1] = (rlen >> 16) & 0xff; | ||
1271 | arr[2] = (rlen >> 8) & 0xff; | ||
1272 | arr[3] = rlen & 0xff; | ||
1273 | |||
1274 | /* | ||
1275 | * Return the smallest value of either | ||
1276 | * - The allocated length | ||
1277 | * - The constructed command length | ||
1278 | * - The maximum array size | ||
1279 | */ | ||
1280 | rlen = min(alen,n); | ||
1281 | ret = fill_from_dev_buffer(scp, arr, | ||
1282 | min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ)); | ||
1283 | kfree(arr); | ||
1284 | return ret; | ||
1285 | } | ||
1286 | |||
1174 | /* <<Following mode page info copied from ST318451LW>> */ | 1287 | /* <<Following mode page info copied from ST318451LW>> */ |
1175 | 1288 | ||
1176 | static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target) | 1289 | static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target) |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 743f67ed7640..3ac4890ce086 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -410,6 +410,7 @@ int scsi_execute_async(struct scsi_device *sdev, const unsigned char *cmd, | |||
410 | goto free_req; | 410 | goto free_req; |
411 | 411 | ||
412 | req->cmd_len = cmd_len; | 412 | req->cmd_len = cmd_len; |
413 | memset(req->cmd, 0, BLK_MAX_CDB); /* ATAPI hates garbage after CDB */ | ||
413 | memcpy(req->cmd, cmd, req->cmd_len); | 414 | memcpy(req->cmd, cmd, req->cmd_len); |
414 | req->sense = sioc->sense; | 415 | req->sense = sioc->sense; |
415 | req->sense_len = 0; | 416 | req->sense_len = 0; |
@@ -1084,7 +1085,7 @@ static void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd) | |||
1084 | { | 1085 | { |
1085 | struct request *req = cmd->request; | 1086 | struct request *req = cmd->request; |
1086 | 1087 | ||
1087 | BUG_ON(sizeof(req->cmd) > sizeof(cmd->cmnd)); | 1088 | BUILD_BUG_ON(sizeof(req->cmd) > sizeof(cmd->cmnd)); |
1088 | memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd)); | 1089 | memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd)); |
1089 | cmd->cmd_len = req->cmd_len; | 1090 | cmd->cmd_len = req->cmd_len; |
1090 | if (!req->data_len) | 1091 | if (!req->data_len) |
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index fd9e281c3bfe..94a274645f6f 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c | |||
@@ -631,12 +631,22 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result, | |||
631 | * scanning run at their own risk, or supply a user level program | 631 | * scanning run at their own risk, or supply a user level program |
632 | * that can correctly scan. | 632 | * that can correctly scan. |
633 | */ | 633 | */ |
634 | sdev->inquiry = kmalloc(sdev->inquiry_len, GFP_ATOMIC); | 634 | |
635 | if (sdev->inquiry == NULL) { | 635 | /* |
636 | * Copy at least 36 bytes of INQUIRY data, so that we don't | ||
637 | * dereference unallocated memory when accessing the Vendor, | ||
638 | * Product, and Revision strings. Badly behaved devices may set | ||
639 | * the INQUIRY Additional Length byte to a small value, indicating | ||
640 | * these strings are invalid, but often they contain plausible data | ||
641 | * nonetheless. It doesn't matter if the device sent < 36 bytes | ||
642 | * total, since scsi_probe_lun() initializes inq_result with 0s. | ||
643 | */ | ||
644 | sdev->inquiry = kmemdup(inq_result, | ||
645 | max_t(size_t, sdev->inquiry_len, 36), | ||
646 | GFP_ATOMIC); | ||
647 | if (sdev->inquiry == NULL) | ||
636 | return SCSI_SCAN_NO_RESPONSE; | 648 | return SCSI_SCAN_NO_RESPONSE; |
637 | } | ||
638 | 649 | ||
639 | memcpy(sdev->inquiry, inq_result, sdev->inquiry_len); | ||
640 | sdev->vendor = (char *) (sdev->inquiry + 8); | 650 | sdev->vendor = (char *) (sdev->inquiry + 8); |
641 | sdev->model = (char *) (sdev->inquiry + 16); | 651 | sdev->model = (char *) (sdev->inquiry + 16); |
642 | sdev->rev = (char *) (sdev->inquiry + 32); | 652 | sdev->rev = (char *) (sdev->inquiry + 32); |
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index e7fe565b96de..e1a91665d1c2 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
@@ -192,6 +192,7 @@ static CLASS_DEVICE_ATTR(state, S_IRUGO | S_IWUSR, show_shost_state, store_shost | |||
192 | shost_rd_attr(unique_id, "%u\n"); | 192 | shost_rd_attr(unique_id, "%u\n"); |
193 | shost_rd_attr(host_busy, "%hu\n"); | 193 | shost_rd_attr(host_busy, "%hu\n"); |
194 | shost_rd_attr(cmd_per_lun, "%hd\n"); | 194 | shost_rd_attr(cmd_per_lun, "%hd\n"); |
195 | shost_rd_attr(can_queue, "%hd\n"); | ||
195 | shost_rd_attr(sg_tablesize, "%hu\n"); | 196 | shost_rd_attr(sg_tablesize, "%hu\n"); |
196 | shost_rd_attr(unchecked_isa_dma, "%d\n"); | 197 | shost_rd_attr(unchecked_isa_dma, "%d\n"); |
197 | shost_rd_attr2(proc_name, hostt->proc_name, "%s\n"); | 198 | shost_rd_attr2(proc_name, hostt->proc_name, "%s\n"); |
@@ -200,6 +201,7 @@ static struct class_device_attribute *scsi_sysfs_shost_attrs[] = { | |||
200 | &class_device_attr_unique_id, | 201 | &class_device_attr_unique_id, |
201 | &class_device_attr_host_busy, | 202 | &class_device_attr_host_busy, |
202 | &class_device_attr_cmd_per_lun, | 203 | &class_device_attr_cmd_per_lun, |
204 | &class_device_attr_can_queue, | ||
203 | &class_device_attr_sg_tablesize, | 205 | &class_device_attr_sg_tablesize, |
204 | &class_device_attr_unchecked_isa_dma, | 206 | &class_device_attr_unchecked_isa_dma, |
205 | &class_device_attr_proc_name, | 207 | &class_device_attr_proc_name, |
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 7b0019cccce3..9b25124a989e 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c | |||
@@ -21,7 +21,6 @@ | |||
21 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 21 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
22 | */ | 22 | */ |
23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
24 | #include <linux/mempool.h> | ||
25 | #include <linux/mutex.h> | 24 | #include <linux/mutex.h> |
26 | #include <net/tcp.h> | 25 | #include <net/tcp.h> |
27 | #include <scsi/scsi.h> | 26 | #include <scsi/scsi.h> |
@@ -34,7 +33,7 @@ | |||
34 | #define ISCSI_SESSION_ATTRS 11 | 33 | #define ISCSI_SESSION_ATTRS 11 |
35 | #define ISCSI_CONN_ATTRS 11 | 34 | #define ISCSI_CONN_ATTRS 11 |
36 | #define ISCSI_HOST_ATTRS 0 | 35 | #define ISCSI_HOST_ATTRS 0 |
37 | #define ISCSI_TRANSPORT_VERSION "2.0-685" | 36 | #define ISCSI_TRANSPORT_VERSION "2.0-724" |
38 | 37 | ||
39 | struct iscsi_internal { | 38 | struct iscsi_internal { |
40 | int daemon_pid; | 39 | int daemon_pid; |
@@ -149,30 +148,6 @@ static DECLARE_TRANSPORT_CLASS(iscsi_connection_class, | |||
149 | static struct sock *nls; | 148 | static struct sock *nls; |
150 | static DEFINE_MUTEX(rx_queue_mutex); | 149 | static DEFINE_MUTEX(rx_queue_mutex); |
151 | 150 | ||
152 | struct mempool_zone { | ||
153 | mempool_t *pool; | ||
154 | atomic_t allocated; | ||
155 | int size; | ||
156 | int hiwat; | ||
157 | struct list_head freequeue; | ||
158 | spinlock_t freelock; | ||
159 | }; | ||
160 | |||
161 | static struct mempool_zone *z_reply; | ||
162 | |||
163 | /* | ||
164 | * Z_MAX_* - actual mempool size allocated at the mempool_zone_init() time | ||
165 | * Z_HIWAT_* - zone's high watermark when if_error bit will be set to -ENOMEM | ||
166 | * so daemon will notice OOM on NETLINK tranposrt level and will | ||
167 | * be able to predict or change operational behavior | ||
168 | */ | ||
169 | #define Z_MAX_REPLY 8 | ||
170 | #define Z_HIWAT_REPLY 6 | ||
171 | #define Z_MAX_PDU 8 | ||
172 | #define Z_HIWAT_PDU 6 | ||
173 | #define Z_MAX_ERROR 16 | ||
174 | #define Z_HIWAT_ERROR 12 | ||
175 | |||
176 | static LIST_HEAD(sesslist); | 151 | static LIST_HEAD(sesslist); |
177 | static DEFINE_SPINLOCK(sesslock); | 152 | static DEFINE_SPINLOCK(sesslock); |
178 | static LIST_HEAD(connlist); | 153 | static LIST_HEAD(connlist); |
@@ -414,59 +389,11 @@ int iscsi_destroy_session(struct iscsi_cls_session *session) | |||
414 | } | 389 | } |
415 | EXPORT_SYMBOL_GPL(iscsi_destroy_session); | 390 | EXPORT_SYMBOL_GPL(iscsi_destroy_session); |
416 | 391 | ||
417 | static void mempool_zone_destroy(struct mempool_zone *zp) | ||
418 | { | ||
419 | mempool_destroy(zp->pool); | ||
420 | kfree(zp); | ||
421 | } | ||
422 | |||
423 | static void* | ||
424 | mempool_zone_alloc_skb(gfp_t gfp_mask, void *pool_data) | ||
425 | { | ||
426 | struct mempool_zone *zone = pool_data; | ||
427 | |||
428 | return alloc_skb(zone->size, gfp_mask); | ||
429 | } | ||
430 | |||
431 | static void | ||
432 | mempool_zone_free_skb(void *element, void *pool_data) | ||
433 | { | ||
434 | kfree_skb(element); | ||
435 | } | ||
436 | |||
437 | static struct mempool_zone * | ||
438 | mempool_zone_init(unsigned max, unsigned size, unsigned hiwat) | ||
439 | { | ||
440 | struct mempool_zone *zp; | ||
441 | |||
442 | zp = kzalloc(sizeof(*zp), GFP_KERNEL); | ||
443 | if (!zp) | ||
444 | return NULL; | ||
445 | |||
446 | zp->size = size; | ||
447 | zp->hiwat = hiwat; | ||
448 | INIT_LIST_HEAD(&zp->freequeue); | ||
449 | spin_lock_init(&zp->freelock); | ||
450 | atomic_set(&zp->allocated, 0); | ||
451 | |||
452 | zp->pool = mempool_create(max, mempool_zone_alloc_skb, | ||
453 | mempool_zone_free_skb, zp); | ||
454 | if (!zp->pool) { | ||
455 | kfree(zp); | ||
456 | return NULL; | ||
457 | } | ||
458 | |||
459 | return zp; | ||
460 | } | ||
461 | |||
462 | static void iscsi_conn_release(struct device *dev) | 392 | static void iscsi_conn_release(struct device *dev) |
463 | { | 393 | { |
464 | struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev); | 394 | struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev); |
465 | struct device *parent = conn->dev.parent; | 395 | struct device *parent = conn->dev.parent; |
466 | 396 | ||
467 | mempool_zone_destroy(conn->z_pdu); | ||
468 | mempool_zone_destroy(conn->z_error); | ||
469 | |||
470 | kfree(conn); | 397 | kfree(conn); |
471 | put_device(parent); | 398 | put_device(parent); |
472 | } | 399 | } |
@@ -476,31 +403,6 @@ static int iscsi_is_conn_dev(const struct device *dev) | |||
476 | return dev->release == iscsi_conn_release; | 403 | return dev->release == iscsi_conn_release; |
477 | } | 404 | } |
478 | 405 | ||
479 | static int iscsi_create_event_pools(struct iscsi_cls_conn *conn) | ||
480 | { | ||
481 | conn->z_pdu = mempool_zone_init(Z_MAX_PDU, | ||
482 | NLMSG_SPACE(sizeof(struct iscsi_uevent) + | ||
483 | sizeof(struct iscsi_hdr) + | ||
484 | DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH), | ||
485 | Z_HIWAT_PDU); | ||
486 | if (!conn->z_pdu) { | ||
487 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate " | ||
488 | "pdu zone for new conn\n"); | ||
489 | return -ENOMEM; | ||
490 | } | ||
491 | |||
492 | conn->z_error = mempool_zone_init(Z_MAX_ERROR, | ||
493 | NLMSG_SPACE(sizeof(struct iscsi_uevent)), | ||
494 | Z_HIWAT_ERROR); | ||
495 | if (!conn->z_error) { | ||
496 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate " | ||
497 | "error zone for new conn\n"); | ||
498 | mempool_zone_destroy(conn->z_pdu); | ||
499 | return -ENOMEM; | ||
500 | } | ||
501 | return 0; | ||
502 | } | ||
503 | |||
504 | /** | 406 | /** |
505 | * iscsi_create_conn - create iscsi class connection | 407 | * iscsi_create_conn - create iscsi class connection |
506 | * @session: iscsi cls session | 408 | * @session: iscsi cls session |
@@ -533,12 +435,9 @@ iscsi_create_conn(struct iscsi_cls_session *session, uint32_t cid) | |||
533 | conn->transport = transport; | 435 | conn->transport = transport; |
534 | conn->cid = cid; | 436 | conn->cid = cid; |
535 | 437 | ||
536 | if (iscsi_create_event_pools(conn)) | ||
537 | goto free_conn; | ||
538 | |||
539 | /* this is released in the dev's release function */ | 438 | /* this is released in the dev's release function */ |
540 | if (!get_device(&session->dev)) | 439 | if (!get_device(&session->dev)) |
541 | goto free_conn_pools; | 440 | goto free_conn; |
542 | 441 | ||
543 | snprintf(conn->dev.bus_id, BUS_ID_SIZE, "connection%d:%u", | 442 | snprintf(conn->dev.bus_id, BUS_ID_SIZE, "connection%d:%u", |
544 | session->sid, cid); | 443 | session->sid, cid); |
@@ -555,8 +454,6 @@ iscsi_create_conn(struct iscsi_cls_session *session, uint32_t cid) | |||
555 | 454 | ||
556 | release_parent_ref: | 455 | release_parent_ref: |
557 | put_device(&session->dev); | 456 | put_device(&session->dev); |
558 | free_conn_pools: | ||
559 | |||
560 | free_conn: | 457 | free_conn: |
561 | kfree(conn); | 458 | kfree(conn); |
562 | return NULL; | 459 | return NULL; |
@@ -599,81 +496,31 @@ iscsi_if_transport_lookup(struct iscsi_transport *tt) | |||
599 | return NULL; | 496 | return NULL; |
600 | } | 497 | } |
601 | 498 | ||
602 | static inline struct list_head *skb_to_lh(struct sk_buff *skb) | ||
603 | { | ||
604 | return (struct list_head *)&skb->cb; | ||
605 | } | ||
606 | |||
607 | static void | ||
608 | mempool_zone_complete(struct mempool_zone *zone) | ||
609 | { | ||
610 | unsigned long flags; | ||
611 | struct list_head *lh, *n; | ||
612 | |||
613 | spin_lock_irqsave(&zone->freelock, flags); | ||
614 | list_for_each_safe(lh, n, &zone->freequeue) { | ||
615 | struct sk_buff *skb = (struct sk_buff *)((char *)lh - | ||
616 | offsetof(struct sk_buff, cb)); | ||
617 | if (!skb_shared(skb)) { | ||
618 | list_del(skb_to_lh(skb)); | ||
619 | mempool_free(skb, zone->pool); | ||
620 | atomic_dec(&zone->allocated); | ||
621 | } | ||
622 | } | ||
623 | spin_unlock_irqrestore(&zone->freelock, flags); | ||
624 | } | ||
625 | |||
626 | static struct sk_buff* | ||
627 | mempool_zone_get_skb(struct mempool_zone *zone) | ||
628 | { | ||
629 | struct sk_buff *skb; | ||
630 | |||
631 | skb = mempool_alloc(zone->pool, GFP_ATOMIC); | ||
632 | if (skb) | ||
633 | atomic_inc(&zone->allocated); | ||
634 | return skb; | ||
635 | } | ||
636 | |||
637 | static int | 499 | static int |
638 | iscsi_broadcast_skb(struct mempool_zone *zone, struct sk_buff *skb, gfp_t gfp) | 500 | iscsi_broadcast_skb(struct sk_buff *skb, gfp_t gfp) |
639 | { | 501 | { |
640 | unsigned long flags; | ||
641 | int rc; | 502 | int rc; |
642 | 503 | ||
643 | skb_get(skb); | ||
644 | rc = netlink_broadcast(nls, skb, 0, 1, gfp); | 504 | rc = netlink_broadcast(nls, skb, 0, 1, gfp); |
645 | if (rc < 0) { | 505 | if (rc < 0) { |
646 | mempool_free(skb, zone->pool); | ||
647 | printk(KERN_ERR "iscsi: can not broadcast skb (%d)\n", rc); | 506 | printk(KERN_ERR "iscsi: can not broadcast skb (%d)\n", rc); |
648 | return rc; | 507 | return rc; |
649 | } | 508 | } |
650 | 509 | ||
651 | spin_lock_irqsave(&zone->freelock, flags); | ||
652 | INIT_LIST_HEAD(skb_to_lh(skb)); | ||
653 | list_add(skb_to_lh(skb), &zone->freequeue); | ||
654 | spin_unlock_irqrestore(&zone->freelock, flags); | ||
655 | return 0; | 510 | return 0; |
656 | } | 511 | } |
657 | 512 | ||
658 | static int | 513 | static int |
659 | iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb, int pid) | 514 | iscsi_unicast_skb(struct sk_buff *skb, int pid) |
660 | { | 515 | { |
661 | unsigned long flags; | ||
662 | int rc; | 516 | int rc; |
663 | 517 | ||
664 | skb_get(skb); | ||
665 | rc = netlink_unicast(nls, skb, pid, MSG_DONTWAIT); | 518 | rc = netlink_unicast(nls, skb, pid, MSG_DONTWAIT); |
666 | if (rc < 0) { | 519 | if (rc < 0) { |
667 | mempool_free(skb, zone->pool); | ||
668 | printk(KERN_ERR "iscsi: can not unicast skb (%d)\n", rc); | 520 | printk(KERN_ERR "iscsi: can not unicast skb (%d)\n", rc); |
669 | return rc; | 521 | return rc; |
670 | } | 522 | } |
671 | 523 | ||
672 | spin_lock_irqsave(&zone->freelock, flags); | ||
673 | INIT_LIST_HEAD(skb_to_lh(skb)); | ||
674 | list_add(skb_to_lh(skb), &zone->freequeue); | ||
675 | spin_unlock_irqrestore(&zone->freelock, flags); | ||
676 | |||
677 | return 0; | 524 | return 0; |
678 | } | 525 | } |
679 | 526 | ||
@@ -692,9 +539,7 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, | |||
692 | if (!priv) | 539 | if (!priv) |
693 | return -EINVAL; | 540 | return -EINVAL; |
694 | 541 | ||
695 | mempool_zone_complete(conn->z_pdu); | 542 | skb = alloc_skb(len, GFP_ATOMIC); |
696 | |||
697 | skb = mempool_zone_get_skb(conn->z_pdu); | ||
698 | if (!skb) { | 543 | if (!skb) { |
699 | iscsi_conn_error(conn, ISCSI_ERR_CONN_FAILED); | 544 | iscsi_conn_error(conn, ISCSI_ERR_CONN_FAILED); |
700 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not deliver " | 545 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not deliver " |
@@ -707,15 +552,13 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, | |||
707 | memset(ev, 0, sizeof(*ev)); | 552 | memset(ev, 0, sizeof(*ev)); |
708 | ev->transport_handle = iscsi_handle(conn->transport); | 553 | ev->transport_handle = iscsi_handle(conn->transport); |
709 | ev->type = ISCSI_KEVENT_RECV_PDU; | 554 | ev->type = ISCSI_KEVENT_RECV_PDU; |
710 | if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat) | ||
711 | ev->iferror = -ENOMEM; | ||
712 | ev->r.recv_req.cid = conn->cid; | 555 | ev->r.recv_req.cid = conn->cid; |
713 | ev->r.recv_req.sid = iscsi_conn_get_sid(conn); | 556 | ev->r.recv_req.sid = iscsi_conn_get_sid(conn); |
714 | pdu = (char*)ev + sizeof(*ev); | 557 | pdu = (char*)ev + sizeof(*ev); |
715 | memcpy(pdu, hdr, sizeof(struct iscsi_hdr)); | 558 | memcpy(pdu, hdr, sizeof(struct iscsi_hdr)); |
716 | memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size); | 559 | memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size); |
717 | 560 | ||
718 | return iscsi_unicast_skb(conn->z_pdu, skb, priv->daemon_pid); | 561 | return iscsi_unicast_skb(skb, priv->daemon_pid); |
719 | } | 562 | } |
720 | EXPORT_SYMBOL_GPL(iscsi_recv_pdu); | 563 | EXPORT_SYMBOL_GPL(iscsi_recv_pdu); |
721 | 564 | ||
@@ -731,9 +574,7 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error) | |||
731 | if (!priv) | 574 | if (!priv) |
732 | return; | 575 | return; |
733 | 576 | ||
734 | mempool_zone_complete(conn->z_error); | 577 | skb = alloc_skb(len, GFP_ATOMIC); |
735 | |||
736 | skb = mempool_zone_get_skb(conn->z_error); | ||
737 | if (!skb) { | 578 | if (!skb) { |
738 | dev_printk(KERN_ERR, &conn->dev, "iscsi: gracefully ignored " | 579 | dev_printk(KERN_ERR, &conn->dev, "iscsi: gracefully ignored " |
739 | "conn error (%d)\n", error); | 580 | "conn error (%d)\n", error); |
@@ -744,13 +585,11 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error) | |||
744 | ev = NLMSG_DATA(nlh); | 585 | ev = NLMSG_DATA(nlh); |
745 | ev->transport_handle = iscsi_handle(conn->transport); | 586 | ev->transport_handle = iscsi_handle(conn->transport); |
746 | ev->type = ISCSI_KEVENT_CONN_ERROR; | 587 | ev->type = ISCSI_KEVENT_CONN_ERROR; |
747 | if (atomic_read(&conn->z_error->allocated) >= conn->z_error->hiwat) | ||
748 | ev->iferror = -ENOMEM; | ||
749 | ev->r.connerror.error = error; | 588 | ev->r.connerror.error = error; |
750 | ev->r.connerror.cid = conn->cid; | 589 | ev->r.connerror.cid = conn->cid; |
751 | ev->r.connerror.sid = iscsi_conn_get_sid(conn); | 590 | ev->r.connerror.sid = iscsi_conn_get_sid(conn); |
752 | 591 | ||
753 | iscsi_broadcast_skb(conn->z_error, skb, GFP_ATOMIC); | 592 | iscsi_broadcast_skb(skb, GFP_ATOMIC); |
754 | 593 | ||
755 | dev_printk(KERN_INFO, &conn->dev, "iscsi: detected conn error (%d)\n", | 594 | dev_printk(KERN_INFO, &conn->dev, "iscsi: detected conn error (%d)\n", |
756 | error); | 595 | error); |
@@ -767,9 +606,7 @@ iscsi_if_send_reply(int pid, int seq, int type, int done, int multi, | |||
767 | int flags = multi ? NLM_F_MULTI : 0; | 606 | int flags = multi ? NLM_F_MULTI : 0; |
768 | int t = done ? NLMSG_DONE : type; | 607 | int t = done ? NLMSG_DONE : type; |
769 | 608 | ||
770 | mempool_zone_complete(z_reply); | 609 | skb = alloc_skb(len, GFP_ATOMIC); |
771 | |||
772 | skb = mempool_zone_get_skb(z_reply); | ||
773 | /* | 610 | /* |
774 | * FIXME: | 611 | * FIXME: |
775 | * user is supposed to react on iferror == -ENOMEM; | 612 | * user is supposed to react on iferror == -ENOMEM; |
@@ -780,7 +617,7 @@ iscsi_if_send_reply(int pid, int seq, int type, int done, int multi, | |||
780 | nlh = __nlmsg_put(skb, pid, seq, t, (len - sizeof(*nlh)), 0); | 617 | nlh = __nlmsg_put(skb, pid, seq, t, (len - sizeof(*nlh)), 0); |
781 | nlh->nlmsg_flags = flags; | 618 | nlh->nlmsg_flags = flags; |
782 | memcpy(NLMSG_DATA(nlh), payload, size); | 619 | memcpy(NLMSG_DATA(nlh), payload, size); |
783 | return iscsi_unicast_skb(z_reply, skb, pid); | 620 | return iscsi_unicast_skb(skb, pid); |
784 | } | 621 | } |
785 | 622 | ||
786 | static int | 623 | static int |
@@ -810,9 +647,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) | |||
810 | do { | 647 | do { |
811 | int actual_size; | 648 | int actual_size; |
812 | 649 | ||
813 | mempool_zone_complete(conn->z_pdu); | 650 | skbstat = alloc_skb(len, GFP_ATOMIC); |
814 | |||
815 | skbstat = mempool_zone_get_skb(conn->z_pdu); | ||
816 | if (!skbstat) { | 651 | if (!skbstat) { |
817 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not " | 652 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not " |
818 | "deliver stats: OOM\n"); | 653 | "deliver stats: OOM\n"); |
@@ -825,8 +660,6 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) | |||
825 | memset(evstat, 0, sizeof(*evstat)); | 660 | memset(evstat, 0, sizeof(*evstat)); |
826 | evstat->transport_handle = iscsi_handle(conn->transport); | 661 | evstat->transport_handle = iscsi_handle(conn->transport); |
827 | evstat->type = nlh->nlmsg_type; | 662 | evstat->type = nlh->nlmsg_type; |
828 | if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat) | ||
829 | evstat->iferror = -ENOMEM; | ||
830 | evstat->u.get_stats.cid = | 663 | evstat->u.get_stats.cid = |
831 | ev->u.get_stats.cid; | 664 | ev->u.get_stats.cid; |
832 | evstat->u.get_stats.sid = | 665 | evstat->u.get_stats.sid = |
@@ -845,7 +678,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) | |||
845 | skb_trim(skbstat, NLMSG_ALIGN(actual_size)); | 678 | skb_trim(skbstat, NLMSG_ALIGN(actual_size)); |
846 | nlhstat->nlmsg_len = actual_size; | 679 | nlhstat->nlmsg_len = actual_size; |
847 | 680 | ||
848 | err = iscsi_unicast_skb(conn->z_pdu, skbstat, priv->daemon_pid); | 681 | err = iscsi_unicast_skb(skbstat, priv->daemon_pid); |
849 | } while (err < 0 && err != -ECONNREFUSED); | 682 | } while (err < 0 && err != -ECONNREFUSED); |
850 | 683 | ||
851 | return err; | 684 | return err; |
@@ -876,9 +709,7 @@ int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn) | |||
876 | session = iscsi_dev_to_session(conn->dev.parent); | 709 | session = iscsi_dev_to_session(conn->dev.parent); |
877 | shost = iscsi_session_to_shost(session); | 710 | shost = iscsi_session_to_shost(session); |
878 | 711 | ||
879 | mempool_zone_complete(conn->z_pdu); | 712 | skb = alloc_skb(len, GFP_KERNEL); |
880 | |||
881 | skb = mempool_zone_get_skb(conn->z_pdu); | ||
882 | if (!skb) { | 713 | if (!skb) { |
883 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " | 714 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " |
884 | "session creation event\n"); | 715 | "session creation event\n"); |
@@ -896,7 +727,7 @@ int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn) | |||
896 | * this will occur if the daemon is not up, so we just warn | 727 | * this will occur if the daemon is not up, so we just warn |
897 | * the user and when the daemon is restarted it will handle it | 728 | * the user and when the daemon is restarted it will handle it |
898 | */ | 729 | */ |
899 | rc = iscsi_broadcast_skb(conn->z_pdu, skb, GFP_KERNEL); | 730 | rc = iscsi_broadcast_skb(skb, GFP_KERNEL); |
900 | if (rc < 0) | 731 | if (rc < 0) |
901 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " | 732 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " |
902 | "session destruction event. Check iscsi daemon\n"); | 733 | "session destruction event. Check iscsi daemon\n"); |
@@ -939,9 +770,7 @@ int iscsi_if_create_session_done(struct iscsi_cls_conn *conn) | |||
939 | session = iscsi_dev_to_session(conn->dev.parent); | 770 | session = iscsi_dev_to_session(conn->dev.parent); |
940 | shost = iscsi_session_to_shost(session); | 771 | shost = iscsi_session_to_shost(session); |
941 | 772 | ||
942 | mempool_zone_complete(conn->z_pdu); | 773 | skb = alloc_skb(len, GFP_KERNEL); |
943 | |||
944 | skb = mempool_zone_get_skb(conn->z_pdu); | ||
945 | if (!skb) { | 774 | if (!skb) { |
946 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " | 775 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " |
947 | "session creation event\n"); | 776 | "session creation event\n"); |
@@ -959,7 +788,7 @@ int iscsi_if_create_session_done(struct iscsi_cls_conn *conn) | |||
959 | * this will occur if the daemon is not up, so we just warn | 788 | * this will occur if the daemon is not up, so we just warn |
960 | * the user and when the daemon is restarted it will handle it | 789 | * the user and when the daemon is restarted it will handle it |
961 | */ | 790 | */ |
962 | rc = iscsi_broadcast_skb(conn->z_pdu, skb, GFP_KERNEL); | 791 | rc = iscsi_broadcast_skb(skb, GFP_KERNEL); |
963 | if (rc < 0) | 792 | if (rc < 0) |
964 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " | 793 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " |
965 | "session creation event. Check iscsi daemon\n"); | 794 | "session creation event. Check iscsi daemon\n"); |
@@ -1278,9 +1107,6 @@ iscsi_if_rx(struct sock *sk, int len) | |||
1278 | err = iscsi_if_send_reply( | 1107 | err = iscsi_if_send_reply( |
1279 | NETLINK_CREDS(skb)->pid, nlh->nlmsg_seq, | 1108 | NETLINK_CREDS(skb)->pid, nlh->nlmsg_seq, |
1280 | nlh->nlmsg_type, 0, 0, ev, sizeof(*ev)); | 1109 | nlh->nlmsg_type, 0, 0, ev, sizeof(*ev)); |
1281 | if (atomic_read(&z_reply->allocated) >= | ||
1282 | z_reply->hiwat) | ||
1283 | ev->iferror = -ENOMEM; | ||
1284 | } while (err < 0 && err != -ECONNREFUSED); | 1110 | } while (err < 0 && err != -ECONNREFUSED); |
1285 | skb_pull(skb, rlen); | 1111 | skb_pull(skb, rlen); |
1286 | } | 1112 | } |
@@ -1584,32 +1410,6 @@ int iscsi_unregister_transport(struct iscsi_transport *tt) | |||
1584 | } | 1410 | } |
1585 | EXPORT_SYMBOL_GPL(iscsi_unregister_transport); | 1411 | EXPORT_SYMBOL_GPL(iscsi_unregister_transport); |
1586 | 1412 | ||
1587 | static int | ||
1588 | iscsi_rcv_nl_event(struct notifier_block *this, unsigned long event, void *ptr) | ||
1589 | { | ||
1590 | struct netlink_notify *n = ptr; | ||
1591 | |||
1592 | if (event == NETLINK_URELEASE && | ||
1593 | n->protocol == NETLINK_ISCSI && n->pid) { | ||
1594 | struct iscsi_cls_conn *conn; | ||
1595 | unsigned long flags; | ||
1596 | |||
1597 | mempool_zone_complete(z_reply); | ||
1598 | spin_lock_irqsave(&connlock, flags); | ||
1599 | list_for_each_entry(conn, &connlist, conn_list) { | ||
1600 | mempool_zone_complete(conn->z_error); | ||
1601 | mempool_zone_complete(conn->z_pdu); | ||
1602 | } | ||
1603 | spin_unlock_irqrestore(&connlock, flags); | ||
1604 | } | ||
1605 | |||
1606 | return NOTIFY_DONE; | ||
1607 | } | ||
1608 | |||
1609 | static struct notifier_block iscsi_nl_notifier = { | ||
1610 | .notifier_call = iscsi_rcv_nl_event, | ||
1611 | }; | ||
1612 | |||
1613 | static __init int iscsi_transport_init(void) | 1413 | static __init int iscsi_transport_init(void) |
1614 | { | 1414 | { |
1615 | int err; | 1415 | int err; |
@@ -1633,25 +1433,15 @@ static __init int iscsi_transport_init(void) | |||
1633 | if (err) | 1433 | if (err) |
1634 | goto unregister_conn_class; | 1434 | goto unregister_conn_class; |
1635 | 1435 | ||
1636 | err = netlink_register_notifier(&iscsi_nl_notifier); | ||
1637 | if (err) | ||
1638 | goto unregister_session_class; | ||
1639 | |||
1640 | nls = netlink_kernel_create(NETLINK_ISCSI, 1, iscsi_if_rx, | 1436 | nls = netlink_kernel_create(NETLINK_ISCSI, 1, iscsi_if_rx, |
1641 | THIS_MODULE); | 1437 | THIS_MODULE); |
1642 | if (!nls) { | 1438 | if (!nls) { |
1643 | err = -ENOBUFS; | 1439 | err = -ENOBUFS; |
1644 | goto unregister_notifier; | 1440 | goto unregister_session_class; |
1645 | } | 1441 | } |
1646 | 1442 | ||
1647 | z_reply = mempool_zone_init(Z_MAX_REPLY, | 1443 | return 0; |
1648 | NLMSG_SPACE(sizeof(struct iscsi_uevent)), Z_HIWAT_REPLY); | ||
1649 | if (z_reply) | ||
1650 | return 0; | ||
1651 | 1444 | ||
1652 | sock_release(nls->sk_socket); | ||
1653 | unregister_notifier: | ||
1654 | netlink_unregister_notifier(&iscsi_nl_notifier); | ||
1655 | unregister_session_class: | 1445 | unregister_session_class: |
1656 | transport_class_unregister(&iscsi_session_class); | 1446 | transport_class_unregister(&iscsi_session_class); |
1657 | unregister_conn_class: | 1447 | unregister_conn_class: |
@@ -1665,9 +1455,7 @@ unregister_transport_class: | |||
1665 | 1455 | ||
1666 | static void __exit iscsi_transport_exit(void) | 1456 | static void __exit iscsi_transport_exit(void) |
1667 | { | 1457 | { |
1668 | mempool_zone_destroy(z_reply); | ||
1669 | sock_release(nls->sk_socket); | 1458 | sock_release(nls->sk_socket); |
1670 | netlink_unregister_notifier(&iscsi_nl_notifier); | ||
1671 | transport_class_unregister(&iscsi_connection_class); | 1459 | transport_class_unregister(&iscsi_connection_class); |
1672 | transport_class_unregister(&iscsi_session_class); | 1460 | transport_class_unregister(&iscsi_session_class); |
1673 | transport_class_unregister(&iscsi_host_class); | 1461 | transport_class_unregister(&iscsi_host_class); |
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 3f8b93188567..81e3bc7b02a1 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c | |||
@@ -60,7 +60,7 @@ static int sg_version_num = 30534; /* 2 digits for each component */ | |||
60 | 60 | ||
61 | #ifdef CONFIG_SCSI_PROC_FS | 61 | #ifdef CONFIG_SCSI_PROC_FS |
62 | #include <linux/proc_fs.h> | 62 | #include <linux/proc_fs.h> |
63 | static char *sg_version_date = "20060920"; | 63 | static char *sg_version_date = "20061027"; |
64 | 64 | ||
65 | static int sg_proc_init(void); | 65 | static int sg_proc_init(void); |
66 | static void sg_proc_cleanup(void); | 66 | static void sg_proc_cleanup(void); |
@@ -710,12 +710,12 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp, | |||
710 | (int) cmnd[0], (int) hp->cmd_len)); | 710 | (int) cmnd[0], (int) hp->cmd_len)); |
711 | 711 | ||
712 | if ((k = sg_start_req(srp))) { | 712 | if ((k = sg_start_req(srp))) { |
713 | SCSI_LOG_TIMEOUT(1, printk("sg_write: start_req err=%d\n", k)); | 713 | SCSI_LOG_TIMEOUT(1, printk("sg_common_write: start_req err=%d\n", k)); |
714 | sg_finish_rem_req(srp); | 714 | sg_finish_rem_req(srp); |
715 | return k; /* probably out of space --> ENOMEM */ | 715 | return k; /* probably out of space --> ENOMEM */ |
716 | } | 716 | } |
717 | if ((k = sg_write_xfer(srp))) { | 717 | if ((k = sg_write_xfer(srp))) { |
718 | SCSI_LOG_TIMEOUT(1, printk("sg_write: write_xfer, bad address\n")); | 718 | SCSI_LOG_TIMEOUT(1, printk("sg_common_write: write_xfer, bad address\n")); |
719 | sg_finish_rem_req(srp); | 719 | sg_finish_rem_req(srp); |
720 | return k; | 720 | return k; |
721 | } | 721 | } |
@@ -746,7 +746,7 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp, | |||
746 | hp->dxfer_len, srp->data.k_use_sg, timeout, | 746 | hp->dxfer_len, srp->data.k_use_sg, timeout, |
747 | SG_DEFAULT_RETRIES, srp, sg_cmd_done, | 747 | SG_DEFAULT_RETRIES, srp, sg_cmd_done, |
748 | GFP_ATOMIC)) { | 748 | GFP_ATOMIC)) { |
749 | SCSI_LOG_TIMEOUT(1, printk("sg_write: scsi_execute_async failed\n")); | 749 | SCSI_LOG_TIMEOUT(1, printk("sg_common_write: scsi_execute_async failed\n")); |
750 | /* | 750 | /* |
751 | * most likely out of mem, but could also be a bad map | 751 | * most likely out of mem, but could also be a bad map |
752 | */ | 752 | */ |
@@ -1283,7 +1283,7 @@ sg_cmd_done(void *data, char *sense, int result, int resid) | |||
1283 | sg_finish_rem_req(srp); | 1283 | sg_finish_rem_req(srp); |
1284 | srp = NULL; | 1284 | srp = NULL; |
1285 | if (NULL == sfp->headrp) { | 1285 | if (NULL == sfp->headrp) { |
1286 | SCSI_LOG_TIMEOUT(1, printk("sg...bh: already closed, final cleanup\n")); | 1286 | SCSI_LOG_TIMEOUT(1, printk("sg_cmd_done: already closed, final cleanup\n")); |
1287 | if (0 == sg_remove_sfp(sdp, sfp)) { /* device still present */ | 1287 | if (0 == sg_remove_sfp(sdp, sfp)) { /* device still present */ |
1288 | scsi_device_put(sdp->device); | 1288 | scsi_device_put(sdp->device); |
1289 | } | 1289 | } |
@@ -1512,12 +1512,12 @@ sg_remove(struct class_device *cl_dev, struct class_interface *cl_intf) | |||
1512 | POLL_HUP); | 1512 | POLL_HUP); |
1513 | } | 1513 | } |
1514 | } | 1514 | } |
1515 | SCSI_LOG_TIMEOUT(3, printk("sg_detach: dev=%d, dirty\n", k)); | 1515 | SCSI_LOG_TIMEOUT(3, printk("sg_remove: dev=%d, dirty\n", k)); |
1516 | if (NULL == sdp->headfp) { | 1516 | if (NULL == sdp->headfp) { |
1517 | sg_dev_arr[k] = NULL; | 1517 | sg_dev_arr[k] = NULL; |
1518 | } | 1518 | } |
1519 | } else { /* nothing active, simple case */ | 1519 | } else { /* nothing active, simple case */ |
1520 | SCSI_LOG_TIMEOUT(3, printk("sg_detach: dev=%d\n", k)); | 1520 | SCSI_LOG_TIMEOUT(3, printk("sg_remove: dev=%d\n", k)); |
1521 | sg_dev_arr[k] = NULL; | 1521 | sg_dev_arr[k] = NULL; |
1522 | } | 1522 | } |
1523 | sg_nr_dev--; | 1523 | sg_nr_dev--; |
@@ -1876,14 +1876,15 @@ sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size) | |||
1876 | } | 1876 | } |
1877 | } | 1877 | } |
1878 | sg->page = p; | 1878 | sg->page = p; |
1879 | sg->length = ret_sz; | 1879 | sg->length = (ret_sz > num) ? num : ret_sz; |
1880 | 1880 | ||
1881 | SCSI_LOG_TIMEOUT(5, printk("sg_build_build: k=%d, a=0x%p, len=%d\n", | 1881 | SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k=%d, num=%d, " |
1882 | k, p, ret_sz)); | 1882 | "ret_sz=%d\n", k, num, ret_sz)); |
1883 | } /* end of for loop */ | 1883 | } /* end of for loop */ |
1884 | 1884 | ||
1885 | schp->k_use_sg = k; | 1885 | schp->k_use_sg = k; |
1886 | SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k_use_sg=%d, rem_sz=%d\n", k, rem_sz)); | 1886 | SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k_use_sg=%d, " |
1887 | "rem_sz=%d\n", k, rem_sz)); | ||
1887 | 1888 | ||
1888 | schp->bufflen = blk_size; | 1889 | schp->bufflen = blk_size; |
1889 | if (rem_sz > 0) /* must have failed */ | 1890 | if (rem_sz > 0) /* must have failed */ |
@@ -2014,7 +2015,7 @@ sg_remove_scat(Sg_scatter_hold * schp) | |||
2014 | for (k = 0; (k < schp->k_use_sg) && sg->page; | 2015 | for (k = 0; (k < schp->k_use_sg) && sg->page; |
2015 | ++k, ++sg) { | 2016 | ++k, ++sg) { |
2016 | SCSI_LOG_TIMEOUT(5, printk( | 2017 | SCSI_LOG_TIMEOUT(5, printk( |
2017 | "sg_remove_scat: k=%d, a=0x%p, len=%d\n", | 2018 | "sg_remove_scat: k=%d, pg=0x%p, len=%d\n", |
2018 | k, sg->page, sg->length)); | 2019 | k, sg->page, sg->length)); |
2019 | sg_page_free(sg->page, sg->length); | 2020 | sg_page_free(sg->page, sg->length); |
2020 | } | 2021 | } |
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 3babdc76b3fb..e1a52c525ed4 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c | |||
@@ -1177,7 +1177,10 @@ static int st_open(struct inode *inode, struct file *filp) | |||
1177 | goto err_out; | 1177 | goto err_out; |
1178 | if ((filp->f_flags & O_NONBLOCK) == 0 && | 1178 | if ((filp->f_flags & O_NONBLOCK) == 0 && |
1179 | retval != CHKRES_READY) { | 1179 | retval != CHKRES_READY) { |
1180 | retval = (-EIO); | 1180 | if (STp->ready == NO_TAPE) |
1181 | retval = (-ENOMEDIUM); | ||
1182 | else | ||
1183 | retval = (-EIO); | ||
1181 | goto err_out; | 1184 | goto err_out; |
1182 | } | 1185 | } |
1183 | return 0; | 1186 | return 0; |
diff --git a/drivers/scsi/sun3_NCR5380.c b/drivers/scsi/sun3_NCR5380.c index 5ec5af8e3379..3b3f3050a877 100644 --- a/drivers/scsi/sun3_NCR5380.c +++ b/drivers/scsi/sun3_NCR5380.c | |||
@@ -266,8 +266,8 @@ static struct scsi_host_template *the_template = NULL; | |||
266 | (struct NCR5380_hostdata *)(in)->hostdata | 266 | (struct NCR5380_hostdata *)(in)->hostdata |
267 | #define HOSTDATA(in) ((struct NCR5380_hostdata *)(in)->hostdata) | 267 | #define HOSTDATA(in) ((struct NCR5380_hostdata *)(in)->hostdata) |
268 | 268 | ||
269 | #define NEXT(cmd) ((Scsi_Cmnd *)((cmd)->host_scribble)) | 269 | #define NEXT(cmd) ((struct scsi_cmnd *)((cmd)->host_scribble)) |
270 | #define NEXTADDR(cmd) ((Scsi_Cmnd **)&((cmd)->host_scribble)) | 270 | #define NEXTADDR(cmd) ((struct scsi_cmnd **)&((cmd)->host_scribble)) |
271 | 271 | ||
272 | #define HOSTNO instance->host_no | 272 | #define HOSTNO instance->host_no |
273 | #define H_NO(cmd) (cmd)->device->host->host_no | 273 | #define H_NO(cmd) (cmd)->device->host->host_no |
@@ -360,7 +360,7 @@ static void __init init_tags( void ) | |||
360 | * conditions. | 360 | * conditions. |
361 | */ | 361 | */ |
362 | 362 | ||
363 | static int is_lun_busy( Scsi_Cmnd *cmd, int should_be_tagged ) | 363 | static int is_lun_busy(struct scsi_cmnd *cmd, int should_be_tagged) |
364 | { | 364 | { |
365 | SETUP_HOSTDATA(cmd->device->host); | 365 | SETUP_HOSTDATA(cmd->device->host); |
366 | 366 | ||
@@ -384,7 +384,7 @@ static int is_lun_busy( Scsi_Cmnd *cmd, int should_be_tagged ) | |||
384 | * untagged. | 384 | * untagged. |
385 | */ | 385 | */ |
386 | 386 | ||
387 | static void cmd_get_tag( Scsi_Cmnd *cmd, int should_be_tagged ) | 387 | static void cmd_get_tag(struct scsi_cmnd *cmd, int should_be_tagged) |
388 | { | 388 | { |
389 | SETUP_HOSTDATA(cmd->device->host); | 389 | SETUP_HOSTDATA(cmd->device->host); |
390 | 390 | ||
@@ -416,7 +416,7 @@ static void cmd_get_tag( Scsi_Cmnd *cmd, int should_be_tagged ) | |||
416 | * unlock the LUN. | 416 | * unlock the LUN. |
417 | */ | 417 | */ |
418 | 418 | ||
419 | static void cmd_free_tag( Scsi_Cmnd *cmd ) | 419 | static void cmd_free_tag(struct scsi_cmnd *cmd) |
420 | { | 420 | { |
421 | SETUP_HOSTDATA(cmd->device->host); | 421 | SETUP_HOSTDATA(cmd->device->host); |
422 | 422 | ||
@@ -460,18 +460,18 @@ static void free_all_tags( void ) | |||
460 | 460 | ||
461 | 461 | ||
462 | /* | 462 | /* |
463 | * Function: void merge_contiguous_buffers( Scsi_Cmnd *cmd ) | 463 | * Function: void merge_contiguous_buffers(struct scsi_cmnd *cmd) |
464 | * | 464 | * |
465 | * Purpose: Try to merge several scatter-gather requests into one DMA | 465 | * Purpose: Try to merge several scatter-gather requests into one DMA |
466 | * transfer. This is possible if the scatter buffers lie on | 466 | * transfer. This is possible if the scatter buffers lie on |
467 | * physical contiguous addresses. | 467 | * physical contiguous addresses. |
468 | * | 468 | * |
469 | * Parameters: Scsi_Cmnd *cmd | 469 | * Parameters: struct scsi_cmnd *cmd |
470 | * The command to work on. The first scatter buffer's data are | 470 | * The command to work on. The first scatter buffer's data are |
471 | * assumed to be already transfered into ptr/this_residual. | 471 | * assumed to be already transfered into ptr/this_residual. |
472 | */ | 472 | */ |
473 | 473 | ||
474 | static void merge_contiguous_buffers( Scsi_Cmnd *cmd ) | 474 | static void merge_contiguous_buffers(struct scsi_cmnd *cmd) |
475 | { | 475 | { |
476 | unsigned long endaddr; | 476 | unsigned long endaddr; |
477 | #if (NDEBUG & NDEBUG_MERGING) | 477 | #if (NDEBUG & NDEBUG_MERGING) |
@@ -501,15 +501,15 @@ static void merge_contiguous_buffers( Scsi_Cmnd *cmd ) | |||
501 | } | 501 | } |
502 | 502 | ||
503 | /* | 503 | /* |
504 | * Function : void initialize_SCp(Scsi_Cmnd *cmd) | 504 | * Function : void initialize_SCp(struct scsi_cmnd *cmd) |
505 | * | 505 | * |
506 | * Purpose : initialize the saved data pointers for cmd to point to the | 506 | * Purpose : initialize the saved data pointers for cmd to point to the |
507 | * start of the buffer. | 507 | * start of the buffer. |
508 | * | 508 | * |
509 | * Inputs : cmd - Scsi_Cmnd structure to have pointers reset. | 509 | * Inputs : cmd - struct scsi_cmnd structure to have pointers reset. |
510 | */ | 510 | */ |
511 | 511 | ||
512 | static __inline__ void initialize_SCp(Scsi_Cmnd *cmd) | 512 | static __inline__ void initialize_SCp(struct scsi_cmnd *cmd) |
513 | { | 513 | { |
514 | /* | 514 | /* |
515 | * Initialize the Scsi Pointer field so that all of the commands in the | 515 | * Initialize the Scsi Pointer field so that all of the commands in the |
@@ -753,14 +753,15 @@ static void NCR5380_print_status (struct Scsi_Host *instance) | |||
753 | do { if (pos + strlen(fmt) + 20 /* slop */ < buffer + length) \ | 753 | do { if (pos + strlen(fmt) + 20 /* slop */ < buffer + length) \ |
754 | pos += sprintf(pos, fmt , ## args); } while(0) | 754 | pos += sprintf(pos, fmt , ## args); } while(0) |
755 | static | 755 | static |
756 | char *lprint_Scsi_Cmnd (Scsi_Cmnd *cmd, char *pos, char *buffer, int length); | 756 | char *lprint_Scsi_Cmnd(struct scsi_cmnd *cmd, char *pos, char *buffer, |
757 | int length); | ||
757 | 758 | ||
758 | static int NCR5380_proc_info (struct Scsi_Host *instance, char *buffer, char **start, | 759 | static int NCR5380_proc_info(struct Scsi_Host *instance, char *buffer, |
759 | off_t offset, int length, int inout) | 760 | char **start, off_t offset, int length, int inout) |
760 | { | 761 | { |
761 | char *pos = buffer; | 762 | char *pos = buffer; |
762 | struct NCR5380_hostdata *hostdata; | 763 | struct NCR5380_hostdata *hostdata; |
763 | Scsi_Cmnd *ptr; | 764 | struct scsi_cmnd *ptr; |
764 | unsigned long flags; | 765 | unsigned long flags; |
765 | off_t begin = 0; | 766 | off_t begin = 0; |
766 | #define check_offset() \ | 767 | #define check_offset() \ |
@@ -784,18 +785,19 @@ static int NCR5380_proc_info (struct Scsi_Host *instance, char *buffer, char **s | |||
784 | if (!hostdata->connected) | 785 | if (!hostdata->connected) |
785 | SPRINTF("scsi%d: no currently connected command\n", HOSTNO); | 786 | SPRINTF("scsi%d: no currently connected command\n", HOSTNO); |
786 | else | 787 | else |
787 | pos = lprint_Scsi_Cmnd ((Scsi_Cmnd *) hostdata->connected, | 788 | pos = lprint_Scsi_Cmnd ((struct scsi_cmnd *) hostdata->connected, |
788 | pos, buffer, length); | 789 | pos, buffer, length); |
789 | SPRINTF("scsi%d: issue_queue\n", HOSTNO); | 790 | SPRINTF("scsi%d: issue_queue\n", HOSTNO); |
790 | check_offset(); | 791 | check_offset(); |
791 | for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr; ptr = NEXT(ptr)) { | 792 | for (ptr = (struct scsi_cmnd *) hostdata->issue_queue; ptr; ptr = NEXT(ptr)) |
793 | { | ||
792 | pos = lprint_Scsi_Cmnd (ptr, pos, buffer, length); | 794 | pos = lprint_Scsi_Cmnd (ptr, pos, buffer, length); |
793 | check_offset(); | 795 | check_offset(); |
794 | } | 796 | } |
795 | 797 | ||
796 | SPRINTF("scsi%d: disconnected_queue\n", HOSTNO); | 798 | SPRINTF("scsi%d: disconnected_queue\n", HOSTNO); |
797 | check_offset(); | 799 | check_offset(); |
798 | for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; | 800 | for (ptr = (struct scsi_cmnd *) hostdata->disconnected_queue; ptr; |
799 | ptr = NEXT(ptr)) { | 801 | ptr = NEXT(ptr)) { |
800 | pos = lprint_Scsi_Cmnd (ptr, pos, buffer, length); | 802 | pos = lprint_Scsi_Cmnd (ptr, pos, buffer, length); |
801 | check_offset(); | 803 | check_offset(); |
@@ -810,8 +812,8 @@ static int NCR5380_proc_info (struct Scsi_Host *instance, char *buffer, char **s | |||
810 | return length; | 812 | return length; |
811 | } | 813 | } |
812 | 814 | ||
813 | static char * | 815 | static char *lprint_Scsi_Cmnd(struct scsi_cmnd *cmd, char *pos, char *buffer, |
814 | lprint_Scsi_Cmnd (Scsi_Cmnd *cmd, char *pos, char *buffer, int length) | 816 | int length) |
815 | { | 817 | { |
816 | int i, s; | 818 | int i, s; |
817 | unsigned char *command; | 819 | unsigned char *command; |
@@ -888,8 +890,8 @@ static int NCR5380_init (struct Scsi_Host *instance, int flags) | |||
888 | } | 890 | } |
889 | 891 | ||
890 | /* | 892 | /* |
891 | * Function : int NCR5380_queue_command (Scsi_Cmnd *cmd, | 893 | * Function : int NCR5380_queue_command (struct scsi_cmnd *cmd, |
892 | * void (*done)(Scsi_Cmnd *)) | 894 | * void (*done)(struct scsi_cmnd *)) |
893 | * | 895 | * |
894 | * Purpose : enqueues a SCSI command | 896 | * Purpose : enqueues a SCSI command |
895 | * | 897 | * |
@@ -906,10 +908,11 @@ static int NCR5380_init (struct Scsi_Host *instance, int flags) | |||
906 | */ | 908 | */ |
907 | 909 | ||
908 | /* Only make static if a wrapper function is used */ | 910 | /* Only make static if a wrapper function is used */ |
909 | static int NCR5380_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) | 911 | static int NCR5380_queue_command(struct scsi_cmnd *cmd, |
912 | void (*done)(struct scsi_cmnd *)) | ||
910 | { | 913 | { |
911 | SETUP_HOSTDATA(cmd->device->host); | 914 | SETUP_HOSTDATA(cmd->device->host); |
912 | Scsi_Cmnd *tmp; | 915 | struct scsi_cmnd *tmp; |
913 | unsigned long flags; | 916 | unsigned long flags; |
914 | 917 | ||
915 | #if (NDEBUG & NDEBUG_NO_WRITE) | 918 | #if (NDEBUG & NDEBUG_NO_WRITE) |
@@ -990,7 +993,7 @@ static int NCR5380_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) | |||
990 | NEXT(cmd) = hostdata->issue_queue; | 993 | NEXT(cmd) = hostdata->issue_queue; |
991 | hostdata->issue_queue = cmd; | 994 | hostdata->issue_queue = cmd; |
992 | } else { | 995 | } else { |
993 | for (tmp = (Scsi_Cmnd *)hostdata->issue_queue; | 996 | for (tmp = (struct scsi_cmnd *)hostdata->issue_queue; |
994 | NEXT(tmp); tmp = NEXT(tmp)) | 997 | NEXT(tmp); tmp = NEXT(tmp)) |
995 | ; | 998 | ; |
996 | LIST(cmd, tmp); | 999 | LIST(cmd, tmp); |
@@ -1030,7 +1033,7 @@ static int NCR5380_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) | |||
1030 | 1033 | ||
1031 | static void NCR5380_main (void *bl) | 1034 | static void NCR5380_main (void *bl) |
1032 | { | 1035 | { |
1033 | Scsi_Cmnd *tmp, *prev; | 1036 | struct scsi_cmnd *tmp, *prev; |
1034 | struct Scsi_Host *instance = first_instance; | 1037 | struct Scsi_Host *instance = first_instance; |
1035 | struct NCR5380_hostdata *hostdata = HOSTDATA(instance); | 1038 | struct NCR5380_hostdata *hostdata = HOSTDATA(instance); |
1036 | int done; | 1039 | int done; |
@@ -1073,12 +1076,12 @@ static void NCR5380_main (void *bl) | |||
1073 | * for a target that's not busy. | 1076 | * for a target that's not busy. |
1074 | */ | 1077 | */ |
1075 | #if (NDEBUG & NDEBUG_LISTS) | 1078 | #if (NDEBUG & NDEBUG_LISTS) |
1076 | for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, prev = NULL; | 1079 | for (tmp = (struct scsi_cmnd *) hostdata->issue_queue, prev = NULL; |
1077 | tmp && (tmp != prev); prev = tmp, tmp = NEXT(tmp)) | 1080 | tmp && (tmp != prev); prev = tmp, tmp = NEXT(tmp)) |
1078 | ; | 1081 | ; |
1079 | if ((tmp == prev) && tmp) printk(" LOOP\n");/* else printk("\n");*/ | 1082 | if ((tmp == prev) && tmp) printk(" LOOP\n");/* else printk("\n");*/ |
1080 | #endif | 1083 | #endif |
1081 | for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, | 1084 | for (tmp = (struct scsi_cmnd *) hostdata->issue_queue, |
1082 | prev = NULL; tmp; prev = tmp, tmp = NEXT(tmp) ) { | 1085 | prev = NULL; tmp; prev = tmp, tmp = NEXT(tmp) ) { |
1083 | 1086 | ||
1084 | #if (NDEBUG & NDEBUG_LISTS) | 1087 | #if (NDEBUG & NDEBUG_LISTS) |
@@ -1339,7 +1342,8 @@ static irqreturn_t NCR5380_intr (int irq, void *dev_id) | |||
1339 | } | 1342 | } |
1340 | 1343 | ||
1341 | #ifdef NCR5380_STATS | 1344 | #ifdef NCR5380_STATS |
1342 | static void collect_stats(struct NCR5380_hostdata* hostdata, Scsi_Cmnd* cmd) | 1345 | static void collect_stats(struct NCR5380_hostdata *hostdata, |
1346 | struct scsi_cmnd *cmd) | ||
1343 | { | 1347 | { |
1344 | # ifdef NCR5380_STAT_LIMIT | 1348 | # ifdef NCR5380_STAT_LIMIT |
1345 | if (cmd->request_bufflen > NCR5380_STAT_LIMIT) | 1349 | if (cmd->request_bufflen > NCR5380_STAT_LIMIT) |
@@ -1365,8 +1369,8 @@ static void collect_stats(struct NCR5380_hostdata* hostdata, Scsi_Cmnd* cmd) | |||
1365 | #endif | 1369 | #endif |
1366 | 1370 | ||
1367 | /* | 1371 | /* |
1368 | * Function : int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd, | 1372 | * Function : int NCR5380_select(struct Scsi_Host *instance, |
1369 | * int tag); | 1373 | * struct scsi_cmnd *cmd, int tag); |
1370 | * | 1374 | * |
1371 | * Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command, | 1375 | * Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command, |
1372 | * including ARBITRATION, SELECTION, and initial message out for | 1376 | * including ARBITRATION, SELECTION, and initial message out for |
@@ -1395,7 +1399,8 @@ static void collect_stats(struct NCR5380_hostdata* hostdata, Scsi_Cmnd* cmd) | |||
1395 | * cmd->result host byte set to DID_BAD_TARGET. | 1399 | * cmd->result host byte set to DID_BAD_TARGET. |
1396 | */ | 1400 | */ |
1397 | 1401 | ||
1398 | static int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd, int tag) | 1402 | static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd, |
1403 | int tag) | ||
1399 | { | 1404 | { |
1400 | SETUP_HOSTDATA(instance); | 1405 | SETUP_HOSTDATA(instance); |
1401 | unsigned char tmp[3], phase; | 1406 | unsigned char tmp[3], phase; |
@@ -1985,7 +1990,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance) | |||
1985 | #endif | 1990 | #endif |
1986 | unsigned char *data; | 1991 | unsigned char *data; |
1987 | unsigned char phase, tmp, extended_msg[10], old_phase=0xff; | 1992 | unsigned char phase, tmp, extended_msg[10], old_phase=0xff; |
1988 | Scsi_Cmnd *cmd = (Scsi_Cmnd *) hostdata->connected; | 1993 | struct scsi_cmnd *cmd = (struct scsi_cmnd *) hostdata->connected; |
1989 | 1994 | ||
1990 | #ifdef SUN3_SCSI_VME | 1995 | #ifdef SUN3_SCSI_VME |
1991 | dregs->csr |= CSR_INTR; | 1996 | dregs->csr |= CSR_INTR; |
@@ -2272,7 +2277,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance) | |||
2272 | local_irq_save(flags); | 2277 | local_irq_save(flags); |
2273 | LIST(cmd,hostdata->issue_queue); | 2278 | LIST(cmd,hostdata->issue_queue); |
2274 | NEXT(cmd) = hostdata->issue_queue; | 2279 | NEXT(cmd) = hostdata->issue_queue; |
2275 | hostdata->issue_queue = (Scsi_Cmnd *) cmd; | 2280 | hostdata->issue_queue = (struct scsi_cmnd *) cmd; |
2276 | local_irq_restore(flags); | 2281 | local_irq_restore(flags); |
2277 | QU_PRINTK("scsi%d: REQUEST SENSE added to head of " | 2282 | QU_PRINTK("scsi%d: REQUEST SENSE added to head of " |
2278 | "issue queue\n", H_NO(cmd)); | 2283 | "issue queue\n", H_NO(cmd)); |
@@ -2502,7 +2507,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance) | |||
2502 | * Function : void NCR5380_reselect (struct Scsi_Host *instance) | 2507 | * Function : void NCR5380_reselect (struct Scsi_Host *instance) |
2503 | * | 2508 | * |
2504 | * Purpose : does reselection, initializing the instance->connected | 2509 | * Purpose : does reselection, initializing the instance->connected |
2505 | * field to point to the Scsi_Cmnd for which the I_T_L or I_T_L_Q | 2510 | * field to point to the struct scsi_cmnd for which the I_T_L or I_T_L_Q |
2506 | * nexus has been reestablished, | 2511 | * nexus has been reestablished, |
2507 | * | 2512 | * |
2508 | * Inputs : instance - this instance of the NCR5380. | 2513 | * Inputs : instance - this instance of the NCR5380. |
@@ -2521,7 +2526,7 @@ static void NCR5380_reselect (struct Scsi_Host *instance) | |||
2521 | unsigned char tag; | 2526 | unsigned char tag; |
2522 | #endif | 2527 | #endif |
2523 | unsigned char msg[3]; | 2528 | unsigned char msg[3]; |
2524 | Scsi_Cmnd *tmp = NULL, *prev; | 2529 | struct scsi_cmnd *tmp = NULL, *prev; |
2525 | /* unsigned long flags; */ | 2530 | /* unsigned long flags; */ |
2526 | 2531 | ||
2527 | /* | 2532 | /* |
@@ -2577,7 +2582,7 @@ static void NCR5380_reselect (struct Scsi_Host *instance) | |||
2577 | * just reestablished, and remove it from the disconnected queue. | 2582 | * just reestablished, and remove it from the disconnected queue. |
2578 | */ | 2583 | */ |
2579 | 2584 | ||
2580 | for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue, prev = NULL; | 2585 | for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue, prev = NULL; |
2581 | tmp; prev = tmp, tmp = NEXT(tmp) ) { | 2586 | tmp; prev = tmp, tmp = NEXT(tmp) ) { |
2582 | if ((target_mask == (1 << tmp->device->id)) && (lun == tmp->device->lun) | 2587 | if ((target_mask == (1 << tmp->device->id)) && (lun == tmp->device->lun) |
2583 | #ifdef SUPPORT_TAGS | 2588 | #ifdef SUPPORT_TAGS |
@@ -2668,11 +2673,11 @@ static void NCR5380_reselect (struct Scsi_Host *instance) | |||
2668 | 2673 | ||
2669 | 2674 | ||
2670 | /* | 2675 | /* |
2671 | * Function : int NCR5380_abort (Scsi_Cmnd *cmd) | 2676 | * Function : int NCR5380_abort(struct scsi_cmnd *cmd) |
2672 | * | 2677 | * |
2673 | * Purpose : abort a command | 2678 | * Purpose : abort a command |
2674 | * | 2679 | * |
2675 | * Inputs : cmd - the Scsi_Cmnd to abort, code - code to set the | 2680 | * Inputs : cmd - the struct scsi_cmnd to abort, code - code to set the |
2676 | * host byte of the result field to, if zero DID_ABORTED is | 2681 | * host byte of the result field to, if zero DID_ABORTED is |
2677 | * used. | 2682 | * used. |
2678 | * | 2683 | * |
@@ -2684,11 +2689,11 @@ static void NCR5380_reselect (struct Scsi_Host *instance) | |||
2684 | * called where the loop started in NCR5380_main(). | 2689 | * called where the loop started in NCR5380_main(). |
2685 | */ | 2690 | */ |
2686 | 2691 | ||
2687 | static int NCR5380_abort (Scsi_Cmnd *cmd) | 2692 | static int NCR5380_abort(struct scsi_cmnd *cmd) |
2688 | { | 2693 | { |
2689 | struct Scsi_Host *instance = cmd->device->host; | 2694 | struct Scsi_Host *instance = cmd->device->host; |
2690 | SETUP_HOSTDATA(instance); | 2695 | SETUP_HOSTDATA(instance); |
2691 | Scsi_Cmnd *tmp, **prev; | 2696 | struct scsi_cmnd *tmp, **prev; |
2692 | unsigned long flags; | 2697 | unsigned long flags; |
2693 | 2698 | ||
2694 | printk(KERN_NOTICE "scsi%d: aborting command\n", HOSTNO); | 2699 | printk(KERN_NOTICE "scsi%d: aborting command\n", HOSTNO); |
@@ -2753,9 +2758,9 @@ static int NCR5380_abort (Scsi_Cmnd *cmd) | |||
2753 | * Case 2 : If the command hasn't been issued yet, we simply remove it | 2758 | * Case 2 : If the command hasn't been issued yet, we simply remove it |
2754 | * from the issue queue. | 2759 | * from the issue queue. |
2755 | */ | 2760 | */ |
2756 | for (prev = (Scsi_Cmnd **) &(hostdata->issue_queue), | 2761 | for (prev = (struct scsi_cmnd **) &(hostdata->issue_queue), |
2757 | tmp = (Scsi_Cmnd *) hostdata->issue_queue; | 2762 | tmp = (struct scsi_cmnd *) hostdata->issue_queue; |
2758 | tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp) ) | 2763 | tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp)) |
2759 | if (cmd == tmp) { | 2764 | if (cmd == tmp) { |
2760 | REMOVE(5, *prev, tmp, NEXT(tmp)); | 2765 | REMOVE(5, *prev, tmp, NEXT(tmp)); |
2761 | (*prev) = NEXT(tmp); | 2766 | (*prev) = NEXT(tmp); |
@@ -2812,7 +2817,7 @@ static int NCR5380_abort (Scsi_Cmnd *cmd) | |||
2812 | * it from the disconnected queue. | 2817 | * it from the disconnected queue. |
2813 | */ | 2818 | */ |
2814 | 2819 | ||
2815 | for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue; tmp; | 2820 | for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue; tmp; |
2816 | tmp = NEXT(tmp)) | 2821 | tmp = NEXT(tmp)) |
2817 | if (cmd == tmp) { | 2822 | if (cmd == tmp) { |
2818 | local_irq_restore(flags); | 2823 | local_irq_restore(flags); |
@@ -2826,8 +2831,8 @@ static int NCR5380_abort (Scsi_Cmnd *cmd) | |||
2826 | do_abort (instance); | 2831 | do_abort (instance); |
2827 | 2832 | ||
2828 | local_irq_save(flags); | 2833 | local_irq_save(flags); |
2829 | for (prev = (Scsi_Cmnd **) &(hostdata->disconnected_queue), | 2834 | for (prev = (struct scsi_cmnd **) &(hostdata->disconnected_queue), |
2830 | tmp = (Scsi_Cmnd *) hostdata->disconnected_queue; | 2835 | tmp = (struct scsi_cmnd *) hostdata->disconnected_queue; |
2831 | tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp) ) | 2836 | tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp) ) |
2832 | if (cmd == tmp) { | 2837 | if (cmd == tmp) { |
2833 | REMOVE(5, *prev, tmp, NEXT(tmp)); | 2838 | REMOVE(5, *prev, tmp, NEXT(tmp)); |
@@ -2868,7 +2873,7 @@ static int NCR5380_abort (Scsi_Cmnd *cmd) | |||
2868 | 2873 | ||
2869 | 2874 | ||
2870 | /* | 2875 | /* |
2871 | * Function : int NCR5380_bus_reset (Scsi_Cmnd *cmd) | 2876 | * Function : int NCR5380_bus_reset(struct scsi_cmnd *cmd) |
2872 | * | 2877 | * |
2873 | * Purpose : reset the SCSI bus. | 2878 | * Purpose : reset the SCSI bus. |
2874 | * | 2879 | * |
@@ -2876,13 +2881,13 @@ static int NCR5380_abort (Scsi_Cmnd *cmd) | |||
2876 | * | 2881 | * |
2877 | */ | 2882 | */ |
2878 | 2883 | ||
2879 | static int NCR5380_bus_reset( Scsi_Cmnd *cmd) | 2884 | static int NCR5380_bus_reset(struct scsi_cmnd *cmd) |
2880 | { | 2885 | { |
2881 | SETUP_HOSTDATA(cmd->device->host); | 2886 | SETUP_HOSTDATA(cmd->device->host); |
2882 | int i; | 2887 | int i; |
2883 | unsigned long flags; | 2888 | unsigned long flags; |
2884 | #if 1 | 2889 | #if 1 |
2885 | Scsi_Cmnd *connected, *disconnected_queue; | 2890 | struct scsi_cmnd *connected, *disconnected_queue; |
2886 | #endif | 2891 | #endif |
2887 | 2892 | ||
2888 | 2893 | ||
@@ -2914,9 +2919,9 @@ static int NCR5380_bus_reset( Scsi_Cmnd *cmd) | |||
2914 | * remembered in local variables first. | 2919 | * remembered in local variables first. |
2915 | */ | 2920 | */ |
2916 | local_irq_save(flags); | 2921 | local_irq_save(flags); |
2917 | connected = (Scsi_Cmnd *)hostdata->connected; | 2922 | connected = (struct scsi_cmnd *)hostdata->connected; |
2918 | hostdata->connected = NULL; | 2923 | hostdata->connected = NULL; |
2919 | disconnected_queue = (Scsi_Cmnd *)hostdata->disconnected_queue; | 2924 | disconnected_queue = (struct scsi_cmnd *)hostdata->disconnected_queue; |
2920 | hostdata->disconnected_queue = NULL; | 2925 | hostdata->disconnected_queue = NULL; |
2921 | #ifdef SUPPORT_TAGS | 2926 | #ifdef SUPPORT_TAGS |
2922 | free_all_tags(); | 2927 | free_all_tags(); |
diff --git a/drivers/scsi/sun3_scsi.c b/drivers/scsi/sun3_scsi.c index e625b4c5833a..d56d85dd9ba0 100644 --- a/drivers/scsi/sun3_scsi.c +++ b/drivers/scsi/sun3_scsi.c | |||
@@ -119,7 +119,7 @@ module_param(setup_use_tagged_queuing, int, 0); | |||
119 | static int setup_hostid = -1; | 119 | static int setup_hostid = -1; |
120 | module_param(setup_hostid, int, 0); | 120 | module_param(setup_hostid, int, 0); |
121 | 121 | ||
122 | static Scsi_Cmnd *sun3_dma_setup_done = NULL; | 122 | static struct scsi_cmnd *sun3_dma_setup_done = NULL; |
123 | 123 | ||
124 | #define AFTER_RESET_DELAY (HZ/2) | 124 | #define AFTER_RESET_DELAY (HZ/2) |
125 | 125 | ||
@@ -521,8 +521,9 @@ static inline unsigned long sun3scsi_dma_residual(struct Scsi_Host *instance) | |||
521 | return last_residual; | 521 | return last_residual; |
522 | } | 522 | } |
523 | 523 | ||
524 | static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted, Scsi_Cmnd *cmd, | 524 | static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted, |
525 | int write_flag) | 525 | struct scsi_cmnd *cmd, |
526 | int write_flag) | ||
526 | { | 527 | { |
527 | if(blk_fs_request(cmd->request)) | 528 | if(blk_fs_request(cmd->request)) |
528 | return wanted; | 529 | return wanted; |
diff --git a/drivers/scsi/sun3_scsi.h b/drivers/scsi/sun3_scsi.h index 834dab428019..a1103b3e2034 100644 --- a/drivers/scsi/sun3_scsi.h +++ b/drivers/scsi/sun3_scsi.h | |||
@@ -47,11 +47,12 @@ | |||
47 | 47 | ||
48 | #define IOBASE_SUN3_VMESCSI 0xff200000 | 48 | #define IOBASE_SUN3_VMESCSI 0xff200000 |
49 | 49 | ||
50 | static int sun3scsi_abort (Scsi_Cmnd *); | 50 | static int sun3scsi_abort(struct scsi_cmnd *); |
51 | static int sun3scsi_detect (struct scsi_host_template *); | 51 | static int sun3scsi_detect (struct scsi_host_template *); |
52 | static const char *sun3scsi_info (struct Scsi_Host *); | 52 | static const char *sun3scsi_info (struct Scsi_Host *); |
53 | static int sun3scsi_bus_reset(Scsi_Cmnd *); | 53 | static int sun3scsi_bus_reset(struct scsi_cmnd *); |
54 | static int sun3scsi_queue_command (Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); | 54 | static int sun3scsi_queue_command(struct scsi_cmnd *, |
55 | void (*done)(struct scsi_cmnd *)); | ||
55 | static int sun3scsi_release (struct Scsi_Host *); | 56 | static int sun3scsi_release (struct Scsi_Host *); |
56 | 57 | ||
57 | #ifndef CMD_PER_LUN | 58 | #ifndef CMD_PER_LUN |
diff --git a/drivers/scsi/sun3_scsi_vme.c b/drivers/scsi/sun3_scsi_vme.c index e8faab16567b..92def310a84c 100644 --- a/drivers/scsi/sun3_scsi_vme.c +++ b/drivers/scsi/sun3_scsi_vme.c | |||
@@ -84,7 +84,7 @@ module_param(setup_use_tagged_queuing, int, 0); | |||
84 | static int setup_hostid = -1; | 84 | static int setup_hostid = -1; |
85 | module_param(setup_hostid, int, 0); | 85 | module_param(setup_hostid, int, 0); |
86 | 86 | ||
87 | static Scsi_Cmnd *sun3_dma_setup_done = NULL; | 87 | static struct scsi_cmnd *sun3_dma_setup_done = NULL; |
88 | 88 | ||
89 | #define AFTER_RESET_DELAY (HZ/2) | 89 | #define AFTER_RESET_DELAY (HZ/2) |
90 | 90 | ||
@@ -455,8 +455,9 @@ static inline unsigned long sun3scsi_dma_residual(struct Scsi_Host *instance) | |||
455 | return last_residual; | 455 | return last_residual; |
456 | } | 456 | } |
457 | 457 | ||
458 | static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted, Scsi_Cmnd *cmd, | 458 | static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted, |
459 | int write_flag) | 459 | struct scsi_cmnd *cmd, |
460 | int write_flag) | ||
460 | { | 461 | { |
461 | if(blk_fs_request(cmd->request)) | 462 | if(blk_fs_request(cmd->request)) |
462 | return wanted; | 463 | return wanted; |
diff --git a/drivers/scsi/tmscsim.c b/drivers/scsi/tmscsim.c index d03aa6ce8fe8..fa5382e354be 100644 --- a/drivers/scsi/tmscsim.c +++ b/drivers/scsi/tmscsim.c | |||
@@ -2304,6 +2304,7 @@ static struct scsi_host_template driver_template = { | |||
2304 | .sg_tablesize = SG_ALL, | 2304 | .sg_tablesize = SG_ALL, |
2305 | .cmd_per_lun = 1, | 2305 | .cmd_per_lun = 1, |
2306 | .use_clustering = ENABLE_CLUSTERING, | 2306 | .use_clustering = ENABLE_CLUSTERING, |
2307 | .max_sectors = 0x4000, /* 8MiB = 16 * 1024 * 512 */ | ||
2307 | }; | 2308 | }; |
2308 | 2309 | ||
2309 | /*********************************************************************** | 2310 | /*********************************************************************** |
diff --git a/drivers/serial/cpm_uart/cpm_uart.h b/drivers/serial/cpm_uart/cpm_uart.h index a8f894c78194..69715e556506 100644 --- a/drivers/serial/cpm_uart/cpm_uart.h +++ b/drivers/serial/cpm_uart/cpm_uart.h | |||
@@ -88,7 +88,7 @@ extern struct uart_cpm_port cpm_uart_ports[UART_NR]; | |||
88 | 88 | ||
89 | /* these are located in their respective files */ | 89 | /* these are located in their respective files */ |
90 | void cpm_line_cr_cmd(int line, int cmd); | 90 | void cpm_line_cr_cmd(int line, int cmd); |
91 | int cpm_uart_init_portdesc(void); | 91 | int __init cpm_uart_init_portdesc(void); |
92 | int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con); | 92 | int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con); |
93 | void cpm_uart_freebuf(struct uart_cpm_port *pinfo); | 93 | void cpm_uart_freebuf(struct uart_cpm_port *pinfo); |
94 | 94 | ||
diff --git a/drivers/serial/cpm_uart/cpm_uart_core.c b/drivers/serial/cpm_uart/cpm_uart_core.c index 0abb544ae63d..7a3b97fdf8d1 100644 --- a/drivers/serial/cpm_uart/cpm_uart_core.c +++ b/drivers/serial/cpm_uart/cpm_uart_core.c | |||
@@ -195,10 +195,8 @@ static void cpm_uart_start_tx(struct uart_port *port) | |||
195 | if (cpm_uart_tx_pump(port) != 0) { | 195 | if (cpm_uart_tx_pump(port) != 0) { |
196 | if (IS_SMC(pinfo)) { | 196 | if (IS_SMC(pinfo)) { |
197 | smcp->smc_smcm |= SMCM_TX; | 197 | smcp->smc_smcm |= SMCM_TX; |
198 | smcp->smc_smcmr |= SMCMR_TEN; | ||
199 | } else { | 198 | } else { |
200 | sccp->scc_sccm |= UART_SCCM_TX; | 199 | sccp->scc_sccm |= UART_SCCM_TX; |
201 | pinfo->sccp->scc_gsmrl |= SCC_GSMRL_ENT; | ||
202 | } | 200 | } |
203 | } | 201 | } |
204 | } | 202 | } |
@@ -421,9 +419,10 @@ static int cpm_uart_startup(struct uart_port *port) | |||
421 | /* Startup rx-int */ | 419 | /* Startup rx-int */ |
422 | if (IS_SMC(pinfo)) { | 420 | if (IS_SMC(pinfo)) { |
423 | pinfo->smcp->smc_smcm |= SMCM_RX; | 421 | pinfo->smcp->smc_smcm |= SMCM_RX; |
424 | pinfo->smcp->smc_smcmr |= SMCMR_REN; | 422 | pinfo->smcp->smc_smcmr |= (SMCMR_REN | SMCMR_TEN); |
425 | } else { | 423 | } else { |
426 | pinfo->sccp->scc_sccm |= UART_SCCM_RX; | 424 | pinfo->sccp->scc_sccm |= UART_SCCM_RX; |
425 | pinfo->sccp->scc_gsmrl |= (SCC_GSMRL_ENR | SCC_GSMRL_ENT); | ||
427 | } | 426 | } |
428 | 427 | ||
429 | if (!(pinfo->flags & FLAG_CONSOLE)) | 428 | if (!(pinfo->flags & FLAG_CONSOLE)) |
@@ -1350,11 +1349,10 @@ static int cpm_uart_init(void) { | |||
1350 | pr_info("cpm_uart: WARNING: no UART devices found on platform bus!\n"); | 1349 | pr_info("cpm_uart: WARNING: no UART devices found on platform bus!\n"); |
1351 | pr_info( | 1350 | pr_info( |
1352 | "cpm_uart: the driver will guess configuration, but this mode is no longer supported.\n"); | 1351 | "cpm_uart: the driver will guess configuration, but this mode is no longer supported.\n"); |
1353 | #ifndef CONFIG_SERIAL_CPM_CONSOLE | 1352 | |
1354 | ret = cpm_uart_init_portdesc(); | 1353 | /* Don't run this again, if the console driver did it already */ |
1355 | if (ret) | 1354 | if (cpm_uart_nr == 0) |
1356 | return ret; | 1355 | cpm_uart_init_portdesc(); |
1357 | #endif | ||
1358 | 1356 | ||
1359 | cpm_reg.nr = cpm_uart_nr; | 1357 | cpm_reg.nr = cpm_uart_nr; |
1360 | ret = uart_register_driver(&cpm_reg); | 1358 | ret = uart_register_driver(&cpm_reg); |
@@ -1366,6 +1364,8 @@ static int cpm_uart_init(void) { | |||
1366 | int con = cpm_uart_port_map[i]; | 1364 | int con = cpm_uart_port_map[i]; |
1367 | cpm_uart_ports[con].port.line = i; | 1365 | cpm_uart_ports[con].port.line = i; |
1368 | cpm_uart_ports[con].port.flags = UPF_BOOT_AUTOCONF; | 1366 | cpm_uart_ports[con].port.flags = UPF_BOOT_AUTOCONF; |
1367 | if (cpm_uart_ports[con].set_lineif) | ||
1368 | cpm_uart_ports[con].set_lineif(&cpm_uart_ports[con]); | ||
1369 | uart_add_one_port(&cpm_reg, &cpm_uart_ports[con].port); | 1369 | uart_add_one_port(&cpm_reg, &cpm_uart_ports[con].port); |
1370 | } | 1370 | } |
1371 | 1371 | ||
diff --git a/drivers/serial/cpm_uart/cpm_uart_cpm1.c b/drivers/serial/cpm_uart/cpm_uart_cpm1.c index 95afc37297a8..08e55fdc882a 100644 --- a/drivers/serial/cpm_uart/cpm_uart_cpm1.c +++ b/drivers/serial/cpm_uart/cpm_uart_cpm1.c | |||
@@ -184,7 +184,7 @@ void cpm_uart_freebuf(struct uart_cpm_port *pinfo) | |||
184 | } | 184 | } |
185 | 185 | ||
186 | /* Setup any dynamic params in the uart desc */ | 186 | /* Setup any dynamic params in the uart desc */ |
187 | int cpm_uart_init_portdesc(void) | 187 | int __init cpm_uart_init_portdesc(void) |
188 | { | 188 | { |
189 | pr_debug("CPM uart[-]:init portdesc\n"); | 189 | pr_debug("CPM uart[-]:init portdesc\n"); |
190 | 190 | ||
diff --git a/drivers/serial/ioc4_serial.c b/drivers/serial/ioc4_serial.c index ff4fa25f9fd1..711bd1511439 100644 --- a/drivers/serial/ioc4_serial.c +++ b/drivers/serial/ioc4_serial.c | |||
@@ -921,7 +921,7 @@ static void handle_dma_error_intr(void *arg, uint32_t other_ir) | |||
921 | { | 921 | { |
922 | struct ioc4_port *port = (struct ioc4_port *)arg; | 922 | struct ioc4_port *port = (struct ioc4_port *)arg; |
923 | struct hooks *hooks = port->ip_hooks; | 923 | struct hooks *hooks = port->ip_hooks; |
924 | unsigned int flags; | 924 | unsigned long flags; |
925 | 925 | ||
926 | spin_lock_irqsave(&port->ip_lock, flags); | 926 | spin_lock_irqsave(&port->ip_lock, flags); |
927 | 927 | ||
@@ -1834,7 +1834,7 @@ static void handle_intr(void *arg, uint32_t sio_ir) | |||
1834 | struct ioc4_port *port = (struct ioc4_port *)arg; | 1834 | struct ioc4_port *port = (struct ioc4_port *)arg; |
1835 | struct hooks *hooks = port->ip_hooks; | 1835 | struct hooks *hooks = port->ip_hooks; |
1836 | unsigned int rx_high_rd_aborted = 0; | 1836 | unsigned int rx_high_rd_aborted = 0; |
1837 | unsigned int flags; | 1837 | unsigned long flags; |
1838 | struct uart_port *the_port; | 1838 | struct uart_port *the_port; |
1839 | int loop_counter; | 1839 | int loop_counter; |
1840 | 1840 | ||
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 146298ad7371..c3c0626f550b 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
@@ -281,7 +281,6 @@ spi_register_board_info(struct spi_board_info const *info, unsigned n) | |||
281 | up(&board_lock); | 281 | up(&board_lock); |
282 | return 0; | 282 | return 0; |
283 | } | 283 | } |
284 | EXPORT_SYMBOL_GPL(spi_register_board_info); | ||
285 | 284 | ||
286 | /* FIXME someone should add support for a __setup("spi", ...) that | 285 | /* FIXME someone should add support for a __setup("spi", ...) that |
287 | * creates board info from kernel command lines | 286 | * creates board info from kernel command lines |
diff --git a/drivers/telephony/ixj.h b/drivers/telephony/ixj.h index fbea4541c234..8d69bcdc29c9 100644 --- a/drivers/telephony/ixj.h +++ b/drivers/telephony/ixj.h | |||
@@ -1295,7 +1295,7 @@ typedef struct { | |||
1295 | Proc_Info_Type Info_write; | 1295 | Proc_Info_Type Info_write; |
1296 | unsigned short frame_count; | 1296 | unsigned short frame_count; |
1297 | unsigned int filter_hist[4]; | 1297 | unsigned int filter_hist[4]; |
1298 | unsigned char filter_en[4]; | 1298 | unsigned char filter_en[6]; |
1299 | unsigned short proc_load; | 1299 | unsigned short proc_load; |
1300 | unsigned long framesread; | 1300 | unsigned long framesread; |
1301 | unsigned long frameswritten; | 1301 | unsigned long frameswritten; |
diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c index 809d465eb257..6303970e93c1 100644 --- a/drivers/usb/class/usblp.c +++ b/drivers/usb/class/usblp.c | |||
@@ -722,6 +722,7 @@ static ssize_t usblp_write(struct file *file, const char __user *buffer, size_t | |||
722 | usblp->wcomplete = 0; | 722 | usblp->wcomplete = 0; |
723 | err = usb_submit_urb(usblp->writeurb, GFP_KERNEL); | 723 | err = usb_submit_urb(usblp->writeurb, GFP_KERNEL); |
724 | if (err) { | 724 | if (err) { |
725 | usblp->wcomplete = 1; | ||
725 | if (err != -ENOMEM) | 726 | if (err != -ENOMEM) |
726 | count = -EIO; | 727 | count = -EIO; |
727 | else | 728 | else |
@@ -1202,8 +1203,6 @@ static int usblp_suspend (struct usb_interface *intf, pm_message_t message) | |||
1202 | down (&usblp->sem); | 1203 | down (&usblp->sem); |
1203 | /* we take no more IO */ | 1204 | /* we take no more IO */ |
1204 | usblp->sleeping = 1; | 1205 | usblp->sleeping = 1; |
1205 | /* we wait for anything printing */ | ||
1206 | wait_event (usblp->wait, usblp->wcomplete || !usblp->present); | ||
1207 | usblp_unlink_urbs(usblp); | 1206 | usblp_unlink_urbs(usblp); |
1208 | up (&usblp->sem); | 1207 | up (&usblp->sem); |
1209 | mutex_unlock (&usblp_mutex); | 1208 | mutex_unlock (&usblp_mutex); |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 66bff184a30c..ba165aff9ea4 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -1188,6 +1188,7 @@ static inline void show_string(struct usb_device *udev, char *id, char *string) | |||
1188 | 1188 | ||
1189 | #ifdef CONFIG_USB_OTG | 1189 | #ifdef CONFIG_USB_OTG |
1190 | #include "otg_whitelist.h" | 1190 | #include "otg_whitelist.h" |
1191 | static int __usb_port_suspend(struct usb_device *, int port1); | ||
1191 | #endif | 1192 | #endif |
1192 | 1193 | ||
1193 | /** | 1194 | /** |
@@ -1289,8 +1290,6 @@ int usb_new_device(struct usb_device *udev) | |||
1289 | * (Includes HNP test device.) | 1290 | * (Includes HNP test device.) |
1290 | */ | 1291 | */ |
1291 | if (udev->bus->b_hnp_enable || udev->bus->is_b_host) { | 1292 | if (udev->bus->b_hnp_enable || udev->bus->is_b_host) { |
1292 | static int __usb_port_suspend(struct usb_device *, | ||
1293 | int port1); | ||
1294 | err = __usb_port_suspend(udev, udev->bus->otg_port); | 1293 | err = __usb_port_suspend(udev, udev->bus->otg_port); |
1295 | if (err < 0) | 1294 | if (err < 0) |
1296 | dev_dbg(&udev->dev, "HNP fail, %d\n", err); | 1295 | dev_dbg(&udev->dev, "HNP fail, %d\n", err); |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index fccd1952bad3..7729c0744886 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
@@ -828,10 +828,7 @@ char *usb_cache_string(struct usb_device *udev, int index) | |||
828 | * Context: !in_interrupt () | 828 | * Context: !in_interrupt () |
829 | * | 829 | * |
830 | * Updates the copy of the device descriptor stored in the device structure, | 830 | * Updates the copy of the device descriptor stored in the device structure, |
831 | * which dedicates space for this purpose. Note that several fields are | 831 | * which dedicates space for this purpose. |
832 | * converted to the host CPU's byte order: the USB version (bcdUSB), and | ||
833 | * vendors product and version fields (idVendor, idProduct, and bcdDevice). | ||
834 | * That lets device drivers compare against non-byteswapped constants. | ||
835 | * | 832 | * |
836 | * Not exported, only for use by the core. If drivers really want to read | 833 | * Not exported, only for use by the core. If drivers really want to read |
837 | * the device descriptor directly, they can call usb_get_descriptor() with | 834 | * the device descriptor directly, they can call usb_get_descriptor() with |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 9be6b303e784..ea4714e557e4 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -715,13 +715,6 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) | |||
715 | return IRQ_NOTMINE; | 715 | return IRQ_NOTMINE; |
716 | } | 716 | } |
717 | 717 | ||
718 | if (ints & OHCI_INTR_RHSC) { | ||
719 | ohci_vdbg (ohci, "rhsc\n"); | ||
720 | ohci->next_statechange = jiffies + STATECHANGE_DELAY; | ||
721 | ohci_writel (ohci, OHCI_INTR_RHSC, ®s->intrstatus); | ||
722 | usb_hcd_poll_rh_status(hcd); | ||
723 | } | ||
724 | |||
725 | if (ints & OHCI_INTR_UE) { | 718 | if (ints & OHCI_INTR_UE) { |
726 | disable (ohci); | 719 | disable (ohci); |
727 | ohci_err (ohci, "OHCI Unrecoverable Error, disabled\n"); | 720 | ohci_err (ohci, "OHCI Unrecoverable Error, disabled\n"); |
@@ -731,9 +724,21 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) | |||
731 | ohci_usb_reset (ohci); | 724 | ohci_usb_reset (ohci); |
732 | } | 725 | } |
733 | 726 | ||
734 | if (ints & OHCI_INTR_RD) { | 727 | if (ints & OHCI_INTR_RHSC) { |
735 | ohci_vdbg (ohci, "resume detect\n"); | 728 | ohci_vdbg(ohci, "rhsc\n"); |
736 | ohci_writel (ohci, OHCI_INTR_RD, ®s->intrstatus); | 729 | ohci->next_statechange = jiffies + STATECHANGE_DELAY; |
730 | ohci_writel(ohci, OHCI_INTR_RD | OHCI_INTR_RHSC, | ||
731 | ®s->intrstatus); | ||
732 | usb_hcd_poll_rh_status(hcd); | ||
733 | } | ||
734 | |||
735 | /* For connect and disconnect events, we expect the controller | ||
736 | * to turn on RHSC along with RD. But for remote wakeup events | ||
737 | * this might not happen. | ||
738 | */ | ||
739 | else if (ints & OHCI_INTR_RD) { | ||
740 | ohci_vdbg(ohci, "resume detect\n"); | ||
741 | ohci_writel(ohci, OHCI_INTR_RD, ®s->intrstatus); | ||
737 | hcd->poll_rh = 1; | 742 | hcd->poll_rh = 1; |
738 | if (ohci->autostop) { | 743 | if (ohci->autostop) { |
739 | spin_lock (&ohci->lock); | 744 | spin_lock (&ohci->lock); |
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 6f113596af66..6995ea36f2e8 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
@@ -169,7 +169,8 @@ __acquires(ohci->lock) | |||
169 | break; | 169 | break; |
170 | case OHCI_USB_RESUME: | 170 | case OHCI_USB_RESUME: |
171 | /* HCFS changes sometime after INTR_RD */ | 171 | /* HCFS changes sometime after INTR_RD */ |
172 | ohci_info (ohci, "wakeup\n"); | 172 | ohci_info(ohci, "%swakeup\n", |
173 | autostopped ? "auto-" : ""); | ||
173 | break; | 174 | break; |
174 | case OHCI_USB_OPER: | 175 | case OHCI_USB_OPER: |
175 | /* this can happen after resuming a swsusp snapshot */ | 176 | /* this can happen after resuming a swsusp snapshot */ |
@@ -422,7 +423,8 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
422 | ohci->autostop = 0; | 423 | ohci->autostop = 0; |
423 | ohci->next_statechange = jiffies + | 424 | ohci->next_statechange = jiffies + |
424 | STATECHANGE_DELAY; | 425 | STATECHANGE_DELAY; |
425 | } else if (time_after_eq (jiffies, | 426 | } else if (device_may_wakeup(&hcd->self.root_hub->dev) |
427 | && time_after_eq(jiffies, | ||
426 | ohci->next_statechange) | 428 | ohci->next_statechange) |
427 | && !ohci->ed_rm_list | 429 | && !ohci->ed_rm_list |
428 | && !(ohci->hc_control & | 430 | && !(ohci->hc_control & |
diff --git a/drivers/usb/input/ati_remote.c b/drivers/usb/input/ati_remote.c index f659f3028ad2..787b847d38cc 100644 --- a/drivers/usb/input/ati_remote.c +++ b/drivers/usb/input/ati_remote.c | |||
@@ -636,13 +636,11 @@ static void ati_remote_free_buffers(struct ati_remote *ati_remote) | |||
636 | if (ati_remote->out_urb) | 636 | if (ati_remote->out_urb) |
637 | usb_free_urb(ati_remote->out_urb); | 637 | usb_free_urb(ati_remote->out_urb); |
638 | 638 | ||
639 | if (ati_remote->inbuf) | 639 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, |
640 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, | 640 | ati_remote->inbuf, ati_remote->inbuf_dma); |
641 | ati_remote->inbuf, ati_remote->inbuf_dma); | ||
642 | 641 | ||
643 | if (ati_remote->outbuf) | 642 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, |
644 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, | 643 | ati_remote->outbuf, ati_remote->outbuf_dma); |
645 | ati_remote->inbuf, ati_remote->outbuf_dma); | ||
646 | } | 644 | } |
647 | 645 | ||
648 | static void ati_remote_input_init(struct ati_remote *ati_remote) | 646 | static void ati_remote_input_init(struct ati_remote *ati_remote) |
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index 45f44fe33bfe..6d08a3bcc952 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c | |||
@@ -270,7 +270,7 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign | |||
270 | * Read data value from item. | 270 | * Read data value from item. |
271 | */ | 271 | */ |
272 | 272 | ||
273 | static __inline__ __u32 item_udata(struct hid_item *item) | 273 | static u32 item_udata(struct hid_item *item) |
274 | { | 274 | { |
275 | switch (item->size) { | 275 | switch (item->size) { |
276 | case 1: return item->data.u8; | 276 | case 1: return item->data.u8; |
@@ -280,7 +280,7 @@ static __inline__ __u32 item_udata(struct hid_item *item) | |||
280 | return 0; | 280 | return 0; |
281 | } | 281 | } |
282 | 282 | ||
283 | static __inline__ __s32 item_sdata(struct hid_item *item) | 283 | static s32 item_sdata(struct hid_item *item) |
284 | { | 284 | { |
285 | switch (item->size) { | 285 | switch (item->size) { |
286 | case 1: return item->data.s8; | 286 | case 1: return item->data.s8; |
@@ -727,7 +727,7 @@ static struct hid_device *hid_parse_report(__u8 *start, unsigned size) | |||
727 | * done by hand. | 727 | * done by hand. |
728 | */ | 728 | */ |
729 | 729 | ||
730 | static __inline__ __s32 snto32(__u32 value, unsigned n) | 730 | static s32 snto32(__u32 value, unsigned n) |
731 | { | 731 | { |
732 | switch (n) { | 732 | switch (n) { |
733 | case 8: return ((__s8)value); | 733 | case 8: return ((__s8)value); |
@@ -741,9 +741,9 @@ static __inline__ __s32 snto32(__u32 value, unsigned n) | |||
741 | * Convert a signed 32-bit integer to a signed n-bit integer. | 741 | * Convert a signed 32-bit integer to a signed n-bit integer. |
742 | */ | 742 | */ |
743 | 743 | ||
744 | static __inline__ __u32 s32ton(__s32 value, unsigned n) | 744 | static u32 s32ton(__s32 value, unsigned n) |
745 | { | 745 | { |
746 | __s32 a = value >> (n - 1); | 746 | s32 a = value >> (n - 1); |
747 | if (a && a != -1) | 747 | if (a && a != -1) |
748 | return value < 0 ? 1 << (n - 1) : (1 << (n - 1)) - 1; | 748 | return value < 0 ? 1 << (n - 1) : (1 << (n - 1)) - 1; |
749 | return value & ((1 << n) - 1); | 749 | return value & ((1 << n) - 1); |
@@ -751,30 +751,55 @@ static __inline__ __u32 s32ton(__s32 value, unsigned n) | |||
751 | 751 | ||
752 | /* | 752 | /* |
753 | * Extract/implement a data field from/to a little endian report (bit array). | 753 | * Extract/implement a data field from/to a little endian report (bit array). |
754 | * | ||
755 | * Code sort-of follows HID spec: | ||
756 | * http://www.usb.org/developers/devclass_docs/HID1_11.pdf | ||
757 | * | ||
758 | * While the USB HID spec allows unlimited length bit fields in "report | ||
759 | * descriptors", most devices never use more than 16 bits. | ||
760 | * One model of UPS is claimed to report "LINEV" as a 32-bit field. | ||
761 | * Search linux-kernel and linux-usb-devel archives for "hid-core extract". | ||
754 | */ | 762 | */ |
755 | 763 | ||
756 | static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n) | 764 | static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n) |
757 | { | 765 | { |
758 | u32 x; | 766 | u64 x; |
767 | |||
768 | WARN_ON(n > 32); | ||
759 | 769 | ||
760 | report += offset >> 3; /* adjust byte index */ | 770 | report += offset >> 3; /* adjust byte index */ |
761 | offset &= 8 - 1; | 771 | offset &= 7; /* now only need bit offset into one byte */ |
762 | x = get_unaligned((u32 *) report); | 772 | x = get_unaligned((u64 *) report); |
763 | x = le32_to_cpu(x); | 773 | x = le64_to_cpu(x); |
764 | x = (x >> offset) & ((1 << n) - 1); | 774 | x = (x >> offset) & ((1ULL << n) - 1); /* extract bit field */ |
765 | return x; | 775 | return (u32) x; |
766 | } | 776 | } |
767 | 777 | ||
778 | /* | ||
779 | * "implement" : set bits in a little endian bit stream. | ||
780 | * Same concepts as "extract" (see comments above). | ||
781 | * The data mangled in the bit stream remains in little endian | ||
782 | * order the whole time. It make more sense to talk about | ||
783 | * endianness of register values by considering a register | ||
784 | * a "cached" copy of the little endiad bit stream. | ||
785 | */ | ||
768 | static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value) | 786 | static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value) |
769 | { | 787 | { |
770 | u32 x; | 788 | u64 x; |
789 | u64 m = (1ULL << n) - 1; | ||
790 | |||
791 | WARN_ON(n > 32); | ||
792 | |||
793 | WARN_ON(value > m); | ||
794 | value &= m; | ||
771 | 795 | ||
772 | report += offset >> 3; | 796 | report += offset >> 3; |
773 | offset &= 8 - 1; | 797 | offset &= 7; |
774 | x = get_unaligned((u32 *)report); | 798 | |
775 | x &= cpu_to_le32(~((((__u32) 1 << n) - 1) << offset)); | 799 | x = get_unaligned((u64 *)report); |
776 | x |= cpu_to_le32(value << offset); | 800 | x &= cpu_to_le64(~(m << offset)); |
777 | put_unaligned(x,(u32 *)report); | 801 | x |= cpu_to_le64(((u64) value) << offset); |
802 | put_unaligned(x, (u64 *) report); | ||
778 | } | 803 | } |
779 | 804 | ||
780 | /* | 805 | /* |
@@ -1615,6 +1640,9 @@ void hid_init_reports(struct hid_device *hid) | |||
1615 | #define USB_VENDOR_ID_SUN 0x0430 | 1640 | #define USB_VENDOR_ID_SUN 0x0430 |
1616 | #define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab | 1641 | #define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab |
1617 | 1642 | ||
1643 | #define USB_VENDOR_ID_AIRCABLE 0x16CA | ||
1644 | #define USB_DEVICE_ID_AIRCABLE1 0x1502 | ||
1645 | |||
1618 | /* | 1646 | /* |
1619 | * Alphabetically sorted blacklist by quirk type. | 1647 | * Alphabetically sorted blacklist by quirk type. |
1620 | */ | 1648 | */ |
@@ -1632,6 +1660,7 @@ static const struct hid_blacklist { | |||
1632 | { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22, HID_QUIRK_IGNORE }, | 1660 | { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22, HID_QUIRK_IGNORE }, |
1633 | { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23, HID_QUIRK_IGNORE }, | 1661 | { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23, HID_QUIRK_IGNORE }, |
1634 | { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24, HID_QUIRK_IGNORE }, | 1662 | { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24, HID_QUIRK_IGNORE }, |
1663 | { USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1, HID_QUIRK_IGNORE }, | ||
1635 | { USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232, HID_QUIRK_IGNORE }, | 1664 | { USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232, HID_QUIRK_IGNORE }, |
1636 | { USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD, HID_QUIRK_IGNORE }, | 1665 | { USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD, HID_QUIRK_IGNORE }, |
1637 | { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW40, HID_QUIRK_IGNORE }, | 1666 | { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW40, HID_QUIRK_IGNORE }, |
@@ -1768,11 +1797,12 @@ static const struct hid_blacklist { | |||
1768 | { USB_VENDOR_ID_APPLE, 0x020E, HID_QUIRK_POWERBOOK_HAS_FN }, | 1797 | { USB_VENDOR_ID_APPLE, 0x020E, HID_QUIRK_POWERBOOK_HAS_FN }, |
1769 | { USB_VENDOR_ID_APPLE, 0x020F, HID_QUIRK_POWERBOOK_HAS_FN }, | 1798 | { USB_VENDOR_ID_APPLE, 0x020F, HID_QUIRK_POWERBOOK_HAS_FN }, |
1770 | { USB_VENDOR_ID_APPLE, 0x0214, HID_QUIRK_POWERBOOK_HAS_FN }, | 1799 | { USB_VENDOR_ID_APPLE, 0x0214, HID_QUIRK_POWERBOOK_HAS_FN }, |
1771 | { USB_VENDOR_ID_APPLE, 0x0215, HID_QUIRK_POWERBOOK_HAS_FN }, | 1800 | { USB_VENDOR_ID_APPLE, 0x0215, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, |
1772 | { USB_VENDOR_ID_APPLE, 0x0216, HID_QUIRK_POWERBOOK_HAS_FN }, | 1801 | { USB_VENDOR_ID_APPLE, 0x0216, HID_QUIRK_POWERBOOK_HAS_FN }, |
1773 | { USB_VENDOR_ID_APPLE, 0x0217, HID_QUIRK_POWERBOOK_HAS_FN }, | 1802 | { USB_VENDOR_ID_APPLE, 0x0217, HID_QUIRK_POWERBOOK_HAS_FN }, |
1774 | { USB_VENDOR_ID_APPLE, 0x0218, HID_QUIRK_POWERBOOK_HAS_FN }, | 1803 | { USB_VENDOR_ID_APPLE, 0x0218, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, |
1775 | { USB_VENDOR_ID_APPLE, 0x0219, HID_QUIRK_POWERBOOK_HAS_FN }, | 1804 | { USB_VENDOR_ID_APPLE, 0x0219, HID_QUIRK_POWERBOOK_HAS_FN }, |
1805 | { USB_VENDOR_ID_APPLE, 0x021B, HID_QUIRK_POWERBOOK_HAS_FN }, | ||
1776 | { USB_VENDOR_ID_APPLE, 0x030A, HID_QUIRK_POWERBOOK_HAS_FN }, | 1806 | { USB_VENDOR_ID_APPLE, 0x030A, HID_QUIRK_POWERBOOK_HAS_FN }, |
1777 | { USB_VENDOR_ID_APPLE, 0x030B, HID_QUIRK_POWERBOOK_HAS_FN }, | 1807 | { USB_VENDOR_ID_APPLE, 0x030B, HID_QUIRK_POWERBOOK_HAS_FN }, |
1778 | 1808 | ||
diff --git a/drivers/usb/input/hid-input.c b/drivers/usb/input/hid-input.c index 9a808a3b4d37..68e7ebb978a9 100644 --- a/drivers/usb/input/hid-input.c +++ b/drivers/usb/input/hid-input.c | |||
@@ -121,6 +121,12 @@ static struct hidinput_key_translation powerbook_numlock_keys[] = { | |||
121 | { } | 121 | { } |
122 | }; | 122 | }; |
123 | 123 | ||
124 | static struct hidinput_key_translation powerbook_iso_keyboard[] = { | ||
125 | { KEY_GRAVE, KEY_102ND }, | ||
126 | { KEY_102ND, KEY_GRAVE }, | ||
127 | { } | ||
128 | }; | ||
129 | |||
124 | static int usbhid_pb_fnmode = 1; | 130 | static int usbhid_pb_fnmode = 1; |
125 | module_param_named(pb_fnmode, usbhid_pb_fnmode, int, 0644); | 131 | module_param_named(pb_fnmode, usbhid_pb_fnmode, int, 0644); |
126 | MODULE_PARM_DESC(pb_fnmode, | 132 | MODULE_PARM_DESC(pb_fnmode, |
@@ -195,6 +201,14 @@ static int hidinput_pb_event(struct hid_device *hid, struct input_dev *input, | |||
195 | } | 201 | } |
196 | } | 202 | } |
197 | 203 | ||
204 | if (hid->quirks & HID_QUIRK_POWERBOOK_ISO_KEYBOARD) { | ||
205 | trans = find_translation(powerbook_iso_keyboard, usage->code); | ||
206 | if (trans) { | ||
207 | input_event(input, usage->type, trans->to, value); | ||
208 | return 1; | ||
209 | } | ||
210 | } | ||
211 | |||
198 | return 0; | 212 | return 0; |
199 | } | 213 | } |
200 | 214 | ||
@@ -210,6 +224,9 @@ static void hidinput_pb_setup(struct input_dev *input) | |||
210 | 224 | ||
211 | for (trans = powerbook_numlock_keys; trans->from; trans++) | 225 | for (trans = powerbook_numlock_keys; trans->from; trans++) |
212 | set_bit(trans->to, input->keybit); | 226 | set_bit(trans->to, input->keybit); |
227 | |||
228 | for (trans = powerbook_iso_keyboard; trans->from; trans++) | ||
229 | set_bit(trans->to, input->keybit); | ||
213 | } | 230 | } |
214 | #else | 231 | #else |
215 | static inline int hidinput_pb_event(struct hid_device *hid, struct input_dev *input, | 232 | static inline int hidinput_pb_event(struct hid_device *hid, struct input_dev *input, |
diff --git a/drivers/usb/input/hid.h b/drivers/usb/input/hid.h index 9b50effef758..0e76e6dcac37 100644 --- a/drivers/usb/input/hid.h +++ b/drivers/usb/input/hid.h | |||
@@ -260,6 +260,7 @@ struct hid_item { | |||
260 | #define HID_QUIRK_POWERBOOK_HAS_FN 0x00001000 | 260 | #define HID_QUIRK_POWERBOOK_HAS_FN 0x00001000 |
261 | #define HID_QUIRK_POWERBOOK_FN_ON 0x00002000 | 261 | #define HID_QUIRK_POWERBOOK_FN_ON 0x00002000 |
262 | #define HID_QUIRK_INVERT_HWHEEL 0x00004000 | 262 | #define HID_QUIRK_INVERT_HWHEEL 0x00004000 |
263 | #define HID_QUIRK_POWERBOOK_ISO_KEYBOARD 0x00008000 | ||
263 | 264 | ||
264 | /* | 265 | /* |
265 | * This is the global environment of the parser. This information is | 266 | * This is the global environment of the parser. This information is |
diff --git a/drivers/usb/input/usbtouchscreen.c b/drivers/usb/input/usbtouchscreen.c index 2902742895ad..933ceddf3dee 100644 --- a/drivers/usb/input/usbtouchscreen.c +++ b/drivers/usb/input/usbtouchscreen.c | |||
@@ -640,7 +640,7 @@ static int usbtouch_probe(struct usb_interface *intf, | |||
640 | type->max_press, 0, 0); | 640 | type->max_press, 0, 0); |
641 | 641 | ||
642 | usb_fill_int_urb(usbtouch->irq, usbtouch->udev, | 642 | usb_fill_int_urb(usbtouch->irq, usbtouch->udev, |
643 | usb_rcvintpipe(usbtouch->udev, 0x81), | 643 | usb_rcvintpipe(usbtouch->udev, endpoint->bEndpointAddress), |
644 | usbtouch->data, type->rept_size, | 644 | usbtouch->data, type->rept_size, |
645 | usbtouch_irq, usbtouch, endpoint->bInterval); | 645 | usbtouch_irq, usbtouch, endpoint->bInterval); |
646 | 646 | ||
diff --git a/drivers/usb/input/xpad.c b/drivers/usb/input/xpad.c index 6a12a943b938..df97e5c803f9 100644 --- a/drivers/usb/input/xpad.c +++ b/drivers/usb/input/xpad.c | |||
@@ -2,6 +2,10 @@ | |||
2 | * X-Box gamepad - v0.0.6 | 2 | * X-Box gamepad - v0.0.6 |
3 | * | 3 | * |
4 | * Copyright (c) 2002 Marko Friedemann <mfr@bmx-chemnitz.de> | 4 | * Copyright (c) 2002 Marko Friedemann <mfr@bmx-chemnitz.de> |
5 | * 2004 Oliver Schwartz <Oliver.Schwartz@gmx.de>, | ||
6 | * Steven Toth <steve@toth.demon.co.uk>, | ||
7 | * Franz Lehner <franz@caos.at>, | ||
8 | * Ivan Hawkes <blackhawk@ivanhawkes.com> | ||
5 | * 2005 Dominic Cerquetti <binary1230@yahoo.com> | 9 | * 2005 Dominic Cerquetti <binary1230@yahoo.com> |
6 | * 2006 Adam Buchbinder <adam.buchbinder@gmail.com> | 10 | * 2006 Adam Buchbinder <adam.buchbinder@gmail.com> |
7 | * | 11 | * |
@@ -29,6 +33,7 @@ | |||
29 | * - ITO Takayuki for providing essential xpad information on his website | 33 | * - ITO Takayuki for providing essential xpad information on his website |
30 | * - Vojtech Pavlik - iforce driver / input subsystem | 34 | * - Vojtech Pavlik - iforce driver / input subsystem |
31 | * - Greg Kroah-Hartman - usb-skeleton driver | 35 | * - Greg Kroah-Hartman - usb-skeleton driver |
36 | * - XBOX Linux project - extra USB id's | ||
32 | * | 37 | * |
33 | * TODO: | 38 | * TODO: |
34 | * - fine tune axes (especially trigger axes) | 39 | * - fine tune axes (especially trigger axes) |
@@ -54,6 +59,13 @@ | |||
54 | * - fixed d-pad to axes mapping | 59 | * - fixed d-pad to axes mapping |
55 | * | 60 | * |
56 | * 2002-07-17 - 0.0.5 : simplified d-pad handling | 61 | * 2002-07-17 - 0.0.5 : simplified d-pad handling |
62 | * | ||
63 | * 2004-10-02 - 0.0.6 : DDR pad support | ||
64 | * - borrowed from the XBOX linux kernel | ||
65 | * - USB id's for commonly used dance pads are present | ||
66 | * - dance pads will map D-PAD to buttons, not axes | ||
67 | * - pass the module paramater 'dpad_to_buttons' to force | ||
68 | * the D-PAD to map to buttons if your pad is not detected | ||
57 | */ | 69 | */ |
58 | 70 | ||
59 | #include <linux/kernel.h> | 71 | #include <linux/kernel.h> |
@@ -90,8 +102,35 @@ static const struct xpad_device { | |||
90 | { 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", MAP_DPAD_TO_AXES }, | 102 | { 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", MAP_DPAD_TO_AXES }, |
91 | { 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", MAP_DPAD_TO_AXES }, | 103 | { 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", MAP_DPAD_TO_AXES }, |
92 | { 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", MAP_DPAD_TO_AXES }, | 104 | { 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", MAP_DPAD_TO_AXES }, |
93 | { 0x05fd, 0x107a, "InterAct 'PowerPad Pro' X-Box pad (Germany)", MAP_DPAD_TO_AXES }, | 105 | { 0x045e, 0x0287, "Microsoft Xbox Controller S", MAP_DPAD_TO_AXES }, |
94 | { 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", MAP_DPAD_TO_BUTTONS }, | 106 | { 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", MAP_DPAD_TO_BUTTONS }, |
107 | { 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", MAP_DPAD_TO_AXES }, | ||
108 | { 0x046d, 0xca84, "Logitech Xbox Cordless Controller", MAP_DPAD_TO_AXES }, | ||
109 | { 0x046d, 0xca88, "Logitech Compact Controller for Xbox", MAP_DPAD_TO_AXES }, | ||
110 | { 0x05fd, 0x1007, "Mad Catz Controller (unverified)", MAP_DPAD_TO_AXES }, | ||
111 | { 0x05fd, 0x107a, "InterAct 'PowerPad Pro' X-Box pad (Germany)", MAP_DPAD_TO_AXES }, | ||
112 | { 0x0738, 0x4516, "Mad Catz Control Pad", MAP_DPAD_TO_AXES }, | ||
113 | { 0x0738, 0x4522, "Mad Catz LumiCON", MAP_DPAD_TO_AXES }, | ||
114 | { 0x0738, 0x4526, "Mad Catz Control Pad Pro", MAP_DPAD_TO_AXES }, | ||
115 | { 0x0738, 0x4536, "Mad Catz MicroCON", MAP_DPAD_TO_AXES }, | ||
116 | { 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS }, | ||
117 | { 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", MAP_DPAD_TO_AXES }, | ||
118 | { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS }, | ||
119 | { 0x0c12, 0x8802, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES }, | ||
120 | { 0x0c12, 0x8810, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES }, | ||
121 | { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", MAP_DPAD_TO_AXES }, | ||
122 | { 0x0e4c, 0x1097, "Radica Gamester Controller", MAP_DPAD_TO_AXES }, | ||
123 | { 0x0e4c, 0x2390, "Radica Games Jtech Controller", MAP_DPAD_TO_AXES}, | ||
124 | { 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", MAP_DPAD_TO_AXES }, | ||
125 | { 0x0e6f, 0x0005, "Eclipse wireless Controller", MAP_DPAD_TO_AXES }, | ||
126 | { 0x0e6f, 0x0006, "Edge wireless Controller", MAP_DPAD_TO_AXES }, | ||
127 | { 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", MAP_DPAD_TO_AXES }, | ||
128 | { 0x0f30, 0x0202, "Joytech Advanced Controller", MAP_DPAD_TO_AXES }, | ||
129 | { 0x0f30, 0x8888, "BigBen XBMiniPad Controller", MAP_DPAD_TO_AXES }, | ||
130 | { 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", MAP_DPAD_TO_AXES }, | ||
131 | { 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS }, | ||
132 | { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS }, | ||
133 | { 0xffff, 0xffff, "Chinese-made Xbox Controller", MAP_DPAD_TO_AXES }, | ||
95 | { 0x0000, 0x0000, "Generic X-Box pad", MAP_DPAD_UNKNOWN } | 134 | { 0x0000, 0x0000, "Generic X-Box pad", MAP_DPAD_UNKNOWN } |
96 | }; | 135 | }; |
97 | 136 | ||
diff --git a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c index 0be9d62d62ae..e4971d6aaafb 100644 --- a/drivers/usb/misc/auerswald.c +++ b/drivers/usb/misc/auerswald.c | |||
@@ -780,7 +780,7 @@ static int auerbuf_setup (pauerbufctl_t bcp, unsigned int numElements, unsigned | |||
780 | 780 | ||
781 | bl_fail:/* not enough memory. Free allocated elements */ | 781 | bl_fail:/* not enough memory. Free allocated elements */ |
782 | dbg ("auerbuf_setup: no more memory"); | 782 | dbg ("auerbuf_setup: no more memory"); |
783 | kfree(bep); | 783 | auerbuf_free(bep); |
784 | auerbuf_free_buffers (bcp); | 784 | auerbuf_free_buffers (bcp); |
785 | return -ENOMEM; | 785 | return -ENOMEM; |
786 | } | 786 | } |
diff --git a/drivers/usb/net/Kconfig b/drivers/usb/net/Kconfig index 454a186b64ad..e081836014ac 100644 --- a/drivers/usb/net/Kconfig +++ b/drivers/usb/net/Kconfig | |||
@@ -92,8 +92,13 @@ config USB_RTL8150 | |||
92 | To compile this driver as a module, choose M here: the | 92 | To compile this driver as a module, choose M here: the |
93 | module will be called rtl8150. | 93 | module will be called rtl8150. |
94 | 94 | ||
95 | config USB_USBNET_MII | ||
96 | tristate | ||
97 | default n | ||
98 | |||
95 | config USB_USBNET | 99 | config USB_USBNET |
96 | tristate "Multi-purpose USB Networking Framework" | 100 | tristate "Multi-purpose USB Networking Framework" |
101 | select MII if USBNET_MII != n | ||
97 | ---help--- | 102 | ---help--- |
98 | This driver supports several kinds of network links over USB, | 103 | This driver supports several kinds of network links over USB, |
99 | with "minidrivers" built around a common network driver core | 104 | with "minidrivers" built around a common network driver core |
@@ -129,7 +134,7 @@ config USB_NET_AX8817X | |||
129 | tristate "ASIX AX88xxx Based USB 2.0 Ethernet Adapters" | 134 | tristate "ASIX AX88xxx Based USB 2.0 Ethernet Adapters" |
130 | depends on USB_USBNET && NET_ETHERNET | 135 | depends on USB_USBNET && NET_ETHERNET |
131 | select CRC32 | 136 | select CRC32 |
132 | select MII | 137 | select USB_USBNET_MII |
133 | default y | 138 | default y |
134 | help | 139 | help |
135 | This option adds support for ASIX AX88xxx based USB 2.0 | 140 | This option adds support for ASIX AX88xxx based USB 2.0 |
@@ -210,6 +215,7 @@ config USB_NET_PLUSB | |||
210 | config USB_NET_MCS7830 | 215 | config USB_NET_MCS7830 |
211 | tristate "MosChip MCS7830 based Ethernet adapters" | 216 | tristate "MosChip MCS7830 based Ethernet adapters" |
212 | depends on USB_USBNET | 217 | depends on USB_USBNET |
218 | select USB_USBNET_MII | ||
213 | help | 219 | help |
214 | Choose this option if you're using a 10/100 Ethernet USB2 | 220 | Choose this option if you're using a 10/100 Ethernet USB2 |
215 | adapter based on the MosChip 7830 controller. This includes | 221 | adapter based on the MosChip 7830 controller. This includes |
diff --git a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c index cf3d20eb781c..760b5327b81b 100644 --- a/drivers/usb/net/usbnet.c +++ b/drivers/usb/net/usbnet.c | |||
@@ -554,7 +554,7 @@ static int usbnet_stop (struct net_device *net) | |||
554 | { | 554 | { |
555 | struct usbnet *dev = netdev_priv(net); | 555 | struct usbnet *dev = netdev_priv(net); |
556 | int temp; | 556 | int temp; |
557 | DECLARE_WAIT_QUEUE_HEAD (unlink_wakeup); | 557 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK (unlink_wakeup); |
558 | DECLARE_WAITQUEUE (wait, current); | 558 | DECLARE_WAITQUEUE (wait, current); |
559 | 559 | ||
560 | netif_stop_queue (net); | 560 | netif_stop_queue (net); |
@@ -669,6 +669,9 @@ done: | |||
669 | * they'll probably want to use this base set. | 669 | * they'll probably want to use this base set. |
670 | */ | 670 | */ |
671 | 671 | ||
672 | #if defined(CONFIG_MII) || defined(CONFIG_MII_MODULE) | ||
673 | #define HAVE_MII | ||
674 | |||
672 | int usbnet_get_settings (struct net_device *net, struct ethtool_cmd *cmd) | 675 | int usbnet_get_settings (struct net_device *net, struct ethtool_cmd *cmd) |
673 | { | 676 | { |
674 | struct usbnet *dev = netdev_priv(net); | 677 | struct usbnet *dev = netdev_priv(net); |
@@ -699,20 +702,6 @@ int usbnet_set_settings (struct net_device *net, struct ethtool_cmd *cmd) | |||
699 | } | 702 | } |
700 | EXPORT_SYMBOL_GPL(usbnet_set_settings); | 703 | EXPORT_SYMBOL_GPL(usbnet_set_settings); |
701 | 704 | ||
702 | |||
703 | void usbnet_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info) | ||
704 | { | ||
705 | struct usbnet *dev = netdev_priv(net); | ||
706 | |||
707 | /* REVISIT don't always return "usbnet" */ | ||
708 | strncpy (info->driver, driver_name, sizeof info->driver); | ||
709 | strncpy (info->version, DRIVER_VERSION, sizeof info->version); | ||
710 | strncpy (info->fw_version, dev->driver_info->description, | ||
711 | sizeof info->fw_version); | ||
712 | usb_make_path (dev->udev, info->bus_info, sizeof info->bus_info); | ||
713 | } | ||
714 | EXPORT_SYMBOL_GPL(usbnet_get_drvinfo); | ||
715 | |||
716 | u32 usbnet_get_link (struct net_device *net) | 705 | u32 usbnet_get_link (struct net_device *net) |
717 | { | 706 | { |
718 | struct usbnet *dev = netdev_priv(net); | 707 | struct usbnet *dev = netdev_priv(net); |
@@ -730,40 +719,57 @@ u32 usbnet_get_link (struct net_device *net) | |||
730 | } | 719 | } |
731 | EXPORT_SYMBOL_GPL(usbnet_get_link); | 720 | EXPORT_SYMBOL_GPL(usbnet_get_link); |
732 | 721 | ||
733 | u32 usbnet_get_msglevel (struct net_device *net) | 722 | int usbnet_nway_reset(struct net_device *net) |
734 | { | 723 | { |
735 | struct usbnet *dev = netdev_priv(net); | 724 | struct usbnet *dev = netdev_priv(net); |
736 | 725 | ||
737 | return dev->msg_enable; | 726 | if (!dev->mii.mdio_write) |
727 | return -EOPNOTSUPP; | ||
728 | |||
729 | return mii_nway_restart(&dev->mii); | ||
738 | } | 730 | } |
739 | EXPORT_SYMBOL_GPL(usbnet_get_msglevel); | 731 | EXPORT_SYMBOL_GPL(usbnet_nway_reset); |
740 | 732 | ||
741 | void usbnet_set_msglevel (struct net_device *net, u32 level) | 733 | #endif /* HAVE_MII */ |
734 | |||
735 | void usbnet_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info) | ||
742 | { | 736 | { |
743 | struct usbnet *dev = netdev_priv(net); | 737 | struct usbnet *dev = netdev_priv(net); |
744 | 738 | ||
745 | dev->msg_enable = level; | 739 | /* REVISIT don't always return "usbnet" */ |
740 | strncpy (info->driver, driver_name, sizeof info->driver); | ||
741 | strncpy (info->version, DRIVER_VERSION, sizeof info->version); | ||
742 | strncpy (info->fw_version, dev->driver_info->description, | ||
743 | sizeof info->fw_version); | ||
744 | usb_make_path (dev->udev, info->bus_info, sizeof info->bus_info); | ||
746 | } | 745 | } |
747 | EXPORT_SYMBOL_GPL(usbnet_set_msglevel); | 746 | EXPORT_SYMBOL_GPL(usbnet_get_drvinfo); |
748 | 747 | ||
749 | int usbnet_nway_reset(struct net_device *net) | 748 | u32 usbnet_get_msglevel (struct net_device *net) |
750 | { | 749 | { |
751 | struct usbnet *dev = netdev_priv(net); | 750 | struct usbnet *dev = netdev_priv(net); |
752 | 751 | ||
753 | if (!dev->mii.mdio_write) | 752 | return dev->msg_enable; |
754 | return -EOPNOTSUPP; | 753 | } |
754 | EXPORT_SYMBOL_GPL(usbnet_get_msglevel); | ||
755 | 755 | ||
756 | return mii_nway_restart(&dev->mii); | 756 | void usbnet_set_msglevel (struct net_device *net, u32 level) |
757 | { | ||
758 | struct usbnet *dev = netdev_priv(net); | ||
759 | |||
760 | dev->msg_enable = level; | ||
757 | } | 761 | } |
758 | EXPORT_SYMBOL_GPL(usbnet_nway_reset); | 762 | EXPORT_SYMBOL_GPL(usbnet_set_msglevel); |
759 | 763 | ||
760 | /* drivers may override default ethtool_ops in their bind() routine */ | 764 | /* drivers may override default ethtool_ops in their bind() routine */ |
761 | static struct ethtool_ops usbnet_ethtool_ops = { | 765 | static struct ethtool_ops usbnet_ethtool_ops = { |
766 | #ifdef HAVE_MII | ||
762 | .get_settings = usbnet_get_settings, | 767 | .get_settings = usbnet_get_settings, |
763 | .set_settings = usbnet_set_settings, | 768 | .set_settings = usbnet_set_settings, |
764 | .get_drvinfo = usbnet_get_drvinfo, | ||
765 | .get_link = usbnet_get_link, | 769 | .get_link = usbnet_get_link, |
766 | .nway_reset = usbnet_nway_reset, | 770 | .nway_reset = usbnet_nway_reset, |
771 | #endif | ||
772 | .get_drvinfo = usbnet_get_drvinfo, | ||
767 | .get_msglevel = usbnet_get_msglevel, | 773 | .get_msglevel = usbnet_get_msglevel, |
768 | .set_msglevel = usbnet_set_msglevel, | 774 | .set_msglevel = usbnet_set_msglevel, |
769 | }; | 775 | }; |
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index 9a6ec1b5e3d5..2a8dd4cc943d 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig | |||
@@ -54,10 +54,10 @@ config USB_SERIAL_GENERIC | |||
54 | properly. | 54 | properly. |
55 | 55 | ||
56 | config USB_SERIAL_AIRCABLE | 56 | config USB_SERIAL_AIRCABLE |
57 | tristate "AIRcable USB Bluetooth Dongle Driver (EXPERIMENTAL)" | 57 | tristate "USB AIRcable Bluetooth Dongle Driver (EXPERIMENTAL)" |
58 | depends on USB_SERIAL && EXPERIMENTAL | 58 | depends on USB_SERIAL && EXPERIMENTAL |
59 | help | 59 | help |
60 | Say Y here if you want to use AIRcable USB Bluetoot Dongle. | 60 | Say Y here if you want to use USB AIRcable Bluetooth Dongle. |
61 | 61 | ||
62 | To compile this driver as a module, choose M here: the module | 62 | To compile this driver as a module, choose M here: the module |
63 | will be called aircable. | 63 | will be called aircable. |
diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c index bbf6532c26e5..f95d42c0d16a 100644 --- a/drivers/usb/serial/cp2101.c +++ b/drivers/usb/serial/cp2101.c | |||
@@ -64,6 +64,9 @@ static struct usb_device_id id_table [] = { | |||
64 | { USB_DEVICE(0x10C4, 0x80F6) }, /* Suunto sports instrument */ | 64 | { USB_DEVICE(0x10C4, 0x80F6) }, /* Suunto sports instrument */ |
65 | { USB_DEVICE(0x10C4, 0x813D) }, /* Burnside Telecom Deskmobile */ | 65 | { USB_DEVICE(0x10C4, 0x813D) }, /* Burnside Telecom Deskmobile */ |
66 | { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */ | 66 | { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */ |
67 | { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */ | ||
68 | { USB_DEVICE(0x10C4, 0x81E2) }, /* Lipowsky Industrie Elektronik GmbH, Baby-LIN */ | ||
69 | { USB_DEVICE(0x10C4, 0x8218) }, /* Lipowsky Industrie Elektronik GmbH, HARP-1 */ | ||
67 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ | 70 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ |
68 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ | 71 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ |
69 | { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */ | 72 | { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */ |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index bd76b4c11fcc..c186b4e73c72 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -311,6 +311,7 @@ static struct usb_device_id id_table_combined [] = { | |||
311 | { USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) }, | 311 | { USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) }, |
312 | { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) }, | 312 | { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) }, |
313 | { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) }, | 313 | { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) }, |
314 | { USB_DEVICE(FTDI_VID, FTDI_DMX4ALL) }, | ||
314 | { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) }, | 315 | { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) }, |
315 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) }, | 316 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) }, |
316 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) }, | 317 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) }, |
@@ -511,6 +512,7 @@ static struct usb_device_id id_table_combined [] = { | |||
511 | { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) }, | 512 | { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) }, |
512 | { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) }, | 513 | { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) }, |
513 | { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) }, | 514 | { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) }, |
515 | { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) }, | ||
514 | { }, /* Optional parameter entry */ | 516 | { }, /* Optional parameter entry */ |
515 | { } /* Terminating entry */ | 517 | { } /* Terminating entry */ |
516 | }; | 518 | }; |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index f0edb87d2dd5..bae117d359af 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
@@ -55,6 +55,9 @@ | |||
55 | /* iPlus device */ | 55 | /* iPlus device */ |
56 | #define FTDI_IPLUS_PID 0xD070 /* Product Id */ | 56 | #define FTDI_IPLUS_PID 0xD070 /* Product Id */ |
57 | 57 | ||
58 | /* DMX4ALL DMX Interfaces */ | ||
59 | #define FTDI_DMX4ALL 0xC850 | ||
60 | |||
58 | /* www.crystalfontz.com devices - thanx for providing free devices for evaluation ! */ | 61 | /* www.crystalfontz.com devices - thanx for providing free devices for evaluation ! */ |
59 | /* they use the ftdi chipset for the USB interface and the vendor id is the same */ | 62 | /* they use the ftdi chipset for the USB interface and the vendor id is the same */ |
60 | #define FTDI_XF_632_PID 0xFC08 /* 632: 16x2 Character Display */ | 63 | #define FTDI_XF_632_PID 0xFC08 /* 632: 16x2 Character Display */ |
@@ -175,9 +178,15 @@ | |||
175 | #define FTDI_ASK_RDR400_PID 0xC991 /* ASK RDR 400 series card reader */ | 178 | #define FTDI_ASK_RDR400_PID 0xC991 /* ASK RDR 400 series card reader */ |
176 | 179 | ||
177 | /* | 180 | /* |
181 | * FTDI USB UART chips used in construction projects from the | ||
182 | * Elektor Electronics magazine (http://elektor-electronics.co.uk) | ||
183 | */ | ||
184 | #define ELEKTOR_VID 0x0C7D | ||
185 | #define ELEKTOR_FT323R_PID 0x0005 /* RFID-Reader, issue 09-2006 */ | ||
186 | |||
187 | /* | ||
178 | * DSS-20 Sync Station for Sony Ericsson P800 | 188 | * DSS-20 Sync Station for Sony Ericsson P800 |
179 | */ | 189 | */ |
180 | |||
181 | #define FTDI_DSS20_PID 0xFC82 | 190 | #define FTDI_DSS20_PID 0xFC82 |
182 | 191 | ||
183 | /* | 192 | /* |
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index 6238aff1e772..d72cf8bc7f76 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c | |||
@@ -320,6 +320,7 @@ static struct usb_device_id ipaq_id_table [] = { | |||
320 | { USB_DEVICE(0x0B05, 0x9200) }, /* ASUS USB Sync */ | 320 | { USB_DEVICE(0x0B05, 0x9200) }, /* ASUS USB Sync */ |
321 | { USB_DEVICE(0x0B05, 0x9202) }, /* ASUS USB Sync */ | 321 | { USB_DEVICE(0x0B05, 0x9202) }, /* ASUS USB Sync */ |
322 | { USB_DEVICE(0x0BB4, 0x00CE) }, /* HTC USB Sync */ | 322 | { USB_DEVICE(0x0BB4, 0x00CE) }, /* HTC USB Sync */ |
323 | { USB_DEVICE(0x0BB4, 0x00CF) }, /* HTC USB Modem */ | ||
323 | { USB_DEVICE(0x0BB4, 0x0A01) }, /* PocketPC USB Sync */ | 324 | { USB_DEVICE(0x0BB4, 0x0A01) }, /* PocketPC USB Sync */ |
324 | { USB_DEVICE(0x0BB4, 0x0A02) }, /* PocketPC USB Sync */ | 325 | { USB_DEVICE(0x0BB4, 0x0A02) }, /* PocketPC USB Sync */ |
325 | { USB_DEVICE(0x0BB4, 0x0A03) }, /* PocketPC USB Sync */ | 326 | { USB_DEVICE(0x0BB4, 0x0A03) }, /* PocketPC USB Sync */ |
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c index ea16572d19f8..4b5097fa48d7 100644 --- a/drivers/usb/serial/sierra.c +++ b/drivers/usb/serial/sierra.c | |||
@@ -35,6 +35,7 @@ static struct usb_device_id id_table [] = { | |||
35 | { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */ | 35 | { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */ |
36 | { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */ | 36 | { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */ |
37 | { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */ | 37 | { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */ |
38 | { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */ | ||
38 | { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */ | 39 | { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */ |
39 | { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */ | 40 | { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */ |
40 | { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 for Europe */ | 41 | { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 for Europe */ |
@@ -58,8 +59,10 @@ static struct usb_device_id id_table_3port [] = { | |||
58 | { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */ | 59 | { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */ |
59 | { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */ | 60 | { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */ |
60 | { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */ | 61 | { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */ |
62 | { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */ | ||
61 | { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */ | 63 | { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */ |
62 | { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */ | 64 | { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */ |
65 | { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 for Europe */ | ||
63 | { USB_DEVICE(0x1199, 0x6812) }, /* Sierra Wireless MC8775 */ | 66 | { USB_DEVICE(0x1199, 0x6812) }, /* Sierra Wireless MC8775 */ |
64 | { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */ | 67 | { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */ |
65 | { } | 68 | { } |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 37ed8e0f2dc8..efb047f431e8 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -1236,7 +1236,7 @@ UNUSUAL_DEV( 0x0e21, 0x0520, 0x0100, 0x0100, | |||
1236 | "Cowon Systems", | 1236 | "Cowon Systems", |
1237 | "iAUDIO M5", | 1237 | "iAUDIO M5", |
1238 | US_SC_DEVICE, US_PR_BULK, NULL, | 1238 | US_SC_DEVICE, US_PR_BULK, NULL, |
1239 | 0 ), | 1239 | US_FL_NEED_OVERRIDE ), |
1240 | 1240 | ||
1241 | /* Submitted by Antoine Mairesse <antoine.mairesse@free.fr> */ | 1241 | /* Submitted by Antoine Mairesse <antoine.mairesse@free.fr> */ |
1242 | UNUSUAL_DEV( 0x0ed1, 0x6660, 0x0100, 0x0300, | 1242 | UNUSUAL_DEV( 0x0ed1, 0x6660, 0x0100, 0x0300, |
@@ -1306,18 +1306,13 @@ UNUSUAL_DEV( 0x0fce, 0xe030, 0x0000, 0x0000, | |||
1306 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1306 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1307 | US_FL_FIX_CAPACITY ), | 1307 | US_FL_FIX_CAPACITY ), |
1308 | 1308 | ||
1309 | /* Reported by Jan Mate <mate@fiit.stuba.sk> */ | ||
1310 | UNUSUAL_DEV( 0x0fce, 0xe030, 0x0000, 0x0000, | ||
1311 | "Sony Ericsson", | ||
1312 | "P990i", | ||
1313 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1314 | US_FL_FIX_CAPACITY ), | ||
1315 | |||
1316 | /* Reported by Kevin Cernekee <kpc-usbdev@gelato.uiuc.edu> | 1309 | /* Reported by Kevin Cernekee <kpc-usbdev@gelato.uiuc.edu> |
1317 | * Tested on hardware version 1.10. | 1310 | * Tested on hardware version 1.10. |
1318 | * Entry is needed only for the initializer function override. | 1311 | * Entry is needed only for the initializer function override. |
1312 | * Devices with bcd > 110 seem to not need it while those | ||
1313 | * with bcd < 110 appear to need it. | ||
1319 | */ | 1314 | */ |
1320 | UNUSUAL_DEV( 0x1019, 0x0c55, 0x0110, 0x0110, | 1315 | UNUSUAL_DEV( 0x1019, 0x0c55, 0x0000, 0x0110, |
1321 | "Desknote", | 1316 | "Desknote", |
1322 | "UCR-61S2B", | 1317 | "UCR-61S2B", |
1323 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_ucr61s2b_init, | 1318 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_ucr61s2b_init, |
diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c index b77b30923928..e815b354c09d 100644 --- a/drivers/video/aty/atyfb_base.c +++ b/drivers/video/aty/atyfb_base.c | |||
@@ -406,7 +406,7 @@ static struct { | |||
406 | { PCI_CHIP_MACH64LB, "3D RAGE LT PRO (Mach64 LB, AGP)", 236, 75, 100, 135, ATI_CHIP_264LTPRO }, | 406 | { PCI_CHIP_MACH64LB, "3D RAGE LT PRO (Mach64 LB, AGP)", 236, 75, 100, 135, ATI_CHIP_264LTPRO }, |
407 | { PCI_CHIP_MACH64LD, "3D RAGE LT PRO (Mach64 LD, AGP)", 230, 100, 100, 135, ATI_CHIP_264LTPRO }, | 407 | { PCI_CHIP_MACH64LD, "3D RAGE LT PRO (Mach64 LD, AGP)", 230, 100, 100, 135, ATI_CHIP_264LTPRO }, |
408 | { PCI_CHIP_MACH64LI, "3D RAGE LT PRO (Mach64 LI, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO | M64F_G3_PB_1_1 | M64F_G3_PB_1024x768 }, | 408 | { PCI_CHIP_MACH64LI, "3D RAGE LT PRO (Mach64 LI, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO | M64F_G3_PB_1_1 | M64F_G3_PB_1024x768 }, |
409 | { PCI_CHIP_MACH64LP, "3D RAGE LT PRO (Mach64 LP, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO }, | 409 | { PCI_CHIP_MACH64LP, "3D RAGE LT PRO (Mach64 LP, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO | M64F_G3_PB_1024x768 }, |
410 | { PCI_CHIP_MACH64LQ, "3D RAGE LT PRO (Mach64 LQ, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO }, | 410 | { PCI_CHIP_MACH64LQ, "3D RAGE LT PRO (Mach64 LQ, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO }, |
411 | 411 | ||
412 | { PCI_CHIP_MACH64GM, "3D RAGE XL (Mach64 GM, AGP 2x)", 230, 83, 63, 135, ATI_CHIP_264XL }, | 412 | { PCI_CHIP_MACH64GM, "3D RAGE XL (Mach64 GM, AGP 2x)", 230, 83, 63, 135, ATI_CHIP_264XL }, |
diff --git a/drivers/video/aty/radeon_i2c.c b/drivers/video/aty/radeon_i2c.c index 676754520099..869725a13c21 100644 --- a/drivers/video/aty/radeon_i2c.c +++ b/drivers/video/aty/radeon_i2c.c | |||
@@ -139,7 +139,13 @@ void radeon_delete_i2c_busses(struct radeonfb_info *rinfo) | |||
139 | int radeon_probe_i2c_connector(struct radeonfb_info *rinfo, int conn, | 139 | int radeon_probe_i2c_connector(struct radeonfb_info *rinfo, int conn, |
140 | u8 **out_edid) | 140 | u8 **out_edid) |
141 | { | 141 | { |
142 | u8 *edid = fb_ddc_read(&rinfo->i2c[conn-1].adapter); | 142 | u32 reg = rinfo->i2c[conn-1].ddc_reg; |
143 | u8 *edid; | ||
144 | |||
145 | OUTREG(reg, INREG(reg) & | ||
146 | ~(VGA_DDC_DATA_OUTPUT | VGA_DDC_CLK_OUTPUT)); | ||
147 | |||
148 | edid = fb_ddc_read(&rinfo->i2c[conn-1].adapter); | ||
143 | 149 | ||
144 | if (out_edid) | 150 | if (out_edid) |
145 | *out_edid = edid; | 151 | *out_edid = edid; |
diff --git a/drivers/video/backlight/corgi_bl.c b/drivers/video/backlight/corgi_bl.c index 2ebbfd95145f..d07ecb53c68b 100644 --- a/drivers/video/backlight/corgi_bl.c +++ b/drivers/video/backlight/corgi_bl.c | |||
@@ -111,7 +111,7 @@ static struct backlight_properties corgibl_data = { | |||
111 | .update_status = corgibl_set_intensity, | 111 | .update_status = corgibl_set_intensity, |
112 | }; | 112 | }; |
113 | 113 | ||
114 | static int __init corgibl_probe(struct platform_device *pdev) | 114 | static int corgibl_probe(struct platform_device *pdev) |
115 | { | 115 | { |
116 | struct corgibl_machinfo *machinfo = pdev->dev.platform_data; | 116 | struct corgibl_machinfo *machinfo = pdev->dev.platform_data; |
117 | 117 | ||
@@ -166,4 +166,4 @@ module_exit(corgibl_exit); | |||
166 | 166 | ||
167 | MODULE_AUTHOR("Richard Purdie <rpurdie@rpsys.net>"); | 167 | MODULE_AUTHOR("Richard Purdie <rpurdie@rpsys.net>"); |
168 | MODULE_DESCRIPTION("Corgi Backlight Driver"); | 168 | MODULE_DESCRIPTION("Corgi Backlight Driver"); |
169 | MODULE_LICENSE("GPLv2"); | 169 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/video/backlight/hp680_bl.c b/drivers/video/backlight/hp680_bl.c index fe1488374f62..e3993213d10e 100644 --- a/drivers/video/backlight/hp680_bl.c +++ b/drivers/video/backlight/hp680_bl.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #include <linux/backlight.h> | 19 | #include <linux/backlight.h> |
20 | 20 | ||
21 | #include <asm/cpu/dac.h> | 21 | #include <asm/cpu/dac.h> |
22 | #include <asm/hp6xx/hp6xx.h> | 22 | #include <asm/hp6xx.h> |
23 | #include <asm/hd64461.h> | 23 | #include <asm/hd64461.h> |
24 | 24 | ||
25 | #define HP680_MAX_INTENSITY 255 | 25 | #define HP680_MAX_INTENSITY 255 |
diff --git a/drivers/video/fb_ddc.c b/drivers/video/fb_ddc.c index 3aa6ebf68f17..f836137a0eda 100644 --- a/drivers/video/fb_ddc.c +++ b/drivers/video/fb_ddc.c | |||
@@ -20,26 +20,26 @@ | |||
20 | static unsigned char *fb_do_probe_ddc_edid(struct i2c_adapter *adapter) | 20 | static unsigned char *fb_do_probe_ddc_edid(struct i2c_adapter *adapter) |
21 | { | 21 | { |
22 | unsigned char start = 0x0; | 22 | unsigned char start = 0x0; |
23 | unsigned char *buf = kmalloc(EDID_LENGTH, GFP_KERNEL); | ||
23 | struct i2c_msg msgs[] = { | 24 | struct i2c_msg msgs[] = { |
24 | { | 25 | { |
25 | .addr = DDC_ADDR, | 26 | .addr = DDC_ADDR, |
27 | .flags = 0, | ||
26 | .len = 1, | 28 | .len = 1, |
27 | .buf = &start, | 29 | .buf = &start, |
28 | }, { | 30 | }, { |
29 | .addr = DDC_ADDR, | 31 | .addr = DDC_ADDR, |
30 | .flags = I2C_M_RD, | 32 | .flags = I2C_M_RD, |
31 | .len = EDID_LENGTH, | 33 | .len = EDID_LENGTH, |
34 | .buf = buf, | ||
32 | } | 35 | } |
33 | }; | 36 | }; |
34 | unsigned char *buf; | ||
35 | 37 | ||
36 | buf = kmalloc(EDID_LENGTH, GFP_KERNEL); | ||
37 | if (!buf) { | 38 | if (!buf) { |
38 | dev_warn(&adapter->dev, "unable to allocate memory for EDID " | 39 | dev_warn(&adapter->dev, "unable to allocate memory for EDID " |
39 | "block.\n"); | 40 | "block.\n"); |
40 | return NULL; | 41 | return NULL; |
41 | } | 42 | } |
42 | msgs[1].buf = buf; | ||
43 | 43 | ||
44 | if (i2c_transfer(adapter, msgs, 2) == 2) | 44 | if (i2c_transfer(adapter, msgs, 2) == 2) |
45 | return buf; | 45 | return buf; |
diff --git a/drivers/video/hitfb.c b/drivers/video/hitfb.c index 3afb472763c0..3dc49424dc75 100644 --- a/drivers/video/hitfb.c +++ b/drivers/video/hitfb.c | |||
@@ -29,7 +29,6 @@ | |||
29 | #include <asm/io.h> | 29 | #include <asm/io.h> |
30 | #include <asm/hd64461.h> | 30 | #include <asm/hd64461.h> |
31 | #include <asm/cpu/dac.h> | 31 | #include <asm/cpu/dac.h> |
32 | #include <asm/hp6xx/hp6xx.h> | ||
33 | 32 | ||
34 | #define WIDTH 640 | 33 | #define WIDTH 640 |
35 | 34 | ||
diff --git a/drivers/video/intelfb/intelfbhw.c b/drivers/video/intelfb/intelfbhw.c index eeeeff9a09eb..a95836839e1e 100644 --- a/drivers/video/intelfb/intelfbhw.c +++ b/drivers/video/intelfb/intelfbhw.c | |||
@@ -161,7 +161,7 @@ intelfbhw_get_memory(struct pci_dev *pdev, int *aperture_size, | |||
161 | return 1; | 161 | return 1; |
162 | 162 | ||
163 | /* Find the bridge device. It is always 0:0.0 */ | 163 | /* Find the bridge device. It is always 0:0.0 */ |
164 | if (!(bridge_dev = pci_find_slot(0, PCI_DEVFN(0, 0)))) { | 164 | if (!(bridge_dev = pci_get_bus_and_slot(0, PCI_DEVFN(0, 0)))) { |
165 | ERR_MSG("cannot find bridge device\n"); | 165 | ERR_MSG("cannot find bridge device\n"); |
166 | return 1; | 166 | return 1; |
167 | } | 167 | } |
@@ -169,6 +169,8 @@ intelfbhw_get_memory(struct pci_dev *pdev, int *aperture_size, | |||
169 | /* Get the fb aperture size and "stolen" memory amount. */ | 169 | /* Get the fb aperture size and "stolen" memory amount. */ |
170 | tmp = 0; | 170 | tmp = 0; |
171 | pci_read_config_word(bridge_dev, INTEL_GMCH_CTRL, &tmp); | 171 | pci_read_config_word(bridge_dev, INTEL_GMCH_CTRL, &tmp); |
172 | pci_dev_put(bridge_dev); | ||
173 | |||
172 | switch (pdev->device) { | 174 | switch (pdev->device) { |
173 | case PCI_DEVICE_ID_INTEL_915G: | 175 | case PCI_DEVICE_ID_INTEL_915G: |
174 | case PCI_DEVICE_ID_INTEL_915GM: | 176 | case PCI_DEVICE_ID_INTEL_915GM: |
@@ -662,7 +664,7 @@ intelfbhw_print_hw_state(struct intelfb_info *dinfo, struct intelfb_hwstate *hw) | |||
662 | int index = dinfo->pll_index; | 664 | int index = dinfo->pll_index; |
663 | DBG_MSG("intelfbhw_print_hw_state\n"); | 665 | DBG_MSG("intelfbhw_print_hw_state\n"); |
664 | 666 | ||
665 | if (!hw || !dinfo) | 667 | if (!hw) |
666 | return; | 668 | return; |
667 | /* Read in as much of the HW state as possible. */ | 669 | /* Read in as much of the HW state as possible. */ |
668 | printk("hw state dump start\n"); | 670 | printk("hw state dump start\n"); |
diff --git a/drivers/video/nvidia/nv_hw.c b/drivers/video/nvidia/nv_hw.c index 9ed640d35728..ea426115c6f9 100644 --- a/drivers/video/nvidia/nv_hw.c +++ b/drivers/video/nvidia/nv_hw.c | |||
@@ -145,12 +145,18 @@ static void nvGetClocks(struct nvidia_par *par, unsigned int *MClk, | |||
145 | 145 | ||
146 | if (par->Architecture >= NV_ARCH_40) { | 146 | if (par->Architecture >= NV_ARCH_40) { |
147 | pll = NV_RD32(par->PMC, 0x4020); | 147 | pll = NV_RD32(par->PMC, 0x4020); |
148 | P = (pll >> 16) & 0x03; | 148 | P = (pll >> 16) & 0x07; |
149 | pll = NV_RD32(par->PMC, 0x4024); | 149 | pll = NV_RD32(par->PMC, 0x4024); |
150 | M = pll & 0xFF; | 150 | M = pll & 0xFF; |
151 | N = (pll >> 8) & 0xFF; | 151 | N = (pll >> 8) & 0xFF; |
152 | MB = (pll >> 16) & 0xFF; | 152 | if (((par->Chipset & 0xfff0) == 0x0290) || |
153 | NB = (pll >> 24) & 0xFF; | 153 | ((par->Chipset & 0xfff0) == 0x0390)) { |
154 | MB = 1; | ||
155 | NB = 1; | ||
156 | } else { | ||
157 | MB = (pll >> 16) & 0xFF; | ||
158 | NB = (pll >> 24) & 0xFF; | ||
159 | } | ||
154 | *MClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P; | 160 | *MClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P; |
155 | 161 | ||
156 | pll = NV_RD32(par->PMC, 0x4000); | 162 | pll = NV_RD32(par->PMC, 0x4000); |
diff --git a/drivers/video/nvidia/nv_setup.c b/drivers/video/nvidia/nv_setup.c index a18a9aebf05f..eab3e282a4de 100644 --- a/drivers/video/nvidia/nv_setup.c +++ b/drivers/video/nvidia/nv_setup.c | |||
@@ -262,7 +262,7 @@ static void nv10GetConfig(struct nvidia_par *par) | |||
262 | #endif | 262 | #endif |
263 | 263 | ||
264 | dev = pci_find_slot(0, 1); | 264 | dev = pci_find_slot(0, 1); |
265 | if ((par->Chipset && 0xffff) == 0x01a0) { | 265 | if ((par->Chipset & 0xffff) == 0x01a0) { |
266 | int amt = 0; | 266 | int amt = 0; |
267 | 267 | ||
268 | pci_read_config_dword(dev, 0x7c, &amt); | 268 | pci_read_config_dword(dev, 0x7c, &amt); |
@@ -359,6 +359,7 @@ int NVCommonSetup(struct fb_info *info) | |||
359 | case 0x0186: | 359 | case 0x0186: |
360 | case 0x0187: | 360 | case 0x0187: |
361 | case 0x018D: | 361 | case 0x018D: |
362 | case 0x0228: | ||
362 | case 0x0286: | 363 | case 0x0286: |
363 | case 0x028C: | 364 | case 0x028C: |
364 | case 0x0316: | 365 | case 0x0316: |
@@ -382,6 +383,10 @@ int NVCommonSetup(struct fb_info *info) | |||
382 | case 0x034C: | 383 | case 0x034C: |
383 | case 0x0160: | 384 | case 0x0160: |
384 | case 0x0166: | 385 | case 0x0166: |
386 | case 0x0169: | ||
387 | case 0x016B: | ||
388 | case 0x016C: | ||
389 | case 0x016D: | ||
385 | case 0x00C8: | 390 | case 0x00C8: |
386 | case 0x00CC: | 391 | case 0x00CC: |
387 | case 0x0144: | 392 | case 0x0144: |
@@ -639,12 +644,23 @@ int NVCommonSetup(struct fb_info *info) | |||
639 | par->fpHeight = NV_RD32(par->PRAMDAC, 0x0800) + 1; | 644 | par->fpHeight = NV_RD32(par->PRAMDAC, 0x0800) + 1; |
640 | par->fpSyncs = NV_RD32(par->PRAMDAC, 0x0848) & 0x30000033; | 645 | par->fpSyncs = NV_RD32(par->PRAMDAC, 0x0848) & 0x30000033; |
641 | 646 | ||
642 | printk("Panel size is %i x %i\n", par->fpWidth, par->fpHeight); | 647 | printk("nvidiafb: Panel size is %i x %i\n", par->fpWidth, par->fpHeight); |
643 | } | 648 | } |
644 | 649 | ||
645 | if (monA) | 650 | if (monA) |
646 | info->monspecs = *monA; | 651 | info->monspecs = *monA; |
647 | 652 | ||
653 | if (!par->FlatPanel || !par->twoHeads) | ||
654 | par->FPDither = 0; | ||
655 | |||
656 | par->LVDS = 0; | ||
657 | if (par->FlatPanel && par->twoHeads) { | ||
658 | NV_WR32(par->PRAMDAC0, 0x08B0, 0x00010004); | ||
659 | if (par->PRAMDAC0[0x08b4] & 1) | ||
660 | par->LVDS = 1; | ||
661 | printk("nvidiafb: Panel is %s\n", par->LVDS ? "LVDS" : "TMDS"); | ||
662 | } | ||
663 | |||
648 | kfree(edidA); | 664 | kfree(edidA); |
649 | kfree(edidB); | 665 | kfree(edidB); |
650 | done: | 666 | done: |
diff --git a/drivers/video/nvidia/nv_type.h b/drivers/video/nvidia/nv_type.h index acdc26693402..86e65dea60d3 100644 --- a/drivers/video/nvidia/nv_type.h +++ b/drivers/video/nvidia/nv_type.h | |||
@@ -129,6 +129,7 @@ struct nvidia_par { | |||
129 | int fpHeight; | 129 | int fpHeight; |
130 | int PanelTweak; | 130 | int PanelTweak; |
131 | int paneltweak; | 131 | int paneltweak; |
132 | int LVDS; | ||
132 | int pm_state; | 133 | int pm_state; |
133 | u32 crtcSync_read; | 134 | u32 crtcSync_read; |
134 | u32 fpSyncs; | 135 | u32 fpSyncs; |
diff --git a/drivers/video/nvidia/nvidia.c b/drivers/video/nvidia/nvidia.c index eb24107bcc81..538e947610e1 100644 --- a/drivers/video/nvidia/nvidia.c +++ b/drivers/video/nvidia/nvidia.c | |||
@@ -1160,20 +1160,20 @@ static u32 __devinit nvidia_get_arch(struct fb_info *info) | |||
1160 | case 0x0340: /* GeForceFX 5700 */ | 1160 | case 0x0340: /* GeForceFX 5700 */ |
1161 | arch = NV_ARCH_30; | 1161 | arch = NV_ARCH_30; |
1162 | break; | 1162 | break; |
1163 | case 0x0040: | 1163 | case 0x0040: /* GeForce 6800 */ |
1164 | case 0x00C0: | 1164 | case 0x00C0: /* GeForce 6800 */ |
1165 | case 0x0120: | 1165 | case 0x0120: /* GeForce 6800 */ |
1166 | case 0x0130: | 1166 | case 0x0130: |
1167 | case 0x0140: | 1167 | case 0x0140: /* GeForce 6600 */ |
1168 | case 0x0160: | 1168 | case 0x0160: /* GeForce 6200 */ |
1169 | case 0x01D0: | 1169 | case 0x01D0: /* GeForce 7200, 7300, 7400 */ |
1170 | case 0x0090: | 1170 | case 0x0090: /* GeForce 7800 */ |
1171 | case 0x0210: | 1171 | case 0x0210: /* GeForce 6800 */ |
1172 | case 0x0220: | 1172 | case 0x0220: /* GeForce 6200 */ |
1173 | case 0x0230: | 1173 | case 0x0230: |
1174 | case 0x0240: | 1174 | case 0x0240: /* GeForce 6100 */ |
1175 | case 0x0290: | 1175 | case 0x0290: /* GeForce 7900 */ |
1176 | case 0x0390: | 1176 | case 0x0390: /* GeForce 7600 */ |
1177 | arch = NV_ARCH_40; | 1177 | arch = NV_ARCH_40; |
1178 | break; | 1178 | break; |
1179 | case 0x0020: /* TNT, TNT2 */ | 1179 | case 0x0020: /* TNT, TNT2 */ |
diff --git a/drivers/video/offb.c b/drivers/video/offb.c index bad0e98fb3b6..9a40bbecf76b 100644 --- a/drivers/video/offb.c +++ b/drivers/video/offb.c | |||
@@ -157,7 +157,7 @@ static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | |||
157 | out_le32(par->cmap_adr + 0xb4, (red << 16 | green << 8 | blue)); | 157 | out_le32(par->cmap_adr + 0xb4, (red << 16 | green << 8 | blue)); |
158 | break; | 158 | break; |
159 | case cmap_gxt2000: | 159 | case cmap_gxt2000: |
160 | out_le32((unsigned __iomem *) par->cmap_adr + regno, | 160 | out_le32(((unsigned __iomem *) par->cmap_adr) + regno, |
161 | (red << 16 | green << 8 | blue)); | 161 | (red << 16 | green << 8 | blue)); |
162 | break; | 162 | break; |
163 | } | 163 | } |
@@ -213,7 +213,7 @@ static int offb_blank(int blank, struct fb_info *info) | |||
213 | out_le32(par->cmap_adr + 0xb4, 0); | 213 | out_le32(par->cmap_adr + 0xb4, 0); |
214 | break; | 214 | break; |
215 | case cmap_gxt2000: | 215 | case cmap_gxt2000: |
216 | out_le32((unsigned __iomem *) par->cmap_adr + i, | 216 | out_le32(((unsigned __iomem *) par->cmap_adr) + i, |
217 | 0); | 217 | 0); |
218 | break; | 218 | break; |
219 | } | 219 | } |
@@ -226,13 +226,23 @@ static int offb_blank(int blank, struct fb_info *info) | |||
226 | static void __iomem *offb_map_reg(struct device_node *np, int index, | 226 | static void __iomem *offb_map_reg(struct device_node *np, int index, |
227 | unsigned long offset, unsigned long size) | 227 | unsigned long offset, unsigned long size) |
228 | { | 228 | { |
229 | struct resource r; | 229 | const u32 *addrp; |
230 | 230 | u64 asize, taddr; | |
231 | if (of_address_to_resource(np, index, &r)) | 231 | unsigned int flags; |
232 | return 0; | 232 | |
233 | if ((r.start + offset + size) > r.end) | 233 | addrp = of_get_pci_address(np, index, &asize, &flags); |
234 | return 0; | 234 | if (addrp == NULL) |
235 | return ioremap(r.start + offset, size); | 235 | addrp = of_get_address(np, index, &asize, &flags); |
236 | if (addrp == NULL) | ||
237 | return NULL; | ||
238 | if ((flags & (IORESOURCE_IO | IORESOURCE_MEM)) == 0) | ||
239 | return NULL; | ||
240 | if ((offset + size) > asize) | ||
241 | return NULL; | ||
242 | taddr = of_translate_address(np, addrp); | ||
243 | if (taddr == OF_BAD_ADDR) | ||
244 | return NULL; | ||
245 | return ioremap(taddr + offset, size); | ||
236 | } | 246 | } |
237 | 247 | ||
238 | static void __init offb_init_fb(const char *name, const char *full_name, | 248 | static void __init offb_init_fb(const char *name, const char *full_name, |
@@ -289,7 +299,6 @@ static void __init offb_init_fb(const char *name, const char *full_name, | |||
289 | 299 | ||
290 | par->cmap_type = cmap_unknown; | 300 | par->cmap_type = cmap_unknown; |
291 | if (depth == 8) { | 301 | if (depth == 8) { |
292 | /* Palette hacks disabled for now */ | ||
293 | if (dp && !strncmp(name, "ATY,Rage128", 11)) { | 302 | if (dp && !strncmp(name, "ATY,Rage128", 11)) { |
294 | par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff); | 303 | par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff); |
295 | if (par->cmap_adr) | 304 | if (par->cmap_adr) |
@@ -313,7 +322,8 @@ static void __init offb_init_fb(const char *name, const char *full_name, | |||
313 | ioremap(base + 0x7ff000, 0x1000) + 0xcc0; | 322 | ioremap(base + 0x7ff000, 0x1000) + 0xcc0; |
314 | par->cmap_data = par->cmap_adr + 1; | 323 | par->cmap_data = par->cmap_adr + 1; |
315 | par->cmap_type = cmap_m64; | 324 | par->cmap_type = cmap_m64; |
316 | } else if (dp && device_is_compatible(dp, "pci1014,b7")) { | 325 | } else if (dp && (device_is_compatible(dp, "pci1014,b7") || |
326 | device_is_compatible(dp, "pci1014,21c"))) { | ||
317 | par->cmap_adr = offb_map_reg(dp, 0, 0x6000, 0x1000); | 327 | par->cmap_adr = offb_map_reg(dp, 0, 0x6000, 0x1000); |
318 | if (par->cmap_adr) | 328 | if (par->cmap_adr) |
319 | par->cmap_type = cmap_gxt2000; | 329 | par->cmap_type = cmap_gxt2000; |
@@ -433,7 +443,7 @@ static void __init offb_init_nodriver(struct device_node *dp, int no_real_node) | |||
433 | pp = get_property(dp, "linux,bootx-linebytes", &len); | 443 | pp = get_property(dp, "linux,bootx-linebytes", &len); |
434 | if (pp == NULL) | 444 | if (pp == NULL) |
435 | pp = get_property(dp, "linebytes", &len); | 445 | pp = get_property(dp, "linebytes", &len); |
436 | if (pp && len == sizeof(u32)) | 446 | if (pp && len == sizeof(u32) && (*pp != 0xffffffffu)) |
437 | pitch = *pp; | 447 | pitch = *pp; |
438 | else | 448 | else |
439 | pitch = width * ((depth + 7) / 8); | 449 | pitch = width * ((depth + 7) / 8); |
@@ -496,7 +506,7 @@ static void __init offb_init_nodriver(struct device_node *dp, int no_real_node) | |||
496 | offb_init_fb(no_real_node ? "bootx" : dp->name, | 506 | offb_init_fb(no_real_node ? "bootx" : dp->name, |
497 | no_real_node ? "display" : dp->full_name, | 507 | no_real_node ? "display" : dp->full_name, |
498 | width, height, depth, pitch, address, | 508 | width, height, depth, pitch, address, |
499 | no_real_node ? dp : NULL); | 509 | no_real_node ? NULL : dp); |
500 | } | 510 | } |
501 | } | 511 | } |
502 | 512 | ||
diff --git a/drivers/video/pnx4008/pnxrgbfb.c b/drivers/video/pnx4008/pnxrgbfb.c index 7d9453c91a42..f29e66e2d774 100644 --- a/drivers/video/pnx4008/pnxrgbfb.c +++ b/drivers/video/pnx4008/pnxrgbfb.c | |||
@@ -154,7 +154,8 @@ static int __devinit rgbfb_probe(struct platform_device *pdev) | |||
154 | goto err1; | 154 | goto err1; |
155 | } | 155 | } |
156 | 156 | ||
157 | if (!fb_get_options("pnxrgbfb", &option) && !strcmp(option, "nocursor")) | 157 | if (!fb_get_options("pnxrgbfb", &option) && option && |
158 | !strcmp(option, "nocursor")) | ||
158 | rgbfb_ops.fb_cursor = no_cursor; | 159 | rgbfb_ops.fb_cursor = no_cursor; |
159 | 160 | ||
160 | info->node = -1; | 161 | info->node = -1; |
@@ -191,7 +192,7 @@ err: | |||
191 | 192 | ||
192 | static struct platform_driver rgbfb_driver = { | 193 | static struct platform_driver rgbfb_driver = { |
193 | .driver = { | 194 | .driver = { |
194 | .name = "rgbfb", | 195 | .name = "pnx4008-rgbfb", |
195 | }, | 196 | }, |
196 | .probe = rgbfb_probe, | 197 | .probe = rgbfb_probe, |
197 | .remove = rgbfb_remove, | 198 | .remove = rgbfb_remove, |
diff --git a/drivers/video/pnx4008/sdum.c b/drivers/video/pnx4008/sdum.c index 51f0ecc2a511..d23bf0d659b6 100644 --- a/drivers/video/pnx4008/sdum.c +++ b/drivers/video/pnx4008/sdum.c | |||
@@ -848,7 +848,7 @@ static int sdum_remove(struct platform_device *pdev) | |||
848 | 848 | ||
849 | static struct platform_driver sdum_driver = { | 849 | static struct platform_driver sdum_driver = { |
850 | .driver = { | 850 | .driver = { |
851 | .name = "sdum", | 851 | .name = "pnx4008-sdum", |
852 | }, | 852 | }, |
853 | .probe = sdum_probe, | 853 | .probe = sdum_probe, |
854 | .remove = sdum_remove, | 854 | .remove = sdum_remove, |
diff --git a/drivers/w1/masters/matrox_w1.c b/drivers/w1/masters/matrox_w1.c index 2788b8ca9bb1..6f9d880ab2e9 100644 --- a/drivers/w1/masters/matrox_w1.c +++ b/drivers/w1/masters/matrox_w1.c | |||
@@ -215,6 +215,8 @@ static int __devinit matrox_w1_probe(struct pci_dev *pdev, const struct pci_devi | |||
215 | return 0; | 215 | return 0; |
216 | 216 | ||
217 | err_out_free_device: | 217 | err_out_free_device: |
218 | if (dev->virt_addr) | ||
219 | iounmap(dev->virt_addr); | ||
218 | kfree(dev); | 220 | kfree(dev); |
219 | 221 | ||
220 | return err; | 222 | return err; |
diff --git a/fs/Kconfig b/fs/Kconfig index fee318e6f4bb..7b1511d50b05 100644 --- a/fs/Kconfig +++ b/fs/Kconfig | |||
@@ -1777,6 +1777,7 @@ config RPCSEC_GSS_KRB5 | |||
1777 | select CRYPTO | 1777 | select CRYPTO |
1778 | select CRYPTO_MD5 | 1778 | select CRYPTO_MD5 |
1779 | select CRYPTO_DES | 1779 | select CRYPTO_DES |
1780 | select CRYPTO_CBC | ||
1780 | help | 1781 | help |
1781 | Provides for secure RPC calls by means of a gss-api | 1782 | Provides for secure RPC calls by means of a gss-api |
1782 | mechanism based on Kerberos V5. This is required for | 1783 | mechanism based on Kerberos V5. This is required for |
@@ -1795,6 +1796,7 @@ config RPCSEC_GSS_SPKM3 | |||
1795 | select CRYPTO_MD5 | 1796 | select CRYPTO_MD5 |
1796 | select CRYPTO_DES | 1797 | select CRYPTO_DES |
1797 | select CRYPTO_CAST5 | 1798 | select CRYPTO_CAST5 |
1799 | select CRYPTO_CBC | ||
1798 | help | 1800 | help |
1799 | Provides for secure RPC calls by means of a gss-api | 1801 | Provides for secure RPC calls by means of a gss-api |
1800 | mechanism based on the SPKM3 public-key mechanism. | 1802 | mechanism based on the SPKM3 public-key mechanism. |
@@ -2058,8 +2060,7 @@ config CODA_FS_OLD_API | |||
2058 | For most cases you probably want to say N. | 2060 | For most cases you probably want to say N. |
2059 | 2061 | ||
2060 | config AFS_FS | 2062 | config AFS_FS |
2061 | # for fs/nls/Config.in | 2063 | tristate "Andrew File System support (AFS) (EXPERIMENTAL)" |
2062 | tristate "Andrew File System support (AFS) (Experimental)" | ||
2063 | depends on INET && EXPERIMENTAL | 2064 | depends on INET && EXPERIMENTAL |
2064 | select RXRPC | 2065 | select RXRPC |
2065 | help | 2066 | help |
diff --git a/fs/autofs/inode.c b/fs/autofs/inode.c index 54c518c89e4c..38ede5c9d6fd 100644 --- a/fs/autofs/inode.c +++ b/fs/autofs/inode.c | |||
@@ -25,6 +25,14 @@ void autofs_kill_sb(struct super_block *sb) | |||
25 | struct autofs_sb_info *sbi = autofs_sbi(sb); | 25 | struct autofs_sb_info *sbi = autofs_sbi(sb); |
26 | unsigned int n; | 26 | unsigned int n; |
27 | 27 | ||
28 | /* | ||
29 | * In the event of a failure in get_sb_nodev the superblock | ||
30 | * info is not present so nothing else has been setup, so | ||
31 | * just exit when we are called from deactivate_super. | ||
32 | */ | ||
33 | if (!sbi) | ||
34 | return; | ||
35 | |||
28 | if ( !sbi->catatonic ) | 36 | if ( !sbi->catatonic ) |
29 | autofs_catatonic_mode(sbi); /* Free wait queues, close pipe */ | 37 | autofs_catatonic_mode(sbi); /* Free wait queues, close pipe */ |
30 | 38 | ||
@@ -136,7 +144,8 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) | |||
136 | 144 | ||
137 | s->s_fs_info = sbi; | 145 | s->s_fs_info = sbi; |
138 | sbi->magic = AUTOFS_SBI_MAGIC; | 146 | sbi->magic = AUTOFS_SBI_MAGIC; |
139 | sbi->catatonic = 0; | 147 | sbi->pipe = NULL; |
148 | sbi->catatonic = 1; | ||
140 | sbi->exp_timeout = 0; | 149 | sbi->exp_timeout = 0; |
141 | sbi->oz_pgrp = process_group(current); | 150 | sbi->oz_pgrp = process_group(current); |
142 | autofs_initialize_hash(&sbi->dirhash); | 151 | autofs_initialize_hash(&sbi->dirhash); |
@@ -180,6 +189,7 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) | |||
180 | if ( !pipe->f_op || !pipe->f_op->write ) | 189 | if ( !pipe->f_op || !pipe->f_op->write ) |
181 | goto fail_fput; | 190 | goto fail_fput; |
182 | sbi->pipe = pipe; | 191 | sbi->pipe = pipe; |
192 | sbi->catatonic = 0; | ||
183 | 193 | ||
184 | /* | 194 | /* |
185 | * Success! Install the root dentry now to indicate completion. | 195 | * Success! Install the root dentry now to indicate completion. |
@@ -198,6 +208,8 @@ fail_iput: | |||
198 | iput(root_inode); | 208 | iput(root_inode); |
199 | fail_free: | 209 | fail_free: |
200 | kfree(sbi); | 210 | kfree(sbi); |
211 | s->s_fs_info = NULL; | ||
212 | kill_anon_super(s); | ||
201 | fail_unlock: | 213 | fail_unlock: |
202 | return -EINVAL; | 214 | return -EINVAL; |
203 | } | 215 | } |
diff --git a/fs/autofs/waitq.c b/fs/autofs/waitq.c index 633f628005b4..19a9cafb5ddf 100644 --- a/fs/autofs/waitq.c +++ b/fs/autofs/waitq.c | |||
@@ -41,6 +41,7 @@ void autofs_catatonic_mode(struct autofs_sb_info *sbi) | |||
41 | wq = nwq; | 41 | wq = nwq; |
42 | } | 42 | } |
43 | fput(sbi->pipe); /* Close the pipe */ | 43 | fput(sbi->pipe); /* Close the pipe */ |
44 | sbi->pipe = NULL; | ||
44 | autofs_hash_dputall(&sbi->dirhash); /* Remove all dentry pointers */ | 45 | autofs_hash_dputall(&sbi->dirhash); /* Remove all dentry pointers */ |
45 | } | 46 | } |
46 | 47 | ||
diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c index 51fd8595bf85..ce7c0f1dd529 100644 --- a/fs/autofs4/inode.c +++ b/fs/autofs4/inode.c | |||
@@ -99,6 +99,9 @@ static void autofs4_force_release(struct autofs_sb_info *sbi) | |||
99 | struct dentry *this_parent = sbi->sb->s_root; | 99 | struct dentry *this_parent = sbi->sb->s_root; |
100 | struct list_head *next; | 100 | struct list_head *next; |
101 | 101 | ||
102 | if (!sbi->sb->s_root) | ||
103 | return; | ||
104 | |||
102 | spin_lock(&dcache_lock); | 105 | spin_lock(&dcache_lock); |
103 | repeat: | 106 | repeat: |
104 | next = this_parent->d_subdirs.next; | 107 | next = this_parent->d_subdirs.next; |
@@ -146,6 +149,14 @@ void autofs4_kill_sb(struct super_block *sb) | |||
146 | { | 149 | { |
147 | struct autofs_sb_info *sbi = autofs4_sbi(sb); | 150 | struct autofs_sb_info *sbi = autofs4_sbi(sb); |
148 | 151 | ||
152 | /* | ||
153 | * In the event of a failure in get_sb_nodev the superblock | ||
154 | * info is not present so nothing else has been setup, so | ||
155 | * just exit when we are called from deactivate_super. | ||
156 | */ | ||
157 | if (!sbi) | ||
158 | return; | ||
159 | |||
149 | sb->s_fs_info = NULL; | 160 | sb->s_fs_info = NULL; |
150 | 161 | ||
151 | if ( !sbi->catatonic ) | 162 | if ( !sbi->catatonic ) |
@@ -310,7 +321,8 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) | |||
310 | s->s_fs_info = sbi; | 321 | s->s_fs_info = sbi; |
311 | sbi->magic = AUTOFS_SBI_MAGIC; | 322 | sbi->magic = AUTOFS_SBI_MAGIC; |
312 | sbi->pipefd = -1; | 323 | sbi->pipefd = -1; |
313 | sbi->catatonic = 0; | 324 | sbi->pipe = NULL; |
325 | sbi->catatonic = 1; | ||
314 | sbi->exp_timeout = 0; | 326 | sbi->exp_timeout = 0; |
315 | sbi->oz_pgrp = process_group(current); | 327 | sbi->oz_pgrp = process_group(current); |
316 | sbi->sb = s; | 328 | sbi->sb = s; |
@@ -388,6 +400,7 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) | |||
388 | goto fail_fput; | 400 | goto fail_fput; |
389 | sbi->pipe = pipe; | 401 | sbi->pipe = pipe; |
390 | sbi->pipefd = pipefd; | 402 | sbi->pipefd = pipefd; |
403 | sbi->catatonic = 0; | ||
391 | 404 | ||
392 | /* | 405 | /* |
393 | * Success! Install the root dentry now to indicate completion. | 406 | * Success! Install the root dentry now to indicate completion. |
@@ -412,6 +425,8 @@ fail_ino: | |||
412 | kfree(ino); | 425 | kfree(ino); |
413 | fail_free: | 426 | fail_free: |
414 | kfree(sbi); | 427 | kfree(sbi); |
428 | s->s_fs_info = NULL; | ||
429 | kill_anon_super(s); | ||
415 | fail_unlock: | 430 | fail_unlock: |
416 | return -EINVAL; | 431 | return -EINVAL; |
417 | } | 432 | } |
diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c index c0a6c8d445c7..1e4a539f4417 100644 --- a/fs/autofs4/waitq.c +++ b/fs/autofs4/waitq.c | |||
@@ -41,10 +41,8 @@ void autofs4_catatonic_mode(struct autofs_sb_info *sbi) | |||
41 | wake_up_interruptible(&wq->queue); | 41 | wake_up_interruptible(&wq->queue); |
42 | wq = nwq; | 42 | wq = nwq; |
43 | } | 43 | } |
44 | if (sbi->pipe) { | 44 | fput(sbi->pipe); /* Close the pipe */ |
45 | fput(sbi->pipe); /* Close the pipe */ | 45 | sbi->pipe = NULL; |
46 | sbi->pipe = NULL; | ||
47 | } | ||
48 | } | 46 | } |
49 | 47 | ||
50 | static int autofs4_write(struct file *file, const void *addr, int bytes) | 48 | static int autofs4_write(struct file *file, const void *addr, int bytes) |
diff --git a/fs/block_dev.c b/fs/block_dev.c index bc8f27cc4483..36c0e7af9d0f 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -642,34 +642,47 @@ static void free_bd_holder(struct bd_holder *bo) | |||
642 | } | 642 | } |
643 | 643 | ||
644 | /** | 644 | /** |
645 | * find_bd_holder - find matching struct bd_holder from the block device | ||
646 | * | ||
647 | * @bdev: struct block device to be searched | ||
648 | * @bo: target struct bd_holder | ||
649 | * | ||
650 | * Returns matching entry with @bo in @bdev->bd_holder_list. | ||
651 | * If found, increment the reference count and return the pointer. | ||
652 | * If not found, returns NULL. | ||
653 | */ | ||
654 | static struct bd_holder *find_bd_holder(struct block_device *bdev, | ||
655 | struct bd_holder *bo) | ||
656 | { | ||
657 | struct bd_holder *tmp; | ||
658 | |||
659 | list_for_each_entry(tmp, &bdev->bd_holder_list, list) | ||
660 | if (tmp->sdir == bo->sdir) { | ||
661 | tmp->count++; | ||
662 | return tmp; | ||
663 | } | ||
664 | |||
665 | return NULL; | ||
666 | } | ||
667 | |||
668 | /** | ||
645 | * add_bd_holder - create sysfs symlinks for bd_claim() relationship | 669 | * add_bd_holder - create sysfs symlinks for bd_claim() relationship |
646 | * | 670 | * |
647 | * @bdev: block device to be bd_claimed | 671 | * @bdev: block device to be bd_claimed |
648 | * @bo: preallocated and initialized by alloc_bd_holder() | 672 | * @bo: preallocated and initialized by alloc_bd_holder() |
649 | * | 673 | * |
650 | * If there is no matching entry with @bo in @bdev->bd_holder_list, | 674 | * Add @bo to @bdev->bd_holder_list, create symlinks. |
651 | * add @bo to the list, create symlinks. | ||
652 | * | 675 | * |
653 | * Returns 0 if symlinks are created or already there. | 676 | * Returns 0 if symlinks are created. |
654 | * Returns -ve if something fails and @bo can be freed. | 677 | * Returns -ve if something fails. |
655 | */ | 678 | */ |
656 | static int add_bd_holder(struct block_device *bdev, struct bd_holder *bo) | 679 | static int add_bd_holder(struct block_device *bdev, struct bd_holder *bo) |
657 | { | 680 | { |
658 | struct bd_holder *tmp; | ||
659 | int ret; | 681 | int ret; |
660 | 682 | ||
661 | if (!bo) | 683 | if (!bo) |
662 | return -EINVAL; | 684 | return -EINVAL; |
663 | 685 | ||
664 | list_for_each_entry(tmp, &bdev->bd_holder_list, list) { | ||
665 | if (tmp->sdir == bo->sdir) { | ||
666 | tmp->count++; | ||
667 | /* We've already done what we need to do here. */ | ||
668 | free_bd_holder(bo); | ||
669 | return 0; | ||
670 | } | ||
671 | } | ||
672 | |||
673 | if (!bd_holder_grab_dirs(bdev, bo)) | 686 | if (!bd_holder_grab_dirs(bdev, bo)) |
674 | return -EBUSY; | 687 | return -EBUSY; |
675 | 688 | ||
@@ -740,7 +753,7 @@ static int bd_claim_by_kobject(struct block_device *bdev, void *holder, | |||
740 | struct kobject *kobj) | 753 | struct kobject *kobj) |
741 | { | 754 | { |
742 | int res; | 755 | int res; |
743 | struct bd_holder *bo; | 756 | struct bd_holder *bo, *found; |
744 | 757 | ||
745 | if (!kobj) | 758 | if (!kobj) |
746 | return -EINVAL; | 759 | return -EINVAL; |
@@ -751,9 +764,16 @@ static int bd_claim_by_kobject(struct block_device *bdev, void *holder, | |||
751 | 764 | ||
752 | mutex_lock_nested(&bdev->bd_mutex, BD_MUTEX_PARTITION); | 765 | mutex_lock_nested(&bdev->bd_mutex, BD_MUTEX_PARTITION); |
753 | res = bd_claim(bdev, holder); | 766 | res = bd_claim(bdev, holder); |
754 | if (res == 0) | 767 | if (res == 0) { |
755 | res = add_bd_holder(bdev, bo); | 768 | found = find_bd_holder(bdev, bo); |
756 | if (res) | 769 | if (found == NULL) { |
770 | res = add_bd_holder(bdev, bo); | ||
771 | if (res) | ||
772 | bd_release(bdev); | ||
773 | } | ||
774 | } | ||
775 | |||
776 | if (res || found) | ||
757 | free_bd_holder(bo); | 777 | free_bd_holder(bo); |
758 | mutex_unlock(&bdev->bd_mutex); | 778 | mutex_unlock(&bdev->bd_mutex); |
759 | 779 | ||
@@ -1131,6 +1151,8 @@ static int blkdev_open(struct inode * inode, struct file * filp) | |||
1131 | filp->f_flags |= O_LARGEFILE; | 1151 | filp->f_flags |= O_LARGEFILE; |
1132 | 1152 | ||
1133 | bdev = bd_acquire(inode); | 1153 | bdev = bd_acquire(inode); |
1154 | if (bdev == NULL) | ||
1155 | return -ENOMEM; | ||
1134 | 1156 | ||
1135 | res = do_open(bdev, filp, BD_MUTEX_NORMAL); | 1157 | res = do_open(bdev, filp, BD_MUTEX_NORMAL); |
1136 | if (res) | 1158 | if (res) |
diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES index 1eb9a2ec0a3b..0b3c37ef52e0 100644 --- a/fs/cifs/CHANGES +++ b/fs/cifs/CHANGES | |||
@@ -1,6 +1,11 @@ | |||
1 | Version 1.46 | 1 | Version 1.46 |
2 | ------------ | 2 | ------------ |
3 | Support deep tree mounts. Better support OS/2, Win9x (DOS) time stamps. | 3 | Support deep tree mounts. Better support OS/2, Win9x (DOS) time stamps. |
4 | Allow null user to be specified on mount ("username="). Do not return | ||
5 | EINVAL on readdir when filldir fails due to overwritten blocksize | ||
6 | (fixes FC problem). Return error in rename 2nd attempt retry (ie report | ||
7 | if rename by handle also fails, after rename by path fails, we were | ||
8 | not reporting whether the retry worked or not). | ||
4 | 9 | ||
5 | Version 1.45 | 10 | Version 1.45 |
6 | ------------ | 11 | ------------ |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 4093d5332930..71f77914ce93 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -822,10 +822,13 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) | |||
822 | } else if (strnicmp(data, "nouser_xattr",12) == 0) { | 822 | } else if (strnicmp(data, "nouser_xattr",12) == 0) { |
823 | vol->no_xattr = 1; | 823 | vol->no_xattr = 1; |
824 | } else if (strnicmp(data, "user", 4) == 0) { | 824 | } else if (strnicmp(data, "user", 4) == 0) { |
825 | if (!value || !*value) { | 825 | if (!value) { |
826 | printk(KERN_WARNING | 826 | printk(KERN_WARNING |
827 | "CIFS: invalid or missing username\n"); | 827 | "CIFS: invalid or missing username\n"); |
828 | return 1; /* needs_arg; */ | 828 | return 1; /* needs_arg; */ |
829 | } else if(!*value) { | ||
830 | /* null user, ie anonymous, authentication */ | ||
831 | vol->nullauth = 1; | ||
829 | } | 832 | } |
830 | if (strnlen(value, 200) < 200) { | 833 | if (strnlen(value, 200) < 200) { |
831 | vol->username = value; | 834 | vol->username = value; |
@@ -1642,6 +1645,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1642 | /* BB fixme parse for domain name here */ | 1645 | /* BB fixme parse for domain name here */ |
1643 | cFYI(1, ("Username: %s ", volume_info.username)); | 1646 | cFYI(1, ("Username: %s ", volume_info.username)); |
1644 | 1647 | ||
1648 | } else if (volume_info.nullauth) { | ||
1649 | cFYI(1,("null user")); | ||
1645 | } else { | 1650 | } else { |
1646 | cifserror("No username specified"); | 1651 | cifserror("No username specified"); |
1647 | /* In userspace mount helper we can get user name from alternate | 1652 | /* In userspace mount helper we can get user name from alternate |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 976a691c5a68..2436ed8fc840 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -492,10 +492,14 @@ int cifs_close(struct inode *inode, struct file *file) | |||
492 | the struct would be in each open file, | 492 | the struct would be in each open file, |
493 | but this should give enough time to | 493 | but this should give enough time to |
494 | clear the socket */ | 494 | clear the socket */ |
495 | cERROR(1,("close with pending writes")); | 495 | #ifdef CONFIG_CIFS_DEBUG2 |
496 | cFYI(1,("close delay, write pending")); | ||
497 | #endif /* DEBUG2 */ | ||
496 | msleep(timeout); | 498 | msleep(timeout); |
497 | timeout *= 4; | 499 | timeout *= 4; |
498 | } | 500 | } |
501 | if(atomic_read(&pSMBFile->wrtPending)) | ||
502 | cERROR(1,("close with pending writes")); | ||
499 | rc = CIFSSMBClose(xid, pTcon, | 503 | rc = CIFSSMBClose(xid, pTcon, |
500 | pSMBFile->netfid); | 504 | pSMBFile->netfid); |
501 | } | 505 | } |
@@ -1806,13 +1810,6 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, | |||
1806 | } | 1810 | } |
1807 | if ((rc < 0) || (smb_read_data == NULL)) { | 1811 | if ((rc < 0) || (smb_read_data == NULL)) { |
1808 | cFYI(1, ("Read error in readpages: %d", rc)); | 1812 | cFYI(1, ("Read error in readpages: %d", rc)); |
1809 | /* clean up remaing pages off list */ | ||
1810 | while (!list_empty(page_list) && (i < num_pages)) { | ||
1811 | page = list_entry(page_list->prev, struct page, | ||
1812 | lru); | ||
1813 | list_del(&page->lru); | ||
1814 | page_cache_release(page); | ||
1815 | } | ||
1816 | break; | 1813 | break; |
1817 | } else if (bytes_read > 0) { | 1814 | } else if (bytes_read > 0) { |
1818 | pSMBr = (struct smb_com_read_rsp *)smb_read_data; | 1815 | pSMBr = (struct smb_com_read_rsp *)smb_read_data; |
@@ -1831,13 +1828,7 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, | |||
1831 | this case is ok - if we are at server EOF | 1828 | this case is ok - if we are at server EOF |
1832 | we will hit it on next read */ | 1829 | we will hit it on next read */ |
1833 | 1830 | ||
1834 | /* while (!list_empty(page_list) && (i < num_pages)) { | 1831 | /* break; */ |
1835 | page = list_entry(page_list->prev, | ||
1836 | struct page, list); | ||
1837 | list_del(&page->list); | ||
1838 | page_cache_release(page); | ||
1839 | } | ||
1840 | break; */ | ||
1841 | } | 1832 | } |
1842 | } else { | 1833 | } else { |
1843 | cFYI(1, ("No bytes read (%d) at offset %lld . " | 1834 | cFYI(1, ("No bytes read (%d) at offset %lld . " |
@@ -1845,14 +1836,6 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, | |||
1845 | bytes_read, offset)); | 1836 | bytes_read, offset)); |
1846 | /* BB turn off caching and do new lookup on | 1837 | /* BB turn off caching and do new lookup on |
1847 | file size at server? */ | 1838 | file size at server? */ |
1848 | while (!list_empty(page_list) && (i < num_pages)) { | ||
1849 | page = list_entry(page_list->prev, struct page, | ||
1850 | lru); | ||
1851 | list_del(&page->lru); | ||
1852 | |||
1853 | /* BB removeme - replace with zero of page? */ | ||
1854 | page_cache_release(page); | ||
1855 | } | ||
1856 | break; | 1839 | break; |
1857 | } | 1840 | } |
1858 | if (smb_read_data) { | 1841 | if (smb_read_data) { |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 35d54bb0869a..1ad8c9fcc742 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -885,10 +885,14 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry, | |||
885 | kmalloc(2 * sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL); | 885 | kmalloc(2 * sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL); |
886 | if (info_buf_source != NULL) { | 886 | if (info_buf_source != NULL) { |
887 | info_buf_target = info_buf_source + 1; | 887 | info_buf_target = info_buf_source + 1; |
888 | rc = CIFSSMBUnixQPathInfo(xid, pTcon, fromName, | 888 | if (pTcon->ses->capabilities & CAP_UNIX) |
889 | info_buf_source, cifs_sb_source->local_nls, | 889 | rc = CIFSSMBUnixQPathInfo(xid, pTcon, fromName, |
890 | cifs_sb_source->mnt_cifs_flags & | 890 | info_buf_source, |
891 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 891 | cifs_sb_source->local_nls, |
892 | cifs_sb_source->mnt_cifs_flags & | ||
893 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
894 | /* else rc is still EEXIST so will fall through to | ||
895 | unlink the target and retry rename */ | ||
892 | if (rc == 0) { | 896 | if (rc == 0) { |
893 | rc = CIFSSMBUnixQPathInfo(xid, pTcon, toName, | 897 | rc = CIFSSMBUnixQPathInfo(xid, pTcon, toName, |
894 | info_buf_target, | 898 | info_buf_target, |
@@ -937,7 +941,7 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry, | |||
937 | cifs_sb_source->mnt_cifs_flags & | 941 | cifs_sb_source->mnt_cifs_flags & |
938 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 942 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
939 | if (rc==0) { | 943 | if (rc==0) { |
940 | CIFSSMBRenameOpenFile(xid, pTcon, netfid, toName, | 944 | rc = CIFSSMBRenameOpenFile(xid, pTcon, netfid, toName, |
941 | cifs_sb_source->local_nls, | 945 | cifs_sb_source->local_nls, |
942 | cifs_sb_source->mnt_cifs_flags & | 946 | cifs_sb_source->mnt_cifs_flags & |
943 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 947 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
@@ -1085,8 +1089,10 @@ int cifs_getattr(struct vfsmount *mnt, struct dentry *dentry, | |||
1085 | struct kstat *stat) | 1089 | struct kstat *stat) |
1086 | { | 1090 | { |
1087 | int err = cifs_revalidate(dentry); | 1091 | int err = cifs_revalidate(dentry); |
1088 | if (!err) | 1092 | if (!err) { |
1089 | generic_fillattr(dentry->d_inode, stat); | 1093 | generic_fillattr(dentry->d_inode, stat); |
1094 | stat->blksize = CIFS_MAX_MSGSIZE; | ||
1095 | } | ||
1090 | return err; | 1096 | return err; |
1091 | } | 1097 | } |
1092 | 1098 | ||
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index b5b0a2a41bef..ed18c3965f7b 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
@@ -896,6 +896,10 @@ static int cifs_filldir(char *pfindEntry, struct file *file, | |||
896 | tmp_inode->i_ino,obj_type); | 896 | tmp_inode->i_ino,obj_type); |
897 | if(rc) { | 897 | if(rc) { |
898 | cFYI(1,("filldir rc = %d",rc)); | 898 | cFYI(1,("filldir rc = %d",rc)); |
899 | /* we can not return filldir errors to the caller | ||
900 | since they are "normal" when the stat blocksize | ||
901 | is too small - we return remapped error instead */ | ||
902 | rc = -EOVERFLOW; | ||
899 | } | 903 | } |
900 | 904 | ||
901 | dput(tmp_dentry); | 905 | dput(tmp_dentry); |
@@ -1074,6 +1078,11 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) | |||
1074 | we want to check for that here? */ | 1078 | we want to check for that here? */ |
1075 | rc = cifs_filldir(current_entry, file, | 1079 | rc = cifs_filldir(current_entry, file, |
1076 | filldir, direntry, tmp_buf, max_len); | 1080 | filldir, direntry, tmp_buf, max_len); |
1081 | if(rc == -EOVERFLOW) { | ||
1082 | rc = 0; | ||
1083 | break; | ||
1084 | } | ||
1085 | |||
1077 | file->f_pos++; | 1086 | file->f_pos++; |
1078 | if(file->f_pos == | 1087 | if(file->f_pos == |
1079 | cifsFile->srch_inf.index_of_last_entry) { | 1088 | cifsFile->srch_inf.index_of_last_entry) { |
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c index a8a083543ba0..bbdda99dce61 100644 --- a/fs/cifs/sess.c +++ b/fs/cifs/sess.c | |||
@@ -90,7 +90,9 @@ static void unicode_ssetup_strings(char ** pbcc_area, struct cifsSesInfo *ses, | |||
90 | } */ | 90 | } */ |
91 | /* copy user */ | 91 | /* copy user */ |
92 | if(ses->userName == NULL) { | 92 | if(ses->userName == NULL) { |
93 | /* BB what about null user mounts - check that we do this BB */ | 93 | /* null user mount */ |
94 | *bcc_ptr = 0; | ||
95 | *(bcc_ptr+1) = 0; | ||
94 | } else { /* 300 should be long enough for any conceivable user name */ | 96 | } else { /* 300 should be long enough for any conceivable user name */ |
95 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, ses->userName, | 97 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, ses->userName, |
96 | 300, nls_cp); | 98 | 300, nls_cp); |
@@ -98,10 +100,13 @@ static void unicode_ssetup_strings(char ** pbcc_area, struct cifsSesInfo *ses, | |||
98 | bcc_ptr += 2 * bytes_ret; | 100 | bcc_ptr += 2 * bytes_ret; |
99 | bcc_ptr += 2; /* account for null termination */ | 101 | bcc_ptr += 2; /* account for null termination */ |
100 | /* copy domain */ | 102 | /* copy domain */ |
101 | if(ses->domainName == NULL) | 103 | if(ses->domainName == NULL) { |
102 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, | 104 | /* Sending null domain better than using a bogus domain name (as |
103 | "CIFS_LINUX_DOM", 32, nls_cp); | 105 | we did briefly in 2.6.18) since server will use its default */ |
104 | else | 106 | *bcc_ptr = 0; |
107 | *(bcc_ptr+1) = 0; | ||
108 | bytes_ret = 0; | ||
109 | } else | ||
105 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, ses->domainName, | 110 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, ses->domainName, |
106 | 256, nls_cp); | 111 | 256, nls_cp); |
107 | bcc_ptr += 2 * bytes_ret; | 112 | bcc_ptr += 2 * bytes_ret; |
@@ -144,13 +149,11 @@ static void ascii_ssetup_strings(char ** pbcc_area, struct cifsSesInfo *ses, | |||
144 | 149 | ||
145 | /* copy domain */ | 150 | /* copy domain */ |
146 | 151 | ||
147 | if(ses->domainName == NULL) { | 152 | if(ses->domainName != NULL) { |
148 | strcpy(bcc_ptr, "CIFS_LINUX_DOM"); | ||
149 | bcc_ptr += 14; /* strlen(CIFS_LINUX_DOM) */ | ||
150 | } else { | ||
151 | strncpy(bcc_ptr, ses->domainName, 256); | 153 | strncpy(bcc_ptr, ses->domainName, 256); |
152 | bcc_ptr += strnlen(ses->domainName, 256); | 154 | bcc_ptr += strnlen(ses->domainName, 256); |
153 | } | 155 | } /* else we will send a null domain name |
156 | so the server will default to its own domain */ | ||
154 | *bcc_ptr = 0; | 157 | *bcc_ptr = 0; |
155 | bcc_ptr++; | 158 | bcc_ptr++; |
156 | 159 | ||
diff --git a/fs/compat.c b/fs/compat.c index 50624d4a70c6..8d0a0018a7d2 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
@@ -1835,9 +1835,12 @@ asmlinkage long compat_sys_pselect7(int n, compat_ulong_t __user *inp, | |||
1835 | 1835 | ||
1836 | } while (!ret && !timeout && tsp && (ts.tv_sec || ts.tv_nsec)); | 1836 | } while (!ret && !timeout && tsp && (ts.tv_sec || ts.tv_nsec)); |
1837 | 1837 | ||
1838 | if (ret == 0 && tsp && !(current->personality & STICKY_TIMEOUTS)) { | 1838 | if (tsp) { |
1839 | struct compat_timespec rts; | 1839 | struct compat_timespec rts; |
1840 | 1840 | ||
1841 | if (current->personality & STICKY_TIMEOUTS) | ||
1842 | goto sticky; | ||
1843 | |||
1841 | rts.tv_sec = timeout / HZ; | 1844 | rts.tv_sec = timeout / HZ; |
1842 | rts.tv_nsec = (timeout % HZ) * (NSEC_PER_SEC/HZ); | 1845 | rts.tv_nsec = (timeout % HZ) * (NSEC_PER_SEC/HZ); |
1843 | if (rts.tv_nsec >= NSEC_PER_SEC) { | 1846 | if (rts.tv_nsec >= NSEC_PER_SEC) { |
@@ -1846,8 +1849,19 @@ asmlinkage long compat_sys_pselect7(int n, compat_ulong_t __user *inp, | |||
1846 | } | 1849 | } |
1847 | if (compat_timespec_compare(&rts, &ts) >= 0) | 1850 | if (compat_timespec_compare(&rts, &ts) >= 0) |
1848 | rts = ts; | 1851 | rts = ts; |
1849 | if (copy_to_user(tsp, &rts, sizeof(rts))) | 1852 | if (copy_to_user(tsp, &rts, sizeof(rts))) { |
1850 | ret = -EFAULT; | 1853 | sticky: |
1854 | /* | ||
1855 | * If an application puts its timeval in read-only | ||
1856 | * memory, we don't want the Linux-specific update to | ||
1857 | * the timeval to cause a fault after the select has | ||
1858 | * completed successfully. However, because we're not | ||
1859 | * updating the timeval, we can't restart the system | ||
1860 | * call. | ||
1861 | */ | ||
1862 | if (ret == -ERESTARTNOHAND) | ||
1863 | ret = -EINTR; | ||
1864 | } | ||
1851 | } | 1865 | } |
1852 | 1866 | ||
1853 | if (ret == -ERESTARTNOHAND) { | 1867 | if (ret == -ERESTARTNOHAND) { |
diff --git a/fs/dcache.c b/fs/dcache.c index 2bac4ba1d1d3..fd4a428998ef 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -478,11 +478,12 @@ static void prune_dcache(int count, struct super_block *sb) | |||
478 | up_read(s_umount); | 478 | up_read(s_umount); |
479 | } | 479 | } |
480 | spin_unlock(&dentry->d_lock); | 480 | spin_unlock(&dentry->d_lock); |
481 | /* Cannot remove the first dentry, and it isn't appropriate | 481 | /* |
482 | * to move it to the head of the list, so give up, and try | 482 | * Insert dentry at the head of the list as inserting at the |
483 | * later | 483 | * tail leads to a cycle. |
484 | */ | 484 | */ |
485 | break; | 485 | list_add(&dentry->d_lru, &dentry_unused); |
486 | dentry_stat.nr_unused++; | ||
486 | } | 487 | } |
487 | spin_unlock(&dcache_lock); | 488 | spin_unlock(&dcache_lock); |
488 | } | 489 | } |
@@ -556,6 +557,7 @@ repeat: | |||
556 | static void shrink_dcache_for_umount_subtree(struct dentry *dentry) | 557 | static void shrink_dcache_for_umount_subtree(struct dentry *dentry) |
557 | { | 558 | { |
558 | struct dentry *parent; | 559 | struct dentry *parent; |
560 | unsigned detached = 0; | ||
559 | 561 | ||
560 | BUG_ON(!IS_ROOT(dentry)); | 562 | BUG_ON(!IS_ROOT(dentry)); |
561 | 563 | ||
@@ -620,7 +622,7 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry) | |||
620 | atomic_dec(&parent->d_count); | 622 | atomic_dec(&parent->d_count); |
621 | 623 | ||
622 | list_del(&dentry->d_u.d_child); | 624 | list_del(&dentry->d_u.d_child); |
623 | dentry_stat.nr_dentry--; /* For d_free, below */ | 625 | detached++; |
624 | 626 | ||
625 | inode = dentry->d_inode; | 627 | inode = dentry->d_inode; |
626 | if (inode) { | 628 | if (inode) { |
@@ -638,7 +640,7 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry) | |||
638 | * otherwise we ascend to the parent and move to the | 640 | * otherwise we ascend to the parent and move to the |
639 | * next sibling if there is one */ | 641 | * next sibling if there is one */ |
640 | if (!parent) | 642 | if (!parent) |
641 | return; | 643 | goto out; |
642 | 644 | ||
643 | dentry = parent; | 645 | dentry = parent; |
644 | 646 | ||
@@ -647,6 +649,11 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry) | |||
647 | dentry = list_entry(dentry->d_subdirs.next, | 649 | dentry = list_entry(dentry->d_subdirs.next, |
648 | struct dentry, d_u.d_child); | 650 | struct dentry, d_u.d_child); |
649 | } | 651 | } |
652 | out: | ||
653 | /* several dentries were freed, need to correct nr_dentry */ | ||
654 | spin_lock(&dcache_lock); | ||
655 | dentry_stat.nr_dentry -= detached; | ||
656 | spin_unlock(&dcache_lock); | ||
650 | } | 657 | } |
651 | 658 | ||
652 | /* | 659 | /* |
@@ -1469,23 +1476,21 @@ static void switch_names(struct dentry *dentry, struct dentry *target) | |||
1469 | * deleted it. | 1476 | * deleted it. |
1470 | */ | 1477 | */ |
1471 | 1478 | ||
1472 | /** | 1479 | /* |
1473 | * d_move - move a dentry | 1480 | * d_move_locked - move a dentry |
1474 | * @dentry: entry to move | 1481 | * @dentry: entry to move |
1475 | * @target: new dentry | 1482 | * @target: new dentry |
1476 | * | 1483 | * |
1477 | * Update the dcache to reflect the move of a file name. Negative | 1484 | * Update the dcache to reflect the move of a file name. Negative |
1478 | * dcache entries should not be moved in this way. | 1485 | * dcache entries should not be moved in this way. |
1479 | */ | 1486 | */ |
1480 | 1487 | static void d_move_locked(struct dentry * dentry, struct dentry * target) | |
1481 | void d_move(struct dentry * dentry, struct dentry * target) | ||
1482 | { | 1488 | { |
1483 | struct hlist_head *list; | 1489 | struct hlist_head *list; |
1484 | 1490 | ||
1485 | if (!dentry->d_inode) | 1491 | if (!dentry->d_inode) |
1486 | printk(KERN_WARNING "VFS: moving negative dcache entry\n"); | 1492 | printk(KERN_WARNING "VFS: moving negative dcache entry\n"); |
1487 | 1493 | ||
1488 | spin_lock(&dcache_lock); | ||
1489 | write_seqlock(&rename_lock); | 1494 | write_seqlock(&rename_lock); |
1490 | /* | 1495 | /* |
1491 | * XXXX: do we really need to take target->d_lock? | 1496 | * XXXX: do we really need to take target->d_lock? |
@@ -1536,7 +1541,81 @@ already_unhashed: | |||
1536 | fsnotify_d_move(dentry); | 1541 | fsnotify_d_move(dentry); |
1537 | spin_unlock(&dentry->d_lock); | 1542 | spin_unlock(&dentry->d_lock); |
1538 | write_sequnlock(&rename_lock); | 1543 | write_sequnlock(&rename_lock); |
1544 | } | ||
1545 | |||
1546 | /** | ||
1547 | * d_move - move a dentry | ||
1548 | * @dentry: entry to move | ||
1549 | * @target: new dentry | ||
1550 | * | ||
1551 | * Update the dcache to reflect the move of a file name. Negative | ||
1552 | * dcache entries should not be moved in this way. | ||
1553 | */ | ||
1554 | |||
1555 | void d_move(struct dentry * dentry, struct dentry * target) | ||
1556 | { | ||
1557 | spin_lock(&dcache_lock); | ||
1558 | d_move_locked(dentry, target); | ||
1559 | spin_unlock(&dcache_lock); | ||
1560 | } | ||
1561 | |||
1562 | /* | ||
1563 | * Helper that returns 1 if p1 is a parent of p2, else 0 | ||
1564 | */ | ||
1565 | static int d_isparent(struct dentry *p1, struct dentry *p2) | ||
1566 | { | ||
1567 | struct dentry *p; | ||
1568 | |||
1569 | for (p = p2; p->d_parent != p; p = p->d_parent) { | ||
1570 | if (p->d_parent == p1) | ||
1571 | return 1; | ||
1572 | } | ||
1573 | return 0; | ||
1574 | } | ||
1575 | |||
1576 | /* | ||
1577 | * This helper attempts to cope with remotely renamed directories | ||
1578 | * | ||
1579 | * It assumes that the caller is already holding | ||
1580 | * dentry->d_parent->d_inode->i_mutex and the dcache_lock | ||
1581 | * | ||
1582 | * Note: If ever the locking in lock_rename() changes, then please | ||
1583 | * remember to update this too... | ||
1584 | * | ||
1585 | * On return, dcache_lock will have been unlocked. | ||
1586 | */ | ||
1587 | static struct dentry *__d_unalias(struct dentry *dentry, struct dentry *alias) | ||
1588 | { | ||
1589 | struct mutex *m1 = NULL, *m2 = NULL; | ||
1590 | struct dentry *ret; | ||
1591 | |||
1592 | /* If alias and dentry share a parent, then no extra locks required */ | ||
1593 | if (alias->d_parent == dentry->d_parent) | ||
1594 | goto out_unalias; | ||
1595 | |||
1596 | /* Check for loops */ | ||
1597 | ret = ERR_PTR(-ELOOP); | ||
1598 | if (d_isparent(alias, dentry)) | ||
1599 | goto out_err; | ||
1600 | |||
1601 | /* See lock_rename() */ | ||
1602 | ret = ERR_PTR(-EBUSY); | ||
1603 | if (!mutex_trylock(&dentry->d_sb->s_vfs_rename_mutex)) | ||
1604 | goto out_err; | ||
1605 | m1 = &dentry->d_sb->s_vfs_rename_mutex; | ||
1606 | if (!mutex_trylock(&alias->d_parent->d_inode->i_mutex)) | ||
1607 | goto out_err; | ||
1608 | m2 = &alias->d_parent->d_inode->i_mutex; | ||
1609 | out_unalias: | ||
1610 | d_move_locked(alias, dentry); | ||
1611 | ret = alias; | ||
1612 | out_err: | ||
1539 | spin_unlock(&dcache_lock); | 1613 | spin_unlock(&dcache_lock); |
1614 | if (m2) | ||
1615 | mutex_unlock(m2); | ||
1616 | if (m1) | ||
1617 | mutex_unlock(m1); | ||
1618 | return ret; | ||
1540 | } | 1619 | } |
1541 | 1620 | ||
1542 | /* | 1621 | /* |
@@ -1581,7 +1660,7 @@ static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon) | |||
1581 | */ | 1660 | */ |
1582 | struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode) | 1661 | struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode) |
1583 | { | 1662 | { |
1584 | struct dentry *alias, *actual; | 1663 | struct dentry *actual; |
1585 | 1664 | ||
1586 | BUG_ON(!d_unhashed(dentry)); | 1665 | BUG_ON(!d_unhashed(dentry)); |
1587 | 1666 | ||
@@ -1593,26 +1672,27 @@ struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode) | |||
1593 | goto found_lock; | 1672 | goto found_lock; |
1594 | } | 1673 | } |
1595 | 1674 | ||
1596 | /* See if a disconnected directory already exists as an anonymous root | 1675 | if (S_ISDIR(inode->i_mode)) { |
1597 | * that we should splice into the tree instead */ | 1676 | struct dentry *alias; |
1598 | if (S_ISDIR(inode->i_mode) && (alias = __d_find_alias(inode, 1))) { | 1677 | |
1599 | spin_lock(&alias->d_lock); | 1678 | /* Does an aliased dentry already exist? */ |
1600 | 1679 | alias = __d_find_alias(inode, 0); | |
1601 | /* Is this a mountpoint that we could splice into our tree? */ | 1680 | if (alias) { |
1602 | if (IS_ROOT(alias)) | 1681 | actual = alias; |
1603 | goto connect_mountpoint; | 1682 | /* Is this an anonymous mountpoint that we could splice |
1604 | 1683 | * into our tree? */ | |
1605 | if (alias->d_name.len == dentry->d_name.len && | 1684 | if (IS_ROOT(alias)) { |
1606 | alias->d_parent == dentry->d_parent && | 1685 | spin_lock(&alias->d_lock); |
1607 | memcmp(alias->d_name.name, | 1686 | __d_materialise_dentry(dentry, alias); |
1608 | dentry->d_name.name, | 1687 | __d_drop(alias); |
1609 | dentry->d_name.len) == 0) | 1688 | goto found; |
1610 | goto replace_with_alias; | 1689 | } |
1611 | 1690 | /* Nope, but we must(!) avoid directory aliasing */ | |
1612 | spin_unlock(&alias->d_lock); | 1691 | actual = __d_unalias(dentry, alias); |
1613 | 1692 | if (IS_ERR(actual)) | |
1614 | /* Doh! Seem to be aliasing directories for some reason... */ | 1693 | dput(alias); |
1615 | dput(alias); | 1694 | goto out_nolock; |
1695 | } | ||
1616 | } | 1696 | } |
1617 | 1697 | ||
1618 | /* Add a unique reference */ | 1698 | /* Add a unique reference */ |
@@ -1628,7 +1708,7 @@ found: | |||
1628 | _d_rehash(actual); | 1708 | _d_rehash(actual); |
1629 | spin_unlock(&actual->d_lock); | 1709 | spin_unlock(&actual->d_lock); |
1630 | spin_unlock(&dcache_lock); | 1710 | spin_unlock(&dcache_lock); |
1631 | 1711 | out_nolock: | |
1632 | if (actual == dentry) { | 1712 | if (actual == dentry) { |
1633 | security_d_instantiate(dentry, inode); | 1713 | security_d_instantiate(dentry, inode); |
1634 | return NULL; | 1714 | return NULL; |
@@ -1637,16 +1717,6 @@ found: | |||
1637 | iput(inode); | 1717 | iput(inode); |
1638 | return actual; | 1718 | return actual; |
1639 | 1719 | ||
1640 | /* Convert the anonymous/root alias into an ordinary dentry */ | ||
1641 | connect_mountpoint: | ||
1642 | __d_materialise_dentry(dentry, alias); | ||
1643 | |||
1644 | /* Replace the candidate dentry with the alias in the tree */ | ||
1645 | replace_with_alias: | ||
1646 | __d_drop(alias); | ||
1647 | actual = alias; | ||
1648 | goto found; | ||
1649 | |||
1650 | shouldnt_be_hashed: | 1720 | shouldnt_be_hashed: |
1651 | spin_unlock(&dcache_lock); | 1721 | spin_unlock(&dcache_lock); |
1652 | BUG(); | 1722 | BUG(); |
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index e77676df6713..137d76c3f90a 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/mount.h> | 21 | #include <linux/mount.h> |
22 | #include <linux/pagemap.h> | 22 | #include <linux/pagemap.h> |
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | #include <linux/kobject.h> | ||
24 | #include <linux/namei.h> | 25 | #include <linux/namei.h> |
25 | #include <linux/debugfs.h> | 26 | #include <linux/debugfs.h> |
26 | 27 | ||
@@ -147,13 +148,13 @@ static int debugfs_create_by_name(const char *name, mode_t mode, | |||
147 | *dentry = NULL; | 148 | *dentry = NULL; |
148 | mutex_lock(&parent->d_inode->i_mutex); | 149 | mutex_lock(&parent->d_inode->i_mutex); |
149 | *dentry = lookup_one_len(name, parent, strlen(name)); | 150 | *dentry = lookup_one_len(name, parent, strlen(name)); |
150 | if (!IS_ERR(dentry)) { | 151 | if (!IS_ERR(*dentry)) { |
151 | if ((mode & S_IFMT) == S_IFDIR) | 152 | if ((mode & S_IFMT) == S_IFDIR) |
152 | error = debugfs_mkdir(parent->d_inode, *dentry, mode); | 153 | error = debugfs_mkdir(parent->d_inode, *dentry, mode); |
153 | else | 154 | else |
154 | error = debugfs_create(parent->d_inode, *dentry, mode); | 155 | error = debugfs_create(parent->d_inode, *dentry, mode); |
155 | } else | 156 | } else |
156 | error = PTR_ERR(dentry); | 157 | error = PTR_ERR(*dentry); |
157 | mutex_unlock(&parent->d_inode->i_mutex); | 158 | mutex_unlock(&parent->d_inode->i_mutex); |
158 | 159 | ||
159 | return error; | 160 | return error; |
diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c index 109333c8ecb9..f8842ca443c2 100644 --- a/fs/dlm/lockspace.c +++ b/fs/dlm/lockspace.c | |||
@@ -43,6 +43,10 @@ static ssize_t dlm_control_store(struct dlm_ls *ls, const char *buf, size_t len) | |||
43 | ssize_t ret = len; | 43 | ssize_t ret = len; |
44 | int n = simple_strtol(buf, NULL, 0); | 44 | int n = simple_strtol(buf, NULL, 0); |
45 | 45 | ||
46 | ls = dlm_find_lockspace_local(ls->ls_local_handle); | ||
47 | if (!ls) | ||
48 | return -EINVAL; | ||
49 | |||
46 | switch (n) { | 50 | switch (n) { |
47 | case 0: | 51 | case 0: |
48 | dlm_ls_stop(ls); | 52 | dlm_ls_stop(ls); |
@@ -53,6 +57,7 @@ static ssize_t dlm_control_store(struct dlm_ls *ls, const char *buf, size_t len) | |||
53 | default: | 57 | default: |
54 | ret = -EINVAL; | 58 | ret = -EINVAL; |
55 | } | 59 | } |
60 | dlm_put_lockspace(ls); | ||
56 | return ret; | 61 | return ret; |
57 | } | 62 | } |
58 | 63 | ||
@@ -143,6 +148,12 @@ static ssize_t dlm_attr_store(struct kobject *kobj, struct attribute *attr, | |||
143 | return a->store ? a->store(ls, buf, len) : len; | 148 | return a->store ? a->store(ls, buf, len) : len; |
144 | } | 149 | } |
145 | 150 | ||
151 | static void lockspace_kobj_release(struct kobject *k) | ||
152 | { | ||
153 | struct dlm_ls *ls = container_of(k, struct dlm_ls, ls_kobj); | ||
154 | kfree(ls); | ||
155 | } | ||
156 | |||
146 | static struct sysfs_ops dlm_attr_ops = { | 157 | static struct sysfs_ops dlm_attr_ops = { |
147 | .show = dlm_attr_show, | 158 | .show = dlm_attr_show, |
148 | .store = dlm_attr_store, | 159 | .store = dlm_attr_store, |
@@ -151,6 +162,7 @@ static struct sysfs_ops dlm_attr_ops = { | |||
151 | static struct kobj_type dlm_ktype = { | 162 | static struct kobj_type dlm_ktype = { |
152 | .default_attrs = dlm_attrs, | 163 | .default_attrs = dlm_attrs, |
153 | .sysfs_ops = &dlm_attr_ops, | 164 | .sysfs_ops = &dlm_attr_ops, |
165 | .release = lockspace_kobj_release, | ||
154 | }; | 166 | }; |
155 | 167 | ||
156 | static struct kset dlm_kset = { | 168 | static struct kset dlm_kset = { |
@@ -678,7 +690,7 @@ static int release_lockspace(struct dlm_ls *ls, int force) | |||
678 | dlm_clear_members_gone(ls); | 690 | dlm_clear_members_gone(ls); |
679 | kfree(ls->ls_node_array); | 691 | kfree(ls->ls_node_array); |
680 | kobject_unregister(&ls->ls_kobj); | 692 | kobject_unregister(&ls->ls_kobj); |
681 | kfree(ls); | 693 | /* The ls structure will be freed when the kobject is done with */ |
682 | 694 | ||
683 | mutex_lock(&ls_lock); | 695 | mutex_lock(&ls_lock); |
684 | ls_count--; | 696 | ls_count--; |
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index ed35a9712fa1..f63a7755fe86 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c | |||
@@ -94,25 +94,53 @@ static int ecryptfs_calculate_md5(char *dst, | |||
94 | struct ecryptfs_crypt_stat *crypt_stat, | 94 | struct ecryptfs_crypt_stat *crypt_stat, |
95 | char *src, int len) | 95 | char *src, int len) |
96 | { | 96 | { |
97 | int rc = 0; | ||
98 | struct scatterlist sg; | 97 | struct scatterlist sg; |
98 | struct hash_desc desc = { | ||
99 | .tfm = crypt_stat->hash_tfm, | ||
100 | .flags = CRYPTO_TFM_REQ_MAY_SLEEP | ||
101 | }; | ||
102 | int rc = 0; | ||
99 | 103 | ||
100 | mutex_lock(&crypt_stat->cs_md5_tfm_mutex); | 104 | mutex_lock(&crypt_stat->cs_hash_tfm_mutex); |
101 | sg_init_one(&sg, (u8 *)src, len); | 105 | sg_init_one(&sg, (u8 *)src, len); |
102 | if (!crypt_stat->md5_tfm) { | 106 | if (!desc.tfm) { |
103 | crypt_stat->md5_tfm = | 107 | desc.tfm = crypto_alloc_hash(ECRYPTFS_DEFAULT_HASH, 0, |
104 | crypto_alloc_tfm("md5", CRYPTO_TFM_REQ_MAY_SLEEP); | 108 | CRYPTO_ALG_ASYNC); |
105 | if (!crypt_stat->md5_tfm) { | 109 | if (IS_ERR(desc.tfm)) { |
106 | rc = -ENOMEM; | 110 | rc = PTR_ERR(desc.tfm); |
107 | ecryptfs_printk(KERN_ERR, "Error attempting to " | 111 | ecryptfs_printk(KERN_ERR, "Error attempting to " |
108 | "allocate crypto context\n"); | 112 | "allocate crypto context; rc = [%d]\n", |
113 | rc); | ||
109 | goto out; | 114 | goto out; |
110 | } | 115 | } |
116 | crypt_stat->hash_tfm = desc.tfm; | ||
111 | } | 117 | } |
112 | crypto_digest_init(crypt_stat->md5_tfm); | 118 | crypto_hash_init(&desc); |
113 | crypto_digest_update(crypt_stat->md5_tfm, &sg, 1); | 119 | crypto_hash_update(&desc, &sg, len); |
114 | crypto_digest_final(crypt_stat->md5_tfm, dst); | 120 | crypto_hash_final(&desc, dst); |
115 | mutex_unlock(&crypt_stat->cs_md5_tfm_mutex); | 121 | mutex_unlock(&crypt_stat->cs_hash_tfm_mutex); |
122 | out: | ||
123 | return rc; | ||
124 | } | ||
125 | |||
126 | int ecryptfs_crypto_api_algify_cipher_name(char **algified_name, | ||
127 | char *cipher_name, | ||
128 | char *chaining_modifier) | ||
129 | { | ||
130 | int cipher_name_len = strlen(cipher_name); | ||
131 | int chaining_modifier_len = strlen(chaining_modifier); | ||
132 | int algified_name_len; | ||
133 | int rc; | ||
134 | |||
135 | algified_name_len = (chaining_modifier_len + cipher_name_len + 3); | ||
136 | (*algified_name) = kmalloc(algified_name_len, GFP_KERNEL); | ||
137 | if (!(*algified_name)) { | ||
138 | rc = -ENOMEM; | ||
139 | goto out; | ||
140 | } | ||
141 | snprintf((*algified_name), algified_name_len, "%s(%s)", | ||
142 | chaining_modifier, cipher_name); | ||
143 | rc = 0; | ||
116 | out: | 144 | out: |
117 | return rc; | 145 | return rc; |
118 | } | 146 | } |
@@ -178,7 +206,7 @@ ecryptfs_init_crypt_stat(struct ecryptfs_crypt_stat *crypt_stat) | |||
178 | memset((void *)crypt_stat, 0, sizeof(struct ecryptfs_crypt_stat)); | 206 | memset((void *)crypt_stat, 0, sizeof(struct ecryptfs_crypt_stat)); |
179 | mutex_init(&crypt_stat->cs_mutex); | 207 | mutex_init(&crypt_stat->cs_mutex); |
180 | mutex_init(&crypt_stat->cs_tfm_mutex); | 208 | mutex_init(&crypt_stat->cs_tfm_mutex); |
181 | mutex_init(&crypt_stat->cs_md5_tfm_mutex); | 209 | mutex_init(&crypt_stat->cs_hash_tfm_mutex); |
182 | ECRYPTFS_SET_FLAG(crypt_stat->flags, ECRYPTFS_STRUCT_INITIALIZED); | 210 | ECRYPTFS_SET_FLAG(crypt_stat->flags, ECRYPTFS_STRUCT_INITIALIZED); |
183 | } | 211 | } |
184 | 212 | ||
@@ -191,9 +219,9 @@ ecryptfs_init_crypt_stat(struct ecryptfs_crypt_stat *crypt_stat) | |||
191 | void ecryptfs_destruct_crypt_stat(struct ecryptfs_crypt_stat *crypt_stat) | 219 | void ecryptfs_destruct_crypt_stat(struct ecryptfs_crypt_stat *crypt_stat) |
192 | { | 220 | { |
193 | if (crypt_stat->tfm) | 221 | if (crypt_stat->tfm) |
194 | crypto_free_tfm(crypt_stat->tfm); | 222 | crypto_free_blkcipher(crypt_stat->tfm); |
195 | if (crypt_stat->md5_tfm) | 223 | if (crypt_stat->hash_tfm) |
196 | crypto_free_tfm(crypt_stat->md5_tfm); | 224 | crypto_free_hash(crypt_stat->hash_tfm); |
197 | memset(crypt_stat, 0, sizeof(struct ecryptfs_crypt_stat)); | 225 | memset(crypt_stat, 0, sizeof(struct ecryptfs_crypt_stat)); |
198 | } | 226 | } |
199 | 227 | ||
@@ -203,7 +231,7 @@ void ecryptfs_destruct_mount_crypt_stat( | |||
203 | if (mount_crypt_stat->global_auth_tok_key) | 231 | if (mount_crypt_stat->global_auth_tok_key) |
204 | key_put(mount_crypt_stat->global_auth_tok_key); | 232 | key_put(mount_crypt_stat->global_auth_tok_key); |
205 | if (mount_crypt_stat->global_key_tfm) | 233 | if (mount_crypt_stat->global_key_tfm) |
206 | crypto_free_tfm(mount_crypt_stat->global_key_tfm); | 234 | crypto_free_blkcipher(mount_crypt_stat->global_key_tfm); |
207 | memset(mount_crypt_stat, 0, sizeof(struct ecryptfs_mount_crypt_stat)); | 235 | memset(mount_crypt_stat, 0, sizeof(struct ecryptfs_mount_crypt_stat)); |
208 | } | 236 | } |
209 | 237 | ||
@@ -269,6 +297,11 @@ static int encrypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat, | |||
269 | struct scatterlist *src_sg, int size, | 297 | struct scatterlist *src_sg, int size, |
270 | unsigned char *iv) | 298 | unsigned char *iv) |
271 | { | 299 | { |
300 | struct blkcipher_desc desc = { | ||
301 | .tfm = crypt_stat->tfm, | ||
302 | .info = iv, | ||
303 | .flags = CRYPTO_TFM_REQ_MAY_SLEEP | ||
304 | }; | ||
272 | int rc = 0; | 305 | int rc = 0; |
273 | 306 | ||
274 | BUG_ON(!crypt_stat || !crypt_stat->tfm | 307 | BUG_ON(!crypt_stat || !crypt_stat->tfm |
@@ -282,8 +315,8 @@ static int encrypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat, | |||
282 | } | 315 | } |
283 | /* Consider doing this once, when the file is opened */ | 316 | /* Consider doing this once, when the file is opened */ |
284 | mutex_lock(&crypt_stat->cs_tfm_mutex); | 317 | mutex_lock(&crypt_stat->cs_tfm_mutex); |
285 | rc = crypto_cipher_setkey(crypt_stat->tfm, crypt_stat->key, | 318 | rc = crypto_blkcipher_setkey(crypt_stat->tfm, crypt_stat->key, |
286 | crypt_stat->key_size); | 319 | crypt_stat->key_size); |
287 | if (rc) { | 320 | if (rc) { |
288 | ecryptfs_printk(KERN_ERR, "Error setting key; rc = [%d]\n", | 321 | ecryptfs_printk(KERN_ERR, "Error setting key; rc = [%d]\n", |
289 | rc); | 322 | rc); |
@@ -292,7 +325,7 @@ static int encrypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat, | |||
292 | goto out; | 325 | goto out; |
293 | } | 326 | } |
294 | ecryptfs_printk(KERN_DEBUG, "Encrypting [%d] bytes.\n", size); | 327 | ecryptfs_printk(KERN_DEBUG, "Encrypting [%d] bytes.\n", size); |
295 | crypto_cipher_encrypt_iv(crypt_stat->tfm, dest_sg, src_sg, size, iv); | 328 | crypto_blkcipher_encrypt_iv(&desc, dest_sg, src_sg, size); |
296 | mutex_unlock(&crypt_stat->cs_tfm_mutex); | 329 | mutex_unlock(&crypt_stat->cs_tfm_mutex); |
297 | out: | 330 | out: |
298 | return rc; | 331 | return rc; |
@@ -675,12 +708,17 @@ static int decrypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat, | |||
675 | struct scatterlist *src_sg, int size, | 708 | struct scatterlist *src_sg, int size, |
676 | unsigned char *iv) | 709 | unsigned char *iv) |
677 | { | 710 | { |
711 | struct blkcipher_desc desc = { | ||
712 | .tfm = crypt_stat->tfm, | ||
713 | .info = iv, | ||
714 | .flags = CRYPTO_TFM_REQ_MAY_SLEEP | ||
715 | }; | ||
678 | int rc = 0; | 716 | int rc = 0; |
679 | 717 | ||
680 | /* Consider doing this once, when the file is opened */ | 718 | /* Consider doing this once, when the file is opened */ |
681 | mutex_lock(&crypt_stat->cs_tfm_mutex); | 719 | mutex_lock(&crypt_stat->cs_tfm_mutex); |
682 | rc = crypto_cipher_setkey(crypt_stat->tfm, crypt_stat->key, | 720 | rc = crypto_blkcipher_setkey(crypt_stat->tfm, crypt_stat->key, |
683 | crypt_stat->key_size); | 721 | crypt_stat->key_size); |
684 | if (rc) { | 722 | if (rc) { |
685 | ecryptfs_printk(KERN_ERR, "Error setting key; rc = [%d]\n", | 723 | ecryptfs_printk(KERN_ERR, "Error setting key; rc = [%d]\n", |
686 | rc); | 724 | rc); |
@@ -689,8 +727,7 @@ static int decrypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat, | |||
689 | goto out; | 727 | goto out; |
690 | } | 728 | } |
691 | ecryptfs_printk(KERN_DEBUG, "Decrypting [%d] bytes.\n", size); | 729 | ecryptfs_printk(KERN_DEBUG, "Decrypting [%d] bytes.\n", size); |
692 | rc = crypto_cipher_decrypt_iv(crypt_stat->tfm, dest_sg, src_sg, size, | 730 | rc = crypto_blkcipher_decrypt_iv(&desc, dest_sg, src_sg, size); |
693 | iv); | ||
694 | mutex_unlock(&crypt_stat->cs_tfm_mutex); | 731 | mutex_unlock(&crypt_stat->cs_tfm_mutex); |
695 | if (rc) { | 732 | if (rc) { |
696 | ecryptfs_printk(KERN_ERR, "Error decrypting; rc = [%d]\n", | 733 | ecryptfs_printk(KERN_ERR, "Error decrypting; rc = [%d]\n", |
@@ -759,6 +796,7 @@ ecryptfs_decrypt_page_offset(struct ecryptfs_crypt_stat *crypt_stat, | |||
759 | */ | 796 | */ |
760 | int ecryptfs_init_crypt_ctx(struct ecryptfs_crypt_stat *crypt_stat) | 797 | int ecryptfs_init_crypt_ctx(struct ecryptfs_crypt_stat *crypt_stat) |
761 | { | 798 | { |
799 | char *full_alg_name; | ||
762 | int rc = -EINVAL; | 800 | int rc = -EINVAL; |
763 | 801 | ||
764 | if (!crypt_stat->cipher) { | 802 | if (!crypt_stat->cipher) { |
@@ -775,16 +813,25 @@ int ecryptfs_init_crypt_ctx(struct ecryptfs_crypt_stat *crypt_stat) | |||
775 | goto out; | 813 | goto out; |
776 | } | 814 | } |
777 | mutex_lock(&crypt_stat->cs_tfm_mutex); | 815 | mutex_lock(&crypt_stat->cs_tfm_mutex); |
778 | crypt_stat->tfm = crypto_alloc_tfm(crypt_stat->cipher, | 816 | rc = ecryptfs_crypto_api_algify_cipher_name(&full_alg_name, |
779 | ECRYPTFS_DEFAULT_CHAINING_MODE | 817 | crypt_stat->cipher, "cbc"); |
780 | | CRYPTO_TFM_REQ_WEAK_KEY); | 818 | if (rc) |
781 | mutex_unlock(&crypt_stat->cs_tfm_mutex); | 819 | goto out; |
782 | if (!crypt_stat->tfm) { | 820 | crypt_stat->tfm = crypto_alloc_blkcipher(full_alg_name, 0, |
821 | CRYPTO_ALG_ASYNC); | ||
822 | kfree(full_alg_name); | ||
823 | if (IS_ERR(crypt_stat->tfm)) { | ||
824 | rc = PTR_ERR(crypt_stat->tfm); | ||
783 | ecryptfs_printk(KERN_ERR, "cryptfs: init_crypt_ctx(): " | 825 | ecryptfs_printk(KERN_ERR, "cryptfs: init_crypt_ctx(): " |
784 | "Error initializing cipher [%s]\n", | 826 | "Error initializing cipher [%s]\n", |
785 | crypt_stat->cipher); | 827 | crypt_stat->cipher); |
828 | mutex_unlock(&crypt_stat->cs_tfm_mutex); | ||
786 | goto out; | 829 | goto out; |
787 | } | 830 | } |
831 | crypto_blkcipher_set_flags(crypt_stat->tfm, | ||
832 | (ECRYPTFS_DEFAULT_CHAINING_MODE | ||
833 | | CRYPTO_TFM_REQ_WEAK_KEY)); | ||
834 | mutex_unlock(&crypt_stat->cs_tfm_mutex); | ||
788 | rc = 0; | 835 | rc = 0; |
789 | out: | 836 | out: |
790 | return rc; | 837 | return rc; |
@@ -1145,28 +1192,28 @@ int ecryptfs_cipher_code_to_string(char *str, u16 cipher_code) | |||
1145 | int ecryptfs_read_header_region(char *data, struct dentry *dentry, | 1192 | int ecryptfs_read_header_region(char *data, struct dentry *dentry, |
1146 | struct vfsmount *mnt) | 1193 | struct vfsmount *mnt) |
1147 | { | 1194 | { |
1148 | struct file *file; | 1195 | struct file *lower_file; |
1149 | mm_segment_t oldfs; | 1196 | mm_segment_t oldfs; |
1150 | int rc; | 1197 | int rc; |
1151 | 1198 | ||
1152 | mnt = mntget(mnt); | 1199 | if ((rc = ecryptfs_open_lower_file(&lower_file, dentry, mnt, |
1153 | file = dentry_open(dentry, mnt, O_RDONLY); | 1200 | O_RDONLY))) { |
1154 | if (IS_ERR(file)) { | 1201 | printk(KERN_ERR |
1155 | ecryptfs_printk(KERN_DEBUG, "Error opening file to " | 1202 | "Error opening lower_file to read header region\n"); |
1156 | "read header region\n"); | ||
1157 | mntput(mnt); | ||
1158 | rc = PTR_ERR(file); | ||
1159 | goto out; | 1203 | goto out; |
1160 | } | 1204 | } |
1161 | file->f_pos = 0; | 1205 | lower_file->f_pos = 0; |
1162 | oldfs = get_fs(); | 1206 | oldfs = get_fs(); |
1163 | set_fs(get_ds()); | 1207 | set_fs(get_ds()); |
1164 | /* For releases 0.1 and 0.2, all of the header information | 1208 | /* For releases 0.1 and 0.2, all of the header information |
1165 | * fits in the first data extent-sized region. */ | 1209 | * fits in the first data extent-sized region. */ |
1166 | rc = file->f_op->read(file, (char __user *)data, | 1210 | rc = lower_file->f_op->read(lower_file, (char __user *)data, |
1167 | ECRYPTFS_DEFAULT_EXTENT_SIZE, &file->f_pos); | 1211 | ECRYPTFS_DEFAULT_EXTENT_SIZE, &lower_file->f_pos); |
1168 | set_fs(oldfs); | 1212 | set_fs(oldfs); |
1169 | fput(file); | 1213 | if ((rc = ecryptfs_close_lower_file(lower_file))) { |
1214 | printk(KERN_ERR "Error closing lower_file\n"); | ||
1215 | goto out; | ||
1216 | } | ||
1170 | rc = 0; | 1217 | rc = 0; |
1171 | out: | 1218 | out: |
1172 | return rc; | 1219 | return rc; |
@@ -1573,84 +1620,52 @@ out: | |||
1573 | 1620 | ||
1574 | /** | 1621 | /** |
1575 | * ecryptfs_process_cipher - Perform cipher initialization. | 1622 | * ecryptfs_process_cipher - Perform cipher initialization. |
1576 | * @tfm: Crypto context set by this function | ||
1577 | * @key_tfm: Crypto context for key material, set by this function | 1623 | * @key_tfm: Crypto context for key material, set by this function |
1578 | * @cipher_name: Name of the cipher. | 1624 | * @cipher_name: Name of the cipher |
1579 | * @key_size: Size of the key in bytes. | 1625 | * @key_size: Size of the key in bytes |
1580 | * | 1626 | * |
1581 | * Returns zero on success. Any crypto_tfm structs allocated here | 1627 | * Returns zero on success. Any crypto_tfm structs allocated here |
1582 | * should be released by other functions, such as on a superblock put | 1628 | * should be released by other functions, such as on a superblock put |
1583 | * event, regardless of whether this function succeeds for fails. | 1629 | * event, regardless of whether this function succeeds for fails. |
1584 | */ | 1630 | */ |
1585 | int | 1631 | int |
1586 | ecryptfs_process_cipher(struct crypto_tfm **tfm, struct crypto_tfm **key_tfm, | 1632 | ecryptfs_process_cipher(struct crypto_blkcipher **key_tfm, char *cipher_name, |
1587 | char *cipher_name, size_t key_size) | 1633 | size_t *key_size) |
1588 | { | 1634 | { |
1589 | char dummy_key[ECRYPTFS_MAX_KEY_BYTES]; | 1635 | char dummy_key[ECRYPTFS_MAX_KEY_BYTES]; |
1636 | char *full_alg_name; | ||
1590 | int rc; | 1637 | int rc; |
1591 | 1638 | ||
1592 | *tfm = *key_tfm = NULL; | 1639 | *key_tfm = NULL; |
1593 | if (key_size > ECRYPTFS_MAX_KEY_BYTES) { | 1640 | if (*key_size > ECRYPTFS_MAX_KEY_BYTES) { |
1594 | rc = -EINVAL; | 1641 | rc = -EINVAL; |
1595 | printk(KERN_ERR "Requested key size is [%Zd] bytes; maximum " | 1642 | printk(KERN_ERR "Requested key size is [%Zd] bytes; maximum " |
1596 | "allowable is [%d]\n", key_size, ECRYPTFS_MAX_KEY_BYTES); | 1643 | "allowable is [%d]\n", *key_size, ECRYPTFS_MAX_KEY_BYTES); |
1597 | goto out; | 1644 | goto out; |
1598 | } | 1645 | } |
1599 | *tfm = crypto_alloc_tfm(cipher_name, (ECRYPTFS_DEFAULT_CHAINING_MODE | 1646 | rc = ecryptfs_crypto_api_algify_cipher_name(&full_alg_name, cipher_name, |
1600 | | CRYPTO_TFM_REQ_WEAK_KEY)); | 1647 | "ecb"); |
1601 | if (!(*tfm)) { | 1648 | if (rc) |
1602 | rc = -EINVAL; | ||
1603 | printk(KERN_ERR "Unable to allocate crypto cipher with name " | ||
1604 | "[%s]\n", cipher_name); | ||
1605 | goto out; | 1649 | goto out; |
1606 | } | 1650 | *key_tfm = crypto_alloc_blkcipher(full_alg_name, 0, CRYPTO_ALG_ASYNC); |
1607 | *key_tfm = crypto_alloc_tfm(cipher_name, CRYPTO_TFM_REQ_WEAK_KEY); | 1651 | kfree(full_alg_name); |
1608 | if (!(*key_tfm)) { | 1652 | if (IS_ERR(*key_tfm)) { |
1609 | rc = -EINVAL; | 1653 | rc = PTR_ERR(*key_tfm); |
1610 | printk(KERN_ERR "Unable to allocate crypto cipher with name " | 1654 | printk(KERN_ERR "Unable to allocate crypto cipher with name " |
1611 | "[%s]\n", cipher_name); | 1655 | "[%s]; rc = [%d]\n", cipher_name, rc); |
1612 | goto out; | ||
1613 | } | ||
1614 | if (key_size < crypto_tfm_alg_min_keysize(*tfm)) { | ||
1615 | rc = -EINVAL; | ||
1616 | printk(KERN_ERR "Request key size is [%Zd]; minimum key size " | ||
1617 | "supported by cipher [%s] is [%d]\n", key_size, | ||
1618 | cipher_name, crypto_tfm_alg_min_keysize(*tfm)); | ||
1619 | goto out; | ||
1620 | } | ||
1621 | if (key_size < crypto_tfm_alg_min_keysize(*key_tfm)) { | ||
1622 | rc = -EINVAL; | ||
1623 | printk(KERN_ERR "Request key size is [%Zd]; minimum key size " | ||
1624 | "supported by cipher [%s] is [%d]\n", key_size, | ||
1625 | cipher_name, crypto_tfm_alg_min_keysize(*key_tfm)); | ||
1626 | goto out; | 1656 | goto out; |
1627 | } | 1657 | } |
1628 | if (key_size > crypto_tfm_alg_max_keysize(*tfm)) { | 1658 | crypto_blkcipher_set_flags(*key_tfm, CRYPTO_TFM_REQ_WEAK_KEY); |
1629 | rc = -EINVAL; | 1659 | if (*key_size == 0) { |
1630 | printk(KERN_ERR "Request key size is [%Zd]; maximum key size " | 1660 | struct blkcipher_alg *alg = crypto_blkcipher_alg(*key_tfm); |
1631 | "supported by cipher [%s] is [%d]\n", key_size, | 1661 | |
1632 | cipher_name, crypto_tfm_alg_min_keysize(*tfm)); | 1662 | *key_size = alg->max_keysize; |
1633 | goto out; | ||
1634 | } | ||
1635 | if (key_size > crypto_tfm_alg_max_keysize(*key_tfm)) { | ||
1636 | rc = -EINVAL; | ||
1637 | printk(KERN_ERR "Request key size is [%Zd]; maximum key size " | ||
1638 | "supported by cipher [%s] is [%d]\n", key_size, | ||
1639 | cipher_name, crypto_tfm_alg_min_keysize(*key_tfm)); | ||
1640 | goto out; | ||
1641 | } | ||
1642 | get_random_bytes(dummy_key, key_size); | ||
1643 | rc = crypto_cipher_setkey(*tfm, dummy_key, key_size); | ||
1644 | if (rc) { | ||
1645 | printk(KERN_ERR "Error attempting to set key of size [%Zd] for " | ||
1646 | "cipher [%s]; rc = [%d]\n", key_size, cipher_name, rc); | ||
1647 | rc = -EINVAL; | ||
1648 | goto out; | ||
1649 | } | 1663 | } |
1650 | rc = crypto_cipher_setkey(*key_tfm, dummy_key, key_size); | 1664 | get_random_bytes(dummy_key, *key_size); |
1665 | rc = crypto_blkcipher_setkey(*key_tfm, dummy_key, *key_size); | ||
1651 | if (rc) { | 1666 | if (rc) { |
1652 | printk(KERN_ERR "Error attempting to set key of size [%Zd] for " | 1667 | printk(KERN_ERR "Error attempting to set key of size [%Zd] for " |
1653 | "cipher [%s]; rc = [%d]\n", key_size, cipher_name, rc); | 1668 | "cipher [%s]; rc = [%d]\n", *key_size, cipher_name, rc); |
1654 | rc = -EINVAL; | 1669 | rc = -EINVAL; |
1655 | goto out; | 1670 | goto out; |
1656 | } | 1671 | } |
diff --git a/fs/ecryptfs/dentry.c b/fs/ecryptfs/dentry.c index f0d2a433242b..52d1e36dc746 100644 --- a/fs/ecryptfs/dentry.c +++ b/fs/ecryptfs/dentry.c | |||
@@ -24,6 +24,7 @@ | |||
24 | 24 | ||
25 | #include <linux/dcache.h> | 25 | #include <linux/dcache.h> |
26 | #include <linux/namei.h> | 26 | #include <linux/namei.h> |
27 | #include <linux/mount.h> | ||
27 | #include "ecryptfs_kernel.h" | 28 | #include "ecryptfs_kernel.h" |
28 | 29 | ||
29 | /** | 30 | /** |
@@ -56,6 +57,12 @@ static int ecryptfs_d_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
56 | rc = lower_dentry->d_op->d_revalidate(lower_dentry, nd); | 57 | rc = lower_dentry->d_op->d_revalidate(lower_dentry, nd); |
57 | nd->dentry = dentry_save; | 58 | nd->dentry = dentry_save; |
58 | nd->mnt = vfsmount_save; | 59 | nd->mnt = vfsmount_save; |
60 | if (dentry->d_inode) { | ||
61 | struct inode *lower_inode = | ||
62 | ecryptfs_inode_to_lower(dentry->d_inode); | ||
63 | |||
64 | ecryptfs_copy_attr_all(dentry->d_inode, lower_inode); | ||
65 | } | ||
59 | out: | 66 | out: |
60 | return rc; | 67 | return rc; |
61 | } | 68 | } |
@@ -76,8 +83,13 @@ static void ecryptfs_d_release(struct dentry *dentry) | |||
76 | if (ecryptfs_dentry_to_private(dentry)) | 83 | if (ecryptfs_dentry_to_private(dentry)) |
77 | kmem_cache_free(ecryptfs_dentry_info_cache, | 84 | kmem_cache_free(ecryptfs_dentry_info_cache, |
78 | ecryptfs_dentry_to_private(dentry)); | 85 | ecryptfs_dentry_to_private(dentry)); |
79 | if (lower_dentry) | 86 | if (lower_dentry) { |
87 | struct vfsmount *lower_mnt = | ||
88 | ecryptfs_dentry_to_lower_mnt(dentry); | ||
89 | |||
90 | mntput(lower_mnt); | ||
80 | dput(lower_dentry); | 91 | dput(lower_dentry); |
92 | } | ||
81 | return; | 93 | return; |
82 | } | 94 | } |
83 | 95 | ||
diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h index 872c9958531a..f992533d1692 100644 --- a/fs/ecryptfs/ecryptfs_kernel.h +++ b/fs/ecryptfs/ecryptfs_kernel.h | |||
@@ -175,6 +175,7 @@ ecryptfs_get_key_payload_data(struct key *key) | |||
175 | #define ECRYPTFS_DEFAULT_CIPHER "aes" | 175 | #define ECRYPTFS_DEFAULT_CIPHER "aes" |
176 | #define ECRYPTFS_DEFAULT_KEY_BYTES 16 | 176 | #define ECRYPTFS_DEFAULT_KEY_BYTES 16 |
177 | #define ECRYPTFS_DEFAULT_CHAINING_MODE CRYPTO_TFM_MODE_CBC | 177 | #define ECRYPTFS_DEFAULT_CHAINING_MODE CRYPTO_TFM_MODE_CBC |
178 | #define ECRYPTFS_DEFAULT_HASH "md5" | ||
178 | #define ECRYPTFS_TAG_3_PACKET_TYPE 0x8C | 179 | #define ECRYPTFS_TAG_3_PACKET_TYPE 0x8C |
179 | #define ECRYPTFS_TAG_11_PACKET_TYPE 0xED | 180 | #define ECRYPTFS_TAG_11_PACKET_TYPE 0xED |
180 | #define MD5_DIGEST_SIZE 16 | 181 | #define MD5_DIGEST_SIZE 16 |
@@ -204,15 +205,15 @@ struct ecryptfs_crypt_stat { | |||
204 | size_t extent_shift; | 205 | size_t extent_shift; |
205 | unsigned int extent_mask; | 206 | unsigned int extent_mask; |
206 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat; | 207 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat; |
207 | struct crypto_tfm *tfm; | 208 | struct crypto_blkcipher *tfm; |
208 | struct crypto_tfm *md5_tfm; /* Crypto context for generating | 209 | struct crypto_hash *hash_tfm; /* Crypto context for generating |
209 | * the initialization vectors */ | 210 | * the initialization vectors */ |
210 | unsigned char cipher[ECRYPTFS_MAX_CIPHER_NAME_SIZE]; | 211 | unsigned char cipher[ECRYPTFS_MAX_CIPHER_NAME_SIZE]; |
211 | unsigned char key[ECRYPTFS_MAX_KEY_BYTES]; | 212 | unsigned char key[ECRYPTFS_MAX_KEY_BYTES]; |
212 | unsigned char root_iv[ECRYPTFS_MAX_IV_BYTES]; | 213 | unsigned char root_iv[ECRYPTFS_MAX_IV_BYTES]; |
213 | unsigned char keysigs[ECRYPTFS_MAX_NUM_KEYSIGS][ECRYPTFS_SIG_SIZE_HEX]; | 214 | unsigned char keysigs[ECRYPTFS_MAX_NUM_KEYSIGS][ECRYPTFS_SIG_SIZE_HEX]; |
214 | struct mutex cs_tfm_mutex; | 215 | struct mutex cs_tfm_mutex; |
215 | struct mutex cs_md5_tfm_mutex; | 216 | struct mutex cs_hash_tfm_mutex; |
216 | struct mutex cs_mutex; | 217 | struct mutex cs_mutex; |
217 | }; | 218 | }; |
218 | 219 | ||
@@ -244,7 +245,7 @@ struct ecryptfs_mount_crypt_stat { | |||
244 | struct ecryptfs_auth_tok *global_auth_tok; | 245 | struct ecryptfs_auth_tok *global_auth_tok; |
245 | struct key *global_auth_tok_key; | 246 | struct key *global_auth_tok_key; |
246 | size_t global_default_cipher_key_size; | 247 | size_t global_default_cipher_key_size; |
247 | struct crypto_tfm *global_key_tfm; | 248 | struct crypto_blkcipher *global_key_tfm; |
248 | struct mutex global_key_tfm_mutex; | 249 | struct mutex global_key_tfm_mutex; |
249 | unsigned char global_default_cipher_name[ECRYPTFS_MAX_CIPHER_NAME_SIZE | 250 | unsigned char global_default_cipher_name[ECRYPTFS_MAX_CIPHER_NAME_SIZE |
250 | + 1]; | 251 | + 1]; |
@@ -425,6 +426,9 @@ void ecryptfs_destruct_crypt_stat(struct ecryptfs_crypt_stat *crypt_stat); | |||
425 | void ecryptfs_destruct_mount_crypt_stat( | 426 | void ecryptfs_destruct_mount_crypt_stat( |
426 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat); | 427 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat); |
427 | int ecryptfs_init_crypt_ctx(struct ecryptfs_crypt_stat *crypt_stat); | 428 | int ecryptfs_init_crypt_ctx(struct ecryptfs_crypt_stat *crypt_stat); |
429 | int ecryptfs_crypto_api_algify_cipher_name(char **algified_name, | ||
430 | char *cipher_name, | ||
431 | char *chaining_modifier); | ||
428 | int ecryptfs_write_inode_size_to_header(struct file *lower_file, | 432 | int ecryptfs_write_inode_size_to_header(struct file *lower_file, |
429 | struct inode *lower_inode, | 433 | struct inode *lower_inode, |
430 | struct inode *inode); | 434 | struct inode *inode); |
@@ -473,10 +477,14 @@ ecryptfs_parse_packet_set(struct ecryptfs_crypt_stat *crypt_stat, | |||
473 | unsigned char *src, struct dentry *ecryptfs_dentry); | 477 | unsigned char *src, struct dentry *ecryptfs_dentry); |
474 | int ecryptfs_truncate(struct dentry *dentry, loff_t new_length); | 478 | int ecryptfs_truncate(struct dentry *dentry, loff_t new_length); |
475 | int | 479 | int |
476 | ecryptfs_process_cipher(struct crypto_tfm **tfm, struct crypto_tfm **key_tfm, | 480 | ecryptfs_process_cipher(struct crypto_blkcipher **key_tfm, char *cipher_name, |
477 | char *cipher_name, size_t key_size); | 481 | size_t *key_size); |
478 | int ecryptfs_inode_test(struct inode *inode, void *candidate_lower_inode); | 482 | int ecryptfs_inode_test(struct inode *inode, void *candidate_lower_inode); |
479 | int ecryptfs_inode_set(struct inode *inode, void *lower_inode); | 483 | int ecryptfs_inode_set(struct inode *inode, void *lower_inode); |
480 | void ecryptfs_init_inode(struct inode *inode, struct inode *lower_inode); | 484 | void ecryptfs_init_inode(struct inode *inode, struct inode *lower_inode); |
485 | int ecryptfs_open_lower_file(struct file **lower_file, | ||
486 | struct dentry *lower_dentry, | ||
487 | struct vfsmount *lower_mnt, int flags); | ||
488 | int ecryptfs_close_lower_file(struct file *lower_file); | ||
481 | 489 | ||
482 | #endif /* #ifndef ECRYPTFS_KERNEL_H */ | 490 | #endif /* #ifndef ECRYPTFS_KERNEL_H */ |
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index c8550c9f9cd2..a92ef05eff8f 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c | |||
@@ -198,6 +198,33 @@ retry: | |||
198 | 198 | ||
199 | struct kmem_cache *ecryptfs_file_info_cache; | 199 | struct kmem_cache *ecryptfs_file_info_cache; |
200 | 200 | ||
201 | int ecryptfs_open_lower_file(struct file **lower_file, | ||
202 | struct dentry *lower_dentry, | ||
203 | struct vfsmount *lower_mnt, int flags) | ||
204 | { | ||
205 | int rc = 0; | ||
206 | |||
207 | dget(lower_dentry); | ||
208 | mntget(lower_mnt); | ||
209 | *lower_file = dentry_open(lower_dentry, lower_mnt, flags); | ||
210 | if (IS_ERR(*lower_file)) { | ||
211 | printk(KERN_ERR "Error opening lower file for lower_dentry " | ||
212 | "[0x%p], lower_mnt [0x%p], and flags [0x%x]\n", | ||
213 | lower_dentry, lower_mnt, flags); | ||
214 | rc = PTR_ERR(*lower_file); | ||
215 | *lower_file = NULL; | ||
216 | goto out; | ||
217 | } | ||
218 | out: | ||
219 | return rc; | ||
220 | } | ||
221 | |||
222 | int ecryptfs_close_lower_file(struct file *lower_file) | ||
223 | { | ||
224 | fput(lower_file); | ||
225 | return 0; | ||
226 | } | ||
227 | |||
201 | /** | 228 | /** |
202 | * ecryptfs_open | 229 | * ecryptfs_open |
203 | * @inode: inode speciying file to open | 230 | * @inode: inode speciying file to open |
@@ -244,19 +271,15 @@ static int ecryptfs_open(struct inode *inode, struct file *file) | |||
244 | ECRYPTFS_SET_FLAG(crypt_stat->flags, ECRYPTFS_ENCRYPTED); | 271 | ECRYPTFS_SET_FLAG(crypt_stat->flags, ECRYPTFS_ENCRYPTED); |
245 | } | 272 | } |
246 | mutex_unlock(&crypt_stat->cs_mutex); | 273 | mutex_unlock(&crypt_stat->cs_mutex); |
247 | /* This mntget & dget is undone via fput when the file is released */ | ||
248 | dget(lower_dentry); | ||
249 | lower_flags = file->f_flags; | 274 | lower_flags = file->f_flags; |
250 | if ((lower_flags & O_ACCMODE) == O_WRONLY) | 275 | if ((lower_flags & O_ACCMODE) == O_WRONLY) |
251 | lower_flags = (lower_flags & O_ACCMODE) | O_RDWR; | 276 | lower_flags = (lower_flags & O_ACCMODE) | O_RDWR; |
252 | if (file->f_flags & O_APPEND) | 277 | if (file->f_flags & O_APPEND) |
253 | lower_flags &= ~O_APPEND; | 278 | lower_flags &= ~O_APPEND; |
254 | lower_mnt = ecryptfs_dentry_to_lower_mnt(ecryptfs_dentry); | 279 | lower_mnt = ecryptfs_dentry_to_lower_mnt(ecryptfs_dentry); |
255 | mntget(lower_mnt); | ||
256 | /* Corresponding fput() in ecryptfs_release() */ | 280 | /* Corresponding fput() in ecryptfs_release() */ |
257 | lower_file = dentry_open(lower_dentry, lower_mnt, lower_flags); | 281 | if ((rc = ecryptfs_open_lower_file(&lower_file, lower_dentry, lower_mnt, |
258 | if (IS_ERR(lower_file)) { | 282 | lower_flags))) { |
259 | rc = PTR_ERR(lower_file); | ||
260 | ecryptfs_printk(KERN_ERR, "Error opening lower file\n"); | 283 | ecryptfs_printk(KERN_ERR, "Error opening lower file\n"); |
261 | goto out_puts; | 284 | goto out_puts; |
262 | } | 285 | } |
@@ -341,11 +364,16 @@ static int ecryptfs_release(struct inode *inode, struct file *file) | |||
341 | struct file *lower_file = ecryptfs_file_to_lower(file); | 364 | struct file *lower_file = ecryptfs_file_to_lower(file); |
342 | struct ecryptfs_file_info *file_info = ecryptfs_file_to_private(file); | 365 | struct ecryptfs_file_info *file_info = ecryptfs_file_to_private(file); |
343 | struct inode *lower_inode = ecryptfs_inode_to_lower(inode); | 366 | struct inode *lower_inode = ecryptfs_inode_to_lower(inode); |
367 | int rc; | ||
344 | 368 | ||
345 | fput(lower_file); | 369 | if ((rc = ecryptfs_close_lower_file(lower_file))) { |
370 | printk(KERN_ERR "Error closing lower_file\n"); | ||
371 | goto out; | ||
372 | } | ||
346 | inode->i_blocks = lower_inode->i_blocks; | 373 | inode->i_blocks = lower_inode->i_blocks; |
347 | kmem_cache_free(ecryptfs_file_info_cache, file_info); | 374 | kmem_cache_free(ecryptfs_file_info_cache, file_info); |
348 | return 0; | 375 | out: |
376 | return rc; | ||
349 | } | 377 | } |
350 | 378 | ||
351 | static int | 379 | static int |
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index efdd2b7b62d7..dfcc68484f47 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
@@ -231,7 +231,6 @@ static int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry) | |||
231 | int lower_flags; | 231 | int lower_flags; |
232 | struct ecryptfs_crypt_stat *crypt_stat; | 232 | struct ecryptfs_crypt_stat *crypt_stat; |
233 | struct dentry *lower_dentry; | 233 | struct dentry *lower_dentry; |
234 | struct dentry *tlower_dentry = NULL; | ||
235 | struct file *lower_file; | 234 | struct file *lower_file; |
236 | struct inode *inode, *lower_inode; | 235 | struct inode *inode, *lower_inode; |
237 | struct vfsmount *lower_mnt; | 236 | struct vfsmount *lower_mnt; |
@@ -241,30 +240,19 @@ static int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry) | |||
241 | lower_dentry->d_name.name); | 240 | lower_dentry->d_name.name); |
242 | inode = ecryptfs_dentry->d_inode; | 241 | inode = ecryptfs_dentry->d_inode; |
243 | crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat; | 242 | crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat; |
244 | tlower_dentry = dget(lower_dentry); | ||
245 | if (!tlower_dentry) { | ||
246 | rc = -ENOMEM; | ||
247 | ecryptfs_printk(KERN_ERR, "Error dget'ing lower_dentry\n"); | ||
248 | goto out; | ||
249 | } | ||
250 | lower_flags = ((O_CREAT | O_WRONLY | O_TRUNC) & O_ACCMODE) | O_RDWR; | 243 | lower_flags = ((O_CREAT | O_WRONLY | O_TRUNC) & O_ACCMODE) | O_RDWR; |
251 | #if BITS_PER_LONG != 32 | 244 | #if BITS_PER_LONG != 32 |
252 | lower_flags |= O_LARGEFILE; | 245 | lower_flags |= O_LARGEFILE; |
253 | #endif | 246 | #endif |
254 | lower_mnt = ecryptfs_dentry_to_lower_mnt(ecryptfs_dentry); | 247 | lower_mnt = ecryptfs_dentry_to_lower_mnt(ecryptfs_dentry); |
255 | mntget(lower_mnt); | ||
256 | /* Corresponding fput() at end of this function */ | 248 | /* Corresponding fput() at end of this function */ |
257 | lower_file = dentry_open(tlower_dentry, lower_mnt, lower_flags); | 249 | if ((rc = ecryptfs_open_lower_file(&lower_file, lower_dentry, lower_mnt, |
258 | if (IS_ERR(lower_file)) { | 250 | lower_flags))) { |
259 | rc = PTR_ERR(lower_file); | ||
260 | ecryptfs_printk(KERN_ERR, | 251 | ecryptfs_printk(KERN_ERR, |
261 | "Error opening dentry; rc = [%i]\n", rc); | 252 | "Error opening dentry; rc = [%i]\n", rc); |
262 | goto out; | 253 | goto out; |
263 | } | 254 | } |
264 | /* fput(lower_file) should handle the puts if we do this */ | 255 | lower_inode = lower_dentry->d_inode; |
265 | lower_file->f_dentry = tlower_dentry; | ||
266 | lower_file->f_vfsmnt = lower_mnt; | ||
267 | lower_inode = tlower_dentry->d_inode; | ||
268 | if (S_ISDIR(ecryptfs_dentry->d_inode->i_mode)) { | 256 | if (S_ISDIR(ecryptfs_dentry->d_inode->i_mode)) { |
269 | ecryptfs_printk(KERN_DEBUG, "This is a directory\n"); | 257 | ecryptfs_printk(KERN_DEBUG, "This is a directory\n"); |
270 | ECRYPTFS_CLEAR_FLAG(crypt_stat->flags, ECRYPTFS_ENCRYPTED); | 258 | ECRYPTFS_CLEAR_FLAG(crypt_stat->flags, ECRYPTFS_ENCRYPTED); |
@@ -285,7 +273,8 @@ static int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry) | |||
285 | } | 273 | } |
286 | rc = grow_file(ecryptfs_dentry, lower_file, inode, lower_inode); | 274 | rc = grow_file(ecryptfs_dentry, lower_file, inode, lower_inode); |
287 | out_fput: | 275 | out_fput: |
288 | fput(lower_file); | 276 | if ((rc = ecryptfs_close_lower_file(lower_file))) |
277 | printk(KERN_ERR "Error closing lower_file\n"); | ||
289 | out: | 278 | out: |
290 | return rc; | 279 | return rc; |
291 | } | 280 | } |
@@ -336,7 +325,6 @@ static struct dentry *ecryptfs_lookup(struct inode *dir, struct dentry *dentry, | |||
336 | struct dentry *lower_dir_dentry; | 325 | struct dentry *lower_dir_dentry; |
337 | struct dentry *lower_dentry; | 326 | struct dentry *lower_dentry; |
338 | struct vfsmount *lower_mnt; | 327 | struct vfsmount *lower_mnt; |
339 | struct dentry *tlower_dentry = NULL; | ||
340 | char *encoded_name; | 328 | char *encoded_name; |
341 | unsigned int encoded_namelen; | 329 | unsigned int encoded_namelen; |
342 | struct ecryptfs_crypt_stat *crypt_stat = NULL; | 330 | struct ecryptfs_crypt_stat *crypt_stat = NULL; |
@@ -347,27 +335,32 @@ static struct dentry *ecryptfs_lookup(struct inode *dir, struct dentry *dentry, | |||
347 | lower_dir_dentry = ecryptfs_dentry_to_lower(dentry->d_parent); | 335 | lower_dir_dentry = ecryptfs_dentry_to_lower(dentry->d_parent); |
348 | dentry->d_op = &ecryptfs_dops; | 336 | dentry->d_op = &ecryptfs_dops; |
349 | if ((dentry->d_name.len == 1 && !strcmp(dentry->d_name.name, ".")) | 337 | if ((dentry->d_name.len == 1 && !strcmp(dentry->d_name.name, ".")) |
350 | || (dentry->d_name.len == 2 && !strcmp(dentry->d_name.name, ".."))) | 338 | || (dentry->d_name.len == 2 |
351 | goto out_drop; | 339 | && !strcmp(dentry->d_name.name, ".."))) { |
340 | d_drop(dentry); | ||
341 | goto out; | ||
342 | } | ||
352 | encoded_namelen = ecryptfs_encode_filename(crypt_stat, | 343 | encoded_namelen = ecryptfs_encode_filename(crypt_stat, |
353 | dentry->d_name.name, | 344 | dentry->d_name.name, |
354 | dentry->d_name.len, | 345 | dentry->d_name.len, |
355 | &encoded_name); | 346 | &encoded_name); |
356 | if (encoded_namelen < 0) { | 347 | if (encoded_namelen < 0) { |
357 | rc = encoded_namelen; | 348 | rc = encoded_namelen; |
358 | goto out_drop; | 349 | d_drop(dentry); |
350 | goto out; | ||
359 | } | 351 | } |
360 | ecryptfs_printk(KERN_DEBUG, "encoded_name = [%s]; encoded_namelen " | 352 | ecryptfs_printk(KERN_DEBUG, "encoded_name = [%s]; encoded_namelen " |
361 | "= [%d]\n", encoded_name, encoded_namelen); | 353 | "= [%d]\n", encoded_name, encoded_namelen); |
362 | lower_dentry = lookup_one_len(encoded_name, lower_dir_dentry, | 354 | lower_dentry = lookup_one_len(encoded_name, lower_dir_dentry, |
363 | encoded_namelen - 1); | 355 | encoded_namelen - 1); |
364 | kfree(encoded_name); | 356 | kfree(encoded_name); |
365 | lower_mnt = mntget(ecryptfs_dentry_to_lower_mnt(dentry->d_parent)); | ||
366 | if (IS_ERR(lower_dentry)) { | 357 | if (IS_ERR(lower_dentry)) { |
367 | ecryptfs_printk(KERN_ERR, "ERR from lower_dentry\n"); | 358 | ecryptfs_printk(KERN_ERR, "ERR from lower_dentry\n"); |
368 | rc = PTR_ERR(lower_dentry); | 359 | rc = PTR_ERR(lower_dentry); |
369 | goto out_drop; | 360 | d_drop(dentry); |
361 | goto out; | ||
370 | } | 362 | } |
363 | lower_mnt = mntget(ecryptfs_dentry_to_lower_mnt(dentry->d_parent)); | ||
371 | ecryptfs_printk(KERN_DEBUG, "lower_dentry = [%p]; lower_dentry->" | 364 | ecryptfs_printk(KERN_DEBUG, "lower_dentry = [%p]; lower_dentry->" |
372 | "d_name.name = [%s]\n", lower_dentry, | 365 | "d_name.name = [%s]\n", lower_dentry, |
373 | lower_dentry->d_name.name); | 366 | lower_dentry->d_name.name); |
@@ -408,12 +401,6 @@ static struct dentry *ecryptfs_lookup(struct inode *dir, struct dentry *dentry, | |||
408 | "as we *think* we are about to unlink\n"); | 401 | "as we *think* we are about to unlink\n"); |
409 | goto out; | 402 | goto out; |
410 | } | 403 | } |
411 | tlower_dentry = dget(lower_dentry); | ||
412 | if (!tlower_dentry || IS_ERR(tlower_dentry)) { | ||
413 | rc = -ENOMEM; | ||
414 | ecryptfs_printk(KERN_ERR, "Cannot dget lower_dentry\n"); | ||
415 | goto out_dput; | ||
416 | } | ||
417 | /* Released in this function */ | 404 | /* Released in this function */ |
418 | page_virt = | 405 | page_virt = |
419 | (char *)kmem_cache_alloc(ecryptfs_header_cache_2, | 406 | (char *)kmem_cache_alloc(ecryptfs_header_cache_2, |
@@ -425,7 +412,7 @@ static struct dentry *ecryptfs_lookup(struct inode *dir, struct dentry *dentry, | |||
425 | goto out_dput; | 412 | goto out_dput; |
426 | } | 413 | } |
427 | memset(page_virt, 0, PAGE_CACHE_SIZE); | 414 | memset(page_virt, 0, PAGE_CACHE_SIZE); |
428 | rc = ecryptfs_read_header_region(page_virt, tlower_dentry, nd->mnt); | 415 | rc = ecryptfs_read_header_region(page_virt, lower_dentry, nd->mnt); |
429 | crypt_stat = &ecryptfs_inode_to_private(dentry->d_inode)->crypt_stat; | 416 | crypt_stat = &ecryptfs_inode_to_private(dentry->d_inode)->crypt_stat; |
430 | if (!ECRYPTFS_CHECK_FLAG(crypt_stat->flags, ECRYPTFS_POLICY_APPLIED)) | 417 | if (!ECRYPTFS_CHECK_FLAG(crypt_stat->flags, ECRYPTFS_POLICY_APPLIED)) |
431 | ecryptfs_set_default_sizes(crypt_stat); | 418 | ecryptfs_set_default_sizes(crypt_stat); |
@@ -448,9 +435,6 @@ static struct dentry *ecryptfs_lookup(struct inode *dir, struct dentry *dentry, | |||
448 | 435 | ||
449 | out_dput: | 436 | out_dput: |
450 | dput(lower_dentry); | 437 | dput(lower_dentry); |
451 | if (tlower_dentry) | ||
452 | dput(tlower_dentry); | ||
453 | out_drop: | ||
454 | d_drop(dentry); | 438 | d_drop(dentry); |
455 | out: | 439 | out: |
456 | return ERR_PTR(rc); | 440 | return ERR_PTR(rc); |
@@ -486,8 +470,9 @@ out_lock: | |||
486 | unlock_dir(lower_dir_dentry); | 470 | unlock_dir(lower_dir_dentry); |
487 | dput(lower_new_dentry); | 471 | dput(lower_new_dentry); |
488 | dput(lower_old_dentry); | 472 | dput(lower_old_dentry); |
489 | if (!new_dentry->d_inode) | 473 | d_drop(lower_old_dentry); |
490 | d_drop(new_dentry); | 474 | d_drop(new_dentry); |
475 | d_drop(old_dentry); | ||
491 | return rc; | 476 | return rc; |
492 | } | 477 | } |
493 | 478 | ||
@@ -500,7 +485,7 @@ static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry) | |||
500 | lock_parent(lower_dentry); | 485 | lock_parent(lower_dentry); |
501 | rc = vfs_unlink(lower_dir_inode, lower_dentry); | 486 | rc = vfs_unlink(lower_dir_inode, lower_dentry); |
502 | if (rc) { | 487 | if (rc) { |
503 | ecryptfs_printk(KERN_ERR, "Error in vfs_unlink\n"); | 488 | printk(KERN_ERR "Error in vfs_unlink; rc = [%d]\n", rc); |
504 | goto out_unlock; | 489 | goto out_unlock; |
505 | } | 490 | } |
506 | ecryptfs_copy_attr_times(dir, lower_dir_inode); | 491 | ecryptfs_copy_attr_times(dir, lower_dir_inode); |
@@ -576,41 +561,24 @@ out: | |||
576 | 561 | ||
577 | static int ecryptfs_rmdir(struct inode *dir, struct dentry *dentry) | 562 | static int ecryptfs_rmdir(struct inode *dir, struct dentry *dentry) |
578 | { | 563 | { |
579 | int rc = 0; | ||
580 | struct dentry *tdentry = NULL; | ||
581 | struct dentry *lower_dentry; | 564 | struct dentry *lower_dentry; |
582 | struct dentry *tlower_dentry = NULL; | ||
583 | struct dentry *lower_dir_dentry; | 565 | struct dentry *lower_dir_dentry; |
566 | int rc; | ||
584 | 567 | ||
585 | lower_dentry = ecryptfs_dentry_to_lower(dentry); | 568 | lower_dentry = ecryptfs_dentry_to_lower(dentry); |
586 | if (!(tdentry = dget(dentry))) { | 569 | dget(dentry); |
587 | rc = -EINVAL; | ||
588 | ecryptfs_printk(KERN_ERR, "Error dget'ing dentry [%p]\n", | ||
589 | dentry); | ||
590 | goto out; | ||
591 | } | ||
592 | lower_dir_dentry = lock_parent(lower_dentry); | 570 | lower_dir_dentry = lock_parent(lower_dentry); |
593 | if (!(tlower_dentry = dget(lower_dentry))) { | 571 | dget(lower_dentry); |
594 | rc = -EINVAL; | ||
595 | ecryptfs_printk(KERN_ERR, "Error dget'ing lower_dentry " | ||
596 | "[%p]\n", lower_dentry); | ||
597 | goto out; | ||
598 | } | ||
599 | rc = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry); | 572 | rc = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry); |
600 | if (!rc) { | 573 | dput(lower_dentry); |
601 | d_delete(tlower_dentry); | 574 | if (!rc) |
602 | tlower_dentry = NULL; | 575 | d_delete(lower_dentry); |
603 | } | ||
604 | ecryptfs_copy_attr_times(dir, lower_dir_dentry->d_inode); | 576 | ecryptfs_copy_attr_times(dir, lower_dir_dentry->d_inode); |
605 | dir->i_nlink = lower_dir_dentry->d_inode->i_nlink; | 577 | dir->i_nlink = lower_dir_dentry->d_inode->i_nlink; |
606 | unlock_dir(lower_dir_dentry); | 578 | unlock_dir(lower_dir_dentry); |
607 | if (!rc) | 579 | if (!rc) |
608 | d_drop(dentry); | 580 | d_drop(dentry); |
609 | out: | 581 | dput(dentry); |
610 | if (tdentry) | ||
611 | dput(tdentry); | ||
612 | if (tlower_dentry) | ||
613 | dput(tlower_dentry); | ||
614 | return rc; | 582 | return rc; |
615 | } | 583 | } |
616 | 584 | ||
@@ -663,6 +631,8 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
663 | ecryptfs_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode); | 631 | ecryptfs_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode); |
664 | out_lock: | 632 | out_lock: |
665 | unlock_rename(lower_old_dir_dentry, lower_new_dir_dentry); | 633 | unlock_rename(lower_old_dir_dentry, lower_new_dir_dentry); |
634 | dput(lower_new_dentry->d_parent); | ||
635 | dput(lower_old_dentry->d_parent); | ||
666 | dput(lower_new_dentry); | 636 | dput(lower_new_dentry); |
667 | dput(lower_old_dentry); | 637 | dput(lower_old_dentry); |
668 | return rc; | 638 | return rc; |
@@ -832,12 +802,11 @@ int ecryptfs_truncate(struct dentry *dentry, loff_t new_length) | |||
832 | } | 802 | } |
833 | lower_dentry = ecryptfs_dentry_to_lower(dentry); | 803 | lower_dentry = ecryptfs_dentry_to_lower(dentry); |
834 | /* This dget & mntget is released through fput at out_fput: */ | 804 | /* This dget & mntget is released through fput at out_fput: */ |
835 | dget(lower_dentry); | ||
836 | lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry); | 805 | lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry); |
837 | mntget(lower_mnt); | 806 | if ((rc = ecryptfs_open_lower_file(&lower_file, lower_dentry, lower_mnt, |
838 | lower_file = dentry_open(lower_dentry, lower_mnt, O_RDWR); | 807 | O_RDWR))) { |
839 | if (unlikely(IS_ERR(lower_file))) { | 808 | ecryptfs_printk(KERN_ERR, |
840 | rc = PTR_ERR(lower_file); | 809 | "Error opening dentry; rc = [%i]\n", rc); |
841 | goto out_free; | 810 | goto out_free; |
842 | } | 811 | } |
843 | ecryptfs_set_file_lower(&fake_ecryptfs_file, lower_file); | 812 | ecryptfs_set_file_lower(&fake_ecryptfs_file, lower_file); |
@@ -879,7 +848,8 @@ int ecryptfs_truncate(struct dentry *dentry, loff_t new_length) | |||
879 | = CURRENT_TIME; | 848 | = CURRENT_TIME; |
880 | mark_inode_dirty_sync(inode); | 849 | mark_inode_dirty_sync(inode); |
881 | out_fput: | 850 | out_fput: |
882 | fput(lower_file); | 851 | if ((rc = ecryptfs_close_lower_file(lower_file))) |
852 | printk(KERN_ERR "Error closing lower_file\n"); | ||
883 | out_free: | 853 | out_free: |
884 | if (ecryptfs_file_to_private(&fake_ecryptfs_file)) | 854 | if (ecryptfs_file_to_private(&fake_ecryptfs_file)) |
885 | kmem_cache_free(ecryptfs_file_info_cache, | 855 | kmem_cache_free(ecryptfs_file_info_cache, |
diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index ba454785a0c5..c3746f56d162 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c | |||
@@ -458,14 +458,16 @@ out: | |||
458 | static int decrypt_session_key(struct ecryptfs_auth_tok *auth_tok, | 458 | static int decrypt_session_key(struct ecryptfs_auth_tok *auth_tok, |
459 | struct ecryptfs_crypt_stat *crypt_stat) | 459 | struct ecryptfs_crypt_stat *crypt_stat) |
460 | { | 460 | { |
461 | int rc = 0; | ||
462 | struct ecryptfs_password *password_s_ptr; | 461 | struct ecryptfs_password *password_s_ptr; |
463 | struct crypto_tfm *tfm = NULL; | ||
464 | struct scatterlist src_sg[2], dst_sg[2]; | 462 | struct scatterlist src_sg[2], dst_sg[2]; |
465 | struct mutex *tfm_mutex = NULL; | 463 | struct mutex *tfm_mutex = NULL; |
466 | /* TODO: Use virt_to_scatterlist for these */ | 464 | /* TODO: Use virt_to_scatterlist for these */ |
467 | char *encrypted_session_key; | 465 | char *encrypted_session_key; |
468 | char *session_key; | 466 | char *session_key; |
467 | struct blkcipher_desc desc = { | ||
468 | .flags = CRYPTO_TFM_REQ_MAY_SLEEP | ||
469 | }; | ||
470 | int rc = 0; | ||
469 | 471 | ||
470 | password_s_ptr = &auth_tok->token.password; | 472 | password_s_ptr = &auth_tok->token.password; |
471 | if (ECRYPTFS_CHECK_FLAG(password_s_ptr->flags, | 473 | if (ECRYPTFS_CHECK_FLAG(password_s_ptr->flags, |
@@ -482,30 +484,37 @@ static int decrypt_session_key(struct ecryptfs_auth_tok *auth_tok, | |||
482 | if (!strcmp(crypt_stat->cipher, | 484 | if (!strcmp(crypt_stat->cipher, |
483 | crypt_stat->mount_crypt_stat->global_default_cipher_name) | 485 | crypt_stat->mount_crypt_stat->global_default_cipher_name) |
484 | && crypt_stat->mount_crypt_stat->global_key_tfm) { | 486 | && crypt_stat->mount_crypt_stat->global_key_tfm) { |
485 | tfm = crypt_stat->mount_crypt_stat->global_key_tfm; | 487 | desc.tfm = crypt_stat->mount_crypt_stat->global_key_tfm; |
486 | tfm_mutex = &crypt_stat->mount_crypt_stat->global_key_tfm_mutex; | 488 | tfm_mutex = &crypt_stat->mount_crypt_stat->global_key_tfm_mutex; |
487 | } else { | 489 | } else { |
488 | tfm = crypto_alloc_tfm(crypt_stat->cipher, | 490 | char *full_alg_name; |
489 | CRYPTO_TFM_REQ_WEAK_KEY); | 491 | |
490 | if (!tfm) { | 492 | rc = ecryptfs_crypto_api_algify_cipher_name(&full_alg_name, |
491 | printk(KERN_ERR "Error allocating crypto context\n"); | 493 | crypt_stat->cipher, |
492 | rc = -ENOMEM; | 494 | "ecb"); |
495 | if (rc) | ||
496 | goto out; | ||
497 | desc.tfm = crypto_alloc_blkcipher(full_alg_name, 0, | ||
498 | CRYPTO_ALG_ASYNC); | ||
499 | kfree(full_alg_name); | ||
500 | if (IS_ERR(desc.tfm)) { | ||
501 | rc = PTR_ERR(desc.tfm); | ||
502 | printk(KERN_ERR "Error allocating crypto context; " | ||
503 | "rc = [%d]\n", rc); | ||
493 | goto out; | 504 | goto out; |
494 | } | 505 | } |
495 | } | 506 | crypto_blkcipher_set_flags(desc.tfm, CRYPTO_TFM_REQ_WEAK_KEY); |
496 | if (password_s_ptr->session_key_encryption_key_bytes | ||
497 | < crypto_tfm_alg_min_keysize(tfm)) { | ||
498 | printk(KERN_WARNING "Session key encryption key is [%d] bytes; " | ||
499 | "minimum keysize for selected cipher is [%d] bytes.\n", | ||
500 | password_s_ptr->session_key_encryption_key_bytes, | ||
501 | crypto_tfm_alg_min_keysize(tfm)); | ||
502 | rc = -EINVAL; | ||
503 | goto out; | ||
504 | } | 507 | } |
505 | if (tfm_mutex) | 508 | if (tfm_mutex) |
506 | mutex_lock(tfm_mutex); | 509 | mutex_lock(tfm_mutex); |
507 | crypto_cipher_setkey(tfm, password_s_ptr->session_key_encryption_key, | 510 | rc = crypto_blkcipher_setkey(desc.tfm, |
508 | crypt_stat->key_size); | 511 | password_s_ptr->session_key_encryption_key, |
512 | crypt_stat->key_size); | ||
513 | if (rc < 0) { | ||
514 | printk(KERN_ERR "Error setting key for crypto context\n"); | ||
515 | rc = -EINVAL; | ||
516 | goto out_free_tfm; | ||
517 | } | ||
509 | /* TODO: virt_to_scatterlist */ | 518 | /* TODO: virt_to_scatterlist */ |
510 | encrypted_session_key = (char *)__get_free_page(GFP_KERNEL); | 519 | encrypted_session_key = (char *)__get_free_page(GFP_KERNEL); |
511 | if (!encrypted_session_key) { | 520 | if (!encrypted_session_key) { |
@@ -531,9 +540,12 @@ static int decrypt_session_key(struct ecryptfs_auth_tok *auth_tok, | |||
531 | auth_tok->session_key.decrypted_key_size = | 540 | auth_tok->session_key.decrypted_key_size = |
532 | auth_tok->session_key.encrypted_key_size; | 541 | auth_tok->session_key.encrypted_key_size; |
533 | dst_sg[0].length = auth_tok->session_key.encrypted_key_size; | 542 | dst_sg[0].length = auth_tok->session_key.encrypted_key_size; |
534 | /* TODO: Handle error condition */ | 543 | rc = crypto_blkcipher_decrypt(&desc, dst_sg, src_sg, |
535 | crypto_cipher_decrypt(tfm, dst_sg, src_sg, | 544 | auth_tok->session_key.encrypted_key_size); |
536 | auth_tok->session_key.encrypted_key_size); | 545 | if (rc) { |
546 | printk(KERN_ERR "Error decrypting; rc = [%d]\n", rc); | ||
547 | goto out_free_memory; | ||
548 | } | ||
537 | auth_tok->session_key.decrypted_key_size = | 549 | auth_tok->session_key.decrypted_key_size = |
538 | auth_tok->session_key.encrypted_key_size; | 550 | auth_tok->session_key.encrypted_key_size; |
539 | memcpy(auth_tok->session_key.decrypted_key, session_key, | 551 | memcpy(auth_tok->session_key.decrypted_key, session_key, |
@@ -546,6 +558,7 @@ static int decrypt_session_key(struct ecryptfs_auth_tok *auth_tok, | |||
546 | if (ecryptfs_verbosity > 0) | 558 | if (ecryptfs_verbosity > 0) |
547 | ecryptfs_dump_hex(crypt_stat->key, | 559 | ecryptfs_dump_hex(crypt_stat->key, |
548 | crypt_stat->key_size); | 560 | crypt_stat->key_size); |
561 | out_free_memory: | ||
549 | memset(encrypted_session_key, 0, PAGE_CACHE_SIZE); | 562 | memset(encrypted_session_key, 0, PAGE_CACHE_SIZE); |
550 | free_page((unsigned long)encrypted_session_key); | 563 | free_page((unsigned long)encrypted_session_key); |
551 | memset(session_key, 0, PAGE_CACHE_SIZE); | 564 | memset(session_key, 0, PAGE_CACHE_SIZE); |
@@ -554,7 +567,7 @@ out_free_tfm: | |||
554 | if (tfm_mutex) | 567 | if (tfm_mutex) |
555 | mutex_unlock(tfm_mutex); | 568 | mutex_unlock(tfm_mutex); |
556 | else | 569 | else |
557 | crypto_free_tfm(tfm); | 570 | crypto_free_blkcipher(desc.tfm); |
558 | out: | 571 | out: |
559 | return rc; | 572 | return rc; |
560 | } | 573 | } |
@@ -803,19 +816,21 @@ write_tag_3_packet(char *dest, size_t max, struct ecryptfs_auth_tok *auth_tok, | |||
803 | struct ecryptfs_crypt_stat *crypt_stat, | 816 | struct ecryptfs_crypt_stat *crypt_stat, |
804 | struct ecryptfs_key_record *key_rec, size_t *packet_size) | 817 | struct ecryptfs_key_record *key_rec, size_t *packet_size) |
805 | { | 818 | { |
806 | int rc = 0; | ||
807 | |||
808 | size_t i; | 819 | size_t i; |
809 | size_t signature_is_valid = 0; | 820 | size_t signature_is_valid = 0; |
810 | size_t encrypted_session_key_valid = 0; | 821 | size_t encrypted_session_key_valid = 0; |
811 | char session_key_encryption_key[ECRYPTFS_MAX_KEY_BYTES]; | 822 | char session_key_encryption_key[ECRYPTFS_MAX_KEY_BYTES]; |
812 | struct scatterlist dest_sg[2]; | 823 | struct scatterlist dest_sg[2]; |
813 | struct scatterlist src_sg[2]; | 824 | struct scatterlist src_sg[2]; |
814 | struct crypto_tfm *tfm = NULL; | ||
815 | struct mutex *tfm_mutex = NULL; | 825 | struct mutex *tfm_mutex = NULL; |
816 | size_t key_rec_size; | 826 | size_t key_rec_size; |
817 | size_t packet_size_length; | 827 | size_t packet_size_length; |
818 | size_t cipher_code; | 828 | size_t cipher_code; |
829 | struct blkcipher_desc desc = { | ||
830 | .tfm = NULL, | ||
831 | .flags = CRYPTO_TFM_REQ_MAY_SLEEP | ||
832 | }; | ||
833 | int rc = 0; | ||
819 | 834 | ||
820 | (*packet_size) = 0; | 835 | (*packet_size) = 0; |
821 | /* Check for a valid signature on the auth_tok */ | 836 | /* Check for a valid signature on the auth_tok */ |
@@ -882,33 +897,48 @@ write_tag_3_packet(char *dest, size_t max, struct ecryptfs_auth_tok *auth_tok, | |||
882 | if (!strcmp(crypt_stat->cipher, | 897 | if (!strcmp(crypt_stat->cipher, |
883 | crypt_stat->mount_crypt_stat->global_default_cipher_name) | 898 | crypt_stat->mount_crypt_stat->global_default_cipher_name) |
884 | && crypt_stat->mount_crypt_stat->global_key_tfm) { | 899 | && crypt_stat->mount_crypt_stat->global_key_tfm) { |
885 | tfm = crypt_stat->mount_crypt_stat->global_key_tfm; | 900 | desc.tfm = crypt_stat->mount_crypt_stat->global_key_tfm; |
886 | tfm_mutex = &crypt_stat->mount_crypt_stat->global_key_tfm_mutex; | 901 | tfm_mutex = &crypt_stat->mount_crypt_stat->global_key_tfm_mutex; |
887 | } else | 902 | } else { |
888 | tfm = crypto_alloc_tfm(crypt_stat->cipher, 0); | 903 | char *full_alg_name; |
889 | if (!tfm) { | 904 | |
890 | ecryptfs_printk(KERN_ERR, "Could not initialize crypto " | 905 | rc = ecryptfs_crypto_api_algify_cipher_name(&full_alg_name, |
891 | "context for cipher [%s]\n", | 906 | crypt_stat->cipher, |
892 | crypt_stat->cipher); | 907 | "ecb"); |
893 | rc = -EINVAL; | 908 | if (rc) |
894 | goto out; | 909 | goto out; |
910 | desc.tfm = crypto_alloc_blkcipher(full_alg_name, 0, | ||
911 | CRYPTO_ALG_ASYNC); | ||
912 | kfree(full_alg_name); | ||
913 | if (IS_ERR(desc.tfm)) { | ||
914 | rc = PTR_ERR(desc.tfm); | ||
915 | ecryptfs_printk(KERN_ERR, "Could not initialize crypto " | ||
916 | "context for cipher [%s]; rc = [%d]\n", | ||
917 | crypt_stat->cipher, rc); | ||
918 | goto out; | ||
919 | } | ||
920 | crypto_blkcipher_set_flags(desc.tfm, CRYPTO_TFM_REQ_WEAK_KEY); | ||
895 | } | 921 | } |
896 | if (tfm_mutex) | 922 | if (tfm_mutex) |
897 | mutex_lock(tfm_mutex); | 923 | mutex_lock(tfm_mutex); |
898 | rc = crypto_cipher_setkey(tfm, session_key_encryption_key, | 924 | rc = crypto_blkcipher_setkey(desc.tfm, session_key_encryption_key, |
899 | crypt_stat->key_size); | 925 | crypt_stat->key_size); |
900 | if (rc < 0) { | 926 | if (rc < 0) { |
901 | if (tfm_mutex) | 927 | if (tfm_mutex) |
902 | mutex_unlock(tfm_mutex); | 928 | mutex_unlock(tfm_mutex); |
903 | ecryptfs_printk(KERN_ERR, "Error setting key for crypto " | 929 | ecryptfs_printk(KERN_ERR, "Error setting key for crypto " |
904 | "context\n"); | 930 | "context; rc = [%d]\n", rc); |
905 | goto out; | 931 | goto out; |
906 | } | 932 | } |
907 | rc = 0; | 933 | rc = 0; |
908 | ecryptfs_printk(KERN_DEBUG, "Encrypting [%d] bytes of the key\n", | 934 | ecryptfs_printk(KERN_DEBUG, "Encrypting [%d] bytes of the key\n", |
909 | crypt_stat->key_size); | 935 | crypt_stat->key_size); |
910 | crypto_cipher_encrypt(tfm, dest_sg, src_sg, | 936 | rc = crypto_blkcipher_encrypt(&desc, dest_sg, src_sg, |
911 | (*key_rec).enc_key_size); | 937 | (*key_rec).enc_key_size); |
938 | if (rc) { | ||
939 | printk(KERN_ERR "Error encrypting; rc = [%d]\n", rc); | ||
940 | goto out; | ||
941 | } | ||
912 | if (tfm_mutex) | 942 | if (tfm_mutex) |
913 | mutex_unlock(tfm_mutex); | 943 | mutex_unlock(tfm_mutex); |
914 | ecryptfs_printk(KERN_DEBUG, "This should be the encrypted key:\n"); | 944 | ecryptfs_printk(KERN_DEBUG, "This should be the encrypted key:\n"); |
@@ -971,8 +1001,8 @@ encrypted_session_key_set: | |||
971 | (*key_rec).enc_key_size); | 1001 | (*key_rec).enc_key_size); |
972 | (*packet_size) += (*key_rec).enc_key_size; | 1002 | (*packet_size) += (*key_rec).enc_key_size; |
973 | out: | 1003 | out: |
974 | if (tfm && !tfm_mutex) | 1004 | if (desc.tfm && !tfm_mutex) |
975 | crypto_free_tfm(tfm); | 1005 | crypto_free_blkcipher(desc.tfm); |
976 | if (rc) | 1006 | if (rc) |
977 | (*packet_size) = 0; | 1007 | (*packet_size) = 0; |
978 | return rc; | 1008 | return rc; |
diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index 5938a232d11b..a78d87d14baf 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c | |||
@@ -208,7 +208,6 @@ static int ecryptfs_parse_options(struct super_block *sb, char *options) | |||
208 | char *cipher_name_dst; | 208 | char *cipher_name_dst; |
209 | char *cipher_name_src; | 209 | char *cipher_name_src; |
210 | char *cipher_key_bytes_src; | 210 | char *cipher_key_bytes_src; |
211 | struct crypto_tfm *tmp_tfm; | ||
212 | int cipher_name_len; | 211 | int cipher_name_len; |
213 | 212 | ||
214 | if (!options) { | 213 | if (!options) { |
@@ -305,25 +304,19 @@ static int ecryptfs_parse_options(struct super_block *sb, char *options) | |||
305 | = '\0'; | 304 | = '\0'; |
306 | } | 305 | } |
307 | if (!cipher_key_bytes_set) { | 306 | if (!cipher_key_bytes_set) { |
308 | mount_crypt_stat->global_default_cipher_key_size = | 307 | mount_crypt_stat->global_default_cipher_key_size = 0; |
309 | ECRYPTFS_DEFAULT_KEY_BYTES; | ||
310 | ecryptfs_printk(KERN_DEBUG, "Cipher key size was not " | ||
311 | "specified. Defaulting to [%d]\n", | ||
312 | mount_crypt_stat-> | ||
313 | global_default_cipher_key_size); | ||
314 | } | 308 | } |
315 | rc = ecryptfs_process_cipher( | 309 | rc = ecryptfs_process_cipher( |
316 | &tmp_tfm, | ||
317 | &mount_crypt_stat->global_key_tfm, | 310 | &mount_crypt_stat->global_key_tfm, |
318 | mount_crypt_stat->global_default_cipher_name, | 311 | mount_crypt_stat->global_default_cipher_name, |
319 | mount_crypt_stat->global_default_cipher_key_size); | 312 | &mount_crypt_stat->global_default_cipher_key_size); |
320 | if (tmp_tfm) | ||
321 | crypto_free_tfm(tmp_tfm); | ||
322 | if (rc) { | 313 | if (rc) { |
323 | printk(KERN_ERR "Error attempting to initialize cipher [%s] " | 314 | printk(KERN_ERR "Error attempting to initialize cipher [%s] " |
324 | "with key size [%Zd] bytes; rc = [%d]\n", | 315 | "with key size [%Zd] bytes; rc = [%d]\n", |
325 | mount_crypt_stat->global_default_cipher_name, | 316 | mount_crypt_stat->global_default_cipher_name, |
326 | mount_crypt_stat->global_default_cipher_key_size, rc); | 317 | mount_crypt_stat->global_default_cipher_key_size, rc); |
318 | mount_crypt_stat->global_key_tfm = NULL; | ||
319 | mount_crypt_stat->global_auth_tok_key = NULL; | ||
327 | rc = -EINVAL; | 320 | rc = -EINVAL; |
328 | goto out; | 321 | goto out; |
329 | } | 322 | } |
diff --git a/fs/ecryptfs/super.c b/fs/ecryptfs/super.c index c337c0410fb1..825757ae4867 100644 --- a/fs/ecryptfs/super.c +++ b/fs/ecryptfs/super.c | |||
@@ -138,23 +138,6 @@ static void ecryptfs_clear_inode(struct inode *inode) | |||
138 | } | 138 | } |
139 | 139 | ||
140 | /** | 140 | /** |
141 | * ecryptfs_umount_begin | ||
142 | * | ||
143 | * Called in do_umount(). | ||
144 | */ | ||
145 | static void ecryptfs_umount_begin(struct vfsmount *vfsmnt, int flags) | ||
146 | { | ||
147 | struct vfsmount *lower_mnt = | ||
148 | ecryptfs_dentry_to_lower_mnt(vfsmnt->mnt_sb->s_root); | ||
149 | struct super_block *lower_sb; | ||
150 | |||
151 | mntput(lower_mnt); | ||
152 | lower_sb = lower_mnt->mnt_sb; | ||
153 | if (lower_sb->s_op->umount_begin) | ||
154 | lower_sb->s_op->umount_begin(lower_mnt, flags); | ||
155 | } | ||
156 | |||
157 | /** | ||
158 | * ecryptfs_show_options | 141 | * ecryptfs_show_options |
159 | * | 142 | * |
160 | * Prints the directory we are currently mounted over. | 143 | * Prints the directory we are currently mounted over. |
@@ -193,6 +176,5 @@ struct super_operations ecryptfs_sops = { | |||
193 | .statfs = ecryptfs_statfs, | 176 | .statfs = ecryptfs_statfs, |
194 | .remount_fs = NULL, | 177 | .remount_fs = NULL, |
195 | .clear_inode = ecryptfs_clear_inode, | 178 | .clear_inode = ecryptfs_clear_inode, |
196 | .umount_begin = ecryptfs_umount_begin, | ||
197 | .show_options = ecryptfs_show_options | 179 | .show_options = ecryptfs_show_options |
198 | }; | 180 | }; |
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index 1e9578052cd3..4fe49c3661b2 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
@@ -69,44 +69,49 @@ static int verify_group_input(struct super_block *sb, | |||
69 | else if (outside(input->block_bitmap, start, end)) | 69 | else if (outside(input->block_bitmap, start, end)) |
70 | ext4_warning(sb, __FUNCTION__, | 70 | ext4_warning(sb, __FUNCTION__, |
71 | "Block bitmap not in group (block %llu)", | 71 | "Block bitmap not in group (block %llu)", |
72 | input->block_bitmap); | 72 | (unsigned long long)input->block_bitmap); |
73 | else if (outside(input->inode_bitmap, start, end)) | 73 | else if (outside(input->inode_bitmap, start, end)) |
74 | ext4_warning(sb, __FUNCTION__, | 74 | ext4_warning(sb, __FUNCTION__, |
75 | "Inode bitmap not in group (block %llu)", | 75 | "Inode bitmap not in group (block %llu)", |
76 | input->inode_bitmap); | 76 | (unsigned long long)input->inode_bitmap); |
77 | else if (outside(input->inode_table, start, end) || | 77 | else if (outside(input->inode_table, start, end) || |
78 | outside(itend - 1, start, end)) | 78 | outside(itend - 1, start, end)) |
79 | ext4_warning(sb, __FUNCTION__, | 79 | ext4_warning(sb, __FUNCTION__, |
80 | "Inode table not in group (blocks %llu-%llu)", | 80 | "Inode table not in group (blocks %llu-%llu)", |
81 | input->inode_table, itend - 1); | 81 | (unsigned long long)input->inode_table, itend - 1); |
82 | else if (input->inode_bitmap == input->block_bitmap) | 82 | else if (input->inode_bitmap == input->block_bitmap) |
83 | ext4_warning(sb, __FUNCTION__, | 83 | ext4_warning(sb, __FUNCTION__, |
84 | "Block bitmap same as inode bitmap (%llu)", | 84 | "Block bitmap same as inode bitmap (%llu)", |
85 | input->block_bitmap); | 85 | (unsigned long long)input->block_bitmap); |
86 | else if (inside(input->block_bitmap, input->inode_table, itend)) | 86 | else if (inside(input->block_bitmap, input->inode_table, itend)) |
87 | ext4_warning(sb, __FUNCTION__, | 87 | ext4_warning(sb, __FUNCTION__, |
88 | "Block bitmap (%llu) in inode table (%llu-%llu)", | 88 | "Block bitmap (%llu) in inode table (%llu-%llu)", |
89 | input->block_bitmap, input->inode_table, itend-1); | 89 | (unsigned long long)input->block_bitmap, |
90 | (unsigned long long)input->inode_table, itend - 1); | ||
90 | else if (inside(input->inode_bitmap, input->inode_table, itend)) | 91 | else if (inside(input->inode_bitmap, input->inode_table, itend)) |
91 | ext4_warning(sb, __FUNCTION__, | 92 | ext4_warning(sb, __FUNCTION__, |
92 | "Inode bitmap (%llu) in inode table (%llu-%llu)", | 93 | "Inode bitmap (%llu) in inode table (%llu-%llu)", |
93 | input->inode_bitmap, input->inode_table, itend-1); | 94 | (unsigned long long)input->inode_bitmap, |
95 | (unsigned long long)input->inode_table, itend - 1); | ||
94 | else if (inside(input->block_bitmap, start, metaend)) | 96 | else if (inside(input->block_bitmap, start, metaend)) |
95 | ext4_warning(sb, __FUNCTION__, | 97 | ext4_warning(sb, __FUNCTION__, |
96 | "Block bitmap (%llu) in GDT table" | 98 | "Block bitmap (%llu) in GDT table" |
97 | " (%llu-%llu)", | 99 | " (%llu-%llu)", |
98 | input->block_bitmap, start, metaend - 1); | 100 | (unsigned long long)input->block_bitmap, |
101 | start, metaend - 1); | ||
99 | else if (inside(input->inode_bitmap, start, metaend)) | 102 | else if (inside(input->inode_bitmap, start, metaend)) |
100 | ext4_warning(sb, __FUNCTION__, | 103 | ext4_warning(sb, __FUNCTION__, |
101 | "Inode bitmap (%llu) in GDT table" | 104 | "Inode bitmap (%llu) in GDT table" |
102 | " (%llu-%llu)", | 105 | " (%llu-%llu)", |
103 | input->inode_bitmap, start, metaend - 1); | 106 | (unsigned long long)input->inode_bitmap, |
107 | start, metaend - 1); | ||
104 | else if (inside(input->inode_table, start, metaend) || | 108 | else if (inside(input->inode_table, start, metaend) || |
105 | inside(itend - 1, start, metaend)) | 109 | inside(itend - 1, start, metaend)) |
106 | ext4_warning(sb, __FUNCTION__, | 110 | ext4_warning(sb, __FUNCTION__, |
107 | "Inode table (%llu-%llu) overlaps" | 111 | "Inode table (%llu-%llu) overlaps" |
108 | "GDT table (%llu-%llu)", | 112 | "GDT table (%llu-%llu)", |
109 | input->inode_table, itend - 1, start, metaend - 1); | 113 | (unsigned long long)input->inode_table, |
114 | itend - 1, start, metaend - 1); | ||
110 | else | 115 | else |
111 | err = 0; | 116 | err = 0; |
112 | brelse(bh); | 117 | brelse(bh); |
diff --git a/fs/fat/file.c b/fs/fat/file.c index 8337451e7897..0aa813d944a6 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c | |||
@@ -303,7 +303,17 @@ void fat_truncate(struct inode *inode) | |||
303 | fat_flush_inodes(inode->i_sb, inode, NULL); | 303 | fat_flush_inodes(inode->i_sb, inode, NULL); |
304 | } | 304 | } |
305 | 305 | ||
306 | int fat_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) | ||
307 | { | ||
308 | struct inode *inode = dentry->d_inode; | ||
309 | generic_fillattr(inode, stat); | ||
310 | stat->blksize = MSDOS_SB(inode->i_sb)->cluster_size; | ||
311 | return 0; | ||
312 | } | ||
313 | EXPORT_SYMBOL_GPL(fat_getattr); | ||
314 | |||
306 | struct inode_operations fat_file_inode_operations = { | 315 | struct inode_operations fat_file_inode_operations = { |
307 | .truncate = fat_truncate, | 316 | .truncate = fat_truncate, |
308 | .setattr = fat_notify_change, | 317 | .setattr = fat_notify_change, |
318 | .getattr = fat_getattr, | ||
309 | }; | 319 | }; |
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index cfc8f81e60d0..c71a6c092ad9 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c | |||
@@ -138,6 +138,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd) | |||
138 | struct fuse_entry_out outarg; | 138 | struct fuse_entry_out outarg; |
139 | struct fuse_conn *fc; | 139 | struct fuse_conn *fc; |
140 | struct fuse_req *req; | 140 | struct fuse_req *req; |
141 | struct fuse_req *forget_req; | ||
141 | struct dentry *parent; | 142 | struct dentry *parent; |
142 | 143 | ||
143 | /* Doesn't hurt to "reset" the validity timeout */ | 144 | /* Doesn't hurt to "reset" the validity timeout */ |
@@ -152,25 +153,33 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd) | |||
152 | if (IS_ERR(req)) | 153 | if (IS_ERR(req)) |
153 | return 0; | 154 | return 0; |
154 | 155 | ||
156 | forget_req = fuse_get_req(fc); | ||
157 | if (IS_ERR(forget_req)) { | ||
158 | fuse_put_request(fc, req); | ||
159 | return 0; | ||
160 | } | ||
161 | |||
155 | parent = dget_parent(entry); | 162 | parent = dget_parent(entry); |
156 | fuse_lookup_init(req, parent->d_inode, entry, &outarg); | 163 | fuse_lookup_init(req, parent->d_inode, entry, &outarg); |
157 | request_send(fc, req); | 164 | request_send(fc, req); |
158 | dput(parent); | 165 | dput(parent); |
159 | err = req->out.h.error; | 166 | err = req->out.h.error; |
167 | fuse_put_request(fc, req); | ||
160 | /* Zero nodeid is same as -ENOENT */ | 168 | /* Zero nodeid is same as -ENOENT */ |
161 | if (!err && !outarg.nodeid) | 169 | if (!err && !outarg.nodeid) |
162 | err = -ENOENT; | 170 | err = -ENOENT; |
163 | if (!err) { | 171 | if (!err) { |
164 | struct fuse_inode *fi = get_fuse_inode(inode); | 172 | struct fuse_inode *fi = get_fuse_inode(inode); |
165 | if (outarg.nodeid != get_node_id(inode)) { | 173 | if (outarg.nodeid != get_node_id(inode)) { |
166 | fuse_send_forget(fc, req, outarg.nodeid, 1); | 174 | fuse_send_forget(fc, forget_req, |
175 | outarg.nodeid, 1); | ||
167 | return 0; | 176 | return 0; |
168 | } | 177 | } |
169 | spin_lock(&fc->lock); | 178 | spin_lock(&fc->lock); |
170 | fi->nlookup ++; | 179 | fi->nlookup ++; |
171 | spin_unlock(&fc->lock); | 180 | spin_unlock(&fc->lock); |
172 | } | 181 | } |
173 | fuse_put_request(fc, req); | 182 | fuse_put_request(fc, forget_req); |
174 | if (err || (outarg.attr.mode ^ inode->i_mode) & S_IFMT) | 183 | if (err || (outarg.attr.mode ^ inode->i_mode) & S_IFMT) |
175 | return 0; | 184 | return 0; |
176 | 185 | ||
@@ -221,6 +230,7 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry, | |||
221 | struct inode *inode = NULL; | 230 | struct inode *inode = NULL; |
222 | struct fuse_conn *fc = get_fuse_conn(dir); | 231 | struct fuse_conn *fc = get_fuse_conn(dir); |
223 | struct fuse_req *req; | 232 | struct fuse_req *req; |
233 | struct fuse_req *forget_req; | ||
224 | 234 | ||
225 | if (entry->d_name.len > FUSE_NAME_MAX) | 235 | if (entry->d_name.len > FUSE_NAME_MAX) |
226 | return ERR_PTR(-ENAMETOOLONG); | 236 | return ERR_PTR(-ENAMETOOLONG); |
@@ -229,9 +239,16 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry, | |||
229 | if (IS_ERR(req)) | 239 | if (IS_ERR(req)) |
230 | return ERR_PTR(PTR_ERR(req)); | 240 | return ERR_PTR(PTR_ERR(req)); |
231 | 241 | ||
242 | forget_req = fuse_get_req(fc); | ||
243 | if (IS_ERR(forget_req)) { | ||
244 | fuse_put_request(fc, req); | ||
245 | return ERR_PTR(PTR_ERR(forget_req)); | ||
246 | } | ||
247 | |||
232 | fuse_lookup_init(req, dir, entry, &outarg); | 248 | fuse_lookup_init(req, dir, entry, &outarg); |
233 | request_send(fc, req); | 249 | request_send(fc, req); |
234 | err = req->out.h.error; | 250 | err = req->out.h.error; |
251 | fuse_put_request(fc, req); | ||
235 | /* Zero nodeid is same as -ENOENT, but with valid timeout */ | 252 | /* Zero nodeid is same as -ENOENT, but with valid timeout */ |
236 | if (!err && outarg.nodeid && | 253 | if (!err && outarg.nodeid && |
237 | (invalid_nodeid(outarg.nodeid) || !valid_mode(outarg.attr.mode))) | 254 | (invalid_nodeid(outarg.nodeid) || !valid_mode(outarg.attr.mode))) |
@@ -240,11 +257,11 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry, | |||
240 | inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation, | 257 | inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation, |
241 | &outarg.attr); | 258 | &outarg.attr); |
242 | if (!inode) { | 259 | if (!inode) { |
243 | fuse_send_forget(fc, req, outarg.nodeid, 1); | 260 | fuse_send_forget(fc, forget_req, outarg.nodeid, 1); |
244 | return ERR_PTR(-ENOMEM); | 261 | return ERR_PTR(-ENOMEM); |
245 | } | 262 | } |
246 | } | 263 | } |
247 | fuse_put_request(fc, req); | 264 | fuse_put_request(fc, forget_req); |
248 | if (err && err != -ENOENT) | 265 | if (err && err != -ENOENT) |
249 | return ERR_PTR(err); | 266 | return ERR_PTR(err); |
250 | 267 | ||
@@ -388,6 +405,13 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req, | |||
388 | struct fuse_entry_out outarg; | 405 | struct fuse_entry_out outarg; |
389 | struct inode *inode; | 406 | struct inode *inode; |
390 | int err; | 407 | int err; |
408 | struct fuse_req *forget_req; | ||
409 | |||
410 | forget_req = fuse_get_req(fc); | ||
411 | if (IS_ERR(forget_req)) { | ||
412 | fuse_put_request(fc, req); | ||
413 | return PTR_ERR(forget_req); | ||
414 | } | ||
391 | 415 | ||
392 | req->in.h.nodeid = get_node_id(dir); | 416 | req->in.h.nodeid = get_node_id(dir); |
393 | req->out.numargs = 1; | 417 | req->out.numargs = 1; |
@@ -395,24 +419,24 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req, | |||
395 | req->out.args[0].value = &outarg; | 419 | req->out.args[0].value = &outarg; |
396 | request_send(fc, req); | 420 | request_send(fc, req); |
397 | err = req->out.h.error; | 421 | err = req->out.h.error; |
398 | if (err) { | 422 | fuse_put_request(fc, req); |
399 | fuse_put_request(fc, req); | 423 | if (err) |
400 | return err; | 424 | goto out_put_forget_req; |
401 | } | 425 | |
402 | err = -EIO; | 426 | err = -EIO; |
403 | if (invalid_nodeid(outarg.nodeid)) | 427 | if (invalid_nodeid(outarg.nodeid)) |
404 | goto out_put_request; | 428 | goto out_put_forget_req; |
405 | 429 | ||
406 | if ((outarg.attr.mode ^ mode) & S_IFMT) | 430 | if ((outarg.attr.mode ^ mode) & S_IFMT) |
407 | goto out_put_request; | 431 | goto out_put_forget_req; |
408 | 432 | ||
409 | inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation, | 433 | inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation, |
410 | &outarg.attr); | 434 | &outarg.attr); |
411 | if (!inode) { | 435 | if (!inode) { |
412 | fuse_send_forget(fc, req, outarg.nodeid, 1); | 436 | fuse_send_forget(fc, forget_req, outarg.nodeid, 1); |
413 | return -ENOMEM; | 437 | return -ENOMEM; |
414 | } | 438 | } |
415 | fuse_put_request(fc, req); | 439 | fuse_put_request(fc, forget_req); |
416 | 440 | ||
417 | if (S_ISDIR(inode->i_mode)) { | 441 | if (S_ISDIR(inode->i_mode)) { |
418 | struct dentry *alias; | 442 | struct dentry *alias; |
@@ -434,8 +458,8 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req, | |||
434 | fuse_invalidate_attr(dir); | 458 | fuse_invalidate_attr(dir); |
435 | return 0; | 459 | return 0; |
436 | 460 | ||
437 | out_put_request: | 461 | out_put_forget_req: |
438 | fuse_put_request(fc, req); | 462 | fuse_put_request(fc, forget_req); |
439 | return err; | 463 | return err; |
440 | } | 464 | } |
441 | 465 | ||
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 2bb5ace3882d..763a50daf1c0 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -397,14 +397,14 @@ static int fuse_readpages(struct file *file, struct address_space *mapping, | |||
397 | 397 | ||
398 | err = -EIO; | 398 | err = -EIO; |
399 | if (is_bad_inode(inode)) | 399 | if (is_bad_inode(inode)) |
400 | goto clean_pages_up; | 400 | goto out; |
401 | 401 | ||
402 | data.file = file; | 402 | data.file = file; |
403 | data.inode = inode; | 403 | data.inode = inode; |
404 | data.req = fuse_get_req(fc); | 404 | data.req = fuse_get_req(fc); |
405 | err = PTR_ERR(data.req); | 405 | err = PTR_ERR(data.req); |
406 | if (IS_ERR(data.req)) | 406 | if (IS_ERR(data.req)) |
407 | goto clean_pages_up; | 407 | goto out; |
408 | 408 | ||
409 | err = read_cache_pages(mapping, pages, fuse_readpages_fill, &data); | 409 | err = read_cache_pages(mapping, pages, fuse_readpages_fill, &data); |
410 | if (!err) { | 410 | if (!err) { |
@@ -413,10 +413,7 @@ static int fuse_readpages(struct file *file, struct address_space *mapping, | |||
413 | else | 413 | else |
414 | fuse_put_request(fc, data.req); | 414 | fuse_put_request(fc, data.req); |
415 | } | 415 | } |
416 | return err; | 416 | out: |
417 | |||
418 | clean_pages_up: | ||
419 | put_pages_list(pages); | ||
420 | return err; | 417 | return err; |
421 | } | 418 | } |
422 | 419 | ||
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 57c43ac47925..d470e5286ecd 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c | |||
@@ -157,6 +157,9 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, struct gfs2_inum *inum, | |||
157 | struct gfs2_glock *io_gl; | 157 | struct gfs2_glock *io_gl; |
158 | int error; | 158 | int error; |
159 | 159 | ||
160 | if (!inode) | ||
161 | return ERR_PTR(-ENOBUFS); | ||
162 | |||
160 | if (inode->i_state & I_NEW) { | 163 | if (inode->i_state & I_NEW) { |
161 | struct gfs2_sbd *sdp = GFS2_SB(inode); | 164 | struct gfs2_sbd *sdp = GFS2_SB(inode); |
162 | umode_t mode = DT2IF(type); | 165 | umode_t mode = DT2IF(type); |
diff --git a/fs/gfs2/main.c b/fs/gfs2/main.c index 21508a13bb78..9889c1eacec1 100644 --- a/fs/gfs2/main.c +++ b/fs/gfs2/main.c | |||
@@ -84,8 +84,8 @@ static int __init init_gfs2_fs(void) | |||
84 | 84 | ||
85 | gfs2_inode_cachep = kmem_cache_create("gfs2_inode", | 85 | gfs2_inode_cachep = kmem_cache_create("gfs2_inode", |
86 | sizeof(struct gfs2_inode), | 86 | sizeof(struct gfs2_inode), |
87 | 0, (SLAB_RECLAIM_ACCOUNT| | 87 | 0, SLAB_RECLAIM_ACCOUNT| |
88 | SLAB_PANIC|SLAB_MEM_SPREAD), | 88 | SLAB_MEM_SPREAD, |
89 | gfs2_init_inode_once, NULL); | 89 | gfs2_init_inode_once, NULL); |
90 | if (!gfs2_inode_cachep) | 90 | if (!gfs2_inode_cachep) |
91 | goto fail; | 91 | goto fail; |
diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c index 8d5963c7e123..015640b3f123 100644 --- a/fs/gfs2/ops_address.c +++ b/fs/gfs2/ops_address.c | |||
@@ -337,13 +337,6 @@ out: | |||
337 | out_noerror: | 337 | out_noerror: |
338 | ret = 0; | 338 | ret = 0; |
339 | out_unlock: | 339 | out_unlock: |
340 | /* unlock all pages, we can't do any I/O right now */ | ||
341 | for (page_idx = 0; page_idx < nr_pages; page_idx++) { | ||
342 | struct page *page = list_entry(pages->prev, struct page, lru); | ||
343 | list_del(&page->lru); | ||
344 | unlock_page(page); | ||
345 | page_cache_release(page); | ||
346 | } | ||
347 | if (do_unlock) | 340 | if (do_unlock) |
348 | gfs2_holder_uninit(&gh); | 341 | gfs2_holder_uninit(&gh); |
349 | goto out; | 342 | goto out; |
diff --git a/fs/gfs2/ops_super.c b/fs/gfs2/ops_super.c index 06f06f7773d0..b47d9598c047 100644 --- a/fs/gfs2/ops_super.c +++ b/fs/gfs2/ops_super.c | |||
@@ -138,16 +138,27 @@ static void gfs2_put_super(struct super_block *sb) | |||
138 | } | 138 | } |
139 | 139 | ||
140 | /** | 140 | /** |
141 | * gfs2_write_super - disk commit all incore transactions | 141 | * gfs2_write_super |
142 | * @sb: the filesystem | 142 | * @sb: the superblock |
143 | * | 143 | * |
144 | * This function is called every time sync(2) is called. | ||
145 | * After this exits, all dirty buffers are synced. | ||
146 | */ | 144 | */ |
147 | 145 | ||
148 | static void gfs2_write_super(struct super_block *sb) | 146 | static void gfs2_write_super(struct super_block *sb) |
149 | { | 147 | { |
148 | sb->s_dirt = 0; | ||
149 | } | ||
150 | |||
151 | /** | ||
152 | * gfs2_sync_fs - sync the filesystem | ||
153 | * @sb: the superblock | ||
154 | * | ||
155 | * Flushes the log to disk. | ||
156 | */ | ||
157 | static int gfs2_sync_fs(struct super_block *sb, int wait) | ||
158 | { | ||
159 | sb->s_dirt = 0; | ||
150 | gfs2_log_flush(sb->s_fs_info, NULL); | 160 | gfs2_log_flush(sb->s_fs_info, NULL); |
161 | return 0; | ||
151 | } | 162 | } |
152 | 163 | ||
153 | /** | 164 | /** |
@@ -452,17 +463,18 @@ static void gfs2_destroy_inode(struct inode *inode) | |||
452 | } | 463 | } |
453 | 464 | ||
454 | struct super_operations gfs2_super_ops = { | 465 | struct super_operations gfs2_super_ops = { |
455 | .alloc_inode = gfs2_alloc_inode, | 466 | .alloc_inode = gfs2_alloc_inode, |
456 | .destroy_inode = gfs2_destroy_inode, | 467 | .destroy_inode = gfs2_destroy_inode, |
457 | .write_inode = gfs2_write_inode, | 468 | .write_inode = gfs2_write_inode, |
458 | .delete_inode = gfs2_delete_inode, | 469 | .delete_inode = gfs2_delete_inode, |
459 | .put_super = gfs2_put_super, | 470 | .put_super = gfs2_put_super, |
460 | .write_super = gfs2_write_super, | 471 | .write_super = gfs2_write_super, |
461 | .write_super_lockfs = gfs2_write_super_lockfs, | 472 | .sync_fs = gfs2_sync_fs, |
462 | .unlockfs = gfs2_unlockfs, | 473 | .write_super_lockfs = gfs2_write_super_lockfs, |
463 | .statfs = gfs2_statfs, | 474 | .unlockfs = gfs2_unlockfs, |
464 | .remount_fs = gfs2_remount_fs, | 475 | .statfs = gfs2_statfs, |
465 | .clear_inode = gfs2_clear_inode, | 476 | .remount_fs = gfs2_remount_fs, |
466 | .show_options = gfs2_show_options, | 477 | .clear_inode = gfs2_clear_inode, |
478 | .show_options = gfs2_show_options, | ||
467 | }; | 479 | }; |
468 | 480 | ||
diff --git a/fs/hfs/super.c b/fs/hfs/super.c index d43b4fcc8ad3..85b17b3fa4a0 100644 --- a/fs/hfs/super.c +++ b/fs/hfs/super.c | |||
@@ -390,11 +390,13 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent) | |||
390 | hfs_find_exit(&fd); | 390 | hfs_find_exit(&fd); |
391 | goto bail_no_root; | 391 | goto bail_no_root; |
392 | } | 392 | } |
393 | res = -EINVAL; | ||
393 | root_inode = hfs_iget(sb, &fd.search_key->cat, &rec); | 394 | root_inode = hfs_iget(sb, &fd.search_key->cat, &rec); |
394 | hfs_find_exit(&fd); | 395 | hfs_find_exit(&fd); |
395 | if (!root_inode) | 396 | if (!root_inode) |
396 | goto bail_no_root; | 397 | goto bail_no_root; |
397 | 398 | ||
399 | res = -ENOMEM; | ||
398 | sb->s_root = d_alloc_root(root_inode); | 400 | sb->s_root = d_alloc_root(root_inode); |
399 | if (!sb->s_root) | 401 | if (!sb->s_root) |
400 | goto bail_iput; | 402 | goto bail_iput; |
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 4ee3f006b861..7f4756963d05 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
@@ -62,24 +62,19 @@ static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma) | |||
62 | loff_t len, vma_len; | 62 | loff_t len, vma_len; |
63 | int ret; | 63 | int ret; |
64 | 64 | ||
65 | if (vma->vm_pgoff & (HPAGE_SIZE / PAGE_SIZE - 1)) | 65 | /* |
66 | return -EINVAL; | 66 | * vma alignment has already been checked by prepare_hugepage_range. |
67 | 67 | * If you add any error returns here, do so after setting VM_HUGETLB, | |
68 | if (vma->vm_start & ~HPAGE_MASK) | 68 | * so is_vm_hugetlb_page tests below unmap_region go the right way |
69 | return -EINVAL; | 69 | * when do_mmap_pgoff unwinds (may be important on powerpc and ia64). |
70 | 70 | */ | |
71 | if (vma->vm_end & ~HPAGE_MASK) | 71 | vma->vm_flags |= VM_HUGETLB | VM_RESERVED; |
72 | return -EINVAL; | 72 | vma->vm_ops = &hugetlb_vm_ops; |
73 | |||
74 | if (vma->vm_end - vma->vm_start < HPAGE_SIZE) | ||
75 | return -EINVAL; | ||
76 | 73 | ||
77 | vma_len = (loff_t)(vma->vm_end - vma->vm_start); | 74 | vma_len = (loff_t)(vma->vm_end - vma->vm_start); |
78 | 75 | ||
79 | mutex_lock(&inode->i_mutex); | 76 | mutex_lock(&inode->i_mutex); |
80 | file_accessed(file); | 77 | file_accessed(file); |
81 | vma->vm_flags |= VM_HUGETLB | VM_RESERVED; | ||
82 | vma->vm_ops = &hugetlb_vm_ops; | ||
83 | 78 | ||
84 | ret = -ENOMEM; | 79 | ret = -ENOMEM; |
85 | len = vma_len + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); | 80 | len = vma_len + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); |
@@ -271,26 +266,24 @@ static void hugetlbfs_drop_inode(struct inode *inode) | |||
271 | hugetlbfs_forget_inode(inode); | 266 | hugetlbfs_forget_inode(inode); |
272 | } | 267 | } |
273 | 268 | ||
274 | /* | ||
275 | * h_pgoff is in HPAGE_SIZE units. | ||
276 | * vma->vm_pgoff is in PAGE_SIZE units. | ||
277 | */ | ||
278 | static inline void | 269 | static inline void |
279 | hugetlb_vmtruncate_list(struct prio_tree_root *root, unsigned long h_pgoff) | 270 | hugetlb_vmtruncate_list(struct prio_tree_root *root, pgoff_t pgoff) |
280 | { | 271 | { |
281 | struct vm_area_struct *vma; | 272 | struct vm_area_struct *vma; |
282 | struct prio_tree_iter iter; | 273 | struct prio_tree_iter iter; |
283 | 274 | ||
284 | vma_prio_tree_foreach(vma, &iter, root, h_pgoff, ULONG_MAX) { | 275 | vma_prio_tree_foreach(vma, &iter, root, pgoff, ULONG_MAX) { |
285 | unsigned long h_vm_pgoff; | ||
286 | unsigned long v_offset; | 276 | unsigned long v_offset; |
287 | 277 | ||
288 | h_vm_pgoff = vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT); | ||
289 | v_offset = (h_pgoff - h_vm_pgoff) << HPAGE_SHIFT; | ||
290 | /* | 278 | /* |
291 | * Is this VMA fully outside the truncation point? | 279 | * Can the expression below overflow on 32-bit arches? |
280 | * No, because the prio_tree returns us only those vmas | ||
281 | * which overlap the truncated area starting at pgoff, | ||
282 | * and no vma on a 32-bit arch can span beyond the 4GB. | ||
292 | */ | 283 | */ |
293 | if (h_vm_pgoff >= h_pgoff) | 284 | if (vma->vm_pgoff < pgoff) |
285 | v_offset = (pgoff - vma->vm_pgoff) << PAGE_SHIFT; | ||
286 | else | ||
294 | v_offset = 0; | 287 | v_offset = 0; |
295 | 288 | ||
296 | __unmap_hugepage_range(vma, | 289 | __unmap_hugepage_range(vma, |
@@ -303,14 +296,14 @@ hugetlb_vmtruncate_list(struct prio_tree_root *root, unsigned long h_pgoff) | |||
303 | */ | 296 | */ |
304 | static int hugetlb_vmtruncate(struct inode *inode, loff_t offset) | 297 | static int hugetlb_vmtruncate(struct inode *inode, loff_t offset) |
305 | { | 298 | { |
306 | unsigned long pgoff; | 299 | pgoff_t pgoff; |
307 | struct address_space *mapping = inode->i_mapping; | 300 | struct address_space *mapping = inode->i_mapping; |
308 | 301 | ||
309 | if (offset > inode->i_size) | 302 | if (offset > inode->i_size) |
310 | return -EINVAL; | 303 | return -EINVAL; |
311 | 304 | ||
312 | BUG_ON(offset & ~HPAGE_MASK); | 305 | BUG_ON(offset & ~HPAGE_MASK); |
313 | pgoff = offset >> HPAGE_SHIFT; | 306 | pgoff = offset >> PAGE_SHIFT; |
314 | 307 | ||
315 | inode->i_size = offset; | 308 | inode->i_size = offset; |
316 | spin_lock(&mapping->i_mmap_lock); | 309 | spin_lock(&mapping->i_mmap_lock); |
@@ -624,7 +617,6 @@ hugetlbfs_parse_options(char *options, struct hugetlbfs_config *pconfig) | |||
624 | do_div(size, 100); | 617 | do_div(size, 100); |
625 | rest++; | 618 | rest++; |
626 | } | 619 | } |
627 | size &= HPAGE_MASK; | ||
628 | pconfig->nr_blocks = (size >> HPAGE_SHIFT); | 620 | pconfig->nr_blocks = (size >> HPAGE_SHIFT); |
629 | value = rest; | 621 | value = rest; |
630 | } else if (!strcmp(opt,"nr_inodes")) { | 622 | } else if (!strcmp(opt,"nr_inodes")) { |
diff --git a/fs/inode.c b/fs/inode.c index d9a21d122926..26cdb115ce67 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
@@ -1306,6 +1306,42 @@ void wake_up_inode(struct inode *inode) | |||
1306 | wake_up_bit(&inode->i_state, __I_LOCK); | 1306 | wake_up_bit(&inode->i_state, __I_LOCK); |
1307 | } | 1307 | } |
1308 | 1308 | ||
1309 | /* | ||
1310 | * We rarely want to lock two inodes that do not have a parent/child | ||
1311 | * relationship (such as directory, child inode) simultaneously. The | ||
1312 | * vast majority of file systems should be able to get along fine | ||
1313 | * without this. Do not use these functions except as a last resort. | ||
1314 | */ | ||
1315 | void inode_double_lock(struct inode *inode1, struct inode *inode2) | ||
1316 | { | ||
1317 | if (inode1 == NULL || inode2 == NULL || inode1 == inode2) { | ||
1318 | if (inode1) | ||
1319 | mutex_lock(&inode1->i_mutex); | ||
1320 | else if (inode2) | ||
1321 | mutex_lock(&inode2->i_mutex); | ||
1322 | return; | ||
1323 | } | ||
1324 | |||
1325 | if (inode1 < inode2) { | ||
1326 | mutex_lock_nested(&inode1->i_mutex, I_MUTEX_PARENT); | ||
1327 | mutex_lock_nested(&inode2->i_mutex, I_MUTEX_CHILD); | ||
1328 | } else { | ||
1329 | mutex_lock_nested(&inode2->i_mutex, I_MUTEX_PARENT); | ||
1330 | mutex_lock_nested(&inode1->i_mutex, I_MUTEX_CHILD); | ||
1331 | } | ||
1332 | } | ||
1333 | EXPORT_SYMBOL(inode_double_lock); | ||
1334 | |||
1335 | void inode_double_unlock(struct inode *inode1, struct inode *inode2) | ||
1336 | { | ||
1337 | if (inode1) | ||
1338 | mutex_unlock(&inode1->i_mutex); | ||
1339 | |||
1340 | if (inode2 && inode2 != inode1) | ||
1341 | mutex_unlock(&inode2->i_mutex); | ||
1342 | } | ||
1343 | EXPORT_SYMBOL(inode_double_unlock); | ||
1344 | |||
1309 | static __initdata unsigned long ihash_entries; | 1345 | static __initdata unsigned long ihash_entries; |
1310 | static int __init set_ihash_entries(char *str) | 1346 | static int __init set_ihash_entries(char *str) |
1311 | { | 1347 | { |
diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c index d5c63047a8b3..4f82bcd63e48 100644 --- a/fs/jbd/transaction.c +++ b/fs/jbd/transaction.c | |||
@@ -967,6 +967,13 @@ int journal_dirty_data(handle_t *handle, struct buffer_head *bh) | |||
967 | */ | 967 | */ |
968 | jbd_lock_bh_state(bh); | 968 | jbd_lock_bh_state(bh); |
969 | spin_lock(&journal->j_list_lock); | 969 | spin_lock(&journal->j_list_lock); |
970 | |||
971 | /* Now that we have bh_state locked, are we really still mapped? */ | ||
972 | if (!buffer_mapped(bh)) { | ||
973 | JBUFFER_TRACE(jh, "unmapped buffer, bailing out"); | ||
974 | goto no_journal; | ||
975 | } | ||
976 | |||
970 | if (jh->b_transaction) { | 977 | if (jh->b_transaction) { |
971 | JBUFFER_TRACE(jh, "has transaction"); | 978 | JBUFFER_TRACE(jh, "has transaction"); |
972 | if (jh->b_transaction != handle->h_transaction) { | 979 | if (jh->b_transaction != handle->h_transaction) { |
@@ -1028,6 +1035,11 @@ int journal_dirty_data(handle_t *handle, struct buffer_head *bh) | |||
1028 | sync_dirty_buffer(bh); | 1035 | sync_dirty_buffer(bh); |
1029 | jbd_lock_bh_state(bh); | 1036 | jbd_lock_bh_state(bh); |
1030 | spin_lock(&journal->j_list_lock); | 1037 | spin_lock(&journal->j_list_lock); |
1038 | /* Since we dropped the lock... */ | ||
1039 | if (!buffer_mapped(bh)) { | ||
1040 | JBUFFER_TRACE(jh, "buffer got unmapped"); | ||
1041 | goto no_journal; | ||
1042 | } | ||
1031 | /* The buffer may become locked again at any | 1043 | /* The buffer may become locked again at any |
1032 | time if it is redirtied */ | 1044 | time if it is redirtied */ |
1033 | } | 1045 | } |
@@ -1824,6 +1836,7 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) | |||
1824 | } | 1836 | } |
1825 | } | 1837 | } |
1826 | } else if (transaction == journal->j_committing_transaction) { | 1838 | } else if (transaction == journal->j_committing_transaction) { |
1839 | JBUFFER_TRACE(jh, "on committing transaction"); | ||
1827 | if (jh->b_jlist == BJ_Locked) { | 1840 | if (jh->b_jlist == BJ_Locked) { |
1828 | /* | 1841 | /* |
1829 | * The buffer is on the committing transaction's locked | 1842 | * The buffer is on the committing transaction's locked |
@@ -1838,7 +1851,6 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) | |||
1838 | * can remove it's next_transaction pointer from the | 1851 | * can remove it's next_transaction pointer from the |
1839 | * running transaction if that is set, but nothing | 1852 | * running transaction if that is set, but nothing |
1840 | * else. */ | 1853 | * else. */ |
1841 | JBUFFER_TRACE(jh, "on committing transaction"); | ||
1842 | set_buffer_freed(bh); | 1854 | set_buffer_freed(bh); |
1843 | if (jh->b_next_transaction) { | 1855 | if (jh->b_next_transaction) { |
1844 | J_ASSERT(jh->b_next_transaction == | 1856 | J_ASSERT(jh->b_next_transaction == |
@@ -1858,6 +1870,7 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) | |||
1858 | * i_size already for this truncate so recovery will not | 1870 | * i_size already for this truncate so recovery will not |
1859 | * expose the disk blocks we are discarding here.) */ | 1871 | * expose the disk blocks we are discarding here.) */ |
1860 | J_ASSERT_JH(jh, transaction == journal->j_running_transaction); | 1872 | J_ASSERT_JH(jh, transaction == journal->j_running_transaction); |
1873 | JBUFFER_TRACE(jh, "on running transaction"); | ||
1861 | may_free = __dispose_buffer(jh, transaction); | 1874 | may_free = __dispose_buffer(jh, transaction); |
1862 | } | 1875 | } |
1863 | 1876 | ||
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index b6cf2be845a1..c051a94c8a97 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c | |||
@@ -967,6 +967,13 @@ int jbd2_journal_dirty_data(handle_t *handle, struct buffer_head *bh) | |||
967 | */ | 967 | */ |
968 | jbd_lock_bh_state(bh); | 968 | jbd_lock_bh_state(bh); |
969 | spin_lock(&journal->j_list_lock); | 969 | spin_lock(&journal->j_list_lock); |
970 | |||
971 | /* Now that we have bh_state locked, are we really still mapped? */ | ||
972 | if (!buffer_mapped(bh)) { | ||
973 | JBUFFER_TRACE(jh, "unmapped buffer, bailing out"); | ||
974 | goto no_journal; | ||
975 | } | ||
976 | |||
970 | if (jh->b_transaction) { | 977 | if (jh->b_transaction) { |
971 | JBUFFER_TRACE(jh, "has transaction"); | 978 | JBUFFER_TRACE(jh, "has transaction"); |
972 | if (jh->b_transaction != handle->h_transaction) { | 979 | if (jh->b_transaction != handle->h_transaction) { |
@@ -1028,6 +1035,11 @@ int jbd2_journal_dirty_data(handle_t *handle, struct buffer_head *bh) | |||
1028 | sync_dirty_buffer(bh); | 1035 | sync_dirty_buffer(bh); |
1029 | jbd_lock_bh_state(bh); | 1036 | jbd_lock_bh_state(bh); |
1030 | spin_lock(&journal->j_list_lock); | 1037 | spin_lock(&journal->j_list_lock); |
1038 | /* Since we dropped the lock... */ | ||
1039 | if (!buffer_mapped(bh)) { | ||
1040 | JBUFFER_TRACE(jh, "buffer got unmapped"); | ||
1041 | goto no_journal; | ||
1042 | } | ||
1031 | /* The buffer may become locked again at any | 1043 | /* The buffer may become locked again at any |
1032 | time if it is redirtied */ | 1044 | time if it is redirtied */ |
1033 | } | 1045 | } |
@@ -1824,6 +1836,7 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) | |||
1824 | } | 1836 | } |
1825 | } | 1837 | } |
1826 | } else if (transaction == journal->j_committing_transaction) { | 1838 | } else if (transaction == journal->j_committing_transaction) { |
1839 | JBUFFER_TRACE(jh, "on committing transaction"); | ||
1827 | if (jh->b_jlist == BJ_Locked) { | 1840 | if (jh->b_jlist == BJ_Locked) { |
1828 | /* | 1841 | /* |
1829 | * The buffer is on the committing transaction's locked | 1842 | * The buffer is on the committing transaction's locked |
@@ -1838,7 +1851,6 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) | |||
1838 | * can remove it's next_transaction pointer from the | 1851 | * can remove it's next_transaction pointer from the |
1839 | * running transaction if that is set, but nothing | 1852 | * running transaction if that is set, but nothing |
1840 | * else. */ | 1853 | * else. */ |
1841 | JBUFFER_TRACE(jh, "on committing transaction"); | ||
1842 | set_buffer_freed(bh); | 1854 | set_buffer_freed(bh); |
1843 | if (jh->b_next_transaction) { | 1855 | if (jh->b_next_transaction) { |
1844 | J_ASSERT(jh->b_next_transaction == | 1856 | J_ASSERT(jh->b_next_transaction == |
@@ -1858,6 +1870,7 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) | |||
1858 | * i_size already for this truncate so recovery will not | 1870 | * i_size already for this truncate so recovery will not |
1859 | * expose the disk blocks we are discarding here.) */ | 1871 | * expose the disk blocks we are discarding here.) */ |
1860 | J_ASSERT_JH(jh, transaction == journal->j_running_transaction); | 1872 | J_ASSERT_JH(jh, transaction == journal->j_running_transaction); |
1873 | JBUFFER_TRACE(jh, "on running transaction"); | ||
1861 | may_free = __dispose_buffer(jh, transaction); | 1874 | may_free = __dispose_buffer(jh, transaction); |
1862 | } | 1875 | } |
1863 | 1876 | ||
diff --git a/fs/jfs/file.c b/fs/jfs/file.c index 34181b8f5a0a..aa9132d04920 100644 --- a/fs/jfs/file.c +++ b/fs/jfs/file.c | |||
@@ -109,6 +109,8 @@ const struct file_operations jfs_file_operations = { | |||
109 | .aio_write = generic_file_aio_write, | 109 | .aio_write = generic_file_aio_write, |
110 | .mmap = generic_file_mmap, | 110 | .mmap = generic_file_mmap, |
111 | .sendfile = generic_file_sendfile, | 111 | .sendfile = generic_file_sendfile, |
112 | .splice_read = generic_file_splice_read, | ||
113 | .splice_write = generic_file_splice_write, | ||
112 | .fsync = jfs_fsync, | 114 | .fsync = jfs_fsync, |
113 | .release = jfs_release, | 115 | .release = jfs_release, |
114 | .ioctl = jfs_ioctl, | 116 | .ioctl = jfs_ioctl, |
diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c index 489a3d63002d..ee9b473b7b80 100644 --- a/fs/jfs/jfs_imap.c +++ b/fs/jfs/jfs_imap.c | |||
@@ -318,7 +318,7 @@ int diRead(struct inode *ip) | |||
318 | struct inomap *imap; | 318 | struct inomap *imap; |
319 | int block_offset; | 319 | int block_offset; |
320 | int inodes_left; | 320 | int inodes_left; |
321 | uint pageno; | 321 | unsigned long pageno; |
322 | int rel_inode; | 322 | int rel_inode; |
323 | 323 | ||
324 | jfs_info("diRead: ino = %ld", ip->i_ino); | 324 | jfs_info("diRead: ino = %ld", ip->i_ino); |
@@ -606,7 +606,7 @@ int diWrite(tid_t tid, struct inode *ip) | |||
606 | int block_offset; | 606 | int block_offset; |
607 | int inodes_left; | 607 | int inodes_left; |
608 | struct metapage *mp; | 608 | struct metapage *mp; |
609 | uint pageno; | 609 | unsigned long pageno; |
610 | int rel_inode; | 610 | int rel_inode; |
611 | int dioffset; | 611 | int dioffset; |
612 | struct inode *ipimap; | 612 | struct inode *ipimap; |
diff --git a/fs/jfs/xattr.c b/fs/jfs/xattr.c index 4c7985ebca92..b753ba216450 100644 --- a/fs/jfs/xattr.c +++ b/fs/jfs/xattr.c | |||
@@ -756,6 +756,11 @@ static int can_set_system_xattr(struct inode *inode, const char *name, | |||
756 | return -EOPNOTSUPP; | 756 | return -EOPNOTSUPP; |
757 | } | 757 | } |
758 | 758 | ||
759 | /* | ||
760 | * Most of the permission checking is done by xattr_permission in the vfs. | ||
761 | * The local file system is responsible for handling the system.* namespace. | ||
762 | * We also need to verify that this is a namespace that we recognize. | ||
763 | */ | ||
759 | static int can_set_xattr(struct inode *inode, const char *name, | 764 | static int can_set_xattr(struct inode *inode, const char *name, |
760 | const void *value, size_t value_len) | 765 | const void *value, size_t value_len) |
761 | { | 766 | { |
@@ -771,10 +776,6 @@ static int can_set_xattr(struct inode *inode, const char *name, | |||
771 | strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN)) | 776 | strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN)) |
772 | return -EOPNOTSUPP; | 777 | return -EOPNOTSUPP; |
773 | 778 | ||
774 | if (!S_ISREG(inode->i_mode) && | ||
775 | (!S_ISDIR(inode->i_mode) || inode->i_mode &S_ISVTX)) | ||
776 | return -EPERM; | ||
777 | |||
778 | return 0; | 779 | return 0; |
779 | } | 780 | } |
780 | 781 | ||
diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c index 634139232aaf..8ca18085e68d 100644 --- a/fs/lockd/svc.c +++ b/fs/lockd/svc.c | |||
@@ -353,9 +353,6 @@ EXPORT_SYMBOL(lockd_down); | |||
353 | * Sysctl parameters (same as module parameters, different interface). | 353 | * Sysctl parameters (same as module parameters, different interface). |
354 | */ | 354 | */ |
355 | 355 | ||
356 | /* Something that isn't CTL_ANY, CTL_NONE or a value that may clash. */ | ||
357 | #define CTL_UNNUMBERED -2 | ||
358 | |||
359 | static ctl_table nlm_sysctls[] = { | 356 | static ctl_table nlm_sysctls[] = { |
360 | { | 357 | { |
361 | .ctl_name = CTL_UNNUMBERED, | 358 | .ctl_name = CTL_UNNUMBERED, |
diff --git a/fs/msdos/namei.c b/fs/msdos/namei.c index b0f01b3b0536..452461955cbd 100644 --- a/fs/msdos/namei.c +++ b/fs/msdos/namei.c | |||
@@ -654,6 +654,7 @@ static struct inode_operations msdos_dir_inode_operations = { | |||
654 | .rmdir = msdos_rmdir, | 654 | .rmdir = msdos_rmdir, |
655 | .rename = msdos_rename, | 655 | .rename = msdos_rename, |
656 | .setattr = fat_notify_change, | 656 | .setattr = fat_notify_change, |
657 | .getattr = fat_getattr, | ||
657 | }; | 658 | }; |
658 | 659 | ||
659 | static int msdos_fill_super(struct super_block *sb, void *data, int silent) | 660 | static int msdos_fill_super(struct super_block *sb, void *data, int silent) |
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 4133ef5264e5..b34cd16f472f 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -935,8 +935,17 @@ static struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, stru | |||
935 | 935 | ||
936 | no_entry: | 936 | no_entry: |
937 | res = d_materialise_unique(dentry, inode); | 937 | res = d_materialise_unique(dentry, inode); |
938 | if (res != NULL) | 938 | if (res != NULL) { |
939 | struct dentry *parent; | ||
940 | if (IS_ERR(res)) | ||
941 | goto out_unlock; | ||
942 | /* Was a directory renamed! */ | ||
943 | parent = dget_parent(res); | ||
944 | if (!IS_ROOT(parent)) | ||
945 | nfs_mark_for_revalidate(parent->d_inode); | ||
946 | dput(parent); | ||
939 | dentry = res; | 947 | dentry = res; |
948 | } | ||
940 | nfs_renew_times(dentry); | 949 | nfs_renew_times(dentry); |
941 | nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); | 950 | nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); |
942 | out_unlock: | 951 | out_unlock: |
@@ -1132,6 +1141,8 @@ static struct dentry *nfs_readdir_lookup(nfs_readdir_descriptor_t *desc) | |||
1132 | alias = d_materialise_unique(dentry, inode); | 1141 | alias = d_materialise_unique(dentry, inode); |
1133 | if (alias != NULL) { | 1142 | if (alias != NULL) { |
1134 | dput(dentry); | 1143 | dput(dentry); |
1144 | if (IS_ERR(alias)) | ||
1145 | return NULL; | ||
1135 | dentry = alias; | 1146 | dentry = alias; |
1136 | } | 1147 | } |
1137 | 1148 | ||
diff --git a/fs/nfs/sysctl.c b/fs/nfs/sysctl.c index 2fe3403c2409..3ea50ac64820 100644 --- a/fs/nfs/sysctl.c +++ b/fs/nfs/sysctl.c | |||
@@ -18,11 +18,6 @@ | |||
18 | static const int nfs_set_port_min = 0; | 18 | static const int nfs_set_port_min = 0; |
19 | static const int nfs_set_port_max = 65535; | 19 | static const int nfs_set_port_max = 65535; |
20 | static struct ctl_table_header *nfs_callback_sysctl_table; | 20 | static struct ctl_table_header *nfs_callback_sysctl_table; |
21 | /* | ||
22 | * Something that isn't CTL_ANY, CTL_NONE or a value that may clash. | ||
23 | * Use the same values as fs/lockd/svc.c | ||
24 | */ | ||
25 | #define CTL_UNNUMBERED -2 | ||
26 | 21 | ||
27 | static ctl_table nfs_cb_sysctls[] = { | 22 | static ctl_table nfs_cb_sysctls[] = { |
28 | #ifdef CONFIG_NFS_V4 | 23 | #ifdef CONFIG_NFS_V4 |
diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c index 64db601c2bd2..7f5bad0393b1 100644 --- a/fs/nfsd/nfs3proc.c +++ b/fs/nfsd/nfs3proc.c | |||
@@ -258,7 +258,7 @@ nfsd3_proc_create(struct svc_rqst *rqstp, struct nfsd3_createargs *argp, | |||
258 | /* Now create the file and set attributes */ | 258 | /* Now create the file and set attributes */ |
259 | nfserr = nfsd_create_v3(rqstp, dirfhp, argp->name, argp->len, | 259 | nfserr = nfsd_create_v3(rqstp, dirfhp, argp->name, argp->len, |
260 | attr, newfhp, | 260 | attr, newfhp, |
261 | argp->createmode, argp->verf, NULL); | 261 | argp->createmode, argp->verf, NULL, NULL); |
262 | 262 | ||
263 | RETURN_STATUS(nfserr); | 263 | RETURN_STATUS(nfserr); |
264 | } | 264 | } |
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index 0a7bbdc4a10a..50bc94243ca1 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c | |||
@@ -93,6 +93,7 @@ do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_o | |||
93 | { | 93 | { |
94 | struct svc_fh resfh; | 94 | struct svc_fh resfh; |
95 | __be32 status; | 95 | __be32 status; |
96 | int created = 0; | ||
96 | 97 | ||
97 | fh_init(&resfh, NFS4_FHSIZE); | 98 | fh_init(&resfh, NFS4_FHSIZE); |
98 | open->op_truncate = 0; | 99 | open->op_truncate = 0; |
@@ -105,28 +106,27 @@ do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_o | |||
105 | status = nfsd_create_v3(rqstp, current_fh, open->op_fname.data, | 106 | status = nfsd_create_v3(rqstp, current_fh, open->op_fname.data, |
106 | open->op_fname.len, &open->op_iattr, | 107 | open->op_fname.len, &open->op_iattr, |
107 | &resfh, open->op_createmode, | 108 | &resfh, open->op_createmode, |
108 | (u32 *)open->op_verf.data, &open->op_truncate); | 109 | (u32 *)open->op_verf.data, &open->op_truncate, &created); |
109 | } | 110 | } else { |
110 | else { | ||
111 | status = nfsd_lookup(rqstp, current_fh, | 111 | status = nfsd_lookup(rqstp, current_fh, |
112 | open->op_fname.data, open->op_fname.len, &resfh); | 112 | open->op_fname.data, open->op_fname.len, &resfh); |
113 | fh_unlock(current_fh); | 113 | fh_unlock(current_fh); |
114 | } | 114 | } |
115 | if (status) | ||
116 | goto out; | ||
115 | 117 | ||
116 | if (!status) { | 118 | set_change_info(&open->op_cinfo, current_fh); |
117 | set_change_info(&open->op_cinfo, current_fh); | ||
118 | 119 | ||
119 | /* set reply cache */ | 120 | /* set reply cache */ |
120 | fh_dup2(current_fh, &resfh); | 121 | fh_dup2(current_fh, &resfh); |
121 | open->op_stateowner->so_replay.rp_openfh_len = | 122 | open->op_stateowner->so_replay.rp_openfh_len = resfh.fh_handle.fh_size; |
122 | resfh.fh_handle.fh_size; | 123 | memcpy(open->op_stateowner->so_replay.rp_openfh, |
123 | memcpy(open->op_stateowner->so_replay.rp_openfh, | 124 | &resfh.fh_handle.fh_base, resfh.fh_handle.fh_size); |
124 | &resfh.fh_handle.fh_base, | ||
125 | resfh.fh_handle.fh_size); | ||
126 | 125 | ||
126 | if (!created) | ||
127 | status = do_open_permission(rqstp, current_fh, open, MAY_NOP); | 127 | status = do_open_permission(rqstp, current_fh, open, MAY_NOP); |
128 | } | ||
129 | 128 | ||
129 | out: | ||
130 | fh_put(&resfh); | 130 | fh_put(&resfh); |
131 | return status; | 131 | return status; |
132 | } | 132 | } |
diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c index e9d07704680e..81b8565d3837 100644 --- a/fs/nfsd/nfs4recover.c +++ b/fs/nfsd/nfs4recover.c | |||
@@ -274,7 +274,7 @@ nfsd4_clear_clid_dir(struct dentry *dir, struct dentry *dentry) | |||
274 | * any regular files anyway, just in case the directory was created by | 274 | * any regular files anyway, just in case the directory was created by |
275 | * a kernel from the future.... */ | 275 | * a kernel from the future.... */ |
276 | nfsd4_list_rec_dir(dentry, nfsd4_remove_clid_file); | 276 | nfsd4_list_rec_dir(dentry, nfsd4_remove_clid_file); |
277 | mutex_lock(&dir->d_inode->i_mutex); | 277 | mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT); |
278 | status = vfs_rmdir(dir->d_inode, dentry); | 278 | status = vfs_rmdir(dir->d_inode, dentry); |
279 | mutex_unlock(&dir->d_inode->i_mutex); | 279 | mutex_unlock(&dir->d_inode->i_mutex); |
280 | return status; | 280 | return status; |
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index f21e917bb8ed..bb4d926e4487 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -1177,7 +1177,7 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1177 | /* | 1177 | /* |
1178 | * Get the dir op function pointer. | 1178 | * Get the dir op function pointer. |
1179 | */ | 1179 | */ |
1180 | err = nfserr_perm; | 1180 | err = 0; |
1181 | switch (type) { | 1181 | switch (type) { |
1182 | case S_IFREG: | 1182 | case S_IFREG: |
1183 | host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL); | 1183 | host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL); |
@@ -1237,7 +1237,7 @@ __be32 | |||
1237 | nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, | 1237 | nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, |
1238 | char *fname, int flen, struct iattr *iap, | 1238 | char *fname, int flen, struct iattr *iap, |
1239 | struct svc_fh *resfhp, int createmode, u32 *verifier, | 1239 | struct svc_fh *resfhp, int createmode, u32 *verifier, |
1240 | int *truncp) | 1240 | int *truncp, int *created) |
1241 | { | 1241 | { |
1242 | struct dentry *dentry, *dchild = NULL; | 1242 | struct dentry *dentry, *dchild = NULL; |
1243 | struct inode *dirp; | 1243 | struct inode *dirp; |
@@ -1331,6 +1331,8 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1331 | host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL); | 1331 | host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL); |
1332 | if (host_err < 0) | 1332 | if (host_err < 0) |
1333 | goto out_nfserr; | 1333 | goto out_nfserr; |
1334 | if (created) | ||
1335 | *created = 1; | ||
1334 | 1336 | ||
1335 | if (EX_ISSYNC(fhp->fh_export)) { | 1337 | if (EX_ISSYNC(fhp->fh_export)) { |
1336 | err = nfserrno(nfsd_sync_dir(dentry)); | 1338 | err = nfserrno(nfsd_sync_dir(dentry)); |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 8df27401d292..795319c54f72 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -442,7 +442,8 @@ static int mountstats_open(struct inode *inode, struct file *file) | |||
442 | 442 | ||
443 | if (task) { | 443 | if (task) { |
444 | task_lock(task); | 444 | task_lock(task); |
445 | namespace = task->nsproxy->namespace; | 445 | if (task->nsproxy) |
446 | namespace = task->nsproxy->namespace; | ||
446 | if (namespace) | 447 | if (namespace) |
447 | get_namespace(namespace); | 448 | get_namespace(namespace); |
448 | task_unlock(task); | 449 | task_unlock(task); |
diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c index b67ce9354048..ac14318c81ba 100644 --- a/fs/reiserfs/file.c +++ b/fs/reiserfs/file.c | |||
@@ -74,7 +74,8 @@ static int reiserfs_file_release(struct inode *inode, struct file *filp) | |||
74 | igrab(inode); | 74 | igrab(inode); |
75 | reiserfs_warning(inode->i_sb, | 75 | reiserfs_warning(inode->i_sb, |
76 | "pinning inode %lu because the " | 76 | "pinning inode %lu because the " |
77 | "preallocation can't be freed"); | 77 | "preallocation can't be freed", |
78 | inode->i_ino); | ||
78 | goto out; | 79 | goto out; |
79 | } | 80 | } |
80 | } | 81 | } |
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 9041802df832..17249994110f 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
@@ -1619,6 +1619,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) | |||
1619 | "jmacd-8: reiserfs_fill_super: unable to read bitmap"); | 1619 | "jmacd-8: reiserfs_fill_super: unable to read bitmap"); |
1620 | goto error; | 1620 | goto error; |
1621 | } | 1621 | } |
1622 | errval = -EINVAL; | ||
1622 | #ifdef CONFIG_REISERFS_CHECK | 1623 | #ifdef CONFIG_REISERFS_CHECK |
1623 | SWARN(silent, s, "CONFIG_REISERFS_CHECK is set ON"); | 1624 | SWARN(silent, s, "CONFIG_REISERFS_CHECK is set ON"); |
1624 | SWARN(silent, s, "- it is slow mode for debugging."); | 1625 | SWARN(silent, s, "- it is slow mode for debugging."); |
diff --git a/fs/splice.c b/fs/splice.c index a567010b62ac..da74583a00ee 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -74,7 +74,7 @@ static int page_cache_pipe_buf_steal(struct pipe_inode_info *pipe, | |||
74 | wait_on_page_writeback(page); | 74 | wait_on_page_writeback(page); |
75 | 75 | ||
76 | if (PagePrivate(page)) | 76 | if (PagePrivate(page)) |
77 | try_to_release_page(page, mapping_gfp_mask(mapping)); | 77 | try_to_release_page(page, GFP_KERNEL); |
78 | 78 | ||
79 | /* | 79 | /* |
80 | * If we succeeded in removing the mapping, set LRU flag | 80 | * If we succeeded in removing the mapping, set LRU flag |
@@ -333,7 +333,7 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, | |||
333 | break; | 333 | break; |
334 | 334 | ||
335 | error = add_to_page_cache_lru(page, mapping, index, | 335 | error = add_to_page_cache_lru(page, mapping, index, |
336 | mapping_gfp_mask(mapping)); | 336 | GFP_KERNEL); |
337 | if (unlikely(error)) { | 337 | if (unlikely(error)) { |
338 | page_cache_release(page); | 338 | page_cache_release(page); |
339 | if (error == -EEXIST) | 339 | if (error == -EEXIST) |
@@ -557,7 +557,6 @@ static int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf, | |||
557 | { | 557 | { |
558 | struct file *file = sd->file; | 558 | struct file *file = sd->file; |
559 | struct address_space *mapping = file->f_mapping; | 559 | struct address_space *mapping = file->f_mapping; |
560 | gfp_t gfp_mask = mapping_gfp_mask(mapping); | ||
561 | unsigned int offset, this_len; | 560 | unsigned int offset, this_len; |
562 | struct page *page; | 561 | struct page *page; |
563 | pgoff_t index; | 562 | pgoff_t index; |
@@ -591,7 +590,7 @@ static int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf, | |||
591 | goto find_page; | 590 | goto find_page; |
592 | 591 | ||
593 | page = buf->page; | 592 | page = buf->page; |
594 | if (add_to_page_cache(page, mapping, index, gfp_mask)) { | 593 | if (add_to_page_cache(page, mapping, index, GFP_KERNEL)) { |
595 | unlock_page(page); | 594 | unlock_page(page); |
596 | goto find_page; | 595 | goto find_page; |
597 | } | 596 | } |
@@ -613,7 +612,7 @@ find_page: | |||
613 | * This will also lock the page | 612 | * This will also lock the page |
614 | */ | 613 | */ |
615 | ret = add_to_page_cache_lru(page, mapping, index, | 614 | ret = add_to_page_cache_lru(page, mapping, index, |
616 | gfp_mask); | 615 | GFP_KERNEL); |
617 | if (unlikely(ret)) | 616 | if (unlikely(ret)) |
618 | goto out; | 617 | goto out; |
619 | } | 618 | } |
@@ -707,9 +706,9 @@ out_ret: | |||
707 | * key here is the 'actor' worker passed in that actually moves the data | 706 | * key here is the 'actor' worker passed in that actually moves the data |
708 | * to the wanted destination. See pipe_to_file/pipe_to_sendpage above. | 707 | * to the wanted destination. See pipe_to_file/pipe_to_sendpage above. |
709 | */ | 708 | */ |
710 | ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, | 709 | static ssize_t __splice_from_pipe(struct pipe_inode_info *pipe, |
711 | loff_t *ppos, size_t len, unsigned int flags, | 710 | struct file *out, loff_t *ppos, size_t len, |
712 | splice_actor *actor) | 711 | unsigned int flags, splice_actor *actor) |
713 | { | 712 | { |
714 | int ret, do_wakeup, err; | 713 | int ret, do_wakeup, err; |
715 | struct splice_desc sd; | 714 | struct splice_desc sd; |
@@ -722,9 +721,6 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, | |||
722 | sd.file = out; | 721 | sd.file = out; |
723 | sd.pos = *ppos; | 722 | sd.pos = *ppos; |
724 | 723 | ||
725 | if (pipe->inode) | ||
726 | mutex_lock(&pipe->inode->i_mutex); | ||
727 | |||
728 | for (;;) { | 724 | for (;;) { |
729 | if (pipe->nrbufs) { | 725 | if (pipe->nrbufs) { |
730 | struct pipe_buffer *buf = pipe->bufs + pipe->curbuf; | 726 | struct pipe_buffer *buf = pipe->bufs + pipe->curbuf; |
@@ -797,9 +793,6 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, | |||
797 | pipe_wait(pipe); | 793 | pipe_wait(pipe); |
798 | } | 794 | } |
799 | 795 | ||
800 | if (pipe->inode) | ||
801 | mutex_unlock(&pipe->inode->i_mutex); | ||
802 | |||
803 | if (do_wakeup) { | 796 | if (do_wakeup) { |
804 | smp_mb(); | 797 | smp_mb(); |
805 | if (waitqueue_active(&pipe->wait)) | 798 | if (waitqueue_active(&pipe->wait)) |
@@ -810,6 +803,73 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, | |||
810 | return ret; | 803 | return ret; |
811 | } | 804 | } |
812 | 805 | ||
806 | ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, | ||
807 | loff_t *ppos, size_t len, unsigned int flags, | ||
808 | splice_actor *actor) | ||
809 | { | ||
810 | ssize_t ret; | ||
811 | struct inode *inode = out->f_mapping->host; | ||
812 | |||
813 | /* | ||
814 | * The actor worker might be calling ->prepare_write and | ||
815 | * ->commit_write. Most of the time, these expect i_mutex to | ||
816 | * be held. Since this may result in an ABBA deadlock with | ||
817 | * pipe->inode, we have to order lock acquiry here. | ||
818 | */ | ||
819 | inode_double_lock(inode, pipe->inode); | ||
820 | ret = __splice_from_pipe(pipe, out, ppos, len, flags, actor); | ||
821 | inode_double_unlock(inode, pipe->inode); | ||
822 | |||
823 | return ret; | ||
824 | } | ||
825 | |||
826 | /** | ||
827 | * generic_file_splice_write_nolock - generic_file_splice_write without mutexes | ||
828 | * @pipe: pipe info | ||
829 | * @out: file to write to | ||
830 | * @len: number of bytes to splice | ||
831 | * @flags: splice modifier flags | ||
832 | * | ||
833 | * Will either move or copy pages (determined by @flags options) from | ||
834 | * the given pipe inode to the given file. The caller is responsible | ||
835 | * for acquiring i_mutex on both inodes. | ||
836 | * | ||
837 | */ | ||
838 | ssize_t | ||
839 | generic_file_splice_write_nolock(struct pipe_inode_info *pipe, struct file *out, | ||
840 | loff_t *ppos, size_t len, unsigned int flags) | ||
841 | { | ||
842 | struct address_space *mapping = out->f_mapping; | ||
843 | struct inode *inode = mapping->host; | ||
844 | ssize_t ret; | ||
845 | int err; | ||
846 | |||
847 | err = remove_suid(out->f_dentry); | ||
848 | if (unlikely(err)) | ||
849 | return err; | ||
850 | |||
851 | ret = __splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_file); | ||
852 | if (ret > 0) { | ||
853 | *ppos += ret; | ||
854 | |||
855 | /* | ||
856 | * If file or inode is SYNC and we actually wrote some data, | ||
857 | * sync it. | ||
858 | */ | ||
859 | if (unlikely((out->f_flags & O_SYNC) || IS_SYNC(inode))) { | ||
860 | err = generic_osync_inode(inode, mapping, | ||
861 | OSYNC_METADATA|OSYNC_DATA); | ||
862 | |||
863 | if (err) | ||
864 | ret = err; | ||
865 | } | ||
866 | } | ||
867 | |||
868 | return ret; | ||
869 | } | ||
870 | |||
871 | EXPORT_SYMBOL(generic_file_splice_write_nolock); | ||
872 | |||
813 | /** | 873 | /** |
814 | * generic_file_splice_write - splice data from a pipe to a file | 874 | * generic_file_splice_write - splice data from a pipe to a file |
815 | * @pipe: pipe info | 875 | * @pipe: pipe info |
@@ -826,12 +886,21 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out, | |||
826 | loff_t *ppos, size_t len, unsigned int flags) | 886 | loff_t *ppos, size_t len, unsigned int flags) |
827 | { | 887 | { |
828 | struct address_space *mapping = out->f_mapping; | 888 | struct address_space *mapping = out->f_mapping; |
889 | struct inode *inode = mapping->host; | ||
829 | ssize_t ret; | 890 | ssize_t ret; |
891 | int err; | ||
892 | |||
893 | err = should_remove_suid(out->f_dentry); | ||
894 | if (unlikely(err)) { | ||
895 | mutex_lock(&inode->i_mutex); | ||
896 | err = __remove_suid(out->f_dentry, err); | ||
897 | mutex_unlock(&inode->i_mutex); | ||
898 | if (err) | ||
899 | return err; | ||
900 | } | ||
830 | 901 | ||
831 | ret = splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_file); | 902 | ret = splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_file); |
832 | if (ret > 0) { | 903 | if (ret > 0) { |
833 | struct inode *inode = mapping->host; | ||
834 | |||
835 | *ppos += ret; | 904 | *ppos += ret; |
836 | 905 | ||
837 | /* | 906 | /* |
@@ -839,8 +908,6 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out, | |||
839 | * sync it. | 908 | * sync it. |
840 | */ | 909 | */ |
841 | if (unlikely((out->f_flags & O_SYNC) || IS_SYNC(inode))) { | 910 | if (unlikely((out->f_flags & O_SYNC) || IS_SYNC(inode))) { |
842 | int err; | ||
843 | |||
844 | mutex_lock(&inode->i_mutex); | 911 | mutex_lock(&inode->i_mutex); |
845 | err = generic_osync_inode(inode, mapping, | 912 | err = generic_osync_inode(inode, mapping, |
846 | OSYNC_METADATA|OSYNC_DATA); | 913 | OSYNC_METADATA|OSYNC_DATA); |
@@ -1042,6 +1109,19 @@ out_release: | |||
1042 | EXPORT_SYMBOL(do_splice_direct); | 1109 | EXPORT_SYMBOL(do_splice_direct); |
1043 | 1110 | ||
1044 | /* | 1111 | /* |
1112 | * After the inode slimming patch, i_pipe/i_bdev/i_cdev share the same | ||
1113 | * location, so checking ->i_pipe is not enough to verify that this is a | ||
1114 | * pipe. | ||
1115 | */ | ||
1116 | static inline struct pipe_inode_info *pipe_info(struct inode *inode) | ||
1117 | { | ||
1118 | if (S_ISFIFO(inode->i_mode)) | ||
1119 | return inode->i_pipe; | ||
1120 | |||
1121 | return NULL; | ||
1122 | } | ||
1123 | |||
1124 | /* | ||
1045 | * Determine where to splice to/from. | 1125 | * Determine where to splice to/from. |
1046 | */ | 1126 | */ |
1047 | static long do_splice(struct file *in, loff_t __user *off_in, | 1127 | static long do_splice(struct file *in, loff_t __user *off_in, |
@@ -1052,7 +1132,7 @@ static long do_splice(struct file *in, loff_t __user *off_in, | |||
1052 | loff_t offset, *off; | 1132 | loff_t offset, *off; |
1053 | long ret; | 1133 | long ret; |
1054 | 1134 | ||
1055 | pipe = in->f_dentry->d_inode->i_pipe; | 1135 | pipe = pipe_info(in->f_dentry->d_inode); |
1056 | if (pipe) { | 1136 | if (pipe) { |
1057 | if (off_in) | 1137 | if (off_in) |
1058 | return -ESPIPE; | 1138 | return -ESPIPE; |
@@ -1073,7 +1153,7 @@ static long do_splice(struct file *in, loff_t __user *off_in, | |||
1073 | return ret; | 1153 | return ret; |
1074 | } | 1154 | } |
1075 | 1155 | ||
1076 | pipe = out->f_dentry->d_inode->i_pipe; | 1156 | pipe = pipe_info(out->f_dentry->d_inode); |
1077 | if (pipe) { | 1157 | if (pipe) { |
1078 | if (off_out) | 1158 | if (off_out) |
1079 | return -ESPIPE; | 1159 | return -ESPIPE; |
@@ -1231,7 +1311,7 @@ static int get_iovec_page_array(const struct iovec __user *iov, | |||
1231 | static long do_vmsplice(struct file *file, const struct iovec __user *iov, | 1311 | static long do_vmsplice(struct file *file, const struct iovec __user *iov, |
1232 | unsigned long nr_segs, unsigned int flags) | 1312 | unsigned long nr_segs, unsigned int flags) |
1233 | { | 1313 | { |
1234 | struct pipe_inode_info *pipe = file->f_dentry->d_inode->i_pipe; | 1314 | struct pipe_inode_info *pipe; |
1235 | struct page *pages[PIPE_BUFFERS]; | 1315 | struct page *pages[PIPE_BUFFERS]; |
1236 | struct partial_page partial[PIPE_BUFFERS]; | 1316 | struct partial_page partial[PIPE_BUFFERS]; |
1237 | struct splice_pipe_desc spd = { | 1317 | struct splice_pipe_desc spd = { |
@@ -1241,7 +1321,8 @@ static long do_vmsplice(struct file *file, const struct iovec __user *iov, | |||
1241 | .ops = &user_page_pipe_buf_ops, | 1321 | .ops = &user_page_pipe_buf_ops, |
1242 | }; | 1322 | }; |
1243 | 1323 | ||
1244 | if (unlikely(!pipe)) | 1324 | pipe = pipe_info(file->f_dentry->d_inode); |
1325 | if (!pipe) | ||
1245 | return -EBADF; | 1326 | return -EBADF; |
1246 | if (unlikely(nr_segs > UIO_MAXIOV)) | 1327 | if (unlikely(nr_segs > UIO_MAXIOV)) |
1247 | return -EINVAL; | 1328 | return -EINVAL; |
@@ -1400,13 +1481,7 @@ static int link_pipe(struct pipe_inode_info *ipipe, | |||
1400 | * grabbing by inode address. Otherwise two different processes | 1481 | * grabbing by inode address. Otherwise two different processes |
1401 | * could deadlock (one doing tee from A -> B, the other from B -> A). | 1482 | * could deadlock (one doing tee from A -> B, the other from B -> A). |
1402 | */ | 1483 | */ |
1403 | if (ipipe->inode < opipe->inode) { | 1484 | inode_double_lock(ipipe->inode, opipe->inode); |
1404 | mutex_lock_nested(&ipipe->inode->i_mutex, I_MUTEX_PARENT); | ||
1405 | mutex_lock_nested(&opipe->inode->i_mutex, I_MUTEX_CHILD); | ||
1406 | } else { | ||
1407 | mutex_lock_nested(&opipe->inode->i_mutex, I_MUTEX_PARENT); | ||
1408 | mutex_lock_nested(&ipipe->inode->i_mutex, I_MUTEX_CHILD); | ||
1409 | } | ||
1410 | 1485 | ||
1411 | do { | 1486 | do { |
1412 | if (!opipe->readers) { | 1487 | if (!opipe->readers) { |
@@ -1450,8 +1525,7 @@ static int link_pipe(struct pipe_inode_info *ipipe, | |||
1450 | i++; | 1525 | i++; |
1451 | } while (len); | 1526 | } while (len); |
1452 | 1527 | ||
1453 | mutex_unlock(&ipipe->inode->i_mutex); | 1528 | inode_double_unlock(ipipe->inode, opipe->inode); |
1454 | mutex_unlock(&opipe->inode->i_mutex); | ||
1455 | 1529 | ||
1456 | /* | 1530 | /* |
1457 | * If we put data in the output pipe, wakeup any potential readers. | 1531 | * If we put data in the output pipe, wakeup any potential readers. |
@@ -1475,8 +1549,8 @@ static int link_pipe(struct pipe_inode_info *ipipe, | |||
1475 | static long do_tee(struct file *in, struct file *out, size_t len, | 1549 | static long do_tee(struct file *in, struct file *out, size_t len, |
1476 | unsigned int flags) | 1550 | unsigned int flags) |
1477 | { | 1551 | { |
1478 | struct pipe_inode_info *ipipe = in->f_dentry->d_inode->i_pipe; | 1552 | struct pipe_inode_info *ipipe = pipe_info(in->f_dentry->d_inode); |
1479 | struct pipe_inode_info *opipe = out->f_dentry->d_inode->i_pipe; | 1553 | struct pipe_inode_info *opipe = pipe_info(out->f_dentry->d_inode); |
1480 | int ret = -EINVAL; | 1554 | int ret = -EINVAL; |
1481 | 1555 | ||
1482 | /* | 1556 | /* |
diff --git a/fs/vfat/namei.c b/fs/vfat/namei.c index edb711ff7b05..0afd745a37cd 100644 --- a/fs/vfat/namei.c +++ b/fs/vfat/namei.c | |||
@@ -1004,6 +1004,7 @@ static struct inode_operations vfat_dir_inode_operations = { | |||
1004 | .rmdir = vfat_rmdir, | 1004 | .rmdir = vfat_rmdir, |
1005 | .rename = vfat_rename, | 1005 | .rename = vfat_rename, |
1006 | .setattr = fat_notify_change, | 1006 | .setattr = fat_notify_change, |
1007 | .getattr = fat_getattr, | ||
1007 | }; | 1008 | }; |
1008 | 1009 | ||
1009 | static int vfat_fill_super(struct super_block *sb, void *data, int silent) | 1010 | static int vfat_fill_super(struct super_block *sb, void *data, int silent) |
diff --git a/fs/xattr.c b/fs/xattr.c index 395635100f77..0901bdc2ce24 100644 --- a/fs/xattr.c +++ b/fs/xattr.c | |||
@@ -48,14 +48,21 @@ xattr_permission(struct inode *inode, const char *name, int mask) | |||
48 | return 0; | 48 | return 0; |
49 | 49 | ||
50 | /* | 50 | /* |
51 | * The trusted.* namespace can only accessed by a privilegued user. | 51 | * The trusted.* namespace can only be accessed by a privileged user. |
52 | */ | 52 | */ |
53 | if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) | 53 | if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) |
54 | return (capable(CAP_SYS_ADMIN) ? 0 : -EPERM); | 54 | return (capable(CAP_SYS_ADMIN) ? 0 : -EPERM); |
55 | 55 | ||
56 | /* In user.* namespace, only regular files and directories can have | ||
57 | * extended attributes. For sticky directories, only the owner and | ||
58 | * privileged user can write attributes. | ||
59 | */ | ||
56 | if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) { | 60 | if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) { |
57 | if (!S_ISREG(inode->i_mode) && | 61 | if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode)) |
58 | (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) | 62 | return -EPERM; |
63 | if (S_ISDIR(inode->i_mode) && (inode->i_mode & S_ISVTX) && | ||
64 | (mask & MAY_WRITE) && (current->fsuid != inode->i_uid) && | ||
65 | !capable(CAP_FOWNER)) | ||
59 | return -EPERM; | 66 | return -EPERM; |
60 | } | 67 | } |
61 | 68 | ||
diff --git a/fs/xfs/Makefile-linux-2.6 b/fs/xfs/Makefile-linux-2.6 index 291948d5085a..b49989bb89ad 100644 --- a/fs/xfs/Makefile-linux-2.6 +++ b/fs/xfs/Makefile-linux-2.6 | |||
@@ -21,22 +21,7 @@ EXTRA_CFLAGS += -Ifs/xfs -Ifs/xfs/linux-2.6 -funsigned-char | |||
21 | XFS_LINUX := linux-2.6 | 21 | XFS_LINUX := linux-2.6 |
22 | 22 | ||
23 | ifeq ($(CONFIG_XFS_DEBUG),y) | 23 | ifeq ($(CONFIG_XFS_DEBUG),y) |
24 | EXTRA_CFLAGS += -g -DSTATIC="" -DDEBUG | 24 | EXTRA_CFLAGS += -g |
25 | EXTRA_CFLAGS += -DXFS_BUF_LOCK_TRACKING | ||
26 | endif | ||
27 | ifeq ($(CONFIG_XFS_TRACE),y) | ||
28 | EXTRA_CFLAGS += -DXFS_ALLOC_TRACE | ||
29 | EXTRA_CFLAGS += -DXFS_ATTR_TRACE | ||
30 | EXTRA_CFLAGS += -DXFS_BLI_TRACE | ||
31 | EXTRA_CFLAGS += -DXFS_BMAP_TRACE | ||
32 | EXTRA_CFLAGS += -DXFS_BMBT_TRACE | ||
33 | EXTRA_CFLAGS += -DXFS_DIR2_TRACE | ||
34 | EXTRA_CFLAGS += -DXFS_DQUOT_TRACE | ||
35 | EXTRA_CFLAGS += -DXFS_ILOCK_TRACE | ||
36 | EXTRA_CFLAGS += -DXFS_LOG_TRACE | ||
37 | EXTRA_CFLAGS += -DXFS_RW_TRACE | ||
38 | EXTRA_CFLAGS += -DXFS_BUF_TRACE | ||
39 | EXTRA_CFLAGS += -DXFS_VNODE_TRACE | ||
40 | endif | 25 | endif |
41 | 26 | ||
42 | obj-$(CONFIG_XFS_FS) += xfs.o | 27 | obj-$(CONFIG_XFS_FS) += xfs.o |
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index db5f5a3608ca..d3382843698e 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
@@ -15,6 +15,7 @@ | |||
15 | * along with this program; if not, write the Free Software Foundation, | 15 | * along with this program; if not, write the Free Software Foundation, |
16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
17 | */ | 17 | */ |
18 | #include "xfs.h" | ||
18 | #include <linux/stddef.h> | 19 | #include <linux/stddef.h> |
19 | #include <linux/errno.h> | 20 | #include <linux/errno.h> |
20 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
@@ -31,7 +32,6 @@ | |||
31 | #include <linux/kthread.h> | 32 | #include <linux/kthread.h> |
32 | #include <linux/migrate.h> | 33 | #include <linux/migrate.h> |
33 | #include <linux/backing-dev.h> | 34 | #include <linux/backing-dev.h> |
34 | #include "xfs_linux.h" | ||
35 | 35 | ||
36 | STATIC kmem_zone_t *xfs_buf_zone; | 36 | STATIC kmem_zone_t *xfs_buf_zone; |
37 | STATIC kmem_shaker_t xfs_buf_shake; | 37 | STATIC kmem_shaker_t xfs_buf_shake; |
@@ -1406,7 +1406,7 @@ xfs_alloc_bufhash( | |||
1406 | btp->bt_hashshift = external ? 3 : 8; /* 8 or 256 buckets */ | 1406 | btp->bt_hashshift = external ? 3 : 8; /* 8 or 256 buckets */ |
1407 | btp->bt_hashmask = (1 << btp->bt_hashshift) - 1; | 1407 | btp->bt_hashmask = (1 << btp->bt_hashshift) - 1; |
1408 | btp->bt_hash = kmem_zalloc((1 << btp->bt_hashshift) * | 1408 | btp->bt_hash = kmem_zalloc((1 << btp->bt_hashshift) * |
1409 | sizeof(xfs_bufhash_t), KM_SLEEP); | 1409 | sizeof(xfs_bufhash_t), KM_SLEEP | KM_LARGE); |
1410 | for (i = 0; i < (1 << btp->bt_hashshift); i++) { | 1410 | for (i = 0; i < (1 << btp->bt_hashshift); i++) { |
1411 | spin_lock_init(&btp->bt_hash[i].bh_lock); | 1411 | spin_lock_init(&btp->bt_hash[i].bh_lock); |
1412 | INIT_LIST_HEAD(&btp->bt_hash[i].bh_list); | 1412 | INIT_LIST_HEAD(&btp->bt_hash[i].bh_list); |
diff --git a/fs/xfs/linux-2.6/xfs_dmapi_priv.h b/fs/xfs/linux-2.6/xfs_dmapi_priv.h new file mode 100644 index 000000000000..a8b0b1685eed --- /dev/null +++ b/fs/xfs/linux-2.6/xfs_dmapi_priv.h | |||
@@ -0,0 +1,28 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2000-2006 Silicon Graphics, Inc. | ||
3 | * All Rights Reserved. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU General Public License as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope that it would be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write the Free Software Foundation, | ||
16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
17 | */ | ||
18 | #ifndef __XFS_DMAPI_PRIV_H__ | ||
19 | #define __XFS_DMAPI_PRIV_H__ | ||
20 | |||
21 | /* | ||
22 | * Based on IO_ISDIRECT, decide which i_ flag is set. | ||
23 | */ | ||
24 | #define DM_SEM_FLAG_RD(ioflags) (((ioflags) & IO_ISDIRECT) ? \ | ||
25 | DM_FLAGS_IMUX : 0) | ||
26 | #define DM_SEM_FLAG_WR (DM_FLAGS_IALLOCSEM_WR | DM_FLAGS_IMUX) | ||
27 | |||
28 | #endif /*__XFS_DMAPI_PRIV_H__*/ | ||
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index a74f854d91e6..74d094829a4d 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
@@ -341,8 +341,11 @@ xfs_open_by_handle( | |||
341 | put_unused_fd(new_fd); | 341 | put_unused_fd(new_fd); |
342 | return -XFS_ERROR(-PTR_ERR(filp)); | 342 | return -XFS_ERROR(-PTR_ERR(filp)); |
343 | } | 343 | } |
344 | if (inode->i_mode & S_IFREG) | 344 | if (inode->i_mode & S_IFREG) { |
345 | /* invisible operation should not change atime */ | ||
346 | filp->f_flags |= O_NOATIME; | ||
345 | filp->f_op = &xfs_invis_file_operations; | 347 | filp->f_op = &xfs_invis_file_operations; |
348 | } | ||
346 | 349 | ||
347 | fd_install(new_fd, filp); | 350 | fd_install(new_fd, filp); |
348 | return new_fd; | 351 | return new_fd; |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 38c4d128a8c0..de05abbbe7fd 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -227,9 +227,7 @@ xfs_initialize_vnode( | |||
227 | xfs_revalidate_inode(XFS_BHVTOM(bdp), vp, ip); | 227 | xfs_revalidate_inode(XFS_BHVTOM(bdp), vp, ip); |
228 | xfs_set_inodeops(inode); | 228 | xfs_set_inodeops(inode); |
229 | 229 | ||
230 | spin_lock(&ip->i_flags_lock); | 230 | xfs_iflags_clear(ip, XFS_INEW); |
231 | ip->i_flags &= ~XFS_INEW; | ||
232 | spin_unlock(&ip->i_flags_lock); | ||
233 | barrier(); | 231 | barrier(); |
234 | 232 | ||
235 | unlock_new_inode(inode); | 233 | unlock_new_inode(inode); |
diff --git a/fs/xfs/support/debug.c b/fs/xfs/support/debug.c index c75f68361e33..4363512d2f90 100644 --- a/fs/xfs/support/debug.c +++ b/fs/xfs/support/debug.c | |||
@@ -15,11 +15,9 @@ | |||
15 | * along with this program; if not, write the Free Software Foundation, | 15 | * along with this program; if not, write the Free Software Foundation, |
16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
17 | */ | 17 | */ |
18 | #include <xfs.h> | ||
18 | #include "debug.h" | 19 | #include "debug.h" |
19 | #include "spin.h" | 20 | #include "spin.h" |
20 | #include <asm/page.h> | ||
21 | #include <linux/sched.h> | ||
22 | #include <linux/kernel.h> | ||
23 | 21 | ||
24 | static char message[256]; /* keep it off the stack */ | 22 | static char message[256]; /* keep it off the stack */ |
25 | static DEFINE_SPINLOCK(xfs_err_lock); | 23 | static DEFINE_SPINLOCK(xfs_err_lock); |
diff --git a/fs/xfs/support/move.c b/fs/xfs/support/move.c index caefa17b80fe..ac8617ca3909 100644 --- a/fs/xfs/support/move.c +++ b/fs/xfs/support/move.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * as we go. | 22 | * as we go. |
23 | */ | 23 | */ |
24 | int | 24 | int |
25 | uio_read(caddr_t src, size_t len, struct uio *uio) | 25 | xfs_uio_read(caddr_t src, size_t len, struct uio *uio) |
26 | { | 26 | { |
27 | size_t count; | 27 | size_t count; |
28 | 28 | ||
diff --git a/fs/xfs/support/move.h b/fs/xfs/support/move.h index 97a2498d2da3..977879c24ff5 100644 --- a/fs/xfs/support/move.h +++ b/fs/xfs/support/move.h | |||
@@ -65,6 +65,6 @@ struct uio { | |||
65 | typedef struct uio uio_t; | 65 | typedef struct uio uio_t; |
66 | typedef struct iovec iovec_t; | 66 | typedef struct iovec iovec_t; |
67 | 67 | ||
68 | extern int uio_read (caddr_t, size_t, uio_t *); | 68 | extern int xfs_uio_read (caddr_t, size_t, uio_t *); |
69 | 69 | ||
70 | #endif /* __XFS_SUPPORT_MOVE_H__ */ | 70 | #endif /* __XFS_SUPPORT_MOVE_H__ */ |
diff --git a/fs/xfs/xfs.h b/fs/xfs/xfs.h index 1a48dbb902a7..bf0a12040b13 100644 --- a/fs/xfs/xfs.h +++ b/fs/xfs/xfs.h | |||
@@ -17,5 +17,28 @@ | |||
17 | */ | 17 | */ |
18 | #ifndef __XFS_H__ | 18 | #ifndef __XFS_H__ |
19 | #define __XFS_H__ | 19 | #define __XFS_H__ |
20 | |||
21 | #ifdef CONFIG_XFS_DEBUG | ||
22 | #define STATIC | ||
23 | #define DEBUG 1 | ||
24 | #define XFS_BUF_LOCK_TRACKING 1 | ||
25 | /* #define QUOTADEBUG 1 */ | ||
26 | #endif | ||
27 | |||
28 | #ifdef CONFIG_XFS_TRACE | ||
29 | #define XFS_ALLOC_TRACE 1 | ||
30 | #define XFS_ATTR_TRACE 1 | ||
31 | #define XFS_BLI_TRACE 1 | ||
32 | #define XFS_BMAP_TRACE 1 | ||
33 | #define XFS_BMBT_TRACE 1 | ||
34 | #define XFS_DIR2_TRACE 1 | ||
35 | #define XFS_DQUOT_TRACE 1 | ||
36 | #define XFS_ILOCK_TRACE 1 | ||
37 | #define XFS_LOG_TRACE 1 | ||
38 | #define XFS_RW_TRACE 1 | ||
39 | #define XFS_BUF_TRACE 1 | ||
40 | #define XFS_VNODE_TRACE 1 | ||
41 | #endif | ||
42 | |||
20 | #include <linux-2.6/xfs_linux.h> | 43 | #include <linux-2.6/xfs_linux.h> |
21 | #endif /* __XFS_H__ */ | 44 | #endif /* __XFS_H__ */ |
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 5b050c06795f..498ad50d1f45 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c | |||
@@ -1171,6 +1171,8 @@ xfs_bmap_add_extent_delay_real( | |||
1171 | xfs_bmap_trace_pre_update(fname, "0", ip, idx, XFS_DATA_FORK); | 1171 | xfs_bmap_trace_pre_update(fname, "0", ip, idx, XFS_DATA_FORK); |
1172 | xfs_bmbt_set_blockcount(ep, temp); | 1172 | xfs_bmbt_set_blockcount(ep, temp); |
1173 | r[0] = *new; | 1173 | r[0] = *new; |
1174 | r[1].br_state = PREV.br_state; | ||
1175 | r[1].br_startblock = 0; | ||
1174 | r[1].br_startoff = new_endoff; | 1176 | r[1].br_startoff = new_endoff; |
1175 | temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; | 1177 | temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; |
1176 | r[1].br_blockcount = temp2; | 1178 | r[1].br_blockcount = temp2; |
diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 8edbe1adb95b..8e8e5279334a 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c | |||
@@ -678,7 +678,7 @@ xfs_dir2_put_dirent64_uio( | |||
678 | idbp->d_off = pa->cook; | 678 | idbp->d_off = pa->cook; |
679 | idbp->d_name[namelen] = '\0'; | 679 | idbp->d_name[namelen] = '\0'; |
680 | memcpy(idbp->d_name, pa->name, namelen); | 680 | memcpy(idbp->d_name, pa->name, namelen); |
681 | rval = uio_read((caddr_t)idbp, reclen, uio); | 681 | rval = xfs_uio_read((caddr_t)idbp, reclen, uio); |
682 | pa->done = (rval == 0); | 682 | pa->done = (rval == 0); |
683 | return rval; | 683 | return rval; |
684 | } | 684 | } |
diff --git a/fs/xfs/xfs_dmapi.h b/fs/xfs/xfs_dmapi.h index 4e7865ad6f0e..adc3d251240d 100644 --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h | |||
@@ -157,27 +157,9 @@ typedef enum { | |||
157 | #define DM_FLAGS_IALLOCSEM_WR 0x020 /* thread holds i_alloc_sem wr */ | 157 | #define DM_FLAGS_IALLOCSEM_WR 0x020 /* thread holds i_alloc_sem wr */ |
158 | 158 | ||
159 | /* | 159 | /* |
160 | * Based on IO_ISDIRECT, decide which i_ flag is set. | 160 | * Pull in platform specific event flags defines |
161 | */ | 161 | */ |
162 | #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) | 162 | #include "xfs_dmapi_priv.h" |
163 | #define DM_SEM_FLAG_RD(ioflags) (((ioflags) & IO_ISDIRECT) ? \ | ||
164 | DM_FLAGS_IMUX : 0) | ||
165 | #define DM_SEM_FLAG_WR (DM_FLAGS_IALLOCSEM_WR | DM_FLAGS_IMUX) | ||
166 | #endif | ||
167 | |||
168 | #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)) && \ | ||
169 | (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,22)) | ||
170 | #define DM_SEM_FLAG_RD(ioflags) (((ioflags) & IO_ISDIRECT) ? \ | ||
171 | DM_FLAGS_IALLOCSEM_RD : DM_FLAGS_IMUX) | ||
172 | #define DM_SEM_FLAG_WR (DM_FLAGS_IALLOCSEM_WR | DM_FLAGS_IMUX) | ||
173 | #endif | ||
174 | |||
175 | #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,21) | ||
176 | #define DM_SEM_FLAG_RD(ioflags) (((ioflags) & IO_ISDIRECT) ? \ | ||
177 | 0 : DM_FLAGS_IMUX) | ||
178 | #define DM_SEM_FLAG_WR (DM_FLAGS_IMUX) | ||
179 | #endif | ||
180 | |||
181 | 163 | ||
182 | /* | 164 | /* |
183 | * Macros to turn caller specified delay/block flags into | 165 | * Macros to turn caller specified delay/block flags into |
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index b73d216ecaf9..c1c89dac19cc 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c | |||
@@ -215,7 +215,7 @@ again: | |||
215 | * If INEW is set this inode is being set up | 215 | * If INEW is set this inode is being set up |
216 | * we need to pause and try again. | 216 | * we need to pause and try again. |
217 | */ | 217 | */ |
218 | if (ip->i_flags & XFS_INEW) { | 218 | if (xfs_iflags_test(ip, XFS_INEW)) { |
219 | read_unlock(&ih->ih_lock); | 219 | read_unlock(&ih->ih_lock); |
220 | delay(1); | 220 | delay(1); |
221 | XFS_STATS_INC(xs_ig_frecycle); | 221 | XFS_STATS_INC(xs_ig_frecycle); |
@@ -230,22 +230,50 @@ again: | |||
230 | * on its way out of the system, | 230 | * on its way out of the system, |
231 | * we need to pause and try again. | 231 | * we need to pause and try again. |
232 | */ | 232 | */ |
233 | if (ip->i_flags & XFS_IRECLAIM) { | 233 | if (xfs_iflags_test(ip, XFS_IRECLAIM)) { |
234 | read_unlock(&ih->ih_lock); | 234 | read_unlock(&ih->ih_lock); |
235 | delay(1); | 235 | delay(1); |
236 | XFS_STATS_INC(xs_ig_frecycle); | 236 | XFS_STATS_INC(xs_ig_frecycle); |
237 | 237 | ||
238 | goto again; | 238 | goto again; |
239 | } | 239 | } |
240 | ASSERT(xfs_iflags_test(ip, XFS_IRECLAIMABLE)); | ||
241 | |||
242 | /* | ||
243 | * If lookup is racing with unlink, then we | ||
244 | * should return an error immediately so we | ||
245 | * don't remove it from the reclaim list and | ||
246 | * potentially leak the inode. | ||
247 | */ | ||
248 | if ((ip->i_d.di_mode == 0) && | ||
249 | !(flags & XFS_IGET_CREATE)) { | ||
250 | read_unlock(&ih->ih_lock); | ||
251 | return ENOENT; | ||
252 | } | ||
253 | |||
254 | /* | ||
255 | * There may be transactions sitting in the | ||
256 | * incore log buffers or being flushed to disk | ||
257 | * at this time. We can't clear the | ||
258 | * XFS_IRECLAIMABLE flag until these | ||
259 | * transactions have hit the disk, otherwise we | ||
260 | * will void the guarantee the flag provides | ||
261 | * xfs_iunpin() | ||
262 | */ | ||
263 | if (xfs_ipincount(ip)) { | ||
264 | read_unlock(&ih->ih_lock); | ||
265 | xfs_log_force(mp, 0, | ||
266 | XFS_LOG_FORCE|XFS_LOG_SYNC); | ||
267 | XFS_STATS_INC(xs_ig_frecycle); | ||
268 | goto again; | ||
269 | } | ||
240 | 270 | ||
241 | vn_trace_exit(vp, "xfs_iget.alloc", | 271 | vn_trace_exit(vp, "xfs_iget.alloc", |
242 | (inst_t *)__return_address); | 272 | (inst_t *)__return_address); |
243 | 273 | ||
244 | XFS_STATS_INC(xs_ig_found); | 274 | XFS_STATS_INC(xs_ig_found); |
245 | 275 | ||
246 | spin_lock(&ip->i_flags_lock); | 276 | xfs_iflags_clear(ip, XFS_IRECLAIMABLE); |
247 | ip->i_flags &= ~XFS_IRECLAIMABLE; | ||
248 | spin_unlock(&ip->i_flags_lock); | ||
249 | version = ih->ih_version; | 277 | version = ih->ih_version; |
250 | read_unlock(&ih->ih_lock); | 278 | read_unlock(&ih->ih_lock); |
251 | xfs_ihash_promote(ih, ip, version); | 279 | xfs_ihash_promote(ih, ip, version); |
@@ -299,10 +327,7 @@ finish_inode: | |||
299 | if (lock_flags != 0) | 327 | if (lock_flags != 0) |
300 | xfs_ilock(ip, lock_flags); | 328 | xfs_ilock(ip, lock_flags); |
301 | 329 | ||
302 | spin_lock(&ip->i_flags_lock); | 330 | xfs_iflags_clear(ip, XFS_ISTALE); |
303 | ip->i_flags &= ~XFS_ISTALE; | ||
304 | spin_unlock(&ip->i_flags_lock); | ||
305 | |||
306 | vn_trace_exit(vp, "xfs_iget.found", | 331 | vn_trace_exit(vp, "xfs_iget.found", |
307 | (inst_t *)__return_address); | 332 | (inst_t *)__return_address); |
308 | goto return_ip; | 333 | goto return_ip; |
@@ -371,10 +396,7 @@ finish_inode: | |||
371 | ih->ih_next = ip; | 396 | ih->ih_next = ip; |
372 | ip->i_udquot = ip->i_gdquot = NULL; | 397 | ip->i_udquot = ip->i_gdquot = NULL; |
373 | ih->ih_version++; | 398 | ih->ih_version++; |
374 | spin_lock(&ip->i_flags_lock); | 399 | xfs_iflags_set(ip, XFS_INEW); |
375 | ip->i_flags |= XFS_INEW; | ||
376 | spin_unlock(&ip->i_flags_lock); | ||
377 | |||
378 | write_unlock(&ih->ih_lock); | 400 | write_unlock(&ih->ih_lock); |
379 | 401 | ||
380 | /* | 402 | /* |
@@ -625,7 +647,7 @@ xfs_iput_new(xfs_inode_t *ip, | |||
625 | vn_trace_entry(vp, "xfs_iput_new", (inst_t *)__return_address); | 647 | vn_trace_entry(vp, "xfs_iput_new", (inst_t *)__return_address); |
626 | 648 | ||
627 | if ((ip->i_d.di_mode == 0)) { | 649 | if ((ip->i_d.di_mode == 0)) { |
628 | ASSERT(!(ip->i_flags & XFS_IRECLAIMABLE)); | 650 | ASSERT(!xfs_iflags_test(ip, XFS_IRECLAIMABLE)); |
629 | vn_mark_bad(vp); | 651 | vn_mark_bad(vp); |
630 | } | 652 | } |
631 | if (inode->i_state & I_NEW) | 653 | if (inode->i_state & I_NEW) |
@@ -683,6 +705,7 @@ xfs_ireclaim(xfs_inode_t *ip) | |||
683 | /* | 705 | /* |
684 | * Free all memory associated with the inode. | 706 | * Free all memory associated with the inode. |
685 | */ | 707 | */ |
708 | xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); | ||
686 | xfs_idestroy(ip); | 709 | xfs_idestroy(ip); |
687 | } | 710 | } |
688 | 711 | ||
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index c27d7d495aa0..44dfac521285 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
@@ -2193,7 +2193,7 @@ xfs_ifree_cluster( | |||
2193 | /* Inode not in memory or we found it already, | 2193 | /* Inode not in memory or we found it already, |
2194 | * nothing to do | 2194 | * nothing to do |
2195 | */ | 2195 | */ |
2196 | if (!ip || (ip->i_flags & XFS_ISTALE)) { | 2196 | if (!ip || xfs_iflags_test(ip, XFS_ISTALE)) { |
2197 | read_unlock(&ih->ih_lock); | 2197 | read_unlock(&ih->ih_lock); |
2198 | continue; | 2198 | continue; |
2199 | } | 2199 | } |
@@ -2215,10 +2215,7 @@ xfs_ifree_cluster( | |||
2215 | 2215 | ||
2216 | if (ip == free_ip) { | 2216 | if (ip == free_ip) { |
2217 | if (xfs_iflock_nowait(ip)) { | 2217 | if (xfs_iflock_nowait(ip)) { |
2218 | spin_lock(&ip->i_flags_lock); | 2218 | xfs_iflags_set(ip, XFS_ISTALE); |
2219 | ip->i_flags |= XFS_ISTALE; | ||
2220 | spin_unlock(&ip->i_flags_lock); | ||
2221 | |||
2222 | if (xfs_inode_clean(ip)) { | 2219 | if (xfs_inode_clean(ip)) { |
2223 | xfs_ifunlock(ip); | 2220 | xfs_ifunlock(ip); |
2224 | } else { | 2221 | } else { |
@@ -2231,9 +2228,7 @@ xfs_ifree_cluster( | |||
2231 | 2228 | ||
2232 | if (xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) { | 2229 | if (xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) { |
2233 | if (xfs_iflock_nowait(ip)) { | 2230 | if (xfs_iflock_nowait(ip)) { |
2234 | spin_lock(&ip->i_flags_lock); | 2231 | xfs_iflags_set(ip, XFS_ISTALE); |
2235 | ip->i_flags |= XFS_ISTALE; | ||
2236 | spin_unlock(&ip->i_flags_lock); | ||
2237 | 2232 | ||
2238 | if (xfs_inode_clean(ip)) { | 2233 | if (xfs_inode_clean(ip)) { |
2239 | xfs_ifunlock(ip); | 2234 | xfs_ifunlock(ip); |
@@ -2263,9 +2258,7 @@ xfs_ifree_cluster( | |||
2263 | AIL_LOCK(mp,s); | 2258 | AIL_LOCK(mp,s); |
2264 | iip->ili_flush_lsn = iip->ili_item.li_lsn; | 2259 | iip->ili_flush_lsn = iip->ili_item.li_lsn; |
2265 | AIL_UNLOCK(mp, s); | 2260 | AIL_UNLOCK(mp, s); |
2266 | spin_lock(&iip->ili_inode->i_flags_lock); | 2261 | xfs_iflags_set(iip->ili_inode, XFS_ISTALE); |
2267 | iip->ili_inode->i_flags |= XFS_ISTALE; | ||
2268 | spin_unlock(&iip->ili_inode->i_flags_lock); | ||
2269 | pre_flushed++; | 2262 | pre_flushed++; |
2270 | } | 2263 | } |
2271 | lip = lip->li_bio_list; | 2264 | lip = lip->li_bio_list; |
@@ -2748,42 +2741,39 @@ xfs_iunpin( | |||
2748 | { | 2741 | { |
2749 | ASSERT(atomic_read(&ip->i_pincount) > 0); | 2742 | ASSERT(atomic_read(&ip->i_pincount) > 0); |
2750 | 2743 | ||
2751 | if (atomic_dec_and_test(&ip->i_pincount)) { | 2744 | if (atomic_dec_and_lock(&ip->i_pincount, &ip->i_flags_lock)) { |
2745 | |||
2752 | /* | 2746 | /* |
2753 | * If the inode is currently being reclaimed, the | 2747 | * If the inode is currently being reclaimed, the link between |
2754 | * linux inode _and_ the xfs vnode may have been | 2748 | * the bhv_vnode and the xfs_inode will be broken after the |
2755 | * freed so we cannot reference either of them safely. | 2749 | * XFS_IRECLAIM* flag is set. Hence, if these flags are not |
2756 | * Hence we should not try to do anything to them | 2750 | * set, then we can move forward and mark the linux inode dirty |
2757 | * if the xfs inode is currently in the reclaim | 2751 | * knowing that it is still valid as it won't freed until after |
2758 | * path. | 2752 | * the bhv_vnode<->xfs_inode link is broken in xfs_reclaim. The |
2753 | * i_flags_lock is used to synchronise the setting of the | ||
2754 | * XFS_IRECLAIM* flags and the breaking of the link, and so we | ||
2755 | * can execute atomically w.r.t to reclaim by holding this lock | ||
2756 | * here. | ||
2759 | * | 2757 | * |
2760 | * However, we still need to issue the unpin wakeup | 2758 | * However, we still need to issue the unpin wakeup call as the |
2761 | * call as the inode reclaim may be blocked waiting for | 2759 | * inode reclaim may be blocked waiting for the inode to become |
2762 | * the inode to become unpinned. | 2760 | * unpinned. |
2763 | */ | 2761 | */ |
2764 | struct inode *inode = NULL; | ||
2765 | 2762 | ||
2766 | spin_lock(&ip->i_flags_lock); | 2763 | if (!__xfs_iflags_test(ip, XFS_IRECLAIM|XFS_IRECLAIMABLE)) { |
2767 | if (!(ip->i_flags & (XFS_IRECLAIM|XFS_IRECLAIMABLE))) { | ||
2768 | bhv_vnode_t *vp = XFS_ITOV_NULL(ip); | 2764 | bhv_vnode_t *vp = XFS_ITOV_NULL(ip); |
2765 | struct inode *inode = NULL; | ||
2766 | |||
2767 | BUG_ON(vp == NULL); | ||
2768 | inode = vn_to_inode(vp); | ||
2769 | BUG_ON(inode->i_state & I_CLEAR); | ||
2769 | 2770 | ||
2770 | /* make sync come back and flush this inode */ | 2771 | /* make sync come back and flush this inode */ |
2771 | if (vp) { | 2772 | if (!(inode->i_state & (I_NEW|I_FREEING))) |
2772 | inode = vn_to_inode(vp); | 2773 | mark_inode_dirty_sync(inode); |
2773 | |||
2774 | if (!(inode->i_state & | ||
2775 | (I_NEW|I_FREEING|I_CLEAR))) { | ||
2776 | inode = igrab(inode); | ||
2777 | if (inode) | ||
2778 | mark_inode_dirty_sync(inode); | ||
2779 | } else | ||
2780 | inode = NULL; | ||
2781 | } | ||
2782 | } | 2774 | } |
2783 | spin_unlock(&ip->i_flags_lock); | 2775 | spin_unlock(&ip->i_flags_lock); |
2784 | wake_up(&ip->i_ipin_wait); | 2776 | wake_up(&ip->i_ipin_wait); |
2785 | if (inode) | ||
2786 | iput(inode); | ||
2787 | } | 2777 | } |
2788 | } | 2778 | } |
2789 | 2779 | ||
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index e96eb0835fe6..bc823720d88f 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h | |||
@@ -305,6 +305,47 @@ typedef struct xfs_inode { | |||
305 | #endif | 305 | #endif |
306 | } xfs_inode_t; | 306 | } xfs_inode_t; |
307 | 307 | ||
308 | |||
309 | /* | ||
310 | * i_flags helper functions | ||
311 | */ | ||
312 | static inline void | ||
313 | __xfs_iflags_set(xfs_inode_t *ip, unsigned short flags) | ||
314 | { | ||
315 | ip->i_flags |= flags; | ||
316 | } | ||
317 | |||
318 | static inline void | ||
319 | xfs_iflags_set(xfs_inode_t *ip, unsigned short flags) | ||
320 | { | ||
321 | spin_lock(&ip->i_flags_lock); | ||
322 | __xfs_iflags_set(ip, flags); | ||
323 | spin_unlock(&ip->i_flags_lock); | ||
324 | } | ||
325 | |||
326 | static inline void | ||
327 | xfs_iflags_clear(xfs_inode_t *ip, unsigned short flags) | ||
328 | { | ||
329 | spin_lock(&ip->i_flags_lock); | ||
330 | ip->i_flags &= ~flags; | ||
331 | spin_unlock(&ip->i_flags_lock); | ||
332 | } | ||
333 | |||
334 | static inline int | ||
335 | __xfs_iflags_test(xfs_inode_t *ip, unsigned short flags) | ||
336 | { | ||
337 | return (ip->i_flags & flags); | ||
338 | } | ||
339 | |||
340 | static inline int | ||
341 | xfs_iflags_test(xfs_inode_t *ip, unsigned short flags) | ||
342 | { | ||
343 | int ret; | ||
344 | spin_lock(&ip->i_flags_lock); | ||
345 | ret = __xfs_iflags_test(ip, flags); | ||
346 | spin_unlock(&ip->i_flags_lock); | ||
347 | return ret; | ||
348 | } | ||
308 | #endif /* __KERNEL__ */ | 349 | #endif /* __KERNEL__ */ |
309 | 350 | ||
310 | 351 | ||
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 061e2ffdd1de..bda774a04b8f 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
@@ -1013,7 +1013,7 @@ xfs_readlink( | |||
1013 | pathlen = (int)ip->i_d.di_size; | 1013 | pathlen = (int)ip->i_d.di_size; |
1014 | 1014 | ||
1015 | if (ip->i_df.if_flags & XFS_IFINLINE) { | 1015 | if (ip->i_df.if_flags & XFS_IFINLINE) { |
1016 | error = uio_read(ip->i_df.if_u1.if_data, pathlen, uiop); | 1016 | error = xfs_uio_read(ip->i_df.if_u1.if_data, pathlen, uiop); |
1017 | } | 1017 | } |
1018 | else { | 1018 | else { |
1019 | /* | 1019 | /* |
@@ -1044,7 +1044,7 @@ xfs_readlink( | |||
1044 | byte_cnt = pathlen; | 1044 | byte_cnt = pathlen; |
1045 | pathlen -= byte_cnt; | 1045 | pathlen -= byte_cnt; |
1046 | 1046 | ||
1047 | error = uio_read(XFS_BUF_PTR(bp), byte_cnt, uiop); | 1047 | error = xfs_uio_read(XFS_BUF_PTR(bp), byte_cnt, uiop); |
1048 | xfs_buf_relse (bp); | 1048 | xfs_buf_relse (bp); |
1049 | } | 1049 | } |
1050 | 1050 | ||
@@ -3827,11 +3827,16 @@ xfs_reclaim( | |||
3827 | */ | 3827 | */ |
3828 | xfs_synchronize_atime(ip); | 3828 | xfs_synchronize_atime(ip); |
3829 | 3829 | ||
3830 | /* If we have nothing to flush with this inode then complete the | 3830 | /* |
3831 | * teardown now, otherwise break the link between the xfs inode | 3831 | * If we have nothing to flush with this inode then complete the |
3832 | * and the linux inode and clean up the xfs inode later. This | 3832 | * teardown now, otherwise break the link between the xfs inode and the |
3833 | * avoids flushing the inode to disk during the delete operation | 3833 | * linux inode and clean up the xfs inode later. This avoids flushing |
3834 | * itself. | 3834 | * the inode to disk during the delete operation itself. |
3835 | * | ||
3836 | * When breaking the link, we need to set the XFS_IRECLAIMABLE flag | ||
3837 | * first to ensure that xfs_iunpin() will never see an xfs inode | ||
3838 | * that has a linux inode being reclaimed. Synchronisation is provided | ||
3839 | * by the i_flags_lock. | ||
3835 | */ | 3840 | */ |
3836 | if (!ip->i_update_core && (ip->i_itemp == NULL)) { | 3841 | if (!ip->i_update_core && (ip->i_itemp == NULL)) { |
3837 | xfs_ilock(ip, XFS_ILOCK_EXCL); | 3842 | xfs_ilock(ip, XFS_ILOCK_EXCL); |
@@ -3840,13 +3845,13 @@ xfs_reclaim( | |||
3840 | } else { | 3845 | } else { |
3841 | xfs_mount_t *mp = ip->i_mount; | 3846 | xfs_mount_t *mp = ip->i_mount; |
3842 | 3847 | ||
3843 | /* Protect sync from us */ | 3848 | /* Protect sync and unpin from us */ |
3844 | XFS_MOUNT_ILOCK(mp); | 3849 | XFS_MOUNT_ILOCK(mp); |
3845 | vn_bhv_remove(VN_BHV_HEAD(vp), XFS_ITOBHV(ip)); | ||
3846 | list_add_tail(&ip->i_reclaim, &mp->m_del_inodes); | ||
3847 | spin_lock(&ip->i_flags_lock); | 3850 | spin_lock(&ip->i_flags_lock); |
3848 | ip->i_flags |= XFS_IRECLAIMABLE; | 3851 | __xfs_iflags_set(ip, XFS_IRECLAIMABLE); |
3852 | vn_bhv_remove(VN_BHV_HEAD(vp), XFS_ITOBHV(ip)); | ||
3849 | spin_unlock(&ip->i_flags_lock); | 3853 | spin_unlock(&ip->i_flags_lock); |
3854 | list_add_tail(&ip->i_reclaim, &mp->m_del_inodes); | ||
3850 | XFS_MOUNT_IUNLOCK(mp); | 3855 | XFS_MOUNT_IUNLOCK(mp); |
3851 | } | 3856 | } |
3852 | return 0; | 3857 | return 0; |
@@ -3872,8 +3877,8 @@ xfs_finish_reclaim( | |||
3872 | */ | 3877 | */ |
3873 | write_lock(&ih->ih_lock); | 3878 | write_lock(&ih->ih_lock); |
3874 | spin_lock(&ip->i_flags_lock); | 3879 | spin_lock(&ip->i_flags_lock); |
3875 | if ((ip->i_flags & XFS_IRECLAIM) || | 3880 | if (__xfs_iflags_test(ip, XFS_IRECLAIM) || |
3876 | (!(ip->i_flags & XFS_IRECLAIMABLE) && vp == NULL)) { | 3881 | (!__xfs_iflags_test(ip, XFS_IRECLAIMABLE) && vp == NULL)) { |
3877 | spin_unlock(&ip->i_flags_lock); | 3882 | spin_unlock(&ip->i_flags_lock); |
3878 | write_unlock(&ih->ih_lock); | 3883 | write_unlock(&ih->ih_lock); |
3879 | if (locked) { | 3884 | if (locked) { |
@@ -3882,7 +3887,7 @@ xfs_finish_reclaim( | |||
3882 | } | 3887 | } |
3883 | return 1; | 3888 | return 1; |
3884 | } | 3889 | } |
3885 | ip->i_flags |= XFS_IRECLAIM; | 3890 | __xfs_iflags_set(ip, XFS_IRECLAIM); |
3886 | spin_unlock(&ip->i_flags_lock); | 3891 | spin_unlock(&ip->i_flags_lock); |
3887 | write_unlock(&ih->ih_lock); | 3892 | write_unlock(&ih->ih_lock); |
3888 | 3893 | ||
diff --git a/include/asm-arm/arch-ebsa110/io.h b/include/asm-arm/arch-ebsa110/io.h index ae048441c9ed..722c5e086285 100644 --- a/include/asm-arm/arch-ebsa110/io.h +++ b/include/asm-arm/arch-ebsa110/io.h | |||
@@ -27,9 +27,9 @@ void __outw(u16 val, unsigned int port); | |||
27 | u32 __inl(unsigned int port); | 27 | u32 __inl(unsigned int port); |
28 | void __outl(u32 val, unsigned int port); | 28 | void __outl(u32 val, unsigned int port); |
29 | 29 | ||
30 | u8 __readb(void __iomem *addr); | 30 | u8 __readb(const volatile void __iomem *addr); |
31 | u16 __readw(void __iomem *addr); | 31 | u16 __readw(const volatile void __iomem *addr); |
32 | u32 __readl(void __iomem *addr); | 32 | u32 __readl(const volatile void __iomem *addr); |
33 | 33 | ||
34 | void __writeb(u8 val, void __iomem *addr); | 34 | void __writeb(u8 val, void __iomem *addr); |
35 | void __writew(u16 val, void __iomem *addr); | 35 | void __writew(u16 val, void __iomem *addr); |
@@ -64,8 +64,14 @@ void __writel(u32 val, void __iomem *addr); | |||
64 | #define writew(v,b) __writew(v,b) | 64 | #define writew(v,b) __writew(v,b) |
65 | #define writel(v,b) __writel(v,b) | 65 | #define writel(v,b) __writel(v,b) |
66 | 66 | ||
67 | #define __arch_ioremap(cookie,sz,c) ((void __iomem *)(cookie)) | 67 | static inline void __iomem *__arch_ioremap(unsigned long cookie, size_t size, |
68 | #define __arch_iounmap(cookie) do { } while (0) | 68 | unsigned int flags) |
69 | { | ||
70 | return (void __iomem *)cookie; | ||
71 | } | ||
72 | |||
73 | #define __arch_ioremap __arch_ioremap | ||
74 | #define __arch_iounmap(cookie) do { } while (0) | ||
69 | 75 | ||
70 | extern void insb(unsigned int port, void *buf, int sz); | 76 | extern void insb(unsigned int port, void *buf, int sz); |
71 | extern void insw(unsigned int port, void *buf, int sz); | 77 | extern void insw(unsigned int port, void *buf, int sz); |
diff --git a/include/asm-arm/arch-pxa/irqs.h b/include/asm-arm/arch-pxa/irqs.h index f3bc70eee35b..67ed43674c63 100644 --- a/include/asm-arm/arch-pxa/irqs.h +++ b/include/asm-arm/arch-pxa/irqs.h | |||
@@ -73,7 +73,7 @@ | |||
73 | #define IRQ_TO_GPIO(i) (((i) < IRQ_GPIO(2)) ? ((i) - IRQ_GPIO0) : IRQ_TO_GPIO_2_x(i)) | 73 | #define IRQ_TO_GPIO(i) (((i) < IRQ_GPIO(2)) ? ((i) - IRQ_GPIO0) : IRQ_TO_GPIO_2_x(i)) |
74 | 74 | ||
75 | #if defined(CONFIG_PXA25x) | 75 | #if defined(CONFIG_PXA25x) |
76 | #define PXA_LAST_GPIO 80 | 76 | #define PXA_LAST_GPIO 84 |
77 | #elif defined(CONFIG_PXA27x) | 77 | #elif defined(CONFIG_PXA27x) |
78 | #define PXA_LAST_GPIO 127 | 78 | #define PXA_LAST_GPIO 127 |
79 | #endif | 79 | #endif |
diff --git a/include/asm-arm/arch-pxa/pxa-regs.h b/include/asm-arm/arch-pxa/pxa-regs.h index 68731e0923a4..cff752f35230 100644 --- a/include/asm-arm/arch-pxa/pxa-regs.h +++ b/include/asm-arm/arch-pxa/pxa-regs.h | |||
@@ -2242,7 +2242,7 @@ | |||
2242 | 2242 | ||
2243 | #define CICR1_TBIT (1 << 31) /* Transparency bit */ | 2243 | #define CICR1_TBIT (1 << 31) /* Transparency bit */ |
2244 | #define CICR1_RGBT_CONV (0x3 << 30) /* RGBT conversion mask */ | 2244 | #define CICR1_RGBT_CONV (0x3 << 30) /* RGBT conversion mask */ |
2245 | #define CICR1_PPL (0x3f << 15) /* Pixels per line mask */ | 2245 | #define CICR1_PPL (0x7ff << 15) /* Pixels per line mask */ |
2246 | #define CICR1_RGB_CONV (0x7 << 12) /* RGB conversion mask */ | 2246 | #define CICR1_RGB_CONV (0x7 << 12) /* RGB conversion mask */ |
2247 | #define CICR1_RGB_F (1 << 11) /* RGB format */ | 2247 | #define CICR1_RGB_F (1 << 11) /* RGB format */ |
2248 | #define CICR1_YCBCR_F (1 << 10) /* YCbCr format */ | 2248 | #define CICR1_YCBCR_F (1 << 10) /* YCbCr format */ |
@@ -2268,7 +2268,7 @@ | |||
2268 | #define CICR3_VSW (0x3f << 10) /* Vertical sync pulse width mask */ | 2268 | #define CICR3_VSW (0x3f << 10) /* Vertical sync pulse width mask */ |
2269 | #define CICR3_BFPW (0x3f << 3) /* Beginning-of-frame pixel clock | 2269 | #define CICR3_BFPW (0x3f << 3) /* Beginning-of-frame pixel clock |
2270 | wait count mask */ | 2270 | wait count mask */ |
2271 | #define CICR3_LPF (0x3ff << 0) /* Lines per frame mask */ | 2271 | #define CICR3_LPF (0x7ff << 0) /* Lines per frame mask */ |
2272 | 2272 | ||
2273 | #define CICR4_MCLK_DLY (0x3 << 24) /* MCLK Data Capture Delay mask */ | 2273 | #define CICR4_MCLK_DLY (0x3 << 24) /* MCLK Data Capture Delay mask */ |
2274 | #define CICR4_PCLK_EN (1 << 23) /* Pixel clock enable */ | 2274 | #define CICR4_PCLK_EN (1 << 23) /* Pixel clock enable */ |
@@ -2289,8 +2289,8 @@ | |||
2289 | #define CISR_EOL (1 << 8) /* End of line */ | 2289 | #define CISR_EOL (1 << 8) /* End of line */ |
2290 | #define CISR_PAR_ERR (1 << 7) /* Parity error */ | 2290 | #define CISR_PAR_ERR (1 << 7) /* Parity error */ |
2291 | #define CISR_CQD (1 << 6) /* Camera interface quick disable */ | 2291 | #define CISR_CQD (1 << 6) /* Camera interface quick disable */ |
2292 | #define CISR_SOF (1 << 5) /* Start of frame */ | 2292 | #define CISR_CDD (1 << 5) /* Camera interface disable done */ |
2293 | #define CISR_CDD (1 << 4) /* Camera interface disable done */ | 2293 | #define CISR_SOF (1 << 4) /* Start of frame */ |
2294 | #define CISR_EOF (1 << 3) /* End of frame */ | 2294 | #define CISR_EOF (1 << 3) /* End of frame */ |
2295 | #define CISR_IFO_2 (1 << 2) /* FIFO overrun for Channel 2 */ | 2295 | #define CISR_IFO_2 (1 << 2) /* FIFO overrun for Channel 2 */ |
2296 | #define CISR_IFO_1 (1 << 1) /* FIFO overrun for Channel 1 */ | 2296 | #define CISR_IFO_1 (1 << 1) /* FIFO overrun for Channel 1 */ |
diff --git a/include/asm-arm/arch-pxa/udc.h b/include/asm-arm/arch-pxa/udc.h index 121cd241115d..646480d37256 100644 --- a/include/asm-arm/arch-pxa/udc.h +++ b/include/asm-arm/arch-pxa/udc.h | |||
@@ -4,23 +4,8 @@ | |||
4 | * This supports machine-specific differences in how the PXA2xx | 4 | * This supports machine-specific differences in how the PXA2xx |
5 | * USB Device Controller (UDC) is wired. | 5 | * USB Device Controller (UDC) is wired. |
6 | * | 6 | * |
7 | * It is set in linux/arch/arm/mach-pxa/<machine>.c and used in | ||
8 | * the probe routine of linux/drivers/usb/gadget/pxa2xx_udc.c | ||
9 | */ | 7 | */ |
10 | struct pxa2xx_udc_mach_info { | 8 | #include <asm/mach/udc_pxa2xx.h> |
11 | int (*udc_is_connected)(void); /* do we see host? */ | ||
12 | void (*udc_command)(int cmd); | ||
13 | #define PXA2XX_UDC_CMD_CONNECT 0 /* let host see us */ | ||
14 | #define PXA2XX_UDC_CMD_DISCONNECT 1 /* so host won't see us */ | ||
15 | |||
16 | /* Boards following the design guidelines in the developer's manual, | ||
17 | * with on-chip GPIOs not Lubbock's wierd hardware, can have a sane | ||
18 | * VBUS IRQ and omit the methods above. Store the GPIO number | ||
19 | * here; for GPIO 0, also mask in one of the pxa_gpio_mode() bits. | ||
20 | */ | ||
21 | u16 gpio_vbus; /* high == vbus present */ | ||
22 | u16 gpio_pullup; /* high == pullup activated */ | ||
23 | }; | ||
24 | 9 | ||
25 | extern void pxa_set_udc_info(struct pxa2xx_udc_mach_info *info); | 10 | extern void pxa_set_udc_info(struct pxa2xx_udc_mach_info *info); |
26 | 11 | ||
diff --git a/include/asm-arm/dma-mapping.h b/include/asm-arm/dma-mapping.h index 55eb4dc3253d..666617711c81 100644 --- a/include/asm-arm/dma-mapping.h +++ b/include/asm-arm/dma-mapping.h | |||
@@ -12,6 +12,10 @@ | |||
12 | * uncached, unwrite-buffered mapped memory space for use with DMA | 12 | * uncached, unwrite-buffered mapped memory space for use with DMA |
13 | * devices. This is the "generic" version. The PCI specific version | 13 | * devices. This is the "generic" version. The PCI specific version |
14 | * is in pci.h | 14 | * is in pci.h |
15 | * | ||
16 | * Note: Drivers should NOT use this function directly, as it will break | ||
17 | * platforms with CONFIG_DMABOUNCE. | ||
18 | * Use the driver DMA support - see dma-mapping.h (dma_sync_*) | ||
15 | */ | 19 | */ |
16 | extern void consistent_sync(void *kaddr, size_t size, int rw); | 20 | extern void consistent_sync(void *kaddr, size_t size, int rw); |
17 | 21 | ||
diff --git a/include/asm-arm/mach/udc_pxa2xx.h b/include/asm-arm/mach/udc_pxa2xx.h new file mode 100644 index 000000000000..ff0a95715a07 --- /dev/null +++ b/include/asm-arm/mach/udc_pxa2xx.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /* | ||
2 | * linux/include/asm-arm/mach/udc_pxa2xx.h | ||
3 | * | ||
4 | * This supports machine-specific differences in how the PXA2xx | ||
5 | * USB Device Controller (UDC) is wired. | ||
6 | * | ||
7 | * It is set in linux/arch/arm/mach-pxa/<machine>.c or in | ||
8 | * linux/arch/mach-ixp4xx/<machine>.c and used in | ||
9 | * the probe routine of linux/drivers/usb/gadget/pxa2xx_udc.c | ||
10 | */ | ||
11 | |||
12 | struct pxa2xx_udc_mach_info { | ||
13 | int (*udc_is_connected)(void); /* do we see host? */ | ||
14 | void (*udc_command)(int cmd); | ||
15 | #define PXA2XX_UDC_CMD_CONNECT 0 /* let host see us */ | ||
16 | #define PXA2XX_UDC_CMD_DISCONNECT 1 /* so host won't see us */ | ||
17 | |||
18 | /* Boards following the design guidelines in the developer's manual, | ||
19 | * with on-chip GPIOs not Lubbock's wierd hardware, can have a sane | ||
20 | * VBUS IRQ and omit the methods above. Store the GPIO number | ||
21 | * here; for GPIO 0, also mask in one of the pxa_gpio_mode() bits. | ||
22 | */ | ||
23 | u16 gpio_vbus; /* high == vbus present */ | ||
24 | u16 gpio_pullup; /* high == pullup activated */ | ||
25 | }; | ||
26 | |||
diff --git a/include/asm-arm/uaccess.h b/include/asm-arm/uaccess.h index 09ad0cab9014..5f420a0149f1 100644 --- a/include/asm-arm/uaccess.h +++ b/include/asm-arm/uaccess.h | |||
@@ -383,19 +383,19 @@ do { \ | |||
383 | 383 | ||
384 | 384 | ||
385 | #ifdef CONFIG_MMU | 385 | #ifdef CONFIG_MMU |
386 | extern unsigned long __copy_from_user(void *to, const void __user *from, unsigned long n); | 386 | extern unsigned long __must_check __copy_from_user(void *to, const void __user *from, unsigned long n); |
387 | extern unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n); | 387 | extern unsigned long __must_check __copy_to_user(void __user *to, const void *from, unsigned long n); |
388 | extern unsigned long __clear_user(void __user *addr, unsigned long n); | 388 | extern unsigned long __must_check __clear_user(void __user *addr, unsigned long n); |
389 | #else | 389 | #else |
390 | #define __copy_from_user(to,from,n) (memcpy(to, (void __force *)from, n), 0) | 390 | #define __copy_from_user(to,from,n) (memcpy(to, (void __force *)from, n), 0) |
391 | #define __copy_to_user(to,from,n) (memcpy((void __force *)to, from, n), 0) | 391 | #define __copy_to_user(to,from,n) (memcpy((void __force *)to, from, n), 0) |
392 | #define __clear_user(addr,n) (memset((void __force *)addr, 0, n), 0) | 392 | #define __clear_user(addr,n) (memset((void __force *)addr, 0, n), 0) |
393 | #endif | 393 | #endif |
394 | 394 | ||
395 | extern unsigned long __strncpy_from_user(char *to, const char __user *from, unsigned long count); | 395 | extern unsigned long __must_check __strncpy_from_user(char *to, const char __user *from, unsigned long count); |
396 | extern unsigned long __strnlen_user(const char __user *s, long n); | 396 | extern unsigned long __must_check __strnlen_user(const char __user *s, long n); |
397 | 397 | ||
398 | static inline unsigned long copy_from_user(void *to, const void __user *from, unsigned long n) | 398 | static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n) |
399 | { | 399 | { |
400 | if (access_ok(VERIFY_READ, from, n)) | 400 | if (access_ok(VERIFY_READ, from, n)) |
401 | n = __copy_from_user(to, from, n); | 401 | n = __copy_from_user(to, from, n); |
@@ -404,7 +404,7 @@ static inline unsigned long copy_from_user(void *to, const void __user *from, un | |||
404 | return n; | 404 | return n; |
405 | } | 405 | } |
406 | 406 | ||
407 | static inline unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) | 407 | static inline unsigned long __must_check copy_to_user(void __user *to, const void *from, unsigned long n) |
408 | { | 408 | { |
409 | if (access_ok(VERIFY_WRITE, to, n)) | 409 | if (access_ok(VERIFY_WRITE, to, n)) |
410 | n = __copy_to_user(to, from, n); | 410 | n = __copy_to_user(to, from, n); |
@@ -414,14 +414,14 @@ static inline unsigned long copy_to_user(void __user *to, const void *from, unsi | |||
414 | #define __copy_to_user_inatomic __copy_to_user | 414 | #define __copy_to_user_inatomic __copy_to_user |
415 | #define __copy_from_user_inatomic __copy_from_user | 415 | #define __copy_from_user_inatomic __copy_from_user |
416 | 416 | ||
417 | static inline unsigned long clear_user(void __user *to, unsigned long n) | 417 | static inline unsigned long __must_check clear_user(void __user *to, unsigned long n) |
418 | { | 418 | { |
419 | if (access_ok(VERIFY_WRITE, to, n)) | 419 | if (access_ok(VERIFY_WRITE, to, n)) |
420 | n = __clear_user(to, n); | 420 | n = __clear_user(to, n); |
421 | return n; | 421 | return n; |
422 | } | 422 | } |
423 | 423 | ||
424 | static inline long strncpy_from_user(char *dst, const char __user *src, long count) | 424 | static inline long __must_check strncpy_from_user(char *dst, const char __user *src, long count) |
425 | { | 425 | { |
426 | long res = -EFAULT; | 426 | long res = -EFAULT; |
427 | if (access_ok(VERIFY_READ, src, 1)) | 427 | if (access_ok(VERIFY_READ, src, 1)) |
@@ -431,7 +431,7 @@ static inline long strncpy_from_user(char *dst, const char __user *src, long cou | |||
431 | 431 | ||
432 | #define strlen_user(s) strnlen_user(s, ~0UL >> 1) | 432 | #define strlen_user(s) strnlen_user(s, ~0UL >> 1) |
433 | 433 | ||
434 | static inline long strnlen_user(const char __user *s, long n) | 434 | static inline long __must_check strnlen_user(const char __user *s, long n) |
435 | { | 435 | { |
436 | unsigned long res = 0; | 436 | unsigned long res = 0; |
437 | 437 | ||
diff --git a/include/asm-avr32/atomic.h b/include/asm-avr32/atomic.h index e0b9c44c126c..c40b6032c480 100644 --- a/include/asm-avr32/atomic.h +++ b/include/asm-avr32/atomic.h | |||
@@ -41,7 +41,7 @@ static inline int atomic_sub_return(int i, atomic_t *v) | |||
41 | " stcond %1, %0\n" | 41 | " stcond %1, %0\n" |
42 | " brne 1b" | 42 | " brne 1b" |
43 | : "=&r"(result), "=o"(v->counter) | 43 | : "=&r"(result), "=o"(v->counter) |
44 | : "m"(v->counter), "ir"(i) | 44 | : "m"(v->counter), "rKs21"(i) |
45 | : "cc"); | 45 | : "cc"); |
46 | 46 | ||
47 | return result; | 47 | return result; |
@@ -58,7 +58,7 @@ static inline int atomic_add_return(int i, atomic_t *v) | |||
58 | { | 58 | { |
59 | int result; | 59 | int result; |
60 | 60 | ||
61 | if (__builtin_constant_p(i)) | 61 | if (__builtin_constant_p(i) && (i >= -1048575) && (i <= 1048576)) |
62 | result = atomic_sub_return(-i, v); | 62 | result = atomic_sub_return(-i, v); |
63 | else | 63 | else |
64 | asm volatile( | 64 | asm volatile( |
@@ -101,7 +101,7 @@ static inline int atomic_sub_unless(atomic_t *v, int a, int u) | |||
101 | " mov %1, 1\n" | 101 | " mov %1, 1\n" |
102 | "1:" | 102 | "1:" |
103 | : "=&r"(tmp), "=&r"(result), "=o"(v->counter) | 103 | : "=&r"(tmp), "=&r"(result), "=o"(v->counter) |
104 | : "m"(v->counter), "ir"(a), "ir"(u) | 104 | : "m"(v->counter), "rKs21"(a), "rKs21"(u) |
105 | : "cc", "memory"); | 105 | : "cc", "memory"); |
106 | 106 | ||
107 | return result; | 107 | return result; |
@@ -121,7 +121,7 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u) | |||
121 | { | 121 | { |
122 | int tmp, result; | 122 | int tmp, result; |
123 | 123 | ||
124 | if (__builtin_constant_p(a)) | 124 | if (__builtin_constant_p(a) && (a >= -1048575) && (a <= 1048576)) |
125 | result = atomic_sub_unless(v, -a, u); | 125 | result = atomic_sub_unless(v, -a, u); |
126 | else { | 126 | else { |
127 | result = 0; | 127 | result = 0; |
diff --git a/include/asm-avr32/io.h b/include/asm-avr32/io.h index 2fc8f111dce9..eec47500fa66 100644 --- a/include/asm-avr32/io.h +++ b/include/asm-avr32/io.h | |||
@@ -76,6 +76,39 @@ static inline unsigned int readl(const volatile void __iomem *addr) | |||
76 | #define readsw(p, d, l) __raw_readsw((unsigned int)p, d, l) | 76 | #define readsw(p, d, l) __raw_readsw((unsigned int)p, d, l) |
77 | #define readsl(p, d, l) __raw_readsl((unsigned int)p, d, l) | 77 | #define readsl(p, d, l) __raw_readsl((unsigned int)p, d, l) |
78 | 78 | ||
79 | |||
80 | /* | ||
81 | * io{read,write}{8,16,32} macros in both le (for PCI style consumers) and native be | ||
82 | */ | ||
83 | #ifndef ioread8 | ||
84 | |||
85 | #define ioread8(p) ({ unsigned int __v = __raw_readb(p); __v; }) | ||
86 | |||
87 | #define ioread16(p) ({ unsigned int __v = le16_to_cpu(__raw_readw(p)); __v; }) | ||
88 | #define ioread16be(p) ({ unsigned int __v = be16_to_cpu(__raw_readw(p)); __v; }) | ||
89 | |||
90 | #define ioread32(p) ({ unsigned int __v = le32_to_cpu(__raw_readl(p)); __v; }) | ||
91 | #define ioread32be(p) ({ unsigned int __v = be32_to_cpu(__raw_readl(p)); __v; }) | ||
92 | |||
93 | #define iowrite8(v,p) __raw_writeb(v, p) | ||
94 | |||
95 | #define iowrite16(v,p) __raw_writew(cpu_to_le16(v), p) | ||
96 | #define iowrite16be(v,p) __raw_writew(cpu_to_be16(v), p) | ||
97 | |||
98 | #define iowrite32(v,p) __raw_writel(cpu_to_le32(v), p) | ||
99 | #define iowrite32be(v,p) __raw_writel(cpu_to_be32(v), p) | ||
100 | |||
101 | #define ioread8_rep(p,d,c) __raw_readsb(p,d,c) | ||
102 | #define ioread16_rep(p,d,c) __raw_readsw(p,d,c) | ||
103 | #define ioread32_rep(p,d,c) __raw_readsl(p,d,c) | ||
104 | |||
105 | #define iowrite8_rep(p,s,c) __raw_writesb(p,s,c) | ||
106 | #define iowrite16_rep(p,s,c) __raw_writesw(p,s,c) | ||
107 | #define iowrite32_rep(p,s,c) __raw_writesl(p,s,c) | ||
108 | |||
109 | #endif | ||
110 | |||
111 | |||
79 | /* | 112 | /* |
80 | * These two are only here because ALSA _thinks_ it needs them... | 113 | * These two are only here because ALSA _thinks_ it needs them... |
81 | */ | 114 | */ |
diff --git a/include/asm-avr32/unistd.h b/include/asm-avr32/unistd.h index a50e5004550c..56ed1f9d348a 100644 --- a/include/asm-avr32/unistd.h +++ b/include/asm-avr32/unistd.h | |||
@@ -280,9 +280,10 @@ | |||
280 | #define __NR_sync_file_range 262 | 280 | #define __NR_sync_file_range 262 |
281 | #define __NR_tee 263 | 281 | #define __NR_tee 263 |
282 | #define __NR_vmsplice 264 | 282 | #define __NR_vmsplice 264 |
283 | #define __NR_epoll_pwait 265 | ||
283 | 284 | ||
284 | #ifdef __KERNEL__ | 285 | #ifdef __KERNEL__ |
285 | #define NR_syscalls 265 | 286 | #define NR_syscalls 266 |
286 | 287 | ||
287 | 288 | ||
288 | #define __ARCH_WANT_IPC_PARSE_VERSION | 289 | #define __ARCH_WANT_IPC_PARSE_VERSION |
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 69240b52f8e1..e60d6f21fa62 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
@@ -125,6 +125,10 @@ | |||
125 | *(__param) \ | 125 | *(__param) \ |
126 | VMLINUX_SYMBOL(__stop___param) = .; \ | 126 | VMLINUX_SYMBOL(__stop___param) = .; \ |
127 | } \ | 127 | } \ |
128 | \ | ||
129 | /* Unwind data binary search table */ \ | ||
130 | EH_FRAME_HDR \ | ||
131 | \ | ||
128 | __end_rodata = .; \ | 132 | __end_rodata = .; \ |
129 | . = ALIGN(4096); | 133 | . = ALIGN(4096); |
130 | 134 | ||
@@ -157,6 +161,18 @@ | |||
157 | *(.kprobes.text) \ | 161 | *(.kprobes.text) \ |
158 | VMLINUX_SYMBOL(__kprobes_text_end) = .; | 162 | VMLINUX_SYMBOL(__kprobes_text_end) = .; |
159 | 163 | ||
164 | #ifdef CONFIG_STACK_UNWIND | ||
165 | /* Unwind data binary search table */ | ||
166 | #define EH_FRAME_HDR \ | ||
167 | .eh_frame_hdr : AT(ADDR(.eh_frame_hdr) - LOAD_OFFSET) { \ | ||
168 | VMLINUX_SYMBOL(__start_unwind_hdr) = .; \ | ||
169 | *(.eh_frame_hdr) \ | ||
170 | VMLINUX_SYMBOL(__end_unwind_hdr) = .; \ | ||
171 | } | ||
172 | #else | ||
173 | #define EH_FRAME_HDR | ||
174 | #endif | ||
175 | |||
160 | /* DWARF debug sections. | 176 | /* DWARF debug sections. |
161 | Symbols in the DWARF debugging sections are relative to | 177 | Symbols in the DWARF debugging sections are relative to |
162 | the beginning of the section so we begin them at 0. */ | 178 | the beginning of the section so we begin them at 0. */ |
@@ -197,3 +213,22 @@ | |||
197 | 213 | ||
198 | #define NOTES \ | 214 | #define NOTES \ |
199 | .notes : { *(.note.*) } :note | 215 | .notes : { *(.note.*) } :note |
216 | |||
217 | #define INITCALLS \ | ||
218 | *(.initcall0.init) \ | ||
219 | *(.initcall0s.init) \ | ||
220 | *(.initcall1.init) \ | ||
221 | *(.initcall1s.init) \ | ||
222 | *(.initcall2.init) \ | ||
223 | *(.initcall2s.init) \ | ||
224 | *(.initcall3.init) \ | ||
225 | *(.initcall3s.init) \ | ||
226 | *(.initcall4.init) \ | ||
227 | *(.initcall4s.init) \ | ||
228 | *(.initcall5.init) \ | ||
229 | *(.initcall5s.init) \ | ||
230 | *(.initcall6.init) \ | ||
231 | *(.initcall6s.init) \ | ||
232 | *(.initcall7.init) \ | ||
233 | *(.initcall7s.init) | ||
234 | |||
diff --git a/include/asm-i386/acpi.h b/include/asm-i386/acpi.h index 6016632d032f..c80b3a94511a 100644 --- a/include/asm-i386/acpi.h +++ b/include/asm-i386/acpi.h | |||
@@ -132,6 +132,7 @@ extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq); | |||
132 | 132 | ||
133 | #ifdef CONFIG_X86_IO_APIC | 133 | #ifdef CONFIG_X86_IO_APIC |
134 | extern int acpi_skip_timer_override; | 134 | extern int acpi_skip_timer_override; |
135 | extern int acpi_use_timer_override; | ||
135 | #endif | 136 | #endif |
136 | 137 | ||
137 | static inline void acpi_noirq_set(void) { acpi_noirq = 1; } | 138 | static inline void acpi_noirq_set(void) { acpi_noirq = 1; } |
diff --git a/include/asm-i386/io_apic.h b/include/asm-i386/io_apic.h index 276ea7e8144a..059a9ff28b4d 100644 --- a/include/asm-i386/io_apic.h +++ b/include/asm-i386/io_apic.h | |||
@@ -12,10 +12,6 @@ | |||
12 | 12 | ||
13 | #ifdef CONFIG_X86_IO_APIC | 13 | #ifdef CONFIG_X86_IO_APIC |
14 | 14 | ||
15 | #define IO_APIC_BASE(idx) \ | ||
16 | ((volatile int *)(__fix_to_virt(FIX_IO_APIC_BASE_0 + idx) \ | ||
17 | + (mp_ioapics[idx].mpc_apicaddr & ~PAGE_MASK))) | ||
18 | |||
19 | /* | 15 | /* |
20 | * The structure of the IO-APIC: | 16 | * The structure of the IO-APIC: |
21 | */ | 17 | */ |
@@ -119,31 +115,8 @@ extern struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES]; | |||
119 | /* non-0 if default (table-less) MP configuration */ | 115 | /* non-0 if default (table-less) MP configuration */ |
120 | extern int mpc_default_type; | 116 | extern int mpc_default_type; |
121 | 117 | ||
122 | static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) | 118 | /* Older SiS APIC requires we rewrite the index register */ |
123 | { | ||
124 | *IO_APIC_BASE(apic) = reg; | ||
125 | return *(IO_APIC_BASE(apic)+4); | ||
126 | } | ||
127 | |||
128 | static inline void io_apic_write(unsigned int apic, unsigned int reg, unsigned int value) | ||
129 | { | ||
130 | *IO_APIC_BASE(apic) = reg; | ||
131 | *(IO_APIC_BASE(apic)+4) = value; | ||
132 | } | ||
133 | |||
134 | /* | ||
135 | * Re-write a value: to be used for read-modify-write | ||
136 | * cycles where the read already set up the index register. | ||
137 | * | ||
138 | * Older SiS APIC requires we rewrite the index regiser | ||
139 | */ | ||
140 | extern int sis_apic_bug; | 119 | extern int sis_apic_bug; |
141 | static inline void io_apic_modify(unsigned int apic, unsigned int reg, unsigned int value) | ||
142 | { | ||
143 | if (sis_apic_bug) | ||
144 | *IO_APIC_BASE(apic) = reg; | ||
145 | *(IO_APIC_BASE(apic)+4) = value; | ||
146 | } | ||
147 | 120 | ||
148 | /* 1 if "noapic" boot option passed */ | 121 | /* 1 if "noapic" boot option passed */ |
149 | extern int skip_ioapic_setup; | 122 | extern int skip_ioapic_setup; |
diff --git a/include/asm-i386/mach-summit/mach_apic.h b/include/asm-i386/mach-summit/mach_apic.h index ef0671e5d5c5..43e5bd8f4a19 100644 --- a/include/asm-i386/mach-summit/mach_apic.h +++ b/include/asm-i386/mach-summit/mach_apic.h | |||
@@ -88,7 +88,11 @@ static inline void clustered_apic_check(void) | |||
88 | 88 | ||
89 | static inline int apicid_to_node(int logical_apicid) | 89 | static inline int apicid_to_node(int logical_apicid) |
90 | { | 90 | { |
91 | #ifdef CONFIG_SMP | ||
91 | return apicid_2_node[hard_smp_processor_id()]; | 92 | return apicid_2_node[hard_smp_processor_id()]; |
93 | #else | ||
94 | return 0; | ||
95 | #endif | ||
92 | } | 96 | } |
93 | 97 | ||
94 | /* Mapping from cpu number to logical apicid */ | 98 | /* Mapping from cpu number to logical apicid */ |
diff --git a/include/asm-i386/mach-visws/do_timer.h b/include/asm-i386/mach-visws/do_timer.h deleted file mode 100644 index 21cd696d4d0f..000000000000 --- a/include/asm-i386/mach-visws/do_timer.h +++ /dev/null | |||
@@ -1,53 +0,0 @@ | |||
1 | /* defines for inline arch setup functions */ | ||
2 | |||
3 | #include <asm/fixmap.h> | ||
4 | #include <asm/i8259.h> | ||
5 | #include "cobalt.h" | ||
6 | |||
7 | static inline void do_timer_interrupt_hook(void) | ||
8 | { | ||
9 | /* Clear the interrupt */ | ||
10 | co_cpu_write(CO_CPU_STAT,co_cpu_read(CO_CPU_STAT) & ~CO_STAT_TIMEINTR); | ||
11 | |||
12 | do_timer(1); | ||
13 | #ifndef CONFIG_SMP | ||
14 | update_process_times(user_mode_vm(irq_regs)); | ||
15 | #endif | ||
16 | /* | ||
17 | * In the SMP case we use the local APIC timer interrupt to do the | ||
18 | * profiling, except when we simulate SMP mode on a uniprocessor | ||
19 | * system, in that case we have to call the local interrupt handler. | ||
20 | */ | ||
21 | #ifndef CONFIG_X86_LOCAL_APIC | ||
22 | profile_tick(CPU_PROFILING); | ||
23 | #else | ||
24 | if (!using_apic_timer) | ||
25 | smp_local_timer_interrupt(); | ||
26 | #endif | ||
27 | } | ||
28 | |||
29 | static inline int do_timer_overflow(int count) | ||
30 | { | ||
31 | int i; | ||
32 | |||
33 | spin_lock(&i8259A_lock); | ||
34 | /* | ||
35 | * This is tricky when I/O APICs are used; | ||
36 | * see do_timer_interrupt(). | ||
37 | */ | ||
38 | i = inb(0x20); | ||
39 | spin_unlock(&i8259A_lock); | ||
40 | |||
41 | /* assumption about timer being IRQ0 */ | ||
42 | if (i & 0x01) { | ||
43 | /* | ||
44 | * We cannot detect lost timer interrupts ... | ||
45 | * well, that's why we call them lost, don't we? :) | ||
46 | * [hmm, on the Pentium and Alpha we can ... sort of] | ||
47 | */ | ||
48 | count -= LATCH; | ||
49 | } else { | ||
50 | printk("do_slow_gettimeoffset(): hardware timer problem?\n"); | ||
51 | } | ||
52 | return count; | ||
53 | } | ||
diff --git a/include/asm-i386/mach-visws/mach_apic.h b/include/asm-i386/mach-visws/mach_apic.h index de438c7147a8..18afe6b6fc4d 100644 --- a/include/asm-i386/mach-visws/mach_apic.h +++ b/include/asm-i386/mach-visws/mach_apic.h | |||
@@ -51,6 +51,11 @@ static inline void clustered_apic_check(void) | |||
51 | { | 51 | { |
52 | } | 52 | } |
53 | 53 | ||
54 | static inline int apicid_to_node(int logical_apicid) | ||
55 | { | ||
56 | return 0; | ||
57 | } | ||
58 | |||
54 | /* Mapping from cpu number to logical apicid */ | 59 | /* Mapping from cpu number to logical apicid */ |
55 | static inline int cpu_to_logical_apicid(int cpu) | 60 | static inline int cpu_to_logical_apicid(int cpu) |
56 | { | 61 | { |
diff --git a/include/asm-ia64/sal.h b/include/asm-ia64/sal.h index 0b210abbe003..d000689d9142 100644 --- a/include/asm-ia64/sal.h +++ b/include/asm-ia64/sal.h | |||
@@ -659,6 +659,7 @@ ia64_sal_freq_base (unsigned long which, unsigned long *ticks_per_second, | |||
659 | } | 659 | } |
660 | 660 | ||
661 | extern s64 ia64_sal_cache_flush (u64 cache_type); | 661 | extern s64 ia64_sal_cache_flush (u64 cache_type); |
662 | extern void __init check_sal_cache_flush (void); | ||
662 | 663 | ||
663 | /* Initialize all the processor and platform level instruction and data caches */ | 664 | /* Initialize all the processor and platform level instruction and data caches */ |
664 | static inline s64 | 665 | static inline s64 |
diff --git a/include/asm-ia64/sn/addrs.h b/include/asm-ia64/sn/addrs.h index 1d9efe541662..e715c794b186 100644 --- a/include/asm-ia64/sn/addrs.h +++ b/include/asm-ia64/sn/addrs.h | |||
@@ -136,9 +136,13 @@ | |||
136 | */ | 136 | */ |
137 | #define TO_PHYS(x) (TO_PHYS_MASK & (x)) | 137 | #define TO_PHYS(x) (TO_PHYS_MASK & (x)) |
138 | #define TO_CAC(x) (CAC_BASE | TO_PHYS(x)) | 138 | #define TO_CAC(x) (CAC_BASE | TO_PHYS(x)) |
139 | #ifdef CONFIG_SGI_SN | ||
139 | #define TO_AMO(x) (AMO_BASE | TO_PHYS(x)) | 140 | #define TO_AMO(x) (AMO_BASE | TO_PHYS(x)) |
140 | #define TO_GET(x) (GET_BASE | TO_PHYS(x)) | 141 | #define TO_GET(x) (GET_BASE | TO_PHYS(x)) |
141 | 142 | #else | |
143 | #define TO_AMO(x) ({ BUG(); x; }) | ||
144 | #define TO_GET(x) ({ BUG(); x; }) | ||
145 | #endif | ||
142 | 146 | ||
143 | /* | 147 | /* |
144 | * Covert from processor physical address to II/TIO physical address: | 148 | * Covert from processor physical address to II/TIO physical address: |
diff --git a/include/asm-ia64/uaccess.h b/include/asm-ia64/uaccess.h index 9adb51211c22..449c8c0fa2bd 100644 --- a/include/asm-ia64/uaccess.h +++ b/include/asm-ia64/uaccess.h | |||
@@ -389,7 +389,7 @@ xlate_dev_kmem_ptr (char * p) | |||
389 | struct page *page; | 389 | struct page *page; |
390 | char * ptr; | 390 | char * ptr; |
391 | 391 | ||
392 | page = virt_to_page((unsigned long)p >> PAGE_SHIFT); | 392 | page = virt_to_page((unsigned long)p); |
393 | if (PageUncached(page)) | 393 | if (PageUncached(page)) |
394 | ptr = (char *)__pa(p) + __IA64_UNCACHED_OFFSET; | 394 | ptr = (char *)__pa(p) + __IA64_UNCACHED_OFFSET; |
395 | else | 395 | else |
diff --git a/include/asm-m68knommu/irq_regs.h b/include/asm-m68knommu/irq_regs.h new file mode 100644 index 000000000000..3dd9c0b70270 --- /dev/null +++ b/include/asm-m68knommu/irq_regs.h | |||
@@ -0,0 +1 @@ | |||
#include <asm-generic/irq_regs.h> | |||
diff --git a/include/asm-m68knommu/irqnode.h b/include/asm-m68knommu/irqnode.h index a2503dfc554c..6132a9858b52 100644 --- a/include/asm-m68knommu/irqnode.h +++ b/include/asm-m68knommu/irqnode.h | |||
@@ -8,7 +8,7 @@ | |||
8 | * interrupt source (if it supports chaining). | 8 | * interrupt source (if it supports chaining). |
9 | */ | 9 | */ |
10 | typedef struct irq_node { | 10 | typedef struct irq_node { |
11 | irqreturn_t (*handler)(int, void *, struct pt_regs *); | 11 | irq_handler_t handler; |
12 | unsigned long flags; | 12 | unsigned long flags; |
13 | void *dev_id; | 13 | void *dev_id; |
14 | const char *devname; | 14 | const char *devname; |
@@ -18,12 +18,12 @@ typedef struct irq_node { | |||
18 | /* | 18 | /* |
19 | * This structure has only 4 elements for speed reasons | 19 | * This structure has only 4 elements for speed reasons |
20 | */ | 20 | */ |
21 | typedef struct irq_handler { | 21 | struct irq_entry { |
22 | irqreturn_t (*handler)(int, void *, struct pt_regs *); | 22 | irq_handler_t handler; |
23 | unsigned long flags; | 23 | unsigned long flags; |
24 | void *dev_id; | 24 | void *dev_id; |
25 | const char *devname; | 25 | const char *devname; |
26 | } irq_handler_t; | 26 | }; |
27 | 27 | ||
28 | /* count of spurious interrupts */ | 28 | /* count of spurious interrupts */ |
29 | extern volatile unsigned int num_spurious; | 29 | extern volatile unsigned int num_spurious; |
diff --git a/include/asm-m68knommu/machdep.h b/include/asm-m68knommu/machdep.h index 27c90afd3339..6ce28f8e0ead 100644 --- a/include/asm-m68knommu/machdep.h +++ b/include/asm-m68knommu/machdep.h | |||
@@ -18,7 +18,7 @@ extern int (*mach_kbdrate) (struct kbd_repeat *); | |||
18 | extern void (*mach_kbd_leds) (unsigned int); | 18 | extern void (*mach_kbd_leds) (unsigned int); |
19 | /* machine dependent irq functions */ | 19 | /* machine dependent irq functions */ |
20 | extern void (*mach_init_IRQ) (void); | 20 | extern void (*mach_init_IRQ) (void); |
21 | extern irqreturn_t (*(*mach_default_handler)[]) (int, void *, struct pt_regs *); | 21 | extern irq_handler_t mach_default_handler; |
22 | extern int (*mach_request_irq) (unsigned int irq, void (*handler)(int, void *, struct pt_regs *), | 22 | extern int (*mach_request_irq) (unsigned int irq, void (*handler)(int, void *, struct pt_regs *), |
23 | unsigned long flags, const char *devname, void *dev_id); | 23 | unsigned long flags, const char *devname, void *dev_id); |
24 | extern void (*mach_free_irq) (unsigned int irq, void *dev_id); | 24 | extern void (*mach_free_irq) (unsigned int irq, void *dev_id); |
diff --git a/include/asm-mips/asm.h b/include/asm-mips/asm.h index e3038a4599ee..838eb3144d81 100644 --- a/include/asm-mips/asm.h +++ b/include/asm-mips/asm.h | |||
@@ -344,6 +344,7 @@ symbol = value | |||
344 | #define PTR_L lw | 344 | #define PTR_L lw |
345 | #define PTR_S sw | 345 | #define PTR_S sw |
346 | #define PTR_LA la | 346 | #define PTR_LA la |
347 | #define PTR_LI li | ||
347 | #define PTR_SLL sll | 348 | #define PTR_SLL sll |
348 | #define PTR_SLLV sllv | 349 | #define PTR_SLLV sllv |
349 | #define PTR_SRL srl | 350 | #define PTR_SRL srl |
@@ -368,6 +369,7 @@ symbol = value | |||
368 | #define PTR_L ld | 369 | #define PTR_L ld |
369 | #define PTR_S sd | 370 | #define PTR_S sd |
370 | #define PTR_LA dla | 371 | #define PTR_LA dla |
372 | #define PTR_LI dli | ||
371 | #define PTR_SLL dsll | 373 | #define PTR_SLL dsll |
372 | #define PTR_SLLV dsllv | 374 | #define PTR_SLLV dsllv |
373 | #define PTR_SRL dsrl | 375 | #define PTR_SRL dsrl |
diff --git a/include/asm-mips/cacheflush.h b/include/asm-mips/cacheflush.h index 9ab59e2bb233..e3c9925876a3 100644 --- a/include/asm-mips/cacheflush.h +++ b/include/asm-mips/cacheflush.h | |||
@@ -55,24 +55,13 @@ extern void (*flush_icache_range)(unsigned long start, unsigned long end); | |||
55 | #define flush_cache_vmap(start, end) flush_cache_all() | 55 | #define flush_cache_vmap(start, end) flush_cache_all() |
56 | #define flush_cache_vunmap(start, end) flush_cache_all() | 56 | #define flush_cache_vunmap(start, end) flush_cache_all() |
57 | 57 | ||
58 | static inline void copy_to_user_page(struct vm_area_struct *vma, | 58 | extern void copy_to_user_page(struct vm_area_struct *vma, |
59 | struct page *page, unsigned long vaddr, void *dst, const void *src, | 59 | struct page *page, unsigned long vaddr, void *dst, const void *src, |
60 | unsigned long len) | 60 | unsigned long len); |
61 | { | ||
62 | if (cpu_has_dc_aliases) | ||
63 | flush_cache_page(vma, vaddr, page_to_pfn(page)); | ||
64 | memcpy(dst, src, len); | ||
65 | __flush_icache_page(vma, page); | ||
66 | } | ||
67 | 61 | ||
68 | static inline void copy_from_user_page(struct vm_area_struct *vma, | 62 | extern void copy_from_user_page(struct vm_area_struct *vma, |
69 | struct page *page, unsigned long vaddr, void *dst, const void *src, | 63 | struct page *page, unsigned long vaddr, void *dst, const void *src, |
70 | unsigned long len) | 64 | unsigned long len); |
71 | { | ||
72 | if (cpu_has_dc_aliases) | ||
73 | flush_cache_page(vma, vaddr, page_to_pfn(page)); | ||
74 | memcpy(dst, src, len); | ||
75 | } | ||
76 | 65 | ||
77 | extern void (*flush_cache_sigtramp)(unsigned long addr); | 66 | extern void (*flush_cache_sigtramp)(unsigned long addr); |
78 | extern void (*flush_icache_all)(void); | 67 | extern void (*flush_icache_all)(void); |
diff --git a/include/asm-mips/div64.h b/include/asm-mips/div64.h index 5f7dcf5452e7..d107832de1b6 100644 --- a/include/asm-mips/div64.h +++ b/include/asm-mips/div64.h | |||
@@ -83,27 +83,6 @@ | |||
83 | #if (_MIPS_SZLONG == 64) | 83 | #if (_MIPS_SZLONG == 64) |
84 | 84 | ||
85 | /* | 85 | /* |
86 | * Don't use this one in new code | ||
87 | */ | ||
88 | #define do_div64_32(res, high, low, base) ({ \ | ||
89 | unsigned int __quot, __mod; \ | ||
90 | unsigned long __div; \ | ||
91 | unsigned int __low, __high, __base; \ | ||
92 | \ | ||
93 | __high = (high); \ | ||
94 | __low = (low); \ | ||
95 | __div = __high; \ | ||
96 | __div = __div << 32 | __low; \ | ||
97 | __base = (base); \ | ||
98 | \ | ||
99 | __mod = __div % __base; \ | ||
100 | __div = __div / __base; \ | ||
101 | \ | ||
102 | __quot = __div; \ | ||
103 | (res) = __quot; \ | ||
104 | __mod; }) | ||
105 | |||
106 | /* | ||
107 | * Hey, we're already 64-bit, no | 86 | * Hey, we're already 64-bit, no |
108 | * need to play games.. | 87 | * need to play games.. |
109 | */ | 88 | */ |
diff --git a/include/asm-mips/fixmap.h b/include/asm-mips/fixmap.h index 6959bdb59310..02c8a13fc894 100644 --- a/include/asm-mips/fixmap.h +++ b/include/asm-mips/fixmap.h | |||
@@ -45,8 +45,16 @@ | |||
45 | * fix-mapped? | 45 | * fix-mapped? |
46 | */ | 46 | */ |
47 | enum fixed_addresses { | 47 | enum fixed_addresses { |
48 | #define FIX_N_COLOURS 8 | ||
49 | FIX_CMAP_BEGIN, | ||
50 | #ifdef CONFIG_MIPS_MT_SMTC | ||
51 | FIX_CMAP_END = FIX_CMAP_BEGIN + (FIX_N_COLOURS * NR_CPUS), | ||
52 | #else | ||
53 | FIX_CMAP_END = FIX_CMAP_BEGIN + FIX_N_COLOURS, | ||
54 | #endif | ||
48 | #ifdef CONFIG_HIGHMEM | 55 | #ifdef CONFIG_HIGHMEM |
49 | FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */ | 56 | /* reserved pte's for temporary kernel mappings */ |
57 | FIX_KMAP_BEGIN = FIX_CMAP_END + 1, | ||
50 | FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, | 58 | FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, |
51 | #endif | 59 | #endif |
52 | __end_of_fixed_addresses | 60 | __end_of_fixed_addresses |
@@ -70,9 +78,9 @@ extern void __set_fixmap (enum fixed_addresses idx, | |||
70 | * at the top of mem.. | 78 | * at the top of mem.. |
71 | */ | 79 | */ |
72 | #if defined(CONFIG_CPU_TX39XX) || defined(CONFIG_CPU_TX49XX) | 80 | #if defined(CONFIG_CPU_TX39XX) || defined(CONFIG_CPU_TX49XX) |
73 | #define FIXADDR_TOP (0xff000000UL - 0x2000) | 81 | #define FIXADDR_TOP ((unsigned long)(long)(int)(0xff000000 - 0x20000)) |
74 | #else | 82 | #else |
75 | #define FIXADDR_TOP (0xffffe000UL) | 83 | #define FIXADDR_TOP ((unsigned long)(long)(int)0xfffe0000) |
76 | #endif | 84 | #endif |
77 | #define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT) | 85 | #define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT) |
78 | #define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE) | 86 | #define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE) |
diff --git a/include/asm-mips/irq.h b/include/asm-mips/irq.h index 0ce2a80b689e..35a05ca5560c 100644 --- a/include/asm-mips/irq.h +++ b/include/asm-mips/irq.h | |||
@@ -74,4 +74,8 @@ extern int setup_irq_smtc(unsigned int irq, struct irqaction * new, | |||
74 | unsigned long hwmask); | 74 | unsigned long hwmask); |
75 | #endif /* CONFIG_MIPS_MT_SMTC */ | 75 | #endif /* CONFIG_MIPS_MT_SMTC */ |
76 | 76 | ||
77 | extern int allocate_irqno(void); | ||
78 | extern void alloc_legacy_irqno(void); | ||
79 | extern void free_irqno(unsigned int irq); | ||
80 | |||
77 | #endif /* _ASM_IRQ_H */ | 81 | #endif /* _ASM_IRQ_H */ |
diff --git a/include/asm-mips/mach-au1x00/au1xxx_ide.h b/include/asm-mips/mach-au1x00/au1xxx_ide.h index 301e71300779..e9fa252f8a3f 100644 --- a/include/asm-mips/mach-au1x00/au1xxx_ide.h +++ b/include/asm-mips/mach-au1x00/au1xxx_ide.h | |||
@@ -170,10 +170,8 @@ int __init auide_probe(void); | |||
170 | static int auide_dma_host_on(ide_drive_t *drive); | 170 | static int auide_dma_host_on(ide_drive_t *drive); |
171 | static int auide_dma_lostirq(ide_drive_t *drive); | 171 | static int auide_dma_lostirq(ide_drive_t *drive); |
172 | static int auide_dma_on(ide_drive_t *drive); | 172 | static int auide_dma_on(ide_drive_t *drive); |
173 | static void auide_ddma_tx_callback(int irq, void *param, | 173 | static void auide_ddma_tx_callback(int irq, void *param); |
174 | struct pt_regs *regs); | 174 | static void auide_ddma_rx_callback(int irq, void *param); |
175 | static void auide_ddma_rx_callback(int irq, void *param, | ||
176 | struct pt_regs *regs); | ||
177 | static int auide_dma_off_quietly(ide_drive_t *drive); | 175 | static int auide_dma_off_quietly(ide_drive_t *drive); |
178 | #endif /* end CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */ | 176 | #endif /* end CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */ |
179 | 177 | ||
diff --git a/include/asm-mips/mipsmtregs.h b/include/asm-mips/mipsmtregs.h index f637ce70758f..3e9468f424f4 100644 --- a/include/asm-mips/mipsmtregs.h +++ b/include/asm-mips/mipsmtregs.h | |||
@@ -352,6 +352,8 @@ do { \ | |||
352 | #define write_vpe_c0_vpecontrol(val) mttc0(1, 1, val) | 352 | #define write_vpe_c0_vpecontrol(val) mttc0(1, 1, val) |
353 | #define read_vpe_c0_vpeconf0() mftc0(1, 2) | 353 | #define read_vpe_c0_vpeconf0() mftc0(1, 2) |
354 | #define write_vpe_c0_vpeconf0(val) mttc0(1, 2, val) | 354 | #define write_vpe_c0_vpeconf0(val) mttc0(1, 2, val) |
355 | #define read_vpe_c0_count() mftc0(9, 0) | ||
356 | #define write_vpe_c0_count(val) mttc0(9, 0, val) | ||
355 | #define read_vpe_c0_status() mftc0(12, 0) | 357 | #define read_vpe_c0_status() mftc0(12, 0) |
356 | #define write_vpe_c0_status(val) mttc0(12, 0, val) | 358 | #define write_vpe_c0_status(val) mttc0(12, 0, val) |
357 | #define read_vpe_c0_cause() mftc0(13, 0) | 359 | #define read_vpe_c0_cause() mftc0(13, 0) |
diff --git a/include/asm-mips/pgalloc.h b/include/asm-mips/pgalloc.h index 582c1fe6cc4a..af121c67dc71 100644 --- a/include/asm-mips/pgalloc.h +++ b/include/asm-mips/pgalloc.h | |||
@@ -48,7 +48,7 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm) | |||
48 | 48 | ||
49 | ret = (pgd_t *) __get_free_pages(GFP_KERNEL, PGD_ORDER); | 49 | ret = (pgd_t *) __get_free_pages(GFP_KERNEL, PGD_ORDER); |
50 | if (ret) { | 50 | if (ret) { |
51 | init = pgd_offset(&init_mm, 0); | 51 | init = pgd_offset(&init_mm, 0UL); |
52 | pgd_init((unsigned long)ret); | 52 | pgd_init((unsigned long)ret); |
53 | memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD, | 53 | memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD, |
54 | (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); | 54 | (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); |
diff --git a/include/asm-mips/pgtable-64.h b/include/asm-mips/pgtable-64.h index d05fb6f38aa7..7e7320300aa3 100644 --- a/include/asm-mips/pgtable-64.h +++ b/include/asm-mips/pgtable-64.h | |||
@@ -174,7 +174,7 @@ static inline void pud_clear(pud_t *pudp) | |||
174 | #define __pmd_offset(address) pmd_index(address) | 174 | #define __pmd_offset(address) pmd_index(address) |
175 | 175 | ||
176 | /* to find an entry in a kernel page-table-directory */ | 176 | /* to find an entry in a kernel page-table-directory */ |
177 | #define pgd_offset_k(address) pgd_offset(&init_mm, 0) | 177 | #define pgd_offset_k(address) pgd_offset(&init_mm, 0UL) |
178 | 178 | ||
179 | #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) | 179 | #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) |
180 | #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1)) | 180 | #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1)) |
diff --git a/include/asm-mips/sibyte/sb1250.h b/include/asm-mips/sibyte/sb1250.h index b09e16c93ca0..2ba6988ddc8e 100644 --- a/include/asm-mips/sibyte/sb1250.h +++ b/include/asm-mips/sibyte/sb1250.h | |||
@@ -51,8 +51,8 @@ extern void sb1250_mask_irq(int cpu, int irq); | |||
51 | extern void sb1250_unmask_irq(int cpu, int irq); | 51 | extern void sb1250_unmask_irq(int cpu, int irq); |
52 | extern void sb1250_smp_finish(void); | 52 | extern void sb1250_smp_finish(void); |
53 | 53 | ||
54 | extern void bcm1480_hpt_setup(void); | ||
54 | extern void bcm1480_time_init(void); | 55 | extern void bcm1480_time_init(void); |
55 | extern unsigned long bcm1480_gettimeoffset(void); | ||
56 | extern void bcm1480_mask_irq(int cpu, int irq); | 56 | extern void bcm1480_mask_irq(int cpu, int irq); |
57 | extern void bcm1480_unmask_irq(int cpu, int irq); | 57 | extern void bcm1480_unmask_irq(int cpu, int irq); |
58 | extern void bcm1480_smp_finish(void); | 58 | extern void bcm1480_smp_finish(void); |
diff --git a/include/asm-mips/system.h b/include/asm-mips/system.h index dcb4701d5728..3056feed5a36 100644 --- a/include/asm-mips/system.h +++ b/include/asm-mips/system.h | |||
@@ -392,7 +392,7 @@ static inline unsigned long __cmpxchg_u64(volatile int * m, unsigned long old, | |||
392 | { | 392 | { |
393 | __u64 retval; | 393 | __u64 retval; |
394 | 394 | ||
395 | if (cpu_has_llsc) { | 395 | if (cpu_has_llsc && R10000_LLSC_WAR) { |
396 | __asm__ __volatile__( | 396 | __asm__ __volatile__( |
397 | " .set push \n" | 397 | " .set push \n" |
398 | " .set noat \n" | 398 | " .set noat \n" |
diff --git a/include/asm-mips/time.h b/include/asm-mips/time.h index 28512ba2266e..625acd337bc3 100644 --- a/include/asm-mips/time.h +++ b/include/asm-mips/time.h | |||
@@ -48,7 +48,8 @@ extern void (*mips_timer_ack)(void); | |||
48 | * If mips_hpt_read is NULL, an R4k-compatible timer setup is attempted. | 48 | * If mips_hpt_read is NULL, an R4k-compatible timer setup is attempted. |
49 | */ | 49 | */ |
50 | extern unsigned int (*mips_hpt_read)(void); | 50 | extern unsigned int (*mips_hpt_read)(void); |
51 | extern void (*mips_hpt_init)(unsigned int); | 51 | extern void (*mips_hpt_init)(void); |
52 | extern unsigned int mips_hpt_mask; | ||
52 | 53 | ||
53 | /* | 54 | /* |
54 | * to_tm() converts system time back to (year, mon, day, hour, min, sec). | 55 | * to_tm() converts system time back to (year, mon, day, hour, min, sec). |
@@ -58,13 +59,6 @@ extern void (*mips_hpt_init)(unsigned int); | |||
58 | extern void to_tm(unsigned long tim, struct rtc_time *tm); | 59 | extern void to_tm(unsigned long tim, struct rtc_time *tm); |
59 | 60 | ||
60 | /* | 61 | /* |
61 | * do_gettimeoffset(). By default, this func pointer points to | ||
62 | * do_null_gettimeoffset(), which leads to the same resolution as HZ. | ||
63 | * Higher resolution versions are available, which give ~1us resolution. | ||
64 | */ | ||
65 | extern unsigned long (*do_gettimeoffset)(void); | ||
66 | |||
67 | /* | ||
68 | * high-level timer interrupt routines. | 62 | * high-level timer interrupt routines. |
69 | */ | 63 | */ |
70 | extern irqreturn_t timer_interrupt(int irq, void *dev_id); | 64 | extern irqreturn_t timer_interrupt(int irq, void *dev_id); |
diff --git a/include/asm-mips/unistd.h b/include/asm-mips/unistd.h index 30240a445dbb..ec56aa52f669 100644 --- a/include/asm-mips/unistd.h +++ b/include/asm-mips/unistd.h | |||
@@ -332,16 +332,18 @@ | |||
332 | #define __NR_set_robust_list (__NR_Linux + 309) | 332 | #define __NR_set_robust_list (__NR_Linux + 309) |
333 | #define __NR_get_robust_list (__NR_Linux + 310) | 333 | #define __NR_get_robust_list (__NR_Linux + 310) |
334 | #define __NR_kexec_load (__NR_Linux + 311) | 334 | #define __NR_kexec_load (__NR_Linux + 311) |
335 | #define __NR_getcpu (__NR_Linux + 312) | ||
336 | #define __NR_epoll_pwait (__NR_Linux + 313) | ||
335 | 337 | ||
336 | /* | 338 | /* |
337 | * Offset of the last Linux o32 flavoured syscall | 339 | * Offset of the last Linux o32 flavoured syscall |
338 | */ | 340 | */ |
339 | #define __NR_Linux_syscalls 311 | 341 | #define __NR_Linux_syscalls 313 |
340 | 342 | ||
341 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ | 343 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ |
342 | 344 | ||
343 | #define __NR_O32_Linux 4000 | 345 | #define __NR_O32_Linux 4000 |
344 | #define __NR_O32_Linux_syscalls 311 | 346 | #define __NR_O32_Linux_syscalls 313 |
345 | 347 | ||
346 | #if _MIPS_SIM == _MIPS_SIM_ABI64 | 348 | #if _MIPS_SIM == _MIPS_SIM_ABI64 |
347 | 349 | ||
@@ -620,16 +622,18 @@ | |||
620 | #define __NR_set_robust_list (__NR_Linux + 268) | 622 | #define __NR_set_robust_list (__NR_Linux + 268) |
621 | #define __NR_get_robust_list (__NR_Linux + 269) | 623 | #define __NR_get_robust_list (__NR_Linux + 269) |
622 | #define __NR_kexec_load (__NR_Linux + 270) | 624 | #define __NR_kexec_load (__NR_Linux + 270) |
625 | #define __NR_getcpu (__NR_Linux + 271) | ||
626 | #define __NR_epoll_pwait (__NR_Linux + 272) | ||
623 | 627 | ||
624 | /* | 628 | /* |
625 | * Offset of the last Linux 64-bit flavoured syscall | 629 | * Offset of the last Linux 64-bit flavoured syscall |
626 | */ | 630 | */ |
627 | #define __NR_Linux_syscalls 270 | 631 | #define __NR_Linux_syscalls 272 |
628 | 632 | ||
629 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ | 633 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ |
630 | 634 | ||
631 | #define __NR_64_Linux 5000 | 635 | #define __NR_64_Linux 5000 |
632 | #define __NR_64_Linux_syscalls 270 | 636 | #define __NR_64_Linux_syscalls 272 |
633 | 637 | ||
634 | #if _MIPS_SIM == _MIPS_SIM_NABI32 | 638 | #if _MIPS_SIM == _MIPS_SIM_NABI32 |
635 | 639 | ||
@@ -912,16 +916,18 @@ | |||
912 | #define __NR_set_robust_list (__NR_Linux + 272) | 916 | #define __NR_set_robust_list (__NR_Linux + 272) |
913 | #define __NR_get_robust_list (__NR_Linux + 273) | 917 | #define __NR_get_robust_list (__NR_Linux + 273) |
914 | #define __NR_kexec_load (__NR_Linux + 274) | 918 | #define __NR_kexec_load (__NR_Linux + 274) |
919 | #define __NR_getcpu (__NR_Linux + 275) | ||
920 | #define __NR_epoll_pwait (__NR_Linux + 276) | ||
915 | 921 | ||
916 | /* | 922 | /* |
917 | * Offset of the last N32 flavoured syscall | 923 | * Offset of the last N32 flavoured syscall |
918 | */ | 924 | */ |
919 | #define __NR_Linux_syscalls 274 | 925 | #define __NR_Linux_syscalls 276 |
920 | 926 | ||
921 | #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ | 927 | #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ |
922 | 928 | ||
923 | #define __NR_N32_Linux 6000 | 929 | #define __NR_N32_Linux 6000 |
924 | #define __NR_N32_Linux_syscalls 274 | 930 | #define __NR_N32_Linux_syscalls 276 |
925 | 931 | ||
926 | #ifdef __KERNEL__ | 932 | #ifdef __KERNEL__ |
927 | 933 | ||
@@ -1189,6 +1195,7 @@ type name (atype a,btype b,ctype c,dtype d,etype e,ftype f) \ | |||
1189 | #endif /* (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64) */ | 1195 | #endif /* (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64) */ |
1190 | 1196 | ||
1191 | 1197 | ||
1198 | #define __ARCH_OMIT_COMPAT_SYS_GETDENTS64 | ||
1192 | #define __ARCH_WANT_IPC_PARSE_VERSION | 1199 | #define __ARCH_WANT_IPC_PARSE_VERSION |
1193 | #define __ARCH_WANT_OLD_READDIR | 1200 | #define __ARCH_WANT_OLD_READDIR |
1194 | #define __ARCH_WANT_SYS_ALARM | 1201 | #define __ARCH_WANT_SYS_ALARM |
diff --git a/include/asm-parisc/semaphore.h b/include/asm-parisc/semaphore.h index c9ee41cd0707..d45827a21f94 100644 --- a/include/asm-parisc/semaphore.h +++ b/include/asm-parisc/semaphore.h | |||
@@ -115,7 +115,8 @@ extern __inline__ int down_interruptible(struct semaphore * sem) | |||
115 | */ | 115 | */ |
116 | extern __inline__ int down_trylock(struct semaphore * sem) | 116 | extern __inline__ int down_trylock(struct semaphore * sem) |
117 | { | 117 | { |
118 | int flags, count; | 118 | unsigned long flags; |
119 | int count; | ||
119 | 120 | ||
120 | spin_lock_irqsave(&sem->sentry, flags); | 121 | spin_lock_irqsave(&sem->sentry, flags); |
121 | count = sem->count - 1; | 122 | count = sem->count - 1; |
@@ -131,7 +132,8 @@ extern __inline__ int down_trylock(struct semaphore * sem) | |||
131 | */ | 132 | */ |
132 | extern __inline__ void up(struct semaphore * sem) | 133 | extern __inline__ void up(struct semaphore * sem) |
133 | { | 134 | { |
134 | int flags; | 135 | unsigned long flags; |
136 | |||
135 | spin_lock_irqsave(&sem->sentry, flags); | 137 | spin_lock_irqsave(&sem->sentry, flags); |
136 | if (sem->count < 0) { | 138 | if (sem->count < 0) { |
137 | __up(sem); | 139 | __up(sem); |
diff --git a/include/asm-powerpc/asm-compat.h b/include/asm-powerpc/asm-compat.h index 8e64be0cc47d..c89bd58ee283 100644 --- a/include/asm-powerpc/asm-compat.h +++ b/include/asm-powerpc/asm-compat.h | |||
@@ -14,6 +14,58 @@ | |||
14 | # define ASM_CONST(x) __ASM_CONST(x) | 14 | # define ASM_CONST(x) __ASM_CONST(x) |
15 | #endif | 15 | #endif |
16 | 16 | ||
17 | |||
18 | /* | ||
19 | * Feature section common macros | ||
20 | * | ||
21 | * Note that the entries now contain offsets between the table entry | ||
22 | * and the code rather than absolute code pointers in order to be | ||
23 | * useable with the vdso shared library. There is also an assumption | ||
24 | * that values will be negative, that is, the fixup table has to be | ||
25 | * located after the code it fixes up. | ||
26 | */ | ||
27 | #ifdef CONFIG_PPC64 | ||
28 | #ifdef __powerpc64__ | ||
29 | /* 64 bits kernel, 64 bits code */ | ||
30 | #define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect) \ | ||
31 | 99: \ | ||
32 | .section sect,"a"; \ | ||
33 | .align 3; \ | ||
34 | 98: \ | ||
35 | .llong msk; \ | ||
36 | .llong val; \ | ||
37 | .llong label##b-98b; \ | ||
38 | .llong 99b-98b; \ | ||
39 | .previous | ||
40 | #else /* __powerpc64__ */ | ||
41 | /* 64 bits kernel, 32 bits code (ie. vdso32) */ | ||
42 | #define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect) \ | ||
43 | 99: \ | ||
44 | .section sect,"a"; \ | ||
45 | .align 3; \ | ||
46 | 98: \ | ||
47 | .llong msk; \ | ||
48 | .llong val; \ | ||
49 | .long 0xffffffff; \ | ||
50 | .long label##b-98b; \ | ||
51 | .long 0xffffffff; \ | ||
52 | .long 99b-98b; \ | ||
53 | .previous | ||
54 | #endif /* !__powerpc64__ */ | ||
55 | #else /* CONFIG_PPC64 */ | ||
56 | /* 32 bits kernel, 32 bits code */ | ||
57 | #define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect) \ | ||
58 | 99: \ | ||
59 | .section sect,"a"; \ | ||
60 | .align 2; \ | ||
61 | 98: \ | ||
62 | .long msk; \ | ||
63 | .long val; \ | ||
64 | .long label##b-98b; \ | ||
65 | .long 99b-98b; \ | ||
66 | .previous | ||
67 | #endif /* !CONFIG_PPC64 */ | ||
68 | |||
17 | #ifdef __powerpc64__ | 69 | #ifdef __powerpc64__ |
18 | 70 | ||
19 | /* operations for longs and pointers */ | 71 | /* operations for longs and pointers */ |
diff --git a/include/asm-powerpc/cputable.h b/include/asm-powerpc/cputable.h index 12707ab9dc98..a9a40149a7c0 100644 --- a/include/asm-powerpc/cputable.h +++ b/include/asm-powerpc/cputable.h | |||
@@ -89,8 +89,11 @@ struct cpu_spec { | |||
89 | 89 | ||
90 | extern struct cpu_spec *cur_cpu_spec; | 90 | extern struct cpu_spec *cur_cpu_spec; |
91 | 91 | ||
92 | extern void identify_cpu(unsigned long offset, unsigned long cpu); | 92 | extern unsigned int __start___ftr_fixup, __stop___ftr_fixup; |
93 | extern void do_cpu_ftr_fixups(unsigned long offset); | 93 | |
94 | extern struct cpu_spec *identify_cpu(unsigned long offset); | ||
95 | extern void do_feature_fixups(unsigned long value, void *fixup_start, | ||
96 | void *fixup_end); | ||
94 | 97 | ||
95 | #endif /* __ASSEMBLY__ */ | 98 | #endif /* __ASSEMBLY__ */ |
96 | 99 | ||
@@ -144,6 +147,7 @@ extern void do_cpu_ftr_fixups(unsigned long offset); | |||
144 | #define CPU_FTR_CI_LARGE_PAGE LONG_ASM_CONST(0x0000100000000000) | 147 | #define CPU_FTR_CI_LARGE_PAGE LONG_ASM_CONST(0x0000100000000000) |
145 | #define CPU_FTR_PAUSE_ZERO LONG_ASM_CONST(0x0000200000000000) | 148 | #define CPU_FTR_PAUSE_ZERO LONG_ASM_CONST(0x0000200000000000) |
146 | #define CPU_FTR_PURR LONG_ASM_CONST(0x0000400000000000) | 149 | #define CPU_FTR_PURR LONG_ASM_CONST(0x0000400000000000) |
150 | #define CPU_FTR_CELL_TB_BUG LONG_ASM_CONST(0x0000800000000000) | ||
147 | 151 | ||
148 | #ifndef __ASSEMBLY__ | 152 | #ifndef __ASSEMBLY__ |
149 | 153 | ||
@@ -332,7 +336,7 @@ extern void do_cpu_ftr_fixups(unsigned long offset); | |||
332 | #define CPU_FTRS_CELL (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ | 336 | #define CPU_FTRS_CELL (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
333 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | 337 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ |
334 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 338 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
335 | CPU_FTR_PAUSE_ZERO | CPU_FTR_CI_LARGE_PAGE) | 339 | CPU_FTR_PAUSE_ZERO | CPU_FTR_CI_LARGE_PAGE | CPU_FTR_CELL_TB_BUG) |
336 | #define CPU_FTRS_PA6T (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ | 340 | #define CPU_FTRS_PA6T (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
337 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ | 341 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ |
338 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_CI_LARGE_PAGE | \ | 342 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_CI_LARGE_PAGE | \ |
@@ -431,29 +435,12 @@ static inline int cpu_has_feature(unsigned long feature) | |||
431 | 435 | ||
432 | #ifdef __ASSEMBLY__ | 436 | #ifdef __ASSEMBLY__ |
433 | 437 | ||
434 | #define BEGIN_FTR_SECTION 98: | 438 | #define BEGIN_FTR_SECTION_NESTED(label) label: |
435 | 439 | #define BEGIN_FTR_SECTION BEGIN_FTR_SECTION_NESTED(97) | |
436 | #ifndef __powerpc64__ | 440 | #define END_FTR_SECTION_NESTED(msk, val, label) \ |
441 | MAKE_FTR_SECTION_ENTRY(msk, val, label, __ftr_fixup) | ||
437 | #define END_FTR_SECTION(msk, val) \ | 442 | #define END_FTR_SECTION(msk, val) \ |
438 | 99: \ | 443 | END_FTR_SECTION_NESTED(msk, val, 97) |
439 | .section __ftr_fixup,"a"; \ | ||
440 | .align 2; \ | ||
441 | .long msk; \ | ||
442 | .long val; \ | ||
443 | .long 98b; \ | ||
444 | .long 99b; \ | ||
445 | .previous | ||
446 | #else /* __powerpc64__ */ | ||
447 | #define END_FTR_SECTION(msk, val) \ | ||
448 | 99: \ | ||
449 | .section __ftr_fixup,"a"; \ | ||
450 | .align 3; \ | ||
451 | .llong msk; \ | ||
452 | .llong val; \ | ||
453 | .llong 98b; \ | ||
454 | .llong 99b; \ | ||
455 | .previous | ||
456 | #endif /* __powerpc64__ */ | ||
457 | 444 | ||
458 | #define END_FTR_SECTION_IFSET(msk) END_FTR_SECTION((msk), (msk)) | 445 | #define END_FTR_SECTION_IFSET(msk) END_FTR_SECTION((msk), (msk)) |
459 | #define END_FTR_SECTION_IFCLR(msk) END_FTR_SECTION((msk), 0) | 446 | #define END_FTR_SECTION_IFCLR(msk) END_FTR_SECTION((msk), 0) |
diff --git a/include/asm-powerpc/current.h b/include/asm-powerpc/current.h index 1938d6abd255..b8708aedf925 100644 --- a/include/asm-powerpc/current.h +++ b/include/asm-powerpc/current.h | |||
@@ -14,7 +14,17 @@ struct task_struct; | |||
14 | #ifdef __powerpc64__ | 14 | #ifdef __powerpc64__ |
15 | #include <asm/paca.h> | 15 | #include <asm/paca.h> |
16 | 16 | ||
17 | #define current (get_paca()->__current) | 17 | static inline struct task_struct *get_current(void) |
18 | { | ||
19 | struct task_struct *task; | ||
20 | |||
21 | __asm__ __volatile__("ld %0,%1(13)" | ||
22 | : "=r" (task) | ||
23 | : "i" (offsetof(struct paca_struct, __current))); | ||
24 | |||
25 | return task; | ||
26 | } | ||
27 | #define current get_current() | ||
18 | 28 | ||
19 | #else | 29 | #else |
20 | 30 | ||
diff --git a/include/asm-powerpc/firmware.h b/include/asm-powerpc/firmware.h index 1022737f4f34..fdf9aff71150 100644 --- a/include/asm-powerpc/firmware.h +++ b/include/asm-powerpc/firmware.h | |||
@@ -96,19 +96,16 @@ extern void machine_check_fwnmi(void); | |||
96 | /* This is true if we are using the firmware NMI handler (typically LPAR) */ | 96 | /* This is true if we are using the firmware NMI handler (typically LPAR) */ |
97 | extern int fwnmi_active; | 97 | extern int fwnmi_active; |
98 | 98 | ||
99 | #else /* __ASSEMBLY__ */ | 99 | extern unsigned int __start___fw_ftr_fixup, __stop___fw_ftr_fixup; |
100 | 100 | ||
101 | #define BEGIN_FW_FTR_SECTION 96: | 101 | #else /* __ASSEMBLY__ */ |
102 | 102 | ||
103 | #define BEGIN_FW_FTR_SECTION_NESTED(label) label: | ||
104 | #define BEGIN_FW_FTR_SECTION BEGIN_FW_FTR_SECTION_NESTED(97) | ||
105 | #define END_FW_FTR_SECTION_NESTED(msk, val, label) \ | ||
106 | MAKE_FTR_SECTION_ENTRY(msk, val, label, __fw_ftr_fixup) | ||
103 | #define END_FW_FTR_SECTION(msk, val) \ | 107 | #define END_FW_FTR_SECTION(msk, val) \ |
104 | 97: \ | 108 | END_FW_FTR_SECTION_NESTED(msk, val, 97) |
105 | .section __fw_ftr_fixup,"a"; \ | ||
106 | .align 3; \ | ||
107 | .llong msk; \ | ||
108 | .llong val; \ | ||
109 | .llong 96b; \ | ||
110 | .llong 97b; \ | ||
111 | .previous | ||
112 | 109 | ||
113 | #define END_FW_FTR_SECTION_IFSET(msk) END_FW_FTR_SECTION((msk), (msk)) | 110 | #define END_FW_FTR_SECTION_IFSET(msk) END_FW_FTR_SECTION((msk), (msk)) |
114 | #define END_FW_FTR_SECTION_IFCLR(msk) END_FW_FTR_SECTION((msk), 0) | 111 | #define END_FW_FTR_SECTION_IFCLR(msk) END_FW_FTR_SECTION((msk), 0) |
diff --git a/include/asm-powerpc/i8259.h b/include/asm-powerpc/i8259.h index 78489fb8d140..db1362f8c603 100644 --- a/include/asm-powerpc/i8259.h +++ b/include/asm-powerpc/i8259.h | |||
@@ -7,6 +7,7 @@ | |||
7 | #ifdef CONFIG_PPC_MERGE | 7 | #ifdef CONFIG_PPC_MERGE |
8 | extern void i8259_init(struct device_node *node, unsigned long intack_addr); | 8 | extern void i8259_init(struct device_node *node, unsigned long intack_addr); |
9 | extern unsigned int i8259_irq(void); | 9 | extern unsigned int i8259_irq(void); |
10 | extern struct irq_host *i8259_get_host(void); | ||
10 | #else | 11 | #else |
11 | extern void i8259_init(unsigned long intack_addr, int offset); | 12 | extern void i8259_init(unsigned long intack_addr, int offset); |
12 | extern int i8259_irq(void); | 13 | extern int i8259_irq(void); |
diff --git a/include/asm-powerpc/io.h b/include/asm-powerpc/io.h index 3baff8b0fd5a..c2c5f14b5f5f 100644 --- a/include/asm-powerpc/io.h +++ b/include/asm-powerpc/io.h | |||
@@ -163,8 +163,11 @@ extern void _outsl_ns(volatile u32 __iomem *port, const void *buf, long count); | |||
163 | 163 | ||
164 | static inline void mmiowb(void) | 164 | static inline void mmiowb(void) |
165 | { | 165 | { |
166 | __asm__ __volatile__ ("sync" : : : "memory"); | 166 | unsigned long tmp; |
167 | get_paca()->io_sync = 0; | 167 | |
168 | __asm__ __volatile__("sync; li %0,0; stb %0,%1(13)" | ||
169 | : "=&r" (tmp) : "i" (offsetof(struct paca_struct, io_sync)) | ||
170 | : "memory"); | ||
168 | } | 171 | } |
169 | 172 | ||
170 | /* | 173 | /* |
diff --git a/include/asm-powerpc/iommu.h b/include/asm-powerpc/iommu.h index a5e98641a2ae..39fad685ffab 100644 --- a/include/asm-powerpc/iommu.h +++ b/include/asm-powerpc/iommu.h | |||
@@ -22,17 +22,35 @@ | |||
22 | #define _ASM_IOMMU_H | 22 | #define _ASM_IOMMU_H |
23 | #ifdef __KERNEL__ | 23 | #ifdef __KERNEL__ |
24 | 24 | ||
25 | #include <asm/types.h> | 25 | #include <linux/compiler.h> |
26 | #include <linux/spinlock.h> | 26 | #include <linux/spinlock.h> |
27 | #include <linux/device.h> | 27 | #include <linux/device.h> |
28 | #include <linux/dma-mapping.h> | 28 | #include <linux/dma-mapping.h> |
29 | #include <asm/types.h> | ||
30 | #include <asm/bitops.h> | ||
31 | |||
32 | #define IOMMU_PAGE_SHIFT 12 | ||
33 | #define IOMMU_PAGE_SIZE (ASM_CONST(1) << IOMMU_PAGE_SHIFT) | ||
34 | #define IOMMU_PAGE_MASK (~((1 << IOMMU_PAGE_SHIFT) - 1)) | ||
35 | #define IOMMU_PAGE_ALIGN(addr) _ALIGN_UP(addr, IOMMU_PAGE_SIZE) | ||
36 | |||
37 | #ifndef __ASSEMBLY__ | ||
38 | |||
39 | /* Pure 2^n version of get_order */ | ||
40 | static __inline__ __attribute_const__ int get_iommu_order(unsigned long size) | ||
41 | { | ||
42 | return __ilog2((size - 1) >> IOMMU_PAGE_SHIFT) + 1; | ||
43 | } | ||
44 | |||
45 | #endif /* __ASSEMBLY__ */ | ||
46 | |||
29 | 47 | ||
30 | /* | 48 | /* |
31 | * IOMAP_MAX_ORDER defines the largest contiguous block | 49 | * IOMAP_MAX_ORDER defines the largest contiguous block |
32 | * of dma space we can get. IOMAP_MAX_ORDER = 13 | 50 | * of dma space we can get. IOMAP_MAX_ORDER = 13 |
33 | * allows up to 2**12 pages (4096 * 4096) = 16 MB | 51 | * allows up to 2**12 pages (4096 * 4096) = 16 MB |
34 | */ | 52 | */ |
35 | #define IOMAP_MAX_ORDER 13 | 53 | #define IOMAP_MAX_ORDER 13 |
36 | 54 | ||
37 | struct iommu_table { | 55 | struct iommu_table { |
38 | unsigned long it_busno; /* Bus number this table belongs to */ | 56 | unsigned long it_busno; /* Bus number this table belongs to */ |
diff --git a/include/asm-powerpc/oprofile_impl.h b/include/asm-powerpc/oprofile_impl.h index 5b33994cd488..07a10e590c1d 100644 --- a/include/asm-powerpc/oprofile_impl.h +++ b/include/asm-powerpc/oprofile_impl.h | |||
@@ -42,7 +42,7 @@ struct op_powerpc_model { | |||
42 | void (*reg_setup) (struct op_counter_config *, | 42 | void (*reg_setup) (struct op_counter_config *, |
43 | struct op_system_config *, | 43 | struct op_system_config *, |
44 | int num_counters); | 44 | int num_counters); |
45 | void (*cpu_setup) (void *); | 45 | void (*cpu_setup) (struct op_counter_config *); |
46 | void (*start) (struct op_counter_config *); | 46 | void (*start) (struct op_counter_config *); |
47 | void (*stop) (void); | 47 | void (*stop) (void); |
48 | void (*handle_interrupt) (struct pt_regs *, | 48 | void (*handle_interrupt) (struct pt_regs *, |
@@ -121,7 +121,90 @@ static inline void ctr_write(unsigned int i, unsigned int val) | |||
121 | break; | 121 | break; |
122 | } | 122 | } |
123 | } | 123 | } |
124 | #endif /* !CONFIG_FSL_BOOKE */ | 124 | #else /* CONFIG_FSL_BOOKE */ |
125 | static inline u32 get_pmlca(int ctr) | ||
126 | { | ||
127 | u32 pmlca; | ||
128 | |||
129 | switch (ctr) { | ||
130 | case 0: | ||
131 | pmlca = mfpmr(PMRN_PMLCA0); | ||
132 | break; | ||
133 | case 1: | ||
134 | pmlca = mfpmr(PMRN_PMLCA1); | ||
135 | break; | ||
136 | case 2: | ||
137 | pmlca = mfpmr(PMRN_PMLCA2); | ||
138 | break; | ||
139 | case 3: | ||
140 | pmlca = mfpmr(PMRN_PMLCA3); | ||
141 | break; | ||
142 | default: | ||
143 | panic("Bad ctr number\n"); | ||
144 | } | ||
145 | |||
146 | return pmlca; | ||
147 | } | ||
148 | |||
149 | static inline void set_pmlca(int ctr, u32 pmlca) | ||
150 | { | ||
151 | switch (ctr) { | ||
152 | case 0: | ||
153 | mtpmr(PMRN_PMLCA0, pmlca); | ||
154 | break; | ||
155 | case 1: | ||
156 | mtpmr(PMRN_PMLCA1, pmlca); | ||
157 | break; | ||
158 | case 2: | ||
159 | mtpmr(PMRN_PMLCA2, pmlca); | ||
160 | break; | ||
161 | case 3: | ||
162 | mtpmr(PMRN_PMLCA3, pmlca); | ||
163 | break; | ||
164 | default: | ||
165 | panic("Bad ctr number\n"); | ||
166 | } | ||
167 | } | ||
168 | |||
169 | static inline unsigned int ctr_read(unsigned int i) | ||
170 | { | ||
171 | switch(i) { | ||
172 | case 0: | ||
173 | return mfpmr(PMRN_PMC0); | ||
174 | case 1: | ||
175 | return mfpmr(PMRN_PMC1); | ||
176 | case 2: | ||
177 | return mfpmr(PMRN_PMC2); | ||
178 | case 3: | ||
179 | return mfpmr(PMRN_PMC3); | ||
180 | default: | ||
181 | return 0; | ||
182 | } | ||
183 | } | ||
184 | |||
185 | static inline void ctr_write(unsigned int i, unsigned int val) | ||
186 | { | ||
187 | switch(i) { | ||
188 | case 0: | ||
189 | mtpmr(PMRN_PMC0, val); | ||
190 | break; | ||
191 | case 1: | ||
192 | mtpmr(PMRN_PMC1, val); | ||
193 | break; | ||
194 | case 2: | ||
195 | mtpmr(PMRN_PMC2, val); | ||
196 | break; | ||
197 | case 3: | ||
198 | mtpmr(PMRN_PMC3, val); | ||
199 | break; | ||
200 | default: | ||
201 | break; | ||
202 | } | ||
203 | } | ||
204 | |||
205 | |||
206 | #endif /* CONFIG_FSL_BOOKE */ | ||
207 | |||
125 | 208 | ||
126 | extern void op_powerpc_backtrace(struct pt_regs * const regs, unsigned int depth); | 209 | extern void op_powerpc_backtrace(struct pt_regs * const regs, unsigned int depth); |
127 | 210 | ||
diff --git a/include/asm-powerpc/pmc.h b/include/asm-powerpc/pmc.h index 07d6a4279319..8588be68e0ad 100644 --- a/include/asm-powerpc/pmc.h +++ b/include/asm-powerpc/pmc.h | |||
@@ -32,18 +32,5 @@ void release_pmc_hardware(void); | |||
32 | void power4_enable_pmcs(void); | 32 | void power4_enable_pmcs(void); |
33 | #endif | 33 | #endif |
34 | 34 | ||
35 | #ifdef CONFIG_FSL_BOOKE | ||
36 | void init_pmc_stop(int ctr); | ||
37 | void set_pmc_event(int ctr, int event); | ||
38 | void set_pmc_user_kernel(int ctr, int user, int kernel); | ||
39 | void set_pmc_marked(int ctr, int mark0, int mark1); | ||
40 | void pmc_start_ctr(int ctr, int enable); | ||
41 | void pmc_start_ctrs(int enable); | ||
42 | void pmc_stop_ctrs(void); | ||
43 | void dump_pmcs(void); | ||
44 | |||
45 | extern struct op_powerpc_model op_model_fsl_booke; | ||
46 | #endif | ||
47 | |||
48 | #endif /* __KERNEL__ */ | 35 | #endif /* __KERNEL__ */ |
49 | #endif /* _POWERPC_PMC_H */ | 36 | #endif /* _POWERPC_PMC_H */ |
diff --git a/include/asm-powerpc/ppc_asm.h b/include/asm-powerpc/ppc_asm.h index a940cfe040da..fa083d8e4663 100644 --- a/include/asm-powerpc/ppc_asm.h +++ b/include/asm-powerpc/ppc_asm.h | |||
@@ -30,9 +30,9 @@ BEGIN_FTR_SECTION; \ | |||
30 | mfspr ra,SPRN_PURR; /* get processor util. reg */ \ | 30 | mfspr ra,SPRN_PURR; /* get processor util. reg */ \ |
31 | END_FTR_SECTION_IFSET(CPU_FTR_PURR); \ | 31 | END_FTR_SECTION_IFSET(CPU_FTR_PURR); \ |
32 | BEGIN_FTR_SECTION; \ | 32 | BEGIN_FTR_SECTION; \ |
33 | mftb ra; /* or get TB if no PURR */ \ | 33 | MFTB(ra); /* or get TB if no PURR */ \ |
34 | END_FTR_SECTION_IFCLR(CPU_FTR_PURR); \ | 34 | END_FTR_SECTION_IFCLR(CPU_FTR_PURR); \ |
35 | ld rb,PACA_STARTPURR(r13); \ | 35 | ld rb,PACA_STARTPURR(r13); \ |
36 | std ra,PACA_STARTPURR(r13); \ | 36 | std ra,PACA_STARTPURR(r13); \ |
37 | subf rb,rb,ra; /* subtract start value */ \ | 37 | subf rb,rb,ra; /* subtract start value */ \ |
38 | ld ra,PACA_USER_TIME(r13); \ | 38 | ld ra,PACA_USER_TIME(r13); \ |
@@ -45,9 +45,9 @@ BEGIN_FTR_SECTION; \ | |||
45 | mfspr ra,SPRN_PURR; /* get processor util. reg */ \ | 45 | mfspr ra,SPRN_PURR; /* get processor util. reg */ \ |
46 | END_FTR_SECTION_IFSET(CPU_FTR_PURR); \ | 46 | END_FTR_SECTION_IFSET(CPU_FTR_PURR); \ |
47 | BEGIN_FTR_SECTION; \ | 47 | BEGIN_FTR_SECTION; \ |
48 | mftb ra; /* or get TB if no PURR */ \ | 48 | MFTB(ra); /* or get TB if no PURR */ \ |
49 | END_FTR_SECTION_IFCLR(CPU_FTR_PURR); \ | 49 | END_FTR_SECTION_IFCLR(CPU_FTR_PURR); \ |
50 | ld rb,PACA_STARTPURR(r13); \ | 50 | ld rb,PACA_STARTPURR(r13); \ |
51 | std ra,PACA_STARTPURR(r13); \ | 51 | std ra,PACA_STARTPURR(r13); \ |
52 | subf rb,rb,ra; /* subtract start value */ \ | 52 | subf rb,rb,ra; /* subtract start value */ \ |
53 | ld ra,PACA_SYSTEM_TIME(r13); \ | 53 | ld ra,PACA_SYSTEM_TIME(r13); \ |
@@ -274,6 +274,16 @@ END_FTR_SECTION_IFSET(CPU_FTR_601) | |||
274 | #define ISYNC_601 | 274 | #define ISYNC_601 |
275 | #endif | 275 | #endif |
276 | 276 | ||
277 | #ifdef CONFIG_PPC_CELL | ||
278 | #define MFTB(dest) \ | ||
279 | 90: mftb dest; \ | ||
280 | BEGIN_FTR_SECTION_NESTED(96); \ | ||
281 | cmpwi dest,0; \ | ||
282 | beq- 90b; \ | ||
283 | END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96) | ||
284 | #else | ||
285 | #define MFTB(dest) mftb dest | ||
286 | #endif | ||
277 | 287 | ||
278 | #ifndef CONFIG_SMP | 288 | #ifndef CONFIG_SMP |
279 | #define TLBSYNC | 289 | #define TLBSYNC |
diff --git a/include/asm-powerpc/prom.h b/include/asm-powerpc/prom.h index 524629769336..ec11d44eaeb5 100644 --- a/include/asm-powerpc/prom.h +++ b/include/asm-powerpc/prom.h | |||
@@ -134,7 +134,7 @@ extern struct device_node *of_find_all_nodes(struct device_node *prev); | |||
134 | extern struct device_node *of_get_parent(const struct device_node *node); | 134 | extern struct device_node *of_get_parent(const struct device_node *node); |
135 | extern struct device_node *of_get_next_child(const struct device_node *node, | 135 | extern struct device_node *of_get_next_child(const struct device_node *node, |
136 | struct device_node *prev); | 136 | struct device_node *prev); |
137 | extern struct property *of_find_property(struct device_node *np, | 137 | extern struct property *of_find_property(const struct device_node *np, |
138 | const char *name, | 138 | const char *name, |
139 | int *lenp); | 139 | int *lenp); |
140 | extern struct device_node *of_node_get(struct device_node *node); | 140 | extern struct device_node *of_node_get(struct device_node *node); |
@@ -158,10 +158,12 @@ extern void of_detach_node(const struct device_node *); | |||
158 | extern void finish_device_tree(void); | 158 | extern void finish_device_tree(void); |
159 | extern void unflatten_device_tree(void); | 159 | extern void unflatten_device_tree(void); |
160 | extern void early_init_devtree(void *); | 160 | extern void early_init_devtree(void *); |
161 | extern int device_is_compatible(struct device_node *device, const char *); | 161 | extern int device_is_compatible(const struct device_node *device, |
162 | const char *); | ||
162 | extern int machine_is_compatible(const char *compat); | 163 | extern int machine_is_compatible(const char *compat); |
163 | extern const void *get_property(struct device_node *node, const char *name, | 164 | extern const void *get_property(const struct device_node *node, |
164 | int *lenp); | 165 | const char *name, |
166 | int *lenp); | ||
165 | extern void print_properties(struct device_node *node); | 167 | extern void print_properties(struct device_node *node); |
166 | extern int prom_n_addr_cells(struct device_node* np); | 168 | extern int prom_n_addr_cells(struct device_node* np); |
167 | extern int prom_n_size_cells(struct device_node* np); | 169 | extern int prom_n_size_cells(struct device_node* np); |
diff --git a/include/asm-powerpc/reg.h b/include/asm-powerpc/reg.h index 8fb96811b55d..6faae7b14d55 100644 --- a/include/asm-powerpc/reg.h +++ b/include/asm-powerpc/reg.h | |||
@@ -591,6 +591,7 @@ | |||
591 | #define PV_630 0x0040 | 591 | #define PV_630 0x0040 |
592 | #define PV_630p 0x0041 | 592 | #define PV_630p 0x0041 |
593 | #define PV_970MP 0x0044 | 593 | #define PV_970MP 0x0044 |
594 | #define PV_970GX 0x0045 | ||
594 | #define PV_BE 0x0070 | 595 | #define PV_BE 0x0070 |
595 | #define PV_PA6T 0x0090 | 596 | #define PV_PA6T 0x0090 |
596 | 597 | ||
@@ -618,10 +619,35 @@ | |||
618 | : "=r" (rval)); rval;}) | 619 | : "=r" (rval)); rval;}) |
619 | #define mtspr(rn, v) asm volatile("mtspr " __stringify(rn) ",%0" : : "r" (v)) | 620 | #define mtspr(rn, v) asm volatile("mtspr " __stringify(rn) ",%0" : : "r" (v)) |
620 | 621 | ||
622 | #ifdef __powerpc64__ | ||
623 | #ifdef CONFIG_PPC_CELL | ||
624 | #define mftb() ({unsigned long rval; \ | ||
625 | asm volatile( \ | ||
626 | "90: mftb %0;\n" \ | ||
627 | "97: cmpwi %0,0;\n" \ | ||
628 | " beq- 90b;\n" \ | ||
629 | "99:\n" \ | ||
630 | ".section __ftr_fixup,\"a\"\n" \ | ||
631 | ".align 3\n" \ | ||
632 | "98:\n" \ | ||
633 | " .llong %1\n" \ | ||
634 | " .llong %1\n" \ | ||
635 | " .llong 97b-98b\n" \ | ||
636 | " .llong 99b-98b\n" \ | ||
637 | ".previous" \ | ||
638 | : "=r" (rval) : "i" (CPU_FTR_CELL_TB_BUG)); rval;}) | ||
639 | #else | ||
621 | #define mftb() ({unsigned long rval; \ | 640 | #define mftb() ({unsigned long rval; \ |
622 | asm volatile("mftb %0" : "=r" (rval)); rval;}) | 641 | asm volatile("mftb %0" : "=r" (rval)); rval;}) |
642 | #endif /* !CONFIG_PPC_CELL */ | ||
643 | |||
644 | #else /* __powerpc64__ */ | ||
645 | |||
623 | #define mftbl() ({unsigned long rval; \ | 646 | #define mftbl() ({unsigned long rval; \ |
624 | asm volatile("mftbl %0" : "=r" (rval)); rval;}) | 647 | asm volatile("mftbl %0" : "=r" (rval)); rval;}) |
648 | #define mftbu() ({unsigned long rval; \ | ||
649 | asm volatile("mftbu %0" : "=r" (rval)); rval;}) | ||
650 | #endif /* !__powerpc64__ */ | ||
625 | 651 | ||
626 | #define mttbl(v) asm volatile("mttbl %0":: "r"(v)) | 652 | #define mttbl(v) asm volatile("mttbl %0":: "r"(v)) |
627 | #define mttbu(v) asm volatile("mttbu %0":: "r"(v)) | 653 | #define mttbu(v) asm volatile("mttbu %0":: "r"(v)) |
diff --git a/include/asm-powerpc/systbl.h b/include/asm-powerpc/systbl.h index eac85ce101b6..97b435484177 100644 --- a/include/asm-powerpc/systbl.h +++ b/include/asm-powerpc/systbl.h | |||
@@ -261,7 +261,7 @@ SYSX(sys_ni_syscall, ppc_fadvise64_64, ppc_fadvise64_64) | |||
261 | PPC_SYS_SPU(rtas) | 261 | PPC_SYS_SPU(rtas) |
262 | OLDSYS(debug_setcontext) | 262 | OLDSYS(debug_setcontext) |
263 | SYSCALL(ni_syscall) | 263 | SYSCALL(ni_syscall) |
264 | SYSCALL(ni_syscall) | 264 | COMPAT_SYS(migrate_pages) |
265 | COMPAT_SYS(mbind) | 265 | COMPAT_SYS(mbind) |
266 | COMPAT_SYS(get_mempolicy) | 266 | COMPAT_SYS(get_mempolicy) |
267 | COMPAT_SYS(set_mempolicy) | 267 | COMPAT_SYS(set_mempolicy) |
@@ -304,3 +304,4 @@ SYSCALL_SPU(fchmodat) | |||
304 | SYSCALL_SPU(faccessat) | 304 | SYSCALL_SPU(faccessat) |
305 | COMPAT_SYS_SPU(get_robust_list) | 305 | COMPAT_SYS_SPU(get_robust_list) |
306 | COMPAT_SYS_SPU(set_robust_list) | 306 | COMPAT_SYS_SPU(set_robust_list) |
307 | COMPAT_SYS(move_pages) | ||
diff --git a/include/asm-powerpc/system.h b/include/asm-powerpc/system.h index 43627596003b..f7b1227d6454 100644 --- a/include/asm-powerpc/system.h +++ b/include/asm-powerpc/system.h | |||
@@ -25,8 +25,8 @@ | |||
25 | * | 25 | * |
26 | * We have to use the sync instructions for mb(), since lwsync doesn't | 26 | * We have to use the sync instructions for mb(), since lwsync doesn't |
27 | * order loads with respect to previous stores. Lwsync is fine for | 27 | * order loads with respect to previous stores. Lwsync is fine for |
28 | * rmb(), though. Note that lwsync is interpreted as sync by | 28 | * rmb(), though. Note that rmb() actually uses a sync on 32-bit |
29 | * 32-bit and older 64-bit CPUs. | 29 | * architectures. |
30 | * | 30 | * |
31 | * For wmb(), we use sync since wmb is used in drivers to order | 31 | * For wmb(), we use sync since wmb is used in drivers to order |
32 | * stores to system memory with respect to writes to the device. | 32 | * stores to system memory with respect to writes to the device. |
@@ -34,7 +34,7 @@ | |||
34 | * SMP since it is only used to order updates to system memory. | 34 | * SMP since it is only used to order updates to system memory. |
35 | */ | 35 | */ |
36 | #define mb() __asm__ __volatile__ ("sync" : : : "memory") | 36 | #define mb() __asm__ __volatile__ ("sync" : : : "memory") |
37 | #define rmb() __asm__ __volatile__ ("lwsync" : : : "memory") | 37 | #define rmb() __asm__ __volatile__ (__stringify(LWSYNC) : : : "memory") |
38 | #define wmb() __asm__ __volatile__ ("sync" : : : "memory") | 38 | #define wmb() __asm__ __volatile__ ("sync" : : : "memory") |
39 | #define read_barrier_depends() do { } while(0) | 39 | #define read_barrier_depends() do { } while(0) |
40 | 40 | ||
diff --git a/include/asm-powerpc/tce.h b/include/asm-powerpc/tce.h index c9483adbf599..f663634cccc9 100644 --- a/include/asm-powerpc/tce.h +++ b/include/asm-powerpc/tce.h | |||
@@ -22,6 +22,8 @@ | |||
22 | #define _ASM_POWERPC_TCE_H | 22 | #define _ASM_POWERPC_TCE_H |
23 | #ifdef __KERNEL__ | 23 | #ifdef __KERNEL__ |
24 | 24 | ||
25 | #include <asm/iommu.h> | ||
26 | |||
25 | /* | 27 | /* |
26 | * Tces come in two formats, one for the virtual bus and a different | 28 | * Tces come in two formats, one for the virtual bus and a different |
27 | * format for PCI | 29 | * format for PCI |
@@ -33,7 +35,6 @@ | |||
33 | 35 | ||
34 | #define TCE_SHIFT 12 | 36 | #define TCE_SHIFT 12 |
35 | #define TCE_PAGE_SIZE (1 << TCE_SHIFT) | 37 | #define TCE_PAGE_SIZE (1 << TCE_SHIFT) |
36 | #define TCE_PAGE_FACTOR (PAGE_SHIFT - TCE_SHIFT) | ||
37 | 38 | ||
38 | #define TCE_ENTRY_SIZE 8 /* each TCE is 64 bits */ | 39 | #define TCE_ENTRY_SIZE 8 /* each TCE is 64 bits */ |
39 | 40 | ||
diff --git a/include/asm-powerpc/time.h b/include/asm-powerpc/time.h index b051d4c88c3b..4cff977ad526 100644 --- a/include/asm-powerpc/time.h +++ b/include/asm-powerpc/time.h | |||
@@ -39,10 +39,6 @@ extern void generic_calibrate_decr(void); | |||
39 | extern void wakeup_decrementer(void); | 39 | extern void wakeup_decrementer(void); |
40 | extern void snapshot_timebase(void); | 40 | extern void snapshot_timebase(void); |
41 | 41 | ||
42 | #ifdef CONFIG_RTC_CLASS | ||
43 | extern int __init rtc_class_hookup(void); | ||
44 | #endif | ||
45 | |||
46 | /* Some sane defaults: 125 MHz timebase, 1GHz processor */ | 42 | /* Some sane defaults: 125 MHz timebase, 1GHz processor */ |
47 | extern unsigned long ppc_proc_freq; | 43 | extern unsigned long ppc_proc_freq; |
48 | #define DEFAULT_PROC_FREQ (DEFAULT_TB_FREQ * 8) | 44 | #define DEFAULT_PROC_FREQ (DEFAULT_TB_FREQ * 8) |
@@ -82,30 +78,35 @@ struct div_result { | |||
82 | #define __USE_RTC() 0 | 78 | #define __USE_RTC() 0 |
83 | #endif | 79 | #endif |
84 | 80 | ||
85 | /* On ppc64 this gets us the whole timebase; on ppc32 just the lower half */ | 81 | #ifdef CONFIG_PPC64 |
82 | |||
83 | /* For compatibility, get_tbl() is defined as get_tb() on ppc64 */ | ||
84 | #define get_tbl get_tb | ||
85 | |||
86 | #else | ||
87 | |||
86 | static inline unsigned long get_tbl(void) | 88 | static inline unsigned long get_tbl(void) |
87 | { | 89 | { |
88 | unsigned long tbl; | ||
89 | |||
90 | #if defined(CONFIG_403GCX) | 90 | #if defined(CONFIG_403GCX) |
91 | unsigned long tbl; | ||
91 | asm volatile("mfspr %0, 0x3dd" : "=r" (tbl)); | 92 | asm volatile("mfspr %0, 0x3dd" : "=r" (tbl)); |
93 | return tbl; | ||
92 | #else | 94 | #else |
93 | asm volatile("mftb %0" : "=r" (tbl)); | 95 | return mftbl(); |
94 | #endif | 96 | #endif |
95 | return tbl; | ||
96 | } | 97 | } |
97 | 98 | ||
98 | static inline unsigned int get_tbu(void) | 99 | static inline unsigned int get_tbu(void) |
99 | { | 100 | { |
101 | #ifdef CONFIG_403GCX | ||
100 | unsigned int tbu; | 102 | unsigned int tbu; |
101 | |||
102 | #if defined(CONFIG_403GCX) | ||
103 | asm volatile("mfspr %0, 0x3dc" : "=r" (tbu)); | 103 | asm volatile("mfspr %0, 0x3dc" : "=r" (tbu)); |
104 | return tbu; | ||
104 | #else | 105 | #else |
105 | asm volatile("mftbu %0" : "=r" (tbu)); | 106 | return mftbu(); |
106 | #endif | 107 | #endif |
107 | return tbu; | ||
108 | } | 108 | } |
109 | #endif /* !CONFIG_PPC64 */ | ||
109 | 110 | ||
110 | static inline unsigned int get_rtcl(void) | 111 | static inline unsigned int get_rtcl(void) |
111 | { | 112 | { |
@@ -131,7 +132,7 @@ static inline u64 get_tb(void) | |||
131 | { | 132 | { |
132 | return mftb(); | 133 | return mftb(); |
133 | } | 134 | } |
134 | #else | 135 | #else /* CONFIG_PPC64 */ |
135 | static inline u64 get_tb(void) | 136 | static inline u64 get_tb(void) |
136 | { | 137 | { |
137 | unsigned int tbhi, tblo, tbhi2; | 138 | unsigned int tbhi, tblo, tbhi2; |
@@ -144,7 +145,7 @@ static inline u64 get_tb(void) | |||
144 | 145 | ||
145 | return ((u64)tbhi << 32) | tblo; | 146 | return ((u64)tbhi << 32) | tblo; |
146 | } | 147 | } |
147 | #endif | 148 | #endif /* !CONFIG_PPC64 */ |
148 | 149 | ||
149 | static inline void set_tb(unsigned int upper, unsigned int lower) | 150 | static inline void set_tb(unsigned int upper, unsigned int lower) |
150 | { | 151 | { |
diff --git a/include/asm-powerpc/timex.h b/include/asm-powerpc/timex.h index 3b9a8e786806..92dedde761d1 100644 --- a/include/asm-powerpc/timex.h +++ b/include/asm-powerpc/timex.h | |||
@@ -8,6 +8,7 @@ | |||
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <asm/cputable.h> | 10 | #include <asm/cputable.h> |
11 | #include <asm/reg.h> | ||
11 | 12 | ||
12 | #define CLOCK_TICK_RATE 1024000 /* Underlying HZ */ | 13 | #define CLOCK_TICK_RATE 1024000 /* Underlying HZ */ |
13 | 14 | ||
@@ -15,13 +16,11 @@ typedef unsigned long cycles_t; | |||
15 | 16 | ||
16 | static inline cycles_t get_cycles(void) | 17 | static inline cycles_t get_cycles(void) |
17 | { | 18 | { |
18 | cycles_t ret; | ||
19 | |||
20 | #ifdef __powerpc64__ | 19 | #ifdef __powerpc64__ |
21 | 20 | return mftb(); | |
22 | __asm__ __volatile__("mftb %0" : "=r" (ret) : ); | ||
23 | |||
24 | #else | 21 | #else |
22 | cycles_t ret; | ||
23 | |||
25 | /* | 24 | /* |
26 | * For the "cycle" counter we use the timebase lower half. | 25 | * For the "cycle" counter we use the timebase lower half. |
27 | * Currently only used on SMP. | 26 | * Currently only used on SMP. |
@@ -30,18 +29,19 @@ static inline cycles_t get_cycles(void) | |||
30 | ret = 0; | 29 | ret = 0; |
31 | 30 | ||
32 | __asm__ __volatile__( | 31 | __asm__ __volatile__( |
33 | "98: mftb %0\n" | 32 | "97: mftb %0\n" |
34 | "99:\n" | 33 | "99:\n" |
35 | ".section __ftr_fixup,\"a\"\n" | 34 | ".section __ftr_fixup,\"a\"\n" |
35 | ".align 2\n" | ||
36 | "98:\n" | ||
36 | " .long %1\n" | 37 | " .long %1\n" |
37 | " .long 0\n" | 38 | " .long 0\n" |
38 | " .long 98b\n" | 39 | " .long 97b-98b\n" |
39 | " .long 99b\n" | 40 | " .long 99b-98b\n" |
40 | ".previous" | 41 | ".previous" |
41 | : "=r" (ret) : "i" (CPU_FTR_601)); | 42 | : "=r" (ret) : "i" (CPU_FTR_601)); |
42 | #endif | ||
43 | |||
44 | return ret; | 43 | return ret; |
44 | #endif | ||
45 | } | 45 | } |
46 | 46 | ||
47 | #endif /* __KERNEL__ */ | 47 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-powerpc/topology.h b/include/asm-powerpc/topology.h index 8f7ee16781a4..9fe7894ee035 100644 --- a/include/asm-powerpc/topology.h +++ b/include/asm-powerpc/topology.h | |||
@@ -96,7 +96,13 @@ static inline void sysfs_remove_device_from_node(struct sys_device *dev, | |||
96 | 96 | ||
97 | #ifdef CONFIG_SMP | 97 | #ifdef CONFIG_SMP |
98 | #include <asm/cputable.h> | 98 | #include <asm/cputable.h> |
99 | #define smt_capable() (cpu_has_feature(CPU_FTR_SMT)) | 99 | #define smt_capable() (cpu_has_feature(CPU_FTR_SMT)) |
100 | |||
101 | #ifdef CONFIG_PPC64 | ||
102 | #include <asm/smp.h> | ||
103 | |||
104 | #define topology_thread_siblings(cpu) (cpu_sibling_map[cpu]) | ||
105 | #endif | ||
100 | #endif | 106 | #endif |
101 | 107 | ||
102 | #endif /* __KERNEL__ */ | 108 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-powerpc/unistd.h b/include/asm-powerpc/unistd.h index 464a48cce7f5..0e4ea37f6466 100644 --- a/include/asm-powerpc/unistd.h +++ b/include/asm-powerpc/unistd.h | |||
@@ -276,7 +276,7 @@ | |||
276 | #define __NR_rtas 255 | 276 | #define __NR_rtas 255 |
277 | #define __NR_sys_debug_setcontext 256 | 277 | #define __NR_sys_debug_setcontext 256 |
278 | /* Number 257 is reserved for vserver */ | 278 | /* Number 257 is reserved for vserver */ |
279 | /* 258 currently unused */ | 279 | #define __NR_migrate_pages 258 |
280 | #define __NR_mbind 259 | 280 | #define __NR_mbind 259 |
281 | #define __NR_get_mempolicy 260 | 281 | #define __NR_get_mempolicy 260 |
282 | #define __NR_set_mempolicy 261 | 282 | #define __NR_set_mempolicy 261 |
@@ -323,10 +323,11 @@ | |||
323 | #define __NR_faccessat 298 | 323 | #define __NR_faccessat 298 |
324 | #define __NR_get_robust_list 299 | 324 | #define __NR_get_robust_list 299 |
325 | #define __NR_set_robust_list 300 | 325 | #define __NR_set_robust_list 300 |
326 | #define __NR_move_pages 301 | ||
326 | 327 | ||
327 | #ifdef __KERNEL__ | 328 | #ifdef __KERNEL__ |
328 | 329 | ||
329 | #define __NR_syscalls 301 | 330 | #define __NR_syscalls 302 |
330 | 331 | ||
331 | #define __NR__exit __NR_exit | 332 | #define __NR__exit __NR_exit |
332 | #define NR_syscalls __NR_syscalls | 333 | #define NR_syscalls __NR_syscalls |
diff --git a/include/asm-sh/edosk7705/io.h b/include/asm-sh/edosk7705.h index a1089a65bc36..a1089a65bc36 100644 --- a/include/asm-sh/edosk7705/io.h +++ b/include/asm-sh/edosk7705.h | |||
diff --git a/include/asm-sh/hp6xx/hp6xx.h b/include/asm-sh/hp6xx.h index f35134c159dd..f35134c159dd 100644 --- a/include/asm-sh/hp6xx/hp6xx.h +++ b/include/asm-sh/hp6xx.h | |||
diff --git a/include/asm-sh/hp6xx/ide.h b/include/asm-sh/hp6xx/ide.h deleted file mode 100644 index 570395a5ebe5..000000000000 --- a/include/asm-sh/hp6xx/ide.h +++ /dev/null | |||
@@ -1,8 +0,0 @@ | |||
1 | #ifndef __ASM_SH_HP6XX_IDE_H | ||
2 | #define __ASM_SH_HP6XX_IDE_H | ||
3 | |||
4 | #define IRQ_CFCARD 93 | ||
5 | #define IRQ_PCMCIA 94 | ||
6 | |||
7 | #endif /* __ASM_SH_HP6XX_IDE_H */ | ||
8 | |||
diff --git a/include/asm-sh/hp6xx/io.h b/include/asm-sh/hp6xx/io.h deleted file mode 100644 index 2044476ab199..000000000000 --- a/include/asm-sh/hp6xx/io.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | #ifndef __ASM_SH_HP6XX_IO_H | ||
2 | #define __ASM_SH_HP6XX_IO_H | ||
3 | |||
4 | /* | ||
5 | * Nothing special here.. just use the generic cchip io routines. | ||
6 | */ | ||
7 | #include <asm/hd64461.h> | ||
8 | |||
9 | #endif /* __ASM_SH_HP6XX_IO_H */ | ||
10 | |||
diff --git a/include/asm-sh/hs7751rvoip/hs7751rvoip.h b/include/asm-sh/hs7751rvoip.h index c4cff9d33927..c4cff9d33927 100644 --- a/include/asm-sh/hs7751rvoip/hs7751rvoip.h +++ b/include/asm-sh/hs7751rvoip.h | |||
diff --git a/include/asm-sh/hs7751rvoip/ide.h b/include/asm-sh/hs7751rvoip/ide.h deleted file mode 100644 index 65ad1d0f763b..000000000000 --- a/include/asm-sh/hs7751rvoip/ide.h +++ /dev/null | |||
@@ -1,8 +0,0 @@ | |||
1 | #ifndef __ASM_SH_HS7751RVOIP_IDE_H | ||
2 | #define __ASM_SH_HS7751RVOIP_IDE_H | ||
3 | |||
4 | /* Nothing to see here.. */ | ||
5 | #include <asm/hs7751rvoip/hs7751rvoip.h> | ||
6 | |||
7 | #endif /* __ASM_SH_HS7751RVOIP_IDE_H */ | ||
8 | |||
diff --git a/include/asm-sh/irq-sh7780.h b/include/asm-sh/irq-sh7780.h index 895c5780e454..19912ae6a7f7 100644 --- a/include/asm-sh/irq-sh7780.h +++ b/include/asm-sh/irq-sh7780.h | |||
@@ -6,16 +6,6 @@ | |||
6 | * | 6 | * |
7 | * Copyright (C) 2004 Takashi SHUDO <shudo@hitachi-ul.co.jp> | 7 | * Copyright (C) 2004 Takashi SHUDO <shudo@hitachi-ul.co.jp> |
8 | */ | 8 | */ |
9 | |||
10 | #ifdef CONFIG_IDE | ||
11 | # ifndef IRQ_CFCARD | ||
12 | # define IRQ_CFCARD 14 | ||
13 | # endif | ||
14 | # ifndef IRQ_PCMCIA | ||
15 | # define IRQ_PCMCIA 15 | ||
16 | # endif | ||
17 | #endif | ||
18 | |||
19 | #define INTC_BASE 0xffd00000 | 9 | #define INTC_BASE 0xffd00000 |
20 | #define INTC_ICR0 (INTC_BASE+0x0) | 10 | #define INTC_ICR0 (INTC_BASE+0x0) |
21 | #define INTC_ICR1 (INTC_BASE+0x1c) | 11 | #define INTC_ICR1 (INTC_BASE+0x1c) |
diff --git a/include/asm-sh/irq.h b/include/asm-sh/irq.h index 28996f9c58cc..6cd3e9e2a76a 100644 --- a/include/asm-sh/irq.h +++ b/include/asm-sh/irq.h | |||
@@ -14,16 +14,6 @@ | |||
14 | #include <asm/machvec.h> | 14 | #include <asm/machvec.h> |
15 | #include <asm/ptrace.h> /* for pt_regs */ | 15 | #include <asm/ptrace.h> /* for pt_regs */ |
16 | 16 | ||
17 | #if defined(CONFIG_SH_HP6XX) || \ | ||
18 | defined(CONFIG_SH_RTS7751R2D) || \ | ||
19 | defined(CONFIG_SH_HS7751RVOIP) || \ | ||
20 | defined(CONFIG_SH_HS7751RVOIP) || \ | ||
21 | defined(CONFIG_SH_SH03) || \ | ||
22 | defined(CONFIG_SH_R7780RP) || \ | ||
23 | defined(CONFIG_SH_LANDISK) | ||
24 | #include <asm/mach/ide.h> | ||
25 | #endif | ||
26 | |||
27 | #ifndef CONFIG_CPU_SUBTYPE_SH7780 | 17 | #ifndef CONFIG_CPU_SUBTYPE_SH7780 |
28 | 18 | ||
29 | #define INTC_DMAC0_MSK 0 | 19 | #define INTC_DMAC0_MSK 0 |
@@ -38,15 +28,6 @@ | |||
38 | #define INTC_IPRD 0xffd00010UL | 28 | #define INTC_IPRD 0xffd00010UL |
39 | #endif | 29 | #endif |
40 | 30 | ||
41 | #ifdef CONFIG_IDE | ||
42 | # ifndef IRQ_CFCARD | ||
43 | # define IRQ_CFCARD 14 | ||
44 | # endif | ||
45 | # ifndef IRQ_PCMCIA | ||
46 | # define IRQ_PCMCIA 15 | ||
47 | # endif | ||
48 | #endif | ||
49 | |||
50 | #define TIMER_IRQ 16 | 31 | #define TIMER_IRQ 16 |
51 | #define TIMER_IPR_ADDR INTC_IPRA | 32 | #define TIMER_IPR_ADDR INTC_IPRA |
52 | #define TIMER_IPR_POS 3 | 33 | #define TIMER_IPR_POS 3 |
@@ -346,11 +327,17 @@ extern unsigned short *irq_mask_register; | |||
346 | */ | 327 | */ |
347 | void init_IRQ_pint(void); | 328 | void init_IRQ_pint(void); |
348 | 329 | ||
330 | struct ipr_data { | ||
331 | unsigned int irq; | ||
332 | unsigned int addr; /* Address of Interrupt Priority Register */ | ||
333 | int shift; /* Shifts of the 16-bit data */ | ||
334 | int priority; /* The priority */ | ||
335 | }; | ||
336 | |||
349 | /* | 337 | /* |
350 | * Function for "on chip support modules". | 338 | * Function for "on chip support modules". |
351 | */ | 339 | */ |
352 | extern void make_ipr_irq(unsigned int irq, unsigned int addr, | 340 | extern void make_ipr_irq(struct ipr_data *table, unsigned int nr_irqs); |
353 | int pos, int priority); | ||
354 | extern void make_imask_irq(unsigned int irq); | 341 | extern void make_imask_irq(unsigned int irq); |
355 | 342 | ||
356 | #if defined(CONFIG_CPU_SUBTYPE_SH7300) | 343 | #if defined(CONFIG_CPU_SUBTYPE_SH7300) |
@@ -704,7 +691,7 @@ struct intc2_data { | |||
704 | unsigned char priority; | 691 | unsigned char priority; |
705 | }; | 692 | }; |
706 | 693 | ||
707 | void make_intc2_irq(struct intc2_data *); | 694 | void make_intc2_irq(struct intc2_data *, unsigned int nr_irqs); |
708 | void init_IRQ_intc2(void); | 695 | void init_IRQ_intc2(void); |
709 | #endif | 696 | #endif |
710 | 697 | ||
diff --git a/include/asm-sh/landisk/ide.h b/include/asm-sh/landisk/ide.h deleted file mode 100644 index 6490e28415ed..000000000000 --- a/include/asm-sh/landisk/ide.h +++ /dev/null | |||
@@ -1,14 +0,0 @@ | |||
1 | /* | ||
2 | * modifed by kogiidena | ||
3 | * 2005.03.03 | ||
4 | */ | ||
5 | |||
6 | #ifndef __ASM_SH_LANDISK_IDE_H | ||
7 | #define __ASM_SH_LANDISK_IDE_H | ||
8 | |||
9 | /* Nothing to see here.. */ | ||
10 | #include <asm/landisk/iodata_landisk.h> | ||
11 | #define IRQ_CFCARD IRQ_FATA /* CF Card IRQ */ | ||
12 | #define IRQ_PCMCIA IRQ_ATA /* PCMCIA IRQ */ | ||
13 | |||
14 | #endif /* __ASM_SH_LANDISK_IDE_H */ | ||
diff --git a/include/asm-sh/processor.h b/include/asm-sh/processor.h index 474773853cd1..45bb74e35d32 100644 --- a/include/asm-sh/processor.h +++ b/include/asm-sh/processor.h | |||
@@ -255,6 +255,8 @@ extern void save_fpu(struct task_struct *__tsk, struct pt_regs *regs); | |||
255 | */ | 255 | */ |
256 | #define thread_saved_pc(tsk) (tsk->thread.pc) | 256 | #define thread_saved_pc(tsk) (tsk->thread.pc) |
257 | 257 | ||
258 | void show_trace(struct task_struct *tsk, unsigned long *sp, | ||
259 | struct pt_regs *regs); | ||
258 | extern unsigned long get_wchan(struct task_struct *p); | 260 | extern unsigned long get_wchan(struct task_struct *p); |
259 | 261 | ||
260 | #define KSTK_EIP(tsk) ((tsk)->thread.pc) | 262 | #define KSTK_EIP(tsk) ((tsk)->thread.pc) |
diff --git a/include/asm-sh/r7780rp/r7780rp.h b/include/asm-sh/r7780rp.h index f95d9dba31a2..c18f648a7995 100644 --- a/include/asm-sh/r7780rp/r7780rp.h +++ b/include/asm-sh/r7780rp.h | |||
@@ -72,8 +72,6 @@ | |||
72 | 72 | ||
73 | #define PA_AX88796L 0xa4100400 /* AX88796L Area */ | 73 | #define PA_AX88796L 0xa4100400 /* AX88796L Area */ |
74 | #define PA_SC1602BSLB 0xa6000000 /* SC1602BSLB Area */ | 74 | #define PA_SC1602BSLB 0xa6000000 /* SC1602BSLB Area */ |
75 | #define PA_AREA5_IO 0xb4000000 /* Area 5 IO Memory */ | ||
76 | #define PA_AREA6_IO 0xb8000000 /* Area 6 IO Memory */ | ||
77 | #define PA_IDE_OFFSET 0x1f0 /* CF IDE Offset */ | 75 | #define PA_IDE_OFFSET 0x1f0 /* CF IDE Offset */ |
78 | #define AX88796L_IO_BASE 0x1000 /* AX88796L IO Base Address */ | 76 | #define AX88796L_IO_BASE 0x1000 /* AX88796L IO Base Address */ |
79 | 77 | ||
@@ -83,7 +81,6 @@ | |||
83 | #define IRQ_PCISLOT2 66 /* PCI Slot #2 IRQ */ | 81 | #define IRQ_PCISLOT2 66 /* PCI Slot #2 IRQ */ |
84 | #define IRQ_PCISLOT3 67 /* PCI Slot #3 IRQ */ | 82 | #define IRQ_PCISLOT3 67 /* PCI Slot #3 IRQ */ |
85 | #define IRQ_PCISLOT4 68 /* PCI Slot #4 IRQ */ | 83 | #define IRQ_PCISLOT4 68 /* PCI Slot #4 IRQ */ |
86 | #define IRQ_CFCARD 1 /* CF Card IRQ */ | ||
87 | // #define IRQ_CFINST 0 /* CF Card Insert IRQ */ | 84 | // #define IRQ_CFINST 0 /* CF Card Insert IRQ */ |
88 | #define IRQ_TP 2 /* Touch Panel IRQ */ | 85 | #define IRQ_TP 2 /* Touch Panel IRQ */ |
89 | #define IRQ_SCI1 3 /* SCI1 IRQ */ | 86 | #define IRQ_SCI1 3 /* SCI1 IRQ */ |
@@ -146,8 +143,6 @@ | |||
146 | 143 | ||
147 | #define PA_AX88796L 0xa5800400 /* AX88796L Area */ | 144 | #define PA_AX88796L 0xa5800400 /* AX88796L Area */ |
148 | #define PA_SC1602BSLB 0xa6000000 /* SC1602BSLB Area */ | 145 | #define PA_SC1602BSLB 0xa6000000 /* SC1602BSLB Area */ |
149 | #define PA_AREA5_IO 0xb4000000 /* Area 5 IO Memory */ | ||
150 | #define PA_AREA6_IO 0xb8000000 /* Area 6 IO Memory */ | ||
151 | #define PA_IDE_OFFSET 0x1f0 /* CF IDE Offset */ | 146 | #define PA_IDE_OFFSET 0x1f0 /* CF IDE Offset */ |
152 | #define AX88796L_IO_BASE 0x1000 /* AX88796L IO Base Address */ | 147 | #define AX88796L_IO_BASE 0x1000 /* AX88796L IO Base Address */ |
153 | 148 | ||
@@ -157,7 +152,6 @@ | |||
157 | #define IRQ_PCISLOT2 1 /* PCI Slot #2 IRQ */ | 152 | #define IRQ_PCISLOT2 1 /* PCI Slot #2 IRQ */ |
158 | #define IRQ_PCISLOT3 2 /* PCI Slot #3 IRQ */ | 153 | #define IRQ_PCISLOT3 2 /* PCI Slot #3 IRQ */ |
159 | #define IRQ_PCISLOT4 3 /* PCI Slot #4 IRQ */ | 154 | #define IRQ_PCISLOT4 3 /* PCI Slot #4 IRQ */ |
160 | #define IRQ_CFCARD 4 /* CF Card IRQ */ | ||
161 | #define IRQ_CFINST 5 /* CF Card Insert IRQ */ | 155 | #define IRQ_CFINST 5 /* CF Card Insert IRQ */ |
162 | #define IRQ_M66596 6 /* M66596 IRQ */ | 156 | #define IRQ_M66596 6 /* M66596 IRQ */ |
163 | #define IRQ_SDCARD 7 /* SD Card IRQ */ | 157 | #define IRQ_SDCARD 7 /* SD Card IRQ */ |
diff --git a/include/asm-sh/r7780rp/ide.h b/include/asm-sh/r7780rp/ide.h deleted file mode 100644 index a1ed78e0f617..000000000000 --- a/include/asm-sh/r7780rp/ide.h +++ /dev/null | |||
@@ -1,8 +0,0 @@ | |||
1 | #ifndef __ASM_SH_R7780RP_IDE_H | ||
2 | #define __ASM_SH_R7780RP_IDE_H | ||
3 | |||
4 | /* Nothing to see here.. */ | ||
5 | #include <asm/mach/r7780rp.h> | ||
6 | |||
7 | #endif /* __ASM_SH_R7780RP_IDE_H */ | ||
8 | |||
diff --git a/include/asm-sh/rts7751r2d/rts7751r2d.h b/include/asm-sh/rts7751r2d.h index 796b8fcb81a8..796b8fcb81a8 100644 --- a/include/asm-sh/rts7751r2d/rts7751r2d.h +++ b/include/asm-sh/rts7751r2d.h | |||
diff --git a/include/asm-sh/rts7751r2d/ide.h b/include/asm-sh/rts7751r2d/ide.h deleted file mode 100644 index 416f96b407cb..000000000000 --- a/include/asm-sh/rts7751r2d/ide.h +++ /dev/null | |||
@@ -1,8 +0,0 @@ | |||
1 | #ifndef __ASM_SH_RTS7751R2D_IDE_H | ||
2 | #define __ASM_SH_RTS7751R2D_IDE_H | ||
3 | |||
4 | /* Nothing to see here.. */ | ||
5 | #include <asm/rts7751r2d/rts7751r2d.h> | ||
6 | |||
7 | #endif /* __ASM_SH_RTS7751R2D_IDE_H */ | ||
8 | |||
diff --git a/include/asm-sh/sh03/ide.h b/include/asm-sh/sh03/ide.h deleted file mode 100644 index 73ee92e5c79e..000000000000 --- a/include/asm-sh/sh03/ide.h +++ /dev/null | |||
@@ -1,7 +0,0 @@ | |||
1 | #ifndef __ASM_SH_SH03_IDE_H | ||
2 | #define __ASM_SH_SH03_IDE_H | ||
3 | |||
4 | #define IRQ_CFCARD 8 | ||
5 | #define IRQ_PCMCIA 8 | ||
6 | |||
7 | #endif /* __ASM_SH_SH03_IDE_H */ | ||
diff --git a/include/asm-sh/shmin/shmin.h b/include/asm-sh/shmin.h index 36ba138a81fb..36ba138a81fb 100644 --- a/include/asm-sh/shmin/shmin.h +++ b/include/asm-sh/shmin.h | |||
diff --git a/include/asm-sh/system.h b/include/asm-sh/system.h index 6c1f8fde5ac4..3340126f4e0f 100644 --- a/include/asm-sh/system.h +++ b/include/asm-sh/system.h | |||
@@ -353,6 +353,13 @@ static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old, | |||
353 | (unsigned long)_n_, sizeof(*(ptr))); \ | 353 | (unsigned long)_n_, sizeof(*(ptr))); \ |
354 | }) | 354 | }) |
355 | 355 | ||
356 | extern void *set_exception_table_vec(unsigned int vec, void *handler); | ||
357 | |||
358 | static inline void *set_exception_table_evt(unsigned int evt, void *handler) | ||
359 | { | ||
360 | return set_exception_table_vec(evt >> 5, handler); | ||
361 | } | ||
362 | |||
356 | /* XXX | 363 | /* XXX |
357 | * disable hlt during certain critical i/o operations | 364 | * disable hlt during certain critical i/o operations |
358 | */ | 365 | */ |
diff --git a/include/asm-sh/unistd.h b/include/asm-sh/unistd.h index f1a0cbc966be..1c2abde122cd 100644 --- a/include/asm-sh/unistd.h +++ b/include/asm-sh/unistd.h | |||
@@ -324,8 +324,11 @@ | |||
324 | #define __NR_sync_file_range 314 | 324 | #define __NR_sync_file_range 314 |
325 | #define __NR_tee 315 | 325 | #define __NR_tee 315 |
326 | #define __NR_vmsplice 316 | 326 | #define __NR_vmsplice 316 |
327 | #define __NR_move_pages 317 | ||
328 | #define __NR_getcpu 318 | ||
329 | #define __NR_epoll_pwait 319 | ||
327 | 330 | ||
328 | #define NR_syscalls 317 | 331 | #define NR_syscalls 320 |
329 | 332 | ||
330 | #ifdef __KERNEL__ | 333 | #ifdef __KERNEL__ |
331 | 334 | ||
diff --git a/include/asm-sparc/unistd.h b/include/asm-sparc/unistd.h index c7a495afc82e..f7827fa4cd5e 100644 --- a/include/asm-sparc/unistd.h +++ b/include/asm-sparc/unistd.h | |||
@@ -318,12 +318,15 @@ | |||
318 | #define __NR_unshare 299 | 318 | #define __NR_unshare 299 |
319 | #define __NR_set_robust_list 300 | 319 | #define __NR_set_robust_list 300 |
320 | #define __NR_get_robust_list 301 | 320 | #define __NR_get_robust_list 301 |
321 | #define __NR_migrate_pages 302 | ||
322 | |||
323 | #define NR_SYSCALLS 303 | ||
321 | 324 | ||
322 | #ifdef __KERNEL__ | 325 | #ifdef __KERNEL__ |
323 | /* WARNING: You MAY NOT add syscall numbers larger than 301, since | 326 | /* WARNING: You MAY NOT add syscall numbers larger than 302, since |
324 | * all of the syscall tables in the Sparc kernel are | 327 | * all of the syscall tables in the Sparc kernel are |
325 | * sized to have 301 entries (starting at zero). Therefore | 328 | * sized to have 302 entries (starting at zero). Therefore |
326 | * find a free slot in the 0-301 range. | 329 | * find a free slot in the 0-302 range. |
327 | */ | 330 | */ |
328 | 331 | ||
329 | #define _syscall0(type,name) \ | 332 | #define _syscall0(type,name) \ |
diff --git a/include/asm-sparc64/compat.h b/include/asm-sparc64/compat.h index c73935dc7ba1..36511ca51416 100644 --- a/include/asm-sparc64/compat.h +++ b/include/asm-sparc64/compat.h | |||
@@ -164,7 +164,7 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr) | |||
164 | return (u32)(unsigned long)uptr; | 164 | return (u32)(unsigned long)uptr; |
165 | } | 165 | } |
166 | 166 | ||
167 | static __inline__ void __user *compat_alloc_user_space(long len) | 167 | static inline void __user *compat_alloc_user_space(long len) |
168 | { | 168 | { |
169 | struct pt_regs *regs = current_thread_info()->kregs; | 169 | struct pt_regs *regs = current_thread_info()->kregs; |
170 | unsigned long usp = regs->u_regs[UREG_I6]; | 170 | unsigned long usp = regs->u_regs[UREG_I6]; |
@@ -174,7 +174,10 @@ static __inline__ void __user *compat_alloc_user_space(long len) | |||
174 | else | 174 | else |
175 | usp &= 0xffffffffUL; | 175 | usp &= 0xffffffffUL; |
176 | 176 | ||
177 | return (void __user *) (usp - len); | 177 | usp -= len; |
178 | usp &= ~0x7UL; | ||
179 | |||
180 | return (void __user *) usp; | ||
178 | } | 181 | } |
179 | 182 | ||
180 | struct compat_ipc64_perm { | 183 | struct compat_ipc64_perm { |
diff --git a/include/asm-sparc64/futex.h b/include/asm-sparc64/futex.h index dee40206b221..7392fc4a954e 100644 --- a/include/asm-sparc64/futex.h +++ b/include/asm-sparc64/futex.h | |||
@@ -87,24 +87,22 @@ static inline int | |||
87 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | 87 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) |
88 | { | 88 | { |
89 | __asm__ __volatile__( | 89 | __asm__ __volatile__( |
90 | "\n1: lduwa [%2] %%asi, %0\n" | 90 | "\n1: casa [%3] %%asi, %2, %0\n" |
91 | "2: casa [%2] %%asi, %0, %1\n" | 91 | "2:\n" |
92 | "3:\n" | ||
93 | " .section .fixup,#alloc,#execinstr\n" | 92 | " .section .fixup,#alloc,#execinstr\n" |
94 | " .align 4\n" | 93 | " .align 4\n" |
95 | "4: ba 3b\n" | 94 | "3: ba 2b\n" |
96 | " mov %3, %0\n" | 95 | " mov %4, %0\n" |
97 | " .previous\n" | 96 | " .previous\n" |
98 | " .section __ex_table,\"a\"\n" | 97 | " .section __ex_table,\"a\"\n" |
99 | " .align 4\n" | 98 | " .align 4\n" |
100 | " .word 1b, 4b\n" | 99 | " .word 1b, 3b\n" |
101 | " .word 2b, 4b\n" | ||
102 | " .previous\n" | 100 | " .previous\n" |
103 | : "=&r" (oldval) | 101 | : "=r" (newval) |
104 | : "r" (newval), "r" (uaddr), "i" (-EFAULT) | 102 | : "0" (newval), "r" (oldval), "r" (uaddr), "i" (-EFAULT) |
105 | : "memory"); | 103 | : "memory"); |
106 | 104 | ||
107 | return oldval; | 105 | return newval; |
108 | } | 106 | } |
109 | 107 | ||
110 | #endif /* !(_SPARC64_FUTEX_H) */ | 108 | #endif /* !(_SPARC64_FUTEX_H) */ |
diff --git a/include/asm-sparc64/unistd.h b/include/asm-sparc64/unistd.h index 124cf076717f..63669dad0d72 100644 --- a/include/asm-sparc64/unistd.h +++ b/include/asm-sparc64/unistd.h | |||
@@ -320,12 +320,16 @@ | |||
320 | #define __NR_unshare 299 | 320 | #define __NR_unshare 299 |
321 | #define __NR_set_robust_list 300 | 321 | #define __NR_set_robust_list 300 |
322 | #define __NR_get_robust_list 301 | 322 | #define __NR_get_robust_list 301 |
323 | #define __NR_migrate_pages 302 | ||
324 | |||
325 | #define NR_SYSCALLS 303 | ||
323 | 326 | ||
324 | #ifdef __KERNEL__ | 327 | #ifdef __KERNEL__ |
325 | /* WARNING: You MAY NOT add syscall numbers larger than 301, since | 328 | |
329 | /* WARNING: You MAY NOT add syscall numbers larger than 302, since | ||
326 | * all of the syscall tables in the Sparc kernel are | 330 | * all of the syscall tables in the Sparc kernel are |
327 | * sized to have 301 entries (starting at zero). Therefore | 331 | * sized to have 302 entries (starting at zero). Therefore |
328 | * find a free slot in the 0-301 range. | 332 | * find a free slot in the 0-302 range. |
329 | */ | 333 | */ |
330 | 334 | ||
331 | #define _syscall0(type,name) \ | 335 | #define _syscall0(type,name) \ |
diff --git a/include/asm-um/common.lds.S b/include/asm-um/common.lds.S index 1010153faaf9..f0454516dd31 100644 --- a/include/asm-um/common.lds.S +++ b/include/asm-um/common.lds.S | |||
@@ -42,13 +42,7 @@ | |||
42 | 42 | ||
43 | __initcall_start = .; | 43 | __initcall_start = .; |
44 | .initcall.init : { | 44 | .initcall.init : { |
45 | *(.initcall1.init) | 45 | INITCALLS |
46 | *(.initcall2.init) | ||
47 | *(.initcall3.init) | ||
48 | *(.initcall4.init) | ||
49 | *(.initcall5.init) | ||
50 | *(.initcall6.init) | ||
51 | *(.initcall7.init) | ||
52 | } | 46 | } |
53 | __initcall_end = .; | 47 | __initcall_end = .; |
54 | 48 | ||
diff --git a/include/asm-x86_64/acpi.h b/include/asm-x86_64/acpi.h index ed59aa4c6ff9..9d1916e59c04 100644 --- a/include/asm-x86_64/acpi.h +++ b/include/asm-x86_64/acpi.h | |||
@@ -163,6 +163,7 @@ extern u8 x86_acpiid_to_apicid[]; | |||
163 | #define ARCH_HAS_POWER_INIT 1 | 163 | #define ARCH_HAS_POWER_INIT 1 |
164 | 164 | ||
165 | extern int acpi_skip_timer_override; | 165 | extern int acpi_skip_timer_override; |
166 | extern int acpi_use_timer_override; | ||
166 | 167 | ||
167 | #endif /*__KERNEL__*/ | 168 | #endif /*__KERNEL__*/ |
168 | 169 | ||
diff --git a/include/asm-x86_64/hw_irq.h b/include/asm-x86_64/hw_irq.h index 792dd52fcd70..179cce755aa7 100644 --- a/include/asm-x86_64/hw_irq.h +++ b/include/asm-x86_64/hw_irq.h | |||
@@ -76,6 +76,8 @@ | |||
76 | #ifndef __ASSEMBLY__ | 76 | #ifndef __ASSEMBLY__ |
77 | typedef int vector_irq_t[NR_VECTORS]; | 77 | typedef int vector_irq_t[NR_VECTORS]; |
78 | DECLARE_PER_CPU(vector_irq_t, vector_irq); | 78 | DECLARE_PER_CPU(vector_irq_t, vector_irq); |
79 | extern void __setup_vector_irq(int cpu); | ||
80 | extern spinlock_t vector_lock; | ||
79 | 81 | ||
80 | /* | 82 | /* |
81 | * Various low-level irq details needed by irq.c, process.c, | 83 | * Various low-level irq details needed by irq.c, process.c, |
diff --git a/include/asm-x86_64/io_apic.h b/include/asm-x86_64/io_apic.h index 171ec2dc8c04..561ecbfd4cb5 100644 --- a/include/asm-x86_64/io_apic.h +++ b/include/asm-x86_64/io_apic.h | |||
@@ -12,10 +12,6 @@ | |||
12 | 12 | ||
13 | #define APIC_MISMATCH_DEBUG | 13 | #define APIC_MISMATCH_DEBUG |
14 | 14 | ||
15 | #define IO_APIC_BASE(idx) \ | ||
16 | ((volatile int *)(__fix_to_virt(FIX_IO_APIC_BASE_0 + idx) \ | ||
17 | + (mp_ioapics[idx].mpc_apicaddr & ~PAGE_MASK))) | ||
18 | |||
19 | /* | 15 | /* |
20 | * The structure of the IO-APIC: | 16 | * The structure of the IO-APIC: |
21 | */ | 17 | */ |
@@ -119,36 +115,6 @@ extern struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES]; | |||
119 | /* non-0 if default (table-less) MP configuration */ | 115 | /* non-0 if default (table-less) MP configuration */ |
120 | extern int mpc_default_type; | 116 | extern int mpc_default_type; |
121 | 117 | ||
122 | static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) | ||
123 | { | ||
124 | *IO_APIC_BASE(apic) = reg; | ||
125 | return *(IO_APIC_BASE(apic)+4); | ||
126 | } | ||
127 | |||
128 | static inline void io_apic_write(unsigned int apic, unsigned int reg, unsigned int value) | ||
129 | { | ||
130 | *IO_APIC_BASE(apic) = reg; | ||
131 | *(IO_APIC_BASE(apic)+4) = value; | ||
132 | } | ||
133 | |||
134 | /* | ||
135 | * Re-write a value: to be used for read-modify-write | ||
136 | * cycles where the read already set up the index register. | ||
137 | */ | ||
138 | static inline void io_apic_modify(unsigned int apic, unsigned int value) | ||
139 | { | ||
140 | *(IO_APIC_BASE(apic)+4) = value; | ||
141 | } | ||
142 | |||
143 | /* | ||
144 | * Synchronize the IO-APIC and the CPU by doing | ||
145 | * a dummy read from the IO-APIC | ||
146 | */ | ||
147 | static inline void io_apic_sync(unsigned int apic) | ||
148 | { | ||
149 | (void) *(IO_APIC_BASE(apic)+4); | ||
150 | } | ||
151 | |||
152 | /* 1 if "noapic" boot option passed */ | 118 | /* 1 if "noapic" boot option passed */ |
153 | extern int skip_ioapic_setup; | 119 | extern int skip_ioapic_setup; |
154 | 120 | ||
diff --git a/include/asm-x86_64/pda.h b/include/asm-x86_64/pda.h index 14996d962bac..5642634843c4 100644 --- a/include/asm-x86_64/pda.h +++ b/include/asm-x86_64/pda.h | |||
@@ -109,6 +109,15 @@ extern struct x8664_pda _proxy_pda; | |||
109 | #define sub_pda(field,val) pda_to_op("sub",field,val) | 109 | #define sub_pda(field,val) pda_to_op("sub",field,val) |
110 | #define or_pda(field,val) pda_to_op("or",field,val) | 110 | #define or_pda(field,val) pda_to_op("or",field,val) |
111 | 111 | ||
112 | /* This is not atomic against other CPUs -- CPU preemption needs to be off */ | ||
113 | #define test_and_clear_bit_pda(bit,field) ({ \ | ||
114 | int old__; \ | ||
115 | asm volatile("btr %2,%%gs:%c3\n\tsbbl %0,%0" \ | ||
116 | : "=r" (old__), "+m" (_proxy_pda.field) \ | ||
117 | : "dIr" (bit), "i" (pda_offset(field)) : "memory"); \ | ||
118 | old__; \ | ||
119 | }) | ||
120 | |||
112 | #endif | 121 | #endif |
113 | 122 | ||
114 | #define PDA_STACKOFFSET (5*8) | 123 | #define PDA_STACKOFFSET (5*8) |
diff --git a/include/asm-x86_64/pgtable.h b/include/asm-x86_64/pgtable.h index 6899e770b173..0555c1c4d8fa 100644 --- a/include/asm-x86_64/pgtable.h +++ b/include/asm-x86_64/pgtable.h | |||
@@ -366,6 +366,7 @@ static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot) | |||
366 | { | 366 | { |
367 | pte_t pte; | 367 | pte_t pte; |
368 | pte_val(pte) = physpage | pgprot_val(pgprot); | 368 | pte_val(pte) = physpage | pgprot_val(pgprot); |
369 | pte_val(pte) &= __supported_pte_mask; | ||
369 | return pte; | 370 | return pte; |
370 | } | 371 | } |
371 | 372 | ||
diff --git a/include/asm-x86_64/proto.h b/include/asm-x86_64/proto.h index c181fef786e4..e72cfcdf5344 100644 --- a/include/asm-x86_64/proto.h +++ b/include/asm-x86_64/proto.h | |||
@@ -122,6 +122,8 @@ extern int fix_aperture; | |||
122 | extern int reboot_force; | 122 | extern int reboot_force; |
123 | extern int notsc_setup(char *); | 123 | extern int notsc_setup(char *); |
124 | 124 | ||
125 | extern int timer_over_8254; | ||
126 | |||
125 | extern int gsi_irq_sharing(int gsi); | 127 | extern int gsi_irq_sharing(int gsi); |
126 | 128 | ||
127 | extern void smp_local_timer_interrupt(void); | 129 | extern void smp_local_timer_interrupt(void); |
diff --git a/include/asm-x86_64/vsyscall.h b/include/asm-x86_64/vsyscall.h index fd452fc2c037..01d1c17e2849 100644 --- a/include/asm-x86_64/vsyscall.h +++ b/include/asm-x86_64/vsyscall.h | |||
@@ -59,8 +59,6 @@ extern seqlock_t xtime_lock; | |||
59 | 59 | ||
60 | extern int sysctl_vsyscall; | 60 | extern int sysctl_vsyscall; |
61 | 61 | ||
62 | extern void vsyscall_set_cpu(int cpu); | ||
63 | |||
64 | #define ARCH_HAVE_XTIME_LOCK 1 | 62 | #define ARCH_HAVE_XTIME_LOCK 1 |
65 | 63 | ||
66 | #endif /* __KERNEL__ */ | 64 | #endif /* __KERNEL__ */ |
diff --git a/include/linux/compat.h b/include/linux/compat.h index f4ebf96f5308..80b17f440ec1 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h | |||
@@ -196,7 +196,7 @@ asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp, | |||
196 | #define BITS_TO_COMPAT_LONGS(bits) \ | 196 | #define BITS_TO_COMPAT_LONGS(bits) \ |
197 | (((bits)+BITS_PER_COMPAT_LONG-1)/BITS_PER_COMPAT_LONG) | 197 | (((bits)+BITS_PER_COMPAT_LONG-1)/BITS_PER_COMPAT_LONG) |
198 | 198 | ||
199 | long compat_get_bitmap(unsigned long *mask, compat_ulong_t __user *umask, | 199 | long compat_get_bitmap(unsigned long *mask, const compat_ulong_t __user *umask, |
200 | unsigned long bitmap_size); | 200 | unsigned long bitmap_size); |
201 | long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask, | 201 | long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask, |
202 | unsigned long bitmap_size); | 202 | unsigned long bitmap_size); |
@@ -230,5 +230,9 @@ asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp); | |||
230 | extern int compat_printk(const char *fmt, ...); | 230 | extern int compat_printk(const char *fmt, ...); |
231 | extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat); | 231 | extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat); |
232 | 232 | ||
233 | asmlinkage long compat_sys_migrate_pages(compat_pid_t pid, | ||
234 | compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes, | ||
235 | const compat_ulong_t __user *new_nodes); | ||
236 | |||
233 | #endif /* CONFIG_COMPAT */ | 237 | #endif /* CONFIG_COMPAT */ |
234 | #endif /* _LINUX_COMPAT_H */ | 238 | #endif /* _LINUX_COMPAT_H */ |
diff --git a/include/linux/compat_ioctl.h b/include/linux/compat_ioctl.h index cfdb4f6a89d4..c26c3adcfacf 100644 --- a/include/linux/compat_ioctl.h +++ b/include/linux/compat_ioctl.h | |||
@@ -131,6 +131,7 @@ COMPATIBLE_IOCTL(RUN_ARRAY) | |||
131 | COMPATIBLE_IOCTL(STOP_ARRAY) | 131 | COMPATIBLE_IOCTL(STOP_ARRAY) |
132 | COMPATIBLE_IOCTL(STOP_ARRAY_RO) | 132 | COMPATIBLE_IOCTL(STOP_ARRAY_RO) |
133 | COMPATIBLE_IOCTL(RESTART_ARRAY_RW) | 133 | COMPATIBLE_IOCTL(RESTART_ARRAY_RW) |
134 | COMPATIBLE_IOCTL(GET_BITMAP_FILE) | ||
134 | ULONG_IOCTL(SET_BITMAP_FILE) | 135 | ULONG_IOCTL(SET_BITMAP_FILE) |
135 | /* DM */ | 136 | /* DM */ |
136 | COMPATIBLE_IOCTL(DM_VERSION_32) | 137 | COMPATIBLE_IOCTL(DM_VERSION_32) |
diff --git a/include/linux/crypto.h b/include/linux/crypto.h index 8f2ffa4caabf..6485e9716b36 100644 --- a/include/linux/crypto.h +++ b/include/linux/crypto.h | |||
@@ -245,7 +245,7 @@ int crypto_alg_available(const char *name, u32 flags) | |||
245 | __deprecated_for_modules; | 245 | __deprecated_for_modules; |
246 | int crypto_has_alg(const char *name, u32 type, u32 mask); | 246 | int crypto_has_alg(const char *name, u32 type, u32 mask); |
247 | #else | 247 | #else |
248 | static int crypto_alg_available(const char *name, u32 flags); | 248 | static int crypto_alg_available(const char *name, u32 flags) |
249 | __deprecated_for_modules; | 249 | __deprecated_for_modules; |
250 | static inline int crypto_alg_available(const char *name, u32 flags) | 250 | static inline int crypto_alg_available(const char *name, u32 flags) |
251 | { | 251 | { |
diff --git a/include/linux/device.h b/include/linux/device.h index 662e6a10144e..9d4f6a963936 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
@@ -393,7 +393,7 @@ extern void device_unregister(struct device * dev); | |||
393 | extern void device_initialize(struct device * dev); | 393 | extern void device_initialize(struct device * dev); |
394 | extern int __must_check device_add(struct device * dev); | 394 | extern int __must_check device_add(struct device * dev); |
395 | extern void device_del(struct device * dev); | 395 | extern void device_del(struct device * dev); |
396 | extern int __must_check device_for_each_child(struct device *, void *, | 396 | extern int device_for_each_child(struct device *, void *, |
397 | int (*fn)(struct device *, void *)); | 397 | int (*fn)(struct device *, void *)); |
398 | extern int device_rename(struct device *dev, char *new_name); | 398 | extern int device_rename(struct device *dev, char *new_name); |
399 | 399 | ||
diff --git a/include/linux/dmi.h b/include/linux/dmi.h index 38dc403be70b..904bf3d2d90b 100644 --- a/include/linux/dmi.h +++ b/include/linux/dmi.h | |||
@@ -69,6 +69,7 @@ extern struct dmi_device * dmi_find_device(int type, const char *name, | |||
69 | struct dmi_device *from); | 69 | struct dmi_device *from); |
70 | extern void dmi_scan_machine(void); | 70 | extern void dmi_scan_machine(void); |
71 | extern int dmi_get_year(int field); | 71 | extern int dmi_get_year(int field); |
72 | extern int dmi_name_in_vendors(char *str); | ||
72 | 73 | ||
73 | #else | 74 | #else |
74 | 75 | ||
@@ -77,6 +78,7 @@ static inline char * dmi_get_system_info(int field) { return NULL; } | |||
77 | static inline struct dmi_device * dmi_find_device(int type, const char *name, | 78 | static inline struct dmi_device * dmi_find_device(int type, const char *name, |
78 | struct dmi_device *from) { return NULL; } | 79 | struct dmi_device *from) { return NULL; } |
79 | static inline int dmi_get_year(int year) { return 0; } | 80 | static inline int dmi_get_year(int year) { return 0; } |
81 | static inline int dmi_name_in_vendors(char *s) { return 0; } | ||
80 | 82 | ||
81 | #endif | 83 | #endif |
82 | 84 | ||
diff --git a/include/linux/fs.h b/include/linux/fs.h index 661c7c572149..2fe6e3f900ba 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -623,6 +623,9 @@ enum inode_i_mutex_lock_class | |||
623 | I_MUTEX_QUOTA | 623 | I_MUTEX_QUOTA |
624 | }; | 624 | }; |
625 | 625 | ||
626 | extern void inode_double_lock(struct inode *inode1, struct inode *inode2); | ||
627 | extern void inode_double_unlock(struct inode *inode1, struct inode *inode2); | ||
628 | |||
626 | /* | 629 | /* |
627 | * NOTE: in a 32bit arch with a preemptable kernel and | 630 | * NOTE: in a 32bit arch with a preemptable kernel and |
628 | * an UP compile the i_size_read/write must be atomic | 631 | * an UP compile the i_size_read/write must be atomic |
@@ -1709,6 +1712,8 @@ extern void __iget(struct inode * inode); | |||
1709 | extern void clear_inode(struct inode *); | 1712 | extern void clear_inode(struct inode *); |
1710 | extern void destroy_inode(struct inode *); | 1713 | extern void destroy_inode(struct inode *); |
1711 | extern struct inode *new_inode(struct super_block *); | 1714 | extern struct inode *new_inode(struct super_block *); |
1715 | extern int __remove_suid(struct dentry *, int); | ||
1716 | extern int should_remove_suid(struct dentry *); | ||
1712 | extern int remove_suid(struct dentry *); | 1717 | extern int remove_suid(struct dentry *); |
1713 | extern void remove_dquot_ref(struct super_block *, int, struct list_head *); | 1718 | extern void remove_dquot_ref(struct super_block *, int, struct list_head *); |
1714 | 1719 | ||
@@ -1755,6 +1760,8 @@ extern ssize_t generic_file_splice_read(struct file *, loff_t *, | |||
1755 | struct pipe_inode_info *, size_t, unsigned int); | 1760 | struct pipe_inode_info *, size_t, unsigned int); |
1756 | extern ssize_t generic_file_splice_write(struct pipe_inode_info *, | 1761 | extern ssize_t generic_file_splice_write(struct pipe_inode_info *, |
1757 | struct file *, loff_t *, size_t, unsigned int); | 1762 | struct file *, loff_t *, size_t, unsigned int); |
1763 | extern ssize_t generic_file_splice_write_nolock(struct pipe_inode_info *, | ||
1764 | struct file *, loff_t *, size_t, unsigned int); | ||
1758 | extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, | 1765 | extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, |
1759 | struct file *out, loff_t *, size_t len, unsigned int flags); | 1766 | struct file *out, loff_t *, size_t len, unsigned int flags); |
1760 | extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, | 1767 | extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, |
diff --git a/include/linux/htirq.h b/include/linux/htirq.h index 1f15ce279a23..c96ea46737d0 100644 --- a/include/linux/htirq.h +++ b/include/linux/htirq.h | |||
@@ -1,15 +1,23 @@ | |||
1 | #ifndef LINUX_HTIRQ_H | 1 | #ifndef LINUX_HTIRQ_H |
2 | #define LINUX_HTIRQ_H | 2 | #define LINUX_HTIRQ_H |
3 | 3 | ||
4 | struct ht_irq_msg { | ||
5 | u32 address_lo; /* low 32 bits of the ht irq message */ | ||
6 | u32 address_hi; /* high 32 bits of the it irq message */ | ||
7 | }; | ||
8 | |||
4 | /* Helper functions.. */ | 9 | /* Helper functions.. */ |
5 | void write_ht_irq_low(unsigned int irq, u32 data); | 10 | void fetch_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg); |
6 | void write_ht_irq_high(unsigned int irq, u32 data); | 11 | void write_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg); |
7 | u32 read_ht_irq_low(unsigned int irq); | ||
8 | u32 read_ht_irq_high(unsigned int irq); | ||
9 | void mask_ht_irq(unsigned int irq); | 12 | void mask_ht_irq(unsigned int irq); |
10 | void unmask_ht_irq(unsigned int irq); | 13 | void unmask_ht_irq(unsigned int irq); |
11 | 14 | ||
12 | /* The arch hook for getting things started */ | 15 | /* The arch hook for getting things started */ |
13 | int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev); | 16 | int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev); |
14 | 17 | ||
18 | /* For drivers of buggy hardware */ | ||
19 | typedef void (ht_irq_update_t)(struct pci_dev *dev, int irq, | ||
20 | struct ht_irq_msg *msg); | ||
21 | int __ht_create_irq(struct pci_dev *dev, int idx, ht_irq_update_t *update); | ||
22 | |||
15 | #endif /* LINUX_HTIRQ_H */ | 23 | #endif /* LINUX_HTIRQ_H */ |
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 5081d27bfa27..ace64e57e17f 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h | |||
@@ -60,8 +60,11 @@ void hugetlb_free_pgd_range(struct mmu_gather **tlb, unsigned long addr, | |||
60 | * If the arch doesn't supply something else, assume that hugepage | 60 | * If the arch doesn't supply something else, assume that hugepage |
61 | * size aligned regions are ok without further preparation. | 61 | * size aligned regions are ok without further preparation. |
62 | */ | 62 | */ |
63 | static inline int prepare_hugepage_range(unsigned long addr, unsigned long len) | 63 | static inline int prepare_hugepage_range(unsigned long addr, unsigned long len, |
64 | pgoff_t pgoff) | ||
64 | { | 65 | { |
66 | if (pgoff & (~HPAGE_MASK >> PAGE_SHIFT)) | ||
67 | return -EINVAL; | ||
65 | if (len & ~HPAGE_MASK) | 68 | if (len & ~HPAGE_MASK) |
66 | return -EINVAL; | 69 | return -EINVAL; |
67 | if (addr & ~HPAGE_MASK) | 70 | if (addr & ~HPAGE_MASK) |
@@ -69,7 +72,8 @@ static inline int prepare_hugepage_range(unsigned long addr, unsigned long len) | |||
69 | return 0; | 72 | return 0; |
70 | } | 73 | } |
71 | #else | 74 | #else |
72 | int prepare_hugepage_range(unsigned long addr, unsigned long len); | 75 | int prepare_hugepage_range(unsigned long addr, unsigned long len, |
76 | pgoff_t pgoff); | ||
73 | #endif | 77 | #endif |
74 | 78 | ||
75 | #ifndef ARCH_HAS_SETCLEAR_HUGE_PTE | 79 | #ifndef ARCH_HAS_SETCLEAR_HUGE_PTE |
@@ -107,7 +111,7 @@ static inline unsigned long hugetlb_total_pages(void) | |||
107 | #define hugetlb_report_meminfo(buf) 0 | 111 | #define hugetlb_report_meminfo(buf) 0 |
108 | #define hugetlb_report_node_meminfo(n, buf) 0 | 112 | #define hugetlb_report_node_meminfo(n, buf) 0 |
109 | #define follow_huge_pmd(mm, addr, pmd, write) NULL | 113 | #define follow_huge_pmd(mm, addr, pmd, write) NULL |
110 | #define prepare_hugepage_range(addr, len) (-EINVAL) | 114 | #define prepare_hugepage_range(addr,len,pgoff) (-EINVAL) |
111 | #define pmd_huge(x) 0 | 115 | #define pmd_huge(x) 0 |
112 | #define is_hugepage_only_range(mm, addr, len) 0 | 116 | #define is_hugepage_only_range(mm, addr, len) 0 |
113 | #define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) ({BUG(); 0; }) | 117 | #define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) ({BUG(); 0; }) |
diff --git a/include/linux/igmp.h b/include/linux/igmp.h index 03f43e2893a4..21dd56905271 100644 --- a/include/linux/igmp.h +++ b/include/linux/igmp.h | |||
@@ -191,7 +191,7 @@ struct ip_mc_list | |||
191 | #define IGMPV3_MASK(value, nb) ((nb)>=32 ? (value) : ((1<<(nb))-1) & (value)) | 191 | #define IGMPV3_MASK(value, nb) ((nb)>=32 ? (value) : ((1<<(nb))-1) & (value)) |
192 | #define IGMPV3_EXP(thresh, nbmant, nbexp, value) \ | 192 | #define IGMPV3_EXP(thresh, nbmant, nbexp, value) \ |
193 | ((value) < (thresh) ? (value) : \ | 193 | ((value) < (thresh) ? (value) : \ |
194 | ((IGMPV3_MASK(value, nbmant) | (1<<(nbmant+nbexp))) << \ | 194 | ((IGMPV3_MASK(value, nbmant) | (1<<(nbmant))) << \ |
195 | (IGMPV3_MASK((value) >> (nbmant), nbexp) + (nbexp)))) | 195 | (IGMPV3_MASK((value) >> (nbmant), nbexp) + (nbexp)))) |
196 | 196 | ||
197 | #define IGMPV3_QQIC(value) IGMPV3_EXP(0x80, 4, 3, value) | 197 | #define IGMPV3_QQIC(value) IGMPV3_EXP(0x80, 4, 3, value) |
diff --git a/include/linux/in6.h b/include/linux/in6.h index 9be6a4756f0b..f28621f638e0 100644 --- a/include/linux/in6.h +++ b/include/linux/in6.h | |||
@@ -225,7 +225,7 @@ struct in6_flowlabel_req | |||
225 | #endif | 225 | #endif |
226 | 226 | ||
227 | /* | 227 | /* |
228 | * Netfilter | 228 | * Netfilter (1) |
229 | * | 229 | * |
230 | * Following socket options are used in ip6_tables; | 230 | * Following socket options are used in ip6_tables; |
231 | * see include/linux/netfilter_ipv6/ip6_tables.h. | 231 | * see include/linux/netfilter_ipv6/ip6_tables.h. |
@@ -240,4 +240,14 @@ struct in6_flowlabel_req | |||
240 | #define IPV6_RECVTCLASS 66 | 240 | #define IPV6_RECVTCLASS 66 |
241 | #define IPV6_TCLASS 67 | 241 | #define IPV6_TCLASS 67 |
242 | 242 | ||
243 | /* | ||
244 | * Netfilter (2) | ||
245 | * | ||
246 | * Following socket options are used in ip6_tables; | ||
247 | * see include/linux/netfilter_ipv6/ip6_tables.h. | ||
248 | * | ||
249 | * IP6T_SO_GET_REVISION_MATCH 68 | ||
250 | * IP6T_SO_GET_REVISION_TARGET 69 | ||
251 | */ | ||
252 | |||
243 | #endif | 253 | #endif |
diff --git a/include/linux/init.h b/include/linux/init.h index e92b1455d7af..5eb5d24b7680 100644 --- a/include/linux/init.h +++ b/include/linux/init.h | |||
@@ -84,19 +84,37 @@ extern void setup_arch(char **); | |||
84 | * by link order. | 84 | * by link order. |
85 | * For backwards compatibility, initcall() puts the call in | 85 | * For backwards compatibility, initcall() puts the call in |
86 | * the device init subsection. | 86 | * the device init subsection. |
87 | * | ||
88 | * The `id' arg to __define_initcall() is needed so that multiple initcalls | ||
89 | * can point at the same handler without causing duplicate-symbol build errors. | ||
87 | */ | 90 | */ |
88 | 91 | ||
89 | #define __define_initcall(level,fn) \ | 92 | #define __define_initcall(level,fn,id) \ |
90 | static initcall_t __initcall_##fn __attribute_used__ \ | 93 | static initcall_t __initcall_##fn##id __attribute_used__ \ |
91 | __attribute__((__section__(".initcall" level ".init"))) = fn | 94 | __attribute__((__section__(".initcall" level ".init"))) = fn |
92 | 95 | ||
93 | #define core_initcall(fn) __define_initcall("1",fn) | 96 | /* |
94 | #define postcore_initcall(fn) __define_initcall("2",fn) | 97 | * A "pure" initcall has no dependencies on anything else, and purely |
95 | #define arch_initcall(fn) __define_initcall("3",fn) | 98 | * initializes variables that couldn't be statically initialized. |
96 | #define subsys_initcall(fn) __define_initcall("4",fn) | 99 | * |
97 | #define fs_initcall(fn) __define_initcall("5",fn) | 100 | * This only exists for built-in code, not for modules. |
98 | #define device_initcall(fn) __define_initcall("6",fn) | 101 | */ |
99 | #define late_initcall(fn) __define_initcall("7",fn) | 102 | #define pure_initcall(fn) __define_initcall("0",fn,1) |
103 | |||
104 | #define core_initcall(fn) __define_initcall("1",fn,1) | ||
105 | #define core_initcall_sync(fn) __define_initcall("1s",fn,1s) | ||
106 | #define postcore_initcall(fn) __define_initcall("2",fn,2) | ||
107 | #define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s) | ||
108 | #define arch_initcall(fn) __define_initcall("3",fn,3) | ||
109 | #define arch_initcall_sync(fn) __define_initcall("3s",fn,3s) | ||
110 | #define subsys_initcall(fn) __define_initcall("4",fn,4) | ||
111 | #define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s) | ||
112 | #define fs_initcall(fn) __define_initcall("5",fn,5) | ||
113 | #define fs_initcall_sync(fn) __define_initcall("5s",fn,5s) | ||
114 | #define device_initcall(fn) __define_initcall("6",fn,6) | ||
115 | #define device_initcall_sync(fn) __define_initcall("6s",fn,6s) | ||
116 | #define late_initcall(fn) __define_initcall("7",fn,7) | ||
117 | #define late_initcall_sync(fn) __define_initcall("7s",fn,7s) | ||
100 | 118 | ||
101 | #define __initcall(fn) device_initcall(fn) | 119 | #define __initcall(fn) device_initcall(fn) |
102 | 120 | ||
diff --git a/include/linux/ipmi_msgdefs.h b/include/linux/ipmi_msgdefs.h index 22f5e2afda4f..4d04d8b58a0a 100644 --- a/include/linux/ipmi_msgdefs.h +++ b/include/linux/ipmi_msgdefs.h | |||
@@ -75,6 +75,8 @@ | |||
75 | #define IPMI_INVALID_COMMAND_ERR 0xc1 | 75 | #define IPMI_INVALID_COMMAND_ERR 0xc1 |
76 | #define IPMI_ERR_MSG_TRUNCATED 0xc6 | 76 | #define IPMI_ERR_MSG_TRUNCATED 0xc6 |
77 | #define IPMI_LOST_ARBITRATION_ERR 0x81 | 77 | #define IPMI_LOST_ARBITRATION_ERR 0x81 |
78 | #define IPMI_BUS_ERR 0x82 | ||
79 | #define IPMI_NAK_ON_WRITE_ERR 0x83 | ||
78 | #define IPMI_ERR_UNSPECIFIED 0xff | 80 | #define IPMI_ERR_UNSPECIFIED 0xff |
79 | 81 | ||
80 | #define IPMI_CHANNEL_PROTOCOL_IPMB 1 | 82 | #define IPMI_CHANNEL_PROTOCOL_IPMB 1 |
diff --git a/include/linux/ipx.h b/include/linux/ipx.h index 4f29c60964c4..eb19b4ea84f4 100644 --- a/include/linux/ipx.h +++ b/include/linux/ipx.h | |||
@@ -7,8 +7,8 @@ | |||
7 | 7 | ||
8 | struct sockaddr_ipx { | 8 | struct sockaddr_ipx { |
9 | sa_family_t sipx_family; | 9 | sa_family_t sipx_family; |
10 | __u16 sipx_port; | 10 | __be16 sipx_port; |
11 | __u32 sipx_network; | 11 | __be32 sipx_network; |
12 | unsigned char sipx_node[IPX_NODE_LEN]; | 12 | unsigned char sipx_node[IPX_NODE_LEN]; |
13 | __u8 sipx_type; | 13 | __u8 sipx_type; |
14 | unsigned char sipx_zero; /* 16 byte fill */ | 14 | unsigned char sipx_zero; /* 16 byte fill */ |
@@ -23,13 +23,13 @@ struct sockaddr_ipx { | |||
23 | #define IPX_CRTITF 1 | 23 | #define IPX_CRTITF 1 |
24 | 24 | ||
25 | struct ipx_route_definition { | 25 | struct ipx_route_definition { |
26 | __u32 ipx_network; | 26 | __be32 ipx_network; |
27 | __u32 ipx_router_network; | 27 | __be32 ipx_router_network; |
28 | unsigned char ipx_router_node[IPX_NODE_LEN]; | 28 | unsigned char ipx_router_node[IPX_NODE_LEN]; |
29 | }; | 29 | }; |
30 | 30 | ||
31 | struct ipx_interface_definition { | 31 | struct ipx_interface_definition { |
32 | __u32 ipx_network; | 32 | __be32 ipx_network; |
33 | unsigned char ipx_device[16]; | 33 | unsigned char ipx_device[16]; |
34 | unsigned char ipx_dlink_type; | 34 | unsigned char ipx_dlink_type; |
35 | #define IPX_FRAME_NONE 0 | 35 | #define IPX_FRAME_NONE 0 |
@@ -55,8 +55,8 @@ struct ipx_config_data { | |||
55 | */ | 55 | */ |
56 | 56 | ||
57 | struct ipx_route_def { | 57 | struct ipx_route_def { |
58 | __u32 ipx_network; | 58 | __be32 ipx_network; |
59 | __u32 ipx_router_network; | 59 | __be32 ipx_router_network; |
60 | #define IPX_ROUTE_NO_ROUTER 0 | 60 | #define IPX_ROUTE_NO_ROUTER 0 |
61 | unsigned char ipx_router_node[IPX_NODE_LEN]; | 61 | unsigned char ipx_router_node[IPX_NODE_LEN]; |
62 | unsigned char ipx_device[16]; | 62 | unsigned char ipx_device[16]; |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 80f39cab470a..b9b5e4ba166a 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
@@ -30,8 +30,10 @@ extern const char linux_banner[]; | |||
30 | 30 | ||
31 | #define STACK_MAGIC 0xdeadbeef | 31 | #define STACK_MAGIC 0xdeadbeef |
32 | 32 | ||
33 | #define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1) | ||
34 | #define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask)) | ||
35 | |||
33 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) | 36 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) |
34 | #define ALIGN(x,a) (((x)+(a)-1UL)&~((a)-1UL)) | ||
35 | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) | 37 | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) |
36 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) | 38 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) |
37 | #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) | 39 | #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) |
@@ -171,6 +173,8 @@ __attribute_const__ roundup_pow_of_two(unsigned long x) | |||
171 | 173 | ||
172 | extern int printk_ratelimit(void); | 174 | extern int printk_ratelimit(void); |
173 | extern int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst); | 175 | extern int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst); |
176 | extern bool printk_timed_ratelimit(unsigned long *caller_jiffies, | ||
177 | unsigned int interval_msec); | ||
174 | 178 | ||
175 | static inline void console_silent(void) | 179 | static inline void console_silent(void) |
176 | { | 180 | { |
diff --git a/include/linux/libata.h b/include/linux/libata.h index d0a7ad5ed518..abd2debebca2 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -143,7 +143,7 @@ enum { | |||
143 | ATA_DFLAG_CFG_MASK = (1 << 8) - 1, | 143 | ATA_DFLAG_CFG_MASK = (1 << 8) - 1, |
144 | 144 | ||
145 | ATA_DFLAG_PIO = (1 << 8), /* device limited to PIO mode */ | 145 | ATA_DFLAG_PIO = (1 << 8), /* device limited to PIO mode */ |
146 | ATA_DFLAG_NCQ_OFF = (1 << 9), /* devied limited to non-NCQ mode */ | 146 | ATA_DFLAG_NCQ_OFF = (1 << 9), /* device limited to non-NCQ mode */ |
147 | ATA_DFLAG_SUSPENDED = (1 << 10), /* device suspended */ | 147 | ATA_DFLAG_SUSPENDED = (1 << 10), /* device suspended */ |
148 | ATA_DFLAG_INIT_MASK = (1 << 16) - 1, | 148 | ATA_DFLAG_INIT_MASK = (1 << 16) - 1, |
149 | 149 | ||
@@ -702,7 +702,6 @@ extern int ata_std_prereset(struct ata_port *ap); | |||
702 | extern int ata_std_softreset(struct ata_port *ap, unsigned int *classes); | 702 | extern int ata_std_softreset(struct ata_port *ap, unsigned int *classes); |
703 | extern int sata_std_hardreset(struct ata_port *ap, unsigned int *class); | 703 | extern int sata_std_hardreset(struct ata_port *ap, unsigned int *class); |
704 | extern void ata_std_postreset(struct ata_port *ap, unsigned int *classes); | 704 | extern void ata_std_postreset(struct ata_port *ap, unsigned int *classes); |
705 | extern int ata_dev_revalidate(struct ata_device *dev, int post_reset); | ||
706 | extern void ata_port_disable(struct ata_port *); | 705 | extern void ata_port_disable(struct ata_port *); |
707 | extern void ata_std_ports(struct ata_ioports *ioaddr); | 706 | extern void ata_std_ports(struct ata_ioports *ioaddr); |
708 | #ifdef CONFIG_PCI | 707 | #ifdef CONFIG_PCI |
diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h index 09f0f575ddff..daabb3aa1ec6 100644 --- a/include/linux/mempolicy.h +++ b/include/linux/mempolicy.h | |||
@@ -150,7 +150,7 @@ extern void mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new); | |||
150 | extern void mpol_fix_fork_child_flag(struct task_struct *p); | 150 | extern void mpol_fix_fork_child_flag(struct task_struct *p); |
151 | #define set_cpuset_being_rebound(x) (cpuset_being_rebound = (x)) | 151 | #define set_cpuset_being_rebound(x) (cpuset_being_rebound = (x)) |
152 | 152 | ||
153 | #ifdef CONFIG_CPUSET | 153 | #ifdef CONFIG_CPUSETS |
154 | #define current_cpuset_is_being_rebound() \ | 154 | #define current_cpuset_is_being_rebound() \ |
155 | (cpuset_being_rebound == current->cpuset) | 155 | (cpuset_being_rebound == current->cpuset) |
156 | #else | 156 | #else |
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 59855b8718a0..e06683e2bea3 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
@@ -218,13 +218,9 @@ struct zone { | |||
218 | * under - it drives the swappiness decision: whether to unmap mapped | 218 | * under - it drives the swappiness decision: whether to unmap mapped |
219 | * pages. | 219 | * pages. |
220 | * | 220 | * |
221 | * temp_priority is used to remember the scanning priority at which | 221 | * Access to both this field is quite racy even on uniprocessor. But |
222 | * this zone was successfully refilled to free_pages == pages_high. | ||
223 | * | ||
224 | * Access to both these fields is quite racy even on uniprocessor. But | ||
225 | * it is expected to average out OK. | 222 | * it is expected to average out OK. |
226 | */ | 223 | */ |
227 | int temp_priority; | ||
228 | int prev_priority; | 224 | int prev_priority; |
229 | 225 | ||
230 | 226 | ||
@@ -674,6 +670,12 @@ void sparse_init(void); | |||
674 | #define sparse_index_init(_sec, _nid) do {} while (0) | 670 | #define sparse_index_init(_sec, _nid) do {} while (0) |
675 | #endif /* CONFIG_SPARSEMEM */ | 671 | #endif /* CONFIG_SPARSEMEM */ |
676 | 672 | ||
673 | #ifdef CONFIG_NODES_SPAN_OTHER_NODES | ||
674 | #define early_pfn_in_nid(pfn, nid) (early_pfn_to_nid(pfn) == (nid)) | ||
675 | #else | ||
676 | #define early_pfn_in_nid(pfn, nid) (1) | ||
677 | #endif | ||
678 | |||
677 | #ifndef early_pfn_valid | 679 | #ifndef early_pfn_valid |
678 | #define early_pfn_valid(pfn) (1) | 680 | #define early_pfn_valid(pfn) (1) |
679 | #endif | 681 | #endif |
diff --git a/include/linux/msdos_fs.h b/include/linux/msdos_fs.h index ce6c85815cbd..24a9ef1506b6 100644 --- a/include/linux/msdos_fs.h +++ b/include/linux/msdos_fs.h | |||
@@ -402,6 +402,8 @@ extern const struct file_operations fat_file_operations; | |||
402 | extern struct inode_operations fat_file_inode_operations; | 402 | extern struct inode_operations fat_file_inode_operations; |
403 | extern int fat_notify_change(struct dentry * dentry, struct iattr * attr); | 403 | extern int fat_notify_change(struct dentry * dentry, struct iattr * attr); |
404 | extern void fat_truncate(struct inode *inode); | 404 | extern void fat_truncate(struct inode *inode); |
405 | extern int fat_getattr(struct vfsmount *mnt, struct dentry *dentry, | ||
406 | struct kstat *stat); | ||
405 | 407 | ||
406 | /* fat/inode.c */ | 408 | /* fat/inode.c */ |
407 | extern void fat_attach(struct inode *inode, loff_t i_pos); | 409 | extern void fat_attach(struct inode *inode, loff_t i_pos); |
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 1aeedf27a1ff..2071b02f0526 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h | |||
@@ -358,7 +358,7 @@ struct nand_buffers { | |||
358 | * @priv: [OPTIONAL] pointer to private chip date | 358 | * @priv: [OPTIONAL] pointer to private chip date |
359 | * @errstat: [OPTIONAL] hardware specific function to perform additional error status checks | 359 | * @errstat: [OPTIONAL] hardware specific function to perform additional error status checks |
360 | * (determine if errors are correctable) | 360 | * (determine if errors are correctable) |
361 | * @write_page [REPLACEABLE] High-level page write function | 361 | * @write_page: [REPLACEABLE] High-level page write function |
362 | */ | 362 | */ |
363 | 363 | ||
364 | struct nand_chip { | 364 | struct nand_chip { |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 9264139bd8df..83b8c4f1d69d 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -93,8 +93,10 @@ struct netpoll_info; | |||
93 | #endif | 93 | #endif |
94 | #endif | 94 | #endif |
95 | 95 | ||
96 | #if !defined(CONFIG_NET_IPIP) && \ | 96 | #if !defined(CONFIG_NET_IPIP) && !defined(CONFIG_NET_IPIP_MODULE) && \ |
97 | !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE) | 97 | !defined(CONFIG_NET_IPGRE) && !defined(CONFIG_NET_IPGRE_MODULE) && \ |
98 | !defined(CONFIG_IPV6_SIT) && !defined(CONFIG_IPV6_SIT_MODULE) && \ | ||
99 | !defined(CONFIG_IPV6_TUNNEL) && !defined(CONFIG_IPV6_TUNNEL_MODULE) | ||
98 | #define MAX_HEADER LL_MAX_HEADER | 100 | #define MAX_HEADER LL_MAX_HEADER |
99 | #else | 101 | #else |
100 | #define MAX_HEADER (LL_MAX_HEADER + 48) | 102 | #define MAX_HEADER (LL_MAX_HEADER + 48) |
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index 04319a76103a..022edfa97ed9 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h | |||
@@ -96,22 +96,6 @@ struct _xt_align | |||
96 | /* Error verdict. */ | 96 | /* Error verdict. */ |
97 | #define XT_ERROR_TARGET "ERROR" | 97 | #define XT_ERROR_TARGET "ERROR" |
98 | 98 | ||
99 | /* | ||
100 | * New IP firewall options for [gs]etsockopt at the RAW IP level. | ||
101 | * Unlike BSD Linux inherits IP options so you don't have to use a raw | ||
102 | * socket for this. Instead we check rights in the calls. */ | ||
103 | #define XT_BASE_CTL 64 /* base for firewall socket options */ | ||
104 | |||
105 | #define XT_SO_SET_REPLACE (XT_BASE_CTL) | ||
106 | #define XT_SO_SET_ADD_COUNTERS (XT_BASE_CTL + 1) | ||
107 | #define XT_SO_SET_MAX XT_SO_SET_ADD_COUNTERS | ||
108 | |||
109 | #define XT_SO_GET_INFO (XT_BASE_CTL) | ||
110 | #define XT_SO_GET_ENTRIES (XT_BASE_CTL + 1) | ||
111 | #define XT_SO_GET_REVISION_MATCH (XT_BASE_CTL + 2) | ||
112 | #define XT_SO_GET_REVISION_TARGET (XT_BASE_CTL + 3) | ||
113 | #define XT_SO_GET_MAX XT_SO_GET_REVISION_TARGET | ||
114 | |||
115 | #define SET_COUNTER(c,b,p) do { (c).bcnt = (b); (c).pcnt = (p); } while(0) | 99 | #define SET_COUNTER(c,b,p) do { (c).bcnt = (b); (c).pcnt = (p); } while(0) |
116 | #define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0) | 100 | #define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0) |
117 | 101 | ||
diff --git a/include/linux/netfilter_arp/arp_tables.h b/include/linux/netfilter_arp/arp_tables.h index 44e39b61d9e7..0be235418a2f 100644 --- a/include/linux/netfilter_arp/arp_tables.h +++ b/include/linux/netfilter_arp/arp_tables.h | |||
@@ -112,19 +112,20 @@ struct arpt_entry | |||
112 | * New IP firewall options for [gs]etsockopt at the RAW IP level. | 112 | * New IP firewall options for [gs]etsockopt at the RAW IP level. |
113 | * Unlike BSD Linux inherits IP options so you don't have to use a raw | 113 | * Unlike BSD Linux inherits IP options so you don't have to use a raw |
114 | * socket for this. Instead we check rights in the calls. | 114 | * socket for this. Instead we check rights in the calls. |
115 | * | ||
116 | * ATTENTION: check linux/in.h before adding new number here. | ||
115 | */ | 117 | */ |
116 | #define ARPT_CTL_OFFSET 32 | 118 | #define ARPT_BASE_CTL 96 |
117 | #define ARPT_BASE_CTL (XT_BASE_CTL+ARPT_CTL_OFFSET) | 119 | |
118 | 120 | #define ARPT_SO_SET_REPLACE (ARPT_BASE_CTL) | |
119 | #define ARPT_SO_SET_REPLACE (XT_SO_SET_REPLACE+ARPT_CTL_OFFSET) | 121 | #define ARPT_SO_SET_ADD_COUNTERS (ARPT_BASE_CTL + 1) |
120 | #define ARPT_SO_SET_ADD_COUNTERS (XT_SO_SET_ADD_COUNTERS+ARPT_CTL_OFFSET) | 122 | #define ARPT_SO_SET_MAX ARPT_SO_SET_ADD_COUNTERS |
121 | #define ARPT_SO_SET_MAX (XT_SO_SET_MAX+ARPT_CTL_OFFSET) | 123 | |
122 | 124 | #define ARPT_SO_GET_INFO (ARPT_BASE_CTL) | |
123 | #define ARPT_SO_GET_INFO (XT_SO_GET_INFO+ARPT_CTL_OFFSET) | 125 | #define ARPT_SO_GET_ENTRIES (ARPT_BASE_CTL + 1) |
124 | #define ARPT_SO_GET_ENTRIES (XT_SO_GET_ENTRIES+ARPT_CTL_OFFSET) | 126 | /* #define ARPT_SO_GET_REVISION_MATCH (APRT_BASE_CTL + 2) */ |
125 | /* #define ARPT_SO_GET_REVISION_MATCH XT_SO_GET_REVISION_MATCH */ | 127 | #define ARPT_SO_GET_REVISION_TARGET (ARPT_BASE_CTL + 3) |
126 | #define ARPT_SO_GET_REVISION_TARGET (XT_SO_GET_REVISION_TARGET+ARPT_CTL_OFFSET) | 128 | #define ARPT_SO_GET_MAX (ARPT_SO_GET_REVISION_TARGET) |
127 | #define ARPT_SO_GET_MAX (XT_SO_GET_REVISION_TARGET+ARPT_CTL_OFFSET) | ||
128 | 129 | ||
129 | /* CONTINUE verdict for targets */ | 130 | /* CONTINUE verdict for targets */ |
130 | #define ARPT_CONTINUE XT_CONTINUE | 131 | #define ARPT_CONTINUE XT_CONTINUE |
diff --git a/include/linux/netfilter_ipv4/ip_tables.h b/include/linux/netfilter_ipv4/ip_tables.h index a536bbdef145..4f06dad0bde9 100644 --- a/include/linux/netfilter_ipv4/ip_tables.h +++ b/include/linux/netfilter_ipv4/ip_tables.h | |||
@@ -101,18 +101,21 @@ struct ipt_entry | |||
101 | /* | 101 | /* |
102 | * New IP firewall options for [gs]etsockopt at the RAW IP level. | 102 | * New IP firewall options for [gs]etsockopt at the RAW IP level. |
103 | * Unlike BSD Linux inherits IP options so you don't have to use a raw | 103 | * Unlike BSD Linux inherits IP options so you don't have to use a raw |
104 | * socket for this. Instead we check rights in the calls. */ | 104 | * socket for this. Instead we check rights in the calls. |
105 | #define IPT_BASE_CTL XT_BASE_CTL | 105 | * |
106 | 106 | * ATTENTION: check linux/in.h before adding new number here. | |
107 | #define IPT_SO_SET_REPLACE XT_SO_SET_REPLACE | 107 | */ |
108 | #define IPT_SO_SET_ADD_COUNTERS XT_SO_SET_ADD_COUNTERS | 108 | #define IPT_BASE_CTL 64 |
109 | #define IPT_SO_SET_MAX XT_SO_SET_MAX | 109 | |
110 | 110 | #define IPT_SO_SET_REPLACE (IPT_BASE_CTL) | |
111 | #define IPT_SO_GET_INFO XT_SO_GET_INFO | 111 | #define IPT_SO_SET_ADD_COUNTERS (IPT_BASE_CTL + 1) |
112 | #define IPT_SO_GET_ENTRIES XT_SO_GET_ENTRIES | 112 | #define IPT_SO_SET_MAX IPT_SO_SET_ADD_COUNTERS |
113 | #define IPT_SO_GET_REVISION_MATCH XT_SO_GET_REVISION_MATCH | 113 | |
114 | #define IPT_SO_GET_REVISION_TARGET XT_SO_GET_REVISION_TARGET | 114 | #define IPT_SO_GET_INFO (IPT_BASE_CTL) |
115 | #define IPT_SO_GET_MAX XT_SO_GET_REVISION_TARGET | 115 | #define IPT_SO_GET_ENTRIES (IPT_BASE_CTL + 1) |
116 | #define IPT_SO_GET_REVISION_MATCH (IPT_BASE_CTL + 2) | ||
117 | #define IPT_SO_GET_REVISION_TARGET (IPT_BASE_CTL + 3) | ||
118 | #define IPT_SO_GET_MAX IPT_SO_GET_REVISION_TARGET | ||
116 | 119 | ||
117 | #define IPT_CONTINUE XT_CONTINUE | 120 | #define IPT_CONTINUE XT_CONTINUE |
118 | #define IPT_RETURN XT_RETURN | 121 | #define IPT_RETURN XT_RETURN |
diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h index d7a8e9c0dad0..4aed340401db 100644 --- a/include/linux/netfilter_ipv6/ip6_tables.h +++ b/include/linux/netfilter_ipv6/ip6_tables.h | |||
@@ -107,18 +107,21 @@ struct ip6t_entry | |||
107 | /* | 107 | /* |
108 | * New IP firewall options for [gs]etsockopt at the RAW IP level. | 108 | * New IP firewall options for [gs]etsockopt at the RAW IP level. |
109 | * Unlike BSD Linux inherits IP options so you don't have to use | 109 | * Unlike BSD Linux inherits IP options so you don't have to use |
110 | * a raw socket for this. Instead we check rights in the calls. */ | 110 | * a raw socket for this. Instead we check rights in the calls. |
111 | #define IP6T_BASE_CTL XT_BASE_CTL | 111 | * |
112 | 112 | * ATTENTION: check linux/in6.h before adding new number here. | |
113 | #define IP6T_SO_SET_REPLACE XT_SO_SET_REPLACE | 113 | */ |
114 | #define IP6T_SO_SET_ADD_COUNTERS XT_SO_SET_ADD_COUNTERS | 114 | #define IP6T_BASE_CTL 64 |
115 | #define IP6T_SO_SET_MAX XT_SO_SET_MAX | 115 | |
116 | 116 | #define IP6T_SO_SET_REPLACE (IP6T_BASE_CTL) | |
117 | #define IP6T_SO_GET_INFO XT_SO_GET_INFO | 117 | #define IP6T_SO_SET_ADD_COUNTERS (IP6T_BASE_CTL + 1) |
118 | #define IP6T_SO_GET_ENTRIES XT_SO_GET_ENTRIES | 118 | #define IP6T_SO_SET_MAX IP6T_SO_SET_ADD_COUNTERS |
119 | #define IP6T_SO_GET_REVISION_MATCH XT_SO_GET_REVISION_MATCH | 119 | |
120 | #define IP6T_SO_GET_REVISION_TARGET XT_SO_GET_REVISION_TARGET | 120 | #define IP6T_SO_GET_INFO (IP6T_BASE_CTL) |
121 | #define IP6T_SO_GET_MAX XT_SO_GET_REVISION_TARGET | 121 | #define IP6T_SO_GET_ENTRIES (IP6T_BASE_CTL + 1) |
122 | #define IP6T_SO_GET_REVISION_MATCH (IP6T_BASE_CTL + 4) | ||
123 | #define IP6T_SO_GET_REVISION_TARGET (IP6T_BASE_CTL + 5) | ||
124 | #define IP6T_SO_GET_MAX IP6T_SO_GET_REVISION_TARGET | ||
122 | 125 | ||
123 | /* CONTINUE verdict for targets */ | 126 | /* CONTINUE verdict for targets */ |
124 | #define IP6T_CONTINUE XT_CONTINUE | 127 | #define IP6T_CONTINUE XT_CONTINUE |
diff --git a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h index eb231143d579..edb54c3171b3 100644 --- a/include/linux/nfsd/nfsd.h +++ b/include/linux/nfsd/nfsd.h | |||
@@ -89,7 +89,7 @@ __be32 nfsd_access(struct svc_rqst *, struct svc_fh *, u32 *, u32 *); | |||
89 | __be32 nfsd_create_v3(struct svc_rqst *, struct svc_fh *, | 89 | __be32 nfsd_create_v3(struct svc_rqst *, struct svc_fh *, |
90 | char *name, int len, struct iattr *attrs, | 90 | char *name, int len, struct iattr *attrs, |
91 | struct svc_fh *res, int createmode, | 91 | struct svc_fh *res, int createmode, |
92 | u32 *verifier, int *truncp); | 92 | u32 *verifier, int *truncp, int *created); |
93 | __be32 nfsd_commit(struct svc_rqst *, struct svc_fh *, | 93 | __be32 nfsd_commit(struct svc_rqst *, struct svc_fh *, |
94 | loff_t, unsigned long); | 94 | loff_t, unsigned long); |
95 | #endif /* CONFIG_NFSD_V3 */ | 95 | #endif /* CONFIG_NFSD_V3 */ |
diff --git a/include/linux/nsproxy.h b/include/linux/nsproxy.h index f6baecdeecd6..971d1c6dfc4b 100644 --- a/include/linux/nsproxy.h +++ b/include/linux/nsproxy.h | |||
@@ -45,8 +45,10 @@ static inline void exit_task_namespaces(struct task_struct *p) | |||
45 | { | 45 | { |
46 | struct nsproxy *ns = p->nsproxy; | 46 | struct nsproxy *ns = p->nsproxy; |
47 | if (ns) { | 47 | if (ns) { |
48 | put_nsproxy(ns); | 48 | task_lock(p); |
49 | p->nsproxy = NULL; | 49 | p->nsproxy = NULL; |
50 | task_unlock(p); | ||
51 | put_nsproxy(ns); | ||
50 | } | 52 | } |
51 | } | 53 | } |
52 | #endif | 54 | #endif |
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 64f950925151..c3e255bf8594 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h | |||
@@ -52,19 +52,23 @@ static inline void mapping_set_gfp_mask(struct address_space *m, gfp_t mask) | |||
52 | void release_pages(struct page **pages, int nr, int cold); | 52 | void release_pages(struct page **pages, int nr, int cold); |
53 | 53 | ||
54 | #ifdef CONFIG_NUMA | 54 | #ifdef CONFIG_NUMA |
55 | extern struct page *page_cache_alloc(struct address_space *x); | 55 | extern struct page *__page_cache_alloc(gfp_t gfp); |
56 | extern struct page *page_cache_alloc_cold(struct address_space *x); | ||
57 | #else | 56 | #else |
57 | static inline struct page *__page_cache_alloc(gfp_t gfp) | ||
58 | { | ||
59 | return alloc_pages(gfp, 0); | ||
60 | } | ||
61 | #endif | ||
62 | |||
58 | static inline struct page *page_cache_alloc(struct address_space *x) | 63 | static inline struct page *page_cache_alloc(struct address_space *x) |
59 | { | 64 | { |
60 | return alloc_pages(mapping_gfp_mask(x), 0); | 65 | return __page_cache_alloc(mapping_gfp_mask(x)); |
61 | } | 66 | } |
62 | 67 | ||
63 | static inline struct page *page_cache_alloc_cold(struct address_space *x) | 68 | static inline struct page *page_cache_alloc_cold(struct address_space *x) |
64 | { | 69 | { |
65 | return alloc_pages(mapping_gfp_mask(x)|__GFP_COLD, 0); | 70 | return __page_cache_alloc(mapping_gfp_mask(x)|__GFP_COLD); |
66 | } | 71 | } |
67 | #endif | ||
68 | 72 | ||
69 | typedef int filler_t(void *, struct page *); | 73 | typedef int filler_t(void *, struct page *); |
70 | 74 | ||
diff --git a/include/linux/pci.h b/include/linux/pci.h index 4689e2a699c0..09be0f81b27b 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -455,7 +455,11 @@ int pci_find_next_capability (struct pci_dev *dev, u8 pos, int cap); | |||
455 | int pci_find_ext_capability (struct pci_dev *dev, int cap); | 455 | int pci_find_ext_capability (struct pci_dev *dev, int cap); |
456 | struct pci_bus *pci_find_next_bus(const struct pci_bus *from); | 456 | struct pci_bus *pci_find_next_bus(const struct pci_bus *from); |
457 | 457 | ||
458 | struct pci_dev *pci_get_device (unsigned int vendor, unsigned int device, struct pci_dev *from); | 458 | struct pci_dev *pci_get_device(unsigned int vendor, unsigned int device, |
459 | struct pci_dev *from); | ||
460 | struct pci_dev *pci_get_device_reverse(unsigned int vendor, unsigned int device, | ||
461 | struct pci_dev *from); | ||
462 | |||
459 | struct pci_dev *pci_get_subsys (unsigned int vendor, unsigned int device, | 463 | struct pci_dev *pci_get_subsys (unsigned int vendor, unsigned int device, |
460 | unsigned int ss_vendor, unsigned int ss_device, | 464 | unsigned int ss_vendor, unsigned int ss_device, |
461 | struct pci_dev *from); | 465 | struct pci_dev *from); |
@@ -660,7 +664,12 @@ static inline struct pci_dev *pci_find_device(unsigned int vendor, unsigned int | |||
660 | static inline struct pci_dev *pci_find_slot(unsigned int bus, unsigned int devfn) | 664 | static inline struct pci_dev *pci_find_slot(unsigned int bus, unsigned int devfn) |
661 | { return NULL; } | 665 | { return NULL; } |
662 | 666 | ||
663 | static inline struct pci_dev *pci_get_device (unsigned int vendor, unsigned int device, struct pci_dev *from) | 667 | static inline struct pci_dev *pci_get_device(unsigned int vendor, |
668 | unsigned int device, struct pci_dev *from) | ||
669 | { return NULL; } | ||
670 | |||
671 | static inline struct pci_dev *pci_get_device_reverse(unsigned int vendor, | ||
672 | unsigned int device, struct pci_dev *from) | ||
664 | { return NULL; } | 673 | { return NULL; } |
665 | 674 | ||
666 | static inline struct pci_dev *pci_get_subsys (unsigned int vendor, unsigned int device, | 675 | static inline struct pci_dev *pci_get_subsys (unsigned int vendor, unsigned int device, |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index f3a168f3c9df..fa4e1d799782 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
@@ -1213,6 +1213,7 @@ | |||
1213 | #define PCI_DEVICE_ID_NVIDIA_NVENET_21 0x0451 | 1213 | #define PCI_DEVICE_ID_NVIDIA_NVENET_21 0x0451 |
1214 | #define PCI_DEVICE_ID_NVIDIA_NVENET_22 0x0452 | 1214 | #define PCI_DEVICE_ID_NVIDIA_NVENET_22 0x0452 |
1215 | #define PCI_DEVICE_ID_NVIDIA_NVENET_23 0x0453 | 1215 | #define PCI_DEVICE_ID_NVIDIA_NVENET_23 0x0453 |
1216 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE 0x0560 | ||
1216 | 1217 | ||
1217 | #define PCI_VENDOR_ID_IMS 0x10e0 | 1218 | #define PCI_VENDOR_ID_IMS 0x10e0 |
1218 | #define PCI_DEVICE_ID_IMS_TT128 0x9128 | 1219 | #define PCI_DEVICE_ID_IMS_TT128 0x9128 |
diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h index c312a12ad2d6..c321316f1bc7 100644 --- a/include/linux/pci_regs.h +++ b/include/linux/pci_regs.h | |||
@@ -371,6 +371,7 @@ | |||
371 | #define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */ | 371 | #define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */ |
372 | #define PCI_EXP_LNKCAP 12 /* Link Capabilities */ | 372 | #define PCI_EXP_LNKCAP 12 /* Link Capabilities */ |
373 | #define PCI_EXP_LNKCTL 16 /* Link Control */ | 373 | #define PCI_EXP_LNKCTL 16 /* Link Control */ |
374 | #define PCI_EXP_LNKCTL_CLKREQ_EN 0x100 /* Enable clkreq */ | ||
374 | #define PCI_EXP_LNKSTA 18 /* Link Status */ | 375 | #define PCI_EXP_LNKSTA 18 /* Link Status */ |
375 | #define PCI_EXP_SLTCAP 20 /* Slot Capabilities */ | 376 | #define PCI_EXP_SLTCAP 20 /* Slot Capabilities */ |
376 | #define PCI_EXP_SLTCTL 24 /* Slot Control */ | 377 | #define PCI_EXP_SLTCTL 24 /* Slot Control */ |
diff --git a/include/linux/personality.h b/include/linux/personality.h index bf4cf2080e5c..012cd558189b 100644 --- a/include/linux/personality.h +++ b/include/linux/personality.h | |||
@@ -114,7 +114,7 @@ struct exec_domain { | |||
114 | * Change personality of the currently running process. | 114 | * Change personality of the currently running process. |
115 | */ | 115 | */ |
116 | #define set_personality(pers) \ | 116 | #define set_personality(pers) \ |
117 | ((current->personality == pers) ? 0 : __set_personality(pers)) | 117 | ((current->personality == (pers)) ? 0 : __set_personality(pers)) |
118 | 118 | ||
119 | #endif /* __KERNEL__ */ | 119 | #endif /* __KERNEL__ */ |
120 | 120 | ||
diff --git a/include/linux/pm.h b/include/linux/pm.h index 6b27e07aef19..070394e846d0 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h | |||
@@ -116,7 +116,9 @@ typedef int __bitwise suspend_disk_method_t; | |||
116 | #define PM_DISK_PLATFORM ((__force suspend_disk_method_t) 2) | 116 | #define PM_DISK_PLATFORM ((__force suspend_disk_method_t) 2) |
117 | #define PM_DISK_SHUTDOWN ((__force suspend_disk_method_t) 3) | 117 | #define PM_DISK_SHUTDOWN ((__force suspend_disk_method_t) 3) |
118 | #define PM_DISK_REBOOT ((__force suspend_disk_method_t) 4) | 118 | #define PM_DISK_REBOOT ((__force suspend_disk_method_t) 4) |
119 | #define PM_DISK_MAX ((__force suspend_disk_method_t) 5) | 119 | #define PM_DISK_TEST ((__force suspend_disk_method_t) 5) |
120 | #define PM_DISK_TESTPROC ((__force suspend_disk_method_t) 6) | ||
121 | #define PM_DISK_MAX ((__force suspend_disk_method_t) 7) | ||
120 | 122 | ||
121 | struct pm_ops { | 123 | struct pm_ops { |
122 | suspend_disk_method_t pm_disk_mode; | 124 | suspend_disk_method_t pm_disk_mode; |
diff --git a/include/linux/raid/bitmap.h b/include/linux/raid/bitmap.h index 84d887751855..ebd42a3710b4 100644 --- a/include/linux/raid/bitmap.h +++ b/include/linux/raid/bitmap.h | |||
@@ -146,16 +146,16 @@ enum bitmap_state { | |||
146 | 146 | ||
147 | /* the superblock at the front of the bitmap file -- little endian */ | 147 | /* the superblock at the front of the bitmap file -- little endian */ |
148 | typedef struct bitmap_super_s { | 148 | typedef struct bitmap_super_s { |
149 | __u32 magic; /* 0 BITMAP_MAGIC */ | 149 | __le32 magic; /* 0 BITMAP_MAGIC */ |
150 | __u32 version; /* 4 the bitmap major for now, could change... */ | 150 | __le32 version; /* 4 the bitmap major for now, could change... */ |
151 | __u8 uuid[16]; /* 8 128 bit uuid - must match md device uuid */ | 151 | __u8 uuid[16]; /* 8 128 bit uuid - must match md device uuid */ |
152 | __u64 events; /* 24 event counter for the bitmap (1)*/ | 152 | __le64 events; /* 24 event counter for the bitmap (1)*/ |
153 | __u64 events_cleared;/*32 event counter when last bit cleared (2) */ | 153 | __le64 events_cleared;/*32 event counter when last bit cleared (2) */ |
154 | __u64 sync_size; /* 40 the size of the md device's sync range(3) */ | 154 | __le64 sync_size; /* 40 the size of the md device's sync range(3) */ |
155 | __u32 state; /* 48 bitmap state information */ | 155 | __le32 state; /* 48 bitmap state information */ |
156 | __u32 chunksize; /* 52 the bitmap chunk size in bytes */ | 156 | __le32 chunksize; /* 52 the bitmap chunk size in bytes */ |
157 | __u32 daemon_sleep; /* 56 seconds between disk flushes */ | 157 | __le32 daemon_sleep; /* 56 seconds between disk flushes */ |
158 | __u32 write_behind; /* 60 number of outstanding write-behind writes */ | 158 | __le32 write_behind; /* 60 number of outstanding write-behind writes */ |
159 | 159 | ||
160 | __u8 pad[256 - 64]; /* set to zero */ | 160 | __u8 pad[256 - 64]; /* set to zero */ |
161 | } bitmap_super_t; | 161 | } bitmap_super_t; |
diff --git a/include/linux/raid/md_p.h b/include/linux/raid/md_p.h index b6ebc69bae54..3f2cd98c508b 100644 --- a/include/linux/raid/md_p.h +++ b/include/linux/raid/md_p.h | |||
@@ -206,52 +206,52 @@ static inline __u64 md_event(mdp_super_t *sb) { | |||
206 | */ | 206 | */ |
207 | struct mdp_superblock_1 { | 207 | struct mdp_superblock_1 { |
208 | /* constant array information - 128 bytes */ | 208 | /* constant array information - 128 bytes */ |
209 | __u32 magic; /* MD_SB_MAGIC: 0xa92b4efc - little endian */ | 209 | __le32 magic; /* MD_SB_MAGIC: 0xa92b4efc - little endian */ |
210 | __u32 major_version; /* 1 */ | 210 | __le32 major_version; /* 1 */ |
211 | __u32 feature_map; /* bit 0 set if 'bitmap_offset' is meaningful */ | 211 | __le32 feature_map; /* bit 0 set if 'bitmap_offset' is meaningful */ |
212 | __u32 pad0; /* always set to 0 when writing */ | 212 | __le32 pad0; /* always set to 0 when writing */ |
213 | 213 | ||
214 | __u8 set_uuid[16]; /* user-space generated. */ | 214 | __u8 set_uuid[16]; /* user-space generated. */ |
215 | char set_name[32]; /* set and interpreted by user-space */ | 215 | char set_name[32]; /* set and interpreted by user-space */ |
216 | 216 | ||
217 | __u64 ctime; /* lo 40 bits are seconds, top 24 are microseconds or 0*/ | 217 | __le64 ctime; /* lo 40 bits are seconds, top 24 are microseconds or 0*/ |
218 | __u32 level; /* -4 (multipath), -1 (linear), 0,1,4,5 */ | 218 | __le32 level; /* -4 (multipath), -1 (linear), 0,1,4,5 */ |
219 | __u32 layout; /* only for raid5 and raid10 currently */ | 219 | __le32 layout; /* only for raid5 and raid10 currently */ |
220 | __u64 size; /* used size of component devices, in 512byte sectors */ | 220 | __le64 size; /* used size of component devices, in 512byte sectors */ |
221 | 221 | ||
222 | __u32 chunksize; /* in 512byte sectors */ | 222 | __le32 chunksize; /* in 512byte sectors */ |
223 | __u32 raid_disks; | 223 | __le32 raid_disks; |
224 | __u32 bitmap_offset; /* sectors after start of superblock that bitmap starts | 224 | __le32 bitmap_offset; /* sectors after start of superblock that bitmap starts |
225 | * NOTE: signed, so bitmap can be before superblock | 225 | * NOTE: signed, so bitmap can be before superblock |
226 | * only meaningful of feature_map[0] is set. | 226 | * only meaningful of feature_map[0] is set. |
227 | */ | 227 | */ |
228 | 228 | ||
229 | /* These are only valid with feature bit '4' */ | 229 | /* These are only valid with feature bit '4' */ |
230 | __u32 new_level; /* new level we are reshaping to */ | 230 | __le32 new_level; /* new level we are reshaping to */ |
231 | __u64 reshape_position; /* next address in array-space for reshape */ | 231 | __le64 reshape_position; /* next address in array-space for reshape */ |
232 | __u32 delta_disks; /* change in number of raid_disks */ | 232 | __le32 delta_disks; /* change in number of raid_disks */ |
233 | __u32 new_layout; /* new layout */ | 233 | __le32 new_layout; /* new layout */ |
234 | __u32 new_chunk; /* new chunk size (bytes) */ | 234 | __le32 new_chunk; /* new chunk size (bytes) */ |
235 | __u8 pad1[128-124]; /* set to 0 when written */ | 235 | __u8 pad1[128-124]; /* set to 0 when written */ |
236 | 236 | ||
237 | /* constant this-device information - 64 bytes */ | 237 | /* constant this-device information - 64 bytes */ |
238 | __u64 data_offset; /* sector start of data, often 0 */ | 238 | __le64 data_offset; /* sector start of data, often 0 */ |
239 | __u64 data_size; /* sectors in this device that can be used for data */ | 239 | __le64 data_size; /* sectors in this device that can be used for data */ |
240 | __u64 super_offset; /* sector start of this superblock */ | 240 | __le64 super_offset; /* sector start of this superblock */ |
241 | __u64 recovery_offset;/* sectors before this offset (from data_offset) have been recovered */ | 241 | __le64 recovery_offset;/* sectors before this offset (from data_offset) have been recovered */ |
242 | __u32 dev_number; /* permanent identifier of this device - not role in raid */ | 242 | __le32 dev_number; /* permanent identifier of this device - not role in raid */ |
243 | __u32 cnt_corrected_read; /* number of read errors that were corrected by re-writing */ | 243 | __le32 cnt_corrected_read; /* number of read errors that were corrected by re-writing */ |
244 | __u8 device_uuid[16]; /* user-space setable, ignored by kernel */ | 244 | __u8 device_uuid[16]; /* user-space setable, ignored by kernel */ |
245 | __u8 devflags; /* per-device flags. Only one defined...*/ | 245 | __u8 devflags; /* per-device flags. Only one defined...*/ |
246 | #define WriteMostly1 1 /* mask for writemostly flag in above */ | 246 | #define WriteMostly1 1 /* mask for writemostly flag in above */ |
247 | __u8 pad2[64-57]; /* set to 0 when writing */ | 247 | __u8 pad2[64-57]; /* set to 0 when writing */ |
248 | 248 | ||
249 | /* array state information - 64 bytes */ | 249 | /* array state information - 64 bytes */ |
250 | __u64 utime; /* 40 bits second, 24 btes microseconds */ | 250 | __le64 utime; /* 40 bits second, 24 btes microseconds */ |
251 | __u64 events; /* incremented when superblock updated */ | 251 | __le64 events; /* incremented when superblock updated */ |
252 | __u64 resync_offset; /* data before this offset (from data_offset) known to be in sync */ | 252 | __le64 resync_offset; /* data before this offset (from data_offset) known to be in sync */ |
253 | __u32 sb_csum; /* checksum upto devs[max_dev] */ | 253 | __le32 sb_csum; /* checksum upto devs[max_dev] */ |
254 | __u32 max_dev; /* size of devs[] array to consider */ | 254 | __le32 max_dev; /* size of devs[] array to consider */ |
255 | __u8 pad3[64-32]; /* set to 0 when writing */ | 255 | __u8 pad3[64-32]; /* set to 0 when writing */ |
256 | 256 | ||
257 | /* device state information. Indexed by dev_number. | 257 | /* device state information. Indexed by dev_number. |
@@ -260,7 +260,7 @@ struct mdp_superblock_1 { | |||
260 | * into the 'roles' value. If a device is spare or faulty, then it doesn't | 260 | * into the 'roles' value. If a device is spare or faulty, then it doesn't |
261 | * have a meaningful role. | 261 | * have a meaningful role. |
262 | */ | 262 | */ |
263 | __u16 dev_roles[0]; /* role in array, or 0xffff for a spare, or 0xfffe for faulty */ | 263 | __le16 dev_roles[0]; /* role in array, or 0xffff for a spare, or 0xfffe for faulty */ |
264 | }; | 264 | }; |
265 | 265 | ||
266 | /* feature_map bits */ | 266 | /* feature_map bits */ |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 6735c1cf334c..eafe4a7b8237 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -466,7 +466,6 @@ struct signal_struct { | |||
466 | struct pacct_struct pacct; /* per-process accounting information */ | 466 | struct pacct_struct pacct; /* per-process accounting information */ |
467 | #endif | 467 | #endif |
468 | #ifdef CONFIG_TASKSTATS | 468 | #ifdef CONFIG_TASKSTATS |
469 | spinlock_t stats_lock; | ||
470 | struct taskstats *stats; | 469 | struct taskstats *stats; |
471 | #endif | 470 | #endif |
472 | }; | 471 | }; |
diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h index b800d2d68b32..8451052ca66f 100644 --- a/include/linux/spinlock.h +++ b/include/linux/spinlock.h | |||
@@ -183,13 +183,27 @@ do { \ | |||
183 | #define read_lock(lock) _read_lock(lock) | 183 | #define read_lock(lock) _read_lock(lock) |
184 | 184 | ||
185 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) | 185 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) |
186 | |||
186 | #define spin_lock_irqsave(lock, flags) flags = _spin_lock_irqsave(lock) | 187 | #define spin_lock_irqsave(lock, flags) flags = _spin_lock_irqsave(lock) |
187 | #define read_lock_irqsave(lock, flags) flags = _read_lock_irqsave(lock) | 188 | #define read_lock_irqsave(lock, flags) flags = _read_lock_irqsave(lock) |
188 | #define write_lock_irqsave(lock, flags) flags = _write_lock_irqsave(lock) | 189 | #define write_lock_irqsave(lock, flags) flags = _write_lock_irqsave(lock) |
190 | |||
191 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
192 | #define spin_lock_irqsave_nested(lock, flags, subclass) \ | ||
193 | flags = _spin_lock_irqsave_nested(lock, subclass) | ||
194 | #else | ||
195 | #define spin_lock_irqsave_nested(lock, flags, subclass) \ | ||
196 | flags = _spin_lock_irqsave(lock) | ||
197 | #endif | ||
198 | |||
189 | #else | 199 | #else |
200 | |||
190 | #define spin_lock_irqsave(lock, flags) _spin_lock_irqsave(lock, flags) | 201 | #define spin_lock_irqsave(lock, flags) _spin_lock_irqsave(lock, flags) |
191 | #define read_lock_irqsave(lock, flags) _read_lock_irqsave(lock, flags) | 202 | #define read_lock_irqsave(lock, flags) _read_lock_irqsave(lock, flags) |
192 | #define write_lock_irqsave(lock, flags) _write_lock_irqsave(lock, flags) | 203 | #define write_lock_irqsave(lock, flags) _write_lock_irqsave(lock, flags) |
204 | #define spin_lock_irqsave_nested(lock, flags, subclass) \ | ||
205 | spin_lock_irqsave(lock, flags) | ||
206 | |||
193 | #endif | 207 | #endif |
194 | 208 | ||
195 | #define spin_lock_irq(lock) _spin_lock_irq(lock) | 209 | #define spin_lock_irq(lock) _spin_lock_irq(lock) |
diff --git a/include/linux/spinlock_api_smp.h b/include/linux/spinlock_api_smp.h index 8828b8155e9c..8a2307ce7296 100644 --- a/include/linux/spinlock_api_smp.h +++ b/include/linux/spinlock_api_smp.h | |||
@@ -32,6 +32,8 @@ void __lockfunc _read_lock_irq(rwlock_t *lock) __acquires(lock); | |||
32 | void __lockfunc _write_lock_irq(rwlock_t *lock) __acquires(lock); | 32 | void __lockfunc _write_lock_irq(rwlock_t *lock) __acquires(lock); |
33 | unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock) | 33 | unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock) |
34 | __acquires(lock); | 34 | __acquires(lock); |
35 | unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass) | ||
36 | __acquires(lock); | ||
35 | unsigned long __lockfunc _read_lock_irqsave(rwlock_t *lock) | 37 | unsigned long __lockfunc _read_lock_irqsave(rwlock_t *lock) |
36 | __acquires(lock); | 38 | __acquires(lock); |
37 | unsigned long __lockfunc _write_lock_irqsave(rwlock_t *lock) | 39 | unsigned long __lockfunc _write_lock_irqsave(rwlock_t *lock) |
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 1b24bd45e080..d98562f1df76 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h | |||
@@ -6,10 +6,17 @@ | |||
6 | **************************************************************** | 6 | **************************************************************** |
7 | **************************************************************** | 7 | **************************************************************** |
8 | ** | 8 | ** |
9 | ** WARNING: | ||
9 | ** The values in this file are exported to user space via | 10 | ** The values in this file are exported to user space via |
10 | ** the sysctl() binary interface. However this interface | 11 | ** the sysctl() binary interface. Do *NOT* change the |
11 | ** is unstable and deprecated and will be removed in the future. | 12 | ** numbering of any existing values here, and do not change |
12 | ** For a stable interface use /proc/sys. | 13 | ** any numbers within any one set of values. If you have to |
14 | ** have to redefine an existing interface, use a new number for it. | ||
15 | ** The kernel will then return -ENOTDIR to any application using | ||
16 | ** the old binary interface. | ||
17 | ** | ||
18 | ** For new interfaces unless you really need a binary number | ||
19 | ** please use CTL_UNNUMBERED. | ||
13 | ** | 20 | ** |
14 | **************************************************************** | 21 | **************************************************************** |
15 | **************************************************************** | 22 | **************************************************************** |
@@ -48,6 +55,7 @@ struct __sysctl_args { | |||
48 | #ifdef __KERNEL__ | 55 | #ifdef __KERNEL__ |
49 | #define CTL_ANY -1 /* Matches any name */ | 56 | #define CTL_ANY -1 /* Matches any name */ |
50 | #define CTL_NONE 0 | 57 | #define CTL_NONE 0 |
58 | #define CTL_UNNUMBERED CTL_NONE /* sysctl without a binary number */ | ||
51 | #endif | 59 | #endif |
52 | 60 | ||
53 | enum | 61 | enum |
@@ -961,8 +969,8 @@ extern ctl_handler sysctl_ms_jiffies; | |||
961 | /* | 969 | /* |
962 | * Register a set of sysctl names by calling register_sysctl_table | 970 | * Register a set of sysctl names by calling register_sysctl_table |
963 | * with an initialised array of ctl_table's. An entry with zero | 971 | * with an initialised array of ctl_table's. An entry with zero |
964 | * ctl_name terminates the table. table->de will be set up by the | 972 | * ctl_name and NULL procname terminates the table. table->de will be |
965 | * registration and need not be initialised in advance. | 973 | * set up by the registration and need not be initialised in advance. |
966 | * | 974 | * |
967 | * sysctl names can be mirrored automatically under /proc/sys. The | 975 | * sysctl names can be mirrored automatically under /proc/sys. The |
968 | * procname supplied controls /proc naming. | 976 | * procname supplied controls /proc naming. |
@@ -973,7 +981,10 @@ extern ctl_handler sysctl_ms_jiffies; | |||
973 | * Leaf nodes in the sysctl tree will be represented by a single file | 981 | * Leaf nodes in the sysctl tree will be represented by a single file |
974 | * under /proc; non-leaf nodes will be represented by directories. A | 982 | * under /proc; non-leaf nodes will be represented by directories. A |
975 | * null procname disables /proc mirroring at this node. | 983 | * null procname disables /proc mirroring at this node. |
976 | * | 984 | * |
985 | * sysctl entries with a zero ctl_name will not be available through | ||
986 | * the binary sysctl interface. | ||
987 | * | ||
977 | * sysctl(2) can automatically manage read and write requests through | 988 | * sysctl(2) can automatically manage read and write requests through |
978 | * the sysctl table. The data and maxlen fields of the ctl_table | 989 | * the sysctl table. The data and maxlen fields of the ctl_table |
979 | * struct enable minimal validation of the values being written to be | 990 | * struct enable minimal validation of the values being written to be |
diff --git a/include/linux/taskstats_kern.h b/include/linux/taskstats_kern.h index 16894b7edcc8..6562a2050a25 100644 --- a/include/linux/taskstats_kern.h +++ b/include/linux/taskstats_kern.h | |||
@@ -23,25 +23,26 @@ static inline void taskstats_exit_free(struct taskstats *tidstats) | |||
23 | 23 | ||
24 | static inline void taskstats_tgid_init(struct signal_struct *sig) | 24 | static inline void taskstats_tgid_init(struct signal_struct *sig) |
25 | { | 25 | { |
26 | spin_lock_init(&sig->stats_lock); | ||
27 | sig->stats = NULL; | 26 | sig->stats = NULL; |
28 | } | 27 | } |
29 | 28 | ||
30 | static inline void taskstats_tgid_alloc(struct signal_struct *sig) | 29 | static inline void taskstats_tgid_alloc(struct task_struct *tsk) |
31 | { | 30 | { |
31 | struct signal_struct *sig = tsk->signal; | ||
32 | struct taskstats *stats; | 32 | struct taskstats *stats; |
33 | unsigned long flags; | ||
34 | 33 | ||
35 | stats = kmem_cache_zalloc(taskstats_cache, SLAB_KERNEL); | 34 | if (sig->stats != NULL) |
36 | if (!stats) | ||
37 | return; | 35 | return; |
38 | 36 | ||
39 | spin_lock_irqsave(&sig->stats_lock, flags); | 37 | /* No problem if kmem_cache_zalloc() fails */ |
38 | stats = kmem_cache_zalloc(taskstats_cache, SLAB_KERNEL); | ||
39 | |||
40 | spin_lock_irq(&tsk->sighand->siglock); | ||
40 | if (!sig->stats) { | 41 | if (!sig->stats) { |
41 | sig->stats = stats; | 42 | sig->stats = stats; |
42 | stats = NULL; | 43 | stats = NULL; |
43 | } | 44 | } |
44 | spin_unlock_irqrestore(&sig->stats_lock, flags); | 45 | spin_unlock_irq(&tsk->sighand->siglock); |
45 | 46 | ||
46 | if (stats) | 47 | if (stats) |
47 | kmem_cache_free(taskstats_cache, stats); | 48 | kmem_cache_free(taskstats_cache, stats); |
@@ -49,23 +50,13 @@ static inline void taskstats_tgid_alloc(struct signal_struct *sig) | |||
49 | 50 | ||
50 | static inline void taskstats_tgid_free(struct signal_struct *sig) | 51 | static inline void taskstats_tgid_free(struct signal_struct *sig) |
51 | { | 52 | { |
52 | struct taskstats *stats = NULL; | 53 | if (sig->stats) |
53 | unsigned long flags; | 54 | kmem_cache_free(taskstats_cache, sig->stats); |
54 | |||
55 | spin_lock_irqsave(&sig->stats_lock, flags); | ||
56 | if (sig->stats) { | ||
57 | stats = sig->stats; | ||
58 | sig->stats = NULL; | ||
59 | } | ||
60 | spin_unlock_irqrestore(&sig->stats_lock, flags); | ||
61 | if (stats) | ||
62 | kmem_cache_free(taskstats_cache, stats); | ||
63 | } | 55 | } |
64 | 56 | ||
65 | extern void taskstats_exit_alloc(struct taskstats **, unsigned int *); | 57 | extern void taskstats_exit_alloc(struct taskstats **, unsigned int *); |
66 | extern void taskstats_exit_send(struct task_struct *, struct taskstats *, int, unsigned int); | 58 | extern void taskstats_exit_send(struct task_struct *, struct taskstats *, int, unsigned int); |
67 | extern void taskstats_init_early(void); | 59 | extern void taskstats_init_early(void); |
68 | extern void taskstats_tgid_alloc(struct signal_struct *); | ||
69 | #else | 60 | #else |
70 | static inline void taskstats_exit_alloc(struct taskstats **ptidstats, unsigned int *mycpu) | 61 | static inline void taskstats_exit_alloc(struct taskstats **ptidstats, unsigned int *mycpu) |
71 | {} | 62 | {} |
@@ -77,7 +68,7 @@ static inline void taskstats_exit_send(struct task_struct *tsk, | |||
77 | {} | 68 | {} |
78 | static inline void taskstats_tgid_init(struct signal_struct *sig) | 69 | static inline void taskstats_tgid_init(struct signal_struct *sig) |
79 | {} | 70 | {} |
80 | static inline void taskstats_tgid_alloc(struct signal_struct *sig) | 71 | static inline void taskstats_tgid_alloc(struct task_struct *tsk) |
81 | {} | 72 | {} |
82 | static inline void taskstats_tgid_free(struct signal_struct *sig) | 73 | static inline void taskstats_tgid_free(struct signal_struct *sig) |
83 | {} | 74 | {} |
diff --git a/include/linux/ufs_fs.h b/include/linux/ufs_fs.h index 61eef508b041..28967eda9d7b 100644 --- a/include/linux/ufs_fs.h +++ b/include/linux/ufs_fs.h | |||
@@ -908,7 +908,7 @@ struct ufs_super_block_third { | |||
908 | __fs64 fs_csaddr; /* blk addr of cyl grp summary area */ | 908 | __fs64 fs_csaddr; /* blk addr of cyl grp summary area */ |
909 | __fs64 fs_pendingblocks;/* blocks in process of being freed */ | 909 | __fs64 fs_pendingblocks;/* blocks in process of being freed */ |
910 | __fs32 fs_pendinginodes;/*inodes in process of being freed */ | 910 | __fs32 fs_pendinginodes;/*inodes in process of being freed */ |
911 | } fs_u2; | 911 | } __attribute__ ((packed)) fs_u2; |
912 | } fs_un1; | 912 | } fs_un1; |
913 | union { | 913 | union { |
914 | struct { | 914 | struct { |
diff --git a/include/linux/unwind.h b/include/linux/unwind.h index 73e1751d03dd..749928c161fb 100644 --- a/include/linux/unwind.h +++ b/include/linux/unwind.h | |||
@@ -26,6 +26,7 @@ struct module; | |||
26 | * Initialize unwind support. | 26 | * Initialize unwind support. |
27 | */ | 27 | */ |
28 | extern void unwind_init(void); | 28 | extern void unwind_init(void); |
29 | extern void unwind_setup(void); | ||
29 | 30 | ||
30 | #ifdef CONFIG_MODULES | 31 | #ifdef CONFIG_MODULES |
31 | 32 | ||
@@ -73,6 +74,7 @@ extern int unwind_to_user(struct unwind_frame_info *); | |||
73 | struct unwind_frame_info {}; | 74 | struct unwind_frame_info {}; |
74 | 75 | ||
75 | static inline void unwind_init(void) {} | 76 | static inline void unwind_init(void) {} |
77 | static inline void unwind_setup(void) {} | ||
76 | 78 | ||
77 | #ifdef CONFIG_MODULES | 79 | #ifdef CONFIG_MODULES |
78 | 80 | ||
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index ce5f1482e6be..924e502905d4 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h | |||
@@ -23,13 +23,14 @@ struct vm_area_struct; | |||
23 | #endif | 23 | #endif |
24 | 24 | ||
25 | struct vm_struct { | 25 | struct vm_struct { |
26 | /* keep next,addr,size together to speedup lookups */ | ||
27 | struct vm_struct *next; | ||
26 | void *addr; | 28 | void *addr; |
27 | unsigned long size; | 29 | unsigned long size; |
28 | unsigned long flags; | 30 | unsigned long flags; |
29 | struct page **pages; | 31 | struct page **pages; |
30 | unsigned int nr_pages; | 32 | unsigned int nr_pages; |
31 | unsigned long phys_addr; | 33 | unsigned long phys_addr; |
32 | struct vm_struct *next; | ||
33 | }; | 34 | }; |
34 | 35 | ||
35 | /* | 36 | /* |
@@ -60,7 +61,8 @@ extern struct vm_struct *get_vm_area(unsigned long size, unsigned long flags); | |||
60 | extern struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags, | 61 | extern struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags, |
61 | unsigned long start, unsigned long end); | 62 | unsigned long start, unsigned long end); |
62 | extern struct vm_struct *get_vm_area_node(unsigned long size, | 63 | extern struct vm_struct *get_vm_area_node(unsigned long size, |
63 | unsigned long flags, int node); | 64 | unsigned long flags, int node, |
65 | gfp_t gfp_mask); | ||
64 | extern struct vm_struct *remove_vm_area(void *addr); | 66 | extern struct vm_struct *remove_vm_area(void *addr); |
65 | extern int map_vm_area(struct vm_struct *area, pgprot_t prot, | 67 | extern int map_vm_area(struct vm_struct *area, pgprot_t prot, |
66 | struct page ***pages); | 68 | struct page ***pages); |
diff --git a/include/linux/wait.h b/include/linux/wait.h index b3b9048421d8..e820d00e1383 100644 --- a/include/linux/wait.h +++ b/include/linux/wait.h | |||
@@ -79,6 +79,15 @@ struct task_struct; | |||
79 | 79 | ||
80 | extern void init_waitqueue_head(wait_queue_head_t *q); | 80 | extern void init_waitqueue_head(wait_queue_head_t *q); |
81 | 81 | ||
82 | #ifdef CONFIG_LOCKDEP | ||
83 | # define __WAIT_QUEUE_HEAD_INIT_ONSTACK(name) \ | ||
84 | ({ init_waitqueue_head(&name); name; }) | ||
85 | # define DECLARE_WAIT_QUEUE_HEAD_ONSTACK(name) \ | ||
86 | wait_queue_head_t name = __WAIT_QUEUE_HEAD_INIT_ONSTACK(name) | ||
87 | #else | ||
88 | # define DECLARE_WAIT_QUEUE_HEAD_ONSTACK(name) DECLARE_WAIT_QUEUE_HEAD(name) | ||
89 | #endif | ||
90 | |||
82 | static inline void init_waitqueue_entry(wait_queue_t *q, struct task_struct *p) | 91 | static inline void init_waitqueue_entry(wait_queue_t *q, struct task_struct *p) |
83 | { | 92 | { |
84 | q->flags = 0; | 93 | q->flags = 0; |
diff --git a/include/net/dn.h b/include/net/dn.h index 465b78302782..ac4ce9091747 100644 --- a/include/net/dn.h +++ b/include/net/dn.h | |||
@@ -199,11 +199,6 @@ static inline void dn_sk_ports_copy(struct flowi *fl, struct dn_scp *scp) | |||
199 | { | 199 | { |
200 | fl->uli_u.dnports.sport = scp->addrloc; | 200 | fl->uli_u.dnports.sport = scp->addrloc; |
201 | fl->uli_u.dnports.dport = scp->addrrem; | 201 | fl->uli_u.dnports.dport = scp->addrrem; |
202 | fl->uli_u.dnports.objnum = scp->addr.sdn_objnum; | ||
203 | if (fl->uli_u.dnports.objnum == 0) { | ||
204 | fl->uli_u.dnports.objnamel = (__u8)dn_ntohs(scp->addr.sdn_objnamel); | ||
205 | memcpy(fl->uli_u.dnports.objname, scp->addr.sdn_objname, 16); | ||
206 | } | ||
207 | } | 202 | } |
208 | 203 | ||
209 | extern unsigned dn_mss_from_pmtu(struct net_device *dev, int mtu); | 204 | extern unsigned dn_mss_from_pmtu(struct net_device *dev, int mtu); |
diff --git a/include/net/flow.h b/include/net/flow.h index 3b44d72b27d3..5cda27cd9deb 100644 --- a/include/net/flow.h +++ b/include/net/flow.h | |||
@@ -68,9 +68,6 @@ struct flowi { | |||
68 | struct { | 68 | struct { |
69 | __le16 sport; | 69 | __le16 sport; |
70 | __le16 dport; | 70 | __le16 dport; |
71 | __u8 objnum; | ||
72 | __u8 objnamel; /* Not 16 bits since max val is 16 */ | ||
73 | __u8 objname[16]; /* Not zero terminated */ | ||
74 | } dnports; | 71 | } dnports; |
75 | 72 | ||
76 | __be32 spi; | 73 | __be32 spi; |
diff --git a/include/net/ieee80211softmac.h b/include/net/ieee80211softmac.h index 425b3a57ac74..617b672b1132 100644 --- a/include/net/ieee80211softmac.h +++ b/include/net/ieee80211softmac.h | |||
@@ -63,13 +63,11 @@ struct ieee80211softmac_wpa { | |||
63 | 63 | ||
64 | /* | 64 | /* |
65 | * Information about association | 65 | * Information about association |
66 | * | ||
67 | * Do we need a lock for this? | ||
68 | * We only ever use this structure inlined | ||
69 | * into our global struct. I've used its lock, | ||
70 | * but maybe we need a local one here? | ||
71 | */ | 66 | */ |
72 | struct ieee80211softmac_assoc_info { | 67 | struct ieee80211softmac_assoc_info { |
68 | |||
69 | struct mutex mutex; | ||
70 | |||
73 | /* | 71 | /* |
74 | * This is the requested ESSID. It is written | 72 | * This is the requested ESSID. It is written |
75 | * only by the WX handlers. | 73 | * only by the WX handlers. |
@@ -99,12 +97,13 @@ struct ieee80211softmac_assoc_info { | |||
99 | * | 97 | * |
100 | * bssfixed is used for SIOCSIWAP. | 98 | * bssfixed is used for SIOCSIWAP. |
101 | */ | 99 | */ |
102 | u8 static_essid:1, | 100 | u8 static_essid; |
103 | short_preamble_available:1, | 101 | u8 short_preamble_available; |
104 | associating:1, | 102 | u8 associating; |
105 | assoc_wait:1, | 103 | u8 associated; |
106 | bssvalid:1, | 104 | u8 assoc_wait; |
107 | bssfixed:1; | 105 | u8 bssvalid; |
106 | u8 bssfixed; | ||
108 | 107 | ||
109 | /* Scan retries remaining */ | 108 | /* Scan retries remaining */ |
110 | int scan_retry; | 109 | int scan_retry; |
@@ -229,12 +228,10 @@ struct ieee80211softmac_device { | |||
229 | /* private stuff follows */ | 228 | /* private stuff follows */ |
230 | /* this lock protects this structure */ | 229 | /* this lock protects this structure */ |
231 | spinlock_t lock; | 230 | spinlock_t lock; |
232 | 231 | ||
233 | /* couple of flags */ | 232 | u8 running; /* SoftMAC started? */ |
234 | u8 scanning:1, /* protects scanning from being done multiple times at once */ | 233 | u8 scanning; |
235 | associated:1, | 234 | |
236 | running:1; | ||
237 | |||
238 | struct ieee80211softmac_scaninfo *scaninfo; | 235 | struct ieee80211softmac_scaninfo *scaninfo; |
239 | struct ieee80211softmac_assoc_info associnfo; | 236 | struct ieee80211softmac_assoc_info associnfo; |
240 | struct ieee80211softmac_bss_info bssinfo; | 237 | struct ieee80211softmac_bss_info bssinfo; |
@@ -250,7 +247,7 @@ struct ieee80211softmac_device { | |||
250 | 247 | ||
251 | /* we need to keep a list of network structs we copied */ | 248 | /* we need to keep a list of network structs we copied */ |
252 | struct list_head network_list; | 249 | struct list_head network_list; |
253 | 250 | ||
254 | /* This must be the last item so that it points to the data | 251 | /* This must be the last item so that it points to the data |
255 | * allocated beyond this structure by alloc_ieee80211 */ | 252 | * allocated beyond this structure by alloc_ieee80211 */ |
256 | u8 priv[0]; | 253 | u8 priv[0]; |
@@ -295,7 +292,7 @@ static inline u8 ieee80211softmac_suggest_txrate(struct ieee80211softmac_device | |||
295 | { | 292 | { |
296 | struct ieee80211softmac_txrates *txrates = &mac->txrates; | 293 | struct ieee80211softmac_txrates *txrates = &mac->txrates; |
297 | 294 | ||
298 | if (!mac->associated) | 295 | if (!mac->associnfo.associated) |
299 | return txrates->mgt_mcast_rate; | 296 | return txrates->mgt_mcast_rate; |
300 | 297 | ||
301 | /* We are associated, sending unicast frame */ | 298 | /* We are associated, sending unicast frame */ |
diff --git a/include/net/inet_ecn.h b/include/net/inet_ecn.h index d599c6bfbb86..7849844a4911 100644 --- a/include/net/inet_ecn.h +++ b/include/net/inet_ecn.h | |||
@@ -48,7 +48,7 @@ static inline __u8 INET_ECN_encapsulate(__u8 outer, __u8 inner) | |||
48 | 48 | ||
49 | #define IP6_ECN_flow_xmit(sk, label) do { \ | 49 | #define IP6_ECN_flow_xmit(sk, label) do { \ |
50 | if (INET_ECN_is_capable(inet_sk(sk)->tos)) \ | 50 | if (INET_ECN_is_capable(inet_sk(sk)->tos)) \ |
51 | (label) |= __constant_htons(INET_ECN_ECT_0 << 4); \ | 51 | (label) |= htonl(INET_ECN_ECT_0 << 20); \ |
52 | } while (0) | 52 | } while (0) |
53 | 53 | ||
54 | static inline int IP_ECN_set_ce(struct iphdr *iph) | 54 | static inline int IP_ECN_set_ce(struct iphdr *iph) |
diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h index 49c717e3b040..903108e583f8 100644 --- a/include/net/ip_vs.h +++ b/include/net/ip_vs.h | |||
@@ -7,6 +7,7 @@ | |||
7 | #define _IP_VS_H | 7 | #define _IP_VS_H |
8 | 8 | ||
9 | #include <asm/types.h> /* For __uXX types */ | 9 | #include <asm/types.h> /* For __uXX types */ |
10 | #include <linux/types.h> /* For __beXX types in userland */ | ||
10 | 11 | ||
11 | #define IP_VS_VERSION_CODE 0x010201 | 12 | #define IP_VS_VERSION_CODE 0x010201 |
12 | #define NVERSION(version) \ | 13 | #define NVERSION(version) \ |
diff --git a/include/net/ipx.h b/include/net/ipx.h index 5c0cf33826c5..c6b2ee610866 100644 --- a/include/net/ipx.h +++ b/include/net/ipx.h | |||
@@ -15,9 +15,9 @@ | |||
15 | #include <linux/list.h> | 15 | #include <linux/list.h> |
16 | 16 | ||
17 | struct ipx_address { | 17 | struct ipx_address { |
18 | __u32 net; | 18 | __be32 net; |
19 | __u8 node[IPX_NODE_LEN]; | 19 | __u8 node[IPX_NODE_LEN]; |
20 | __u16 sock; | 20 | __be16 sock; |
21 | }; | 21 | }; |
22 | 22 | ||
23 | #define ipx_broadcast_node "\377\377\377\377\377\377" | 23 | #define ipx_broadcast_node "\377\377\377\377\377\377" |
@@ -26,9 +26,9 @@ struct ipx_address { | |||
26 | #define IPX_MAX_PPROP_HOPS 8 | 26 | #define IPX_MAX_PPROP_HOPS 8 |
27 | 27 | ||
28 | struct ipxhdr { | 28 | struct ipxhdr { |
29 | __u16 ipx_checksum __attribute__ ((packed)); | 29 | __be16 ipx_checksum __attribute__ ((packed)); |
30 | #define IPX_NO_CHECKSUM 0xFFFF | 30 | #define IPX_NO_CHECKSUM __constant_htons(0xFFFF) |
31 | __u16 ipx_pktsize __attribute__ ((packed)); | 31 | __be16 ipx_pktsize __attribute__ ((packed)); |
32 | __u8 ipx_tctrl; | 32 | __u8 ipx_tctrl; |
33 | __u8 ipx_type; | 33 | __u8 ipx_type; |
34 | #define IPX_TYPE_UNKNOWN 0x00 | 34 | #define IPX_TYPE_UNKNOWN 0x00 |
@@ -48,14 +48,14 @@ static __inline__ struct ipxhdr *ipx_hdr(struct sk_buff *skb) | |||
48 | 48 | ||
49 | struct ipx_interface { | 49 | struct ipx_interface { |
50 | /* IPX address */ | 50 | /* IPX address */ |
51 | __u32 if_netnum; | 51 | __be32 if_netnum; |
52 | unsigned char if_node[IPX_NODE_LEN]; | 52 | unsigned char if_node[IPX_NODE_LEN]; |
53 | atomic_t refcnt; | 53 | atomic_t refcnt; |
54 | 54 | ||
55 | /* physical device info */ | 55 | /* physical device info */ |
56 | struct net_device *if_dev; | 56 | struct net_device *if_dev; |
57 | struct datalink_proto *if_dlink; | 57 | struct datalink_proto *if_dlink; |
58 | unsigned short if_dlink_type; | 58 | __be16 if_dlink_type; |
59 | 59 | ||
60 | /* socket support */ | 60 | /* socket support */ |
61 | unsigned short if_sknum; | 61 | unsigned short if_sknum; |
@@ -71,7 +71,7 @@ struct ipx_interface { | |||
71 | }; | 71 | }; |
72 | 72 | ||
73 | struct ipx_route { | 73 | struct ipx_route { |
74 | __u32 ir_net; | 74 | __be32 ir_net; |
75 | struct ipx_interface *ir_intrfc; | 75 | struct ipx_interface *ir_intrfc; |
76 | unsigned char ir_routed; | 76 | unsigned char ir_routed; |
77 | unsigned char ir_router_node[IPX_NODE_LEN]; | 77 | unsigned char ir_router_node[IPX_NODE_LEN]; |
@@ -82,10 +82,10 @@ struct ipx_route { | |||
82 | #ifdef __KERNEL__ | 82 | #ifdef __KERNEL__ |
83 | struct ipx_cb { | 83 | struct ipx_cb { |
84 | u8 ipx_tctrl; | 84 | u8 ipx_tctrl; |
85 | u32 ipx_dest_net; | 85 | __be32 ipx_dest_net; |
86 | u32 ipx_source_net; | 86 | __be32 ipx_source_net; |
87 | struct { | 87 | struct { |
88 | u32 netnum; | 88 | __be32 netnum; |
89 | int index; | 89 | int index; |
90 | } last_hop; | 90 | } last_hop; |
91 | }; | 91 | }; |
@@ -97,7 +97,7 @@ struct ipx_sock { | |||
97 | struct sock sk; | 97 | struct sock sk; |
98 | struct ipx_address dest_addr; | 98 | struct ipx_address dest_addr; |
99 | struct ipx_interface *intrfc; | 99 | struct ipx_interface *intrfc; |
100 | unsigned short port; | 100 | __be16 port; |
101 | #ifdef CONFIG_IPX_INTERN | 101 | #ifdef CONFIG_IPX_INTERN |
102 | unsigned char node[IPX_NODE_LEN]; | 102 | unsigned char node[IPX_NODE_LEN]; |
103 | #endif | 103 | #endif |
@@ -132,7 +132,7 @@ extern struct ipx_interface *ipx_primary_net; | |||
132 | extern int ipx_proc_init(void); | 132 | extern int ipx_proc_init(void); |
133 | extern void ipx_proc_exit(void); | 133 | extern void ipx_proc_exit(void); |
134 | 134 | ||
135 | extern const char *ipx_frame_name(unsigned short); | 135 | extern const char *ipx_frame_name(__be16); |
136 | extern const char *ipx_device_name(struct ipx_interface *intrfc); | 136 | extern const char *ipx_device_name(struct ipx_interface *intrfc); |
137 | 137 | ||
138 | static __inline__ void ipxitf_hold(struct ipx_interface *intrfc) | 138 | static __inline__ void ipxitf_hold(struct ipx_interface *intrfc) |
diff --git a/include/net/sock.h b/include/net/sock.h index 40bb90ebb2d1..9cdbae2a53a3 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -883,19 +883,23 @@ static inline int sk_filter(struct sock *sk, struct sk_buff *skb) | |||
883 | } | 883 | } |
884 | 884 | ||
885 | /** | 885 | /** |
886 | * sk_filter_release: Release a socket filter | 886 | * sk_filter_rcu_free: Free a socket filter |
887 | * @sk: socket | 887 | * @rcu: rcu_head that contains the sk_filter to free |
888 | * @fp: filter to remove | ||
889 | * | ||
890 | * Remove a filter from a socket and release its resources. | ||
891 | */ | 888 | */ |
892 | |||
893 | static inline void sk_filter_rcu_free(struct rcu_head *rcu) | 889 | static inline void sk_filter_rcu_free(struct rcu_head *rcu) |
894 | { | 890 | { |
895 | struct sk_filter *fp = container_of(rcu, struct sk_filter, rcu); | 891 | struct sk_filter *fp = container_of(rcu, struct sk_filter, rcu); |
896 | kfree(fp); | 892 | kfree(fp); |
897 | } | 893 | } |
898 | 894 | ||
895 | /** | ||
896 | * sk_filter_release: Release a socket filter | ||
897 | * @sk: socket | ||
898 | * @fp: filter to remove | ||
899 | * | ||
900 | * Remove a filter from a socket and release its resources. | ||
901 | */ | ||
902 | |||
899 | static inline void sk_filter_release(struct sock *sk, struct sk_filter *fp) | 903 | static inline void sk_filter_release(struct sock *sk, struct sk_filter *fp) |
900 | { | 904 | { |
901 | unsigned int size = sk_filter_len(fp); | 905 | unsigned int size = sk_filter_len(fp); |
diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h index 81b62307621d..c094e5012862 100644 --- a/include/rdma/ib_addr.h +++ b/include/rdma/ib_addr.h | |||
@@ -36,6 +36,22 @@ | |||
36 | #include <linux/socket.h> | 36 | #include <linux/socket.h> |
37 | #include <rdma/ib_verbs.h> | 37 | #include <rdma/ib_verbs.h> |
38 | 38 | ||
39 | struct rdma_addr_client { | ||
40 | atomic_t refcount; | ||
41 | struct completion comp; | ||
42 | }; | ||
43 | |||
44 | /** | ||
45 | * rdma_addr_register_client - Register an address client. | ||
46 | */ | ||
47 | void rdma_addr_register_client(struct rdma_addr_client *client); | ||
48 | |||
49 | /** | ||
50 | * rdma_addr_unregister_client - Deregister an address client. | ||
51 | * @client: Client object to deregister. | ||
52 | */ | ||
53 | void rdma_addr_unregister_client(struct rdma_addr_client *client); | ||
54 | |||
39 | struct rdma_dev_addr { | 55 | struct rdma_dev_addr { |
40 | unsigned char src_dev_addr[MAX_ADDR_LEN]; | 56 | unsigned char src_dev_addr[MAX_ADDR_LEN]; |
41 | unsigned char dst_dev_addr[MAX_ADDR_LEN]; | 57 | unsigned char dst_dev_addr[MAX_ADDR_LEN]; |
@@ -52,6 +68,7 @@ int rdma_translate_ip(struct sockaddr *addr, struct rdma_dev_addr *dev_addr); | |||
52 | /** | 68 | /** |
53 | * rdma_resolve_ip - Resolve source and destination IP addresses to | 69 | * rdma_resolve_ip - Resolve source and destination IP addresses to |
54 | * RDMA hardware addresses. | 70 | * RDMA hardware addresses. |
71 | * @client: Address client associated with request. | ||
55 | * @src_addr: An optional source address to use in the resolution. If a | 72 | * @src_addr: An optional source address to use in the resolution. If a |
56 | * source address is not provided, a usable address will be returned via | 73 | * source address is not provided, a usable address will be returned via |
57 | * the callback. | 74 | * the callback. |
@@ -64,7 +81,8 @@ int rdma_translate_ip(struct sockaddr *addr, struct rdma_dev_addr *dev_addr); | |||
64 | * or been canceled. A status of 0 indicates success. | 81 | * or been canceled. A status of 0 indicates success. |
65 | * @context: User-specified context associated with the call. | 82 | * @context: User-specified context associated with the call. |
66 | */ | 83 | */ |
67 | int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr, | 84 | int rdma_resolve_ip(struct rdma_addr_client *client, |
85 | struct sockaddr *src_addr, struct sockaddr *dst_addr, | ||
68 | struct rdma_dev_addr *addr, int timeout_ms, | 86 | struct rdma_dev_addr *addr, int timeout_ms, |
69 | void (*callback)(int status, struct sockaddr *src_addr, | 87 | void (*callback)(int status, struct sockaddr *src_addr, |
70 | struct rdma_dev_addr *addr, void *context), | 88 | struct rdma_dev_addr *addr, void *context), |
diff --git a/include/rdma/ib_user_verbs.h b/include/rdma/ib_user_verbs.h index db1b814b62cc..64a721fcbc1c 100644 --- a/include/rdma/ib_user_verbs.h +++ b/include/rdma/ib_user_verbs.h | |||
@@ -458,7 +458,7 @@ struct ib_uverbs_query_qp_resp { | |||
458 | __u8 cur_qp_state; | 458 | __u8 cur_qp_state; |
459 | __u8 path_mtu; | 459 | __u8 path_mtu; |
460 | __u8 path_mig_state; | 460 | __u8 path_mig_state; |
461 | __u8 en_sqd_async_notify; | 461 | __u8 sq_draining; |
462 | __u8 max_rd_atomic; | 462 | __u8 max_rd_atomic; |
463 | __u8 max_dest_rd_atomic; | 463 | __u8 max_dest_rd_atomic; |
464 | __u8 min_rnr_timer; | 464 | __u8 min_rnr_timer; |
diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h index 401192e56e50..61eebec00a7b 100644 --- a/include/scsi/libiscsi.h +++ b/include/scsi/libiscsi.h | |||
@@ -136,7 +136,6 @@ struct iscsi_conn { | |||
136 | 136 | ||
137 | /* control data */ | 137 | /* control data */ |
138 | int id; /* CID */ | 138 | int id; /* CID */ |
139 | struct list_head item; /* maintains list of conns */ | ||
140 | int c_stage; /* connection state */ | 139 | int c_stage; /* connection state */ |
141 | /* | 140 | /* |
142 | * Preallocated buffer for pdus that have data but do not | 141 | * Preallocated buffer for pdus that have data but do not |
@@ -235,10 +234,8 @@ struct iscsi_session { | |||
235 | * - mgmtpool, * | 234 | * - mgmtpool, * |
236 | * - r2tpool */ | 235 | * - r2tpool */ |
237 | int state; /* session state */ | 236 | int state; /* session state */ |
238 | struct list_head item; | ||
239 | int age; /* counts session re-opens */ | 237 | int age; /* counts session re-opens */ |
240 | 238 | ||
241 | struct list_head connections; /* list of connections */ | ||
242 | int cmds_max; /* size of cmds array */ | 239 | int cmds_max; /* size of cmds array */ |
243 | struct iscsi_cmd_task **cmds; /* Original Cmds arr */ | 240 | struct iscsi_cmd_task **cmds; /* Original Cmds arr */ |
244 | struct iscsi_queue cmdpool; /* PDU's pool */ | 241 | struct iscsi_queue cmdpool; /* PDU's pool */ |
diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 9582e8401669..1d77b63c5ea4 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <scsi/scsi_device.h> | 35 | #include <scsi/scsi_device.h> |
36 | #include <scsi/scsi_cmnd.h> | 36 | #include <scsi/scsi_cmnd.h> |
37 | #include <scsi/scsi_transport_sas.h> | 37 | #include <scsi/scsi_transport_sas.h> |
38 | #include <asm/scatterlist.h> | ||
38 | 39 | ||
39 | struct block_device; | 40 | struct block_device; |
40 | 41 | ||
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h index 84a6d5fe0920..5c0e9791441c 100644 --- a/include/scsi/scsi.h +++ b/include/scsi/scsi.h | |||
@@ -97,6 +97,7 @@ extern const unsigned char scsi_command_size[8]; | |||
97 | #define PERSISTENT_RESERVE_IN 0x5e | 97 | #define PERSISTENT_RESERVE_IN 0x5e |
98 | #define PERSISTENT_RESERVE_OUT 0x5f | 98 | #define PERSISTENT_RESERVE_OUT 0x5f |
99 | #define REPORT_LUNS 0xa0 | 99 | #define REPORT_LUNS 0xa0 |
100 | #define MAINTENANCE_IN 0xa3 | ||
100 | #define MOVE_MEDIUM 0xa5 | 101 | #define MOVE_MEDIUM 0xa5 |
101 | #define EXCHANGE_MEDIUM 0xa6 | 102 | #define EXCHANGE_MEDIUM 0xa6 |
102 | #define READ_12 0xa8 | 103 | #define READ_12 0xa8 |
@@ -114,6 +115,8 @@ extern const unsigned char scsi_command_size[8]; | |||
114 | #define SERVICE_ACTION_IN 0x9e | 115 | #define SERVICE_ACTION_IN 0x9e |
115 | /* values for service action in */ | 116 | /* values for service action in */ |
116 | #define SAI_READ_CAPACITY_16 0x10 | 117 | #define SAI_READ_CAPACITY_16 0x10 |
118 | /* values for maintenance in */ | ||
119 | #define MI_REPORT_TARGET_PGS 0x0a | ||
117 | 120 | ||
118 | /* Values for T10/04-262r7 */ | 121 | /* Values for T10/04-262r7 */ |
119 | #define ATA_16 0x85 /* 16-byte pass-thru */ | 122 | #define ATA_16 0x85 /* 16-byte pass-thru */ |
@@ -430,7 +433,7 @@ struct scsi_lun { | |||
430 | #define SCSI_IOCTL_GET_PCI 0x5387 | 433 | #define SCSI_IOCTL_GET_PCI 0x5387 |
431 | 434 | ||
432 | /* Pull a u32 out of a SCSI message (using BE SCSI conventions) */ | 435 | /* Pull a u32 out of a SCSI message (using BE SCSI conventions) */ |
433 | static inline u32 scsi_to_u32(u8 *ptr) | 436 | static inline __u32 scsi_to_u32(__u8 *ptr) |
434 | { | 437 | { |
435 | return (ptr[0]<<24) + (ptr[1]<<16) + (ptr[2]<<8) + ptr[3]; | 438 | return (ptr[0]<<24) + (ptr[1]<<16) + (ptr[2]<<8) + ptr[3]; |
436 | } | 439 | } |
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h index 39e833260bd0..4b95c89c95c9 100644 --- a/include/scsi/scsi_transport_iscsi.h +++ b/include/scsi/scsi_transport_iscsi.h | |||
@@ -29,7 +29,6 @@ | |||
29 | struct scsi_transport_template; | 29 | struct scsi_transport_template; |
30 | struct iscsi_transport; | 30 | struct iscsi_transport; |
31 | struct Scsi_Host; | 31 | struct Scsi_Host; |
32 | struct mempool_zone; | ||
33 | struct iscsi_cls_conn; | 32 | struct iscsi_cls_conn; |
34 | struct iscsi_conn; | 33 | struct iscsi_conn; |
35 | struct iscsi_cmd_task; | 34 | struct iscsi_cmd_task; |
@@ -157,9 +156,6 @@ struct iscsi_cls_conn { | |||
157 | 156 | ||
158 | int active; /* must be accessed with the connlock */ | 157 | int active; /* must be accessed with the connlock */ |
159 | struct device dev; /* sysfs transport/container device */ | 158 | struct device dev; /* sysfs transport/container device */ |
160 | struct mempool_zone *z_error; | ||
161 | struct mempool_zone *z_pdu; | ||
162 | struct list_head freequeue; | ||
163 | }; | 159 | }; |
164 | 160 | ||
165 | #define iscsi_dev_to_conn(_dev) \ | 161 | #define iscsi_dev_to_conn(_dev) \ |
diff --git a/include/sound/version.h b/include/sound/version.h index 4ad86eb6440b..17137f3a3b6f 100644 --- a/include/sound/version.h +++ b/include/sound/version.h | |||
@@ -1,3 +1,3 @@ | |||
1 | /* include/version.h. Generated by alsa/ksync script. */ | 1 | /* include/version.h. Generated by alsa/ksync script. */ |
2 | #define CONFIG_SND_VERSION "1.0.13" | 2 | #define CONFIG_SND_VERSION "1.0.13" |
3 | #define CONFIG_SND_DATE " (Fri Oct 06 18:28:19 2006 UTC)" | 3 | #define CONFIG_SND_DATE " (Tue Nov 28 14:07:24 2006 UTC)" |
diff --git a/init/Kconfig b/init/Kconfig index c8b2624af176..176f7e5136c7 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -304,20 +304,19 @@ config UID16 | |||
304 | 304 | ||
305 | config SYSCTL_SYSCALL | 305 | config SYSCTL_SYSCALL |
306 | bool "Sysctl syscall support" if EMBEDDED | 306 | bool "Sysctl syscall support" if EMBEDDED |
307 | default n | 307 | default y |
308 | select SYSCTL | 308 | select SYSCTL |
309 | ---help--- | 309 | ---help--- |
310 | Enable the deprecated sysctl system call. sys_sysctl uses | 310 | sys_sysctl uses binary paths that have been found challenging |
311 | binary paths that have been found to be a major pain to maintain | 311 | to properly maintain and use. The interface in /proc/sys |
312 | and use. The interface in /proc/sys is now the primary and what | 312 | using paths with ascii names is now the primary path to this |
313 | everyone uses. | 313 | information. |
314 | 314 | ||
315 | Nothing has been using the binary sysctl interface for some | 315 | Almost nothing using the binary sysctl interface so if you are |
316 | time now so nothing should break if you disable sysctl syscall | 316 | trying to save some space it is probably safe to disable this, |
317 | support, and your kernel will get marginally smaller. | 317 | making your kernel marginally smaller. |
318 | 318 | ||
319 | Unless you have an application that uses the sys_sysctl interface | 319 | If unsure say Y here. |
320 | you should probably say N here. | ||
321 | 320 | ||
322 | config KALLSYMS | 321 | config KALLSYMS |
323 | bool "Load all symbols for debugging/kksymoops" if EMBEDDED | 322 | bool "Load all symbols for debugging/kksymoops" if EMBEDDED |
diff --git a/init/main.c b/init/main.c index ee123243fb53..36f608a7cfba 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -503,6 +503,7 @@ asmlinkage void __init start_kernel(void) | |||
503 | printk(KERN_NOTICE); | 503 | printk(KERN_NOTICE); |
504 | printk(linux_banner); | 504 | printk(linux_banner); |
505 | setup_arch(&command_line); | 505 | setup_arch(&command_line); |
506 | unwind_setup(); | ||
506 | setup_per_cpu_areas(); | 507 | setup_per_cpu_areas(); |
507 | smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ | 508 | smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ |
508 | 509 | ||
@@ -52,7 +52,7 @@ struct msg_receiver { | |||
52 | long r_msgtype; | 52 | long r_msgtype; |
53 | long r_maxsize; | 53 | long r_maxsize; |
54 | 54 | ||
55 | volatile struct msg_msg *r_msg; | 55 | struct msg_msg *volatile r_msg; |
56 | }; | 56 | }; |
57 | 57 | ||
58 | /* one msg_sender for each sleeping sender */ | 58 | /* one msg_sender for each sleeping sender */ |
@@ -124,6 +124,7 @@ void msg_exit_ns(struct ipc_namespace *ns) | |||
124 | } | 124 | } |
125 | mutex_unlock(&msg_ids(ns).mutex); | 125 | mutex_unlock(&msg_ids(ns).mutex); |
126 | 126 | ||
127 | ipc_fini_ids(ns->ids[IPC_MSG_IDS]); | ||
127 | kfree(ns->ids[IPC_MSG_IDS]); | 128 | kfree(ns->ids[IPC_MSG_IDS]); |
128 | ns->ids[IPC_MSG_IDS] = NULL; | 129 | ns->ids[IPC_MSG_IDS] = NULL; |
129 | } | 130 | } |
@@ -161,6 +161,7 @@ void sem_exit_ns(struct ipc_namespace *ns) | |||
161 | } | 161 | } |
162 | mutex_unlock(&sem_ids(ns).mutex); | 162 | mutex_unlock(&sem_ids(ns).mutex); |
163 | 163 | ||
164 | ipc_fini_ids(ns->ids[IPC_SEM_IDS]); | ||
164 | kfree(ns->ids[IPC_SEM_IDS]); | 165 | kfree(ns->ids[IPC_SEM_IDS]); |
165 | ns->ids[IPC_SEM_IDS] = NULL; | 166 | ns->ids[IPC_SEM_IDS] = NULL; |
166 | } | 167 | } |
@@ -116,6 +116,7 @@ void shm_exit_ns(struct ipc_namespace *ns) | |||
116 | } | 116 | } |
117 | mutex_unlock(&shm_ids(ns).mutex); | 117 | mutex_unlock(&shm_ids(ns).mutex); |
118 | 118 | ||
119 | ipc_fini_ids(ns->ids[IPC_SHM_IDS]); | ||
119 | kfree(ns->ids[IPC_SHM_IDS]); | 120 | kfree(ns->ids[IPC_SHM_IDS]); |
120 | ns->ids[IPC_SHM_IDS] = NULL; | 121 | ns->ids[IPC_SHM_IDS] = NULL; |
121 | } | 122 | } |
diff --git a/ipc/util.c b/ipc/util.c index 42479e4eec59..cd8bb14a431f 100644 --- a/ipc/util.c +++ b/ipc/util.c | |||
@@ -301,7 +301,7 @@ static int grow_ary(struct ipc_ids* ids, int newsize) | |||
301 | */ | 301 | */ |
302 | rcu_assign_pointer(ids->entries, new); | 302 | rcu_assign_pointer(ids->entries, new); |
303 | 303 | ||
304 | ipc_rcu_putref(old); | 304 | __ipc_fini_ids(ids, old); |
305 | return newsize; | 305 | return newsize; |
306 | } | 306 | } |
307 | 307 | ||
diff --git a/ipc/util.h b/ipc/util.h index c8fd6b9d77b5..e3aa2c5c97dc 100644 --- a/ipc/util.h +++ b/ipc/util.h | |||
@@ -83,6 +83,18 @@ void* ipc_rcu_alloc(int size); | |||
83 | void ipc_rcu_getref(void *ptr); | 83 | void ipc_rcu_getref(void *ptr); |
84 | void ipc_rcu_putref(void *ptr); | 84 | void ipc_rcu_putref(void *ptr); |
85 | 85 | ||
86 | static inline void __ipc_fini_ids(struct ipc_ids *ids, | ||
87 | struct ipc_id_ary *entries) | ||
88 | { | ||
89 | if (entries != &ids->nullentry) | ||
90 | ipc_rcu_putref(entries); | ||
91 | } | ||
92 | |||
93 | static inline void ipc_fini_ids(struct ipc_ids *ids) | ||
94 | { | ||
95 | __ipc_fini_ids(ids, ids->entries); | ||
96 | } | ||
97 | |||
86 | struct kern_ipc_perm* ipc_get(struct ipc_ids* ids, int id); | 98 | struct kern_ipc_perm* ipc_get(struct ipc_ids* ids, int id); |
87 | struct kern_ipc_perm* ipc_lock(struct ipc_ids* ids, int id); | 99 | struct kern_ipc_perm* ipc_lock(struct ipc_ids* ids, int id); |
88 | void ipc_lock_by_ptr(struct kern_ipc_perm *ipcp); | 100 | void ipc_lock_by_ptr(struct kern_ipc_perm *ipcp); |
diff --git a/kernel/compat.c b/kernel/compat.c index 75573e5d27b0..6952dd057300 100644 --- a/kernel/compat.c +++ b/kernel/compat.c | |||
@@ -678,7 +678,7 @@ int get_compat_sigevent(struct sigevent *event, | |||
678 | ? -EFAULT : 0; | 678 | ? -EFAULT : 0; |
679 | } | 679 | } |
680 | 680 | ||
681 | long compat_get_bitmap(unsigned long *mask, compat_ulong_t __user *umask, | 681 | long compat_get_bitmap(unsigned long *mask, const compat_ulong_t __user *umask, |
682 | unsigned long bitmap_size) | 682 | unsigned long bitmap_size) |
683 | { | 683 | { |
684 | int i, j; | 684 | int i, j; |
@@ -982,4 +982,37 @@ asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_pages, | |||
982 | } | 982 | } |
983 | return sys_move_pages(pid, nr_pages, pages, nodes, status, flags); | 983 | return sys_move_pages(pid, nr_pages, pages, nodes, status, flags); |
984 | } | 984 | } |
985 | |||
986 | asmlinkage long compat_sys_migrate_pages(compat_pid_t pid, | ||
987 | compat_ulong_t maxnode, | ||
988 | const compat_ulong_t __user *old_nodes, | ||
989 | const compat_ulong_t __user *new_nodes) | ||
990 | { | ||
991 | unsigned long __user *old = NULL; | ||
992 | unsigned long __user *new = NULL; | ||
993 | nodemask_t tmp_mask; | ||
994 | unsigned long nr_bits; | ||
995 | unsigned long size; | ||
996 | |||
997 | nr_bits = min_t(unsigned long, maxnode - 1, MAX_NUMNODES); | ||
998 | size = ALIGN(nr_bits, BITS_PER_LONG) / 8; | ||
999 | if (old_nodes) { | ||
1000 | if (compat_get_bitmap(nodes_addr(tmp_mask), old_nodes, nr_bits)) | ||
1001 | return -EFAULT; | ||
1002 | old = compat_alloc_user_space(new_nodes ? size * 2 : size); | ||
1003 | if (new_nodes) | ||
1004 | new = old + size / sizeof(unsigned long); | ||
1005 | if (copy_to_user(old, nodes_addr(tmp_mask), size)) | ||
1006 | return -EFAULT; | ||
1007 | } | ||
1008 | if (new_nodes) { | ||
1009 | if (compat_get_bitmap(nodes_addr(tmp_mask), new_nodes, nr_bits)) | ||
1010 | return -EFAULT; | ||
1011 | if (new == NULL) | ||
1012 | new = compat_alloc_user_space(size); | ||
1013 | if (copy_to_user(new, nodes_addr(tmp_mask), size)) | ||
1014 | return -EFAULT; | ||
1015 | } | ||
1016 | return sys_migrate_pages(pid, nr_bits + 1, old, new); | ||
1017 | } | ||
985 | #endif | 1018 | #endif |
diff --git a/kernel/cpu.c b/kernel/cpu.c index 27dd3ee47099..272254f20d97 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
@@ -58,8 +58,8 @@ void unlock_cpu_hotplug(void) | |||
58 | recursive_depth--; | 58 | recursive_depth--; |
59 | return; | 59 | return; |
60 | } | 60 | } |
61 | mutex_unlock(&cpu_bitmask_lock); | ||
62 | recursive = NULL; | 61 | recursive = NULL; |
62 | mutex_unlock(&cpu_bitmask_lock); | ||
63 | } | 63 | } |
64 | EXPORT_SYMBOL_GPL(unlock_cpu_hotplug); | 64 | EXPORT_SYMBOL_GPL(unlock_cpu_hotplug); |
65 | 65 | ||
@@ -150,18 +150,18 @@ static int _cpu_down(unsigned int cpu) | |||
150 | p = __stop_machine_run(take_cpu_down, NULL, cpu); | 150 | p = __stop_machine_run(take_cpu_down, NULL, cpu); |
151 | mutex_unlock(&cpu_bitmask_lock); | 151 | mutex_unlock(&cpu_bitmask_lock); |
152 | 152 | ||
153 | if (IS_ERR(p)) { | 153 | if (IS_ERR(p) || cpu_online(cpu)) { |
154 | /* CPU didn't die: tell everyone. Can't complain. */ | 154 | /* CPU didn't die: tell everyone. Can't complain. */ |
155 | if (raw_notifier_call_chain(&cpu_chain, CPU_DOWN_FAILED, | 155 | if (raw_notifier_call_chain(&cpu_chain, CPU_DOWN_FAILED, |
156 | (void *)(long)cpu) == NOTIFY_BAD) | 156 | (void *)(long)cpu) == NOTIFY_BAD) |
157 | BUG(); | 157 | BUG(); |
158 | 158 | ||
159 | err = PTR_ERR(p); | 159 | if (IS_ERR(p)) { |
160 | goto out_allowed; | 160 | err = PTR_ERR(p); |
161 | } | 161 | goto out_allowed; |
162 | 162 | } | |
163 | if (cpu_online(cpu)) | ||
164 | goto out_thread; | 163 | goto out_thread; |
164 | } | ||
165 | 165 | ||
166 | /* Wait for it to sleep (leaving idle task). */ | 166 | /* Wait for it to sleep (leaving idle task). */ |
167 | while (!idle_cpu(cpu)) | 167 | while (!idle_cpu(cpu)) |
diff --git a/kernel/delayacct.c b/kernel/delayacct.c index 36752f124c6a..66a0ea48751d 100644 --- a/kernel/delayacct.c +++ b/kernel/delayacct.c | |||
@@ -66,6 +66,7 @@ static void delayacct_end(struct timespec *start, struct timespec *end, | |||
66 | { | 66 | { |
67 | struct timespec ts; | 67 | struct timespec ts; |
68 | s64 ns; | 68 | s64 ns; |
69 | unsigned long flags; | ||
69 | 70 | ||
70 | do_posix_clock_monotonic_gettime(end); | 71 | do_posix_clock_monotonic_gettime(end); |
71 | ts = timespec_sub(*end, *start); | 72 | ts = timespec_sub(*end, *start); |
@@ -73,10 +74,10 @@ static void delayacct_end(struct timespec *start, struct timespec *end, | |||
73 | if (ns < 0) | 74 | if (ns < 0) |
74 | return; | 75 | return; |
75 | 76 | ||
76 | spin_lock(¤t->delays->lock); | 77 | spin_lock_irqsave(¤t->delays->lock, flags); |
77 | *total += ns; | 78 | *total += ns; |
78 | (*count)++; | 79 | (*count)++; |
79 | spin_unlock(¤t->delays->lock); | 80 | spin_unlock_irqrestore(¤t->delays->lock, flags); |
80 | } | 81 | } |
81 | 82 | ||
82 | void __delayacct_blkio_start(void) | 83 | void __delayacct_blkio_start(void) |
@@ -104,6 +105,7 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk) | |||
104 | s64 tmp; | 105 | s64 tmp; |
105 | struct timespec ts; | 106 | struct timespec ts; |
106 | unsigned long t1,t2,t3; | 107 | unsigned long t1,t2,t3; |
108 | unsigned long flags; | ||
107 | 109 | ||
108 | /* Though tsk->delays accessed later, early exit avoids | 110 | /* Though tsk->delays accessed later, early exit avoids |
109 | * unnecessary returning of other data | 111 | * unnecessary returning of other data |
@@ -136,14 +138,14 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk) | |||
136 | 138 | ||
137 | /* zero XXX_total, non-zero XXX_count implies XXX stat overflowed */ | 139 | /* zero XXX_total, non-zero XXX_count implies XXX stat overflowed */ |
138 | 140 | ||
139 | spin_lock(&tsk->delays->lock); | 141 | spin_lock_irqsave(&tsk->delays->lock, flags); |
140 | tmp = d->blkio_delay_total + tsk->delays->blkio_delay; | 142 | tmp = d->blkio_delay_total + tsk->delays->blkio_delay; |
141 | d->blkio_delay_total = (tmp < d->blkio_delay_total) ? 0 : tmp; | 143 | d->blkio_delay_total = (tmp < d->blkio_delay_total) ? 0 : tmp; |
142 | tmp = d->swapin_delay_total + tsk->delays->swapin_delay; | 144 | tmp = d->swapin_delay_total + tsk->delays->swapin_delay; |
143 | d->swapin_delay_total = (tmp < d->swapin_delay_total) ? 0 : tmp; | 145 | d->swapin_delay_total = (tmp < d->swapin_delay_total) ? 0 : tmp; |
144 | d->blkio_count += tsk->delays->blkio_count; | 146 | d->blkio_count += tsk->delays->blkio_count; |
145 | d->swapin_count += tsk->delays->swapin_count; | 147 | d->swapin_count += tsk->delays->swapin_count; |
146 | spin_unlock(&tsk->delays->lock); | 148 | spin_unlock_irqrestore(&tsk->delays->lock, flags); |
147 | 149 | ||
148 | done: | 150 | done: |
149 | return 0; | 151 | return 0; |
@@ -152,11 +154,12 @@ done: | |||
152 | __u64 __delayacct_blkio_ticks(struct task_struct *tsk) | 154 | __u64 __delayacct_blkio_ticks(struct task_struct *tsk) |
153 | { | 155 | { |
154 | __u64 ret; | 156 | __u64 ret; |
157 | unsigned long flags; | ||
155 | 158 | ||
156 | spin_lock(&tsk->delays->lock); | 159 | spin_lock_irqsave(&tsk->delays->lock, flags); |
157 | ret = nsec_to_clock_t(tsk->delays->blkio_delay + | 160 | ret = nsec_to_clock_t(tsk->delays->blkio_delay + |
158 | tsk->delays->swapin_delay); | 161 | tsk->delays->swapin_delay); |
159 | spin_unlock(&tsk->delays->lock); | 162 | spin_unlock_irqrestore(&tsk->delays->lock, flags); |
160 | return ret; | 163 | return ret; |
161 | } | 164 | } |
162 | 165 | ||
diff --git a/kernel/exit.c b/kernel/exit.c index f250a5e3e281..06de6c4e8ca3 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -128,6 +128,7 @@ static void __exit_signal(struct task_struct *tsk) | |||
128 | flush_sigqueue(&tsk->pending); | 128 | flush_sigqueue(&tsk->pending); |
129 | if (sig) { | 129 | if (sig) { |
130 | flush_sigqueue(&sig->shared_pending); | 130 | flush_sigqueue(&sig->shared_pending); |
131 | taskstats_tgid_free(sig); | ||
131 | __cleanup_signal(sig); | 132 | __cleanup_signal(sig); |
132 | } | 133 | } |
133 | } | 134 | } |
diff --git a/kernel/fork.c b/kernel/fork.c index 29ebb30850ed..8cdd3e72ba55 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -830,7 +830,7 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts | |||
830 | if (clone_flags & CLONE_THREAD) { | 830 | if (clone_flags & CLONE_THREAD) { |
831 | atomic_inc(¤t->signal->count); | 831 | atomic_inc(¤t->signal->count); |
832 | atomic_inc(¤t->signal->live); | 832 | atomic_inc(¤t->signal->live); |
833 | taskstats_tgid_alloc(current->signal); | 833 | taskstats_tgid_alloc(current); |
834 | return 0; | 834 | return 0; |
835 | } | 835 | } |
836 | sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); | 836 | sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); |
@@ -897,7 +897,6 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts | |||
897 | void __cleanup_signal(struct signal_struct *sig) | 897 | void __cleanup_signal(struct signal_struct *sig) |
898 | { | 898 | { |
899 | exit_thread_group_keys(sig); | 899 | exit_thread_group_keys(sig); |
900 | taskstats_tgid_free(sig); | ||
901 | kmem_cache_free(signal_cachep, sig); | 900 | kmem_cache_free(signal_cachep, sig); |
902 | } | 901 | } |
903 | 902 | ||
@@ -1316,9 +1315,8 @@ struct task_struct * __devinit fork_idle(int cpu) | |||
1316 | struct pt_regs regs; | 1315 | struct pt_regs regs; |
1317 | 1316 | ||
1318 | task = copy_process(CLONE_VM, 0, idle_regs(®s), 0, NULL, NULL, 0); | 1317 | task = copy_process(CLONE_VM, 0, idle_regs(®s), 0, NULL, NULL, 0); |
1319 | if (!task) | 1318 | if (!IS_ERR(task)) |
1320 | return ERR_PTR(-ENOMEM); | 1319 | init_idle(task, cpu); |
1321 | init_idle(task, cpu); | ||
1322 | 1320 | ||
1323 | return task; | 1321 | return task; |
1324 | } | 1322 | } |
diff --git a/kernel/futex.c b/kernel/futex.c index b364e0026191..93ef30ba209f 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
@@ -1507,6 +1507,13 @@ static int futex_fd(u32 __user *uaddr, int signal) | |||
1507 | struct futex_q *q; | 1507 | struct futex_q *q; |
1508 | struct file *filp; | 1508 | struct file *filp; |
1509 | int ret, err; | 1509 | int ret, err; |
1510 | static unsigned long printk_interval; | ||
1511 | |||
1512 | if (printk_timed_ratelimit(&printk_interval, 60 * 60 * 1000)) { | ||
1513 | printk(KERN_WARNING "Process `%s' used FUTEX_FD, which " | ||
1514 | "will be removed from the kernel in June 2007\n", | ||
1515 | current->comm); | ||
1516 | } | ||
1510 | 1517 | ||
1511 | ret = -EINVAL; | 1518 | ret = -EINVAL; |
1512 | if (!valid_signal(signal)) | 1519 | if (!valid_signal(signal)) |
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 2d0dc3efe813..ebfd24a41858 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -233,6 +233,8 @@ void irq_chip_set_defaults(struct irq_chip *chip) | |||
233 | chip->shutdown = chip->disable; | 233 | chip->shutdown = chip->disable; |
234 | if (!chip->name) | 234 | if (!chip->name) |
235 | chip->name = chip->typename; | 235 | chip->name = chip->typename; |
236 | if (!chip->end) | ||
237 | chip->end = dummy_irq_chip.end; | ||
236 | } | 238 | } |
237 | 239 | ||
238 | static inline void mask_ack_irq(struct irq_desc *desc, int irq) | 240 | static inline void mask_ack_irq(struct irq_desc *desc, int irq) |
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 42aa6f1a3f0f..a681912bc89a 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c | |||
@@ -231,10 +231,10 @@ fastcall unsigned int __do_IRQ(unsigned int irq) | |||
231 | spin_unlock(&desc->lock); | 231 | spin_unlock(&desc->lock); |
232 | 232 | ||
233 | action_ret = handle_IRQ_event(irq, action); | 233 | action_ret = handle_IRQ_event(irq, action); |
234 | |||
235 | spin_lock(&desc->lock); | ||
236 | if (!noirqdebug) | 234 | if (!noirqdebug) |
237 | note_interrupt(irq, desc, action_ret); | 235 | note_interrupt(irq, desc, action_ret); |
236 | |||
237 | spin_lock(&desc->lock); | ||
238 | if (likely(!(desc->status & IRQ_PENDING))) | 238 | if (likely(!(desc->status & IRQ_PENDING))) |
239 | break; | 239 | break; |
240 | desc->status &= ~IRQ_PENDING; | 240 | desc->status &= ~IRQ_PENDING; |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 6879202afe9a..b385878c6e80 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -216,6 +216,7 @@ int setup_irq(unsigned int irq, struct irqaction *new) | |||
216 | { | 216 | { |
217 | struct irq_desc *desc = irq_desc + irq; | 217 | struct irq_desc *desc = irq_desc + irq; |
218 | struct irqaction *old, **p; | 218 | struct irqaction *old, **p; |
219 | const char *old_name = NULL; | ||
219 | unsigned long flags; | 220 | unsigned long flags; |
220 | int shared = 0; | 221 | int shared = 0; |
221 | 222 | ||
@@ -255,8 +256,10 @@ int setup_irq(unsigned int irq, struct irqaction *new) | |||
255 | * set the trigger type must match. | 256 | * set the trigger type must match. |
256 | */ | 257 | */ |
257 | if (!((old->flags & new->flags) & IRQF_SHARED) || | 258 | if (!((old->flags & new->flags) & IRQF_SHARED) || |
258 | ((old->flags ^ new->flags) & IRQF_TRIGGER_MASK)) | 259 | ((old->flags ^ new->flags) & IRQF_TRIGGER_MASK)) { |
260 | old_name = old->name; | ||
259 | goto mismatch; | 261 | goto mismatch; |
262 | } | ||
260 | 263 | ||
261 | #if defined(CONFIG_IRQ_PER_CPU) | 264 | #if defined(CONFIG_IRQ_PER_CPU) |
262 | /* All handlers must agree on per-cpuness */ | 265 | /* All handlers must agree on per-cpuness */ |
@@ -322,11 +325,13 @@ int setup_irq(unsigned int irq, struct irqaction *new) | |||
322 | return 0; | 325 | return 0; |
323 | 326 | ||
324 | mismatch: | 327 | mismatch: |
325 | spin_unlock_irqrestore(&desc->lock, flags); | ||
326 | if (!(new->flags & IRQF_PROBE_SHARED)) { | 328 | if (!(new->flags & IRQF_PROBE_SHARED)) { |
327 | printk(KERN_ERR "IRQ handler type mismatch for IRQ %d\n", irq); | 329 | printk(KERN_ERR "IRQ handler type mismatch for IRQ %d\n", irq); |
330 | if (old_name) | ||
331 | printk(KERN_ERR "current handler: %s\n", old_name); | ||
328 | dump_stack(); | 332 | dump_stack(); |
329 | } | 333 | } |
334 | spin_unlock_irqrestore(&desc->lock, flags); | ||
330 | return -EBUSY; | 335 | return -EBUSY; |
331 | } | 336 | } |
332 | 337 | ||
diff --git a/kernel/kmod.c b/kernel/kmod.c index bb4e29d924e4..2b76dee28496 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c | |||
@@ -307,14 +307,14 @@ int call_usermodehelper_pipe(char *path, char **argv, char **envp, | |||
307 | return 0; | 307 | return 0; |
308 | 308 | ||
309 | f = create_write_pipe(); | 309 | f = create_write_pipe(); |
310 | if (!f) | 310 | if (IS_ERR(f)) |
311 | return -ENOMEM; | 311 | return PTR_ERR(f); |
312 | *filp = f; | 312 | *filp = f; |
313 | 313 | ||
314 | f = create_read_pipe(f); | 314 | f = create_read_pipe(f); |
315 | if (!f) { | 315 | if (IS_ERR(f)) { |
316 | free_write_pipe(*filp); | 316 | free_write_pipe(*filp); |
317 | return -ENOMEM; | 317 | return PTR_ERR(f); |
318 | } | 318 | } |
319 | sub_info.stdin = f; | 319 | sub_info.stdin = f; |
320 | 320 | ||
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index b739be2a6dc9..c9fefdb1a7db 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
@@ -1081,7 +1081,8 @@ static int static_obj(void *obj) | |||
1081 | */ | 1081 | */ |
1082 | for_each_possible_cpu(i) { | 1082 | for_each_possible_cpu(i) { |
1083 | start = (unsigned long) &__per_cpu_start + per_cpu_offset(i); | 1083 | start = (unsigned long) &__per_cpu_start + per_cpu_offset(i); |
1084 | end = (unsigned long) &__per_cpu_end + per_cpu_offset(i); | 1084 | end = (unsigned long) &__per_cpu_start + PERCPU_ENOUGH_ROOM |
1085 | + per_cpu_offset(i); | ||
1085 | 1086 | ||
1086 | if ((addr >= start) && (addr < end)) | 1087 | if ((addr >= start) && (addr < end)) |
1087 | return 1; | 1088 | return 1; |
diff --git a/kernel/module.c b/kernel/module.c index 67009bd56c52..f0166563c602 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -1342,7 +1342,7 @@ static void set_license(struct module *mod, const char *license) | |||
1342 | 1342 | ||
1343 | if (!license_is_gpl_compatible(license)) { | 1343 | if (!license_is_gpl_compatible(license)) { |
1344 | if (!(tainted & TAINT_PROPRIETARY_MODULE)) | 1344 | if (!(tainted & TAINT_PROPRIETARY_MODULE)) |
1345 | printk(KERN_WARNING "%s: module license '%s' taints" | 1345 | printk(KERN_WARNING "%s: module license '%s' taints " |
1346 | "kernel.\n", mod->name, license); | 1346 | "kernel.\n", mod->name, license); |
1347 | add_taint_module(mod, TAINT_PROPRIETARY_MODULE); | 1347 | add_taint_module(mod, TAINT_PROPRIETARY_MODULE); |
1348 | } | 1348 | } |
@@ -1718,7 +1718,7 @@ static struct module *load_module(void __user *umod, | |||
1718 | set_license(mod, get_modinfo(sechdrs, infoindex, "license")); | 1718 | set_license(mod, get_modinfo(sechdrs, infoindex, "license")); |
1719 | 1719 | ||
1720 | if (strcmp(mod->name, "ndiswrapper") == 0) | 1720 | if (strcmp(mod->name, "ndiswrapper") == 0) |
1721 | add_taint_module(mod, TAINT_PROPRIETARY_MODULE); | 1721 | add_taint(TAINT_PROPRIETARY_MODULE); |
1722 | if (strcmp(mod->name, "driverloader") == 0) | 1722 | if (strcmp(mod->name, "driverloader") == 0) |
1723 | add_taint_module(mod, TAINT_PROPRIETARY_MODULE); | 1723 | add_taint_module(mod, TAINT_PROPRIETARY_MODULE); |
1724 | 1724 | ||
diff --git a/kernel/power/disk.c b/kernel/power/disk.c index d3a158a60312..b1fb7866b0b3 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c | |||
@@ -71,7 +71,7 @@ static inline void platform_finish(void) | |||
71 | 71 | ||
72 | static int prepare_processes(void) | 72 | static int prepare_processes(void) |
73 | { | 73 | { |
74 | int error; | 74 | int error = 0; |
75 | 75 | ||
76 | pm_prepare_console(); | 76 | pm_prepare_console(); |
77 | 77 | ||
@@ -84,6 +84,12 @@ static int prepare_processes(void) | |||
84 | goto thaw; | 84 | goto thaw; |
85 | } | 85 | } |
86 | 86 | ||
87 | if (pm_disk_mode == PM_DISK_TESTPROC) { | ||
88 | printk("swsusp debug: Waiting for 5 seconds.\n"); | ||
89 | mdelay(5000); | ||
90 | goto thaw; | ||
91 | } | ||
92 | |||
87 | /* Free memory before shutting down devices. */ | 93 | /* Free memory before shutting down devices. */ |
88 | if (!(error = swsusp_shrink_memory())) | 94 | if (!(error = swsusp_shrink_memory())) |
89 | return 0; | 95 | return 0; |
@@ -120,13 +126,21 @@ int pm_suspend_disk(void) | |||
120 | if (error) | 126 | if (error) |
121 | return error; | 127 | return error; |
122 | 128 | ||
129 | if (pm_disk_mode == PM_DISK_TESTPROC) | ||
130 | goto Thaw; | ||
131 | |||
123 | suspend_console(); | 132 | suspend_console(); |
124 | error = device_suspend(PMSG_FREEZE); | 133 | error = device_suspend(PMSG_FREEZE); |
125 | if (error) { | 134 | if (error) { |
126 | resume_console(); | 135 | resume_console(); |
127 | printk("Some devices failed to suspend\n"); | 136 | printk("Some devices failed to suspend\n"); |
128 | unprepare_processes(); | 137 | goto Thaw; |
129 | return error; | 138 | } |
139 | |||
140 | if (pm_disk_mode == PM_DISK_TEST) { | ||
141 | printk("swsusp debug: Waiting for 5 seconds.\n"); | ||
142 | mdelay(5000); | ||
143 | goto Done; | ||
130 | } | 144 | } |
131 | 145 | ||
132 | pr_debug("PM: snapshotting memory.\n"); | 146 | pr_debug("PM: snapshotting memory.\n"); |
@@ -143,16 +157,17 @@ int pm_suspend_disk(void) | |||
143 | power_down(pm_disk_mode); | 157 | power_down(pm_disk_mode); |
144 | else { | 158 | else { |
145 | swsusp_free(); | 159 | swsusp_free(); |
146 | unprepare_processes(); | 160 | goto Thaw; |
147 | return error; | ||
148 | } | 161 | } |
149 | } else | 162 | } else { |
150 | pr_debug("PM: Image restored successfully.\n"); | 163 | pr_debug("PM: Image restored successfully.\n"); |
164 | } | ||
151 | 165 | ||
152 | swsusp_free(); | 166 | swsusp_free(); |
153 | Done: | 167 | Done: |
154 | device_resume(); | 168 | device_resume(); |
155 | resume_console(); | 169 | resume_console(); |
170 | Thaw: | ||
156 | unprepare_processes(); | 171 | unprepare_processes(); |
157 | return error; | 172 | return error; |
158 | } | 173 | } |
@@ -249,6 +264,8 @@ static const char * const pm_disk_modes[] = { | |||
249 | [PM_DISK_PLATFORM] = "platform", | 264 | [PM_DISK_PLATFORM] = "platform", |
250 | [PM_DISK_SHUTDOWN] = "shutdown", | 265 | [PM_DISK_SHUTDOWN] = "shutdown", |
251 | [PM_DISK_REBOOT] = "reboot", | 266 | [PM_DISK_REBOOT] = "reboot", |
267 | [PM_DISK_TEST] = "test", | ||
268 | [PM_DISK_TESTPROC] = "testproc", | ||
252 | }; | 269 | }; |
253 | 270 | ||
254 | /** | 271 | /** |
@@ -303,17 +320,19 @@ static ssize_t disk_store(struct subsystem * s, const char * buf, size_t n) | |||
303 | } | 320 | } |
304 | } | 321 | } |
305 | if (mode) { | 322 | if (mode) { |
306 | if (mode == PM_DISK_SHUTDOWN || mode == PM_DISK_REBOOT) | 323 | if (mode == PM_DISK_SHUTDOWN || mode == PM_DISK_REBOOT || |
324 | mode == PM_DISK_TEST || mode == PM_DISK_TESTPROC) { | ||
307 | pm_disk_mode = mode; | 325 | pm_disk_mode = mode; |
308 | else { | 326 | } else { |
309 | if (pm_ops && pm_ops->enter && | 327 | if (pm_ops && pm_ops->enter && |
310 | (mode == pm_ops->pm_disk_mode)) | 328 | (mode == pm_ops->pm_disk_mode)) |
311 | pm_disk_mode = mode; | 329 | pm_disk_mode = mode; |
312 | else | 330 | else |
313 | error = -EINVAL; | 331 | error = -EINVAL; |
314 | } | 332 | } |
315 | } else | 333 | } else { |
316 | error = -EINVAL; | 334 | error = -EINVAL; |
335 | } | ||
317 | 336 | ||
318 | pr_debug("PM: suspend-to-disk mode set to '%s'\n", | 337 | pr_debug("PM: suspend-to-disk mode set to '%s'\n", |
319 | pm_disk_modes[mode]); | 338 | pm_disk_modes[mode]); |
diff --git a/kernel/printk.c b/kernel/printk.c index f7d427ef5038..66426552fbfe 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/security.h> | 31 | #include <linux/security.h> |
32 | #include <linux/bootmem.h> | 32 | #include <linux/bootmem.h> |
33 | #include <linux/syscalls.h> | 33 | #include <linux/syscalls.h> |
34 | #include <linux/jiffies.h> | ||
34 | 35 | ||
35 | #include <asm/uaccess.h> | 36 | #include <asm/uaccess.h> |
36 | 37 | ||
@@ -1101,3 +1102,23 @@ int printk_ratelimit(void) | |||
1101 | printk_ratelimit_burst); | 1102 | printk_ratelimit_burst); |
1102 | } | 1103 | } |
1103 | EXPORT_SYMBOL(printk_ratelimit); | 1104 | EXPORT_SYMBOL(printk_ratelimit); |
1105 | |||
1106 | /** | ||
1107 | * printk_timed_ratelimit - caller-controlled printk ratelimiting | ||
1108 | * @caller_jiffies: pointer to caller's state | ||
1109 | * @interval_msecs: minimum interval between prints | ||
1110 | * | ||
1111 | * printk_timed_ratelimit() returns true if more than @interval_msecs | ||
1112 | * milliseconds have elapsed since the last time printk_timed_ratelimit() | ||
1113 | * returned true. | ||
1114 | */ | ||
1115 | bool printk_timed_ratelimit(unsigned long *caller_jiffies, | ||
1116 | unsigned int interval_msecs) | ||
1117 | { | ||
1118 | if (*caller_jiffies == 0 || time_after(jiffies, *caller_jiffies)) { | ||
1119 | *caller_jiffies = jiffies + msecs_to_jiffies(interval_msecs); | ||
1120 | return true; | ||
1121 | } | ||
1122 | return false; | ||
1123 | } | ||
1124 | EXPORT_SYMBOL(printk_timed_ratelimit); | ||
diff --git a/kernel/signal.c b/kernel/signal.c index 7ed8d5304bec..df18c167a2a7 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -267,18 +267,25 @@ static struct sigqueue *__sigqueue_alloc(struct task_struct *t, gfp_t flags, | |||
267 | int override_rlimit) | 267 | int override_rlimit) |
268 | { | 268 | { |
269 | struct sigqueue *q = NULL; | 269 | struct sigqueue *q = NULL; |
270 | struct user_struct *user; | ||
270 | 271 | ||
271 | atomic_inc(&t->user->sigpending); | 272 | /* |
273 | * In order to avoid problems with "switch_user()", we want to make | ||
274 | * sure that the compiler doesn't re-load "t->user" | ||
275 | */ | ||
276 | user = t->user; | ||
277 | barrier(); | ||
278 | atomic_inc(&user->sigpending); | ||
272 | if (override_rlimit || | 279 | if (override_rlimit || |
273 | atomic_read(&t->user->sigpending) <= | 280 | atomic_read(&user->sigpending) <= |
274 | t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur) | 281 | t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur) |
275 | q = kmem_cache_alloc(sigqueue_cachep, flags); | 282 | q = kmem_cache_alloc(sigqueue_cachep, flags); |
276 | if (unlikely(q == NULL)) { | 283 | if (unlikely(q == NULL)) { |
277 | atomic_dec(&t->user->sigpending); | 284 | atomic_dec(&user->sigpending); |
278 | } else { | 285 | } else { |
279 | INIT_LIST_HEAD(&q->list); | 286 | INIT_LIST_HEAD(&q->list); |
280 | q->flags = 0; | 287 | q->flags = 0; |
281 | q->user = get_uid(t->user); | 288 | q->user = get_uid(user); |
282 | } | 289 | } |
283 | return(q); | 290 | return(q); |
284 | } | 291 | } |
diff --git a/kernel/spinlock.c b/kernel/spinlock.c index 476c3741511b..2c6c2bf85514 100644 --- a/kernel/spinlock.c +++ b/kernel/spinlock.c | |||
@@ -293,6 +293,27 @@ void __lockfunc _spin_lock_nested(spinlock_t *lock, int subclass) | |||
293 | } | 293 | } |
294 | 294 | ||
295 | EXPORT_SYMBOL(_spin_lock_nested); | 295 | EXPORT_SYMBOL(_spin_lock_nested); |
296 | unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass) | ||
297 | { | ||
298 | unsigned long flags; | ||
299 | |||
300 | local_irq_save(flags); | ||
301 | preempt_disable(); | ||
302 | spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); | ||
303 | /* | ||
304 | * On lockdep we dont want the hand-coded irq-enable of | ||
305 | * _raw_spin_lock_flags() code, because lockdep assumes | ||
306 | * that interrupts are not re-enabled during lock-acquire: | ||
307 | */ | ||
308 | #ifdef CONFIG_PROVE_SPIN_LOCKING | ||
309 | _raw_spin_lock(lock); | ||
310 | #else | ||
311 | _raw_spin_lock_flags(lock, &flags); | ||
312 | #endif | ||
313 | return flags; | ||
314 | } | ||
315 | |||
316 | EXPORT_SYMBOL(_spin_lock_irqsave_nested); | ||
296 | 317 | ||
297 | #endif | 318 | #endif |
298 | 319 | ||
diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c index 0e53314b14de..d7306d0f3dfc 100644 --- a/kernel/sys_ni.c +++ b/kernel/sys_ni.c | |||
@@ -135,6 +135,7 @@ cond_syscall(sys_madvise); | |||
135 | cond_syscall(sys_mremap); | 135 | cond_syscall(sys_mremap); |
136 | cond_syscall(sys_remap_file_pages); | 136 | cond_syscall(sys_remap_file_pages); |
137 | cond_syscall(compat_sys_move_pages); | 137 | cond_syscall(compat_sys_move_pages); |
138 | cond_syscall(compat_sys_migrate_pages); | ||
138 | 139 | ||
139 | /* block-layer dependent */ | 140 | /* block-layer dependent */ |
140 | cond_syscall(sys_bdflush); | 141 | cond_syscall(sys_bdflush); |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 8bff2c18fb5a..09e569f4792b 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -1315,7 +1315,9 @@ repeat: | |||
1315 | return -ENOTDIR; | 1315 | return -ENOTDIR; |
1316 | if (get_user(n, name)) | 1316 | if (get_user(n, name)) |
1317 | return -EFAULT; | 1317 | return -EFAULT; |
1318 | for ( ; table->ctl_name; table++) { | 1318 | for ( ; table->ctl_name || table->procname; table++) { |
1319 | if (!table->ctl_name) | ||
1320 | continue; | ||
1319 | if (n == table->ctl_name || table->ctl_name == CTL_ANY) { | 1321 | if (n == table->ctl_name || table->ctl_name == CTL_ANY) { |
1320 | int error; | 1322 | int error; |
1321 | if (table->child) { | 1323 | if (table->child) { |
@@ -1532,7 +1534,7 @@ static void register_proc_table(ctl_table * table, struct proc_dir_entry *root, | |||
1532 | int len; | 1534 | int len; |
1533 | mode_t mode; | 1535 | mode_t mode; |
1534 | 1536 | ||
1535 | for (; table->ctl_name; table++) { | 1537 | for (; table->ctl_name || table->procname; table++) { |
1536 | /* Can't do anything without a proc name. */ | 1538 | /* Can't do anything without a proc name. */ |
1537 | if (!table->procname) | 1539 | if (!table->procname) |
1538 | continue; | 1540 | continue; |
@@ -1579,7 +1581,7 @@ static void register_proc_table(ctl_table * table, struct proc_dir_entry *root, | |||
1579 | static void unregister_proc_table(ctl_table * table, struct proc_dir_entry *root) | 1581 | static void unregister_proc_table(ctl_table * table, struct proc_dir_entry *root) |
1580 | { | 1582 | { |
1581 | struct proc_dir_entry *de; | 1583 | struct proc_dir_entry *de; |
1582 | for (; table->ctl_name; table++) { | 1584 | for (; table->ctl_name || table->procname; table++) { |
1583 | if (!(de = table->de)) | 1585 | if (!(de = table->de)) |
1584 | continue; | 1586 | continue; |
1585 | if (de->mode & S_IFDIR) { | 1587 | if (de->mode & S_IFDIR) { |
@@ -2680,13 +2682,33 @@ int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen, | |||
2680 | asmlinkage long sys_sysctl(struct __sysctl_args __user *args) | 2682 | asmlinkage long sys_sysctl(struct __sysctl_args __user *args) |
2681 | { | 2683 | { |
2682 | static int msg_count; | 2684 | static int msg_count; |
2685 | struct __sysctl_args tmp; | ||
2686 | int name[CTL_MAXNAME]; | ||
2687 | int i; | ||
2688 | |||
2689 | /* Read in the sysctl name for better debug message logging */ | ||
2690 | if (copy_from_user(&tmp, args, sizeof(tmp))) | ||
2691 | return -EFAULT; | ||
2692 | if (tmp.nlen <= 0 || tmp.nlen >= CTL_MAXNAME) | ||
2693 | return -ENOTDIR; | ||
2694 | for (i = 0; i < tmp.nlen; i++) | ||
2695 | if (get_user(name[i], tmp.name + i)) | ||
2696 | return -EFAULT; | ||
2697 | |||
2698 | /* Ignore accesses to kernel.version */ | ||
2699 | if ((tmp.nlen == 2) && (name[0] == CTL_KERN) && (name[1] == KERN_VERSION)) | ||
2700 | goto out; | ||
2683 | 2701 | ||
2684 | if (msg_count < 5) { | 2702 | if (msg_count < 5) { |
2685 | msg_count++; | 2703 | msg_count++; |
2686 | printk(KERN_INFO | 2704 | printk(KERN_INFO |
2687 | "warning: process `%s' used the removed sysctl " | 2705 | "warning: process `%s' used the removed sysctl " |
2688 | "system call\n", current->comm); | 2706 | "system call with ", current->comm); |
2707 | for (i = 0; i < tmp.nlen; i++) | ||
2708 | printk("%d.", name[i]); | ||
2709 | printk("\n"); | ||
2689 | } | 2710 | } |
2711 | out: | ||
2690 | return -ENOSYS; | 2712 | return -ENOSYS; |
2691 | } | 2713 | } |
2692 | 2714 | ||
diff --git a/kernel/taskstats.c b/kernel/taskstats.c index 5d6a8c54ee85..f45c5e70773c 100644 --- a/kernel/taskstats.c +++ b/kernel/taskstats.c | |||
@@ -77,7 +77,8 @@ static int prepare_reply(struct genl_info *info, u8 cmd, struct sk_buff **skbp, | |||
77 | /* | 77 | /* |
78 | * If new attributes are added, please revisit this allocation | 78 | * If new attributes are added, please revisit this allocation |
79 | */ | 79 | */ |
80 | skb = nlmsg_new(genlmsg_total_size(size), GFP_KERNEL); | 80 | size = nlmsg_total_size(genlmsg_total_size(size)); |
81 | skb = nlmsg_new(size, GFP_KERNEL); | ||
81 | if (!skb) | 82 | if (!skb) |
82 | return -ENOMEM; | 83 | return -ENOMEM; |
83 | 84 | ||
@@ -174,21 +175,19 @@ static void send_cpu_listeners(struct sk_buff *skb, unsigned int cpu) | |||
174 | up_write(&listeners->sem); | 175 | up_write(&listeners->sem); |
175 | } | 176 | } |
176 | 177 | ||
177 | static int fill_pid(pid_t pid, struct task_struct *pidtsk, | 178 | static int fill_pid(pid_t pid, struct task_struct *tsk, |
178 | struct taskstats *stats) | 179 | struct taskstats *stats) |
179 | { | 180 | { |
180 | int rc = 0; | 181 | int rc = 0; |
181 | struct task_struct *tsk = pidtsk; | ||
182 | 182 | ||
183 | if (!pidtsk) { | 183 | if (!tsk) { |
184 | read_lock(&tasklist_lock); | 184 | rcu_read_lock(); |
185 | tsk = find_task_by_pid(pid); | 185 | tsk = find_task_by_pid(pid); |
186 | if (!tsk) { | 186 | if (tsk) |
187 | read_unlock(&tasklist_lock); | 187 | get_task_struct(tsk); |
188 | rcu_read_unlock(); | ||
189 | if (!tsk) | ||
188 | return -ESRCH; | 190 | return -ESRCH; |
189 | } | ||
190 | get_task_struct(tsk); | ||
191 | read_unlock(&tasklist_lock); | ||
192 | } else | 191 | } else |
193 | get_task_struct(tsk); | 192 | get_task_struct(tsk); |
194 | 193 | ||
@@ -214,39 +213,30 @@ static int fill_pid(pid_t pid, struct task_struct *pidtsk, | |||
214 | 213 | ||
215 | } | 214 | } |
216 | 215 | ||
217 | static int fill_tgid(pid_t tgid, struct task_struct *tgidtsk, | 216 | static int fill_tgid(pid_t tgid, struct task_struct *first, |
218 | struct taskstats *stats) | 217 | struct taskstats *stats) |
219 | { | 218 | { |
220 | struct task_struct *tsk, *first; | 219 | struct task_struct *tsk; |
221 | unsigned long flags; | 220 | unsigned long flags; |
221 | int rc = -ESRCH; | ||
222 | 222 | ||
223 | /* | 223 | /* |
224 | * Add additional stats from live tasks except zombie thread group | 224 | * Add additional stats from live tasks except zombie thread group |
225 | * leaders who are already counted with the dead tasks | 225 | * leaders who are already counted with the dead tasks |
226 | */ | 226 | */ |
227 | first = tgidtsk; | 227 | rcu_read_lock(); |
228 | if (!first) { | 228 | if (!first) |
229 | read_lock(&tasklist_lock); | ||
230 | first = find_task_by_pid(tgid); | 229 | first = find_task_by_pid(tgid); |
231 | if (!first) { | ||
232 | read_unlock(&tasklist_lock); | ||
233 | return -ESRCH; | ||
234 | } | ||
235 | get_task_struct(first); | ||
236 | read_unlock(&tasklist_lock); | ||
237 | } else | ||
238 | get_task_struct(first); | ||
239 | 230 | ||
240 | /* Start with stats from dead tasks */ | 231 | if (!first || !lock_task_sighand(first, &flags)) |
241 | spin_lock_irqsave(&first->signal->stats_lock, flags); | 232 | goto out; |
233 | |||
242 | if (first->signal->stats) | 234 | if (first->signal->stats) |
243 | memcpy(stats, first->signal->stats, sizeof(*stats)); | 235 | memcpy(stats, first->signal->stats, sizeof(*stats)); |
244 | spin_unlock_irqrestore(&first->signal->stats_lock, flags); | ||
245 | 236 | ||
246 | tsk = first; | 237 | tsk = first; |
247 | read_lock(&tasklist_lock); | ||
248 | do { | 238 | do { |
249 | if (tsk->exit_state == EXIT_ZOMBIE && thread_group_leader(tsk)) | 239 | if (tsk->exit_state) |
250 | continue; | 240 | continue; |
251 | /* | 241 | /* |
252 | * Accounting subsystem can call its functions here to | 242 | * Accounting subsystem can call its functions here to |
@@ -257,15 +247,18 @@ static int fill_tgid(pid_t tgid, struct task_struct *tgidtsk, | |||
257 | delayacct_add_tsk(stats, tsk); | 247 | delayacct_add_tsk(stats, tsk); |
258 | 248 | ||
259 | } while_each_thread(first, tsk); | 249 | } while_each_thread(first, tsk); |
260 | read_unlock(&tasklist_lock); | ||
261 | stats->version = TASKSTATS_VERSION; | ||
262 | 250 | ||
251 | unlock_task_sighand(first, &flags); | ||
252 | rc = 0; | ||
253 | out: | ||
254 | rcu_read_unlock(); | ||
255 | |||
256 | stats->version = TASKSTATS_VERSION; | ||
263 | /* | 257 | /* |
264 | * Accounting subsytems can also add calls here to modify | 258 | * Accounting subsytems can also add calls here to modify |
265 | * fields of taskstats. | 259 | * fields of taskstats. |
266 | */ | 260 | */ |
267 | 261 | return rc; | |
268 | return 0; | ||
269 | } | 262 | } |
270 | 263 | ||
271 | 264 | ||
@@ -273,7 +266,7 @@ static void fill_tgid_exit(struct task_struct *tsk) | |||
273 | { | 266 | { |
274 | unsigned long flags; | 267 | unsigned long flags; |
275 | 268 | ||
276 | spin_lock_irqsave(&tsk->signal->stats_lock, flags); | 269 | spin_lock_irqsave(&tsk->sighand->siglock, flags); |
277 | if (!tsk->signal->stats) | 270 | if (!tsk->signal->stats) |
278 | goto ret; | 271 | goto ret; |
279 | 272 | ||
@@ -285,7 +278,7 @@ static void fill_tgid_exit(struct task_struct *tsk) | |||
285 | */ | 278 | */ |
286 | delayacct_add_tsk(tsk->signal->stats, tsk); | 279 | delayacct_add_tsk(tsk->signal->stats, tsk); |
287 | ret: | 280 | ret: |
288 | spin_unlock_irqrestore(&tsk->signal->stats_lock, flags); | 281 | spin_unlock_irqrestore(&tsk->sighand->siglock, flags); |
289 | return; | 282 | return; |
290 | } | 283 | } |
291 | 284 | ||
@@ -419,7 +412,7 @@ static int taskstats_user_cmd(struct sk_buff *skb, struct genl_info *info) | |||
419 | return send_reply(rep_skb, info->snd_pid); | 412 | return send_reply(rep_skb, info->snd_pid); |
420 | 413 | ||
421 | nla_put_failure: | 414 | nla_put_failure: |
422 | return genlmsg_cancel(rep_skb, reply); | 415 | rc = genlmsg_cancel(rep_skb, reply); |
423 | err: | 416 | err: |
424 | nlmsg_free(rep_skb); | 417 | nlmsg_free(rep_skb); |
425 | return rc; | 418 | return rc; |
@@ -461,24 +454,26 @@ void taskstats_exit_send(struct task_struct *tsk, struct taskstats *tidstats, | |||
461 | size_t size; | 454 | size_t size; |
462 | int is_thread_group; | 455 | int is_thread_group; |
463 | struct nlattr *na; | 456 | struct nlattr *na; |
464 | unsigned long flags; | ||
465 | 457 | ||
466 | if (!family_registered || !tidstats) | 458 | if (!family_registered) |
467 | return; | 459 | return; |
468 | 460 | ||
469 | spin_lock_irqsave(&tsk->signal->stats_lock, flags); | ||
470 | is_thread_group = tsk->signal->stats ? 1 : 0; | ||
471 | spin_unlock_irqrestore(&tsk->signal->stats_lock, flags); | ||
472 | |||
473 | rc = 0; | ||
474 | /* | 461 | /* |
475 | * Size includes space for nested attributes | 462 | * Size includes space for nested attributes |
476 | */ | 463 | */ |
477 | size = nla_total_size(sizeof(u32)) + | 464 | size = nla_total_size(sizeof(u32)) + |
478 | nla_total_size(sizeof(struct taskstats)) + nla_total_size(0); | 465 | nla_total_size(sizeof(struct taskstats)) + nla_total_size(0); |
479 | 466 | ||
480 | if (is_thread_group) | 467 | is_thread_group = (tsk->signal->stats != NULL); |
481 | size = 2 * size; /* PID + STATS + TGID + STATS */ | 468 | if (is_thread_group) { |
469 | /* PID + STATS + TGID + STATS */ | ||
470 | size = 2 * size; | ||
471 | /* fill the tsk->signal->stats structure */ | ||
472 | fill_tgid_exit(tsk); | ||
473 | } | ||
474 | |||
475 | if (!tidstats) | ||
476 | return; | ||
482 | 477 | ||
483 | rc = prepare_reply(NULL, TASKSTATS_CMD_NEW, &rep_skb, &reply, size); | 478 | rc = prepare_reply(NULL, TASKSTATS_CMD_NEW, &rep_skb, &reply, size); |
484 | if (rc < 0) | 479 | if (rc < 0) |
@@ -498,11 +493,8 @@ void taskstats_exit_send(struct task_struct *tsk, struct taskstats *tidstats, | |||
498 | goto send; | 493 | goto send; |
499 | 494 | ||
500 | /* | 495 | /* |
501 | * tsk has/had a thread group so fill the tsk->signal->stats structure | ||
502 | * Doesn't matter if tsk is the leader or the last group member leaving | 496 | * Doesn't matter if tsk is the leader or the last group member leaving |
503 | */ | 497 | */ |
504 | |||
505 | fill_tgid_exit(tsk); | ||
506 | if (!group_dead) | 498 | if (!group_dead) |
507 | goto send; | 499 | goto send; |
508 | 500 | ||
@@ -519,7 +511,6 @@ send: | |||
519 | 511 | ||
520 | nla_put_failure: | 512 | nla_put_failure: |
521 | genlmsg_cancel(rep_skb, reply); | 513 | genlmsg_cancel(rep_skb, reply); |
522 | goto ret; | ||
523 | err_skb: | 514 | err_skb: |
524 | nlmsg_free(rep_skb); | 515 | nlmsg_free(rep_skb); |
525 | ret: | 516 | ret: |
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 47195fa0ec4f..3afeaa3a73f9 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
@@ -161,9 +161,9 @@ void second_overflow(void) | |||
161 | time_adjust += MAX_TICKADJ; | 161 | time_adjust += MAX_TICKADJ; |
162 | tick_length -= MAX_TICKADJ_SCALED; | 162 | tick_length -= MAX_TICKADJ_SCALED; |
163 | } else { | 163 | } else { |
164 | time_adjust = 0; | ||
165 | tick_length += (s64)(time_adjust * NSEC_PER_USEC / | 164 | tick_length += (s64)(time_adjust * NSEC_PER_USEC / |
166 | HZ) << TICK_LENGTH_SHIFT; | 165 | HZ) << TICK_LENGTH_SHIFT; |
166 | time_adjust = 0; | ||
167 | } | 167 | } |
168 | } | 168 | } |
169 | } | 169 | } |
diff --git a/kernel/tsacct.c b/kernel/tsacct.c index db443221ba5b..96f77013d3f0 100644 --- a/kernel/tsacct.c +++ b/kernel/tsacct.c | |||
@@ -36,7 +36,7 @@ void bacct_add_tsk(struct taskstats *stats, struct task_struct *tsk) | |||
36 | 36 | ||
37 | /* calculate task elapsed time in timespec */ | 37 | /* calculate task elapsed time in timespec */ |
38 | do_posix_clock_monotonic_gettime(&uptime); | 38 | do_posix_clock_monotonic_gettime(&uptime); |
39 | ts = timespec_sub(uptime, current->group_leader->start_time); | 39 | ts = timespec_sub(uptime, tsk->start_time); |
40 | /* rebase elapsed time to usec */ | 40 | /* rebase elapsed time to usec */ |
41 | ac_etime = timespec_to_ns(&ts); | 41 | ac_etime = timespec_to_ns(&ts); |
42 | do_div(ac_etime, NSEC_PER_USEC); | 42 | do_div(ac_etime, NSEC_PER_USEC); |
@@ -58,7 +58,10 @@ void bacct_add_tsk(struct taskstats *stats, struct task_struct *tsk) | |||
58 | stats->ac_uid = tsk->uid; | 58 | stats->ac_uid = tsk->uid; |
59 | stats->ac_gid = tsk->gid; | 59 | stats->ac_gid = tsk->gid; |
60 | stats->ac_pid = tsk->pid; | 60 | stats->ac_pid = tsk->pid; |
61 | stats->ac_ppid = (tsk->parent) ? tsk->parent->pid : 0; | 61 | rcu_read_lock(); |
62 | stats->ac_ppid = pid_alive(tsk) ? | ||
63 | rcu_dereference(tsk->real_parent)->tgid : 0; | ||
64 | rcu_read_unlock(); | ||
62 | stats->ac_utime = cputime_to_msecs(tsk->utime) * USEC_PER_MSEC; | 65 | stats->ac_utime = cputime_to_msecs(tsk->utime) * USEC_PER_MSEC; |
63 | stats->ac_stime = cputime_to_msecs(tsk->stime) * USEC_PER_MSEC; | 66 | stats->ac_stime = cputime_to_msecs(tsk->stime) * USEC_PER_MSEC; |
64 | stats->ac_minflt = tsk->min_flt; | 67 | stats->ac_minflt = tsk->min_flt; |
@@ -77,13 +80,17 @@ void bacct_add_tsk(struct taskstats *stats, struct task_struct *tsk) | |||
77 | */ | 80 | */ |
78 | void xacct_add_tsk(struct taskstats *stats, struct task_struct *p) | 81 | void xacct_add_tsk(struct taskstats *stats, struct task_struct *p) |
79 | { | 82 | { |
83 | struct mm_struct *mm; | ||
84 | |||
80 | /* convert pages-jiffies to Mbyte-usec */ | 85 | /* convert pages-jiffies to Mbyte-usec */ |
81 | stats->coremem = jiffies_to_usecs(p->acct_rss_mem1) * PAGE_SIZE / MB; | 86 | stats->coremem = jiffies_to_usecs(p->acct_rss_mem1) * PAGE_SIZE / MB; |
82 | stats->virtmem = jiffies_to_usecs(p->acct_vm_mem1) * PAGE_SIZE / MB; | 87 | stats->virtmem = jiffies_to_usecs(p->acct_vm_mem1) * PAGE_SIZE / MB; |
83 | if (p->mm) { | 88 | mm = get_task_mm(p); |
89 | if (mm) { | ||
84 | /* adjust to KB unit */ | 90 | /* adjust to KB unit */ |
85 | stats->hiwater_rss = p->mm->hiwater_rss * PAGE_SIZE / KB; | 91 | stats->hiwater_rss = mm->hiwater_rss * PAGE_SIZE / KB; |
86 | stats->hiwater_vm = p->mm->hiwater_vm * PAGE_SIZE / KB; | 92 | stats->hiwater_vm = mm->hiwater_vm * PAGE_SIZE / KB; |
93 | mmput(mm); | ||
87 | } | 94 | } |
88 | stats->read_char = p->rchar; | 95 | stats->read_char = p->rchar; |
89 | stats->write_char = p->wchar; | 96 | stats->write_char = p->wchar; |
diff --git a/kernel/unwind.c b/kernel/unwind.c index 2e2368607aab..ed0a21d4a902 100644 --- a/kernel/unwind.c +++ b/kernel/unwind.c | |||
@@ -11,13 +11,15 @@ | |||
11 | 11 | ||
12 | #include <linux/unwind.h> | 12 | #include <linux/unwind.h> |
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/delay.h> | 14 | #include <linux/bootmem.h> |
15 | #include <linux/sort.h> | ||
15 | #include <linux/stop_machine.h> | 16 | #include <linux/stop_machine.h> |
16 | #include <asm/sections.h> | 17 | #include <asm/sections.h> |
17 | #include <asm/uaccess.h> | 18 | #include <asm/uaccess.h> |
18 | #include <asm/unaligned.h> | 19 | #include <asm/unaligned.h> |
19 | 20 | ||
20 | extern char __start_unwind[], __end_unwind[]; | 21 | extern char __start_unwind[], __end_unwind[]; |
22 | extern const u8 __start_unwind_hdr[], __end_unwind_hdr[]; | ||
21 | 23 | ||
22 | #define MAX_STACK_DEPTH 8 | 24 | #define MAX_STACK_DEPTH 8 |
23 | 25 | ||
@@ -100,6 +102,8 @@ static struct unwind_table { | |||
100 | } core, init; | 102 | } core, init; |
101 | const void *address; | 103 | const void *address; |
102 | unsigned long size; | 104 | unsigned long size; |
105 | const unsigned char *header; | ||
106 | unsigned long hdrsz; | ||
103 | struct unwind_table *link; | 107 | struct unwind_table *link; |
104 | const char *name; | 108 | const char *name; |
105 | } root_table; | 109 | } root_table; |
@@ -145,6 +149,10 @@ static struct unwind_table *find_table(unsigned long pc) | |||
145 | return table; | 149 | return table; |
146 | } | 150 | } |
147 | 151 | ||
152 | static unsigned long read_pointer(const u8 **pLoc, | ||
153 | const void *end, | ||
154 | signed ptrType); | ||
155 | |||
148 | static void init_unwind_table(struct unwind_table *table, | 156 | static void init_unwind_table(struct unwind_table *table, |
149 | const char *name, | 157 | const char *name, |
150 | const void *core_start, | 158 | const void *core_start, |
@@ -152,14 +160,30 @@ static void init_unwind_table(struct unwind_table *table, | |||
152 | const void *init_start, | 160 | const void *init_start, |
153 | unsigned long init_size, | 161 | unsigned long init_size, |
154 | const void *table_start, | 162 | const void *table_start, |
155 | unsigned long table_size) | 163 | unsigned long table_size, |
164 | const u8 *header_start, | ||
165 | unsigned long header_size) | ||
156 | { | 166 | { |
167 | const u8 *ptr = header_start + 4; | ||
168 | const u8 *end = header_start + header_size; | ||
169 | |||
157 | table->core.pc = (unsigned long)core_start; | 170 | table->core.pc = (unsigned long)core_start; |
158 | table->core.range = core_size; | 171 | table->core.range = core_size; |
159 | table->init.pc = (unsigned long)init_start; | 172 | table->init.pc = (unsigned long)init_start; |
160 | table->init.range = init_size; | 173 | table->init.range = init_size; |
161 | table->address = table_start; | 174 | table->address = table_start; |
162 | table->size = table_size; | 175 | table->size = table_size; |
176 | /* See if the linker provided table looks valid. */ | ||
177 | if (header_size <= 4 | ||
178 | || header_start[0] != 1 | ||
179 | || (void *)read_pointer(&ptr, end, header_start[1]) != table_start | ||
180 | || header_start[2] == DW_EH_PE_omit | ||
181 | || read_pointer(&ptr, end, header_start[2]) <= 0 | ||
182 | || header_start[3] == DW_EH_PE_omit) | ||
183 | header_start = NULL; | ||
184 | table->hdrsz = header_size; | ||
185 | smp_wmb(); | ||
186 | table->header = header_start; | ||
163 | table->link = NULL; | 187 | table->link = NULL; |
164 | table->name = name; | 188 | table->name = name; |
165 | } | 189 | } |
@@ -169,7 +193,143 @@ void __init unwind_init(void) | |||
169 | init_unwind_table(&root_table, "kernel", | 193 | init_unwind_table(&root_table, "kernel", |
170 | _text, _end - _text, | 194 | _text, _end - _text, |
171 | NULL, 0, | 195 | NULL, 0, |
172 | __start_unwind, __end_unwind - __start_unwind); | 196 | __start_unwind, __end_unwind - __start_unwind, |
197 | __start_unwind_hdr, __end_unwind_hdr - __start_unwind_hdr); | ||
198 | } | ||
199 | |||
200 | static const u32 bad_cie, not_fde; | ||
201 | static const u32 *cie_for_fde(const u32 *fde, const struct unwind_table *); | ||
202 | static signed fde_pointer_type(const u32 *cie); | ||
203 | |||
204 | struct eh_frame_hdr_table_entry { | ||
205 | unsigned long start, fde; | ||
206 | }; | ||
207 | |||
208 | static int cmp_eh_frame_hdr_table_entries(const void *p1, const void *p2) | ||
209 | { | ||
210 | const struct eh_frame_hdr_table_entry *e1 = p1; | ||
211 | const struct eh_frame_hdr_table_entry *e2 = p2; | ||
212 | |||
213 | return (e1->start > e2->start) - (e1->start < e2->start); | ||
214 | } | ||
215 | |||
216 | static void swap_eh_frame_hdr_table_entries(void *p1, void *p2, int size) | ||
217 | { | ||
218 | struct eh_frame_hdr_table_entry *e1 = p1; | ||
219 | struct eh_frame_hdr_table_entry *e2 = p2; | ||
220 | unsigned long v; | ||
221 | |||
222 | v = e1->start; | ||
223 | e1->start = e2->start; | ||
224 | e2->start = v; | ||
225 | v = e1->fde; | ||
226 | e1->fde = e2->fde; | ||
227 | e2->fde = v; | ||
228 | } | ||
229 | |||
230 | static void __init setup_unwind_table(struct unwind_table *table, | ||
231 | void *(*alloc)(unsigned long)) | ||
232 | { | ||
233 | const u8 *ptr; | ||
234 | unsigned long tableSize = table->size, hdrSize; | ||
235 | unsigned n; | ||
236 | const u32 *fde; | ||
237 | struct { | ||
238 | u8 version; | ||
239 | u8 eh_frame_ptr_enc; | ||
240 | u8 fde_count_enc; | ||
241 | u8 table_enc; | ||
242 | unsigned long eh_frame_ptr; | ||
243 | unsigned int fde_count; | ||
244 | struct eh_frame_hdr_table_entry table[]; | ||
245 | } __attribute__((__packed__)) *header; | ||
246 | |||
247 | if (table->header) | ||
248 | return; | ||
249 | |||
250 | if (table->hdrsz) | ||
251 | printk(KERN_WARNING ".eh_frame_hdr for '%s' present but unusable\n", | ||
252 | table->name); | ||
253 | |||
254 | if (tableSize & (sizeof(*fde) - 1)) | ||
255 | return; | ||
256 | |||
257 | for (fde = table->address, n = 0; | ||
258 | tableSize > sizeof(*fde) && tableSize - sizeof(*fde) >= *fde; | ||
259 | tableSize -= sizeof(*fde) + *fde, fde += 1 + *fde / sizeof(*fde)) { | ||
260 | const u32 *cie = cie_for_fde(fde, table); | ||
261 | signed ptrType; | ||
262 | |||
263 | if (cie == ¬_fde) | ||
264 | continue; | ||
265 | if (cie == NULL | ||
266 | || cie == &bad_cie | ||
267 | || (ptrType = fde_pointer_type(cie)) < 0) | ||
268 | return; | ||
269 | ptr = (const u8 *)(fde + 2); | ||
270 | if (!read_pointer(&ptr, | ||
271 | (const u8 *)(fde + 1) + *fde, | ||
272 | ptrType)) | ||
273 | return; | ||
274 | ++n; | ||
275 | } | ||
276 | |||
277 | if (tableSize || !n) | ||
278 | return; | ||
279 | |||
280 | hdrSize = 4 + sizeof(unsigned long) + sizeof(unsigned int) | ||
281 | + 2 * n * sizeof(unsigned long); | ||
282 | header = alloc(hdrSize); | ||
283 | if (!header) | ||
284 | return; | ||
285 | header->version = 1; | ||
286 | header->eh_frame_ptr_enc = DW_EH_PE_abs|DW_EH_PE_native; | ||
287 | header->fde_count_enc = DW_EH_PE_abs|DW_EH_PE_data4; | ||
288 | header->table_enc = DW_EH_PE_abs|DW_EH_PE_native; | ||
289 | put_unaligned((unsigned long)table->address, &header->eh_frame_ptr); | ||
290 | BUILD_BUG_ON(offsetof(typeof(*header), fde_count) | ||
291 | % __alignof(typeof(header->fde_count))); | ||
292 | header->fde_count = n; | ||
293 | |||
294 | BUILD_BUG_ON(offsetof(typeof(*header), table) | ||
295 | % __alignof(typeof(*header->table))); | ||
296 | for (fde = table->address, tableSize = table->size, n = 0; | ||
297 | tableSize; | ||
298 | tableSize -= sizeof(*fde) + *fde, fde += 1 + *fde / sizeof(*fde)) { | ||
299 | const u32 *cie = fde + 1 - fde[1] / sizeof(*fde); | ||
300 | |||
301 | if (!fde[1]) | ||
302 | continue; /* this is a CIE */ | ||
303 | ptr = (const u8 *)(fde + 2); | ||
304 | header->table[n].start = read_pointer(&ptr, | ||
305 | (const u8 *)(fde + 1) + *fde, | ||
306 | fde_pointer_type(cie)); | ||
307 | header->table[n].fde = (unsigned long)fde; | ||
308 | ++n; | ||
309 | } | ||
310 | WARN_ON(n != header->fde_count); | ||
311 | |||
312 | sort(header->table, | ||
313 | n, | ||
314 | sizeof(*header->table), | ||
315 | cmp_eh_frame_hdr_table_entries, | ||
316 | swap_eh_frame_hdr_table_entries); | ||
317 | |||
318 | table->hdrsz = hdrSize; | ||
319 | smp_wmb(); | ||
320 | table->header = (const void *)header; | ||
321 | } | ||
322 | |||
323 | static void *__init balloc(unsigned long sz) | ||
324 | { | ||
325 | return __alloc_bootmem_nopanic(sz, | ||
326 | sizeof(unsigned int), | ||
327 | __pa(MAX_DMA_ADDRESS)); | ||
328 | } | ||
329 | |||
330 | void __init unwind_setup(void) | ||
331 | { | ||
332 | setup_unwind_table(&root_table, balloc); | ||
173 | } | 333 | } |
174 | 334 | ||
175 | #ifdef CONFIG_MODULES | 335 | #ifdef CONFIG_MODULES |
@@ -193,7 +353,8 @@ void *unwind_add_table(struct module *module, | |||
193 | init_unwind_table(table, module->name, | 353 | init_unwind_table(table, module->name, |
194 | module->module_core, module->core_size, | 354 | module->module_core, module->core_size, |
195 | module->module_init, module->init_size, | 355 | module->module_init, module->init_size, |
196 | table_start, table_size); | 356 | table_start, table_size, |
357 | NULL, 0); | ||
197 | 358 | ||
198 | if (last_table) | 359 | if (last_table) |
199 | last_table->link = table; | 360 | last_table->link = table; |
@@ -303,6 +464,26 @@ static sleb128_t get_sleb128(const u8 **pcur, const u8 *end) | |||
303 | return value; | 464 | return value; |
304 | } | 465 | } |
305 | 466 | ||
467 | static const u32 *cie_for_fde(const u32 *fde, const struct unwind_table *table) | ||
468 | { | ||
469 | const u32 *cie; | ||
470 | |||
471 | if (!*fde || (*fde & (sizeof(*fde) - 1))) | ||
472 | return &bad_cie; | ||
473 | if (!fde[1]) | ||
474 | return ¬_fde; /* this is a CIE */ | ||
475 | if ((fde[1] & (sizeof(*fde) - 1)) | ||
476 | || fde[1] > (unsigned long)(fde + 1) - (unsigned long)table->address) | ||
477 | return NULL; /* this is not a valid FDE */ | ||
478 | cie = fde + 1 - fde[1] / sizeof(*fde); | ||
479 | if (*cie <= sizeof(*cie) + 4 | ||
480 | || *cie >= fde[1] - sizeof(*fde) | ||
481 | || (*cie & (sizeof(*cie) - 1)) | ||
482 | || cie[1]) | ||
483 | return NULL; /* this is not a (valid) CIE */ | ||
484 | return cie; | ||
485 | } | ||
486 | |||
306 | static unsigned long read_pointer(const u8 **pLoc, | 487 | static unsigned long read_pointer(const u8 **pLoc, |
307 | const void *end, | 488 | const void *end, |
308 | signed ptrType) | 489 | signed ptrType) |
@@ -610,49 +791,108 @@ int unwind(struct unwind_frame_info *frame) | |||
610 | unsigned i; | 791 | unsigned i; |
611 | signed ptrType = -1; | 792 | signed ptrType = -1; |
612 | uleb128_t retAddrReg = 0; | 793 | uleb128_t retAddrReg = 0; |
613 | struct unwind_table *table; | 794 | const struct unwind_table *table; |
614 | struct unwind_state state; | 795 | struct unwind_state state; |
615 | 796 | ||
616 | if (UNW_PC(frame) == 0) | 797 | if (UNW_PC(frame) == 0) |
617 | return -EINVAL; | 798 | return -EINVAL; |
618 | if ((table = find_table(pc)) != NULL | 799 | if ((table = find_table(pc)) != NULL |
619 | && !(table->size & (sizeof(*fde) - 1))) { | 800 | && !(table->size & (sizeof(*fde) - 1))) { |
620 | unsigned long tableSize = table->size; | 801 | const u8 *hdr = table->header; |
621 | 802 | unsigned long tableSize; | |
622 | for (fde = table->address; | 803 | |
623 | tableSize > sizeof(*fde) && tableSize - sizeof(*fde) >= *fde; | 804 | smp_rmb(); |
624 | tableSize -= sizeof(*fde) + *fde, | 805 | if (hdr && hdr[0] == 1) { |
625 | fde += 1 + *fde / sizeof(*fde)) { | 806 | switch(hdr[3] & DW_EH_PE_FORM) { |
626 | if (!*fde || (*fde & (sizeof(*fde) - 1))) | 807 | case DW_EH_PE_native: tableSize = sizeof(unsigned long); break; |
627 | break; | 808 | case DW_EH_PE_data2: tableSize = 2; break; |
628 | if (!fde[1]) | 809 | case DW_EH_PE_data4: tableSize = 4; break; |
629 | continue; /* this is a CIE */ | 810 | case DW_EH_PE_data8: tableSize = 8; break; |
630 | if ((fde[1] & (sizeof(*fde) - 1)) | 811 | default: tableSize = 0; break; |
631 | || fde[1] > (unsigned long)(fde + 1) | ||
632 | - (unsigned long)table->address) | ||
633 | continue; /* this is not a valid FDE */ | ||
634 | cie = fde + 1 - fde[1] / sizeof(*fde); | ||
635 | if (*cie <= sizeof(*cie) + 4 | ||
636 | || *cie >= fde[1] - sizeof(*fde) | ||
637 | || (*cie & (sizeof(*cie) - 1)) | ||
638 | || cie[1] | ||
639 | || (ptrType = fde_pointer_type(cie)) < 0) { | ||
640 | cie = NULL; /* this is not a (valid) CIE */ | ||
641 | continue; | ||
642 | } | 812 | } |
813 | ptr = hdr + 4; | ||
814 | end = hdr + table->hdrsz; | ||
815 | if (tableSize | ||
816 | && read_pointer(&ptr, end, hdr[1]) | ||
817 | == (unsigned long)table->address | ||
818 | && (i = read_pointer(&ptr, end, hdr[2])) > 0 | ||
819 | && i == (end - ptr) / (2 * tableSize) | ||
820 | && !((end - ptr) % (2 * tableSize))) { | ||
821 | do { | ||
822 | const u8 *cur = ptr + (i / 2) * (2 * tableSize); | ||
823 | |||
824 | startLoc = read_pointer(&cur, | ||
825 | cur + tableSize, | ||
826 | hdr[3]); | ||
827 | if (pc < startLoc) | ||
828 | i /= 2; | ||
829 | else { | ||
830 | ptr = cur - tableSize; | ||
831 | i = (i + 1) / 2; | ||
832 | } | ||
833 | } while (startLoc && i > 1); | ||
834 | if (i == 1 | ||
835 | && (startLoc = read_pointer(&ptr, | ||
836 | ptr + tableSize, | ||
837 | hdr[3])) != 0 | ||
838 | && pc >= startLoc) | ||
839 | fde = (void *)read_pointer(&ptr, | ||
840 | ptr + tableSize, | ||
841 | hdr[3]); | ||
842 | } | ||
843 | } | ||
844 | |||
845 | if (fde != NULL) { | ||
846 | cie = cie_for_fde(fde, table); | ||
643 | ptr = (const u8 *)(fde + 2); | 847 | ptr = (const u8 *)(fde + 2); |
644 | startLoc = read_pointer(&ptr, | 848 | if(cie != NULL |
645 | (const u8 *)(fde + 1) + *fde, | 849 | && cie != &bad_cie |
646 | ptrType); | 850 | && cie != ¬_fde |
647 | endLoc = startLoc | 851 | && (ptrType = fde_pointer_type(cie)) >= 0 |
648 | + read_pointer(&ptr, | 852 | && read_pointer(&ptr, |
649 | (const u8 *)(fde + 1) + *fde, | 853 | (const u8 *)(fde + 1) + *fde, |
650 | ptrType & DW_EH_PE_indirect | 854 | ptrType) == startLoc) { |
651 | ? ptrType | 855 | if (!(ptrType & DW_EH_PE_indirect)) |
652 | : ptrType & (DW_EH_PE_FORM|DW_EH_PE_signed)); | 856 | ptrType &= DW_EH_PE_FORM|DW_EH_PE_signed; |
653 | if (pc >= startLoc && pc < endLoc) | 857 | endLoc = startLoc |
654 | break; | 858 | + read_pointer(&ptr, |
655 | cie = NULL; | 859 | (const u8 *)(fde + 1) + *fde, |
860 | ptrType); | ||
861 | if(pc >= endLoc) | ||
862 | fde = NULL; | ||
863 | } else | ||
864 | fde = NULL; | ||
865 | } | ||
866 | if (fde == NULL) { | ||
867 | for (fde = table->address, tableSize = table->size; | ||
868 | cie = NULL, tableSize > sizeof(*fde) | ||
869 | && tableSize - sizeof(*fde) >= *fde; | ||
870 | tableSize -= sizeof(*fde) + *fde, | ||
871 | fde += 1 + *fde / sizeof(*fde)) { | ||
872 | cie = cie_for_fde(fde, table); | ||
873 | if (cie == &bad_cie) { | ||
874 | cie = NULL; | ||
875 | break; | ||
876 | } | ||
877 | if (cie == NULL | ||
878 | || cie == ¬_fde | ||
879 | || (ptrType = fde_pointer_type(cie)) < 0) | ||
880 | continue; | ||
881 | ptr = (const u8 *)(fde + 2); | ||
882 | startLoc = read_pointer(&ptr, | ||
883 | (const u8 *)(fde + 1) + *fde, | ||
884 | ptrType); | ||
885 | if (!startLoc) | ||
886 | continue; | ||
887 | if (!(ptrType & DW_EH_PE_indirect)) | ||
888 | ptrType &= DW_EH_PE_FORM|DW_EH_PE_signed; | ||
889 | endLoc = startLoc | ||
890 | + read_pointer(&ptr, | ||
891 | (const u8 *)(fde + 1) + *fde, | ||
892 | ptrType); | ||
893 | if (pc >= startLoc && pc < endLoc) | ||
894 | break; | ||
895 | } | ||
656 | } | 896 | } |
657 | } | 897 | } |
658 | if (cie != NULL) { | 898 | if (cie != NULL) { |
@@ -698,8 +938,11 @@ int unwind(struct unwind_frame_info *frame) | |||
698 | else { | 938 | else { |
699 | retAddrReg = state.version <= 1 ? *ptr++ : get_uleb128(&ptr, end); | 939 | retAddrReg = state.version <= 1 ? *ptr++ : get_uleb128(&ptr, end); |
700 | /* skip augmentation */ | 940 | /* skip augmentation */ |
701 | if (((const char *)(cie + 2))[1] == 'z') | 941 | if (((const char *)(cie + 2))[1] == 'z') { |
702 | ptr += get_uleb128(&ptr, end); | 942 | uleb128_t augSize = get_uleb128(&ptr, end); |
943 | |||
944 | ptr += augSize; | ||
945 | } | ||
703 | if (ptr > end | 946 | if (ptr > end |
704 | || retAddrReg >= ARRAY_SIZE(reg_info) | 947 | || retAddrReg >= ARRAY_SIZE(reg_info) |
705 | || REG_INVALID(retAddrReg) | 948 | || REG_INVALID(retAddrReg) |
@@ -723,9 +966,7 @@ int unwind(struct unwind_frame_info *frame) | |||
723 | if (cie == NULL || fde == NULL) { | 966 | if (cie == NULL || fde == NULL) { |
724 | #ifdef CONFIG_FRAME_POINTER | 967 | #ifdef CONFIG_FRAME_POINTER |
725 | unsigned long top, bottom; | 968 | unsigned long top, bottom; |
726 | #endif | ||
727 | 969 | ||
728 | #ifdef CONFIG_FRAME_POINTER | ||
729 | top = STACK_TOP(frame->task); | 970 | top = STACK_TOP(frame->task); |
730 | bottom = STACK_BOTTOM(frame->task); | 971 | bottom = STACK_BOTTOM(frame->task); |
731 | # if FRAME_RETADDR_OFFSET < 0 | 972 | # if FRAME_RETADDR_OFFSET < 0 |
diff --git a/kernel/user.c b/kernel/user.c index 6408c0424291..220e586127a0 100644 --- a/kernel/user.c +++ b/kernel/user.c | |||
@@ -187,6 +187,17 @@ void switch_uid(struct user_struct *new_user) | |||
187 | atomic_dec(&old_user->processes); | 187 | atomic_dec(&old_user->processes); |
188 | switch_uid_keyring(new_user); | 188 | switch_uid_keyring(new_user); |
189 | current->user = new_user; | 189 | current->user = new_user; |
190 | |||
191 | /* | ||
192 | * We need to synchronize with __sigqueue_alloc() | ||
193 | * doing a get_uid(p->user).. If that saw the old | ||
194 | * user value, we need to wait until it has exited | ||
195 | * its critical region before we can free the old | ||
196 | * structure. | ||
197 | */ | ||
198 | smp_mb(); | ||
199 | spin_unlock_wait(¤t->sighand->siglock); | ||
200 | |||
190 | free_uid(old_user); | 201 | free_uid(old_user); |
191 | suid_keys(current); | 202 | suid_keys(current); |
192 | } | 203 | } |
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 3df9bfc7ff78..17c2f03d2c27 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
@@ -99,7 +99,7 @@ static void __queue_work(struct cpu_workqueue_struct *cwq, | |||
99 | * @wq: workqueue to use | 99 | * @wq: workqueue to use |
100 | * @work: work to queue | 100 | * @work: work to queue |
101 | * | 101 | * |
102 | * Returns non-zero if it was successfully added. | 102 | * Returns 0 if @work was already on a queue, non-zero otherwise. |
103 | * | 103 | * |
104 | * We queue the work to the CPU it was submitted, but there is no | 104 | * We queue the work to the CPU it was submitted, but there is no |
105 | * guarantee that it will be processed by that CPU. | 105 | * guarantee that it will be processed by that CPU. |
@@ -138,7 +138,7 @@ static void delayed_work_timer_fn(unsigned long __data) | |||
138 | * @work: work to queue | 138 | * @work: work to queue |
139 | * @delay: number of jiffies to wait before queueing | 139 | * @delay: number of jiffies to wait before queueing |
140 | * | 140 | * |
141 | * Returns non-zero if it was successfully added. | 141 | * Returns 0 if @work was already on a queue, non-zero otherwise. |
142 | */ | 142 | */ |
143 | int fastcall queue_delayed_work(struct workqueue_struct *wq, | 143 | int fastcall queue_delayed_work(struct workqueue_struct *wq, |
144 | struct work_struct *work, unsigned long delay) | 144 | struct work_struct *work, unsigned long delay) |
@@ -169,7 +169,7 @@ EXPORT_SYMBOL_GPL(queue_delayed_work); | |||
169 | * @work: work to queue | 169 | * @work: work to queue |
170 | * @delay: number of jiffies to wait before queueing | 170 | * @delay: number of jiffies to wait before queueing |
171 | * | 171 | * |
172 | * Returns non-zero if it was successfully added. | 172 | * Returns 0 if @work was already on a queue, non-zero otherwise. |
173 | */ | 173 | */ |
174 | int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, | 174 | int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, |
175 | struct work_struct *work, unsigned long delay) | 175 | struct work_struct *work, unsigned long delay) |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 77491e311791..d3679103a8e4 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
@@ -341,7 +341,7 @@ config FRAME_POINTER | |||
341 | 341 | ||
342 | config UNWIND_INFO | 342 | config UNWIND_INFO |
343 | bool "Compile the kernel with frame unwind information" | 343 | bool "Compile the kernel with frame unwind information" |
344 | depends on !IA64 && !PARISC | 344 | depends on !IA64 && !PARISC && !ARM |
345 | depends on !MODULES || !(MIPS || PPC || SUPERH || V850) | 345 | depends on !MODULES || !(MIPS || PPC || SUPERH || V850) |
346 | help | 346 | help |
347 | If you say Y here the resulting kernel image will be slightly larger | 347 | If you say Y here the resulting kernel image will be slightly larger |
diff --git a/lib/string.c b/lib/string.c index 63077267367e..a485d75962af 100644 --- a/lib/string.c +++ b/lib/string.c | |||
@@ -320,7 +320,7 @@ char *strstrip(char *s) | |||
320 | return s; | 320 | return s; |
321 | 321 | ||
322 | end = s + size - 1; | 322 | end = s + size - 1; |
323 | while (end != s && isspace(*end)) | 323 | while (end >= s && isspace(*end)) |
324 | end--; | 324 | end--; |
325 | *(end + 1) = '\0'; | 325 | *(end + 1) = '\0'; |
326 | 326 | ||
diff --git a/mm/filemap.c b/mm/filemap.c index 8558732e85c1..7b84dc814347 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -467,25 +467,15 @@ int add_to_page_cache_lru(struct page *page, struct address_space *mapping, | |||
467 | } | 467 | } |
468 | 468 | ||
469 | #ifdef CONFIG_NUMA | 469 | #ifdef CONFIG_NUMA |
470 | struct page *page_cache_alloc(struct address_space *x) | 470 | struct page *__page_cache_alloc(gfp_t gfp) |
471 | { | 471 | { |
472 | if (cpuset_do_page_mem_spread()) { | 472 | if (cpuset_do_page_mem_spread()) { |
473 | int n = cpuset_mem_spread_node(); | 473 | int n = cpuset_mem_spread_node(); |
474 | return alloc_pages_node(n, mapping_gfp_mask(x), 0); | 474 | return alloc_pages_node(n, gfp, 0); |
475 | } | 475 | } |
476 | return alloc_pages(mapping_gfp_mask(x), 0); | 476 | return alloc_pages(gfp, 0); |
477 | } | 477 | } |
478 | EXPORT_SYMBOL(page_cache_alloc); | 478 | EXPORT_SYMBOL(__page_cache_alloc); |
479 | |||
480 | struct page *page_cache_alloc_cold(struct address_space *x) | ||
481 | { | ||
482 | if (cpuset_do_page_mem_spread()) { | ||
483 | int n = cpuset_mem_spread_node(); | ||
484 | return alloc_pages_node(n, mapping_gfp_mask(x)|__GFP_COLD, 0); | ||
485 | } | ||
486 | return alloc_pages(mapping_gfp_mask(x)|__GFP_COLD, 0); | ||
487 | } | ||
488 | EXPORT_SYMBOL(page_cache_alloc_cold); | ||
489 | #endif | 479 | #endif |
490 | 480 | ||
491 | static int __sleep_on_page_lock(void *word) | 481 | static int __sleep_on_page_lock(void *word) |
@@ -826,7 +816,6 @@ struct page * | |||
826 | grab_cache_page_nowait(struct address_space *mapping, unsigned long index) | 816 | grab_cache_page_nowait(struct address_space *mapping, unsigned long index) |
827 | { | 817 | { |
828 | struct page *page = find_get_page(mapping, index); | 818 | struct page *page = find_get_page(mapping, index); |
829 | gfp_t gfp_mask; | ||
830 | 819 | ||
831 | if (page) { | 820 | if (page) { |
832 | if (!TestSetPageLocked(page)) | 821 | if (!TestSetPageLocked(page)) |
@@ -834,9 +823,8 @@ grab_cache_page_nowait(struct address_space *mapping, unsigned long index) | |||
834 | page_cache_release(page); | 823 | page_cache_release(page); |
835 | return NULL; | 824 | return NULL; |
836 | } | 825 | } |
837 | gfp_mask = mapping_gfp_mask(mapping) & ~__GFP_FS; | 826 | page = __page_cache_alloc(mapping_gfp_mask(mapping) & ~__GFP_FS); |
838 | page = alloc_pages(gfp_mask, 0); | 827 | if (page && add_to_page_cache_lru(page, mapping, index, GFP_KERNEL)) { |
839 | if (page && add_to_page_cache_lru(page, mapping, index, gfp_mask)) { | ||
840 | page_cache_release(page); | 828 | page_cache_release(page); |
841 | page = NULL; | 829 | page = NULL; |
842 | } | 830 | } |
@@ -1884,11 +1872,10 @@ repeat: | |||
1884 | * if suid or (sgid and xgrp) | 1872 | * if suid or (sgid and xgrp) |
1885 | * remove privs | 1873 | * remove privs |
1886 | */ | 1874 | */ |
1887 | int remove_suid(struct dentry *dentry) | 1875 | int should_remove_suid(struct dentry *dentry) |
1888 | { | 1876 | { |
1889 | mode_t mode = dentry->d_inode->i_mode; | 1877 | mode_t mode = dentry->d_inode->i_mode; |
1890 | int kill = 0; | 1878 | int kill = 0; |
1891 | int result = 0; | ||
1892 | 1879 | ||
1893 | /* suid always must be killed */ | 1880 | /* suid always must be killed */ |
1894 | if (unlikely(mode & S_ISUID)) | 1881 | if (unlikely(mode & S_ISUID)) |
@@ -1901,13 +1888,28 @@ int remove_suid(struct dentry *dentry) | |||
1901 | if (unlikely((mode & S_ISGID) && (mode & S_IXGRP))) | 1888 | if (unlikely((mode & S_ISGID) && (mode & S_IXGRP))) |
1902 | kill |= ATTR_KILL_SGID; | 1889 | kill |= ATTR_KILL_SGID; |
1903 | 1890 | ||
1904 | if (unlikely(kill && !capable(CAP_FSETID))) { | 1891 | if (unlikely(kill && !capable(CAP_FSETID))) |
1905 | struct iattr newattrs; | 1892 | return kill; |
1906 | 1893 | ||
1907 | newattrs.ia_valid = ATTR_FORCE | kill; | 1894 | return 0; |
1908 | result = notify_change(dentry, &newattrs); | 1895 | } |
1909 | } | 1896 | |
1910 | return result; | 1897 | int __remove_suid(struct dentry *dentry, int kill) |
1898 | { | ||
1899 | struct iattr newattrs; | ||
1900 | |||
1901 | newattrs.ia_valid = ATTR_FORCE | kill; | ||
1902 | return notify_change(dentry, &newattrs); | ||
1903 | } | ||
1904 | |||
1905 | int remove_suid(struct dentry *dentry) | ||
1906 | { | ||
1907 | int kill = should_remove_suid(dentry); | ||
1908 | |||
1909 | if (unlikely(kill)) | ||
1910 | return __remove_suid(dentry, kill); | ||
1911 | |||
1912 | return 0; | ||
1911 | } | 1913 | } |
1912 | EXPORT_SYMBOL(remove_suid); | 1914 | EXPORT_SYMBOL(remove_suid); |
1913 | 1915 | ||
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 2dbec90dc3ba..a088f593a807 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -478,6 +478,9 @@ int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
478 | retry: | 478 | retry: |
479 | page = find_lock_page(mapping, idx); | 479 | page = find_lock_page(mapping, idx); |
480 | if (!page) { | 480 | if (!page) { |
481 | size = i_size_read(mapping->host) >> HPAGE_SHIFT; | ||
482 | if (idx >= size) | ||
483 | goto out; | ||
481 | if (hugetlb_get_quota(mapping)) | 484 | if (hugetlb_get_quota(mapping)) |
482 | goto out; | 485 | goto out; |
483 | page = alloc_huge_page(vma, address); | 486 | page = alloc_huge_page(vma, address); |
diff --git a/mm/migrate.c b/mm/migrate.c index ba2453f9483d..b4979d423d2b 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -952,7 +952,8 @@ asmlinkage long sys_move_pages(pid_t pid, unsigned long nr_pages, | |||
952 | goto out; | 952 | goto out; |
953 | 953 | ||
954 | pm[i].node = node; | 954 | pm[i].node = node; |
955 | } | 955 | } else |
956 | pm[i].node = 0; /* anything to not match MAX_NUMNODES */ | ||
956 | } | 957 | } |
957 | /* End marker */ | 958 | /* End marker */ |
958 | pm[nr_pages].node = MAX_NUMNODES; | 959 | pm[nr_pages].node = MAX_NUMNODES; |
@@ -1379,7 +1379,7 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, | |||
1379 | * Check if the given range is hugepage aligned, and | 1379 | * Check if the given range is hugepage aligned, and |
1380 | * can be made suitable for hugepages. | 1380 | * can be made suitable for hugepages. |
1381 | */ | 1381 | */ |
1382 | ret = prepare_hugepage_range(addr, len); | 1382 | ret = prepare_hugepage_range(addr, len, pgoff); |
1383 | } else { | 1383 | } else { |
1384 | /* | 1384 | /* |
1385 | * Ensure that a normal request is not falling in a | 1385 | * Ensure that a normal request is not falling in a |
@@ -1880,6 +1880,9 @@ unsigned long do_brk(unsigned long addr, unsigned long len) | |||
1880 | if ((addr + len) > TASK_SIZE || (addr + len) < addr) | 1880 | if ((addr + len) > TASK_SIZE || (addr + len) < addr) |
1881 | return -EINVAL; | 1881 | return -EINVAL; |
1882 | 1882 | ||
1883 | if (is_hugepage_only_range(mm, addr, len)) | ||
1884 | return -EINVAL; | ||
1885 | |||
1883 | flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags; | 1886 | flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags; |
1884 | 1887 | ||
1885 | error = arch_mmap_check(addr, len, flags); | 1888 | error = arch_mmap_check(addr, len, flags); |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index ebd425c2e2a7..aa6fcc7ca66f 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -853,7 +853,7 @@ again: | |||
853 | pcp = &zone_pcp(zone, cpu)->pcp[cold]; | 853 | pcp = &zone_pcp(zone, cpu)->pcp[cold]; |
854 | local_irq_save(flags); | 854 | local_irq_save(flags); |
855 | if (!pcp->count) { | 855 | if (!pcp->count) { |
856 | pcp->count += rmqueue_bulk(zone, 0, | 856 | pcp->count = rmqueue_bulk(zone, 0, |
857 | pcp->batch, &pcp->list); | 857 | pcp->batch, &pcp->list); |
858 | if (unlikely(!pcp->count)) | 858 | if (unlikely(!pcp->count)) |
859 | goto failed; | 859 | goto failed; |
@@ -1689,6 +1689,8 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, | |||
1689 | for (pfn = start_pfn; pfn < end_pfn; pfn++) { | 1689 | for (pfn = start_pfn; pfn < end_pfn; pfn++) { |
1690 | if (!early_pfn_valid(pfn)) | 1690 | if (!early_pfn_valid(pfn)) |
1691 | continue; | 1691 | continue; |
1692 | if (!early_pfn_in_nid(pfn, nid)) | ||
1693 | continue; | ||
1692 | page = pfn_to_page(pfn); | 1694 | page = pfn_to_page(pfn); |
1693 | set_page_links(page, zone, nid, pfn); | 1695 | set_page_links(page, zone, nid, pfn); |
1694 | init_page_count(page); | 1696 | init_page_count(page); |
@@ -2259,7 +2261,7 @@ unsigned long __init __absent_pages_in_range(int nid, | |||
2259 | 2261 | ||
2260 | /* Account for ranges past physical memory on this node */ | 2262 | /* Account for ranges past physical memory on this node */ |
2261 | if (range_end_pfn > prev_end_pfn) | 2263 | if (range_end_pfn > prev_end_pfn) |
2262 | hole_pages = range_end_pfn - | 2264 | hole_pages += range_end_pfn - |
2263 | max(range_start_pfn, prev_end_pfn); | 2265 | max(range_start_pfn, prev_end_pfn); |
2264 | 2266 | ||
2265 | return hole_pages; | 2267 | return hole_pages; |
@@ -2405,7 +2407,7 @@ static void __meminit free_area_init_core(struct pglist_data *pgdat, | |||
2405 | zone->zone_pgdat = pgdat; | 2407 | zone->zone_pgdat = pgdat; |
2406 | zone->free_pages = 0; | 2408 | zone->free_pages = 0; |
2407 | 2409 | ||
2408 | zone->temp_priority = zone->prev_priority = DEF_PRIORITY; | 2410 | zone->prev_priority = DEF_PRIORITY; |
2409 | 2411 | ||
2410 | zone_pcp_init(zone); | 2412 | zone_pcp_init(zone); |
2411 | INIT_LIST_HEAD(&zone->active_list); | 2413 | INIT_LIST_HEAD(&zone->active_list); |
@@ -2610,6 +2612,9 @@ unsigned long __init find_min_pfn_for_node(unsigned long nid) | |||
2610 | { | 2612 | { |
2611 | int i; | 2613 | int i; |
2612 | 2614 | ||
2615 | /* Regions in the early_node_map can be in any order */ | ||
2616 | sort_node_map(); | ||
2617 | |||
2613 | /* Assuming a sorted map, the first range found has the starting pfn */ | 2618 | /* Assuming a sorted map, the first range found has the starting pfn */ |
2614 | for_each_active_range_index_in_nid(i, nid) | 2619 | for_each_active_range_index_in_nid(i, nid) |
2615 | return early_node_map[i].start_pfn; | 2620 | return early_node_map[i].start_pfn; |
@@ -2678,9 +2683,6 @@ void __init free_area_init_nodes(unsigned long *max_zone_pfn) | |||
2678 | max(max_zone_pfn[i], arch_zone_lowest_possible_pfn[i]); | 2683 | max(max_zone_pfn[i], arch_zone_lowest_possible_pfn[i]); |
2679 | } | 2684 | } |
2680 | 2685 | ||
2681 | /* Regions in the early_node_map can be in any order */ | ||
2682 | sort_node_map(); | ||
2683 | |||
2684 | /* Print out the zone ranges */ | 2686 | /* Print out the zone ranges */ |
2685 | printk("Zone PFN ranges:\n"); | 2687 | printk("Zone PFN ranges:\n"); |
2686 | for (i = 0; i < MAX_NR_ZONES; i++) | 2688 | for (i = 0; i < MAX_NR_ZONES; i++) |
diff --git a/mm/readahead.c b/mm/readahead.c index 1ba736ac0367..23cb61a01c6e 100644 --- a/mm/readahead.c +++ b/mm/readahead.c | |||
@@ -173,6 +173,8 @@ static int read_pages(struct address_space *mapping, struct file *filp, | |||
173 | 173 | ||
174 | if (mapping->a_ops->readpages) { | 174 | if (mapping->a_ops->readpages) { |
175 | ret = mapping->a_ops->readpages(filp, mapping, pages, nr_pages); | 175 | ret = mapping->a_ops->readpages(filp, mapping, pages, nr_pages); |
176 | /* Clean up the remaining pages */ | ||
177 | put_pages_list(pages); | ||
176 | goto out; | 178 | goto out; |
177 | } | 179 | } |
178 | 180 | ||
@@ -883,7 +883,7 @@ static void init_reap_node(int cpu) | |||
883 | if (node == MAX_NUMNODES) | 883 | if (node == MAX_NUMNODES) |
884 | node = first_node(node_online_map); | 884 | node = first_node(node_online_map); |
885 | 885 | ||
886 | __get_cpu_var(reap_node) = node; | 886 | per_cpu(reap_node, cpu) = node; |
887 | } | 887 | } |
888 | 888 | ||
889 | static void next_reap_node(void) | 889 | static void next_reap_node(void) |
@@ -3152,12 +3152,15 @@ void *fallback_alloc(struct kmem_cache *cache, gfp_t flags) | |||
3152 | struct zone **z; | 3152 | struct zone **z; |
3153 | void *obj = NULL; | 3153 | void *obj = NULL; |
3154 | 3154 | ||
3155 | for (z = zonelist->zones; *z && !obj; z++) | 3155 | for (z = zonelist->zones; *z && !obj; z++) { |
3156 | int nid = zone_to_nid(*z); | ||
3157 | |||
3156 | if (zone_idx(*z) <= ZONE_NORMAL && | 3158 | if (zone_idx(*z) <= ZONE_NORMAL && |
3157 | cpuset_zone_allowed(*z, flags)) | 3159 | cpuset_zone_allowed(*z, flags) && |
3160 | cache->nodelists[nid]) | ||
3158 | obj = __cache_alloc_node(cache, | 3161 | obj = __cache_alloc_node(cache, |
3159 | flags | __GFP_THISNODE, | 3162 | flags | __GFP_THISNODE, nid); |
3160 | zone_to_nid(*z)); | 3163 | } |
3161 | return obj; | 3164 | return obj; |
3162 | } | 3165 | } |
3163 | 3166 | ||
diff --git a/mm/sparse.c b/mm/sparse.c index 86c52ab80878..b3c82ba30012 100644 --- a/mm/sparse.c +++ b/mm/sparse.c | |||
@@ -211,7 +211,7 @@ static struct page *__kmalloc_section_memmap(unsigned long nr_pages) | |||
211 | struct page *page, *ret; | 211 | struct page *page, *ret; |
212 | unsigned long memmap_size = sizeof(struct page) * nr_pages; | 212 | unsigned long memmap_size = sizeof(struct page) * nr_pages; |
213 | 213 | ||
214 | page = alloc_pages(GFP_KERNEL, get_order(memmap_size)); | 214 | page = alloc_pages(GFP_KERNEL|__GFP_NOWARN, get_order(memmap_size)); |
215 | if (page) | 215 | if (page) |
216 | goto got_map_page; | 216 | goto got_map_page; |
217 | 217 | ||
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 1133dd3aafcf..86897ee792d6 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
@@ -160,13 +160,15 @@ int map_vm_area(struct vm_struct *area, pgprot_t prot, struct page ***pages) | |||
160 | return err; | 160 | return err; |
161 | } | 161 | } |
162 | 162 | ||
163 | struct vm_struct *__get_vm_area_node(unsigned long size, unsigned long flags, | 163 | static struct vm_struct *__get_vm_area_node(unsigned long size, unsigned long flags, |
164 | unsigned long start, unsigned long end, int node) | 164 | unsigned long start, unsigned long end, |
165 | int node, gfp_t gfp_mask) | ||
165 | { | 166 | { |
166 | struct vm_struct **p, *tmp, *area; | 167 | struct vm_struct **p, *tmp, *area; |
167 | unsigned long align = 1; | 168 | unsigned long align = 1; |
168 | unsigned long addr; | 169 | unsigned long addr; |
169 | 170 | ||
171 | BUG_ON(in_interrupt()); | ||
170 | if (flags & VM_IOREMAP) { | 172 | if (flags & VM_IOREMAP) { |
171 | int bit = fls(size); | 173 | int bit = fls(size); |
172 | 174 | ||
@@ -179,16 +181,13 @@ struct vm_struct *__get_vm_area_node(unsigned long size, unsigned long flags, | |||
179 | } | 181 | } |
180 | addr = ALIGN(start, align); | 182 | addr = ALIGN(start, align); |
181 | size = PAGE_ALIGN(size); | 183 | size = PAGE_ALIGN(size); |
184 | if (unlikely(!size)) | ||
185 | return NULL; | ||
182 | 186 | ||
183 | area = kmalloc_node(sizeof(*area), GFP_KERNEL, node); | 187 | area = kmalloc_node(sizeof(*area), gfp_mask & GFP_LEVEL_MASK, node); |
184 | if (unlikely(!area)) | 188 | if (unlikely(!area)) |
185 | return NULL; | 189 | return NULL; |
186 | 190 | ||
187 | if (unlikely(!size)) { | ||
188 | kfree (area); | ||
189 | return NULL; | ||
190 | } | ||
191 | |||
192 | /* | 191 | /* |
193 | * We always allocate a guard page. | 192 | * We always allocate a guard page. |
194 | */ | 193 | */ |
@@ -236,7 +235,7 @@ out: | |||
236 | struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags, | 235 | struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags, |
237 | unsigned long start, unsigned long end) | 236 | unsigned long start, unsigned long end) |
238 | { | 237 | { |
239 | return __get_vm_area_node(size, flags, start, end, -1); | 238 | return __get_vm_area_node(size, flags, start, end, -1, GFP_KERNEL); |
240 | } | 239 | } |
241 | 240 | ||
242 | /** | 241 | /** |
@@ -253,9 +252,11 @@ struct vm_struct *get_vm_area(unsigned long size, unsigned long flags) | |||
253 | return __get_vm_area(size, flags, VMALLOC_START, VMALLOC_END); | 252 | return __get_vm_area(size, flags, VMALLOC_START, VMALLOC_END); |
254 | } | 253 | } |
255 | 254 | ||
256 | struct vm_struct *get_vm_area_node(unsigned long size, unsigned long flags, int node) | 255 | struct vm_struct *get_vm_area_node(unsigned long size, unsigned long flags, |
256 | int node, gfp_t gfp_mask) | ||
257 | { | 257 | { |
258 | return __get_vm_area_node(size, flags, VMALLOC_START, VMALLOC_END, node); | 258 | return __get_vm_area_node(size, flags, VMALLOC_START, VMALLOC_END, node, |
259 | gfp_mask); | ||
259 | } | 260 | } |
260 | 261 | ||
261 | /* Caller must hold vmlist_lock */ | 262 | /* Caller must hold vmlist_lock */ |
@@ -487,7 +488,7 @@ static void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot, | |||
487 | if (!size || (size >> PAGE_SHIFT) > num_physpages) | 488 | if (!size || (size >> PAGE_SHIFT) > num_physpages) |
488 | return NULL; | 489 | return NULL; |
489 | 490 | ||
490 | area = get_vm_area_node(size, VM_ALLOC, node); | 491 | area = get_vm_area_node(size, VM_ALLOC, node, gfp_mask); |
491 | if (!area) | 492 | if (!area) |
492 | return NULL; | 493 | return NULL; |
493 | 494 | ||
@@ -528,11 +529,12 @@ void *vmalloc_user(unsigned long size) | |||
528 | void *ret; | 529 | void *ret; |
529 | 530 | ||
530 | ret = __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL); | 531 | ret = __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL); |
531 | write_lock(&vmlist_lock); | 532 | if (ret) { |
532 | area = __find_vm_area(ret); | 533 | write_lock(&vmlist_lock); |
533 | area->flags |= VM_USERMAP; | 534 | area = __find_vm_area(ret); |
534 | write_unlock(&vmlist_lock); | 535 | area->flags |= VM_USERMAP; |
535 | 536 | write_unlock(&vmlist_lock); | |
537 | } | ||
536 | return ret; | 538 | return ret; |
537 | } | 539 | } |
538 | EXPORT_SYMBOL(vmalloc_user); | 540 | EXPORT_SYMBOL(vmalloc_user); |
@@ -601,11 +603,12 @@ void *vmalloc_32_user(unsigned long size) | |||
601 | void *ret; | 603 | void *ret; |
602 | 604 | ||
603 | ret = __vmalloc(size, GFP_KERNEL | __GFP_ZERO, PAGE_KERNEL); | 605 | ret = __vmalloc(size, GFP_KERNEL | __GFP_ZERO, PAGE_KERNEL); |
604 | write_lock(&vmlist_lock); | 606 | if (ret) { |
605 | area = __find_vm_area(ret); | 607 | write_lock(&vmlist_lock); |
606 | area->flags |= VM_USERMAP; | 608 | area = __find_vm_area(ret); |
607 | write_unlock(&vmlist_lock); | 609 | area->flags |= VM_USERMAP; |
608 | 610 | write_unlock(&vmlist_lock); | |
611 | } | ||
609 | return ret; | 612 | return ret; |
610 | } | 613 | } |
611 | EXPORT_SYMBOL(vmalloc_32_user); | 614 | EXPORT_SYMBOL(vmalloc_32_user); |
diff --git a/mm/vmscan.c b/mm/vmscan.c index f05527bf792b..518540a4a2a6 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -723,6 +723,20 @@ done: | |||
723 | return nr_reclaimed; | 723 | return nr_reclaimed; |
724 | } | 724 | } |
725 | 725 | ||
726 | /* | ||
727 | * We are about to scan this zone at a certain priority level. If that priority | ||
728 | * level is smaller (ie: more urgent) than the previous priority, then note | ||
729 | * that priority level within the zone. This is done so that when the next | ||
730 | * process comes in to scan this zone, it will immediately start out at this | ||
731 | * priority level rather than having to build up its own scanning priority. | ||
732 | * Here, this priority affects only the reclaim-mapped threshold. | ||
733 | */ | ||
734 | static inline void note_zone_scanning_priority(struct zone *zone, int priority) | ||
735 | { | ||
736 | if (priority < zone->prev_priority) | ||
737 | zone->prev_priority = priority; | ||
738 | } | ||
739 | |||
726 | static inline int zone_is_near_oom(struct zone *zone) | 740 | static inline int zone_is_near_oom(struct zone *zone) |
727 | { | 741 | { |
728 | return zone->pages_scanned >= (zone->nr_active + zone->nr_inactive)*3; | 742 | return zone->pages_scanned >= (zone->nr_active + zone->nr_inactive)*3; |
@@ -746,7 +760,7 @@ static inline int zone_is_near_oom(struct zone *zone) | |||
746 | * But we had to alter page->flags anyway. | 760 | * But we had to alter page->flags anyway. |
747 | */ | 761 | */ |
748 | static void shrink_active_list(unsigned long nr_pages, struct zone *zone, | 762 | static void shrink_active_list(unsigned long nr_pages, struct zone *zone, |
749 | struct scan_control *sc) | 763 | struct scan_control *sc, int priority) |
750 | { | 764 | { |
751 | unsigned long pgmoved; | 765 | unsigned long pgmoved; |
752 | int pgdeactivate = 0; | 766 | int pgdeactivate = 0; |
@@ -770,7 +784,7 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, | |||
770 | * `distress' is a measure of how much trouble we're having | 784 | * `distress' is a measure of how much trouble we're having |
771 | * reclaiming pages. 0 -> no problems. 100 -> great trouble. | 785 | * reclaiming pages. 0 -> no problems. 100 -> great trouble. |
772 | */ | 786 | */ |
773 | distress = 100 >> zone->prev_priority; | 787 | distress = 100 >> min(zone->prev_priority, priority); |
774 | 788 | ||
775 | /* | 789 | /* |
776 | * The point of this algorithm is to decide when to start | 790 | * The point of this algorithm is to decide when to start |
@@ -922,7 +936,7 @@ static unsigned long shrink_zone(int priority, struct zone *zone, | |||
922 | nr_to_scan = min(nr_active, | 936 | nr_to_scan = min(nr_active, |
923 | (unsigned long)sc->swap_cluster_max); | 937 | (unsigned long)sc->swap_cluster_max); |
924 | nr_active -= nr_to_scan; | 938 | nr_active -= nr_to_scan; |
925 | shrink_active_list(nr_to_scan, zone, sc); | 939 | shrink_active_list(nr_to_scan, zone, sc, priority); |
926 | } | 940 | } |
927 | 941 | ||
928 | if (nr_inactive) { | 942 | if (nr_inactive) { |
@@ -972,9 +986,7 @@ static unsigned long shrink_zones(int priority, struct zone **zones, | |||
972 | if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) | 986 | if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) |
973 | continue; | 987 | continue; |
974 | 988 | ||
975 | zone->temp_priority = priority; | 989 | note_zone_scanning_priority(zone, priority); |
976 | if (zone->prev_priority > priority) | ||
977 | zone->prev_priority = priority; | ||
978 | 990 | ||
979 | if (zone->all_unreclaimable && priority != DEF_PRIORITY) | 991 | if (zone->all_unreclaimable && priority != DEF_PRIORITY) |
980 | continue; /* Let kswapd poll it */ | 992 | continue; /* Let kswapd poll it */ |
@@ -1024,7 +1036,6 @@ unsigned long try_to_free_pages(struct zone **zones, gfp_t gfp_mask) | |||
1024 | if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) | 1036 | if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) |
1025 | continue; | 1037 | continue; |
1026 | 1038 | ||
1027 | zone->temp_priority = DEF_PRIORITY; | ||
1028 | lru_pages += zone->nr_active + zone->nr_inactive; | 1039 | lru_pages += zone->nr_active + zone->nr_inactive; |
1029 | } | 1040 | } |
1030 | 1041 | ||
@@ -1065,13 +1076,22 @@ unsigned long try_to_free_pages(struct zone **zones, gfp_t gfp_mask) | |||
1065 | if (!sc.all_unreclaimable) | 1076 | if (!sc.all_unreclaimable) |
1066 | ret = 1; | 1077 | ret = 1; |
1067 | out: | 1078 | out: |
1079 | /* | ||
1080 | * Now that we've scanned all the zones at this priority level, note | ||
1081 | * that level within the zone so that the next thread which performs | ||
1082 | * scanning of this zone will immediately start out at this priority | ||
1083 | * level. This affects only the decision whether or not to bring | ||
1084 | * mapped pages onto the inactive list. | ||
1085 | */ | ||
1086 | if (priority < 0) | ||
1087 | priority = 0; | ||
1068 | for (i = 0; zones[i] != 0; i++) { | 1088 | for (i = 0; zones[i] != 0; i++) { |
1069 | struct zone *zone = zones[i]; | 1089 | struct zone *zone = zones[i]; |
1070 | 1090 | ||
1071 | if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) | 1091 | if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) |
1072 | continue; | 1092 | continue; |
1073 | 1093 | ||
1074 | zone->prev_priority = zone->temp_priority; | 1094 | zone->prev_priority = priority; |
1075 | } | 1095 | } |
1076 | return ret; | 1096 | return ret; |
1077 | } | 1097 | } |
@@ -1111,6 +1131,11 @@ static unsigned long balance_pgdat(pg_data_t *pgdat, int order) | |||
1111 | .swap_cluster_max = SWAP_CLUSTER_MAX, | 1131 | .swap_cluster_max = SWAP_CLUSTER_MAX, |
1112 | .swappiness = vm_swappiness, | 1132 | .swappiness = vm_swappiness, |
1113 | }; | 1133 | }; |
1134 | /* | ||
1135 | * temp_priority is used to remember the scanning priority at which | ||
1136 | * this zone was successfully refilled to free_pages == pages_high. | ||
1137 | */ | ||
1138 | int temp_priority[MAX_NR_ZONES]; | ||
1114 | 1139 | ||
1115 | loop_again: | 1140 | loop_again: |
1116 | total_scanned = 0; | 1141 | total_scanned = 0; |
@@ -1118,11 +1143,8 @@ loop_again: | |||
1118 | sc.may_writepage = !laptop_mode; | 1143 | sc.may_writepage = !laptop_mode; |
1119 | count_vm_event(PAGEOUTRUN); | 1144 | count_vm_event(PAGEOUTRUN); |
1120 | 1145 | ||
1121 | for (i = 0; i < pgdat->nr_zones; i++) { | 1146 | for (i = 0; i < pgdat->nr_zones; i++) |
1122 | struct zone *zone = pgdat->node_zones + i; | 1147 | temp_priority[i] = DEF_PRIORITY; |
1123 | |||
1124 | zone->temp_priority = DEF_PRIORITY; | ||
1125 | } | ||
1126 | 1148 | ||
1127 | for (priority = DEF_PRIORITY; priority >= 0; priority--) { | 1149 | for (priority = DEF_PRIORITY; priority >= 0; priority--) { |
1128 | int end_zone = 0; /* Inclusive. 0 = ZONE_DMA */ | 1150 | int end_zone = 0; /* Inclusive. 0 = ZONE_DMA */ |
@@ -1183,10 +1205,9 @@ scan: | |||
1183 | if (!zone_watermark_ok(zone, order, zone->pages_high, | 1205 | if (!zone_watermark_ok(zone, order, zone->pages_high, |
1184 | end_zone, 0)) | 1206 | end_zone, 0)) |
1185 | all_zones_ok = 0; | 1207 | all_zones_ok = 0; |
1186 | zone->temp_priority = priority; | 1208 | temp_priority[i] = priority; |
1187 | if (zone->prev_priority > priority) | ||
1188 | zone->prev_priority = priority; | ||
1189 | sc.nr_scanned = 0; | 1209 | sc.nr_scanned = 0; |
1210 | note_zone_scanning_priority(zone, priority); | ||
1190 | nr_reclaimed += shrink_zone(priority, zone, &sc); | 1211 | nr_reclaimed += shrink_zone(priority, zone, &sc); |
1191 | reclaim_state->reclaimed_slab = 0; | 1212 | reclaim_state->reclaimed_slab = 0; |
1192 | nr_slab = shrink_slab(sc.nr_scanned, GFP_KERNEL, | 1213 | nr_slab = shrink_slab(sc.nr_scanned, GFP_KERNEL, |
@@ -1226,10 +1247,15 @@ scan: | |||
1226 | break; | 1247 | break; |
1227 | } | 1248 | } |
1228 | out: | 1249 | out: |
1250 | /* | ||
1251 | * Note within each zone the priority level at which this zone was | ||
1252 | * brought into a happy state. So that the next thread which scans this | ||
1253 | * zone will start out at that priority level. | ||
1254 | */ | ||
1229 | for (i = 0; i < pgdat->nr_zones; i++) { | 1255 | for (i = 0; i < pgdat->nr_zones; i++) { |
1230 | struct zone *zone = pgdat->node_zones + i; | 1256 | struct zone *zone = pgdat->node_zones + i; |
1231 | 1257 | ||
1232 | zone->prev_priority = zone->temp_priority; | 1258 | zone->prev_priority = temp_priority[i]; |
1233 | } | 1259 | } |
1234 | if (!all_zones_ok) { | 1260 | if (!all_zones_ok) { |
1235 | cond_resched(); | 1261 | cond_resched(); |
@@ -1358,7 +1384,7 @@ static unsigned long shrink_all_zones(unsigned long nr_pages, int pass, | |||
1358 | if (zone->nr_scan_active >= nr_pages || pass > 3) { | 1384 | if (zone->nr_scan_active >= nr_pages || pass > 3) { |
1359 | zone->nr_scan_active = 0; | 1385 | zone->nr_scan_active = 0; |
1360 | nr_to_scan = min(nr_pages, zone->nr_active); | 1386 | nr_to_scan = min(nr_pages, zone->nr_active); |
1361 | shrink_active_list(nr_to_scan, zone, sc); | 1387 | shrink_active_list(nr_to_scan, zone, sc, prio); |
1362 | } | 1388 | } |
1363 | } | 1389 | } |
1364 | 1390 | ||
@@ -1614,6 +1640,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) | |||
1614 | */ | 1640 | */ |
1615 | priority = ZONE_RECLAIM_PRIORITY; | 1641 | priority = ZONE_RECLAIM_PRIORITY; |
1616 | do { | 1642 | do { |
1643 | note_zone_scanning_priority(zone, priority); | ||
1617 | nr_reclaimed += shrink_zone(priority, zone, &sc); | 1644 | nr_reclaimed += shrink_zone(priority, zone, &sc); |
1618 | priority--; | 1645 | priority--; |
1619 | } while (priority >= 0 && nr_reclaimed < nr_pages); | 1646 | } while (priority >= 0 && nr_reclaimed < nr_pages); |
diff --git a/mm/vmstat.c b/mm/vmstat.c index 45b124e012f5..8614e8f6743b 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c | |||
@@ -587,11 +587,9 @@ static int zoneinfo_show(struct seq_file *m, void *arg) | |||
587 | seq_printf(m, | 587 | seq_printf(m, |
588 | "\n all_unreclaimable: %u" | 588 | "\n all_unreclaimable: %u" |
589 | "\n prev_priority: %i" | 589 | "\n prev_priority: %i" |
590 | "\n temp_priority: %i" | ||
591 | "\n start_pfn: %lu", | 590 | "\n start_pfn: %lu", |
592 | zone->all_unreclaimable, | 591 | zone->all_unreclaimable, |
593 | zone->prev_priority, | 592 | zone->prev_priority, |
594 | zone->temp_priority, | ||
595 | zone->zone_start_pfn); | 593 | zone->zone_start_pfn); |
596 | spin_unlock_irqrestore(&zone->lock, flags); | 594 | spin_unlock_irqrestore(&zone->lock, flags); |
597 | seq_putc(m, '\n'); | 595 | seq_putc(m, '\n'); |
diff --git a/net/Kconfig b/net/Kconfig index a81aca43932f..67e39ad8b8b6 100644 --- a/net/Kconfig +++ b/net/Kconfig | |||
@@ -63,6 +63,7 @@ config INET | |||
63 | if INET | 63 | if INET |
64 | source "net/ipv4/Kconfig" | 64 | source "net/ipv4/Kconfig" |
65 | source "net/ipv6/Kconfig" | 65 | source "net/ipv6/Kconfig" |
66 | source "net/netlabel/Kconfig" | ||
66 | 67 | ||
67 | endif # if INET | 68 | endif # if INET |
68 | 69 | ||
@@ -249,8 +250,6 @@ source "net/ieee80211/Kconfig" | |||
249 | config WIRELESS_EXT | 250 | config WIRELESS_EXT |
250 | bool | 251 | bool |
251 | 252 | ||
252 | source "net/netlabel/Kconfig" | ||
253 | |||
254 | config FIB_RULES | 253 | config FIB_RULES |
255 | bool | 254 | bool |
256 | 255 | ||
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index 708e2e0371af..485e35c3b28b 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c | |||
@@ -1584,7 +1584,6 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr | |||
1584 | 1584 | ||
1585 | if (usat->sat_addr.s_net || usat->sat_addr.s_node == ATADDR_ANYNODE) { | 1585 | if (usat->sat_addr.s_net || usat->sat_addr.s_node == ATADDR_ANYNODE) { |
1586 | rt = atrtr_find(&usat->sat_addr); | 1586 | rt = atrtr_find(&usat->sat_addr); |
1587 | dev = rt->dev; | ||
1588 | } else { | 1587 | } else { |
1589 | struct atalk_addr at_hint; | 1588 | struct atalk_addr at_hint; |
1590 | 1589 | ||
@@ -1592,7 +1591,6 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr | |||
1592 | at_hint.s_net = at->src_net; | 1591 | at_hint.s_net = at->src_net; |
1593 | 1592 | ||
1594 | rt = atrtr_find(&at_hint); | 1593 | rt = atrtr_find(&at_hint); |
1595 | dev = rt->dev; | ||
1596 | } | 1594 | } |
1597 | if (!rt) | 1595 | if (!rt) |
1598 | return -ENETUNREACH; | 1596 | return -ENETUNREACH; |
diff --git a/net/atm/atm_sysfs.c b/net/atm/atm_sysfs.c index c0a4ae28fcfa..62f6ed1f2f98 100644 --- a/net/atm/atm_sysfs.c +++ b/net/atm/atm_sysfs.c | |||
@@ -141,7 +141,7 @@ static struct class atm_class = { | |||
141 | int atm_register_sysfs(struct atm_dev *adev) | 141 | int atm_register_sysfs(struct atm_dev *adev) |
142 | { | 142 | { |
143 | struct class_device *cdev = &adev->class_dev; | 143 | struct class_device *cdev = &adev->class_dev; |
144 | int i, err; | 144 | int i, j, err; |
145 | 145 | ||
146 | cdev->class = &atm_class; | 146 | cdev->class = &atm_class; |
147 | class_set_devdata(cdev, adev); | 147 | class_set_devdata(cdev, adev); |
@@ -151,10 +151,19 @@ int atm_register_sysfs(struct atm_dev *adev) | |||
151 | if (err < 0) | 151 | if (err < 0) |
152 | return err; | 152 | return err; |
153 | 153 | ||
154 | for (i = 0; atm_attrs[i]; i++) | 154 | for (i = 0; atm_attrs[i]; i++) { |
155 | class_device_create_file(cdev, atm_attrs[i]); | 155 | err = class_device_create_file(cdev, atm_attrs[i]); |
156 | if (err) | ||
157 | goto err_out; | ||
158 | } | ||
156 | 159 | ||
157 | return 0; | 160 | return 0; |
161 | |||
162 | err_out: | ||
163 | for (j = 0; j < i; j++) | ||
164 | class_device_remove_file(cdev, atm_attrs[j]); | ||
165 | class_device_del(cdev); | ||
166 | return err; | ||
158 | } | 167 | } |
159 | 168 | ||
160 | void atm_unregister_sysfs(struct atm_dev *adev) | 169 | void atm_unregister_sysfs(struct atm_dev *adev) |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 65f094845719..bb94e6da223c 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -57,6 +57,7 @@ | |||
57 | static void hci_cc_link_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb) | 57 | static void hci_cc_link_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb) |
58 | { | 58 | { |
59 | __u8 status; | 59 | __u8 status; |
60 | struct hci_conn *pend; | ||
60 | 61 | ||
61 | BT_DBG("%s ocf 0x%x", hdev->name, ocf); | 62 | BT_DBG("%s ocf 0x%x", hdev->name, ocf); |
62 | 63 | ||
@@ -71,6 +72,15 @@ static void hci_cc_link_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb | |||
71 | clear_bit(HCI_INQUIRY, &hdev->flags); | 72 | clear_bit(HCI_INQUIRY, &hdev->flags); |
72 | hci_req_complete(hdev, status); | 73 | hci_req_complete(hdev, status); |
73 | } | 74 | } |
75 | |||
76 | hci_dev_lock(hdev); | ||
77 | |||
78 | pend = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2); | ||
79 | if (pend) | ||
80 | hci_acl_connect(pend); | ||
81 | |||
82 | hci_dev_unlock(hdev); | ||
83 | |||
74 | break; | 84 | break; |
75 | 85 | ||
76 | default: | 86 | default: |
@@ -565,11 +575,20 @@ static void hci_cs_info_param(struct hci_dev *hdev, __u16 ocf, __u8 status) | |||
565 | static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) | 575 | static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) |
566 | { | 576 | { |
567 | __u8 status = *((__u8 *) skb->data); | 577 | __u8 status = *((__u8 *) skb->data); |
578 | struct hci_conn *pend; | ||
568 | 579 | ||
569 | BT_DBG("%s status %d", hdev->name, status); | 580 | BT_DBG("%s status %d", hdev->name, status); |
570 | 581 | ||
571 | clear_bit(HCI_INQUIRY, &hdev->flags); | 582 | clear_bit(HCI_INQUIRY, &hdev->flags); |
572 | hci_req_complete(hdev, status); | 583 | hci_req_complete(hdev, status); |
584 | |||
585 | hci_dev_lock(hdev); | ||
586 | |||
587 | pend = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2); | ||
588 | if (pend) | ||
589 | hci_acl_connect(pend); | ||
590 | |||
591 | hci_dev_unlock(hdev); | ||
573 | } | 592 | } |
574 | 593 | ||
575 | /* Inquiry Result */ | 594 | /* Inquiry Result */ |
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index f26a9eb49945..711a085eca5b 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
@@ -120,10 +120,13 @@ void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb) | |||
120 | if (!hci_test_bit(evt, &flt->event_mask)) | 120 | if (!hci_test_bit(evt, &flt->event_mask)) |
121 | continue; | 121 | continue; |
122 | 122 | ||
123 | if (flt->opcode && ((evt == HCI_EV_CMD_COMPLETE && | 123 | if (flt->opcode && |
124 | flt->opcode != *(__u16 *)(skb->data + 3)) || | 124 | ((evt == HCI_EV_CMD_COMPLETE && |
125 | (evt == HCI_EV_CMD_STATUS && | 125 | flt->opcode != |
126 | flt->opcode != *(__u16 *)(skb->data + 4)))) | 126 | get_unaligned((__u16 *)(skb->data + 3))) || |
127 | (evt == HCI_EV_CMD_STATUS && | ||
128 | flt->opcode != | ||
129 | get_unaligned((__u16 *)(skb->data + 4))))) | ||
127 | continue; | 130 | continue; |
128 | } | 131 | } |
129 | 132 | ||
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index 954eb74eb370..3eeeb7a86e75 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c | |||
@@ -259,7 +259,9 @@ void hci_conn_add_sysfs(struct hci_conn *conn) | |||
259 | 259 | ||
260 | BT_DBG("conn %p", conn); | 260 | BT_DBG("conn %p", conn); |
261 | 261 | ||
262 | conn->dev.parent = &hdev->dev; | 262 | conn->dev.bus = &bt_bus; |
263 | conn->dev.parent = &hdev->dev; | ||
264 | |||
263 | conn->dev.release = bt_release; | 265 | conn->dev.release = bt_release; |
264 | 266 | ||
265 | snprintf(conn->dev.bus_id, BUS_ID_SIZE, | 267 | snprintf(conn->dev.bus_id, BUS_ID_SIZE, |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 2b3dcb8f90fa..bbf78e6a7bc3 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
@@ -1353,12 +1353,12 @@ static inline int l2cap_conf_output(struct sock *sk, void **ptr) | |||
1353 | 1353 | ||
1354 | /* Configure output options and let the other side know | 1354 | /* Configure output options and let the other side know |
1355 | * which ones we don't like. */ | 1355 | * which ones we don't like. */ |
1356 | if (pi->conf_mtu < pi->omtu) { | 1356 | if (pi->conf_mtu < pi->omtu) |
1357 | l2cap_add_conf_opt(ptr, L2CAP_CONF_MTU, 2, pi->omtu); | ||
1358 | result = L2CAP_CONF_UNACCEPT; | 1357 | result = L2CAP_CONF_UNACCEPT; |
1359 | } else { | 1358 | else |
1360 | pi->omtu = pi->conf_mtu; | 1359 | pi->omtu = pi->conf_mtu; |
1361 | } | 1360 | |
1361 | l2cap_add_conf_opt(ptr, L2CAP_CONF_MTU, 2, pi->omtu); | ||
1362 | 1362 | ||
1363 | BT_DBG("sk %p result %d", sk, result); | 1363 | BT_DBG("sk %p result %d", sk, result); |
1364 | return result; | 1364 | return result; |
@@ -1533,6 +1533,9 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
1533 | if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid))) | 1533 | if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid))) |
1534 | return -ENOENT; | 1534 | return -ENOENT; |
1535 | 1535 | ||
1536 | if (sk->sk_state == BT_DISCONN) | ||
1537 | goto unlock; | ||
1538 | |||
1536 | l2cap_parse_conf_req(sk, req->data, cmd->len - sizeof(*req)); | 1539 | l2cap_parse_conf_req(sk, req->data, cmd->len - sizeof(*req)); |
1537 | 1540 | ||
1538 | if (flags & 0x0001) { | 1541 | if (flags & 0x0001) { |
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c index b8e3a5f1c8a8..1fb5d42f37ae 100644 --- a/net/bluetooth/rfcomm/tty.c +++ b/net/bluetooth/rfcomm/tty.c | |||
@@ -765,7 +765,7 @@ static void rfcomm_tty_set_termios(struct tty_struct *tty, struct termios *old) | |||
765 | 765 | ||
766 | BT_DBG("tty %p termios %p", tty, old); | 766 | BT_DBG("tty %p termios %p", tty, old); |
767 | 767 | ||
768 | if (!dev) | 768 | if (!dev || !dev->dlc || !dev->dlc->session) |
769 | return; | 769 | return; |
770 | 770 | ||
771 | /* Handle turning off CRTSCTS */ | 771 | /* Handle turning off CRTSCTS */ |
diff --git a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c index 4e4119a12139..4c61a7e0a86e 100644 --- a/net/bridge/br_ioctl.c +++ b/net/bridge/br_ioctl.c | |||
@@ -58,12 +58,13 @@ static int get_fdb_entries(struct net_bridge *br, void __user *userbuf, | |||
58 | { | 58 | { |
59 | int num; | 59 | int num; |
60 | void *buf; | 60 | void *buf; |
61 | size_t size = maxnum * sizeof(struct __fdb_entry); | 61 | size_t size; |
62 | 62 | ||
63 | if (size > PAGE_SIZE) { | 63 | /* Clamp size to PAGE_SIZE, test maxnum to avoid overflow */ |
64 | size = PAGE_SIZE; | 64 | if (maxnum > PAGE_SIZE/sizeof(struct __fdb_entry)) |
65 | maxnum = PAGE_SIZE/sizeof(struct __fdb_entry); | 65 | maxnum = PAGE_SIZE/sizeof(struct __fdb_entry); |
66 | } | 66 | |
67 | size = maxnum * sizeof(struct __fdb_entry); | ||
67 | 68 | ||
68 | buf = kmalloc(size, GFP_USER); | 69 | buf = kmalloc(size, GFP_USER); |
69 | if (!buf) | 70 | if (!buf) |
diff --git a/net/bridge/br_sysfs_br.c b/net/bridge/br_sysfs_br.c index 96bcb2ff59ab..de9d1a9473f2 100644 --- a/net/bridge/br_sysfs_br.c +++ b/net/bridge/br_sysfs_br.c | |||
@@ -376,7 +376,7 @@ int br_sysfs_addbr(struct net_device *dev) | |||
376 | 376 | ||
377 | err = sysfs_create_bin_file(brobj, &bridge_forward); | 377 | err = sysfs_create_bin_file(brobj, &bridge_forward); |
378 | if (err) { | 378 | if (err) { |
379 | pr_info("%s: can't create attribue file %s/%s\n", | 379 | pr_info("%s: can't create attribute file %s/%s\n", |
380 | __FUNCTION__, dev->name, bridge_forward.attr.name); | 380 | __FUNCTION__, dev->name, bridge_forward.attr.name); |
381 | goto out2; | 381 | goto out2; |
382 | } | 382 | } |
diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c index 3df55b2bd91d..9f85666f29f7 100644 --- a/net/bridge/netfilter/ebtables.c +++ b/net/bridge/netfilter/ebtables.c | |||
@@ -86,7 +86,7 @@ static inline int ebt_do_match (struct ebt_entry_match *m, | |||
86 | static inline int ebt_dev_check(char *entry, const struct net_device *device) | 86 | static inline int ebt_dev_check(char *entry, const struct net_device *device) |
87 | { | 87 | { |
88 | int i = 0; | 88 | int i = 0; |
89 | char *devname = device->name; | 89 | const char *devname = device->name; |
90 | 90 | ||
91 | if (*entry == '\0') | 91 | if (*entry == '\0') |
92 | return 0; | 92 | return 0; |
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 9308af060b44..6589adb14cbf 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
@@ -340,6 +340,12 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len) | |||
340 | udph->dest = htons(np->remote_port); | 340 | udph->dest = htons(np->remote_port); |
341 | udph->len = htons(udp_len); | 341 | udph->len = htons(udp_len); |
342 | udph->check = 0; | 342 | udph->check = 0; |
343 | udph->check = csum_tcpudp_magic(htonl(np->local_ip), | ||
344 | htonl(np->remote_ip), | ||
345 | udp_len, IPPROTO_UDP, | ||
346 | csum_partial((unsigned char *)udph, udp_len, 0)); | ||
347 | if (udph->check == 0) | ||
348 | udph->check = -1; | ||
343 | 349 | ||
344 | skb->nh.iph = iph = (struct iphdr *)skb_push(skb, sizeof(*iph)); | 350 | skb->nh.iph = iph = (struct iphdr *)skb_push(skb, sizeof(*iph)); |
345 | 351 | ||
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index dd023fd28304..733d86d0a4fb 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -2304,6 +2304,12 @@ static void mpls_push(__be32 *mpls, struct pktgen_dev *pkt_dev) | |||
2304 | *mpls |= MPLS_STACK_BOTTOM; | 2304 | *mpls |= MPLS_STACK_BOTTOM; |
2305 | } | 2305 | } |
2306 | 2306 | ||
2307 | static inline __be16 build_tci(unsigned int id, unsigned int cfi, | ||
2308 | unsigned int prio) | ||
2309 | { | ||
2310 | return htons(id | (cfi << 12) | (prio << 13)); | ||
2311 | } | ||
2312 | |||
2307 | static struct sk_buff *fill_packet_ipv4(struct net_device *odev, | 2313 | static struct sk_buff *fill_packet_ipv4(struct net_device *odev, |
2308 | struct pktgen_dev *pkt_dev) | 2314 | struct pktgen_dev *pkt_dev) |
2309 | { | 2315 | { |
@@ -2353,16 +2359,16 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, | |||
2353 | if (pkt_dev->vlan_id != 0xffff) { | 2359 | if (pkt_dev->vlan_id != 0xffff) { |
2354 | if(pkt_dev->svlan_id != 0xffff) { | 2360 | if(pkt_dev->svlan_id != 0xffff) { |
2355 | svlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); | 2361 | svlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); |
2356 | *svlan_tci = htons(pkt_dev->svlan_id); | 2362 | *svlan_tci = build_tci(pkt_dev->svlan_id, |
2357 | *svlan_tci |= pkt_dev->svlan_p << 5; | 2363 | pkt_dev->svlan_cfi, |
2358 | *svlan_tci |= pkt_dev->svlan_cfi << 4; | 2364 | pkt_dev->svlan_p); |
2359 | svlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); | 2365 | svlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); |
2360 | *svlan_encapsulated_proto = __constant_htons(ETH_P_8021Q); | 2366 | *svlan_encapsulated_proto = __constant_htons(ETH_P_8021Q); |
2361 | } | 2367 | } |
2362 | vlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); | 2368 | vlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); |
2363 | *vlan_tci = htons(pkt_dev->vlan_id); | 2369 | *vlan_tci = build_tci(pkt_dev->vlan_id, |
2364 | *vlan_tci |= pkt_dev->vlan_p << 5; | 2370 | pkt_dev->vlan_cfi, |
2365 | *vlan_tci |= pkt_dev->vlan_cfi << 4; | 2371 | pkt_dev->vlan_p); |
2366 | vlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); | 2372 | vlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); |
2367 | *vlan_encapsulated_proto = __constant_htons(ETH_P_IP); | 2373 | *vlan_encapsulated_proto = __constant_htons(ETH_P_IP); |
2368 | } | 2374 | } |
@@ -2689,16 +2695,16 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, | |||
2689 | if (pkt_dev->vlan_id != 0xffff) { | 2695 | if (pkt_dev->vlan_id != 0xffff) { |
2690 | if(pkt_dev->svlan_id != 0xffff) { | 2696 | if(pkt_dev->svlan_id != 0xffff) { |
2691 | svlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); | 2697 | svlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); |
2692 | *svlan_tci = htons(pkt_dev->svlan_id); | 2698 | *svlan_tci = build_tci(pkt_dev->svlan_id, |
2693 | *svlan_tci |= pkt_dev->svlan_p << 5; | 2699 | pkt_dev->svlan_cfi, |
2694 | *svlan_tci |= pkt_dev->svlan_cfi << 4; | 2700 | pkt_dev->svlan_p); |
2695 | svlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); | 2701 | svlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); |
2696 | *svlan_encapsulated_proto = __constant_htons(ETH_P_8021Q); | 2702 | *svlan_encapsulated_proto = __constant_htons(ETH_P_8021Q); |
2697 | } | 2703 | } |
2698 | vlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); | 2704 | vlan_tci = (__be16 *)skb_put(skb, sizeof(__be16)); |
2699 | *vlan_tci = htons(pkt_dev->vlan_id); | 2705 | *vlan_tci = build_tci(pkt_dev->vlan_id, |
2700 | *vlan_tci |= pkt_dev->vlan_p << 5; | 2706 | pkt_dev->vlan_cfi, |
2701 | *vlan_tci |= pkt_dev->vlan_cfi << 4; | 2707 | pkt_dev->vlan_p); |
2702 | vlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); | 2708 | vlan_encapsulated_proto = (__be16 *)skb_put(skb, sizeof(__be16)); |
2703 | *vlan_encapsulated_proto = __constant_htons(ETH_P_IPV6); | 2709 | *vlan_encapsulated_proto = __constant_htons(ETH_P_IPV6); |
2704 | } | 2710 | } |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 3c23760c5827..b8b106358040 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -639,6 +639,7 @@ struct sk_buff *pskb_copy(struct sk_buff *skb, gfp_t gfp_mask) | |||
639 | n->csum = skb->csum; | 639 | n->csum = skb->csum; |
640 | n->ip_summed = skb->ip_summed; | 640 | n->ip_summed = skb->ip_summed; |
641 | 641 | ||
642 | n->truesize += skb->data_len; | ||
642 | n->data_len = skb->data_len; | 643 | n->data_len = skb->data_len; |
643 | n->len = skb->len; | 644 | n->len = skb->len; |
644 | 645 | ||
@@ -1946,7 +1947,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features) | |||
1946 | do { | 1947 | do { |
1947 | struct sk_buff *nskb; | 1948 | struct sk_buff *nskb; |
1948 | skb_frag_t *frag; | 1949 | skb_frag_t *frag; |
1949 | int hsize, nsize; | 1950 | int hsize; |
1950 | int k; | 1951 | int k; |
1951 | int size; | 1952 | int size; |
1952 | 1953 | ||
@@ -1957,11 +1958,10 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features) | |||
1957 | hsize = skb_headlen(skb) - offset; | 1958 | hsize = skb_headlen(skb) - offset; |
1958 | if (hsize < 0) | 1959 | if (hsize < 0) |
1959 | hsize = 0; | 1960 | hsize = 0; |
1960 | nsize = hsize + doffset; | 1961 | if (hsize > len || !sg) |
1961 | if (nsize > len + doffset || !sg) | 1962 | hsize = len; |
1962 | nsize = len + doffset; | ||
1963 | 1963 | ||
1964 | nskb = alloc_skb(nsize + headroom, GFP_ATOMIC); | 1964 | nskb = alloc_skb(hsize + doffset + headroom, GFP_ATOMIC); |
1965 | if (unlikely(!nskb)) | 1965 | if (unlikely(!nskb)) |
1966 | goto err; | 1966 | goto err; |
1967 | 1967 | ||
diff --git a/net/core/sock.c b/net/core/sock.c index d472db4776c3..ee6cd2541d35 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -1160,7 +1160,7 @@ static struct sk_buff *sock_alloc_send_pskb(struct sock *sk, | |||
1160 | goto failure; | 1160 | goto failure; |
1161 | 1161 | ||
1162 | if (atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) { | 1162 | if (atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) { |
1163 | skb = alloc_skb(header_len, sk->sk_allocation); | 1163 | skb = alloc_skb(header_len, gfp_mask); |
1164 | if (skb) { | 1164 | if (skb) { |
1165 | int npages; | 1165 | int npages; |
1166 | int i; | 1166 | int i; |
diff --git a/net/core/wireless.c b/net/core/wireless.c index ffff0da46c6e..cb1b8728d7ee 100644 --- a/net/core/wireless.c +++ b/net/core/wireless.c | |||
@@ -748,11 +748,39 @@ static int ioctl_standard_call(struct net_device * dev, | |||
748 | int extra_size; | 748 | int extra_size; |
749 | int user_length = 0; | 749 | int user_length = 0; |
750 | int err; | 750 | int err; |
751 | int essid_compat = 0; | ||
751 | 752 | ||
752 | /* Calculate space needed by arguments. Always allocate | 753 | /* Calculate space needed by arguments. Always allocate |
753 | * for max space. Easier, and won't last long... */ | 754 | * for max space. Easier, and won't last long... */ |
754 | extra_size = descr->max_tokens * descr->token_size; | 755 | extra_size = descr->max_tokens * descr->token_size; |
755 | 756 | ||
757 | /* Check need for ESSID compatibility for WE < 21 */ | ||
758 | switch (cmd) { | ||
759 | case SIOCSIWESSID: | ||
760 | case SIOCGIWESSID: | ||
761 | case SIOCSIWNICKN: | ||
762 | case SIOCGIWNICKN: | ||
763 | if (iwr->u.data.length == descr->max_tokens + 1) | ||
764 | essid_compat = 1; | ||
765 | else if (IW_IS_SET(cmd) && (iwr->u.data.length != 0)) { | ||
766 | char essid[IW_ESSID_MAX_SIZE + 1]; | ||
767 | |||
768 | err = copy_from_user(essid, iwr->u.data.pointer, | ||
769 | iwr->u.data.length * | ||
770 | descr->token_size); | ||
771 | if (err) | ||
772 | return -EFAULT; | ||
773 | |||
774 | if (essid[iwr->u.data.length - 1] == '\0') | ||
775 | essid_compat = 1; | ||
776 | } | ||
777 | break; | ||
778 | default: | ||
779 | break; | ||
780 | } | ||
781 | |||
782 | iwr->u.data.length -= essid_compat; | ||
783 | |||
756 | /* Check what user space is giving us */ | 784 | /* Check what user space is giving us */ |
757 | if(IW_IS_SET(cmd)) { | 785 | if(IW_IS_SET(cmd)) { |
758 | /* Check NULL pointer */ | 786 | /* Check NULL pointer */ |
@@ -795,7 +823,8 @@ static int ioctl_standard_call(struct net_device * dev, | |||
795 | #endif /* WE_IOCTL_DEBUG */ | 823 | #endif /* WE_IOCTL_DEBUG */ |
796 | 824 | ||
797 | /* Create the kernel buffer */ | 825 | /* Create the kernel buffer */ |
798 | extra = kmalloc(extra_size, GFP_KERNEL); | 826 | /* kzalloc ensures NULL-termination for essid_compat */ |
827 | extra = kzalloc(extra_size, GFP_KERNEL); | ||
799 | if (extra == NULL) { | 828 | if (extra == NULL) { |
800 | return -ENOMEM; | 829 | return -ENOMEM; |
801 | } | 830 | } |
@@ -819,6 +848,8 @@ static int ioctl_standard_call(struct net_device * dev, | |||
819 | /* Call the handler */ | 848 | /* Call the handler */ |
820 | ret = handler(dev, &info, &(iwr->u), extra); | 849 | ret = handler(dev, &info, &(iwr->u), extra); |
821 | 850 | ||
851 | iwr->u.data.length += essid_compat; | ||
852 | |||
822 | /* If we have something to return to the user */ | 853 | /* If we have something to return to the user */ |
823 | if (!ret && IW_IS_GET(cmd)) { | 854 | if (!ret && IW_IS_GET(cmd)) { |
824 | /* Check if there is enough buffer up there */ | 855 | /* Check if there is enough buffer up there */ |
diff --git a/net/dccp/Kconfig b/net/dccp/Kconfig index e2a095d0fd80..ef8919cca74b 100644 --- a/net/dccp/Kconfig +++ b/net/dccp/Kconfig | |||
@@ -4,15 +4,15 @@ menu "DCCP Configuration (EXPERIMENTAL)" | |||
4 | config IP_DCCP | 4 | config IP_DCCP |
5 | tristate "The DCCP Protocol (EXPERIMENTAL)" | 5 | tristate "The DCCP Protocol (EXPERIMENTAL)" |
6 | ---help--- | 6 | ---help--- |
7 | Datagram Congestion Control Protocol | 7 | Datagram Congestion Control Protocol (RFC 4340) |
8 | 8 | ||
9 | From draft-ietf-dccp-spec-11 <http://www.icir.org/kohler/dcp/draft-ietf-dccp-spec-11.txt>. | 9 | From http://www.ietf.org/rfc/rfc4340.txt: |
10 | 10 | ||
11 | The Datagram Congestion Control Protocol (DCCP) is a transport | 11 | The Datagram Congestion Control Protocol (DCCP) is a transport |
12 | protocol that implements bidirectional, unicast connections of | 12 | protocol that implements bidirectional, unicast connections of |
13 | congestion-controlled, unreliable datagrams. It should be suitable | 13 | congestion-controlled, unreliable datagrams. It should be suitable |
14 | for use by applications such as streaming media, Internet telephony, | 14 | for use by applications such as streaming media, Internet telephony, |
15 | and on-line games | 15 | and on-line games. |
16 | 16 | ||
17 | To compile this protocol support as a module, choose M here: the | 17 | To compile this protocol support as a module, choose M here: the |
18 | module will be called dccp. | 18 | module will be called dccp. |
diff --git a/net/dccp/ackvec.c b/net/dccp/ackvec.c index 4d176d33983f..f8208874ac7d 100644 --- a/net/dccp/ackvec.c +++ b/net/dccp/ackvec.c | |||
@@ -113,7 +113,7 @@ int dccp_insert_option_ackvec(struct sock *sk, struct sk_buff *skb) | |||
113 | 113 | ||
114 | memcpy(to, from, len); | 114 | memcpy(to, from, len); |
115 | /* | 115 | /* |
116 | * From draft-ietf-dccp-spec-11.txt: | 116 | * From RFC 4340, A.2: |
117 | * | 117 | * |
118 | * For each acknowledgement it sends, the HC-Receiver will add an | 118 | * For each acknowledgement it sends, the HC-Receiver will add an |
119 | * acknowledgement record. ack_seqno will equal the HC-Receiver | 119 | * acknowledgement record. ack_seqno will equal the HC-Receiver |
@@ -224,7 +224,7 @@ static inline int dccp_ackvec_set_buf_head_state(struct dccp_ackvec *av, | |||
224 | } | 224 | } |
225 | 225 | ||
226 | /* | 226 | /* |
227 | * Implements the draft-ietf-dccp-spec-11.txt Appendix A | 227 | * Implements the RFC 4340, Appendix A |
228 | */ | 228 | */ |
229 | int dccp_ackvec_add(struct dccp_ackvec *av, const struct sock *sk, | 229 | int dccp_ackvec_add(struct dccp_ackvec *av, const struct sock *sk, |
230 | const u64 ackno, const u8 state) | 230 | const u64 ackno, const u8 state) |
@@ -237,7 +237,7 @@ int dccp_ackvec_add(struct dccp_ackvec *av, const struct sock *sk, | |||
237 | * We may well decide to do buffer compression, etc, but for now lets | 237 | * We may well decide to do buffer compression, etc, but for now lets |
238 | * just drop. | 238 | * just drop. |
239 | * | 239 | * |
240 | * From Appendix A: | 240 | * From Appendix A.1.1 (`New Packets'): |
241 | * | 241 | * |
242 | * Of course, the circular buffer may overflow, either when the | 242 | * Of course, the circular buffer may overflow, either when the |
243 | * HC-Sender is sending data at a very high rate, when the | 243 | * HC-Sender is sending data at a very high rate, when the |
@@ -274,9 +274,9 @@ int dccp_ackvec_add(struct dccp_ackvec *av, const struct sock *sk, | |||
274 | /* | 274 | /* |
275 | * A.1.2. Old Packets | 275 | * A.1.2. Old Packets |
276 | * | 276 | * |
277 | * When a packet with Sequence Number S arrives, and | 277 | * When a packet with Sequence Number S <= buf_ackno |
278 | * S <= buf_ackno, the HC-Receiver will scan the table | 278 | * arrives, the HC-Receiver will scan the table for |
279 | * for the byte corresponding to S. (Indexing structures | 279 | * the byte corresponding to S. (Indexing structures |
280 | * could reduce the complexity of this scan.) | 280 | * could reduce the complexity of this scan.) |
281 | */ | 281 | */ |
282 | u64 delta = dccp_delta_seqno(ackno, av->dccpav_buf_ackno); | 282 | u64 delta = dccp_delta_seqno(ackno, av->dccpav_buf_ackno); |
diff --git a/net/dccp/ackvec.h b/net/dccp/ackvec.h index 2424effac7f6..cf8f20ce23a9 100644 --- a/net/dccp/ackvec.h +++ b/net/dccp/ackvec.h | |||
@@ -28,8 +28,7 @@ | |||
28 | 28 | ||
29 | /** struct dccp_ackvec - ack vector | 29 | /** struct dccp_ackvec - ack vector |
30 | * | 30 | * |
31 | * This data structure is the one defined in the DCCP draft | 31 | * This data structure is the one defined in RFC 4340, Appendix A. |
32 | * Appendix A. | ||
33 | * | 32 | * |
34 | * @dccpav_buf_head - circular buffer head | 33 | * @dccpav_buf_head - circular buffer head |
35 | * @dccpav_buf_tail - circular buffer tail | 34 | * @dccpav_buf_tail - circular buffer tail |
diff --git a/net/dccp/ccids/Kconfig b/net/dccp/ccids/Kconfig index 32752f750447..8533dabfb9f8 100644 --- a/net/dccp/ccids/Kconfig +++ b/net/dccp/ccids/Kconfig | |||
@@ -22,11 +22,11 @@ config IP_DCCP_CCID2 | |||
22 | for lost packets, would prefer CCID 2 to CCID 3. On-line games may | 22 | for lost packets, would prefer CCID 2 to CCID 3. On-line games may |
23 | also prefer CCID 2. | 23 | also prefer CCID 2. |
24 | 24 | ||
25 | CCID 2 is further described in: | 25 | CCID 2 is further described in RFC 4341, |
26 | http://www.icir.org/kohler/dccp/draft-ietf-dccp-ccid2-10.txt | 26 | http://www.ietf.org/rfc/rfc4341.txt |
27 | 27 | ||
28 | This text was extracted from: | 28 | This text was extracted from RFC 4340 (sec. 10.1), |
29 | http://www.icir.org/kohler/dccp/draft-ietf-dccp-spec-13.txt | 29 | http://www.ietf.org/rfc/rfc4340.txt |
30 | 30 | ||
31 | If in doubt, say M. | 31 | If in doubt, say M. |
32 | 32 | ||
@@ -53,15 +53,14 @@ config IP_DCCP_CCID3 | |||
53 | suitable than CCID 2 for applications such streaming media where a | 53 | suitable than CCID 2 for applications such streaming media where a |
54 | relatively smooth sending rate is of importance. | 54 | relatively smooth sending rate is of importance. |
55 | 55 | ||
56 | CCID 3 is further described in: | 56 | CCID 3 is further described in RFC 4342, |
57 | 57 | http://www.ietf.org/rfc/rfc4342.txt | |
58 | http://www.icir.org/kohler/dccp/draft-ietf-dccp-ccid3-11.txt. | ||
59 | 58 | ||
60 | The TFRC congestion control algorithms were initially described in | 59 | The TFRC congestion control algorithms were initially described in |
61 | RFC 3448. | 60 | RFC 3448. |
62 | 61 | ||
63 | This text was extracted from: | 62 | This text was extracted from RFC 4340 (sec. 10.2), |
64 | http://www.icir.org/kohler/dccp/draft-ietf-dccp-spec-13.txt | 63 | http://www.ietf.org/rfc/rfc4340.txt |
65 | 64 | ||
66 | If in doubt, say M. | 65 | If in doubt, say M. |
67 | 66 | ||
diff --git a/net/dccp/ccids/ccid2.c b/net/dccp/ccids/ccid2.c index 2efb505aeb35..162032baeac0 100644 --- a/net/dccp/ccids/ccid2.c +++ b/net/dccp/ccids/ccid2.c | |||
@@ -23,7 +23,7 @@ | |||
23 | */ | 23 | */ |
24 | 24 | ||
25 | /* | 25 | /* |
26 | * This implementation should follow: draft-ietf-dccp-ccid2-10.txt | 26 | * This implementation should follow RFC 4341 |
27 | * | 27 | * |
28 | * BUGS: | 28 | * BUGS: |
29 | * - sequence number wrapping | 29 | * - sequence number wrapping |
@@ -352,14 +352,14 @@ static void ccid2_hc_tx_packet_sent(struct sock *sk, int more, int len) | |||
352 | 352 | ||
353 | #ifdef CONFIG_IP_DCCP_CCID2_DEBUG | 353 | #ifdef CONFIG_IP_DCCP_CCID2_DEBUG |
354 | ccid2_pr_debug("pipe=%d\n", hctx->ccid2hctx_pipe); | 354 | ccid2_pr_debug("pipe=%d\n", hctx->ccid2hctx_pipe); |
355 | ccid2_pr_debug("Sent: seq=%llu\n", seq); | 355 | ccid2_pr_debug("Sent: seq=%llu\n", (unsigned long long)seq); |
356 | do { | 356 | do { |
357 | struct ccid2_seq *seqp = hctx->ccid2hctx_seqt; | 357 | struct ccid2_seq *seqp = hctx->ccid2hctx_seqt; |
358 | 358 | ||
359 | while (seqp != hctx->ccid2hctx_seqh) { | 359 | while (seqp != hctx->ccid2hctx_seqh) { |
360 | ccid2_pr_debug("out seq=%llu acked=%d time=%lu\n", | 360 | ccid2_pr_debug("out seq=%llu acked=%d time=%lu\n", |
361 | seqp->ccid2s_seq, seqp->ccid2s_acked, | 361 | (unsigned long long)seqp->ccid2s_seq, |
362 | seqp->ccid2s_sent); | 362 | seqp->ccid2s_acked, seqp->ccid2s_sent); |
363 | seqp = seqp->ccid2s_next; | 363 | seqp = seqp->ccid2s_next; |
364 | } | 364 | } |
365 | } while (0); | 365 | } while (0); |
@@ -480,7 +480,8 @@ static inline void ccid2_new_ack(struct sock *sk, | |||
480 | /* first measurement */ | 480 | /* first measurement */ |
481 | if (hctx->ccid2hctx_srtt == -1) { | 481 | if (hctx->ccid2hctx_srtt == -1) { |
482 | ccid2_pr_debug("R: %lu Time=%lu seq=%llu\n", | 482 | ccid2_pr_debug("R: %lu Time=%lu seq=%llu\n", |
483 | r, jiffies, seqp->ccid2s_seq); | 483 | r, jiffies, |
484 | (unsigned long long)seqp->ccid2s_seq); | ||
484 | ccid2_change_srtt(hctx, r); | 485 | ccid2_change_srtt(hctx, r); |
485 | hctx->ccid2hctx_rttvar = r >> 1; | 486 | hctx->ccid2hctx_rttvar = r >> 1; |
486 | } else { | 487 | } else { |
@@ -636,8 +637,9 @@ static void ccid2_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) | |||
636 | u64 ackno_end_rl; | 637 | u64 ackno_end_rl; |
637 | 638 | ||
638 | dccp_set_seqno(&ackno_end_rl, ackno - rl); | 639 | dccp_set_seqno(&ackno_end_rl, ackno - rl); |
639 | ccid2_pr_debug("ackvec start:%llu end:%llu\n", ackno, | 640 | ccid2_pr_debug("ackvec start:%llu end:%llu\n", |
640 | ackno_end_rl); | 641 | (unsigned long long)ackno, |
642 | (unsigned long long)ackno_end_rl); | ||
641 | /* if the seqno we are analyzing is larger than the | 643 | /* if the seqno we are analyzing is larger than the |
642 | * current ackno, then move towards the tail of our | 644 | * current ackno, then move towards the tail of our |
643 | * seqnos. | 645 | * seqnos. |
@@ -672,7 +674,7 @@ static void ccid2_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) | |||
672 | 674 | ||
673 | seqp->ccid2s_acked = 1; | 675 | seqp->ccid2s_acked = 1; |
674 | ccid2_pr_debug("Got ack for %llu\n", | 676 | ccid2_pr_debug("Got ack for %llu\n", |
675 | seqp->ccid2s_seq); | 677 | (unsigned long long)seqp->ccid2s_seq); |
676 | ccid2_hc_tx_dec_pipe(sk); | 678 | ccid2_hc_tx_dec_pipe(sk); |
677 | } | 679 | } |
678 | if (seqp == hctx->ccid2hctx_seqt) { | 680 | if (seqp == hctx->ccid2hctx_seqt) { |
@@ -718,7 +720,7 @@ static void ccid2_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) | |||
718 | while (1) { | 720 | while (1) { |
719 | if (!seqp->ccid2s_acked) { | 721 | if (!seqp->ccid2s_acked) { |
720 | ccid2_pr_debug("Packet lost: %llu\n", | 722 | ccid2_pr_debug("Packet lost: %llu\n", |
721 | seqp->ccid2s_seq); | 723 | (unsigned long long)seqp->ccid2s_seq); |
722 | /* XXX need to traverse from tail -> head in | 724 | /* XXX need to traverse from tail -> head in |
723 | * order to detect multiple congestion events in | 725 | * order to detect multiple congestion events in |
724 | * one ack vector. | 726 | * one ack vector. |
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c index 67d2dc0e7c67..cec23ad286de 100644 --- a/net/dccp/ccids/ccid3.c +++ b/net/dccp/ccids/ccid3.c | |||
@@ -379,8 +379,7 @@ static void ccid3_hc_tx_packet_sent(struct sock *sk, int more, int len) | |||
379 | packet->dccphtx_seqno = dp->dccps_gss; | 379 | packet->dccphtx_seqno = dp->dccps_gss; |
380 | /* | 380 | /* |
381 | * Check if win_count have changed | 381 | * Check if win_count have changed |
382 | * Algorithm in "8.1. Window Counter Valuer" in | 382 | * Algorithm in "8.1. Window Counter Value" in RFC 4342. |
383 | * draft-ietf-dccp-ccid3-11.txt | ||
384 | */ | 383 | */ |
385 | quarter_rtt = timeval_delta(&now, &hctx->ccid3hctx_t_last_win_count); | 384 | quarter_rtt = timeval_delta(&now, &hctx->ccid3hctx_t_last_win_count); |
386 | if (likely(hctx->ccid3hctx_rtt > 8)) | 385 | if (likely(hctx->ccid3hctx_rtt > 8)) |
diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h index 0a21be437ed3..272e8584564e 100644 --- a/net/dccp/dccp.h +++ b/net/dccp/dccp.h | |||
@@ -50,7 +50,7 @@ extern void dccp_time_wait(struct sock *sk, int state, int timeo); | |||
50 | #define DCCP_TIMEWAIT_LEN (60 * HZ) /* how long to wait to destroy TIME-WAIT | 50 | #define DCCP_TIMEWAIT_LEN (60 * HZ) /* how long to wait to destroy TIME-WAIT |
51 | * state, about 60 seconds */ | 51 | * state, about 60 seconds */ |
52 | 52 | ||
53 | /* draft-ietf-dccp-spec-11.txt initial RTO value */ | 53 | /* RFC 1122, 4.2.3.1 initial RTO value */ |
54 | #define DCCP_TIMEOUT_INIT ((unsigned)(3 * HZ)) | 54 | #define DCCP_TIMEOUT_INIT ((unsigned)(3 * HZ)) |
55 | 55 | ||
56 | /* Maximal interval between probes for local resources. */ | 56 | /* Maximal interval between probes for local resources. */ |
diff --git a/net/dccp/input.c b/net/dccp/input.c index 7f9dc6ac58c9..1d24881ac0ab 100644 --- a/net/dccp/input.c +++ b/net/dccp/input.c | |||
@@ -216,11 +216,11 @@ send_sync: | |||
216 | dccp_send_sync(sk, DCCP_SKB_CB(skb)->dccpd_seq, | 216 | dccp_send_sync(sk, DCCP_SKB_CB(skb)->dccpd_seq, |
217 | DCCP_PKT_SYNCACK); | 217 | DCCP_PKT_SYNCACK); |
218 | /* | 218 | /* |
219 | * From the draft: | 219 | * From RFC 4340, sec. 5.7 |
220 | * | 220 | * |
221 | * As with DCCP-Ack packets, DCCP-Sync and DCCP-SyncAck packets | 221 | * As with DCCP-Ack packets, DCCP-Sync and DCCP-SyncAck packets |
222 | * MAY have non-zero-length application data areas, whose | 222 | * MAY have non-zero-length application data areas, whose |
223 | * contents * receivers MUST ignore. | 223 | * contents receivers MUST ignore. |
224 | */ | 224 | */ |
225 | goto discard; | 225 | goto discard; |
226 | } | 226 | } |
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index 7e746c4c1688..e08e7688a263 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c | |||
@@ -183,7 +183,7 @@ static inline void dccp_do_pmtu_discovery(struct sock *sk, | |||
183 | dccp_sync_mss(sk, mtu); | 183 | dccp_sync_mss(sk, mtu); |
184 | 184 | ||
185 | /* | 185 | /* |
186 | * From: draft-ietf-dccp-spec-11.txt | 186 | * From RFC 4340, sec. 14.1: |
187 | * | 187 | * |
188 | * DCCP-Sync packets are the best choice for upward | 188 | * DCCP-Sync packets are the best choice for upward |
189 | * probing, since DCCP-Sync probes do not risk application | 189 | * probing, since DCCP-Sync probes do not risk application |
@@ -449,6 +449,8 @@ static inline u64 dccp_v4_init_sequence(const struct sock *sk, | |||
449 | dccp_hdr(skb)->dccph_sport); | 449 | dccp_hdr(skb)->dccph_sport); |
450 | } | 450 | } |
451 | 451 | ||
452 | static struct request_sock_ops dccp_request_sock_ops; | ||
453 | |||
452 | int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb) | 454 | int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb) |
453 | { | 455 | { |
454 | struct inet_request_sock *ireq; | 456 | struct inet_request_sock *ireq; |
@@ -489,7 +491,7 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb) | |||
489 | if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) | 491 | if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) |
490 | goto drop; | 492 | goto drop; |
491 | 493 | ||
492 | req = reqsk_alloc(sk->sk_prot->rsk_prot); | 494 | req = reqsk_alloc(&dccp_request_sock_ops); |
493 | if (req == NULL) | 495 | if (req == NULL) |
494 | goto drop; | 496 | goto drop; |
495 | 497 | ||
@@ -731,7 +733,7 @@ static void dccp_v4_ctl_send_reset(struct sk_buff *rxskb) | |||
731 | dccp_hdr_reset(skb)->dccph_reset_code = | 733 | dccp_hdr_reset(skb)->dccph_reset_code = |
732 | DCCP_SKB_CB(rxskb)->dccpd_reset_code; | 734 | DCCP_SKB_CB(rxskb)->dccpd_reset_code; |
733 | 735 | ||
734 | /* See "8.3.1. Abnormal Termination" in draft-ietf-dccp-spec-11 */ | 736 | /* See "8.3.1. Abnormal Termination" in RFC 4340 */ |
735 | seqno = 0; | 737 | seqno = 0; |
736 | if (DCCP_SKB_CB(rxskb)->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ) | 738 | if (DCCP_SKB_CB(rxskb)->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ) |
737 | dccp_set_seqno(&seqno, DCCP_SKB_CB(rxskb)->dccpd_ack_seq + 1); | 739 | dccp_set_seqno(&seqno, DCCP_SKB_CB(rxskb)->dccpd_ack_seq + 1); |
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index 7171a78671aa..fc4242c0767c 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c | |||
@@ -277,7 +277,7 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
277 | __u64 seq; | 277 | __u64 seq; |
278 | 278 | ||
279 | sk = inet6_lookup(&dccp_hashinfo, &hdr->daddr, dh->dccph_dport, | 279 | sk = inet6_lookup(&dccp_hashinfo, &hdr->daddr, dh->dccph_dport, |
280 | &hdr->saddr, dh->dccph_sport, skb->dev->ifindex); | 280 | &hdr->saddr, dh->dccph_sport, inet6_iif(skb)); |
281 | 281 | ||
282 | if (sk == NULL) { | 282 | if (sk == NULL) { |
283 | ICMP6_INC_STATS_BH(__in6_dev_get(skb->dev), ICMP6_MIB_INERRORS); | 283 | ICMP6_INC_STATS_BH(__in6_dev_get(skb->dev), ICMP6_MIB_INERRORS); |
@@ -550,7 +550,7 @@ static void dccp_v6_ctl_send_reset(struct sk_buff *rxskb) | |||
550 | dccp_hdr_reset(skb)->dccph_reset_code = | 550 | dccp_hdr_reset(skb)->dccph_reset_code = |
551 | DCCP_SKB_CB(rxskb)->dccpd_reset_code; | 551 | DCCP_SKB_CB(rxskb)->dccpd_reset_code; |
552 | 552 | ||
553 | /* See "8.3.1. Abnormal Termination" in draft-ietf-dccp-spec-11 */ | 553 | /* See "8.3.1. Abnormal Termination" in RFC 4340 */ |
554 | seqno = 0; | 554 | seqno = 0; |
555 | if (DCCP_SKB_CB(rxskb)->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ) | 555 | if (DCCP_SKB_CB(rxskb)->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ) |
556 | dccp_set_seqno(&seqno, DCCP_SKB_CB(rxskb)->dccpd_ack_seq + 1); | 556 | dccp_set_seqno(&seqno, DCCP_SKB_CB(rxskb)->dccpd_ack_seq + 1); |
@@ -672,7 +672,6 @@ static struct sock *dccp_v6_hnd_req(struct sock *sk,struct sk_buff *skb) | |||
672 | 672 | ||
673 | static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | 673 | static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb) |
674 | { | 674 | { |
675 | struct inet_request_sock *ireq; | ||
676 | struct dccp_sock dp; | 675 | struct dccp_sock dp; |
677 | struct request_sock *req; | 676 | struct request_sock *req; |
678 | struct dccp_request_sock *dreq; | 677 | struct dccp_request_sock *dreq; |
@@ -701,7 +700,7 @@ static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | |||
701 | if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) | 700 | if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) |
702 | goto drop; | 701 | goto drop; |
703 | 702 | ||
704 | req = inet6_reqsk_alloc(sk->sk_prot->rsk_prot); | 703 | req = inet6_reqsk_alloc(&dccp6_request_sock_ops); |
705 | if (req == NULL) | 704 | if (req == NULL) |
706 | goto drop; | 705 | goto drop; |
707 | 706 | ||
@@ -713,7 +712,6 @@ static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | |||
713 | goto drop_and_free; | 712 | goto drop_and_free; |
714 | 713 | ||
715 | ireq6 = inet6_rsk(req); | 714 | ireq6 = inet6_rsk(req); |
716 | ireq = inet_rsk(req); | ||
717 | ipv6_addr_copy(&ireq6->rmt_addr, &skb->nh.ipv6h->saddr); | 715 | ipv6_addr_copy(&ireq6->rmt_addr, &skb->nh.ipv6h->saddr); |
718 | ipv6_addr_copy(&ireq6->loc_addr, &skb->nh.ipv6h->daddr); | 716 | ipv6_addr_copy(&ireq6->loc_addr, &skb->nh.ipv6h->daddr); |
719 | req->rcv_wnd = dccp_feat_default_sequence_window; | 717 | req->rcv_wnd = dccp_feat_default_sequence_window; |
@@ -997,6 +995,10 @@ static int dccp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
997 | if (sk->sk_state == DCCP_OPEN) { /* Fast path */ | 995 | if (sk->sk_state == DCCP_OPEN) { /* Fast path */ |
998 | if (dccp_rcv_established(sk, skb, dccp_hdr(skb), skb->len)) | 996 | if (dccp_rcv_established(sk, skb, dccp_hdr(skb), skb->len)) |
999 | goto reset; | 997 | goto reset; |
998 | if (opt_skb) { | ||
999 | /* This is where we would goto ipv6_pktoptions. */ | ||
1000 | __kfree_skb(opt_skb); | ||
1001 | } | ||
1000 | return 0; | 1002 | return 0; |
1001 | } | 1003 | } |
1002 | 1004 | ||
@@ -1021,6 +1023,10 @@ static int dccp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
1021 | 1023 | ||
1022 | if (dccp_rcv_state_process(sk, skb, dccp_hdr(skb), skb->len)) | 1024 | if (dccp_rcv_state_process(sk, skb, dccp_hdr(skb), skb->len)) |
1023 | goto reset; | 1025 | goto reset; |
1026 | if (opt_skb) { | ||
1027 | /* This is where we would goto ipv6_pktoptions. */ | ||
1028 | __kfree_skb(opt_skb); | ||
1029 | } | ||
1024 | return 0; | 1030 | return 0; |
1025 | 1031 | ||
1026 | reset: | 1032 | reset: |
diff --git a/net/dccp/options.c b/net/dccp/options.c index 07a34696ac97..fb0db1f7cd7b 100644 --- a/net/dccp/options.c +++ b/net/dccp/options.c | |||
@@ -215,7 +215,7 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb) | |||
215 | elapsed_time); | 215 | elapsed_time); |
216 | break; | 216 | break; |
217 | /* | 217 | /* |
218 | * From draft-ietf-dccp-spec-11.txt: | 218 | * From RFC 4340, sec. 10.3: |
219 | * | 219 | * |
220 | * Option numbers 128 through 191 are for | 220 | * Option numbers 128 through 191 are for |
221 | * options sent from the HC-Sender to the | 221 | * options sent from the HC-Sender to the |
diff --git a/net/dccp/probe.c b/net/dccp/probe.c index 146496fce2e2..fded1493c1dc 100644 --- a/net/dccp/probe.c +++ b/net/dccp/probe.c | |||
@@ -160,6 +160,8 @@ static __init int dccpprobe_init(void) | |||
160 | init_waitqueue_head(&dccpw.wait); | 160 | init_waitqueue_head(&dccpw.wait); |
161 | spin_lock_init(&dccpw.lock); | 161 | spin_lock_init(&dccpw.lock); |
162 | dccpw.fifo = kfifo_alloc(bufsize, GFP_KERNEL, &dccpw.lock); | 162 | dccpw.fifo = kfifo_alloc(bufsize, GFP_KERNEL, &dccpw.lock); |
163 | if (IS_ERR(dccpw.fifo)) | ||
164 | return PTR_ERR(dccpw.fifo); | ||
163 | 165 | ||
164 | if (!proc_net_fops_create(procname, S_IRUSR, &dccpprobe_fops)) | 166 | if (!proc_net_fops_create(procname, S_IRUSR, &dccpprobe_fops)) |
165 | goto err0; | 167 | goto err0; |
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index 3456cd331835..21f20f21dd32 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c | |||
@@ -166,7 +166,7 @@ static struct hlist_head *dn_find_list(struct sock *sk) | |||
166 | if (scp->addr.sdn_flags & SDF_WILD) | 166 | if (scp->addr.sdn_flags & SDF_WILD) |
167 | return hlist_empty(&dn_wild_sk) ? &dn_wild_sk : NULL; | 167 | return hlist_empty(&dn_wild_sk) ? &dn_wild_sk : NULL; |
168 | 168 | ||
169 | return &dn_sk_hash[scp->addrloc & DN_SK_HASH_MASK]; | 169 | return &dn_sk_hash[dn_ntohs(scp->addrloc) & DN_SK_HASH_MASK]; |
170 | } | 170 | } |
171 | 171 | ||
172 | /* | 172 | /* |
@@ -180,7 +180,7 @@ static int check_port(__le16 port) | |||
180 | if (port == 0) | 180 | if (port == 0) |
181 | return -1; | 181 | return -1; |
182 | 182 | ||
183 | sk_for_each(sk, node, &dn_sk_hash[port & DN_SK_HASH_MASK]) { | 183 | sk_for_each(sk, node, &dn_sk_hash[dn_ntohs(port) & DN_SK_HASH_MASK]) { |
184 | struct dn_scp *scp = DN_SK(sk); | 184 | struct dn_scp *scp = DN_SK(sk); |
185 | if (scp->addrloc == port) | 185 | if (scp->addrloc == port) |
186 | return -1; | 186 | return -1; |
@@ -194,12 +194,12 @@ static unsigned short port_alloc(struct sock *sk) | |||
194 | static unsigned short port = 0x2000; | 194 | static unsigned short port = 0x2000; |
195 | unsigned short i_port = port; | 195 | unsigned short i_port = port; |
196 | 196 | ||
197 | while(check_port(++port) != 0) { | 197 | while(check_port(dn_htons(++port)) != 0) { |
198 | if (port == i_port) | 198 | if (port == i_port) |
199 | return 0; | 199 | return 0; |
200 | } | 200 | } |
201 | 201 | ||
202 | scp->addrloc = port; | 202 | scp->addrloc = dn_htons(port); |
203 | 203 | ||
204 | return 1; | 204 | return 1; |
205 | } | 205 | } |
@@ -418,7 +418,7 @@ struct sock *dn_find_by_skb(struct sk_buff *skb) | |||
418 | struct dn_scp *scp; | 418 | struct dn_scp *scp; |
419 | 419 | ||
420 | read_lock(&dn_hash_lock); | 420 | read_lock(&dn_hash_lock); |
421 | sk_for_each(sk, node, &dn_sk_hash[cb->dst_port & DN_SK_HASH_MASK]) { | 421 | sk_for_each(sk, node, &dn_sk_hash[dn_ntohs(cb->dst_port) & DN_SK_HASH_MASK]) { |
422 | scp = DN_SK(sk); | 422 | scp = DN_SK(sk); |
423 | if (cb->src != dn_saddr2dn(&scp->peer)) | 423 | if (cb->src != dn_saddr2dn(&scp->peer)) |
424 | continue; | 424 | continue; |
@@ -1016,13 +1016,14 @@ static void dn_access_copy(struct sk_buff *skb, struct accessdata_dn *acc) | |||
1016 | 1016 | ||
1017 | static void dn_user_copy(struct sk_buff *skb, struct optdata_dn *opt) | 1017 | static void dn_user_copy(struct sk_buff *skb, struct optdata_dn *opt) |
1018 | { | 1018 | { |
1019 | unsigned char *ptr = skb->data; | 1019 | unsigned char *ptr = skb->data; |
1020 | 1020 | u16 len = *ptr++; /* yes, it's 8bit on the wire */ | |
1021 | opt->opt_optl = *ptr++; | 1021 | |
1022 | opt->opt_status = 0; | 1022 | BUG_ON(len > 16); /* we've checked the contents earlier */ |
1023 | memcpy(opt->opt_data, ptr, opt->opt_optl); | 1023 | opt->opt_optl = dn_htons(len); |
1024 | skb_pull(skb, dn_ntohs(opt->opt_optl) + 1); | 1024 | opt->opt_status = 0; |
1025 | 1025 | memcpy(opt->opt_data, ptr, len); | |
1026 | skb_pull(skb, len + 1); | ||
1026 | } | 1027 | } |
1027 | 1028 | ||
1028 | static struct sk_buff *dn_wait_for_connect(struct sock *sk, long *timeo) | 1029 | static struct sk_buff *dn_wait_for_connect(struct sock *sk, long *timeo) |
diff --git a/net/decnet/dn_nsp_in.c b/net/decnet/dn_nsp_in.c index 72ecc6e62ec4..7683d4f754d2 100644 --- a/net/decnet/dn_nsp_in.c +++ b/net/decnet/dn_nsp_in.c | |||
@@ -360,9 +360,9 @@ static void dn_nsp_conn_conf(struct sock *sk, struct sk_buff *skb) | |||
360 | scp->max_window = decnet_no_fc_max_cwnd; | 360 | scp->max_window = decnet_no_fc_max_cwnd; |
361 | 361 | ||
362 | if (skb->len > 0) { | 362 | if (skb->len > 0) { |
363 | unsigned char dlen = *skb->data; | 363 | u16 dlen = *skb->data; |
364 | if ((dlen <= 16) && (dlen <= skb->len)) { | 364 | if ((dlen <= 16) && (dlen <= skb->len)) { |
365 | scp->conndata_in.opt_optl = dn_htons((__u16)dlen); | 365 | scp->conndata_in.opt_optl = dn_htons(dlen); |
366 | memcpy(scp->conndata_in.opt_data, skb->data + 1, dlen); | 366 | memcpy(scp->conndata_in.opt_data, skb->data + 1, dlen); |
367 | } | 367 | } |
368 | } | 368 | } |
@@ -404,9 +404,9 @@ static void dn_nsp_disc_init(struct sock *sk, struct sk_buff *skb) | |||
404 | memset(scp->discdata_in.opt_data, 0, 16); | 404 | memset(scp->discdata_in.opt_data, 0, 16); |
405 | 405 | ||
406 | if (skb->len > 0) { | 406 | if (skb->len > 0) { |
407 | unsigned char dlen = *skb->data; | 407 | u16 dlen = *skb->data; |
408 | if ((dlen <= 16) && (dlen <= skb->len)) { | 408 | if ((dlen <= 16) && (dlen <= skb->len)) { |
409 | scp->discdata_in.opt_optl = dn_htons((__u16)dlen); | 409 | scp->discdata_in.opt_optl = dn_htons(dlen); |
410 | memcpy(scp->discdata_in.opt_data, skb->data + 1, dlen); | 410 | memcpy(scp->discdata_in.opt_data, skb->data + 1, dlen); |
411 | } | 411 | } |
412 | } | 412 | } |
diff --git a/net/decnet/dn_nsp_out.c b/net/decnet/dn_nsp_out.c index c2e21cd89b3c..b342e4e8f5f8 100644 --- a/net/decnet/dn_nsp_out.c +++ b/net/decnet/dn_nsp_out.c | |||
@@ -526,7 +526,7 @@ void dn_send_conn_conf(struct sock *sk, gfp_t gfp) | |||
526 | struct nsp_conn_init_msg *msg; | 526 | struct nsp_conn_init_msg *msg; |
527 | __u8 len = (__u8)dn_ntohs(scp->conndata_out.opt_optl); | 527 | __u8 len = (__u8)dn_ntohs(scp->conndata_out.opt_optl); |
528 | 528 | ||
529 | if ((skb = dn_alloc_skb(sk, 50 + dn_ntohs(scp->conndata_out.opt_optl), gfp)) == NULL) | 529 | if ((skb = dn_alloc_skb(sk, 50 + len, gfp)) == NULL) |
530 | return; | 530 | return; |
531 | 531 | ||
532 | msg = (struct nsp_conn_init_msg *)skb_put(skb, sizeof(*msg)); | 532 | msg = (struct nsp_conn_init_msg *)skb_put(skb, sizeof(*msg)); |
diff --git a/net/decnet/dn_rules.c b/net/decnet/dn_rules.c index 3e0c882c90bf..590e0a72495c 100644 --- a/net/decnet/dn_rules.c +++ b/net/decnet/dn_rules.c | |||
@@ -124,8 +124,8 @@ static struct nla_policy dn_fib_rule_policy[FRA_MAX+1] __read_mostly = { | |||
124 | static int dn_fib_rule_match(struct fib_rule *rule, struct flowi *fl, int flags) | 124 | static int dn_fib_rule_match(struct fib_rule *rule, struct flowi *fl, int flags) |
125 | { | 125 | { |
126 | struct dn_fib_rule *r = (struct dn_fib_rule *)rule; | 126 | struct dn_fib_rule *r = (struct dn_fib_rule *)rule; |
127 | u16 daddr = fl->fld_dst; | 127 | __le16 daddr = fl->fld_dst; |
128 | u16 saddr = fl->fld_src; | 128 | __le16 saddr = fl->fld_src; |
129 | 129 | ||
130 | if (((saddr ^ r->src) & r->srcmask) || | 130 | if (((saddr ^ r->src) & r->srcmask) || |
131 | ((daddr ^ r->dst) & r->dstmask)) | 131 | ((daddr ^ r->dst) & r->dstmask)) |
diff --git a/net/ieee80211/Kconfig b/net/ieee80211/Kconfig index f7e84e9d13ad..a64be6cdf078 100644 --- a/net/ieee80211/Kconfig +++ b/net/ieee80211/Kconfig | |||
@@ -32,6 +32,7 @@ config IEEE80211_CRYPT_WEP | |||
32 | depends on IEEE80211 | 32 | depends on IEEE80211 |
33 | select CRYPTO | 33 | select CRYPTO |
34 | select CRYPTO_ARC4 | 34 | select CRYPTO_ARC4 |
35 | select CRYPTO_ECB | ||
35 | select CRC32 | 36 | select CRC32 |
36 | ---help--- | 37 | ---help--- |
37 | Include software based cipher suites in support of IEEE | 38 | Include software based cipher suites in support of IEEE |
@@ -58,6 +59,7 @@ config IEEE80211_CRYPT_TKIP | |||
58 | depends on IEEE80211 && NET_RADIO | 59 | depends on IEEE80211 && NET_RADIO |
59 | select CRYPTO | 60 | select CRYPTO |
60 | select CRYPTO_MICHAEL_MIC | 61 | select CRYPTO_MICHAEL_MIC |
62 | select CRYPTO_ECB | ||
61 | select CRC32 | 63 | select CRC32 |
62 | ---help--- | 64 | ---help--- |
63 | Include software based cipher suites in support of IEEE 802.11i | 65 | Include software based cipher suites in support of IEEE 802.11i |
diff --git a/net/ieee80211/ieee80211_rx.c b/net/ieee80211/ieee80211_rx.c index 770704183a1b..2759312a4204 100644 --- a/net/ieee80211/ieee80211_rx.c +++ b/net/ieee80211/ieee80211_rx.c | |||
@@ -1078,12 +1078,12 @@ static int ieee80211_parse_info_param(struct ieee80211_info_element | |||
1078 | 1078 | ||
1079 | while (length >= sizeof(*info_element)) { | 1079 | while (length >= sizeof(*info_element)) { |
1080 | if (sizeof(*info_element) + info_element->len > length) { | 1080 | if (sizeof(*info_element) + info_element->len > length) { |
1081 | IEEE80211_ERROR("Info elem: parse failed: " | 1081 | IEEE80211_DEBUG_MGMT("Info elem: parse failed: " |
1082 | "info_element->len + 2 > left : " | 1082 | "info_element->len + 2 > left : " |
1083 | "info_element->len+2=%zd left=%d, id=%d.\n", | 1083 | "info_element->len+2=%zd left=%d, id=%d.\n", |
1084 | info_element->len + | 1084 | info_element->len + |
1085 | sizeof(*info_element), | 1085 | sizeof(*info_element), |
1086 | length, info_element->id); | 1086 | length, info_element->id); |
1087 | /* We stop processing but don't return an error here | 1087 | /* We stop processing but don't return an error here |
1088 | * because some misbehaviour APs break this rule. ie. | 1088 | * because some misbehaviour APs break this rule. ie. |
1089 | * Orinoco AP1000. */ | 1089 | * Orinoco AP1000. */ |
diff --git a/net/ieee80211/softmac/ieee80211softmac_assoc.c b/net/ieee80211/softmac/ieee80211softmac_assoc.c index 589f6d2c548a..cf51c87a971d 100644 --- a/net/ieee80211/softmac/ieee80211softmac_assoc.c +++ b/net/ieee80211/softmac/ieee80211softmac_assoc.c | |||
@@ -48,7 +48,7 @@ ieee80211softmac_assoc(struct ieee80211softmac_device *mac, struct ieee80211soft | |||
48 | dprintk(KERN_INFO PFX "sent association request!\n"); | 48 | dprintk(KERN_INFO PFX "sent association request!\n"); |
49 | 49 | ||
50 | spin_lock_irqsave(&mac->lock, flags); | 50 | spin_lock_irqsave(&mac->lock, flags); |
51 | mac->associated = 0; /* just to make sure */ | 51 | mac->associnfo.associated = 0; /* just to make sure */ |
52 | 52 | ||
53 | /* Set a timer for timeout */ | 53 | /* Set a timer for timeout */ |
54 | /* FIXME: make timeout configurable */ | 54 | /* FIXME: make timeout configurable */ |
@@ -62,24 +62,22 @@ ieee80211softmac_assoc_timeout(void *d) | |||
62 | { | 62 | { |
63 | struct ieee80211softmac_device *mac = (struct ieee80211softmac_device *)d; | 63 | struct ieee80211softmac_device *mac = (struct ieee80211softmac_device *)d; |
64 | struct ieee80211softmac_network *n; | 64 | struct ieee80211softmac_network *n; |
65 | unsigned long flags; | ||
66 | 65 | ||
67 | spin_lock_irqsave(&mac->lock, flags); | 66 | mutex_lock(&mac->associnfo.mutex); |
68 | /* we might race against ieee80211softmac_handle_assoc_response, | 67 | /* we might race against ieee80211softmac_handle_assoc_response, |
69 | * so make sure only one of us does something */ | 68 | * so make sure only one of us does something */ |
70 | if (!mac->associnfo.associating) { | 69 | if (!mac->associnfo.associating) |
71 | spin_unlock_irqrestore(&mac->lock, flags); | 70 | goto out; |
72 | return; | ||
73 | } | ||
74 | mac->associnfo.associating = 0; | 71 | mac->associnfo.associating = 0; |
75 | mac->associnfo.bssvalid = 0; | 72 | mac->associnfo.bssvalid = 0; |
76 | mac->associated = 0; | 73 | mac->associnfo.associated = 0; |
77 | 74 | ||
78 | n = ieee80211softmac_get_network_by_bssid_locked(mac, mac->associnfo.bssid); | 75 | n = ieee80211softmac_get_network_by_bssid_locked(mac, mac->associnfo.bssid); |
79 | spin_unlock_irqrestore(&mac->lock, flags); | ||
80 | 76 | ||
81 | dprintk(KERN_INFO PFX "assoc request timed out!\n"); | 77 | dprintk(KERN_INFO PFX "assoc request timed out!\n"); |
82 | ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_TIMEOUT, n); | 78 | ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_TIMEOUT, n); |
79 | out: | ||
80 | mutex_unlock(&mac->associnfo.mutex); | ||
83 | } | 81 | } |
84 | 82 | ||
85 | void | 83 | void |
@@ -93,7 +91,7 @@ ieee80211softmac_disassoc(struct ieee80211softmac_device *mac) | |||
93 | 91 | ||
94 | netif_carrier_off(mac->dev); | 92 | netif_carrier_off(mac->dev); |
95 | 93 | ||
96 | mac->associated = 0; | 94 | mac->associnfo.associated = 0; |
97 | mac->associnfo.bssvalid = 0; | 95 | mac->associnfo.bssvalid = 0; |
98 | mac->associnfo.associating = 0; | 96 | mac->associnfo.associating = 0; |
99 | ieee80211softmac_init_bss(mac); | 97 | ieee80211softmac_init_bss(mac); |
@@ -107,7 +105,7 @@ ieee80211softmac_send_disassoc_req(struct ieee80211softmac_device *mac, u16 reas | |||
107 | { | 105 | { |
108 | struct ieee80211softmac_network *found; | 106 | struct ieee80211softmac_network *found; |
109 | 107 | ||
110 | if (mac->associnfo.bssvalid && mac->associated) { | 108 | if (mac->associnfo.bssvalid && mac->associnfo.associated) { |
111 | found = ieee80211softmac_get_network_by_bssid(mac, mac->associnfo.bssid); | 109 | found = ieee80211softmac_get_network_by_bssid(mac, mac->associnfo.bssid); |
112 | if (found) | 110 | if (found) |
113 | ieee80211softmac_send_mgt_frame(mac, found, IEEE80211_STYPE_DISASSOC, reason); | 111 | ieee80211softmac_send_mgt_frame(mac, found, IEEE80211_STYPE_DISASSOC, reason); |
@@ -196,17 +194,18 @@ ieee80211softmac_assoc_work(void *d) | |||
196 | int bssvalid; | 194 | int bssvalid; |
197 | unsigned long flags; | 195 | unsigned long flags; |
198 | 196 | ||
197 | mutex_lock(&mac->associnfo.mutex); | ||
198 | |||
199 | if (!mac->associnfo.associating) | ||
200 | goto out; | ||
201 | |||
199 | /* ieee80211_disassoc might clear this */ | 202 | /* ieee80211_disassoc might clear this */ |
200 | bssvalid = mac->associnfo.bssvalid; | 203 | bssvalid = mac->associnfo.bssvalid; |
201 | 204 | ||
202 | /* meh */ | 205 | /* meh */ |
203 | if (mac->associated) | 206 | if (mac->associnfo.associated) |
204 | ieee80211softmac_send_disassoc_req(mac, WLAN_REASON_DISASSOC_STA_HAS_LEFT); | 207 | ieee80211softmac_send_disassoc_req(mac, WLAN_REASON_DISASSOC_STA_HAS_LEFT); |
205 | 208 | ||
206 | spin_lock_irqsave(&mac->lock, flags); | ||
207 | mac->associnfo.associating = 1; | ||
208 | spin_unlock_irqrestore(&mac->lock, flags); | ||
209 | |||
210 | /* try to find the requested network in our list, if we found one already */ | 209 | /* try to find the requested network in our list, if we found one already */ |
211 | if (bssvalid || mac->associnfo.bssfixed) | 210 | if (bssvalid || mac->associnfo.bssfixed) |
212 | found = ieee80211softmac_get_network_by_bssid(mac, mac->associnfo.bssid); | 211 | found = ieee80211softmac_get_network_by_bssid(mac, mac->associnfo.bssid); |
@@ -260,10 +259,8 @@ ieee80211softmac_assoc_work(void *d) | |||
260 | 259 | ||
261 | if (!found) { | 260 | if (!found) { |
262 | if (mac->associnfo.scan_retry > 0) { | 261 | if (mac->associnfo.scan_retry > 0) { |
263 | spin_lock_irqsave(&mac->lock, flags); | ||
264 | mac->associnfo.scan_retry--; | 262 | mac->associnfo.scan_retry--; |
265 | spin_unlock_irqrestore(&mac->lock, flags); | 263 | |
266 | |||
267 | /* We know of no such network. Let's scan. | 264 | /* We know of no such network. Let's scan. |
268 | * NB: this also happens if we had no memory to copy the network info... | 265 | * NB: this also happens if we had no memory to copy the network info... |
269 | * Maybe we can hope to have more memory after scanning finishes ;) | 266 | * Maybe we can hope to have more memory after scanning finishes ;) |
@@ -272,19 +269,17 @@ ieee80211softmac_assoc_work(void *d) | |||
272 | ieee80211softmac_notify(mac->dev, IEEE80211SOFTMAC_EVENT_SCAN_FINISHED, ieee80211softmac_assoc_notify_scan, NULL); | 269 | ieee80211softmac_notify(mac->dev, IEEE80211SOFTMAC_EVENT_SCAN_FINISHED, ieee80211softmac_assoc_notify_scan, NULL); |
273 | if (ieee80211softmac_start_scan(mac)) | 270 | if (ieee80211softmac_start_scan(mac)) |
274 | dprintk(KERN_INFO PFX "Associate: failed to initiate scan. Is device up?\n"); | 271 | dprintk(KERN_INFO PFX "Associate: failed to initiate scan. Is device up?\n"); |
275 | return; | 272 | goto out; |
276 | } else { | 273 | } else { |
277 | spin_lock_irqsave(&mac->lock, flags); | ||
278 | mac->associnfo.associating = 0; | 274 | mac->associnfo.associating = 0; |
279 | mac->associated = 0; | 275 | mac->associnfo.associated = 0; |
280 | spin_unlock_irqrestore(&mac->lock, flags); | ||
281 | 276 | ||
282 | dprintk(KERN_INFO PFX "Unable to find matching network after scan!\n"); | 277 | dprintk(KERN_INFO PFX "Unable to find matching network after scan!\n"); |
283 | /* reset the retry counter for the next user request since we | 278 | /* reset the retry counter for the next user request since we |
284 | * break out and don't reschedule ourselves after this point. */ | 279 | * break out and don't reschedule ourselves after this point. */ |
285 | mac->associnfo.scan_retry = IEEE80211SOFTMAC_ASSOC_SCAN_RETRY_LIMIT; | 280 | mac->associnfo.scan_retry = IEEE80211SOFTMAC_ASSOC_SCAN_RETRY_LIMIT; |
286 | ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_NET_NOT_FOUND, NULL); | 281 | ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_NET_NOT_FOUND, NULL); |
287 | return; | 282 | goto out; |
288 | } | 283 | } |
289 | } | 284 | } |
290 | 285 | ||
@@ -297,7 +292,7 @@ ieee80211softmac_assoc_work(void *d) | |||
297 | /* copy the ESSID for displaying it */ | 292 | /* copy the ESSID for displaying it */ |
298 | mac->associnfo.associate_essid.len = found->essid.len; | 293 | mac->associnfo.associate_essid.len = found->essid.len; |
299 | memcpy(mac->associnfo.associate_essid.data, found->essid.data, IW_ESSID_MAX_SIZE + 1); | 294 | memcpy(mac->associnfo.associate_essid.data, found->essid.data, IW_ESSID_MAX_SIZE + 1); |
300 | 295 | ||
301 | /* we found a network! authenticate (if necessary) and associate to it. */ | 296 | /* we found a network! authenticate (if necessary) and associate to it. */ |
302 | if (found->authenticating) { | 297 | if (found->authenticating) { |
303 | dprintk(KERN_INFO PFX "Already requested authentication, waiting...\n"); | 298 | dprintk(KERN_INFO PFX "Already requested authentication, waiting...\n"); |
@@ -305,7 +300,7 @@ ieee80211softmac_assoc_work(void *d) | |||
305 | mac->associnfo.assoc_wait = 1; | 300 | mac->associnfo.assoc_wait = 1; |
306 | ieee80211softmac_notify_internal(mac, IEEE80211SOFTMAC_EVENT_ANY, found, ieee80211softmac_assoc_notify_auth, NULL, GFP_KERNEL); | 301 | ieee80211softmac_notify_internal(mac, IEEE80211SOFTMAC_EVENT_ANY, found, ieee80211softmac_assoc_notify_auth, NULL, GFP_KERNEL); |
307 | } | 302 | } |
308 | return; | 303 | goto out; |
309 | } | 304 | } |
310 | if (!found->authenticated && !found->authenticating) { | 305 | if (!found->authenticated && !found->authenticating) { |
311 | /* This relies on the fact that _auth_req only queues the work, | 306 | /* This relies on the fact that _auth_req only queues the work, |
@@ -321,11 +316,14 @@ ieee80211softmac_assoc_work(void *d) | |||
321 | mac->associnfo.assoc_wait = 0; | 316 | mac->associnfo.assoc_wait = 0; |
322 | ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_FAILED, found); | 317 | ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_FAILED, found); |
323 | } | 318 | } |
324 | return; | 319 | goto out; |
325 | } | 320 | } |
326 | /* finally! now we can start associating */ | 321 | /* finally! now we can start associating */ |
327 | mac->associnfo.assoc_wait = 0; | 322 | mac->associnfo.assoc_wait = 0; |
328 | ieee80211softmac_assoc(mac, found); | 323 | ieee80211softmac_assoc(mac, found); |
324 | |||
325 | out: | ||
326 | mutex_unlock(&mac->associnfo.mutex); | ||
329 | } | 327 | } |
330 | 328 | ||
331 | /* call this to do whatever is necessary when we're associated */ | 329 | /* call this to do whatever is necessary when we're associated */ |
@@ -341,7 +339,7 @@ ieee80211softmac_associated(struct ieee80211softmac_device *mac, | |||
341 | mac->bssinfo.supported_rates = net->supported_rates; | 339 | mac->bssinfo.supported_rates = net->supported_rates; |
342 | ieee80211softmac_recalc_txrates(mac); | 340 | ieee80211softmac_recalc_txrates(mac); |
343 | 341 | ||
344 | mac->associated = 1; | 342 | mac->associnfo.associated = 1; |
345 | 343 | ||
346 | mac->associnfo.short_preamble_available = | 344 | mac->associnfo.short_preamble_available = |
347 | (cap & WLAN_CAPABILITY_SHORT_PREAMBLE) != 0; | 345 | (cap & WLAN_CAPABILITY_SHORT_PREAMBLE) != 0; |
@@ -421,7 +419,7 @@ ieee80211softmac_handle_assoc_response(struct net_device * dev, | |||
421 | dprintk(KERN_INFO PFX "associating failed (reason: 0x%x)!\n", status); | 419 | dprintk(KERN_INFO PFX "associating failed (reason: 0x%x)!\n", status); |
422 | mac->associnfo.associating = 0; | 420 | mac->associnfo.associating = 0; |
423 | mac->associnfo.bssvalid = 0; | 421 | mac->associnfo.bssvalid = 0; |
424 | mac->associated = 0; | 422 | mac->associnfo.associated = 0; |
425 | ieee80211softmac_call_events_locked(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_FAILED, network); | 423 | ieee80211softmac_call_events_locked(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_FAILED, network); |
426 | } | 424 | } |
427 | 425 | ||
diff --git a/net/ieee80211/softmac/ieee80211softmac_io.c b/net/ieee80211/softmac/ieee80211softmac_io.c index 82bfddbf33a2..b96931001b43 100644 --- a/net/ieee80211/softmac/ieee80211softmac_io.c +++ b/net/ieee80211/softmac/ieee80211softmac_io.c | |||
@@ -304,7 +304,7 @@ ieee80211softmac_auth(struct ieee80211_auth **pkt, | |||
304 | 2 + /* Auth Transaction Seq */ | 304 | 2 + /* Auth Transaction Seq */ |
305 | 2 + /* Status Code */ | 305 | 2 + /* Status Code */ |
306 | /* Challenge Text IE */ | 306 | /* Challenge Text IE */ |
307 | is_shared_response ? 0 : 1 + 1 + net->challenge_len | 307 | (is_shared_response ? 1 + 1 + net->challenge_len : 0) |
308 | ); | 308 | ); |
309 | if (unlikely((*pkt) == NULL)) | 309 | if (unlikely((*pkt) == NULL)) |
310 | return 0; | 310 | return 0; |
@@ -475,8 +475,13 @@ int ieee80211softmac_handle_beacon(struct net_device *dev, | |||
475 | { | 475 | { |
476 | struct ieee80211softmac_device *mac = ieee80211_priv(dev); | 476 | struct ieee80211softmac_device *mac = ieee80211_priv(dev); |
477 | 477 | ||
478 | if (mac->associated && memcmp(network->bssid, mac->associnfo.bssid, ETH_ALEN) == 0) | 478 | /* This might race, but we don't really care and it's not worth |
479 | ieee80211softmac_process_erp(mac, network->erp_value); | 479 | * adding heavyweight locking in this fastpath. |
480 | */ | ||
481 | if (mac->associnfo.associated) { | ||
482 | if (memcmp(network->bssid, mac->associnfo.bssid, ETH_ALEN) == 0) | ||
483 | ieee80211softmac_process_erp(mac, network->erp_value); | ||
484 | } | ||
480 | 485 | ||
481 | return 0; | 486 | return 0; |
482 | } | 487 | } |
diff --git a/net/ieee80211/softmac/ieee80211softmac_module.c b/net/ieee80211/softmac/ieee80211softmac_module.c index addea1cf73ae..33aff4f4a471 100644 --- a/net/ieee80211/softmac/ieee80211softmac_module.c +++ b/net/ieee80211/softmac/ieee80211softmac_module.c | |||
@@ -57,6 +57,7 @@ struct net_device *alloc_ieee80211softmac(int sizeof_priv) | |||
57 | INIT_LIST_HEAD(&softmac->network_list); | 57 | INIT_LIST_HEAD(&softmac->network_list); |
58 | INIT_LIST_HEAD(&softmac->events); | 58 | INIT_LIST_HEAD(&softmac->events); |
59 | 59 | ||
60 | mutex_init(&softmac->associnfo.mutex); | ||
60 | INIT_WORK(&softmac->associnfo.work, ieee80211softmac_assoc_work, softmac); | 61 | INIT_WORK(&softmac->associnfo.work, ieee80211softmac_assoc_work, softmac); |
61 | INIT_WORK(&softmac->associnfo.timeout, ieee80211softmac_assoc_timeout, softmac); | 62 | INIT_WORK(&softmac->associnfo.timeout, ieee80211softmac_assoc_timeout, softmac); |
62 | softmac->start_scan = ieee80211softmac_start_scan_implementation; | 63 | softmac->start_scan = ieee80211softmac_start_scan_implementation; |
diff --git a/net/ieee80211/softmac/ieee80211softmac_wx.c b/net/ieee80211/softmac/ieee80211softmac_wx.c index 2aa779d18f38..23068a830f7d 100644 --- a/net/ieee80211/softmac/ieee80211softmac_wx.c +++ b/net/ieee80211/softmac/ieee80211softmac_wx.c | |||
@@ -73,13 +73,14 @@ ieee80211softmac_wx_set_essid(struct net_device *net_dev, | |||
73 | struct ieee80211softmac_network *n; | 73 | struct ieee80211softmac_network *n; |
74 | struct ieee80211softmac_auth_queue_item *authptr; | 74 | struct ieee80211softmac_auth_queue_item *authptr; |
75 | int length = 0; | 75 | int length = 0; |
76 | unsigned long flags; | 76 | |
77 | mutex_lock(&sm->associnfo.mutex); | ||
77 | 78 | ||
78 | /* Check if we're already associating to this or another network | 79 | /* Check if we're already associating to this or another network |
79 | * If it's another network, cancel and start over with our new network | 80 | * If it's another network, cancel and start over with our new network |
80 | * If it's our network, ignore the change, we're already doing it! | 81 | * If it's our network, ignore the change, we're already doing it! |
81 | */ | 82 | */ |
82 | if((sm->associnfo.associating || sm->associated) && | 83 | if((sm->associnfo.associating || sm->associnfo.associated) && |
83 | (data->essid.flags && data->essid.length)) { | 84 | (data->essid.flags && data->essid.length)) { |
84 | /* Get the associating network */ | 85 | /* Get the associating network */ |
85 | n = ieee80211softmac_get_network_by_bssid(sm, sm->associnfo.bssid); | 86 | n = ieee80211softmac_get_network_by_bssid(sm, sm->associnfo.bssid); |
@@ -87,10 +88,9 @@ ieee80211softmac_wx_set_essid(struct net_device *net_dev, | |||
87 | !memcmp(n->essid.data, extra, n->essid.len)) { | 88 | !memcmp(n->essid.data, extra, n->essid.len)) { |
88 | dprintk(KERN_INFO PFX "Already associating or associated to "MAC_FMT"\n", | 89 | dprintk(KERN_INFO PFX "Already associating or associated to "MAC_FMT"\n", |
89 | MAC_ARG(sm->associnfo.bssid)); | 90 | MAC_ARG(sm->associnfo.bssid)); |
90 | return 0; | 91 | goto out; |
91 | } else { | 92 | } else { |
92 | dprintk(KERN_INFO PFX "Canceling existing associate request!\n"); | 93 | dprintk(KERN_INFO PFX "Canceling existing associate request!\n"); |
93 | spin_lock_irqsave(&sm->lock,flags); | ||
94 | /* Cancel assoc work */ | 94 | /* Cancel assoc work */ |
95 | cancel_delayed_work(&sm->associnfo.work); | 95 | cancel_delayed_work(&sm->associnfo.work); |
96 | /* We don't have to do this, but it's a little cleaner */ | 96 | /* We don't have to do this, but it's a little cleaner */ |
@@ -98,14 +98,13 @@ ieee80211softmac_wx_set_essid(struct net_device *net_dev, | |||
98 | cancel_delayed_work(&authptr->work); | 98 | cancel_delayed_work(&authptr->work); |
99 | sm->associnfo.bssvalid = 0; | 99 | sm->associnfo.bssvalid = 0; |
100 | sm->associnfo.bssfixed = 0; | 100 | sm->associnfo.bssfixed = 0; |
101 | spin_unlock_irqrestore(&sm->lock,flags); | ||
102 | flush_scheduled_work(); | 101 | flush_scheduled_work(); |
102 | sm->associnfo.associating = 0; | ||
103 | sm->associnfo.associated = 0; | ||
103 | } | 104 | } |
104 | } | 105 | } |
105 | 106 | ||
106 | 107 | ||
107 | spin_lock_irqsave(&sm->lock, flags); | ||
108 | |||
109 | sm->associnfo.static_essid = 0; | 108 | sm->associnfo.static_essid = 0; |
110 | sm->associnfo.assoc_wait = 0; | 109 | sm->associnfo.assoc_wait = 0; |
111 | 110 | ||
@@ -121,10 +120,12 @@ ieee80211softmac_wx_set_essid(struct net_device *net_dev, | |||
121 | * If applicable, we have already copied the data in */ | 120 | * If applicable, we have already copied the data in */ |
122 | sm->associnfo.req_essid.len = length; | 121 | sm->associnfo.req_essid.len = length; |
123 | 122 | ||
123 | sm->associnfo.associating = 1; | ||
124 | /* queue lower level code to do work (if necessary) */ | 124 | /* queue lower level code to do work (if necessary) */ |
125 | schedule_work(&sm->associnfo.work); | 125 | schedule_work(&sm->associnfo.work); |
126 | out: | ||
127 | mutex_unlock(&sm->associnfo.mutex); | ||
126 | 128 | ||
127 | spin_unlock_irqrestore(&sm->lock, flags); | ||
128 | return 0; | 129 | return 0; |
129 | } | 130 | } |
130 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_set_essid); | 131 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_set_essid); |
@@ -136,10 +137,8 @@ ieee80211softmac_wx_get_essid(struct net_device *net_dev, | |||
136 | char *extra) | 137 | char *extra) |
137 | { | 138 | { |
138 | struct ieee80211softmac_device *sm = ieee80211_priv(net_dev); | 139 | struct ieee80211softmac_device *sm = ieee80211_priv(net_dev); |
139 | unsigned long flags; | ||
140 | 140 | ||
141 | /* avoid getting inconsistent information */ | 141 | mutex_lock(&sm->associnfo.mutex); |
142 | spin_lock_irqsave(&sm->lock, flags); | ||
143 | /* If all fails, return ANY (empty) */ | 142 | /* If all fails, return ANY (empty) */ |
144 | data->essid.length = 0; | 143 | data->essid.length = 0; |
145 | data->essid.flags = 0; /* active */ | 144 | data->essid.flags = 0; /* active */ |
@@ -152,12 +151,13 @@ ieee80211softmac_wx_get_essid(struct net_device *net_dev, | |||
152 | } | 151 | } |
153 | 152 | ||
154 | /* If we're associating/associated, return that */ | 153 | /* If we're associating/associated, return that */ |
155 | if (sm->associated || sm->associnfo.associating) { | 154 | if (sm->associnfo.associated || sm->associnfo.associating) { |
156 | data->essid.length = sm->associnfo.associate_essid.len; | 155 | data->essid.length = sm->associnfo.associate_essid.len; |
157 | data->essid.flags = 1; /* active */ | 156 | data->essid.flags = 1; /* active */ |
158 | memcpy(extra, sm->associnfo.associate_essid.data, sm->associnfo.associate_essid.len); | 157 | memcpy(extra, sm->associnfo.associate_essid.data, sm->associnfo.associate_essid.len); |
159 | } | 158 | } |
160 | spin_unlock_irqrestore(&sm->lock, flags); | 159 | mutex_unlock(&sm->associnfo.mutex); |
160 | |||
161 | return 0; | 161 | return 0; |
162 | } | 162 | } |
163 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_get_essid); | 163 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_get_essid); |
@@ -322,15 +322,15 @@ ieee80211softmac_wx_get_wap(struct net_device *net_dev, | |||
322 | { | 322 | { |
323 | struct ieee80211softmac_device *mac = ieee80211_priv(net_dev); | 323 | struct ieee80211softmac_device *mac = ieee80211_priv(net_dev); |
324 | int err = 0; | 324 | int err = 0; |
325 | unsigned long flags; | ||
326 | 325 | ||
327 | spin_lock_irqsave(&mac->lock, flags); | 326 | mutex_lock(&mac->associnfo.mutex); |
328 | if (mac->associnfo.bssvalid) | 327 | if (mac->associnfo.bssvalid) |
329 | memcpy(data->ap_addr.sa_data, mac->associnfo.bssid, ETH_ALEN); | 328 | memcpy(data->ap_addr.sa_data, mac->associnfo.bssid, ETH_ALEN); |
330 | else | 329 | else |
331 | memset(data->ap_addr.sa_data, 0xff, ETH_ALEN); | 330 | memset(data->ap_addr.sa_data, 0xff, ETH_ALEN); |
332 | data->ap_addr.sa_family = ARPHRD_ETHER; | 331 | data->ap_addr.sa_family = ARPHRD_ETHER; |
333 | spin_unlock_irqrestore(&mac->lock, flags); | 332 | mutex_unlock(&mac->associnfo.mutex); |
333 | |||
334 | return err; | 334 | return err; |
335 | } | 335 | } |
336 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_get_wap); | 336 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_get_wap); |
@@ -342,28 +342,27 @@ ieee80211softmac_wx_set_wap(struct net_device *net_dev, | |||
342 | char *extra) | 342 | char *extra) |
343 | { | 343 | { |
344 | struct ieee80211softmac_device *mac = ieee80211_priv(net_dev); | 344 | struct ieee80211softmac_device *mac = ieee80211_priv(net_dev); |
345 | unsigned long flags; | ||
346 | 345 | ||
347 | /* sanity check */ | 346 | /* sanity check */ |
348 | if (data->ap_addr.sa_family != ARPHRD_ETHER) { | 347 | if (data->ap_addr.sa_family != ARPHRD_ETHER) { |
349 | return -EINVAL; | 348 | return -EINVAL; |
350 | } | 349 | } |
351 | 350 | ||
352 | spin_lock_irqsave(&mac->lock, flags); | 351 | mutex_lock(&mac->associnfo.mutex); |
353 | if (is_broadcast_ether_addr(data->ap_addr.sa_data)) { | 352 | if (is_broadcast_ether_addr(data->ap_addr.sa_data)) { |
354 | /* the bssid we have is not to be fixed any longer, | 353 | /* the bssid we have is not to be fixed any longer, |
355 | * and we should reassociate to the best AP. */ | 354 | * and we should reassociate to the best AP. */ |
356 | mac->associnfo.bssfixed = 0; | 355 | mac->associnfo.bssfixed = 0; |
357 | /* force reassociation */ | 356 | /* force reassociation */ |
358 | mac->associnfo.bssvalid = 0; | 357 | mac->associnfo.bssvalid = 0; |
359 | if (mac->associated) | 358 | if (mac->associnfo.associated) |
360 | schedule_work(&mac->associnfo.work); | 359 | schedule_work(&mac->associnfo.work); |
361 | } else if (is_zero_ether_addr(data->ap_addr.sa_data)) { | 360 | } else if (is_zero_ether_addr(data->ap_addr.sa_data)) { |
362 | /* the bssid we have is no longer fixed */ | 361 | /* the bssid we have is no longer fixed */ |
363 | mac->associnfo.bssfixed = 0; | 362 | mac->associnfo.bssfixed = 0; |
364 | } else { | 363 | } else { |
365 | if (!memcmp(mac->associnfo.bssid, data->ap_addr.sa_data, ETH_ALEN)) { | 364 | if (!memcmp(mac->associnfo.bssid, data->ap_addr.sa_data, ETH_ALEN)) { |
366 | if (mac->associnfo.associating || mac->associated) { | 365 | if (mac->associnfo.associating || mac->associnfo.associated) { |
367 | /* bssid unchanged and associated or associating - just return */ | 366 | /* bssid unchanged and associated or associating - just return */ |
368 | goto out; | 367 | goto out; |
369 | } | 368 | } |
@@ -378,7 +377,8 @@ ieee80211softmac_wx_set_wap(struct net_device *net_dev, | |||
378 | } | 377 | } |
379 | 378 | ||
380 | out: | 379 | out: |
381 | spin_unlock_irqrestore(&mac->lock, flags); | 380 | mutex_unlock(&mac->associnfo.mutex); |
381 | |||
382 | return 0; | 382 | return 0; |
383 | } | 383 | } |
384 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_set_wap); | 384 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_set_wap); |
@@ -394,7 +394,8 @@ ieee80211softmac_wx_set_genie(struct net_device *dev, | |||
394 | int err = 0; | 394 | int err = 0; |
395 | char *buf; | 395 | char *buf; |
396 | int i; | 396 | int i; |
397 | 397 | ||
398 | mutex_lock(&mac->associnfo.mutex); | ||
398 | spin_lock_irqsave(&mac->lock, flags); | 399 | spin_lock_irqsave(&mac->lock, flags); |
399 | /* bleh. shouldn't be locked for that kmalloc... */ | 400 | /* bleh. shouldn't be locked for that kmalloc... */ |
400 | 401 | ||
@@ -432,6 +433,8 @@ ieee80211softmac_wx_set_genie(struct net_device *dev, | |||
432 | 433 | ||
433 | out: | 434 | out: |
434 | spin_unlock_irqrestore(&mac->lock, flags); | 435 | spin_unlock_irqrestore(&mac->lock, flags); |
436 | mutex_unlock(&mac->associnfo.mutex); | ||
437 | |||
435 | return err; | 438 | return err; |
436 | } | 439 | } |
437 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_set_genie); | 440 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_set_genie); |
@@ -446,7 +449,8 @@ ieee80211softmac_wx_get_genie(struct net_device *dev, | |||
446 | unsigned long flags; | 449 | unsigned long flags; |
447 | int err = 0; | 450 | int err = 0; |
448 | int space = wrqu->data.length; | 451 | int space = wrqu->data.length; |
449 | 452 | ||
453 | mutex_lock(&mac->associnfo.mutex); | ||
450 | spin_lock_irqsave(&mac->lock, flags); | 454 | spin_lock_irqsave(&mac->lock, flags); |
451 | 455 | ||
452 | wrqu->data.length = 0; | 456 | wrqu->data.length = 0; |
@@ -459,6 +463,8 @@ ieee80211softmac_wx_get_genie(struct net_device *dev, | |||
459 | err = -E2BIG; | 463 | err = -E2BIG; |
460 | } | 464 | } |
461 | spin_unlock_irqrestore(&mac->lock, flags); | 465 | spin_unlock_irqrestore(&mac->lock, flags); |
466 | mutex_lock(&mac->associnfo.mutex); | ||
467 | |||
462 | return err; | 468 | return err; |
463 | } | 469 | } |
464 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_get_genie); | 470 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_get_genie); |
@@ -473,10 +479,13 @@ ieee80211softmac_wx_set_mlme(struct net_device *dev, | |||
473 | struct iw_mlme *mlme = (struct iw_mlme *)extra; | 479 | struct iw_mlme *mlme = (struct iw_mlme *)extra; |
474 | u16 reason = cpu_to_le16(mlme->reason_code); | 480 | u16 reason = cpu_to_le16(mlme->reason_code); |
475 | struct ieee80211softmac_network *net; | 481 | struct ieee80211softmac_network *net; |
482 | int err = -EINVAL; | ||
483 | |||
484 | mutex_lock(&mac->associnfo.mutex); | ||
476 | 485 | ||
477 | if (memcmp(mac->associnfo.bssid, mlme->addr.sa_data, ETH_ALEN)) { | 486 | if (memcmp(mac->associnfo.bssid, mlme->addr.sa_data, ETH_ALEN)) { |
478 | printk(KERN_DEBUG PFX "wx_set_mlme: requested operation on net we don't use\n"); | 487 | printk(KERN_DEBUG PFX "wx_set_mlme: requested operation on net we don't use\n"); |
479 | return -EINVAL; | 488 | goto out; |
480 | } | 489 | } |
481 | 490 | ||
482 | switch (mlme->cmd) { | 491 | switch (mlme->cmd) { |
@@ -484,14 +493,22 @@ ieee80211softmac_wx_set_mlme(struct net_device *dev, | |||
484 | net = ieee80211softmac_get_network_by_bssid_locked(mac, mlme->addr.sa_data); | 493 | net = ieee80211softmac_get_network_by_bssid_locked(mac, mlme->addr.sa_data); |
485 | if (!net) { | 494 | if (!net) { |
486 | printk(KERN_DEBUG PFX "wx_set_mlme: we should know the net here...\n"); | 495 | printk(KERN_DEBUG PFX "wx_set_mlme: we should know the net here...\n"); |
487 | return -EINVAL; | 496 | goto out; |
488 | } | 497 | } |
489 | return ieee80211softmac_deauth_req(mac, net, reason); | 498 | return ieee80211softmac_deauth_req(mac, net, reason); |
490 | case IW_MLME_DISASSOC: | 499 | case IW_MLME_DISASSOC: |
491 | ieee80211softmac_send_disassoc_req(mac, reason); | 500 | ieee80211softmac_send_disassoc_req(mac, reason); |
492 | return 0; | 501 | mac->associnfo.associated = 0; |
502 | mac->associnfo.associating = 0; | ||
503 | err = 0; | ||
504 | goto out; | ||
493 | default: | 505 | default: |
494 | return -EOPNOTSUPP; | 506 | err = -EOPNOTSUPP; |
495 | } | 507 | } |
508 | |||
509 | out: | ||
510 | mutex_unlock(&mac->associnfo.mutex); | ||
511 | |||
512 | return err; | ||
496 | } | 513 | } |
497 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_set_mlme); | 514 | EXPORT_SYMBOL_GPL(ieee80211softmac_wx_set_mlme); |
diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c index e2077a3aa8c0..6460233407c7 100644 --- a/net/ipv4/cipso_ipv4.c +++ b/net/ipv4/cipso_ipv4.c | |||
@@ -1307,7 +1307,8 @@ int cipso_v4_socket_setattr(const struct socket *sock, | |||
1307 | 1307 | ||
1308 | /* We can't use ip_options_get() directly because it makes a call to | 1308 | /* We can't use ip_options_get() directly because it makes a call to |
1309 | * ip_options_get_alloc() which allocates memory with GFP_KERNEL and | 1309 | * ip_options_get_alloc() which allocates memory with GFP_KERNEL and |
1310 | * we can't block here. */ | 1310 | * we won't always have CAP_NET_RAW even though we _always_ want to |
1311 | * set the IPOPT_CIPSO option. */ | ||
1311 | opt_len = (buf_len + 3) & ~3; | 1312 | opt_len = (buf_len + 3) & ~3; |
1312 | opt = kzalloc(sizeof(*opt) + opt_len, GFP_ATOMIC); | 1313 | opt = kzalloc(sizeof(*opt) + opt_len, GFP_ATOMIC); |
1313 | if (opt == NULL) { | 1314 | if (opt == NULL) { |
@@ -1317,11 +1318,9 @@ int cipso_v4_socket_setattr(const struct socket *sock, | |||
1317 | memcpy(opt->__data, buf, buf_len); | 1318 | memcpy(opt->__data, buf, buf_len); |
1318 | opt->optlen = opt_len; | 1319 | opt->optlen = opt_len; |
1319 | opt->is_data = 1; | 1320 | opt->is_data = 1; |
1321 | opt->cipso = sizeof(struct iphdr); | ||
1320 | kfree(buf); | 1322 | kfree(buf); |
1321 | buf = NULL; | 1323 | buf = NULL; |
1322 | ret_val = ip_options_compile(opt, NULL); | ||
1323 | if (ret_val != 0) | ||
1324 | goto socket_setattr_failure; | ||
1325 | 1324 | ||
1326 | sk_inet = inet_sk(sk); | 1325 | sk_inet = inet_sk(sk); |
1327 | if (sk_inet->is_icsk) { | 1326 | if (sk_inet->is_icsk) { |
diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c index 8dabbfc31267..9f02917d6f45 100644 --- a/net/ipv4/ip_options.c +++ b/net/ipv4/ip_options.c | |||
@@ -443,7 +443,7 @@ int ip_options_compile(struct ip_options * opt, struct sk_buff * skb) | |||
443 | opt->router_alert = optptr - iph; | 443 | opt->router_alert = optptr - iph; |
444 | break; | 444 | break; |
445 | case IPOPT_CIPSO: | 445 | case IPOPT_CIPSO: |
446 | if (opt->cipso) { | 446 | if ((!skb && !capable(CAP_NET_RAW)) || opt->cipso) { |
447 | pp_ptr = optptr; | 447 | pp_ptr = optptr; |
448 | goto error; | 448 | goto error; |
449 | } | 449 | } |
diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index f8ce84759159..955a07abb91d 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c | |||
@@ -420,7 +420,7 @@ ic_rarp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt | |||
420 | { | 420 | { |
421 | struct arphdr *rarp; | 421 | struct arphdr *rarp; |
422 | unsigned char *rarp_ptr; | 422 | unsigned char *rarp_ptr; |
423 | unsigned long sip, tip; | 423 | u32 sip, tip; |
424 | unsigned char *sha, *tha; /* s for "source", t for "target" */ | 424 | unsigned char *sha, *tha; /* s for "source", t for "target" */ |
425 | struct ic_device *d; | 425 | struct ic_device *d; |
426 | 426 | ||
diff --git a/net/ipv4/ipvs/ip_vs_ftp.c b/net/ipv4/ipvs/ip_vs_ftp.c index 6d398f10aa91..687c1de1146f 100644 --- a/net/ipv4/ipvs/ip_vs_ftp.c +++ b/net/ipv4/ipvs/ip_vs_ftp.c | |||
@@ -200,7 +200,7 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp, | |||
200 | from = n_cp->vaddr; | 200 | from = n_cp->vaddr; |
201 | port = n_cp->vport; | 201 | port = n_cp->vport; |
202 | sprintf(buf,"%d,%d,%d,%d,%d,%d", NIPQUAD(from), | 202 | sprintf(buf,"%d,%d,%d,%d,%d,%d", NIPQUAD(from), |
203 | ntohs(port)&255, (ntohs(port)>>8)&255); | 203 | (ntohs(port)>>8)&255, ntohs(port)&255); |
204 | buf_len = strlen(buf); | 204 | buf_len = strlen(buf); |
205 | 205 | ||
206 | /* | 206 | /* |
diff --git a/net/ipv4/ipvs/ip_vs_proto_tcp.c b/net/ipv4/ipvs/ip_vs_proto_tcp.c index bfe779e74590..6ff05c3a32e6 100644 --- a/net/ipv4/ipvs/ip_vs_proto_tcp.c +++ b/net/ipv4/ipvs/ip_vs_proto_tcp.c | |||
@@ -117,7 +117,7 @@ tcp_fast_csum_update(struct tcphdr *tcph, __be32 oldip, __be32 newip, | |||
117 | { | 117 | { |
118 | tcph->check = | 118 | tcph->check = |
119 | ip_vs_check_diff(~oldip, newip, | 119 | ip_vs_check_diff(~oldip, newip, |
120 | ip_vs_check_diff(oldport ^ htonl(0xFFFF), | 120 | ip_vs_check_diff(oldport ^ htons(0xFFFF), |
121 | newport, tcph->check)); | 121 | newport, tcph->check)); |
122 | } | 122 | } |
123 | 123 | ||
diff --git a/net/ipv4/ipvs/ip_vs_proto_udp.c b/net/ipv4/ipvs/ip_vs_proto_udp.c index 54aa7603591f..691c8b637b29 100644 --- a/net/ipv4/ipvs/ip_vs_proto_udp.c +++ b/net/ipv4/ipvs/ip_vs_proto_udp.c | |||
@@ -122,10 +122,10 @@ udp_fast_csum_update(struct udphdr *uhdr, __be32 oldip, __be32 newip, | |||
122 | { | 122 | { |
123 | uhdr->check = | 123 | uhdr->check = |
124 | ip_vs_check_diff(~oldip, newip, | 124 | ip_vs_check_diff(~oldip, newip, |
125 | ip_vs_check_diff(oldport ^ htonl(0xFFFF), | 125 | ip_vs_check_diff(oldport ^ htons(0xFFFF), |
126 | newport, uhdr->check)); | 126 | newport, uhdr->check)); |
127 | if (!uhdr->check) | 127 | if (!uhdr->check) |
128 | uhdr->check = htonl(0xFFFF); | 128 | uhdr->check = -1; |
129 | } | 129 | } |
130 | 130 | ||
131 | static int | 131 | static int |
@@ -173,7 +173,7 @@ udp_snat_handler(struct sk_buff **pskb, | |||
173 | cp->protocol, | 173 | cp->protocol, |
174 | (*pskb)->csum); | 174 | (*pskb)->csum); |
175 | if (udph->check == 0) | 175 | if (udph->check == 0) |
176 | udph->check = htonl(0xFFFF); | 176 | udph->check = -1; |
177 | IP_VS_DBG(11, "O-pkt: %s O-csum=%d (+%zd)\n", | 177 | IP_VS_DBG(11, "O-pkt: %s O-csum=%d (+%zd)\n", |
178 | pp->name, udph->check, | 178 | pp->name, udph->check, |
179 | (char*)&(udph->check) - (char*)udph); | 179 | (char*)&(udph->check) - (char*)udph); |
@@ -228,7 +228,7 @@ udp_dnat_handler(struct sk_buff **pskb, | |||
228 | cp->protocol, | 228 | cp->protocol, |
229 | (*pskb)->csum); | 229 | (*pskb)->csum); |
230 | if (udph->check == 0) | 230 | if (udph->check == 0) |
231 | udph->check = 0xFFFF; | 231 | udph->check = -1; |
232 | (*pskb)->ip_summed = CHECKSUM_UNNECESSARY; | 232 | (*pskb)->ip_summed = CHECKSUM_UNNECESSARY; |
233 | } | 233 | } |
234 | return 1; | 234 | return 1; |
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index 0849f1cced13..413c2d0a1f3d 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c | |||
@@ -466,7 +466,13 @@ static inline int check_entry(struct arpt_entry *e, const char *name, unsigned i | |||
466 | return -EINVAL; | 466 | return -EINVAL; |
467 | } | 467 | } |
468 | 468 | ||
469 | if (e->target_offset + sizeof(struct arpt_entry_target) > e->next_offset) | ||
470 | return -EINVAL; | ||
471 | |||
469 | t = arpt_get_target(e); | 472 | t = arpt_get_target(e); |
473 | if (e->target_offset + t->u.target_size > e->next_offset) | ||
474 | return -EINVAL; | ||
475 | |||
470 | target = try_then_request_module(xt_find_target(NF_ARP, t->u.user.name, | 476 | target = try_then_request_module(xt_find_target(NF_ARP, t->u.user.name, |
471 | t->u.user.revision), | 477 | t->u.user.revision), |
472 | "arpt_%s", t->u.user.name); | 478 | "arpt_%s", t->u.user.name); |
@@ -621,20 +627,18 @@ static int translate_table(const char *name, | |||
621 | } | 627 | } |
622 | } | 628 | } |
623 | 629 | ||
624 | if (!mark_source_chains(newinfo, valid_hooks, entry0)) { | ||
625 | duprintf("Looping hook\n"); | ||
626 | return -ELOOP; | ||
627 | } | ||
628 | |||
629 | /* Finally, each sanity check must pass */ | 630 | /* Finally, each sanity check must pass */ |
630 | i = 0; | 631 | i = 0; |
631 | ret = ARPT_ENTRY_ITERATE(entry0, newinfo->size, | 632 | ret = ARPT_ENTRY_ITERATE(entry0, newinfo->size, |
632 | check_entry, name, size, &i); | 633 | check_entry, name, size, &i); |
633 | 634 | ||
634 | if (ret != 0) { | 635 | if (ret != 0) |
635 | ARPT_ENTRY_ITERATE(entry0, newinfo->size, | 636 | goto cleanup; |
636 | cleanup_entry, &i); | 637 | |
637 | return ret; | 638 | ret = -ELOOP; |
639 | if (!mark_source_chains(newinfo, valid_hooks, entry0)) { | ||
640 | duprintf("Looping hook\n"); | ||
641 | goto cleanup; | ||
638 | } | 642 | } |
639 | 643 | ||
640 | /* And one copy for every other CPU */ | 644 | /* And one copy for every other CPU */ |
@@ -643,6 +647,9 @@ static int translate_table(const char *name, | |||
643 | memcpy(newinfo->entries[i], entry0, newinfo->size); | 647 | memcpy(newinfo->entries[i], entry0, newinfo->size); |
644 | } | 648 | } |
645 | 649 | ||
650 | return 0; | ||
651 | cleanup: | ||
652 | ARPT_ENTRY_ITERATE(entry0, newinfo->size, cleanup_entry, &i); | ||
646 | return ret; | 653 | return ret; |
647 | } | 654 | } |
648 | 655 | ||
diff --git a/net/ipv4/netfilter/ip_conntrack_core.c b/net/ipv4/netfilter/ip_conntrack_core.c index 143c4668538b..8b848aa77bfc 100644 --- a/net/ipv4/netfilter/ip_conntrack_core.c +++ b/net/ipv4/netfilter/ip_conntrack_core.c | |||
@@ -225,10 +225,8 @@ __ip_conntrack_expect_find(const struct ip_conntrack_tuple *tuple) | |||
225 | struct ip_conntrack_expect *i; | 225 | struct ip_conntrack_expect *i; |
226 | 226 | ||
227 | list_for_each_entry(i, &ip_conntrack_expect_list, list) { | 227 | list_for_each_entry(i, &ip_conntrack_expect_list, list) { |
228 | if (ip_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask)) { | 228 | if (ip_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask)) |
229 | atomic_inc(&i->use); | ||
230 | return i; | 229 | return i; |
231 | } | ||
232 | } | 230 | } |
233 | return NULL; | 231 | return NULL; |
234 | } | 232 | } |
@@ -241,6 +239,8 @@ ip_conntrack_expect_find(const struct ip_conntrack_tuple *tuple) | |||
241 | 239 | ||
242 | read_lock_bh(&ip_conntrack_lock); | 240 | read_lock_bh(&ip_conntrack_lock); |
243 | i = __ip_conntrack_expect_find(tuple); | 241 | i = __ip_conntrack_expect_find(tuple); |
242 | if (i) | ||
243 | atomic_inc(&i->use); | ||
244 | read_unlock_bh(&ip_conntrack_lock); | 244 | read_unlock_bh(&ip_conntrack_lock); |
245 | 245 | ||
246 | return i; | 246 | return i; |
diff --git a/net/ipv4/netfilter/ip_conntrack_helper_h323.c b/net/ipv4/netfilter/ip_conntrack_helper_h323.c index 7b7441202bfd..6cb9070cd0bc 100644 --- a/net/ipv4/netfilter/ip_conntrack_helper_h323.c +++ b/net/ipv4/netfilter/ip_conntrack_helper_h323.c | |||
@@ -1417,7 +1417,7 @@ static int process_rcf(struct sk_buff **pskb, struct ip_conntrack *ct, | |||
1417 | DEBUGP | 1417 | DEBUGP |
1418 | ("ip_ct_ras: set RAS connection timeout to %u seconds\n", | 1418 | ("ip_ct_ras: set RAS connection timeout to %u seconds\n", |
1419 | info->timeout); | 1419 | info->timeout); |
1420 | ip_ct_refresh_acct(ct, ctinfo, NULL, info->timeout * HZ); | 1420 | ip_ct_refresh(ct, *pskb, info->timeout * HZ); |
1421 | 1421 | ||
1422 | /* Set expect timeout */ | 1422 | /* Set expect timeout */ |
1423 | read_lock_bh(&ip_conntrack_lock); | 1423 | read_lock_bh(&ip_conntrack_lock); |
@@ -1465,7 +1465,7 @@ static int process_urq(struct sk_buff **pskb, struct ip_conntrack *ct, | |||
1465 | info->sig_port[!dir] = 0; | 1465 | info->sig_port[!dir] = 0; |
1466 | 1466 | ||
1467 | /* Give it 30 seconds for UCF or URJ */ | 1467 | /* Give it 30 seconds for UCF or URJ */ |
1468 | ip_ct_refresh_acct(ct, ctinfo, NULL, 30 * HZ); | 1468 | ip_ct_refresh(ct, *pskb, 30 * HZ); |
1469 | 1469 | ||
1470 | return 0; | 1470 | return 0; |
1471 | } | 1471 | } |
diff --git a/net/ipv4/netfilter/ip_conntrack_netlink.c b/net/ipv4/netfilter/ip_conntrack_netlink.c index 262d0d44ec1b..55f0ae641081 100644 --- a/net/ipv4/netfilter/ip_conntrack_netlink.c +++ b/net/ipv4/netfilter/ip_conntrack_netlink.c | |||
@@ -153,6 +153,7 @@ ctnetlink_dump_protoinfo(struct sk_buff *skb, const struct ip_conntrack *ct) | |||
153 | return ret; | 153 | return ret; |
154 | 154 | ||
155 | nfattr_failure: | 155 | nfattr_failure: |
156 | ip_conntrack_proto_put(proto); | ||
156 | return -1; | 157 | return -1; |
157 | } | 158 | } |
158 | 159 | ||
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c index 7edad790478a..97556cc2e4e0 100644 --- a/net/ipv4/netfilter/ip_queue.c +++ b/net/ipv4/netfilter/ip_queue.c | |||
@@ -351,9 +351,10 @@ ipq_mangle_ipv4(ipq_verdict_msg_t *v, struct ipq_queue_entry *e) | |||
351 | if (v->data_len < sizeof(*user_iph)) | 351 | if (v->data_len < sizeof(*user_iph)) |
352 | return 0; | 352 | return 0; |
353 | diff = v->data_len - e->skb->len; | 353 | diff = v->data_len - e->skb->len; |
354 | if (diff < 0) | 354 | if (diff < 0) { |
355 | skb_trim(e->skb, v->data_len); | 355 | if (pskb_trim(e->skb, v->data_len)) |
356 | else if (diff > 0) { | 356 | return -ENOMEM; |
357 | } else if (diff > 0) { | ||
357 | if (v->data_len > 0xFFFF) | 358 | if (v->data_len > 0xFFFF) |
358 | return -EINVAL; | 359 | return -EINVAL; |
359 | if (diff > skb_tailroom(e->skb)) { | 360 | if (diff > skb_tailroom(e->skb)) { |
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index 4b90927619b8..8a455439b128 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c | |||
@@ -547,12 +547,18 @@ check_entry(struct ipt_entry *e, const char *name, unsigned int size, | |||
547 | return -EINVAL; | 547 | return -EINVAL; |
548 | } | 548 | } |
549 | 549 | ||
550 | if (e->target_offset + sizeof(struct ipt_entry_target) > e->next_offset) | ||
551 | return -EINVAL; | ||
552 | |||
550 | j = 0; | 553 | j = 0; |
551 | ret = IPT_MATCH_ITERATE(e, check_match, name, &e->ip, e->comefrom, &j); | 554 | ret = IPT_MATCH_ITERATE(e, check_match, name, &e->ip, e->comefrom, &j); |
552 | if (ret != 0) | 555 | if (ret != 0) |
553 | goto cleanup_matches; | 556 | goto cleanup_matches; |
554 | 557 | ||
555 | t = ipt_get_target(e); | 558 | t = ipt_get_target(e); |
559 | ret = -EINVAL; | ||
560 | if (e->target_offset + t->u.target_size > e->next_offset) | ||
561 | goto cleanup_matches; | ||
556 | target = try_then_request_module(xt_find_target(AF_INET, | 562 | target = try_then_request_module(xt_find_target(AF_INET, |
557 | t->u.user.name, | 563 | t->u.user.name, |
558 | t->u.user.revision), | 564 | t->u.user.revision), |
@@ -712,19 +718,17 @@ translate_table(const char *name, | |||
712 | } | 718 | } |
713 | } | 719 | } |
714 | 720 | ||
715 | if (!mark_source_chains(newinfo, valid_hooks, entry0)) | ||
716 | return -ELOOP; | ||
717 | |||
718 | /* Finally, each sanity check must pass */ | 721 | /* Finally, each sanity check must pass */ |
719 | i = 0; | 722 | i = 0; |
720 | ret = IPT_ENTRY_ITERATE(entry0, newinfo->size, | 723 | ret = IPT_ENTRY_ITERATE(entry0, newinfo->size, |
721 | check_entry, name, size, &i); | 724 | check_entry, name, size, &i); |
722 | 725 | ||
723 | if (ret != 0) { | 726 | if (ret != 0) |
724 | IPT_ENTRY_ITERATE(entry0, newinfo->size, | 727 | goto cleanup; |
725 | cleanup_entry, &i); | 728 | |
726 | return ret; | 729 | ret = -ELOOP; |
727 | } | 730 | if (!mark_source_chains(newinfo, valid_hooks, entry0)) |
731 | goto cleanup; | ||
728 | 732 | ||
729 | /* And one copy for every other CPU */ | 733 | /* And one copy for every other CPU */ |
730 | for_each_possible_cpu(i) { | 734 | for_each_possible_cpu(i) { |
@@ -732,6 +736,9 @@ translate_table(const char *name, | |||
732 | memcpy(newinfo->entries[i], entry0, newinfo->size); | 736 | memcpy(newinfo->entries[i], entry0, newinfo->size); |
733 | } | 737 | } |
734 | 738 | ||
739 | return 0; | ||
740 | cleanup: | ||
741 | IPT_ENTRY_ITERATE(entry0, newinfo->size, cleanup_entry, &i); | ||
735 | return ret; | 742 | return ret; |
736 | } | 743 | } |
737 | 744 | ||
@@ -1463,6 +1470,10 @@ check_compat_entry_size_and_hooks(struct ipt_entry *e, | |||
1463 | return -EINVAL; | 1470 | return -EINVAL; |
1464 | } | 1471 | } |
1465 | 1472 | ||
1473 | if (e->target_offset + sizeof(struct compat_xt_entry_target) > | ||
1474 | e->next_offset) | ||
1475 | return -EINVAL; | ||
1476 | |||
1466 | off = 0; | 1477 | off = 0; |
1467 | entry_offset = (void *)e - (void *)base; | 1478 | entry_offset = (void *)e - (void *)base; |
1468 | j = 0; | 1479 | j = 0; |
@@ -1472,6 +1483,9 @@ check_compat_entry_size_and_hooks(struct ipt_entry *e, | |||
1472 | goto cleanup_matches; | 1483 | goto cleanup_matches; |
1473 | 1484 | ||
1474 | t = ipt_get_target(e); | 1485 | t = ipt_get_target(e); |
1486 | ret = -EINVAL; | ||
1487 | if (e->target_offset + t->u.target_size > e->next_offset) | ||
1488 | goto cleanup_matches; | ||
1475 | target = try_then_request_module(xt_find_target(AF_INET, | 1489 | target = try_then_request_module(xt_find_target(AF_INET, |
1476 | t->u.user.name, | 1490 | t->u.user.name, |
1477 | t->u.user.revision), | 1491 | t->u.user.revision), |
@@ -1513,7 +1527,7 @@ cleanup_matches: | |||
1513 | 1527 | ||
1514 | static inline int compat_copy_match_from_user(struct ipt_entry_match *m, | 1528 | static inline int compat_copy_match_from_user(struct ipt_entry_match *m, |
1515 | void **dstptr, compat_uint_t *size, const char *name, | 1529 | void **dstptr, compat_uint_t *size, const char *name, |
1516 | const struct ipt_ip *ip, unsigned int hookmask, int *i) | 1530 | const struct ipt_ip *ip, unsigned int hookmask) |
1517 | { | 1531 | { |
1518 | struct ipt_entry_match *dm; | 1532 | struct ipt_entry_match *dm; |
1519 | struct ipt_match *match; | 1533 | struct ipt_match *match; |
@@ -1526,22 +1540,13 @@ static inline int compat_copy_match_from_user(struct ipt_entry_match *m, | |||
1526 | ret = xt_check_match(match, AF_INET, dm->u.match_size - sizeof(*dm), | 1540 | ret = xt_check_match(match, AF_INET, dm->u.match_size - sizeof(*dm), |
1527 | name, hookmask, ip->proto, | 1541 | name, hookmask, ip->proto, |
1528 | ip->invflags & IPT_INV_PROTO); | 1542 | ip->invflags & IPT_INV_PROTO); |
1529 | if (ret) | 1543 | if (!ret && m->u.kernel.match->checkentry |
1530 | goto err; | ||
1531 | |||
1532 | if (m->u.kernel.match->checkentry | ||
1533 | && !m->u.kernel.match->checkentry(name, ip, match, dm->data, | 1544 | && !m->u.kernel.match->checkentry(name, ip, match, dm->data, |
1534 | hookmask)) { | 1545 | hookmask)) { |
1535 | duprintf("ip_tables: check failed for `%s'.\n", | 1546 | duprintf("ip_tables: check failed for `%s'.\n", |
1536 | m->u.kernel.match->name); | 1547 | m->u.kernel.match->name); |
1537 | ret = -EINVAL; | 1548 | ret = -EINVAL; |
1538 | goto err; | ||
1539 | } | 1549 | } |
1540 | (*i)++; | ||
1541 | return 0; | ||
1542 | |||
1543 | err: | ||
1544 | module_put(m->u.kernel.match->me); | ||
1545 | return ret; | 1550 | return ret; |
1546 | } | 1551 | } |
1547 | 1552 | ||
@@ -1553,19 +1558,18 @@ static int compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr, | |||
1553 | struct ipt_target *target; | 1558 | struct ipt_target *target; |
1554 | struct ipt_entry *de; | 1559 | struct ipt_entry *de; |
1555 | unsigned int origsize; | 1560 | unsigned int origsize; |
1556 | int ret, h, j; | 1561 | int ret, h; |
1557 | 1562 | ||
1558 | ret = 0; | 1563 | ret = 0; |
1559 | origsize = *size; | 1564 | origsize = *size; |
1560 | de = (struct ipt_entry *)*dstptr; | 1565 | de = (struct ipt_entry *)*dstptr; |
1561 | memcpy(de, e, sizeof(struct ipt_entry)); | 1566 | memcpy(de, e, sizeof(struct ipt_entry)); |
1562 | 1567 | ||
1563 | j = 0; | ||
1564 | *dstptr += sizeof(struct compat_ipt_entry); | 1568 | *dstptr += sizeof(struct compat_ipt_entry); |
1565 | ret = IPT_MATCH_ITERATE(e, compat_copy_match_from_user, dstptr, size, | 1569 | ret = IPT_MATCH_ITERATE(e, compat_copy_match_from_user, dstptr, size, |
1566 | name, &de->ip, de->comefrom, &j); | 1570 | name, &de->ip, de->comefrom); |
1567 | if (ret) | 1571 | if (ret) |
1568 | goto cleanup_matches; | 1572 | goto err; |
1569 | de->target_offset = e->target_offset - (origsize - *size); | 1573 | de->target_offset = e->target_offset - (origsize - *size); |
1570 | t = ipt_get_target(e); | 1574 | t = ipt_get_target(e); |
1571 | target = t->u.kernel.target; | 1575 | target = t->u.kernel.target; |
@@ -1599,12 +1603,7 @@ static int compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr, | |||
1599 | goto err; | 1603 | goto err; |
1600 | } | 1604 | } |
1601 | ret = 0; | 1605 | ret = 0; |
1602 | return ret; | ||
1603 | |||
1604 | err: | 1606 | err: |
1605 | module_put(t->u.kernel.target->me); | ||
1606 | cleanup_matches: | ||
1607 | IPT_MATCH_ITERATE(e, cleanup_match, &j); | ||
1608 | return ret; | 1607 | return ret; |
1609 | } | 1608 | } |
1610 | 1609 | ||
@@ -1618,7 +1617,7 @@ translate_compat_table(const char *name, | |||
1618 | unsigned int *hook_entries, | 1617 | unsigned int *hook_entries, |
1619 | unsigned int *underflows) | 1618 | unsigned int *underflows) |
1620 | { | 1619 | { |
1621 | unsigned int i; | 1620 | unsigned int i, j; |
1622 | struct xt_table_info *newinfo, *info; | 1621 | struct xt_table_info *newinfo, *info; |
1623 | void *pos, *entry0, *entry1; | 1622 | void *pos, *entry0, *entry1; |
1624 | unsigned int size; | 1623 | unsigned int size; |
@@ -1636,21 +1635,21 @@ translate_compat_table(const char *name, | |||
1636 | } | 1635 | } |
1637 | 1636 | ||
1638 | duprintf("translate_compat_table: size %u\n", info->size); | 1637 | duprintf("translate_compat_table: size %u\n", info->size); |
1639 | i = 0; | 1638 | j = 0; |
1640 | xt_compat_lock(AF_INET); | 1639 | xt_compat_lock(AF_INET); |
1641 | /* Walk through entries, checking offsets. */ | 1640 | /* Walk through entries, checking offsets. */ |
1642 | ret = IPT_ENTRY_ITERATE(entry0, total_size, | 1641 | ret = IPT_ENTRY_ITERATE(entry0, total_size, |
1643 | check_compat_entry_size_and_hooks, | 1642 | check_compat_entry_size_and_hooks, |
1644 | info, &size, entry0, | 1643 | info, &size, entry0, |
1645 | entry0 + total_size, | 1644 | entry0 + total_size, |
1646 | hook_entries, underflows, &i, name); | 1645 | hook_entries, underflows, &j, name); |
1647 | if (ret != 0) | 1646 | if (ret != 0) |
1648 | goto out_unlock; | 1647 | goto out_unlock; |
1649 | 1648 | ||
1650 | ret = -EINVAL; | 1649 | ret = -EINVAL; |
1651 | if (i != number) { | 1650 | if (j != number) { |
1652 | duprintf("translate_compat_table: %u not %u entries\n", | 1651 | duprintf("translate_compat_table: %u not %u entries\n", |
1653 | i, number); | 1652 | j, number); |
1654 | goto out_unlock; | 1653 | goto out_unlock; |
1655 | } | 1654 | } |
1656 | 1655 | ||
@@ -1709,8 +1708,10 @@ translate_compat_table(const char *name, | |||
1709 | free_newinfo: | 1708 | free_newinfo: |
1710 | xt_free_table_info(newinfo); | 1709 | xt_free_table_info(newinfo); |
1711 | out: | 1710 | out: |
1711 | IPT_ENTRY_ITERATE(entry0, total_size, cleanup_entry, &j); | ||
1712 | return ret; | 1712 | return ret; |
1713 | out_unlock: | 1713 | out_unlock: |
1714 | compat_flush_offsets(); | ||
1714 | xt_compat_unlock(AF_INET); | 1715 | xt_compat_unlock(AF_INET); |
1715 | goto out; | 1716 | goto out; |
1716 | } | 1717 | } |
diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c index ad0312d0e4fd..264763adc39b 100644 --- a/net/ipv4/netfilter/ipt_REJECT.c +++ b/net/ipv4/netfilter/ipt_REJECT.c | |||
@@ -114,6 +114,14 @@ static void send_reset(struct sk_buff *oldskb, int hook) | |||
114 | tcph->window = 0; | 114 | tcph->window = 0; |
115 | tcph->urg_ptr = 0; | 115 | tcph->urg_ptr = 0; |
116 | 116 | ||
117 | /* Adjust TCP checksum */ | ||
118 | tcph->check = 0; | ||
119 | tcph->check = tcp_v4_check(tcph, sizeof(struct tcphdr), | ||
120 | nskb->nh.iph->saddr, | ||
121 | nskb->nh.iph->daddr, | ||
122 | csum_partial((char *)tcph, | ||
123 | sizeof(struct tcphdr), 0)); | ||
124 | |||
117 | /* Set DF, id = 0 */ | 125 | /* Set DF, id = 0 */ |
118 | nskb->nh.iph->frag_off = htons(IP_DF); | 126 | nskb->nh.iph->frag_off = htons(IP_DF); |
119 | nskb->nh.iph->id = 0; | 127 | nskb->nh.iph->id = 0; |
@@ -129,14 +137,8 @@ static void send_reset(struct sk_buff *oldskb, int hook) | |||
129 | if (ip_route_me_harder(&nskb, addr_type)) | 137 | if (ip_route_me_harder(&nskb, addr_type)) |
130 | goto free_nskb; | 138 | goto free_nskb; |
131 | 139 | ||
132 | /* Adjust TCP checksum */ | ||
133 | nskb->ip_summed = CHECKSUM_NONE; | 140 | nskb->ip_summed = CHECKSUM_NONE; |
134 | tcph->check = 0; | 141 | |
135 | tcph->check = tcp_v4_check(tcph, sizeof(struct tcphdr), | ||
136 | nskb->nh.iph->saddr, | ||
137 | nskb->nh.iph->daddr, | ||
138 | csum_partial((char *)tcph, | ||
139 | sizeof(struct tcphdr), 0)); | ||
140 | /* Adjust IP TTL */ | 142 | /* Adjust IP TTL */ |
141 | nskb->nh.iph->ttl = dst_metric(nskb->dst, RTAX_HOPLIMIT); | 143 | nskb->nh.iph->ttl = dst_metric(nskb->dst, RTAX_HOPLIMIT); |
142 | 144 | ||
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index b430cf2a4f66..5c31dead2bdc 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
@@ -329,7 +329,7 @@ error: | |||
329 | return err; | 329 | return err; |
330 | } | 330 | } |
331 | 331 | ||
332 | static void raw_probe_proto_opt(struct flowi *fl, struct msghdr *msg) | 332 | static int raw_probe_proto_opt(struct flowi *fl, struct msghdr *msg) |
333 | { | 333 | { |
334 | struct iovec *iov; | 334 | struct iovec *iov; |
335 | u8 __user *type = NULL; | 335 | u8 __user *type = NULL; |
@@ -338,7 +338,7 @@ static void raw_probe_proto_opt(struct flowi *fl, struct msghdr *msg) | |||
338 | unsigned int i; | 338 | unsigned int i; |
339 | 339 | ||
340 | if (!msg->msg_iov) | 340 | if (!msg->msg_iov) |
341 | return; | 341 | return 0; |
342 | 342 | ||
343 | for (i = 0; i < msg->msg_iovlen; i++) { | 343 | for (i = 0; i < msg->msg_iovlen; i++) { |
344 | iov = &msg->msg_iov[i]; | 344 | iov = &msg->msg_iov[i]; |
@@ -360,8 +360,9 @@ static void raw_probe_proto_opt(struct flowi *fl, struct msghdr *msg) | |||
360 | code = iov->iov_base; | 360 | code = iov->iov_base; |
361 | 361 | ||
362 | if (type && code) { | 362 | if (type && code) { |
363 | get_user(fl->fl_icmp_type, type); | 363 | if (get_user(fl->fl_icmp_type, type) || |
364 | get_user(fl->fl_icmp_code, code); | 364 | get_user(fl->fl_icmp_code, code)) |
365 | return -EFAULT; | ||
365 | probed = 1; | 366 | probed = 1; |
366 | } | 367 | } |
367 | break; | 368 | break; |
@@ -372,6 +373,7 @@ static void raw_probe_proto_opt(struct flowi *fl, struct msghdr *msg) | |||
372 | if (probed) | 373 | if (probed) |
373 | break; | 374 | break; |
374 | } | 375 | } |
376 | return 0; | ||
375 | } | 377 | } |
376 | 378 | ||
377 | static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | 379 | static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, |
@@ -480,8 +482,11 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
480 | .proto = inet->hdrincl ? IPPROTO_RAW : | 482 | .proto = inet->hdrincl ? IPPROTO_RAW : |
481 | sk->sk_protocol, | 483 | sk->sk_protocol, |
482 | }; | 484 | }; |
483 | if (!inet->hdrincl) | 485 | if (!inet->hdrincl) { |
484 | raw_probe_proto_opt(&fl, msg); | 486 | err = raw_probe_proto_opt(&fl, msg); |
487 | if (err) | ||
488 | goto done; | ||
489 | } | ||
485 | 490 | ||
486 | security_sk_classify_flow(sk, &fl); | 491 | security_sk_classify_flow(sk, &fl); |
487 | err = ip_route_output_flow(&rt, &fl, sk, !(msg->msg_flags&MSG_DONTWAIT)); | 492 | err = ip_route_output_flow(&rt, &fl, sk, !(msg->msg_flags&MSG_DONTWAIT)); |
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index e82a5be894b5..15061b314411 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c | |||
@@ -129,13 +129,6 @@ static int sysctl_tcp_congestion_control(ctl_table *table, int __user *name, | |||
129 | return ret; | 129 | return ret; |
130 | } | 130 | } |
131 | 131 | ||
132 | static int __init tcp_congestion_default(void) | ||
133 | { | ||
134 | return tcp_set_default_congestion_control(CONFIG_DEFAULT_TCP_CONG); | ||
135 | } | ||
136 | |||
137 | late_initcall(tcp_congestion_default); | ||
138 | |||
139 | ctl_table ipv4_table[] = { | 132 | ctl_table ipv4_table[] = { |
140 | { | 133 | { |
141 | .ctl_name = NET_IPV4_TCP_TIMESTAMPS, | 134 | .ctl_name = NET_IPV4_TCP_TIMESTAMPS, |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 66e9a729f6df..c05e8edaf544 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -2270,7 +2270,7 @@ void __init tcp_init(void) | |||
2270 | thash_entries, | 2270 | thash_entries, |
2271 | (num_physpages >= 128 * 1024) ? | 2271 | (num_physpages >= 128 * 1024) ? |
2272 | 13 : 15, | 2272 | 13 : 15, |
2273 | HASH_HIGHMEM, | 2273 | 0, |
2274 | &tcp_hashinfo.ehash_size, | 2274 | &tcp_hashinfo.ehash_size, |
2275 | NULL, | 2275 | NULL, |
2276 | 0); | 2276 | 0); |
@@ -2286,7 +2286,7 @@ void __init tcp_init(void) | |||
2286 | tcp_hashinfo.ehash_size, | 2286 | tcp_hashinfo.ehash_size, |
2287 | (num_physpages >= 128 * 1024) ? | 2287 | (num_physpages >= 128 * 1024) ? |
2288 | 13 : 15, | 2288 | 13 : 15, |
2289 | HASH_HIGHMEM, | 2289 | 0, |
2290 | &tcp_hashinfo.bhash_size, | 2290 | &tcp_hashinfo.bhash_size, |
2291 | NULL, | 2291 | NULL, |
2292 | 64 * 1024); | 2292 | 64 * 1024); |
@@ -2316,9 +2316,10 @@ void __init tcp_init(void) | |||
2316 | sysctl_max_syn_backlog = 128; | 2316 | sysctl_max_syn_backlog = 128; |
2317 | } | 2317 | } |
2318 | 2318 | ||
2319 | sysctl_tcp_mem[0] = 768 << order; | 2319 | /* Allow no more than 3/4 kernel memory (usually less) allocated to TCP */ |
2320 | sysctl_tcp_mem[1] = 1024 << order; | 2320 | sysctl_tcp_mem[0] = (1536 / sizeof (struct inet_bind_hashbucket)) << order; |
2321 | sysctl_tcp_mem[2] = 1536 << order; | 2321 | sysctl_tcp_mem[1] = sysctl_tcp_mem[0] * 4 / 3; |
2322 | sysctl_tcp_mem[2] = sysctl_tcp_mem[0] * 2; | ||
2322 | 2323 | ||
2323 | limit = ((unsigned long)sysctl_tcp_mem[1]) << (PAGE_SHIFT - 7); | 2324 | limit = ((unsigned long)sysctl_tcp_mem[1]) << (PAGE_SHIFT - 7); |
2324 | max_share = min(4UL*1024*1024, limit); | 2325 | max_share = min(4UL*1024*1024, limit); |
diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index af0aca1e6be6..1e2982f4acd4 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c | |||
@@ -131,6 +131,14 @@ int tcp_set_default_congestion_control(const char *name) | |||
131 | return ret; | 131 | return ret; |
132 | } | 132 | } |
133 | 133 | ||
134 | /* Set default value from kernel configuration at bootup */ | ||
135 | static int __init tcp_congestion_default(void) | ||
136 | { | ||
137 | return tcp_set_default_congestion_control(CONFIG_DEFAULT_TCP_CONG); | ||
138 | } | ||
139 | late_initcall(tcp_congestion_default); | ||
140 | |||
141 | |||
134 | /* Get current default congestion control */ | 142 | /* Get current default congestion control */ |
135 | void tcp_get_default_congestion_control(char *name) | 143 | void tcp_get_default_congestion_control(char *name) |
136 | { | 144 | { |
diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c index a60ef38d75c6..6ad184802266 100644 --- a/net/ipv4/tcp_cubic.c +++ b/net/ipv4/tcp_cubic.c | |||
@@ -190,7 +190,7 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd) | |||
190 | */ | 190 | */ |
191 | 191 | ||
192 | /* change the unit from HZ to bictcp_HZ */ | 192 | /* change the unit from HZ to bictcp_HZ */ |
193 | t = ((tcp_time_stamp + ca->delay_min - ca->epoch_start) | 193 | t = ((tcp_time_stamp + (ca->delay_min>>3) - ca->epoch_start) |
194 | << BICTCP_HZ) / HZ; | 194 | << BICTCP_HZ) / HZ; |
195 | 195 | ||
196 | if (t < ca->bic_K) /* t - K */ | 196 | if (t < ca->bic_K) /* t - K */ |
@@ -259,7 +259,7 @@ static inline void measure_delay(struct sock *sk) | |||
259 | (s32)(tcp_time_stamp - ca->epoch_start) < HZ) | 259 | (s32)(tcp_time_stamp - ca->epoch_start) < HZ) |
260 | return; | 260 | return; |
261 | 261 | ||
262 | delay = tcp_time_stamp - tp->rx_opt.rcv_tsecr; | 262 | delay = (tcp_time_stamp - tp->rx_opt.rcv_tsecr)<<3; |
263 | if (delay == 0) | 263 | if (delay == 0) |
264 | delay = 1; | 264 | delay = 1; |
265 | 265 | ||
@@ -366,7 +366,7 @@ static int __init cubictcp_register(void) | |||
366 | 366 | ||
367 | beta_scale = 8*(BICTCP_BETA_SCALE+beta)/ 3 / (BICTCP_BETA_SCALE - beta); | 367 | beta_scale = 8*(BICTCP_BETA_SCALE+beta)/ 3 / (BICTCP_BETA_SCALE - beta); |
368 | 368 | ||
369 | cube_rtt_scale = (bic_scale << 3) / 10; /* 1024*c/rtt */ | 369 | cube_rtt_scale = (bic_scale * 10); /* 1024*c/rtt */ |
370 | 370 | ||
371 | /* calculate the "K" for (wmax-cwnd) = c/rtt * K^3 | 371 | /* calculate the "K" for (wmax-cwnd) = c/rtt * K^3 |
372 | * so K = cubic_root( (wmax-cwnd)*rtt/c ) | 372 | * so K = cubic_root( (wmax-cwnd)*rtt/c ) |
diff --git a/net/ipv4/tcp_htcp.c b/net/ipv4/tcp_htcp.c index 682e7d5b6f2f..283be3cb4667 100644 --- a/net/ipv4/tcp_htcp.c +++ b/net/ipv4/tcp_htcp.c | |||
@@ -23,7 +23,7 @@ module_param(use_bandwidth_switch, int, 0644); | |||
23 | MODULE_PARM_DESC(use_bandwidth_switch, "turn on/off bandwidth switcher"); | 23 | MODULE_PARM_DESC(use_bandwidth_switch, "turn on/off bandwidth switcher"); |
24 | 24 | ||
25 | struct htcp { | 25 | struct htcp { |
26 | u16 alpha; /* Fixed point arith, << 7 */ | 26 | u32 alpha; /* Fixed point arith, << 7 */ |
27 | u8 beta; /* Fixed point arith, << 7 */ | 27 | u8 beta; /* Fixed point arith, << 7 */ |
28 | u8 modeswitch; /* Delay modeswitch until we had at least one congestion event */ | 28 | u8 modeswitch; /* Delay modeswitch until we had at least one congestion event */ |
29 | u32 last_cong; /* Time since last congestion event end */ | 29 | u32 last_cong; /* Time since last congestion event end */ |
diff --git a/net/ipv4/tcp_probe.c b/net/ipv4/tcp_probe.c index 4be336f17883..f230eeecf092 100644 --- a/net/ipv4/tcp_probe.c +++ b/net/ipv4/tcp_probe.c | |||
@@ -156,6 +156,8 @@ static __init int tcpprobe_init(void) | |||
156 | init_waitqueue_head(&tcpw.wait); | 156 | init_waitqueue_head(&tcpw.wait); |
157 | spin_lock_init(&tcpw.lock); | 157 | spin_lock_init(&tcpw.lock); |
158 | tcpw.fifo = kfifo_alloc(bufsize, GFP_KERNEL, &tcpw.lock); | 158 | tcpw.fifo = kfifo_alloc(bufsize, GFP_KERNEL, &tcpw.lock); |
159 | if (IS_ERR(tcpw.fifo)) | ||
160 | return PTR_ERR(tcpw.fifo); | ||
159 | 161 | ||
160 | if (!proc_net_fops_create(procname, S_IRUSR, &tcpprobe_fops)) | 162 | if (!proc_net_fops_create(procname, S_IRUSR, &tcpprobe_fops)) |
161 | goto err0; | 163 | goto err0; |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 865d75214a9a..9e1bd374875e 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -928,23 +928,32 @@ static int udp_encap_rcv(struct sock * sk, struct sk_buff *skb) | |||
928 | return 1; | 928 | return 1; |
929 | #else | 929 | #else |
930 | struct udp_sock *up = udp_sk(sk); | 930 | struct udp_sock *up = udp_sk(sk); |
931 | struct udphdr *uh = skb->h.uh; | 931 | struct udphdr *uh; |
932 | struct iphdr *iph; | 932 | struct iphdr *iph; |
933 | int iphlen, len; | 933 | int iphlen, len; |
934 | 934 | ||
935 | __u8 *udpdata = (__u8 *)uh + sizeof(struct udphdr); | 935 | __u8 *udpdata; |
936 | __be32 *udpdata32 = (__be32 *)udpdata; | 936 | __be32 *udpdata32; |
937 | __u16 encap_type = up->encap_type; | 937 | __u16 encap_type = up->encap_type; |
938 | 938 | ||
939 | /* if we're overly short, let UDP handle it */ | 939 | /* if we're overly short, let UDP handle it */ |
940 | if (udpdata > skb->tail) | 940 | len = skb->len - sizeof(struct udphdr); |
941 | if (len <= 0) | ||
941 | return 1; | 942 | return 1; |
942 | 943 | ||
943 | /* if this is not encapsulated socket, then just return now */ | 944 | /* if this is not encapsulated socket, then just return now */ |
944 | if (!encap_type) | 945 | if (!encap_type) |
945 | return 1; | 946 | return 1; |
946 | 947 | ||
947 | len = skb->tail - udpdata; | 948 | /* If this is a paged skb, make sure we pull up |
949 | * whatever data we need to look at. */ | ||
950 | if (!pskb_may_pull(skb, sizeof(struct udphdr) + min(len, 8))) | ||
951 | return 1; | ||
952 | |||
953 | /* Now we can get the pointers */ | ||
954 | uh = skb->h.uh; | ||
955 | udpdata = (__u8 *)uh + sizeof(struct udphdr); | ||
956 | udpdata32 = (__be32 *)udpdata; | ||
948 | 957 | ||
949 | switch (encap_type) { | 958 | switch (encap_type) { |
950 | default: | 959 | default: |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 8fcae7a6510b..f98ca30d7c1f 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
@@ -169,7 +169,6 @@ static __inline__ void rt6_release(struct rt6_info *rt) | |||
169 | 169 | ||
170 | static struct fib6_table fib6_main_tbl = { | 170 | static struct fib6_table fib6_main_tbl = { |
171 | .tb6_id = RT6_TABLE_MAIN, | 171 | .tb6_id = RT6_TABLE_MAIN, |
172 | .tb6_lock = RW_LOCK_UNLOCKED, | ||
173 | .tb6_root = { | 172 | .tb6_root = { |
174 | .leaf = &ip6_null_entry, | 173 | .leaf = &ip6_null_entry, |
175 | .fn_flags = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO, | 174 | .fn_flags = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO, |
@@ -187,6 +186,12 @@ static void fib6_link_table(struct fib6_table *tb) | |||
187 | { | 186 | { |
188 | unsigned int h; | 187 | unsigned int h; |
189 | 188 | ||
189 | /* | ||
190 | * Initialize table lock at a single place to give lockdep a key, | ||
191 | * tables aren't visible prior to being linked to the list. | ||
192 | */ | ||
193 | rwlock_init(&tb->tb6_lock); | ||
194 | |||
190 | h = tb->tb6_id & (FIB_TABLE_HASHSZ - 1); | 195 | h = tb->tb6_id & (FIB_TABLE_HASHSZ - 1); |
191 | 196 | ||
192 | /* | 197 | /* |
@@ -199,7 +204,6 @@ static void fib6_link_table(struct fib6_table *tb) | |||
199 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | 204 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES |
200 | static struct fib6_table fib6_local_tbl = { | 205 | static struct fib6_table fib6_local_tbl = { |
201 | .tb6_id = RT6_TABLE_LOCAL, | 206 | .tb6_id = RT6_TABLE_LOCAL, |
202 | .tb6_lock = RW_LOCK_UNLOCKED, | ||
203 | .tb6_root = { | 207 | .tb6_root = { |
204 | .leaf = &ip6_null_entry, | 208 | .leaf = &ip6_null_entry, |
205 | .fn_flags = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO, | 209 | .fn_flags = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO, |
@@ -213,7 +217,6 @@ static struct fib6_table *fib6_alloc_table(u32 id) | |||
213 | table = kzalloc(sizeof(*table), GFP_ATOMIC); | 217 | table = kzalloc(sizeof(*table), GFP_ATOMIC); |
214 | if (table != NULL) { | 218 | if (table != NULL) { |
215 | table->tb6_id = id; | 219 | table->tb6_id = id; |
216 | table->tb6_lock = RW_LOCK_UNLOCKED; | ||
217 | table->tb6_root.leaf = &ip6_null_entry; | 220 | table->tb6_root.leaf = &ip6_null_entry; |
218 | table->tb6_root.fn_flags = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO; | 221 | table->tb6_root.fn_flags = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO; |
219 | } | 222 | } |
diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c index 1d672b0547f2..6d4533b58dca 100644 --- a/net/ipv6/ip6_flowlabel.c +++ b/net/ipv6/ip6_flowlabel.c | |||
@@ -330,8 +330,10 @@ fl_create(struct in6_flowlabel_req *freq, char __user *optval, int optlen, int * | |||
330 | fl->share = freq->flr_share; | 330 | fl->share = freq->flr_share; |
331 | addr_type = ipv6_addr_type(&freq->flr_dst); | 331 | addr_type = ipv6_addr_type(&freq->flr_dst); |
332 | if ((addr_type&IPV6_ADDR_MAPPED) | 332 | if ((addr_type&IPV6_ADDR_MAPPED) |
333 | || addr_type == IPV6_ADDR_ANY) | 333 | || addr_type == IPV6_ADDR_ANY) { |
334 | err = -EINVAL; | ||
334 | goto done; | 335 | goto done; |
336 | } | ||
335 | ipv6_addr_copy(&fl->dst, &freq->flr_dst); | 337 | ipv6_addr_copy(&fl->dst, &freq->flr_dst); |
336 | atomic_set(&fl->users, 1); | 338 | atomic_set(&fl->users, 1); |
337 | switch (fl->share) { | 339 | switch (fl->share) { |
@@ -587,6 +589,8 @@ static struct ip6_flowlabel *ip6fl_get_next(struct seq_file *seq, struct ip6_flo | |||
587 | while (!fl) { | 589 | while (!fl) { |
588 | if (++state->bucket <= FL_HASH_MASK) | 590 | if (++state->bucket <= FL_HASH_MASK) |
589 | fl = fl_ht[state->bucket]; | 591 | fl = fl_ht[state->bucket]; |
592 | else | ||
593 | break; | ||
590 | } | 594 | } |
591 | return fl; | 595 | return fl; |
592 | } | 596 | } |
@@ -623,9 +627,13 @@ static void ip6fl_seq_stop(struct seq_file *seq, void *v) | |||
623 | read_unlock_bh(&ip6_fl_lock); | 627 | read_unlock_bh(&ip6_fl_lock); |
624 | } | 628 | } |
625 | 629 | ||
626 | static void ip6fl_fl_seq_show(struct seq_file *seq, struct ip6_flowlabel *fl) | 630 | static int ip6fl_seq_show(struct seq_file *seq, void *v) |
627 | { | 631 | { |
628 | while(fl) { | 632 | if (v == SEQ_START_TOKEN) |
633 | seq_printf(seq, "%-5s %-1s %-6s %-6s %-6s %-8s %-32s %s\n", | ||
634 | "Label", "S", "Owner", "Users", "Linger", "Expires", "Dst", "Opt"); | ||
635 | else { | ||
636 | struct ip6_flowlabel *fl = v; | ||
629 | seq_printf(seq, | 637 | seq_printf(seq, |
630 | "%05X %-1d %-6d %-6d %-6ld %-8ld " NIP6_SEQFMT " %-4d\n", | 638 | "%05X %-1d %-6d %-6d %-6ld %-8ld " NIP6_SEQFMT " %-4d\n", |
631 | (unsigned)ntohl(fl->label), | 639 | (unsigned)ntohl(fl->label), |
@@ -636,17 +644,7 @@ static void ip6fl_fl_seq_show(struct seq_file *seq, struct ip6_flowlabel *fl) | |||
636 | (long)(fl->expires - jiffies)/HZ, | 644 | (long)(fl->expires - jiffies)/HZ, |
637 | NIP6(fl->dst), | 645 | NIP6(fl->dst), |
638 | fl->opt ? fl->opt->opt_nflen : 0); | 646 | fl->opt ? fl->opt->opt_nflen : 0); |
639 | fl = fl->next; | ||
640 | } | 647 | } |
641 | } | ||
642 | |||
643 | static int ip6fl_seq_show(struct seq_file *seq, void *v) | ||
644 | { | ||
645 | if (v == SEQ_START_TOKEN) | ||
646 | seq_printf(seq, "%-5s %-1s %-6s %-6s %-6s %-8s %-32s %s\n", | ||
647 | "Label", "S", "Owner", "Users", "Linger", "Expires", "Dst", "Opt"); | ||
648 | else | ||
649 | ip6fl_fl_seq_show(seq, v); | ||
650 | return 0; | 648 | return 0; |
651 | } | 649 | } |
652 | 650 | ||
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 84d7ebdb9d21..b9f40290d12a 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
@@ -542,6 +542,7 @@ ip6ip6_rcv(struct sk_buff *skb) | |||
542 | skb->dev = t->dev; | 542 | skb->dev = t->dev; |
543 | dst_release(skb->dst); | 543 | dst_release(skb->dst); |
544 | skb->dst = NULL; | 544 | skb->dst = NULL; |
545 | nf_reset(skb); | ||
545 | if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY) | 546 | if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY) |
546 | ipv6_copy_dscp(ipv6h, skb->nh.ipv6h); | 547 | ipv6_copy_dscp(ipv6h, skb->nh.ipv6h); |
547 | ip6ip6_ecn_decapsulate(ipv6h, skb); | 548 | ip6ip6_ecn_decapsulate(ipv6h, skb); |
@@ -1149,6 +1150,20 @@ fail: | |||
1149 | return err; | 1150 | return err; |
1150 | } | 1151 | } |
1151 | 1152 | ||
1153 | static void __exit ip6ip6_destroy_tunnels(void) | ||
1154 | { | ||
1155 | int h; | ||
1156 | struct ip6_tnl *t; | ||
1157 | |||
1158 | for (h = 0; h < HASH_SIZE; h++) { | ||
1159 | while ((t = tnls_r_l[h]) != NULL) | ||
1160 | unregister_netdevice(t->dev); | ||
1161 | } | ||
1162 | |||
1163 | t = tnls_wc[0]; | ||
1164 | unregister_netdevice(t->dev); | ||
1165 | } | ||
1166 | |||
1152 | /** | 1167 | /** |
1153 | * ip6_tunnel_cleanup - free resources and unregister protocol | 1168 | * ip6_tunnel_cleanup - free resources and unregister protocol |
1154 | **/ | 1169 | **/ |
@@ -1158,7 +1173,9 @@ static void __exit ip6_tunnel_cleanup(void) | |||
1158 | if (xfrm6_tunnel_deregister(&ip6ip6_handler)) | 1173 | if (xfrm6_tunnel_deregister(&ip6ip6_handler)) |
1159 | printk(KERN_INFO "ip6ip6 close: can't deregister tunnel\n"); | 1174 | printk(KERN_INFO "ip6ip6 close: can't deregister tunnel\n"); |
1160 | 1175 | ||
1161 | unregister_netdev(ip6ip6_fb_tnl_dev); | 1176 | rtnl_lock(); |
1177 | ip6ip6_destroy_tunnels(); | ||
1178 | rtnl_unlock(); | ||
1162 | } | 1179 | } |
1163 | 1180 | ||
1164 | module_init(ip6_tunnel_init); | 1181 | module_init(ip6_tunnel_init); |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 41a8a5f06602..73eb8c33e9f0 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -1742,6 +1742,7 @@ int __init ndisc_init(struct net_proto_family *ops) | |||
1742 | 1742 | ||
1743 | void ndisc_cleanup(void) | 1743 | void ndisc_cleanup(void) |
1744 | { | 1744 | { |
1745 | unregister_netdevice_notifier(&ndisc_netdev_notifier); | ||
1745 | #ifdef CONFIG_SYSCTL | 1746 | #ifdef CONFIG_SYSCTL |
1746 | neigh_sysctl_unregister(&nd_tbl.parms); | 1747 | neigh_sysctl_unregister(&nd_tbl.parms); |
1747 | #endif | 1748 | #endif |
diff --git a/net/ipv6/netfilter/Kconfig b/net/ipv6/netfilter/Kconfig index 4bc4e5b33794..d7c45a9c15fe 100644 --- a/net/ipv6/netfilter/Kconfig +++ b/net/ipv6/netfilter/Kconfig | |||
@@ -40,7 +40,7 @@ config IP6_NF_QUEUE | |||
40 | To compile it as a module, choose M here. If unsure, say N. | 40 | To compile it as a module, choose M here. If unsure, say N. |
41 | 41 | ||
42 | config IP6_NF_IPTABLES | 42 | config IP6_NF_IPTABLES |
43 | tristate "IP6 tables support (required for filtering/masq/NAT)" | 43 | tristate "IP6 tables support (required for filtering)" |
44 | depends on NETFILTER_XTABLES | 44 | depends on NETFILTER_XTABLES |
45 | help | 45 | help |
46 | ip6tables is a general, extensible packet identification framework. | 46 | ip6tables is a general, extensible packet identification framework. |
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c index 9510c24ca8d2..9fec832ee08b 100644 --- a/net/ipv6/netfilter/ip6_queue.c +++ b/net/ipv6/netfilter/ip6_queue.c | |||
@@ -349,9 +349,10 @@ ipq_mangle_ipv6(ipq_verdict_msg_t *v, struct ipq_queue_entry *e) | |||
349 | if (v->data_len < sizeof(*user_iph)) | 349 | if (v->data_len < sizeof(*user_iph)) |
350 | return 0; | 350 | return 0; |
351 | diff = v->data_len - e->skb->len; | 351 | diff = v->data_len - e->skb->len; |
352 | if (diff < 0) | 352 | if (diff < 0) { |
353 | skb_trim(e->skb, v->data_len); | 353 | if (pskb_trim(e->skb, v->data_len)) |
354 | else if (diff > 0) { | 354 | return -ENOMEM; |
355 | } else if (diff > 0) { | ||
355 | if (v->data_len > 0xFFFF) | 356 | if (v->data_len > 0xFFFF) |
356 | return -EINVAL; | 357 | return -EINVAL; |
357 | if (diff > skb_tailroom(e->skb)) { | 358 | if (diff > skb_tailroom(e->skb)) { |
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 4ab368fa0b8f..204e02162d49 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c | |||
@@ -111,7 +111,7 @@ ip6_packet_match(const struct sk_buff *skb, | |||
111 | const char *outdev, | 111 | const char *outdev, |
112 | const struct ip6t_ip6 *ip6info, | 112 | const struct ip6t_ip6 *ip6info, |
113 | unsigned int *protoff, | 113 | unsigned int *protoff, |
114 | int *fragoff) | 114 | int *fragoff, int *hotdrop) |
115 | { | 115 | { |
116 | size_t i; | 116 | size_t i; |
117 | unsigned long ret; | 117 | unsigned long ret; |
@@ -169,9 +169,11 @@ ip6_packet_match(const struct sk_buff *skb, | |||
169 | unsigned short _frag_off; | 169 | unsigned short _frag_off; |
170 | 170 | ||
171 | protohdr = ipv6_find_hdr(skb, protoff, -1, &_frag_off); | 171 | protohdr = ipv6_find_hdr(skb, protoff, -1, &_frag_off); |
172 | if (protohdr < 0) | 172 | if (protohdr < 0) { |
173 | if (_frag_off == 0) | ||
174 | *hotdrop = 1; | ||
173 | return 0; | 175 | return 0; |
174 | 176 | } | |
175 | *fragoff = _frag_off; | 177 | *fragoff = _frag_off; |
176 | 178 | ||
177 | dprintf("Packet protocol %hi ?= %s%hi.\n", | 179 | dprintf("Packet protocol %hi ?= %s%hi.\n", |
@@ -290,7 +292,7 @@ ip6t_do_table(struct sk_buff **pskb, | |||
290 | IP_NF_ASSERT(e); | 292 | IP_NF_ASSERT(e); |
291 | IP_NF_ASSERT(back); | 293 | IP_NF_ASSERT(back); |
292 | if (ip6_packet_match(*pskb, indev, outdev, &e->ipv6, | 294 | if (ip6_packet_match(*pskb, indev, outdev, &e->ipv6, |
293 | &protoff, &offset)) { | 295 | &protoff, &offset, &hotdrop)) { |
294 | struct ip6t_entry_target *t; | 296 | struct ip6t_entry_target *t; |
295 | 297 | ||
296 | if (IP6T_MATCH_ITERATE(e, do_match, | 298 | if (IP6T_MATCH_ITERATE(e, do_match, |
@@ -584,12 +586,19 @@ check_entry(struct ip6t_entry *e, const char *name, unsigned int size, | |||
584 | return -EINVAL; | 586 | return -EINVAL; |
585 | } | 587 | } |
586 | 588 | ||
589 | if (e->target_offset + sizeof(struct ip6t_entry_target) > | ||
590 | e->next_offset) | ||
591 | return -EINVAL; | ||
592 | |||
587 | j = 0; | 593 | j = 0; |
588 | ret = IP6T_MATCH_ITERATE(e, check_match, name, &e->ipv6, e->comefrom, &j); | 594 | ret = IP6T_MATCH_ITERATE(e, check_match, name, &e->ipv6, e->comefrom, &j); |
589 | if (ret != 0) | 595 | if (ret != 0) |
590 | goto cleanup_matches; | 596 | goto cleanup_matches; |
591 | 597 | ||
592 | t = ip6t_get_target(e); | 598 | t = ip6t_get_target(e); |
599 | ret = -EINVAL; | ||
600 | if (e->target_offset + t->u.target_size > e->next_offset) | ||
601 | goto cleanup_matches; | ||
593 | target = try_then_request_module(xt_find_target(AF_INET6, | 602 | target = try_then_request_module(xt_find_target(AF_INET6, |
594 | t->u.user.name, | 603 | t->u.user.name, |
595 | t->u.user.revision), | 604 | t->u.user.revision), |
@@ -749,19 +758,17 @@ translate_table(const char *name, | |||
749 | } | 758 | } |
750 | } | 759 | } |
751 | 760 | ||
752 | if (!mark_source_chains(newinfo, valid_hooks, entry0)) | ||
753 | return -ELOOP; | ||
754 | |||
755 | /* Finally, each sanity check must pass */ | 761 | /* Finally, each sanity check must pass */ |
756 | i = 0; | 762 | i = 0; |
757 | ret = IP6T_ENTRY_ITERATE(entry0, newinfo->size, | 763 | ret = IP6T_ENTRY_ITERATE(entry0, newinfo->size, |
758 | check_entry, name, size, &i); | 764 | check_entry, name, size, &i); |
759 | 765 | ||
760 | if (ret != 0) { | 766 | if (ret != 0) |
761 | IP6T_ENTRY_ITERATE(entry0, newinfo->size, | 767 | goto cleanup; |
762 | cleanup_entry, &i); | 768 | |
763 | return ret; | 769 | ret = -ELOOP; |
764 | } | 770 | if (!mark_source_chains(newinfo, valid_hooks, entry0)) |
771 | goto cleanup; | ||
765 | 772 | ||
766 | /* And one copy for every other CPU */ | 773 | /* And one copy for every other CPU */ |
767 | for_each_possible_cpu(i) { | 774 | for_each_possible_cpu(i) { |
@@ -769,6 +776,9 @@ translate_table(const char *name, | |||
769 | memcpy(newinfo->entries[i], entry0, newinfo->size); | 776 | memcpy(newinfo->entries[i], entry0, newinfo->size); |
770 | } | 777 | } |
771 | 778 | ||
779 | return 0; | ||
780 | cleanup: | ||
781 | IP6T_ENTRY_ITERATE(entry0, newinfo->size, cleanup_entry, &i); | ||
772 | return ret; | 782 | return ret; |
773 | } | 783 | } |
774 | 784 | ||
@@ -1438,6 +1448,9 @@ static void __exit ip6_tables_fini(void) | |||
1438 | * If target header is found, its offset is set in *offset and return protocol | 1448 | * If target header is found, its offset is set in *offset and return protocol |
1439 | * number. Otherwise, return -1. | 1449 | * number. Otherwise, return -1. |
1440 | * | 1450 | * |
1451 | * If the first fragment doesn't contain the final protocol header or | ||
1452 | * NEXTHDR_NONE it is considered invalid. | ||
1453 | * | ||
1441 | * Note that non-1st fragment is special case that "the protocol number | 1454 | * Note that non-1st fragment is special case that "the protocol number |
1442 | * of last header" is "next header" field in Fragment header. In this case, | 1455 | * of last header" is "next header" field in Fragment header. In this case, |
1443 | * *offset is meaningless and fragment offset is stored in *fragoff if fragoff | 1456 | * *offset is meaningless and fragment offset is stored in *fragoff if fragoff |
@@ -1461,12 +1474,12 @@ int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, | |||
1461 | if ((!ipv6_ext_hdr(nexthdr)) || nexthdr == NEXTHDR_NONE) { | 1474 | if ((!ipv6_ext_hdr(nexthdr)) || nexthdr == NEXTHDR_NONE) { |
1462 | if (target < 0) | 1475 | if (target < 0) |
1463 | break; | 1476 | break; |
1464 | return -1; | 1477 | return -ENOENT; |
1465 | } | 1478 | } |
1466 | 1479 | ||
1467 | hp = skb_header_pointer(skb, start, sizeof(_hdr), &_hdr); | 1480 | hp = skb_header_pointer(skb, start, sizeof(_hdr), &_hdr); |
1468 | if (hp == NULL) | 1481 | if (hp == NULL) |
1469 | return -1; | 1482 | return -EBADMSG; |
1470 | if (nexthdr == NEXTHDR_FRAGMENT) { | 1483 | if (nexthdr == NEXTHDR_FRAGMENT) { |
1471 | unsigned short _frag_off, *fp; | 1484 | unsigned short _frag_off, *fp; |
1472 | fp = skb_header_pointer(skb, | 1485 | fp = skb_header_pointer(skb, |
@@ -1475,18 +1488,18 @@ int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, | |||
1475 | sizeof(_frag_off), | 1488 | sizeof(_frag_off), |
1476 | &_frag_off); | 1489 | &_frag_off); |
1477 | if (fp == NULL) | 1490 | if (fp == NULL) |
1478 | return -1; | 1491 | return -EBADMSG; |
1479 | 1492 | ||
1480 | _frag_off = ntohs(*fp) & ~0x7; | 1493 | _frag_off = ntohs(*fp) & ~0x7; |
1481 | if (_frag_off) { | 1494 | if (_frag_off) { |
1482 | if (target < 0 && | 1495 | if (target < 0 && |
1483 | ((!ipv6_ext_hdr(hp->nexthdr)) || | 1496 | ((!ipv6_ext_hdr(hp->nexthdr)) || |
1484 | nexthdr == NEXTHDR_NONE)) { | 1497 | hp->nexthdr == NEXTHDR_NONE)) { |
1485 | if (fragoff) | 1498 | if (fragoff) |
1486 | *fragoff = _frag_off; | 1499 | *fragoff = _frag_off; |
1487 | return hp->nexthdr; | 1500 | return hp->nexthdr; |
1488 | } | 1501 | } |
1489 | return -1; | 1502 | return -ENOENT; |
1490 | } | 1503 | } |
1491 | hdrlen = 8; | 1504 | hdrlen = 8; |
1492 | } else if (nexthdr == NEXTHDR_AUTH) | 1505 | } else if (nexthdr == NEXTHDR_AUTH) |
diff --git a/net/ipv6/netfilter/ip6t_ah.c b/net/ipv6/netfilter/ip6t_ah.c index ec1b1608156c..46486645eb75 100644 --- a/net/ipv6/netfilter/ip6t_ah.c +++ b/net/ipv6/netfilter/ip6t_ah.c | |||
@@ -54,9 +54,14 @@ match(const struct sk_buff *skb, | |||
54 | const struct ip6t_ah *ahinfo = matchinfo; | 54 | const struct ip6t_ah *ahinfo = matchinfo; |
55 | unsigned int ptr; | 55 | unsigned int ptr; |
56 | unsigned int hdrlen = 0; | 56 | unsigned int hdrlen = 0; |
57 | int err; | ||
57 | 58 | ||
58 | if (ipv6_find_hdr(skb, &ptr, NEXTHDR_AUTH, NULL) < 0) | 59 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_AUTH, NULL); |
60 | if (err < 0) { | ||
61 | if (err != -ENOENT) | ||
62 | *hotdrop = 1; | ||
59 | return 0; | 63 | return 0; |
64 | } | ||
60 | 65 | ||
61 | ah = skb_header_pointer(skb, ptr, sizeof(_ah), &_ah); | 66 | ah = skb_header_pointer(skb, ptr, sizeof(_ah), &_ah); |
62 | if (ah == NULL) { | 67 | if (ah == NULL) { |
diff --git a/net/ipv6/netfilter/ip6t_frag.c b/net/ipv6/netfilter/ip6t_frag.c index 78d9c8b9e28a..cd22eaaccdca 100644 --- a/net/ipv6/netfilter/ip6t_frag.c +++ b/net/ipv6/netfilter/ip6t_frag.c | |||
@@ -52,9 +52,14 @@ match(const struct sk_buff *skb, | |||
52 | struct frag_hdr _frag, *fh; | 52 | struct frag_hdr _frag, *fh; |
53 | const struct ip6t_frag *fraginfo = matchinfo; | 53 | const struct ip6t_frag *fraginfo = matchinfo; |
54 | unsigned int ptr; | 54 | unsigned int ptr; |
55 | int err; | ||
55 | 56 | ||
56 | if (ipv6_find_hdr(skb, &ptr, NEXTHDR_FRAGMENT, NULL) < 0) | 57 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_FRAGMENT, NULL); |
58 | if (err < 0) { | ||
59 | if (err != -ENOENT) | ||
60 | *hotdrop = 1; | ||
57 | return 0; | 61 | return 0; |
62 | } | ||
58 | 63 | ||
59 | fh = skb_header_pointer(skb, ptr, sizeof(_frag), &_frag); | 64 | fh = skb_header_pointer(skb, ptr, sizeof(_frag), &_frag); |
60 | if (fh == NULL) { | 65 | if (fh == NULL) { |
diff --git a/net/ipv6/netfilter/ip6t_hbh.c b/net/ipv6/netfilter/ip6t_hbh.c index d32a205e3af2..3f25babe0440 100644 --- a/net/ipv6/netfilter/ip6t_hbh.c +++ b/net/ipv6/netfilter/ip6t_hbh.c | |||
@@ -65,9 +65,14 @@ match(const struct sk_buff *skb, | |||
65 | u8 _opttype, *tp = NULL; | 65 | u8 _opttype, *tp = NULL; |
66 | u8 _optlen, *lp = NULL; | 66 | u8 _optlen, *lp = NULL; |
67 | unsigned int optlen; | 67 | unsigned int optlen; |
68 | int err; | ||
68 | 69 | ||
69 | if (ipv6_find_hdr(skb, &ptr, match->data, NULL) < 0) | 70 | err = ipv6_find_hdr(skb, &ptr, match->data, NULL); |
71 | if (err < 0) { | ||
72 | if (err != -ENOENT) | ||
73 | *hotdrop = 1; | ||
70 | return 0; | 74 | return 0; |
75 | } | ||
71 | 76 | ||
72 | oh = skb_header_pointer(skb, ptr, sizeof(_optsh), &_optsh); | 77 | oh = skb_header_pointer(skb, ptr, sizeof(_optsh), &_optsh); |
73 | if (oh == NULL) { | 78 | if (oh == NULL) { |
diff --git a/net/ipv6/netfilter/ip6t_rt.c b/net/ipv6/netfilter/ip6t_rt.c index bcb2e168a5bc..54d7d14134fd 100644 --- a/net/ipv6/netfilter/ip6t_rt.c +++ b/net/ipv6/netfilter/ip6t_rt.c | |||
@@ -58,9 +58,14 @@ match(const struct sk_buff *skb, | |||
58 | unsigned int hdrlen = 0; | 58 | unsigned int hdrlen = 0; |
59 | unsigned int ret = 0; | 59 | unsigned int ret = 0; |
60 | struct in6_addr *ap, _addr; | 60 | struct in6_addr *ap, _addr; |
61 | int err; | ||
61 | 62 | ||
62 | if (ipv6_find_hdr(skb, &ptr, NEXTHDR_ROUTING, NULL) < 0) | 63 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_ROUTING, NULL); |
64 | if (err < 0) { | ||
65 | if (err != -ENOENT) | ||
66 | *hotdrop = 1; | ||
63 | return 0; | 67 | return 0; |
68 | } | ||
64 | 69 | ||
65 | rh = skb_header_pointer(skb, ptr, sizeof(_route), &_route); | 70 | rh = skb_header_pointer(skb, ptr, sizeof(_route), &_route); |
66 | if (rh == NULL) { | 71 | if (rh == NULL) { |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index d09329ca3267..d6dedc4aec77 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -604,7 +604,7 @@ error: | |||
604 | return err; | 604 | return err; |
605 | } | 605 | } |
606 | 606 | ||
607 | static void rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg) | 607 | static int rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg) |
608 | { | 608 | { |
609 | struct iovec *iov; | 609 | struct iovec *iov; |
610 | u8 __user *type = NULL; | 610 | u8 __user *type = NULL; |
@@ -616,7 +616,7 @@ static void rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg) | |||
616 | int i; | 616 | int i; |
617 | 617 | ||
618 | if (!msg->msg_iov) | 618 | if (!msg->msg_iov) |
619 | return; | 619 | return 0; |
620 | 620 | ||
621 | for (i = 0; i < msg->msg_iovlen; i++) { | 621 | for (i = 0; i < msg->msg_iovlen; i++) { |
622 | iov = &msg->msg_iov[i]; | 622 | iov = &msg->msg_iov[i]; |
@@ -638,8 +638,9 @@ static void rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg) | |||
638 | code = iov->iov_base; | 638 | code = iov->iov_base; |
639 | 639 | ||
640 | if (type && code) { | 640 | if (type && code) { |
641 | get_user(fl->fl_icmp_type, type); | 641 | if (get_user(fl->fl_icmp_type, type) || |
642 | get_user(fl->fl_icmp_code, code); | 642 | get_user(fl->fl_icmp_code, code)) |
643 | return -EFAULT; | ||
643 | probed = 1; | 644 | probed = 1; |
644 | } | 645 | } |
645 | break; | 646 | break; |
@@ -650,7 +651,8 @@ static void rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg) | |||
650 | /* check if type field is readable or not. */ | 651 | /* check if type field is readable or not. */ |
651 | if (iov->iov_len > 2 - len) { | 652 | if (iov->iov_len > 2 - len) { |
652 | u8 __user *p = iov->iov_base; | 653 | u8 __user *p = iov->iov_base; |
653 | get_user(fl->fl_mh_type, &p[2 - len]); | 654 | if (get_user(fl->fl_mh_type, &p[2 - len])) |
655 | return -EFAULT; | ||
654 | probed = 1; | 656 | probed = 1; |
655 | } else | 657 | } else |
656 | len += iov->iov_len; | 658 | len += iov->iov_len; |
@@ -664,6 +666,7 @@ static void rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg) | |||
664 | if (probed) | 666 | if (probed) |
665 | break; | 667 | break; |
666 | } | 668 | } |
669 | return 0; | ||
667 | } | 670 | } |
668 | 671 | ||
669 | static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | 672 | static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, |
@@ -787,7 +790,9 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
787 | opt = ipv6_fixup_options(&opt_space, opt); | 790 | opt = ipv6_fixup_options(&opt_space, opt); |
788 | 791 | ||
789 | fl.proto = proto; | 792 | fl.proto = proto; |
790 | rawv6_probe_proto_opt(&fl, msg); | 793 | err = rawv6_probe_proto_opt(&fl, msg); |
794 | if (err) | ||
795 | goto out; | ||
791 | 796 | ||
792 | ipv6_addr_copy(&fl.fl6_dst, daddr); | 797 | ipv6_addr_copy(&fl.fl6_dst, daddr); |
793 | if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr)) | 798 | if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr)) |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index c953466b7afd..b39ae99122d5 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -330,6 +330,8 @@ static int inline rt6_check_neigh(struct rt6_info *rt) | |||
330 | read_lock_bh(&neigh->lock); | 330 | read_lock_bh(&neigh->lock); |
331 | if (neigh->nud_state & NUD_VALID) | 331 | if (neigh->nud_state & NUD_VALID) |
332 | m = 2; | 332 | m = 2; |
333 | else if (!(neigh->nud_state & NUD_FAILED)) | ||
334 | m = 1; | ||
333 | read_unlock_bh(&neigh->lock); | 335 | read_unlock_bh(&neigh->lock); |
334 | } | 336 | } |
335 | return m; | 337 | return m; |
@@ -347,9 +349,7 @@ static int rt6_score_route(struct rt6_info *rt, int oif, | |||
347 | m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2; | 349 | m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2; |
348 | #endif | 350 | #endif |
349 | n = rt6_check_neigh(rt); | 351 | n = rt6_check_neigh(rt); |
350 | if (n > 1) | 352 | if (!n && (strict & RT6_LOOKUP_F_REACHABLE)) |
351 | m |= 16; | ||
352 | else if (!n && strict & RT6_LOOKUP_F_REACHABLE) | ||
353 | return -1; | 353 | return -1; |
354 | return m; | 354 | return m; |
355 | } | 355 | } |
@@ -380,10 +380,11 @@ static struct rt6_info *rt6_select(struct rt6_info **head, int oif, | |||
380 | continue; | 380 | continue; |
381 | 381 | ||
382 | if (m > mpri) { | 382 | if (m > mpri) { |
383 | rt6_probe(match); | 383 | if (strict & RT6_LOOKUP_F_REACHABLE) |
384 | rt6_probe(match); | ||
384 | match = rt; | 385 | match = rt; |
385 | mpri = m; | 386 | mpri = m; |
386 | } else { | 387 | } else if (strict & RT6_LOOKUP_F_REACHABLE) { |
387 | rt6_probe(rt); | 388 | rt6_probe(rt); |
388 | } | 389 | } |
389 | } | 390 | } |
@@ -636,7 +637,7 @@ static struct rt6_info *ip6_pol_route_input(struct fib6_table *table, | |||
636 | int strict = 0; | 637 | int strict = 0; |
637 | int attempts = 3; | 638 | int attempts = 3; |
638 | int err; | 639 | int err; |
639 | int reachable = RT6_LOOKUP_F_REACHABLE; | 640 | int reachable = ipv6_devconf.forwarding ? 0 : RT6_LOOKUP_F_REACHABLE; |
640 | 641 | ||
641 | strict |= flags & RT6_LOOKUP_F_IFACE; | 642 | strict |= flags & RT6_LOOKUP_F_IFACE; |
642 | 643 | ||
@@ -733,7 +734,7 @@ static struct rt6_info *ip6_pol_route_output(struct fib6_table *table, | |||
733 | int strict = 0; | 734 | int strict = 0; |
734 | int attempts = 3; | 735 | int attempts = 3; |
735 | int err; | 736 | int err; |
736 | int reachable = RT6_LOOKUP_F_REACHABLE; | 737 | int reachable = ipv6_devconf.forwarding ? 0 : RT6_LOOKUP_F_REACHABLE; |
737 | 738 | ||
738 | strict |= flags & RT6_LOOKUP_F_IFACE; | 739 | strict |= flags & RT6_LOOKUP_F_IFACE; |
739 | 740 | ||
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index b481a4d780c2..be699f85b2c7 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -854,3 +854,4 @@ int __init sit_init(void) | |||
854 | module_init(sit_init); | 854 | module_init(sit_init); |
855 | module_exit(sit_cleanup); | 855 | module_exit(sit_cleanup); |
856 | MODULE_LICENSE("GPL"); | 856 | MODULE_LICENSE("GPL"); |
857 | MODULE_ALIAS("sit0"); | ||
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index e0c3934a7e4b..c83f23e51c46 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -242,14 +242,13 @@ static void udpv6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
242 | { | 242 | { |
243 | struct ipv6_pinfo *np; | 243 | struct ipv6_pinfo *np; |
244 | struct ipv6hdr *hdr = (struct ipv6hdr*)skb->data; | 244 | struct ipv6hdr *hdr = (struct ipv6hdr*)skb->data; |
245 | struct net_device *dev = skb->dev; | ||
246 | struct in6_addr *saddr = &hdr->saddr; | 245 | struct in6_addr *saddr = &hdr->saddr; |
247 | struct in6_addr *daddr = &hdr->daddr; | 246 | struct in6_addr *daddr = &hdr->daddr; |
248 | struct udphdr *uh = (struct udphdr*)(skb->data+offset); | 247 | struct udphdr *uh = (struct udphdr*)(skb->data+offset); |
249 | struct sock *sk; | 248 | struct sock *sk; |
250 | int err; | 249 | int err; |
251 | 250 | ||
252 | sk = udp_v6_lookup(daddr, uh->dest, saddr, uh->source, dev->ifindex); | 251 | sk = udp_v6_lookup(daddr, uh->dest, saddr, uh->source, inet6_iif(skb)); |
253 | 252 | ||
254 | if (sk == NULL) | 253 | if (sk == NULL) |
255 | return; | 254 | return; |
@@ -348,7 +347,7 @@ static void udpv6_mcast_deliver(struct udphdr *uh, | |||
348 | 347 | ||
349 | read_lock(&udp_hash_lock); | 348 | read_lock(&udp_hash_lock); |
350 | sk = sk_head(&udp_hash[ntohs(uh->dest) & (UDP_HTABLE_SIZE - 1)]); | 349 | sk = sk_head(&udp_hash[ntohs(uh->dest) & (UDP_HTABLE_SIZE - 1)]); |
351 | dif = skb->dev->ifindex; | 350 | dif = inet6_iif(skb); |
352 | sk = udp_v6_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif); | 351 | sk = udp_v6_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif); |
353 | if (!sk) { | 352 | if (!sk) { |
354 | kfree_skb(skb); | 353 | kfree_skb(skb); |
@@ -429,7 +428,7 @@ static int udpv6_rcv(struct sk_buff **pskb) | |||
429 | * check socket cache ... must talk to Alan about his plans | 428 | * check socket cache ... must talk to Alan about his plans |
430 | * for sock caches... i'll skip this for now. | 429 | * for sock caches... i'll skip this for now. |
431 | */ | 430 | */ |
432 | sk = udp_v6_lookup(saddr, uh->source, daddr, uh->dest, dev->ifindex); | 431 | sk = udp_v6_lookup(saddr, uh->source, daddr, uh->dest, inet6_iif(skb)); |
433 | 432 | ||
434 | if (sk == NULL) { | 433 | if (sk == NULL) { |
435 | if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) | 434 | if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) |
diff --git a/net/ipv6/xfrm6_tunnel.c b/net/ipv6/xfrm6_tunnel.c index 7af227bb1551..7931e4f898d4 100644 --- a/net/ipv6/xfrm6_tunnel.c +++ b/net/ipv6/xfrm6_tunnel.c | |||
@@ -135,7 +135,7 @@ u32 xfrm6_tunnel_spi_lookup(xfrm_address_t *saddr) | |||
135 | x6spi = __xfrm6_tunnel_spi_lookup(saddr); | 135 | x6spi = __xfrm6_tunnel_spi_lookup(saddr); |
136 | spi = x6spi ? x6spi->spi : 0; | 136 | spi = x6spi ? x6spi->spi : 0; |
137 | read_unlock_bh(&xfrm6_tunnel_spi_lock); | 137 | read_unlock_bh(&xfrm6_tunnel_spi_lock); |
138 | return spi; | 138 | return htonl(spi); |
139 | } | 139 | } |
140 | 140 | ||
141 | EXPORT_SYMBOL(xfrm6_tunnel_spi_lookup); | 141 | EXPORT_SYMBOL(xfrm6_tunnel_spi_lookup); |
@@ -210,7 +210,7 @@ u32 xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr) | |||
210 | spi = __xfrm6_tunnel_alloc_spi(saddr); | 210 | spi = __xfrm6_tunnel_alloc_spi(saddr); |
211 | write_unlock_bh(&xfrm6_tunnel_spi_lock); | 211 | write_unlock_bh(&xfrm6_tunnel_spi_lock); |
212 | 212 | ||
213 | return spi; | 213 | return htonl(spi); |
214 | } | 214 | } |
215 | 215 | ||
216 | EXPORT_SYMBOL(xfrm6_tunnel_alloc_spi); | 216 | EXPORT_SYMBOL(xfrm6_tunnel_alloc_spi); |
diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c index bef3f61569f7..76c661566dfd 100644 --- a/net/ipx/af_ipx.c +++ b/net/ipx/af_ipx.c | |||
@@ -83,13 +83,13 @@ DEFINE_SPINLOCK(ipx_interfaces_lock); | |||
83 | struct ipx_interface *ipx_primary_net; | 83 | struct ipx_interface *ipx_primary_net; |
84 | struct ipx_interface *ipx_internal_net; | 84 | struct ipx_interface *ipx_internal_net; |
85 | 85 | ||
86 | extern int ipxrtr_add_route(__u32 network, struct ipx_interface *intrfc, | 86 | extern int ipxrtr_add_route(__be32 network, struct ipx_interface *intrfc, |
87 | unsigned char *node); | 87 | unsigned char *node); |
88 | extern void ipxrtr_del_routes(struct ipx_interface *intrfc); | 88 | extern void ipxrtr_del_routes(struct ipx_interface *intrfc); |
89 | extern int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx, | 89 | extern int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx, |
90 | struct iovec *iov, int len, int noblock); | 90 | struct iovec *iov, int len, int noblock); |
91 | extern int ipxrtr_route_skb(struct sk_buff *skb); | 91 | extern int ipxrtr_route_skb(struct sk_buff *skb); |
92 | extern struct ipx_route *ipxrtr_lookup(__u32 net); | 92 | extern struct ipx_route *ipxrtr_lookup(__be32 net); |
93 | extern int ipxrtr_ioctl(unsigned int cmd, void __user *arg); | 93 | extern int ipxrtr_ioctl(unsigned int cmd, void __user *arg); |
94 | 94 | ||
95 | #undef IPX_REFCNT_DEBUG | 95 | #undef IPX_REFCNT_DEBUG |
@@ -177,7 +177,7 @@ static void ipxitf_clear_primary_net(void) | |||
177 | } | 177 | } |
178 | 178 | ||
179 | static struct ipx_interface *__ipxitf_find_using_phys(struct net_device *dev, | 179 | static struct ipx_interface *__ipxitf_find_using_phys(struct net_device *dev, |
180 | unsigned short datalink) | 180 | __be16 datalink) |
181 | { | 181 | { |
182 | struct ipx_interface *i; | 182 | struct ipx_interface *i; |
183 | 183 | ||
@@ -190,7 +190,7 @@ out: | |||
190 | } | 190 | } |
191 | 191 | ||
192 | static struct ipx_interface *ipxitf_find_using_phys(struct net_device *dev, | 192 | static struct ipx_interface *ipxitf_find_using_phys(struct net_device *dev, |
193 | unsigned short datalink) | 193 | __be16 datalink) |
194 | { | 194 | { |
195 | struct ipx_interface *i; | 195 | struct ipx_interface *i; |
196 | 196 | ||
@@ -202,7 +202,7 @@ static struct ipx_interface *ipxitf_find_using_phys(struct net_device *dev, | |||
202 | return i; | 202 | return i; |
203 | } | 203 | } |
204 | 204 | ||
205 | struct ipx_interface *ipxitf_find_using_net(__u32 net) | 205 | struct ipx_interface *ipxitf_find_using_net(__be32 net) |
206 | { | 206 | { |
207 | struct ipx_interface *i; | 207 | struct ipx_interface *i; |
208 | 208 | ||
@@ -237,7 +237,7 @@ static void ipxitf_insert_socket(struct ipx_interface *intrfc, struct sock *sk) | |||
237 | 237 | ||
238 | /* caller must hold intrfc->if_sklist_lock */ | 238 | /* caller must hold intrfc->if_sklist_lock */ |
239 | static struct sock *__ipxitf_find_socket(struct ipx_interface *intrfc, | 239 | static struct sock *__ipxitf_find_socket(struct ipx_interface *intrfc, |
240 | unsigned short port) | 240 | __be16 port) |
241 | { | 241 | { |
242 | struct sock *s; | 242 | struct sock *s; |
243 | struct hlist_node *node; | 243 | struct hlist_node *node; |
@@ -252,7 +252,7 @@ found: | |||
252 | 252 | ||
253 | /* caller must hold a reference to intrfc */ | 253 | /* caller must hold a reference to intrfc */ |
254 | static struct sock *ipxitf_find_socket(struct ipx_interface *intrfc, | 254 | static struct sock *ipxitf_find_socket(struct ipx_interface *intrfc, |
255 | unsigned short port) | 255 | __be16 port) |
256 | { | 256 | { |
257 | struct sock *s; | 257 | struct sock *s; |
258 | 258 | ||
@@ -268,7 +268,7 @@ static struct sock *ipxitf_find_socket(struct ipx_interface *intrfc, | |||
268 | #ifdef CONFIG_IPX_INTERN | 268 | #ifdef CONFIG_IPX_INTERN |
269 | static struct sock *ipxitf_find_internal_socket(struct ipx_interface *intrfc, | 269 | static struct sock *ipxitf_find_internal_socket(struct ipx_interface *intrfc, |
270 | unsigned char *ipx_node, | 270 | unsigned char *ipx_node, |
271 | unsigned short port) | 271 | __be16 port) |
272 | { | 272 | { |
273 | struct sock *s; | 273 | struct sock *s; |
274 | struct hlist_node *node; | 274 | struct hlist_node *node; |
@@ -600,10 +600,10 @@ int ipxitf_send(struct ipx_interface *intrfc, struct sk_buff *skb, char *node) | |||
600 | 600 | ||
601 | /* see if we need to include the netnum in the route list */ | 601 | /* see if we need to include the netnum in the route list */ |
602 | if (IPX_SKB_CB(skb)->last_hop.index >= 0) { | 602 | if (IPX_SKB_CB(skb)->last_hop.index >= 0) { |
603 | u32 *last_hop = (u32 *)(((u8 *) skb->data) + | 603 | __be32 *last_hop = (__be32 *)(((u8 *) skb->data) + |
604 | sizeof(struct ipxhdr) + | 604 | sizeof(struct ipxhdr) + |
605 | IPX_SKB_CB(skb)->last_hop.index * | 605 | IPX_SKB_CB(skb)->last_hop.index * |
606 | sizeof(u32)); | 606 | sizeof(__be32)); |
607 | *last_hop = IPX_SKB_CB(skb)->last_hop.netnum; | 607 | *last_hop = IPX_SKB_CB(skb)->last_hop.netnum; |
608 | IPX_SKB_CB(skb)->last_hop.index = -1; | 608 | IPX_SKB_CB(skb)->last_hop.index = -1; |
609 | } | 609 | } |
@@ -772,7 +772,7 @@ static void ipxitf_discover_netnum(struct ipx_interface *intrfc, | |||
772 | } else { | 772 | } else { |
773 | printk(KERN_WARNING "IPX: Network number collision " | 773 | printk(KERN_WARNING "IPX: Network number collision " |
774 | "%lx\n %s %s and %s %s\n", | 774 | "%lx\n %s %s and %s %s\n", |
775 | (unsigned long) htonl(cb->ipx_source_net), | 775 | (unsigned long) ntohl(cb->ipx_source_net), |
776 | ipx_device_name(i), | 776 | ipx_device_name(i), |
777 | ipx_frame_name(i->if_dlink_type), | 777 | ipx_frame_name(i->if_dlink_type), |
778 | ipx_device_name(intrfc), | 778 | ipx_device_name(intrfc), |
@@ -812,7 +812,7 @@ static int ipxitf_pprop(struct ipx_interface *intrfc, struct sk_buff *skb) | |||
812 | int i, rc = -EINVAL; | 812 | int i, rc = -EINVAL; |
813 | struct ipx_interface *ifcs; | 813 | struct ipx_interface *ifcs; |
814 | char *c; | 814 | char *c; |
815 | u32 *l; | 815 | __be32 *l; |
816 | 816 | ||
817 | /* Illegal packet - too many hops or too short */ | 817 | /* Illegal packet - too many hops or too short */ |
818 | /* We decide to throw it away: no broadcasting, no local processing. | 818 | /* We decide to throw it away: no broadcasting, no local processing. |
@@ -833,7 +833,7 @@ static int ipxitf_pprop(struct ipx_interface *intrfc, struct sk_buff *skb) | |||
833 | goto out; | 833 | goto out; |
834 | 834 | ||
835 | c = ((u8 *) ipx) + sizeof(struct ipxhdr); | 835 | c = ((u8 *) ipx) + sizeof(struct ipxhdr); |
836 | l = (u32 *) c; | 836 | l = (__be32 *) c; |
837 | 837 | ||
838 | /* Don't broadcast packet if already seen this net */ | 838 | /* Don't broadcast packet if already seen this net */ |
839 | for (i = 0; i < IPX_SKB_CB(skb)->ipx_tctrl; i++) | 839 | for (i = 0; i < IPX_SKB_CB(skb)->ipx_tctrl; i++) |
@@ -855,7 +855,7 @@ static int ipxitf_pprop(struct ipx_interface *intrfc, struct sk_buff *skb) | |||
855 | /* That aren't in the list */ | 855 | /* That aren't in the list */ |
856 | if (ifcs == intrfc) | 856 | if (ifcs == intrfc) |
857 | continue; | 857 | continue; |
858 | l = (__u32 *) c; | 858 | l = (__be32 *) c; |
859 | /* don't consider the last entry in the packet list, | 859 | /* don't consider the last entry in the packet list, |
860 | * it is our netnum, and it is not there yet */ | 860 | * it is our netnum, and it is not there yet */ |
861 | for (i = 0; i < IPX_SKB_CB(skb)->ipx_tctrl; i++) | 861 | for (i = 0; i < IPX_SKB_CB(skb)->ipx_tctrl; i++) |
@@ -885,8 +885,8 @@ static void ipxitf_insert(struct ipx_interface *intrfc) | |||
885 | ipx_primary_net = intrfc; | 885 | ipx_primary_net = intrfc; |
886 | } | 886 | } |
887 | 887 | ||
888 | static struct ipx_interface *ipxitf_alloc(struct net_device *dev, __u32 netnum, | 888 | static struct ipx_interface *ipxitf_alloc(struct net_device *dev, __be32 netnum, |
889 | unsigned short dlink_type, | 889 | __be16 dlink_type, |
890 | struct datalink_proto *dlink, | 890 | struct datalink_proto *dlink, |
891 | unsigned char internal, | 891 | unsigned char internal, |
892 | int ipx_offset) | 892 | int ipx_offset) |
@@ -960,7 +960,7 @@ static __be16 ipx_map_frame_type(unsigned char type) | |||
960 | static int ipxitf_create(struct ipx_interface_definition *idef) | 960 | static int ipxitf_create(struct ipx_interface_definition *idef) |
961 | { | 961 | { |
962 | struct net_device *dev; | 962 | struct net_device *dev; |
963 | unsigned short dlink_type = 0; | 963 | __be16 dlink_type = 0; |
964 | struct datalink_proto *datalink = NULL; | 964 | struct datalink_proto *datalink = NULL; |
965 | struct ipx_interface *intrfc; | 965 | struct ipx_interface *intrfc; |
966 | int rc; | 966 | int rc; |
@@ -1073,7 +1073,7 @@ out: | |||
1073 | static int ipxitf_delete(struct ipx_interface_definition *idef) | 1073 | static int ipxitf_delete(struct ipx_interface_definition *idef) |
1074 | { | 1074 | { |
1075 | struct net_device *dev = NULL; | 1075 | struct net_device *dev = NULL; |
1076 | unsigned short dlink_type = 0; | 1076 | __be16 dlink_type = 0; |
1077 | struct ipx_interface *intrfc; | 1077 | struct ipx_interface *intrfc; |
1078 | int rc = 0; | 1078 | int rc = 0; |
1079 | 1079 | ||
@@ -1110,7 +1110,7 @@ out: | |||
1110 | } | 1110 | } |
1111 | 1111 | ||
1112 | static struct ipx_interface *ipxitf_auto_create(struct net_device *dev, | 1112 | static struct ipx_interface *ipxitf_auto_create(struct net_device *dev, |
1113 | unsigned short dlink_type) | 1113 | __be16 dlink_type) |
1114 | { | 1114 | { |
1115 | struct ipx_interface *intrfc = NULL; | 1115 | struct ipx_interface *intrfc = NULL; |
1116 | struct datalink_proto *datalink; | 1116 | struct datalink_proto *datalink; |
@@ -1122,7 +1122,7 @@ static struct ipx_interface *ipxitf_auto_create(struct net_device *dev, | |||
1122 | if (dev->addr_len > IPX_NODE_LEN) | 1122 | if (dev->addr_len > IPX_NODE_LEN) |
1123 | goto out; | 1123 | goto out; |
1124 | 1124 | ||
1125 | switch (htons(dlink_type)) { | 1125 | switch (ntohs(dlink_type)) { |
1126 | case ETH_P_IPX: datalink = pEII_datalink; break; | 1126 | case ETH_P_IPX: datalink = pEII_datalink; break; |
1127 | case ETH_P_802_2: datalink = p8022_datalink; break; | 1127 | case ETH_P_802_2: datalink = p8022_datalink; break; |
1128 | case ETH_P_SNAP: datalink = pSNAP_datalink; break; | 1128 | case ETH_P_SNAP: datalink = pSNAP_datalink; break; |
@@ -1234,27 +1234,27 @@ static int ipxitf_ioctl(unsigned int cmd, void __user *arg) | |||
1234 | /* Note: We assume ipx_tctrl==0 and htons(length)==ipx_pktsize */ | 1234 | /* Note: We assume ipx_tctrl==0 and htons(length)==ipx_pktsize */ |
1235 | /* This functions should *not* mess with packet contents */ | 1235 | /* This functions should *not* mess with packet contents */ |
1236 | 1236 | ||
1237 | __u16 ipx_cksum(struct ipxhdr *packet, int length) | 1237 | __be16 ipx_cksum(struct ipxhdr *packet, int length) |
1238 | { | 1238 | { |
1239 | /* | 1239 | /* |
1240 | * NOTE: sum is a net byte order quantity, which optimizes the | 1240 | * NOTE: sum is a net byte order quantity, which optimizes the |
1241 | * loop. This only works on big and little endian machines. (I | 1241 | * loop. This only works on big and little endian machines. (I |
1242 | * don't know of a machine that isn't.) | 1242 | * don't know of a machine that isn't.) |
1243 | */ | 1243 | */ |
1244 | /* start at ipx_dest - We skip the checksum field and start with | 1244 | /* handle the first 3 words separately; checksum should be skipped |
1245 | * ipx_type before the loop, not considering ipx_tctrl in the calc */ | 1245 | * and ipx_tctrl masked out */ |
1246 | __u16 *p = (__u16 *)&packet->ipx_dest; | 1246 | __u16 *p = (__u16 *)packet; |
1247 | __u32 i = (length >> 1) - 1; /* Number of complete words */ | 1247 | __u32 sum = p[1] + (p[2] & (__force u16)htons(0x00ff)); |
1248 | __u32 sum = packet->ipx_type << sizeof(packet->ipx_tctrl); | 1248 | __u32 i = (length >> 1) - 3; /* Number of remaining complete words */ |
1249 | 1249 | ||
1250 | /* Loop through all complete words except the checksum field, | 1250 | /* Loop through them */ |
1251 | * ipx_type (accounted above) and ipx_tctrl (not used in the cksum) */ | 1251 | p += 3; |
1252 | while (--i) | 1252 | while (i--) |
1253 | sum += *p++; | 1253 | sum += *p++; |
1254 | 1254 | ||
1255 | /* Add on the last part word if it exists */ | 1255 | /* Add on the last part word if it exists */ |
1256 | if (packet->ipx_pktsize & htons(1)) | 1256 | if (packet->ipx_pktsize & htons(1)) |
1257 | sum += ntohs(0xff00) & *p; | 1257 | sum += (__force u16)htons(0xff00) & *p; |
1258 | 1258 | ||
1259 | /* Do final fixup */ | 1259 | /* Do final fixup */ |
1260 | sum = (sum & 0xffff) + (sum >> 16); | 1260 | sum = (sum & 0xffff) + (sum >> 16); |
@@ -1263,10 +1263,17 @@ __u16 ipx_cksum(struct ipxhdr *packet, int length) | |||
1263 | if (sum >= 0x10000) | 1263 | if (sum >= 0x10000) |
1264 | sum++; | 1264 | sum++; |
1265 | 1265 | ||
1266 | return ~sum; | 1266 | /* |
1267 | * Leave 0 alone; we don't want 0xffff here. Note that we can't get | ||
1268 | * here with 0x10000, so this check is the same as ((__u16)sum) | ||
1269 | */ | ||
1270 | if (sum) | ||
1271 | sum = ~sum; | ||
1272 | |||
1273 | return (__force __be16)sum; | ||
1267 | } | 1274 | } |
1268 | 1275 | ||
1269 | const char *ipx_frame_name(unsigned short frame) | 1276 | const char *ipx_frame_name(__be16 frame) |
1270 | { | 1277 | { |
1271 | char* rc = "None"; | 1278 | char* rc = "None"; |
1272 | 1279 | ||
@@ -1401,7 +1408,7 @@ out: | |||
1401 | 1408 | ||
1402 | /* caller must hold a reference to intrfc */ | 1409 | /* caller must hold a reference to intrfc */ |
1403 | 1410 | ||
1404 | static unsigned short ipx_first_free_socketnum(struct ipx_interface *intrfc) | 1411 | static __be16 ipx_first_free_socketnum(struct ipx_interface *intrfc) |
1405 | { | 1412 | { |
1406 | unsigned short socketNum = intrfc->if_sknum; | 1413 | unsigned short socketNum = intrfc->if_sknum; |
1407 | 1414 | ||
@@ -1410,7 +1417,7 @@ static unsigned short ipx_first_free_socketnum(struct ipx_interface *intrfc) | |||
1410 | if (socketNum < IPX_MIN_EPHEMERAL_SOCKET) | 1417 | if (socketNum < IPX_MIN_EPHEMERAL_SOCKET) |
1411 | socketNum = IPX_MIN_EPHEMERAL_SOCKET; | 1418 | socketNum = IPX_MIN_EPHEMERAL_SOCKET; |
1412 | 1419 | ||
1413 | while (__ipxitf_find_socket(intrfc, ntohs(socketNum))) | 1420 | while (__ipxitf_find_socket(intrfc, htons(socketNum))) |
1414 | if (socketNum > IPX_MAX_EPHEMERAL_SOCKET) | 1421 | if (socketNum > IPX_MAX_EPHEMERAL_SOCKET) |
1415 | socketNum = IPX_MIN_EPHEMERAL_SOCKET; | 1422 | socketNum = IPX_MIN_EPHEMERAL_SOCKET; |
1416 | else | 1423 | else |
@@ -1419,7 +1426,7 @@ static unsigned short ipx_first_free_socketnum(struct ipx_interface *intrfc) | |||
1419 | spin_unlock_bh(&intrfc->if_sklist_lock); | 1426 | spin_unlock_bh(&intrfc->if_sklist_lock); |
1420 | intrfc->if_sknum = socketNum; | 1427 | intrfc->if_sknum = socketNum; |
1421 | 1428 | ||
1422 | return ntohs(socketNum); | 1429 | return htons(socketNum); |
1423 | } | 1430 | } |
1424 | 1431 | ||
1425 | static int ipx_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | 1432 | static int ipx_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) |
@@ -1473,7 +1480,7 @@ static int ipx_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
1473 | ipxs->port)) { | 1480 | ipxs->port)) { |
1474 | SOCK_DEBUG(sk, | 1481 | SOCK_DEBUG(sk, |
1475 | "IPX: bind failed because port %X in use.\n", | 1482 | "IPX: bind failed because port %X in use.\n", |
1476 | ntohs((int)addr->sipx_port)); | 1483 | ntohs(addr->sipx_port)); |
1477 | goto out_put; | 1484 | goto out_put; |
1478 | } | 1485 | } |
1479 | } else { | 1486 | } else { |
@@ -1488,7 +1495,7 @@ static int ipx_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
1488 | if (ipxitf_find_socket(intrfc, addr->sipx_port)) { | 1495 | if (ipxitf_find_socket(intrfc, addr->sipx_port)) { |
1489 | SOCK_DEBUG(sk, | 1496 | SOCK_DEBUG(sk, |
1490 | "IPX: bind failed because port %X in use.\n", | 1497 | "IPX: bind failed because port %X in use.\n", |
1491 | ntohs((int)addr->sipx_port)); | 1498 | ntohs(addr->sipx_port)); |
1492 | goto out_put; | 1499 | goto out_put; |
1493 | } | 1500 | } |
1494 | } | 1501 | } |
@@ -1665,7 +1672,7 @@ static int ipx_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_ty | |||
1665 | intrfc = ipxitf_find_using_phys(dev, pt->type); | 1672 | intrfc = ipxitf_find_using_phys(dev, pt->type); |
1666 | if (!intrfc) { | 1673 | if (!intrfc) { |
1667 | if (ipxcfg_auto_create_interfaces && | 1674 | if (ipxcfg_auto_create_interfaces && |
1668 | ntohl(IPX_SKB_CB(skb)->ipx_dest_net)) { | 1675 | IPX_SKB_CB(skb)->ipx_dest_net) { |
1669 | intrfc = ipxitf_auto_create(dev, pt->type); | 1676 | intrfc = ipxitf_auto_create(dev, pt->type); |
1670 | if (intrfc) | 1677 | if (intrfc) |
1671 | ipxitf_hold(intrfc); | 1678 | ipxitf_hold(intrfc); |
diff --git a/net/ipx/ipx_proc.c b/net/ipx/ipx_proc.c index 4c0c71206e54..b7463dfca63e 100644 --- a/net/ipx/ipx_proc.c +++ b/net/ipx/ipx_proc.c | |||
@@ -260,22 +260,22 @@ static int ipx_seq_socket_show(struct seq_file *seq, void *v) | |||
260 | ipxs = ipx_sk(s); | 260 | ipxs = ipx_sk(s); |
261 | #ifdef CONFIG_IPX_INTERN | 261 | #ifdef CONFIG_IPX_INTERN |
262 | seq_printf(seq, "%08lX:%02X%02X%02X%02X%02X%02X:%04X ", | 262 | seq_printf(seq, "%08lX:%02X%02X%02X%02X%02X%02X:%04X ", |
263 | (unsigned long)htonl(ipxs->intrfc->if_netnum), | 263 | (unsigned long)ntohl(ipxs->intrfc->if_netnum), |
264 | ipxs->node[0], ipxs->node[1], ipxs->node[2], ipxs->node[3], | 264 | ipxs->node[0], ipxs->node[1], ipxs->node[2], ipxs->node[3], |
265 | ipxs->node[4], ipxs->node[5], htons(ipxs->port)); | 265 | ipxs->node[4], ipxs->node[5], ntohs(ipxs->port)); |
266 | #else | 266 | #else |
267 | seq_printf(seq, "%08lX:%04X ", (unsigned long) htonl(ipxs->intrfc->if_netnum), | 267 | seq_printf(seq, "%08lX:%04X ", (unsigned long) ntohl(ipxs->intrfc->if_netnum), |
268 | htons(ipxs->port)); | 268 | ntohs(ipxs->port)); |
269 | #endif /* CONFIG_IPX_INTERN */ | 269 | #endif /* CONFIG_IPX_INTERN */ |
270 | if (s->sk_state != TCP_ESTABLISHED) | 270 | if (s->sk_state != TCP_ESTABLISHED) |
271 | seq_printf(seq, "%-28s", "Not_Connected"); | 271 | seq_printf(seq, "%-28s", "Not_Connected"); |
272 | else { | 272 | else { |
273 | seq_printf(seq, "%08lX:%02X%02X%02X%02X%02X%02X:%04X ", | 273 | seq_printf(seq, "%08lX:%02X%02X%02X%02X%02X%02X:%04X ", |
274 | (unsigned long)htonl(ipxs->dest_addr.net), | 274 | (unsigned long)ntohl(ipxs->dest_addr.net), |
275 | ipxs->dest_addr.node[0], ipxs->dest_addr.node[1], | 275 | ipxs->dest_addr.node[0], ipxs->dest_addr.node[1], |
276 | ipxs->dest_addr.node[2], ipxs->dest_addr.node[3], | 276 | ipxs->dest_addr.node[2], ipxs->dest_addr.node[3], |
277 | ipxs->dest_addr.node[4], ipxs->dest_addr.node[5], | 277 | ipxs->dest_addr.node[4], ipxs->dest_addr.node[5], |
278 | htons(ipxs->dest_addr.sock)); | 278 | ntohs(ipxs->dest_addr.sock)); |
279 | } | 279 | } |
280 | 280 | ||
281 | seq_printf(seq, "%08X %08X %02X %03d\n", | 281 | seq_printf(seq, "%08X %08X %02X %03d\n", |
diff --git a/net/ipx/ipx_route.c b/net/ipx/ipx_route.c index a30dbb1e08fb..68560ee0d797 100644 --- a/net/ipx/ipx_route.c +++ b/net/ipx/ipx_route.c | |||
@@ -19,17 +19,17 @@ DEFINE_RWLOCK(ipx_routes_lock); | |||
19 | 19 | ||
20 | extern struct ipx_interface *ipx_internal_net; | 20 | extern struct ipx_interface *ipx_internal_net; |
21 | 21 | ||
22 | extern __u16 ipx_cksum(struct ipxhdr *packet, int length); | 22 | extern __be16 ipx_cksum(struct ipxhdr *packet, int length); |
23 | extern struct ipx_interface *ipxitf_find_using_net(__u32 net); | 23 | extern struct ipx_interface *ipxitf_find_using_net(__be32 net); |
24 | extern int ipxitf_demux_socket(struct ipx_interface *intrfc, | 24 | extern int ipxitf_demux_socket(struct ipx_interface *intrfc, |
25 | struct sk_buff *skb, int copy); | 25 | struct sk_buff *skb, int copy); |
26 | extern int ipxitf_demux_socket(struct ipx_interface *intrfc, | 26 | extern int ipxitf_demux_socket(struct ipx_interface *intrfc, |
27 | struct sk_buff *skb, int copy); | 27 | struct sk_buff *skb, int copy); |
28 | extern int ipxitf_send(struct ipx_interface *intrfc, struct sk_buff *skb, | 28 | extern int ipxitf_send(struct ipx_interface *intrfc, struct sk_buff *skb, |
29 | char *node); | 29 | char *node); |
30 | extern struct ipx_interface *ipxitf_find_using_net(__u32 net); | 30 | extern struct ipx_interface *ipxitf_find_using_net(__be32 net); |
31 | 31 | ||
32 | struct ipx_route *ipxrtr_lookup(__u32 net) | 32 | struct ipx_route *ipxrtr_lookup(__be32 net) |
33 | { | 33 | { |
34 | struct ipx_route *r; | 34 | struct ipx_route *r; |
35 | 35 | ||
@@ -48,7 +48,7 @@ unlock: | |||
48 | /* | 48 | /* |
49 | * Caller must hold a reference to intrfc | 49 | * Caller must hold a reference to intrfc |
50 | */ | 50 | */ |
51 | int ipxrtr_add_route(__u32 network, struct ipx_interface *intrfc, | 51 | int ipxrtr_add_route(__be32 network, struct ipx_interface *intrfc, |
52 | unsigned char *node) | 52 | unsigned char *node) |
53 | { | 53 | { |
54 | struct ipx_route *rt; | 54 | struct ipx_route *rt; |
@@ -118,7 +118,7 @@ out: | |||
118 | return rc; | 118 | return rc; |
119 | } | 119 | } |
120 | 120 | ||
121 | static int ipxrtr_delete(__u32 net) | 121 | static int ipxrtr_delete(__be32 net) |
122 | { | 122 | { |
123 | struct ipx_route *r, *tmp; | 123 | struct ipx_route *r, *tmp; |
124 | int rc; | 124 | int rc; |
@@ -238,7 +238,7 @@ int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx, | |||
238 | 238 | ||
239 | /* Apply checksum. Not allowed on 802.3 links. */ | 239 | /* Apply checksum. Not allowed on 802.3 links. */ |
240 | if (sk->sk_no_check || intrfc->if_dlink_type == htons(IPX_FRAME_8023)) | 240 | if (sk->sk_no_check || intrfc->if_dlink_type == htons(IPX_FRAME_8023)) |
241 | ipx->ipx_checksum = 0xFFFF; | 241 | ipx->ipx_checksum = htons(0xFFFF); |
242 | else | 242 | else |
243 | ipx->ipx_checksum = ipx_cksum(ipx, len + sizeof(struct ipxhdr)); | 243 | ipx->ipx_checksum = ipx_cksum(ipx, len + sizeof(struct ipxhdr)); |
244 | 244 | ||
diff --git a/net/irda/irlmp.c b/net/irda/irlmp.c index 5073261b9d0c..fede83763095 100644 --- a/net/irda/irlmp.c +++ b/net/irda/irlmp.c | |||
@@ -1678,7 +1678,8 @@ static int irlmp_slsap_inuse(__u8 slsap_sel) | |||
1678 | * every IrLAP connection and check every LSAP associated with each | 1678 | * every IrLAP connection and check every LSAP associated with each |
1679 | * the connection. | 1679 | * the connection. |
1680 | */ | 1680 | */ |
1681 | spin_lock_irqsave(&irlmp->links->hb_spinlock, flags); | 1681 | spin_lock_irqsave_nested(&irlmp->links->hb_spinlock, flags, |
1682 | SINGLE_DEPTH_NESTING); | ||
1682 | lap = (struct lap_cb *) hashbin_get_first(irlmp->links); | 1683 | lap = (struct lap_cb *) hashbin_get_first(irlmp->links); |
1683 | while (lap != NULL) { | 1684 | while (lap != NULL) { |
1684 | IRDA_ASSERT(lap->magic == LMP_LAP_MAGIC, goto errlap;); | 1685 | IRDA_ASSERT(lap->magic == LMP_LAP_MAGIC, goto errlap;); |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 093b3ddc513c..de0567b1f422 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
@@ -469,10 +469,8 @@ __nf_conntrack_expect_find(const struct nf_conntrack_tuple *tuple) | |||
469 | struct nf_conntrack_expect *i; | 469 | struct nf_conntrack_expect *i; |
470 | 470 | ||
471 | list_for_each_entry(i, &nf_conntrack_expect_list, list) { | 471 | list_for_each_entry(i, &nf_conntrack_expect_list, list) { |
472 | if (nf_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask)) { | 472 | if (nf_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask)) |
473 | atomic_inc(&i->use); | ||
474 | return i; | 473 | return i; |
475 | } | ||
476 | } | 474 | } |
477 | return NULL; | 475 | return NULL; |
478 | } | 476 | } |
@@ -485,6 +483,8 @@ nf_conntrack_expect_find(const struct nf_conntrack_tuple *tuple) | |||
485 | 483 | ||
486 | read_lock_bh(&nf_conntrack_lock); | 484 | read_lock_bh(&nf_conntrack_lock); |
487 | i = __nf_conntrack_expect_find(tuple); | 485 | i = __nf_conntrack_expect_find(tuple); |
486 | if (i) | ||
487 | atomic_inc(&i->use); | ||
488 | read_unlock_bh(&nf_conntrack_lock); | 488 | read_unlock_bh(&nf_conntrack_lock); |
489 | 489 | ||
490 | return i; | 490 | return i; |
@@ -893,12 +893,6 @@ __nf_conntrack_alloc(const struct nf_conntrack_tuple *orig, | |||
893 | 893 | ||
894 | memset(conntrack, 0, nf_ct_cache[features].size); | 894 | memset(conntrack, 0, nf_ct_cache[features].size); |
895 | conntrack->features = features; | 895 | conntrack->features = features; |
896 | if (helper) { | ||
897 | struct nf_conn_help *help = nfct_help(conntrack); | ||
898 | NF_CT_ASSERT(help); | ||
899 | help->helper = helper; | ||
900 | } | ||
901 | |||
902 | atomic_set(&conntrack->ct_general.use, 1); | 896 | atomic_set(&conntrack->ct_general.use, 1); |
903 | conntrack->ct_general.destroy = destroy_conntrack; | 897 | conntrack->ct_general.destroy = destroy_conntrack; |
904 | conntrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple = *orig; | 898 | conntrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple = *orig; |
@@ -982,8 +976,13 @@ init_conntrack(const struct nf_conntrack_tuple *tuple, | |||
982 | #endif | 976 | #endif |
983 | nf_conntrack_get(&conntrack->master->ct_general); | 977 | nf_conntrack_get(&conntrack->master->ct_general); |
984 | NF_CT_STAT_INC(expect_new); | 978 | NF_CT_STAT_INC(expect_new); |
985 | } else | 979 | } else { |
980 | struct nf_conn_help *help = nfct_help(conntrack); | ||
981 | |||
982 | if (help) | ||
983 | help->helper = __nf_ct_helper_find(&repl_tuple); | ||
986 | NF_CT_STAT_INC(new); | 984 | NF_CT_STAT_INC(new); |
985 | } | ||
987 | 986 | ||
988 | /* Overload tuple linked list to put us in unconfirmed list. */ | 987 | /* Overload tuple linked list to put us in unconfirmed list. */ |
989 | list_add(&conntrack->tuplehash[IP_CT_DIR_ORIGINAL].list, &unconfirmed); | 988 | list_add(&conntrack->tuplehash[IP_CT_DIR_ORIGINAL].list, &unconfirmed); |
@@ -1520,9 +1519,10 @@ get_next_corpse(int (*iter)(struct nf_conn *i, void *data), | |||
1520 | if (iter(ct, data)) | 1519 | if (iter(ct, data)) |
1521 | goto found; | 1520 | goto found; |
1522 | } | 1521 | } |
1522 | write_unlock_bh(&nf_conntrack_lock); | ||
1523 | return NULL; | 1523 | return NULL; |
1524 | found: | 1524 | found: |
1525 | atomic_inc(&nf_ct_tuplehash_to_ctrack(h)->ct_general.use); | 1525 | atomic_inc(&ct->ct_general.use); |
1526 | write_unlock_bh(&nf_conntrack_lock); | 1526 | write_unlock_bh(&nf_conntrack_lock); |
1527 | return ct; | 1527 | return ct; |
1528 | } | 1528 | } |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index bd0156a28ecd..ab67c2be2b5d 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
@@ -161,6 +161,7 @@ ctnetlink_dump_protoinfo(struct sk_buff *skb, const struct nf_conn *ct) | |||
161 | return ret; | 161 | return ret; |
162 | 162 | ||
163 | nfattr_failure: | 163 | nfattr_failure: |
164 | nf_ct_proto_put(proto); | ||
164 | return -1; | 165 | return -1; |
165 | } | 166 | } |
166 | 167 | ||
@@ -949,6 +950,7 @@ ctnetlink_create_conntrack(struct nfattr *cda[], | |||
949 | { | 950 | { |
950 | struct nf_conn *ct; | 951 | struct nf_conn *ct; |
951 | int err = -EINVAL; | 952 | int err = -EINVAL; |
953 | struct nf_conn_help *help; | ||
952 | 954 | ||
953 | ct = nf_conntrack_alloc(otuple, rtuple); | 955 | ct = nf_conntrack_alloc(otuple, rtuple); |
954 | if (ct == NULL || IS_ERR(ct)) | 956 | if (ct == NULL || IS_ERR(ct)) |
@@ -976,9 +978,16 @@ ctnetlink_create_conntrack(struct nfattr *cda[], | |||
976 | ct->mark = ntohl(*(u_int32_t *)NFA_DATA(cda[CTA_MARK-1])); | 978 | ct->mark = ntohl(*(u_int32_t *)NFA_DATA(cda[CTA_MARK-1])); |
977 | #endif | 979 | #endif |
978 | 980 | ||
981 | help = nfct_help(ct); | ||
982 | if (help) | ||
983 | help->helper = nf_ct_helper_find_get(rtuple); | ||
984 | |||
979 | add_timer(&ct->timeout); | 985 | add_timer(&ct->timeout); |
980 | nf_conntrack_hash_insert(ct); | 986 | nf_conntrack_hash_insert(ct); |
981 | 987 | ||
988 | if (help && help->helper) | ||
989 | nf_ct_helper_put(help->helper); | ||
990 | |||
982 | return 0; | 991 | return 0; |
983 | 992 | ||
984 | err: | 993 | err: |
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c index b59d3b2bde21..1e5207b80fe5 100644 --- a/net/netfilter/nfnetlink_log.c +++ b/net/netfilter/nfnetlink_log.c | |||
@@ -427,7 +427,7 @@ __build_packet_message(struct nfulnl_instance *inst, | |||
427 | nfmsg->version = NFNETLINK_V0; | 427 | nfmsg->version = NFNETLINK_V0; |
428 | nfmsg->res_id = htons(inst->group_num); | 428 | nfmsg->res_id = htons(inst->group_num); |
429 | 429 | ||
430 | pmsg.hw_protocol = htons(skb->protocol); | 430 | pmsg.hw_protocol = skb->protocol; |
431 | pmsg.hook = hooknum; | 431 | pmsg.hook = hooknum; |
432 | 432 | ||
433 | NFA_PUT(inst->skb, NFULA_PACKET_HDR, sizeof(pmsg), &pmsg); | 433 | NFA_PUT(inst->skb, NFULA_PACKET_HDR, sizeof(pmsg), &pmsg); |
@@ -544,7 +544,7 @@ __build_packet_message(struct nfulnl_instance *inst, | |||
544 | } | 544 | } |
545 | /* global sequence number */ | 545 | /* global sequence number */ |
546 | if (inst->flags & NFULNL_CFG_F_SEQ_GLOBAL) { | 546 | if (inst->flags & NFULNL_CFG_F_SEQ_GLOBAL) { |
547 | tmp_uint = atomic_inc_return(&global_seq); | 547 | tmp_uint = htonl(atomic_inc_return(&global_seq)); |
548 | NFA_PUT(inst->skb, NFULA_SEQ_GLOBAL, sizeof(tmp_uint), &tmp_uint); | 548 | NFA_PUT(inst->skb, NFULA_SEQ_GLOBAL, sizeof(tmp_uint), &tmp_uint); |
549 | } | 549 | } |
550 | 550 | ||
@@ -878,7 +878,7 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb, | |||
878 | params = NFA_DATA(nfula[NFULA_CFG_MODE-1]); | 878 | params = NFA_DATA(nfula[NFULA_CFG_MODE-1]); |
879 | 879 | ||
880 | nfulnl_set_mode(inst, params->copy_mode, | 880 | nfulnl_set_mode(inst, params->copy_mode, |
881 | ntohs(params->copy_range)); | 881 | ntohl(params->copy_range)); |
882 | } | 882 | } |
883 | 883 | ||
884 | if (nfula[NFULA_CFG_TIMEOUT-1]) { | 884 | if (nfula[NFULA_CFG_TIMEOUT-1]) { |
@@ -896,8 +896,8 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb, | |||
896 | } | 896 | } |
897 | 897 | ||
898 | if (nfula[NFULA_CFG_QTHRESH-1]) { | 898 | if (nfula[NFULA_CFG_QTHRESH-1]) { |
899 | u_int32_t qthresh = | 899 | __be32 qthresh = |
900 | *(u_int16_t *)NFA_DATA(nfula[NFULA_CFG_QTHRESH-1]); | 900 | *(__be32 *)NFA_DATA(nfula[NFULA_CFG_QTHRESH-1]); |
901 | 901 | ||
902 | nfulnl_set_qthresh(inst, ntohl(qthresh)); | 902 | nfulnl_set_qthresh(inst, ntohl(qthresh)); |
903 | } | 903 | } |
diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c index 8eb2473d83e1..e815a9aa6e95 100644 --- a/net/netfilter/nfnetlink_queue.c +++ b/net/netfilter/nfnetlink_queue.c | |||
@@ -414,7 +414,7 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue, | |||
414 | nfmsg->res_id = htons(queue->queue_num); | 414 | nfmsg->res_id = htons(queue->queue_num); |
415 | 415 | ||
416 | pmsg.packet_id = htonl(entry->id); | 416 | pmsg.packet_id = htonl(entry->id); |
417 | pmsg.hw_protocol = htons(entskb->protocol); | 417 | pmsg.hw_protocol = entskb->protocol; |
418 | pmsg.hook = entinf->hook; | 418 | pmsg.hook = entinf->hook; |
419 | 419 | ||
420 | NFA_PUT(skb, NFQA_PACKET_HDR, sizeof(pmsg), &pmsg); | 420 | NFA_PUT(skb, NFQA_PACKET_HDR, sizeof(pmsg), &pmsg); |
@@ -622,9 +622,10 @@ nfqnl_mangle(void *data, int data_len, struct nfqnl_queue_entry *e) | |||
622 | int diff; | 622 | int diff; |
623 | 623 | ||
624 | diff = data_len - e->skb->len; | 624 | diff = data_len - e->skb->len; |
625 | if (diff < 0) | 625 | if (diff < 0) { |
626 | skb_trim(e->skb, data_len); | 626 | if (pskb_trim(e->skb, data_len)) |
627 | else if (diff > 0) { | 627 | return -ENOMEM; |
628 | } else if (diff > 0) { | ||
628 | if (data_len > 0xFFFF) | 629 | if (data_len > 0xFFFF) |
629 | return -EINVAL; | 630 | return -EINVAL; |
630 | if (diff > skb_tailroom(e->skb)) { | 631 | if (diff > skb_tailroom(e->skb)) { |
diff --git a/net/netlabel/Kconfig b/net/netlabel/Kconfig index 9f7121ae13e9..56958c85f2b4 100644 --- a/net/netlabel/Kconfig +++ b/net/netlabel/Kconfig | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | config NETLABEL | 5 | config NETLABEL |
6 | bool "NetLabel subsystem support" | 6 | bool "NetLabel subsystem support" |
7 | depends on NET && SECURITY | 7 | depends on SECURITY |
8 | default n | 8 | default n |
9 | ---help--- | 9 | ---help--- |
10 | NetLabel provides support for explicit network packet labeling | 10 | NetLabel provides support for explicit network packet labeling |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index d56e0d21f919..d527c8977b1f 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -1075,8 +1075,9 @@ static int netlink_getsockopt(struct socket *sock, int level, int optname, | |||
1075 | return -EINVAL; | 1075 | return -EINVAL; |
1076 | len = sizeof(int); | 1076 | len = sizeof(int); |
1077 | val = nlk->flags & NETLINK_RECV_PKTINFO ? 1 : 0; | 1077 | val = nlk->flags & NETLINK_RECV_PKTINFO ? 1 : 0; |
1078 | put_user(len, optlen); | 1078 | if (put_user(len, optlen) || |
1079 | put_user(val, optval); | 1079 | put_user(val, optval)) |
1080 | return -EFAULT; | ||
1080 | err = 0; | 1081 | err = 0; |
1081 | break; | 1082 | break; |
1082 | default: | 1083 | default: |
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 9b9c555c713f..4b52fa78935a 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
@@ -1284,8 +1284,7 @@ static void htb_destroy_class(struct Qdisc *sch, struct htb_class *cl) | |||
1284 | struct htb_class, sibling)); | 1284 | struct htb_class, sibling)); |
1285 | 1285 | ||
1286 | /* note: this delete may happen twice (see htb_delete) */ | 1286 | /* note: this delete may happen twice (see htb_delete) */ |
1287 | if (!hlist_unhashed(&cl->hlist)) | 1287 | hlist_del_init(&cl->hlist); |
1288 | hlist_del(&cl->hlist); | ||
1289 | list_del(&cl->sibling); | 1288 | list_del(&cl->sibling); |
1290 | 1289 | ||
1291 | if (cl->prio_activity) | 1290 | if (cl->prio_activity) |
@@ -1333,8 +1332,7 @@ static int htb_delete(struct Qdisc *sch, unsigned long arg) | |||
1333 | sch_tree_lock(sch); | 1332 | sch_tree_lock(sch); |
1334 | 1333 | ||
1335 | /* delete from hash and active; remainder in destroy_class */ | 1334 | /* delete from hash and active; remainder in destroy_class */ |
1336 | if (!hlist_unhashed(&cl->hlist)) | 1335 | hlist_del_init(&cl->hlist); |
1337 | hlist_del(&cl->hlist); | ||
1338 | 1336 | ||
1339 | if (cl->prio_activity) | 1337 | if (cl->prio_activity) |
1340 | htb_deactivate(q, cl); | 1338 | htb_deactivate(q, cl); |
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index 45939bafbdf8..0441876aa1e7 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * This program is free software; you can redistribute it and/or | 4 | * This program is free software; you can redistribute it and/or |
5 | * modify it under the terms of the GNU General Public License | 5 | * modify it under the terms of the GNU General Public License |
6 | * as published by the Free Software Foundation; either version | 6 | * as published by the Free Software Foundation; either version |
7 | * 2 of the License, or (at your option) any later version. | 7 | * 2 of the License. |
8 | * | 8 | * |
9 | * Many of the algorithms and ideas for this came from | 9 | * Many of the algorithms and ideas for this came from |
10 | * NIST Net which is not copyrighted. | 10 | * NIST Net which is not copyrighted. |
@@ -170,6 +170,8 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
170 | return NET_XMIT_BYPASS; | 170 | return NET_XMIT_BYPASS; |
171 | } | 171 | } |
172 | 172 | ||
173 | skb_orphan(skb); | ||
174 | |||
173 | /* | 175 | /* |
174 | * If we need to duplicate packet, then re-insert at top of the | 176 | * If we need to duplicate packet, then re-insert at top of the |
175 | * qdisc tree, since parent queuer expects that only one | 177 | * qdisc tree, since parent queuer expects that only one |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 27329ce9c311..ed0445fe85e7 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
@@ -346,11 +346,18 @@ void sctp_association_free(struct sctp_association *asoc) | |||
346 | struct list_head *pos, *temp; | 346 | struct list_head *pos, *temp; |
347 | int i; | 347 | int i; |
348 | 348 | ||
349 | list_del(&asoc->asocs); | 349 | /* Only real associations count against the endpoint, so |
350 | * don't bother for if this is a temporary association. | ||
351 | */ | ||
352 | if (!asoc->temp) { | ||
353 | list_del(&asoc->asocs); | ||
350 | 354 | ||
351 | /* Decrement the backlog value for a TCP-style listening socket. */ | 355 | /* Decrement the backlog value for a TCP-style listening |
352 | if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) | 356 | * socket. |
353 | sk->sk_ack_backlog--; | 357 | */ |
358 | if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) | ||
359 | sk->sk_ack_backlog--; | ||
360 | } | ||
354 | 361 | ||
355 | /* Mark as dead, so other users can know this structure is | 362 | /* Mark as dead, so other users can know this structure is |
356 | * going away. | 363 | * going away. |
diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c index 35c49ff2d062..9b6b394b66f6 100644 --- a/net/sctp/endpointola.c +++ b/net/sctp/endpointola.c | |||
@@ -144,6 +144,13 @@ void sctp_endpoint_add_asoc(struct sctp_endpoint *ep, | |||
144 | { | 144 | { |
145 | struct sock *sk = ep->base.sk; | 145 | struct sock *sk = ep->base.sk; |
146 | 146 | ||
147 | /* If this is a temporary association, don't bother | ||
148 | * since we'll be removing it shortly and don't | ||
149 | * want anyone to find it anyway. | ||
150 | */ | ||
151 | if (asoc->temp) | ||
152 | return; | ||
153 | |||
147 | /* Now just add it to our list of asocs */ | 154 | /* Now just add it to our list of asocs */ |
148 | list_add_tail(&asoc->asocs, &ep->asocs); | 155 | list_add_tail(&asoc->asocs, &ep->asocs); |
149 | 156 | ||
diff --git a/net/sctp/input.c b/net/sctp/input.c index 64f630102532..6d82f400d13c 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c | |||
@@ -135,6 +135,9 @@ int sctp_rcv(struct sk_buff *skb) | |||
135 | 135 | ||
136 | SCTP_INC_STATS_BH(SCTP_MIB_INSCTPPACKS); | 136 | SCTP_INC_STATS_BH(SCTP_MIB_INSCTPPACKS); |
137 | 137 | ||
138 | if (skb_linearize(skb)) | ||
139 | goto discard_it; | ||
140 | |||
138 | sh = (struct sctphdr *) skb->h.raw; | 141 | sh = (struct sctphdr *) skb->h.raw; |
139 | 142 | ||
140 | /* Pull up the IP and SCTP headers. */ | 143 | /* Pull up the IP and SCTP headers. */ |
@@ -768,6 +771,9 @@ static void __sctp_hash_established(struct sctp_association *asoc) | |||
768 | /* Add an association to the hash. Local BH-safe. */ | 771 | /* Add an association to the hash. Local BH-safe. */ |
769 | void sctp_hash_established(struct sctp_association *asoc) | 772 | void sctp_hash_established(struct sctp_association *asoc) |
770 | { | 773 | { |
774 | if (asoc->temp) | ||
775 | return; | ||
776 | |||
771 | sctp_local_bh_disable(); | 777 | sctp_local_bh_disable(); |
772 | __sctp_hash_established(asoc); | 778 | __sctp_hash_established(asoc); |
773 | sctp_local_bh_enable(); | 779 | sctp_local_bh_enable(); |
@@ -801,6 +807,9 @@ static void __sctp_unhash_established(struct sctp_association *asoc) | |||
801 | /* Remove association from the hash table. Local BH-safe. */ | 807 | /* Remove association from the hash table. Local BH-safe. */ |
802 | void sctp_unhash_established(struct sctp_association *asoc) | 808 | void sctp_unhash_established(struct sctp_association *asoc) |
803 | { | 809 | { |
810 | if (asoc->temp) | ||
811 | return; | ||
812 | |||
804 | sctp_local_bh_disable(); | 813 | sctp_local_bh_disable(); |
805 | __sctp_unhash_established(asoc); | 814 | __sctp_unhash_established(asoc); |
806 | sctp_local_bh_enable(); | 815 | sctp_local_bh_enable(); |
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index fac7674438a4..5b4f82fd98f8 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
@@ -591,7 +591,7 @@ static struct sock *sctp_v4_create_accept_sk(struct sock *sk, | |||
591 | newinet->dport = htons(asoc->peer.port); | 591 | newinet->dport = htons(asoc->peer.port); |
592 | newinet->daddr = asoc->peer.primary_addr.v4.sin_addr.s_addr; | 592 | newinet->daddr = asoc->peer.primary_addr.v4.sin_addr.s_addr; |
593 | newinet->pmtudisc = inet->pmtudisc; | 593 | newinet->pmtudisc = inet->pmtudisc; |
594 | newinet->id = 0; | 594 | newinet->id = asoc->next_tsn ^ jiffies; |
595 | 595 | ||
596 | newinet->uc_ttl = -1; | 596 | newinet->uc_ttl = -1; |
597 | newinet->mc_loop = 1; | 597 | newinet->mc_loop = 1; |
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 9f34dec6ff8e..935bc9187fd8 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -3372,6 +3372,7 @@ SCTP_STATIC int sctp_do_peeloff(struct sctp_association *asoc, | |||
3372 | { | 3372 | { |
3373 | struct sock *sk = asoc->base.sk; | 3373 | struct sock *sk = asoc->base.sk; |
3374 | struct socket *sock; | 3374 | struct socket *sock; |
3375 | struct inet_sock *inetsk; | ||
3375 | int err = 0; | 3376 | int err = 0; |
3376 | 3377 | ||
3377 | /* An association cannot be branched off from an already peeled-off | 3378 | /* An association cannot be branched off from an already peeled-off |
@@ -3389,6 +3390,14 @@ SCTP_STATIC int sctp_do_peeloff(struct sctp_association *asoc, | |||
3389 | * asoc to the newsk. | 3390 | * asoc to the newsk. |
3390 | */ | 3391 | */ |
3391 | sctp_sock_migrate(sk, sock->sk, asoc, SCTP_SOCKET_UDP_HIGH_BANDWIDTH); | 3392 | sctp_sock_migrate(sk, sock->sk, asoc, SCTP_SOCKET_UDP_HIGH_BANDWIDTH); |
3393 | |||
3394 | /* Make peeled-off sockets more like 1-1 accepted sockets. | ||
3395 | * Set the daddr and initialize id to something more random | ||
3396 | */ | ||
3397 | inetsk = inet_sk(sock->sk); | ||
3398 | inetsk->daddr = asoc->peer.primary_addr.v4.sin_addr.s_addr; | ||
3399 | inetsk->id = asoc->next_tsn ^ jiffies; | ||
3400 | |||
3392 | *sockp = sock; | 3401 | *sockp = sock; |
3393 | 3402 | ||
3394 | return err; | 3403 | return err; |
diff --git a/net/sunrpc/svcauth.c b/net/sunrpc/svcauth.c index 8f2320aded5c..ee9bb1522d5e 100644 --- a/net/sunrpc/svcauth.c +++ b/net/sunrpc/svcauth.c | |||
@@ -126,6 +126,7 @@ void auth_domain_put(struct auth_domain *dom) | |||
126 | if (atomic_dec_and_lock(&dom->ref.refcount, &auth_domain_lock)) { | 126 | if (atomic_dec_and_lock(&dom->ref.refcount, &auth_domain_lock)) { |
127 | hlist_del(&dom->hash); | 127 | hlist_del(&dom->hash); |
128 | dom->flavour->domain_release(dom); | 128 | dom->flavour->domain_release(dom); |
129 | spin_unlock(&auth_domain_lock); | ||
129 | } | 130 | } |
130 | } | 131 | } |
131 | 132 | ||
@@ -147,10 +148,8 @@ auth_domain_lookup(char *name, struct auth_domain *new) | |||
147 | return hp; | 148 | return hp; |
148 | } | 149 | } |
149 | } | 150 | } |
150 | if (new) { | 151 | if (new) |
151 | hlist_add_head(&new->hash, head); | 152 | hlist_add_head(&new->hash, head); |
152 | kref_get(&new->ref); | ||
153 | } | ||
154 | spin_unlock(&auth_domain_lock); | 153 | spin_unlock(&auth_domain_lock); |
155 | return new; | 154 | return new; |
156 | } | 155 | } |
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 96521f16342b..64ca1f61dd94 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
@@ -299,9 +299,15 @@ void svc_reserve(struct svc_rqst *rqstp, int space) | |||
299 | static inline void | 299 | static inline void |
300 | svc_sock_put(struct svc_sock *svsk) | 300 | svc_sock_put(struct svc_sock *svsk) |
301 | { | 301 | { |
302 | if (atomic_dec_and_test(&svsk->sk_inuse) && test_bit(SK_DEAD, &svsk->sk_flags)) { | 302 | if (atomic_dec_and_test(&svsk->sk_inuse) && |
303 | test_bit(SK_DEAD, &svsk->sk_flags)) { | ||
303 | dprintk("svc: releasing dead socket\n"); | 304 | dprintk("svc: releasing dead socket\n"); |
304 | sock_release(svsk->sk_sock); | 305 | if (svsk->sk_sock->file) |
306 | sockfd_put(svsk->sk_sock); | ||
307 | else | ||
308 | sock_release(svsk->sk_sock); | ||
309 | if (svsk->sk_info_authunix != NULL) | ||
310 | svcauth_unix_info_release(svsk->sk_info_authunix); | ||
305 | kfree(svsk); | 311 | kfree(svsk); |
306 | } | 312 | } |
307 | } | 313 | } |
@@ -1604,20 +1610,13 @@ svc_delete_socket(struct svc_sock *svsk) | |||
1604 | if (test_bit(SK_TEMP, &svsk->sk_flags)) | 1610 | if (test_bit(SK_TEMP, &svsk->sk_flags)) |
1605 | serv->sv_tmpcnt--; | 1611 | serv->sv_tmpcnt--; |
1606 | 1612 | ||
1607 | if (!atomic_read(&svsk->sk_inuse)) { | 1613 | /* This atomic_inc should be needed - svc_delete_socket |
1608 | spin_unlock_bh(&serv->sv_lock); | 1614 | * should have the semantic of dropping a reference. |
1609 | if (svsk->sk_sock->file) | 1615 | * But it doesn't yet.... |
1610 | sockfd_put(svsk->sk_sock); | 1616 | */ |
1611 | else | 1617 | atomic_inc(&svsk->sk_inuse); |
1612 | sock_release(svsk->sk_sock); | 1618 | spin_unlock_bh(&serv->sv_lock); |
1613 | if (svsk->sk_info_authunix != NULL) | 1619 | svc_sock_put(svsk); |
1614 | svcauth_unix_info_release(svsk->sk_info_authunix); | ||
1615 | kfree(svsk); | ||
1616 | } else { | ||
1617 | spin_unlock_bh(&serv->sv_lock); | ||
1618 | dprintk(KERN_NOTICE "svc: server socket destroy delayed\n"); | ||
1619 | /* svsk->sk_server = NULL; */ | ||
1620 | } | ||
1621 | } | 1620 | } |
1622 | 1621 | ||
1623 | /* | 1622 | /* |
diff --git a/net/tipc/port.c b/net/tipc/port.c index c1a1a76759b5..b7f3199523ca 100644 --- a/net/tipc/port.c +++ b/net/tipc/port.c | |||
@@ -1136,11 +1136,12 @@ int tipc_publish(u32 ref, unsigned int scope, struct tipc_name_seq const *seq) | |||
1136 | int res = -EINVAL; | 1136 | int res = -EINVAL; |
1137 | 1137 | ||
1138 | p_ptr = tipc_port_lock(ref); | 1138 | p_ptr = tipc_port_lock(ref); |
1139 | if (!p_ptr) | ||
1140 | return -EINVAL; | ||
1141 | |||
1139 | dbg("tipc_publ %u, p_ptr = %x, conn = %x, scope = %x, " | 1142 | dbg("tipc_publ %u, p_ptr = %x, conn = %x, scope = %x, " |
1140 | "lower = %u, upper = %u\n", | 1143 | "lower = %u, upper = %u\n", |
1141 | ref, p_ptr, p_ptr->publ.connected, scope, seq->lower, seq->upper); | 1144 | ref, p_ptr, p_ptr->publ.connected, scope, seq->lower, seq->upper); |
1142 | if (!p_ptr) | ||
1143 | return -EINVAL; | ||
1144 | if (p_ptr->publ.connected) | 1145 | if (p_ptr->publ.connected) |
1145 | goto exit; | 1146 | goto exit; |
1146 | if (seq->lower > seq->upper) | 1147 | if (seq->lower > seq->upper) |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 84bbf8474f3e..899de9ed22a6 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -505,6 +505,14 @@ __xfrm_state_locate(struct xfrm_state *x, int use_spi, int family) | |||
505 | x->id.proto, family); | 505 | x->id.proto, family); |
506 | } | 506 | } |
507 | 507 | ||
508 | static void xfrm_hash_grow_check(int have_hash_collision) | ||
509 | { | ||
510 | if (have_hash_collision && | ||
511 | (xfrm_state_hmask + 1) < xfrm_state_hashmax && | ||
512 | xfrm_state_num > xfrm_state_hmask) | ||
513 | schedule_work(&xfrm_hash_work); | ||
514 | } | ||
515 | |||
508 | struct xfrm_state * | 516 | struct xfrm_state * |
509 | xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, | 517 | xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, |
510 | struct flowi *fl, struct xfrm_tmpl *tmpl, | 518 | struct flowi *fl, struct xfrm_tmpl *tmpl, |
@@ -598,6 +606,8 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, | |||
598 | x->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES; | 606 | x->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES; |
599 | x->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ; | 607 | x->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ; |
600 | add_timer(&x->timer); | 608 | add_timer(&x->timer); |
609 | xfrm_state_num++; | ||
610 | xfrm_hash_grow_check(x->bydst.next != NULL); | ||
601 | } else { | 611 | } else { |
602 | x->km.state = XFRM_STATE_DEAD; | 612 | x->km.state = XFRM_STATE_DEAD; |
603 | xfrm_state_put(x); | 613 | xfrm_state_put(x); |
@@ -614,14 +624,6 @@ out: | |||
614 | return x; | 624 | return x; |
615 | } | 625 | } |
616 | 626 | ||
617 | static void xfrm_hash_grow_check(int have_hash_collision) | ||
618 | { | ||
619 | if (have_hash_collision && | ||
620 | (xfrm_state_hmask + 1) < xfrm_state_hashmax && | ||
621 | xfrm_state_num > xfrm_state_hmask) | ||
622 | schedule_work(&xfrm_hash_work); | ||
623 | } | ||
624 | |||
625 | static void __xfrm_state_insert(struct xfrm_state *x) | 627 | static void __xfrm_state_insert(struct xfrm_state *x) |
626 | { | 628 | { |
627 | unsigned int h; | 629 | unsigned int h; |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 2b2e59d8ffbc..2ee14f8a1908 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -323,7 +323,7 @@ static void copy_from_user_state(struct xfrm_state *x, struct xfrm_usersa_info * | |||
323 | x->props.replay_window = p->replay_window; | 323 | x->props.replay_window = p->replay_window; |
324 | x->props.reqid = p->reqid; | 324 | x->props.reqid = p->reqid; |
325 | x->props.family = p->family; | 325 | x->props.family = p->family; |
326 | x->props.saddr = p->saddr; | 326 | memcpy(&x->props.saddr, &p->saddr, sizeof(x->props.saddr)); |
327 | x->props.flags = p->flags; | 327 | x->props.flags = p->flags; |
328 | } | 328 | } |
329 | 329 | ||
@@ -495,6 +495,7 @@ static struct xfrm_state *xfrm_user_state_lookup(struct xfrm_usersa_id *p, | |||
495 | goto out; | 495 | goto out; |
496 | } | 496 | } |
497 | 497 | ||
498 | err = -ESRCH; | ||
498 | x = xfrm_state_lookup_byaddr(&p->daddr, saddr, p->proto, | 499 | x = xfrm_state_lookup_byaddr(&p->daddr, saddr, p->proto, |
499 | p->family); | 500 | p->family); |
500 | } | 501 | } |
@@ -545,7 +546,7 @@ static void copy_to_user_state(struct xfrm_state *x, struct xfrm_usersa_info *p) | |||
545 | memcpy(&p->lft, &x->lft, sizeof(p->lft)); | 546 | memcpy(&p->lft, &x->lft, sizeof(p->lft)); |
546 | memcpy(&p->curlft, &x->curlft, sizeof(p->curlft)); | 547 | memcpy(&p->curlft, &x->curlft, sizeof(p->curlft)); |
547 | memcpy(&p->stats, &x->stats, sizeof(p->stats)); | 548 | memcpy(&p->stats, &x->stats, sizeof(p->stats)); |
548 | p->saddr = x->props.saddr; | 549 | memcpy(&p->saddr, &x->props.saddr, sizeof(p->saddr)); |
549 | p->mode = x->props.mode; | 550 | p->mode = x->props.mode; |
550 | p->replay_window = x->props.replay_window; | 551 | p->replay_window = x->props.replay_window; |
551 | p->reqid = x->props.reqid; | 552 | p->reqid = x->props.reqid; |
@@ -1927,6 +1928,9 @@ static int xfrm_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *xt, | |||
1927 | len = RTA_SPACE(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr); | 1928 | len = RTA_SPACE(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr); |
1928 | len += NLMSG_SPACE(sizeof(struct xfrm_user_acquire)); | 1929 | len += NLMSG_SPACE(sizeof(struct xfrm_user_acquire)); |
1929 | len += RTA_SPACE(xfrm_user_sec_ctx_size(xp)); | 1930 | len += RTA_SPACE(xfrm_user_sec_ctx_size(xp)); |
1931 | #ifdef CONFIG_XFRM_SUB_POLICY | ||
1932 | len += RTA_SPACE(sizeof(struct xfrm_userpolicy_type)); | ||
1933 | #endif | ||
1930 | skb = alloc_skb(len, GFP_ATOMIC); | 1934 | skb = alloc_skb(len, GFP_ATOMIC); |
1931 | if (skb == NULL) | 1935 | if (skb == NULL) |
1932 | return -ENOMEM; | 1936 | return -ENOMEM; |
@@ -2034,6 +2038,9 @@ static int xfrm_exp_policy_notify(struct xfrm_policy *xp, int dir, struct km_eve | |||
2034 | len = RTA_SPACE(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr); | 2038 | len = RTA_SPACE(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr); |
2035 | len += NLMSG_SPACE(sizeof(struct xfrm_user_polexpire)); | 2039 | len += NLMSG_SPACE(sizeof(struct xfrm_user_polexpire)); |
2036 | len += RTA_SPACE(xfrm_user_sec_ctx_size(xp)); | 2040 | len += RTA_SPACE(xfrm_user_sec_ctx_size(xp)); |
2041 | #ifdef CONFIG_XFRM_SUB_POLICY | ||
2042 | len += RTA_SPACE(sizeof(struct xfrm_userpolicy_type)); | ||
2043 | #endif | ||
2037 | skb = alloc_skb(len, GFP_ATOMIC); | 2044 | skb = alloc_skb(len, GFP_ATOMIC); |
2038 | if (skb == NULL) | 2045 | if (skb == NULL) |
2039 | return -ENOMEM; | 2046 | return -ENOMEM; |
@@ -2060,6 +2067,9 @@ static int xfrm_notify_policy(struct xfrm_policy *xp, int dir, struct km_event * | |||
2060 | len += RTA_SPACE(headlen); | 2067 | len += RTA_SPACE(headlen); |
2061 | headlen = sizeof(*id); | 2068 | headlen = sizeof(*id); |
2062 | } | 2069 | } |
2070 | #ifdef CONFIG_XFRM_SUB_POLICY | ||
2071 | len += RTA_SPACE(sizeof(struct xfrm_userpolicy_type)); | ||
2072 | #endif | ||
2063 | len += NLMSG_SPACE(headlen); | 2073 | len += NLMSG_SPACE(headlen); |
2064 | 2074 | ||
2065 | skb = alloc_skb(len, GFP_ATOMIC); | 2075 | skb = alloc_skb(len, GFP_ATOMIC); |
@@ -2106,10 +2116,12 @@ static int xfrm_notify_policy_flush(struct km_event *c) | |||
2106 | struct nlmsghdr *nlh; | 2116 | struct nlmsghdr *nlh; |
2107 | struct sk_buff *skb; | 2117 | struct sk_buff *skb; |
2108 | unsigned char *b; | 2118 | unsigned char *b; |
2119 | int len = 0; | ||
2109 | #ifdef CONFIG_XFRM_SUB_POLICY | 2120 | #ifdef CONFIG_XFRM_SUB_POLICY |
2110 | struct xfrm_userpolicy_type upt; | 2121 | struct xfrm_userpolicy_type upt; |
2122 | len += RTA_SPACE(sizeof(struct xfrm_userpolicy_type)); | ||
2111 | #endif | 2123 | #endif |
2112 | int len = NLMSG_LENGTH(0); | 2124 | len += NLMSG_LENGTH(0); |
2113 | 2125 | ||
2114 | skb = alloc_skb(len, GFP_ATOMIC); | 2126 | skb = alloc_skb(len, GFP_ATOMIC); |
2115 | if (skb == NULL) | 2127 | if (skb == NULL) |
diff --git a/scripts/basic/docproc.c b/scripts/basic/docproc.c index 4ab6cbf09225..d6071cbf13d7 100644 --- a/scripts/basic/docproc.c +++ b/scripts/basic/docproc.c | |||
@@ -250,7 +250,7 @@ void intfunc(char * filename) { docfunctions(filename, NOFUNCTION); } | |||
250 | void extfunc(char * filename) { docfunctions(filename, FUNCTION); } | 250 | void extfunc(char * filename) { docfunctions(filename, FUNCTION); } |
251 | 251 | ||
252 | /* | 252 | /* |
253 | * Document spåecific function(s) in a file. | 253 | * Document specific function(s) in a file. |
254 | * Call kernel-doc with the following parameters: | 254 | * Call kernel-doc with the following parameters: |
255 | * kernel-doc -docbook -function function1 [-function function2] | 255 | * kernel-doc -docbook -function function1 [-function function2] |
256 | */ | 256 | */ |
diff --git a/scripts/gen_initramfs_list.sh b/scripts/gen_initramfs_list.sh index 331c079f029b..4c723fd18648 100644 --- a/scripts/gen_initramfs_list.sh +++ b/scripts/gen_initramfs_list.sh | |||
@@ -158,7 +158,7 @@ unknown_option() { | |||
158 | } | 158 | } |
159 | 159 | ||
160 | list_header() { | 160 | list_header() { |
161 | echo "deps_initramfs := \\" | 161 | : |
162 | } | 162 | } |
163 | 163 | ||
164 | header() { | 164 | header() { |
@@ -227,6 +227,7 @@ arg="$1" | |||
227 | case "$arg" in | 227 | case "$arg" in |
228 | "-l") # files included in initramfs - used by kbuild | 228 | "-l") # files included in initramfs - used by kbuild |
229 | dep_list="list_" | 229 | dep_list="list_" |
230 | echo "deps_initramfs := \\" | ||
230 | shift | 231 | shift |
231 | ;; | 232 | ;; |
232 | "-o") # generate gzipped cpio image named $1 | 233 | "-o") # generate gzipped cpio image named $1 |
diff --git a/scripts/kconfig/.gitignore b/scripts/kconfig/.gitignore index e8ad1f6b3da4..b49584c932cc 100644 --- a/scripts/kconfig/.gitignore +++ b/scripts/kconfig/.gitignore | |||
@@ -6,6 +6,8 @@ lex.*.c | |||
6 | *.tab.c | 6 | *.tab.c |
7 | *.tab.h | 7 | *.tab.h |
8 | zconf.hash.c | 8 | zconf.hash.c |
9 | *.moc | ||
10 | lkc_defs.h | ||
9 | 11 | ||
10 | # | 12 | # |
11 | # configuration programs | 13 | # configuration programs |
diff --git a/scripts/kconfig/lxdialog/util.c b/scripts/kconfig/lxdialog/util.c index ebc781b493d7..d54440fc166c 100644 --- a/scripts/kconfig/lxdialog/util.c +++ b/scripts/kconfig/lxdialog/util.c | |||
@@ -221,16 +221,14 @@ static void init_dialog_colors(void) | |||
221 | */ | 221 | */ |
222 | static void color_setup(const char *theme) | 222 | static void color_setup(const char *theme) |
223 | { | 223 | { |
224 | if (set_theme(theme)) { | 224 | int use_color; |
225 | if (has_colors()) { /* Terminal supports color? */ | 225 | |
226 | start_color(); | 226 | use_color = set_theme(theme); |
227 | init_dialog_colors(); | 227 | if (use_color && has_colors()) { |
228 | } | 228 | start_color(); |
229 | } | 229 | init_dialog_colors(); |
230 | else | 230 | } else |
231 | { | ||
232 | set_mono_theme(); | 231 | set_mono_theme(); |
233 | } | ||
234 | } | 232 | } |
235 | 233 | ||
236 | /* | 234 | /* |
diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc index 393f3749f330..338bdea96541 100644 --- a/scripts/kconfig/qconf.cc +++ b/scripts/kconfig/qconf.cc | |||
@@ -1259,6 +1259,7 @@ void ConfigSearchWindow::search(void) | |||
1259 | * Construct the complete config widget | 1259 | * Construct the complete config widget |
1260 | */ | 1260 | */ |
1261 | ConfigMainWindow::ConfigMainWindow(void) | 1261 | ConfigMainWindow::ConfigMainWindow(void) |
1262 | : searchWindow(0) | ||
1262 | { | 1263 | { |
1263 | QMenuBar* menu; | 1264 | QMenuBar* menu; |
1264 | bool ok; | 1265 | bool ok; |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 41277963f47a..2e1141623147 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
@@ -921,6 +921,8 @@ static int init_section_ref_ok(const char *name) | |||
921 | ".fixup", | 921 | ".fixup", |
922 | ".smp_locks", | 922 | ".smp_locks", |
923 | ".plt", /* seen on ARCH=um build on x86_64. Harmless */ | 923 | ".plt", /* seen on ARCH=um build on x86_64. Harmless */ |
924 | "__ftr_fixup", /* powerpc cpu feature fixup */ | ||
925 | "__fw_ftr_fixup", /* powerpc firmware feature fixup */ | ||
924 | NULL | 926 | NULL |
925 | }; | 927 | }; |
926 | /* Start of section names */ | 928 | /* Start of section names */ |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index e9969a2fc846..28ee187ed224 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -1754,7 +1754,8 @@ static inline void flush_unauthorized_files(struct files_struct * files) | |||
1754 | get_file(devnull); | 1754 | get_file(devnull); |
1755 | } else { | 1755 | } else { |
1756 | devnull = dentry_open(dget(selinux_null), mntget(selinuxfs_mount), O_RDWR); | 1756 | devnull = dentry_open(dget(selinux_null), mntget(selinuxfs_mount), O_RDWR); |
1757 | if (!devnull) { | 1757 | if (IS_ERR(devnull)) { |
1758 | devnull = NULL; | ||
1758 | put_unused_fd(fd); | 1759 | put_unused_fd(fd); |
1759 | fput(file); | 1760 | fput(file); |
1760 | continue; | 1761 | continue; |
@@ -3313,7 +3314,13 @@ static int selinux_socket_getpeername(struct socket *sock) | |||
3313 | 3314 | ||
3314 | static int selinux_socket_setsockopt(struct socket *sock,int level,int optname) | 3315 | static int selinux_socket_setsockopt(struct socket *sock,int level,int optname) |
3315 | { | 3316 | { |
3316 | return socket_has_perm(current, sock, SOCKET__SETOPT); | 3317 | int err; |
3318 | |||
3319 | err = socket_has_perm(current, sock, SOCKET__SETOPT); | ||
3320 | if (err) | ||
3321 | return err; | ||
3322 | |||
3323 | return selinux_netlbl_socket_setsockopt(sock, level, optname); | ||
3317 | } | 3324 | } |
3318 | 3325 | ||
3319 | static int selinux_socket_getsockopt(struct socket *sock, int level, | 3326 | static int selinux_socket_getsockopt(struct socket *sock, int level, |
diff --git a/security/selinux/include/selinux_netlabel.h b/security/selinux/include/selinux_netlabel.h index ecab4bddaaf4..9de10cc2cef2 100644 --- a/security/selinux/include/selinux_netlabel.h +++ b/security/selinux/include/selinux_netlabel.h | |||
@@ -53,6 +53,9 @@ void selinux_netlbl_sk_security_init(struct sk_security_struct *ssec, | |||
53 | void selinux_netlbl_sk_clone_security(struct sk_security_struct *ssec, | 53 | void selinux_netlbl_sk_clone_security(struct sk_security_struct *ssec, |
54 | struct sk_security_struct *newssec); | 54 | struct sk_security_struct *newssec); |
55 | int selinux_netlbl_inode_permission(struct inode *inode, int mask); | 55 | int selinux_netlbl_inode_permission(struct inode *inode, int mask); |
56 | int selinux_netlbl_socket_setsockopt(struct socket *sock, | ||
57 | int level, | ||
58 | int optname); | ||
56 | #else | 59 | #else |
57 | static inline void selinux_netlbl_cache_invalidate(void) | 60 | static inline void selinux_netlbl_cache_invalidate(void) |
58 | { | 61 | { |
@@ -114,6 +117,13 @@ static inline int selinux_netlbl_inode_permission(struct inode *inode, | |||
114 | { | 117 | { |
115 | return 0; | 118 | return 0; |
116 | } | 119 | } |
120 | |||
121 | static inline int selinux_netlbl_socket_setsockopt(struct socket *sock, | ||
122 | int level, | ||
123 | int optname) | ||
124 | { | ||
125 | return 0; | ||
126 | } | ||
117 | #endif /* CONFIG_NETLABEL */ | 127 | #endif /* CONFIG_NETLABEL */ |
118 | 128 | ||
119 | #endif | 129 | #endif |
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index b1f6fb36c699..bfe122764c98 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c | |||
@@ -2682,4 +2682,41 @@ u32 selinux_netlbl_socket_getpeersec_dgram(struct sk_buff *skb) | |||
2682 | 2682 | ||
2683 | return peer_sid; | 2683 | return peer_sid; |
2684 | } | 2684 | } |
2685 | |||
2686 | /** | ||
2687 | * selinux_netlbl_socket_setsockopt - Do not allow users to remove a NetLabel | ||
2688 | * @sock: the socket | ||
2689 | * @level: the socket level or protocol | ||
2690 | * @optname: the socket option name | ||
2691 | * | ||
2692 | * Description: | ||
2693 | * Check the setsockopt() call and if the user is trying to replace the IP | ||
2694 | * options on a socket and a NetLabel is in place for the socket deny the | ||
2695 | * access; otherwise allow the access. Returns zero when the access is | ||
2696 | * allowed, -EACCES when denied, and other negative values on error. | ||
2697 | * | ||
2698 | */ | ||
2699 | int selinux_netlbl_socket_setsockopt(struct socket *sock, | ||
2700 | int level, | ||
2701 | int optname) | ||
2702 | { | ||
2703 | int rc = 0; | ||
2704 | struct inode *inode = SOCK_INODE(sock); | ||
2705 | struct sk_security_struct *sksec = sock->sk->sk_security; | ||
2706 | struct inode_security_struct *isec = inode->i_security; | ||
2707 | struct netlbl_lsm_secattr secattr; | ||
2708 | |||
2709 | mutex_lock(&isec->lock); | ||
2710 | if (level == IPPROTO_IP && optname == IP_OPTIONS && | ||
2711 | sksec->nlbl_state == NLBL_LABELED) { | ||
2712 | netlbl_secattr_init(&secattr); | ||
2713 | rc = netlbl_socket_getattr(sock, &secattr); | ||
2714 | if (rc == 0 && (secattr.cache || secattr.mls_lvl_vld)) | ||
2715 | rc = -EACCES; | ||
2716 | netlbl_secattr_destroy(&secattr); | ||
2717 | } | ||
2718 | mutex_unlock(&isec->lock); | ||
2719 | |||
2720 | return rc; | ||
2721 | } | ||
2685 | #endif /* CONFIG_NETLABEL */ | 2722 | #endif /* CONFIG_NETLABEL */ |
diff --git a/sound/aoa/codecs/snd-aoa-codec-tas.c b/sound/aoa/codecs/snd-aoa-codec-tas.c index 2ef55a17917c..9de8485ba3f5 100644 --- a/sound/aoa/codecs/snd-aoa-codec-tas.c +++ b/sound/aoa/codecs/snd-aoa-codec-tas.c | |||
@@ -514,9 +514,15 @@ static int tas_snd_capture_source_put(struct snd_kcontrol *kcontrol, | |||
514 | mutex_lock(&tas->mtx); | 514 | mutex_lock(&tas->mtx); |
515 | oldacr = tas->acr; | 515 | oldacr = tas->acr; |
516 | 516 | ||
517 | tas->acr &= ~TAS_ACR_INPUT_B; | 517 | /* |
518 | * Despite what the data sheet says in one place, the | ||
519 | * TAS_ACR_B_MONAUREAL bit forces mono output even when | ||
520 | * input A (line in) is selected. | ||
521 | */ | ||
522 | tas->acr &= ~(TAS_ACR_INPUT_B | TAS_ACR_B_MONAUREAL); | ||
518 | if (ucontrol->value.enumerated.item[0]) | 523 | if (ucontrol->value.enumerated.item[0]) |
519 | tas->acr |= TAS_ACR_INPUT_B; | 524 | tas->acr |= TAS_ACR_INPUT_B | TAS_ACR_B_MONAUREAL | |
525 | TAS_ACR_B_MON_SEL_RIGHT; | ||
520 | if (oldacr == tas->acr) { | 526 | if (oldacr == tas->acr) { |
521 | mutex_unlock(&tas->mtx); | 527 | mutex_unlock(&tas->mtx); |
522 | return 0; | 528 | return 0; |
@@ -686,8 +692,7 @@ static int tas_reset_init(struct tas *tas) | |||
686 | if (tas_write_reg(tas, TAS_REG_MCS, 1, &tmp)) | 692 | if (tas_write_reg(tas, TAS_REG_MCS, 1, &tmp)) |
687 | goto outerr; | 693 | goto outerr; |
688 | 694 | ||
689 | tas->acr |= TAS_ACR_ANALOG_PDOWN | TAS_ACR_B_MONAUREAL | | 695 | tas->acr |= TAS_ACR_ANALOG_PDOWN; |
690 | TAS_ACR_B_MON_SEL_RIGHT; | ||
691 | if (tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr)) | 696 | if (tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr)) |
692 | goto outerr; | 697 | goto outerr; |
693 | 698 | ||
diff --git a/sound/core/control.c b/sound/core/control.c index 6973a9686b67..48ef0a09a7a7 100644 --- a/sound/core/control.c +++ b/sound/core/control.c | |||
@@ -1018,10 +1018,6 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file, | |||
1018 | } | 1018 | } |
1019 | switch (info->type) { | 1019 | switch (info->type) { |
1020 | case SNDRV_CTL_ELEM_TYPE_BOOLEAN: | 1020 | case SNDRV_CTL_ELEM_TYPE_BOOLEAN: |
1021 | private_size = sizeof(char); | ||
1022 | if (info->count > 128) | ||
1023 | return -EINVAL; | ||
1024 | break; | ||
1025 | case SNDRV_CTL_ELEM_TYPE_INTEGER: | 1021 | case SNDRV_CTL_ELEM_TYPE_INTEGER: |
1026 | private_size = sizeof(long); | 1022 | private_size = sizeof(long); |
1027 | if (info->count > 128) | 1023 | if (info->count > 128) |
diff --git a/sound/core/info.c b/sound/core/info.c index e43662b33f16..0b4aab3225e5 100644 --- a/sound/core/info.c +++ b/sound/core/info.c | |||
@@ -120,7 +120,10 @@ int snd_iprintf(struct snd_info_buffer *buffer, char *fmt,...) | |||
120 | len = buffer->len - buffer->size; | 120 | len = buffer->len - buffer->size; |
121 | va_start(args, fmt); | 121 | va_start(args, fmt); |
122 | for (;;) { | 122 | for (;;) { |
123 | res = vsnprintf(buffer->buffer + buffer->curr, len, fmt, args); | 123 | va_list ap; |
124 | va_copy(ap, args); | ||
125 | res = vsnprintf(buffer->buffer + buffer->curr, len, fmt, ap); | ||
126 | va_end(ap); | ||
124 | if (res < len) | 127 | if (res < len) |
125 | break; | 128 | break; |
126 | err = resize_info_buffer(buffer, buffer->len + PAGE_SIZE); | 129 | err = resize_info_buffer(buffer, buffer->len + PAGE_SIZE); |
diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c index 505b23ec4058..e0821eb3d851 100644 --- a/sound/core/oss/pcm_oss.c +++ b/sound/core/oss/pcm_oss.c | |||
@@ -2359,7 +2359,8 @@ static int snd_pcm_oss_release(struct inode *inode, struct file *file) | |||
2359 | substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_CAPTURE]; | 2359 | substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_CAPTURE]; |
2360 | snd_assert(substream != NULL, return -ENXIO); | 2360 | snd_assert(substream != NULL, return -ENXIO); |
2361 | pcm = substream->pcm; | 2361 | pcm = substream->pcm; |
2362 | snd_pcm_oss_sync(pcm_oss_file); | 2362 | if (!pcm->card->shutdown) |
2363 | snd_pcm_oss_sync(pcm_oss_file); | ||
2363 | mutex_lock(&pcm->open_mutex); | 2364 | mutex_lock(&pcm->open_mutex); |
2364 | snd_pcm_oss_release_file(pcm_oss_file); | 2365 | snd_pcm_oss_release_file(pcm_oss_file); |
2365 | mutex_unlock(&pcm->open_mutex); | 2366 | mutex_unlock(&pcm->open_mutex); |
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 37b4b10850ae..66e24b5da469 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c | |||
@@ -1310,7 +1310,8 @@ static int snd_pcm_pre_prepare(struct snd_pcm_substream *substream, | |||
1310 | int f_flags) | 1310 | int f_flags) |
1311 | { | 1311 | { |
1312 | struct snd_pcm_runtime *runtime = substream->runtime; | 1312 | struct snd_pcm_runtime *runtime = substream->runtime; |
1313 | if (runtime->status->state == SNDRV_PCM_STATE_OPEN) | 1313 | if (runtime->status->state == SNDRV_PCM_STATE_OPEN || |
1314 | runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED) | ||
1314 | return -EBADFD; | 1315 | return -EBADFD; |
1315 | if (snd_pcm_running(substream)) | 1316 | if (snd_pcm_running(substream)) |
1316 | return -EBUSY; | 1317 | return -EBUSY; |
@@ -1568,7 +1569,8 @@ static int snd_pcm_drop(struct snd_pcm_substream *substream) | |||
1568 | runtime = substream->runtime; | 1569 | runtime = substream->runtime; |
1569 | card = substream->pcm->card; | 1570 | card = substream->pcm->card; |
1570 | 1571 | ||
1571 | if (runtime->status->state == SNDRV_PCM_STATE_OPEN) | 1572 | if (runtime->status->state == SNDRV_PCM_STATE_OPEN || |
1573 | runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED) | ||
1572 | return -EBADFD; | 1574 | return -EBADFD; |
1573 | 1575 | ||
1574 | snd_power_lock(card); | 1576 | snd_power_lock(card); |
diff --git a/sound/core/rtctimer.c b/sound/core/rtctimer.c index 412dd62b654e..9f7b32e1ccde 100644 --- a/sound/core/rtctimer.c +++ b/sound/core/rtctimer.c | |||
@@ -22,13 +22,10 @@ | |||
22 | 22 | ||
23 | #include <sound/driver.h> | 23 | #include <sound/driver.h> |
24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
25 | #include <linux/time.h> | ||
26 | #include <linux/threads.h> | ||
27 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
28 | #include <linux/moduleparam.h> | 26 | #include <linux/moduleparam.h> |
29 | #include <sound/core.h> | 27 | #include <sound/core.h> |
30 | #include <sound/timer.h> | 28 | #include <sound/timer.h> |
31 | #include <sound/info.h> | ||
32 | 29 | ||
33 | #if defined(CONFIG_RTC) || defined(CONFIG_RTC_MODULE) | 30 | #if defined(CONFIG_RTC) || defined(CONFIG_RTC_MODULE) |
34 | 31 | ||
@@ -50,7 +47,9 @@ static int rtctimer_stop(struct snd_timer *t); | |||
50 | * The hardware dependent description for this timer. | 47 | * The hardware dependent description for this timer. |
51 | */ | 48 | */ |
52 | static struct snd_timer_hardware rtc_hw = { | 49 | static struct snd_timer_hardware rtc_hw = { |
53 | .flags = SNDRV_TIMER_HW_FIRST|SNDRV_TIMER_HW_AUTO, | 50 | .flags = SNDRV_TIMER_HW_AUTO | |
51 | SNDRV_TIMER_HW_FIRST | | ||
52 | SNDRV_TIMER_HW_TASKLET, | ||
54 | .ticks = 100000000L, /* FIXME: XXX */ | 53 | .ticks = 100000000L, /* FIXME: XXX */ |
55 | .open = rtctimer_open, | 54 | .open = rtctimer_open, |
56 | .close = rtctimer_close, | 55 | .close = rtctimer_close, |
@@ -60,6 +59,7 @@ static struct snd_timer_hardware rtc_hw = { | |||
60 | 59 | ||
61 | static int rtctimer_freq = RTC_FREQ; /* frequency */ | 60 | static int rtctimer_freq = RTC_FREQ; /* frequency */ |
62 | static struct snd_timer *rtctimer; | 61 | static struct snd_timer *rtctimer; |
62 | static struct tasklet_struct rtc_tasklet; | ||
63 | static rtc_task_t rtc_task; | 63 | static rtc_task_t rtc_task; |
64 | 64 | ||
65 | 65 | ||
@@ -81,6 +81,7 @@ rtctimer_close(struct snd_timer *t) | |||
81 | rtc_task_t *rtc = t->private_data; | 81 | rtc_task_t *rtc = t->private_data; |
82 | if (rtc) { | 82 | if (rtc) { |
83 | rtc_unregister(rtc); | 83 | rtc_unregister(rtc); |
84 | tasklet_kill(&rtc_tasklet); | ||
84 | t->private_data = NULL; | 85 | t->private_data = NULL; |
85 | } | 86 | } |
86 | return 0; | 87 | return 0; |
@@ -105,12 +106,17 @@ rtctimer_stop(struct snd_timer *timer) | |||
105 | return 0; | 106 | return 0; |
106 | } | 107 | } |
107 | 108 | ||
109 | static void rtctimer_tasklet(unsigned long data) | ||
110 | { | ||
111 | snd_timer_interrupt((struct snd_timer *)data, 1); | ||
112 | } | ||
113 | |||
108 | /* | 114 | /* |
109 | * interrupt | 115 | * interrupt |
110 | */ | 116 | */ |
111 | static void rtctimer_interrupt(void *private_data) | 117 | static void rtctimer_interrupt(void *private_data) |
112 | { | 118 | { |
113 | snd_timer_interrupt(private_data, 1); | 119 | tasklet_hi_schedule(private_data); |
114 | } | 120 | } |
115 | 121 | ||
116 | 122 | ||
@@ -139,9 +145,11 @@ static int __init rtctimer_init(void) | |||
139 | timer->hw = rtc_hw; | 145 | timer->hw = rtc_hw; |
140 | timer->hw.resolution = NANO_SEC / rtctimer_freq; | 146 | timer->hw.resolution = NANO_SEC / rtctimer_freq; |
141 | 147 | ||
148 | tasklet_init(&rtc_tasklet, rtctimer_tasklet, (unsigned long)timer); | ||
149 | |||
142 | /* set up RTC callback */ | 150 | /* set up RTC callback */ |
143 | rtc_task.func = rtctimer_interrupt; | 151 | rtc_task.func = rtctimer_interrupt; |
144 | rtc_task.private_data = timer; | 152 | rtc_task.private_data = &rtc_tasklet; |
145 | 153 | ||
146 | err = snd_timer_global_register(timer); | 154 | err = snd_timer_global_register(timer); |
147 | if (err < 0) { | 155 | if (err < 0) { |
diff --git a/sound/isa/Kconfig b/sound/isa/Kconfig index 557c4de22960..57371f1a441f 100644 --- a/sound/isa/Kconfig +++ b/sound/isa/Kconfig | |||
@@ -13,6 +13,7 @@ config SND_CS4231_LIB | |||
13 | 13 | ||
14 | config SND_ADLIB | 14 | config SND_ADLIB |
15 | tristate "AdLib FM card" | 15 | tristate "AdLib FM card" |
16 | depends on SND | ||
16 | select SND_OPL3_LIB | 17 | select SND_OPL3_LIB |
17 | help | 18 | help |
18 | Say Y here to include support for AdLib FM cards. | 19 | Say Y here to include support for AdLib FM cards. |
diff --git a/sound/isa/ad1816a/ad1816a.c b/sound/isa/ad1816a/ad1816a.c index b33a5fb59ec2..59034507175b 100644 --- a/sound/isa/ad1816a/ad1816a.c +++ b/sound/isa/ad1816a/ad1816a.c | |||
@@ -120,6 +120,8 @@ static int __devinit snd_card_ad1816a_pnp(int dev, struct snd_card_ad1816a *acar | |||
120 | struct pnp_resource_table *cfg = kmalloc(sizeof(*cfg), GFP_KERNEL); | 120 | struct pnp_resource_table *cfg = kmalloc(sizeof(*cfg), GFP_KERNEL); |
121 | int err; | 121 | int err; |
122 | 122 | ||
123 | if (!cfg) | ||
124 | return -ENOMEM; | ||
123 | acard->dev = pnp_request_card_device(card, id->devs[0].id, NULL); | 125 | acard->dev = pnp_request_card_device(card, id->devs[0].id, NULL); |
124 | if (acard->dev == NULL) { | 126 | if (acard->dev == NULL) { |
125 | kfree(cfg); | 127 | kfree(cfg); |
diff --git a/sound/isa/cmi8330.c b/sound/isa/cmi8330.c index 3c1e9fd56fe0..d1f6dfcec46e 100644 --- a/sound/isa/cmi8330.c +++ b/sound/isa/cmi8330.c | |||
@@ -289,6 +289,8 @@ static int __devinit snd_cmi8330_pnp(int dev, struct snd_cmi8330 *acard, | |||
289 | struct pnp_resource_table * cfg = kmalloc(sizeof(struct pnp_resource_table), GFP_KERNEL); | 289 | struct pnp_resource_table * cfg = kmalloc(sizeof(struct pnp_resource_table), GFP_KERNEL); |
290 | int err; | 290 | int err; |
291 | 291 | ||
292 | if (!cfg) | ||
293 | return -ENOMEM; | ||
292 | acard->cap = pnp_request_card_device(card, id->devs[0].id, NULL); | 294 | acard->cap = pnp_request_card_device(card, id->devs[0].id, NULL); |
293 | if (acard->cap == NULL) { | 295 | if (acard->cap == NULL) { |
294 | kfree(cfg); | 296 | kfree(cfg); |
diff --git a/sound/isa/gus/interwave.c b/sound/isa/gus/interwave.c index f12cd09d1fcc..4ec2d79431fc 100644 --- a/sound/isa/gus/interwave.c +++ b/sound/isa/gus/interwave.c | |||
@@ -564,6 +564,8 @@ static int __devinit snd_interwave_pnp(int dev, struct snd_interwave *iwcard, | |||
564 | struct pnp_resource_table * cfg = kmalloc(sizeof(struct pnp_resource_table), GFP_KERNEL); | 564 | struct pnp_resource_table * cfg = kmalloc(sizeof(struct pnp_resource_table), GFP_KERNEL); |
565 | int err; | 565 | int err; |
566 | 566 | ||
567 | if (!cfg) | ||
568 | return -ENOMEM; | ||
567 | iwcard->dev = pnp_request_card_device(card, id->devs[0].id, NULL); | 569 | iwcard->dev = pnp_request_card_device(card, id->devs[0].id, NULL); |
568 | if (iwcard->dev == NULL) { | 570 | if (iwcard->dev == NULL) { |
569 | kfree(cfg); | 571 | kfree(cfg); |
diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c index a1ad39a8cdce..df227377c333 100644 --- a/sound/isa/opti9xx/opti92x-ad1848.c +++ b/sound/isa/opti9xx/opti92x-ad1848.c | |||
@@ -1683,6 +1683,8 @@ static int __init snd_card_opti9xx_pnp(struct snd_opti9xx *chip, struct pnp_card | |||
1683 | struct pnp_resource_table *cfg = kmalloc(sizeof(*cfg), GFP_KERNEL); | 1683 | struct pnp_resource_table *cfg = kmalloc(sizeof(*cfg), GFP_KERNEL); |
1684 | int err; | 1684 | int err; |
1685 | 1685 | ||
1686 | if (!cfg) | ||
1687 | return -ENOMEM; | ||
1686 | chip->dev = pnp_request_card_device(card, pid->devs[0].id, NULL); | 1688 | chip->dev = pnp_request_card_device(card, pid->devs[0].id, NULL); |
1687 | if (chip->dev == NULL) { | 1689 | if (chip->dev == NULL) { |
1688 | kfree(cfg); | 1690 | kfree(cfg); |
diff --git a/sound/oss/sh_dac_audio.c b/sound/oss/sh_dac_audio.c index 3b3b4da8cfd3..51f554154c48 100644 --- a/sound/oss/sh_dac_audio.c +++ b/sound/oss/sh_dac_audio.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <asm/cpu/dac.h> | 26 | #include <asm/cpu/dac.h> |
27 | #include <asm/cpu/timer.h> | 27 | #include <asm/cpu/timer.h> |
28 | #include <asm/machvec.h> | 28 | #include <asm/machvec.h> |
29 | #include <asm/hp6xx/hp6xx.h> | 29 | #include <asm/hp6xx.h> |
30 | #include <asm/hd64461.h> | 30 | #include <asm/hd64461.h> |
31 | 31 | ||
32 | #define MODNAME "sh_dac_audio" | 32 | #define MODNAME "sh_dac_audio" |
diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c index a79e91850ba3..6577b2325357 100644 --- a/sound/pci/ac97/ac97_codec.c +++ b/sound/pci/ac97/ac97_codec.c | |||
@@ -570,8 +570,7 @@ int snd_ac97_put_volsw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value | |||
570 | ac97->power_up &= ~(1 << (reg>>1)); | 570 | ac97->power_up &= ~(1 << (reg>>1)); |
571 | else | 571 | else |
572 | ac97->power_up |= 1 << (reg>>1); | 572 | ac97->power_up |= 1 << (reg>>1); |
573 | if (power_save) | 573 | update_power_regs(ac97); |
574 | update_power_regs(ac97); | ||
575 | } | 574 | } |
576 | #endif | 575 | #endif |
577 | return err; | 576 | return err; |
@@ -2337,10 +2336,7 @@ int snd_ac97_update_power(struct snd_ac97 *ac97, int reg, int powerup) | |||
2337 | } | 2336 | } |
2338 | } | 2337 | } |
2339 | 2338 | ||
2340 | if (! power_save) | 2339 | if (power_save && !powerup && ac97->power_workq) |
2341 | return 0; | ||
2342 | |||
2343 | if (! powerup && ac97->power_workq) | ||
2344 | /* adjust power-down bits after two seconds delay | 2340 | /* adjust power-down bits after two seconds delay |
2345 | * (for avoiding loud click noises for many (OSS) apps | 2341 | * (for avoiding loud click noises for many (OSS) apps |
2346 | * that open/close frequently) | 2342 | * that open/close frequently) |
diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c index 13a8cefa7749..a7edd56542d4 100644 --- a/sound/pci/ali5451/ali5451.c +++ b/sound/pci/ali5451/ali5451.c | |||
@@ -2032,8 +2032,10 @@ static int ali_suspend(struct pci_dev *pci, pm_message_t state) | |||
2032 | outl(0xffffffff, ALI_REG(chip, ALI_STOP)); | 2032 | outl(0xffffffff, ALI_REG(chip, ALI_STOP)); |
2033 | 2033 | ||
2034 | spin_unlock_irq(&chip->reg_lock); | 2034 | spin_unlock_irq(&chip->reg_lock); |
2035 | |||
2035 | pci_disable_device(pci); | 2036 | pci_disable_device(pci); |
2036 | pci_save_state(pci); | 2037 | pci_save_state(pci); |
2038 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
2037 | return 0; | 2039 | return 0; |
2038 | } | 2040 | } |
2039 | 2041 | ||
@@ -2048,8 +2050,15 @@ static int ali_resume(struct pci_dev *pci) | |||
2048 | if (! im) | 2050 | if (! im) |
2049 | return 0; | 2051 | return 0; |
2050 | 2052 | ||
2053 | pci_set_power_state(pci, PCI_D0); | ||
2051 | pci_restore_state(pci); | 2054 | pci_restore_state(pci); |
2052 | pci_enable_device(pci); | 2055 | if (pci_enable_device(pci) < 0) { |
2056 | printk(KERN_ERR "ali5451: pci_enable_device failed, " | ||
2057 | "disabling device\n"); | ||
2058 | snd_card_disconnect(card); | ||
2059 | return -EIO; | ||
2060 | } | ||
2061 | pci_set_master(pci); | ||
2053 | 2062 | ||
2054 | spin_lock_irq(&chip->reg_lock); | 2063 | spin_lock_irq(&chip->reg_lock); |
2055 | 2064 | ||
diff --git a/sound/pci/als300.c b/sound/pci/als300.c index 9b16c299f0a9..95f70f3cc37e 100644 --- a/sound/pci/als300.c +++ b/sound/pci/als300.c | |||
@@ -768,9 +768,9 @@ static int snd_als300_suspend(struct pci_dev *pci, pm_message_t state) | |||
768 | snd_pcm_suspend_all(chip->pcm); | 768 | snd_pcm_suspend_all(chip->pcm); |
769 | snd_ac97_suspend(chip->ac97); | 769 | snd_ac97_suspend(chip->ac97); |
770 | 770 | ||
771 | pci_set_power_state(pci, PCI_D3hot); | ||
772 | pci_disable_device(pci); | 771 | pci_disable_device(pci); |
773 | pci_save_state(pci); | 772 | pci_save_state(pci); |
773 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
774 | return 0; | 774 | return 0; |
775 | } | 775 | } |
776 | 776 | ||
@@ -779,9 +779,14 @@ static int snd_als300_resume(struct pci_dev *pci) | |||
779 | struct snd_card *card = pci_get_drvdata(pci); | 779 | struct snd_card *card = pci_get_drvdata(pci); |
780 | struct snd_als300 *chip = card->private_data; | 780 | struct snd_als300 *chip = card->private_data; |
781 | 781 | ||
782 | pci_restore_state(pci); | ||
783 | pci_enable_device(pci); | ||
784 | pci_set_power_state(pci, PCI_D0); | 782 | pci_set_power_state(pci, PCI_D0); |
783 | pci_restore_state(pci); | ||
784 | if (pci_enable_device(pci) < 0) { | ||
785 | printk(KERN_ERR "als300: pci_enable_device failed, " | ||
786 | "disabling device\n"); | ||
787 | snd_card_disconnect(card); | ||
788 | return -EIO; | ||
789 | } | ||
785 | pci_set_master(pci); | 790 | pci_set_master(pci); |
786 | 791 | ||
787 | snd_als300_init(chip); | 792 | snd_als300_init(chip); |
diff --git a/sound/pci/als4000.c b/sound/pci/als4000.c index 15fc3929b5f7..8fb55d3b454b 100644 --- a/sound/pci/als4000.c +++ b/sound/pci/als4000.c | |||
@@ -804,9 +804,9 @@ static int snd_als4000_suspend(struct pci_dev *pci, pm_message_t state) | |||
804 | snd_pcm_suspend_all(chip->pcm); | 804 | snd_pcm_suspend_all(chip->pcm); |
805 | snd_sbmixer_suspend(chip); | 805 | snd_sbmixer_suspend(chip); |
806 | 806 | ||
807 | pci_set_power_state(pci, PCI_D3hot); | ||
808 | pci_disable_device(pci); | 807 | pci_disable_device(pci); |
809 | pci_save_state(pci); | 808 | pci_save_state(pci); |
809 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
810 | return 0; | 810 | return 0; |
811 | } | 811 | } |
812 | 812 | ||
@@ -816,9 +816,14 @@ static int snd_als4000_resume(struct pci_dev *pci) | |||
816 | struct snd_card_als4000 *acard = card->private_data; | 816 | struct snd_card_als4000 *acard = card->private_data; |
817 | struct snd_sb *chip = acard->chip; | 817 | struct snd_sb *chip = acard->chip; |
818 | 818 | ||
819 | pci_restore_state(pci); | ||
820 | pci_enable_device(pci); | ||
821 | pci_set_power_state(pci, PCI_D0); | 819 | pci_set_power_state(pci, PCI_D0); |
820 | pci_restore_state(pci); | ||
821 | if (pci_enable_device(pci) < 0) { | ||
822 | printk(KERN_ERR "als4000: pci_enable_device failed, " | ||
823 | "disabling device\n"); | ||
824 | snd_card_disconnect(card); | ||
825 | return -EIO; | ||
826 | } | ||
822 | pci_set_master(pci); | 827 | pci_set_master(pci); |
823 | 828 | ||
824 | snd_als4000_configure(chip); | 829 | snd_als4000_configure(chip); |
diff --git a/sound/pci/atiixp.c b/sound/pci/atiixp.c index 3e8fc5a0006a..e3e99f396711 100644 --- a/sound/pci/atiixp.c +++ b/sound/pci/atiixp.c | |||
@@ -1442,9 +1442,9 @@ static int snd_atiixp_suspend(struct pci_dev *pci, pm_message_t state) | |||
1442 | snd_atiixp_aclink_down(chip); | 1442 | snd_atiixp_aclink_down(chip); |
1443 | snd_atiixp_chip_stop(chip); | 1443 | snd_atiixp_chip_stop(chip); |
1444 | 1444 | ||
1445 | pci_set_power_state(pci, PCI_D3hot); | ||
1446 | pci_disable_device(pci); | 1445 | pci_disable_device(pci); |
1447 | pci_save_state(pci); | 1446 | pci_save_state(pci); |
1447 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
1448 | return 0; | 1448 | return 0; |
1449 | } | 1449 | } |
1450 | 1450 | ||
@@ -1454,9 +1454,14 @@ static int snd_atiixp_resume(struct pci_dev *pci) | |||
1454 | struct atiixp *chip = card->private_data; | 1454 | struct atiixp *chip = card->private_data; |
1455 | int i; | 1455 | int i; |
1456 | 1456 | ||
1457 | pci_restore_state(pci); | ||
1458 | pci_enable_device(pci); | ||
1459 | pci_set_power_state(pci, PCI_D0); | 1457 | pci_set_power_state(pci, PCI_D0); |
1458 | pci_restore_state(pci); | ||
1459 | if (pci_enable_device(pci) < 0) { | ||
1460 | printk(KERN_ERR "atiixp: pci_enable_device failed, " | ||
1461 | "disabling device\n"); | ||
1462 | snd_card_disconnect(card); | ||
1463 | return -EIO; | ||
1464 | } | ||
1460 | pci_set_master(pci); | 1465 | pci_set_master(pci); |
1461 | 1466 | ||
1462 | snd_atiixp_aclink_reset(chip); | 1467 | snd_atiixp_aclink_reset(chip); |
diff --git a/sound/pci/atiixp_modem.c b/sound/pci/atiixp_modem.c index c5dda1bf3d46..dc54f2c68ed7 100644 --- a/sound/pci/atiixp_modem.c +++ b/sound/pci/atiixp_modem.c | |||
@@ -1128,9 +1128,9 @@ static int snd_atiixp_suspend(struct pci_dev *pci, pm_message_t state) | |||
1128 | snd_atiixp_aclink_down(chip); | 1128 | snd_atiixp_aclink_down(chip); |
1129 | snd_atiixp_chip_stop(chip); | 1129 | snd_atiixp_chip_stop(chip); |
1130 | 1130 | ||
1131 | pci_set_power_state(pci, PCI_D3hot); | ||
1132 | pci_disable_device(pci); | 1131 | pci_disable_device(pci); |
1133 | pci_save_state(pci); | 1132 | pci_save_state(pci); |
1133 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
1134 | return 0; | 1134 | return 0; |
1135 | } | 1135 | } |
1136 | 1136 | ||
@@ -1140,9 +1140,14 @@ static int snd_atiixp_resume(struct pci_dev *pci) | |||
1140 | struct atiixp_modem *chip = card->private_data; | 1140 | struct atiixp_modem *chip = card->private_data; |
1141 | int i; | 1141 | int i; |
1142 | 1142 | ||
1143 | pci_restore_state(pci); | ||
1144 | pci_enable_device(pci); | ||
1145 | pci_set_power_state(pci, PCI_D0); | 1143 | pci_set_power_state(pci, PCI_D0); |
1144 | pci_restore_state(pci); | ||
1145 | if (pci_enable_device(pci) < 0) { | ||
1146 | printk(KERN_ERR "atiixp-modem: pci_enable_device failed, " | ||
1147 | "disabling device\n"); | ||
1148 | snd_card_disconnect(card); | ||
1149 | return -EIO; | ||
1150 | } | ||
1146 | pci_set_master(pci); | 1151 | pci_set_master(pci); |
1147 | 1152 | ||
1148 | snd_atiixp_aclink_reset(chip); | 1153 | snd_atiixp_aclink_reset(chip); |
diff --git a/sound/pci/azt3328.c b/sound/pci/azt3328.c index 692f203d65d8..2414ee630756 100644 --- a/sound/pci/azt3328.c +++ b/sound/pci/azt3328.c | |||
@@ -1903,9 +1903,9 @@ snd_azf3328_suspend(struct pci_dev *pci, pm_message_t state) | |||
1903 | for (reg = 0; reg < AZF_IO_SIZE_SYNTH_PM / 2; reg++) | 1903 | for (reg = 0; reg < AZF_IO_SIZE_SYNTH_PM / 2; reg++) |
1904 | chip->saved_regs_synth[reg] = inw(chip->synth_port + reg * 2); | 1904 | chip->saved_regs_synth[reg] = inw(chip->synth_port + reg * 2); |
1905 | 1905 | ||
1906 | pci_set_power_state(pci, PCI_D3hot); | ||
1907 | pci_disable_device(pci); | 1906 | pci_disable_device(pci); |
1908 | pci_save_state(pci); | 1907 | pci_save_state(pci); |
1908 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
1909 | return 0; | 1909 | return 0; |
1910 | } | 1910 | } |
1911 | 1911 | ||
@@ -1916,9 +1916,14 @@ snd_azf3328_resume(struct pci_dev *pci) | |||
1916 | struct snd_azf3328 *chip = card->private_data; | 1916 | struct snd_azf3328 *chip = card->private_data; |
1917 | int reg; | 1917 | int reg; |
1918 | 1918 | ||
1919 | pci_restore_state(pci); | ||
1920 | pci_enable_device(pci); | ||
1921 | pci_set_power_state(pci, PCI_D0); | 1919 | pci_set_power_state(pci, PCI_D0); |
1920 | pci_restore_state(pci); | ||
1921 | if (pci_enable_device(pci) < 0) { | ||
1922 | printk(KERN_ERR "azt3328: pci_enable_device failed, " | ||
1923 | "disabling device\n"); | ||
1924 | snd_card_disconnect(card); | ||
1925 | return -EIO; | ||
1926 | } | ||
1922 | pci_set_master(pci); | 1927 | pci_set_master(pci); |
1923 | 1928 | ||
1924 | for (reg = 0; reg < AZF_IO_SIZE_IO2_PM / 2; reg++) | 1929 | for (reg = 0; reg < AZF_IO_SIZE_IO2_PM / 2; reg++) |
diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c index 1f7e71083069..0093cd1f92db 100644 --- a/sound/pci/cmipci.c +++ b/sound/pci/cmipci.c | |||
@@ -3122,9 +3122,9 @@ static int snd_cmipci_suspend(struct pci_dev *pci, pm_message_t state) | |||
3122 | /* disable ints */ | 3122 | /* disable ints */ |
3123 | snd_cmipci_write(cm, CM_REG_INT_HLDCLR, 0); | 3123 | snd_cmipci_write(cm, CM_REG_INT_HLDCLR, 0); |
3124 | 3124 | ||
3125 | pci_set_power_state(pci, PCI_D3hot); | ||
3126 | pci_disable_device(pci); | 3125 | pci_disable_device(pci); |
3127 | pci_save_state(pci); | 3126 | pci_save_state(pci); |
3127 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
3128 | return 0; | 3128 | return 0; |
3129 | } | 3129 | } |
3130 | 3130 | ||
@@ -3134,9 +3134,14 @@ static int snd_cmipci_resume(struct pci_dev *pci) | |||
3134 | struct cmipci *cm = card->private_data; | 3134 | struct cmipci *cm = card->private_data; |
3135 | int i; | 3135 | int i; |
3136 | 3136 | ||
3137 | pci_restore_state(pci); | ||
3138 | pci_enable_device(pci); | ||
3139 | pci_set_power_state(pci, PCI_D0); | 3137 | pci_set_power_state(pci, PCI_D0); |
3138 | pci_restore_state(pci); | ||
3139 | if (pci_enable_device(pci) < 0) { | ||
3140 | printk(KERN_ERR "cmipci: pci_enable_device failed, " | ||
3141 | "disabling device\n"); | ||
3142 | snd_card_disconnect(card); | ||
3143 | return -EIO; | ||
3144 | } | ||
3140 | pci_set_master(pci); | 3145 | pci_set_master(pci); |
3141 | 3146 | ||
3142 | /* reset / initialize to a sane state */ | 3147 | /* reset / initialize to a sane state */ |
diff --git a/sound/pci/cs4281.c b/sound/pci/cs4281.c index d54924e60bb1..0905fa88129d 100644 --- a/sound/pci/cs4281.c +++ b/sound/pci/cs4281.c | |||
@@ -2050,6 +2050,7 @@ static int cs4281_suspend(struct pci_dev *pci, pm_message_t state) | |||
2050 | 2050 | ||
2051 | pci_disable_device(pci); | 2051 | pci_disable_device(pci); |
2052 | pci_save_state(pci); | 2052 | pci_save_state(pci); |
2053 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
2053 | return 0; | 2054 | return 0; |
2054 | } | 2055 | } |
2055 | 2056 | ||
@@ -2060,8 +2061,14 @@ static int cs4281_resume(struct pci_dev *pci) | |||
2060 | unsigned int i; | 2061 | unsigned int i; |
2061 | u32 ulCLK; | 2062 | u32 ulCLK; |
2062 | 2063 | ||
2064 | pci_set_power_state(pci, PCI_D0); | ||
2063 | pci_restore_state(pci); | 2065 | pci_restore_state(pci); |
2064 | pci_enable_device(pci); | 2066 | if (pci_enable_device(pci) < 0) { |
2067 | printk(KERN_ERR "cs4281: pci_enable_device failed, " | ||
2068 | "disabling device\n"); | ||
2069 | snd_card_disconnect(card); | ||
2070 | return -EIO; | ||
2071 | } | ||
2065 | pci_set_master(pci); | 2072 | pci_set_master(pci); |
2066 | 2073 | ||
2067 | ulCLK = snd_cs4281_peekBA0(chip, BA0_CLKCR1); | 2074 | ulCLK = snd_cs4281_peekBA0(chip, BA0_CLKCR1); |
diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c index 16d4ebf2a33f..2807b9756ef0 100644 --- a/sound/pci/cs46xx/cs46xx_lib.c +++ b/sound/pci/cs46xx/cs46xx_lib.c | |||
@@ -3687,8 +3687,10 @@ int snd_cs46xx_suspend(struct pci_dev *pci, pm_message_t state) | |||
3687 | /* disable CLKRUN */ | 3687 | /* disable CLKRUN */ |
3688 | chip->active_ctrl(chip, -chip->amplifier); | 3688 | chip->active_ctrl(chip, -chip->amplifier); |
3689 | chip->amplifier = amp_saved; /* restore the status */ | 3689 | chip->amplifier = amp_saved; /* restore the status */ |
3690 | |||
3690 | pci_disable_device(pci); | 3691 | pci_disable_device(pci); |
3691 | pci_save_state(pci); | 3692 | pci_save_state(pci); |
3693 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
3692 | return 0; | 3694 | return 0; |
3693 | } | 3695 | } |
3694 | 3696 | ||
@@ -3698,9 +3700,16 @@ int snd_cs46xx_resume(struct pci_dev *pci) | |||
3698 | struct snd_cs46xx *chip = card->private_data; | 3700 | struct snd_cs46xx *chip = card->private_data; |
3699 | int amp_saved; | 3701 | int amp_saved; |
3700 | 3702 | ||
3703 | pci_set_power_state(pci, PCI_D0); | ||
3701 | pci_restore_state(pci); | 3704 | pci_restore_state(pci); |
3702 | pci_enable_device(pci); | 3705 | if (pci_enable_device(pci) < 0) { |
3706 | printk(KERN_ERR "cs46xx: pci_enable_device failed, " | ||
3707 | "disabling device\n"); | ||
3708 | snd_card_disconnect(card); | ||
3709 | return -EIO; | ||
3710 | } | ||
3703 | pci_set_master(pci); | 3711 | pci_set_master(pci); |
3712 | |||
3704 | amp_saved = chip->amplifier; | 3713 | amp_saved = chip->amplifier; |
3705 | chip->amplifier = 0; | 3714 | chip->amplifier = 0; |
3706 | chip->active_ctrl(chip, 1); /* force to on */ | 3715 | chip->active_ctrl(chip, 1); /* force to on */ |
diff --git a/sound/pci/cs5535audio/cs5535audio_pm.c b/sound/pci/cs5535audio/cs5535audio_pm.c index aad0e69db9c1..3e4d198a4502 100644 --- a/sound/pci/cs5535audio/cs5535audio_pm.c +++ b/sound/pci/cs5535audio/cs5535audio_pm.c | |||
@@ -73,9 +73,10 @@ int snd_cs5535audio_suspend(struct pci_dev *pci, pm_message_t state) | |||
73 | snd_ac97_suspend(cs5535au->ac97); | 73 | snd_ac97_suspend(cs5535au->ac97); |
74 | /* save important regs, then disable aclink in hw */ | 74 | /* save important regs, then disable aclink in hw */ |
75 | snd_cs5535audio_stop_hardware(cs5535au); | 75 | snd_cs5535audio_stop_hardware(cs5535au); |
76 | |||
76 | pci_disable_device(pci); | 77 | pci_disable_device(pci); |
77 | pci_save_state(pci); | 78 | pci_save_state(pci); |
78 | 79 | pci_set_power_state(pci, pci_choose_state(pci, state)); | |
79 | return 0; | 80 | return 0; |
80 | } | 81 | } |
81 | 82 | ||
@@ -87,8 +88,14 @@ int snd_cs5535audio_resume(struct pci_dev *pci) | |||
87 | int timeout; | 88 | int timeout; |
88 | int i; | 89 | int i; |
89 | 90 | ||
91 | pci_set_power_state(pci, PCI_D0); | ||
90 | pci_restore_state(pci); | 92 | pci_restore_state(pci); |
91 | pci_enable_device(pci); | 93 | if (pci_enable_device(pci) < 0) { |
94 | printk(KERN_ERR "cs5535audio: pci_enable_device failed, " | ||
95 | "disabling device\n"); | ||
96 | snd_card_disconnect(card); | ||
97 | return -EIO; | ||
98 | } | ||
92 | pci_set_master(pci); | 99 | pci_set_master(pci); |
93 | 100 | ||
94 | /* set LNK_WRM_RST to reset AC link */ | 101 | /* set LNK_WRM_RST to reset AC link */ |
diff --git a/sound/pci/emu10k1/emu10k1.c b/sound/pci/emu10k1/emu10k1.c index 493ec0816bb3..55caf341933a 100644 --- a/sound/pci/emu10k1/emu10k1.c +++ b/sound/pci/emu10k1/emu10k1.c | |||
@@ -226,9 +226,9 @@ static int snd_emu10k1_suspend(struct pci_dev *pci, pm_message_t state) | |||
226 | 226 | ||
227 | snd_emu10k1_done(emu); | 227 | snd_emu10k1_done(emu); |
228 | 228 | ||
229 | pci_set_power_state(pci, PCI_D3hot); | ||
230 | pci_disable_device(pci); | 229 | pci_disable_device(pci); |
231 | pci_save_state(pci); | 230 | pci_save_state(pci); |
231 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
232 | return 0; | 232 | return 0; |
233 | } | 233 | } |
234 | 234 | ||
@@ -237,11 +237,16 @@ static int snd_emu10k1_resume(struct pci_dev *pci) | |||
237 | struct snd_card *card = pci_get_drvdata(pci); | 237 | struct snd_card *card = pci_get_drvdata(pci); |
238 | struct snd_emu10k1 *emu = card->private_data; | 238 | struct snd_emu10k1 *emu = card->private_data; |
239 | 239 | ||
240 | pci_restore_state(pci); | ||
241 | pci_enable_device(pci); | ||
242 | pci_set_power_state(pci, PCI_D0); | 240 | pci_set_power_state(pci, PCI_D0); |
241 | pci_restore_state(pci); | ||
242 | if (pci_enable_device(pci) < 0) { | ||
243 | printk(KERN_ERR "emu10k1: pci_enable_device failed, " | ||
244 | "disabling device\n"); | ||
245 | snd_card_disconnect(card); | ||
246 | return -EIO; | ||
247 | } | ||
243 | pci_set_master(pci); | 248 | pci_set_master(pci); |
244 | 249 | ||
245 | snd_emu10k1_resume_init(emu); | 250 | snd_emu10k1_resume_init(emu); |
246 | snd_emu10k1_efx_resume(emu); | 251 | snd_emu10k1_efx_resume(emu); |
247 | snd_ac97_resume(emu->ac97); | 252 | snd_ac97_resume(emu->ac97); |
diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c index 8058059c56e9..8bc4ffa6220d 100644 --- a/sound/pci/emu10k1/emu10k1_main.c +++ b/sound/pci/emu10k1/emu10k1_main.c | |||
@@ -956,6 +956,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { | |||
956 | .ca0151_chip = 1, | 956 | .ca0151_chip = 1, |
957 | .spk71 = 1, | 957 | .spk71 = 1, |
958 | .spdif_bug = 1, | 958 | .spdif_bug = 1, |
959 | .adc_1361t = 1, /* 24 bit capture instead of 16bit. Fixes ALSA bug#324 */ | ||
959 | .ac97_chip = 1} , | 960 | .ac97_chip = 1} , |
960 | {.vendor = 0x1102, .device = 0x0004, .revision = 0x04, | 961 | {.vendor = 0x1102, .device = 0x0004, .revision = 0x04, |
961 | .driver = "Audigy2", .name = "Audigy 2 [Unknown]", | 962 | .driver = "Audigy2", .name = "Audigy 2 [Unknown]", |
diff --git a/sound/pci/ens1370.c b/sound/pci/ens1370.c index 8cb4fb2412db..d2a811f222c9 100644 --- a/sound/pci/ens1370.c +++ b/sound/pci/ens1370.c | |||
@@ -2072,9 +2072,10 @@ static int snd_ensoniq_suspend(struct pci_dev *pci, pm_message_t state) | |||
2072 | udelay(100); | 2072 | udelay(100); |
2073 | snd_ak4531_suspend(ensoniq->u.es1370.ak4531); | 2073 | snd_ak4531_suspend(ensoniq->u.es1370.ak4531); |
2074 | #endif | 2074 | #endif |
2075 | pci_set_power_state(pci, PCI_D3hot); | 2075 | |
2076 | pci_disable_device(pci); | 2076 | pci_disable_device(pci); |
2077 | pci_save_state(pci); | 2077 | pci_save_state(pci); |
2078 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
2078 | return 0; | 2079 | return 0; |
2079 | } | 2080 | } |
2080 | 2081 | ||
@@ -2083,9 +2084,14 @@ static int snd_ensoniq_resume(struct pci_dev *pci) | |||
2083 | struct snd_card *card = pci_get_drvdata(pci); | 2084 | struct snd_card *card = pci_get_drvdata(pci); |
2084 | struct ensoniq *ensoniq = card->private_data; | 2085 | struct ensoniq *ensoniq = card->private_data; |
2085 | 2086 | ||
2086 | pci_restore_state(pci); | ||
2087 | pci_enable_device(pci); | ||
2088 | pci_set_power_state(pci, PCI_D0); | 2087 | pci_set_power_state(pci, PCI_D0); |
2088 | pci_restore_state(pci); | ||
2089 | if (pci_enable_device(pci) < 0) { | ||
2090 | printk(KERN_ERR DRIVER_NAME ": pci_enable_device failed, " | ||
2091 | "disabling device\n"); | ||
2092 | snd_card_disconnect(card); | ||
2093 | return -EIO; | ||
2094 | } | ||
2089 | pci_set_master(pci); | 2095 | pci_set_master(pci); |
2090 | 2096 | ||
2091 | snd_ensoniq_chip_init(ensoniq); | 2097 | snd_ensoniq_chip_init(ensoniq); |
diff --git a/sound/pci/es1938.c b/sound/pci/es1938.c index 2da988f78ba7..1a8d36df4b5d 100644 --- a/sound/pci/es1938.c +++ b/sound/pci/es1938.c | |||
@@ -1481,10 +1481,14 @@ static int es1938_suspend(struct pci_dev *pci, pm_message_t state) | |||
1481 | *d = snd_es1938_reg_read(chip, *s); | 1481 | *d = snd_es1938_reg_read(chip, *s); |
1482 | 1482 | ||
1483 | outb(0x00, SLIO_REG(chip, IRQCONTROL)); /* disable irqs */ | 1483 | outb(0x00, SLIO_REG(chip, IRQCONTROL)); /* disable irqs */ |
1484 | if (chip->irq >= 0) | 1484 | if (chip->irq >= 0) { |
1485 | synchronize_irq(chip->irq); | ||
1485 | free_irq(chip->irq, chip); | 1486 | free_irq(chip->irq, chip); |
1487 | chip->irq = -1; | ||
1488 | } | ||
1486 | pci_disable_device(pci); | 1489 | pci_disable_device(pci); |
1487 | pci_save_state(pci); | 1490 | pci_save_state(pci); |
1491 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
1488 | return 0; | 1492 | return 0; |
1489 | } | 1493 | } |
1490 | 1494 | ||
@@ -1494,10 +1498,22 @@ static int es1938_resume(struct pci_dev *pci) | |||
1494 | struct es1938 *chip = card->private_data; | 1498 | struct es1938 *chip = card->private_data; |
1495 | unsigned char *s, *d; | 1499 | unsigned char *s, *d; |
1496 | 1500 | ||
1501 | pci_set_power_state(pci, PCI_D0); | ||
1497 | pci_restore_state(pci); | 1502 | pci_restore_state(pci); |
1498 | pci_enable_device(pci); | 1503 | if (pci_enable_device(pci) < 0) { |
1499 | request_irq(pci->irq, snd_es1938_interrupt, | 1504 | printk(KERN_ERR "es1938: pci_enable_device failed, " |
1500 | IRQF_DISABLED|IRQF_SHARED, "ES1938", chip); | 1505 | "disabling device\n"); |
1506 | snd_card_disconnect(card); | ||
1507 | return -EIO; | ||
1508 | } | ||
1509 | |||
1510 | if (request_irq(pci->irq, snd_es1938_interrupt, | ||
1511 | IRQF_DISABLED|IRQF_SHARED, "ES1938", chip)) { | ||
1512 | printk(KERN_ERR "es1938: unable to grab IRQ %d, " | ||
1513 | "disabling device\n", pci->irq); | ||
1514 | snd_card_disconnect(card); | ||
1515 | return -EIO; | ||
1516 | } | ||
1501 | chip->irq = pci->irq; | 1517 | chip->irq = pci->irq; |
1502 | snd_es1938_chip_init(chip); | 1518 | snd_es1938_chip_init(chip); |
1503 | 1519 | ||
@@ -1556,8 +1572,10 @@ static int snd_es1938_free(struct es1938 *chip) | |||
1556 | 1572 | ||
1557 | snd_es1938_free_gameport(chip); | 1573 | snd_es1938_free_gameport(chip); |
1558 | 1574 | ||
1559 | if (chip->irq >= 0) | 1575 | if (chip->irq >= 0) { |
1576 | synchronize_irq(chip->irq); | ||
1560 | free_irq(chip->irq, chip); | 1577 | free_irq(chip->irq, chip); |
1578 | } | ||
1561 | pci_release_regions(chip->pci); | 1579 | pci_release_regions(chip->pci); |
1562 | pci_disable_device(chip->pci); | 1580 | pci_disable_device(chip->pci); |
1563 | kfree(chip); | 1581 | kfree(chip); |
@@ -1602,6 +1620,7 @@ static int __devinit snd_es1938_create(struct snd_card *card, | |||
1602 | spin_lock_init(&chip->mixer_lock); | 1620 | spin_lock_init(&chip->mixer_lock); |
1603 | chip->card = card; | 1621 | chip->card = card; |
1604 | chip->pci = pci; | 1622 | chip->pci = pci; |
1623 | chip->irq = -1; | ||
1605 | if ((err = pci_request_regions(pci, "ESS Solo-1")) < 0) { | 1624 | if ((err = pci_request_regions(pci, "ESS Solo-1")) < 0) { |
1606 | kfree(chip); | 1625 | kfree(chip); |
1607 | pci_disable_device(pci); | 1626 | pci_disable_device(pci); |
diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c index b9d723c7e1db..092da53e1464 100644 --- a/sound/pci/es1968.c +++ b/sound/pci/es1968.c | |||
@@ -432,46 +432,6 @@ MODULE_PARM_DESC(joystick, "Enable joystick."); | |||
432 | #define ESM_MODE_PLAY 0 | 432 | #define ESM_MODE_PLAY 0 |
433 | #define ESM_MODE_CAPTURE 1 | 433 | #define ESM_MODE_CAPTURE 1 |
434 | 434 | ||
435 | /* acpi states */ | ||
436 | enum { | ||
437 | ACPI_D0=0, | ||
438 | ACPI_D1, | ||
439 | ACPI_D2, | ||
440 | ACPI_D3 | ||
441 | }; | ||
442 | |||
443 | /* bits in the acpi masks */ | ||
444 | #define ACPI_12MHZ ( 1 << 15) | ||
445 | #define ACPI_24MHZ ( 1 << 14) | ||
446 | #define ACPI_978 ( 1 << 13) | ||
447 | #define ACPI_SPDIF ( 1 << 12) | ||
448 | #define ACPI_GLUE ( 1 << 11) | ||
449 | #define ACPI__10 ( 1 << 10) /* reserved */ | ||
450 | #define ACPI_PCIINT ( 1 << 9) | ||
451 | #define ACPI_HV ( 1 << 8) /* hardware volume */ | ||
452 | #define ACPI_GPIO ( 1 << 7) | ||
453 | #define ACPI_ASSP ( 1 << 6) | ||
454 | #define ACPI_SB ( 1 << 5) /* sb emul */ | ||
455 | #define ACPI_FM ( 1 << 4) /* fm emul */ | ||
456 | #define ACPI_RB ( 1 << 3) /* ringbus / aclink */ | ||
457 | #define ACPI_MIDI ( 1 << 2) | ||
458 | #define ACPI_GP ( 1 << 1) /* game port */ | ||
459 | #define ACPI_WP ( 1 << 0) /* wave processor */ | ||
460 | |||
461 | #define ACPI_ALL (0xffff) | ||
462 | #define ACPI_SLEEP (~(ACPI_SPDIF|ACPI_ASSP|ACPI_SB|ACPI_FM| \ | ||
463 | ACPI_MIDI|ACPI_GP|ACPI_WP)) | ||
464 | #define ACPI_NONE (ACPI__10) | ||
465 | |||
466 | /* these masks indicate which units we care about at | ||
467 | which states */ | ||
468 | static u16 acpi_state_mask[] = { | ||
469 | [ACPI_D0] = ACPI_ALL, | ||
470 | [ACPI_D1] = ACPI_SLEEP, | ||
471 | [ACPI_D2] = ACPI_SLEEP, | ||
472 | [ACPI_D3] = ACPI_NONE | ||
473 | }; | ||
474 | |||
475 | 435 | ||
476 | /* APU use in the driver */ | 436 | /* APU use in the driver */ |
477 | enum snd_enum_apu_type { | 437 | enum snd_enum_apu_type { |
@@ -2160,21 +2120,6 @@ static void snd_es1968_reset(struct es1968 *chip) | |||
2160 | } | 2120 | } |
2161 | 2121 | ||
2162 | /* | 2122 | /* |
2163 | * power management | ||
2164 | */ | ||
2165 | static void snd_es1968_set_acpi(struct es1968 *chip, int state) | ||
2166 | { | ||
2167 | u16 active_mask = acpi_state_mask[state]; | ||
2168 | |||
2169 | pci_set_power_state(chip->pci, state); | ||
2170 | /* make sure the units we care about are on | ||
2171 | XXX we might want to do this before state flipping? */ | ||
2172 | pci_write_config_word(chip->pci, 0x54, ~ active_mask); | ||
2173 | pci_write_config_word(chip->pci, 0x56, ~ active_mask); | ||
2174 | } | ||
2175 | |||
2176 | |||
2177 | /* | ||
2178 | * initialize maestro chip | 2123 | * initialize maestro chip |
2179 | */ | 2124 | */ |
2180 | static void snd_es1968_chip_init(struct es1968 *chip) | 2125 | static void snd_es1968_chip_init(struct es1968 *chip) |
@@ -2196,9 +2141,6 @@ static void snd_es1968_chip_init(struct es1968 *chip) | |||
2196 | * IRQs. | 2141 | * IRQs. |
2197 | */ | 2142 | */ |
2198 | 2143 | ||
2199 | /* do config work at full power */ | ||
2200 | snd_es1968_set_acpi(chip, ACPI_D0); | ||
2201 | |||
2202 | /* Config Reg A */ | 2144 | /* Config Reg A */ |
2203 | pci_read_config_word(pci, ESM_CONFIG_A, &w); | 2145 | pci_read_config_word(pci, ESM_CONFIG_A, &w); |
2204 | 2146 | ||
@@ -2397,9 +2339,10 @@ static int es1968_suspend(struct pci_dev *pci, pm_message_t state) | |||
2397 | snd_pcm_suspend_all(chip->pcm); | 2339 | snd_pcm_suspend_all(chip->pcm); |
2398 | snd_ac97_suspend(chip->ac97); | 2340 | snd_ac97_suspend(chip->ac97); |
2399 | snd_es1968_bob_stop(chip); | 2341 | snd_es1968_bob_stop(chip); |
2400 | snd_es1968_set_acpi(chip, ACPI_D3); | 2342 | |
2401 | pci_disable_device(pci); | 2343 | pci_disable_device(pci); |
2402 | pci_save_state(pci); | 2344 | pci_save_state(pci); |
2345 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
2403 | return 0; | 2346 | return 0; |
2404 | } | 2347 | } |
2405 | 2348 | ||
@@ -2413,9 +2356,16 @@ static int es1968_resume(struct pci_dev *pci) | |||
2413 | return 0; | 2356 | return 0; |
2414 | 2357 | ||
2415 | /* restore all our config */ | 2358 | /* restore all our config */ |
2359 | pci_set_power_state(pci, PCI_D0); | ||
2416 | pci_restore_state(pci); | 2360 | pci_restore_state(pci); |
2417 | pci_enable_device(pci); | 2361 | if (pci_enable_device(pci) < 0) { |
2362 | printk(KERN_ERR "es1968: pci_enable_device failed, " | ||
2363 | "disabling device\n"); | ||
2364 | snd_card_disconnect(card); | ||
2365 | return -EIO; | ||
2366 | } | ||
2418 | pci_set_master(pci); | 2367 | pci_set_master(pci); |
2368 | |||
2419 | snd_es1968_chip_init(chip); | 2369 | snd_es1968_chip_init(chip); |
2420 | 2370 | ||
2421 | /* need to restore the base pointers.. */ | 2371 | /* need to restore the base pointers.. */ |
@@ -2514,7 +2464,6 @@ static int snd_es1968_free(struct es1968 *chip) | |||
2514 | if (chip->irq >= 0) | 2464 | if (chip->irq >= 0) |
2515 | free_irq(chip->irq, (void *)chip); | 2465 | free_irq(chip->irq, (void *)chip); |
2516 | snd_es1968_free_gameport(chip); | 2466 | snd_es1968_free_gameport(chip); |
2517 | snd_es1968_set_acpi(chip, ACPI_D3); | ||
2518 | chip->master_switch = NULL; | 2467 | chip->master_switch = NULL; |
2519 | chip->master_volume = NULL; | 2468 | chip->master_volume = NULL; |
2520 | pci_release_regions(chip->pci); | 2469 | pci_release_regions(chip->pci); |
diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c index 3ec7d7ee04dd..77e3d5c18302 100644 --- a/sound/pci/fm801.c +++ b/sound/pci/fm801.c | |||
@@ -1531,9 +1531,9 @@ static int snd_fm801_suspend(struct pci_dev *pci, pm_message_t state) | |||
1531 | chip->saved_regs[i] = inw(chip->port + saved_regs[i]); | 1531 | chip->saved_regs[i] = inw(chip->port + saved_regs[i]); |
1532 | /* FIXME: tea575x suspend */ | 1532 | /* FIXME: tea575x suspend */ |
1533 | 1533 | ||
1534 | pci_set_power_state(pci, PCI_D3hot); | ||
1535 | pci_disable_device(pci); | 1534 | pci_disable_device(pci); |
1536 | pci_save_state(pci); | 1535 | pci_save_state(pci); |
1536 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
1537 | return 0; | 1537 | return 0; |
1538 | } | 1538 | } |
1539 | 1539 | ||
@@ -1543,9 +1543,14 @@ static int snd_fm801_resume(struct pci_dev *pci) | |||
1543 | struct fm801 *chip = card->private_data; | 1543 | struct fm801 *chip = card->private_data; |
1544 | int i; | 1544 | int i; |
1545 | 1545 | ||
1546 | pci_restore_state(pci); | ||
1547 | pci_enable_device(pci); | ||
1548 | pci_set_power_state(pci, PCI_D0); | 1546 | pci_set_power_state(pci, PCI_D0); |
1547 | pci_restore_state(pci); | ||
1548 | if (pci_enable_device(pci) < 0) { | ||
1549 | printk(KERN_ERR "fm801: pci_enable_device failed, " | ||
1550 | "disabling device\n"); | ||
1551 | snd_card_disconnect(card); | ||
1552 | return -EIO; | ||
1553 | } | ||
1549 | pci_set_master(pci); | 1554 | pci_set_master(pci); |
1550 | 1555 | ||
1551 | snd_fm801_chip_init(chip, 1); | 1556 | snd_fm801_chip_init(chip, 1); |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index feeed12920b4..e35cfd326df2 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -55,7 +55,7 @@ static char *model; | |||
55 | static int position_fix; | 55 | static int position_fix; |
56 | static int probe_mask = -1; | 56 | static int probe_mask = -1; |
57 | static int single_cmd; | 57 | static int single_cmd; |
58 | static int disable_msi; | 58 | static int enable_msi; |
59 | 59 | ||
60 | module_param(index, int, 0444); | 60 | module_param(index, int, 0444); |
61 | MODULE_PARM_DESC(index, "Index value for Intel HD audio interface."); | 61 | MODULE_PARM_DESC(index, "Index value for Intel HD audio interface."); |
@@ -69,8 +69,8 @@ module_param(probe_mask, int, 0444); | |||
69 | MODULE_PARM_DESC(probe_mask, "Bitmask to probe codecs (default = -1)."); | 69 | MODULE_PARM_DESC(probe_mask, "Bitmask to probe codecs (default = -1)."); |
70 | module_param(single_cmd, bool, 0444); | 70 | module_param(single_cmd, bool, 0444); |
71 | MODULE_PARM_DESC(single_cmd, "Use single command to communicate with codecs (for debugging only)."); | 71 | MODULE_PARM_DESC(single_cmd, "Use single command to communicate with codecs (for debugging only)."); |
72 | module_param(disable_msi, int, 0); | 72 | module_param(enable_msi, int, 0); |
73 | MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)"); | 73 | MODULE_PARM_DESC(enable_msi, "Enable Message Signaled Interrupt (MSI)"); |
74 | 74 | ||
75 | 75 | ||
76 | /* just for backward compatibility */ | 76 | /* just for backward compatibility */ |
@@ -86,6 +86,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6}," | |||
86 | "{ATI, SB450}," | 86 | "{ATI, SB450}," |
87 | "{ATI, SB600}," | 87 | "{ATI, SB600}," |
88 | "{ATI, RS600}," | 88 | "{ATI, RS600}," |
89 | "{ATI, RS690}," | ||
89 | "{VIA, VT8251}," | 90 | "{VIA, VT8251}," |
90 | "{VIA, VT8237A}," | 91 | "{VIA, VT8237A}," |
91 | "{SiS, SIS966}," | 92 | "{SiS, SIS966}," |
@@ -336,6 +337,7 @@ struct azx { | |||
336 | unsigned int initialized :1; | 337 | unsigned int initialized :1; |
337 | unsigned int single_cmd :1; | 338 | unsigned int single_cmd :1; |
338 | unsigned int polling_mode :1; | 339 | unsigned int polling_mode :1; |
340 | unsigned int msi :1; | ||
339 | }; | 341 | }; |
340 | 342 | ||
341 | /* driver types */ | 343 | /* driver types */ |
@@ -396,6 +398,7 @@ static char *driver_short_names[] __devinitdata = { | |||
396 | */ | 398 | */ |
397 | #define upper_32bit(addr) (sizeof(addr) > 4 ? (u32)((addr) >> 32) : (u32)0) | 399 | #define upper_32bit(addr) (sizeof(addr) > 4 ? (u32)((addr) >> 32) : (u32)0) |
398 | 400 | ||
401 | static int azx_acquire_irq(struct azx *chip, int do_disconnect); | ||
399 | 402 | ||
400 | /* | 403 | /* |
401 | * Interface for HD codec | 404 | * Interface for HD codec |
@@ -535,6 +538,18 @@ static unsigned int azx_rirb_get_response(struct hda_codec *codec) | |||
535 | schedule_timeout_interruptible(1); | 538 | schedule_timeout_interruptible(1); |
536 | } while (time_after_eq(timeout, jiffies)); | 539 | } while (time_after_eq(timeout, jiffies)); |
537 | 540 | ||
541 | if (chip->msi) { | ||
542 | snd_printk(KERN_WARNING "hda_intel: No response from codec, " | ||
543 | "disabling MSI...\n"); | ||
544 | free_irq(chip->irq, chip); | ||
545 | chip->irq = -1; | ||
546 | pci_disable_msi(chip->pci); | ||
547 | chip->msi = 0; | ||
548 | if (azx_acquire_irq(chip, 1) < 0) | ||
549 | return -1; | ||
550 | goto again; | ||
551 | } | ||
552 | |||
538 | if (!chip->polling_mode) { | 553 | if (!chip->polling_mode) { |
539 | snd_printk(KERN_WARNING "hda_intel: azx_get_response timeout, " | 554 | snd_printk(KERN_WARNING "hda_intel: azx_get_response timeout, " |
540 | "switching to polling mode...\n"); | 555 | "switching to polling mode...\n"); |
@@ -1363,6 +1378,20 @@ static int __devinit azx_init_stream(struct azx *chip) | |||
1363 | return 0; | 1378 | return 0; |
1364 | } | 1379 | } |
1365 | 1380 | ||
1381 | static int azx_acquire_irq(struct azx *chip, int do_disconnect) | ||
1382 | { | ||
1383 | if (request_irq(chip->pci->irq, azx_interrupt, IRQF_DISABLED|IRQF_SHARED, | ||
1384 | "HDA Intel", chip)) { | ||
1385 | printk(KERN_ERR "hda-intel: unable to grab IRQ %d, " | ||
1386 | "disabling device\n", chip->pci->irq); | ||
1387 | if (do_disconnect) | ||
1388 | snd_card_disconnect(chip->card); | ||
1389 | return -1; | ||
1390 | } | ||
1391 | chip->irq = chip->pci->irq; | ||
1392 | return 0; | ||
1393 | } | ||
1394 | |||
1366 | 1395 | ||
1367 | #ifdef CONFIG_PM | 1396 | #ifdef CONFIG_PM |
1368 | /* | 1397 | /* |
@@ -1379,12 +1408,16 @@ static int azx_suspend(struct pci_dev *pci, pm_message_t state) | |||
1379 | snd_pcm_suspend_all(chip->pcm[i]); | 1408 | snd_pcm_suspend_all(chip->pcm[i]); |
1380 | snd_hda_suspend(chip->bus, state); | 1409 | snd_hda_suspend(chip->bus, state); |
1381 | azx_free_cmd_io(chip); | 1410 | azx_free_cmd_io(chip); |
1382 | if (chip->irq >= 0) | 1411 | if (chip->irq >= 0) { |
1412 | synchronize_irq(chip->irq); | ||
1383 | free_irq(chip->irq, chip); | 1413 | free_irq(chip->irq, chip); |
1384 | if (!disable_msi) | 1414 | chip->irq = -1; |
1415 | } | ||
1416 | if (chip->msi) | ||
1385 | pci_disable_msi(chip->pci); | 1417 | pci_disable_msi(chip->pci); |
1386 | pci_disable_device(pci); | 1418 | pci_disable_device(pci); |
1387 | pci_save_state(pci); | 1419 | pci_save_state(pci); |
1420 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
1388 | return 0; | 1421 | return 0; |
1389 | } | 1422 | } |
1390 | 1423 | ||
@@ -1393,15 +1426,20 @@ static int azx_resume(struct pci_dev *pci) | |||
1393 | struct snd_card *card = pci_get_drvdata(pci); | 1426 | struct snd_card *card = pci_get_drvdata(pci); |
1394 | struct azx *chip = card->private_data; | 1427 | struct azx *chip = card->private_data; |
1395 | 1428 | ||
1429 | pci_set_power_state(pci, PCI_D0); | ||
1396 | pci_restore_state(pci); | 1430 | pci_restore_state(pci); |
1397 | pci_enable_device(pci); | 1431 | if (pci_enable_device(pci) < 0) { |
1398 | if (!disable_msi) | 1432 | printk(KERN_ERR "hda-intel: pci_enable_device failed, " |
1399 | pci_enable_msi(pci); | 1433 | "disabling device\n"); |
1400 | /* FIXME: need proper error handling */ | 1434 | snd_card_disconnect(card); |
1401 | request_irq(pci->irq, azx_interrupt, IRQF_DISABLED|IRQF_SHARED, | 1435 | return -EIO; |
1402 | "HDA Intel", chip); | 1436 | } |
1403 | chip->irq = pci->irq; | ||
1404 | pci_set_master(pci); | 1437 | pci_set_master(pci); |
1438 | if (chip->msi) | ||
1439 | if (pci_enable_msi(pci) < 0) | ||
1440 | chip->msi = 0; | ||
1441 | if (azx_acquire_irq(chip, 1) < 0) | ||
1442 | return -EIO; | ||
1405 | azx_init_chip(chip); | 1443 | azx_init_chip(chip); |
1406 | snd_hda_resume(chip->bus); | 1444 | snd_hda_resume(chip->bus); |
1407 | snd_power_change_state(card, SNDRV_CTL_POWER_D0); | 1445 | snd_power_change_state(card, SNDRV_CTL_POWER_D0); |
@@ -1431,15 +1469,14 @@ static int azx_free(struct azx *chip) | |||
1431 | /* disable position buffer */ | 1469 | /* disable position buffer */ |
1432 | azx_writel(chip, DPLBASE, 0); | 1470 | azx_writel(chip, DPLBASE, 0); |
1433 | azx_writel(chip, DPUBASE, 0); | 1471 | azx_writel(chip, DPUBASE, 0); |
1434 | |||
1435 | synchronize_irq(chip->irq); | ||
1436 | } | 1472 | } |
1437 | 1473 | ||
1438 | if (chip->irq >= 0) { | 1474 | if (chip->irq >= 0) { |
1475 | synchronize_irq(chip->irq); | ||
1439 | free_irq(chip->irq, (void*)chip); | 1476 | free_irq(chip->irq, (void*)chip); |
1440 | if (!disable_msi) | ||
1441 | pci_disable_msi(chip->pci); | ||
1442 | } | 1477 | } |
1478 | if (chip->msi) | ||
1479 | pci_disable_msi(chip->pci); | ||
1443 | if (chip->remap_addr) | 1480 | if (chip->remap_addr) |
1444 | iounmap(chip->remap_addr); | 1481 | iounmap(chip->remap_addr); |
1445 | 1482 | ||
@@ -1494,6 +1531,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
1494 | chip->pci = pci; | 1531 | chip->pci = pci; |
1495 | chip->irq = -1; | 1532 | chip->irq = -1; |
1496 | chip->driver_type = driver_type; | 1533 | chip->driver_type = driver_type; |
1534 | chip->msi = enable_msi; | ||
1497 | 1535 | ||
1498 | chip->position_fix = position_fix; | 1536 | chip->position_fix = position_fix; |
1499 | chip->single_cmd = single_cmd; | 1537 | chip->single_cmd = single_cmd; |
@@ -1523,16 +1561,14 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
1523 | goto errout; | 1561 | goto errout; |
1524 | } | 1562 | } |
1525 | 1563 | ||
1526 | if (!disable_msi) | 1564 | if (chip->msi) |
1527 | pci_enable_msi(pci); | 1565 | if (pci_enable_msi(pci) < 0) |
1566 | chip->msi = 0; | ||
1528 | 1567 | ||
1529 | if (request_irq(pci->irq, azx_interrupt, IRQF_DISABLED|IRQF_SHARED, | 1568 | if (azx_acquire_irq(chip, 0) < 0) { |
1530 | "HDA Intel", (void*)chip)) { | ||
1531 | snd_printk(KERN_ERR SFX "unable to grab IRQ %d\n", pci->irq); | ||
1532 | err = -EBUSY; | 1569 | err = -EBUSY; |
1533 | goto errout; | 1570 | goto errout; |
1534 | } | 1571 | } |
1535 | chip->irq = pci->irq; | ||
1536 | 1572 | ||
1537 | pci_set_master(pci); | 1573 | pci_set_master(pci); |
1538 | synchronize_irq(chip->irq); | 1574 | synchronize_irq(chip->irq); |
@@ -1677,6 +1713,7 @@ static struct pci_device_id azx_ids[] = { | |||
1677 | { 0x1002, 0x437b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATI }, /* ATI SB450 */ | 1713 | { 0x1002, 0x437b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATI }, /* ATI SB450 */ |
1678 | { 0x1002, 0x4383, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATI }, /* ATI SB600 */ | 1714 | { 0x1002, 0x4383, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATI }, /* ATI SB600 */ |
1679 | { 0x1002, 0x793b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATIHDMI }, /* ATI RS600 HDMI */ | 1715 | { 0x1002, 0x793b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATIHDMI }, /* ATI RS600 HDMI */ |
1716 | { 0x1002, 0x7919, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATIHDMI }, /* ATI RS690 HDMI */ | ||
1680 | { 0x1106, 0x3288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_VIA }, /* VIA VT8251/VT8237A */ | 1717 | { 0x1106, 0x3288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_VIA }, /* VIA VT8251/VT8237A */ |
1681 | { 0x1039, 0x7502, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_SIS }, /* SIS966 */ | 1718 | { 0x1039, 0x7502, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_SIS }, /* SIS966 */ |
1682 | { 0x10b9, 0x5461, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ULI }, /* ULI M5461 */ | 1719 | { 0x10b9, 0x5461, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ULI }, /* ULI M5461 */ |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 511df07fa2a3..edd22dec8286 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
@@ -818,6 +818,8 @@ static struct hda_board_config ad1986a_cfg_tbl[] = { | |||
818 | .config = AD1986A_LAPTOP_EAPD }, /* ASUS A6J */ | 818 | .config = AD1986A_LAPTOP_EAPD }, /* ASUS A6J */ |
819 | { .pci_subvendor = 0x1043, .pci_subdevice = 0x11f7, | 819 | { .pci_subvendor = 0x1043, .pci_subdevice = 0x11f7, |
820 | .config = AD1986A_LAPTOP_EAPD }, /* ASUS U5A */ | 820 | .config = AD1986A_LAPTOP_EAPD }, /* ASUS U5A */ |
821 | { .pci_subvendor = 0x1043, .pci_subdevice = 0x1263, | ||
822 | .config = AD1986A_LAPTOP_EAPD }, /* ASUS U5F */ | ||
821 | { .pci_subvendor = 0x1043, .pci_subdevice = 0x1297, | 823 | { .pci_subvendor = 0x1043, .pci_subdevice = 0x1297, |
822 | .config = AD1986A_LAPTOP_EAPD }, /* ASUS Z62F */ | 824 | .config = AD1986A_LAPTOP_EAPD }, /* ASUS Z62F */ |
823 | { .pci_subvendor = 0x103c, .pci_subdevice = 0x30af, | 825 | { .pci_subvendor = 0x103c, .pci_subdevice = 0x30af, |
diff --git a/sound/pci/hda/patch_atihdmi.c b/sound/pci/hda/patch_atihdmi.c index a27440ffd1c8..7333f275decd 100644 --- a/sound/pci/hda/patch_atihdmi.c +++ b/sound/pci/hda/patch_atihdmi.c | |||
@@ -161,5 +161,6 @@ static int patch_atihdmi(struct hda_codec *codec) | |||
161 | */ | 161 | */ |
162 | struct hda_codec_preset snd_hda_preset_atihdmi[] = { | 162 | struct hda_codec_preset snd_hda_preset_atihdmi[] = { |
163 | { .id = 0x1002793c, .name = "ATI RS600 HDMI", .patch = patch_atihdmi }, | 163 | { .id = 0x1002793c, .name = "ATI RS600 HDMI", .patch = patch_atihdmi }, |
164 | { .id = 0x1002791a, .name = "ATI RS690 HDMI", .patch = patch_atihdmi }, | ||
164 | {} /* terminator */ | 165 | {} /* terminator */ |
165 | }; | 166 | }; |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 84a3eb8aacc2..fb961448db19 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -1799,7 +1799,7 @@ static int alc_build_pcms(struct hda_codec *codec) | |||
1799 | /* SPDIF for stream index #1 */ | 1799 | /* SPDIF for stream index #1 */ |
1800 | if (spec->multiout.dig_out_nid || spec->dig_in_nid) { | 1800 | if (spec->multiout.dig_out_nid || spec->dig_in_nid) { |
1801 | codec->num_pcms = 2; | 1801 | codec->num_pcms = 2; |
1802 | info++; | 1802 | info = spec->pcm_rec + 1; |
1803 | info->name = spec->stream_name_digital; | 1803 | info->name = spec->stream_name_digital; |
1804 | if (spec->multiout.dig_out_nid && | 1804 | if (spec->multiout.dig_out_nid && |
1805 | spec->stream_digital_playback) { | 1805 | spec->stream_digital_playback) { |
@@ -1820,7 +1820,7 @@ static int alc_build_pcms(struct hda_codec *codec) | |||
1820 | if (spec->num_adc_nids > 1 && spec->stream_analog_capture && | 1820 | if (spec->num_adc_nids > 1 && spec->stream_analog_capture && |
1821 | spec->adc_nids) { | 1821 | spec->adc_nids) { |
1822 | codec->num_pcms = 3; | 1822 | codec->num_pcms = 3; |
1823 | info++; | 1823 | info = spec->pcm_rec + 2; |
1824 | info->name = spec->stream_name_analog; | 1824 | info->name = spec->stream_name_analog; |
1825 | /* No playback stream for second PCM */ | 1825 | /* No playback stream for second PCM */ |
1826 | info->stream[SNDRV_PCM_STREAM_PLAYBACK] = alc_pcm_null_playback; | 1826 | info->stream[SNDRV_PCM_STREAM_PLAYBACK] = alc_pcm_null_playback; |
@@ -5870,7 +5870,7 @@ static struct hda_board_config alc262_cfg_tbl[] = { | |||
5870 | { .pci_subvendor = 0x10cf, .pci_subdevice = 0x1397, | 5870 | { .pci_subvendor = 0x10cf, .pci_subdevice = 0x1397, |
5871 | .config = ALC262_FUJITSU }, | 5871 | .config = ALC262_FUJITSU }, |
5872 | { .modelname = "hp-bpc", .config = ALC262_HP_BPC }, | 5872 | { .modelname = "hp-bpc", .config = ALC262_HP_BPC }, |
5873 | { .pci_subvendor = 0x103c, .pci_subdevice = 0x208c, | 5873 | { .pci_subvendor = 0x103c, .pci_subdevice = 0x280c, |
5874 | .config = ALC262_HP_BPC }, /* xw4400 */ | 5874 | .config = ALC262_HP_BPC }, /* xw4400 */ |
5875 | { .pci_subvendor = 0x103c, .pci_subdevice = 0x3014, | 5875 | { .pci_subvendor = 0x103c, .pci_subdevice = 0x3014, |
5876 | .config = ALC262_HP_BPC }, /* xw6400 */ | 5876 | .config = ALC262_HP_BPC }, /* xw6400 */ |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 731b7b97ee71..fe51ef3e49d2 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -336,6 +336,13 @@ static struct hda_board_config stac9200_cfg_tbl[] = { | |||
336 | .pci_subvendor = PCI_VENDOR_ID_INTEL, | 336 | .pci_subvendor = PCI_VENDOR_ID_INTEL, |
337 | .pci_subdevice = 0x2668, /* DFI LanParty */ | 337 | .pci_subdevice = 0x2668, /* DFI LanParty */ |
338 | .config = STAC_REF }, | 338 | .config = STAC_REF }, |
339 | /* Dell laptops have BIOS problem */ | ||
340 | { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01b5, | ||
341 | .config = STAC_REF }, /* Dell Inspiron 630m */ | ||
342 | { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01c2, | ||
343 | .config = STAC_REF }, /* Dell Latitude D620 */ | ||
344 | { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01cb, | ||
345 | .config = STAC_REF }, /* Dell Latitude 120L */ | ||
339 | {} /* terminator */ | 346 | {} /* terminator */ |
340 | }; | 347 | }; |
341 | 348 | ||
@@ -591,13 +598,6 @@ static struct hda_board_config stac9205_cfg_tbl[] = { | |||
591 | .pci_subvendor = PCI_VENDOR_ID_INTEL, | 598 | .pci_subvendor = PCI_VENDOR_ID_INTEL, |
592 | .pci_subdevice = 0x2668, /* DFI LanParty */ | 599 | .pci_subdevice = 0x2668, /* DFI LanParty */ |
593 | .config = STAC_REF }, /* SigmaTel reference board */ | 600 | .config = STAC_REF }, /* SigmaTel reference board */ |
594 | /* Dell laptops have BIOS problem */ | ||
595 | { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01b5, | ||
596 | .config = STAC_REF }, /* Dell Inspiron 630m */ | ||
597 | { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01c2, | ||
598 | .config = STAC_REF }, /* Dell Latitude D620 */ | ||
599 | { .pci_subvendor = PCI_VENDOR_ID_DELL, .pci_subdevice = 0x01cb, | ||
600 | .config = STAC_REF }, /* Dell Latitude 120L */ | ||
601 | {} /* terminator */ | 601 | {} /* terminator */ |
602 | }; | 602 | }; |
603 | 603 | ||
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index f4319b8d4644..9c1bce7afa86 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c | |||
@@ -1962,6 +1962,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { | |||
1962 | .type = AC97_TUNE_HP_ONLY | 1962 | .type = AC97_TUNE_HP_ONLY |
1963 | }, | 1963 | }, |
1964 | { | 1964 | { |
1965 | .subvendor = 0x10f7, | ||
1966 | .subdevice = 0x834c, | ||
1967 | .name = "Panasonic CF-R4", | ||
1968 | .type = AC97_TUNE_HP_ONLY, | ||
1969 | }, | ||
1970 | { | ||
1965 | .subvendor = 0x110a, | 1971 | .subvendor = 0x110a, |
1966 | .subdevice = 0x0056, | 1972 | .subdevice = 0x0056, |
1967 | .name = "Fujitsu-Siemens Scenic", /* AD1981? */ | 1973 | .name = "Fujitsu-Siemens Scenic", /* AD1981? */ |
@@ -2476,10 +2482,14 @@ static int intel8x0_suspend(struct pci_dev *pci, pm_message_t state) | |||
2476 | if (chip->device_type == DEVICE_INTEL_ICH4) | 2482 | if (chip->device_type == DEVICE_INTEL_ICH4) |
2477 | chip->sdm_saved = igetbyte(chip, ICHREG(SDM)); | 2483 | chip->sdm_saved = igetbyte(chip, ICHREG(SDM)); |
2478 | 2484 | ||
2479 | if (chip->irq >= 0) | 2485 | if (chip->irq >= 0) { |
2486 | synchronize_irq(chip->irq); | ||
2480 | free_irq(chip->irq, chip); | 2487 | free_irq(chip->irq, chip); |
2488 | chip->irq = -1; | ||
2489 | } | ||
2481 | pci_disable_device(pci); | 2490 | pci_disable_device(pci); |
2482 | pci_save_state(pci); | 2491 | pci_save_state(pci); |
2492 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
2483 | return 0; | 2493 | return 0; |
2484 | } | 2494 | } |
2485 | 2495 | ||
@@ -2489,11 +2499,22 @@ static int intel8x0_resume(struct pci_dev *pci) | |||
2489 | struct intel8x0 *chip = card->private_data; | 2499 | struct intel8x0 *chip = card->private_data; |
2490 | int i; | 2500 | int i; |
2491 | 2501 | ||
2502 | pci_set_power_state(pci, PCI_D0); | ||
2492 | pci_restore_state(pci); | 2503 | pci_restore_state(pci); |
2493 | pci_enable_device(pci); | 2504 | if (pci_enable_device(pci) < 0) { |
2505 | printk(KERN_ERR "intel8x0: pci_enable_device failed, " | ||
2506 | "disabling device\n"); | ||
2507 | snd_card_disconnect(card); | ||
2508 | return -EIO; | ||
2509 | } | ||
2494 | pci_set_master(pci); | 2510 | pci_set_master(pci); |
2495 | request_irq(pci->irq, snd_intel8x0_interrupt, IRQF_DISABLED|IRQF_SHARED, | 2511 | if (request_irq(pci->irq, snd_intel8x0_interrupt, |
2496 | card->shortname, chip); | 2512 | IRQF_DISABLED|IRQF_SHARED, card->shortname, chip)) { |
2513 | printk(KERN_ERR "intel8x0: unable to grab IRQ %d, " | ||
2514 | "disabling device\n", pci->irq); | ||
2515 | snd_card_disconnect(card); | ||
2516 | return -EIO; | ||
2517 | } | ||
2497 | chip->irq = pci->irq; | 2518 | chip->irq = pci->irq; |
2498 | synchronize_irq(chip->irq); | 2519 | synchronize_irq(chip->irq); |
2499 | snd_intel8x0_chip_init(chip, 0); | 2520 | snd_intel8x0_chip_init(chip, 0); |
diff --git a/sound/pci/intel8x0m.c b/sound/pci/intel8x0m.c index 6703f5cb5569..bd467c501123 100644 --- a/sound/pci/intel8x0m.c +++ b/sound/pci/intel8x0m.c | |||
@@ -1045,10 +1045,14 @@ static int intel8x0m_suspend(struct pci_dev *pci, pm_message_t state) | |||
1045 | for (i = 0; i < chip->pcm_devs; i++) | 1045 | for (i = 0; i < chip->pcm_devs; i++) |
1046 | snd_pcm_suspend_all(chip->pcm[i]); | 1046 | snd_pcm_suspend_all(chip->pcm[i]); |
1047 | snd_ac97_suspend(chip->ac97); | 1047 | snd_ac97_suspend(chip->ac97); |
1048 | if (chip->irq >= 0) | 1048 | if (chip->irq >= 0) { |
1049 | synchronize_irq(chip->irq); | ||
1049 | free_irq(chip->irq, chip); | 1050 | free_irq(chip->irq, chip); |
1051 | chip->irq = -1; | ||
1052 | } | ||
1050 | pci_disable_device(pci); | 1053 | pci_disable_device(pci); |
1051 | pci_save_state(pci); | 1054 | pci_save_state(pci); |
1055 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
1052 | return 0; | 1056 | return 0; |
1053 | } | 1057 | } |
1054 | 1058 | ||
@@ -1057,11 +1061,22 @@ static int intel8x0m_resume(struct pci_dev *pci) | |||
1057 | struct snd_card *card = pci_get_drvdata(pci); | 1061 | struct snd_card *card = pci_get_drvdata(pci); |
1058 | struct intel8x0m *chip = card->private_data; | 1062 | struct intel8x0m *chip = card->private_data; |
1059 | 1063 | ||
1064 | pci_set_power_state(pci, PCI_D0); | ||
1060 | pci_restore_state(pci); | 1065 | pci_restore_state(pci); |
1061 | pci_enable_device(pci); | 1066 | if (pci_enable_device(pci) < 0) { |
1067 | printk(KERN_ERR "intel8x0m: pci_enable_device failed, " | ||
1068 | "disabling device\n"); | ||
1069 | snd_card_disconnect(card); | ||
1070 | return -EIO; | ||
1071 | } | ||
1062 | pci_set_master(pci); | 1072 | pci_set_master(pci); |
1063 | request_irq(pci->irq, snd_intel8x0_interrupt, IRQF_DISABLED|IRQF_SHARED, | 1073 | if (request_irq(pci->irq, snd_intel8x0_interrupt, |
1064 | card->shortname, chip); | 1074 | IRQF_DISABLED|IRQF_SHARED, card->shortname, chip)) { |
1075 | printk(KERN_ERR "intel8x0m: unable to grab IRQ %d, " | ||
1076 | "disabling device\n", pci->irq); | ||
1077 | snd_card_disconnect(card); | ||
1078 | return -EIO; | ||
1079 | } | ||
1065 | chip->irq = pci->irq; | 1080 | chip->irq = pci->irq; |
1066 | snd_intel8x0_chip_init(chip, 0); | 1081 | snd_intel8x0_chip_init(chip, 0); |
1067 | snd_ac97_resume(chip->ac97); | 1082 | snd_ac97_resume(chip->ac97); |
diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c index 05605f474a72..8cab342bbaaf 100644 --- a/sound/pci/maestro3.c +++ b/sound/pci/maestro3.c | |||
@@ -2589,12 +2589,9 @@ static int m3_suspend(struct pci_dev *pci, pm_message_t state) | |||
2589 | chip->suspend_mem[index++] = | 2589 | chip->suspend_mem[index++] = |
2590 | snd_m3_assp_read(chip, MEMTYPE_INTERNAL_DATA, i); | 2590 | snd_m3_assp_read(chip, MEMTYPE_INTERNAL_DATA, i); |
2591 | 2591 | ||
2592 | /* power down apci registers */ | ||
2593 | snd_m3_outw(chip, 0xffff, 0x54); | ||
2594 | snd_m3_outw(chip, 0xffff, 0x56); | ||
2595 | |||
2596 | pci_disable_device(pci); | 2592 | pci_disable_device(pci); |
2597 | pci_save_state(pci); | 2593 | pci_save_state(pci); |
2594 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
2598 | return 0; | 2595 | return 0; |
2599 | } | 2596 | } |
2600 | 2597 | ||
@@ -2607,8 +2604,14 @@ static int m3_resume(struct pci_dev *pci) | |||
2607 | if (chip->suspend_mem == NULL) | 2604 | if (chip->suspend_mem == NULL) |
2608 | return 0; | 2605 | return 0; |
2609 | 2606 | ||
2607 | pci_set_power_state(pci, PCI_D0); | ||
2610 | pci_restore_state(pci); | 2608 | pci_restore_state(pci); |
2611 | pci_enable_device(pci); | 2609 | if (pci_enable_device(pci) < 0) { |
2610 | printk(KERN_ERR "maestor3: pci_enable_device failed, " | ||
2611 | "disabling device\n"); | ||
2612 | snd_card_disconnect(card); | ||
2613 | return -EIO; | ||
2614 | } | ||
2612 | pci_set_master(pci); | 2615 | pci_set_master(pci); |
2613 | 2616 | ||
2614 | /* first lets just bring everything back. .*/ | 2617 | /* first lets just bring everything back. .*/ |
diff --git a/sound/pci/nm256/nm256.c b/sound/pci/nm256/nm256.c index b1bbdb9e3b7b..945d21bf187e 100644 --- a/sound/pci/nm256/nm256.c +++ b/sound/pci/nm256/nm256.c | |||
@@ -1390,6 +1390,7 @@ static int nm256_suspend(struct pci_dev *pci, pm_message_t state) | |||
1390 | chip->coeffs_current = 0; | 1390 | chip->coeffs_current = 0; |
1391 | pci_disable_device(pci); | 1391 | pci_disable_device(pci); |
1392 | pci_save_state(pci); | 1392 | pci_save_state(pci); |
1393 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
1393 | return 0; | 1394 | return 0; |
1394 | } | 1395 | } |
1395 | 1396 | ||
@@ -1401,8 +1402,17 @@ static int nm256_resume(struct pci_dev *pci) | |||
1401 | 1402 | ||
1402 | /* Perform a full reset on the hardware */ | 1403 | /* Perform a full reset on the hardware */ |
1403 | chip->in_resume = 1; | 1404 | chip->in_resume = 1; |
1405 | |||
1406 | pci_set_power_state(pci, PCI_D0); | ||
1404 | pci_restore_state(pci); | 1407 | pci_restore_state(pci); |
1405 | pci_enable_device(pci); | 1408 | if (pci_enable_device(pci) < 0) { |
1409 | printk(KERN_ERR "nm256: pci_enable_device failed, " | ||
1410 | "disabling device\n"); | ||
1411 | snd_card_disconnect(card); | ||
1412 | return -EIO; | ||
1413 | } | ||
1414 | pci_set_master(pci); | ||
1415 | |||
1406 | snd_nm256_init_chip(chip); | 1416 | snd_nm256_init_chip(chip); |
1407 | 1417 | ||
1408 | /* restore ac97 */ | 1418 | /* restore ac97 */ |
diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c index ec4899147e1d..56e0c01123e7 100644 --- a/sound/pci/riptide/riptide.c +++ b/sound/pci/riptide/riptide.c | |||
@@ -1178,9 +1178,9 @@ static int riptide_suspend(struct pci_dev *pci, pm_message_t state) | |||
1178 | snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); | 1178 | snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); |
1179 | snd_pcm_suspend_all(chip->pcm); | 1179 | snd_pcm_suspend_all(chip->pcm); |
1180 | snd_ac97_suspend(chip->ac97); | 1180 | snd_ac97_suspend(chip->ac97); |
1181 | pci_set_power_state(pci, PCI_D3hot); | ||
1182 | pci_disable_device(pci); | 1181 | pci_disable_device(pci); |
1183 | pci_save_state(pci); | 1182 | pci_save_state(pci); |
1183 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
1184 | return 0; | 1184 | return 0; |
1185 | } | 1185 | } |
1186 | 1186 | ||
@@ -1189,9 +1189,14 @@ static int riptide_resume(struct pci_dev *pci) | |||
1189 | struct snd_card *card = pci_get_drvdata(pci); | 1189 | struct snd_card *card = pci_get_drvdata(pci); |
1190 | struct snd_riptide *chip = card->private_data; | 1190 | struct snd_riptide *chip = card->private_data; |
1191 | 1191 | ||
1192 | pci_restore_state(pci); | ||
1193 | pci_enable_device(pci); | ||
1194 | pci_set_power_state(pci, PCI_D0); | 1192 | pci_set_power_state(pci, PCI_D0); |
1193 | pci_restore_state(pci); | ||
1194 | if (pci_enable_device(pci) < 0) { | ||
1195 | printk(KERN_ERR "riptide: pci_enable_device failed, " | ||
1196 | "disabling device\n"); | ||
1197 | snd_card_disconnect(card); | ||
1198 | return -EIO; | ||
1199 | } | ||
1195 | pci_set_master(pci); | 1200 | pci_set_master(pci); |
1196 | snd_riptide_initialize(chip); | 1201 | snd_riptide_initialize(chip); |
1197 | snd_ac97_resume(chip->ac97); | 1202 | snd_ac97_resume(chip->ac97); |
diff --git a/sound/pci/trident/trident_main.c b/sound/pci/trident/trident_main.c index 0d478871808d..1fbc4321122f 100644 --- a/sound/pci/trident/trident_main.c +++ b/sound/pci/trident/trident_main.c | |||
@@ -3966,15 +3966,9 @@ int snd_trident_suspend(struct pci_dev *pci, pm_message_t state) | |||
3966 | snd_ac97_suspend(trident->ac97); | 3966 | snd_ac97_suspend(trident->ac97); |
3967 | snd_ac97_suspend(trident->ac97_sec); | 3967 | snd_ac97_suspend(trident->ac97_sec); |
3968 | 3968 | ||
3969 | switch (trident->device) { | ||
3970 | case TRIDENT_DEVICE_ID_DX: | ||
3971 | case TRIDENT_DEVICE_ID_NX: | ||
3972 | break; /* TODO */ | ||
3973 | case TRIDENT_DEVICE_ID_SI7018: | ||
3974 | break; | ||
3975 | } | ||
3976 | pci_disable_device(pci); | 3969 | pci_disable_device(pci); |
3977 | pci_save_state(pci); | 3970 | pci_save_state(pci); |
3971 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
3978 | return 0; | 3972 | return 0; |
3979 | } | 3973 | } |
3980 | 3974 | ||
@@ -3983,9 +3977,15 @@ int snd_trident_resume(struct pci_dev *pci) | |||
3983 | struct snd_card *card = pci_get_drvdata(pci); | 3977 | struct snd_card *card = pci_get_drvdata(pci); |
3984 | struct snd_trident *trident = card->private_data; | 3978 | struct snd_trident *trident = card->private_data; |
3985 | 3979 | ||
3980 | pci_set_power_state(pci, PCI_D0); | ||
3986 | pci_restore_state(pci); | 3981 | pci_restore_state(pci); |
3987 | pci_enable_device(pci); | 3982 | if (pci_enable_device(pci) < 0) { |
3988 | pci_set_master(pci); /* to be sure */ | 3983 | printk(KERN_ERR "trident: pci_enable_device failed, " |
3984 | "disabling device\n"); | ||
3985 | snd_card_disconnect(card); | ||
3986 | return -EIO; | ||
3987 | } | ||
3988 | pci_set_master(pci); | ||
3989 | 3989 | ||
3990 | switch (trident->device) { | 3990 | switch (trident->device) { |
3991 | case TRIDENT_DEVICE_ID_DX: | 3991 | case TRIDENT_DEVICE_ID_DX: |
diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c index e6990e0bbf23..92b0736c0fdb 100644 --- a/sound/pci/via82xx.c +++ b/sound/pci/via82xx.c | |||
@@ -2185,9 +2185,9 @@ static int snd_via82xx_suspend(struct pci_dev *pci, pm_message_t state) | |||
2185 | chip->capture_src_saved[1] = inb(chip->port + VIA_REG_CAPTURE_CHANNEL + 0x10); | 2185 | chip->capture_src_saved[1] = inb(chip->port + VIA_REG_CAPTURE_CHANNEL + 0x10); |
2186 | } | 2186 | } |
2187 | 2187 | ||
2188 | pci_set_power_state(pci, PCI_D3hot); | ||
2189 | pci_disable_device(pci); | 2188 | pci_disable_device(pci); |
2190 | pci_save_state(pci); | 2189 | pci_save_state(pci); |
2190 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
2191 | return 0; | 2191 | return 0; |
2192 | } | 2192 | } |
2193 | 2193 | ||
@@ -2197,9 +2197,15 @@ static int snd_via82xx_resume(struct pci_dev *pci) | |||
2197 | struct via82xx *chip = card->private_data; | 2197 | struct via82xx *chip = card->private_data; |
2198 | int i; | 2198 | int i; |
2199 | 2199 | ||
2200 | pci_restore_state(pci); | ||
2201 | pci_enable_device(pci); | ||
2202 | pci_set_power_state(pci, PCI_D0); | 2200 | pci_set_power_state(pci, PCI_D0); |
2201 | pci_restore_state(pci); | ||
2202 | if (pci_enable_device(pci) < 0) { | ||
2203 | printk(KERN_ERR "via82xx: pci_enable_device failed, " | ||
2204 | "disabling device\n"); | ||
2205 | snd_card_disconnect(card); | ||
2206 | return -EIO; | ||
2207 | } | ||
2208 | pci_set_master(pci); | ||
2203 | 2209 | ||
2204 | snd_via82xx_chip_init(chip); | 2210 | snd_via82xx_chip_init(chip); |
2205 | 2211 | ||
diff --git a/sound/pci/via82xx_modem.c b/sound/pci/via82xx_modem.c index 5ab1cf3d434b..feb27c966256 100644 --- a/sound/pci/via82xx_modem.c +++ b/sound/pci/via82xx_modem.c | |||
@@ -1032,9 +1032,10 @@ static int snd_via82xx_suspend(struct pci_dev *pci, pm_message_t state) | |||
1032 | snd_via82xx_channel_reset(chip, &chip->devs[i]); | 1032 | snd_via82xx_channel_reset(chip, &chip->devs[i]); |
1033 | synchronize_irq(chip->irq); | 1033 | synchronize_irq(chip->irq); |
1034 | snd_ac97_suspend(chip->ac97); | 1034 | snd_ac97_suspend(chip->ac97); |
1035 | pci_set_power_state(pci, PCI_D3hot); | 1035 | |
1036 | pci_disable_device(pci); | 1036 | pci_disable_device(pci); |
1037 | pci_save_state(pci); | 1037 | pci_save_state(pci); |
1038 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
1038 | return 0; | 1039 | return 0; |
1039 | } | 1040 | } |
1040 | 1041 | ||
@@ -1044,9 +1045,14 @@ static int snd_via82xx_resume(struct pci_dev *pci) | |||
1044 | struct via82xx_modem *chip = card->private_data; | 1045 | struct via82xx_modem *chip = card->private_data; |
1045 | int i; | 1046 | int i; |
1046 | 1047 | ||
1047 | pci_restore_state(pci); | ||
1048 | pci_enable_device(pci); | ||
1049 | pci_set_power_state(pci, PCI_D0); | 1048 | pci_set_power_state(pci, PCI_D0); |
1049 | pci_restore_state(pci); | ||
1050 | if (pci_enable_device(pci) < 0) { | ||
1051 | printk(KERN_ERR "via82xx-modem: pci_enable_device failed, " | ||
1052 | "disabling device\n"); | ||
1053 | snd_card_disconnect(card); | ||
1054 | return -EIO; | ||
1055 | } | ||
1050 | pci_set_master(pci); | 1056 | pci_set_master(pci); |
1051 | 1057 | ||
1052 | snd_via82xx_chip_init(chip); | 1058 | snd_via82xx_chip_init(chip); |
diff --git a/sound/pci/vx222/vx222.c b/sound/pci/vx222/vx222.c index e7cd8acab59a..af49e8aabf55 100644 --- a/sound/pci/vx222/vx222.c +++ b/sound/pci/vx222/vx222.c | |||
@@ -266,9 +266,9 @@ static int snd_vx222_suspend(struct pci_dev *pci, pm_message_t state) | |||
266 | int err; | 266 | int err; |
267 | 267 | ||
268 | err = snd_vx_suspend(&vx->core, state); | 268 | err = snd_vx_suspend(&vx->core, state); |
269 | pci_set_power_state(pci, PCI_D3hot); | ||
270 | pci_disable_device(pci); | 269 | pci_disable_device(pci); |
271 | pci_save_state(pci); | 270 | pci_save_state(pci); |
271 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
272 | return err; | 272 | return err; |
273 | } | 273 | } |
274 | 274 | ||
@@ -277,9 +277,14 @@ static int snd_vx222_resume(struct pci_dev *pci) | |||
277 | struct snd_card *card = pci_get_drvdata(pci); | 277 | struct snd_card *card = pci_get_drvdata(pci); |
278 | struct snd_vx222 *vx = card->private_data; | 278 | struct snd_vx222 *vx = card->private_data; |
279 | 279 | ||
280 | pci_restore_state(pci); | ||
281 | pci_enable_device(pci); | ||
282 | pci_set_power_state(pci, PCI_D0); | 280 | pci_set_power_state(pci, PCI_D0); |
281 | pci_restore_state(pci); | ||
282 | if (pci_enable_device(pci) < 0) { | ||
283 | printk(KERN_ERR "vx222: pci_enable_device failed, " | ||
284 | "disabling device\n"); | ||
285 | snd_card_disconnect(card); | ||
286 | return -EIO; | ||
287 | } | ||
283 | pci_set_master(pci); | 288 | pci_set_master(pci); |
284 | return snd_vx_resume(&vx->core); | 289 | return snd_vx_resume(&vx->core); |
285 | } | 290 | } |
diff --git a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c index ebc6da89edf3..a40c1085fd20 100644 --- a/sound/pci/ymfpci/ymfpci_main.c +++ b/sound/pci/ymfpci/ymfpci_main.c | |||
@@ -2218,6 +2218,7 @@ int snd_ymfpci_suspend(struct pci_dev *pci, pm_message_t state) | |||
2218 | snd_ymfpci_disable_dsp(chip); | 2218 | snd_ymfpci_disable_dsp(chip); |
2219 | pci_disable_device(pci); | 2219 | pci_disable_device(pci); |
2220 | pci_save_state(pci); | 2220 | pci_save_state(pci); |
2221 | pci_set_power_state(pci, pci_choose_state(pci, state)); | ||
2221 | return 0; | 2222 | return 0; |
2222 | } | 2223 | } |
2223 | 2224 | ||
@@ -2227,8 +2228,14 @@ int snd_ymfpci_resume(struct pci_dev *pci) | |||
2227 | struct snd_ymfpci *chip = card->private_data; | 2228 | struct snd_ymfpci *chip = card->private_data; |
2228 | unsigned int i; | 2229 | unsigned int i; |
2229 | 2230 | ||
2231 | pci_set_power_state(pci, PCI_D0); | ||
2230 | pci_restore_state(pci); | 2232 | pci_restore_state(pci); |
2231 | pci_enable_device(pci); | 2233 | if (pci_enable_device(pci) < 0) { |
2234 | printk(KERN_ERR "ymfpci: pci_enable_device failed, " | ||
2235 | "disabling device\n"); | ||
2236 | snd_card_disconnect(card); | ||
2237 | return -EIO; | ||
2238 | } | ||
2232 | pci_set_master(pci); | 2239 | pci_set_master(pci); |
2233 | snd_ymfpci_aclink_reset(pci); | 2240 | snd_ymfpci_aclink_reset(pci); |
2234 | snd_ymfpci_codec_ready(chip, 0); | 2241 | snd_ymfpci_codec_ready(chip, 0); |
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index c82b01c7ad3a..67202b9eeb77 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c | |||
@@ -1469,7 +1469,8 @@ static int snd_usb_hw_free(struct snd_pcm_substream *substream) | |||
1469 | subs->cur_audiofmt = NULL; | 1469 | subs->cur_audiofmt = NULL; |
1470 | subs->cur_rate = 0; | 1470 | subs->cur_rate = 0; |
1471 | subs->period_bytes = 0; | 1471 | subs->period_bytes = 0; |
1472 | release_substream_urbs(subs, 0); | 1472 | if (!subs->stream->chip->shutdown) |
1473 | release_substream_urbs(subs, 0); | ||
1473 | return snd_pcm_free_vmalloc_buffer(substream); | 1474 | return snd_pcm_free_vmalloc_buffer(substream); |
1474 | } | 1475 | } |
1475 | 1476 | ||
diff --git a/usr/Makefile b/usr/Makefile index e338e7bedb29..382702ad663b 100644 --- a/usr/Makefile +++ b/usr/Makefile | |||
@@ -20,7 +20,7 @@ $(obj)/initramfs_data.o: $(obj)/initramfs_data.cpio.gz FORCE | |||
20 | hostprogs-y := gen_init_cpio | 20 | hostprogs-y := gen_init_cpio |
21 | initramfs := $(CONFIG_SHELL) $(srctree)/scripts/gen_initramfs_list.sh | 21 | initramfs := $(CONFIG_SHELL) $(srctree)/scripts/gen_initramfs_list.sh |
22 | ramfs-input := $(if $(filter-out "",$(CONFIG_INITRAMFS_SOURCE)), \ | 22 | ramfs-input := $(if $(filter-out "",$(CONFIG_INITRAMFS_SOURCE)), \ |
23 | $(CONFIG_INITRAMFS_SOURCE),-d) | 23 | $(shell echo $(CONFIG_INITRAMFS_SOURCE)),-d) |
24 | ramfs-args := \ | 24 | ramfs-args := \ |
25 | $(if $(CONFIG_INITRAMFS_ROOT_UID), -u $(CONFIG_INITRAMFS_ROOT_UID)) \ | 25 | $(if $(CONFIG_INITRAMFS_ROOT_UID), -u $(CONFIG_INITRAMFS_ROOT_UID)) \ |
26 | $(if $(CONFIG_INITRAMFS_ROOT_GID), -g $(CONFIG_INITRAMFS_ROOT_GID)) | 26 | $(if $(CONFIG_INITRAMFS_ROOT_GID), -g $(CONFIG_INITRAMFS_ROOT_GID)) |