aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CREDITS12
-rw-r--r--Documentation/00-INDEX6
-rw-r--r--Documentation/HOWTO618
-rw-r--r--Documentation/arm/memory.txt4
-rw-r--r--MAINTAINERS16
-rw-r--r--Makefile2
-rw-r--r--arch/arm/kernel/armksyms.c1
-rw-r--r--arch/arm/kernel/entry-common.S3
-rw-r--r--arch/arm/kernel/signal.c25
-rw-r--r--arch/arm/kernel/vmlinux.lds.S6
-rw-r--r--arch/arm/lib/getuser.S11
-rw-r--r--arch/arm/mm/Makefile2
-rw-r--r--arch/arm/mm/blockops.c185
-rw-r--r--arch/arm/mm/init.c24
-rw-r--r--arch/arm/mm/ioremap.c3
-rw-r--r--arch/ia64/kernel/ivt.S133
-rw-r--r--arch/parisc/kernel/drivers.c8
-rw-r--r--arch/parisc/kernel/entry.S1
-rw-r--r--arch/parisc/kernel/inventory.c2
-rw-r--r--arch/parisc/kernel/ioctl32.c546
-rw-r--r--arch/parisc/kernel/irq.c110
-rw-r--r--arch/parisc/kernel/perf.c33
-rw-r--r--arch/parisc/kernel/ptrace.c5
-rw-r--r--arch/parisc/kernel/signal.c1
-rw-r--r--arch/parisc/kernel/smp.c24
-rw-r--r--arch/parisc/kernel/syscall.S3
-rw-r--r--arch/powerpc/kernel/pci_64.c18
-rw-r--r--arch/powerpc/kernel/ppc_ksyms.c3
-rw-r--r--arch/powerpc/kernel/ptrace-common.h (renamed from include/asm-ppc64/ptrace-common.h)0
-rw-r--r--arch/powerpc/kernel/ptrace.c3
-rw-r--r--arch/powerpc/kernel/ptrace32.c3
-rw-r--r--arch/powerpc/mm/imalloc.c3
-rw-r--r--arch/powerpc/mm/init_64.c3
-rw-r--r--arch/powerpc/mm/mmu_decl.h14
-rw-r--r--arch/powerpc/mm/pgtable_64.c3
-rw-r--r--arch/powerpc/platforms/powermac/smp.c6
-rw-r--r--arch/powerpc/sysdev/mpic.c13
-rw-r--r--block/as-iosched.c2
-rw-r--r--block/cfq-iosched.c2
-rw-r--r--block/deadline-iosched.c2
-rw-r--r--block/elevator.c2
-rw-r--r--block/ll_rw_blk.c2
-rw-r--r--drivers/block/cciss.c40
-rw-r--r--drivers/i2c/busses/i2c-ixp2000.c6
-rw-r--r--drivers/i2c/busses/i2c-ixp4xx.c7
-rw-r--r--drivers/ide/Kconfig2
-rw-r--r--drivers/ide/ide-cd.c6
-rw-r--r--drivers/ide/ide-disk.c4
-rw-r--r--drivers/ide/ide-floppy.c7
-rw-r--r--drivers/ide/ide-io.c6
-rw-r--r--drivers/ide/ide-lib.c8
-rw-r--r--drivers/ide/ide-tape.c7
-rw-r--r--drivers/ide/ide-taskfile.c27
-rw-r--r--drivers/ide/pci/aec62xx.c47
-rw-r--r--drivers/ide/pci/alim15x3.c9
-rw-r--r--drivers/ide/pci/cs5520.c5
-rw-r--r--drivers/ide/pci/siimage.c8
-rw-r--r--drivers/ide/pci/sis5513.c1
-rw-r--r--drivers/ide/pci/via82cxxx.c407
-rw-r--r--drivers/ide/ppc/pmac.c14
-rw-r--r--drivers/ide/setup-pci.c2
-rw-r--r--drivers/infiniband/core/user_mad.c2
-rw-r--r--drivers/infiniband/hw/mthca/mthca_qp.c37
-rw-r--r--drivers/infiniband/ulp/srp/ib_srp.c17
-rw-r--r--drivers/infiniband/ulp/srp/ib_srp.h1
-rw-r--r--drivers/isdn/hisax/Kconfig12
-rw-r--r--drivers/isdn/pcbit/Kconfig2
-rw-r--r--drivers/mtd/maps/ipaq-flash.c6
-rw-r--r--drivers/mtd/maps/ixp2000.c22
-rw-r--r--drivers/mtd/nand/h1910.c2
-rw-r--r--drivers/net/au1000_eth.c1
-rw-r--r--drivers/net/e100.c275
-rw-r--r--drivers/net/fec_8xx/Kconfig2
-rw-r--r--drivers/net/ioc3-eth.c2
-rw-r--r--drivers/net/r8169.c6
-rw-r--r--drivers/net/saa9730.h36
-rw-r--r--drivers/net/smc91x.c17
-rw-r--r--drivers/net/wan/hdlc_cisco.c6
-rw-r--r--drivers/net/wan/hdlc_fr.c4
-rw-r--r--drivers/net/wan/hdlc_generic.c6
-rw-r--r--drivers/net/wireless/hermes.c6
-rw-r--r--drivers/net/wireless/hermes.h6
-rw-r--r--drivers/net/wireless/i82593.h11
-rw-r--r--drivers/net/wireless/ipw2100.c29
-rw-r--r--drivers/net/wireless/ipw2100.h2
-rw-r--r--drivers/net/wireless/prism54/isl_38xx.c4
-rw-r--r--drivers/parisc/iosapic.c26
-rw-r--r--drivers/parisc/superio.c35
-rw-r--r--drivers/scsi/ide-scsi.c2
-rw-r--r--drivers/scsi/sata_mv.c3
-rw-r--r--drivers/scsi/sata_sil24.c197
-rw-r--r--drivers/serial/Kconfig2
-rw-r--r--drivers/serial/amba-pl011.c45
-rw-r--r--drivers/serial/mux.c19
-rw-r--r--drivers/serial/sa1100.c1
-rw-r--r--fs/compat_ioctl.c2
-rw-r--r--include/asm-arm/arch-ixp4xx/io.h9
-rw-r--r--include/asm-arm/hardware/amba_serial.h5
-rw-r--r--include/asm-arm/io.h21
-rw-r--r--include/asm-arm/uaccess.h8
-rw-r--r--include/asm-parisc/irq.h5
-rw-r--r--include/asm-parisc/smp.h7
-rw-r--r--include/asm-parisc/spinlock.h19
-rw-r--r--include/asm-parisc/tlbflush.h16
-rw-r--r--include/asm-powerpc/dma-mapping.h (renamed from include/asm-ppc/dma-mapping.h)138
-rw-r--r--include/asm-powerpc/io.h (renamed from include/asm-ppc64/io.h)12
-rw-r--r--include/asm-powerpc/mmu.h (renamed from include/asm-ppc64/mmu.h)14
-rw-r--r--include/asm-powerpc/mmu_context.h (renamed from include/asm-ppc64/mmu_context.h)12
-rw-r--r--include/asm-powerpc/mmzone.h (renamed from include/asm-ppc64/mmzone.h)0
-rw-r--r--include/asm-powerpc/pci-bridge.h (renamed from include/asm-ppc64/pci-bridge.h)12
-rw-r--r--include/asm-powerpc/pci.h (renamed from include/asm-ppc64/pci.h)110
-rw-r--r--include/asm-powerpc/pgalloc.h (renamed from include/asm-ppc64/pgalloc.h)11
-rw-r--r--include/asm-powerpc/pgtable-4k.h (renamed from include/asm-ppc64/pgtable-4k.h)0
-rw-r--r--include/asm-powerpc/pgtable-64k.h (renamed from include/asm-ppc64/pgtable-64k.h)0
-rw-r--r--include/asm-powerpc/pgtable.h (renamed from include/asm-ppc64/pgtable.h)20
-rw-r--r--include/asm-powerpc/ppc-pci.h2
-rw-r--r--include/asm-powerpc/spinlock.h (renamed from include/asm-ppc64/spinlock.h)72
-rw-r--r--include/asm-ppc/io.h17
-rw-r--r--include/asm-ppc64/dma-mapping.h136
-rw-r--r--include/asm-ppc64/imalloc.h26
-rw-r--r--include/linux/cciss_ioctl.h2
-rw-r--r--include/linux/hdreg.h6
-rw-r--r--include/linux/ide.h30
-rw-r--r--include/linux/mm.h2
-rw-r--r--include/linux/pci_ids.h2
-rw-r--r--include/net/ieee80211.h2
-rw-r--r--mm/mmap.c2
127 files changed, 2145 insertions, 1895 deletions
diff --git a/CREDITS b/CREDITS
index 192f749eba25..1b4f8694fa48 100644
--- a/CREDITS
+++ b/CREDITS
@@ -611,8 +611,7 @@ S: USA
611N: Randolph Chung 611N: Randolph Chung
612E: tausq@debian.org 612E: tausq@debian.org
613D: Linux/PA-RISC hacker 613D: Linux/PA-RISC hacker
614S: Los Altos, CA 94022 614S: Hong Kong
615S: USA
616 615
617N: Juan Jose Ciarlante 616N: Juan Jose Ciarlante
618W: http://juanjox.kernelnotes.org/ 617W: http://juanjox.kernelnotes.org/
@@ -3405,6 +3404,15 @@ S: Chudenicka 8
3405S: 10200 Prague 10, Hostivar 3404S: 10200 Prague 10, Hostivar
3406S: Czech Republic 3405S: Czech Republic
3407 3406
3407N: Thibaut Varene
3408E: T-Bone@parisc-linux.org
3409W: http://www.parisc-linux.org/
3410P: 1024D/B7D2F063 E67C 0D43 A75E 12A5 BB1C FA2F 1E32 C3DA B7D2 F063
3411D: PA-RISC port minion, PDC and GSCPS2 drivers, debuglocks and other bits
3412D: Some bits in an ARM port, S1D13XXX FB driver, random patches here and there
3413D: AD1889 sound driver
3414S: Paris, France
3415
3408N: Heikki Vatiainen 3416N: Heikki Vatiainen
3409E: hessu@cs.tut.fi 3417E: hessu@cs.tut.fi
3410D: Co-author of Multi-Protocol Over ATM (MPOA), some LANE hacks 3418D: 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.
25DocBook/ 25DocBook/
26 - directory with DocBook templates etc. for kernel documentation. 26 - directory with DocBook templates etc. for kernel documentation.
27HOWTO
28 - The process and procedures of how to do Linux kernel development.
27IO-mapping.txt 29IO-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.
29IPMI.txt 31IPMI.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.
257spinlocks.txt 259spinlocks.txt
258 - info on using spinlocks to provide exclusive access in kernel. 260 - info on using spinlocks to provide exclusive access in kernel.
261stable_api_nonsense.txt
262 - info on why the kernel does not have a stable in-kernel api or abi.
263stable_kernel_rules.txt
264 - rules and procedures for the -stable kernel releases.
259stallion.txt 265stallion.txt
260 - info on using the Stallion multiport serial driver. 266 - info on using the Stallion multiport serial driver.
261svga.txt 267svga.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 @@
1HOWTO do Linux kernel development
2---------------------------------
3
4This is the be-all, end-all document on this topic. It contains
5instructions on how to become a Linux kernel developer and how to learn
6to work with the Linux kernel development community. It tries to not
7contain anything related to the technical aspects of kernel programming,
8but will help point you in the right direction for that.
9
10If anything in this document becomes out of date, please send in patches
11to the maintainer of this file, who is listed at the bottom of the
12document.
13
14
15Introduction
16------------
17
18So, you want to learn how to become a Linux kernel developer? Or you
19have been told by your manager, "Go write a Linux driver for this
20device." This document's goal is to teach you everything you need to
21know to achieve this by describing the process you need to go through,
22and hints on how to work with the community. It will also try to
23explain some of the reasons why the community works like it does.
24
25The kernel is written mostly in C, with some architecture-dependent
26parts written in assembly. A good understanding of C is required for
27kernel development. Assembly (any architecture) is not required unless
28you plan to do low-level development for that architecture. Though they
29are not a good substitute for a solid C education and/or years of
30experience, 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
34The kernel is written using GNU C and the GNU toolchain. While it
35adheres to the ISO C89 standard, it uses a number of extensions that are
36not featured in the standard. The kernel is a freestanding C
37environment, with no reliance on the standard C library, so some
38portions of the C standard are not supported. Arbitrary long long
39divisions and floating point are not allowed. It can sometimes be
40difficult to understand the assumptions the kernel has on the toolchain
41and the extensions that it uses, and unfortunately there is no
42definitive reference for them. Please check the gcc info pages (`info
43gcc`) for some information on them.
44
45Please remember that you are trying to learn how to work with the
46existing development community. It is a diverse group of people, with
47high standards for coding, style and procedure. These standards have
48been created over time based on what they have found to work best for
49such a large and geographically dispersed team. Try to learn as much as
50possible about these standards ahead of time, as they are well
51documented; do not expect people to adapt to you or your company's way
52of doing things.
53
54
55Legal Issues
56------------
57
58The Linux kernel source code is released under the GPL. Please see the
59file, COPYING, in the main directory of the source tree, for details on
60the license. If you have further questions about the license, please
61contact a lawyer, and do not ask on the Linux kernel mailing list. The
62people on the mailing lists are not lawyers, and you should not rely on
63their statements on legal matters.
64
65For common questions and answers about the GPL, please see:
66 http://www.gnu.org/licenses/gpl-faq.html
67
68
69Documentation
70------------
71
72The Linux kernel source tree has a large range of documents that are
73invaluable for learning how to interact with the kernel community. When
74new features are added to the kernel, it is recommended that new
75documentation files are also added which explain how to use the feature.
76When a kernel change causes the interface that the kernel exposes to
77userspace to change, it is recommended that you send the information or
78a patch to the manual pages explaining the change to the manual pages
79maintainer at mtk-manpages@gmx.net.
80
81Here is a list of files that are in the kernel source tree that are
82required 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
154The kernel also has a large number of documents that can be
155automatically generated from the source code itself. This includes a
156full description of the in-kernel API, and rules on how to handle
157locking properly. The documents will be created in the
158Documentation/DocBook/ directory and can be generated as PDF,
159Postscript, HTML, and man pages by running:
160 make pdfdocs
161 make psdocs
162 make htmldocs
163 make mandocs
164respectively from the main kernel source directory.
165
166
167Becoming A Kernel Developer
168---------------------------
169
170If you do not know anything about Linux kernel development, you should
171look at the Linux KernelNewbies project:
172 http://kernelnewbies.org
173It consists of a helpful mailing list where you can ask almost any type
174of basic kernel development question (make sure to search the archives
175first, before asking something that has already been answered in the
176past.) It also has an IRC channel that you can use to ask questions in
177real-time, and a lot of helpful documentation that is useful for
178learning about Linux kernel development.
179
180The website has basic information about code organization, subsystems,
181and current projects (both in-tree and out-of-tree). It also describes
182some basic logistical information, like how to compile a kernel and
183apply a patch.
184
185If you do not know where you want to start, but you want to look for
186some task to start doing to join into the kernel development community,
187go to the Linux Kernel Janitor's project:
188 http://janitor.kernelnewbies.org/
189It is a great place to start. It describes a list of relatively simple
190problems that need to be cleaned up and fixed within the Linux kernel
191source tree. Working with the developers in charge of this project, you
192will learn the basics of getting your patch into the Linux kernel tree,
193and possibly be pointed in the direction of what to go work on next, if
194you do not already have an idea.
195
196If you already have a chunk of code that you want to put into the kernel
197tree, but need some help getting it in the proper form, the
198kernel-mentors project was created to help you out with this. It is a
199mailing list, and can be found at:
200 http://selenic.com/mailman/listinfo/kernel-mentors
201
202Before making any actual modifications to the Linux kernel code, it is
203imperative to understand how the code in question works. For this
204purpose, nothing is better than reading through it directly (most tricky
205bits are commented well), perhaps even with the help of specialized
206tools. One such tool that is particularly recommended is the Linux
207Cross-Reference project, which is able to present source code in a
208self-referential, indexed webpage format. An excellent up-to-date
209repository of the kernel code may be found at:
210 http://sosdg.org/~coywolf/lxr/
211
212
213The development process
214-----------------------
215
216Linux kernel development process currently consists of a few different
217main kernel "branches" and lots of different subsystem-specific kernel
218branches. 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
2252.6.x kernel tree
226-----------------
2272.6.x kernels are maintained by Linus Torvalds, and can be found on
228kernel.org in the pub/linux/kernel/v2.6/ directory. Its development
229process 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
252It is worth mentioning what Andrew Morton wrote on the linux-kernel
253mailing 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
2582.6.x.y -stable kernel tree
259---------------------------
260Kernels with 4 digit versions are -stable kernels. They contain
261relatively small and critical fixes for security problems or significant
262regressions discovered in a given 2.6.x kernel.
263
264This is the recommended branch for users who want the most recent stable
265kernel and are not interested in helping test development/experimental
266versions.
267
268If no 2.6.x.y kernel is available, then the highest numbered 2.6.x
269kernel is the current stable kernel.
270
2712.6.x.y are maintained by the "stable" team <stable@kernel.org>, and are
272released almost every other week.
273
274The file Documentation/stable_kernel_rules.txt in the kernel tree
275documents what kinds of changes are acceptable for the -stable tree, and
276how the release process works.
277
2782.6.x -git patches
279------------------
280These are daily snapshots of Linus' kernel tree which are managed in a
281git repository (hence the name.) These patches are usually released
282daily and represent the current state of Linus' tree. They are more
283experimental than -rc kernels since they are generated automatically
284without even a cursory glance to see if they are sane.
285
2862.6.x -mm kernel patches
287------------------------
288These are experimental kernel patches released by Andrew Morton. Andrew
289takes all of the different subsystem kernel trees and patches and mushes
290them together, along with a lot of patches that have been plucked from
291the linux-kernel mailing list. This tree serves as a proving ground for
292new features and patches. Once a patch has proved its worth in -mm for
293a while Andrew or the subsystem maintainer pushes it on to Linus for
294inclusion in mainline.
295
296It is heavily encouraged that all new patches get tested in the -mm tree
297before they are sent to Linus for inclusion in the main kernel tree.
298
299These kernels are not appropriate for use on systems that are supposed
300to be stable and they are more risky to run than any of the other
301branches.
302
303If you wish to help out with the kernel development process, please test
304and use these kernel releases and provide feedback to the linux-kernel
305mailing list if you have any problems, and if everything works properly.
306
307In addition to all the other experimental patches, these kernels usually
308also contain any changes in the mainline -git kernels available at the
309time of release.
310
311The -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
314Subsystem Specific kernel trees and patches
315-------------------------------------------
316A number of the different kernel subsystem developers expose their
317development trees so that others can see what is happening in the
318different areas of the kernel. These trees are pulled into the -mm
319kernel releases as described above.
320
321Here 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
363Bug Reporting
364-------------
365
366bugzilla.kernel.org is where the Linux kernel developers track kernel
367bugs. Users are encouraged to report all bugs that they find in this
368tool. For details on how to use the kernel bugzilla, please see:
369 http://test.kernel.org/bugzilla/faq.html
370
371The file REPORTING-BUGS in the main kernel source directory has a good
372template for how to report a possible kernel bug, and details what kind
373of information is needed by the kernel developers to help track down the
374problem.
375
376
377Mailing lists
378-------------
379
380As some of the above documents describe, the majority of the core kernel
381developers participate on the Linux Kernel Mailing list. Details on how
382to subscribe and unsubscribe from the list can be found at:
383 http://vger.kernel.org/vger-lists.html#linux-kernel
384There are archives of the mailing list on the web in many different
385places. Use a search engine to find these archives. For example:
386 http://dir.gmane.org/gmane.linux.kernel
387It is highly recommended that you search the archives about the topic
388you want to bring up, before you post it to the list. A lot of things
389already discussed in detail are only recorded at the mailing list
390archives.
391
392Most of the individual kernel subsystems also have their own separate
393mailing list where they do their development efforts. See the
394MAINTAINERS file for a list of what these lists are for the different
395groups.
396
397Many of the lists are hosted on kernel.org. Information on them can be
398found at:
399 http://vger.kernel.org/vger-lists.html
400
401Please remember to follow good behavioral habits when using the lists.
402Though a bit cheesy, the following URL has some simple guidelines for
403interacting with the list (or any list):
404 http://www.albion.com/netiquette/
405
406If multiple people respond to your mail, the CC: list of recipients may
407get pretty large. Don't remove anybody from the CC: list without a good
408reason, or don't reply only to the list address. Get used to receiving the
409mail twice, one from the sender and the one from the list, and don't try
410to tune that by adding fancy mail-headers, people will not like it.
411
412Remember to keep the context and the attribution of your replies intact,
413keep the "John Kernelhacker wrote ...:" lines at the top of your reply, and
414add your statements between the individual quoted sections instead of
415writing at the top of the mail.
416
417If you add patches to your mail, make sure they are plain readable text
418as stated in Documentation/SubmittingPatches. Kernel developers don't
419want to deal with attachments or compressed patches; they may want
420to comment on individual lines of your patch, which works only that way.
421Make sure you use a mail program that does not mangle spaces and tab
422characters. A good first test is to send the mail to yourself and try
423to apply your own patch by yourself. If that doesn't work, get your
424mail program fixed or change it until it works.
425
426Above all, please remember to show respect to other subscribers.
427
428
429Working with the community
430--------------------------
431
432The goal of the kernel community is to provide the best possible kernel
433there is. When you submit a patch for acceptance, it will be reviewed
434on its technical merits and those alone. So, what should you be
435expecting?
436 - criticism
437 - comments
438 - requests for change
439 - requests for justification
440 - silence
441
442Remember, this is part of getting your patch into the kernel. You have
443to be able to take criticism and comments about your patches, evaluate
444them at a technical level and either rework your patches or provide
445clear and concise reasoning as to why those changes should not be made.
446If there are no responses to your posting, wait a few days and try
447again, sometimes things get lost in the huge volume.
448
449What 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
455In a community that is looking for the best technical solution possible,
456there will always be differing opinions on how beneficial a patch is.
457You have to be cooperative, and willing to adapt your idea to fit within
458the kernel. Or at least be willing to prove your idea is worth it.
459Remember, being wrong is acceptable as long as you are willing to work
460toward a solution that is right.
461
462It is normal that the answers to your first patch might simply be a list
463of a dozen things you should correct. This does _not_ imply that your
464patch will not be accepted, and it is _not_ meant against you
465personally. Simply correct all issues raised against your patch and
466resend it.
467
468
469Differences between the kernel community and corporate structures
470-----------------------------------------------------------------
471
472The kernel community works differently than most traditional corporate
473development environments. Here are a list of things that you can try to
474do 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
495Another way the kernel community is different than most traditional
496software engineering work environments is the faceless nature of
497interaction. One benefit of using email and irc as the primary forms of
498communication is the lack of discrimination based on gender or race.
499The Linux kernel work environment is accepting of women and minorities
500because all you are is an email address. The international aspect also
501helps to level the playing field because you can't guess gender based on
502a person's name. A man may be named Andrea and a woman may be named Pat.
503Most women who have worked in the Linux kernel and have expressed an
504opinion have had positive experiences.
505
506The language barrier can cause problems for some people who are not
507comfortable with English. A good grasp of the language can be needed in
508order to get ideas across properly on mailing lists, so it is
509recommended that you check your emails to make sure they make sense in
510English before sending them.
511
512
513Break up your changes
514---------------------
515
516The Linux kernel community does not gladly accept large chunks of code
517dropped on it all at once. The changes need to be properly introduced,
518discussed, and broken up into tiny, individual portions. This is almost
519the exact opposite of what companies are used to doing. Your proposal
520should also be introduced very early in the development process, so that
521you can receive feedback on what you are doing. It also lets the
522community feel that you are working with them, and not simply using them
523as a dumping ground for your feature. However, don't send 50 emails at
524one time to a mailing list, your patch series should be smaller than
525that almost all of the time.
526
527The reasons for breaking things up are the following:
528
5291) 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
5412) 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
544Here 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
557It may be challenging to keep the balance between presenting an elegant
558solution and working together with the community and discussing your
559unfinished work. Therefore it is good to get early in the process to
560get feedback to improve your work, but also keep your changes in small
561chunks that they may get already accepted, even when your whole task is
562not ready for inclusion now.
563
564Also realize that it is not acceptable to send patches for inclusion
565that are unfinished and will be "fixed up later."
566
567
568Justify your change
569-------------------
570
571Along with breaking up your patches, it is very important for you to let
572the Linux community know why they should add this change. New features
573must be justified as being needed and useful.
574
575
576Document your change
577--------------------
578
579When sending in your patches, pay special attention to what you say in
580the text in your email. This information will become the ChangeLog
581information for the patch, and will be preserved for everyone to see for
582all 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
588For more details on what this should all look like, please see the
589ChangeLog section of the document:
590 "The Perfect Patch"
591 http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
592
593
594
595
596All of these things are sometimes very hard to do. It can take years to
597perfect these practices (if at all). It's a continuous process of
598improvement that requires a lot of patience and determination. But
599don't give up, it's possible. Many have done it before, and each had to
600start exactly where you are now.
601
602
603
604
605----------
606Thanks to Paolo Ciarrocchi who allowed the "Development Process" section
607to be based on text he had written, and to Randy Dunlap and Gerrit
608Huizenga for some of the list of things you should and should not say.
609Also thanks to Pat Mochel, Hanna Linder, Randy Dunlap, Kay Sievers,
610Vojtech Pavlik, Jan Kara, Josh Boyer, Kees Cook, Andrew Morton, Andi
611Kleen, Vadim Lobanov, Jesper Juhl, Adrian Bunk, Keri Harris, Frans Pop,
612David A. Wheeler, Junio Hamano, Michael Kerrisk, and Alex Shepard for
613their review, comments, and contributions. Without their help, this
614document would not have been possible.
615
616
617
618Maintainer: Greg Kroah-Hartman <greg@kroah.com>
diff --git a/Documentation/arm/memory.txt b/Documentation/arm/memory.txt
index 4b1c93a8177b..dc6045577a8b 100644
--- a/Documentation/arm/memory.txt
+++ b/Documentation/arm/memory.txt
@@ -1,7 +1,7 @@
1 Kernel Memory Layout on ARM Linux 1 Kernel Memory Layout on ARM Linux
2 2
3 Russell King <rmk@arm.linux.org.uk> 3 Russell King <rmk@arm.linux.org.uk>
4 May 21, 2004 (2.6.6) 4 November 17, 2005 (2.6.15)
5 5
6This document describes the virtual memory layout which the Linux 6This document describes the virtual memory layout which the Linux
7kernel uses for ARM processors. It indicates which regions are 7kernel uses for ARM processors. It indicates which regions are
@@ -37,6 +37,8 @@ ff000000 ffbfffff Reserved for future expansion of DMA
37 mapping region. 37 mapping region.
38 38
39VMALLOC_END feffffff Free for platform use, recommended. 39VMALLOC_END feffffff Free for platform use, recommended.
40 VMALLOC_END must be aligned to a 2MB
41 boundary.
40 42
41VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space. 43VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space.
42 Memory returned by vmalloc/ioremap will 44 Memory returned by vmalloc/ioremap will
diff --git a/MAINTAINERS b/MAINTAINERS
index 509927e40bbb..f239ac4762dd 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -58,6 +58,7 @@ P: Person
58M: Mail patches to 58M: Mail patches to
59L: Mailing list that is relevant to this area 59L: Mailing list that is relevant to this area
60W: Web-page with status/info 60W: Web-page with status/info
61T: SCM tree type and URL. Type is one of: git, hg, quilt.
61S: Status, one of the following: 62S: 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
183M: len.brown@intel.com 184M: len.brown@intel.com
184L: acpi-devel@lists.sourceforge.net 185L: acpi-devel@lists.sourceforge.net
185W: http://acpi.sourceforge.net/ 186W: http://acpi.sourceforge.net/
187T: git kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
186S: Maintained 188S: Maintained
187 189
188AD1816 SOUND DRIVER 190AD1816 SOUND DRIVER
@@ -418,6 +420,7 @@ BLOCK LAYER
418P: Jens Axboe 420P: Jens Axboe
419M: axboe@suse.de 421M: axboe@suse.de
420L: linux-kernel@vger.kernel.org 422L: linux-kernel@vger.kernel.org
423T: git kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
421S: Maintained 424S: Maintained
422 425
423BLUETOOTH SUBSYSTEM 426BLUETOOTH SUBSYSTEM
@@ -803,12 +806,14 @@ DRIVER CORE, KOBJECTS, AND SYSFS
803P: Greg Kroah-Hartman 806P: Greg Kroah-Hartman
804M: gregkh@suse.de 807M: gregkh@suse.de
805L: linux-kernel@vger.kernel.org 808L: linux-kernel@vger.kernel.org
809T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
806S: Supported 810S: Supported
807 811
808DRM DRIVERS 812DRM DRIVERS
809P: David Airlie 813P: David Airlie
810M: airlied@linux.ie 814M: airlied@linux.ie
811L: dri-devel@lists.sourceforge.net 815L: dri-devel@lists.sourceforge.net
816T: git kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
812S: Maintained 817S: Maintained
813 818
814DSCC4 DRIVER 819DSCC4 DRIVER
@@ -1113,6 +1118,7 @@ P: Jean Delvare
1113M: khali@linux-fr.org 1118M: khali@linux-fr.org
1114L: lm-sensors@lm-sensors.org 1119L: lm-sensors@lm-sensors.org
1115W: http://www.lm-sensors.nu/ 1120W: http://www.lm-sensors.nu/
1121T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
1116S: Maintained 1122S: Maintained
1117 1123
1118I2O 1124I2O
@@ -1145,6 +1151,7 @@ P: Tony Luck
1145M: tony.luck@intel.com 1151M: tony.luck@intel.com
1146L: linux-ia64@vger.kernel.org 1152L: linux-ia64@vger.kernel.org
1147W: http://www.ia64-linux.org/ 1153W: http://www.ia64-linux.org/
1154T: git kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
1148S: Maintained 1155S: Maintained
1149 1156
1150SN-IA64 (Itanium) SUB-PLATFORM 1157SN-IA64 (Itanium) SUB-PLATFORM
@@ -1212,6 +1219,7 @@ P: Jody McIntyre
1212M: scjody@steamballoon.com 1219M: scjody@steamballoon.com
1213L: linux1394-devel@lists.sourceforge.net 1220L: linux1394-devel@lists.sourceforge.net
1214W: http://www.linux1394.org/ 1221W: http://www.linux1394.org/
1222T: git kernel.org:/pub/scm/linux/kernel/git/scjody/ieee1394.git
1215S: Maintained 1223S: Maintained
1216 1224
1217IEEE 1394 OHCI DRIVER 1225IEEE 1394 OHCI DRIVER
@@ -1263,6 +1271,7 @@ P: Hal Rosenstock
1263M: halr@voltaire.com 1271M: halr@voltaire.com
1264L: openib-general@openib.org 1272L: openib-general@openib.org
1265W: http://www.openib.org/ 1273W: http://www.openib.org/
1274T: git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
1266S: Supported 1275S: Supported
1267 1276
1268INPUT (KEYBOARD, MOUSE, JOYSTICK) DRIVERS 1277INPUT (KEYBOARD, MOUSE, JOYSTICK) DRIVERS
@@ -1436,6 +1445,7 @@ P: Kai Germaschewski
1436M: kai@germaschewski.name 1445M: kai@germaschewski.name
1437P: Sam Ravnborg 1446P: Sam Ravnborg
1438M: sam@ravnborg.org 1447M: sam@ravnborg.org
1448T: git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
1439S: Maintained 1449S: Maintained
1440 1450
1441KERNEL JANITORS 1451KERNEL JANITORS
@@ -1782,6 +1792,7 @@ M: akpm@osdl.org
1782P: Jeff Garzik 1792P: Jeff Garzik
1783M: jgarzik@pobox.com 1793M: jgarzik@pobox.com
1784L: netdev@vger.kernel.org 1794L: netdev@vger.kernel.org
1795T: git kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
1785S: Maintained 1796S: Maintained
1786 1797
1787NETWORKING [GENERAL] 1798NETWORKING [GENERAL]
@@ -1959,6 +1970,7 @@ P: Greg Kroah-Hartman
1959M: gregkh@suse.de 1970M: gregkh@suse.de
1960L: linux-kernel@vger.kernel.org 1971L: linux-kernel@vger.kernel.org
1961L: linux-pci@atrey.karlin.mff.cuni.cz 1972L: linux-pci@atrey.karlin.mff.cuni.cz
1973T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
1962S: Supported 1974S: Supported
1963 1975
1964PCI HOTPLUG CORE 1976PCI HOTPLUG CORE
@@ -1980,6 +1992,7 @@ S: Maintained
1980PCMCIA SUBSYSTEM 1992PCMCIA SUBSYSTEM
1981P: Linux PCMCIA Team 1993P: Linux PCMCIA Team
1982L: http://lists.infradead.org/mailman/listinfo/linux-pcmcia 1994L: http://lists.infradead.org/mailman/listinfo/linux-pcmcia
1995T: git kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
1983S: Maintained 1996S: Maintained
1984 1997
1985PCNET32 NETWORK DRIVER 1998PCNET32 NETWORK DRIVER
@@ -2189,6 +2202,7 @@ SCSI SUBSYSTEM
2189P: James E.J. Bottomley 2202P: James E.J. Bottomley
2190M: James.Bottomley@SteelEye.com 2203M: James.Bottomley@SteelEye.com
2191L: linux-scsi@vger.kernel.org 2204L: linux-scsi@vger.kernel.org
2205T: git kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
2192S: Maintained 2206S: Maintained
2193 2207
2194SCSI TAPE DRIVER 2208SCSI TAPE DRIVER
@@ -2228,6 +2242,7 @@ SERIAL ATA (SATA) SUBSYSTEM:
2228P: Jeff Garzik 2242P: Jeff Garzik
2229M: jgarzik@pobox.com 2243M: jgarzik@pobox.com
2230L: linux-ide@vger.kernel.org 2244L: linux-ide@vger.kernel.org
2245T: git kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
2231S: Supported 2246S: Supported
2232 2247
2233SGI SN-IA64 (Altix) SERIAL CONSOLE DRIVER 2248SGI SN-IA64 (Altix) SERIAL CONSOLE DRIVER
@@ -2749,6 +2764,7 @@ M: gregkh@suse.de
2749L: linux-usb-users@lists.sourceforge.net 2764L: linux-usb-users@lists.sourceforge.net
2750L: linux-usb-devel@lists.sourceforge.net 2765L: linux-usb-devel@lists.sourceforge.net
2751W: http://www.linux-usb.org 2766W: http://www.linux-usb.org
2767T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
2752S: Supported 2768S: Supported
2753 2769
2754USB UHCI DRIVER 2770USB UHCI DRIVER
diff --git a/Makefile b/Makefile
index c31914400953..e7a0443c867c 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
1VERSION = 2 1VERSION = 2
2PATCHLEVEL = 6 2PATCHLEVEL = 6
3SUBLEVEL = 15 3SUBLEVEL = 15
4EXTRAVERSION =-rc1 4EXTRAVERSION =-rc2
5NAME=Affluent Albatross 5NAME=Affluent Albatross
6 6
7# *DOCUMENTATION* 7# *DOCUMENTATION*
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c
index 7a3261f0bf79..9997098009a9 100644
--- a/arch/arm/kernel/armksyms.c
+++ b/arch/arm/kernel/armksyms.c
@@ -120,7 +120,6 @@ EXPORT_SYMBOL(__arch_strncpy_from_user);
120EXPORT_SYMBOL(__get_user_1); 120EXPORT_SYMBOL(__get_user_1);
121EXPORT_SYMBOL(__get_user_2); 121EXPORT_SYMBOL(__get_user_2);
122EXPORT_SYMBOL(__get_user_4); 122EXPORT_SYMBOL(__get_user_4);
123EXPORT_SYMBOL(__get_user_8);
124 123
125EXPORT_SYMBOL(__put_user_1); 124EXPORT_SYMBOL(__put_user_1);
126EXPORT_SYMBOL(__put_user_2); 125EXPORT_SYMBOL(__put_user_2);
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
index 066597f4345a..f7f183075237 100644
--- a/arch/arm/kernel/entry-common.S
+++ b/arch/arm/kernel/entry-common.S
@@ -48,8 +48,7 @@ work_pending:
48 mov r0, sp @ 'regs' 48 mov r0, sp @ 'regs'
49 mov r2, why @ 'syscall' 49 mov r2, why @ 'syscall'
50 bl do_notify_resume 50 bl do_notify_resume
51 disable_irq @ disable interrupts 51 b ret_slow_syscall @ Check work again
52 b no_work_pending
53 52
54work_resched: 53work_resched:
55 bl schedule 54 bl schedule
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
index a917e3dd3666..765922bcf9e7 100644
--- a/arch/arm/kernel/signal.c
+++ b/arch/arm/kernel/signal.c
@@ -595,23 +595,22 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
595 */ 595 */
596 ret |= !valid_user_regs(regs); 596 ret |= !valid_user_regs(regs);
597 597
598 /*
599 * Block the signal if we were unsuccessful.
600 */
601 if (ret != 0) { 598 if (ret != 0) {
602 spin_lock_irq(&tsk->sighand->siglock); 599 force_sigsegv(sig, tsk);
603 sigorsets(&tsk->blocked, &tsk->blocked, 600 return;
604 &ka->sa.sa_mask);
605 if (!(ka->sa.sa_flags & SA_NODEFER))
606 sigaddset(&tsk->blocked, sig);
607 recalc_sigpending();
608 spin_unlock_irq(&tsk->sighand->siglock);
609 } 601 }
610 602
611 if (ret == 0) 603 /*
612 return; 604 * Block the signal if we were successful.
605 */
606 spin_lock_irq(&tsk->sighand->siglock);
607 sigorsets(&tsk->blocked, &tsk->blocked,
608 &ka->sa.sa_mask);
609 if (!(ka->sa.sa_flags & SA_NODEFER))
610 sigaddset(&tsk->blocked, sig);
611 recalc_sigpending();
612 spin_unlock_irq(&tsk->sighand->siglock);
613 613
614 force_sigsegv(sig, tsk);
615} 614}
616 615
617/* 616/*
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
index 80c8e4c8cefa..9a47770114d4 100644
--- a/arch/arm/kernel/vmlinux.lds.S
+++ b/arch/arm/kernel/vmlinux.lds.S
@@ -172,6 +172,10 @@ SECTIONS
172 .comment 0 : { *(.comment) } 172 .comment 0 : { *(.comment) }
173} 173}
174 174
175/* those must never be empty */ 175/*
176 * These must never be empty
177 * If you have to comment these two assert statements out, your
178 * binutils is too old (for other reasons as well)
179 */
176ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support") 180ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
177ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined") 181ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
diff --git a/arch/arm/lib/getuser.S b/arch/arm/lib/getuser.S
index d204018070a4..c03ea8e666ba 100644
--- a/arch/arm/lib/getuser.S
+++ b/arch/arm/lib/getuser.S
@@ -54,15 +54,6 @@ __get_user_4:
54 mov r0, #0 54 mov r0, #0
55 mov pc, lr 55 mov pc, lr
56 56
57 .global __get_user_8
58__get_user_8:
595: ldrt r2, [r0], #4
606: ldrt r3, [r0]
61 mov r0, #0
62 mov pc, lr
63
64__get_user_bad_8:
65 mov r3, #0
66__get_user_bad: 57__get_user_bad:
67 mov r2, #0 58 mov r2, #0
68 mov r0, #-EFAULT 59 mov r0, #-EFAULT
@@ -73,6 +64,4 @@ __get_user_bad:
73 .long 2b, __get_user_bad 64 .long 2b, __get_user_bad
74 .long 3b, __get_user_bad 65 .long 3b, __get_user_bad
75 .long 4b, __get_user_bad 66 .long 4b, __get_user_bad
76 .long 5b, __get_user_bad_8
77 .long 6b, __get_user_bad_8
78.previous 67.previous
diff --git a/arch/arm/mm/Makefile b/arch/arm/mm/Makefile
index 59f47d4c2dfe..ffe73ba2bf17 100644
--- a/arch/arm/mm/Makefile
+++ b/arch/arm/mm/Makefile
@@ -51,4 +51,4 @@ obj-$(CONFIG_CPU_ARM1026) += proc-arm1026.o
51obj-$(CONFIG_CPU_SA110) += proc-sa110.o 51obj-$(CONFIG_CPU_SA110) += proc-sa110.o
52obj-$(CONFIG_CPU_SA1100) += proc-sa1100.o 52obj-$(CONFIG_CPU_SA1100) += proc-sa1100.o
53obj-$(CONFIG_CPU_XSCALE) += proc-xscale.o 53obj-$(CONFIG_CPU_XSCALE) += proc-xscale.o
54obj-$(CONFIG_CPU_V6) += proc-v6.o blockops.o 54obj-$(CONFIG_CPU_V6) += proc-v6.o
diff --git a/arch/arm/mm/blockops.c b/arch/arm/mm/blockops.c
deleted file mode 100644
index 4f5ee2d08996..000000000000
--- a/arch/arm/mm/blockops.c
+++ /dev/null
@@ -1,185 +0,0 @@
1#include <linux/kernel.h>
2#include <linux/init.h>
3#include <linux/errno.h>
4#include <linux/mm.h>
5
6#include <asm/memory.h>
7#include <asm/ptrace.h>
8#include <asm/cacheflush.h>
9#include <asm/traps.h>
10
11extern struct cpu_cache_fns blk_cache_fns;
12
13#define HARVARD_CACHE
14
15/*
16 * blk_flush_kern_dcache_page(kaddr)
17 *
18 * Ensure that the data held in the page kaddr is written back
19 * to the page in question.
20 *
21 * - kaddr - kernel address (guaranteed to be page aligned)
22 */
23static void __attribute__((naked))
24blk_flush_kern_dcache_page(void *kaddr)
25{
26 asm(
27 "add r1, r0, %0 \n\
28 sub r1, r1, %1 \n\
291: .word 0xec401f0e @ mcrr p15, 0, r0, r1, c14, 0 @ blocking \n\
30 mov r0, #0 \n\
31 mcr p15, 0, r0, c7, c5, 0 \n\
32 mcr p15, 0, r0, c7, c10, 4 \n\
33 mov pc, lr"
34 :
35 : "I" (PAGE_SIZE), "I" (L1_CACHE_BYTES));
36}
37
38/*
39 * blk_dma_inv_range(start,end)
40 *
41 * Invalidate the data cache within the specified region; we will
42 * be performing a DMA operation in this region and we want to
43 * purge old data in the cache.
44 *
45 * - start - virtual start address of region
46 * - end - virtual end address of region
47 */
48static void __attribute__((naked))
49blk_dma_inv_range_unified(unsigned long start, unsigned long end)
50{
51 asm(
52 "tst r0, %0 \n\
53 mcrne p15, 0, r0, c7, c11, 1 @ clean unified line \n\
54 tst r1, %0 \n\
55 mcrne p15, 0, r1, c7, c15, 1 @ clean & invalidate unified line\n\
56 .word 0xec401f06 @ mcrr p15, 0, r1, r0, c6, 0 @ blocking \n\
57 mov r0, #0 \n\
58 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer \n\
59 mov pc, lr"
60 :
61 : "I" (L1_CACHE_BYTES - 1));
62}
63
64static void __attribute__((naked))
65blk_dma_inv_range_harvard(unsigned long start, unsigned long end)
66{
67 asm(
68 "tst r0, %0 \n\
69 mcrne p15, 0, r0, c7, c10, 1 @ clean D line \n\
70 tst r1, %0 \n\
71 mcrne p15, 0, r1, c7, c14, 1 @ clean & invalidate D line \n\
72 .word 0xec401f06 @ mcrr p15, 0, r1, r0, c6, 0 @ blocking \n\
73 mov r0, #0 \n\
74 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer \n\
75 mov pc, lr"
76 :
77 : "I" (L1_CACHE_BYTES - 1));
78}
79
80/*
81 * blk_dma_clean_range(start,end)
82 * - start - virtual start address of region
83 * - end - virtual end address of region
84 */
85static void __attribute__((naked))
86blk_dma_clean_range(unsigned long start, unsigned long end)
87{
88 asm(
89 ".word 0xec401f0c @ mcrr p15, 0, r1, r0, c12, 0 @ blocking \n\
90 mov r0, #0 \n\
91 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer \n\
92 mov pc, lr");
93}
94
95/*
96 * blk_dma_flush_range(start,end)
97 * - start - virtual start address of region
98 * - end - virtual end address of region
99 */
100static void __attribute__((naked))
101blk_dma_flush_range(unsigned long start, unsigned long end)
102{
103 asm(
104 ".word 0xec401f0e @ mcrr p15, 0, r1, r0, c14, 0 @ blocking \n\
105 mov pc, lr");
106}
107
108static int blockops_trap(struct pt_regs *regs, unsigned int instr)
109{
110 regs->ARM_r4 |= regs->ARM_r2;
111 regs->ARM_pc += 4;
112 return 0;
113}
114
115static char *func[] = {
116 "Prefetch data range",
117 "Clean+Invalidate data range",
118 "Clean data range",
119 "Invalidate data range",
120 "Invalidate instr range"
121};
122
123static struct undef_hook blockops_hook __initdata = {
124 .instr_mask = 0x0fffffd0,
125 .instr_val = 0x0c401f00,
126 .cpsr_mask = PSR_T_BIT,
127 .cpsr_val = 0,
128 .fn = blockops_trap,
129};
130
131static int __init blockops_check(void)
132{
133 register unsigned int err asm("r4") = 0;
134 unsigned int err_pos = 1;
135 unsigned int cache_type;
136 int i;
137
138 asm("mrc p15, 0, %0, c0, c0, 1" : "=r" (cache_type));
139
140 printk("Checking V6 block cache operations:\n");
141 register_undef_hook(&blockops_hook);
142
143 __asm__ ("mov r0, %0\n\t"
144 "mov r1, %1\n\t"
145 "mov r2, #1\n\t"
146 ".word 0xec401f2c @ mcrr p15, 0, r1, r0, c12, 2\n\t"
147 "mov r2, #2\n\t"
148 ".word 0xec401f0e @ mcrr p15, 0, r1, r0, c14, 0\n\t"
149 "mov r2, #4\n\t"
150 ".word 0xec401f0c @ mcrr p15, 0, r1, r0, c12, 0\n\t"
151 "mov r2, #8\n\t"
152 ".word 0xec401f06 @ mcrr p15, 0, r1, r0, c6, 0\n\t"
153 "mov r2, #16\n\t"
154 ".word 0xec401f05 @ mcrr p15, 0, r1, r0, c5, 0\n\t"
155 :
156 : "r" (PAGE_OFFSET), "r" (PAGE_OFFSET + 128)
157 : "r0", "r1", "r2");
158
159 unregister_undef_hook(&blockops_hook);
160
161 for (i = 0; i < ARRAY_SIZE(func); i++, err_pos <<= 1)
162 printk("%30s: %ssupported\n", func[i], err & err_pos ? "not " : "");
163
164 if ((err & 8) == 0) {
165 printk(" --> Using %s block cache invalidate\n",
166 cache_type & (1 << 24) ? "harvard" : "unified");
167 if (cache_type & (1 << 24))
168 cpu_cache.dma_inv_range = blk_dma_inv_range_harvard;
169 else
170 cpu_cache.dma_inv_range = blk_dma_inv_range_unified;
171 }
172 if ((err & 4) == 0) {
173 printk(" --> Using block cache clean\n");
174 cpu_cache.dma_clean_range = blk_dma_clean_range;
175 }
176 if ((err & 2) == 0) {
177 printk(" --> Using block cache clean+invalidate\n");
178 cpu_cache.dma_flush_range = blk_dma_flush_range;
179 cpu_cache.flush_kern_dcache_page = blk_flush_kern_dcache_page;
180 }
181
182 return 0;
183}
184
185__initcall(blockops_check);
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index c168f322ef8c..8b276ee38acf 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -420,7 +420,8 @@ static void __init bootmem_init(struct meminfo *mi)
420 * Set up device the mappings. Since we clear out the page tables for all 420 * Set up device the mappings. Since we clear out the page tables for all
421 * mappings above VMALLOC_END, we will remove any debug device mappings. 421 * mappings above VMALLOC_END, we will remove any debug device mappings.
422 * This means you have to be careful how you debug this function, or any 422 * This means you have to be careful how you debug this function, or any
423 * called function. (Do it by code inspection!) 423 * called function. This means you can't use any function or debugging
424 * method which may touch any device, otherwise the kernel _will_ crash.
424 */ 425 */
425static void __init devicemaps_init(struct machine_desc *mdesc) 426static void __init devicemaps_init(struct machine_desc *mdesc)
426{ 427{
@@ -428,6 +429,12 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
428 unsigned long addr; 429 unsigned long addr;
429 void *vectors; 430 void *vectors;
430 431
432 /*
433 * Allocate the vector page early.
434 */
435 vectors = alloc_bootmem_low_pages(PAGE_SIZE);
436 BUG_ON(!vectors);
437
431 for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE) 438 for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE)
432 pmd_clear(pmd_off_k(addr)); 439 pmd_clear(pmd_off_k(addr));
433 440
@@ -461,12 +468,6 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
461 create_mapping(&map); 468 create_mapping(&map);
462#endif 469#endif
463 470
464 flush_cache_all();
465 local_flush_tlb_all();
466
467 vectors = alloc_bootmem_low_pages(PAGE_SIZE);
468 BUG_ON(!vectors);
469
470 /* 471 /*
471 * Create a mapping for the machine vectors at the high-vectors 472 * Create a mapping for the machine vectors at the high-vectors
472 * location (0xffff0000). If we aren't using high-vectors, also 473 * location (0xffff0000). If we aren't using high-vectors, also
@@ -491,12 +492,13 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
491 mdesc->map_io(); 492 mdesc->map_io();
492 493
493 /* 494 /*
494 * Finally flush the tlb again - this ensures that we're in a 495 * Finally flush the caches and tlb to ensure that we're in a
495 * consistent state wrt the writebuffer if the writebuffer needs 496 * consistent state wrt the writebuffer. This also ensures that
496 * draining. After this point, we can start to touch devices 497 * any write-allocated cache lines in the vector page are written
497 * again. 498 * back. After this point, we can start to touch devices again.
498 */ 499 */
499 local_flush_tlb_all(); 500 local_flush_tlb_all();
501 flush_cache_all();
500} 502}
501 503
502/* 504/*
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c
index 0f128c28fee4..10901398e4a2 100644
--- a/arch/arm/mm/ioremap.c
+++ b/arch/arm/mm/ioremap.c
@@ -130,8 +130,7 @@ remap_area_pages(unsigned long start, unsigned long phys_addr,
130 * mapping. See include/asm-arm/proc-armv/pgtable.h for more information. 130 * mapping. See include/asm-arm/proc-armv/pgtable.h for more information.
131 */ 131 */
132void __iomem * 132void __iomem *
133__ioremap(unsigned long phys_addr, size_t size, unsigned long flags, 133__ioremap(unsigned long phys_addr, size_t size, unsigned long flags)
134 unsigned long align)
135{ 134{
136 void * addr; 135 void * addr;
137 struct vm_struct * area; 136 struct vm_struct * area;
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)
235ENTRY(itlb_miss) 244ENTRY(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 ;;
2501: ld8 r18=[r17] // read L3 PTE 2591: 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)
279ENTRY(dtlb_miss) 288ENTRY(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
290dtlb_fault: 299dtlb_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 ;;
2941: ld8 r18=[r17] // read L3 PTE 3031: 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
32typedef 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
45static 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
106out:
107 kfree(kversion.name);
108 kfree(kversion.date);
109 kfree(kversion.desc);
110 return ret;
111}
112
113typedef 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
120static 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
170typedef 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
182static 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
221typedef 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
227static 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
266typedef 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
272static 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
300out:
301 kfree(karg.list);
302 return ret;
303}
304
305typedef 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
312typedef 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
319static 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
373out:
374 kfree(karg.list);
375 return ret;
376}
377
378typedef 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 */
398static 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
489out:
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
497typedef 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
503static 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 */
565COMPATIBLE_IOCTL(PA_PERF_ON)
566COMPATIBLE_IOCTL(PA_PERF_OFF)
567COMPATIBLE_IOCTL(PA_PERF_VERSION)
568
569/* And these ioctls need translation */ 34/* And these ioctls need translation */
570HANDLE_IOCTL(SIOCGPPPSTATS, dev_ifsioc) 35HANDLE_IOCTL(SIOCGPPPSTATS, dev_ifsioc)
571HANDLE_IOCTL(SIOCGPPPCSTATS, dev_ifsioc) 36HANDLE_IOCTL(SIOCGPPPCSTATS, dev_ifsioc)
@@ -590,17 +55,6 @@ HANDLE_IOCTL(RTC_EPOCH_READ, w_long)
590COMPATIBLE_IOCTL(RTC_EPOCH_SET) 55COMPATIBLE_IOCTL(RTC_EPOCH_SET)
591#endif 56#endif
592 57
593#if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
594HANDLE_IOCTL(DRM32_IOCTL_VERSION, drm32_version);
595HANDLE_IOCTL(DRM32_IOCTL_GET_UNIQUE, drm32_getsetunique);
596HANDLE_IOCTL(DRM32_IOCTL_SET_UNIQUE, drm32_getsetunique);
597HANDLE_IOCTL(DRM32_IOCTL_ADD_MAP, drm32_addmap);
598HANDLE_IOCTL(DRM32_IOCTL_INFO_BUFS, drm32_info_bufs);
599HANDLE_IOCTL(DRM32_IOCTL_FREE_BUFS, drm32_free_bufs);
600HANDLE_IOCTL(DRM32_IOCTL_MAP_BUFS, drm32_map_bufs);
601HANDLE_IOCTL(DRM32_IOCTL_DMA, drm32_dma);
602HANDLE_IOCTL(DRM32_IOCTL_RES_CTX, drm32_res_ctx);
603#endif /* DRM */
604IOCTL_TABLE_END 58IOCTL_TABLE_END
605 59
606int ioctl_table_size = ARRAY_SIZE(ioctl_start); 60int 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*/
44static volatile unsigned long cpu_eiem = 0; 47static volatile unsigned long cpu_eiem = 0;
45 48
46static void cpu_set_eiem(void *info) 49static void cpu_disable_irq(unsigned int irq)
47{
48 set_eiem((unsigned long) info);
49}
50
51static 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
59static void cpu_enable_irq(unsigned int irq) 60static 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
68static unsigned int cpu_startup_irq(unsigned int irq) 79static unsigned int cpu_startup_irq(unsigned int irq)
@@ -74,6 +85,35 @@ static unsigned int cpu_startup_irq(unsigned int irq)
74void no_ack_irq(unsigned int irq) { } 85void no_ack_irq(unsigned int irq) { }
75void no_end_irq(unsigned int irq) { } 86void no_end_irq(unsigned int irq) { }
76 87
88#ifdef CONFIG_SMP
89int 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
108static 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
77static struct hw_interrupt_type cpu_interrupt_type = { 117static 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
88int show_interrupts(struct seq_file *p, void *v) 130int 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
265unsigned 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
222unsigned long txn_alloc_addr(unsigned int virt_irq) 275unsigned 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)
291static struct irqaction timer_action = { 363static 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
297static struct irqaction ipi_action = { 370static 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);
196static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos); 196static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos);
197static ssize_t perf_write(struct file *file, const char __user *buf, size_t count, 197static ssize_t perf_write(struct file *file, const char __user *buf, size_t count,
198 loff_t *ppos); 198 loff_t *ppos);
199static int perf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, 199static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
200 unsigned long arg);
201static void perf_start_counters(void); 200static void perf_start_counters(void);
202static int perf_stop_counters(uint32_t *raddr); 201static int perf_stop_counters(uint32_t *raddr);
203static struct rdr_tbl_ent * perf_rdr_get_entry(uint32_t rdr_num); 202static 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
441static int perf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, 440static 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
478static struct file_operations perf_fops = { 484static 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
354out_wake_notrap: 355out_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); }
312void 314void
313smp_send_reschedule(int cpu) { send_IPI_single(cpu, IPI_RESCHEDULE); } 315smp_send_reschedule(int cpu) { send_IPI_single(cpu, IPI_RESCHEDULE); }
314 316
317void
318smp_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/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c
index 5a5b24685081..8b6008ab217d 100644
--- a/arch/powerpc/kernel/pci_64.c
+++ b/arch/powerpc/kernel/pci_64.c
@@ -40,7 +40,7 @@
40#endif 40#endif
41 41
42unsigned long pci_probe_only = 1; 42unsigned long pci_probe_only = 1;
43unsigned long pci_assign_all_buses = 0; 43int pci_assign_all_buses = 0;
44 44
45/* 45/*
46 * legal IO pages under MAX_ISA_PORT. This is to ensure we don't touch 46 * legal IO pages under MAX_ISA_PORT. This is to ensure we don't touch
@@ -55,11 +55,6 @@ static void fixup_resource(struct resource *res, struct pci_dev *dev);
55static void do_bus_setup(struct pci_bus *bus); 55static void do_bus_setup(struct pci_bus *bus);
56#endif 56#endif
57 57
58unsigned int pcibios_assign_all_busses(void)
59{
60 return pci_assign_all_buses;
61}
62
63/* pci_io_base -- the base address from which io bars are offsets. 58/* pci_io_base -- the base address from which io bars are offsets.
64 * This is the lowest I/O base address (so bar values are always positive), 59 * This is the lowest I/O base address (so bar values are always positive),
65 * and it *must* be the start of ISA space if an ISA bus exists because 60 * and it *must* be the start of ISA space if an ISA bus exists because
@@ -1186,17 +1181,6 @@ void phbs_remap_io(void)
1186 remap_bus_range(hose->bus); 1181 remap_bus_range(hose->bus);
1187} 1182}
1188 1183
1189/*
1190 * ppc64 can have multifunction devices that do not respond to function 0.
1191 * In this case we must scan all functions.
1192 * XXX this can go now, we use the OF device tree in all the
1193 * cases that caused problems. -- paulus
1194 */
1195int pcibios_scan_all_fns(struct pci_bus *bus, int devfn)
1196{
1197 return 0;
1198}
1199
1200static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev) 1184static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev)
1201{ 1185{
1202 struct pci_controller *hose = pci_bus_to_host(dev->bus); 1186 struct pci_controller *hose = pci_bus_to_host(dev->bus);
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c
index 59846b40d521..af4d1bc9a2eb 100644
--- a/arch/powerpc/kernel/ppc_ksyms.c
+++ b/arch/powerpc/kernel/ppc_ksyms.c
@@ -146,9 +146,6 @@ EXPORT_SYMBOL(pci_bus_io_base);
146EXPORT_SYMBOL(pci_bus_io_base_phys); 146EXPORT_SYMBOL(pci_bus_io_base_phys);
147EXPORT_SYMBOL(pci_bus_mem_base_phys); 147EXPORT_SYMBOL(pci_bus_mem_base_phys);
148EXPORT_SYMBOL(pci_bus_to_hose); 148EXPORT_SYMBOL(pci_bus_to_hose);
149EXPORT_SYMBOL(pci_resource_to_bus);
150EXPORT_SYMBOL(pci_phys_to_bus);
151EXPORT_SYMBOL(pci_bus_to_phys);
152#endif /* CONFIG_PCI */ 149#endif /* CONFIG_PCI */
153 150
154#ifdef CONFIG_NOT_COHERENT_CACHE 151#ifdef CONFIG_NOT_COHERENT_CACHE
diff --git a/include/asm-ppc64/ptrace-common.h b/arch/powerpc/kernel/ptrace-common.h
index b1babb729673..b1babb729673 100644
--- a/include/asm-ppc64/ptrace-common.h
+++ b/arch/powerpc/kernel/ptrace-common.h
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
index 3d2abd95c7ae..400793c71304 100644
--- a/arch/powerpc/kernel/ptrace.c
+++ b/arch/powerpc/kernel/ptrace.c
@@ -36,8 +36,9 @@
36#include <asm/page.h> 36#include <asm/page.h>
37#include <asm/pgtable.h> 37#include <asm/pgtable.h>
38#include <asm/system.h> 38#include <asm/system.h>
39
39#ifdef CONFIG_PPC64 40#ifdef CONFIG_PPC64
40#include <asm/ptrace-common.h> 41#include "ptrace-common.h"
41#endif 42#endif
42 43
43#ifdef CONFIG_PPC32 44#ifdef CONFIG_PPC32
diff --git a/arch/powerpc/kernel/ptrace32.c b/arch/powerpc/kernel/ptrace32.c
index 91eb952e0293..61762640b877 100644
--- a/arch/powerpc/kernel/ptrace32.c
+++ b/arch/powerpc/kernel/ptrace32.c
@@ -33,7 +33,8 @@
33#include <asm/page.h> 33#include <asm/page.h>
34#include <asm/pgtable.h> 34#include <asm/pgtable.h>
35#include <asm/system.h> 35#include <asm/system.h>
36#include <asm/ptrace-common.h> 36
37#include "ptrace-common.h"
37 38
38/* 39/*
39 * does not yet catch signals sent when the child dies. 40 * does not yet catch signals sent when the child dies.
diff --git a/arch/powerpc/mm/imalloc.c b/arch/powerpc/mm/imalloc.c
index f4ca29cf5364..f9587bcc6a48 100644
--- a/arch/powerpc/mm/imalloc.c
+++ b/arch/powerpc/mm/imalloc.c
@@ -14,9 +14,10 @@
14#include <asm/pgalloc.h> 14#include <asm/pgalloc.h>
15#include <asm/pgtable.h> 15#include <asm/pgtable.h>
16#include <asm/semaphore.h> 16#include <asm/semaphore.h>
17#include <asm/imalloc.h>
18#include <asm/cacheflush.h> 17#include <asm/cacheflush.h>
19 18
19#include "mmu_decl.h"
20
20static DECLARE_MUTEX(imlist_sem); 21static DECLARE_MUTEX(imlist_sem);
21struct vm_struct * imlist = NULL; 22struct vm_struct * imlist = NULL;
22 23
diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c
index 1134f70f231d..81cfb0c2ec58 100644
--- a/arch/powerpc/mm/init_64.c
+++ b/arch/powerpc/mm/init_64.c
@@ -64,7 +64,8 @@
64#include <asm/iommu.h> 64#include <asm/iommu.h>
65#include <asm/abs_addr.h> 65#include <asm/abs_addr.h>
66#include <asm/vdso.h> 66#include <asm/vdso.h>
67#include <asm/imalloc.h> 67
68#include "mmu_decl.h"
68 69
69#ifdef DEBUG 70#ifdef DEBUG
70#define DBG(fmt...) printk(fmt) 71#define DBG(fmt...) printk(fmt)
diff --git a/arch/powerpc/mm/mmu_decl.h b/arch/powerpc/mm/mmu_decl.h
index a4d7a327c0e5..bea2d21ac6f7 100644
--- a/arch/powerpc/mm/mmu_decl.h
+++ b/arch/powerpc/mm/mmu_decl.h
@@ -33,7 +33,6 @@ extern void invalidate_tlbcam_entry(int index);
33 33
34extern int __map_without_bats; 34extern int __map_without_bats;
35extern unsigned long ioremap_base; 35extern unsigned long ioremap_base;
36extern unsigned long ioremap_bot;
37extern unsigned int rtas_data, rtas_size; 36extern unsigned int rtas_data, rtas_size;
38 37
39extern PTE *Hash, *Hash_end; 38extern PTE *Hash, *Hash_end;
@@ -42,6 +41,7 @@ extern unsigned long Hash_size, Hash_mask;
42extern unsigned int num_tlbcam_entries; 41extern unsigned int num_tlbcam_entries;
43#endif 42#endif
44 43
44extern unsigned long ioremap_bot;
45extern unsigned long __max_low_memory; 45extern unsigned long __max_low_memory;
46extern unsigned long __initial_memory_limit; 46extern unsigned long __initial_memory_limit;
47extern unsigned long total_memory; 47extern unsigned long total_memory;
@@ -84,4 +84,16 @@ static inline void flush_HPTE(unsigned context, unsigned long va,
84 else 84 else
85 _tlbie(va); 85 _tlbie(va);
86} 86}
87#else /* CONFIG_PPC64 */
88/* imalloc region types */
89#define IM_REGION_UNUSED 0x1
90#define IM_REGION_SUBSET 0x2
91#define IM_REGION_EXISTS 0x4
92#define IM_REGION_OVERLAP 0x8
93#define IM_REGION_SUPERSET 0x10
94
95extern struct vm_struct * im_get_free_area(unsigned long size);
96extern struct vm_struct * im_get_area(unsigned long v_addr, unsigned long size,
97 int region_type);
98extern void im_free(void *addr);
87#endif 99#endif
diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c
index c7f7bb6f30b3..2ffca63602c5 100644
--- a/arch/powerpc/mm/pgtable_64.c
+++ b/arch/powerpc/mm/pgtable_64.c
@@ -64,7 +64,8 @@
64#include <asm/iommu.h> 64#include <asm/iommu.h>
65#include <asm/abs_addr.h> 65#include <asm/abs_addr.h>
66#include <asm/vdso.h> 66#include <asm/vdso.h>
67#include <asm/imalloc.h> 67
68#include "mmu_decl.h"
68 69
69unsigned long ioremap_bot = IMALLOC_BASE; 70unsigned long ioremap_bot = IMALLOC_BASE;
70static unsigned long phbs_io_bot = PHBS_IO_BASE; 71static unsigned long phbs_io_bot = PHBS_IO_BASE;
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c
index 957b09103422..fb2a7c798e82 100644
--- a/arch/powerpc/platforms/powermac/smp.c
+++ b/arch/powerpc/platforms/powermac/smp.c
@@ -34,6 +34,7 @@
34#include <linux/errno.h> 34#include <linux/errno.h>
35#include <linux/hardirq.h> 35#include <linux/hardirq.h>
36#include <linux/cpu.h> 36#include <linux/cpu.h>
37#include <linux/compiler.h>
37 38
38#include <asm/ptrace.h> 39#include <asm/ptrace.h>
39#include <asm/atomic.h> 40#include <asm/atomic.h>
@@ -631,8 +632,9 @@ void smp_core99_give_timebase(void)
631 mb(); 632 mb();
632 633
633 /* wait for the secondary to have taken it */ 634 /* wait for the secondary to have taken it */
634 for (t = 100000; t > 0 && sec_tb_reset; --t) 635 /* note: can't use udelay here, since it needs the timebase running */
635 udelay(10); 636 for (t = 10000000; t > 0 && sec_tb_reset; --t)
637 barrier();
636 if (sec_tb_reset) 638 if (sec_tb_reset)
637 /* XXX BUG_ON here? */ 639 /* XXX BUG_ON here? */
638 printk(KERN_WARNING "Timeout waiting sync(2) on second CPU\n"); 640 printk(KERN_WARNING "Timeout waiting sync(2) on second CPU\n");
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
index 105f05341a41..58d1cc2023c8 100644
--- a/arch/powerpc/sysdev/mpic.c
+++ b/arch/powerpc/sysdev/mpic.c
@@ -361,7 +361,8 @@ static void mpic_enable_irq(unsigned int irq)
361 DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, irq, src); 361 DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, irq, src);
362 362
363 mpic_irq_write(src, MPIC_IRQ_VECTOR_PRI, 363 mpic_irq_write(src, MPIC_IRQ_VECTOR_PRI,
364 mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) & ~MPIC_VECPRI_MASK); 364 mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) &
365 ~MPIC_VECPRI_MASK);
365 366
366 /* make sure mask gets to controller before we return to user */ 367 /* make sure mask gets to controller before we return to user */
367 do { 368 do {
@@ -381,7 +382,8 @@ static void mpic_disable_irq(unsigned int irq)
381 DBG("%s: disable_irq: %d (src %d)\n", mpic->name, irq, src); 382 DBG("%s: disable_irq: %d (src %d)\n", mpic->name, irq, src);
382 383
383 mpic_irq_write(src, MPIC_IRQ_VECTOR_PRI, 384 mpic_irq_write(src, MPIC_IRQ_VECTOR_PRI,
384 mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) | MPIC_VECPRI_MASK); 385 mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) |
386 MPIC_VECPRI_MASK);
385 387
386 /* make sure mask gets to controller before we return to user */ 388 /* make sure mask gets to controller before we return to user */
387 do { 389 do {
@@ -735,12 +737,13 @@ void mpic_irq_set_priority(unsigned int irq, unsigned int pri)
735 737
736 spin_lock_irqsave(&mpic_lock, flags); 738 spin_lock_irqsave(&mpic_lock, flags);
737 if (is_ipi) { 739 if (is_ipi) {
738 reg = mpic_ipi_read(irq - mpic->ipi_offset) & MPIC_VECPRI_PRIORITY_MASK; 740 reg = mpic_ipi_read(irq - mpic->ipi_offset) &
741 ~MPIC_VECPRI_PRIORITY_MASK;
739 mpic_ipi_write(irq - mpic->ipi_offset, 742 mpic_ipi_write(irq - mpic->ipi_offset,
740 reg | (pri << MPIC_VECPRI_PRIORITY_SHIFT)); 743 reg | (pri << MPIC_VECPRI_PRIORITY_SHIFT));
741 } else { 744 } else {
742 reg = mpic_irq_read(irq - mpic->irq_offset, MPIC_IRQ_VECTOR_PRI) 745 reg = mpic_irq_read(irq - mpic->irq_offset,MPIC_IRQ_VECTOR_PRI)
743 & MPIC_VECPRI_PRIORITY_MASK; 746 & ~MPIC_VECPRI_PRIORITY_MASK;
744 mpic_irq_write(irq - mpic->irq_offset, MPIC_IRQ_VECTOR_PRI, 747 mpic_irq_write(irq - mpic->irq_offset, MPIC_IRQ_VECTOR_PRI,
745 reg | (pri << MPIC_VECPRI_PRIORITY_SHIFT)); 748 reg | (pri << MPIC_VECPRI_PRIORITY_SHIFT));
746 } 749 }
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/i2c/busses/i2c-ixp2000.c b/drivers/i2c/busses/i2c-ixp2000.c
index cef024a7d048..cd6f45d186ab 100644
--- a/drivers/i2c/busses/i2c-ixp2000.c
+++ b/drivers/i2c/busses/i2c-ixp2000.c
@@ -36,8 +36,6 @@
36#include <asm/hardware.h> /* Pick up IXP2000-specific bits */ 36#include <asm/hardware.h> /* Pick up IXP2000-specific bits */
37#include <asm/arch/gpio.h> 37#include <asm/arch/gpio.h>
38 38
39static struct device_driver ixp2000_i2c_driver;
40
41static inline int ixp2000_scl_pin(void *data) 39static inline int ixp2000_scl_pin(void *data)
42{ 40{
43 return ((struct ixp2000_i2c_pins*)data)->scl_pin; 41 return ((struct ixp2000_i2c_pins*)data)->scl_pin;
@@ -120,7 +118,7 @@ static int ixp2000_i2c_probe(struct platform_device *plat_dev)
120 drv_data->algo_data.timeout = 100; 118 drv_data->algo_data.timeout = 100;
121 119
122 drv_data->adapter.id = I2C_HW_B_IXP2000, 120 drv_data->adapter.id = I2C_HW_B_IXP2000,
123 strlcpy(drv_data->adapter.name, ixp2000_i2c_driver.name, 121 strlcpy(drv_data->adapter.name, plat_dev->dev.driver->name,
124 I2C_NAME_SIZE); 122 I2C_NAME_SIZE);
125 drv_data->adapter.algo_data = &drv_data->algo_data, 123 drv_data->adapter.algo_data = &drv_data->algo_data,
126 124
@@ -132,7 +130,7 @@ static int ixp2000_i2c_probe(struct platform_device *plat_dev)
132 gpio_line_set(gpio->sda_pin, 0); 130 gpio_line_set(gpio->sda_pin, 0);
133 131
134 if ((err = i2c_bit_add_bus(&drv_data->adapter)) != 0) { 132 if ((err = i2c_bit_add_bus(&drv_data->adapter)) != 0) {
135 dev_err(dev, "Could not install, error %d\n", err); 133 dev_err(&plat_dev->dev, "Could not install, error %d\n", err);
136 kfree(drv_data); 134 kfree(drv_data);
137 return err; 135 return err;
138 } 136 }
diff --git a/drivers/i2c/busses/i2c-ixp4xx.c b/drivers/i2c/busses/i2c-ixp4xx.c
index f87220be3c87..e422d8b2d4d6 100644
--- a/drivers/i2c/busses/i2c-ixp4xx.c
+++ b/drivers/i2c/busses/i2c-ixp4xx.c
@@ -35,8 +35,6 @@
35 35
36#include <asm/hardware.h> /* Pick up IXP4xx-specific bits */ 36#include <asm/hardware.h> /* Pick up IXP4xx-specific bits */
37 37
38static struct platform_driver ixp4xx_i2c_driver;
39
40static inline int ixp4xx_scl_pin(void *data) 38static inline int ixp4xx_scl_pin(void *data)
41{ 39{
42 return ((struct ixp4xx_i2c_pins*)data)->scl_pin; 40 return ((struct ixp4xx_i2c_pins*)data)->scl_pin;
@@ -128,7 +126,7 @@ static int ixp4xx_i2c_probe(struct platform_device *plat_dev)
128 drv_data->algo_data.timeout = 100; 126 drv_data->algo_data.timeout = 100;
129 127
130 drv_data->adapter.id = I2C_HW_B_IXP4XX; 128 drv_data->adapter.id = I2C_HW_B_IXP4XX;
131 strlcpy(drv_data->adapter.name, ixp4xx_i2c_driver.driver.name, 129 strlcpy(drv_data->adapter.name, plat_dev->dev.driver->name,
132 I2C_NAME_SIZE); 130 I2C_NAME_SIZE);
133 drv_data->adapter.algo_data = &drv_data->algo_data; 131 drv_data->adapter.algo_data = &drv_data->algo_data;
134 132
@@ -140,8 +138,7 @@ static int ixp4xx_i2c_probe(struct platform_device *plat_dev)
140 gpio_line_set(gpio->sda_pin, 0); 138 gpio_line_set(gpio->sda_pin, 0);
141 139
142 if ((err = i2c_bit_add_bus(&drv_data->adapter) != 0)) { 140 if ((err = i2c_bit_add_bus(&drv_data->adapter) != 0)) {
143 printk(KERN_ERR "ERROR: Could not install %s\n", 141 printk(KERN_ERR "ERROR: Could not install %s\n", plat_dev->dev.bus_id);
144 plat_dev->dev.bus_id);
145 142
146 kfree(drv_data); 143 kfree(drv_data);
147 return err; 144 return err;
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..9455e42abb23 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
3330static ide_driver_t ide_cdrom_driver = { 3330static 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,
@@ -3510,8 +3510,8 @@ static void __exit ide_cdrom_exit(void)
3510{ 3510{
3511 driver_unregister(&ide_cdrom_driver.gen_driver); 3511 driver_unregister(&ide_cdrom_driver.gen_driver);
3512} 3512}
3513 3513
3514static int ide_cdrom_init(void) 3514static int __init ide_cdrom_init(void)
3515{ 3515{
3516 return driver_register(&ide_cdrom_driver.gen_driver); 3516 return driver_register(&ide_cdrom_driver.gen_driver);
3517} 3517}
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c
index e827b39e4b3c..f4e3d3527b0e 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
1091static ide_driver_t idedisk_driver = { 1091static 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,
@@ -1266,7 +1266,7 @@ static void __exit idedisk_exit (void)
1266 driver_unregister(&idedisk_driver.gen_driver); 1266 driver_unregister(&idedisk_driver.gen_driver);
1267} 1267}
1268 1268
1269static int idedisk_init (void) 1269static int __init idedisk_init(void)
1270{ 1270{
1271 return driver_register(&idedisk_driver.gen_driver); 1271 return driver_register(&idedisk_driver.gen_driver);
1272} 1272}
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c
index f615ab759962..9e293c8063dc 100644
--- a/drivers/ide/ide-floppy.c
+++ b/drivers/ide/ide-floppy.c
@@ -1925,8 +1925,8 @@ static ide_proc_entry_t idefloppy_proc[] = {
1925static int ide_floppy_probe(struct device *); 1925static int ide_floppy_probe(struct device *);
1926 1926
1927static ide_driver_t idefloppy_driver = { 1927static 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,
@@ -2191,10 +2191,7 @@ static void __exit idefloppy_exit (void)
2191 driver_unregister(&idefloppy_driver.gen_driver); 2191 driver_unregister(&idefloppy_driver.gen_driver);
2192} 2192}
2193 2193
2194/* 2194static int __init idefloppy_init(void)
2195 * idefloppy_init will register the driver for each floppy.
2196 */
2197static int idefloppy_init (void)
2198{ 2195{
2199 printk("ide-floppy driver " IDEFLOPPY_VERSION "\n"); 2196 printk("ide-floppy driver " IDEFLOPPY_VERSION "\n");
2200 return driver_register(&idefloppy_driver.gen_driver); 2197 return driver_register(&idefloppy_driver.gen_driver);
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
index 5275cbb1afe9..ecfafcdafea4 100644
--- a/drivers/ide/ide-io.c
+++ b/drivers/ide/ide-io.c
@@ -1629,12 +1629,6 @@ EXPORT_SYMBOL(ide_init_drive_cmd);
1629 * for the new rq to be completed. This is VERY DANGEROUS, and is 1629 * for the new rq to be completed. This is VERY DANGEROUS, and is
1630 * intended for careful use by the ATAPI tape/cdrom driver code. 1630 * intended for careful use by the ATAPI tape/cdrom driver code.
1631 * 1631 *
1632 * If action is ide_next, then the rq is queued immediately after
1633 * the currently-being-processed-request (if any), and the function
1634 * returns without waiting for the new rq to be completed. As above,
1635 * This is VERY DANGEROUS, and is intended for careful use by the
1636 * ATAPI tape/cdrom driver code.
1637 *
1638 * If action is ide_end, then the rq is queued at the end of the 1632 * If action is ide_end, then the rq is queued at the end of the
1639 * request queue, and the function returns immediately without waiting 1633 * request queue, and the function returns immediately without waiting
1640 * for the new rq to be completed. This is again intended for careful 1634 * for the new rq to be completed. This is again intended for careful
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..7d7944ed4158 100644
--- a/drivers/ide/ide-tape.c
+++ b/drivers/ide/ide-tape.c
@@ -4748,8 +4748,8 @@ static ide_proc_entry_t idetape_proc[] = {
4748static int ide_tape_probe(struct device *); 4748static int ide_tape_probe(struct device *);
4749 4749
4750static ide_driver_t idetape_driver = { 4750static 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,
@@ -4916,10 +4916,7 @@ static void __exit idetape_exit (void)
4916 unregister_chrdev(IDETAPE_MAJOR, "ht"); 4916 unregister_chrdev(IDETAPE_MAJOR, "ht");
4917} 4917}
4918 4918
4919/* 4919static int __init idetape_init(void)
4920 * idetape_init will register the driver for each tape.
4921 */
4922static int idetape_init (void)
4923{ 4920{
4924 int error = 1; 4921 int error = 1;
4925 idetape_sysfs_class = class_create(THIS_MODULE, "ide_tape"); 4922 idetape_sysfs_class = class_create(THIS_MODULE, "ide_tape");
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c
index 54f9639c2a8c..62ebefd6394a 100644
--- a/drivers/ide/ide-taskfile.c
+++ b/drivers/ide/ide-taskfile.c
@@ -51,8 +51,6 @@
51#include <asm/uaccess.h> 51#include <asm/uaccess.h>
52#include <asm/io.h> 52#include <asm/io.h>
53 53
54#define DEBUG_TASKFILE 0 /* unset when fixed */
55
56static void ata_bswap_data (void *buffer, int wcount) 54static void ata_bswap_data (void *buffer, int wcount)
57{ 55{
58 u16 *p = buffer; 56 u16 *p = buffer;
@@ -765,9 +763,6 @@ ide_startstop_t flagged_taskfile (ide_drive_t *drive, ide_task_t *task)
765 ide_hwif_t *hwif = HWIF(drive); 763 ide_hwif_t *hwif = HWIF(drive);
766 task_struct_t *taskfile = (task_struct_t *) task->tfRegister; 764 task_struct_t *taskfile = (task_struct_t *) task->tfRegister;
767 hob_struct_t *hobfile = (hob_struct_t *) task->hobRegister; 765 hob_struct_t *hobfile = (hob_struct_t *) task->hobRegister;
768#if DEBUG_TASKFILE
769 u8 status;
770#endif
771 766
772 if (task->data_phase == TASKFILE_MULTI_IN || 767 if (task->data_phase == TASKFILE_MULTI_IN ||
773 task->data_phase == TASKFILE_MULTI_OUT) { 768 task->data_phase == TASKFILE_MULTI_OUT) {
@@ -778,19 +773,13 @@ ide_startstop_t flagged_taskfile (ide_drive_t *drive, ide_task_t *task)
778 } 773 }
779 774
780 /* 775 /*
781 * (ks) Check taskfile in/out flags. 776 * (ks) Check taskfile in flags.
782 * If set, then execute as it is defined. 777 * If set, then execute as it is defined.
783 * If not set, then define default settings. 778 * If not set, then define default settings.
784 * The default values are: 779 * The default values are:
785 * write and read all taskfile registers (except data) 780 * read all taskfile registers (except data)
786 * write and read the hob registers (sector,nsector,lcyl,hcyl) 781 * read the hob registers (sector, nsector, lcyl, hcyl)
787 */ 782 */
788 if (task->tf_out_flags.all == 0) {
789 task->tf_out_flags.all = IDE_TASKFILE_STD_OUT_FLAGS;
790 if (drive->addressing == 1)
791 task->tf_out_flags.all |= (IDE_HOB_STD_OUT_FLAGS << 8);
792 }
793
794 if (task->tf_in_flags.all == 0) { 783 if (task->tf_in_flags.all == 0) {
795 task->tf_in_flags.all = IDE_TASKFILE_STD_IN_FLAGS; 784 task->tf_in_flags.all = IDE_TASKFILE_STD_IN_FLAGS;
796 if (drive->addressing == 1) 785 if (drive->addressing == 1)
@@ -803,16 +792,6 @@ ide_startstop_t flagged_taskfile (ide_drive_t *drive, ide_task_t *task)
803 hwif->OUTB(drive->ctl, IDE_CONTROL_REG); 792 hwif->OUTB(drive->ctl, IDE_CONTROL_REG);
804 SELECT_MASK(drive, 0); 793 SELECT_MASK(drive, 0);
805 794
806#if DEBUG_TASKFILE
807 status = hwif->INB(IDE_STATUS_REG);
808 if (status & 0x80) {
809 printk("flagged_taskfile -> Bad status. Status = %02x. wait 100 usec ...\n", status);
810 udelay(100);
811 status = hwif->INB(IDE_STATUS_REG);
812 printk("flagged_taskfile -> Status = %02x\n", status);
813 }
814#endif
815
816 if (task->tf_out_flags.b.data) { 795 if (task->tf_out_flags.b.data) {
817 u16 data = taskfile->data + (hobfile->data << 8); 796 u16 data = taskfile->data + (hobfile->data << 8);
818 hwif->OUTW(data, IDE_DATA_REG); 797 hwif->OUTW(data, IDE_DATA_REG);
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, &reg49h);
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
877static int __devinit alim15x3_init_one(struct pci_dev *dev, const struct pci_device_id *id) 877static 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/sis5513.c b/drivers/ide/pci/sis5513.c
index 16b3e2d8bfb1..75a2253a3e68 100644
--- a/drivers/ide/pci/sis5513.c
+++ b/drivers/ide/pci/sis5513.c
@@ -87,6 +87,7 @@ static const struct {
87 u8 chipset_family; 87 u8 chipset_family;
88 u8 flags; 88 u8 flags;
89} SiSHostChipInfo[] = { 89} SiSHostChipInfo[] = {
90 { "SiS965", PCI_DEVICE_ID_SI_965, ATA_133 },
90 { "SiS745", PCI_DEVICE_ID_SI_745, ATA_100 }, 91 { "SiS745", PCI_DEVICE_ID_SI_745, ATA_100 },
91 { "SiS735", PCI_DEVICE_ID_SI_735, ATA_100 }, 92 { "SiS735", PCI_DEVICE_ID_SI_735, ATA_100 },
92 { "SiS733", PCI_DEVICE_ID_SI_733, ATA_100 }, 93 { "SiS733", PCI_DEVICE_ID_SI_733, ATA_100 },
diff --git a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c
index a4d099c937ff..7161ce0ef5aa 100644
--- a/drivers/ide/pci/via82cxxx.c
+++ b/drivers/ide/pci/via82cxxx.c
@@ -79,6 +79,7 @@ static struct via_isa_bridge {
79 u8 rev_max; 79 u8 rev_max;
80 u16 flags; 80 u16 flags;
81} via_isa_bridges[] = { 81} via_isa_bridges[] = {
82 { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
82 { "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, 83 { "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
83 { "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, 84 { "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
84 { "vt8233a", PCI_DEVICE_ID_VIA_8233A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, 85 { "vt8233a", PCI_DEVICE_ID_VIA_8233A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
@@ -100,185 +101,14 @@ static struct via_isa_bridge {
100 { NULL } 101 { NULL }
101}; 102};
102 103
103static struct via_isa_bridge *via_config;
104static unsigned int via_80w;
105static unsigned int via_clock; 104static unsigned int via_clock;
106static char *via_dma[] = { "MWDMA16", "UDMA33", "UDMA66", "UDMA100", "UDMA133" }; 105static char *via_dma[] = { "MWDMA16", "UDMA33", "UDMA66", "UDMA100", "UDMA133" };
107 106
108/* 107struct 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
117static u8 via_proc = 0;
118static unsigned long via_base;
119static struct pci_dev *bmide_dev, *isa_dev;
120
121static 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
139static int via_get_info(char *buffer, char **addr, off_t offset, int count)
140{ 108{
141 int speed[4], cycle[4], setup[4], active[4], recover[4], den[4], 109 struct via_isa_bridge *via_config;
142 uen[4], udma[4], umul[4], active8b[4], recover8b[4]; 110 unsigned int via_80w;
143 struct pci_dev *dev = bmide_dev; 111};
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 112
283/** 113/**
284 * via_set_speed - write timing registers 114 * via_set_speed - write timing registers
@@ -289,11 +119,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 119 * via_set_speed writes timing values to the chipset registers
290 */ 120 */
291 121
292static void via_set_speed(struct pci_dev *dev, u8 dn, struct ide_timing *timing) 122static void via_set_speed(ide_hwif_t *hwif, u8 dn, struct ide_timing *timing)
293{ 123{
124 struct pci_dev *dev = hwif->pci_dev;
125 struct via82cxxx_dev *vdev = ide_get_hwifdata(hwif);
294 u8 t; 126 u8 t;
295 127
296 if (~via_config->flags & VIA_BAD_AST) { 128 if (~vdev->via_config->flags & VIA_BAD_AST) {
297 pci_read_config_byte(dev, VIA_ADDRESS_SETUP, &t); 129 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)); 130 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); 131 pci_write_config_byte(dev, VIA_ADDRESS_SETUP, t);
@@ -305,7 +137,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), 137 pci_write_config_byte(dev, VIA_DRIVE_TIMING + (3 - dn),
306 ((FIT(timing->active, 1, 16) - 1) << 4) | (FIT(timing->recover, 1, 16) - 1)); 138 ((FIT(timing->active, 1, 16) - 1) << 4) | (FIT(timing->recover, 1, 16) - 1));
307 139
308 switch (via_config->flags & VIA_UDMA) { 140 switch (vdev->via_config->flags & VIA_UDMA) {
309 case VIA_UDMA_33: t = timing->udma ? (0xe0 | (FIT(timing->udma, 2, 5) - 2)) : 0x03; break; 141 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; 142 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; 143 case VIA_UDMA_100: t = timing->udma ? (0xe0 | (FIT(timing->udma, 2, 9) - 2)) : 0x07; break;
@@ -329,6 +161,7 @@ static void via_set_speed(struct pci_dev *dev, u8 dn, struct ide_timing *timing)
329static int via_set_drive(ide_drive_t *drive, u8 speed) 161static int via_set_drive(ide_drive_t *drive, u8 speed)
330{ 162{
331 ide_drive_t *peer = HWIF(drive)->drives + (~drive->dn & 1); 163 ide_drive_t *peer = HWIF(drive)->drives + (~drive->dn & 1);
164 struct via82cxxx_dev *vdev = ide_get_hwifdata(drive->hwif);
332 struct ide_timing t, p; 165 struct ide_timing t, p;
333 unsigned int T, UT; 166 unsigned int T, UT;
334 167
@@ -337,7 +170,7 @@ static int via_set_drive(ide_drive_t *drive, u8 speed)
337 170
338 T = 1000000000 / via_clock; 171 T = 1000000000 / via_clock;
339 172
340 switch (via_config->flags & VIA_UDMA) { 173 switch (vdev->via_config->flags & VIA_UDMA) {
341 case VIA_UDMA_33: UT = T; break; 174 case VIA_UDMA_33: UT = T; break;
342 case VIA_UDMA_66: UT = T/2; break; 175 case VIA_UDMA_66: UT = T/2; break;
343 case VIA_UDMA_100: UT = T/3; break; 176 case VIA_UDMA_100: UT = T/3; break;
@@ -352,7 +185,7 @@ static int via_set_drive(ide_drive_t *drive, u8 speed)
352 ide_timing_merge(&p, &t, &t, IDE_TIMING_8BIT); 185 ide_timing_merge(&p, &t, &t, IDE_TIMING_8BIT);
353 } 186 }
354 187
355 via_set_speed(HWIF(drive)->pci_dev, drive->dn, &t); 188 via_set_speed(HWIF(drive), drive->dn, &t);
356 189
357 if (!drive->init_speed) 190 if (!drive->init_speed)
358 drive->init_speed = speed; 191 drive->init_speed = speed;
@@ -390,20 +223,41 @@ static void via82cxxx_tune_drive(ide_drive_t *drive, u8 pio)
390 223
391static int via82cxxx_ide_dma_check (ide_drive_t *drive) 224static int via82cxxx_ide_dma_check (ide_drive_t *drive)
392{ 225{
393 u16 w80 = HWIF(drive)->udma_four; 226 ide_hwif_t *hwif = HWIF(drive);
227 struct via82cxxx_dev *vdev = ide_get_hwifdata(hwif);
228 u16 w80 = hwif->udma_four;
394 229
395 u16 speed = ide_find_best_mode(drive, 230 u16 speed = ide_find_best_mode(drive,
396 XFER_PIO | XFER_EPIO | XFER_SWDMA | XFER_MWDMA | 231 XFER_PIO | XFER_EPIO | XFER_SWDMA | XFER_MWDMA |
397 (via_config->flags & VIA_UDMA ? XFER_UDMA : 0) | 232 (vdev->via_config->flags & VIA_UDMA ? XFER_UDMA : 0) |
398 (w80 && (via_config->flags & VIA_UDMA) >= VIA_UDMA_66 ? XFER_UDMA_66 : 0) | 233 (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) | 234 (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)); 235 (w80 && (vdev->via_config->flags & VIA_UDMA) >= VIA_UDMA_133 ? XFER_UDMA_133 : 0));
401 236
402 via_set_drive(drive, speed); 237 via_set_drive(drive, speed);
403 238
404 if (drive->autodma && (speed & XFER_MODE) != XFER_PIO) 239 if (drive->autodma && (speed & XFER_MODE) != XFER_PIO)
405 return HWIF(drive)->ide_dma_on(drive); 240 return hwif->ide_dma_on(drive);
406 return HWIF(drive)->ide_dma_off_quietly(drive); 241 return hwif->ide_dma_off_quietly(drive);
242}
243
244static struct via_isa_bridge *via_config_find(struct pci_dev **isa)
245{
246 struct via_isa_bridge *via_config;
247 u8 t;
248
249 for (via_config = via_isa_bridges; via_config->id; via_config++)
250 if ((*isa = pci_find_device(PCI_VENDOR_ID_VIA +
251 !!(via_config->flags & VIA_BAD_ID),
252 via_config->id, NULL))) {
253
254 pci_read_config_byte(*isa, PCI_REVISION_ID, &t);
255 if (t >= via_config->rev_min &&
256 t <= via_config->rev_max)
257 break;
258 }
259
260 return via_config;
407} 261}
408 262
409/** 263/**
@@ -418,82 +272,28 @@ static int via82cxxx_ide_dma_check (ide_drive_t *drive)
418static unsigned int __devinit init_chipset_via82cxxx(struct pci_dev *dev, const char *name) 272static unsigned int __devinit init_chipset_via82cxxx(struct pci_dev *dev, const char *name)
419{ 273{
420 struct pci_dev *isa = NULL; 274 struct pci_dev *isa = NULL;
275 struct via_isa_bridge *via_config;
421 u8 t, v; 276 u8 t, v;
422 unsigned int u; 277 unsigned int u;
423 int i;
424 278
425 /* 279 /*
426 * Find the ISA bridge to see how good the IDE is. 280 * Find the ISA bridge to see how good the IDE is.
427 */ 281 */
428 282 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) { 283 if (!via_config->id) {
441 printk(KERN_WARNING "VP_IDE: Unknown VIA SouthBridge, disabling DMA.\n"); 284 printk(KERN_WARNING "VP_IDE: Unknown VIA SouthBridge, disabling DMA.\n");
442 return -ENODEV; 285 return -ENODEV;
443 } 286 }
444 287
445 /* 288 /*
446 * Check 80-wire cable presence and setup Clk66. 289 * Setup or disable Clk66 if appropriate
447 */ 290 */
448 291
449 switch (via_config->flags & VIA_UDMA) { 292 if ((via_config->flags & VIA_UDMA) == VIA_UDMA_66) {
450 293 /* Enable Clk66 */
451 case VIA_UDMA_66: 294 pci_read_config_dword(dev, VIA_UDMA_TIMING, &u);
452 /* Enable Clk66 */ 295 pci_write_config_dword(dev, VIA_UDMA_TIMING, u|0x80008);
453 pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); 296 } 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 */ 297 /* Would cause trouble on 596a and 686 */
498 pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); 298 pci_read_config_dword(dev, VIA_UDMA_TIMING, &u);
499 pci_write_config_dword(dev, VIA_UDMA_TIMING, u & ~0x80008); 299 pci_write_config_dword(dev, VIA_UDMA_TIMING, u & ~0x80008);
@@ -560,26 +360,78 @@ static unsigned int __devinit init_chipset_via82cxxx(struct pci_dev *dev, const
560 via_dma[via_config->flags & VIA_UDMA], 360 via_dma[via_config->flags & VIA_UDMA],
561 pci_name(dev)); 361 pci_name(dev));
562 362
563 /* 363 return 0;
564 * Setup /proc/ide/via entry. 364}
565 */ 365
366/*
367 * Check and handle 80-wire cable presence
368 */
369static void __devinit via_cable_detect(struct pci_dev *dev, struct via82cxxx_dev *vdev)
370{
371 unsigned int u;
372 int i;
373 pci_read_config_dword(dev, VIA_UDMA_TIMING, &u);
374
375 switch (vdev->via_config->flags & VIA_UDMA) {
376
377 case VIA_UDMA_66:
378 for (i = 24; i >= 0; i -= 8)
379 if (((u >> (i & 16)) & 8) &&
380 ((u >> i) & 0x20) &&
381 (((u >> i) & 7) < 2)) {
382 /*
383 * 2x PCI clock and
384 * UDMA w/ < 3T/cycle
385 */
386 vdev->via_80w |= (1 << (1 - (i >> 4)));
387 }
388 break;
389
390 case VIA_UDMA_100:
391 for (i = 24; i >= 0; i -= 8)
392 if (((u >> i) & 0x10) ||
393 (((u >> i) & 0x20) &&
394 (((u >> i) & 7) < 4))) {
395 /* BIOS 80-wire bit or
396 * UDMA w/ < 60ns/cycle
397 */
398 vdev->via_80w |= (1 << (1 - (i >> 4)));
399 }
400 break;
401
402 case VIA_UDMA_133:
403 for (i = 24; i >= 0; i -= 8)
404 if (((u >> i) & 0x10) ||
405 (((u >> i) & 0x20) &&
406 (((u >> i) & 7) < 6))) {
407 /* BIOS 80-wire bit or
408 * UDMA w/ < 60ns/cycle
409 */
410 vdev->via_80w |= (1 << (1 - (i >> 4)));
411 }
412 break;
566 413
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 } 414 }
575#endif /* DISPLAY_VIA_TIMINGS && CONFIG_PROC_FS */
576 return 0;
577} 415}
578 416
579static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) 417static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif)
580{ 418{
419 struct via82cxxx_dev *vdev = kmalloc(sizeof(struct via82cxxx_dev),
420 GFP_KERNEL);
421 struct pci_dev *isa = NULL;
581 int i; 422 int i;
582 423
424 if (vdev == NULL) {
425 printk(KERN_ERR "VP_IDE: out of memory :(\n");
426 return;
427 }
428
429 memset(vdev, 0, sizeof(struct via82cxxx_dev));
430 ide_set_hwifdata(hwif, vdev);
431
432 vdev->via_config = via_config_find(&isa);
433 via_cable_detect(hwif->pci_dev, vdev);
434
583 hwif->autodma = 0; 435 hwif->autodma = 0;
584 436
585 hwif->tuneproc = &via82cxxx_tune_drive; 437 hwif->tuneproc = &via82cxxx_tune_drive;
@@ -594,7 +446,7 @@ static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif)
594 446
595 for (i = 0; i < 2; i++) { 447 for (i = 0; i < 2; i++) {
596 hwif->drives[i].io_32bit = 1; 448 hwif->drives[i].io_32bit = 1;
597 hwif->drives[i].unmask = (via_config->flags & VIA_NO_UNMASK) ? 0 : 1; 449 hwif->drives[i].unmask = (vdev->via_config->flags & VIA_NO_UNMASK) ? 0 : 1;
598 hwif->drives[i].autotune = 1; 450 hwif->drives[i].autotune = 1;
599 hwif->drives[i].dn = hwif->channel * 2 + i; 451 hwif->drives[i].dn = hwif->channel * 2 + i;
600 } 452 }
@@ -608,7 +460,7 @@ static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif)
608 hwif->swdma_mask = 0x07; 460 hwif->swdma_mask = 0x07;
609 461
610 if (!hwif->udma_four) 462 if (!hwif->udma_four)
611 hwif->udma_four = (via_80w >> hwif->channel) & 1; 463 hwif->udma_four = (vdev->via_80w >> hwif->channel) & 1;
612 hwif->ide_dma_check = &via82cxxx_ide_dma_check; 464 hwif->ide_dma_check = &via82cxxx_ide_dma_check;
613 if (!noautodma) 465 if (!noautodma)
614 hwif->autodma = 1; 466 hwif->autodma = 1;
@@ -616,24 +468,35 @@ static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif)
616 hwif->drives[1].autodma = hwif->autodma; 468 hwif->drives[1].autodma = hwif->autodma;
617} 469}
618 470
619static ide_pci_device_t via82cxxx_chipset __devinitdata = { 471static ide_pci_device_t via82cxxx_chipsets[] __devinitdata = {
620 .name = "VP_IDE", 472 { /* 0 */
621 .init_chipset = init_chipset_via82cxxx, 473 .name = "VP_IDE",
622 .init_hwif = init_hwif_via82cxxx, 474 .init_chipset = init_chipset_via82cxxx,
623 .channels = 2, 475 .init_hwif = init_hwif_via82cxxx,
624 .autodma = NOAUTODMA, 476 .channels = 2,
625 .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, 477 .autodma = NOAUTODMA,
626 .bootable = ON_BOARD, 478 .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}},
479 .bootable = ON_BOARD
480 },{ /* 1 */
481 .name = "VP_IDE",
482 .init_chipset = init_chipset_via82cxxx,
483 .init_hwif = init_hwif_via82cxxx,
484 .channels = 2,
485 .autodma = AUTODMA,
486 .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}},
487 .bootable = ON_BOARD,
488 }
627}; 489};
628 490
629static int __devinit via_init_one(struct pci_dev *dev, const struct pci_device_id *id) 491static int __devinit via_init_one(struct pci_dev *dev, const struct pci_device_id *id)
630{ 492{
631 return ide_setup_pci_device(dev, &via82cxxx_chipset); 493 return ide_setup_pci_device(dev, &via82cxxx_chipsets[id->driver_data]);
632} 494}
633 495
634static struct pci_device_id via_pci_tbl[] = { 496static struct pci_device_id via_pci_tbl[] = {
635 { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C576_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 497 { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C576_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
636 { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 498 { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
499 { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_6410, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
637 { 0, }, 500 { 0, },
638}; 501};
639MODULE_DEVICE_TABLE(pci, via_pci_tbl); 502MODULE_DEVICE_TABLE(pci, via_pci_tbl);
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 */
787static LIST_HEAD(ide_pci_drivers); 787static 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 */
807static struct srp_iu *__srp_get_tx_iu(struct srp_target_port *target) 808static 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
111config HISAX_TELESPCI 111config 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
239config HISAX_NETJET 239config 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
250config HISAX_NETJET_U 250config 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
318config HISAX_HFC_PCI 318config 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
345config HISAX_ENTERNOW_PCI 345config 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
352config HISAX_AMD7930 352config 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#
4config ISDN_DRV_PCBIT 4config 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/mtd/maps/ipaq-flash.c b/drivers/mtd/maps/ipaq-flash.c
index 35097c9bbf50..b8ccb0a95789 100644
--- a/drivers/mtd/maps/ipaq-flash.c
+++ b/drivers/mtd/maps/ipaq-flash.c
@@ -246,7 +246,7 @@ int __init ipaq_mtd_init(void)
246 ipaq_map[i].size = h3xxx_max_flash_size; 246 ipaq_map[i].size = h3xxx_max_flash_size;
247 ipaq_map[i].set_vpp = h3xxx_set_vpp; 247 ipaq_map[i].set_vpp = h3xxx_set_vpp;
248 ipaq_map[i].phys = cs_phys[i]; 248 ipaq_map[i].phys = cs_phys[i];
249 ipaq_map[i].virt = __ioremap(cs_phys[i], 0x04000000, 0, 1); 249 ipaq_map[i].virt = ioremap(cs_phys[i], 0x04000000);
250 if (machine_is_h3100 () || machine_is_h1900()) 250 if (machine_is_h3100 () || machine_is_h1900())
251 ipaq_map[i].bankwidth = 2; 251 ipaq_map[i].bankwidth = 2;
252 } 252 }
@@ -280,7 +280,7 @@ int __init ipaq_mtd_init(void)
280 nb_parts = ARRAY_SIZE(jornada_partitions); 280 nb_parts = ARRAY_SIZE(jornada_partitions);
281 ipaq_map[0].size = jornada_max_flash_size; 281 ipaq_map[0].size = jornada_max_flash_size;
282 ipaq_map[0].set_vpp = jornada56x_set_vpp; 282 ipaq_map[0].set_vpp = jornada56x_set_vpp;
283 ipaq_map[0].virt = (__u32)__ioremap(0x0, 0x04000000, 0, 1); 283 ipaq_map[0].virt = (__u32)ioremap(0x0, 0x04000000);
284 } 284 }
285#endif 285#endif
286#ifdef CONFIG_SA1100_JORNADA720 286#ifdef CONFIG_SA1100_JORNADA720
@@ -442,7 +442,7 @@ static int __init h1900_special_case(void)
442 ipaq_map[0].size = 0x80000; 442 ipaq_map[0].size = 0x80000;
443 ipaq_map[0].set_vpp = h3xxx_set_vpp; 443 ipaq_map[0].set_vpp = h3xxx_set_vpp;
444 ipaq_map[0].phys = 0x0; 444 ipaq_map[0].phys = 0x0;
445 ipaq_map[0].virt = __ioremap(0x0, 0x04000000, 0, 1); 445 ipaq_map[0].virt = ioremap(0x0, 0x04000000);
446 ipaq_map[0].bankwidth = 2; 446 ipaq_map[0].bankwidth = 2;
447 447
448 printk(KERN_NOTICE "iPAQ flash: probing %d-bit flash bus, window=%lx with JEDEC.\n", ipaq_map[0].bankwidth*8, ipaq_map[0].virt); 448 printk(KERN_NOTICE "iPAQ flash: probing %d-bit flash bus, window=%lx with JEDEC.\n", ipaq_map[0].bankwidth*8, ipaq_map[0].virt);
diff --git a/drivers/mtd/maps/ixp2000.c b/drivers/mtd/maps/ixp2000.c
index fc7a78e31735..2c9cc7f37e92 100644
--- a/drivers/mtd/maps/ixp2000.c
+++ b/drivers/mtd/maps/ixp2000.c
@@ -159,12 +159,12 @@ static int ixp2000_flash_probe(struct platform_device *dev)
159 return -ENODEV; 159 return -ENODEV;
160 160
161 window_size = dev->resource->end - dev->resource->start + 1; 161 window_size = dev->resource->end - dev->resource->start + 1;
162 dev_info(_dev, "Probe of IXP2000 flash(%d banks x %dMiB)\n", 162 dev_info(&dev->dev, "Probe of IXP2000 flash(%d banks x %dMiB)\n",
163 ixp_data->nr_banks, ((u32)window_size >> 20)); 163 ixp_data->nr_banks, ((u32)window_size >> 20));
164 164
165 if (plat->width != 1) { 165 if (plat->width != 1) {
166 dev_err(_dev, "IXP2000 MTD map only supports 8-bit mode, asking for %d\n", 166 dev_err(&dev->dev, "IXP2000 MTD map only supports 8-bit mode, asking for %d\n",
167 plat->width * 8); 167 plat->width * 8);
168 return -EIO; 168 return -EIO;
169 } 169 }
170 170
@@ -202,7 +202,7 @@ static int ixp2000_flash_probe(struct platform_device *dev)
202 dev->resource->end - dev->resource->start + 1, 202 dev->resource->end - dev->resource->start + 1,
203 dev->dev.bus_id); 203 dev->dev.bus_id);
204 if (!info->res) { 204 if (!info->res) {
205 dev_err(_dev, "Could not reserve memory region\n"); 205 dev_err(&dev->dev, "Could not reserve memory region\n");
206 err = -ENOMEM; 206 err = -ENOMEM;
207 goto Error; 207 goto Error;
208 } 208 }
@@ -210,7 +210,7 @@ static int ixp2000_flash_probe(struct platform_device *dev)
210 info->map.map_priv_1 = (unsigned long) ioremap(dev->resource->start, 210 info->map.map_priv_1 = (unsigned long) ioremap(dev->resource->start,
211 dev->resource->end - dev->resource->start + 1); 211 dev->resource->end - dev->resource->start + 1);
212 if (!info->map.map_priv_1) { 212 if (!info->map.map_priv_1) {
213 dev_err(_dev, "Failed to ioremap flash region\n"); 213 dev_err(&dev->dev, "Failed to ioremap flash region\n");
214 err = -EIO; 214 err = -EIO;
215 goto Error; 215 goto Error;
216 } 216 }
@@ -221,13 +221,13 @@ static int ixp2000_flash_probe(struct platform_device *dev)
221 */ 221 */
222 222
223 erratum44_workaround = ixp2000_has_broken_slowport(); 223 erratum44_workaround = ixp2000_has_broken_slowport();
224 dev_info(_dev, "Erratum 44 workaround %s\n", 224 dev_info(&dev->dev, "Erratum 44 workaround %s\n",
225 erratum44_workaround ? "enabled" : "disabled"); 225 erratum44_workaround ? "enabled" : "disabled");
226#endif 226#endif
227 227
228 info->mtd = do_map_probe(plat->map_name, &info->map); 228 info->mtd = do_map_probe(plat->map_name, &info->map);
229 if (!info->mtd) { 229 if (!info->mtd) {
230 dev_err(_dev, "map_probe failed\n"); 230 dev_err(&dev->dev, "map_probe failed\n");
231 err = -ENXIO; 231 err = -ENXIO;
232 goto Error; 232 goto Error;
233 } 233 }
@@ -237,7 +237,7 @@ static int ixp2000_flash_probe(struct platform_device *dev)
237 if (err > 0) { 237 if (err > 0) {
238 err = add_mtd_partitions(info->mtd, info->partitions, err); 238 err = add_mtd_partitions(info->mtd, info->partitions, err);
239 if(err) 239 if(err)
240 dev_err(_dev, "Could not parse partitions\n"); 240 dev_err(&dev->dev, "Could not parse partitions\n");
241 } 241 }
242 242
243 if (err) 243 if (err)
@@ -251,8 +251,8 @@ Error:
251} 251}
252 252
253static struct platform_driver ixp2000_flash_driver = { 253static struct platform_driver ixp2000_flash_driver = {
254 .probe = &ixp2000_flash_probe, 254 .probe = ixp2000_flash_probe,
255 .remove = &ixp2000_flash_remove 255 .remove = ixp2000_flash_remove,
256 .driver = { 256 .driver = {
257 .name = "IXP2000-Flash", 257 .name = "IXP2000-Flash",
258 }, 258 },
diff --git a/drivers/mtd/nand/h1910.c b/drivers/mtd/nand/h1910.c
index 041e4b3358fb..f68f7a99a630 100644
--- a/drivers/mtd/nand/h1910.c
+++ b/drivers/mtd/nand/h1910.c
@@ -112,7 +112,7 @@ static int __init h1910_init (void)
112 if (!machine_is_h1900()) 112 if (!machine_is_h1900())
113 return -ENODEV; 113 return -ENODEV;
114 114
115 nandaddr = __ioremap(0x08000000, 0x1000, 0, 1); 115 nandaddr = ioremap(0x08000000, 0x1000);
116 if (!nandaddr) { 116 if (!nandaddr) {
117 printk("Failed to ioremap nand flash.\n"); 117 printk("Failed to ioremap nand flash.\n");
118 return -ENOMEM; 118 return -ENOMEM;
diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c
index 332e9953c55c..cd0b1dccfb61 100644
--- a/drivers/net/au1000_eth.c
+++ b/drivers/net/au1000_eth.c
@@ -32,6 +32,7 @@
32 * 32 *
33 */ 33 */
34 34
35#include <linux/config.h>
35#include <linux/module.h> 36#include <linux/module.h>
36#include <linux/kernel.h> 37#include <linux/kernel.h>
37#include <linux/sched.h> 38#include <linux/sched.h>
diff --git a/drivers/net/e100.c b/drivers/net/e100.c
index 7a6aeae2c9fa..22cd04556707 100644
--- a/drivers/net/e100.c
+++ b/drivers/net/e100.c
@@ -156,7 +156,7 @@
156 156
157#define DRV_NAME "e100" 157#define DRV_NAME "e100"
158#define DRV_EXT "-NAPI" 158#define DRV_EXT "-NAPI"
159#define DRV_VERSION "3.4.14-k2"DRV_EXT 159#define DRV_VERSION "3.4.14-k4"DRV_EXT
160#define DRV_DESCRIPTION "Intel(R) PRO/100 Network Driver" 160#define DRV_DESCRIPTION "Intel(R) PRO/100 Network Driver"
161#define DRV_COPYRIGHT "Copyright(c) 1999-2005 Intel Corporation" 161#define DRV_COPYRIGHT "Copyright(c) 1999-2005 Intel Corporation"
162#define PFX DRV_NAME ": " 162#define PFX DRV_NAME ": "
@@ -903,8 +903,8 @@ static void mdio_write(struct net_device *netdev, int addr, int reg, int data)
903 903
904static void e100_get_defaults(struct nic *nic) 904static void e100_get_defaults(struct nic *nic)
905{ 905{
906 struct param_range rfds = { .min = 16, .max = 256, .count = 64 }; 906 struct param_range rfds = { .min = 16, .max = 256, .count = 256 };
907 struct param_range cbs = { .min = 64, .max = 256, .count = 64 }; 907 struct param_range cbs = { .min = 64, .max = 256, .count = 128 };
908 908
909 pci_read_config_byte(nic->pdev, PCI_REVISION_ID, &nic->rev_id); 909 pci_read_config_byte(nic->pdev, PCI_REVISION_ID, &nic->rev_id);
910 /* MAC type is encoded as rev ID; exception: ICH is treated as 82559 */ 910 /* MAC type is encoded as rev ID; exception: ICH is treated as 82559 */
@@ -1007,25 +1007,264 @@ static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)
1007 c[16], c[17], c[18], c[19], c[20], c[21], c[22], c[23]); 1007 c[16], c[17], c[18], c[19], c[20], c[21], c[22], c[23]);
1008} 1008}
1009 1009
1010/********************************************************/
1011/* Micro code for 8086:1229 Rev 8 */
1012/********************************************************/
1013
1014/* Parameter values for the D101M B-step */
1015#define D101M_CPUSAVER_TIMER_DWORD 78
1016#define D101M_CPUSAVER_BUNDLE_DWORD 65
1017#define D101M_CPUSAVER_MIN_SIZE_DWORD 126
1018
1019#define D101M_B_RCVBUNDLE_UCODE \
1020{\
10210x00550215, 0xFFFF0437, 0xFFFFFFFF, 0x06A70789, 0xFFFFFFFF, 0x0558FFFF, \
10220x000C0001, 0x00101312, 0x000C0008, 0x00380216, \
10230x0010009C, 0x00204056, 0x002380CC, 0x00380056, \
10240x0010009C, 0x00244C0B, 0x00000800, 0x00124818, \
10250x00380438, 0x00000000, 0x00140000, 0x00380555, \
10260x00308000, 0x00100662, 0x00100561, 0x000E0408, \
10270x00134861, 0x000C0002, 0x00103093, 0x00308000, \
10280x00100624, 0x00100561, 0x000E0408, 0x00100861, \
10290x000C007E, 0x00222C21, 0x000C0002, 0x00103093, \
10300x00380C7A, 0x00080000, 0x00103090, 0x00380C7A, \
10310x00000000, 0x00000000, 0x00000000, 0x00000000, \
10320x0010009C, 0x00244C2D, 0x00010004, 0x00041000, \
10330x003A0437, 0x00044010, 0x0038078A, 0x00000000, \
10340x00100099, 0x00206C7A, 0x0010009C, 0x00244C48, \
10350x00130824, 0x000C0001, 0x00101213, 0x00260C75, \
10360x00041000, 0x00010004, 0x00130826, 0x000C0006, \
10370x002206A8, 0x0013C926, 0x00101313, 0x003806A8, \
10380x00000000, 0x00000000, 0x00000000, 0x00000000, \
10390x00000000, 0x00000000, 0x00000000, 0x00000000, \
10400x00080600, 0x00101B10, 0x00050004, 0x00100826, \
10410x00101210, 0x00380C34, 0x00000000, 0x00000000, \
10420x0021155B, 0x00100099, 0x00206559, 0x0010009C, \
10430x00244559, 0x00130836, 0x000C0000, 0x00220C62, \
10440x000C0001, 0x00101B13, 0x00229C0E, 0x00210C0E, \
10450x00226C0E, 0x00216C0E, 0x0022FC0E, 0x00215C0E, \
10460x00214C0E, 0x00380555, 0x00010004, 0x00041000, \
10470x00278C67, 0x00040800, 0x00018100, 0x003A0437, \
10480x00130826, 0x000C0001, 0x00220559, 0x00101313, \
10490x00380559, 0x00000000, 0x00000000, 0x00000000, \
10500x00000000, 0x00000000, 0x00000000, 0x00000000, \
10510x00000000, 0x00130831, 0x0010090B, 0x00124813, \
10520x000CFF80, 0x002606AB, 0x00041000, 0x00010004, \
10530x003806A8, 0x00000000, 0x00000000, 0x00000000, \
1054}
1055
1056/********************************************************/
1057/* Micro code for 8086:1229 Rev 9 */
1058/********************************************************/
1059
1060/* Parameter values for the D101S */
1061#define D101S_CPUSAVER_TIMER_DWORD 78
1062#define D101S_CPUSAVER_BUNDLE_DWORD 67
1063#define D101S_CPUSAVER_MIN_SIZE_DWORD 128
1064
1065#define D101S_RCVBUNDLE_UCODE \
1066{\
10670x00550242, 0xFFFF047E, 0xFFFFFFFF, 0x06FF0818, 0xFFFFFFFF, 0x05A6FFFF, \
10680x000C0001, 0x00101312, 0x000C0008, 0x00380243, \
10690x0010009C, 0x00204056, 0x002380D0, 0x00380056, \
10700x0010009C, 0x00244F8B, 0x00000800, 0x00124818, \
10710x0038047F, 0x00000000, 0x00140000, 0x003805A3, \
10720x00308000, 0x00100610, 0x00100561, 0x000E0408, \
10730x00134861, 0x000C0002, 0x00103093, 0x00308000, \
10740x00100624, 0x00100561, 0x000E0408, 0x00100861, \
10750x000C007E, 0x00222FA1, 0x000C0002, 0x00103093, \
10760x00380F90, 0x00080000, 0x00103090, 0x00380F90, \
10770x00000000, 0x00000000, 0x00000000, 0x00000000, \
10780x0010009C, 0x00244FAD, 0x00010004, 0x00041000, \
10790x003A047E, 0x00044010, 0x00380819, 0x00000000, \
10800x00100099, 0x00206FFD, 0x0010009A, 0x0020AFFD, \
10810x0010009C, 0x00244FC8, 0x00130824, 0x000C0001, \
10820x00101213, 0x00260FF7, 0x00041000, 0x00010004, \
10830x00130826, 0x000C0006, 0x00220700, 0x0013C926, \
10840x00101313, 0x00380700, 0x00000000, 0x00000000, \
10850x00000000, 0x00000000, 0x00000000, 0x00000000, \
10860x00080600, 0x00101B10, 0x00050004, 0x00100826, \
10870x00101210, 0x00380FB6, 0x00000000, 0x00000000, \
10880x002115A9, 0x00100099, 0x002065A7, 0x0010009A, \
10890x0020A5A7, 0x0010009C, 0x002445A7, 0x00130836, \
10900x000C0000, 0x00220FE4, 0x000C0001, 0x00101B13, \
10910x00229F8E, 0x00210F8E, 0x00226F8E, 0x00216F8E, \
10920x0022FF8E, 0x00215F8E, 0x00214F8E, 0x003805A3, \
10930x00010004, 0x00041000, 0x00278FE9, 0x00040800, \
10940x00018100, 0x003A047E, 0x00130826, 0x000C0001, \
10950x002205A7, 0x00101313, 0x003805A7, 0x00000000, \
10960x00000000, 0x00000000, 0x00000000, 0x00000000, \
10970x00000000, 0x00000000, 0x00000000, 0x00130831, \
10980x0010090B, 0x00124813, 0x000CFF80, 0x00260703, \
10990x00041000, 0x00010004, 0x00380700 \
1100}
1101
1102/********************************************************/
1103/* Micro code for the 8086:1229 Rev F/10 */
1104/********************************************************/
1105
1106/* Parameter values for the D102 E-step */
1107#define D102_E_CPUSAVER_TIMER_DWORD 42
1108#define D102_E_CPUSAVER_BUNDLE_DWORD 54
1109#define D102_E_CPUSAVER_MIN_SIZE_DWORD 46
1110
1111#define D102_E_RCVBUNDLE_UCODE \
1112{\
11130x007D028F, 0x0E4204F9, 0x14ED0C85, 0x14FA14E9, 0x0EF70E36, 0x1FFF1FFF, \
11140x00E014B9, 0x00000000, 0x00000000, 0x00000000, \
11150x00E014BD, 0x00000000, 0x00000000, 0x00000000, \
11160x00E014D5, 0x00000000, 0x00000000, 0x00000000, \
11170x00000000, 0x00000000, 0x00000000, 0x00000000, \
11180x00E014C1, 0x00000000, 0x00000000, 0x00000000, \
11190x00000000, 0x00000000, 0x00000000, 0x00000000, \
11200x00000000, 0x00000000, 0x00000000, 0x00000000, \
11210x00000000, 0x00000000, 0x00000000, 0x00000000, \
11220x00E014C8, 0x00000000, 0x00000000, 0x00000000, \
11230x00200600, 0x00E014EE, 0x00000000, 0x00000000, \
11240x0030FF80, 0x00940E46, 0x00038200, 0x00102000, \
11250x00E00E43, 0x00000000, 0x00000000, 0x00000000, \
11260x00300006, 0x00E014FB, 0x00000000, 0x00000000, \
11270x00000000, 0x00000000, 0x00000000, 0x00000000, \
11280x00000000, 0x00000000, 0x00000000, 0x00000000, \
11290x00000000, 0x00000000, 0x00000000, 0x00000000, \
11300x00906E41, 0x00800E3C, 0x00E00E39, 0x00000000, \
11310x00906EFD, 0x00900EFD, 0x00E00EF8, 0x00000000, \
11320x00000000, 0x00000000, 0x00000000, 0x00000000, \
11330x00000000, 0x00000000, 0x00000000, 0x00000000, \
11340x00000000, 0x00000000, 0x00000000, 0x00000000, \
11350x00000000, 0x00000000, 0x00000000, 0x00000000, \
11360x00000000, 0x00000000, 0x00000000, 0x00000000, \
11370x00000000, 0x00000000, 0x00000000, 0x00000000, \
11380x00000000, 0x00000000, 0x00000000, 0x00000000, \
11390x00000000, 0x00000000, 0x00000000, 0x00000000, \
11400x00000000, 0x00000000, 0x00000000, 0x00000000, \
11410x00000000, 0x00000000, 0x00000000, 0x00000000, \
11420x00000000, 0x00000000, 0x00000000, 0x00000000, \
11430x00000000, 0x00000000, 0x00000000, 0x00000000, \
11440x00000000, 0x00000000, 0x00000000, 0x00000000, \
11450x00000000, 0x00000000, 0x00000000, 0x00000000, \
1146}
1147
1010static void e100_load_ucode(struct nic *nic, struct cb *cb, struct sk_buff *skb) 1148static void e100_load_ucode(struct nic *nic, struct cb *cb, struct sk_buff *skb)
1011{ 1149{
1012 int i; 1150/* *INDENT-OFF* */
1013 static const u32 ucode[UCODE_SIZE] = { 1151 static struct {
1014 /* NFS packets are misinterpreted as TCO packets and 1152 u32 ucode[UCODE_SIZE + 1];
1015 * incorrectly routed to the BMC over SMBus. This 1153 u8 mac;
1016 * microcode patch checks the fragmented IP bit in the 1154 u8 timer_dword;
1017 * NFS/UDP header to distinguish between NFS and TCO. */ 1155 u8 bundle_dword;
1018 0x0EF70E36, 0x1FFF1FFF, 0x1FFF1FFF, 0x1FFF1FFF, 0x1FFF1FFF, 1156 u8 min_size_dword;
1019 0x1FFF1FFF, 0x00906E41, 0x00800E3C, 0x00E00E39, 0x00000000, 1157 } ucode_opts[] = {
1020 0x00906EFD, 0x00900EFD, 0x00E00EF8, 1158 { D101M_B_RCVBUNDLE_UCODE,
1021 }; 1159 mac_82559_D101M,
1022 1160 D101M_CPUSAVER_TIMER_DWORD,
1023 if(nic->mac == mac_82551_F || nic->mac == mac_82551_10) { 1161 D101M_CPUSAVER_BUNDLE_DWORD,
1024 for(i = 0; i < UCODE_SIZE; i++) 1162 D101M_CPUSAVER_MIN_SIZE_DWORD },
1163 { D101S_RCVBUNDLE_UCODE,
1164 mac_82559_D101S,
1165 D101S_CPUSAVER_TIMER_DWORD,
1166 D101S_CPUSAVER_BUNDLE_DWORD,
1167 D101S_CPUSAVER_MIN_SIZE_DWORD },
1168 { D102_E_RCVBUNDLE_UCODE,
1169 mac_82551_F,
1170 D102_E_CPUSAVER_TIMER_DWORD,
1171 D102_E_CPUSAVER_BUNDLE_DWORD,
1172 D102_E_CPUSAVER_MIN_SIZE_DWORD },
1173 { D102_E_RCVBUNDLE_UCODE,
1174 mac_82551_10,
1175 D102_E_CPUSAVER_TIMER_DWORD,
1176 D102_E_CPUSAVER_BUNDLE_DWORD,
1177 D102_E_CPUSAVER_MIN_SIZE_DWORD },
1178 { {0}, 0, 0, 0, 0}
1179 }, *opts;
1180/* *INDENT-ON* */
1181
1182/*************************************************************************
1183* CPUSaver parameters
1184*
1185* All CPUSaver parameters are 16-bit literals that are part of a
1186* "move immediate value" instruction. By changing the value of
1187* the literal in the instruction before the code is loaded, the
1188* driver can change the algorithm.
1189*
1190* INTDELAY - This loads the dead-man timer with its inital value.
1191* When this timer expires the interrupt is asserted, and the
1192* timer is reset each time a new packet is received. (see
1193* BUNDLEMAX below to set the limit on number of chained packets)
1194* The current default is 0x600 or 1536. Experiments show that
1195* the value should probably stay within the 0x200 - 0x1000.
1196*
1197* BUNDLEMAX -
1198* This sets the maximum number of frames that will be bundled. In
1199* some situations, such as the TCP windowing algorithm, it may be
1200* better to limit the growth of the bundle size than let it go as
1201* high as it can, because that could cause too much added latency.
1202* The default is six, because this is the number of packets in the
1203* default TCP window size. A value of 1 would make CPUSaver indicate
1204* an interrupt for every frame received. If you do not want to put
1205* a limit on the bundle size, set this value to xFFFF.
1206*
1207* BUNDLESMALL -
1208* This contains a bit-mask describing the minimum size frame that
1209* will be bundled. The default masks the lower 7 bits, which means
1210* that any frame less than 128 bytes in length will not be bundled,
1211* but will instead immediately generate an interrupt. This does
1212* not affect the current bundle in any way. Any frame that is 128
1213* bytes or large will be bundled normally. This feature is meant
1214* to provide immediate indication of ACK frames in a TCP environment.
1215* Customers were seeing poor performance when a machine with CPUSaver
1216* enabled was sending but not receiving. The delay introduced when
1217* the ACKs were received was enough to reduce total throughput, because
1218* the sender would sit idle until the ACK was finally seen.
1219*
1220* The current default is 0xFF80, which masks out the lower 7 bits.
1221* This means that any frame which is x7F (127) bytes or smaller
1222* will cause an immediate interrupt. Because this value must be a
1223* bit mask, there are only a few valid values that can be used. To
1224* turn this feature off, the driver can write the value xFFFF to the
1225* lower word of this instruction (in the same way that the other
1226* parameters are used). Likewise, a value of 0xF800 (2047) would
1227* cause an interrupt to be generated for every frame, because all
1228* standard Ethernet frames are <= 2047 bytes in length.
1229*************************************************************************/
1230
1231/* if you wish to disable the ucode functionality, while maintaining the
1232 * workarounds it provides, set the following defines to:
1233 * BUNDLESMALL 0
1234 * BUNDLEMAX 1
1235 * INTDELAY 1
1236 */
1237#define BUNDLESMALL 1
1238#define BUNDLEMAX (u16)6
1239#define INTDELAY (u16)1536 /* 0x600 */
1240
1241 /* do not load u-code for ICH devices */
1242 if (nic->flags & ich)
1243 goto noloaducode;
1244
1245 /* Search for ucode match against h/w rev_id */
1246 for (opts = ucode_opts; opts->mac; opts++) {
1247 int i;
1248 u32 *ucode = opts->ucode;
1249 if (nic->mac != opts->mac)
1250 continue;
1251
1252 /* Insert user-tunable settings */
1253 ucode[opts->timer_dword] &= 0xFFFF0000;
1254 ucode[opts->timer_dword] |= INTDELAY;
1255 ucode[opts->bundle_dword] &= 0xFFFF0000;
1256 ucode[opts->bundle_dword] |= BUNDLEMAX;
1257 ucode[opts->min_size_dword] &= 0xFFFF0000;
1258 ucode[opts->min_size_dword] |= (BUNDLESMALL) ? 0xFFFF : 0xFF80;
1259
1260 for (i = 0; i < UCODE_SIZE; i++)
1025 cb->u.ucode[i] = cpu_to_le32(ucode[i]); 1261 cb->u.ucode[i] = cpu_to_le32(ucode[i]);
1026 cb->command = cpu_to_le16(cb_ucode); 1262 cb->command = cpu_to_le16(cb_ucode);
1027 } else 1263 return;
1028 cb->command = cpu_to_le16(cb_nop); 1264 }
1265
1266noloaducode:
1267 cb->command = cpu_to_le16(cb_nop);
1029} 1268}
1030 1269
1031static void e100_setup_iaaddr(struct nic *nic, struct cb *cb, 1270static void e100_setup_iaaddr(struct nic *nic, struct cb *cb,
diff --git a/drivers/net/fec_8xx/Kconfig b/drivers/net/fec_8xx/Kconfig
index 94e7a9af8705..a84c232395e3 100644
--- a/drivers/net/fec_8xx/Kconfig
+++ b/drivers/net/fec_8xx/Kconfig
@@ -1,6 +1,6 @@
1config FEC_8XX 1config FEC_8XX
2 tristate "Motorola 8xx FEC driver" 2 tristate "Motorola 8xx FEC driver"
3 depends on NET_ETHERNET && FEC 3 depends on NET_ETHERNET && 8xx
4 select MII 4 select MII
5 5
6config FEC_8XX_GENERIC_PHY 6config FEC_8XX_GENERIC_PHY
diff --git a/drivers/net/ioc3-eth.c b/drivers/net/ioc3-eth.c
index 6a3129bc15a6..9b8295ee06ef 100644
--- a/drivers/net/ioc3-eth.c
+++ b/drivers/net/ioc3-eth.c
@@ -1360,7 +1360,7 @@ static struct pci_driver ioc3_driver = {
1360 1360
1361static int __init ioc3_init_module(void) 1361static int __init ioc3_init_module(void)
1362{ 1362{
1363 return pci_module_init(&ioc3_driver); 1363 return pci_register_driver(&ioc3_driver);
1364} 1364}
1365 1365
1366static void __exit ioc3_cleanup_module(void) 1366static void __exit ioc3_cleanup_module(void)
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index 159b56a56ef4..14a76f7cf900 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -1346,10 +1346,8 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out,
1346 } else { 1346 } else {
1347 if (netif_msg_probe(tp)) { 1347 if (netif_msg_probe(tp)) {
1348 printk(KERN_ERR PFX 1348 printk(KERN_ERR PFX
1349 "Cannot find PowerManagement capability. " 1349 "PowerManagement capability not found.\n");
1350 "Aborting.\n");
1351 } 1350 }
1352 goto err_out_mwi;
1353 } 1351 }
1354 1352
1355 /* make sure PCI base addr 1 is MMIO */ 1353 /* make sure PCI base addr 1 is MMIO */
@@ -2516,7 +2514,7 @@ rtl8169_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
2516 } while (boguscnt > 0); 2514 } while (boguscnt > 0);
2517 2515
2518 if (boguscnt <= 0) { 2516 if (boguscnt <= 0) {
2519 if (net_ratelimit() && netif_msg_intr(tp)) { 2517 if (netif_msg_intr(tp) && net_ratelimit() ) {
2520 printk(KERN_WARNING 2518 printk(KERN_WARNING
2521 "%s: Too much work at interrupt!\n", dev->name); 2519 "%s: Too much work at interrupt!\n", dev->name);
2522 } 2520 }
diff --git a/drivers/net/saa9730.h b/drivers/net/saa9730.h
index 9e9da6b4080f..a7e9d29a86a7 100644
--- a/drivers/net/saa9730.h
+++ b/drivers/net/saa9730.h
@@ -1,6 +1,7 @@
1/* 1/*
2 * Carsten Langgaard, carstenl@mips.com 2 * Copyright (C) 2000, 2005 MIPS Technologies, Inc. All rights reserved.
3 * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. 3 * Authors: Carsten Langgaard <carstenl@mips.com>
4 * Maciej W. Rozycki <macro@mips.com>
4 * 5 *
5 * ######################################################################## 6 * ########################################################################
6 * 7 *
@@ -265,6 +266,7 @@
265 266
266/* The SAA9730 (LAN) controller register map, as seen via the PCI-bus. */ 267/* The SAA9730 (LAN) controller register map, as seen via the PCI-bus. */
267#define SAA9730_LAN_REGS_ADDR 0x20400 268#define SAA9730_LAN_REGS_ADDR 0x20400
269#define SAA9730_LAN_REGS_SIZE 0x00400
268 270
269struct lan_saa9730_regmap { 271struct lan_saa9730_regmap {
270 volatile unsigned int TxBuffA; /* 0x20400 */ 272 volatile unsigned int TxBuffA; /* 0x20400 */
@@ -309,6 +311,7 @@ typedef volatile struct lan_saa9730_regmap t_lan_saa9730_regmap;
309 311
310/* The SAA9730 (EVM) controller register map, as seen via the PCI-bus. */ 312/* The SAA9730 (EVM) controller register map, as seen via the PCI-bus. */
311#define SAA9730_EVM_REGS_ADDR 0x02000 313#define SAA9730_EVM_REGS_ADDR 0x02000
314#define SAA9730_EVM_REGS_SIZE 0x00400
312 315
313struct evm_saa9730_regmap { 316struct evm_saa9730_regmap {
314 volatile unsigned int InterruptStatus1; /* 0x2000 */ 317 volatile unsigned int InterruptStatus1; /* 0x2000 */
@@ -329,16 +332,32 @@ typedef volatile struct evm_saa9730_regmap t_evm_saa9730_regmap;
329 332
330 333
331struct lan_saa9730_private { 334struct lan_saa9730_private {
335 /*
336 * Rx/Tx packet buffers.
337 * The Rx and Tx packets must be PACKET_SIZE aligned.
338 */
339 void *buffer_start;
340 unsigned int buffer_size;
341
342 /*
343 * DMA address of beginning of this object, returned
344 * by pci_alloc_consistent().
345 */
346 dma_addr_t dma_addr;
347
348 /* Pointer to the associated pci device structure */
349 struct pci_dev *pci_dev;
350
332 /* Pointer for the SAA9730 LAN controller register set. */ 351 /* Pointer for the SAA9730 LAN controller register set. */
333 t_lan_saa9730_regmap *lan_saa9730_regs; 352 t_lan_saa9730_regmap *lan_saa9730_regs;
334 353
335 /* Pointer to the SAA9730 EVM register. */ 354 /* Pointer to the SAA9730 EVM register. */
336 t_evm_saa9730_regmap *evm_saa9730_regs; 355 t_evm_saa9730_regmap *evm_saa9730_regs;
337 356
338 /* TRUE if the next buffer to write is RxBuffA, FALSE if RxBuffB. */
339 unsigned char NextRcvToUseIsA;
340 /* Rcv buffer Index. */ 357 /* Rcv buffer Index. */
341 unsigned char NextRcvPacketIndex; 358 unsigned char NextRcvPacketIndex;
359 /* Next buffer index. */
360 unsigned char NextRcvBufferIndex;
342 361
343 /* Index of next packet to use in that buffer. */ 362 /* Index of next packet to use in that buffer. */
344 unsigned char NextTxmPacketIndex; 363 unsigned char NextTxmPacketIndex;
@@ -353,13 +372,8 @@ struct lan_saa9730_private {
353 unsigned char DmaRcvPackets; 372 unsigned char DmaRcvPackets;
354 unsigned char DmaTxmPackets; 373 unsigned char DmaTxmPackets;
355 374
356 unsigned char RcvAIndex; /* index into RcvBufferSpace[] for Blk A */ 375 void *TxmBuffer[LAN_SAA9730_BUFFERS][LAN_SAA9730_TXM_Q_SIZE];
357 unsigned char RcvBIndex; /* index into RcvBufferSpace[] for Blk B */ 376 void *RcvBuffer[LAN_SAA9730_BUFFERS][LAN_SAA9730_RCV_Q_SIZE];
358
359 unsigned int
360 TxmBuffer[LAN_SAA9730_BUFFERS][LAN_SAA9730_TXM_Q_SIZE];
361 unsigned int
362 RcvBuffer[LAN_SAA9730_BUFFERS][LAN_SAA9730_RCV_Q_SIZE];
363 unsigned int TxBufferFree[LAN_SAA9730_BUFFERS]; 377 unsigned int TxBufferFree[LAN_SAA9730_BUFFERS];
364 378
365 unsigned char PhysicalAddress[LAN_SAA9730_CAM_ENTRIES][6]; 379 unsigned char PhysicalAddress[LAN_SAA9730_CAM_ENTRIES][6];
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c
index c91e2e81f131..28bf2e69eb5e 100644
--- a/drivers/net/smc91x.c
+++ b/drivers/net/smc91x.c
@@ -155,6 +155,12 @@ MODULE_LICENSE("GPL");
155#define MEMORY_WAIT_TIME 16 155#define MEMORY_WAIT_TIME 16
156 156
157/* 157/*
158 * The maximum number of processing loops allowed for each call to the
159 * IRQ handler.
160 */
161#define MAX_IRQ_LOOPS 8
162
163/*
158 * This selects whether TX packets are sent one by one to the SMC91x internal 164 * This selects whether TX packets are sent one by one to the SMC91x internal
159 * memory and throttled until transmission completes. This may prevent 165 * memory and throttled until transmission completes. This may prevent
160 * RX overruns a litle by keeping much of the memory free for RX packets 166 * RX overruns a litle by keeping much of the memory free for RX packets
@@ -684,7 +690,6 @@ static void smc_hardware_send_pkt(unsigned long data)
684 690
685 /* queue the packet for TX */ 691 /* queue the packet for TX */
686 SMC_SET_MMU_CMD(MC_ENQUEUE); 692 SMC_SET_MMU_CMD(MC_ENQUEUE);
687 SMC_ACK_INT(IM_TX_EMPTY_INT);
688 smc_special_unlock(&lp->lock); 693 smc_special_unlock(&lp->lock);
689 694
690 dev->trans_start = jiffies; 695 dev->trans_start = jiffies;
@@ -1207,6 +1212,7 @@ static void smc_phy_configure(void *data)
1207 smc_phy_check_media(dev, 1); 1212 smc_phy_check_media(dev, 1);
1208 1213
1209smc_phy_configure_exit: 1214smc_phy_configure_exit:
1215 SMC_SELECT_BANK(2);
1210 spin_unlock_irq(&lp->lock); 1216 spin_unlock_irq(&lp->lock);
1211 lp->work_pending = 0; 1217 lp->work_pending = 0;
1212} 1218}
@@ -1305,7 +1311,7 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1305 SMC_SET_INT_MASK(0); 1311 SMC_SET_INT_MASK(0);
1306 1312
1307 /* set a timeout value, so I don't stay here forever */ 1313 /* set a timeout value, so I don't stay here forever */
1308 timeout = 8; 1314 timeout = MAX_IRQ_LOOPS;
1309 1315
1310 do { 1316 do {
1311 status = SMC_GET_INT(); 1317 status = SMC_GET_INT();
@@ -1372,10 +1378,13 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1372 /* restore register states */ 1378 /* restore register states */
1373 SMC_SET_PTR(saved_pointer); 1379 SMC_SET_PTR(saved_pointer);
1374 SMC_SET_INT_MASK(mask); 1380 SMC_SET_INT_MASK(mask);
1375
1376 spin_unlock(&lp->lock); 1381 spin_unlock(&lp->lock);
1377 1382
1378 DBG(3, "%s: Interrupt done (%d loops)\n", dev->name, 8-timeout); 1383 if (timeout == MAX_IRQ_LOOPS)
1384 PRINTK("%s: spurious interrupt (mask = 0x%02x)\n",
1385 dev->name, mask);
1386 DBG(3, "%s: Interrupt done (%d loops)\n",
1387 dev->name, MAX_IRQ_LOOPS - timeout);
1379 1388
1380 /* 1389 /*
1381 * We return IRQ_HANDLED unconditionally here even if there was 1390 * We return IRQ_HANDLED unconditionally here even if there was
diff --git a/drivers/net/wan/hdlc_cisco.c b/drivers/net/wan/hdlc_cisco.c
index a01efa6d5c62..1fd04662c4fc 100644
--- a/drivers/net/wan/hdlc_cisco.c
+++ b/drivers/net/wan/hdlc_cisco.c
@@ -192,7 +192,9 @@ static int cisco_rx(struct sk_buff *skb)
192 "uptime %ud%uh%um%us)\n", 192 "uptime %ud%uh%um%us)\n",
193 dev->name, days, hrs, 193 dev->name, days, hrs,
194 min, sec); 194 min, sec);
195#if 0
195 netif_carrier_on(dev); 196 netif_carrier_on(dev);
197#endif
196 hdlc->state.cisco.up = 1; 198 hdlc->state.cisco.up = 1;
197 } 199 }
198 } 200 }
@@ -225,7 +227,9 @@ static void cisco_timer(unsigned long arg)
225 hdlc->state.cisco.settings.timeout * HZ)) { 227 hdlc->state.cisco.settings.timeout * HZ)) {
226 hdlc->state.cisco.up = 0; 228 hdlc->state.cisco.up = 0;
227 printk(KERN_INFO "%s: Link down\n", dev->name); 229 printk(KERN_INFO "%s: Link down\n", dev->name);
230#if 0
228 netif_carrier_off(dev); 231 netif_carrier_off(dev);
232#endif
229 } 233 }
230 234
231 cisco_keepalive_send(dev, CISCO_KEEPALIVE_REQ, 235 cisco_keepalive_send(dev, CISCO_KEEPALIVE_REQ,
@@ -261,8 +265,10 @@ static void cisco_stop(struct net_device *dev)
261{ 265{
262 hdlc_device *hdlc = dev_to_hdlc(dev); 266 hdlc_device *hdlc = dev_to_hdlc(dev);
263 del_timer_sync(&hdlc->state.cisco.timer); 267 del_timer_sync(&hdlc->state.cisco.timer);
268#if 0
264 if (netif_carrier_ok(dev)) 269 if (netif_carrier_ok(dev))
265 netif_carrier_off(dev); 270 netif_carrier_off(dev);
271#endif
266 hdlc->state.cisco.up = 0; 272 hdlc->state.cisco.up = 0;
267 hdlc->state.cisco.request_sent = 0; 273 hdlc->state.cisco.request_sent = 0;
268} 274}
diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c
index e1601d35dced..523afe17564e 100644
--- a/drivers/net/wan/hdlc_fr.c
+++ b/drivers/net/wan/hdlc_fr.c
@@ -545,8 +545,10 @@ static void fr_set_link_state(int reliable, struct net_device *dev)
545 545
546 hdlc->state.fr.reliable = reliable; 546 hdlc->state.fr.reliable = reliable;
547 if (reliable) { 547 if (reliable) {
548#if 0
548 if (!netif_carrier_ok(dev)) 549 if (!netif_carrier_ok(dev))
549 netif_carrier_on(dev); 550 netif_carrier_on(dev);
551#endif
550 552
551 hdlc->state.fr.n391cnt = 0; /* Request full status */ 553 hdlc->state.fr.n391cnt = 0; /* Request full status */
552 hdlc->state.fr.dce_changed = 1; 554 hdlc->state.fr.dce_changed = 1;
@@ -560,8 +562,10 @@ static void fr_set_link_state(int reliable, struct net_device *dev)
560 } 562 }
561 } 563 }
562 } else { 564 } else {
565#if 0
563 if (netif_carrier_ok(dev)) 566 if (netif_carrier_ok(dev))
564 netif_carrier_off(dev); 567 netif_carrier_off(dev);
568#endif
565 569
566 while (pvc) { /* Deactivate all PVCs */ 570 while (pvc) { /* Deactivate all PVCs */
567 pvc_carrier(0, pvc); 571 pvc_carrier(0, pvc);
diff --git a/drivers/net/wan/hdlc_generic.c b/drivers/net/wan/hdlc_generic.c
index cdd4c09c2d90..46cef8f92133 100644
--- a/drivers/net/wan/hdlc_generic.c
+++ b/drivers/net/wan/hdlc_generic.c
@@ -79,11 +79,13 @@ static void __hdlc_set_carrier_on(struct net_device *dev)
79 hdlc_device *hdlc = dev_to_hdlc(dev); 79 hdlc_device *hdlc = dev_to_hdlc(dev);
80 if (hdlc->proto.start) 80 if (hdlc->proto.start)
81 return hdlc->proto.start(dev); 81 return hdlc->proto.start(dev);
82#if 0
82#ifdef DEBUG_LINK 83#ifdef DEBUG_LINK
83 if (netif_carrier_ok(dev)) 84 if (netif_carrier_ok(dev))
84 printk(KERN_ERR "hdlc_set_carrier_on(): already on\n"); 85 printk(KERN_ERR "hdlc_set_carrier_on(): already on\n");
85#endif 86#endif
86 netif_carrier_on(dev); 87 netif_carrier_on(dev);
88#endif
87} 89}
88 90
89 91
@@ -94,11 +96,13 @@ static void __hdlc_set_carrier_off(struct net_device *dev)
94 if (hdlc->proto.stop) 96 if (hdlc->proto.stop)
95 return hdlc->proto.stop(dev); 97 return hdlc->proto.stop(dev);
96 98
99#if 0
97#ifdef DEBUG_LINK 100#ifdef DEBUG_LINK
98 if (!netif_carrier_ok(dev)) 101 if (!netif_carrier_ok(dev))
99 printk(KERN_ERR "hdlc_set_carrier_off(): already off\n"); 102 printk(KERN_ERR "hdlc_set_carrier_off(): already off\n");
100#endif 103#endif
101 netif_carrier_off(dev); 104 netif_carrier_off(dev);
105#endif
102} 106}
103 107
104 108
@@ -294,8 +298,10 @@ int register_hdlc_device(struct net_device *dev)
294 if (result != 0) 298 if (result != 0)
295 return -EIO; 299 return -EIO;
296 300
301#if 0
297 if (netif_carrier_ok(dev)) 302 if (netif_carrier_ok(dev))
298 netif_carrier_off(dev); /* no carrier until DCD goes up */ 303 netif_carrier_off(dev); /* no carrier until DCD goes up */
304#endif
299 305
300 return 0; 306 return 0;
301} 307}
diff --git a/drivers/net/wireless/hermes.c b/drivers/net/wireless/hermes.c
index 579480dad374..346c6febb033 100644
--- a/drivers/net/wireless/hermes.c
+++ b/drivers/net/wireless/hermes.c
@@ -398,7 +398,7 @@ static int hermes_bap_seek(hermes_t *hw, int bap, u16 id, u16 offset)
398 * 398 *
399 * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware 399 * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware
400 */ 400 */
401int hermes_bap_pread(hermes_t *hw, int bap, void *buf, unsigned len, 401int hermes_bap_pread(hermes_t *hw, int bap, void *buf, int len,
402 u16 id, u16 offset) 402 u16 id, u16 offset)
403{ 403{
404 int dreg = bap ? HERMES_DATA1 : HERMES_DATA0; 404 int dreg = bap ? HERMES_DATA1 : HERMES_DATA0;
@@ -424,7 +424,7 @@ int hermes_bap_pread(hermes_t *hw, int bap, void *buf, unsigned len,
424 * 424 *
425 * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware 425 * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware
426 */ 426 */
427int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, unsigned len, 427int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, int len,
428 u16 id, u16 offset) 428 u16 id, u16 offset)
429{ 429{
430 int dreg = bap ? HERMES_DATA1 : HERMES_DATA0; 430 int dreg = bap ? HERMES_DATA1 : HERMES_DATA0;
@@ -450,7 +450,7 @@ int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, unsigned len,
450 * 450 *
451 * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware 451 * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware
452 */ 452 */
453int hermes_bap_pwrite_pad(hermes_t *hw, int bap, const void *buf, unsigned data_len, unsigned len, 453int hermes_bap_pwrite_pad(hermes_t *hw, int bap, const void *buf, unsigned data_len, int len,
454 u16 id, u16 offset) 454 u16 id, u16 offset)
455{ 455{
456 int dreg = bap ? HERMES_DATA1 : HERMES_DATA0; 456 int dreg = bap ? HERMES_DATA1 : HERMES_DATA0;
diff --git a/drivers/net/wireless/hermes.h b/drivers/net/wireless/hermes.h
index a6bd472d75d4..7644f72a9f4e 100644
--- a/drivers/net/wireless/hermes.h
+++ b/drivers/net/wireless/hermes.h
@@ -372,12 +372,12 @@ int hermes_docmd_wait(hermes_t *hw, u16 cmd, u16 parm0,
372 struct hermes_response *resp); 372 struct hermes_response *resp);
373int hermes_allocate(hermes_t *hw, u16 size, u16 *fid); 373int hermes_allocate(hermes_t *hw, u16 size, u16 *fid);
374 374
375int hermes_bap_pread(hermes_t *hw, int bap, void *buf, unsigned len, 375int hermes_bap_pread(hermes_t *hw, int bap, void *buf, int len,
376 u16 id, u16 offset); 376 u16 id, u16 offset);
377int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, unsigned len, 377int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, int len,
378 u16 id, u16 offset); 378 u16 id, u16 offset);
379int hermes_bap_pwrite_pad(hermes_t *hw, int bap, const void *buf, 379int hermes_bap_pwrite_pad(hermes_t *hw, int bap, const void *buf,
380 unsigned data_len, unsigned len, u16 id, u16 offset); 380 unsigned data_len, int len, u16 id, u16 offset);
381int hermes_read_ltv(hermes_t *hw, int bap, u16 rid, unsigned buflen, 381int hermes_read_ltv(hermes_t *hw, int bap, u16 rid, unsigned buflen,
382 u16 *length, void *buf); 382 u16 *length, void *buf);
383int hermes_write_ltv(hermes_t *hw, int bap, u16 rid, 383int hermes_write_ltv(hermes_t *hw, int bap, u16 rid,
diff --git a/drivers/net/wireless/i82593.h b/drivers/net/wireless/i82593.h
index 33acb8add4d6..afac5c7a323d 100644
--- a/drivers/net/wireless/i82593.h
+++ b/drivers/net/wireless/i82593.h
@@ -7,11 +7,16 @@
7 * 7 *
8 * Copyright 1994, Anders Klemets <klemets@it.kth.se> 8 * Copyright 1994, Anders Klemets <klemets@it.kth.se>
9 * 9 *
10 * This software may be freely distributed for noncommercial purposes
11 * as long as this notice is retained.
12 *
13 * HISTORY 10 * HISTORY
14 * i82593.h,v 11 * i82593.h,v
12 * Revision 1.4 2005/11/4 09:15:00 baroniunas
13 * Modified copyright with permission of author as follows:
14 *
15 * "If I82539.H is the only file with my copyright statement
16 * that is included in the Source Forge project, then you have
17 * my approval to change the copyright statement to be a GPL
18 * license, in the way you proposed on October 10."
19 *
15 * Revision 1.1 1996/07/17 15:23:12 root 20 * Revision 1.1 1996/07/17 15:23:12 root
16 * Initial revision 21 * Initial revision
17 * 22 *
diff --git a/drivers/net/wireless/ipw2100.c b/drivers/net/wireless/ipw2100.c
index a2e6214169e9..77d2a21d4cd0 100644
--- a/drivers/net/wireless/ipw2100.c
+++ b/drivers/net/wireless/ipw2100.c
@@ -6344,7 +6344,8 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
6344 dev->ethtool_ops = &ipw2100_ethtool_ops; 6344 dev->ethtool_ops = &ipw2100_ethtool_ops;
6345 dev->tx_timeout = ipw2100_tx_timeout; 6345 dev->tx_timeout = ipw2100_tx_timeout;
6346 dev->wireless_handlers = &ipw2100_wx_handler_def; 6346 dev->wireless_handlers = &ipw2100_wx_handler_def;
6347 dev->get_wireless_stats = ipw2100_wx_wireless_stats; 6347 priv->wireless_data.ieee80211 = priv->ieee;
6348 dev->wireless_data = &priv->wireless_data;
6348 dev->set_mac_address = ipw2100_set_address; 6349 dev->set_mac_address = ipw2100_set_address;
6349 dev->watchdog_timeo = 3 * HZ; 6350 dev->watchdog_timeo = 3 * HZ;
6350 dev->irq = 0; 6351 dev->irq = 0;
@@ -7178,6 +7179,11 @@ static int ipw2100_wx_get_range(struct net_device *dev,
7178 } 7179 }
7179 range->num_frequency = val; 7180 range->num_frequency = val;
7180 7181
7182 /* Event capability (kernel + driver) */
7183 range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
7184 IW_EVENT_CAPA_MASK(SIOCGIWAP));
7185 range->event_capa[1] = IW_EVENT_CAPA_K_1;
7186
7181 IPW_DEBUG_WX("GET Range\n"); 7187 IPW_DEBUG_WX("GET Range\n");
7182 7188
7183 return 0; 7189 return 0;
@@ -8446,16 +8452,6 @@ static iw_handler ipw2100_private_handler[] = {
8446#endif /* CONFIG_IPW2100_MONITOR */ 8452#endif /* CONFIG_IPW2100_MONITOR */
8447}; 8453};
8448 8454
8449static struct iw_handler_def ipw2100_wx_handler_def = {
8450 .standard = ipw2100_wx_handlers,
8451 .num_standard = sizeof(ipw2100_wx_handlers) / sizeof(iw_handler),
8452 .num_private = sizeof(ipw2100_private_handler) / sizeof(iw_handler),
8453 .num_private_args = sizeof(ipw2100_private_args) /
8454 sizeof(struct iw_priv_args),
8455 .private = (iw_handler *) ipw2100_private_handler,
8456 .private_args = (struct iw_priv_args *)ipw2100_private_args,
8457};
8458
8459/* 8455/*
8460 * Get wireless statistics. 8456 * Get wireless statistics.
8461 * Called by /proc/net/wireless 8457 * Called by /proc/net/wireless
@@ -8597,6 +8593,17 @@ static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev)
8597 return (struct iw_statistics *)NULL; 8593 return (struct iw_statistics *)NULL;
8598} 8594}
8599 8595
8596static struct iw_handler_def ipw2100_wx_handler_def = {
8597 .standard = ipw2100_wx_handlers,
8598 .num_standard = sizeof(ipw2100_wx_handlers) / sizeof(iw_handler),
8599 .num_private = sizeof(ipw2100_private_handler) / sizeof(iw_handler),
8600 .num_private_args = sizeof(ipw2100_private_args) /
8601 sizeof(struct iw_priv_args),
8602 .private = (iw_handler *) ipw2100_private_handler,
8603 .private_args = (struct iw_priv_args *)ipw2100_private_args,
8604 .get_wireless_stats = ipw2100_wx_wireless_stats,
8605};
8606
8600static void ipw2100_wx_event_work(struct ipw2100_priv *priv) 8607static void ipw2100_wx_event_work(struct ipw2100_priv *priv)
8601{ 8608{
8602 union iwreq_data wrqu; 8609 union iwreq_data wrqu;
diff --git a/drivers/net/wireless/ipw2100.h b/drivers/net/wireless/ipw2100.h
index 140fdf2a0a09..7c65b10bb164 100644
--- a/drivers/net/wireless/ipw2100.h
+++ b/drivers/net/wireless/ipw2100.h
@@ -571,6 +571,8 @@ struct ipw2100_priv {
571 struct net_device *net_dev; 571 struct net_device *net_dev;
572 struct iw_statistics wstats; 572 struct iw_statistics wstats;
573 573
574 struct iw_public_data wireless_data;
575
574 struct tasklet_struct irq_tasklet; 576 struct tasklet_struct irq_tasklet;
575 577
576 struct workqueue_struct *workqueue; 578 struct workqueue_struct *workqueue;
diff --git a/drivers/net/wireless/prism54/isl_38xx.c b/drivers/net/wireless/prism54/isl_38xx.c
index 109a96d90007..23deee69974b 100644
--- a/drivers/net/wireless/prism54/isl_38xx.c
+++ b/drivers/net/wireless/prism54/isl_38xx.c
@@ -164,12 +164,12 @@ isl38xx_trigger_device(int asleep, void __iomem *device_base)
164 /* assert the Wakeup interrupt in the Device Interrupt Register */ 164 /* assert the Wakeup interrupt in the Device Interrupt Register */
165 isl38xx_w32_flush(device_base, ISL38XX_DEV_INT_WAKEUP, 165 isl38xx_w32_flush(device_base, ISL38XX_DEV_INT_WAKEUP,
166 ISL38XX_DEV_INT_REG); 166 ISL38XX_DEV_INT_REG);
167
168#if VERBOSE > SHOW_ERROR_MESSAGES
167 udelay(ISL38XX_WRITEIO_DELAY); 169 udelay(ISL38XX_WRITEIO_DELAY);
168 170
169 /* perform another read on the Device Status Register */ 171 /* perform another read on the Device Status Register */
170 reg = readl(device_base + ISL38XX_CTRL_STAT_REG); 172 reg = readl(device_base + ISL38XX_CTRL_STAT_REG);
171
172#if VERBOSE > SHOW_ERROR_MESSAGES
173 do_gettimeofday(&current_time); 173 do_gettimeofday(&current_time);
174 DEBUG(SHOW_TRACING, "%08li.%08li Device register read %08x\n", 174 DEBUG(SHOW_TRACING, "%08li.%08li Device register read %08x\n",
175 current_time.tv_sec, (long)current_time.tv_usec, reg); 175 current_time.tv_sec, (long)current_time.tv_usec, reg);
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
704static 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
703static struct hw_interrupt_type iosapic_interrupt_type = { 725static 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
714int iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev) 738int 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 147static void
145static void __devinit 148superio_init(struct pci_dev *pcidev)
146superio_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 280DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_LIO, superio_init);
278 281
279static void superio_disable_irq(unsigned int irq) 282static void superio_disable_irq(unsigned int irq)
280{ 283{
@@ -452,8 +455,10 @@ static void superio_fixup_pci(struct pci_dev *pdev)
452DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415, superio_fixup_pci); 455DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415, superio_fixup_pci);
453 456
454 457
455static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_id *id) 458static int __devinit
459superio_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
488static struct pci_device_id superio_tbl[] = { 494static 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
493static struct pci_driver superio_driver = { 501static 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
499static int __init superio_modinit(void) 507static 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
510module_init(superio_modinit); 517module_init(superio_modinit);
511module_exit(superio_exit); 518module_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
786static ide_driver_t idescsi_driver = { 786static 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 6dc2a612ccbd..edd0afa852eb 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
41enum { 42enum {
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
224struct sil24_cmd_block { 213struct 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
218struct sil24_atapi_block {
219 struct sil24_prb prb;
220 u8 cdb[16];
221 struct sil24_sge sge[LIBATA_MAX_PRD - 1];
222};
223
224union 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 */
235struct sil24_port_priv { 235struct 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
247static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev);
247static u8 sil24_check_status(struct ata_port *ap); 248static u8 sil24_check_status(struct ata_port *ap);
248static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg); 249static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg);
249static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val); 250static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val);
@@ -297,6 +298,8 @@ static struct scsi_host_template sil24_sht = {
297static const struct ata_port_operations sil24_ops = { 298static 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
370static 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
367static inline void sil24_update_tf(struct ata_port *ap) 380static 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
418static void sil24_phy_reset(struct ata_port *ap) 431static 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
477static 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
430static inline void sil24_fill_sg(struct ata_queued_cmd *qc, 495static 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
473static int sil24_qc_issue(struct ata_queued_cmd *qc) 561static 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
577static 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
595static 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
489static int __sil24_reset_controller(void __iomem *port) 602static 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
511static void sil24_reset_controller(struct ata_port *ap) 628static 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
595static inline void sil24_host_intr(struct ata_port *ap) 718static 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
508config SERIAL_MUX 508config 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/amba-pl011.c b/drivers/serial/amba-pl011.c
index 938d185841c9..89d7bd3eaee3 100644
--- a/drivers/serial/amba-pl011.c
+++ b/drivers/serial/amba-pl011.c
@@ -49,7 +49,6 @@
49#include <linux/serial.h> 49#include <linux/serial.h>
50 50
51#include <asm/io.h> 51#include <asm/io.h>
52#include <asm/irq.h>
53#include <asm/sizes.h> 52#include <asm/sizes.h>
54#include <asm/hardware/amba.h> 53#include <asm/hardware/amba.h>
55#include <asm/hardware/clock.h> 54#include <asm/hardware/clock.h>
@@ -63,7 +62,8 @@
63 62
64#define AMBA_ISR_PASS_LIMIT 256 63#define AMBA_ISR_PASS_LIMIT 256
65 64
66#define UART_DUMMY_RSR_RX 256 65#define UART_DR_ERROR (UART011_DR_OE|UART011_DR_BE|UART011_DR_PE|UART011_DR_FE)
66#define UART_DUMMY_DR_RX (1 << 16)
67 67
68/* 68/*
69 * We wrap our port structure around the generic uart_port. 69 * We wrap our port structure around the generic uart_port.
@@ -116,7 +116,7 @@ pl011_rx_chars(struct uart_amba_port *uap)
116#endif 116#endif
117{ 117{
118 struct tty_struct *tty = uap->port.info->tty; 118 struct tty_struct *tty = uap->port.info->tty;
119 unsigned int status, ch, flag, rsr, max_count = 256; 119 unsigned int status, ch, flag, max_count = 256;
120 120
121 status = readw(uap->port.membase + UART01x_FR); 121 status = readw(uap->port.membase + UART01x_FR);
122 while ((status & UART01x_FR_RXFE) == 0 && max_count--) { 122 while ((status & UART01x_FR_RXFE) == 0 && max_count--) {
@@ -129,7 +129,7 @@ pl011_rx_chars(struct uart_amba_port *uap)
129 */ 129 */
130 } 130 }
131 131
132 ch = readw(uap->port.membase + UART01x_DR); 132 ch = readw(uap->port.membase + UART01x_DR) | UART_DUMMY_DR_RX;
133 flag = TTY_NORMAL; 133 flag = TTY_NORMAL;
134 uap->port.icount.rx++; 134 uap->port.icount.rx++;
135 135
@@ -137,34 +137,33 @@ pl011_rx_chars(struct uart_amba_port *uap)
137 * Note that the error handling code is 137 * Note that the error handling code is
138 * out of the main execution path 138 * out of the main execution path
139 */ 139 */
140 rsr = readw(uap->port.membase + UART01x_RSR) | UART_DUMMY_RSR_RX; 140 if (unlikely(ch & UART_DR_ERROR)) {
141 if (unlikely(rsr & UART01x_RSR_ANY)) { 141 if (ch & UART011_DR_BE) {
142 if (rsr & UART01x_RSR_BE) { 142 ch &= ~(UART011_DR_FE | UART011_DR_PE);
143 rsr &= ~(UART01x_RSR_FE | UART01x_RSR_PE);
144 uap->port.icount.brk++; 143 uap->port.icount.brk++;
145 if (uart_handle_break(&uap->port)) 144 if (uart_handle_break(&uap->port))
146 goto ignore_char; 145 goto ignore_char;
147 } else if (rsr & UART01x_RSR_PE) 146 } else if (ch & UART011_DR_PE)
148 uap->port.icount.parity++; 147 uap->port.icount.parity++;
149 else if (rsr & UART01x_RSR_FE) 148 else if (ch & UART011_DR_FE)
150 uap->port.icount.frame++; 149 uap->port.icount.frame++;
151 if (rsr & UART01x_RSR_OE) 150 if (ch & UART011_DR_OE)
152 uap->port.icount.overrun++; 151 uap->port.icount.overrun++;
153 152
154 rsr &= uap->port.read_status_mask; 153 ch &= uap->port.read_status_mask;
155 154
156 if (rsr & UART01x_RSR_BE) 155 if (ch & UART011_DR_BE)
157 flag = TTY_BREAK; 156 flag = TTY_BREAK;
158 else if (rsr & UART01x_RSR_PE) 157 else if (ch & UART011_DR_PE)
159 flag = TTY_PARITY; 158 flag = TTY_PARITY;
160 else if (rsr & UART01x_RSR_FE) 159 else if (ch & UART011_DR_FE)
161 flag = TTY_FRAME; 160 flag = TTY_FRAME;
162 } 161 }
163 162
164 if (uart_handle_sysrq_char(&uap->port, ch, regs)) 163 if (uart_handle_sysrq_char(&uap->port, ch, regs))
165 goto ignore_char; 164 goto ignore_char;
166 165
167 uart_insert_char(&uap->port, rsr, UART01x_RSR_OE, ch, flag); 166 uart_insert_char(&uap->port, ch, UART011_DR_OE, ch, flag);
168 167
169 ignore_char: 168 ignore_char:
170 status = readw(uap->port.membase + UART01x_FR); 169 status = readw(uap->port.membase + UART01x_FR);
@@ -476,33 +475,33 @@ pl011_set_termios(struct uart_port *port, struct termios *termios,
476 */ 475 */
477 uart_update_timeout(port, termios->c_cflag, baud); 476 uart_update_timeout(port, termios->c_cflag, baud);
478 477
479 port->read_status_mask = UART01x_RSR_OE; 478 port->read_status_mask = UART011_DR_OE | 255;
480 if (termios->c_iflag & INPCK) 479 if (termios->c_iflag & INPCK)
481 port->read_status_mask |= UART01x_RSR_FE | UART01x_RSR_PE; 480 port->read_status_mask |= UART011_DR_FE | UART011_DR_PE;
482 if (termios->c_iflag & (BRKINT | PARMRK)) 481 if (termios->c_iflag & (BRKINT | PARMRK))
483 port->read_status_mask |= UART01x_RSR_BE; 482 port->read_status_mask |= UART011_DR_BE;
484 483
485 /* 484 /*
486 * Characters to ignore 485 * Characters to ignore
487 */ 486 */
488 port->ignore_status_mask = 0; 487 port->ignore_status_mask = 0;
489 if (termios->c_iflag & IGNPAR) 488 if (termios->c_iflag & IGNPAR)
490 port->ignore_status_mask |= UART01x_RSR_FE | UART01x_RSR_PE; 489 port->ignore_status_mask |= UART011_DR_FE | UART011_DR_PE;
491 if (termios->c_iflag & IGNBRK) { 490 if (termios->c_iflag & IGNBRK) {
492 port->ignore_status_mask |= UART01x_RSR_BE; 491 port->ignore_status_mask |= UART011_DR_BE;
493 /* 492 /*
494 * If we're ignoring parity and break indicators, 493 * If we're ignoring parity and break indicators,
495 * ignore overruns too (for real raw support). 494 * ignore overruns too (for real raw support).
496 */ 495 */
497 if (termios->c_iflag & IGNPAR) 496 if (termios->c_iflag & IGNPAR)
498 port->ignore_status_mask |= UART01x_RSR_OE; 497 port->ignore_status_mask |= UART011_DR_OE;
499 } 498 }
500 499
501 /* 500 /*
502 * Ignore all characters if CREAD is not set. 501 * Ignore all characters if CREAD is not set.
503 */ 502 */
504 if ((termios->c_cflag & CREAD) == 0) 503 if ((termios->c_cflag & CREAD) == 0)
505 port->ignore_status_mask |= UART_DUMMY_RSR_RX; 504 port->ignore_status_mask |= UART_DUMMY_DR_RX;
506 505
507 if (UART_ENABLE_MS(port, termios->c_cflag)) 506 if (UART_ENABLE_MS(port, termios->c_cflag))
508 pl011_enable_ms(port); 507 pl011_enable_ms(port);
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
66static struct timer_list mux_timer; 66static 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 */
80static unsigned int mux_tx_empty(struct uart_port *port) 80static 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/drivers/serial/sa1100.c b/drivers/serial/sa1100.c
index 0e3daf6d7b50..25a086458ab9 100644
--- a/drivers/serial/sa1100.c
+++ b/drivers/serial/sa1100.c
@@ -161,7 +161,6 @@ static void sa1100_stop_tx(struct uart_port *port)
161static void sa1100_start_tx(struct uart_port *port) 161static void sa1100_start_tx(struct uart_port *port)
162{ 162{
163 struct sa1100_port *sport = (struct sa1100_port *)port; 163 struct sa1100_port *sport = (struct sa1100_port *)port;
164 unsigned long flags;
165 u32 utcr3; 164 u32 utcr3;
166 165
167 utcr3 = UART_GET_UTCR3(sport); 166 utcr3 = UART_GET_UTCR3(sport);
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-arm/arch-ixp4xx/io.h b/include/asm-arm/arch-ixp4xx/io.h
index 688f7f90d93e..942b622455bc 100644
--- a/include/asm-arm/arch-ixp4xx/io.h
+++ b/include/asm-arm/arch-ixp4xx/io.h
@@ -59,11 +59,10 @@ extern int ixp4xx_pci_write(u32 addr, u32 cmd, u32 data);
59 * fallback to the default. 59 * fallback to the default.
60 */ 60 */
61static inline void __iomem * 61static inline void __iomem *
62__ixp4xx_ioremap(unsigned long addr, size_t size, unsigned long flags, unsigned long align) 62__ixp4xx_ioremap(unsigned long addr, size_t size, unsigned long flags)
63{ 63{
64 extern void __iomem * __ioremap(unsigned long, size_t, unsigned long, unsigned long);
65 if((addr < 0x48000000) || (addr > 0x4fffffff)) 64 if((addr < 0x48000000) || (addr > 0x4fffffff))
66 return __ioremap(addr, size, flags, align); 65 return __ioremap(addr, size, flags);
67 66
68 return (void *)addr; 67 return (void *)addr;
69} 68}
@@ -71,13 +70,11 @@ __ixp4xx_ioremap(unsigned long addr, size_t size, unsigned long flags, unsigned
71static inline void 70static inline void
72__ixp4xx_iounmap(void __iomem *addr) 71__ixp4xx_iounmap(void __iomem *addr)
73{ 72{
74 extern void __iounmap(void __iomem *addr);
75
76 if ((u32)addr >= VMALLOC_START) 73 if ((u32)addr >= VMALLOC_START)
77 __iounmap(addr); 74 __iounmap(addr);
78} 75}
79 76
80#define __arch_ioremap(a, s, f, x) __ixp4xx_ioremap(a, s, f, x) 77#define __arch_ioremap(a, s, f) __ixp4xx_ioremap(a, s, f)
81#define __arch_iounmap(a) __ixp4xx_iounmap(a) 78#define __arch_iounmap(a) __ixp4xx_iounmap(a)
82 79
83#define writeb(v, p) __ixp4xx_writeb(v, p) 80#define writeb(v, p) __ixp4xx_writeb(v, p)
diff --git a/include/asm-arm/hardware/amba_serial.h b/include/asm-arm/hardware/amba_serial.h
index 71770aa6389f..dc726ffccebd 100644
--- a/include/asm-arm/hardware/amba_serial.h
+++ b/include/asm-arm/hardware/amba_serial.h
@@ -50,6 +50,11 @@
50#define UART011_ICR 0x44 /* Interrupt clear register. */ 50#define UART011_ICR 0x44 /* Interrupt clear register. */
51#define UART011_DMACR 0x48 /* DMA control register. */ 51#define UART011_DMACR 0x48 /* DMA control register. */
52 52
53#define UART011_DR_OE (1 << 11)
54#define UART011_DR_BE (1 << 10)
55#define UART011_DR_PE (1 << 9)
56#define UART011_DR_FE (1 << 8)
57
53#define UART01x_RSR_OE 0x08 58#define UART01x_RSR_OE 0x08
54#define UART01x_RSR_BE 0x04 59#define UART01x_RSR_BE 0x04
55#define UART01x_RSR_PE 0x02 60#define UART01x_RSR_PE 0x02
diff --git a/include/asm-arm/io.h b/include/asm-arm/io.h
index 2e6799632f12..ae69db4a1010 100644
--- a/include/asm-arm/io.h
+++ b/include/asm-arm/io.h
@@ -55,6 +55,12 @@ extern void __raw_readsl(void __iomem *addr, void *data, int longlen);
55#define __raw_readl(a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a)) 55#define __raw_readl(a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a))
56 56
57/* 57/*
58 * Architecture ioremap implementation.
59 */
60extern void __iomem * __ioremap(unsigned long, size_t, unsigned long);
61extern void __iounmap(void __iomem *addr);
62
63/*
58 * Bad read/write accesses... 64 * Bad read/write accesses...
59 */ 65 */
60extern void __readwrite_bug(const char *fn); 66extern void __readwrite_bug(const char *fn);
@@ -256,18 +262,15 @@ out:
256 * ioremap takes a PCI memory address, as specified in 262 * ioremap takes a PCI memory address, as specified in
257 * Documentation/IO-mapping.txt. 263 * Documentation/IO-mapping.txt.
258 */ 264 */
259extern void __iomem * __ioremap(unsigned long, size_t, unsigned long, unsigned long);
260extern void __iounmap(void __iomem *addr);
261
262#ifndef __arch_ioremap 265#ifndef __arch_ioremap
263#define ioremap(cookie,size) __ioremap(cookie,size,0,1) 266#define ioremap(cookie,size) __ioremap(cookie,size,0)
264#define ioremap_nocache(cookie,size) __ioremap(cookie,size,0,1) 267#define ioremap_nocache(cookie,size) __ioremap(cookie,size,0)
265#define ioremap_cached(cookie,size) __ioremap(cookie,size,L_PTE_CACHEABLE,1) 268#define ioremap_cached(cookie,size) __ioremap(cookie,size,L_PTE_CACHEABLE)
266#define iounmap(cookie) __iounmap(cookie) 269#define iounmap(cookie) __iounmap(cookie)
267#else 270#else
268#define ioremap(cookie,size) __arch_ioremap((cookie),(size),0,1) 271#define ioremap(cookie,size) __arch_ioremap((cookie),(size),0)
269#define ioremap_nocache(cookie,size) __arch_ioremap((cookie),(size),0,1) 272#define ioremap_nocache(cookie,size) __arch_ioremap((cookie),(size),0)
270#define ioremap_cached(cookie,size) __arch_ioremap((cookie),(size),L_PTE_CACHEABLE,1) 273#define ioremap_cached(cookie,size) __arch_ioremap((cookie),(size),L_PTE_CACHEABLE)
271#define iounmap(cookie) __arch_iounmap(cookie) 274#define iounmap(cookie) __arch_iounmap(cookie)
272#endif 275#endif
273 276
diff --git a/include/asm-arm/uaccess.h b/include/asm-arm/uaccess.h
index a2fdad0138b3..064f0f5e8e2b 100644
--- a/include/asm-arm/uaccess.h
+++ b/include/asm-arm/uaccess.h
@@ -100,7 +100,6 @@ static inline void set_fs (mm_segment_t fs)
100extern int __get_user_1(void *); 100extern int __get_user_1(void *);
101extern int __get_user_2(void *); 101extern int __get_user_2(void *);
102extern int __get_user_4(void *); 102extern int __get_user_4(void *);
103extern int __get_user_8(void *);
104extern int __get_user_bad(void); 103extern int __get_user_bad(void);
105 104
106#define __get_user_x(__r2,__p,__e,__s,__i...) \ 105#define __get_user_x(__r2,__p,__e,__s,__i...) \
@@ -114,7 +113,7 @@ extern int __get_user_bad(void);
114#define get_user(x,p) \ 113#define get_user(x,p) \
115 ({ \ 114 ({ \
116 const register typeof(*(p)) __user *__p asm("r0") = (p);\ 115 const register typeof(*(p)) __user *__p asm("r0") = (p);\
117 register typeof(*(p)) __r2 asm("r2"); \ 116 register unsigned int __r2 asm("r2"); \
118 register int __e asm("r0"); \ 117 register int __e asm("r0"); \
119 switch (sizeof(*(__p))) { \ 118 switch (sizeof(*(__p))) { \
120 case 1: \ 119 case 1: \
@@ -126,12 +125,9 @@ extern int __get_user_bad(void);
126 case 4: \ 125 case 4: \
127 __get_user_x(__r2, __p, __e, 4, "lr"); \ 126 __get_user_x(__r2, __p, __e, 4, "lr"); \
128 break; \ 127 break; \
129 case 8: \
130 __get_user_x(__r2, __p, __e, 8, "lr"); \
131 break; \
132 default: __e = __get_user_bad(); break; \ 128 default: __e = __get_user_bad(); break; \
133 } \ 129 } \
134 x = __r2; \ 130 x = (typeof(*(p))) __r2; \
135 __e; \ 131 __e; \
136 }) 132 })
137 133
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);
49extern int txn_claim_irq(int); 50extern int txn_claim_irq(int);
50extern unsigned int txn_alloc_data(unsigned int); 51extern unsigned int txn_alloc_data(unsigned int);
51extern unsigned long txn_alloc_addr(unsigned int); 52extern unsigned long txn_alloc_addr(unsigned int);
53extern unsigned long txn_affinity_addr(unsigned int irq, int cpu);
52 54
53extern int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *, void *); 55extern int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *, void *);
54 56extern int cpu_check_affinity(unsigned int irq, cpumask_t *dest);
55extern 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) */
58extern struct tasklet_struct power_tasklet; 59extern 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
31extern void smp_send_reschedule(int cpu); 31extern void smp_send_reschedule(int cpu);
32extern 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
59static 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
18static inline void __raw_spin_lock(raw_spinlock_t *x) 18static 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
61static __inline__ void __raw_read_lock(raw_rwlock_t *rw) 68static __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
73static __inline__ void __raw_read_unlock(raw_rwlock_t *rw) 77static __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 */
17extern spinlock_t pa_tlb_lock; 19extern 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
30extern void flush_tlb_all(void); 24extern 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/asm-ppc/dma-mapping.h b/include/asm-powerpc/dma-mapping.h
index 6e9635114433..59a80163f75f 100644
--- a/include/asm-ppc/dma-mapping.h
+++ b/include/asm-powerpc/dma-mapping.h
@@ -1,15 +1,22 @@
1/* 1/*
2 * This is based on both include/asm-sh/dma-mapping.h and 2 * Copyright (C) 2004 IBM
3 * include/asm-ppc/pci.h 3 *
4 * Implements the generic device dma API for powerpc.
5 * the pci and vio busses
4 */ 6 */
5#ifndef __ASM_PPC_DMA_MAPPING_H 7#ifndef _ASM_DMA_MAPPING_H
6#define __ASM_PPC_DMA_MAPPING_H 8#define _ASM_DMA_MAPPING_H
7 9
8#include <linux/config.h> 10#include <linux/config.h>
11#include <linux/types.h>
12#include <linux/cache.h>
9/* need struct page definitions */ 13/* need struct page definitions */
10#include <linux/mm.h> 14#include <linux/mm.h>
11#include <asm/scatterlist.h> 15#include <asm/scatterlist.h>
12#include <asm/io.h> 16#include <asm/io.h>
17#include <asm/bug.h>
18
19#define DMA_ERROR_CODE (~(dma_addr_t)0x0)
13 20
14#ifdef CONFIG_NOT_COHERENT_CACHE 21#ifdef CONFIG_NOT_COHERENT_CACHE
15/* 22/*
@@ -24,22 +31,12 @@ extern void __dma_free_coherent(size_t size, void *vaddr);
24extern void __dma_sync(void *vaddr, size_t size, int direction); 31extern void __dma_sync(void *vaddr, size_t size, int direction);
25extern void __dma_sync_page(struct page *page, unsigned long offset, 32extern void __dma_sync_page(struct page *page, unsigned long offset,
26 size_t size, int direction); 33 size_t size, int direction);
27#define dma_cache_inv(_start,_size) \
28 invalidate_dcache_range(_start, (_start + _size))
29#define dma_cache_wback(_start,_size) \
30 clean_dcache_range(_start, (_start + _size))
31#define dma_cache_wback_inv(_start,_size) \
32 flush_dcache_range(_start, (_start + _size))
33 34
34#else /* ! CONFIG_NOT_COHERENT_CACHE */ 35#else /* ! CONFIG_NOT_COHERENT_CACHE */
35/* 36/*
36 * Cache coherent cores. 37 * Cache coherent cores.
37 */ 38 */
38 39
39#define dma_cache_inv(_start,_size) do { } while (0)
40#define dma_cache_wback(_start,_size) do { } while (0)
41#define dma_cache_wback_inv(_start,_size) do { } while (0)
42
43#define __dma_alloc_coherent(gfp, size, handle) NULL 40#define __dma_alloc_coherent(gfp, size, handle) NULL
44#define __dma_free_coherent(size, addr) do { } while (0) 41#define __dma_free_coherent(size, addr) do { } while (0)
45#define __dma_sync(addr, size, rw) do { } while (0) 42#define __dma_sync(addr, size, rw) do { } while (0)
@@ -47,6 +44,30 @@ extern void __dma_sync_page(struct page *page, unsigned long offset,
47 44
48#endif /* ! CONFIG_NOT_COHERENT_CACHE */ 45#endif /* ! CONFIG_NOT_COHERENT_CACHE */
49 46
47#ifdef CONFIG_PPC64
48
49extern int dma_supported(struct device *dev, u64 mask);
50extern int dma_set_mask(struct device *dev, u64 dma_mask);
51extern void *dma_alloc_coherent(struct device *dev, size_t size,
52 dma_addr_t *dma_handle, gfp_t flag);
53extern void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
54 dma_addr_t dma_handle);
55extern dma_addr_t dma_map_single(struct device *dev, void *cpu_addr,
56 size_t size, enum dma_data_direction direction);
57extern void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,
58 size_t size, enum dma_data_direction direction);
59extern dma_addr_t dma_map_page(struct device *dev, struct page *page,
60 unsigned long offset, size_t size,
61 enum dma_data_direction direction);
62extern void dma_unmap_page(struct device *dev, dma_addr_t dma_address,
63 size_t size, enum dma_data_direction direction);
64extern int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
65 enum dma_data_direction direction);
66extern void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
67 int nhwentries, enum dma_data_direction direction);
68
69#else /* CONFIG_PPC64 */
70
50#define dma_supported(dev, mask) (1) 71#define dma_supported(dev, mask) (1)
51 72
52static inline int dma_set_mask(struct device *dev, u64 dma_mask) 73static inline int dma_set_mask(struct device *dev, u64 dma_mask)
@@ -144,29 +165,27 @@ dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
144/* We don't do anything here. */ 165/* We don't do anything here. */
145#define dma_unmap_sg(dev, sg, nents, dir) do { } while (0) 166#define dma_unmap_sg(dev, sg, nents, dir) do { } while (0)
146 167
147static inline void 168#endif /* CONFIG_PPC64 */
148dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, 169
149 size_t size, 170static inline void dma_sync_single_for_cpu(struct device *dev,
150 enum dma_data_direction direction) 171 dma_addr_t dma_handle, size_t size,
172 enum dma_data_direction direction)
151{ 173{
152 BUG_ON(direction == DMA_NONE); 174 BUG_ON(direction == DMA_NONE);
153
154 __dma_sync(bus_to_virt(dma_handle), size, direction); 175 __dma_sync(bus_to_virt(dma_handle), size, direction);
155} 176}
156 177
157static inline void 178static inline void dma_sync_single_for_device(struct device *dev,
158dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, 179 dma_addr_t dma_handle, size_t size,
159 size_t size, 180 enum dma_data_direction direction)
160 enum dma_data_direction direction)
161{ 181{
162 BUG_ON(direction == DMA_NONE); 182 BUG_ON(direction == DMA_NONE);
163
164 __dma_sync(bus_to_virt(dma_handle), size, direction); 183 __dma_sync(bus_to_virt(dma_handle), size, direction);
165} 184}
166 185
167static inline void 186static inline void dma_sync_sg_for_cpu(struct device *dev,
168dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents, 187 struct scatterlist *sg, int nents,
169 enum dma_data_direction direction) 188 enum dma_data_direction direction)
170{ 189{
171 int i; 190 int i;
172 191
@@ -176,9 +195,9 @@ dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents,
176 __dma_sync_page(sg->page, sg->offset, sg->length, direction); 195 __dma_sync_page(sg->page, sg->offset, sg->length, direction);
177} 196}
178 197
179static inline void 198static inline void dma_sync_sg_for_device(struct device *dev,
180dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents, 199 struct scatterlist *sg, int nents,
181 enum dma_data_direction direction) 200 enum dma_data_direction direction)
182{ 201{
183 int i; 202 int i;
184 203
@@ -188,6 +207,15 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents,
188 __dma_sync_page(sg->page, sg->offset, sg->length, direction); 207 __dma_sync_page(sg->page, sg->offset, sg->length, direction);
189} 208}
190 209
210static inline int dma_mapping_error(dma_addr_t dma_addr)
211{
212#ifdef CONFIG_PPC64
213 return (dma_addr == DMA_ERROR_CODE);
214#else
215 return 0;
216#endif
217}
218
191#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) 219#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
192#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) 220#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
193#ifdef CONFIG_NOT_COHERENT_CACHE 221#ifdef CONFIG_NOT_COHERENT_CACHE
@@ -198,40 +226,60 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents,
198 226
199static inline int dma_get_cache_alignment(void) 227static inline int dma_get_cache_alignment(void)
200{ 228{
229#ifdef CONFIG_PPC64
230 /* no easy way to get cache size on all processors, so return
231 * the maximum possible, to be safe */
232 return (1 << L1_CACHE_SHIFT_MAX);
233#else
201 /* 234 /*
202 * Each processor family will define its own L1_CACHE_SHIFT, 235 * Each processor family will define its own L1_CACHE_SHIFT,
203 * L1_CACHE_BYTES wraps to this, so this is always safe. 236 * L1_CACHE_BYTES wraps to this, so this is always safe.
204 */ 237 */
205 return L1_CACHE_BYTES; 238 return L1_CACHE_BYTES;
239#endif
206} 240}
207 241
208static inline void 242static inline void dma_sync_single_range_for_cpu(struct device *dev,
209dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle, 243 dma_addr_t dma_handle, unsigned long offset, size_t size,
210 unsigned long offset, size_t size, 244 enum dma_data_direction direction)
211 enum dma_data_direction direction)
212{ 245{
213 /* just sync everything for now */ 246 /* just sync everything for now */
214 dma_sync_single_for_cpu(dev, dma_handle, offset + size, direction); 247 dma_sync_single_for_cpu(dev, dma_handle, offset + size, direction);
215} 248}
216 249
217static inline void 250static inline void dma_sync_single_range_for_device(struct device *dev,
218dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle, 251 dma_addr_t dma_handle, unsigned long offset, size_t size,
219 unsigned long offset, size_t size, 252 enum dma_data_direction direction)
220 enum dma_data_direction direction)
221{ 253{
222 /* just sync everything for now */ 254 /* just sync everything for now */
223 dma_sync_single_for_device(dev, dma_handle, offset + size, direction); 255 dma_sync_single_for_device(dev, dma_handle, offset + size, direction);
224} 256}
225 257
226static inline void dma_cache_sync(void *vaddr, size_t size, 258static inline void dma_cache_sync(void *vaddr, size_t size,
227 enum dma_data_direction direction) 259 enum dma_data_direction direction)
228{ 260{
261 BUG_ON(direction == DMA_NONE);
229 __dma_sync(vaddr, size, (int)direction); 262 __dma_sync(vaddr, size, (int)direction);
230} 263}
231 264
232static inline int dma_mapping_error(dma_addr_t dma_addr) 265/*
233{ 266 * DMA operations are abstracted for G5 vs. i/pSeries, PCI vs. VIO
234 return 0; 267 */
235} 268struct dma_mapping_ops {
236 269 void * (*alloc_coherent)(struct device *dev, size_t size,
237#endif /* __ASM_PPC_DMA_MAPPING_H */ 270 dma_addr_t *dma_handle, gfp_t flag);
271 void (*free_coherent)(struct device *dev, size_t size,
272 void *vaddr, dma_addr_t dma_handle);
273 dma_addr_t (*map_single)(struct device *dev, void *ptr,
274 size_t size, enum dma_data_direction direction);
275 void (*unmap_single)(struct device *dev, dma_addr_t dma_addr,
276 size_t size, enum dma_data_direction direction);
277 int (*map_sg)(struct device *dev, struct scatterlist *sg,
278 int nents, enum dma_data_direction direction);
279 void (*unmap_sg)(struct device *dev, struct scatterlist *sg,
280 int nents, enum dma_data_direction direction);
281 int (*dma_supported)(struct device *dev, u64 mask);
282 int (*dac_dma_supported)(struct device *dev, u64 mask);
283};
284
285#endif /* _ASM_DMA_MAPPING_H */
diff --git a/include/asm-ppc64/io.h b/include/asm-powerpc/io.h
index 77fc07c3c6bd..48938d84d055 100644
--- a/include/asm-ppc64/io.h
+++ b/include/asm-powerpc/io.h
@@ -1,5 +1,5 @@
1#ifndef _PPC64_IO_H 1#ifndef _ASM_POWERPC_IO_H
2#define _PPC64_IO_H 2#define _ASM_POWERPC_IO_H
3 3
4/* 4/*
5 * This program is free software; you can redistribute it and/or 5 * This program is free software; you can redistribute it and/or
@@ -8,7 +8,10 @@
8 * 2 of the License, or (at your option) any later version. 8 * 2 of the License, or (at your option) any later version.
9 */ 9 */
10 10
11#include <linux/config.h> 11#ifndef CONFIG_PPC64
12#include <asm-ppc/io.h>
13#else
14
12#include <linux/compiler.h> 15#include <linux/compiler.h>
13#include <asm/page.h> 16#include <asm/page.h>
14#include <asm/byteorder.h> 17#include <asm/byteorder.h>
@@ -455,4 +458,5 @@ extern int check_legacy_ioport(unsigned long base_port);
455 458
456#endif /* __KERNEL__ */ 459#endif /* __KERNEL__ */
457 460
458#endif /* _PPC64_IO_H */ 461#endif /* CONFIG_PPC64 */
462#endif /* _ASM_POWERPC_IO_H */
diff --git a/include/asm-ppc64/mmu.h b/include/asm-powerpc/mmu.h
index 1a7e0afa2dc6..c1b4bbabbe97 100644
--- a/include/asm-ppc64/mmu.h
+++ b/include/asm-powerpc/mmu.h
@@ -1,3 +1,10 @@
1#ifndef _ASM_POWERPC_MMU_H_
2#define _ASM_POWERPC_MMU_H_
3
4#ifndef CONFIG_PPC64
5#include <asm-ppc/mmu.h>
6#else
7
1/* 8/*
2 * PowerPC memory management structures 9 * PowerPC memory management structures
3 * 10 *
@@ -10,10 +17,6 @@
10 * 2 of the License, or (at your option) any later version. 17 * 2 of the License, or (at your option) any later version.
11 */ 18 */
12 19
13#ifndef _PPC64_MMU_H_
14#define _PPC64_MMU_H_
15
16#include <linux/config.h>
17#include <asm/asm-compat.h> 20#include <asm/asm-compat.h>
18#include <asm/page.h> 21#include <asm/page.h>
19 22
@@ -392,4 +395,5 @@ static inline unsigned long get_vsid(unsigned long context, unsigned long ea)
392 395
393#endif /* __ASSEMBLY */ 396#endif /* __ASSEMBLY */
394 397
395#endif /* _PPC64_MMU_H_ */ 398#endif /* CONFIG_PPC64 */
399#endif /* _ASM_POWERPC_MMU_H_ */
diff --git a/include/asm-ppc64/mmu_context.h b/include/asm-powerpc/mmu_context.h
index 4f512e9fa6b8..ea6798c7d5fc 100644
--- a/include/asm-ppc64/mmu_context.h
+++ b/include/asm-powerpc/mmu_context.h
@@ -1,7 +1,10 @@
1#ifndef __PPC64_MMU_CONTEXT_H 1#ifndef __ASM_POWERPC_MMU_CONTEXT_H
2#define __PPC64_MMU_CONTEXT_H 2#define __ASM_POWERPC_MMU_CONTEXT_H
3
4#ifndef CONFIG_PPC64
5#include <asm-ppc/mmu_context.h>
6#else
3 7
4#include <linux/config.h>
5#include <linux/kernel.h> 8#include <linux/kernel.h>
6#include <linux/mm.h> 9#include <linux/mm.h>
7#include <asm/mmu.h> 10#include <asm/mmu.h>
@@ -82,4 +85,5 @@ static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next)
82 local_irq_restore(flags); 85 local_irq_restore(flags);
83} 86}
84 87
85#endif /* __PPC64_MMU_CONTEXT_H */ 88#endif /* CONFIG_PPC64 */
89#endif /* __ASM_POWERPC_MMU_CONTEXT_H */
diff --git a/include/asm-ppc64/mmzone.h b/include/asm-powerpc/mmzone.h
index 54958d6cae04..54958d6cae04 100644
--- a/include/asm-ppc64/mmzone.h
+++ b/include/asm-powerpc/mmzone.h
diff --git a/include/asm-ppc64/pci-bridge.h b/include/asm-powerpc/pci-bridge.h
index cf04327a597a..223ec7bd81da 100644
--- a/include/asm-ppc64/pci-bridge.h
+++ b/include/asm-powerpc/pci-bridge.h
@@ -1,8 +1,10 @@
1#ifdef __KERNEL__ 1#ifndef _ASM_POWERPC_PCI_BRIDGE_H
2#ifndef _ASM_PCI_BRIDGE_H 2#define _ASM_POWERPC_PCI_BRIDGE_H
3#define _ASM_PCI_BRIDGE_H 3
4#ifndef CONFIG_PPC64
5#include <asm-ppc/pci-bridge.h>
6#else
4 7
5#include <linux/config.h>
6#include <linux/pci.h> 8#include <linux/pci.h>
7#include <linux/list.h> 9#include <linux/list.h>
8 10
@@ -147,5 +149,5 @@ extern void pcibios_free_controller(struct pci_controller *phb);
147#define PCI_PROBE_NORMAL 0 /* Do normal PCI probing */ 149#define PCI_PROBE_NORMAL 0 /* Do normal PCI probing */
148#define PCI_PROBE_DEVTREE 1 /* Instantiate from device tree */ 150#define PCI_PROBE_DEVTREE 1 /* Instantiate from device tree */
149 151
152#endif /* CONFIG_PPC64 */
150#endif 153#endif
151#endif /* __KERNEL__ */
diff --git a/include/asm-ppc64/pci.h b/include/asm-powerpc/pci.h
index fafdf885a3cc..d5934a076bd0 100644
--- a/include/asm-ppc64/pci.h
+++ b/include/asm-powerpc/pci.h
@@ -1,5 +1,5 @@
1#ifndef __PPC64_PCI_H 1#ifndef __ASM_POWERPC_PCI_H
2#define __PPC64_PCI_H 2#define __ASM_POWERPC_PCI_H
3#ifdef __KERNEL__ 3#ifdef __KERNEL__
4 4
5/* 5/*
@@ -18,6 +18,7 @@
18#include <asm/scatterlist.h> 18#include <asm/scatterlist.h>
19#include <asm/io.h> 19#include <asm/io.h>
20#include <asm/prom.h> 20#include <asm/prom.h>
21#include <asm/pci-bridge.h>
21 22
22#include <asm-generic/pci-dma-compat.h> 23#include <asm-generic/pci-dma-compat.h>
23 24
@@ -26,11 +27,21 @@
26 27
27struct pci_dev; 28struct pci_dev;
28 29
29#ifdef CONFIG_PPC_ISERIES 30/* Values for the `which' argument to sys_pciconfig_iobase syscall. */
31#define IOBASE_BRIDGE_NUMBER 0
32#define IOBASE_MEMORY 1
33#define IOBASE_IO 2
34#define IOBASE_ISA_IO 3
35#define IOBASE_ISA_MEM 4
36
37/*
38 * Set this to 1 if you want the kernel to re-assign all PCI
39 * bus numbers
40 */
41extern int pci_assign_all_buses;
42#define pcibios_assign_all_busses() (pci_assign_all_buses)
43
30#define pcibios_scan_all_fns(a, b) 0 44#define pcibios_scan_all_fns(a, b) 0
31#else
32extern int pcibios_scan_all_fns(struct pci_bus *bus, int devfn);
33#endif
34 45
35static inline void pcibios_set_master(struct pci_dev *dev) 46static inline void pcibios_set_master(struct pci_dev *dev)
36{ 47{
@@ -50,6 +61,7 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
50 return channel ? 15 : 14; 61 return channel ? 15 : 14;
51} 62}
52 63
64#ifdef CONFIG_PPC64
53#define HAVE_ARCH_PCI_MWI 1 65#define HAVE_ARCH_PCI_MWI 1
54static inline int pcibios_prep_mwi(struct pci_dev *dev) 66static inline int pcibios_prep_mwi(struct pci_dev *dev)
55{ 67{
@@ -64,12 +76,10 @@ static inline int pcibios_prep_mwi(struct pci_dev *dev)
64 return 0; 76 return 0;
65} 77}
66 78
67extern unsigned int pcibios_assign_all_busses(void);
68
69extern struct dma_mapping_ops pci_dma_ops; 79extern struct dma_mapping_ops pci_dma_ops;
70 80
71/* For DAC DMA, we currently don't support it by default, but 81/* For DAC DMA, we currently don't support it by default, but
72 * we let the platform override this 82 * we let 64-bit platforms override this.
73 */ 83 */
74static inline int pci_dac_dma_supported(struct pci_dev *hwdev,u64 mask) 84static inline int pci_dac_dma_supported(struct pci_dev *hwdev,u64 mask)
75{ 85{
@@ -102,6 +112,35 @@ extern int pci_domain_nr(struct pci_bus *bus);
102/* Decide whether to display the domain number in /proc */ 112/* Decide whether to display the domain number in /proc */
103extern int pci_proc_domain(struct pci_bus *bus); 113extern int pci_proc_domain(struct pci_bus *bus);
104 114
115#else /* 32-bit */
116
117#ifdef CONFIG_PCI
118static inline void pci_dma_burst_advice(struct pci_dev *pdev,
119 enum pci_dma_burst_strategy *strat,
120 unsigned long *strategy_parameter)
121{
122 *strat = PCI_DMA_BURST_INFINITY;
123 *strategy_parameter = ~0UL;
124}
125#endif
126
127/*
128 * At present there are very few 32-bit PPC machines that can have
129 * memory above the 4GB point, and we don't support that.
130 */
131#define pci_dac_dma_supported(pci_dev, mask) (0)
132
133/* Return the index of the PCI controller for device PDEV. */
134#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index
135
136/* Set the name of the bus as it appears in /proc/bus/pci */
137static inline int pci_proc_domain(struct pci_bus *bus)
138{
139 return 0;
140}
141
142#endif /* CONFIG_PPC64 */
143
105struct vm_area_struct; 144struct vm_area_struct;
106/* Map a range of PCI memory or I/O space for a device into user space */ 145/* Map a range of PCI memory or I/O space for a device into user space */
107int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma, 146int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,
@@ -110,6 +149,7 @@ int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,
110/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */ 149/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */
111#define HAVE_PCI_MMAP 1 150#define HAVE_PCI_MMAP 1
112 151
152#ifdef CONFIG_PPC64
113/* pci_unmap_{single,page} is not a nop, thus... */ 153/* pci_unmap_{single,page} is not a nop, thus... */
114#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ 154#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \
115 dma_addr_t ADDR_NAME; 155 dma_addr_t ADDR_NAME;
@@ -124,22 +164,40 @@ int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,
124#define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ 164#define pci_unmap_len_set(PTR, LEN_NAME, VAL) \
125 (((PTR)->LEN_NAME) = (VAL)) 165 (((PTR)->LEN_NAME) = (VAL))
126 166
127/* The PCI address space does equal the physical memory 167/* The PCI address space does not equal the physical memory address
128 * address space. The networking and block device layers use 168 * space (we have an IOMMU). The IDE and SCSI device layers use
129 * this boolean for bounce buffer decisions. 169 * this boolean for bounce buffer decisions.
130 */ 170 */
131#define PCI_DMA_BUS_IS_PHYS (0) 171#define PCI_DMA_BUS_IS_PHYS (0)
172
173#else /* 32-bit */
174
175/* The PCI address space does equal the physical memory
176 * address space (no IOMMU). The IDE and SCSI device layers use
177 * this boolean for bounce buffer decisions.
178 */
179#define PCI_DMA_BUS_IS_PHYS (1)
180
181/* pci_unmap_{page,single} is a nop so... */
182#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
183#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
184#define pci_unmap_addr(PTR, ADDR_NAME) (0)
185#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0)
186#define pci_unmap_len(PTR, LEN_NAME) (0)
187#define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0)
188
189#endif /* CONFIG_PPC64 */
132 190
133extern void 191extern void pcibios_resource_to_bus(struct pci_dev *dev,
134pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, 192 struct pci_bus_region *region,
135 struct resource *res); 193 struct resource *res);
136 194
137extern void 195extern void pcibios_bus_to_resource(struct pci_dev *dev,
138pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, 196 struct resource *res,
139 struct pci_bus_region *region); 197 struct pci_bus_region *region);
140 198
141static inline struct resource * 199static inline struct resource *pcibios_select_root(struct pci_dev *pdev,
142pcibios_select_root(struct pci_dev *pdev, struct resource *res) 200 struct resource *res)
143{ 201{
144 struct resource *root = NULL; 202 struct resource *root = NULL;
145 203
@@ -151,14 +209,12 @@ pcibios_select_root(struct pci_dev *pdev, struct resource *res)
151 return root; 209 return root;
152} 210}
153 211
154extern int 212extern int unmap_bus_range(struct pci_bus *bus);
155unmap_bus_range(struct pci_bus *bus);
156 213
157extern int 214extern int remap_bus_range(struct pci_bus *bus);
158remap_bus_range(struct pci_bus *bus);
159 215
160extern void 216extern void pcibios_fixup_device_resources(struct pci_dev *dev,
161pcibios_fixup_device_resources(struct pci_dev *dev, struct pci_bus *bus); 217 struct pci_bus *bus);
162 218
163extern struct pci_controller *init_phb_dynamic(struct device_node *dn); 219extern struct pci_controller *init_phb_dynamic(struct device_node *dn);
164 220
@@ -180,14 +236,12 @@ extern pgprot_t pci_phys_mem_access_prot(struct file *file,
180 unsigned long size, 236 unsigned long size,
181 pgprot_t prot); 237 pgprot_t prot);
182 238
183#ifdef CONFIG_PPC_MULTIPLATFORM 239#if defined(CONFIG_PPC_MULTIPLATFORM) || defined(CONFIG_PPC32)
184#define HAVE_ARCH_PCI_RESOURCE_TO_USER 240#define HAVE_ARCH_PCI_RESOURCE_TO_USER
185extern void pci_resource_to_user(const struct pci_dev *dev, int bar, 241extern void pci_resource_to_user(const struct pci_dev *dev, int bar,
186 const struct resource *rsrc, 242 const struct resource *rsrc,
187 u64 *start, u64 *end); 243 u64 *start, u64 *end);
188#endif /* CONFIG_PPC_MULTIPLATFORM */ 244#endif /* CONFIG_PPC_MULTIPLATFORM || CONFIG_PPC32 */
189
190 245
191#endif /* __KERNEL__ */ 246#endif /* __KERNEL__ */
192 247#endif /* __ASM_POWERPC_PCI_H */
193#endif /* __PPC64_PCI_H */
diff --git a/include/asm-ppc64/pgalloc.h b/include/asm-powerpc/pgalloc.h
index dcf3622d1946..bfc2113b3630 100644
--- a/include/asm-ppc64/pgalloc.h
+++ b/include/asm-powerpc/pgalloc.h
@@ -1,5 +1,9 @@
1#ifndef _PPC64_PGALLOC_H 1#ifndef _ASM_POWERPC_PGALLOC_H
2#define _PPC64_PGALLOC_H 2#define _ASM_POWERPC_PGALLOC_H
3
4#ifndef CONFIG_PPC64
5#include <asm-ppc/pgalloc.h>
6#else
3 7
4#include <linux/mm.h> 8#include <linux/mm.h>
5#include <linux/slab.h> 9#include <linux/slab.h>
@@ -148,4 +152,5 @@ extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf);
148 152
149#define check_pgt_cache() do { } while (0) 153#define check_pgt_cache() do { } while (0)
150 154
151#endif /* _PPC64_PGALLOC_H */ 155#endif /* CONFIG_PPC64 */
156#endif /* _ASM_POWERPC_PGALLOC_H */
diff --git a/include/asm-ppc64/pgtable-4k.h b/include/asm-powerpc/pgtable-4k.h
index e9590c06ad92..e9590c06ad92 100644
--- a/include/asm-ppc64/pgtable-4k.h
+++ b/include/asm-powerpc/pgtable-4k.h
diff --git a/include/asm-ppc64/pgtable-64k.h b/include/asm-powerpc/pgtable-64k.h
index 154f1840ece4..154f1840ece4 100644
--- a/include/asm-ppc64/pgtable-64k.h
+++ b/include/asm-powerpc/pgtable-64k.h
diff --git a/include/asm-ppc64/pgtable.h b/include/asm-powerpc/pgtable.h
index a9783ba7fe98..0303f57366c1 100644
--- a/include/asm-ppc64/pgtable.h
+++ b/include/asm-powerpc/pgtable.h
@@ -1,5 +1,9 @@
1#ifndef _PPC64_PGTABLE_H 1#ifndef _ASM_POWERPC_PGTABLE_H
2#define _PPC64_PGTABLE_H 2#define _ASM_POWERPC_PGTABLE_H
3
4#ifndef CONFIG_PPC64
5#include <asm-ppc/pgtable.h>
6#else
3 7
4/* 8/*
5 * This file contains the functions and defines necessary to modify and use 9 * This file contains the functions and defines necessary to modify and use
@@ -47,6 +51,13 @@ struct mm_struct;
47#define VMALLOC_END (VMALLOC_START + VMALLOC_SIZE) 51#define VMALLOC_END (VMALLOC_START + VMALLOC_SIZE)
48 52
49/* 53/*
54 * Define the address range of the imalloc VM area.
55 */
56#define PHBS_IO_BASE VMALLOC_END
57#define IMALLOC_BASE (PHBS_IO_BASE + 0x80000000ul) /* Reserve 2 gigs for PHBs */
58#define IMALLOC_END (VMALLOC_START + PGTABLE_RANGE)
59
60/*
50 * Common bits in a linux-style PTE. These match the bits in the 61 * Common bits in a linux-style PTE. These match the bits in the
51 * (hardware-defined) PowerPC PTE as closely as possible. Additional 62 * (hardware-defined) PowerPC PTE as closely as possible. Additional
52 * bits may be defined in pgtable-*.h 63 * bits may be defined in pgtable-*.h
@@ -69,7 +80,7 @@ struct mm_struct;
69 80
70#define _PAGE_WRENABLE (_PAGE_RW | _PAGE_DIRTY) 81#define _PAGE_WRENABLE (_PAGE_RW | _PAGE_DIRTY)
71 82
72/* __pgprot defined in asm-ppc64/page.h */ 83/* __pgprot defined in asm-powerpc/page.h */
73#define PAGE_NONE __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED) 84#define PAGE_NONE __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED)
74 85
75#define PAGE_SHARED __pgprot(_PAGE_BASE | _PAGE_RW | _PAGE_USER) 86#define PAGE_SHARED __pgprot(_PAGE_BASE | _PAGE_RW | _PAGE_USER)
@@ -509,4 +520,5 @@ void pgtable_cache_init(void);
509 520
510#endif /* __ASSEMBLY__ */ 521#endif /* __ASSEMBLY__ */
511 522
512#endif /* _PPC64_PGTABLE_H */ 523#endif /* CONFIG_PPC64 */
524#endif /* _ASM_POWERPC_PGTABLE_H */
diff --git a/include/asm-powerpc/ppc-pci.h b/include/asm-powerpc/ppc-pci.h
index 2e36e5a7f4f3..36cdc869e580 100644
--- a/include/asm-powerpc/ppc-pci.h
+++ b/include/asm-powerpc/ppc-pci.h
@@ -48,8 +48,6 @@ extern void pSeries_final_fixup(void);
48extern void pSeries_irq_bus_setup(struct pci_bus *bus); 48extern void pSeries_irq_bus_setup(struct pci_bus *bus);
49 49
50extern unsigned long pci_probe_only; 50extern unsigned long pci_probe_only;
51extern unsigned long pci_assign_all_buses;
52extern int pci_read_irq_line(struct pci_dev *pci_dev);
53 51
54/* ---- EEH internal-use-only related routines ---- */ 52/* ---- EEH internal-use-only related routines ---- */
55#ifdef CONFIG_EEH 53#ifdef CONFIG_EEH
diff --git a/include/asm-ppc64/spinlock.h b/include/asm-powerpc/spinlock.h
index 7d84fb5e39f1..caa4b14e0e94 100644
--- a/include/asm-ppc64/spinlock.h
+++ b/include/asm-powerpc/spinlock.h
@@ -18,31 +18,41 @@
18 * 18 *
19 * (the type definitions are in asm/spinlock_types.h) 19 * (the type definitions are in asm/spinlock_types.h)
20 */ 20 */
21#include <linux/config.h> 21#ifdef CONFIG_PPC64
22#include <asm/paca.h> 22#include <asm/paca.h>
23#include <asm/hvcall.h> 23#include <asm/hvcall.h>
24#include <asm/iseries/hv_call.h> 24#include <asm/iseries/hv_call.h>
25#endif
26#include <asm/asm-compat.h>
27#include <asm/synch.h>
25 28
26#define __raw_spin_is_locked(x) ((x)->slock != 0) 29#define __raw_spin_is_locked(x) ((x)->slock != 0)
27 30
31#ifdef CONFIG_PPC64
32/* use 0x800000yy when locked, where yy == CPU number */
33#define LOCK_TOKEN (*(u32 *)(&get_paca()->lock_token))
34#else
35#define LOCK_TOKEN 1
36#endif
37
28/* 38/*
29 * This returns the old value in the lock, so we succeeded 39 * This returns the old value in the lock, so we succeeded
30 * in getting the lock if the return value is 0. 40 * in getting the lock if the return value is 0.
31 */ 41 */
32static __inline__ unsigned long __spin_trylock(raw_spinlock_t *lock) 42static __inline__ unsigned long __spin_trylock(raw_spinlock_t *lock)
33{ 43{
34 unsigned long tmp, tmp2; 44 unsigned long tmp, token;
35 45
46 token = LOCK_TOKEN;
36 __asm__ __volatile__( 47 __asm__ __volatile__(
37" lwz %1,%3(13) # __spin_trylock\n\ 48"1: lwarx %0,0,%2 # __spin_trylock\n\
381: lwarx %0,0,%2\n\
39 cmpwi 0,%0,0\n\ 49 cmpwi 0,%0,0\n\
40 bne- 2f\n\ 50 bne- 2f\n\
41 stwcx. %1,0,%2\n\ 51 stwcx. %1,0,%2\n\
42 bne- 1b\n\ 52 bne- 1b\n\
43 isync\n\ 53 isync\n\
442:" : "=&r" (tmp), "=&r" (tmp2) 542:" : "=&r" (tmp)
45 : "r" (&lock->slock), "i" (offsetof(struct paca_struct, lock_token)) 55 : "r" (token), "r" (&lock->slock)
46 : "cr0", "memory"); 56 : "cr0", "memory");
47 57
48 return tmp; 58 return tmp;
@@ -113,11 +123,17 @@ static void __inline__ __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long
113 123
114static __inline__ void __raw_spin_unlock(raw_spinlock_t *lock) 124static __inline__ void __raw_spin_unlock(raw_spinlock_t *lock)
115{ 125{
116 __asm__ __volatile__("lwsync # __raw_spin_unlock": : :"memory"); 126 __asm__ __volatile__(SYNC_ON_SMP" # __raw_spin_unlock"
127 : : :"memory");
117 lock->slock = 0; 128 lock->slock = 0;
118} 129}
119 130
131#ifdef CONFIG_PPC64
120extern void __raw_spin_unlock_wait(raw_spinlock_t *lock); 132extern void __raw_spin_unlock_wait(raw_spinlock_t *lock);
133#else
134#define __raw_spin_unlock_wait(lock) \
135 do { while (__raw_spin_is_locked(lock)) cpu_relax(); } while (0)
136#endif
121 137
122/* 138/*
123 * Read-write spinlocks, allowing multiple readers 139 * Read-write spinlocks, allowing multiple readers
@@ -133,6 +149,14 @@ extern void __raw_spin_unlock_wait(raw_spinlock_t *lock);
133#define __raw_read_can_lock(rw) ((rw)->lock >= 0) 149#define __raw_read_can_lock(rw) ((rw)->lock >= 0)
134#define __raw_write_can_lock(rw) (!(rw)->lock) 150#define __raw_write_can_lock(rw) (!(rw)->lock)
135 151
152#ifdef CONFIG_PPC64
153#define __DO_SIGN_EXTEND "extsw %0,%0\n"
154#define WRLOCK_TOKEN LOCK_TOKEN /* it's negative */
155#else
156#define __DO_SIGN_EXTEND
157#define WRLOCK_TOKEN (-1)
158#endif
159
136/* 160/*
137 * This returns the old value in the lock + 1, 161 * This returns the old value in the lock + 1,
138 * so we got a read lock if the return value is > 0. 162 * so we got a read lock if the return value is > 0.
@@ -142,11 +166,12 @@ static long __inline__ __read_trylock(raw_rwlock_t *rw)
142 long tmp; 166 long tmp;
143 167
144 __asm__ __volatile__( 168 __asm__ __volatile__(
145"1: lwarx %0,0,%1 # read_trylock\n\ 169"1: lwarx %0,0,%1 # read_trylock\n"
146 extsw %0,%0\n\ 170 __DO_SIGN_EXTEND
147 addic. %0,%0,1\n\ 171" addic. %0,%0,1\n\
148 ble- 2f\n\ 172 ble- 2f\n"
149 stwcx. %0,0,%1\n\ 173 PPC405_ERR77(0,%1)
174" stwcx. %0,0,%1\n\
150 bne- 1b\n\ 175 bne- 1b\n\
151 isync\n\ 176 isync\n\
1522:" : "=&r" (tmp) 1772:" : "=&r" (tmp)
@@ -162,18 +187,19 @@ static long __inline__ __read_trylock(raw_rwlock_t *rw)
162 */ 187 */
163static __inline__ long __write_trylock(raw_rwlock_t *rw) 188static __inline__ long __write_trylock(raw_rwlock_t *rw)
164{ 189{
165 long tmp, tmp2; 190 long tmp, token;
166 191
192 token = WRLOCK_TOKEN;
167 __asm__ __volatile__( 193 __asm__ __volatile__(
168" lwz %1,%3(13) # write_trylock\n\ 194"1: lwarx %0,0,%2 # write_trylock\n\
1691: lwarx %0,0,%2\n\
170 cmpwi 0,%0,0\n\ 195 cmpwi 0,%0,0\n\
171 bne- 2f\n\ 196 bne- 2f\n"
172 stwcx. %1,0,%2\n\ 197 PPC405_ERR77(0,%1)
198" stwcx. %1,0,%2\n\
173 bne- 1b\n\ 199 bne- 1b\n\
174 isync\n\ 200 isync\n\
1752:" : "=&r" (tmp), "=&r" (tmp2) 2012:" : "=&r" (tmp)
176 : "r" (&rw->lock), "i" (offsetof(struct paca_struct, lock_token)) 202 : "r" (token), "r" (&rw->lock)
177 : "cr0", "memory"); 203 : "cr0", "memory");
178 204
179 return tmp; 205 return tmp;
@@ -224,8 +250,9 @@ static void __inline__ __raw_read_unlock(raw_rwlock_t *rw)
224 __asm__ __volatile__( 250 __asm__ __volatile__(
225 "eieio # read_unlock\n\ 251 "eieio # read_unlock\n\
2261: lwarx %0,0,%1\n\ 2521: lwarx %0,0,%1\n\
227 addic %0,%0,-1\n\ 253 addic %0,%0,-1\n"
228 stwcx. %0,0,%1\n\ 254 PPC405_ERR77(0,%1)
255" stwcx. %0,0,%1\n\
229 bne- 1b" 256 bne- 1b"
230 : "=&r"(tmp) 257 : "=&r"(tmp)
231 : "r"(&rw->lock) 258 : "r"(&rw->lock)
@@ -234,7 +261,8 @@ static void __inline__ __raw_read_unlock(raw_rwlock_t *rw)
234 261
235static __inline__ void __raw_write_unlock(raw_rwlock_t *rw) 262static __inline__ void __raw_write_unlock(raw_rwlock_t *rw)
236{ 263{
237 __asm__ __volatile__("lwsync # write_unlock": : :"memory"); 264 __asm__ __volatile__(SYNC_ON_SMP" # write_unlock"
265 : : :"memory");
238 rw->lock = 0; 266 rw->lock = 0;
239} 267}
240 268
diff --git a/include/asm-ppc/io.h b/include/asm-ppc/io.h
index 2bfdf9c98459..84ac6e258eef 100644
--- a/include/asm-ppc/io.h
+++ b/include/asm-ppc/io.h
@@ -545,6 +545,23 @@ extern void pci_iounmap(struct pci_dev *dev, void __iomem *);
545#include <asm/mpc8260_pci9.h> 545#include <asm/mpc8260_pci9.h>
546#endif 546#endif
547 547
548#ifdef CONFIG_NOT_COHERENT_CACHE
549
550#define dma_cache_inv(_start,_size) \
551 invalidate_dcache_range(_start, (_start + _size))
552#define dma_cache_wback(_start,_size) \
553 clean_dcache_range(_start, (_start + _size))
554#define dma_cache_wback_inv(_start,_size) \
555 flush_dcache_range(_start, (_start + _size))
556
557#else
558
559#define dma_cache_inv(_start,_size) do { } while (0)
560#define dma_cache_wback(_start,_size) do { } while (0)
561#define dma_cache_wback_inv(_start,_size) do { } while (0)
562
563#endif
564
548/* 565/*
549 * Convert a physical pointer to a virtual kernel pointer for /dev/mem 566 * Convert a physical pointer to a virtual kernel pointer for /dev/mem
550 * access 567 * access
diff --git a/include/asm-ppc64/dma-mapping.h b/include/asm-ppc64/dma-mapping.h
deleted file mode 100644
index fb68fa23bea8..000000000000
--- a/include/asm-ppc64/dma-mapping.h
+++ /dev/null
@@ -1,136 +0,0 @@
1/* Copyright (C) 2004 IBM
2 *
3 * Implements the generic device dma API for ppc64. Handles
4 * the pci and vio busses
5 */
6
7#ifndef _ASM_DMA_MAPPING_H
8#define _ASM_DMA_MAPPING_H
9
10#include <linux/types.h>
11#include <linux/cache.h>
12/* need struct page definitions */
13#include <linux/mm.h>
14#include <asm/scatterlist.h>
15#include <asm/bug.h>
16
17#define DMA_ERROR_CODE (~(dma_addr_t)0x0)
18
19extern int dma_supported(struct device *dev, u64 mask);
20extern int dma_set_mask(struct device *dev, u64 dma_mask);
21extern void *dma_alloc_coherent(struct device *dev, size_t size,
22 dma_addr_t *dma_handle, gfp_t flag);
23extern void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
24 dma_addr_t dma_handle);
25extern dma_addr_t dma_map_single(struct device *dev, void *cpu_addr,
26 size_t size, enum dma_data_direction direction);
27extern void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,
28 size_t size, enum dma_data_direction direction);
29extern dma_addr_t dma_map_page(struct device *dev, struct page *page,
30 unsigned long offset, size_t size,
31 enum dma_data_direction direction);
32extern void dma_unmap_page(struct device *dev, dma_addr_t dma_address,
33 size_t size, enum dma_data_direction direction);
34extern int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
35 enum dma_data_direction direction);
36extern void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
37 int nhwentries, enum dma_data_direction direction);
38
39static inline void
40dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
41 enum dma_data_direction direction)
42{
43 BUG_ON(direction == DMA_NONE);
44 /* nothing to do */
45}
46
47static inline void
48dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size,
49 enum dma_data_direction direction)
50{
51 BUG_ON(direction == DMA_NONE);
52 /* nothing to do */
53}
54
55static inline void
56dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
57 enum dma_data_direction direction)
58{
59 BUG_ON(direction == DMA_NONE);
60 /* nothing to do */
61}
62
63static inline void
64dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
65 enum dma_data_direction direction)
66{
67 BUG_ON(direction == DMA_NONE);
68 /* nothing to do */
69}
70
71static inline int dma_mapping_error(dma_addr_t dma_addr)
72{
73 return (dma_addr == DMA_ERROR_CODE);
74}
75
76/* Now for the API extensions over the pci_ one */
77
78#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
79#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
80#define dma_is_consistent(d) (1)
81
82static inline int
83dma_get_cache_alignment(void)
84{
85 /* no easy way to get cache size on all processors, so return
86 * the maximum possible, to be safe */
87 return (1 << L1_CACHE_SHIFT_MAX);
88}
89
90static inline void
91dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
92 unsigned long offset, size_t size,
93 enum dma_data_direction direction)
94{
95 BUG_ON(direction == DMA_NONE);
96 /* nothing to do */
97}
98
99static inline void
100dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
101 unsigned long offset, size_t size,
102 enum dma_data_direction direction)
103{
104 BUG_ON(direction == DMA_NONE);
105 /* nothing to do */
106}
107
108static inline void
109dma_cache_sync(void *vaddr, size_t size,
110 enum dma_data_direction direction)
111{
112 BUG_ON(direction == DMA_NONE);
113 /* nothing to do */
114}
115
116/*
117 * DMA operations are abstracted for G5 vs. i/pSeries, PCI vs. VIO
118 */
119struct dma_mapping_ops {
120 void * (*alloc_coherent)(struct device *dev, size_t size,
121 dma_addr_t *dma_handle, gfp_t flag);
122 void (*free_coherent)(struct device *dev, size_t size,
123 void *vaddr, dma_addr_t dma_handle);
124 dma_addr_t (*map_single)(struct device *dev, void *ptr,
125 size_t size, enum dma_data_direction direction);
126 void (*unmap_single)(struct device *dev, dma_addr_t dma_addr,
127 size_t size, enum dma_data_direction direction);
128 int (*map_sg)(struct device *dev, struct scatterlist *sg,
129 int nents, enum dma_data_direction direction);
130 void (*unmap_sg)(struct device *dev, struct scatterlist *sg,
131 int nents, enum dma_data_direction direction);
132 int (*dma_supported)(struct device *dev, u64 mask);
133 int (*dac_dma_supported)(struct device *dev, u64 mask);
134};
135
136#endif /* _ASM_DMA_MAPPING_H */
diff --git a/include/asm-ppc64/imalloc.h b/include/asm-ppc64/imalloc.h
deleted file mode 100644
index 42adf7033a81..000000000000
--- a/include/asm-ppc64/imalloc.h
+++ /dev/null
@@ -1,26 +0,0 @@
1#ifndef _PPC64_IMALLOC_H
2#define _PPC64_IMALLOC_H
3
4/*
5 * Define the address range of the imalloc VM area.
6 */
7#define PHBS_IO_BASE VMALLOC_END
8#define IMALLOC_BASE (PHBS_IO_BASE + 0x80000000ul) /* Reserve 2 gigs for PHBs */
9#define IMALLOC_END (VMALLOC_START + PGTABLE_RANGE)
10
11
12/* imalloc region types */
13#define IM_REGION_UNUSED 0x1
14#define IM_REGION_SUBSET 0x2
15#define IM_REGION_EXISTS 0x4
16#define IM_REGION_OVERLAP 0x8
17#define IM_REGION_SUPERSET 0x10
18
19extern struct vm_struct * im_get_free_area(unsigned long size);
20extern struct vm_struct * im_get_area(unsigned long v_addr, unsigned long size,
21 int region_type);
22extern void im_free(void *addr);
23
24extern unsigned long ioremap_bot;
25
26#endif /* _PPC64_IMALLOC_H */
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 @@
10typedef struct _cciss_pci_info_struct 10typedef 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/hdreg.h b/include/linux/hdreg.h
index b5d660089de4..2b54eac738ea 100644
--- a/include/linux/hdreg.h
+++ b/include/linux/hdreg.h
@@ -80,10 +80,12 @@
80/* 80/*
81 * Define standard taskfile in/out register 81 * Define standard taskfile in/out register
82 */ 82 */
83#define IDE_TASKFILE_STD_OUT_FLAGS 0xFE
84#define IDE_TASKFILE_STD_IN_FLAGS 0xFE 83#define IDE_TASKFILE_STD_IN_FLAGS 0xFE
85#define IDE_HOB_STD_OUT_FLAGS 0x3C
86#define IDE_HOB_STD_IN_FLAGS 0x3C 84#define IDE_HOB_STD_IN_FLAGS 0x3C
85#ifndef __KERNEL__
86#define IDE_TASKFILE_STD_OUT_FLAGS 0xFE
87#define IDE_HOB_STD_OUT_FLAGS 0x3C
88#endif
87 89
88typedef unsigned char task_ioreg_t; 90typedef unsigned char task_ioreg_t;
89typedef unsigned long sata_ioreg_t; 91typedef unsigned long sata_ioreg_t;
diff --git a/include/linux/ide.h b/include/linux/ide.h
index ac8b25fa6506..a39c3c59789d 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 */
1093typedef struct ide_driver_s { 1096typedef 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;
@@ -1199,37 +1201,11 @@ extern u64 ide_get_error_location(ide_drive_t *, char *);
1199 */ 1201 */
1200typedef enum { 1202typedef enum {
1201 ide_wait, /* insert rq at end of list, and wait for it */ 1203 ide_wait, /* insert rq at end of list, and wait for it */
1202 ide_next, /* insert rq immediately after current request */
1203 ide_preempt, /* insert rq in front of current request */ 1204 ide_preempt, /* insert rq in front of current request */
1204 ide_head_wait, /* insert rq in front of current request and wait for it */ 1205 ide_head_wait, /* insert rq in front of current request and wait for it */
1205 ide_end /* insert rq at end of list, but don't wait for it */ 1206 ide_end /* insert rq at end of list, but don't wait for it */
1206} ide_action_t; 1207} ide_action_t;
1207 1208
1208/*
1209 * This function issues a special IDE device request
1210 * onto the request queue.
1211 *
1212 * If action is ide_wait, then the rq is queued at the end of the
1213 * request queue, and the function sleeps until it has been processed.
1214 * This is for use when invoked from an ioctl handler.
1215 *
1216 * If action is ide_preempt, then the rq is queued at the head of
1217 * the request queue, displacing the currently-being-processed
1218 * request and this function returns immediately without waiting
1219 * for the new rq to be completed. This is VERY DANGEROUS, and is
1220 * intended for careful use by the ATAPI tape/cdrom driver code.
1221 *
1222 * If action is ide_next, then the rq is queued immediately after
1223 * the currently-being-processed-request (if any), and the function
1224 * returns without waiting for the new rq to be completed. As above,
1225 * This is VERY DANGEROUS, and is intended for careful use by the
1226 * ATAPI tape/cdrom driver code.
1227 *
1228 * If action is ide_end, then the rq is queued at the end of the
1229 * request queue, and the function returns immediately without waiting
1230 * for the new rq to be completed. This is again intended for careful
1231 * use by the ATAPI tape/cdrom driver code.
1232 */
1233extern int ide_do_drive_cmd(ide_drive_t *, struct request *, ide_action_t); 1209extern int ide_do_drive_cmd(ide_drive_t *, struct request *, ide_action_t);
1234 1210
1235/* 1211/*
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 */
942extern int expand_stack(struct vm_area_struct *vma, unsigned long address); 942extern int expand_stack(struct vm_area_struct *vma, unsigned long address);
943#ifdef CONFIG_IA64
943extern int expand_upwards(struct vm_area_struct *vma, unsigned long address); 944extern 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. */
946extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr); 948extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr);
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index 7b387faedb4d..efb60d06caab 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -620,6 +620,7 @@
620#define PCI_DEVICE_ID_SI_961 0x0961 620#define PCI_DEVICE_ID_SI_961 0x0961
621#define PCI_DEVICE_ID_SI_962 0x0962 621#define PCI_DEVICE_ID_SI_962 0x0962
622#define PCI_DEVICE_ID_SI_963 0x0963 622#define PCI_DEVICE_ID_SI_963 0x0963
623#define PCI_DEVICE_ID_SI_965 0x0965
623#define PCI_DEVICE_ID_SI_5511 0x5511 624#define PCI_DEVICE_ID_SI_5511 0x5511
624#define PCI_DEVICE_ID_SI_5513 0x5513 625#define PCI_DEVICE_ID_SI_5513 0x5513
625#define PCI_DEVICE_ID_SI_5518 0x5518 626#define PCI_DEVICE_ID_SI_5518 0x5518
@@ -1234,6 +1235,7 @@
1234#define PCI_DEVICE_ID_VIA_8703_51_0 0x3148 1235#define PCI_DEVICE_ID_VIA_8703_51_0 0x3148
1235#define PCI_DEVICE_ID_VIA_8237_SATA 0x3149 1236#define PCI_DEVICE_ID_VIA_8237_SATA 0x3149
1236#define PCI_DEVICE_ID_VIA_XN266 0x3156 1237#define PCI_DEVICE_ID_VIA_XN266 0x3156
1238#define PCI_DEVICE_ID_VIA_6410 0x3164
1237#define PCI_DEVICE_ID_VIA_8754C_0 0x3168 1239#define PCI_DEVICE_ID_VIA_8754C_0 0x3168
1238#define PCI_DEVICE_ID_VIA_8235 0x3177 1240#define PCI_DEVICE_ID_VIA_8235 0x3177
1239#define PCI_DEVICE_ID_VIA_8385_0 0x3188 1241#define PCI_DEVICE_ID_VIA_8385_0 0x3188
diff --git a/include/net/ieee80211.h b/include/net/ieee80211.h
index b93fd8c1d884..cde2f4f4f501 100644
--- a/include/net/ieee80211.h
+++ b/include/net/ieee80211.h
@@ -1042,7 +1042,7 @@ static inline u8 *ieee80211_get_payload(struct ieee80211_hdr *hdr)
1042 case IEEE80211_4ADDR_LEN: 1042 case IEEE80211_4ADDR_LEN:
1043 return ((struct ieee80211_hdr_4addr *)hdr)->payload; 1043 return ((struct ieee80211_hdr_4addr *)hdr)->payload;
1044 } 1044 }
1045 1045 return NULL;
1046} 1046}
1047 1047
1048static inline int ieee80211_is_ofdm_rate(u8 rate) 1048static inline int ieee80211_is_ofdm_rate(u8 rate)
diff --git a/mm/mmap.c b/mm/mmap.c
index 6c997b159600..4f8def03428c 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -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
1505static inline 1505static inline
1506#endif 1506#endif
1507int expand_upwards(struct vm_area_struct *vma, unsigned long address) 1507int expand_upwards(struct vm_area_struct *vma, unsigned long address)