diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2005-11-18 19:54:12 -0500 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-11-18 19:54:12 -0500 |
commit | 625876f32ed63af262db3d0ac8178d2c0f510636 (patch) | |
tree | 93a0d2d5332fa679ecb99eee7b0955e444d6a41a | |
parent | c902f981b79b512eb3d0c0410f8cae88c78beb57 (diff) | |
parent | b286e39207237e2f6929959372bf66d9a8d05a82 (diff) |
Merge branch 'master'
56 files changed, 1322 insertions, 1140 deletions
@@ -611,8 +611,7 @@ S: USA | |||
611 | N: Randolph Chung | 611 | N: Randolph Chung |
612 | E: tausq@debian.org | 612 | E: tausq@debian.org |
613 | D: Linux/PA-RISC hacker | 613 | D: Linux/PA-RISC hacker |
614 | S: Los Altos, CA 94022 | 614 | S: Hong Kong |
615 | S: USA | ||
616 | 615 | ||
617 | N: Juan Jose Ciarlante | 616 | N: Juan Jose Ciarlante |
618 | W: http://juanjox.kernelnotes.org/ | 617 | W: http://juanjox.kernelnotes.org/ |
@@ -3405,6 +3404,15 @@ S: Chudenicka 8 | |||
3405 | S: 10200 Prague 10, Hostivar | 3404 | S: 10200 Prague 10, Hostivar |
3406 | S: Czech Republic | 3405 | S: Czech Republic |
3407 | 3406 | ||
3407 | N: Thibaut Varene | ||
3408 | E: T-Bone@parisc-linux.org | ||
3409 | W: http://www.parisc-linux.org/ | ||
3410 | P: 1024D/B7D2F063 E67C 0D43 A75E 12A5 BB1C FA2F 1E32 C3DA B7D2 F063 | ||
3411 | D: PA-RISC port minion, PDC and GSCPS2 drivers, debuglocks and other bits | ||
3412 | D: Some bits in an ARM port, S1D13XXX FB driver, random patches here and there | ||
3413 | D: AD1889 sound driver | ||
3414 | S: Paris, France | ||
3415 | |||
3408 | N: Heikki Vatiainen | 3416 | N: Heikki Vatiainen |
3409 | E: hessu@cs.tut.fi | 3417 | E: hessu@cs.tut.fi |
3410 | D: Co-author of Multi-Protocol Over ATM (MPOA), some LANE hacks | 3418 | D: Co-author of Multi-Protocol Over ATM (MPOA), some LANE hacks |
diff --git a/Documentation/00-INDEX b/Documentation/00-INDEX index 433cf5e9ae04..5f7f7d7f77d2 100644 --- a/Documentation/00-INDEX +++ b/Documentation/00-INDEX | |||
@@ -24,6 +24,8 @@ DMA-mapping.txt | |||
24 | - info for PCI drivers using DMA portably across all platforms. | 24 | - info for PCI drivers using DMA portably across all platforms. |
25 | DocBook/ | 25 | DocBook/ |
26 | - directory with DocBook templates etc. for kernel documentation. | 26 | - directory with DocBook templates etc. for kernel documentation. |
27 | HOWTO | ||
28 | - The process and procedures of how to do Linux kernel development. | ||
27 | IO-mapping.txt | 29 | IO-mapping.txt |
28 | - how to access I/O mapped memory from within device drivers. | 30 | - how to access I/O mapped memory from within device drivers. |
29 | IPMI.txt | 31 | IPMI.txt |
@@ -256,6 +258,10 @@ specialix.txt | |||
256 | - info on hardware/driver for specialix IO8+ multiport serial card. | 258 | - info on hardware/driver for specialix IO8+ multiport serial card. |
257 | spinlocks.txt | 259 | spinlocks.txt |
258 | - info on using spinlocks to provide exclusive access in kernel. | 260 | - info on using spinlocks to provide exclusive access in kernel. |
261 | stable_api_nonsense.txt | ||
262 | - info on why the kernel does not have a stable in-kernel api or abi. | ||
263 | stable_kernel_rules.txt | ||
264 | - rules and procedures for the -stable kernel releases. | ||
259 | stallion.txt | 265 | stallion.txt |
260 | - info on using the Stallion multiport serial driver. | 266 | - info on using the Stallion multiport serial driver. |
261 | svga.txt | 267 | svga.txt |
diff --git a/Documentation/HOWTO b/Documentation/HOWTO new file mode 100644 index 000000000000..6c9e746267da --- /dev/null +++ b/Documentation/HOWTO | |||
@@ -0,0 +1,618 @@ | |||
1 | HOWTO do Linux kernel development | ||
2 | --------------------------------- | ||
3 | |||
4 | This is the be-all, end-all document on this topic. It contains | ||
5 | instructions on how to become a Linux kernel developer and how to learn | ||
6 | to work with the Linux kernel development community. It tries to not | ||
7 | contain anything related to the technical aspects of kernel programming, | ||
8 | but will help point you in the right direction for that. | ||
9 | |||
10 | If anything in this document becomes out of date, please send in patches | ||
11 | to the maintainer of this file, who is listed at the bottom of the | ||
12 | document. | ||
13 | |||
14 | |||
15 | Introduction | ||
16 | ------------ | ||
17 | |||
18 | So, you want to learn how to become a Linux kernel developer? Or you | ||
19 | have been told by your manager, "Go write a Linux driver for this | ||
20 | device." This document's goal is to teach you everything you need to | ||
21 | know to achieve this by describing the process you need to go through, | ||
22 | and hints on how to work with the community. It will also try to | ||
23 | explain some of the reasons why the community works like it does. | ||
24 | |||
25 | The kernel is written mostly in C, with some architecture-dependent | ||
26 | parts written in assembly. A good understanding of C is required for | ||
27 | kernel development. Assembly (any architecture) is not required unless | ||
28 | you plan to do low-level development for that architecture. Though they | ||
29 | are not a good substitute for a solid C education and/or years of | ||
30 | experience, the following books are good for, if anything, reference: | ||
31 | - "The C Programming Language" by Kernighan and Ritchie [Prentice Hall] | ||
32 | - "Practical C Programming" by Steve Oualline [O'Reilly] | ||
33 | |||
34 | The kernel is written using GNU C and the GNU toolchain. While it | ||
35 | adheres to the ISO C89 standard, it uses a number of extensions that are | ||
36 | not featured in the standard. The kernel is a freestanding C | ||
37 | environment, with no reliance on the standard C library, so some | ||
38 | portions of the C standard are not supported. Arbitrary long long | ||
39 | divisions and floating point are not allowed. It can sometimes be | ||
40 | difficult to understand the assumptions the kernel has on the toolchain | ||
41 | and the extensions that it uses, and unfortunately there is no | ||
42 | definitive reference for them. Please check the gcc info pages (`info | ||
43 | gcc`) for some information on them. | ||
44 | |||
45 | Please remember that you are trying to learn how to work with the | ||
46 | existing development community. It is a diverse group of people, with | ||
47 | high standards for coding, style and procedure. These standards have | ||
48 | been created over time based on what they have found to work best for | ||
49 | such a large and geographically dispersed team. Try to learn as much as | ||
50 | possible about these standards ahead of time, as they are well | ||
51 | documented; do not expect people to adapt to you or your company's way | ||
52 | of doing things. | ||
53 | |||
54 | |||
55 | Legal Issues | ||
56 | ------------ | ||
57 | |||
58 | The Linux kernel source code is released under the GPL. Please see the | ||
59 | file, COPYING, in the main directory of the source tree, for details on | ||
60 | the license. If you have further questions about the license, please | ||
61 | contact a lawyer, and do not ask on the Linux kernel mailing list. The | ||
62 | people on the mailing lists are not lawyers, and you should not rely on | ||
63 | their statements on legal matters. | ||
64 | |||
65 | For common questions and answers about the GPL, please see: | ||
66 | http://www.gnu.org/licenses/gpl-faq.html | ||
67 | |||
68 | |||
69 | Documentation | ||
70 | ------------ | ||
71 | |||
72 | The Linux kernel source tree has a large range of documents that are | ||
73 | invaluable for learning how to interact with the kernel community. When | ||
74 | new features are added to the kernel, it is recommended that new | ||
75 | documentation files are also added which explain how to use the feature. | ||
76 | When a kernel change causes the interface that the kernel exposes to | ||
77 | userspace to change, it is recommended that you send the information or | ||
78 | a patch to the manual pages explaining the change to the manual pages | ||
79 | maintainer at mtk-manpages@gmx.net. | ||
80 | |||
81 | Here is a list of files that are in the kernel source tree that are | ||
82 | required reading: | ||
83 | README | ||
84 | This file gives a short background on the Linux kernel and describes | ||
85 | what is necessary to do to configure and build the kernel. People | ||
86 | who are new to the kernel should start here. | ||
87 | |||
88 | Documentation/Changes | ||
89 | This file gives a list of the minimum levels of various software | ||
90 | packages that are necessary to build and run the kernel | ||
91 | successfully. | ||
92 | |||
93 | Documentation/CodingStyle | ||
94 | This describes the Linux kernel coding style, and some of the | ||
95 | rationale behind it. All new code is expected to follow the | ||
96 | guidelines in this document. Most maintainers will only accept | ||
97 | patches if these rules are followed, and many people will only | ||
98 | review code if it is in the proper style. | ||
99 | |||
100 | Documentation/SubmittingPatches | ||
101 | Documentation/SubmittingDrivers | ||
102 | These files describe in explicit detail how to successfully create | ||
103 | and send a patch, including (but not limited to): | ||
104 | - Email contents | ||
105 | - Email format | ||
106 | - Who to send it to | ||
107 | Following these rules will not guarantee success (as all patches are | ||
108 | subject to scrutiny for content and style), but not following them | ||
109 | will almost always prevent it. | ||
110 | |||
111 | Other excellent descriptions of how to create patches properly are: | ||
112 | "The Perfect Patch" | ||
113 | http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt | ||
114 | "Linux kernel patch submission format" | ||
115 | http://linux.yyz.us/patch-format.html | ||
116 | |||
117 | Documentation/stable_api_nonsense.txt | ||
118 | This file describes the rationale behind the conscious decision to | ||
119 | not have a stable API within the kernel, including things like: | ||
120 | - Subsystem shim-layers (for compatibility?) | ||
121 | - Driver portability between Operating Systems. | ||
122 | - Mitigating rapid change within the kernel source tree (or | ||
123 | preventing rapid change) | ||
124 | This document is crucial for understanding the Linux development | ||
125 | philosophy and is very important for people moving to Linux from | ||
126 | development on other Operating Systems. | ||
127 | |||
128 | Documentation/SecurityBugs | ||
129 | If you feel you have found a security problem in the Linux kernel, | ||
130 | please follow the steps in this document to help notify the kernel | ||
131 | developers, and help solve the issue. | ||
132 | |||
133 | Documentation/ManagementStyle | ||
134 | This document describes how Linux kernel maintainers operate and the | ||
135 | shared ethos behind their methodologies. This is important reading | ||
136 | for anyone new to kernel development (or anyone simply curious about | ||
137 | it), as it resolves a lot of common misconceptions and confusion | ||
138 | about the unique behavior of kernel maintainers. | ||
139 | |||
140 | Documentation/stable_kernel_rules.txt | ||
141 | This file describes the rules on how the stable kernel releases | ||
142 | happen, and what to do if you want to get a change into one of these | ||
143 | releases. | ||
144 | |||
145 | Documentation/kernel-docs.txt | ||
146 | A list of external documentation that pertains to kernel | ||
147 | development. Please consult this list if you do not find what you | ||
148 | are looking for within the in-kernel documentation. | ||
149 | |||
150 | Documentation/applying-patches.txt | ||
151 | A good introduction describing exactly what a patch is and how to | ||
152 | apply it to the different development branches of the kernel. | ||
153 | |||
154 | The kernel also has a large number of documents that can be | ||
155 | automatically generated from the source code itself. This includes a | ||
156 | full description of the in-kernel API, and rules on how to handle | ||
157 | locking properly. The documents will be created in the | ||
158 | Documentation/DocBook/ directory and can be generated as PDF, | ||
159 | Postscript, HTML, and man pages by running: | ||
160 | make pdfdocs | ||
161 | make psdocs | ||
162 | make htmldocs | ||
163 | make mandocs | ||
164 | respectively from the main kernel source directory. | ||
165 | |||
166 | |||
167 | Becoming A Kernel Developer | ||
168 | --------------------------- | ||
169 | |||
170 | If you do not know anything about Linux kernel development, you should | ||
171 | look at the Linux KernelNewbies project: | ||
172 | http://kernelnewbies.org | ||
173 | It consists of a helpful mailing list where you can ask almost any type | ||
174 | of basic kernel development question (make sure to search the archives | ||
175 | first, before asking something that has already been answered in the | ||
176 | past.) It also has an IRC channel that you can use to ask questions in | ||
177 | real-time, and a lot of helpful documentation that is useful for | ||
178 | learning about Linux kernel development. | ||
179 | |||
180 | The website has basic information about code organization, subsystems, | ||
181 | and current projects (both in-tree and out-of-tree). It also describes | ||
182 | some basic logistical information, like how to compile a kernel and | ||
183 | apply a patch. | ||
184 | |||
185 | If you do not know where you want to start, but you want to look for | ||
186 | some task to start doing to join into the kernel development community, | ||
187 | go to the Linux Kernel Janitor's project: | ||
188 | http://janitor.kernelnewbies.org/ | ||
189 | It is a great place to start. It describes a list of relatively simple | ||
190 | problems that need to be cleaned up and fixed within the Linux kernel | ||
191 | source tree. Working with the developers in charge of this project, you | ||
192 | will learn the basics of getting your patch into the Linux kernel tree, | ||
193 | and possibly be pointed in the direction of what to go work on next, if | ||
194 | you do not already have an idea. | ||
195 | |||
196 | If you already have a chunk of code that you want to put into the kernel | ||
197 | tree, but need some help getting it in the proper form, the | ||
198 | kernel-mentors project was created to help you out with this. It is a | ||
199 | mailing list, and can be found at: | ||
200 | http://selenic.com/mailman/listinfo/kernel-mentors | ||
201 | |||
202 | Before making any actual modifications to the Linux kernel code, it is | ||
203 | imperative to understand how the code in question works. For this | ||
204 | purpose, nothing is better than reading through it directly (most tricky | ||
205 | bits are commented well), perhaps even with the help of specialized | ||
206 | tools. One such tool that is particularly recommended is the Linux | ||
207 | Cross-Reference project, which is able to present source code in a | ||
208 | self-referential, indexed webpage format. An excellent up-to-date | ||
209 | repository of the kernel code may be found at: | ||
210 | http://sosdg.org/~coywolf/lxr/ | ||
211 | |||
212 | |||
213 | The development process | ||
214 | ----------------------- | ||
215 | |||
216 | Linux kernel development process currently consists of a few different | ||
217 | main kernel "branches" and lots of different subsystem-specific kernel | ||
218 | branches. These different branches are: | ||
219 | - main 2.6.x kernel tree | ||
220 | - 2.6.x.y -stable kernel tree | ||
221 | - 2.6.x -git kernel patches | ||
222 | - 2.6.x -mm kernel patches | ||
223 | - subsystem specific kernel trees and patches | ||
224 | |||
225 | 2.6.x kernel tree | ||
226 | ----------------- | ||
227 | 2.6.x kernels are maintained by Linus Torvalds, and can be found on | ||
228 | kernel.org in the pub/linux/kernel/v2.6/ directory. Its development | ||
229 | process is as follows: | ||
230 | - As soon as a new kernel is released a two weeks window is open, | ||
231 | during this period of time maintainers can submit big diffs to | ||
232 | Linus, usually the patches that have already been included in the | ||
233 | -mm kernel for a few weeks. The preferred way to submit big changes | ||
234 | is using git (the kernel's source management tool, more information | ||
235 | can be found at http://git.or.cz/) but plain patches are also just | ||
236 | fine. | ||
237 | - After two weeks a -rc1 kernel is released it is now possible to push | ||
238 | only patches that do not include new features that could affect the | ||
239 | stability of the whole kernel. Please note that a whole new driver | ||
240 | (or filesystem) might be accepted after -rc1 because there is no | ||
241 | risk of causing regressions with such a change as long as the change | ||
242 | is self-contained and does not affect areas outside of the code that | ||
243 | is being added. git can be used to send patches to Linus after -rc1 | ||
244 | is released, but the patches need to also be sent to a public | ||
245 | mailing list for review. | ||
246 | - A new -rc is released whenever Linus deems the current git tree to | ||
247 | be in a reasonably sane state adequate for testing. The goal is to | ||
248 | release a new -rc kernel every week. | ||
249 | - Process continues until the kernel is considered "ready", the | ||
250 | process should last around 6 weeks. | ||
251 | |||
252 | It is worth mentioning what Andrew Morton wrote on the linux-kernel | ||
253 | mailing list about kernel releases: | ||
254 | "Nobody knows when a kernel will be released, because it's | ||
255 | released according to perceived bug status, not according to a | ||
256 | preconceived timeline." | ||
257 | |||
258 | 2.6.x.y -stable kernel tree | ||
259 | --------------------------- | ||
260 | Kernels with 4 digit versions are -stable kernels. They contain | ||
261 | relatively small and critical fixes for security problems or significant | ||
262 | regressions discovered in a given 2.6.x kernel. | ||
263 | |||
264 | This is the recommended branch for users who want the most recent stable | ||
265 | kernel and are not interested in helping test development/experimental | ||
266 | versions. | ||
267 | |||
268 | If no 2.6.x.y kernel is available, then the highest numbered 2.6.x | ||
269 | kernel is the current stable kernel. | ||
270 | |||
271 | 2.6.x.y are maintained by the "stable" team <stable@kernel.org>, and are | ||
272 | released almost every other week. | ||
273 | |||
274 | The file Documentation/stable_kernel_rules.txt in the kernel tree | ||
275 | documents what kinds of changes are acceptable for the -stable tree, and | ||
276 | how the release process works. | ||
277 | |||
278 | 2.6.x -git patches | ||
279 | ------------------ | ||
280 | These are daily snapshots of Linus' kernel tree which are managed in a | ||
281 | git repository (hence the name.) These patches are usually released | ||
282 | daily and represent the current state of Linus' tree. They are more | ||
283 | experimental than -rc kernels since they are generated automatically | ||
284 | without even a cursory glance to see if they are sane. | ||
285 | |||
286 | 2.6.x -mm kernel patches | ||
287 | ------------------------ | ||
288 | These are experimental kernel patches released by Andrew Morton. Andrew | ||
289 | takes all of the different subsystem kernel trees and patches and mushes | ||
290 | them together, along with a lot of patches that have been plucked from | ||
291 | the linux-kernel mailing list. This tree serves as a proving ground for | ||
292 | new features and patches. Once a patch has proved its worth in -mm for | ||
293 | a while Andrew or the subsystem maintainer pushes it on to Linus for | ||
294 | inclusion in mainline. | ||
295 | |||
296 | It is heavily encouraged that all new patches get tested in the -mm tree | ||
297 | before they are sent to Linus for inclusion in the main kernel tree. | ||
298 | |||
299 | These kernels are not appropriate for use on systems that are supposed | ||
300 | to be stable and they are more risky to run than any of the other | ||
301 | branches. | ||
302 | |||
303 | If you wish to help out with the kernel development process, please test | ||
304 | and use these kernel releases and provide feedback to the linux-kernel | ||
305 | mailing list if you have any problems, and if everything works properly. | ||
306 | |||
307 | In addition to all the other experimental patches, these kernels usually | ||
308 | also contain any changes in the mainline -git kernels available at the | ||
309 | time of release. | ||
310 | |||
311 | The -mm kernels are not released on a fixed schedule, but usually a few | ||
312 | -mm kernels are released in between each -rc kernel (1 to 3 is common). | ||
313 | |||
314 | Subsystem Specific kernel trees and patches | ||
315 | ------------------------------------------- | ||
316 | A number of the different kernel subsystem developers expose their | ||
317 | development trees so that others can see what is happening in the | ||
318 | different areas of the kernel. These trees are pulled into the -mm | ||
319 | kernel releases as described above. | ||
320 | |||
321 | Here is a list of some of the different kernel trees available: | ||
322 | git trees: | ||
323 | - Kbuild development tree, Sam Ravnborg <sam@ravnborg.org> | ||
324 | kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git | ||
325 | |||
326 | - ACPI development tree, Len Brown <len.brown@intel.com> | ||
327 | kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git | ||
328 | |||
329 | - Block development tree, Jens Axboe <axboe@suse.de> | ||
330 | kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git | ||
331 | |||
332 | - DRM development tree, Dave Airlie <airlied@linux.ie> | ||
333 | kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git | ||
334 | |||
335 | - ia64 development tree, Tony Luck <tony.luck@intel.com> | ||
336 | kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git | ||
337 | |||
338 | - ieee1394 development tree, Jody McIntyre <scjody@modernduck.com> | ||
339 | kernel.org:/pub/scm/linux/kernel/git/scjody/ieee1394.git | ||
340 | |||
341 | - infiniband, Roland Dreier <rolandd@cisco.com> | ||
342 | kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git | ||
343 | |||
344 | - libata, Jeff Garzik <jgarzik@pobox.com> | ||
345 | kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git | ||
346 | |||
347 | - network drivers, Jeff Garzik <jgarzik@pobox.com> | ||
348 | kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git | ||
349 | |||
350 | - pcmcia, Dominik Brodowski <linux@dominikbrodowski.net> | ||
351 | kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git | ||
352 | |||
353 | - SCSI, James Bottomley <James.Bottomley@SteelEye.com> | ||
354 | kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git | ||
355 | |||
356 | Other git kernel trees can be found listed at http://kernel.org/git | ||
357 | |||
358 | quilt trees: | ||
359 | - USB, PCI, Driver Core, and I2C, Greg Kroah-Hartman <gregkh@suse.de> | ||
360 | kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ | ||
361 | |||
362 | |||
363 | Bug Reporting | ||
364 | ------------- | ||
365 | |||
366 | bugzilla.kernel.org is where the Linux kernel developers track kernel | ||
367 | bugs. Users are encouraged to report all bugs that they find in this | ||
368 | tool. For details on how to use the kernel bugzilla, please see: | ||
369 | http://test.kernel.org/bugzilla/faq.html | ||
370 | |||
371 | The file REPORTING-BUGS in the main kernel source directory has a good | ||
372 | template for how to report a possible kernel bug, and details what kind | ||
373 | of information is needed by the kernel developers to help track down the | ||
374 | problem. | ||
375 | |||
376 | |||
377 | Mailing lists | ||
378 | ------------- | ||
379 | |||
380 | As some of the above documents describe, the majority of the core kernel | ||
381 | developers participate on the Linux Kernel Mailing list. Details on how | ||
382 | to subscribe and unsubscribe from the list can be found at: | ||
383 | http://vger.kernel.org/vger-lists.html#linux-kernel | ||
384 | There are archives of the mailing list on the web in many different | ||
385 | places. Use a search engine to find these archives. For example: | ||
386 | http://dir.gmane.org/gmane.linux.kernel | ||
387 | It is highly recommended that you search the archives about the topic | ||
388 | you want to bring up, before you post it to the list. A lot of things | ||
389 | already discussed in detail are only recorded at the mailing list | ||
390 | archives. | ||
391 | |||
392 | Most of the individual kernel subsystems also have their own separate | ||
393 | mailing list where they do their development efforts. See the | ||
394 | MAINTAINERS file for a list of what these lists are for the different | ||
395 | groups. | ||
396 | |||
397 | Many of the lists are hosted on kernel.org. Information on them can be | ||
398 | found at: | ||
399 | http://vger.kernel.org/vger-lists.html | ||
400 | |||
401 | Please remember to follow good behavioral habits when using the lists. | ||
402 | Though a bit cheesy, the following URL has some simple guidelines for | ||
403 | interacting with the list (or any list): | ||
404 | http://www.albion.com/netiquette/ | ||
405 | |||
406 | If multiple people respond to your mail, the CC: list of recipients may | ||
407 | get pretty large. Don't remove anybody from the CC: list without a good | ||
408 | reason, or don't reply only to the list address. Get used to receiving the | ||
409 | mail twice, one from the sender and the one from the list, and don't try | ||
410 | to tune that by adding fancy mail-headers, people will not like it. | ||
411 | |||
412 | Remember to keep the context and the attribution of your replies intact, | ||
413 | keep the "John Kernelhacker wrote ...:" lines at the top of your reply, and | ||
414 | add your statements between the individual quoted sections instead of | ||
415 | writing at the top of the mail. | ||
416 | |||
417 | If you add patches to your mail, make sure they are plain readable text | ||
418 | as stated in Documentation/SubmittingPatches. Kernel developers don't | ||
419 | want to deal with attachments or compressed patches; they may want | ||
420 | to comment on individual lines of your patch, which works only that way. | ||
421 | Make sure you use a mail program that does not mangle spaces and tab | ||
422 | characters. A good first test is to send the mail to yourself and try | ||
423 | to apply your own patch by yourself. If that doesn't work, get your | ||
424 | mail program fixed or change it until it works. | ||
425 | |||
426 | Above all, please remember to show respect to other subscribers. | ||
427 | |||
428 | |||
429 | Working with the community | ||
430 | -------------------------- | ||
431 | |||
432 | The goal of the kernel community is to provide the best possible kernel | ||
433 | there is. When you submit a patch for acceptance, it will be reviewed | ||
434 | on its technical merits and those alone. So, what should you be | ||
435 | expecting? | ||
436 | - criticism | ||
437 | - comments | ||
438 | - requests for change | ||
439 | - requests for justification | ||
440 | - silence | ||
441 | |||
442 | Remember, this is part of getting your patch into the kernel. You have | ||
443 | to be able to take criticism and comments about your patches, evaluate | ||
444 | them at a technical level and either rework your patches or provide | ||
445 | clear and concise reasoning as to why those changes should not be made. | ||
446 | If there are no responses to your posting, wait a few days and try | ||
447 | again, sometimes things get lost in the huge volume. | ||
448 | |||
449 | What should you not do? | ||
450 | - expect your patch to be accepted without question | ||
451 | - become defensive | ||
452 | - ignore comments | ||
453 | - resubmit the patch without making any of the requested changes | ||
454 | |||
455 | In a community that is looking for the best technical solution possible, | ||
456 | there will always be differing opinions on how beneficial a patch is. | ||
457 | You have to be cooperative, and willing to adapt your idea to fit within | ||
458 | the kernel. Or at least be willing to prove your idea is worth it. | ||
459 | Remember, being wrong is acceptable as long as you are willing to work | ||
460 | toward a solution that is right. | ||
461 | |||
462 | It is normal that the answers to your first patch might simply be a list | ||
463 | of a dozen things you should correct. This does _not_ imply that your | ||
464 | patch will not be accepted, and it is _not_ meant against you | ||
465 | personally. Simply correct all issues raised against your patch and | ||
466 | resend it. | ||
467 | |||
468 | |||
469 | Differences between the kernel community and corporate structures | ||
470 | ----------------------------------------------------------------- | ||
471 | |||
472 | The kernel community works differently than most traditional corporate | ||
473 | development environments. Here are a list of things that you can try to | ||
474 | do to try to avoid problems: | ||
475 | Good things to say regarding your proposed changes: | ||
476 | - "This solves multiple problems." | ||
477 | - "This deletes 2000 lines of code." | ||
478 | - "Here is a patch that explains what I am trying to describe." | ||
479 | - "I tested it on 5 different architectures..." | ||
480 | - "Here is a series of small patches that..." | ||
481 | - "This increases performance on typical machines..." | ||
482 | |||
483 | Bad things you should avoid saying: | ||
484 | - "We did it this way in AIX/ptx/Solaris, so therefore it must be | ||
485 | good..." | ||
486 | - "I've being doing this for 20 years, so..." | ||
487 | - "This is required for my company to make money" | ||
488 | - "This is for our Enterprise product line." | ||
489 | - "Here is my 1000 page design document that describes my idea" | ||
490 | - "I've been working on this for 6 months..." | ||
491 | - "Here's a 5000 line patch that..." | ||
492 | - "I rewrote all of the current mess, and here it is..." | ||
493 | - "I have a deadline, and this patch needs to be applied now." | ||
494 | |||
495 | Another way the kernel community is different than most traditional | ||
496 | software engineering work environments is the faceless nature of | ||
497 | interaction. One benefit of using email and irc as the primary forms of | ||
498 | communication is the lack of discrimination based on gender or race. | ||
499 | The Linux kernel work environment is accepting of women and minorities | ||
500 | because all you are is an email address. The international aspect also | ||
501 | helps to level the playing field because you can't guess gender based on | ||
502 | a person's name. A man may be named Andrea and a woman may be named Pat. | ||
503 | Most women who have worked in the Linux kernel and have expressed an | ||
504 | opinion have had positive experiences. | ||
505 | |||
506 | The language barrier can cause problems for some people who are not | ||
507 | comfortable with English. A good grasp of the language can be needed in | ||
508 | order to get ideas across properly on mailing lists, so it is | ||
509 | recommended that you check your emails to make sure they make sense in | ||
510 | English before sending them. | ||
511 | |||
512 | |||
513 | Break up your changes | ||
514 | --------------------- | ||
515 | |||
516 | The Linux kernel community does not gladly accept large chunks of code | ||
517 | dropped on it all at once. The changes need to be properly introduced, | ||
518 | discussed, and broken up into tiny, individual portions. This is almost | ||
519 | the exact opposite of what companies are used to doing. Your proposal | ||
520 | should also be introduced very early in the development process, so that | ||
521 | you can receive feedback on what you are doing. It also lets the | ||
522 | community feel that you are working with them, and not simply using them | ||
523 | as a dumping ground for your feature. However, don't send 50 emails at | ||
524 | one time to a mailing list, your patch series should be smaller than | ||
525 | that almost all of the time. | ||
526 | |||
527 | The reasons for breaking things up are the following: | ||
528 | |||
529 | 1) Small patches increase the likelihood that your patches will be | ||
530 | applied, since they don't take much time or effort to verify for | ||
531 | correctness. A 5 line patch can be applied by a maintainer with | ||
532 | barely a second glance. However, a 500 line patch may take hours to | ||
533 | review for correctness (the time it takes is exponentially | ||
534 | proportional to the size of the patch, or something). | ||
535 | |||
536 | Small patches also make it very easy to debug when something goes | ||
537 | wrong. It's much easier to back out patches one by one than it is | ||
538 | to dissect a very large patch after it's been applied (and broken | ||
539 | something). | ||
540 | |||
541 | 2) It's important not only to send small patches, but also to rewrite | ||
542 | and simplify (or simply re-order) patches before submitting them. | ||
543 | |||
544 | Here is an analogy from kernel developer Al Viro: | ||
545 | "Think of a teacher grading homework from a math student. The | ||
546 | teacher does not want to see the student's trials and errors | ||
547 | before they came up with the solution. They want to see the | ||
548 | cleanest, most elegant answer. A good student knows this, and | ||
549 | would never submit her intermediate work before the final | ||
550 | solution." | ||
551 | |||
552 | The same is true of kernel development. The maintainers and | ||
553 | reviewers do not want to see the thought process behind the | ||
554 | solution to the problem one is solving. They want to see a | ||
555 | simple and elegant solution." | ||
556 | |||
557 | It may be challenging to keep the balance between presenting an elegant | ||
558 | solution and working together with the community and discussing your | ||
559 | unfinished work. Therefore it is good to get early in the process to | ||
560 | get feedback to improve your work, but also keep your changes in small | ||
561 | chunks that they may get already accepted, even when your whole task is | ||
562 | not ready for inclusion now. | ||
563 | |||
564 | Also realize that it is not acceptable to send patches for inclusion | ||
565 | that are unfinished and will be "fixed up later." | ||
566 | |||
567 | |||
568 | Justify your change | ||
569 | ------------------- | ||
570 | |||
571 | Along with breaking up your patches, it is very important for you to let | ||
572 | the Linux community know why they should add this change. New features | ||
573 | must be justified as being needed and useful. | ||
574 | |||
575 | |||
576 | Document your change | ||
577 | -------------------- | ||
578 | |||
579 | When sending in your patches, pay special attention to what you say in | ||
580 | the text in your email. This information will become the ChangeLog | ||
581 | information for the patch, and will be preserved for everyone to see for | ||
582 | all time. It should describe the patch completely, containing: | ||
583 | - why the change is necessary | ||
584 | - the overall design approach in the patch | ||
585 | - implementation details | ||
586 | - testing results | ||
587 | |||
588 | For more details on what this should all look like, please see the | ||
589 | ChangeLog section of the document: | ||
590 | "The Perfect Patch" | ||
591 | http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt | ||
592 | |||
593 | |||
594 | |||
595 | |||
596 | All of these things are sometimes very hard to do. It can take years to | ||
597 | perfect these practices (if at all). It's a continuous process of | ||
598 | improvement that requires a lot of patience and determination. But | ||
599 | don't give up, it's possible. Many have done it before, and each had to | ||
600 | start exactly where you are now. | ||
601 | |||
602 | |||
603 | |||
604 | |||
605 | ---------- | ||
606 | Thanks to Paolo Ciarrocchi who allowed the "Development Process" section | ||
607 | to be based on text he had written, and to Randy Dunlap and Gerrit | ||
608 | Huizenga for some of the list of things you should and should not say. | ||
609 | Also thanks to Pat Mochel, Hanna Linder, Randy Dunlap, Kay Sievers, | ||
610 | Vojtech Pavlik, Jan Kara, Josh Boyer, Kees Cook, Andrew Morton, Andi | ||
611 | Kleen, Vadim Lobanov, Jesper Juhl, Adrian Bunk, Keri Harris, Frans Pop, | ||
612 | David A. Wheeler, Junio Hamano, Michael Kerrisk, and Alex Shepard for | ||
613 | their review, comments, and contributions. Without their help, this | ||
614 | document would not have been possible. | ||
615 | |||
616 | |||
617 | |||
618 | Maintainer: Greg Kroah-Hartman <greg@kroah.com> | ||
diff --git a/MAINTAINERS b/MAINTAINERS index 509927e40bbb..f239ac4762dd 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -58,6 +58,7 @@ P: Person | |||
58 | M: Mail patches to | 58 | M: Mail patches to |
59 | L: Mailing list that is relevant to this area | 59 | L: Mailing list that is relevant to this area |
60 | W: Web-page with status/info | 60 | W: Web-page with status/info |
61 | T: SCM tree type and URL. Type is one of: git, hg, quilt. | ||
61 | S: Status, one of the following: | 62 | S: Status, one of the following: |
62 | 63 | ||
63 | Supported: Someone is actually paid to look after this. | 64 | Supported: Someone is actually paid to look after this. |
@@ -183,6 +184,7 @@ P: Len Brown | |||
183 | M: len.brown@intel.com | 184 | M: len.brown@intel.com |
184 | L: acpi-devel@lists.sourceforge.net | 185 | L: acpi-devel@lists.sourceforge.net |
185 | W: http://acpi.sourceforge.net/ | 186 | W: http://acpi.sourceforge.net/ |
187 | T: git kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git | ||
186 | S: Maintained | 188 | S: Maintained |
187 | 189 | ||
188 | AD1816 SOUND DRIVER | 190 | AD1816 SOUND DRIVER |
@@ -418,6 +420,7 @@ BLOCK LAYER | |||
418 | P: Jens Axboe | 420 | P: Jens Axboe |
419 | M: axboe@suse.de | 421 | M: axboe@suse.de |
420 | L: linux-kernel@vger.kernel.org | 422 | L: linux-kernel@vger.kernel.org |
423 | T: git kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git | ||
421 | S: Maintained | 424 | S: Maintained |
422 | 425 | ||
423 | BLUETOOTH SUBSYSTEM | 426 | BLUETOOTH SUBSYSTEM |
@@ -803,12 +806,14 @@ DRIVER CORE, KOBJECTS, AND SYSFS | |||
803 | P: Greg Kroah-Hartman | 806 | P: Greg Kroah-Hartman |
804 | M: gregkh@suse.de | 807 | M: gregkh@suse.de |
805 | L: linux-kernel@vger.kernel.org | 808 | L: linux-kernel@vger.kernel.org |
809 | T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ | ||
806 | S: Supported | 810 | S: Supported |
807 | 811 | ||
808 | DRM DRIVERS | 812 | DRM DRIVERS |
809 | P: David Airlie | 813 | P: David Airlie |
810 | M: airlied@linux.ie | 814 | M: airlied@linux.ie |
811 | L: dri-devel@lists.sourceforge.net | 815 | L: dri-devel@lists.sourceforge.net |
816 | T: git kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git | ||
812 | S: Maintained | 817 | S: Maintained |
813 | 818 | ||
814 | DSCC4 DRIVER | 819 | DSCC4 DRIVER |
@@ -1113,6 +1118,7 @@ P: Jean Delvare | |||
1113 | M: khali@linux-fr.org | 1118 | M: khali@linux-fr.org |
1114 | L: lm-sensors@lm-sensors.org | 1119 | L: lm-sensors@lm-sensors.org |
1115 | W: http://www.lm-sensors.nu/ | 1120 | W: http://www.lm-sensors.nu/ |
1121 | T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ | ||
1116 | S: Maintained | 1122 | S: Maintained |
1117 | 1123 | ||
1118 | I2O | 1124 | I2O |
@@ -1145,6 +1151,7 @@ P: Tony Luck | |||
1145 | M: tony.luck@intel.com | 1151 | M: tony.luck@intel.com |
1146 | L: linux-ia64@vger.kernel.org | 1152 | L: linux-ia64@vger.kernel.org |
1147 | W: http://www.ia64-linux.org/ | 1153 | W: http://www.ia64-linux.org/ |
1154 | T: git kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git | ||
1148 | S: Maintained | 1155 | S: Maintained |
1149 | 1156 | ||
1150 | SN-IA64 (Itanium) SUB-PLATFORM | 1157 | SN-IA64 (Itanium) SUB-PLATFORM |
@@ -1212,6 +1219,7 @@ P: Jody McIntyre | |||
1212 | M: scjody@steamballoon.com | 1219 | M: scjody@steamballoon.com |
1213 | L: linux1394-devel@lists.sourceforge.net | 1220 | L: linux1394-devel@lists.sourceforge.net |
1214 | W: http://www.linux1394.org/ | 1221 | W: http://www.linux1394.org/ |
1222 | T: git kernel.org:/pub/scm/linux/kernel/git/scjody/ieee1394.git | ||
1215 | S: Maintained | 1223 | S: Maintained |
1216 | 1224 | ||
1217 | IEEE 1394 OHCI DRIVER | 1225 | IEEE 1394 OHCI DRIVER |
@@ -1263,6 +1271,7 @@ P: Hal Rosenstock | |||
1263 | M: halr@voltaire.com | 1271 | M: halr@voltaire.com |
1264 | L: openib-general@openib.org | 1272 | L: openib-general@openib.org |
1265 | W: http://www.openib.org/ | 1273 | W: http://www.openib.org/ |
1274 | T: git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git | ||
1266 | S: Supported | 1275 | S: Supported |
1267 | 1276 | ||
1268 | INPUT (KEYBOARD, MOUSE, JOYSTICK) DRIVERS | 1277 | INPUT (KEYBOARD, MOUSE, JOYSTICK) DRIVERS |
@@ -1436,6 +1445,7 @@ P: Kai Germaschewski | |||
1436 | M: kai@germaschewski.name | 1445 | M: kai@germaschewski.name |
1437 | P: Sam Ravnborg | 1446 | P: Sam Ravnborg |
1438 | M: sam@ravnborg.org | 1447 | M: sam@ravnborg.org |
1448 | T: git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git | ||
1439 | S: Maintained | 1449 | S: Maintained |
1440 | 1450 | ||
1441 | KERNEL JANITORS | 1451 | KERNEL JANITORS |
@@ -1782,6 +1792,7 @@ M: akpm@osdl.org | |||
1782 | P: Jeff Garzik | 1792 | P: Jeff Garzik |
1783 | M: jgarzik@pobox.com | 1793 | M: jgarzik@pobox.com |
1784 | L: netdev@vger.kernel.org | 1794 | L: netdev@vger.kernel.org |
1795 | T: git kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git | ||
1785 | S: Maintained | 1796 | S: Maintained |
1786 | 1797 | ||
1787 | NETWORKING [GENERAL] | 1798 | NETWORKING [GENERAL] |
@@ -1959,6 +1970,7 @@ P: Greg Kroah-Hartman | |||
1959 | M: gregkh@suse.de | 1970 | M: gregkh@suse.de |
1960 | L: linux-kernel@vger.kernel.org | 1971 | L: linux-kernel@vger.kernel.org |
1961 | L: linux-pci@atrey.karlin.mff.cuni.cz | 1972 | L: linux-pci@atrey.karlin.mff.cuni.cz |
1973 | T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ | ||
1962 | S: Supported | 1974 | S: Supported |
1963 | 1975 | ||
1964 | PCI HOTPLUG CORE | 1976 | PCI HOTPLUG CORE |
@@ -1980,6 +1992,7 @@ S: Maintained | |||
1980 | PCMCIA SUBSYSTEM | 1992 | PCMCIA SUBSYSTEM |
1981 | P: Linux PCMCIA Team | 1993 | P: Linux PCMCIA Team |
1982 | L: http://lists.infradead.org/mailman/listinfo/linux-pcmcia | 1994 | L: http://lists.infradead.org/mailman/listinfo/linux-pcmcia |
1995 | T: git kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git | ||
1983 | S: Maintained | 1996 | S: Maintained |
1984 | 1997 | ||
1985 | PCNET32 NETWORK DRIVER | 1998 | PCNET32 NETWORK DRIVER |
@@ -2189,6 +2202,7 @@ SCSI SUBSYSTEM | |||
2189 | P: James E.J. Bottomley | 2202 | P: James E.J. Bottomley |
2190 | M: James.Bottomley@SteelEye.com | 2203 | M: James.Bottomley@SteelEye.com |
2191 | L: linux-scsi@vger.kernel.org | 2204 | L: linux-scsi@vger.kernel.org |
2205 | T: git kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git | ||
2192 | S: Maintained | 2206 | S: Maintained |
2193 | 2207 | ||
2194 | SCSI TAPE DRIVER | 2208 | SCSI TAPE DRIVER |
@@ -2228,6 +2242,7 @@ SERIAL ATA (SATA) SUBSYSTEM: | |||
2228 | P: Jeff Garzik | 2242 | P: Jeff Garzik |
2229 | M: jgarzik@pobox.com | 2243 | M: jgarzik@pobox.com |
2230 | L: linux-ide@vger.kernel.org | 2244 | L: linux-ide@vger.kernel.org |
2245 | T: git kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git | ||
2231 | S: Supported | 2246 | S: Supported |
2232 | 2247 | ||
2233 | SGI SN-IA64 (Altix) SERIAL CONSOLE DRIVER | 2248 | SGI SN-IA64 (Altix) SERIAL CONSOLE DRIVER |
@@ -2749,6 +2764,7 @@ M: gregkh@suse.de | |||
2749 | L: linux-usb-users@lists.sourceforge.net | 2764 | L: linux-usb-users@lists.sourceforge.net |
2750 | L: linux-usb-devel@lists.sourceforge.net | 2765 | L: linux-usb-devel@lists.sourceforge.net |
2751 | W: http://www.linux-usb.org | 2766 | W: http://www.linux-usb.org |
2767 | T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ | ||
2752 | S: Supported | 2768 | S: Supported |
2753 | 2769 | ||
2754 | USB UHCI DRIVER | 2770 | USB UHCI DRIVER |
diff --git a/arch/ia64/kernel/ivt.S b/arch/ia64/kernel/ivt.S index e06f21f60dc5..301f2e9d262e 100644 --- a/arch/ia64/kernel/ivt.S +++ b/arch/ia64/kernel/ivt.S | |||
@@ -91,16 +91,17 @@ ENTRY(vhpt_miss) | |||
91 | * (the "original") TLB miss, which may either be caused by an instruction | 91 | * (the "original") TLB miss, which may either be caused by an instruction |
92 | * fetch or a data access (or non-access). | 92 | * fetch or a data access (or non-access). |
93 | * | 93 | * |
94 | * What we do here is normal TLB miss handing for the _original_ miss, followed | 94 | * What we do here is normal TLB miss handing for the _original_ miss, |
95 | * by inserting the TLB entry for the virtual page table page that the VHPT | 95 | * followed by inserting the TLB entry for the virtual page table page |
96 | * walker was attempting to access. The latter gets inserted as long | 96 | * that the VHPT walker was attempting to access. The latter gets |
97 | * as both L1 and L2 have valid mappings for the faulting address. | 97 | * inserted as long as page table entry above pte level have valid |
98 | * The TLB entry for the original miss gets inserted only if | 98 | * mappings for the faulting address. The TLB entry for the original |
99 | * the L3 entry indicates that the page is present. | 99 | * miss gets inserted only if the pte entry indicates that the page is |
100 | * present. | ||
100 | * | 101 | * |
101 | * do_page_fault gets invoked in the following cases: | 102 | * do_page_fault gets invoked in the following cases: |
102 | * - the faulting virtual address uses unimplemented address bits | 103 | * - the faulting virtual address uses unimplemented address bits |
103 | * - the faulting virtual address has no L1, L2, or L3 mapping | 104 | * - the faulting virtual address has no valid page table mapping |
104 | */ | 105 | */ |
105 | mov r16=cr.ifa // get address that caused the TLB miss | 106 | mov r16=cr.ifa // get address that caused the TLB miss |
106 | #ifdef CONFIG_HUGETLB_PAGE | 107 | #ifdef CONFIG_HUGETLB_PAGE |
@@ -126,7 +127,7 @@ ENTRY(vhpt_miss) | |||
126 | #endif | 127 | #endif |
127 | ;; | 128 | ;; |
128 | cmp.eq p6,p7=5,r17 // is IFA pointing into to region 5? | 129 | cmp.eq p6,p7=5,r17 // is IFA pointing into to region 5? |
129 | shr.u r18=r22,PGDIR_SHIFT // get bits 33-63 of the faulting address | 130 | shr.u r18=r22,PGDIR_SHIFT // get bottom portion of pgd index bit |
130 | ;; | 131 | ;; |
131 | (p7) dep r17=r17,r19,(PAGE_SHIFT-3),3 // put region number bits in place | 132 | (p7) dep r17=r17,r19,(PAGE_SHIFT-3),3 // put region number bits in place |
132 | 133 | ||
@@ -137,38 +138,38 @@ ENTRY(vhpt_miss) | |||
137 | (p6) shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT | 138 | (p6) shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT |
138 | (p7) shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT-3 | 139 | (p7) shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT-3 |
139 | ;; | 140 | ;; |
140 | (p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=PTA + IFA(33,42)*8 | 141 | (p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=pgd_offset for region 5 |
141 | (p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=PTA + (((IFA(61,63) << 7) | IFA(33,39))*8) | 142 | (p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=pgd_offset for region[0-4] |
142 | cmp.eq p7,p6=0,r21 // unused address bits all zeroes? | 143 | cmp.eq p7,p6=0,r21 // unused address bits all zeroes? |
143 | #ifdef CONFIG_PGTABLE_4 | 144 | #ifdef CONFIG_PGTABLE_4 |
144 | shr.u r28=r22,PUD_SHIFT // shift L2 index into position | 145 | shr.u r28=r22,PUD_SHIFT // shift pud index into position |
145 | #else | 146 | #else |
146 | shr.u r18=r22,PMD_SHIFT // shift L3 index into position | 147 | shr.u r18=r22,PMD_SHIFT // shift pmd index into position |
147 | #endif | 148 | #endif |
148 | ;; | 149 | ;; |
149 | ld8 r17=[r17] // fetch the L1 entry (may be 0) | 150 | ld8 r17=[r17] // get *pgd (may be 0) |
150 | ;; | 151 | ;; |
151 | (p7) cmp.eq p6,p7=r17,r0 // was L1 entry NULL? | 152 | (p7) cmp.eq p6,p7=r17,r0 // was pgd_present(*pgd) == NULL? |
152 | #ifdef CONFIG_PGTABLE_4 | 153 | #ifdef CONFIG_PGTABLE_4 |
153 | dep r28=r28,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry | 154 | dep r28=r28,r17,3,(PAGE_SHIFT-3) // r28=pud_offset(pgd,addr) |
154 | ;; | 155 | ;; |
155 | shr.u r18=r22,PMD_SHIFT // shift L3 index into position | 156 | shr.u r18=r22,PMD_SHIFT // shift pmd index into position |
156 | (p7) ld8 r29=[r28] // fetch the L2 entry (may be 0) | 157 | (p7) ld8 r29=[r28] // get *pud (may be 0) |
157 | ;; | 158 | ;; |
158 | (p7) cmp.eq.or.andcm p6,p7=r29,r0 // was L2 entry NULL? | 159 | (p7) cmp.eq.or.andcm p6,p7=r29,r0 // was pud_present(*pud) == NULL? |
159 | dep r17=r18,r29,3,(PAGE_SHIFT-3) // compute address of L3 page table entry | 160 | dep r17=r18,r29,3,(PAGE_SHIFT-3) // r17=pmd_offset(pud,addr) |
160 | #else | 161 | #else |
161 | dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L3 page table entry | 162 | dep r17=r18,r17,3,(PAGE_SHIFT-3) // r17=pmd_offset(pgd,addr) |
162 | #endif | 163 | #endif |
163 | ;; | 164 | ;; |
164 | (p7) ld8 r20=[r17] // fetch the L3 entry (may be 0) | 165 | (p7) ld8 r20=[r17] // get *pmd (may be 0) |
165 | shr.u r19=r22,PAGE_SHIFT // shift L4 index into position | 166 | shr.u r19=r22,PAGE_SHIFT // shift pte index into position |
166 | ;; | 167 | ;; |
167 | (p7) cmp.eq.or.andcm p6,p7=r20,r0 // was L3 entry NULL? | 168 | (p7) cmp.eq.or.andcm p6,p7=r20,r0 // was pmd_present(*pmd) == NULL? |
168 | dep r21=r19,r20,3,(PAGE_SHIFT-3) // compute address of L4 page table entry | 169 | dep r21=r19,r20,3,(PAGE_SHIFT-3) // r21=pte_offset(pmd,addr) |
169 | ;; | 170 | ;; |
170 | (p7) ld8 r18=[r21] // read the L4 PTE | 171 | (p7) ld8 r18=[r21] // read *pte |
171 | mov r19=cr.isr // cr.isr bit 0 tells us if this is an insn miss | 172 | mov r19=cr.isr // cr.isr bit 32 tells us if this is an insn miss |
172 | ;; | 173 | ;; |
173 | (p7) tbit.z p6,p7=r18,_PAGE_P_BIT // page present bit cleared? | 174 | (p7) tbit.z p6,p7=r18,_PAGE_P_BIT // page present bit cleared? |
174 | mov r22=cr.iha // get the VHPT address that caused the TLB miss | 175 | mov r22=cr.iha // get the VHPT address that caused the TLB miss |
@@ -202,25 +203,33 @@ ENTRY(vhpt_miss) | |||
202 | dv_serialize_data | 203 | dv_serialize_data |
203 | 204 | ||
204 | /* | 205 | /* |
205 | * Re-check L2 and L3 pagetable. If they changed, we may have received a ptc.g | 206 | * Re-check pagetable entry. If they changed, we may have received a ptc.g |
206 | * between reading the pagetable and the "itc". If so, flush the entry we | 207 | * between reading the pagetable and the "itc". If so, flush the entry we |
207 | * inserted and retry. | 208 | * inserted and retry. At this point, we have: |
209 | * | ||
210 | * r28 = equivalent of pud_offset(pgd, ifa) | ||
211 | * r17 = equivalent of pmd_offset(pud, ifa) | ||
212 | * r21 = equivalent of pte_offset(pmd, ifa) | ||
213 | * | ||
214 | * r29 = *pud | ||
215 | * r20 = *pmd | ||
216 | * r18 = *pte | ||
208 | */ | 217 | */ |
209 | ld8 r25=[r21] // read L4 entry again | 218 | ld8 r25=[r21] // read *pte again |
210 | ld8 r26=[r17] // read L3 PTE again | 219 | ld8 r26=[r17] // read *pmd again |
211 | #ifdef CONFIG_PGTABLE_4 | 220 | #ifdef CONFIG_PGTABLE_4 |
212 | ld8 r18=[r28] // read L2 entry again | 221 | ld8 r19=[r28] // read *pud again |
213 | #endif | 222 | #endif |
214 | cmp.ne p6,p7=r0,r0 | 223 | cmp.ne p6,p7=r0,r0 |
215 | ;; | 224 | ;; |
216 | cmp.ne.or.andcm p6,p7=r26,r20 // did L3 entry change | 225 | cmp.ne.or.andcm p6,p7=r26,r20 // did *pmd change |
217 | #ifdef CONFIG_PGTABLE_4 | 226 | #ifdef CONFIG_PGTABLE_4 |
218 | cmp.ne.or.andcm p6,p7=r29,r18 // did L4 PTE change | 227 | cmp.ne.or.andcm p6,p7=r19,r29 // did *pud change |
219 | #endif | 228 | #endif |
220 | mov r27=PAGE_SHIFT<<2 | 229 | mov r27=PAGE_SHIFT<<2 |
221 | ;; | 230 | ;; |
222 | (p6) ptc.l r22,r27 // purge PTE page translation | 231 | (p6) ptc.l r22,r27 // purge PTE page translation |
223 | (p7) cmp.ne.or.andcm p6,p7=r25,r18 // did L4 PTE change | 232 | (p7) cmp.ne.or.andcm p6,p7=r25,r18 // did *pte change |
224 | ;; | 233 | ;; |
225 | (p6) ptc.l r16,r27 // purge translation | 234 | (p6) ptc.l r16,r27 // purge translation |
226 | #endif | 235 | #endif |
@@ -235,19 +244,19 @@ END(vhpt_miss) | |||
235 | ENTRY(itlb_miss) | 244 | ENTRY(itlb_miss) |
236 | DBG_FAULT(1) | 245 | DBG_FAULT(1) |
237 | /* | 246 | /* |
238 | * The ITLB handler accesses the L3 PTE via the virtually mapped linear | 247 | * The ITLB handler accesses the PTE via the virtually mapped linear |
239 | * page table. If a nested TLB miss occurs, we switch into physical | 248 | * page table. If a nested TLB miss occurs, we switch into physical |
240 | * mode, walk the page table, and then re-execute the L3 PTE read | 249 | * mode, walk the page table, and then re-execute the PTE read and |
241 | * and go on normally after that. | 250 | * go on normally after that. |
242 | */ | 251 | */ |
243 | mov r16=cr.ifa // get virtual address | 252 | mov r16=cr.ifa // get virtual address |
244 | mov r29=b0 // save b0 | 253 | mov r29=b0 // save b0 |
245 | mov r31=pr // save predicates | 254 | mov r31=pr // save predicates |
246 | .itlb_fault: | 255 | .itlb_fault: |
247 | mov r17=cr.iha // get virtual address of L3 PTE | 256 | mov r17=cr.iha // get virtual address of PTE |
248 | movl r30=1f // load nested fault continuation point | 257 | movl r30=1f // load nested fault continuation point |
249 | ;; | 258 | ;; |
250 | 1: ld8 r18=[r17] // read L3 PTE | 259 | 1: ld8 r18=[r17] // read *pte |
251 | ;; | 260 | ;; |
252 | mov b0=r29 | 261 | mov b0=r29 |
253 | tbit.z p6,p0=r18,_PAGE_P_BIT // page present bit cleared? | 262 | tbit.z p6,p0=r18,_PAGE_P_BIT // page present bit cleared? |
@@ -262,7 +271,7 @@ ENTRY(itlb_miss) | |||
262 | */ | 271 | */ |
263 | dv_serialize_data | 272 | dv_serialize_data |
264 | 273 | ||
265 | ld8 r19=[r17] // read L3 PTE again and see if same | 274 | ld8 r19=[r17] // read *pte again and see if same |
266 | mov r20=PAGE_SHIFT<<2 // setup page size for purge | 275 | mov r20=PAGE_SHIFT<<2 // setup page size for purge |
267 | ;; | 276 | ;; |
268 | cmp.ne p7,p0=r18,r19 | 277 | cmp.ne p7,p0=r18,r19 |
@@ -279,19 +288,19 @@ END(itlb_miss) | |||
279 | ENTRY(dtlb_miss) | 288 | ENTRY(dtlb_miss) |
280 | DBG_FAULT(2) | 289 | DBG_FAULT(2) |
281 | /* | 290 | /* |
282 | * The DTLB handler accesses the L3 PTE via the virtually mapped linear | 291 | * The DTLB handler accesses the PTE via the virtually mapped linear |
283 | * page table. If a nested TLB miss occurs, we switch into physical | 292 | * page table. If a nested TLB miss occurs, we switch into physical |
284 | * mode, walk the page table, and then re-execute the L3 PTE read | 293 | * mode, walk the page table, and then re-execute the PTE read and |
285 | * and go on normally after that. | 294 | * go on normally after that. |
286 | */ | 295 | */ |
287 | mov r16=cr.ifa // get virtual address | 296 | mov r16=cr.ifa // get virtual address |
288 | mov r29=b0 // save b0 | 297 | mov r29=b0 // save b0 |
289 | mov r31=pr // save predicates | 298 | mov r31=pr // save predicates |
290 | dtlb_fault: | 299 | dtlb_fault: |
291 | mov r17=cr.iha // get virtual address of L3 PTE | 300 | mov r17=cr.iha // get virtual address of PTE |
292 | movl r30=1f // load nested fault continuation point | 301 | movl r30=1f // load nested fault continuation point |
293 | ;; | 302 | ;; |
294 | 1: ld8 r18=[r17] // read L3 PTE | 303 | 1: ld8 r18=[r17] // read *pte |
295 | ;; | 304 | ;; |
296 | mov b0=r29 | 305 | mov b0=r29 |
297 | tbit.z p6,p0=r18,_PAGE_P_BIT // page present bit cleared? | 306 | tbit.z p6,p0=r18,_PAGE_P_BIT // page present bit cleared? |
@@ -306,7 +315,7 @@ dtlb_fault: | |||
306 | */ | 315 | */ |
307 | dv_serialize_data | 316 | dv_serialize_data |
308 | 317 | ||
309 | ld8 r19=[r17] // read L3 PTE again and see if same | 318 | ld8 r19=[r17] // read *pte again and see if same |
310 | mov r20=PAGE_SHIFT<<2 // setup page size for purge | 319 | mov r20=PAGE_SHIFT<<2 // setup page size for purge |
311 | ;; | 320 | ;; |
312 | cmp.ne p7,p0=r18,r19 | 321 | cmp.ne p7,p0=r18,r19 |
@@ -420,7 +429,7 @@ ENTRY(nested_dtlb_miss) | |||
420 | * r30: continuation address | 429 | * r30: continuation address |
421 | * r31: saved pr | 430 | * r31: saved pr |
422 | * | 431 | * |
423 | * Output: r17: physical address of L3 PTE of faulting address | 432 | * Output: r17: physical address of PTE of faulting address |
424 | * r29: saved b0 | 433 | * r29: saved b0 |
425 | * r30: continuation address | 434 | * r30: continuation address |
426 | * r31: saved pr | 435 | * r31: saved pr |
@@ -450,33 +459,33 @@ ENTRY(nested_dtlb_miss) | |||
450 | (p6) shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT | 459 | (p6) shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT |
451 | (p7) shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT-3 | 460 | (p7) shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT-3 |
452 | ;; | 461 | ;; |
453 | (p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=PTA + IFA(33,42)*8 | 462 | (p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=pgd_offset for region 5 |
454 | (p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=PTA + (((IFA(61,63) << 7) | IFA(33,39))*8) | 463 | (p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=pgd_offset for region[0-4] |
455 | cmp.eq p7,p6=0,r21 // unused address bits all zeroes? | 464 | cmp.eq p7,p6=0,r21 // unused address bits all zeroes? |
456 | #ifdef CONFIG_PGTABLE_4 | 465 | #ifdef CONFIG_PGTABLE_4 |
457 | shr.u r18=r22,PUD_SHIFT // shift L2 index into position | 466 | shr.u r18=r22,PUD_SHIFT // shift pud index into position |
458 | #else | 467 | #else |
459 | shr.u r18=r22,PMD_SHIFT // shift L3 index into position | 468 | shr.u r18=r22,PMD_SHIFT // shift pmd index into position |
460 | #endif | 469 | #endif |
461 | ;; | 470 | ;; |
462 | ld8 r17=[r17] // fetch the L1 entry (may be 0) | 471 | ld8 r17=[r17] // get *pgd (may be 0) |
463 | ;; | 472 | ;; |
464 | (p7) cmp.eq p6,p7=r17,r0 // was L1 entry NULL? | 473 | (p7) cmp.eq p6,p7=r17,r0 // was pgd_present(*pgd) == NULL? |
465 | dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry | 474 | dep r17=r18,r17,3,(PAGE_SHIFT-3) // r17=p[u|m]d_offset(pgd,addr) |
466 | ;; | 475 | ;; |
467 | #ifdef CONFIG_PGTABLE_4 | 476 | #ifdef CONFIG_PGTABLE_4 |
468 | (p7) ld8 r17=[r17] // fetch the L2 entry (may be 0) | 477 | (p7) ld8 r17=[r17] // get *pud (may be 0) |
469 | shr.u r18=r22,PMD_SHIFT // shift L3 index into position | 478 | shr.u r18=r22,PMD_SHIFT // shift pmd index into position |
470 | ;; | 479 | ;; |
471 | (p7) cmp.eq.or.andcm p6,p7=r17,r0 // was L2 entry NULL? | 480 | (p7) cmp.eq.or.andcm p6,p7=r17,r0 // was pud_present(*pud) == NULL? |
472 | dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry | 481 | dep r17=r18,r17,3,(PAGE_SHIFT-3) // r17=pmd_offset(pud,addr) |
473 | ;; | 482 | ;; |
474 | #endif | 483 | #endif |
475 | (p7) ld8 r17=[r17] // fetch the L3 entry (may be 0) | 484 | (p7) ld8 r17=[r17] // get *pmd (may be 0) |
476 | shr.u r19=r22,PAGE_SHIFT // shift L4 index into position | 485 | shr.u r19=r22,PAGE_SHIFT // shift pte index into position |
477 | ;; | 486 | ;; |
478 | (p7) cmp.eq.or.andcm p6,p7=r17,r0 // was L3 entry NULL? | 487 | (p7) cmp.eq.or.andcm p6,p7=r17,r0 // was pmd_present(*pmd) == NULL? |
479 | dep r17=r19,r17,3,(PAGE_SHIFT-3) // compute address of L4 page table entry | 488 | dep r17=r19,r17,3,(PAGE_SHIFT-3) // r17=pte_offset(pmd,addr); |
480 | (p6) br.cond.spnt page_fault | 489 | (p6) br.cond.spnt page_fault |
481 | mov b0=r30 | 490 | mov b0=r30 |
482 | br.sptk.many b0 // return to continuation point | 491 | br.sptk.many b0 // return to continuation point |
diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c index 988844a169e6..d016d672ec2b 100644 --- a/arch/parisc/kernel/drivers.c +++ b/arch/parisc/kernel/drivers.c | |||
@@ -499,8 +499,12 @@ alloc_pa_dev(unsigned long hpa, struct hardware_path *mod_path) | |||
499 | 499 | ||
500 | dev = create_parisc_device(mod_path); | 500 | dev = create_parisc_device(mod_path); |
501 | if (dev->id.hw_type != HPHW_FAULTY) { | 501 | if (dev->id.hw_type != HPHW_FAULTY) { |
502 | printk("Two devices have hardware path %s. Please file a bug with HP.\n" | 502 | printk(KERN_ERR "Two devices have hardware path [%s]. " |
503 | "In the meantime, you could try rearranging your cards.\n", parisc_pathname(dev)); | 503 | "IODC data for second device: " |
504 | "%02x%02x%02x%02x%02x%02x\n" | ||
505 | "Rearranging GSC cards sometimes helps\n", | ||
506 | parisc_pathname(dev), iodc_data[0], iodc_data[1], | ||
507 | iodc_data[3], iodc_data[4], iodc_data[5], iodc_data[6]); | ||
504 | return NULL; | 508 | return NULL; |
505 | } | 509 | } |
506 | 510 | ||
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index c7e66ee5b083..9af4b22a6d77 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
@@ -1846,6 +1846,7 @@ sys_clone_wrapper: | |||
1846 | ldo -16(%r30),%r29 /* Reference param save area */ | 1846 | ldo -16(%r30),%r29 /* Reference param save area */ |
1847 | #endif | 1847 | #endif |
1848 | 1848 | ||
1849 | /* WARNING - Clobbers r19 and r21, userspace must save these! */ | ||
1849 | STREG %r2,PT_GR19(%r1) /* save for child */ | 1850 | STREG %r2,PT_GR19(%r1) /* save for child */ |
1850 | STREG %r30,PT_GR21(%r1) | 1851 | STREG %r30,PT_GR21(%r1) |
1851 | BL sys_clone,%r2 | 1852 | BL sys_clone,%r2 |
diff --git a/arch/parisc/kernel/inventory.c b/arch/parisc/kernel/inventory.c index 1a1c66422736..8f563871e83c 100644 --- a/arch/parisc/kernel/inventory.c +++ b/arch/parisc/kernel/inventory.c | |||
@@ -188,7 +188,7 @@ pat_query_module(ulong pcell_loc, ulong mod_index) | |||
188 | temp = pa_pdc_cell.cba; | 188 | temp = pa_pdc_cell.cba; |
189 | dev = alloc_pa_dev(PAT_GET_CBA(temp), &pa_pdc_cell.mod_path); | 189 | dev = alloc_pa_dev(PAT_GET_CBA(temp), &pa_pdc_cell.mod_path); |
190 | if (!dev) { | 190 | if (!dev) { |
191 | return PDC_NE_MOD; | 191 | return PDC_OK; |
192 | } | 192 | } |
193 | 193 | ||
194 | /* alloc_pa_dev sets dev->hpa */ | 194 | /* alloc_pa_dev sets dev->hpa */ |
diff --git a/arch/parisc/kernel/ioctl32.c b/arch/parisc/kernel/ioctl32.c index 0a331104ad56..4eada1bb27f0 100644 --- a/arch/parisc/kernel/ioctl32.c +++ b/arch/parisc/kernel/ioctl32.c | |||
@@ -19,536 +19,6 @@ | |||
19 | #define CODE | 19 | #define CODE |
20 | #include "compat_ioctl.c" | 20 | #include "compat_ioctl.c" |
21 | 21 | ||
22 | /* Use this to get at 32-bit user passed pointers. | ||
23 | See sys_sparc32.c for description about these. */ | ||
24 | #define A(__x) ((unsigned long)(__x)) | ||
25 | /* The same for use with copy_from_user() and copy_to_user(). */ | ||
26 | #define B(__x) ((void *)(unsigned long)(__x)) | ||
27 | |||
28 | #if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE) | ||
29 | /* This really belongs in include/linux/drm.h -DaveM */ | ||
30 | #include "../../../drivers/char/drm/drm.h" | ||
31 | |||
32 | typedef struct drm32_version { | ||
33 | int version_major; /* Major version */ | ||
34 | int version_minor; /* Minor version */ | ||
35 | int version_patchlevel;/* Patch level */ | ||
36 | int name_len; /* Length of name buffer */ | ||
37 | u32 name; /* Name of driver */ | ||
38 | int date_len; /* Length of date buffer */ | ||
39 | u32 date; /* User-space buffer to hold date */ | ||
40 | int desc_len; /* Length of desc buffer */ | ||
41 | u32 desc; /* User-space buffer to hold desc */ | ||
42 | } drm32_version_t; | ||
43 | #define DRM32_IOCTL_VERSION DRM_IOWR(0x00, drm32_version_t) | ||
44 | |||
45 | static int drm32_version(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
46 | { | ||
47 | drm32_version_t *uversion = (drm32_version_t *)arg; | ||
48 | char *name_ptr, *date_ptr, *desc_ptr; | ||
49 | u32 tmp1, tmp2, tmp3; | ||
50 | drm_version_t kversion; | ||
51 | mm_segment_t old_fs; | ||
52 | int ret; | ||
53 | |||
54 | memset(&kversion, 0, sizeof(kversion)); | ||
55 | if (get_user(kversion.name_len, &uversion->name_len) || | ||
56 | get_user(kversion.date_len, &uversion->date_len) || | ||
57 | get_user(kversion.desc_len, &uversion->desc_len) || | ||
58 | get_user(tmp1, &uversion->name) || | ||
59 | get_user(tmp2, &uversion->date) || | ||
60 | get_user(tmp3, &uversion->desc)) | ||
61 | return -EFAULT; | ||
62 | |||
63 | name_ptr = (char *) A(tmp1); | ||
64 | date_ptr = (char *) A(tmp2); | ||
65 | desc_ptr = (char *) A(tmp3); | ||
66 | |||
67 | ret = -ENOMEM; | ||
68 | if (kversion.name_len && name_ptr) { | ||
69 | kversion.name = kmalloc(kversion.name_len, GFP_KERNEL); | ||
70 | if (!kversion.name) | ||
71 | goto out; | ||
72 | } | ||
73 | if (kversion.date_len && date_ptr) { | ||
74 | kversion.date = kmalloc(kversion.date_len, GFP_KERNEL); | ||
75 | if (!kversion.date) | ||
76 | goto out; | ||
77 | } | ||
78 | if (kversion.desc_len && desc_ptr) { | ||
79 | kversion.desc = kmalloc(kversion.desc_len, GFP_KERNEL); | ||
80 | if (!kversion.desc) | ||
81 | goto out; | ||
82 | } | ||
83 | |||
84 | old_fs = get_fs(); | ||
85 | set_fs(KERNEL_DS); | ||
86 | ret = sys_ioctl (fd, DRM_IOCTL_VERSION, (unsigned long)&kversion); | ||
87 | set_fs(old_fs); | ||
88 | |||
89 | if (!ret) { | ||
90 | if ((kversion.name && | ||
91 | copy_to_user(name_ptr, kversion.name, kversion.name_len)) || | ||
92 | (kversion.date && | ||
93 | copy_to_user(date_ptr, kversion.date, kversion.date_len)) || | ||
94 | (kversion.desc && | ||
95 | copy_to_user(desc_ptr, kversion.desc, kversion.desc_len))) | ||
96 | ret = -EFAULT; | ||
97 | if (put_user(kversion.version_major, &uversion->version_major) || | ||
98 | put_user(kversion.version_minor, &uversion->version_minor) || | ||
99 | put_user(kversion.version_patchlevel, &uversion->version_patchlevel) || | ||
100 | put_user(kversion.name_len, &uversion->name_len) || | ||
101 | put_user(kversion.date_len, &uversion->date_len) || | ||
102 | put_user(kversion.desc_len, &uversion->desc_len)) | ||
103 | ret = -EFAULT; | ||
104 | } | ||
105 | |||
106 | out: | ||
107 | kfree(kversion.name); | ||
108 | kfree(kversion.date); | ||
109 | kfree(kversion.desc); | ||
110 | return ret; | ||
111 | } | ||
112 | |||
113 | typedef struct drm32_unique { | ||
114 | int unique_len; /* Length of unique */ | ||
115 | u32 unique; /* Unique name for driver instantiation */ | ||
116 | } drm32_unique_t; | ||
117 | #define DRM32_IOCTL_GET_UNIQUE DRM_IOWR(0x01, drm32_unique_t) | ||
118 | #define DRM32_IOCTL_SET_UNIQUE DRM_IOW( 0x10, drm32_unique_t) | ||
119 | |||
120 | static int drm32_getsetunique(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
121 | { | ||
122 | drm32_unique_t *uarg = (drm32_unique_t *)arg; | ||
123 | drm_unique_t karg; | ||
124 | mm_segment_t old_fs; | ||
125 | char *uptr; | ||
126 | u32 tmp; | ||
127 | int ret; | ||
128 | |||
129 | if (get_user(karg.unique_len, &uarg->unique_len)) | ||
130 | return -EFAULT; | ||
131 | karg.unique = NULL; | ||
132 | |||
133 | if (get_user(tmp, &uarg->unique)) | ||
134 | return -EFAULT; | ||
135 | |||
136 | uptr = (char *) A(tmp); | ||
137 | |||
138 | if (uptr) { | ||
139 | karg.unique = kmalloc(karg.unique_len, GFP_KERNEL); | ||
140 | if (!karg.unique) | ||
141 | return -ENOMEM; | ||
142 | if (cmd == DRM32_IOCTL_SET_UNIQUE && | ||
143 | copy_from_user(karg.unique, uptr, karg.unique_len)) { | ||
144 | kfree(karg.unique); | ||
145 | return -EFAULT; | ||
146 | } | ||
147 | } | ||
148 | |||
149 | old_fs = get_fs(); | ||
150 | set_fs(KERNEL_DS); | ||
151 | if (cmd == DRM32_IOCTL_GET_UNIQUE) | ||
152 | ret = sys_ioctl (fd, DRM_IOCTL_GET_UNIQUE, (unsigned long)&karg); | ||
153 | else | ||
154 | ret = sys_ioctl (fd, DRM_IOCTL_SET_UNIQUE, (unsigned long)&karg); | ||
155 | set_fs(old_fs); | ||
156 | |||
157 | if (!ret) { | ||
158 | if (cmd == DRM32_IOCTL_GET_UNIQUE && | ||
159 | uptr != NULL && | ||
160 | copy_to_user(uptr, karg.unique, karg.unique_len)) | ||
161 | ret = -EFAULT; | ||
162 | if (put_user(karg.unique_len, &uarg->unique_len)) | ||
163 | ret = -EFAULT; | ||
164 | } | ||
165 | |||
166 | kfree(karg.unique); | ||
167 | return ret; | ||
168 | } | ||
169 | |||
170 | typedef struct drm32_map { | ||
171 | u32 offset; /* Requested physical address (0 for SAREA)*/ | ||
172 | u32 size; /* Requested physical size (bytes) */ | ||
173 | drm_map_type_t type; /* Type of memory to map */ | ||
174 | drm_map_flags_t flags; /* Flags */ | ||
175 | u32 handle; /* User-space: "Handle" to pass to mmap */ | ||
176 | /* Kernel-space: kernel-virtual address */ | ||
177 | int mtrr; /* MTRR slot used */ | ||
178 | /* Private data */ | ||
179 | } drm32_map_t; | ||
180 | #define DRM32_IOCTL_ADD_MAP DRM_IOWR(0x15, drm32_map_t) | ||
181 | |||
182 | static int drm32_addmap(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
183 | { | ||
184 | drm32_map_t *uarg = (drm32_map_t *) arg; | ||
185 | drm_map_t karg; | ||
186 | mm_segment_t old_fs; | ||
187 | u32 tmp; | ||
188 | int ret; | ||
189 | |||
190 | ret = get_user(karg.offset, &uarg->offset); | ||
191 | ret |= get_user(karg.size, &uarg->size); | ||
192 | ret |= get_user(karg.type, &uarg->type); | ||
193 | ret |= get_user(karg.flags, &uarg->flags); | ||
194 | ret |= get_user(tmp, &uarg->handle); | ||
195 | ret |= get_user(karg.mtrr, &uarg->mtrr); | ||
196 | if (ret) | ||
197 | return -EFAULT; | ||
198 | |||
199 | karg.handle = (void *) A(tmp); | ||
200 | |||
201 | old_fs = get_fs(); | ||
202 | set_fs(KERNEL_DS); | ||
203 | ret = sys_ioctl(fd, DRM_IOCTL_ADD_MAP, (unsigned long) &karg); | ||
204 | set_fs(old_fs); | ||
205 | |||
206 | if (!ret) { | ||
207 | ret = put_user(karg.offset, &uarg->offset); | ||
208 | ret |= put_user(karg.size, &uarg->size); | ||
209 | ret |= put_user(karg.type, &uarg->type); | ||
210 | ret |= put_user(karg.flags, &uarg->flags); | ||
211 | tmp = (u32) (long)karg.handle; | ||
212 | ret |= put_user(tmp, &uarg->handle); | ||
213 | ret |= put_user(karg.mtrr, &uarg->mtrr); | ||
214 | if (ret) | ||
215 | ret = -EFAULT; | ||
216 | } | ||
217 | |||
218 | return ret; | ||
219 | } | ||
220 | |||
221 | typedef struct drm32_buf_info { | ||
222 | int count; /* Entries in list */ | ||
223 | u32 list; /* (drm_buf_desc_t *) */ | ||
224 | } drm32_buf_info_t; | ||
225 | #define DRM32_IOCTL_INFO_BUFS DRM_IOWR(0x18, drm32_buf_info_t) | ||
226 | |||
227 | static int drm32_info_bufs(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
228 | { | ||
229 | drm32_buf_info_t *uarg = (drm32_buf_info_t *)arg; | ||
230 | drm_buf_desc_t *ulist; | ||
231 | drm_buf_info_t karg; | ||
232 | mm_segment_t old_fs; | ||
233 | int orig_count, ret; | ||
234 | u32 tmp; | ||
235 | |||
236 | if (get_user(karg.count, &uarg->count) || | ||
237 | get_user(tmp, &uarg->list)) | ||
238 | return -EFAULT; | ||
239 | |||
240 | ulist = (drm_buf_desc_t *) A(tmp); | ||
241 | |||
242 | orig_count = karg.count; | ||
243 | |||
244 | karg.list = kmalloc(karg.count * sizeof(drm_buf_desc_t), GFP_KERNEL); | ||
245 | if (!karg.list) | ||
246 | return -EFAULT; | ||
247 | |||
248 | old_fs = get_fs(); | ||
249 | set_fs(KERNEL_DS); | ||
250 | ret = sys_ioctl(fd, DRM_IOCTL_INFO_BUFS, (unsigned long) &karg); | ||
251 | set_fs(old_fs); | ||
252 | |||
253 | if (!ret) { | ||
254 | if (karg.count <= orig_count && | ||
255 | (copy_to_user(ulist, karg.list, | ||
256 | karg.count * sizeof(drm_buf_desc_t)))) | ||
257 | ret = -EFAULT; | ||
258 | if (put_user(karg.count, &uarg->count)) | ||
259 | ret = -EFAULT; | ||
260 | } | ||
261 | |||
262 | kfree(karg.list); | ||
263 | return ret; | ||
264 | } | ||
265 | |||
266 | typedef struct drm32_buf_free { | ||
267 | int count; | ||
268 | u32 list; /* (int *) */ | ||
269 | } drm32_buf_free_t; | ||
270 | #define DRM32_IOCTL_FREE_BUFS DRM_IOW( 0x1a, drm32_buf_free_t) | ||
271 | |||
272 | static int drm32_free_bufs(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
273 | { | ||
274 | drm32_buf_free_t *uarg = (drm32_buf_free_t *)arg; | ||
275 | drm_buf_free_t karg; | ||
276 | mm_segment_t old_fs; | ||
277 | int *ulist; | ||
278 | int ret; | ||
279 | u32 tmp; | ||
280 | |||
281 | if (get_user(karg.count, &uarg->count) || | ||
282 | get_user(tmp, &uarg->list)) | ||
283 | return -EFAULT; | ||
284 | |||
285 | ulist = (int *) A(tmp); | ||
286 | |||
287 | karg.list = kmalloc(karg.count * sizeof(int), GFP_KERNEL); | ||
288 | if (!karg.list) | ||
289 | return -ENOMEM; | ||
290 | |||
291 | ret = -EFAULT; | ||
292 | if (copy_from_user(karg.list, ulist, (karg.count * sizeof(int)))) | ||
293 | goto out; | ||
294 | |||
295 | old_fs = get_fs(); | ||
296 | set_fs(KERNEL_DS); | ||
297 | ret = sys_ioctl(fd, DRM_IOCTL_FREE_BUFS, (unsigned long) &karg); | ||
298 | set_fs(old_fs); | ||
299 | |||
300 | out: | ||
301 | kfree(karg.list); | ||
302 | return ret; | ||
303 | } | ||
304 | |||
305 | typedef struct drm32_buf_pub { | ||
306 | int idx; /* Index into master buflist */ | ||
307 | int total; /* Buffer size */ | ||
308 | int used; /* Amount of buffer in use (for DMA) */ | ||
309 | u32 address; /* Address of buffer (void *) */ | ||
310 | } drm32_buf_pub_t; | ||
311 | |||
312 | typedef struct drm32_buf_map { | ||
313 | int count; /* Length of buflist */ | ||
314 | u32 virtual; /* Mmaped area in user-virtual (void *) */ | ||
315 | u32 list; /* Buffer information (drm_buf_pub_t *) */ | ||
316 | } drm32_buf_map_t; | ||
317 | #define DRM32_IOCTL_MAP_BUFS DRM_IOWR(0x19, drm32_buf_map_t) | ||
318 | |||
319 | static int drm32_map_bufs(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
320 | { | ||
321 | drm32_buf_map_t *uarg = (drm32_buf_map_t *)arg; | ||
322 | drm32_buf_pub_t *ulist; | ||
323 | drm_buf_map_t karg; | ||
324 | mm_segment_t old_fs; | ||
325 | int orig_count, ret, i; | ||
326 | u32 tmp1, tmp2; | ||
327 | |||
328 | if (get_user(karg.count, &uarg->count) || | ||
329 | get_user(tmp1, &uarg->virtual) || | ||
330 | get_user(tmp2, &uarg->list)) | ||
331 | return -EFAULT; | ||
332 | |||
333 | karg.virtual = (void *) A(tmp1); | ||
334 | ulist = (drm32_buf_pub_t *) A(tmp2); | ||
335 | |||
336 | orig_count = karg.count; | ||
337 | |||
338 | karg.list = kmalloc(karg.count * sizeof(drm_buf_pub_t), GFP_KERNEL); | ||
339 | if (!karg.list) | ||
340 | return -ENOMEM; | ||
341 | |||
342 | ret = -EFAULT; | ||
343 | for (i = 0; i < karg.count; i++) { | ||
344 | if (get_user(karg.list[i].idx, &ulist[i].idx) || | ||
345 | get_user(karg.list[i].total, &ulist[i].total) || | ||
346 | get_user(karg.list[i].used, &ulist[i].used) || | ||
347 | get_user(tmp1, &ulist[i].address)) | ||
348 | goto out; | ||
349 | |||
350 | karg.list[i].address = (void *) A(tmp1); | ||
351 | } | ||
352 | |||
353 | old_fs = get_fs(); | ||
354 | set_fs(KERNEL_DS); | ||
355 | ret = sys_ioctl(fd, DRM_IOCTL_MAP_BUFS, (unsigned long) &karg); | ||
356 | set_fs(old_fs); | ||
357 | |||
358 | if (!ret) { | ||
359 | for (i = 0; i < orig_count; i++) { | ||
360 | tmp1 = (u32) (long) karg.list[i].address; | ||
361 | if (put_user(karg.list[i].idx, &ulist[i].idx) || | ||
362 | put_user(karg.list[i].total, &ulist[i].total) || | ||
363 | put_user(karg.list[i].used, &ulist[i].used) || | ||
364 | put_user(tmp1, &ulist[i].address)) { | ||
365 | ret = -EFAULT; | ||
366 | goto out; | ||
367 | } | ||
368 | } | ||
369 | if (put_user(karg.count, &uarg->count)) | ||
370 | ret = -EFAULT; | ||
371 | } | ||
372 | |||
373 | out: | ||
374 | kfree(karg.list); | ||
375 | return ret; | ||
376 | } | ||
377 | |||
378 | typedef struct drm32_dma { | ||
379 | /* Indices here refer to the offset into | ||
380 | buflist in drm_buf_get_t. */ | ||
381 | int context; /* Context handle */ | ||
382 | int send_count; /* Number of buffers to send */ | ||
383 | u32 send_indices; /* List of handles to buffers (int *) */ | ||
384 | u32 send_sizes; /* Lengths of data to send (int *) */ | ||
385 | drm_dma_flags_t flags; /* Flags */ | ||
386 | int request_count; /* Number of buffers requested */ | ||
387 | int request_size; /* Desired size for buffers */ | ||
388 | u32 request_indices; /* Buffer information (int *) */ | ||
389 | u32 request_sizes; /* (int *) */ | ||
390 | int granted_count; /* Number of buffers granted */ | ||
391 | } drm32_dma_t; | ||
392 | #define DRM32_IOCTL_DMA DRM_IOWR(0x29, drm32_dma_t) | ||
393 | |||
394 | /* RED PEN The DRM layer blindly dereferences the send/request | ||
395 | * indice/size arrays even though they are userland | ||
396 | * pointers. -DaveM | ||
397 | */ | ||
398 | static int drm32_dma(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
399 | { | ||
400 | drm32_dma_t *uarg = (drm32_dma_t *) arg; | ||
401 | int *u_si, *u_ss, *u_ri, *u_rs; | ||
402 | drm_dma_t karg; | ||
403 | mm_segment_t old_fs; | ||
404 | int ret; | ||
405 | u32 tmp1, tmp2, tmp3, tmp4; | ||
406 | |||
407 | karg.send_indices = karg.send_sizes = NULL; | ||
408 | karg.request_indices = karg.request_sizes = NULL; | ||
409 | |||
410 | if (get_user(karg.context, &uarg->context) || | ||
411 | get_user(karg.send_count, &uarg->send_count) || | ||
412 | get_user(tmp1, &uarg->send_indices) || | ||
413 | get_user(tmp2, &uarg->send_sizes) || | ||
414 | get_user(karg.flags, &uarg->flags) || | ||
415 | get_user(karg.request_count, &uarg->request_count) || | ||
416 | get_user(karg.request_size, &uarg->request_size) || | ||
417 | get_user(tmp3, &uarg->request_indices) || | ||
418 | get_user(tmp4, &uarg->request_sizes) || | ||
419 | get_user(karg.granted_count, &uarg->granted_count)) | ||
420 | return -EFAULT; | ||
421 | |||
422 | u_si = (int *) A(tmp1); | ||
423 | u_ss = (int *) A(tmp2); | ||
424 | u_ri = (int *) A(tmp3); | ||
425 | u_rs = (int *) A(tmp4); | ||
426 | |||
427 | if (karg.send_count) { | ||
428 | karg.send_indices = kmalloc(karg.send_count * sizeof(int), GFP_KERNEL); | ||
429 | karg.send_sizes = kmalloc(karg.send_count * sizeof(int), GFP_KERNEL); | ||
430 | |||
431 | ret = -ENOMEM; | ||
432 | if (!karg.send_indices || !karg.send_sizes) | ||
433 | goto out; | ||
434 | |||
435 | ret = -EFAULT; | ||
436 | if (copy_from_user(karg.send_indices, u_si, | ||
437 | (karg.send_count * sizeof(int))) || | ||
438 | copy_from_user(karg.send_sizes, u_ss, | ||
439 | (karg.send_count * sizeof(int)))) | ||
440 | goto out; | ||
441 | } | ||
442 | |||
443 | if (karg.request_count) { | ||
444 | karg.request_indices = kmalloc(karg.request_count * sizeof(int), GFP_KERNEL); | ||
445 | karg.request_sizes = kmalloc(karg.request_count * sizeof(int), GFP_KERNEL); | ||
446 | |||
447 | ret = -ENOMEM; | ||
448 | if (!karg.request_indices || !karg.request_sizes) | ||
449 | goto out; | ||
450 | |||
451 | ret = -EFAULT; | ||
452 | if (copy_from_user(karg.request_indices, u_ri, | ||
453 | (karg.request_count * sizeof(int))) || | ||
454 | copy_from_user(karg.request_sizes, u_rs, | ||
455 | (karg.request_count * sizeof(int)))) | ||
456 | goto out; | ||
457 | } | ||
458 | |||
459 | old_fs = get_fs(); | ||
460 | set_fs(KERNEL_DS); | ||
461 | ret = sys_ioctl(fd, DRM_IOCTL_DMA, (unsigned long) &karg); | ||
462 | set_fs(old_fs); | ||
463 | |||
464 | if (!ret) { | ||
465 | if (put_user(karg.context, &uarg->context) || | ||
466 | put_user(karg.send_count, &uarg->send_count) || | ||
467 | put_user(karg.flags, &uarg->flags) || | ||
468 | put_user(karg.request_count, &uarg->request_count) || | ||
469 | put_user(karg.request_size, &uarg->request_size) || | ||
470 | put_user(karg.granted_count, &uarg->granted_count)) | ||
471 | ret = -EFAULT; | ||
472 | |||
473 | if (karg.send_count) { | ||
474 | if (copy_to_user(u_si, karg.send_indices, | ||
475 | (karg.send_count * sizeof(int))) || | ||
476 | copy_to_user(u_ss, karg.send_sizes, | ||
477 | (karg.send_count * sizeof(int)))) | ||
478 | ret = -EFAULT; | ||
479 | } | ||
480 | if (karg.request_count) { | ||
481 | if (copy_to_user(u_ri, karg.request_indices, | ||
482 | (karg.request_count * sizeof(int))) || | ||
483 | copy_to_user(u_rs, karg.request_sizes, | ||
484 | (karg.request_count * sizeof(int)))) | ||
485 | ret = -EFAULT; | ||
486 | } | ||
487 | } | ||
488 | |||
489 | out: | ||
490 | kfree(karg.send_indices); | ||
491 | kfree(karg.send_sizes); | ||
492 | kfree(karg.request_indices); | ||
493 | kfree(karg.request_sizes); | ||
494 | return ret; | ||
495 | } | ||
496 | |||
497 | typedef struct drm32_ctx_res { | ||
498 | int count; | ||
499 | u32 contexts; /* (drm_ctx_t *) */ | ||
500 | } drm32_ctx_res_t; | ||
501 | #define DRM32_IOCTL_RES_CTX DRM_IOWR(0x26, drm32_ctx_res_t) | ||
502 | |||
503 | static int drm32_res_ctx(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
504 | { | ||
505 | drm32_ctx_res_t *uarg = (drm32_ctx_res_t *) arg; | ||
506 | drm_ctx_t *ulist; | ||
507 | drm_ctx_res_t karg; | ||
508 | mm_segment_t old_fs; | ||
509 | int orig_count, ret; | ||
510 | u32 tmp; | ||
511 | |||
512 | karg.contexts = NULL; | ||
513 | if (get_user(karg.count, &uarg->count) || | ||
514 | get_user(tmp, &uarg->contexts)) | ||
515 | return -EFAULT; | ||
516 | |||
517 | ulist = (drm_ctx_t *) A(tmp); | ||
518 | |||
519 | orig_count = karg.count; | ||
520 | if (karg.count && ulist) { | ||
521 | karg.contexts = kmalloc((karg.count * sizeof(drm_ctx_t)), GFP_KERNEL); | ||
522 | if (!karg.contexts) | ||
523 | return -ENOMEM; | ||
524 | if (copy_from_user(karg.contexts, ulist, | ||
525 | (karg.count * sizeof(drm_ctx_t)))) { | ||
526 | kfree(karg.contexts); | ||
527 | return -EFAULT; | ||
528 | } | ||
529 | } | ||
530 | |||
531 | old_fs = get_fs(); | ||
532 | set_fs(KERNEL_DS); | ||
533 | ret = sys_ioctl(fd, DRM_IOCTL_RES_CTX, (unsigned long) &karg); | ||
534 | set_fs(old_fs); | ||
535 | |||
536 | if (!ret) { | ||
537 | if (orig_count) { | ||
538 | if (copy_to_user(ulist, karg.contexts, | ||
539 | (orig_count * sizeof(drm_ctx_t)))) | ||
540 | ret = -EFAULT; | ||
541 | } | ||
542 | if (put_user(karg.count, &uarg->count)) | ||
543 | ret = -EFAULT; | ||
544 | } | ||
545 | |||
546 | kfree(karg.contexts); | ||
547 | return ret; | ||
548 | } | ||
549 | |||
550 | #endif | ||
551 | |||
552 | #define HANDLE_IOCTL(cmd, handler) { cmd, (ioctl_trans_handler_t)handler, NULL }, | 22 | #define HANDLE_IOCTL(cmd, handler) { cmd, (ioctl_trans_handler_t)handler, NULL }, |
553 | #define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL(cmd, sys_ioctl) | 23 | #define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL(cmd, sys_ioctl) |
554 | 24 | ||
@@ -561,11 +31,6 @@ IOCTL_TABLE_START | |||
561 | #define DECLARES | 31 | #define DECLARES |
562 | #include "compat_ioctl.c" | 32 | #include "compat_ioctl.c" |
563 | 33 | ||
564 | /* PA-specific ioctls */ | ||
565 | COMPATIBLE_IOCTL(PA_PERF_ON) | ||
566 | COMPATIBLE_IOCTL(PA_PERF_OFF) | ||
567 | COMPATIBLE_IOCTL(PA_PERF_VERSION) | ||
568 | |||
569 | /* And these ioctls need translation */ | 34 | /* And these ioctls need translation */ |
570 | HANDLE_IOCTL(SIOCGPPPSTATS, dev_ifsioc) | 35 | HANDLE_IOCTL(SIOCGPPPSTATS, dev_ifsioc) |
571 | HANDLE_IOCTL(SIOCGPPPCSTATS, dev_ifsioc) | 36 | HANDLE_IOCTL(SIOCGPPPCSTATS, dev_ifsioc) |
@@ -590,17 +55,6 @@ HANDLE_IOCTL(RTC_EPOCH_READ, w_long) | |||
590 | COMPATIBLE_IOCTL(RTC_EPOCH_SET) | 55 | COMPATIBLE_IOCTL(RTC_EPOCH_SET) |
591 | #endif | 56 | #endif |
592 | 57 | ||
593 | #if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE) | ||
594 | HANDLE_IOCTL(DRM32_IOCTL_VERSION, drm32_version); | ||
595 | HANDLE_IOCTL(DRM32_IOCTL_GET_UNIQUE, drm32_getsetunique); | ||
596 | HANDLE_IOCTL(DRM32_IOCTL_SET_UNIQUE, drm32_getsetunique); | ||
597 | HANDLE_IOCTL(DRM32_IOCTL_ADD_MAP, drm32_addmap); | ||
598 | HANDLE_IOCTL(DRM32_IOCTL_INFO_BUFS, drm32_info_bufs); | ||
599 | HANDLE_IOCTL(DRM32_IOCTL_FREE_BUFS, drm32_free_bufs); | ||
600 | HANDLE_IOCTL(DRM32_IOCTL_MAP_BUFS, drm32_map_bufs); | ||
601 | HANDLE_IOCTL(DRM32_IOCTL_DMA, drm32_dma); | ||
602 | HANDLE_IOCTL(DRM32_IOCTL_RES_CTX, drm32_res_ctx); | ||
603 | #endif /* DRM */ | ||
604 | IOCTL_TABLE_END | 58 | IOCTL_TABLE_END |
605 | 59 | ||
606 | int ioctl_table_size = ARRAY_SIZE(ioctl_start); | 60 | int ioctl_table_size = ARRAY_SIZE(ioctl_start); |
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index 006385dbee66..197936d9359a 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
@@ -30,6 +30,9 @@ | |||
30 | #include <linux/seq_file.h> | 30 | #include <linux/seq_file.h> |
31 | #include <linux/spinlock.h> | 31 | #include <linux/spinlock.h> |
32 | #include <linux/types.h> | 32 | #include <linux/types.h> |
33 | #include <asm/io.h> | ||
34 | |||
35 | #include <asm/smp.h> | ||
33 | 36 | ||
34 | #undef PARISC_IRQ_CR16_COUNTS | 37 | #undef PARISC_IRQ_CR16_COUNTS |
35 | 38 | ||
@@ -43,26 +46,34 @@ extern irqreturn_t ipi_interrupt(int, void *, struct pt_regs *); | |||
43 | */ | 46 | */ |
44 | static volatile unsigned long cpu_eiem = 0; | 47 | static volatile unsigned long cpu_eiem = 0; |
45 | 48 | ||
46 | static void cpu_set_eiem(void *info) | 49 | static void cpu_disable_irq(unsigned int irq) |
47 | { | ||
48 | set_eiem((unsigned long) info); | ||
49 | } | ||
50 | |||
51 | static inline void cpu_disable_irq(unsigned int irq) | ||
52 | { | 50 | { |
53 | unsigned long eirr_bit = EIEM_MASK(irq); | 51 | unsigned long eirr_bit = EIEM_MASK(irq); |
54 | 52 | ||
55 | cpu_eiem &= ~eirr_bit; | 53 | cpu_eiem &= ~eirr_bit; |
56 | on_each_cpu(cpu_set_eiem, (void *) cpu_eiem, 1, 1); | 54 | /* Do nothing on the other CPUs. If they get this interrupt, |
55 | * The & cpu_eiem in the do_cpu_irq_mask() ensures they won't | ||
56 | * handle it, and the set_eiem() at the bottom will ensure it | ||
57 | * then gets disabled */ | ||
57 | } | 58 | } |
58 | 59 | ||
59 | static void cpu_enable_irq(unsigned int irq) | 60 | static void cpu_enable_irq(unsigned int irq) |
60 | { | 61 | { |
61 | unsigned long eirr_bit = EIEM_MASK(irq); | 62 | unsigned long eirr_bit = EIEM_MASK(irq); |
62 | 63 | ||
63 | mtctl(eirr_bit, 23); /* clear EIRR bit before unmasking */ | ||
64 | cpu_eiem |= eirr_bit; | 64 | cpu_eiem |= eirr_bit; |
65 | on_each_cpu(cpu_set_eiem, (void *) cpu_eiem, 1, 1); | 65 | |
66 | /* FIXME: while our interrupts aren't nested, we cannot reset | ||
67 | * the eiem mask if we're already in an interrupt. Once we | ||
68 | * implement nested interrupts, this can go away | ||
69 | */ | ||
70 | if (!in_interrupt()) | ||
71 | set_eiem(cpu_eiem); | ||
72 | |||
73 | /* This is just a simple NOP IPI. But what it does is cause | ||
74 | * all the other CPUs to do a set_eiem(cpu_eiem) at the end | ||
75 | * of the interrupt handler */ | ||
76 | smp_send_all_nop(); | ||
66 | } | 77 | } |
67 | 78 | ||
68 | static unsigned int cpu_startup_irq(unsigned int irq) | 79 | static unsigned int cpu_startup_irq(unsigned int irq) |
@@ -74,6 +85,35 @@ static unsigned int cpu_startup_irq(unsigned int irq) | |||
74 | void no_ack_irq(unsigned int irq) { } | 85 | void no_ack_irq(unsigned int irq) { } |
75 | void no_end_irq(unsigned int irq) { } | 86 | void no_end_irq(unsigned int irq) { } |
76 | 87 | ||
88 | #ifdef CONFIG_SMP | ||
89 | int cpu_check_affinity(unsigned int irq, cpumask_t *dest) | ||
90 | { | ||
91 | int cpu_dest; | ||
92 | |||
93 | /* timer and ipi have to always be received on all CPUs */ | ||
94 | if (irq == TIMER_IRQ || irq == IPI_IRQ) { | ||
95 | /* Bad linux design decision. The mask has already | ||
96 | * been set; we must reset it */ | ||
97 | irq_affinity[irq] = CPU_MASK_ALL; | ||
98 | return -EINVAL; | ||
99 | } | ||
100 | |||
101 | /* whatever mask they set, we just allow one CPU */ | ||
102 | cpu_dest = first_cpu(*dest); | ||
103 | *dest = cpumask_of_cpu(cpu_dest); | ||
104 | |||
105 | return 0; | ||
106 | } | ||
107 | |||
108 | static void cpu_set_affinity_irq(unsigned int irq, cpumask_t dest) | ||
109 | { | ||
110 | if (cpu_check_affinity(irq, &dest)) | ||
111 | return; | ||
112 | |||
113 | irq_affinity[irq] = dest; | ||
114 | } | ||
115 | #endif | ||
116 | |||
77 | static struct hw_interrupt_type cpu_interrupt_type = { | 117 | static struct hw_interrupt_type cpu_interrupt_type = { |
78 | .typename = "CPU", | 118 | .typename = "CPU", |
79 | .startup = cpu_startup_irq, | 119 | .startup = cpu_startup_irq, |
@@ -82,7 +122,9 @@ static struct hw_interrupt_type cpu_interrupt_type = { | |||
82 | .disable = cpu_disable_irq, | 122 | .disable = cpu_disable_irq, |
83 | .ack = no_ack_irq, | 123 | .ack = no_ack_irq, |
84 | .end = no_end_irq, | 124 | .end = no_end_irq, |
85 | // .set_affinity = cpu_set_affinity_irq, | 125 | #ifdef CONFIG_SMP |
126 | .set_affinity = cpu_set_affinity_irq, | ||
127 | #endif | ||
86 | }; | 128 | }; |
87 | 129 | ||
88 | int show_interrupts(struct seq_file *p, void *v) | 130 | int show_interrupts(struct seq_file *p, void *v) |
@@ -219,6 +261,17 @@ int txn_alloc_irq(unsigned int bits_wide) | |||
219 | return -1; | 261 | return -1; |
220 | } | 262 | } |
221 | 263 | ||
264 | |||
265 | unsigned long txn_affinity_addr(unsigned int irq, int cpu) | ||
266 | { | ||
267 | #ifdef CONFIG_SMP | ||
268 | irq_affinity[irq] = cpumask_of_cpu(cpu); | ||
269 | #endif | ||
270 | |||
271 | return cpu_data[cpu].txn_addr; | ||
272 | } | ||
273 | |||
274 | |||
222 | unsigned long txn_alloc_addr(unsigned int virt_irq) | 275 | unsigned long txn_alloc_addr(unsigned int virt_irq) |
223 | { | 276 | { |
224 | static int next_cpu = -1; | 277 | static int next_cpu = -1; |
@@ -233,7 +286,7 @@ unsigned long txn_alloc_addr(unsigned int virt_irq) | |||
233 | if (next_cpu >= NR_CPUS) | 286 | if (next_cpu >= NR_CPUS) |
234 | next_cpu = 0; /* nothing else, assign monarch */ | 287 | next_cpu = 0; /* nothing else, assign monarch */ |
235 | 288 | ||
236 | return cpu_data[next_cpu].txn_addr; | 289 | return txn_affinity_addr(virt_irq, next_cpu); |
237 | } | 290 | } |
238 | 291 | ||
239 | 292 | ||
@@ -250,10 +303,11 @@ void do_cpu_irq_mask(struct pt_regs *regs) | |||
250 | irq_enter(); | 303 | irq_enter(); |
251 | 304 | ||
252 | /* | 305 | /* |
253 | * Only allow interrupt processing to be interrupted by the | 306 | * Don't allow TIMER or IPI nested interrupts. |
254 | * timer tick | 307 | * Allowing any single interrupt to nest can lead to that CPU |
308 | * handling interrupts with all enabled interrupts unmasked. | ||
255 | */ | 309 | */ |
256 | set_eiem(EIEM_MASK(TIMER_IRQ)); | 310 | set_eiem(0UL); |
257 | 311 | ||
258 | /* 1) only process IRQs that are enabled/unmasked (cpu_eiem) | 312 | /* 1) only process IRQs that are enabled/unmasked (cpu_eiem) |
259 | * 2) We loop here on EIRR contents in order to avoid | 313 | * 2) We loop here on EIRR contents in order to avoid |
@@ -267,23 +321,41 @@ void do_cpu_irq_mask(struct pt_regs *regs) | |||
267 | if (!eirr_val) | 321 | if (!eirr_val) |
268 | break; | 322 | break; |
269 | 323 | ||
270 | if (eirr_val & EIEM_MASK(TIMER_IRQ)) | ||
271 | set_eiem(0); | ||
272 | |||
273 | mtctl(eirr_val, 23); /* reset bits we are going to process */ | 324 | mtctl(eirr_val, 23); /* reset bits we are going to process */ |
274 | 325 | ||
275 | /* Work our way from MSb to LSb...same order we alloc EIRs */ | 326 | /* Work our way from MSb to LSb...same order we alloc EIRs */ |
276 | for (irq = TIMER_IRQ; eirr_val && bit; bit>>=1, irq++) { | 327 | for (irq = TIMER_IRQ; eirr_val && bit; bit>>=1, irq++) { |
328 | #ifdef CONFIG_SMP | ||
329 | cpumask_t dest = irq_affinity[irq]; | ||
330 | #endif | ||
277 | if (!(bit & eirr_val)) | 331 | if (!(bit & eirr_val)) |
278 | continue; | 332 | continue; |
279 | 333 | ||
280 | /* clear bit in mask - can exit loop sooner */ | 334 | /* clear bit in mask - can exit loop sooner */ |
281 | eirr_val &= ~bit; | 335 | eirr_val &= ~bit; |
282 | 336 | ||
337 | #ifdef CONFIG_SMP | ||
338 | /* FIXME: because generic set affinity mucks | ||
339 | * with the affinity before sending it to us | ||
340 | * we can get the situation where the affinity is | ||
341 | * wrong for our CPU type interrupts */ | ||
342 | if (irq != TIMER_IRQ && irq != IPI_IRQ && | ||
343 | !cpu_isset(smp_processor_id(), dest)) { | ||
344 | int cpu = first_cpu(dest); | ||
345 | |||
346 | printk(KERN_DEBUG "redirecting irq %d from CPU %d to %d\n", | ||
347 | irq, smp_processor_id(), cpu); | ||
348 | gsc_writel(irq + CPU_IRQ_BASE, | ||
349 | cpu_data[cpu].hpa); | ||
350 | continue; | ||
351 | } | ||
352 | #endif | ||
353 | |||
283 | __do_IRQ(irq, regs); | 354 | __do_IRQ(irq, regs); |
284 | } | 355 | } |
285 | } | 356 | } |
286 | set_eiem(cpu_eiem); | 357 | |
358 | set_eiem(cpu_eiem); /* restore original mask */ | ||
287 | irq_exit(); | 359 | irq_exit(); |
288 | } | 360 | } |
289 | 361 | ||
@@ -291,12 +363,14 @@ void do_cpu_irq_mask(struct pt_regs *regs) | |||
291 | static struct irqaction timer_action = { | 363 | static struct irqaction timer_action = { |
292 | .handler = timer_interrupt, | 364 | .handler = timer_interrupt, |
293 | .name = "timer", | 365 | .name = "timer", |
366 | .flags = SA_INTERRUPT, | ||
294 | }; | 367 | }; |
295 | 368 | ||
296 | #ifdef CONFIG_SMP | 369 | #ifdef CONFIG_SMP |
297 | static struct irqaction ipi_action = { | 370 | static struct irqaction ipi_action = { |
298 | .handler = ipi_interrupt, | 371 | .handler = ipi_interrupt, |
299 | .name = "IPI", | 372 | .name = "IPI", |
373 | .flags = SA_INTERRUPT, | ||
300 | }; | 374 | }; |
301 | #endif | 375 | #endif |
302 | 376 | ||
diff --git a/arch/parisc/kernel/perf.c b/arch/parisc/kernel/perf.c index 44670d6e06f4..f6fec62b6a2f 100644 --- a/arch/parisc/kernel/perf.c +++ b/arch/parisc/kernel/perf.c | |||
@@ -196,8 +196,7 @@ static int perf_open(struct inode *inode, struct file *file); | |||
196 | static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos); | 196 | static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos); |
197 | static ssize_t perf_write(struct file *file, const char __user *buf, size_t count, | 197 | static ssize_t perf_write(struct file *file, const char __user *buf, size_t count, |
198 | loff_t *ppos); | 198 | loff_t *ppos); |
199 | static int perf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | 199 | static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg); |
200 | unsigned long arg); | ||
201 | static void perf_start_counters(void); | 200 | static void perf_start_counters(void); |
202 | static int perf_stop_counters(uint32_t *raddr); | 201 | static int perf_stop_counters(uint32_t *raddr); |
203 | static struct rdr_tbl_ent * perf_rdr_get_entry(uint32_t rdr_num); | 202 | static struct rdr_tbl_ent * perf_rdr_get_entry(uint32_t rdr_num); |
@@ -438,48 +437,56 @@ static void perf_patch_images(void) | |||
438 | * must be running on the processor that you wish to change. | 437 | * must be running on the processor that you wish to change. |
439 | */ | 438 | */ |
440 | 439 | ||
441 | static int perf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | 440 | static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
442 | unsigned long arg) | ||
443 | { | 441 | { |
444 | long error_start; | 442 | long error_start; |
445 | uint32_t raddr[4]; | 443 | uint32_t raddr[4]; |
444 | int error = 0; | ||
446 | 445 | ||
446 | lock_kernel(); | ||
447 | switch (cmd) { | 447 | switch (cmd) { |
448 | 448 | ||
449 | case PA_PERF_ON: | 449 | case PA_PERF_ON: |
450 | /* Start the counters */ | 450 | /* Start the counters */ |
451 | perf_start_counters(); | 451 | perf_start_counters(); |
452 | return 0; | 452 | break; |
453 | 453 | ||
454 | case PA_PERF_OFF: | 454 | case PA_PERF_OFF: |
455 | error_start = perf_stop_counters(raddr); | 455 | error_start = perf_stop_counters(raddr); |
456 | if (error_start != 0) { | 456 | if (error_start != 0) { |
457 | printk(KERN_ERR "perf_off: perf_stop_counters = %ld\n", error_start); | 457 | printk(KERN_ERR "perf_off: perf_stop_counters = %ld\n", error_start); |
458 | return -EFAULT; | 458 | error = -EFAULT; |
459 | break; | ||
459 | } | 460 | } |
460 | 461 | ||
461 | /* copy out the Counters */ | 462 | /* copy out the Counters */ |
462 | if (copy_to_user((void __user *)arg, raddr, | 463 | if (copy_to_user((void __user *)arg, raddr, |
463 | sizeof (raddr)) != 0) { | 464 | sizeof (raddr)) != 0) { |
464 | return -EFAULT; | 465 | error = -EFAULT; |
466 | break; | ||
465 | } | 467 | } |
466 | return 0; | 468 | break; |
467 | 469 | ||
468 | case PA_PERF_VERSION: | 470 | case PA_PERF_VERSION: |
469 | /* Return the version # */ | 471 | /* Return the version # */ |
470 | return put_user(PERF_VERSION, (int *)arg); | 472 | error = put_user(PERF_VERSION, (int *)arg); |
473 | break; | ||
471 | 474 | ||
472 | default: | 475 | default: |
473 | break; | 476 | error = -ENOTTY; |
474 | } | 477 | } |
475 | return -ENOTTY; | 478 | |
479 | unlock_kernel(); | ||
480 | |||
481 | return error; | ||
476 | } | 482 | } |
477 | 483 | ||
478 | static struct file_operations perf_fops = { | 484 | static struct file_operations perf_fops = { |
479 | .llseek = no_llseek, | 485 | .llseek = no_llseek, |
480 | .read = perf_read, | 486 | .read = perf_read, |
481 | .write = perf_write, | 487 | .write = perf_write, |
482 | .ioctl = perf_ioctl, | 488 | .unlocked_ioctl = perf_ioctl, |
489 | .compat_ioctl = perf_ioctl, | ||
483 | .open = perf_open, | 490 | .open = perf_open, |
484 | .release = perf_release | 491 | .release = perf_release |
485 | }; | 492 | }; |
diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index b6fe202a620d..27160e8bf15b 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c | |||
@@ -264,6 +264,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
264 | * sigkill. perhaps it should be put in the status | 264 | * sigkill. perhaps it should be put in the status |
265 | * that it wants to exit. | 265 | * that it wants to exit. |
266 | */ | 266 | */ |
267 | ret = 0; | ||
267 | DBG("sys_ptrace(KILL)\n"); | 268 | DBG("sys_ptrace(KILL)\n"); |
268 | if (child->exit_state == EXIT_ZOMBIE) /* already dead */ | 269 | if (child->exit_state == EXIT_ZOMBIE) /* already dead */ |
269 | goto out_tsk; | 270 | goto out_tsk; |
@@ -344,11 +345,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
344 | 345 | ||
345 | case PTRACE_GETEVENTMSG: | 346 | case PTRACE_GETEVENTMSG: |
346 | ret = put_user(child->ptrace_message, (unsigned int __user *) data); | 347 | ret = put_user(child->ptrace_message, (unsigned int __user *) data); |
347 | goto out; | 348 | goto out_tsk; |
348 | 349 | ||
349 | default: | 350 | default: |
350 | ret = ptrace_request(child, request, addr, data); | 351 | ret = ptrace_request(child, request, addr, data); |
351 | goto out; | 352 | goto out_tsk; |
352 | } | 353 | } |
353 | 354 | ||
354 | out_wake_notrap: | 355 | out_wake_notrap: |
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index 82c24e62ab63..3a25a7bd673e 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c | |||
@@ -296,7 +296,6 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
296 | struct rt_sigframe __user *frame; | 296 | struct rt_sigframe __user *frame; |
297 | unsigned long rp, usp; | 297 | unsigned long rp, usp; |
298 | unsigned long haddr, sigframe_size; | 298 | unsigned long haddr, sigframe_size; |
299 | struct siginfo si; | ||
300 | int err = 0; | 299 | int err = 0; |
301 | #ifdef __LP64__ | 300 | #ifdef __LP64__ |
302 | compat_int_t compat_val; | 301 | compat_int_t compat_val; |
diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index a9ecf6465784..ce89da0f654d 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c | |||
@@ -181,12 +181,19 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
181 | while (ops) { | 181 | while (ops) { |
182 | unsigned long which = ffz(~ops); | 182 | unsigned long which = ffz(~ops); |
183 | 183 | ||
184 | ops &= ~(1 << which); | ||
185 | |||
184 | switch (which) { | 186 | switch (which) { |
187 | case IPI_NOP: | ||
188 | #if (kDEBUG>=100) | ||
189 | printk(KERN_DEBUG "CPU%d IPI_NOP\n",this_cpu); | ||
190 | #endif /* kDEBUG */ | ||
191 | break; | ||
192 | |||
185 | case IPI_RESCHEDULE: | 193 | case IPI_RESCHEDULE: |
186 | #if (kDEBUG>=100) | 194 | #if (kDEBUG>=100) |
187 | printk(KERN_DEBUG "CPU%d IPI_RESCHEDULE\n",this_cpu); | 195 | printk(KERN_DEBUG "CPU%d IPI_RESCHEDULE\n",this_cpu); |
188 | #endif /* kDEBUG */ | 196 | #endif /* kDEBUG */ |
189 | ops &= ~(1 << IPI_RESCHEDULE); | ||
190 | /* | 197 | /* |
191 | * Reschedule callback. Everything to be | 198 | * Reschedule callback. Everything to be |
192 | * done is done by the interrupt return path. | 199 | * done is done by the interrupt return path. |
@@ -197,7 +204,6 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
197 | #if (kDEBUG>=100) | 204 | #if (kDEBUG>=100) |
198 | printk(KERN_DEBUG "CPU%d IPI_CALL_FUNC\n",this_cpu); | 205 | printk(KERN_DEBUG "CPU%d IPI_CALL_FUNC\n",this_cpu); |
199 | #endif /* kDEBUG */ | 206 | #endif /* kDEBUG */ |
200 | ops &= ~(1 << IPI_CALL_FUNC); | ||
201 | { | 207 | { |
202 | volatile struct smp_call_struct *data; | 208 | volatile struct smp_call_struct *data; |
203 | void (*func)(void *info); | 209 | void (*func)(void *info); |
@@ -231,7 +237,6 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
231 | #if (kDEBUG>=100) | 237 | #if (kDEBUG>=100) |
232 | printk(KERN_DEBUG "CPU%d IPI_CPU_START\n",this_cpu); | 238 | printk(KERN_DEBUG "CPU%d IPI_CPU_START\n",this_cpu); |
233 | #endif /* kDEBUG */ | 239 | #endif /* kDEBUG */ |
234 | ops &= ~(1 << IPI_CPU_START); | ||
235 | #ifdef ENTRY_SYS_CPUS | 240 | #ifdef ENTRY_SYS_CPUS |
236 | p->state = STATE_RUNNING; | 241 | p->state = STATE_RUNNING; |
237 | #endif | 242 | #endif |
@@ -241,7 +246,6 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
241 | #if (kDEBUG>=100) | 246 | #if (kDEBUG>=100) |
242 | printk(KERN_DEBUG "CPU%d IPI_CPU_STOP\n",this_cpu); | 247 | printk(KERN_DEBUG "CPU%d IPI_CPU_STOP\n",this_cpu); |
243 | #endif /* kDEBUG */ | 248 | #endif /* kDEBUG */ |
244 | ops &= ~(1 << IPI_CPU_STOP); | ||
245 | #ifdef ENTRY_SYS_CPUS | 249 | #ifdef ENTRY_SYS_CPUS |
246 | #else | 250 | #else |
247 | halt_processor(); | 251 | halt_processor(); |
@@ -252,13 +256,11 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
252 | #if (kDEBUG>=100) | 256 | #if (kDEBUG>=100) |
253 | printk(KERN_DEBUG "CPU%d is alive!\n",this_cpu); | 257 | printk(KERN_DEBUG "CPU%d is alive!\n",this_cpu); |
254 | #endif /* kDEBUG */ | 258 | #endif /* kDEBUG */ |
255 | ops &= ~(1 << IPI_CPU_TEST); | ||
256 | break; | 259 | break; |
257 | 260 | ||
258 | default: | 261 | default: |
259 | printk(KERN_CRIT "Unknown IPI num on CPU%d: %lu\n", | 262 | printk(KERN_CRIT "Unknown IPI num on CPU%d: %lu\n", |
260 | this_cpu, which); | 263 | this_cpu, which); |
261 | ops &= ~(1 << which); | ||
262 | return IRQ_NONE; | 264 | return IRQ_NONE; |
263 | } /* Switch */ | 265 | } /* Switch */ |
264 | } /* while (ops) */ | 266 | } /* while (ops) */ |
@@ -312,6 +314,12 @@ smp_send_start(void) { send_IPI_allbutself(IPI_CPU_START); } | |||
312 | void | 314 | void |
313 | smp_send_reschedule(int cpu) { send_IPI_single(cpu, IPI_RESCHEDULE); } | 315 | smp_send_reschedule(int cpu) { send_IPI_single(cpu, IPI_RESCHEDULE); } |
314 | 316 | ||
317 | void | ||
318 | smp_send_all_nop(void) | ||
319 | { | ||
320 | send_IPI_allbutself(IPI_NOP); | ||
321 | } | ||
322 | |||
315 | 323 | ||
316 | /** | 324 | /** |
317 | * Run a function on all other CPUs. | 325 | * Run a function on all other CPUs. |
@@ -338,6 +346,10 @@ smp_call_function (void (*func) (void *info), void *info, int retry, int wait) | |||
338 | 346 | ||
339 | /* Can deadlock when called with interrupts disabled */ | 347 | /* Can deadlock when called with interrupts disabled */ |
340 | WARN_ON(irqs_disabled()); | 348 | WARN_ON(irqs_disabled()); |
349 | |||
350 | /* can also deadlock if IPIs are disabled */ | ||
351 | WARN_ON((get_eiem() & (1UL<<(CPU_IRQ_MAX - IPI_IRQ))) == 0); | ||
352 | |||
341 | 353 | ||
342 | data.func = func; | 354 | data.func = func; |
343 | data.info = info; | 355 | data.info = info; |
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S index b29b76b42bb7..d66163492890 100644 --- a/arch/parisc/kernel/syscall.S +++ b/arch/parisc/kernel/syscall.S | |||
@@ -164,7 +164,7 @@ linux_gateway_entry: | |||
164 | #endif | 164 | #endif |
165 | STREG %r2, TASK_PT_GR30(%r1) /* ... and save it */ | 165 | STREG %r2, TASK_PT_GR30(%r1) /* ... and save it */ |
166 | 166 | ||
167 | STREG %r20, TASK_PT_GR20(%r1) | 167 | STREG %r20, TASK_PT_GR20(%r1) /* Syscall number */ |
168 | STREG %r21, TASK_PT_GR21(%r1) | 168 | STREG %r21, TASK_PT_GR21(%r1) |
169 | STREG %r22, TASK_PT_GR22(%r1) | 169 | STREG %r22, TASK_PT_GR22(%r1) |
170 | STREG %r23, TASK_PT_GR23(%r1) /* 4th argument */ | 170 | STREG %r23, TASK_PT_GR23(%r1) /* 4th argument */ |
@@ -527,6 +527,7 @@ lws_compare_and_swap: | |||
527 | We *must* giveup this call and fail. | 527 | We *must* giveup this call and fail. |
528 | */ | 528 | */ |
529 | ldw 4(%sr2,%r20), %r28 /* Load thread register */ | 529 | ldw 4(%sr2,%r20), %r28 /* Load thread register */ |
530 | /* WARNING: If cr27 cycles to the same value we have problems */ | ||
530 | mfctl %cr27, %r21 /* Get current thread register */ | 531 | mfctl %cr27, %r21 /* Get current thread register */ |
531 | cmpb,<>,n %r21, %r28, cas_lock /* Called recursive? */ | 532 | cmpb,<>,n %r21, %r28, cas_lock /* Called recursive? */ |
532 | b lws_exit /* Return error! */ | 533 | b lws_exit /* Return error! */ |
diff --git a/block/as-iosched.c b/block/as-iosched.c index a78e160b59a3..fbe050124ec5 100644 --- a/block/as-iosched.c +++ b/block/as-iosched.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/block/as-iosched.c | ||
3 | * | ||
4 | * Anticipatory & deadline i/o scheduler. | 2 | * Anticipatory & deadline i/o scheduler. |
5 | * | 3 | * |
6 | * Copyright (C) 2002 Jens Axboe <axboe@suse.de> | 4 | * Copyright (C) 2002 Jens Axboe <axboe@suse.de> |
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 2b64f5852bfd..ee0bb41694b0 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/block/cfq-iosched.c | ||
3 | * | ||
4 | * CFQ, or complete fairness queueing, disk scheduler. | 2 | * CFQ, or complete fairness queueing, disk scheduler. |
5 | * | 3 | * |
6 | * Based on ideas from a previously unfinished io | 4 | * Based on ideas from a previously unfinished io |
diff --git a/block/deadline-iosched.c b/block/deadline-iosched.c index 7929471d7df7..9cbec09e8415 100644 --- a/block/deadline-iosched.c +++ b/block/deadline-iosched.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/block/deadline-iosched.c | ||
3 | * | ||
4 | * Deadline i/o scheduler. | 2 | * Deadline i/o scheduler. |
5 | * | 3 | * |
6 | * Copyright (C) 2002 Jens Axboe <axboe@suse.de> | 4 | * Copyright (C) 2002 Jens Axboe <axboe@suse.de> |
diff --git a/block/elevator.c b/block/elevator.c index e4c58827bb46..6c3fc8a10bf2 100644 --- a/block/elevator.c +++ b/block/elevator.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/block/elevator.c | ||
3 | * | ||
4 | * Block device elevator/IO-scheduler. | 2 | * Block device elevator/IO-scheduler. |
5 | * | 3 | * |
6 | * Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE | 4 | * Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE |
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c index 5f52e30b43f8..99c9ca6d5992 100644 --- a/block/ll_rw_blk.c +++ b/block/ll_rw_blk.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/block/ll_rw_blk.c | ||
3 | * | ||
4 | * Copyright (C) 1991, 1992 Linus Torvalds | 2 | * Copyright (C) 1991, 1992 Linus Torvalds |
5 | * Copyright (C) 1994, Karl Keyte: Added support for disk statistics | 3 | * Copyright (C) 1994, Karl Keyte: Added support for disk statistics |
6 | * Elevator latency, (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE | 4 | * Elevator latency, (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index e239a6c29230..a9e33db46e68 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -1017,10 +1017,11 @@ static int cciss_ioctl(struct inode *inode, struct file *filep, | |||
1017 | status = -ENOMEM; | 1017 | status = -ENOMEM; |
1018 | goto cleanup1; | 1018 | goto cleanup1; |
1019 | } | 1019 | } |
1020 | if (ioc->Request.Type.Direction == XFER_WRITE && | 1020 | if (ioc->Request.Type.Direction == XFER_WRITE) { |
1021 | copy_from_user(buff[sg_used], data_ptr, sz)) { | 1021 | if (copy_from_user(buff[sg_used], data_ptr, sz)) { |
1022 | status = -ENOMEM; | 1022 | status = -ENOMEM; |
1023 | goto cleanup1; | 1023 | goto cleanup1; |
1024 | } | ||
1024 | } else { | 1025 | } else { |
1025 | memset(buff[sg_used], 0, sz); | 1026 | memset(buff[sg_used], 0, sz); |
1026 | } | 1027 | } |
@@ -1138,8 +1139,15 @@ static int revalidate_allvol(ctlr_info_t *host) | |||
1138 | 1139 | ||
1139 | for(i=0; i< NWD; i++) { | 1140 | for(i=0; i< NWD; i++) { |
1140 | struct gendisk *disk = host->gendisk[i]; | 1141 | struct gendisk *disk = host->gendisk[i]; |
1141 | if (disk->flags & GENHD_FL_UP) | 1142 | if (disk) { |
1142 | del_gendisk(disk); | 1143 | request_queue_t *q = disk->queue; |
1144 | |||
1145 | if (disk->flags & GENHD_FL_UP) | ||
1146 | del_gendisk(disk); | ||
1147 | if (q) | ||
1148 | blk_cleanup_queue(q); | ||
1149 | put_disk(disk); | ||
1150 | } | ||
1143 | } | 1151 | } |
1144 | 1152 | ||
1145 | /* | 1153 | /* |
@@ -1453,10 +1461,13 @@ static int deregister_disk(struct gendisk *disk, drive_info_struct *drv, | |||
1453 | * allows us to delete disk zero but keep the controller registered. | 1461 | * allows us to delete disk zero but keep the controller registered. |
1454 | */ | 1462 | */ |
1455 | if (h->gendisk[0] != disk){ | 1463 | if (h->gendisk[0] != disk){ |
1456 | if (disk->flags & GENHD_FL_UP){ | 1464 | if (disk) { |
1457 | blk_cleanup_queue(disk->queue); | 1465 | request_queue_t *q = disk->queue; |
1458 | del_gendisk(disk); | 1466 | if (disk->flags & GENHD_FL_UP) |
1459 | drv->queue = NULL; | 1467 | del_gendisk(disk); |
1468 | if (q) | ||
1469 | blk_cleanup_queue(q); | ||
1470 | put_disk(disk); | ||
1460 | } | 1471 | } |
1461 | } | 1472 | } |
1462 | 1473 | ||
@@ -3225,9 +3236,14 @@ static void __devexit cciss_remove_one (struct pci_dev *pdev) | |||
3225 | /* remove it from the disk list */ | 3236 | /* remove it from the disk list */ |
3226 | for (j = 0; j < NWD; j++) { | 3237 | for (j = 0; j < NWD; j++) { |
3227 | struct gendisk *disk = hba[i]->gendisk[j]; | 3238 | struct gendisk *disk = hba[i]->gendisk[j]; |
3228 | if (disk->flags & GENHD_FL_UP) { | 3239 | if (disk) { |
3229 | del_gendisk(disk); | 3240 | request_queue_t *q = disk->queue; |
3230 | blk_cleanup_queue(disk->queue); | 3241 | |
3242 | if (disk->flags & GENHD_FL_UP) | ||
3243 | del_gendisk(disk); | ||
3244 | if (q) | ||
3245 | blk_cleanup_queue(q); | ||
3246 | put_disk(disk); | ||
3231 | } | 3247 | } |
3232 | } | 3248 | } |
3233 | 3249 | ||
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index ed2bc87f475b..31e649a9ff71 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -625,7 +625,7 @@ config BLK_DEV_NS87415 | |||
625 | tristate "NS87415 chipset support" | 625 | tristate "NS87415 chipset support" |
626 | help | 626 | help |
627 | This driver adds detection and support for the NS87415 chip | 627 | This driver adds detection and support for the NS87415 chip |
628 | (used in SPARC64, among others). | 628 | (used mainly on SPARC64 and PA-RISC machines). |
629 | 629 | ||
630 | Please read the comments at the top of <file:drivers/ide/pci/ns87415.c>. | 630 | Please read the comments at the top of <file:drivers/ide/pci/ns87415.c>. |
631 | 631 | ||
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index c2f47923d174..421b62d900af 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -3328,8 +3328,8 @@ static ide_proc_entry_t idecd_proc[] = { | |||
3328 | #endif | 3328 | #endif |
3329 | 3329 | ||
3330 | static ide_driver_t ide_cdrom_driver = { | 3330 | static ide_driver_t ide_cdrom_driver = { |
3331 | .owner = THIS_MODULE, | ||
3332 | .gen_driver = { | 3331 | .gen_driver = { |
3332 | .owner = THIS_MODULE, | ||
3333 | .name = "ide-cdrom", | 3333 | .name = "ide-cdrom", |
3334 | .bus = &ide_bus_type, | 3334 | .bus = &ide_bus_type, |
3335 | .probe = ide_cd_probe, | 3335 | .probe = ide_cd_probe, |
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index e827b39e4b3c..1a45f75dc9b2 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -1089,8 +1089,8 @@ static void ide_device_shutdown(struct device *dev) | |||
1089 | } | 1089 | } |
1090 | 1090 | ||
1091 | static ide_driver_t idedisk_driver = { | 1091 | static ide_driver_t idedisk_driver = { |
1092 | .owner = THIS_MODULE, | ||
1093 | .gen_driver = { | 1092 | .gen_driver = { |
1093 | .owner = THIS_MODULE, | ||
1094 | .name = "ide-disk", | 1094 | .name = "ide-disk", |
1095 | .bus = &ide_bus_type, | 1095 | .bus = &ide_bus_type, |
1096 | .probe = ide_disk_probe, | 1096 | .probe = ide_disk_probe, |
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index f615ab759962..94c147b79a49 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
@@ -1925,8 +1925,8 @@ static ide_proc_entry_t idefloppy_proc[] = { | |||
1925 | static int ide_floppy_probe(struct device *); | 1925 | static int ide_floppy_probe(struct device *); |
1926 | 1926 | ||
1927 | static ide_driver_t idefloppy_driver = { | 1927 | static ide_driver_t idefloppy_driver = { |
1928 | .owner = THIS_MODULE, | ||
1929 | .gen_driver = { | 1928 | .gen_driver = { |
1929 | .owner = THIS_MODULE, | ||
1930 | .name = "ide-floppy", | 1930 | .name = "ide-floppy", |
1931 | .bus = &ide_bus_type, | 1931 | .bus = &ide_bus_type, |
1932 | .probe = ide_floppy_probe, | 1932 | .probe = ide_floppy_probe, |
diff --git a/drivers/ide/ide-lib.c b/drivers/ide/ide-lib.c index b09a6537c7a8..41d46dbe6c24 100644 --- a/drivers/ide/ide-lib.c +++ b/drivers/ide/ide-lib.c | |||
@@ -410,10 +410,10 @@ void ide_toggle_bounce(ide_drive_t *drive, int on) | |||
410 | { | 410 | { |
411 | u64 addr = BLK_BOUNCE_HIGH; /* dma64_addr_t */ | 411 | u64 addr = BLK_BOUNCE_HIGH; /* dma64_addr_t */ |
412 | 412 | ||
413 | if (on && drive->media == ide_disk) { | 413 | if (!PCI_DMA_BUS_IS_PHYS) { |
414 | if (!PCI_DMA_BUS_IS_PHYS) | 414 | addr = BLK_BOUNCE_ANY; |
415 | addr = BLK_BOUNCE_ANY; | 415 | } else if (on && drive->media == ide_disk) { |
416 | else if (HWIF(drive)->pci_dev) | 416 | if (HWIF(drive)->pci_dev) |
417 | addr = HWIF(drive)->pci_dev->dma_mask; | 417 | addr = HWIF(drive)->pci_dev->dma_mask; |
418 | } | 418 | } |
419 | 419 | ||
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 0ac7eb8f40d5..2069dd693c9f 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -4748,8 +4748,8 @@ static ide_proc_entry_t idetape_proc[] = { | |||
4748 | static int ide_tape_probe(struct device *); | 4748 | static int ide_tape_probe(struct device *); |
4749 | 4749 | ||
4750 | static ide_driver_t idetape_driver = { | 4750 | static ide_driver_t idetape_driver = { |
4751 | .owner = THIS_MODULE, | ||
4752 | .gen_driver = { | 4751 | .gen_driver = { |
4752 | .owner = THIS_MODULE, | ||
4753 | .name = "ide-tape", | 4753 | .name = "ide-tape", |
4754 | .bus = &ide_bus_type, | 4754 | .bus = &ide_bus_type, |
4755 | .probe = ide_tape_probe, | 4755 | .probe = ide_tape_probe, |
diff --git a/drivers/ide/pci/aec62xx.c b/drivers/ide/pci/aec62xx.c index 52cadc005d72..a21b1e11eef4 100644 --- a/drivers/ide/pci/aec62xx.c +++ b/drivers/ide/pci/aec62xx.c | |||
@@ -65,23 +65,6 @@ static struct chipset_bus_clock_list_entry aec6xxx_34_base [] = { | |||
65 | #define BUSCLOCK(D) \ | 65 | #define BUSCLOCK(D) \ |
66 | ((struct chipset_bus_clock_list_entry *) pci_get_drvdata((D))) | 66 | ((struct chipset_bus_clock_list_entry *) pci_get_drvdata((D))) |
67 | 67 | ||
68 | #if 0 | ||
69 | if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF) { | ||
70 | (void) pci_read_config_byte(dev, 0x54, &art); | ||
71 | p += sprintf(p, "DMA Mode: %s(%s)", | ||
72 | (c0&0x20)?((art&0x03)?"UDMA":" DMA"):" PIO", | ||
73 | (art&0x02)?"2":(art&0x01)?"1":"0"); | ||
74 | p += sprintf(p, " %s(%s)", | ||
75 | (c0&0x40)?((art&0x0c)?"UDMA":" DMA"):" PIO", | ||
76 | (art&0x08)?"2":(art&0x04)?"1":"0"); | ||
77 | p += sprintf(p, " %s(%s)", | ||
78 | (c1&0x20)?((art&0x30)?"UDMA":" DMA"):" PIO", | ||
79 | (art&0x20)?"2":(art&0x10)?"1":"0"); | ||
80 | p += sprintf(p, " %s(%s)\n", | ||
81 | (c1&0x40)?((art&0xc0)?"UDMA":" DMA"):" PIO", | ||
82 | (art&0x80)?"2":(art&0x40)?"1":"0"); | ||
83 | } else { | ||
84 | #endif | ||
85 | 68 | ||
86 | /* | 69 | /* |
87 | * TO DO: active tuning and correction of cards without a bios. | 70 | * TO DO: active tuning and correction of cards without a bios. |
@@ -112,13 +95,9 @@ static u8 aec62xx_ratemask (ide_drive_t *drive) | |||
112 | switch(hwif->pci_dev->device) { | 95 | switch(hwif->pci_dev->device) { |
113 | case PCI_DEVICE_ID_ARTOP_ATP865: | 96 | case PCI_DEVICE_ID_ARTOP_ATP865: |
114 | case PCI_DEVICE_ID_ARTOP_ATP865R: | 97 | case PCI_DEVICE_ID_ARTOP_ATP865R: |
115 | #if 0 | ||
116 | mode = (hwif->INB(hwif->dma_master) & 0x10) ? 4 : 3; | ||
117 | #else | ||
118 | mode = (hwif->INB(((hwif->channel) ? | 98 | mode = (hwif->INB(((hwif->channel) ? |
119 | hwif->mate->dma_status : | 99 | hwif->mate->dma_status : |
120 | hwif->dma_status)) & 0x10) ? 4 : 3; | 100 | hwif->dma_status)) & 0x10) ? 4 : 3; |
121 | #endif | ||
122 | break; | 101 | break; |
123 | case PCI_DEVICE_ID_ARTOP_ATP860: | 102 | case PCI_DEVICE_ID_ARTOP_ATP860: |
124 | case PCI_DEVICE_ID_ARTOP_ATP860R: | 103 | case PCI_DEVICE_ID_ARTOP_ATP860R: |
@@ -263,35 +242,9 @@ static int aec62xx_irq_timeout (ide_drive_t *drive) | |||
263 | case PCI_DEVICE_ID_ARTOP_ATP865: | 242 | case PCI_DEVICE_ID_ARTOP_ATP865: |
264 | case PCI_DEVICE_ID_ARTOP_ATP865R: | 243 | case PCI_DEVICE_ID_ARTOP_ATP865R: |
265 | printk(" AEC62XX time out "); | 244 | printk(" AEC62XX time out "); |
266 | #if 0 | ||
267 | { | ||
268 | int i = 0; | ||
269 | u8 reg49h = 0; | ||
270 | pci_read_config_byte(HWIF(drive)->pci_dev, 0x49, ®49h); | ||
271 | for (i=0;i<256;i++) | ||
272 | pci_write_config_byte(HWIF(drive)->pci_dev, 0x49, reg49h|0x10); | ||
273 | pci_write_config_byte(HWIF(drive)->pci_dev, 0x49, reg49h & ~0x10); | ||
274 | } | ||
275 | return 0; | ||
276 | #endif | ||
277 | default: | 245 | default: |
278 | break; | 246 | break; |
279 | } | 247 | } |
280 | #if 0 | ||
281 | { | ||
282 | ide_hwif_t *hwif = HWIF(drive); | ||
283 | struct pci_dev *dev = hwif->pci_dev; | ||
284 | u8 tmp1 = 0, tmp2 = 0, mode6 = 0; | ||
285 | |||
286 | pci_read_config_byte(dev, 0x44, &tmp1); | ||
287 | pci_read_config_byte(dev, 0x45, &tmp2); | ||
288 | printk(" AEC6280 r44=%x r45=%x ",tmp1,tmp2); | ||
289 | mode6 = HWIF(drive)->INB(((hwif->channel) ? | ||
290 | hwif->mate->dma_status : | ||
291 | hwif->dma_status)); | ||
292 | printk(" AEC6280 133=%x ", (mode6 & 0x10)); | ||
293 | } | ||
294 | #endif | ||
295 | return 0; | 248 | return 0; |
296 | } | 249 | } |
297 | 250 | ||
diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c index 6cf49394a80f..cf84350efc55 100644 --- a/drivers/ide/pci/alim15x3.c +++ b/drivers/ide/pci/alim15x3.c | |||
@@ -876,10 +876,15 @@ static ide_pci_device_t ali15x3_chipset __devinitdata = { | |||
876 | 876 | ||
877 | static int __devinit alim15x3_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 877 | static int __devinit alim15x3_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
878 | { | 878 | { |
879 | static struct pci_device_id ati_rs100[] = { | ||
880 | { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS100) }, | ||
881 | { }, | ||
882 | }; | ||
883 | |||
879 | ide_pci_device_t *d = &ali15x3_chipset; | 884 | ide_pci_device_t *d = &ali15x3_chipset; |
880 | 885 | ||
881 | if(pci_find_device(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS100, NULL)) | 886 | if (pci_dev_present(ati_rs100)) |
882 | printk(KERN_ERR "Warning: ATI Radeon IGP Northbridge is not yet fully tested.\n"); | 887 | printk(KERN_WARNING "alim15x3: ATI Radeon IGP Northbridge is not yet fully tested.\n"); |
883 | 888 | ||
884 | #if defined(CONFIG_SPARC64) | 889 | #if defined(CONFIG_SPARC64) |
885 | d->init_hwif = init_hwif_common_ali15x3; | 890 | d->init_hwif = init_hwif_common_ali15x3; |
diff --git a/drivers/ide/pci/cs5520.c b/drivers/ide/pci/cs5520.c index 7dc24682d197..ea3c52cc8ac1 100644 --- a/drivers/ide/pci/cs5520.c +++ b/drivers/ide/pci/cs5520.c | |||
@@ -222,10 +222,9 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic | |||
222 | 222 | ||
223 | /* We must not grab the entire device, it has 'ISA' space in its | 223 | /* We must not grab the entire device, it has 'ISA' space in its |
224 | BARS too and we will freak out other bits of the kernel */ | 224 | BARS too and we will freak out other bits of the kernel */ |
225 | if(pci_enable_device_bars(dev, 1<<2)) | 225 | if (pci_enable_device_bars(dev, 1<<2)) { |
226 | { | ||
227 | printk(KERN_WARNING "%s: Unable to enable 55x0.\n", d->name); | 226 | printk(KERN_WARNING "%s: Unable to enable 55x0.\n", d->name); |
228 | return 1; | 227 | return -ENODEV; |
229 | } | 228 | } |
230 | pci_set_master(dev); | 229 | pci_set_master(dev); |
231 | if (pci_set_dma_mask(dev, DMA_32BIT_MASK)) { | 230 | if (pci_set_dma_mask(dev, DMA_32BIT_MASK)) { |
diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c index 022d244f2eb0..f1ca154dd52c 100644 --- a/drivers/ide/pci/siimage.c +++ b/drivers/ide/pci/siimage.c | |||
@@ -6,7 +6,13 @@ | |||
6 | * | 6 | * |
7 | * May be copied or modified under the terms of the GNU General Public License | 7 | * May be copied or modified under the terms of the GNU General Public License |
8 | * | 8 | * |
9 | * Documentation available under NDA only | 9 | * Documentation for CMD680: |
10 | * http://gkernel.sourceforge.net/specs/sii/sii-0680a-v1.31.pdf.bz2 | ||
11 | * | ||
12 | * Documentation for SiI 3112: | ||
13 | * http://gkernel.sourceforge.net/specs/sii/3112A_SiI-DS-0095-B2.pdf.bz2 | ||
14 | * | ||
15 | * Errata and other documentation only available under NDA. | ||
10 | * | 16 | * |
11 | * | 17 | * |
12 | * FAQ Items: | 18 | * FAQ Items: |
diff --git a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c index a4d099c937ff..cee2c374cd2f 100644 --- a/drivers/ide/pci/via82cxxx.c +++ b/drivers/ide/pci/via82cxxx.c | |||
@@ -100,185 +100,14 @@ static struct via_isa_bridge { | |||
100 | { NULL } | 100 | { NULL } |
101 | }; | 101 | }; |
102 | 102 | ||
103 | static struct via_isa_bridge *via_config; | ||
104 | static unsigned int via_80w; | ||
105 | static unsigned int via_clock; | 103 | static unsigned int via_clock; |
106 | static char *via_dma[] = { "MWDMA16", "UDMA33", "UDMA66", "UDMA100", "UDMA133" }; | 104 | static char *via_dma[] = { "MWDMA16", "UDMA33", "UDMA66", "UDMA100", "UDMA133" }; |
107 | 105 | ||
108 | /* | 106 | struct via82cxxx_dev |
109 | * VIA /proc entry. | ||
110 | */ | ||
111 | |||
112 | #if defined(DISPLAY_VIA_TIMINGS) && defined(CONFIG_PROC_FS) | ||
113 | |||
114 | #include <linux/stat.h> | ||
115 | #include <linux/proc_fs.h> | ||
116 | |||
117 | static u8 via_proc = 0; | ||
118 | static unsigned long via_base; | ||
119 | static struct pci_dev *bmide_dev, *isa_dev; | ||
120 | |||
121 | static char *via_control3[] = { "No limit", "64", "128", "192" }; | ||
122 | |||
123 | #define via_print(format, arg...) p += sprintf(p, format "\n" , ## arg) | ||
124 | #define via_print_drive(name, format, arg...)\ | ||
125 | p += sprintf(p, name); for (i = 0; i < 4; i++) p += sprintf(p, format, ## arg); p += sprintf(p, "\n"); | ||
126 | |||
127 | |||
128 | /** | ||
129 | * via_get_info - generate via /proc file | ||
130 | * @buffer: buffer for data | ||
131 | * @addr: set to start of data to use | ||
132 | * @offset: current file offset | ||
133 | * @count: size of read | ||
134 | * | ||
135 | * Fills in buffer with the debugging/configuration information for | ||
136 | * the VIA chipset tuning and attached drives | ||
137 | */ | ||
138 | |||
139 | static int via_get_info(char *buffer, char **addr, off_t offset, int count) | ||
140 | { | 107 | { |
141 | int speed[4], cycle[4], setup[4], active[4], recover[4], den[4], | 108 | struct via_isa_bridge *via_config; |
142 | uen[4], udma[4], umul[4], active8b[4], recover8b[4]; | 109 | unsigned int via_80w; |
143 | struct pci_dev *dev = bmide_dev; | 110 | }; |
144 | unsigned int v, u, i; | ||
145 | int len; | ||
146 | u16 c, w; | ||
147 | u8 t, x; | ||
148 | char *p = buffer; | ||
149 | |||
150 | via_print("----------VIA BusMastering IDE Configuration" | ||
151 | "----------------"); | ||
152 | |||
153 | via_print("Driver Version: 3.38"); | ||
154 | via_print("South Bridge: VIA %s", | ||
155 | via_config->name); | ||
156 | |||
157 | pci_read_config_byte(isa_dev, PCI_REVISION_ID, &t); | ||
158 | pci_read_config_byte(dev, PCI_REVISION_ID, &x); | ||
159 | via_print("Revision: ISA %#x IDE %#x", t, x); | ||
160 | via_print("Highest DMA rate: %s", | ||
161 | via_dma[via_config->flags & VIA_UDMA]); | ||
162 | |||
163 | via_print("BM-DMA base: %#lx", via_base); | ||
164 | via_print("PCI clock: %d.%dMHz", | ||
165 | via_clock / 1000, via_clock / 100 % 10); | ||
166 | |||
167 | pci_read_config_byte(dev, VIA_MISC_1, &t); | ||
168 | via_print("Master Read Cycle IRDY: %dws", | ||
169 | (t & 64) >> 6); | ||
170 | via_print("Master Write Cycle IRDY: %dws", | ||
171 | (t & 32) >> 5); | ||
172 | via_print("BM IDE Status Register Read Retry: %s", | ||
173 | (t & 8) ? "yes" : "no"); | ||
174 | |||
175 | pci_read_config_byte(dev, VIA_MISC_3, &t); | ||
176 | via_print("Max DRDY Pulse Width: %s%s", | ||
177 | via_control3[(t & 0x03)], (t & 0x03) ? " PCI clocks" : ""); | ||
178 | |||
179 | via_print("-----------------------Primary IDE" | ||
180 | "-------Secondary IDE------"); | ||
181 | via_print("Read DMA FIFO flush: %10s%20s", | ||
182 | (t & 0x80) ? "yes" : "no", (t & 0x40) ? "yes" : "no"); | ||
183 | via_print("End Sector FIFO flush: %10s%20s", | ||
184 | (t & 0x20) ? "yes" : "no", (t & 0x10) ? "yes" : "no"); | ||
185 | |||
186 | pci_read_config_byte(dev, VIA_IDE_CONFIG, &t); | ||
187 | via_print("Prefetch Buffer: %10s%20s", | ||
188 | (t & 0x80) ? "yes" : "no", (t & 0x20) ? "yes" : "no"); | ||
189 | via_print("Post Write Buffer: %10s%20s", | ||
190 | (t & 0x40) ? "yes" : "no", (t & 0x10) ? "yes" : "no"); | ||
191 | |||
192 | pci_read_config_byte(dev, VIA_IDE_ENABLE, &t); | ||
193 | via_print("Enabled: %10s%20s", | ||
194 | (t & 0x02) ? "yes" : "no", (t & 0x01) ? "yes" : "no"); | ||
195 | |||
196 | c = inb(via_base + 0x02) | (inb(via_base + 0x0a) << 8); | ||
197 | via_print("Simplex only: %10s%20s", | ||
198 | (c & 0x80) ? "yes" : "no", (c & 0x8000) ? "yes" : "no"); | ||
199 | |||
200 | via_print("Cable Type: %10s%20s", | ||
201 | (via_80w & 1) ? "80w" : "40w", (via_80w & 2) ? "80w" : "40w"); | ||
202 | |||
203 | via_print("-------------------drive0----drive1" | ||
204 | "----drive2----drive3-----"); | ||
205 | |||
206 | pci_read_config_byte(dev, VIA_ADDRESS_SETUP, &t); | ||
207 | pci_read_config_dword(dev, VIA_DRIVE_TIMING, &v); | ||
208 | pci_read_config_word(dev, VIA_8BIT_TIMING, &w); | ||
209 | |||
210 | if (via_config->flags & VIA_UDMA) | ||
211 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); | ||
212 | else u = 0; | ||
213 | |||
214 | for (i = 0; i < 4; i++) { | ||
215 | |||
216 | setup[i] = ((t >> ((3 - i) << 1)) & 0x3) + 1; | ||
217 | recover8b[i] = ((w >> ((1 - (i >> 1)) << 3)) & 0xf) + 1; | ||
218 | active8b[i] = ((w >> (((1 - (i >> 1)) << 3) + 4)) & 0xf) + 1; | ||
219 | active[i] = ((v >> (((3 - i) << 3) + 4)) & 0xf) + 1; | ||
220 | recover[i] = ((v >> ((3 - i) << 3)) & 0xf) + 1; | ||
221 | udma[i] = ((u >> ((3 - i) << 3)) & 0x7) + 2; | ||
222 | umul[i] = ((u >> (((3 - i) & 2) << 3)) & 0x8) ? 1 : 2; | ||
223 | uen[i] = ((u >> ((3 - i) << 3)) & 0x20); | ||
224 | den[i] = (c & ((i & 1) ? 0x40 : 0x20) << ((i & 2) << 2)); | ||
225 | |||
226 | speed[i] = 2 * via_clock / (active[i] + recover[i]); | ||
227 | cycle[i] = 1000000 * (active[i] + recover[i]) / via_clock; | ||
228 | |||
229 | if (!uen[i] || !den[i]) | ||
230 | continue; | ||
231 | |||
232 | switch (via_config->flags & VIA_UDMA) { | ||
233 | |||
234 | case VIA_UDMA_33: | ||
235 | speed[i] = 2 * via_clock / udma[i]; | ||
236 | cycle[i] = 1000000 * udma[i] / via_clock; | ||
237 | break; | ||
238 | |||
239 | case VIA_UDMA_66: | ||
240 | speed[i] = 4 * via_clock / (udma[i] * umul[i]); | ||
241 | cycle[i] = 500000 * (udma[i] * umul[i]) / via_clock; | ||
242 | break; | ||
243 | |||
244 | case VIA_UDMA_100: | ||
245 | speed[i] = 6 * via_clock / udma[i]; | ||
246 | cycle[i] = 333333 * udma[i] / via_clock; | ||
247 | break; | ||
248 | |||
249 | case VIA_UDMA_133: | ||
250 | speed[i] = 8 * via_clock / udma[i]; | ||
251 | cycle[i] = 250000 * udma[i] / via_clock; | ||
252 | break; | ||
253 | } | ||
254 | } | ||
255 | |||
256 | via_print_drive("Transfer Mode: ", "%10s", | ||
257 | den[i] ? (uen[i] ? "UDMA" : "DMA") : "PIO"); | ||
258 | |||
259 | via_print_drive("Address Setup: ", "%8dns", | ||
260 | 1000000 * setup[i] / via_clock); | ||
261 | via_print_drive("Cmd Active: ", "%8dns", | ||
262 | 1000000 * active8b[i] / via_clock); | ||
263 | via_print_drive("Cmd Recovery: ", "%8dns", | ||
264 | 1000000 * recover8b[i] / via_clock); | ||
265 | via_print_drive("Data Active: ", "%8dns", | ||
266 | 1000000 * active[i] / via_clock); | ||
267 | via_print_drive("Data Recovery: ", "%8dns", | ||
268 | 1000000 * recover[i] / via_clock); | ||
269 | via_print_drive("Cycle Time: ", "%8dns", | ||
270 | cycle[i]); | ||
271 | via_print_drive("Transfer Rate: ", "%4d.%dMB/s", | ||
272 | speed[i] / 1000, speed[i] / 100 % 10); | ||
273 | |||
274 | /* hoping it is less than 4K... */ | ||
275 | len = (p - buffer) - offset; | ||
276 | *addr = buffer + offset; | ||
277 | |||
278 | return len > count ? count : len; | ||
279 | } | ||
280 | |||
281 | #endif /* DISPLAY_VIA_TIMINGS && CONFIG_PROC_FS */ | ||
282 | 111 | ||
283 | /** | 112 | /** |
284 | * via_set_speed - write timing registers | 113 | * via_set_speed - write timing registers |
@@ -289,11 +118,13 @@ static int via_get_info(char *buffer, char **addr, off_t offset, int count) | |||
289 | * via_set_speed writes timing values to the chipset registers | 118 | * via_set_speed writes timing values to the chipset registers |
290 | */ | 119 | */ |
291 | 120 | ||
292 | static void via_set_speed(struct pci_dev *dev, u8 dn, struct ide_timing *timing) | 121 | static void via_set_speed(ide_hwif_t *hwif, u8 dn, struct ide_timing *timing) |
293 | { | 122 | { |
123 | struct pci_dev *dev = hwif->pci_dev; | ||
124 | struct via82cxxx_dev *vdev = ide_get_hwifdata(hwif); | ||
294 | u8 t; | 125 | u8 t; |
295 | 126 | ||
296 | if (~via_config->flags & VIA_BAD_AST) { | 127 | if (~vdev->via_config->flags & VIA_BAD_AST) { |
297 | pci_read_config_byte(dev, VIA_ADDRESS_SETUP, &t); | 128 | pci_read_config_byte(dev, VIA_ADDRESS_SETUP, &t); |
298 | t = (t & ~(3 << ((3 - dn) << 1))) | ((FIT(timing->setup, 1, 4) - 1) << ((3 - dn) << 1)); | 129 | t = (t & ~(3 << ((3 - dn) << 1))) | ((FIT(timing->setup, 1, 4) - 1) << ((3 - dn) << 1)); |
299 | pci_write_config_byte(dev, VIA_ADDRESS_SETUP, t); | 130 | pci_write_config_byte(dev, VIA_ADDRESS_SETUP, t); |
@@ -305,7 +136,7 @@ static void via_set_speed(struct pci_dev *dev, u8 dn, struct ide_timing *timing) | |||
305 | pci_write_config_byte(dev, VIA_DRIVE_TIMING + (3 - dn), | 136 | pci_write_config_byte(dev, VIA_DRIVE_TIMING + (3 - dn), |
306 | ((FIT(timing->active, 1, 16) - 1) << 4) | (FIT(timing->recover, 1, 16) - 1)); | 137 | ((FIT(timing->active, 1, 16) - 1) << 4) | (FIT(timing->recover, 1, 16) - 1)); |
307 | 138 | ||
308 | switch (via_config->flags & VIA_UDMA) { | 139 | switch (vdev->via_config->flags & VIA_UDMA) { |
309 | case VIA_UDMA_33: t = timing->udma ? (0xe0 | (FIT(timing->udma, 2, 5) - 2)) : 0x03; break; | 140 | case VIA_UDMA_33: t = timing->udma ? (0xe0 | (FIT(timing->udma, 2, 5) - 2)) : 0x03; break; |
310 | case VIA_UDMA_66: t = timing->udma ? (0xe8 | (FIT(timing->udma, 2, 9) - 2)) : 0x0f; break; | 141 | case VIA_UDMA_66: t = timing->udma ? (0xe8 | (FIT(timing->udma, 2, 9) - 2)) : 0x0f; break; |
311 | case VIA_UDMA_100: t = timing->udma ? (0xe0 | (FIT(timing->udma, 2, 9) - 2)) : 0x07; break; | 142 | case VIA_UDMA_100: t = timing->udma ? (0xe0 | (FIT(timing->udma, 2, 9) - 2)) : 0x07; break; |
@@ -329,6 +160,7 @@ static void via_set_speed(struct pci_dev *dev, u8 dn, struct ide_timing *timing) | |||
329 | static int via_set_drive(ide_drive_t *drive, u8 speed) | 160 | static int via_set_drive(ide_drive_t *drive, u8 speed) |
330 | { | 161 | { |
331 | ide_drive_t *peer = HWIF(drive)->drives + (~drive->dn & 1); | 162 | ide_drive_t *peer = HWIF(drive)->drives + (~drive->dn & 1); |
163 | struct via82cxxx_dev *vdev = ide_get_hwifdata(drive->hwif); | ||
332 | struct ide_timing t, p; | 164 | struct ide_timing t, p; |
333 | unsigned int T, UT; | 165 | unsigned int T, UT; |
334 | 166 | ||
@@ -337,7 +169,7 @@ static int via_set_drive(ide_drive_t *drive, u8 speed) | |||
337 | 169 | ||
338 | T = 1000000000 / via_clock; | 170 | T = 1000000000 / via_clock; |
339 | 171 | ||
340 | switch (via_config->flags & VIA_UDMA) { | 172 | switch (vdev->via_config->flags & VIA_UDMA) { |
341 | case VIA_UDMA_33: UT = T; break; | 173 | case VIA_UDMA_33: UT = T; break; |
342 | case VIA_UDMA_66: UT = T/2; break; | 174 | case VIA_UDMA_66: UT = T/2; break; |
343 | case VIA_UDMA_100: UT = T/3; break; | 175 | case VIA_UDMA_100: UT = T/3; break; |
@@ -352,7 +184,7 @@ static int via_set_drive(ide_drive_t *drive, u8 speed) | |||
352 | ide_timing_merge(&p, &t, &t, IDE_TIMING_8BIT); | 184 | ide_timing_merge(&p, &t, &t, IDE_TIMING_8BIT); |
353 | } | 185 | } |
354 | 186 | ||
355 | via_set_speed(HWIF(drive)->pci_dev, drive->dn, &t); | 187 | via_set_speed(HWIF(drive), drive->dn, &t); |
356 | 188 | ||
357 | if (!drive->init_speed) | 189 | if (!drive->init_speed) |
358 | drive->init_speed = speed; | 190 | drive->init_speed = speed; |
@@ -390,20 +222,41 @@ static void via82cxxx_tune_drive(ide_drive_t *drive, u8 pio) | |||
390 | 222 | ||
391 | static int via82cxxx_ide_dma_check (ide_drive_t *drive) | 223 | static int via82cxxx_ide_dma_check (ide_drive_t *drive) |
392 | { | 224 | { |
393 | u16 w80 = HWIF(drive)->udma_four; | 225 | ide_hwif_t *hwif = HWIF(drive); |
226 | struct via82cxxx_dev *vdev = ide_get_hwifdata(hwif); | ||
227 | u16 w80 = hwif->udma_four; | ||
394 | 228 | ||
395 | u16 speed = ide_find_best_mode(drive, | 229 | u16 speed = ide_find_best_mode(drive, |
396 | XFER_PIO | XFER_EPIO | XFER_SWDMA | XFER_MWDMA | | 230 | XFER_PIO | XFER_EPIO | XFER_SWDMA | XFER_MWDMA | |
397 | (via_config->flags & VIA_UDMA ? XFER_UDMA : 0) | | 231 | (vdev->via_config->flags & VIA_UDMA ? XFER_UDMA : 0) | |
398 | (w80 && (via_config->flags & VIA_UDMA) >= VIA_UDMA_66 ? XFER_UDMA_66 : 0) | | 232 | (w80 && (vdev->via_config->flags & VIA_UDMA) >= VIA_UDMA_66 ? XFER_UDMA_66 : 0) | |
399 | (w80 && (via_config->flags & VIA_UDMA) >= VIA_UDMA_100 ? XFER_UDMA_100 : 0) | | 233 | (w80 && (vdev->via_config->flags & VIA_UDMA) >= VIA_UDMA_100 ? XFER_UDMA_100 : 0) | |
400 | (w80 && (via_config->flags & VIA_UDMA) >= VIA_UDMA_133 ? XFER_UDMA_133 : 0)); | 234 | (w80 && (vdev->via_config->flags & VIA_UDMA) >= VIA_UDMA_133 ? XFER_UDMA_133 : 0)); |
401 | 235 | ||
402 | via_set_drive(drive, speed); | 236 | via_set_drive(drive, speed); |
403 | 237 | ||
404 | if (drive->autodma && (speed & XFER_MODE) != XFER_PIO) | 238 | if (drive->autodma && (speed & XFER_MODE) != XFER_PIO) |
405 | return HWIF(drive)->ide_dma_on(drive); | 239 | return hwif->ide_dma_on(drive); |
406 | return HWIF(drive)->ide_dma_off_quietly(drive); | 240 | return hwif->ide_dma_off_quietly(drive); |
241 | } | ||
242 | |||
243 | static struct via_isa_bridge *via_config_find(struct pci_dev **isa) | ||
244 | { | ||
245 | struct via_isa_bridge *via_config; | ||
246 | u8 t; | ||
247 | |||
248 | for (via_config = via_isa_bridges; via_config->id; via_config++) | ||
249 | if ((*isa = pci_find_device(PCI_VENDOR_ID_VIA + | ||
250 | !!(via_config->flags & VIA_BAD_ID), | ||
251 | via_config->id, NULL))) { | ||
252 | |||
253 | pci_read_config_byte(*isa, PCI_REVISION_ID, &t); | ||
254 | if (t >= via_config->rev_min && | ||
255 | t <= via_config->rev_max) | ||
256 | break; | ||
257 | } | ||
258 | |||
259 | return via_config; | ||
407 | } | 260 | } |
408 | 261 | ||
409 | /** | 262 | /** |
@@ -418,82 +271,28 @@ static int via82cxxx_ide_dma_check (ide_drive_t *drive) | |||
418 | static unsigned int __devinit init_chipset_via82cxxx(struct pci_dev *dev, const char *name) | 271 | static unsigned int __devinit init_chipset_via82cxxx(struct pci_dev *dev, const char *name) |
419 | { | 272 | { |
420 | struct pci_dev *isa = NULL; | 273 | struct pci_dev *isa = NULL; |
274 | struct via_isa_bridge *via_config; | ||
421 | u8 t, v; | 275 | u8 t, v; |
422 | unsigned int u; | 276 | unsigned int u; |
423 | int i; | ||
424 | 277 | ||
425 | /* | 278 | /* |
426 | * Find the ISA bridge to see how good the IDE is. | 279 | * Find the ISA bridge to see how good the IDE is. |
427 | */ | 280 | */ |
428 | 281 | via_config = via_config_find(&isa); | |
429 | for (via_config = via_isa_bridges; via_config->id; via_config++) | ||
430 | if ((isa = pci_find_device(PCI_VENDOR_ID_VIA + | ||
431 | !!(via_config->flags & VIA_BAD_ID), | ||
432 | via_config->id, NULL))) { | ||
433 | |||
434 | pci_read_config_byte(isa, PCI_REVISION_ID, &t); | ||
435 | if (t >= via_config->rev_min && | ||
436 | t <= via_config->rev_max) | ||
437 | break; | ||
438 | } | ||
439 | |||
440 | if (!via_config->id) { | 282 | if (!via_config->id) { |
441 | printk(KERN_WARNING "VP_IDE: Unknown VIA SouthBridge, disabling DMA.\n"); | 283 | printk(KERN_WARNING "VP_IDE: Unknown VIA SouthBridge, disabling DMA.\n"); |
442 | return -ENODEV; | 284 | return -ENODEV; |
443 | } | 285 | } |
444 | 286 | ||
445 | /* | 287 | /* |
446 | * Check 80-wire cable presence and setup Clk66. | 288 | * Setup or disable Clk66 if appropriate |
447 | */ | 289 | */ |
448 | 290 | ||
449 | switch (via_config->flags & VIA_UDMA) { | 291 | if ((via_config->flags & VIA_UDMA) == VIA_UDMA_66) { |
450 | 292 | /* Enable Clk66 */ | |
451 | case VIA_UDMA_66: | 293 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); |
452 | /* Enable Clk66 */ | 294 | pci_write_config_dword(dev, VIA_UDMA_TIMING, u|0x80008); |
453 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); | 295 | } else if (via_config->flags & VIA_BAD_CLK66) { |
454 | pci_write_config_dword(dev, VIA_UDMA_TIMING, u|0x80008); | ||
455 | for (i = 24; i >= 0; i -= 8) | ||
456 | if (((u >> (i & 16)) & 8) && | ||
457 | ((u >> i) & 0x20) && | ||
458 | (((u >> i) & 7) < 2)) { | ||
459 | /* | ||
460 | * 2x PCI clock and | ||
461 | * UDMA w/ < 3T/cycle | ||
462 | */ | ||
463 | via_80w |= (1 << (1 - (i >> 4))); | ||
464 | } | ||
465 | break; | ||
466 | |||
467 | case VIA_UDMA_100: | ||
468 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); | ||
469 | for (i = 24; i >= 0; i -= 8) | ||
470 | if (((u >> i) & 0x10) || | ||
471 | (((u >> i) & 0x20) && | ||
472 | (((u >> i) & 7) < 4))) { | ||
473 | /* BIOS 80-wire bit or | ||
474 | * UDMA w/ < 60ns/cycle | ||
475 | */ | ||
476 | via_80w |= (1 << (1 - (i >> 4))); | ||
477 | } | ||
478 | break; | ||
479 | |||
480 | case VIA_UDMA_133: | ||
481 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); | ||
482 | for (i = 24; i >= 0; i -= 8) | ||
483 | if (((u >> i) & 0x10) || | ||
484 | (((u >> i) & 0x20) && | ||
485 | (((u >> i) & 7) < 6))) { | ||
486 | /* BIOS 80-wire bit or | ||
487 | * UDMA w/ < 60ns/cycle | ||
488 | */ | ||
489 | via_80w |= (1 << (1 - (i >> 4))); | ||
490 | } | ||
491 | break; | ||
492 | |||
493 | } | ||
494 | |||
495 | /* Disable Clk66 */ | ||
496 | if (via_config->flags & VIA_BAD_CLK66) { | ||
497 | /* Would cause trouble on 596a and 686 */ | 296 | /* Would cause trouble on 596a and 686 */ |
498 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); | 297 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); |
499 | pci_write_config_dword(dev, VIA_UDMA_TIMING, u & ~0x80008); | 298 | pci_write_config_dword(dev, VIA_UDMA_TIMING, u & ~0x80008); |
@@ -560,26 +359,78 @@ static unsigned int __devinit init_chipset_via82cxxx(struct pci_dev *dev, const | |||
560 | via_dma[via_config->flags & VIA_UDMA], | 359 | via_dma[via_config->flags & VIA_UDMA], |
561 | pci_name(dev)); | 360 | pci_name(dev)); |
562 | 361 | ||
563 | /* | 362 | return 0; |
564 | * Setup /proc/ide/via entry. | 363 | } |
565 | */ | 364 | |
365 | /* | ||
366 | * Check and handle 80-wire cable presence | ||
367 | */ | ||
368 | static void __devinit via_cable_detect(struct pci_dev *dev, struct via82cxxx_dev *vdev) | ||
369 | { | ||
370 | unsigned int u; | ||
371 | int i; | ||
372 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); | ||
373 | |||
374 | switch (vdev->via_config->flags & VIA_UDMA) { | ||
375 | |||
376 | case VIA_UDMA_66: | ||
377 | for (i = 24; i >= 0; i -= 8) | ||
378 | if (((u >> (i & 16)) & 8) && | ||
379 | ((u >> i) & 0x20) && | ||
380 | (((u >> i) & 7) < 2)) { | ||
381 | /* | ||
382 | * 2x PCI clock and | ||
383 | * UDMA w/ < 3T/cycle | ||
384 | */ | ||
385 | vdev->via_80w |= (1 << (1 - (i >> 4))); | ||
386 | } | ||
387 | break; | ||
388 | |||
389 | case VIA_UDMA_100: | ||
390 | for (i = 24; i >= 0; i -= 8) | ||
391 | if (((u >> i) & 0x10) || | ||
392 | (((u >> i) & 0x20) && | ||
393 | (((u >> i) & 7) < 4))) { | ||
394 | /* BIOS 80-wire bit or | ||
395 | * UDMA w/ < 60ns/cycle | ||
396 | */ | ||
397 | vdev->via_80w |= (1 << (1 - (i >> 4))); | ||
398 | } | ||
399 | break; | ||
400 | |||
401 | case VIA_UDMA_133: | ||
402 | for (i = 24; i >= 0; i -= 8) | ||
403 | if (((u >> i) & 0x10) || | ||
404 | (((u >> i) & 0x20) && | ||
405 | (((u >> i) & 7) < 6))) { | ||
406 | /* BIOS 80-wire bit or | ||
407 | * UDMA w/ < 60ns/cycle | ||
408 | */ | ||
409 | vdev->via_80w |= (1 << (1 - (i >> 4))); | ||
410 | } | ||
411 | break; | ||
566 | 412 | ||
567 | #if defined(DISPLAY_VIA_TIMINGS) && defined(CONFIG_PROC_FS) | ||
568 | if (!via_proc) { | ||
569 | via_base = pci_resource_start(dev, 4); | ||
570 | bmide_dev = dev; | ||
571 | isa_dev = isa; | ||
572 | ide_pci_create_host_proc("via", via_get_info); | ||
573 | via_proc = 1; | ||
574 | } | 413 | } |
575 | #endif /* DISPLAY_VIA_TIMINGS && CONFIG_PROC_FS */ | ||
576 | return 0; | ||
577 | } | 414 | } |
578 | 415 | ||
579 | static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) | 416 | static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) |
580 | { | 417 | { |
418 | struct via82cxxx_dev *vdev = kmalloc(sizeof(struct via82cxxx_dev), | ||
419 | GFP_KERNEL); | ||
420 | struct pci_dev *isa = NULL; | ||
581 | int i; | 421 | int i; |
582 | 422 | ||
423 | if (vdev == NULL) { | ||
424 | printk(KERN_ERR "VP_IDE: out of memory :(\n"); | ||
425 | return; | ||
426 | } | ||
427 | |||
428 | memset(vdev, 0, sizeof(struct via82cxxx_dev)); | ||
429 | ide_set_hwifdata(hwif, vdev); | ||
430 | |||
431 | vdev->via_config = via_config_find(&isa); | ||
432 | via_cable_detect(hwif->pci_dev, vdev); | ||
433 | |||
583 | hwif->autodma = 0; | 434 | hwif->autodma = 0; |
584 | 435 | ||
585 | hwif->tuneproc = &via82cxxx_tune_drive; | 436 | hwif->tuneproc = &via82cxxx_tune_drive; |
@@ -594,7 +445,7 @@ static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) | |||
594 | 445 | ||
595 | for (i = 0; i < 2; i++) { | 446 | for (i = 0; i < 2; i++) { |
596 | hwif->drives[i].io_32bit = 1; | 447 | hwif->drives[i].io_32bit = 1; |
597 | hwif->drives[i].unmask = (via_config->flags & VIA_NO_UNMASK) ? 0 : 1; | 448 | hwif->drives[i].unmask = (vdev->via_config->flags & VIA_NO_UNMASK) ? 0 : 1; |
598 | hwif->drives[i].autotune = 1; | 449 | hwif->drives[i].autotune = 1; |
599 | hwif->drives[i].dn = hwif->channel * 2 + i; | 450 | hwif->drives[i].dn = hwif->channel * 2 + i; |
600 | } | 451 | } |
@@ -608,7 +459,7 @@ static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) | |||
608 | hwif->swdma_mask = 0x07; | 459 | hwif->swdma_mask = 0x07; |
609 | 460 | ||
610 | if (!hwif->udma_four) | 461 | if (!hwif->udma_four) |
611 | hwif->udma_four = (via_80w >> hwif->channel) & 1; | 462 | hwif->udma_four = (vdev->via_80w >> hwif->channel) & 1; |
612 | hwif->ide_dma_check = &via82cxxx_ide_dma_check; | 463 | hwif->ide_dma_check = &via82cxxx_ide_dma_check; |
613 | if (!noautodma) | 464 | if (!noautodma) |
614 | hwif->autodma = 1; | 465 | hwif->autodma = 1; |
diff --git a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c index 136911a86e84..16b28357885b 100644 --- a/drivers/ide/ppc/pmac.c +++ b/drivers/ide/ppc/pmac.c | |||
@@ -1401,20 +1401,6 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif) | |||
1401 | /* We probe the hwif now */ | 1401 | /* We probe the hwif now */ |
1402 | probe_hwif_init(hwif); | 1402 | probe_hwif_init(hwif); |
1403 | 1403 | ||
1404 | /* The code IDE code will have set hwif->present if we have devices attached, | ||
1405 | * if we don't, the discard the interface except if we are on a media bay slot | ||
1406 | */ | ||
1407 | if (!hwif->present && !pmif->mediabay) { | ||
1408 | printk(KERN_INFO "ide%d: Bus empty, interface released.\n", | ||
1409 | hwif->index); | ||
1410 | default_hwif_iops(hwif); | ||
1411 | for (i = IDE_DATA_OFFSET; i <= IDE_CONTROL_OFFSET; ++i) | ||
1412 | hwif->io_ports[i] = 0; | ||
1413 | hwif->chipset = ide_unknown; | ||
1414 | hwif->noprobe = 1; | ||
1415 | return -ENODEV; | ||
1416 | } | ||
1417 | |||
1418 | return 0; | 1404 | return 0; |
1419 | } | 1405 | } |
1420 | 1406 | ||
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c index d4f2111d4364..7ebf992e8c2f 100644 --- a/drivers/ide/setup-pci.c +++ b/drivers/ide/setup-pci.c | |||
@@ -787,7 +787,7 @@ static int pre_init = 1; /* Before first ordered IDE scan */ | |||
787 | static LIST_HEAD(ide_pci_drivers); | 787 | static LIST_HEAD(ide_pci_drivers); |
788 | 788 | ||
789 | /* | 789 | /* |
790 | * __ide_register_pci_driver - attach IDE driver | 790 | * __ide_pci_register_driver - attach IDE driver |
791 | * @driver: pci driver | 791 | * @driver: pci driver |
792 | * @module: owner module of the driver | 792 | * @module: owner module of the driver |
793 | * | 793 | * |
diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c index 5ea741f47fc8..e73f81c22381 100644 --- a/drivers/infiniband/core/user_mad.c +++ b/drivers/infiniband/core/user_mad.c | |||
@@ -312,7 +312,7 @@ static ssize_t ib_umad_write(struct file *filp, const char __user *buf, | |||
312 | int ret, length, hdr_len, copy_offset; | 312 | int ret, length, hdr_len, copy_offset; |
313 | int rmpp_active = 0; | 313 | int rmpp_active = 0; |
314 | 314 | ||
315 | if (count < sizeof (struct ib_user_mad)) | 315 | if (count < sizeof (struct ib_user_mad) + IB_MGMT_RMPP_HDR) |
316 | return -EINVAL; | 316 | return -EINVAL; |
317 | 317 | ||
318 | length = count - sizeof (struct ib_user_mad); | 318 | length = count - sizeof (struct ib_user_mad); |
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c index 760c418d5bc9..dd4e13303e96 100644 --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c | |||
@@ -730,15 +730,16 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask) | |||
730 | } | 730 | } |
731 | 731 | ||
732 | if (attr_mask & IB_QP_ACCESS_FLAGS) { | 732 | if (attr_mask & IB_QP_ACCESS_FLAGS) { |
733 | qp_context->params2 |= | ||
734 | cpu_to_be32(attr->qp_access_flags & IB_ACCESS_REMOTE_WRITE ? | ||
735 | MTHCA_QP_BIT_RWE : 0); | ||
736 | |||
733 | /* | 737 | /* |
734 | * Only enable RDMA/atomics if we have responder | 738 | * Only enable RDMA reads and atomics if we have |
735 | * resources set to a non-zero value. | 739 | * responder resources set to a non-zero value. |
736 | */ | 740 | */ |
737 | if (qp->resp_depth) { | 741 | if (qp->resp_depth) { |
738 | qp_context->params2 |= | 742 | qp_context->params2 |= |
739 | cpu_to_be32(attr->qp_access_flags & IB_ACCESS_REMOTE_WRITE ? | ||
740 | MTHCA_QP_BIT_RWE : 0); | ||
741 | qp_context->params2 |= | ||
742 | cpu_to_be32(attr->qp_access_flags & IB_ACCESS_REMOTE_READ ? | 743 | cpu_to_be32(attr->qp_access_flags & IB_ACCESS_REMOTE_READ ? |
743 | MTHCA_QP_BIT_RRE : 0); | 744 | MTHCA_QP_BIT_RRE : 0); |
744 | qp_context->params2 |= | 745 | qp_context->params2 |= |
@@ -759,31 +760,27 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask) | |||
759 | if (qp->resp_depth && !attr->max_dest_rd_atomic) { | 760 | if (qp->resp_depth && !attr->max_dest_rd_atomic) { |
760 | /* | 761 | /* |
761 | * Lowering our responder resources to zero. | 762 | * Lowering our responder resources to zero. |
762 | * Turn off RDMA/atomics as responder. | 763 | * Turn off reads RDMA and atomics as responder. |
763 | * (RWE/RRE/RAE in params2 already zero) | 764 | * (RRE/RAE in params2 already zero) |
764 | */ | 765 | */ |
765 | qp_param->opt_param_mask |= cpu_to_be32(MTHCA_QP_OPTPAR_RWE | | 766 | qp_param->opt_param_mask |= cpu_to_be32(MTHCA_QP_OPTPAR_RRE | |
766 | MTHCA_QP_OPTPAR_RRE | | ||
767 | MTHCA_QP_OPTPAR_RAE); | 767 | MTHCA_QP_OPTPAR_RAE); |
768 | } | 768 | } |
769 | 769 | ||
770 | if (!qp->resp_depth && attr->max_dest_rd_atomic) { | 770 | if (!qp->resp_depth && attr->max_dest_rd_atomic) { |
771 | /* | 771 | /* |
772 | * Increasing our responder resources from | 772 | * Increasing our responder resources from |
773 | * zero. Turn on RDMA/atomics as appropriate. | 773 | * zero. Turn on RDMA reads and atomics as |
774 | * appropriate. | ||
774 | */ | 775 | */ |
775 | qp_context->params2 |= | 776 | qp_context->params2 |= |
776 | cpu_to_be32(qp->atomic_rd_en & IB_ACCESS_REMOTE_WRITE ? | ||
777 | MTHCA_QP_BIT_RWE : 0); | ||
778 | qp_context->params2 |= | ||
779 | cpu_to_be32(qp->atomic_rd_en & IB_ACCESS_REMOTE_READ ? | 777 | cpu_to_be32(qp->atomic_rd_en & IB_ACCESS_REMOTE_READ ? |
780 | MTHCA_QP_BIT_RRE : 0); | 778 | MTHCA_QP_BIT_RRE : 0); |
781 | qp_context->params2 |= | 779 | qp_context->params2 |= |
782 | cpu_to_be32(qp->atomic_rd_en & IB_ACCESS_REMOTE_ATOMIC ? | 780 | cpu_to_be32(qp->atomic_rd_en & IB_ACCESS_REMOTE_ATOMIC ? |
783 | MTHCA_QP_BIT_RAE : 0); | 781 | MTHCA_QP_BIT_RAE : 0); |
784 | 782 | ||
785 | qp_param->opt_param_mask |= cpu_to_be32(MTHCA_QP_OPTPAR_RWE | | 783 | qp_param->opt_param_mask |= cpu_to_be32(MTHCA_QP_OPTPAR_RRE | |
786 | MTHCA_QP_OPTPAR_RRE | | ||
787 | MTHCA_QP_OPTPAR_RAE); | 784 | MTHCA_QP_OPTPAR_RAE); |
788 | } | 785 | } |
789 | 786 | ||
@@ -921,10 +918,12 @@ static void mthca_adjust_qp_caps(struct mthca_dev *dev, | |||
921 | else | 918 | else |
922 | qp->max_inline_data = max_data_size - MTHCA_INLINE_HEADER_SIZE; | 919 | qp->max_inline_data = max_data_size - MTHCA_INLINE_HEADER_SIZE; |
923 | 920 | ||
924 | qp->sq.max_gs = max_data_size / sizeof (struct mthca_data_seg); | 921 | qp->sq.max_gs = min_t(int, dev->limits.max_sg, |
925 | qp->rq.max_gs = (min(dev->limits.max_desc_sz, 1 << qp->rq.wqe_shift) - | 922 | max_data_size / sizeof (struct mthca_data_seg)); |
926 | sizeof (struct mthca_next_seg)) / | 923 | qp->rq.max_gs = min_t(int, dev->limits.max_sg, |
927 | sizeof (struct mthca_data_seg); | 924 | (min(dev->limits.max_desc_sz, 1 << qp->rq.wqe_shift) - |
925 | sizeof (struct mthca_next_seg)) / | ||
926 | sizeof (struct mthca_data_seg)); | ||
928 | } | 927 | } |
929 | 928 | ||
930 | /* | 929 | /* |
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 321a3a10e69b..ee9fe226ae99 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c | |||
@@ -802,13 +802,21 @@ static int srp_post_recv(struct srp_target_port *target) | |||
802 | 802 | ||
803 | /* | 803 | /* |
804 | * Must be called with target->scsi_host->host_lock held to protect | 804 | * Must be called with target->scsi_host->host_lock held to protect |
805 | * req_lim and tx_head. | 805 | * req_lim and tx_head. Lock cannot be dropped between call here and |
806 | * call to __srp_post_send(). | ||
806 | */ | 807 | */ |
807 | static struct srp_iu *__srp_get_tx_iu(struct srp_target_port *target) | 808 | static struct srp_iu *__srp_get_tx_iu(struct srp_target_port *target) |
808 | { | 809 | { |
809 | if (target->tx_head - target->tx_tail >= SRP_SQ_SIZE) | 810 | if (target->tx_head - target->tx_tail >= SRP_SQ_SIZE) |
810 | return NULL; | 811 | return NULL; |
811 | 812 | ||
813 | if (unlikely(target->req_lim < 1)) { | ||
814 | if (printk_ratelimit()) | ||
815 | printk(KERN_DEBUG PFX "Target has req_lim %d\n", | ||
816 | target->req_lim); | ||
817 | return NULL; | ||
818 | } | ||
819 | |||
812 | return target->tx_ring[target->tx_head & SRP_SQ_SIZE]; | 820 | return target->tx_ring[target->tx_head & SRP_SQ_SIZE]; |
813 | } | 821 | } |
814 | 822 | ||
@@ -823,11 +831,6 @@ static int __srp_post_send(struct srp_target_port *target, | |||
823 | struct ib_send_wr wr, *bad_wr; | 831 | struct ib_send_wr wr, *bad_wr; |
824 | int ret = 0; | 832 | int ret = 0; |
825 | 833 | ||
826 | if (target->req_lim < 1) { | ||
827 | printk(KERN_ERR PFX "Target has req_lim %d\n", target->req_lim); | ||
828 | return -EAGAIN; | ||
829 | } | ||
830 | |||
831 | list.addr = iu->dma; | 834 | list.addr = iu->dma; |
832 | list.length = len; | 835 | list.length = len; |
833 | list.lkey = target->srp_host->mr->lkey; | 836 | list.lkey = target->srp_host->mr->lkey; |
@@ -1417,6 +1420,8 @@ static ssize_t srp_create_target(struct class_device *class_dev, | |||
1417 | if (!target_host) | 1420 | if (!target_host) |
1418 | return -ENOMEM; | 1421 | return -ENOMEM; |
1419 | 1422 | ||
1423 | target_host->max_lun = SRP_MAX_LUN; | ||
1424 | |||
1420 | target = host_to_target(target_host); | 1425 | target = host_to_target(target_host); |
1421 | memset(target, 0, sizeof *target); | 1426 | memset(target, 0, sizeof *target); |
1422 | 1427 | ||
diff --git a/drivers/infiniband/ulp/srp/ib_srp.h b/drivers/infiniband/ulp/srp/ib_srp.h index 4fec28a71367..b564f18caf78 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.h +++ b/drivers/infiniband/ulp/srp/ib_srp.h | |||
@@ -54,6 +54,7 @@ enum { | |||
54 | SRP_PORT_REDIRECT = 1, | 54 | SRP_PORT_REDIRECT = 1, |
55 | SRP_DLID_REDIRECT = 2, | 55 | SRP_DLID_REDIRECT = 2, |
56 | 56 | ||
57 | SRP_MAX_LUN = 512, | ||
57 | SRP_MAX_IU_LEN = 256, | 58 | SRP_MAX_IU_LEN = 256, |
58 | 59 | ||
59 | SRP_RQ_SHIFT = 6, | 60 | SRP_RQ_SHIFT = 6, |
diff --git a/drivers/isdn/hisax/Kconfig b/drivers/isdn/hisax/Kconfig index 801c98f30e5c..c82105920d71 100644 --- a/drivers/isdn/hisax/Kconfig +++ b/drivers/isdn/hisax/Kconfig | |||
@@ -110,7 +110,7 @@ config HISAX_16_3 | |||
110 | 110 | ||
111 | config HISAX_TELESPCI | 111 | config HISAX_TELESPCI |
112 | bool "Teles PCI" | 112 | bool "Teles PCI" |
113 | depends on PCI && (BROKEN || !(SPARC64 || PPC)) | 113 | depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K)) |
114 | help | 114 | help |
115 | This enables HiSax support for the Teles PCI. | 115 | This enables HiSax support for the Teles PCI. |
116 | See <file:Documentation/isdn/README.HiSax> on how to configure it. | 116 | See <file:Documentation/isdn/README.HiSax> on how to configure it. |
@@ -238,7 +238,7 @@ config HISAX_MIC | |||
238 | 238 | ||
239 | config HISAX_NETJET | 239 | config HISAX_NETJET |
240 | bool "NETjet card" | 240 | bool "NETjet card" |
241 | depends on PCI && (BROKEN || !(SPARC64 || PPC)) | 241 | depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K)) |
242 | help | 242 | help |
243 | This enables HiSax support for the NetJet from Traverse | 243 | This enables HiSax support for the NetJet from Traverse |
244 | Technologies. | 244 | Technologies. |
@@ -249,7 +249,7 @@ config HISAX_NETJET | |||
249 | 249 | ||
250 | config HISAX_NETJET_U | 250 | config HISAX_NETJET_U |
251 | bool "NETspider U card" | 251 | bool "NETspider U card" |
252 | depends on PCI && (BROKEN || !(SPARC64 || PPC)) | 252 | depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K)) |
253 | help | 253 | help |
254 | This enables HiSax support for the Netspider U interface ISDN card | 254 | This enables HiSax support for the Netspider U interface ISDN card |
255 | from Traverse Technologies. | 255 | from Traverse Technologies. |
@@ -317,7 +317,7 @@ config HISAX_GAZEL | |||
317 | 317 | ||
318 | config HISAX_HFC_PCI | 318 | config HISAX_HFC_PCI |
319 | bool "HFC PCI-Bus cards" | 319 | bool "HFC PCI-Bus cards" |
320 | depends on PCI && (BROKEN || !(SPARC64 || PPC)) | 320 | depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K)) |
321 | help | 321 | help |
322 | This enables HiSax support for the HFC-S PCI 2BDS0 based cards. | 322 | This enables HiSax support for the HFC-S PCI 2BDS0 based cards. |
323 | 323 | ||
@@ -344,14 +344,14 @@ 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 || !(SPARC64 || PPC)) | 347 | depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K)) |
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. |
351 | 351 | ||
352 | config HISAX_AMD7930 | 352 | config HISAX_AMD7930 |
353 | bool "Am7930 (EXPERIMENTAL)" | 353 | bool "Am7930 (EXPERIMENTAL)" |
354 | depends on EXPERIMENTAL && (SPARC32 || SPARC64) | 354 | depends on EXPERIMENTAL && SPARC |
355 | help | 355 | help |
356 | This enables HiSax support for the AMD7930 chips on some SPARCs. | 356 | This enables HiSax support for the AMD7930 chips on some SPARCs. |
357 | This code is not finished yet. | 357 | This code is not finished yet. |
diff --git a/drivers/isdn/pcbit/Kconfig b/drivers/isdn/pcbit/Kconfig index f06997faef16..0933881ab0c2 100644 --- a/drivers/isdn/pcbit/Kconfig +++ b/drivers/isdn/pcbit/Kconfig | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | config ISDN_DRV_PCBIT | 4 | config ISDN_DRV_PCBIT |
5 | tristate "PCBIT-D support" | 5 | tristate "PCBIT-D support" |
6 | depends on ISDN_I4L && ISA && (BROKEN || !PPC) | 6 | depends on ISDN_I4L && ISA && (BROKEN || X86) |
7 | help | 7 | help |
8 | This enables support for the PCBIT ISDN-card. This card is | 8 | This enables support for the PCBIT ISDN-card. This card is |
9 | manufactured in Portugal by Octal. For running this card, | 9 | manufactured in Portugal by Octal. For running this card, |
diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index a39fbfef789a..19657efa8dc3 100644 --- a/drivers/parisc/iosapic.c +++ b/drivers/parisc/iosapic.c | |||
@@ -700,6 +700,28 @@ static unsigned int iosapic_startup_irq(unsigned int irq) | |||
700 | return 0; | 700 | return 0; |
701 | } | 701 | } |
702 | 702 | ||
703 | #ifdef CONFIG_SMP | ||
704 | static void iosapic_set_affinity_irq(unsigned int irq, cpumask_t dest) | ||
705 | { | ||
706 | struct vector_info *vi = iosapic_get_vector(irq); | ||
707 | u32 d0, d1, dummy_d0; | ||
708 | unsigned long flags; | ||
709 | |||
710 | if (cpu_check_affinity(irq, &dest)) | ||
711 | return; | ||
712 | |||
713 | vi->txn_addr = txn_affinity_addr(irq, first_cpu(dest)); | ||
714 | |||
715 | spin_lock_irqsave(&iosapic_lock, flags); | ||
716 | /* d1 contains the destination CPU, so only want to set that | ||
717 | * entry */ | ||
718 | iosapic_rd_irt_entry(vi, &d0, &d1); | ||
719 | iosapic_set_irt_data(vi, &dummy_d0, &d1); | ||
720 | iosapic_wr_irt_entry(vi, d0, d1); | ||
721 | spin_unlock_irqrestore(&iosapic_lock, flags); | ||
722 | } | ||
723 | #endif | ||
724 | |||
703 | static struct hw_interrupt_type iosapic_interrupt_type = { | 725 | static struct hw_interrupt_type iosapic_interrupt_type = { |
704 | .typename = "IO-SAPIC-level", | 726 | .typename = "IO-SAPIC-level", |
705 | .startup = iosapic_startup_irq, | 727 | .startup = iosapic_startup_irq, |
@@ -708,7 +730,9 @@ static struct hw_interrupt_type iosapic_interrupt_type = { | |||
708 | .disable = iosapic_disable_irq, | 730 | .disable = iosapic_disable_irq, |
709 | .ack = no_ack_irq, | 731 | .ack = no_ack_irq, |
710 | .end = iosapic_end_irq, | 732 | .end = iosapic_end_irq, |
711 | // .set_affinity = iosapic_set_affinity_irq, | 733 | #ifdef CONFIG_SMP |
734 | .set_affinity = iosapic_set_affinity_irq, | ||
735 | #endif | ||
712 | }; | 736 | }; |
713 | 737 | ||
714 | int iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev) | 738 | int iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev) |
diff --git a/drivers/parisc/superio.c b/drivers/parisc/superio.c index bab3bcabcb6e..d14888e149bb 100644 --- a/drivers/parisc/superio.c +++ b/drivers/parisc/superio.c | |||
@@ -24,6 +24,9 @@ | |||
24 | * Major changes to get basic interrupt infrastructure working to | 24 | * Major changes to get basic interrupt infrastructure working to |
25 | * hopefully be able to support all SuperIO devices. Currently | 25 | * hopefully be able to support all SuperIO devices. Currently |
26 | * works with serial. -- John Marvin <jsm@fc.hp.com> | 26 | * works with serial. -- John Marvin <jsm@fc.hp.com> |
27 | * | ||
28 | * Converted superio_init() to be a PCI_FIXUP_FINAL callee. | ||
29 | * -- Kyle McMartin <kyle@parisc-linux.org> | ||
27 | */ | 30 | */ |
28 | 31 | ||
29 | 32 | ||
@@ -141,10 +144,10 @@ superio_interrupt(int parent_irq, void *devp, struct pt_regs *regs) | |||
141 | } | 144 | } |
142 | 145 | ||
143 | /* Initialize Super I/O device */ | 146 | /* Initialize Super I/O device */ |
144 | 147 | static void | |
145 | static void __devinit | 148 | superio_init(struct pci_dev *pcidev) |
146 | superio_init(struct superio_device *sio) | ||
147 | { | 149 | { |
150 | struct superio_device *sio = &sio_dev; | ||
148 | struct pci_dev *pdev = sio->lio_pdev; | 151 | struct pci_dev *pdev = sio->lio_pdev; |
149 | u16 word; | 152 | u16 word; |
150 | 153 | ||
@@ -160,8 +163,8 @@ superio_init(struct superio_device *sio) | |||
160 | /* ...then properly fixup the USB to point at suckyio PIC */ | 163 | /* ...then properly fixup the USB to point at suckyio PIC */ |
161 | sio->usb_pdev->irq = superio_fixup_irq(sio->usb_pdev); | 164 | sio->usb_pdev->irq = superio_fixup_irq(sio->usb_pdev); |
162 | 165 | ||
163 | printk (KERN_INFO "SuperIO: Found NS87560 Legacy I/O device at %s (IRQ %i) \n", | 166 | printk(KERN_INFO "SuperIO: Found NS87560 Legacy I/O device at %s (IRQ %i) \n", |
164 | pci_name(pdev),pdev->irq); | 167 | pci_name(pdev), pdev->irq); |
165 | 168 | ||
166 | pci_read_config_dword (pdev, SIO_SP1BAR, &sio->sp1_base); | 169 | pci_read_config_dword (pdev, SIO_SP1BAR, &sio->sp1_base); |
167 | sio->sp1_base &= ~1; | 170 | sio->sp1_base &= ~1; |
@@ -274,7 +277,7 @@ superio_init(struct superio_device *sio) | |||
274 | 277 | ||
275 | sio->suckyio_irq_enabled = 1; | 278 | sio->suckyio_irq_enabled = 1; |
276 | } | 279 | } |
277 | 280 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_LIO, superio_init); | |
278 | 281 | ||
279 | static void superio_disable_irq(unsigned int irq) | 282 | static void superio_disable_irq(unsigned int irq) |
280 | { | 283 | { |
@@ -452,8 +455,10 @@ static void superio_fixup_pci(struct pci_dev *pdev) | |||
452 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415, superio_fixup_pci); | 455 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415, superio_fixup_pci); |
453 | 456 | ||
454 | 457 | ||
455 | static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_id *id) | 458 | static int __devinit |
459 | superio_probe(struct pci_dev *dev, const struct pci_device_id *id) | ||
456 | { | 460 | { |
461 | struct superio_device *sio = &sio_dev; | ||
457 | 462 | ||
458 | /* | 463 | /* |
459 | ** superio_probe(00:0e.0) ven 0x100b dev 0x2 sv 0x0 sd 0x0 class 0x1018a | 464 | ** superio_probe(00:0e.0) ven 0x100b dev 0x2 sv 0x0 sd 0x0 class 0x1018a |
@@ -466,7 +471,8 @@ static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_ | |||
466 | dev->subsystem_vendor, dev->subsystem_device, | 471 | dev->subsystem_vendor, dev->subsystem_device, |
467 | dev->class); | 472 | dev->class); |
468 | 473 | ||
469 | superio_init(&sio_dev); | 474 | if (!sio->suckyio_irq_enabled) |
475 | BUG(); /* Enabled by PCI_FIXUP_FINAL */ | ||
470 | 476 | ||
471 | if (dev->device == PCI_DEVICE_ID_NS_87560_LIO) { /* Function 1 */ | 477 | if (dev->device == PCI_DEVICE_ID_NS_87560_LIO) { /* Function 1 */ |
472 | superio_parport_init(); | 478 | superio_parport_init(); |
@@ -481,19 +487,21 @@ static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_ | |||
481 | DBG_INIT("superio_probe: WTF? Fire Extinguisher?\n"); | 487 | DBG_INIT("superio_probe: WTF? Fire Extinguisher?\n"); |
482 | } | 488 | } |
483 | 489 | ||
484 | /* Let appropriate other driver claim this device. */ | 490 | /* Let appropriate other driver claim this device. */ |
485 | return -ENODEV; | 491 | return -ENODEV; |
486 | } | 492 | } |
487 | 493 | ||
488 | static struct pci_device_id superio_tbl[] = { | 494 | static struct pci_device_id superio_tbl[] = { |
489 | { PCI_VENDOR_ID_NS, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, | 495 | { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_LIO) }, |
496 | { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_USB) }, | ||
497 | { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415) }, | ||
490 | { 0, } | 498 | { 0, } |
491 | }; | 499 | }; |
492 | 500 | ||
493 | static struct pci_driver superio_driver = { | 501 | static struct pci_driver superio_driver = { |
494 | .name = "SuperIO", | 502 | .name = "SuperIO", |
495 | .id_table = superio_tbl, | 503 | .id_table = superio_tbl, |
496 | .probe = superio_probe, | 504 | .probe = superio_probe, |
497 | }; | 505 | }; |
498 | 506 | ||
499 | static int __init superio_modinit(void) | 507 | static int __init superio_modinit(void) |
@@ -506,6 +514,5 @@ static void __exit superio_exit(void) | |||
506 | pci_unregister_driver(&superio_driver); | 514 | pci_unregister_driver(&superio_driver); |
507 | } | 515 | } |
508 | 516 | ||
509 | |||
510 | module_init(superio_modinit); | 517 | module_init(superio_modinit); |
511 | module_exit(superio_exit); | 518 | module_exit(superio_exit); |
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index e1960d69fb90..4cb1f3ed9100 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c | |||
@@ -784,8 +784,8 @@ static ide_proc_entry_t idescsi_proc[] = { | |||
784 | #endif | 784 | #endif |
785 | 785 | ||
786 | static ide_driver_t idescsi_driver = { | 786 | static ide_driver_t idescsi_driver = { |
787 | .owner = THIS_MODULE, | ||
788 | .gen_driver = { | 787 | .gen_driver = { |
788 | .owner = THIS_MODULE, | ||
789 | .name = "ide-scsi", | 789 | .name = "ide-scsi", |
790 | .bus = &ide_bus_type, | 790 | .bus = &ide_bus_type, |
791 | .probe = ide_scsi_probe, | 791 | .probe = ide_scsi_probe, |
diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c index ac184e60797e..ab7432a5778e 100644 --- a/drivers/scsi/sata_mv.c +++ b/drivers/scsi/sata_mv.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * sata_mv.c - Marvell SATA support | 2 | * sata_mv.c - Marvell SATA support |
3 | * | 3 | * |
4 | * Copyright 2005: EMC Corporation, all rights reserved. | 4 | * Copyright 2005: EMC Corporation, all rights reserved. |
5 | * Copyright 2005 Red Hat, Inc. All rights reserved. | ||
5 | * | 6 | * |
6 | * Please ALWAYS copy linux-ide@vger.kernel.org on emails. | 7 | * Please ALWAYS copy linux-ide@vger.kernel.org on emails. |
7 | * | 8 | * |
@@ -36,7 +37,7 @@ | |||
36 | #include <asm/io.h> | 37 | #include <asm/io.h> |
37 | 38 | ||
38 | #define DRV_NAME "sata_mv" | 39 | #define DRV_NAME "sata_mv" |
39 | #define DRV_VERSION "0.25" | 40 | #define DRV_VERSION "0.5" |
40 | 41 | ||
41 | enum { | 42 | enum { |
42 | /* BAR's are enumerated in terms of pci_resource_start() terms */ | 43 | /* BAR's are enumerated in terms of pci_resource_start() terms */ |
diff --git a/drivers/scsi/sata_sil24.c b/drivers/scsi/sata_sil24.c index cb1933a3bd55..e0d6f194f54f 100644 --- a/drivers/scsi/sata_sil24.c +++ b/drivers/scsi/sata_sil24.c | |||
@@ -5,17 +5,6 @@ | |||
5 | * | 5 | * |
6 | * Based on preview driver from Silicon Image. | 6 | * Based on preview driver from Silicon Image. |
7 | * | 7 | * |
8 | * NOTE: No NCQ/ATAPI support yet. The preview driver didn't support | ||
9 | * NCQ nor ATAPI, and, unfortunately, I couldn't find out how to make | ||
10 | * those work. Enabling those shouldn't be difficult. Basic | ||
11 | * structure is all there (in libata-dev tree). If you have any | ||
12 | * information about this hardware, please contact me or linux-ide. | ||
13 | * Info is needed on... | ||
14 | * | ||
15 | * - How to issue tagged commands and turn on sactive on issue accordingly. | ||
16 | * - Where to put an ATAPI command and how to tell the device to send it. | ||
17 | * - How to enable/use 64bit. | ||
18 | * | ||
19 | * This program is free software; you can redistribute it and/or modify it | 8 | * This program is free software; you can redistribute it and/or modify it |
20 | * under the terms of the GNU General Public License as published by the | 9 | * under the terms of the GNU General Public License as published by the |
21 | * Free Software Foundation; either version 2, or (at your option) any | 10 | * Free Software Foundation; either version 2, or (at your option) any |
@@ -42,7 +31,7 @@ | |||
42 | #include <asm/io.h> | 31 | #include <asm/io.h> |
43 | 32 | ||
44 | #define DRV_NAME "sata_sil24" | 33 | #define DRV_NAME "sata_sil24" |
45 | #define DRV_VERSION "0.22" /* Silicon Image's preview driver was 0.10 */ | 34 | #define DRV_VERSION "0.23" |
46 | 35 | ||
47 | /* | 36 | /* |
48 | * Port request block (PRB) 32 bytes | 37 | * Port request block (PRB) 32 bytes |
@@ -221,11 +210,22 @@ enum { | |||
221 | IRQ_STAT_4PORTS = 0xf, | 210 | IRQ_STAT_4PORTS = 0xf, |
222 | }; | 211 | }; |
223 | 212 | ||
224 | struct sil24_cmd_block { | 213 | struct sil24_ata_block { |
225 | struct sil24_prb prb; | 214 | struct sil24_prb prb; |
226 | struct sil24_sge sge[LIBATA_MAX_PRD]; | 215 | struct sil24_sge sge[LIBATA_MAX_PRD]; |
227 | }; | 216 | }; |
228 | 217 | ||
218 | struct sil24_atapi_block { | ||
219 | struct sil24_prb prb; | ||
220 | u8 cdb[16]; | ||
221 | struct sil24_sge sge[LIBATA_MAX_PRD - 1]; | ||
222 | }; | ||
223 | |||
224 | union sil24_cmd_block { | ||
225 | struct sil24_ata_block ata; | ||
226 | struct sil24_atapi_block atapi; | ||
227 | }; | ||
228 | |||
229 | /* | 229 | /* |
230 | * ap->private_data | 230 | * ap->private_data |
231 | * | 231 | * |
@@ -233,7 +233,7 @@ struct sil24_cmd_block { | |||
233 | * here from the previous interrupt. | 233 | * here from the previous interrupt. |
234 | */ | 234 | */ |
235 | struct sil24_port_priv { | 235 | struct sil24_port_priv { |
236 | struct sil24_cmd_block *cmd_block; /* 32 cmd blocks */ | 236 | union sil24_cmd_block *cmd_block; /* 32 cmd blocks */ |
237 | dma_addr_t cmd_block_dma; /* DMA base addr for them */ | 237 | dma_addr_t cmd_block_dma; /* DMA base addr for them */ |
238 | struct ata_taskfile tf; /* Cached taskfile registers */ | 238 | struct ata_taskfile tf; /* Cached taskfile registers */ |
239 | }; | 239 | }; |
@@ -244,6 +244,7 @@ struct sil24_host_priv { | |||
244 | void __iomem *port_base; /* port registers (4 * 8192 bytes @BAR2) */ | 244 | void __iomem *port_base; /* port registers (4 * 8192 bytes @BAR2) */ |
245 | }; | 245 | }; |
246 | 246 | ||
247 | static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev); | ||
247 | static u8 sil24_check_status(struct ata_port *ap); | 248 | static u8 sil24_check_status(struct ata_port *ap); |
248 | static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg); | 249 | static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg); |
249 | static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val); | 250 | static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val); |
@@ -297,6 +298,8 @@ static struct scsi_host_template sil24_sht = { | |||
297 | static const struct ata_port_operations sil24_ops = { | 298 | static const struct ata_port_operations sil24_ops = { |
298 | .port_disable = ata_port_disable, | 299 | .port_disable = ata_port_disable, |
299 | 300 | ||
301 | .dev_config = sil24_dev_config, | ||
302 | |||
300 | .check_status = sil24_check_status, | 303 | .check_status = sil24_check_status, |
301 | .check_altstatus = sil24_check_status, | 304 | .check_altstatus = sil24_check_status, |
302 | .dev_select = ata_noop_dev_select, | 305 | .dev_select = ata_noop_dev_select, |
@@ -333,7 +336,7 @@ static struct ata_port_info sil24_port_info[] = { | |||
333 | { | 336 | { |
334 | .sht = &sil24_sht, | 337 | .sht = &sil24_sht, |
335 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 338 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
336 | ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO | | 339 | ATA_FLAG_SRST | ATA_FLAG_MMIO | |
337 | ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(4), | 340 | ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(4), |
338 | .pio_mask = 0x1f, /* pio0-4 */ | 341 | .pio_mask = 0x1f, /* pio0-4 */ |
339 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 342 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -344,7 +347,7 @@ static struct ata_port_info sil24_port_info[] = { | |||
344 | { | 347 | { |
345 | .sht = &sil24_sht, | 348 | .sht = &sil24_sht, |
346 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 349 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
347 | ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO | | 350 | ATA_FLAG_SRST | ATA_FLAG_MMIO | |
348 | ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(2), | 351 | ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(2), |
349 | .pio_mask = 0x1f, /* pio0-4 */ | 352 | .pio_mask = 0x1f, /* pio0-4 */ |
350 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 353 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -355,7 +358,7 @@ static struct ata_port_info sil24_port_info[] = { | |||
355 | { | 358 | { |
356 | .sht = &sil24_sht, | 359 | .sht = &sil24_sht, |
357 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 360 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
358 | ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO | | 361 | ATA_FLAG_SRST | ATA_FLAG_MMIO | |
359 | ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(1), | 362 | ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(1), |
360 | .pio_mask = 0x1f, /* pio0-4 */ | 363 | .pio_mask = 0x1f, /* pio0-4 */ |
361 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 364 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -364,6 +367,16 @@ static struct ata_port_info sil24_port_info[] = { | |||
364 | }, | 367 | }, |
365 | }; | 368 | }; |
366 | 369 | ||
370 | static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev) | ||
371 | { | ||
372 | void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; | ||
373 | |||
374 | if (ap->cdb_len == 16) | ||
375 | writel(PORT_CS_CDB16, port + PORT_CTRL_STAT); | ||
376 | else | ||
377 | writel(PORT_CS_CDB16, port + PORT_CTRL_CLR); | ||
378 | } | ||
379 | |||
367 | static inline void sil24_update_tf(struct ata_port *ap) | 380 | static inline void sil24_update_tf(struct ata_port *ap) |
368 | { | 381 | { |
369 | struct sil24_port_priv *pp = ap->private_data; | 382 | struct sil24_port_priv *pp = ap->private_data; |
@@ -415,22 +428,73 @@ static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf) | |||
415 | *tf = pp->tf; | 428 | *tf = pp->tf; |
416 | } | 429 | } |
417 | 430 | ||
418 | static void sil24_phy_reset(struct ata_port *ap) | 431 | static int sil24_issue_SRST(struct ata_port *ap) |
419 | { | 432 | { |
420 | __sata_phy_reset(ap); | 433 | void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; |
434 | struct sil24_port_priv *pp = ap->private_data; | ||
435 | struct sil24_prb *prb = &pp->cmd_block[0].ata.prb; | ||
436 | dma_addr_t paddr = pp->cmd_block_dma; | ||
437 | u32 irq_enable, irq_stat; | ||
438 | int cnt; | ||
439 | |||
440 | /* temporarily turn off IRQs during SRST */ | ||
441 | irq_enable = readl(port + PORT_IRQ_ENABLE_SET); | ||
442 | writel(irq_enable, port + PORT_IRQ_ENABLE_CLR); | ||
443 | |||
421 | /* | 444 | /* |
422 | * No ATAPI yet. Just unconditionally indicate ATA device. | 445 | * XXX: Not sure whether the following sleep is needed or not. |
423 | * If ATAPI device is attached, it will fail ATA_CMD_ID_ATA | 446 | * The original driver had it. So.... |
424 | * and libata core will ignore the device. | ||
425 | */ | 447 | */ |
426 | if (!(ap->flags & ATA_FLAG_PORT_DISABLED)) | 448 | msleep(10); |
427 | ap->device[0].class = ATA_DEV_ATA; | 449 | |
450 | prb->ctrl = PRB_CTRL_SRST; | ||
451 | prb->fis[1] = 0; /* no PM yet */ | ||
452 | |||
453 | writel((u32)paddr, port + PORT_CMD_ACTIVATE); | ||
454 | |||
455 | for (cnt = 0; cnt < 100; cnt++) { | ||
456 | irq_stat = readl(port + PORT_IRQ_STAT); | ||
457 | writel(irq_stat, port + PORT_IRQ_STAT); /* clear irq */ | ||
458 | |||
459 | irq_stat >>= PORT_IRQ_RAW_SHIFT; | ||
460 | if (irq_stat & (PORT_IRQ_COMPLETE | PORT_IRQ_ERROR)) | ||
461 | break; | ||
462 | |||
463 | msleep(1); | ||
464 | } | ||
465 | |||
466 | /* restore IRQs */ | ||
467 | writel(irq_enable, port + PORT_IRQ_ENABLE_SET); | ||
468 | |||
469 | if (!(irq_stat & PORT_IRQ_COMPLETE)) | ||
470 | return -1; | ||
471 | |||
472 | /* update TF */ | ||
473 | sil24_update_tf(ap); | ||
474 | return 0; | ||
475 | } | ||
476 | |||
477 | static void sil24_phy_reset(struct ata_port *ap) | ||
478 | { | ||
479 | struct sil24_port_priv *pp = ap->private_data; | ||
480 | |||
481 | __sata_phy_reset(ap); | ||
482 | if (ap->flags & ATA_FLAG_PORT_DISABLED) | ||
483 | return; | ||
484 | |||
485 | if (sil24_issue_SRST(ap) < 0) { | ||
486 | printk(KERN_ERR DRV_NAME | ||
487 | " ata%u: SRST failed, disabling port\n", ap->id); | ||
488 | ap->ops->port_disable(ap); | ||
489 | return; | ||
490 | } | ||
491 | |||
492 | ap->device->class = ata_dev_classify(&pp->tf); | ||
428 | } | 493 | } |
429 | 494 | ||
430 | static inline void sil24_fill_sg(struct ata_queued_cmd *qc, | 495 | static inline void sil24_fill_sg(struct ata_queued_cmd *qc, |
431 | struct sil24_cmd_block *cb) | 496 | struct sil24_sge *sge) |
432 | { | 497 | { |
433 | struct sil24_sge *sge = cb->sge; | ||
434 | struct scatterlist *sg; | 498 | struct scatterlist *sg; |
435 | unsigned int idx = 0; | 499 | unsigned int idx = 0; |
436 | 500 | ||
@@ -451,23 +515,47 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc) | |||
451 | { | 515 | { |
452 | struct ata_port *ap = qc->ap; | 516 | struct ata_port *ap = qc->ap; |
453 | struct sil24_port_priv *pp = ap->private_data; | 517 | struct sil24_port_priv *pp = ap->private_data; |
454 | struct sil24_cmd_block *cb = pp->cmd_block + qc->tag; | 518 | union sil24_cmd_block *cb = pp->cmd_block + qc->tag; |
455 | struct sil24_prb *prb = &cb->prb; | 519 | struct sil24_prb *prb; |
520 | struct sil24_sge *sge; | ||
456 | 521 | ||
457 | switch (qc->tf.protocol) { | 522 | switch (qc->tf.protocol) { |
458 | case ATA_PROT_PIO: | 523 | case ATA_PROT_PIO: |
459 | case ATA_PROT_DMA: | 524 | case ATA_PROT_DMA: |
460 | case ATA_PROT_NODATA: | 525 | case ATA_PROT_NODATA: |
526 | prb = &cb->ata.prb; | ||
527 | sge = cb->ata.sge; | ||
528 | prb->ctrl = 0; | ||
529 | break; | ||
530 | |||
531 | case ATA_PROT_ATAPI: | ||
532 | case ATA_PROT_ATAPI_DMA: | ||
533 | case ATA_PROT_ATAPI_NODATA: | ||
534 | prb = &cb->atapi.prb; | ||
535 | sge = cb->atapi.sge; | ||
536 | memset(cb->atapi.cdb, 0, 32); | ||
537 | memcpy(cb->atapi.cdb, qc->cdb, ap->cdb_len); | ||
538 | |||
539 | if (qc->tf.protocol != ATA_PROT_ATAPI_NODATA) { | ||
540 | if (qc->tf.flags & ATA_TFLAG_WRITE) | ||
541 | prb->ctrl = PRB_CTRL_PACKET_WRITE; | ||
542 | else | ||
543 | prb->ctrl = PRB_CTRL_PACKET_READ; | ||
544 | } else | ||
545 | prb->ctrl = 0; | ||
546 | |||
461 | break; | 547 | break; |
548 | |||
462 | default: | 549 | default: |
463 | /* ATAPI isn't supported yet */ | 550 | prb = NULL; /* shut up, gcc */ |
551 | sge = NULL; | ||
464 | BUG(); | 552 | BUG(); |
465 | } | 553 | } |
466 | 554 | ||
467 | ata_tf_to_fis(&qc->tf, prb->fis, 0); | 555 | ata_tf_to_fis(&qc->tf, prb->fis, 0); |
468 | 556 | ||
469 | if (qc->flags & ATA_QCFLAG_DMAMAP) | 557 | if (qc->flags & ATA_QCFLAG_DMAMAP) |
470 | sil24_fill_sg(qc, cb); | 558 | sil24_fill_sg(qc, sge); |
471 | } | 559 | } |
472 | 560 | ||
473 | static int sil24_qc_issue(struct ata_queued_cmd *qc) | 561 | static int sil24_qc_issue(struct ata_queued_cmd *qc) |
@@ -486,6 +574,31 @@ static void sil24_irq_clear(struct ata_port *ap) | |||
486 | /* unused */ | 574 | /* unused */ |
487 | } | 575 | } |
488 | 576 | ||
577 | static int __sil24_restart_controller(void __iomem *port) | ||
578 | { | ||
579 | u32 tmp; | ||
580 | int cnt; | ||
581 | |||
582 | writel(PORT_CS_INIT, port + PORT_CTRL_STAT); | ||
583 | |||
584 | /* Max ~10ms */ | ||
585 | for (cnt = 0; cnt < 10000; cnt++) { | ||
586 | tmp = readl(port + PORT_CTRL_STAT); | ||
587 | if (tmp & PORT_CS_RDY) | ||
588 | return 0; | ||
589 | udelay(1); | ||
590 | } | ||
591 | |||
592 | return -1; | ||
593 | } | ||
594 | |||
595 | static void sil24_restart_controller(struct ata_port *ap) | ||
596 | { | ||
597 | if (__sil24_restart_controller((void __iomem *)ap->ioaddr.cmd_addr)) | ||
598 | printk(KERN_ERR DRV_NAME | ||
599 | " ata%u: failed to restart controller\n", ap->id); | ||
600 | } | ||
601 | |||
489 | static int __sil24_reset_controller(void __iomem *port) | 602 | static int __sil24_reset_controller(void __iomem *port) |
490 | { | 603 | { |
491 | int cnt; | 604 | int cnt; |
@@ -505,7 +618,11 @@ static int __sil24_reset_controller(void __iomem *port) | |||
505 | 618 | ||
506 | if (tmp & PORT_CS_DEV_RST) | 619 | if (tmp & PORT_CS_DEV_RST) |
507 | return -1; | 620 | return -1; |
508 | return 0; | 621 | |
622 | if (tmp & PORT_CS_RDY) | ||
623 | return 0; | ||
624 | |||
625 | return __sil24_restart_controller(port); | ||
509 | } | 626 | } |
510 | 627 | ||
511 | static void sil24_reset_controller(struct ata_port *ap) | 628 | static void sil24_reset_controller(struct ata_port *ap) |
@@ -567,9 +684,15 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat) | |||
567 | if (serror) | 684 | if (serror) |
568 | writel(serror, port + PORT_SERROR); | 685 | writel(serror, port + PORT_SERROR); |
569 | 686 | ||
570 | printk(KERN_ERR DRV_NAME " ata%u: error interrupt on port%d\n" | 687 | /* |
571 | " stat=0x%x irq=0x%x cmd_err=%d sstatus=0x%x serror=0x%x\n", | 688 | * Don't log ATAPI device errors. They're supposed to happen |
572 | ap->id, ap->port_no, slot_stat, irq_stat, cmd_err, sstatus, serror); | 689 | * and any serious errors will be logged using sense data by |
690 | * the SCSI layer. | ||
691 | */ | ||
692 | if (ap->device[0].class != ATA_DEV_ATAPI || cmd_err > PORT_CERR_SDB) | ||
693 | printk("ata%u: error interrupt on port%d\n" | ||
694 | " stat=0x%x irq=0x%x cmd_err=%d sstatus=0x%x serror=0x%x\n", | ||
695 | ap->id, ap->port_no, slot_stat, irq_stat, cmd_err, sstatus, serror); | ||
573 | 696 | ||
574 | if (cmd_err == PORT_CERR_DEV || cmd_err == PORT_CERR_SDB) { | 697 | if (cmd_err == PORT_CERR_DEV || cmd_err == PORT_CERR_SDB) { |
575 | /* | 698 | /* |
@@ -577,6 +700,7 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat) | |||
577 | */ | 700 | */ |
578 | sil24_update_tf(ap); | 701 | sil24_update_tf(ap); |
579 | err_mask = ac_err_mask(pp->tf.command); | 702 | err_mask = ac_err_mask(pp->tf.command); |
703 | sil24_restart_controller(ap); | ||
580 | } else { | 704 | } else { |
581 | /* | 705 | /* |
582 | * Other errors. libata currently doesn't have any | 706 | * Other errors. libata currently doesn't have any |
@@ -584,12 +708,11 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat) | |||
584 | * ATA_ERR. | 708 | * ATA_ERR. |
585 | */ | 709 | */ |
586 | err_mask = AC_ERR_OTHER; | 710 | err_mask = AC_ERR_OTHER; |
711 | sil24_reset_controller(ap); | ||
587 | } | 712 | } |
588 | 713 | ||
589 | if (qc) | 714 | if (qc) |
590 | ata_qc_complete(qc, err_mask); | 715 | ata_qc_complete(qc, err_mask); |
591 | |||
592 | sil24_reset_controller(ap); | ||
593 | } | 716 | } |
594 | 717 | ||
595 | static inline void sil24_host_intr(struct ata_port *ap) | 718 | static inline void sil24_host_intr(struct ata_port *ap) |
@@ -665,7 +788,7 @@ static int sil24_port_start(struct ata_port *ap) | |||
665 | { | 788 | { |
666 | struct device *dev = ap->host_set->dev; | 789 | struct device *dev = ap->host_set->dev; |
667 | struct sil24_port_priv *pp; | 790 | struct sil24_port_priv *pp; |
668 | struct sil24_cmd_block *cb; | 791 | union sil24_cmd_block *cb; |
669 | size_t cb_size = sizeof(*cb); | 792 | size_t cb_size = sizeof(*cb); |
670 | dma_addr_t cb_dma; | 793 | dma_addr_t cb_dma; |
671 | int rc = -ENOMEM; | 794 | int rc = -ENOMEM; |
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index ff36f0c9fdad..ad47c1b84c3f 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
@@ -507,7 +507,7 @@ config SERIAL_SUNSU_CONSOLE | |||
507 | 507 | ||
508 | config SERIAL_MUX | 508 | config SERIAL_MUX |
509 | tristate "Serial MUX support" | 509 | tristate "Serial MUX support" |
510 | depends on PARISC | 510 | depends on GSC |
511 | select SERIAL_CORE | 511 | select SERIAL_CORE |
512 | default y | 512 | default y |
513 | ---help--- | 513 | ---help--- |
diff --git a/drivers/serial/mux.c b/drivers/serial/mux.c index 660bae5ba179..7633132a10aa 100644 --- a/drivers/serial/mux.c +++ b/drivers/serial/mux.c | |||
@@ -65,8 +65,8 @@ static struct uart_driver mux_driver = { | |||
65 | 65 | ||
66 | static struct timer_list mux_timer; | 66 | static struct timer_list mux_timer; |
67 | 67 | ||
68 | #define UART_PUT_CHAR(p, c) __raw_writel((c), (unsigned long)(p)->membase + IO_DATA_REG_OFFSET) | 68 | #define UART_PUT_CHAR(p, c) __raw_writel((c), (p)->membase + IO_DATA_REG_OFFSET) |
69 | #define UART_GET_FIFO_CNT(p) __raw_readl((unsigned long)(p)->membase + IO_DCOUNT_REG_OFFSET) | 69 | #define UART_GET_FIFO_CNT(p) __raw_readl((p)->membase + IO_DCOUNT_REG_OFFSET) |
70 | #define GET_MUX_PORTS(iodc_data) ((((iodc_data)[4] & 0xf0) >> 4) * 8) + 8 | 70 | #define GET_MUX_PORTS(iodc_data) ((((iodc_data)[4] & 0xf0) >> 4) * 8) + 8 |
71 | 71 | ||
72 | /** | 72 | /** |
@@ -79,10 +79,7 @@ static struct timer_list mux_timer; | |||
79 | */ | 79 | */ |
80 | static unsigned int mux_tx_empty(struct uart_port *port) | 80 | static unsigned int mux_tx_empty(struct uart_port *port) |
81 | { | 81 | { |
82 | unsigned int cnt = __raw_readl((unsigned long)port->membase | 82 | return UART_GET_FIFO_CNT(port) ? 0 : TIOCSER_TEMT; |
83 | + IO_DCOUNT_REG_OFFSET); | ||
84 | |||
85 | return cnt ? 0 : TIOCSER_TEMT; | ||
86 | } | 83 | } |
87 | 84 | ||
88 | /** | 85 | /** |
@@ -218,8 +215,7 @@ static void mux_read(struct uart_port *port) | |||
218 | __u32 start_count = port->icount.rx; | 215 | __u32 start_count = port->icount.rx; |
219 | 216 | ||
220 | while(1) { | 217 | while(1) { |
221 | data = __raw_readl((unsigned long)port->membase | 218 | data = __raw_readl(port->membase + IO_DATA_REG_OFFSET); |
222 | + IO_DATA_REG_OFFSET); | ||
223 | 219 | ||
224 | if (MUX_STATUS(data)) | 220 | if (MUX_STATUS(data)) |
225 | continue; | 221 | continue; |
@@ -481,6 +477,13 @@ static int __init mux_probe(struct parisc_device *dev) | |||
481 | port->ops = &mux_pops; | 477 | port->ops = &mux_pops; |
482 | port->flags = UPF_BOOT_AUTOCONF; | 478 | port->flags = UPF_BOOT_AUTOCONF; |
483 | port->line = port_cnt; | 479 | port->line = port_cnt; |
480 | |||
481 | /* The port->timeout needs to match what is present in | ||
482 | * uart_wait_until_sent in serial_core.c. Otherwise | ||
483 | * the time spent in msleep_interruptable will be very | ||
484 | * long, causing the appearance of a console hang. | ||
485 | */ | ||
486 | port->timeout = HZ / 50; | ||
484 | spin_lock_init(&port->lock); | 487 | spin_lock_init(&port->lock); |
485 | status = uart_add_one_port(&mux_driver, port); | 488 | status = uart_add_one_port(&mux_driver, port); |
486 | BUG_ON(status); | 489 | BUG_ON(status); |
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c index 991c00de5c4e..31b7efd94d66 100644 --- a/fs/compat_ioctl.c +++ b/fs/compat_ioctl.c | |||
@@ -137,7 +137,7 @@ | |||
137 | #define EXT2_IOC32_GETFLAGS _IOR('f', 1, int) | 137 | #define EXT2_IOC32_GETFLAGS _IOR('f', 1, int) |
138 | #define EXT2_IOC32_SETFLAGS _IOW('f', 2, int) | 138 | #define EXT2_IOC32_SETFLAGS _IOW('f', 2, int) |
139 | #define EXT3_IOC32_GETVERSION _IOR('f', 3, int) | 139 | #define EXT3_IOC32_GETVERSION _IOR('f', 3, int) |
140 | #define EXT3_IOC32_SETVERSION _IOR('f', 4, int) | 140 | #define EXT3_IOC32_SETVERSION _IOW('f', 4, int) |
141 | #define EXT3_IOC32_GETRSVSZ _IOR('f', 5, int) | 141 | #define EXT3_IOC32_GETRSVSZ _IOR('f', 5, int) |
142 | #define EXT3_IOC32_SETRSVSZ _IOW('f', 6, int) | 142 | #define EXT3_IOC32_SETRSVSZ _IOW('f', 6, int) |
143 | #define EXT3_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int) | 143 | #define EXT3_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int) |
diff --git a/include/asm-parisc/irq.h b/include/asm-parisc/irq.h index f876bdf22056..b0a30e2c9813 100644 --- a/include/asm-parisc/irq.h +++ b/include/asm-parisc/irq.h | |||
@@ -8,6 +8,7 @@ | |||
8 | #define _ASM_PARISC_IRQ_H | 8 | #define _ASM_PARISC_IRQ_H |
9 | 9 | ||
10 | #include <linux/config.h> | 10 | #include <linux/config.h> |
11 | #include <linux/cpumask.h> | ||
11 | #include <asm/types.h> | 12 | #include <asm/types.h> |
12 | 13 | ||
13 | #define NO_IRQ (-1) | 14 | #define NO_IRQ (-1) |
@@ -49,10 +50,10 @@ extern int txn_alloc_irq(unsigned int nbits); | |||
49 | extern int txn_claim_irq(int); | 50 | extern int txn_claim_irq(int); |
50 | extern unsigned int txn_alloc_data(unsigned int); | 51 | extern unsigned int txn_alloc_data(unsigned int); |
51 | extern unsigned long txn_alloc_addr(unsigned int); | 52 | extern unsigned long txn_alloc_addr(unsigned int); |
53 | extern unsigned long txn_affinity_addr(unsigned int irq, int cpu); | ||
52 | 54 | ||
53 | extern int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *, void *); | 55 | extern int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *, void *); |
54 | 56 | extern int cpu_check_affinity(unsigned int irq, cpumask_t *dest); | |
55 | extern int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *, void *); | ||
56 | 57 | ||
57 | /* soft power switch support (power.c) */ | 58 | /* soft power switch support (power.c) */ |
58 | extern struct tasklet_struct power_tasklet; | 59 | extern struct tasklet_struct power_tasklet; |
diff --git a/include/asm-parisc/smp.h b/include/asm-parisc/smp.h index 9413f67a540b..dbdbd2e9fdf9 100644 --- a/include/asm-parisc/smp.h +++ b/include/asm-parisc/smp.h | |||
@@ -29,6 +29,7 @@ extern cpumask_t cpu_online_map; | |||
29 | #define cpu_logical_map(cpu) (cpu) | 29 | #define cpu_logical_map(cpu) (cpu) |
30 | 30 | ||
31 | extern void smp_send_reschedule(int cpu); | 31 | extern void smp_send_reschedule(int cpu); |
32 | extern void smp_send_all_nop(void); | ||
32 | 33 | ||
33 | #endif /* !ASSEMBLY */ | 34 | #endif /* !ASSEMBLY */ |
34 | 35 | ||
@@ -53,7 +54,11 @@ extern unsigned long cpu_present_mask; | |||
53 | 54 | ||
54 | #define raw_smp_processor_id() (current_thread_info()->cpu) | 55 | #define raw_smp_processor_id() (current_thread_info()->cpu) |
55 | 56 | ||
56 | #endif /* CONFIG_SMP */ | 57 | #else /* CONFIG_SMP */ |
58 | |||
59 | static inline void smp_send_all_nop(void) { return; } | ||
60 | |||
61 | #endif | ||
57 | 62 | ||
58 | #define NO_PROC_ID 0xFF /* No processor magic marker */ | 63 | #define NO_PROC_ID 0xFF /* No processor magic marker */ |
59 | #define ANY_PROC_ID 0xFF /* Any processor magic marker */ | 64 | #define ANY_PROC_ID 0xFF /* Any processor magic marker */ |
diff --git a/include/asm-parisc/spinlock.h b/include/asm-parisc/spinlock.h index 7c3f406a746a..16c2ac075fc5 100644 --- a/include/asm-parisc/spinlock.h +++ b/include/asm-parisc/spinlock.h | |||
@@ -11,18 +11,25 @@ static inline int __raw_spin_is_locked(raw_spinlock_t *x) | |||
11 | return *a == 0; | 11 | return *a == 0; |
12 | } | 12 | } |
13 | 13 | ||
14 | #define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock) | 14 | #define __raw_spin_lock(lock) __raw_spin_lock_flags(lock, 0) |
15 | #define __raw_spin_unlock_wait(x) \ | 15 | #define __raw_spin_unlock_wait(x) \ |
16 | do { cpu_relax(); } while (__raw_spin_is_locked(x)) | 16 | do { cpu_relax(); } while (__raw_spin_is_locked(x)) |
17 | 17 | ||
18 | static inline void __raw_spin_lock(raw_spinlock_t *x) | 18 | static inline void __raw_spin_lock_flags(raw_spinlock_t *x, |
19 | unsigned long flags) | ||
19 | { | 20 | { |
20 | volatile unsigned int *a; | 21 | volatile unsigned int *a; |
21 | 22 | ||
22 | mb(); | 23 | mb(); |
23 | a = __ldcw_align(x); | 24 | a = __ldcw_align(x); |
24 | while (__ldcw(a) == 0) | 25 | while (__ldcw(a) == 0) |
25 | while (*a == 0); | 26 | while (*a == 0) |
27 | if (flags & PSW_SM_I) { | ||
28 | local_irq_enable(); | ||
29 | cpu_relax(); | ||
30 | local_irq_disable(); | ||
31 | } else | ||
32 | cpu_relax(); | ||
26 | mb(); | 33 | mb(); |
27 | } | 34 | } |
28 | 35 | ||
@@ -60,26 +67,20 @@ static inline int __raw_spin_trylock(raw_spinlock_t *x) | |||
60 | 67 | ||
61 | static __inline__ void __raw_read_lock(raw_rwlock_t *rw) | 68 | static __inline__ void __raw_read_lock(raw_rwlock_t *rw) |
62 | { | 69 | { |
63 | unsigned long flags; | ||
64 | local_irq_save(flags); | ||
65 | __raw_spin_lock(&rw->lock); | 70 | __raw_spin_lock(&rw->lock); |
66 | 71 | ||
67 | rw->counter++; | 72 | rw->counter++; |
68 | 73 | ||
69 | __raw_spin_unlock(&rw->lock); | 74 | __raw_spin_unlock(&rw->lock); |
70 | local_irq_restore(flags); | ||
71 | } | 75 | } |
72 | 76 | ||
73 | static __inline__ void __raw_read_unlock(raw_rwlock_t *rw) | 77 | static __inline__ void __raw_read_unlock(raw_rwlock_t *rw) |
74 | { | 78 | { |
75 | unsigned long flags; | ||
76 | local_irq_save(flags); | ||
77 | __raw_spin_lock(&rw->lock); | 79 | __raw_spin_lock(&rw->lock); |
78 | 80 | ||
79 | rw->counter--; | 81 | rw->counter--; |
80 | 82 | ||
81 | __raw_spin_unlock(&rw->lock); | 83 | __raw_spin_unlock(&rw->lock); |
82 | local_irq_restore(flags); | ||
83 | } | 84 | } |
84 | 85 | ||
85 | /* write_lock is less trivial. We optimistically grab the lock and check | 86 | /* write_lock is less trivial. We optimistically grab the lock and check |
diff --git a/include/asm-parisc/tlbflush.h b/include/asm-parisc/tlbflush.h index e97aa8d1eff5..c9ec39c6fc6c 100644 --- a/include/asm-parisc/tlbflush.h +++ b/include/asm-parisc/tlbflush.h | |||
@@ -12,21 +12,15 @@ | |||
12 | * N class systems, only one PxTLB inter processor broadcast can be | 12 | * N class systems, only one PxTLB inter processor broadcast can be |
13 | * active at any one time on the Merced bus. This tlb purge | 13 | * active at any one time on the Merced bus. This tlb purge |
14 | * synchronisation is fairly lightweight and harmless so we activate | 14 | * synchronisation is fairly lightweight and harmless so we activate |
15 | * it on all SMP systems not just the N class. */ | 15 | * it on all SMP systems not just the N class. We also need to have |
16 | #ifdef CONFIG_SMP | 16 | * preemption disabled on uniprocessor machines, and spin_lock does that |
17 | * nicely. | ||
18 | */ | ||
17 | extern spinlock_t pa_tlb_lock; | 19 | extern spinlock_t pa_tlb_lock; |
18 | 20 | ||
19 | #define purge_tlb_start(x) spin_lock(&pa_tlb_lock) | 21 | #define purge_tlb_start(x) spin_lock(&pa_tlb_lock) |
20 | #define purge_tlb_end(x) spin_unlock(&pa_tlb_lock) | 22 | #define purge_tlb_end(x) spin_unlock(&pa_tlb_lock) |
21 | 23 | ||
22 | #else | ||
23 | |||
24 | #define purge_tlb_start(x) do { } while(0) | ||
25 | #define purge_tlb_end(x) do { } while (0) | ||
26 | |||
27 | #endif | ||
28 | |||
29 | |||
30 | extern void flush_tlb_all(void); | 24 | extern void flush_tlb_all(void); |
31 | 25 | ||
32 | /* | 26 | /* |
@@ -88,7 +82,6 @@ static inline void flush_tlb_range(struct vm_area_struct *vma, | |||
88 | if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */ | 82 | if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */ |
89 | flush_tlb_all(); | 83 | flush_tlb_all(); |
90 | else { | 84 | else { |
91 | preempt_disable(); | ||
92 | mtsp(vma->vm_mm->context,1); | 85 | mtsp(vma->vm_mm->context,1); |
93 | purge_tlb_start(); | 86 | purge_tlb_start(); |
94 | if (split_tlb) { | 87 | if (split_tlb) { |
@@ -102,7 +95,6 @@ static inline void flush_tlb_range(struct vm_area_struct *vma, | |||
102 | pdtlb(start); | 95 | pdtlb(start); |
103 | start += PAGE_SIZE; | 96 | start += PAGE_SIZE; |
104 | } | 97 | } |
105 | preempt_enable(); | ||
106 | } | 98 | } |
107 | purge_tlb_end(); | 99 | purge_tlb_end(); |
108 | } | 100 | } |
diff --git a/include/linux/cciss_ioctl.h b/include/linux/cciss_ioctl.h index 424d5e622b43..6e27f42e3a57 100644 --- a/include/linux/cciss_ioctl.h +++ b/include/linux/cciss_ioctl.h | |||
@@ -10,8 +10,8 @@ | |||
10 | typedef struct _cciss_pci_info_struct | 10 | typedef struct _cciss_pci_info_struct |
11 | { | 11 | { |
12 | unsigned char bus; | 12 | unsigned char bus; |
13 | unsigned short domain; | ||
14 | unsigned char dev_fn; | 13 | unsigned char dev_fn; |
14 | unsigned short domain; | ||
15 | __u32 board_id; | 15 | __u32 board_id; |
16 | } cciss_pci_info_struct; | 16 | } cciss_pci_info_struct; |
17 | 17 | ||
diff --git a/include/linux/ide.h b/include/linux/ide.h index ac8b25fa6506..e99019057ba6 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -1089,9 +1089,11 @@ enum { | |||
1089 | 1089 | ||
1090 | /* | 1090 | /* |
1091 | * Subdrivers support. | 1091 | * Subdrivers support. |
1092 | * | ||
1093 | * The gendriver.owner field should be set to the module owner of this driver. | ||
1094 | * The gendriver.name field should be set to the name of this driver | ||
1092 | */ | 1095 | */ |
1093 | typedef struct ide_driver_s { | 1096 | typedef struct ide_driver_s { |
1094 | struct module *owner; | ||
1095 | const char *version; | 1097 | const char *version; |
1096 | u8 media; | 1098 | u8 media; |
1097 | unsigned supports_dsc_overlap : 1; | 1099 | unsigned supports_dsc_overlap : 1; |
diff --git a/include/linux/mm.h b/include/linux/mm.h index 1013a42d10b1..0986d19be0b7 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -940,7 +940,9 @@ unsigned long max_sane_readahead(unsigned long nr); | |||
940 | 940 | ||
941 | /* Do stack extension */ | 941 | /* Do stack extension */ |
942 | extern int expand_stack(struct vm_area_struct *vma, unsigned long address); | 942 | extern int expand_stack(struct vm_area_struct *vma, unsigned long address); |
943 | #ifdef CONFIG_IA64 | ||
943 | extern int expand_upwards(struct vm_area_struct *vma, unsigned long address); | 944 | extern int expand_upwards(struct vm_area_struct *vma, unsigned long address); |
945 | #endif | ||
944 | 946 | ||
945 | /* Look up the first VMA which satisfies addr < vm_end, NULL if none. */ | 947 | /* Look up the first VMA which satisfies addr < vm_end, NULL if none. */ |
946 | extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr); | 948 | extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr); |
@@ -1501,7 +1501,7 @@ static int acct_stack_growth(struct vm_area_struct * vma, unsigned long size, un | |||
1501 | * PA-RISC uses this for its stack; IA64 for its Register Backing Store. | 1501 | * PA-RISC uses this for its stack; IA64 for its Register Backing Store. |
1502 | * vma is the last one with address > vma->vm_end. Have to extend vma. | 1502 | * vma is the last one with address > vma->vm_end. Have to extend vma. |
1503 | */ | 1503 | */ |
1504 | #ifdef CONFIG_STACK_GROWSUP | 1504 | #ifndef CONFIG_IA64 |
1505 | static inline | 1505 | static inline |
1506 | #endif | 1506 | #endif |
1507 | int expand_upwards(struct vm_area_struct *vma, unsigned long address) | 1507 | int expand_upwards(struct vm_area_struct *vma, unsigned long address) |