diff options
702 files changed, 12129 insertions, 5759 deletions
@@ -3401,10 +3401,10 @@ S: Czech Republic | |||
3401 | 3401 | ||
3402 | N: Thibaut Varene | 3402 | N: Thibaut Varene |
3403 | E: T-Bone@parisc-linux.org | 3403 | E: T-Bone@parisc-linux.org |
3404 | W: http://www.parisc-linux.org/ | 3404 | W: http://www.parisc-linux.org/~varenet/ |
3405 | P: 1024D/B7D2F063 E67C 0D43 A75E 12A5 BB1C FA2F 1E32 C3DA B7D2 F063 | 3405 | P: 1024D/B7D2F063 E67C 0D43 A75E 12A5 BB1C FA2F 1E32 C3DA B7D2 F063 |
3406 | D: PA-RISC port minion, PDC and GSCPS2 drivers, debuglocks and other bits | 3406 | D: PA-RISC port minion, PDC and GSCPS2 drivers, debuglocks and other bits |
3407 | D: Some bits in an ARM port, S1D13XXX FB driver, random patches here and there | 3407 | D: Some ARM at91rm9200 bits, S1D13XXX FB driver, random patches here and there |
3408 | D: AD1889 sound driver | 3408 | D: AD1889 sound driver |
3409 | S: Paris, France | 3409 | S: Paris, France |
3410 | 3410 | ||
diff --git a/Documentation/DocBook/Makefile b/Documentation/DocBook/Makefile index 5a2882d275ba..66e1cf733571 100644 --- a/Documentation/DocBook/Makefile +++ b/Documentation/DocBook/Makefile | |||
@@ -10,7 +10,8 @@ DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \ | |||
10 | kernel-hacking.xml kernel-locking.xml deviceiobook.xml \ | 10 | kernel-hacking.xml kernel-locking.xml deviceiobook.xml \ |
11 | procfs-guide.xml writing_usb_driver.xml \ | 11 | procfs-guide.xml writing_usb_driver.xml \ |
12 | kernel-api.xml journal-api.xml lsm.xml usb.xml \ | 12 | kernel-api.xml journal-api.xml lsm.xml usb.xml \ |
13 | gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml | 13 | gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \ |
14 | genericirq.xml | ||
14 | 15 | ||
15 | ### | 16 | ### |
16 | # The build process is as follows (targets): | 17 | # The build process is as follows (targets): |
diff --git a/Documentation/DocBook/genericirq.tmpl b/Documentation/DocBook/genericirq.tmpl new file mode 100644 index 000000000000..0f4a4b6321e4 --- /dev/null +++ b/Documentation/DocBook/genericirq.tmpl | |||
@@ -0,0 +1,474 @@ | |||
1 | <?xml version="1.0" encoding="UTF-8"?> | ||
2 | <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" | ||
3 | "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []> | ||
4 | |||
5 | <book id="Generic-IRQ-Guide"> | ||
6 | <bookinfo> | ||
7 | <title>Linux generic IRQ handling</title> | ||
8 | |||
9 | <authorgroup> | ||
10 | <author> | ||
11 | <firstname>Thomas</firstname> | ||
12 | <surname>Gleixner</surname> | ||
13 | <affiliation> | ||
14 | <address> | ||
15 | <email>tglx@linutronix.de</email> | ||
16 | </address> | ||
17 | </affiliation> | ||
18 | </author> | ||
19 | <author> | ||
20 | <firstname>Ingo</firstname> | ||
21 | <surname>Molnar</surname> | ||
22 | <affiliation> | ||
23 | <address> | ||
24 | <email>mingo@elte.hu</email> | ||
25 | </address> | ||
26 | </affiliation> | ||
27 | </author> | ||
28 | </authorgroup> | ||
29 | |||
30 | <copyright> | ||
31 | <year>2005-2006</year> | ||
32 | <holder>Thomas Gleixner</holder> | ||
33 | </copyright> | ||
34 | <copyright> | ||
35 | <year>2005-2006</year> | ||
36 | <holder>Ingo Molnar</holder> | ||
37 | </copyright> | ||
38 | |||
39 | <legalnotice> | ||
40 | <para> | ||
41 | This documentation is free software; you can redistribute | ||
42 | it and/or modify it under the terms of the GNU General Public | ||
43 | License version 2 as published by the Free Software Foundation. | ||
44 | </para> | ||
45 | |||
46 | <para> | ||
47 | This program is distributed in the hope that it will be | ||
48 | useful, but WITHOUT ANY WARRANTY; without even the implied | ||
49 | warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
50 | See the GNU General Public License for more details. | ||
51 | </para> | ||
52 | |||
53 | <para> | ||
54 | You should have received a copy of the GNU General Public | ||
55 | License along with this program; if not, write to the Free | ||
56 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||
57 | MA 02111-1307 USA | ||
58 | </para> | ||
59 | |||
60 | <para> | ||
61 | For more details see the file COPYING in the source | ||
62 | distribution of Linux. | ||
63 | </para> | ||
64 | </legalnotice> | ||
65 | </bookinfo> | ||
66 | |||
67 | <toc></toc> | ||
68 | |||
69 | <chapter id="intro"> | ||
70 | <title>Introduction</title> | ||
71 | <para> | ||
72 | The generic interrupt handling layer is designed to provide a | ||
73 | complete abstraction of interrupt handling for device drivers. | ||
74 | It is able to handle all the different types of interrupt controller | ||
75 | hardware. Device drivers use generic API functions to request, enable, | ||
76 | disable and free interrupts. The drivers do not have to know anything | ||
77 | about interrupt hardware details, so they can be used on different | ||
78 | platforms without code changes. | ||
79 | </para> | ||
80 | <para> | ||
81 | This documentation is provided to developers who want to implement | ||
82 | an interrupt subsystem based for their architecture, with the help | ||
83 | of the generic IRQ handling layer. | ||
84 | </para> | ||
85 | </chapter> | ||
86 | |||
87 | <chapter id="rationale"> | ||
88 | <title>Rationale</title> | ||
89 | <para> | ||
90 | The original implementation of interrupt handling in Linux is using | ||
91 | the __do_IRQ() super-handler, which is able to deal with every | ||
92 | type of interrupt logic. | ||
93 | </para> | ||
94 | <para> | ||
95 | Originally, Russell King identified different types of handlers to | ||
96 | build a quite universal set for the ARM interrupt handler | ||
97 | implementation in Linux 2.5/2.6. He distinguished between: | ||
98 | <itemizedlist> | ||
99 | <listitem><para>Level type</para></listitem> | ||
100 | <listitem><para>Edge type</para></listitem> | ||
101 | <listitem><para>Simple type</para></listitem> | ||
102 | </itemizedlist> | ||
103 | In the SMP world of the __do_IRQ() super-handler another type | ||
104 | was identified: | ||
105 | <itemizedlist> | ||
106 | <listitem><para>Per CPU type</para></listitem> | ||
107 | </itemizedlist> | ||
108 | </para> | ||
109 | <para> | ||
110 | This split implementation of highlevel IRQ handlers allows us to | ||
111 | optimize the flow of the interrupt handling for each specific | ||
112 | interrupt type. This reduces complexity in that particular codepath | ||
113 | and allows the optimized handling of a given type. | ||
114 | </para> | ||
115 | <para> | ||
116 | The original general IRQ implementation used hw_interrupt_type | ||
117 | structures and their ->ack(), ->end() [etc.] callbacks to | ||
118 | differentiate the flow control in the super-handler. This leads to | ||
119 | a mix of flow logic and lowlevel hardware logic, and it also leads | ||
120 | to unnecessary code duplication: for example in i386, there is a | ||
121 | ioapic_level_irq and a ioapic_edge_irq irq-type which share many | ||
122 | of the lowlevel details but have different flow handling. | ||
123 | </para> | ||
124 | <para> | ||
125 | A more natural abstraction is the clean separation of the | ||
126 | 'irq flow' and the 'chip details'. | ||
127 | </para> | ||
128 | <para> | ||
129 | Analysing a couple of architecture's IRQ subsystem implementations | ||
130 | reveals that most of them can use a generic set of 'irq flow' | ||
131 | methods and only need to add the chip level specific code. | ||
132 | The separation is also valuable for (sub)architectures | ||
133 | which need specific quirks in the irq flow itself but not in the | ||
134 | chip-details - and thus provides a more transparent IRQ subsystem | ||
135 | design. | ||
136 | </para> | ||
137 | <para> | ||
138 | Each interrupt descriptor is assigned its own highlevel flow | ||
139 | handler, which is normally one of the generic | ||
140 | implementations. (This highlevel flow handler implementation also | ||
141 | makes it simple to provide demultiplexing handlers which can be | ||
142 | found in embedded platforms on various architectures.) | ||
143 | </para> | ||
144 | <para> | ||
145 | The separation makes the generic interrupt handling layer more | ||
146 | flexible and extensible. For example, an (sub)architecture can | ||
147 | use a generic irq-flow implementation for 'level type' interrupts | ||
148 | and add a (sub)architecture specific 'edge type' implementation. | ||
149 | </para> | ||
150 | <para> | ||
151 | To make the transition to the new model easier and prevent the | ||
152 | breakage of existing implementations, the __do_IRQ() super-handler | ||
153 | is still available. This leads to a kind of duality for the time | ||
154 | being. Over time the new model should be used in more and more | ||
155 | architectures, as it enables smaller and cleaner IRQ subsystems. | ||
156 | </para> | ||
157 | </chapter> | ||
158 | <chapter id="bugs"> | ||
159 | <title>Known Bugs And Assumptions</title> | ||
160 | <para> | ||
161 | None (knock on wood). | ||
162 | </para> | ||
163 | </chapter> | ||
164 | |||
165 | <chapter id="Abstraction"> | ||
166 | <title>Abstraction layers</title> | ||
167 | <para> | ||
168 | There are three main levels of abstraction in the interrupt code: | ||
169 | <orderedlist> | ||
170 | <listitem><para>Highlevel driver API</para></listitem> | ||
171 | <listitem><para>Highlevel IRQ flow handlers</para></listitem> | ||
172 | <listitem><para>Chiplevel hardware encapsulation</para></listitem> | ||
173 | </orderedlist> | ||
174 | </para> | ||
175 | <sect1> | ||
176 | <title>Interrupt control flow</title> | ||
177 | <para> | ||
178 | Each interrupt is described by an interrupt descriptor structure | ||
179 | irq_desc. The interrupt is referenced by an 'unsigned int' numeric | ||
180 | value which selects the corresponding interrupt decription structure | ||
181 | in the descriptor structures array. | ||
182 | The descriptor structure contains status information and pointers | ||
183 | to the interrupt flow method and the interrupt chip structure | ||
184 | which are assigned to this interrupt. | ||
185 | </para> | ||
186 | <para> | ||
187 | Whenever an interrupt triggers, the lowlevel arch code calls into | ||
188 | the generic interrupt code by calling desc->handle_irq(). | ||
189 | This highlevel IRQ handling function only uses desc->chip primitives | ||
190 | referenced by the assigned chip descriptor structure. | ||
191 | </para> | ||
192 | </sect1> | ||
193 | <sect1> | ||
194 | <title>Highlevel Driver API</title> | ||
195 | <para> | ||
196 | The highlevel Driver API consists of following functions: | ||
197 | <itemizedlist> | ||
198 | <listitem><para>request_irq()</para></listitem> | ||
199 | <listitem><para>free_irq()</para></listitem> | ||
200 | <listitem><para>disable_irq()</para></listitem> | ||
201 | <listitem><para>enable_irq()</para></listitem> | ||
202 | <listitem><para>disable_irq_nosync() (SMP only)</para></listitem> | ||
203 | <listitem><para>synchronize_irq() (SMP only)</para></listitem> | ||
204 | <listitem><para>set_irq_type()</para></listitem> | ||
205 | <listitem><para>set_irq_wake()</para></listitem> | ||
206 | <listitem><para>set_irq_data()</para></listitem> | ||
207 | <listitem><para>set_irq_chip()</para></listitem> | ||
208 | <listitem><para>set_irq_chip_data()</para></listitem> | ||
209 | </itemizedlist> | ||
210 | See the autogenerated function documentation for details. | ||
211 | </para> | ||
212 | </sect1> | ||
213 | <sect1> | ||
214 | <title>Highlevel IRQ flow handlers</title> | ||
215 | <para> | ||
216 | The generic layer provides a set of pre-defined irq-flow methods: | ||
217 | <itemizedlist> | ||
218 | <listitem><para>handle_level_irq</para></listitem> | ||
219 | <listitem><para>handle_edge_irq</para></listitem> | ||
220 | <listitem><para>handle_simple_irq</para></listitem> | ||
221 | <listitem><para>handle_percpu_irq</para></listitem> | ||
222 | </itemizedlist> | ||
223 | The interrupt flow handlers (either predefined or architecture | ||
224 | specific) are assigned to specific interrupts by the architecture | ||
225 | either during bootup or during device initialization. | ||
226 | </para> | ||
227 | <sect2> | ||
228 | <title>Default flow implementations</title> | ||
229 | <sect3> | ||
230 | <title>Helper functions</title> | ||
231 | <para> | ||
232 | The helper functions call the chip primitives and | ||
233 | are used by the default flow implementations. | ||
234 | The following helper functions are implemented (simplified excerpt): | ||
235 | <programlisting> | ||
236 | default_enable(irq) | ||
237 | { | ||
238 | desc->chip->unmask(irq); | ||
239 | } | ||
240 | |||
241 | default_disable(irq) | ||
242 | { | ||
243 | if (!delay_disable(irq)) | ||
244 | desc->chip->mask(irq); | ||
245 | } | ||
246 | |||
247 | default_ack(irq) | ||
248 | { | ||
249 | chip->ack(irq); | ||
250 | } | ||
251 | |||
252 | default_mask_ack(irq) | ||
253 | { | ||
254 | if (chip->mask_ack) { | ||
255 | chip->mask_ack(irq); | ||
256 | } else { | ||
257 | chip->mask(irq); | ||
258 | chip->ack(irq); | ||
259 | } | ||
260 | } | ||
261 | |||
262 | noop(irq) | ||
263 | { | ||
264 | } | ||
265 | |||
266 | </programlisting> | ||
267 | </para> | ||
268 | </sect3> | ||
269 | </sect2> | ||
270 | <sect2> | ||
271 | <title>Default flow handler implementations</title> | ||
272 | <sect3> | ||
273 | <title>Default Level IRQ flow handler</title> | ||
274 | <para> | ||
275 | handle_level_irq provides a generic implementation | ||
276 | for level-triggered interrupts. | ||
277 | </para> | ||
278 | <para> | ||
279 | The following control flow is implemented (simplified excerpt): | ||
280 | <programlisting> | ||
281 | desc->chip->start(); | ||
282 | handle_IRQ_event(desc->action); | ||
283 | desc->chip->end(); | ||
284 | </programlisting> | ||
285 | </para> | ||
286 | </sect3> | ||
287 | <sect3> | ||
288 | <title>Default Edge IRQ flow handler</title> | ||
289 | <para> | ||
290 | handle_edge_irq provides a generic implementation | ||
291 | for edge-triggered interrupts. | ||
292 | </para> | ||
293 | <para> | ||
294 | The following control flow is implemented (simplified excerpt): | ||
295 | <programlisting> | ||
296 | if (desc->status & running) { | ||
297 | desc->chip->hold(); | ||
298 | desc->status |= pending | masked; | ||
299 | return; | ||
300 | } | ||
301 | desc->chip->start(); | ||
302 | desc->status |= running; | ||
303 | do { | ||
304 | if (desc->status & masked) | ||
305 | desc->chip->enable(); | ||
306 | desc-status &= ~pending; | ||
307 | handle_IRQ_event(desc->action); | ||
308 | } while (status & pending); | ||
309 | desc-status &= ~running; | ||
310 | desc->chip->end(); | ||
311 | </programlisting> | ||
312 | </para> | ||
313 | </sect3> | ||
314 | <sect3> | ||
315 | <title>Default simple IRQ flow handler</title> | ||
316 | <para> | ||
317 | handle_simple_irq provides a generic implementation | ||
318 | for simple interrupts. | ||
319 | </para> | ||
320 | <para> | ||
321 | Note: The simple flow handler does not call any | ||
322 | handler/chip primitives. | ||
323 | </para> | ||
324 | <para> | ||
325 | The following control flow is implemented (simplified excerpt): | ||
326 | <programlisting> | ||
327 | handle_IRQ_event(desc->action); | ||
328 | </programlisting> | ||
329 | </para> | ||
330 | </sect3> | ||
331 | <sect3> | ||
332 | <title>Default per CPU flow handler</title> | ||
333 | <para> | ||
334 | handle_percpu_irq provides a generic implementation | ||
335 | for per CPU interrupts. | ||
336 | </para> | ||
337 | <para> | ||
338 | Per CPU interrupts are only available on SMP and | ||
339 | the handler provides a simplified version without | ||
340 | locking. | ||
341 | </para> | ||
342 | <para> | ||
343 | The following control flow is implemented (simplified excerpt): | ||
344 | <programlisting> | ||
345 | desc->chip->start(); | ||
346 | handle_IRQ_event(desc->action); | ||
347 | desc->chip->end(); | ||
348 | </programlisting> | ||
349 | </para> | ||
350 | </sect3> | ||
351 | </sect2> | ||
352 | <sect2> | ||
353 | <title>Quirks and optimizations</title> | ||
354 | <para> | ||
355 | The generic functions are intended for 'clean' architectures and chips, | ||
356 | which have no platform-specific IRQ handling quirks. If an architecture | ||
357 | needs to implement quirks on the 'flow' level then it can do so by | ||
358 | overriding the highlevel irq-flow handler. | ||
359 | </para> | ||
360 | </sect2> | ||
361 | <sect2> | ||
362 | <title>Delayed interrupt disable</title> | ||
363 | <para> | ||
364 | This per interrupt selectable feature, which was introduced by Russell | ||
365 | King in the ARM interrupt implementation, does not mask an interrupt | ||
366 | at the hardware level when disable_irq() is called. The interrupt is | ||
367 | kept enabled and is masked in the flow handler when an interrupt event | ||
368 | happens. This prevents losing edge interrupts on hardware which does | ||
369 | not store an edge interrupt event while the interrupt is disabled at | ||
370 | the hardware level. When an interrupt arrives while the IRQ_DISABLED | ||
371 | flag is set, then the interrupt is masked at the hardware level and | ||
372 | the IRQ_PENDING bit is set. When the interrupt is re-enabled by | ||
373 | enable_irq() the pending bit is checked and if it is set, the | ||
374 | interrupt is resent either via hardware or by a software resend | ||
375 | mechanism. (It's necessary to enable CONFIG_HARDIRQS_SW_RESEND when | ||
376 | you want to use the delayed interrupt disable feature and your | ||
377 | hardware is not capable of retriggering an interrupt.) | ||
378 | The delayed interrupt disable can be runtime enabled, per interrupt, | ||
379 | by setting the IRQ_DELAYED_DISABLE flag in the irq_desc status field. | ||
380 | </para> | ||
381 | </sect2> | ||
382 | </sect1> | ||
383 | <sect1> | ||
384 | <title>Chiplevel hardware encapsulation</title> | ||
385 | <para> | ||
386 | The chip level hardware descriptor structure irq_chip | ||
387 | contains all the direct chip relevant functions, which | ||
388 | can be utilized by the irq flow implementations. | ||
389 | <itemizedlist> | ||
390 | <listitem><para>ack()</para></listitem> | ||
391 | <listitem><para>mask_ack() - Optional, recommended for performance</para></listitem> | ||
392 | <listitem><para>mask()</para></listitem> | ||
393 | <listitem><para>unmask()</para></listitem> | ||
394 | <listitem><para>retrigger() - Optional</para></listitem> | ||
395 | <listitem><para>set_type() - Optional</para></listitem> | ||
396 | <listitem><para>set_wake() - Optional</para></listitem> | ||
397 | </itemizedlist> | ||
398 | These primitives are strictly intended to mean what they say: ack means | ||
399 | ACK, masking means masking of an IRQ line, etc. It is up to the flow | ||
400 | handler(s) to use these basic units of lowlevel functionality. | ||
401 | </para> | ||
402 | </sect1> | ||
403 | </chapter> | ||
404 | |||
405 | <chapter id="doirq"> | ||
406 | <title>__do_IRQ entry point</title> | ||
407 | <para> | ||
408 | The original implementation __do_IRQ() is an alternative entry | ||
409 | point for all types of interrupts. | ||
410 | </para> | ||
411 | <para> | ||
412 | This handler turned out to be not suitable for all | ||
413 | interrupt hardware and was therefore reimplemented with split | ||
414 | functionality for egde/level/simple/percpu interrupts. This is not | ||
415 | only a functional optimization. It also shortens code paths for | ||
416 | interrupts. | ||
417 | </para> | ||
418 | <para> | ||
419 | To make use of the split implementation, replace the call to | ||
420 | __do_IRQ by a call to desc->chip->handle_irq() and associate | ||
421 | the appropriate handler function to desc->chip->handle_irq(). | ||
422 | In most cases the generic handler implementations should | ||
423 | be sufficient. | ||
424 | </para> | ||
425 | </chapter> | ||
426 | |||
427 | <chapter id="locking"> | ||
428 | <title>Locking on SMP</title> | ||
429 | <para> | ||
430 | The locking of chip registers is up to the architecture that | ||
431 | defines the chip primitives. There is a chip->lock field that can be used | ||
432 | for serialization, but the generic layer does not touch it. The per-irq | ||
433 | structure is protected via desc->lock, by the generic layer. | ||
434 | </para> | ||
435 | </chapter> | ||
436 | <chapter id="structs"> | ||
437 | <title>Structures</title> | ||
438 | <para> | ||
439 | This chapter contains the autogenerated documentation of the structures which are | ||
440 | used in the generic IRQ layer. | ||
441 | </para> | ||
442 | !Iinclude/linux/irq.h | ||
443 | </chapter> | ||
444 | |||
445 | <chapter id="pubfunctions"> | ||
446 | <title>Public Functions Provided</title> | ||
447 | <para> | ||
448 | This chapter contains the autogenerated documentation of the kernel API functions | ||
449 | which are exported. | ||
450 | </para> | ||
451 | !Ekernel/irq/manage.c | ||
452 | !Ekernel/irq/chip.c | ||
453 | </chapter> | ||
454 | |||
455 | <chapter id="intfunctions"> | ||
456 | <title>Internal Functions Provided</title> | ||
457 | <para> | ||
458 | This chapter contains the autogenerated documentation of the internal functions. | ||
459 | </para> | ||
460 | !Ikernel/irq/handle.c | ||
461 | !Ikernel/irq/chip.c | ||
462 | </chapter> | ||
463 | |||
464 | <chapter id="credits"> | ||
465 | <title>Credits</title> | ||
466 | <para> | ||
467 | The following people have contributed to this document: | ||
468 | <orderedlist> | ||
469 | <listitem><para>Thomas Gleixner<email>tglx@linutronix.de</email></para></listitem> | ||
470 | <listitem><para>Ingo Molnar<email>mingo@elte.hu</email></para></listitem> | ||
471 | </orderedlist> | ||
472 | </para> | ||
473 | </chapter> | ||
474 | </book> | ||
diff --git a/Documentation/IRQ.txt b/Documentation/IRQ.txt new file mode 100644 index 000000000000..1011e7175021 --- /dev/null +++ b/Documentation/IRQ.txt | |||
@@ -0,0 +1,22 @@ | |||
1 | What is an IRQ? | ||
2 | |||
3 | An IRQ is an interrupt request from a device. | ||
4 | Currently they can come in over a pin, or over a packet. | ||
5 | Several devices may be connected to the same pin thus | ||
6 | sharing an IRQ. | ||
7 | |||
8 | An IRQ number is a kernel identifier used to talk about a hardware | ||
9 | interrupt source. Typically this is an index into the global irq_desc | ||
10 | array, but except for what linux/interrupt.h implements the details | ||
11 | are architecture specific. | ||
12 | |||
13 | An IRQ number is an enumeration of the possible interrupt sources on a | ||
14 | machine. Typically what is enumerated is the number of input pins on | ||
15 | all of the interrupt controller in the system. In the case of ISA | ||
16 | what is enumerated are the 16 input pins on the two i8259 interrupt | ||
17 | controllers. | ||
18 | |||
19 | Architectures can assign additional meaning to the IRQ numbers, and | ||
20 | are encouraged to in the case where there is any manual configuration | ||
21 | of the hardware involved. The ISA IRQs are a classic example of | ||
22 | assigning this kind of additional meaning. | ||
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 027285d0c26c..033ac91da07a 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
@@ -177,6 +177,16 @@ Who: Jean Delvare <khali@linux-fr.org> | |||
177 | 177 | ||
178 | --------------------------- | 178 | --------------------------- |
179 | 179 | ||
180 | What: Unused EXPORT_SYMBOL/EXPORT_SYMBOL_GPL exports | ||
181 | (temporary transition config option provided until then) | ||
182 | The transition config option will also be removed at the same time. | ||
183 | When: before 2.6.19 | ||
184 | Why: Unused symbols are both increasing the size of the kernel binary | ||
185 | and are often a sign of "wrong API" | ||
186 | Who: Arjan van de Ven <arjan@linux.intel.com> | ||
187 | |||
188 | --------------------------- | ||
189 | |||
180 | What: remove EXPORT_SYMBOL(tasklist_lock) | 190 | What: remove EXPORT_SYMBOL(tasklist_lock) |
181 | When: August 2006 | 191 | When: August 2006 |
182 | Files: kernel/fork.c | 192 | Files: kernel/fork.c |
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 0d189c93eeaf..25f8d20dac53 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -1689,9 +1689,14 @@ running once the system is up. | |||
1689 | decrease the size and leave more room for directly | 1689 | decrease the size and leave more room for directly |
1690 | mapped kernel RAM. | 1690 | mapped kernel RAM. |
1691 | 1691 | ||
1692 | vmhalt= [KNL,S390] | 1692 | vmhalt= [KNL,S390] Perform z/VM CP command after system halt. |
1693 | Format: <command> | ||
1693 | 1694 | ||
1694 | vmpoff= [KNL,S390] | 1695 | vmpanic= [KNL,S390] Perform z/VM CP command after kernel panic. |
1696 | Format: <command> | ||
1697 | |||
1698 | vmpoff= [KNL,S390] Perform z/VM CP command after power off. | ||
1699 | Format: <command> | ||
1695 | 1700 | ||
1696 | waveartist= [HW,OSS] | 1701 | waveartist= [HW,OSS] |
1697 | Format: <io>,<irq>,<dma>,<dma2> | 1702 | Format: <io>,<irq>,<dma>,<dma2> |
diff --git a/Documentation/keys-request-key.txt b/Documentation/keys-request-key.txt index 22488d791168..c1f64fdf84cb 100644 --- a/Documentation/keys-request-key.txt +++ b/Documentation/keys-request-key.txt | |||
@@ -3,16 +3,23 @@ | |||
3 | =================== | 3 | =================== |
4 | 4 | ||
5 | The key request service is part of the key retention service (refer to | 5 | The key request service is part of the key retention service (refer to |
6 | Documentation/keys.txt). This document explains more fully how that the | 6 | Documentation/keys.txt). This document explains more fully how the requesting |
7 | requesting algorithm works. | 7 | algorithm works. |
8 | 8 | ||
9 | The process starts by either the kernel requesting a service by calling | 9 | The process starts by either the kernel requesting a service by calling |
10 | request_key(): | 10 | request_key*(): |
11 | 11 | ||
12 | struct key *request_key(const struct key_type *type, | 12 | struct key *request_key(const struct key_type *type, |
13 | const char *description, | 13 | const char *description, |
14 | const char *callout_string); | 14 | const char *callout_string); |
15 | 15 | ||
16 | or: | ||
17 | |||
18 | struct key *request_key_with_auxdata(const struct key_type *type, | ||
19 | const char *description, | ||
20 | const char *callout_string, | ||
21 | void *aux); | ||
22 | |||
16 | Or by userspace invoking the request_key system call: | 23 | Or by userspace invoking the request_key system call: |
17 | 24 | ||
18 | key_serial_t request_key(const char *type, | 25 | key_serial_t request_key(const char *type, |
@@ -20,16 +27,26 @@ Or by userspace invoking the request_key system call: | |||
20 | const char *callout_info, | 27 | const char *callout_info, |
21 | key_serial_t dest_keyring); | 28 | key_serial_t dest_keyring); |
22 | 29 | ||
23 | The main difference between the two access points is that the in-kernel | 30 | The main difference between the access points is that the in-kernel interface |
24 | interface does not need to link the key to a keyring to prevent it from being | 31 | does not need to link the key to a keyring to prevent it from being immediately |
25 | immediately destroyed. The kernel interface returns a pointer directly to the | 32 | destroyed. The kernel interface returns a pointer directly to the key, and |
26 | key, and it's up to the caller to destroy the key. | 33 | it's up to the caller to destroy the key. |
34 | |||
35 | The request_key_with_auxdata() call is like the in-kernel request_key() call, | ||
36 | except that it permits auxiliary data to be passed to the upcaller (the default | ||
37 | is NULL). This is only useful for those key types that define their own upcall | ||
38 | mechanism rather than using /sbin/request-key. | ||
27 | 39 | ||
28 | The userspace interface links the key to a keyring associated with the process | 40 | The userspace interface links the key to a keyring associated with the process |
29 | to prevent the key from going away, and returns the serial number of the key to | 41 | to prevent the key from going away, and returns the serial number of the key to |
30 | the caller. | 42 | the caller. |
31 | 43 | ||
32 | 44 | ||
45 | The following example assumes that the key types involved don't define their | ||
46 | own upcall mechanisms. If they do, then those should be substituted for the | ||
47 | forking and execution of /sbin/request-key. | ||
48 | |||
49 | |||
33 | =========== | 50 | =========== |
34 | THE PROCESS | 51 | THE PROCESS |
35 | =========== | 52 | =========== |
@@ -40,8 +57,8 @@ A request proceeds in the following manner: | |||
40 | interface]. | 57 | interface]. |
41 | 58 | ||
42 | (2) request_key() searches the process's subscribed keyrings to see if there's | 59 | (2) request_key() searches the process's subscribed keyrings to see if there's |
43 | a suitable key there. If there is, it returns the key. If there isn't, and | 60 | a suitable key there. If there is, it returns the key. If there isn't, |
44 | callout_info is not set, an error is returned. Otherwise the process | 61 | and callout_info is not set, an error is returned. Otherwise the process |
45 | proceeds to the next step. | 62 | proceeds to the next step. |
46 | 63 | ||
47 | (3) request_key() sees that A doesn't have the desired key yet, so it creates | 64 | (3) request_key() sees that A doesn't have the desired key yet, so it creates |
@@ -62,7 +79,7 @@ A request proceeds in the following manner: | |||
62 | instantiation. | 79 | instantiation. |
63 | 80 | ||
64 | (7) The program may want to access another key from A's context (say a | 81 | (7) The program may want to access another key from A's context (say a |
65 | Kerberos TGT key). It just requests the appropriate key, and the keyring | 82 | Kerberos TGT key). It just requests the appropriate key, and the keyring |
66 | search notes that the session keyring has auth key V in its bottom level. | 83 | search notes that the session keyring has auth key V in its bottom level. |
67 | 84 | ||
68 | This will permit it to then search the keyrings of process A with the | 85 | This will permit it to then search the keyrings of process A with the |
@@ -79,10 +96,11 @@ A request proceeds in the following manner: | |||
79 | (10) The program then exits 0 and request_key() deletes key V and returns key | 96 | (10) The program then exits 0 and request_key() deletes key V and returns key |
80 | U to the caller. | 97 | U to the caller. |
81 | 98 | ||
82 | This also extends further. If key W (step 7 above) didn't exist, key W would be | 99 | This also extends further. If key W (step 7 above) didn't exist, key W would |
83 | created uninstantiated, another auth key (X) would be created (as per step 3) | 100 | be created uninstantiated, another auth key (X) would be created (as per step |
84 | and another copy of /sbin/request-key spawned (as per step 4); but the context | 101 | 3) and another copy of /sbin/request-key spawned (as per step 4); but the |
85 | specified by auth key X will still be process A, as it was in auth key V. | 102 | context specified by auth key X will still be process A, as it was in auth key |
103 | V. | ||
86 | 104 | ||
87 | This is because process A's keyrings can't simply be attached to | 105 | This is because process A's keyrings can't simply be attached to |
88 | /sbin/request-key at the appropriate places because (a) execve will discard two | 106 | /sbin/request-key at the appropriate places because (a) execve will discard two |
@@ -118,17 +136,17 @@ A search of any particular keyring proceeds in the following fashion: | |||
118 | 136 | ||
119 | (2) It considers all the non-keyring keys within that keyring and, if any key | 137 | (2) It considers all the non-keyring keys within that keyring and, if any key |
120 | matches the criteria specified, calls key_permission(SEARCH) on it to see | 138 | matches the criteria specified, calls key_permission(SEARCH) on it to see |
121 | if the key is allowed to be found. If it is, that key is returned; if | 139 | if the key is allowed to be found. If it is, that key is returned; if |
122 | not, the search continues, and the error code is retained if of higher | 140 | not, the search continues, and the error code is retained if of higher |
123 | priority than the one currently set. | 141 | priority than the one currently set. |
124 | 142 | ||
125 | (3) It then considers all the keyring-type keys in the keyring it's currently | 143 | (3) It then considers all the keyring-type keys in the keyring it's currently |
126 | searching. It calls key_permission(SEARCH) on each keyring, and if this | 144 | searching. It calls key_permission(SEARCH) on each keyring, and if this |
127 | grants permission, it recurses, executing steps (2) and (3) on that | 145 | grants permission, it recurses, executing steps (2) and (3) on that |
128 | keyring. | 146 | keyring. |
129 | 147 | ||
130 | The process stops immediately a valid key is found with permission granted to | 148 | The process stops immediately a valid key is found with permission granted to |
131 | use it. Any error from a previous match attempt is discarded and the key is | 149 | use it. Any error from a previous match attempt is discarded and the key is |
132 | returned. | 150 | returned. |
133 | 151 | ||
134 | When search_process_keyrings() is invoked, it performs the following searches | 152 | When search_process_keyrings() is invoked, it performs the following searches |
@@ -153,7 +171,7 @@ The moment one succeeds, all pending errors are discarded and the found key is | |||
153 | returned. | 171 | returned. |
154 | 172 | ||
155 | Only if all these fail does the whole thing fail with the highest priority | 173 | Only if all these fail does the whole thing fail with the highest priority |
156 | error. Note that several errors may have come from LSM. | 174 | error. Note that several errors may have come from LSM. |
157 | 175 | ||
158 | The error priority is: | 176 | The error priority is: |
159 | 177 | ||
diff --git a/Documentation/keys.txt b/Documentation/keys.txt index 61c0fad2fe2f..e373f0212843 100644 --- a/Documentation/keys.txt +++ b/Documentation/keys.txt | |||
@@ -780,6 +780,17 @@ payload contents" for more information. | |||
780 | See also Documentation/keys-request-key.txt. | 780 | See also Documentation/keys-request-key.txt. |
781 | 781 | ||
782 | 782 | ||
783 | (*) To search for a key, passing auxiliary data to the upcaller, call: | ||
784 | |||
785 | struct key *request_key_with_auxdata(const struct key_type *type, | ||
786 | const char *description, | ||
787 | const char *callout_string, | ||
788 | void *aux); | ||
789 | |||
790 | This is identical to request_key(), except that the auxiliary data is | ||
791 | passed to the key_type->request_key() op if it exists. | ||
792 | |||
793 | |||
783 | (*) When it is no longer required, the key should be released using: | 794 | (*) When it is no longer required, the key should be released using: |
784 | 795 | ||
785 | void key_put(struct key *key); | 796 | void key_put(struct key *key); |
@@ -1031,6 +1042,24 @@ The structure has a number of fields, some of which are mandatory: | |||
1031 | as might happen when the userspace buffer is accessed. | 1042 | as might happen when the userspace buffer is accessed. |
1032 | 1043 | ||
1033 | 1044 | ||
1045 | (*) int (*request_key)(struct key *key, struct key *authkey, const char *op, | ||
1046 | void *aux); | ||
1047 | |||
1048 | This method is optional. If provided, request_key() and | ||
1049 | request_key_with_auxdata() will invoke this function rather than | ||
1050 | upcalling to /sbin/request-key to operate upon a key of this type. | ||
1051 | |||
1052 | The aux parameter is as passed to request_key_with_auxdata() or is NULL | ||
1053 | otherwise. Also passed are the key to be operated upon, the | ||
1054 | authorisation key for this operation and the operation type (currently | ||
1055 | only "create"). | ||
1056 | |||
1057 | This function should return only when the upcall is complete. Upon return | ||
1058 | the authorisation key will be revoked, and the target key will be | ||
1059 | negatively instantiated if it is still uninstantiated. The error will be | ||
1060 | returned to the caller of request_key*(). | ||
1061 | |||
1062 | |||
1034 | ============================ | 1063 | ============================ |
1035 | REQUEST-KEY CALLBACK SERVICE | 1064 | REQUEST-KEY CALLBACK SERVICE |
1036 | ============================ | 1065 | ============================ |
diff --git a/Documentation/watchdog/pcwd-watchdog.txt b/Documentation/watchdog/pcwd-watchdog.txt index 12187a33e310..d9ee6336c1d4 100644 --- a/Documentation/watchdog/pcwd-watchdog.txt +++ b/Documentation/watchdog/pcwd-watchdog.txt | |||
@@ -22,78 +22,9 @@ | |||
22 | to run the program with an "&" to run it in the background!) | 22 | to run the program with an "&" to run it in the background!) |
23 | 23 | ||
24 | If you want to write a program to be compatible with the PC Watchdog | 24 | If you want to write a program to be compatible with the PC Watchdog |
25 | driver, simply do the following: | 25 | driver, simply use of modify the watchdog test program: |
26 | 26 | Documentation/watchdog/src/watchdog-test.c | |
27 | -- Snippet of code -- | 27 | |
28 | /* | ||
29 | * Watchdog Driver Test Program | ||
30 | */ | ||
31 | |||
32 | #include <stdio.h> | ||
33 | #include <stdlib.h> | ||
34 | #include <string.h> | ||
35 | #include <unistd.h> | ||
36 | #include <fcntl.h> | ||
37 | #include <sys/ioctl.h> | ||
38 | #include <linux/types.h> | ||
39 | #include <linux/watchdog.h> | ||
40 | |||
41 | int fd; | ||
42 | |||
43 | /* | ||
44 | * This function simply sends an IOCTL to the driver, which in turn ticks | ||
45 | * the PC Watchdog card to reset its internal timer so it doesn't trigger | ||
46 | * a computer reset. | ||
47 | */ | ||
48 | void keep_alive(void) | ||
49 | { | ||
50 | int dummy; | ||
51 | |||
52 | ioctl(fd, WDIOC_KEEPALIVE, &dummy); | ||
53 | } | ||
54 | |||
55 | /* | ||
56 | * The main program. Run the program with "-d" to disable the card, | ||
57 | * or "-e" to enable the card. | ||
58 | */ | ||
59 | int main(int argc, char *argv[]) | ||
60 | { | ||
61 | fd = open("/dev/watchdog", O_WRONLY); | ||
62 | |||
63 | if (fd == -1) { | ||
64 | fprintf(stderr, "Watchdog device not enabled.\n"); | ||
65 | fflush(stderr); | ||
66 | exit(-1); | ||
67 | } | ||
68 | |||
69 | if (argc > 1) { | ||
70 | if (!strncasecmp(argv[1], "-d", 2)) { | ||
71 | ioctl(fd, WDIOC_SETOPTIONS, WDIOS_DISABLECARD); | ||
72 | fprintf(stderr, "Watchdog card disabled.\n"); | ||
73 | fflush(stderr); | ||
74 | exit(0); | ||
75 | } else if (!strncasecmp(argv[1], "-e", 2)) { | ||
76 | ioctl(fd, WDIOC_SETOPTIONS, WDIOS_ENABLECARD); | ||
77 | fprintf(stderr, "Watchdog card enabled.\n"); | ||
78 | fflush(stderr); | ||
79 | exit(0); | ||
80 | } else { | ||
81 | fprintf(stderr, "-d to disable, -e to enable.\n"); | ||
82 | fprintf(stderr, "run by itself to tick the card.\n"); | ||
83 | fflush(stderr); | ||
84 | exit(0); | ||
85 | } | ||
86 | } else { | ||
87 | fprintf(stderr, "Watchdog Ticking Away!\n"); | ||
88 | fflush(stderr); | ||
89 | } | ||
90 | |||
91 | while(1) { | ||
92 | keep_alive(); | ||
93 | sleep(1); | ||
94 | } | ||
95 | } | ||
96 | -- End snippet -- | ||
97 | 28 | ||
98 | Other IOCTL functions include: | 29 | Other IOCTL functions include: |
99 | 30 | ||
diff --git a/Documentation/watchdog/src/watchdog-simple.c b/Documentation/watchdog/src/watchdog-simple.c new file mode 100644 index 000000000000..85cf17c48669 --- /dev/null +++ b/Documentation/watchdog/src/watchdog-simple.c | |||
@@ -0,0 +1,15 @@ | |||
1 | #include <stdlib.h> | ||
2 | #include <fcntl.h> | ||
3 | |||
4 | int main(int argc, const char *argv[]) { | ||
5 | int fd = open("/dev/watchdog", O_WRONLY); | ||
6 | if (fd == -1) { | ||
7 | perror("watchdog"); | ||
8 | exit(1); | ||
9 | } | ||
10 | while (1) { | ||
11 | write(fd, "\0", 1); | ||
12 | fsync(fd); | ||
13 | sleep(10); | ||
14 | } | ||
15 | } | ||
diff --git a/Documentation/watchdog/src/watchdog-test.c b/Documentation/watchdog/src/watchdog-test.c new file mode 100644 index 000000000000..65f6c19cb865 --- /dev/null +++ b/Documentation/watchdog/src/watchdog-test.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* | ||
2 | * Watchdog Driver Test Program | ||
3 | */ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include <string.h> | ||
8 | #include <unistd.h> | ||
9 | #include <fcntl.h> | ||
10 | #include <sys/ioctl.h> | ||
11 | #include <linux/types.h> | ||
12 | #include <linux/watchdog.h> | ||
13 | |||
14 | int fd; | ||
15 | |||
16 | /* | ||
17 | * This function simply sends an IOCTL to the driver, which in turn ticks | ||
18 | * the PC Watchdog card to reset its internal timer so it doesn't trigger | ||
19 | * a computer reset. | ||
20 | */ | ||
21 | void keep_alive(void) | ||
22 | { | ||
23 | int dummy; | ||
24 | |||
25 | ioctl(fd, WDIOC_KEEPALIVE, &dummy); | ||
26 | } | ||
27 | |||
28 | /* | ||
29 | * The main program. Run the program with "-d" to disable the card, | ||
30 | * or "-e" to enable the card. | ||
31 | */ | ||
32 | int main(int argc, char *argv[]) | ||
33 | { | ||
34 | fd = open("/dev/watchdog", O_WRONLY); | ||
35 | |||
36 | if (fd == -1) { | ||
37 | fprintf(stderr, "Watchdog device not enabled.\n"); | ||
38 | fflush(stderr); | ||
39 | exit(-1); | ||
40 | } | ||
41 | |||
42 | if (argc > 1) { | ||
43 | if (!strncasecmp(argv[1], "-d", 2)) { | ||
44 | ioctl(fd, WDIOC_SETOPTIONS, WDIOS_DISABLECARD); | ||
45 | fprintf(stderr, "Watchdog card disabled.\n"); | ||
46 | fflush(stderr); | ||
47 | exit(0); | ||
48 | } else if (!strncasecmp(argv[1], "-e", 2)) { | ||
49 | ioctl(fd, WDIOC_SETOPTIONS, WDIOS_ENABLECARD); | ||
50 | fprintf(stderr, "Watchdog card enabled.\n"); | ||
51 | fflush(stderr); | ||
52 | exit(0); | ||
53 | } else { | ||
54 | fprintf(stderr, "-d to disable, -e to enable.\n"); | ||
55 | fprintf(stderr, "run by itself to tick the card.\n"); | ||
56 | fflush(stderr); | ||
57 | exit(0); | ||
58 | } | ||
59 | } else { | ||
60 | fprintf(stderr, "Watchdog Ticking Away!\n"); | ||
61 | fflush(stderr); | ||
62 | } | ||
63 | |||
64 | while(1) { | ||
65 | keep_alive(); | ||
66 | sleep(1); | ||
67 | } | ||
68 | } | ||
diff --git a/Documentation/watchdog/watchdog-api.txt b/Documentation/watchdog/watchdog-api.txt index 21ed51173662..958ff3d48be3 100644 --- a/Documentation/watchdog/watchdog-api.txt +++ b/Documentation/watchdog/watchdog-api.txt | |||
@@ -34,22 +34,7 @@ activates as soon as /dev/watchdog is opened and will reboot unless | |||
34 | the watchdog is pinged within a certain time, this time is called the | 34 | the watchdog is pinged within a certain time, this time is called the |
35 | timeout or margin. The simplest way to ping the watchdog is to write | 35 | timeout or margin. The simplest way to ping the watchdog is to write |
36 | some data to the device. So a very simple watchdog daemon would look | 36 | some data to the device. So a very simple watchdog daemon would look |
37 | like this: | 37 | like this source file: see Documentation/watchdog/src/watchdog-simple.c |
38 | |||
39 | #include <stdlib.h> | ||
40 | #include <fcntl.h> | ||
41 | |||
42 | int main(int argc, const char *argv[]) { | ||
43 | int fd=open("/dev/watchdog",O_WRONLY); | ||
44 | if (fd==-1) { | ||
45 | perror("watchdog"); | ||
46 | exit(1); | ||
47 | } | ||
48 | while(1) { | ||
49 | write(fd, "\0", 1); | ||
50 | sleep(10); | ||
51 | } | ||
52 | } | ||
53 | 38 | ||
54 | A more advanced driver could for example check that a HTTP server is | 39 | A more advanced driver could for example check that a HTTP server is |
55 | still responding before doing the write call to ping the watchdog. | 40 | still responding before doing the write call to ping the watchdog. |
@@ -110,7 +95,40 @@ current timeout using the GETTIMEOUT ioctl. | |||
110 | ioctl(fd, WDIOC_GETTIMEOUT, &timeout); | 95 | ioctl(fd, WDIOC_GETTIMEOUT, &timeout); |
111 | printf("The timeout was is %d seconds\n", timeout); | 96 | printf("The timeout was is %d seconds\n", timeout); |
112 | 97 | ||
113 | Envinronmental monitoring: | 98 | Pretimeouts: |
99 | |||
100 | Some watchdog timers can be set to have a trigger go off before the | ||
101 | actual time they will reset the system. This can be done with an NMI, | ||
102 | interrupt, or other mechanism. This allows Linux to record useful | ||
103 | information (like panic information and kernel coredumps) before it | ||
104 | resets. | ||
105 | |||
106 | pretimeout = 10; | ||
107 | ioctl(fd, WDIOC_SETPRETIMEOUT, &pretimeout); | ||
108 | |||
109 | Note that the pretimeout is the number of seconds before the time | ||
110 | when the timeout will go off. It is not the number of seconds until | ||
111 | the pretimeout. So, for instance, if you set the timeout to 60 seconds | ||
112 | and the pretimeout to 10 seconds, the pretimout will go of in 50 | ||
113 | seconds. Setting a pretimeout to zero disables it. | ||
114 | |||
115 | There is also a get function for getting the pretimeout: | ||
116 | |||
117 | ioctl(fd, WDIOC_GETPRETIMEOUT, &timeout); | ||
118 | printf("The pretimeout was is %d seconds\n", timeout); | ||
119 | |||
120 | Not all watchdog drivers will support a pretimeout. | ||
121 | |||
122 | Get the number of seconds before reboot: | ||
123 | |||
124 | Some watchdog drivers have the ability to report the remaining time | ||
125 | before the system will reboot. The WDIOC_GETTIMELEFT is the ioctl | ||
126 | that returns the number of seconds before reboot. | ||
127 | |||
128 | ioctl(fd, WDIOC_GETTIMELEFT, &timeleft); | ||
129 | printf("The timeout was is %d seconds\n", timeleft); | ||
130 | |||
131 | Environmental monitoring: | ||
114 | 132 | ||
115 | All watchdog drivers are required return more information about the system, | 133 | All watchdog drivers are required return more information about the system, |
116 | some do temperature, fan and power level monitoring, some can tell you | 134 | some do temperature, fan and power level monitoring, some can tell you |
@@ -169,6 +187,10 @@ The watchdog saw a keepalive ping since it was last queried. | |||
169 | 187 | ||
170 | WDIOF_SETTIMEOUT Can set/get the timeout | 188 | WDIOF_SETTIMEOUT Can set/get the timeout |
171 | 189 | ||
190 | The watchdog can do pretimeouts. | ||
191 | |||
192 | WDIOF_PRETIMEOUT Pretimeout (in seconds), get/set | ||
193 | |||
172 | 194 | ||
173 | For those drivers that return any bits set in the option field, the | 195 | For those drivers that return any bits set in the option field, the |
174 | GETSTATUS and GETBOOTSTATUS ioctls can be used to ask for the current | 196 | GETSTATUS and GETBOOTSTATUS ioctls can be used to ask for the current |
diff --git a/Documentation/watchdog/watchdog.txt b/Documentation/watchdog/watchdog.txt index dffda29c8799..4b1ff69cc19a 100644 --- a/Documentation/watchdog/watchdog.txt +++ b/Documentation/watchdog/watchdog.txt | |||
@@ -65,28 +65,7 @@ The external event interfaces on the WDT boards are not currently supported. | |||
65 | Minor numbers are however allocated for it. | 65 | Minor numbers are however allocated for it. |
66 | 66 | ||
67 | 67 | ||
68 | Example Watchdog Driver | 68 | Example Watchdog Driver: see Documentation/watchdog/src/watchdog-simple.c |
69 | ----------------------- | ||
70 | |||
71 | #include <stdio.h> | ||
72 | #include <unistd.h> | ||
73 | #include <fcntl.h> | ||
74 | |||
75 | int main(int argc, const char *argv[]) | ||
76 | { | ||
77 | int fd=open("/dev/watchdog",O_WRONLY); | ||
78 | if(fd==-1) | ||
79 | { | ||
80 | perror("watchdog"); | ||
81 | exit(1); | ||
82 | } | ||
83 | while(1) | ||
84 | { | ||
85 | write(fd,"\0",1); | ||
86 | fsync(fd); | ||
87 | sleep(10); | ||
88 | } | ||
89 | } | ||
90 | 69 | ||
91 | 70 | ||
92 | Contact Information | 71 | Contact Information |
diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c index da677f829f76..63af36cf7f6e 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c | |||
@@ -49,15 +49,15 @@ select_smp_affinity(unsigned int irq) | |||
49 | static int last_cpu; | 49 | static int last_cpu; |
50 | int cpu = last_cpu + 1; | 50 | int cpu = last_cpu + 1; |
51 | 51 | ||
52 | if (!irq_desc[irq].handler->set_affinity || irq_user_affinity[irq]) | 52 | if (!irq_desc[irq].chip->set_affinity || irq_user_affinity[irq]) |
53 | return 1; | 53 | return 1; |
54 | 54 | ||
55 | while (!cpu_possible(cpu)) | 55 | while (!cpu_possible(cpu)) |
56 | cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0); | 56 | cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0); |
57 | last_cpu = cpu; | 57 | last_cpu = cpu; |
58 | 58 | ||
59 | irq_affinity[irq] = cpumask_of_cpu(cpu); | 59 | irq_desc[irq].affinity = cpumask_of_cpu(cpu); |
60 | irq_desc[irq].handler->set_affinity(irq, cpumask_of_cpu(cpu)); | 60 | irq_desc[irq].chip->set_affinity(irq, cpumask_of_cpu(cpu)); |
61 | return 0; | 61 | return 0; |
62 | } | 62 | } |
63 | #endif /* CONFIG_SMP */ | 63 | #endif /* CONFIG_SMP */ |
@@ -93,7 +93,7 @@ show_interrupts(struct seq_file *p, void *v) | |||
93 | for_each_online_cpu(j) | 93 | for_each_online_cpu(j) |
94 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[irq]); | 94 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[irq]); |
95 | #endif | 95 | #endif |
96 | seq_printf(p, " %14s", irq_desc[irq].handler->typename); | 96 | seq_printf(p, " %14s", irq_desc[irq].chip->typename); |
97 | seq_printf(p, " %c%s", | 97 | seq_printf(p, " %c%s", |
98 | (action->flags & SA_INTERRUPT)?'+':' ', | 98 | (action->flags & SA_INTERRUPT)?'+':' ', |
99 | action->name); | 99 | action->name); |
diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c index 9d34ce26e5ef..f20f2dff9c43 100644 --- a/arch/alpha/kernel/irq_alpha.c +++ b/arch/alpha/kernel/irq_alpha.c | |||
@@ -233,7 +233,7 @@ void __init | |||
233 | init_rtc_irq(void) | 233 | init_rtc_irq(void) |
234 | { | 234 | { |
235 | irq_desc[RTC_IRQ].status = IRQ_DISABLED; | 235 | irq_desc[RTC_IRQ].status = IRQ_DISABLED; |
236 | irq_desc[RTC_IRQ].handler = &rtc_irq_type; | 236 | irq_desc[RTC_IRQ].chip = &rtc_irq_type; |
237 | setup_irq(RTC_IRQ, &timer_irqaction); | 237 | setup_irq(RTC_IRQ, &timer_irqaction); |
238 | } | 238 | } |
239 | 239 | ||
diff --git a/arch/alpha/kernel/irq_i8259.c b/arch/alpha/kernel/irq_i8259.c index b188683b83fd..ac893bd48036 100644 --- a/arch/alpha/kernel/irq_i8259.c +++ b/arch/alpha/kernel/irq_i8259.c | |||
@@ -109,7 +109,7 @@ init_i8259a_irqs(void) | |||
109 | 109 | ||
110 | for (i = 0; i < 16; i++) { | 110 | for (i = 0; i < 16; i++) { |
111 | irq_desc[i].status = IRQ_DISABLED; | 111 | irq_desc[i].status = IRQ_DISABLED; |
112 | irq_desc[i].handler = &i8259a_irq_type; | 112 | irq_desc[i].chip = &i8259a_irq_type; |
113 | } | 113 | } |
114 | 114 | ||
115 | setup_irq(2, &cascade); | 115 | setup_irq(2, &cascade); |
diff --git a/arch/alpha/kernel/irq_pyxis.c b/arch/alpha/kernel/irq_pyxis.c index 146a20b9e3d5..3b581415bab0 100644 --- a/arch/alpha/kernel/irq_pyxis.c +++ b/arch/alpha/kernel/irq_pyxis.c | |||
@@ -120,7 +120,7 @@ init_pyxis_irqs(unsigned long ignore_mask) | |||
120 | if ((ignore_mask >> i) & 1) | 120 | if ((ignore_mask >> i) & 1) |
121 | continue; | 121 | continue; |
122 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | 122 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; |
123 | irq_desc[i].handler = &pyxis_irq_type; | 123 | irq_desc[i].chip = &pyxis_irq_type; |
124 | } | 124 | } |
125 | 125 | ||
126 | setup_irq(16+7, &isa_cascade_irqaction); | 126 | setup_irq(16+7, &isa_cascade_irqaction); |
diff --git a/arch/alpha/kernel/irq_srm.c b/arch/alpha/kernel/irq_srm.c index 0a87e466918c..8e4d121f84cc 100644 --- a/arch/alpha/kernel/irq_srm.c +++ b/arch/alpha/kernel/irq_srm.c | |||
@@ -67,7 +67,7 @@ init_srm_irqs(long max, unsigned long ignore_mask) | |||
67 | if (i < 64 && ((ignore_mask >> i) & 1)) | 67 | if (i < 64 && ((ignore_mask >> i) & 1)) |
68 | continue; | 68 | continue; |
69 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | 69 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; |
70 | irq_desc[i].handler = &srm_irq_type; | 70 | irq_desc[i].chip = &srm_irq_type; |
71 | } | 71 | } |
72 | } | 72 | } |
73 | 73 | ||
diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index 2a8b364c822e..4ea6711e55aa 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c | |||
@@ -124,12 +124,12 @@ DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_final); | |||
124 | 124 | ||
125 | void | 125 | void |
126 | pcibios_align_resource(void *data, struct resource *res, | 126 | pcibios_align_resource(void *data, struct resource *res, |
127 | unsigned long size, unsigned long align) | 127 | resource_size_t size, resource_size_t align) |
128 | { | 128 | { |
129 | struct pci_dev *dev = data; | 129 | struct pci_dev *dev = data; |
130 | struct pci_controller *hose = dev->sysdata; | 130 | struct pci_controller *hose = dev->sysdata; |
131 | unsigned long alignto; | 131 | unsigned long alignto; |
132 | unsigned long start = res->start; | 132 | resource_size_t start = res->start; |
133 | 133 | ||
134 | if (res->flags & IORESOURCE_IO) { | 134 | if (res->flags & IORESOURCE_IO) { |
135 | /* Make sure we start at our min on all hoses */ | 135 | /* Make sure we start at our min on all hoses */ |
diff --git a/arch/alpha/kernel/sys_alcor.c b/arch/alpha/kernel/sys_alcor.c index d7f0e97fe56f..1a1a2c7a3d94 100644 --- a/arch/alpha/kernel/sys_alcor.c +++ b/arch/alpha/kernel/sys_alcor.c | |||
@@ -144,7 +144,7 @@ alcor_init_irq(void) | |||
144 | if (i >= 16+20 && i <= 16+30) | 144 | if (i >= 16+20 && i <= 16+30) |
145 | continue; | 145 | continue; |
146 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | 146 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; |
147 | irq_desc[i].handler = &alcor_irq_type; | 147 | irq_desc[i].chip = &alcor_irq_type; |
148 | } | 148 | } |
149 | i8259a_irq_type.ack = alcor_isa_mask_and_ack_irq; | 149 | i8259a_irq_type.ack = alcor_isa_mask_and_ack_irq; |
150 | 150 | ||
diff --git a/arch/alpha/kernel/sys_cabriolet.c b/arch/alpha/kernel/sys_cabriolet.c index 8e3374d34c95..8c9e443d93ad 100644 --- a/arch/alpha/kernel/sys_cabriolet.c +++ b/arch/alpha/kernel/sys_cabriolet.c | |||
@@ -124,7 +124,7 @@ common_init_irq(void (*srm_dev_int)(unsigned long v, struct pt_regs *r)) | |||
124 | 124 | ||
125 | for (i = 16; i < 35; ++i) { | 125 | for (i = 16; i < 35; ++i) { |
126 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | 126 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; |
127 | irq_desc[i].handler = &cabriolet_irq_type; | 127 | irq_desc[i].chip = &cabriolet_irq_type; |
128 | } | 128 | } |
129 | } | 129 | } |
130 | 130 | ||
diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c index d5da6b1b28ee..b28c8f1c6e10 100644 --- a/arch/alpha/kernel/sys_dp264.c +++ b/arch/alpha/kernel/sys_dp264.c | |||
@@ -300,7 +300,7 @@ init_tsunami_irqs(struct hw_interrupt_type * ops, int imin, int imax) | |||
300 | long i; | 300 | long i; |
301 | for (i = imin; i <= imax; ++i) { | 301 | for (i = imin; i <= imax; ++i) { |
302 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | 302 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; |
303 | irq_desc[i].handler = ops; | 303 | irq_desc[i].chip = ops; |
304 | } | 304 | } |
305 | } | 305 | } |
306 | 306 | ||
diff --git a/arch/alpha/kernel/sys_eb64p.c b/arch/alpha/kernel/sys_eb64p.c index 61a79c354f0b..aeb8e0277905 100644 --- a/arch/alpha/kernel/sys_eb64p.c +++ b/arch/alpha/kernel/sys_eb64p.c | |||
@@ -137,7 +137,7 @@ eb64p_init_irq(void) | |||
137 | 137 | ||
138 | for (i = 16; i < 32; ++i) { | 138 | for (i = 16; i < 32; ++i) { |
139 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | 139 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; |
140 | irq_desc[i].handler = &eb64p_irq_type; | 140 | irq_desc[i].chip = &eb64p_irq_type; |
141 | } | 141 | } |
142 | 142 | ||
143 | common_init_isa_dma(); | 143 | common_init_isa_dma(); |
diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c index bd6e5f0e43c7..64a785baf53a 100644 --- a/arch/alpha/kernel/sys_eiger.c +++ b/arch/alpha/kernel/sys_eiger.c | |||
@@ -154,7 +154,7 @@ eiger_init_irq(void) | |||
154 | 154 | ||
155 | for (i = 16; i < 128; ++i) { | 155 | for (i = 16; i < 128; ++i) { |
156 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | 156 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; |
157 | irq_desc[i].handler = &eiger_irq_type; | 157 | irq_desc[i].chip = &eiger_irq_type; |
158 | } | 158 | } |
159 | } | 159 | } |
160 | 160 | ||
diff --git a/arch/alpha/kernel/sys_jensen.c b/arch/alpha/kernel/sys_jensen.c index fcabb7c96a16..0148e095638f 100644 --- a/arch/alpha/kernel/sys_jensen.c +++ b/arch/alpha/kernel/sys_jensen.c | |||
@@ -206,11 +206,11 @@ jensen_init_irq(void) | |||
206 | { | 206 | { |
207 | init_i8259a_irqs(); | 207 | init_i8259a_irqs(); |
208 | 208 | ||
209 | irq_desc[1].handler = &jensen_local_irq_type; | 209 | irq_desc[1].chip = &jensen_local_irq_type; |
210 | irq_desc[4].handler = &jensen_local_irq_type; | 210 | irq_desc[4].chip = &jensen_local_irq_type; |
211 | irq_desc[3].handler = &jensen_local_irq_type; | 211 | irq_desc[3].chip = &jensen_local_irq_type; |
212 | irq_desc[7].handler = &jensen_local_irq_type; | 212 | irq_desc[7].chip = &jensen_local_irq_type; |
213 | irq_desc[9].handler = &jensen_local_irq_type; | 213 | irq_desc[9].chip = &jensen_local_irq_type; |
214 | 214 | ||
215 | common_init_isa_dma(); | 215 | common_init_isa_dma(); |
216 | } | 216 | } |
diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index e32fee505220..36d215954376 100644 --- a/arch/alpha/kernel/sys_marvel.c +++ b/arch/alpha/kernel/sys_marvel.c | |||
@@ -303,7 +303,7 @@ init_io7_irqs(struct io7 *io7, | |||
303 | /* Set up the lsi irqs. */ | 303 | /* Set up the lsi irqs. */ |
304 | for (i = 0; i < 128; ++i) { | 304 | for (i = 0; i < 128; ++i) { |
305 | irq_desc[base + i].status = IRQ_DISABLED | IRQ_LEVEL; | 305 | irq_desc[base + i].status = IRQ_DISABLED | IRQ_LEVEL; |
306 | irq_desc[base + i].handler = lsi_ops; | 306 | irq_desc[base + i].chip = lsi_ops; |
307 | } | 307 | } |
308 | 308 | ||
309 | /* Disable the implemented irqs in hardware. */ | 309 | /* Disable the implemented irqs in hardware. */ |
@@ -317,7 +317,7 @@ init_io7_irqs(struct io7 *io7, | |||
317 | /* Set up the msi irqs. */ | 317 | /* Set up the msi irqs. */ |
318 | for (i = 128; i < (128 + 512); ++i) { | 318 | for (i = 128; i < (128 + 512); ++i) { |
319 | irq_desc[base + i].status = IRQ_DISABLED | IRQ_LEVEL; | 319 | irq_desc[base + i].status = IRQ_DISABLED | IRQ_LEVEL; |
320 | irq_desc[base + i].handler = msi_ops; | 320 | irq_desc[base + i].chip = msi_ops; |
321 | } | 321 | } |
322 | 322 | ||
323 | for (i = 0; i < 16; ++i) | 323 | for (i = 0; i < 16; ++i) |
@@ -335,7 +335,7 @@ marvel_init_irq(void) | |||
335 | /* Reserve the legacy irqs. */ | 335 | /* Reserve the legacy irqs. */ |
336 | for (i = 0; i < 16; ++i) { | 336 | for (i = 0; i < 16; ++i) { |
337 | irq_desc[i].status = IRQ_DISABLED; | 337 | irq_desc[i].status = IRQ_DISABLED; |
338 | irq_desc[i].handler = &marvel_legacy_irq_type; | 338 | irq_desc[i].chip = &marvel_legacy_irq_type; |
339 | } | 339 | } |
340 | 340 | ||
341 | /* Init the io7 irqs. */ | 341 | /* Init the io7 irqs. */ |
diff --git a/arch/alpha/kernel/sys_mikasa.c b/arch/alpha/kernel/sys_mikasa.c index d78a0daa6168..b741600e3761 100644 --- a/arch/alpha/kernel/sys_mikasa.c +++ b/arch/alpha/kernel/sys_mikasa.c | |||
@@ -117,7 +117,7 @@ mikasa_init_irq(void) | |||
117 | 117 | ||
118 | for (i = 16; i < 32; ++i) { | 118 | for (i = 16; i < 32; ++i) { |
119 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | 119 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; |
120 | irq_desc[i].handler = &mikasa_irq_type; | 120 | irq_desc[i].chip = &mikasa_irq_type; |
121 | } | 121 | } |
122 | 122 | ||
123 | init_i8259a_irqs(); | 123 | init_i8259a_irqs(); |
diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c index 65061f5d7410..55db02d318d7 100644 --- a/arch/alpha/kernel/sys_noritake.c +++ b/arch/alpha/kernel/sys_noritake.c | |||
@@ -139,7 +139,7 @@ noritake_init_irq(void) | |||
139 | 139 | ||
140 | for (i = 16; i < 48; ++i) { | 140 | for (i = 16; i < 48; ++i) { |
141 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | 141 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; |
142 | irq_desc[i].handler = &noritake_irq_type; | 142 | irq_desc[i].chip = &noritake_irq_type; |
143 | } | 143 | } |
144 | 144 | ||
145 | init_i8259a_irqs(); | 145 | init_i8259a_irqs(); |
diff --git a/arch/alpha/kernel/sys_rawhide.c b/arch/alpha/kernel/sys_rawhide.c index 05888a02a604..949607e3d6fb 100644 --- a/arch/alpha/kernel/sys_rawhide.c +++ b/arch/alpha/kernel/sys_rawhide.c | |||
@@ -180,7 +180,7 @@ rawhide_init_irq(void) | |||
180 | 180 | ||
181 | for (i = 16; i < 128; ++i) { | 181 | for (i = 16; i < 128; ++i) { |
182 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | 182 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; |
183 | irq_desc[i].handler = &rawhide_irq_type; | 183 | irq_desc[i].chip = &rawhide_irq_type; |
184 | } | 184 | } |
185 | 185 | ||
186 | init_i8259a_irqs(); | 186 | init_i8259a_irqs(); |
diff --git a/arch/alpha/kernel/sys_rx164.c b/arch/alpha/kernel/sys_rx164.c index 58404243057b..6ae506052635 100644 --- a/arch/alpha/kernel/sys_rx164.c +++ b/arch/alpha/kernel/sys_rx164.c | |||
@@ -117,7 +117,7 @@ rx164_init_irq(void) | |||
117 | rx164_update_irq_hw(0); | 117 | rx164_update_irq_hw(0); |
118 | for (i = 16; i < 40; ++i) { | 118 | for (i = 16; i < 40; ++i) { |
119 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | 119 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; |
120 | irq_desc[i].handler = &rx164_irq_type; | 120 | irq_desc[i].chip = &rx164_irq_type; |
121 | } | 121 | } |
122 | 122 | ||
123 | init_i8259a_irqs(); | 123 | init_i8259a_irqs(); |
diff --git a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c index a7ff84474ace..24dea40c9bfe 100644 --- a/arch/alpha/kernel/sys_sable.c +++ b/arch/alpha/kernel/sys_sable.c | |||
@@ -537,7 +537,7 @@ sable_lynx_init_irq(int nr_irqs) | |||
537 | 537 | ||
538 | for (i = 0; i < nr_irqs; ++i) { | 538 | for (i = 0; i < nr_irqs; ++i) { |
539 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | 539 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; |
540 | irq_desc[i].handler = &sable_lynx_irq_type; | 540 | irq_desc[i].chip = &sable_lynx_irq_type; |
541 | } | 541 | } |
542 | 542 | ||
543 | common_init_isa_dma(); | 543 | common_init_isa_dma(); |
diff --git a/arch/alpha/kernel/sys_takara.c b/arch/alpha/kernel/sys_takara.c index 7955bdfc2db0..2c75cd1fd81a 100644 --- a/arch/alpha/kernel/sys_takara.c +++ b/arch/alpha/kernel/sys_takara.c | |||
@@ -154,7 +154,7 @@ takara_init_irq(void) | |||
154 | 154 | ||
155 | for (i = 16; i < 128; ++i) { | 155 | for (i = 16; i < 128; ++i) { |
156 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | 156 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; |
157 | irq_desc[i].handler = &takara_irq_type; | 157 | irq_desc[i].chip = &takara_irq_type; |
158 | } | 158 | } |
159 | 159 | ||
160 | common_init_isa_dma(); | 160 | common_init_isa_dma(); |
diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index 2551fb49ae09..13f3ed8ed7ac 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c | |||
@@ -189,7 +189,7 @@ init_titan_irqs(struct hw_interrupt_type * ops, int imin, int imax) | |||
189 | long i; | 189 | long i; |
190 | for (i = imin; i <= imax; ++i) { | 190 | for (i = imin; i <= imax; ++i) { |
191 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | 191 | irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; |
192 | irq_desc[i].handler = ops; | 192 | irq_desc[i].chip = ops; |
193 | } | 193 | } |
194 | } | 194 | } |
195 | 195 | ||
diff --git a/arch/alpha/kernel/sys_wildfire.c b/arch/alpha/kernel/sys_wildfire.c index 1553f470246e..22c5798fe083 100644 --- a/arch/alpha/kernel/sys_wildfire.c +++ b/arch/alpha/kernel/sys_wildfire.c | |||
@@ -199,14 +199,14 @@ wildfire_init_irq_per_pca(int qbbno, int pcano) | |||
199 | if (i == 2) | 199 | if (i == 2) |
200 | continue; | 200 | continue; |
201 | irq_desc[i+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; | 201 | irq_desc[i+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; |
202 | irq_desc[i+irq_bias].handler = &wildfire_irq_type; | 202 | irq_desc[i+irq_bias].chip = &wildfire_irq_type; |
203 | } | 203 | } |
204 | 204 | ||
205 | irq_desc[36+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; | 205 | irq_desc[36+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; |
206 | irq_desc[36+irq_bias].handler = &wildfire_irq_type; | 206 | irq_desc[36+irq_bias].chip = &wildfire_irq_type; |
207 | for (i = 40; i < 64; ++i) { | 207 | for (i = 40; i < 64; ++i) { |
208 | irq_desc[i+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; | 208 | irq_desc[i+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; |
209 | irq_desc[i+irq_bias].handler = &wildfire_irq_type; | 209 | irq_desc[i+irq_bias].chip = &wildfire_irq_type; |
210 | } | 210 | } |
211 | 211 | ||
212 | setup_irq(32+irq_bias, &isa_enable); | 212 | setup_irq(32+irq_bias, &isa_enable); |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 3d1a3fb7d5fc..f123c7c9fc98 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -188,23 +188,27 @@ config ARCH_IMX | |||
188 | 188 | ||
189 | config ARCH_IOP3XX | 189 | config ARCH_IOP3XX |
190 | bool "IOP3xx-based" | 190 | bool "IOP3xx-based" |
191 | depends on MMU | ||
191 | select PCI | 192 | select PCI |
192 | help | 193 | help |
193 | Support for Intel's IOP3XX (XScale) family of processors. | 194 | Support for Intel's IOP3XX (XScale) family of processors. |
194 | 195 | ||
195 | config ARCH_IXP4XX | 196 | config ARCH_IXP4XX |
196 | bool "IXP4xx-based" | 197 | bool "IXP4xx-based" |
198 | depends on MMU | ||
197 | help | 199 | help |
198 | Support for Intel's IXP4XX (XScale) family of processors. | 200 | Support for Intel's IXP4XX (XScale) family of processors. |
199 | 201 | ||
200 | config ARCH_IXP2000 | 202 | config ARCH_IXP2000 |
201 | bool "IXP2400/2800-based" | 203 | bool "IXP2400/2800-based" |
204 | depends on MMU | ||
202 | select PCI | 205 | select PCI |
203 | help | 206 | help |
204 | Support for Intel's IXP2400/2800 (XScale) family of processors. | 207 | Support for Intel's IXP2400/2800 (XScale) family of processors. |
205 | 208 | ||
206 | config ARCH_IXP23XX | 209 | config ARCH_IXP23XX |
207 | bool "IXP23XX-based" | 210 | bool "IXP23XX-based" |
211 | depends on MMU | ||
208 | select PCI | 212 | select PCI |
209 | help | 213 | help |
210 | Support for Intel's IXP23xx (XScale) family of processors. | 214 | Support for Intel's IXP23xx (XScale) family of processors. |
@@ -229,6 +233,7 @@ config ARCH_PNX4008 | |||
229 | 233 | ||
230 | config ARCH_PXA | 234 | config ARCH_PXA |
231 | bool "PXA2xx-based" | 235 | bool "PXA2xx-based" |
236 | depends on MMU | ||
232 | select ARCH_MTD_XIP | 237 | select ARCH_MTD_XIP |
233 | help | 238 | help |
234 | Support for Intel's PXA2XX processor line. | 239 | Support for Intel's PXA2XX processor line. |
@@ -339,6 +344,10 @@ config XSCALE_PMU | |||
339 | depends on CPU_XSCALE && !XSCALE_PMU_TIMER | 344 | depends on CPU_XSCALE && !XSCALE_PMU_TIMER |
340 | default y | 345 | default y |
341 | 346 | ||
347 | if !MMU | ||
348 | source "arch/arm/Kconfig-nommu" | ||
349 | endif | ||
350 | |||
342 | endmenu | 351 | endmenu |
343 | 352 | ||
344 | source "arch/arm/common/Kconfig" | 353 | source "arch/arm/common/Kconfig" |
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index a601b8b55f35..7cffbaef064b 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile | |||
@@ -22,6 +22,9 @@ obj-$(CONFIG_PCI) += bios32.o | |||
22 | obj-$(CONFIG_SMP) += smp.o | 22 | obj-$(CONFIG_SMP) += smp.o |
23 | obj-$(CONFIG_OABI_COMPAT) += sys_oabi-compat.o | 23 | obj-$(CONFIG_OABI_COMPAT) += sys_oabi-compat.o |
24 | 24 | ||
25 | obj-$(CONFIG_CRUNCH) += crunch.o crunch-bits.o | ||
26 | AFLAGS_crunch-bits.o := -Wa,-mcpu=ep9312 | ||
27 | |||
25 | obj-$(CONFIG_IWMMXT) += iwmmxt.o | 28 | obj-$(CONFIG_IWMMXT) += iwmmxt.o |
26 | AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt | 29 | AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt |
27 | 30 | ||
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index c49b5d4d7fca..da69e660574b 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c | |||
@@ -109,11 +109,13 @@ EXPORT_SYMBOL(memchr); | |||
109 | EXPORT_SYMBOL(__memzero); | 109 | EXPORT_SYMBOL(__memzero); |
110 | 110 | ||
111 | /* user mem (segment) */ | 111 | /* user mem (segment) */ |
112 | EXPORT_SYMBOL(__arch_copy_from_user); | 112 | EXPORT_SYMBOL(__strnlen_user); |
113 | EXPORT_SYMBOL(__arch_copy_to_user); | 113 | EXPORT_SYMBOL(__strncpy_from_user); |
114 | EXPORT_SYMBOL(__arch_clear_user); | 114 | |
115 | EXPORT_SYMBOL(__arch_strnlen_user); | 115 | #ifdef CONFIG_MMU |
116 | EXPORT_SYMBOL(__arch_strncpy_from_user); | 116 | EXPORT_SYMBOL(__copy_from_user); |
117 | EXPORT_SYMBOL(__copy_to_user); | ||
118 | EXPORT_SYMBOL(__clear_user); | ||
117 | 119 | ||
118 | EXPORT_SYMBOL(__get_user_1); | 120 | EXPORT_SYMBOL(__get_user_1); |
119 | EXPORT_SYMBOL(__get_user_2); | 121 | EXPORT_SYMBOL(__get_user_2); |
@@ -123,6 +125,7 @@ EXPORT_SYMBOL(__put_user_1); | |||
123 | EXPORT_SYMBOL(__put_user_2); | 125 | EXPORT_SYMBOL(__put_user_2); |
124 | EXPORT_SYMBOL(__put_user_4); | 126 | EXPORT_SYMBOL(__put_user_4); |
125 | EXPORT_SYMBOL(__put_user_8); | 127 | EXPORT_SYMBOL(__put_user_8); |
128 | #endif | ||
126 | 129 | ||
127 | /* crypto hash */ | 130 | /* crypto hash */ |
128 | EXPORT_SYMBOL(sha_transform); | 131 | EXPORT_SYMBOL(sha_transform); |
diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c index 396efba9bacd..447ede5143a8 100644 --- a/arch/arm/kernel/asm-offsets.c +++ b/arch/arm/kernel/asm-offsets.c | |||
@@ -60,6 +60,9 @@ int main(void) | |||
60 | #ifdef CONFIG_IWMMXT | 60 | #ifdef CONFIG_IWMMXT |
61 | DEFINE(TI_IWMMXT_STATE, offsetof(struct thread_info, fpstate.iwmmxt)); | 61 | DEFINE(TI_IWMMXT_STATE, offsetof(struct thread_info, fpstate.iwmmxt)); |
62 | #endif | 62 | #endif |
63 | #ifdef CONFIG_CRUNCH | ||
64 | DEFINE(TI_CRUNCH_STATE, offsetof(struct thread_info, crunchstate)); | ||
65 | #endif | ||
63 | BLANK(); | 66 | BLANK(); |
64 | DEFINE(S_R0, offsetof(struct pt_regs, ARM_r0)); | 67 | DEFINE(S_R0, offsetof(struct pt_regs, ARM_r0)); |
65 | DEFINE(S_R1, offsetof(struct pt_regs, ARM_r1)); | 68 | DEFINE(S_R1, offsetof(struct pt_regs, ARM_r1)); |
diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index 302fc1401547..45da06fc1ba1 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c | |||
@@ -304,7 +304,7 @@ static inline int pdev_bad_for_parity(struct pci_dev *dev) | |||
304 | static void __devinit | 304 | static void __devinit |
305 | pdev_fixup_device_resources(struct pci_sys_data *root, struct pci_dev *dev) | 305 | pdev_fixup_device_resources(struct pci_sys_data *root, struct pci_dev *dev) |
306 | { | 306 | { |
307 | unsigned long offset; | 307 | resource_size_t offset; |
308 | int i; | 308 | int i; |
309 | 309 | ||
310 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | 310 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { |
@@ -634,9 +634,9 @@ char * __init pcibios_setup(char *str) | |||
634 | * which might be mirrored at 0x0100-0x03ff.. | 634 | * which might be mirrored at 0x0100-0x03ff.. |
635 | */ | 635 | */ |
636 | void pcibios_align_resource(void *data, struct resource *res, | 636 | void pcibios_align_resource(void *data, struct resource *res, |
637 | unsigned long size, unsigned long align) | 637 | resource_size_t size, resource_size_t align) |
638 | { | 638 | { |
639 | unsigned long start = res->start; | 639 | resource_size_t start = res->start; |
640 | 640 | ||
641 | if (res->flags & IORESOURCE_IO && start & 0x300) | 641 | if (res->flags & IORESOURCE_IO && start & 0x300) |
642 | start = (start + 0x3ff) & ~0x3ff; | 642 | start = (start + 0x3ff) & ~0x3ff; |
diff --git a/arch/arm/kernel/crunch-bits.S b/arch/arm/kernel/crunch-bits.S new file mode 100644 index 000000000000..a26886758c67 --- /dev/null +++ b/arch/arm/kernel/crunch-bits.S | |||
@@ -0,0 +1,305 @@ | |||
1 | /* | ||
2 | * arch/arm/kernel/crunch-bits.S | ||
3 | * Cirrus MaverickCrunch context switching and handling | ||
4 | * | ||
5 | * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org> | ||
6 | * | ||
7 | * Shamelessly stolen from the iWMMXt code by Nicolas Pitre, which is | ||
8 | * Copyright (c) 2003-2004, MontaVista Software, Inc. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/linkage.h> | ||
16 | #include <asm/ptrace.h> | ||
17 | #include <asm/thread_info.h> | ||
18 | #include <asm/asm-offsets.h> | ||
19 | #include <asm/arch/ep93xx-regs.h> | ||
20 | |||
21 | /* | ||
22 | * We can't use hex constants here due to a bug in gas. | ||
23 | */ | ||
24 | #define CRUNCH_MVDX0 0 | ||
25 | #define CRUNCH_MVDX1 8 | ||
26 | #define CRUNCH_MVDX2 16 | ||
27 | #define CRUNCH_MVDX3 24 | ||
28 | #define CRUNCH_MVDX4 32 | ||
29 | #define CRUNCH_MVDX5 40 | ||
30 | #define CRUNCH_MVDX6 48 | ||
31 | #define CRUNCH_MVDX7 56 | ||
32 | #define CRUNCH_MVDX8 64 | ||
33 | #define CRUNCH_MVDX9 72 | ||
34 | #define CRUNCH_MVDX10 80 | ||
35 | #define CRUNCH_MVDX11 88 | ||
36 | #define CRUNCH_MVDX12 96 | ||
37 | #define CRUNCH_MVDX13 104 | ||
38 | #define CRUNCH_MVDX14 112 | ||
39 | #define CRUNCH_MVDX15 120 | ||
40 | #define CRUNCH_MVAX0L 128 | ||
41 | #define CRUNCH_MVAX0M 132 | ||
42 | #define CRUNCH_MVAX0H 136 | ||
43 | #define CRUNCH_MVAX1L 140 | ||
44 | #define CRUNCH_MVAX1M 144 | ||
45 | #define CRUNCH_MVAX1H 148 | ||
46 | #define CRUNCH_MVAX2L 152 | ||
47 | #define CRUNCH_MVAX2M 156 | ||
48 | #define CRUNCH_MVAX2H 160 | ||
49 | #define CRUNCH_MVAX3L 164 | ||
50 | #define CRUNCH_MVAX3M 168 | ||
51 | #define CRUNCH_MVAX3H 172 | ||
52 | #define CRUNCH_DSPSC 176 | ||
53 | |||
54 | #define CRUNCH_SIZE 184 | ||
55 | |||
56 | .text | ||
57 | |||
58 | /* | ||
59 | * Lazy switching of crunch coprocessor context | ||
60 | * | ||
61 | * r10 = struct thread_info pointer | ||
62 | * r9 = ret_from_exception | ||
63 | * lr = undefined instr exit | ||
64 | * | ||
65 | * called from prefetch exception handler with interrupts disabled | ||
66 | */ | ||
67 | ENTRY(crunch_task_enable) | ||
68 | ldr r8, =(EP93XX_APB_VIRT_BASE + 0x00130000) @ syscon addr | ||
69 | |||
70 | ldr r1, [r8, #0x80] | ||
71 | tst r1, #0x00800000 @ access to crunch enabled? | ||
72 | movne pc, lr @ if so no business here | ||
73 | mov r3, #0xaa @ unlock syscon swlock | ||
74 | str r3, [r8, #0xc0] | ||
75 | orr r1, r1, #0x00800000 @ enable access to crunch | ||
76 | str r1, [r8, #0x80] | ||
77 | |||
78 | ldr r3, =crunch_owner | ||
79 | add r0, r10, #TI_CRUNCH_STATE @ get task crunch save area | ||
80 | ldr r2, [sp, #60] @ current task pc value | ||
81 | ldr r1, [r3] @ get current crunch owner | ||
82 | str r0, [r3] @ this task now owns crunch | ||
83 | sub r2, r2, #4 @ adjust pc back | ||
84 | str r2, [sp, #60] | ||
85 | |||
86 | ldr r2, [r8, #0x80] | ||
87 | mov r2, r2 @ flush out enable (@@@) | ||
88 | |||
89 | teq r1, #0 @ test for last ownership | ||
90 | mov lr, r9 @ normal exit from exception | ||
91 | beq crunch_load @ no owner, skip save | ||
92 | |||
93 | crunch_save: | ||
94 | cfstr64 mvdx0, [r1, #CRUNCH_MVDX0] @ save 64b registers | ||
95 | cfstr64 mvdx1, [r1, #CRUNCH_MVDX1] | ||
96 | cfstr64 mvdx2, [r1, #CRUNCH_MVDX2] | ||
97 | cfstr64 mvdx3, [r1, #CRUNCH_MVDX3] | ||
98 | cfstr64 mvdx4, [r1, #CRUNCH_MVDX4] | ||
99 | cfstr64 mvdx5, [r1, #CRUNCH_MVDX5] | ||
100 | cfstr64 mvdx6, [r1, #CRUNCH_MVDX6] | ||
101 | cfstr64 mvdx7, [r1, #CRUNCH_MVDX7] | ||
102 | cfstr64 mvdx8, [r1, #CRUNCH_MVDX8] | ||
103 | cfstr64 mvdx9, [r1, #CRUNCH_MVDX9] | ||
104 | cfstr64 mvdx10, [r1, #CRUNCH_MVDX10] | ||
105 | cfstr64 mvdx11, [r1, #CRUNCH_MVDX11] | ||
106 | cfstr64 mvdx12, [r1, #CRUNCH_MVDX12] | ||
107 | cfstr64 mvdx13, [r1, #CRUNCH_MVDX13] | ||
108 | cfstr64 mvdx14, [r1, #CRUNCH_MVDX14] | ||
109 | cfstr64 mvdx15, [r1, #CRUNCH_MVDX15] | ||
110 | |||
111 | #ifdef __ARMEB__ | ||
112 | #error fix me for ARMEB | ||
113 | #endif | ||
114 | |||
115 | cfmv32al mvfx0, mvax0 @ save 72b accumulators | ||
116 | cfstr32 mvfx0, [r1, #CRUNCH_MVAX0L] | ||
117 | cfmv32am mvfx0, mvax0 | ||
118 | cfstr32 mvfx0, [r1, #CRUNCH_MVAX0M] | ||
119 | cfmv32ah mvfx0, mvax0 | ||
120 | cfstr32 mvfx0, [r1, #CRUNCH_MVAX0H] | ||
121 | cfmv32al mvfx0, mvax1 | ||
122 | cfstr32 mvfx0, [r1, #CRUNCH_MVAX1L] | ||
123 | cfmv32am mvfx0, mvax1 | ||
124 | cfstr32 mvfx0, [r1, #CRUNCH_MVAX1M] | ||
125 | cfmv32ah mvfx0, mvax1 | ||
126 | cfstr32 mvfx0, [r1, #CRUNCH_MVAX1H] | ||
127 | cfmv32al mvfx0, mvax2 | ||
128 | cfstr32 mvfx0, [r1, #CRUNCH_MVAX2L] | ||
129 | cfmv32am mvfx0, mvax2 | ||
130 | cfstr32 mvfx0, [r1, #CRUNCH_MVAX2M] | ||
131 | cfmv32ah mvfx0, mvax2 | ||
132 | cfstr32 mvfx0, [r1, #CRUNCH_MVAX2H] | ||
133 | cfmv32al mvfx0, mvax3 | ||
134 | cfstr32 mvfx0, [r1, #CRUNCH_MVAX3L] | ||
135 | cfmv32am mvfx0, mvax3 | ||
136 | cfstr32 mvfx0, [r1, #CRUNCH_MVAX3M] | ||
137 | cfmv32ah mvfx0, mvax3 | ||
138 | cfstr32 mvfx0, [r1, #CRUNCH_MVAX3H] | ||
139 | |||
140 | cfmv32sc mvdx0, dspsc @ save status word | ||
141 | cfstr64 mvdx0, [r1, #CRUNCH_DSPSC] | ||
142 | |||
143 | teq r0, #0 @ anything to load? | ||
144 | cfldr64eq mvdx0, [r1, #CRUNCH_MVDX0] @ mvdx0 was clobbered | ||
145 | moveq pc, lr | ||
146 | |||
147 | crunch_load: | ||
148 | cfldr64 mvdx0, [r0, #CRUNCH_DSPSC] @ load status word | ||
149 | cfmvsc32 dspsc, mvdx0 | ||
150 | |||
151 | cfldr32 mvfx0, [r0, #CRUNCH_MVAX0L] @ load 72b accumulators | ||
152 | cfmval32 mvax0, mvfx0 | ||
153 | cfldr32 mvfx0, [r0, #CRUNCH_MVAX0M] | ||
154 | cfmvam32 mvax0, mvfx0 | ||
155 | cfldr32 mvfx0, [r0, #CRUNCH_MVAX0H] | ||
156 | cfmvah32 mvax0, mvfx0 | ||
157 | cfldr32 mvfx0, [r0, #CRUNCH_MVAX1L] | ||
158 | cfmval32 mvax1, mvfx0 | ||
159 | cfldr32 mvfx0, [r0, #CRUNCH_MVAX1M] | ||
160 | cfmvam32 mvax1, mvfx0 | ||
161 | cfldr32 mvfx0, [r0, #CRUNCH_MVAX1H] | ||
162 | cfmvah32 mvax1, mvfx0 | ||
163 | cfldr32 mvfx0, [r0, #CRUNCH_MVAX2L] | ||
164 | cfmval32 mvax2, mvfx0 | ||
165 | cfldr32 mvfx0, [r0, #CRUNCH_MVAX2M] | ||
166 | cfmvam32 mvax2, mvfx0 | ||
167 | cfldr32 mvfx0, [r0, #CRUNCH_MVAX2H] | ||
168 | cfmvah32 mvax2, mvfx0 | ||
169 | cfldr32 mvfx0, [r0, #CRUNCH_MVAX3L] | ||
170 | cfmval32 mvax3, mvfx0 | ||
171 | cfldr32 mvfx0, [r0, #CRUNCH_MVAX3M] | ||
172 | cfmvam32 mvax3, mvfx0 | ||
173 | cfldr32 mvfx0, [r0, #CRUNCH_MVAX3H] | ||
174 | cfmvah32 mvax3, mvfx0 | ||
175 | |||
176 | cfldr64 mvdx0, [r0, #CRUNCH_MVDX0] @ load 64b registers | ||
177 | cfldr64 mvdx1, [r0, #CRUNCH_MVDX1] | ||
178 | cfldr64 mvdx2, [r0, #CRUNCH_MVDX2] | ||
179 | cfldr64 mvdx3, [r0, #CRUNCH_MVDX3] | ||
180 | cfldr64 mvdx4, [r0, #CRUNCH_MVDX4] | ||
181 | cfldr64 mvdx5, [r0, #CRUNCH_MVDX5] | ||
182 | cfldr64 mvdx6, [r0, #CRUNCH_MVDX6] | ||
183 | cfldr64 mvdx7, [r0, #CRUNCH_MVDX7] | ||
184 | cfldr64 mvdx8, [r0, #CRUNCH_MVDX8] | ||
185 | cfldr64 mvdx9, [r0, #CRUNCH_MVDX9] | ||
186 | cfldr64 mvdx10, [r0, #CRUNCH_MVDX10] | ||
187 | cfldr64 mvdx11, [r0, #CRUNCH_MVDX11] | ||
188 | cfldr64 mvdx12, [r0, #CRUNCH_MVDX12] | ||
189 | cfldr64 mvdx13, [r0, #CRUNCH_MVDX13] | ||
190 | cfldr64 mvdx14, [r0, #CRUNCH_MVDX14] | ||
191 | cfldr64 mvdx15, [r0, #CRUNCH_MVDX15] | ||
192 | |||
193 | mov pc, lr | ||
194 | |||
195 | /* | ||
196 | * Back up crunch regs to save area and disable access to them | ||
197 | * (mainly for gdb or sleep mode usage) | ||
198 | * | ||
199 | * r0 = struct thread_info pointer of target task or NULL for any | ||
200 | */ | ||
201 | ENTRY(crunch_task_disable) | ||
202 | stmfd sp!, {r4, r5, lr} | ||
203 | |||
204 | mrs ip, cpsr | ||
205 | orr r2, ip, #PSR_I_BIT @ disable interrupts | ||
206 | msr cpsr_c, r2 | ||
207 | |||
208 | ldr r4, =(EP93XX_APB_VIRT_BASE + 0x00130000) @ syscon addr | ||
209 | |||
210 | ldr r3, =crunch_owner | ||
211 | add r2, r0, #TI_CRUNCH_STATE @ get task crunch save area | ||
212 | ldr r1, [r3] @ get current crunch owner | ||
213 | teq r1, #0 @ any current owner? | ||
214 | beq 1f @ no: quit | ||
215 | teq r0, #0 @ any owner? | ||
216 | teqne r1, r2 @ or specified one? | ||
217 | bne 1f @ no: quit | ||
218 | |||
219 | ldr r5, [r4, #0x80] @ enable access to crunch | ||
220 | mov r2, #0xaa | ||
221 | str r2, [r4, #0xc0] | ||
222 | orr r5, r5, #0x00800000 | ||
223 | str r5, [r4, #0x80] | ||
224 | |||
225 | mov r0, #0 @ nothing to load | ||
226 | str r0, [r3] @ no more current owner | ||
227 | ldr r2, [r4, #0x80] @ flush out enable (@@@) | ||
228 | mov r2, r2 | ||
229 | bl crunch_save | ||
230 | |||
231 | mov r2, #0xaa @ disable access to crunch | ||
232 | str r2, [r4, #0xc0] | ||
233 | bic r5, r5, #0x00800000 | ||
234 | str r5, [r4, #0x80] | ||
235 | ldr r5, [r4, #0x80] @ flush out enable (@@@) | ||
236 | mov r5, r5 | ||
237 | |||
238 | 1: msr cpsr_c, ip @ restore interrupt mode | ||
239 | ldmfd sp!, {r4, r5, pc} | ||
240 | |||
241 | /* | ||
242 | * Copy crunch state to given memory address | ||
243 | * | ||
244 | * r0 = struct thread_info pointer of target task | ||
245 | * r1 = memory address where to store crunch state | ||
246 | * | ||
247 | * this is called mainly in the creation of signal stack frames | ||
248 | */ | ||
249 | ENTRY(crunch_task_copy) | ||
250 | mrs ip, cpsr | ||
251 | orr r2, ip, #PSR_I_BIT @ disable interrupts | ||
252 | msr cpsr_c, r2 | ||
253 | |||
254 | ldr r3, =crunch_owner | ||
255 | add r2, r0, #TI_CRUNCH_STATE @ get task crunch save area | ||
256 | ldr r3, [r3] @ get current crunch owner | ||
257 | teq r2, r3 @ does this task own it... | ||
258 | beq 1f | ||
259 | |||
260 | @ current crunch values are in the task save area | ||
261 | msr cpsr_c, ip @ restore interrupt mode | ||
262 | mov r0, r1 | ||
263 | mov r1, r2 | ||
264 | mov r2, #CRUNCH_SIZE | ||
265 | b memcpy | ||
266 | |||
267 | 1: @ this task owns crunch regs -- grab a copy from there | ||
268 | mov r0, #0 @ nothing to load | ||
269 | mov r3, lr @ preserve return address | ||
270 | bl crunch_save | ||
271 | msr cpsr_c, ip @ restore interrupt mode | ||
272 | mov pc, r3 | ||
273 | |||
274 | /* | ||
275 | * Restore crunch state from given memory address | ||
276 | * | ||
277 | * r0 = struct thread_info pointer of target task | ||
278 | * r1 = memory address where to get crunch state from | ||
279 | * | ||
280 | * this is used to restore crunch state when unwinding a signal stack frame | ||
281 | */ | ||
282 | ENTRY(crunch_task_restore) | ||
283 | mrs ip, cpsr | ||
284 | orr r2, ip, #PSR_I_BIT @ disable interrupts | ||
285 | msr cpsr_c, r2 | ||
286 | |||
287 | ldr r3, =crunch_owner | ||
288 | add r2, r0, #TI_CRUNCH_STATE @ get task crunch save area | ||
289 | ldr r3, [r3] @ get current crunch owner | ||
290 | teq r2, r3 @ does this task own it... | ||
291 | beq 1f | ||
292 | |||
293 | @ this task doesn't own crunch regs -- use its save area | ||
294 | msr cpsr_c, ip @ restore interrupt mode | ||
295 | mov r0, r2 | ||
296 | mov r2, #CRUNCH_SIZE | ||
297 | b memcpy | ||
298 | |||
299 | 1: @ this task owns crunch regs -- load them directly | ||
300 | mov r0, r1 | ||
301 | mov r1, #0 @ nothing to save | ||
302 | mov r3, lr @ preserve return address | ||
303 | bl crunch_load | ||
304 | msr cpsr_c, ip @ restore interrupt mode | ||
305 | mov pc, r3 | ||
diff --git a/arch/arm/kernel/crunch.c b/arch/arm/kernel/crunch.c new file mode 100644 index 000000000000..748175921f9b --- /dev/null +++ b/arch/arm/kernel/crunch.c | |||
@@ -0,0 +1,83 @@ | |||
1 | /* | ||
2 | * arch/arm/kernel/crunch.c | ||
3 | * Cirrus MaverickCrunch context switching and handling | ||
4 | * | ||
5 | * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/module.h> | ||
13 | #include <linux/config.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/signal.h> | ||
17 | #include <linux/sched.h> | ||
18 | #include <linux/init.h> | ||
19 | #include <asm/arch/ep93xx-regs.h> | ||
20 | #include <asm/thread_notify.h> | ||
21 | #include <asm/io.h> | ||
22 | |||
23 | struct crunch_state *crunch_owner; | ||
24 | |||
25 | void crunch_task_release(struct thread_info *thread) | ||
26 | { | ||
27 | local_irq_disable(); | ||
28 | if (crunch_owner == &thread->crunchstate) | ||
29 | crunch_owner = NULL; | ||
30 | local_irq_enable(); | ||
31 | } | ||
32 | |||
33 | static int crunch_enabled(u32 devcfg) | ||
34 | { | ||
35 | return !!(devcfg & EP93XX_SYSCON_DEVICE_CONFIG_CRUNCH_ENABLE); | ||
36 | } | ||
37 | |||
38 | static int crunch_do(struct notifier_block *self, unsigned long cmd, void *t) | ||
39 | { | ||
40 | struct thread_info *thread = (struct thread_info *)t; | ||
41 | struct crunch_state *crunch_state; | ||
42 | u32 devcfg; | ||
43 | |||
44 | crunch_state = &thread->crunchstate; | ||
45 | |||
46 | switch (cmd) { | ||
47 | case THREAD_NOTIFY_FLUSH: | ||
48 | memset(crunch_state, 0, sizeof(*crunch_state)); | ||
49 | |||
50 | /* | ||
51 | * FALLTHROUGH: Ensure we don't try to overwrite our newly | ||
52 | * initialised state information on the first fault. | ||
53 | */ | ||
54 | |||
55 | case THREAD_NOTIFY_RELEASE: | ||
56 | crunch_task_release(thread); | ||
57 | break; | ||
58 | |||
59 | case THREAD_NOTIFY_SWITCH: | ||
60 | devcfg = __raw_readl(EP93XX_SYSCON_DEVICE_CONFIG); | ||
61 | if (crunch_enabled(devcfg) || crunch_owner == crunch_state) { | ||
62 | devcfg ^= EP93XX_SYSCON_DEVICE_CONFIG_CRUNCH_ENABLE; | ||
63 | __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK); | ||
64 | __raw_writel(devcfg, EP93XX_SYSCON_DEVICE_CONFIG); | ||
65 | } | ||
66 | break; | ||
67 | } | ||
68 | |||
69 | return NOTIFY_DONE; | ||
70 | } | ||
71 | |||
72 | static struct notifier_block crunch_notifier_block = { | ||
73 | .notifier_call = crunch_do, | ||
74 | }; | ||
75 | |||
76 | static int __init crunch_init(void) | ||
77 | { | ||
78 | thread_register_notifier(&crunch_notifier_block); | ||
79 | |||
80 | return 0; | ||
81 | } | ||
82 | |||
83 | late_initcall(crunch_init); | ||
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 86c92523a346..6423a38839b8 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -492,9 +492,15 @@ call_fpe: | |||
492 | b do_fpe @ CP#1 (FPE) | 492 | b do_fpe @ CP#1 (FPE) |
493 | b do_fpe @ CP#2 (FPE) | 493 | b do_fpe @ CP#2 (FPE) |
494 | mov pc, lr @ CP#3 | 494 | mov pc, lr @ CP#3 |
495 | #ifdef CONFIG_CRUNCH | ||
496 | b crunch_task_enable @ CP#4 (MaverickCrunch) | ||
497 | b crunch_task_enable @ CP#5 (MaverickCrunch) | ||
498 | b crunch_task_enable @ CP#6 (MaverickCrunch) | ||
499 | #else | ||
495 | mov pc, lr @ CP#4 | 500 | mov pc, lr @ CP#4 |
496 | mov pc, lr @ CP#5 | 501 | mov pc, lr @ CP#5 |
497 | mov pc, lr @ CP#6 | 502 | mov pc, lr @ CP#6 |
503 | #endif | ||
498 | mov pc, lr @ CP#7 | 504 | mov pc, lr @ CP#7 |
499 | mov pc, lr @ CP#8 | 505 | mov pc, lr @ CP#8 |
500 | mov pc, lr @ CP#9 | 506 | mov pc, lr @ CP#9 |
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index a1d1b2906e8d..c40bdc770054 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c | |||
@@ -634,6 +634,32 @@ static int ptrace_setwmmxregs(struct task_struct *tsk, void __user *ufp) | |||
634 | 634 | ||
635 | #endif | 635 | #endif |
636 | 636 | ||
637 | #ifdef CONFIG_CRUNCH | ||
638 | /* | ||
639 | * Get the child Crunch state. | ||
640 | */ | ||
641 | static int ptrace_getcrunchregs(struct task_struct *tsk, void __user *ufp) | ||
642 | { | ||
643 | struct thread_info *thread = task_thread_info(tsk); | ||
644 | |||
645 | crunch_task_disable(thread); /* force it to ram */ | ||
646 | return copy_to_user(ufp, &thread->crunchstate, CRUNCH_SIZE) | ||
647 | ? -EFAULT : 0; | ||
648 | } | ||
649 | |||
650 | /* | ||
651 | * Set the child Crunch state. | ||
652 | */ | ||
653 | static int ptrace_setcrunchregs(struct task_struct *tsk, void __user *ufp) | ||
654 | { | ||
655 | struct thread_info *thread = task_thread_info(tsk); | ||
656 | |||
657 | crunch_task_release(thread); /* force a reload */ | ||
658 | return copy_from_user(&thread->crunchstate, ufp, CRUNCH_SIZE) | ||
659 | ? -EFAULT : 0; | ||
660 | } | ||
661 | #endif | ||
662 | |||
637 | long arch_ptrace(struct task_struct *child, long request, long addr, long data) | 663 | long arch_ptrace(struct task_struct *child, long request, long addr, long data) |
638 | { | 664 | { |
639 | unsigned long tmp; | 665 | unsigned long tmp; |
@@ -765,6 +791,16 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
765 | child->ptrace_message = data; | 791 | child->ptrace_message = data; |
766 | break; | 792 | break; |
767 | 793 | ||
794 | #ifdef CONFIG_CRUNCH | ||
795 | case PTRACE_GETCRUNCHREGS: | ||
796 | ret = ptrace_getcrunchregs(child, (void __user *)data); | ||
797 | break; | ||
798 | |||
799 | case PTRACE_SETCRUNCHREGS: | ||
800 | ret = ptrace_setcrunchregs(child, (void __user *)data); | ||
801 | break; | ||
802 | #endif | ||
803 | |||
768 | default: | 804 | default: |
769 | ret = ptrace_request(child, request, addr, data); | 805 | ret = ptrace_request(child, request, addr, data); |
770 | break; | 806 | break; |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 093ccba0503c..6bdf70def01f 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -119,9 +119,24 @@ DEFINE_PER_CPU(struct cpuinfo_arm, cpu_data); | |||
119 | * Standard memory resources | 119 | * Standard memory resources |
120 | */ | 120 | */ |
121 | static struct resource mem_res[] = { | 121 | static struct resource mem_res[] = { |
122 | { "Video RAM", 0, 0, IORESOURCE_MEM }, | 122 | { |
123 | { "Kernel text", 0, 0, IORESOURCE_MEM }, | 123 | .name = "Video RAM", |
124 | { "Kernel data", 0, 0, IORESOURCE_MEM } | 124 | .start = 0, |
125 | .end = 0, | ||
126 | .flags = IORESOURCE_MEM | ||
127 | }, | ||
128 | { | ||
129 | .name = "Kernel text", | ||
130 | .start = 0, | ||
131 | .end = 0, | ||
132 | .flags = IORESOURCE_MEM | ||
133 | }, | ||
134 | { | ||
135 | .name = "Kernel data", | ||
136 | .start = 0, | ||
137 | .end = 0, | ||
138 | .flags = IORESOURCE_MEM | ||
139 | } | ||
125 | }; | 140 | }; |
126 | 141 | ||
127 | #define video_ram mem_res[0] | 142 | #define video_ram mem_res[0] |
@@ -129,9 +144,24 @@ static struct resource mem_res[] = { | |||
129 | #define kernel_data mem_res[2] | 144 | #define kernel_data mem_res[2] |
130 | 145 | ||
131 | static struct resource io_res[] = { | 146 | static struct resource io_res[] = { |
132 | { "reserved", 0x3bc, 0x3be, IORESOURCE_IO | IORESOURCE_BUSY }, | 147 | { |
133 | { "reserved", 0x378, 0x37f, IORESOURCE_IO | IORESOURCE_BUSY }, | 148 | .name = "reserved", |
134 | { "reserved", 0x278, 0x27f, IORESOURCE_IO | IORESOURCE_BUSY } | 149 | .start = 0x3bc, |
150 | .end = 0x3be, | ||
151 | .flags = IORESOURCE_IO | IORESOURCE_BUSY | ||
152 | }, | ||
153 | { | ||
154 | .name = "reserved", | ||
155 | .start = 0x378, | ||
156 | .end = 0x37f, | ||
157 | .flags = IORESOURCE_IO | IORESOURCE_BUSY | ||
158 | }, | ||
159 | { | ||
160 | .name = "reserved", | ||
161 | .start = 0x278, | ||
162 | .end = 0x27f, | ||
163 | .flags = IORESOURCE_IO | IORESOURCE_BUSY | ||
164 | } | ||
135 | }; | 165 | }; |
136 | 166 | ||
137 | #define lp0 io_res[0] | 167 | #define lp0 io_res[0] |
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 1ce05ec086c6..83a8d3c95eb3 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
@@ -132,6 +132,37 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
132 | return ret; | 132 | return ret; |
133 | } | 133 | } |
134 | 134 | ||
135 | #ifdef CONFIG_CRUNCH | ||
136 | static int preserve_crunch_context(struct crunch_sigframe *frame) | ||
137 | { | ||
138 | char kbuf[sizeof(*frame) + 8]; | ||
139 | struct crunch_sigframe *kframe; | ||
140 | |||
141 | /* the crunch context must be 64 bit aligned */ | ||
142 | kframe = (struct crunch_sigframe *)((unsigned long)(kbuf + 8) & ~7); | ||
143 | kframe->magic = CRUNCH_MAGIC; | ||
144 | kframe->size = CRUNCH_STORAGE_SIZE; | ||
145 | crunch_task_copy(current_thread_info(), &kframe->storage); | ||
146 | return __copy_to_user(frame, kframe, sizeof(*frame)); | ||
147 | } | ||
148 | |||
149 | static int restore_crunch_context(struct crunch_sigframe *frame) | ||
150 | { | ||
151 | char kbuf[sizeof(*frame) + 8]; | ||
152 | struct crunch_sigframe *kframe; | ||
153 | |||
154 | /* the crunch context must be 64 bit aligned */ | ||
155 | kframe = (struct crunch_sigframe *)((unsigned long)(kbuf + 8) & ~7); | ||
156 | if (__copy_from_user(kframe, frame, sizeof(*frame))) | ||
157 | return -1; | ||
158 | if (kframe->magic != CRUNCH_MAGIC || | ||
159 | kframe->size != CRUNCH_STORAGE_SIZE) | ||
160 | return -1; | ||
161 | crunch_task_restore(current_thread_info(), &kframe->storage); | ||
162 | return 0; | ||
163 | } | ||
164 | #endif | ||
165 | |||
135 | #ifdef CONFIG_IWMMXT | 166 | #ifdef CONFIG_IWMMXT |
136 | 167 | ||
137 | static int preserve_iwmmxt_context(struct iwmmxt_sigframe *frame) | 168 | static int preserve_iwmmxt_context(struct iwmmxt_sigframe *frame) |
@@ -214,6 +245,10 @@ static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf) | |||
214 | err |= !valid_user_regs(regs); | 245 | err |= !valid_user_regs(regs); |
215 | 246 | ||
216 | aux = (struct aux_sigframe __user *) sf->uc.uc_regspace; | 247 | aux = (struct aux_sigframe __user *) sf->uc.uc_regspace; |
248 | #ifdef CONFIG_CRUNCH | ||
249 | if (err == 0) | ||
250 | err |= restore_crunch_context(&aux->crunch); | ||
251 | #endif | ||
217 | #ifdef CONFIG_IWMMXT | 252 | #ifdef CONFIG_IWMMXT |
218 | if (err == 0 && test_thread_flag(TIF_USING_IWMMXT)) | 253 | if (err == 0 && test_thread_flag(TIF_USING_IWMMXT)) |
219 | err |= restore_iwmmxt_context(&aux->iwmmxt); | 254 | err |= restore_iwmmxt_context(&aux->iwmmxt); |
@@ -333,6 +368,10 @@ setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set) | |||
333 | err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set)); | 368 | err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set)); |
334 | 369 | ||
335 | aux = (struct aux_sigframe __user *) sf->uc.uc_regspace; | 370 | aux = (struct aux_sigframe __user *) sf->uc.uc_regspace; |
371 | #ifdef CONFIG_CRUNCH | ||
372 | if (err == 0) | ||
373 | err |= preserve_crunch_context(&aux->crunch); | ||
374 | #endif | ||
336 | #ifdef CONFIG_IWMMXT | 375 | #ifdef CONFIG_IWMMXT |
337 | if (err == 0 && test_thread_flag(TIF_USING_IWMMXT)) | 376 | if (err == 0 && test_thread_flag(TIF_USING_IWMMXT)) |
338 | err |= preserve_iwmmxt_context(&aux->iwmmxt); | 377 | err |= preserve_iwmmxt_context(&aux->iwmmxt); |
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 2b254e88595c..2df9688a7028 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
@@ -80,6 +80,10 @@ SECTIONS | |||
80 | *(.exit.text) | 80 | *(.exit.text) |
81 | *(.exit.data) | 81 | *(.exit.data) |
82 | *(.exitcall.exit) | 82 | *(.exitcall.exit) |
83 | #ifndef CONFIG_MMU | ||
84 | *(.fixup) | ||
85 | *(__ex_table) | ||
86 | #endif | ||
83 | } | 87 | } |
84 | 88 | ||
85 | .text : { /* Real text segment */ | 89 | .text : { /* Real text segment */ |
@@ -87,7 +91,9 @@ SECTIONS | |||
87 | *(.text) | 91 | *(.text) |
88 | SCHED_TEXT | 92 | SCHED_TEXT |
89 | LOCK_TEXT | 93 | LOCK_TEXT |
94 | #ifdef CONFIG_MMU | ||
90 | *(.fixup) | 95 | *(.fixup) |
96 | #endif | ||
91 | *(.gnu.warning) | 97 | *(.gnu.warning) |
92 | *(.rodata) | 98 | *(.rodata) |
93 | *(.rodata.*) | 99 | *(.rodata.*) |
@@ -142,7 +148,9 @@ SECTIONS | |||
142 | */ | 148 | */ |
143 | . = ALIGN(32); | 149 | . = ALIGN(32); |
144 | __start___ex_table = .; | 150 | __start___ex_table = .; |
151 | #ifdef CONFIG_MMU | ||
145 | *(__ex_table) | 152 | *(__ex_table) |
153 | #endif | ||
146 | __stop___ex_table = .; | 154 | __stop___ex_table = .; |
147 | 155 | ||
148 | /* | 156 | /* |
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index 7b726b627ea5..30351cd4560d 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile | |||
@@ -6,28 +6,31 @@ | |||
6 | 6 | ||
7 | lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \ | 7 | lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \ |
8 | csumpartialcopy.o csumpartialcopyuser.o clearbit.o \ | 8 | csumpartialcopy.o csumpartialcopyuser.o clearbit.o \ |
9 | copy_page.o delay.o findbit.o memchr.o memcpy.o \ | 9 | delay.o findbit.o memchr.o memcpy.o \ |
10 | memmove.o memset.o memzero.o setbit.o \ | 10 | memmove.o memset.o memzero.o setbit.o \ |
11 | strncpy_from_user.o strnlen_user.o \ | 11 | strncpy_from_user.o strnlen_user.o \ |
12 | strchr.o strrchr.o \ | 12 | strchr.o strrchr.o \ |
13 | testchangebit.o testclearbit.o testsetbit.o \ | 13 | testchangebit.o testclearbit.o testsetbit.o \ |
14 | getuser.o putuser.o clear_user.o \ | ||
15 | ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \ | 14 | ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \ |
16 | ucmpdi2.o lib1funcs.o div64.o sha1.o \ | 15 | ucmpdi2.o lib1funcs.o div64.o sha1.o \ |
17 | io-readsb.o io-writesb.o io-readsl.o io-writesl.o | 16 | io-readsb.o io-writesb.o io-readsl.o io-writesl.o |
18 | 17 | ||
18 | mmu-y := clear_user.o copy_page.o getuser.o putuser.o | ||
19 | |||
19 | # the code in uaccess.S is not preemption safe and | 20 | # the code in uaccess.S is not preemption safe and |
20 | # probably faster on ARMv3 only | 21 | # probably faster on ARMv3 only |
21 | ifeq ($(CONFIG_PREEMPT),y) | 22 | ifeq ($(CONFIG_PREEMPT),y) |
22 | lib-y += copy_from_user.o copy_to_user.o | 23 | mmu-y += copy_from_user.o copy_to_user.o |
23 | else | 24 | else |
24 | ifneq ($(CONFIG_CPU_32v3),y) | 25 | ifneq ($(CONFIG_CPU_32v3),y) |
25 | lib-y += copy_from_user.o copy_to_user.o | 26 | mmu-y += copy_from_user.o copy_to_user.o |
26 | else | 27 | else |
27 | lib-y += uaccess.o | 28 | mmu-y += uaccess.o |
28 | endif | 29 | endif |
29 | endif | 30 | endif |
30 | 31 | ||
32 | lib-$(CONFIG_MMU) += $(mmu-y) | ||
33 | |||
31 | ifeq ($(CONFIG_CPU_32v3),y) | 34 | ifeq ($(CONFIG_CPU_32v3),y) |
32 | lib-y += io-readsw-armv3.o io-writesw-armv3.o | 35 | lib-y += io-readsw-armv3.o io-writesw-armv3.o |
33 | else | 36 | else |
diff --git a/arch/arm/lib/backtrace.S b/arch/arm/lib/backtrace.S index 058b80d72aa1..91f993f2e9db 100644 --- a/arch/arm/lib/backtrace.S +++ b/arch/arm/lib/backtrace.S | |||
@@ -97,16 +97,13 @@ ENTRY(c_backtrace) | |||
97 | b 1007f | 97 | b 1007f |
98 | 98 | ||
99 | /* | 99 | /* |
100 | * Fixup for LDMDB | 100 | * Fixup for LDMDB. Note that this must not be in the fixup section. |
101 | */ | 101 | */ |
102 | .section .fixup,"ax" | ||
103 | .align 0 | ||
104 | 1007: ldr r0, =.Lbad | 102 | 1007: ldr r0, =.Lbad |
105 | mov r1, frame | 103 | mov r1, frame |
106 | bl printk | 104 | bl printk |
107 | ldmfd sp!, {r4 - r8, pc} | 105 | ldmfd sp!, {r4 - r8, pc} |
108 | .ltorg | 106 | .ltorg |
109 | .previous | ||
110 | 107 | ||
111 | .section __ex_table,"a" | 108 | .section __ex_table,"a" |
112 | .align 3 | 109 | .align 3 |
diff --git a/arch/arm/lib/clear_user.S b/arch/arm/lib/clear_user.S index ea435ae2e4a5..ecb28dcdaf7b 100644 --- a/arch/arm/lib/clear_user.S +++ b/arch/arm/lib/clear_user.S | |||
@@ -12,13 +12,13 @@ | |||
12 | 12 | ||
13 | .text | 13 | .text |
14 | 14 | ||
15 | /* Prototype: int __arch_clear_user(void *addr, size_t sz) | 15 | /* Prototype: int __clear_user(void *addr, size_t sz) |
16 | * Purpose : clear some user memory | 16 | * Purpose : clear some user memory |
17 | * Params : addr - user memory address to clear | 17 | * Params : addr - user memory address to clear |
18 | * : sz - number of bytes to clear | 18 | * : sz - number of bytes to clear |
19 | * Returns : number of bytes NOT cleared | 19 | * Returns : number of bytes NOT cleared |
20 | */ | 20 | */ |
21 | ENTRY(__arch_clear_user) | 21 | ENTRY(__clear_user) |
22 | stmfd sp!, {r1, lr} | 22 | stmfd sp!, {r1, lr} |
23 | mov r2, #0 | 23 | mov r2, #0 |
24 | cmp r1, #4 | 24 | cmp r1, #4 |
diff --git a/arch/arm/lib/copy_from_user.S b/arch/arm/lib/copy_from_user.S index 7497393a0e81..6b7363ce749c 100644 --- a/arch/arm/lib/copy_from_user.S +++ b/arch/arm/lib/copy_from_user.S | |||
@@ -16,7 +16,7 @@ | |||
16 | /* | 16 | /* |
17 | * Prototype: | 17 | * Prototype: |
18 | * | 18 | * |
19 | * size_t __arch_copy_from_user(void *to, const void *from, size_t n) | 19 | * size_t __copy_from_user(void *to, const void *from, size_t n) |
20 | * | 20 | * |
21 | * Purpose: | 21 | * Purpose: |
22 | * | 22 | * |
@@ -83,7 +83,7 @@ | |||
83 | 83 | ||
84 | .text | 84 | .text |
85 | 85 | ||
86 | ENTRY(__arch_copy_from_user) | 86 | ENTRY(__copy_from_user) |
87 | 87 | ||
88 | #include "copy_template.S" | 88 | #include "copy_template.S" |
89 | 89 | ||
diff --git a/arch/arm/lib/copy_to_user.S b/arch/arm/lib/copy_to_user.S index 4a6d8ea14022..5224d94688d9 100644 --- a/arch/arm/lib/copy_to_user.S +++ b/arch/arm/lib/copy_to_user.S | |||
@@ -16,7 +16,7 @@ | |||
16 | /* | 16 | /* |
17 | * Prototype: | 17 | * Prototype: |
18 | * | 18 | * |
19 | * size_t __arch_copy_to_user(void *to, const void *from, size_t n) | 19 | * size_t __copy_to_user(void *to, const void *from, size_t n) |
20 | * | 20 | * |
21 | * Purpose: | 21 | * Purpose: |
22 | * | 22 | * |
@@ -86,7 +86,7 @@ | |||
86 | 86 | ||
87 | .text | 87 | .text |
88 | 88 | ||
89 | ENTRY(__arch_copy_to_user) | 89 | ENTRY(__copy_to_user) |
90 | 90 | ||
91 | #include "copy_template.S" | 91 | #include "copy_template.S" |
92 | 92 | ||
diff --git a/arch/arm/lib/strncpy_from_user.S b/arch/arm/lib/strncpy_from_user.S index 35649f04fcac..36e3741a3772 100644 --- a/arch/arm/lib/strncpy_from_user.S +++ b/arch/arm/lib/strncpy_from_user.S | |||
@@ -20,7 +20,7 @@ | |||
20 | * returns the number of characters copied (strlen of copied string), | 20 | * returns the number of characters copied (strlen of copied string), |
21 | * -EFAULT on exception, or "len" if we fill the whole buffer | 21 | * -EFAULT on exception, or "len" if we fill the whole buffer |
22 | */ | 22 | */ |
23 | ENTRY(__arch_strncpy_from_user) | 23 | ENTRY(__strncpy_from_user) |
24 | mov ip, r1 | 24 | mov ip, r1 |
25 | 1: subs r2, r2, #1 | 25 | 1: subs r2, r2, #1 |
26 | USER( ldrplbt r3, [r1], #1) | 26 | USER( ldrplbt r3, [r1], #1) |
diff --git a/arch/arm/lib/strnlen_user.S b/arch/arm/lib/strnlen_user.S index 3668a15991ef..18d8fa4f925a 100644 --- a/arch/arm/lib/strnlen_user.S +++ b/arch/arm/lib/strnlen_user.S | |||
@@ -14,13 +14,13 @@ | |||
14 | .text | 14 | .text |
15 | .align 5 | 15 | .align 5 |
16 | 16 | ||
17 | /* Prototype: unsigned long __arch_strnlen_user(const char *str, long n) | 17 | /* Prototype: unsigned long __strnlen_user(const char *str, long n) |
18 | * Purpose : get length of a string in user memory | 18 | * Purpose : get length of a string in user memory |
19 | * Params : str - address of string in user memory | 19 | * Params : str - address of string in user memory |
20 | * Returns : length of string *including terminator* | 20 | * Returns : length of string *including terminator* |
21 | * or zero on exception, or n + 1 if too long | 21 | * or zero on exception, or n + 1 if too long |
22 | */ | 22 | */ |
23 | ENTRY(__arch_strnlen_user) | 23 | ENTRY(__strnlen_user) |
24 | mov r2, r0 | 24 | mov r2, r0 |
25 | 1: | 25 | 1: |
26 | USER( ldrbt r3, [r0], #1) | 26 | USER( ldrbt r3, [r0], #1) |
diff --git a/arch/arm/lib/uaccess.S b/arch/arm/lib/uaccess.S index 1f1545d737be..b48bd6d5fd83 100644 --- a/arch/arm/lib/uaccess.S +++ b/arch/arm/lib/uaccess.S | |||
@@ -19,7 +19,7 @@ | |||
19 | 19 | ||
20 | #define PAGE_SHIFT 12 | 20 | #define PAGE_SHIFT 12 |
21 | 21 | ||
22 | /* Prototype: int __arch_copy_to_user(void *to, const char *from, size_t n) | 22 | /* Prototype: int __copy_to_user(void *to, const char *from, size_t n) |
23 | * Purpose : copy a block to user memory from kernel memory | 23 | * Purpose : copy a block to user memory from kernel memory |
24 | * Params : to - user memory | 24 | * Params : to - user memory |
25 | * : from - kernel memory | 25 | * : from - kernel memory |
@@ -39,7 +39,7 @@ USER( strgtbt r3, [r0], #1) @ May fault | |||
39 | sub r2, r2, ip | 39 | sub r2, r2, ip |
40 | b .Lc2u_dest_aligned | 40 | b .Lc2u_dest_aligned |
41 | 41 | ||
42 | ENTRY(__arch_copy_to_user) | 42 | ENTRY(__copy_to_user) |
43 | stmfd sp!, {r2, r4 - r7, lr} | 43 | stmfd sp!, {r2, r4 - r7, lr} |
44 | cmp r2, #4 | 44 | cmp r2, #4 |
45 | blt .Lc2u_not_enough | 45 | blt .Lc2u_not_enough |
@@ -283,7 +283,7 @@ USER( strgtbt r3, [r0], #1) @ May fault | |||
283 | 9001: ldmfd sp!, {r0, r4 - r7, pc} | 283 | 9001: ldmfd sp!, {r0, r4 - r7, pc} |
284 | .previous | 284 | .previous |
285 | 285 | ||
286 | /* Prototype: unsigned long __arch_copy_from_user(void *to,const void *from,unsigned long n); | 286 | /* Prototype: unsigned long __copy_from_user(void *to,const void *from,unsigned long n); |
287 | * Purpose : copy a block from user memory to kernel memory | 287 | * Purpose : copy a block from user memory to kernel memory |
288 | * Params : to - kernel memory | 288 | * Params : to - kernel memory |
289 | * : from - user memory | 289 | * : from - user memory |
@@ -302,7 +302,7 @@ USER( ldrgtbt r3, [r1], #1) @ May fault | |||
302 | sub r2, r2, ip | 302 | sub r2, r2, ip |
303 | b .Lcfu_dest_aligned | 303 | b .Lcfu_dest_aligned |
304 | 304 | ||
305 | ENTRY(__arch_copy_from_user) | 305 | ENTRY(__copy_from_user) |
306 | stmfd sp!, {r0, r2, r4 - r7, lr} | 306 | stmfd sp!, {r0, r2, r4 - r7, lr} |
307 | cmp r2, #4 | 307 | cmp r2, #4 |
308 | blt .Lcfu_not_enough | 308 | blt .Lcfu_not_enough |
diff --git a/arch/arm/mach-ep93xx/Kconfig b/arch/arm/mach-ep93xx/Kconfig index cec5a21ca4e3..e15e4c54a253 100644 --- a/arch/arm/mach-ep93xx/Kconfig +++ b/arch/arm/mach-ep93xx/Kconfig | |||
@@ -2,8 +2,19 @@ if ARCH_EP93XX | |||
2 | 2 | ||
3 | menu "Cirrus EP93xx Implementation Options" | 3 | menu "Cirrus EP93xx Implementation Options" |
4 | 4 | ||
5 | config CRUNCH | ||
6 | bool "Support for MaverickCrunch" | ||
7 | help | ||
8 | Enable kernel support for MaverickCrunch. | ||
9 | |||
5 | comment "EP93xx Platforms" | 10 | comment "EP93xx Platforms" |
6 | 11 | ||
12 | config MACH_EDB9315 | ||
13 | bool "Support Cirrus Logic EDB9315" | ||
14 | help | ||
15 | Say 'Y' here if you want your kernel to support the Cirrus | ||
16 | Logic EDB9315 Evaluation Board. | ||
17 | |||
7 | config MACH_GESBC9312 | 18 | config MACH_GESBC9312 |
8 | bool "Support Glomation GESBC-9312-sx" | 19 | bool "Support Glomation GESBC-9312-sx" |
9 | help | 20 | help |
diff --git a/arch/arm/mach-ep93xx/Makefile b/arch/arm/mach-ep93xx/Makefile index 05a48a21038e..dfa7e2e8a18b 100644 --- a/arch/arm/mach-ep93xx/Makefile +++ b/arch/arm/mach-ep93xx/Makefile | |||
@@ -6,5 +6,6 @@ obj-m := | |||
6 | obj-n := | 6 | obj-n := |
7 | obj- := | 7 | obj- := |
8 | 8 | ||
9 | obj-$(CONFIG_MACH_EDB9315) += edb9315.o | ||
9 | obj-$(CONFIG_MACH_GESBC9312) += gesbc9312.o | 10 | obj-$(CONFIG_MACH_GESBC9312) += gesbc9312.o |
10 | obj-$(CONFIG_MACH_TS72XX) += ts72xx.o | 11 | obj-$(CONFIG_MACH_TS72XX) += ts72xx.o |
diff --git a/arch/arm/mach-ep93xx/edb9315.c b/arch/arm/mach-ep93xx/edb9315.c new file mode 100644 index 000000000000..ef7482faad81 --- /dev/null +++ b/arch/arm/mach-ep93xx/edb9315.c | |||
@@ -0,0 +1,62 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-ep93xx/edb9315.c | ||
3 | * Cirrus Logic EDB9315 support. | ||
4 | * | ||
5 | * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or (at | ||
10 | * your option) any later version. | ||
11 | */ | ||
12 | |||
13 | #include <linux/config.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/mm.h> | ||
17 | #include <linux/sched.h> | ||
18 | #include <linux/interrupt.h> | ||
19 | #include <linux/ioport.h> | ||
20 | #include <linux/mtd/physmap.h> | ||
21 | #include <linux/platform_device.h> | ||
22 | #include <asm/io.h> | ||
23 | #include <asm/hardware.h> | ||
24 | #include <asm/mach-types.h> | ||
25 | #include <asm/mach/arch.h> | ||
26 | |||
27 | static struct physmap_flash_data edb9315_flash_data = { | ||
28 | .width = 4, | ||
29 | }; | ||
30 | |||
31 | static struct resource edb9315_flash_resource = { | ||
32 | .start = 0x60000000, | ||
33 | .end = 0x61ffffff, | ||
34 | .flags = IORESOURCE_MEM, | ||
35 | }; | ||
36 | |||
37 | static struct platform_device edb9315_flash = { | ||
38 | .name = "physmap-flash", | ||
39 | .id = 0, | ||
40 | .dev = { | ||
41 | .platform_data = &edb9315_flash_data, | ||
42 | }, | ||
43 | .num_resources = 1, | ||
44 | .resource = &edb9315_flash_resource, | ||
45 | }; | ||
46 | |||
47 | static void __init edb9315_init_machine(void) | ||
48 | { | ||
49 | ep93xx_init_devices(); | ||
50 | platform_device_register(&edb9315_flash); | ||
51 | } | ||
52 | |||
53 | MACHINE_START(EDB9315, "Cirrus Logic EDB9315 Evaluation Board") | ||
54 | /* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */ | ||
55 | .phys_io = EP93XX_APB_PHYS_BASE, | ||
56 | .io_pg_offst = ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc, | ||
57 | .boot_params = 0x00000100, | ||
58 | .map_io = ep93xx_map_io, | ||
59 | .init_irq = ep93xx_init_irq, | ||
60 | .timer = &ep93xx_timer, | ||
61 | .init_machine = edb9315_init_machine, | ||
62 | MACHINE_END | ||
diff --git a/arch/arm/mach-ep93xx/gesbc9312.c b/arch/arm/mach-ep93xx/gesbc9312.c index 47cc6c8b7c79..2c28d66d260e 100644 --- a/arch/arm/mach-ep93xx/gesbc9312.c +++ b/arch/arm/mach-ep93xx/gesbc9312.c | |||
@@ -30,7 +30,7 @@ static struct physmap_flash_data gesbc9312_flash_data = { | |||
30 | 30 | ||
31 | static struct resource gesbc9312_flash_resource = { | 31 | static struct resource gesbc9312_flash_resource = { |
32 | .start = 0x60000000, | 32 | .start = 0x60000000, |
33 | .end = 0x60800000, | 33 | .end = 0x607fffff, |
34 | .flags = IORESOURCE_MEM, | 34 | .flags = IORESOURCE_MEM, |
35 | }; | 35 | }; |
36 | 36 | ||
diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c index 6e5a56cd5ae8..0b3b875b1875 100644 --- a/arch/arm/mach-ep93xx/ts72xx.c +++ b/arch/arm/mach-ep93xx/ts72xx.c | |||
@@ -118,7 +118,7 @@ static struct physmap_flash_data ts72xx_flash_data = { | |||
118 | 118 | ||
119 | static struct resource ts72xx_flash_resource = { | 119 | static struct resource ts72xx_flash_resource = { |
120 | .start = TS72XX_NOR_PHYS_BASE, | 120 | .start = TS72XX_NOR_PHYS_BASE, |
121 | .end = TS72XX_NOR_PHYS_BASE + 0x01000000, | 121 | .end = TS72XX_NOR_PHYS_BASE + 0x00ffffff, |
122 | .flags = IORESOURCE_MEM, | 122 | .flags = IORESOURCE_MEM, |
123 | }; | 123 | }; |
124 | 124 | ||
diff --git a/arch/arm/mach-ixp23xx/espresso.c b/arch/arm/mach-ixp23xx/espresso.c index dc5e489c70bc..357351fbb1e2 100644 --- a/arch/arm/mach-ixp23xx/espresso.c +++ b/arch/arm/mach-ixp23xx/espresso.c | |||
@@ -59,7 +59,7 @@ static struct physmap_flash_data espresso_flash_data = { | |||
59 | 59 | ||
60 | static struct resource espresso_flash_resource = { | 60 | static struct resource espresso_flash_resource = { |
61 | .start = 0x90000000, | 61 | .start = 0x90000000, |
62 | .end = 0x92000000, | 62 | .end = 0x91ffffff, |
63 | .flags = IORESOURCE_MEM, | 63 | .flags = IORESOURCE_MEM, |
64 | }; | 64 | }; |
65 | 65 | ||
diff --git a/arch/arm/mach-ixp23xx/ixdp2351.c b/arch/arm/mach-ixp23xx/ixdp2351.c index 535b334ee045..e0886871cc77 100644 --- a/arch/arm/mach-ixp23xx/ixdp2351.c +++ b/arch/arm/mach-ixp23xx/ixdp2351.c | |||
@@ -304,7 +304,7 @@ static struct physmap_flash_data ixdp2351_flash_data = { | |||
304 | 304 | ||
305 | static struct resource ixdp2351_flash_resource = { | 305 | static struct resource ixdp2351_flash_resource = { |
306 | .start = 0x90000000, | 306 | .start = 0x90000000, |
307 | .end = 0x94000000, | 307 | .end = 0x93ffffff, |
308 | .flags = IORESOURCE_MEM, | 308 | .flags = IORESOURCE_MEM, |
309 | }; | 309 | }; |
310 | 310 | ||
diff --git a/arch/arm/mach-ixp23xx/roadrunner.c b/arch/arm/mach-ixp23xx/roadrunner.c index b9f5d13fcfe1..92ad18f41251 100644 --- a/arch/arm/mach-ixp23xx/roadrunner.c +++ b/arch/arm/mach-ixp23xx/roadrunner.c | |||
@@ -143,7 +143,7 @@ static struct physmap_flash_data roadrunner_flash_data = { | |||
143 | 143 | ||
144 | static struct resource roadrunner_flash_resource = { | 144 | static struct resource roadrunner_flash_resource = { |
145 | .start = 0x90000000, | 145 | .start = 0x90000000, |
146 | .end = 0x94000000, | 146 | .end = 0x93ffffff, |
147 | .flags = IORESOURCE_MEM, | 147 | .flags = IORESOURCE_MEM, |
148 | }; | 148 | }; |
149 | 149 | ||
diff --git a/arch/arm/mach-pxa/irq.c b/arch/arm/mach-pxa/irq.c index 539b596005fc..d9635ff4b10c 100644 --- a/arch/arm/mach-pxa/irq.c +++ b/arch/arm/mach-pxa/irq.c | |||
@@ -88,8 +88,8 @@ static int pxa_gpio_irq_type(unsigned int irq, unsigned int type) | |||
88 | 88 | ||
89 | if (type == IRQT_PROBE) { | 89 | if (type == IRQT_PROBE) { |
90 | /* Don't mess with enabled GPIOs using preconfigured edges or | 90 | /* Don't mess with enabled GPIOs using preconfigured edges or |
91 | GPIOs set to alternate function during probe */ | 91 | GPIOs set to alternate function or to output during probe */ |
92 | if ((GPIO_IRQ_rising_edge[idx] | GPIO_IRQ_falling_edge[idx]) & | 92 | if ((GPIO_IRQ_rising_edge[idx] | GPIO_IRQ_falling_edge[idx] | GPDR(gpio)) & |
93 | GPIO_bit(gpio)) | 93 | GPIO_bit(gpio)) |
94 | return 0; | 94 | return 0; |
95 | if (GAFR(gpio) & (0x3 << (((gpio) & 0xf)*2))) | 95 | if (GAFR(gpio) & (0x3 << (((gpio) & 0xf)*2))) |
diff --git a/arch/arm/mach-s3c2410/s3c244x.c b/arch/arm/mach-s3c2410/s3c244x.c index 838bc525e836..9a2258270de9 100644 --- a/arch/arm/mach-s3c2410/s3c244x.c +++ b/arch/arm/mach-s3c2410/s3c244x.c | |||
@@ -69,6 +69,7 @@ void __init s3c244x_map_io(struct map_desc *mach_desc, int size) | |||
69 | 69 | ||
70 | s3c_device_i2c.name = "s3c2440-i2c"; | 70 | s3c_device_i2c.name = "s3c2440-i2c"; |
71 | s3c_device_nand.name = "s3c2440-nand"; | 71 | s3c_device_nand.name = "s3c2440-nand"; |
72 | s3c_device_usbgadget.name = "s3c2440-usbgadget"; | ||
72 | } | 73 | } |
73 | 74 | ||
74 | void __init s3c244x_init_clocks(int xtal) | 75 | void __init s3c244x_init_clocks(int xtal) |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index ecf5e232a6fc..c4bca753165b 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -15,8 +15,8 @@ config CPU_ARM610 | |||
15 | select CPU_32v3 | 15 | select CPU_32v3 |
16 | select CPU_CACHE_V3 | 16 | select CPU_CACHE_V3 |
17 | select CPU_CACHE_VIVT | 17 | select CPU_CACHE_VIVT |
18 | select CPU_COPY_V3 | 18 | select CPU_COPY_V3 if MMU |
19 | select CPU_TLB_V3 | 19 | select CPU_TLB_V3 if MMU |
20 | help | 20 | help |
21 | The ARM610 is the successor to the ARM3 processor | 21 | The ARM610 is the successor to the ARM3 processor |
22 | and was produced by VLSI Technology Inc. | 22 | and was produced by VLSI Technology Inc. |
@@ -31,8 +31,8 @@ config CPU_ARM710 | |||
31 | select CPU_32v3 | 31 | select CPU_32v3 |
32 | select CPU_CACHE_V3 | 32 | select CPU_CACHE_V3 |
33 | select CPU_CACHE_VIVT | 33 | select CPU_CACHE_VIVT |
34 | select CPU_COPY_V3 | 34 | select CPU_COPY_V3 if MMU |
35 | select CPU_TLB_V3 | 35 | select CPU_TLB_V3 if MMU |
36 | help | 36 | help |
37 | A 32-bit RISC microprocessor based on the ARM7 processor core | 37 | A 32-bit RISC microprocessor based on the ARM7 processor core |
38 | designed by Advanced RISC Machines Ltd. The ARM710 is the | 38 | designed by Advanced RISC Machines Ltd. The ARM710 is the |
@@ -50,8 +50,8 @@ config CPU_ARM720T | |||
50 | select CPU_ABRT_LV4T | 50 | select CPU_ABRT_LV4T |
51 | select CPU_CACHE_V4 | 51 | select CPU_CACHE_V4 |
52 | select CPU_CACHE_VIVT | 52 | select CPU_CACHE_VIVT |
53 | select CPU_COPY_V4WT | 53 | select CPU_COPY_V4WT if MMU |
54 | select CPU_TLB_V4WT | 54 | select CPU_TLB_V4WT if MMU |
55 | help | 55 | help |
56 | A 32-bit RISC processor with 8kByte Cache, Write Buffer and | 56 | A 32-bit RISC processor with 8kByte Cache, Write Buffer and |
57 | MMU built around an ARM7TDMI core. | 57 | MMU built around an ARM7TDMI core. |
@@ -68,8 +68,8 @@ config CPU_ARM920T | |||
68 | select CPU_ABRT_EV4T | 68 | select CPU_ABRT_EV4T |
69 | select CPU_CACHE_V4WT | 69 | select CPU_CACHE_V4WT |
70 | select CPU_CACHE_VIVT | 70 | select CPU_CACHE_VIVT |
71 | select CPU_COPY_V4WB | 71 | select CPU_COPY_V4WB if MMU |
72 | select CPU_TLB_V4WBI | 72 | select CPU_TLB_V4WBI if MMU |
73 | help | 73 | help |
74 | The ARM920T is licensed to be produced by numerous vendors, | 74 | The ARM920T is licensed to be produced by numerous vendors, |
75 | and is used in the Maverick EP9312 and the Samsung S3C2410. | 75 | and is used in the Maverick EP9312 and the Samsung S3C2410. |
@@ -89,8 +89,8 @@ config CPU_ARM922T | |||
89 | select CPU_ABRT_EV4T | 89 | select CPU_ABRT_EV4T |
90 | select CPU_CACHE_V4WT | 90 | select CPU_CACHE_V4WT |
91 | select CPU_CACHE_VIVT | 91 | select CPU_CACHE_VIVT |
92 | select CPU_COPY_V4WB | 92 | select CPU_COPY_V4WB if MMU |
93 | select CPU_TLB_V4WBI | 93 | select CPU_TLB_V4WBI if MMU |
94 | help | 94 | help |
95 | The ARM922T is a version of the ARM920T, but with smaller | 95 | The ARM922T is a version of the ARM920T, but with smaller |
96 | instruction and data caches. It is used in Altera's | 96 | instruction and data caches. It is used in Altera's |
@@ -108,8 +108,8 @@ config CPU_ARM925T | |||
108 | select CPU_ABRT_EV4T | 108 | select CPU_ABRT_EV4T |
109 | select CPU_CACHE_V4WT | 109 | select CPU_CACHE_V4WT |
110 | select CPU_CACHE_VIVT | 110 | select CPU_CACHE_VIVT |
111 | select CPU_COPY_V4WB | 111 | select CPU_COPY_V4WB if MMU |
112 | select CPU_TLB_V4WBI | 112 | select CPU_TLB_V4WBI if MMU |
113 | help | 113 | help |
114 | The ARM925T is a mix between the ARM920T and ARM926T, but with | 114 | The ARM925T is a mix between the ARM920T and ARM926T, but with |
115 | different instruction and data caches. It is used in TI's OMAP | 115 | different instruction and data caches. It is used in TI's OMAP |
@@ -126,8 +126,8 @@ config CPU_ARM926T | |||
126 | select CPU_32v5 | 126 | select CPU_32v5 |
127 | select CPU_ABRT_EV5TJ | 127 | select CPU_ABRT_EV5TJ |
128 | select CPU_CACHE_VIVT | 128 | select CPU_CACHE_VIVT |
129 | select CPU_COPY_V4WB | 129 | select CPU_COPY_V4WB if MMU |
130 | select CPU_TLB_V4WBI | 130 | select CPU_TLB_V4WBI if MMU |
131 | help | 131 | help |
132 | This is a variant of the ARM920. It has slightly different | 132 | This is a variant of the ARM920. It has slightly different |
133 | instruction sequences for cache and TLB operations. Curiously, | 133 | instruction sequences for cache and TLB operations. Curiously, |
@@ -144,8 +144,8 @@ config CPU_ARM1020 | |||
144 | select CPU_ABRT_EV4T | 144 | select CPU_ABRT_EV4T |
145 | select CPU_CACHE_V4WT | 145 | select CPU_CACHE_V4WT |
146 | select CPU_CACHE_VIVT | 146 | select CPU_CACHE_VIVT |
147 | select CPU_COPY_V4WB | 147 | select CPU_COPY_V4WB if MMU |
148 | select CPU_TLB_V4WBI | 148 | select CPU_TLB_V4WBI if MMU |
149 | help | 149 | help |
150 | The ARM1020 is the 32K cached version of the ARM10 processor, | 150 | The ARM1020 is the 32K cached version of the ARM10 processor, |
151 | with an addition of a floating-point unit. | 151 | with an addition of a floating-point unit. |
@@ -161,8 +161,8 @@ config CPU_ARM1020E | |||
161 | select CPU_ABRT_EV4T | 161 | select CPU_ABRT_EV4T |
162 | select CPU_CACHE_V4WT | 162 | select CPU_CACHE_V4WT |
163 | select CPU_CACHE_VIVT | 163 | select CPU_CACHE_VIVT |
164 | select CPU_COPY_V4WB | 164 | select CPU_COPY_V4WB if MMU |
165 | select CPU_TLB_V4WBI | 165 | select CPU_TLB_V4WBI if MMU |
166 | depends on n | 166 | depends on n |
167 | 167 | ||
168 | # ARM1022E | 168 | # ARM1022E |
@@ -172,8 +172,8 @@ config CPU_ARM1022 | |||
172 | select CPU_32v5 | 172 | select CPU_32v5 |
173 | select CPU_ABRT_EV4T | 173 | select CPU_ABRT_EV4T |
174 | select CPU_CACHE_VIVT | 174 | select CPU_CACHE_VIVT |
175 | select CPU_COPY_V4WB # can probably do better | 175 | select CPU_COPY_V4WB if MMU # can probably do better |
176 | select CPU_TLB_V4WBI | 176 | select CPU_TLB_V4WBI if MMU |
177 | help | 177 | help |
178 | The ARM1022E is an implementation of the ARMv5TE architecture | 178 | The ARM1022E is an implementation of the ARMv5TE architecture |
179 | based upon the ARM10 integer core with a 16KiB L1 Harvard cache, | 179 | based upon the ARM10 integer core with a 16KiB L1 Harvard cache, |
@@ -189,8 +189,8 @@ config CPU_ARM1026 | |||
189 | select CPU_32v5 | 189 | select CPU_32v5 |
190 | select CPU_ABRT_EV5T # But need Jazelle, but EV5TJ ignores bit 10 | 190 | select CPU_ABRT_EV5T # But need Jazelle, but EV5TJ ignores bit 10 |
191 | select CPU_CACHE_VIVT | 191 | select CPU_CACHE_VIVT |
192 | select CPU_COPY_V4WB # can probably do better | 192 | select CPU_COPY_V4WB if MMU # can probably do better |
193 | select CPU_TLB_V4WBI | 193 | select CPU_TLB_V4WBI if MMU |
194 | help | 194 | help |
195 | The ARM1026EJ-S is an implementation of the ARMv5TEJ architecture | 195 | The ARM1026EJ-S is an implementation of the ARMv5TEJ architecture |
196 | based upon the ARM10 integer core. | 196 | based upon the ARM10 integer core. |
@@ -207,8 +207,8 @@ config CPU_SA110 | |||
207 | select CPU_ABRT_EV4 | 207 | select CPU_ABRT_EV4 |
208 | select CPU_CACHE_V4WB | 208 | select CPU_CACHE_V4WB |
209 | select CPU_CACHE_VIVT | 209 | select CPU_CACHE_VIVT |
210 | select CPU_COPY_V4WB | 210 | select CPU_COPY_V4WB if MMU |
211 | select CPU_TLB_V4WB | 211 | select CPU_TLB_V4WB if MMU |
212 | help | 212 | help |
213 | The Intel StrongARM(R) SA-110 is a 32-bit microprocessor and | 213 | The Intel StrongARM(R) SA-110 is a 32-bit microprocessor and |
214 | is available at five speeds ranging from 100 MHz to 233 MHz. | 214 | is available at five speeds ranging from 100 MHz to 233 MHz. |
@@ -227,7 +227,7 @@ config CPU_SA1100 | |||
227 | select CPU_ABRT_EV4 | 227 | select CPU_ABRT_EV4 |
228 | select CPU_CACHE_V4WB | 228 | select CPU_CACHE_V4WB |
229 | select CPU_CACHE_VIVT | 229 | select CPU_CACHE_VIVT |
230 | select CPU_TLB_V4WB | 230 | select CPU_TLB_V4WB if MMU |
231 | 231 | ||
232 | # XScale | 232 | # XScale |
233 | config CPU_XSCALE | 233 | config CPU_XSCALE |
@@ -237,7 +237,7 @@ config CPU_XSCALE | |||
237 | select CPU_32v5 | 237 | select CPU_32v5 |
238 | select CPU_ABRT_EV5T | 238 | select CPU_ABRT_EV5T |
239 | select CPU_CACHE_VIVT | 239 | select CPU_CACHE_VIVT |
240 | select CPU_TLB_V4WBI | 240 | select CPU_TLB_V4WBI if MMU |
241 | 241 | ||
242 | # XScale Core Version 3 | 242 | # XScale Core Version 3 |
243 | config CPU_XSC3 | 243 | config CPU_XSC3 |
@@ -247,7 +247,7 @@ config CPU_XSC3 | |||
247 | select CPU_32v5 | 247 | select CPU_32v5 |
248 | select CPU_ABRT_EV5T | 248 | select CPU_ABRT_EV5T |
249 | select CPU_CACHE_VIVT | 249 | select CPU_CACHE_VIVT |
250 | select CPU_TLB_V4WBI | 250 | select CPU_TLB_V4WBI if MMU |
251 | select IO_36 | 251 | select IO_36 |
252 | 252 | ||
253 | # ARMv6 | 253 | # ARMv6 |
@@ -258,8 +258,8 @@ config CPU_V6 | |||
258 | select CPU_ABRT_EV6 | 258 | select CPU_ABRT_EV6 |
259 | select CPU_CACHE_V6 | 259 | select CPU_CACHE_V6 |
260 | select CPU_CACHE_VIPT | 260 | select CPU_CACHE_VIPT |
261 | select CPU_COPY_V6 | 261 | select CPU_COPY_V6 if MMU |
262 | select CPU_TLB_V6 | 262 | select CPU_TLB_V6 if MMU |
263 | 263 | ||
264 | # ARMv6k | 264 | # ARMv6k |
265 | config CPU_32v6K | 265 | config CPU_32v6K |
@@ -277,17 +277,17 @@ config CPU_32v6K | |||
277 | # This defines the compiler instruction set which depends on the machine type. | 277 | # This defines the compiler instruction set which depends on the machine type. |
278 | config CPU_32v3 | 278 | config CPU_32v3 |
279 | bool | 279 | bool |
280 | select TLS_REG_EMUL if SMP | 280 | select TLS_REG_EMUL if SMP || !MMU |
281 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 281 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
282 | 282 | ||
283 | config CPU_32v4 | 283 | config CPU_32v4 |
284 | bool | 284 | bool |
285 | select TLS_REG_EMUL if SMP | 285 | select TLS_REG_EMUL if SMP || !MMU |
286 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 286 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
287 | 287 | ||
288 | config CPU_32v5 | 288 | config CPU_32v5 |
289 | bool | 289 | bool |
290 | select TLS_REG_EMUL if SMP | 290 | select TLS_REG_EMUL if SMP || !MMU |
291 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 291 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
292 | 292 | ||
293 | config CPU_32v6 | 293 | config CPU_32v6 |
@@ -334,6 +334,7 @@ config CPU_CACHE_VIVT | |||
334 | config CPU_CACHE_VIPT | 334 | config CPU_CACHE_VIPT |
335 | bool | 335 | bool |
336 | 336 | ||
337 | if MMU | ||
337 | # The copy-page model | 338 | # The copy-page model |
338 | config CPU_COPY_V3 | 339 | config CPU_COPY_V3 |
339 | bool | 340 | bool |
@@ -372,6 +373,8 @@ config CPU_TLB_V4WBI | |||
372 | config CPU_TLB_V6 | 373 | config CPU_TLB_V6 |
373 | bool | 374 | bool |
374 | 375 | ||
376 | endif | ||
377 | |||
375 | # | 378 | # |
376 | # CPU supports 36-bit I/O | 379 | # CPU supports 36-bit I/O |
377 | # | 380 | # |
diff --git a/arch/arm/mm/Makefile b/arch/arm/mm/Makefile index 07a538505784..21a2770226ee 100644 --- a/arch/arm/mm/Makefile +++ b/arch/arm/mm/Makefile | |||
@@ -2,10 +2,16 @@ | |||
2 | # Makefile for the linux arm-specific parts of the memory manager. | 2 | # Makefile for the linux arm-specific parts of the memory manager. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := consistent.o extable.o fault-armv.o \ | 5 | obj-y := consistent.o extable.o fault.o init.o \ |
6 | fault.o flush.o init.o ioremap.o mmap.o \ | 6 | iomap.o |
7 | |||
8 | obj-$(CONFIG_MMU) += fault-armv.o flush.o ioremap.o mmap.o \ | ||
7 | mm-armv.o | 9 | mm-armv.o |
8 | 10 | ||
11 | ifneq ($(CONFIG_MMU),y) | ||
12 | obj-y += nommu.o | ||
13 | endif | ||
14 | |||
9 | obj-$(CONFIG_MODULES) += proc-syms.o | 15 | obj-$(CONFIG_MODULES) += proc-syms.o |
10 | 16 | ||
11 | obj-$(CONFIG_ALIGNMENT_TRAP) += alignment.o | 17 | obj-$(CONFIG_ALIGNMENT_TRAP) += alignment.o |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 9ea1f87a7079..989fd681c822 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -26,8 +26,6 @@ | |||
26 | #include <asm/mach/arch.h> | 26 | #include <asm/mach/arch.h> |
27 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
28 | 28 | ||
29 | #define TABLE_SIZE (2 * PTRS_PER_PTE * sizeof(pte_t)) | ||
30 | |||
31 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 29 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
32 | 30 | ||
33 | extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; | 31 | extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; |
diff --git a/arch/arm/mm/iomap.c b/arch/arm/mm/iomap.c new file mode 100644 index 000000000000..62066f3020c8 --- /dev/null +++ b/arch/arm/mm/iomap.c | |||
@@ -0,0 +1,55 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mm/iomap.c | ||
3 | * | ||
4 | * Map IO port and PCI memory spaces so that {read,write}[bwl] can | ||
5 | * be used to access this memory. | ||
6 | */ | ||
7 | #include <linux/module.h> | ||
8 | #include <linux/pci.h> | ||
9 | #include <linux/ioport.h> | ||
10 | |||
11 | #include <asm/io.h> | ||
12 | |||
13 | #ifdef __io | ||
14 | void __iomem *ioport_map(unsigned long port, unsigned int nr) | ||
15 | { | ||
16 | return __io(port); | ||
17 | } | ||
18 | EXPORT_SYMBOL(ioport_map); | ||
19 | |||
20 | void ioport_unmap(void __iomem *addr) | ||
21 | { | ||
22 | } | ||
23 | EXPORT_SYMBOL(ioport_unmap); | ||
24 | #endif | ||
25 | |||
26 | #ifdef CONFIG_PCI | ||
27 | void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) | ||
28 | { | ||
29 | unsigned long start = pci_resource_start(dev, bar); | ||
30 | unsigned long len = pci_resource_len(dev, bar); | ||
31 | unsigned long flags = pci_resource_flags(dev, bar); | ||
32 | |||
33 | if (!len || !start) | ||
34 | return NULL; | ||
35 | if (maxlen && len > maxlen) | ||
36 | len = maxlen; | ||
37 | if (flags & IORESOURCE_IO) | ||
38 | return ioport_map(start, len); | ||
39 | if (flags & IORESOURCE_MEM) { | ||
40 | if (flags & IORESOURCE_CACHEABLE) | ||
41 | return ioremap(start, len); | ||
42 | return ioremap_nocache(start, len); | ||
43 | } | ||
44 | return NULL; | ||
45 | } | ||
46 | EXPORT_SYMBOL(pci_iomap); | ||
47 | |||
48 | void pci_iounmap(struct pci_dev *dev, void __iomem *addr) | ||
49 | { | ||
50 | if ((unsigned long)addr >= VMALLOC_START && | ||
51 | (unsigned long)addr < VMALLOC_END) | ||
52 | iounmap(addr); | ||
53 | } | ||
54 | EXPORT_SYMBOL(pci_iounmap); | ||
55 | #endif | ||
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index c1f7180c7bed..7691cfdba567 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c | |||
@@ -176,50 +176,3 @@ void __iounmap(void __iomem *addr) | |||
176 | vunmap((void *)(PAGE_MASK & (unsigned long)addr)); | 176 | vunmap((void *)(PAGE_MASK & (unsigned long)addr)); |
177 | } | 177 | } |
178 | EXPORT_SYMBOL(__iounmap); | 178 | EXPORT_SYMBOL(__iounmap); |
179 | |||
180 | #ifdef __io | ||
181 | void __iomem *ioport_map(unsigned long port, unsigned int nr) | ||
182 | { | ||
183 | return __io(port); | ||
184 | } | ||
185 | EXPORT_SYMBOL(ioport_map); | ||
186 | |||
187 | void ioport_unmap(void __iomem *addr) | ||
188 | { | ||
189 | } | ||
190 | EXPORT_SYMBOL(ioport_unmap); | ||
191 | #endif | ||
192 | |||
193 | #ifdef CONFIG_PCI | ||
194 | #include <linux/pci.h> | ||
195 | #include <linux/ioport.h> | ||
196 | |||
197 | void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) | ||
198 | { | ||
199 | unsigned long start = pci_resource_start(dev, bar); | ||
200 | unsigned long len = pci_resource_len(dev, bar); | ||
201 | unsigned long flags = pci_resource_flags(dev, bar); | ||
202 | |||
203 | if (!len || !start) | ||
204 | return NULL; | ||
205 | if (maxlen && len > maxlen) | ||
206 | len = maxlen; | ||
207 | if (flags & IORESOURCE_IO) | ||
208 | return ioport_map(start, len); | ||
209 | if (flags & IORESOURCE_MEM) { | ||
210 | if (flags & IORESOURCE_CACHEABLE) | ||
211 | return ioremap(start, len); | ||
212 | return ioremap_nocache(start, len); | ||
213 | } | ||
214 | return NULL; | ||
215 | } | ||
216 | EXPORT_SYMBOL(pci_iomap); | ||
217 | |||
218 | void pci_iounmap(struct pci_dev *dev, void __iomem *addr) | ||
219 | { | ||
220 | if ((unsigned long)addr >= VMALLOC_START && | ||
221 | (unsigned long)addr < VMALLOC_END) | ||
222 | iounmap(addr); | ||
223 | } | ||
224 | EXPORT_SYMBOL(pci_iounmap); | ||
225 | #endif | ||
diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c new file mode 100644 index 000000000000..1464ed817b5d --- /dev/null +++ b/arch/arm/mm/nommu.c | |||
@@ -0,0 +1,39 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mm/nommu.c | ||
3 | * | ||
4 | * ARM uCLinux supporting functions. | ||
5 | */ | ||
6 | #include <linux/module.h> | ||
7 | #include <linux/mm.h> | ||
8 | #include <linux/pagemap.h> | ||
9 | |||
10 | #include <asm/cacheflush.h> | ||
11 | #include <asm/io.h> | ||
12 | #include <asm/page.h> | ||
13 | |||
14 | void flush_dcache_page(struct page *page) | ||
15 | { | ||
16 | __cpuc_flush_dcache_page(page_address(page)); | ||
17 | } | ||
18 | EXPORT_SYMBOL(flush_dcache_page); | ||
19 | |||
20 | void __iomem *__ioremap_pfn(unsigned long pfn, unsigned long offset, | ||
21 | size_t size, unsigned long flags) | ||
22 | { | ||
23 | if (pfn >= (0x100000000ULL >> PAGE_SHIFT)) | ||
24 | return NULL; | ||
25 | return (void __iomem *) (offset + (pfn << PAGE_SHIFT)); | ||
26 | } | ||
27 | EXPORT_SYMBOL(__ioremap_pfn); | ||
28 | |||
29 | void __iomem *__ioremap(unsigned long phys_addr, size_t size, | ||
30 | unsigned long flags) | ||
31 | { | ||
32 | return (void __iomem *)phys_addr; | ||
33 | } | ||
34 | EXPORT_SYMBOL(__ioremap); | ||
35 | |||
36 | void __iounmap(void __iomem *addr) | ||
37 | { | ||
38 | } | ||
39 | EXPORT_SYMBOL(__iounmap); | ||
diff --git a/arch/arm/mm/proc-arm1020.S b/arch/arm/mm/proc-arm1020.S index 959588884fa5..b9abbafca812 100644 --- a/arch/arm/mm/proc-arm1020.S +++ b/arch/arm/mm/proc-arm1020.S | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2000 ARM Limited | 4 | * Copyright (C) 2000 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
6 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
6 | * | 7 | * |
7 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -101,7 +102,9 @@ ENTRY(cpu_arm1020_reset) | |||
101 | mov ip, #0 | 102 | mov ip, #0 |
102 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 103 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
103 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 104 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
105 | #ifdef CONFIG_MMU | ||
104 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 106 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
107 | #endif | ||
105 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 108 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
106 | bic ip, ip, #0x000f @ ............wcam | 109 | bic ip, ip, #0x000f @ ............wcam |
107 | bic ip, ip, #0x1100 @ ...i...s........ | 110 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -359,6 +362,7 @@ ENTRY(cpu_arm1020_dcache_clean_area) | |||
359 | */ | 362 | */ |
360 | .align 5 | 363 | .align 5 |
361 | ENTRY(cpu_arm1020_switch_mm) | 364 | ENTRY(cpu_arm1020_switch_mm) |
365 | #ifdef CONFIG_MMU | ||
362 | #ifndef CONFIG_CPU_DCACHE_DISABLE | 366 | #ifndef CONFIG_CPU_DCACHE_DISABLE |
363 | mcr p15, 0, r3, c7, c10, 4 | 367 | mcr p15, 0, r3, c7, c10, 4 |
364 | mov r1, #0xF @ 16 segments | 368 | mov r1, #0xF @ 16 segments |
@@ -383,6 +387,7 @@ ENTRY(cpu_arm1020_switch_mm) | |||
383 | mcr p15, 0, r1, c7, c10, 4 @ drain WB | 387 | mcr p15, 0, r1, c7, c10, 4 @ drain WB |
384 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 388 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
385 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs | 389 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs |
390 | #endif /* CONFIG_MMU */ | ||
386 | mov pc, lr | 391 | mov pc, lr |
387 | 392 | ||
388 | /* | 393 | /* |
@@ -392,6 +397,7 @@ ENTRY(cpu_arm1020_switch_mm) | |||
392 | */ | 397 | */ |
393 | .align 5 | 398 | .align 5 |
394 | ENTRY(cpu_arm1020_set_pte) | 399 | ENTRY(cpu_arm1020_set_pte) |
400 | #ifdef CONFIG_MMU | ||
395 | str r1, [r0], #-2048 @ linux version | 401 | str r1, [r0], #-2048 @ linux version |
396 | 402 | ||
397 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 403 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -421,6 +427,7 @@ ENTRY(cpu_arm1020_set_pte) | |||
421 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 427 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
422 | #endif | 428 | #endif |
423 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 429 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
430 | #endif /* CONFIG_MMU */ | ||
424 | mov pc, lr | 431 | mov pc, lr |
425 | 432 | ||
426 | __INIT | 433 | __INIT |
@@ -430,7 +437,9 @@ __arm1020_setup: | |||
430 | mov r0, #0 | 437 | mov r0, #0 |
431 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 438 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
432 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 439 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
440 | #ifdef CONFIG_MMU | ||
433 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 441 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
442 | #endif | ||
434 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 443 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
435 | ldr r5, arm1020_cr1_clear | 444 | ldr r5, arm1020_cr1_clear |
436 | bic r0, r0, r5 | 445 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-arm1020e.S b/arch/arm/mm/proc-arm1020e.S index be6d081ff2b7..bcd5ee022e00 100644 --- a/arch/arm/mm/proc-arm1020e.S +++ b/arch/arm/mm/proc-arm1020e.S | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2000 ARM Limited | 4 | * Copyright (C) 2000 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
6 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
6 | * | 7 | * |
7 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -101,7 +102,9 @@ ENTRY(cpu_arm1020e_reset) | |||
101 | mov ip, #0 | 102 | mov ip, #0 |
102 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 103 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
103 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 104 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
105 | #ifdef CONFIG_MMU | ||
104 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 106 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
107 | #endif | ||
105 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 108 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
106 | bic ip, ip, #0x000f @ ............wcam | 109 | bic ip, ip, #0x000f @ ............wcam |
107 | bic ip, ip, #0x1100 @ ...i...s........ | 110 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -344,6 +347,7 @@ ENTRY(cpu_arm1020e_dcache_clean_area) | |||
344 | */ | 347 | */ |
345 | .align 5 | 348 | .align 5 |
346 | ENTRY(cpu_arm1020e_switch_mm) | 349 | ENTRY(cpu_arm1020e_switch_mm) |
350 | #ifdef CONFIG_MMU | ||
347 | #ifndef CONFIG_CPU_DCACHE_DISABLE | 351 | #ifndef CONFIG_CPU_DCACHE_DISABLE |
348 | mcr p15, 0, r3, c7, c10, 4 | 352 | mcr p15, 0, r3, c7, c10, 4 |
349 | mov r1, #0xF @ 16 segments | 353 | mov r1, #0xF @ 16 segments |
@@ -367,6 +371,7 @@ ENTRY(cpu_arm1020e_switch_mm) | |||
367 | mcr p15, 0, r1, c7, c10, 4 @ drain WB | 371 | mcr p15, 0, r1, c7, c10, 4 @ drain WB |
368 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 372 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
369 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs | 373 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs |
374 | #endif | ||
370 | mov pc, lr | 375 | mov pc, lr |
371 | 376 | ||
372 | /* | 377 | /* |
@@ -376,6 +381,7 @@ ENTRY(cpu_arm1020e_switch_mm) | |||
376 | */ | 381 | */ |
377 | .align 5 | 382 | .align 5 |
378 | ENTRY(cpu_arm1020e_set_pte) | 383 | ENTRY(cpu_arm1020e_set_pte) |
384 | #ifdef CONFIG_MMU | ||
379 | str r1, [r0], #-2048 @ linux version | 385 | str r1, [r0], #-2048 @ linux version |
380 | 386 | ||
381 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 387 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -403,6 +409,7 @@ ENTRY(cpu_arm1020e_set_pte) | |||
403 | #ifndef CONFIG_CPU_DCACHE_DISABLE | 409 | #ifndef CONFIG_CPU_DCACHE_DISABLE |
404 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 410 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
405 | #endif | 411 | #endif |
412 | #endif /* CONFIG_MMU */ | ||
406 | mov pc, lr | 413 | mov pc, lr |
407 | 414 | ||
408 | __INIT | 415 | __INIT |
@@ -412,7 +419,9 @@ __arm1020e_setup: | |||
412 | mov r0, #0 | 419 | mov r0, #0 |
413 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 420 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
414 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 421 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
422 | #ifdef CONFIG_MMU | ||
415 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 423 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
424 | #endif | ||
416 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 425 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
417 | ldr r5, arm1020e_cr1_clear | 426 | ldr r5, arm1020e_cr1_clear |
418 | bic r0, r0, r5 | 427 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-arm1022.S b/arch/arm/mm/proc-arm1022.S index f778545d57a2..b0ccff4fadd2 100644 --- a/arch/arm/mm/proc-arm1022.S +++ b/arch/arm/mm/proc-arm1022.S | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2000 ARM Limited | 4 | * Copyright (C) 2000 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
6 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
6 | * | 7 | * |
7 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -90,7 +91,9 @@ ENTRY(cpu_arm1022_reset) | |||
90 | mov ip, #0 | 91 | mov ip, #0 |
91 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 92 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
92 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 93 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
94 | #ifdef CONFIG_MMU | ||
93 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 95 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
96 | #endif | ||
94 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 97 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
95 | bic ip, ip, #0x000f @ ............wcam | 98 | bic ip, ip, #0x000f @ ............wcam |
96 | bic ip, ip, #0x1100 @ ...i...s........ | 99 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -333,6 +336,7 @@ ENTRY(cpu_arm1022_dcache_clean_area) | |||
333 | */ | 336 | */ |
334 | .align 5 | 337 | .align 5 |
335 | ENTRY(cpu_arm1022_switch_mm) | 338 | ENTRY(cpu_arm1022_switch_mm) |
339 | #ifdef CONFIG_MMU | ||
336 | #ifndef CONFIG_CPU_DCACHE_DISABLE | 340 | #ifndef CONFIG_CPU_DCACHE_DISABLE |
337 | mov r1, #(CACHE_DSEGMENTS - 1) << 5 @ 16 segments | 341 | mov r1, #(CACHE_DSEGMENTS - 1) << 5 @ 16 segments |
338 | 1: orr r3, r1, #(CACHE_DENTRIES - 1) << 26 @ 64 entries | 342 | 1: orr r3, r1, #(CACHE_DENTRIES - 1) << 26 @ 64 entries |
@@ -349,6 +353,7 @@ ENTRY(cpu_arm1022_switch_mm) | |||
349 | mcr p15, 0, r1, c7, c10, 4 @ drain WB | 353 | mcr p15, 0, r1, c7, c10, 4 @ drain WB |
350 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 354 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
351 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs | 355 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs |
356 | #endif | ||
352 | mov pc, lr | 357 | mov pc, lr |
353 | 358 | ||
354 | /* | 359 | /* |
@@ -358,6 +363,7 @@ ENTRY(cpu_arm1022_switch_mm) | |||
358 | */ | 363 | */ |
359 | .align 5 | 364 | .align 5 |
360 | ENTRY(cpu_arm1022_set_pte) | 365 | ENTRY(cpu_arm1022_set_pte) |
366 | #ifdef CONFIG_MMU | ||
361 | str r1, [r0], #-2048 @ linux version | 367 | str r1, [r0], #-2048 @ linux version |
362 | 368 | ||
363 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 369 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -385,6 +391,7 @@ ENTRY(cpu_arm1022_set_pte) | |||
385 | #ifndef CONFIG_CPU_DCACHE_DISABLE | 391 | #ifndef CONFIG_CPU_DCACHE_DISABLE |
386 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 392 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
387 | #endif | 393 | #endif |
394 | #endif /* CONFIG_MMU */ | ||
388 | mov pc, lr | 395 | mov pc, lr |
389 | 396 | ||
390 | __INIT | 397 | __INIT |
@@ -394,7 +401,9 @@ __arm1022_setup: | |||
394 | mov r0, #0 | 401 | mov r0, #0 |
395 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 402 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
396 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 403 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
404 | #ifdef CONFIG_MMU | ||
397 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 405 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
406 | #endif | ||
398 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 407 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
399 | ldr r5, arm1022_cr1_clear | 408 | ldr r5, arm1022_cr1_clear |
400 | bic r0, r0, r5 | 409 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-arm1026.S b/arch/arm/mm/proc-arm1026.S index 148c111fde73..abe850c9a641 100644 --- a/arch/arm/mm/proc-arm1026.S +++ b/arch/arm/mm/proc-arm1026.S | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2000 ARM Limited | 4 | * Copyright (C) 2000 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
6 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
6 | * | 7 | * |
7 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -90,7 +91,9 @@ ENTRY(cpu_arm1026_reset) | |||
90 | mov ip, #0 | 91 | mov ip, #0 |
91 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 92 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
92 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 93 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
94 | #ifdef CONFIG_MMU | ||
93 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 95 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
96 | #endif | ||
94 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 97 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
95 | bic ip, ip, #0x000f @ ............wcam | 98 | bic ip, ip, #0x000f @ ............wcam |
96 | bic ip, ip, #0x1100 @ ...i...s........ | 99 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -327,6 +330,7 @@ ENTRY(cpu_arm1026_dcache_clean_area) | |||
327 | */ | 330 | */ |
328 | .align 5 | 331 | .align 5 |
329 | ENTRY(cpu_arm1026_switch_mm) | 332 | ENTRY(cpu_arm1026_switch_mm) |
333 | #ifdef CONFIG_MMU | ||
330 | mov r1, #0 | 334 | mov r1, #0 |
331 | #ifndef CONFIG_CPU_DCACHE_DISABLE | 335 | #ifndef CONFIG_CPU_DCACHE_DISABLE |
332 | 1: mrc p15, 0, r15, c7, c14, 3 @ test, clean, invalidate | 336 | 1: mrc p15, 0, r15, c7, c14, 3 @ test, clean, invalidate |
@@ -338,6 +342,7 @@ ENTRY(cpu_arm1026_switch_mm) | |||
338 | mcr p15, 0, r1, c7, c10, 4 @ drain WB | 342 | mcr p15, 0, r1, c7, c10, 4 @ drain WB |
339 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 343 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
340 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs | 344 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs |
345 | #endif | ||
341 | mov pc, lr | 346 | mov pc, lr |
342 | 347 | ||
343 | /* | 348 | /* |
@@ -347,6 +352,7 @@ ENTRY(cpu_arm1026_switch_mm) | |||
347 | */ | 352 | */ |
348 | .align 5 | 353 | .align 5 |
349 | ENTRY(cpu_arm1026_set_pte) | 354 | ENTRY(cpu_arm1026_set_pte) |
355 | #ifdef CONFIG_MMU | ||
350 | str r1, [r0], #-2048 @ linux version | 356 | str r1, [r0], #-2048 @ linux version |
351 | 357 | ||
352 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 358 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -374,6 +380,7 @@ ENTRY(cpu_arm1026_set_pte) | |||
374 | #ifndef CONFIG_CPU_DCACHE_DISABLE | 380 | #ifndef CONFIG_CPU_DCACHE_DISABLE |
375 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 381 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
376 | #endif | 382 | #endif |
383 | #endif /* CONFIG_MMU */ | ||
377 | mov pc, lr | 384 | mov pc, lr |
378 | 385 | ||
379 | 386 | ||
@@ -384,8 +391,10 @@ __arm1026_setup: | |||
384 | mov r0, #0 | 391 | mov r0, #0 |
385 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 392 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
386 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 393 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
394 | #ifdef CONFIG_MMU | ||
387 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 395 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
388 | mcr p15, 0, r4, c2, c0 @ load page table pointer | 396 | mcr p15, 0, r4, c2, c0 @ load page table pointer |
397 | #endif | ||
389 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 398 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
390 | mov r0, #4 @ explicitly disable writeback | 399 | mov r0, #4 @ explicitly disable writeback |
391 | mcr p15, 7, r0, c15, c0, 0 | 400 | mcr p15, 7, r0, c15, c0, 0 |
diff --git a/arch/arm/mm/proc-arm6_7.S b/arch/arm/mm/proc-arm6_7.S index 540359b475d0..7a705edfa4b2 100644 --- a/arch/arm/mm/proc-arm6_7.S +++ b/arch/arm/mm/proc-arm6_7.S | |||
@@ -2,6 +2,7 @@ | |||
2 | * linux/arch/arm/mm/proc-arm6,7.S | 2 | * linux/arch/arm/mm/proc-arm6,7.S |
3 | * | 3 | * |
4 | * Copyright (C) 1997-2000 Russell King | 4 | * Copyright (C) 1997-2000 Russell King |
5 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
5 | * | 6 | * |
6 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
@@ -199,10 +200,12 @@ ENTRY(cpu_arm7_do_idle) | |||
199 | */ | 200 | */ |
200 | ENTRY(cpu_arm6_switch_mm) | 201 | ENTRY(cpu_arm6_switch_mm) |
201 | ENTRY(cpu_arm7_switch_mm) | 202 | ENTRY(cpu_arm7_switch_mm) |
203 | #ifdef CONFIG_MMU | ||
202 | mov r1, #0 | 204 | mov r1, #0 |
203 | mcr p15, 0, r1, c7, c0, 0 @ flush cache | 205 | mcr p15, 0, r1, c7, c0, 0 @ flush cache |
204 | mcr p15, 0, r0, c2, c0, 0 @ update page table ptr | 206 | mcr p15, 0, r0, c2, c0, 0 @ update page table ptr |
205 | mcr p15, 0, r1, c5, c0, 0 @ flush TLBs | 207 | mcr p15, 0, r1, c5, c0, 0 @ flush TLBs |
208 | #endif | ||
206 | mov pc, lr | 209 | mov pc, lr |
207 | 210 | ||
208 | /* | 211 | /* |
@@ -214,6 +217,7 @@ ENTRY(cpu_arm7_switch_mm) | |||
214 | .align 5 | 217 | .align 5 |
215 | ENTRY(cpu_arm6_set_pte) | 218 | ENTRY(cpu_arm6_set_pte) |
216 | ENTRY(cpu_arm7_set_pte) | 219 | ENTRY(cpu_arm7_set_pte) |
220 | #ifdef CONFIG_MMU | ||
217 | str r1, [r0], #-2048 @ linux version | 221 | str r1, [r0], #-2048 @ linux version |
218 | 222 | ||
219 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 223 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -232,6 +236,7 @@ ENTRY(cpu_arm7_set_pte) | |||
232 | movne r2, #0 | 236 | movne r2, #0 |
233 | 237 | ||
234 | str r2, [r0] @ hardware version | 238 | str r2, [r0] @ hardware version |
239 | #endif /* CONFIG_MMU */ | ||
235 | mov pc, lr | 240 | mov pc, lr |
236 | 241 | ||
237 | /* | 242 | /* |
@@ -243,7 +248,9 @@ ENTRY(cpu_arm6_reset) | |||
243 | ENTRY(cpu_arm7_reset) | 248 | ENTRY(cpu_arm7_reset) |
244 | mov r1, #0 | 249 | mov r1, #0 |
245 | mcr p15, 0, r1, c7, c0, 0 @ flush cache | 250 | mcr p15, 0, r1, c7, c0, 0 @ flush cache |
251 | #ifdef CONFIG_MMU | ||
246 | mcr p15, 0, r1, c5, c0, 0 @ flush TLB | 252 | mcr p15, 0, r1, c5, c0, 0 @ flush TLB |
253 | #endif | ||
247 | mov r1, #0x30 | 254 | mov r1, #0x30 |
248 | mcr p15, 0, r1, c1, c0, 0 @ turn off MMU etc | 255 | mcr p15, 0, r1, c1, c0, 0 @ turn off MMU etc |
249 | mov pc, r0 | 256 | mov pc, r0 |
@@ -253,19 +260,27 @@ ENTRY(cpu_arm7_reset) | |||
253 | .type __arm6_setup, #function | 260 | .type __arm6_setup, #function |
254 | __arm6_setup: mov r0, #0 | 261 | __arm6_setup: mov r0, #0 |
255 | mcr p15, 0, r0, c7, c0 @ flush caches on v3 | 262 | mcr p15, 0, r0, c7, c0 @ flush caches on v3 |
263 | #ifdef CONFIG_MMU | ||
256 | mcr p15, 0, r0, c5, c0 @ flush TLBs on v3 | 264 | mcr p15, 0, r0, c5, c0 @ flush TLBs on v3 |
257 | mov r0, #0x3d @ . ..RS BLDP WCAM | 265 | mov r0, #0x3d @ . ..RS BLDP WCAM |
258 | orr r0, r0, #0x100 @ . ..01 0011 1101 | 266 | orr r0, r0, #0x100 @ . ..01 0011 1101 |
267 | #else | ||
268 | mov r0, #0x3c @ . ..RS BLDP WCA. | ||
269 | #endif | ||
259 | mov pc, lr | 270 | mov pc, lr |
260 | .size __arm6_setup, . - __arm6_setup | 271 | .size __arm6_setup, . - __arm6_setup |
261 | 272 | ||
262 | .type __arm7_setup, #function | 273 | .type __arm7_setup, #function |
263 | __arm7_setup: mov r0, #0 | 274 | __arm7_setup: mov r0, #0 |
264 | mcr p15, 0, r0, c7, c0 @ flush caches on v3 | 275 | mcr p15, 0, r0, c7, c0 @ flush caches on v3 |
276 | #ifdef CONFIG_MMU | ||
265 | mcr p15, 0, r0, c5, c0 @ flush TLBs on v3 | 277 | mcr p15, 0, r0, c5, c0 @ flush TLBs on v3 |
266 | mcr p15, 0, r0, c3, c0 @ load domain access register | 278 | mcr p15, 0, r0, c3, c0 @ load domain access register |
267 | mov r0, #0x7d @ . ..RS BLDP WCAM | 279 | mov r0, #0x7d @ . ..RS BLDP WCAM |
268 | orr r0, r0, #0x100 @ . ..01 0111 1101 | 280 | orr r0, r0, #0x100 @ . ..01 0111 1101 |
281 | #else | ||
282 | mov r0, #0x7c @ . ..RS BLDP WCA. | ||
283 | #endif | ||
269 | mov pc, lr | 284 | mov pc, lr |
270 | .size __arm7_setup, . - __arm7_setup | 285 | .size __arm7_setup, . - __arm7_setup |
271 | 286 | ||
diff --git a/arch/arm/mm/proc-arm720.S b/arch/arm/mm/proc-arm720.S index 26f00ee2ad9a..86102467d37f 100644 --- a/arch/arm/mm/proc-arm720.S +++ b/arch/arm/mm/proc-arm720.S | |||
@@ -4,6 +4,7 @@ | |||
4 | * Copyright (C) 2000 Steve Hill (sjhill@cotw.com) | 4 | * Copyright (C) 2000 Steve Hill (sjhill@cotw.com) |
5 | * Rob Scott (rscott@mtrob.fdns.net) | 5 | * Rob Scott (rscott@mtrob.fdns.net) |
6 | * Copyright (C) 2000 ARM Limited, Deep Blue Solutions Ltd. | 6 | * Copyright (C) 2000 ARM Limited, Deep Blue Solutions Ltd. |
7 | * hacked for non-paged-MM by Hyok S. Choi, 2004. | ||
7 | * | 8 | * |
8 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by | 10 | * it under the terms of the GNU General Public License as published by |
@@ -29,6 +30,7 @@ | |||
29 | * out of 'proc-arm6,7.S' per RMK discussion | 30 | * out of 'proc-arm6,7.S' per RMK discussion |
30 | * 07-25-2000 SJH Added idle function. | 31 | * 07-25-2000 SJH Added idle function. |
31 | * 08-25-2000 DBS Updated for integration of ARM Ltd version. | 32 | * 08-25-2000 DBS Updated for integration of ARM Ltd version. |
33 | * 04-20-2004 HSC modified for non-paged memory management mode. | ||
32 | */ | 34 | */ |
33 | #include <linux/linkage.h> | 35 | #include <linux/linkage.h> |
34 | #include <linux/init.h> | 36 | #include <linux/init.h> |
@@ -75,10 +77,12 @@ ENTRY(cpu_arm720_do_idle) | |||
75 | * the new. | 77 | * the new. |
76 | */ | 78 | */ |
77 | ENTRY(cpu_arm720_switch_mm) | 79 | ENTRY(cpu_arm720_switch_mm) |
80 | #ifdef CONFIG_MMU | ||
78 | mov r1, #0 | 81 | mov r1, #0 |
79 | mcr p15, 0, r1, c7, c7, 0 @ invalidate cache | 82 | mcr p15, 0, r1, c7, c7, 0 @ invalidate cache |
80 | mcr p15, 0, r0, c2, c0, 0 @ update page table ptr | 83 | mcr p15, 0, r0, c2, c0, 0 @ update page table ptr |
81 | mcr p15, 0, r1, c8, c7, 0 @ flush TLB (v4) | 84 | mcr p15, 0, r1, c8, c7, 0 @ flush TLB (v4) |
85 | #endif | ||
82 | mov pc, lr | 86 | mov pc, lr |
83 | 87 | ||
84 | /* | 88 | /* |
@@ -89,6 +93,7 @@ ENTRY(cpu_arm720_switch_mm) | |||
89 | */ | 93 | */ |
90 | .align 5 | 94 | .align 5 |
91 | ENTRY(cpu_arm720_set_pte) | 95 | ENTRY(cpu_arm720_set_pte) |
96 | #ifdef CONFIG_MMU | ||
92 | str r1, [r0], #-2048 @ linux version | 97 | str r1, [r0], #-2048 @ linux version |
93 | 98 | ||
94 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 99 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -107,6 +112,7 @@ ENTRY(cpu_arm720_set_pte) | |||
107 | movne r2, #0 | 112 | movne r2, #0 |
108 | 113 | ||
109 | str r2, [r0] @ hardware version | 114 | str r2, [r0] @ hardware version |
115 | #endif | ||
110 | mov pc, lr | 116 | mov pc, lr |
111 | 117 | ||
112 | /* | 118 | /* |
@@ -117,7 +123,9 @@ ENTRY(cpu_arm720_set_pte) | |||
117 | ENTRY(cpu_arm720_reset) | 123 | ENTRY(cpu_arm720_reset) |
118 | mov ip, #0 | 124 | mov ip, #0 |
119 | mcr p15, 0, ip, c7, c7, 0 @ invalidate cache | 125 | mcr p15, 0, ip, c7, c7, 0 @ invalidate cache |
126 | #ifdef CONFIG_MMU | ||
120 | mcr p15, 0, ip, c8, c7, 0 @ flush TLB (v4) | 127 | mcr p15, 0, ip, c8, c7, 0 @ flush TLB (v4) |
128 | #endif | ||
121 | mrc p15, 0, ip, c1, c0, 0 @ get ctrl register | 129 | mrc p15, 0, ip, c1, c0, 0 @ get ctrl register |
122 | bic ip, ip, #0x000f @ ............wcam | 130 | bic ip, ip, #0x000f @ ............wcam |
123 | bic ip, ip, #0x2100 @ ..v....s........ | 131 | bic ip, ip, #0x2100 @ ..v....s........ |
@@ -130,7 +138,9 @@ ENTRY(cpu_arm720_reset) | |||
130 | __arm710_setup: | 138 | __arm710_setup: |
131 | mov r0, #0 | 139 | mov r0, #0 |
132 | mcr p15, 0, r0, c7, c7, 0 @ invalidate caches | 140 | mcr p15, 0, r0, c7, c7, 0 @ invalidate caches |
141 | #ifdef CONFIG_MMU | ||
133 | mcr p15, 0, r0, c8, c7, 0 @ flush TLB (v4) | 142 | mcr p15, 0, r0, c8, c7, 0 @ flush TLB (v4) |
143 | #endif | ||
134 | mrc p15, 0, r0, c1, c0 @ get control register | 144 | mrc p15, 0, r0, c1, c0 @ get control register |
135 | ldr r5, arm710_cr1_clear | 145 | ldr r5, arm710_cr1_clear |
136 | bic r0, r0, r5 | 146 | bic r0, r0, r5 |
@@ -156,7 +166,9 @@ arm710_cr1_set: | |||
156 | __arm720_setup: | 166 | __arm720_setup: |
157 | mov r0, #0 | 167 | mov r0, #0 |
158 | mcr p15, 0, r0, c7, c7, 0 @ invalidate caches | 168 | mcr p15, 0, r0, c7, c7, 0 @ invalidate caches |
169 | #ifdef CONFIG_MMU | ||
159 | mcr p15, 0, r0, c8, c7, 0 @ flush TLB (v4) | 170 | mcr p15, 0, r0, c8, c7, 0 @ flush TLB (v4) |
171 | #endif | ||
160 | mrc p15, 0, r0, c1, c0 @ get control register | 172 | mrc p15, 0, r0, c1, c0 @ get control register |
161 | ldr r5, arm720_cr1_clear | 173 | ldr r5, arm720_cr1_clear |
162 | bic r0, r0, r5 | 174 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S index a17f79e0199c..31dc839ba07c 100644 --- a/arch/arm/mm/proc-arm920.S +++ b/arch/arm/mm/proc-arm920.S | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 1999,2000 ARM Limited | 4 | * Copyright (C) 1999,2000 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
6 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
6 | * | 7 | * |
7 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -97,7 +98,9 @@ ENTRY(cpu_arm920_reset) | |||
97 | mov ip, #0 | 98 | mov ip, #0 |
98 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 99 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
99 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 100 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
101 | #ifdef CONFIG_MMU | ||
100 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 102 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
103 | #endif | ||
101 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 104 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
102 | bic ip, ip, #0x000f @ ............wcam | 105 | bic ip, ip, #0x000f @ ............wcam |
103 | bic ip, ip, #0x1100 @ ...i...s........ | 106 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -317,6 +320,7 @@ ENTRY(cpu_arm920_dcache_clean_area) | |||
317 | */ | 320 | */ |
318 | .align 5 | 321 | .align 5 |
319 | ENTRY(cpu_arm920_switch_mm) | 322 | ENTRY(cpu_arm920_switch_mm) |
323 | #ifdef CONFIG_MMU | ||
320 | mov ip, #0 | 324 | mov ip, #0 |
321 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 325 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
322 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache | 326 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache |
@@ -337,6 +341,7 @@ ENTRY(cpu_arm920_switch_mm) | |||
337 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 341 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
338 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 342 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
339 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 343 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
344 | #endif | ||
340 | mov pc, lr | 345 | mov pc, lr |
341 | 346 | ||
342 | /* | 347 | /* |
@@ -346,6 +351,7 @@ ENTRY(cpu_arm920_switch_mm) | |||
346 | */ | 351 | */ |
347 | .align 5 | 352 | .align 5 |
348 | ENTRY(cpu_arm920_set_pte) | 353 | ENTRY(cpu_arm920_set_pte) |
354 | #ifdef CONFIG_MMU | ||
349 | str r1, [r0], #-2048 @ linux version | 355 | str r1, [r0], #-2048 @ linux version |
350 | 356 | ||
351 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 357 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -372,6 +378,7 @@ ENTRY(cpu_arm920_set_pte) | |||
372 | mov r0, r0 | 378 | mov r0, r0 |
373 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 379 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
374 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 380 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
381 | #endif /* CONFIG_MMU */ | ||
375 | mov pc, lr | 382 | mov pc, lr |
376 | 383 | ||
377 | __INIT | 384 | __INIT |
@@ -381,7 +388,9 @@ __arm920_setup: | |||
381 | mov r0, #0 | 388 | mov r0, #0 |
382 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 389 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
383 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 390 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
391 | #ifdef CONFIG_MMU | ||
384 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 392 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
393 | #endif | ||
385 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 394 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
386 | ldr r5, arm920_cr1_clear | 395 | ldr r5, arm920_cr1_clear |
387 | bic r0, r0, r5 | 396 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-arm922.S b/arch/arm/mm/proc-arm922.S index bbde4a024a48..9e57c34f5c09 100644 --- a/arch/arm/mm/proc-arm922.S +++ b/arch/arm/mm/proc-arm922.S | |||
@@ -4,6 +4,7 @@ | |||
4 | * Copyright (C) 1999,2000 ARM Limited | 4 | * Copyright (C) 1999,2000 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
6 | * Copyright (C) 2001 Altera Corporation | 6 | * Copyright (C) 2001 Altera Corporation |
7 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
7 | * | 8 | * |
8 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by | 10 | * it under the terms of the GNU General Public License as published by |
@@ -99,7 +100,9 @@ ENTRY(cpu_arm922_reset) | |||
99 | mov ip, #0 | 100 | mov ip, #0 |
100 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 101 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
101 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 102 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
103 | #ifdef CONFIG_MMU | ||
102 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 104 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
105 | #endif | ||
103 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 106 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
104 | bic ip, ip, #0x000f @ ............wcam | 107 | bic ip, ip, #0x000f @ ............wcam |
105 | bic ip, ip, #0x1100 @ ...i...s........ | 108 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -321,6 +324,7 @@ ENTRY(cpu_arm922_dcache_clean_area) | |||
321 | */ | 324 | */ |
322 | .align 5 | 325 | .align 5 |
323 | ENTRY(cpu_arm922_switch_mm) | 326 | ENTRY(cpu_arm922_switch_mm) |
327 | #ifdef CONFIG_MMU | ||
324 | mov ip, #0 | 328 | mov ip, #0 |
325 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 329 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
326 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache | 330 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache |
@@ -341,6 +345,7 @@ ENTRY(cpu_arm922_switch_mm) | |||
341 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 345 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
342 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 346 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
343 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 347 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
348 | #endif | ||
344 | mov pc, lr | 349 | mov pc, lr |
345 | 350 | ||
346 | /* | 351 | /* |
@@ -350,6 +355,7 @@ ENTRY(cpu_arm922_switch_mm) | |||
350 | */ | 355 | */ |
351 | .align 5 | 356 | .align 5 |
352 | ENTRY(cpu_arm922_set_pte) | 357 | ENTRY(cpu_arm922_set_pte) |
358 | #ifdef CONFIG_MMU | ||
353 | str r1, [r0], #-2048 @ linux version | 359 | str r1, [r0], #-2048 @ linux version |
354 | 360 | ||
355 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 361 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -376,6 +382,7 @@ ENTRY(cpu_arm922_set_pte) | |||
376 | mov r0, r0 | 382 | mov r0, r0 |
377 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 383 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
378 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 384 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
385 | #endif /* CONFIG_MMU */ | ||
379 | mov pc, lr | 386 | mov pc, lr |
380 | 387 | ||
381 | __INIT | 388 | __INIT |
@@ -385,7 +392,9 @@ __arm922_setup: | |||
385 | mov r0, #0 | 392 | mov r0, #0 |
386 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 393 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
387 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 394 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
395 | #ifdef CONFIG_MMU | ||
388 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 396 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
397 | #endif | ||
389 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 398 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
390 | ldr r5, arm922_cr1_clear | 399 | ldr r5, arm922_cr1_clear |
391 | bic r0, r0, r5 | 400 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-arm925.S b/arch/arm/mm/proc-arm925.S index 224ce226a01b..8d47c9f3f931 100644 --- a/arch/arm/mm/proc-arm925.S +++ b/arch/arm/mm/proc-arm925.S | |||
@@ -9,6 +9,8 @@ | |||
9 | * Update for Linux-2.6 and cache flush improvements | 9 | * Update for Linux-2.6 and cache flush improvements |
10 | * Copyright (C) 2004 Nokia Corporation by Tony Lindgren <tony@atomide.com> | 10 | * Copyright (C) 2004 Nokia Corporation by Tony Lindgren <tony@atomide.com> |
11 | * | 11 | * |
12 | * hacked for non-paged-MM by Hyok S. Choi, 2004. | ||
13 | * | ||
12 | * This program is free software; you can redistribute it and/or modify | 14 | * This program is free software; you can redistribute it and/or modify |
13 | * it under the terms of the GNU General Public License as published by | 15 | * it under the terms of the GNU General Public License as published by |
14 | * the Free Software Foundation; either version 2 of the License, or | 16 | * the Free Software Foundation; either version 2 of the License, or |
@@ -122,7 +124,9 @@ ENTRY(cpu_arm925_reset) | |||
122 | mov ip, #0 | 124 | mov ip, #0 |
123 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 125 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
124 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 126 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
127 | #ifdef CONFIG_MMU | ||
125 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 128 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
129 | #endif | ||
126 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 130 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
127 | bic ip, ip, #0x000f @ ............wcam | 131 | bic ip, ip, #0x000f @ ............wcam |
128 | bic ip, ip, #0x1100 @ ...i...s........ | 132 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -369,6 +373,7 @@ ENTRY(cpu_arm925_dcache_clean_area) | |||
369 | */ | 373 | */ |
370 | .align 5 | 374 | .align 5 |
371 | ENTRY(cpu_arm925_switch_mm) | 375 | ENTRY(cpu_arm925_switch_mm) |
376 | #ifdef CONFIG_MMU | ||
372 | mov ip, #0 | 377 | mov ip, #0 |
373 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 378 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
374 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache | 379 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache |
@@ -383,6 +388,7 @@ ENTRY(cpu_arm925_switch_mm) | |||
383 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 388 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
384 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 389 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
385 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 390 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
391 | #endif | ||
386 | mov pc, lr | 392 | mov pc, lr |
387 | 393 | ||
388 | /* | 394 | /* |
@@ -392,6 +398,7 @@ ENTRY(cpu_arm925_switch_mm) | |||
392 | */ | 398 | */ |
393 | .align 5 | 399 | .align 5 |
394 | ENTRY(cpu_arm925_set_pte) | 400 | ENTRY(cpu_arm925_set_pte) |
401 | #ifdef CONFIG_MMU | ||
395 | str r1, [r0], #-2048 @ linux version | 402 | str r1, [r0], #-2048 @ linux version |
396 | 403 | ||
397 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 404 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -420,6 +427,7 @@ ENTRY(cpu_arm925_set_pte) | |||
420 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 427 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
421 | #endif | 428 | #endif |
422 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 429 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
430 | #endif /* CONFIG_MMU */ | ||
423 | mov pc, lr | 431 | mov pc, lr |
424 | 432 | ||
425 | __INIT | 433 | __INIT |
@@ -438,7 +446,9 @@ __arm925_setup: | |||
438 | mov r0, #0 | 446 | mov r0, #0 |
439 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 447 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
440 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 448 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
449 | #ifdef CONFIG_MMU | ||
441 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 450 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
451 | #endif | ||
442 | 452 | ||
443 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 453 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
444 | mov r0, #4 @ disable write-back on caches explicitly | 454 | mov r0, #4 @ disable write-back on caches explicitly |
diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S index 4e2a087cf388..cb4d8f33d2a3 100644 --- a/arch/arm/mm/proc-arm926.S +++ b/arch/arm/mm/proc-arm926.S | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 1999-2001 ARM Limited | 4 | * Copyright (C) 1999-2001 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
6 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
6 | * | 7 | * |
7 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -85,7 +86,9 @@ ENTRY(cpu_arm926_reset) | |||
85 | mov ip, #0 | 86 | mov ip, #0 |
86 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 87 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
87 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 88 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
89 | #ifdef CONFIG_MMU | ||
88 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 90 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
91 | #endif | ||
89 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 92 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
90 | bic ip, ip, #0x000f @ ............wcam | 93 | bic ip, ip, #0x000f @ ............wcam |
91 | bic ip, ip, #0x1100 @ ...i...s........ | 94 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -329,6 +332,7 @@ ENTRY(cpu_arm926_dcache_clean_area) | |||
329 | */ | 332 | */ |
330 | .align 5 | 333 | .align 5 |
331 | ENTRY(cpu_arm926_switch_mm) | 334 | ENTRY(cpu_arm926_switch_mm) |
335 | #ifdef CONFIG_MMU | ||
332 | mov ip, #0 | 336 | mov ip, #0 |
333 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 337 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
334 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache | 338 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache |
@@ -341,6 +345,7 @@ ENTRY(cpu_arm926_switch_mm) | |||
341 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 345 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
342 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 346 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
343 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 347 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
348 | #endif | ||
344 | mov pc, lr | 349 | mov pc, lr |
345 | 350 | ||
346 | /* | 351 | /* |
@@ -350,6 +355,7 @@ ENTRY(cpu_arm926_switch_mm) | |||
350 | */ | 355 | */ |
351 | .align 5 | 356 | .align 5 |
352 | ENTRY(cpu_arm926_set_pte) | 357 | ENTRY(cpu_arm926_set_pte) |
358 | #ifdef CONFIG_MMU | ||
353 | str r1, [r0], #-2048 @ linux version | 359 | str r1, [r0], #-2048 @ linux version |
354 | 360 | ||
355 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 361 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -378,6 +384,7 @@ ENTRY(cpu_arm926_set_pte) | |||
378 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 384 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
379 | #endif | 385 | #endif |
380 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 386 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
387 | #endif | ||
381 | mov pc, lr | 388 | mov pc, lr |
382 | 389 | ||
383 | __INIT | 390 | __INIT |
@@ -387,7 +394,9 @@ __arm926_setup: | |||
387 | mov r0, #0 | 394 | mov r0, #0 |
388 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 395 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
389 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 396 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
397 | #ifdef CONFIG_MMU | ||
390 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 398 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
399 | #endif | ||
391 | 400 | ||
392 | 401 | ||
393 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 402 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
diff --git a/arch/arm/mm/proc-sa110.S b/arch/arm/mm/proc-sa110.S index a2dd5ae1077d..5a760a2c629c 100644 --- a/arch/arm/mm/proc-sa110.S +++ b/arch/arm/mm/proc-sa110.S | |||
@@ -2,6 +2,7 @@ | |||
2 | * linux/arch/arm/mm/proc-sa110.S | 2 | * linux/arch/arm/mm/proc-sa110.S |
3 | * | 3 | * |
4 | * Copyright (C) 1997-2002 Russell King | 4 | * Copyright (C) 1997-2002 Russell King |
5 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
5 | * | 6 | * |
6 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
@@ -67,7 +68,9 @@ ENTRY(cpu_sa110_reset) | |||
67 | mov ip, #0 | 68 | mov ip, #0 |
68 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 69 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
69 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 70 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
71 | #ifdef CONFIG_MMU | ||
70 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 72 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
73 | #endif | ||
71 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 74 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
72 | bic ip, ip, #0x000f @ ............wcam | 75 | bic ip, ip, #0x000f @ ............wcam |
73 | bic ip, ip, #0x1100 @ ...i...s........ | 76 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -130,11 +133,15 @@ ENTRY(cpu_sa110_dcache_clean_area) | |||
130 | */ | 133 | */ |
131 | .align 5 | 134 | .align 5 |
132 | ENTRY(cpu_sa110_switch_mm) | 135 | ENTRY(cpu_sa110_switch_mm) |
136 | #ifdef CONFIG_MMU | ||
133 | str lr, [sp, #-4]! | 137 | str lr, [sp, #-4]! |
134 | bl v4wb_flush_kern_cache_all @ clears IP | 138 | bl v4wb_flush_kern_cache_all @ clears IP |
135 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 139 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
136 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 140 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
137 | ldr pc, [sp], #4 | 141 | ldr pc, [sp], #4 |
142 | #else | ||
143 | mov pc, lr | ||
144 | #endif | ||
138 | 145 | ||
139 | /* | 146 | /* |
140 | * cpu_sa110_set_pte(ptep, pte) | 147 | * cpu_sa110_set_pte(ptep, pte) |
@@ -143,6 +150,7 @@ ENTRY(cpu_sa110_switch_mm) | |||
143 | */ | 150 | */ |
144 | .align 5 | 151 | .align 5 |
145 | ENTRY(cpu_sa110_set_pte) | 152 | ENTRY(cpu_sa110_set_pte) |
153 | #ifdef CONFIG_MMU | ||
146 | str r1, [r0], #-2048 @ linux version | 154 | str r1, [r0], #-2048 @ linux version |
147 | 155 | ||
148 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 156 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -164,6 +172,7 @@ ENTRY(cpu_sa110_set_pte) | |||
164 | mov r0, r0 | 172 | mov r0, r0 |
165 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 173 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
166 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 174 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
175 | #endif | ||
167 | mov pc, lr | 176 | mov pc, lr |
168 | 177 | ||
169 | __INIT | 178 | __INIT |
@@ -173,7 +182,9 @@ __sa110_setup: | |||
173 | mov r10, #0 | 182 | mov r10, #0 |
174 | mcr p15, 0, r10, c7, c7 @ invalidate I,D caches on v4 | 183 | mcr p15, 0, r10, c7, c7 @ invalidate I,D caches on v4 |
175 | mcr p15, 0, r10, c7, c10, 4 @ drain write buffer on v4 | 184 | mcr p15, 0, r10, c7, c10, 4 @ drain write buffer on v4 |
185 | #ifdef CONFIG_MMU | ||
176 | mcr p15, 0, r10, c8, c7 @ invalidate I,D TLBs on v4 | 186 | mcr p15, 0, r10, c8, c7 @ invalidate I,D TLBs on v4 |
187 | #endif | ||
177 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 188 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
178 | ldr r5, sa110_cr1_clear | 189 | ldr r5, sa110_cr1_clear |
179 | bic r0, r0, r5 | 190 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S index 777ad99c1439..0a2107ad4c32 100644 --- a/arch/arm/mm/proc-sa1100.S +++ b/arch/arm/mm/proc-sa1100.S | |||
@@ -2,6 +2,7 @@ | |||
2 | * linux/arch/arm/mm/proc-sa1100.S | 2 | * linux/arch/arm/mm/proc-sa1100.S |
3 | * | 3 | * |
4 | * Copyright (C) 1997-2002 Russell King | 4 | * Copyright (C) 1997-2002 Russell King |
5 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
5 | * | 6 | * |
6 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
@@ -77,7 +78,9 @@ ENTRY(cpu_sa1100_reset) | |||
77 | mov ip, #0 | 78 | mov ip, #0 |
78 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 79 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
79 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 80 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
81 | #ifdef CONFIG_MMU | ||
80 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 82 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
83 | #endif | ||
81 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 84 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
82 | bic ip, ip, #0x000f @ ............wcam | 85 | bic ip, ip, #0x000f @ ............wcam |
83 | bic ip, ip, #0x1100 @ ...i...s........ | 86 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -142,12 +145,16 @@ ENTRY(cpu_sa1100_dcache_clean_area) | |||
142 | */ | 145 | */ |
143 | .align 5 | 146 | .align 5 |
144 | ENTRY(cpu_sa1100_switch_mm) | 147 | ENTRY(cpu_sa1100_switch_mm) |
148 | #ifdef CONFIG_MMU | ||
145 | str lr, [sp, #-4]! | 149 | str lr, [sp, #-4]! |
146 | bl v4wb_flush_kern_cache_all @ clears IP | 150 | bl v4wb_flush_kern_cache_all @ clears IP |
147 | mcr p15, 0, ip, c9, c0, 0 @ invalidate RB | 151 | mcr p15, 0, ip, c9, c0, 0 @ invalidate RB |
148 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 152 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
149 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 153 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
150 | ldr pc, [sp], #4 | 154 | ldr pc, [sp], #4 |
155 | #else | ||
156 | mov pc, lr | ||
157 | #endif | ||
151 | 158 | ||
152 | /* | 159 | /* |
153 | * cpu_sa1100_set_pte(ptep, pte) | 160 | * cpu_sa1100_set_pte(ptep, pte) |
@@ -156,6 +163,7 @@ ENTRY(cpu_sa1100_switch_mm) | |||
156 | */ | 163 | */ |
157 | .align 5 | 164 | .align 5 |
158 | ENTRY(cpu_sa1100_set_pte) | 165 | ENTRY(cpu_sa1100_set_pte) |
166 | #ifdef CONFIG_MMU | ||
159 | str r1, [r0], #-2048 @ linux version | 167 | str r1, [r0], #-2048 @ linux version |
160 | 168 | ||
161 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 169 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -177,6 +185,7 @@ ENTRY(cpu_sa1100_set_pte) | |||
177 | mov r0, r0 | 185 | mov r0, r0 |
178 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 186 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
179 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 187 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
188 | #endif | ||
180 | mov pc, lr | 189 | mov pc, lr |
181 | 190 | ||
182 | __INIT | 191 | __INIT |
@@ -186,7 +195,9 @@ __sa1100_setup: | |||
186 | mov r0, #0 | 195 | mov r0, #0 |
187 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 196 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
188 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 197 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
198 | #ifdef CONFIG_MMU | ||
189 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 199 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
200 | #endif | ||
190 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 201 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
191 | ldr r5, sa1100_cr1_clear | 202 | ldr r5, sa1100_cr1_clear |
192 | bic r0, r0, r5 | 203 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index 09b1a41a6de8..ca13d4d05f65 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S | |||
@@ -2,6 +2,7 @@ | |||
2 | * linux/arch/arm/mm/proc-v6.S | 2 | * linux/arch/arm/mm/proc-v6.S |
3 | * | 3 | * |
4 | * Copyright (C) 2001 Deep Blue Solutions Ltd. | 4 | * Copyright (C) 2001 Deep Blue Solutions Ltd. |
5 | * Modified by Catalin Marinas for noMMU support | ||
5 | * | 6 | * |
6 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
@@ -88,6 +89,7 @@ ENTRY(cpu_v6_dcache_clean_area) | |||
88 | * - we are not using split page tables | 89 | * - we are not using split page tables |
89 | */ | 90 | */ |
90 | ENTRY(cpu_v6_switch_mm) | 91 | ENTRY(cpu_v6_switch_mm) |
92 | #ifdef CONFIG_MMU | ||
91 | mov r2, #0 | 93 | mov r2, #0 |
92 | ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id | 94 | ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id |
93 | #ifdef CONFIG_SMP | 95 | #ifdef CONFIG_SMP |
@@ -97,6 +99,7 @@ ENTRY(cpu_v6_switch_mm) | |||
97 | mcr p15, 0, r2, c7, c10, 4 @ drain write buffer | 99 | mcr p15, 0, r2, c7, c10, 4 @ drain write buffer |
98 | mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 | 100 | mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 |
99 | mcr p15, 0, r1, c13, c0, 1 @ set context ID | 101 | mcr p15, 0, r1, c13, c0, 1 @ set context ID |
102 | #endif | ||
100 | mov pc, lr | 103 | mov pc, lr |
101 | 104 | ||
102 | /* | 105 | /* |
@@ -119,6 +122,7 @@ ENTRY(cpu_v6_switch_mm) | |||
119 | * 1111 0 1 1 r/w r/w | 122 | * 1111 0 1 1 r/w r/w |
120 | */ | 123 | */ |
121 | ENTRY(cpu_v6_set_pte) | 124 | ENTRY(cpu_v6_set_pte) |
125 | #ifdef CONFIG_MMU | ||
122 | str r1, [r0], #-2048 @ linux version | 126 | str r1, [r0], #-2048 @ linux version |
123 | 127 | ||
124 | bic r2, r1, #0x000003f0 | 128 | bic r2, r1, #0x000003f0 |
@@ -145,6 +149,7 @@ ENTRY(cpu_v6_set_pte) | |||
145 | 149 | ||
146 | str r2, [r0] | 150 | str r2, [r0] |
147 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte | 151 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte |
152 | #endif | ||
148 | mov pc, lr | 153 | mov pc, lr |
149 | 154 | ||
150 | 155 | ||
@@ -194,12 +199,14 @@ __v6_setup: | |||
194 | mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache | 199 | mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache |
195 | mcr p15, 0, r0, c7, c15, 0 @ clean+invalidate cache | 200 | mcr p15, 0, r0, c7, c15, 0 @ clean+invalidate cache |
196 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer | 201 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer |
202 | #ifdef CONFIG_MMU | ||
197 | mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs | 203 | mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs |
198 | mcr p15, 0, r0, c2, c0, 2 @ TTB control register | 204 | mcr p15, 0, r0, c2, c0, 2 @ TTB control register |
199 | #ifdef CONFIG_SMP | 205 | #ifdef CONFIG_SMP |
200 | orr r4, r4, #TTB_RGN_WBWA|TTB_S @ mark PTWs shared, outer cacheable | 206 | orr r4, r4, #TTB_RGN_WBWA|TTB_S @ mark PTWs shared, outer cacheable |
201 | #endif | 207 | #endif |
202 | mcr p15, 0, r4, c2, c0, 1 @ load TTB1 | 208 | mcr p15, 0, r4, c2, c0, 1 @ load TTB1 |
209 | #endif /* CONFIG_MMU */ | ||
203 | #ifdef CONFIG_VFP | 210 | #ifdef CONFIG_VFP |
204 | mrc p15, 0, r0, c1, c0, 2 | 211 | mrc p15, 0, r0, c1, c0, 2 |
205 | orr r0, r0, #(0xf << 20) | 212 | orr r0, r0, #(0xf << 20) |
diff --git a/arch/cris/Kconfig b/arch/cris/Kconfig index 856b665020e7..6a1238a29d6c 100644 --- a/arch/cris/Kconfig +++ b/arch/cris/Kconfig | |||
@@ -28,6 +28,10 @@ config GENERIC_CALIBRATE_DELAY | |||
28 | bool | 28 | bool |
29 | default y | 29 | default y |
30 | 30 | ||
31 | config IRQ_PER_CPU | ||
32 | bool | ||
33 | default y | ||
34 | |||
31 | config CRIS | 35 | config CRIS |
32 | bool | 36 | bool |
33 | default y | 37 | default y |
diff --git a/arch/cris/arch-v10/kernel/irq.c b/arch/cris/arch-v10/kernel/irq.c index 4b368a122015..2d5be93b5197 100644 --- a/arch/cris/arch-v10/kernel/irq.c +++ b/arch/cris/arch-v10/kernel/irq.c | |||
@@ -172,7 +172,7 @@ init_IRQ(void) | |||
172 | 172 | ||
173 | /* Initialize IRQ handler descriptiors. */ | 173 | /* Initialize IRQ handler descriptiors. */ |
174 | for(i = 2; i < NR_IRQS; i++) { | 174 | for(i = 2; i < NR_IRQS; i++) { |
175 | irq_desc[i].handler = &crisv10_irq_type; | 175 | irq_desc[i].chip = &crisv10_irq_type; |
176 | set_int_vector(i, interrupt[i]); | 176 | set_int_vector(i, interrupt[i]); |
177 | } | 177 | } |
178 | 178 | ||
diff --git a/arch/cris/arch-v32/drivers/pci/bios.c b/arch/cris/arch-v32/drivers/pci/bios.c index 1e9d062103ae..a2b9c60c2777 100644 --- a/arch/cris/arch-v32/drivers/pci/bios.c +++ b/arch/cris/arch-v32/drivers/pci/bios.c | |||
@@ -43,10 +43,10 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
43 | 43 | ||
44 | void | 44 | void |
45 | pcibios_align_resource(void *data, struct resource *res, | 45 | pcibios_align_resource(void *data, struct resource *res, |
46 | unsigned long size, unsigned long align) | 46 | resource_size_t size, resource_size_t align) |
47 | { | 47 | { |
48 | if (res->flags & IORESOURCE_IO) { | 48 | if (res->flags & IORESOURCE_IO) { |
49 | unsigned long start = res->start; | 49 | resource_size_t start = res->start; |
50 | 50 | ||
51 | if (start & 0x300) { | 51 | if (start & 0x300) { |
52 | start = (start + 0x3ff) & ~0x3ff; | 52 | start = (start + 0x3ff) & ~0x3ff; |
diff --git a/arch/cris/arch-v32/kernel/irq.c b/arch/cris/arch-v32/kernel/irq.c index c78cc2685133..06260874f018 100644 --- a/arch/cris/arch-v32/kernel/irq.c +++ b/arch/cris/arch-v32/kernel/irq.c | |||
@@ -369,7 +369,7 @@ init_IRQ(void) | |||
369 | 369 | ||
370 | /* Point all IRQ's to bad handlers. */ | 370 | /* Point all IRQ's to bad handlers. */ |
371 | for (i = FIRST_IRQ, j = 0; j < NR_IRQS; i++, j++) { | 371 | for (i = FIRST_IRQ, j = 0; j < NR_IRQS; i++, j++) { |
372 | irq_desc[j].handler = &crisv32_irq_type; | 372 | irq_desc[j].chip = &crisv32_irq_type; |
373 | set_exception_vector(i, interrupt[j]); | 373 | set_exception_vector(i, interrupt[j]); |
374 | } | 374 | } |
375 | 375 | ||
diff --git a/arch/cris/kernel/irq.c b/arch/cris/kernel/irq.c index b504def3e346..6547bb646364 100644 --- a/arch/cris/kernel/irq.c +++ b/arch/cris/kernel/irq.c | |||
@@ -69,7 +69,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
69 | for_each_online_cpu(j) | 69 | for_each_online_cpu(j) |
70 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 70 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
71 | #endif | 71 | #endif |
72 | seq_printf(p, " %14s", irq_desc[i].handler->typename); | 72 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
73 | seq_printf(p, " %s", action->name); | 73 | seq_printf(p, " %s", action->name); |
74 | 74 | ||
75 | for (action=action->next; action; action = action->next) | 75 | for (action=action->next; action; action = action->next) |
diff --git a/arch/frv/mb93090-mb00/pci-frv.c b/arch/frv/mb93090-mb00/pci-frv.c index 0a26bf6f1cd4..4f165c93be42 100644 --- a/arch/frv/mb93090-mb00/pci-frv.c +++ b/arch/frv/mb93090-mb00/pci-frv.c | |||
@@ -64,10 +64,10 @@ pcibios_update_resource(struct pci_dev *dev, struct resource *root, | |||
64 | */ | 64 | */ |
65 | void | 65 | void |
66 | pcibios_align_resource(void *data, struct resource *res, | 66 | pcibios_align_resource(void *data, struct resource *res, |
67 | unsigned long size, unsigned long align) | 67 | resource_size_t size, resource_size_t align) |
68 | { | 68 | { |
69 | if (res->flags & IORESOURCE_IO) { | 69 | if (res->flags & IORESOURCE_IO) { |
70 | unsigned long start = res->start; | 70 | resource_size_t start = res->start; |
71 | 71 | ||
72 | if (start & 0x300) { | 72 | if (start & 0x300) { |
73 | start = (start + 0x3ff) & ~0x3ff; | 73 | start = (start + 0x3ff) & ~0x3ff; |
diff --git a/arch/i386/Kconfig b/arch/i386/Kconfig index 3bb221db164a..0463f6335905 100644 --- a/arch/i386/Kconfig +++ b/arch/i386/Kconfig | |||
@@ -529,6 +529,7 @@ config X86_PAE | |||
529 | bool | 529 | bool |
530 | depends on HIGHMEM64G | 530 | depends on HIGHMEM64G |
531 | default y | 531 | default y |
532 | select RESOURCES_64BIT | ||
532 | 533 | ||
533 | # Common NUMA Features | 534 | # Common NUMA Features |
534 | config NUMA | 535 | config NUMA |
@@ -794,6 +795,9 @@ config COMPAT_VDSO | |||
794 | 795 | ||
795 | endmenu | 796 | endmenu |
796 | 797 | ||
798 | config ARCH_ENABLE_MEMORY_HOTPLUG | ||
799 | def_bool y | ||
800 | depends on HIGHMEM | ||
797 | 801 | ||
798 | menu "Power management options (ACPI, APM)" | 802 | menu "Power management options (ACPI, APM)" |
799 | depends on !X86_VOYAGER | 803 | depends on !X86_VOYAGER |
diff --git a/arch/i386/kernel/efi.c b/arch/i386/kernel/efi.c index 9202b67c4b2e..8beb0f07d999 100644 --- a/arch/i386/kernel/efi.c +++ b/arch/i386/kernel/efi.c | |||
@@ -601,8 +601,10 @@ efi_initialize_iomem_resources(struct resource *code_resource, | |||
601 | res->end = res->start + ((md->num_pages << EFI_PAGE_SHIFT) - 1); | 601 | res->end = res->start + ((md->num_pages << EFI_PAGE_SHIFT) - 1); |
602 | res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; | 602 | res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; |
603 | if (request_resource(&iomem_resource, res) < 0) | 603 | if (request_resource(&iomem_resource, res) < 0) |
604 | printk(KERN_ERR PFX "Failed to allocate res %s : 0x%lx-0x%lx\n", | 604 | printk(KERN_ERR PFX "Failed to allocate res %s : " |
605 | res->name, res->start, res->end); | 605 | "0x%llx-0x%llx\n", res->name, |
606 | (unsigned long long)res->start, | ||
607 | (unsigned long long)res->end); | ||
606 | /* | 608 | /* |
607 | * We don't know which region contains kernel data so we try | 609 | * We don't know which region contains kernel data so we try |
608 | * it repeatedly and let the resource manager test it. | 610 | * it repeatedly and let the resource manager test it. |
diff --git a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c index c1a42feba286..3c6063671a9f 100644 --- a/arch/i386/kernel/i8259.c +++ b/arch/i386/kernel/i8259.c | |||
@@ -132,7 +132,7 @@ void make_8259A_irq(unsigned int irq) | |||
132 | { | 132 | { |
133 | disable_irq_nosync(irq); | 133 | disable_irq_nosync(irq); |
134 | io_apic_irqs &= ~(1<<irq); | 134 | io_apic_irqs &= ~(1<<irq); |
135 | irq_desc[irq].handler = &i8259A_irq_type; | 135 | irq_desc[irq].chip = &i8259A_irq_type; |
136 | enable_irq(irq); | 136 | enable_irq(irq); |
137 | } | 137 | } |
138 | 138 | ||
@@ -386,12 +386,12 @@ void __init init_ISA_irqs (void) | |||
386 | /* | 386 | /* |
387 | * 16 old-style INTA-cycle interrupts: | 387 | * 16 old-style INTA-cycle interrupts: |
388 | */ | 388 | */ |
389 | irq_desc[i].handler = &i8259A_irq_type; | 389 | irq_desc[i].chip = &i8259A_irq_type; |
390 | } else { | 390 | } else { |
391 | /* | 391 | /* |
392 | * 'high' PCI IRQs filled in on demand | 392 | * 'high' PCI IRQs filled in on demand |
393 | */ | 393 | */ |
394 | irq_desc[i].handler = &no_irq_type; | 394 | irq_desc[i].chip = &no_irq_type; |
395 | } | 395 | } |
396 | } | 396 | } |
397 | } | 397 | } |
diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c index 72ae414e4d49..ec9ea0269d36 100644 --- a/arch/i386/kernel/io_apic.c +++ b/arch/i386/kernel/io_apic.c | |||
@@ -581,7 +581,7 @@ static int balanced_irq(void *unused) | |||
581 | 581 | ||
582 | /* push everything to CPU 0 to give us a starting point. */ | 582 | /* push everything to CPU 0 to give us a starting point. */ |
583 | for (i = 0 ; i < NR_IRQS ; i++) { | 583 | for (i = 0 ; i < NR_IRQS ; i++) { |
584 | pending_irq_cpumask[i] = cpumask_of_cpu(0); | 584 | irq_desc[i].pending_mask = cpumask_of_cpu(0); |
585 | set_pending_irq(i, cpumask_of_cpu(0)); | 585 | set_pending_irq(i, cpumask_of_cpu(0)); |
586 | } | 586 | } |
587 | 587 | ||
@@ -1205,15 +1205,17 @@ static struct hw_interrupt_type ioapic_edge_type; | |||
1205 | #define IOAPIC_EDGE 0 | 1205 | #define IOAPIC_EDGE 0 |
1206 | #define IOAPIC_LEVEL 1 | 1206 | #define IOAPIC_LEVEL 1 |
1207 | 1207 | ||
1208 | static inline void ioapic_register_intr(int irq, int vector, unsigned long trigger) | 1208 | static void ioapic_register_intr(int irq, int vector, unsigned long trigger) |
1209 | { | 1209 | { |
1210 | unsigned idx = use_pci_vector() && !platform_legacy_irq(irq) ? vector : irq; | 1210 | unsigned idx; |
1211 | |||
1212 | idx = use_pci_vector() && !platform_legacy_irq(irq) ? vector : irq; | ||
1211 | 1213 | ||
1212 | if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || | 1214 | if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || |
1213 | trigger == IOAPIC_LEVEL) | 1215 | trigger == IOAPIC_LEVEL) |
1214 | irq_desc[idx].handler = &ioapic_level_type; | 1216 | irq_desc[idx].chip = &ioapic_level_type; |
1215 | else | 1217 | else |
1216 | irq_desc[idx].handler = &ioapic_edge_type; | 1218 | irq_desc[idx].chip = &ioapic_edge_type; |
1217 | set_intr_gate(vector, interrupt[idx]); | 1219 | set_intr_gate(vector, interrupt[idx]); |
1218 | } | 1220 | } |
1219 | 1221 | ||
@@ -1325,7 +1327,7 @@ static void __init setup_ExtINT_IRQ0_pin(unsigned int apic, unsigned int pin, in | |||
1325 | * The timer IRQ doesn't have to know that behind the | 1327 | * The timer IRQ doesn't have to know that behind the |
1326 | * scene we have a 8259A-master in AEOI mode ... | 1328 | * scene we have a 8259A-master in AEOI mode ... |
1327 | */ | 1329 | */ |
1328 | irq_desc[0].handler = &ioapic_edge_type; | 1330 | irq_desc[0].chip = &ioapic_edge_type; |
1329 | 1331 | ||
1330 | /* | 1332 | /* |
1331 | * Add it to the IO-APIC irq-routing table: | 1333 | * Add it to the IO-APIC irq-routing table: |
@@ -2069,6 +2071,13 @@ static void set_ioapic_affinity_vector (unsigned int vector, | |||
2069 | #endif | 2071 | #endif |
2070 | #endif | 2072 | #endif |
2071 | 2073 | ||
2074 | static int ioapic_retrigger(unsigned int irq) | ||
2075 | { | ||
2076 | send_IPI_self(IO_APIC_VECTOR(irq)); | ||
2077 | |||
2078 | return 1; | ||
2079 | } | ||
2080 | |||
2072 | /* | 2081 | /* |
2073 | * Level and edge triggered IO-APIC interrupts need different handling, | 2082 | * Level and edge triggered IO-APIC interrupts need different handling, |
2074 | * so we use two separate IRQ descriptors. Edge triggered IRQs can be | 2083 | * so we use two separate IRQ descriptors. Edge triggered IRQs can be |
@@ -2088,6 +2097,7 @@ static struct hw_interrupt_type ioapic_edge_type __read_mostly = { | |||
2088 | #ifdef CONFIG_SMP | 2097 | #ifdef CONFIG_SMP |
2089 | .set_affinity = set_ioapic_affinity, | 2098 | .set_affinity = set_ioapic_affinity, |
2090 | #endif | 2099 | #endif |
2100 | .retrigger = ioapic_retrigger, | ||
2091 | }; | 2101 | }; |
2092 | 2102 | ||
2093 | static struct hw_interrupt_type ioapic_level_type __read_mostly = { | 2103 | static struct hw_interrupt_type ioapic_level_type __read_mostly = { |
@@ -2101,6 +2111,7 @@ static struct hw_interrupt_type ioapic_level_type __read_mostly = { | |||
2101 | #ifdef CONFIG_SMP | 2111 | #ifdef CONFIG_SMP |
2102 | .set_affinity = set_ioapic_affinity, | 2112 | .set_affinity = set_ioapic_affinity, |
2103 | #endif | 2113 | #endif |
2114 | .retrigger = ioapic_retrigger, | ||
2104 | }; | 2115 | }; |
2105 | 2116 | ||
2106 | static inline void init_IO_APIC_traps(void) | 2117 | static inline void init_IO_APIC_traps(void) |
@@ -2135,7 +2146,7 @@ static inline void init_IO_APIC_traps(void) | |||
2135 | make_8259A_irq(irq); | 2146 | make_8259A_irq(irq); |
2136 | else | 2147 | else |
2137 | /* Strange. Oh, well.. */ | 2148 | /* Strange. Oh, well.. */ |
2138 | irq_desc[irq].handler = &no_irq_type; | 2149 | irq_desc[irq].chip = &no_irq_type; |
2139 | } | 2150 | } |
2140 | } | 2151 | } |
2141 | } | 2152 | } |
@@ -2351,7 +2362,7 @@ static inline void check_timer(void) | |||
2351 | printk(KERN_INFO "...trying to set up timer as Virtual Wire IRQ..."); | 2362 | printk(KERN_INFO "...trying to set up timer as Virtual Wire IRQ..."); |
2352 | 2363 | ||
2353 | disable_8259A_irq(0); | 2364 | disable_8259A_irq(0); |
2354 | irq_desc[0].handler = &lapic_irq_type; | 2365 | irq_desc[0].chip = &lapic_irq_type; |
2355 | apic_write_around(APIC_LVT0, APIC_DM_FIXED | vector); /* Fixed mode */ | 2366 | apic_write_around(APIC_LVT0, APIC_DM_FIXED | vector); /* Fixed mode */ |
2356 | enable_8259A_irq(0); | 2367 | enable_8259A_irq(0); |
2357 | 2368 | ||
diff --git a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c index c703bc7b0880..16b491703967 100644 --- a/arch/i386/kernel/irq.c +++ b/arch/i386/kernel/irq.c | |||
@@ -60,6 +60,12 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs) | |||
60 | u32 *isp; | 60 | u32 *isp; |
61 | #endif | 61 | #endif |
62 | 62 | ||
63 | if (unlikely((unsigned)irq >= NR_IRQS)) { | ||
64 | printk(KERN_EMERG "%s: cannot handle IRQ %d\n", | ||
65 | __FUNCTION__, irq); | ||
66 | BUG(); | ||
67 | } | ||
68 | |||
63 | irq_enter(); | 69 | irq_enter(); |
64 | #ifdef CONFIG_DEBUG_STACKOVERFLOW | 70 | #ifdef CONFIG_DEBUG_STACKOVERFLOW |
65 | /* Debugging check for stack overflow: is there less than 1KB free? */ | 71 | /* Debugging check for stack overflow: is there less than 1KB free? */ |
@@ -76,6 +82,10 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs) | |||
76 | } | 82 | } |
77 | #endif | 83 | #endif |
78 | 84 | ||
85 | if (!irq_desc[irq].handle_irq) { | ||
86 | __do_IRQ(irq, regs); | ||
87 | goto out_exit; | ||
88 | } | ||
79 | #ifdef CONFIG_4KSTACKS | 89 | #ifdef CONFIG_4KSTACKS |
80 | 90 | ||
81 | curctx = (union irq_ctx *) current_thread_info(); | 91 | curctx = (union irq_ctx *) current_thread_info(); |
@@ -115,6 +125,7 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs) | |||
115 | #endif | 125 | #endif |
116 | __do_IRQ(irq, regs); | 126 | __do_IRQ(irq, regs); |
117 | 127 | ||
128 | out_exit: | ||
118 | irq_exit(); | 129 | irq_exit(); |
119 | 130 | ||
120 | return 1; | 131 | return 1; |
@@ -243,7 +254,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
243 | for_each_online_cpu(j) | 254 | for_each_online_cpu(j) |
244 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 255 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
245 | #endif | 256 | #endif |
246 | seq_printf(p, " %14s", irq_desc[i].handler->typename); | 257 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
247 | seq_printf(p, " %s", action->name); | 258 | seq_printf(p, " %s", action->name); |
248 | 259 | ||
249 | for (action=action->next; action; action = action->next) | 260 | for (action=action->next; action; action = action->next) |
@@ -285,13 +296,13 @@ void fixup_irqs(cpumask_t map) | |||
285 | if (irq == 2) | 296 | if (irq == 2) |
286 | continue; | 297 | continue; |
287 | 298 | ||
288 | cpus_and(mask, irq_affinity[irq], map); | 299 | cpus_and(mask, irq_desc[irq].affinity, map); |
289 | if (any_online_cpu(mask) == NR_CPUS) { | 300 | if (any_online_cpu(mask) == NR_CPUS) { |
290 | printk("Breaking affinity for irq %i\n", irq); | 301 | printk("Breaking affinity for irq %i\n", irq); |
291 | mask = map; | 302 | mask = map; |
292 | } | 303 | } |
293 | if (irq_desc[irq].handler->set_affinity) | 304 | if (irq_desc[irq].chip->set_affinity) |
294 | irq_desc[irq].handler->set_affinity(irq, mask); | 305 | irq_desc[irq].chip->set_affinity(irq, mask); |
295 | else if (irq_desc[irq].action && !(warned++)) | 306 | else if (irq_desc[irq].action && !(warned++)) |
296 | printk("Cannot set affinity for irq %i\n", irq); | 307 | printk("Cannot set affinity for irq %i\n", irq); |
297 | } | 308 | } |
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index 4a65040cc624..6712f0d2eb37 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c | |||
@@ -1314,8 +1314,10 @@ legacy_init_iomem_resources(struct resource *code_resource, struct resource *dat | |||
1314 | probe_roms(); | 1314 | probe_roms(); |
1315 | for (i = 0; i < e820.nr_map; i++) { | 1315 | for (i = 0; i < e820.nr_map; i++) { |
1316 | struct resource *res; | 1316 | struct resource *res; |
1317 | #ifndef CONFIG_RESOURCES_64BIT | ||
1317 | if (e820.map[i].addr + e820.map[i].size > 0x100000000ULL) | 1318 | if (e820.map[i].addr + e820.map[i].size > 0x100000000ULL) |
1318 | continue; | 1319 | continue; |
1320 | #endif | ||
1319 | res = kzalloc(sizeof(struct resource), GFP_ATOMIC); | 1321 | res = kzalloc(sizeof(struct resource), GFP_ATOMIC); |
1320 | switch (e820.map[i].type) { | 1322 | switch (e820.map[i].type) { |
1321 | case E820_RAM: res->name = "System RAM"; break; | 1323 | case E820_RAM: res->name = "System RAM"; break; |
diff --git a/arch/i386/kernel/sysenter.c b/arch/i386/kernel/sysenter.c index c60419dee018..713ba39d32c6 100644 --- a/arch/i386/kernel/sysenter.c +++ b/arch/i386/kernel/sysenter.c | |||
@@ -148,8 +148,10 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int exstack) | |||
148 | vma->vm_mm = mm; | 148 | vma->vm_mm = mm; |
149 | 149 | ||
150 | ret = insert_vm_struct(mm, vma); | 150 | ret = insert_vm_struct(mm, vma); |
151 | if (ret) | 151 | if (unlikely(ret)) { |
152 | goto free_vma; | 152 | kmem_cache_free(vm_area_cachep, vma); |
153 | goto up_fail; | ||
154 | } | ||
153 | 155 | ||
154 | current->mm->context.vdso = (void *)addr; | 156 | current->mm->context.vdso = (void *)addr; |
155 | current_thread_info()->sysenter_return = | 157 | current_thread_info()->sysenter_return = |
@@ -158,10 +160,6 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int exstack) | |||
158 | up_fail: | 160 | up_fail: |
159 | up_write(&mm->mmap_sem); | 161 | up_write(&mm->mmap_sem); |
160 | return ret; | 162 | return ret; |
161 | |||
162 | free_vma: | ||
163 | kmem_cache_free(vm_area_cachep, vma); | ||
164 | return ret; | ||
165 | } | 163 | } |
166 | 164 | ||
167 | const char *arch_vma_name(struct vm_area_struct *vma) | 165 | const char *arch_vma_name(struct vm_area_struct *vma) |
diff --git a/arch/i386/mach-visws/setup.c b/arch/i386/mach-visws/setup.c index 8a9e1a6f745d..1f84cdb24779 100644 --- a/arch/i386/mach-visws/setup.c +++ b/arch/i386/mach-visws/setup.c | |||
@@ -140,8 +140,8 @@ void __init time_init_hook(void) | |||
140 | 140 | ||
141 | #define MB (1024 * 1024) | 141 | #define MB (1024 * 1024) |
142 | 142 | ||
143 | static unsigned long sgivwfb_mem_phys; | 143 | unsigned long sgivwfb_mem_phys; |
144 | static unsigned long sgivwfb_mem_size; | 144 | unsigned long sgivwfb_mem_size; |
145 | 145 | ||
146 | long long mem_size __initdata = 0; | 146 | long long mem_size __initdata = 0; |
147 | 147 | ||
@@ -177,8 +177,4 @@ char * __init machine_specific_memory_setup(void) | |||
177 | add_memory_region(sgivwfb_mem_phys, sgivwfb_mem_size, E820_RESERVED); | 177 | add_memory_region(sgivwfb_mem_phys, sgivwfb_mem_size, E820_RESERVED); |
178 | 178 | ||
179 | return "PROM"; | 179 | return "PROM"; |
180 | |||
181 | /* Remove gcc warnings */ | ||
182 | (void) sanitize_e820_map(NULL, NULL); | ||
183 | (void) copy_e820_map(NULL, 0); | ||
184 | } | 180 | } |
diff --git a/arch/i386/mach-visws/visws_apic.c b/arch/i386/mach-visws/visws_apic.c index 3e64fb721291..c418521dd554 100644 --- a/arch/i386/mach-visws/visws_apic.c +++ b/arch/i386/mach-visws/visws_apic.c | |||
@@ -278,22 +278,22 @@ void init_VISWS_APIC_irqs(void) | |||
278 | irq_desc[i].depth = 1; | 278 | irq_desc[i].depth = 1; |
279 | 279 | ||
280 | if (i == 0) { | 280 | if (i == 0) { |
281 | irq_desc[i].handler = &cobalt_irq_type; | 281 | irq_desc[i].chip = &cobalt_irq_type; |
282 | } | 282 | } |
283 | else if (i == CO_IRQ_IDE0) { | 283 | else if (i == CO_IRQ_IDE0) { |
284 | irq_desc[i].handler = &cobalt_irq_type; | 284 | irq_desc[i].chip = &cobalt_irq_type; |
285 | } | 285 | } |
286 | else if (i == CO_IRQ_IDE1) { | 286 | else if (i == CO_IRQ_IDE1) { |
287 | irq_desc[i].handler = &cobalt_irq_type; | 287 | irq_desc[i].chip = &cobalt_irq_type; |
288 | } | 288 | } |
289 | else if (i == CO_IRQ_8259) { | 289 | else if (i == CO_IRQ_8259) { |
290 | irq_desc[i].handler = &piix4_master_irq_type; | 290 | irq_desc[i].chip = &piix4_master_irq_type; |
291 | } | 291 | } |
292 | else if (i < CO_IRQ_APIC0) { | 292 | else if (i < CO_IRQ_APIC0) { |
293 | irq_desc[i].handler = &piix4_virtual_irq_type; | 293 | irq_desc[i].chip = &piix4_virtual_irq_type; |
294 | } | 294 | } |
295 | else if (IS_CO_APIC(i)) { | 295 | else if (IS_CO_APIC(i)) { |
296 | irq_desc[i].handler = &cobalt_irq_type; | 296 | irq_desc[i].chip = &cobalt_irq_type; |
297 | } | 297 | } |
298 | } | 298 | } |
299 | 299 | ||
diff --git a/arch/i386/mach-voyager/voyager_smp.c b/arch/i386/mach-voyager/voyager_smp.c index 8242af9ebc6f..5b8b579a079f 100644 --- a/arch/i386/mach-voyager/voyager_smp.c +++ b/arch/i386/mach-voyager/voyager_smp.c | |||
@@ -1419,7 +1419,7 @@ smp_intr_init(void) | |||
1419 | * This is for later: first 16 correspond to PC IRQs; next 16 | 1419 | * This is for later: first 16 correspond to PC IRQs; next 16 |
1420 | * are Primary MC IRQs and final 16 are Secondary MC IRQs */ | 1420 | * are Primary MC IRQs and final 16 are Secondary MC IRQs */ |
1421 | for(i = 0; i < 48; i++) | 1421 | for(i = 0; i < 48; i++) |
1422 | irq_desc[i].handler = &vic_irq_type; | 1422 | irq_desc[i].chip = &vic_irq_type; |
1423 | } | 1423 | } |
1424 | 1424 | ||
1425 | /* send a CPI at level cpi to a set of cpus in cpuset (set 1 bit per | 1425 | /* send a CPI at level cpi to a set of cpus in cpuset (set 1 bit per |
diff --git a/arch/i386/pci/i386.c b/arch/i386/pci/i386.c index a151f7a99f5e..10154a2cac68 100644 --- a/arch/i386/pci/i386.c +++ b/arch/i386/pci/i386.c | |||
@@ -48,10 +48,10 @@ | |||
48 | */ | 48 | */ |
49 | void | 49 | void |
50 | pcibios_align_resource(void *data, struct resource *res, | 50 | pcibios_align_resource(void *data, struct resource *res, |
51 | unsigned long size, unsigned long align) | 51 | resource_size_t size, resource_size_t align) |
52 | { | 52 | { |
53 | if (res->flags & IORESOURCE_IO) { | 53 | if (res->flags & IORESOURCE_IO) { |
54 | unsigned long start = res->start; | 54 | resource_size_t start = res->start; |
55 | 55 | ||
56 | if (start & 0x300) { | 56 | if (start & 0x300) { |
57 | start = (start + 0x3ff) & ~0x3ff; | 57 | start = (start + 0x3ff) & ~0x3ff; |
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index a56df7bf022d..b487e227a1f7 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -271,6 +271,9 @@ config HOTPLUG_CPU | |||
271 | can be controlled through /sys/devices/system/cpu/cpu#. | 271 | can be controlled through /sys/devices/system/cpu/cpu#. |
272 | Say N if you want to disable CPU hotplug. | 272 | Say N if you want to disable CPU hotplug. |
273 | 273 | ||
274 | config ARCH_ENABLE_MEMORY_HOTPLUG | ||
275 | def_bool y | ||
276 | |||
274 | config SCHED_SMT | 277 | config SCHED_SMT |
275 | bool "SMT scheduler support" | 278 | bool "SMT scheduler support" |
276 | depends on SMP | 279 | depends on SMP |
@@ -489,6 +492,10 @@ config GENERIC_PENDING_IRQ | |||
489 | depends on GENERIC_HARDIRQS && SMP | 492 | depends on GENERIC_HARDIRQS && SMP |
490 | default y | 493 | default y |
491 | 494 | ||
495 | config IRQ_PER_CPU | ||
496 | bool | ||
497 | default y | ||
498 | |||
492 | source "arch/ia64/hp/sim/Kconfig" | 499 | source "arch/ia64/hp/sim/Kconfig" |
493 | 500 | ||
494 | menu "Instrumentation Support" | 501 | menu "Instrumentation Support" |
diff --git a/arch/ia64/configs/tiger_defconfig b/arch/ia64/configs/tiger_defconfig index 766bf4955432..9d1cffb57cde 100644 --- a/arch/ia64/configs/tiger_defconfig +++ b/arch/ia64/configs/tiger_defconfig | |||
@@ -114,7 +114,7 @@ CONFIG_IA64_CYCLONE=y | |||
114 | CONFIG_IOSAPIC=y | 114 | CONFIG_IOSAPIC=y |
115 | CONFIG_FORCE_MAX_ZONEORDER=17 | 115 | CONFIG_FORCE_MAX_ZONEORDER=17 |
116 | CONFIG_SMP=y | 116 | CONFIG_SMP=y |
117 | CONFIG_NR_CPUS=4 | 117 | CONFIG_NR_CPUS=16 |
118 | CONFIG_HOTPLUG_CPU=y | 118 | CONFIG_HOTPLUG_CPU=y |
119 | CONFIG_PERMIT_BSP_REMOVE=y | 119 | CONFIG_PERMIT_BSP_REMOVE=y |
120 | CONFIG_FORCE_CPEI_RETARGET=y | 120 | CONFIG_FORCE_CPEI_RETARGET=y |
diff --git a/arch/ia64/hp/sim/hpsim_irq.c b/arch/ia64/hp/sim/hpsim_irq.c index c0d25a2a3e9c..8145547bb52d 100644 --- a/arch/ia64/hp/sim/hpsim_irq.c +++ b/arch/ia64/hp/sim/hpsim_irq.c | |||
@@ -44,8 +44,8 @@ hpsim_irq_init (void) | |||
44 | int i; | 44 | int i; |
45 | 45 | ||
46 | for (i = 0; i < NR_IRQS; ++i) { | 46 | for (i = 0; i < NR_IRQS; ++i) { |
47 | idesc = irq_descp(i); | 47 | idesc = irq_desc + i; |
48 | if (idesc->handler == &no_irq_type) | 48 | if (idesc->chip == &no_irq_type) |
49 | idesc->handler = &irq_type_hp_sim; | 49 | idesc->chip = &irq_type_hp_sim; |
50 | } | 50 | } |
51 | } | 51 | } |
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index d58c1c5c903a..efc7df4b0fd2 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
@@ -456,7 +456,7 @@ iosapic_startup_edge_irq (unsigned int irq) | |||
456 | static void | 456 | static void |
457 | iosapic_ack_edge_irq (unsigned int irq) | 457 | iosapic_ack_edge_irq (unsigned int irq) |
458 | { | 458 | { |
459 | irq_desc_t *idesc = irq_descp(irq); | 459 | irq_desc_t *idesc = irq_desc + irq; |
460 | 460 | ||
461 | move_native_irq(irq); | 461 | move_native_irq(irq); |
462 | /* | 462 | /* |
@@ -659,14 +659,14 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery, | |||
659 | else | 659 | else |
660 | irq_type = &irq_type_iosapic_level; | 660 | irq_type = &irq_type_iosapic_level; |
661 | 661 | ||
662 | idesc = irq_descp(vector); | 662 | idesc = irq_desc + vector; |
663 | if (idesc->handler != irq_type) { | 663 | if (idesc->chip != irq_type) { |
664 | if (idesc->handler != &no_irq_type) | 664 | if (idesc->chip != &no_irq_type) |
665 | printk(KERN_WARNING | 665 | printk(KERN_WARNING |
666 | "%s: changing vector %d from %s to %s\n", | 666 | "%s: changing vector %d from %s to %s\n", |
667 | __FUNCTION__, vector, | 667 | __FUNCTION__, vector, |
668 | idesc->handler->typename, irq_type->typename); | 668 | idesc->chip->typename, irq_type->typename); |
669 | idesc->handler = irq_type; | 669 | idesc->chip = irq_type; |
670 | } | 670 | } |
671 | return 0; | 671 | return 0; |
672 | } | 672 | } |
@@ -793,14 +793,14 @@ again: | |||
793 | return -ENOSPC; | 793 | return -ENOSPC; |
794 | } | 794 | } |
795 | 795 | ||
796 | spin_lock_irqsave(&irq_descp(vector)->lock, flags); | 796 | spin_lock_irqsave(&irq_desc[vector].lock, flags); |
797 | spin_lock(&iosapic_lock); | 797 | spin_lock(&iosapic_lock); |
798 | { | 798 | { |
799 | if (gsi_to_vector(gsi) > 0) { | 799 | if (gsi_to_vector(gsi) > 0) { |
800 | if (list_empty(&iosapic_intr_info[vector].rtes)) | 800 | if (list_empty(&iosapic_intr_info[vector].rtes)) |
801 | free_irq_vector(vector); | 801 | free_irq_vector(vector); |
802 | spin_unlock(&iosapic_lock); | 802 | spin_unlock(&iosapic_lock); |
803 | spin_unlock_irqrestore(&irq_descp(vector)->lock, | 803 | spin_unlock_irqrestore(&irq_desc[vector].lock, |
804 | flags); | 804 | flags); |
805 | goto again; | 805 | goto again; |
806 | } | 806 | } |
@@ -810,7 +810,7 @@ again: | |||
810 | polarity, trigger); | 810 | polarity, trigger); |
811 | if (err < 0) { | 811 | if (err < 0) { |
812 | spin_unlock(&iosapic_lock); | 812 | spin_unlock(&iosapic_lock); |
813 | spin_unlock_irqrestore(&irq_descp(vector)->lock, | 813 | spin_unlock_irqrestore(&irq_desc[vector].lock, |
814 | flags); | 814 | flags); |
815 | return err; | 815 | return err; |
816 | } | 816 | } |
@@ -825,7 +825,7 @@ again: | |||
825 | set_rte(gsi, vector, dest, mask); | 825 | set_rte(gsi, vector, dest, mask); |
826 | } | 826 | } |
827 | spin_unlock(&iosapic_lock); | 827 | spin_unlock(&iosapic_lock); |
828 | spin_unlock_irqrestore(&irq_descp(vector)->lock, flags); | 828 | spin_unlock_irqrestore(&irq_desc[vector].lock, flags); |
829 | 829 | ||
830 | printk(KERN_INFO "GSI %u (%s, %s) -> CPU %d (0x%04x) vector %d\n", | 830 | printk(KERN_INFO "GSI %u (%s, %s) -> CPU %d (0x%04x) vector %d\n", |
831 | gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"), | 831 | gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"), |
@@ -860,7 +860,7 @@ iosapic_unregister_intr (unsigned int gsi) | |||
860 | } | 860 | } |
861 | vector = irq_to_vector(irq); | 861 | vector = irq_to_vector(irq); |
862 | 862 | ||
863 | idesc = irq_descp(irq); | 863 | idesc = irq_desc + irq; |
864 | spin_lock_irqsave(&idesc->lock, flags); | 864 | spin_lock_irqsave(&idesc->lock, flags); |
865 | spin_lock(&iosapic_lock); | 865 | spin_lock(&iosapic_lock); |
866 | { | 866 | { |
@@ -903,7 +903,7 @@ iosapic_unregister_intr (unsigned int gsi) | |||
903 | BUG_ON(iosapic_intr_info[vector].count); | 903 | BUG_ON(iosapic_intr_info[vector].count); |
904 | 904 | ||
905 | /* Clear the interrupt controller descriptor */ | 905 | /* Clear the interrupt controller descriptor */ |
906 | idesc->handler = &no_irq_type; | 906 | idesc->chip = &no_irq_type; |
907 | 907 | ||
908 | /* Clear the interrupt information */ | 908 | /* Clear the interrupt information */ |
909 | memset(&iosapic_intr_info[vector], 0, | 909 | memset(&iosapic_intr_info[vector], 0, |
diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c index 9c72ea3f6432..7852382de2fa 100644 --- a/arch/ia64/kernel/irq.c +++ b/arch/ia64/kernel/irq.c | |||
@@ -76,7 +76,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
76 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 76 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
77 | } | 77 | } |
78 | #endif | 78 | #endif |
79 | seq_printf(p, " %14s", irq_desc[i].handler->typename); | 79 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
80 | seq_printf(p, " %s", action->name); | 80 | seq_printf(p, " %s", action->name); |
81 | 81 | ||
82 | for (action=action->next; action; action = action->next) | 82 | for (action=action->next; action; action = action->next) |
@@ -100,7 +100,7 @@ void set_irq_affinity_info (unsigned int irq, int hwid, int redir) | |||
100 | cpu_set(cpu_logical_id(hwid), mask); | 100 | cpu_set(cpu_logical_id(hwid), mask); |
101 | 101 | ||
102 | if (irq < NR_IRQS) { | 102 | if (irq < NR_IRQS) { |
103 | irq_affinity[irq] = mask; | 103 | irq_desc[irq].affinity = mask; |
104 | irq_redir[irq] = (char) (redir & 0xff); | 104 | irq_redir[irq] = (char) (redir & 0xff); |
105 | } | 105 | } |
106 | } | 106 | } |
@@ -120,7 +120,7 @@ static void migrate_irqs(void) | |||
120 | int irq, new_cpu; | 120 | int irq, new_cpu; |
121 | 121 | ||
122 | for (irq=0; irq < NR_IRQS; irq++) { | 122 | for (irq=0; irq < NR_IRQS; irq++) { |
123 | desc = irq_descp(irq); | 123 | desc = irq_desc + irq; |
124 | 124 | ||
125 | /* | 125 | /* |
126 | * No handling for now. | 126 | * No handling for now. |
@@ -131,7 +131,7 @@ static void migrate_irqs(void) | |||
131 | if (desc->status == IRQ_PER_CPU) | 131 | if (desc->status == IRQ_PER_CPU) |
132 | continue; | 132 | continue; |
133 | 133 | ||
134 | cpus_and(mask, irq_affinity[irq], cpu_online_map); | 134 | cpus_and(mask, irq_desc[irq].affinity, cpu_online_map); |
135 | if (any_online_cpu(mask) == NR_CPUS) { | 135 | if (any_online_cpu(mask) == NR_CPUS) { |
136 | /* | 136 | /* |
137 | * Save it for phase 2 processing | 137 | * Save it for phase 2 processing |
@@ -144,15 +144,15 @@ static void migrate_irqs(void) | |||
144 | /* | 144 | /* |
145 | * Al three are essential, currently WARN_ON.. maybe panic? | 145 | * Al three are essential, currently WARN_ON.. maybe panic? |
146 | */ | 146 | */ |
147 | if (desc->handler && desc->handler->disable && | 147 | if (desc->chip && desc->chip->disable && |
148 | desc->handler->enable && desc->handler->set_affinity) { | 148 | desc->chip->enable && desc->chip->set_affinity) { |
149 | desc->handler->disable(irq); | 149 | desc->chip->disable(irq); |
150 | desc->handler->set_affinity(irq, mask); | 150 | desc->chip->set_affinity(irq, mask); |
151 | desc->handler->enable(irq); | 151 | desc->chip->enable(irq); |
152 | } else { | 152 | } else { |
153 | WARN_ON((!(desc->handler) || !(desc->handler->disable) || | 153 | WARN_ON((!(desc->chip) || !(desc->chip->disable) || |
154 | !(desc->handler->enable) || | 154 | !(desc->chip->enable) || |
155 | !(desc->handler->set_affinity))); | 155 | !(desc->chip->set_affinity))); |
156 | } | 156 | } |
157 | } | 157 | } |
158 | } | 158 | } |
diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c index ef9a2b49307a..f5035304594e 100644 --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c | |||
@@ -249,9 +249,9 @@ register_percpu_irq (ia64_vector vec, struct irqaction *action) | |||
249 | 249 | ||
250 | for (irq = 0; irq < NR_IRQS; ++irq) | 250 | for (irq = 0; irq < NR_IRQS; ++irq) |
251 | if (irq_to_vector(irq) == vec) { | 251 | if (irq_to_vector(irq) == vec) { |
252 | desc = irq_descp(irq); | 252 | desc = irq_desc + irq; |
253 | desc->status |= IRQ_PER_CPU; | 253 | desc->status |= IRQ_PER_CPU; |
254 | desc->handler = &irq_type_ia64_lsapic; | 254 | desc->chip = &irq_type_ia64_lsapic; |
255 | if (action) | 255 | if (action) |
256 | setup_irq(irq, action); | 256 | setup_irq(irq, action); |
257 | } | 257 | } |
diff --git a/arch/ia64/kernel/irq_lsapic.c b/arch/ia64/kernel/irq_lsapic.c index ea14e6a04409..1ab58b09f3d7 100644 --- a/arch/ia64/kernel/irq_lsapic.c +++ b/arch/ia64/kernel/irq_lsapic.c | |||
@@ -26,6 +26,13 @@ lsapic_noop (unsigned int irq) | |||
26 | /* nuthing to do... */ | 26 | /* nuthing to do... */ |
27 | } | 27 | } |
28 | 28 | ||
29 | static int lsapic_retrigger(unsigned int irq) | ||
30 | { | ||
31 | ia64_resend_irq(irq); | ||
32 | |||
33 | return 1; | ||
34 | } | ||
35 | |||
29 | struct hw_interrupt_type irq_type_ia64_lsapic = { | 36 | struct hw_interrupt_type irq_type_ia64_lsapic = { |
30 | .typename = "LSAPIC", | 37 | .typename = "LSAPIC", |
31 | .startup = lsapic_noop_startup, | 38 | .startup = lsapic_noop_startup, |
@@ -33,5 +40,6 @@ struct hw_interrupt_type irq_type_ia64_lsapic = { | |||
33 | .enable = lsapic_noop, | 40 | .enable = lsapic_noop, |
34 | .disable = lsapic_noop, | 41 | .disable = lsapic_noop, |
35 | .ack = lsapic_noop, | 42 | .ack = lsapic_noop, |
36 | .end = lsapic_noop | 43 | .end = lsapic_noop, |
44 | .retrigger = lsapic_retrigger, | ||
37 | }; | 45 | }; |
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index 6a0880639bc9..d7dc5e63de63 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c | |||
@@ -1788,7 +1788,7 @@ ia64_mca_late_init(void) | |||
1788 | cpe_poll_enabled = 0; | 1788 | cpe_poll_enabled = 0; |
1789 | for (irq = 0; irq < NR_IRQS; ++irq) | 1789 | for (irq = 0; irq < NR_IRQS; ++irq) |
1790 | if (irq_to_vector(irq) == cpe_vector) { | 1790 | if (irq_to_vector(irq) == cpe_vector) { |
1791 | desc = irq_descp(irq); | 1791 | desc = irq_desc + irq; |
1792 | desc->status |= IRQ_PER_CPU; | 1792 | desc->status |= IRQ_PER_CPU; |
1793 | setup_irq(irq, &mca_cpe_irqaction); | 1793 | setup_irq(irq, &mca_cpe_irqaction); |
1794 | ia64_cpe_irq = irq; | 1794 | ia64_cpe_irq = irq; |
diff --git a/arch/ia64/kernel/palinfo.c b/arch/ia64/kernel/palinfo.c index 303a9afcf2a1..8a1208419138 100644 --- a/arch/ia64/kernel/palinfo.c +++ b/arch/ia64/kernel/palinfo.c | |||
@@ -998,7 +998,7 @@ palinfo_init(void) | |||
998 | } | 998 | } |
999 | 999 | ||
1000 | /* Register for future delivery via notify registration */ | 1000 | /* Register for future delivery via notify registration */ |
1001 | register_cpu_notifier(&palinfo_cpu_notifier); | 1001 | register_hotcpu_notifier(&palinfo_cpu_notifier); |
1002 | 1002 | ||
1003 | return 0; | 1003 | return 0; |
1004 | } | 1004 | } |
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index 6d7bc8ff7b3a..a0055d3d695c 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
@@ -6165,7 +6165,7 @@ pfm_load_regs (struct task_struct *task) | |||
6165 | /* | 6165 | /* |
6166 | * will replay the PMU interrupt | 6166 | * will replay the PMU interrupt |
6167 | */ | 6167 | */ |
6168 | if (need_irq_resend) hw_resend_irq(NULL, IA64_PERFMON_VECTOR); | 6168 | if (need_irq_resend) ia64_resend_irq(IA64_PERFMON_VECTOR); |
6169 | 6169 | ||
6170 | pfm_stats[smp_processor_id()].pfm_replay_ovfl_intr_count++; | 6170 | pfm_stats[smp_processor_id()].pfm_replay_ovfl_intr_count++; |
6171 | } | 6171 | } |
@@ -6305,7 +6305,7 @@ pfm_load_regs (struct task_struct *task) | |||
6305 | /* | 6305 | /* |
6306 | * will replay the PMU interrupt | 6306 | * will replay the PMU interrupt |
6307 | */ | 6307 | */ |
6308 | if (need_irq_resend) hw_resend_irq(NULL, IA64_PERFMON_VECTOR); | 6308 | if (need_irq_resend) ia64_resend_irq(IA64_PERFMON_VECTOR); |
6309 | 6309 | ||
6310 | pfm_stats[smp_processor_id()].pfm_replay_ovfl_intr_count++; | 6310 | pfm_stats[smp_processor_id()].pfm_replay_ovfl_intr_count++; |
6311 | } | 6311 | } |
diff --git a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c index 44e9547878ac..5203df78f150 100644 --- a/arch/ia64/kernel/smpboot.c +++ b/arch/ia64/kernel/smpboot.c | |||
@@ -677,16 +677,16 @@ int migrate_platform_irqs(unsigned int cpu) | |||
677 | new_cpei_cpu = any_online_cpu(cpu_online_map); | 677 | new_cpei_cpu = any_online_cpu(cpu_online_map); |
678 | mask = cpumask_of_cpu(new_cpei_cpu); | 678 | mask = cpumask_of_cpu(new_cpei_cpu); |
679 | set_cpei_target_cpu(new_cpei_cpu); | 679 | set_cpei_target_cpu(new_cpei_cpu); |
680 | desc = irq_descp(ia64_cpe_irq); | 680 | desc = irq_desc + ia64_cpe_irq; |
681 | /* | 681 | /* |
682 | * Switch for now, immediatly, we need to do fake intr | 682 | * Switch for now, immediatly, we need to do fake intr |
683 | * as other interrupts, but need to study CPEI behaviour with | 683 | * as other interrupts, but need to study CPEI behaviour with |
684 | * polling before making changes. | 684 | * polling before making changes. |
685 | */ | 685 | */ |
686 | if (desc) { | 686 | if (desc) { |
687 | desc->handler->disable(ia64_cpe_irq); | 687 | desc->chip->disable(ia64_cpe_irq); |
688 | desc->handler->set_affinity(ia64_cpe_irq, mask); | 688 | desc->chip->set_affinity(ia64_cpe_irq, mask); |
689 | desc->handler->enable(ia64_cpe_irq); | 689 | desc->chip->enable(ia64_cpe_irq); |
690 | printk ("Re-targetting CPEI to cpu %d\n", new_cpei_cpu); | 690 | printk ("Re-targetting CPEI to cpu %d\n", new_cpei_cpu); |
691 | } | 691 | } |
692 | } | 692 | } |
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c index 77375a55da31..5bef0e3603f2 100644 --- a/arch/ia64/pci/pci.c +++ b/arch/ia64/pci/pci.c | |||
@@ -568,7 +568,7 @@ pcibios_disable_device (struct pci_dev *dev) | |||
568 | 568 | ||
569 | void | 569 | void |
570 | pcibios_align_resource (void *data, struct resource *res, | 570 | pcibios_align_resource (void *data, struct resource *res, |
571 | unsigned long size, unsigned long align) | 571 | resource_size_t size, resource_size_t align) |
572 | { | 572 | { |
573 | } | 573 | } |
574 | 574 | ||
diff --git a/arch/ia64/sn/kernel/irq.c b/arch/ia64/sn/kernel/irq.c index 677c6c0fd661..7bb6ad188ba3 100644 --- a/arch/ia64/sn/kernel/irq.c +++ b/arch/ia64/sn/kernel/irq.c | |||
@@ -225,8 +225,8 @@ void sn_irq_init(void) | |||
225 | ia64_last_device_vector = IA64_SN2_LAST_DEVICE_VECTOR; | 225 | ia64_last_device_vector = IA64_SN2_LAST_DEVICE_VECTOR; |
226 | 226 | ||
227 | for (i = 0; i < NR_IRQS; i++) { | 227 | for (i = 0; i < NR_IRQS; i++) { |
228 | if (base_desc[i].handler == &no_irq_type) { | 228 | if (base_desc[i].chip == &no_irq_type) { |
229 | base_desc[i].handler = &irq_type_sn; | 229 | base_desc[i].chip = &irq_type_sn; |
230 | } | 230 | } |
231 | } | 231 | } |
232 | } | 232 | } |
diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c index 93577abae36d..3bfccf354343 100644 --- a/arch/ia64/sn/kernel/setup.c +++ b/arch/ia64/sn/kernel/setup.c | |||
@@ -458,7 +458,7 @@ void __init sn_setup(char **cmdline_p) | |||
458 | * support here so we don't have to listen to failed keyboard probe | 458 | * support here so we don't have to listen to failed keyboard probe |
459 | * messages. | 459 | * messages. |
460 | */ | 460 | */ |
461 | if (version <= 0x0209 && acpi_kbd_controller_present) { | 461 | if (is_shub1() && version <= 0x0209 && acpi_kbd_controller_present) { |
462 | printk(KERN_INFO "Disabling legacy keyboard support as prom " | 462 | printk(KERN_INFO "Disabling legacy keyboard support as prom " |
463 | "is too old and doesn't provide FADT\n"); | 463 | "is too old and doesn't provide FADT\n"); |
464 | acpi_kbd_controller_present = 0; | 464 | acpi_kbd_controller_present = 0; |
@@ -577,7 +577,8 @@ void __init sn_cpu_init(void) | |||
577 | int i; | 577 | int i; |
578 | static int wars_have_been_checked; | 578 | static int wars_have_been_checked; |
579 | 579 | ||
580 | if (smp_processor_id() == 0 && IS_MEDUSA()) { | 580 | cpuid = smp_processor_id(); |
581 | if (cpuid == 0 && IS_MEDUSA()) { | ||
581 | if (ia64_sn_is_fake_prom()) | 582 | if (ia64_sn_is_fake_prom()) |
582 | sn_prom_type = 2; | 583 | sn_prom_type = 2; |
583 | else | 584 | else |
@@ -597,6 +598,12 @@ void __init sn_cpu_init(void) | |||
597 | sn_hub_info->as_shift = sn_hub_info->nasid_shift - 2; | 598 | sn_hub_info->as_shift = sn_hub_info->nasid_shift - 2; |
598 | 599 | ||
599 | /* | 600 | /* |
601 | * Don't check status. The SAL call is not supported on all PROMs | ||
602 | * but a failure is harmless. | ||
603 | */ | ||
604 | (void) ia64_sn_set_cpu_number(cpuid); | ||
605 | |||
606 | /* | ||
600 | * The boot cpu makes this call again after platform initialization is | 607 | * The boot cpu makes this call again after platform initialization is |
601 | * complete. | 608 | * complete. |
602 | */ | 609 | */ |
@@ -607,7 +614,6 @@ void __init sn_cpu_init(void) | |||
607 | if (ia64_sn_get_prom_feature_set(i, &sn_prom_features[i]) != 0) | 614 | if (ia64_sn_get_prom_feature_set(i, &sn_prom_features[i]) != 0) |
608 | break; | 615 | break; |
609 | 616 | ||
610 | cpuid = smp_processor_id(); | ||
611 | cpuphyid = get_sapicid(); | 617 | cpuphyid = get_sapicid(); |
612 | 618 | ||
613 | if (ia64_sn_get_sapic_info(cpuphyid, &nasid, &subnode, &slice)) | 619 | if (ia64_sn_get_sapic_info(cpuphyid, &nasid, &subnode, &slice)) |
diff --git a/arch/ia64/sn/pci/tioca_provider.c b/arch/ia64/sn/pci/tioca_provider.c index 20de72791b97..e4aa839d0189 100644 --- a/arch/ia64/sn/pci/tioca_provider.c +++ b/arch/ia64/sn/pci/tioca_provider.c | |||
@@ -595,7 +595,7 @@ tioca_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont | |||
595 | 595 | ||
596 | /* sanity check prom rev */ | 596 | /* sanity check prom rev */ |
597 | 597 | ||
598 | if (sn_sal_rev() < 0x0406) { | 598 | if (is_shub1() && sn_sal_rev() < 0x0406) { |
599 | printk | 599 | printk |
600 | (KERN_ERR "%s: SGI prom rev 4.06 or greater required " | 600 | (KERN_ERR "%s: SGI prom rev 4.06 or greater required " |
601 | "for tioca support\n", __FUNCTION__); | 601 | "for tioca support\n", __FUNCTION__); |
diff --git a/arch/m32r/kernel/irq.c b/arch/m32r/kernel/irq.c index a4634b06f675..3841861df6a2 100644 --- a/arch/m32r/kernel/irq.c +++ b/arch/m32r/kernel/irq.c | |||
@@ -54,7 +54,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
54 | for_each_online_cpu(j) | 54 | for_each_online_cpu(j) |
55 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 55 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
56 | #endif | 56 | #endif |
57 | seq_printf(p, " %14s", irq_desc[i].handler->typename); | 57 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
58 | seq_printf(p, " %s", action->name); | 58 | seq_printf(p, " %s", action->name); |
59 | 59 | ||
60 | for (action=action->next; action; action = action->next) | 60 | for (action=action->next; action; action = action->next) |
diff --git a/arch/m32r/kernel/setup_m32104ut.c b/arch/m32r/kernel/setup_m32104ut.c index 6328e1357a80..f9f56c270195 100644 --- a/arch/m32r/kernel/setup_m32104ut.c +++ b/arch/m32r/kernel/setup_m32104ut.c | |||
@@ -87,7 +87,7 @@ void __init init_IRQ(void) | |||
87 | #if defined(CONFIG_SMC91X) | 87 | #if defined(CONFIG_SMC91X) |
88 | /* INT#0: LAN controller on M32104UT-LAN (SMC91C111)*/ | 88 | /* INT#0: LAN controller on M32104UT-LAN (SMC91C111)*/ |
89 | irq_desc[M32R_IRQ_INT0].status = IRQ_DISABLED; | 89 | irq_desc[M32R_IRQ_INT0].status = IRQ_DISABLED; |
90 | irq_desc[M32R_IRQ_INT0].handler = &m32104ut_irq_type; | 90 | irq_desc[M32R_IRQ_INT0].chip = &m32104ut_irq_type; |
91 | irq_desc[M32R_IRQ_INT0].action = 0; | 91 | irq_desc[M32R_IRQ_INT0].action = 0; |
92 | irq_desc[M32R_IRQ_INT0].depth = 1; | 92 | irq_desc[M32R_IRQ_INT0].depth = 1; |
93 | icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN | M32R_ICUCR_ISMOD11; /* "H" level sense */ | 93 | icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN | M32R_ICUCR_ISMOD11; /* "H" level sense */ |
@@ -96,7 +96,7 @@ void __init init_IRQ(void) | |||
96 | 96 | ||
97 | /* MFT2 : system timer */ | 97 | /* MFT2 : system timer */ |
98 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; | 98 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; |
99 | irq_desc[M32R_IRQ_MFT2].handler = &m32104ut_irq_type; | 99 | irq_desc[M32R_IRQ_MFT2].chip = &m32104ut_irq_type; |
100 | irq_desc[M32R_IRQ_MFT2].action = 0; | 100 | irq_desc[M32R_IRQ_MFT2].action = 0; |
101 | irq_desc[M32R_IRQ_MFT2].depth = 1; | 101 | irq_desc[M32R_IRQ_MFT2].depth = 1; |
102 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; | 102 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; |
@@ -105,7 +105,7 @@ void __init init_IRQ(void) | |||
105 | #ifdef CONFIG_SERIAL_M32R_SIO | 105 | #ifdef CONFIG_SERIAL_M32R_SIO |
106 | /* SIO0_R : uart receive data */ | 106 | /* SIO0_R : uart receive data */ |
107 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; | 107 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; |
108 | irq_desc[M32R_IRQ_SIO0_R].handler = &m32104ut_irq_type; | 108 | irq_desc[M32R_IRQ_SIO0_R].chip = &m32104ut_irq_type; |
109 | irq_desc[M32R_IRQ_SIO0_R].action = 0; | 109 | irq_desc[M32R_IRQ_SIO0_R].action = 0; |
110 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; | 110 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; |
111 | icu_data[M32R_IRQ_SIO0_R].icucr = M32R_ICUCR_IEN; | 111 | icu_data[M32R_IRQ_SIO0_R].icucr = M32R_ICUCR_IEN; |
@@ -113,7 +113,7 @@ void __init init_IRQ(void) | |||
113 | 113 | ||
114 | /* SIO0_S : uart send data */ | 114 | /* SIO0_S : uart send data */ |
115 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; | 115 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; |
116 | irq_desc[M32R_IRQ_SIO0_S].handler = &m32104ut_irq_type; | 116 | irq_desc[M32R_IRQ_SIO0_S].chip = &m32104ut_irq_type; |
117 | irq_desc[M32R_IRQ_SIO0_S].action = 0; | 117 | irq_desc[M32R_IRQ_SIO0_S].action = 0; |
118 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; | 118 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; |
119 | icu_data[M32R_IRQ_SIO0_S].icucr = M32R_ICUCR_IEN; | 119 | icu_data[M32R_IRQ_SIO0_S].icucr = M32R_ICUCR_IEN; |
diff --git a/arch/m32r/kernel/setup_m32700ut.c b/arch/m32r/kernel/setup_m32700ut.c index fad1fc99bb27..b6ab00eff580 100644 --- a/arch/m32r/kernel/setup_m32700ut.c +++ b/arch/m32r/kernel/setup_m32700ut.c | |||
@@ -301,7 +301,7 @@ void __init init_IRQ(void) | |||
301 | #if defined(CONFIG_SMC91X) | 301 | #if defined(CONFIG_SMC91X) |
302 | /* INT#0: LAN controller on M32700UT-LAN (SMC91C111)*/ | 302 | /* INT#0: LAN controller on M32700UT-LAN (SMC91C111)*/ |
303 | irq_desc[M32700UT_LAN_IRQ_LAN].status = IRQ_DISABLED; | 303 | irq_desc[M32700UT_LAN_IRQ_LAN].status = IRQ_DISABLED; |
304 | irq_desc[M32700UT_LAN_IRQ_LAN].handler = &m32700ut_lanpld_irq_type; | 304 | irq_desc[M32700UT_LAN_IRQ_LAN].chip = &m32700ut_lanpld_irq_type; |
305 | irq_desc[M32700UT_LAN_IRQ_LAN].action = 0; | 305 | irq_desc[M32700UT_LAN_IRQ_LAN].action = 0; |
306 | irq_desc[M32700UT_LAN_IRQ_LAN].depth = 1; /* disable nested irq */ | 306 | irq_desc[M32700UT_LAN_IRQ_LAN].depth = 1; /* disable nested irq */ |
307 | lanpld_icu_data[irq2lanpldirq(M32700UT_LAN_IRQ_LAN)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* "H" edge sense */ | 307 | lanpld_icu_data[irq2lanpldirq(M32700UT_LAN_IRQ_LAN)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* "H" edge sense */ |
@@ -310,7 +310,7 @@ void __init init_IRQ(void) | |||
310 | 310 | ||
311 | /* MFT2 : system timer */ | 311 | /* MFT2 : system timer */ |
312 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; | 312 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; |
313 | irq_desc[M32R_IRQ_MFT2].handler = &m32700ut_irq_type; | 313 | irq_desc[M32R_IRQ_MFT2].chip = &m32700ut_irq_type; |
314 | irq_desc[M32R_IRQ_MFT2].action = 0; | 314 | irq_desc[M32R_IRQ_MFT2].action = 0; |
315 | irq_desc[M32R_IRQ_MFT2].depth = 1; | 315 | irq_desc[M32R_IRQ_MFT2].depth = 1; |
316 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; | 316 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; |
@@ -318,7 +318,7 @@ void __init init_IRQ(void) | |||
318 | 318 | ||
319 | /* SIO0 : receive */ | 319 | /* SIO0 : receive */ |
320 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; | 320 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; |
321 | irq_desc[M32R_IRQ_SIO0_R].handler = &m32700ut_irq_type; | 321 | irq_desc[M32R_IRQ_SIO0_R].chip = &m32700ut_irq_type; |
322 | irq_desc[M32R_IRQ_SIO0_R].action = 0; | 322 | irq_desc[M32R_IRQ_SIO0_R].action = 0; |
323 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; | 323 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; |
324 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; | 324 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; |
@@ -326,7 +326,7 @@ void __init init_IRQ(void) | |||
326 | 326 | ||
327 | /* SIO0 : send */ | 327 | /* SIO0 : send */ |
328 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; | 328 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; |
329 | irq_desc[M32R_IRQ_SIO0_S].handler = &m32700ut_irq_type; | 329 | irq_desc[M32R_IRQ_SIO0_S].chip = &m32700ut_irq_type; |
330 | irq_desc[M32R_IRQ_SIO0_S].action = 0; | 330 | irq_desc[M32R_IRQ_SIO0_S].action = 0; |
331 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; | 331 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; |
332 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; | 332 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; |
@@ -334,7 +334,7 @@ void __init init_IRQ(void) | |||
334 | 334 | ||
335 | /* SIO1 : receive */ | 335 | /* SIO1 : receive */ |
336 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; | 336 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; |
337 | irq_desc[M32R_IRQ_SIO1_R].handler = &m32700ut_irq_type; | 337 | irq_desc[M32R_IRQ_SIO1_R].chip = &m32700ut_irq_type; |
338 | irq_desc[M32R_IRQ_SIO1_R].action = 0; | 338 | irq_desc[M32R_IRQ_SIO1_R].action = 0; |
339 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; | 339 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; |
340 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; | 340 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; |
@@ -342,7 +342,7 @@ void __init init_IRQ(void) | |||
342 | 342 | ||
343 | /* SIO1 : send */ | 343 | /* SIO1 : send */ |
344 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; | 344 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; |
345 | irq_desc[M32R_IRQ_SIO1_S].handler = &m32700ut_irq_type; | 345 | irq_desc[M32R_IRQ_SIO1_S].chip = &m32700ut_irq_type; |
346 | irq_desc[M32R_IRQ_SIO1_S].action = 0; | 346 | irq_desc[M32R_IRQ_SIO1_S].action = 0; |
347 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; | 347 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; |
348 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; | 348 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; |
@@ -350,7 +350,7 @@ void __init init_IRQ(void) | |||
350 | 350 | ||
351 | /* DMA1 : */ | 351 | /* DMA1 : */ |
352 | irq_desc[M32R_IRQ_DMA1].status = IRQ_DISABLED; | 352 | irq_desc[M32R_IRQ_DMA1].status = IRQ_DISABLED; |
353 | irq_desc[M32R_IRQ_DMA1].handler = &m32700ut_irq_type; | 353 | irq_desc[M32R_IRQ_DMA1].chip = &m32700ut_irq_type; |
354 | irq_desc[M32R_IRQ_DMA1].action = 0; | 354 | irq_desc[M32R_IRQ_DMA1].action = 0; |
355 | irq_desc[M32R_IRQ_DMA1].depth = 1; | 355 | irq_desc[M32R_IRQ_DMA1].depth = 1; |
356 | icu_data[M32R_IRQ_DMA1].icucr = 0; | 356 | icu_data[M32R_IRQ_DMA1].icucr = 0; |
@@ -359,7 +359,7 @@ void __init init_IRQ(void) | |||
359 | #ifdef CONFIG_SERIAL_M32R_PLDSIO | 359 | #ifdef CONFIG_SERIAL_M32R_PLDSIO |
360 | /* INT#1: SIO0 Receive on PLD */ | 360 | /* INT#1: SIO0 Receive on PLD */ |
361 | irq_desc[PLD_IRQ_SIO0_RCV].status = IRQ_DISABLED; | 361 | irq_desc[PLD_IRQ_SIO0_RCV].status = IRQ_DISABLED; |
362 | irq_desc[PLD_IRQ_SIO0_RCV].handler = &m32700ut_pld_irq_type; | 362 | irq_desc[PLD_IRQ_SIO0_RCV].chip = &m32700ut_pld_irq_type; |
363 | irq_desc[PLD_IRQ_SIO0_RCV].action = 0; | 363 | irq_desc[PLD_IRQ_SIO0_RCV].action = 0; |
364 | irq_desc[PLD_IRQ_SIO0_RCV].depth = 1; /* disable nested irq */ | 364 | irq_desc[PLD_IRQ_SIO0_RCV].depth = 1; /* disable nested irq */ |
365 | pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_RCV)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03; | 365 | pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_RCV)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03; |
@@ -367,7 +367,7 @@ void __init init_IRQ(void) | |||
367 | 367 | ||
368 | /* INT#1: SIO0 Send on PLD */ | 368 | /* INT#1: SIO0 Send on PLD */ |
369 | irq_desc[PLD_IRQ_SIO0_SND].status = IRQ_DISABLED; | 369 | irq_desc[PLD_IRQ_SIO0_SND].status = IRQ_DISABLED; |
370 | irq_desc[PLD_IRQ_SIO0_SND].handler = &m32700ut_pld_irq_type; | 370 | irq_desc[PLD_IRQ_SIO0_SND].chip = &m32700ut_pld_irq_type; |
371 | irq_desc[PLD_IRQ_SIO0_SND].action = 0; | 371 | irq_desc[PLD_IRQ_SIO0_SND].action = 0; |
372 | irq_desc[PLD_IRQ_SIO0_SND].depth = 1; /* disable nested irq */ | 372 | irq_desc[PLD_IRQ_SIO0_SND].depth = 1; /* disable nested irq */ |
373 | pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_SND)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03; | 373 | pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_SND)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03; |
@@ -376,7 +376,7 @@ void __init init_IRQ(void) | |||
376 | 376 | ||
377 | /* INT#1: CFC IREQ on PLD */ | 377 | /* INT#1: CFC IREQ on PLD */ |
378 | irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; | 378 | irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; |
379 | irq_desc[PLD_IRQ_CFIREQ].handler = &m32700ut_pld_irq_type; | 379 | irq_desc[PLD_IRQ_CFIREQ].chip = &m32700ut_pld_irq_type; |
380 | irq_desc[PLD_IRQ_CFIREQ].action = 0; | 380 | irq_desc[PLD_IRQ_CFIREQ].action = 0; |
381 | irq_desc[PLD_IRQ_CFIREQ].depth = 1; /* disable nested irq */ | 381 | irq_desc[PLD_IRQ_CFIREQ].depth = 1; /* disable nested irq */ |
382 | pld_icu_data[irq2pldirq(PLD_IRQ_CFIREQ)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* 'L' level sense */ | 382 | pld_icu_data[irq2pldirq(PLD_IRQ_CFIREQ)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* 'L' level sense */ |
@@ -384,7 +384,7 @@ void __init init_IRQ(void) | |||
384 | 384 | ||
385 | /* INT#1: CFC Insert on PLD */ | 385 | /* INT#1: CFC Insert on PLD */ |
386 | irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED; | 386 | irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED; |
387 | irq_desc[PLD_IRQ_CFC_INSERT].handler = &m32700ut_pld_irq_type; | 387 | irq_desc[PLD_IRQ_CFC_INSERT].chip = &m32700ut_pld_irq_type; |
388 | irq_desc[PLD_IRQ_CFC_INSERT].action = 0; | 388 | irq_desc[PLD_IRQ_CFC_INSERT].action = 0; |
389 | irq_desc[PLD_IRQ_CFC_INSERT].depth = 1; /* disable nested irq */ | 389 | irq_desc[PLD_IRQ_CFC_INSERT].depth = 1; /* disable nested irq */ |
390 | pld_icu_data[irq2pldirq(PLD_IRQ_CFC_INSERT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD00; /* 'L' edge sense */ | 390 | pld_icu_data[irq2pldirq(PLD_IRQ_CFC_INSERT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD00; /* 'L' edge sense */ |
@@ -392,7 +392,7 @@ void __init init_IRQ(void) | |||
392 | 392 | ||
393 | /* INT#1: CFC Eject on PLD */ | 393 | /* INT#1: CFC Eject on PLD */ |
394 | irq_desc[PLD_IRQ_CFC_EJECT].status = IRQ_DISABLED; | 394 | irq_desc[PLD_IRQ_CFC_EJECT].status = IRQ_DISABLED; |
395 | irq_desc[PLD_IRQ_CFC_EJECT].handler = &m32700ut_pld_irq_type; | 395 | irq_desc[PLD_IRQ_CFC_EJECT].chip = &m32700ut_pld_irq_type; |
396 | irq_desc[PLD_IRQ_CFC_EJECT].action = 0; | 396 | irq_desc[PLD_IRQ_CFC_EJECT].action = 0; |
397 | irq_desc[PLD_IRQ_CFC_EJECT].depth = 1; /* disable nested irq */ | 397 | irq_desc[PLD_IRQ_CFC_EJECT].depth = 1; /* disable nested irq */ |
398 | pld_icu_data[irq2pldirq(PLD_IRQ_CFC_EJECT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* 'H' edge sense */ | 398 | pld_icu_data[irq2pldirq(PLD_IRQ_CFC_EJECT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* 'H' edge sense */ |
@@ -416,7 +416,7 @@ void __init init_IRQ(void) | |||
416 | outw(USBCR_OTGS, USBCR); /* USBCR: non-OTG */ | 416 | outw(USBCR_OTGS, USBCR); /* USBCR: non-OTG */ |
417 | 417 | ||
418 | irq_desc[M32700UT_LCD_IRQ_USB_INT1].status = IRQ_DISABLED; | 418 | irq_desc[M32700UT_LCD_IRQ_USB_INT1].status = IRQ_DISABLED; |
419 | irq_desc[M32700UT_LCD_IRQ_USB_INT1].handler = &m32700ut_lcdpld_irq_type; | 419 | irq_desc[M32700UT_LCD_IRQ_USB_INT1].chip = &m32700ut_lcdpld_irq_type; |
420 | irq_desc[M32700UT_LCD_IRQ_USB_INT1].action = 0; | 420 | irq_desc[M32700UT_LCD_IRQ_USB_INT1].action = 0; |
421 | irq_desc[M32700UT_LCD_IRQ_USB_INT1].depth = 1; | 421 | irq_desc[M32700UT_LCD_IRQ_USB_INT1].depth = 1; |
422 | lcdpld_icu_data[irq2lcdpldirq(M32700UT_LCD_IRQ_USB_INT1)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* "L" level sense */ | 422 | lcdpld_icu_data[irq2lcdpldirq(M32700UT_LCD_IRQ_USB_INT1)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* "L" level sense */ |
@@ -434,7 +434,7 @@ void __init init_IRQ(void) | |||
434 | * INT3# is used for AR | 434 | * INT3# is used for AR |
435 | */ | 435 | */ |
436 | irq_desc[M32R_IRQ_INT3].status = IRQ_DISABLED; | 436 | irq_desc[M32R_IRQ_INT3].status = IRQ_DISABLED; |
437 | irq_desc[M32R_IRQ_INT3].handler = &m32700ut_irq_type; | 437 | irq_desc[M32R_IRQ_INT3].chip = &m32700ut_irq_type; |
438 | irq_desc[M32R_IRQ_INT3].action = 0; | 438 | irq_desc[M32R_IRQ_INT3].action = 0; |
439 | irq_desc[M32R_IRQ_INT3].depth = 1; | 439 | irq_desc[M32R_IRQ_INT3].depth = 1; |
440 | icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | 440 | icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; |
diff --git a/arch/m32r/kernel/setup_mappi.c b/arch/m32r/kernel/setup_mappi.c index 00f253209cb3..c268044185f5 100644 --- a/arch/m32r/kernel/setup_mappi.c +++ b/arch/m32r/kernel/setup_mappi.c | |||
@@ -86,7 +86,7 @@ void __init init_IRQ(void) | |||
86 | #ifdef CONFIG_NE2000 | 86 | #ifdef CONFIG_NE2000 |
87 | /* INT0 : LAN controller (RTL8019AS) */ | 87 | /* INT0 : LAN controller (RTL8019AS) */ |
88 | irq_desc[M32R_IRQ_INT0].status = IRQ_DISABLED; | 88 | irq_desc[M32R_IRQ_INT0].status = IRQ_DISABLED; |
89 | irq_desc[M32R_IRQ_INT0].handler = &mappi_irq_type; | 89 | irq_desc[M32R_IRQ_INT0].chip = &mappi_irq_type; |
90 | irq_desc[M32R_IRQ_INT0].action = 0; | 90 | irq_desc[M32R_IRQ_INT0].action = 0; |
91 | irq_desc[M32R_IRQ_INT0].depth = 1; | 91 | irq_desc[M32R_IRQ_INT0].depth = 1; |
92 | icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | 92 | icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; |
@@ -95,7 +95,7 @@ void __init init_IRQ(void) | |||
95 | 95 | ||
96 | /* MFT2 : system timer */ | 96 | /* MFT2 : system timer */ |
97 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; | 97 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; |
98 | irq_desc[M32R_IRQ_MFT2].handler = &mappi_irq_type; | 98 | irq_desc[M32R_IRQ_MFT2].chip = &mappi_irq_type; |
99 | irq_desc[M32R_IRQ_MFT2].action = 0; | 99 | irq_desc[M32R_IRQ_MFT2].action = 0; |
100 | irq_desc[M32R_IRQ_MFT2].depth = 1; | 100 | irq_desc[M32R_IRQ_MFT2].depth = 1; |
101 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; | 101 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; |
@@ -104,7 +104,7 @@ void __init init_IRQ(void) | |||
104 | #ifdef CONFIG_SERIAL_M32R_SIO | 104 | #ifdef CONFIG_SERIAL_M32R_SIO |
105 | /* SIO0_R : uart receive data */ | 105 | /* SIO0_R : uart receive data */ |
106 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; | 106 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; |
107 | irq_desc[M32R_IRQ_SIO0_R].handler = &mappi_irq_type; | 107 | irq_desc[M32R_IRQ_SIO0_R].chip = &mappi_irq_type; |
108 | irq_desc[M32R_IRQ_SIO0_R].action = 0; | 108 | irq_desc[M32R_IRQ_SIO0_R].action = 0; |
109 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; | 109 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; |
110 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; | 110 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; |
@@ -112,7 +112,7 @@ void __init init_IRQ(void) | |||
112 | 112 | ||
113 | /* SIO0_S : uart send data */ | 113 | /* SIO0_S : uart send data */ |
114 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; | 114 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; |
115 | irq_desc[M32R_IRQ_SIO0_S].handler = &mappi_irq_type; | 115 | irq_desc[M32R_IRQ_SIO0_S].chip = &mappi_irq_type; |
116 | irq_desc[M32R_IRQ_SIO0_S].action = 0; | 116 | irq_desc[M32R_IRQ_SIO0_S].action = 0; |
117 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; | 117 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; |
118 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; | 118 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; |
@@ -120,7 +120,7 @@ void __init init_IRQ(void) | |||
120 | 120 | ||
121 | /* SIO1_R : uart receive data */ | 121 | /* SIO1_R : uart receive data */ |
122 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; | 122 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; |
123 | irq_desc[M32R_IRQ_SIO1_R].handler = &mappi_irq_type; | 123 | irq_desc[M32R_IRQ_SIO1_R].chip = &mappi_irq_type; |
124 | irq_desc[M32R_IRQ_SIO1_R].action = 0; | 124 | irq_desc[M32R_IRQ_SIO1_R].action = 0; |
125 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; | 125 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; |
126 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; | 126 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; |
@@ -128,7 +128,7 @@ void __init init_IRQ(void) | |||
128 | 128 | ||
129 | /* SIO1_S : uart send data */ | 129 | /* SIO1_S : uart send data */ |
130 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; | 130 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; |
131 | irq_desc[M32R_IRQ_SIO1_S].handler = &mappi_irq_type; | 131 | irq_desc[M32R_IRQ_SIO1_S].chip = &mappi_irq_type; |
132 | irq_desc[M32R_IRQ_SIO1_S].action = 0; | 132 | irq_desc[M32R_IRQ_SIO1_S].action = 0; |
133 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; | 133 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; |
134 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; | 134 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; |
@@ -138,7 +138,7 @@ void __init init_IRQ(void) | |||
138 | #if defined(CONFIG_M32R_PCC) | 138 | #if defined(CONFIG_M32R_PCC) |
139 | /* INT1 : pccard0 interrupt */ | 139 | /* INT1 : pccard0 interrupt */ |
140 | irq_desc[M32R_IRQ_INT1].status = IRQ_DISABLED; | 140 | irq_desc[M32R_IRQ_INT1].status = IRQ_DISABLED; |
141 | irq_desc[M32R_IRQ_INT1].handler = &mappi_irq_type; | 141 | irq_desc[M32R_IRQ_INT1].chip = &mappi_irq_type; |
142 | irq_desc[M32R_IRQ_INT1].action = 0; | 142 | irq_desc[M32R_IRQ_INT1].action = 0; |
143 | irq_desc[M32R_IRQ_INT1].depth = 1; | 143 | irq_desc[M32R_IRQ_INT1].depth = 1; |
144 | icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_IEN | M32R_ICUCR_ISMOD00; | 144 | icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_IEN | M32R_ICUCR_ISMOD00; |
@@ -146,7 +146,7 @@ void __init init_IRQ(void) | |||
146 | 146 | ||
147 | /* INT2 : pccard1 interrupt */ | 147 | /* INT2 : pccard1 interrupt */ |
148 | irq_desc[M32R_IRQ_INT2].status = IRQ_DISABLED; | 148 | irq_desc[M32R_IRQ_INT2].status = IRQ_DISABLED; |
149 | irq_desc[M32R_IRQ_INT2].handler = &mappi_irq_type; | 149 | irq_desc[M32R_IRQ_INT2].chip = &mappi_irq_type; |
150 | irq_desc[M32R_IRQ_INT2].action = 0; | 150 | irq_desc[M32R_IRQ_INT2].action = 0; |
151 | irq_desc[M32R_IRQ_INT2].depth = 1; | 151 | irq_desc[M32R_IRQ_INT2].depth = 1; |
152 | icu_data[M32R_IRQ_INT2].icucr = M32R_ICUCR_IEN | M32R_ICUCR_ISMOD00; | 152 | icu_data[M32R_IRQ_INT2].icucr = M32R_ICUCR_IEN | M32R_ICUCR_ISMOD00; |
diff --git a/arch/m32r/kernel/setup_mappi2.c b/arch/m32r/kernel/setup_mappi2.c index eebc9d8b4e72..bd2327d5cca2 100644 --- a/arch/m32r/kernel/setup_mappi2.c +++ b/arch/m32r/kernel/setup_mappi2.c | |||
@@ -87,7 +87,7 @@ void __init init_IRQ(void) | |||
87 | #if defined(CONFIG_SMC91X) | 87 | #if defined(CONFIG_SMC91X) |
88 | /* INT0 : LAN controller (SMC91111) */ | 88 | /* INT0 : LAN controller (SMC91111) */ |
89 | irq_desc[M32R_IRQ_INT0].status = IRQ_DISABLED; | 89 | irq_desc[M32R_IRQ_INT0].status = IRQ_DISABLED; |
90 | irq_desc[M32R_IRQ_INT0].handler = &mappi2_irq_type; | 90 | irq_desc[M32R_IRQ_INT0].chip = &mappi2_irq_type; |
91 | irq_desc[M32R_IRQ_INT0].action = 0; | 91 | irq_desc[M32R_IRQ_INT0].action = 0; |
92 | irq_desc[M32R_IRQ_INT0].depth = 1; | 92 | irq_desc[M32R_IRQ_INT0].depth = 1; |
93 | icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | 93 | icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; |
@@ -96,7 +96,7 @@ void __init init_IRQ(void) | |||
96 | 96 | ||
97 | /* MFT2 : system timer */ | 97 | /* MFT2 : system timer */ |
98 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; | 98 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; |
99 | irq_desc[M32R_IRQ_MFT2].handler = &mappi2_irq_type; | 99 | irq_desc[M32R_IRQ_MFT2].chip = &mappi2_irq_type; |
100 | irq_desc[M32R_IRQ_MFT2].action = 0; | 100 | irq_desc[M32R_IRQ_MFT2].action = 0; |
101 | irq_desc[M32R_IRQ_MFT2].depth = 1; | 101 | irq_desc[M32R_IRQ_MFT2].depth = 1; |
102 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; | 102 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; |
@@ -105,7 +105,7 @@ void __init init_IRQ(void) | |||
105 | #ifdef CONFIG_SERIAL_M32R_SIO | 105 | #ifdef CONFIG_SERIAL_M32R_SIO |
106 | /* SIO0_R : uart receive data */ | 106 | /* SIO0_R : uart receive data */ |
107 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; | 107 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; |
108 | irq_desc[M32R_IRQ_SIO0_R].handler = &mappi2_irq_type; | 108 | irq_desc[M32R_IRQ_SIO0_R].chip = &mappi2_irq_type; |
109 | irq_desc[M32R_IRQ_SIO0_R].action = 0; | 109 | irq_desc[M32R_IRQ_SIO0_R].action = 0; |
110 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; | 110 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; |
111 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; | 111 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; |
@@ -113,14 +113,14 @@ void __init init_IRQ(void) | |||
113 | 113 | ||
114 | /* SIO0_S : uart send data */ | 114 | /* SIO0_S : uart send data */ |
115 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; | 115 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; |
116 | irq_desc[M32R_IRQ_SIO0_S].handler = &mappi2_irq_type; | 116 | irq_desc[M32R_IRQ_SIO0_S].chip = &mappi2_irq_type; |
117 | irq_desc[M32R_IRQ_SIO0_S].action = 0; | 117 | irq_desc[M32R_IRQ_SIO0_S].action = 0; |
118 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; | 118 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; |
119 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; | 119 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; |
120 | disable_mappi2_irq(M32R_IRQ_SIO0_S); | 120 | disable_mappi2_irq(M32R_IRQ_SIO0_S); |
121 | /* SIO1_R : uart receive data */ | 121 | /* SIO1_R : uart receive data */ |
122 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; | 122 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; |
123 | irq_desc[M32R_IRQ_SIO1_R].handler = &mappi2_irq_type; | 123 | irq_desc[M32R_IRQ_SIO1_R].chip = &mappi2_irq_type; |
124 | irq_desc[M32R_IRQ_SIO1_R].action = 0; | 124 | irq_desc[M32R_IRQ_SIO1_R].action = 0; |
125 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; | 125 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; |
126 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; | 126 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; |
@@ -128,7 +128,7 @@ void __init init_IRQ(void) | |||
128 | 128 | ||
129 | /* SIO1_S : uart send data */ | 129 | /* SIO1_S : uart send data */ |
130 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; | 130 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; |
131 | irq_desc[M32R_IRQ_SIO1_S].handler = &mappi2_irq_type; | 131 | irq_desc[M32R_IRQ_SIO1_S].chip = &mappi2_irq_type; |
132 | irq_desc[M32R_IRQ_SIO1_S].action = 0; | 132 | irq_desc[M32R_IRQ_SIO1_S].action = 0; |
133 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; | 133 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; |
134 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; | 134 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; |
@@ -138,7 +138,7 @@ void __init init_IRQ(void) | |||
138 | #if defined(CONFIG_USB) | 138 | #if defined(CONFIG_USB) |
139 | /* INT1 : USB Host controller interrupt */ | 139 | /* INT1 : USB Host controller interrupt */ |
140 | irq_desc[M32R_IRQ_INT1].status = IRQ_DISABLED; | 140 | irq_desc[M32R_IRQ_INT1].status = IRQ_DISABLED; |
141 | irq_desc[M32R_IRQ_INT1].handler = &mappi2_irq_type; | 141 | irq_desc[M32R_IRQ_INT1].chip = &mappi2_irq_type; |
142 | irq_desc[M32R_IRQ_INT1].action = 0; | 142 | irq_desc[M32R_IRQ_INT1].action = 0; |
143 | irq_desc[M32R_IRQ_INT1].depth = 1; | 143 | irq_desc[M32R_IRQ_INT1].depth = 1; |
144 | icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_ISMOD01; | 144 | icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_ISMOD01; |
@@ -147,7 +147,7 @@ void __init init_IRQ(void) | |||
147 | 147 | ||
148 | /* ICUCR40: CFC IREQ */ | 148 | /* ICUCR40: CFC IREQ */ |
149 | irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; | 149 | irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; |
150 | irq_desc[PLD_IRQ_CFIREQ].handler = &mappi2_irq_type; | 150 | irq_desc[PLD_IRQ_CFIREQ].chip = &mappi2_irq_type; |
151 | irq_desc[PLD_IRQ_CFIREQ].action = 0; | 151 | irq_desc[PLD_IRQ_CFIREQ].action = 0; |
152 | irq_desc[PLD_IRQ_CFIREQ].depth = 1; /* disable nested irq */ | 152 | irq_desc[PLD_IRQ_CFIREQ].depth = 1; /* disable nested irq */ |
153 | icu_data[PLD_IRQ_CFIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01; | 153 | icu_data[PLD_IRQ_CFIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01; |
@@ -156,7 +156,7 @@ void __init init_IRQ(void) | |||
156 | #if defined(CONFIG_M32R_CFC) | 156 | #if defined(CONFIG_M32R_CFC) |
157 | /* ICUCR41: CFC Insert */ | 157 | /* ICUCR41: CFC Insert */ |
158 | irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED; | 158 | irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED; |
159 | irq_desc[PLD_IRQ_CFC_INSERT].handler = &mappi2_irq_type; | 159 | irq_desc[PLD_IRQ_CFC_INSERT].chip = &mappi2_irq_type; |
160 | irq_desc[PLD_IRQ_CFC_INSERT].action = 0; | 160 | irq_desc[PLD_IRQ_CFC_INSERT].action = 0; |
161 | irq_desc[PLD_IRQ_CFC_INSERT].depth = 1; /* disable nested irq */ | 161 | irq_desc[PLD_IRQ_CFC_INSERT].depth = 1; /* disable nested irq */ |
162 | icu_data[PLD_IRQ_CFC_INSERT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD00; | 162 | icu_data[PLD_IRQ_CFC_INSERT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD00; |
@@ -164,7 +164,7 @@ void __init init_IRQ(void) | |||
164 | 164 | ||
165 | /* ICUCR42: CFC Eject */ | 165 | /* ICUCR42: CFC Eject */ |
166 | irq_desc[PLD_IRQ_CFC_EJECT].status = IRQ_DISABLED; | 166 | irq_desc[PLD_IRQ_CFC_EJECT].status = IRQ_DISABLED; |
167 | irq_desc[PLD_IRQ_CFC_EJECT].handler = &mappi2_irq_type; | 167 | irq_desc[PLD_IRQ_CFC_EJECT].chip = &mappi2_irq_type; |
168 | irq_desc[PLD_IRQ_CFC_EJECT].action = 0; | 168 | irq_desc[PLD_IRQ_CFC_EJECT].action = 0; |
169 | irq_desc[PLD_IRQ_CFC_EJECT].depth = 1; /* disable nested irq */ | 169 | irq_desc[PLD_IRQ_CFC_EJECT].depth = 1; /* disable nested irq */ |
170 | icu_data[PLD_IRQ_CFC_EJECT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | 170 | icu_data[PLD_IRQ_CFC_EJECT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; |
diff --git a/arch/m32r/kernel/setup_mappi3.c b/arch/m32r/kernel/setup_mappi3.c index d2ff021e2d3d..014b51d17505 100644 --- a/arch/m32r/kernel/setup_mappi3.c +++ b/arch/m32r/kernel/setup_mappi3.c | |||
@@ -87,7 +87,7 @@ void __init init_IRQ(void) | |||
87 | #if defined(CONFIG_SMC91X) | 87 | #if defined(CONFIG_SMC91X) |
88 | /* INT0 : LAN controller (SMC91111) */ | 88 | /* INT0 : LAN controller (SMC91111) */ |
89 | irq_desc[M32R_IRQ_INT0].status = IRQ_DISABLED; | 89 | irq_desc[M32R_IRQ_INT0].status = IRQ_DISABLED; |
90 | irq_desc[M32R_IRQ_INT0].handler = &mappi3_irq_type; | 90 | irq_desc[M32R_IRQ_INT0].chip = &mappi3_irq_type; |
91 | irq_desc[M32R_IRQ_INT0].action = 0; | 91 | irq_desc[M32R_IRQ_INT0].action = 0; |
92 | irq_desc[M32R_IRQ_INT0].depth = 1; | 92 | irq_desc[M32R_IRQ_INT0].depth = 1; |
93 | icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | 93 | icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; |
@@ -96,7 +96,7 @@ void __init init_IRQ(void) | |||
96 | 96 | ||
97 | /* MFT2 : system timer */ | 97 | /* MFT2 : system timer */ |
98 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; | 98 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; |
99 | irq_desc[M32R_IRQ_MFT2].handler = &mappi3_irq_type; | 99 | irq_desc[M32R_IRQ_MFT2].chip = &mappi3_irq_type; |
100 | irq_desc[M32R_IRQ_MFT2].action = 0; | 100 | irq_desc[M32R_IRQ_MFT2].action = 0; |
101 | irq_desc[M32R_IRQ_MFT2].depth = 1; | 101 | irq_desc[M32R_IRQ_MFT2].depth = 1; |
102 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; | 102 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; |
@@ -105,7 +105,7 @@ void __init init_IRQ(void) | |||
105 | #ifdef CONFIG_SERIAL_M32R_SIO | 105 | #ifdef CONFIG_SERIAL_M32R_SIO |
106 | /* SIO0_R : uart receive data */ | 106 | /* SIO0_R : uart receive data */ |
107 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; | 107 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; |
108 | irq_desc[M32R_IRQ_SIO0_R].handler = &mappi3_irq_type; | 108 | irq_desc[M32R_IRQ_SIO0_R].chip = &mappi3_irq_type; |
109 | irq_desc[M32R_IRQ_SIO0_R].action = 0; | 109 | irq_desc[M32R_IRQ_SIO0_R].action = 0; |
110 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; | 110 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; |
111 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; | 111 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; |
@@ -113,14 +113,14 @@ void __init init_IRQ(void) | |||
113 | 113 | ||
114 | /* SIO0_S : uart send data */ | 114 | /* SIO0_S : uart send data */ |
115 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; | 115 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; |
116 | irq_desc[M32R_IRQ_SIO0_S].handler = &mappi3_irq_type; | 116 | irq_desc[M32R_IRQ_SIO0_S].chip = &mappi3_irq_type; |
117 | irq_desc[M32R_IRQ_SIO0_S].action = 0; | 117 | irq_desc[M32R_IRQ_SIO0_S].action = 0; |
118 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; | 118 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; |
119 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; | 119 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; |
120 | disable_mappi3_irq(M32R_IRQ_SIO0_S); | 120 | disable_mappi3_irq(M32R_IRQ_SIO0_S); |
121 | /* SIO1_R : uart receive data */ | 121 | /* SIO1_R : uart receive data */ |
122 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; | 122 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; |
123 | irq_desc[M32R_IRQ_SIO1_R].handler = &mappi3_irq_type; | 123 | irq_desc[M32R_IRQ_SIO1_R].chip = &mappi3_irq_type; |
124 | irq_desc[M32R_IRQ_SIO1_R].action = 0; | 124 | irq_desc[M32R_IRQ_SIO1_R].action = 0; |
125 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; | 125 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; |
126 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; | 126 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; |
@@ -128,7 +128,7 @@ void __init init_IRQ(void) | |||
128 | 128 | ||
129 | /* SIO1_S : uart send data */ | 129 | /* SIO1_S : uart send data */ |
130 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; | 130 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; |
131 | irq_desc[M32R_IRQ_SIO1_S].handler = &mappi3_irq_type; | 131 | irq_desc[M32R_IRQ_SIO1_S].chip = &mappi3_irq_type; |
132 | irq_desc[M32R_IRQ_SIO1_S].action = 0; | 132 | irq_desc[M32R_IRQ_SIO1_S].action = 0; |
133 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; | 133 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; |
134 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; | 134 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; |
@@ -138,7 +138,7 @@ void __init init_IRQ(void) | |||
138 | #if defined(CONFIG_USB) | 138 | #if defined(CONFIG_USB) |
139 | /* INT1 : USB Host controller interrupt */ | 139 | /* INT1 : USB Host controller interrupt */ |
140 | irq_desc[M32R_IRQ_INT1].status = IRQ_DISABLED; | 140 | irq_desc[M32R_IRQ_INT1].status = IRQ_DISABLED; |
141 | irq_desc[M32R_IRQ_INT1].handler = &mappi3_irq_type; | 141 | irq_desc[M32R_IRQ_INT1].chip = &mappi3_irq_type; |
142 | irq_desc[M32R_IRQ_INT1].action = 0; | 142 | irq_desc[M32R_IRQ_INT1].action = 0; |
143 | irq_desc[M32R_IRQ_INT1].depth = 1; | 143 | irq_desc[M32R_IRQ_INT1].depth = 1; |
144 | icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_ISMOD01; | 144 | icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_ISMOD01; |
@@ -147,7 +147,7 @@ void __init init_IRQ(void) | |||
147 | 147 | ||
148 | /* CFC IREQ */ | 148 | /* CFC IREQ */ |
149 | irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; | 149 | irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; |
150 | irq_desc[PLD_IRQ_CFIREQ].handler = &mappi3_irq_type; | 150 | irq_desc[PLD_IRQ_CFIREQ].chip = &mappi3_irq_type; |
151 | irq_desc[PLD_IRQ_CFIREQ].action = 0; | 151 | irq_desc[PLD_IRQ_CFIREQ].action = 0; |
152 | irq_desc[PLD_IRQ_CFIREQ].depth = 1; /* disable nested irq */ | 152 | irq_desc[PLD_IRQ_CFIREQ].depth = 1; /* disable nested irq */ |
153 | icu_data[PLD_IRQ_CFIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01; | 153 | icu_data[PLD_IRQ_CFIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01; |
@@ -156,7 +156,7 @@ void __init init_IRQ(void) | |||
156 | #if defined(CONFIG_M32R_CFC) | 156 | #if defined(CONFIG_M32R_CFC) |
157 | /* ICUCR41: CFC Insert & eject */ | 157 | /* ICUCR41: CFC Insert & eject */ |
158 | irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED; | 158 | irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED; |
159 | irq_desc[PLD_IRQ_CFC_INSERT].handler = &mappi3_irq_type; | 159 | irq_desc[PLD_IRQ_CFC_INSERT].chip = &mappi3_irq_type; |
160 | irq_desc[PLD_IRQ_CFC_INSERT].action = 0; | 160 | irq_desc[PLD_IRQ_CFC_INSERT].action = 0; |
161 | irq_desc[PLD_IRQ_CFC_INSERT].depth = 1; /* disable nested irq */ | 161 | irq_desc[PLD_IRQ_CFC_INSERT].depth = 1; /* disable nested irq */ |
162 | icu_data[PLD_IRQ_CFC_INSERT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD00; | 162 | icu_data[PLD_IRQ_CFC_INSERT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD00; |
@@ -166,7 +166,7 @@ void __init init_IRQ(void) | |||
166 | 166 | ||
167 | /* IDE IREQ */ | 167 | /* IDE IREQ */ |
168 | irq_desc[PLD_IRQ_IDEIREQ].status = IRQ_DISABLED; | 168 | irq_desc[PLD_IRQ_IDEIREQ].status = IRQ_DISABLED; |
169 | irq_desc[PLD_IRQ_IDEIREQ].handler = &mappi3_irq_type; | 169 | irq_desc[PLD_IRQ_IDEIREQ].chip = &mappi3_irq_type; |
170 | irq_desc[PLD_IRQ_IDEIREQ].action = 0; | 170 | irq_desc[PLD_IRQ_IDEIREQ].action = 0; |
171 | irq_desc[PLD_IRQ_IDEIREQ].depth = 1; /* disable nested irq */ | 171 | irq_desc[PLD_IRQ_IDEIREQ].depth = 1; /* disable nested irq */ |
172 | icu_data[PLD_IRQ_IDEIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | 172 | icu_data[PLD_IRQ_IDEIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; |
diff --git a/arch/m32r/kernel/setup_oaks32r.c b/arch/m32r/kernel/setup_oaks32r.c index 0e9e63538c0f..ea64831aef7a 100644 --- a/arch/m32r/kernel/setup_oaks32r.c +++ b/arch/m32r/kernel/setup_oaks32r.c | |||
@@ -85,7 +85,7 @@ void __init init_IRQ(void) | |||
85 | #ifdef CONFIG_NE2000 | 85 | #ifdef CONFIG_NE2000 |
86 | /* INT3 : LAN controller (RTL8019AS) */ | 86 | /* INT3 : LAN controller (RTL8019AS) */ |
87 | irq_desc[M32R_IRQ_INT3].status = IRQ_DISABLED; | 87 | irq_desc[M32R_IRQ_INT3].status = IRQ_DISABLED; |
88 | irq_desc[M32R_IRQ_INT3].handler = &oaks32r_irq_type; | 88 | irq_desc[M32R_IRQ_INT3].chip = &oaks32r_irq_type; |
89 | irq_desc[M32R_IRQ_INT3].action = 0; | 89 | irq_desc[M32R_IRQ_INT3].action = 0; |
90 | irq_desc[M32R_IRQ_INT3].depth = 1; | 90 | irq_desc[M32R_IRQ_INT3].depth = 1; |
91 | icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | 91 | icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; |
@@ -94,7 +94,7 @@ void __init init_IRQ(void) | |||
94 | 94 | ||
95 | /* MFT2 : system timer */ | 95 | /* MFT2 : system timer */ |
96 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; | 96 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; |
97 | irq_desc[M32R_IRQ_MFT2].handler = &oaks32r_irq_type; | 97 | irq_desc[M32R_IRQ_MFT2].chip = &oaks32r_irq_type; |
98 | irq_desc[M32R_IRQ_MFT2].action = 0; | 98 | irq_desc[M32R_IRQ_MFT2].action = 0; |
99 | irq_desc[M32R_IRQ_MFT2].depth = 1; | 99 | irq_desc[M32R_IRQ_MFT2].depth = 1; |
100 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; | 100 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; |
@@ -103,7 +103,7 @@ void __init init_IRQ(void) | |||
103 | #ifdef CONFIG_SERIAL_M32R_SIO | 103 | #ifdef CONFIG_SERIAL_M32R_SIO |
104 | /* SIO0_R : uart receive data */ | 104 | /* SIO0_R : uart receive data */ |
105 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; | 105 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; |
106 | irq_desc[M32R_IRQ_SIO0_R].handler = &oaks32r_irq_type; | 106 | irq_desc[M32R_IRQ_SIO0_R].chip = &oaks32r_irq_type; |
107 | irq_desc[M32R_IRQ_SIO0_R].action = 0; | 107 | irq_desc[M32R_IRQ_SIO0_R].action = 0; |
108 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; | 108 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; |
109 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; | 109 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; |
@@ -111,7 +111,7 @@ void __init init_IRQ(void) | |||
111 | 111 | ||
112 | /* SIO0_S : uart send data */ | 112 | /* SIO0_S : uart send data */ |
113 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; | 113 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; |
114 | irq_desc[M32R_IRQ_SIO0_S].handler = &oaks32r_irq_type; | 114 | irq_desc[M32R_IRQ_SIO0_S].chip = &oaks32r_irq_type; |
115 | irq_desc[M32R_IRQ_SIO0_S].action = 0; | 115 | irq_desc[M32R_IRQ_SIO0_S].action = 0; |
116 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; | 116 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; |
117 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; | 117 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; |
@@ -119,7 +119,7 @@ void __init init_IRQ(void) | |||
119 | 119 | ||
120 | /* SIO1_R : uart receive data */ | 120 | /* SIO1_R : uart receive data */ |
121 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; | 121 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; |
122 | irq_desc[M32R_IRQ_SIO1_R].handler = &oaks32r_irq_type; | 122 | irq_desc[M32R_IRQ_SIO1_R].chip = &oaks32r_irq_type; |
123 | irq_desc[M32R_IRQ_SIO1_R].action = 0; | 123 | irq_desc[M32R_IRQ_SIO1_R].action = 0; |
124 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; | 124 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; |
125 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; | 125 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; |
@@ -127,7 +127,7 @@ void __init init_IRQ(void) | |||
127 | 127 | ||
128 | /* SIO1_S : uart send data */ | 128 | /* SIO1_S : uart send data */ |
129 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; | 129 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; |
130 | irq_desc[M32R_IRQ_SIO1_S].handler = &oaks32r_irq_type; | 130 | irq_desc[M32R_IRQ_SIO1_S].chip = &oaks32r_irq_type; |
131 | irq_desc[M32R_IRQ_SIO1_S].action = 0; | 131 | irq_desc[M32R_IRQ_SIO1_S].action = 0; |
132 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; | 132 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; |
133 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; | 133 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; |
diff --git a/arch/m32r/kernel/setup_opsput.c b/arch/m32r/kernel/setup_opsput.c index 548e8fc7949b..55e8972d455a 100644 --- a/arch/m32r/kernel/setup_opsput.c +++ b/arch/m32r/kernel/setup_opsput.c | |||
@@ -302,7 +302,7 @@ void __init init_IRQ(void) | |||
302 | #if defined(CONFIG_SMC91X) | 302 | #if defined(CONFIG_SMC91X) |
303 | /* INT#0: LAN controller on OPSPUT-LAN (SMC91C111)*/ | 303 | /* INT#0: LAN controller on OPSPUT-LAN (SMC91C111)*/ |
304 | irq_desc[OPSPUT_LAN_IRQ_LAN].status = IRQ_DISABLED; | 304 | irq_desc[OPSPUT_LAN_IRQ_LAN].status = IRQ_DISABLED; |
305 | irq_desc[OPSPUT_LAN_IRQ_LAN].handler = &opsput_lanpld_irq_type; | 305 | irq_desc[OPSPUT_LAN_IRQ_LAN].chip = &opsput_lanpld_irq_type; |
306 | irq_desc[OPSPUT_LAN_IRQ_LAN].action = 0; | 306 | irq_desc[OPSPUT_LAN_IRQ_LAN].action = 0; |
307 | irq_desc[OPSPUT_LAN_IRQ_LAN].depth = 1; /* disable nested irq */ | 307 | irq_desc[OPSPUT_LAN_IRQ_LAN].depth = 1; /* disable nested irq */ |
308 | lanpld_icu_data[irq2lanpldirq(OPSPUT_LAN_IRQ_LAN)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* "H" edge sense */ | 308 | lanpld_icu_data[irq2lanpldirq(OPSPUT_LAN_IRQ_LAN)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* "H" edge sense */ |
@@ -311,7 +311,7 @@ void __init init_IRQ(void) | |||
311 | 311 | ||
312 | /* MFT2 : system timer */ | 312 | /* MFT2 : system timer */ |
313 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; | 313 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; |
314 | irq_desc[M32R_IRQ_MFT2].handler = &opsput_irq_type; | 314 | irq_desc[M32R_IRQ_MFT2].chip = &opsput_irq_type; |
315 | irq_desc[M32R_IRQ_MFT2].action = 0; | 315 | irq_desc[M32R_IRQ_MFT2].action = 0; |
316 | irq_desc[M32R_IRQ_MFT2].depth = 1; | 316 | irq_desc[M32R_IRQ_MFT2].depth = 1; |
317 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; | 317 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; |
@@ -319,7 +319,7 @@ void __init init_IRQ(void) | |||
319 | 319 | ||
320 | /* SIO0 : receive */ | 320 | /* SIO0 : receive */ |
321 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; | 321 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; |
322 | irq_desc[M32R_IRQ_SIO0_R].handler = &opsput_irq_type; | 322 | irq_desc[M32R_IRQ_SIO0_R].chip = &opsput_irq_type; |
323 | irq_desc[M32R_IRQ_SIO0_R].action = 0; | 323 | irq_desc[M32R_IRQ_SIO0_R].action = 0; |
324 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; | 324 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; |
325 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; | 325 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; |
@@ -327,7 +327,7 @@ void __init init_IRQ(void) | |||
327 | 327 | ||
328 | /* SIO0 : send */ | 328 | /* SIO0 : send */ |
329 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; | 329 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; |
330 | irq_desc[M32R_IRQ_SIO0_S].handler = &opsput_irq_type; | 330 | irq_desc[M32R_IRQ_SIO0_S].chip = &opsput_irq_type; |
331 | irq_desc[M32R_IRQ_SIO0_S].action = 0; | 331 | irq_desc[M32R_IRQ_SIO0_S].action = 0; |
332 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; | 332 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; |
333 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; | 333 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; |
@@ -335,7 +335,7 @@ void __init init_IRQ(void) | |||
335 | 335 | ||
336 | /* SIO1 : receive */ | 336 | /* SIO1 : receive */ |
337 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; | 337 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; |
338 | irq_desc[M32R_IRQ_SIO1_R].handler = &opsput_irq_type; | 338 | irq_desc[M32R_IRQ_SIO1_R].chip = &opsput_irq_type; |
339 | irq_desc[M32R_IRQ_SIO1_R].action = 0; | 339 | irq_desc[M32R_IRQ_SIO1_R].action = 0; |
340 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; | 340 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; |
341 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; | 341 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; |
@@ -343,7 +343,7 @@ void __init init_IRQ(void) | |||
343 | 343 | ||
344 | /* SIO1 : send */ | 344 | /* SIO1 : send */ |
345 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; | 345 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; |
346 | irq_desc[M32R_IRQ_SIO1_S].handler = &opsput_irq_type; | 346 | irq_desc[M32R_IRQ_SIO1_S].chip = &opsput_irq_type; |
347 | irq_desc[M32R_IRQ_SIO1_S].action = 0; | 347 | irq_desc[M32R_IRQ_SIO1_S].action = 0; |
348 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; | 348 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; |
349 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; | 349 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; |
@@ -351,7 +351,7 @@ void __init init_IRQ(void) | |||
351 | 351 | ||
352 | /* DMA1 : */ | 352 | /* DMA1 : */ |
353 | irq_desc[M32R_IRQ_DMA1].status = IRQ_DISABLED; | 353 | irq_desc[M32R_IRQ_DMA1].status = IRQ_DISABLED; |
354 | irq_desc[M32R_IRQ_DMA1].handler = &opsput_irq_type; | 354 | irq_desc[M32R_IRQ_DMA1].chip = &opsput_irq_type; |
355 | irq_desc[M32R_IRQ_DMA1].action = 0; | 355 | irq_desc[M32R_IRQ_DMA1].action = 0; |
356 | irq_desc[M32R_IRQ_DMA1].depth = 1; | 356 | irq_desc[M32R_IRQ_DMA1].depth = 1; |
357 | icu_data[M32R_IRQ_DMA1].icucr = 0; | 357 | icu_data[M32R_IRQ_DMA1].icucr = 0; |
@@ -360,7 +360,7 @@ void __init init_IRQ(void) | |||
360 | #ifdef CONFIG_SERIAL_M32R_PLDSIO | 360 | #ifdef CONFIG_SERIAL_M32R_PLDSIO |
361 | /* INT#1: SIO0 Receive on PLD */ | 361 | /* INT#1: SIO0 Receive on PLD */ |
362 | irq_desc[PLD_IRQ_SIO0_RCV].status = IRQ_DISABLED; | 362 | irq_desc[PLD_IRQ_SIO0_RCV].status = IRQ_DISABLED; |
363 | irq_desc[PLD_IRQ_SIO0_RCV].handler = &opsput_pld_irq_type; | 363 | irq_desc[PLD_IRQ_SIO0_RCV].chip = &opsput_pld_irq_type; |
364 | irq_desc[PLD_IRQ_SIO0_RCV].action = 0; | 364 | irq_desc[PLD_IRQ_SIO0_RCV].action = 0; |
365 | irq_desc[PLD_IRQ_SIO0_RCV].depth = 1; /* disable nested irq */ | 365 | irq_desc[PLD_IRQ_SIO0_RCV].depth = 1; /* disable nested irq */ |
366 | pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_RCV)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03; | 366 | pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_RCV)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03; |
@@ -368,7 +368,7 @@ void __init init_IRQ(void) | |||
368 | 368 | ||
369 | /* INT#1: SIO0 Send on PLD */ | 369 | /* INT#1: SIO0 Send on PLD */ |
370 | irq_desc[PLD_IRQ_SIO0_SND].status = IRQ_DISABLED; | 370 | irq_desc[PLD_IRQ_SIO0_SND].status = IRQ_DISABLED; |
371 | irq_desc[PLD_IRQ_SIO0_SND].handler = &opsput_pld_irq_type; | 371 | irq_desc[PLD_IRQ_SIO0_SND].chip = &opsput_pld_irq_type; |
372 | irq_desc[PLD_IRQ_SIO0_SND].action = 0; | 372 | irq_desc[PLD_IRQ_SIO0_SND].action = 0; |
373 | irq_desc[PLD_IRQ_SIO0_SND].depth = 1; /* disable nested irq */ | 373 | irq_desc[PLD_IRQ_SIO0_SND].depth = 1; /* disable nested irq */ |
374 | pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_SND)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03; | 374 | pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_SND)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03; |
@@ -378,7 +378,7 @@ void __init init_IRQ(void) | |||
378 | #if defined(CONFIG_M32R_CFC) | 378 | #if defined(CONFIG_M32R_CFC) |
379 | /* INT#1: CFC IREQ on PLD */ | 379 | /* INT#1: CFC IREQ on PLD */ |
380 | irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; | 380 | irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; |
381 | irq_desc[PLD_IRQ_CFIREQ].handler = &opsput_pld_irq_type; | 381 | irq_desc[PLD_IRQ_CFIREQ].chip = &opsput_pld_irq_type; |
382 | irq_desc[PLD_IRQ_CFIREQ].action = 0; | 382 | irq_desc[PLD_IRQ_CFIREQ].action = 0; |
383 | irq_desc[PLD_IRQ_CFIREQ].depth = 1; /* disable nested irq */ | 383 | irq_desc[PLD_IRQ_CFIREQ].depth = 1; /* disable nested irq */ |
384 | pld_icu_data[irq2pldirq(PLD_IRQ_CFIREQ)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* 'L' level sense */ | 384 | pld_icu_data[irq2pldirq(PLD_IRQ_CFIREQ)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* 'L' level sense */ |
@@ -386,7 +386,7 @@ void __init init_IRQ(void) | |||
386 | 386 | ||
387 | /* INT#1: CFC Insert on PLD */ | 387 | /* INT#1: CFC Insert on PLD */ |
388 | irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED; | 388 | irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED; |
389 | irq_desc[PLD_IRQ_CFC_INSERT].handler = &opsput_pld_irq_type; | 389 | irq_desc[PLD_IRQ_CFC_INSERT].chip = &opsput_pld_irq_type; |
390 | irq_desc[PLD_IRQ_CFC_INSERT].action = 0; | 390 | irq_desc[PLD_IRQ_CFC_INSERT].action = 0; |
391 | irq_desc[PLD_IRQ_CFC_INSERT].depth = 1; /* disable nested irq */ | 391 | irq_desc[PLD_IRQ_CFC_INSERT].depth = 1; /* disable nested irq */ |
392 | pld_icu_data[irq2pldirq(PLD_IRQ_CFC_INSERT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD00; /* 'L' edge sense */ | 392 | pld_icu_data[irq2pldirq(PLD_IRQ_CFC_INSERT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD00; /* 'L' edge sense */ |
@@ -394,7 +394,7 @@ void __init init_IRQ(void) | |||
394 | 394 | ||
395 | /* INT#1: CFC Eject on PLD */ | 395 | /* INT#1: CFC Eject on PLD */ |
396 | irq_desc[PLD_IRQ_CFC_EJECT].status = IRQ_DISABLED; | 396 | irq_desc[PLD_IRQ_CFC_EJECT].status = IRQ_DISABLED; |
397 | irq_desc[PLD_IRQ_CFC_EJECT].handler = &opsput_pld_irq_type; | 397 | irq_desc[PLD_IRQ_CFC_EJECT].chip = &opsput_pld_irq_type; |
398 | irq_desc[PLD_IRQ_CFC_EJECT].action = 0; | 398 | irq_desc[PLD_IRQ_CFC_EJECT].action = 0; |
399 | irq_desc[PLD_IRQ_CFC_EJECT].depth = 1; /* disable nested irq */ | 399 | irq_desc[PLD_IRQ_CFC_EJECT].depth = 1; /* disable nested irq */ |
400 | pld_icu_data[irq2pldirq(PLD_IRQ_CFC_EJECT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* 'H' edge sense */ | 400 | pld_icu_data[irq2pldirq(PLD_IRQ_CFC_EJECT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* 'H' edge sense */ |
@@ -420,7 +420,7 @@ void __init init_IRQ(void) | |||
420 | outw(USBCR_OTGS, USBCR); /* USBCR: non-OTG */ | 420 | outw(USBCR_OTGS, USBCR); /* USBCR: non-OTG */ |
421 | 421 | ||
422 | irq_desc[OPSPUT_LCD_IRQ_USB_INT1].status = IRQ_DISABLED; | 422 | irq_desc[OPSPUT_LCD_IRQ_USB_INT1].status = IRQ_DISABLED; |
423 | irq_desc[OPSPUT_LCD_IRQ_USB_INT1].handler = &opsput_lcdpld_irq_type; | 423 | irq_desc[OPSPUT_LCD_IRQ_USB_INT1].chip = &opsput_lcdpld_irq_type; |
424 | irq_desc[OPSPUT_LCD_IRQ_USB_INT1].action = 0; | 424 | irq_desc[OPSPUT_LCD_IRQ_USB_INT1].action = 0; |
425 | irq_desc[OPSPUT_LCD_IRQ_USB_INT1].depth = 1; | 425 | irq_desc[OPSPUT_LCD_IRQ_USB_INT1].depth = 1; |
426 | lcdpld_icu_data[irq2lcdpldirq(OPSPUT_LCD_IRQ_USB_INT1)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* "L" level sense */ | 426 | lcdpld_icu_data[irq2lcdpldirq(OPSPUT_LCD_IRQ_USB_INT1)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* "L" level sense */ |
@@ -438,7 +438,7 @@ void __init init_IRQ(void) | |||
438 | * INT3# is used for AR | 438 | * INT3# is used for AR |
439 | */ | 439 | */ |
440 | irq_desc[M32R_IRQ_INT3].status = IRQ_DISABLED; | 440 | irq_desc[M32R_IRQ_INT3].status = IRQ_DISABLED; |
441 | irq_desc[M32R_IRQ_INT3].handler = &opsput_irq_type; | 441 | irq_desc[M32R_IRQ_INT3].chip = &opsput_irq_type; |
442 | irq_desc[M32R_IRQ_INT3].action = 0; | 442 | irq_desc[M32R_IRQ_INT3].action = 0; |
443 | irq_desc[M32R_IRQ_INT3].depth = 1; | 443 | irq_desc[M32R_IRQ_INT3].depth = 1; |
444 | icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | 444 | icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; |
diff --git a/arch/m32r/kernel/setup_usrv.c b/arch/m32r/kernel/setup_usrv.c index 64be659a23e7..7fa12d8f66b4 100644 --- a/arch/m32r/kernel/setup_usrv.c +++ b/arch/m32r/kernel/setup_usrv.c | |||
@@ -158,7 +158,7 @@ void __init init_IRQ(void) | |||
158 | 158 | ||
159 | /* MFT2 : system timer */ | 159 | /* MFT2 : system timer */ |
160 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; | 160 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; |
161 | irq_desc[M32R_IRQ_MFT2].handler = &mappi_irq_type; | 161 | irq_desc[M32R_IRQ_MFT2].chip = &mappi_irq_type; |
162 | irq_desc[M32R_IRQ_MFT2].action = 0; | 162 | irq_desc[M32R_IRQ_MFT2].action = 0; |
163 | irq_desc[M32R_IRQ_MFT2].depth = 1; | 163 | irq_desc[M32R_IRQ_MFT2].depth = 1; |
164 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; | 164 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; |
@@ -167,7 +167,7 @@ void __init init_IRQ(void) | |||
167 | #if defined(CONFIG_SERIAL_M32R_SIO) | 167 | #if defined(CONFIG_SERIAL_M32R_SIO) |
168 | /* SIO0_R : uart receive data */ | 168 | /* SIO0_R : uart receive data */ |
169 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; | 169 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; |
170 | irq_desc[M32R_IRQ_SIO0_R].handler = &mappi_irq_type; | 170 | irq_desc[M32R_IRQ_SIO0_R].chip = &mappi_irq_type; |
171 | irq_desc[M32R_IRQ_SIO0_R].action = 0; | 171 | irq_desc[M32R_IRQ_SIO0_R].action = 0; |
172 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; | 172 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; |
173 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; | 173 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; |
@@ -175,7 +175,7 @@ void __init init_IRQ(void) | |||
175 | 175 | ||
176 | /* SIO0_S : uart send data */ | 176 | /* SIO0_S : uart send data */ |
177 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; | 177 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; |
178 | irq_desc[M32R_IRQ_SIO0_S].handler = &mappi_irq_type; | 178 | irq_desc[M32R_IRQ_SIO0_S].chip = &mappi_irq_type; |
179 | irq_desc[M32R_IRQ_SIO0_S].action = 0; | 179 | irq_desc[M32R_IRQ_SIO0_S].action = 0; |
180 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; | 180 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; |
181 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; | 181 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; |
@@ -183,7 +183,7 @@ void __init init_IRQ(void) | |||
183 | 183 | ||
184 | /* SIO1_R : uart receive data */ | 184 | /* SIO1_R : uart receive data */ |
185 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; | 185 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; |
186 | irq_desc[M32R_IRQ_SIO1_R].handler = &mappi_irq_type; | 186 | irq_desc[M32R_IRQ_SIO1_R].chip = &mappi_irq_type; |
187 | irq_desc[M32R_IRQ_SIO1_R].action = 0; | 187 | irq_desc[M32R_IRQ_SIO1_R].action = 0; |
188 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; | 188 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; |
189 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; | 189 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; |
@@ -191,7 +191,7 @@ void __init init_IRQ(void) | |||
191 | 191 | ||
192 | /* SIO1_S : uart send data */ | 192 | /* SIO1_S : uart send data */ |
193 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; | 193 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; |
194 | irq_desc[M32R_IRQ_SIO1_S].handler = &mappi_irq_type; | 194 | irq_desc[M32R_IRQ_SIO1_S].chip = &mappi_irq_type; |
195 | irq_desc[M32R_IRQ_SIO1_S].action = 0; | 195 | irq_desc[M32R_IRQ_SIO1_S].action = 0; |
196 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; | 196 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; |
197 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; | 197 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; |
@@ -201,7 +201,7 @@ void __init init_IRQ(void) | |||
201 | /* INT#67-#71: CFC#0 IREQ on PLD */ | 201 | /* INT#67-#71: CFC#0 IREQ on PLD */ |
202 | for (i = 0 ; i < CONFIG_CFC_NUM ; i++ ) { | 202 | for (i = 0 ; i < CONFIG_CFC_NUM ; i++ ) { |
203 | irq_desc[PLD_IRQ_CF0 + i].status = IRQ_DISABLED; | 203 | irq_desc[PLD_IRQ_CF0 + i].status = IRQ_DISABLED; |
204 | irq_desc[PLD_IRQ_CF0 + i].handler = &m32700ut_pld_irq_type; | 204 | irq_desc[PLD_IRQ_CF0 + i].chip = &m32700ut_pld_irq_type; |
205 | irq_desc[PLD_IRQ_CF0 + i].action = 0; | 205 | irq_desc[PLD_IRQ_CF0 + i].action = 0; |
206 | irq_desc[PLD_IRQ_CF0 + i].depth = 1; /* disable nested irq */ | 206 | irq_desc[PLD_IRQ_CF0 + i].depth = 1; /* disable nested irq */ |
207 | pld_icu_data[irq2pldirq(PLD_IRQ_CF0 + i)].icucr | 207 | pld_icu_data[irq2pldirq(PLD_IRQ_CF0 + i)].icucr |
@@ -212,7 +212,7 @@ void __init init_IRQ(void) | |||
212 | #if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE) | 212 | #if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE) |
213 | /* INT#76: 16552D#0 IREQ on PLD */ | 213 | /* INT#76: 16552D#0 IREQ on PLD */ |
214 | irq_desc[PLD_IRQ_UART0].status = IRQ_DISABLED; | 214 | irq_desc[PLD_IRQ_UART0].status = IRQ_DISABLED; |
215 | irq_desc[PLD_IRQ_UART0].handler = &m32700ut_pld_irq_type; | 215 | irq_desc[PLD_IRQ_UART0].chip = &m32700ut_pld_irq_type; |
216 | irq_desc[PLD_IRQ_UART0].action = 0; | 216 | irq_desc[PLD_IRQ_UART0].action = 0; |
217 | irq_desc[PLD_IRQ_UART0].depth = 1; /* disable nested irq */ | 217 | irq_desc[PLD_IRQ_UART0].depth = 1; /* disable nested irq */ |
218 | pld_icu_data[irq2pldirq(PLD_IRQ_UART0)].icucr | 218 | pld_icu_data[irq2pldirq(PLD_IRQ_UART0)].icucr |
@@ -221,7 +221,7 @@ void __init init_IRQ(void) | |||
221 | 221 | ||
222 | /* INT#77: 16552D#1 IREQ on PLD */ | 222 | /* INT#77: 16552D#1 IREQ on PLD */ |
223 | irq_desc[PLD_IRQ_UART1].status = IRQ_DISABLED; | 223 | irq_desc[PLD_IRQ_UART1].status = IRQ_DISABLED; |
224 | irq_desc[PLD_IRQ_UART1].handler = &m32700ut_pld_irq_type; | 224 | irq_desc[PLD_IRQ_UART1].chip = &m32700ut_pld_irq_type; |
225 | irq_desc[PLD_IRQ_UART1].action = 0; | 225 | irq_desc[PLD_IRQ_UART1].action = 0; |
226 | irq_desc[PLD_IRQ_UART1].depth = 1; /* disable nested irq */ | 226 | irq_desc[PLD_IRQ_UART1].depth = 1; /* disable nested irq */ |
227 | pld_icu_data[irq2pldirq(PLD_IRQ_UART1)].icucr | 227 | pld_icu_data[irq2pldirq(PLD_IRQ_UART1)].icucr |
@@ -232,7 +232,7 @@ void __init init_IRQ(void) | |||
232 | #if defined(CONFIG_IDC_AK4524) || defined(CONFIG_IDC_AK4524_MODULE) | 232 | #if defined(CONFIG_IDC_AK4524) || defined(CONFIG_IDC_AK4524_MODULE) |
233 | /* INT#80: AK4524 IREQ on PLD */ | 233 | /* INT#80: AK4524 IREQ on PLD */ |
234 | irq_desc[PLD_IRQ_SNDINT].status = IRQ_DISABLED; | 234 | irq_desc[PLD_IRQ_SNDINT].status = IRQ_DISABLED; |
235 | irq_desc[PLD_IRQ_SNDINT].handler = &m32700ut_pld_irq_type; | 235 | irq_desc[PLD_IRQ_SNDINT].chip = &m32700ut_pld_irq_type; |
236 | irq_desc[PLD_IRQ_SNDINT].action = 0; | 236 | irq_desc[PLD_IRQ_SNDINT].action = 0; |
237 | irq_desc[PLD_IRQ_SNDINT].depth = 1; /* disable nested irq */ | 237 | irq_desc[PLD_IRQ_SNDINT].depth = 1; /* disable nested irq */ |
238 | pld_icu_data[irq2pldirq(PLD_IRQ_SNDINT)].icucr | 238 | pld_icu_data[irq2pldirq(PLD_IRQ_SNDINT)].icucr |
diff --git a/arch/m68knommu/Kconfig b/arch/m68knommu/Kconfig index 8b6e723eb82b..e767f2ddae72 100644 --- a/arch/m68knommu/Kconfig +++ b/arch/m68knommu/Kconfig | |||
@@ -540,6 +540,59 @@ config RAM32BIT | |||
540 | 540 | ||
541 | endchoice | 541 | endchoice |
542 | 542 | ||
543 | comment "ROM configuration" | ||
544 | |||
545 | config ROM | ||
546 | bool "Specify ROM linker regions" | ||
547 | default n | ||
548 | help | ||
549 | Define a ROM region for the linker script. This creates a kernel | ||
550 | that can be stored in flash, with possibly the text, and data | ||
551 | regions being copied out to RAM at startup. | ||
552 | |||
553 | config ROMBASE | ||
554 | hex "Address of the base of ROM device" | ||
555 | default "0" | ||
556 | depends on ROM | ||
557 | help | ||
558 | Define the address that the ROM region starts at. Some platforms | ||
559 | use this to set their chip select region accordingly for the boot | ||
560 | device. | ||
561 | |||
562 | config ROMVEC | ||
563 | hex "Address of the base of the ROM vectors" | ||
564 | default "0" | ||
565 | depends on ROM | ||
566 | help | ||
567 | This is almost always the same as the base of the ROM. Since on all | ||
568 | 68000 type varients the vectors are at the base of the boot device | ||
569 | on system startup. | ||
570 | |||
571 | config ROMVECSIZE | ||
572 | hex "Size of ROM vector region (in bytes)" | ||
573 | default "0x400" | ||
574 | depends on ROM | ||
575 | help | ||
576 | Define the size of the vector region in ROM. For most 68000 | ||
577 | varients this would be 0x400 bytes in size. Set to 0 if you do | ||
578 | not want a vector region at the start of the ROM. | ||
579 | |||
580 | config ROMSTART | ||
581 | hex "Address of the base of system image in ROM" | ||
582 | default "0x400" | ||
583 | depends on ROM | ||
584 | help | ||
585 | Define the start address of the system image in ROM. Commonly this | ||
586 | is strait after the ROM vectors. | ||
587 | |||
588 | config ROMSIZE | ||
589 | hex "Size of the ROM device" | ||
590 | default "0x100000" | ||
591 | depends on ROM | ||
592 | help | ||
593 | Size of the ROM device. On some platforms this is used to setup | ||
594 | the chip select that controls the boot ROM device. | ||
595 | |||
543 | choice | 596 | choice |
544 | prompt "Kernel executes from" | 597 | prompt "Kernel executes from" |
545 | ---help--- | 598 | ---help--- |
diff --git a/arch/m68knommu/kernel/comempci.c b/arch/m68knommu/kernel/comempci.c index 8670938f1107..db7a0c1cebae 100644 --- a/arch/m68knommu/kernel/comempci.c +++ b/arch/m68knommu/kernel/comempci.c | |||
@@ -357,7 +357,8 @@ void pcibios_fixup_bus(struct pci_bus *b) | |||
357 | 357 | ||
358 | /*****************************************************************************/ | 358 | /*****************************************************************************/ |
359 | 359 | ||
360 | void pcibios_align_resource(void *data, struct resource *res, unsigned long size, unsigned long align) | 360 | void pcibios_align_resource(void *data, struct resource *res, |
361 | resource_size_t size, resource_size_t align) | ||
361 | { | 362 | { |
362 | } | 363 | } |
363 | 364 | ||
diff --git a/arch/m68knommu/kernel/vmlinux.lds.S b/arch/m68knommu/kernel/vmlinux.lds.S index 6a2f0c693254..59ced831b792 100644 --- a/arch/m68knommu/kernel/vmlinux.lds.S +++ b/arch/m68knommu/kernel/vmlinux.lds.S | |||
@@ -3,63 +3,13 @@ | |||
3 | * | 3 | * |
4 | * (C) Copyright 2002-2006, Greg Ungerer <gerg@snapgear.com> | 4 | * (C) Copyright 2002-2006, Greg Ungerer <gerg@snapgear.com> |
5 | * | 5 | * |
6 | * This ends up looking compilcated, because of the number of | 6 | * This linker script is equiped to build either ROM loaded or RAM |
7 | * address variations for ram and rom/flash layouts. The real | 7 | * run kernels. |
8 | * work of the linker script is all at the end, and reasonably | ||
9 | * strait forward. | ||
10 | */ | 8 | */ |
11 | 9 | ||
12 | #include <linux/config.h> | 10 | #include <linux/config.h> |
13 | #include <asm-generic/vmlinux.lds.h> | 11 | #include <asm-generic/vmlinux.lds.h> |
14 | 12 | ||
15 | /* | ||
16 | * Original Palm pilot (same for Xcopilot). | ||
17 | * There is really only a rom target for this. | ||
18 | */ | ||
19 | #ifdef CONFIG_PILOT3 | ||
20 | #define ROMVEC_START 0x10c00000 | ||
21 | #define ROMVEC_LENGTH 0x10400 | ||
22 | #define ROM_START 0x10c10400 | ||
23 | #define ROM_LENGTH 0xfec00 | ||
24 | #define ROM_END 0x10d00000 | ||
25 | #define DATA_ADDR CONFIG_KERNELBASE | ||
26 | #endif | ||
27 | |||
28 | /* | ||
29 | * Same setup on both the uCsimm and uCdimm. | ||
30 | */ | ||
31 | #if defined(CONFIG_UCSIMM) || defined(CONFIG_UCDIMM) | ||
32 | #ifdef CONFIG_RAMKERNEL | ||
33 | #define ROMVEC_START 0x10c10000 | ||
34 | #define ROMVEC_LENGTH 0x400 | ||
35 | #define ROM_START 0x10c10400 | ||
36 | #define ROM_LENGTH 0x1efc00 | ||
37 | #define ROM_END 0x10e00000 | ||
38 | #endif | ||
39 | #ifdef CONFIG_ROMKERNEL | ||
40 | #define ROMVEC_START 0x10c10000 | ||
41 | #define ROMVEC_LENGTH 0x400 | ||
42 | #define ROM_START 0x10c10400 | ||
43 | #define ROM_LENGTH 0x1efc00 | ||
44 | #define ROM_END 0x10e00000 | ||
45 | #endif | ||
46 | #ifdef CONFIG_HIMEMKERNEL | ||
47 | #define ROMVEC_START 0x00600000 | ||
48 | #define ROMVEC_LENGTH 0x400 | ||
49 | #define ROM_START 0x00600400 | ||
50 | #define ROM_LENGTH 0x1efc00 | ||
51 | #define ROM_END 0x007f0000 | ||
52 | #endif | ||
53 | #endif | ||
54 | |||
55 | #ifdef CONFIG_UCQUICC | ||
56 | #define ROMVEC_START 0x00000000 | ||
57 | #define ROMVEC_LENGTH 0x404 | ||
58 | #define ROM_START 0x00000404 | ||
59 | #define ROM_LENGTH 0x1ff6fc | ||
60 | #define ROM_END 0x00200000 | ||
61 | #endif | ||
62 | |||
63 | #if defined(CONFIG_RAMKERNEL) | 13 | #if defined(CONFIG_RAMKERNEL) |
64 | #define RAM_START CONFIG_KERNELBASE | 14 | #define RAM_START CONFIG_KERNELBASE |
65 | #define RAM_LENGTH (CONFIG_RAMBASE + CONFIG_RAMSIZE - CONFIG_KERNELBASE) | 15 | #define RAM_LENGTH (CONFIG_RAMBASE + CONFIG_RAMSIZE - CONFIG_KERNELBASE) |
@@ -71,6 +21,10 @@ | |||
71 | #if defined(CONFIG_ROMKERNEL) || defined(CONFIG_HIMEMKERNEL) | 21 | #if defined(CONFIG_ROMKERNEL) || defined(CONFIG_HIMEMKERNEL) |
72 | #define RAM_START CONFIG_RAMBASE | 22 | #define RAM_START CONFIG_RAMBASE |
73 | #define RAM_LENGTH CONFIG_RAMSIZE | 23 | #define RAM_LENGTH CONFIG_RAMSIZE |
24 | #define ROMVEC_START CONFIG_ROMVEC | ||
25 | #define ROMVEC_LENGTH CONFIG_ROMVECSIZE | ||
26 | #define ROM_START CONFIG_ROMSTART | ||
27 | #define ROM_LENGTH CONFIG_ROMSIZE | ||
74 | #define TEXT rom | 28 | #define TEXT rom |
75 | #define DATA ram | 29 | #define DATA ram |
76 | #define INIT ram | 30 | #define INIT ram |
@@ -90,7 +44,6 @@ MEMORY { | |||
90 | #ifdef ROM_START | 44 | #ifdef ROM_START |
91 | romvec : ORIGIN = ROMVEC_START, LENGTH = ROMVEC_LENGTH | 45 | romvec : ORIGIN = ROMVEC_START, LENGTH = ROMVEC_LENGTH |
92 | rom : ORIGIN = ROM_START, LENGTH = ROM_LENGTH | 46 | rom : ORIGIN = ROM_START, LENGTH = ROM_LENGTH |
93 | erom : ORIGIN = ROM_END, LENGTH = 0 | ||
94 | #endif | 47 | #endif |
95 | } | 48 | } |
96 | 49 | ||
@@ -167,13 +120,6 @@ SECTIONS { | |||
167 | _etext = . ; | 120 | _etext = . ; |
168 | } > TEXT | 121 | } > TEXT |
169 | 122 | ||
170 | #ifdef ROM_END | ||
171 | . = ROM_END ; | ||
172 | .erom : { | ||
173 | __rom_end = . ; | ||
174 | } > erom | ||
175 | #endif | ||
176 | |||
177 | .data DATA_ADDR : { | 123 | .data DATA_ADDR : { |
178 | . = ALIGN(4); | 124 | . = ALIGN(4); |
179 | _sdata = . ; | 125 | _sdata = . ; |
diff --git a/arch/m68knommu/platform/68328/Makefile b/arch/m68knommu/platform/68328/Makefile index 1b3b719e4479..5e5435552d56 100644 --- a/arch/m68knommu/platform/68328/Makefile +++ b/arch/m68knommu/platform/68328/Makefile | |||
@@ -8,6 +8,7 @@ head-$(CONFIG_DRAGEN2) = head-de2.o | |||
8 | 8 | ||
9 | obj-y += entry.o ints.o timers.o | 9 | obj-y += entry.o ints.o timers.o |
10 | obj-$(CONFIG_M68328) += config.o | 10 | obj-$(CONFIG_M68328) += config.o |
11 | obj-$(CONFIG_ROM) += romvec.o | ||
11 | 12 | ||
12 | extra-y := head.o | 13 | extra-y := head.o |
13 | extra-$(CONFIG_M68328) += bootlogo.rh head.o | 14 | extra-$(CONFIG_M68328) += bootlogo.rh head.o |
diff --git a/arch/m68knommu/platform/68328/ints.c b/arch/m68knommu/platform/68328/ints.c index 7437217813d2..2dda7339aae5 100644 --- a/arch/m68knommu/platform/68328/ints.c +++ b/arch/m68knommu/platform/68328/ints.c | |||
@@ -18,6 +18,7 @@ | |||
18 | 18 | ||
19 | #include <asm/system.h> | 19 | #include <asm/system.h> |
20 | #include <asm/irq.h> | 20 | #include <asm/irq.h> |
21 | #include <asm/irqnode.h> | ||
21 | #include <asm/traps.h> | 22 | #include <asm/traps.h> |
22 | #include <asm/io.h> | 23 | #include <asm/io.h> |
23 | #include <asm/machdep.h> | 24 | #include <asm/machdep.h> |
@@ -82,25 +83,6 @@ unsigned int local_irq_count[NR_CPUS]; | |||
82 | /* irq node variables for the 32 (potential) on chip sources */ | 83 | /* irq node variables for the 32 (potential) on chip sources */ |
83 | static irq_node_t int_irq_list[NR_IRQS]; | 84 | static irq_node_t int_irq_list[NR_IRQS]; |
84 | 85 | ||
85 | #if !defined(CONFIG_DRAGEN2) | ||
86 | asm (".global _start, __ramend/n/t" | ||
87 | ".section .romvec/n" | ||
88 | "e_vectors:\n\t" | ||
89 | ".long __ramend-4, _start, buserr, trap, trap, trap, trap, trap\n\t" | ||
90 | ".long trap, trap, trap, trap, trap, trap, trap, trap\n\t" | ||
91 | ".long trap, trap, trap, trap, trap, trap, trap, trap\n\t" | ||
92 | ".long trap, trap, trap, trap\n\t" | ||
93 | ".long trap, trap, trap, trap\n\t" | ||
94 | /*.long inthandler, inthandler, inthandler, inthandler | ||
95 | .long inthandler4, inthandler, inthandler, inthandler */ | ||
96 | /* TRAP #0-15 */ | ||
97 | ".long system_call, trap, trap, trap, trap, trap, trap, trap\n\t" | ||
98 | ".long trap, trap, trap, trap, trap, trap, trap, trap\n\t" | ||
99 | ".long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n\t" | ||
100 | ".text\n" | ||
101 | "ignore: rte"); | ||
102 | #endif | ||
103 | |||
104 | /* | 86 | /* |
105 | * This function should be called during kernel startup to initialize | 87 | * This function should be called during kernel startup to initialize |
106 | * the IRQ handling routines. | 88 | * the IRQ handling routines. |
diff --git a/arch/m68knommu/platform/68328/romvec.S b/arch/m68knommu/platform/68328/romvec.S new file mode 100644 index 000000000000..3e7fe1e14913 --- /dev/null +++ b/arch/m68knommu/platform/68328/romvec.S | |||
@@ -0,0 +1,37 @@ | |||
1 | /* | ||
2 | * linux/arch/m68knommu/platform/68328/romvec.S | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file COPYING in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright 1996 Roman Zippel | ||
9 | * Copyright 1999 D. Jeff Dionne <jeff@rt-control.com> | ||
10 | * Copyright 2006 Greg Ungerer <gerg@snapgear.com> | ||
11 | */ | ||
12 | |||
13 | #include <linux/config.h> | ||
14 | |||
15 | .global _start | ||
16 | .global _buserr | ||
17 | .global trap | ||
18 | .global system_call | ||
19 | |||
20 | .section .romvec | ||
21 | |||
22 | e_vectors: | ||
23 | .long CONFIG_RAMBASE+CONFIG_RAMSIZE-4, _start, buserr, trap | ||
24 | .long trap, trap, trap, trap | ||
25 | .long trap, trap, trap, trap | ||
26 | .long trap, trap, trap, trap | ||
27 | .long trap, trap, trap, trap | ||
28 | .long trap, trap, trap, trap | ||
29 | .long trap, trap, trap, trap | ||
30 | .long trap, trap, trap, trap | ||
31 | /* TRAP #0-15 */ | ||
32 | .long system_call, trap, trap, trap | ||
33 | .long trap, trap, trap, trap | ||
34 | .long trap, trap, trap, trap | ||
35 | .long trap, trap, trap, trap | ||
36 | .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 | ||
37 | |||
diff --git a/arch/m68knommu/platform/68360/config.c b/arch/m68knommu/platform/68360/config.c index 3db244625f0f..69c670dfd62b 100644 --- a/arch/m68knommu/platform/68360/config.c +++ b/arch/m68knommu/platform/68360/config.c | |||
@@ -141,13 +141,13 @@ int BSP_set_clock_mmss (unsigned long nowtime) | |||
141 | void BSP_reset (void) | 141 | void BSP_reset (void) |
142 | { | 142 | { |
143 | local_irq_disable(); | 143 | local_irq_disable(); |
144 | asm volatile (" | 144 | asm volatile ( |
145 | moveal #_start, %a0; | 145 | "moveal #_start, %a0;\n" |
146 | moveb #0, 0xFFFFF300; | 146 | "moveb #0, 0xFFFFF300;\n" |
147 | moveal 0(%a0), %sp; | 147 | "moveal 0(%a0), %sp;\n" |
148 | moveal 4(%a0), %a0; | 148 | "moveal 4(%a0), %a0;\n" |
149 | jmp (%a0); | 149 | "jmp (%a0);\n" |
150 | "); | 150 | ); |
151 | } | 151 | } |
152 | 152 | ||
153 | unsigned char *scc1_hwaddr; | 153 | unsigned char *scc1_hwaddr; |
diff --git a/arch/m68knommu/platform/68360/ints.c b/arch/m68knommu/platform/68360/ints.c index ba184db1651b..0245fc4a4781 100644 --- a/arch/m68knommu/platform/68360/ints.c +++ b/arch/m68knommu/platform/68360/ints.c | |||
@@ -20,6 +20,7 @@ | |||
20 | 20 | ||
21 | #include <asm/system.h> | 21 | #include <asm/system.h> |
22 | #include <asm/irq.h> | 22 | #include <asm/irq.h> |
23 | #include <asm/irqnode.h> | ||
23 | #include <asm/traps.h> | 24 | #include <asm/traps.h> |
24 | #include <asm/io.h> | 25 | #include <asm/io.h> |
25 | #include <asm/machdep.h> | 26 | #include <asm/machdep.h> |
diff --git a/arch/m68knommu/platform/68EZ328/config.c b/arch/m68knommu/platform/68EZ328/config.c index d8d56e5de310..15a14a67c2bf 100644 --- a/arch/m68knommu/platform/68EZ328/config.c +++ b/arch/m68knommu/platform/68EZ328/config.c | |||
@@ -42,13 +42,13 @@ void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int | |||
42 | void m68ez328_reset(void) | 42 | void m68ez328_reset(void) |
43 | { | 43 | { |
44 | local_irq_disable(); | 44 | local_irq_disable(); |
45 | asm volatile (" | 45 | asm volatile ( |
46 | moveal #0x10c00000, %a0; | 46 | "moveal #0x10c00000, %a0;\n" |
47 | moveb #0, 0xFFFFF300; | 47 | "moveb #0, 0xFFFFF300;\n" |
48 | moveal 0(%a0), %sp; | 48 | "moveal 0(%a0), %sp;\n" |
49 | moveal 4(%a0), %a0; | 49 | "moveal 4(%a0), %a0;\n" |
50 | jmp (%a0); | 50 | "jmp (%a0);\n" |
51 | "); | 51 | ); |
52 | } | 52 | } |
53 | 53 | ||
54 | /***************************************************************************/ | 54 | /***************************************************************************/ |
diff --git a/arch/m68knommu/platform/68VZ328/config.c b/arch/m68knommu/platform/68VZ328/config.c index d926524cdf82..4058de5c8fa2 100644 --- a/arch/m68knommu/platform/68VZ328/config.c +++ b/arch/m68knommu/platform/68VZ328/config.c | |||
@@ -141,13 +141,13 @@ static void init_hardware(char *command, int size) | |||
141 | static void m68vz328_reset(void) | 141 | static void m68vz328_reset(void) |
142 | { | 142 | { |
143 | local_irq_disable(); | 143 | local_irq_disable(); |
144 | asm volatile (" | 144 | asm volatile ( |
145 | moveal #0x10c00000, %a0; | 145 | "moveal #0x10c00000, %a0;\n\t" |
146 | moveb #0, 0xFFFFF300; | 146 | "moveb #0, 0xFFFFF300;\n\t" |
147 | moveal 0(%a0), %sp; | 147 | "moveal 0(%a0), %sp;\n\t" |
148 | moveal 4(%a0), %a0; | 148 | "moveal 4(%a0), %a0;\n\t" |
149 | jmp (%a0); | 149 | "jmp (%a0);\n" |
150 | "); | 150 | ); |
151 | } | 151 | } |
152 | 152 | ||
153 | unsigned char *cs8900a_hwaddr; | 153 | unsigned char *cs8900a_hwaddr; |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 35e038a974c6..08c2ece4ae40 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -1618,6 +1618,11 @@ config GENERIC_IRQ_PROBE | |||
1618 | bool | 1618 | bool |
1619 | default y | 1619 | default y |
1620 | 1620 | ||
1621 | config IRQ_PER_CPU | ||
1622 | depends on SMP | ||
1623 | bool | ||
1624 | default y | ||
1625 | |||
1621 | # | 1626 | # |
1622 | # - Highmem only makes sense for the 32-bit kernel. | 1627 | # - Highmem only makes sense for the 32-bit kernel. |
1623 | # - The current highmem code will only work properly on physically indexed | 1628 | # - The current highmem code will only work properly on physically indexed |
diff --git a/arch/mips/au1000/common/irq.c b/arch/mips/au1000/common/irq.c index afe05ec12c27..da74ac21954b 100644 --- a/arch/mips/au1000/common/irq.c +++ b/arch/mips/au1000/common/irq.c | |||
@@ -333,31 +333,31 @@ static void setup_local_irq(unsigned int irq_nr, int type, int int_req) | |||
333 | au_writel(1<<(irq_nr-32), IC1_CFG2CLR); | 333 | au_writel(1<<(irq_nr-32), IC1_CFG2CLR); |
334 | au_writel(1<<(irq_nr-32), IC1_CFG1CLR); | 334 | au_writel(1<<(irq_nr-32), IC1_CFG1CLR); |
335 | au_writel(1<<(irq_nr-32), IC1_CFG0SET); | 335 | au_writel(1<<(irq_nr-32), IC1_CFG0SET); |
336 | irq_desc[irq_nr].handler = &rise_edge_irq_type; | 336 | irq_desc[irq_nr].chip = &rise_edge_irq_type; |
337 | break; | 337 | break; |
338 | case INTC_INT_FALL_EDGE: /* 0:1:0 */ | 338 | case INTC_INT_FALL_EDGE: /* 0:1:0 */ |
339 | au_writel(1<<(irq_nr-32), IC1_CFG2CLR); | 339 | au_writel(1<<(irq_nr-32), IC1_CFG2CLR); |
340 | au_writel(1<<(irq_nr-32), IC1_CFG1SET); | 340 | au_writel(1<<(irq_nr-32), IC1_CFG1SET); |
341 | au_writel(1<<(irq_nr-32), IC1_CFG0CLR); | 341 | au_writel(1<<(irq_nr-32), IC1_CFG0CLR); |
342 | irq_desc[irq_nr].handler = &fall_edge_irq_type; | 342 | irq_desc[irq_nr].chip = &fall_edge_irq_type; |
343 | break; | 343 | break; |
344 | case INTC_INT_RISE_AND_FALL_EDGE: /* 0:1:1 */ | 344 | case INTC_INT_RISE_AND_FALL_EDGE: /* 0:1:1 */ |
345 | au_writel(1<<(irq_nr-32), IC1_CFG2CLR); | 345 | au_writel(1<<(irq_nr-32), IC1_CFG2CLR); |
346 | au_writel(1<<(irq_nr-32), IC1_CFG1SET); | 346 | au_writel(1<<(irq_nr-32), IC1_CFG1SET); |
347 | au_writel(1<<(irq_nr-32), IC1_CFG0SET); | 347 | au_writel(1<<(irq_nr-32), IC1_CFG0SET); |
348 | irq_desc[irq_nr].handler = &either_edge_irq_type; | 348 | irq_desc[irq_nr].chip = &either_edge_irq_type; |
349 | break; | 349 | break; |
350 | case INTC_INT_HIGH_LEVEL: /* 1:0:1 */ | 350 | case INTC_INT_HIGH_LEVEL: /* 1:0:1 */ |
351 | au_writel(1<<(irq_nr-32), IC1_CFG2SET); | 351 | au_writel(1<<(irq_nr-32), IC1_CFG2SET); |
352 | au_writel(1<<(irq_nr-32), IC1_CFG1CLR); | 352 | au_writel(1<<(irq_nr-32), IC1_CFG1CLR); |
353 | au_writel(1<<(irq_nr-32), IC1_CFG0SET); | 353 | au_writel(1<<(irq_nr-32), IC1_CFG0SET); |
354 | irq_desc[irq_nr].handler = &level_irq_type; | 354 | irq_desc[irq_nr].chip = &level_irq_type; |
355 | break; | 355 | break; |
356 | case INTC_INT_LOW_LEVEL: /* 1:1:0 */ | 356 | case INTC_INT_LOW_LEVEL: /* 1:1:0 */ |
357 | au_writel(1<<(irq_nr-32), IC1_CFG2SET); | 357 | au_writel(1<<(irq_nr-32), IC1_CFG2SET); |
358 | au_writel(1<<(irq_nr-32), IC1_CFG1SET); | 358 | au_writel(1<<(irq_nr-32), IC1_CFG1SET); |
359 | au_writel(1<<(irq_nr-32), IC1_CFG0CLR); | 359 | au_writel(1<<(irq_nr-32), IC1_CFG0CLR); |
360 | irq_desc[irq_nr].handler = &level_irq_type; | 360 | irq_desc[irq_nr].chip = &level_irq_type; |
361 | break; | 361 | break; |
362 | case INTC_INT_DISABLED: /* 0:0:0 */ | 362 | case INTC_INT_DISABLED: /* 0:0:0 */ |
363 | au_writel(1<<(irq_nr-32), IC1_CFG0CLR); | 363 | au_writel(1<<(irq_nr-32), IC1_CFG0CLR); |
@@ -385,31 +385,31 @@ static void setup_local_irq(unsigned int irq_nr, int type, int int_req) | |||
385 | au_writel(1<<irq_nr, IC0_CFG2CLR); | 385 | au_writel(1<<irq_nr, IC0_CFG2CLR); |
386 | au_writel(1<<irq_nr, IC0_CFG1CLR); | 386 | au_writel(1<<irq_nr, IC0_CFG1CLR); |
387 | au_writel(1<<irq_nr, IC0_CFG0SET); | 387 | au_writel(1<<irq_nr, IC0_CFG0SET); |
388 | irq_desc[irq_nr].handler = &rise_edge_irq_type; | 388 | irq_desc[irq_nr].chip = &rise_edge_irq_type; |
389 | break; | 389 | break; |
390 | case INTC_INT_FALL_EDGE: /* 0:1:0 */ | 390 | case INTC_INT_FALL_EDGE: /* 0:1:0 */ |
391 | au_writel(1<<irq_nr, IC0_CFG2CLR); | 391 | au_writel(1<<irq_nr, IC0_CFG2CLR); |
392 | au_writel(1<<irq_nr, IC0_CFG1SET); | 392 | au_writel(1<<irq_nr, IC0_CFG1SET); |
393 | au_writel(1<<irq_nr, IC0_CFG0CLR); | 393 | au_writel(1<<irq_nr, IC0_CFG0CLR); |
394 | irq_desc[irq_nr].handler = &fall_edge_irq_type; | 394 | irq_desc[irq_nr].chip = &fall_edge_irq_type; |
395 | break; | 395 | break; |
396 | case INTC_INT_RISE_AND_FALL_EDGE: /* 0:1:1 */ | 396 | case INTC_INT_RISE_AND_FALL_EDGE: /* 0:1:1 */ |
397 | au_writel(1<<irq_nr, IC0_CFG2CLR); | 397 | au_writel(1<<irq_nr, IC0_CFG2CLR); |
398 | au_writel(1<<irq_nr, IC0_CFG1SET); | 398 | au_writel(1<<irq_nr, IC0_CFG1SET); |
399 | au_writel(1<<irq_nr, IC0_CFG0SET); | 399 | au_writel(1<<irq_nr, IC0_CFG0SET); |
400 | irq_desc[irq_nr].handler = &either_edge_irq_type; | 400 | irq_desc[irq_nr].chip = &either_edge_irq_type; |
401 | break; | 401 | break; |
402 | case INTC_INT_HIGH_LEVEL: /* 1:0:1 */ | 402 | case INTC_INT_HIGH_LEVEL: /* 1:0:1 */ |
403 | au_writel(1<<irq_nr, IC0_CFG2SET); | 403 | au_writel(1<<irq_nr, IC0_CFG2SET); |
404 | au_writel(1<<irq_nr, IC0_CFG1CLR); | 404 | au_writel(1<<irq_nr, IC0_CFG1CLR); |
405 | au_writel(1<<irq_nr, IC0_CFG0SET); | 405 | au_writel(1<<irq_nr, IC0_CFG0SET); |
406 | irq_desc[irq_nr].handler = &level_irq_type; | 406 | irq_desc[irq_nr].chip = &level_irq_type; |
407 | break; | 407 | break; |
408 | case INTC_INT_LOW_LEVEL: /* 1:1:0 */ | 408 | case INTC_INT_LOW_LEVEL: /* 1:1:0 */ |
409 | au_writel(1<<irq_nr, IC0_CFG2SET); | 409 | au_writel(1<<irq_nr, IC0_CFG2SET); |
410 | au_writel(1<<irq_nr, IC0_CFG1SET); | 410 | au_writel(1<<irq_nr, IC0_CFG1SET); |
411 | au_writel(1<<irq_nr, IC0_CFG0CLR); | 411 | au_writel(1<<irq_nr, IC0_CFG0CLR); |
412 | irq_desc[irq_nr].handler = &level_irq_type; | 412 | irq_desc[irq_nr].chip = &level_irq_type; |
413 | break; | 413 | break; |
414 | case INTC_INT_DISABLED: /* 0:0:0 */ | 414 | case INTC_INT_DISABLED: /* 0:0:0 */ |
415 | au_writel(1<<irq_nr, IC0_CFG0CLR); | 415 | au_writel(1<<irq_nr, IC0_CFG0CLR); |
diff --git a/arch/mips/au1000/pb1200/irqmap.c b/arch/mips/au1000/pb1200/irqmap.c index bacc0c6bfe67..5dd164fc1889 100644 --- a/arch/mips/au1000/pb1200/irqmap.c +++ b/arch/mips/au1000/pb1200/irqmap.c | |||
@@ -172,7 +172,7 @@ void _board_init_irq(void) | |||
172 | 172 | ||
173 | for (irq_nr = PB1200_INT_BEGIN; irq_nr <= PB1200_INT_END; irq_nr++) | 173 | for (irq_nr = PB1200_INT_BEGIN; irq_nr <= PB1200_INT_END; irq_nr++) |
174 | { | 174 | { |
175 | irq_desc[irq_nr].handler = &external_irq_type; | 175 | irq_desc[irq_nr].chip = &external_irq_type; |
176 | pb1200_disable_irq(irq_nr); | 176 | pb1200_disable_irq(irq_nr); |
177 | } | 177 | } |
178 | 178 | ||
diff --git a/arch/mips/ddb5xxx/ddb5477/irq_5477.c b/arch/mips/ddb5xxx/ddb5477/irq_5477.c index 5fcd5f070cdc..63c3d6534b3a 100644 --- a/arch/mips/ddb5xxx/ddb5477/irq_5477.c +++ b/arch/mips/ddb5xxx/ddb5477/irq_5477.c | |||
@@ -107,7 +107,7 @@ void __init vrc5477_irq_init(u32 irq_base) | |||
107 | irq_desc[i].status = IRQ_DISABLED; | 107 | irq_desc[i].status = IRQ_DISABLED; |
108 | irq_desc[i].action = NULL; | 108 | irq_desc[i].action = NULL; |
109 | irq_desc[i].depth = 1; | 109 | irq_desc[i].depth = 1; |
110 | irq_desc[i].handler = &vrc5477_irq_controller; | 110 | irq_desc[i].chip = &vrc5477_irq_controller; |
111 | } | 111 | } |
112 | 112 | ||
113 | vrc5477_irq_base = irq_base; | 113 | vrc5477_irq_base = irq_base; |
diff --git a/arch/mips/dec/ioasic-irq.c b/arch/mips/dec/ioasic-irq.c index d5bca5d233b6..da2dbb42f913 100644 --- a/arch/mips/dec/ioasic-irq.c +++ b/arch/mips/dec/ioasic-irq.c | |||
@@ -144,13 +144,13 @@ void __init init_ioasic_irqs(int base) | |||
144 | irq_desc[i].status = IRQ_DISABLED; | 144 | irq_desc[i].status = IRQ_DISABLED; |
145 | irq_desc[i].action = 0; | 145 | irq_desc[i].action = 0; |
146 | irq_desc[i].depth = 1; | 146 | irq_desc[i].depth = 1; |
147 | irq_desc[i].handler = &ioasic_irq_type; | 147 | irq_desc[i].chip = &ioasic_irq_type; |
148 | } | 148 | } |
149 | for (; i < base + IO_IRQ_LINES; i++) { | 149 | for (; i < base + IO_IRQ_LINES; i++) { |
150 | irq_desc[i].status = IRQ_DISABLED; | 150 | irq_desc[i].status = IRQ_DISABLED; |
151 | irq_desc[i].action = 0; | 151 | irq_desc[i].action = 0; |
152 | irq_desc[i].depth = 1; | 152 | irq_desc[i].depth = 1; |
153 | irq_desc[i].handler = &ioasic_dma_irq_type; | 153 | irq_desc[i].chip = &ioasic_dma_irq_type; |
154 | } | 154 | } |
155 | 155 | ||
156 | ioasic_irq_base = base; | 156 | ioasic_irq_base = base; |
diff --git a/arch/mips/dec/kn02-irq.c b/arch/mips/dec/kn02-irq.c index 898bed502a34..d44c00d9e80f 100644 --- a/arch/mips/dec/kn02-irq.c +++ b/arch/mips/dec/kn02-irq.c | |||
@@ -123,7 +123,7 @@ void __init init_kn02_irqs(int base) | |||
123 | irq_desc[i].status = IRQ_DISABLED; | 123 | irq_desc[i].status = IRQ_DISABLED; |
124 | irq_desc[i].action = 0; | 124 | irq_desc[i].action = 0; |
125 | irq_desc[i].depth = 1; | 125 | irq_desc[i].depth = 1; |
126 | irq_desc[i].handler = &kn02_irq_type; | 126 | irq_desc[i].chip = &kn02_irq_type; |
127 | } | 127 | } |
128 | 128 | ||
129 | kn02_irq_base = base; | 129 | kn02_irq_base = base; |
diff --git a/arch/mips/gt64120/ev64120/irq.c b/arch/mips/gt64120/ev64120/irq.c index 46c468b26b30..f489a8067a93 100644 --- a/arch/mips/gt64120/ev64120/irq.c +++ b/arch/mips/gt64120/ev64120/irq.c | |||
@@ -138,7 +138,7 @@ void __init arch_init_irq(void) | |||
138 | /* Let's initialize our IRQ descriptors */ | 138 | /* Let's initialize our IRQ descriptors */ |
139 | for (i = 0; i < NR_IRQS; i++) { | 139 | for (i = 0; i < NR_IRQS; i++) { |
140 | irq_desc[i].status = 0; | 140 | irq_desc[i].status = 0; |
141 | irq_desc[i].handler = &no_irq_type; | 141 | irq_desc[i].chip = &no_irq_type; |
142 | irq_desc[i].action = NULL; | 142 | irq_desc[i].action = NULL; |
143 | irq_desc[i].depth = 0; | 143 | irq_desc[i].depth = 0; |
144 | spin_lock_init(&irq_desc[i].lock); | 144 | spin_lock_init(&irq_desc[i].lock); |
diff --git a/arch/mips/ite-boards/generic/irq.c b/arch/mips/ite-boards/generic/irq.c index 77be7216bdd0..a6749c56fe38 100644 --- a/arch/mips/ite-boards/generic/irq.c +++ b/arch/mips/ite-boards/generic/irq.c | |||
@@ -208,10 +208,10 @@ void __init arch_init_irq(void) | |||
208 | #endif | 208 | #endif |
209 | 209 | ||
210 | for (i = 0; i <= IT8172_LAST_IRQ; i++) { | 210 | for (i = 0; i <= IT8172_LAST_IRQ; i++) { |
211 | irq_desc[i].handler = &it8172_irq_type; | 211 | irq_desc[i].chip = &it8172_irq_type; |
212 | spin_lock_init(&irq_desc[i].lock); | 212 | spin_lock_init(&irq_desc[i].lock); |
213 | } | 213 | } |
214 | irq_desc[MIPS_CPU_TIMER_IRQ].handler = &cp0_irq_type; | 214 | irq_desc[MIPS_CPU_TIMER_IRQ].chip = &cp0_irq_type; |
215 | set_c0_status(ALLINTS_NOTIMER); | 215 | set_c0_status(ALLINTS_NOTIMER); |
216 | } | 216 | } |
217 | 217 | ||
diff --git a/arch/mips/jazz/irq.c b/arch/mips/jazz/irq.c index becc9accd495..478be9858a1e 100644 --- a/arch/mips/jazz/irq.c +++ b/arch/mips/jazz/irq.c | |||
@@ -73,7 +73,7 @@ void __init init_r4030_ints(void) | |||
73 | irq_desc[i].status = IRQ_DISABLED; | 73 | irq_desc[i].status = IRQ_DISABLED; |
74 | irq_desc[i].action = 0; | 74 | irq_desc[i].action = 0; |
75 | irq_desc[i].depth = 1; | 75 | irq_desc[i].depth = 1; |
76 | irq_desc[i].handler = &r4030_irq_type; | 76 | irq_desc[i].chip = &r4030_irq_type; |
77 | } | 77 | } |
78 | 78 | ||
79 | r4030_write_reg16(JAZZ_IO_IRQ_ENABLE, 0); | 79 | r4030_write_reg16(JAZZ_IO_IRQ_ENABLE, 0); |
diff --git a/arch/mips/jmr3927/rbhma3100/irq.c b/arch/mips/jmr3927/rbhma3100/irq.c index 11304d1354f4..380046ea1db5 100644 --- a/arch/mips/jmr3927/rbhma3100/irq.c +++ b/arch/mips/jmr3927/rbhma3100/irq.c | |||
@@ -435,7 +435,7 @@ void jmr3927_irq_init(u32 irq_base) | |||
435 | irq_desc[i].status = IRQ_DISABLED; | 435 | irq_desc[i].status = IRQ_DISABLED; |
436 | irq_desc[i].action = NULL; | 436 | irq_desc[i].action = NULL; |
437 | irq_desc[i].depth = 1; | 437 | irq_desc[i].depth = 1; |
438 | irq_desc[i].handler = &jmr3927_irq_controller; | 438 | irq_desc[i].chip = &jmr3927_irq_controller; |
439 | } | 439 | } |
440 | 440 | ||
441 | jmr3927_irq_base = irq_base; | 441 | jmr3927_irq_base = irq_base; |
diff --git a/arch/mips/kernel/i8259.c b/arch/mips/kernel/i8259.c index 0cb8ed5662f3..91ffb1233cad 100644 --- a/arch/mips/kernel/i8259.c +++ b/arch/mips/kernel/i8259.c | |||
@@ -120,7 +120,7 @@ int i8259A_irq_pending(unsigned int irq) | |||
120 | void make_8259A_irq(unsigned int irq) | 120 | void make_8259A_irq(unsigned int irq) |
121 | { | 121 | { |
122 | disable_irq_nosync(irq); | 122 | disable_irq_nosync(irq); |
123 | irq_desc[irq].handler = &i8259A_irq_type; | 123 | irq_desc[irq].chip = &i8259A_irq_type; |
124 | enable_irq(irq); | 124 | enable_irq(irq); |
125 | } | 125 | } |
126 | 126 | ||
@@ -327,7 +327,7 @@ void __init init_i8259_irqs (void) | |||
327 | irq_desc[i].status = IRQ_DISABLED; | 327 | irq_desc[i].status = IRQ_DISABLED; |
328 | irq_desc[i].action = NULL; | 328 | irq_desc[i].action = NULL; |
329 | irq_desc[i].depth = 1; | 329 | irq_desc[i].depth = 1; |
330 | irq_desc[i].handler = &i8259A_irq_type; | 330 | irq_desc[i].chip = &i8259A_irq_type; |
331 | } | 331 | } |
332 | 332 | ||
333 | setup_irq(2, &irq2); | 333 | setup_irq(2, &irq2); |
diff --git a/arch/mips/kernel/irq-msc01.c b/arch/mips/kernel/irq-msc01.c index 97ebdc754b9e..f8cd1ac64d88 100644 --- a/arch/mips/kernel/irq-msc01.c +++ b/arch/mips/kernel/irq-msc01.c | |||
@@ -174,14 +174,14 @@ void __init init_msc_irqs(unsigned int base, msc_irqmap_t *imp, int nirq) | |||
174 | 174 | ||
175 | switch (imp->im_type) { | 175 | switch (imp->im_type) { |
176 | case MSC01_IRQ_EDGE: | 176 | case MSC01_IRQ_EDGE: |
177 | irq_desc[base+n].handler = &msc_edgeirq_type; | 177 | irq_desc[base+n].chip = &msc_edgeirq_type; |
178 | if (cpu_has_veic) | 178 | if (cpu_has_veic) |
179 | MSCIC_WRITE(MSC01_IC_SUP+n*8, MSC01_IC_SUP_EDGE_BIT); | 179 | MSCIC_WRITE(MSC01_IC_SUP+n*8, MSC01_IC_SUP_EDGE_BIT); |
180 | else | 180 | else |
181 | MSCIC_WRITE(MSC01_IC_SUP+n*8, MSC01_IC_SUP_EDGE_BIT | imp->im_lvl); | 181 | MSCIC_WRITE(MSC01_IC_SUP+n*8, MSC01_IC_SUP_EDGE_BIT | imp->im_lvl); |
182 | break; | 182 | break; |
183 | case MSC01_IRQ_LEVEL: | 183 | case MSC01_IRQ_LEVEL: |
184 | irq_desc[base+n].handler = &msc_levelirq_type; | 184 | irq_desc[base+n].chip = &msc_levelirq_type; |
185 | if (cpu_has_veic) | 185 | if (cpu_has_veic) |
186 | MSCIC_WRITE(MSC01_IC_SUP+n*8, 0); | 186 | MSCIC_WRITE(MSC01_IC_SUP+n*8, 0); |
187 | else | 187 | else |
diff --git a/arch/mips/kernel/irq-mv6434x.c b/arch/mips/kernel/irq-mv6434x.c index 0613f1f36b1b..f9c763a65547 100644 --- a/arch/mips/kernel/irq-mv6434x.c +++ b/arch/mips/kernel/irq-mv6434x.c | |||
@@ -155,7 +155,7 @@ void __init mv64340_irq_init(unsigned int base) | |||
155 | irq_desc[i].status = IRQ_DISABLED; | 155 | irq_desc[i].status = IRQ_DISABLED; |
156 | irq_desc[i].action = 0; | 156 | irq_desc[i].action = 0; |
157 | irq_desc[i].depth = 2; | 157 | irq_desc[i].depth = 2; |
158 | irq_desc[i].handler = &mv64340_irq_type; | 158 | irq_desc[i].chip = &mv64340_irq_type; |
159 | } | 159 | } |
160 | 160 | ||
161 | irq_base = base; | 161 | irq_base = base; |
diff --git a/arch/mips/kernel/irq-rm7000.c b/arch/mips/kernel/irq-rm7000.c index 0b130c5ac5d9..121da385a94d 100644 --- a/arch/mips/kernel/irq-rm7000.c +++ b/arch/mips/kernel/irq-rm7000.c | |||
@@ -91,7 +91,7 @@ void __init rm7k_cpu_irq_init(int base) | |||
91 | irq_desc[i].status = IRQ_DISABLED; | 91 | irq_desc[i].status = IRQ_DISABLED; |
92 | irq_desc[i].action = NULL; | 92 | irq_desc[i].action = NULL; |
93 | irq_desc[i].depth = 1; | 93 | irq_desc[i].depth = 1; |
94 | irq_desc[i].handler = &rm7k_irq_controller; | 94 | irq_desc[i].chip = &rm7k_irq_controller; |
95 | } | 95 | } |
96 | 96 | ||
97 | irq_base = base; | 97 | irq_base = base; |
diff --git a/arch/mips/kernel/irq-rm9000.c b/arch/mips/kernel/irq-rm9000.c index 9b5f20c32acb..25109c103e44 100644 --- a/arch/mips/kernel/irq-rm9000.c +++ b/arch/mips/kernel/irq-rm9000.c | |||
@@ -139,11 +139,11 @@ void __init rm9k_cpu_irq_init(int base) | |||
139 | irq_desc[i].status = IRQ_DISABLED; | 139 | irq_desc[i].status = IRQ_DISABLED; |
140 | irq_desc[i].action = NULL; | 140 | irq_desc[i].action = NULL; |
141 | irq_desc[i].depth = 1; | 141 | irq_desc[i].depth = 1; |
142 | irq_desc[i].handler = &rm9k_irq_controller; | 142 | irq_desc[i].chip = &rm9k_irq_controller; |
143 | } | 143 | } |
144 | 144 | ||
145 | rm9000_perfcount_irq = base + 1; | 145 | rm9000_perfcount_irq = base + 1; |
146 | irq_desc[rm9000_perfcount_irq].handler = &rm9k_perfcounter_irq; | 146 | irq_desc[rm9000_perfcount_irq].chip = &rm9k_perfcounter_irq; |
147 | 147 | ||
148 | irq_base = base; | 148 | irq_base = base; |
149 | } | 149 | } |
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c index 3dce742e716f..5c9dcd5eed59 100644 --- a/arch/mips/kernel/irq.c +++ b/arch/mips/kernel/irq.c | |||
@@ -95,7 +95,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
95 | for_each_online_cpu(j) | 95 | for_each_online_cpu(j) |
96 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 96 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
97 | #endif | 97 | #endif |
98 | seq_printf(p, " %14s", irq_desc[i].handler->typename); | 98 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
99 | seq_printf(p, " %s", action->name); | 99 | seq_printf(p, " %s", action->name); |
100 | 100 | ||
101 | for (action=action->next; action; action = action->next) | 101 | for (action=action->next; action; action = action->next) |
@@ -137,7 +137,7 @@ void __init init_IRQ(void) | |||
137 | irq_desc[i].status = IRQ_DISABLED; | 137 | irq_desc[i].status = IRQ_DISABLED; |
138 | irq_desc[i].action = NULL; | 138 | irq_desc[i].action = NULL; |
139 | irq_desc[i].depth = 1; | 139 | irq_desc[i].depth = 1; |
140 | irq_desc[i].handler = &no_irq_type; | 140 | irq_desc[i].chip = &no_irq_type; |
141 | spin_lock_init(&irq_desc[i].lock); | 141 | spin_lock_init(&irq_desc[i].lock); |
142 | #ifdef CONFIG_MIPS_MT_SMTC | 142 | #ifdef CONFIG_MIPS_MT_SMTC |
143 | irq_hwmask[i] = 0; | 143 | irq_hwmask[i] = 0; |
diff --git a/arch/mips/kernel/irq_cpu.c b/arch/mips/kernel/irq_cpu.c index 5db67e31ec1a..0e455a8ad860 100644 --- a/arch/mips/kernel/irq_cpu.c +++ b/arch/mips/kernel/irq_cpu.c | |||
@@ -167,14 +167,14 @@ void __init mips_cpu_irq_init(int irq_base) | |||
167 | irq_desc[i].status = IRQ_DISABLED; | 167 | irq_desc[i].status = IRQ_DISABLED; |
168 | irq_desc[i].action = NULL; | 168 | irq_desc[i].action = NULL; |
169 | irq_desc[i].depth = 1; | 169 | irq_desc[i].depth = 1; |
170 | irq_desc[i].handler = &mips_mt_cpu_irq_controller; | 170 | irq_desc[i].chip = &mips_mt_cpu_irq_controller; |
171 | } | 171 | } |
172 | 172 | ||
173 | for (i = irq_base + 2; i < irq_base + 8; i++) { | 173 | for (i = irq_base + 2; i < irq_base + 8; i++) { |
174 | irq_desc[i].status = IRQ_DISABLED; | 174 | irq_desc[i].status = IRQ_DISABLED; |
175 | irq_desc[i].action = NULL; | 175 | irq_desc[i].action = NULL; |
176 | irq_desc[i].depth = 1; | 176 | irq_desc[i].depth = 1; |
177 | irq_desc[i].handler = &mips_cpu_irq_controller; | 177 | irq_desc[i].chip = &mips_cpu_irq_controller; |
178 | } | 178 | } |
179 | 179 | ||
180 | mips_cpu_irq_base = irq_base; | 180 | mips_cpu_irq_base = irq_base; |
diff --git a/arch/mips/lasat/interrupt.c b/arch/mips/lasat/interrupt.c index 2d3472b21ebb..9316a024a818 100644 --- a/arch/mips/lasat/interrupt.c +++ b/arch/mips/lasat/interrupt.c | |||
@@ -156,6 +156,6 @@ void __init arch_init_irq(void) | |||
156 | irq_desc[i].status = IRQ_DISABLED; | 156 | irq_desc[i].status = IRQ_DISABLED; |
157 | irq_desc[i].action = 0; | 157 | irq_desc[i].action = 0; |
158 | irq_desc[i].depth = 1; | 158 | irq_desc[i].depth = 1; |
159 | irq_desc[i].handler = &lasat_irq_type; | 159 | irq_desc[i].chip = &lasat_irq_type; |
160 | } | 160 | } |
161 | } | 161 | } |
diff --git a/arch/mips/mips-boards/atlas/atlas_int.c b/arch/mips/mips-boards/atlas/atlas_int.c index db53950b7cfb..9dd6b8925581 100644 --- a/arch/mips/mips-boards/atlas/atlas_int.c +++ b/arch/mips/mips-boards/atlas/atlas_int.c | |||
@@ -215,7 +215,7 @@ void __init arch_init_irq(void) | |||
215 | irq_desc[i].status = IRQ_DISABLED; | 215 | irq_desc[i].status = IRQ_DISABLED; |
216 | irq_desc[i].action = 0; | 216 | irq_desc[i].action = 0; |
217 | irq_desc[i].depth = 1; | 217 | irq_desc[i].depth = 1; |
218 | irq_desc[i].handler = &atlas_irq_type; | 218 | irq_desc[i].chip = &atlas_irq_type; |
219 | spin_lock_init(&irq_desc[i].lock); | 219 | spin_lock_init(&irq_desc[i].lock); |
220 | } | 220 | } |
221 | } | 221 | } |
diff --git a/arch/mips/momentum/ocelot_c/cpci-irq.c b/arch/mips/momentum/ocelot_c/cpci-irq.c index bd885785e2f9..31d179c4673f 100644 --- a/arch/mips/momentum/ocelot_c/cpci-irq.c +++ b/arch/mips/momentum/ocelot_c/cpci-irq.c | |||
@@ -147,6 +147,6 @@ void cpci_irq_init(void) | |||
147 | irq_desc[i].status = IRQ_DISABLED; | 147 | irq_desc[i].status = IRQ_DISABLED; |
148 | irq_desc[i].action = 0; | 148 | irq_desc[i].action = 0; |
149 | irq_desc[i].depth = 2; | 149 | irq_desc[i].depth = 2; |
150 | irq_desc[i].handler = &cpci_irq_type; | 150 | irq_desc[i].chip = &cpci_irq_type; |
151 | } | 151 | } |
152 | } | 152 | } |
diff --git a/arch/mips/momentum/ocelot_c/uart-irq.c b/arch/mips/momentum/ocelot_c/uart-irq.c index 755bde5146be..852265026fd1 100644 --- a/arch/mips/momentum/ocelot_c/uart-irq.c +++ b/arch/mips/momentum/ocelot_c/uart-irq.c | |||
@@ -137,10 +137,10 @@ void uart_irq_init(void) | |||
137 | irq_desc[80].status = IRQ_DISABLED; | 137 | irq_desc[80].status = IRQ_DISABLED; |
138 | irq_desc[80].action = 0; | 138 | irq_desc[80].action = 0; |
139 | irq_desc[80].depth = 2; | 139 | irq_desc[80].depth = 2; |
140 | irq_desc[80].handler = &uart_irq_type; | 140 | irq_desc[80].chip = &uart_irq_type; |
141 | 141 | ||
142 | irq_desc[81].status = IRQ_DISABLED; | 142 | irq_desc[81].status = IRQ_DISABLED; |
143 | irq_desc[81].action = 0; | 143 | irq_desc[81].action = 0; |
144 | irq_desc[81].depth = 2; | 144 | irq_desc[81].depth = 2; |
145 | irq_desc[81].handler = &uart_irq_type; | 145 | irq_desc[81].chip = &uart_irq_type; |
146 | } | 146 | } |
diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c index 4dfce154d4af..ba66f8c9bd4e 100644 --- a/arch/mips/pci/pci.c +++ b/arch/mips/pci/pci.c | |||
@@ -51,11 +51,11 @@ unsigned long PCIBIOS_MIN_MEM = 0; | |||
51 | */ | 51 | */ |
52 | void | 52 | void |
53 | pcibios_align_resource(void *data, struct resource *res, | 53 | pcibios_align_resource(void *data, struct resource *res, |
54 | unsigned long size, unsigned long align) | 54 | resource_size_t size, resource_size_t align) |
55 | { | 55 | { |
56 | struct pci_dev *dev = data; | 56 | struct pci_dev *dev = data; |
57 | struct pci_controller *hose = dev->sysdata; | 57 | struct pci_controller *hose = dev->sysdata; |
58 | unsigned long start = res->start; | 58 | resource_size_t start = res->start; |
59 | 59 | ||
60 | if (res->flags & IORESOURCE_IO) { | 60 | if (res->flags & IORESOURCE_IO) { |
61 | /* Make sure we start at our min on all hoses */ | 61 | /* Make sure we start at our min on all hoses */ |
diff --git a/arch/mips/philips/pnx8550/common/int.c b/arch/mips/philips/pnx8550/common/int.c index 39ee6314f627..8f18764a2359 100644 --- a/arch/mips/philips/pnx8550/common/int.c +++ b/arch/mips/philips/pnx8550/common/int.c | |||
@@ -236,7 +236,7 @@ void __init arch_init_irq(void) | |||
236 | int configPR; | 236 | int configPR; |
237 | 237 | ||
238 | for (i = 0; i < PNX8550_INT_CP0_TOTINT; i++) { | 238 | for (i = 0; i < PNX8550_INT_CP0_TOTINT; i++) { |
239 | irq_desc[i].handler = &level_irq_type; | 239 | irq_desc[i].chip = &level_irq_type; |
240 | pnx8550_ack(i); /* mask the irq just in case */ | 240 | pnx8550_ack(i); /* mask the irq just in case */ |
241 | } | 241 | } |
242 | 242 | ||
@@ -273,7 +273,7 @@ void __init arch_init_irq(void) | |||
273 | /* mask/priority is still 0 so we will not get any | 273 | /* mask/priority is still 0 so we will not get any |
274 | * interrupts until it is unmasked */ | 274 | * interrupts until it is unmasked */ |
275 | 275 | ||
276 | irq_desc[i].handler = &level_irq_type; | 276 | irq_desc[i].chip = &level_irq_type; |
277 | } | 277 | } |
278 | 278 | ||
279 | /* Priority level 0 */ | 279 | /* Priority level 0 */ |
@@ -282,12 +282,12 @@ void __init arch_init_irq(void) | |||
282 | /* Set int vector table address */ | 282 | /* Set int vector table address */ |
283 | PNX8550_GIC_VECTOR_0 = PNX8550_GIC_VECTOR_1 = 0; | 283 | PNX8550_GIC_VECTOR_0 = PNX8550_GIC_VECTOR_1 = 0; |
284 | 284 | ||
285 | irq_desc[MIPS_CPU_GIC_IRQ].handler = &level_irq_type; | 285 | irq_desc[MIPS_CPU_GIC_IRQ].chip = &level_irq_type; |
286 | setup_irq(MIPS_CPU_GIC_IRQ, &gic_action); | 286 | setup_irq(MIPS_CPU_GIC_IRQ, &gic_action); |
287 | 287 | ||
288 | /* init of Timer interrupts */ | 288 | /* init of Timer interrupts */ |
289 | for (i = PNX8550_INT_TIMER_MIN; i <= PNX8550_INT_TIMER_MAX; i++) { | 289 | for (i = PNX8550_INT_TIMER_MIN; i <= PNX8550_INT_TIMER_MAX; i++) { |
290 | irq_desc[i].handler = &level_irq_type; | 290 | irq_desc[i].chip = &level_irq_type; |
291 | } | 291 | } |
292 | 292 | ||
293 | /* Stop Timer 1-3 */ | 293 | /* Stop Timer 1-3 */ |
@@ -295,7 +295,7 @@ void __init arch_init_irq(void) | |||
295 | configPR |= 0x00000038; | 295 | configPR |= 0x00000038; |
296 | write_c0_config7(configPR); | 296 | write_c0_config7(configPR); |
297 | 297 | ||
298 | irq_desc[MIPS_CPU_TIMER_IRQ].handler = &level_irq_type; | 298 | irq_desc[MIPS_CPU_TIMER_IRQ].chip = &level_irq_type; |
299 | setup_irq(MIPS_CPU_TIMER_IRQ, &timer_action); | 299 | setup_irq(MIPS_CPU_TIMER_IRQ, &timer_action); |
300 | } | 300 | } |
301 | 301 | ||
diff --git a/arch/mips/pmc-sierra/yosemite/ht.c b/arch/mips/pmc-sierra/yosemite/ht.c index 54b65a80abf5..fb523ebcafa8 100644 --- a/arch/mips/pmc-sierra/yosemite/ht.c +++ b/arch/mips/pmc-sierra/yosemite/ht.c | |||
@@ -383,12 +383,12 @@ void pcibios_update_resource(struct pci_dev *dev, struct resource *root, | |||
383 | 383 | ||
384 | 384 | ||
385 | void pcibios_align_resource(void *data, struct resource *res, | 385 | void pcibios_align_resource(void *data, struct resource *res, |
386 | unsigned long size, unsigned long align) | 386 | resource_size_t size, resource_size_t align) |
387 | { | 387 | { |
388 | struct pci_dev *dev = data; | 388 | struct pci_dev *dev = data; |
389 | 389 | ||
390 | if (res->flags & IORESOURCE_IO) { | 390 | if (res->flags & IORESOURCE_IO) { |
391 | unsigned long start = res->start; | 391 | resource_size_t start = res->start; |
392 | 392 | ||
393 | /* We need to avoid collisions with `mirrored' VGA ports | 393 | /* We need to avoid collisions with `mirrored' VGA ports |
394 | and other strange ISA hardware, so we always want the | 394 | and other strange ISA hardware, so we always want the |
diff --git a/arch/mips/sgi-ip22/ip22-eisa.c b/arch/mips/sgi-ip22/ip22-eisa.c index b19820110aa3..989167b49ce9 100644 --- a/arch/mips/sgi-ip22/ip22-eisa.c +++ b/arch/mips/sgi-ip22/ip22-eisa.c | |||
@@ -279,9 +279,9 @@ int __init ip22_eisa_init(void) | |||
279 | irq_desc[i].action = 0; | 279 | irq_desc[i].action = 0; |
280 | irq_desc[i].depth = 1; | 280 | irq_desc[i].depth = 1; |
281 | if (i < (SGINT_EISA + 8)) | 281 | if (i < (SGINT_EISA + 8)) |
282 | irq_desc[i].handler = &ip22_eisa1_irq_type; | 282 | irq_desc[i].chip = &ip22_eisa1_irq_type; |
283 | else | 283 | else |
284 | irq_desc[i].handler = &ip22_eisa2_irq_type; | 284 | irq_desc[i].chip = &ip22_eisa2_irq_type; |
285 | } | 285 | } |
286 | 286 | ||
287 | /* Cannot use request_irq because of kmalloc not being ready at such | 287 | /* Cannot use request_irq because of kmalloc not being ready at such |
diff --git a/arch/mips/sgi-ip22/ip22-int.c b/arch/mips/sgi-ip22/ip22-int.c index fc6a7e2b189c..18906af69691 100644 --- a/arch/mips/sgi-ip22/ip22-int.c +++ b/arch/mips/sgi-ip22/ip22-int.c | |||
@@ -436,7 +436,7 @@ void __init arch_init_irq(void) | |||
436 | irq_desc[i].status = IRQ_DISABLED; | 436 | irq_desc[i].status = IRQ_DISABLED; |
437 | irq_desc[i].action = 0; | 437 | irq_desc[i].action = 0; |
438 | irq_desc[i].depth = 1; | 438 | irq_desc[i].depth = 1; |
439 | irq_desc[i].handler = handler; | 439 | irq_desc[i].chip = handler; |
440 | } | 440 | } |
441 | 441 | ||
442 | /* vector handler. this register the IRQ as non-sharable */ | 442 | /* vector handler. this register the IRQ as non-sharable */ |
diff --git a/arch/mips/sgi-ip27/ip27-irq.c b/arch/mips/sgi-ip27/ip27-irq.c index 0b61a39ce2bb..869566c360ae 100644 --- a/arch/mips/sgi-ip27/ip27-irq.c +++ b/arch/mips/sgi-ip27/ip27-irq.c | |||
@@ -386,7 +386,7 @@ void __devinit register_bridge_irq(unsigned int irq) | |||
386 | irq_desc[irq].status = IRQ_DISABLED; | 386 | irq_desc[irq].status = IRQ_DISABLED; |
387 | irq_desc[irq].action = 0; | 387 | irq_desc[irq].action = 0; |
388 | irq_desc[irq].depth = 1; | 388 | irq_desc[irq].depth = 1; |
389 | irq_desc[irq].handler = &bridge_irq_type; | 389 | irq_desc[irq].chip = &bridge_irq_type; |
390 | } | 390 | } |
391 | 391 | ||
392 | int __devinit request_bridge_irq(struct bridge_controller *bc) | 392 | int __devinit request_bridge_irq(struct bridge_controller *bc) |
diff --git a/arch/mips/sgi-ip32/ip32-irq.c b/arch/mips/sgi-ip32/ip32-irq.c index 8ba08047d164..00b94aaf6371 100644 --- a/arch/mips/sgi-ip32/ip32-irq.c +++ b/arch/mips/sgi-ip32/ip32-irq.c | |||
@@ -591,7 +591,7 @@ void __init arch_init_irq(void) | |||
591 | irq_desc[irq].status = IRQ_DISABLED; | 591 | irq_desc[irq].status = IRQ_DISABLED; |
592 | irq_desc[irq].action = 0; | 592 | irq_desc[irq].action = 0; |
593 | irq_desc[irq].depth = 0; | 593 | irq_desc[irq].depth = 0; |
594 | irq_desc[irq].handler = controller; | 594 | irq_desc[irq].chip = controller; |
595 | } | 595 | } |
596 | setup_irq(CRIME_MEMERR_IRQ, &memerr_irq); | 596 | setup_irq(CRIME_MEMERR_IRQ, &memerr_irq); |
597 | setup_irq(CRIME_CPUERR_IRQ, &cpuerr_irq); | 597 | setup_irq(CRIME_CPUERR_IRQ, &cpuerr_irq); |
diff --git a/arch/mips/sibyte/bcm1480/irq.c b/arch/mips/sibyte/bcm1480/irq.c index e61760b14d99..610df40cb820 100644 --- a/arch/mips/sibyte/bcm1480/irq.c +++ b/arch/mips/sibyte/bcm1480/irq.c | |||
@@ -276,10 +276,10 @@ void __init init_bcm1480_irqs(void) | |||
276 | irq_desc[i].action = 0; | 276 | irq_desc[i].action = 0; |
277 | irq_desc[i].depth = 1; | 277 | irq_desc[i].depth = 1; |
278 | if (i < BCM1480_NR_IRQS) { | 278 | if (i < BCM1480_NR_IRQS) { |
279 | irq_desc[i].handler = &bcm1480_irq_type; | 279 | irq_desc[i].chip = &bcm1480_irq_type; |
280 | bcm1480_irq_owner[i] = 0; | 280 | bcm1480_irq_owner[i] = 0; |
281 | } else { | 281 | } else { |
282 | irq_desc[i].handler = &no_irq_type; | 282 | irq_desc[i].chip = &no_irq_type; |
283 | } | 283 | } |
284 | } | 284 | } |
285 | } | 285 | } |
diff --git a/arch/mips/sibyte/sb1250/irq.c b/arch/mips/sibyte/sb1250/irq.c index f853c32f60a0..fcc61940f1ff 100644 --- a/arch/mips/sibyte/sb1250/irq.c +++ b/arch/mips/sibyte/sb1250/irq.c | |||
@@ -246,10 +246,10 @@ void __init init_sb1250_irqs(void) | |||
246 | irq_desc[i].action = 0; | 246 | irq_desc[i].action = 0; |
247 | irq_desc[i].depth = 1; | 247 | irq_desc[i].depth = 1; |
248 | if (i < SB1250_NR_IRQS) { | 248 | if (i < SB1250_NR_IRQS) { |
249 | irq_desc[i].handler = &sb1250_irq_type; | 249 | irq_desc[i].chip = &sb1250_irq_type; |
250 | sb1250_irq_owner[i] = 0; | 250 | sb1250_irq_owner[i] = 0; |
251 | } else { | 251 | } else { |
252 | irq_desc[i].handler = &no_irq_type; | 252 | irq_desc[i].chip = &no_irq_type; |
253 | } | 253 | } |
254 | } | 254 | } |
255 | } | 255 | } |
diff --git a/arch/mips/sni/irq.c b/arch/mips/sni/irq.c index 7365b4853ddb..c19e158ec402 100644 --- a/arch/mips/sni/irq.c +++ b/arch/mips/sni/irq.c | |||
@@ -203,7 +203,7 @@ void __init arch_init_irq(void) | |||
203 | irq_desc[i].status = IRQ_DISABLED; | 203 | irq_desc[i].status = IRQ_DISABLED; |
204 | irq_desc[i].action = 0; | 204 | irq_desc[i].action = 0; |
205 | irq_desc[i].depth = 1; | 205 | irq_desc[i].depth = 1; |
206 | irq_desc[i].handler = &pciasic_irq_type; | 206 | irq_desc[i].chip = &pciasic_irq_type; |
207 | } | 207 | } |
208 | 208 | ||
209 | change_c0_status(ST0_IM, IE_IRQ1|IE_IRQ2|IE_IRQ3|IE_IRQ4); | 209 | change_c0_status(ST0_IM, IE_IRQ1|IE_IRQ2|IE_IRQ3|IE_IRQ4); |
diff --git a/arch/mips/tx4927/common/tx4927_irq.c b/arch/mips/tx4927/common/tx4927_irq.c index 8ca68015cf40..a42be00483e6 100644 --- a/arch/mips/tx4927/common/tx4927_irq.c +++ b/arch/mips/tx4927/common/tx4927_irq.c | |||
@@ -227,7 +227,7 @@ static void __init tx4927_irq_cp0_init(void) | |||
227 | irq_desc[i].status = IRQ_DISABLED; | 227 | irq_desc[i].status = IRQ_DISABLED; |
228 | irq_desc[i].action = 0; | 228 | irq_desc[i].action = 0; |
229 | irq_desc[i].depth = 1; | 229 | irq_desc[i].depth = 1; |
230 | irq_desc[i].handler = &tx4927_irq_cp0_type; | 230 | irq_desc[i].chip = &tx4927_irq_cp0_type; |
231 | } | 231 | } |
232 | 232 | ||
233 | return; | 233 | return; |
@@ -435,7 +435,7 @@ static void __init tx4927_irq_pic_init(void) | |||
435 | irq_desc[i].status = IRQ_DISABLED; | 435 | irq_desc[i].status = IRQ_DISABLED; |
436 | irq_desc[i].action = 0; | 436 | irq_desc[i].action = 0; |
437 | irq_desc[i].depth = 2; | 437 | irq_desc[i].depth = 2; |
438 | irq_desc[i].handler = &tx4927_irq_pic_type; | 438 | irq_desc[i].chip = &tx4927_irq_pic_type; |
439 | } | 439 | } |
440 | 440 | ||
441 | setup_irq(TX4927_IRQ_NEST_PIC_ON_CP0, &tx4927_irq_pic_action); | 441 | setup_irq(TX4927_IRQ_NEST_PIC_ON_CP0, &tx4927_irq_pic_action); |
diff --git a/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c b/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c index aee07ff2212a..c67978b6dae4 100644 --- a/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c +++ b/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c | |||
@@ -368,7 +368,7 @@ static void __init toshiba_rbtx4927_irq_ioc_init(void) | |||
368 | irq_desc[i].status = IRQ_DISABLED; | 368 | irq_desc[i].status = IRQ_DISABLED; |
369 | irq_desc[i].action = 0; | 369 | irq_desc[i].action = 0; |
370 | irq_desc[i].depth = 3; | 370 | irq_desc[i].depth = 3; |
371 | irq_desc[i].handler = &toshiba_rbtx4927_irq_ioc_type; | 371 | irq_desc[i].chip = &toshiba_rbtx4927_irq_ioc_type; |
372 | } | 372 | } |
373 | 373 | ||
374 | setup_irq(TOSHIBA_RBTX4927_IRQ_NEST_IOC_ON_PIC, | 374 | setup_irq(TOSHIBA_RBTX4927_IRQ_NEST_IOC_ON_PIC, |
@@ -526,7 +526,7 @@ static void __init toshiba_rbtx4927_irq_isa_init(void) | |||
526 | irq_desc[i].action = 0; | 526 | irq_desc[i].action = 0; |
527 | irq_desc[i].depth = | 527 | irq_desc[i].depth = |
528 | ((i < TOSHIBA_RBTX4927_IRQ_ISA_MID) ? (4) : (5)); | 528 | ((i < TOSHIBA_RBTX4927_IRQ_ISA_MID) ? (4) : (5)); |
529 | irq_desc[i].handler = &toshiba_rbtx4927_irq_isa_type; | 529 | irq_desc[i].chip = &toshiba_rbtx4927_irq_isa_type; |
530 | } | 530 | } |
531 | 531 | ||
532 | setup_irq(TOSHIBA_RBTX4927_IRQ_NEST_ISA_ON_IOC, | 532 | setup_irq(TOSHIBA_RBTX4927_IRQ_NEST_ISA_ON_IOC, |
@@ -692,13 +692,13 @@ void toshiba_rbtx4927_irq_dump(char *key) | |||
692 | { | 692 | { |
693 | u32 i, j = 0; | 693 | u32 i, j = 0; |
694 | for (i = 0; i < NR_IRQS; i++) { | 694 | for (i = 0; i < NR_IRQS; i++) { |
695 | if (strcmp(irq_desc[i].handler->typename, "none") | 695 | if (strcmp(irq_desc[i].chip->typename, "none") |
696 | == 0) | 696 | == 0) |
697 | continue; | 697 | continue; |
698 | 698 | ||
699 | if ((i >= 1) | 699 | if ((i >= 1) |
700 | && (irq_desc[i - 1].handler->typename == | 700 | && (irq_desc[i - 1].chip->typename == |
701 | irq_desc[i].handler->typename)) { | 701 | irq_desc[i].chip->typename)) { |
702 | j++; | 702 | j++; |
703 | } else { | 703 | } else { |
704 | j = 0; | 704 | j = 0; |
@@ -707,12 +707,12 @@ void toshiba_rbtx4927_irq_dump(char *key) | |||
707 | (TOSHIBA_RBTX4927_IRQ_INFO, | 707 | (TOSHIBA_RBTX4927_IRQ_INFO, |
708 | "%s irq=0x%02x/%3d s=0x%08x h=0x%08x a=0x%08x ah=0x%08x d=%1d n=%s/%02d\n", | 708 | "%s irq=0x%02x/%3d s=0x%08x h=0x%08x a=0x%08x ah=0x%08x d=%1d n=%s/%02d\n", |
709 | key, i, i, irq_desc[i].status, | 709 | key, i, i, irq_desc[i].status, |
710 | (u32) irq_desc[i].handler, | 710 | (u32) irq_desc[i].chip, |
711 | (u32) irq_desc[i].action, | 711 | (u32) irq_desc[i].action, |
712 | (u32) (irq_desc[i].action ? irq_desc[i]. | 712 | (u32) (irq_desc[i].action ? irq_desc[i]. |
713 | action->handler : 0), | 713 | action->handler : 0), |
714 | irq_desc[i].depth, | 714 | irq_desc[i].depth, |
715 | irq_desc[i].handler->typename, j); | 715 | irq_desc[i].chip->typename, j); |
716 | } | 716 | } |
717 | } | 717 | } |
718 | #endif | 718 | #endif |
diff --git a/arch/mips/tx4938/common/irq.c b/arch/mips/tx4938/common/irq.c index 873805178d8e..0b2f8c849218 100644 --- a/arch/mips/tx4938/common/irq.c +++ b/arch/mips/tx4938/common/irq.c | |||
@@ -102,7 +102,7 @@ tx4938_irq_cp0_init(void) | |||
102 | irq_desc[i].status = IRQ_DISABLED; | 102 | irq_desc[i].status = IRQ_DISABLED; |
103 | irq_desc[i].action = 0; | 103 | irq_desc[i].action = 0; |
104 | irq_desc[i].depth = 1; | 104 | irq_desc[i].depth = 1; |
105 | irq_desc[i].handler = &tx4938_irq_cp0_type; | 105 | irq_desc[i].chip = &tx4938_irq_cp0_type; |
106 | } | 106 | } |
107 | 107 | ||
108 | return; | 108 | return; |
@@ -306,7 +306,7 @@ tx4938_irq_pic_init(void) | |||
306 | irq_desc[i].status = IRQ_DISABLED; | 306 | irq_desc[i].status = IRQ_DISABLED; |
307 | irq_desc[i].action = 0; | 307 | irq_desc[i].action = 0; |
308 | irq_desc[i].depth = 2; | 308 | irq_desc[i].depth = 2; |
309 | irq_desc[i].handler = &tx4938_irq_pic_type; | 309 | irq_desc[i].chip = &tx4938_irq_pic_type; |
310 | } | 310 | } |
311 | 311 | ||
312 | setup_irq(TX4938_IRQ_NEST_PIC_ON_CP0, &tx4938_irq_pic_action); | 312 | setup_irq(TX4938_IRQ_NEST_PIC_ON_CP0, &tx4938_irq_pic_action); |
diff --git a/arch/mips/tx4938/toshiba_rbtx4938/irq.c b/arch/mips/tx4938/toshiba_rbtx4938/irq.c index 9cd9c0fe2265..3b8245dc5bd3 100644 --- a/arch/mips/tx4938/toshiba_rbtx4938/irq.c +++ b/arch/mips/tx4938/toshiba_rbtx4938/irq.c | |||
@@ -146,7 +146,7 @@ toshiba_rbtx4938_irq_ioc_init(void) | |||
146 | irq_desc[i].status = IRQ_DISABLED; | 146 | irq_desc[i].status = IRQ_DISABLED; |
147 | irq_desc[i].action = 0; | 147 | irq_desc[i].action = 0; |
148 | irq_desc[i].depth = 3; | 148 | irq_desc[i].depth = 3; |
149 | irq_desc[i].handler = &toshiba_rbtx4938_irq_ioc_type; | 149 | irq_desc[i].chip = &toshiba_rbtx4938_irq_ioc_type; |
150 | } | 150 | } |
151 | 151 | ||
152 | setup_irq(RBTX4938_IRQ_IOCINT, | 152 | setup_irq(RBTX4938_IRQ_IOCINT, |
diff --git a/arch/mips/vr41xx/common/icu.c b/arch/mips/vr41xx/common/icu.c index 07ae19cf0c29..b9323302cc4e 100644 --- a/arch/mips/vr41xx/common/icu.c +++ b/arch/mips/vr41xx/common/icu.c | |||
@@ -722,10 +722,10 @@ static int __init vr41xx_icu_init(void) | |||
722 | icu2_write(MGIUINTHREG, 0xffff); | 722 | icu2_write(MGIUINTHREG, 0xffff); |
723 | 723 | ||
724 | for (i = SYSINT1_IRQ_BASE; i <= SYSINT1_IRQ_LAST; i++) | 724 | for (i = SYSINT1_IRQ_BASE; i <= SYSINT1_IRQ_LAST; i++) |
725 | irq_desc[i].handler = &sysint1_irq_type; | 725 | irq_desc[i].chip = &sysint1_irq_type; |
726 | 726 | ||
727 | for (i = SYSINT2_IRQ_BASE; i <= SYSINT2_IRQ_LAST; i++) | 727 | for (i = SYSINT2_IRQ_BASE; i <= SYSINT2_IRQ_LAST; i++) |
728 | irq_desc[i].handler = &sysint2_irq_type; | 728 | irq_desc[i].chip = &sysint2_irq_type; |
729 | 729 | ||
730 | cascade_irq(INT0_IRQ, icu_get_irq); | 730 | cascade_irq(INT0_IRQ, icu_get_irq); |
731 | cascade_irq(INT1_IRQ, icu_get_irq); | 731 | cascade_irq(INT1_IRQ, icu_get_irq); |
diff --git a/arch/mips/vr41xx/common/irq.c b/arch/mips/vr41xx/common/irq.c index 86796bb63c3c..66aa50802deb 100644 --- a/arch/mips/vr41xx/common/irq.c +++ b/arch/mips/vr41xx/common/irq.c | |||
@@ -73,13 +73,13 @@ static void irq_dispatch(unsigned int irq, struct pt_regs *regs) | |||
73 | if (cascade->get_irq != NULL) { | 73 | if (cascade->get_irq != NULL) { |
74 | unsigned int source_irq = irq; | 74 | unsigned int source_irq = irq; |
75 | desc = irq_desc + source_irq; | 75 | desc = irq_desc + source_irq; |
76 | desc->handler->ack(source_irq); | 76 | desc->chip->ack(source_irq); |
77 | irq = cascade->get_irq(irq, regs); | 77 | irq = cascade->get_irq(irq, regs); |
78 | if (irq < 0) | 78 | if (irq < 0) |
79 | atomic_inc(&irq_err_count); | 79 | atomic_inc(&irq_err_count); |
80 | else | 80 | else |
81 | irq_dispatch(irq, regs); | 81 | irq_dispatch(irq, regs); |
82 | desc->handler->end(source_irq); | 82 | desc->chip->end(source_irq); |
83 | } else | 83 | } else |
84 | do_IRQ(irq, regs); | 84 | do_IRQ(irq, regs); |
85 | } | 85 | } |
diff --git a/arch/mips/vr41xx/common/vrc4173.c b/arch/mips/vr41xx/common/vrc4173.c index 3e31f8193d21..2d287b8893d9 100644 --- a/arch/mips/vr41xx/common/vrc4173.c +++ b/arch/mips/vr41xx/common/vrc4173.c | |||
@@ -483,7 +483,7 @@ static inline int vrc4173_icu_init(int cascade_irq) | |||
483 | vr41xx_set_irq_level(GIU_IRQ_TO_PIN(cascade_irq), LEVEL_LOW); | 483 | vr41xx_set_irq_level(GIU_IRQ_TO_PIN(cascade_irq), LEVEL_LOW); |
484 | 484 | ||
485 | for (i = VRC4173_IRQ_BASE; i <= VRC4173_IRQ_LAST; i++) | 485 | for (i = VRC4173_IRQ_BASE; i <= VRC4173_IRQ_LAST; i++) |
486 | irq_desc[i].handler = &vrc4173_irq_type; | 486 | irq_desc[i].chip = &vrc4173_irq_type; |
487 | 487 | ||
488 | return 0; | 488 | return 0; |
489 | } | 489 | } |
diff --git a/arch/mips/vr41xx/nec-cmbvr4133/irq.c b/arch/mips/vr41xx/nec-cmbvr4133/irq.c index 31db6b61a39e..7b2511ca0a61 100644 --- a/arch/mips/vr41xx/nec-cmbvr4133/irq.c +++ b/arch/mips/vr41xx/nec-cmbvr4133/irq.c | |||
@@ -104,7 +104,7 @@ void __init rockhopper_init_irq(void) | |||
104 | } | 104 | } |
105 | 105 | ||
106 | for (i = I8259_IRQ_BASE; i <= I8259_IRQ_LAST; i++) | 106 | for (i = I8259_IRQ_BASE; i <= I8259_IRQ_LAST; i++) |
107 | irq_desc[i].handler = &i8259_irq_type; | 107 | irq_desc[i].chip = &i8259_irq_type; |
108 | 108 | ||
109 | setup_irq(I8259_SLAVE_IRQ, &i8259_slave_cascade); | 109 | setup_irq(I8259_SLAVE_IRQ, &i8259_slave_cascade); |
110 | 110 | ||
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 910fb3afc0b5..6dd0ea8f88e0 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig | |||
@@ -51,6 +51,10 @@ config GENERIC_HARDIRQS | |||
51 | config GENERIC_IRQ_PROBE | 51 | config GENERIC_IRQ_PROBE |
52 | def_bool y | 52 | def_bool y |
53 | 53 | ||
54 | config IRQ_PER_CPU | ||
55 | bool | ||
56 | default y | ||
57 | |||
54 | # unless you want to implement ACPI on PA-RISC ... ;-) | 58 | # unless you want to implement ACPI on PA-RISC ... ;-) |
55 | config PM | 59 | config PM |
56 | bool | 60 | bool |
diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index c057ad7605ba..bc7c4a4e26a1 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c | |||
@@ -97,15 +97,17 @@ update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) | |||
97 | void | 97 | void |
98 | show_cache_info(struct seq_file *m) | 98 | show_cache_info(struct seq_file *m) |
99 | { | 99 | { |
100 | char buf[32]; | ||
101 | |||
100 | seq_printf(m, "I-cache\t\t: %ld KB\n", | 102 | seq_printf(m, "I-cache\t\t: %ld KB\n", |
101 | cache_info.ic_size/1024 ); | 103 | cache_info.ic_size/1024 ); |
102 | seq_printf(m, "D-cache\t\t: %ld KB (%s%s, %d-way associative)\n", | 104 | if (cache_info.dc_loop == 1) |
105 | snprintf(buf, 32, "%lu-way associative", cache_info.dc_loop); | ||
106 | seq_printf(m, "D-cache\t\t: %ld KB (%s%s, %s)\n", | ||
103 | cache_info.dc_size/1024, | 107 | cache_info.dc_size/1024, |
104 | (cache_info.dc_conf.cc_wt ? "WT":"WB"), | 108 | (cache_info.dc_conf.cc_wt ? "WT":"WB"), |
105 | (cache_info.dc_conf.cc_sh ? ", shared I/D":""), | 109 | (cache_info.dc_conf.cc_sh ? ", shared I/D":""), |
106 | (cache_info.dc_conf.cc_assoc) | 110 | ((cache_info.dc_loop == 1) ? "direct mapped" : buf)); |
107 | ); | ||
108 | |||
109 | seq_printf(m, "ITLB entries\t: %ld\n" "DTLB entries\t: %ld%s\n", | 111 | seq_printf(m, "ITLB entries\t: %ld\n" "DTLB entries\t: %ld%s\n", |
110 | cache_info.it_size, | 112 | cache_info.it_size, |
111 | cache_info.dt_size, | 113 | cache_info.dt_size, |
@@ -158,11 +160,11 @@ parisc_cache_init(void) | |||
158 | cache_info.dc_conf.cc_block, | 160 | cache_info.dc_conf.cc_block, |
159 | cache_info.dc_conf.cc_line, | 161 | cache_info.dc_conf.cc_line, |
160 | cache_info.dc_conf.cc_shift); | 162 | cache_info.dc_conf.cc_shift); |
161 | printk(" wt %d sh %d cst %d assoc %d\n", | 163 | printk(" wt %d sh %d cst %d hv %d\n", |
162 | cache_info.dc_conf.cc_wt, | 164 | cache_info.dc_conf.cc_wt, |
163 | cache_info.dc_conf.cc_sh, | 165 | cache_info.dc_conf.cc_sh, |
164 | cache_info.dc_conf.cc_cst, | 166 | cache_info.dc_conf.cc_cst, |
165 | cache_info.dc_conf.cc_assoc); | 167 | cache_info.dc_conf.cc_hv); |
166 | 168 | ||
167 | printk("IC base 0x%lx stride 0x%lx count 0x%lx loop 0x%lx\n", | 169 | printk("IC base 0x%lx stride 0x%lx count 0x%lx loop 0x%lx\n", |
168 | cache_info.ic_base, | 170 | cache_info.ic_base, |
@@ -176,11 +178,11 @@ parisc_cache_init(void) | |||
176 | cache_info.ic_conf.cc_block, | 178 | cache_info.ic_conf.cc_block, |
177 | cache_info.ic_conf.cc_line, | 179 | cache_info.ic_conf.cc_line, |
178 | cache_info.ic_conf.cc_shift); | 180 | cache_info.ic_conf.cc_shift); |
179 | printk(" wt %d sh %d cst %d assoc %d\n", | 181 | printk(" wt %d sh %d cst %d hv %d\n", |
180 | cache_info.ic_conf.cc_wt, | 182 | cache_info.ic_conf.cc_wt, |
181 | cache_info.ic_conf.cc_sh, | 183 | cache_info.ic_conf.cc_sh, |
182 | cache_info.ic_conf.cc_cst, | 184 | cache_info.ic_conf.cc_cst, |
183 | cache_info.ic_conf.cc_assoc); | 185 | cache_info.ic_conf.cc_hv); |
184 | 186 | ||
185 | printk("D-TLB conf: sh %d page %d cst %d aid %d pad1 %d \n", | 187 | printk("D-TLB conf: sh %d page %d cst %d aid %d pad1 %d \n", |
186 | cache_info.dt_conf.tc_sh, | 188 | cache_info.dt_conf.tc_sh, |
@@ -234,7 +236,8 @@ parisc_cache_init(void) | |||
234 | 236 | ||
235 | void disable_sr_hashing(void) | 237 | void disable_sr_hashing(void) |
236 | { | 238 | { |
237 | int srhash_type; | 239 | int srhash_type, retval; |
240 | unsigned long space_bits; | ||
238 | 241 | ||
239 | switch (boot_cpu_data.cpu_type) { | 242 | switch (boot_cpu_data.cpu_type) { |
240 | case pcx: /* We shouldn't get this far. setup.c should prevent it. */ | 243 | case pcx: /* We shouldn't get this far. setup.c should prevent it. */ |
@@ -260,6 +263,13 @@ void disable_sr_hashing(void) | |||
260 | } | 263 | } |
261 | 264 | ||
262 | disable_sr_hashing_asm(srhash_type); | 265 | disable_sr_hashing_asm(srhash_type); |
266 | |||
267 | retval = pdc_spaceid_bits(&space_bits); | ||
268 | /* If this procedure isn't implemented, don't panic. */ | ||
269 | if (retval < 0 && retval != PDC_BAD_OPTION) | ||
270 | panic("pdc_spaceid_bits call failed.\n"); | ||
271 | if (space_bits != 0) | ||
272 | panic("SpaceID hashing is still on!\n"); | ||
263 | } | 273 | } |
264 | 274 | ||
265 | void flush_dcache_page(struct page *page) | 275 | void flush_dcache_page(struct page *page) |
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index d9e53cf0372b..630730c32a5a 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
@@ -1638,7 +1638,7 @@ dbit_trap_20w: | |||
1638 | load32 PA(pa_dbit_lock),t0 | 1638 | load32 PA(pa_dbit_lock),t0 |
1639 | 1639 | ||
1640 | dbit_spin_20w: | 1640 | dbit_spin_20w: |
1641 | ldcw 0(t0),t1 | 1641 | LDCW 0(t0),t1 |
1642 | cmpib,= 0,t1,dbit_spin_20w | 1642 | cmpib,= 0,t1,dbit_spin_20w |
1643 | nop | 1643 | nop |
1644 | 1644 | ||
@@ -1674,7 +1674,7 @@ dbit_trap_11: | |||
1674 | load32 PA(pa_dbit_lock),t0 | 1674 | load32 PA(pa_dbit_lock),t0 |
1675 | 1675 | ||
1676 | dbit_spin_11: | 1676 | dbit_spin_11: |
1677 | ldcw 0(t0),t1 | 1677 | LDCW 0(t0),t1 |
1678 | cmpib,= 0,t1,dbit_spin_11 | 1678 | cmpib,= 0,t1,dbit_spin_11 |
1679 | nop | 1679 | nop |
1680 | 1680 | ||
@@ -1714,7 +1714,7 @@ dbit_trap_20: | |||
1714 | load32 PA(pa_dbit_lock),t0 | 1714 | load32 PA(pa_dbit_lock),t0 |
1715 | 1715 | ||
1716 | dbit_spin_20: | 1716 | dbit_spin_20: |
1717 | ldcw 0(t0),t1 | 1717 | LDCW 0(t0),t1 |
1718 | cmpib,= 0,t1,dbit_spin_20 | 1718 | cmpib,= 0,t1,dbit_spin_20 |
1719 | nop | 1719 | nop |
1720 | 1720 | ||
diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index 2dc06b8e1817..4398d2a95789 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c | |||
@@ -11,7 +11,7 @@ | |||
11 | * Copyright 1999 The Puffin Group, (Alex deVries, David Kennedy) | 11 | * Copyright 1999 The Puffin Group, (Alex deVries, David Kennedy) |
12 | * Copyright 2003 Grant Grundler <grundler parisc-linux org> | 12 | * Copyright 2003 Grant Grundler <grundler parisc-linux org> |
13 | * Copyright 2003,2004 Ryan Bradetich <rbrad@parisc-linux.org> | 13 | * Copyright 2003,2004 Ryan Bradetich <rbrad@parisc-linux.org> |
14 | * Copyright 2004 Thibaut VARENE <varenet@parisc-linux.org> | 14 | * Copyright 2004,2006 Thibaut VARENE <varenet@parisc-linux.org> |
15 | * | 15 | * |
16 | * This program is free software; you can redistribute it and/or modify | 16 | * This program is free software; you can redistribute it and/or modify |
17 | * it under the terms of the GNU General Public License as published by | 17 | * it under the terms of the GNU General Public License as published by |
@@ -252,10 +252,8 @@ int pdc_pat_chassis_send_log(unsigned long state, unsigned long data) | |||
252 | #endif | 252 | #endif |
253 | 253 | ||
254 | /** | 254 | /** |
255 | * pdc_chassis_disp - Updates display | 255 | * pdc_chassis_disp - Updates chassis code |
256 | * @retval: -1 on error, 0 on success | 256 | * @retval: -1 on error, 0 on success |
257 | * | ||
258 | * Works on old PDC only (E class, others?) | ||
259 | */ | 257 | */ |
260 | int pdc_chassis_disp(unsigned long disp) | 258 | int pdc_chassis_disp(unsigned long disp) |
261 | { | 259 | { |
@@ -269,6 +267,22 @@ int pdc_chassis_disp(unsigned long disp) | |||
269 | } | 267 | } |
270 | 268 | ||
271 | /** | 269 | /** |
270 | * pdc_chassis_warn - Fetches chassis warnings | ||
271 | * @retval: -1 on error, 0 on success | ||
272 | */ | ||
273 | int pdc_chassis_warn(unsigned long *warn) | ||
274 | { | ||
275 | int retval = 0; | ||
276 | |||
277 | spin_lock_irq(&pdc_lock); | ||
278 | retval = mem_pdc_call(PDC_CHASSIS, PDC_CHASSIS_WARN, __pa(pdc_result)); | ||
279 | *warn = pdc_result[0]; | ||
280 | spin_unlock_irq(&pdc_lock); | ||
281 | |||
282 | return retval; | ||
283 | } | ||
284 | |||
285 | /** | ||
272 | * pdc_coproc_cfg - To identify coprocessors attached to the processor. | 286 | * pdc_coproc_cfg - To identify coprocessors attached to the processor. |
273 | * @pdc_coproc_info: Return buffer address. | 287 | * @pdc_coproc_info: Return buffer address. |
274 | * | 288 | * |
@@ -393,7 +407,9 @@ int pdc_model_info(struct pdc_model *model) | |||
393 | * pdc_model_sysmodel - Get the system model name. | 407 | * pdc_model_sysmodel - Get the system model name. |
394 | * @name: A char array of at least 81 characters. | 408 | * @name: A char array of at least 81 characters. |
395 | * | 409 | * |
396 | * Get system model name from PDC ROM (e.g. 9000/715 or 9000/778/B160L) | 410 | * Get system model name from PDC ROM (e.g. 9000/715 or 9000/778/B160L). |
411 | * Using OS_ID_HPUX will return the equivalent of the 'modelname' command | ||
412 | * on HP/UX. | ||
397 | */ | 413 | */ |
398 | int pdc_model_sysmodel(char *name) | 414 | int pdc_model_sysmodel(char *name) |
399 | { | 415 | { |
@@ -498,6 +514,26 @@ int pdc_cache_info(struct pdc_cache_info *cache_info) | |||
498 | return retval; | 514 | return retval; |
499 | } | 515 | } |
500 | 516 | ||
517 | /** | ||
518 | * pdc_spaceid_bits - Return whether Space ID hashing is turned on. | ||
519 | * @space_bits: Should be 0, if not, bad mojo! | ||
520 | * | ||
521 | * Returns information about Space ID hashing. | ||
522 | */ | ||
523 | int pdc_spaceid_bits(unsigned long *space_bits) | ||
524 | { | ||
525 | int retval; | ||
526 | |||
527 | spin_lock_irq(&pdc_lock); | ||
528 | pdc_result[0] = 0; | ||
529 | retval = mem_pdc_call(PDC_CACHE, PDC_CACHE_RET_SPID, __pa(pdc_result), 0); | ||
530 | convert_to_wide(pdc_result); | ||
531 | *space_bits = pdc_result[0]; | ||
532 | spin_unlock_irq(&pdc_lock); | ||
533 | |||
534 | return retval; | ||
535 | } | ||
536 | |||
501 | #ifndef CONFIG_PA20 | 537 | #ifndef CONFIG_PA20 |
502 | /** | 538 | /** |
503 | * pdc_btlb_info - Return block TLB information. | 539 | * pdc_btlb_info - Return block TLB information. |
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index 197936d9359a..82fe6ba29727 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
@@ -94,7 +94,7 @@ int cpu_check_affinity(unsigned int irq, cpumask_t *dest) | |||
94 | if (irq == TIMER_IRQ || irq == IPI_IRQ) { | 94 | if (irq == TIMER_IRQ || irq == IPI_IRQ) { |
95 | /* Bad linux design decision. The mask has already | 95 | /* Bad linux design decision. The mask has already |
96 | * been set; we must reset it */ | 96 | * been set; we must reset it */ |
97 | irq_affinity[irq] = CPU_MASK_ALL; | 97 | irq_desc[irq].affinity = CPU_MASK_ALL; |
98 | return -EINVAL; | 98 | return -EINVAL; |
99 | } | 99 | } |
100 | 100 | ||
@@ -110,7 +110,7 @@ static void cpu_set_affinity_irq(unsigned int irq, cpumask_t dest) | |||
110 | if (cpu_check_affinity(irq, &dest)) | 110 | if (cpu_check_affinity(irq, &dest)) |
111 | return; | 111 | return; |
112 | 112 | ||
113 | irq_affinity[irq] = dest; | 113 | irq_desc[irq].affinity = dest; |
114 | } | 114 | } |
115 | #endif | 115 | #endif |
116 | 116 | ||
@@ -125,6 +125,10 @@ static struct hw_interrupt_type cpu_interrupt_type = { | |||
125 | #ifdef CONFIG_SMP | 125 | #ifdef CONFIG_SMP |
126 | .set_affinity = cpu_set_affinity_irq, | 126 | .set_affinity = cpu_set_affinity_irq, |
127 | #endif | 127 | #endif |
128 | /* XXX: Needs to be written. We managed without it so far, but | ||
129 | * we really ought to write it. | ||
130 | */ | ||
131 | .retrigger = NULL, | ||
128 | }; | 132 | }; |
129 | 133 | ||
130 | int show_interrupts(struct seq_file *p, void *v) | 134 | int show_interrupts(struct seq_file *p, void *v) |
@@ -158,7 +162,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
158 | seq_printf(p, "%10u ", kstat_irqs(i)); | 162 | seq_printf(p, "%10u ", kstat_irqs(i)); |
159 | #endif | 163 | #endif |
160 | 164 | ||
161 | seq_printf(p, " %14s", irq_desc[i].handler->typename); | 165 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
162 | #ifndef PARISC_IRQ_CR16_COUNTS | 166 | #ifndef PARISC_IRQ_CR16_COUNTS |
163 | seq_printf(p, " %s", action->name); | 167 | seq_printf(p, " %s", action->name); |
164 | 168 | ||
@@ -210,12 +214,12 @@ int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *type, void *data) | |||
210 | { | 214 | { |
211 | if (irq_desc[irq].action) | 215 | if (irq_desc[irq].action) |
212 | return -EBUSY; | 216 | return -EBUSY; |
213 | if (irq_desc[irq].handler != &cpu_interrupt_type) | 217 | if (irq_desc[irq].chip != &cpu_interrupt_type) |
214 | return -EBUSY; | 218 | return -EBUSY; |
215 | 219 | ||
216 | if (type) { | 220 | if (type) { |
217 | irq_desc[irq].handler = type; | 221 | irq_desc[irq].chip = type; |
218 | irq_desc[irq].handler_data = data; | 222 | irq_desc[irq].chip_data = data; |
219 | cpu_interrupt_type.enable(irq); | 223 | cpu_interrupt_type.enable(irq); |
220 | } | 224 | } |
221 | return 0; | 225 | return 0; |
@@ -265,7 +269,7 @@ int txn_alloc_irq(unsigned int bits_wide) | |||
265 | unsigned long txn_affinity_addr(unsigned int irq, int cpu) | 269 | unsigned long txn_affinity_addr(unsigned int irq, int cpu) |
266 | { | 270 | { |
267 | #ifdef CONFIG_SMP | 271 | #ifdef CONFIG_SMP |
268 | irq_affinity[irq] = cpumask_of_cpu(cpu); | 272 | irq_desc[irq].affinity = cpumask_of_cpu(cpu); |
269 | #endif | 273 | #endif |
270 | 274 | ||
271 | return cpu_data[cpu].txn_addr; | 275 | return cpu_data[cpu].txn_addr; |
@@ -326,7 +330,7 @@ void do_cpu_irq_mask(struct pt_regs *regs) | |||
326 | /* Work our way from MSb to LSb...same order we alloc EIRs */ | 330 | /* Work our way from MSb to LSb...same order we alloc EIRs */ |
327 | for (irq = TIMER_IRQ; eirr_val && bit; bit>>=1, irq++) { | 331 | for (irq = TIMER_IRQ; eirr_val && bit; bit>>=1, irq++) { |
328 | #ifdef CONFIG_SMP | 332 | #ifdef CONFIG_SMP |
329 | cpumask_t dest = irq_affinity[irq]; | 333 | cpumask_t dest = irq_desc[irq].affinity; |
330 | #endif | 334 | #endif |
331 | if (!(bit & eirr_val)) | 335 | if (!(bit & eirr_val)) |
332 | continue; | 336 | continue; |
@@ -378,7 +382,7 @@ static void claim_cpu_irqs(void) | |||
378 | { | 382 | { |
379 | int i; | 383 | int i; |
380 | for (i = CPU_IRQ_BASE; i <= CPU_IRQ_MAX; i++) { | 384 | for (i = CPU_IRQ_BASE; i <= CPU_IRQ_MAX; i++) { |
381 | irq_desc[i].handler = &cpu_interrupt_type; | 385 | irq_desc[i].chip = &cpu_interrupt_type; |
382 | } | 386 | } |
383 | 387 | ||
384 | irq_desc[TIMER_IRQ].action = &timer_action; | 388 | irq_desc[TIMER_IRQ].action = &timer_action; |
@@ -404,13 +408,6 @@ void __init init_IRQ(void) | |||
404 | 408 | ||
405 | } | 409 | } |
406 | 410 | ||
407 | void hw_resend_irq(struct hw_interrupt_type *type, unsigned int irq) | ||
408 | { | ||
409 | /* XXX: Needs to be written. We managed without it so far, but | ||
410 | * we really ought to write it. | ||
411 | */ | ||
412 | } | ||
413 | |||
414 | void ack_bad_irq(unsigned int irq) | 411 | void ack_bad_irq(unsigned int irq) |
415 | { | 412 | { |
416 | printk("unexpected IRQ %d\n", irq); | 413 | printk("unexpected IRQ %d\n", irq); |
diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c index f27cfe4771b8..aee311884f3f 100644 --- a/arch/parisc/kernel/module.c +++ b/arch/parisc/kernel/module.c | |||
@@ -89,6 +89,12 @@ static inline int is_local(struct module *me, void *loc) | |||
89 | return is_init(me, loc) || is_core(me, loc); | 89 | return is_init(me, loc) || is_core(me, loc); |
90 | } | 90 | } |
91 | 91 | ||
92 | static inline int is_local_section(struct module *me, void *loc, void *dot) | ||
93 | { | ||
94 | return (is_init(me, loc) && is_init(me, dot)) || | ||
95 | (is_core(me, loc) && is_core(me, dot)); | ||
96 | } | ||
97 | |||
92 | 98 | ||
93 | #ifndef __LP64__ | 99 | #ifndef __LP64__ |
94 | struct got_entry { | 100 | struct got_entry { |
@@ -364,8 +370,14 @@ static Elf_Addr get_fdesc(struct module *me, unsigned long value) | |||
364 | } | 370 | } |
365 | #endif /* __LP64__ */ | 371 | #endif /* __LP64__ */ |
366 | 372 | ||
373 | enum elf_stub_type { | ||
374 | ELF_STUB_GOT, | ||
375 | ELF_STUB_MILLI, | ||
376 | ELF_STUB_DIRECT, | ||
377 | }; | ||
378 | |||
367 | static Elf_Addr get_stub(struct module *me, unsigned long value, long addend, | 379 | static Elf_Addr get_stub(struct module *me, unsigned long value, long addend, |
368 | int millicode, int init_section) | 380 | enum elf_stub_type stub_type, int init_section) |
369 | { | 381 | { |
370 | unsigned long i; | 382 | unsigned long i; |
371 | struct stub_entry *stub; | 383 | struct stub_entry *stub; |
@@ -396,7 +408,7 @@ static Elf_Addr get_stub(struct module *me, unsigned long value, long addend, | |||
396 | stub->insns[1] |= reassemble_17(rrsel(value, addend) / 4); | 408 | stub->insns[1] |= reassemble_17(rrsel(value, addend) / 4); |
397 | 409 | ||
398 | #else | 410 | #else |
399 | /* for 64-bit we have two kinds of stubs: | 411 | /* for 64-bit we have three kinds of stubs: |
400 | * for normal function calls: | 412 | * for normal function calls: |
401 | * ldd 0(%dp),%dp | 413 | * ldd 0(%dp),%dp |
402 | * ldd 10(%dp), %r1 | 414 | * ldd 10(%dp), %r1 |
@@ -408,18 +420,23 @@ static Elf_Addr get_stub(struct module *me, unsigned long value, long addend, | |||
408 | * ldo 0(%r1), %r1 | 420 | * ldo 0(%r1), %r1 |
409 | * ldd 10(%r1), %r1 | 421 | * ldd 10(%r1), %r1 |
410 | * bve,n (%r1) | 422 | * bve,n (%r1) |
423 | * | ||
424 | * for direct branches (jumps between different section of the | ||
425 | * same module): | ||
426 | * ldil 0, %r1 | ||
427 | * ldo 0(%r1), %r1 | ||
428 | * bve,n (%r1) | ||
411 | */ | 429 | */ |
412 | if (!millicode) | 430 | switch (stub_type) { |
413 | { | 431 | case ELF_STUB_GOT: |
414 | stub->insns[0] = 0x537b0000; /* ldd 0(%dp),%dp */ | 432 | stub->insns[0] = 0x537b0000; /* ldd 0(%dp),%dp */ |
415 | stub->insns[1] = 0x53610020; /* ldd 10(%dp),%r1 */ | 433 | stub->insns[1] = 0x53610020; /* ldd 10(%dp),%r1 */ |
416 | stub->insns[2] = 0xe820d000; /* bve (%r1) */ | 434 | stub->insns[2] = 0xe820d000; /* bve (%r1) */ |
417 | stub->insns[3] = 0x537b0030; /* ldd 18(%dp),%dp */ | 435 | stub->insns[3] = 0x537b0030; /* ldd 18(%dp),%dp */ |
418 | 436 | ||
419 | stub->insns[0] |= reassemble_14(get_got(me, value, addend) & 0x3fff); | 437 | stub->insns[0] |= reassemble_14(get_got(me, value, addend) & 0x3fff); |
420 | } | 438 | break; |
421 | else | 439 | case ELF_STUB_MILLI: |
422 | { | ||
423 | stub->insns[0] = 0x20200000; /* ldil 0,%r1 */ | 440 | stub->insns[0] = 0x20200000; /* ldil 0,%r1 */ |
424 | stub->insns[1] = 0x34210000; /* ldo 0(%r1), %r1 */ | 441 | stub->insns[1] = 0x34210000; /* ldo 0(%r1), %r1 */ |
425 | stub->insns[2] = 0x50210020; /* ldd 10(%r1),%r1 */ | 442 | stub->insns[2] = 0x50210020; /* ldd 10(%r1),%r1 */ |
@@ -427,7 +444,17 @@ static Elf_Addr get_stub(struct module *me, unsigned long value, long addend, | |||
427 | 444 | ||
428 | stub->insns[0] |= reassemble_21(lrsel(value, addend)); | 445 | stub->insns[0] |= reassemble_21(lrsel(value, addend)); |
429 | stub->insns[1] |= reassemble_14(rrsel(value, addend)); | 446 | stub->insns[1] |= reassemble_14(rrsel(value, addend)); |
447 | break; | ||
448 | case ELF_STUB_DIRECT: | ||
449 | stub->insns[0] = 0x20200000; /* ldil 0,%r1 */ | ||
450 | stub->insns[1] = 0x34210000; /* ldo 0(%r1), %r1 */ | ||
451 | stub->insns[2] = 0xe820d002; /* bve,n (%r1) */ | ||
452 | |||
453 | stub->insns[0] |= reassemble_21(lrsel(value, addend)); | ||
454 | stub->insns[1] |= reassemble_14(rrsel(value, addend)); | ||
455 | break; | ||
430 | } | 456 | } |
457 | |||
431 | #endif | 458 | #endif |
432 | 459 | ||
433 | return (Elf_Addr)stub; | 460 | return (Elf_Addr)stub; |
@@ -539,14 +566,14 @@ int apply_relocate_add(Elf_Shdr *sechdrs, | |||
539 | break; | 566 | break; |
540 | case R_PARISC_PCREL17F: | 567 | case R_PARISC_PCREL17F: |
541 | /* 17-bit PC relative address */ | 568 | /* 17-bit PC relative address */ |
542 | val = get_stub(me, val, addend, 0, is_init(me, loc)); | 569 | val = get_stub(me, val, addend, ELF_STUB_GOT, is_init(me, loc)); |
543 | val = (val - dot - 8)/4; | 570 | val = (val - dot - 8)/4; |
544 | CHECK_RELOC(val, 17) | 571 | CHECK_RELOC(val, 17) |
545 | *loc = (*loc & ~0x1f1ffd) | reassemble_17(val); | 572 | *loc = (*loc & ~0x1f1ffd) | reassemble_17(val); |
546 | break; | 573 | break; |
547 | case R_PARISC_PCREL22F: | 574 | case R_PARISC_PCREL22F: |
548 | /* 22-bit PC relative address; only defined for pa20 */ | 575 | /* 22-bit PC relative address; only defined for pa20 */ |
549 | val = get_stub(me, val, addend, 0, is_init(me, loc)); | 576 | val = get_stub(me, val, addend, ELF_STUB_GOT, is_init(me, loc)); |
550 | DEBUGP("STUB FOR %s loc %lx+%lx at %lx\n", | 577 | DEBUGP("STUB FOR %s loc %lx+%lx at %lx\n", |
551 | strtab + sym->st_name, (unsigned long)loc, addend, | 578 | strtab + sym->st_name, (unsigned long)loc, addend, |
552 | val) | 579 | val) |
@@ -643,13 +670,23 @@ int apply_relocate_add(Elf_Shdr *sechdrs, | |||
643 | strtab + sym->st_name, | 670 | strtab + sym->st_name, |
644 | loc, val); | 671 | loc, val); |
645 | /* can we reach it locally? */ | 672 | /* can we reach it locally? */ |
646 | if(!is_local(me, (void *)val)) { | 673 | if(!is_local_section(me, (void *)val, (void *)dot)) { |
647 | if (strncmp(strtab + sym->st_name, "$$", 2) | 674 | |
675 | if (is_local(me, (void *)val)) | ||
676 | /* this is the case where the | ||
677 | * symbol is local to the | ||
678 | * module, but in a different | ||
679 | * section, so stub the jump | ||
680 | * in case it's more than 22 | ||
681 | * bits away */ | ||
682 | val = get_stub(me, val, addend, ELF_STUB_DIRECT, | ||
683 | is_init(me, loc)); | ||
684 | else if (strncmp(strtab + sym->st_name, "$$", 2) | ||
648 | == 0) | 685 | == 0) |
649 | val = get_stub(me, val, addend, 1, | 686 | val = get_stub(me, val, addend, ELF_STUB_MILLI, |
650 | is_init(me, loc)); | 687 | is_init(me, loc)); |
651 | else | 688 | else |
652 | val = get_stub(me, val, addend, 0, | 689 | val = get_stub(me, val, addend, ELF_STUB_GOT, |
653 | is_init(me, loc)); | 690 | is_init(me, loc)); |
654 | } | 691 | } |
655 | DEBUGP("STUB FOR %s loc %lx, val %lx+%lx at %lx\n", | 692 | DEBUGP("STUB FOR %s loc %lx, val %lx+%lx at %lx\n", |
diff --git a/arch/parisc/kernel/pci.c b/arch/parisc/kernel/pci.c index 79c7db2705fd..7d6967ee367c 100644 --- a/arch/parisc/kernel/pci.c +++ b/arch/parisc/kernel/pci.c | |||
@@ -289,7 +289,7 @@ EXPORT_SYMBOL(pcibios_bus_to_resource); | |||
289 | * than res->start. | 289 | * than res->start. |
290 | */ | 290 | */ |
291 | void pcibios_align_resource(void *data, struct resource *res, | 291 | void pcibios_align_resource(void *data, struct resource *res, |
292 | unsigned long size, unsigned long alignment) | 292 | resource_size_t size, resource_size_t alignment) |
293 | { | 293 | { |
294 | unsigned long mask, align; | 294 | unsigned long mask, align; |
295 | 295 | ||
diff --git a/arch/parisc/kernel/pdc_chassis.c b/arch/parisc/kernel/pdc_chassis.c index a45e2e2ffd9f..d47ba1aa8253 100644 --- a/arch/parisc/kernel/pdc_chassis.c +++ b/arch/parisc/kernel/pdc_chassis.c | |||
@@ -1,8 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * interfaces to log Chassis Codes via PDC (firmware) | 2 | * interfaces to Chassis Codes via PDC (firmware) |
3 | * | 3 | * |
4 | * Copyright (C) 2002 Laurent Canet <canetl@esiee.fr> | 4 | * Copyright (C) 2002 Laurent Canet <canetl@esiee.fr> |
5 | * Copyright (C) 2002-2004 Thibaut VARENE <varenet@parisc-linux.org> | 5 | * Copyright (C) 2002-2006 Thibaut VARENE <varenet@parisc-linux.org> |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License, version 2, as | 8 | * it under the terms of the GNU General Public License, version 2, as |
@@ -16,6 +16,10 @@ | |||
16 | * You should have received a copy of the GNU General Public License | 16 | * You should have received a copy of the GNU General Public License |
17 | * along with this program; if not, write to the Free Software | 17 | * along with this program; if not, write to the Free Software |
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | * | ||
20 | * TODO: poll chassis warns, trigger (configurable) machine shutdown when | ||
21 | * needed. | ||
22 | * Find out how to get Chassis warnings out of PAT boxes? | ||
19 | */ | 23 | */ |
20 | 24 | ||
21 | #undef PDC_CHASSIS_DEBUG | 25 | #undef PDC_CHASSIS_DEBUG |
@@ -30,15 +34,16 @@ | |||
30 | #include <linux/reboot.h> | 34 | #include <linux/reboot.h> |
31 | #include <linux/notifier.h> | 35 | #include <linux/notifier.h> |
32 | #include <linux/cache.h> | 36 | #include <linux/cache.h> |
37 | #include <linux/proc_fs.h> | ||
33 | 38 | ||
34 | #include <asm/pdc_chassis.h> | 39 | #include <asm/pdc_chassis.h> |
35 | #include <asm/processor.h> | 40 | #include <asm/processor.h> |
36 | #include <asm/pdc.h> | 41 | #include <asm/pdc.h> |
37 | #include <asm/pdcpat.h> | 42 | #include <asm/pdcpat.h> |
38 | 43 | ||
44 | #define PDC_CHASSIS_VER "0.05" | ||
39 | 45 | ||
40 | #ifdef CONFIG_PDC_CHASSIS | 46 | #ifdef CONFIG_PDC_CHASSIS |
41 | static int pdc_chassis_old __read_mostly = 0; | ||
42 | static unsigned int pdc_chassis_enabled __read_mostly = 1; | 47 | static unsigned int pdc_chassis_enabled __read_mostly = 1; |
43 | 48 | ||
44 | 49 | ||
@@ -64,7 +69,7 @@ __setup("pdcchassis=", pdc_chassis_setup); | |||
64 | * Currently, only E class and A180 are known to work with this. | 69 | * Currently, only E class and A180 are known to work with this. |
65 | * Inspired by Christoph Plattner | 70 | * Inspired by Christoph Plattner |
66 | */ | 71 | */ |
67 | 72 | #if 0 | |
68 | static void __init pdc_chassis_checkold(void) | 73 | static void __init pdc_chassis_checkold(void) |
69 | { | 74 | { |
70 | switch(CPU_HVERSION) { | 75 | switch(CPU_HVERSION) { |
@@ -73,7 +78,6 @@ static void __init pdc_chassis_checkold(void) | |||
73 | case 0x482: /* E45 */ | 78 | case 0x482: /* E45 */ |
74 | case 0x483: /* E55 */ | 79 | case 0x483: /* E55 */ |
75 | case 0x516: /* A180 */ | 80 | case 0x516: /* A180 */ |
76 | pdc_chassis_old = 1; | ||
77 | break; | 81 | break; |
78 | 82 | ||
79 | default: | 83 | default: |
@@ -81,7 +85,7 @@ static void __init pdc_chassis_checkold(void) | |||
81 | } | 85 | } |
82 | DPRINTK(KERN_DEBUG "%s: pdc_chassis_checkold(); pdc_chassis_old = %d\n", __FILE__, pdc_chassis_old); | 86 | DPRINTK(KERN_DEBUG "%s: pdc_chassis_checkold(); pdc_chassis_old = %d\n", __FILE__, pdc_chassis_old); |
83 | } | 87 | } |
84 | 88 | #endif | |
85 | 89 | ||
86 | /** | 90 | /** |
87 | * pdc_chassis_panic_event() - Called by the panic handler. | 91 | * pdc_chassis_panic_event() - Called by the panic handler. |
@@ -131,30 +135,20 @@ static struct notifier_block pdc_chassis_reboot_block = { | |||
131 | void __init parisc_pdc_chassis_init(void) | 135 | void __init parisc_pdc_chassis_init(void) |
132 | { | 136 | { |
133 | #ifdef CONFIG_PDC_CHASSIS | 137 | #ifdef CONFIG_PDC_CHASSIS |
134 | int handle = 0; | ||
135 | if (likely(pdc_chassis_enabled)) { | 138 | if (likely(pdc_chassis_enabled)) { |
136 | DPRINTK(KERN_DEBUG "%s: parisc_pdc_chassis_init()\n", __FILE__); | 139 | DPRINTK(KERN_DEBUG "%s: parisc_pdc_chassis_init()\n", __FILE__); |
137 | 140 | ||
138 | /* Let see if we have something to handle... */ | 141 | /* Let see if we have something to handle... */ |
139 | /* Check for PDC_PAT or old LED Panel */ | 142 | printk(KERN_INFO "Enabling %s chassis codes support v%s\n", |
140 | pdc_chassis_checkold(); | 143 | is_pdc_pat() ? "PDC_PAT" : "regular", |
141 | if (is_pdc_pat()) { | 144 | PDC_CHASSIS_VER); |
142 | printk(KERN_INFO "Enabling PDC_PAT chassis codes support.\n"); | 145 | |
143 | handle = 1; | 146 | /* initialize panic notifier chain */ |
144 | } | 147 | atomic_notifier_chain_register(&panic_notifier_list, |
145 | else if (unlikely(pdc_chassis_old)) { | 148 | &pdc_chassis_panic_block); |
146 | printk(KERN_INFO "Enabling old style chassis LED panel support.\n"); | 149 | |
147 | handle = 1; | 150 | /* initialize reboot notifier chain */ |
148 | } | 151 | register_reboot_notifier(&pdc_chassis_reboot_block); |
149 | |||
150 | if (handle) { | ||
151 | /* initialize panic notifier chain */ | ||
152 | atomic_notifier_chain_register(&panic_notifier_list, | ||
153 | &pdc_chassis_panic_block); | ||
154 | |||
155 | /* initialize reboot notifier chain */ | ||
156 | register_reboot_notifier(&pdc_chassis_reboot_block); | ||
157 | } | ||
158 | } | 152 | } |
159 | #endif /* CONFIG_PDC_CHASSIS */ | 153 | #endif /* CONFIG_PDC_CHASSIS */ |
160 | } | 154 | } |
@@ -215,9 +209,12 @@ int pdc_chassis_send_status(int message) | |||
215 | } | 209 | } |
216 | } else retval = -1; | 210 | } else retval = -1; |
217 | #else | 211 | #else |
218 | if (unlikely(pdc_chassis_old)) { | 212 | if (1) { |
219 | switch (message) { | 213 | switch (message) { |
220 | case PDC_CHASSIS_DIRECT_BSTART: | 214 | case PDC_CHASSIS_DIRECT_BSTART: |
215 | retval = pdc_chassis_disp(PDC_CHASSIS_DISP_DATA(OSTAT_INIT)); | ||
216 | break; | ||
217 | |||
221 | case PDC_CHASSIS_DIRECT_BCOMPLETE: | 218 | case PDC_CHASSIS_DIRECT_BCOMPLETE: |
222 | retval = pdc_chassis_disp(PDC_CHASSIS_DISP_DATA(OSTAT_RUN)); | 219 | retval = pdc_chassis_disp(PDC_CHASSIS_DISP_DATA(OSTAT_RUN)); |
223 | break; | 220 | break; |
@@ -244,3 +241,61 @@ int pdc_chassis_send_status(int message) | |||
244 | #endif /* CONFIG_PDC_CHASSIS */ | 241 | #endif /* CONFIG_PDC_CHASSIS */ |
245 | return retval; | 242 | return retval; |
246 | } | 243 | } |
244 | |||
245 | #ifdef CONFIG_PDC_CHASSIS_WARN | ||
246 | #ifdef CONFIG_PROC_FS | ||
247 | static int pdc_chassis_warn_pread(char *page, char **start, off_t off, | ||
248 | int count, int *eof, void *data) | ||
249 | { | ||
250 | char *out = page; | ||
251 | int len, ret; | ||
252 | unsigned long warn; | ||
253 | u32 warnreg; | ||
254 | |||
255 | ret = pdc_chassis_warn(&warn); | ||
256 | if (ret != PDC_OK) | ||
257 | return -EIO; | ||
258 | |||
259 | warnreg = (warn & 0xFFFFFFFF); | ||
260 | |||
261 | if ((warnreg >> 24) & 0xFF) | ||
262 | out += sprintf(out, "Chassis component failure! (eg fan or PSU): 0x%.2x\n", ((warnreg >> 24) & 0xFF)); | ||
263 | |||
264 | out += sprintf(out, "Battery: %s\n", (warnreg & 0x04) ? "Low!" : "OK"); | ||
265 | out += sprintf(out, "Temp low: %s\n", (warnreg & 0x02) ? "Exceeded!" : "OK"); | ||
266 | out += sprintf(out, "Temp mid: %s\n", (warnreg & 0x01) ? "Exceeded!" : "OK"); | ||
267 | |||
268 | len = out - page - off; | ||
269 | if (len < count) { | ||
270 | *eof = 1; | ||
271 | if (len <= 0) return 0; | ||
272 | } else { | ||
273 | len = count; | ||
274 | } | ||
275 | *start = page + off; | ||
276 | return len; | ||
277 | } | ||
278 | |||
279 | static int __init pdc_chassis_create_procfs(void) | ||
280 | { | ||
281 | unsigned long test; | ||
282 | int ret; | ||
283 | |||
284 | ret = pdc_chassis_warn(&test); | ||
285 | if ((ret == PDC_BAD_PROC) || (ret == PDC_BAD_OPTION)) { | ||
286 | /* seems that some boxes (eg L1000) do not implement this */ | ||
287 | printk(KERN_INFO "Chassis warnings not supported.\n"); | ||
288 | return 0; | ||
289 | } | ||
290 | |||
291 | printk(KERN_INFO "Enabling PDC chassis warnings support v%s\n", | ||
292 | PDC_CHASSIS_VER); | ||
293 | create_proc_read_entry("chassis", 0400, NULL, pdc_chassis_warn_pread, | ||
294 | NULL); | ||
295 | return 0; | ||
296 | } | ||
297 | |||
298 | __initcall(pdc_chassis_create_procfs); | ||
299 | |||
300 | #endif /* CONFIG_PROC_FS */ | ||
301 | #endif /* CONFIG_PDC_CHASSIS_WARN */ | ||
diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index 413292f1a4a3..3f28de974556 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c | |||
@@ -91,7 +91,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
91 | int copied; | 91 | int copied; |
92 | 92 | ||
93 | #ifdef __LP64__ | 93 | #ifdef __LP64__ |
94 | if (personality(child->personality) == PER_LINUX32) { | 94 | if (__is_compat_task(child)) { |
95 | unsigned int tmp; | 95 | unsigned int tmp; |
96 | 96 | ||
97 | addr &= 0xffffffffL; | 97 | addr &= 0xffffffffL; |
@@ -123,7 +123,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
123 | case PTRACE_POKEDATA: | 123 | case PTRACE_POKEDATA: |
124 | ret = 0; | 124 | ret = 0; |
125 | #ifdef __LP64__ | 125 | #ifdef __LP64__ |
126 | if (personality(child->personality) == PER_LINUX32) { | 126 | if (__is_compat_task(child)) { |
127 | unsigned int tmp = (unsigned int)data; | 127 | unsigned int tmp = (unsigned int)data; |
128 | DBG("sys_ptrace(POKE%s, %d, %lx, %lx)\n", | 128 | DBG("sys_ptrace(POKE%s, %d, %lx, %lx)\n", |
129 | request == PTRACE_POKETEXT ? "TEXT" : "DATA", | 129 | request == PTRACE_POKETEXT ? "TEXT" : "DATA", |
@@ -146,7 +146,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
146 | case PTRACE_PEEKUSR: { | 146 | case PTRACE_PEEKUSR: { |
147 | ret = -EIO; | 147 | ret = -EIO; |
148 | #ifdef __LP64__ | 148 | #ifdef __LP64__ |
149 | if (personality(child->personality) == PER_LINUX32) { | 149 | if (__is_compat_task(child)) { |
150 | unsigned int tmp; | 150 | unsigned int tmp; |
151 | 151 | ||
152 | if (addr & (sizeof(int)-1)) | 152 | if (addr & (sizeof(int)-1)) |
@@ -205,7 +205,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
205 | goto out_tsk; | 205 | goto out_tsk; |
206 | } | 206 | } |
207 | #ifdef __LP64__ | 207 | #ifdef __LP64__ |
208 | if (personality(child->personality) == PER_LINUX32) { | 208 | if (__is_compat_task(child)) { |
209 | if (addr & (sizeof(int)-1)) | 209 | if (addr & (sizeof(int)-1)) |
210 | goto out_tsk; | 210 | goto out_tsk; |
211 | if ((addr = translate_usr_offset(addr)) < 0) | 211 | if ((addr = translate_usr_offset(addr)) < 0) |
diff --git a/arch/parisc/kernel/real2.S b/arch/parisc/kernel/real2.S index 8c2859cca77e..453d01a9f971 100644 --- a/arch/parisc/kernel/real2.S +++ b/arch/parisc/kernel/real2.S | |||
@@ -276,15 +276,6 @@ r64_ret: | |||
276 | 276 | ||
277 | #endif | 277 | #endif |
278 | 278 | ||
279 | .export pc_in_user_space | ||
280 | .text | ||
281 | /* Doesn't belong here but I couldn't find a nicer spot. */ | ||
282 | /* Should never get called, only used by profile stuff in time.c */ | ||
283 | pc_in_user_space: | ||
284 | bv,n 0(%rp) | ||
285 | nop | ||
286 | |||
287 | |||
288 | .export __canonicalize_funcptr_for_compare | 279 | .export __canonicalize_funcptr_for_compare |
289 | .text | 280 | .text |
290 | /* http://lists.parisc-linux.org/hypermail/parisc-linux/10916.html | 281 | /* http://lists.parisc-linux.org/hypermail/parisc-linux/10916.html |
diff --git a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c index 4a36ec3f6ac1..278f4b9f6a38 100644 --- a/arch/parisc/kernel/setup.c +++ b/arch/parisc/kernel/setup.c | |||
@@ -303,6 +303,8 @@ extern void eisa_init(void); | |||
303 | 303 | ||
304 | static int __init parisc_init(void) | 304 | static int __init parisc_init(void) |
305 | { | 305 | { |
306 | u32 osid = (OS_ID_LINUX << 16); | ||
307 | |||
306 | parisc_proc_mkdir(); | 308 | parisc_proc_mkdir(); |
307 | parisc_init_resources(); | 309 | parisc_init_resources(); |
308 | do_device_inventory(); /* probe for hardware */ | 310 | do_device_inventory(); /* probe for hardware */ |
@@ -311,6 +313,9 @@ static int __init parisc_init(void) | |||
311 | 313 | ||
312 | /* set up a new led state on systems shipped LED State panel */ | 314 | /* set up a new led state on systems shipped LED State panel */ |
313 | pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BSTART); | 315 | pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BSTART); |
316 | |||
317 | /* tell PDC we're Linux. Nevermind failure. */ | ||
318 | pdc_stable_write(0x40, &osid, sizeof(osid)); | ||
314 | 319 | ||
315 | processor_init(); | 320 | processor_init(); |
316 | printk(KERN_INFO "CPU(s): %d x %s at %d.%06d MHz\n", | 321 | printk(KERN_INFO "CPU(s): %d x %s at %d.%06d MHz\n", |
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index cc38edfd90c5..bb83880c5ee3 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c | |||
@@ -76,7 +76,7 @@ sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, struct pt_regs *r | |||
76 | #ifdef __LP64__ | 76 | #ifdef __LP64__ |
77 | compat_sigset_t newset32; | 77 | compat_sigset_t newset32; |
78 | 78 | ||
79 | if(personality(current->personality) == PER_LINUX32){ | 79 | if (is_compat_task()) { |
80 | /* XXX: Don't preclude handling different sized sigset_t's. */ | 80 | /* XXX: Don't preclude handling different sized sigset_t's. */ |
81 | if (sigsetsize != sizeof(compat_sigset_t)) | 81 | if (sigsetsize != sizeof(compat_sigset_t)) |
82 | return -EINVAL; | 82 | return -EINVAL; |
@@ -153,7 +153,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall) | |||
153 | compat_sigset_t compat_set; | 153 | compat_sigset_t compat_set; |
154 | struct compat_rt_sigframe __user * compat_frame; | 154 | struct compat_rt_sigframe __user * compat_frame; |
155 | 155 | ||
156 | if(personality(current->personality) == PER_LINUX32) | 156 | if (is_compat_task()) |
157 | sigframe_size = PARISC_RT_SIGFRAME_SIZE32; | 157 | sigframe_size = PARISC_RT_SIGFRAME_SIZE32; |
158 | #endif | 158 | #endif |
159 | 159 | ||
@@ -166,7 +166,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall) | |||
166 | #ifdef __LP64__ | 166 | #ifdef __LP64__ |
167 | compat_frame = (struct compat_rt_sigframe __user *)frame; | 167 | compat_frame = (struct compat_rt_sigframe __user *)frame; |
168 | 168 | ||
169 | if(personality(current->personality) == PER_LINUX32){ | 169 | if (is_compat_task()) { |
170 | DBG(2,"sys_rt_sigreturn: ELF32 process.\n"); | 170 | DBG(2,"sys_rt_sigreturn: ELF32 process.\n"); |
171 | if (__copy_from_user(&compat_set, &compat_frame->uc.uc_sigmask, sizeof(compat_set))) | 171 | if (__copy_from_user(&compat_set, &compat_frame->uc.uc_sigmask, sizeof(compat_set))) |
172 | goto give_sigsegv; | 172 | goto give_sigsegv; |
@@ -186,7 +186,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall) | |||
186 | 186 | ||
187 | /* Good thing we saved the old gr[30], eh? */ | 187 | /* Good thing we saved the old gr[30], eh? */ |
188 | #ifdef __LP64__ | 188 | #ifdef __LP64__ |
189 | if(personality(current->personality) == PER_LINUX32){ | 189 | if (is_compat_task()) { |
190 | DBG(1,"sys_rt_sigreturn: compat_frame->uc.uc_mcontext 0x%p\n", | 190 | DBG(1,"sys_rt_sigreturn: compat_frame->uc.uc_mcontext 0x%p\n", |
191 | &compat_frame->uc.uc_mcontext); | 191 | &compat_frame->uc.uc_mcontext); |
192 | // FIXME: Load upper half from register file | 192 | // FIXME: Load upper half from register file |
@@ -315,7 +315,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
315 | 315 | ||
316 | compat_frame = (struct compat_rt_sigframe __user *)frame; | 316 | compat_frame = (struct compat_rt_sigframe __user *)frame; |
317 | 317 | ||
318 | if(personality(current->personality) == PER_LINUX32) { | 318 | if (is_compat_task()) { |
319 | DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info); | 319 | DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info); |
320 | err |= copy_siginfo_to_user32(&compat_frame->info, info); | 320 | err |= copy_siginfo_to_user32(&compat_frame->info, info); |
321 | DBG(1,"SETUP_RT_FRAME: 1\n"); | 321 | DBG(1,"SETUP_RT_FRAME: 1\n"); |
@@ -392,7 +392,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
392 | haddr = A(ka->sa.sa_handler); | 392 | haddr = A(ka->sa.sa_handler); |
393 | /* The sa_handler may be a pointer to a function descriptor */ | 393 | /* The sa_handler may be a pointer to a function descriptor */ |
394 | #ifdef __LP64__ | 394 | #ifdef __LP64__ |
395 | if(personality(current->personality) == PER_LINUX32) { | 395 | if (is_compat_task()) { |
396 | #endif | 396 | #endif |
397 | if (haddr & PA_PLABEL_FDESC) { | 397 | if (haddr & PA_PLABEL_FDESC) { |
398 | Elf32_Fdesc fdesc; | 398 | Elf32_Fdesc fdesc; |
@@ -427,19 +427,19 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
427 | */ | 427 | */ |
428 | sigframe_size = PARISC_RT_SIGFRAME_SIZE; | 428 | sigframe_size = PARISC_RT_SIGFRAME_SIZE; |
429 | #ifdef __LP64__ | 429 | #ifdef __LP64__ |
430 | if(personality(current->personality) == PER_LINUX32) | 430 | if (is_compat_task()) |
431 | sigframe_size = PARISC_RT_SIGFRAME_SIZE32; | 431 | sigframe_size = PARISC_RT_SIGFRAME_SIZE32; |
432 | #endif | 432 | #endif |
433 | if (in_syscall) { | 433 | if (in_syscall) { |
434 | regs->gr[31] = haddr; | 434 | regs->gr[31] = haddr; |
435 | #ifdef __LP64__ | 435 | #ifdef __LP64__ |
436 | if(personality(current->personality) == PER_LINUX) | 436 | if (personality(current->personality) == PER_LINUX) |
437 | sigframe_size |= 1; | 437 | sigframe_size |= 1; |
438 | #endif | 438 | #endif |
439 | } else { | 439 | } else { |
440 | unsigned long psw = USER_PSW; | 440 | unsigned long psw = USER_PSW; |
441 | #ifdef __LP64__ | 441 | #ifdef __LP64__ |
442 | if(personality(current->personality) == PER_LINUX) | 442 | if (personality(current->personality) == PER_LINUX) |
443 | psw |= PSW_W; | 443 | psw |= PSW_W; |
444 | #endif | 444 | #endif |
445 | 445 | ||
@@ -464,7 +464,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
464 | regs->gr[26] = sig; /* signal number */ | 464 | regs->gr[26] = sig; /* signal number */ |
465 | 465 | ||
466 | #ifdef __LP64__ | 466 | #ifdef __LP64__ |
467 | if(personality(current->personality) == PER_LINUX32){ | 467 | if (is_compat_task()) { |
468 | regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */ | 468 | regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */ |
469 | regs->gr[24] = A(&compat_frame->uc); /* ucontext pointer */ | 469 | regs->gr[24] = A(&compat_frame->uc); /* ucontext pointer */ |
470 | } else | 470 | } else |
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S index 479d9a017cd1..9670a89c77fe 100644 --- a/arch/parisc/kernel/syscall.S +++ b/arch/parisc/kernel/syscall.S | |||
@@ -29,18 +29,6 @@ | |||
29 | .level 1.1 | 29 | .level 1.1 |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | #ifndef CONFIG_64BIT | ||
33 | .macro fixup_branch,lbl | ||
34 | b \lbl | ||
35 | .endm | ||
36 | #else | ||
37 | .macro fixup_branch,lbl | ||
38 | ldil L%\lbl, %r1 | ||
39 | ldo R%\lbl(%r1), %r1 | ||
40 | bv,n %r0(%r1) | ||
41 | .endm | ||
42 | #endif | ||
43 | |||
44 | .text | 32 | .text |
45 | 33 | ||
46 | .import syscall_exit,code | 34 | .import syscall_exit,code |
@@ -541,7 +529,7 @@ cas_nocontend: | |||
541 | # endif | 529 | # endif |
542 | /* ENABLE_LWS_DEBUG */ | 530 | /* ENABLE_LWS_DEBUG */ |
543 | 531 | ||
544 | ldcw 0(%sr2,%r20), %r28 /* Try to acquire the lock */ | 532 | LDCW 0(%sr2,%r20), %r28 /* Try to acquire the lock */ |
545 | cmpb,<>,n %r0, %r28, cas_action /* Did we get it? */ | 533 | cmpb,<>,n %r0, %r28, cas_action /* Did we get it? */ |
546 | cas_wouldblock: | 534 | cas_wouldblock: |
547 | ldo 2(%r0), %r28 /* 2nd case */ | 535 | ldo 2(%r0), %r28 /* 2nd case */ |
diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c index 594930bc4bcf..eb35e1c0bb53 100644 --- a/arch/parisc/kernel/time.c +++ b/arch/parisc/kernel/time.c | |||
@@ -157,8 +157,22 @@ do_gettimeofday (struct timeval *tv) | |||
157 | usec += (xtime.tv_nsec / 1000); | 157 | usec += (xtime.tv_nsec / 1000); |
158 | } while (read_seqretry_irqrestore(&xtime_lock, seq, flags)); | 158 | } while (read_seqretry_irqrestore(&xtime_lock, seq, flags)); |
159 | 159 | ||
160 | while (usec >= 1000000) { | 160 | if (unlikely(usec > LONG_MAX)) { |
161 | usec -= 1000000; | 161 | /* This can happen if the gettimeoffset adjustment is |
162 | * negative and xtime.tv_nsec is smaller than the | ||
163 | * adjustment */ | ||
164 | printk(KERN_ERR "do_gettimeofday() spurious xtime.tv_nsec of %ld\n", usec); | ||
165 | usec += USEC_PER_SEC; | ||
166 | --sec; | ||
167 | /* This should never happen, it means the negative | ||
168 | * time adjustment was more than a second, so there's | ||
169 | * something seriously wrong */ | ||
170 | BUG_ON(usec > LONG_MAX); | ||
171 | } | ||
172 | |||
173 | |||
174 | while (usec >= USEC_PER_SEC) { | ||
175 | usec -= USEC_PER_SEC; | ||
162 | ++sec; | 176 | ++sec; |
163 | } | 177 | } |
164 | 178 | ||
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index ff200608c851..348344a84bf7 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
@@ -66,57 +66,42 @@ int printbinary(char *buf, unsigned long x, int nbits) | |||
66 | #else | 66 | #else |
67 | #define RFMT "%08lx" | 67 | #define RFMT "%08lx" |
68 | #endif | 68 | #endif |
69 | #define FFMT "%016llx" /* fpregs are 64-bit always */ | ||
69 | 70 | ||
70 | void show_regs(struct pt_regs *regs) | 71 | #define PRINTREGS(lvl,r,f,fmt,x) \ |
72 | printk("%s%s%02d-%02d " fmt " " fmt " " fmt " " fmt "\n", \ | ||
73 | lvl, f, (x), (x+3), (r)[(x)+0], (r)[(x)+1], \ | ||
74 | (r)[(x)+2], (r)[(x)+3]) | ||
75 | |||
76 | static void print_gr(char *level, struct pt_regs *regs) | ||
71 | { | 77 | { |
72 | int i; | 78 | int i; |
73 | char buf[128], *p; | 79 | char buf[64]; |
74 | char *level; | ||
75 | unsigned long cr30; | ||
76 | unsigned long cr31; | ||
77 | /* carlos says that gcc understands better memory in a struct, | ||
78 | * and it makes our life easier with fpregs -- T-Bone */ | ||
79 | struct { u32 sw[2]; } s; | ||
80 | |||
81 | level = user_mode(regs) ? KERN_DEBUG : KERN_CRIT; | ||
82 | |||
83 | printk("%s\n", level); /* don't want to have that pretty register dump messed up */ | ||
84 | 80 | ||
81 | printk("%s\n", level); | ||
85 | printk("%s YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI\n", level); | 82 | printk("%s YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI\n", level); |
86 | printbinary(buf, regs->gr[0], 32); | 83 | printbinary(buf, regs->gr[0], 32); |
87 | printk("%sPSW: %s %s\n", level, buf, print_tainted()); | 84 | printk("%sPSW: %s %s\n", level, buf, print_tainted()); |
88 | 85 | ||
89 | for (i = 0; i < 32; i += 4) { | 86 | for (i = 0; i < 32; i += 4) |
90 | int j; | 87 | PRINTREGS(level, regs->gr, "r", RFMT, i); |
91 | p = buf; | 88 | } |
92 | p += sprintf(p, "%sr%02d-%02d ", level, i, i + 3); | ||
93 | for (j = 0; j < 4; j++) { | ||
94 | p += sprintf(p, " " RFMT, (i+j) == 0 ? 0 : regs->gr[i + j]); | ||
95 | } | ||
96 | printk("%s\n", buf); | ||
97 | } | ||
98 | 89 | ||
99 | for (i = 0; i < 8; i += 4) { | 90 | static void print_fr(char *level, struct pt_regs *regs) |
100 | int j; | 91 | { |
101 | p = buf; | 92 | int i; |
102 | p += sprintf(p, "%ssr%d-%d ", level, i, i + 3); | 93 | char buf[64]; |
103 | for (j = 0; j < 4; j++) { | 94 | struct { u32 sw[2]; } s; |
104 | p += sprintf(p, " " RFMT, regs->sr[i + j]); | ||
105 | } | ||
106 | printk("%s\n", buf); | ||
107 | } | ||
108 | 95 | ||
109 | /* FR are 64bit everywhere. Need to use asm to get the content | 96 | /* FR are 64bit everywhere. Need to use asm to get the content |
110 | * of fpsr/fper1, and we assume that we won't have a FP Identify | 97 | * of fpsr/fper1, and we assume that we won't have a FP Identify |
111 | * in our way, otherwise we're screwed. | 98 | * in our way, otherwise we're screwed. |
112 | * The fldd is used to restore the T-bit if there was one, as the | 99 | * The fldd is used to restore the T-bit if there was one, as the |
113 | * store clears it anyway. | 100 | * store clears it anyway. |
114 | * BTW, PA2.0 book says "thou shall not use fstw on FPSR/FPERs". */ | 101 | * PA2.0 book says "thou shall not use fstw on FPSR/FPERs" - T-Bone */ |
115 | __asm__ ( | 102 | asm volatile ("fstd %%fr0,0(%1) \n\t" |
116 | "fstd %%fr0,0(%1) \n\t" | 103 | "fldd 0(%1),%%fr0 \n\t" |
117 | "fldd 0(%1),%%fr0 \n\t" | 104 | : "=m" (s) : "r" (&s) : "r0"); |
118 | : "=m" (s) : "r" (&s) : "%r0" | ||
119 | ); | ||
120 | 105 | ||
121 | printk("%s\n", level); | 106 | printk("%s\n", level); |
122 | printk("%s VZOUICununcqcqcqcqcqcrmunTDVZOUI\n", level); | 107 | printk("%s VZOUICununcqcqcqcqcqcrmunTDVZOUI\n", level); |
@@ -125,14 +110,25 @@ void show_regs(struct pt_regs *regs) | |||
125 | printk("%sFPER1: %08x\n", level, s.sw[1]); | 110 | printk("%sFPER1: %08x\n", level, s.sw[1]); |
126 | 111 | ||
127 | /* here we'll print fr0 again, tho it'll be meaningless */ | 112 | /* here we'll print fr0 again, tho it'll be meaningless */ |
128 | for (i = 0; i < 32; i += 4) { | 113 | for (i = 0; i < 32; i += 4) |
129 | int j; | 114 | PRINTREGS(level, regs->fr, "fr", FFMT, i); |
130 | p = buf; | 115 | } |
131 | p += sprintf(p, "%sfr%02d-%02d ", level, i, i + 3); | 116 | |
132 | for (j = 0; j < 4; j++) | 117 | void show_regs(struct pt_regs *regs) |
133 | p += sprintf(p, " %016llx", (i+j) == 0 ? 0 : regs->fr[i+j]); | 118 | { |
134 | printk("%s\n", buf); | 119 | int i; |
135 | } | 120 | char *level; |
121 | unsigned long cr30, cr31; | ||
122 | |||
123 | level = user_mode(regs) ? KERN_DEBUG : KERN_CRIT; | ||
124 | |||
125 | print_gr(level, regs); | ||
126 | |||
127 | for (i = 0; i < 8; i += 4) | ||
128 | PRINTREGS(level, regs->sr, "sr", RFMT, i); | ||
129 | |||
130 | if (user_mode(regs)) | ||
131 | print_fr(level, regs); | ||
136 | 132 | ||
137 | cr30 = mfctl(30); | 133 | cr30 = mfctl(30); |
138 | cr31 = mfctl(31); | 134 | cr31 = mfctl(31); |
diff --git a/arch/parisc/kernel/unaligned.c b/arch/parisc/kernel/unaligned.c index de0a1b21cb40..92328fbddb3e 100644 --- a/arch/parisc/kernel/unaligned.c +++ b/arch/parisc/kernel/unaligned.c | |||
@@ -43,6 +43,8 @@ | |||
43 | "\tldil L%%" #lbl ", %%r1\n" \ | 43 | "\tldil L%%" #lbl ", %%r1\n" \ |
44 | "\tldo R%%" #lbl "(%%r1), %%r1\n" \ | 44 | "\tldo R%%" #lbl "(%%r1), %%r1\n" \ |
45 | "\tbv,n %%r0(%%r1)\n" | 45 | "\tbv,n %%r0(%%r1)\n" |
46 | /* If you use FIXUP_BRANCH, then you must list this clobber */ | ||
47 | #define FIXUP_BRANCH_CLOBBER "r1" | ||
46 | 48 | ||
47 | /* 1111 1100 0000 0000 0001 0011 1100 0000 */ | 49 | /* 1111 1100 0000 0000 0001 0011 1100 0000 */ |
48 | #define OPCODE1(a,b,c) ((a)<<26|(b)<<12|(c)<<6) | 50 | #define OPCODE1(a,b,c) ((a)<<26|(b)<<12|(c)<<6) |
@@ -157,7 +159,7 @@ static int emulate_ldh(struct pt_regs *regs, int toreg) | |||
157 | " .previous\n" | 159 | " .previous\n" |
158 | : "=r" (val), "=r" (ret) | 160 | : "=r" (val), "=r" (ret) |
159 | : "0" (val), "r" (saddr), "r" (regs->isr) | 161 | : "0" (val), "r" (saddr), "r" (regs->isr) |
160 | : "r20" ); | 162 | : "r20", FIXUP_BRANCH_CLOBBER ); |
161 | 163 | ||
162 | DPRINTF("val = 0x" RFMT "\n", val); | 164 | DPRINTF("val = 0x" RFMT "\n", val); |
163 | 165 | ||
@@ -202,7 +204,7 @@ static int emulate_ldw(struct pt_regs *regs, int toreg, int flop) | |||
202 | " .previous\n" | 204 | " .previous\n" |
203 | : "=r" (val), "=r" (ret) | 205 | : "=r" (val), "=r" (ret) |
204 | : "0" (val), "r" (saddr), "r" (regs->isr) | 206 | : "0" (val), "r" (saddr), "r" (regs->isr) |
205 | : "r19", "r20" ); | 207 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); |
206 | 208 | ||
207 | DPRINTF("val = 0x" RFMT "\n", val); | 209 | DPRINTF("val = 0x" RFMT "\n", val); |
208 | 210 | ||
@@ -253,7 +255,7 @@ static int emulate_ldd(struct pt_regs *regs, int toreg, int flop) | |||
253 | " .previous\n" | 255 | " .previous\n" |
254 | : "=r" (val), "=r" (ret) | 256 | : "=r" (val), "=r" (ret) |
255 | : "0" (val), "r" (saddr), "r" (regs->isr) | 257 | : "0" (val), "r" (saddr), "r" (regs->isr) |
256 | : "r19", "r20" ); | 258 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); |
257 | #else | 259 | #else |
258 | { | 260 | { |
259 | unsigned long valh=0,vall=0; | 261 | unsigned long valh=0,vall=0; |
@@ -287,7 +289,7 @@ static int emulate_ldd(struct pt_regs *regs, int toreg, int flop) | |||
287 | " .previous\n" | 289 | " .previous\n" |
288 | : "=r" (valh), "=r" (vall), "=r" (ret) | 290 | : "=r" (valh), "=r" (vall), "=r" (ret) |
289 | : "0" (valh), "1" (vall), "r" (saddr), "r" (regs->isr) | 291 | : "0" (valh), "1" (vall), "r" (saddr), "r" (regs->isr) |
290 | : "r19", "r20" ); | 292 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); |
291 | val=((__u64)valh<<32)|(__u64)vall; | 293 | val=((__u64)valh<<32)|(__u64)vall; |
292 | } | 294 | } |
293 | #endif | 295 | #endif |
@@ -335,7 +337,7 @@ static int emulate_sth(struct pt_regs *regs, int frreg) | |||
335 | " .previous\n" | 337 | " .previous\n" |
336 | : "=r" (ret) | 338 | : "=r" (ret) |
337 | : "r" (val), "r" (regs->ior), "r" (regs->isr) | 339 | : "r" (val), "r" (regs->ior), "r" (regs->isr) |
338 | : "r19" ); | 340 | : "r19", FIXUP_BRANCH_CLOBBER ); |
339 | 341 | ||
340 | return ret; | 342 | return ret; |
341 | } | 343 | } |
@@ -389,7 +391,7 @@ static int emulate_stw(struct pt_regs *regs, int frreg, int flop) | |||
389 | " .previous\n" | 391 | " .previous\n" |
390 | : "=r" (ret) | 392 | : "=r" (ret) |
391 | : "r" (val), "r" (regs->ior), "r" (regs->isr) | 393 | : "r" (val), "r" (regs->ior), "r" (regs->isr) |
392 | : "r19", "r20", "r21", "r22", "r1" ); | 394 | : "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER ); |
393 | 395 | ||
394 | return 0; | 396 | return 0; |
395 | } | 397 | } |
@@ -450,7 +452,7 @@ static int emulate_std(struct pt_regs *regs, int frreg, int flop) | |||
450 | " .previous\n" | 452 | " .previous\n" |
451 | : "=r" (ret) | 453 | : "=r" (ret) |
452 | : "r" (val), "r" (regs->ior), "r" (regs->isr) | 454 | : "r" (val), "r" (regs->ior), "r" (regs->isr) |
453 | : "r19", "r20", "r21", "r22", "r1" ); | 455 | : "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER ); |
454 | #else | 456 | #else |
455 | { | 457 | { |
456 | unsigned long valh=(val>>32),vall=(val&0xffffffffl); | 458 | unsigned long valh=(val>>32),vall=(val&0xffffffffl); |
@@ -495,7 +497,7 @@ static int emulate_std(struct pt_regs *regs, int frreg, int flop) | |||
495 | " .previous\n" | 497 | " .previous\n" |
496 | : "=r" (ret) | 498 | : "=r" (ret) |
497 | : "r" (valh), "r" (vall), "r" (regs->ior), "r" (regs->isr) | 499 | : "r" (valh), "r" (vall), "r" (regs->ior), "r" (regs->isr) |
498 | : "r19", "r20", "r21", "r1" ); | 500 | : "r19", "r20", "r21", "r1", FIXUP_BRANCH_CLOBBER ); |
499 | } | 501 | } |
500 | #endif | 502 | #endif |
501 | 503 | ||
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index e922a88b2bad..b9a40a35a9ed 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -30,6 +30,10 @@ config GENERIC_HARDIRQS | |||
30 | bool | 30 | bool |
31 | default y | 31 | default y |
32 | 32 | ||
33 | config IRQ_PER_CPU | ||
34 | bool | ||
35 | default y | ||
36 | |||
33 | config RWSEM_GENERIC_SPINLOCK | 37 | config RWSEM_GENERIC_SPINLOCK |
34 | bool | 38 | bool |
35 | 39 | ||
@@ -336,7 +340,7 @@ config PPC_ISERIES | |||
336 | 340 | ||
337 | config EMBEDDED6xx | 341 | config EMBEDDED6xx |
338 | bool "Embedded 6xx/7xx/7xxx-based board" | 342 | bool "Embedded 6xx/7xx/7xxx-based board" |
339 | depends on PPC32 && BROKEN | 343 | depends on PPC32 && (BROKEN||BROKEN_ON_SMP) |
340 | 344 | ||
341 | config APUS | 345 | config APUS |
342 | bool "Amiga-APUS" | 346 | bool "Amiga-APUS" |
@@ -413,12 +417,17 @@ config PPC_CELL_NATIVE | |||
413 | default n | 417 | default n |
414 | 418 | ||
415 | config PPC_IBM_CELL_BLADE | 419 | config PPC_IBM_CELL_BLADE |
416 | bool " IBM Cell Blade" | 420 | bool "IBM Cell Blade" |
417 | depends on PPC_MULTIPLATFORM && PPC64 | 421 | depends on PPC_MULTIPLATFORM && PPC64 |
418 | select PPC_CELL_NATIVE | 422 | select PPC_CELL_NATIVE |
419 | select PPC_RTAS | 423 | select PPC_RTAS |
420 | select MMIO_NVRAM | 424 | select MMIO_NVRAM |
421 | select PPC_UDBG_16550 | 425 | select PPC_UDBG_16550 |
426 | select UDBG_RTAS_CONSOLE | ||
427 | |||
428 | config UDBG_RTAS_CONSOLE | ||
429 | bool | ||
430 | default n | ||
422 | 431 | ||
423 | config XICS | 432 | config XICS |
424 | depends on PPC_PSERIES | 433 | depends on PPC_PSERIES |
@@ -431,7 +440,8 @@ config U3_DART | |||
431 | default n | 440 | default n |
432 | 441 | ||
433 | config MPIC | 442 | config MPIC |
434 | depends on PPC_PSERIES || PPC_PMAC || PPC_MAPLE || PPC_CHRP | 443 | depends on PPC_PSERIES || PPC_PMAC || PPC_MAPLE || PPC_CHRP \ |
444 | || MPC7448HPC2 | ||
435 | bool | 445 | bool |
436 | default y | 446 | default y |
437 | 447 | ||
@@ -557,6 +567,13 @@ config TAU_AVERAGE | |||
557 | /proc/cpuinfo. | 567 | /proc/cpuinfo. |
558 | 568 | ||
559 | If in doubt, say N here. | 569 | If in doubt, say N here. |
570 | |||
571 | config PPC_TODC | ||
572 | depends on EMBEDDED6xx | ||
573 | bool "Generic Time-of-day Clock (TODC) support" | ||
574 | ---help--- | ||
575 | This adds support for many TODC/RTC chips. | ||
576 | |||
560 | endmenu | 577 | endmenu |
561 | 578 | ||
562 | source arch/powerpc/platforms/embedded6xx/Kconfig | 579 | source arch/powerpc/platforms/embedded6xx/Kconfig |
@@ -618,6 +635,9 @@ config HOTPLUG_CPU | |||
618 | 635 | ||
619 | Say N if you are unsure. | 636 | Say N if you are unsure. |
620 | 637 | ||
638 | config ARCH_ENABLE_MEMORY_HOTPLUG | ||
639 | def_bool y | ||
640 | |||
621 | config KEXEC | 641 | config KEXEC |
622 | bool "kexec system call (EXPERIMENTAL)" | 642 | bool "kexec system call (EXPERIMENTAL)" |
623 | depends on PPC_MULTIPLATFORM && EXPERIMENTAL | 643 | depends on PPC_MULTIPLATFORM && EXPERIMENTAL |
@@ -794,7 +814,6 @@ config GENERIC_ISA_DMA | |||
794 | 814 | ||
795 | config PPC_I8259 | 815 | config PPC_I8259 |
796 | bool | 816 | bool |
797 | default y if MPC8641_HPCN | ||
798 | default n | 817 | default n |
799 | 818 | ||
800 | config PPC_INDIRECT_PCI | 819 | config PPC_INDIRECT_PCI |
@@ -817,7 +836,8 @@ config MCA | |||
817 | bool | 836 | bool |
818 | 837 | ||
819 | config PCI | 838 | config PCI |
820 | bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx || PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) | 839 | bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) \ |
840 | || MPC7448HPC2 | ||
821 | default y if !40x && !CPM2 && !8xx && !APUS && !PPC_83xx && !PPC_85xx && !PPC_86xx | 841 | default y if !40x && !CPM2 && !8xx && !APUS && !PPC_83xx && !PPC_85xx && !PPC_86xx |
822 | default PCI_PERMEDIA if !4xx && !CPM2 && !8xx && APUS | 842 | default PCI_PERMEDIA if !4xx && !CPM2 && !8xx && APUS |
823 | default PCI_QSPAN if !4xx && !CPM2 && 8xx | 843 | default PCI_QSPAN if !4xx && !CPM2 && 8xx |
diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index c69006ae8246..e29ef77d3b00 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug | |||
@@ -134,12 +134,19 @@ config PPC_EARLY_DEBUG_G5 | |||
134 | help | 134 | help |
135 | Select this to enable early debugging for Apple G5 machines. | 135 | Select this to enable early debugging for Apple G5 machines. |
136 | 136 | ||
137 | config PPC_EARLY_DEBUG_RTAS | 137 | config PPC_EARLY_DEBUG_RTAS_PANEL |
138 | bool "RTAS Panel" | 138 | bool "RTAS Panel" |
139 | depends on PPC_RTAS | 139 | depends on PPC_RTAS |
140 | help | 140 | help |
141 | Select this to enable early debugging via the RTAS panel. | 141 | Select this to enable early debugging via the RTAS panel. |
142 | 142 | ||
143 | config PPC_EARLY_DEBUG_RTAS_CONSOLE | ||
144 | bool "RTAS Console" | ||
145 | depends on PPC_RTAS | ||
146 | select UDBG_RTAS_CONSOLE | ||
147 | help | ||
148 | Select this to enable early debugging via the RTAS console. | ||
149 | |||
143 | config PPC_EARLY_DEBUG_MAPLE | 150 | config PPC_EARLY_DEBUG_MAPLE |
144 | bool "Maple real mode" | 151 | bool "Maple real mode" |
145 | depends on PPC_MAPLE | 152 | depends on PPC_MAPLE |
diff --git a/arch/powerpc/configs/cell_defconfig b/arch/powerpc/configs/cell_defconfig index b8b8d4675dc0..e028a2ecb8a3 100644 --- a/arch/powerpc/configs/cell_defconfig +++ b/arch/powerpc/configs/cell_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.17 | 3 | # Linux kernel version: 2.6.17-rc6 |
4 | # Mon Jun 19 17:23:03 2006 | 4 | # Thu Jun 22 15:28:36 2006 |
5 | # | 5 | # |
6 | CONFIG_PPC64=y | 6 | CONFIG_PPC64=y |
7 | CONFIG_64BIT=y | 7 | CONFIG_64BIT=y |
@@ -1063,7 +1063,8 @@ CONFIG_DEBUG_FS=y | |||
1063 | # CONFIG_DEBUG_STACKOVERFLOW is not set | 1063 | # CONFIG_DEBUG_STACKOVERFLOW is not set |
1064 | # CONFIG_DEBUG_STACK_USAGE is not set | 1064 | # CONFIG_DEBUG_STACK_USAGE is not set |
1065 | CONFIG_DEBUGGER=y | 1065 | CONFIG_DEBUGGER=y |
1066 | # CONFIG_XMON is not set | 1066 | CONFIG_XMON=y |
1067 | CONFIG_XMON_DEFAULT=y | ||
1067 | CONFIG_IRQSTACKS=y | 1068 | CONFIG_IRQSTACKS=y |
1068 | # CONFIG_BOOTX_TEXT is not set | 1069 | # CONFIG_BOOTX_TEXT is not set |
1069 | # CONFIG_PPC_EARLY_DEBUG is not set | 1070 | # CONFIG_PPC_EARLY_DEBUG is not set |
diff --git a/arch/powerpc/configs/mpc7448_hpc2_defconfig b/arch/powerpc/configs/mpc7448_hpc2_defconfig new file mode 100644 index 000000000000..15a50f4ceb1f --- /dev/null +++ b/arch/powerpc/configs/mpc7448_hpc2_defconfig | |||
@@ -0,0 +1,923 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.17-rc4 | ||
4 | # Sat May 27 18:45:55 2006 | ||
5 | # | ||
6 | # CONFIG_PPC64 is not set | ||
7 | CONFIG_PPC32=y | ||
8 | CONFIG_PPC_MERGE=y | ||
9 | CONFIG_MMU=y | ||
10 | CONFIG_GENERIC_HARDIRQS=y | ||
11 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | ||
12 | CONFIG_GENERIC_HWEIGHT=y | ||
13 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
14 | CONFIG_PPC=y | ||
15 | CONFIG_EARLY_PRINTK=y | ||
16 | CONFIG_GENERIC_NVRAM=y | ||
17 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | ||
18 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y | ||
19 | CONFIG_PPC_OF=y | ||
20 | CONFIG_PPC_UDBG_16550=y | ||
21 | # CONFIG_GENERIC_TBSYNC is not set | ||
22 | CONFIG_DEFAULT_UIMAGE=y | ||
23 | |||
24 | # | ||
25 | # Processor support | ||
26 | # | ||
27 | CONFIG_CLASSIC32=y | ||
28 | # CONFIG_PPC_52xx is not set | ||
29 | # CONFIG_PPC_82xx is not set | ||
30 | # CONFIG_PPC_83xx is not set | ||
31 | # CONFIG_PPC_85xx is not set | ||
32 | # CONFIG_40x is not set | ||
33 | # CONFIG_44x is not set | ||
34 | # CONFIG_8xx is not set | ||
35 | # CONFIG_E200 is not set | ||
36 | CONFIG_6xx=y | ||
37 | CONFIG_PPC_FPU=y | ||
38 | # CONFIG_ALTIVEC is not set | ||
39 | CONFIG_PPC_STD_MMU=y | ||
40 | CONFIG_PPC_STD_MMU_32=y | ||
41 | # CONFIG_SMP is not set | ||
42 | |||
43 | # | ||
44 | # Code maturity level options | ||
45 | # | ||
46 | CONFIG_EXPERIMENTAL=y | ||
47 | CONFIG_BROKEN_ON_SMP=y | ||
48 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
49 | |||
50 | # | ||
51 | # General setup | ||
52 | # | ||
53 | CONFIG_LOCALVERSION="" | ||
54 | CONFIG_LOCALVERSION_AUTO=y | ||
55 | CONFIG_SWAP=y | ||
56 | CONFIG_SYSVIPC=y | ||
57 | # CONFIG_POSIX_MQUEUE is not set | ||
58 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
59 | CONFIG_SYSCTL=y | ||
60 | # CONFIG_AUDIT is not set | ||
61 | # CONFIG_IKCONFIG is not set | ||
62 | # CONFIG_RELAY is not set | ||
63 | CONFIG_INITRAMFS_SOURCE="" | ||
64 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
65 | CONFIG_EMBEDDED=y | ||
66 | CONFIG_KALLSYMS=y | ||
67 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
68 | CONFIG_HOTPLUG=y | ||
69 | CONFIG_PRINTK=y | ||
70 | CONFIG_BUG=y | ||
71 | CONFIG_ELF_CORE=y | ||
72 | CONFIG_BASE_FULL=y | ||
73 | CONFIG_FUTEX=y | ||
74 | CONFIG_EPOLL=y | ||
75 | CONFIG_SHMEM=y | ||
76 | CONFIG_SLAB=y | ||
77 | # CONFIG_TINY_SHMEM is not set | ||
78 | CONFIG_BASE_SMALL=0 | ||
79 | # CONFIG_SLOB is not set | ||
80 | |||
81 | # | ||
82 | # Loadable module support | ||
83 | # | ||
84 | # CONFIG_MODULES is not set | ||
85 | |||
86 | # | ||
87 | # Block layer | ||
88 | # | ||
89 | CONFIG_LBD=y | ||
90 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
91 | # CONFIG_LSF is not set | ||
92 | |||
93 | # | ||
94 | # IO Schedulers | ||
95 | # | ||
96 | CONFIG_IOSCHED_NOOP=y | ||
97 | CONFIG_IOSCHED_AS=y | ||
98 | CONFIG_IOSCHED_DEADLINE=y | ||
99 | CONFIG_IOSCHED_CFQ=y | ||
100 | CONFIG_DEFAULT_AS=y | ||
101 | # CONFIG_DEFAULT_DEADLINE is not set | ||
102 | # CONFIG_DEFAULT_CFQ is not set | ||
103 | # CONFIG_DEFAULT_NOOP is not set | ||
104 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
105 | |||
106 | # | ||
107 | # Platform support | ||
108 | # | ||
109 | # CONFIG_PPC_MULTIPLATFORM is not set | ||
110 | # CONFIG_PPC_ISERIES is not set | ||
111 | CONFIG_EMBEDDED6xx=y | ||
112 | # CONFIG_APUS is not set | ||
113 | CONFIG_MPIC=y | ||
114 | # CONFIG_PPC_RTAS is not set | ||
115 | # CONFIG_MMIO_NVRAM is not set | ||
116 | # CONFIG_PPC_MPC106 is not set | ||
117 | # CONFIG_PPC_970_NAP is not set | ||
118 | # CONFIG_CPU_FREQ is not set | ||
119 | # CONFIG_TAU is not set | ||
120 | # CONFIG_KATANA is not set | ||
121 | # CONFIG_WILLOW is not set | ||
122 | # CONFIG_CPCI690 is not set | ||
123 | # CONFIG_POWERPMC250 is not set | ||
124 | # CONFIG_CHESTNUT is not set | ||
125 | # CONFIG_SPRUCE is not set | ||
126 | # CONFIG_HDPU is not set | ||
127 | # CONFIG_EV64260 is not set | ||
128 | # CONFIG_LOPEC is not set | ||
129 | # CONFIG_MVME5100 is not set | ||
130 | # CONFIG_PPLUS is not set | ||
131 | # CONFIG_PRPMC750 is not set | ||
132 | # CONFIG_PRPMC800 is not set | ||
133 | # CONFIG_SANDPOINT is not set | ||
134 | CONFIG_MPC7448HPC2=y | ||
135 | # CONFIG_RADSTONE_PPC7D is not set | ||
136 | # CONFIG_PAL4 is not set | ||
137 | # CONFIG_GEMINI is not set | ||
138 | # CONFIG_EST8260 is not set | ||
139 | # CONFIG_SBC82xx is not set | ||
140 | # CONFIG_SBS8260 is not set | ||
141 | # CONFIG_RPX8260 is not set | ||
142 | # CONFIG_TQM8260 is not set | ||
143 | # CONFIG_ADS8272 is not set | ||
144 | # CONFIG_PQ2FADS is not set | ||
145 | # CONFIG_LITE5200 is not set | ||
146 | # CONFIG_EV64360 is not set | ||
147 | CONFIG_TSI108_BRIDGE=y | ||
148 | # CONFIG_WANT_EARLY_SERIAL is not set | ||
149 | |||
150 | # | ||
151 | # Kernel options | ||
152 | # | ||
153 | # CONFIG_HIGHMEM is not set | ||
154 | # CONFIG_HZ_100 is not set | ||
155 | CONFIG_HZ_250=y | ||
156 | # CONFIG_HZ_1000 is not set | ||
157 | CONFIG_HZ=250 | ||
158 | CONFIG_PREEMPT_NONE=y | ||
159 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
160 | # CONFIG_PREEMPT is not set | ||
161 | CONFIG_BINFMT_ELF=y | ||
162 | CONFIG_BINFMT_MISC=y | ||
163 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
164 | CONFIG_SELECT_MEMORY_MODEL=y | ||
165 | CONFIG_FLATMEM_MANUAL=y | ||
166 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
167 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
168 | CONFIG_FLATMEM=y | ||
169 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
170 | # CONFIG_SPARSEMEM_STATIC is not set | ||
171 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
172 | CONFIG_PROC_DEVICETREE=y | ||
173 | # CONFIG_CMDLINE_BOOL is not set | ||
174 | # CONFIG_PM is not set | ||
175 | # CONFIG_SOFTWARE_SUSPEND is not set | ||
176 | # CONFIG_SECCOMP is not set | ||
177 | CONFIG_ISA_DMA_API=y | ||
178 | |||
179 | # | ||
180 | # Bus options | ||
181 | # | ||
182 | CONFIG_GENERIC_ISA_DMA=y | ||
183 | # CONFIG_PPC_I8259 is not set | ||
184 | # CONFIG_PPC_INDIRECT_PCI is not set | ||
185 | CONFIG_PCI=y | ||
186 | CONFIG_PCI_DOMAINS=y | ||
187 | |||
188 | # | ||
189 | # PCCARD (PCMCIA/CardBus) support | ||
190 | # | ||
191 | # CONFIG_PCCARD is not set | ||
192 | |||
193 | # | ||
194 | # PCI Hotplug Support | ||
195 | # | ||
196 | # CONFIG_HOTPLUG_PCI is not set | ||
197 | |||
198 | # | ||
199 | # Advanced setup | ||
200 | # | ||
201 | # CONFIG_ADVANCED_OPTIONS is not set | ||
202 | |||
203 | # | ||
204 | # Default settings for advanced configuration options are used | ||
205 | # | ||
206 | CONFIG_HIGHMEM_START=0xfe000000 | ||
207 | CONFIG_LOWMEM_SIZE=0x30000000 | ||
208 | CONFIG_KERNEL_START=0xc0000000 | ||
209 | CONFIG_TASK_SIZE=0x80000000 | ||
210 | CONFIG_BOOT_LOAD=0x00800000 | ||
211 | |||
212 | # | ||
213 | # Networking | ||
214 | # | ||
215 | CONFIG_NET=y | ||
216 | |||
217 | # | ||
218 | # Networking options | ||
219 | # | ||
220 | # CONFIG_NETDEBUG is not set | ||
221 | CONFIG_PACKET=y | ||
222 | # CONFIG_PACKET_MMAP is not set | ||
223 | CONFIG_UNIX=y | ||
224 | # CONFIG_NET_KEY is not set | ||
225 | CONFIG_INET=y | ||
226 | CONFIG_IP_MULTICAST=y | ||
227 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
228 | CONFIG_IP_FIB_HASH=y | ||
229 | CONFIG_IP_PNP=y | ||
230 | CONFIG_IP_PNP_DHCP=y | ||
231 | CONFIG_IP_PNP_BOOTP=y | ||
232 | # CONFIG_IP_PNP_RARP is not set | ||
233 | # CONFIG_NET_IPIP is not set | ||
234 | # CONFIG_NET_IPGRE is not set | ||
235 | # CONFIG_IP_MROUTE is not set | ||
236 | # CONFIG_ARPD is not set | ||
237 | CONFIG_SYN_COOKIES=y | ||
238 | # CONFIG_INET_AH is not set | ||
239 | # CONFIG_INET_ESP is not set | ||
240 | # CONFIG_INET_IPCOMP is not set | ||
241 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
242 | # CONFIG_INET_TUNNEL is not set | ||
243 | CONFIG_INET_DIAG=y | ||
244 | CONFIG_INET_TCP_DIAG=y | ||
245 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
246 | CONFIG_TCP_CONG_BIC=y | ||
247 | # CONFIG_IPV6 is not set | ||
248 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
249 | # CONFIG_INET6_TUNNEL is not set | ||
250 | # CONFIG_NETFILTER is not set | ||
251 | |||
252 | # | ||
253 | # DCCP Configuration (EXPERIMENTAL) | ||
254 | # | ||
255 | # CONFIG_IP_DCCP is not set | ||
256 | |||
257 | # | ||
258 | # SCTP Configuration (EXPERIMENTAL) | ||
259 | # | ||
260 | # CONFIG_IP_SCTP is not set | ||
261 | |||
262 | # | ||
263 | # TIPC Configuration (EXPERIMENTAL) | ||
264 | # | ||
265 | # CONFIG_TIPC is not set | ||
266 | # CONFIG_ATM is not set | ||
267 | # CONFIG_BRIDGE is not set | ||
268 | # CONFIG_VLAN_8021Q is not set | ||
269 | # CONFIG_DECNET is not set | ||
270 | # CONFIG_LLC2 is not set | ||
271 | # CONFIG_IPX is not set | ||
272 | # CONFIG_ATALK is not set | ||
273 | # CONFIG_X25 is not set | ||
274 | # CONFIG_LAPB is not set | ||
275 | # CONFIG_NET_DIVERT is not set | ||
276 | # CONFIG_ECONET is not set | ||
277 | # CONFIG_WAN_ROUTER is not set | ||
278 | |||
279 | # | ||
280 | # QoS and/or fair queueing | ||
281 | # | ||
282 | # CONFIG_NET_SCHED is not set | ||
283 | |||
284 | # | ||
285 | # Network testing | ||
286 | # | ||
287 | # CONFIG_NET_PKTGEN is not set | ||
288 | # CONFIG_HAMRADIO is not set | ||
289 | # CONFIG_IRDA is not set | ||
290 | # CONFIG_BT is not set | ||
291 | # CONFIG_IEEE80211 is not set | ||
292 | |||
293 | # | ||
294 | # Device Drivers | ||
295 | # | ||
296 | |||
297 | # | ||
298 | # Generic Driver Options | ||
299 | # | ||
300 | CONFIG_STANDALONE=y | ||
301 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
302 | # CONFIG_FW_LOADER is not set | ||
303 | |||
304 | # | ||
305 | # Connector - unified userspace <-> kernelspace linker | ||
306 | # | ||
307 | # CONFIG_CONNECTOR is not set | ||
308 | |||
309 | # | ||
310 | # Memory Technology Devices (MTD) | ||
311 | # | ||
312 | # CONFIG_MTD is not set | ||
313 | |||
314 | # | ||
315 | # Parallel port support | ||
316 | # | ||
317 | # CONFIG_PARPORT is not set | ||
318 | |||
319 | # | ||
320 | # Plug and Play support | ||
321 | # | ||
322 | |||
323 | # | ||
324 | # Block devices | ||
325 | # | ||
326 | # CONFIG_BLK_DEV_FD is not set | ||
327 | # CONFIG_BLK_CPQ_DA is not set | ||
328 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
329 | # CONFIG_BLK_DEV_DAC960 is not set | ||
330 | # CONFIG_BLK_DEV_UMEM is not set | ||
331 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
332 | CONFIG_BLK_DEV_LOOP=y | ||
333 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
334 | # CONFIG_BLK_DEV_NBD is not set | ||
335 | # CONFIG_BLK_DEV_SX8 is not set | ||
336 | CONFIG_BLK_DEV_RAM=y | ||
337 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
338 | CONFIG_BLK_DEV_RAM_SIZE=131072 | ||
339 | CONFIG_BLK_DEV_INITRD=y | ||
340 | # CONFIG_CDROM_PKTCDVD is not set | ||
341 | # CONFIG_ATA_OVER_ETH is not set | ||
342 | |||
343 | # | ||
344 | # ATA/ATAPI/MFM/RLL support | ||
345 | # | ||
346 | # CONFIG_IDE is not set | ||
347 | |||
348 | # | ||
349 | # SCSI device support | ||
350 | # | ||
351 | # CONFIG_RAID_ATTRS is not set | ||
352 | CONFIG_SCSI=y | ||
353 | CONFIG_SCSI_PROC_FS=y | ||
354 | |||
355 | # | ||
356 | # SCSI support type (disk, tape, CD-ROM) | ||
357 | # | ||
358 | CONFIG_BLK_DEV_SD=y | ||
359 | # CONFIG_CHR_DEV_ST is not set | ||
360 | # CONFIG_CHR_DEV_OSST is not set | ||
361 | # CONFIG_BLK_DEV_SR is not set | ||
362 | # CONFIG_CHR_DEV_SG is not set | ||
363 | # CONFIG_CHR_DEV_SCH is not set | ||
364 | |||
365 | # | ||
366 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
367 | # | ||
368 | # CONFIG_SCSI_MULTI_LUN is not set | ||
369 | # CONFIG_SCSI_CONSTANTS is not set | ||
370 | # CONFIG_SCSI_LOGGING is not set | ||
371 | |||
372 | # | ||
373 | # SCSI Transport Attributes | ||
374 | # | ||
375 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
376 | # CONFIG_SCSI_FC_ATTRS is not set | ||
377 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
378 | # CONFIG_SCSI_SAS_ATTRS is not set | ||
379 | |||
380 | # | ||
381 | # SCSI low-level drivers | ||
382 | # | ||
383 | # CONFIG_ISCSI_TCP is not set | ||
384 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | ||
385 | # CONFIG_SCSI_3W_9XXX is not set | ||
386 | # CONFIG_SCSI_ACARD is not set | ||
387 | # CONFIG_SCSI_AACRAID is not set | ||
388 | # CONFIG_SCSI_AIC7XXX is not set | ||
389 | # CONFIG_SCSI_AIC7XXX_OLD is not set | ||
390 | # CONFIG_SCSI_AIC79XX is not set | ||
391 | # CONFIG_SCSI_DPT_I2O is not set | ||
392 | # CONFIG_MEGARAID_NEWGEN is not set | ||
393 | # CONFIG_MEGARAID_LEGACY is not set | ||
394 | # CONFIG_MEGARAID_SAS is not set | ||
395 | CONFIG_SCSI_SATA=y | ||
396 | # CONFIG_SCSI_SATA_AHCI is not set | ||
397 | # CONFIG_SCSI_SATA_SVW is not set | ||
398 | # CONFIG_SCSI_ATA_PIIX is not set | ||
399 | CONFIG_SCSI_SATA_MV=y | ||
400 | # CONFIG_SCSI_SATA_NV is not set | ||
401 | # CONFIG_SCSI_PDC_ADMA is not set | ||
402 | # CONFIG_SCSI_SATA_QSTOR is not set | ||
403 | # CONFIG_SCSI_SATA_PROMISE is not set | ||
404 | # CONFIG_SCSI_SATA_SX4 is not set | ||
405 | # CONFIG_SCSI_SATA_SIL is not set | ||
406 | # CONFIG_SCSI_SATA_SIL24 is not set | ||
407 | # CONFIG_SCSI_SATA_SIS is not set | ||
408 | # CONFIG_SCSI_SATA_ULI is not set | ||
409 | # CONFIG_SCSI_SATA_VIA is not set | ||
410 | # CONFIG_SCSI_SATA_VITESSE is not set | ||
411 | # CONFIG_SCSI_BUSLOGIC is not set | ||
412 | # CONFIG_SCSI_DMX3191D is not set | ||
413 | # CONFIG_SCSI_EATA is not set | ||
414 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
415 | # CONFIG_SCSI_GDTH is not set | ||
416 | # CONFIG_SCSI_IPS is not set | ||
417 | # CONFIG_SCSI_INITIO is not set | ||
418 | # CONFIG_SCSI_INIA100 is not set | ||
419 | # CONFIG_SCSI_SYM53C8XX_2 is not set | ||
420 | # CONFIG_SCSI_IPR is not set | ||
421 | # CONFIG_SCSI_QLOGIC_1280 is not set | ||
422 | # CONFIG_SCSI_QLA_FC is not set | ||
423 | # CONFIG_SCSI_LPFC is not set | ||
424 | # CONFIG_SCSI_DC395x is not set | ||
425 | # CONFIG_SCSI_DC390T is not set | ||
426 | # CONFIG_SCSI_NSP32 is not set | ||
427 | # CONFIG_SCSI_DEBUG is not set | ||
428 | |||
429 | # | ||
430 | # Multi-device support (RAID and LVM) | ||
431 | # | ||
432 | # CONFIG_MD is not set | ||
433 | |||
434 | # | ||
435 | # Fusion MPT device support | ||
436 | # | ||
437 | # CONFIG_FUSION is not set | ||
438 | # CONFIG_FUSION_SPI is not set | ||
439 | # CONFIG_FUSION_FC is not set | ||
440 | # CONFIG_FUSION_SAS is not set | ||
441 | |||
442 | # | ||
443 | # IEEE 1394 (FireWire) support | ||
444 | # | ||
445 | # CONFIG_IEEE1394 is not set | ||
446 | |||
447 | # | ||
448 | # I2O device support | ||
449 | # | ||
450 | # CONFIG_I2O is not set | ||
451 | |||
452 | # | ||
453 | # Macintosh device drivers | ||
454 | # | ||
455 | # CONFIG_WINDFARM is not set | ||
456 | |||
457 | # | ||
458 | # Network device support | ||
459 | # | ||
460 | CONFIG_NETDEVICES=y | ||
461 | # CONFIG_DUMMY is not set | ||
462 | # CONFIG_BONDING is not set | ||
463 | # CONFIG_EQUALIZER is not set | ||
464 | # CONFIG_TUN is not set | ||
465 | |||
466 | # | ||
467 | # ARCnet devices | ||
468 | # | ||
469 | # CONFIG_ARCNET is not set | ||
470 | |||
471 | # | ||
472 | # PHY device support | ||
473 | # | ||
474 | CONFIG_PHYLIB=y | ||
475 | |||
476 | # | ||
477 | # MII PHY device drivers | ||
478 | # | ||
479 | # CONFIG_MARVELL_PHY is not set | ||
480 | # CONFIG_DAVICOM_PHY is not set | ||
481 | # CONFIG_QSEMI_PHY is not set | ||
482 | # CONFIG_LXT_PHY is not set | ||
483 | # CONFIG_CICADA_PHY is not set | ||
484 | |||
485 | # | ||
486 | # Ethernet (10 or 100Mbit) | ||
487 | # | ||
488 | CONFIG_NET_ETHERNET=y | ||
489 | CONFIG_MII=y | ||
490 | # CONFIG_HAPPYMEAL is not set | ||
491 | # CONFIG_SUNGEM is not set | ||
492 | # CONFIG_CASSINI is not set | ||
493 | # CONFIG_NET_VENDOR_3COM is not set | ||
494 | |||
495 | # | ||
496 | # Tulip family network device support | ||
497 | # | ||
498 | # CONFIG_NET_TULIP is not set | ||
499 | # CONFIG_HP100 is not set | ||
500 | CONFIG_NET_PCI=y | ||
501 | # CONFIG_PCNET32 is not set | ||
502 | # CONFIG_AMD8111_ETH is not set | ||
503 | # CONFIG_ADAPTEC_STARFIRE is not set | ||
504 | # CONFIG_B44 is not set | ||
505 | # CONFIG_FORCEDETH is not set | ||
506 | # CONFIG_DGRS is not set | ||
507 | # CONFIG_EEPRO100 is not set | ||
508 | CONFIG_E100=y | ||
509 | # CONFIG_FEALNX is not set | ||
510 | # CONFIG_NATSEMI is not set | ||
511 | # CONFIG_NE2K_PCI is not set | ||
512 | # CONFIG_8139CP is not set | ||
513 | CONFIG_8139TOO=y | ||
514 | # CONFIG_8139TOO_PIO is not set | ||
515 | # CONFIG_8139TOO_TUNE_TWISTER is not set | ||
516 | # CONFIG_8139TOO_8129 is not set | ||
517 | # CONFIG_8139_OLD_RX_RESET is not set | ||
518 | # CONFIG_SIS900 is not set | ||
519 | # CONFIG_EPIC100 is not set | ||
520 | # CONFIG_SUNDANCE is not set | ||
521 | # CONFIG_TLAN is not set | ||
522 | # CONFIG_VIA_RHINE is not set | ||
523 | |||
524 | # | ||
525 | # Ethernet (1000 Mbit) | ||
526 | # | ||
527 | # CONFIG_ACENIC is not set | ||
528 | # CONFIG_DL2K is not set | ||
529 | # CONFIG_E1000 is not set | ||
530 | # CONFIG_NS83820 is not set | ||
531 | # CONFIG_HAMACHI is not set | ||
532 | # CONFIG_YELLOWFIN is not set | ||
533 | # CONFIG_R8169 is not set | ||
534 | # CONFIG_SIS190 is not set | ||
535 | # CONFIG_SKGE is not set | ||
536 | # CONFIG_SKY2 is not set | ||
537 | # CONFIG_SK98LIN is not set | ||
538 | # CONFIG_VIA_VELOCITY is not set | ||
539 | # CONFIG_TIGON3 is not set | ||
540 | # CONFIG_BNX2 is not set | ||
541 | CONFIG_TSI108_ETH=y | ||
542 | |||
543 | # | ||
544 | # Ethernet (10000 Mbit) | ||
545 | # | ||
546 | # CONFIG_CHELSIO_T1 is not set | ||
547 | # CONFIG_IXGB is not set | ||
548 | # CONFIG_S2IO is not set | ||
549 | |||
550 | # | ||
551 | # Token Ring devices | ||
552 | # | ||
553 | # CONFIG_TR is not set | ||
554 | |||
555 | # | ||
556 | # Wireless LAN (non-hamradio) | ||
557 | # | ||
558 | # CONFIG_NET_RADIO is not set | ||
559 | |||
560 | # | ||
561 | # Wan interfaces | ||
562 | # | ||
563 | # CONFIG_WAN is not set | ||
564 | # CONFIG_FDDI is not set | ||
565 | # CONFIG_HIPPI is not set | ||
566 | # CONFIG_PPP is not set | ||
567 | # CONFIG_SLIP is not set | ||
568 | # CONFIG_NET_FC is not set | ||
569 | # CONFIG_SHAPER is not set | ||
570 | # CONFIG_NETCONSOLE is not set | ||
571 | # CONFIG_NETPOLL is not set | ||
572 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
573 | |||
574 | # | ||
575 | # ISDN subsystem | ||
576 | # | ||
577 | # CONFIG_ISDN is not set | ||
578 | |||
579 | # | ||
580 | # Telephony Support | ||
581 | # | ||
582 | # CONFIG_PHONE is not set | ||
583 | |||
584 | # | ||
585 | # Input device support | ||
586 | # | ||
587 | CONFIG_INPUT=y | ||
588 | |||
589 | # | ||
590 | # Userland interfaces | ||
591 | # | ||
592 | # CONFIG_INPUT_MOUSEDEV is not set | ||
593 | # CONFIG_INPUT_JOYDEV is not set | ||
594 | # CONFIG_INPUT_TSDEV is not set | ||
595 | # CONFIG_INPUT_EVDEV is not set | ||
596 | # CONFIG_INPUT_EVBUG is not set | ||
597 | |||
598 | # | ||
599 | # Input Device Drivers | ||
600 | # | ||
601 | # CONFIG_INPUT_KEYBOARD is not set | ||
602 | # CONFIG_INPUT_MOUSE is not set | ||
603 | # CONFIG_INPUT_JOYSTICK is not set | ||
604 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
605 | # CONFIG_INPUT_MISC is not set | ||
606 | |||
607 | # | ||
608 | # Hardware I/O ports | ||
609 | # | ||
610 | # CONFIG_SERIO is not set | ||
611 | # CONFIG_GAMEPORT is not set | ||
612 | |||
613 | # | ||
614 | # Character devices | ||
615 | # | ||
616 | # CONFIG_VT is not set | ||
617 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
618 | |||
619 | # | ||
620 | # Serial drivers | ||
621 | # | ||
622 | CONFIG_SERIAL_8250=y | ||
623 | CONFIG_SERIAL_8250_CONSOLE=y | ||
624 | CONFIG_SERIAL_8250_PCI=y | ||
625 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
626 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
627 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
628 | |||
629 | # | ||
630 | # Non-8250 serial port support | ||
631 | # | ||
632 | CONFIG_SERIAL_CORE=y | ||
633 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
634 | # CONFIG_SERIAL_JSM is not set | ||
635 | CONFIG_UNIX98_PTYS=y | ||
636 | CONFIG_LEGACY_PTYS=y | ||
637 | CONFIG_LEGACY_PTY_COUNT=256 | ||
638 | |||
639 | # | ||
640 | # IPMI | ||
641 | # | ||
642 | # CONFIG_IPMI_HANDLER is not set | ||
643 | |||
644 | # | ||
645 | # Watchdog Cards | ||
646 | # | ||
647 | # CONFIG_WATCHDOG is not set | ||
648 | # CONFIG_NVRAM is not set | ||
649 | CONFIG_GEN_RTC=y | ||
650 | # CONFIG_GEN_RTC_X is not set | ||
651 | # CONFIG_DTLK is not set | ||
652 | # CONFIG_R3964 is not set | ||
653 | # CONFIG_APPLICOM is not set | ||
654 | |||
655 | # | ||
656 | # Ftape, the floppy tape device driver | ||
657 | # | ||
658 | # CONFIG_AGP is not set | ||
659 | # CONFIG_DRM is not set | ||
660 | # CONFIG_RAW_DRIVER is not set | ||
661 | |||
662 | # | ||
663 | # TPM devices | ||
664 | # | ||
665 | # CONFIG_TCG_TPM is not set | ||
666 | # CONFIG_TELCLOCK is not set | ||
667 | |||
668 | # | ||
669 | # I2C support | ||
670 | # | ||
671 | # CONFIG_I2C is not set | ||
672 | |||
673 | # | ||
674 | # SPI support | ||
675 | # | ||
676 | # CONFIG_SPI is not set | ||
677 | # CONFIG_SPI_MASTER is not set | ||
678 | |||
679 | # | ||
680 | # Dallas's 1-wire bus | ||
681 | # | ||
682 | # CONFIG_W1 is not set | ||
683 | |||
684 | # | ||
685 | # Hardware Monitoring support | ||
686 | # | ||
687 | CONFIG_HWMON=y | ||
688 | # CONFIG_HWMON_VID is not set | ||
689 | # CONFIG_SENSORS_F71805F is not set | ||
690 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
691 | |||
692 | # | ||
693 | # Misc devices | ||
694 | # | ||
695 | |||
696 | # | ||
697 | # Multimedia devices | ||
698 | # | ||
699 | # CONFIG_VIDEO_DEV is not set | ||
700 | |||
701 | # | ||
702 | # Digital Video Broadcasting Devices | ||
703 | # | ||
704 | # CONFIG_DVB is not set | ||
705 | |||
706 | # | ||
707 | # Graphics support | ||
708 | # | ||
709 | # CONFIG_FB is not set | ||
710 | |||
711 | # | ||
712 | # Sound | ||
713 | # | ||
714 | # CONFIG_SOUND is not set | ||
715 | |||
716 | # | ||
717 | # USB support | ||
718 | # | ||
719 | CONFIG_USB_ARCH_HAS_HCD=y | ||
720 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
721 | CONFIG_USB_ARCH_HAS_EHCI=y | ||
722 | # CONFIG_USB is not set | ||
723 | |||
724 | # | ||
725 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
726 | # | ||
727 | |||
728 | # | ||
729 | # USB Gadget Support | ||
730 | # | ||
731 | # CONFIG_USB_GADGET is not set | ||
732 | |||
733 | # | ||
734 | # MMC/SD Card support | ||
735 | # | ||
736 | # CONFIG_MMC is not set | ||
737 | |||
738 | # | ||
739 | # LED devices | ||
740 | # | ||
741 | # CONFIG_NEW_LEDS is not set | ||
742 | |||
743 | # | ||
744 | # LED drivers | ||
745 | # | ||
746 | |||
747 | # | ||
748 | # LED Triggers | ||
749 | # | ||
750 | |||
751 | # | ||
752 | # InfiniBand support | ||
753 | # | ||
754 | # CONFIG_INFINIBAND is not set | ||
755 | |||
756 | # | ||
757 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) | ||
758 | # | ||
759 | |||
760 | # | ||
761 | # Real Time Clock | ||
762 | # | ||
763 | # CONFIG_RTC_CLASS is not set | ||
764 | |||
765 | # | ||
766 | # File systems | ||
767 | # | ||
768 | CONFIG_EXT2_FS=y | ||
769 | # CONFIG_EXT2_FS_XATTR is not set | ||
770 | # CONFIG_EXT2_FS_XIP is not set | ||
771 | CONFIG_EXT3_FS=y | ||
772 | CONFIG_EXT3_FS_XATTR=y | ||
773 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
774 | # CONFIG_EXT3_FS_SECURITY is not set | ||
775 | CONFIG_JBD=y | ||
776 | # CONFIG_JBD_DEBUG is not set | ||
777 | CONFIG_FS_MBCACHE=y | ||
778 | # CONFIG_REISERFS_FS is not set | ||
779 | # CONFIG_JFS_FS is not set | ||
780 | # CONFIG_FS_POSIX_ACL is not set | ||
781 | # CONFIG_XFS_FS is not set | ||
782 | # CONFIG_OCFS2_FS is not set | ||
783 | # CONFIG_MINIX_FS is not set | ||
784 | # CONFIG_ROMFS_FS is not set | ||
785 | CONFIG_INOTIFY=y | ||
786 | # CONFIG_QUOTA is not set | ||
787 | CONFIG_DNOTIFY=y | ||
788 | # CONFIG_AUTOFS_FS is not set | ||
789 | # CONFIG_AUTOFS4_FS is not set | ||
790 | # CONFIG_FUSE_FS is not set | ||
791 | |||
792 | # | ||
793 | # CD-ROM/DVD Filesystems | ||
794 | # | ||
795 | # CONFIG_ISO9660_FS is not set | ||
796 | # CONFIG_UDF_FS is not set | ||
797 | |||
798 | # | ||
799 | # DOS/FAT/NT Filesystems | ||
800 | # | ||
801 | # CONFIG_MSDOS_FS is not set | ||
802 | # CONFIG_VFAT_FS is not set | ||
803 | # CONFIG_NTFS_FS is not set | ||
804 | |||
805 | # | ||
806 | # Pseudo filesystems | ||
807 | # | ||
808 | CONFIG_PROC_FS=y | ||
809 | CONFIG_PROC_KCORE=y | ||
810 | CONFIG_SYSFS=y | ||
811 | CONFIG_TMPFS=y | ||
812 | # CONFIG_HUGETLB_PAGE is not set | ||
813 | CONFIG_RAMFS=y | ||
814 | # CONFIG_CONFIGFS_FS is not set | ||
815 | |||
816 | # | ||
817 | # Miscellaneous filesystems | ||
818 | # | ||
819 | # CONFIG_ADFS_FS is not set | ||
820 | # CONFIG_AFFS_FS is not set | ||
821 | # CONFIG_HFS_FS is not set | ||
822 | # CONFIG_HFSPLUS_FS is not set | ||
823 | # CONFIG_BEFS_FS is not set | ||
824 | # CONFIG_BFS_FS is not set | ||
825 | # CONFIG_EFS_FS is not set | ||
826 | # CONFIG_CRAMFS is not set | ||
827 | # CONFIG_VXFS_FS is not set | ||
828 | # CONFIG_HPFS_FS is not set | ||
829 | # CONFIG_QNX4FS_FS is not set | ||
830 | # CONFIG_SYSV_FS is not set | ||
831 | # CONFIG_UFS_FS is not set | ||
832 | |||
833 | # | ||
834 | # Network File Systems | ||
835 | # | ||
836 | CONFIG_NFS_FS=y | ||
837 | # CONFIG_NFS_V3 is not set | ||
838 | # CONFIG_NFS_V4 is not set | ||
839 | # CONFIG_NFS_DIRECTIO is not set | ||
840 | # CONFIG_NFSD is not set | ||
841 | CONFIG_ROOT_NFS=y | ||
842 | CONFIG_LOCKD=y | ||
843 | CONFIG_NFS_COMMON=y | ||
844 | CONFIG_SUNRPC=y | ||
845 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
846 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
847 | # CONFIG_SMB_FS is not set | ||
848 | # CONFIG_CIFS is not set | ||
849 | # CONFIG_NCP_FS is not set | ||
850 | # CONFIG_CODA_FS is not set | ||
851 | # CONFIG_AFS_FS is not set | ||
852 | # CONFIG_9P_FS is not set | ||
853 | |||
854 | # | ||
855 | # Partition Types | ||
856 | # | ||
857 | CONFIG_PARTITION_ADVANCED=y | ||
858 | # CONFIG_ACORN_PARTITION is not set | ||
859 | # CONFIG_OSF_PARTITION is not set | ||
860 | # CONFIG_AMIGA_PARTITION is not set | ||
861 | # CONFIG_ATARI_PARTITION is not set | ||
862 | # CONFIG_MAC_PARTITION is not set | ||
863 | CONFIG_MSDOS_PARTITION=y | ||
864 | # CONFIG_BSD_DISKLABEL is not set | ||
865 | # CONFIG_MINIX_SUBPARTITION is not set | ||
866 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
867 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
868 | # CONFIG_LDM_PARTITION is not set | ||
869 | # CONFIG_SGI_PARTITION is not set | ||
870 | # CONFIG_ULTRIX_PARTITION is not set | ||
871 | # CONFIG_SUN_PARTITION is not set | ||
872 | # CONFIG_KARMA_PARTITION is not set | ||
873 | # CONFIG_EFI_PARTITION is not set | ||
874 | |||
875 | # | ||
876 | # Native Language Support | ||
877 | # | ||
878 | # CONFIG_NLS is not set | ||
879 | |||
880 | # | ||
881 | # Library routines | ||
882 | # | ||
883 | # CONFIG_CRC_CCITT is not set | ||
884 | # CONFIG_CRC16 is not set | ||
885 | CONFIG_CRC32=y | ||
886 | # CONFIG_LIBCRC32C is not set | ||
887 | |||
888 | # | ||
889 | # Instrumentation Support | ||
890 | # | ||
891 | # CONFIG_PROFILING is not set | ||
892 | |||
893 | # | ||
894 | # Kernel hacking | ||
895 | # | ||
896 | # CONFIG_PRINTK_TIME is not set | ||
897 | # CONFIG_MAGIC_SYSRQ is not set | ||
898 | # CONFIG_DEBUG_KERNEL is not set | ||
899 | CONFIG_LOG_BUF_SHIFT=14 | ||
900 | # CONFIG_DEBUG_FS is not set | ||
901 | # CONFIG_UNWIND_INFO is not set | ||
902 | # CONFIG_BOOTX_TEXT is not set | ||
903 | # CONFIG_SERIAL_TEXT_DEBUG is not set | ||
904 | # CONFIG_PPC_EARLY_DEBUG_LPAR is not set | ||
905 | # CONFIG_PPC_EARLY_DEBUG_G5 is not set | ||
906 | # CONFIG_PPC_EARLY_DEBUG_RTAS is not set | ||
907 | # CONFIG_PPC_EARLY_DEBUG_MAPLE is not set | ||
908 | # CONFIG_PPC_EARLY_DEBUG_ISERIES is not set | ||
909 | |||
910 | # | ||
911 | # Security options | ||
912 | # | ||
913 | # CONFIG_KEYS is not set | ||
914 | # CONFIG_SECURITY is not set | ||
915 | |||
916 | # | ||
917 | # Cryptographic options | ||
918 | # | ||
919 | # CONFIG_CRYPTO is not set | ||
920 | |||
921 | # | ||
922 | # Hardware crypto devices | ||
923 | # | ||
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 803858e86160..814f242aeb8c 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
@@ -50,7 +50,8 @@ extra-$(CONFIG_FSL_BOOKE) := head_fsl_booke.o | |||
50 | extra-$(CONFIG_8xx) := head_8xx.o | 50 | extra-$(CONFIG_8xx) := head_8xx.o |
51 | extra-y += vmlinux.lds | 51 | extra-y += vmlinux.lds |
52 | 52 | ||
53 | obj-y += time.o prom.o traps.o setup-common.o udbg.o | 53 | obj-y += time.o prom.o traps.o setup-common.o \ |
54 | udbg.o misc.o | ||
54 | obj-$(CONFIG_PPC32) += entry_32.o setup_32.o misc_32.o | 55 | obj-$(CONFIG_PPC32) += entry_32.o setup_32.o misc_32.o |
55 | obj-$(CONFIG_PPC64) += misc_64.o dma_64.o iommu.o | 56 | obj-$(CONFIG_PPC64) += misc_64.o dma_64.o iommu.o |
56 | obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o | 57 | obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o |
diff --git a/arch/powerpc/kernel/cpu_setup_power4.S b/arch/powerpc/kernel/cpu_setup_power4.S index 271418308d53..1fc863261003 100644 --- a/arch/powerpc/kernel/cpu_setup_power4.S +++ b/arch/powerpc/kernel/cpu_setup_power4.S | |||
@@ -125,7 +125,12 @@ _GLOBAL(__save_cpu_setup) | |||
125 | cmpwi r0,0x44 | 125 | cmpwi r0,0x44 |
126 | bne 2f | 126 | bne 2f |
127 | 127 | ||
128 | 1: /* Save HID0,1,4 and 5 */ | 128 | 1: /* skip if not running in HV mode */ |
129 | mfmsr r0 | ||
130 | rldicl. r0,r0,4,63 | ||
131 | beq 2f | ||
132 | |||
133 | /* Save HID0,1,4 and 5 */ | ||
129 | mfspr r3,SPRN_HID0 | 134 | mfspr r3,SPRN_HID0 |
130 | std r3,CS_HID0(r5) | 135 | std r3,CS_HID0(r5) |
131 | mfspr r3,SPRN_HID1 | 136 | mfspr r3,SPRN_HID1 |
@@ -159,7 +164,12 @@ _GLOBAL(__restore_cpu_setup) | |||
159 | cmpwi r0,0x44 | 164 | cmpwi r0,0x44 |
160 | bnelr | 165 | bnelr |
161 | 166 | ||
162 | 1: /* Before accessing memory, we make sure rm_ci is clear */ | 167 | 1: /* skip if not running in HV mode */ |
168 | mfmsr r0 | ||
169 | rldicl. r0,r0,4,63 | ||
170 | beqlr | ||
171 | |||
172 | /* Before accessing memory, we make sure rm_ci is clear */ | ||
163 | li r0,0 | 173 | li r0,0 |
164 | mfspr r3,SPRN_HID4 | 174 | mfspr r3,SPRN_HID4 |
165 | rldimi r3,r0,40,23 /* clear bit 23 (rm_ci) */ | 175 | rldimi r3,r0,40,23 /* clear bit 23 (rm_ci) */ |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 1c114880dc05..abf7d42a8b07 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -722,18 +722,6 @@ struct cpu_spec cpu_specs[] = { | |||
722 | .oprofile_type = PPC_OPROFILE_G4, | 722 | .oprofile_type = PPC_OPROFILE_G4, |
723 | .platform = "ppc7450", | 723 | .platform = "ppc7450", |
724 | }, | 724 | }, |
725 | { /* 8641 */ | ||
726 | .pvr_mask = 0xffffffff, | ||
727 | .pvr_value = 0x80040010, | ||
728 | .cpu_name = "8641", | ||
729 | .cpu_features = CPU_FTRS_7447A, | ||
730 | .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP, | ||
731 | .icache_bsize = 32, | ||
732 | .dcache_bsize = 32, | ||
733 | .num_pmcs = 6, | ||
734 | .cpu_setup = __setup_cpu_745x | ||
735 | }, | ||
736 | |||
737 | { /* 82xx (8240, 8245, 8260 are all 603e cores) */ | 725 | { /* 82xx (8240, 8245, 8260 are all 603e cores) */ |
738 | .pvr_mask = 0x7fff0000, | 726 | .pvr_mask = 0x7fff0000, |
739 | .pvr_value = 0x00810000, | 727 | .pvr_value = 0x00810000, |
diff --git a/arch/powerpc/kernel/crash.c b/arch/powerpc/kernel/crash.c index e253a45dcf10..358cecdc6aef 100644 --- a/arch/powerpc/kernel/crash.c +++ b/arch/powerpc/kernel/crash.c | |||
@@ -24,9 +24,11 @@ | |||
24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
25 | #include <linux/irq.h> | 25 | #include <linux/irq.h> |
26 | #include <linux/types.h> | 26 | #include <linux/types.h> |
27 | #include <linux/irq.h> | ||
27 | 28 | ||
28 | #include <asm/processor.h> | 29 | #include <asm/processor.h> |
29 | #include <asm/machdep.h> | 30 | #include <asm/machdep.h> |
31 | #include <asm/kexec.h> | ||
30 | #include <asm/kdump.h> | 32 | #include <asm/kdump.h> |
31 | #include <asm/lmb.h> | 33 | #include <asm/lmb.h> |
32 | #include <asm/firmware.h> | 34 | #include <asm/firmware.h> |
@@ -41,6 +43,7 @@ | |||
41 | 43 | ||
42 | /* This keeps a track of which one is crashing cpu. */ | 44 | /* This keeps a track of which one is crashing cpu. */ |
43 | int crashing_cpu = -1; | 45 | int crashing_cpu = -1; |
46 | static cpumask_t cpus_in_crash = CPU_MASK_NONE; | ||
44 | 47 | ||
45 | static u32 *append_elf_note(u32 *buf, char *name, unsigned type, void *data, | 48 | static u32 *append_elf_note(u32 *buf, char *name, unsigned type, void *data, |
46 | size_t data_len) | 49 | size_t data_len) |
@@ -98,34 +101,66 @@ static void crash_save_this_cpu(struct pt_regs *regs, int cpu) | |||
98 | } | 101 | } |
99 | 102 | ||
100 | #ifdef CONFIG_SMP | 103 | #ifdef CONFIG_SMP |
101 | static atomic_t waiting_for_crash_ipi; | 104 | static atomic_t enter_on_soft_reset = ATOMIC_INIT(0); |
102 | 105 | ||
103 | void crash_ipi_callback(struct pt_regs *regs) | 106 | void crash_ipi_callback(struct pt_regs *regs) |
104 | { | 107 | { |
105 | int cpu = smp_processor_id(); | 108 | int cpu = smp_processor_id(); |
106 | 109 | ||
107 | if (cpu == crashing_cpu) | ||
108 | return; | ||
109 | |||
110 | if (!cpu_online(cpu)) | 110 | if (!cpu_online(cpu)) |
111 | return; | 111 | return; |
112 | 112 | ||
113 | if (ppc_md.kexec_cpu_down) | ||
114 | ppc_md.kexec_cpu_down(1, 1); | ||
115 | |||
116 | local_irq_disable(); | 113 | local_irq_disable(); |
114 | if (!cpu_isset(cpu, cpus_in_crash)) | ||
115 | crash_save_this_cpu(regs, cpu); | ||
116 | cpu_set(cpu, cpus_in_crash); | ||
117 | 117 | ||
118 | crash_save_this_cpu(regs, cpu); | 118 | /* |
119 | atomic_dec(&waiting_for_crash_ipi); | 119 | * Entered via soft-reset - could be the kdump |
120 | * process is invoked using soft-reset or user activated | ||
121 | * it if some CPU did not respond to an IPI. | ||
122 | * For soft-reset, the secondary CPU can enter this func | ||
123 | * twice. 1 - using IPI, and 2. soft-reset. | ||
124 | * Tell the kexec CPU that entered via soft-reset and ready | ||
125 | * to go down. | ||
126 | */ | ||
127 | if (cpu_isset(cpu, cpus_in_sr)) { | ||
128 | cpu_clear(cpu, cpus_in_sr); | ||
129 | atomic_inc(&enter_on_soft_reset); | ||
130 | } | ||
131 | |||
132 | /* | ||
133 | * Starting the kdump boot. | ||
134 | * This barrier is needed to make sure that all CPUs are stopped. | ||
135 | * If not, soft-reset will be invoked to bring other CPUs. | ||
136 | */ | ||
137 | while (!cpu_isset(crashing_cpu, cpus_in_crash)) | ||
138 | cpu_relax(); | ||
139 | |||
140 | if (ppc_md.kexec_cpu_down) | ||
141 | ppc_md.kexec_cpu_down(1, 1); | ||
120 | kexec_smp_wait(); | 142 | kexec_smp_wait(); |
121 | /* NOTREACHED */ | 143 | /* NOTREACHED */ |
122 | } | 144 | } |
123 | 145 | ||
124 | static void crash_kexec_prepare_cpus(void) | 146 | /* |
147 | * Wait until all CPUs are entered via soft-reset. | ||
148 | */ | ||
149 | static void crash_soft_reset_check(int cpu) | ||
150 | { | ||
151 | unsigned int ncpus = num_online_cpus() - 1;/* Excluding the panic cpu */ | ||
152 | |||
153 | cpu_clear(cpu, cpus_in_sr); | ||
154 | while (atomic_read(&enter_on_soft_reset) != ncpus) | ||
155 | cpu_relax(); | ||
156 | } | ||
157 | |||
158 | |||
159 | static void crash_kexec_prepare_cpus(int cpu) | ||
125 | { | 160 | { |
126 | unsigned int msecs; | 161 | unsigned int msecs; |
127 | 162 | ||
128 | atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1); | 163 | unsigned int ncpus = num_online_cpus() - 1;/* Excluding the panic cpu */ |
129 | 164 | ||
130 | crash_send_ipi(crash_ipi_callback); | 165 | crash_send_ipi(crash_ipi_callback); |
131 | smp_wmb(); | 166 | smp_wmb(); |
@@ -133,14 +168,13 @@ static void crash_kexec_prepare_cpus(void) | |||
133 | /* | 168 | /* |
134 | * FIXME: Until we will have the way to stop other CPUSs reliabally, | 169 | * FIXME: Until we will have the way to stop other CPUSs reliabally, |
135 | * the crash CPU will send an IPI and wait for other CPUs to | 170 | * the crash CPU will send an IPI and wait for other CPUs to |
136 | * respond. If not, proceed the kexec boot even though we failed to | 171 | * respond. |
137 | * capture other CPU states. | ||
138 | * Delay of at least 10 seconds. | 172 | * Delay of at least 10 seconds. |
139 | */ | 173 | */ |
140 | printk(KERN_ALERT "Sending IPI to other cpus...\n"); | 174 | printk(KERN_EMERG "Sending IPI to other cpus...\n"); |
141 | msecs = 10000; | 175 | msecs = 10000; |
142 | while ((atomic_read(&waiting_for_crash_ipi) > 0) && (--msecs > 0)) { | 176 | while ((cpus_weight(cpus_in_crash) < ncpus) && (--msecs > 0)) { |
143 | barrier(); | 177 | cpu_relax(); |
144 | mdelay(1); | 178 | mdelay(1); |
145 | } | 179 | } |
146 | 180 | ||
@@ -149,18 +183,71 @@ static void crash_kexec_prepare_cpus(void) | |||
149 | /* | 183 | /* |
150 | * FIXME: In case if we do not get all CPUs, one possibility: ask the | 184 | * FIXME: In case if we do not get all CPUs, one possibility: ask the |
151 | * user to do soft reset such that we get all. | 185 | * user to do soft reset such that we get all. |
152 | * IPI handler is already set by the panic cpu initially. Therefore, | 186 | * Soft-reset will be used until better mechanism is implemented. |
153 | * all cpus could invoke this handler from die() and the panic CPU | 187 | */ |
154 | * will call machine_kexec() directly from this handler to do | 188 | if (cpus_weight(cpus_in_crash) < ncpus) { |
155 | * kexec boot. | 189 | printk(KERN_EMERG "done waiting: %d cpu(s) not responding\n", |
190 | ncpus - cpus_weight(cpus_in_crash)); | ||
191 | printk(KERN_EMERG "Activate soft-reset to stop other cpu(s)\n"); | ||
192 | cpus_in_sr = CPU_MASK_NONE; | ||
193 | atomic_set(&enter_on_soft_reset, 0); | ||
194 | while (cpus_weight(cpus_in_crash) < ncpus) | ||
195 | cpu_relax(); | ||
196 | } | ||
197 | /* | ||
198 | * Make sure all CPUs are entered via soft-reset if the kdump is | ||
199 | * invoked using soft-reset. | ||
156 | */ | 200 | */ |
157 | if (atomic_read(&waiting_for_crash_ipi)) | 201 | if (cpu_isset(cpu, cpus_in_sr)) |
158 | printk(KERN_ALERT "done waiting: %d cpus not responding\n", | 202 | crash_soft_reset_check(cpu); |
159 | atomic_read(&waiting_for_crash_ipi)); | ||
160 | /* Leave the IPI callback set */ | 203 | /* Leave the IPI callback set */ |
161 | } | 204 | } |
205 | |||
206 | /* | ||
207 | * This function will be called by secondary cpus or by kexec cpu | ||
208 | * if soft-reset is activated to stop some CPUs. | ||
209 | */ | ||
210 | void crash_kexec_secondary(struct pt_regs *regs) | ||
211 | { | ||
212 | int cpu = smp_processor_id(); | ||
213 | unsigned long flags; | ||
214 | int msecs = 5; | ||
215 | |||
216 | local_irq_save(flags); | ||
217 | /* Wait 5ms if the kexec CPU is not entered yet. */ | ||
218 | while (crashing_cpu < 0) { | ||
219 | if (--msecs < 0) { | ||
220 | /* | ||
221 | * Either kdump image is not loaded or | ||
222 | * kdump process is not started - Probably xmon | ||
223 | * exited using 'x'(exit and recover) or | ||
224 | * kexec_should_crash() failed for all running tasks. | ||
225 | */ | ||
226 | cpu_clear(cpu, cpus_in_sr); | ||
227 | local_irq_restore(flags); | ||
228 | return; | ||
229 | } | ||
230 | mdelay(1); | ||
231 | cpu_relax(); | ||
232 | } | ||
233 | if (cpu == crashing_cpu) { | ||
234 | /* | ||
235 | * Panic CPU will enter this func only via soft-reset. | ||
236 | * Wait until all secondary CPUs entered and | ||
237 | * then start kexec boot. | ||
238 | */ | ||
239 | crash_soft_reset_check(cpu); | ||
240 | cpu_set(crashing_cpu, cpus_in_crash); | ||
241 | if (ppc_md.kexec_cpu_down) | ||
242 | ppc_md.kexec_cpu_down(1, 0); | ||
243 | machine_kexec(kexec_crash_image); | ||
244 | /* NOTREACHED */ | ||
245 | } | ||
246 | crash_ipi_callback(regs); | ||
247 | } | ||
248 | |||
162 | #else | 249 | #else |
163 | static void crash_kexec_prepare_cpus(void) | 250 | static void crash_kexec_prepare_cpus(int cpu) |
164 | { | 251 | { |
165 | /* | 252 | /* |
166 | * move the secondarys to us so that we can copy | 253 | * move the secondarys to us so that we can copy |
@@ -171,6 +258,10 @@ static void crash_kexec_prepare_cpus(void) | |||
171 | smp_release_cpus(); | 258 | smp_release_cpus(); |
172 | } | 259 | } |
173 | 260 | ||
261 | void crash_kexec_secondary(struct pt_regs *regs) | ||
262 | { | ||
263 | cpus_in_sr = CPU_MASK_NONE; | ||
264 | } | ||
174 | #endif | 265 | #endif |
175 | 266 | ||
176 | void default_machine_crash_shutdown(struct pt_regs *regs) | 267 | void default_machine_crash_shutdown(struct pt_regs *regs) |
@@ -190,23 +281,23 @@ void default_machine_crash_shutdown(struct pt_regs *regs) | |||
190 | local_irq_disable(); | 281 | local_irq_disable(); |
191 | 282 | ||
192 | for_each_irq(irq) { | 283 | for_each_irq(irq) { |
193 | struct irq_desc *desc = irq_descp(irq); | 284 | struct irq_desc *desc = irq_desc + irq; |
194 | 285 | ||
195 | if (desc->status & IRQ_INPROGRESS) | 286 | if (desc->status & IRQ_INPROGRESS) |
196 | desc->handler->end(irq); | 287 | desc->chip->end(irq); |
197 | 288 | ||
198 | if (!(desc->status & IRQ_DISABLED)) | 289 | if (!(desc->status & IRQ_DISABLED)) |
199 | desc->handler->disable(irq); | 290 | desc->chip->disable(irq); |
200 | } | 291 | } |
201 | 292 | ||
202 | if (ppc_md.kexec_cpu_down) | ||
203 | ppc_md.kexec_cpu_down(1, 0); | ||
204 | |||
205 | /* | 293 | /* |
206 | * Make a note of crashing cpu. Will be used in machine_kexec | 294 | * Make a note of crashing cpu. Will be used in machine_kexec |
207 | * such that another IPI will not be sent. | 295 | * such that another IPI will not be sent. |
208 | */ | 296 | */ |
209 | crashing_cpu = smp_processor_id(); | 297 | crashing_cpu = smp_processor_id(); |
210 | crash_kexec_prepare_cpus(); | ||
211 | crash_save_this_cpu(regs, crashing_cpu); | 298 | crash_save_this_cpu(regs, crashing_cpu); |
299 | crash_kexec_prepare_cpus(crashing_cpu); | ||
300 | cpu_set(crashing_cpu, cpus_in_crash); | ||
301 | if (ppc_md.kexec_cpu_down) | ||
302 | ppc_md.kexec_cpu_down(1, 0); | ||
212 | } | 303 | } |
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index 831acbdf2592..8cfd040d1f50 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
@@ -85,34 +85,6 @@ END_FTR_SECTION(0, 1) | |||
85 | /* Catch branch to 0 in real mode */ | 85 | /* Catch branch to 0 in real mode */ |
86 | trap | 86 | trap |
87 | 87 | ||
88 | #ifdef CONFIG_PPC_ISERIES | ||
89 | /* | ||
90 | * At offset 0x20, there is a pointer to iSeries LPAR data. | ||
91 | * This is required by the hypervisor | ||
92 | */ | ||
93 | . = 0x20 | ||
94 | .llong hvReleaseData-KERNELBASE | ||
95 | |||
96 | /* | ||
97 | * At offset 0x28 and 0x30 are offsets to the mschunks_map | ||
98 | * array (used by the iSeries LPAR debugger to do translation | ||
99 | * between physical addresses and absolute addresses) and | ||
100 | * to the pidhash table (also used by the debugger) | ||
101 | */ | ||
102 | .llong mschunks_map-KERNELBASE | ||
103 | .llong 0 /* pidhash-KERNELBASE SFRXXX */ | ||
104 | |||
105 | /* Offset 0x38 - Pointer to start of embedded System.map */ | ||
106 | .globl embedded_sysmap_start | ||
107 | embedded_sysmap_start: | ||
108 | .llong 0 | ||
109 | /* Offset 0x40 - Pointer to end of embedded System.map */ | ||
110 | .globl embedded_sysmap_end | ||
111 | embedded_sysmap_end: | ||
112 | .llong 0 | ||
113 | |||
114 | #endif /* CONFIG_PPC_ISERIES */ | ||
115 | |||
116 | /* Secondary processors spin on this value until it goes to 1. */ | 88 | /* Secondary processors spin on this value until it goes to 1. */ |
117 | .globl __secondary_hold_spinloop | 89 | .globl __secondary_hold_spinloop |
118 | __secondary_hold_spinloop: | 90 | __secondary_hold_spinloop: |
@@ -124,6 +96,15 @@ __secondary_hold_spinloop: | |||
124 | __secondary_hold_acknowledge: | 96 | __secondary_hold_acknowledge: |
125 | .llong 0x0 | 97 | .llong 0x0 |
126 | 98 | ||
99 | #ifdef CONFIG_PPC_ISERIES | ||
100 | /* | ||
101 | * At offset 0x20, there is a pointer to iSeries LPAR data. | ||
102 | * This is required by the hypervisor | ||
103 | */ | ||
104 | . = 0x20 | ||
105 | .llong hvReleaseData-KERNELBASE | ||
106 | #endif /* CONFIG_PPC_ISERIES */ | ||
107 | |||
127 | . = 0x60 | 108 | . = 0x60 |
128 | /* | 109 | /* |
129 | * The following code is used on pSeries to hold secondary processors | 110 | * The following code is used on pSeries to hold secondary processors |
@@ -1602,9 +1583,6 @@ _GLOBAL(__start_initialization_multiplatform) | |||
1602 | /* Setup some critical 970 SPRs before switching MMU off */ | 1583 | /* Setup some critical 970 SPRs before switching MMU off */ |
1603 | bl .__970_cpu_preinit | 1584 | bl .__970_cpu_preinit |
1604 | 1585 | ||
1605 | /* cpu # */ | ||
1606 | li r24,0 | ||
1607 | |||
1608 | /* Switch off MMU if not already */ | 1586 | /* Switch off MMU if not already */ |
1609 | LOAD_REG_IMMEDIATE(r4, .__after_prom_start - KERNELBASE) | 1587 | LOAD_REG_IMMEDIATE(r4, .__after_prom_start - KERNELBASE) |
1610 | add r4,r4,r30 | 1588 | add r4,r4,r30 |
@@ -1683,6 +1661,9 @@ _STATIC(__after_prom_start) | |||
1683 | /* i.e. where we are running */ | 1661 | /* i.e. where we are running */ |
1684 | /* the source addr */ | 1662 | /* the source addr */ |
1685 | 1663 | ||
1664 | cmpdi r4,0 /* In some cases the loader may */ | ||
1665 | beq .start_here_multiplatform /* have already put us at zero */ | ||
1666 | /* so we can skip the copy. */ | ||
1686 | LOAD_REG_IMMEDIATE(r5,copy_to_here) /* # bytes of memory to copy */ | 1667 | LOAD_REG_IMMEDIATE(r5,copy_to_here) /* # bytes of memory to copy */ |
1687 | sub r5,r5,r27 | 1668 | sub r5,r5,r27 |
1688 | 1669 | ||
@@ -1962,14 +1943,6 @@ _STATIC(start_here_common) | |||
1962 | li r3,0 | 1943 | li r3,0 |
1963 | bl .do_cpu_ftr_fixups | 1944 | bl .do_cpu_ftr_fixups |
1964 | 1945 | ||
1965 | LOAD_REG_IMMEDIATE(r26, boot_cpuid) | ||
1966 | lwz r26,0(r26) | ||
1967 | |||
1968 | LOAD_REG_IMMEDIATE(r24, paca) /* Get base vaddr of paca array */ | ||
1969 | mulli r13,r26,PACA_SIZE /* Calculate vaddr of right paca */ | ||
1970 | add r13,r13,r24 /* for this processor. */ | ||
1971 | mtspr SPRN_SPRG3,r13 | ||
1972 | |||
1973 | /* ptr to current */ | 1946 | /* ptr to current */ |
1974 | LOAD_REG_IMMEDIATE(r4, init_task) | 1947 | LOAD_REG_IMMEDIATE(r4, init_task) |
1975 | std r4,PACACURRENT(r13) | 1948 | std r4,PACACURRENT(r13) |
@@ -1995,17 +1968,6 @@ _STATIC(start_here_common) | |||
1995 | /* Not reached */ | 1968 | /* Not reached */ |
1996 | BUG_OPCODE | 1969 | BUG_OPCODE |
1997 | 1970 | ||
1998 | /* Put the paca pointer into r13 and SPRG3 */ | ||
1999 | _GLOBAL(setup_boot_paca) | ||
2000 | LOAD_REG_IMMEDIATE(r3, boot_cpuid) | ||
2001 | lwz r3,0(r3) | ||
2002 | LOAD_REG_IMMEDIATE(r4, paca) /* Get base vaddr of paca array */ | ||
2003 | mulli r3,r3,PACA_SIZE /* Calculate vaddr of right paca */ | ||
2004 | add r13,r3,r4 /* for this processor. */ | ||
2005 | mtspr SPRN_SPRG3,r13 | ||
2006 | |||
2007 | blr | ||
2008 | |||
2009 | /* | 1971 | /* |
2010 | * We put a few things here that have to be page-aligned. | 1972 | * We put a few things here that have to be page-aligned. |
2011 | * This stuff goes at the beginning of the bss, which is page-aligned. | 1973 | * This stuff goes at the beginning of the bss, which is page-aligned. |
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index 7cb77c20fc5d..3d677ac99659 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <asm/iommu.h> | 38 | #include <asm/iommu.h> |
39 | #include <asm/pci-bridge.h> | 39 | #include <asm/pci-bridge.h> |
40 | #include <asm/machdep.h> | 40 | #include <asm/machdep.h> |
41 | #include <asm/kdump.h> | ||
41 | 42 | ||
42 | #define DBG(...) | 43 | #define DBG(...) |
43 | 44 | ||
@@ -440,8 +441,37 @@ struct iommu_table *iommu_init_table(struct iommu_table *tbl, int nid) | |||
440 | tbl->it_largehint = tbl->it_halfpoint; | 441 | tbl->it_largehint = tbl->it_halfpoint; |
441 | spin_lock_init(&tbl->it_lock); | 442 | spin_lock_init(&tbl->it_lock); |
442 | 443 | ||
444 | #ifdef CONFIG_CRASH_DUMP | ||
445 | if (ppc_md.tce_get) { | ||
446 | unsigned long index, tceval; | ||
447 | unsigned long tcecount = 0; | ||
448 | |||
449 | /* | ||
450 | * Reserve the existing mappings left by the first kernel. | ||
451 | */ | ||
452 | for (index = 0; index < tbl->it_size; index++) { | ||
453 | tceval = ppc_md.tce_get(tbl, index + tbl->it_offset); | ||
454 | /* | ||
455 | * Freed TCE entry contains 0x7fffffffffffffff on JS20 | ||
456 | */ | ||
457 | if (tceval && (tceval != 0x7fffffffffffffffUL)) { | ||
458 | __set_bit(index, tbl->it_map); | ||
459 | tcecount++; | ||
460 | } | ||
461 | } | ||
462 | if ((tbl->it_size - tcecount) < KDUMP_MIN_TCE_ENTRIES) { | ||
463 | printk(KERN_WARNING "TCE table is full; "); | ||
464 | printk(KERN_WARNING "freeing %d entries for the kdump boot\n", | ||
465 | KDUMP_MIN_TCE_ENTRIES); | ||
466 | for (index = tbl->it_size - KDUMP_MIN_TCE_ENTRIES; | ||
467 | index < tbl->it_size; index++) | ||
468 | __clear_bit(index, tbl->it_map); | ||
469 | } | ||
470 | } | ||
471 | #else | ||
443 | /* Clear the hardware table in case firmware left allocations in it */ | 472 | /* Clear the hardware table in case firmware left allocations in it */ |
444 | ppc_md.tce_free(tbl, tbl->it_offset, tbl->it_size); | 473 | ppc_md.tce_free(tbl, tbl->it_offset, tbl->it_size); |
474 | #endif | ||
445 | 475 | ||
446 | if (!welcomed) { | 476 | if (!welcomed) { |
447 | printk(KERN_INFO "IOMMU table initialized, virtual merging %s\n", | 477 | printk(KERN_INFO "IOMMU table initialized, virtual merging %s\n", |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 40d4c14fde8f..24f6050aa4ab 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -120,8 +120,8 @@ int show_interrupts(struct seq_file *p, void *v) | |||
120 | #else | 120 | #else |
121 | seq_printf(p, "%10u ", kstat_irqs(i)); | 121 | seq_printf(p, "%10u ", kstat_irqs(i)); |
122 | #endif /* CONFIG_SMP */ | 122 | #endif /* CONFIG_SMP */ |
123 | if (desc->handler) | 123 | if (desc->chip) |
124 | seq_printf(p, " %s ", desc->handler->typename); | 124 | seq_printf(p, " %s ", desc->chip->typename); |
125 | else | 125 | else |
126 | seq_puts(p, " None "); | 126 | seq_puts(p, " None "); |
127 | seq_printf(p, "%s", (desc->status & IRQ_LEVEL) ? "Level " : "Edge "); | 127 | seq_printf(p, "%s", (desc->status & IRQ_LEVEL) ? "Level " : "Edge "); |
@@ -164,13 +164,13 @@ void fixup_irqs(cpumask_t map) | |||
164 | if (irq_desc[irq].status & IRQ_PER_CPU) | 164 | if (irq_desc[irq].status & IRQ_PER_CPU) |
165 | continue; | 165 | continue; |
166 | 166 | ||
167 | cpus_and(mask, irq_affinity[irq], map); | 167 | cpus_and(mask, irq_desc[irq].affinity, map); |
168 | if (any_online_cpu(mask) == NR_CPUS) { | 168 | if (any_online_cpu(mask) == NR_CPUS) { |
169 | printk("Breaking affinity for irq %i\n", irq); | 169 | printk("Breaking affinity for irq %i\n", irq); |
170 | mask = map; | 170 | mask = map; |
171 | } | 171 | } |
172 | if (irq_desc[irq].handler->set_affinity) | 172 | if (irq_desc[irq].chip->set_affinity) |
173 | irq_desc[irq].handler->set_affinity(irq, mask); | 173 | irq_desc[irq].chip->set_affinity(irq, mask); |
174 | else if (irq_desc[irq].action && !(warned++)) | 174 | else if (irq_desc[irq].action && !(warned++)) |
175 | printk("Cannot set affinity for irq %i\n", irq); | 175 | printk("Cannot set affinity for irq %i\n", irq); |
176 | } | 176 | } |
diff --git a/arch/powerpc/kernel/legacy_serial.c b/arch/powerpc/kernel/legacy_serial.c index 6e67b5b49ba1..3a9b78d03542 100644 --- a/arch/powerpc/kernel/legacy_serial.c +++ b/arch/powerpc/kernel/legacy_serial.c | |||
@@ -302,6 +302,17 @@ void __init find_legacy_serial_ports(void) | |||
302 | of_node_put(isa); | 302 | of_node_put(isa); |
303 | } | 303 | } |
304 | 304 | ||
305 | /* First fill our array with tsi-bridge ports */ | ||
306 | for (np = NULL; (np = of_find_compatible_node(np, "serial", "ns16550")) != NULL;) { | ||
307 | struct device_node *tsi = of_get_parent(np); | ||
308 | if (tsi && !strcmp(tsi->type, "tsi-bridge")) { | ||
309 | index = add_legacy_soc_port(np, np); | ||
310 | if (index >= 0 && np == stdout) | ||
311 | legacy_serial_console = index; | ||
312 | } | ||
313 | of_node_put(tsi); | ||
314 | } | ||
315 | |||
305 | #ifdef CONFIG_PCI | 316 | #ifdef CONFIG_PCI |
306 | /* Next, try to locate PCI ports */ | 317 | /* Next, try to locate PCI ports */ |
307 | for (np = NULL; (np = of_find_all_nodes(np));) { | 318 | for (np = NULL; (np = of_find_all_nodes(np));) { |
diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/kernel/lparcfg.c index c02deaab26c7..73edc3c16137 100644 --- a/arch/powerpc/kernel/lparcfg.c +++ b/arch/powerpc/kernel/lparcfg.c | |||
@@ -45,11 +45,9 @@ | |||
45 | static struct proc_dir_entry *proc_ppc64_lparcfg; | 45 | static struct proc_dir_entry *proc_ppc64_lparcfg; |
46 | #define LPARCFG_BUFF_SIZE 4096 | 46 | #define LPARCFG_BUFF_SIZE 4096 |
47 | 47 | ||
48 | #ifdef CONFIG_PPC_ISERIES | ||
49 | |||
50 | /* | 48 | /* |
51 | * For iSeries legacy systems, the PPA purr function is available from the | 49 | * Track sum of all purrs across all processors. This is used to further |
52 | * emulated_time_base field in the paca. | 50 | * calculate usage values by different applications |
53 | */ | 51 | */ |
54 | static unsigned long get_purr(void) | 52 | static unsigned long get_purr(void) |
55 | { | 53 | { |
@@ -57,48 +55,31 @@ static unsigned long get_purr(void) | |||
57 | int cpu; | 55 | int cpu; |
58 | 56 | ||
59 | for_each_possible_cpu(cpu) { | 57 | for_each_possible_cpu(cpu) { |
60 | sum_purr += lppaca[cpu].emulated_time_base; | 58 | if (firmware_has_feature(FW_FEATURE_ISERIES)) |
59 | sum_purr += lppaca[cpu].emulated_time_base; | ||
60 | else { | ||
61 | struct cpu_usage *cu; | ||
61 | 62 | ||
62 | #ifdef PURR_DEBUG | 63 | cu = &per_cpu(cpu_usage_array, cpu); |
63 | printk(KERN_INFO "get_purr for cpu (%d) has value (%ld) \n", | 64 | sum_purr += cu->current_tb; |
64 | cpu, lppaca[cpu].emulated_time_base); | 65 | } |
65 | #endif | ||
66 | } | 66 | } |
67 | return sum_purr; | 67 | return sum_purr; |
68 | } | 68 | } |
69 | 69 | ||
70 | #define lparcfg_write NULL | 70 | #ifdef CONFIG_PPC_ISERIES |
71 | 71 | ||
72 | /* | 72 | /* |
73 | * Methods used to fetch LPAR data when running on an iSeries platform. | 73 | * Methods used to fetch LPAR data when running on an iSeries platform. |
74 | */ | 74 | */ |
75 | static int lparcfg_data(struct seq_file *m, void *v) | 75 | static int iseries_lparcfg_data(struct seq_file *m, void *v) |
76 | { | 76 | { |
77 | unsigned long pool_id, lp_index; | 77 | unsigned long pool_id; |
78 | int shared, entitled_capacity, max_entitled_capacity; | 78 | int shared, entitled_capacity, max_entitled_capacity; |
79 | int processors, max_processors; | 79 | int processors, max_processors; |
80 | unsigned long purr = get_purr(); | 80 | unsigned long purr = get_purr(); |
81 | 81 | ||
82 | seq_printf(m, "%s %s \n", MODULE_NAME, MODULE_VERS); | ||
83 | |||
84 | shared = (int)(get_lppaca()->shared_proc); | 82 | shared = (int)(get_lppaca()->shared_proc); |
85 | seq_printf(m, "serial_number=%c%c%c%c%c%c%c\n", | ||
86 | e2a(xItExtVpdPanel.mfgID[2]), | ||
87 | e2a(xItExtVpdPanel.mfgID[3]), | ||
88 | e2a(xItExtVpdPanel.systemSerial[1]), | ||
89 | e2a(xItExtVpdPanel.systemSerial[2]), | ||
90 | e2a(xItExtVpdPanel.systemSerial[3]), | ||
91 | e2a(xItExtVpdPanel.systemSerial[4]), | ||
92 | e2a(xItExtVpdPanel.systemSerial[5])); | ||
93 | |||
94 | seq_printf(m, "system_type=%c%c%c%c\n", | ||
95 | e2a(xItExtVpdPanel.machineType[0]), | ||
96 | e2a(xItExtVpdPanel.machineType[1]), | ||
97 | e2a(xItExtVpdPanel.machineType[2]), | ||
98 | e2a(xItExtVpdPanel.machineType[3])); | ||
99 | |||
100 | lp_index = HvLpConfig_getLpIndex(); | ||
101 | seq_printf(m, "partition_id=%d\n", (int)lp_index); | ||
102 | 83 | ||
103 | seq_printf(m, "system_active_processors=%d\n", | 84 | seq_printf(m, "system_active_processors=%d\n", |
104 | (int)HvLpConfig_getSystemPhysicalProcessors()); | 85 | (int)HvLpConfig_getSystemPhysicalProcessors()); |
@@ -137,6 +118,14 @@ static int lparcfg_data(struct seq_file *m, void *v) | |||
137 | 118 | ||
138 | return 0; | 119 | return 0; |
139 | } | 120 | } |
121 | |||
122 | #else /* CONFIG_PPC_ISERIES */ | ||
123 | |||
124 | static int iseries_lparcfg_data(struct seq_file *m, void *v) | ||
125 | { | ||
126 | return 0; | ||
127 | } | ||
128 | |||
140 | #endif /* CONFIG_PPC_ISERIES */ | 129 | #endif /* CONFIG_PPC_ISERIES */ |
141 | 130 | ||
142 | #ifdef CONFIG_PPC_PSERIES | 131 | #ifdef CONFIG_PPC_PSERIES |
@@ -213,22 +202,6 @@ static void h_pic(unsigned long *pool_idle_time, unsigned long *num_procs) | |||
213 | log_plpar_hcall_return(rc, "H_PIC"); | 202 | log_plpar_hcall_return(rc, "H_PIC"); |
214 | } | 203 | } |
215 | 204 | ||
216 | /* Track sum of all purrs across all processors. This is used to further */ | ||
217 | /* calculate usage values by different applications */ | ||
218 | |||
219 | static unsigned long get_purr(void) | ||
220 | { | ||
221 | unsigned long sum_purr = 0; | ||
222 | int cpu; | ||
223 | struct cpu_usage *cu; | ||
224 | |||
225 | for_each_possible_cpu(cpu) { | ||
226 | cu = &per_cpu(cpu_usage_array, cpu); | ||
227 | sum_purr += cu->current_tb; | ||
228 | } | ||
229 | return sum_purr; | ||
230 | } | ||
231 | |||
232 | #define SPLPAR_CHARACTERISTICS_TOKEN 20 | 205 | #define SPLPAR_CHARACTERISTICS_TOKEN 20 |
233 | #define SPLPAR_MAXLENGTH 1026*(sizeof(char)) | 206 | #define SPLPAR_MAXLENGTH 1026*(sizeof(char)) |
234 | 207 | ||
@@ -333,35 +306,13 @@ static int lparcfg_count_active_processors(void) | |||
333 | return count; | 306 | return count; |
334 | } | 307 | } |
335 | 308 | ||
336 | static int lparcfg_data(struct seq_file *m, void *v) | 309 | static int pseries_lparcfg_data(struct seq_file *m, void *v) |
337 | { | 310 | { |
338 | int partition_potential_processors; | 311 | int partition_potential_processors; |
339 | int partition_active_processors; | 312 | int partition_active_processors; |
340 | struct device_node *rootdn; | ||
341 | const char *model = ""; | ||
342 | const char *system_id = ""; | ||
343 | unsigned int *lp_index_ptr, lp_index = 0; | ||
344 | struct device_node *rtas_node; | 313 | struct device_node *rtas_node; |
345 | int *lrdrp = NULL; | 314 | int *lrdrp = NULL; |
346 | 315 | ||
347 | rootdn = find_path_device("/"); | ||
348 | if (rootdn) { | ||
349 | model = get_property(rootdn, "model", NULL); | ||
350 | system_id = get_property(rootdn, "system-id", NULL); | ||
351 | lp_index_ptr = (unsigned int *) | ||
352 | get_property(rootdn, "ibm,partition-no", NULL); | ||
353 | if (lp_index_ptr) | ||
354 | lp_index = *lp_index_ptr; | ||
355 | } | ||
356 | |||
357 | seq_printf(m, "%s %s \n", MODULE_NAME, MODULE_VERS); | ||
358 | |||
359 | seq_printf(m, "serial_number=%s\n", system_id); | ||
360 | |||
361 | seq_printf(m, "system_type=%s\n", model); | ||
362 | |||
363 | seq_printf(m, "partition_id=%d\n", (int)lp_index); | ||
364 | |||
365 | rtas_node = find_path_device("/rtas"); | 316 | rtas_node = find_path_device("/rtas"); |
366 | if (rtas_node) | 317 | if (rtas_node) |
367 | lrdrp = (int *)get_property(rtas_node, "ibm,lrdr-capacity", | 318 | lrdrp = (int *)get_property(rtas_node, "ibm,lrdr-capacity", |
@@ -549,8 +500,61 @@ out: | |||
549 | return retval; | 500 | return retval; |
550 | } | 501 | } |
551 | 502 | ||
503 | #else /* CONFIG_PPC_PSERIES */ | ||
504 | |||
505 | static int pseries_lparcfg_data(struct seq_file *m, void *v) | ||
506 | { | ||
507 | return 0; | ||
508 | } | ||
509 | |||
510 | static ssize_t lparcfg_write(struct file *file, const char __user * buf, | ||
511 | size_t count, loff_t * off) | ||
512 | { | ||
513 | return count; | ||
514 | } | ||
515 | |||
552 | #endif /* CONFIG_PPC_PSERIES */ | 516 | #endif /* CONFIG_PPC_PSERIES */ |
553 | 517 | ||
518 | static int lparcfg_data(struct seq_file *m, void *v) | ||
519 | { | ||
520 | struct device_node *rootdn; | ||
521 | const char *model = ""; | ||
522 | const char *system_id = ""; | ||
523 | const char *tmp; | ||
524 | unsigned int *lp_index_ptr, lp_index = 0; | ||
525 | |||
526 | seq_printf(m, "%s %s \n", MODULE_NAME, MODULE_VERS); | ||
527 | |||
528 | rootdn = find_path_device("/"); | ||
529 | if (rootdn) { | ||
530 | tmp = get_property(rootdn, "model", NULL); | ||
531 | if (tmp) { | ||
532 | model = tmp; | ||
533 | /* Skip "IBM," - see platforms/iseries/dt.c */ | ||
534 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | ||
535 | model += 4; | ||
536 | } | ||
537 | tmp = get_property(rootdn, "system-id", NULL); | ||
538 | if (tmp) { | ||
539 | system_id = tmp; | ||
540 | /* Skip "IBM," - see platforms/iseries/dt.c */ | ||
541 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | ||
542 | system_id += 4; | ||
543 | } | ||
544 | lp_index_ptr = (unsigned int *) | ||
545 | get_property(rootdn, "ibm,partition-no", NULL); | ||
546 | if (lp_index_ptr) | ||
547 | lp_index = *lp_index_ptr; | ||
548 | } | ||
549 | seq_printf(m, "serial_number=%s\n", system_id); | ||
550 | seq_printf(m, "system_type=%s\n", model); | ||
551 | seq_printf(m, "partition_id=%d\n", (int)lp_index); | ||
552 | |||
553 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | ||
554 | return iseries_lparcfg_data(m, v); | ||
555 | return pseries_lparcfg_data(m, v); | ||
556 | } | ||
557 | |||
554 | static int lparcfg_open(struct inode *inode, struct file *file) | 558 | static int lparcfg_open(struct inode *inode, struct file *file) |
555 | { | 559 | { |
556 | return single_open(file, lparcfg_data, NULL); | 560 | return single_open(file, lparcfg_data, NULL); |
@@ -569,7 +573,8 @@ int __init lparcfg_init(void) | |||
569 | mode_t mode = S_IRUSR | S_IRGRP | S_IROTH; | 573 | mode_t mode = S_IRUSR | S_IRGRP | S_IROTH; |
570 | 574 | ||
571 | /* Allow writing if we have FW_FEATURE_SPLPAR */ | 575 | /* Allow writing if we have FW_FEATURE_SPLPAR */ |
572 | if (firmware_has_feature(FW_FEATURE_SPLPAR)) { | 576 | if (firmware_has_feature(FW_FEATURE_SPLPAR) && |
577 | !firmware_has_feature(FW_FEATURE_ISERIES)) { | ||
573 | lparcfg_fops.write = lparcfg_write; | 578 | lparcfg_fops.write = lparcfg_write; |
574 | mode |= S_IWUSR; | 579 | mode |= S_IWUSR; |
575 | } | 580 | } |
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c index a8fa04ef27cd..b438d45a068c 100644 --- a/arch/powerpc/kernel/machine_kexec_64.c +++ b/arch/powerpc/kernel/machine_kexec_64.c | |||
@@ -378,11 +378,13 @@ static void __init export_crashk_values(void) | |||
378 | of_node_put(node); | 378 | of_node_put(node); |
379 | } | 379 | } |
380 | 380 | ||
381 | void __init kexec_setup(void) | 381 | static int __init kexec_setup(void) |
382 | { | 382 | { |
383 | export_htab_values(); | 383 | export_htab_values(); |
384 | export_crashk_values(); | 384 | export_crashk_values(); |
385 | return 0; | ||
385 | } | 386 | } |
387 | __initcall(kexec_setup); | ||
386 | 388 | ||
387 | static int __init early_parse_crashk(char *p) | 389 | static int __init early_parse_crashk(char *p) |
388 | { | 390 | { |
diff --git a/arch/powerpc/kernel/misc.S b/arch/powerpc/kernel/misc.S new file mode 100644 index 000000000000..fc23040d5a26 --- /dev/null +++ b/arch/powerpc/kernel/misc.S | |||
@@ -0,0 +1,203 @@ | |||
1 | /* | ||
2 | * This file contains miscellaneous low-level functions. | ||
3 | * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) | ||
4 | * | ||
5 | * Largely rewritten by Cort Dougan (cort@cs.nmt.edu) | ||
6 | * and Paul Mackerras. | ||
7 | * | ||
8 | * Adapted for iSeries by Mike Corrigan (mikejc@us.ibm.com) | ||
9 | * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com) | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or | ||
12 | * modify it under the terms of the GNU General Public License | ||
13 | * as published by the Free Software Foundation; either version | ||
14 | * 2 of the License, or (at your option) any later version. | ||
15 | */ | ||
16 | #include <asm/ppc_asm.h> | ||
17 | |||
18 | .text | ||
19 | |||
20 | #ifdef CONFIG_PPC64 | ||
21 | #define IN_SYNC twi 0,r5,0; isync | ||
22 | #define EIEIO_32 | ||
23 | #define SYNC_64 sync | ||
24 | #else /* CONFIG_PPC32 */ | ||
25 | #define IN_SYNC | ||
26 | #define EIEIO_32 eieio | ||
27 | #define SYNC_64 | ||
28 | #endif | ||
29 | /* | ||
30 | * Returns (address we are running at) - (address we were linked at) | ||
31 | * for use before the text and data are mapped to KERNELBASE. | ||
32 | */ | ||
33 | |||
34 | _GLOBAL(reloc_offset) | ||
35 | mflr r0 | ||
36 | bl 1f | ||
37 | 1: mflr r3 | ||
38 | LOAD_REG_IMMEDIATE(r4,1b) | ||
39 | subf r3,r4,r3 | ||
40 | mtlr r0 | ||
41 | blr | ||
42 | |||
43 | /* | ||
44 | * add_reloc_offset(x) returns x + reloc_offset(). | ||
45 | */ | ||
46 | _GLOBAL(add_reloc_offset) | ||
47 | mflr r0 | ||
48 | bl 1f | ||
49 | 1: mflr r5 | ||
50 | LOAD_REG_IMMEDIATE(r4,1b) | ||
51 | subf r5,r4,r5 | ||
52 | add r3,r3,r5 | ||
53 | mtlr r0 | ||
54 | blr | ||
55 | |||
56 | /* | ||
57 | * I/O string operations | ||
58 | * | ||
59 | * insb(port, buf, len) | ||
60 | * outsb(port, buf, len) | ||
61 | * insw(port, buf, len) | ||
62 | * outsw(port, buf, len) | ||
63 | * insl(port, buf, len) | ||
64 | * outsl(port, buf, len) | ||
65 | * insw_ns(port, buf, len) | ||
66 | * outsw_ns(port, buf, len) | ||
67 | * insl_ns(port, buf, len) | ||
68 | * outsl_ns(port, buf, len) | ||
69 | * | ||
70 | * The *_ns versions don't do byte-swapping. | ||
71 | */ | ||
72 | _GLOBAL(_insb) | ||
73 | cmpwi 0,r5,0 | ||
74 | mtctr r5 | ||
75 | subi r4,r4,1 | ||
76 | blelr- | ||
77 | 00: lbz r5,0(r3) | ||
78 | eieio | ||
79 | stbu r5,1(r4) | ||
80 | bdnz 00b | ||
81 | IN_SYNC | ||
82 | blr | ||
83 | |||
84 | _GLOBAL(_outsb) | ||
85 | cmpwi 0,r5,0 | ||
86 | mtctr r5 | ||
87 | subi r4,r4,1 | ||
88 | blelr- | ||
89 | 00: lbzu r5,1(r4) | ||
90 | stb r5,0(r3) | ||
91 | EIEIO_32 | ||
92 | bdnz 00b | ||
93 | SYNC_64 | ||
94 | blr | ||
95 | |||
96 | _GLOBAL(_insw) | ||
97 | cmpwi 0,r5,0 | ||
98 | mtctr r5 | ||
99 | subi r4,r4,2 | ||
100 | blelr- | ||
101 | 00: lhbrx r5,0,r3 | ||
102 | eieio | ||
103 | sthu r5,2(r4) | ||
104 | bdnz 00b | ||
105 | IN_SYNC | ||
106 | blr | ||
107 | |||
108 | _GLOBAL(_outsw) | ||
109 | cmpwi 0,r5,0 | ||
110 | mtctr r5 | ||
111 | subi r4,r4,2 | ||
112 | blelr- | ||
113 | 00: lhzu r5,2(r4) | ||
114 | EIEIO_32 | ||
115 | sthbrx r5,0,r3 | ||
116 | bdnz 00b | ||
117 | SYNC_64 | ||
118 | blr | ||
119 | |||
120 | _GLOBAL(_insl) | ||
121 | cmpwi 0,r5,0 | ||
122 | mtctr r5 | ||
123 | subi r4,r4,4 | ||
124 | blelr- | ||
125 | 00: lwbrx r5,0,r3 | ||
126 | eieio | ||
127 | stwu r5,4(r4) | ||
128 | bdnz 00b | ||
129 | IN_SYNC | ||
130 | blr | ||
131 | |||
132 | _GLOBAL(_outsl) | ||
133 | cmpwi 0,r5,0 | ||
134 | mtctr r5 | ||
135 | subi r4,r4,4 | ||
136 | blelr- | ||
137 | 00: lwzu r5,4(r4) | ||
138 | stwbrx r5,0,r3 | ||
139 | EIEIO_32 | ||
140 | bdnz 00b | ||
141 | SYNC_64 | ||
142 | blr | ||
143 | |||
144 | #ifdef CONFIG_PPC32 | ||
145 | _GLOBAL(__ide_mm_insw) | ||
146 | #endif | ||
147 | _GLOBAL(_insw_ns) | ||
148 | cmpwi 0,r5,0 | ||
149 | mtctr r5 | ||
150 | subi r4,r4,2 | ||
151 | blelr- | ||
152 | 00: lhz r5,0(r3) | ||
153 | eieio | ||
154 | sthu r5,2(r4) | ||
155 | bdnz 00b | ||
156 | IN_SYNC | ||
157 | blr | ||
158 | |||
159 | #ifdef CONFIG_PPC32 | ||
160 | _GLOBAL(__ide_mm_outsw) | ||
161 | #endif | ||
162 | _GLOBAL(_outsw_ns) | ||
163 | cmpwi 0,r5,0 | ||
164 | mtctr r5 | ||
165 | subi r4,r4,2 | ||
166 | blelr- | ||
167 | 00: lhzu r5,2(r4) | ||
168 | sth r5,0(r3) | ||
169 | EIEIO_32 | ||
170 | bdnz 00b | ||
171 | SYNC_64 | ||
172 | blr | ||
173 | |||
174 | #ifdef CONFIG_PPC32 | ||
175 | _GLOBAL(__ide_mm_insl) | ||
176 | #endif | ||
177 | _GLOBAL(_insl_ns) | ||
178 | cmpwi 0,r5,0 | ||
179 | mtctr r5 | ||
180 | subi r4,r4,4 | ||
181 | blelr- | ||
182 | 00: lwz r5,0(r3) | ||
183 | eieio | ||
184 | stwu r5,4(r4) | ||
185 | bdnz 00b | ||
186 | IN_SYNC | ||
187 | blr | ||
188 | |||
189 | #ifdef CONFIG_PPC32 | ||
190 | _GLOBAL(__ide_mm_outsl) | ||
191 | #endif | ||
192 | _GLOBAL(_outsl_ns) | ||
193 | cmpwi 0,r5,0 | ||
194 | mtctr r5 | ||
195 | subi r4,r4,4 | ||
196 | blelr- | ||
197 | 00: lwzu r5,4(r4) | ||
198 | stw r5,0(r3) | ||
199 | EIEIO_32 | ||
200 | bdnz 00b | ||
201 | SYNC_64 | ||
202 | blr | ||
203 | |||
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index 01d3916c4cb1..c74774e2175d 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S | |||
@@ -61,32 +61,6 @@ _GLOBAL(mulhdu) | |||
61 | blr | 61 | blr |
62 | 62 | ||
63 | /* | 63 | /* |
64 | * Returns (address we're running at) - (address we were linked at) | ||
65 | * for use before the text and data are mapped to KERNELBASE. | ||
66 | */ | ||
67 | _GLOBAL(reloc_offset) | ||
68 | mflr r0 | ||
69 | bl 1f | ||
70 | 1: mflr r3 | ||
71 | LOAD_REG_IMMEDIATE(r4,1b) | ||
72 | subf r3,r4,r3 | ||
73 | mtlr r0 | ||
74 | blr | ||
75 | |||
76 | /* | ||
77 | * add_reloc_offset(x) returns x + reloc_offset(). | ||
78 | */ | ||
79 | _GLOBAL(add_reloc_offset) | ||
80 | mflr r0 | ||
81 | bl 1f | ||
82 | 1: mflr r5 | ||
83 | LOAD_REG_IMMEDIATE(r4,1b) | ||
84 | subf r5,r4,r5 | ||
85 | add r3,r3,r5 | ||
86 | mtlr r0 | ||
87 | blr | ||
88 | |||
89 | /* | ||
90 | * sub_reloc_offset(x) returns x - reloc_offset(). | 64 | * sub_reloc_offset(x) returns x - reloc_offset(). |
91 | */ | 65 | */ |
92 | _GLOBAL(sub_reloc_offset) | 66 | _GLOBAL(sub_reloc_offset) |
@@ -781,136 +755,6 @@ _GLOBAL(atomic_set_mask) | |||
781 | blr | 755 | blr |
782 | 756 | ||
783 | /* | 757 | /* |
784 | * I/O string operations | ||
785 | * | ||
786 | * insb(port, buf, len) | ||
787 | * outsb(port, buf, len) | ||
788 | * insw(port, buf, len) | ||
789 | * outsw(port, buf, len) | ||
790 | * insl(port, buf, len) | ||
791 | * outsl(port, buf, len) | ||
792 | * insw_ns(port, buf, len) | ||
793 | * outsw_ns(port, buf, len) | ||
794 | * insl_ns(port, buf, len) | ||
795 | * outsl_ns(port, buf, len) | ||
796 | * | ||
797 | * The *_ns versions don't do byte-swapping. | ||
798 | */ | ||
799 | _GLOBAL(_insb) | ||
800 | cmpwi 0,r5,0 | ||
801 | mtctr r5 | ||
802 | subi r4,r4,1 | ||
803 | blelr- | ||
804 | 00: lbz r5,0(r3) | ||
805 | eieio | ||
806 | stbu r5,1(r4) | ||
807 | bdnz 00b | ||
808 | blr | ||
809 | |||
810 | _GLOBAL(_outsb) | ||
811 | cmpwi 0,r5,0 | ||
812 | mtctr r5 | ||
813 | subi r4,r4,1 | ||
814 | blelr- | ||
815 | 00: lbzu r5,1(r4) | ||
816 | stb r5,0(r3) | ||
817 | eieio | ||
818 | bdnz 00b | ||
819 | blr | ||
820 | |||
821 | _GLOBAL(_insw) | ||
822 | cmpwi 0,r5,0 | ||
823 | mtctr r5 | ||
824 | subi r4,r4,2 | ||
825 | blelr- | ||
826 | 00: lhbrx r5,0,r3 | ||
827 | eieio | ||
828 | sthu r5,2(r4) | ||
829 | bdnz 00b | ||
830 | blr | ||
831 | |||
832 | _GLOBAL(_outsw) | ||
833 | cmpwi 0,r5,0 | ||
834 | mtctr r5 | ||
835 | subi r4,r4,2 | ||
836 | blelr- | ||
837 | 00: lhzu r5,2(r4) | ||
838 | eieio | ||
839 | sthbrx r5,0,r3 | ||
840 | bdnz 00b | ||
841 | blr | ||
842 | |||
843 | _GLOBAL(_insl) | ||
844 | cmpwi 0,r5,0 | ||
845 | mtctr r5 | ||
846 | subi r4,r4,4 | ||
847 | blelr- | ||
848 | 00: lwbrx r5,0,r3 | ||
849 | eieio | ||
850 | stwu r5,4(r4) | ||
851 | bdnz 00b | ||
852 | blr | ||
853 | |||
854 | _GLOBAL(_outsl) | ||
855 | cmpwi 0,r5,0 | ||
856 | mtctr r5 | ||
857 | subi r4,r4,4 | ||
858 | blelr- | ||
859 | 00: lwzu r5,4(r4) | ||
860 | stwbrx r5,0,r3 | ||
861 | eieio | ||
862 | bdnz 00b | ||
863 | blr | ||
864 | |||
865 | _GLOBAL(__ide_mm_insw) | ||
866 | _GLOBAL(_insw_ns) | ||
867 | cmpwi 0,r5,0 | ||
868 | mtctr r5 | ||
869 | subi r4,r4,2 | ||
870 | blelr- | ||
871 | 00: lhz r5,0(r3) | ||
872 | eieio | ||
873 | sthu r5,2(r4) | ||
874 | bdnz 00b | ||
875 | blr | ||
876 | |||
877 | _GLOBAL(__ide_mm_outsw) | ||
878 | _GLOBAL(_outsw_ns) | ||
879 | cmpwi 0,r5,0 | ||
880 | mtctr r5 | ||
881 | subi r4,r4,2 | ||
882 | blelr- | ||
883 | 00: lhzu r5,2(r4) | ||
884 | sth r5,0(r3) | ||
885 | eieio | ||
886 | bdnz 00b | ||
887 | blr | ||
888 | |||
889 | _GLOBAL(__ide_mm_insl) | ||
890 | _GLOBAL(_insl_ns) | ||
891 | cmpwi 0,r5,0 | ||
892 | mtctr r5 | ||
893 | subi r4,r4,4 | ||
894 | blelr- | ||
895 | 00: lwz r5,0(r3) | ||
896 | eieio | ||
897 | stwu r5,4(r4) | ||
898 | bdnz 00b | ||
899 | blr | ||
900 | |||
901 | _GLOBAL(__ide_mm_outsl) | ||
902 | _GLOBAL(_outsl_ns) | ||
903 | cmpwi 0,r5,0 | ||
904 | mtctr r5 | ||
905 | subi r4,r4,4 | ||
906 | blelr- | ||
907 | 00: lwzu r5,4(r4) | ||
908 | stw r5,0(r3) | ||
909 | eieio | ||
910 | bdnz 00b | ||
911 | blr | ||
912 | |||
913 | /* | ||
914 | * Extended precision shifts. | 758 | * Extended precision shifts. |
915 | * | 759 | * |
916 | * Updated to be valid for shift counts from 0 to 63 inclusive. | 760 | * Updated to be valid for shift counts from 0 to 63 inclusive. |
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index e8883d42c43c..580891cb8ccb 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
@@ -1,14 +1,12 @@ | |||
1 | /* | 1 | /* |
2 | * arch/powerpc/kernel/misc64.S | ||
3 | * | ||
4 | * This file contains miscellaneous low-level functions. | 2 | * This file contains miscellaneous low-level functions. |
5 | * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) | 3 | * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) |
6 | * | 4 | * |
7 | * Largely rewritten by Cort Dougan (cort@cs.nmt.edu) | 5 | * Largely rewritten by Cort Dougan (cort@cs.nmt.edu) |
8 | * and Paul Mackerras. | 6 | * and Paul Mackerras. |
9 | * Adapted for iSeries by Mike Corrigan (mikejc@us.ibm.com) | 7 | * Adapted for iSeries by Mike Corrigan (mikejc@us.ibm.com) |
10 | * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com) | 8 | * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com) |
11 | * | 9 | * |
12 | * This program is free software; you can redistribute it and/or | 10 | * This program is free software; you can redistribute it and/or |
13 | * modify it under the terms of the GNU General Public License | 11 | * modify it under the terms of the GNU General Public License |
14 | * as published by the Free Software Foundation; either version | 12 | * as published by the Free Software Foundation; either version |
@@ -30,41 +28,10 @@ | |||
30 | 28 | ||
31 | .text | 29 | .text |
32 | 30 | ||
33 | /* | ||
34 | * Returns (address we are running at) - (address we were linked at) | ||
35 | * for use before the text and data are mapped to KERNELBASE. | ||
36 | */ | ||
37 | |||
38 | _GLOBAL(reloc_offset) | ||
39 | mflr r0 | ||
40 | bl 1f | ||
41 | 1: mflr r3 | ||
42 | LOAD_REG_IMMEDIATE(r4,1b) | ||
43 | subf r3,r4,r3 | ||
44 | mtlr r0 | ||
45 | blr | ||
46 | |||
47 | /* | ||
48 | * add_reloc_offset(x) returns x + reloc_offset(). | ||
49 | */ | ||
50 | _GLOBAL(add_reloc_offset) | ||
51 | mflr r0 | ||
52 | bl 1f | ||
53 | 1: mflr r5 | ||
54 | LOAD_REG_IMMEDIATE(r4,1b) | ||
55 | subf r5,r4,r5 | ||
56 | add r3,r3,r5 | ||
57 | mtlr r0 | ||
58 | blr | ||
59 | |||
60 | _GLOBAL(get_msr) | 31 | _GLOBAL(get_msr) |
61 | mfmsr r3 | 32 | mfmsr r3 |
62 | blr | 33 | blr |
63 | 34 | ||
64 | _GLOBAL(get_dar) | ||
65 | mfdar r3 | ||
66 | blr | ||
67 | |||
68 | _GLOBAL(get_srr0) | 35 | _GLOBAL(get_srr0) |
69 | mfsrr0 r3 | 36 | mfsrr0 r3 |
70 | blr | 37 | blr |
@@ -72,10 +39,6 @@ _GLOBAL(get_srr0) | |||
72 | _GLOBAL(get_srr1) | 39 | _GLOBAL(get_srr1) |
73 | mfsrr1 r3 | 40 | mfsrr1 r3 |
74 | blr | 41 | blr |
75 | |||
76 | _GLOBAL(get_sp) | ||
77 | mr r3,r1 | ||
78 | blr | ||
79 | 42 | ||
80 | #ifdef CONFIG_IRQSTACKS | 43 | #ifdef CONFIG_IRQSTACKS |
81 | _GLOBAL(call_do_softirq) | 44 | _GLOBAL(call_do_softirq) |
@@ -101,48 +64,6 @@ _GLOBAL(call___do_IRQ) | |||
101 | blr | 64 | blr |
102 | #endif /* CONFIG_IRQSTACKS */ | 65 | #endif /* CONFIG_IRQSTACKS */ |
103 | 66 | ||
104 | /* | ||
105 | * To be called by C code which needs to do some operations with MMU | ||
106 | * disabled. Note that interrupts have to be disabled by the caller | ||
107 | * prior to calling us. The code called _MUST_ be in the RMO of course | ||
108 | * and part of the linear mapping as we don't attempt to translate the | ||
109 | * stack pointer at all. The function is called with the stack switched | ||
110 | * to this CPU emergency stack | ||
111 | * | ||
112 | * prototype is void *call_with_mmu_off(void *func, void *data); | ||
113 | * | ||
114 | * the called function is expected to be of the form | ||
115 | * | ||
116 | * void *called(void *data); | ||
117 | */ | ||
118 | _GLOBAL(call_with_mmu_off) | ||
119 | mflr r0 /* get link, save it on stackframe */ | ||
120 | std r0,16(r1) | ||
121 | mr r1,r5 /* save old stack ptr */ | ||
122 | ld r1,PACAEMERGSP(r13) /* get emerg. stack */ | ||
123 | subi r1,r1,STACK_FRAME_OVERHEAD | ||
124 | std r0,16(r1) /* save link on emerg. stack */ | ||
125 | std r5,0(r1) /* save old stack ptr in backchain */ | ||
126 | ld r3,0(r3) /* get to real function ptr (assume same TOC) */ | ||
127 | bl 2f /* we need LR to return, continue at label 2 */ | ||
128 | |||
129 | ld r0,16(r1) /* we return here from the call, get LR and */ | ||
130 | ld r1,0(r1) /* .. old stack ptr */ | ||
131 | mtspr SPRN_SRR0,r0 /* and get back to virtual mode with these */ | ||
132 | mfmsr r4 | ||
133 | ori r4,r4,MSR_IR|MSR_DR | ||
134 | mtspr SPRN_SRR1,r4 | ||
135 | rfid | ||
136 | |||
137 | 2: mtspr SPRN_SRR0,r3 /* coming from above, enter real mode */ | ||
138 | mr r3,r4 /* get parameter */ | ||
139 | mfmsr r0 | ||
140 | ori r0,r0,MSR_IR|MSR_DR | ||
141 | xori r0,r0,MSR_IR|MSR_DR | ||
142 | mtspr SPRN_SRR1,r0 | ||
143 | rfid | ||
144 | |||
145 | |||
146 | .section ".toc","aw" | 67 | .section ".toc","aw" |
147 | PPC64_CACHES: | 68 | PPC64_CACHES: |
148 | .tc ppc64_caches[TC],ppc64_caches | 69 | .tc ppc64_caches[TC],ppc64_caches |
@@ -323,144 +244,6 @@ _GLOBAL(__flush_dcache_icache) | |||
323 | bdnz 1b | 244 | bdnz 1b |
324 | isync | 245 | isync |
325 | blr | 246 | blr |
326 | |||
327 | /* | ||
328 | * I/O string operations | ||
329 | * | ||
330 | * insb(port, buf, len) | ||
331 | * outsb(port, buf, len) | ||
332 | * insw(port, buf, len) | ||
333 | * outsw(port, buf, len) | ||
334 | * insl(port, buf, len) | ||
335 | * outsl(port, buf, len) | ||
336 | * insw_ns(port, buf, len) | ||
337 | * outsw_ns(port, buf, len) | ||
338 | * insl_ns(port, buf, len) | ||
339 | * outsl_ns(port, buf, len) | ||
340 | * | ||
341 | * The *_ns versions don't do byte-swapping. | ||
342 | */ | ||
343 | _GLOBAL(_insb) | ||
344 | cmpwi 0,r5,0 | ||
345 | mtctr r5 | ||
346 | subi r4,r4,1 | ||
347 | blelr- | ||
348 | 00: lbz r5,0(r3) | ||
349 | eieio | ||
350 | stbu r5,1(r4) | ||
351 | bdnz 00b | ||
352 | twi 0,r5,0 | ||
353 | isync | ||
354 | blr | ||
355 | |||
356 | _GLOBAL(_outsb) | ||
357 | cmpwi 0,r5,0 | ||
358 | mtctr r5 | ||
359 | subi r4,r4,1 | ||
360 | blelr- | ||
361 | 00: lbzu r5,1(r4) | ||
362 | stb r5,0(r3) | ||
363 | bdnz 00b | ||
364 | sync | ||
365 | blr | ||
366 | |||
367 | _GLOBAL(_insw) | ||
368 | cmpwi 0,r5,0 | ||
369 | mtctr r5 | ||
370 | subi r4,r4,2 | ||
371 | blelr- | ||
372 | 00: lhbrx r5,0,r3 | ||
373 | eieio | ||
374 | sthu r5,2(r4) | ||
375 | bdnz 00b | ||
376 | twi 0,r5,0 | ||
377 | isync | ||
378 | blr | ||
379 | |||
380 | _GLOBAL(_outsw) | ||
381 | cmpwi 0,r5,0 | ||
382 | mtctr r5 | ||
383 | subi r4,r4,2 | ||
384 | blelr- | ||
385 | 00: lhzu r5,2(r4) | ||
386 | sthbrx r5,0,r3 | ||
387 | bdnz 00b | ||
388 | sync | ||
389 | blr | ||
390 | |||
391 | _GLOBAL(_insl) | ||
392 | cmpwi 0,r5,0 | ||
393 | mtctr r5 | ||
394 | subi r4,r4,4 | ||
395 | blelr- | ||
396 | 00: lwbrx r5,0,r3 | ||
397 | eieio | ||
398 | stwu r5,4(r4) | ||
399 | bdnz 00b | ||
400 | twi 0,r5,0 | ||
401 | isync | ||
402 | blr | ||
403 | |||
404 | _GLOBAL(_outsl) | ||
405 | cmpwi 0,r5,0 | ||
406 | mtctr r5 | ||
407 | subi r4,r4,4 | ||
408 | blelr- | ||
409 | 00: lwzu r5,4(r4) | ||
410 | stwbrx r5,0,r3 | ||
411 | bdnz 00b | ||
412 | sync | ||
413 | blr | ||
414 | |||
415 | /* _GLOBAL(ide_insw) now in drivers/ide/ide-iops.c */ | ||
416 | _GLOBAL(_insw_ns) | ||
417 | cmpwi 0,r5,0 | ||
418 | mtctr r5 | ||
419 | subi r4,r4,2 | ||
420 | blelr- | ||
421 | 00: lhz r5,0(r3) | ||
422 | eieio | ||
423 | sthu r5,2(r4) | ||
424 | bdnz 00b | ||
425 | twi 0,r5,0 | ||
426 | isync | ||
427 | blr | ||
428 | |||
429 | /* _GLOBAL(ide_outsw) now in drivers/ide/ide-iops.c */ | ||
430 | _GLOBAL(_outsw_ns) | ||
431 | cmpwi 0,r5,0 | ||
432 | mtctr r5 | ||
433 | subi r4,r4,2 | ||
434 | blelr- | ||
435 | 00: lhzu r5,2(r4) | ||
436 | sth r5,0(r3) | ||
437 | bdnz 00b | ||
438 | sync | ||
439 | blr | ||
440 | |||
441 | _GLOBAL(_insl_ns) | ||
442 | cmpwi 0,r5,0 | ||
443 | mtctr r5 | ||
444 | subi r4,r4,4 | ||
445 | blelr- | ||
446 | 00: lwz r5,0(r3) | ||
447 | eieio | ||
448 | stwu r5,4(r4) | ||
449 | bdnz 00b | ||
450 | twi 0,r5,0 | ||
451 | isync | ||
452 | blr | ||
453 | |||
454 | _GLOBAL(_outsl_ns) | ||
455 | cmpwi 0,r5,0 | ||
456 | mtctr r5 | ||
457 | subi r4,r4,4 | ||
458 | blelr- | ||
459 | 00: lwzu r5,4(r4) | ||
460 | stw r5,0(r3) | ||
461 | bdnz 00b | ||
462 | sync | ||
463 | blr | ||
464 | 247 | ||
465 | /* | 248 | /* |
466 | * identify_cpu and calls setup_cpu | 249 | * identify_cpu and calls setup_cpu |
@@ -605,6 +388,7 @@ _GLOBAL(real_writeb) | |||
605 | blr | 388 | blr |
606 | #endif /* defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) */ | 389 | #endif /* defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) */ |
607 | 390 | ||
391 | #ifdef CONFIG_CPU_FREQ_PMAC64 | ||
608 | /* | 392 | /* |
609 | * SCOM access functions for 970 (FX only for now) | 393 | * SCOM access functions for 970 (FX only for now) |
610 | * | 394 | * |
@@ -673,6 +457,7 @@ _GLOBAL(scom970_write) | |||
673 | /* restore interrupts */ | 457 | /* restore interrupts */ |
674 | mtmsrd r5,1 | 458 | mtmsrd r5,1 |
675 | blr | 459 | blr |
460 | #endif /* CONFIG_CPU_FREQ_PMAC64 */ | ||
676 | 461 | ||
677 | 462 | ||
678 | /* | 463 | /* |
diff --git a/arch/powerpc/kernel/paca.c b/arch/powerpc/kernel/paca.c index f505a8827e3e..a0bb354c1c08 100644 --- a/arch/powerpc/kernel/paca.c +++ b/arch/powerpc/kernel/paca.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <asm/ptrace.h> | 16 | #include <asm/ptrace.h> |
17 | #include <asm/page.h> | 17 | #include <asm/page.h> |
18 | #include <asm/lppaca.h> | 18 | #include <asm/lppaca.h> |
19 | #include <asm/iseries/it_lp_queue.h> | ||
20 | #include <asm/iseries/it_lp_reg_save.h> | 19 | #include <asm/iseries/it_lp_reg_save.h> |
21 | #include <asm/paca.h> | 20 | #include <asm/paca.h> |
22 | 21 | ||
diff --git a/arch/powerpc/kernel/pci_32.c b/arch/powerpc/kernel/pci_32.c index b5431ccf1147..8474355a1a4f 100644 --- a/arch/powerpc/kernel/pci_32.c +++ b/arch/powerpc/kernel/pci_32.c | |||
@@ -99,7 +99,7 @@ pcibios_fixup_resources(struct pci_dev *dev) | |||
99 | if (!res->flags) | 99 | if (!res->flags) |
100 | continue; | 100 | continue; |
101 | if (res->end == 0xffffffff) { | 101 | if (res->end == 0xffffffff) { |
102 | DBG("PCI:%s Resource %d [%08lx-%08lx] is unassigned\n", | 102 | DBG("PCI:%s Resource %d [%016llx-%016llx] is unassigned\n", |
103 | pci_name(dev), i, res->start, res->end); | 103 | pci_name(dev), i, res->start, res->end); |
104 | res->end -= res->start; | 104 | res->end -= res->start; |
105 | res->start = 0; | 105 | res->start = 0; |
@@ -117,7 +117,7 @@ pcibios_fixup_resources(struct pci_dev *dev) | |||
117 | res->start += offset; | 117 | res->start += offset; |
118 | res->end += offset; | 118 | res->end += offset; |
119 | #ifdef DEBUG | 119 | #ifdef DEBUG |
120 | printk("Fixup res %d (%lx) of dev %s: %lx -> %lx\n", | 120 | printk("Fixup res %d (%lx) of dev %s: %llx -> %llx\n", |
121 | i, res->flags, pci_name(dev), | 121 | i, res->flags, pci_name(dev), |
122 | res->start - offset, res->start); | 122 | res->start - offset, res->start); |
123 | #endif | 123 | #endif |
@@ -173,18 +173,18 @@ EXPORT_SYMBOL(pcibios_bus_to_resource); | |||
173 | * but we want to try to avoid allocating at 0x2900-0x2bff | 173 | * but we want to try to avoid allocating at 0x2900-0x2bff |
174 | * which might have be mirrored at 0x0100-0x03ff.. | 174 | * which might have be mirrored at 0x0100-0x03ff.. |
175 | */ | 175 | */ |
176 | void pcibios_align_resource(void *data, struct resource *res, unsigned long size, | 176 | void pcibios_align_resource(void *data, struct resource *res, |
177 | unsigned long align) | 177 | resource_size_t size, resource_size_t align) |
178 | { | 178 | { |
179 | struct pci_dev *dev = data; | 179 | struct pci_dev *dev = data; |
180 | 180 | ||
181 | if (res->flags & IORESOURCE_IO) { | 181 | if (res->flags & IORESOURCE_IO) { |
182 | unsigned long start = res->start; | 182 | resource_size_t start = res->start; |
183 | 183 | ||
184 | if (size > 0x100) { | 184 | if (size > 0x100) { |
185 | printk(KERN_ERR "PCI: I/O Region %s/%d too large" | 185 | printk(KERN_ERR "PCI: I/O Region %s/%d too large" |
186 | " (%ld bytes)\n", pci_name(dev), | 186 | " (%lld bytes)\n", pci_name(dev), |
187 | dev->resource - res, size); | 187 | dev->resource - res, (unsigned long long)size); |
188 | } | 188 | } |
189 | 189 | ||
190 | if (start & 0x300) { | 190 | if (start & 0x300) { |
@@ -255,8 +255,8 @@ pcibios_allocate_bus_resources(struct list_head *bus_list) | |||
255 | } | 255 | } |
256 | } | 256 | } |
257 | 257 | ||
258 | DBG("PCI: bridge rsrc %lx..%lx (%lx), parent %p\n", | 258 | DBG("PCI: bridge rsrc %llx..%llx (%lx), parent %p\n", |
259 | res->start, res->end, res->flags, pr); | 259 | res->start, res->end, res->flags, pr); |
260 | if (pr) { | 260 | if (pr) { |
261 | if (request_resource(pr, res) == 0) | 261 | if (request_resource(pr, res) == 0) |
262 | continue; | 262 | continue; |
@@ -306,7 +306,7 @@ reparent_resources(struct resource *parent, struct resource *res) | |||
306 | *pp = NULL; | 306 | *pp = NULL; |
307 | for (p = res->child; p != NULL; p = p->sibling) { | 307 | for (p = res->child; p != NULL; p = p->sibling) { |
308 | p->parent = res; | 308 | p->parent = res; |
309 | DBG(KERN_INFO "PCI: reparented %s [%lx..%lx] under %s\n", | 309 | DBG(KERN_INFO "PCI: reparented %s [%llx..%llx] under %s\n", |
310 | p->name, p->start, p->end, res->name); | 310 | p->name, p->start, p->end, res->name); |
311 | } | 311 | } |
312 | return 0; | 312 | return 0; |
@@ -362,13 +362,14 @@ pci_relocate_bridge_resource(struct pci_bus *bus, int i) | |||
362 | try = conflict->start - 1; | 362 | try = conflict->start - 1; |
363 | } | 363 | } |
364 | if (request_resource(pr, res)) { | 364 | if (request_resource(pr, res)) { |
365 | DBG(KERN_ERR "PCI: huh? couldn't move to %lx..%lx\n", | 365 | DBG(KERN_ERR "PCI: huh? couldn't move to %llx..%llx\n", |
366 | res->start, res->end); | 366 | res->start, res->end); |
367 | return -1; /* "can't happen" */ | 367 | return -1; /* "can't happen" */ |
368 | } | 368 | } |
369 | update_bridge_base(bus, i); | 369 | update_bridge_base(bus, i); |
370 | printk(KERN_INFO "PCI: bridge %d resource %d moved to %lx..%lx\n", | 370 | printk(KERN_INFO "PCI: bridge %d resource %d moved to %llx..%llx\n", |
371 | bus->number, i, res->start, res->end); | 371 | bus->number, i, (unsigned long long)res->start, |
372 | (unsigned long long)res->end); | ||
372 | return 0; | 373 | return 0; |
373 | } | 374 | } |
374 | 375 | ||
@@ -479,14 +480,14 @@ static inline void alloc_resource(struct pci_dev *dev, int idx) | |||
479 | { | 480 | { |
480 | struct resource *pr, *r = &dev->resource[idx]; | 481 | struct resource *pr, *r = &dev->resource[idx]; |
481 | 482 | ||
482 | DBG("PCI:%s: Resource %d: %08lx-%08lx (f=%lx)\n", | 483 | DBG("PCI:%s: Resource %d: %016llx-%016llx (f=%lx)\n", |
483 | pci_name(dev), idx, r->start, r->end, r->flags); | 484 | pci_name(dev), idx, r->start, r->end, r->flags); |
484 | pr = pci_find_parent_resource(dev, r); | 485 | pr = pci_find_parent_resource(dev, r); |
485 | if (!pr || request_resource(pr, r) < 0) { | 486 | if (!pr || request_resource(pr, r) < 0) { |
486 | printk(KERN_ERR "PCI: Cannot allocate resource region %d" | 487 | printk(KERN_ERR "PCI: Cannot allocate resource region %d" |
487 | " of device %s\n", idx, pci_name(dev)); | 488 | " of device %s\n", idx, pci_name(dev)); |
488 | if (pr) | 489 | if (pr) |
489 | DBG("PCI: parent is %p: %08lx-%08lx (f=%lx)\n", | 490 | DBG("PCI: parent is %p: %016llx-%016llx (f=%lx)\n", |
490 | pr, pr->start, pr->end, pr->flags); | 491 | pr, pr->start, pr->end, pr->flags); |
491 | /* We'll assign a new address later */ | 492 | /* We'll assign a new address later */ |
492 | r->flags |= IORESOURCE_UNSET; | 493 | r->flags |= IORESOURCE_UNSET; |
@@ -956,7 +957,7 @@ pci_process_bridge_OF_ranges(struct pci_controller *hose, | |||
956 | res = &hose->io_resource; | 957 | res = &hose->io_resource; |
957 | res->flags = IORESOURCE_IO; | 958 | res->flags = IORESOURCE_IO; |
958 | res->start = ranges[2]; | 959 | res->start = ranges[2]; |
959 | DBG("PCI: IO 0x%lx -> 0x%lx\n", | 960 | DBG("PCI: IO 0x%llx -> 0x%llx\n", |
960 | res->start, res->start + size - 1); | 961 | res->start, res->start + size - 1); |
961 | break; | 962 | break; |
962 | case 2: /* memory space */ | 963 | case 2: /* memory space */ |
@@ -978,7 +979,7 @@ pci_process_bridge_OF_ranges(struct pci_controller *hose, | |||
978 | if(ranges[0] & 0x40000000) | 979 | if(ranges[0] & 0x40000000) |
979 | res->flags |= IORESOURCE_PREFETCH; | 980 | res->flags |= IORESOURCE_PREFETCH; |
980 | res->start = ranges[na+2]; | 981 | res->start = ranges[na+2]; |
981 | DBG("PCI: MEM[%d] 0x%lx -> 0x%lx\n", memno, | 982 | DBG("PCI: MEM[%d] 0x%llx -> 0x%llx\n", memno, |
982 | res->start, res->start + size - 1); | 983 | res->start, res->start + size - 1); |
983 | } | 984 | } |
984 | break; | 985 | break; |
@@ -1074,7 +1075,7 @@ do_update_p2p_io_resource(struct pci_bus *bus, int enable_vga) | |||
1074 | DBG("Remapping Bus %d, bridge: %s\n", bus->number, pci_name(bridge)); | 1075 | DBG("Remapping Bus %d, bridge: %s\n", bus->number, pci_name(bridge)); |
1075 | res.start -= ((unsigned long) hose->io_base_virt - isa_io_base); | 1076 | res.start -= ((unsigned long) hose->io_base_virt - isa_io_base); |
1076 | res.end -= ((unsigned long) hose->io_base_virt - isa_io_base); | 1077 | res.end -= ((unsigned long) hose->io_base_virt - isa_io_base); |
1077 | DBG(" IO window: %08lx-%08lx\n", res.start, res.end); | 1078 | DBG(" IO window: %016llx-%016llx\n", res.start, res.end); |
1078 | 1079 | ||
1079 | /* Set up the top and bottom of the PCI I/O segment for this bus. */ | 1080 | /* Set up the top and bottom of the PCI I/O segment for this bus. */ |
1080 | pci_read_config_dword(bridge, PCI_IO_BASE, &l); | 1081 | pci_read_config_dword(bridge, PCI_IO_BASE, &l); |
@@ -1223,8 +1224,8 @@ do_fixup_p2p_level(struct pci_bus *bus) | |||
1223 | continue; | 1224 | continue; |
1224 | if ((r->flags & IORESOURCE_IO) == 0) | 1225 | if ((r->flags & IORESOURCE_IO) == 0) |
1225 | continue; | 1226 | continue; |
1226 | DBG("Trying to allocate from %08lx, size %08lx from parent" | 1227 | DBG("Trying to allocate from %016llx, size %016llx from parent" |
1227 | " res %d: %08lx -> %08lx\n", | 1228 | " res %d: %016llx -> %016llx\n", |
1228 | res->start, res->end, i, r->start, r->end); | 1229 | res->start, res->end, i, r->start, r->end); |
1229 | 1230 | ||
1230 | if (allocate_resource(r, res, res->end + 1, res->start, max, | 1231 | if (allocate_resource(r, res, res->end + 1, res->start, max, |
@@ -1574,8 +1575,8 @@ static pgprot_t __pci_mmap_set_pgprot(struct pci_dev *dev, struct resource *rp, | |||
1574 | else | 1575 | else |
1575 | prot |= _PAGE_GUARDED; | 1576 | prot |= _PAGE_GUARDED; |
1576 | 1577 | ||
1577 | printk("PCI map for %s:%lx, prot: %lx\n", pci_name(dev), rp->start, | 1578 | printk("PCI map for %s:%llx, prot: %lx\n", pci_name(dev), |
1578 | prot); | 1579 | (unsigned long long)rp->start, prot); |
1579 | 1580 | ||
1580 | return __pgprot(prot); | 1581 | return __pgprot(prot); |
1581 | } | 1582 | } |
@@ -1755,7 +1756,7 @@ long sys_pciconfig_iobase(long which, unsigned long bus, unsigned long devfn) | |||
1755 | 1756 | ||
1756 | void pci_resource_to_user(const struct pci_dev *dev, int bar, | 1757 | void pci_resource_to_user(const struct pci_dev *dev, int bar, |
1757 | const struct resource *rsrc, | 1758 | const struct resource *rsrc, |
1758 | u64 *start, u64 *end) | 1759 | resource_size_t *start, resource_size_t *end) |
1759 | { | 1760 | { |
1760 | struct pci_controller *hose = pci_bus_to_hose(dev->bus->number); | 1761 | struct pci_controller *hose = pci_bus_to_hose(dev->bus->number); |
1761 | unsigned long offset = 0; | 1762 | unsigned long offset = 0; |
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c index 247937dd8b73..286aa52aae33 100644 --- a/arch/powerpc/kernel/pci_64.c +++ b/arch/powerpc/kernel/pci_64.c | |||
@@ -138,11 +138,11 @@ EXPORT_SYMBOL(pcibios_bus_to_resource); | |||
138 | * which might have be mirrored at 0x0100-0x03ff.. | 138 | * which might have be mirrored at 0x0100-0x03ff.. |
139 | */ | 139 | */ |
140 | void pcibios_align_resource(void *data, struct resource *res, | 140 | void pcibios_align_resource(void *data, struct resource *res, |
141 | unsigned long size, unsigned long align) | 141 | resource_size_t size, resource_size_t align) |
142 | { | 142 | { |
143 | struct pci_dev *dev = data; | 143 | struct pci_dev *dev = data; |
144 | struct pci_controller *hose = pci_bus_to_host(dev->bus); | 144 | struct pci_controller *hose = pci_bus_to_host(dev->bus); |
145 | unsigned long start = res->start; | 145 | resource_size_t start = res->start; |
146 | unsigned long alignto; | 146 | unsigned long alignto; |
147 | 147 | ||
148 | if (res->flags & IORESOURCE_IO) { | 148 | if (res->flags & IORESOURCE_IO) { |
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 483455c5bb02..320c913435cd 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/bitops.h> | 30 | #include <linux/bitops.h> |
31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
32 | #include <linux/kexec.h> | 32 | #include <linux/kexec.h> |
33 | #include <linux/debugfs.h> | ||
33 | 34 | ||
34 | #include <asm/prom.h> | 35 | #include <asm/prom.h> |
35 | #include <asm/rtas.h> | 36 | #include <asm/rtas.h> |
@@ -952,6 +953,7 @@ static struct ibm_pa_feature { | |||
952 | /* put this back once we know how to test if firmware does 64k IO */ | 953 | /* put this back once we know how to test if firmware does 64k IO */ |
953 | {CPU_FTR_CI_LARGE_PAGE, 0, 1, 2, 0}, | 954 | {CPU_FTR_CI_LARGE_PAGE, 0, 1, 2, 0}, |
954 | #endif | 955 | #endif |
956 | {CPU_FTR_REAL_LE, PPC_FEATURE_TRUE_LE, 5, 0, 0}, | ||
955 | }; | 957 | }; |
956 | 958 | ||
957 | static void __init check_cpu_pa_features(unsigned long node) | 959 | static void __init check_cpu_pa_features(unsigned long node) |
@@ -1124,24 +1126,6 @@ static int __init early_init_dt_scan_chosen(unsigned long node, | |||
1124 | tce_alloc_end = *lprop; | 1126 | tce_alloc_end = *lprop; |
1125 | #endif | 1127 | #endif |
1126 | 1128 | ||
1127 | #ifdef CONFIG_PPC_RTAS | ||
1128 | /* To help early debugging via the front panel, we retrieve a minimal | ||
1129 | * set of RTAS infos now if available | ||
1130 | */ | ||
1131 | { | ||
1132 | u64 *basep, *entryp, *sizep; | ||
1133 | |||
1134 | basep = of_get_flat_dt_prop(node, "linux,rtas-base", NULL); | ||
1135 | entryp = of_get_flat_dt_prop(node, "linux,rtas-entry", NULL); | ||
1136 | sizep = of_get_flat_dt_prop(node, "linux,rtas-size", NULL); | ||
1137 | if (basep && entryp && sizep) { | ||
1138 | rtas.base = *basep; | ||
1139 | rtas.entry = *entryp; | ||
1140 | rtas.size = *sizep; | ||
1141 | } | ||
1142 | } | ||
1143 | #endif /* CONFIG_PPC_RTAS */ | ||
1144 | |||
1145 | #ifdef CONFIG_KEXEC | 1129 | #ifdef CONFIG_KEXEC |
1146 | lprop = (u64*)of_get_flat_dt_prop(node, "linux,crashkernel-base", NULL); | 1130 | lprop = (u64*)of_get_flat_dt_prop(node, "linux,crashkernel-base", NULL); |
1147 | if (lprop) | 1131 | if (lprop) |
@@ -1326,6 +1310,11 @@ void __init early_init_devtree(void *params) | |||
1326 | /* Setup flat device-tree pointer */ | 1310 | /* Setup flat device-tree pointer */ |
1327 | initial_boot_params = params; | 1311 | initial_boot_params = params; |
1328 | 1312 | ||
1313 | #ifdef CONFIG_PPC_RTAS | ||
1314 | /* Some machines might need RTAS info for debugging, grab it now. */ | ||
1315 | of_scan_flat_dt(early_init_dt_scan_rtas, NULL); | ||
1316 | #endif | ||
1317 | |||
1329 | /* Retrieve various informations from the /chosen node of the | 1318 | /* Retrieve various informations from the /chosen node of the |
1330 | * device-tree, including the platform type, initrd location and | 1319 | * device-tree, including the platform type, initrd location and |
1331 | * size, TCE reserve, and more ... | 1320 | * size, TCE reserve, and more ... |
@@ -2148,3 +2137,27 @@ struct device_node *of_get_cpu_node(int cpu, unsigned int *thread) | |||
2148 | } | 2137 | } |
2149 | return NULL; | 2138 | return NULL; |
2150 | } | 2139 | } |
2140 | |||
2141 | #ifdef DEBUG | ||
2142 | static struct debugfs_blob_wrapper flat_dt_blob; | ||
2143 | |||
2144 | static int __init export_flat_device_tree(void) | ||
2145 | { | ||
2146 | struct dentry *d; | ||
2147 | |||
2148 | d = debugfs_create_dir("powerpc", NULL); | ||
2149 | if (!d) | ||
2150 | return 1; | ||
2151 | |||
2152 | flat_dt_blob.data = initial_boot_params; | ||
2153 | flat_dt_blob.size = initial_boot_params->totalsize; | ||
2154 | |||
2155 | d = debugfs_create_blob("flat-device-tree", S_IFREG | S_IRUSR, | ||
2156 | d, &flat_dt_blob); | ||
2157 | if (!d) | ||
2158 | return 1; | ||
2159 | |||
2160 | return 0; | ||
2161 | } | ||
2162 | __initcall(export_flat_device_tree); | ||
2163 | #endif | ||
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index 17dc79198515..4a4cb5598402 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c | |||
@@ -38,16 +38,19 @@ | |||
38 | struct rtas_t rtas = { | 38 | struct rtas_t rtas = { |
39 | .lock = SPIN_LOCK_UNLOCKED | 39 | .lock = SPIN_LOCK_UNLOCKED |
40 | }; | 40 | }; |
41 | EXPORT_SYMBOL(rtas); | ||
41 | 42 | ||
42 | struct rtas_suspend_me_data { | 43 | struct rtas_suspend_me_data { |
43 | long waiting; | 44 | long waiting; |
44 | struct rtas_args *args; | 45 | struct rtas_args *args; |
45 | }; | 46 | }; |
46 | 47 | ||
47 | EXPORT_SYMBOL(rtas); | ||
48 | |||
49 | DEFINE_SPINLOCK(rtas_data_buf_lock); | 48 | DEFINE_SPINLOCK(rtas_data_buf_lock); |
49 | EXPORT_SYMBOL(rtas_data_buf_lock); | ||
50 | |||
50 | char rtas_data_buf[RTAS_DATA_BUF_SIZE] __cacheline_aligned; | 51 | char rtas_data_buf[RTAS_DATA_BUF_SIZE] __cacheline_aligned; |
52 | EXPORT_SYMBOL(rtas_data_buf); | ||
53 | |||
51 | unsigned long rtas_rmo_buf; | 54 | unsigned long rtas_rmo_buf; |
52 | 55 | ||
53 | /* | 56 | /* |
@@ -106,11 +109,71 @@ static void call_rtas_display_status_delay(char c) | |||
106 | } | 109 | } |
107 | } | 110 | } |
108 | 111 | ||
109 | void __init udbg_init_rtas(void) | 112 | void __init udbg_init_rtas_panel(void) |
110 | { | 113 | { |
111 | udbg_putc = call_rtas_display_status_delay; | 114 | udbg_putc = call_rtas_display_status_delay; |
112 | } | 115 | } |
113 | 116 | ||
117 | #ifdef CONFIG_UDBG_RTAS_CONSOLE | ||
118 | |||
119 | /* If you think you're dying before early_init_dt_scan_rtas() does its | ||
120 | * work, you can hard code the token values for your firmware here and | ||
121 | * hardcode rtas.base/entry etc. | ||
122 | */ | ||
123 | static unsigned int rtas_putchar_token = RTAS_UNKNOWN_SERVICE; | ||
124 | static unsigned int rtas_getchar_token = RTAS_UNKNOWN_SERVICE; | ||
125 | |||
126 | static void udbg_rtascon_putc(char c) | ||
127 | { | ||
128 | int tries; | ||
129 | |||
130 | if (!rtas.base) | ||
131 | return; | ||
132 | |||
133 | /* Add CRs before LFs */ | ||
134 | if (c == '\n') | ||
135 | udbg_rtascon_putc('\r'); | ||
136 | |||
137 | /* if there is more than one character to be displayed, wait a bit */ | ||
138 | for (tries = 0; tries < 16; tries++) { | ||
139 | if (rtas_call(rtas_putchar_token, 1, 1, NULL, c) == 0) | ||
140 | break; | ||
141 | udelay(1000); | ||
142 | } | ||
143 | } | ||
144 | |||
145 | static int udbg_rtascon_getc_poll(void) | ||
146 | { | ||
147 | int c; | ||
148 | |||
149 | if (!rtas.base) | ||
150 | return -1; | ||
151 | |||
152 | if (rtas_call(rtas_getchar_token, 0, 2, &c)) | ||
153 | return -1; | ||
154 | |||
155 | return c; | ||
156 | } | ||
157 | |||
158 | static int udbg_rtascon_getc(void) | ||
159 | { | ||
160 | int c; | ||
161 | |||
162 | while ((c = udbg_rtascon_getc_poll()) == -1) | ||
163 | ; | ||
164 | |||
165 | return c; | ||
166 | } | ||
167 | |||
168 | |||
169 | void __init udbg_init_rtas_console(void) | ||
170 | { | ||
171 | udbg_putc = udbg_rtascon_putc; | ||
172 | udbg_getc = udbg_rtascon_getc; | ||
173 | udbg_getc_poll = udbg_rtascon_getc_poll; | ||
174 | } | ||
175 | #endif /* CONFIG_UDBG_RTAS_CONSOLE */ | ||
176 | |||
114 | void rtas_progress(char *s, unsigned short hex) | 177 | void rtas_progress(char *s, unsigned short hex) |
115 | { | 178 | { |
116 | struct device_node *root; | 179 | struct device_node *root; |
@@ -236,6 +299,7 @@ int rtas_token(const char *service) | |||
236 | tokp = (int *) get_property(rtas.dev, service, NULL); | 299 | tokp = (int *) get_property(rtas.dev, service, NULL); |
237 | return tokp ? *tokp : RTAS_UNKNOWN_SERVICE; | 300 | return tokp ? *tokp : RTAS_UNKNOWN_SERVICE; |
238 | } | 301 | } |
302 | EXPORT_SYMBOL(rtas_token); | ||
239 | 303 | ||
240 | #ifdef CONFIG_RTAS_ERROR_LOGGING | 304 | #ifdef CONFIG_RTAS_ERROR_LOGGING |
241 | /* | 305 | /* |
@@ -328,7 +392,7 @@ int rtas_call(int token, int nargs, int nret, int *outputs, ...) | |||
328 | char *buff_copy = NULL; | 392 | char *buff_copy = NULL; |
329 | int ret; | 393 | int ret; |
330 | 394 | ||
331 | if (token == RTAS_UNKNOWN_SERVICE) | 395 | if (!rtas.entry || token == RTAS_UNKNOWN_SERVICE) |
332 | return -1; | 396 | return -1; |
333 | 397 | ||
334 | /* Gotta do something different here, use global lock for now... */ | 398 | /* Gotta do something different here, use global lock for now... */ |
@@ -369,6 +433,7 @@ int rtas_call(int token, int nargs, int nret, int *outputs, ...) | |||
369 | } | 433 | } |
370 | return ret; | 434 | return ret; |
371 | } | 435 | } |
436 | EXPORT_SYMBOL(rtas_call); | ||
372 | 437 | ||
373 | /* For RTAS_BUSY (-2), delay for 1 millisecond. For an extended busy status | 438 | /* For RTAS_BUSY (-2), delay for 1 millisecond. For an extended busy status |
374 | * code of 990n, perform the hinted delay of 10^n (last digit) milliseconds. | 439 | * code of 990n, perform the hinted delay of 10^n (last digit) milliseconds. |
@@ -388,6 +453,7 @@ unsigned int rtas_busy_delay_time(int status) | |||
388 | 453 | ||
389 | return ms; | 454 | return ms; |
390 | } | 455 | } |
456 | EXPORT_SYMBOL(rtas_busy_delay_time); | ||
391 | 457 | ||
392 | /* For an RTAS busy status code, perform the hinted delay. */ | 458 | /* For an RTAS busy status code, perform the hinted delay. */ |
393 | unsigned int rtas_busy_delay(int status) | 459 | unsigned int rtas_busy_delay(int status) |
@@ -401,6 +467,7 @@ unsigned int rtas_busy_delay(int status) | |||
401 | 467 | ||
402 | return ms; | 468 | return ms; |
403 | } | 469 | } |
470 | EXPORT_SYMBOL(rtas_busy_delay); | ||
404 | 471 | ||
405 | int rtas_error_rc(int rtas_rc) | 472 | int rtas_error_rc(int rtas_rc) |
406 | { | 473 | { |
@@ -446,6 +513,7 @@ int rtas_get_power_level(int powerdomain, int *level) | |||
446 | return rtas_error_rc(rc); | 513 | return rtas_error_rc(rc); |
447 | return rc; | 514 | return rc; |
448 | } | 515 | } |
516 | EXPORT_SYMBOL(rtas_get_power_level); | ||
449 | 517 | ||
450 | int rtas_set_power_level(int powerdomain, int level, int *setlevel) | 518 | int rtas_set_power_level(int powerdomain, int level, int *setlevel) |
451 | { | 519 | { |
@@ -463,6 +531,7 @@ int rtas_set_power_level(int powerdomain, int level, int *setlevel) | |||
463 | return rtas_error_rc(rc); | 531 | return rtas_error_rc(rc); |
464 | return rc; | 532 | return rc; |
465 | } | 533 | } |
534 | EXPORT_SYMBOL(rtas_set_power_level); | ||
466 | 535 | ||
467 | int rtas_get_sensor(int sensor, int index, int *state) | 536 | int rtas_get_sensor(int sensor, int index, int *state) |
468 | { | 537 | { |
@@ -480,6 +549,7 @@ int rtas_get_sensor(int sensor, int index, int *state) | |||
480 | return rtas_error_rc(rc); | 549 | return rtas_error_rc(rc); |
481 | return rc; | 550 | return rc; |
482 | } | 551 | } |
552 | EXPORT_SYMBOL(rtas_get_sensor); | ||
483 | 553 | ||
484 | int rtas_set_indicator(int indicator, int index, int new_value) | 554 | int rtas_set_indicator(int indicator, int index, int new_value) |
485 | { | 555 | { |
@@ -497,6 +567,7 @@ int rtas_set_indicator(int indicator, int index, int new_value) | |||
497 | return rtas_error_rc(rc); | 567 | return rtas_error_rc(rc); |
498 | return rc; | 568 | return rc; |
499 | } | 569 | } |
570 | EXPORT_SYMBOL(rtas_set_indicator); | ||
500 | 571 | ||
501 | void rtas_restart(char *cmd) | 572 | void rtas_restart(char *cmd) |
502 | { | 573 | { |
@@ -791,14 +862,34 @@ void __init rtas_initialize(void) | |||
791 | #endif | 862 | #endif |
792 | } | 863 | } |
793 | 864 | ||
865 | int __init early_init_dt_scan_rtas(unsigned long node, | ||
866 | const char *uname, int depth, void *data) | ||
867 | { | ||
868 | u32 *basep, *entryp, *sizep; | ||
794 | 869 | ||
795 | EXPORT_SYMBOL(rtas_token); | 870 | if (depth != 1 || strcmp(uname, "rtas") != 0) |
796 | EXPORT_SYMBOL(rtas_call); | 871 | return 0; |
797 | EXPORT_SYMBOL(rtas_data_buf); | 872 | |
798 | EXPORT_SYMBOL(rtas_data_buf_lock); | 873 | basep = of_get_flat_dt_prop(node, "linux,rtas-base", NULL); |
799 | EXPORT_SYMBOL(rtas_busy_delay_time); | 874 | entryp = of_get_flat_dt_prop(node, "linux,rtas-entry", NULL); |
800 | EXPORT_SYMBOL(rtas_busy_delay); | 875 | sizep = of_get_flat_dt_prop(node, "rtas-size", NULL); |
801 | EXPORT_SYMBOL(rtas_get_sensor); | 876 | |
802 | EXPORT_SYMBOL(rtas_get_power_level); | 877 | if (basep && entryp && sizep) { |
803 | EXPORT_SYMBOL(rtas_set_power_level); | 878 | rtas.base = *basep; |
804 | EXPORT_SYMBOL(rtas_set_indicator); | 879 | rtas.entry = *entryp; |
880 | rtas.size = *sizep; | ||
881 | } | ||
882 | |||
883 | #ifdef CONFIG_UDBG_RTAS_CONSOLE | ||
884 | basep = of_get_flat_dt_prop(node, "put-term-char", NULL); | ||
885 | if (basep) | ||
886 | rtas_putchar_token = *basep; | ||
887 | |||
888 | basep = of_get_flat_dt_prop(node, "get-term-char", NULL); | ||
889 | if (basep) | ||
890 | rtas_getchar_token = *basep; | ||
891 | #endif | ||
892 | |||
893 | /* break now */ | ||
894 | return 1; | ||
895 | } | ||
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 78f3a5fd43f6..175539c9afa0 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -149,6 +149,13 @@ early_param("smt-enabled", early_smt_enabled); | |||
149 | #define check_smt_enabled() | 149 | #define check_smt_enabled() |
150 | #endif /* CONFIG_SMP */ | 150 | #endif /* CONFIG_SMP */ |
151 | 151 | ||
152 | /* Put the paca pointer into r13 and SPRG3 */ | ||
153 | void __init setup_paca(int cpu) | ||
154 | { | ||
155 | local_paca = &paca[cpu]; | ||
156 | mtspr(SPRN_SPRG3, local_paca); | ||
157 | } | ||
158 | |||
152 | /* | 159 | /* |
153 | * Early initialization entry point. This is called by head.S | 160 | * Early initialization entry point. This is called by head.S |
154 | * with MMU translation disabled. We rely on the "feature" of | 161 | * with MMU translation disabled. We rely on the "feature" of |
@@ -170,6 +177,9 @@ early_param("smt-enabled", early_smt_enabled); | |||
170 | 177 | ||
171 | void __init early_setup(unsigned long dt_ptr) | 178 | void __init early_setup(unsigned long dt_ptr) |
172 | { | 179 | { |
180 | /* Assume we're on cpu 0 for now. Don't write to the paca yet! */ | ||
181 | setup_paca(0); | ||
182 | |||
173 | /* Enable early debugging if any specified (see udbg.h) */ | 183 | /* Enable early debugging if any specified (see udbg.h) */ |
174 | udbg_early_init(); | 184 | udbg_early_init(); |
175 | 185 | ||
@@ -183,7 +193,7 @@ void __init early_setup(unsigned long dt_ptr) | |||
183 | early_init_devtree(__va(dt_ptr)); | 193 | early_init_devtree(__va(dt_ptr)); |
184 | 194 | ||
185 | /* Now we know the logical id of our boot cpu, setup the paca. */ | 195 | /* Now we know the logical id of our boot cpu, setup the paca. */ |
186 | setup_boot_paca(); | 196 | setup_paca(boot_cpuid); |
187 | 197 | ||
188 | /* Fix up paca fields required for the boot cpu */ | 198 | /* Fix up paca fields required for the boot cpu */ |
189 | get_paca()->cpu_start = 1; | 199 | get_paca()->cpu_start = 1; |
@@ -350,19 +360,11 @@ void __init setup_system(void) | |||
350 | */ | 360 | */ |
351 | unflatten_device_tree(); | 361 | unflatten_device_tree(); |
352 | 362 | ||
353 | #ifdef CONFIG_KEXEC | ||
354 | kexec_setup(); /* requires unflattened device tree. */ | ||
355 | #endif | ||
356 | |||
357 | /* | 363 | /* |
358 | * Fill the ppc64_caches & systemcfg structures with informations | 364 | * Fill the ppc64_caches & systemcfg structures with informations |
359 | * retrieved from the device-tree. Need to be called before | 365 | * retrieved from the device-tree. Need to be called before |
360 | * finish_device_tree() since the later requires some of the | 366 | * finish_device_tree() since the later requires some of the |
361 | * informations filled up here to properly parse the interrupt | 367 | * informations filled up here to properly parse the interrupt tree. |
362 | * tree. | ||
363 | * It also sets up the cache line sizes which allows to call | ||
364 | * routines like flush_icache_range (used by the hash init | ||
365 | * later on). | ||
366 | */ | 368 | */ |
367 | initialize_cache_info(); | 369 | initialize_cache_info(); |
368 | 370 | ||
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 52f5659534f4..fa6bd97b6b9d 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
@@ -52,9 +52,13 @@ | |||
52 | #include <asm/firmware.h> | 52 | #include <asm/firmware.h> |
53 | #include <asm/processor.h> | 53 | #include <asm/processor.h> |
54 | #endif | 54 | #endif |
55 | #include <asm/kexec.h> | ||
55 | 56 | ||
56 | #ifdef CONFIG_PPC64 /* XXX */ | 57 | #ifdef CONFIG_PPC64 /* XXX */ |
57 | #define _IO_BASE pci_io_base | 58 | #define _IO_BASE pci_io_base |
59 | #ifdef CONFIG_KEXEC | ||
60 | cpumask_t cpus_in_sr = CPU_MASK_NONE; | ||
61 | #endif | ||
58 | #endif | 62 | #endif |
59 | 63 | ||
60 | #ifdef CONFIG_DEBUGGER | 64 | #ifdef CONFIG_DEBUGGER |
@@ -97,7 +101,7 @@ static DEFINE_SPINLOCK(die_lock); | |||
97 | 101 | ||
98 | int die(const char *str, struct pt_regs *regs, long err) | 102 | int die(const char *str, struct pt_regs *regs, long err) |
99 | { | 103 | { |
100 | static int die_counter, crash_dump_start = 0; | 104 | static int die_counter; |
101 | 105 | ||
102 | if (debugger(regs)) | 106 | if (debugger(regs)) |
103 | return 1; | 107 | return 1; |
@@ -137,21 +141,12 @@ int die(const char *str, struct pt_regs *regs, long err) | |||
137 | print_modules(); | 141 | print_modules(); |
138 | show_regs(regs); | 142 | show_regs(regs); |
139 | bust_spinlocks(0); | 143 | bust_spinlocks(0); |
144 | spin_unlock_irq(&die_lock); | ||
140 | 145 | ||
141 | if (!crash_dump_start && kexec_should_crash(current)) { | 146 | if (kexec_should_crash(current) || |
142 | crash_dump_start = 1; | 147 | kexec_sr_activated(smp_processor_id())) |
143 | spin_unlock_irq(&die_lock); | ||
144 | crash_kexec(regs); | 148 | crash_kexec(regs); |
145 | /* NOTREACHED */ | 149 | crash_kexec_secondary(regs); |
146 | } | ||
147 | spin_unlock_irq(&die_lock); | ||
148 | if (crash_dump_start) | ||
149 | /* | ||
150 | * Only for soft-reset: Other CPUs will be responded to an IPI | ||
151 | * sent by first kexec CPU. | ||
152 | */ | ||
153 | for(;;) | ||
154 | ; | ||
155 | 150 | ||
156 | if (in_interrupt()) | 151 | if (in_interrupt()) |
157 | panic("Fatal exception in interrupt"); | 152 | panic("Fatal exception in interrupt"); |
@@ -215,6 +210,10 @@ void system_reset_exception(struct pt_regs *regs) | |||
215 | return; | 210 | return; |
216 | } | 211 | } |
217 | 212 | ||
213 | #ifdef CONFIG_KEXEC | ||
214 | cpu_set(smp_processor_id(), cpus_in_sr); | ||
215 | #endif | ||
216 | |||
218 | die("System Reset", regs, SIGABRT); | 217 | die("System Reset", regs, SIGABRT); |
219 | 218 | ||
220 | /* Must die if the interrupt is not recoverable */ | 219 | /* Must die if the interrupt is not recoverable */ |
diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c index 67d9fd9ae2b5..759afd5e0d8a 100644 --- a/arch/powerpc/kernel/udbg.c +++ b/arch/powerpc/kernel/udbg.c | |||
@@ -34,9 +34,12 @@ void __init udbg_early_init(void) | |||
34 | #elif defined(CONFIG_PPC_EARLY_DEBUG_G5) | 34 | #elif defined(CONFIG_PPC_EARLY_DEBUG_G5) |
35 | /* For use on Apple G5 machines */ | 35 | /* For use on Apple G5 machines */ |
36 | udbg_init_pmac_realmode(); | 36 | udbg_init_pmac_realmode(); |
37 | #elif defined(CONFIG_PPC_EARLY_DEBUG_RTAS) | 37 | #elif defined(CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL) |
38 | /* RTAS panel debug */ | 38 | /* RTAS panel debug */ |
39 | udbg_init_rtas(); | 39 | udbg_init_rtas_panel(); |
40 | #elif defined(CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE) | ||
41 | /* RTAS console debug */ | ||
42 | udbg_init_rtas_console(); | ||
40 | #elif defined(CONFIG_PPC_EARLY_DEBUG_MAPLE) | 43 | #elif defined(CONFIG_PPC_EARLY_DEBUG_MAPLE) |
41 | /* Maple real mode debug */ | 44 | /* Maple real mode debug */ |
42 | udbg_init_maple_realmode(); | 45 | udbg_init_maple_realmode(); |
diff --git a/arch/powerpc/mm/hash_native_64.c b/arch/powerpc/mm/hash_native_64.c index a0f3cbd00d39..c90f124f3c71 100644 --- a/arch/powerpc/mm/hash_native_64.c +++ b/arch/powerpc/mm/hash_native_64.c | |||
@@ -520,7 +520,7 @@ static inline int tlb_batching_enabled(void) | |||
520 | } | 520 | } |
521 | #endif | 521 | #endif |
522 | 522 | ||
523 | void hpte_init_native(void) | 523 | void __init hpte_init_native(void) |
524 | { | 524 | { |
525 | ppc_md.hpte_invalidate = native_hpte_invalidate; | 525 | ppc_md.hpte_invalidate = native_hpte_invalidate; |
526 | ppc_md.hpte_updatepp = native_hpte_updatepp; | 526 | ppc_md.hpte_updatepp = native_hpte_updatepp; |
@@ -530,5 +530,4 @@ void hpte_init_native(void) | |||
530 | ppc_md.hpte_clear_all = native_hpte_clear; | 530 | ppc_md.hpte_clear_all = native_hpte_clear; |
531 | if (tlb_batching_enabled()) | 531 | if (tlb_batching_enabled()) |
532 | ppc_md.flush_hash_range = native_flush_hash_range; | 532 | ppc_md.flush_hash_range = native_flush_hash_range; |
533 | htab_finish_init(); | ||
534 | } | 533 | } |
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index d03fd2b4445e..3cc6d68f7117 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
@@ -167,34 +167,12 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend, | |||
167 | hash = hpt_hash(va, shift); | 167 | hash = hpt_hash(va, shift); |
168 | hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); | 168 | hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); |
169 | 169 | ||
170 | /* The crap below can be cleaned once ppd_md.probe() can | 170 | DBG("htab_bolt_mapping: calling %p\n", ppc_md.hpte_insert); |
171 | * set up the hash callbacks, thus we can just used the | 171 | |
172 | * normal insert callback here. | 172 | BUG_ON(!ppc_md.hpte_insert); |
173 | */ | 173 | ret = ppc_md.hpte_insert(hpteg, va, paddr, |
174 | #ifdef CONFIG_PPC_ISERIES | 174 | tmp_mode, HPTE_V_BOLTED, psize); |
175 | if (machine_is(iseries)) | 175 | |
176 | ret = iSeries_hpte_insert(hpteg, va, | ||
177 | paddr, | ||
178 | tmp_mode, | ||
179 | HPTE_V_BOLTED, | ||
180 | psize); | ||
181 | else | ||
182 | #endif | ||
183 | #ifdef CONFIG_PPC_PSERIES | ||
184 | if (machine_is(pseries) && firmware_has_feature(FW_FEATURE_LPAR)) | ||
185 | ret = pSeries_lpar_hpte_insert(hpteg, va, | ||
186 | paddr, | ||
187 | tmp_mode, | ||
188 | HPTE_V_BOLTED, | ||
189 | psize); | ||
190 | else | ||
191 | #endif | ||
192 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
193 | ret = native_hpte_insert(hpteg, va, | ||
194 | paddr, | ||
195 | tmp_mode, HPTE_V_BOLTED, | ||
196 | psize); | ||
197 | #endif | ||
198 | if (ret < 0) | 176 | if (ret < 0) |
199 | break; | 177 | break; |
200 | } | 178 | } |
@@ -413,6 +391,41 @@ void create_section_mapping(unsigned long start, unsigned long end) | |||
413 | } | 391 | } |
414 | #endif /* CONFIG_MEMORY_HOTPLUG */ | 392 | #endif /* CONFIG_MEMORY_HOTPLUG */ |
415 | 393 | ||
394 | static inline void make_bl(unsigned int *insn_addr, void *func) | ||
395 | { | ||
396 | unsigned long funcp = *((unsigned long *)func); | ||
397 | int offset = funcp - (unsigned long)insn_addr; | ||
398 | |||
399 | *insn_addr = (unsigned int)(0x48000001 | (offset & 0x03fffffc)); | ||
400 | flush_icache_range((unsigned long)insn_addr, 4+ | ||
401 | (unsigned long)insn_addr); | ||
402 | } | ||
403 | |||
404 | static void __init htab_finish_init(void) | ||
405 | { | ||
406 | extern unsigned int *htab_call_hpte_insert1; | ||
407 | extern unsigned int *htab_call_hpte_insert2; | ||
408 | extern unsigned int *htab_call_hpte_remove; | ||
409 | extern unsigned int *htab_call_hpte_updatepp; | ||
410 | |||
411 | #ifdef CONFIG_PPC_64K_PAGES | ||
412 | extern unsigned int *ht64_call_hpte_insert1; | ||
413 | extern unsigned int *ht64_call_hpte_insert2; | ||
414 | extern unsigned int *ht64_call_hpte_remove; | ||
415 | extern unsigned int *ht64_call_hpte_updatepp; | ||
416 | |||
417 | make_bl(ht64_call_hpte_insert1, ppc_md.hpte_insert); | ||
418 | make_bl(ht64_call_hpte_insert2, ppc_md.hpte_insert); | ||
419 | make_bl(ht64_call_hpte_remove, ppc_md.hpte_remove); | ||
420 | make_bl(ht64_call_hpte_updatepp, ppc_md.hpte_updatepp); | ||
421 | #endif /* CONFIG_PPC_64K_PAGES */ | ||
422 | |||
423 | make_bl(htab_call_hpte_insert1, ppc_md.hpte_insert); | ||
424 | make_bl(htab_call_hpte_insert2, ppc_md.hpte_insert); | ||
425 | make_bl(htab_call_hpte_remove, ppc_md.hpte_remove); | ||
426 | make_bl(htab_call_hpte_updatepp, ppc_md.hpte_updatepp); | ||
427 | } | ||
428 | |||
416 | void __init htab_initialize(void) | 429 | void __init htab_initialize(void) |
417 | { | 430 | { |
418 | unsigned long table; | 431 | unsigned long table; |
@@ -525,6 +538,8 @@ void __init htab_initialize(void) | |||
525 | mmu_linear_psize)); | 538 | mmu_linear_psize)); |
526 | } | 539 | } |
527 | 540 | ||
541 | htab_finish_init(); | ||
542 | |||
528 | DBG(" <- htab_initialize()\n"); | 543 | DBG(" <- htab_initialize()\n"); |
529 | } | 544 | } |
530 | #undef KB | 545 | #undef KB |
@@ -787,16 +802,6 @@ void flush_hash_range(unsigned long number, int local) | |||
787 | } | 802 | } |
788 | } | 803 | } |
789 | 804 | ||
790 | static inline void make_bl(unsigned int *insn_addr, void *func) | ||
791 | { | ||
792 | unsigned long funcp = *((unsigned long *)func); | ||
793 | int offset = funcp - (unsigned long)insn_addr; | ||
794 | |||
795 | *insn_addr = (unsigned int)(0x48000001 | (offset & 0x03fffffc)); | ||
796 | flush_icache_range((unsigned long)insn_addr, 4+ | ||
797 | (unsigned long)insn_addr); | ||
798 | } | ||
799 | |||
800 | /* | 805 | /* |
801 | * low_hash_fault is called when we the low level hash code failed | 806 | * low_hash_fault is called when we the low level hash code failed |
802 | * to instert a PTE due to an hypervisor error | 807 | * to instert a PTE due to an hypervisor error |
@@ -815,28 +820,3 @@ void low_hash_fault(struct pt_regs *regs, unsigned long address) | |||
815 | } | 820 | } |
816 | bad_page_fault(regs, address, SIGBUS); | 821 | bad_page_fault(regs, address, SIGBUS); |
817 | } | 822 | } |
818 | |||
819 | void __init htab_finish_init(void) | ||
820 | { | ||
821 | extern unsigned int *htab_call_hpte_insert1; | ||
822 | extern unsigned int *htab_call_hpte_insert2; | ||
823 | extern unsigned int *htab_call_hpte_remove; | ||
824 | extern unsigned int *htab_call_hpte_updatepp; | ||
825 | |||
826 | #ifdef CONFIG_PPC_64K_PAGES | ||
827 | extern unsigned int *ht64_call_hpte_insert1; | ||
828 | extern unsigned int *ht64_call_hpte_insert2; | ||
829 | extern unsigned int *ht64_call_hpte_remove; | ||
830 | extern unsigned int *ht64_call_hpte_updatepp; | ||
831 | |||
832 | make_bl(ht64_call_hpte_insert1, ppc_md.hpte_insert); | ||
833 | make_bl(ht64_call_hpte_insert2, ppc_md.hpte_insert); | ||
834 | make_bl(ht64_call_hpte_remove, ppc_md.hpte_remove); | ||
835 | make_bl(ht64_call_hpte_updatepp, ppc_md.hpte_updatepp); | ||
836 | #endif /* CONFIG_PPC_64K_PAGES */ | ||
837 | |||
838 | make_bl(htab_call_hpte_insert1, ppc_md.hpte_insert); | ||
839 | make_bl(htab_call_hpte_insert2, ppc_md.hpte_insert); | ||
840 | make_bl(htab_call_hpte_remove, ppc_md.hpte_remove); | ||
841 | make_bl(htab_call_hpte_updatepp, ppc_md.hpte_updatepp); | ||
842 | } | ||
diff --git a/arch/powerpc/mm/mmu_context_64.c b/arch/powerpc/mm/mmu_context_64.c index 65d18dca266f..e2051efa09c5 100644 --- a/arch/powerpc/mm/mmu_context_64.c +++ b/arch/powerpc/mm/mmu_context_64.c | |||
@@ -44,7 +44,9 @@ again: | |||
44 | return err; | 44 | return err; |
45 | 45 | ||
46 | if (index > MAX_CONTEXT) { | 46 | if (index > MAX_CONTEXT) { |
47 | spin_lock(&mmu_context_lock); | ||
47 | idr_remove(&mmu_context_idr, index); | 48 | idr_remove(&mmu_context_idr, index); |
49 | spin_unlock(&mmu_context_lock); | ||
48 | return -ENOMEM; | 50 | return -ENOMEM; |
49 | } | 51 | } |
50 | 52 | ||
diff --git a/arch/powerpc/platforms/83xx/pci.c b/arch/powerpc/platforms/83xx/pci.c index 16f7d3b30e1d..3baceb00fefa 100644 --- a/arch/powerpc/platforms/83xx/pci.c +++ b/arch/powerpc/platforms/83xx/pci.c | |||
@@ -91,9 +91,10 @@ int __init add_bridge(struct device_node *dev) | |||
91 | mpc83xx_pci2_busno = hose->first_busno; | 91 | mpc83xx_pci2_busno = hose->first_busno; |
92 | } | 92 | } |
93 | 93 | ||
94 | printk(KERN_INFO "Found MPC83xx PCI host bridge at 0x%08lx. " | 94 | printk(KERN_INFO "Found MPC83xx PCI host bridge at 0x%016llx. " |
95 | "Firmware bus number: %d->%d\n", | 95 | "Firmware bus number: %d->%d\n", |
96 | rsrc.start, hose->first_busno, hose->last_busno); | 96 | (unsigned long long)rsrc.start, hose->first_busno, |
97 | hose->last_busno); | ||
97 | 98 | ||
98 | DBG(" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p\n", | 99 | DBG(" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p\n", |
99 | hose, hose->cfg_addr, hose->cfg_data); | 100 | hose, hose->cfg_addr, hose->cfg_data); |
diff --git a/arch/powerpc/platforms/85xx/pci.c b/arch/powerpc/platforms/85xx/pci.c index bad290110ed1..48c8849c07ca 100644 --- a/arch/powerpc/platforms/85xx/pci.c +++ b/arch/powerpc/platforms/85xx/pci.c | |||
@@ -79,9 +79,10 @@ int __init add_bridge(struct device_node *dev) | |||
79 | mpc85xx_pci2_busno = hose->first_busno; | 79 | mpc85xx_pci2_busno = hose->first_busno; |
80 | } | 80 | } |
81 | 81 | ||
82 | printk(KERN_INFO "Found MPC85xx PCI host bridge at 0x%08lx. " | 82 | printk(KERN_INFO "Found MPC85xx PCI host bridge at 0x%016llx. " |
83 | "Firmware bus number: %d->%d\n", | 83 | "Firmware bus number: %d->%d\n", |
84 | rsrc.start, hose->first_busno, hose->last_busno); | 84 | (unsigned long long)rsrc.start, hose->first_busno, |
85 | hose->last_busno); | ||
85 | 86 | ||
86 | DBG(" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p\n", | 87 | DBG(" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p\n", |
87 | hose, hose->cfg_addr, hose->cfg_data); | 88 | hose, hose->cfg_addr, hose->cfg_data); |
diff --git a/arch/powerpc/platforms/86xx/Kconfig b/arch/powerpc/platforms/86xx/Kconfig index 3a87863d2876..d1ecc0f9ab58 100644 --- a/arch/powerpc/platforms/86xx/Kconfig +++ b/arch/powerpc/platforms/86xx/Kconfig | |||
@@ -7,6 +7,7 @@ choice | |||
7 | 7 | ||
8 | config MPC8641_HPCN | 8 | config MPC8641_HPCN |
9 | bool "Freescale MPC8641 HPCN" | 9 | bool "Freescale MPC8641 HPCN" |
10 | select PPC_I8259 | ||
10 | help | 11 | help |
11 | This option enables support for the MPC8641 HPCN board. | 12 | This option enables support for the MPC8641 HPCN board. |
12 | 13 | ||
@@ -28,9 +29,4 @@ config PPC_INDIRECT_PCI_BE | |||
28 | depends on PPC_86xx | 29 | depends on PPC_86xx |
29 | default y | 30 | default y |
30 | 31 | ||
31 | config PPC_STD_MMU | ||
32 | bool | ||
33 | depends on PPC_86xx | ||
34 | default y | ||
35 | |||
36 | endmenu | 32 | endmenu |
diff --git a/arch/powerpc/platforms/86xx/Makefile b/arch/powerpc/platforms/86xx/Makefile index 7be796c5d5c9..476a6eeee710 100644 --- a/arch/powerpc/platforms/86xx/Makefile +++ b/arch/powerpc/platforms/86xx/Makefile | |||
@@ -2,9 +2,6 @@ | |||
2 | # Makefile for the PowerPC 86xx linux kernel. | 2 | # Makefile for the PowerPC 86xx linux kernel. |
3 | # | 3 | # |
4 | 4 | ||
5 | |||
6 | ifeq ($(CONFIG_PPC_86xx),y) | ||
7 | obj-$(CONFIG_SMP) += mpc86xx_smp.o | 5 | obj-$(CONFIG_SMP) += mpc86xx_smp.o |
8 | endif | ||
9 | obj-$(CONFIG_MPC8641_HPCN) += mpc86xx_hpcn.o | 6 | obj-$(CONFIG_MPC8641_HPCN) += mpc86xx_hpcn.o |
10 | obj-$(CONFIG_PCI) += pci.o mpc86xx_pcie.o | 7 | obj-$(CONFIG_PCI) += pci.o mpc86xx_pcie.o |
diff --git a/arch/powerpc/platforms/86xx/mpc8641_hpcn.h b/arch/powerpc/platforms/86xx/mpc8641_hpcn.h index 5042253758b7..5d2bcf78cef7 100644 --- a/arch/powerpc/platforms/86xx/mpc8641_hpcn.h +++ b/arch/powerpc/platforms/86xx/mpc8641_hpcn.h | |||
@@ -14,7 +14,6 @@ | |||
14 | #ifndef __MPC8641_HPCN_H__ | 14 | #ifndef __MPC8641_HPCN_H__ |
15 | #define __MPC8641_HPCN_H__ | 15 | #define __MPC8641_HPCN_H__ |
16 | 16 | ||
17 | #include <linux/config.h> | ||
18 | #include <linux/init.h> | 17 | #include <linux/init.h> |
19 | 18 | ||
20 | /* PCI interrupt controller */ | 19 | /* PCI interrupt controller */ |
diff --git a/arch/powerpc/platforms/86xx/mpc86xx.h b/arch/powerpc/platforms/86xx/mpc86xx.h index e3c9e4f417d3..2834462590b8 100644 --- a/arch/powerpc/platforms/86xx/mpc86xx.h +++ b/arch/powerpc/platforms/86xx/mpc86xx.h | |||
@@ -15,11 +15,13 @@ | |||
15 | * mpc86xx_* files. Mostly for use by mpc86xx_setup(). | 15 | * mpc86xx_* files. Mostly for use by mpc86xx_setup(). |
16 | */ | 16 | */ |
17 | 17 | ||
18 | extern int __init add_bridge(struct device_node *dev); | 18 | extern int add_bridge(struct device_node *dev); |
19 | 19 | ||
20 | extern void __init setup_indirect_pcie(struct pci_controller *hose, | 20 | extern int mpc86xx_exclude_device(u_char bus, u_char devfn); |
21 | |||
22 | extern void setup_indirect_pcie(struct pci_controller *hose, | ||
21 | u32 cfg_addr, u32 cfg_data); | 23 | u32 cfg_addr, u32 cfg_data); |
22 | extern void __init setup_indirect_pcie_nomap(struct pci_controller *hose, | 24 | extern void setup_indirect_pcie_nomap(struct pci_controller *hose, |
23 | void __iomem *cfg_addr, | 25 | void __iomem *cfg_addr, |
24 | void __iomem *cfg_data); | 26 | void __iomem *cfg_data); |
25 | 27 | ||
diff --git a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c index 483c21df181e..ebae73eb0063 100644 --- a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c +++ b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c | |||
@@ -12,7 +12,6 @@ | |||
12 | * option) any later version. | 12 | * option) any later version. |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/config.h> | ||
16 | #include <linux/stddef.h> | 15 | #include <linux/stddef.h> |
17 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
18 | #include <linux/pci.h> | 17 | #include <linux/pci.h> |
@@ -36,6 +35,7 @@ | |||
36 | #include <sysdev/fsl_soc.h> | 35 | #include <sysdev/fsl_soc.h> |
37 | 36 | ||
38 | #include "mpc86xx.h" | 37 | #include "mpc86xx.h" |
38 | #include "mpc8641_hpcn.h" | ||
39 | 39 | ||
40 | #ifndef CONFIG_PCI | 40 | #ifndef CONFIG_PCI |
41 | unsigned long isa_io_base = 0; | 41 | unsigned long isa_io_base = 0; |
@@ -186,17 +186,130 @@ mpc86xx_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin) | |||
186 | return PCI_IRQ_TABLE_LOOKUP + I8259_OFFSET; | 186 | return PCI_IRQ_TABLE_LOOKUP + I8259_OFFSET; |
187 | } | 187 | } |
188 | 188 | ||
189 | static void __devinit quirk_ali1575(struct pci_dev *dev) | ||
190 | { | ||
191 | unsigned short temp; | ||
192 | |||
193 | /* | ||
194 | * ALI1575 interrupts route table setup: | ||
195 | * | ||
196 | * IRQ pin IRQ# | ||
197 | * PIRQA ---- 3 | ||
198 | * PIRQB ---- 4 | ||
199 | * PIRQC ---- 5 | ||
200 | * PIRQD ---- 6 | ||
201 | * PIRQE ---- 9 | ||
202 | * PIRQF ---- 10 | ||
203 | * PIRQG ---- 11 | ||
204 | * PIRQH ---- 12 | ||
205 | * | ||
206 | * interrupts for PCI slot0 -- PIRQA / PIRQB / PIRQC / PIRQD | ||
207 | * PCI slot1 -- PIRQB / PIRQC / PIRQD / PIRQA | ||
208 | */ | ||
209 | pci_write_config_dword(dev, 0x48, 0xb9317542); | ||
210 | |||
211 | /* USB 1.1 OHCI controller 1, interrupt: PIRQE */ | ||
212 | pci_write_config_byte(dev, 0x86, 0x0c); | ||
213 | |||
214 | /* USB 1.1 OHCI controller 2, interrupt: PIRQF */ | ||
215 | pci_write_config_byte(dev, 0x87, 0x0d); | ||
216 | |||
217 | /* USB 1.1 OHCI controller 3, interrupt: PIRQH */ | ||
218 | pci_write_config_byte(dev, 0x88, 0x0f); | ||
219 | |||
220 | /* USB 2.0 controller, interrupt: PIRQ7 */ | ||
221 | pci_write_config_byte(dev, 0x74, 0x06); | ||
222 | |||
223 | /* Audio controller, interrupt: PIRQE */ | ||
224 | pci_write_config_byte(dev, 0x8a, 0x0c); | ||
225 | |||
226 | /* Modem controller, interrupt: PIRQF */ | ||
227 | pci_write_config_byte(dev, 0x8b, 0x0d); | ||
228 | |||
229 | /* HD audio controller, interrupt: PIRQG */ | ||
230 | pci_write_config_byte(dev, 0x8c, 0x0e); | ||
231 | |||
232 | /* Serial ATA interrupt: PIRQD */ | ||
233 | pci_write_config_byte(dev, 0x8d, 0x0b); | ||
234 | |||
235 | /* SMB interrupt: PIRQH */ | ||
236 | pci_write_config_byte(dev, 0x8e, 0x0f); | ||
237 | |||
238 | /* PMU ACPI SCI interrupt: PIRQH */ | ||
239 | pci_write_config_byte(dev, 0x8f, 0x0f); | ||
240 | |||
241 | /* Primary PATA IDE IRQ: 14 | ||
242 | * Secondary PATA IDE IRQ: 15 | ||
243 | */ | ||
244 | pci_write_config_byte(dev, 0x44, 0x3d); | ||
245 | pci_write_config_byte(dev, 0x75, 0x0f); | ||
246 | |||
247 | /* Set IRQ14 and IRQ15 to legacy IRQs */ | ||
248 | pci_read_config_word(dev, 0x46, &temp); | ||
249 | temp |= 0xc000; | ||
250 | pci_write_config_word(dev, 0x46, temp); | ||
251 | |||
252 | /* Set i8259 interrupt trigger | ||
253 | * IRQ 3: Level | ||
254 | * IRQ 4: Level | ||
255 | * IRQ 5: Level | ||
256 | * IRQ 6: Level | ||
257 | * IRQ 7: Level | ||
258 | * IRQ 9: Level | ||
259 | * IRQ 10: Level | ||
260 | * IRQ 11: Level | ||
261 | * IRQ 12: Level | ||
262 | * IRQ 14: Edge | ||
263 | * IRQ 15: Edge | ||
264 | */ | ||
265 | outb(0xfa, 0x4d0); | ||
266 | outb(0x1e, 0x4d1); | ||
267 | } | ||
189 | 268 | ||
190 | int | 269 | static void __devinit quirk_uli5288(struct pci_dev *dev) |
191 | mpc86xx_exclude_device(u_char bus, u_char devfn) | ||
192 | { | 270 | { |
193 | #if !defined(CONFIG_PCI) | 271 | unsigned char c; |
194 | if (bus == 0 && PCI_SLOT(devfn) == 0) | 272 | |
195 | return PCIBIOS_DEVICE_NOT_FOUND; | 273 | pci_read_config_byte(dev,0x83,&c); |
196 | #endif | 274 | c |= 0x80; |
275 | pci_write_config_byte(dev, 0x83, c); | ||
276 | |||
277 | pci_write_config_byte(dev, 0x09, 0x01); | ||
278 | pci_write_config_byte(dev, 0x0a, 0x06); | ||
279 | |||
280 | pci_read_config_byte(dev,0x83,&c); | ||
281 | c &= 0x7f; | ||
282 | pci_write_config_byte(dev, 0x83, c); | ||
197 | 283 | ||
198 | return PCIBIOS_SUCCESSFUL; | 284 | pci_read_config_byte(dev,0x84,&c); |
285 | c |= 0x01; | ||
286 | pci_write_config_byte(dev, 0x84, c); | ||
199 | } | 287 | } |
288 | |||
289 | static void __devinit quirk_uli5229(struct pci_dev *dev) | ||
290 | { | ||
291 | unsigned short temp; | ||
292 | pci_write_config_word(dev, 0x04, 0x0405); | ||
293 | pci_read_config_word(dev, 0x4a, &temp); | ||
294 | temp |= 0x1000; | ||
295 | pci_write_config_word(dev, 0x4a, temp); | ||
296 | } | ||
297 | |||
298 | static void __devinit early_uli5249(struct pci_dev *dev) | ||
299 | { | ||
300 | unsigned char temp; | ||
301 | pci_write_config_word(dev, 0x04, 0x0007); | ||
302 | pci_read_config_byte(dev, 0x7c, &temp); | ||
303 | pci_write_config_byte(dev, 0x7c, 0x80); | ||
304 | pci_write_config_byte(dev, 0x09, 0x01); | ||
305 | pci_write_config_byte(dev, 0x7c, temp); | ||
306 | dev->class |= 0x1; | ||
307 | } | ||
308 | |||
309 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x1575, quirk_ali1575); | ||
310 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5288, quirk_uli5288); | ||
311 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5229, quirk_uli5229); | ||
312 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_AL, 0x5249, early_uli5249); | ||
200 | #endif /* CONFIG_PCI */ | 313 | #endif /* CONFIG_PCI */ |
201 | 314 | ||
202 | 315 | ||
diff --git a/arch/powerpc/platforms/86xx/mpc86xx_smp.c b/arch/powerpc/platforms/86xx/mpc86xx_smp.c index 944ec4b71416..bb7fb41933ad 100644 --- a/arch/powerpc/platforms/86xx/mpc86xx_smp.c +++ b/arch/powerpc/platforms/86xx/mpc86xx_smp.c | |||
@@ -10,7 +10,6 @@ | |||
10 | * option) any later version. | 10 | * option) any later version. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/config.h> | ||
14 | #include <linux/stddef.h> | 13 | #include <linux/stddef.h> |
15 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
16 | #include <linux/init.h> | 15 | #include <linux/init.h> |
@@ -34,8 +33,8 @@ extern unsigned long __secondary_hold_acknowledge; | |||
34 | static void __init | 33 | static void __init |
35 | smp_86xx_release_core(int nr) | 34 | smp_86xx_release_core(int nr) |
36 | { | 35 | { |
37 | void *mcm_vaddr; | 36 | __be32 __iomem *mcm_vaddr; |
38 | unsigned long vaddr, pcr; | 37 | unsigned long pcr; |
39 | 38 | ||
40 | if (nr < 0 || nr >= NR_CPUS) | 39 | if (nr < 0 || nr >= NR_CPUS) |
41 | return; | 40 | return; |
@@ -45,10 +44,9 @@ smp_86xx_release_core(int nr) | |||
45 | */ | 44 | */ |
46 | mcm_vaddr = ioremap(get_immrbase() + MPC86xx_MCM_OFFSET, | 45 | mcm_vaddr = ioremap(get_immrbase() + MPC86xx_MCM_OFFSET, |
47 | MPC86xx_MCM_SIZE); | 46 | MPC86xx_MCM_SIZE); |
48 | vaddr = (unsigned long)mcm_vaddr + MCM_PORT_CONFIG_OFFSET; | 47 | pcr = in_be32(mcm_vaddr + (MCM_PORT_CONFIG_OFFSET >> 2)); |
49 | pcr = in_be32((volatile unsigned *)vaddr); | ||
50 | pcr |= 1 << (nr + 24); | 48 | pcr |= 1 << (nr + 24); |
51 | out_be32((volatile unsigned *)vaddr, pcr); | 49 | out_be32(mcm_vaddr + (MCM_PORT_CONFIG_OFFSET >> 2), pcr); |
52 | } | 50 | } |
53 | 51 | ||
54 | 52 | ||
diff --git a/arch/powerpc/platforms/86xx/pci.c b/arch/powerpc/platforms/86xx/pci.c index 5180df7c75bc..bc5139043112 100644 --- a/arch/powerpc/platforms/86xx/pci.c +++ b/arch/powerpc/platforms/86xx/pci.c | |||
@@ -12,7 +12,6 @@ | |||
12 | * option) any later version. | 12 | * option) any later version. |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/config.h> | ||
16 | #include <linux/types.h> | 15 | #include <linux/types.h> |
17 | #include <linux/module.h> | 16 | #include <linux/module.h> |
18 | #include <linux/init.h> | 17 | #include <linux/init.h> |
@@ -122,15 +121,12 @@ static void __init setup_pcie_atmu(struct pci_controller *hose, struct resource | |||
122 | static void __init | 121 | static void __init |
123 | mpc86xx_setup_pcie(struct pci_controller *hose, u32 pcie_offset, u32 pcie_size) | 122 | mpc86xx_setup_pcie(struct pci_controller *hose, u32 pcie_offset, u32 pcie_size) |
124 | { | 123 | { |
125 | volatile struct ccsr_pex *pcie; | ||
126 | u16 cmd; | 124 | u16 cmd; |
127 | unsigned int temps; | 125 | unsigned int temps; |
128 | 126 | ||
129 | DBG("PCIE host controller register offset 0x%08x, size 0x%08x.\n", | 127 | DBG("PCIE host controller register offset 0x%08x, size 0x%08x.\n", |
130 | pcie_offset, pcie_size); | 128 | pcie_offset, pcie_size); |
131 | 129 | ||
132 | pcie = ioremap(pcie_offset, pcie_size); | ||
133 | |||
134 | early_read_config_word(hose, 0, 0, PCI_COMMAND, &cmd); | 130 | early_read_config_word(hose, 0, 0, PCI_COMMAND, &cmd); |
135 | cmd |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY | 131 | cmd |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY |
136 | | PCI_COMMAND_IO; | 132 | | PCI_COMMAND_IO; |
@@ -144,6 +140,14 @@ mpc86xx_setup_pcie(struct pci_controller *hose, u32 pcie_offset, u32 pcie_size) | |||
144 | early_write_config_dword(hose, 0, 0, PCI_PRIMARY_BUS, temps); | 140 | early_write_config_dword(hose, 0, 0, PCI_PRIMARY_BUS, temps); |
145 | } | 141 | } |
146 | 142 | ||
143 | int mpc86xx_exclude_device(u_char bus, u_char devfn) | ||
144 | { | ||
145 | if (bus == 0 && PCI_SLOT(devfn) == 0) | ||
146 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
147 | |||
148 | return PCIBIOS_SUCCESSFUL; | ||
149 | } | ||
150 | |||
147 | int __init add_bridge(struct device_node *dev) | 151 | int __init add_bridge(struct device_node *dev) |
148 | { | 152 | { |
149 | int len; | 153 | int len; |
@@ -198,128 +202,3 @@ int __init add_bridge(struct device_node *dev) | |||
198 | 202 | ||
199 | return 0; | 203 | return 0; |
200 | } | 204 | } |
201 | |||
202 | static void __devinit quirk_ali1575(struct pci_dev *dev) | ||
203 | { | ||
204 | unsigned short temp; | ||
205 | |||
206 | /* | ||
207 | * ALI1575 interrupts route table setup: | ||
208 | * | ||
209 | * IRQ pin IRQ# | ||
210 | * PIRQA ---- 3 | ||
211 | * PIRQB ---- 4 | ||
212 | * PIRQC ---- 5 | ||
213 | * PIRQD ---- 6 | ||
214 | * PIRQE ---- 9 | ||
215 | * PIRQF ---- 10 | ||
216 | * PIRQG ---- 11 | ||
217 | * PIRQH ---- 12 | ||
218 | * | ||
219 | * interrupts for PCI slot0 -- PIRQA / PIRQB / PIRQC / PIRQD | ||
220 | * PCI slot1 -- PIRQB / PIRQC / PIRQD / PIRQA | ||
221 | */ | ||
222 | pci_write_config_dword(dev, 0x48, 0xb9317542); | ||
223 | |||
224 | /* USB 1.1 OHCI controller 1, interrupt: PIRQE */ | ||
225 | pci_write_config_byte(dev, 0x86, 0x0c); | ||
226 | |||
227 | /* USB 1.1 OHCI controller 2, interrupt: PIRQF */ | ||
228 | pci_write_config_byte(dev, 0x87, 0x0d); | ||
229 | |||
230 | /* USB 1.1 OHCI controller 3, interrupt: PIRQH */ | ||
231 | pci_write_config_byte(dev, 0x88, 0x0f); | ||
232 | |||
233 | /* USB 2.0 controller, interrupt: PIRQ7 */ | ||
234 | pci_write_config_byte(dev, 0x74, 0x06); | ||
235 | |||
236 | /* Audio controller, interrupt: PIRQE */ | ||
237 | pci_write_config_byte(dev, 0x8a, 0x0c); | ||
238 | |||
239 | /* Modem controller, interrupt: PIRQF */ | ||
240 | pci_write_config_byte(dev, 0x8b, 0x0d); | ||
241 | |||
242 | /* HD audio controller, interrupt: PIRQG */ | ||
243 | pci_write_config_byte(dev, 0x8c, 0x0e); | ||
244 | |||
245 | /* Serial ATA interrupt: PIRQD */ | ||
246 | pci_write_config_byte(dev, 0x8d, 0x0b); | ||
247 | |||
248 | /* SMB interrupt: PIRQH */ | ||
249 | pci_write_config_byte(dev, 0x8e, 0x0f); | ||
250 | |||
251 | /* PMU ACPI SCI interrupt: PIRQH */ | ||
252 | pci_write_config_byte(dev, 0x8f, 0x0f); | ||
253 | |||
254 | /* Primary PATA IDE IRQ: 14 | ||
255 | * Secondary PATA IDE IRQ: 15 | ||
256 | */ | ||
257 | pci_write_config_byte(dev, 0x44, 0x3d); | ||
258 | pci_write_config_byte(dev, 0x75, 0x0f); | ||
259 | |||
260 | /* Set IRQ14 and IRQ15 to legacy IRQs */ | ||
261 | pci_read_config_word(dev, 0x46, &temp); | ||
262 | temp |= 0xc000; | ||
263 | pci_write_config_word(dev, 0x46, temp); | ||
264 | |||
265 | /* Set i8259 interrupt trigger | ||
266 | * IRQ 3: Level | ||
267 | * IRQ 4: Level | ||
268 | * IRQ 5: Level | ||
269 | * IRQ 6: Level | ||
270 | * IRQ 7: Level | ||
271 | * IRQ 9: Level | ||
272 | * IRQ 10: Level | ||
273 | * IRQ 11: Level | ||
274 | * IRQ 12: Level | ||
275 | * IRQ 14: Edge | ||
276 | * IRQ 15: Edge | ||
277 | */ | ||
278 | outb(0xfa, 0x4d0); | ||
279 | outb(0x1e, 0x4d1); | ||
280 | } | ||
281 | |||
282 | static void __devinit quirk_uli5288(struct pci_dev *dev) | ||
283 | { | ||
284 | unsigned char c; | ||
285 | |||
286 | pci_read_config_byte(dev,0x83,&c); | ||
287 | c |= 0x80; | ||
288 | pci_write_config_byte(dev, 0x83, c); | ||
289 | |||
290 | pci_write_config_byte(dev, 0x09, 0x01); | ||
291 | pci_write_config_byte(dev, 0x0a, 0x06); | ||
292 | |||
293 | pci_read_config_byte(dev,0x83,&c); | ||
294 | c &= 0x7f; | ||
295 | pci_write_config_byte(dev, 0x83, c); | ||
296 | |||
297 | pci_read_config_byte(dev,0x84,&c); | ||
298 | c |= 0x01; | ||
299 | pci_write_config_byte(dev, 0x84, c); | ||
300 | } | ||
301 | |||
302 | static void __devinit quirk_uli5229(struct pci_dev *dev) | ||
303 | { | ||
304 | unsigned short temp; | ||
305 | pci_write_config_word(dev, 0x04, 0x0405); | ||
306 | pci_read_config_word(dev, 0x4a, &temp); | ||
307 | temp |= 0x1000; | ||
308 | pci_write_config_word(dev, 0x4a, temp); | ||
309 | } | ||
310 | |||
311 | static void __devinit early_uli5249(struct pci_dev *dev) | ||
312 | { | ||
313 | unsigned char temp; | ||
314 | pci_write_config_word(dev, 0x04, 0x0007); | ||
315 | pci_read_config_byte(dev, 0x7c, &temp); | ||
316 | pci_write_config_byte(dev, 0x7c, 0x80); | ||
317 | pci_write_config_byte(dev, 0x09, 0x01); | ||
318 | pci_write_config_byte(dev, 0x7c, temp); | ||
319 | dev->class |= 0x1; | ||
320 | } | ||
321 | |||
322 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x1575, quirk_ali1575); | ||
323 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5288, quirk_uli5288); | ||
324 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5229, quirk_uli5229); | ||
325 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_AL, 0x5249, early_uli5249); | ||
diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile index 292863694562..5cf46dc57895 100644 --- a/arch/powerpc/platforms/Makefile +++ b/arch/powerpc/platforms/Makefile | |||
@@ -14,3 +14,4 @@ obj-$(CONFIG_PPC_PSERIES) += pseries/ | |||
14 | obj-$(CONFIG_PPC_ISERIES) += iseries/ | 14 | obj-$(CONFIG_PPC_ISERIES) += iseries/ |
15 | obj-$(CONFIG_PPC_MAPLE) += maple/ | 15 | obj-$(CONFIG_PPC_MAPLE) += maple/ |
16 | obj-$(CONFIG_PPC_CELL) += cell/ | 16 | obj-$(CONFIG_PPC_CELL) += cell/ |
17 | obj-$(CONFIG_EMBEDDED6xx) += embedded6xx/ | ||
diff --git a/arch/powerpc/platforms/cell/Kconfig b/arch/powerpc/platforms/cell/Kconfig index 352bbbacde9a..0c8c7b6ab897 100644 --- a/arch/powerpc/platforms/cell/Kconfig +++ b/arch/powerpc/platforms/cell/Kconfig | |||
@@ -6,6 +6,7 @@ config SPU_FS | |||
6 | default m | 6 | default m |
7 | depends on PPC_CELL | 7 | depends on PPC_CELL |
8 | select SPU_BASE | 8 | select SPU_BASE |
9 | select MEMORY_HOTPLUG | ||
9 | help | 10 | help |
10 | The SPU file system is used to access Synergistic Processing | 11 | The SPU file system is used to access Synergistic Processing |
11 | Units on machines implementing the Broadband Processor | 12 | Units on machines implementing the Broadband Processor |
@@ -18,7 +19,6 @@ config SPU_BASE | |||
18 | config SPUFS_MMAP | 19 | config SPUFS_MMAP |
19 | bool | 20 | bool |
20 | depends on SPU_FS && SPARSEMEM | 21 | depends on SPU_FS && SPARSEMEM |
21 | select MEMORY_HOTPLUG | ||
22 | default y | 22 | default y |
23 | 23 | ||
24 | config CBE_RAS | 24 | config CBE_RAS |
diff --git a/arch/powerpc/platforms/cell/interrupt.c b/arch/powerpc/platforms/cell/interrupt.c index 1bbf822b4efc..7bff3cbc5723 100644 --- a/arch/powerpc/platforms/cell/interrupt.c +++ b/arch/powerpc/platforms/cell/interrupt.c | |||
@@ -307,7 +307,7 @@ static void iic_request_ipi(int ipi, const char *name) | |||
307 | irq = iic_ipi_to_irq(ipi); | 307 | irq = iic_ipi_to_irq(ipi); |
308 | /* IPIs are marked SA_INTERRUPT as they must run with irqs | 308 | /* IPIs are marked SA_INTERRUPT as they must run with irqs |
309 | * disabled */ | 309 | * disabled */ |
310 | get_irq_desc(irq)->handler = &iic_pic; | 310 | get_irq_desc(irq)->chip = &iic_pic; |
311 | get_irq_desc(irq)->status |= IRQ_PER_CPU; | 311 | get_irq_desc(irq)->status |= IRQ_PER_CPU; |
312 | request_irq(irq, iic_ipi_action, SA_INTERRUPT, name, NULL); | 312 | request_irq(irq, iic_ipi_action, SA_INTERRUPT, name, NULL); |
313 | } | 313 | } |
@@ -330,7 +330,7 @@ static void iic_setup_spe_handlers(void) | |||
330 | for (be=0; be < num_present_cpus() / 2; be++) { | 330 | for (be=0; be < num_present_cpus() / 2; be++) { |
331 | for (isrc = 0; isrc < IIC_CLASS_STRIDE * 3; isrc++) { | 331 | for (isrc = 0; isrc < IIC_CLASS_STRIDE * 3; isrc++) { |
332 | int irq = IIC_NODE_STRIDE * be + IIC_SPE_OFFSET + isrc; | 332 | int irq = IIC_NODE_STRIDE * be + IIC_SPE_OFFSET + isrc; |
333 | get_irq_desc(irq)->handler = &iic_pic; | 333 | get_irq_desc(irq)->chip = &iic_pic; |
334 | } | 334 | } |
335 | } | 335 | } |
336 | } | 336 | } |
diff --git a/arch/powerpc/platforms/cell/setup.c b/arch/powerpc/platforms/cell/setup.c index 3d1831d331e5..00d112f92272 100644 --- a/arch/powerpc/platforms/cell/setup.c +++ b/arch/powerpc/platforms/cell/setup.c | |||
@@ -125,8 +125,6 @@ static void __init cell_init_early(void) | |||
125 | { | 125 | { |
126 | DBG(" -> cell_init_early()\n"); | 126 | DBG(" -> cell_init_early()\n"); |
127 | 127 | ||
128 | hpte_init_native(); | ||
129 | |||
130 | cell_init_iommu(); | 128 | cell_init_iommu(); |
131 | 129 | ||
132 | ppc64_interrupt_controller = IC_CELL_PIC; | 130 | ppc64_interrupt_controller = IC_CELL_PIC; |
@@ -139,11 +137,17 @@ static int __init cell_probe(void) | |||
139 | { | 137 | { |
140 | unsigned long root = of_get_flat_dt_root(); | 138 | unsigned long root = of_get_flat_dt_root(); |
141 | 139 | ||
142 | if (of_flat_dt_is_compatible(root, "IBM,CBEA") || | 140 | if (!of_flat_dt_is_compatible(root, "IBM,CBEA") && |
143 | of_flat_dt_is_compatible(root, "IBM,CPBW-1.0")) | 141 | !of_flat_dt_is_compatible(root, "IBM,CPBW-1.0")) |
144 | return 1; | 142 | return 0; |
143 | |||
144 | #ifdef CONFIG_UDBG_RTAS_CONSOLE | ||
145 | udbg_init_rtas_console(); | ||
146 | #endif | ||
147 | |||
148 | hpte_init_native(); | ||
145 | 149 | ||
146 | return 0; | 150 | return 1; |
147 | } | 151 | } |
148 | 152 | ||
149 | /* | 153 | /* |
diff --git a/arch/powerpc/platforms/cell/spider-pic.c b/arch/powerpc/platforms/cell/spider-pic.c index 55cbdd77a62d..7c3a0b6d34fd 100644 --- a/arch/powerpc/platforms/cell/spider-pic.c +++ b/arch/powerpc/platforms/cell/spider-pic.c | |||
@@ -162,7 +162,7 @@ void spider_init_IRQ_hardcoded(void) | |||
162 | spider_pics[node] = ioremap(spiderpic, 0x800); | 162 | spider_pics[node] = ioremap(spiderpic, 0x800); |
163 | for (n = 0; n < IIC_NUM_EXT; n++) { | 163 | for (n = 0; n < IIC_NUM_EXT; n++) { |
164 | int irq = n + IIC_EXT_OFFSET + node * IIC_NODE_STRIDE; | 164 | int irq = n + IIC_EXT_OFFSET + node * IIC_NODE_STRIDE; |
165 | get_irq_desc(irq)->handler = &spider_pic; | 165 | get_irq_desc(irq)->chip = &spider_pic; |
166 | } | 166 | } |
167 | 167 | ||
168 | /* do not mask any interrupts because of level */ | 168 | /* do not mask any interrupts because of level */ |
@@ -217,7 +217,7 @@ void spider_init_IRQ(void) | |||
217 | 217 | ||
218 | for (n = 0; n < IIC_NUM_EXT; n++) { | 218 | for (n = 0; n < IIC_NUM_EXT; n++) { |
219 | int irq = n + IIC_EXT_OFFSET + node * IIC_NODE_STRIDE; | 219 | int irq = n + IIC_EXT_OFFSET + node * IIC_NODE_STRIDE; |
220 | get_irq_desc(irq)->handler = &spider_pic; | 220 | get_irq_desc(irq)->chip = &spider_pic; |
221 | } | 221 | } |
222 | 222 | ||
223 | /* do not mask any interrupts because of level */ | 223 | /* do not mask any interrupts because of level */ |
diff --git a/arch/powerpc/platforms/cell/spu_base.c b/arch/powerpc/platforms/cell/spu_base.c index db82f503ba2c..b306723abb87 100644 --- a/arch/powerpc/platforms/cell/spu_base.c +++ b/arch/powerpc/platforms/cell/spu_base.c | |||
@@ -168,12 +168,12 @@ spu_irq_class_0_bottom(struct spu *spu) | |||
168 | 168 | ||
169 | stat &= mask; | 169 | stat &= mask; |
170 | 170 | ||
171 | if (stat & 1) /* invalid MFC DMA */ | 171 | if (stat & 1) /* invalid DMA alignment */ |
172 | __spu_trap_invalid_dma(spu); | ||
173 | |||
174 | if (stat & 2) /* invalid DMA alignment */ | ||
175 | __spu_trap_dma_align(spu); | 172 | __spu_trap_dma_align(spu); |
176 | 173 | ||
174 | if (stat & 2) /* invalid MFC DMA */ | ||
175 | __spu_trap_invalid_dma(spu); | ||
176 | |||
177 | if (stat & 4) /* error on SPU */ | 177 | if (stat & 4) /* error on SPU */ |
178 | __spu_trap_error(spu); | 178 | __spu_trap_error(spu); |
179 | 179 | ||
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c index 7854a380dce2..58e794f9da1b 100644 --- a/arch/powerpc/platforms/cell/spufs/file.c +++ b/arch/powerpc/platforms/cell/spufs/file.c | |||
@@ -204,7 +204,7 @@ static int spufs_cntl_mmap(struct file *file, struct vm_area_struct *vma) | |||
204 | 204 | ||
205 | vma->vm_flags |= VM_RESERVED; | 205 | vma->vm_flags |= VM_RESERVED; |
206 | vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot) | 206 | vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot) |
207 | | _PAGE_NO_CACHE); | 207 | | _PAGE_NO_CACHE | _PAGE_GUARDED); |
208 | 208 | ||
209 | vma->vm_ops = &spufs_cntl_mmap_vmops; | 209 | vma->vm_ops = &spufs_cntl_mmap_vmops; |
210 | return 0; | 210 | return 0; |
@@ -675,7 +675,7 @@ static int spufs_signal1_mmap(struct file *file, struct vm_area_struct *vma) | |||
675 | 675 | ||
676 | vma->vm_flags |= VM_RESERVED; | 676 | vma->vm_flags |= VM_RESERVED; |
677 | vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot) | 677 | vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot) |
678 | | _PAGE_NO_CACHE); | 678 | | _PAGE_NO_CACHE | _PAGE_GUARDED); |
679 | 679 | ||
680 | vma->vm_ops = &spufs_signal1_mmap_vmops; | 680 | vma->vm_ops = &spufs_signal1_mmap_vmops; |
681 | return 0; | 681 | return 0; |
@@ -762,7 +762,7 @@ static int spufs_signal2_mmap(struct file *file, struct vm_area_struct *vma) | |||
762 | /* FIXME: */ | 762 | /* FIXME: */ |
763 | vma->vm_flags |= VM_RESERVED; | 763 | vma->vm_flags |= VM_RESERVED; |
764 | vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot) | 764 | vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot) |
765 | | _PAGE_NO_CACHE); | 765 | | _PAGE_NO_CACHE | _PAGE_GUARDED); |
766 | 766 | ||
767 | vma->vm_ops = &spufs_signal2_mmap_vmops; | 767 | vma->vm_ops = &spufs_signal2_mmap_vmops; |
768 | return 0; | 768 | return 0; |
@@ -850,7 +850,7 @@ static int spufs_mss_mmap(struct file *file, struct vm_area_struct *vma) | |||
850 | 850 | ||
851 | vma->vm_flags |= VM_RESERVED; | 851 | vma->vm_flags |= VM_RESERVED; |
852 | vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot) | 852 | vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot) |
853 | | _PAGE_NO_CACHE); | 853 | | _PAGE_NO_CACHE | _PAGE_GUARDED); |
854 | 854 | ||
855 | vma->vm_ops = &spufs_mss_mmap_vmops; | 855 | vma->vm_ops = &spufs_mss_mmap_vmops; |
856 | return 0; | 856 | return 0; |
@@ -899,7 +899,7 @@ static int spufs_mfc_mmap(struct file *file, struct vm_area_struct *vma) | |||
899 | 899 | ||
900 | vma->vm_flags |= VM_RESERVED; | 900 | vma->vm_flags |= VM_RESERVED; |
901 | vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot) | 901 | vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot) |
902 | | _PAGE_NO_CACHE); | 902 | | _PAGE_NO_CACHE | _PAGE_GUARDED); |
903 | 903 | ||
904 | vma->vm_ops = &spufs_mfc_mmap_vmops; | 904 | vma->vm_ops = &spufs_mfc_mmap_vmops; |
905 | return 0; | 905 | return 0; |
diff --git a/arch/powerpc/platforms/cell/spufs/switch.c b/arch/powerpc/platforms/cell/spufs/switch.c index a656d810a44a..c7fea2cca534 100644 --- a/arch/powerpc/platforms/cell/spufs/switch.c +++ b/arch/powerpc/platforms/cell/spufs/switch.c | |||
@@ -464,7 +464,8 @@ static inline void wait_purge_complete(struct spu_state *csa, struct spu *spu) | |||
464 | * Poll MFC_CNTL[Ps] until value '11' is read | 464 | * Poll MFC_CNTL[Ps] until value '11' is read |
465 | * (purge complete). | 465 | * (purge complete). |
466 | */ | 466 | */ |
467 | POLL_WHILE_FALSE(in_be64(&priv2->mfc_control_RW) & | 467 | POLL_WHILE_FALSE((in_be64(&priv2->mfc_control_RW) & |
468 | MFC_CNTL_PURGE_DMA_STATUS_MASK) == | ||
468 | MFC_CNTL_PURGE_DMA_COMPLETE); | 469 | MFC_CNTL_PURGE_DMA_COMPLETE); |
469 | } | 470 | } |
470 | 471 | ||
@@ -1028,7 +1029,8 @@ static inline void wait_suspend_mfc_complete(struct spu_state *csa, | |||
1028 | * Restore, Step 47. | 1029 | * Restore, Step 47. |
1029 | * Poll MFC_CNTL[Ss] until 11 is returned. | 1030 | * Poll MFC_CNTL[Ss] until 11 is returned. |
1030 | */ | 1031 | */ |
1031 | POLL_WHILE_FALSE(in_be64(&priv2->mfc_control_RW) & | 1032 | POLL_WHILE_FALSE((in_be64(&priv2->mfc_control_RW) & |
1033 | MFC_CNTL_SUSPEND_DMA_STATUS_MASK) == | ||
1032 | MFC_CNTL_SUSPEND_COMPLETE); | 1034 | MFC_CNTL_SUSPEND_COMPLETE); |
1033 | } | 1035 | } |
1034 | 1036 | ||
diff --git a/arch/powerpc/platforms/chrp/pci.c b/arch/powerpc/platforms/chrp/pci.c index ac224876ce59..53515daf01b1 100644 --- a/arch/powerpc/platforms/chrp/pci.c +++ b/arch/powerpc/platforms/chrp/pci.c | |||
@@ -143,7 +143,7 @@ hydra_init(void) | |||
143 | if (np == NULL || of_address_to_resource(np, 0, &r)) | 143 | if (np == NULL || of_address_to_resource(np, 0, &r)) |
144 | return 0; | 144 | return 0; |
145 | Hydra = ioremap(r.start, r.end-r.start); | 145 | Hydra = ioremap(r.start, r.end-r.start); |
146 | printk("Hydra Mac I/O at %lx\n", r.start); | 146 | printk("Hydra Mac I/O at %llx\n", (unsigned long long)r.start); |
147 | printk("Hydra Feature_Control was %x", | 147 | printk("Hydra Feature_Control was %x", |
148 | in_le32(&Hydra->Feature_Control)); | 148 | in_le32(&Hydra->Feature_Control)); |
149 | out_le32(&Hydra->Feature_Control, (HYDRA_FC_SCC_CELL_EN | | 149 | out_le32(&Hydra->Feature_Control, (HYDRA_FC_SCC_CELL_EN | |
@@ -267,7 +267,7 @@ chrp_find_bridges(void) | |||
267 | bus_range[0], bus_range[1]); | 267 | bus_range[0], bus_range[1]); |
268 | printk(" controlled by %s", dev->type); | 268 | printk(" controlled by %s", dev->type); |
269 | if (!is_longtrail) | 269 | if (!is_longtrail) |
270 | printk(" at %lx", r.start); | 270 | printk(" at %llx", (unsigned long long)r.start); |
271 | printk("\n"); | 271 | printk("\n"); |
272 | 272 | ||
273 | hose = pcibios_alloc_controller(); | 273 | hose = pcibios_alloc_controller(); |
diff --git a/arch/powerpc/platforms/embedded6xx/Kconfig b/arch/powerpc/platforms/embedded6xx/Kconfig index 4fdbc9ae876b..ba07a9a7c039 100644 --- a/arch/powerpc/platforms/embedded6xx/Kconfig +++ b/arch/powerpc/platforms/embedded6xx/Kconfig | |||
@@ -74,6 +74,16 @@ config SANDPOINT | |||
74 | Select SANDPOINT if configuring for a Motorola Sandpoint X3 | 74 | Select SANDPOINT if configuring for a Motorola Sandpoint X3 |
75 | (any flavor). | 75 | (any flavor). |
76 | 76 | ||
77 | config MPC7448HPC2 | ||
78 | bool "Freescale MPC7448HPC2(Taiga)" | ||
79 | select TSI108_BRIDGE | ||
80 | select DEFAULT_UIMAGE | ||
81 | select PPC_UDBG_16550 | ||
82 | select MPIC | ||
83 | help | ||
84 | Select MPC7448HPC2 if configuring for Freescale MPC7448HPC2 (Taiga) | ||
85 | platform | ||
86 | |||
77 | config RADSTONE_PPC7D | 87 | config RADSTONE_PPC7D |
78 | bool "Radstone Technology PPC7D board" | 88 | bool "Radstone Technology PPC7D board" |
79 | select PPC_I8259 | 89 | select PPC_I8259 |
@@ -221,6 +231,11 @@ config MV64X60 | |||
221 | select PPC_INDIRECT_PCI | 231 | select PPC_INDIRECT_PCI |
222 | default y | 232 | default y |
223 | 233 | ||
234 | config TSI108_BRIDGE | ||
235 | bool | ||
236 | depends on MPC7448HPC2 | ||
237 | default y | ||
238 | |||
224 | menu "Set bridge options" | 239 | menu "Set bridge options" |
225 | depends on MV64X60 | 240 | depends on MV64X60 |
226 | 241 | ||
diff --git a/arch/powerpc/platforms/embedded6xx/Makefile b/arch/powerpc/platforms/embedded6xx/Makefile new file mode 100644 index 000000000000..fa499fe59291 --- /dev/null +++ b/arch/powerpc/platforms/embedded6xx/Makefile | |||
@@ -0,0 +1,4 @@ | |||
1 | # | ||
2 | # Makefile for the 6xx/7xx/7xxxx linux kernel. | ||
3 | # | ||
4 | obj-$(CONFIG_MPC7448HPC2) += mpc7448_hpc2.o | ||
diff --git a/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c b/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c new file mode 100644 index 000000000000..d7a4fc7ca238 --- /dev/null +++ b/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c | |||
@@ -0,0 +1,335 @@ | |||
1 | /* | ||
2 | * mpc7448_hpc2.c | ||
3 | * | ||
4 | * Board setup routines for the Freescale Taiga platform | ||
5 | * | ||
6 | * Author: Jacob Pan | ||
7 | * jacob.pan@freescale.com | ||
8 | * Author: Xianghua Xiao | ||
9 | * x.xiao@freescale.com | ||
10 | * Maintainer: Roy Zang <tie-fei.zang@freescale.com> | ||
11 | * Add Flat Device Tree support fot mpc7448hpc2 board | ||
12 | * | ||
13 | * Copyright 2004-2006 Freescale Semiconductor, Inc. | ||
14 | * | ||
15 | * This file is licensed under | ||
16 | * the terms of the GNU General Public License version 2. This program | ||
17 | * is licensed "as is" without any warranty of any kind, whether express | ||
18 | * or implied. | ||
19 | */ | ||
20 | |||
21 | #include <linux/config.h> | ||
22 | #include <linux/stddef.h> | ||
23 | #include <linux/kernel.h> | ||
24 | #include <linux/pci.h> | ||
25 | #include <linux/kdev_t.h> | ||
26 | #include <linux/console.h> | ||
27 | #include <linux/delay.h> | ||
28 | #include <linux/irq.h> | ||
29 | #include <linux/ide.h> | ||
30 | #include <linux/seq_file.h> | ||
31 | #include <linux/root_dev.h> | ||
32 | #include <linux/serial.h> | ||
33 | #include <linux/tty.h> | ||
34 | #include <linux/serial_core.h> | ||
35 | |||
36 | #include <asm/system.h> | ||
37 | #include <asm/time.h> | ||
38 | #include <asm/machdep.h> | ||
39 | #include <asm/prom.h> | ||
40 | #include <asm/udbg.h> | ||
41 | #include <asm/tsi108.h> | ||
42 | #include <asm/pci-bridge.h> | ||
43 | #include <asm/reg.h> | ||
44 | #include <mm/mmu_decl.h> | ||
45 | #include "mpc7448_hpc2.h" | ||
46 | #include <asm/tsi108_irq.h> | ||
47 | #include <asm/mpic.h> | ||
48 | |||
49 | #undef DEBUG | ||
50 | #ifdef DEBUG | ||
51 | #define DBG(fmt...) do { printk(fmt); } while(0) | ||
52 | #else | ||
53 | #define DBG(fmt...) do { } while(0) | ||
54 | #endif | ||
55 | |||
56 | #ifndef CONFIG_PCI | ||
57 | isa_io_base = MPC7448_HPC2_ISA_IO_BASE; | ||
58 | isa_mem_base = MPC7448_HPC2_ISA_MEM_BASE; | ||
59 | pci_dram_offset = MPC7448_HPC2_PCI_MEM_OFFSET; | ||
60 | #endif | ||
61 | |||
62 | extern int tsi108_setup_pci(struct device_node *dev); | ||
63 | extern void _nmask_and_or_msr(unsigned long nmask, unsigned long or_val); | ||
64 | extern void tsi108_pci_int_init(void); | ||
65 | extern int tsi108_irq_cascade(struct pt_regs *regs, void *unused); | ||
66 | |||
67 | /* | ||
68 | * Define all of the IRQ senses and polarities. Taken from the | ||
69 | * mpc7448hpc manual. | ||
70 | * Note: Likely, this table and the following function should be | ||
71 | * obtained and derived from the OF Device Tree. | ||
72 | */ | ||
73 | |||
74 | static u_char mpc7448_hpc2_pic_initsenses[] __initdata = { | ||
75 | /* External on-board sources */ | ||
76 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* INT[0] XINT0 from FPGA */ | ||
77 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* INT[1] XINT1 from FPGA */ | ||
78 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* INT[2] PHY_INT from both GIGE */ | ||
79 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* INT[3] RESERVED */ | ||
80 | /* Internal Tsi108/109 interrupt sources */ | ||
81 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* Reserved IRQ */ | ||
82 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* Reserved IRQ */ | ||
83 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* Reserved IRQ */ | ||
84 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* Reserved IRQ */ | ||
85 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* DMA0 */ | ||
86 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* DMA1 */ | ||
87 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* DMA2 */ | ||
88 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* DMA3 */ | ||
89 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* UART0 */ | ||
90 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* UART1 */ | ||
91 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* I2C */ | ||
92 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* GPIO */ | ||
93 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* GIGE0 */ | ||
94 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* GIGE1 */ | ||
95 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* Reserved IRQ */ | ||
96 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* HLP */ | ||
97 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* SDC */ | ||
98 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* Processor IF */ | ||
99 | (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* Reserved IRQ */ | ||
100 | (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* PCI/X block */ | ||
101 | }; | ||
102 | |||
103 | int mpc7448_hpc2_exclude_device(u_char bus, u_char devfn) | ||
104 | { | ||
105 | if (bus == 0 && PCI_SLOT(devfn) == 0) | ||
106 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
107 | else | ||
108 | return PCIBIOS_SUCCESSFUL; | ||
109 | } | ||
110 | |||
111 | /* | ||
112 | * find pci slot by devfn in interrupt map of OF tree | ||
113 | */ | ||
114 | u8 find_slot_by_devfn(unsigned int *interrupt_map, unsigned int devfn) | ||
115 | { | ||
116 | int i; | ||
117 | unsigned int tmp; | ||
118 | for (i = 0; i < 4; i++){ | ||
119 | tmp = interrupt_map[i*4*7]; | ||
120 | if ((tmp >> 11) == (devfn >> 3)) | ||
121 | return i; | ||
122 | } | ||
123 | return i; | ||
124 | } | ||
125 | |||
126 | /* | ||
127 | * Scans the interrupt map for pci device | ||
128 | */ | ||
129 | void mpc7448_hpc2_fixup_irq(struct pci_dev *dev) | ||
130 | { | ||
131 | struct pci_controller *hose; | ||
132 | struct device_node *node; | ||
133 | unsigned int *interrupt; | ||
134 | int busnr; | ||
135 | int len; | ||
136 | u8 slot; | ||
137 | u8 pin; | ||
138 | |||
139 | /* Lookup the hose */ | ||
140 | busnr = dev->bus->number; | ||
141 | hose = pci_bus_to_hose(busnr); | ||
142 | if (!hose) | ||
143 | printk(KERN_ERR "No pci hose found\n"); | ||
144 | |||
145 | /* Check it has an OF node associated */ | ||
146 | node = (struct device_node *) hose->arch_data; | ||
147 | if (!node) | ||
148 | printk(KERN_ERR "No pci node found\n"); | ||
149 | |||
150 | interrupt = (unsigned int *) get_property(node, "interrupt-map", &len); | ||
151 | slot = find_slot_by_devfn(interrupt, dev->devfn); | ||
152 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); | ||
153 | if (pin == 0 || pin > 4) | ||
154 | pin = 1; | ||
155 | pin--; | ||
156 | dev->irq = interrupt[slot*4*7 + pin*7 + 5]; | ||
157 | DBG("TSI_PCI: dev->irq = 0x%x\n", dev->irq); | ||
158 | } | ||
159 | /* temporary pci irq map fixup*/ | ||
160 | |||
161 | void __init mpc7448_hpc2_pcibios_fixup(void) | ||
162 | { | ||
163 | struct pci_dev *dev = NULL; | ||
164 | for_each_pci_dev(dev) { | ||
165 | mpc7448_hpc2_fixup_irq(dev); | ||
166 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); | ||
167 | } | ||
168 | } | ||
169 | |||
170 | static void __init mpc7448_hpc2_setup_arch(void) | ||
171 | { | ||
172 | struct device_node *cpu; | ||
173 | struct device_node *np; | ||
174 | if (ppc_md.progress) | ||
175 | ppc_md.progress("mpc7448_hpc2_setup_arch():set_bridge", 0); | ||
176 | |||
177 | cpu = of_find_node_by_type(NULL, "cpu"); | ||
178 | if (cpu != 0) { | ||
179 | unsigned int *fp; | ||
180 | |||
181 | fp = (int *)get_property(cpu, "clock-frequency", NULL); | ||
182 | if (fp != 0) | ||
183 | loops_per_jiffy = *fp / HZ; | ||
184 | else | ||
185 | loops_per_jiffy = 50000000 / HZ; | ||
186 | of_node_put(cpu); | ||
187 | } | ||
188 | tsi108_csr_vir_base = get_vir_csrbase(); | ||
189 | |||
190 | #ifdef CONFIG_ROOT_NFS | ||
191 | ROOT_DEV = Root_NFS; | ||
192 | #else | ||
193 | ROOT_DEV = Root_HDA1; | ||
194 | #endif | ||
195 | |||
196 | #ifdef CONFIG_BLK_DEV_INITRD | ||
197 | ROOT_DEV = Root_RAM0; | ||
198 | #endif | ||
199 | |||
200 | /* setup PCI host bridge */ | ||
201 | #ifdef CONFIG_PCI | ||
202 | for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;) | ||
203 | tsi108_setup_pci(np); | ||
204 | |||
205 | ppc_md.pci_exclude_device = mpc7448_hpc2_exclude_device; | ||
206 | if (ppc_md.progress) | ||
207 | ppc_md.progress("tsi108: resources set", 0x100); | ||
208 | #endif | ||
209 | |||
210 | printk(KERN_INFO "MPC7448HPC2 (TAIGA) Platform\n"); | ||
211 | printk(KERN_INFO | ||
212 | "Jointly ported by Freescale and Tundra Semiconductor\n"); | ||
213 | printk(KERN_INFO | ||
214 | "Enabling L2 cache then enabling the HID0 prefetch engine.\n"); | ||
215 | } | ||
216 | |||
217 | /* | ||
218 | * Interrupt setup and service. Interrrupts on the mpc7448_hpc2 come | ||
219 | * from the four external INT pins, PCI interrupts are routed via | ||
220 | * PCI interrupt control registers, it generates internal IRQ23 | ||
221 | * | ||
222 | * Interrupt routing on the Taiga Board: | ||
223 | * TSI108:PB_INT[0] -> CPU0:INT# | ||
224 | * TSI108:PB_INT[1] -> CPU0:MCP# | ||
225 | * TSI108:PB_INT[2] -> N/C | ||
226 | * TSI108:PB_INT[3] -> N/C | ||
227 | */ | ||
228 | static void __init mpc7448_hpc2_init_IRQ(void) | ||
229 | { | ||
230 | struct mpic *mpic; | ||
231 | phys_addr_t mpic_paddr = 0; | ||
232 | struct device_node *tsi_pic; | ||
233 | |||
234 | tsi_pic = of_find_node_by_type(NULL, "open-pic"); | ||
235 | if (tsi_pic) { | ||
236 | unsigned int size; | ||
237 | void *prop = get_property(tsi_pic, "reg", &size); | ||
238 | mpic_paddr = of_translate_address(tsi_pic, prop); | ||
239 | } | ||
240 | |||
241 | if (mpic_paddr == 0) { | ||
242 | printk("%s: No tsi108 PIC found !\n", __FUNCTION__); | ||
243 | return; | ||
244 | } | ||
245 | |||
246 | DBG("%s: tsi108pic phys_addr = 0x%x\n", __FUNCTION__, | ||
247 | (u32) mpic_paddr); | ||
248 | |||
249 | mpic = mpic_alloc(mpic_paddr, | ||
250 | MPIC_PRIMARY | MPIC_BIG_ENDIAN | MPIC_WANTS_RESET | | ||
251 | MPIC_SPV_EOI | MPIC_MOD_ID(MPIC_ID_TSI108), | ||
252 | 0, /* num_sources used */ | ||
253 | TSI108_IRQ_BASE, | ||
254 | 0, /* num_sources used */ | ||
255 | NR_IRQS - 4 /* XXXX */, | ||
256 | mpc7448_hpc2_pic_initsenses, | ||
257 | sizeof(mpc7448_hpc2_pic_initsenses), "Tsi108_PIC"); | ||
258 | |||
259 | BUG_ON(mpic == NULL); /* XXXX */ | ||
260 | |||
261 | mpic_init(mpic); | ||
262 | mpic_setup_cascade(IRQ_TSI108_PCI, tsi108_irq_cascade, mpic); | ||
263 | tsi108_pci_int_init(); | ||
264 | |||
265 | /* Configure MPIC outputs to CPU0 */ | ||
266 | tsi108_write_reg(TSI108_MPIC_OFFSET + 0x30c, 0); | ||
267 | } | ||
268 | |||
269 | void mpc7448_hpc2_show_cpuinfo(struct seq_file *m) | ||
270 | { | ||
271 | seq_printf(m, "vendor\t\t: Freescale Semiconductor\n"); | ||
272 | seq_printf(m, "machine\t\t: MPC7448hpc2\n"); | ||
273 | } | ||
274 | |||
275 | void mpc7448_hpc2_restart(char *cmd) | ||
276 | { | ||
277 | local_irq_disable(); | ||
278 | |||
279 | /* Set exception prefix high - to the firmware */ | ||
280 | _nmask_and_or_msr(0, MSR_IP); | ||
281 | |||
282 | for (;;) ; /* Spin until reset happens */ | ||
283 | } | ||
284 | |||
285 | void mpc7448_hpc2_power_off(void) | ||
286 | { | ||
287 | local_irq_disable(); | ||
288 | for (;;) ; /* No way to shut power off with software */ | ||
289 | } | ||
290 | |||
291 | void mpc7448_hpc2_halt(void) | ||
292 | { | ||
293 | mpc7448_hpc2_power_off(); | ||
294 | } | ||
295 | |||
296 | /* | ||
297 | * Called very early, device-tree isn't unflattened | ||
298 | */ | ||
299 | static int __init mpc7448_hpc2_probe(void) | ||
300 | { | ||
301 | unsigned long root = of_get_flat_dt_root(); | ||
302 | |||
303 | if (!of_flat_dt_is_compatible(root, "mpc74xx")) | ||
304 | return 0; | ||
305 | return 1; | ||
306 | } | ||
307 | |||
308 | static int mpc7448_machine_check_exception(struct pt_regs *regs) | ||
309 | { | ||
310 | extern void tsi108_clear_pci_cfg_error(void); | ||
311 | const struct exception_table_entry *entry; | ||
312 | |||
313 | /* Are we prepared to handle this fault */ | ||
314 | if ((entry = search_exception_tables(regs->nip)) != NULL) { | ||
315 | tsi108_clear_pci_cfg_error(); | ||
316 | regs->msr |= MSR_RI; | ||
317 | regs->nip = entry->fixup; | ||
318 | return 1; | ||
319 | } | ||
320 | return 0; | ||
321 | |||
322 | } | ||
323 | define_machine(mpc7448_hpc2){ | ||
324 | .name = "MPC7448 HPC2", | ||
325 | .probe = mpc7448_hpc2_probe, | ||
326 | .setup_arch = mpc7448_hpc2_setup_arch, | ||
327 | .init_IRQ = mpc7448_hpc2_init_IRQ, | ||
328 | .show_cpuinfo = mpc7448_hpc2_show_cpuinfo, | ||
329 | .get_irq = mpic_get_irq, | ||
330 | .pcibios_fixup = mpc7448_hpc2_pcibios_fixup, | ||
331 | .restart = mpc7448_hpc2_restart, | ||
332 | .calibrate_decr = generic_calibrate_decr, | ||
333 | .machine_check_exception= mpc7448_machine_check_exception, | ||
334 | .progress = udbg_progress, | ||
335 | }; | ||
diff --git a/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.h b/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.h new file mode 100644 index 000000000000..a543a5242e34 --- /dev/null +++ b/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /* | ||
2 | * mpc7448_hpc2.h | ||
3 | * | ||
4 | * Definitions for Freescale MPC7448_HPC2 platform | ||
5 | * | ||
6 | * Author: Jacob Pan | ||
7 | * jacob.pan@freescale.com | ||
8 | * Maintainer: Roy Zang <roy.zang@freescale.com> | ||
9 | * | ||
10 | * 2006 (c) Freescale Semiconductor, Inc. This file is licensed under | ||
11 | * the terms of the GNU General Public License version 2. This program | ||
12 | * is licensed "as is" without any warranty of any kind, whether express | ||
13 | * or implied. | ||
14 | */ | ||
15 | |||
16 | #ifndef __PPC_PLATFORMS_MPC7448_HPC2_H | ||
17 | #define __PPC_PLATFORMS_MPC7448_HPC2_H | ||
18 | |||
19 | #include <asm/ppcboot.h> | ||
20 | |||
21 | /* Base Addresses for the PCI bus | ||
22 | */ | ||
23 | #define MPC7448_HPC2_PCI_MEM_OFFSET (0x00000000) | ||
24 | #define MPC7448_HPC2_ISA_IO_BASE (0x00000000) | ||
25 | #define MPC7448_HPC2_ISA_MEM_BASE (0x00000000) | ||
26 | #endif /* __PPC_PLATFORMS_MPC7448_HPC2_H */ | ||
diff --git a/arch/powerpc/platforms/iseries/dt.c b/arch/powerpc/platforms/iseries/dt.c index d3444aabe76e..d194140c1ebf 100644 --- a/arch/powerpc/platforms/iseries/dt.c +++ b/arch/powerpc/platforms/iseries/dt.c | |||
@@ -252,6 +252,7 @@ static void __init dt_model(struct iseries_flat_dt *dt) | |||
252 | { | 252 | { |
253 | char buf[16] = "IBM,"; | 253 | char buf[16] = "IBM,"; |
254 | 254 | ||
255 | /* N.B. lparcfg.c knows about the "IBM," prefixes ... */ | ||
255 | /* "IBM," + mfgId[2:3] + systemSerial[1:5] */ | 256 | /* "IBM," + mfgId[2:3] + systemSerial[1:5] */ |
256 | strne2a(buf + 4, xItExtVpdPanel.mfgID + 2, 2); | 257 | strne2a(buf + 4, xItExtVpdPanel.mfgID + 2, 2); |
257 | strne2a(buf + 6, xItExtVpdPanel.systemSerial + 1, 5); | 258 | strne2a(buf + 6, xItExtVpdPanel.systemSerial + 1, 5); |
@@ -264,6 +265,7 @@ static void __init dt_model(struct iseries_flat_dt *dt) | |||
264 | dt_prop_str(dt, "model", buf); | 265 | dt_prop_str(dt, "model", buf); |
265 | 266 | ||
266 | dt_prop_str(dt, "compatible", "IBM,iSeries"); | 267 | dt_prop_str(dt, "compatible", "IBM,iSeries"); |
268 | dt_prop_u32(dt, "ibm,partition-no", HvLpConfig_getLpIndex()); | ||
267 | } | 269 | } |
268 | 270 | ||
269 | static void __init dt_do_vdevice(struct iseries_flat_dt *dt, | 271 | static void __init dt_do_vdevice(struct iseries_flat_dt *dt, |
diff --git a/arch/powerpc/platforms/iseries/htab.c b/arch/powerpc/platforms/iseries/htab.c index 30bdcf3925d9..ed44dfceaa45 100644 --- a/arch/powerpc/platforms/iseries/htab.c +++ b/arch/powerpc/platforms/iseries/htab.c | |||
@@ -242,13 +242,11 @@ static void iSeries_hpte_invalidate(unsigned long slot, unsigned long va, | |||
242 | local_irq_restore(flags); | 242 | local_irq_restore(flags); |
243 | } | 243 | } |
244 | 244 | ||
245 | void hpte_init_iSeries(void) | 245 | void __init hpte_init_iSeries(void) |
246 | { | 246 | { |
247 | ppc_md.hpte_invalidate = iSeries_hpte_invalidate; | 247 | ppc_md.hpte_invalidate = iSeries_hpte_invalidate; |
248 | ppc_md.hpte_updatepp = iSeries_hpte_updatepp; | 248 | ppc_md.hpte_updatepp = iSeries_hpte_updatepp; |
249 | ppc_md.hpte_updateboltedpp = iSeries_hpte_updateboltedpp; | 249 | ppc_md.hpte_updateboltedpp = iSeries_hpte_updateboltedpp; |
250 | ppc_md.hpte_insert = iSeries_hpte_insert; | 250 | ppc_md.hpte_insert = iSeries_hpte_insert; |
251 | ppc_md.hpte_remove = iSeries_hpte_remove; | 251 | ppc_md.hpte_remove = iSeries_hpte_remove; |
252 | |||
253 | htab_finish_init(); | ||
254 | } | 252 | } |
diff --git a/arch/powerpc/platforms/iseries/irq.c b/arch/powerpc/platforms/iseries/irq.c index 62bbbcf5ded3..33bb4aa0e1e8 100644 --- a/arch/powerpc/platforms/iseries/irq.c +++ b/arch/powerpc/platforms/iseries/irq.c | |||
@@ -242,9 +242,9 @@ void __init iSeries_activate_IRQs() | |||
242 | for_each_irq (irq) { | 242 | for_each_irq (irq) { |
243 | irq_desc_t *desc = get_irq_desc(irq); | 243 | irq_desc_t *desc = get_irq_desc(irq); |
244 | 244 | ||
245 | if (desc && desc->handler && desc->handler->startup) { | 245 | if (desc && desc->chip && desc->chip->startup) { |
246 | spin_lock_irqsave(&desc->lock, flags); | 246 | spin_lock_irqsave(&desc->lock, flags); |
247 | desc->handler->startup(irq); | 247 | desc->chip->startup(irq); |
248 | spin_unlock_irqrestore(&desc->lock, flags); | 248 | spin_unlock_irqrestore(&desc->lock, flags); |
249 | } | 249 | } |
250 | } | 250 | } |
@@ -324,7 +324,7 @@ int __init iSeries_allocate_IRQ(HvBusNumber bus, | |||
324 | + function; | 324 | + function; |
325 | virtirq = virt_irq_create_mapping(realirq); | 325 | virtirq = virt_irq_create_mapping(realirq); |
326 | 326 | ||
327 | irq_desc[virtirq].handler = &iSeries_IRQ_handler; | 327 | irq_desc[virtirq].chip = &iSeries_IRQ_handler; |
328 | return virtirq; | 328 | return virtirq; |
329 | } | 329 | } |
330 | 330 | ||
diff --git a/arch/powerpc/platforms/iseries/lpevents.c b/arch/powerpc/platforms/iseries/lpevents.c index 8ca7b9396355..2a9f81ea27d6 100644 --- a/arch/powerpc/platforms/iseries/lpevents.c +++ b/arch/powerpc/platforms/iseries/lpevents.c | |||
@@ -51,20 +51,21 @@ static unsigned lpEventHandlerPaths[HvLpEvent_Type_NumTypes]; | |||
51 | static struct HvLpEvent * get_next_hvlpevent(void) | 51 | static struct HvLpEvent * get_next_hvlpevent(void) |
52 | { | 52 | { |
53 | struct HvLpEvent * event; | 53 | struct HvLpEvent * event; |
54 | event = (struct HvLpEvent *)hvlpevent_queue.xSlicCurEventPtr; | 54 | event = (struct HvLpEvent *)hvlpevent_queue.hq_current_event; |
55 | 55 | ||
56 | if (hvlpevent_is_valid(event)) { | 56 | if (hvlpevent_is_valid(event)) { |
57 | /* rmb() needed only for weakly consistent machines (regatta) */ | 57 | /* rmb() needed only for weakly consistent machines (regatta) */ |
58 | rmb(); | 58 | rmb(); |
59 | /* Set pointer to next potential event */ | 59 | /* Set pointer to next potential event */ |
60 | hvlpevent_queue.xSlicCurEventPtr += ((event->xSizeMinus1 + | 60 | hvlpevent_queue.hq_current_event += ((event->xSizeMinus1 + |
61 | LpEventAlign) / LpEventAlign) * LpEventAlign; | 61 | IT_LP_EVENT_ALIGN) / IT_LP_EVENT_ALIGN) * |
62 | IT_LP_EVENT_ALIGN; | ||
62 | 63 | ||
63 | /* Wrap to beginning if no room at end */ | 64 | /* Wrap to beginning if no room at end */ |
64 | if (hvlpevent_queue.xSlicCurEventPtr > | 65 | if (hvlpevent_queue.hq_current_event > |
65 | hvlpevent_queue.xSlicLastValidEventPtr) { | 66 | hvlpevent_queue.hq_last_event) { |
66 | hvlpevent_queue.xSlicCurEventPtr = | 67 | hvlpevent_queue.hq_current_event = |
67 | hvlpevent_queue.xSlicEventStackPtr; | 68 | hvlpevent_queue.hq_event_stack; |
68 | } | 69 | } |
69 | } else { | 70 | } else { |
70 | event = NULL; | 71 | event = NULL; |
@@ -82,10 +83,10 @@ int hvlpevent_is_pending(void) | |||
82 | if (smp_processor_id() >= spread_lpevents) | 83 | if (smp_processor_id() >= spread_lpevents) |
83 | return 0; | 84 | return 0; |
84 | 85 | ||
85 | next_event = (struct HvLpEvent *)hvlpevent_queue.xSlicCurEventPtr; | 86 | next_event = (struct HvLpEvent *)hvlpevent_queue.hq_current_event; |
86 | 87 | ||
87 | return hvlpevent_is_valid(next_event) || | 88 | return hvlpevent_is_valid(next_event) || |
88 | hvlpevent_queue.xPlicOverflowIntPending; | 89 | hvlpevent_queue.hq_overflow_pending; |
89 | } | 90 | } |
90 | 91 | ||
91 | static void hvlpevent_clear_valid(struct HvLpEvent * event) | 92 | static void hvlpevent_clear_valid(struct HvLpEvent * event) |
@@ -95,18 +96,18 @@ static void hvlpevent_clear_valid(struct HvLpEvent * event) | |||
95 | * ie. on 64-byte boundaries. | 96 | * ie. on 64-byte boundaries. |
96 | */ | 97 | */ |
97 | struct HvLpEvent *tmp; | 98 | struct HvLpEvent *tmp; |
98 | unsigned extra = ((event->xSizeMinus1 + LpEventAlign) / | 99 | unsigned extra = ((event->xSizeMinus1 + IT_LP_EVENT_ALIGN) / |
99 | LpEventAlign) - 1; | 100 | IT_LP_EVENT_ALIGN) - 1; |
100 | 101 | ||
101 | switch (extra) { | 102 | switch (extra) { |
102 | case 3: | 103 | case 3: |
103 | tmp = (struct HvLpEvent*)((char*)event + 3 * LpEventAlign); | 104 | tmp = (struct HvLpEvent*)((char*)event + 3 * IT_LP_EVENT_ALIGN); |
104 | hvlpevent_invalidate(tmp); | 105 | hvlpevent_invalidate(tmp); |
105 | case 2: | 106 | case 2: |
106 | tmp = (struct HvLpEvent*)((char*)event + 2 * LpEventAlign); | 107 | tmp = (struct HvLpEvent*)((char*)event + 2 * IT_LP_EVENT_ALIGN); |
107 | hvlpevent_invalidate(tmp); | 108 | hvlpevent_invalidate(tmp); |
108 | case 1: | 109 | case 1: |
109 | tmp = (struct HvLpEvent*)((char*)event + 1 * LpEventAlign); | 110 | tmp = (struct HvLpEvent*)((char*)event + 1 * IT_LP_EVENT_ALIGN); |
110 | hvlpevent_invalidate(tmp); | 111 | hvlpevent_invalidate(tmp); |
111 | } | 112 | } |
112 | 113 | ||
@@ -120,7 +121,7 @@ void process_hvlpevents(struct pt_regs *regs) | |||
120 | struct HvLpEvent * event; | 121 | struct HvLpEvent * event; |
121 | 122 | ||
122 | /* If we have recursed, just return */ | 123 | /* If we have recursed, just return */ |
123 | if (!spin_trylock(&hvlpevent_queue.lock)) | 124 | if (!spin_trylock(&hvlpevent_queue.hq_lock)) |
124 | return; | 125 | return; |
125 | 126 | ||
126 | for (;;) { | 127 | for (;;) { |
@@ -148,17 +149,17 @@ void process_hvlpevents(struct pt_regs *regs) | |||
148 | printk(KERN_INFO "Unexpected Lp Event type=%d\n", event->xType ); | 149 | printk(KERN_INFO "Unexpected Lp Event type=%d\n", event->xType ); |
149 | 150 | ||
150 | hvlpevent_clear_valid(event); | 151 | hvlpevent_clear_valid(event); |
151 | } else if (hvlpevent_queue.xPlicOverflowIntPending) | 152 | } else if (hvlpevent_queue.hq_overflow_pending) |
152 | /* | 153 | /* |
153 | * No more valid events. If overflow events are | 154 | * No more valid events. If overflow events are |
154 | * pending process them | 155 | * pending process them |
155 | */ | 156 | */ |
156 | HvCallEvent_getOverflowLpEvents(hvlpevent_queue.xIndex); | 157 | HvCallEvent_getOverflowLpEvents(hvlpevent_queue.hq_index); |
157 | else | 158 | else |
158 | break; | 159 | break; |
159 | } | 160 | } |
160 | 161 | ||
161 | spin_unlock(&hvlpevent_queue.lock); | 162 | spin_unlock(&hvlpevent_queue.hq_lock); |
162 | } | 163 | } |
163 | 164 | ||
164 | static int set_spread_lpevents(char *str) | 165 | static int set_spread_lpevents(char *str) |
@@ -184,20 +185,20 @@ void setup_hvlpevent_queue(void) | |||
184 | { | 185 | { |
185 | void *eventStack; | 186 | void *eventStack; |
186 | 187 | ||
187 | spin_lock_init(&hvlpevent_queue.lock); | 188 | spin_lock_init(&hvlpevent_queue.hq_lock); |
188 | 189 | ||
189 | /* Allocate a page for the Event Stack. */ | 190 | /* Allocate a page for the Event Stack. */ |
190 | eventStack = alloc_bootmem_pages(LpEventStackSize); | 191 | eventStack = alloc_bootmem_pages(IT_LP_EVENT_STACK_SIZE); |
191 | memset(eventStack, 0, LpEventStackSize); | 192 | memset(eventStack, 0, IT_LP_EVENT_STACK_SIZE); |
192 | 193 | ||
193 | /* Invoke the hypervisor to initialize the event stack */ | 194 | /* Invoke the hypervisor to initialize the event stack */ |
194 | HvCallEvent_setLpEventStack(0, eventStack, LpEventStackSize); | 195 | HvCallEvent_setLpEventStack(0, eventStack, IT_LP_EVENT_STACK_SIZE); |
195 | 196 | ||
196 | hvlpevent_queue.xSlicEventStackPtr = (char *)eventStack; | 197 | hvlpevent_queue.hq_event_stack = eventStack; |
197 | hvlpevent_queue.xSlicCurEventPtr = (char *)eventStack; | 198 | hvlpevent_queue.hq_current_event = eventStack; |
198 | hvlpevent_queue.xSlicLastValidEventPtr = (char *)eventStack + | 199 | hvlpevent_queue.hq_last_event = (char *)eventStack + |
199 | (LpEventStackSize - LpEventMaxSize); | 200 | (IT_LP_EVENT_STACK_SIZE - IT_LP_EVENT_MAX_SIZE); |
200 | hvlpevent_queue.xIndex = 0; | 201 | hvlpevent_queue.hq_index = 0; |
201 | } | 202 | } |
202 | 203 | ||
203 | /* Register a handler for an LpEvent type */ | 204 | /* Register a handler for an LpEvent type */ |
diff --git a/arch/powerpc/platforms/iseries/proc.c b/arch/powerpc/platforms/iseries/proc.c index e68b6b5fa89f..c241413629ac 100644 --- a/arch/powerpc/platforms/iseries/proc.c +++ b/arch/powerpc/platforms/iseries/proc.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include <asm/processor.h> | 24 | #include <asm/processor.h> |
25 | #include <asm/time.h> | 25 | #include <asm/time.h> |
26 | #include <asm/lppaca.h> | 26 | #include <asm/lppaca.h> |
27 | #include <asm/iseries/it_lp_queue.h> | ||
28 | #include <asm/iseries/hv_call_xm.h> | 27 | #include <asm/iseries/hv_call_xm.h> |
29 | 28 | ||
30 | #include "processor_vpd.h" | 29 | #include "processor_vpd.h" |
diff --git a/arch/powerpc/platforms/iseries/setup.c b/arch/powerpc/platforms/iseries/setup.c index 617c724c4590..66c77e4f8ec2 100644 --- a/arch/powerpc/platforms/iseries/setup.c +++ b/arch/powerpc/platforms/iseries/setup.c | |||
@@ -81,8 +81,6 @@ static void iSeries_pci_final_fixup(void) { } | |||
81 | #endif | 81 | #endif |
82 | 82 | ||
83 | extern int rd_size; /* Defined in drivers/block/rd.c */ | 83 | extern int rd_size; /* Defined in drivers/block/rd.c */ |
84 | extern unsigned long embedded_sysmap_start; | ||
85 | extern unsigned long embedded_sysmap_end; | ||
86 | 84 | ||
87 | extern unsigned long iSeries_recal_tb; | 85 | extern unsigned long iSeries_recal_tb; |
88 | extern unsigned long iSeries_recal_titan; | 86 | extern unsigned long iSeries_recal_titan; |
@@ -321,11 +319,6 @@ static void __init iSeries_init_early(void) | |||
321 | iSeries_recal_titan = HvCallXm_loadTod(); | 319 | iSeries_recal_titan = HvCallXm_loadTod(); |
322 | 320 | ||
323 | /* | 321 | /* |
324 | * Initialize the hash table management pointers | ||
325 | */ | ||
326 | hpte_init_iSeries(); | ||
327 | |||
328 | /* | ||
329 | * Initialize the DMA/TCE management | 322 | * Initialize the DMA/TCE management |
330 | */ | 323 | */ |
331 | iommu_init_early_iSeries(); | 324 | iommu_init_early_iSeries(); |
@@ -563,16 +556,6 @@ static void __init iSeries_fixup_klimit(void) | |||
563 | if (naca.xRamDisk) | 556 | if (naca.xRamDisk) |
564 | klimit = KERNELBASE + (u64)naca.xRamDisk + | 557 | klimit = KERNELBASE + (u64)naca.xRamDisk + |
565 | (naca.xRamDiskSize * HW_PAGE_SIZE); | 558 | (naca.xRamDiskSize * HW_PAGE_SIZE); |
566 | else { | ||
567 | /* | ||
568 | * No ram disk was included - check and see if there | ||
569 | * was an embedded system map. Change klimit to take | ||
570 | * into account any embedded system map | ||
571 | */ | ||
572 | if (embedded_sysmap_end) | ||
573 | klimit = KERNELBASE + ((embedded_sysmap_end + 4095) & | ||
574 | 0xfffffffffffff000); | ||
575 | } | ||
576 | } | 559 | } |
577 | 560 | ||
578 | static int __init iSeries_src_init(void) | 561 | static int __init iSeries_src_init(void) |
@@ -683,6 +666,8 @@ static int __init iseries_probe(void) | |||
683 | */ | 666 | */ |
684 | virt_irq_max = 255; | 667 | virt_irq_max = 255; |
685 | 668 | ||
669 | hpte_init_iSeries(); | ||
670 | |||
686 | return 1; | 671 | return 1; |
687 | } | 672 | } |
688 | 673 | ||
diff --git a/arch/powerpc/platforms/maple/pci.c b/arch/powerpc/platforms/maple/pci.c index 9a4efc0c3b29..f7170ff86dab 100644 --- a/arch/powerpc/platforms/maple/pci.c +++ b/arch/powerpc/platforms/maple/pci.c | |||
@@ -376,9 +376,10 @@ static void __init maple_fixup_phb_resources(void) | |||
376 | unsigned long offset = (unsigned long)hose->io_base_virt - pci_io_base; | 376 | unsigned long offset = (unsigned long)hose->io_base_virt - pci_io_base; |
377 | hose->io_resource.start += offset; | 377 | hose->io_resource.start += offset; |
378 | hose->io_resource.end += offset; | 378 | hose->io_resource.end += offset; |
379 | printk(KERN_INFO "PCI Host %d, io start: %lx; io end: %lx\n", | 379 | printk(KERN_INFO "PCI Host %d, io start: %llx; io end: %llx\n", |
380 | hose->global_number, | 380 | hose->global_number, |
381 | hose->io_resource.start, hose->io_resource.end); | 381 | (unsigned long long)hose->io_resource.start, |
382 | (unsigned long long)hose->io_resource.end); | ||
382 | } | 383 | } |
383 | } | 384 | } |
384 | 385 | ||
diff --git a/arch/powerpc/platforms/maple/setup.c b/arch/powerpc/platforms/maple/setup.c index a0505ea48a86..4e32a5417fd1 100644 --- a/arch/powerpc/platforms/maple/setup.c +++ b/arch/powerpc/platforms/maple/setup.c | |||
@@ -199,11 +199,6 @@ static void __init maple_init_early(void) | |||
199 | { | 199 | { |
200 | DBG(" -> maple_init_early\n"); | 200 | DBG(" -> maple_init_early\n"); |
201 | 201 | ||
202 | /* Initialize hash table, from now on, we can take hash faults | ||
203 | * and call ioremap | ||
204 | */ | ||
205 | hpte_init_native(); | ||
206 | |||
207 | /* Setup interrupt mapping options */ | 202 | /* Setup interrupt mapping options */ |
208 | ppc64_interrupt_controller = IC_OPEN_PIC; | 203 | ppc64_interrupt_controller = IC_OPEN_PIC; |
209 | 204 | ||
@@ -272,6 +267,8 @@ static int __init maple_probe(void) | |||
272 | */ | 267 | */ |
273 | alloc_dart_table(); | 268 | alloc_dart_table(); |
274 | 269 | ||
270 | hpte_init_native(); | ||
271 | |||
275 | return 1; | 272 | return 1; |
276 | } | 273 | } |
277 | 274 | ||
diff --git a/arch/powerpc/platforms/powermac/backlight.c b/arch/powerpc/platforms/powermac/backlight.c index 498b042e1837..c7a27eddca6d 100644 --- a/arch/powerpc/platforms/powermac/backlight.c +++ b/arch/powerpc/platforms/powermac/backlight.c | |||
@@ -119,7 +119,14 @@ int pmac_backlight_set_legacy_brightness(int brightness) | |||
119 | down(&pmac_backlight->sem); | 119 | down(&pmac_backlight->sem); |
120 | props = pmac_backlight->props; | 120 | props = pmac_backlight->props; |
121 | props->brightness = brightness * | 121 | props->brightness = brightness * |
122 | props->max_brightness / OLD_BACKLIGHT_MAX; | 122 | (props->max_brightness + 1) / |
123 | (OLD_BACKLIGHT_MAX + 1); | ||
124 | |||
125 | if (props->brightness > props->max_brightness) | ||
126 | props->brightness = props->max_brightness; | ||
127 | else if (props->brightness < 0) | ||
128 | props->brightness = 0; | ||
129 | |||
123 | props->update_status(pmac_backlight); | 130 | props->update_status(pmac_backlight); |
124 | up(&pmac_backlight->sem); | 131 | up(&pmac_backlight->sem); |
125 | 132 | ||
@@ -140,8 +147,11 @@ int pmac_backlight_get_legacy_brightness() | |||
140 | 147 | ||
141 | down(&pmac_backlight->sem); | 148 | down(&pmac_backlight->sem); |
142 | props = pmac_backlight->props; | 149 | props = pmac_backlight->props; |
150 | |||
143 | result = props->brightness * | 151 | result = props->brightness * |
144 | OLD_BACKLIGHT_MAX / props->max_brightness; | 152 | (OLD_BACKLIGHT_MAX + 1) / |
153 | (props->max_brightness + 1); | ||
154 | |||
145 | up(&pmac_backlight->sem); | 155 | up(&pmac_backlight->sem); |
146 | } | 156 | } |
147 | mutex_unlock(&pmac_backlight_mutex); | 157 | mutex_unlock(&pmac_backlight_mutex); |
diff --git a/arch/powerpc/platforms/powermac/pci.c b/arch/powerpc/platforms/powermac/pci.c index 80035853467b..d524a915aa86 100644 --- a/arch/powerpc/platforms/powermac/pci.c +++ b/arch/powerpc/platforms/powermac/pci.c | |||
@@ -939,9 +939,10 @@ static int __init add_bridge(struct device_node *dev) | |||
939 | disp_name = "Chaos"; | 939 | disp_name = "Chaos"; |
940 | primary = 0; | 940 | primary = 0; |
941 | } | 941 | } |
942 | printk(KERN_INFO "Found %s PCI host bridge at 0x%08lx. " | 942 | printk(KERN_INFO "Found %s PCI host bridge at 0x%016llx. " |
943 | "Firmware bus number: %d->%d\n", | 943 | "Firmware bus number: %d->%d\n", |
944 | disp_name, rsrc.start, hose->first_busno, hose->last_busno); | 944 | disp_name, (unsigned long long)rsrc.start, hose->first_busno, |
945 | hose->last_busno); | ||
945 | #endif /* CONFIG_PPC32 */ | 946 | #endif /* CONFIG_PPC32 */ |
946 | 947 | ||
947 | DBG(" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p\n", | 948 | DBG(" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p\n", |
diff --git a/arch/powerpc/platforms/powermac/pic.c b/arch/powerpc/platforms/powermac/pic.c index 18bf3011d1e3..9f6189af6dd6 100644 --- a/arch/powerpc/platforms/powermac/pic.c +++ b/arch/powerpc/platforms/powermac/pic.c | |||
@@ -446,7 +446,7 @@ static void __init pmac_pic_probe_oldstyle(void) | |||
446 | 446 | ||
447 | /* Set the handler for the main PIC */ | 447 | /* Set the handler for the main PIC */ |
448 | for ( i = 0; i < max_real_irqs ; i++ ) | 448 | for ( i = 0; i < max_real_irqs ; i++ ) |
449 | irq_desc[i].handler = &pmac_pic; | 449 | irq_desc[i].chip = &pmac_pic; |
450 | 450 | ||
451 | /* Get addresses of first controller if we have a node for it */ | 451 | /* Get addresses of first controller if we have a node for it */ |
452 | BUG_ON(of_address_to_resource(master, 0, &r)); | 452 | BUG_ON(of_address_to_resource(master, 0, &r)); |
@@ -493,7 +493,7 @@ static void __init pmac_pic_probe_oldstyle(void) | |||
493 | /* Setup handlers for secondary controller and hook cascade irq*/ | 493 | /* Setup handlers for secondary controller and hook cascade irq*/ |
494 | if (slave) { | 494 | if (slave) { |
495 | for ( i = max_real_irqs ; i < max_irqs ; i++ ) | 495 | for ( i = max_real_irqs ; i < max_irqs ; i++ ) |
496 | irq_desc[i].handler = &gatwick_pic; | 496 | irq_desc[i].chip = &gatwick_pic; |
497 | setup_irq(irq_cascade, &gatwick_cascade_action); | 497 | setup_irq(irq_cascade, &gatwick_cascade_action); |
498 | } | 498 | } |
499 | printk(KERN_INFO "irq: System has %d possible interrupts\n", max_irqs); | 499 | printk(KERN_INFO "irq: System has %d possible interrupts\n", max_irqs); |
diff --git a/arch/powerpc/platforms/powermac/setup.c b/arch/powerpc/platforms/powermac/setup.c index 9cc7db7a8bdc..89c5775f83be 100644 --- a/arch/powerpc/platforms/powermac/setup.c +++ b/arch/powerpc/platforms/powermac/setup.c | |||
@@ -600,13 +600,6 @@ pmac_halt(void) | |||
600 | */ | 600 | */ |
601 | static void __init pmac_init_early(void) | 601 | static void __init pmac_init_early(void) |
602 | { | 602 | { |
603 | #ifdef CONFIG_PPC64 | ||
604 | /* Initialize hash table, from now on, we can take hash faults | ||
605 | * and call ioremap | ||
606 | */ | ||
607 | hpte_init_native(); | ||
608 | #endif | ||
609 | |||
610 | /* Enable early btext debug if requested */ | 603 | /* Enable early btext debug if requested */ |
611 | if (strstr(cmd_line, "btextdbg")) { | 604 | if (strstr(cmd_line, "btextdbg")) { |
612 | udbg_adb_init_early(); | 605 | udbg_adb_init_early(); |
@@ -683,6 +676,8 @@ static int __init pmac_probe(void) | |||
683 | * part of the cacheable linar mapping | 676 | * part of the cacheable linar mapping |
684 | */ | 677 | */ |
685 | alloc_dart_table(); | 678 | alloc_dart_table(); |
679 | |||
680 | hpte_init_native(); | ||
686 | #endif | 681 | #endif |
687 | 682 | ||
688 | #ifdef CONFIG_PPC32 | 683 | #ifdef CONFIG_PPC32 |
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c index d03a8b078f9d..8cfb5706790e 100644 --- a/arch/powerpc/platforms/pseries/iommu.c +++ b/arch/powerpc/platforms/pseries/iommu.c | |||
@@ -92,6 +92,15 @@ static void tce_free_pSeries(struct iommu_table *tbl, long index, long npages) | |||
92 | *(tcep++) = 0; | 92 | *(tcep++) = 0; |
93 | } | 93 | } |
94 | 94 | ||
95 | static unsigned long tce_get_pseries(struct iommu_table *tbl, long index) | ||
96 | { | ||
97 | u64 *tcep; | ||
98 | |||
99 | index <<= TCE_PAGE_FACTOR; | ||
100 | tcep = ((u64 *)tbl->it_base) + index; | ||
101 | |||
102 | return *tcep; | ||
103 | } | ||
95 | 104 | ||
96 | static void tce_build_pSeriesLP(struct iommu_table *tbl, long tcenum, | 105 | static void tce_build_pSeriesLP(struct iommu_table *tbl, long tcenum, |
97 | long npages, unsigned long uaddr, | 106 | long npages, unsigned long uaddr, |
@@ -235,6 +244,25 @@ static void tce_freemulti_pSeriesLP(struct iommu_table *tbl, long tcenum, long n | |||
235 | } | 244 | } |
236 | } | 245 | } |
237 | 246 | ||
247 | static unsigned long tce_get_pSeriesLP(struct iommu_table *tbl, long tcenum) | ||
248 | { | ||
249 | u64 rc; | ||
250 | unsigned long tce_ret; | ||
251 | |||
252 | tcenum <<= TCE_PAGE_FACTOR; | ||
253 | rc = plpar_tce_get((u64)tbl->it_index, (u64)tcenum << 12, &tce_ret); | ||
254 | |||
255 | if (rc && printk_ratelimit()) { | ||
256 | printk("tce_get_pSeriesLP: plpar_tce_get failed. rc=%ld\n", | ||
257 | rc); | ||
258 | printk("\tindex = 0x%lx\n", (u64)tbl->it_index); | ||
259 | printk("\ttcenum = 0x%lx\n", (u64)tcenum); | ||
260 | show_stack(current, (unsigned long *)__get_SP()); | ||
261 | } | ||
262 | |||
263 | return tce_ret; | ||
264 | } | ||
265 | |||
238 | static void iommu_table_setparms(struct pci_controller *phb, | 266 | static void iommu_table_setparms(struct pci_controller *phb, |
239 | struct device_node *dn, | 267 | struct device_node *dn, |
240 | struct iommu_table *tbl) | 268 | struct iommu_table *tbl) |
@@ -254,7 +282,10 @@ static void iommu_table_setparms(struct pci_controller *phb, | |||
254 | } | 282 | } |
255 | 283 | ||
256 | tbl->it_base = (unsigned long)__va(*basep); | 284 | tbl->it_base = (unsigned long)__va(*basep); |
285 | |||
286 | #ifndef CONFIG_CRASH_DUMP | ||
257 | memset((void *)tbl->it_base, 0, *sizep); | 287 | memset((void *)tbl->it_base, 0, *sizep); |
288 | #endif | ||
258 | 289 | ||
259 | tbl->it_busno = phb->bus->number; | 290 | tbl->it_busno = phb->bus->number; |
260 | 291 | ||
@@ -560,11 +591,13 @@ void iommu_init_early_pSeries(void) | |||
560 | ppc_md.tce_build = tce_build_pSeriesLP; | 591 | ppc_md.tce_build = tce_build_pSeriesLP; |
561 | ppc_md.tce_free = tce_free_pSeriesLP; | 592 | ppc_md.tce_free = tce_free_pSeriesLP; |
562 | } | 593 | } |
594 | ppc_md.tce_get = tce_get_pSeriesLP; | ||
563 | ppc_md.iommu_bus_setup = iommu_bus_setup_pSeriesLP; | 595 | ppc_md.iommu_bus_setup = iommu_bus_setup_pSeriesLP; |
564 | ppc_md.iommu_dev_setup = iommu_dev_setup_pSeriesLP; | 596 | ppc_md.iommu_dev_setup = iommu_dev_setup_pSeriesLP; |
565 | } else { | 597 | } else { |
566 | ppc_md.tce_build = tce_build_pSeries; | 598 | ppc_md.tce_build = tce_build_pSeries; |
567 | ppc_md.tce_free = tce_free_pSeries; | 599 | ppc_md.tce_free = tce_free_pSeries; |
600 | ppc_md.tce_get = tce_get_pseries; | ||
568 | ppc_md.iommu_bus_setup = iommu_bus_setup_pSeries; | 601 | ppc_md.iommu_bus_setup = iommu_bus_setup_pSeries; |
569 | ppc_md.iommu_dev_setup = iommu_dev_setup_pSeries; | 602 | ppc_md.iommu_dev_setup = iommu_dev_setup_pSeries; |
570 | } | 603 | } |
diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c index 634b7d06d3cc..27480705996f 100644 --- a/arch/powerpc/platforms/pseries/lpar.c +++ b/arch/powerpc/platforms/pseries/lpar.c | |||
@@ -513,7 +513,7 @@ void pSeries_lpar_flush_hash_range(unsigned long number, int local) | |||
513 | spin_unlock_irqrestore(&pSeries_lpar_tlbie_lock, flags); | 513 | spin_unlock_irqrestore(&pSeries_lpar_tlbie_lock, flags); |
514 | } | 514 | } |
515 | 515 | ||
516 | void hpte_init_lpar(void) | 516 | void __init hpte_init_lpar(void) |
517 | { | 517 | { |
518 | ppc_md.hpte_invalidate = pSeries_lpar_hpte_invalidate; | 518 | ppc_md.hpte_invalidate = pSeries_lpar_hpte_invalidate; |
519 | ppc_md.hpte_updatepp = pSeries_lpar_hpte_updatepp; | 519 | ppc_md.hpte_updatepp = pSeries_lpar_hpte_updatepp; |
@@ -522,6 +522,4 @@ void hpte_init_lpar(void) | |||
522 | ppc_md.hpte_remove = pSeries_lpar_hpte_remove; | 522 | ppc_md.hpte_remove = pSeries_lpar_hpte_remove; |
523 | ppc_md.flush_hash_range = pSeries_lpar_flush_hash_range; | 523 | ppc_md.flush_hash_range = pSeries_lpar_flush_hash_range; |
524 | ppc_md.hpte_clear_all = pSeries_lpar_hptab_clear; | 524 | ppc_md.hpte_clear_all = pSeries_lpar_hptab_clear; |
525 | |||
526 | htab_finish_init(); | ||
527 | } | 525 | } |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 1e28518c6121..b3197ff156c6 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -322,11 +322,6 @@ static void __init pSeries_init_early(void) | |||
322 | DBG(" -> pSeries_init_early()\n"); | 322 | DBG(" -> pSeries_init_early()\n"); |
323 | 323 | ||
324 | fw_feature_init(); | 324 | fw_feature_init(); |
325 | |||
326 | if (firmware_has_feature(FW_FEATURE_LPAR)) | ||
327 | hpte_init_lpar(); | ||
328 | else | ||
329 | hpte_init_native(); | ||
330 | 325 | ||
331 | if (firmware_has_feature(FW_FEATURE_LPAR)) | 326 | if (firmware_has_feature(FW_FEATURE_LPAR)) |
332 | find_udbg_vterm(); | 327 | find_udbg_vterm(); |
@@ -384,6 +379,11 @@ static int __init pSeries_probe_hypertas(unsigned long node, | |||
384 | if (of_get_flat_dt_prop(node, "ibm,hypertas-functions", NULL) != NULL) | 379 | if (of_get_flat_dt_prop(node, "ibm,hypertas-functions", NULL) != NULL) |
385 | powerpc_firmware_features |= FW_FEATURE_LPAR; | 380 | powerpc_firmware_features |= FW_FEATURE_LPAR; |
386 | 381 | ||
382 | if (firmware_has_feature(FW_FEATURE_LPAR)) | ||
383 | hpte_init_lpar(); | ||
384 | else | ||
385 | hpte_init_native(); | ||
386 | |||
387 | return 1; | 387 | return 1; |
388 | } | 388 | } |
389 | 389 | ||
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index b14f9b5c114e..19c03dd43000 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
@@ -238,7 +238,7 @@ static int get_irq_server(unsigned int irq) | |||
238 | { | 238 | { |
239 | unsigned int server; | 239 | unsigned int server; |
240 | /* For the moment only implement delivery to all cpus or one cpu */ | 240 | /* For the moment only implement delivery to all cpus or one cpu */ |
241 | cpumask_t cpumask = irq_affinity[irq]; | 241 | cpumask_t cpumask = irq_desc[irq].affinity; |
242 | cpumask_t tmp = CPU_MASK_NONE; | 242 | cpumask_t tmp = CPU_MASK_NONE; |
243 | 243 | ||
244 | if (!distribute_irqs) | 244 | if (!distribute_irqs) |
@@ -558,7 +558,7 @@ nextnode: | |||
558 | } | 558 | } |
559 | 559 | ||
560 | for (i = irq_offset_value(); i < NR_IRQS; ++i) | 560 | for (i = irq_offset_value(); i < NR_IRQS; ++i) |
561 | get_irq_desc(i)->handler = &xics_pic; | 561 | get_irq_desc(i)->chip = &xics_pic; |
562 | 562 | ||
563 | xics_setup_cpu(); | 563 | xics_setup_cpu(); |
564 | 564 | ||
@@ -701,9 +701,9 @@ void xics_migrate_irqs_away(void) | |||
701 | continue; | 701 | continue; |
702 | 702 | ||
703 | /* We only need to migrate enabled IRQS */ | 703 | /* We only need to migrate enabled IRQS */ |
704 | if (desc == NULL || desc->handler == NULL | 704 | if (desc == NULL || desc->chip == NULL |
705 | || desc->action == NULL | 705 | || desc->action == NULL |
706 | || desc->handler->set_affinity == NULL) | 706 | || desc->chip->set_affinity == NULL) |
707 | continue; | 707 | continue; |
708 | 708 | ||
709 | spin_lock_irqsave(&desc->lock, flags); | 709 | spin_lock_irqsave(&desc->lock, flags); |
@@ -728,8 +728,8 @@ void xics_migrate_irqs_away(void) | |||
728 | virq, cpu); | 728 | virq, cpu); |
729 | 729 | ||
730 | /* Reset affinity to all cpus */ | 730 | /* Reset affinity to all cpus */ |
731 | desc->handler->set_affinity(virq, CPU_MASK_ALL); | 731 | desc->chip->set_affinity(virq, CPU_MASK_ALL); |
732 | irq_affinity[virq] = CPU_MASK_ALL; | 732 | irq_desc[irq].affinity = CPU_MASK_ALL; |
733 | unlock: | 733 | unlock: |
734 | spin_unlock_irqrestore(&desc->lock, flags); | 734 | spin_unlock_irqrestore(&desc->lock, flags); |
735 | } | 735 | } |
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile index cef95b023730..054bd8b41ef5 100644 --- a/arch/powerpc/sysdev/Makefile +++ b/arch/powerpc/sysdev/Makefile | |||
@@ -12,3 +12,5 @@ obj-$(CONFIG_U3_DART) += dart_iommu.o | |||
12 | obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o | 12 | obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o |
13 | obj-$(CONFIG_PPC_83xx) += ipic.o | 13 | obj-$(CONFIG_PPC_83xx) += ipic.o |
14 | obj-$(CONFIG_FSL_SOC) += fsl_soc.o | 14 | obj-$(CONFIG_FSL_SOC) += fsl_soc.o |
15 | obj-$(CONFIG_PPC_TODC) += todc.o | ||
16 | obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o | ||
diff --git a/arch/powerpc/sysdev/dart.h b/arch/powerpc/sysdev/dart.h index c2d05763ccbe..1c8817c4835e 100644 --- a/arch/powerpc/sysdev/dart.h +++ b/arch/powerpc/sysdev/dart.h | |||
@@ -47,8 +47,12 @@ | |||
47 | /* U4 registers */ | 47 | /* U4 registers */ |
48 | #define DART_BASE_U4_BASE_MASK 0xffffff | 48 | #define DART_BASE_U4_BASE_MASK 0xffffff |
49 | #define DART_BASE_U4_BASE_SHIFT 0 | 49 | #define DART_BASE_U4_BASE_SHIFT 0 |
50 | #define DART_CNTL_U4_FLUSHTLB 0x20000000 | ||
51 | #define DART_CNTL_U4_ENABLE 0x80000000 | 50 | #define DART_CNTL_U4_ENABLE 0x80000000 |
51 | #define DART_CNTL_U4_IONE 0x40000000 | ||
52 | #define DART_CNTL_U4_FLUSHTLB 0x20000000 | ||
53 | #define DART_CNTL_U4_IDLE 0x10000000 | ||
54 | #define DART_CNTL_U4_PAR_EN 0x08000000 | ||
55 | #define DART_CNTL_U4_IONE_MASK 0x07ffffff | ||
52 | #define DART_SIZE_U4_SIZE_MASK 0x1fff | 56 | #define DART_SIZE_U4_SIZE_MASK 0x1fff |
53 | #define DART_SIZE_U4_SIZE_SHIFT 0 | 57 | #define DART_SIZE_U4_SIZE_SHIFT 0 |
54 | 58 | ||
diff --git a/arch/powerpc/sysdev/dart_iommu.c b/arch/powerpc/sysdev/dart_iommu.c index 6232091cc72b..7c7f34ce4986 100644 --- a/arch/powerpc/sysdev/dart_iommu.c +++ b/arch/powerpc/sysdev/dart_iommu.c | |||
@@ -101,8 +101,8 @@ retry: | |||
101 | if (l == (1L << limit)) { | 101 | if (l == (1L << limit)) { |
102 | if (limit < 4) { | 102 | if (limit < 4) { |
103 | limit++; | 103 | limit++; |
104 | reg = DART_IN(DART_CNTL); | 104 | reg = DART_IN(DART_CNTL); |
105 | reg &= ~inv_bit; | 105 | reg &= ~inv_bit; |
106 | DART_OUT(DART_CNTL, reg); | 106 | DART_OUT(DART_CNTL, reg); |
107 | goto retry; | 107 | goto retry; |
108 | } else | 108 | } else |
@@ -111,11 +111,39 @@ retry: | |||
111 | } | 111 | } |
112 | } | 112 | } |
113 | 113 | ||
114 | static inline void dart_tlb_invalidate_one(unsigned long bus_rpn) | ||
115 | { | ||
116 | unsigned int reg; | ||
117 | unsigned int l, limit; | ||
118 | |||
119 | reg = DART_CNTL_U4_ENABLE | DART_CNTL_U4_IONE | | ||
120 | (bus_rpn & DART_CNTL_U4_IONE_MASK); | ||
121 | DART_OUT(DART_CNTL, reg); | ||
122 | |||
123 | limit = 0; | ||
124 | wait_more: | ||
125 | l = 0; | ||
126 | while ((DART_IN(DART_CNTL) & DART_CNTL_U4_IONE) && l < (1L << limit)) { | ||
127 | rmb(); | ||
128 | l++; | ||
129 | } | ||
130 | |||
131 | if (l == (1L << limit)) { | ||
132 | if (limit < 4) { | ||
133 | limit++; | ||
134 | goto wait_more; | ||
135 | } else | ||
136 | panic("DART: TLB did not flush after waiting a long " | ||
137 | "time. Buggy U4 ?"); | ||
138 | } | ||
139 | } | ||
140 | |||
114 | static void dart_flush(struct iommu_table *tbl) | 141 | static void dart_flush(struct iommu_table *tbl) |
115 | { | 142 | { |
116 | if (dart_dirty) | 143 | if (dart_dirty) { |
117 | dart_tlb_invalidate_all(); | 144 | dart_tlb_invalidate_all(); |
118 | dart_dirty = 0; | 145 | dart_dirty = 0; |
146 | } | ||
119 | } | 147 | } |
120 | 148 | ||
121 | static void dart_build(struct iommu_table *tbl, long index, | 149 | static void dart_build(struct iommu_table *tbl, long index, |
@@ -124,6 +152,7 @@ static void dart_build(struct iommu_table *tbl, long index, | |||
124 | { | 152 | { |
125 | unsigned int *dp; | 153 | unsigned int *dp; |
126 | unsigned int rpn; | 154 | unsigned int rpn; |
155 | long l; | ||
127 | 156 | ||
128 | DBG("dart: build at: %lx, %lx, addr: %x\n", index, npages, uaddr); | 157 | DBG("dart: build at: %lx, %lx, addr: %x\n", index, npages, uaddr); |
129 | 158 | ||
@@ -135,7 +164,8 @@ static void dart_build(struct iommu_table *tbl, long index, | |||
135 | /* On U3, all memory is contigous, so we can move this | 164 | /* On U3, all memory is contigous, so we can move this |
136 | * out of the loop. | 165 | * out of the loop. |
137 | */ | 166 | */ |
138 | while (npages--) { | 167 | l = npages; |
168 | while (l--) { | ||
139 | rpn = virt_to_abs(uaddr) >> DART_PAGE_SHIFT; | 169 | rpn = virt_to_abs(uaddr) >> DART_PAGE_SHIFT; |
140 | 170 | ||
141 | *(dp++) = DARTMAP_VALID | (rpn & DARTMAP_RPNMASK); | 171 | *(dp++) = DARTMAP_VALID | (rpn & DARTMAP_RPNMASK); |
@@ -143,7 +173,14 @@ static void dart_build(struct iommu_table *tbl, long index, | |||
143 | uaddr += DART_PAGE_SIZE; | 173 | uaddr += DART_PAGE_SIZE; |
144 | } | 174 | } |
145 | 175 | ||
146 | dart_dirty = 1; | 176 | if (dart_is_u4) { |
177 | rpn = index; | ||
178 | mb(); /* make sure all updates have reached memory */ | ||
179 | while (npages--) | ||
180 | dart_tlb_invalidate_one(rpn++); | ||
181 | } else { | ||
182 | dart_dirty = 1; | ||
183 | } | ||
147 | } | 184 | } |
148 | 185 | ||
149 | 186 | ||
diff --git a/arch/powerpc/sysdev/i8259.c b/arch/powerpc/sysdev/i8259.c index b7ac32fdd776..2bff30f6d635 100644 --- a/arch/powerpc/sysdev/i8259.c +++ b/arch/powerpc/sysdev/i8259.c | |||
@@ -208,7 +208,7 @@ void __init i8259_init(unsigned long intack_addr, int offset) | |||
208 | spin_unlock_irqrestore(&i8259_lock, flags); | 208 | spin_unlock_irqrestore(&i8259_lock, flags); |
209 | 209 | ||
210 | for (i = 0; i < NUM_ISA_INTERRUPTS; ++i) | 210 | for (i = 0; i < NUM_ISA_INTERRUPTS; ++i) |
211 | irq_desc[offset + i].handler = &i8259_pic; | 211 | irq_desc[offset + i].chip = &i8259_pic; |
212 | 212 | ||
213 | /* reserve our resources */ | 213 | /* reserve our resources */ |
214 | setup_irq(offset + 2, &i8259_irqaction); | 214 | setup_irq(offset + 2, &i8259_irqaction); |
diff --git a/arch/powerpc/sysdev/ipic.c b/arch/powerpc/sysdev/ipic.c index 8f01e0f1d847..46801f5ec03f 100644 --- a/arch/powerpc/sysdev/ipic.c +++ b/arch/powerpc/sysdev/ipic.c | |||
@@ -472,7 +472,7 @@ void __init ipic_init(phys_addr_t phys_addr, | |||
472 | ipic_write(primary_ipic->regs, IPIC_SEMSR, temp); | 472 | ipic_write(primary_ipic->regs, IPIC_SEMSR, temp); |
473 | 473 | ||
474 | for (i = 0 ; i < NR_IPIC_INTS ; i++) { | 474 | for (i = 0 ; i < NR_IPIC_INTS ; i++) { |
475 | irq_desc[i+irq_offset].handler = &ipic; | 475 | irq_desc[i+irq_offset].chip = &ipic; |
476 | irq_desc[i+irq_offset].status = IRQ_LEVEL; | 476 | irq_desc[i+irq_offset].status = IRQ_LEVEL; |
477 | } | 477 | } |
478 | 478 | ||
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index bffe50d02c99..28df9c827ca6 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c | |||
@@ -379,14 +379,14 @@ static inline u32 mpic_physmask(u32 cpumask) | |||
379 | /* Get the mpic structure from the IPI number */ | 379 | /* Get the mpic structure from the IPI number */ |
380 | static inline struct mpic * mpic_from_ipi(unsigned int ipi) | 380 | static inline struct mpic * mpic_from_ipi(unsigned int ipi) |
381 | { | 381 | { |
382 | return container_of(irq_desc[ipi].handler, struct mpic, hc_ipi); | 382 | return container_of(irq_desc[ipi].chip, struct mpic, hc_ipi); |
383 | } | 383 | } |
384 | #endif | 384 | #endif |
385 | 385 | ||
386 | /* Get the mpic structure from the irq number */ | 386 | /* Get the mpic structure from the irq number */ |
387 | static inline struct mpic * mpic_from_irq(unsigned int irq) | 387 | static inline struct mpic * mpic_from_irq(unsigned int irq) |
388 | { | 388 | { |
389 | return container_of(irq_desc[irq].handler, struct mpic, hc_irq); | 389 | return container_of(irq_desc[irq].chip, struct mpic, hc_irq); |
390 | } | 390 | } |
391 | 391 | ||
392 | /* Send an EOI */ | 392 | /* Send an EOI */ |
@@ -752,7 +752,7 @@ void __init mpic_init(struct mpic *mpic) | |||
752 | if (!(mpic->flags & MPIC_PRIMARY)) | 752 | if (!(mpic->flags & MPIC_PRIMARY)) |
753 | continue; | 753 | continue; |
754 | irq_desc[mpic->ipi_offset+i].status |= IRQ_PER_CPU; | 754 | irq_desc[mpic->ipi_offset+i].status |= IRQ_PER_CPU; |
755 | irq_desc[mpic->ipi_offset+i].handler = &mpic->hc_ipi; | 755 | irq_desc[mpic->ipi_offset+i].chip = &mpic->hc_ipi; |
756 | #endif /* CONFIG_SMP */ | 756 | #endif /* CONFIG_SMP */ |
757 | } | 757 | } |
758 | 758 | ||
@@ -813,7 +813,7 @@ void __init mpic_init(struct mpic *mpic) | |||
813 | /* init linux descriptors */ | 813 | /* init linux descriptors */ |
814 | if (i < mpic->irq_count) { | 814 | if (i < mpic->irq_count) { |
815 | irq_desc[mpic->irq_offset+i].status = level ? IRQ_LEVEL : 0; | 815 | irq_desc[mpic->irq_offset+i].status = level ? IRQ_LEVEL : 0; |
816 | irq_desc[mpic->irq_offset+i].handler = &mpic->hc_irq; | 816 | irq_desc[mpic->irq_offset+i].chip = &mpic->hc_irq; |
817 | } | 817 | } |
818 | } | 818 | } |
819 | 819 | ||
@@ -906,7 +906,7 @@ void mpic_setup_this_cpu(void) | |||
906 | /* let the mpic know we want intrs. default affinity is 0xffffffff | 906 | /* let the mpic know we want intrs. default affinity is 0xffffffff |
907 | * until changed via /proc. That's how it's done on x86. If we want | 907 | * until changed via /proc. That's how it's done on x86. If we want |
908 | * it differently, then we should make sure we also change the default | 908 | * it differently, then we should make sure we also change the default |
909 | * values of irq_affinity in irq.c. | 909 | * values of irq_desc[].affinity in irq.c. |
910 | */ | 910 | */ |
911 | if (distribute_irqs) { | 911 | if (distribute_irqs) { |
912 | for (i = 0; i < mpic->num_sources ; i++) | 912 | for (i = 0; i < mpic->num_sources ; i++) |
diff --git a/arch/powerpc/sysdev/todc.c b/arch/powerpc/sysdev/todc.c new file mode 100644 index 000000000000..0a65980efb50 --- /dev/null +++ b/arch/powerpc/sysdev/todc.c | |||
@@ -0,0 +1,392 @@ | |||
1 | /* | ||
2 | * Time of Day Clock support for the M48T35, M48T37, M48T59, and MC146818 | ||
3 | * Real Time Clocks/Timekeepers. | ||
4 | * | ||
5 | * Author: Mark A. Greer <mgreer@mvista.com> | ||
6 | * | ||
7 | * 2001-2004 (c) MontaVista, Software, Inc. This file is licensed under | ||
8 | * the terms of the GNU General Public License version 2. This program | ||
9 | * is licensed "as is" without any warranty of any kind, whether express | ||
10 | * or implied. | ||
11 | */ | ||
12 | #include <linux/errno.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/time.h> | ||
16 | #include <linux/timex.h> | ||
17 | #include <linux/bcd.h> | ||
18 | #include <linux/mc146818rtc.h> | ||
19 | |||
20 | #include <asm/machdep.h> | ||
21 | #include <asm/io.h> | ||
22 | #include <asm/time.h> | ||
23 | #include <asm/todc.h> | ||
24 | |||
25 | /* | ||
26 | * Depending on the hardware on your board and your board design, the | ||
27 | * RTC/NVRAM may be accessed either directly (like normal memory) or via | ||
28 | * address/data registers. If your board uses the direct method, set | ||
29 | * 'nvram_data' to the base address of your nvram and leave 'nvram_as0' and | ||
30 | * 'nvram_as1' NULL. If your board uses address/data regs to access nvram, | ||
31 | * set 'nvram_as0' to the address of the lower byte, set 'nvram_as1' to the | ||
32 | * address of the upper byte (leave NULL if using mc146818), and set | ||
33 | * 'nvram_data' to the address of the 8-bit data register. | ||
34 | * | ||
35 | * Note: Even though the documentation for the various RTC chips say that it | ||
36 | * take up to a second before it starts updating once the 'R' bit is | ||
37 | * cleared, they always seem to update even though we bang on it many | ||
38 | * times a second. This is true, except for the Dallas Semi 1746/1747 | ||
39 | * (possibly others). Those chips seem to have a real problem whenever | ||
40 | * we set the 'R' bit before reading them, they basically stop counting. | ||
41 | * --MAG | ||
42 | */ | ||
43 | |||
44 | /* | ||
45 | * 'todc_info' should be initialized in your *_setup.c file to | ||
46 | * point to a fully initialized 'todc_info_t' structure. | ||
47 | * This structure holds all the register offsets for your particular | ||
48 | * TODC/RTC chip. | ||
49 | * TODC_ALLOC()/TODC_INIT() will allocate and initialize this table for you. | ||
50 | */ | ||
51 | |||
52 | #ifdef RTC_FREQ_SELECT | ||
53 | #undef RTC_FREQ_SELECT | ||
54 | #define RTC_FREQ_SELECT control_b /* Register A */ | ||
55 | #endif | ||
56 | |||
57 | #ifdef RTC_CONTROL | ||
58 | #undef RTC_CONTROL | ||
59 | #define RTC_CONTROL control_a /* Register B */ | ||
60 | #endif | ||
61 | |||
62 | #ifdef RTC_INTR_FLAGS | ||
63 | #undef RTC_INTR_FLAGS | ||
64 | #define RTC_INTR_FLAGS watchdog /* Register C */ | ||
65 | #endif | ||
66 | |||
67 | #ifdef RTC_VALID | ||
68 | #undef RTC_VALID | ||
69 | #define RTC_VALID interrupts /* Register D */ | ||
70 | #endif | ||
71 | |||
72 | /* Access routines when RTC accessed directly (like normal memory) */ | ||
73 | u_char | ||
74 | todc_direct_read_val(int addr) | ||
75 | { | ||
76 | return readb((void __iomem *)(todc_info->nvram_data + addr)); | ||
77 | } | ||
78 | |||
79 | void | ||
80 | todc_direct_write_val(int addr, unsigned char val) | ||
81 | { | ||
82 | writeb(val, (void __iomem *)(todc_info->nvram_data + addr)); | ||
83 | return; | ||
84 | } | ||
85 | |||
86 | /* Access routines for accessing m48txx type chips via addr/data regs */ | ||
87 | u_char | ||
88 | todc_m48txx_read_val(int addr) | ||
89 | { | ||
90 | outb(addr, todc_info->nvram_as0); | ||
91 | outb(addr>>todc_info->as0_bits, todc_info->nvram_as1); | ||
92 | return inb(todc_info->nvram_data); | ||
93 | } | ||
94 | |||
95 | void | ||
96 | todc_m48txx_write_val(int addr, unsigned char val) | ||
97 | { | ||
98 | outb(addr, todc_info->nvram_as0); | ||
99 | outb(addr>>todc_info->as0_bits, todc_info->nvram_as1); | ||
100 | outb(val, todc_info->nvram_data); | ||
101 | return; | ||
102 | } | ||
103 | |||
104 | /* Access routines for accessing mc146818 type chips via addr/data regs */ | ||
105 | u_char | ||
106 | todc_mc146818_read_val(int addr) | ||
107 | { | ||
108 | outb_p(addr, todc_info->nvram_as0); | ||
109 | return inb_p(todc_info->nvram_data); | ||
110 | } | ||
111 | |||
112 | void | ||
113 | todc_mc146818_write_val(int addr, unsigned char val) | ||
114 | { | ||
115 | outb_p(addr, todc_info->nvram_as0); | ||
116 | outb_p(val, todc_info->nvram_data); | ||
117 | } | ||
118 | |||
119 | |||
120 | /* | ||
121 | * Routines to make RTC chips with NVRAM buried behind an addr/data pair | ||
122 | * have the NVRAM and clock regs appear at the same level. | ||
123 | * The NVRAM will appear to start at addr 0 and the clock regs will appear | ||
124 | * to start immediately after the NVRAM (actually, start at offset | ||
125 | * todc_info->nvram_size). | ||
126 | */ | ||
127 | static inline u_char | ||
128 | todc_read_val(int addr) | ||
129 | { | ||
130 | u_char val; | ||
131 | |||
132 | if (todc_info->sw_flags & TODC_FLAG_2_LEVEL_NVRAM) { | ||
133 | if (addr < todc_info->nvram_size) { /* NVRAM */ | ||
134 | ppc_md.rtc_write_val(todc_info->nvram_addr_reg, addr); | ||
135 | val = ppc_md.rtc_read_val(todc_info->nvram_data_reg); | ||
136 | } else { /* Clock Reg */ | ||
137 | addr -= todc_info->nvram_size; | ||
138 | val = ppc_md.rtc_read_val(addr); | ||
139 | } | ||
140 | } else | ||
141 | val = ppc_md.rtc_read_val(addr); | ||
142 | |||
143 | return val; | ||
144 | } | ||
145 | |||
146 | static inline void | ||
147 | todc_write_val(int addr, u_char val) | ||
148 | { | ||
149 | if (todc_info->sw_flags & TODC_FLAG_2_LEVEL_NVRAM) { | ||
150 | if (addr < todc_info->nvram_size) { /* NVRAM */ | ||
151 | ppc_md.rtc_write_val(todc_info->nvram_addr_reg, addr); | ||
152 | ppc_md.rtc_write_val(todc_info->nvram_data_reg, val); | ||
153 | } else { /* Clock Reg */ | ||
154 | addr -= todc_info->nvram_size; | ||
155 | ppc_md.rtc_write_val(addr, val); | ||
156 | } | ||
157 | } else | ||
158 | ppc_md.rtc_write_val(addr, val); | ||
159 | } | ||
160 | |||
161 | /* | ||
162 | * TODC routines | ||
163 | * | ||
164 | * There is some ugly stuff in that there are assumptions for the mc146818. | ||
165 | * | ||
166 | * Assumptions: | ||
167 | * - todc_info->control_a has the offset as mc146818 Register B reg | ||
168 | * - todc_info->control_b has the offset as mc146818 Register A reg | ||
169 | * - m48txx control reg's write enable or 'W' bit is same as | ||
170 | * mc146818 Register B 'SET' bit (i.e., 0x80) | ||
171 | * | ||
172 | * These assumptions were made to make the code simpler. | ||
173 | */ | ||
174 | long __init | ||
175 | todc_time_init(void) | ||
176 | { | ||
177 | u_char cntl_b; | ||
178 | |||
179 | if (!ppc_md.rtc_read_val) | ||
180 | ppc_md.rtc_read_val = ppc_md.nvram_read_val; | ||
181 | if (!ppc_md.rtc_write_val) | ||
182 | ppc_md.rtc_write_val = ppc_md.nvram_write_val; | ||
183 | |||
184 | cntl_b = todc_read_val(todc_info->control_b); | ||
185 | |||
186 | if (todc_info->rtc_type == TODC_TYPE_MC146818) { | ||
187 | if ((cntl_b & 0x70) != 0x20) { | ||
188 | printk(KERN_INFO "TODC real-time-clock was stopped." | ||
189 | " Now starting..."); | ||
190 | cntl_b &= ~0x70; | ||
191 | cntl_b |= 0x20; | ||
192 | } | ||
193 | |||
194 | todc_write_val(todc_info->control_b, cntl_b); | ||
195 | } else if (todc_info->rtc_type == TODC_TYPE_DS17285) { | ||
196 | u_char mode; | ||
197 | |||
198 | mode = todc_read_val(TODC_TYPE_DS17285_CNTL_A); | ||
199 | /* Make sure countdown clear is not set */ | ||
200 | mode &= ~0x40; | ||
201 | /* Enable oscillator, extended register set */ | ||
202 | mode |= 0x30; | ||
203 | todc_write_val(TODC_TYPE_DS17285_CNTL_A, mode); | ||
204 | |||
205 | } else if (todc_info->rtc_type == TODC_TYPE_DS1501) { | ||
206 | u_char month; | ||
207 | |||
208 | todc_info->enable_read = TODC_DS1501_CNTL_B_TE; | ||
209 | todc_info->enable_write = TODC_DS1501_CNTL_B_TE; | ||
210 | |||
211 | month = todc_read_val(todc_info->month); | ||
212 | |||
213 | if ((month & 0x80) == 0x80) { | ||
214 | printk(KERN_INFO "TODC %s %s\n", | ||
215 | "real-time-clock was stopped.", | ||
216 | "Now starting..."); | ||
217 | month &= ~0x80; | ||
218 | todc_write_val(todc_info->month, month); | ||
219 | } | ||
220 | |||
221 | cntl_b &= ~TODC_DS1501_CNTL_B_TE; | ||
222 | todc_write_val(todc_info->control_b, cntl_b); | ||
223 | } else { /* must be a m48txx type */ | ||
224 | u_char cntl_a; | ||
225 | |||
226 | todc_info->enable_read = TODC_MK48TXX_CNTL_A_R; | ||
227 | todc_info->enable_write = TODC_MK48TXX_CNTL_A_W; | ||
228 | |||
229 | cntl_a = todc_read_val(todc_info->control_a); | ||
230 | |||
231 | /* Check & clear STOP bit in control B register */ | ||
232 | if (cntl_b & TODC_MK48TXX_DAY_CB) { | ||
233 | printk(KERN_INFO "TODC %s %s\n", | ||
234 | "real-time-clock was stopped.", | ||
235 | "Now starting..."); | ||
236 | |||
237 | cntl_a |= todc_info->enable_write; | ||
238 | cntl_b &= ~TODC_MK48TXX_DAY_CB;/* Start Oscil */ | ||
239 | |||
240 | todc_write_val(todc_info->control_a, cntl_a); | ||
241 | todc_write_val(todc_info->control_b, cntl_b); | ||
242 | } | ||
243 | |||
244 | /* Make sure READ & WRITE bits are cleared. */ | ||
245 | cntl_a &= ~(todc_info->enable_write | todc_info->enable_read); | ||
246 | todc_write_val(todc_info->control_a, cntl_a); | ||
247 | } | ||
248 | |||
249 | return 0; | ||
250 | } | ||
251 | |||
252 | /* | ||
253 | * There is some ugly stuff in that there are assumptions that for a mc146818, | ||
254 | * the todc_info->control_a has the offset of the mc146818 Register B reg and | ||
255 | * that the register'ss 'SET' bit is the same as the m48txx's write enable | ||
256 | * bit in the control register of the m48txx (i.e., 0x80). | ||
257 | * | ||
258 | * It was done to make the code look simpler. | ||
259 | */ | ||
260 | void | ||
261 | todc_get_rtc_time(struct rtc_time *tm) | ||
262 | { | ||
263 | uint year = 0, mon = 0, mday = 0, hour = 0, min = 0, sec = 0; | ||
264 | uint limit, i; | ||
265 | u_char save_control, uip = 0; | ||
266 | extern void GregorianDay(struct rtc_time *); | ||
267 | |||
268 | spin_lock(&rtc_lock); | ||
269 | save_control = todc_read_val(todc_info->control_a); | ||
270 | |||
271 | if (todc_info->rtc_type != TODC_TYPE_MC146818) { | ||
272 | limit = 1; | ||
273 | |||
274 | switch (todc_info->rtc_type) { | ||
275 | case TODC_TYPE_DS1553: | ||
276 | case TODC_TYPE_DS1557: | ||
277 | case TODC_TYPE_DS1743: | ||
278 | case TODC_TYPE_DS1746: /* XXXX BAD HACK -> FIX */ | ||
279 | case TODC_TYPE_DS1747: | ||
280 | case TODC_TYPE_DS17285: | ||
281 | break; | ||
282 | default: | ||
283 | todc_write_val(todc_info->control_a, | ||
284 | (save_control | todc_info->enable_read)); | ||
285 | } | ||
286 | } else | ||
287 | limit = 100000000; | ||
288 | |||
289 | for (i=0; i<limit; i++) { | ||
290 | if (todc_info->rtc_type == TODC_TYPE_MC146818) | ||
291 | uip = todc_read_val(todc_info->RTC_FREQ_SELECT); | ||
292 | |||
293 | sec = todc_read_val(todc_info->seconds) & 0x7f; | ||
294 | min = todc_read_val(todc_info->minutes) & 0x7f; | ||
295 | hour = todc_read_val(todc_info->hours) & 0x3f; | ||
296 | mday = todc_read_val(todc_info->day_of_month) & 0x3f; | ||
297 | mon = todc_read_val(todc_info->month) & 0x1f; | ||
298 | year = todc_read_val(todc_info->year) & 0xff; | ||
299 | |||
300 | if (todc_info->rtc_type == TODC_TYPE_MC146818) { | ||
301 | uip |= todc_read_val(todc_info->RTC_FREQ_SELECT); | ||
302 | if ((uip & RTC_UIP) == 0) | ||
303 | break; | ||
304 | } | ||
305 | } | ||
306 | |||
307 | if (todc_info->rtc_type != TODC_TYPE_MC146818) { | ||
308 | switch (todc_info->rtc_type) { | ||
309 | case TODC_TYPE_DS1553: | ||
310 | case TODC_TYPE_DS1557: | ||
311 | case TODC_TYPE_DS1743: | ||
312 | case TODC_TYPE_DS1746: /* XXXX BAD HACK -> FIX */ | ||
313 | case TODC_TYPE_DS1747: | ||
314 | case TODC_TYPE_DS17285: | ||
315 | break; | ||
316 | default: | ||
317 | save_control &= ~(todc_info->enable_read); | ||
318 | todc_write_val(todc_info->control_a, save_control); | ||
319 | } | ||
320 | } | ||
321 | spin_unlock(&rtc_lock); | ||
322 | |||
323 | if ((todc_info->rtc_type != TODC_TYPE_MC146818) | ||
324 | || ((save_control & RTC_DM_BINARY) == 0) | ||
325 | || RTC_ALWAYS_BCD) { | ||
326 | BCD_TO_BIN(sec); | ||
327 | BCD_TO_BIN(min); | ||
328 | BCD_TO_BIN(hour); | ||
329 | BCD_TO_BIN(mday); | ||
330 | BCD_TO_BIN(mon); | ||
331 | BCD_TO_BIN(year); | ||
332 | } | ||
333 | |||
334 | if ((year + 1900) < 1970) { | ||
335 | year += 100; | ||
336 | } | ||
337 | |||
338 | tm->tm_sec = sec; | ||
339 | tm->tm_min = min; | ||
340 | tm->tm_hour = hour; | ||
341 | tm->tm_mday = mday; | ||
342 | tm->tm_mon = mon; | ||
343 | tm->tm_year = year; | ||
344 | |||
345 | GregorianDay(tm); | ||
346 | } | ||
347 | |||
348 | int | ||
349 | todc_set_rtc_time(struct rtc_time *tm) | ||
350 | { | ||
351 | u_char save_control, save_freq_select = 0; | ||
352 | |||
353 | spin_lock(&rtc_lock); | ||
354 | save_control = todc_read_val(todc_info->control_a); | ||
355 | |||
356 | /* Assuming MK48T59_RTC_CA_WRITE & RTC_SET are equal */ | ||
357 | todc_write_val(todc_info->control_a, | ||
358 | (save_control | todc_info->enable_write)); | ||
359 | save_control &= ~(todc_info->enable_write); /* in case it was set */ | ||
360 | |||
361 | if (todc_info->rtc_type == TODC_TYPE_MC146818) { | ||
362 | save_freq_select = todc_read_val(todc_info->RTC_FREQ_SELECT); | ||
363 | todc_write_val(todc_info->RTC_FREQ_SELECT, | ||
364 | save_freq_select | RTC_DIV_RESET2); | ||
365 | } | ||
366 | |||
367 | if ((todc_info->rtc_type != TODC_TYPE_MC146818) | ||
368 | || ((save_control & RTC_DM_BINARY) == 0) | ||
369 | || RTC_ALWAYS_BCD) { | ||
370 | BIN_TO_BCD(tm->tm_sec); | ||
371 | BIN_TO_BCD(tm->tm_min); | ||
372 | BIN_TO_BCD(tm->tm_hour); | ||
373 | BIN_TO_BCD(tm->tm_mon); | ||
374 | BIN_TO_BCD(tm->tm_mday); | ||
375 | BIN_TO_BCD(tm->tm_year); | ||
376 | } | ||
377 | |||
378 | todc_write_val(todc_info->seconds, tm->tm_sec); | ||
379 | todc_write_val(todc_info->minutes, tm->tm_min); | ||
380 | todc_write_val(todc_info->hours, tm->tm_hour); | ||
381 | todc_write_val(todc_info->month, tm->tm_mon); | ||
382 | todc_write_val(todc_info->day_of_month, tm->tm_mday); | ||
383 | todc_write_val(todc_info->year, tm->tm_year); | ||
384 | |||
385 | todc_write_val(todc_info->control_a, save_control); | ||
386 | |||
387 | if (todc_info->rtc_type == TODC_TYPE_MC146818) | ||
388 | todc_write_val(todc_info->RTC_FREQ_SELECT, save_freq_select); | ||
389 | |||
390 | spin_unlock(&rtc_lock); | ||
391 | return 0; | ||
392 | } | ||
diff --git a/arch/powerpc/sysdev/tsi108_dev.c b/arch/powerpc/sysdev/tsi108_dev.c new file mode 100644 index 000000000000..26a0cc820cde --- /dev/null +++ b/arch/powerpc/sysdev/tsi108_dev.c | |||
@@ -0,0 +1,145 @@ | |||
1 | /* | ||
2 | * tsi108/109 device setup code | ||
3 | * | ||
4 | * Maintained by Roy Zang < tie-fei.zang@freescale.com > | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the | ||
8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
9 | * option) any later version. | ||
10 | */ | ||
11 | |||
12 | #include <linux/config.h> | ||
13 | #include <linux/stddef.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/errno.h> | ||
17 | #include <linux/major.h> | ||
18 | #include <linux/delay.h> | ||
19 | #include <linux/irq.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/device.h> | ||
22 | #include <linux/platform_device.h> | ||
23 | #include <asm/tsi108.h> | ||
24 | |||
25 | #include <asm/system.h> | ||
26 | #include <asm/atomic.h> | ||
27 | #include <asm/io.h> | ||
28 | #include <asm/irq.h> | ||
29 | #include <asm/prom.h> | ||
30 | #include <mm/mmu_decl.h> | ||
31 | |||
32 | #undef DEBUG | ||
33 | |||
34 | #ifdef DEBUG | ||
35 | #define DBG(fmt...) do { printk(fmt); } while(0) | ||
36 | #else | ||
37 | #define DBG(fmt...) do { } while(0) | ||
38 | #endif | ||
39 | |||
40 | static phys_addr_t tsi108_csr_base = -1; | ||
41 | |||
42 | phys_addr_t get_csrbase(void) | ||
43 | { | ||
44 | struct device_node *tsi; | ||
45 | |||
46 | if (tsi108_csr_base != -1) | ||
47 | return tsi108_csr_base; | ||
48 | |||
49 | tsi = of_find_node_by_type(NULL, "tsi-bridge"); | ||
50 | if (tsi) { | ||
51 | unsigned int size; | ||
52 | void *prop = get_property(tsi, "reg", &size); | ||
53 | tsi108_csr_base = of_translate_address(tsi, prop); | ||
54 | of_node_put(tsi); | ||
55 | }; | ||
56 | return tsi108_csr_base; | ||
57 | } | ||
58 | |||
59 | u32 get_vir_csrbase(void) | ||
60 | { | ||
61 | return (u32) (ioremap(get_csrbase(), 0x10000)); | ||
62 | } | ||
63 | |||
64 | EXPORT_SYMBOL(get_csrbase); | ||
65 | EXPORT_SYMBOL(get_vir_csrbase); | ||
66 | |||
67 | static int __init tsi108_eth_of_init(void) | ||
68 | { | ||
69 | struct device_node *np; | ||
70 | unsigned int i; | ||
71 | struct platform_device *tsi_eth_dev; | ||
72 | struct resource res; | ||
73 | int ret; | ||
74 | |||
75 | for (np = NULL, i = 0; | ||
76 | (np = of_find_compatible_node(np, "network", "tsi-ethernet")) != NULL; | ||
77 | i++) { | ||
78 | struct resource r[2]; | ||
79 | struct device_node *phy; | ||
80 | hw_info tsi_eth_data; | ||
81 | unsigned int *id; | ||
82 | unsigned int *phy_id; | ||
83 | void *mac_addr; | ||
84 | phandle *ph; | ||
85 | |||
86 | memset(r, 0, sizeof(r)); | ||
87 | memset(&tsi_eth_data, 0, sizeof(tsi_eth_data)); | ||
88 | |||
89 | ret = of_address_to_resource(np, 0, &r[0]); | ||
90 | DBG("%s: name:start->end = %s:0x%lx-> 0x%lx\n", | ||
91 | __FUNCTION__,r[0].name, r[0].start, r[0].end); | ||
92 | if (ret) | ||
93 | goto err; | ||
94 | |||
95 | r[1].name = "tx"; | ||
96 | r[1].start = np->intrs[0].line; | ||
97 | r[1].end = np->intrs[0].line; | ||
98 | r[1].flags = IORESOURCE_IRQ; | ||
99 | |||
100 | tsi_eth_dev = | ||
101 | platform_device_register_simple("tsi-ethernet", i, &r[0], | ||
102 | np->n_intrs + 1); | ||
103 | |||
104 | if (IS_ERR(tsi_eth_dev)) { | ||
105 | ret = PTR_ERR(tsi_eth_dev); | ||
106 | goto err; | ||
107 | } | ||
108 | |||
109 | mac_addr = get_property(np, "address", NULL); | ||
110 | memcpy(tsi_eth_data.mac_addr, mac_addr, 6); | ||
111 | |||
112 | ph = (phandle *) get_property(np, "phy-handle", NULL); | ||
113 | phy = of_find_node_by_phandle(*ph); | ||
114 | |||
115 | if (phy == NULL) { | ||
116 | ret = -ENODEV; | ||
117 | goto unreg; | ||
118 | } | ||
119 | |||
120 | id = (u32 *) get_property(phy, "reg", NULL); | ||
121 | phy_id = (u32 *) get_property(phy, "phy-id", NULL); | ||
122 | ret = of_address_to_resource(phy, 0, &res); | ||
123 | if (ret) { | ||
124 | of_node_put(phy); | ||
125 | goto unreg; | ||
126 | } | ||
127 | tsi_eth_data.regs = r[0].start; | ||
128 | tsi_eth_data.phyregs = res.start; | ||
129 | tsi_eth_data.phy = *phy_id; | ||
130 | tsi_eth_data.irq_num = np->intrs[0].line; | ||
131 | of_node_put(phy); | ||
132 | ret = | ||
133 | platform_device_add_data(tsi_eth_dev, &tsi_eth_data, | ||
134 | sizeof(hw_info)); | ||
135 | if (ret) | ||
136 | goto unreg; | ||
137 | } | ||
138 | return 0; | ||
139 | unreg: | ||
140 | platform_device_unregister(tsi_eth_dev); | ||
141 | err: | ||
142 | return ret; | ||
143 | } | ||
144 | |||
145 | arch_initcall(tsi108_eth_of_init); | ||
diff --git a/arch/powerpc/sysdev/tsi108_pci.c b/arch/powerpc/sysdev/tsi108_pci.c new file mode 100644 index 000000000000..3265d54c82ed --- /dev/null +++ b/arch/powerpc/sysdev/tsi108_pci.c | |||
@@ -0,0 +1,412 @@ | |||
1 | /* | ||
2 | * Common routines for Tundra Semiconductor TSI108 host bridge. | ||
3 | * | ||
4 | * 2004-2005 (c) Tundra Semiconductor Corp. | ||
5 | * Author: Alex Bounine (alexandreb@tundra.com) | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the Free | ||
9 | * Software Foundation; either version 2 of the License, or (at your option) | ||
10 | * any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
13 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
14 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
15 | * more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License along with | ||
18 | * this program; if not, write to the Free Software Foundation, Inc., 59 | ||
19 | * Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
20 | */ | ||
21 | |||
22 | #include <linux/kernel.h> | ||
23 | #include <linux/init.h> | ||
24 | #include <linux/pci.h> | ||
25 | #include <linux/slab.h> | ||
26 | #include <linux/irq.h> | ||
27 | #include <linux/interrupt.h> | ||
28 | |||
29 | |||
30 | #include <asm/byteorder.h> | ||
31 | #include <asm/io.h> | ||
32 | #include <asm/irq.h> | ||
33 | #include <asm/uaccess.h> | ||
34 | #include <asm/machdep.h> | ||
35 | #include <asm/pci-bridge.h> | ||
36 | #include <asm/tsi108.h> | ||
37 | #include <asm/tsi108_irq.h> | ||
38 | #include <asm/prom.h> | ||
39 | |||
40 | #undef DEBUG | ||
41 | #ifdef DEBUG | ||
42 | #define DBG(x...) printk(x) | ||
43 | #else | ||
44 | #define DBG(x...) | ||
45 | #endif | ||
46 | |||
47 | #define tsi_mk_config_addr(bus, devfunc, offset) \ | ||
48 | ((((bus)<<16) | ((devfunc)<<8) | (offset & 0xfc)) + tsi108_pci_cfg_base) | ||
49 | |||
50 | u32 tsi108_pci_cfg_base; | ||
51 | u32 tsi108_csr_vir_base; | ||
52 | |||
53 | extern u32 get_vir_csrbase(void); | ||
54 | extern u32 tsi108_read_reg(u32 reg_offset); | ||
55 | extern void tsi108_write_reg(u32 reg_offset, u32 val); | ||
56 | |||
57 | int | ||
58 | tsi108_direct_write_config(struct pci_bus *bus, unsigned int devfunc, | ||
59 | int offset, int len, u32 val) | ||
60 | { | ||
61 | volatile unsigned char *cfg_addr; | ||
62 | |||
63 | if (ppc_md.pci_exclude_device) | ||
64 | if (ppc_md.pci_exclude_device(bus->number, devfunc)) | ||
65 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
66 | |||
67 | cfg_addr = (unsigned char *)(tsi_mk_config_addr(bus->number, | ||
68 | devfunc, offset) | | ||
69 | (offset & 0x03)); | ||
70 | |||
71 | #ifdef DEBUG | ||
72 | printk("PCI CFG write : "); | ||
73 | printk("%d:0x%x:0x%x ", bus->number, devfunc, offset); | ||
74 | printk("%d ADDR=0x%08x ", len, (uint) cfg_addr); | ||
75 | printk("data = 0x%08x\n", val); | ||
76 | #endif | ||
77 | |||
78 | switch (len) { | ||
79 | case 1: | ||
80 | out_8((u8 *) cfg_addr, val); | ||
81 | break; | ||
82 | case 2: | ||
83 | out_le16((u16 *) cfg_addr, val); | ||
84 | break; | ||
85 | default: | ||
86 | out_le32((u32 *) cfg_addr, val); | ||
87 | break; | ||
88 | } | ||
89 | |||
90 | return PCIBIOS_SUCCESSFUL; | ||
91 | } | ||
92 | |||
93 | void tsi108_clear_pci_error(u32 pci_cfg_base) | ||
94 | { | ||
95 | u32 err_stat, err_addr, pci_stat; | ||
96 | |||
97 | /* | ||
98 | * Quietly clear PB and PCI error flags set as result | ||
99 | * of PCI/X configuration read requests. | ||
100 | */ | ||
101 | |||
102 | /* Read PB Error Log Registers */ | ||
103 | |||
104 | err_stat = tsi108_read_reg(TSI108_PB_OFFSET + TSI108_PB_ERRCS); | ||
105 | err_addr = tsi108_read_reg(TSI108_PB_OFFSET + TSI108_PB_AERR); | ||
106 | |||
107 | if (err_stat & TSI108_PB_ERRCS_ES) { | ||
108 | /* Clear error flag */ | ||
109 | tsi108_write_reg(TSI108_PB_OFFSET + TSI108_PB_ERRCS, | ||
110 | TSI108_PB_ERRCS_ES); | ||
111 | |||
112 | /* Clear read error reported in PB_ISR */ | ||
113 | tsi108_write_reg(TSI108_PB_OFFSET + TSI108_PB_ISR, | ||
114 | TSI108_PB_ISR_PBS_RD_ERR); | ||
115 | |||
116 | /* Clear PCI/X bus cfg errors if applicable */ | ||
117 | if ((err_addr & 0xFF000000) == pci_cfg_base) { | ||
118 | pci_stat = | ||
119 | tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_CSR); | ||
120 | tsi108_write_reg(TSI108_PCI_OFFSET + TSI108_PCI_CSR, | ||
121 | pci_stat); | ||
122 | } | ||
123 | } | ||
124 | |||
125 | return; | ||
126 | } | ||
127 | |||
128 | #define __tsi108_read_pci_config(x, addr, op) \ | ||
129 | __asm__ __volatile__( \ | ||
130 | " "op" %0,0,%1\n" \ | ||
131 | "1: eieio\n" \ | ||
132 | "2:\n" \ | ||
133 | ".section .fixup,\"ax\"\n" \ | ||
134 | "3: li %0,-1\n" \ | ||
135 | " b 2b\n" \ | ||
136 | ".section __ex_table,\"a\"\n" \ | ||
137 | " .align 2\n" \ | ||
138 | " .long 1b,3b\n" \ | ||
139 | ".text" \ | ||
140 | : "=r"(x) : "r"(addr)) | ||
141 | |||
142 | int | ||
143 | tsi108_direct_read_config(struct pci_bus *bus, unsigned int devfn, int offset, | ||
144 | int len, u32 * val) | ||
145 | { | ||
146 | volatile unsigned char *cfg_addr; | ||
147 | u32 temp; | ||
148 | |||
149 | if (ppc_md.pci_exclude_device) | ||
150 | if (ppc_md.pci_exclude_device(bus->number, devfn)) | ||
151 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
152 | |||
153 | cfg_addr = (unsigned char *)(tsi_mk_config_addr(bus->number, | ||
154 | devfn, | ||
155 | offset) | (offset & | ||
156 | 0x03)); | ||
157 | |||
158 | switch (len) { | ||
159 | case 1: | ||
160 | __tsi108_read_pci_config(temp, cfg_addr, "lbzx"); | ||
161 | break; | ||
162 | case 2: | ||
163 | __tsi108_read_pci_config(temp, cfg_addr, "lhbrx"); | ||
164 | break; | ||
165 | default: | ||
166 | __tsi108_read_pci_config(temp, cfg_addr, "lwbrx"); | ||
167 | break; | ||
168 | } | ||
169 | |||
170 | *val = temp; | ||
171 | |||
172 | #ifdef DEBUG | ||
173 | if ((0xFFFFFFFF != temp) && (0xFFFF != temp) && (0xFF != temp)) { | ||
174 | printk("PCI CFG read : "); | ||
175 | printk("%d:0x%x:0x%x ", bus->number, devfn, offset); | ||
176 | printk("%d ADDR=0x%08x ", len, (uint) cfg_addr); | ||
177 | printk("data = 0x%x\n", *val); | ||
178 | } | ||
179 | #endif | ||
180 | return PCIBIOS_SUCCESSFUL; | ||
181 | } | ||
182 | |||
183 | void tsi108_clear_pci_cfg_error(void) | ||
184 | { | ||
185 | tsi108_clear_pci_error(TSI108_PCI_CFG_BASE_PHYS); | ||
186 | } | ||
187 | |||
188 | static struct pci_ops tsi108_direct_pci_ops = { | ||
189 | tsi108_direct_read_config, | ||
190 | tsi108_direct_write_config | ||
191 | }; | ||
192 | |||
193 | int __init tsi108_setup_pci(struct device_node *dev) | ||
194 | { | ||
195 | int len; | ||
196 | struct pci_controller *hose; | ||
197 | struct resource rsrc; | ||
198 | int *bus_range; | ||
199 | int primary = 0, has_address = 0; | ||
200 | |||
201 | /* PCI Config mapping */ | ||
202 | tsi108_pci_cfg_base = (u32)ioremap(TSI108_PCI_CFG_BASE_PHYS, | ||
203 | TSI108_PCI_CFG_SIZE); | ||
204 | DBG("TSI_PCI: %s tsi108_pci_cfg_base=0x%x\n", __FUNCTION__, | ||
205 | tsi108_pci_cfg_base); | ||
206 | |||
207 | /* Fetch host bridge registers address */ | ||
208 | has_address = (of_address_to_resource(dev, 0, &rsrc) == 0); | ||
209 | |||
210 | /* Get bus range if any */ | ||
211 | bus_range = (int *)get_property(dev, "bus-range", &len); | ||
212 | if (bus_range == NULL || len < 2 * sizeof(int)) { | ||
213 | printk(KERN_WARNING "Can't get bus-range for %s, assume" | ||
214 | " bus 0\n", dev->full_name); | ||
215 | } | ||
216 | |||
217 | hose = pcibios_alloc_controller(); | ||
218 | |||
219 | if (!hose) { | ||
220 | printk("PCI Host bridge init failed\n"); | ||
221 | return -ENOMEM; | ||
222 | } | ||
223 | hose->arch_data = dev; | ||
224 | hose->set_cfg_type = 1; | ||
225 | |||
226 | hose->first_busno = bus_range ? bus_range[0] : 0; | ||
227 | hose->last_busno = bus_range ? bus_range[1] : 0xff; | ||
228 | |||
229 | (hose)->ops = &tsi108_direct_pci_ops; | ||
230 | |||
231 | printk(KERN_INFO "Found tsi108 PCI host bridge at 0x%08lx. " | ||
232 | "Firmware bus number: %d->%d\n", | ||
233 | rsrc.start, hose->first_busno, hose->last_busno); | ||
234 | |||
235 | /* Interpret the "ranges" property */ | ||
236 | /* This also maps the I/O region and sets isa_io/mem_base */ | ||
237 | pci_process_bridge_OF_ranges(hose, dev, primary); | ||
238 | return 0; | ||
239 | } | ||
240 | |||
241 | /* | ||
242 | * Low level utility functions | ||
243 | */ | ||
244 | |||
245 | static void tsi108_pci_int_mask(u_int irq) | ||
246 | { | ||
247 | u_int irp_cfg; | ||
248 | int int_line = (irq - IRQ_PCI_INTAD_BASE); | ||
249 | |||
250 | irp_cfg = tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_CFG_CTL); | ||
251 | mb(); | ||
252 | irp_cfg |= (1 << int_line); /* INTx_DIR = output */ | ||
253 | irp_cfg &= ~(3 << (8 + (int_line * 2))); /* INTx_TYPE = unused */ | ||
254 | tsi108_write_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_CFG_CTL, irp_cfg); | ||
255 | mb(); | ||
256 | irp_cfg = tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_CFG_CTL); | ||
257 | } | ||
258 | |||
259 | static void tsi108_pci_int_unmask(u_int irq) | ||
260 | { | ||
261 | u_int irp_cfg; | ||
262 | int int_line = (irq - IRQ_PCI_INTAD_BASE); | ||
263 | |||
264 | irp_cfg = tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_CFG_CTL); | ||
265 | mb(); | ||
266 | irp_cfg &= ~(1 << int_line); | ||
267 | irp_cfg |= (3 << (8 + (int_line * 2))); | ||
268 | tsi108_write_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_CFG_CTL, irp_cfg); | ||
269 | mb(); | ||
270 | } | ||
271 | |||
272 | static void init_pci_source(void) | ||
273 | { | ||
274 | tsi108_write_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_CFG_CTL, | ||
275 | 0x0000ff00); | ||
276 | tsi108_write_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_ENABLE, | ||
277 | TSI108_PCI_IRP_ENABLE_P_INT); | ||
278 | mb(); | ||
279 | } | ||
280 | |||
281 | static inline int get_pci_source(void) | ||
282 | { | ||
283 | u_int temp = 0; | ||
284 | int irq = -1; | ||
285 | int i; | ||
286 | u_int pci_irp_stat; | ||
287 | static int mask = 0; | ||
288 | |||
289 | /* Read PCI/X block interrupt status register */ | ||
290 | pci_irp_stat = tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_STAT); | ||
291 | mb(); | ||
292 | |||
293 | if (pci_irp_stat & TSI108_PCI_IRP_STAT_P_INT) { | ||
294 | /* Process Interrupt from PCI bus INTA# - INTD# lines */ | ||
295 | temp = | ||
296 | tsi108_read_reg(TSI108_PCI_OFFSET + | ||
297 | TSI108_PCI_IRP_INTAD) & 0xf; | ||
298 | mb(); | ||
299 | for (i = 0; i < 4; i++, mask++) { | ||
300 | if (temp & (1 << mask % 4)) { | ||
301 | irq = IRQ_PCI_INTA + mask % 4; | ||
302 | mask++; | ||
303 | break; | ||
304 | } | ||
305 | } | ||
306 | |||
307 | /* Disable interrupts from PCI block */ | ||
308 | temp = tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_ENABLE); | ||
309 | tsi108_write_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_ENABLE, | ||
310 | temp & ~TSI108_PCI_IRP_ENABLE_P_INT); | ||
311 | mb(); | ||
312 | (void)tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_ENABLE); | ||
313 | mb(); | ||
314 | } | ||
315 | #ifdef DEBUG | ||
316 | else { | ||
317 | printk("TSI108_PIC: error in TSI108_PCI_IRP_STAT\n"); | ||
318 | pci_irp_stat = | ||
319 | tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_STAT); | ||
320 | temp = | ||
321 | tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_INTAD); | ||
322 | mb(); | ||
323 | printk(">> stat=0x%08x intad=0x%08x ", pci_irp_stat, temp); | ||
324 | temp = | ||
325 | tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_CFG_CTL); | ||
326 | mb(); | ||
327 | printk("cfg_ctl=0x%08x ", temp); | ||
328 | temp = | ||
329 | tsi108_read_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_ENABLE); | ||
330 | mb(); | ||
331 | printk("irp_enable=0x%08x\n", temp); | ||
332 | } | ||
333 | #endif /* end of DEBUG */ | ||
334 | |||
335 | return irq; | ||
336 | } | ||
337 | |||
338 | |||
339 | /* | ||
340 | * Linux descriptor level callbacks | ||
341 | */ | ||
342 | |||
343 | static void tsi108_pci_irq_enable(u_int irq) | ||
344 | { | ||
345 | tsi108_pci_int_unmask(irq); | ||
346 | } | ||
347 | |||
348 | static void tsi108_pci_irq_disable(u_int irq) | ||
349 | { | ||
350 | tsi108_pci_int_mask(irq); | ||
351 | } | ||
352 | |||
353 | static void tsi108_pci_irq_ack(u_int irq) | ||
354 | { | ||
355 | tsi108_pci_int_mask(irq); | ||
356 | } | ||
357 | |||
358 | static void tsi108_pci_irq_end(u_int irq) | ||
359 | { | ||
360 | tsi108_pci_int_unmask(irq); | ||
361 | |||
362 | /* Enable interrupts from PCI block */ | ||
363 | tsi108_write_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_ENABLE, | ||
364 | tsi108_read_reg(TSI108_PCI_OFFSET + | ||
365 | TSI108_PCI_IRP_ENABLE) | | ||
366 | TSI108_PCI_IRP_ENABLE_P_INT); | ||
367 | mb(); | ||
368 | } | ||
369 | |||
370 | /* | ||
371 | * Interrupt controller descriptor for cascaded PCI interrupt controller. | ||
372 | */ | ||
373 | |||
374 | struct hw_interrupt_type tsi108_pci_irq = { | ||
375 | .typename = "tsi108_PCI_int", | ||
376 | .enable = tsi108_pci_irq_enable, | ||
377 | .disable = tsi108_pci_irq_disable, | ||
378 | .ack = tsi108_pci_irq_ack, | ||
379 | .end = tsi108_pci_irq_end, | ||
380 | }; | ||
381 | |||
382 | /* | ||
383 | * Exported functions | ||
384 | */ | ||
385 | |||
386 | /* | ||
387 | * The Tsi108 PCI interrupts initialization routine. | ||
388 | * | ||
389 | * The INTA# - INTD# interrupts on the PCI bus are reported by the PCI block | ||
390 | * to the MPIC using single interrupt source (IRQ_TSI108_PCI). Therefore the | ||
391 | * PCI block has to be treated as a cascaded interrupt controller connected | ||
392 | * to the MPIC. | ||
393 | */ | ||
394 | |||
395 | void __init tsi108_pci_int_init(void) | ||
396 | { | ||
397 | u_int i; | ||
398 | |||
399 | DBG("Tsi108_pci_int_init: initializing PCI interrupts\n"); | ||
400 | |||
401 | for (i = 0; i < NUM_PCI_IRQS; i++) { | ||
402 | irq_desc[i + IRQ_PCI_INTAD_BASE].handler = &tsi108_pci_irq; | ||
403 | irq_desc[i + IRQ_PCI_INTAD_BASE].status |= IRQ_LEVEL; | ||
404 | } | ||
405 | |||
406 | init_pci_source(); | ||
407 | } | ||
408 | |||
409 | int tsi108_irq_cascade(struct pt_regs *regs, void *unused) | ||
410 | { | ||
411 | return get_pci_source(); | ||
412 | } | ||
diff --git a/arch/ppc/8xx_io/commproc.c b/arch/ppc/8xx_io/commproc.c index 12b84ca51327..9b3ace26280c 100644 --- a/arch/ppc/8xx_io/commproc.c +++ b/arch/ppc/8xx_io/commproc.c | |||
@@ -187,7 +187,7 @@ cpm_interrupt_init(void) | |||
187 | * interrupt vectors | 187 | * interrupt vectors |
188 | */ | 188 | */ |
189 | for ( i = CPM_IRQ_OFFSET ; i < CPM_IRQ_OFFSET + NR_CPM_INTS ; i++ ) | 189 | for ( i = CPM_IRQ_OFFSET ; i < CPM_IRQ_OFFSET + NR_CPM_INTS ; i++ ) |
190 | irq_desc[i].handler = &cpm_pic; | 190 | irq_desc[i].chip = &cpm_pic; |
191 | 191 | ||
192 | /* Set our interrupt handler with the core CPU. */ | 192 | /* Set our interrupt handler with the core CPU. */ |
193 | if (setup_irq(CPM_INTERRUPT, &cpm_interrupt_irqaction)) | 193 | if (setup_irq(CPM_INTERRUPT, &cpm_interrupt_irqaction)) |
diff --git a/arch/ppc/kernel/pci.c b/arch/ppc/kernel/pci.c index d20accf9650d..242bb052be67 100644 --- a/arch/ppc/kernel/pci.c +++ b/arch/ppc/kernel/pci.c | |||
@@ -95,8 +95,10 @@ pcibios_fixup_resources(struct pci_dev *dev) | |||
95 | if (!res->flags) | 95 | if (!res->flags) |
96 | continue; | 96 | continue; |
97 | if (res->end == 0xffffffff) { | 97 | if (res->end == 0xffffffff) { |
98 | DBG("PCI:%s Resource %d [%08lx-%08lx] is unassigned\n", | 98 | DBG("PCI:%s Resource %d [%016llx-%016llx] is unassigned\n", |
99 | pci_name(dev), i, res->start, res->end); | 99 | pci_name(dev), i, |
100 | (unsigned long long)res->start, | ||
101 | (unsigned long long)res->end); | ||
100 | res->end -= res->start; | 102 | res->end -= res->start; |
101 | res->start = 0; | 103 | res->start = 0; |
102 | res->flags |= IORESOURCE_UNSET; | 104 | res->flags |= IORESOURCE_UNSET; |
@@ -169,18 +171,18 @@ EXPORT_SYMBOL(pcibios_bus_to_resource); | |||
169 | * but we want to try to avoid allocating at 0x2900-0x2bff | 171 | * but we want to try to avoid allocating at 0x2900-0x2bff |
170 | * which might have be mirrored at 0x0100-0x03ff.. | 172 | * which might have be mirrored at 0x0100-0x03ff.. |
171 | */ | 173 | */ |
172 | void pcibios_align_resource(void *data, struct resource *res, unsigned long size, | 174 | void pcibios_align_resource(void *data, struct resource *res, |
173 | unsigned long align) | 175 | resource_size_t size, resource_size_t align) |
174 | { | 176 | { |
175 | struct pci_dev *dev = data; | 177 | struct pci_dev *dev = data; |
176 | 178 | ||
177 | if (res->flags & IORESOURCE_IO) { | 179 | if (res->flags & IORESOURCE_IO) { |
178 | unsigned long start = res->start; | 180 | resource_size_t start = res->start; |
179 | 181 | ||
180 | if (size > 0x100) { | 182 | if (size > 0x100) { |
181 | printk(KERN_ERR "PCI: I/O Region %s/%d too large" | 183 | printk(KERN_ERR "PCI: I/O Region %s/%d too large" |
182 | " (%ld bytes)\n", pci_name(dev), | 184 | " (%lld bytes)\n", pci_name(dev), |
183 | dev->resource - res, size); | 185 | dev->resource - res, (unsigned long long)size); |
184 | } | 186 | } |
185 | 187 | ||
186 | if (start & 0x300) { | 188 | if (start & 0x300) { |
@@ -251,8 +253,9 @@ pcibios_allocate_bus_resources(struct list_head *bus_list) | |||
251 | } | 253 | } |
252 | } | 254 | } |
253 | 255 | ||
254 | DBG("PCI: bridge rsrc %lx..%lx (%lx), parent %p\n", | 256 | DBG("PCI: bridge rsrc %llx..%llx (%lx), parent %p\n", |
255 | res->start, res->end, res->flags, pr); | 257 | (unsigned long long)res->start, |
258 | (unsigned long long)res->end, res->flags, pr); | ||
256 | if (pr) { | 259 | if (pr) { |
257 | if (request_resource(pr, res) == 0) | 260 | if (request_resource(pr, res) == 0) |
258 | continue; | 261 | continue; |
@@ -302,8 +305,9 @@ reparent_resources(struct resource *parent, struct resource *res) | |||
302 | *pp = NULL; | 305 | *pp = NULL; |
303 | for (p = res->child; p != NULL; p = p->sibling) { | 306 | for (p = res->child; p != NULL; p = p->sibling) { |
304 | p->parent = res; | 307 | p->parent = res; |
305 | DBG(KERN_INFO "PCI: reparented %s [%lx..%lx] under %s\n", | 308 | DBG(KERN_INFO "PCI: reparented %s [%llx..%llx] under %s\n", |
306 | p->name, p->start, p->end, res->name); | 309 | p->name, (unsigned long long)p->start, |
310 | (unsigned long long)p->end, res->name); | ||
307 | } | 311 | } |
308 | return 0; | 312 | return 0; |
309 | } | 313 | } |
@@ -358,13 +362,15 @@ pci_relocate_bridge_resource(struct pci_bus *bus, int i) | |||
358 | try = conflict->start - 1; | 362 | try = conflict->start - 1; |
359 | } | 363 | } |
360 | if (request_resource(pr, res)) { | 364 | if (request_resource(pr, res)) { |
361 | DBG(KERN_ERR "PCI: huh? couldn't move to %lx..%lx\n", | 365 | DBG(KERN_ERR "PCI: huh? couldn't move to %llx..%llx\n", |
362 | res->start, res->end); | 366 | (unsigned long long)res->start, |
367 | (unsigned long long)res->end); | ||
363 | return -1; /* "can't happen" */ | 368 | return -1; /* "can't happen" */ |
364 | } | 369 | } |
365 | update_bridge_base(bus, i); | 370 | update_bridge_base(bus, i); |
366 | printk(KERN_INFO "PCI: bridge %d resource %d moved to %lx..%lx\n", | 371 | printk(KERN_INFO "PCI: bridge %d resource %d moved to %llx..%llx\n", |
367 | bus->number, i, res->start, res->end); | 372 | bus->number, i, (unsigned long long)res->start, |
373 | (unsigned long long)res->end); | ||
368 | return 0; | 374 | return 0; |
369 | } | 375 | } |
370 | 376 | ||
@@ -475,15 +481,17 @@ static inline void alloc_resource(struct pci_dev *dev, int idx) | |||
475 | { | 481 | { |
476 | struct resource *pr, *r = &dev->resource[idx]; | 482 | struct resource *pr, *r = &dev->resource[idx]; |
477 | 483 | ||
478 | DBG("PCI:%s: Resource %d: %08lx-%08lx (f=%lx)\n", | 484 | DBG("PCI:%s: Resource %d: %016llx-%016llx (f=%lx)\n", |
479 | pci_name(dev), idx, r->start, r->end, r->flags); | 485 | pci_name(dev), idx, (unsigned long long)r->start, |
486 | (unsigned long long)r->end, r->flags); | ||
480 | pr = pci_find_parent_resource(dev, r); | 487 | pr = pci_find_parent_resource(dev, r); |
481 | if (!pr || request_resource(pr, r) < 0) { | 488 | if (!pr || request_resource(pr, r) < 0) { |
482 | printk(KERN_ERR "PCI: Cannot allocate resource region %d" | 489 | printk(KERN_ERR "PCI: Cannot allocate resource region %d" |
483 | " of device %s\n", idx, pci_name(dev)); | 490 | " of device %s\n", idx, pci_name(dev)); |
484 | if (pr) | 491 | if (pr) |
485 | DBG("PCI: parent is %p: %08lx-%08lx (f=%lx)\n", | 492 | DBG("PCI: parent is %p: %016llx-%016llx (f=%lx)\n", |
486 | pr, pr->start, pr->end, pr->flags); | 493 | pr, (unsigned long long)pr->start, |
494 | (unsigned long long)pr->end, pr->flags); | ||
487 | /* We'll assign a new address later */ | 495 | /* We'll assign a new address later */ |
488 | r->flags |= IORESOURCE_UNSET; | 496 | r->flags |= IORESOURCE_UNSET; |
489 | r->end -= r->start; | 497 | r->end -= r->start; |
@@ -952,8 +960,8 @@ static pgprot_t __pci_mmap_set_pgprot(struct pci_dev *dev, struct resource *rp, | |||
952 | else | 960 | else |
953 | prot |= _PAGE_GUARDED; | 961 | prot |= _PAGE_GUARDED; |
954 | 962 | ||
955 | printk("PCI map for %s:%lx, prot: %lx\n", pci_name(dev), rp->start, | 963 | printk("PCI map for %s:%llx, prot: %lx\n", pci_name(dev), |
956 | prot); | 964 | (unsigned long long)rp->start, prot); |
957 | 965 | ||
958 | return __pgprot(prot); | 966 | return __pgprot(prot); |
959 | } | 967 | } |
@@ -1122,7 +1130,7 @@ long sys_pciconfig_iobase(long which, unsigned long bus, unsigned long devfn) | |||
1122 | 1130 | ||
1123 | void pci_resource_to_user(const struct pci_dev *dev, int bar, | 1131 | void pci_resource_to_user(const struct pci_dev *dev, int bar, |
1124 | const struct resource *rsrc, | 1132 | const struct resource *rsrc, |
1125 | u64 *start, u64 *end) | 1133 | resource_size_t *start, resource_size_t *end) |
1126 | { | 1134 | { |
1127 | struct pci_controller *hose = pci_bus_to_hose(dev->bus->number); | 1135 | struct pci_controller *hose = pci_bus_to_hose(dev->bus->number); |
1128 | unsigned long offset = 0; | 1136 | unsigned long offset = 0; |
diff --git a/arch/ppc/platforms/apus_setup.c b/arch/ppc/platforms/apus_setup.c index fe0cdc04d436..5c4118a459f3 100644 --- a/arch/ppc/platforms/apus_setup.c +++ b/arch/ppc/platforms/apus_setup.c | |||
@@ -734,9 +734,9 @@ void apus_init_IRQ(void) | |||
734 | for ( i = 0 ; i < AMI_IRQS; i++ ) { | 734 | for ( i = 0 ; i < AMI_IRQS; i++ ) { |
735 | irq_desc[i].status = IRQ_LEVEL; | 735 | irq_desc[i].status = IRQ_LEVEL; |
736 | if (i < IRQ_AMIGA_AUTO) { | 736 | if (i < IRQ_AMIGA_AUTO) { |
737 | irq_desc[i].handler = &amiga_irqctrl; | 737 | irq_desc[i].chip = &amiga_irqctrl; |
738 | } else { | 738 | } else { |
739 | irq_desc[i].handler = &amiga_sys_irqctrl; | 739 | irq_desc[i].chip = &amiga_sys_irqctrl; |
740 | action = &amiga_sys_irqaction[i-IRQ_AMIGA_AUTO]; | 740 | action = &amiga_sys_irqaction[i-IRQ_AMIGA_AUTO]; |
741 | if (action->name) | 741 | if (action->name) |
742 | setup_irq(i, action); | 742 | setup_irq(i, action); |
diff --git a/arch/ppc/platforms/sbc82xx.c b/arch/ppc/platforms/sbc82xx.c index 866807b4ad0b..41006d2b4b38 100644 --- a/arch/ppc/platforms/sbc82xx.c +++ b/arch/ppc/platforms/sbc82xx.c | |||
@@ -172,7 +172,7 @@ void __init sbc82xx_init_IRQ(void) | |||
172 | 172 | ||
173 | /* Set up the interrupt handlers for the i8259 IRQs */ | 173 | /* Set up the interrupt handlers for the i8259 IRQs */ |
174 | for (i = NR_SIU_INTS; i < NR_SIU_INTS + 8; i++) { | 174 | for (i = NR_SIU_INTS; i < NR_SIU_INTS + 8; i++) { |
175 | irq_desc[i].handler = &sbc82xx_i8259_ic; | 175 | irq_desc[i].chip = &sbc82xx_i8259_ic; |
176 | irq_desc[i].status |= IRQ_LEVEL; | 176 | irq_desc[i].status |= IRQ_LEVEL; |
177 | } | 177 | } |
178 | 178 | ||
diff --git a/arch/ppc/syslib/cpc700_pic.c b/arch/ppc/syslib/cpc700_pic.c index 5add0a919ef6..172aa215fdb0 100644 --- a/arch/ppc/syslib/cpc700_pic.c +++ b/arch/ppc/syslib/cpc700_pic.c | |||
@@ -140,12 +140,12 @@ cpc700_init_IRQ(void) | |||
140 | /* IRQ 0 is highest */ | 140 | /* IRQ 0 is highest */ |
141 | 141 | ||
142 | for (i = 0; i < 17; i++) { | 142 | for (i = 0; i < 17; i++) { |
143 | irq_desc[i].handler = &cpc700_pic; | 143 | irq_desc[i].chip = &cpc700_pic; |
144 | cpc700_pic_init_irq(i); | 144 | cpc700_pic_init_irq(i); |
145 | } | 145 | } |
146 | 146 | ||
147 | for (i = 20; i < 32; i++) { | 147 | for (i = 20; i < 32; i++) { |
148 | irq_desc[i].handler = &cpc700_pic; | 148 | irq_desc[i].chip = &cpc700_pic; |
149 | cpc700_pic_init_irq(i); | 149 | cpc700_pic_init_irq(i); |
150 | } | 150 | } |
151 | 151 | ||
diff --git a/arch/ppc/syslib/cpm2_pic.c b/arch/ppc/syslib/cpm2_pic.c index 29d95d415ceb..c0fee0beb815 100644 --- a/arch/ppc/syslib/cpm2_pic.c +++ b/arch/ppc/syslib/cpm2_pic.c | |||
@@ -171,7 +171,7 @@ void cpm2_init_IRQ(void) | |||
171 | /* Enable chaining to OpenPIC, and make everything level | 171 | /* Enable chaining to OpenPIC, and make everything level |
172 | */ | 172 | */ |
173 | for (i = 0; i < NR_CPM_INTS; i++) { | 173 | for (i = 0; i < NR_CPM_INTS; i++) { |
174 | irq_desc[i+CPM_IRQ_OFFSET].handler = &cpm2_pic; | 174 | irq_desc[i+CPM_IRQ_OFFSET].chip = &cpm2_pic; |
175 | irq_desc[i+CPM_IRQ_OFFSET].status |= IRQ_LEVEL; | 175 | irq_desc[i+CPM_IRQ_OFFSET].status |= IRQ_LEVEL; |
176 | } | 176 | } |
177 | } | 177 | } |
diff --git a/arch/ppc/syslib/gt64260_pic.c b/arch/ppc/syslib/gt64260_pic.c index dc3bd9ecbbf6..91096b38ae70 100644 --- a/arch/ppc/syslib/gt64260_pic.c +++ b/arch/ppc/syslib/gt64260_pic.c | |||
@@ -98,7 +98,7 @@ gt64260_init_irq(void) | |||
98 | 98 | ||
99 | /* use the gt64260 for all (possible) interrupt sources */ | 99 | /* use the gt64260 for all (possible) interrupt sources */ |
100 | for (i = gt64260_irq_base; i < (gt64260_irq_base + 96); i++) | 100 | for (i = gt64260_irq_base; i < (gt64260_irq_base + 96); i++) |
101 | irq_desc[i].handler = >64260_pic; | 101 | irq_desc[i].chip = >64260_pic; |
102 | 102 | ||
103 | if (ppc_md.progress) | 103 | if (ppc_md.progress) |
104 | ppc_md.progress("gt64260_init_irq: exit", 0x0); | 104 | ppc_md.progress("gt64260_init_irq: exit", 0x0); |
diff --git a/arch/ppc/syslib/m82xx_pci.c b/arch/ppc/syslib/m82xx_pci.c index 1941a8c7ca9a..63fa5b313396 100644 --- a/arch/ppc/syslib/m82xx_pci.c +++ b/arch/ppc/syslib/m82xx_pci.c | |||
@@ -159,7 +159,7 @@ pq2pci_init_irq(void) | |||
159 | immap->im_memctl.memc_or8 = 0xffff8010; | 159 | immap->im_memctl.memc_or8 = 0xffff8010; |
160 | #endif | 160 | #endif |
161 | for (irq = NR_CPM_INTS; irq < NR_CPM_INTS + 4; irq++) | 161 | for (irq = NR_CPM_INTS; irq < NR_CPM_INTS + 4; irq++) |
162 | irq_desc[irq].handler = &pq2pci_ic; | 162 | irq_desc[irq].chip = &pq2pci_ic; |
163 | 163 | ||
164 | /* make PCI IRQ level sensitive */ | 164 | /* make PCI IRQ level sensitive */ |
165 | immap->im_intctl.ic_siexr &= | 165 | immap->im_intctl.ic_siexr &= |
diff --git a/arch/ppc/syslib/m8xx_setup.c b/arch/ppc/syslib/m8xx_setup.c index dae9af78bde1..0c4c0de7c59f 100644 --- a/arch/ppc/syslib/m8xx_setup.c +++ b/arch/ppc/syslib/m8xx_setup.c | |||
@@ -347,13 +347,13 @@ m8xx_init_IRQ(void) | |||
347 | int i; | 347 | int i; |
348 | 348 | ||
349 | for (i = SIU_IRQ_OFFSET ; i < SIU_IRQ_OFFSET + NR_SIU_INTS ; i++) | 349 | for (i = SIU_IRQ_OFFSET ; i < SIU_IRQ_OFFSET + NR_SIU_INTS ; i++) |
350 | irq_desc[i].handler = &ppc8xx_pic; | 350 | irq_desc[i].chip = &ppc8xx_pic; |
351 | 351 | ||
352 | cpm_interrupt_init(); | 352 | cpm_interrupt_init(); |
353 | 353 | ||
354 | #if defined(CONFIG_PCI) | 354 | #if defined(CONFIG_PCI) |
355 | for (i = I8259_IRQ_OFFSET ; i < I8259_IRQ_OFFSET + NR_8259_INTS ; i++) | 355 | for (i = I8259_IRQ_OFFSET ; i < I8259_IRQ_OFFSET + NR_8259_INTS ; i++) |
356 | irq_desc[i].handler = &i8259_pic; | 356 | irq_desc[i].chip = &i8259_pic; |
357 | 357 | ||
358 | i8259_pic_irq_offset = I8259_IRQ_OFFSET; | 358 | i8259_pic_irq_offset = I8259_IRQ_OFFSET; |
359 | i8259_init(0); | 359 | i8259_init(0); |
diff --git a/arch/ppc/syslib/mpc52xx_pic.c b/arch/ppc/syslib/mpc52xx_pic.c index c4406f9dc6a3..6425b5cee7db 100644 --- a/arch/ppc/syslib/mpc52xx_pic.c +++ b/arch/ppc/syslib/mpc52xx_pic.c | |||
@@ -204,9 +204,9 @@ mpc52xx_init_irq(void) | |||
204 | out_be32(&intr->main_pri1, 0); | 204 | out_be32(&intr->main_pri1, 0); |
205 | out_be32(&intr->main_pri2, 0); | 205 | out_be32(&intr->main_pri2, 0); |
206 | 206 | ||
207 | /* Initialize irq_desc[i].handler's with mpc52xx_ic. */ | 207 | /* Initialize irq_desc[i].chip's with mpc52xx_ic. */ |
208 | for (i = 0; i < NR_IRQS; i++) { | 208 | for (i = 0; i < NR_IRQS; i++) { |
209 | irq_desc[i].handler = &mpc52xx_ic; | 209 | irq_desc[i].chip = &mpc52xx_ic; |
210 | irq_desc[i].status = IRQ_LEVEL; | 210 | irq_desc[i].status = IRQ_LEVEL; |
211 | } | 211 | } |
212 | 212 | ||
diff --git a/arch/ppc/syslib/mv64360_pic.c b/arch/ppc/syslib/mv64360_pic.c index 5a19697060f0..a4244d468381 100644 --- a/arch/ppc/syslib/mv64360_pic.c +++ b/arch/ppc/syslib/mv64360_pic.c | |||
@@ -119,7 +119,7 @@ mv64360_init_irq(void) | |||
119 | /* All interrupts are level interrupts */ | 119 | /* All interrupts are level interrupts */ |
120 | for (i = mv64360_irq_base; i < (mv64360_irq_base + 96); i++) { | 120 | for (i = mv64360_irq_base; i < (mv64360_irq_base + 96); i++) { |
121 | irq_desc[i].status |= IRQ_LEVEL; | 121 | irq_desc[i].status |= IRQ_LEVEL; |
122 | irq_desc[i].handler = &mv64360_pic; | 122 | irq_desc[i].chip = &mv64360_pic; |
123 | } | 123 | } |
124 | 124 | ||
125 | if (ppc_md.progress) | 125 | if (ppc_md.progress) |
diff --git a/arch/ppc/syslib/open_pic.c b/arch/ppc/syslib/open_pic.c index 70456c8f998c..767a0bc95817 100644 --- a/arch/ppc/syslib/open_pic.c +++ b/arch/ppc/syslib/open_pic.c | |||
@@ -373,7 +373,7 @@ void __init openpic_init(int offset) | |||
373 | OPENPIC_VEC_IPI+i+offset); | 373 | OPENPIC_VEC_IPI+i+offset); |
374 | /* IPIs are per-CPU */ | 374 | /* IPIs are per-CPU */ |
375 | irq_desc[OPENPIC_VEC_IPI+i+offset].status |= IRQ_PER_CPU; | 375 | irq_desc[OPENPIC_VEC_IPI+i+offset].status |= IRQ_PER_CPU; |
376 | irq_desc[OPENPIC_VEC_IPI+i+offset].handler = &open_pic_ipi; | 376 | irq_desc[OPENPIC_VEC_IPI+i+offset].chip = &open_pic_ipi; |
377 | } | 377 | } |
378 | #endif | 378 | #endif |
379 | 379 | ||
@@ -408,7 +408,7 @@ void __init openpic_init(int offset) | |||
408 | 408 | ||
409 | /* Init descriptors */ | 409 | /* Init descriptors */ |
410 | for (i = offset; i < NumSources + offset; i++) | 410 | for (i = offset; i < NumSources + offset; i++) |
411 | irq_desc[i].handler = &open_pic; | 411 | irq_desc[i].chip = &open_pic; |
412 | 412 | ||
413 | /* Initialize the spurious interrupt */ | 413 | /* Initialize the spurious interrupt */ |
414 | if (ppc_md.progress) ppc_md.progress("openpic: spurious",0x3bd); | 414 | if (ppc_md.progress) ppc_md.progress("openpic: spurious",0x3bd); |
@@ -615,8 +615,8 @@ void __devinit do_openpic_setup_cpu(void) | |||
615 | /* let the openpic know we want intrs. default affinity | 615 | /* let the openpic know we want intrs. default affinity |
616 | * is 0xffffffff until changed via /proc | 616 | * is 0xffffffff until changed via /proc |
617 | * That's how it's done on x86. If we want it differently, then | 617 | * That's how it's done on x86. If we want it differently, then |
618 | * we should make sure we also change the default values of irq_affinity | 618 | * we should make sure we also change the default values of |
619 | * in irq.c. | 619 | * irq_desc[].affinity in irq.c. |
620 | */ | 620 | */ |
621 | for (i = 0; i < NumSources; i++) | 621 | for (i = 0; i < NumSources; i++) |
622 | openpic_mapirq(i, msk, CPU_MASK_ALL); | 622 | openpic_mapirq(i, msk, CPU_MASK_ALL); |
diff --git a/arch/ppc/syslib/open_pic2.c b/arch/ppc/syslib/open_pic2.c index bcbe40de26fe..b8154efff6ed 100644 --- a/arch/ppc/syslib/open_pic2.c +++ b/arch/ppc/syslib/open_pic2.c | |||
@@ -290,7 +290,7 @@ void __init openpic2_init(int offset) | |||
290 | 290 | ||
291 | /* Init descriptors */ | 291 | /* Init descriptors */ |
292 | for (i = offset; i < NumSources + offset; i++) | 292 | for (i = offset; i < NumSources + offset; i++) |
293 | irq_desc[i].handler = &open_pic2; | 293 | irq_desc[i].chip = &open_pic2; |
294 | 294 | ||
295 | /* Initialize the spurious interrupt */ | 295 | /* Initialize the spurious interrupt */ |
296 | if (ppc_md.progress) ppc_md.progress("openpic2: spurious",0x3bd); | 296 | if (ppc_md.progress) ppc_md.progress("openpic2: spurious",0x3bd); |
diff --git a/arch/ppc/syslib/ppc403_pic.c b/arch/ppc/syslib/ppc403_pic.c index c46043c47225..1584c8b1229f 100644 --- a/arch/ppc/syslib/ppc403_pic.c +++ b/arch/ppc/syslib/ppc403_pic.c | |||
@@ -121,5 +121,5 @@ ppc4xx_pic_init(void) | |||
121 | ppc_md.get_irq = ppc403_pic_get_irq; | 121 | ppc_md.get_irq = ppc403_pic_get_irq; |
122 | 122 | ||
123 | for (i = 0; i < NR_IRQS; i++) | 123 | for (i = 0; i < NR_IRQS; i++) |
124 | irq_desc[i].handler = &ppc403_aic; | 124 | irq_desc[i].chip = &ppc403_aic; |
125 | } | 125 | } |
diff --git a/arch/ppc/syslib/ppc4xx_pic.c b/arch/ppc/syslib/ppc4xx_pic.c index fd9af0fc0e9f..e669c1335d47 100644 --- a/arch/ppc/syslib/ppc4xx_pic.c +++ b/arch/ppc/syslib/ppc4xx_pic.c | |||
@@ -276,7 +276,7 @@ void __init ppc4xx_pic_init(void) | |||
276 | 276 | ||
277 | /* Attach low-level handlers */ | 277 | /* Attach low-level handlers */ |
278 | for (i = 0; i < (NR_UICS << 5); ++i) { | 278 | for (i = 0; i < (NR_UICS << 5); ++i) { |
279 | irq_desc[i].handler = &__uic[i >> 5].decl; | 279 | irq_desc[i].chip = &__uic[i >> 5].decl; |
280 | if (is_level_sensitive(i)) | 280 | if (is_level_sensitive(i)) |
281 | irq_desc[i].status |= IRQ_LEVEL; | 281 | irq_desc[i].status |= IRQ_LEVEL; |
282 | } | 282 | } |
diff --git a/arch/ppc/syslib/xilinx_pic.c b/arch/ppc/syslib/xilinx_pic.c index e672b600f315..39a93dc6375b 100644 --- a/arch/ppc/syslib/xilinx_pic.c +++ b/arch/ppc/syslib/xilinx_pic.c | |||
@@ -143,7 +143,7 @@ ppc4xx_pic_init(void) | |||
143 | ppc_md.get_irq = xilinx_pic_get_irq; | 143 | ppc_md.get_irq = xilinx_pic_get_irq; |
144 | 144 | ||
145 | for (i = 0; i < NR_IRQS; ++i) { | 145 | for (i = 0; i < NR_IRQS; ++i) { |
146 | irq_desc[i].handler = &xilinx_intc; | 146 | irq_desc[i].chip = &xilinx_intc; |
147 | 147 | ||
148 | if (XPAR_INTC_0_KIND_OF_INTR & (0x00000001 << i)) | 148 | if (XPAR_INTC_0_KIND_OF_INTR & (0x00000001 << i)) |
149 | irq_desc[i].status &= ~IRQ_LEVEL; | 149 | irq_desc[i].status &= ~IRQ_LEVEL; |
diff --git a/arch/s390/appldata/appldata.h b/arch/s390/appldata/appldata.h index e806a8922bbb..71d65eb30650 100644 --- a/arch/s390/appldata/appldata.h +++ b/arch/s390/appldata/appldata.h | |||
@@ -3,9 +3,9 @@ | |||
3 | * | 3 | * |
4 | * Definitions and interface for Linux - z/VM Monitor Stream. | 4 | * Definitions and interface for Linux - z/VM Monitor Stream. |
5 | * | 5 | * |
6 | * Copyright (C) 2003 IBM Corporation, IBM Deutschland Entwicklung GmbH. | 6 | * Copyright (C) 2003,2006 IBM Corporation, IBM Deutschland Entwicklung GmbH. |
7 | * | 7 | * |
8 | * Author: Gerald Schaefer <geraldsc@de.ibm.com> | 8 | * Author: Gerald Schaefer <gerald.schaefer@de.ibm.com> |
9 | */ | 9 | */ |
10 | 10 | ||
11 | //#define APPLDATA_DEBUG /* Debug messages on/off */ | 11 | //#define APPLDATA_DEBUG /* Debug messages on/off */ |
@@ -29,6 +29,22 @@ | |||
29 | #define CTL_APPLDATA_NET_SUM 2125 | 29 | #define CTL_APPLDATA_NET_SUM 2125 |
30 | #define CTL_APPLDATA_PROC 2126 | 30 | #define CTL_APPLDATA_PROC 2126 |
31 | 31 | ||
32 | #ifndef CONFIG_64BIT | ||
33 | |||
34 | #define APPLDATA_START_INTERVAL_REC 0x00 /* Function codes for */ | ||
35 | #define APPLDATA_STOP_REC 0x01 /* DIAG 0xDC */ | ||
36 | #define APPLDATA_GEN_EVENT_RECORD 0x02 | ||
37 | #define APPLDATA_START_CONFIG_REC 0x03 | ||
38 | |||
39 | #else | ||
40 | |||
41 | #define APPLDATA_START_INTERVAL_REC 0x80 | ||
42 | #define APPLDATA_STOP_REC 0x81 | ||
43 | #define APPLDATA_GEN_EVENT_RECORD 0x82 | ||
44 | #define APPLDATA_START_CONFIG_REC 0x83 | ||
45 | |||
46 | #endif /* CONFIG_64BIT */ | ||
47 | |||
32 | #define P_INFO(x...) printk(KERN_INFO MY_PRINT_NAME " info: " x) | 48 | #define P_INFO(x...) printk(KERN_INFO MY_PRINT_NAME " info: " x) |
33 | #define P_ERROR(x...) printk(KERN_ERR MY_PRINT_NAME " error: " x) | 49 | #define P_ERROR(x...) printk(KERN_ERR MY_PRINT_NAME " error: " x) |
34 | #define P_WARNING(x...) printk(KERN_WARNING MY_PRINT_NAME " status: " x) | 50 | #define P_WARNING(x...) printk(KERN_WARNING MY_PRINT_NAME " status: " x) |
@@ -53,7 +69,11 @@ struct appldata_ops { | |||
53 | void *data; /* record data */ | 69 | void *data; /* record data */ |
54 | unsigned int size; /* size of record */ | 70 | unsigned int size; /* size of record */ |
55 | struct module *owner; /* THIS_MODULE */ | 71 | struct module *owner; /* THIS_MODULE */ |
72 | char mod_lvl[2]; /* modification level, EBCDIC */ | ||
56 | }; | 73 | }; |
57 | 74 | ||
58 | extern int appldata_register_ops(struct appldata_ops *ops); | 75 | extern int appldata_register_ops(struct appldata_ops *ops); |
59 | extern void appldata_unregister_ops(struct appldata_ops *ops); | 76 | extern void appldata_unregister_ops(struct appldata_ops *ops); |
77 | extern int appldata_diag(char record_nr, u16 function, unsigned long buffer, | ||
78 | u16 length, char *mod_lvl); | ||
79 | |||
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index 54d35c130907..61bc44626c04 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
@@ -5,9 +5,9 @@ | |||
5 | * Exports appldata_register_ops() and appldata_unregister_ops() for the | 5 | * Exports appldata_register_ops() and appldata_unregister_ops() for the |
6 | * data gathering modules. | 6 | * data gathering modules. |
7 | * | 7 | * |
8 | * Copyright (C) 2003 IBM Corporation, IBM Deutschland Entwicklung GmbH. | 8 | * Copyright (C) 2003,2006 IBM Corporation, IBM Deutschland Entwicklung GmbH. |
9 | * | 9 | * |
10 | * Author: Gerald Schaefer <geraldsc@de.ibm.com> | 10 | * Author: Gerald Schaefer <gerald.schaefer@de.ibm.com> |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/config.h> | 13 | #include <linux/config.h> |
@@ -40,22 +40,6 @@ | |||
40 | 40 | ||
41 | #define TOD_MICRO 0x01000 /* nr. of TOD clock units | 41 | #define TOD_MICRO 0x01000 /* nr. of TOD clock units |
42 | for 1 microsecond */ | 42 | for 1 microsecond */ |
43 | #ifndef CONFIG_64BIT | ||
44 | |||
45 | #define APPLDATA_START_INTERVAL_REC 0x00 /* Function codes for */ | ||
46 | #define APPLDATA_STOP_REC 0x01 /* DIAG 0xDC */ | ||
47 | #define APPLDATA_GEN_EVENT_RECORD 0x02 | ||
48 | #define APPLDATA_START_CONFIG_REC 0x03 | ||
49 | |||
50 | #else | ||
51 | |||
52 | #define APPLDATA_START_INTERVAL_REC 0x80 | ||
53 | #define APPLDATA_STOP_REC 0x81 | ||
54 | #define APPLDATA_GEN_EVENT_RECORD 0x82 | ||
55 | #define APPLDATA_START_CONFIG_REC 0x83 | ||
56 | |||
57 | #endif /* CONFIG_64BIT */ | ||
58 | |||
59 | 43 | ||
60 | /* | 44 | /* |
61 | * Parameter list for DIAGNOSE X'DC' | 45 | * Parameter list for DIAGNOSE X'DC' |
@@ -195,8 +179,8 @@ static void appldata_work_fn(void *data) | |||
195 | * | 179 | * |
196 | * prepare parameter list, issue DIAG 0xDC | 180 | * prepare parameter list, issue DIAG 0xDC |
197 | */ | 181 | */ |
198 | static int appldata_diag(char record_nr, u16 function, unsigned long buffer, | 182 | int appldata_diag(char record_nr, u16 function, unsigned long buffer, |
199 | u16 length) | 183 | u16 length, char *mod_lvl) |
200 | { | 184 | { |
201 | unsigned long ry; | 185 | unsigned long ry; |
202 | struct appldata_product_id { | 186 | struct appldata_product_id { |
@@ -214,7 +198,7 @@ static int appldata_diag(char record_nr, u16 function, unsigned long buffer, | |||
214 | .record_nr = record_nr, | 198 | .record_nr = record_nr, |
215 | .version_nr = {0xF2, 0xF6}, /* "26" */ | 199 | .version_nr = {0xF2, 0xF6}, /* "26" */ |
216 | .release_nr = {0xF0, 0xF1}, /* "01" */ | 200 | .release_nr = {0xF0, 0xF1}, /* "01" */ |
217 | .mod_lvl = {0xF0, 0xF0}, /* "00" */ | 201 | .mod_lvl = {mod_lvl[0], mod_lvl[1]}, |
218 | }; | 202 | }; |
219 | struct appldata_parameter_list appldata_parameter_list = { | 203 | struct appldata_parameter_list appldata_parameter_list = { |
220 | .diag = 0xDC, | 204 | .diag = 0xDC, |
@@ -467,24 +451,25 @@ appldata_generic_handler(ctl_table *ctl, int write, struct file *filp, | |||
467 | module_put(ops->owner); | 451 | module_put(ops->owner); |
468 | return -ENODEV; | 452 | return -ENODEV; |
469 | } | 453 | } |
470 | ops->active = 1; | ||
471 | ops->callback(ops->data); // init record | 454 | ops->callback(ops->data); // init record |
472 | rc = appldata_diag(ops->record_nr, | 455 | rc = appldata_diag(ops->record_nr, |
473 | APPLDATA_START_INTERVAL_REC, | 456 | APPLDATA_START_INTERVAL_REC, |
474 | (unsigned long) ops->data, ops->size); | 457 | (unsigned long) ops->data, ops->size, |
458 | ops->mod_lvl); | ||
475 | if (rc != 0) { | 459 | if (rc != 0) { |
476 | P_ERROR("START DIAG 0xDC for %s failed, " | 460 | P_ERROR("START DIAG 0xDC for %s failed, " |
477 | "return code: %d\n", ops->name, rc); | 461 | "return code: %d\n", ops->name, rc); |
478 | module_put(ops->owner); | 462 | module_put(ops->owner); |
479 | ops->active = 0; | ||
480 | } else { | 463 | } else { |
481 | P_INFO("Monitoring %s data enabled, " | 464 | P_INFO("Monitoring %s data enabled, " |
482 | "DIAG 0xDC started.\n", ops->name); | 465 | "DIAG 0xDC started.\n", ops->name); |
466 | ops->active = 1; | ||
483 | } | 467 | } |
484 | } else if ((buf[0] == '0') && (ops->active == 1)) { | 468 | } else if ((buf[0] == '0') && (ops->active == 1)) { |
485 | ops->active = 0; | 469 | ops->active = 0; |
486 | rc = appldata_diag(ops->record_nr, APPLDATA_STOP_REC, | 470 | rc = appldata_diag(ops->record_nr, APPLDATA_STOP_REC, |
487 | (unsigned long) ops->data, ops->size); | 471 | (unsigned long) ops->data, ops->size, |
472 | ops->mod_lvl); | ||
488 | if (rc != 0) { | 473 | if (rc != 0) { |
489 | P_ERROR("STOP DIAG 0xDC for %s failed, " | 474 | P_ERROR("STOP DIAG 0xDC for %s failed, " |
490 | "return code: %d\n", ops->name, rc); | 475 | "return code: %d\n", ops->name, rc); |
@@ -633,7 +618,7 @@ appldata_offline_cpu(int cpu) | |||
633 | spin_unlock(&appldata_timer_lock); | 618 | spin_unlock(&appldata_timer_lock); |
634 | } | 619 | } |
635 | 620 | ||
636 | static int | 621 | static int __cpuinit |
637 | appldata_cpu_notify(struct notifier_block *self, | 622 | appldata_cpu_notify(struct notifier_block *self, |
638 | unsigned long action, void *hcpu) | 623 | unsigned long action, void *hcpu) |
639 | { | 624 | { |
@@ -710,7 +695,8 @@ static void __exit appldata_exit(void) | |||
710 | list_for_each(lh, &appldata_ops_list) { | 695 | list_for_each(lh, &appldata_ops_list) { |
711 | ops = list_entry(lh, struct appldata_ops, list); | 696 | ops = list_entry(lh, struct appldata_ops, list); |
712 | rc = appldata_diag(ops->record_nr, APPLDATA_STOP_REC, | 697 | rc = appldata_diag(ops->record_nr, APPLDATA_STOP_REC, |
713 | (unsigned long) ops->data, ops->size); | 698 | (unsigned long) ops->data, ops->size, |
699 | ops->mod_lvl); | ||
714 | if (rc != 0) { | 700 | if (rc != 0) { |
715 | P_ERROR("STOP DIAG 0xDC for %s failed, " | 701 | P_ERROR("STOP DIAG 0xDC for %s failed, " |
716 | "return code: %d\n", ops->name, rc); | 702 | "return code: %d\n", ops->name, rc); |
@@ -739,6 +725,7 @@ MODULE_DESCRIPTION("Linux-VM Monitor Stream, base infrastructure"); | |||
739 | 725 | ||
740 | EXPORT_SYMBOL_GPL(appldata_register_ops); | 726 | EXPORT_SYMBOL_GPL(appldata_register_ops); |
741 | EXPORT_SYMBOL_GPL(appldata_unregister_ops); | 727 | EXPORT_SYMBOL_GPL(appldata_unregister_ops); |
728 | EXPORT_SYMBOL_GPL(appldata_diag); | ||
742 | 729 | ||
743 | #ifdef MODULE | 730 | #ifdef MODULE |
744 | /* | 731 | /* |
@@ -779,7 +766,6 @@ unsigned long nr_iowait(void) | |||
779 | #endif /* MODULE */ | 766 | #endif /* MODULE */ |
780 | EXPORT_SYMBOL_GPL(si_swapinfo); | 767 | EXPORT_SYMBOL_GPL(si_swapinfo); |
781 | EXPORT_SYMBOL_GPL(nr_threads); | 768 | EXPORT_SYMBOL_GPL(nr_threads); |
782 | EXPORT_SYMBOL_GPL(avenrun); | ||
783 | EXPORT_SYMBOL_GPL(get_full_page_state); | 769 | EXPORT_SYMBOL_GPL(get_full_page_state); |
784 | EXPORT_SYMBOL_GPL(nr_running); | 770 | EXPORT_SYMBOL_GPL(nr_running); |
785 | EXPORT_SYMBOL_GPL(nr_iowait); | 771 | EXPORT_SYMBOL_GPL(nr_iowait); |
diff --git a/arch/s390/appldata/appldata_mem.c b/arch/s390/appldata/appldata_mem.c index f0e2fbed3d4c..7915a197d96d 100644 --- a/arch/s390/appldata/appldata_mem.c +++ b/arch/s390/appldata/appldata_mem.c | |||
@@ -4,9 +4,9 @@ | |||
4 | * Data gathering module for Linux-VM Monitor Stream, Stage 1. | 4 | * Data gathering module for Linux-VM Monitor Stream, Stage 1. |
5 | * Collects data related to memory management. | 5 | * Collects data related to memory management. |
6 | * | 6 | * |
7 | * Copyright (C) 2003 IBM Corporation, IBM Deutschland Entwicklung GmbH. | 7 | * Copyright (C) 2003,2006 IBM Corporation, IBM Deutschland Entwicklung GmbH. |
8 | * | 8 | * |
9 | * Author: Gerald Schaefer <geraldsc@de.ibm.com> | 9 | * Author: Gerald Schaefer <gerald.schaefer@de.ibm.com> |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/config.h> | 12 | #include <linux/config.h> |
@@ -152,6 +152,7 @@ static struct appldata_ops ops = { | |||
152 | .callback = &appldata_get_mem_data, | 152 | .callback = &appldata_get_mem_data, |
153 | .data = &appldata_mem_data, | 153 | .data = &appldata_mem_data, |
154 | .owner = THIS_MODULE, | 154 | .owner = THIS_MODULE, |
155 | .mod_lvl = {0xF0, 0xF0}, /* EBCDIC "00" */ | ||
155 | }; | 156 | }; |
156 | 157 | ||
157 | 158 | ||
diff --git a/arch/s390/appldata/appldata_net_sum.c b/arch/s390/appldata/appldata_net_sum.c index 2a4c7432db4a..39b7bdecbf05 100644 --- a/arch/s390/appldata/appldata_net_sum.c +++ b/arch/s390/appldata/appldata_net_sum.c | |||
@@ -5,9 +5,9 @@ | |||
5 | * Collects accumulated network statistics (Packets received/transmitted, | 5 | * Collects accumulated network statistics (Packets received/transmitted, |
6 | * dropped, errors, ...). | 6 | * dropped, errors, ...). |
7 | * | 7 | * |
8 | * Copyright (C) 2003 IBM Corporation, IBM Deutschland Entwicklung GmbH. | 8 | * Copyright (C) 2003,2006 IBM Corporation, IBM Deutschland Entwicklung GmbH. |
9 | * | 9 | * |
10 | * Author: Gerald Schaefer <geraldsc@de.ibm.com> | 10 | * Author: Gerald Schaefer <gerald.schaefer@de.ibm.com> |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/config.h> | 13 | #include <linux/config.h> |
@@ -152,6 +152,7 @@ static struct appldata_ops ops = { | |||
152 | .callback = &appldata_get_net_sum_data, | 152 | .callback = &appldata_get_net_sum_data, |
153 | .data = &appldata_net_sum_data, | 153 | .data = &appldata_net_sum_data, |
154 | .owner = THIS_MODULE, | 154 | .owner = THIS_MODULE, |
155 | .mod_lvl = {0xF0, 0xF0}, /* EBCDIC "00" */ | ||
155 | }; | 156 | }; |
156 | 157 | ||
157 | 158 | ||
diff --git a/arch/s390/appldata/appldata_os.c b/arch/s390/appldata/appldata_os.c index 99ddd3bf2fba..f2b44a2f1dec 100644 --- a/arch/s390/appldata/appldata_os.c +++ b/arch/s390/appldata/appldata_os.c | |||
@@ -4,9 +4,9 @@ | |||
4 | * Data gathering module for Linux-VM Monitor Stream, Stage 1. | 4 | * Data gathering module for Linux-VM Monitor Stream, Stage 1. |
5 | * Collects misc. OS related data (CPU utilization, running processes). | 5 | * Collects misc. OS related data (CPU utilization, running processes). |
6 | * | 6 | * |
7 | * Copyright (C) 2003 IBM Corporation, IBM Deutschland Entwicklung GmbH. | 7 | * Copyright (C) 2003,2006 IBM Corporation, IBM Deutschland Entwicklung GmbH. |
8 | * | 8 | * |
9 | * Author: Gerald Schaefer <geraldsc@de.ibm.com> | 9 | * Author: Gerald Schaefer <gerald.schaefer@de.ibm.com> |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/config.h> | 12 | #include <linux/config.h> |
@@ -44,11 +44,14 @@ struct appldata_os_per_cpu { | |||
44 | u32 per_cpu_system; /* ... spent in kernel mode */ | 44 | u32 per_cpu_system; /* ... spent in kernel mode */ |
45 | u32 per_cpu_idle; /* ... spent in idle mode */ | 45 | u32 per_cpu_idle; /* ... spent in idle mode */ |
46 | 46 | ||
47 | // New in 2.6 --> | 47 | /* New in 2.6 */ |
48 | u32 per_cpu_irq; /* ... spent in interrupts */ | 48 | u32 per_cpu_irq; /* ... spent in interrupts */ |
49 | u32 per_cpu_softirq; /* ... spent in softirqs */ | 49 | u32 per_cpu_softirq; /* ... spent in softirqs */ |
50 | u32 per_cpu_iowait; /* ... spent while waiting for I/O */ | 50 | u32 per_cpu_iowait; /* ... spent while waiting for I/O */ |
51 | // <-- New in 2.6 | 51 | |
52 | /* New in modification level 01 */ | ||
53 | u32 per_cpu_steal; /* ... stolen by hypervisor */ | ||
54 | u32 cpu_id; /* number of this CPU */ | ||
52 | } __attribute__((packed)); | 55 | } __attribute__((packed)); |
53 | 56 | ||
54 | struct appldata_os_data { | 57 | struct appldata_os_data { |
@@ -68,10 +71,9 @@ struct appldata_os_data { | |||
68 | u32 avenrun[3]; /* average nr. of running processes during */ | 71 | u32 avenrun[3]; /* average nr. of running processes during */ |
69 | /* the last 1, 5 and 15 minutes */ | 72 | /* the last 1, 5 and 15 minutes */ |
70 | 73 | ||
71 | // New in 2.6 --> | 74 | /* New in 2.6 */ |
72 | u32 nr_iowait; /* number of blocked threads | 75 | u32 nr_iowait; /* number of blocked threads |
73 | (waiting for I/O) */ | 76 | (waiting for I/O) */ |
74 | // <-- New in 2.6 | ||
75 | 77 | ||
76 | /* per cpu data */ | 78 | /* per cpu data */ |
77 | struct appldata_os_per_cpu os_cpu[0]; | 79 | struct appldata_os_per_cpu os_cpu[0]; |
@@ -79,6 +81,14 @@ struct appldata_os_data { | |||
79 | 81 | ||
80 | static struct appldata_os_data *appldata_os_data; | 82 | static struct appldata_os_data *appldata_os_data; |
81 | 83 | ||
84 | static struct appldata_ops ops = { | ||
85 | .ctl_nr = CTL_APPLDATA_OS, | ||
86 | .name = "os", | ||
87 | .record_nr = APPLDATA_RECORD_OS_ID, | ||
88 | .owner = THIS_MODULE, | ||
89 | .mod_lvl = {0xF0, 0xF1}, /* EBCDIC "01" */ | ||
90 | }; | ||
91 | |||
82 | 92 | ||
83 | static inline void appldata_print_debug(struct appldata_os_data *os_data) | 93 | static inline void appldata_print_debug(struct appldata_os_data *os_data) |
84 | { | 94 | { |
@@ -100,15 +110,17 @@ static inline void appldata_print_debug(struct appldata_os_data *os_data) | |||
100 | P_DEBUG("nr_cpus = %u\n", os_data->nr_cpus); | 110 | P_DEBUG("nr_cpus = %u\n", os_data->nr_cpus); |
101 | for (i = 0; i < os_data->nr_cpus; i++) { | 111 | for (i = 0; i < os_data->nr_cpus; i++) { |
102 | P_DEBUG("cpu%u : user = %u, nice = %u, system = %u, " | 112 | P_DEBUG("cpu%u : user = %u, nice = %u, system = %u, " |
103 | "idle = %u, irq = %u, softirq = %u, iowait = %u\n", | 113 | "idle = %u, irq = %u, softirq = %u, iowait = %u, " |
104 | i, | 114 | "steal = %u\n", |
115 | os_data->os_cpu[i].cpu_id, | ||
105 | os_data->os_cpu[i].per_cpu_user, | 116 | os_data->os_cpu[i].per_cpu_user, |
106 | os_data->os_cpu[i].per_cpu_nice, | 117 | os_data->os_cpu[i].per_cpu_nice, |
107 | os_data->os_cpu[i].per_cpu_system, | 118 | os_data->os_cpu[i].per_cpu_system, |
108 | os_data->os_cpu[i].per_cpu_idle, | 119 | os_data->os_cpu[i].per_cpu_idle, |
109 | os_data->os_cpu[i].per_cpu_irq, | 120 | os_data->os_cpu[i].per_cpu_irq, |
110 | os_data->os_cpu[i].per_cpu_softirq, | 121 | os_data->os_cpu[i].per_cpu_softirq, |
111 | os_data->os_cpu[i].per_cpu_iowait); | 122 | os_data->os_cpu[i].per_cpu_iowait, |
123 | os_data->os_cpu[i].per_cpu_steal); | ||
112 | } | 124 | } |
113 | 125 | ||
114 | P_DEBUG("sync_count_1 = %u\n", os_data->sync_count_1); | 126 | P_DEBUG("sync_count_1 = %u\n", os_data->sync_count_1); |
@@ -123,14 +135,13 @@ static inline void appldata_print_debug(struct appldata_os_data *os_data) | |||
123 | */ | 135 | */ |
124 | static void appldata_get_os_data(void *data) | 136 | static void appldata_get_os_data(void *data) |
125 | { | 137 | { |
126 | int i, j; | 138 | int i, j, rc; |
127 | struct appldata_os_data *os_data; | 139 | struct appldata_os_data *os_data; |
140 | unsigned int new_size; | ||
128 | 141 | ||
129 | os_data = data; | 142 | os_data = data; |
130 | os_data->sync_count_1++; | 143 | os_data->sync_count_1++; |
131 | 144 | ||
132 | os_data->nr_cpus = num_online_cpus(); | ||
133 | |||
134 | os_data->nr_threads = nr_threads; | 145 | os_data->nr_threads = nr_threads; |
135 | os_data->nr_running = nr_running(); | 146 | os_data->nr_running = nr_running(); |
136 | os_data->nr_iowait = nr_iowait(); | 147 | os_data->nr_iowait = nr_iowait(); |
@@ -154,9 +165,44 @@ static void appldata_get_os_data(void *data) | |||
154 | cputime_to_jiffies(kstat_cpu(i).cpustat.softirq); | 165 | cputime_to_jiffies(kstat_cpu(i).cpustat.softirq); |
155 | os_data->os_cpu[j].per_cpu_iowait = | 166 | os_data->os_cpu[j].per_cpu_iowait = |
156 | cputime_to_jiffies(kstat_cpu(i).cpustat.iowait); | 167 | cputime_to_jiffies(kstat_cpu(i).cpustat.iowait); |
168 | os_data->os_cpu[j].per_cpu_steal = | ||
169 | cputime_to_jiffies(kstat_cpu(i).cpustat.steal); | ||
170 | os_data->os_cpu[j].cpu_id = i; | ||
157 | j++; | 171 | j++; |
158 | } | 172 | } |
159 | 173 | ||
174 | os_data->nr_cpus = j; | ||
175 | |||
176 | new_size = sizeof(struct appldata_os_data) + | ||
177 | (os_data->nr_cpus * sizeof(struct appldata_os_per_cpu)); | ||
178 | if (ops.size != new_size) { | ||
179 | if (ops.active) { | ||
180 | rc = appldata_diag(APPLDATA_RECORD_OS_ID, | ||
181 | APPLDATA_START_INTERVAL_REC, | ||
182 | (unsigned long) ops.data, new_size, | ||
183 | ops.mod_lvl); | ||
184 | if (rc != 0) { | ||
185 | P_ERROR("os: START NEW DIAG 0xDC failed, " | ||
186 | "return code: %d, new size = %i\n", rc, | ||
187 | new_size); | ||
188 | P_INFO("os: stopping old record now\n"); | ||
189 | } else | ||
190 | P_INFO("os: new record size = %i\n", new_size); | ||
191 | |||
192 | rc = appldata_diag(APPLDATA_RECORD_OS_ID, | ||
193 | APPLDATA_STOP_REC, | ||
194 | (unsigned long) ops.data, ops.size, | ||
195 | ops.mod_lvl); | ||
196 | if (rc != 0) | ||
197 | P_ERROR("os: STOP OLD DIAG 0xDC failed, " | ||
198 | "return code: %d, old size = %i\n", rc, | ||
199 | ops.size); | ||
200 | else | ||
201 | P_INFO("os: old record size = %i stopped\n", | ||
202 | ops.size); | ||
203 | } | ||
204 | ops.size = new_size; | ||
205 | } | ||
160 | os_data->timestamp = get_clock(); | 206 | os_data->timestamp = get_clock(); |
161 | os_data->sync_count_2++; | 207 | os_data->sync_count_2++; |
162 | #ifdef APPLDATA_DEBUG | 208 | #ifdef APPLDATA_DEBUG |
@@ -165,15 +211,6 @@ static void appldata_get_os_data(void *data) | |||
165 | } | 211 | } |
166 | 212 | ||
167 | 213 | ||
168 | static struct appldata_ops ops = { | ||
169 | .ctl_nr = CTL_APPLDATA_OS, | ||
170 | .name = "os", | ||
171 | .record_nr = APPLDATA_RECORD_OS_ID, | ||
172 | .callback = &appldata_get_os_data, | ||
173 | .owner = THIS_MODULE, | ||
174 | }; | ||
175 | |||
176 | |||
177 | /* | 214 | /* |
178 | * appldata_os_init() | 215 | * appldata_os_init() |
179 | * | 216 | * |
@@ -181,26 +218,25 @@ static struct appldata_ops ops = { | |||
181 | */ | 218 | */ |
182 | static int __init appldata_os_init(void) | 219 | static int __init appldata_os_init(void) |
183 | { | 220 | { |
184 | int rc, size; | 221 | int rc, max_size; |
185 | 222 | ||
186 | size = sizeof(struct appldata_os_data) + | 223 | max_size = sizeof(struct appldata_os_data) + |
187 | (NR_CPUS * sizeof(struct appldata_os_per_cpu)); | 224 | (NR_CPUS * sizeof(struct appldata_os_per_cpu)); |
188 | if (size > APPLDATA_MAX_REC_SIZE) { | 225 | if (max_size > APPLDATA_MAX_REC_SIZE) { |
189 | P_ERROR("Size of record = %i, bigger than maximum (%i)!\n", | 226 | P_ERROR("Max. size of OS record = %i, bigger than maximum " |
190 | size, APPLDATA_MAX_REC_SIZE); | 227 | "record size (%i)\n", max_size, APPLDATA_MAX_REC_SIZE); |
191 | rc = -ENOMEM; | 228 | rc = -ENOMEM; |
192 | goto out; | 229 | goto out; |
193 | } | 230 | } |
194 | P_DEBUG("sizeof(os) = %i, sizeof(os_cpu) = %lu\n", size, | 231 | P_DEBUG("max. sizeof(os) = %i, sizeof(os_cpu) = %lu\n", max_size, |
195 | sizeof(struct appldata_os_per_cpu)); | 232 | sizeof(struct appldata_os_per_cpu)); |
196 | 233 | ||
197 | appldata_os_data = kmalloc(size, GFP_DMA); | 234 | appldata_os_data = kzalloc(max_size, GFP_DMA); |
198 | if (appldata_os_data == NULL) { | 235 | if (appldata_os_data == NULL) { |
199 | P_ERROR("No memory for %s!\n", ops.name); | 236 | P_ERROR("No memory for %s!\n", ops.name); |
200 | rc = -ENOMEM; | 237 | rc = -ENOMEM; |
201 | goto out; | 238 | goto out; |
202 | } | 239 | } |
203 | memset(appldata_os_data, 0, size); | ||
204 | 240 | ||
205 | appldata_os_data->per_cpu_size = sizeof(struct appldata_os_per_cpu); | 241 | appldata_os_data->per_cpu_size = sizeof(struct appldata_os_per_cpu); |
206 | appldata_os_data->cpu_offset = offsetof(struct appldata_os_data, | 242 | appldata_os_data->cpu_offset = offsetof(struct appldata_os_data, |
@@ -208,7 +244,7 @@ static int __init appldata_os_init(void) | |||
208 | P_DEBUG("cpu offset = %u\n", appldata_os_data->cpu_offset); | 244 | P_DEBUG("cpu offset = %u\n", appldata_os_data->cpu_offset); |
209 | 245 | ||
210 | ops.data = appldata_os_data; | 246 | ops.data = appldata_os_data; |
211 | ops.size = size; | 247 | ops.callback = &appldata_get_os_data; |
212 | rc = appldata_register_ops(&ops); | 248 | rc = appldata_register_ops(&ops); |
213 | if (rc != 0) { | 249 | if (rc != 0) { |
214 | P_ERROR("Error registering ops, rc = %i\n", rc); | 250 | P_ERROR("Error registering ops, rc = %i\n", rc); |
diff --git a/arch/s390/kernel/binfmt_elf32.c b/arch/s390/kernel/binfmt_elf32.c index 1f451c2cb071..12a6311e9838 100644 --- a/arch/s390/kernel/binfmt_elf32.c +++ b/arch/s390/kernel/binfmt_elf32.c | |||
@@ -177,11 +177,6 @@ struct elf_prpsinfo32 | |||
177 | 177 | ||
178 | #include <linux/highuid.h> | 178 | #include <linux/highuid.h> |
179 | 179 | ||
180 | #undef NEW_TO_OLD_UID | ||
181 | #undef NEW_TO_OLD_GID | ||
182 | #define NEW_TO_OLD_UID(uid) ((uid) > 65535) ? (u16)overflowuid : (u16)(uid) | ||
183 | #define NEW_TO_OLD_GID(gid) ((gid) > 65535) ? (u16)overflowgid : (u16)(gid) | ||
184 | |||
185 | #define elf_addr_t u32 | 180 | #define elf_addr_t u32 |
186 | /* | 181 | /* |
187 | #define init_elf_binfmt init_elf32_binfmt | 182 | #define init_elf_binfmt init_elf32_binfmt |
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index b2448487854c..aa8b52c2140f 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
@@ -93,13 +93,22 @@ STACK_SIZE = 1 << STACK_SHIFT | |||
93 | l %r13,__LC_SVC_NEW_PSW+4 # load &system_call to %r13 | 93 | l %r13,__LC_SVC_NEW_PSW+4 # load &system_call to %r13 |
94 | .endm | 94 | .endm |
95 | 95 | ||
96 | .macro SAVE_ALL psworg,savearea,sync | 96 | .macro SAVE_ALL_SYNC psworg,savearea |
97 | la %r12,\psworg | 97 | la %r12,\psworg |
98 | .if \sync | ||
99 | tm \psworg+1,0x01 # test problem state bit | 98 | tm \psworg+1,0x01 # test problem state bit |
100 | bz BASED(2f) # skip stack setup save | 99 | bz BASED(2f) # skip stack setup save |
101 | l %r15,__LC_KERNEL_STACK # problem state -> load ksp | 100 | l %r15,__LC_KERNEL_STACK # problem state -> load ksp |
102 | .else | 101 | #ifdef CONFIG_CHECK_STACK |
102 | b BASED(3f) | ||
103 | 2: tml %r15,STACK_SIZE - CONFIG_STACK_GUARD | ||
104 | bz BASED(stack_overflow) | ||
105 | 3: | ||
106 | #endif | ||
107 | 2: | ||
108 | .endm | ||
109 | |||
110 | .macro SAVE_ALL_ASYNC psworg,savearea | ||
111 | la %r12,\psworg | ||
103 | tm \psworg+1,0x01 # test problem state bit | 112 | tm \psworg+1,0x01 # test problem state bit |
104 | bnz BASED(1f) # from user -> load async stack | 113 | bnz BASED(1f) # from user -> load async stack |
105 | clc \psworg+4(4),BASED(.Lcritical_end) | 114 | clc \psworg+4(4),BASED(.Lcritical_end) |
@@ -115,7 +124,6 @@ STACK_SIZE = 1 << STACK_SHIFT | |||
115 | sra %r14,STACK_SHIFT | 124 | sra %r14,STACK_SHIFT |
116 | be BASED(2f) | 125 | be BASED(2f) |
117 | 1: l %r15,__LC_ASYNC_STACK | 126 | 1: l %r15,__LC_ASYNC_STACK |
118 | .endif | ||
119 | #ifdef CONFIG_CHECK_STACK | 127 | #ifdef CONFIG_CHECK_STACK |
120 | b BASED(3f) | 128 | b BASED(3f) |
121 | 2: tml %r15,STACK_SIZE - CONFIG_STACK_GUARD | 129 | 2: tml %r15,STACK_SIZE - CONFIG_STACK_GUARD |
@@ -196,7 +204,7 @@ system_call: | |||
196 | STORE_TIMER __LC_SYNC_ENTER_TIMER | 204 | STORE_TIMER __LC_SYNC_ENTER_TIMER |
197 | sysc_saveall: | 205 | sysc_saveall: |
198 | SAVE_ALL_BASE __LC_SAVE_AREA | 206 | SAVE_ALL_BASE __LC_SAVE_AREA |
199 | SAVE_ALL __LC_SVC_OLD_PSW,__LC_SAVE_AREA,1 | 207 | SAVE_ALL_SYNC __LC_SVC_OLD_PSW,__LC_SAVE_AREA |
200 | CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA | 208 | CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA |
201 | lh %r7,0x8a # get svc number from lowcore | 209 | lh %r7,0x8a # get svc number from lowcore |
202 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 210 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
@@ -425,7 +433,7 @@ pgm_check_handler: | |||
425 | SAVE_ALL_BASE __LC_SAVE_AREA | 433 | SAVE_ALL_BASE __LC_SAVE_AREA |
426 | tm __LC_PGM_INT_CODE+1,0x80 # check whether we got a per exception | 434 | tm __LC_PGM_INT_CODE+1,0x80 # check whether we got a per exception |
427 | bnz BASED(pgm_per) # got per exception -> special case | 435 | bnz BASED(pgm_per) # got per exception -> special case |
428 | SAVE_ALL __LC_PGM_OLD_PSW,__LC_SAVE_AREA,1 | 436 | SAVE_ALL_SYNC __LC_PGM_OLD_PSW,__LC_SAVE_AREA |
429 | CREATE_STACK_FRAME __LC_PGM_OLD_PSW,__LC_SAVE_AREA | 437 | CREATE_STACK_FRAME __LC_PGM_OLD_PSW,__LC_SAVE_AREA |
430 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 438 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
431 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? | 439 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? |
@@ -464,7 +472,7 @@ pgm_per: | |||
464 | # Normal per exception | 472 | # Normal per exception |
465 | # | 473 | # |
466 | pgm_per_std: | 474 | pgm_per_std: |
467 | SAVE_ALL __LC_PGM_OLD_PSW,__LC_SAVE_AREA,1 | 475 | SAVE_ALL_SYNC __LC_PGM_OLD_PSW,__LC_SAVE_AREA |
468 | CREATE_STACK_FRAME __LC_PGM_OLD_PSW,__LC_SAVE_AREA | 476 | CREATE_STACK_FRAME __LC_PGM_OLD_PSW,__LC_SAVE_AREA |
469 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 477 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
470 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? | 478 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? |
@@ -490,7 +498,7 @@ pgm_no_vtime2: | |||
490 | # it was a single stepped SVC that is causing all the trouble | 498 | # it was a single stepped SVC that is causing all the trouble |
491 | # | 499 | # |
492 | pgm_svcper: | 500 | pgm_svcper: |
493 | SAVE_ALL __LC_SVC_OLD_PSW,__LC_SAVE_AREA,1 | 501 | SAVE_ALL_SYNC __LC_SVC_OLD_PSW,__LC_SAVE_AREA |
494 | CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA | 502 | CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA |
495 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 503 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
496 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? | 504 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? |
@@ -519,7 +527,7 @@ io_int_handler: | |||
519 | STORE_TIMER __LC_ASYNC_ENTER_TIMER | 527 | STORE_TIMER __LC_ASYNC_ENTER_TIMER |
520 | stck __LC_INT_CLOCK | 528 | stck __LC_INT_CLOCK |
521 | SAVE_ALL_BASE __LC_SAVE_AREA+16 | 529 | SAVE_ALL_BASE __LC_SAVE_AREA+16 |
522 | SAVE_ALL __LC_IO_OLD_PSW,__LC_SAVE_AREA+16,0 | 530 | SAVE_ALL_ASYNC __LC_IO_OLD_PSW,__LC_SAVE_AREA+16 |
523 | CREATE_STACK_FRAME __LC_IO_OLD_PSW,__LC_SAVE_AREA+16 | 531 | CREATE_STACK_FRAME __LC_IO_OLD_PSW,__LC_SAVE_AREA+16 |
524 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 532 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
525 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? | 533 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? |
@@ -631,7 +639,7 @@ ext_int_handler: | |||
631 | STORE_TIMER __LC_ASYNC_ENTER_TIMER | 639 | STORE_TIMER __LC_ASYNC_ENTER_TIMER |
632 | stck __LC_INT_CLOCK | 640 | stck __LC_INT_CLOCK |
633 | SAVE_ALL_BASE __LC_SAVE_AREA+16 | 641 | SAVE_ALL_BASE __LC_SAVE_AREA+16 |
634 | SAVE_ALL __LC_EXT_OLD_PSW,__LC_SAVE_AREA+16,0 | 642 | SAVE_ALL_ASYNC __LC_EXT_OLD_PSW,__LC_SAVE_AREA+16 |
635 | CREATE_STACK_FRAME __LC_EXT_OLD_PSW,__LC_SAVE_AREA+16 | 643 | CREATE_STACK_FRAME __LC_EXT_OLD_PSW,__LC_SAVE_AREA+16 |
636 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 644 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
637 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? | 645 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? |
@@ -657,21 +665,31 @@ __critical_end: | |||
657 | .globl mcck_int_handler | 665 | .globl mcck_int_handler |
658 | mcck_int_handler: | 666 | mcck_int_handler: |
659 | spt __LC_CPU_TIMER_SAVE_AREA # revalidate cpu timer | 667 | spt __LC_CPU_TIMER_SAVE_AREA # revalidate cpu timer |
660 | mvc __LC_ASYNC_ENTER_TIMER(8),__LC_CPU_TIMER_SAVE_AREA | ||
661 | lm %r0,%r15,__LC_GPREGS_SAVE_AREA # revalidate gprs | 668 | lm %r0,%r15,__LC_GPREGS_SAVE_AREA # revalidate gprs |
662 | SAVE_ALL_BASE __LC_SAVE_AREA+32 | 669 | SAVE_ALL_BASE __LC_SAVE_AREA+32 |
663 | la %r12,__LC_MCK_OLD_PSW | 670 | la %r12,__LC_MCK_OLD_PSW |
664 | tm __LC_MCCK_CODE,0x80 # system damage? | 671 | tm __LC_MCCK_CODE,0x80 # system damage? |
665 | bo BASED(mcck_int_main) # yes -> rest of mcck code invalid | 672 | bo BASED(mcck_int_main) # yes -> rest of mcck code invalid |
666 | tm __LC_MCCK_CODE+5,0x02 # stored cpu timer value valid? | ||
667 | bo BASED(0f) | ||
668 | spt __LC_LAST_UPDATE_TIMER # revalidate cpu timer | ||
669 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 673 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
670 | mvc __LC_ASYNC_ENTER_TIMER(8),__LC_LAST_UPDATE_TIMER | 674 | mvc __LC_SAVE_AREA+52(8),__LC_ASYNC_ENTER_TIMER |
671 | mvc __LC_SYNC_ENTER_TIMER(8),__LC_LAST_UPDATE_TIMER | 675 | mvc __LC_ASYNC_ENTER_TIMER(8),__LC_CPU_TIMER_SAVE_AREA |
672 | mvc __LC_EXIT_TIMER(8),__LC_LAST_UPDATE_TIMER | 676 | tm __LC_MCCK_CODE+5,0x02 # stored cpu timer value valid? |
677 | bo BASED(1f) | ||
678 | la %r14,__LC_SYNC_ENTER_TIMER | ||
679 | clc 0(8,%r14),__LC_ASYNC_ENTER_TIMER | ||
680 | bl BASED(0f) | ||
681 | la %r14,__LC_ASYNC_ENTER_TIMER | ||
682 | 0: clc 0(8,%r14),__LC_EXIT_TIMER | ||
683 | bl BASED(0f) | ||
684 | la %r14,__LC_EXIT_TIMER | ||
685 | 0: clc 0(8,%r14),__LC_LAST_UPDATE_TIMER | ||
686 | bl BASED(0f) | ||
687 | la %r14,__LC_LAST_UPDATE_TIMER | ||
688 | 0: spt 0(%r14) | ||
689 | mvc __LC_ASYNC_ENTER_TIMER(8),0(%r14) | ||
690 | 1: | ||
673 | #endif | 691 | #endif |
674 | 0: tm __LC_MCCK_CODE+2,0x09 # mwp + ia of old psw valid? | 692 | tm __LC_MCCK_CODE+2,0x09 # mwp + ia of old psw valid? |
675 | bno BASED(mcck_int_main) # no -> skip cleanup critical | 693 | bno BASED(mcck_int_main) # no -> skip cleanup critical |
676 | tm __LC_MCK_OLD_PSW+1,0x01 # test problem state bit | 694 | tm __LC_MCK_OLD_PSW+1,0x01 # test problem state bit |
677 | bnz BASED(mcck_int_main) # from user -> load async stack | 695 | bnz BASED(mcck_int_main) # from user -> load async stack |
@@ -691,7 +709,7 @@ mcck_int_main: | |||
691 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 709 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
692 | tm __LC_MCCK_CODE+2,0x08 # mwp of old psw valid? | 710 | tm __LC_MCCK_CODE+2,0x08 # mwp of old psw valid? |
693 | bno BASED(mcck_no_vtime) # no -> skip cleanup critical | 711 | bno BASED(mcck_no_vtime) # no -> skip cleanup critical |
694 | tm __LC_MCK_OLD_PSW+1,0x01 # interrupting from user ? | 712 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? |
695 | bz BASED(mcck_no_vtime) | 713 | bz BASED(mcck_no_vtime) |
696 | UPDATE_VTIME __LC_EXIT_TIMER,__LC_ASYNC_ENTER_TIMER,__LC_USER_TIMER | 714 | UPDATE_VTIME __LC_EXIT_TIMER,__LC_ASYNC_ENTER_TIMER,__LC_USER_TIMER |
697 | UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER | 715 | UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER |
@@ -715,6 +733,20 @@ mcck_no_vtime: | |||
715 | l %r1,BASED(.Ls390_handle_mcck) | 733 | l %r1,BASED(.Ls390_handle_mcck) |
716 | basr %r14,%r1 # call machine check handler | 734 | basr %r14,%r1 # call machine check handler |
717 | mcck_return: | 735 | mcck_return: |
736 | mvc __LC_RETURN_MCCK_PSW(8),SP_PSW(%r15) # move return PSW | ||
737 | ni __LC_RETURN_MCCK_PSW+1,0xfd # clear wait state bit | ||
738 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | ||
739 | mvc __LC_ASYNC_ENTER_TIMER(8),__LC_SAVE_AREA+52 | ||
740 | tm __LC_RETURN_MCCK_PSW+1,0x01 # returning to user ? | ||
741 | bno BASED(0f) | ||
742 | lm %r0,%r15,SP_R0(%r15) # load gprs 0-15 | ||
743 | stpt __LC_EXIT_TIMER | ||
744 | lpsw __LC_RETURN_MCCK_PSW # back to caller | ||
745 | 0: | ||
746 | #endif | ||
747 | lm %r0,%r15,SP_R0(%r15) # load gprs 0-15 | ||
748 | lpsw __LC_RETURN_MCCK_PSW # back to caller | ||
749 | |||
718 | RESTORE_ALL __LC_RETURN_MCCK_PSW,0 | 750 | RESTORE_ALL __LC_RETURN_MCCK_PSW,0 |
719 | 751 | ||
720 | #ifdef CONFIG_SMP | 752 | #ifdef CONFIG_SMP |
@@ -781,6 +813,8 @@ cleanup_table_sysc_leave: | |||
781 | .long sysc_leave + 0x80000000, sysc_work_loop + 0x80000000 | 813 | .long sysc_leave + 0x80000000, sysc_work_loop + 0x80000000 |
782 | cleanup_table_sysc_work_loop: | 814 | cleanup_table_sysc_work_loop: |
783 | .long sysc_work_loop + 0x80000000, sysc_reschedule + 0x80000000 | 815 | .long sysc_work_loop + 0x80000000, sysc_reschedule + 0x80000000 |
816 | cleanup_table_io_return: | ||
817 | .long io_return + 0x80000000, io_leave + 0x80000000 | ||
784 | cleanup_table_io_leave: | 818 | cleanup_table_io_leave: |
785 | .long io_leave + 0x80000000, io_done + 0x80000000 | 819 | .long io_leave + 0x80000000, io_done + 0x80000000 |
786 | cleanup_table_io_work_loop: | 820 | cleanup_table_io_work_loop: |
@@ -807,6 +841,11 @@ cleanup_critical: | |||
807 | clc 4(4,%r12),BASED(cleanup_table_sysc_work_loop+4) | 841 | clc 4(4,%r12),BASED(cleanup_table_sysc_work_loop+4) |
808 | bl BASED(cleanup_sysc_return) | 842 | bl BASED(cleanup_sysc_return) |
809 | 0: | 843 | 0: |
844 | clc 4(4,%r12),BASED(cleanup_table_io_return) | ||
845 | bl BASED(0f) | ||
846 | clc 4(4,%r12),BASED(cleanup_table_io_return+4) | ||
847 | bl BASED(cleanup_io_return) | ||
848 | 0: | ||
810 | clc 4(4,%r12),BASED(cleanup_table_io_leave) | 849 | clc 4(4,%r12),BASED(cleanup_table_io_leave) |
811 | bl BASED(0f) | 850 | bl BASED(0f) |
812 | clc 4(4,%r12),BASED(cleanup_table_io_leave+4) | 851 | clc 4(4,%r12),BASED(cleanup_table_io_leave+4) |
@@ -839,7 +878,7 @@ cleanup_system_call: | |||
839 | mvc __LC_SAVE_AREA(16),0(%r12) | 878 | mvc __LC_SAVE_AREA(16),0(%r12) |
840 | 0: st %r13,4(%r12) | 879 | 0: st %r13,4(%r12) |
841 | st %r12,__LC_SAVE_AREA+48 # argh | 880 | st %r12,__LC_SAVE_AREA+48 # argh |
842 | SAVE_ALL __LC_SVC_OLD_PSW,__LC_SAVE_AREA,1 | 881 | SAVE_ALL_SYNC __LC_SVC_OLD_PSW,__LC_SAVE_AREA |
843 | CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA | 882 | CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA |
844 | l %r12,__LC_SAVE_AREA+48 # argh | 883 | l %r12,__LC_SAVE_AREA+48 # argh |
845 | st %r15,12(%r12) | 884 | st %r15,12(%r12) |
@@ -980,7 +1019,6 @@ cleanup_io_leave_insn: | |||
980 | .long cleanup_critical | 1019 | .long cleanup_critical |
981 | 1020 | ||
982 | #define SYSCALL(esa,esame,emu) .long esa | 1021 | #define SYSCALL(esa,esame,emu) .long esa |
983 | .globl sys_call_table | ||
984 | sys_call_table: | 1022 | sys_call_table: |
985 | #include "syscalls.S" | 1023 | #include "syscalls.S" |
986 | #undef SYSCALL | 1024 | #undef SYSCALL |
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index 2ac095bc0e25..f3222a1b2861 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -87,13 +87,22 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK | _TIF_NEED_RESCHED | \ | |||
87 | larl %r13,system_call | 87 | larl %r13,system_call |
88 | .endm | 88 | .endm |
89 | 89 | ||
90 | .macro SAVE_ALL psworg,savearea,sync | 90 | .macro SAVE_ALL_SYNC psworg,savearea |
91 | la %r12,\psworg | 91 | la %r12,\psworg |
92 | .if \sync | ||
93 | tm \psworg+1,0x01 # test problem state bit | 92 | tm \psworg+1,0x01 # test problem state bit |
94 | jz 2f # skip stack setup save | 93 | jz 2f # skip stack setup save |
95 | lg %r15,__LC_KERNEL_STACK # problem state -> load ksp | 94 | lg %r15,__LC_KERNEL_STACK # problem state -> load ksp |
96 | .else | 95 | #ifdef CONFIG_CHECK_STACK |
96 | j 3f | ||
97 | 2: tml %r15,STACK_SIZE - CONFIG_STACK_GUARD | ||
98 | jz stack_overflow | ||
99 | 3: | ||
100 | #endif | ||
101 | 2: | ||
102 | .endm | ||
103 | |||
104 | .macro SAVE_ALL_ASYNC psworg,savearea | ||
105 | la %r12,\psworg | ||
97 | tm \psworg+1,0x01 # test problem state bit | 106 | tm \psworg+1,0x01 # test problem state bit |
98 | jnz 1f # from user -> load kernel stack | 107 | jnz 1f # from user -> load kernel stack |
99 | clc \psworg+8(8),BASED(.Lcritical_end) | 108 | clc \psworg+8(8),BASED(.Lcritical_end) |
@@ -108,7 +117,6 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK | _TIF_NEED_RESCHED | \ | |||
108 | srag %r14,%r14,STACK_SHIFT | 117 | srag %r14,%r14,STACK_SHIFT |
109 | jz 2f | 118 | jz 2f |
110 | 1: lg %r15,__LC_ASYNC_STACK # load async stack | 119 | 1: lg %r15,__LC_ASYNC_STACK # load async stack |
111 | .endif | ||
112 | #ifdef CONFIG_CHECK_STACK | 120 | #ifdef CONFIG_CHECK_STACK |
113 | j 3f | 121 | j 3f |
114 | 2: tml %r15,STACK_SIZE - CONFIG_STACK_GUARD | 122 | 2: tml %r15,STACK_SIZE - CONFIG_STACK_GUARD |
@@ -187,7 +195,7 @@ system_call: | |||
187 | STORE_TIMER __LC_SYNC_ENTER_TIMER | 195 | STORE_TIMER __LC_SYNC_ENTER_TIMER |
188 | sysc_saveall: | 196 | sysc_saveall: |
189 | SAVE_ALL_BASE __LC_SAVE_AREA | 197 | SAVE_ALL_BASE __LC_SAVE_AREA |
190 | SAVE_ALL __LC_SVC_OLD_PSW,__LC_SAVE_AREA,1 | 198 | SAVE_ALL_SYNC __LC_SVC_OLD_PSW,__LC_SAVE_AREA |
191 | CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA | 199 | CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA |
192 | llgh %r7,__LC_SVC_INT_CODE # get svc number from lowcore | 200 | llgh %r7,__LC_SVC_INT_CODE # get svc number from lowcore |
193 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 201 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
@@ -446,7 +454,7 @@ pgm_check_handler: | |||
446 | SAVE_ALL_BASE __LC_SAVE_AREA | 454 | SAVE_ALL_BASE __LC_SAVE_AREA |
447 | tm __LC_PGM_INT_CODE+1,0x80 # check whether we got a per exception | 455 | tm __LC_PGM_INT_CODE+1,0x80 # check whether we got a per exception |
448 | jnz pgm_per # got per exception -> special case | 456 | jnz pgm_per # got per exception -> special case |
449 | SAVE_ALL __LC_PGM_OLD_PSW,__LC_SAVE_AREA,1 | 457 | SAVE_ALL_SYNC __LC_PGM_OLD_PSW,__LC_SAVE_AREA |
450 | CREATE_STACK_FRAME __LC_PGM_OLD_PSW,__LC_SAVE_AREA | 458 | CREATE_STACK_FRAME __LC_PGM_OLD_PSW,__LC_SAVE_AREA |
451 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 459 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
452 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? | 460 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? |
@@ -485,7 +493,7 @@ pgm_per: | |||
485 | # Normal per exception | 493 | # Normal per exception |
486 | # | 494 | # |
487 | pgm_per_std: | 495 | pgm_per_std: |
488 | SAVE_ALL __LC_PGM_OLD_PSW,__LC_SAVE_AREA,1 | 496 | SAVE_ALL_SYNC __LC_PGM_OLD_PSW,__LC_SAVE_AREA |
489 | CREATE_STACK_FRAME __LC_PGM_OLD_PSW,__LC_SAVE_AREA | 497 | CREATE_STACK_FRAME __LC_PGM_OLD_PSW,__LC_SAVE_AREA |
490 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 498 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
491 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? | 499 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? |
@@ -511,7 +519,7 @@ pgm_no_vtime2: | |||
511 | # it was a single stepped SVC that is causing all the trouble | 519 | # it was a single stepped SVC that is causing all the trouble |
512 | # | 520 | # |
513 | pgm_svcper: | 521 | pgm_svcper: |
514 | SAVE_ALL __LC_SVC_OLD_PSW,__LC_SAVE_AREA,1 | 522 | SAVE_ALL_SYNC __LC_SVC_OLD_PSW,__LC_SAVE_AREA |
515 | CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA | 523 | CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA |
516 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 524 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
517 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? | 525 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? |
@@ -539,7 +547,7 @@ io_int_handler: | |||
539 | STORE_TIMER __LC_ASYNC_ENTER_TIMER | 547 | STORE_TIMER __LC_ASYNC_ENTER_TIMER |
540 | stck __LC_INT_CLOCK | 548 | stck __LC_INT_CLOCK |
541 | SAVE_ALL_BASE __LC_SAVE_AREA+32 | 549 | SAVE_ALL_BASE __LC_SAVE_AREA+32 |
542 | SAVE_ALL __LC_IO_OLD_PSW,__LC_SAVE_AREA+32,0 | 550 | SAVE_ALL_ASYNC __LC_IO_OLD_PSW,__LC_SAVE_AREA+32 |
543 | CREATE_STACK_FRAME __LC_IO_OLD_PSW,__LC_SAVE_AREA+32 | 551 | CREATE_STACK_FRAME __LC_IO_OLD_PSW,__LC_SAVE_AREA+32 |
544 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 552 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
545 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? | 553 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? |
@@ -647,7 +655,7 @@ ext_int_handler: | |||
647 | STORE_TIMER __LC_ASYNC_ENTER_TIMER | 655 | STORE_TIMER __LC_ASYNC_ENTER_TIMER |
648 | stck __LC_INT_CLOCK | 656 | stck __LC_INT_CLOCK |
649 | SAVE_ALL_BASE __LC_SAVE_AREA+32 | 657 | SAVE_ALL_BASE __LC_SAVE_AREA+32 |
650 | SAVE_ALL __LC_EXT_OLD_PSW,__LC_SAVE_AREA+32,0 | 658 | SAVE_ALL_ASYNC __LC_EXT_OLD_PSW,__LC_SAVE_AREA+32 |
651 | CREATE_STACK_FRAME __LC_EXT_OLD_PSW,__LC_SAVE_AREA+32 | 659 | CREATE_STACK_FRAME __LC_EXT_OLD_PSW,__LC_SAVE_AREA+32 |
652 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 660 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
653 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? | 661 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? |
@@ -672,21 +680,32 @@ __critical_end: | |||
672 | mcck_int_handler: | 680 | mcck_int_handler: |
673 | la %r1,4095 # revalidate r1 | 681 | la %r1,4095 # revalidate r1 |
674 | spt __LC_CPU_TIMER_SAVE_AREA-4095(%r1) # revalidate cpu timer | 682 | spt __LC_CPU_TIMER_SAVE_AREA-4095(%r1) # revalidate cpu timer |
675 | mvc __LC_ASYNC_ENTER_TIMER(8),__LC_CPU_TIMER_SAVE_AREA-4095(%r1) | ||
676 | lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# revalidate gprs | 683 | lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# revalidate gprs |
677 | SAVE_ALL_BASE __LC_SAVE_AREA+64 | 684 | SAVE_ALL_BASE __LC_SAVE_AREA+64 |
678 | la %r12,__LC_MCK_OLD_PSW | 685 | la %r12,__LC_MCK_OLD_PSW |
679 | tm __LC_MCCK_CODE,0x80 # system damage? | 686 | tm __LC_MCCK_CODE,0x80 # system damage? |
680 | jo mcck_int_main # yes -> rest of mcck code invalid | 687 | jo mcck_int_main # yes -> rest of mcck code invalid |
681 | tm __LC_MCCK_CODE+5,0x02 # stored cpu timer value valid? | ||
682 | jo 0f | ||
683 | spt __LC_LAST_UPDATE_TIMER | ||
684 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 688 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
685 | mvc __LC_ASYNC_ENTER_TIMER(8),__LC_LAST_UPDATE_TIMER | 689 | la %r14,4095 |
686 | mvc __LC_SYNC_ENTER_TIMER(8),__LC_LAST_UPDATE_TIMER | 690 | mvc __LC_SAVE_AREA+104(8),__LC_ASYNC_ENTER_TIMER |
687 | mvc __LC_EXIT_TIMER(8),__LC_LAST_UPDATE_TIMER | 691 | mvc __LC_ASYNC_ENTER_TIMER(8),__LC_CPU_TIMER_SAVE_AREA-4095(%r14) |
692 | tm __LC_MCCK_CODE+5,0x02 # stored cpu timer value valid? | ||
693 | jo 1f | ||
694 | la %r14,__LC_SYNC_ENTER_TIMER | ||
695 | clc 0(8,%r14),__LC_ASYNC_ENTER_TIMER | ||
696 | jl 0f | ||
697 | la %r14,__LC_ASYNC_ENTER_TIMER | ||
698 | 0: clc 0(8,%r14),__LC_EXIT_TIMER | ||
699 | jl 0f | ||
700 | la %r14,__LC_EXIT_TIMER | ||
701 | 0: clc 0(8,%r14),__LC_LAST_UPDATE_TIMER | ||
702 | jl 0f | ||
703 | la %r14,__LC_LAST_UPDATE_TIMER | ||
704 | 0: spt 0(%r14) | ||
705 | mvc __LC_ASYNC_ENTER_TIMER(8),0(%r14) | ||
706 | 1: | ||
688 | #endif | 707 | #endif |
689 | 0: tm __LC_MCCK_CODE+2,0x09 # mwp + ia of old psw valid? | 708 | tm __LC_MCCK_CODE+2,0x09 # mwp + ia of old psw valid? |
690 | jno mcck_int_main # no -> skip cleanup critical | 709 | jno mcck_int_main # no -> skip cleanup critical |
691 | tm __LC_MCK_OLD_PSW+1,0x01 # test problem state bit | 710 | tm __LC_MCK_OLD_PSW+1,0x01 # test problem state bit |
692 | jnz mcck_int_main # from user -> load kernel stack | 711 | jnz mcck_int_main # from user -> load kernel stack |
@@ -705,7 +724,7 @@ mcck_int_main: | |||
705 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 724 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
706 | tm __LC_MCCK_CODE+2,0x08 # mwp of old psw valid? | 725 | tm __LC_MCCK_CODE+2,0x08 # mwp of old psw valid? |
707 | jno mcck_no_vtime # no -> no timer update | 726 | jno mcck_no_vtime # no -> no timer update |
708 | tm __LC_MCK_OLD_PSW+1,0x01 # interrupting from user ? | 727 | tm SP_PSW+1(%r15),0x01 # interrupting from user ? |
709 | jz mcck_no_vtime | 728 | jz mcck_no_vtime |
710 | UPDATE_VTIME __LC_EXIT_TIMER,__LC_ASYNC_ENTER_TIMER,__LC_USER_TIMER | 729 | UPDATE_VTIME __LC_EXIT_TIMER,__LC_ASYNC_ENTER_TIMER,__LC_USER_TIMER |
711 | UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER | 730 | UPDATE_VTIME __LC_LAST_UPDATE_TIMER,__LC_EXIT_TIMER,__LC_SYSTEM_TIMER |
@@ -727,7 +746,17 @@ mcck_no_vtime: | |||
727 | jno mcck_return | 746 | jno mcck_return |
728 | brasl %r14,s390_handle_mcck | 747 | brasl %r14,s390_handle_mcck |
729 | mcck_return: | 748 | mcck_return: |
730 | RESTORE_ALL __LC_RETURN_MCCK_PSW,0 | 749 | mvc __LC_RETURN_MCCK_PSW(16),SP_PSW(%r15) # move return PSW |
750 | ni __LC_RETURN_MCCK_PSW+1,0xfd # clear wait state bit | ||
751 | lmg %r0,%r15,SP_R0(%r15) # load gprs 0-15 | ||
752 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | ||
753 | mvc __LC_ASYNC_ENTER_TIMER(8),__LC_SAVE_AREA+104 | ||
754 | tm __LC_RETURN_MCCK_PSW+1,0x01 # returning to user ? | ||
755 | jno 0f | ||
756 | stpt __LC_EXIT_TIMER | ||
757 | 0: | ||
758 | #endif | ||
759 | lpswe __LC_RETURN_MCCK_PSW # back to caller | ||
731 | 760 | ||
732 | #ifdef CONFIG_SMP | 761 | #ifdef CONFIG_SMP |
733 | /* | 762 | /* |
@@ -789,6 +818,8 @@ cleanup_table_sysc_leave: | |||
789 | .quad sysc_leave, sysc_work_loop | 818 | .quad sysc_leave, sysc_work_loop |
790 | cleanup_table_sysc_work_loop: | 819 | cleanup_table_sysc_work_loop: |
791 | .quad sysc_work_loop, sysc_reschedule | 820 | .quad sysc_work_loop, sysc_reschedule |
821 | cleanup_table_io_return: | ||
822 | .quad io_return, io_leave | ||
792 | cleanup_table_io_leave: | 823 | cleanup_table_io_leave: |
793 | .quad io_leave, io_done | 824 | .quad io_leave, io_done |
794 | cleanup_table_io_work_loop: | 825 | cleanup_table_io_work_loop: |
@@ -815,6 +846,11 @@ cleanup_critical: | |||
815 | clc 8(8,%r12),BASED(cleanup_table_sysc_work_loop+8) | 846 | clc 8(8,%r12),BASED(cleanup_table_sysc_work_loop+8) |
816 | jl cleanup_sysc_return | 847 | jl cleanup_sysc_return |
817 | 0: | 848 | 0: |
849 | clc 8(8,%r12),BASED(cleanup_table_io_return) | ||
850 | jl 0f | ||
851 | clc 8(8,%r12),BASED(cleanup_table_io_return+8) | ||
852 | jl cleanup_io_return | ||
853 | 0: | ||
818 | clc 8(8,%r12),BASED(cleanup_table_io_leave) | 854 | clc 8(8,%r12),BASED(cleanup_table_io_leave) |
819 | jl 0f | 855 | jl 0f |
820 | clc 8(8,%r12),BASED(cleanup_table_io_leave+8) | 856 | clc 8(8,%r12),BASED(cleanup_table_io_leave+8) |
@@ -847,7 +883,7 @@ cleanup_system_call: | |||
847 | mvc __LC_SAVE_AREA(32),0(%r12) | 883 | mvc __LC_SAVE_AREA(32),0(%r12) |
848 | 0: stg %r13,8(%r12) | 884 | 0: stg %r13,8(%r12) |
849 | stg %r12,__LC_SAVE_AREA+96 # argh | 885 | stg %r12,__LC_SAVE_AREA+96 # argh |
850 | SAVE_ALL __LC_SVC_OLD_PSW,__LC_SAVE_AREA,1 | 886 | SAVE_ALL_SYNC __LC_SVC_OLD_PSW,__LC_SAVE_AREA |
851 | CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA | 887 | CREATE_STACK_FRAME __LC_SVC_OLD_PSW,__LC_SAVE_AREA |
852 | lg %r12,__LC_SAVE_AREA+96 # argh | 888 | lg %r12,__LC_SAVE_AREA+96 # argh |
853 | stg %r15,24(%r12) | 889 | stg %r15,24(%r12) |
@@ -957,7 +993,6 @@ cleanup_io_leave_insn: | |||
957 | .quad __critical_end | 993 | .quad __critical_end |
958 | 994 | ||
959 | #define SYSCALL(esa,esame,emu) .long esame | 995 | #define SYSCALL(esa,esame,emu) .long esame |
960 | .globl sys_call_table | ||
961 | sys_call_table: | 996 | sys_call_table: |
962 | #include "syscalls.S" | 997 | #include "syscalls.S" |
963 | #undef SYSCALL | 998 | #undef SYSCALL |
@@ -965,7 +1000,6 @@ sys_call_table: | |||
965 | #ifdef CONFIG_COMPAT | 1000 | #ifdef CONFIG_COMPAT |
966 | 1001 | ||
967 | #define SYSCALL(esa,esame,emu) .long emu | 1002 | #define SYSCALL(esa,esame,emu) .long emu |
968 | .globl sys_call_table_emu | ||
969 | sys_call_table_emu: | 1003 | sys_call_table_emu: |
970 | #include "syscalls.S" | 1004 | #include "syscalls.S" |
971 | #undef SYSCALL | 1005 | #undef SYSCALL |
diff --git a/arch/s390/kernel/head.S b/arch/s390/kernel/head.S index ea88d066bf04..538c82da49b1 100644 --- a/arch/s390/kernel/head.S +++ b/arch/s390/kernel/head.S | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * arch/s390/kernel/head.S | 2 | * arch/s390/kernel/head.S |
3 | * | 3 | * |
4 | * (C) Copyright IBM Corp. 1999, 2005 | 4 | * Copyright (C) IBM Corp. 1999,2006 |
5 | * | 5 | * |
6 | * Author(s): Hartmut Penner <hp@de.ibm.com> | 6 | * Author(s): Hartmut Penner <hp@de.ibm.com> |
7 | * Martin Schwidefsky <schwidefsky@de.ibm.com> | 7 | * Martin Schwidefsky <schwidefsky@de.ibm.com> |
@@ -482,24 +482,23 @@ start: | |||
482 | 482 | ||
483 | .macro GET_IPL_DEVICE | 483 | .macro GET_IPL_DEVICE |
484 | .Lget_ipl_device: | 484 | .Lget_ipl_device: |
485 | basr %r12,0 | 485 | l %r1,0xb8 # get sid |
486 | .LGID: l %r1,0xb8 # get sid | ||
487 | sll %r1,15 # test if subchannel is enabled | 486 | sll %r1,15 # test if subchannel is enabled |
488 | srl %r1,31 | 487 | srl %r1,31 |
489 | ltr %r1,%r1 | 488 | ltr %r1,%r1 |
490 | bz 0(%r14) # subchannel disabled | 489 | bz 2f-.LPG1(%r13) # subchannel disabled |
491 | l %r1,0xb8 | 490 | l %r1,0xb8 |
492 | la %r5,.Lipl_schib-.LGID(%r12) | 491 | la %r5,.Lipl_schib-.LPG1(%r13) |
493 | stsch 0(%r5) # get schib of subchannel | 492 | stsch 0(%r5) # get schib of subchannel |
494 | bnz 0(%r14) # schib not available | 493 | bnz 2f-.LPG1(%r13) # schib not available |
495 | tm 5(%r5),0x01 # devno valid? | 494 | tm 5(%r5),0x01 # devno valid? |
496 | bno 0(%r14) | 495 | bno 2f-.LPG1(%r13) |
497 | la %r6,ipl_parameter_flags-.LGID(%r12) | 496 | la %r6,ipl_parameter_flags-.LPG1(%r13) |
498 | oi 3(%r6),0x01 # set flag | 497 | oi 3(%r6),0x01 # set flag |
499 | la %r2,ipl_devno-.LGID(%r12) | 498 | la %r2,ipl_devno-.LPG1(%r13) |
500 | mvc 0(2,%r2),6(%r5) # store devno | 499 | mvc 0(2,%r2),6(%r5) # store devno |
501 | tm 4(%r5),0x80 # qdio capable device? | 500 | tm 4(%r5),0x80 # qdio capable device? |
502 | bno 0(%r14) | 501 | bno 2f-.LPG1(%r13) |
503 | oi 3(%r6),0x02 # set flag | 502 | oi 3(%r6),0x02 # set flag |
504 | 503 | ||
505 | # copy ipl parameters | 504 | # copy ipl parameters |
@@ -523,7 +522,7 @@ start: | |||
523 | ar %r2,%r1 | 522 | ar %r2,%r1 |
524 | sr %r0,%r4 | 523 | sr %r0,%r4 |
525 | jne 1b | 524 | jne 1b |
526 | b 0(%r14) | 525 | b 2f-.LPG1(%r13) |
527 | 526 | ||
528 | .align 4 | 527 | .align 4 |
529 | .Lipl_schib: | 528 | .Lipl_schib: |
@@ -537,6 +536,7 @@ ipl_parameter_flags: | |||
537 | .globl ipl_devno | 536 | .globl ipl_devno |
538 | ipl_devno: | 537 | ipl_devno: |
539 | .word 0 | 538 | .word 0 |
539 | 2: | ||
540 | .endm | 540 | .endm |
541 | 541 | ||
542 | #ifdef CONFIG_64BIT | 542 | #ifdef CONFIG_64BIT |
diff --git a/arch/s390/kernel/head31.S b/arch/s390/kernel/head31.S index 2d3b089bfb83..d00de17b3778 100644 --- a/arch/s390/kernel/head31.S +++ b/arch/s390/kernel/head31.S | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * arch/s390/kernel/head31.S | 2 | * arch/s390/kernel/head31.S |
3 | * | 3 | * |
4 | * (C) Copyright IBM Corp. 2005 | 4 | * Copyright (C) IBM Corp. 2005,2006 |
5 | * | 5 | * |
6 | * Author(s): Hartmut Penner <hp@de.ibm.com> | 6 | * Author(s): Hartmut Penner <hp@de.ibm.com> |
7 | * Martin Schwidefsky <schwidefsky@de.ibm.com> | 7 | * Martin Schwidefsky <schwidefsky@de.ibm.com> |
@@ -16,12 +16,31 @@ | |||
16 | # or linload or SALIPL | 16 | # or linload or SALIPL |
17 | # | 17 | # |
18 | .org 0x10000 | 18 | .org 0x10000 |
19 | startup:basr %r13,0 # get base | 19 | startup:basr %r13,0 # get base |
20 | .LPG1: l %r1, .Lget_ipl_device_addr-.LPG1(%r13) | 20 | .LPG0: l %r13,0f-.LPG0(%r13) |
21 | basr %r14, %r1 | 21 | b 0(%r13) |
22 | 0: .long startup_continue | ||
23 | |||
24 | # | ||
25 | # params at 10400 (setup.h) | ||
26 | # | ||
27 | .org PARMAREA | ||
28 | .long 0,0 # IPL_DEVICE | ||
29 | .long 0,RAMDISK_ORIGIN # INITRD_START | ||
30 | .long 0,RAMDISK_SIZE # INITRD_SIZE | ||
31 | |||
32 | .org COMMAND_LINE | ||
33 | .byte "root=/dev/ram0 ro" | ||
34 | .byte 0 | ||
35 | |||
36 | .org 0x11000 | ||
37 | |||
38 | startup_continue: | ||
39 | basr %r13,0 # get base | ||
40 | .LPG1: GET_IPL_DEVICE | ||
22 | lctl %c0,%c15,.Lctl-.LPG1(%r13) # load control registers | 41 | lctl %c0,%c15,.Lctl-.LPG1(%r13) # load control registers |
23 | la %r12,_pstart-.LPG1(%r13) # pointer to parameter area | 42 | l %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area |
24 | # move IPL device to lowcore | 43 | # move IPL device to lowcore |
25 | mvc __LC_IPLDEV(4),IPL_DEVICE-PARMAREA(%r12) | 44 | mvc __LC_IPLDEV(4),IPL_DEVICE-PARMAREA(%r12) |
26 | 45 | ||
27 | # | 46 | # |
@@ -51,8 +70,8 @@ startup:basr %r13,0 # get base | |||
51 | a %r1,__LC_EXT_NEW_PSW+4 # set handler | 70 | a %r1,__LC_EXT_NEW_PSW+4 # set handler |
52 | st %r1,__LC_EXT_NEW_PSW+4 | 71 | st %r1,__LC_EXT_NEW_PSW+4 |
53 | 72 | ||
54 | la %r4,_pstart-.LPG1(%r13) # %r4 is our index for sccb stuff | 73 | l %r4,.Lsccbaddr-.LPG1(%r13) # %r4 is our index for sccb stuff |
55 | la %r1, .Lsccb-PARMAREA(%r4) # our sccb | 74 | lr %r1,%r4 # our sccb |
56 | .insn rre,0xb2200000,%r2,%r1 # service call | 75 | .insn rre,0xb2200000,%r2,%r1 # service call |
57 | ipm %r1 | 76 | ipm %r1 |
58 | srl %r1,28 # get cc code | 77 | srl %r1,28 # get cc code |
@@ -63,7 +82,7 @@ startup:basr %r13,0 # get base | |||
63 | be .Lservicecall-.LPG1(%r13) | 82 | be .Lservicecall-.LPG1(%r13) |
64 | lpsw .Lwaitsclp-.LPG1(%r13) | 83 | lpsw .Lwaitsclp-.LPG1(%r13) |
65 | .Lsclph: | 84 | .Lsclph: |
66 | lh %r1,.Lsccbr-PARMAREA(%r4) | 85 | lh %r1,.Lsccbr-.Lsccb(%r4) |
67 | chi %r1,0x10 # 0x0010 is the sucess code | 86 | chi %r1,0x10 # 0x0010 is the sucess code |
68 | je .Lprocsccb # let's process the sccb | 87 | je .Lprocsccb # let's process the sccb |
69 | chi %r1,0x1f0 | 88 | chi %r1,0x1f0 |
@@ -74,7 +93,7 @@ startup:basr %r13,0 # get base | |||
74 | b .Lservicecall-.LPG1(%r13) | 93 | b .Lservicecall-.LPG1(%r13) |
75 | .Lprocsccb: | 94 | .Lprocsccb: |
76 | lhi %r1,0 | 95 | lhi %r1,0 |
77 | icm %r1,3,.Lscpincr1-PARMAREA(%r4) # use this one if != 0 | 96 | icm %r1,3,.Lscpincr1-.Lsccb(%r4) # use this one if != 0 |
78 | jnz .Lscnd | 97 | jnz .Lscnd |
79 | lhi %r1,0x800 # otherwise report 2GB | 98 | lhi %r1,0x800 # otherwise report 2GB |
80 | .Lscnd: | 99 | .Lscnd: |
@@ -84,10 +103,10 @@ startup:basr %r13,0 # get base | |||
84 | lr %r1,%r3 | 103 | lr %r1,%r3 |
85 | .Lno2gb: | 104 | .Lno2gb: |
86 | xr %r3,%r3 # same logic | 105 | xr %r3,%r3 # same logic |
87 | ic %r3,.Lscpa1-PARMAREA(%r4) | 106 | ic %r3,.Lscpa1-.Lsccb(%r4) |
88 | chi %r3,0x00 | 107 | chi %r3,0x00 |
89 | jne .Lcompmem | 108 | jne .Lcompmem |
90 | l %r3,.Lscpa2-PARMAREA(%r13) | 109 | l %r3,.Lscpa2-.Lsccb(%r4) |
91 | .Lcompmem: | 110 | .Lcompmem: |
92 | mr %r2,%r1 # mem in MB on 128-bit | 111 | mr %r2,%r1 # mem in MB on 128-bit |
93 | l %r1,.Lonemb-.LPG1(%r13) | 112 | l %r1,.Lonemb-.LPG1(%r13) |
@@ -95,8 +114,6 @@ startup:basr %r13,0 # get base | |||
95 | b .Lfchunk-.LPG1(%r13) | 114 | b .Lfchunk-.LPG1(%r13) |
96 | 115 | ||
97 | .align 4 | 116 | .align 4 |
98 | .Lget_ipl_device_addr: | ||
99 | .long .Lget_ipl_device | ||
100 | .Lpmask: | 117 | .Lpmask: |
101 | .byte 0 | 118 | .byte 0 |
102 | .align 8 | 119 | .align 8 |
@@ -242,6 +259,8 @@ startup:basr %r13,0 # get base | |||
242 | .long 0 # cr13: home space segment table | 259 | .long 0 # cr13: home space segment table |
243 | .long 0xc0000000 # cr14: machine check handling off | 260 | .long 0xc0000000 # cr14: machine check handling off |
244 | .long 0 # cr15: linkage stack operations | 261 | .long 0 # cr15: linkage stack operations |
262 | .Lduct: .long 0,0,0,0,0,0,0,0 | ||
263 | .long 0,0,0,0,0,0,0,0 | ||
245 | .Lpcmem:.long 0x00080000,0x80000000 + .Lchkmem | 264 | .Lpcmem:.long 0x00080000,0x80000000 + .Lchkmem |
246 | .Lpcfpu:.long 0x00080000,0x80000000 + .Lchkfpu | 265 | .Lpcfpu:.long 0x00080000,0x80000000 + .Lchkfpu |
247 | .Lpccsp:.long 0x00080000,0x80000000 + .Lchkcsp | 266 | .Lpccsp:.long 0x00080000,0x80000000 + .Lchkcsp |
@@ -252,25 +271,9 @@ startup:basr %r13,0 # get base | |||
252 | .Lmflags:.long machine_flags | 271 | .Lmflags:.long machine_flags |
253 | .Lbss_bgn: .long __bss_start | 272 | .Lbss_bgn: .long __bss_start |
254 | .Lbss_end: .long _end | 273 | .Lbss_end: .long _end |
255 | 274 | .Lparmaddr: .long PARMAREA | |
256 | .org PARMAREA-64 | 275 | .Lsccbaddr: .long .Lsccb |
257 | .Lduct: .long 0,0,0,0,0,0,0,0 | 276 | .align 4096 |
258 | .long 0,0,0,0,0,0,0,0 | ||
259 | |||
260 | # | ||
261 | # params at 10400 (setup.h) | ||
262 | # | ||
263 | .org PARMAREA | ||
264 | .global _pstart | ||
265 | _pstart: | ||
266 | .long 0,0 # IPL_DEVICE | ||
267 | .long 0,RAMDISK_ORIGIN # INITRD_START | ||
268 | .long 0,RAMDISK_SIZE # INITRD_SIZE | ||
269 | |||
270 | .org COMMAND_LINE | ||
271 | .byte "root=/dev/ram0 ro" | ||
272 | .byte 0 | ||
273 | .org 0x11000 | ||
274 | .Lsccb: | 277 | .Lsccb: |
275 | .hword 0x1000 # length, one page | 278 | .hword 0x1000 # length, one page |
276 | .byte 0x00,0x00,0x00 | 279 | .byte 0x00,0x00,0x00 |
@@ -287,18 +290,14 @@ _pstart: | |||
287 | .Lscpincr2: | 290 | .Lscpincr2: |
288 | .quad 0x00 | 291 | .quad 0x00 |
289 | .fill 3984,1,0 | 292 | .fill 3984,1,0 |
290 | .org 0x12000 | 293 | .align 4096 |
291 | .global _pend | ||
292 | _pend: | ||
293 | |||
294 | GET_IPL_DEVICE | ||
295 | 294 | ||
296 | #ifdef CONFIG_SHARED_KERNEL | 295 | #ifdef CONFIG_SHARED_KERNEL |
297 | .org 0x100000 | 296 | .org 0x100000 |
298 | #endif | 297 | #endif |
299 | 298 | ||
300 | # | 299 | # |
301 | # startup-code, running in virtual mode | 300 | # startup-code, running in absolute addressing mode |
302 | # | 301 | # |
303 | .globl _stext | 302 | .globl _stext |
304 | _stext: basr %r13,0 # get base | 303 | _stext: basr %r13,0 # get base |
diff --git a/arch/s390/kernel/head64.S b/arch/s390/kernel/head64.S index f08c06f45d5c..47744fcca930 100644 --- a/arch/s390/kernel/head64.S +++ b/arch/s390/kernel/head64.S | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * arch/s390/kernel/head64.S | 2 | * arch/s390/kernel/head64.S |
3 | * | 3 | * |
4 | * (C) Copyright IBM Corp. 1999,2005 | 4 | * Copyright (C) IBM Corp. 1999,2006 |
5 | * | 5 | * |
6 | * Author(s): Hartmut Penner <hp@de.ibm.com> | 6 | * Author(s): Hartmut Penner <hp@de.ibm.com> |
7 | * Martin Schwidefsky <schwidefsky@de.ibm.com> | 7 | * Martin Schwidefsky <schwidefsky@de.ibm.com> |
@@ -15,18 +15,37 @@ | |||
15 | # this is called either by the ipl loader or directly by PSW restart | 15 | # this is called either by the ipl loader or directly by PSW restart |
16 | # or linload or SALIPL | 16 | # or linload or SALIPL |
17 | # | 17 | # |
18 | .org 0x10000 | 18 | .org 0x10000 |
19 | startup:basr %r13,0 # get base | 19 | startup:basr %r13,0 # get base |
20 | .LPG0: l %r13,0f-.LPG0(%r13) | ||
21 | b 0(%r13) | ||
22 | 0: .long startup_continue | ||
23 | |||
24 | # | ||
25 | # params at 10400 (setup.h) | ||
26 | # | ||
27 | .org PARMAREA | ||
28 | .quad 0 # IPL_DEVICE | ||
29 | .quad RAMDISK_ORIGIN # INITRD_START | ||
30 | .quad RAMDISK_SIZE # INITRD_SIZE | ||
31 | |||
32 | .org COMMAND_LINE | ||
33 | .byte "root=/dev/ram0 ro" | ||
34 | .byte 0 | ||
35 | |||
36 | .org 0x11000 | ||
37 | |||
38 | startup_continue: | ||
39 | basr %r13,0 # get base | ||
20 | .LPG1: sll %r13,1 # remove high order bit | 40 | .LPG1: sll %r13,1 # remove high order bit |
21 | srl %r13,1 | 41 | srl %r13,1 |
22 | l %r1,.Lget_ipl_device_addr-.LPG1(%r13) | 42 | GET_IPL_DEVICE |
23 | basr %r14,%r1 | ||
24 | lhi %r1,1 # mode 1 = esame | 43 | lhi %r1,1 # mode 1 = esame |
25 | slr %r0,%r0 # set cpuid to zero | 44 | slr %r0,%r0 # set cpuid to zero |
26 | sigp %r1,%r0,0x12 # switch to esame mode | 45 | sigp %r1,%r0,0x12 # switch to esame mode |
27 | sam64 # switch to 64 bit mode | 46 | sam64 # switch to 64 bit mode |
28 | lctlg %c0,%c15,.Lctl-.LPG1(%r13) # load control registers | 47 | lctlg %c0,%c15,.Lctl-.LPG1(%r13) # load control registers |
29 | larl %r12,_pstart # pointer to parameter area | 48 | lg %r12,.Lparmaddr-.LPG1(%r13)# pointer to parameter area |
30 | # move IPL device to lowcore | 49 | # move IPL device to lowcore |
31 | mvc __LC_IPLDEV(4),IPL_DEVICE+4-PARMAREA(%r12) | 50 | mvc __LC_IPLDEV(4),IPL_DEVICE+4-PARMAREA(%r12) |
32 | 51 | ||
@@ -55,8 +74,8 @@ startup:basr %r13,0 # get base | |||
55 | larl %r1,.Lsclph | 74 | larl %r1,.Lsclph |
56 | stg %r1,__LC_EXT_NEW_PSW+8 # set handler | 75 | stg %r1,__LC_EXT_NEW_PSW+8 # set handler |
57 | 76 | ||
58 | larl %r4,_pstart # %r4 is our index for sccb stuff | 77 | larl %r4,.Lsccb # %r4 is our index for sccb stuff |
59 | la %r1,.Lsccb-PARMAREA(%r4) # our sccb | 78 | lgr %r1,%r4 # our sccb |
60 | .insn rre,0xb2200000,%r2,%r1 # service call | 79 | .insn rre,0xb2200000,%r2,%r1 # service call |
61 | ipm %r1 | 80 | ipm %r1 |
62 | srl %r1,28 # get cc code | 81 | srl %r1,28 # get cc code |
@@ -67,7 +86,7 @@ startup:basr %r13,0 # get base | |||
67 | be .Lservicecall-.LPG1(%r13) | 86 | be .Lservicecall-.LPG1(%r13) |
68 | lpswe .Lwaitsclp-.LPG1(%r13) | 87 | lpswe .Lwaitsclp-.LPG1(%r13) |
69 | .Lsclph: | 88 | .Lsclph: |
70 | lh %r1,.Lsccbr-PARMAREA(%r4) | 89 | lh %r1,.Lsccbr-.Lsccb(%r4) |
71 | chi %r1,0x10 # 0x0010 is the sucess code | 90 | chi %r1,0x10 # 0x0010 is the sucess code |
72 | je .Lprocsccb # let's process the sccb | 91 | je .Lprocsccb # let's process the sccb |
73 | chi %r1,0x1f0 | 92 | chi %r1,0x1f0 |
@@ -78,15 +97,15 @@ startup:basr %r13,0 # get base | |||
78 | b .Lservicecall-.LPG1(%r13) | 97 | b .Lservicecall-.LPG1(%r13) |
79 | .Lprocsccb: | 98 | .Lprocsccb: |
80 | lghi %r1,0 | 99 | lghi %r1,0 |
81 | icm %r1,3,.Lscpincr1-PARMAREA(%r4) # use this one if != 0 | 100 | icm %r1,3,.Lscpincr1-.Lsccb(%r4) # use this one if != 0 |
82 | jnz .Lscnd | 101 | jnz .Lscnd |
83 | lg %r1,.Lscpincr2-PARMAREA(%r4) # otherwise use this one | 102 | lg %r1,.Lscpincr2-.Lsccb(%r4) # otherwise use this one |
84 | .Lscnd: | 103 | .Lscnd: |
85 | xr %r3,%r3 # same logic | 104 | xr %r3,%r3 # same logic |
86 | ic %r3,.Lscpa1-PARMAREA(%r4) | 105 | ic %r3,.Lscpa1-.Lsccb(%r4) |
87 | chi %r3,0x00 | 106 | chi %r3,0x00 |
88 | jne .Lcompmem | 107 | jne .Lcompmem |
89 | l %r3,.Lscpa2-PARMAREA(%r13) | 108 | l %r3,.Lscpa2-.Lsccb(%r4) |
90 | .Lcompmem: | 109 | .Lcompmem: |
91 | mlgr %r2,%r1 # mem in MB on 128-bit | 110 | mlgr %r2,%r1 # mem in MB on 128-bit |
92 | l %r1,.Lonemb-.LPG1(%r13) | 111 | l %r1,.Lonemb-.LPG1(%r13) |
@@ -94,8 +113,6 @@ startup:basr %r13,0 # get base | |||
94 | b .Lfchunk-.LPG1(%r13) | 113 | b .Lfchunk-.LPG1(%r13) |
95 | 114 | ||
96 | .align 4 | 115 | .align 4 |
97 | .Lget_ipl_device_addr: | ||
98 | .long .Lget_ipl_device | ||
99 | .Lpmask: | 116 | .Lpmask: |
100 | .byte 0 | 117 | .byte 0 |
101 | .align 8 | 118 | .align 8 |
@@ -242,29 +259,16 @@ startup:basr %r13,0 # get base | |||
242 | .quad 0 # cr13: home space segment table | 259 | .quad 0 # cr13: home space segment table |
243 | .quad 0xc0000000 # cr14: machine check handling off | 260 | .quad 0xc0000000 # cr14: machine check handling off |
244 | .quad 0 # cr15: linkage stack operations | 261 | .quad 0 # cr15: linkage stack operations |
262 | .Lduct: .long 0,0,0,0,0,0,0,0 | ||
263 | .long 0,0,0,0,0,0,0,0 | ||
245 | .Lpcmsk:.quad 0x0000000180000000 | 264 | .Lpcmsk:.quad 0x0000000180000000 |
246 | .L4malign:.quad 0xffffffffffc00000 | 265 | .L4malign:.quad 0xffffffffffc00000 |
247 | .Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8 | 266 | .Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8 |
248 | .Lnop: .long 0x07000700 | 267 | .Lnop: .long 0x07000700 |
268 | .Lparmaddr: | ||
269 | .quad PARMAREA | ||
249 | 270 | ||
250 | .org PARMAREA-64 | 271 | .align 4096 |
251 | .Lduct: .long 0,0,0,0,0,0,0,0 | ||
252 | .long 0,0,0,0,0,0,0,0 | ||
253 | |||
254 | # | ||
255 | # params at 10400 (setup.h) | ||
256 | # | ||
257 | .org PARMAREA | ||
258 | .global _pstart | ||
259 | _pstart: | ||
260 | .quad 0 # IPL_DEVICE | ||
261 | .quad RAMDISK_ORIGIN # INITRD_START | ||
262 | .quad RAMDISK_SIZE # INITRD_SIZE | ||
263 | |||
264 | .org COMMAND_LINE | ||
265 | .byte "root=/dev/ram0 ro" | ||
266 | .byte 0 | ||
267 | .org 0x11000 | ||
268 | .Lsccb: | 272 | .Lsccb: |
269 | .hword 0x1000 # length, one page | 273 | .hword 0x1000 # length, one page |
270 | .byte 0x00,0x00,0x00 | 274 | .byte 0x00,0x00,0x00 |
@@ -281,18 +285,14 @@ _pstart: | |||
281 | .Lscpincr2: | 285 | .Lscpincr2: |
282 | .quad 0x00 | 286 | .quad 0x00 |
283 | .fill 3984,1,0 | 287 | .fill 3984,1,0 |
284 | .org 0x12000 | 288 | .align 4096 |
285 | .global _pend | ||
286 | _pend: | ||
287 | |||
288 | GET_IPL_DEVICE | ||
289 | 289 | ||
290 | #ifdef CONFIG_SHARED_KERNEL | 290 | #ifdef CONFIG_SHARED_KERNEL |
291 | .org 0x100000 | 291 | .org 0x100000 |
292 | #endif | 292 | #endif |
293 | 293 | ||
294 | # | 294 | # |
295 | # startup-code, running in virtual mode | 295 | # startup-code, running in absolute addressing mode |
296 | # | 296 | # |
297 | .globl _stext | 297 | .globl _stext |
298 | _stext: basr %r13,0 # get base | 298 | _stext: basr %r13,0 # get base |
@@ -326,4 +326,3 @@ _stext: basr %r13,0 # get base | |||
326 | .align 8 | 326 | .align 8 |
327 | .Ldw: .quad 0x0002000180000000,0x0000000000000000 | 327 | .Ldw: .quad 0x0002000180000000,0x0000000000000000 |
328 | .Laregs: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 | 328 | .Laregs: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
329 | |||
diff --git a/arch/s390/kernel/s390_ksyms.c b/arch/s390/kernel/s390_ksyms.c index 4176c77670c4..0886e739d122 100644 --- a/arch/s390/kernel/s390_ksyms.c +++ b/arch/s390/kernel/s390_ksyms.c | |||
@@ -46,8 +46,6 @@ EXPORT_SYMBOL(__down_interruptible); | |||
46 | */ | 46 | */ |
47 | extern int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs); | 47 | extern int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs); |
48 | EXPORT_SYMBOL(dump_fpu); | 48 | EXPORT_SYMBOL(dump_fpu); |
49 | EXPORT_SYMBOL(overflowuid); | ||
50 | EXPORT_SYMBOL(overflowgid); | ||
51 | EXPORT_SYMBOL(empty_zero_page); | 49 | EXPORT_SYMBOL(empty_zero_page); |
52 | 50 | ||
53 | /* | 51 | /* |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index b282034452a4..2b2551e3510b 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/seq_file.h> | 37 | #include <linux/seq_file.h> |
38 | #include <linux/kernel_stat.h> | 38 | #include <linux/kernel_stat.h> |
39 | #include <linux/device.h> | 39 | #include <linux/device.h> |
40 | #include <linux/notifier.h> | ||
40 | 41 | ||
41 | #include <asm/uaccess.h> | 42 | #include <asm/uaccess.h> |
42 | #include <asm/system.h> | 43 | #include <asm/system.h> |
@@ -115,6 +116,7 @@ void __devinit cpu_init (void) | |||
115 | */ | 116 | */ |
116 | char vmhalt_cmd[128] = ""; | 117 | char vmhalt_cmd[128] = ""; |
117 | char vmpoff_cmd[128] = ""; | 118 | char vmpoff_cmd[128] = ""; |
119 | char vmpanic_cmd[128] = ""; | ||
118 | 120 | ||
119 | static inline void strncpy_skip_quote(char *dst, char *src, int n) | 121 | static inline void strncpy_skip_quote(char *dst, char *src, int n) |
120 | { | 122 | { |
@@ -146,6 +148,38 @@ static int __init vmpoff_setup(char *str) | |||
146 | 148 | ||
147 | __setup("vmpoff=", vmpoff_setup); | 149 | __setup("vmpoff=", vmpoff_setup); |
148 | 150 | ||
151 | static int vmpanic_notify(struct notifier_block *self, unsigned long event, | ||
152 | void *data) | ||
153 | { | ||
154 | if (MACHINE_IS_VM && strlen(vmpanic_cmd) > 0) | ||
155 | cpcmd(vmpanic_cmd, NULL, 0, NULL); | ||
156 | |||
157 | return NOTIFY_OK; | ||
158 | } | ||
159 | |||
160 | #define PANIC_PRI_VMPANIC 0 | ||
161 | |||
162 | static struct notifier_block vmpanic_nb = { | ||
163 | .notifier_call = vmpanic_notify, | ||
164 | .priority = PANIC_PRI_VMPANIC | ||
165 | }; | ||
166 | |||
167 | static int __init vmpanic_setup(char *str) | ||
168 | { | ||
169 | static int register_done __initdata = 0; | ||
170 | |||
171 | strncpy_skip_quote(vmpanic_cmd, str, 127); | ||
172 | vmpanic_cmd[127] = 0; | ||
173 | if (!register_done) { | ||
174 | register_done = 1; | ||
175 | atomic_notifier_chain_register(&panic_notifier_list, | ||
176 | &vmpanic_nb); | ||
177 | } | ||
178 | return 1; | ||
179 | } | ||
180 | |||
181 | __setup("vmpanic=", vmpanic_setup); | ||
182 | |||
149 | /* | 183 | /* |
150 | * condev= and conmode= setup parameter. | 184 | * condev= and conmode= setup parameter. |
151 | */ | 185 | */ |
@@ -289,19 +323,34 @@ void (*_machine_power_off)(void) = do_machine_power_off_nonsmp; | |||
289 | 323 | ||
290 | void machine_restart(char *command) | 324 | void machine_restart(char *command) |
291 | { | 325 | { |
292 | console_unblank(); | 326 | if (!in_interrupt() || oops_in_progress) |
327 | /* | ||
328 | * Only unblank the console if we are called in enabled | ||
329 | * context or a bust_spinlocks cleared the way for us. | ||
330 | */ | ||
331 | console_unblank(); | ||
293 | _machine_restart(command); | 332 | _machine_restart(command); |
294 | } | 333 | } |
295 | 334 | ||
296 | void machine_halt(void) | 335 | void machine_halt(void) |
297 | { | 336 | { |
298 | console_unblank(); | 337 | if (!in_interrupt() || oops_in_progress) |
338 | /* | ||
339 | * Only unblank the console if we are called in enabled | ||
340 | * context or a bust_spinlocks cleared the way for us. | ||
341 | */ | ||
342 | console_unblank(); | ||
299 | _machine_halt(); | 343 | _machine_halt(); |
300 | } | 344 | } |
301 | 345 | ||
302 | void machine_power_off(void) | 346 | void machine_power_off(void) |
303 | { | 347 | { |
304 | console_unblank(); | 348 | if (!in_interrupt() || oops_in_progress) |
349 | /* | ||
350 | * Only unblank the console if we are called in enabled | ||
351 | * context or a bust_spinlocks cleared the way for us. | ||
352 | */ | ||
353 | console_unblank(); | ||
305 | _machine_power_off(); | 354 | _machine_power_off(); |
306 | } | 355 | } |
307 | 356 | ||
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index a46793beeddd..b7630436f693 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c | |||
@@ -150,13 +150,11 @@ void show_stack(struct task_struct *task, unsigned long *sp) | |||
150 | unsigned long *stack; | 150 | unsigned long *stack; |
151 | int i; | 151 | int i; |
152 | 152 | ||
153 | // debugging aid: "show_stack(NULL);" prints the | ||
154 | // back trace for this cpu. | ||
155 | |||
156 | if (!sp) | 153 | if (!sp) |
157 | sp = task ? (unsigned long *) task->thread.ksp : __r15; | 154 | stack = task ? (unsigned long *) task->thread.ksp : __r15; |
155 | else | ||
156 | stack = sp; | ||
158 | 157 | ||
159 | stack = sp; | ||
160 | for (i = 0; i < kstack_depth_to_print; i++) { | 158 | for (i = 0; i < kstack_depth_to_print; i++) { |
161 | if (((addr_t) stack & (THREAD_SIZE-1)) == 0) | 159 | if (((addr_t) stack & (THREAD_SIZE-1)) == 0) |
162 | break; | 160 | break; |
diff --git a/arch/sh/boards/adx/irq_maskreg.c b/arch/sh/boards/adx/irq_maskreg.c index c0973f8d57ba..357fab1bac2b 100644 --- a/arch/sh/boards/adx/irq_maskreg.c +++ b/arch/sh/boards/adx/irq_maskreg.c | |||
@@ -102,6 +102,6 @@ static void end_maskreg_irq(unsigned int irq) | |||
102 | void make_maskreg_irq(unsigned int irq) | 102 | void make_maskreg_irq(unsigned int irq) |
103 | { | 103 | { |
104 | disable_irq_nosync(irq); | 104 | disable_irq_nosync(irq); |
105 | irq_desc[irq].handler = &maskreg_irq_type; | 105 | irq_desc[irq].chip = &maskreg_irq_type; |
106 | disable_maskreg_irq(irq); | 106 | disable_maskreg_irq(irq); |
107 | } | 107 | } |
diff --git a/arch/sh/boards/bigsur/irq.c b/arch/sh/boards/bigsur/irq.c index 6ddbcc77244d..1d32425782c0 100644 --- a/arch/sh/boards/bigsur/irq.c +++ b/arch/sh/boards/bigsur/irq.c | |||
@@ -253,7 +253,7 @@ static void make_bigsur_l1isr(unsigned int irq) { | |||
253 | /* sanity check first */ | 253 | /* sanity check first */ |
254 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) { | 254 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) { |
255 | /* save the handler in the main description table */ | 255 | /* save the handler in the main description table */ |
256 | irq_desc[irq].handler = &bigsur_l1irq_type; | 256 | irq_desc[irq].chip = &bigsur_l1irq_type; |
257 | irq_desc[irq].status = IRQ_DISABLED; | 257 | irq_desc[irq].status = IRQ_DISABLED; |
258 | irq_desc[irq].action = 0; | 258 | irq_desc[irq].action = 0; |
259 | irq_desc[irq].depth = 1; | 259 | irq_desc[irq].depth = 1; |
@@ -270,7 +270,7 @@ static void make_bigsur_l2isr(unsigned int irq) { | |||
270 | /* sanity check first */ | 270 | /* sanity check first */ |
271 | if(irq >= BIGSUR_2NDLVL_IRQ_LOW && irq < BIGSUR_2NDLVL_IRQ_HIGH) { | 271 | if(irq >= BIGSUR_2NDLVL_IRQ_LOW && irq < BIGSUR_2NDLVL_IRQ_HIGH) { |
272 | /* save the handler in the main description table */ | 272 | /* save the handler in the main description table */ |
273 | irq_desc[irq].handler = &bigsur_l2irq_type; | 273 | irq_desc[irq].chip = &bigsur_l2irq_type; |
274 | irq_desc[irq].status = IRQ_DISABLED; | 274 | irq_desc[irq].status = IRQ_DISABLED; |
275 | irq_desc[irq].action = 0; | 275 | irq_desc[irq].action = 0; |
276 | irq_desc[irq].depth = 1; | 276 | irq_desc[irq].depth = 1; |
diff --git a/arch/sh/boards/cqreek/irq.c b/arch/sh/boards/cqreek/irq.c index d1da0d844567..2955adc52310 100644 --- a/arch/sh/boards/cqreek/irq.c +++ b/arch/sh/boards/cqreek/irq.c | |||
@@ -103,7 +103,7 @@ void __init init_cqreek_IRQ(void) | |||
103 | cqreek_irq_data[14].stat_port = BRIDGE_IDE_INTR_STAT; | 103 | cqreek_irq_data[14].stat_port = BRIDGE_IDE_INTR_STAT; |
104 | cqreek_irq_data[14].bit = 1; | 104 | cqreek_irq_data[14].bit = 1; |
105 | 105 | ||
106 | irq_desc[14].handler = &cqreek_irq_type; | 106 | irq_desc[14].chip = &cqreek_irq_type; |
107 | irq_desc[14].status = IRQ_DISABLED; | 107 | irq_desc[14].status = IRQ_DISABLED; |
108 | irq_desc[14].action = 0; | 108 | irq_desc[14].action = 0; |
109 | irq_desc[14].depth = 1; | 109 | irq_desc[14].depth = 1; |
@@ -117,7 +117,7 @@ void __init init_cqreek_IRQ(void) | |||
117 | cqreek_irq_data[10].bit = (1 << 10); | 117 | cqreek_irq_data[10].bit = (1 << 10); |
118 | 118 | ||
119 | /* XXX: Err... we may need demultiplexer for ISA irq... */ | 119 | /* XXX: Err... we may need demultiplexer for ISA irq... */ |
120 | irq_desc[10].handler = &cqreek_irq_type; | 120 | irq_desc[10].chip = &cqreek_irq_type; |
121 | irq_desc[10].status = IRQ_DISABLED; | 121 | irq_desc[10].status = IRQ_DISABLED; |
122 | irq_desc[10].action = 0; | 122 | irq_desc[10].action = 0; |
123 | irq_desc[10].depth = 1; | 123 | irq_desc[10].depth = 1; |
diff --git a/arch/sh/boards/dreamcast/setup.c b/arch/sh/boards/dreamcast/setup.c index 55dece35cde5..0027b80a2343 100644 --- a/arch/sh/boards/dreamcast/setup.c +++ b/arch/sh/boards/dreamcast/setup.c | |||
@@ -70,7 +70,7 @@ int __init platform_setup(void) | |||
70 | 70 | ||
71 | /* Assign all virtual IRQs to the System ASIC int. handler */ | 71 | /* Assign all virtual IRQs to the System ASIC int. handler */ |
72 | for (i = HW_EVENT_IRQ_BASE; i < HW_EVENT_IRQ_MAX; i++) | 72 | for (i = HW_EVENT_IRQ_BASE; i < HW_EVENT_IRQ_MAX; i++) |
73 | irq_desc[i].handler = &systemasic_int; | 73 | irq_desc[i].chip = &systemasic_int; |
74 | 74 | ||
75 | board_time_init = aica_time_init; | 75 | board_time_init = aica_time_init; |
76 | 76 | ||
diff --git a/arch/sh/boards/ec3104/setup.c b/arch/sh/boards/ec3104/setup.c index 5130ba2b6ff1..4b3ef16a0e96 100644 --- a/arch/sh/boards/ec3104/setup.c +++ b/arch/sh/boards/ec3104/setup.c | |||
@@ -63,7 +63,7 @@ int __init platform_setup(void) | |||
63 | str[i] = ctrl_readb(EC3104_BASE + i); | 63 | str[i] = ctrl_readb(EC3104_BASE + i); |
64 | 64 | ||
65 | for (i = EC3104_IRQBASE; i < EC3104_IRQBASE + 32; i++) | 65 | for (i = EC3104_IRQBASE; i < EC3104_IRQBASE + 32; i++) |
66 | irq_desc[i].handler = &ec3104_int; | 66 | irq_desc[i].chip = &ec3104_int; |
67 | 67 | ||
68 | printk("initializing EC3104 \"%.8s\" at %08x, IRQ %d, IRQ base %d\n", | 68 | printk("initializing EC3104 \"%.8s\" at %08x, IRQ %d, IRQ base %d\n", |
69 | str, EC3104_BASE, EC3104_IRQ, EC3104_IRQBASE); | 69 | str, EC3104_BASE, EC3104_IRQ, EC3104_IRQBASE); |
diff --git a/arch/sh/boards/harp/irq.c b/arch/sh/boards/harp/irq.c index 52d0ba39031b..701fa55d5297 100644 --- a/arch/sh/boards/harp/irq.c +++ b/arch/sh/boards/harp/irq.c | |||
@@ -114,7 +114,7 @@ static void enable_harp_irq(unsigned int irq) | |||
114 | static void __init make_harp_irq(unsigned int irq) | 114 | static void __init make_harp_irq(unsigned int irq) |
115 | { | 115 | { |
116 | disable_irq_nosync(irq); | 116 | disable_irq_nosync(irq); |
117 | irq_desc[irq].handler = &harp_irq_type; | 117 | irq_desc[irq].chip = &harp_irq_type; |
118 | disable_harp_irq(irq); | 118 | disable_harp_irq(irq); |
119 | } | 119 | } |
120 | 120 | ||
diff --git a/arch/sh/boards/mpc1211/pci.c b/arch/sh/boards/mpc1211/pci.c index ba3a65439752..9f7ccd33ffb6 100644 --- a/arch/sh/boards/mpc1211/pci.c +++ b/arch/sh/boards/mpc1211/pci.c | |||
@@ -273,9 +273,9 @@ void __init pcibios_fixup_irqs(void) | |||
273 | } | 273 | } |
274 | 274 | ||
275 | void pcibios_align_resource(void *data, struct resource *res, | 275 | void pcibios_align_resource(void *data, struct resource *res, |
276 | unsigned long size, unsigned long align) | 276 | resource_size_t size, resource_size_t align) |
277 | { | 277 | { |
278 | unsigned long start = res->start; | 278 | resource_size_t start = res->start; |
279 | 279 | ||
280 | if (res->flags & IORESOURCE_IO) { | 280 | if (res->flags & IORESOURCE_IO) { |
281 | if (start >= 0x10000UL) { | 281 | if (start >= 0x10000UL) { |
diff --git a/arch/sh/boards/mpc1211/setup.c b/arch/sh/boards/mpc1211/setup.c index 2bb581b91683..b72f009c52c2 100644 --- a/arch/sh/boards/mpc1211/setup.c +++ b/arch/sh/boards/mpc1211/setup.c | |||
@@ -194,7 +194,7 @@ static struct hw_interrupt_type mpc1211_irq_type = { | |||
194 | 194 | ||
195 | static void make_mpc1211_irq(unsigned int irq) | 195 | static void make_mpc1211_irq(unsigned int irq) |
196 | { | 196 | { |
197 | irq_desc[irq].handler = &mpc1211_irq_type; | 197 | irq_desc[irq].chip = &mpc1211_irq_type; |
198 | irq_desc[irq].status = IRQ_DISABLED; | 198 | irq_desc[irq].status = IRQ_DISABLED; |
199 | irq_desc[irq].action = 0; | 199 | irq_desc[irq].action = 0; |
200 | irq_desc[irq].depth = 1; | 200 | irq_desc[irq].depth = 1; |
diff --git a/arch/sh/boards/overdrive/galileo.c b/arch/sh/boards/overdrive/galileo.c index 276fa11ee4ce..b055809d2ac1 100644 --- a/arch/sh/boards/overdrive/galileo.c +++ b/arch/sh/boards/overdrive/galileo.c | |||
@@ -536,7 +536,7 @@ void __init pcibios_fixup_bus(struct pci_bus *bus) | |||
536 | } | 536 | } |
537 | 537 | ||
538 | void pcibios_align_resource(void *data, struct resource *res, | 538 | void pcibios_align_resource(void *data, struct resource *res, |
539 | unsigned long size) | 539 | resource_size_t size) |
540 | { | 540 | { |
541 | } | 541 | } |
542 | 542 | ||
diff --git a/arch/sh/boards/overdrive/irq.c b/arch/sh/boards/overdrive/irq.c index 715e8feb3a68..2c13a7de6b22 100644 --- a/arch/sh/boards/overdrive/irq.c +++ b/arch/sh/boards/overdrive/irq.c | |||
@@ -150,7 +150,7 @@ static void enable_od_irq(unsigned int irq) | |||
150 | static void __init make_od_irq(unsigned int irq) | 150 | static void __init make_od_irq(unsigned int irq) |
151 | { | 151 | { |
152 | disable_irq_nosync(irq); | 152 | disable_irq_nosync(irq); |
153 | irq_desc[irq].handler = &od_irq_type; | 153 | irq_desc[irq].chip = &od_irq_type; |
154 | disable_od_irq(irq); | 154 | disable_od_irq(irq); |
155 | } | 155 | } |
156 | 156 | ||
diff --git a/arch/sh/boards/renesas/hs7751rvoip/irq.c b/arch/sh/boards/renesas/hs7751rvoip/irq.c index ed4c5b50ea45..52a98b524e1f 100644 --- a/arch/sh/boards/renesas/hs7751rvoip/irq.c +++ b/arch/sh/boards/renesas/hs7751rvoip/irq.c | |||
@@ -86,7 +86,7 @@ static struct hw_interrupt_type hs7751rvoip_irq_type = { | |||
86 | static void make_hs7751rvoip_irq(unsigned int irq) | 86 | static void make_hs7751rvoip_irq(unsigned int irq) |
87 | { | 87 | { |
88 | disable_irq_nosync(irq); | 88 | disable_irq_nosync(irq); |
89 | irq_desc[irq].handler = &hs7751rvoip_irq_type; | 89 | irq_desc[irq].chip = &hs7751rvoip_irq_type; |
90 | disable_hs7751rvoip_irq(irq); | 90 | disable_hs7751rvoip_irq(irq); |
91 | } | 91 | } |
92 | 92 | ||
diff --git a/arch/sh/boards/renesas/rts7751r2d/irq.c b/arch/sh/boards/renesas/rts7751r2d/irq.c index d36c9374aed1..e16915d9cda4 100644 --- a/arch/sh/boards/renesas/rts7751r2d/irq.c +++ b/arch/sh/boards/renesas/rts7751r2d/irq.c | |||
@@ -100,7 +100,7 @@ static struct hw_interrupt_type rts7751r2d_irq_type = { | |||
100 | static void make_rts7751r2d_irq(unsigned int irq) | 100 | static void make_rts7751r2d_irq(unsigned int irq) |
101 | { | 101 | { |
102 | disable_irq_nosync(irq); | 102 | disable_irq_nosync(irq); |
103 | irq_desc[irq].handler = &rts7751r2d_irq_type; | 103 | irq_desc[irq].chip = &rts7751r2d_irq_type; |
104 | disable_rts7751r2d_irq(irq); | 104 | disable_rts7751r2d_irq(irq); |
105 | } | 105 | } |
106 | 106 | ||
diff --git a/arch/sh/boards/renesas/systemh/irq.c b/arch/sh/boards/renesas/systemh/irq.c index 7a2eb10edb56..845979181059 100644 --- a/arch/sh/boards/renesas/systemh/irq.c +++ b/arch/sh/boards/renesas/systemh/irq.c | |||
@@ -105,7 +105,7 @@ static void end_systemh_irq(unsigned int irq) | |||
105 | void make_systemh_irq(unsigned int irq) | 105 | void make_systemh_irq(unsigned int irq) |
106 | { | 106 | { |
107 | disable_irq_nosync(irq); | 107 | disable_irq_nosync(irq); |
108 | irq_desc[irq].handler = &systemh_irq_type; | 108 | irq_desc[irq].chip = &systemh_irq_type; |
109 | disable_systemh_irq(irq); | 109 | disable_systemh_irq(irq); |
110 | } | 110 | } |
111 | 111 | ||
diff --git a/arch/sh/boards/se/73180/irq.c b/arch/sh/boards/se/73180/irq.c index 70f04caad9a4..402735c7c898 100644 --- a/arch/sh/boards/se/73180/irq.c +++ b/arch/sh/boards/se/73180/irq.c | |||
@@ -85,7 +85,7 @@ void | |||
85 | make_intreq_irq(unsigned int irq) | 85 | make_intreq_irq(unsigned int irq) |
86 | { | 86 | { |
87 | disable_irq_nosync(irq); | 87 | disable_irq_nosync(irq); |
88 | irq_desc[irq].handler = &intreq_irq_type; | 88 | irq_desc[irq].chip = &intreq_irq_type; |
89 | disable_intreq_irq(irq); | 89 | disable_intreq_irq(irq); |
90 | } | 90 | } |
91 | 91 | ||
diff --git a/arch/sh/boards/superh/microdev/irq.c b/arch/sh/boards/superh/microdev/irq.c index efcbd86b7cd2..cb5999425d16 100644 --- a/arch/sh/boards/superh/microdev/irq.c +++ b/arch/sh/boards/superh/microdev/irq.c | |||
@@ -147,7 +147,7 @@ static void enable_microdev_irq(unsigned int irq) | |||
147 | static void __init make_microdev_irq(unsigned int irq) | 147 | static void __init make_microdev_irq(unsigned int irq) |
148 | { | 148 | { |
149 | disable_irq_nosync(irq); | 149 | disable_irq_nosync(irq); |
150 | irq_desc[irq].handler = µdev_irq_type; | 150 | irq_desc[irq].chip = µdev_irq_type; |
151 | disable_microdev_irq(irq); | 151 | disable_microdev_irq(irq); |
152 | } | 152 | } |
153 | 153 | ||
diff --git a/arch/sh/cchips/hd6446x/hd64461/setup.c b/arch/sh/cchips/hd6446x/hd64461/setup.c index f014b9bf6922..724db04cb392 100644 --- a/arch/sh/cchips/hd6446x/hd64461/setup.c +++ b/arch/sh/cchips/hd6446x/hd64461/setup.c | |||
@@ -154,7 +154,7 @@ int __init setup_hd64461(void) | |||
154 | outw(0xffff, HD64461_NIMR); | 154 | outw(0xffff, HD64461_NIMR); |
155 | 155 | ||
156 | for (i = HD64461_IRQBASE; i < HD64461_IRQBASE + 16; i++) { | 156 | for (i = HD64461_IRQBASE; i < HD64461_IRQBASE + 16; i++) { |
157 | irq_desc[i].handler = &hd64461_irq_type; | 157 | irq_desc[i].chip = &hd64461_irq_type; |
158 | } | 158 | } |
159 | 159 | ||
160 | setup_irq(CONFIG_HD64461_IRQ, &irq0); | 160 | setup_irq(CONFIG_HD64461_IRQ, &irq0); |
diff --git a/arch/sh/cchips/hd6446x/hd64465/setup.c b/arch/sh/cchips/hd6446x/hd64465/setup.c index 68e4c4e4283d..cf9142c620b7 100644 --- a/arch/sh/cchips/hd6446x/hd64465/setup.c +++ b/arch/sh/cchips/hd6446x/hd64465/setup.c | |||
@@ -182,7 +182,7 @@ static int __init setup_hd64465(void) | |||
182 | outw(0xffff, HD64465_REG_NIMR); /* mask all interrupts */ | 182 | outw(0xffff, HD64465_REG_NIMR); /* mask all interrupts */ |
183 | 183 | ||
184 | for (i = 0; i < HD64465_IRQ_NUM ; i++) { | 184 | for (i = 0; i < HD64465_IRQ_NUM ; i++) { |
185 | irq_desc[HD64465_IRQ_BASE + i].handler = &hd64465_irq_type; | 185 | irq_desc[HD64465_IRQ_BASE + i].chip = &hd64465_irq_type; |
186 | } | 186 | } |
187 | 187 | ||
188 | setup_irq(CONFIG_HD64465_IRQ, &irq0); | 188 | setup_irq(CONFIG_HD64465_IRQ, &irq0); |
diff --git a/arch/sh/cchips/voyagergx/irq.c b/arch/sh/cchips/voyagergx/irq.c index 2ee330b3c38f..892214bade19 100644 --- a/arch/sh/cchips/voyagergx/irq.c +++ b/arch/sh/cchips/voyagergx/irq.c | |||
@@ -191,7 +191,7 @@ void __init setup_voyagergx_irq(void) | |||
191 | flag = 1; | 191 | flag = 1; |
192 | } | 192 | } |
193 | if (flag == 1) | 193 | if (flag == 1) |
194 | irq_desc[VOYAGER_IRQ_BASE + i].handler = &voyagergx_irq_type; | 194 | irq_desc[VOYAGER_IRQ_BASE + i].chip = &voyagergx_irq_type; |
195 | } | 195 | } |
196 | 196 | ||
197 | setup_irq(IRQ_VOYAGER, &irq0); | 197 | setup_irq(IRQ_VOYAGER, &irq0); |
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index c1669905abe4..3d546ba329cf 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c | |||
@@ -75,7 +75,7 @@ pcibios_update_resource(struct pci_dev *dev, struct resource *root, | |||
75 | } | 75 | } |
76 | 76 | ||
77 | void pcibios_align_resource(void *data, struct resource *res, | 77 | void pcibios_align_resource(void *data, struct resource *res, |
78 | unsigned long size, unsigned long align) | 78 | resource_size_t size, resource_size_t align) |
79 | __attribute__ ((weak)); | 79 | __attribute__ ((weak)); |
80 | 80 | ||
81 | /* | 81 | /* |
@@ -85,10 +85,10 @@ void pcibios_align_resource(void *data, struct resource *res, | |||
85 | * modulo 0x400. | 85 | * modulo 0x400. |
86 | */ | 86 | */ |
87 | void pcibios_align_resource(void *data, struct resource *res, | 87 | void pcibios_align_resource(void *data, struct resource *res, |
88 | unsigned long size, unsigned long align) | 88 | resource_size_t size, resource_size_t align) |
89 | { | 89 | { |
90 | if (res->flags & IORESOURCE_IO) { | 90 | if (res->flags & IORESOURCE_IO) { |
91 | unsigned long start = res->start; | 91 | resource_size_t start = res->start; |
92 | 92 | ||
93 | if (start & 0x300) { | 93 | if (start & 0x300) { |
94 | start = (start + 0x3ff) & ~0x3ff; | 94 | start = (start + 0x3ff) & ~0x3ff; |
diff --git a/arch/sh/kernel/cpu/irq/imask.c b/arch/sh/kernel/cpu/irq/imask.c index baed9a550d39..a33ae3e0a5a5 100644 --- a/arch/sh/kernel/cpu/irq/imask.c +++ b/arch/sh/kernel/cpu/irq/imask.c | |||
@@ -105,6 +105,6 @@ static void shutdown_imask_irq(unsigned int irq) | |||
105 | void make_imask_irq(unsigned int irq) | 105 | void make_imask_irq(unsigned int irq) |
106 | { | 106 | { |
107 | disable_irq_nosync(irq); | 107 | disable_irq_nosync(irq); |
108 | irq_desc[irq].handler = &imask_irq_type; | 108 | irq_desc[irq].chip = &imask_irq_type; |
109 | enable_irq(irq); | 109 | enable_irq(irq); |
110 | } | 110 | } |
diff --git a/arch/sh/kernel/cpu/irq/intc2.c b/arch/sh/kernel/cpu/irq/intc2.c index 06e8afab32e4..30064bf6e154 100644 --- a/arch/sh/kernel/cpu/irq/intc2.c +++ b/arch/sh/kernel/cpu/irq/intc2.c | |||
@@ -137,7 +137,7 @@ void make_intc2_irq(unsigned int irq, | |||
137 | 137 | ||
138 | local_irq_restore(flags); | 138 | local_irq_restore(flags); |
139 | 139 | ||
140 | irq_desc[irq].handler = &intc2_irq_type; | 140 | irq_desc[irq].chip = &intc2_irq_type; |
141 | 141 | ||
142 | disable_intc2_irq(irq); | 142 | disable_intc2_irq(irq); |
143 | } | 143 | } |
diff --git a/arch/sh/kernel/cpu/irq/ipr.c b/arch/sh/kernel/cpu/irq/ipr.c index e55150ed0856..0373b65c77f9 100644 --- a/arch/sh/kernel/cpu/irq/ipr.c +++ b/arch/sh/kernel/cpu/irq/ipr.c | |||
@@ -115,7 +115,7 @@ void make_ipr_irq(unsigned int irq, unsigned int addr, int pos, int priority) | |||
115 | ipr_data[irq].shift = pos*4; /* POSition (0-3) x 4 means shift */ | 115 | ipr_data[irq].shift = pos*4; /* POSition (0-3) x 4 means shift */ |
116 | ipr_data[irq].priority = priority; | 116 | ipr_data[irq].priority = priority; |
117 | 117 | ||
118 | irq_desc[irq].handler = &ipr_irq_type; | 118 | irq_desc[irq].chip = &ipr_irq_type; |
119 | disable_ipr_irq(irq); | 119 | disable_ipr_irq(irq); |
120 | } | 120 | } |
121 | 121 | ||
diff --git a/arch/sh/kernel/cpu/irq/pint.c b/arch/sh/kernel/cpu/irq/pint.c index 95d6024fe1ae..714963a25bba 100644 --- a/arch/sh/kernel/cpu/irq/pint.c +++ b/arch/sh/kernel/cpu/irq/pint.c | |||
@@ -85,7 +85,7 @@ static void end_pint_irq(unsigned int irq) | |||
85 | void make_pint_irq(unsigned int irq) | 85 | void make_pint_irq(unsigned int irq) |
86 | { | 86 | { |
87 | disable_irq_nosync(irq); | 87 | disable_irq_nosync(irq); |
88 | irq_desc[irq].handler = &pint_irq_type; | 88 | irq_desc[irq].chip = &pint_irq_type; |
89 | disable_pint_irq(irq); | 89 | disable_pint_irq(irq); |
90 | } | 90 | } |
91 | 91 | ||
diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c index b56e79632f24..c2e07f7f3496 100644 --- a/arch/sh/kernel/irq.c +++ b/arch/sh/kernel/irq.c | |||
@@ -47,7 +47,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
47 | goto unlock; | 47 | goto unlock; |
48 | seq_printf(p, "%3d: ",i); | 48 | seq_printf(p, "%3d: ",i); |
49 | seq_printf(p, "%10u ", kstat_irqs(i)); | 49 | seq_printf(p, "%10u ", kstat_irqs(i)); |
50 | seq_printf(p, " %14s", irq_desc[i].handler->typename); | 50 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
51 | seq_printf(p, " %s", action->name); | 51 | seq_printf(p, " %s", action->name); |
52 | 52 | ||
53 | for (action=action->next; action; action = action->next) | 53 | for (action=action->next; action; action = action->next) |
diff --git a/arch/sh64/kernel/irq.c b/arch/sh64/kernel/irq.c index d69879c0e063..675776a5477e 100644 --- a/arch/sh64/kernel/irq.c +++ b/arch/sh64/kernel/irq.c | |||
@@ -65,7 +65,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
65 | goto unlock; | 65 | goto unlock; |
66 | seq_printf(p, "%3d: ",i); | 66 | seq_printf(p, "%3d: ",i); |
67 | seq_printf(p, "%10u ", kstat_irqs(i)); | 67 | seq_printf(p, "%10u ", kstat_irqs(i)); |
68 | seq_printf(p, " %14s", irq_desc[i].handler->typename); | 68 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
69 | seq_printf(p, " %s", action->name); | 69 | seq_printf(p, " %s", action->name); |
70 | 70 | ||
71 | for (action=action->next; action; action = action->next) | 71 | for (action=action->next; action; action = action->next) |
diff --git a/arch/sh64/kernel/irq_intc.c b/arch/sh64/kernel/irq_intc.c index fc99bf4e362c..fa730f5fe2e6 100644 --- a/arch/sh64/kernel/irq_intc.c +++ b/arch/sh64/kernel/irq_intc.c | |||
@@ -178,7 +178,7 @@ static void end_intc_irq(unsigned int irq) | |||
178 | void make_intc_irq(unsigned int irq) | 178 | void make_intc_irq(unsigned int irq) |
179 | { | 179 | { |
180 | disable_irq_nosync(irq); | 180 | disable_irq_nosync(irq); |
181 | irq_desc[irq].handler = &intc_irq_type; | 181 | irq_desc[irq].chip = &intc_irq_type; |
182 | disable_intc_irq(irq); | 182 | disable_intc_irq(irq); |
183 | } | 183 | } |
184 | 184 | ||
@@ -208,7 +208,7 @@ void __init init_IRQ(void) | |||
208 | /* Set default: per-line enable/disable, priority driven ack/eoi */ | 208 | /* Set default: per-line enable/disable, priority driven ack/eoi */ |
209 | for (i = 0; i < NR_INTC_IRQS; i++) { | 209 | for (i = 0; i < NR_INTC_IRQS; i++) { |
210 | if (platform_int_priority[i] != NO_PRIORITY) { | 210 | if (platform_int_priority[i] != NO_PRIORITY) { |
211 | irq_desc[i].handler = &intc_irq_type; | 211 | irq_desc[i].chip = &intc_irq_type; |
212 | } | 212 | } |
213 | } | 213 | } |
214 | 214 | ||
diff --git a/arch/sh64/kernel/pcibios.c b/arch/sh64/kernel/pcibios.c index 50c61dcb9fae..945920bc24db 100644 --- a/arch/sh64/kernel/pcibios.c +++ b/arch/sh64/kernel/pcibios.c | |||
@@ -69,10 +69,10 @@ pcibios_update_resource(struct pci_dev *dev, struct resource *root, | |||
69 | * modulo 0x400. | 69 | * modulo 0x400. |
70 | */ | 70 | */ |
71 | void pcibios_align_resource(void *data, struct resource *res, | 71 | void pcibios_align_resource(void *data, struct resource *res, |
72 | unsigned long size, unsigned long align) | 72 | resource_size_t size, resource_size_t align) |
73 | { | 73 | { |
74 | if (res->flags & IORESOURCE_IO) { | 74 | if (res->flags & IORESOURCE_IO) { |
75 | unsigned long start = res->start; | 75 | resource_size_t start = res->start; |
76 | 76 | ||
77 | if (start & 0x300) { | 77 | if (start & 0x300) { |
78 | start = (start + 0x3ff) & ~0x3ff; | 78 | start = (start + 0x3ff) & ~0x3ff; |
diff --git a/arch/sh64/mach-cayman/irq.c b/arch/sh64/mach-cayman/irq.c index f797c84bfdd1..05eb7cdc26f0 100644 --- a/arch/sh64/mach-cayman/irq.c +++ b/arch/sh64/mach-cayman/irq.c | |||
@@ -187,7 +187,7 @@ void init_cayman_irq(void) | |||
187 | } | 187 | } |
188 | 188 | ||
189 | for (i=0; i<NR_EXT_IRQS; i++) { | 189 | for (i=0; i<NR_EXT_IRQS; i++) { |
190 | irq_desc[START_EXT_IRQS + i].handler = &cayman_irq_type; | 190 | irq_desc[START_EXT_IRQS + i].chip = &cayman_irq_type; |
191 | } | 191 | } |
192 | 192 | ||
193 | /* Setup the SMSC interrupt */ | 193 | /* Setup the SMSC interrupt */ |
diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index ae4c667c906f..79d177149fdb 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c | |||
@@ -208,7 +208,7 @@ _sparc_ioremap(struct resource *res, u32 bus, u32 pa, int sz) | |||
208 | pa &= PAGE_MASK; | 208 | pa &= PAGE_MASK; |
209 | sparc_mapiorange(bus, pa, res->start, res->end - res->start + 1); | 209 | sparc_mapiorange(bus, pa, res->start, res->end - res->start + 1); |
210 | 210 | ||
211 | return (void __iomem *) (res->start + offset); | 211 | return (void __iomem *)(unsigned long)(res->start + offset); |
212 | } | 212 | } |
213 | 213 | ||
214 | /* | 214 | /* |
@@ -325,7 +325,7 @@ void *sbus_alloc_consistent(struct sbus_dev *sdev, long len, u32 *dma_addrp) | |||
325 | res->name = sdev->prom_name; | 325 | res->name = sdev->prom_name; |
326 | } | 326 | } |
327 | 327 | ||
328 | return (void *)res->start; | 328 | return (void *)(unsigned long)res->start; |
329 | 329 | ||
330 | err_noiommu: | 330 | err_noiommu: |
331 | release_resource(res); | 331 | release_resource(res); |
@@ -819,7 +819,9 @@ _sparc_io_get_info(char *buf, char **start, off_t fpos, int length, int *eof, | |||
819 | if (p + 32 >= e) /* Better than nothing */ | 819 | if (p + 32 >= e) /* Better than nothing */ |
820 | break; | 820 | break; |
821 | if ((nm = r->name) == 0) nm = "???"; | 821 | if ((nm = r->name) == 0) nm = "???"; |
822 | p += sprintf(p, "%08lx-%08lx: %s\n", r->start, r->end, nm); | 822 | p += sprintf(p, "%016llx-%016llx: %s\n", |
823 | (unsigned long long)r->start, | ||
824 | (unsigned long long)r->end, nm); | ||
823 | } | 825 | } |
824 | 826 | ||
825 | return p-buf; | 827 | return p-buf; |
diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c index bcfdddd0418a..5df3ebdc0ab1 100644 --- a/arch/sparc/kernel/pcic.c +++ b/arch/sparc/kernel/pcic.c | |||
@@ -860,7 +860,7 @@ char * __init pcibios_setup(char *str) | |||
860 | } | 860 | } |
861 | 861 | ||
862 | void pcibios_align_resource(void *data, struct resource *res, | 862 | void pcibios_align_resource(void *data, struct resource *res, |
863 | unsigned long size, unsigned long align) | 863 | resource_size_t size, resource_size_t align) |
864 | { | 864 | { |
865 | } | 865 | } |
866 | 866 | ||
diff --git a/arch/sparc/kernel/setup.c b/arch/sparc/kernel/setup.c index a893a9cc9534..2e5d08ce217b 100644 --- a/arch/sparc/kernel/setup.c +++ b/arch/sparc/kernel/setup.c | |||
@@ -496,7 +496,7 @@ static int __init topology_init(void) | |||
496 | if (!p) | 496 | if (!p) |
497 | err = -ENOMEM; | 497 | err = -ENOMEM; |
498 | else | 498 | else |
499 | register_cpu(p, i, NULL); | 499 | register_cpu(p, i); |
500 | } | 500 | } |
501 | 501 | ||
502 | return err; | 502 | return err; |
diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c index cc89b06d0178..ab9e640df228 100644 --- a/arch/sparc64/kernel/irq.c +++ b/arch/sparc64/kernel/irq.c | |||
@@ -151,7 +151,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
151 | for_each_online_cpu(j) | 151 | for_each_online_cpu(j) |
152 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 152 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
153 | #endif | 153 | #endif |
154 | seq_printf(p, " %9s", irq_desc[i].handler->typename); | 154 | seq_printf(p, " %9s", irq_desc[i].chip->typename); |
155 | seq_printf(p, " %s", action->name); | 155 | seq_printf(p, " %s", action->name); |
156 | 156 | ||
157 | for (action=action->next; action; action = action->next) | 157 | for (action=action->next; action; action = action->next) |
@@ -224,7 +224,7 @@ static inline struct ino_bucket *virt_irq_to_bucket(unsigned int virt_irq) | |||
224 | #ifdef CONFIG_SMP | 224 | #ifdef CONFIG_SMP |
225 | static int irq_choose_cpu(unsigned int virt_irq) | 225 | static int irq_choose_cpu(unsigned int virt_irq) |
226 | { | 226 | { |
227 | cpumask_t mask = irq_affinity[virt_irq]; | 227 | cpumask_t mask = irq_desc[virt_irq].affinity; |
228 | int cpuid; | 228 | int cpuid; |
229 | 229 | ||
230 | if (cpus_equal(mask, CPU_MASK_ALL)) { | 230 | if (cpus_equal(mask, CPU_MASK_ALL)) { |
@@ -414,8 +414,8 @@ void irq_install_pre_handler(int virt_irq, | |||
414 | data->pre_handler_arg1 = arg1; | 414 | data->pre_handler_arg1 = arg1; |
415 | data->pre_handler_arg2 = arg2; | 415 | data->pre_handler_arg2 = arg2; |
416 | 416 | ||
417 | desc->handler = (desc->handler == &sun4u_irq ? | 417 | desc->chip = (desc->chip == &sun4u_irq ? |
418 | &sun4u_irq_ack : &sun4v_irq_ack); | 418 | &sun4u_irq_ack : &sun4v_irq_ack); |
419 | } | 419 | } |
420 | 420 | ||
421 | unsigned int build_irq(int inofixup, unsigned long iclr, unsigned long imap) | 421 | unsigned int build_irq(int inofixup, unsigned long iclr, unsigned long imap) |
@@ -431,7 +431,7 @@ unsigned int build_irq(int inofixup, unsigned long iclr, unsigned long imap) | |||
431 | bucket = &ivector_table[ino]; | 431 | bucket = &ivector_table[ino]; |
432 | if (!bucket->virt_irq) { | 432 | if (!bucket->virt_irq) { |
433 | bucket->virt_irq = virt_irq_alloc(__irq(bucket)); | 433 | bucket->virt_irq = virt_irq_alloc(__irq(bucket)); |
434 | irq_desc[bucket->virt_irq].handler = &sun4u_irq; | 434 | irq_desc[bucket->virt_irq].chip = &sun4u_irq; |
435 | } | 435 | } |
436 | 436 | ||
437 | desc = irq_desc + bucket->virt_irq; | 437 | desc = irq_desc + bucket->virt_irq; |
@@ -465,7 +465,7 @@ unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino) | |||
465 | bucket = &ivector_table[sysino]; | 465 | bucket = &ivector_table[sysino]; |
466 | if (!bucket->virt_irq) { | 466 | if (!bucket->virt_irq) { |
467 | bucket->virt_irq = virt_irq_alloc(__irq(bucket)); | 467 | bucket->virt_irq = virt_irq_alloc(__irq(bucket)); |
468 | irq_desc[bucket->virt_irq].handler = &sun4v_irq; | 468 | irq_desc[bucket->virt_irq].chip = &sun4v_irq; |
469 | } | 469 | } |
470 | 470 | ||
471 | desc = irq_desc + bucket->virt_irq; | 471 | desc = irq_desc + bucket->virt_irq; |
diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c index 6c9e3e94abaa..20ca9ec8fd3b 100644 --- a/arch/sparc64/kernel/pci.c +++ b/arch/sparc64/kernel/pci.c | |||
@@ -357,7 +357,7 @@ void pcibios_update_irq(struct pci_dev *pdev, int irq) | |||
357 | } | 357 | } |
358 | 358 | ||
359 | void pcibios_align_resource(void *data, struct resource *res, | 359 | void pcibios_align_resource(void *data, struct resource *res, |
360 | unsigned long size, unsigned long align) | 360 | resource_size_t size, resource_size_t align) |
361 | { | 361 | { |
362 | } | 362 | } |
363 | 363 | ||
diff --git a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c index 2ffda012385e..fae43a3054a0 100644 --- a/arch/um/kernel/irq.c +++ b/arch/um/kernel/irq.c | |||
@@ -63,7 +63,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
63 | for_each_online_cpu(j) | 63 | for_each_online_cpu(j) |
64 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 64 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
65 | #endif | 65 | #endif |
66 | seq_printf(p, " %14s", irq_desc[i].handler->typename); | 66 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
67 | seq_printf(p, " %s", action->name); | 67 | seq_printf(p, " %s", action->name); |
68 | 68 | ||
69 | for (action=action->next; action; action = action->next) | 69 | for (action=action->next; action; action = action->next) |
@@ -451,13 +451,13 @@ void __init init_IRQ(void) | |||
451 | irq_desc[TIMER_IRQ].status = IRQ_DISABLED; | 451 | irq_desc[TIMER_IRQ].status = IRQ_DISABLED; |
452 | irq_desc[TIMER_IRQ].action = NULL; | 452 | irq_desc[TIMER_IRQ].action = NULL; |
453 | irq_desc[TIMER_IRQ].depth = 1; | 453 | irq_desc[TIMER_IRQ].depth = 1; |
454 | irq_desc[TIMER_IRQ].handler = &SIGVTALRM_irq_type; | 454 | irq_desc[TIMER_IRQ].chip = &SIGVTALRM_irq_type; |
455 | enable_irq(TIMER_IRQ); | 455 | enable_irq(TIMER_IRQ); |
456 | for (i = 1; i < NR_IRQS; i++) { | 456 | for (i = 1; i < NR_IRQS; i++) { |
457 | irq_desc[i].status = IRQ_DISABLED; | 457 | irq_desc[i].status = IRQ_DISABLED; |
458 | irq_desc[i].action = NULL; | 458 | irq_desc[i].action = NULL; |
459 | irq_desc[i].depth = 1; | 459 | irq_desc[i].depth = 1; |
460 | irq_desc[i].handler = &normal_irq_type; | 460 | irq_desc[i].chip = &normal_irq_type; |
461 | enable_irq(i); | 461 | enable_irq(i); |
462 | } | 462 | } |
463 | } | 463 | } |
diff --git a/arch/v850/kernel/irq.c b/arch/v850/kernel/irq.c index 7a151c26f82e..858c45819aab 100644 --- a/arch/v850/kernel/irq.c +++ b/arch/v850/kernel/irq.c | |||
@@ -65,10 +65,10 @@ int show_interrupts(struct seq_file *p, void *v) | |||
65 | int j; | 65 | int j; |
66 | int count = 0; | 66 | int count = 0; |
67 | int num = -1; | 67 | int num = -1; |
68 | const char *type_name = irq_desc[irq].handler->typename; | 68 | const char *type_name = irq_desc[irq].chip->typename; |
69 | 69 | ||
70 | for (j = 0; j < NR_IRQS; j++) | 70 | for (j = 0; j < NR_IRQS; j++) |
71 | if (irq_desc[j].handler->typename == type_name){ | 71 | if (irq_desc[j].chip->typename == type_name){ |
72 | if (irq == j) | 72 | if (irq == j) |
73 | num = count; | 73 | num = count; |
74 | count++; | 74 | count++; |
@@ -117,7 +117,7 @@ init_irq_handlers (int base_irq, int num, int interval, | |||
117 | irq_desc[base_irq].status = IRQ_DISABLED; | 117 | irq_desc[base_irq].status = IRQ_DISABLED; |
118 | irq_desc[base_irq].action = NULL; | 118 | irq_desc[base_irq].action = NULL; |
119 | irq_desc[base_irq].depth = 1; | 119 | irq_desc[base_irq].depth = 1; |
120 | irq_desc[base_irq].handler = irq_type; | 120 | irq_desc[base_irq].chip = irq_type; |
121 | base_irq += interval; | 121 | base_irq += interval; |
122 | } | 122 | } |
123 | } | 123 | } |
diff --git a/arch/v850/kernel/rte_mb_a_pci.c b/arch/v850/kernel/rte_mb_a_pci.c index ffbb6d073bf2..3a7c5c9c3ac6 100644 --- a/arch/v850/kernel/rte_mb_a_pci.c +++ b/arch/v850/kernel/rte_mb_a_pci.c | |||
@@ -329,7 +329,7 @@ void pcibios_fixup_bus(struct pci_bus *b) | |||
329 | 329 | ||
330 | void | 330 | void |
331 | pcibios_align_resource (void *data, struct resource *res, | 331 | pcibios_align_resource (void *data, struct resource *res, |
332 | unsigned long size, unsigned long align) | 332 | resource_size_t size, resource_size_t align) |
333 | { | 333 | { |
334 | } | 334 | } |
335 | 335 | ||
diff --git a/arch/x86_64/Kconfig b/arch/x86_64/Kconfig index ccc4a7fb97a3..91039844820c 100644 --- a/arch/x86_64/Kconfig +++ b/arch/x86_64/Kconfig | |||
@@ -370,6 +370,8 @@ config HOTPLUG_CPU | |||
370 | can be controlled through /sys/devices/system/cpu/cpu#. | 370 | can be controlled through /sys/devices/system/cpu/cpu#. |
371 | Say N if you want to disable CPU hotplug. | 371 | Say N if you want to disable CPU hotplug. |
372 | 372 | ||
373 | config ARCH_ENABLE_MEMORY_HOTPLUG | ||
374 | def_bool y | ||
373 | 375 | ||
374 | config HPET_TIMER | 376 | config HPET_TIMER |
375 | bool | 377 | bool |
diff --git a/arch/x86_64/kernel/i8259.c b/arch/x86_64/kernel/i8259.c index 86b2c1e197aa..3dd1659427dc 100644 --- a/arch/x86_64/kernel/i8259.c +++ b/arch/x86_64/kernel/i8259.c | |||
@@ -235,7 +235,7 @@ void make_8259A_irq(unsigned int irq) | |||
235 | { | 235 | { |
236 | disable_irq_nosync(irq); | 236 | disable_irq_nosync(irq); |
237 | io_apic_irqs &= ~(1<<irq); | 237 | io_apic_irqs &= ~(1<<irq); |
238 | irq_desc[irq].handler = &i8259A_irq_type; | 238 | irq_desc[irq].chip = &i8259A_irq_type; |
239 | enable_irq(irq); | 239 | enable_irq(irq); |
240 | } | 240 | } |
241 | 241 | ||
@@ -468,12 +468,12 @@ void __init init_ISA_irqs (void) | |||
468 | /* | 468 | /* |
469 | * 16 old-style INTA-cycle interrupts: | 469 | * 16 old-style INTA-cycle interrupts: |
470 | */ | 470 | */ |
471 | irq_desc[i].handler = &i8259A_irq_type; | 471 | irq_desc[i].chip = &i8259A_irq_type; |
472 | } else { | 472 | } else { |
473 | /* | 473 | /* |
474 | * 'high' PCI IRQs filled in on demand | 474 | * 'high' PCI IRQs filled in on demand |
475 | */ | 475 | */ |
476 | irq_desc[i].handler = &no_irq_type; | 476 | irq_desc[i].chip = &no_irq_type; |
477 | } | 477 | } |
478 | } | 478 | } |
479 | } | 479 | } |
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c index c768d8a036d0..401b687fef21 100644 --- a/arch/x86_64/kernel/io_apic.c +++ b/arch/x86_64/kernel/io_apic.c | |||
@@ -876,15 +876,17 @@ static struct hw_interrupt_type ioapic_edge_type; | |||
876 | #define IOAPIC_EDGE 0 | 876 | #define IOAPIC_EDGE 0 |
877 | #define IOAPIC_LEVEL 1 | 877 | #define IOAPIC_LEVEL 1 |
878 | 878 | ||
879 | static inline void ioapic_register_intr(int irq, int vector, unsigned long trigger) | 879 | static void ioapic_register_intr(int irq, int vector, unsigned long trigger) |
880 | { | 880 | { |
881 | unsigned idx = use_pci_vector() && !platform_legacy_irq(irq) ? vector : irq; | 881 | unsigned idx; |
882 | |||
883 | idx = use_pci_vector() && !platform_legacy_irq(irq) ? vector : irq; | ||
882 | 884 | ||
883 | if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || | 885 | if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || |
884 | trigger == IOAPIC_LEVEL) | 886 | trigger == IOAPIC_LEVEL) |
885 | irq_desc[idx].handler = &ioapic_level_type; | 887 | irq_desc[idx].chip = &ioapic_level_type; |
886 | else | 888 | else |
887 | irq_desc[idx].handler = &ioapic_edge_type; | 889 | irq_desc[idx].chip = &ioapic_edge_type; |
888 | set_intr_gate(vector, interrupt[idx]); | 890 | set_intr_gate(vector, interrupt[idx]); |
889 | } | 891 | } |
890 | 892 | ||
@@ -986,7 +988,7 @@ static void __init setup_ExtINT_IRQ0_pin(unsigned int apic, unsigned int pin, in | |||
986 | * The timer IRQ doesn't have to know that behind the | 988 | * The timer IRQ doesn't have to know that behind the |
987 | * scene we have a 8259A-master in AEOI mode ... | 989 | * scene we have a 8259A-master in AEOI mode ... |
988 | */ | 990 | */ |
989 | irq_desc[0].handler = &ioapic_edge_type; | 991 | irq_desc[0].chip = &ioapic_edge_type; |
990 | 992 | ||
991 | /* | 993 | /* |
992 | * Add it to the IO-APIC irq-routing table: | 994 | * Add it to the IO-APIC irq-routing table: |
@@ -1616,6 +1618,13 @@ static void set_ioapic_affinity_vector (unsigned int vector, | |||
1616 | #endif // CONFIG_SMP | 1618 | #endif // CONFIG_SMP |
1617 | #endif // CONFIG_PCI_MSI | 1619 | #endif // CONFIG_PCI_MSI |
1618 | 1620 | ||
1621 | static int ioapic_retrigger(unsigned int irq) | ||
1622 | { | ||
1623 | send_IPI_self(IO_APIC_VECTOR(irq)); | ||
1624 | |||
1625 | return 1; | ||
1626 | } | ||
1627 | |||
1619 | /* | 1628 | /* |
1620 | * Level and edge triggered IO-APIC interrupts need different handling, | 1629 | * Level and edge triggered IO-APIC interrupts need different handling, |
1621 | * so we use two separate IRQ descriptors. Edge triggered IRQs can be | 1630 | * so we use two separate IRQ descriptors. Edge triggered IRQs can be |
@@ -1636,6 +1645,7 @@ static struct hw_interrupt_type ioapic_edge_type __read_mostly = { | |||
1636 | #ifdef CONFIG_SMP | 1645 | #ifdef CONFIG_SMP |
1637 | .set_affinity = set_ioapic_affinity, | 1646 | .set_affinity = set_ioapic_affinity, |
1638 | #endif | 1647 | #endif |
1648 | .retrigger = ioapic_retrigger, | ||
1639 | }; | 1649 | }; |
1640 | 1650 | ||
1641 | static struct hw_interrupt_type ioapic_level_type __read_mostly = { | 1651 | static struct hw_interrupt_type ioapic_level_type __read_mostly = { |
@@ -1649,6 +1659,7 @@ static struct hw_interrupt_type ioapic_level_type __read_mostly = { | |||
1649 | #ifdef CONFIG_SMP | 1659 | #ifdef CONFIG_SMP |
1650 | .set_affinity = set_ioapic_affinity, | 1660 | .set_affinity = set_ioapic_affinity, |
1651 | #endif | 1661 | #endif |
1662 | .retrigger = ioapic_retrigger, | ||
1652 | }; | 1663 | }; |
1653 | 1664 | ||
1654 | static inline void init_IO_APIC_traps(void) | 1665 | static inline void init_IO_APIC_traps(void) |
@@ -1683,7 +1694,7 @@ static inline void init_IO_APIC_traps(void) | |||
1683 | make_8259A_irq(irq); | 1694 | make_8259A_irq(irq); |
1684 | else | 1695 | else |
1685 | /* Strange. Oh, well.. */ | 1696 | /* Strange. Oh, well.. */ |
1686 | irq_desc[irq].handler = &no_irq_type; | 1697 | irq_desc[irq].chip = &no_irq_type; |
1687 | } | 1698 | } |
1688 | } | 1699 | } |
1689 | } | 1700 | } |
@@ -1900,7 +1911,7 @@ static inline void check_timer(void) | |||
1900 | apic_printk(APIC_VERBOSE, KERN_INFO "...trying to set up timer as Virtual Wire IRQ..."); | 1911 | apic_printk(APIC_VERBOSE, KERN_INFO "...trying to set up timer as Virtual Wire IRQ..."); |
1901 | 1912 | ||
1902 | disable_8259A_irq(0); | 1913 | disable_8259A_irq(0); |
1903 | irq_desc[0].handler = &lapic_irq_type; | 1914 | irq_desc[0].chip = &lapic_irq_type; |
1904 | apic_write(APIC_LVT0, APIC_DM_FIXED | vector); /* Fixed mode */ | 1915 | apic_write(APIC_LVT0, APIC_DM_FIXED | vector); /* Fixed mode */ |
1905 | enable_8259A_irq(0); | 1916 | enable_8259A_irq(0); |
1906 | 1917 | ||
diff --git a/arch/x86_64/kernel/irq.c b/arch/x86_64/kernel/irq.c index 3be0a7e4bf08..a1f1df5f7bfc 100644 --- a/arch/x86_64/kernel/irq.c +++ b/arch/x86_64/kernel/irq.c | |||
@@ -79,7 +79,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
79 | for_each_online_cpu(j) | 79 | for_each_online_cpu(j) |
80 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 80 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
81 | #endif | 81 | #endif |
82 | seq_printf(p, " %14s", irq_desc[i].handler->typename); | 82 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
83 | 83 | ||
84 | seq_printf(p, " %s", action->name); | 84 | seq_printf(p, " %s", action->name); |
85 | for (action=action->next; action; action = action->next) | 85 | for (action=action->next; action; action = action->next) |
@@ -118,6 +118,12 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs) | |||
118 | /* high bit used in ret_from_ code */ | 118 | /* high bit used in ret_from_ code */ |
119 | unsigned irq = ~regs->orig_rax; | 119 | unsigned irq = ~regs->orig_rax; |
120 | 120 | ||
121 | if (unlikely(irq >= NR_IRQS)) { | ||
122 | printk(KERN_EMERG "%s: cannot handle IRQ %d\n", | ||
123 | __FUNCTION__, irq); | ||
124 | BUG(); | ||
125 | } | ||
126 | |||
121 | exit_idle(); | 127 | exit_idle(); |
122 | irq_enter(); | 128 | irq_enter(); |
123 | #ifdef CONFIG_DEBUG_STACKOVERFLOW | 129 | #ifdef CONFIG_DEBUG_STACKOVERFLOW |
@@ -140,13 +146,13 @@ void fixup_irqs(cpumask_t map) | |||
140 | if (irq == 2) | 146 | if (irq == 2) |
141 | continue; | 147 | continue; |
142 | 148 | ||
143 | cpus_and(mask, irq_affinity[irq], map); | 149 | cpus_and(mask, irq_desc[irq].affinity, map); |
144 | if (any_online_cpu(mask) == NR_CPUS) { | 150 | if (any_online_cpu(mask) == NR_CPUS) { |
145 | printk("Breaking affinity for irq %i\n", irq); | 151 | printk("Breaking affinity for irq %i\n", irq); |
146 | mask = map; | 152 | mask = map; |
147 | } | 153 | } |
148 | if (irq_desc[irq].handler->set_affinity) | 154 | if (irq_desc[irq].chip->set_affinity) |
149 | irq_desc[irq].handler->set_affinity(irq, mask); | 155 | irq_desc[irq].chip->set_affinity(irq, mask); |
150 | else if (irq_desc[irq].action && !(warned++)) | 156 | else if (irq_desc[irq].action && !(warned++)) |
151 | printk("Cannot set affinity for irq %i\n", irq); | 157 | printk("Cannot set affinity for irq %i\n", irq); |
152 | } | 158 | } |
diff --git a/arch/x86_64/kernel/nmi.c b/arch/x86_64/kernel/nmi.c index 399489c93132..0ef9cf2bc45e 100644 --- a/arch/x86_64/kernel/nmi.c +++ b/arch/x86_64/kernel/nmi.c | |||
@@ -607,11 +607,13 @@ void set_nmi_callback(nmi_callback_t callback) | |||
607 | vmalloc_sync_all(); | 607 | vmalloc_sync_all(); |
608 | rcu_assign_pointer(nmi_callback, callback); | 608 | rcu_assign_pointer(nmi_callback, callback); |
609 | } | 609 | } |
610 | EXPORT_SYMBOL_GPL(set_nmi_callback); | ||
610 | 611 | ||
611 | void unset_nmi_callback(void) | 612 | void unset_nmi_callback(void) |
612 | { | 613 | { |
613 | nmi_callback = dummy_nmi_callback; | 614 | nmi_callback = dummy_nmi_callback; |
614 | } | 615 | } |
616 | EXPORT_SYMBOL_GPL(unset_nmi_callback); | ||
615 | 617 | ||
616 | #ifdef CONFIG_SYSCTL | 618 | #ifdef CONFIG_SYSCTL |
617 | 619 | ||
diff --git a/arch/xtensa/kernel/irq.c b/arch/xtensa/kernel/irq.c index 51f9bed455fa..1cf744ee0959 100644 --- a/arch/xtensa/kernel/irq.c +++ b/arch/xtensa/kernel/irq.c | |||
@@ -100,7 +100,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
100 | for_each_online_cpu(j) | 100 | for_each_online_cpu(j) |
101 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 101 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
102 | #endif | 102 | #endif |
103 | seq_printf(p, " %14s", irq_desc[i].handler->typename); | 103 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
104 | seq_printf(p, " %s", action->name); | 104 | seq_printf(p, " %s", action->name); |
105 | 105 | ||
106 | for (action=action->next; action; action = action->next) | 106 | for (action=action->next; action; action = action->next) |
@@ -181,7 +181,7 @@ void __init init_IRQ(void) | |||
181 | int i; | 181 | int i; |
182 | 182 | ||
183 | for (i=0; i < XTENSA_NR_IRQS; i++) | 183 | for (i=0; i < XTENSA_NR_IRQS; i++) |
184 | irq_desc[i].handler = &xtensa_irq_type; | 184 | irq_desc[i].chip = &xtensa_irq_type; |
185 | 185 | ||
186 | cached_irq_mask = 0; | 186 | cached_irq_mask = 0; |
187 | 187 | ||
diff --git a/arch/xtensa/kernel/pci.c b/arch/xtensa/kernel/pci.c index c6f471b9eaa0..eda029fc8972 100644 --- a/arch/xtensa/kernel/pci.c +++ b/arch/xtensa/kernel/pci.c | |||
@@ -71,13 +71,13 @@ static int pci_bus_count; | |||
71 | * which might have be mirrored at 0x0100-0x03ff.. | 71 | * which might have be mirrored at 0x0100-0x03ff.. |
72 | */ | 72 | */ |
73 | void | 73 | void |
74 | pcibios_align_resource(void *data, struct resource *res, unsigned long size, | 74 | pcibios_align_resource(void *data, struct resource *res, resource_size_t size, |
75 | unsigned long align) | 75 | resource_size_t align) |
76 | { | 76 | { |
77 | struct pci_dev *dev = data; | 77 | struct pci_dev *dev = data; |
78 | 78 | ||
79 | if (res->flags & IORESOURCE_IO) { | 79 | if (res->flags & IORESOURCE_IO) { |
80 | unsigned long start = res->start; | 80 | resource_size_t start = res->start; |
81 | 81 | ||
82 | if (size > 0x100) { | 82 | if (size > 0x100) { |
83 | printk(KERN_ERR "PCI: I/O Region %s/%d too large" | 83 | printk(KERN_ERR "PCI: I/O Region %s/%d too large" |
diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index 889855d8d9f9..9e3e2a69c03a 100644 --- a/drivers/amba/bus.c +++ b/drivers/amba/bus.c | |||
@@ -180,8 +180,9 @@ static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL) | |||
180 | amba_attr(id, "%08x\n", dev->periphid); | 180 | amba_attr(id, "%08x\n", dev->periphid); |
181 | amba_attr(irq0, "%u\n", dev->irq[0]); | 181 | amba_attr(irq0, "%u\n", dev->irq[0]); |
182 | amba_attr(irq1, "%u\n", dev->irq[1]); | 182 | amba_attr(irq1, "%u\n", dev->irq[1]); |
183 | amba_attr(resource, "\t%08lx\t%08lx\t%08lx\n", | 183 | amba_attr(resource, "\t%016llx\t%016llx\t%016lx\n", |
184 | dev->res.start, dev->res.end, dev->res.flags); | 184 | (unsigned long long)dev->res.start, (unsigned long long)dev->res.end, |
185 | dev->res.flags); | ||
185 | 186 | ||
186 | /** | 187 | /** |
187 | * amba_device_register - register an AMBA device | 188 | * amba_device_register - register an AMBA device |
diff --git a/drivers/atm/ambassador.c b/drivers/atm/ambassador.c index 4b6bf19c39c0..4048681f36d5 100644 --- a/drivers/atm/ambassador.c +++ b/drivers/atm/ambassador.c | |||
@@ -2257,7 +2257,8 @@ static int __devinit amb_probe(struct pci_dev *pci_dev, const struct pci_device_ | |||
2257 | } | 2257 | } |
2258 | 2258 | ||
2259 | PRINTD (DBG_INFO, "found Madge ATM adapter (amb) at" | 2259 | PRINTD (DBG_INFO, "found Madge ATM adapter (amb) at" |
2260 | " IO %lx, IRQ %u, MEM %p", pci_resource_start(pci_dev, 1), | 2260 | " IO %llx, IRQ %u, MEM %p", |
2261 | (unsigned long long)pci_resource_start(pci_dev, 1), | ||
2261 | irq, bus_to_virt(pci_resource_start(pci_dev, 0))); | 2262 | irq, bus_to_virt(pci_resource_start(pci_dev, 0))); |
2262 | 2263 | ||
2263 | // check IO region | 2264 | // check IO region |
diff --git a/drivers/atm/firestream.c b/drivers/atm/firestream.c index 1bca86edf570..d40605c1af73 100644 --- a/drivers/atm/firestream.c +++ b/drivers/atm/firestream.c | |||
@@ -1658,9 +1658,10 @@ static int __devinit fs_init (struct fs_dev *dev) | |||
1658 | func_enter (); | 1658 | func_enter (); |
1659 | pci_dev = dev->pci_dev; | 1659 | pci_dev = dev->pci_dev; |
1660 | 1660 | ||
1661 | printk (KERN_INFO "found a FireStream %d card, base %08lx, irq%d.\n", | 1661 | printk (KERN_INFO "found a FireStream %d card, base %16llx, irq%d.\n", |
1662 | IS_FS50(dev)?50:155, | 1662 | IS_FS50(dev)?50:155, |
1663 | pci_resource_start(pci_dev, 0), dev->pci_dev->irq); | 1663 | (unsigned long long)pci_resource_start(pci_dev, 0), |
1664 | dev->pci_dev->irq); | ||
1664 | 1665 | ||
1665 | if (fs_debug & FS_DEBUG_INIT) | 1666 | if (fs_debug & FS_DEBUG_INIT) |
1666 | my_hd ((unsigned char *) dev, sizeof (*dev)); | 1667 | my_hd ((unsigned char *) dev, sizeof (*dev)); |
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 3c74ea729fc7..18dd026f470d 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
@@ -210,7 +210,7 @@ static int do_lo_send_aops(struct loop_device *lo, struct bio_vec *bvec, | |||
210 | { | 210 | { |
211 | struct file *file = lo->lo_backing_file; /* kudos to NFsckingS */ | 211 | struct file *file = lo->lo_backing_file; /* kudos to NFsckingS */ |
212 | struct address_space *mapping = file->f_mapping; | 212 | struct address_space *mapping = file->f_mapping; |
213 | struct address_space_operations *aops = mapping->a_ops; | 213 | const struct address_space_operations *aops = mapping->a_ops; |
214 | pgoff_t index; | 214 | pgoff_t index; |
215 | unsigned offset, bv_offs; | 215 | unsigned offset, bv_offs; |
216 | int len, ret; | 216 | int len, ret; |
@@ -784,7 +784,7 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file, | |||
784 | 784 | ||
785 | error = -EINVAL; | 785 | error = -EINVAL; |
786 | if (S_ISREG(inode->i_mode) || S_ISBLK(inode->i_mode)) { | 786 | if (S_ISREG(inode->i_mode) || S_ISBLK(inode->i_mode)) { |
787 | struct address_space_operations *aops = mapping->a_ops; | 787 | const struct address_space_operations *aops = mapping->a_ops; |
788 | /* | 788 | /* |
789 | * If we can't read - sorry. If we only can't write - well, | 789 | * If we can't read - sorry. If we only can't write - well, |
790 | * it's going to be read-only. | 790 | * it's going to be read-only. |
diff --git a/drivers/block/paride/pf.c b/drivers/block/paride/pf.c index 852b564e903a..1a9dee19efcf 100644 --- a/drivers/block/paride/pf.c +++ b/drivers/block/paride/pf.c | |||
@@ -707,7 +707,7 @@ static int pf_detect(void) | |||
707 | if (pi_init(pf->pi, 0, conf[D_PRT], conf[D_MOD], | 707 | if (pi_init(pf->pi, 0, conf[D_PRT], conf[D_MOD], |
708 | conf[D_UNI], conf[D_PRO], conf[D_DLY], | 708 | conf[D_UNI], conf[D_PRO], conf[D_DLY], |
709 | pf_scratch, PI_PF, verbose, pf->name)) { | 709 | pf_scratch, PI_PF, verbose, pf->name)) { |
710 | if (!pf_probe(pf) && pf->disk) { | 710 | if (pf->disk && !pf_probe(pf)) { |
711 | pf->present = 1; | 711 | pf->present = 1; |
712 | k++; | 712 | k++; |
713 | } else | 713 | } else |
diff --git a/drivers/block/rd.c b/drivers/block/rd.c index 940bfd7951e5..0378da04cfa2 100644 --- a/drivers/block/rd.c +++ b/drivers/block/rd.c | |||
@@ -191,7 +191,7 @@ static int ramdisk_set_page_dirty(struct page *page) | |||
191 | return 0; | 191 | return 0; |
192 | } | 192 | } |
193 | 193 | ||
194 | static struct address_space_operations ramdisk_aops = { | 194 | static const struct address_space_operations ramdisk_aops = { |
195 | .readpage = ramdisk_readpage, | 195 | .readpage = ramdisk_readpage, |
196 | .prepare_write = ramdisk_prepare_write, | 196 | .prepare_write = ramdisk_prepare_write, |
197 | .commit_write = ramdisk_commit_write, | 197 | .commit_write = ramdisk_commit_write, |
diff --git a/drivers/block/sx8.c b/drivers/block/sx8.c index 2ae08b343b93..8144ce9f4df0 100644 --- a/drivers/block/sx8.c +++ b/drivers/block/sx8.c | |||
@@ -1694,9 +1694,10 @@ static int carm_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1694 | DPRINTK("waiting for probe_comp\n"); | 1694 | DPRINTK("waiting for probe_comp\n"); |
1695 | wait_for_completion(&host->probe_comp); | 1695 | wait_for_completion(&host->probe_comp); |
1696 | 1696 | ||
1697 | printk(KERN_INFO "%s: pci %s, ports %d, io %lx, irq %u, major %d\n", | 1697 | printk(KERN_INFO "%s: pci %s, ports %d, io %llx, irq %u, major %d\n", |
1698 | host->name, pci_name(pdev), (int) CARM_MAX_PORTS, | 1698 | host->name, pci_name(pdev), (int) CARM_MAX_PORTS, |
1699 | pci_resource_start(pdev, 0), pdev->irq, host->major); | 1699 | (unsigned long long)pci_resource_start(pdev, 0), |
1700 | pdev->irq, host->major); | ||
1700 | 1701 | ||
1701 | carm_host_id++; | 1702 | carm_host_id++; |
1702 | pci_set_drvdata(pdev, host); | 1703 | pci_set_drvdata(pdev, host); |
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 410d70cb76fb..c40e487d9f5c 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -961,6 +961,7 @@ config PC8736x_GPIO | |||
961 | 961 | ||
962 | config NSC_GPIO | 962 | config NSC_GPIO |
963 | tristate "NatSemi Base GPIO Support" | 963 | tristate "NatSemi Base GPIO Support" |
964 | depends on X86_32 | ||
964 | # selected by SCx200_GPIO and PC8736x_GPIO | 965 | # selected by SCx200_GPIO and PC8736x_GPIO |
965 | # what about 2 selectors differing: m != y | 966 | # what about 2 selectors differing: m != y |
966 | help | 967 | help |
diff --git a/drivers/char/applicom.c b/drivers/char/applicom.c index 9275d5e52e6d..72fb60765c45 100644 --- a/drivers/char/applicom.c +++ b/drivers/char/applicom.c | |||
@@ -209,13 +209,16 @@ static int __init applicom_init(void) | |||
209 | RamIO = ioremap(dev->resource[0].start, LEN_RAM_IO); | 209 | RamIO = ioremap(dev->resource[0].start, LEN_RAM_IO); |
210 | 210 | ||
211 | if (!RamIO) { | 211 | if (!RamIO) { |
212 | printk(KERN_INFO "ac.o: Failed to ioremap PCI memory space at 0x%lx\n", dev->resource[0].start); | 212 | printk(KERN_INFO "ac.o: Failed to ioremap PCI memory " |
213 | "space at 0x%llx\n", | ||
214 | (unsigned long long)dev->resource[0].start); | ||
213 | pci_disable_device(dev); | 215 | pci_disable_device(dev); |
214 | return -EIO; | 216 | return -EIO; |
215 | } | 217 | } |
216 | 218 | ||
217 | printk(KERN_INFO "Applicom %s found at mem 0x%lx, irq %d\n", | 219 | printk(KERN_INFO "Applicom %s found at mem 0x%llx, irq %d\n", |
218 | applicom_pci_devnames[dev->device-1], dev->resource[0].start, | 220 | applicom_pci_devnames[dev->device-1], |
221 | (unsigned long long)dev->resource[0].start, | ||
219 | dev->irq); | 222 | dev->irq); |
220 | 223 | ||
221 | boardno = ac_register_board(dev->resource[0].start, RamIO,0); | 224 | boardno = ac_register_board(dev->resource[0].start, RamIO,0); |
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index 83ed6ae466a5..ad26f4b997c5 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c | |||
@@ -3738,11 +3738,8 @@ static int ipmi_init_msghandler(void) | |||
3738 | proc_ipmi_root->owner = THIS_MODULE; | 3738 | proc_ipmi_root->owner = THIS_MODULE; |
3739 | #endif /* CONFIG_PROC_FS */ | 3739 | #endif /* CONFIG_PROC_FS */ |
3740 | 3740 | ||
3741 | init_timer(&ipmi_timer); | 3741 | setup_timer(&ipmi_timer, ipmi_timeout, 0); |
3742 | ipmi_timer.data = 0; | 3742 | mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES); |
3743 | ipmi_timer.function = ipmi_timeout; | ||
3744 | ipmi_timer.expires = jiffies + IPMI_TIMEOUT_JIFFIES; | ||
3745 | add_timer(&ipmi_timer); | ||
3746 | 3743 | ||
3747 | atomic_notifier_chain_register(&panic_notifier_list, &panic_block); | 3744 | atomic_notifier_chain_register(&panic_notifier_list, &panic_block); |
3748 | 3745 | ||
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 101c14b9b26d..bd4f2248b758 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -55,23 +55,6 @@ | |||
55 | #include <linux/mutex.h> | 55 | #include <linux/mutex.h> |
56 | #include <linux/kthread.h> | 56 | #include <linux/kthread.h> |
57 | #include <asm/irq.h> | 57 | #include <asm/irq.h> |
58 | #ifdef CONFIG_HIGH_RES_TIMERS | ||
59 | #include <linux/hrtime.h> | ||
60 | # if defined(schedule_next_int) | ||
61 | /* Old high-res timer code, do translations. */ | ||
62 | # define get_arch_cycles(a) quick_update_jiffies_sub(a) | ||
63 | # define arch_cycles_per_jiffy cycles_per_jiffies | ||
64 | # endif | ||
65 | static inline void add_usec_to_timer(struct timer_list *t, long v) | ||
66 | { | ||
67 | t->arch_cycle_expires += nsec_to_arch_cycle(v * 1000); | ||
68 | while (t->arch_cycle_expires >= arch_cycles_per_jiffy) | ||
69 | { | ||
70 | t->expires++; | ||
71 | t->arch_cycle_expires -= arch_cycles_per_jiffy; | ||
72 | } | ||
73 | } | ||
74 | #endif | ||
75 | #include <linux/interrupt.h> | 58 | #include <linux/interrupt.h> |
76 | #include <linux/rcupdate.h> | 59 | #include <linux/rcupdate.h> |
77 | #include <linux/ipmi_smi.h> | 60 | #include <linux/ipmi_smi.h> |
@@ -243,8 +226,6 @@ static int register_xaction_notifier(struct notifier_block * nb) | |||
243 | return atomic_notifier_chain_register(&xaction_notifier_list, nb); | 226 | return atomic_notifier_chain_register(&xaction_notifier_list, nb); |
244 | } | 227 | } |
245 | 228 | ||
246 | static void si_restart_short_timer(struct smi_info *smi_info); | ||
247 | |||
248 | static void deliver_recv_msg(struct smi_info *smi_info, | 229 | static void deliver_recv_msg(struct smi_info *smi_info, |
249 | struct ipmi_smi_msg *msg) | 230 | struct ipmi_smi_msg *msg) |
250 | { | 231 | { |
@@ -768,7 +749,6 @@ static void sender(void *send_info, | |||
768 | && (smi_info->curr_msg == NULL)) | 749 | && (smi_info->curr_msg == NULL)) |
769 | { | 750 | { |
770 | start_next_msg(smi_info); | 751 | start_next_msg(smi_info); |
771 | si_restart_short_timer(smi_info); | ||
772 | } | 752 | } |
773 | spin_unlock_irqrestore(&(smi_info->si_lock), flags); | 753 | spin_unlock_irqrestore(&(smi_info->si_lock), flags); |
774 | } | 754 | } |
@@ -833,37 +813,6 @@ static void request_events(void *send_info) | |||
833 | 813 | ||
834 | static int initialized = 0; | 814 | static int initialized = 0; |
835 | 815 | ||
836 | /* Must be called with interrupts off and with the si_lock held. */ | ||
837 | static void si_restart_short_timer(struct smi_info *smi_info) | ||
838 | { | ||
839 | #if defined(CONFIG_HIGH_RES_TIMERS) | ||
840 | unsigned long flags; | ||
841 | unsigned long jiffies_now; | ||
842 | unsigned long seq; | ||
843 | |||
844 | if (del_timer(&(smi_info->si_timer))) { | ||
845 | /* If we don't delete the timer, then it will go off | ||
846 | immediately, anyway. So we only process if we | ||
847 | actually delete the timer. */ | ||
848 | |||
849 | do { | ||
850 | seq = read_seqbegin_irqsave(&xtime_lock, flags); | ||
851 | jiffies_now = jiffies; | ||
852 | smi_info->si_timer.expires = jiffies_now; | ||
853 | smi_info->si_timer.arch_cycle_expires | ||
854 | = get_arch_cycles(jiffies_now); | ||
855 | } while (read_seqretry_irqrestore(&xtime_lock, seq, flags)); | ||
856 | |||
857 | add_usec_to_timer(&smi_info->si_timer, SI_SHORT_TIMEOUT_USEC); | ||
858 | |||
859 | add_timer(&(smi_info->si_timer)); | ||
860 | spin_lock_irqsave(&smi_info->count_lock, flags); | ||
861 | smi_info->timeout_restarts++; | ||
862 | spin_unlock_irqrestore(&smi_info->count_lock, flags); | ||
863 | } | ||
864 | #endif | ||
865 | } | ||
866 | |||
867 | static void smi_timeout(unsigned long data) | 816 | static void smi_timeout(unsigned long data) |
868 | { | 817 | { |
869 | struct smi_info *smi_info = (struct smi_info *) data; | 818 | struct smi_info *smi_info = (struct smi_info *) data; |
@@ -904,31 +853,15 @@ static void smi_timeout(unsigned long data) | |||
904 | /* If the state machine asks for a short delay, then shorten | 853 | /* If the state machine asks for a short delay, then shorten |
905 | the timer timeout. */ | 854 | the timer timeout. */ |
906 | if (smi_result == SI_SM_CALL_WITH_DELAY) { | 855 | if (smi_result == SI_SM_CALL_WITH_DELAY) { |
907 | #if defined(CONFIG_HIGH_RES_TIMERS) | ||
908 | unsigned long seq; | ||
909 | #endif | ||
910 | spin_lock_irqsave(&smi_info->count_lock, flags); | 856 | spin_lock_irqsave(&smi_info->count_lock, flags); |
911 | smi_info->short_timeouts++; | 857 | smi_info->short_timeouts++; |
912 | spin_unlock_irqrestore(&smi_info->count_lock, flags); | 858 | spin_unlock_irqrestore(&smi_info->count_lock, flags); |
913 | #if defined(CONFIG_HIGH_RES_TIMERS) | ||
914 | do { | ||
915 | seq = read_seqbegin_irqsave(&xtime_lock, flags); | ||
916 | smi_info->si_timer.expires = jiffies; | ||
917 | smi_info->si_timer.arch_cycle_expires | ||
918 | = get_arch_cycles(smi_info->si_timer.expires); | ||
919 | } while (read_seqretry_irqrestore(&xtime_lock, seq, flags)); | ||
920 | add_usec_to_timer(&smi_info->si_timer, SI_SHORT_TIMEOUT_USEC); | ||
921 | #else | ||
922 | smi_info->si_timer.expires = jiffies + 1; | 859 | smi_info->si_timer.expires = jiffies + 1; |
923 | #endif | ||
924 | } else { | 860 | } else { |
925 | spin_lock_irqsave(&smi_info->count_lock, flags); | 861 | spin_lock_irqsave(&smi_info->count_lock, flags); |
926 | smi_info->long_timeouts++; | 862 | smi_info->long_timeouts++; |
927 | spin_unlock_irqrestore(&smi_info->count_lock, flags); | 863 | spin_unlock_irqrestore(&smi_info->count_lock, flags); |
928 | smi_info->si_timer.expires = jiffies + SI_TIMEOUT_JIFFIES; | 864 | smi_info->si_timer.expires = jiffies + SI_TIMEOUT_JIFFIES; |
929 | #if defined(CONFIG_HIGH_RES_TIMERS) | ||
930 | smi_info->si_timer.arch_cycle_expires = 0; | ||
931 | #endif | ||
932 | } | 865 | } |
933 | 866 | ||
934 | do_add_timer: | 867 | do_add_timer: |
diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c index 8f8867170973..1a0a19c53605 100644 --- a/drivers/char/ipmi/ipmi_watchdog.c +++ b/drivers/char/ipmi/ipmi_watchdog.c | |||
@@ -949,9 +949,10 @@ static int wdog_reboot_handler(struct notifier_block *this, | |||
949 | /* Disable the WDT if we are shutting down. */ | 949 | /* Disable the WDT if we are shutting down. */ |
950 | ipmi_watchdog_state = WDOG_TIMEOUT_NONE; | 950 | ipmi_watchdog_state = WDOG_TIMEOUT_NONE; |
951 | panic_halt_ipmi_set_timeout(); | 951 | panic_halt_ipmi_set_timeout(); |
952 | } else { | 952 | } else if (ipmi_watchdog_state != WDOG_TIMEOUT_NONE) { |
953 | /* Set a long timer to let the reboot happens, but | 953 | /* Set a long timer to let the reboot happens, but |
954 | reboot if it hangs. */ | 954 | reboot if it hangs, but only if the watchdog |
955 | timer was already running. */ | ||
955 | timeout = 120; | 956 | timeout = 120; |
956 | pretimeout = 0; | 957 | pretimeout = 0; |
957 | ipmi_watchdog_state = WDOG_TIMEOUT_RESET; | 958 | ipmi_watchdog_state = WDOG_TIMEOUT_RESET; |
@@ -973,16 +974,17 @@ static int wdog_panic_handler(struct notifier_block *this, | |||
973 | { | 974 | { |
974 | static int panic_event_handled = 0; | 975 | static int panic_event_handled = 0; |
975 | 976 | ||
976 | /* On a panic, if we have a panic timeout, make sure that the thing | 977 | /* On a panic, if we have a panic timeout, make sure to extend |
977 | reboots, even if it hangs during that panic. */ | 978 | the watchdog timer to a reasonable value to complete the |
978 | if (watchdog_user && !panic_event_handled) { | 979 | panic, if the watchdog timer is running. Plus the |
979 | /* Make sure the panic doesn't hang, and make sure we | 980 | pretimeout is meaningless at panic time. */ |
980 | do this only once. */ | 981 | if (watchdog_user && !panic_event_handled && |
982 | ipmi_watchdog_state != WDOG_TIMEOUT_NONE) { | ||
983 | /* Make sure we do this only once. */ | ||
981 | panic_event_handled = 1; | 984 | panic_event_handled = 1; |
982 | 985 | ||
983 | timeout = 255; | 986 | timeout = 255; |
984 | pretimeout = 0; | 987 | pretimeout = 0; |
985 | ipmi_watchdog_state = WDOG_TIMEOUT_RESET; | ||
986 | panic_halt_ipmi_set_timeout(); | 988 | panic_halt_ipmi_set_timeout(); |
987 | } | 989 | } |
988 | 990 | ||
diff --git a/drivers/char/istallion.c b/drivers/char/istallion.c index ef20c1fc9c4c..216c79256de3 100644 --- a/drivers/char/istallion.c +++ b/drivers/char/istallion.c | |||
@@ -42,13 +42,12 @@ | |||
42 | #include <linux/devfs_fs_kernel.h> | 42 | #include <linux/devfs_fs_kernel.h> |
43 | #include <linux/device.h> | 43 | #include <linux/device.h> |
44 | #include <linux/wait.h> | 44 | #include <linux/wait.h> |
45 | #include <linux/eisa.h> | ||
45 | 46 | ||
46 | #include <asm/io.h> | 47 | #include <asm/io.h> |
47 | #include <asm/uaccess.h> | 48 | #include <asm/uaccess.h> |
48 | 49 | ||
49 | #ifdef CONFIG_PCI | ||
50 | #include <linux/pci.h> | 50 | #include <linux/pci.h> |
51 | #endif | ||
52 | 51 | ||
53 | /*****************************************************************************/ | 52 | /*****************************************************************************/ |
54 | 53 | ||
@@ -137,6 +136,10 @@ static stlconf_t stli_brdconf[] = { | |||
137 | 136 | ||
138 | static int stli_nrbrds = ARRAY_SIZE(stli_brdconf); | 137 | static int stli_nrbrds = ARRAY_SIZE(stli_brdconf); |
139 | 138 | ||
139 | /* stli_lock must NOT be taken holding brd_lock */ | ||
140 | static spinlock_t stli_lock; /* TTY logic lock */ | ||
141 | static spinlock_t brd_lock; /* Board logic lock */ | ||
142 | |||
140 | /* | 143 | /* |
141 | * There is some experimental EISA board detection code in this driver. | 144 | * There is some experimental EISA board detection code in this driver. |
142 | * By default it is disabled, but for those that want to try it out, | 145 | * By default it is disabled, but for those that want to try it out, |
@@ -173,14 +176,6 @@ static char *stli_serialname = "ttyE"; | |||
173 | 176 | ||
174 | static struct tty_driver *stli_serial; | 177 | static struct tty_driver *stli_serial; |
175 | 178 | ||
176 | /* | ||
177 | * We will need to allocate a temporary write buffer for chars that | ||
178 | * come direct from user space. The problem is that a copy from user | ||
179 | * space might cause a page fault (typically on a system that is | ||
180 | * swapping!). All ports will share one buffer - since if the system | ||
181 | * is already swapping a shared buffer won't make things any worse. | ||
182 | */ | ||
183 | static char *stli_tmpwritebuf; | ||
184 | 179 | ||
185 | #define STLI_TXBUFSIZE 4096 | 180 | #define STLI_TXBUFSIZE 4096 |
186 | 181 | ||
@@ -419,7 +414,7 @@ static int stli_eisamempsize = ARRAY_SIZE(stli_eisamemprobeaddrs); | |||
419 | #endif | 414 | #endif |
420 | 415 | ||
421 | static struct pci_device_id istallion_pci_tbl[] = { | 416 | static struct pci_device_id istallion_pci_tbl[] = { |
422 | { PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECRA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, | 417 | { PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECRA), }, |
423 | { 0 } | 418 | { 0 } |
424 | }; | 419 | }; |
425 | MODULE_DEVICE_TABLE(pci, istallion_pci_tbl); | 420 | MODULE_DEVICE_TABLE(pci, istallion_pci_tbl); |
@@ -682,7 +677,7 @@ static int stli_startbrd(stlibrd_t *brdp); | |||
682 | static ssize_t stli_memread(struct file *fp, char __user *buf, size_t count, loff_t *offp); | 677 | static ssize_t stli_memread(struct file *fp, char __user *buf, size_t count, loff_t *offp); |
683 | static ssize_t stli_memwrite(struct file *fp, const char __user *buf, size_t count, loff_t *offp); | 678 | static ssize_t stli_memwrite(struct file *fp, const char __user *buf, size_t count, loff_t *offp); |
684 | static int stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg); | 679 | static int stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg); |
685 | static void stli_brdpoll(stlibrd_t *brdp, volatile cdkhdr_t *hdrp); | 680 | static void stli_brdpoll(stlibrd_t *brdp, cdkhdr_t __iomem *hdrp); |
686 | static void stli_poll(unsigned long arg); | 681 | static void stli_poll(unsigned long arg); |
687 | static int stli_hostcmd(stlibrd_t *brdp, stliport_t *portp); | 682 | static int stli_hostcmd(stlibrd_t *brdp, stliport_t *portp); |
688 | static int stli_initopen(stlibrd_t *brdp, stliport_t *portp); | 683 | static int stli_initopen(stlibrd_t *brdp, stliport_t *portp); |
@@ -693,7 +688,8 @@ static void stli_dohangup(void *arg); | |||
693 | static int stli_setport(stliport_t *portp); | 688 | static int stli_setport(stliport_t *portp); |
694 | static int stli_cmdwait(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback); | 689 | static int stli_cmdwait(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback); |
695 | static void stli_sendcmd(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback); | 690 | static void stli_sendcmd(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback); |
696 | static void stli_dodelaycmd(stliport_t *portp, volatile cdkctrl_t *cp); | 691 | static void __stli_sendcmd(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback); |
692 | static void stli_dodelaycmd(stliport_t *portp, cdkctrl_t __iomem *cp); | ||
697 | static void stli_mkasyport(stliport_t *portp, asyport_t *pp, struct termios *tiosp); | 693 | static void stli_mkasyport(stliport_t *portp, asyport_t *pp, struct termios *tiosp); |
698 | static void stli_mkasysigs(asysigs_t *sp, int dtr, int rts); | 694 | static void stli_mkasysigs(asysigs_t *sp, int dtr, int rts); |
699 | static long stli_mktiocm(unsigned long sigvalue); | 695 | static long stli_mktiocm(unsigned long sigvalue); |
@@ -799,18 +795,8 @@ static struct class *istallion_class; | |||
799 | 795 | ||
800 | static int __init istallion_module_init(void) | 796 | static int __init istallion_module_init(void) |
801 | { | 797 | { |
802 | unsigned long flags; | ||
803 | |||
804 | #ifdef DEBUG | ||
805 | printk("init_module()\n"); | ||
806 | #endif | ||
807 | |||
808 | save_flags(flags); | ||
809 | cli(); | ||
810 | stli_init(); | 798 | stli_init(); |
811 | restore_flags(flags); | 799 | return 0; |
812 | |||
813 | return(0); | ||
814 | } | 800 | } |
815 | 801 | ||
816 | /*****************************************************************************/ | 802 | /*****************************************************************************/ |
@@ -819,33 +805,24 @@ static void __exit istallion_module_exit(void) | |||
819 | { | 805 | { |
820 | stlibrd_t *brdp; | 806 | stlibrd_t *brdp; |
821 | stliport_t *portp; | 807 | stliport_t *portp; |
822 | unsigned long flags; | ||
823 | int i, j; | 808 | int i, j; |
824 | 809 | ||
825 | #ifdef DEBUG | ||
826 | printk("cleanup_module()\n"); | ||
827 | #endif | ||
828 | |||
829 | printk(KERN_INFO "Unloading %s: version %s\n", stli_drvtitle, | 810 | printk(KERN_INFO "Unloading %s: version %s\n", stli_drvtitle, |
830 | stli_drvversion); | 811 | stli_drvversion); |
831 | 812 | ||
832 | save_flags(flags); | 813 | /* |
833 | cli(); | 814 | * Free up all allocated resources used by the ports. This includes |
834 | 815 | * memory and interrupts. | |
835 | /* | 816 | */ |
836 | * Free up all allocated resources used by the ports. This includes | ||
837 | * memory and interrupts. | ||
838 | */ | ||
839 | if (stli_timeron) { | 817 | if (stli_timeron) { |
840 | stli_timeron = 0; | 818 | stli_timeron = 0; |
841 | del_timer(&stli_timerlist); | 819 | del_timer_sync(&stli_timerlist); |
842 | } | 820 | } |
843 | 821 | ||
844 | i = tty_unregister_driver(stli_serial); | 822 | i = tty_unregister_driver(stli_serial); |
845 | if (i) { | 823 | if (i) { |
846 | printk("STALLION: failed to un-register tty driver, " | 824 | printk("STALLION: failed to un-register tty driver, " |
847 | "errno=%d\n", -i); | 825 | "errno=%d\n", -i); |
848 | restore_flags(flags); | ||
849 | return; | 826 | return; |
850 | } | 827 | } |
851 | put_tty_driver(stli_serial); | 828 | put_tty_driver(stli_serial); |
@@ -859,16 +836,15 @@ static void __exit istallion_module_exit(void) | |||
859 | printk("STALLION: failed to un-register serial memory device, " | 836 | printk("STALLION: failed to un-register serial memory device, " |
860 | "errno=%d\n", -i); | 837 | "errno=%d\n", -i); |
861 | 838 | ||
862 | kfree(stli_tmpwritebuf); | ||
863 | kfree(stli_txcookbuf); | 839 | kfree(stli_txcookbuf); |
864 | 840 | ||
865 | for (i = 0; (i < stli_nrbrds); i++) { | 841 | for (i = 0; (i < stli_nrbrds); i++) { |
866 | if ((brdp = stli_brds[i]) == (stlibrd_t *) NULL) | 842 | if ((brdp = stli_brds[i]) == NULL) |
867 | continue; | 843 | continue; |
868 | for (j = 0; (j < STL_MAXPORTS); j++) { | 844 | for (j = 0; (j < STL_MAXPORTS); j++) { |
869 | portp = brdp->ports[j]; | 845 | portp = brdp->ports[j]; |
870 | if (portp != (stliport_t *) NULL) { | 846 | if (portp != NULL) { |
871 | if (portp->tty != (struct tty_struct *) NULL) | 847 | if (portp->tty != NULL) |
872 | tty_hangup(portp->tty); | 848 | tty_hangup(portp->tty); |
873 | kfree(portp); | 849 | kfree(portp); |
874 | } | 850 | } |
@@ -878,10 +854,8 @@ static void __exit istallion_module_exit(void) | |||
878 | if (brdp->iosize > 0) | 854 | if (brdp->iosize > 0) |
879 | release_region(brdp->iobase, brdp->iosize); | 855 | release_region(brdp->iobase, brdp->iosize); |
880 | kfree(brdp); | 856 | kfree(brdp); |
881 | stli_brds[i] = (stlibrd_t *) NULL; | 857 | stli_brds[i] = NULL; |
882 | } | 858 | } |
883 | |||
884 | restore_flags(flags); | ||
885 | } | 859 | } |
886 | 860 | ||
887 | module_init(istallion_module_init); | 861 | module_init(istallion_module_init); |
@@ -895,19 +869,15 @@ module_exit(istallion_module_exit); | |||
895 | 869 | ||
896 | static void stli_argbrds(void) | 870 | static void stli_argbrds(void) |
897 | { | 871 | { |
898 | stlconf_t conf; | 872 | stlconf_t conf; |
899 | stlibrd_t *brdp; | 873 | stlibrd_t *brdp; |
900 | int i; | 874 | int i; |
901 | |||
902 | #ifdef DEBUG | ||
903 | printk("stli_argbrds()\n"); | ||
904 | #endif | ||
905 | 875 | ||
906 | for (i = stli_nrbrds; i < ARRAY_SIZE(stli_brdsp); i++) { | 876 | for (i = stli_nrbrds; i < ARRAY_SIZE(stli_brdsp); i++) { |
907 | memset(&conf, 0, sizeof(conf)); | 877 | memset(&conf, 0, sizeof(conf)); |
908 | if (stli_parsebrd(&conf, stli_brdsp[i]) == 0) | 878 | if (stli_parsebrd(&conf, stli_brdsp[i]) == 0) |
909 | continue; | 879 | continue; |
910 | if ((brdp = stli_allocbrd()) == (stlibrd_t *) NULL) | 880 | if ((brdp = stli_allocbrd()) == NULL) |
911 | continue; | 881 | continue; |
912 | stli_nrbrds = i + 1; | 882 | stli_nrbrds = i + 1; |
913 | brdp->brdnr = i; | 883 | brdp->brdnr = i; |
@@ -926,9 +896,9 @@ static void stli_argbrds(void) | |||
926 | 896 | ||
927 | static unsigned long stli_atol(char *str) | 897 | static unsigned long stli_atol(char *str) |
928 | { | 898 | { |
929 | unsigned long val; | 899 | unsigned long val; |
930 | int base, c; | 900 | int base, c; |
931 | char *sp; | 901 | char *sp; |
932 | 902 | ||
933 | val = 0; | 903 | val = 0; |
934 | sp = str; | 904 | sp = str; |
@@ -962,15 +932,11 @@ static unsigned long stli_atol(char *str) | |||
962 | 932 | ||
963 | static int stli_parsebrd(stlconf_t *confp, char **argp) | 933 | static int stli_parsebrd(stlconf_t *confp, char **argp) |
964 | { | 934 | { |
965 | char *sp; | 935 | char *sp; |
966 | int i; | 936 | int i; |
967 | |||
968 | #ifdef DEBUG | ||
969 | printk("stli_parsebrd(confp=%x,argp=%x)\n", (int) confp, (int) argp); | ||
970 | #endif | ||
971 | 937 | ||
972 | if ((argp[0] == (char *) NULL) || (*argp[0] == 0)) | 938 | if (argp[0] == NULL || *argp[0] == 0) |
973 | return(0); | 939 | return 0; |
974 | 940 | ||
975 | for (sp = argp[0], i = 0; ((*sp != 0) && (i < 25)); sp++, i++) | 941 | for (sp = argp[0], i = 0; ((*sp != 0) && (i < 25)); sp++, i++) |
976 | *sp = TOLOWER(*sp); | 942 | *sp = TOLOWER(*sp); |
@@ -985,9 +951,9 @@ static int stli_parsebrd(stlconf_t *confp, char **argp) | |||
985 | } | 951 | } |
986 | 952 | ||
987 | confp->brdtype = stli_brdstr[i].type; | 953 | confp->brdtype = stli_brdstr[i].type; |
988 | if ((argp[1] != (char *) NULL) && (*argp[1] != 0)) | 954 | if (argp[1] != NULL && *argp[1] != 0) |
989 | confp->ioaddr1 = stli_atol(argp[1]); | 955 | confp->ioaddr1 = stli_atol(argp[1]); |
990 | if ((argp[2] != (char *) NULL) && (*argp[2] != 0)) | 956 | if (argp[2] != NULL && *argp[2] != 0) |
991 | confp->memaddr = stli_atol(argp[2]); | 957 | confp->memaddr = stli_atol(argp[2]); |
992 | return(1); | 958 | return(1); |
993 | } | 959 | } |
@@ -998,34 +964,29 @@ static int stli_parsebrd(stlconf_t *confp, char **argp) | |||
998 | 964 | ||
999 | static int stli_open(struct tty_struct *tty, struct file *filp) | 965 | static int stli_open(struct tty_struct *tty, struct file *filp) |
1000 | { | 966 | { |
1001 | stlibrd_t *brdp; | 967 | stlibrd_t *brdp; |
1002 | stliport_t *portp; | 968 | stliport_t *portp; |
1003 | unsigned int minordev; | 969 | unsigned int minordev; |
1004 | int brdnr, portnr, rc; | 970 | int brdnr, portnr, rc; |
1005 | |||
1006 | #ifdef DEBUG | ||
1007 | printk("stli_open(tty=%x,filp=%x): device=%s\n", (int) tty, | ||
1008 | (int) filp, tty->name); | ||
1009 | #endif | ||
1010 | 971 | ||
1011 | minordev = tty->index; | 972 | minordev = tty->index; |
1012 | brdnr = MINOR2BRD(minordev); | 973 | brdnr = MINOR2BRD(minordev); |
1013 | if (brdnr >= stli_nrbrds) | 974 | if (brdnr >= stli_nrbrds) |
1014 | return(-ENODEV); | 975 | return -ENODEV; |
1015 | brdp = stli_brds[brdnr]; | 976 | brdp = stli_brds[brdnr]; |
1016 | if (brdp == (stlibrd_t *) NULL) | 977 | if (brdp == NULL) |
1017 | return(-ENODEV); | 978 | return -ENODEV; |
1018 | if ((brdp->state & BST_STARTED) == 0) | 979 | if ((brdp->state & BST_STARTED) == 0) |
1019 | return(-ENODEV); | 980 | return -ENODEV; |
1020 | portnr = MINOR2PORT(minordev); | 981 | portnr = MINOR2PORT(minordev); |
1021 | if ((portnr < 0) || (portnr > brdp->nrports)) | 982 | if ((portnr < 0) || (portnr > brdp->nrports)) |
1022 | return(-ENODEV); | 983 | return -ENODEV; |
1023 | 984 | ||
1024 | portp = brdp->ports[portnr]; | 985 | portp = brdp->ports[portnr]; |
1025 | if (portp == (stliport_t *) NULL) | 986 | if (portp == NULL) |
1026 | return(-ENODEV); | 987 | return -ENODEV; |
1027 | if (portp->devnr < 1) | 988 | if (portp->devnr < 1) |
1028 | return(-ENODEV); | 989 | return -ENODEV; |
1029 | 990 | ||
1030 | 991 | ||
1031 | /* | 992 | /* |
@@ -1037,8 +998,8 @@ static int stli_open(struct tty_struct *tty, struct file *filp) | |||
1037 | if (portp->flags & ASYNC_CLOSING) { | 998 | if (portp->flags & ASYNC_CLOSING) { |
1038 | interruptible_sleep_on(&portp->close_wait); | 999 | interruptible_sleep_on(&portp->close_wait); |
1039 | if (portp->flags & ASYNC_HUP_NOTIFY) | 1000 | if (portp->flags & ASYNC_HUP_NOTIFY) |
1040 | return(-EAGAIN); | 1001 | return -EAGAIN; |
1041 | return(-ERESTARTSYS); | 1002 | return -ERESTARTSYS; |
1042 | } | 1003 | } |
1043 | 1004 | ||
1044 | /* | 1005 | /* |
@@ -1054,7 +1015,7 @@ static int stli_open(struct tty_struct *tty, struct file *filp) | |||
1054 | wait_event_interruptible(portp->raw_wait, | 1015 | wait_event_interruptible(portp->raw_wait, |
1055 | !test_bit(ST_INITIALIZING, &portp->state)); | 1016 | !test_bit(ST_INITIALIZING, &portp->state)); |
1056 | if (signal_pending(current)) | 1017 | if (signal_pending(current)) |
1057 | return(-ERESTARTSYS); | 1018 | return -ERESTARTSYS; |
1058 | 1019 | ||
1059 | if ((portp->flags & ASYNC_INITIALIZED) == 0) { | 1020 | if ((portp->flags & ASYNC_INITIALIZED) == 0) { |
1060 | set_bit(ST_INITIALIZING, &portp->state); | 1021 | set_bit(ST_INITIALIZING, &portp->state); |
@@ -1065,7 +1026,7 @@ static int stli_open(struct tty_struct *tty, struct file *filp) | |||
1065 | clear_bit(ST_INITIALIZING, &portp->state); | 1026 | clear_bit(ST_INITIALIZING, &portp->state); |
1066 | wake_up_interruptible(&portp->raw_wait); | 1027 | wake_up_interruptible(&portp->raw_wait); |
1067 | if (rc < 0) | 1028 | if (rc < 0) |
1068 | return(rc); | 1029 | return rc; |
1069 | } | 1030 | } |
1070 | 1031 | ||
1071 | /* | 1032 | /* |
@@ -1077,8 +1038,8 @@ static int stli_open(struct tty_struct *tty, struct file *filp) | |||
1077 | if (portp->flags & ASYNC_CLOSING) { | 1038 | if (portp->flags & ASYNC_CLOSING) { |
1078 | interruptible_sleep_on(&portp->close_wait); | 1039 | interruptible_sleep_on(&portp->close_wait); |
1079 | if (portp->flags & ASYNC_HUP_NOTIFY) | 1040 | if (portp->flags & ASYNC_HUP_NOTIFY) |
1080 | return(-EAGAIN); | 1041 | return -EAGAIN; |
1081 | return(-ERESTARTSYS); | 1042 | return -ERESTARTSYS; |
1082 | } | 1043 | } |
1083 | 1044 | ||
1084 | /* | 1045 | /* |
@@ -1088,38 +1049,33 @@ static int stli_open(struct tty_struct *tty, struct file *filp) | |||
1088 | */ | 1049 | */ |
1089 | if (!(filp->f_flags & O_NONBLOCK)) { | 1050 | if (!(filp->f_flags & O_NONBLOCK)) { |
1090 | if ((rc = stli_waitcarrier(brdp, portp, filp)) != 0) | 1051 | if ((rc = stli_waitcarrier(brdp, portp, filp)) != 0) |
1091 | return(rc); | 1052 | return rc; |
1092 | } | 1053 | } |
1093 | portp->flags |= ASYNC_NORMAL_ACTIVE; | 1054 | portp->flags |= ASYNC_NORMAL_ACTIVE; |
1094 | return(0); | 1055 | return 0; |
1095 | } | 1056 | } |
1096 | 1057 | ||
1097 | /*****************************************************************************/ | 1058 | /*****************************************************************************/ |
1098 | 1059 | ||
1099 | static void stli_close(struct tty_struct *tty, struct file *filp) | 1060 | static void stli_close(struct tty_struct *tty, struct file *filp) |
1100 | { | 1061 | { |
1101 | stlibrd_t *brdp; | 1062 | stlibrd_t *brdp; |
1102 | stliport_t *portp; | 1063 | stliport_t *portp; |
1103 | unsigned long flags; | 1064 | unsigned long flags; |
1104 | |||
1105 | #ifdef DEBUG | ||
1106 | printk("stli_close(tty=%x,filp=%x)\n", (int) tty, (int) filp); | ||
1107 | #endif | ||
1108 | 1065 | ||
1109 | portp = tty->driver_data; | 1066 | portp = tty->driver_data; |
1110 | if (portp == (stliport_t *) NULL) | 1067 | if (portp == NULL) |
1111 | return; | 1068 | return; |
1112 | 1069 | ||
1113 | save_flags(flags); | 1070 | spin_lock_irqsave(&stli_lock, flags); |
1114 | cli(); | ||
1115 | if (tty_hung_up_p(filp)) { | 1071 | if (tty_hung_up_p(filp)) { |
1116 | restore_flags(flags); | 1072 | spin_unlock_irqrestore(&stli_lock, flags); |
1117 | return; | 1073 | return; |
1118 | } | 1074 | } |
1119 | if ((tty->count == 1) && (portp->refcount != 1)) | 1075 | if ((tty->count == 1) && (portp->refcount != 1)) |
1120 | portp->refcount = 1; | 1076 | portp->refcount = 1; |
1121 | if (portp->refcount-- > 1) { | 1077 | if (portp->refcount-- > 1) { |
1122 | restore_flags(flags); | 1078 | spin_unlock_irqrestore(&stli_lock, flags); |
1123 | return; | 1079 | return; |
1124 | } | 1080 | } |
1125 | 1081 | ||
@@ -1134,6 +1090,8 @@ static void stli_close(struct tty_struct *tty, struct file *filp) | |||
1134 | if (tty == stli_txcooktty) | 1090 | if (tty == stli_txcooktty) |
1135 | stli_flushchars(tty); | 1091 | stli_flushchars(tty); |
1136 | tty->closing = 1; | 1092 | tty->closing = 1; |
1093 | spin_unlock_irqrestore(&stli_lock, flags); | ||
1094 | |||
1137 | if (portp->closing_wait != ASYNC_CLOSING_WAIT_NONE) | 1095 | if (portp->closing_wait != ASYNC_CLOSING_WAIT_NONE) |
1138 | tty_wait_until_sent(tty, portp->closing_wait); | 1096 | tty_wait_until_sent(tty, portp->closing_wait); |
1139 | 1097 | ||
@@ -1157,7 +1115,7 @@ static void stli_close(struct tty_struct *tty, struct file *filp) | |||
1157 | stli_flushbuffer(tty); | 1115 | stli_flushbuffer(tty); |
1158 | 1116 | ||
1159 | tty->closing = 0; | 1117 | tty->closing = 0; |
1160 | portp->tty = (struct tty_struct *) NULL; | 1118 | portp->tty = NULL; |
1161 | 1119 | ||
1162 | if (portp->openwaitcnt) { | 1120 | if (portp->openwaitcnt) { |
1163 | if (portp->close_delay) | 1121 | if (portp->close_delay) |
@@ -1167,7 +1125,6 @@ static void stli_close(struct tty_struct *tty, struct file *filp) | |||
1167 | 1125 | ||
1168 | portp->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING); | 1126 | portp->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING); |
1169 | wake_up_interruptible(&portp->close_wait); | 1127 | wake_up_interruptible(&portp->close_wait); |
1170 | restore_flags(flags); | ||
1171 | } | 1128 | } |
1172 | 1129 | ||
1173 | /*****************************************************************************/ | 1130 | /*****************************************************************************/ |
@@ -1182,45 +1139,41 @@ static void stli_close(struct tty_struct *tty, struct file *filp) | |||
1182 | 1139 | ||
1183 | static int stli_initopen(stlibrd_t *brdp, stliport_t *portp) | 1140 | static int stli_initopen(stlibrd_t *brdp, stliport_t *portp) |
1184 | { | 1141 | { |
1185 | struct tty_struct *tty; | 1142 | struct tty_struct *tty; |
1186 | asynotify_t nt; | 1143 | asynotify_t nt; |
1187 | asyport_t aport; | 1144 | asyport_t aport; |
1188 | int rc; | 1145 | int rc; |
1189 | |||
1190 | #ifdef DEBUG | ||
1191 | printk("stli_initopen(brdp=%x,portp=%x)\n", (int) brdp, (int) portp); | ||
1192 | #endif | ||
1193 | 1146 | ||
1194 | if ((rc = stli_rawopen(brdp, portp, 0, 1)) < 0) | 1147 | if ((rc = stli_rawopen(brdp, portp, 0, 1)) < 0) |
1195 | return(rc); | 1148 | return rc; |
1196 | 1149 | ||
1197 | memset(&nt, 0, sizeof(asynotify_t)); | 1150 | memset(&nt, 0, sizeof(asynotify_t)); |
1198 | nt.data = (DT_TXLOW | DT_TXEMPTY | DT_RXBUSY | DT_RXBREAK); | 1151 | nt.data = (DT_TXLOW | DT_TXEMPTY | DT_RXBUSY | DT_RXBREAK); |
1199 | nt.signal = SG_DCD; | 1152 | nt.signal = SG_DCD; |
1200 | if ((rc = stli_cmdwait(brdp, portp, A_SETNOTIFY, &nt, | 1153 | if ((rc = stli_cmdwait(brdp, portp, A_SETNOTIFY, &nt, |
1201 | sizeof(asynotify_t), 0)) < 0) | 1154 | sizeof(asynotify_t), 0)) < 0) |
1202 | return(rc); | 1155 | return rc; |
1203 | 1156 | ||
1204 | tty = portp->tty; | 1157 | tty = portp->tty; |
1205 | if (tty == (struct tty_struct *) NULL) | 1158 | if (tty == NULL) |
1206 | return(-ENODEV); | 1159 | return -ENODEV; |
1207 | stli_mkasyport(portp, &aport, tty->termios); | 1160 | stli_mkasyport(portp, &aport, tty->termios); |
1208 | if ((rc = stli_cmdwait(brdp, portp, A_SETPORT, &aport, | 1161 | if ((rc = stli_cmdwait(brdp, portp, A_SETPORT, &aport, |
1209 | sizeof(asyport_t), 0)) < 0) | 1162 | sizeof(asyport_t), 0)) < 0) |
1210 | return(rc); | 1163 | return rc; |
1211 | 1164 | ||
1212 | set_bit(ST_GETSIGS, &portp->state); | 1165 | set_bit(ST_GETSIGS, &portp->state); |
1213 | if ((rc = stli_cmdwait(brdp, portp, A_GETSIGNALS, &portp->asig, | 1166 | if ((rc = stli_cmdwait(brdp, portp, A_GETSIGNALS, &portp->asig, |
1214 | sizeof(asysigs_t), 1)) < 0) | 1167 | sizeof(asysigs_t), 1)) < 0) |
1215 | return(rc); | 1168 | return rc; |
1216 | if (test_and_clear_bit(ST_GETSIGS, &portp->state)) | 1169 | if (test_and_clear_bit(ST_GETSIGS, &portp->state)) |
1217 | portp->sigs = stli_mktiocm(portp->asig.sigvalue); | 1170 | portp->sigs = stli_mktiocm(portp->asig.sigvalue); |
1218 | stli_mkasysigs(&portp->asig, 1, 1); | 1171 | stli_mkasysigs(&portp->asig, 1, 1); |
1219 | if ((rc = stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig, | 1172 | if ((rc = stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig, |
1220 | sizeof(asysigs_t), 0)) < 0) | 1173 | sizeof(asysigs_t), 0)) < 0) |
1221 | return(rc); | 1174 | return rc; |
1222 | 1175 | ||
1223 | return(0); | 1176 | return 0; |
1224 | } | 1177 | } |
1225 | 1178 | ||
1226 | /*****************************************************************************/ | 1179 | /*****************************************************************************/ |
@@ -1234,22 +1187,15 @@ static int stli_initopen(stlibrd_t *brdp, stliport_t *portp) | |||
1234 | 1187 | ||
1235 | static int stli_rawopen(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, int wait) | 1188 | static int stli_rawopen(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, int wait) |
1236 | { | 1189 | { |
1237 | volatile cdkhdr_t *hdrp; | 1190 | cdkhdr_t __iomem *hdrp; |
1238 | volatile cdkctrl_t *cp; | 1191 | cdkctrl_t __iomem *cp; |
1239 | volatile unsigned char *bits; | 1192 | unsigned char __iomem *bits; |
1240 | unsigned long flags; | 1193 | unsigned long flags; |
1241 | int rc; | 1194 | int rc; |
1242 | |||
1243 | #ifdef DEBUG | ||
1244 | printk("stli_rawopen(brdp=%x,portp=%x,arg=%x,wait=%d)\n", | ||
1245 | (int) brdp, (int) portp, (int) arg, wait); | ||
1246 | #endif | ||
1247 | 1195 | ||
1248 | /* | 1196 | /* |
1249 | * Send a message to the slave to open this port. | 1197 | * Send a message to the slave to open this port. |
1250 | */ | 1198 | */ |
1251 | save_flags(flags); | ||
1252 | cli(); | ||
1253 | 1199 | ||
1254 | /* | 1200 | /* |
1255 | * Slave is already closing this port. This can happen if a hangup | 1201 | * Slave is already closing this port. This can happen if a hangup |
@@ -1260,7 +1206,6 @@ static int stli_rawopen(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, i | |||
1260 | wait_event_interruptible(portp->raw_wait, | 1206 | wait_event_interruptible(portp->raw_wait, |
1261 | !test_bit(ST_CLOSING, &portp->state)); | 1207 | !test_bit(ST_CLOSING, &portp->state)); |
1262 | if (signal_pending(current)) { | 1208 | if (signal_pending(current)) { |
1263 | restore_flags(flags); | ||
1264 | return -ERESTARTSYS; | 1209 | return -ERESTARTSYS; |
1265 | } | 1210 | } |
1266 | 1211 | ||
@@ -1269,19 +1214,20 @@ static int stli_rawopen(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, i | |||
1269 | * memory. Once the message is in set the service bits to say that | 1214 | * memory. Once the message is in set the service bits to say that |
1270 | * this port wants service. | 1215 | * this port wants service. |
1271 | */ | 1216 | */ |
1217 | spin_lock_irqsave(&brd_lock, flags); | ||
1272 | EBRDENABLE(brdp); | 1218 | EBRDENABLE(brdp); |
1273 | cp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl; | 1219 | cp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl; |
1274 | cp->openarg = arg; | 1220 | writel(arg, &cp->openarg); |
1275 | cp->open = 1; | 1221 | writeb(1, &cp->open); |
1276 | hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); | 1222 | hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); |
1277 | bits = ((volatile unsigned char *) hdrp) + brdp->slaveoffset + | 1223 | bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset + |
1278 | portp->portidx; | 1224 | portp->portidx; |
1279 | *bits |= portp->portbit; | 1225 | writeb(readb(bits) | portp->portbit, bits); |
1280 | EBRDDISABLE(brdp); | 1226 | EBRDDISABLE(brdp); |
1281 | 1227 | ||
1282 | if (wait == 0) { | 1228 | if (wait == 0) { |
1283 | restore_flags(flags); | 1229 | spin_unlock_irqrestore(&brd_lock, flags); |
1284 | return(0); | 1230 | return 0; |
1285 | } | 1231 | } |
1286 | 1232 | ||
1287 | /* | 1233 | /* |
@@ -1290,15 +1236,16 @@ static int stli_rawopen(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, i | |||
1290 | */ | 1236 | */ |
1291 | rc = 0; | 1237 | rc = 0; |
1292 | set_bit(ST_OPENING, &portp->state); | 1238 | set_bit(ST_OPENING, &portp->state); |
1239 | spin_unlock_irqrestore(&brd_lock, flags); | ||
1240 | |||
1293 | wait_event_interruptible(portp->raw_wait, | 1241 | wait_event_interruptible(portp->raw_wait, |
1294 | !test_bit(ST_OPENING, &portp->state)); | 1242 | !test_bit(ST_OPENING, &portp->state)); |
1295 | if (signal_pending(current)) | 1243 | if (signal_pending(current)) |
1296 | rc = -ERESTARTSYS; | 1244 | rc = -ERESTARTSYS; |
1297 | restore_flags(flags); | ||
1298 | 1245 | ||
1299 | if ((rc == 0) && (portp->rc != 0)) | 1246 | if ((rc == 0) && (portp->rc != 0)) |
1300 | rc = -EIO; | 1247 | rc = -EIO; |
1301 | return(rc); | 1248 | return rc; |
1302 | } | 1249 | } |
1303 | 1250 | ||
1304 | /*****************************************************************************/ | 1251 | /*****************************************************************************/ |
@@ -1311,19 +1258,11 @@ static int stli_rawopen(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, i | |||
1311 | 1258 | ||
1312 | static int stli_rawclose(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, int wait) | 1259 | static int stli_rawclose(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, int wait) |
1313 | { | 1260 | { |
1314 | volatile cdkhdr_t *hdrp; | 1261 | cdkhdr_t __iomem *hdrp; |
1315 | volatile cdkctrl_t *cp; | 1262 | cdkctrl_t __iomem *cp; |
1316 | volatile unsigned char *bits; | 1263 | unsigned char __iomem *bits; |
1317 | unsigned long flags; | 1264 | unsigned long flags; |
1318 | int rc; | 1265 | int rc; |
1319 | |||
1320 | #ifdef DEBUG | ||
1321 | printk("stli_rawclose(brdp=%x,portp=%x,arg=%x,wait=%d)\n", | ||
1322 | (int) brdp, (int) portp, (int) arg, wait); | ||
1323 | #endif | ||
1324 | |||
1325 | save_flags(flags); | ||
1326 | cli(); | ||
1327 | 1266 | ||
1328 | /* | 1267 | /* |
1329 | * Slave is already closing this port. This can happen if a hangup | 1268 | * Slave is already closing this port. This can happen if a hangup |
@@ -1333,7 +1272,6 @@ static int stli_rawclose(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, | |||
1333 | wait_event_interruptible(portp->raw_wait, | 1272 | wait_event_interruptible(portp->raw_wait, |
1334 | !test_bit(ST_CLOSING, &portp->state)); | 1273 | !test_bit(ST_CLOSING, &portp->state)); |
1335 | if (signal_pending(current)) { | 1274 | if (signal_pending(current)) { |
1336 | restore_flags(flags); | ||
1337 | return -ERESTARTSYS; | 1275 | return -ERESTARTSYS; |
1338 | } | 1276 | } |
1339 | } | 1277 | } |
@@ -1341,21 +1279,22 @@ static int stli_rawclose(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, | |||
1341 | /* | 1279 | /* |
1342 | * Write the close command into shared memory. | 1280 | * Write the close command into shared memory. |
1343 | */ | 1281 | */ |
1282 | spin_lock_irqsave(&brd_lock, flags); | ||
1344 | EBRDENABLE(brdp); | 1283 | EBRDENABLE(brdp); |
1345 | cp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl; | 1284 | cp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl; |
1346 | cp->closearg = arg; | 1285 | writel(arg, &cp->closearg); |
1347 | cp->close = 1; | 1286 | writeb(1, &cp->close); |
1348 | hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); | 1287 | hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); |
1349 | bits = ((volatile unsigned char *) hdrp) + brdp->slaveoffset + | 1288 | bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset + |
1350 | portp->portidx; | 1289 | portp->portidx; |
1351 | *bits |= portp->portbit; | 1290 | writeb(readb(bits) |portp->portbit, bits); |
1352 | EBRDDISABLE(brdp); | 1291 | EBRDDISABLE(brdp); |
1353 | 1292 | ||
1354 | set_bit(ST_CLOSING, &portp->state); | 1293 | set_bit(ST_CLOSING, &portp->state); |
1355 | if (wait == 0) { | 1294 | spin_unlock_irqrestore(&brd_lock, flags); |
1356 | restore_flags(flags); | 1295 | |
1357 | return(0); | 1296 | if (wait == 0) |
1358 | } | 1297 | return 0; |
1359 | 1298 | ||
1360 | /* | 1299 | /* |
1361 | * Slave is in action, so now we must wait for the open acknowledgment | 1300 | * Slave is in action, so now we must wait for the open acknowledgment |
@@ -1366,11 +1305,10 @@ static int stli_rawclose(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, | |||
1366 | !test_bit(ST_CLOSING, &portp->state)); | 1305 | !test_bit(ST_CLOSING, &portp->state)); |
1367 | if (signal_pending(current)) | 1306 | if (signal_pending(current)) |
1368 | rc = -ERESTARTSYS; | 1307 | rc = -ERESTARTSYS; |
1369 | restore_flags(flags); | ||
1370 | 1308 | ||
1371 | if ((rc == 0) && (portp->rc != 0)) | 1309 | if ((rc == 0) && (portp->rc != 0)) |
1372 | rc = -EIO; | 1310 | rc = -EIO; |
1373 | return(rc); | 1311 | return rc; |
1374 | } | 1312 | } |
1375 | 1313 | ||
1376 | /*****************************************************************************/ | 1314 | /*****************************************************************************/ |
@@ -1384,36 +1322,21 @@ static int stli_rawclose(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, | |||
1384 | 1322 | ||
1385 | static int stli_cmdwait(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback) | 1323 | static int stli_cmdwait(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback) |
1386 | { | 1324 | { |
1387 | unsigned long flags; | ||
1388 | |||
1389 | #ifdef DEBUG | ||
1390 | printk("stli_cmdwait(brdp=%x,portp=%x,cmd=%x,arg=%x,size=%d," | ||
1391 | "copyback=%d)\n", (int) brdp, (int) portp, (int) cmd, | ||
1392 | (int) arg, size, copyback); | ||
1393 | #endif | ||
1394 | |||
1395 | save_flags(flags); | ||
1396 | cli(); | ||
1397 | wait_event_interruptible(portp->raw_wait, | 1325 | wait_event_interruptible(portp->raw_wait, |
1398 | !test_bit(ST_CMDING, &portp->state)); | 1326 | !test_bit(ST_CMDING, &portp->state)); |
1399 | if (signal_pending(current)) { | 1327 | if (signal_pending(current)) |
1400 | restore_flags(flags); | ||
1401 | return -ERESTARTSYS; | 1328 | return -ERESTARTSYS; |
1402 | } | ||
1403 | 1329 | ||
1404 | stli_sendcmd(brdp, portp, cmd, arg, size, copyback); | 1330 | stli_sendcmd(brdp, portp, cmd, arg, size, copyback); |
1405 | 1331 | ||
1406 | wait_event_interruptible(portp->raw_wait, | 1332 | wait_event_interruptible(portp->raw_wait, |
1407 | !test_bit(ST_CMDING, &portp->state)); | 1333 | !test_bit(ST_CMDING, &portp->state)); |
1408 | if (signal_pending(current)) { | 1334 | if (signal_pending(current)) |
1409 | restore_flags(flags); | ||
1410 | return -ERESTARTSYS; | 1335 | return -ERESTARTSYS; |
1411 | } | ||
1412 | restore_flags(flags); | ||
1413 | 1336 | ||
1414 | if (portp->rc != 0) | 1337 | if (portp->rc != 0) |
1415 | return(-EIO); | 1338 | return -EIO; |
1416 | return(0); | 1339 | return 0; |
1417 | } | 1340 | } |
1418 | 1341 | ||
1419 | /*****************************************************************************/ | 1342 | /*****************************************************************************/ |
@@ -1425,22 +1348,18 @@ static int stli_cmdwait(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, v | |||
1425 | 1348 | ||
1426 | static int stli_setport(stliport_t *portp) | 1349 | static int stli_setport(stliport_t *portp) |
1427 | { | 1350 | { |
1428 | stlibrd_t *brdp; | 1351 | stlibrd_t *brdp; |
1429 | asyport_t aport; | 1352 | asyport_t aport; |
1430 | |||
1431 | #ifdef DEBUG | ||
1432 | printk("stli_setport(portp=%x)\n", (int) portp); | ||
1433 | #endif | ||
1434 | 1353 | ||
1435 | if (portp == (stliport_t *) NULL) | 1354 | if (portp == NULL) |
1436 | return(-ENODEV); | 1355 | return -ENODEV; |
1437 | if (portp->tty == (struct tty_struct *) NULL) | 1356 | if (portp->tty == NULL) |
1438 | return(-ENODEV); | 1357 | return -ENODEV; |
1439 | if ((portp->brdnr < 0) && (portp->brdnr >= stli_nrbrds)) | 1358 | if (portp->brdnr < 0 && portp->brdnr >= stli_nrbrds) |
1440 | return(-ENODEV); | 1359 | return -ENODEV; |
1441 | brdp = stli_brds[portp->brdnr]; | 1360 | brdp = stli_brds[portp->brdnr]; |
1442 | if (brdp == (stlibrd_t *) NULL) | 1361 | if (brdp == NULL) |
1443 | return(-ENODEV); | 1362 | return -ENODEV; |
1444 | 1363 | ||
1445 | stli_mkasyport(portp, &aport, portp->tty->termios); | 1364 | stli_mkasyport(portp, &aport, portp->tty->termios); |
1446 | return(stli_cmdwait(brdp, portp, A_SETPORT, &aport, sizeof(asyport_t), 0)); | 1365 | return(stli_cmdwait(brdp, portp, A_SETPORT, &aport, sizeof(asyport_t), 0)); |
@@ -1455,13 +1374,8 @@ static int stli_setport(stliport_t *portp) | |||
1455 | 1374 | ||
1456 | static int stli_waitcarrier(stlibrd_t *brdp, stliport_t *portp, struct file *filp) | 1375 | static int stli_waitcarrier(stlibrd_t *brdp, stliport_t *portp, struct file *filp) |
1457 | { | 1376 | { |
1458 | unsigned long flags; | 1377 | unsigned long flags; |
1459 | int rc, doclocal; | 1378 | int rc, doclocal; |
1460 | |||
1461 | #ifdef DEBUG | ||
1462 | printk("stli_waitcarrier(brdp=%x,portp=%x,filp=%x)\n", | ||
1463 | (int) brdp, (int) portp, (int) filp); | ||
1464 | #endif | ||
1465 | 1379 | ||
1466 | rc = 0; | 1380 | rc = 0; |
1467 | doclocal = 0; | 1381 | doclocal = 0; |
@@ -1469,11 +1383,11 @@ static int stli_waitcarrier(stlibrd_t *brdp, stliport_t *portp, struct file *fil | |||
1469 | if (portp->tty->termios->c_cflag & CLOCAL) | 1383 | if (portp->tty->termios->c_cflag & CLOCAL) |
1470 | doclocal++; | 1384 | doclocal++; |
1471 | 1385 | ||
1472 | save_flags(flags); | 1386 | spin_lock_irqsave(&stli_lock, flags); |
1473 | cli(); | ||
1474 | portp->openwaitcnt++; | 1387 | portp->openwaitcnt++; |
1475 | if (! tty_hung_up_p(filp)) | 1388 | if (! tty_hung_up_p(filp)) |
1476 | portp->refcount--; | 1389 | portp->refcount--; |
1390 | spin_unlock_irqrestore(&stli_lock, flags); | ||
1477 | 1391 | ||
1478 | for (;;) { | 1392 | for (;;) { |
1479 | stli_mkasysigs(&portp->asig, 1, 1); | 1393 | stli_mkasysigs(&portp->asig, 1, 1); |
@@ -1499,12 +1413,13 @@ static int stli_waitcarrier(stlibrd_t *brdp, stliport_t *portp, struct file *fil | |||
1499 | interruptible_sleep_on(&portp->open_wait); | 1413 | interruptible_sleep_on(&portp->open_wait); |
1500 | } | 1414 | } |
1501 | 1415 | ||
1416 | spin_lock_irqsave(&stli_lock, flags); | ||
1502 | if (! tty_hung_up_p(filp)) | 1417 | if (! tty_hung_up_p(filp)) |
1503 | portp->refcount++; | 1418 | portp->refcount++; |
1504 | portp->openwaitcnt--; | 1419 | portp->openwaitcnt--; |
1505 | restore_flags(flags); | 1420 | spin_unlock_irqrestore(&stli_lock, flags); |
1506 | 1421 | ||
1507 | return(rc); | 1422 | return rc; |
1508 | } | 1423 | } |
1509 | 1424 | ||
1510 | /*****************************************************************************/ | 1425 | /*****************************************************************************/ |
@@ -1517,46 +1432,38 @@ static int stli_waitcarrier(stlibrd_t *brdp, stliport_t *portp, struct file *fil | |||
1517 | 1432 | ||
1518 | static int stli_write(struct tty_struct *tty, const unsigned char *buf, int count) | 1433 | static int stli_write(struct tty_struct *tty, const unsigned char *buf, int count) |
1519 | { | 1434 | { |
1520 | volatile cdkasy_t *ap; | 1435 | cdkasy_t __iomem *ap; |
1521 | volatile cdkhdr_t *hdrp; | 1436 | cdkhdr_t __iomem *hdrp; |
1522 | volatile unsigned char *bits; | 1437 | unsigned char __iomem *bits; |
1523 | unsigned char *shbuf, *chbuf; | 1438 | unsigned char __iomem *shbuf; |
1524 | stliport_t *portp; | 1439 | unsigned char *chbuf; |
1525 | stlibrd_t *brdp; | 1440 | stliport_t *portp; |
1526 | unsigned int len, stlen, head, tail, size; | 1441 | stlibrd_t *brdp; |
1527 | unsigned long flags; | 1442 | unsigned int len, stlen, head, tail, size; |
1528 | 1443 | unsigned long flags; | |
1529 | #ifdef DEBUG | ||
1530 | printk("stli_write(tty=%x,buf=%x,count=%d)\n", | ||
1531 | (int) tty, (int) buf, count); | ||
1532 | #endif | ||
1533 | 1444 | ||
1534 | if ((tty == (struct tty_struct *) NULL) || | ||
1535 | (stli_tmpwritebuf == (char *) NULL)) | ||
1536 | return(0); | ||
1537 | if (tty == stli_txcooktty) | 1445 | if (tty == stli_txcooktty) |
1538 | stli_flushchars(tty); | 1446 | stli_flushchars(tty); |
1539 | portp = tty->driver_data; | 1447 | portp = tty->driver_data; |
1540 | if (portp == (stliport_t *) NULL) | 1448 | if (portp == NULL) |
1541 | return(0); | 1449 | return 0; |
1542 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) | 1450 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) |
1543 | return(0); | 1451 | return 0; |
1544 | brdp = stli_brds[portp->brdnr]; | 1452 | brdp = stli_brds[portp->brdnr]; |
1545 | if (brdp == (stlibrd_t *) NULL) | 1453 | if (brdp == NULL) |
1546 | return(0); | 1454 | return 0; |
1547 | chbuf = (unsigned char *) buf; | 1455 | chbuf = (unsigned char *) buf; |
1548 | 1456 | ||
1549 | /* | 1457 | /* |
1550 | * All data is now local, shove as much as possible into shared memory. | 1458 | * All data is now local, shove as much as possible into shared memory. |
1551 | */ | 1459 | */ |
1552 | save_flags(flags); | 1460 | spin_lock_irqsave(&brd_lock, flags); |
1553 | cli(); | ||
1554 | EBRDENABLE(brdp); | 1461 | EBRDENABLE(brdp); |
1555 | ap = (volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr); | 1462 | ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr); |
1556 | head = (unsigned int) ap->txq.head; | 1463 | head = (unsigned int) readw(&ap->txq.head); |
1557 | tail = (unsigned int) ap->txq.tail; | 1464 | tail = (unsigned int) readw(&ap->txq.tail); |
1558 | if (tail != ((unsigned int) ap->txq.tail)) | 1465 | if (tail != ((unsigned int) readw(&ap->txq.tail))) |
1559 | tail = (unsigned int) ap->txq.tail; | 1466 | tail = (unsigned int) readw(&ap->txq.tail); |
1560 | size = portp->txsize; | 1467 | size = portp->txsize; |
1561 | if (head >= tail) { | 1468 | if (head >= tail) { |
1562 | len = size - (head - tail) - 1; | 1469 | len = size - (head - tail) - 1; |
@@ -1568,11 +1475,11 @@ static int stli_write(struct tty_struct *tty, const unsigned char *buf, int coun | |||
1568 | 1475 | ||
1569 | len = MIN(len, count); | 1476 | len = MIN(len, count); |
1570 | count = 0; | 1477 | count = 0; |
1571 | shbuf = (char *) EBRDGETMEMPTR(brdp, portp->txoffset); | 1478 | shbuf = (char __iomem *) EBRDGETMEMPTR(brdp, portp->txoffset); |
1572 | 1479 | ||
1573 | while (len > 0) { | 1480 | while (len > 0) { |
1574 | stlen = MIN(len, stlen); | 1481 | stlen = MIN(len, stlen); |
1575 | memcpy((shbuf + head), chbuf, stlen); | 1482 | memcpy_toio(shbuf + head, chbuf, stlen); |
1576 | chbuf += stlen; | 1483 | chbuf += stlen; |
1577 | len -= stlen; | 1484 | len -= stlen; |
1578 | count += stlen; | 1485 | count += stlen; |
@@ -1583,20 +1490,19 @@ static int stli_write(struct tty_struct *tty, const unsigned char *buf, int coun | |||
1583 | } | 1490 | } |
1584 | } | 1491 | } |
1585 | 1492 | ||
1586 | ap = (volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr); | 1493 | ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr); |
1587 | ap->txq.head = head; | 1494 | writew(head, &ap->txq.head); |
1588 | if (test_bit(ST_TXBUSY, &portp->state)) { | 1495 | if (test_bit(ST_TXBUSY, &portp->state)) { |
1589 | if (ap->changed.data & DT_TXEMPTY) | 1496 | if (readl(&ap->changed.data) & DT_TXEMPTY) |
1590 | ap->changed.data &= ~DT_TXEMPTY; | 1497 | writel(readl(&ap->changed.data) & ~DT_TXEMPTY, &ap->changed.data); |
1591 | } | 1498 | } |
1592 | hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); | 1499 | hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); |
1593 | bits = ((volatile unsigned char *) hdrp) + brdp->slaveoffset + | 1500 | bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset + |
1594 | portp->portidx; | 1501 | portp->portidx; |
1595 | *bits |= portp->portbit; | 1502 | writeb(readb(bits) | portp->portbit, bits); |
1596 | set_bit(ST_TXBUSY, &portp->state); | 1503 | set_bit(ST_TXBUSY, &portp->state); |
1597 | EBRDDISABLE(brdp); | 1504 | EBRDDISABLE(brdp); |
1598 | 1505 | spin_unlock_irqrestore(&brd_lock, flags); | |
1599 | restore_flags(flags); | ||
1600 | 1506 | ||
1601 | return(count); | 1507 | return(count); |
1602 | } | 1508 | } |
@@ -1613,14 +1519,8 @@ static int stli_write(struct tty_struct *tty, const unsigned char *buf, int coun | |||
1613 | 1519 | ||
1614 | static void stli_putchar(struct tty_struct *tty, unsigned char ch) | 1520 | static void stli_putchar(struct tty_struct *tty, unsigned char ch) |
1615 | { | 1521 | { |
1616 | #ifdef DEBUG | ||
1617 | printk("stli_putchar(tty=%x,ch=%x)\n", (int) tty, (int) ch); | ||
1618 | #endif | ||
1619 | |||
1620 | if (tty == (struct tty_struct *) NULL) | ||
1621 | return; | ||
1622 | if (tty != stli_txcooktty) { | 1522 | if (tty != stli_txcooktty) { |
1623 | if (stli_txcooktty != (struct tty_struct *) NULL) | 1523 | if (stli_txcooktty != NULL) |
1624 | stli_flushchars(stli_txcooktty); | 1524 | stli_flushchars(stli_txcooktty); |
1625 | stli_txcooktty = tty; | 1525 | stli_txcooktty = tty; |
1626 | } | 1526 | } |
@@ -1640,29 +1540,26 @@ static void stli_putchar(struct tty_struct *tty, unsigned char ch) | |||
1640 | 1540 | ||
1641 | static void stli_flushchars(struct tty_struct *tty) | 1541 | static void stli_flushchars(struct tty_struct *tty) |
1642 | { | 1542 | { |
1643 | volatile cdkhdr_t *hdrp; | 1543 | cdkhdr_t __iomem *hdrp; |
1644 | volatile unsigned char *bits; | 1544 | unsigned char __iomem *bits; |
1645 | volatile cdkasy_t *ap; | 1545 | cdkasy_t __iomem *ap; |
1646 | struct tty_struct *cooktty; | 1546 | struct tty_struct *cooktty; |
1647 | stliport_t *portp; | 1547 | stliport_t *portp; |
1648 | stlibrd_t *brdp; | 1548 | stlibrd_t *brdp; |
1649 | unsigned int len, stlen, head, tail, size, count, cooksize; | 1549 | unsigned int len, stlen, head, tail, size, count, cooksize; |
1650 | unsigned char *buf, *shbuf; | 1550 | unsigned char *buf; |
1651 | unsigned long flags; | 1551 | unsigned char __iomem *shbuf; |
1652 | 1552 | unsigned long flags; | |
1653 | #ifdef DEBUG | ||
1654 | printk("stli_flushchars(tty=%x)\n", (int) tty); | ||
1655 | #endif | ||
1656 | 1553 | ||
1657 | cooksize = stli_txcooksize; | 1554 | cooksize = stli_txcooksize; |
1658 | cooktty = stli_txcooktty; | 1555 | cooktty = stli_txcooktty; |
1659 | stli_txcooksize = 0; | 1556 | stli_txcooksize = 0; |
1660 | stli_txcookrealsize = 0; | 1557 | stli_txcookrealsize = 0; |
1661 | stli_txcooktty = (struct tty_struct *) NULL; | 1558 | stli_txcooktty = NULL; |
1662 | 1559 | ||
1663 | if (tty == (struct tty_struct *) NULL) | 1560 | if (tty == NULL) |
1664 | return; | 1561 | return; |
1665 | if (cooktty == (struct tty_struct *) NULL) | 1562 | if (cooktty == NULL) |
1666 | return; | 1563 | return; |
1667 | if (tty != cooktty) | 1564 | if (tty != cooktty) |
1668 | tty = cooktty; | 1565 | tty = cooktty; |
@@ -1670,23 +1567,22 @@ static void stli_flushchars(struct tty_struct *tty) | |||
1670 | return; | 1567 | return; |
1671 | 1568 | ||
1672 | portp = tty->driver_data; | 1569 | portp = tty->driver_data; |
1673 | if (portp == (stliport_t *) NULL) | 1570 | if (portp == NULL) |
1674 | return; | 1571 | return; |
1675 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) | 1572 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) |
1676 | return; | 1573 | return; |
1677 | brdp = stli_brds[portp->brdnr]; | 1574 | brdp = stli_brds[portp->brdnr]; |
1678 | if (brdp == (stlibrd_t *) NULL) | 1575 | if (brdp == NULL) |
1679 | return; | 1576 | return; |
1680 | 1577 | ||
1681 | save_flags(flags); | 1578 | spin_lock_irqsave(&brd_lock, flags); |
1682 | cli(); | ||
1683 | EBRDENABLE(brdp); | 1579 | EBRDENABLE(brdp); |
1684 | 1580 | ||
1685 | ap = (volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr); | 1581 | ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr); |
1686 | head = (unsigned int) ap->txq.head; | 1582 | head = (unsigned int) readw(&ap->txq.head); |
1687 | tail = (unsigned int) ap->txq.tail; | 1583 | tail = (unsigned int) readw(&ap->txq.tail); |
1688 | if (tail != ((unsigned int) ap->txq.tail)) | 1584 | if (tail != ((unsigned int) readw(&ap->txq.tail))) |
1689 | tail = (unsigned int) ap->txq.tail; | 1585 | tail = (unsigned int) readw(&ap->txq.tail); |
1690 | size = portp->txsize; | 1586 | size = portp->txsize; |
1691 | if (head >= tail) { | 1587 | if (head >= tail) { |
1692 | len = size - (head - tail) - 1; | 1588 | len = size - (head - tail) - 1; |
@@ -1703,7 +1599,7 @@ static void stli_flushchars(struct tty_struct *tty) | |||
1703 | 1599 | ||
1704 | while (len > 0) { | 1600 | while (len > 0) { |
1705 | stlen = MIN(len, stlen); | 1601 | stlen = MIN(len, stlen); |
1706 | memcpy((shbuf + head), buf, stlen); | 1602 | memcpy_toio(shbuf + head, buf, stlen); |
1707 | buf += stlen; | 1603 | buf += stlen; |
1708 | len -= stlen; | 1604 | len -= stlen; |
1709 | count += stlen; | 1605 | count += stlen; |
@@ -1714,73 +1610,66 @@ static void stli_flushchars(struct tty_struct *tty) | |||
1714 | } | 1610 | } |
1715 | } | 1611 | } |
1716 | 1612 | ||
1717 | ap = (volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr); | 1613 | ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr); |
1718 | ap->txq.head = head; | 1614 | writew(head, &ap->txq.head); |
1719 | 1615 | ||
1720 | if (test_bit(ST_TXBUSY, &portp->state)) { | 1616 | if (test_bit(ST_TXBUSY, &portp->state)) { |
1721 | if (ap->changed.data & DT_TXEMPTY) | 1617 | if (readl(&ap->changed.data) & DT_TXEMPTY) |
1722 | ap->changed.data &= ~DT_TXEMPTY; | 1618 | writel(readl(&ap->changed.data) & ~DT_TXEMPTY, &ap->changed.data); |
1723 | } | 1619 | } |
1724 | hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); | 1620 | hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); |
1725 | bits = ((volatile unsigned char *) hdrp) + brdp->slaveoffset + | 1621 | bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset + |
1726 | portp->portidx; | 1622 | portp->portidx; |
1727 | *bits |= portp->portbit; | 1623 | writeb(readb(bits) | portp->portbit, bits); |
1728 | set_bit(ST_TXBUSY, &portp->state); | 1624 | set_bit(ST_TXBUSY, &portp->state); |
1729 | 1625 | ||
1730 | EBRDDISABLE(brdp); | 1626 | EBRDDISABLE(brdp); |
1731 | restore_flags(flags); | 1627 | spin_unlock_irqrestore(&brd_lock, flags); |
1732 | } | 1628 | } |
1733 | 1629 | ||
1734 | /*****************************************************************************/ | 1630 | /*****************************************************************************/ |
1735 | 1631 | ||
1736 | static int stli_writeroom(struct tty_struct *tty) | 1632 | static int stli_writeroom(struct tty_struct *tty) |
1737 | { | 1633 | { |
1738 | volatile cdkasyrq_t *rp; | 1634 | cdkasyrq_t __iomem *rp; |
1739 | stliport_t *portp; | 1635 | stliport_t *portp; |
1740 | stlibrd_t *brdp; | 1636 | stlibrd_t *brdp; |
1741 | unsigned int head, tail, len; | 1637 | unsigned int head, tail, len; |
1742 | unsigned long flags; | 1638 | unsigned long flags; |
1743 | |||
1744 | #ifdef DEBUG | ||
1745 | printk("stli_writeroom(tty=%x)\n", (int) tty); | ||
1746 | #endif | ||
1747 | 1639 | ||
1748 | if (tty == (struct tty_struct *) NULL) | ||
1749 | return(0); | ||
1750 | if (tty == stli_txcooktty) { | 1640 | if (tty == stli_txcooktty) { |
1751 | if (stli_txcookrealsize != 0) { | 1641 | if (stli_txcookrealsize != 0) { |
1752 | len = stli_txcookrealsize - stli_txcooksize; | 1642 | len = stli_txcookrealsize - stli_txcooksize; |
1753 | return(len); | 1643 | return len; |
1754 | } | 1644 | } |
1755 | } | 1645 | } |
1756 | 1646 | ||
1757 | portp = tty->driver_data; | 1647 | portp = tty->driver_data; |
1758 | if (portp == (stliport_t *) NULL) | 1648 | if (portp == NULL) |
1759 | return(0); | 1649 | return 0; |
1760 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) | 1650 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) |
1761 | return(0); | 1651 | return 0; |
1762 | brdp = stli_brds[portp->brdnr]; | 1652 | brdp = stli_brds[portp->brdnr]; |
1763 | if (brdp == (stlibrd_t *) NULL) | 1653 | if (brdp == NULL) |
1764 | return(0); | 1654 | return 0; |
1765 | 1655 | ||
1766 | save_flags(flags); | 1656 | spin_lock_irqsave(&brd_lock, flags); |
1767 | cli(); | ||
1768 | EBRDENABLE(brdp); | 1657 | EBRDENABLE(brdp); |
1769 | rp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->txq; | 1658 | rp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->txq; |
1770 | head = (unsigned int) rp->head; | 1659 | head = (unsigned int) readw(&rp->head); |
1771 | tail = (unsigned int) rp->tail; | 1660 | tail = (unsigned int) readw(&rp->tail); |
1772 | if (tail != ((unsigned int) rp->tail)) | 1661 | if (tail != ((unsigned int) readw(&rp->tail))) |
1773 | tail = (unsigned int) rp->tail; | 1662 | tail = (unsigned int) readw(&rp->tail); |
1774 | len = (head >= tail) ? (portp->txsize - (head - tail)) : (tail - head); | 1663 | len = (head >= tail) ? (portp->txsize - (head - tail)) : (tail - head); |
1775 | len--; | 1664 | len--; |
1776 | EBRDDISABLE(brdp); | 1665 | EBRDDISABLE(brdp); |
1777 | restore_flags(flags); | 1666 | spin_unlock_irqrestore(&brd_lock, flags); |
1778 | 1667 | ||
1779 | if (tty == stli_txcooktty) { | 1668 | if (tty == stli_txcooktty) { |
1780 | stli_txcookrealsize = len; | 1669 | stli_txcookrealsize = len; |
1781 | len -= stli_txcooksize; | 1670 | len -= stli_txcooksize; |
1782 | } | 1671 | } |
1783 | return(len); | 1672 | return len; |
1784 | } | 1673 | } |
1785 | 1674 | ||
1786 | /*****************************************************************************/ | 1675 | /*****************************************************************************/ |
@@ -1795,44 +1684,37 @@ static int stli_writeroom(struct tty_struct *tty) | |||
1795 | 1684 | ||
1796 | static int stli_charsinbuffer(struct tty_struct *tty) | 1685 | static int stli_charsinbuffer(struct tty_struct *tty) |
1797 | { | 1686 | { |
1798 | volatile cdkasyrq_t *rp; | 1687 | cdkasyrq_t __iomem *rp; |
1799 | stliport_t *portp; | 1688 | stliport_t *portp; |
1800 | stlibrd_t *brdp; | 1689 | stlibrd_t *brdp; |
1801 | unsigned int head, tail, len; | 1690 | unsigned int head, tail, len; |
1802 | unsigned long flags; | 1691 | unsigned long flags; |
1803 | |||
1804 | #ifdef DEBUG | ||
1805 | printk("stli_charsinbuffer(tty=%x)\n", (int) tty); | ||
1806 | #endif | ||
1807 | 1692 | ||
1808 | if (tty == (struct tty_struct *) NULL) | ||
1809 | return(0); | ||
1810 | if (tty == stli_txcooktty) | 1693 | if (tty == stli_txcooktty) |
1811 | stli_flushchars(tty); | 1694 | stli_flushchars(tty); |
1812 | portp = tty->driver_data; | 1695 | portp = tty->driver_data; |
1813 | if (portp == (stliport_t *) NULL) | 1696 | if (portp == NULL) |
1814 | return(0); | 1697 | return 0; |
1815 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) | 1698 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) |
1816 | return(0); | 1699 | return 0; |
1817 | brdp = stli_brds[portp->brdnr]; | 1700 | brdp = stli_brds[portp->brdnr]; |
1818 | if (brdp == (stlibrd_t *) NULL) | 1701 | if (brdp == NULL) |
1819 | return(0); | 1702 | return 0; |
1820 | 1703 | ||
1821 | save_flags(flags); | 1704 | spin_lock_irqsave(&brd_lock, flags); |
1822 | cli(); | ||
1823 | EBRDENABLE(brdp); | 1705 | EBRDENABLE(brdp); |
1824 | rp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->txq; | 1706 | rp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->txq; |
1825 | head = (unsigned int) rp->head; | 1707 | head = (unsigned int) readw(&rp->head); |
1826 | tail = (unsigned int) rp->tail; | 1708 | tail = (unsigned int) readw(&rp->tail); |
1827 | if (tail != ((unsigned int) rp->tail)) | 1709 | if (tail != ((unsigned int) readw(&rp->tail))) |
1828 | tail = (unsigned int) rp->tail; | 1710 | tail = (unsigned int) readw(&rp->tail); |
1829 | len = (head >= tail) ? (head - tail) : (portp->txsize - (tail - head)); | 1711 | len = (head >= tail) ? (head - tail) : (portp->txsize - (tail - head)); |
1830 | if ((len == 0) && test_bit(ST_TXBUSY, &portp->state)) | 1712 | if ((len == 0) && test_bit(ST_TXBUSY, &portp->state)) |
1831 | len = 1; | 1713 | len = 1; |
1832 | EBRDDISABLE(brdp); | 1714 | EBRDDISABLE(brdp); |
1833 | restore_flags(flags); | 1715 | spin_unlock_irqrestore(&brd_lock, flags); |
1834 | 1716 | ||
1835 | return(len); | 1717 | return len; |
1836 | } | 1718 | } |
1837 | 1719 | ||
1838 | /*****************************************************************************/ | 1720 | /*****************************************************************************/ |
@@ -1843,12 +1725,8 @@ static int stli_charsinbuffer(struct tty_struct *tty) | |||
1843 | 1725 | ||
1844 | static int stli_getserial(stliport_t *portp, struct serial_struct __user *sp) | 1726 | static int stli_getserial(stliport_t *portp, struct serial_struct __user *sp) |
1845 | { | 1727 | { |
1846 | struct serial_struct sio; | 1728 | struct serial_struct sio; |
1847 | stlibrd_t *brdp; | 1729 | stlibrd_t *brdp; |
1848 | |||
1849 | #ifdef DEBUG | ||
1850 | printk("stli_getserial(portp=%x,sp=%x)\n", (int) portp, (int) sp); | ||
1851 | #endif | ||
1852 | 1730 | ||
1853 | memset(&sio, 0, sizeof(struct serial_struct)); | 1731 | memset(&sio, 0, sizeof(struct serial_struct)); |
1854 | sio.type = PORT_UNKNOWN; | 1732 | sio.type = PORT_UNKNOWN; |
@@ -1863,7 +1741,7 @@ static int stli_getserial(stliport_t *portp, struct serial_struct __user *sp) | |||
1863 | sio.hub6 = 0; | 1741 | sio.hub6 = 0; |
1864 | 1742 | ||
1865 | brdp = stli_brds[portp->brdnr]; | 1743 | brdp = stli_brds[portp->brdnr]; |
1866 | if (brdp != (stlibrd_t *) NULL) | 1744 | if (brdp != NULL) |
1867 | sio.port = brdp->iobase; | 1745 | sio.port = brdp->iobase; |
1868 | 1746 | ||
1869 | return copy_to_user(sp, &sio, sizeof(struct serial_struct)) ? | 1747 | return copy_to_user(sp, &sio, sizeof(struct serial_struct)) ? |
@@ -1880,12 +1758,8 @@ static int stli_getserial(stliport_t *portp, struct serial_struct __user *sp) | |||
1880 | 1758 | ||
1881 | static int stli_setserial(stliport_t *portp, struct serial_struct __user *sp) | 1759 | static int stli_setserial(stliport_t *portp, struct serial_struct __user *sp) |
1882 | { | 1760 | { |
1883 | struct serial_struct sio; | 1761 | struct serial_struct sio; |
1884 | int rc; | 1762 | int rc; |
1885 | |||
1886 | #ifdef DEBUG | ||
1887 | printk("stli_setserial(portp=%p,sp=%p)\n", portp, sp); | ||
1888 | #endif | ||
1889 | 1763 | ||
1890 | if (copy_from_user(&sio, sp, sizeof(struct serial_struct))) | 1764 | if (copy_from_user(&sio, sp, sizeof(struct serial_struct))) |
1891 | return -EFAULT; | 1765 | return -EFAULT; |
@@ -1894,7 +1768,7 @@ static int stli_setserial(stliport_t *portp, struct serial_struct __user *sp) | |||
1894 | (sio.close_delay != portp->close_delay) || | 1768 | (sio.close_delay != portp->close_delay) || |
1895 | ((sio.flags & ~ASYNC_USR_MASK) != | 1769 | ((sio.flags & ~ASYNC_USR_MASK) != |
1896 | (portp->flags & ~ASYNC_USR_MASK))) | 1770 | (portp->flags & ~ASYNC_USR_MASK))) |
1897 | return(-EPERM); | 1771 | return -EPERM; |
1898 | } | 1772 | } |
1899 | 1773 | ||
1900 | portp->flags = (portp->flags & ~ASYNC_USR_MASK) | | 1774 | portp->flags = (portp->flags & ~ASYNC_USR_MASK) | |
@@ -1905,8 +1779,8 @@ static int stli_setserial(stliport_t *portp, struct serial_struct __user *sp) | |||
1905 | portp->custom_divisor = sio.custom_divisor; | 1779 | portp->custom_divisor = sio.custom_divisor; |
1906 | 1780 | ||
1907 | if ((rc = stli_setport(portp)) < 0) | 1781 | if ((rc = stli_setport(portp)) < 0) |
1908 | return(rc); | 1782 | return rc; |
1909 | return(0); | 1783 | return 0; |
1910 | } | 1784 | } |
1911 | 1785 | ||
1912 | /*****************************************************************************/ | 1786 | /*****************************************************************************/ |
@@ -1917,19 +1791,19 @@ static int stli_tiocmget(struct tty_struct *tty, struct file *file) | |||
1917 | stlibrd_t *brdp; | 1791 | stlibrd_t *brdp; |
1918 | int rc; | 1792 | int rc; |
1919 | 1793 | ||
1920 | if (portp == (stliport_t *) NULL) | 1794 | if (portp == NULL) |
1921 | return(-ENODEV); | 1795 | return -ENODEV; |
1922 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) | 1796 | if (portp->brdnr < 0 || portp->brdnr >= stli_nrbrds) |
1923 | return(0); | 1797 | return 0; |
1924 | brdp = stli_brds[portp->brdnr]; | 1798 | brdp = stli_brds[portp->brdnr]; |
1925 | if (brdp == (stlibrd_t *) NULL) | 1799 | if (brdp == NULL) |
1926 | return(0); | 1800 | return 0; |
1927 | if (tty->flags & (1 << TTY_IO_ERROR)) | 1801 | if (tty->flags & (1 << TTY_IO_ERROR)) |
1928 | return(-EIO); | 1802 | return -EIO; |
1929 | 1803 | ||
1930 | if ((rc = stli_cmdwait(brdp, portp, A_GETSIGNALS, | 1804 | if ((rc = stli_cmdwait(brdp, portp, A_GETSIGNALS, |
1931 | &portp->asig, sizeof(asysigs_t), 1)) < 0) | 1805 | &portp->asig, sizeof(asysigs_t), 1)) < 0) |
1932 | return(rc); | 1806 | return rc; |
1933 | 1807 | ||
1934 | return stli_mktiocm(portp->asig.sigvalue); | 1808 | return stli_mktiocm(portp->asig.sigvalue); |
1935 | } | 1809 | } |
@@ -1941,15 +1815,15 @@ static int stli_tiocmset(struct tty_struct *tty, struct file *file, | |||
1941 | stlibrd_t *brdp; | 1815 | stlibrd_t *brdp; |
1942 | int rts = -1, dtr = -1; | 1816 | int rts = -1, dtr = -1; |
1943 | 1817 | ||
1944 | if (portp == (stliport_t *) NULL) | 1818 | if (portp == NULL) |
1945 | return(-ENODEV); | 1819 | return -ENODEV; |
1946 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) | 1820 | if (portp->brdnr < 0 || portp->brdnr >= stli_nrbrds) |
1947 | return(0); | 1821 | return 0; |
1948 | brdp = stli_brds[portp->brdnr]; | 1822 | brdp = stli_brds[portp->brdnr]; |
1949 | if (brdp == (stlibrd_t *) NULL) | 1823 | if (brdp == NULL) |
1950 | return(0); | 1824 | return 0; |
1951 | if (tty->flags & (1 << TTY_IO_ERROR)) | 1825 | if (tty->flags & (1 << TTY_IO_ERROR)) |
1952 | return(-EIO); | 1826 | return -EIO; |
1953 | 1827 | ||
1954 | if (set & TIOCM_RTS) | 1828 | if (set & TIOCM_RTS) |
1955 | rts = 1; | 1829 | rts = 1; |
@@ -1968,32 +1842,25 @@ static int stli_tiocmset(struct tty_struct *tty, struct file *file, | |||
1968 | 1842 | ||
1969 | static int stli_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg) | 1843 | static int stli_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg) |
1970 | { | 1844 | { |
1971 | stliport_t *portp; | 1845 | stliport_t *portp; |
1972 | stlibrd_t *brdp; | 1846 | stlibrd_t *brdp; |
1973 | unsigned int ival; | 1847 | unsigned int ival; |
1974 | int rc; | 1848 | int rc; |
1975 | void __user *argp = (void __user *)arg; | 1849 | void __user *argp = (void __user *)arg; |
1976 | 1850 | ||
1977 | #ifdef DEBUG | ||
1978 | printk("stli_ioctl(tty=%x,file=%x,cmd=%x,arg=%x)\n", | ||
1979 | (int) tty, (int) file, cmd, (int) arg); | ||
1980 | #endif | ||
1981 | |||
1982 | if (tty == (struct tty_struct *) NULL) | ||
1983 | return(-ENODEV); | ||
1984 | portp = tty->driver_data; | 1851 | portp = tty->driver_data; |
1985 | if (portp == (stliport_t *) NULL) | 1852 | if (portp == NULL) |
1986 | return(-ENODEV); | 1853 | return -ENODEV; |
1987 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) | 1854 | if (portp->brdnr < 0 || portp->brdnr >= stli_nrbrds) |
1988 | return(0); | 1855 | return 0; |
1989 | brdp = stli_brds[portp->brdnr]; | 1856 | brdp = stli_brds[portp->brdnr]; |
1990 | if (brdp == (stlibrd_t *) NULL) | 1857 | if (brdp == NULL) |
1991 | return(0); | 1858 | return 0; |
1992 | 1859 | ||
1993 | if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) && | 1860 | if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) && |
1994 | (cmd != COM_GETPORTSTATS) && (cmd != COM_CLRPORTSTATS)) { | 1861 | (cmd != COM_GETPORTSTATS) && (cmd != COM_CLRPORTSTATS)) { |
1995 | if (tty->flags & (1 << TTY_IO_ERROR)) | 1862 | if (tty->flags & (1 << TTY_IO_ERROR)) |
1996 | return(-EIO); | 1863 | return -EIO; |
1997 | } | 1864 | } |
1998 | 1865 | ||
1999 | rc = 0; | 1866 | rc = 0; |
@@ -2040,7 +1907,7 @@ static int stli_ioctl(struct tty_struct *tty, struct file *file, unsigned int cm | |||
2040 | break; | 1907 | break; |
2041 | } | 1908 | } |
2042 | 1909 | ||
2043 | return(rc); | 1910 | return rc; |
2044 | } | 1911 | } |
2045 | 1912 | ||
2046 | /*****************************************************************************/ | 1913 | /*****************************************************************************/ |
@@ -2052,24 +1919,20 @@ static int stli_ioctl(struct tty_struct *tty, struct file *file, unsigned int cm | |||
2052 | 1919 | ||
2053 | static void stli_settermios(struct tty_struct *tty, struct termios *old) | 1920 | static void stli_settermios(struct tty_struct *tty, struct termios *old) |
2054 | { | 1921 | { |
2055 | stliport_t *portp; | 1922 | stliport_t *portp; |
2056 | stlibrd_t *brdp; | 1923 | stlibrd_t *brdp; |
2057 | struct termios *tiosp; | 1924 | struct termios *tiosp; |
2058 | asyport_t aport; | 1925 | asyport_t aport; |
2059 | |||
2060 | #ifdef DEBUG | ||
2061 | printk("stli_settermios(tty=%x,old=%x)\n", (int) tty, (int) old); | ||
2062 | #endif | ||
2063 | 1926 | ||
2064 | if (tty == (struct tty_struct *) NULL) | 1927 | if (tty == NULL) |
2065 | return; | 1928 | return; |
2066 | portp = tty->driver_data; | 1929 | portp = tty->driver_data; |
2067 | if (portp == (stliport_t *) NULL) | 1930 | if (portp == NULL) |
2068 | return; | 1931 | return; |
2069 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) | 1932 | if (portp->brdnr < 0 || portp->brdnr >= stli_nrbrds) |
2070 | return; | 1933 | return; |
2071 | brdp = stli_brds[portp->brdnr]; | 1934 | brdp = stli_brds[portp->brdnr]; |
2072 | if (brdp == (stlibrd_t *) NULL) | 1935 | if (brdp == NULL) |
2073 | return; | 1936 | return; |
2074 | 1937 | ||
2075 | tiosp = tty->termios; | 1938 | tiosp = tty->termios; |
@@ -2102,18 +1965,9 @@ static void stli_settermios(struct tty_struct *tty, struct termios *old) | |||
2102 | 1965 | ||
2103 | static void stli_throttle(struct tty_struct *tty) | 1966 | static void stli_throttle(struct tty_struct *tty) |
2104 | { | 1967 | { |
2105 | stliport_t *portp; | 1968 | stliport_t *portp = tty->driver_data; |
2106 | 1969 | if (portp == NULL) | |
2107 | #ifdef DEBUG | ||
2108 | printk("stli_throttle(tty=%x)\n", (int) tty); | ||
2109 | #endif | ||
2110 | |||
2111 | if (tty == (struct tty_struct *) NULL) | ||
2112 | return; | 1970 | return; |
2113 | portp = tty->driver_data; | ||
2114 | if (portp == (stliport_t *) NULL) | ||
2115 | return; | ||
2116 | |||
2117 | set_bit(ST_RXSTOP, &portp->state); | 1971 | set_bit(ST_RXSTOP, &portp->state); |
2118 | } | 1972 | } |
2119 | 1973 | ||
@@ -2127,88 +1981,30 @@ static void stli_throttle(struct tty_struct *tty) | |||
2127 | 1981 | ||
2128 | static void stli_unthrottle(struct tty_struct *tty) | 1982 | static void stli_unthrottle(struct tty_struct *tty) |
2129 | { | 1983 | { |
2130 | stliport_t *portp; | 1984 | stliport_t *portp = tty->driver_data; |
2131 | 1985 | if (portp == NULL) | |
2132 | #ifdef DEBUG | ||
2133 | printk("stli_unthrottle(tty=%x)\n", (int) tty); | ||
2134 | #endif | ||
2135 | |||
2136 | if (tty == (struct tty_struct *) NULL) | ||
2137 | return; | ||
2138 | portp = tty->driver_data; | ||
2139 | if (portp == (stliport_t *) NULL) | ||
2140 | return; | 1986 | return; |
2141 | |||
2142 | clear_bit(ST_RXSTOP, &portp->state); | 1987 | clear_bit(ST_RXSTOP, &portp->state); |
2143 | } | 1988 | } |
2144 | 1989 | ||
2145 | /*****************************************************************************/ | 1990 | /*****************************************************************************/ |
2146 | 1991 | ||
2147 | /* | 1992 | /* |
2148 | * Stop the transmitter. Basically to do this we will just turn TX | 1993 | * Stop the transmitter. |
2149 | * interrupts off. | ||
2150 | */ | 1994 | */ |
2151 | 1995 | ||
2152 | static void stli_stop(struct tty_struct *tty) | 1996 | static void stli_stop(struct tty_struct *tty) |
2153 | { | 1997 | { |
2154 | stlibrd_t *brdp; | ||
2155 | stliport_t *portp; | ||
2156 | asyctrl_t actrl; | ||
2157 | |||
2158 | #ifdef DEBUG | ||
2159 | printk("stli_stop(tty=%x)\n", (int) tty); | ||
2160 | #endif | ||
2161 | |||
2162 | if (tty == (struct tty_struct *) NULL) | ||
2163 | return; | ||
2164 | portp = tty->driver_data; | ||
2165 | if (portp == (stliport_t *) NULL) | ||
2166 | return; | ||
2167 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) | ||
2168 | return; | ||
2169 | brdp = stli_brds[portp->brdnr]; | ||
2170 | if (brdp == (stlibrd_t *) NULL) | ||
2171 | return; | ||
2172 | |||
2173 | memset(&actrl, 0, sizeof(asyctrl_t)); | ||
2174 | actrl.txctrl = CT_STOPFLOW; | ||
2175 | #if 0 | ||
2176 | stli_cmdwait(brdp, portp, A_PORTCTRL, &actrl, sizeof(asyctrl_t), 0); | ||
2177 | #endif | ||
2178 | } | 1998 | } |
2179 | 1999 | ||
2180 | /*****************************************************************************/ | 2000 | /*****************************************************************************/ |
2181 | 2001 | ||
2182 | /* | 2002 | /* |
2183 | * Start the transmitter again. Just turn TX interrupts back on. | 2003 | * Start the transmitter again. |
2184 | */ | 2004 | */ |
2185 | 2005 | ||
2186 | static void stli_start(struct tty_struct *tty) | 2006 | static void stli_start(struct tty_struct *tty) |
2187 | { | 2007 | { |
2188 | stliport_t *portp; | ||
2189 | stlibrd_t *brdp; | ||
2190 | asyctrl_t actrl; | ||
2191 | |||
2192 | #ifdef DEBUG | ||
2193 | printk("stli_start(tty=%x)\n", (int) tty); | ||
2194 | #endif | ||
2195 | |||
2196 | if (tty == (struct tty_struct *) NULL) | ||
2197 | return; | ||
2198 | portp = tty->driver_data; | ||
2199 | if (portp == (stliport_t *) NULL) | ||
2200 | return; | ||
2201 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) | ||
2202 | return; | ||
2203 | brdp = stli_brds[portp->brdnr]; | ||
2204 | if (brdp == (stlibrd_t *) NULL) | ||
2205 | return; | ||
2206 | |||
2207 | memset(&actrl, 0, sizeof(asyctrl_t)); | ||
2208 | actrl.txctrl = CT_STARTFLOW; | ||
2209 | #if 0 | ||
2210 | stli_cmdwait(brdp, portp, A_PORTCTRL, &actrl, sizeof(asyctrl_t), 0); | ||
2211 | #endif | ||
2212 | } | 2008 | } |
2213 | 2009 | ||
2214 | /*****************************************************************************/ | 2010 | /*****************************************************************************/ |
@@ -2224,22 +2020,9 @@ static void stli_start(struct tty_struct *tty) | |||
2224 | 2020 | ||
2225 | static void stli_dohangup(void *arg) | 2021 | static void stli_dohangup(void *arg) |
2226 | { | 2022 | { |
2227 | stliport_t *portp; | 2023 | stliport_t *portp = (stliport_t *) arg; |
2228 | 2024 | if (portp->tty != NULL) { | |
2229 | #ifdef DEBUG | 2025 | tty_hangup(portp->tty); |
2230 | printk(KERN_DEBUG "stli_dohangup(portp=%x)\n", (int) arg); | ||
2231 | #endif | ||
2232 | |||
2233 | /* | ||
2234 | * FIXME: There's a module removal race here: tty_hangup | ||
2235 | * calls schedule_work which will call into this | ||
2236 | * driver later. | ||
2237 | */ | ||
2238 | portp = (stliport_t *) arg; | ||
2239 | if (portp != (stliport_t *) NULL) { | ||
2240 | if (portp->tty != (struct tty_struct *) NULL) { | ||
2241 | tty_hangup(portp->tty); | ||
2242 | } | ||
2243 | } | 2026 | } |
2244 | } | 2027 | } |
2245 | 2028 | ||
@@ -2254,31 +2037,25 @@ static void stli_dohangup(void *arg) | |||
2254 | 2037 | ||
2255 | static void stli_hangup(struct tty_struct *tty) | 2038 | static void stli_hangup(struct tty_struct *tty) |
2256 | { | 2039 | { |
2257 | stliport_t *portp; | 2040 | stliport_t *portp; |
2258 | stlibrd_t *brdp; | 2041 | stlibrd_t *brdp; |
2259 | unsigned long flags; | 2042 | unsigned long flags; |
2260 | |||
2261 | #ifdef DEBUG | ||
2262 | printk(KERN_DEBUG "stli_hangup(tty=%x)\n", (int) tty); | ||
2263 | #endif | ||
2264 | 2043 | ||
2265 | if (tty == (struct tty_struct *) NULL) | ||
2266 | return; | ||
2267 | portp = tty->driver_data; | 2044 | portp = tty->driver_data; |
2268 | if (portp == (stliport_t *) NULL) | 2045 | if (portp == NULL) |
2269 | return; | 2046 | return; |
2270 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) | 2047 | if (portp->brdnr < 0 || portp->brdnr >= stli_nrbrds) |
2271 | return; | 2048 | return; |
2272 | brdp = stli_brds[portp->brdnr]; | 2049 | brdp = stli_brds[portp->brdnr]; |
2273 | if (brdp == (stlibrd_t *) NULL) | 2050 | if (brdp == NULL) |
2274 | return; | 2051 | return; |
2275 | 2052 | ||
2276 | portp->flags &= ~ASYNC_INITIALIZED; | 2053 | portp->flags &= ~ASYNC_INITIALIZED; |
2277 | 2054 | ||
2278 | save_flags(flags); | 2055 | if (!test_bit(ST_CLOSING, &portp->state)) |
2279 | cli(); | ||
2280 | if (! test_bit(ST_CLOSING, &portp->state)) | ||
2281 | stli_rawclose(brdp, portp, 0, 0); | 2056 | stli_rawclose(brdp, portp, 0, 0); |
2057 | |||
2058 | spin_lock_irqsave(&stli_lock, flags); | ||
2282 | if (tty->termios->c_cflag & HUPCL) { | 2059 | if (tty->termios->c_cflag & HUPCL) { |
2283 | stli_mkasysigs(&portp->asig, 0, 0); | 2060 | stli_mkasysigs(&portp->asig, 0, 0); |
2284 | if (test_bit(ST_CMDING, &portp->state)) { | 2061 | if (test_bit(ST_CMDING, &portp->state)) { |
@@ -2290,14 +2067,15 @@ static void stli_hangup(struct tty_struct *tty) | |||
2290 | &portp->asig, sizeof(asysigs_t), 0); | 2067 | &portp->asig, sizeof(asysigs_t), 0); |
2291 | } | 2068 | } |
2292 | } | 2069 | } |
2293 | restore_flags(flags); | ||
2294 | 2070 | ||
2295 | clear_bit(ST_TXBUSY, &portp->state); | 2071 | clear_bit(ST_TXBUSY, &portp->state); |
2296 | clear_bit(ST_RXSTOP, &portp->state); | 2072 | clear_bit(ST_RXSTOP, &portp->state); |
2297 | set_bit(TTY_IO_ERROR, &tty->flags); | 2073 | set_bit(TTY_IO_ERROR, &tty->flags); |
2298 | portp->tty = (struct tty_struct *) NULL; | 2074 | portp->tty = NULL; |
2299 | portp->flags &= ~ASYNC_NORMAL_ACTIVE; | 2075 | portp->flags &= ~ASYNC_NORMAL_ACTIVE; |
2300 | portp->refcount = 0; | 2076 | portp->refcount = 0; |
2077 | spin_unlock_irqrestore(&stli_lock, flags); | ||
2078 | |||
2301 | wake_up_interruptible(&portp->open_wait); | 2079 | wake_up_interruptible(&portp->open_wait); |
2302 | } | 2080 | } |
2303 | 2081 | ||
@@ -2312,29 +2090,22 @@ static void stli_hangup(struct tty_struct *tty) | |||
2312 | 2090 | ||
2313 | static void stli_flushbuffer(struct tty_struct *tty) | 2091 | static void stli_flushbuffer(struct tty_struct *tty) |
2314 | { | 2092 | { |
2315 | stliport_t *portp; | 2093 | stliport_t *portp; |
2316 | stlibrd_t *brdp; | 2094 | stlibrd_t *brdp; |
2317 | unsigned long ftype, flags; | 2095 | unsigned long ftype, flags; |
2318 | |||
2319 | #ifdef DEBUG | ||
2320 | printk(KERN_DEBUG "stli_flushbuffer(tty=%x)\n", (int) tty); | ||
2321 | #endif | ||
2322 | 2096 | ||
2323 | if (tty == (struct tty_struct *) NULL) | ||
2324 | return; | ||
2325 | portp = tty->driver_data; | 2097 | portp = tty->driver_data; |
2326 | if (portp == (stliport_t *) NULL) | 2098 | if (portp == NULL) |
2327 | return; | 2099 | return; |
2328 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) | 2100 | if (portp->brdnr < 0 || portp->brdnr >= stli_nrbrds) |
2329 | return; | 2101 | return; |
2330 | brdp = stli_brds[portp->brdnr]; | 2102 | brdp = stli_brds[portp->brdnr]; |
2331 | if (brdp == (stlibrd_t *) NULL) | 2103 | if (brdp == NULL) |
2332 | return; | 2104 | return; |
2333 | 2105 | ||
2334 | save_flags(flags); | 2106 | spin_lock_irqsave(&brd_lock, flags); |
2335 | cli(); | ||
2336 | if (tty == stli_txcooktty) { | 2107 | if (tty == stli_txcooktty) { |
2337 | stli_txcooktty = (struct tty_struct *) NULL; | 2108 | stli_txcooktty = NULL; |
2338 | stli_txcooksize = 0; | 2109 | stli_txcooksize = 0; |
2339 | stli_txcookrealsize = 0; | 2110 | stli_txcookrealsize = 0; |
2340 | } | 2111 | } |
@@ -2346,15 +2117,10 @@ static void stli_flushbuffer(struct tty_struct *tty) | |||
2346 | ftype |= FLUSHRX; | 2117 | ftype |= FLUSHRX; |
2347 | clear_bit(ST_DOFLUSHRX, &portp->state); | 2118 | clear_bit(ST_DOFLUSHRX, &portp->state); |
2348 | } | 2119 | } |
2349 | stli_sendcmd(brdp, portp, A_FLUSH, &ftype, | 2120 | __stli_sendcmd(brdp, portp, A_FLUSH, &ftype, sizeof(u32), 0); |
2350 | sizeof(unsigned long), 0); | ||
2351 | } | 2121 | } |
2352 | restore_flags(flags); | 2122 | spin_unlock_irqrestore(&brd_lock, flags); |
2353 | 2123 | tty_wakeup(tty); | |
2354 | wake_up_interruptible(&tty->write_wait); | ||
2355 | if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && | ||
2356 | tty->ldisc.write_wakeup) | ||
2357 | (tty->ldisc.write_wakeup)(tty); | ||
2358 | } | 2124 | } |
2359 | 2125 | ||
2360 | /*****************************************************************************/ | 2126 | /*****************************************************************************/ |
@@ -2364,55 +2130,31 @@ static void stli_breakctl(struct tty_struct *tty, int state) | |||
2364 | stlibrd_t *brdp; | 2130 | stlibrd_t *brdp; |
2365 | stliport_t *portp; | 2131 | stliport_t *portp; |
2366 | long arg; | 2132 | long arg; |
2367 | /* long savestate, savetime; */ | ||
2368 | 2133 | ||
2369 | #ifdef DEBUG | ||
2370 | printk(KERN_DEBUG "stli_breakctl(tty=%x,state=%d)\n", (int) tty, state); | ||
2371 | #endif | ||
2372 | |||
2373 | if (tty == (struct tty_struct *) NULL) | ||
2374 | return; | ||
2375 | portp = tty->driver_data; | 2134 | portp = tty->driver_data; |
2376 | if (portp == (stliport_t *) NULL) | 2135 | if (portp == NULL) |
2377 | return; | 2136 | return; |
2378 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) | 2137 | if (portp->brdnr < 0 || portp->brdnr >= stli_nrbrds) |
2379 | return; | 2138 | return; |
2380 | brdp = stli_brds[portp->brdnr]; | 2139 | brdp = stli_brds[portp->brdnr]; |
2381 | if (brdp == (stlibrd_t *) NULL) | 2140 | if (brdp == NULL) |
2382 | return; | 2141 | return; |
2383 | 2142 | ||
2384 | /* | ||
2385 | * Due to a bug in the tty send_break() code we need to preserve | ||
2386 | * the current process state and timeout... | ||
2387 | savetime = current->timeout; | ||
2388 | savestate = current->state; | ||
2389 | */ | ||
2390 | |||
2391 | arg = (state == -1) ? BREAKON : BREAKOFF; | 2143 | arg = (state == -1) ? BREAKON : BREAKOFF; |
2392 | stli_cmdwait(brdp, portp, A_BREAK, &arg, sizeof(long), 0); | 2144 | stli_cmdwait(brdp, portp, A_BREAK, &arg, sizeof(long), 0); |
2393 | |||
2394 | /* | ||
2395 | * | ||
2396 | current->timeout = savetime; | ||
2397 | current->state = savestate; | ||
2398 | */ | ||
2399 | } | 2145 | } |
2400 | 2146 | ||
2401 | /*****************************************************************************/ | 2147 | /*****************************************************************************/ |
2402 | 2148 | ||
2403 | static void stli_waituntilsent(struct tty_struct *tty, int timeout) | 2149 | static void stli_waituntilsent(struct tty_struct *tty, int timeout) |
2404 | { | 2150 | { |
2405 | stliport_t *portp; | 2151 | stliport_t *portp; |
2406 | unsigned long tend; | 2152 | unsigned long tend; |
2407 | 2153 | ||
2408 | #ifdef DEBUG | 2154 | if (tty == NULL) |
2409 | printk(KERN_DEBUG "stli_waituntilsent(tty=%x,timeout=%x)\n", (int) tty, timeout); | ||
2410 | #endif | ||
2411 | |||
2412 | if (tty == (struct tty_struct *) NULL) | ||
2413 | return; | 2155 | return; |
2414 | portp = tty->driver_data; | 2156 | portp = tty->driver_data; |
2415 | if (portp == (stliport_t *) NULL) | 2157 | if (portp == NULL) |
2416 | return; | 2158 | return; |
2417 | 2159 | ||
2418 | if (timeout == 0) | 2160 | if (timeout == 0) |
@@ -2436,19 +2178,13 @@ static void stli_sendxchar(struct tty_struct *tty, char ch) | |||
2436 | stliport_t *portp; | 2178 | stliport_t *portp; |
2437 | asyctrl_t actrl; | 2179 | asyctrl_t actrl; |
2438 | 2180 | ||
2439 | #ifdef DEBUG | ||
2440 | printk(KERN_DEBUG "stli_sendxchar(tty=%x,ch=%x)\n", (int) tty, ch); | ||
2441 | #endif | ||
2442 | |||
2443 | if (tty == (struct tty_struct *) NULL) | ||
2444 | return; | ||
2445 | portp = tty->driver_data; | 2181 | portp = tty->driver_data; |
2446 | if (portp == (stliport_t *) NULL) | 2182 | if (portp == NULL) |
2447 | return; | 2183 | return; |
2448 | if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) | 2184 | if (portp->brdnr < 0 || portp->brdnr >= stli_nrbrds) |
2449 | return; | 2185 | return; |
2450 | brdp = stli_brds[portp->brdnr]; | 2186 | brdp = stli_brds[portp->brdnr]; |
2451 | if (brdp == (stlibrd_t *) NULL) | 2187 | if (brdp == NULL) |
2452 | return; | 2188 | return; |
2453 | 2189 | ||
2454 | memset(&actrl, 0, sizeof(asyctrl_t)); | 2190 | memset(&actrl, 0, sizeof(asyctrl_t)); |
@@ -2460,7 +2196,6 @@ static void stli_sendxchar(struct tty_struct *tty, char ch) | |||
2460 | actrl.txctrl = CT_SENDCHR; | 2196 | actrl.txctrl = CT_SENDCHR; |
2461 | actrl.tximdch = ch; | 2197 | actrl.tximdch = ch; |
2462 | } | 2198 | } |
2463 | |||
2464 | stli_cmdwait(brdp, portp, A_PORTCTRL, &actrl, sizeof(asyctrl_t), 0); | 2199 | stli_cmdwait(brdp, portp, A_PORTCTRL, &actrl, sizeof(asyctrl_t), 0); |
2465 | } | 2200 | } |
2466 | 2201 | ||
@@ -2476,17 +2211,17 @@ static void stli_sendxchar(struct tty_struct *tty, char ch) | |||
2476 | 2211 | ||
2477 | static int stli_portinfo(stlibrd_t *brdp, stliport_t *portp, int portnr, char *pos) | 2212 | static int stli_portinfo(stlibrd_t *brdp, stliport_t *portp, int portnr, char *pos) |
2478 | { | 2213 | { |
2479 | char *sp, *uart; | 2214 | char *sp, *uart; |
2480 | int rc, cnt; | 2215 | int rc, cnt; |
2481 | 2216 | ||
2482 | rc = stli_portcmdstats(portp); | 2217 | rc = stli_portcmdstats(portp); |
2483 | 2218 | ||
2484 | uart = "UNKNOWN"; | 2219 | uart = "UNKNOWN"; |
2485 | if (brdp->state & BST_STARTED) { | 2220 | if (brdp->state & BST_STARTED) { |
2486 | switch (stli_comstats.hwid) { | 2221 | switch (stli_comstats.hwid) { |
2487 | case 0: uart = "2681"; break; | 2222 | case 0: uart = "2681"; break; |
2488 | case 1: uart = "SC26198"; break; | 2223 | case 1: uart = "SC26198"; break; |
2489 | default: uart = "CD1400"; break; | 2224 | default:uart = "CD1400"; break; |
2490 | } | 2225 | } |
2491 | } | 2226 | } |
2492 | 2227 | ||
@@ -2537,17 +2272,11 @@ static int stli_portinfo(stlibrd_t *brdp, stliport_t *portp, int portnr, char *p | |||
2537 | 2272 | ||
2538 | static int stli_readproc(char *page, char **start, off_t off, int count, int *eof, void *data) | 2273 | static int stli_readproc(char *page, char **start, off_t off, int count, int *eof, void *data) |
2539 | { | 2274 | { |
2540 | stlibrd_t *brdp; | 2275 | stlibrd_t *brdp; |
2541 | stliport_t *portp; | 2276 | stliport_t *portp; |
2542 | int brdnr, portnr, totalport; | 2277 | int brdnr, portnr, totalport; |
2543 | int curoff, maxoff; | 2278 | int curoff, maxoff; |
2544 | char *pos; | 2279 | char *pos; |
2545 | |||
2546 | #ifdef DEBUG | ||
2547 | printk(KERN_DEBUG "stli_readproc(page=%x,start=%x,off=%x,count=%d,eof=%x," | ||
2548 | "data=%x\n", (int) page, (int) start, (int) off, count, | ||
2549 | (int) eof, (int) data); | ||
2550 | #endif | ||
2551 | 2280 | ||
2552 | pos = page; | 2281 | pos = page; |
2553 | totalport = 0; | 2282 | totalport = 0; |
@@ -2568,7 +2297,7 @@ static int stli_readproc(char *page, char **start, off_t off, int count, int *eo | |||
2568 | */ | 2297 | */ |
2569 | for (brdnr = 0; (brdnr < stli_nrbrds); brdnr++) { | 2298 | for (brdnr = 0; (brdnr < stli_nrbrds); brdnr++) { |
2570 | brdp = stli_brds[brdnr]; | 2299 | brdp = stli_brds[brdnr]; |
2571 | if (brdp == (stlibrd_t *) NULL) | 2300 | if (brdp == NULL) |
2572 | continue; | 2301 | continue; |
2573 | if (brdp->state == 0) | 2302 | if (brdp->state == 0) |
2574 | continue; | 2303 | continue; |
@@ -2583,7 +2312,7 @@ static int stli_readproc(char *page, char **start, off_t off, int count, int *eo | |||
2583 | for (portnr = 0; (portnr < brdp->nrports); portnr++, | 2312 | for (portnr = 0; (portnr < brdp->nrports); portnr++, |
2584 | totalport++) { | 2313 | totalport++) { |
2585 | portp = brdp->ports[portnr]; | 2314 | portp = brdp->ports[portnr]; |
2586 | if (portp == (stliport_t *) NULL) | 2315 | if (portp == NULL) |
2587 | continue; | 2316 | continue; |
2588 | if (off >= (curoff += MAXLINE)) | 2317 | if (off >= (curoff += MAXLINE)) |
2589 | continue; | 2318 | continue; |
@@ -2610,49 +2339,54 @@ stli_readdone: | |||
2610 | * a poll routine that does not have user context. Therefore you cannot | 2339 | * a poll routine that does not have user context. Therefore you cannot |
2611 | * copy back directly into user space, or to the kernel stack of a | 2340 | * copy back directly into user space, or to the kernel stack of a |
2612 | * process. This routine does not sleep, so can be called from anywhere. | 2341 | * process. This routine does not sleep, so can be called from anywhere. |
2342 | * | ||
2343 | * The caller must hold the brd_lock (see also stli_sendcmd the usual | ||
2344 | * entry point) | ||
2613 | */ | 2345 | */ |
2614 | 2346 | ||
2615 | static void stli_sendcmd(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback) | 2347 | static void __stli_sendcmd(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback) |
2616 | { | 2348 | { |
2617 | volatile cdkhdr_t *hdrp; | 2349 | cdkhdr_t __iomem *hdrp; |
2618 | volatile cdkctrl_t *cp; | 2350 | cdkctrl_t __iomem *cp; |
2619 | volatile unsigned char *bits; | 2351 | unsigned char __iomem *bits; |
2620 | unsigned long flags; | 2352 | unsigned long flags; |
2621 | 2353 | ||
2622 | #ifdef DEBUG | 2354 | spin_lock_irqsave(&brd_lock, flags); |
2623 | printk(KERN_DEBUG "stli_sendcmd(brdp=%x,portp=%x,cmd=%x,arg=%x,size=%d," | ||
2624 | "copyback=%d)\n", (int) brdp, (int) portp, (int) cmd, | ||
2625 | (int) arg, size, copyback); | ||
2626 | #endif | ||
2627 | |||
2628 | save_flags(flags); | ||
2629 | cli(); | ||
2630 | 2355 | ||
2631 | if (test_bit(ST_CMDING, &portp->state)) { | 2356 | if (test_bit(ST_CMDING, &portp->state)) { |
2632 | printk(KERN_ERR "STALLION: command already busy, cmd=%x!\n", | 2357 | printk(KERN_ERR "STALLION: command already busy, cmd=%x!\n", |
2633 | (int) cmd); | 2358 | (int) cmd); |
2634 | restore_flags(flags); | 2359 | spin_unlock_irqrestore(&brd_lock, flags); |
2635 | return; | 2360 | return; |
2636 | } | 2361 | } |
2637 | 2362 | ||
2638 | EBRDENABLE(brdp); | 2363 | EBRDENABLE(brdp); |
2639 | cp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl; | 2364 | cp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl; |
2640 | if (size > 0) { | 2365 | if (size > 0) { |
2641 | memcpy((void *) &(cp->args[0]), arg, size); | 2366 | memcpy_toio((void __iomem *) &(cp->args[0]), arg, size); |
2642 | if (copyback) { | 2367 | if (copyback) { |
2643 | portp->argp = arg; | 2368 | portp->argp = arg; |
2644 | portp->argsize = size; | 2369 | portp->argsize = size; |
2645 | } | 2370 | } |
2646 | } | 2371 | } |
2647 | cp->status = 0; | 2372 | writel(0, &cp->status); |
2648 | cp->cmd = cmd; | 2373 | writel(cmd, &cp->cmd); |
2649 | hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); | 2374 | hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); |
2650 | bits = ((volatile unsigned char *) hdrp) + brdp->slaveoffset + | 2375 | bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset + |
2651 | portp->portidx; | 2376 | portp->portidx; |
2652 | *bits |= portp->portbit; | 2377 | writeb(readb(bits) | portp->portbit, bits); |
2653 | set_bit(ST_CMDING, &portp->state); | 2378 | set_bit(ST_CMDING, &portp->state); |
2654 | EBRDDISABLE(brdp); | 2379 | EBRDDISABLE(brdp); |
2655 | restore_flags(flags); | 2380 | spin_unlock_irqrestore(&brd_lock, flags); |
2381 | } | ||
2382 | |||
2383 | static void stli_sendcmd(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback) | ||
2384 | { | ||
2385 | unsigned long flags; | ||
2386 | |||
2387 | spin_lock_irqsave(&brd_lock, flags); | ||
2388 | __stli_sendcmd(brdp, portp, cmd, arg, size, copyback); | ||
2389 | spin_unlock_irqrestore(&brd_lock, flags); | ||
2656 | } | 2390 | } |
2657 | 2391 | ||
2658 | /*****************************************************************************/ | 2392 | /*****************************************************************************/ |
@@ -2667,28 +2401,23 @@ static void stli_sendcmd(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, | |||
2667 | 2401 | ||
2668 | static void stli_read(stlibrd_t *brdp, stliport_t *portp) | 2402 | static void stli_read(stlibrd_t *brdp, stliport_t *portp) |
2669 | { | 2403 | { |
2670 | volatile cdkasyrq_t *rp; | 2404 | cdkasyrq_t __iomem *rp; |
2671 | volatile char *shbuf; | 2405 | char __iomem *shbuf; |
2672 | struct tty_struct *tty; | 2406 | struct tty_struct *tty; |
2673 | unsigned int head, tail, size; | 2407 | unsigned int head, tail, size; |
2674 | unsigned int len, stlen; | 2408 | unsigned int len, stlen; |
2675 | |||
2676 | #ifdef DEBUG | ||
2677 | printk(KERN_DEBUG "stli_read(brdp=%x,portp=%d)\n", | ||
2678 | (int) brdp, (int) portp); | ||
2679 | #endif | ||
2680 | 2409 | ||
2681 | if (test_bit(ST_RXSTOP, &portp->state)) | 2410 | if (test_bit(ST_RXSTOP, &portp->state)) |
2682 | return; | 2411 | return; |
2683 | tty = portp->tty; | 2412 | tty = portp->tty; |
2684 | if (tty == (struct tty_struct *) NULL) | 2413 | if (tty == NULL) |
2685 | return; | 2414 | return; |
2686 | 2415 | ||
2687 | rp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->rxq; | 2416 | rp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->rxq; |
2688 | head = (unsigned int) rp->head; | 2417 | head = (unsigned int) readw(&rp->head); |
2689 | if (head != ((unsigned int) rp->head)) | 2418 | if (head != ((unsigned int) readw(&rp->head))) |
2690 | head = (unsigned int) rp->head; | 2419 | head = (unsigned int) readw(&rp->head); |
2691 | tail = (unsigned int) rp->tail; | 2420 | tail = (unsigned int) readw(&rp->tail); |
2692 | size = portp->rxsize; | 2421 | size = portp->rxsize; |
2693 | if (head >= tail) { | 2422 | if (head >= tail) { |
2694 | len = head - tail; | 2423 | len = head - tail; |
@@ -2699,12 +2428,15 @@ static void stli_read(stlibrd_t *brdp, stliport_t *portp) | |||
2699 | } | 2428 | } |
2700 | 2429 | ||
2701 | len = tty_buffer_request_room(tty, len); | 2430 | len = tty_buffer_request_room(tty, len); |
2702 | /* FIXME : iomap ? */ | 2431 | |
2703 | shbuf = (volatile char *) EBRDGETMEMPTR(brdp, portp->rxoffset); | 2432 | shbuf = (char __iomem *) EBRDGETMEMPTR(brdp, portp->rxoffset); |
2704 | 2433 | ||
2705 | while (len > 0) { | 2434 | while (len > 0) { |
2435 | unsigned char *cptr; | ||
2436 | |||
2706 | stlen = MIN(len, stlen); | 2437 | stlen = MIN(len, stlen); |
2707 | tty_insert_flip_string(tty, (char *)(shbuf + tail), stlen); | 2438 | tty_prepare_flip_string(tty, &cptr, stlen); |
2439 | memcpy_fromio(cptr, shbuf + tail, stlen); | ||
2708 | len -= stlen; | 2440 | len -= stlen; |
2709 | tail += stlen; | 2441 | tail += stlen; |
2710 | if (tail >= size) { | 2442 | if (tail >= size) { |
@@ -2712,8 +2444,8 @@ static void stli_read(stlibrd_t *brdp, stliport_t *portp) | |||
2712 | stlen = head; | 2444 | stlen = head; |
2713 | } | 2445 | } |
2714 | } | 2446 | } |
2715 | rp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->rxq; | 2447 | rp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->rxq; |
2716 | rp->tail = tail; | 2448 | writew(tail, &rp->tail); |
2717 | 2449 | ||
2718 | if (head != tail) | 2450 | if (head != tail) |
2719 | set_bit(ST_RXING, &portp->state); | 2451 | set_bit(ST_RXING, &portp->state); |
@@ -2729,9 +2461,9 @@ static void stli_read(stlibrd_t *brdp, stliport_t *portp) | |||
2729 | * difficult to deal with them here. | 2461 | * difficult to deal with them here. |
2730 | */ | 2462 | */ |
2731 | 2463 | ||
2732 | static void stli_dodelaycmd(stliport_t *portp, volatile cdkctrl_t *cp) | 2464 | static void stli_dodelaycmd(stliport_t *portp, cdkctrl_t __iomem *cp) |
2733 | { | 2465 | { |
2734 | int cmd; | 2466 | int cmd; |
2735 | 2467 | ||
2736 | if (test_bit(ST_DOSIGS, &portp->state)) { | 2468 | if (test_bit(ST_DOSIGS, &portp->state)) { |
2737 | if (test_bit(ST_DOFLUSHTX, &portp->state) && | 2469 | if (test_bit(ST_DOFLUSHTX, &portp->state) && |
@@ -2746,10 +2478,10 @@ static void stli_dodelaycmd(stliport_t *portp, volatile cdkctrl_t *cp) | |||
2746 | clear_bit(ST_DOFLUSHTX, &portp->state); | 2478 | clear_bit(ST_DOFLUSHTX, &portp->state); |
2747 | clear_bit(ST_DOFLUSHRX, &portp->state); | 2479 | clear_bit(ST_DOFLUSHRX, &portp->state); |
2748 | clear_bit(ST_DOSIGS, &portp->state); | 2480 | clear_bit(ST_DOSIGS, &portp->state); |
2749 | memcpy((void *) &(cp->args[0]), (void *) &portp->asig, | 2481 | memcpy_toio((void __iomem *) &(cp->args[0]), (void *) &portp->asig, |
2750 | sizeof(asysigs_t)); | 2482 | sizeof(asysigs_t)); |
2751 | cp->status = 0; | 2483 | writel(0, &cp->status); |
2752 | cp->cmd = cmd; | 2484 | writel(cmd, &cp->cmd); |
2753 | set_bit(ST_CMDING, &portp->state); | 2485 | set_bit(ST_CMDING, &portp->state); |
2754 | } else if (test_bit(ST_DOFLUSHTX, &portp->state) || | 2486 | } else if (test_bit(ST_DOFLUSHTX, &portp->state) || |
2755 | test_bit(ST_DOFLUSHRX, &portp->state)) { | 2487 | test_bit(ST_DOFLUSHRX, &portp->state)) { |
@@ -2757,9 +2489,9 @@ static void stli_dodelaycmd(stliport_t *portp, volatile cdkctrl_t *cp) | |||
2757 | cmd |= ((test_bit(ST_DOFLUSHRX, &portp->state)) ? FLUSHRX : 0); | 2489 | cmd |= ((test_bit(ST_DOFLUSHRX, &portp->state)) ? FLUSHRX : 0); |
2758 | clear_bit(ST_DOFLUSHTX, &portp->state); | 2490 | clear_bit(ST_DOFLUSHTX, &portp->state); |
2759 | clear_bit(ST_DOFLUSHRX, &portp->state); | 2491 | clear_bit(ST_DOFLUSHRX, &portp->state); |
2760 | memcpy((void *) &(cp->args[0]), (void *) &cmd, sizeof(int)); | 2492 | memcpy_toio((void __iomem *) &(cp->args[0]), (void *) &cmd, sizeof(int)); |
2761 | cp->status = 0; | 2493 | writel(0, &cp->status); |
2762 | cp->cmd = A_FLUSH; | 2494 | writel(A_FLUSH, &cp->cmd); |
2763 | set_bit(ST_CMDING, &portp->state); | 2495 | set_bit(ST_CMDING, &portp->state); |
2764 | } | 2496 | } |
2765 | } | 2497 | } |
@@ -2779,30 +2511,25 @@ static void stli_dodelaycmd(stliport_t *portp, volatile cdkctrl_t *cp) | |||
2779 | 2511 | ||
2780 | static int stli_hostcmd(stlibrd_t *brdp, stliport_t *portp) | 2512 | static int stli_hostcmd(stlibrd_t *brdp, stliport_t *portp) |
2781 | { | 2513 | { |
2782 | volatile cdkasy_t *ap; | 2514 | cdkasy_t __iomem *ap; |
2783 | volatile cdkctrl_t *cp; | 2515 | cdkctrl_t __iomem *cp; |
2784 | struct tty_struct *tty; | 2516 | struct tty_struct *tty; |
2785 | asynotify_t nt; | 2517 | asynotify_t nt; |
2786 | unsigned long oldsigs; | 2518 | unsigned long oldsigs; |
2787 | int rc, donerx; | 2519 | int rc, donerx; |
2788 | 2520 | ||
2789 | #ifdef DEBUG | 2521 | ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr); |
2790 | printk(KERN_DEBUG "stli_hostcmd(brdp=%x,channr=%d)\n", | ||
2791 | (int) brdp, channr); | ||
2792 | #endif | ||
2793 | |||
2794 | ap = (volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr); | ||
2795 | cp = &ap->ctrl; | 2522 | cp = &ap->ctrl; |
2796 | 2523 | ||
2797 | /* | 2524 | /* |
2798 | * Check if we are waiting for an open completion message. | 2525 | * Check if we are waiting for an open completion message. |
2799 | */ | 2526 | */ |
2800 | if (test_bit(ST_OPENING, &portp->state)) { | 2527 | if (test_bit(ST_OPENING, &portp->state)) { |
2801 | rc = (int) cp->openarg; | 2528 | rc = readl(&cp->openarg); |
2802 | if ((cp->open == 0) && (rc != 0)) { | 2529 | if (readb(&cp->open) == 0 && rc != 0) { |
2803 | if (rc > 0) | 2530 | if (rc > 0) |
2804 | rc--; | 2531 | rc--; |
2805 | cp->openarg = 0; | 2532 | writel(0, &cp->openarg); |
2806 | portp->rc = rc; | 2533 | portp->rc = rc; |
2807 | clear_bit(ST_OPENING, &portp->state); | 2534 | clear_bit(ST_OPENING, &portp->state); |
2808 | wake_up_interruptible(&portp->raw_wait); | 2535 | wake_up_interruptible(&portp->raw_wait); |
@@ -2813,11 +2540,11 @@ static int stli_hostcmd(stlibrd_t *brdp, stliport_t *portp) | |||
2813 | * Check if we are waiting for a close completion message. | 2540 | * Check if we are waiting for a close completion message. |
2814 | */ | 2541 | */ |
2815 | if (test_bit(ST_CLOSING, &portp->state)) { | 2542 | if (test_bit(ST_CLOSING, &portp->state)) { |
2816 | rc = (int) cp->closearg; | 2543 | rc = (int) readl(&cp->closearg); |
2817 | if ((cp->close == 0) && (rc != 0)) { | 2544 | if (readb(&cp->close) == 0 && rc != 0) { |
2818 | if (rc > 0) | 2545 | if (rc > 0) |
2819 | rc--; | 2546 | rc--; |
2820 | cp->closearg = 0; | 2547 | writel(0, &cp->closearg); |
2821 | portp->rc = rc; | 2548 | portp->rc = rc; |
2822 | clear_bit(ST_CLOSING, &portp->state); | 2549 | clear_bit(ST_CLOSING, &portp->state); |
2823 | wake_up_interruptible(&portp->raw_wait); | 2550 | wake_up_interruptible(&portp->raw_wait); |
@@ -2829,16 +2556,16 @@ static int stli_hostcmd(stlibrd_t *brdp, stliport_t *portp) | |||
2829 | * need to copy out the command results associated with this command. | 2556 | * need to copy out the command results associated with this command. |
2830 | */ | 2557 | */ |
2831 | if (test_bit(ST_CMDING, &portp->state)) { | 2558 | if (test_bit(ST_CMDING, &portp->state)) { |
2832 | rc = cp->status; | 2559 | rc = readl(&cp->status); |
2833 | if ((cp->cmd == 0) && (rc != 0)) { | 2560 | if (readl(&cp->cmd) == 0 && rc != 0) { |
2834 | if (rc > 0) | 2561 | if (rc > 0) |
2835 | rc--; | 2562 | rc--; |
2836 | if (portp->argp != (void *) NULL) { | 2563 | if (portp->argp != NULL) { |
2837 | memcpy(portp->argp, (void *) &(cp->args[0]), | 2564 | memcpy_fromio(portp->argp, (void __iomem *) &(cp->args[0]), |
2838 | portp->argsize); | 2565 | portp->argsize); |
2839 | portp->argp = (void *) NULL; | 2566 | portp->argp = NULL; |
2840 | } | 2567 | } |
2841 | cp->status = 0; | 2568 | writel(0, &cp->status); |
2842 | portp->rc = rc; | 2569 | portp->rc = rc; |
2843 | clear_bit(ST_CMDING, &portp->state); | 2570 | clear_bit(ST_CMDING, &portp->state); |
2844 | stli_dodelaycmd(portp, cp); | 2571 | stli_dodelaycmd(portp, cp); |
@@ -2877,18 +2604,15 @@ static int stli_hostcmd(stlibrd_t *brdp, stliport_t *portp) | |||
2877 | if (nt.data & DT_TXEMPTY) | 2604 | if (nt.data & DT_TXEMPTY) |
2878 | clear_bit(ST_TXBUSY, &portp->state); | 2605 | clear_bit(ST_TXBUSY, &portp->state); |
2879 | if (nt.data & (DT_TXEMPTY | DT_TXLOW)) { | 2606 | if (nt.data & (DT_TXEMPTY | DT_TXLOW)) { |
2880 | if (tty != (struct tty_struct *) NULL) { | 2607 | if (tty != NULL) { |
2881 | if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && | 2608 | tty_wakeup(tty); |
2882 | tty->ldisc.write_wakeup) { | 2609 | EBRDENABLE(brdp); |
2883 | (tty->ldisc.write_wakeup)(tty); | ||
2884 | EBRDENABLE(brdp); | ||
2885 | } | ||
2886 | wake_up_interruptible(&tty->write_wait); | 2610 | wake_up_interruptible(&tty->write_wait); |
2887 | } | 2611 | } |
2888 | } | 2612 | } |
2889 | 2613 | ||
2890 | if ((nt.data & DT_RXBREAK) && (portp->rxmarkmsk & BRKINT)) { | 2614 | if ((nt.data & DT_RXBREAK) && (portp->rxmarkmsk & BRKINT)) { |
2891 | if (tty != (struct tty_struct *) NULL) { | 2615 | if (tty != NULL) { |
2892 | tty_insert_flip_char(tty, 0, TTY_BREAK); | 2616 | tty_insert_flip_char(tty, 0, TTY_BREAK); |
2893 | if (portp->flags & ASYNC_SAK) { | 2617 | if (portp->flags & ASYNC_SAK) { |
2894 | do_SAK(tty); | 2618 | do_SAK(tty); |
@@ -2932,14 +2656,14 @@ static int stli_hostcmd(stlibrd_t *brdp, stliport_t *portp) | |||
2932 | * at the cdk header structure. | 2656 | * at the cdk header structure. |
2933 | */ | 2657 | */ |
2934 | 2658 | ||
2935 | static void stli_brdpoll(stlibrd_t *brdp, volatile cdkhdr_t *hdrp) | 2659 | static void stli_brdpoll(stlibrd_t *brdp, cdkhdr_t __iomem *hdrp) |
2936 | { | 2660 | { |
2937 | stliport_t *portp; | 2661 | stliport_t *portp; |
2938 | unsigned char hostbits[(STL_MAXCHANS / 8) + 1]; | 2662 | unsigned char hostbits[(STL_MAXCHANS / 8) + 1]; |
2939 | unsigned char slavebits[(STL_MAXCHANS / 8) + 1]; | 2663 | unsigned char slavebits[(STL_MAXCHANS / 8) + 1]; |
2940 | unsigned char *slavep; | 2664 | unsigned char __iomem *slavep; |
2941 | int bitpos, bitat, bitsize; | 2665 | int bitpos, bitat, bitsize; |
2942 | int channr, nrdevs, slavebitchange; | 2666 | int channr, nrdevs, slavebitchange; |
2943 | 2667 | ||
2944 | bitsize = brdp->bitsize; | 2668 | bitsize = brdp->bitsize; |
2945 | nrdevs = brdp->nrdevs; | 2669 | nrdevs = brdp->nrdevs; |
@@ -2951,7 +2675,7 @@ static void stli_brdpoll(stlibrd_t *brdp, volatile cdkhdr_t *hdrp) | |||
2951 | * 8 service bits at a time in the inner loop, so we can bypass | 2675 | * 8 service bits at a time in the inner loop, so we can bypass |
2952 | * the lot if none of them want service. | 2676 | * the lot if none of them want service. |
2953 | */ | 2677 | */ |
2954 | memcpy(&hostbits[0], (((unsigned char *) hdrp) + brdp->hostoffset), | 2678 | memcpy_fromio(&hostbits[0], (((unsigned char __iomem *) hdrp) + brdp->hostoffset), |
2955 | bitsize); | 2679 | bitsize); |
2956 | 2680 | ||
2957 | memset(&slavebits[0], 0, bitsize); | 2681 | memset(&slavebits[0], 0, bitsize); |
@@ -2978,11 +2702,11 @@ static void stli_brdpoll(stlibrd_t *brdp, volatile cdkhdr_t *hdrp) | |||
2978 | * service may initiate more slave requests. | 2702 | * service may initiate more slave requests. |
2979 | */ | 2703 | */ |
2980 | if (slavebitchange) { | 2704 | if (slavebitchange) { |
2981 | hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); | 2705 | hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); |
2982 | slavep = ((unsigned char *) hdrp) + brdp->slaveoffset; | 2706 | slavep = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset; |
2983 | for (bitpos = 0; (bitpos < bitsize); bitpos++) { | 2707 | for (bitpos = 0; (bitpos < bitsize); bitpos++) { |
2984 | if (slavebits[bitpos]) | 2708 | if (readb(slavebits + bitpos)) |
2985 | slavep[bitpos] &= ~slavebits[bitpos]; | 2709 | writeb(readb(slavep + bitpos) & ~slavebits[bitpos], slavebits + bitpos); |
2986 | } | 2710 | } |
2987 | } | 2711 | } |
2988 | } | 2712 | } |
@@ -3000,9 +2724,9 @@ static void stli_brdpoll(stlibrd_t *brdp, volatile cdkhdr_t *hdrp) | |||
3000 | 2724 | ||
3001 | static void stli_poll(unsigned long arg) | 2725 | static void stli_poll(unsigned long arg) |
3002 | { | 2726 | { |
3003 | volatile cdkhdr_t *hdrp; | 2727 | cdkhdr_t __iomem *hdrp; |
3004 | stlibrd_t *brdp; | 2728 | stlibrd_t *brdp; |
3005 | int brdnr; | 2729 | int brdnr; |
3006 | 2730 | ||
3007 | stli_timerlist.expires = STLI_TIMEOUT; | 2731 | stli_timerlist.expires = STLI_TIMEOUT; |
3008 | add_timer(&stli_timerlist); | 2732 | add_timer(&stli_timerlist); |
@@ -3012,16 +2736,18 @@ static void stli_poll(unsigned long arg) | |||
3012 | */ | 2736 | */ |
3013 | for (brdnr = 0; (brdnr < stli_nrbrds); brdnr++) { | 2737 | for (brdnr = 0; (brdnr < stli_nrbrds); brdnr++) { |
3014 | brdp = stli_brds[brdnr]; | 2738 | brdp = stli_brds[brdnr]; |
3015 | if (brdp == (stlibrd_t *) NULL) | 2739 | if (brdp == NULL) |
3016 | continue; | 2740 | continue; |
3017 | if ((brdp->state & BST_STARTED) == 0) | 2741 | if ((brdp->state & BST_STARTED) == 0) |
3018 | continue; | 2742 | continue; |
3019 | 2743 | ||
2744 | spin_lock(&brd_lock); | ||
3020 | EBRDENABLE(brdp); | 2745 | EBRDENABLE(brdp); |
3021 | hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); | 2746 | hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); |
3022 | if (hdrp->hostreq) | 2747 | if (readb(&hdrp->hostreq)) |
3023 | stli_brdpoll(brdp, hdrp); | 2748 | stli_brdpoll(brdp, hdrp); |
3024 | EBRDDISABLE(brdp); | 2749 | EBRDDISABLE(brdp); |
2750 | spin_unlock(&brd_lock); | ||
3025 | } | 2751 | } |
3026 | } | 2752 | } |
3027 | 2753 | ||
@@ -3034,11 +2760,6 @@ static void stli_poll(unsigned long arg) | |||
3034 | 2760 | ||
3035 | static void stli_mkasyport(stliport_t *portp, asyport_t *pp, struct termios *tiosp) | 2761 | static void stli_mkasyport(stliport_t *portp, asyport_t *pp, struct termios *tiosp) |
3036 | { | 2762 | { |
3037 | #ifdef DEBUG | ||
3038 | printk(KERN_DEBUG "stli_mkasyport(portp=%x,pp=%x,tiosp=%d)\n", | ||
3039 | (int) portp, (int) pp, (int) tiosp); | ||
3040 | #endif | ||
3041 | |||
3042 | memset(pp, 0, sizeof(asyport_t)); | 2763 | memset(pp, 0, sizeof(asyport_t)); |
3043 | 2764 | ||
3044 | /* | 2765 | /* |
@@ -3157,11 +2878,6 @@ static void stli_mkasyport(stliport_t *portp, asyport_t *pp, struct termios *tio | |||
3157 | 2878 | ||
3158 | static void stli_mkasysigs(asysigs_t *sp, int dtr, int rts) | 2879 | static void stli_mkasysigs(asysigs_t *sp, int dtr, int rts) |
3159 | { | 2880 | { |
3160 | #ifdef DEBUG | ||
3161 | printk(KERN_DEBUG "stli_mkasysigs(sp=%x,dtr=%d,rts=%d)\n", | ||
3162 | (int) sp, dtr, rts); | ||
3163 | #endif | ||
3164 | |||
3165 | memset(sp, 0, sizeof(asysigs_t)); | 2881 | memset(sp, 0, sizeof(asysigs_t)); |
3166 | if (dtr >= 0) { | 2882 | if (dtr >= 0) { |
3167 | sp->signal |= SG_DTR; | 2883 | sp->signal |= SG_DTR; |
@@ -3182,13 +2898,7 @@ static void stli_mkasysigs(asysigs_t *sp, int dtr, int rts) | |||
3182 | 2898 | ||
3183 | static long stli_mktiocm(unsigned long sigvalue) | 2899 | static long stli_mktiocm(unsigned long sigvalue) |
3184 | { | 2900 | { |
3185 | long tiocm; | 2901 | long tiocm = 0; |
3186 | |||
3187 | #ifdef DEBUG | ||
3188 | printk(KERN_DEBUG "stli_mktiocm(sigvalue=%x)\n", (int) sigvalue); | ||
3189 | #endif | ||
3190 | |||
3191 | tiocm = 0; | ||
3192 | tiocm |= ((sigvalue & SG_DCD) ? TIOCM_CD : 0); | 2902 | tiocm |= ((sigvalue & SG_DCD) ? TIOCM_CD : 0); |
3193 | tiocm |= ((sigvalue & SG_CTS) ? TIOCM_CTS : 0); | 2903 | tiocm |= ((sigvalue & SG_CTS) ? TIOCM_CTS : 0); |
3194 | tiocm |= ((sigvalue & SG_RI) ? TIOCM_RI : 0); | 2904 | tiocm |= ((sigvalue & SG_RI) ? TIOCM_RI : 0); |
@@ -3210,10 +2920,6 @@ static int stli_initports(stlibrd_t *brdp) | |||
3210 | stliport_t *portp; | 2920 | stliport_t *portp; |
3211 | int i, panelnr, panelport; | 2921 | int i, panelnr, panelport; |
3212 | 2922 | ||
3213 | #ifdef DEBUG | ||
3214 | printk(KERN_DEBUG "stli_initports(brdp=%x)\n", (int) brdp); | ||
3215 | #endif | ||
3216 | |||
3217 | for (i = 0, panelnr = 0, panelport = 0; (i < brdp->nrports); i++) { | 2923 | for (i = 0, panelnr = 0, panelport = 0; (i < brdp->nrports); i++) { |
3218 | portp = kzalloc(sizeof(stliport_t), GFP_KERNEL); | 2924 | portp = kzalloc(sizeof(stliport_t), GFP_KERNEL); |
3219 | if (!portp) { | 2925 | if (!portp) { |
@@ -3240,7 +2946,7 @@ static int stli_initports(stlibrd_t *brdp) | |||
3240 | brdp->ports[i] = portp; | 2946 | brdp->ports[i] = portp; |
3241 | } | 2947 | } |
3242 | 2948 | ||
3243 | return(0); | 2949 | return 0; |
3244 | } | 2950 | } |
3245 | 2951 | ||
3246 | /*****************************************************************************/ | 2952 | /*****************************************************************************/ |
@@ -3253,10 +2959,6 @@ static void stli_ecpinit(stlibrd_t *brdp) | |||
3253 | { | 2959 | { |
3254 | unsigned long memconf; | 2960 | unsigned long memconf; |
3255 | 2961 | ||
3256 | #ifdef DEBUG | ||
3257 | printk(KERN_DEBUG "stli_ecpinit(brdp=%d)\n", (int) brdp); | ||
3258 | #endif | ||
3259 | |||
3260 | outb(ECP_ATSTOP, (brdp->iobase + ECP_ATCONFR)); | 2962 | outb(ECP_ATSTOP, (brdp->iobase + ECP_ATCONFR)); |
3261 | udelay(10); | 2963 | udelay(10); |
3262 | outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR)); | 2964 | outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR)); |
@@ -3270,9 +2972,6 @@ static void stli_ecpinit(stlibrd_t *brdp) | |||
3270 | 2972 | ||
3271 | static void stli_ecpenable(stlibrd_t *brdp) | 2973 | static void stli_ecpenable(stlibrd_t *brdp) |
3272 | { | 2974 | { |
3273 | #ifdef DEBUG | ||
3274 | printk(KERN_DEBUG "stli_ecpenable(brdp=%x)\n", (int) brdp); | ||
3275 | #endif | ||
3276 | outb(ECP_ATENABLE, (brdp->iobase + ECP_ATCONFR)); | 2975 | outb(ECP_ATENABLE, (brdp->iobase + ECP_ATCONFR)); |
3277 | } | 2976 | } |
3278 | 2977 | ||
@@ -3280,9 +2979,6 @@ static void stli_ecpenable(stlibrd_t *brdp) | |||
3280 | 2979 | ||
3281 | static void stli_ecpdisable(stlibrd_t *brdp) | 2980 | static void stli_ecpdisable(stlibrd_t *brdp) |
3282 | { | 2981 | { |
3283 | #ifdef DEBUG | ||
3284 | printk(KERN_DEBUG "stli_ecpdisable(brdp=%x)\n", (int) brdp); | ||
3285 | #endif | ||
3286 | outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR)); | 2982 | outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR)); |
3287 | } | 2983 | } |
3288 | 2984 | ||
@@ -3290,13 +2986,8 @@ static void stli_ecpdisable(stlibrd_t *brdp) | |||
3290 | 2986 | ||
3291 | static char *stli_ecpgetmemptr(stlibrd_t *brdp, unsigned long offset, int line) | 2987 | static char *stli_ecpgetmemptr(stlibrd_t *brdp, unsigned long offset, int line) |
3292 | { | 2988 | { |
3293 | void *ptr; | 2989 | void *ptr; |
3294 | unsigned char val; | 2990 | unsigned char val; |
3295 | |||
3296 | #ifdef DEBUG | ||
3297 | printk(KERN_DEBUG "stli_ecpgetmemptr(brdp=%x,offset=%x)\n", (int) brdp, | ||
3298 | (int) offset); | ||
3299 | #endif | ||
3300 | 2991 | ||
3301 | if (offset > brdp->memsize) { | 2992 | if (offset > brdp->memsize) { |
3302 | printk(KERN_ERR "STALLION: shared memory pointer=%x out of " | 2993 | printk(KERN_ERR "STALLION: shared memory pointer=%x out of " |
@@ -3316,10 +3007,6 @@ static char *stli_ecpgetmemptr(stlibrd_t *brdp, unsigned long offset, int line) | |||
3316 | 3007 | ||
3317 | static void stli_ecpreset(stlibrd_t *brdp) | 3008 | static void stli_ecpreset(stlibrd_t *brdp) |
3318 | { | 3009 | { |
3319 | #ifdef DEBUG | ||
3320 | printk(KERN_DEBUG "stli_ecpreset(brdp=%x)\n", (int) brdp); | ||
3321 | #endif | ||
3322 | |||
3323 | outb(ECP_ATSTOP, (brdp->iobase + ECP_ATCONFR)); | 3010 | outb(ECP_ATSTOP, (brdp->iobase + ECP_ATCONFR)); |
3324 | udelay(10); | 3011 | udelay(10); |
3325 | outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR)); | 3012 | outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR)); |
@@ -3330,9 +3017,6 @@ static void stli_ecpreset(stlibrd_t *brdp) | |||
3330 | 3017 | ||
3331 | static void stli_ecpintr(stlibrd_t *brdp) | 3018 | static void stli_ecpintr(stlibrd_t *brdp) |
3332 | { | 3019 | { |
3333 | #ifdef DEBUG | ||
3334 | printk(KERN_DEBUG "stli_ecpintr(brdp=%x)\n", (int) brdp); | ||
3335 | #endif | ||
3336 | outb(0x1, brdp->iobase); | 3020 | outb(0x1, brdp->iobase); |
3337 | } | 3021 | } |
3338 | 3022 | ||
@@ -3346,10 +3030,6 @@ static void stli_ecpeiinit(stlibrd_t *brdp) | |||
3346 | { | 3030 | { |
3347 | unsigned long memconf; | 3031 | unsigned long memconf; |
3348 | 3032 | ||
3349 | #ifdef DEBUG | ||
3350 | printk(KERN_DEBUG "stli_ecpeiinit(brdp=%x)\n", (int) brdp); | ||
3351 | #endif | ||
3352 | |||
3353 | outb(0x1, (brdp->iobase + ECP_EIBRDENAB)); | 3033 | outb(0x1, (brdp->iobase + ECP_EIBRDENAB)); |
3354 | outb(ECP_EISTOP, (brdp->iobase + ECP_EICONFR)); | 3034 | outb(ECP_EISTOP, (brdp->iobase + ECP_EICONFR)); |
3355 | udelay(10); | 3035 | udelay(10); |
@@ -3383,11 +3063,6 @@ static char *stli_ecpeigetmemptr(stlibrd_t *brdp, unsigned long offset, int line | |||
3383 | void *ptr; | 3063 | void *ptr; |
3384 | unsigned char val; | 3064 | unsigned char val; |
3385 | 3065 | ||
3386 | #ifdef DEBUG | ||
3387 | printk(KERN_DEBUG "stli_ecpeigetmemptr(brdp=%x,offset=%x,line=%d)\n", | ||
3388 | (int) brdp, (int) offset, line); | ||
3389 | #endif | ||
3390 | |||
3391 | if (offset > brdp->memsize) { | 3066 | if (offset > brdp->memsize) { |
3392 | printk(KERN_ERR "STALLION: shared memory pointer=%x out of " | 3067 | printk(KERN_ERR "STALLION: shared memory pointer=%x out of " |
3393 | "range at line=%d(%d), brd=%d\n", | 3068 | "range at line=%d(%d), brd=%d\n", |
@@ -3437,8 +3112,8 @@ static void stli_ecpmcdisable(stlibrd_t *brdp) | |||
3437 | 3112 | ||
3438 | static char *stli_ecpmcgetmemptr(stlibrd_t *brdp, unsigned long offset, int line) | 3113 | static char *stli_ecpmcgetmemptr(stlibrd_t *brdp, unsigned long offset, int line) |
3439 | { | 3114 | { |
3440 | void *ptr; | 3115 | void *ptr; |
3441 | unsigned char val; | 3116 | unsigned char val; |
3442 | 3117 | ||
3443 | if (offset > brdp->memsize) { | 3118 | if (offset > brdp->memsize) { |
3444 | printk(KERN_ERR "STALLION: shared memory pointer=%x out of " | 3119 | printk(KERN_ERR "STALLION: shared memory pointer=%x out of " |
@@ -3472,10 +3147,6 @@ static void stli_ecpmcreset(stlibrd_t *brdp) | |||
3472 | 3147 | ||
3473 | static void stli_ecppciinit(stlibrd_t *brdp) | 3148 | static void stli_ecppciinit(stlibrd_t *brdp) |
3474 | { | 3149 | { |
3475 | #ifdef DEBUG | ||
3476 | printk(KERN_DEBUG "stli_ecppciinit(brdp=%x)\n", (int) brdp); | ||
3477 | #endif | ||
3478 | |||
3479 | outb(ECP_PCISTOP, (brdp->iobase + ECP_PCICONFR)); | 3150 | outb(ECP_PCISTOP, (brdp->iobase + ECP_PCICONFR)); |
3480 | udelay(10); | 3151 | udelay(10); |
3481 | outb(0, (brdp->iobase + ECP_PCICONFR)); | 3152 | outb(0, (brdp->iobase + ECP_PCICONFR)); |
@@ -3489,11 +3160,6 @@ static char *stli_ecppcigetmemptr(stlibrd_t *brdp, unsigned long offset, int lin | |||
3489 | void *ptr; | 3160 | void *ptr; |
3490 | unsigned char val; | 3161 | unsigned char val; |
3491 | 3162 | ||
3492 | #ifdef DEBUG | ||
3493 | printk(KERN_DEBUG "stli_ecppcigetmemptr(brdp=%x,offset=%x,line=%d)\n", | ||
3494 | (int) brdp, (int) offset, line); | ||
3495 | #endif | ||
3496 | |||
3497 | if (offset > brdp->memsize) { | 3163 | if (offset > brdp->memsize) { |
3498 | printk(KERN_ERR "STALLION: shared memory pointer=%x out of " | 3164 | printk(KERN_ERR "STALLION: shared memory pointer=%x out of " |
3499 | "range at line=%d(%d), board=%d\n", | 3165 | "range at line=%d(%d), board=%d\n", |
@@ -3528,10 +3194,6 @@ static void stli_onbinit(stlibrd_t *brdp) | |||
3528 | { | 3194 | { |
3529 | unsigned long memconf; | 3195 | unsigned long memconf; |
3530 | 3196 | ||
3531 | #ifdef DEBUG | ||
3532 | printk(KERN_DEBUG "stli_onbinit(brdp=%d)\n", (int) brdp); | ||
3533 | #endif | ||
3534 | |||
3535 | outb(ONB_ATSTOP, (brdp->iobase + ONB_ATCONFR)); | 3197 | outb(ONB_ATSTOP, (brdp->iobase + ONB_ATCONFR)); |
3536 | udelay(10); | 3198 | udelay(10); |
3537 | outb(ONB_ATDISABLE, (brdp->iobase + ONB_ATCONFR)); | 3199 | outb(ONB_ATDISABLE, (brdp->iobase + ONB_ATCONFR)); |
@@ -3547,9 +3209,6 @@ static void stli_onbinit(stlibrd_t *brdp) | |||
3547 | 3209 | ||
3548 | static void stli_onbenable(stlibrd_t *brdp) | 3210 | static void stli_onbenable(stlibrd_t *brdp) |
3549 | { | 3211 | { |
3550 | #ifdef DEBUG | ||
3551 | printk(KERN_DEBUG "stli_onbenable(brdp=%x)\n", (int) brdp); | ||
3552 | #endif | ||
3553 | outb((brdp->enabval | ONB_ATENABLE), (brdp->iobase + ONB_ATCONFR)); | 3212 | outb((brdp->enabval | ONB_ATENABLE), (brdp->iobase + ONB_ATCONFR)); |
3554 | } | 3213 | } |
3555 | 3214 | ||
@@ -3557,9 +3216,6 @@ static void stli_onbenable(stlibrd_t *brdp) | |||
3557 | 3216 | ||
3558 | static void stli_onbdisable(stlibrd_t *brdp) | 3217 | static void stli_onbdisable(stlibrd_t *brdp) |
3559 | { | 3218 | { |
3560 | #ifdef DEBUG | ||
3561 | printk(KERN_DEBUG "stli_onbdisable(brdp=%x)\n", (int) brdp); | ||
3562 | #endif | ||
3563 | outb((brdp->enabval | ONB_ATDISABLE), (brdp->iobase + ONB_ATCONFR)); | 3219 | outb((brdp->enabval | ONB_ATDISABLE), (brdp->iobase + ONB_ATCONFR)); |
3564 | } | 3220 | } |
3565 | 3221 | ||
@@ -3569,11 +3225,6 @@ static char *stli_onbgetmemptr(stlibrd_t *brdp, unsigned long offset, int line) | |||
3569 | { | 3225 | { |
3570 | void *ptr; | 3226 | void *ptr; |
3571 | 3227 | ||
3572 | #ifdef DEBUG | ||
3573 | printk(KERN_DEBUG "stli_onbgetmemptr(brdp=%x,offset=%x)\n", (int) brdp, | ||
3574 | (int) offset); | ||
3575 | #endif | ||
3576 | |||
3577 | if (offset > brdp->memsize) { | 3228 | if (offset > brdp->memsize) { |
3578 | printk(KERN_ERR "STALLION: shared memory pointer=%x out of " | 3229 | printk(KERN_ERR "STALLION: shared memory pointer=%x out of " |
3579 | "range at line=%d(%d), brd=%d\n", | 3230 | "range at line=%d(%d), brd=%d\n", |
@@ -3589,11 +3240,6 @@ static char *stli_onbgetmemptr(stlibrd_t *brdp, unsigned long offset, int line) | |||
3589 | 3240 | ||
3590 | static void stli_onbreset(stlibrd_t *brdp) | 3241 | static void stli_onbreset(stlibrd_t *brdp) |
3591 | { | 3242 | { |
3592 | |||
3593 | #ifdef DEBUG | ||
3594 | printk(KERN_DEBUG "stli_onbreset(brdp=%x)\n", (int) brdp); | ||
3595 | #endif | ||
3596 | |||
3597 | outb(ONB_ATSTOP, (brdp->iobase + ONB_ATCONFR)); | 3243 | outb(ONB_ATSTOP, (brdp->iobase + ONB_ATCONFR)); |
3598 | udelay(10); | 3244 | udelay(10); |
3599 | outb(ONB_ATDISABLE, (brdp->iobase + ONB_ATCONFR)); | 3245 | outb(ONB_ATDISABLE, (brdp->iobase + ONB_ATCONFR)); |
@@ -3610,10 +3256,6 @@ static void stli_onbeinit(stlibrd_t *brdp) | |||
3610 | { | 3256 | { |
3611 | unsigned long memconf; | 3257 | unsigned long memconf; |
3612 | 3258 | ||
3613 | #ifdef DEBUG | ||
3614 | printk(KERN_DEBUG "stli_onbeinit(brdp=%d)\n", (int) brdp); | ||
3615 | #endif | ||
3616 | |||
3617 | outb(0x1, (brdp->iobase + ONB_EIBRDENAB)); | 3259 | outb(0x1, (brdp->iobase + ONB_EIBRDENAB)); |
3618 | outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR)); | 3260 | outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR)); |
3619 | udelay(10); | 3261 | udelay(10); |
@@ -3632,9 +3274,6 @@ static void stli_onbeinit(stlibrd_t *brdp) | |||
3632 | 3274 | ||
3633 | static void stli_onbeenable(stlibrd_t *brdp) | 3275 | static void stli_onbeenable(stlibrd_t *brdp) |
3634 | { | 3276 | { |
3635 | #ifdef DEBUG | ||
3636 | printk(KERN_DEBUG "stli_onbeenable(brdp=%x)\n", (int) brdp); | ||
3637 | #endif | ||
3638 | outb(ONB_EIENABLE, (brdp->iobase + ONB_EICONFR)); | 3277 | outb(ONB_EIENABLE, (brdp->iobase + ONB_EICONFR)); |
3639 | } | 3278 | } |
3640 | 3279 | ||
@@ -3642,9 +3281,6 @@ static void stli_onbeenable(stlibrd_t *brdp) | |||
3642 | 3281 | ||
3643 | static void stli_onbedisable(stlibrd_t *brdp) | 3282 | static void stli_onbedisable(stlibrd_t *brdp) |
3644 | { | 3283 | { |
3645 | #ifdef DEBUG | ||
3646 | printk(KERN_DEBUG "stli_onbedisable(brdp=%x)\n", (int) brdp); | ||
3647 | #endif | ||
3648 | outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR)); | 3284 | outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR)); |
3649 | } | 3285 | } |
3650 | 3286 | ||
@@ -3652,13 +3288,8 @@ static void stli_onbedisable(stlibrd_t *brdp) | |||
3652 | 3288 | ||
3653 | static char *stli_onbegetmemptr(stlibrd_t *brdp, unsigned long offset, int line) | 3289 | static char *stli_onbegetmemptr(stlibrd_t *brdp, unsigned long offset, int line) |
3654 | { | 3290 | { |
3655 | void *ptr; | 3291 | void *ptr; |
3656 | unsigned char val; | 3292 | unsigned char val; |
3657 | |||
3658 | #ifdef DEBUG | ||
3659 | printk(KERN_DEBUG "stli_onbegetmemptr(brdp=%x,offset=%x,line=%d)\n", | ||
3660 | (int) brdp, (int) offset, line); | ||
3661 | #endif | ||
3662 | 3293 | ||
3663 | if (offset > brdp->memsize) { | 3294 | if (offset > brdp->memsize) { |
3664 | printk(KERN_ERR "STALLION: shared memory pointer=%x out of " | 3295 | printk(KERN_ERR "STALLION: shared memory pointer=%x out of " |
@@ -3681,11 +3312,6 @@ static char *stli_onbegetmemptr(stlibrd_t *brdp, unsigned long offset, int line) | |||
3681 | 3312 | ||
3682 | static void stli_onbereset(stlibrd_t *brdp) | 3313 | static void stli_onbereset(stlibrd_t *brdp) |
3683 | { | 3314 | { |
3684 | |||
3685 | #ifdef DEBUG | ||
3686 | printk(KERN_ERR "stli_onbereset(brdp=%x)\n", (int) brdp); | ||
3687 | #endif | ||
3688 | |||
3689 | outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR)); | 3315 | outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR)); |
3690 | udelay(10); | 3316 | udelay(10); |
3691 | outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR)); | 3317 | outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR)); |
@@ -3700,11 +3326,6 @@ static void stli_onbereset(stlibrd_t *brdp) | |||
3700 | 3326 | ||
3701 | static void stli_bbyinit(stlibrd_t *brdp) | 3327 | static void stli_bbyinit(stlibrd_t *brdp) |
3702 | { | 3328 | { |
3703 | |||
3704 | #ifdef DEBUG | ||
3705 | printk(KERN_ERR "stli_bbyinit(brdp=%d)\n", (int) brdp); | ||
3706 | #endif | ||
3707 | |||
3708 | outb(BBY_ATSTOP, (brdp->iobase + BBY_ATCONFR)); | 3329 | outb(BBY_ATSTOP, (brdp->iobase + BBY_ATCONFR)); |
3709 | udelay(10); | 3330 | udelay(10); |
3710 | outb(0, (brdp->iobase + BBY_ATCONFR)); | 3331 | outb(0, (brdp->iobase + BBY_ATCONFR)); |
@@ -3717,24 +3338,13 @@ static void stli_bbyinit(stlibrd_t *brdp) | |||
3717 | 3338 | ||
3718 | static char *stli_bbygetmemptr(stlibrd_t *brdp, unsigned long offset, int line) | 3339 | static char *stli_bbygetmemptr(stlibrd_t *brdp, unsigned long offset, int line) |
3719 | { | 3340 | { |
3720 | void *ptr; | 3341 | void *ptr; |
3721 | unsigned char val; | 3342 | unsigned char val; |
3722 | 3343 | ||
3723 | #ifdef DEBUG | 3344 | BUG_ON(offset > brdp->memsize); |
3724 | printk(KERN_ERR "stli_bbygetmemptr(brdp=%x,offset=%x)\n", (int) brdp, | ||
3725 | (int) offset); | ||
3726 | #endif | ||
3727 | 3345 | ||
3728 | if (offset > brdp->memsize) { | 3346 | ptr = brdp->membase + (offset % BBY_PAGESIZE); |
3729 | printk(KERN_ERR "STALLION: shared memory pointer=%x out of " | 3347 | val = (unsigned char) (offset / BBY_PAGESIZE); |
3730 | "range at line=%d(%d), brd=%d\n", | ||
3731 | (int) offset, line, __LINE__, brdp->brdnr); | ||
3732 | ptr = NULL; | ||
3733 | val = 0; | ||
3734 | } else { | ||
3735 | ptr = brdp->membase + (offset % BBY_PAGESIZE); | ||
3736 | val = (unsigned char) (offset / BBY_PAGESIZE); | ||
3737 | } | ||
3738 | outb(val, (brdp->iobase + BBY_ATCONFR)); | 3348 | outb(val, (brdp->iobase + BBY_ATCONFR)); |
3739 | return(ptr); | 3349 | return(ptr); |
3740 | } | 3350 | } |
@@ -3743,11 +3353,6 @@ static char *stli_bbygetmemptr(stlibrd_t *brdp, unsigned long offset, int line) | |||
3743 | 3353 | ||
3744 | static void stli_bbyreset(stlibrd_t *brdp) | 3354 | static void stli_bbyreset(stlibrd_t *brdp) |
3745 | { | 3355 | { |
3746 | |||
3747 | #ifdef DEBUG | ||
3748 | printk(KERN_DEBUG "stli_bbyreset(brdp=%x)\n", (int) brdp); | ||
3749 | #endif | ||
3750 | |||
3751 | outb(BBY_ATSTOP, (brdp->iobase + BBY_ATCONFR)); | 3356 | outb(BBY_ATSTOP, (brdp->iobase + BBY_ATCONFR)); |
3752 | udelay(10); | 3357 | udelay(10); |
3753 | outb(0, (brdp->iobase + BBY_ATCONFR)); | 3358 | outb(0, (brdp->iobase + BBY_ATCONFR)); |
@@ -3762,11 +3367,6 @@ static void stli_bbyreset(stlibrd_t *brdp) | |||
3762 | 3367 | ||
3763 | static void stli_stalinit(stlibrd_t *brdp) | 3368 | static void stli_stalinit(stlibrd_t *brdp) |
3764 | { | 3369 | { |
3765 | |||
3766 | #ifdef DEBUG | ||
3767 | printk(KERN_DEBUG "stli_stalinit(brdp=%d)\n", (int) brdp); | ||
3768 | #endif | ||
3769 | |||
3770 | outb(0x1, brdp->iobase); | 3370 | outb(0x1, brdp->iobase); |
3771 | mdelay(1000); | 3371 | mdelay(1000); |
3772 | } | 3372 | } |
@@ -3775,36 +3375,18 @@ static void stli_stalinit(stlibrd_t *brdp) | |||
3775 | 3375 | ||
3776 | static char *stli_stalgetmemptr(stlibrd_t *brdp, unsigned long offset, int line) | 3376 | static char *stli_stalgetmemptr(stlibrd_t *brdp, unsigned long offset, int line) |
3777 | { | 3377 | { |
3778 | void *ptr; | 3378 | BUG_ON(offset > brdp->memsize); |
3779 | 3379 | return brdp->membase + (offset % STAL_PAGESIZE); | |
3780 | #ifdef DEBUG | ||
3781 | printk(KERN_DEBUG "stli_stalgetmemptr(brdp=%x,offset=%x)\n", (int) brdp, | ||
3782 | (int) offset); | ||
3783 | #endif | ||
3784 | |||
3785 | if (offset > brdp->memsize) { | ||
3786 | printk(KERN_ERR "STALLION: shared memory pointer=%x out of " | ||
3787 | "range at line=%d(%d), brd=%d\n", | ||
3788 | (int) offset, line, __LINE__, brdp->brdnr); | ||
3789 | ptr = NULL; | ||
3790 | } else { | ||
3791 | ptr = brdp->membase + (offset % STAL_PAGESIZE); | ||
3792 | } | ||
3793 | return(ptr); | ||
3794 | } | 3380 | } |
3795 | 3381 | ||
3796 | /*****************************************************************************/ | 3382 | /*****************************************************************************/ |
3797 | 3383 | ||
3798 | static void stli_stalreset(stlibrd_t *brdp) | 3384 | static void stli_stalreset(stlibrd_t *brdp) |
3799 | { | 3385 | { |
3800 | volatile unsigned long *vecp; | 3386 | u32 __iomem *vecp; |
3801 | |||
3802 | #ifdef DEBUG | ||
3803 | printk(KERN_DEBUG "stli_stalreset(brdp=%x)\n", (int) brdp); | ||
3804 | #endif | ||
3805 | 3387 | ||
3806 | vecp = (volatile unsigned long *) (brdp->membase + 0x30); | 3388 | vecp = (u32 __iomem *) (brdp->membase + 0x30); |
3807 | *vecp = 0xffff0000; | 3389 | writel(0xffff0000, vecp); |
3808 | outb(0, brdp->iobase); | 3390 | outb(0, brdp->iobase); |
3809 | mdelay(1000); | 3391 | mdelay(1000); |
3810 | } | 3392 | } |
@@ -3818,15 +3400,11 @@ static void stli_stalreset(stlibrd_t *brdp) | |||
3818 | 3400 | ||
3819 | static int stli_initecp(stlibrd_t *brdp) | 3401 | static int stli_initecp(stlibrd_t *brdp) |
3820 | { | 3402 | { |
3821 | cdkecpsig_t sig; | 3403 | cdkecpsig_t sig; |
3822 | cdkecpsig_t *sigsp; | 3404 | cdkecpsig_t __iomem *sigsp; |
3823 | unsigned int status, nxtid; | 3405 | unsigned int status, nxtid; |
3824 | char *name; | 3406 | char *name; |
3825 | int panelnr, nrports; | 3407 | int panelnr, nrports; |
3826 | |||
3827 | #ifdef DEBUG | ||
3828 | printk(KERN_DEBUG "stli_initecp(brdp=%x)\n", (int) brdp); | ||
3829 | #endif | ||
3830 | 3408 | ||
3831 | if (!request_region(brdp->iobase, brdp->iosize, "istallion")) | 3409 | if (!request_region(brdp->iobase, brdp->iosize, "istallion")) |
3832 | return -EIO; | 3410 | return -EIO; |
@@ -3834,7 +3412,7 @@ static int stli_initecp(stlibrd_t *brdp) | |||
3834 | if ((brdp->iobase == 0) || (brdp->memaddr == 0)) | 3412 | if ((brdp->iobase == 0) || (brdp->memaddr == 0)) |
3835 | { | 3413 | { |
3836 | release_region(brdp->iobase, brdp->iosize); | 3414 | release_region(brdp->iobase, brdp->iosize); |
3837 | return(-ENODEV); | 3415 | return -ENODEV; |
3838 | } | 3416 | } |
3839 | 3417 | ||
3840 | brdp->iosize = ECP_IOSIZE; | 3418 | brdp->iosize = ECP_IOSIZE; |
@@ -3903,7 +3481,7 @@ static int stli_initecp(stlibrd_t *brdp) | |||
3903 | 3481 | ||
3904 | default: | 3482 | default: |
3905 | release_region(brdp->iobase, brdp->iosize); | 3483 | release_region(brdp->iobase, brdp->iosize); |
3906 | return(-EINVAL); | 3484 | return -EINVAL; |
3907 | } | 3485 | } |
3908 | 3486 | ||
3909 | /* | 3487 | /* |
@@ -3915,10 +3493,10 @@ static int stli_initecp(stlibrd_t *brdp) | |||
3915 | EBRDINIT(brdp); | 3493 | EBRDINIT(brdp); |
3916 | 3494 | ||
3917 | brdp->membase = ioremap(brdp->memaddr, brdp->memsize); | 3495 | brdp->membase = ioremap(brdp->memaddr, brdp->memsize); |
3918 | if (brdp->membase == (void *) NULL) | 3496 | if (brdp->membase == NULL) |
3919 | { | 3497 | { |
3920 | release_region(brdp->iobase, brdp->iosize); | 3498 | release_region(brdp->iobase, brdp->iosize); |
3921 | return(-ENOMEM); | 3499 | return -ENOMEM; |
3922 | } | 3500 | } |
3923 | 3501 | ||
3924 | /* | 3502 | /* |
@@ -3927,23 +3505,14 @@ static int stli_initecp(stlibrd_t *brdp) | |||
3927 | * this is, and what it is connected to it. | 3505 | * this is, and what it is connected to it. |
3928 | */ | 3506 | */ |
3929 | EBRDENABLE(brdp); | 3507 | EBRDENABLE(brdp); |
3930 | sigsp = (cdkecpsig_t *) EBRDGETMEMPTR(brdp, CDK_SIGADDR); | 3508 | sigsp = (cdkecpsig_t __iomem *) EBRDGETMEMPTR(brdp, CDK_SIGADDR); |
3931 | memcpy(&sig, sigsp, sizeof(cdkecpsig_t)); | 3509 | memcpy(&sig, sigsp, sizeof(cdkecpsig_t)); |
3932 | EBRDDISABLE(brdp); | 3510 | EBRDDISABLE(brdp); |
3933 | 3511 | ||
3934 | #if 0 | 3512 | if (sig.magic != cpu_to_le32(ECP_MAGIC)) |
3935 | printk("%s(%d): sig-> magic=%x rom=%x panel=%x,%x,%x,%x,%x,%x,%x,%x\n", | ||
3936 | __FILE__, __LINE__, (int) sig.magic, sig.romver, sig.panelid[0], | ||
3937 | (int) sig.panelid[1], (int) sig.panelid[2], | ||
3938 | (int) sig.panelid[3], (int) sig.panelid[4], | ||
3939 | (int) sig.panelid[5], (int) sig.panelid[6], | ||
3940 | (int) sig.panelid[7]); | ||
3941 | #endif | ||
3942 | |||
3943 | if (sig.magic != ECP_MAGIC) | ||
3944 | { | 3513 | { |
3945 | release_region(brdp->iobase, brdp->iosize); | 3514 | release_region(brdp->iobase, brdp->iosize); |
3946 | return(-ENODEV); | 3515 | return -ENODEV; |
3947 | } | 3516 | } |
3948 | 3517 | ||
3949 | /* | 3518 | /* |
@@ -3967,7 +3536,7 @@ static int stli_initecp(stlibrd_t *brdp) | |||
3967 | 3536 | ||
3968 | 3537 | ||
3969 | brdp->state |= BST_FOUND; | 3538 | brdp->state |= BST_FOUND; |
3970 | return(0); | 3539 | return 0; |
3971 | } | 3540 | } |
3972 | 3541 | ||
3973 | /*****************************************************************************/ | 3542 | /*****************************************************************************/ |
@@ -3979,20 +3548,16 @@ static int stli_initecp(stlibrd_t *brdp) | |||
3979 | 3548 | ||
3980 | static int stli_initonb(stlibrd_t *brdp) | 3549 | static int stli_initonb(stlibrd_t *brdp) |
3981 | { | 3550 | { |
3982 | cdkonbsig_t sig; | 3551 | cdkonbsig_t sig; |
3983 | cdkonbsig_t *sigsp; | 3552 | cdkonbsig_t __iomem *sigsp; |
3984 | char *name; | 3553 | char *name; |
3985 | int i; | 3554 | int i; |
3986 | |||
3987 | #ifdef DEBUG | ||
3988 | printk(KERN_DEBUG "stli_initonb(brdp=%x)\n", (int) brdp); | ||
3989 | #endif | ||
3990 | 3555 | ||
3991 | /* | 3556 | /* |
3992 | * Do a basic sanity check on the IO and memory addresses. | 3557 | * Do a basic sanity check on the IO and memory addresses. |
3993 | */ | 3558 | */ |
3994 | if ((brdp->iobase == 0) || (brdp->memaddr == 0)) | 3559 | if (brdp->iobase == 0 || brdp->memaddr == 0) |
3995 | return(-ENODEV); | 3560 | return -ENODEV; |
3996 | 3561 | ||
3997 | brdp->iosize = ONB_IOSIZE; | 3562 | brdp->iosize = ONB_IOSIZE; |
3998 | 3563 | ||
@@ -4010,7 +3575,6 @@ static int stli_initonb(stlibrd_t *brdp) | |||
4010 | case BRD_ONBOARD2: | 3575 | case BRD_ONBOARD2: |
4011 | case BRD_ONBOARD2_32: | 3576 | case BRD_ONBOARD2_32: |
4012 | case BRD_ONBOARDRS: | 3577 | case BRD_ONBOARDRS: |
4013 | brdp->membase = (void *) brdp->memaddr; | ||
4014 | brdp->memsize = ONB_MEMSIZE; | 3578 | brdp->memsize = ONB_MEMSIZE; |
4015 | brdp->pagesize = ONB_ATPAGESIZE; | 3579 | brdp->pagesize = ONB_ATPAGESIZE; |
4016 | brdp->init = stli_onbinit; | 3580 | brdp->init = stli_onbinit; |
@@ -4028,7 +3592,6 @@ static int stli_initonb(stlibrd_t *brdp) | |||
4028 | break; | 3592 | break; |
4029 | 3593 | ||
4030 | case BRD_ONBOARDE: | 3594 | case BRD_ONBOARDE: |
4031 | brdp->membase = (void *) brdp->memaddr; | ||
4032 | brdp->memsize = ONB_EIMEMSIZE; | 3595 | brdp->memsize = ONB_EIMEMSIZE; |
4033 | brdp->pagesize = ONB_EIPAGESIZE; | 3596 | brdp->pagesize = ONB_EIPAGESIZE; |
4034 | brdp->init = stli_onbeinit; | 3597 | brdp->init = stli_onbeinit; |
@@ -4044,7 +3607,6 @@ static int stli_initonb(stlibrd_t *brdp) | |||
4044 | case BRD_BRUMBY4: | 3607 | case BRD_BRUMBY4: |
4045 | case BRD_BRUMBY8: | 3608 | case BRD_BRUMBY8: |
4046 | case BRD_BRUMBY16: | 3609 | case BRD_BRUMBY16: |
4047 | brdp->membase = (void *) brdp->memaddr; | ||
4048 | brdp->memsize = BBY_MEMSIZE; | 3610 | brdp->memsize = BBY_MEMSIZE; |
4049 | brdp->pagesize = BBY_PAGESIZE; | 3611 | brdp->pagesize = BBY_PAGESIZE; |
4050 | brdp->init = stli_bbyinit; | 3612 | brdp->init = stli_bbyinit; |
@@ -4058,7 +3620,6 @@ static int stli_initonb(stlibrd_t *brdp) | |||
4058 | break; | 3620 | break; |
4059 | 3621 | ||
4060 | case BRD_STALLION: | 3622 | case BRD_STALLION: |
4061 | brdp->membase = (void *) brdp->memaddr; | ||
4062 | brdp->memsize = STAL_MEMSIZE; | 3623 | brdp->memsize = STAL_MEMSIZE; |
4063 | brdp->pagesize = STAL_PAGESIZE; | 3624 | brdp->pagesize = STAL_PAGESIZE; |
4064 | brdp->init = stli_stalinit; | 3625 | brdp->init = stli_stalinit; |
@@ -4073,7 +3634,7 @@ static int stli_initonb(stlibrd_t *brdp) | |||
4073 | 3634 | ||
4074 | default: | 3635 | default: |
4075 | release_region(brdp->iobase, brdp->iosize); | 3636 | release_region(brdp->iobase, brdp->iosize); |
4076 | return(-EINVAL); | 3637 | return -EINVAL; |
4077 | } | 3638 | } |
4078 | 3639 | ||
4079 | /* | 3640 | /* |
@@ -4085,10 +3646,10 @@ static int stli_initonb(stlibrd_t *brdp) | |||
4085 | EBRDINIT(brdp); | 3646 | EBRDINIT(brdp); |
4086 | 3647 | ||
4087 | brdp->membase = ioremap(brdp->memaddr, brdp->memsize); | 3648 | brdp->membase = ioremap(brdp->memaddr, brdp->memsize); |
4088 | if (brdp->membase == (void *) NULL) | 3649 | if (brdp->membase == NULL) |
4089 | { | 3650 | { |
4090 | release_region(brdp->iobase, brdp->iosize); | 3651 | release_region(brdp->iobase, brdp->iosize); |
4091 | return(-ENOMEM); | 3652 | return -ENOMEM; |
4092 | } | 3653 | } |
4093 | 3654 | ||
4094 | /* | 3655 | /* |
@@ -4097,21 +3658,17 @@ static int stli_initonb(stlibrd_t *brdp) | |||
4097 | * this is, and how many ports. | 3658 | * this is, and how many ports. |
4098 | */ | 3659 | */ |
4099 | EBRDENABLE(brdp); | 3660 | EBRDENABLE(brdp); |
4100 | sigsp = (cdkonbsig_t *) EBRDGETMEMPTR(brdp, CDK_SIGADDR); | 3661 | sigsp = (cdkonbsig_t __iomem *) EBRDGETMEMPTR(brdp, CDK_SIGADDR); |
4101 | memcpy(&sig, sigsp, sizeof(cdkonbsig_t)); | 3662 | memcpy_fromio(&sig, sigsp, sizeof(cdkonbsig_t)); |
4102 | EBRDDISABLE(brdp); | 3663 | EBRDDISABLE(brdp); |
4103 | 3664 | ||
4104 | #if 0 | 3665 | if (sig.magic0 != cpu_to_le16(ONB_MAGIC0) || |
4105 | printk("%s(%d): sig-> magic=%x:%x:%x:%x romver=%x amask=%x:%x:%x\n", | 3666 | sig.magic1 != cpu_to_le16(ONB_MAGIC1) || |
4106 | __FILE__, __LINE__, sig.magic0, sig.magic1, sig.magic2, | 3667 | sig.magic2 != cpu_to_le16(ONB_MAGIC2) || |
4107 | sig.magic3, sig.romver, sig.amask0, sig.amask1, sig.amask2); | 3668 | sig.magic3 != cpu_to_le16(ONB_MAGIC3)) |
4108 | #endif | ||
4109 | |||
4110 | if ((sig.magic0 != ONB_MAGIC0) || (sig.magic1 != ONB_MAGIC1) || | ||
4111 | (sig.magic2 != ONB_MAGIC2) || (sig.magic3 != ONB_MAGIC3)) | ||
4112 | { | 3669 | { |
4113 | release_region(brdp->iobase, brdp->iosize); | 3670 | release_region(brdp->iobase, brdp->iosize); |
4114 | return(-ENODEV); | 3671 | return -ENODEV; |
4115 | } | 3672 | } |
4116 | 3673 | ||
4117 | /* | 3674 | /* |
@@ -4132,7 +3689,7 @@ static int stli_initonb(stlibrd_t *brdp) | |||
4132 | 3689 | ||
4133 | 3690 | ||
4134 | brdp->state |= BST_FOUND; | 3691 | brdp->state |= BST_FOUND; |
4135 | return(0); | 3692 | return 0; |
4136 | } | 3693 | } |
4137 | 3694 | ||
4138 | /*****************************************************************************/ | 3695 | /*****************************************************************************/ |
@@ -4145,31 +3702,25 @@ static int stli_initonb(stlibrd_t *brdp) | |||
4145 | 3702 | ||
4146 | static int stli_startbrd(stlibrd_t *brdp) | 3703 | static int stli_startbrd(stlibrd_t *brdp) |
4147 | { | 3704 | { |
4148 | volatile cdkhdr_t *hdrp; | 3705 | cdkhdr_t __iomem *hdrp; |
4149 | volatile cdkmem_t *memp; | 3706 | cdkmem_t __iomem *memp; |
4150 | volatile cdkasy_t *ap; | 3707 | cdkasy_t __iomem *ap; |
4151 | unsigned long flags; | 3708 | unsigned long flags; |
4152 | stliport_t *portp; | 3709 | stliport_t *portp; |
4153 | int portnr, nrdevs, i, rc; | 3710 | int portnr, nrdevs, i, rc = 0; |
4154 | 3711 | u32 memoff; | |
4155 | #ifdef DEBUG | 3712 | |
4156 | printk(KERN_DEBUG "stli_startbrd(brdp=%x)\n", (int) brdp); | 3713 | spin_lock_irqsave(&brd_lock, flags); |
4157 | #endif | ||
4158 | |||
4159 | rc = 0; | ||
4160 | |||
4161 | save_flags(flags); | ||
4162 | cli(); | ||
4163 | EBRDENABLE(brdp); | 3714 | EBRDENABLE(brdp); |
4164 | hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); | 3715 | hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); |
4165 | nrdevs = hdrp->nrdevs; | 3716 | nrdevs = hdrp->nrdevs; |
4166 | 3717 | ||
4167 | #if 0 | 3718 | #if 0 |
4168 | printk("%s(%d): CDK version %d.%d.%d --> " | 3719 | printk("%s(%d): CDK version %d.%d.%d --> " |
4169 | "nrdevs=%d memp=%x hostp=%x slavep=%x\n", | 3720 | "nrdevs=%d memp=%x hostp=%x slavep=%x\n", |
4170 | __FILE__, __LINE__, hdrp->ver_release, hdrp->ver_modification, | 3721 | __FILE__, __LINE__, readb(&hdrp->ver_release), readb(&hdrp->ver_modification), |
4171 | hdrp->ver_fix, nrdevs, (int) hdrp->memp, (int) hdrp->hostp, | 3722 | readb(&hdrp->ver_fix), nrdevs, (int) readl(&hdrp->memp), readl(&hdrp->hostp), |
4172 | (int) hdrp->slavep); | 3723 | readl(&hdrp->slavep)); |
4173 | #endif | 3724 | #endif |
4174 | 3725 | ||
4175 | if (nrdevs < (brdp->nrports + 1)) { | 3726 | if (nrdevs < (brdp->nrports + 1)) { |
@@ -4181,14 +3732,14 @@ static int stli_startbrd(stlibrd_t *brdp) | |||
4181 | brdp->hostoffset = hdrp->hostp - CDK_CDKADDR; | 3732 | brdp->hostoffset = hdrp->hostp - CDK_CDKADDR; |
4182 | brdp->slaveoffset = hdrp->slavep - CDK_CDKADDR; | 3733 | brdp->slaveoffset = hdrp->slavep - CDK_CDKADDR; |
4183 | brdp->bitsize = (nrdevs + 7) / 8; | 3734 | brdp->bitsize = (nrdevs + 7) / 8; |
4184 | memp = (volatile cdkmem_t *) hdrp->memp; | 3735 | memoff = readl(&hdrp->memp); |
4185 | if (((unsigned long) memp) > brdp->memsize) { | 3736 | if (memoff > brdp->memsize) { |
4186 | printk(KERN_ERR "STALLION: corrupted shared memory region?\n"); | 3737 | printk(KERN_ERR "STALLION: corrupted shared memory region?\n"); |
4187 | rc = -EIO; | 3738 | rc = -EIO; |
4188 | goto stli_donestartup; | 3739 | goto stli_donestartup; |
4189 | } | 3740 | } |
4190 | memp = (volatile cdkmem_t *) EBRDGETMEMPTR(brdp, (unsigned long) memp); | 3741 | memp = (cdkmem_t __iomem *) EBRDGETMEMPTR(brdp, memoff); |
4191 | if (memp->dtype != TYP_ASYNCTRL) { | 3742 | if (readw(&memp->dtype) != TYP_ASYNCTRL) { |
4192 | printk(KERN_ERR "STALLION: no slave control device found\n"); | 3743 | printk(KERN_ERR "STALLION: no slave control device found\n"); |
4193 | goto stli_donestartup; | 3744 | goto stli_donestartup; |
4194 | } | 3745 | } |
@@ -4200,19 +3751,19 @@ static int stli_startbrd(stlibrd_t *brdp) | |||
4200 | * change pages while reading memory map. | 3751 | * change pages while reading memory map. |
4201 | */ | 3752 | */ |
4202 | for (i = 1, portnr = 0; (i < nrdevs); i++, portnr++, memp++) { | 3753 | for (i = 1, portnr = 0; (i < nrdevs); i++, portnr++, memp++) { |
4203 | if (memp->dtype != TYP_ASYNC) | 3754 | if (readw(&memp->dtype) != TYP_ASYNC) |
4204 | break; | 3755 | break; |
4205 | portp = brdp->ports[portnr]; | 3756 | portp = brdp->ports[portnr]; |
4206 | if (portp == (stliport_t *) NULL) | 3757 | if (portp == NULL) |
4207 | break; | 3758 | break; |
4208 | portp->devnr = i; | 3759 | portp->devnr = i; |
4209 | portp->addr = memp->offset; | 3760 | portp->addr = readl(&memp->offset); |
4210 | portp->reqbit = (unsigned char) (0x1 << (i * 8 / nrdevs)); | 3761 | portp->reqbit = (unsigned char) (0x1 << (i * 8 / nrdevs)); |
4211 | portp->portidx = (unsigned char) (i / 8); | 3762 | portp->portidx = (unsigned char) (i / 8); |
4212 | portp->portbit = (unsigned char) (0x1 << (i % 8)); | 3763 | portp->portbit = (unsigned char) (0x1 << (i % 8)); |
4213 | } | 3764 | } |
4214 | 3765 | ||
4215 | hdrp->slavereq = 0xff; | 3766 | writeb(0xff, &hdrp->slavereq); |
4216 | 3767 | ||
4217 | /* | 3768 | /* |
4218 | * For each port setup a local copy of the RX and TX buffer offsets | 3769 | * For each port setup a local copy of the RX and TX buffer offsets |
@@ -4221,22 +3772,22 @@ static int stli_startbrd(stlibrd_t *brdp) | |||
4221 | */ | 3772 | */ |
4222 | for (i = 1, portnr = 0; (i < nrdevs); i++, portnr++) { | 3773 | for (i = 1, portnr = 0; (i < nrdevs); i++, portnr++) { |
4223 | portp = brdp->ports[portnr]; | 3774 | portp = brdp->ports[portnr]; |
4224 | if (portp == (stliport_t *) NULL) | 3775 | if (portp == NULL) |
4225 | break; | 3776 | break; |
4226 | if (portp->addr == 0) | 3777 | if (portp->addr == 0) |
4227 | break; | 3778 | break; |
4228 | ap = (volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr); | 3779 | ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr); |
4229 | if (ap != (volatile cdkasy_t *) NULL) { | 3780 | if (ap != NULL) { |
4230 | portp->rxsize = ap->rxq.size; | 3781 | portp->rxsize = readw(&ap->rxq.size); |
4231 | portp->txsize = ap->txq.size; | 3782 | portp->txsize = readw(&ap->txq.size); |
4232 | portp->rxoffset = ap->rxq.offset; | 3783 | portp->rxoffset = readl(&ap->rxq.offset); |
4233 | portp->txoffset = ap->txq.offset; | 3784 | portp->txoffset = readl(&ap->txq.offset); |
4234 | } | 3785 | } |
4235 | } | 3786 | } |
4236 | 3787 | ||
4237 | stli_donestartup: | 3788 | stli_donestartup: |
4238 | EBRDDISABLE(brdp); | 3789 | EBRDDISABLE(brdp); |
4239 | restore_flags(flags); | 3790 | spin_unlock_irqrestore(&brd_lock, flags); |
4240 | 3791 | ||
4241 | if (rc == 0) | 3792 | if (rc == 0) |
4242 | brdp->state |= BST_STARTED; | 3793 | brdp->state |= BST_STARTED; |
@@ -4247,7 +3798,7 @@ stli_donestartup: | |||
4247 | add_timer(&stli_timerlist); | 3798 | add_timer(&stli_timerlist); |
4248 | } | 3799 | } |
4249 | 3800 | ||
4250 | return(rc); | 3801 | return rc; |
4251 | } | 3802 | } |
4252 | 3803 | ||
4253 | /*****************************************************************************/ | 3804 | /*****************************************************************************/ |
@@ -4258,10 +3809,6 @@ stli_donestartup: | |||
4258 | 3809 | ||
4259 | static int __init stli_brdinit(stlibrd_t *brdp) | 3810 | static int __init stli_brdinit(stlibrd_t *brdp) |
4260 | { | 3811 | { |
4261 | #ifdef DEBUG | ||
4262 | printk(KERN_DEBUG "stli_brdinit(brdp=%x)\n", (int) brdp); | ||
4263 | #endif | ||
4264 | |||
4265 | stli_brds[brdp->brdnr] = brdp; | 3812 | stli_brds[brdp->brdnr] = brdp; |
4266 | 3813 | ||
4267 | switch (brdp->brdtype) { | 3814 | switch (brdp->brdtype) { |
@@ -4289,11 +3836,11 @@ static int __init stli_brdinit(stlibrd_t *brdp) | |||
4289 | case BRD_ECHPCI: | 3836 | case BRD_ECHPCI: |
4290 | printk(KERN_ERR "STALLION: %s board type not supported in " | 3837 | printk(KERN_ERR "STALLION: %s board type not supported in " |
4291 | "this driver\n", stli_brdnames[brdp->brdtype]); | 3838 | "this driver\n", stli_brdnames[brdp->brdtype]); |
4292 | return(ENODEV); | 3839 | return -ENODEV; |
4293 | default: | 3840 | default: |
4294 | printk(KERN_ERR "STALLION: board=%d is unknown board " | 3841 | printk(KERN_ERR "STALLION: board=%d is unknown board " |
4295 | "type=%d\n", brdp->brdnr, brdp->brdtype); | 3842 | "type=%d\n", brdp->brdnr, brdp->brdtype); |
4296 | return(ENODEV); | 3843 | return -ENODEV; |
4297 | } | 3844 | } |
4298 | 3845 | ||
4299 | if ((brdp->state & BST_FOUND) == 0) { | 3846 | if ((brdp->state & BST_FOUND) == 0) { |
@@ -4301,7 +3848,7 @@ static int __init stli_brdinit(stlibrd_t *brdp) | |||
4301 | "io=%x mem=%x\n", | 3848 | "io=%x mem=%x\n", |
4302 | stli_brdnames[brdp->brdtype], brdp->brdnr, | 3849 | stli_brdnames[brdp->brdtype], brdp->brdnr, |
4303 | brdp->iobase, (int) brdp->memaddr); | 3850 | brdp->iobase, (int) brdp->memaddr); |
4304 | return(ENODEV); | 3851 | return -ENODEV; |
4305 | } | 3852 | } |
4306 | 3853 | ||
4307 | stli_initports(brdp); | 3854 | stli_initports(brdp); |
@@ -4309,7 +3856,7 @@ static int __init stli_brdinit(stlibrd_t *brdp) | |||
4309 | "nrpanels=%d nrports=%d\n", stli_brdnames[brdp->brdtype], | 3856 | "nrpanels=%d nrports=%d\n", stli_brdnames[brdp->brdtype], |
4310 | brdp->brdnr, brdp->iobase, (int) brdp->memaddr, | 3857 | brdp->brdnr, brdp->iobase, (int) brdp->memaddr, |
4311 | brdp->nrpanels, brdp->nrports); | 3858 | brdp->nrpanels, brdp->nrports); |
4312 | return(0); | 3859 | return 0; |
4313 | } | 3860 | } |
4314 | 3861 | ||
4315 | /*****************************************************************************/ | 3862 | /*****************************************************************************/ |
@@ -4321,14 +3868,10 @@ static int __init stli_brdinit(stlibrd_t *brdp) | |||
4321 | 3868 | ||
4322 | static int stli_eisamemprobe(stlibrd_t *brdp) | 3869 | static int stli_eisamemprobe(stlibrd_t *brdp) |
4323 | { | 3870 | { |
4324 | cdkecpsig_t ecpsig, *ecpsigp; | 3871 | cdkecpsig_t ecpsig, __iomem *ecpsigp; |
4325 | cdkonbsig_t onbsig, *onbsigp; | 3872 | cdkonbsig_t onbsig, __iomem *onbsigp; |
4326 | int i, foundit; | 3873 | int i, foundit; |
4327 | 3874 | ||
4328 | #ifdef DEBUG | ||
4329 | printk(KERN_DEBUG "stli_eisamemprobe(brdp=%x)\n", (int) brdp); | ||
4330 | #endif | ||
4331 | |||
4332 | /* | 3875 | /* |
4333 | * First up we reset the board, to get it into a known state. There | 3876 | * First up we reset the board, to get it into a known state. There |
4334 | * is only 2 board types here we need to worry about. Don;t use the | 3877 | * is only 2 board types here we need to worry about. Don;t use the |
@@ -4352,7 +3895,7 @@ static int stli_eisamemprobe(stlibrd_t *brdp) | |||
4352 | mdelay(1); | 3895 | mdelay(1); |
4353 | stli_onbeenable(brdp); | 3896 | stli_onbeenable(brdp); |
4354 | } else { | 3897 | } else { |
4355 | return(-ENODEV); | 3898 | return -ENODEV; |
4356 | } | 3899 | } |
4357 | 3900 | ||
4358 | foundit = 0; | 3901 | foundit = 0; |
@@ -4364,25 +3907,24 @@ static int stli_eisamemprobe(stlibrd_t *brdp) | |||
4364 | */ | 3907 | */ |
4365 | for (i = 0; (i < stli_eisamempsize); i++) { | 3908 | for (i = 0; (i < stli_eisamempsize); i++) { |
4366 | brdp->memaddr = stli_eisamemprobeaddrs[i]; | 3909 | brdp->memaddr = stli_eisamemprobeaddrs[i]; |
4367 | brdp->membase = (void *) brdp->memaddr; | ||
4368 | brdp->membase = ioremap(brdp->memaddr, brdp->memsize); | 3910 | brdp->membase = ioremap(brdp->memaddr, brdp->memsize); |
4369 | if (brdp->membase == (void *) NULL) | 3911 | if (brdp->membase == NULL) |
4370 | continue; | 3912 | continue; |
4371 | 3913 | ||
4372 | if (brdp->brdtype == BRD_ECPE) { | 3914 | if (brdp->brdtype == BRD_ECPE) { |
4373 | ecpsigp = (cdkecpsig_t *) stli_ecpeigetmemptr(brdp, | 3915 | ecpsigp = (cdkecpsig_t __iomem *) stli_ecpeigetmemptr(brdp, |
4374 | CDK_SIGADDR, __LINE__); | 3916 | CDK_SIGADDR, __LINE__); |
4375 | memcpy(&ecpsig, ecpsigp, sizeof(cdkecpsig_t)); | 3917 | memcpy_fromio(&ecpsig, ecpsigp, sizeof(cdkecpsig_t)); |
4376 | if (ecpsig.magic == ECP_MAGIC) | 3918 | if (ecpsig.magic == cpu_to_le32(ECP_MAGIC)) |
4377 | foundit = 1; | 3919 | foundit = 1; |
4378 | } else { | 3920 | } else { |
4379 | onbsigp = (cdkonbsig_t *) stli_onbegetmemptr(brdp, | 3921 | onbsigp = (cdkonbsig_t __iomem *) stli_onbegetmemptr(brdp, |
4380 | CDK_SIGADDR, __LINE__); | 3922 | CDK_SIGADDR, __LINE__); |
4381 | memcpy(&onbsig, onbsigp, sizeof(cdkonbsig_t)); | 3923 | memcpy_fromio(&onbsig, onbsigp, sizeof(cdkonbsig_t)); |
4382 | if ((onbsig.magic0 == ONB_MAGIC0) && | 3924 | if ((onbsig.magic0 == cpu_to_le16(ONB_MAGIC0)) && |
4383 | (onbsig.magic1 == ONB_MAGIC1) && | 3925 | (onbsig.magic1 == cpu_to_le16(ONB_MAGIC1)) && |
4384 | (onbsig.magic2 == ONB_MAGIC2) && | 3926 | (onbsig.magic2 == cpu_to_le16(ONB_MAGIC2)) && |
4385 | (onbsig.magic3 == ONB_MAGIC3)) | 3927 | (onbsig.magic3 == cpu_to_le16(ONB_MAGIC3))) |
4386 | foundit = 1; | 3928 | foundit = 1; |
4387 | } | 3929 | } |
4388 | 3930 | ||
@@ -4406,9 +3948,9 @@ static int stli_eisamemprobe(stlibrd_t *brdp) | |||
4406 | printk(KERN_ERR "STALLION: failed to probe shared memory " | 3948 | printk(KERN_ERR "STALLION: failed to probe shared memory " |
4407 | "region for %s in EISA slot=%d\n", | 3949 | "region for %s in EISA slot=%d\n", |
4408 | stli_brdnames[brdp->brdtype], (brdp->iobase >> 12)); | 3950 | stli_brdnames[brdp->brdtype], (brdp->iobase >> 12)); |
4409 | return(-ENODEV); | 3951 | return -ENODEV; |
4410 | } | 3952 | } |
4411 | return(0); | 3953 | return 0; |
4412 | } | 3954 | } |
4413 | 3955 | ||
4414 | static int stli_getbrdnr(void) | 3956 | static int stli_getbrdnr(void) |
@@ -4439,22 +3981,16 @@ static int stli_getbrdnr(void) | |||
4439 | 3981 | ||
4440 | static int stli_findeisabrds(void) | 3982 | static int stli_findeisabrds(void) |
4441 | { | 3983 | { |
4442 | stlibrd_t *brdp; | 3984 | stlibrd_t *brdp; |
4443 | unsigned int iobase, eid; | 3985 | unsigned int iobase, eid; |
4444 | int i; | 3986 | int i; |
4445 | |||
4446 | #ifdef DEBUG | ||
4447 | printk(KERN_DEBUG "stli_findeisabrds()\n"); | ||
4448 | #endif | ||
4449 | 3987 | ||
4450 | /* | 3988 | /* |
4451 | * Firstly check if this is an EISA system. Do this by probing for | 3989 | * Firstly check if this is an EISA system. If this is not an EISA system then |
4452 | * the system board EISA ID. If this is not an EISA system then | ||
4453 | * don't bother going any further! | 3990 | * don't bother going any further! |
4454 | */ | 3991 | */ |
4455 | outb(0xff, 0xc80); | 3992 | if (EISA_bus) |
4456 | if (inb(0xc80) == 0xff) | 3993 | return 0; |
4457 | return(0); | ||
4458 | 3994 | ||
4459 | /* | 3995 | /* |
4460 | * Looks like an EISA system, so go searching for EISA boards. | 3996 | * Looks like an EISA system, so go searching for EISA boards. |
@@ -4472,7 +4008,7 @@ static int stli_findeisabrds(void) | |||
4472 | */ | 4008 | */ |
4473 | for (i = 0; (i < STL_MAXBRDS); i++) { | 4009 | for (i = 0; (i < STL_MAXBRDS); i++) { |
4474 | brdp = stli_brds[i]; | 4010 | brdp = stli_brds[i]; |
4475 | if (brdp == (stlibrd_t *) NULL) | 4011 | if (brdp == NULL) |
4476 | continue; | 4012 | continue; |
4477 | if (brdp->iobase == iobase) | 4013 | if (brdp->iobase == iobase) |
4478 | break; | 4014 | break; |
@@ -4484,10 +4020,10 @@ static int stli_findeisabrds(void) | |||
4484 | * We have found a Stallion board and it is not configured already. | 4020 | * We have found a Stallion board and it is not configured already. |
4485 | * Allocate a board structure and initialize it. | 4021 | * Allocate a board structure and initialize it. |
4486 | */ | 4022 | */ |
4487 | if ((brdp = stli_allocbrd()) == (stlibrd_t *) NULL) | 4023 | if ((brdp = stli_allocbrd()) == NULL) |
4488 | return(-ENOMEM); | 4024 | return -ENOMEM; |
4489 | if ((brdp->brdnr = stli_getbrdnr()) < 0) | 4025 | if ((brdp->brdnr = stli_getbrdnr()) < 0) |
4490 | return(-ENOMEM); | 4026 | return -ENOMEM; |
4491 | eid = inb(iobase + 0xc82); | 4027 | eid = inb(iobase + 0xc82); |
4492 | if (eid == ECP_EISAID) | 4028 | if (eid == ECP_EISAID) |
4493 | brdp->brdtype = BRD_ECPE; | 4029 | brdp->brdtype = BRD_ECPE; |
@@ -4502,7 +4038,7 @@ static int stli_findeisabrds(void) | |||
4502 | stli_brdinit(brdp); | 4038 | stli_brdinit(brdp); |
4503 | } | 4039 | } |
4504 | 4040 | ||
4505 | return(0); | 4041 | return 0; |
4506 | } | 4042 | } |
4507 | 4043 | ||
4508 | /*****************************************************************************/ | 4044 | /*****************************************************************************/ |
@@ -4523,32 +4059,18 @@ static int stli_findeisabrds(void) | |||
4523 | 4059 | ||
4524 | static int stli_initpcibrd(int brdtype, struct pci_dev *devp) | 4060 | static int stli_initpcibrd(int brdtype, struct pci_dev *devp) |
4525 | { | 4061 | { |
4526 | stlibrd_t *brdp; | 4062 | stlibrd_t *brdp; |
4527 | |||
4528 | #ifdef DEBUG | ||
4529 | printk(KERN_DEBUG "stli_initpcibrd(brdtype=%d,busnr=%x,devnr=%x)\n", | ||
4530 | brdtype, dev->bus->number, dev->devfn); | ||
4531 | #endif | ||
4532 | 4063 | ||
4533 | if (pci_enable_device(devp)) | 4064 | if (pci_enable_device(devp)) |
4534 | return(-EIO); | 4065 | return -EIO; |
4535 | if ((brdp = stli_allocbrd()) == (stlibrd_t *) NULL) | 4066 | if ((brdp = stli_allocbrd()) == NULL) |
4536 | return(-ENOMEM); | 4067 | return -ENOMEM; |
4537 | if ((brdp->brdnr = stli_getbrdnr()) < 0) { | 4068 | if ((brdp->brdnr = stli_getbrdnr()) < 0) { |
4538 | printk(KERN_INFO "STALLION: too many boards found, " | 4069 | printk(KERN_INFO "STALLION: too many boards found, " |
4539 | "maximum supported %d\n", STL_MAXBRDS); | 4070 | "maximum supported %d\n", STL_MAXBRDS); |
4540 | return(0); | 4071 | return 0; |
4541 | } | 4072 | } |
4542 | brdp->brdtype = brdtype; | 4073 | brdp->brdtype = brdtype; |
4543 | |||
4544 | #ifdef DEBUG | ||
4545 | printk(KERN_DEBUG "%s(%d): BAR[]=%lx,%lx,%lx,%lx\n", __FILE__, __LINE__, | ||
4546 | pci_resource_start(devp, 0), | ||
4547 | pci_resource_start(devp, 1), | ||
4548 | pci_resource_start(devp, 2), | ||
4549 | pci_resource_start(devp, 3)); | ||
4550 | #endif | ||
4551 | |||
4552 | /* | 4074 | /* |
4553 | * We have all resources from the board, so lets setup the actual | 4075 | * We have all resources from the board, so lets setup the actual |
4554 | * board structure now. | 4076 | * board structure now. |
@@ -4557,7 +4079,7 @@ static int stli_initpcibrd(int brdtype, struct pci_dev *devp) | |||
4557 | brdp->memaddr = pci_resource_start(devp, 2); | 4079 | brdp->memaddr = pci_resource_start(devp, 2); |
4558 | stli_brdinit(brdp); | 4080 | stli_brdinit(brdp); |
4559 | 4081 | ||
4560 | return(0); | 4082 | return 0; |
4561 | } | 4083 | } |
4562 | 4084 | ||
4563 | /*****************************************************************************/ | 4085 | /*****************************************************************************/ |
@@ -4569,20 +4091,12 @@ static int stli_initpcibrd(int brdtype, struct pci_dev *devp) | |||
4569 | 4091 | ||
4570 | static int stli_findpcibrds(void) | 4092 | static int stli_findpcibrds(void) |
4571 | { | 4093 | { |
4572 | struct pci_dev *dev = NULL; | 4094 | struct pci_dev *dev = NULL; |
4573 | int rc; | ||
4574 | |||
4575 | #ifdef DEBUG | ||
4576 | printk("stli_findpcibrds()\n"); | ||
4577 | #endif | ||
4578 | 4095 | ||
4579 | while ((dev = pci_find_device(PCI_VENDOR_ID_STALLION, | 4096 | while ((dev = pci_get_device(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECRA, dev))) { |
4580 | PCI_DEVICE_ID_ECRA, dev))) { | 4097 | stli_initpcibrd(BRD_ECPPCI, dev); |
4581 | if ((rc = stli_initpcibrd(BRD_ECPPCI, dev))) | ||
4582 | return(rc); | ||
4583 | } | 4098 | } |
4584 | 4099 | return 0; | |
4585 | return(0); | ||
4586 | } | 4100 | } |
4587 | 4101 | ||
4588 | #endif | 4102 | #endif |
@@ -4595,17 +4109,16 @@ static int stli_findpcibrds(void) | |||
4595 | 4109 | ||
4596 | static stlibrd_t *stli_allocbrd(void) | 4110 | static stlibrd_t *stli_allocbrd(void) |
4597 | { | 4111 | { |
4598 | stlibrd_t *brdp; | 4112 | stlibrd_t *brdp; |
4599 | 4113 | ||
4600 | brdp = kzalloc(sizeof(stlibrd_t), GFP_KERNEL); | 4114 | brdp = kzalloc(sizeof(stlibrd_t), GFP_KERNEL); |
4601 | if (!brdp) { | 4115 | if (!brdp) { |
4602 | printk(KERN_ERR "STALLION: failed to allocate memory " | 4116 | printk(KERN_ERR "STALLION: failed to allocate memory " |
4603 | "(size=%d)\n", sizeof(stlibrd_t)); | 4117 | "(size=%Zd)\n", sizeof(stlibrd_t)); |
4604 | return NULL; | 4118 | return NULL; |
4605 | } | 4119 | } |
4606 | |||
4607 | brdp->magic = STLI_BOARDMAGIC; | 4120 | brdp->magic = STLI_BOARDMAGIC; |
4608 | return(brdp); | 4121 | return brdp; |
4609 | } | 4122 | } |
4610 | 4123 | ||
4611 | /*****************************************************************************/ | 4124 | /*****************************************************************************/ |
@@ -4617,13 +4130,9 @@ static stlibrd_t *stli_allocbrd(void) | |||
4617 | 4130 | ||
4618 | static int stli_initbrds(void) | 4131 | static int stli_initbrds(void) |
4619 | { | 4132 | { |
4620 | stlibrd_t *brdp, *nxtbrdp; | 4133 | stlibrd_t *brdp, *nxtbrdp; |
4621 | stlconf_t *confp; | 4134 | stlconf_t *confp; |
4622 | int i, j; | 4135 | int i, j; |
4623 | |||
4624 | #ifdef DEBUG | ||
4625 | printk(KERN_DEBUG "stli_initbrds()\n"); | ||
4626 | #endif | ||
4627 | 4136 | ||
4628 | if (stli_nrbrds > STL_MAXBRDS) { | 4137 | if (stli_nrbrds > STL_MAXBRDS) { |
4629 | printk(KERN_INFO "STALLION: too many boards in configuration " | 4138 | printk(KERN_INFO "STALLION: too many boards in configuration " |
@@ -4638,11 +4147,9 @@ static int stli_initbrds(void) | |||
4638 | */ | 4147 | */ |
4639 | for (i = 0; (i < stli_nrbrds); i++) { | 4148 | for (i = 0; (i < stli_nrbrds); i++) { |
4640 | confp = &stli_brdconf[i]; | 4149 | confp = &stli_brdconf[i]; |
4641 | #ifdef MODULE | ||
4642 | stli_parsebrd(confp, stli_brdsp[i]); | 4150 | stli_parsebrd(confp, stli_brdsp[i]); |
4643 | #endif | 4151 | if ((brdp = stli_allocbrd()) == NULL) |
4644 | if ((brdp = stli_allocbrd()) == (stlibrd_t *) NULL) | 4152 | return -ENOMEM; |
4645 | return(-ENOMEM); | ||
4646 | brdp->brdnr = i; | 4153 | brdp->brdnr = i; |
4647 | brdp->brdtype = confp->brdtype; | 4154 | brdp->brdtype = confp->brdtype; |
4648 | brdp->iobase = confp->ioaddr1; | 4155 | brdp->iobase = confp->ioaddr1; |
@@ -4654,9 +4161,7 @@ static int stli_initbrds(void) | |||
4654 | * Static configuration table done, so now use dynamic methods to | 4161 | * Static configuration table done, so now use dynamic methods to |
4655 | * see if any more boards should be configured. | 4162 | * see if any more boards should be configured. |
4656 | */ | 4163 | */ |
4657 | #ifdef MODULE | ||
4658 | stli_argbrds(); | 4164 | stli_argbrds(); |
4659 | #endif | ||
4660 | if (STLI_EISAPROBE) | 4165 | if (STLI_EISAPROBE) |
4661 | stli_findeisabrds(); | 4166 | stli_findeisabrds(); |
4662 | #ifdef CONFIG_PCI | 4167 | #ifdef CONFIG_PCI |
@@ -4672,11 +4177,11 @@ static int stli_initbrds(void) | |||
4672 | if (stli_nrbrds > 1) { | 4177 | if (stli_nrbrds > 1) { |
4673 | for (i = 0; (i < stli_nrbrds); i++) { | 4178 | for (i = 0; (i < stli_nrbrds); i++) { |
4674 | brdp = stli_brds[i]; | 4179 | brdp = stli_brds[i]; |
4675 | if (brdp == (stlibrd_t *) NULL) | 4180 | if (brdp == NULL) |
4676 | continue; | 4181 | continue; |
4677 | for (j = i + 1; (j < stli_nrbrds); j++) { | 4182 | for (j = i + 1; (j < stli_nrbrds); j++) { |
4678 | nxtbrdp = stli_brds[j]; | 4183 | nxtbrdp = stli_brds[j]; |
4679 | if (nxtbrdp == (stlibrd_t *) NULL) | 4184 | if (nxtbrdp == NULL) |
4680 | continue; | 4185 | continue; |
4681 | if ((brdp->membase >= nxtbrdp->membase) && | 4186 | if ((brdp->membase >= nxtbrdp->membase) && |
4682 | (brdp->membase <= (nxtbrdp->membase + | 4187 | (brdp->membase <= (nxtbrdp->membase + |
@@ -4691,7 +4196,7 @@ static int stli_initbrds(void) | |||
4691 | if (stli_shared == 0) { | 4196 | if (stli_shared == 0) { |
4692 | for (i = 0; (i < stli_nrbrds); i++) { | 4197 | for (i = 0; (i < stli_nrbrds); i++) { |
4693 | brdp = stli_brds[i]; | 4198 | brdp = stli_brds[i]; |
4694 | if (brdp == (stlibrd_t *) NULL) | 4199 | if (brdp == NULL) |
4695 | continue; | 4200 | continue; |
4696 | if (brdp->state & BST_FOUND) { | 4201 | if (brdp->state & BST_FOUND) { |
4697 | EBRDENABLE(brdp); | 4202 | EBRDENABLE(brdp); |
@@ -4701,7 +4206,7 @@ static int stli_initbrds(void) | |||
4701 | } | 4206 | } |
4702 | } | 4207 | } |
4703 | 4208 | ||
4704 | return(0); | 4209 | return 0; |
4705 | } | 4210 | } |
4706 | 4211 | ||
4707 | /*****************************************************************************/ | 4212 | /*****************************************************************************/ |
@@ -4714,48 +4219,55 @@ static int stli_initbrds(void) | |||
4714 | 4219 | ||
4715 | static ssize_t stli_memread(struct file *fp, char __user *buf, size_t count, loff_t *offp) | 4220 | static ssize_t stli_memread(struct file *fp, char __user *buf, size_t count, loff_t *offp) |
4716 | { | 4221 | { |
4717 | unsigned long flags; | 4222 | unsigned long flags; |
4718 | void *memptr; | 4223 | void *memptr; |
4719 | stlibrd_t *brdp; | 4224 | stlibrd_t *brdp; |
4720 | int brdnr, size, n; | 4225 | int brdnr, size, n; |
4721 | 4226 | void *p; | |
4722 | #ifdef DEBUG | 4227 | loff_t off = *offp; |
4723 | printk(KERN_DEBUG "stli_memread(fp=%x,buf=%x,count=%x,offp=%x)\n", | ||
4724 | (int) fp, (int) buf, count, (int) offp); | ||
4725 | #endif | ||
4726 | 4228 | ||
4727 | brdnr = iminor(fp->f_dentry->d_inode); | 4229 | brdnr = iminor(fp->f_dentry->d_inode); |
4728 | if (brdnr >= stli_nrbrds) | 4230 | if (brdnr >= stli_nrbrds) |
4729 | return(-ENODEV); | 4231 | return -ENODEV; |
4730 | brdp = stli_brds[brdnr]; | 4232 | brdp = stli_brds[brdnr]; |
4731 | if (brdp == (stlibrd_t *) NULL) | 4233 | if (brdp == NULL) |
4732 | return(-ENODEV); | 4234 | return -ENODEV; |
4733 | if (brdp->state == 0) | 4235 | if (brdp->state == 0) |
4734 | return(-ENODEV); | 4236 | return -ENODEV; |
4735 | if (fp->f_pos >= brdp->memsize) | 4237 | if (off >= brdp->memsize || off + count < off) |
4736 | return(0); | 4238 | return 0; |
4737 | 4239 | ||
4738 | size = MIN(count, (brdp->memsize - fp->f_pos)); | 4240 | size = MIN(count, (brdp->memsize - off)); |
4241 | |||
4242 | /* | ||
4243 | * Copy the data a page at a time | ||
4244 | */ | ||
4245 | |||
4246 | p = (void *)__get_free_page(GFP_KERNEL); | ||
4247 | if(p == NULL) | ||
4248 | return -ENOMEM; | ||
4739 | 4249 | ||
4740 | save_flags(flags); | ||
4741 | cli(); | ||
4742 | EBRDENABLE(brdp); | ||
4743 | while (size > 0) { | 4250 | while (size > 0) { |
4744 | memptr = (void *) EBRDGETMEMPTR(brdp, fp->f_pos); | 4251 | spin_lock_irqsave(&brd_lock, flags); |
4745 | n = MIN(size, (brdp->pagesize - (((unsigned long) fp->f_pos) % brdp->pagesize))); | 4252 | EBRDENABLE(brdp); |
4746 | if (copy_to_user(buf, memptr, n)) { | 4253 | memptr = (void *) EBRDGETMEMPTR(brdp, off); |
4254 | n = MIN(size, (brdp->pagesize - (((unsigned long) off) % brdp->pagesize))); | ||
4255 | n = MIN(n, PAGE_SIZE); | ||
4256 | memcpy_fromio(p, memptr, n); | ||
4257 | EBRDDISABLE(brdp); | ||
4258 | spin_unlock_irqrestore(&brd_lock, flags); | ||
4259 | if (copy_to_user(buf, p, n)) { | ||
4747 | count = -EFAULT; | 4260 | count = -EFAULT; |
4748 | goto out; | 4261 | goto out; |
4749 | } | 4262 | } |
4750 | fp->f_pos += n; | 4263 | off += n; |
4751 | buf += n; | 4264 | buf += n; |
4752 | size -= n; | 4265 | size -= n; |
4753 | } | 4266 | } |
4754 | out: | 4267 | out: |
4755 | EBRDDISABLE(brdp); | 4268 | *offp = off; |
4756 | restore_flags(flags); | 4269 | free_page((unsigned long)p); |
4757 | 4270 | return count; | |
4758 | return(count); | ||
4759 | } | 4271 | } |
4760 | 4272 | ||
4761 | /*****************************************************************************/ | 4273 | /*****************************************************************************/ |
@@ -4764,54 +4276,65 @@ out: | |||
4764 | * Code to handle an "staliomem" write operation. This device is the | 4276 | * Code to handle an "staliomem" write operation. This device is the |
4765 | * contents of the board shared memory. It is used for down loading | 4277 | * contents of the board shared memory. It is used for down loading |
4766 | * the slave image (and debugging :-) | 4278 | * the slave image (and debugging :-) |
4279 | * | ||
4280 | * FIXME: copy under lock | ||
4767 | */ | 4281 | */ |
4768 | 4282 | ||
4769 | static ssize_t stli_memwrite(struct file *fp, const char __user *buf, size_t count, loff_t *offp) | 4283 | static ssize_t stli_memwrite(struct file *fp, const char __user *buf, size_t count, loff_t *offp) |
4770 | { | 4284 | { |
4771 | unsigned long flags; | 4285 | unsigned long flags; |
4772 | void *memptr; | 4286 | void *memptr; |
4773 | stlibrd_t *brdp; | 4287 | stlibrd_t *brdp; |
4774 | char __user *chbuf; | 4288 | char __user *chbuf; |
4775 | int brdnr, size, n; | 4289 | int brdnr, size, n; |
4776 | 4290 | void *p; | |
4777 | #ifdef DEBUG | 4291 | loff_t off = *offp; |
4778 | printk(KERN_DEBUG "stli_memwrite(fp=%x,buf=%x,count=%x,offp=%x)\n", | ||
4779 | (int) fp, (int) buf, count, (int) offp); | ||
4780 | #endif | ||
4781 | 4292 | ||
4782 | brdnr = iminor(fp->f_dentry->d_inode); | 4293 | brdnr = iminor(fp->f_dentry->d_inode); |
4294 | |||
4783 | if (brdnr >= stli_nrbrds) | 4295 | if (brdnr >= stli_nrbrds) |
4784 | return(-ENODEV); | 4296 | return -ENODEV; |
4785 | brdp = stli_brds[brdnr]; | 4297 | brdp = stli_brds[brdnr]; |
4786 | if (brdp == (stlibrd_t *) NULL) | 4298 | if (brdp == NULL) |
4787 | return(-ENODEV); | 4299 | return -ENODEV; |
4788 | if (brdp->state == 0) | 4300 | if (brdp->state == 0) |
4789 | return(-ENODEV); | 4301 | return -ENODEV; |
4790 | if (fp->f_pos >= brdp->memsize) | 4302 | if (off >= brdp->memsize || off + count < off) |
4791 | return(0); | 4303 | return 0; |
4792 | 4304 | ||
4793 | chbuf = (char __user *) buf; | 4305 | chbuf = (char __user *) buf; |
4794 | size = MIN(count, (brdp->memsize - fp->f_pos)); | 4306 | size = MIN(count, (brdp->memsize - off)); |
4307 | |||
4308 | /* | ||
4309 | * Copy the data a page at a time | ||
4310 | */ | ||
4311 | |||
4312 | p = (void *)__get_free_page(GFP_KERNEL); | ||
4313 | if(p == NULL) | ||
4314 | return -ENOMEM; | ||
4795 | 4315 | ||
4796 | save_flags(flags); | ||
4797 | cli(); | ||
4798 | EBRDENABLE(brdp); | ||
4799 | while (size > 0) { | 4316 | while (size > 0) { |
4800 | memptr = (void *) EBRDGETMEMPTR(brdp, fp->f_pos); | 4317 | n = MIN(size, (brdp->pagesize - (((unsigned long) off) % brdp->pagesize))); |
4801 | n = MIN(size, (brdp->pagesize - (((unsigned long) fp->f_pos) % brdp->pagesize))); | 4318 | n = MIN(n, PAGE_SIZE); |
4802 | if (copy_from_user(memptr, chbuf, n)) { | 4319 | if (copy_from_user(p, chbuf, n)) { |
4803 | count = -EFAULT; | 4320 | if (count == 0) |
4321 | count = -EFAULT; | ||
4804 | goto out; | 4322 | goto out; |
4805 | } | 4323 | } |
4806 | fp->f_pos += n; | 4324 | spin_lock_irqsave(&brd_lock, flags); |
4325 | EBRDENABLE(brdp); | ||
4326 | memptr = (void *) EBRDGETMEMPTR(brdp, off); | ||
4327 | memcpy_toio(memptr, p, n); | ||
4328 | EBRDDISABLE(brdp); | ||
4329 | spin_unlock_irqrestore(&brd_lock, flags); | ||
4330 | off += n; | ||
4807 | chbuf += n; | 4331 | chbuf += n; |
4808 | size -= n; | 4332 | size -= n; |
4809 | } | 4333 | } |
4810 | out: | 4334 | out: |
4811 | EBRDDISABLE(brdp); | 4335 | free_page((unsigned long) p); |
4812 | restore_flags(flags); | 4336 | *offp = off; |
4813 | 4337 | return count; | |
4814 | return(count); | ||
4815 | } | 4338 | } |
4816 | 4339 | ||
4817 | /*****************************************************************************/ | 4340 | /*****************************************************************************/ |
@@ -4822,16 +4345,16 @@ out: | |||
4822 | 4345 | ||
4823 | static int stli_getbrdstats(combrd_t __user *bp) | 4346 | static int stli_getbrdstats(combrd_t __user *bp) |
4824 | { | 4347 | { |
4825 | stlibrd_t *brdp; | 4348 | stlibrd_t *brdp; |
4826 | int i; | 4349 | int i; |
4827 | 4350 | ||
4828 | if (copy_from_user(&stli_brdstats, bp, sizeof(combrd_t))) | 4351 | if (copy_from_user(&stli_brdstats, bp, sizeof(combrd_t))) |
4829 | return -EFAULT; | 4352 | return -EFAULT; |
4830 | if (stli_brdstats.brd >= STL_MAXBRDS) | 4353 | if (stli_brdstats.brd >= STL_MAXBRDS) |
4831 | return(-ENODEV); | 4354 | return -ENODEV; |
4832 | brdp = stli_brds[stli_brdstats.brd]; | 4355 | brdp = stli_brds[stli_brdstats.brd]; |
4833 | if (brdp == (stlibrd_t *) NULL) | 4356 | if (brdp == NULL) |
4834 | return(-ENODEV); | 4357 | return -ENODEV; |
4835 | 4358 | ||
4836 | memset(&stli_brdstats, 0, sizeof(combrd_t)); | 4359 | memset(&stli_brdstats, 0, sizeof(combrd_t)); |
4837 | stli_brdstats.brd = brdp->brdnr; | 4360 | stli_brdstats.brd = brdp->brdnr; |
@@ -4850,7 +4373,7 @@ static int stli_getbrdstats(combrd_t __user *bp) | |||
4850 | 4373 | ||
4851 | if (copy_to_user(bp, &stli_brdstats, sizeof(combrd_t))) | 4374 | if (copy_to_user(bp, &stli_brdstats, sizeof(combrd_t))) |
4852 | return -EFAULT; | 4375 | return -EFAULT; |
4853 | return(0); | 4376 | return 0; |
4854 | } | 4377 | } |
4855 | 4378 | ||
4856 | /*****************************************************************************/ | 4379 | /*****************************************************************************/ |
@@ -4861,19 +4384,19 @@ static int stli_getbrdstats(combrd_t __user *bp) | |||
4861 | 4384 | ||
4862 | static stliport_t *stli_getport(int brdnr, int panelnr, int portnr) | 4385 | static stliport_t *stli_getport(int brdnr, int panelnr, int portnr) |
4863 | { | 4386 | { |
4864 | stlibrd_t *brdp; | 4387 | stlibrd_t *brdp; |
4865 | int i; | 4388 | int i; |
4866 | 4389 | ||
4867 | if ((brdnr < 0) || (brdnr >= STL_MAXBRDS)) | 4390 | if (brdnr < 0 || brdnr >= STL_MAXBRDS) |
4868 | return((stliport_t *) NULL); | 4391 | return NULL; |
4869 | brdp = stli_brds[brdnr]; | 4392 | brdp = stli_brds[brdnr]; |
4870 | if (brdp == (stlibrd_t *) NULL) | 4393 | if (brdp == NULL) |
4871 | return((stliport_t *) NULL); | 4394 | return NULL; |
4872 | for (i = 0; (i < panelnr); i++) | 4395 | for (i = 0; (i < panelnr); i++) |
4873 | portnr += brdp->panels[i]; | 4396 | portnr += brdp->panels[i]; |
4874 | if ((portnr < 0) || (portnr >= brdp->nrports)) | 4397 | if ((portnr < 0) || (portnr >= brdp->nrports)) |
4875 | return((stliport_t *) NULL); | 4398 | return NULL; |
4876 | return(brdp->ports[portnr]); | 4399 | return brdp->ports[portnr]; |
4877 | } | 4400 | } |
4878 | 4401 | ||
4879 | /*****************************************************************************/ | 4402 | /*****************************************************************************/ |
@@ -4892,16 +4415,16 @@ static int stli_portcmdstats(stliport_t *portp) | |||
4892 | 4415 | ||
4893 | memset(&stli_comstats, 0, sizeof(comstats_t)); | 4416 | memset(&stli_comstats, 0, sizeof(comstats_t)); |
4894 | 4417 | ||
4895 | if (portp == (stliport_t *) NULL) | 4418 | if (portp == NULL) |
4896 | return(-ENODEV); | 4419 | return -ENODEV; |
4897 | brdp = stli_brds[portp->brdnr]; | 4420 | brdp = stli_brds[portp->brdnr]; |
4898 | if (brdp == (stlibrd_t *) NULL) | 4421 | if (brdp == NULL) |
4899 | return(-ENODEV); | 4422 | return -ENODEV; |
4900 | 4423 | ||
4901 | if (brdp->state & BST_STARTED) { | 4424 | if (brdp->state & BST_STARTED) { |
4902 | if ((rc = stli_cmdwait(brdp, portp, A_GETSTATS, | 4425 | if ((rc = stli_cmdwait(brdp, portp, A_GETSTATS, |
4903 | &stli_cdkstats, sizeof(asystats_t), 1)) < 0) | 4426 | &stli_cdkstats, sizeof(asystats_t), 1)) < 0) |
4904 | return(rc); | 4427 | return rc; |
4905 | } else { | 4428 | } else { |
4906 | memset(&stli_cdkstats, 0, sizeof(asystats_t)); | 4429 | memset(&stli_cdkstats, 0, sizeof(asystats_t)); |
4907 | } | 4430 | } |
@@ -4912,13 +4435,12 @@ static int stli_portcmdstats(stliport_t *portp) | |||
4912 | stli_comstats.state = portp->state; | 4435 | stli_comstats.state = portp->state; |
4913 | stli_comstats.flags = portp->flags; | 4436 | stli_comstats.flags = portp->flags; |
4914 | 4437 | ||
4915 | save_flags(flags); | 4438 | spin_lock_irqsave(&brd_lock, flags); |
4916 | cli(); | 4439 | if (portp->tty != NULL) { |
4917 | if (portp->tty != (struct tty_struct *) NULL) { | ||
4918 | if (portp->tty->driver_data == portp) { | 4440 | if (portp->tty->driver_data == portp) { |
4919 | stli_comstats.ttystate = portp->tty->flags; | 4441 | stli_comstats.ttystate = portp->tty->flags; |
4920 | stli_comstats.rxbuffered = -1 /*portp->tty->flip.count*/; | 4442 | stli_comstats.rxbuffered = -1; |
4921 | if (portp->tty->termios != (struct termios *) NULL) { | 4443 | if (portp->tty->termios != NULL) { |
4922 | stli_comstats.cflags = portp->tty->termios->c_cflag; | 4444 | stli_comstats.cflags = portp->tty->termios->c_cflag; |
4923 | stli_comstats.iflags = portp->tty->termios->c_iflag; | 4445 | stli_comstats.iflags = portp->tty->termios->c_iflag; |
4924 | stli_comstats.oflags = portp->tty->termios->c_oflag; | 4446 | stli_comstats.oflags = portp->tty->termios->c_oflag; |
@@ -4926,7 +4448,7 @@ static int stli_portcmdstats(stliport_t *portp) | |||
4926 | } | 4448 | } |
4927 | } | 4449 | } |
4928 | } | 4450 | } |
4929 | restore_flags(flags); | 4451 | spin_unlock_irqrestore(&brd_lock, flags); |
4930 | 4452 | ||
4931 | stli_comstats.txtotal = stli_cdkstats.txchars; | 4453 | stli_comstats.txtotal = stli_cdkstats.txchars; |
4932 | stli_comstats.rxtotal = stli_cdkstats.rxchars + stli_cdkstats.ringover; | 4454 | stli_comstats.rxtotal = stli_cdkstats.rxchars + stli_cdkstats.ringover; |
@@ -4948,7 +4470,7 @@ static int stli_portcmdstats(stliport_t *portp) | |||
4948 | stli_comstats.hwid = stli_cdkstats.hwid; | 4470 | stli_comstats.hwid = stli_cdkstats.hwid; |
4949 | stli_comstats.signals = stli_mktiocm(stli_cdkstats.signals); | 4471 | stli_comstats.signals = stli_mktiocm(stli_cdkstats.signals); |
4950 | 4472 | ||
4951 | return(0); | 4473 | return 0; |
4952 | } | 4474 | } |
4953 | 4475 | ||
4954 | /*****************************************************************************/ | 4476 | /*****************************************************************************/ |
@@ -4961,8 +4483,8 @@ static int stli_portcmdstats(stliport_t *portp) | |||
4961 | 4483 | ||
4962 | static int stli_getportstats(stliport_t *portp, comstats_t __user *cp) | 4484 | static int stli_getportstats(stliport_t *portp, comstats_t __user *cp) |
4963 | { | 4485 | { |
4964 | stlibrd_t *brdp; | 4486 | stlibrd_t *brdp; |
4965 | int rc; | 4487 | int rc; |
4966 | 4488 | ||
4967 | if (!portp) { | 4489 | if (!portp) { |
4968 | if (copy_from_user(&stli_comstats, cp, sizeof(comstats_t))) | 4490 | if (copy_from_user(&stli_comstats, cp, sizeof(comstats_t))) |
@@ -4992,8 +4514,8 @@ static int stli_getportstats(stliport_t *portp, comstats_t __user *cp) | |||
4992 | 4514 | ||
4993 | static int stli_clrportstats(stliport_t *portp, comstats_t __user *cp) | 4515 | static int stli_clrportstats(stliport_t *portp, comstats_t __user *cp) |
4994 | { | 4516 | { |
4995 | stlibrd_t *brdp; | 4517 | stlibrd_t *brdp; |
4996 | int rc; | 4518 | int rc; |
4997 | 4519 | ||
4998 | if (!portp) { | 4520 | if (!portp) { |
4999 | if (copy_from_user(&stli_comstats, cp, sizeof(comstats_t))) | 4521 | if (copy_from_user(&stli_comstats, cp, sizeof(comstats_t))) |
@@ -5031,7 +4553,7 @@ static int stli_clrportstats(stliport_t *portp, comstats_t __user *cp) | |||
5031 | 4553 | ||
5032 | static int stli_getportstruct(stliport_t __user *arg) | 4554 | static int stli_getportstruct(stliport_t __user *arg) |
5033 | { | 4555 | { |
5034 | stliport_t *portp; | 4556 | stliport_t *portp; |
5035 | 4557 | ||
5036 | if (copy_from_user(&stli_dummyport, arg, sizeof(stliport_t))) | 4558 | if (copy_from_user(&stli_dummyport, arg, sizeof(stliport_t))) |
5037 | return -EFAULT; | 4559 | return -EFAULT; |
@@ -5052,7 +4574,7 @@ static int stli_getportstruct(stliport_t __user *arg) | |||
5052 | 4574 | ||
5053 | static int stli_getbrdstruct(stlibrd_t __user *arg) | 4575 | static int stli_getbrdstruct(stlibrd_t __user *arg) |
5054 | { | 4576 | { |
5055 | stlibrd_t *brdp; | 4577 | stlibrd_t *brdp; |
5056 | 4578 | ||
5057 | if (copy_from_user(&stli_dummybrd, arg, sizeof(stlibrd_t))) | 4579 | if (copy_from_user(&stli_dummybrd, arg, sizeof(stlibrd_t))) |
5058 | return -EFAULT; | 4580 | return -EFAULT; |
@@ -5076,15 +4598,10 @@ static int stli_getbrdstruct(stlibrd_t __user *arg) | |||
5076 | 4598 | ||
5077 | static int stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg) | 4599 | static int stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg) |
5078 | { | 4600 | { |
5079 | stlibrd_t *brdp; | 4601 | stlibrd_t *brdp; |
5080 | int brdnr, rc, done; | 4602 | int brdnr, rc, done; |
5081 | void __user *argp = (void __user *)arg; | 4603 | void __user *argp = (void __user *)arg; |
5082 | 4604 | ||
5083 | #ifdef DEBUG | ||
5084 | printk(KERN_DEBUG "stli_memioctl(ip=%x,fp=%x,cmd=%x,arg=%x)\n", | ||
5085 | (int) ip, (int) fp, cmd, (int) arg); | ||
5086 | #endif | ||
5087 | |||
5088 | /* | 4605 | /* |
5089 | * First up handle the board independent ioctls. | 4606 | * First up handle the board independent ioctls. |
5090 | */ | 4607 | */ |
@@ -5115,7 +4632,7 @@ static int stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, un | |||
5115 | } | 4632 | } |
5116 | 4633 | ||
5117 | if (done) | 4634 | if (done) |
5118 | return(rc); | 4635 | return rc; |
5119 | 4636 | ||
5120 | /* | 4637 | /* |
5121 | * Now handle the board specific ioctls. These all depend on the | 4638 | * Now handle the board specific ioctls. These all depend on the |
@@ -5123,12 +4640,12 @@ static int stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, un | |||
5123 | */ | 4640 | */ |
5124 | brdnr = iminor(ip); | 4641 | brdnr = iminor(ip); |
5125 | if (brdnr >= STL_MAXBRDS) | 4642 | if (brdnr >= STL_MAXBRDS) |
5126 | return(-ENODEV); | 4643 | return -ENODEV; |
5127 | brdp = stli_brds[brdnr]; | 4644 | brdp = stli_brds[brdnr]; |
5128 | if (!brdp) | 4645 | if (!brdp) |
5129 | return(-ENODEV); | 4646 | return -ENODEV; |
5130 | if (brdp->state == 0) | 4647 | if (brdp->state == 0) |
5131 | return(-ENODEV); | 4648 | return -ENODEV; |
5132 | 4649 | ||
5133 | switch (cmd) { | 4650 | switch (cmd) { |
5134 | case STL_BINTR: | 4651 | case STL_BINTR: |
@@ -5152,8 +4669,7 @@ static int stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, un | |||
5152 | rc = -ENOIOCTLCMD; | 4669 | rc = -ENOIOCTLCMD; |
5153 | break; | 4670 | break; |
5154 | } | 4671 | } |
5155 | 4672 | return rc; | |
5156 | return(rc); | ||
5157 | } | 4673 | } |
5158 | 4674 | ||
5159 | static struct tty_operations stli_ops = { | 4675 | static struct tty_operations stli_ops = { |
@@ -5187,6 +4703,9 @@ int __init stli_init(void) | |||
5187 | int i; | 4703 | int i; |
5188 | printk(KERN_INFO "%s: version %s\n", stli_drvtitle, stli_drvversion); | 4704 | printk(KERN_INFO "%s: version %s\n", stli_drvtitle, stli_drvversion); |
5189 | 4705 | ||
4706 | spin_lock_init(&stli_lock); | ||
4707 | spin_lock_init(&brd_lock); | ||
4708 | |||
5190 | stli_initbrds(); | 4709 | stli_initbrds(); |
5191 | 4710 | ||
5192 | stli_serial = alloc_tty_driver(STL_MAXBRDS * STL_MAXPORTS); | 4711 | stli_serial = alloc_tty_driver(STL_MAXBRDS * STL_MAXPORTS); |
@@ -5196,10 +4715,6 @@ int __init stli_init(void) | |||
5196 | /* | 4715 | /* |
5197 | * Allocate a temporary write buffer. | 4716 | * Allocate a temporary write buffer. |
5198 | */ | 4717 | */ |
5199 | stli_tmpwritebuf = kmalloc(STLI_TXBUFSIZE, GFP_KERNEL); | ||
5200 | if (!stli_tmpwritebuf) | ||
5201 | printk(KERN_ERR "STALLION: failed to allocate memory " | ||
5202 | "(size=%d)\n", STLI_TXBUFSIZE); | ||
5203 | stli_txcookbuf = kmalloc(STLI_TXBUFSIZE, GFP_KERNEL); | 4718 | stli_txcookbuf = kmalloc(STLI_TXBUFSIZE, GFP_KERNEL); |
5204 | if (!stli_txcookbuf) | 4719 | if (!stli_txcookbuf) |
5205 | printk(KERN_ERR "STALLION: failed to allocate memory " | 4720 | printk(KERN_ERR "STALLION: failed to allocate memory " |
@@ -5243,7 +4758,7 @@ int __init stli_init(void) | |||
5243 | printk(KERN_ERR "STALLION: failed to register serial driver\n"); | 4758 | printk(KERN_ERR "STALLION: failed to register serial driver\n"); |
5244 | return -EBUSY; | 4759 | return -EBUSY; |
5245 | } | 4760 | } |
5246 | return(0); | 4761 | return 0; |
5247 | } | 4762 | } |
5248 | 4763 | ||
5249 | /*****************************************************************************/ | 4764 | /*****************************************************************************/ |
diff --git a/drivers/char/mxser.c b/drivers/char/mxser.c index 645d9d713aec..72cfd09091e0 100644 --- a/drivers/char/mxser.c +++ b/drivers/char/mxser.c | |||
@@ -996,7 +996,6 @@ static int mxser_open(struct tty_struct *tty, struct file *filp) | |||
996 | 996 | ||
997 | info->session = current->signal->session; | 997 | info->session = current->signal->session; |
998 | info->pgrp = process_group(current); | 998 | info->pgrp = process_group(current); |
999 | clear_bit(TTY_DONT_FLIP, &tty->flags); | ||
1000 | 999 | ||
1001 | /* | 1000 | /* |
1002 | status = mxser_get_msr(info->base, 0, info->port); | 1001 | status = mxser_get_msr(info->base, 0, info->port); |
diff --git a/drivers/char/n_tty.c b/drivers/char/n_tty.c index b9371d5bf790..603b9ade5eb0 100644 --- a/drivers/char/n_tty.c +++ b/drivers/char/n_tty.c | |||
@@ -1132,7 +1132,7 @@ static inline int input_available_p(struct tty_struct *tty, int amt) | |||
1132 | * buffer, and once to drain the space from the (physical) beginning of | 1132 | * buffer, and once to drain the space from the (physical) beginning of |
1133 | * the buffer to head pointer. | 1133 | * the buffer to head pointer. |
1134 | * | 1134 | * |
1135 | * Called under the tty->atomic_read_lock sem and with TTY_DONT_FLIP set | 1135 | * Called under the tty->atomic_read_lock sem |
1136 | * | 1136 | * |
1137 | */ | 1137 | */ |
1138 | 1138 | ||
@@ -1271,7 +1271,6 @@ do_it_again: | |||
1271 | } | 1271 | } |
1272 | 1272 | ||
1273 | add_wait_queue(&tty->read_wait, &wait); | 1273 | add_wait_queue(&tty->read_wait, &wait); |
1274 | set_bit(TTY_DONT_FLIP, &tty->flags); | ||
1275 | while (nr) { | 1274 | while (nr) { |
1276 | /* First test for status change. */ | 1275 | /* First test for status change. */ |
1277 | if (tty->packet && tty->link->ctrl_status) { | 1276 | if (tty->packet && tty->link->ctrl_status) { |
@@ -1315,9 +1314,7 @@ do_it_again: | |||
1315 | break; | 1314 | break; |
1316 | } | 1315 | } |
1317 | n_tty_set_room(tty); | 1316 | n_tty_set_room(tty); |
1318 | clear_bit(TTY_DONT_FLIP, &tty->flags); | ||
1319 | timeout = schedule_timeout(timeout); | 1317 | timeout = schedule_timeout(timeout); |
1320 | set_bit(TTY_DONT_FLIP, &tty->flags); | ||
1321 | continue; | 1318 | continue; |
1322 | } | 1319 | } |
1323 | __set_current_state(TASK_RUNNING); | 1320 | __set_current_state(TASK_RUNNING); |
@@ -1394,7 +1391,6 @@ do_it_again: | |||
1394 | if (time) | 1391 | if (time) |
1395 | timeout = time; | 1392 | timeout = time; |
1396 | } | 1393 | } |
1397 | clear_bit(TTY_DONT_FLIP, &tty->flags); | ||
1398 | mutex_unlock(&tty->atomic_read_lock); | 1394 | mutex_unlock(&tty->atomic_read_lock); |
1399 | remove_wait_queue(&tty->read_wait, &wait); | 1395 | remove_wait_queue(&tty->read_wait, &wait); |
1400 | 1396 | ||
diff --git a/drivers/char/pty.c b/drivers/char/pty.c index 9b5a2c0e7008..0c17f61549b4 100644 --- a/drivers/char/pty.c +++ b/drivers/char/pty.c | |||
@@ -101,7 +101,7 @@ static void pty_unthrottle(struct tty_struct * tty) | |||
101 | * | 101 | * |
102 | * FIXME: Our pty_write method is called with our ldisc lock held but | 102 | * FIXME: Our pty_write method is called with our ldisc lock held but |
103 | * not our partners. We can't just take the other one blindly without | 103 | * not our partners. We can't just take the other one blindly without |
104 | * risking deadlocks. There is also the small matter of TTY_DONT_FLIP | 104 | * risking deadlocks. |
105 | */ | 105 | */ |
106 | static int pty_write(struct tty_struct * tty, const unsigned char *buf, int count) | 106 | static int pty_write(struct tty_struct * tty, const unsigned char *buf, int count) |
107 | { | 107 | { |
diff --git a/drivers/char/stallion.c b/drivers/char/stallion.c index bf361a5ba70d..00b4a2187164 100644 --- a/drivers/char/stallion.c +++ b/drivers/char/stallion.c | |||
@@ -3029,6 +3029,9 @@ static int __init stl_init(void) | |||
3029 | int i; | 3029 | int i; |
3030 | printk(KERN_INFO "%s: version %s\n", stl_drvtitle, stl_drvversion); | 3030 | printk(KERN_INFO "%s: version %s\n", stl_drvtitle, stl_drvversion); |
3031 | 3031 | ||
3032 | spin_lock_init(&stallion_lock); | ||
3033 | spin_lock_init(&brd_lock); | ||
3034 | |||
3032 | stl_initbrds(); | 3035 | stl_initbrds(); |
3033 | 3036 | ||
3034 | stl_serial = alloc_tty_driver(STL_MAXBRDS * STL_MAXPORTS); | 3037 | stl_serial = alloc_tty_driver(STL_MAXBRDS * STL_MAXPORTS); |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index bd74e82d8a72..8d19f7281f0b 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -267,7 +267,6 @@ static struct tty_buffer *tty_buffer_alloc(size_t size) | |||
267 | p->used = 0; | 267 | p->used = 0; |
268 | p->size = size; | 268 | p->size = size; |
269 | p->next = NULL; | 269 | p->next = NULL; |
270 | p->active = 0; | ||
271 | p->commit = 0; | 270 | p->commit = 0; |
272 | p->read = 0; | 271 | p->read = 0; |
273 | p->char_buf_ptr = (char *)(p->data); | 272 | p->char_buf_ptr = (char *)(p->data); |
@@ -327,10 +326,9 @@ int tty_buffer_request_room(struct tty_struct *tty, size_t size) | |||
327 | /* OPTIMISATION: We could keep a per tty "zero" sized buffer to | 326 | /* OPTIMISATION: We could keep a per tty "zero" sized buffer to |
328 | remove this conditional if its worth it. This would be invisible | 327 | remove this conditional if its worth it. This would be invisible |
329 | to the callers */ | 328 | to the callers */ |
330 | if ((b = tty->buf.tail) != NULL) { | 329 | if ((b = tty->buf.tail) != NULL) |
331 | left = b->size - b->used; | 330 | left = b->size - b->used; |
332 | b->active = 1; | 331 | else |
333 | } else | ||
334 | left = 0; | 332 | left = 0; |
335 | 333 | ||
336 | if (left < size) { | 334 | if (left < size) { |
@@ -338,12 +336,10 @@ int tty_buffer_request_room(struct tty_struct *tty, size_t size) | |||
338 | if ((n = tty_buffer_find(tty, size)) != NULL) { | 336 | if ((n = tty_buffer_find(tty, size)) != NULL) { |
339 | if (b != NULL) { | 337 | if (b != NULL) { |
340 | b->next = n; | 338 | b->next = n; |
341 | b->active = 0; | ||
342 | b->commit = b->used; | 339 | b->commit = b->used; |
343 | } else | 340 | } else |
344 | tty->buf.head = n; | 341 | tty->buf.head = n; |
345 | tty->buf.tail = n; | 342 | tty->buf.tail = n; |
346 | n->active = 1; | ||
347 | } else | 343 | } else |
348 | size = left; | 344 | size = left; |
349 | } | 345 | } |
@@ -404,10 +400,8 @@ void tty_schedule_flip(struct tty_struct *tty) | |||
404 | { | 400 | { |
405 | unsigned long flags; | 401 | unsigned long flags; |
406 | spin_lock_irqsave(&tty->buf.lock, flags); | 402 | spin_lock_irqsave(&tty->buf.lock, flags); |
407 | if (tty->buf.tail != NULL) { | 403 | if (tty->buf.tail != NULL) |
408 | tty->buf.tail->active = 0; | ||
409 | tty->buf.tail->commit = tty->buf.tail->used; | 404 | tty->buf.tail->commit = tty->buf.tail->used; |
410 | } | ||
411 | spin_unlock_irqrestore(&tty->buf.lock, flags); | 405 | spin_unlock_irqrestore(&tty->buf.lock, flags); |
412 | schedule_delayed_work(&tty->buf.work, 1); | 406 | schedule_delayed_work(&tty->buf.work, 1); |
413 | } | 407 | } |
@@ -784,11 +778,8 @@ restart: | |||
784 | } | 778 | } |
785 | 779 | ||
786 | clear_bit(TTY_LDISC, &tty->flags); | 780 | clear_bit(TTY_LDISC, &tty->flags); |
787 | clear_bit(TTY_DONT_FLIP, &tty->flags); | 781 | if (o_tty) |
788 | if (o_tty) { | ||
789 | clear_bit(TTY_LDISC, &o_tty->flags); | 782 | clear_bit(TTY_LDISC, &o_tty->flags); |
790 | clear_bit(TTY_DONT_FLIP, &o_tty->flags); | ||
791 | } | ||
792 | spin_unlock_irqrestore(&tty_ldisc_lock, flags); | 783 | spin_unlock_irqrestore(&tty_ldisc_lock, flags); |
793 | 784 | ||
794 | /* | 785 | /* |
@@ -1955,7 +1946,6 @@ static void release_dev(struct file * filp) | |||
1955 | * race with the set_ldisc code path. | 1946 | * race with the set_ldisc code path. |
1956 | */ | 1947 | */ |
1957 | clear_bit(TTY_LDISC, &tty->flags); | 1948 | clear_bit(TTY_LDISC, &tty->flags); |
1958 | clear_bit(TTY_DONT_FLIP, &tty->flags); | ||
1959 | cancel_delayed_work(&tty->buf.work); | 1949 | cancel_delayed_work(&tty->buf.work); |
1960 | 1950 | ||
1961 | /* | 1951 | /* |
@@ -2775,8 +2765,7 @@ static void flush_to_ldisc(void *private_) | |||
2775 | struct tty_struct *tty = (struct tty_struct *) private_; | 2765 | struct tty_struct *tty = (struct tty_struct *) private_; |
2776 | unsigned long flags; | 2766 | unsigned long flags; |
2777 | struct tty_ldisc *disc; | 2767 | struct tty_ldisc *disc; |
2778 | struct tty_buffer *tbuf; | 2768 | struct tty_buffer *tbuf, *head; |
2779 | int count; | ||
2780 | char *char_buf; | 2769 | char *char_buf; |
2781 | unsigned char *flag_buf; | 2770 | unsigned char *flag_buf; |
2782 | 2771 | ||
@@ -2784,32 +2773,37 @@ static void flush_to_ldisc(void *private_) | |||
2784 | if (disc == NULL) /* !TTY_LDISC */ | 2773 | if (disc == NULL) /* !TTY_LDISC */ |
2785 | return; | 2774 | return; |
2786 | 2775 | ||
2787 | if (test_bit(TTY_DONT_FLIP, &tty->flags)) { | ||
2788 | /* | ||
2789 | * Do it after the next timer tick: | ||
2790 | */ | ||
2791 | schedule_delayed_work(&tty->buf.work, 1); | ||
2792 | goto out; | ||
2793 | } | ||
2794 | spin_lock_irqsave(&tty->buf.lock, flags); | 2776 | spin_lock_irqsave(&tty->buf.lock, flags); |
2795 | while((tbuf = tty->buf.head) != NULL) { | 2777 | head = tty->buf.head; |
2796 | while ((count = tbuf->commit - tbuf->read) != 0) { | 2778 | if (head != NULL) { |
2797 | char_buf = tbuf->char_buf_ptr + tbuf->read; | 2779 | tty->buf.head = NULL; |
2798 | flag_buf = tbuf->flag_buf_ptr + tbuf->read; | 2780 | for (;;) { |
2799 | tbuf->read += count; | 2781 | int count = head->commit - head->read; |
2782 | if (!count) { | ||
2783 | if (head->next == NULL) | ||
2784 | break; | ||
2785 | tbuf = head; | ||
2786 | head = head->next; | ||
2787 | tty_buffer_free(tty, tbuf); | ||
2788 | continue; | ||
2789 | } | ||
2790 | if (!tty->receive_room) { | ||
2791 | schedule_delayed_work(&tty->buf.work, 1); | ||
2792 | break; | ||
2793 | } | ||
2794 | if (count > tty->receive_room) | ||
2795 | count = tty->receive_room; | ||
2796 | char_buf = head->char_buf_ptr + head->read; | ||
2797 | flag_buf = head->flag_buf_ptr + head->read; | ||
2798 | head->read += count; | ||
2800 | spin_unlock_irqrestore(&tty->buf.lock, flags); | 2799 | spin_unlock_irqrestore(&tty->buf.lock, flags); |
2801 | disc->receive_buf(tty, char_buf, flag_buf, count); | 2800 | disc->receive_buf(tty, char_buf, flag_buf, count); |
2802 | spin_lock_irqsave(&tty->buf.lock, flags); | 2801 | spin_lock_irqsave(&tty->buf.lock, flags); |
2803 | } | 2802 | } |
2804 | if (tbuf->active) | 2803 | tty->buf.head = head; |
2805 | break; | ||
2806 | tty->buf.head = tbuf->next; | ||
2807 | if (tty->buf.head == NULL) | ||
2808 | tty->buf.tail = NULL; | ||
2809 | tty_buffer_free(tty, tbuf); | ||
2810 | } | 2804 | } |
2811 | spin_unlock_irqrestore(&tty->buf.lock, flags); | 2805 | spin_unlock_irqrestore(&tty->buf.lock, flags); |
2812 | out: | 2806 | |
2813 | tty_ldisc_deref(disc); | 2807 | tty_ldisc_deref(disc); |
2814 | } | 2808 | } |
2815 | 2809 | ||
@@ -2902,10 +2896,8 @@ void tty_flip_buffer_push(struct tty_struct *tty) | |||
2902 | { | 2896 | { |
2903 | unsigned long flags; | 2897 | unsigned long flags; |
2904 | spin_lock_irqsave(&tty->buf.lock, flags); | 2898 | spin_lock_irqsave(&tty->buf.lock, flags); |
2905 | if (tty->buf.tail != NULL) { | 2899 | if (tty->buf.tail != NULL) |
2906 | tty->buf.tail->active = 0; | ||
2907 | tty->buf.tail->commit = tty->buf.tail->used; | 2900 | tty->buf.tail->commit = tty->buf.tail->used; |
2908 | } | ||
2909 | spin_unlock_irqrestore(&tty->buf.lock, flags); | 2901 | spin_unlock_irqrestore(&tty->buf.lock, flags); |
2910 | 2902 | ||
2911 | if (tty->low_latency) | 2903 | if (tty->low_latency) |
diff --git a/drivers/char/vr41xx_giu.c b/drivers/char/vr41xx_giu.c index 05e6e814d86f..073da48c092e 100644 --- a/drivers/char/vr41xx_giu.c +++ b/drivers/char/vr41xx_giu.c | |||
@@ -689,9 +689,9 @@ static int __devinit giu_probe(struct platform_device *dev) | |||
689 | 689 | ||
690 | for (i = GIU_IRQ_BASE; i <= GIU_IRQ_LAST; i++) { | 690 | for (i = GIU_IRQ_BASE; i <= GIU_IRQ_LAST; i++) { |
691 | if (i < GIU_IRQ(GIUINT_HIGH_OFFSET)) | 691 | if (i < GIU_IRQ(GIUINT_HIGH_OFFSET)) |
692 | irq_desc[i].handler = &giuint_low_irq_type; | 692 | irq_desc[i].chip = &giuint_low_irq_type; |
693 | else | 693 | else |
694 | irq_desc[i].handler = &giuint_high_irq_type; | 694 | irq_desc[i].chip = &giuint_high_irq_type; |
695 | } | 695 | } |
696 | 696 | ||
697 | return cascade_irq(GIUINT_IRQ, giu_get_irq); | 697 | return cascade_irq(GIUINT_IRQ, giu_get_irq); |
diff --git a/drivers/char/watchdog/at91_wdt.c b/drivers/char/watchdog/at91_wdt.c index ac83bc4b019a..00080655533d 100644 --- a/drivers/char/watchdog/at91_wdt.c +++ b/drivers/char/watchdog/at91_wdt.c | |||
@@ -17,14 +17,15 @@ | |||
17 | #include <linux/miscdevice.h> | 17 | #include <linux/miscdevice.h> |
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/moduleparam.h> | 19 | #include <linux/moduleparam.h> |
20 | #include <linux/platform_device.h> | ||
20 | #include <linux/types.h> | 21 | #include <linux/types.h> |
21 | #include <linux/watchdog.h> | 22 | #include <linux/watchdog.h> |
22 | #include <asm/bitops.h> | 23 | #include <asm/bitops.h> |
23 | #include <asm/uaccess.h> | 24 | #include <asm/uaccess.h> |
24 | 25 | ||
25 | 26 | ||
26 | #define WDT_DEFAULT_TIME 5 /* 5 seconds */ | 27 | #define WDT_DEFAULT_TIME 5 /* seconds */ |
27 | #define WDT_MAX_TIME 256 /* 256 seconds */ | 28 | #define WDT_MAX_TIME 256 /* seconds */ |
28 | 29 | ||
29 | static int wdt_time = WDT_DEFAULT_TIME; | 30 | static int wdt_time = WDT_DEFAULT_TIME; |
30 | static int nowayout = WATCHDOG_NOWAYOUT; | 31 | static int nowayout = WATCHDOG_NOWAYOUT; |
@@ -32,8 +33,10 @@ static int nowayout = WATCHDOG_NOWAYOUT; | |||
32 | module_param(wdt_time, int, 0); | 33 | module_param(wdt_time, int, 0); |
33 | MODULE_PARM_DESC(wdt_time, "Watchdog time in seconds. (default="__MODULE_STRING(WDT_DEFAULT_TIME) ")"); | 34 | MODULE_PARM_DESC(wdt_time, "Watchdog time in seconds. (default="__MODULE_STRING(WDT_DEFAULT_TIME) ")"); |
34 | 35 | ||
36 | #ifdef CONFIG_WATCHDOG_NOWAYOUT | ||
35 | module_param(nowayout, int, 0); | 37 | module_param(nowayout, int, 0); |
36 | MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); | 38 | MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); |
39 | #endif | ||
37 | 40 | ||
38 | 41 | ||
39 | static unsigned long at91wdt_busy; | 42 | static unsigned long at91wdt_busy; |
@@ -138,7 +141,7 @@ static int at91_wdt_ioctl(struct inode *inode, struct file *file, | |||
138 | case WDIOC_SETTIMEOUT: | 141 | case WDIOC_SETTIMEOUT: |
139 | if (get_user(new_value, p)) | 142 | if (get_user(new_value, p)) |
140 | return -EFAULT; | 143 | return -EFAULT; |
141 | 144 | ||
142 | if (at91_wdt_settimeout(new_value)) | 145 | if (at91_wdt_settimeout(new_value)) |
143 | return -EINVAL; | 146 | return -EINVAL; |
144 | 147 | ||
@@ -196,27 +199,84 @@ static struct miscdevice at91wdt_miscdev = { | |||
196 | .fops = &at91wdt_fops, | 199 | .fops = &at91wdt_fops, |
197 | }; | 200 | }; |
198 | 201 | ||
199 | static int __init at91_wdt_init(void) | 202 | static int __init at91wdt_probe(struct platform_device *pdev) |
200 | { | 203 | { |
201 | int res; | 204 | int res; |
202 | 205 | ||
203 | /* Check that the heartbeat value is within range; if not reset to the default */ | 206 | if (at91wdt_miscdev.dev) |
204 | if (at91_wdt_settimeout(wdt_time)) { | 207 | return -EBUSY; |
205 | at91_wdt_settimeout(WDT_DEFAULT_TIME); | 208 | at91wdt_miscdev.dev = &pdev->dev; |
206 | printk(KERN_INFO "at91_wdt: wdt_time value must be 1 <= wdt_time <= 256, using %d\n", wdt_time); | ||
207 | } | ||
208 | 209 | ||
209 | res = misc_register(&at91wdt_miscdev); | 210 | res = misc_register(&at91wdt_miscdev); |
210 | if (res) | 211 | if (res) |
211 | return res; | 212 | return res; |
212 | 213 | ||
213 | printk("AT91 Watchdog Timer enabled (%d seconds, nowayout=%d)\n", wdt_time, nowayout); | 214 | printk("AT91 Watchdog Timer enabled (%d seconds%s)\n", wdt_time, nowayout ? ", nowayout" : ""); |
214 | return 0; | 215 | return 0; |
215 | } | 216 | } |
216 | 217 | ||
218 | static int __exit at91wdt_remove(struct platform_device *pdev) | ||
219 | { | ||
220 | int res; | ||
221 | |||
222 | res = misc_deregister(&at91wdt_miscdev); | ||
223 | if (!res) | ||
224 | at91wdt_miscdev.dev = NULL; | ||
225 | |||
226 | return res; | ||
227 | } | ||
228 | |||
229 | static void at91wdt_shutdown(struct platform_device *pdev) | ||
230 | { | ||
231 | at91_wdt_stop(); | ||
232 | } | ||
233 | |||
234 | #ifdef CONFIG_PM | ||
235 | |||
236 | static int at91wdt_suspend(struct platform_device *pdev, pm_message_t message) | ||
237 | { | ||
238 | at91_wdt_stop(); | ||
239 | return 0; | ||
240 | } | ||
241 | |||
242 | static int at91wdt_resume(struct platform_device *pdev) | ||
243 | { | ||
244 | if (at91wdt_busy) | ||
245 | at91_wdt_start(); | ||
246 | return 0; | ||
247 | } | ||
248 | |||
249 | #else | ||
250 | #define at91wdt_suspend NULL | ||
251 | #define at91wdt_resume NULL | ||
252 | #endif | ||
253 | |||
254 | static struct platform_driver at91wdt_driver = { | ||
255 | .probe = at91wdt_probe, | ||
256 | .remove = __exit_p(at91wdt_remove), | ||
257 | .shutdown = at91wdt_shutdown, | ||
258 | .suspend = at91wdt_suspend, | ||
259 | .resume = at91wdt_resume, | ||
260 | .driver = { | ||
261 | .name = "at91_wdt", | ||
262 | .owner = THIS_MODULE, | ||
263 | }, | ||
264 | }; | ||
265 | |||
266 | static int __init at91_wdt_init(void) | ||
267 | { | ||
268 | /* Check that the heartbeat value is within range; if not reset to the default */ | ||
269 | if (at91_wdt_settimeout(wdt_time)) { | ||
270 | at91_wdt_settimeout(WDT_DEFAULT_TIME); | ||
271 | pr_info("at91_wdt: wdt_time value must be 1 <= wdt_time <= 256, using %d\n", wdt_time); | ||
272 | } | ||
273 | |||
274 | return platform_driver_register(&at91wdt_driver); | ||
275 | } | ||
276 | |||
217 | static void __exit at91_wdt_exit(void) | 277 | static void __exit at91_wdt_exit(void) |
218 | { | 278 | { |
219 | misc_deregister(&at91wdt_miscdev); | 279 | platform_driver_unregister(&at91wdt_driver); |
220 | } | 280 | } |
221 | 281 | ||
222 | module_init(at91_wdt_init); | 282 | module_init(at91_wdt_init); |
diff --git a/drivers/char/watchdog/i8xx_tco.c b/drivers/char/watchdog/i8xx_tco.c index fa2ba9ebe42a..bfbdbbf3c2f2 100644 --- a/drivers/char/watchdog/i8xx_tco.c +++ b/drivers/char/watchdog/i8xx_tco.c | |||
@@ -205,6 +205,23 @@ static int tco_timer_set_heartbeat (int t) | |||
205 | return 0; | 205 | return 0; |
206 | } | 206 | } |
207 | 207 | ||
208 | static int tco_timer_get_timeleft (int *time_left) | ||
209 | { | ||
210 | unsigned char val; | ||
211 | |||
212 | spin_lock(&tco_lock); | ||
213 | |||
214 | /* read the TCO Timer */ | ||
215 | val = inb (TCO1_RLD); | ||
216 | val &= 0x3f; | ||
217 | |||
218 | spin_unlock(&tco_lock); | ||
219 | |||
220 | *time_left = (int)((val * 6) / 10); | ||
221 | |||
222 | return 0; | ||
223 | } | ||
224 | |||
208 | /* | 225 | /* |
209 | * /dev/watchdog handling | 226 | * /dev/watchdog handling |
210 | */ | 227 | */ |
@@ -272,6 +289,7 @@ static int i8xx_tco_ioctl (struct inode *inode, struct file *file, | |||
272 | { | 289 | { |
273 | int new_options, retval = -EINVAL; | 290 | int new_options, retval = -EINVAL; |
274 | int new_heartbeat; | 291 | int new_heartbeat; |
292 | int time_left; | ||
275 | void __user *argp = (void __user *)arg; | 293 | void __user *argp = (void __user *)arg; |
276 | int __user *p = argp; | 294 | int __user *p = argp; |
277 | static struct watchdog_info ident = { | 295 | static struct watchdog_info ident = { |
@@ -320,7 +338,7 @@ static int i8xx_tco_ioctl (struct inode *inode, struct file *file, | |||
320 | return -EFAULT; | 338 | return -EFAULT; |
321 | 339 | ||
322 | if (tco_timer_set_heartbeat(new_heartbeat)) | 340 | if (tco_timer_set_heartbeat(new_heartbeat)) |
323 | return -EINVAL; | 341 | return -EINVAL; |
324 | 342 | ||
325 | tco_timer_keepalive (); | 343 | tco_timer_keepalive (); |
326 | /* Fall */ | 344 | /* Fall */ |
@@ -329,6 +347,14 @@ static int i8xx_tco_ioctl (struct inode *inode, struct file *file, | |||
329 | case WDIOC_GETTIMEOUT: | 347 | case WDIOC_GETTIMEOUT: |
330 | return put_user(heartbeat, p); | 348 | return put_user(heartbeat, p); |
331 | 349 | ||
350 | case WDIOC_GETTIMELEFT: | ||
351 | { | ||
352 | if (tco_timer_get_timeleft(&time_left)) | ||
353 | return -EINVAL; | ||
354 | |||
355 | return put_user(time_left, p); | ||
356 | } | ||
357 | |||
332 | default: | 358 | default: |
333 | return -ENOIOCTLCMD; | 359 | return -ENOIOCTLCMD; |
334 | } | 360 | } |
diff --git a/drivers/char/watchdog/pcwd_pci.c b/drivers/char/watchdog/pcwd_pci.c index 2451edbefece..1f40ecefbf72 100644 --- a/drivers/char/watchdog/pcwd_pci.c +++ b/drivers/char/watchdog/pcwd_pci.c | |||
@@ -21,7 +21,7 @@ | |||
21 | */ | 21 | */ |
22 | 22 | ||
23 | /* | 23 | /* |
24 | * A bells and whistles driver is available from: | 24 | * A bells and whistles driver is available from: |
25 | * http://www.kernel.org/pub/linux/kernel/people/wim/pcwd/pcwd_pci/ | 25 | * http://www.kernel.org/pub/linux/kernel/people/wim/pcwd/pcwd_pci/ |
26 | * | 26 | * |
27 | * More info available at http://www.berkprod.com/ or http://www.pcwatchdog.com/ | 27 | * More info available at http://www.berkprod.com/ or http://www.pcwatchdog.com/ |
@@ -390,6 +390,24 @@ static int pcipcwd_get_temperature(int *temperature) | |||
390 | return 0; | 390 | return 0; |
391 | } | 391 | } |
392 | 392 | ||
393 | static int pcipcwd_get_timeleft(int *time_left) | ||
394 | { | ||
395 | int msb; | ||
396 | int lsb; | ||
397 | |||
398 | /* Read the time that's left before rebooting */ | ||
399 | /* Note: if the board is not yet armed then we will read 0xFFFF */ | ||
400 | send_command(CMD_READ_WATCHDOG_TIMEOUT, &msb, &lsb); | ||
401 | |||
402 | *time_left = (msb << 8) + lsb; | ||
403 | |||
404 | if (debug >= VERBOSE) | ||
405 | printk(KERN_DEBUG PFX "Time left before next reboot: %d\n", | ||
406 | *time_left); | ||
407 | |||
408 | return 0; | ||
409 | } | ||
410 | |||
393 | /* | 411 | /* |
394 | * /dev/watchdog handling | 412 | * /dev/watchdog handling |
395 | */ | 413 | */ |
@@ -512,6 +530,16 @@ static int pcipcwd_ioctl(struct inode *inode, struct file *file, | |||
512 | case WDIOC_GETTIMEOUT: | 530 | case WDIOC_GETTIMEOUT: |
513 | return put_user(heartbeat, p); | 531 | return put_user(heartbeat, p); |
514 | 532 | ||
533 | case WDIOC_GETTIMELEFT: | ||
534 | { | ||
535 | int time_left; | ||
536 | |||
537 | if (pcipcwd_get_timeleft(&time_left)) | ||
538 | return -EFAULT; | ||
539 | |||
540 | return put_user(time_left, p); | ||
541 | } | ||
542 | |||
515 | default: | 543 | default: |
516 | return -ENOIOCTLCMD; | 544 | return -ENOIOCTLCMD; |
517 | } | 545 | } |
diff --git a/drivers/char/watchdog/pcwd_usb.c b/drivers/char/watchdog/pcwd_usb.c index 3fdfda9324fa..0d072bed501d 100644 --- a/drivers/char/watchdog/pcwd_usb.c +++ b/drivers/char/watchdog/pcwd_usb.c | |||
@@ -317,6 +317,19 @@ static int usb_pcwd_get_temperature(struct usb_pcwd_private *usb_pcwd, int *temp | |||
317 | return 0; | 317 | return 0; |
318 | } | 318 | } |
319 | 319 | ||
320 | static int usb_pcwd_get_timeleft(struct usb_pcwd_private *usb_pcwd, int *time_left) | ||
321 | { | ||
322 | unsigned char msb, lsb; | ||
323 | |||
324 | /* Read the time that's left before rebooting */ | ||
325 | /* Note: if the board is not yet armed then we will read 0xFFFF */ | ||
326 | usb_pcwd_send_command(usb_pcwd, CMD_READ_WATCHDOG_TIMEOUT, &msb, &lsb); | ||
327 | |||
328 | *time_left = (msb << 8) + lsb; | ||
329 | |||
330 | return 0; | ||
331 | } | ||
332 | |||
320 | /* | 333 | /* |
321 | * /dev/watchdog handling | 334 | * /dev/watchdog handling |
322 | */ | 335 | */ |
@@ -422,6 +435,16 @@ static int usb_pcwd_ioctl(struct inode *inode, struct file *file, | |||
422 | case WDIOC_GETTIMEOUT: | 435 | case WDIOC_GETTIMEOUT: |
423 | return put_user(heartbeat, p); | 436 | return put_user(heartbeat, p); |
424 | 437 | ||
438 | case WDIOC_GETTIMELEFT: | ||
439 | { | ||
440 | int time_left; | ||
441 | |||
442 | if (usb_pcwd_get_timeleft(usb_pcwd_device, &time_left)) | ||
443 | return -EFAULT; | ||
444 | |||
445 | return put_user(time_left, p); | ||
446 | } | ||
447 | |||
425 | default: | 448 | default: |
426 | return -ENOIOCTLCMD; | 449 | return -ENOIOCTLCMD; |
427 | } | 450 | } |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index d633081fa4c5..d1266fe2d1ab 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -774,11 +774,18 @@ config BLK_DEV_IDEDMA_PMAC | |||
774 | performance. | 774 | performance. |
775 | 775 | ||
776 | config BLK_DEV_IDE_PMAC_BLINK | 776 | config BLK_DEV_IDE_PMAC_BLINK |
777 | bool "Blink laptop LED on drive activity" | 777 | bool "Blink laptop LED on drive activity (DEPRECATED)" |
778 | depends on BLK_DEV_IDE_PMAC && ADB_PMU | 778 | depends on BLK_DEV_IDE_PMAC && ADB_PMU |
779 | select ADB_PMU_LED | ||
780 | select LEDS_TRIGGERS | ||
781 | select LEDS_TRIGGER_IDE_DISK | ||
779 | help | 782 | help |
780 | This option enables the use of the sleep LED as a hard drive | 783 | This option enables the use of the sleep LED as a hard drive |
781 | activity LED. | 784 | activity LED. |
785 | This option is deprecated, it only selects ADB_PMU_LED and | ||
786 | LEDS_TRIGGER_IDE_DISK and changes the code in the new led class | ||
787 | device to default to the ide-disk trigger (which should be set | ||
788 | from userspace via sysfs). | ||
782 | 789 | ||
783 | config BLK_DEV_IDE_SWARM | 790 | config BLK_DEV_IDE_SWARM |
784 | tristate "IDE for Sibyte evaluation boards" | 791 | tristate "IDE for Sibyte evaluation boards" |
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 935cb2583770..26ceab1e90bb 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -505,7 +505,7 @@ static ide_startstop_t ide_ata_error(ide_drive_t *drive, struct request *rq, u8 | |||
505 | } | 505 | } |
506 | } | 506 | } |
507 | 507 | ||
508 | if ((stat & DRQ_STAT) && rq_data_dir(rq) == READ) | 508 | if ((stat & DRQ_STAT) && rq_data_dir(rq) == READ && hwif->err_stops_fifo == 0) |
509 | try_to_flush_leftover_data(drive); | 509 | try_to_flush_leftover_data(drive); |
510 | 510 | ||
511 | if (hwif->INB(IDE_STATUS_REG) & (BUSY_STAT|DRQ_STAT)) | 511 | if (hwif->INB(IDE_STATUS_REG) & (BUSY_STAT|DRQ_STAT)) |
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 97a49e77a8f1..32117f0ec5c0 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
@@ -597,6 +597,10 @@ u8 eighty_ninty_three (ide_drive_t *drive) | |||
597 | { | 597 | { |
598 | if(HWIF(drive)->udma_four == 0) | 598 | if(HWIF(drive)->udma_four == 0) |
599 | return 0; | 599 | return 0; |
600 | |||
601 | /* Check for SATA but only if we are ATA5 or higher */ | ||
602 | if (drive->id->hw_config == 0 && (drive->id->major_rev_num & 0x7FE0)) | ||
603 | return 1; | ||
600 | if (!(drive->id->hw_config & 0x6000)) | 604 | if (!(drive->id->hw_config & 0x6000)) |
601 | return 0; | 605 | return 0; |
602 | #ifndef CONFIG_IDEDMA_IVB | 606 | #ifndef CONFIG_IDEDMA_IVB |
diff --git a/drivers/ide/pci/aec62xx.c b/drivers/ide/pci/aec62xx.c index c743e68c33aa..3edd7060510f 100644 --- a/drivers/ide/pci/aec62xx.c +++ b/drivers/ide/pci/aec62xx.c | |||
@@ -22,7 +22,7 @@ struct chipset_bus_clock_list_entry { | |||
22 | u8 ultra_settings; | 22 | u8 ultra_settings; |
23 | }; | 23 | }; |
24 | 24 | ||
25 | static struct chipset_bus_clock_list_entry aec6xxx_33_base [] = { | 25 | static const struct chipset_bus_clock_list_entry aec6xxx_33_base [] = { |
26 | { XFER_UDMA_6, 0x31, 0x07 }, | 26 | { XFER_UDMA_6, 0x31, 0x07 }, |
27 | { XFER_UDMA_5, 0x31, 0x06 }, | 27 | { XFER_UDMA_5, 0x31, 0x06 }, |
28 | { XFER_UDMA_4, 0x31, 0x05 }, | 28 | { XFER_UDMA_4, 0x31, 0x05 }, |
@@ -42,7 +42,7 @@ static struct chipset_bus_clock_list_entry aec6xxx_33_base [] = { | |||
42 | { 0, 0x00, 0x00 } | 42 | { 0, 0x00, 0x00 } |
43 | }; | 43 | }; |
44 | 44 | ||
45 | static struct chipset_bus_clock_list_entry aec6xxx_34_base [] = { | 45 | static const struct chipset_bus_clock_list_entry aec6xxx_34_base [] = { |
46 | { XFER_UDMA_6, 0x41, 0x06 }, | 46 | { XFER_UDMA_6, 0x41, 0x06 }, |
47 | { XFER_UDMA_5, 0x41, 0x05 }, | 47 | { XFER_UDMA_5, 0x41, 0x05 }, |
48 | { XFER_UDMA_4, 0x41, 0x04 }, | 48 | { XFER_UDMA_4, 0x41, 0x04 }, |
@@ -254,7 +254,8 @@ static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev, const ch | |||
254 | 254 | ||
255 | if (dev->resource[PCI_ROM_RESOURCE].start) { | 255 | if (dev->resource[PCI_ROM_RESOURCE].start) { |
256 | pci_write_config_dword(dev, PCI_ROM_ADDRESS, dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); | 256 | pci_write_config_dword(dev, PCI_ROM_ADDRESS, dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); |
257 | printk(KERN_INFO "%s: ROM enabled at 0x%08lx\n", name, dev->resource[PCI_ROM_RESOURCE].start); | 257 | printk(KERN_INFO "%s: ROM enabled at 0x%08lx\n", name, |
258 | (unsigned long)dev->resource[PCI_ROM_RESOURCE].start); | ||
258 | } | 259 | } |
259 | 260 | ||
260 | if (bus_speed <= 33) | 261 | if (bus_speed <= 33) |
@@ -425,12 +426,12 @@ static int __devinit aec62xx_init_one(struct pci_dev *dev, const struct pci_devi | |||
425 | return d->init_setup(dev, d); | 426 | return d->init_setup(dev, d); |
426 | } | 427 | } |
427 | 428 | ||
428 | static struct pci_device_id aec62xx_pci_tbl[] = { | 429 | static const struct pci_device_id aec62xx_pci_tbl[] = { |
429 | { PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP850UF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, | 430 | { PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP850UF), 0 }, |
430 | { PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP860, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 }, | 431 | { PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP860), 1 }, |
431 | { PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP860R, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 }, | 432 | { PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP860R), 2 }, |
432 | { PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP865, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3 }, | 433 | { PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP865), 3 }, |
433 | { PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP865R, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 }, | 434 | { PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP865R), 4 }, |
434 | { 0, }, | 435 | { 0, }, |
435 | }; | 436 | }; |
436 | MODULE_DEVICE_TABLE(pci, aec62xx_pci_tbl); | 437 | MODULE_DEVICE_TABLE(pci, aec62xx_pci_tbl); |
diff --git a/drivers/ide/pci/cmd64x.c b/drivers/ide/pci/cmd64x.c index 3d9c7afc8695..92b7b1549b16 100644 --- a/drivers/ide/pci/cmd64x.c +++ b/drivers/ide/pci/cmd64x.c | |||
@@ -190,14 +190,6 @@ static int cmd64x_get_info (char *buffer, char **addr, off_t offset, int count) | |||
190 | #endif /* defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_PROC_FS) */ | 190 | #endif /* defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_PROC_FS) */ |
191 | 191 | ||
192 | /* | 192 | /* |
193 | * Registers and masks for easy access by drive index: | ||
194 | */ | ||
195 | #if 0 | ||
196 | static u8 prefetch_regs[4] = {CNTRL, CNTRL, ARTTIM23, ARTTIM23}; | ||
197 | static u8 prefetch_masks[4] = {CNTRL_DIS_RA0, CNTRL_DIS_RA1, ARTTIM23_DIS_RA2, ARTTIM23_DIS_RA3}; | ||
198 | #endif | ||
199 | |||
200 | /* | ||
201 | * This routine writes the prepared setup/active/recovery counts | 193 | * This routine writes the prepared setup/active/recovery counts |
202 | * for a drive into the cmd646 chipset registers to active them. | 194 | * for a drive into the cmd646 chipset registers to active them. |
203 | */ | 195 | */ |
@@ -606,13 +598,6 @@ static unsigned int __devinit init_chipset_cmd64x(struct pci_dev *dev, const cha | |||
606 | pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev); | 598 | pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev); |
607 | class_rev &= 0xff; | 599 | class_rev &= 0xff; |
608 | 600 | ||
609 | #ifdef __i386__ | ||
610 | if (dev->resource[PCI_ROM_RESOURCE].start) { | ||
611 | pci_write_config_dword(dev, PCI_ROM_ADDRESS, dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); | ||
612 | printk(KERN_INFO "%s: ROM enabled at 0x%08lx\n", name, dev->resource[PCI_ROM_RESOURCE].start); | ||
613 | } | ||
614 | #endif | ||
615 | |||
616 | switch(dev->device) { | 601 | switch(dev->device) { |
617 | case PCI_DEVICE_ID_CMD_643: | 602 | case PCI_DEVICE_ID_CMD_643: |
618 | break; | 603 | break; |
diff --git a/drivers/ide/pci/hpt34x.c b/drivers/ide/pci/hpt34x.c index be334da7a754..7da550281cf2 100644 --- a/drivers/ide/pci/hpt34x.c +++ b/drivers/ide/pci/hpt34x.c | |||
@@ -176,7 +176,7 @@ static unsigned int __devinit init_chipset_hpt34x(struct pci_dev *dev, const cha | |||
176 | pci_write_config_dword(dev, PCI_ROM_ADDRESS, | 176 | pci_write_config_dword(dev, PCI_ROM_ADDRESS, |
177 | dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); | 177 | dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); |
178 | printk(KERN_INFO "HPT345: ROM enabled at 0x%08lx\n", | 178 | printk(KERN_INFO "HPT345: ROM enabled at 0x%08lx\n", |
179 | dev->resource[PCI_ROM_RESOURCE].start); | 179 | (unsigned long)dev->resource[PCI_ROM_RESOURCE].start); |
180 | } | 180 | } |
181 | pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0xF0); | 181 | pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0xF0); |
182 | } else { | 182 | } else { |
diff --git a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c index acd63173199b..5a8334d134fb 100644 --- a/drivers/ide/pci/pdc202xx_new.c +++ b/drivers/ide/pci/pdc202xx_new.c | |||
@@ -313,8 +313,8 @@ static unsigned int __devinit init_chipset_pdcnew(struct pci_dev *dev, const cha | |||
313 | if (dev->resource[PCI_ROM_RESOURCE].start) { | 313 | if (dev->resource[PCI_ROM_RESOURCE].start) { |
314 | pci_write_config_dword(dev, PCI_ROM_ADDRESS, | 314 | pci_write_config_dword(dev, PCI_ROM_ADDRESS, |
315 | dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); | 315 | dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); |
316 | printk(KERN_INFO "%s: ROM enabled at 0x%08lx\n", | 316 | printk(KERN_INFO "%s: ROM enabled at 0x%08lx\n", name, |
317 | name, dev->resource[PCI_ROM_RESOURCE].start); | 317 | (unsigned long)dev->resource[PCI_ROM_RESOURCE].start); |
318 | } | 318 | } |
319 | 319 | ||
320 | #ifdef CONFIG_PPC_PMAC | 320 | #ifdef CONFIG_PPC_PMAC |
@@ -338,6 +338,8 @@ static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif) | |||
338 | hwif->ultra_mask = 0x7f; | 338 | hwif->ultra_mask = 0x7f; |
339 | hwif->mwdma_mask = 0x07; | 339 | hwif->mwdma_mask = 0x07; |
340 | 340 | ||
341 | hwif->err_stops_fifo = 1; | ||
342 | |||
341 | hwif->ide_dma_check = &pdcnew_config_drive_xfer_rate; | 343 | hwif->ide_dma_check = &pdcnew_config_drive_xfer_rate; |
342 | hwif->ide_dma_lostirq = &pdcnew_ide_dma_lostirq; | 344 | hwif->ide_dma_lostirq = &pdcnew_ide_dma_lostirq; |
343 | hwif->ide_dma_timeout = &pdcnew_ide_dma_timeout; | 345 | hwif->ide_dma_timeout = &pdcnew_ide_dma_timeout; |
diff --git a/drivers/ide/pci/pdc202xx_old.c b/drivers/ide/pci/pdc202xx_old.c index 22d17548ecdb..1e209d8f9437 100644 --- a/drivers/ide/pci/pdc202xx_old.c +++ b/drivers/ide/pci/pdc202xx_old.c | |||
@@ -101,31 +101,6 @@ static const char *pdc_quirk_drives[] = { | |||
101 | #define MC1 0x02 /* DMA"C" timing */ | 101 | #define MC1 0x02 /* DMA"C" timing */ |
102 | #define MC0 0x01 /* DMA"C" timing */ | 102 | #define MC0 0x01 /* DMA"C" timing */ |
103 | 103 | ||
104 | #if 0 | ||
105 | unsigned long bibma = pci_resource_start(dev, 4); | ||
106 | u8 hi = 0, lo = 0; | ||
107 | |||
108 | u8 sc1c = inb_p((u16)bibma + 0x1c); | ||
109 | u8 sc1e = inb_p((u16)bibma + 0x1e); | ||
110 | u8 sc1f = inb_p((u16)bibma + 0x1f); | ||
111 | |||
112 | p += sprintf(p, "Host Mode : %s\n", | ||
113 | (sc1f & 0x08) ? "Tri-Stated" : "Normal"); | ||
114 | p += sprintf(p, "Bus Clocking : %s\n", | ||
115 | ((sc1f & 0xC0) == 0xC0) ? "100 External" : | ||
116 | ((sc1f & 0x80) == 0x80) ? "66 External" : | ||
117 | ((sc1f & 0x40) == 0x40) ? "33 External" : "33 PCI Internal"); | ||
118 | p += sprintf(p, "IO pad select : %s mA\n", | ||
119 | ((sc1c & 0x03) == 0x03) ? "10" : | ||
120 | ((sc1c & 0x02) == 0x02) ? "8" : | ||
121 | ((sc1c & 0x01) == 0x01) ? "6" : | ||
122 | ((sc1c & 0x00) == 0x00) ? "4" : "??"); | ||
123 | hi = sc1e >> 4; | ||
124 | lo = sc1e & 0xf; | ||
125 | p += sprintf(p, "Status Polling Period : %d\n", hi); | ||
126 | p += sprintf(p, "Interrupt Check Status Polling Delay : %d\n", lo); | ||
127 | #endif | ||
128 | |||
129 | static u8 pdc202xx_ratemask (ide_drive_t *drive) | 104 | static u8 pdc202xx_ratemask (ide_drive_t *drive) |
130 | { | 105 | { |
131 | u8 mode; | 106 | u8 mode; |
@@ -505,73 +480,20 @@ static void pdc202xx_reset (ide_drive_t *drive) | |||
505 | 480 | ||
506 | pdc202xx_reset_host(hwif); | 481 | pdc202xx_reset_host(hwif); |
507 | pdc202xx_reset_host(mate); | 482 | pdc202xx_reset_host(mate); |
508 | #if 0 | ||
509 | /* | ||
510 | * FIXME: Have to kick all the drives again :-/ | ||
511 | * What a pain in the ACE! | ||
512 | */ | ||
513 | if (hwif->present) { | ||
514 | u16 hunit = 0; | ||
515 | for (hunit = 0; hunit < MAX_DRIVES; ++hunit) { | ||
516 | ide_drive_t *hdrive = &hwif->drives[hunit]; | ||
517 | if (hdrive->present) { | ||
518 | if (hwif->ide_dma_check) | ||
519 | hwif->ide_dma_check(hdrive); | ||
520 | else | ||
521 | hwif->tuneproc(hdrive, 5); | ||
522 | } | ||
523 | } | ||
524 | } | ||
525 | if (mate->present) { | ||
526 | u16 munit = 0; | ||
527 | for (munit = 0; munit < MAX_DRIVES; ++munit) { | ||
528 | ide_drive_t *mdrive = &mate->drives[munit]; | ||
529 | if (mdrive->present) { | ||
530 | if (mate->ide_dma_check) | ||
531 | mate->ide_dma_check(mdrive); | ||
532 | else | ||
533 | mate->tuneproc(mdrive, 5); | ||
534 | } | ||
535 | } | ||
536 | } | ||
537 | #else | ||
538 | hwif->tuneproc(drive, 5); | 483 | hwif->tuneproc(drive, 5); |
539 | #endif | ||
540 | } | 484 | } |
541 | 485 | ||
542 | static unsigned int __devinit init_chipset_pdc202xx(struct pci_dev *dev, const char *name) | 486 | static unsigned int __devinit init_chipset_pdc202xx(struct pci_dev *dev, |
487 | const char *name) | ||
543 | { | 488 | { |
489 | /* This doesn't appear needed */ | ||
544 | if (dev->resource[PCI_ROM_RESOURCE].start) { | 490 | if (dev->resource[PCI_ROM_RESOURCE].start) { |
545 | pci_write_config_dword(dev, PCI_ROM_ADDRESS, | 491 | pci_write_config_dword(dev, PCI_ROM_ADDRESS, |
546 | dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); | 492 | dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); |
547 | printk(KERN_INFO "%s: ROM enabled at 0x%08lx\n", | 493 | printk(KERN_INFO "%s: ROM enabled at 0x%08lx\n", name, |
548 | name, dev->resource[PCI_ROM_RESOURCE].start); | 494 | (unsigned long)dev->resource[PCI_ROM_RESOURCE].start); |
549 | } | ||
550 | |||
551 | /* | ||
552 | * software reset - this is required because the bios | ||
553 | * will set UDMA timing on if the hdd supports it. The | ||
554 | * user may want to turn udma off. A bug in the pdc20262 | ||
555 | * is that it cannot handle a downgrade in timing from | ||
556 | * UDMA to DMA. Disk accesses after issuing a set | ||
557 | * feature command will result in errors. A software | ||
558 | * reset leaves the timing registers intact, | ||
559 | * but resets the drives. | ||
560 | */ | ||
561 | #if 0 | ||
562 | if ((dev->device == PCI_DEVICE_ID_PROMISE_20267) || | ||
563 | (dev->device == PCI_DEVICE_ID_PROMISE_20265) || | ||
564 | (dev->device == PCI_DEVICE_ID_PROMISE_20263) || | ||
565 | (dev->device == PCI_DEVICE_ID_PROMISE_20262)) { | ||
566 | unsigned long high_16 = pci_resource_start(dev, 4); | ||
567 | byte udma_speed_flag = inb(high_16 + 0x001f); | ||
568 | outb(udma_speed_flag | 0x10, high_16 + 0x001f); | ||
569 | mdelay(100); | ||
570 | outb(udma_speed_flag & ~0x10, high_16 + 0x001f); | ||
571 | mdelay(2000); /* 2 seconds ?! */ | ||
572 | } | 495 | } |
573 | 496 | ||
574 | #endif | ||
575 | return dev->irq; | 497 | return dev->irq; |
576 | } | 498 | } |
577 | 499 | ||
@@ -599,6 +521,8 @@ static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif) | |||
599 | hwif->mwdma_mask = 0x07; | 521 | hwif->mwdma_mask = 0x07; |
600 | hwif->swdma_mask = 0x07; | 522 | hwif->swdma_mask = 0x07; |
601 | 523 | ||
524 | hwif->err_stops_fifo = 1; | ||
525 | |||
602 | hwif->ide_dma_check = &pdc202xx_config_drive_xfer_rate; | 526 | hwif->ide_dma_check = &pdc202xx_config_drive_xfer_rate; |
603 | hwif->ide_dma_lostirq = &pdc202xx_ide_dma_lostirq; | 527 | hwif->ide_dma_lostirq = &pdc202xx_ide_dma_lostirq; |
604 | hwif->ide_dma_timeout = &pdc202xx_ide_dma_timeout; | 528 | hwif->ide_dma_timeout = &pdc202xx_ide_dma_timeout; |
@@ -687,19 +611,6 @@ static int __devinit init_setup_pdc202ata4(struct pci_dev *dev, | |||
687 | "mirror fixed.\n", d->name); | 611 | "mirror fixed.\n", d->name); |
688 | } | 612 | } |
689 | } | 613 | } |
690 | |||
691 | #if 0 | ||
692 | if (dev->device == PCI_DEVICE_ID_PROMISE_20262) | ||
693 | if (e->reg && (pci_read_config_byte(dev, e->reg, &tmp) || | ||
694 | (tmp & e->mask) != e->val)) | ||
695 | |||
696 | if (d->enablebits[0].reg != d->enablebits[1].reg) { | ||
697 | d->enablebits[0].reg = d->enablebits[1].reg; | ||
698 | d->enablebits[0].mask = d->enablebits[1].mask; | ||
699 | d->enablebits[0].val = d->enablebits[1].val; | ||
700 | } | ||
701 | #endif | ||
702 | |||
703 | return ide_setup_pci_device(dev, d); | 614 | return ide_setup_pci_device(dev, d); |
704 | } | 615 | } |
705 | 616 | ||
@@ -714,22 +625,6 @@ static int __devinit init_setup_pdc20265(struct pci_dev *dev, | |||
714 | "attached to I2O RAID controller.\n"); | 625 | "attached to I2O RAID controller.\n"); |
715 | return -ENODEV; | 626 | return -ENODEV; |
716 | } | 627 | } |
717 | |||
718 | #if 0 | ||
719 | { | ||
720 | u8 pri = 0, sec = 0; | ||
721 | |||
722 | if (e->reg && (pci_read_config_byte(dev, e->reg, &tmp) || | ||
723 | (tmp & e->mask) != e->val)) | ||
724 | |||
725 | if (d->enablebits[0].reg != d->enablebits[1].reg) { | ||
726 | d->enablebits[0].reg = d->enablebits[1].reg; | ||
727 | d->enablebits[0].mask = d->enablebits[1].mask; | ||
728 | d->enablebits[0].val = d->enablebits[1].val; | ||
729 | } | ||
730 | } | ||
731 | #endif | ||
732 | |||
733 | return ide_setup_pci_device(dev, d); | 628 | return ide_setup_pci_device(dev, d); |
734 | } | 629 | } |
735 | 630 | ||
diff --git a/drivers/ide/pci/sc1200.c b/drivers/ide/pci/sc1200.c index 24e21b2838c1..778b82ae964d 100644 --- a/drivers/ide/pci/sc1200.c +++ b/drivers/ide/pci/sc1200.c | |||
@@ -395,7 +395,6 @@ static int sc1200_resume (struct pci_dev *dev) | |||
395 | { | 395 | { |
396 | ide_hwif_t *hwif = NULL; | 396 | ide_hwif_t *hwif = NULL; |
397 | 397 | ||
398 | printk("SC1200: resume\n"); | ||
399 | pci_set_power_state(dev, PCI_D0); // bring chip back from sleep state | 398 | pci_set_power_state(dev, PCI_D0); // bring chip back from sleep state |
400 | dev->current_state = PM_EVENT_ON; | 399 | dev->current_state = PM_EVENT_ON; |
401 | pci_enable_device(dev); | 400 | pci_enable_device(dev); |
@@ -405,7 +404,6 @@ printk("SC1200: resume\n"); | |||
405 | while ((hwif = lookup_pci_dev(hwif, dev)) != NULL) { | 404 | while ((hwif = lookup_pci_dev(hwif, dev)) != NULL) { |
406 | unsigned int basereg, r, d, format; | 405 | unsigned int basereg, r, d, format; |
407 | sc1200_saved_state_t *ss = (sc1200_saved_state_t *)hwif->config_data; | 406 | sc1200_saved_state_t *ss = (sc1200_saved_state_t *)hwif->config_data; |
408 | printk("%s: SC1200: resume\n", hwif->name); | ||
409 | 407 | ||
410 | // | 408 | // |
411 | // Restore timing registers: this may be unnecessary if BIOS also does it | 409 | // Restore timing registers: this may be unnecessary if BIOS also does it |
@@ -493,7 +491,7 @@ static int __devinit sc1200_init_one(struct pci_dev *dev, const struct pci_devic | |||
493 | } | 491 | } |
494 | 492 | ||
495 | static struct pci_device_id sc1200_pci_tbl[] = { | 493 | static struct pci_device_id sc1200_pci_tbl[] = { |
496 | { PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_SCx200_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 494 | { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_SCx200_IDE), 0}, |
497 | { 0, }, | 495 | { 0, }, |
498 | }; | 496 | }; |
499 | MODULE_DEVICE_TABLE(pci, sc1200_pci_tbl); | 497 | MODULE_DEVICE_TABLE(pci, sc1200_pci_tbl); |
diff --git a/drivers/ide/pci/serverworks.c b/drivers/ide/pci/serverworks.c index 0d3073f4eab4..5100b827a935 100644 --- a/drivers/ide/pci/serverworks.c +++ b/drivers/ide/pci/serverworks.c | |||
@@ -123,11 +123,11 @@ static u8 svwks_csb_check (struct pci_dev *dev) | |||
123 | } | 123 | } |
124 | static int svwks_tune_chipset (ide_drive_t *drive, u8 xferspeed) | 124 | static int svwks_tune_chipset (ide_drive_t *drive, u8 xferspeed) |
125 | { | 125 | { |
126 | u8 udma_modes[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; | 126 | static const u8 udma_modes[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; |
127 | u8 dma_modes[] = { 0x77, 0x21, 0x20 }; | 127 | static const u8 dma_modes[] = { 0x77, 0x21, 0x20 }; |
128 | u8 pio_modes[] = { 0x5d, 0x47, 0x34, 0x22, 0x20 }; | 128 | static const u8 pio_modes[] = { 0x5d, 0x47, 0x34, 0x22, 0x20 }; |
129 | u8 drive_pci[] = { 0x41, 0x40, 0x43, 0x42 }; | 129 | static const u8 drive_pci[] = { 0x41, 0x40, 0x43, 0x42 }; |
130 | u8 drive_pci2[] = { 0x45, 0x44, 0x47, 0x46 }; | 130 | static const u8 drive_pci2[] = { 0x45, 0x44, 0x47, 0x46 }; |
131 | 131 | ||
132 | ide_hwif_t *hwif = HWIF(drive); | 132 | ide_hwif_t *hwif = HWIF(drive); |
133 | struct pci_dev *dev = hwif->pci_dev; | 133 | struct pci_dev *dev = hwif->pci_dev; |
@@ -392,16 +392,6 @@ static unsigned int __devinit init_chipset_svwks (struct pci_dev *dev, const cha | |||
392 | } | 392 | } |
393 | outb_p(0x06, 0x0c00); | 393 | outb_p(0x06, 0x0c00); |
394 | dev->irq = inb_p(0x0c01); | 394 | dev->irq = inb_p(0x0c01); |
395 | #if 0 | ||
396 | printk("%s: device class (0x%04x)\n", | ||
397 | name, dev->class); | ||
398 | if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE) { | ||
399 | dev->class &= ~0x000F0F00; | ||
400 | // dev->class |= ~0x00000400; | ||
401 | dev->class |= ~0x00010100; | ||
402 | /**/ | ||
403 | } | ||
404 | #endif | ||
405 | } else { | 395 | } else { |
406 | struct pci_dev * findev = NULL; | 396 | struct pci_dev * findev = NULL; |
407 | u8 reg41 = 0; | 397 | u8 reg41 = 0; |
@@ -452,7 +442,7 @@ static unsigned int __devinit init_chipset_svwks (struct pci_dev *dev, const cha | |||
452 | pci_write_config_byte(dev, 0x5A, btr); | 442 | pci_write_config_byte(dev, 0x5A, btr); |
453 | } | 443 | } |
454 | 444 | ||
455 | return (dev->irq) ? dev->irq : 0; | 445 | return dev->irq; |
456 | } | 446 | } |
457 | 447 | ||
458 | static unsigned int __devinit ata66_svwks_svwks (ide_hwif_t *hwif) | 448 | static unsigned int __devinit ata66_svwks_svwks (ide_hwif_t *hwif) |
@@ -500,11 +490,6 @@ static unsigned int __devinit ata66_svwks (ide_hwif_t *hwif) | |||
500 | { | 490 | { |
501 | struct pci_dev *dev = hwif->pci_dev; | 491 | struct pci_dev *dev = hwif->pci_dev; |
502 | 492 | ||
503 | /* Per Specified Design by OEM, and ASIC Architect */ | ||
504 | if ((dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE) || | ||
505 | (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2)) | ||
506 | return 1; | ||
507 | |||
508 | /* Server Works */ | 493 | /* Server Works */ |
509 | if (dev->subsystem_vendor == PCI_VENDOR_ID_SERVERWORKS) | 494 | if (dev->subsystem_vendor == PCI_VENDOR_ID_SERVERWORKS) |
510 | return ata66_svwks_svwks (hwif); | 495 | return ata66_svwks_svwks (hwif); |
@@ -517,10 +502,14 @@ static unsigned int __devinit ata66_svwks (ide_hwif_t *hwif) | |||
517 | if (dev->subsystem_vendor == PCI_VENDOR_ID_SUN) | 502 | if (dev->subsystem_vendor == PCI_VENDOR_ID_SUN) |
518 | return ata66_svwks_cobalt (hwif); | 503 | return ata66_svwks_cobalt (hwif); |
519 | 504 | ||
505 | /* Per Specified Design by OEM, and ASIC Architect */ | ||
506 | if ((dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE) || | ||
507 | (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2)) | ||
508 | return 1; | ||
509 | |||
520 | return 0; | 510 | return 0; |
521 | } | 511 | } |
522 | 512 | ||
523 | #undef CAN_SW_DMA | ||
524 | static void __devinit init_hwif_svwks (ide_hwif_t *hwif) | 513 | static void __devinit init_hwif_svwks (ide_hwif_t *hwif) |
525 | { | 514 | { |
526 | u8 dma_stat = 0; | 515 | u8 dma_stat = 0; |
@@ -537,9 +526,6 @@ static void __devinit init_hwif_svwks (ide_hwif_t *hwif) | |||
537 | hwif->ultra_mask = 0x3f; | 526 | hwif->ultra_mask = 0x3f; |
538 | 527 | ||
539 | hwif->mwdma_mask = 0x07; | 528 | hwif->mwdma_mask = 0x07; |
540 | #ifdef CAN_SW_DMA | ||
541 | hwif->swdma_mask = 0x07; | ||
542 | #endif /* CAN_SW_DMA */ | ||
543 | 529 | ||
544 | hwif->autodma = 0; | 530 | hwif->autodma = 0; |
545 | 531 | ||
@@ -562,8 +548,6 @@ static void __devinit init_hwif_svwks (ide_hwif_t *hwif) | |||
562 | hwif->drives[1].autodma = (dma_stat & 0x40); | 548 | hwif->drives[1].autodma = (dma_stat & 0x40); |
563 | hwif->drives[0].autotune = (!(dma_stat & 0x20)); | 549 | hwif->drives[0].autotune = (!(dma_stat & 0x20)); |
564 | hwif->drives[1].autotune = (!(dma_stat & 0x40)); | 550 | hwif->drives[1].autotune = (!(dma_stat & 0x40)); |
565 | // hwif->drives[0].autodma = hwif->autodma; | ||
566 | // hwif->drives[1].autodma = hwif->autodma; | ||
567 | } | 551 | } |
568 | 552 | ||
569 | /* | 553 | /* |
@@ -593,11 +577,6 @@ static int __devinit init_setup_csb6 (struct pci_dev *dev, ide_pci_device_t *d) | |||
593 | if (dev->resource[0].start == 0x01f1) | 577 | if (dev->resource[0].start == 0x01f1) |
594 | d->bootable = ON_BOARD; | 578 | d->bootable = ON_BOARD; |
595 | } | 579 | } |
596 | #if 0 | ||
597 | if ((IDE_PCI_DEVID_EQ(d->devid, DEVID_CSB6) && | ||
598 | (!(PCI_FUNC(dev->devfn) & 1))) | ||
599 | d->autodma = AUTODMA; | ||
600 | #endif | ||
601 | 580 | ||
602 | d->channels = ((dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE || | 581 | d->channels = ((dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE || |
603 | dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2) && | 582 | dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2) && |
@@ -671,11 +650,11 @@ static int __devinit svwks_init_one(struct pci_dev *dev, const struct pci_device | |||
671 | } | 650 | } |
672 | 651 | ||
673 | static struct pci_device_id svwks_pci_tbl[] = { | 652 | static struct pci_device_id svwks_pci_tbl[] = { |
674 | { PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_OSB4IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 653 | { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_OSB4IDE), 0}, |
675 | { PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1}, | 654 | { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE), 1}, |
676 | { PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2}, | 655 | { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE), 2}, |
677 | { PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3}, | 656 | { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2), 3}, |
678 | { PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4}, | 657 | { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000IDE), 4}, |
679 | { 0, }, | 658 | { 0, }, |
680 | }; | 659 | }; |
681 | MODULE_DEVICE_TABLE(pci, svwks_pci_tbl); | 660 | MODULE_DEVICE_TABLE(pci, svwks_pci_tbl); |
diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c index f1ca154dd52c..72dade14c725 100644 --- a/drivers/ide/pci/siimage.c +++ b/drivers/ide/pci/siimage.c | |||
@@ -38,9 +38,6 @@ | |||
38 | 38 | ||
39 | #include <asm/io.h> | 39 | #include <asm/io.h> |
40 | 40 | ||
41 | #undef SIIMAGE_VIRTUAL_DMAPIO | ||
42 | #undef SIIMAGE_LARGE_DMA | ||
43 | |||
44 | /** | 41 | /** |
45 | * pdev_is_sata - check if device is SATA | 42 | * pdev_is_sata - check if device is SATA |
46 | * @pdev: PCI device to check | 43 | * @pdev: PCI device to check |
@@ -461,36 +458,6 @@ static int siimage_io_ide_dma_test_irq (ide_drive_t *drive) | |||
461 | return 0; | 458 | return 0; |
462 | } | 459 | } |
463 | 460 | ||
464 | #if 0 | ||
465 | /** | ||
466 | * siimage_mmio_ide_dma_count - DMA bytes done | ||
467 | * @drive | ||
468 | * | ||
469 | * If we are doing VDMA the CMD680 requires a little bit | ||
470 | * of more careful handling and we have to read the counts | ||
471 | * off ourselves. For non VDMA life is normal. | ||
472 | */ | ||
473 | |||
474 | static int siimage_mmio_ide_dma_count (ide_drive_t *drive) | ||
475 | { | ||
476 | #ifdef SIIMAGE_VIRTUAL_DMAPIO | ||
477 | struct request *rq = HWGROUP(drive)->rq; | ||
478 | ide_hwif_t *hwif = HWIF(drive); | ||
479 | u32 count = (rq->nr_sectors * SECTOR_SIZE); | ||
480 | u32 rcount = 0; | ||
481 | unsigned long addr = siimage_selreg(hwif, 0x1C); | ||
482 | |||
483 | hwif->OUTL(count, addr); | ||
484 | rcount = hwif->INL(addr); | ||
485 | |||
486 | printk("\n%s: count = %d, rcount = %d, nr_sectors = %lu\n", | ||
487 | drive->name, count, rcount, rq->nr_sectors); | ||
488 | |||
489 | #endif /* SIIMAGE_VIRTUAL_DMAPIO */ | ||
490 | return __ide_dma_count(drive); | ||
491 | } | ||
492 | #endif | ||
493 | |||
494 | /** | 461 | /** |
495 | * siimage_mmio_ide_dma_test_irq - check we caused an IRQ | 462 | * siimage_mmio_ide_dma_test_irq - check we caused an IRQ |
496 | * @drive: drive we are testing | 463 | * @drive: drive we are testing |
@@ -512,12 +479,10 @@ static int siimage_mmio_ide_dma_test_irq (ide_drive_t *drive) | |||
512 | u32 sata_error = hwif->INL(SATA_ERROR_REG); | 479 | u32 sata_error = hwif->INL(SATA_ERROR_REG); |
513 | hwif->OUTL(sata_error, SATA_ERROR_REG); | 480 | hwif->OUTL(sata_error, SATA_ERROR_REG); |
514 | watchdog = (sata_error & 0x00680000) ? 1 : 0; | 481 | watchdog = (sata_error & 0x00680000) ? 1 : 0; |
515 | #if 1 | ||
516 | printk(KERN_WARNING "%s: sata_error = 0x%08x, " | 482 | printk(KERN_WARNING "%s: sata_error = 0x%08x, " |
517 | "watchdog = %d, %s\n", | 483 | "watchdog = %d, %s\n", |
518 | drive->name, sata_error, watchdog, | 484 | drive->name, sata_error, watchdog, |
519 | __FUNCTION__); | 485 | __FUNCTION__); |
520 | #endif | ||
521 | 486 | ||
522 | } else { | 487 | } else { |
523 | watchdog = (ext_stat & 0x8000) ? 1 : 0; | 488 | watchdog = (ext_stat & 0x8000) ? 1 : 0; |
@@ -863,7 +828,7 @@ static unsigned int __devinit init_chipset_siimage(struct pci_dev *dev, const ch | |||
863 | * time. | 828 | * time. |
864 | * | 829 | * |
865 | * The hardware supports buffered taskfiles and also some rather nice | 830 | * The hardware supports buffered taskfiles and also some rather nice |
866 | * extended PRD tables. Unfortunately right now we don't. | 831 | * extended PRD tables. For better SI3112 support use the libata driver |
867 | */ | 832 | */ |
868 | 833 | ||
869 | static void __devinit init_mmio_iops_siimage(ide_hwif_t *hwif) | 834 | static void __devinit init_mmio_iops_siimage(ide_hwif_t *hwif) |
@@ -900,9 +865,6 @@ static void __devinit init_mmio_iops_siimage(ide_hwif_t *hwif) | |||
900 | * so we can't currently use it sanely since we want to | 865 | * so we can't currently use it sanely since we want to |
901 | * use LBA48 mode. | 866 | * use LBA48 mode. |
902 | */ | 867 | */ |
903 | // base += 0x10; | ||
904 | // hwif->no_lba48 = 1; | ||
905 | |||
906 | hw.io_ports[IDE_DATA_OFFSET] = base; | 868 | hw.io_ports[IDE_DATA_OFFSET] = base; |
907 | hw.io_ports[IDE_ERROR_OFFSET] = base + 1; | 869 | hw.io_ports[IDE_ERROR_OFFSET] = base + 1; |
908 | hw.io_ports[IDE_NSECTOR_OFFSET] = base + 2; | 870 | hw.io_ports[IDE_NSECTOR_OFFSET] = base + 2; |
@@ -936,15 +898,8 @@ static void __devinit init_mmio_iops_siimage(ide_hwif_t *hwif) | |||
936 | 898 | ||
937 | base = (unsigned long) addr; | 899 | base = (unsigned long) addr; |
938 | 900 | ||
939 | #ifdef SIIMAGE_LARGE_DMA | ||
940 | /* Watch the brackets - even Ken and Dennis get some language design wrong */ | ||
941 | hwif->dma_base = base + (ch ? 0x18 : 0x10); | ||
942 | hwif->dma_base2 = base + (ch ? 0x08 : 0x00); | ||
943 | hwif->dma_prdtable = hwif->dma_base2 + 4; | ||
944 | #else /* ! SIIMAGE_LARGE_DMA */ | ||
945 | hwif->dma_base = base + (ch ? 0x08 : 0x00); | 901 | hwif->dma_base = base + (ch ? 0x08 : 0x00); |
946 | hwif->dma_base2 = base + (ch ? 0x18 : 0x10); | 902 | hwif->dma_base2 = base + (ch ? 0x18 : 0x10); |
947 | #endif /* SIIMAGE_LARGE_DMA */ | ||
948 | hwif->mmio = 2; | 903 | hwif->mmio = 2; |
949 | } | 904 | } |
950 | 905 | ||
@@ -1052,9 +1007,16 @@ static void __devinit init_hwif_siimage(ide_hwif_t *hwif) | |||
1052 | hwif->reset_poll = &siimage_reset_poll; | 1007 | hwif->reset_poll = &siimage_reset_poll; |
1053 | hwif->pre_reset = &siimage_pre_reset; | 1008 | hwif->pre_reset = &siimage_pre_reset; |
1054 | 1009 | ||
1055 | if(is_sata(hwif)) | 1010 | if(is_sata(hwif)) { |
1011 | static int first = 1; | ||
1012 | |||
1056 | hwif->busproc = &siimage_busproc; | 1013 | hwif->busproc = &siimage_busproc; |
1057 | 1014 | ||
1015 | if (first) { | ||
1016 | printk(KERN_INFO "siimage: For full SATA support you should use the libata sata_sil module.\n"); | ||
1017 | first = 0; | ||
1018 | } | ||
1019 | } | ||
1058 | if (!hwif->dma_base) { | 1020 | if (!hwif->dma_base) { |
1059 | hwif->drives[0].autotune = 1; | 1021 | hwif->drives[0].autotune = 1; |
1060 | hwif->drives[1].autotune = 1; | 1022 | hwif->drives[1].autotune = 1; |
@@ -1121,10 +1083,10 @@ static int __devinit siimage_init_one(struct pci_dev *dev, const struct pci_devi | |||
1121 | } | 1083 | } |
1122 | 1084 | ||
1123 | static struct pci_device_id siimage_pci_tbl[] = { | 1085 | static struct pci_device_id siimage_pci_tbl[] = { |
1124 | { PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 1086 | { PCI_DEVICE(PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_680), 0}, |
1125 | #ifdef CONFIG_BLK_DEV_IDE_SATA | 1087 | #ifdef CONFIG_BLK_DEV_IDE_SATA |
1126 | { PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_3112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1}, | 1088 | { PCI_DEVICE(PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_3112), 1}, |
1127 | { PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_1210SA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2}, | 1089 | { PCI_DEVICE(PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_1210SA), 2}, |
1128 | #endif | 1090 | #endif |
1129 | { 0, }, | 1091 | { 0, }, |
1130 | }; | 1092 | }; |
diff --git a/drivers/ide/pci/sl82c105.c b/drivers/ide/pci/sl82c105.c index 8a5c7b286b2b..900301e43818 100644 --- a/drivers/ide/pci/sl82c105.c +++ b/drivers/ide/pci/sl82c105.c | |||
@@ -447,7 +447,6 @@ static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif) | |||
447 | printk(" %s: Winbond 553 bridge revision %d, BM-DMA disabled\n", | 447 | printk(" %s: Winbond 553 bridge revision %d, BM-DMA disabled\n", |
448 | hwif->name, rev); | 448 | hwif->name, rev); |
449 | } else { | 449 | } else { |
450 | #ifdef CONFIG_BLK_DEV_IDEDMA | ||
451 | dma_state |= 0x60; | 450 | dma_state |= 0x60; |
452 | 451 | ||
453 | hwif->atapi_dma = 1; | 452 | hwif->atapi_dma = 1; |
@@ -468,7 +467,6 @@ static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif) | |||
468 | 467 | ||
469 | if (hwif->mate) | 468 | if (hwif->mate) |
470 | hwif->serialized = hwif->mate->serialized = 1; | 469 | hwif->serialized = hwif->mate->serialized = 1; |
471 | #endif /* CONFIG_BLK_DEV_IDEDMA */ | ||
472 | } | 470 | } |
473 | hwif->OUTB(dma_state, hwif->dma_base + 2); | 471 | hwif->OUTB(dma_state, hwif->dma_base + 2); |
474 | } | 472 | } |
@@ -489,7 +487,7 @@ static int __devinit sl82c105_init_one(struct pci_dev *dev, const struct pci_dev | |||
489 | } | 487 | } |
490 | 488 | ||
491 | static struct pci_device_id sl82c105_pci_tbl[] = { | 489 | static struct pci_device_id sl82c105_pci_tbl[] = { |
492 | { PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 490 | { PCI_DEVICE(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105), 0}, |
493 | { 0, }, | 491 | { 0, }, |
494 | }; | 492 | }; |
495 | MODULE_DEVICE_TABLE(pci, sl82c105_pci_tbl); | 493 | MODULE_DEVICE_TABLE(pci, sl82c105_pci_tbl); |
diff --git a/drivers/ide/pci/slc90e66.c b/drivers/ide/pci/slc90e66.c index 5112c726633b..0968f6bc669a 100644 --- a/drivers/ide/pci/slc90e66.c +++ b/drivers/ide/pci/slc90e66.c | |||
@@ -72,7 +72,8 @@ static void slc90e66_tune_drive (ide_drive_t *drive, u8 pio) | |||
72 | u16 master_data; | 72 | u16 master_data; |
73 | u8 slave_data; | 73 | u8 slave_data; |
74 | /* ISP RTC */ | 74 | /* ISP RTC */ |
75 | u8 timings[][2] = { { 0, 0 }, | 75 | static const u8 timings[][2]= { |
76 | { 0, 0 }, | ||
76 | { 0, 0 }, | 77 | { 0, 0 }, |
77 | { 1, 0 }, | 78 | { 1, 0 }, |
78 | { 2, 1 }, | 79 | { 2, 1 }, |
@@ -119,7 +120,6 @@ static int slc90e66_tune_chipset (ide_drive_t *drive, u8 xferspeed) | |||
119 | pci_read_config_word(dev, 0x4a, ®4a); | 120 | pci_read_config_word(dev, 0x4a, ®4a); |
120 | 121 | ||
121 | switch(speed) { | 122 | switch(speed) { |
122 | #ifdef CONFIG_BLK_DEV_IDEDMA | ||
123 | case XFER_UDMA_4: u_speed = 4 << (drive->dn * 4); break; | 123 | case XFER_UDMA_4: u_speed = 4 << (drive->dn * 4); break; |
124 | case XFER_UDMA_3: u_speed = 3 << (drive->dn * 4); break; | 124 | case XFER_UDMA_3: u_speed = 3 << (drive->dn * 4); break; |
125 | case XFER_UDMA_2: u_speed = 2 << (drive->dn * 4); break; | 125 | case XFER_UDMA_2: u_speed = 2 << (drive->dn * 4); break; |
@@ -128,7 +128,6 @@ static int slc90e66_tune_chipset (ide_drive_t *drive, u8 xferspeed) | |||
128 | case XFER_MW_DMA_2: | 128 | case XFER_MW_DMA_2: |
129 | case XFER_MW_DMA_1: | 129 | case XFER_MW_DMA_1: |
130 | case XFER_SW_DMA_2: break; | 130 | case XFER_SW_DMA_2: break; |
131 | #endif /* CONFIG_BLK_DEV_IDEDMA */ | ||
132 | case XFER_PIO_4: | 131 | case XFER_PIO_4: |
133 | case XFER_PIO_3: | 132 | case XFER_PIO_3: |
134 | case XFER_PIO_2: | 133 | case XFER_PIO_2: |
@@ -156,7 +155,6 @@ static int slc90e66_tune_chipset (ide_drive_t *drive, u8 xferspeed) | |||
156 | return (ide_config_drive_speed(drive, speed)); | 155 | return (ide_config_drive_speed(drive, speed)); |
157 | } | 156 | } |
158 | 157 | ||
159 | #ifdef CONFIG_BLK_DEV_IDEDMA | ||
160 | static int slc90e66_config_drive_for_dma (ide_drive_t *drive) | 158 | static int slc90e66_config_drive_for_dma (ide_drive_t *drive) |
161 | { | 159 | { |
162 | u8 speed = ide_dma_speed(drive, slc90e66_ratemask(drive)); | 160 | u8 speed = ide_dma_speed(drive, slc90e66_ratemask(drive)); |
@@ -194,7 +192,6 @@ fast_ata_pio: | |||
194 | /* IORDY not supported */ | 192 | /* IORDY not supported */ |
195 | return 0; | 193 | return 0; |
196 | } | 194 | } |
197 | #endif /* CONFIG_BLK_DEV_IDEDMA */ | ||
198 | 195 | ||
199 | static void __devinit init_hwif_slc90e66 (ide_hwif_t *hwif) | 196 | static void __devinit init_hwif_slc90e66 (ide_hwif_t *hwif) |
200 | { | 197 | { |
@@ -222,7 +219,6 @@ static void __devinit init_hwif_slc90e66 (ide_hwif_t *hwif) | |||
222 | hwif->mwdma_mask = 0x07; | 219 | hwif->mwdma_mask = 0x07; |
223 | hwif->swdma_mask = 0x07; | 220 | hwif->swdma_mask = 0x07; |
224 | 221 | ||
225 | #ifdef CONFIG_BLK_DEV_IDEDMA | ||
226 | if (!(hwif->udma_four)) | 222 | if (!(hwif->udma_four)) |
227 | /* bit[0(1)]: 0:80, 1:40 */ | 223 | /* bit[0(1)]: 0:80, 1:40 */ |
228 | hwif->udma_four = (reg47 & mask) ? 0 : 1; | 224 | hwif->udma_four = (reg47 & mask) ? 0 : 1; |
@@ -232,7 +228,6 @@ static void __devinit init_hwif_slc90e66 (ide_hwif_t *hwif) | |||
232 | hwif->autodma = 1; | 228 | hwif->autodma = 1; |
233 | hwif->drives[0].autodma = hwif->autodma; | 229 | hwif->drives[0].autodma = hwif->autodma; |
234 | hwif->drives[1].autodma = hwif->autodma; | 230 | hwif->drives[1].autodma = hwif->autodma; |
235 | #endif /* !CONFIG_BLK_DEV_IDEDMA */ | ||
236 | } | 231 | } |
237 | 232 | ||
238 | static ide_pci_device_t slc90e66_chipset __devinitdata = { | 233 | static ide_pci_device_t slc90e66_chipset __devinitdata = { |
@@ -250,7 +245,7 @@ static int __devinit slc90e66_init_one(struct pci_dev *dev, const struct pci_dev | |||
250 | } | 245 | } |
251 | 246 | ||
252 | static struct pci_device_id slc90e66_pci_tbl[] = { | 247 | static struct pci_device_id slc90e66_pci_tbl[] = { |
253 | { PCI_VENDOR_ID_EFAR, PCI_DEVICE_ID_EFAR_SLC90E66_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 248 | { PCI_DEVICE(PCI_VENDOR_ID_EFAR, PCI_DEVICE_ID_EFAR_SLC90E66_1), 0}, |
254 | { 0, }, | 249 | { 0, }, |
255 | }; | 250 | }; |
256 | MODULE_DEVICE_TABLE(pci, slc90e66_pci_tbl); | 251 | MODULE_DEVICE_TABLE(pci, slc90e66_pci_tbl); |
diff --git a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c index ffca8b63ee79..e8ef3455ec35 100644 --- a/drivers/ide/ppc/pmac.c +++ b/drivers/ide/ppc/pmac.c | |||
@@ -421,107 +421,6 @@ static void pmac_ide_kauai_selectproc(ide_drive_t *drive); | |||
421 | #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */ | 421 | #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */ |
422 | 422 | ||
423 | /* | 423 | /* |
424 | * Below is the code for blinking the laptop LED along with hard | ||
425 | * disk activity. | ||
426 | */ | ||
427 | |||
428 | #ifdef CONFIG_BLK_DEV_IDE_PMAC_BLINK | ||
429 | |||
430 | /* Set to 50ms minimum led-on time (also used to limit frequency | ||
431 | * of requests sent to the PMU | ||
432 | */ | ||
433 | #define PMU_HD_BLINK_TIME (HZ/50) | ||
434 | |||
435 | static struct adb_request pmu_blink_on, pmu_blink_off; | ||
436 | static spinlock_t pmu_blink_lock; | ||
437 | static unsigned long pmu_blink_stoptime; | ||
438 | static int pmu_blink_ledstate; | ||
439 | static struct timer_list pmu_blink_timer; | ||
440 | static int pmu_ide_blink_enabled; | ||
441 | |||
442 | |||
443 | static void | ||
444 | pmu_hd_blink_timeout(unsigned long data) | ||
445 | { | ||
446 | unsigned long flags; | ||
447 | |||
448 | spin_lock_irqsave(&pmu_blink_lock, flags); | ||
449 | |||
450 | /* We may have been triggered again in a racy way, check | ||
451 | * that we really want to switch it off | ||
452 | */ | ||
453 | if (time_after(pmu_blink_stoptime, jiffies)) | ||
454 | goto done; | ||
455 | |||
456 | /* Previous req. not complete, try 100ms more */ | ||
457 | if (pmu_blink_off.complete == 0) | ||
458 | mod_timer(&pmu_blink_timer, jiffies + PMU_HD_BLINK_TIME); | ||
459 | else if (pmu_blink_ledstate) { | ||
460 | pmu_request(&pmu_blink_off, NULL, 4, 0xee, 4, 0, 0); | ||
461 | pmu_blink_ledstate = 0; | ||
462 | } | ||
463 | done: | ||
464 | spin_unlock_irqrestore(&pmu_blink_lock, flags); | ||
465 | } | ||
466 | |||
467 | static void | ||
468 | pmu_hd_kick_blink(void *data, int rw) | ||
469 | { | ||
470 | unsigned long flags; | ||
471 | |||
472 | pmu_blink_stoptime = jiffies + PMU_HD_BLINK_TIME; | ||
473 | wmb(); | ||
474 | mod_timer(&pmu_blink_timer, pmu_blink_stoptime); | ||
475 | /* Fast path when LED is already ON */ | ||
476 | if (pmu_blink_ledstate == 1) | ||
477 | return; | ||
478 | spin_lock_irqsave(&pmu_blink_lock, flags); | ||
479 | if (pmu_blink_on.complete && !pmu_blink_ledstate) { | ||
480 | pmu_request(&pmu_blink_on, NULL, 4, 0xee, 4, 0, 1); | ||
481 | pmu_blink_ledstate = 1; | ||
482 | } | ||
483 | spin_unlock_irqrestore(&pmu_blink_lock, flags); | ||
484 | } | ||
485 | |||
486 | static int | ||
487 | pmu_hd_blink_init(void) | ||
488 | { | ||
489 | struct device_node *dt; | ||
490 | const char *model; | ||
491 | |||
492 | /* Currently, I only enable this feature on KeyLargo based laptops, | ||
493 | * older laptops may support it (at least heathrow/paddington) but | ||
494 | * I don't feel like loading those venerable old machines with so | ||
495 | * much additional interrupt & PMU activity... | ||
496 | */ | ||
497 | if (pmu_get_model() != PMU_KEYLARGO_BASED) | ||
498 | return 0; | ||
499 | |||
500 | dt = of_find_node_by_path("/"); | ||
501 | if (dt == NULL) | ||
502 | return 0; | ||
503 | model = (const char *)get_property(dt, "model", NULL); | ||
504 | if (model == NULL) | ||
505 | return 0; | ||
506 | if (strncmp(model, "PowerBook", strlen("PowerBook")) != 0 && | ||
507 | strncmp(model, "iBook", strlen("iBook")) != 0) { | ||
508 | of_node_put(dt); | ||
509 | return 0; | ||
510 | } | ||
511 | of_node_put(dt); | ||
512 | |||
513 | pmu_blink_on.complete = 1; | ||
514 | pmu_blink_off.complete = 1; | ||
515 | spin_lock_init(&pmu_blink_lock); | ||
516 | init_timer(&pmu_blink_timer); | ||
517 | pmu_blink_timer.function = pmu_hd_blink_timeout; | ||
518 | |||
519 | return 1; | ||
520 | } | ||
521 | |||
522 | #endif /* CONFIG_BLK_DEV_IDE_PMAC_BLINK */ | ||
523 | |||
524 | /* | ||
525 | * N.B. this can't be an initfunc, because the media-bay task can | 424 | * N.B. this can't be an initfunc, because the media-bay task can |
526 | * call ide_[un]register at any time. | 425 | * call ide_[un]register at any time. |
527 | */ | 426 | */ |
@@ -1192,23 +1091,6 @@ pmac_ide_do_suspend(ide_hwif_t *hwif) | |||
1192 | pmif->timings[0] = 0; | 1091 | pmif->timings[0] = 0; |
1193 | pmif->timings[1] = 0; | 1092 | pmif->timings[1] = 0; |
1194 | 1093 | ||
1195 | #ifdef CONFIG_BLK_DEV_IDE_PMAC_BLINK | ||
1196 | /* Note: This code will be called for every hwif, thus we'll | ||
1197 | * try several time to stop the LED blinker timer, but that | ||
1198 | * should be harmless | ||
1199 | */ | ||
1200 | if (pmu_ide_blink_enabled) { | ||
1201 | unsigned long flags; | ||
1202 | |||
1203 | /* Make sure we don't hit the PMU blink */ | ||
1204 | spin_lock_irqsave(&pmu_blink_lock, flags); | ||
1205 | if (pmu_blink_ledstate) | ||
1206 | del_timer(&pmu_blink_timer); | ||
1207 | pmu_blink_ledstate = 0; | ||
1208 | spin_unlock_irqrestore(&pmu_blink_lock, flags); | ||
1209 | } | ||
1210 | #endif /* CONFIG_BLK_DEV_IDE_PMAC_BLINK */ | ||
1211 | |||
1212 | disable_irq(pmif->irq); | 1094 | disable_irq(pmif->irq); |
1213 | 1095 | ||
1214 | /* The media bay will handle itself just fine */ | 1096 | /* The media bay will handle itself just fine */ |
@@ -1376,13 +1258,6 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif) | |||
1376 | hwif->selectproc = pmac_ide_selectproc; | 1258 | hwif->selectproc = pmac_ide_selectproc; |
1377 | hwif->speedproc = pmac_ide_tune_chipset; | 1259 | hwif->speedproc = pmac_ide_tune_chipset; |
1378 | 1260 | ||
1379 | #ifdef CONFIG_BLK_DEV_IDE_PMAC_BLINK | ||
1380 | pmu_ide_blink_enabled = pmu_hd_blink_init(); | ||
1381 | |||
1382 | if (pmu_ide_blink_enabled) | ||
1383 | hwif->led_act = pmu_hd_kick_blink; | ||
1384 | #endif | ||
1385 | |||
1386 | printk(KERN_INFO "ide%d: Found Apple %s controller, bus ID %d%s, irq %d\n", | 1261 | printk(KERN_INFO "ide%d: Found Apple %s controller, bus ID %d%s, irq %d\n", |
1387 | hwif->index, model_name[pmif->kind], pmif->aapl_bus_id, | 1262 | hwif->index, model_name[pmif->kind], pmif->aapl_bus_id, |
1388 | pmif->mediabay ? " (mediabay)" : "", hwif->irq); | 1263 | pmif->mediabay ? " (mediabay)" : "", hwif->irq); |
diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index 3d278412e1ca..800c8d518430 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c | |||
@@ -590,11 +590,11 @@ static void ohci_initialize(struct ti_ohci *ohci) | |||
590 | buf = reg_read(ohci, OHCI1394_Version); | 590 | buf = reg_read(ohci, OHCI1394_Version); |
591 | sprintf (irq_buf, "%d", ohci->dev->irq); | 591 | sprintf (irq_buf, "%d", ohci->dev->irq); |
592 | PRINT(KERN_INFO, "OHCI-1394 %d.%d (PCI): IRQ=[%s] " | 592 | PRINT(KERN_INFO, "OHCI-1394 %d.%d (PCI): IRQ=[%s] " |
593 | "MMIO=[%lx-%lx] Max Packet=[%d] IR/IT contexts=[%d/%d]", | 593 | "MMIO=[%llx-%llx] Max Packet=[%d] IR/IT contexts=[%d/%d]", |
594 | ((((buf) >> 16) & 0xf) + (((buf) >> 20) & 0xf) * 10), | 594 | ((((buf) >> 16) & 0xf) + (((buf) >> 20) & 0xf) * 10), |
595 | ((((buf) >> 4) & 0xf) + ((buf) & 0xf) * 10), irq_buf, | 595 | ((((buf) >> 4) & 0xf) + ((buf) & 0xf) * 10), irq_buf, |
596 | pci_resource_start(ohci->dev, 0), | 596 | (unsigned long long)pci_resource_start(ohci->dev, 0), |
597 | pci_resource_start(ohci->dev, 0) + OHCI1394_REGISTER_SIZE - 1, | 597 | (unsigned long long)pci_resource_start(ohci->dev, 0) + OHCI1394_REGISTER_SIZE - 1, |
598 | ohci->max_packet_size, | 598 | ohci->max_packet_size, |
599 | ohci->nb_iso_rcv_ctx, ohci->nb_iso_xmit_ctx); | 599 | ohci->nb_iso_rcv_ctx, ohci->nb_iso_xmit_ctx); |
600 | 600 | ||
@@ -3217,7 +3217,7 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev, | |||
3217 | { | 3217 | { |
3218 | struct hpsb_host *host; | 3218 | struct hpsb_host *host; |
3219 | struct ti_ohci *ohci; /* shortcut to currently handled device */ | 3219 | struct ti_ohci *ohci; /* shortcut to currently handled device */ |
3220 | unsigned long ohci_base; | 3220 | resource_size_t ohci_base; |
3221 | 3221 | ||
3222 | if (pci_enable_device(dev)) | 3222 | if (pci_enable_device(dev)) |
3223 | FAIL(-ENXIO, "Failed to enable OHCI hardware"); | 3223 | FAIL(-ENXIO, "Failed to enable OHCI hardware"); |
@@ -3270,15 +3270,16 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev, | |||
3270 | * clearly says it's 2kb, so this shouldn't be a problem. */ | 3270 | * clearly says it's 2kb, so this shouldn't be a problem. */ |
3271 | ohci_base = pci_resource_start(dev, 0); | 3271 | ohci_base = pci_resource_start(dev, 0); |
3272 | if (pci_resource_len(dev, 0) < OHCI1394_REGISTER_SIZE) | 3272 | if (pci_resource_len(dev, 0) < OHCI1394_REGISTER_SIZE) |
3273 | PRINT(KERN_WARNING, "PCI resource length of %lx too small!", | 3273 | PRINT(KERN_WARNING, "PCI resource length of 0x%llx too small!", |
3274 | pci_resource_len(dev, 0)); | 3274 | (unsigned long long)pci_resource_len(dev, 0)); |
3275 | 3275 | ||
3276 | /* Seems PCMCIA handles this internally. Not sure why. Seems | 3276 | /* Seems PCMCIA handles this internally. Not sure why. Seems |
3277 | * pretty bogus to force a driver to special case this. */ | 3277 | * pretty bogus to force a driver to special case this. */ |
3278 | #ifndef PCMCIA | 3278 | #ifndef PCMCIA |
3279 | if (!request_mem_region (ohci_base, OHCI1394_REGISTER_SIZE, OHCI1394_DRIVER_NAME)) | 3279 | if (!request_mem_region (ohci_base, OHCI1394_REGISTER_SIZE, OHCI1394_DRIVER_NAME)) |
3280 | FAIL(-ENOMEM, "MMIO resource (0x%lx - 0x%lx) unavailable", | 3280 | FAIL(-ENOMEM, "MMIO resource (0x%llx - 0x%llx) unavailable", |
3281 | ohci_base, ohci_base + OHCI1394_REGISTER_SIZE); | 3281 | (unsigned long long)ohci_base, |
3282 | (unsigned long long)ohci_base + OHCI1394_REGISTER_SIZE); | ||
3282 | #endif | 3283 | #endif |
3283 | ohci->init_state = OHCI_INIT_HAVE_MEM_REGION; | 3284 | ohci->init_state = OHCI_INIT_HAVE_MEM_REGION; |
3284 | 3285 | ||
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c index dddcdae736ac..e4b897fa569a 100644 --- a/drivers/infiniband/hw/ipath/ipath_driver.c +++ b/drivers/infiniband/hw/ipath/ipath_driver.c | |||
@@ -460,10 +460,10 @@ static int __devinit ipath_init_one(struct pci_dev *pdev, | |||
460 | for (j = 0; j < 6; j++) { | 460 | for (j = 0; j < 6; j++) { |
461 | if (!pdev->resource[j].start) | 461 | if (!pdev->resource[j].start) |
462 | continue; | 462 | continue; |
463 | ipath_cdbg(VERBOSE, "BAR %d start %lx, end %lx, len %lx\n", | 463 | ipath_cdbg(VERBOSE, "BAR %d start %llx, end %llx, len %llx\n", |
464 | j, pdev->resource[j].start, | 464 | j, (unsigned long long)pdev->resource[j].start, |
465 | pdev->resource[j].end, | 465 | (unsigned long long)pdev->resource[j].end, |
466 | pci_resource_len(pdev, j)); | 466 | (unsigned long long)pci_resource_len(pdev, j)); |
467 | } | 467 | } |
468 | 468 | ||
469 | if (!addr) { | 469 | if (!addr) { |
diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c index 9b9ff7bff357..465fd220569c 100644 --- a/drivers/infiniband/hw/mthca/mthca_main.c +++ b/drivers/infiniband/hw/mthca/mthca_main.c | |||
@@ -172,8 +172,9 @@ static int __devinit mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim | |||
172 | 172 | ||
173 | if (dev_lim->uar_size > pci_resource_len(mdev->pdev, 2)) { | 173 | if (dev_lim->uar_size > pci_resource_len(mdev->pdev, 2)) { |
174 | mthca_err(mdev, "HCA reported UAR size of 0x%x bigger than " | 174 | mthca_err(mdev, "HCA reported UAR size of 0x%x bigger than " |
175 | "PCI resource 2 size of 0x%lx, aborting.\n", | 175 | "PCI resource 2 size of 0x%llx, aborting.\n", |
176 | dev_lim->uar_size, pci_resource_len(mdev->pdev, 2)); | 176 | dev_lim->uar_size, |
177 | (unsigned long long)pci_resource_len(mdev->pdev, 2)); | ||
177 | return -ENODEV; | 178 | return -ENODEV; |
178 | } | 179 | } |
179 | 180 | ||
diff --git a/drivers/input/joystick/db9.c b/drivers/input/joystick/db9.c index 6f31f054d1bb..5080e15c6d30 100644 --- a/drivers/input/joystick/db9.c +++ b/drivers/input/joystick/db9.c | |||
@@ -584,7 +584,7 @@ static struct db9 __init *db9_probe(int parport, int mode) | |||
584 | goto err_out; | 584 | goto err_out; |
585 | } | 585 | } |
586 | 586 | ||
587 | if (db9_mode[mode].bidirectional && !(pp->modes & PARPORT_MODE_TRISTATE)) { | 587 | if (db9_mode->bidirectional && !(pp->modes & PARPORT_MODE_TRISTATE)) { |
588 | printk(KERN_ERR "db9.c: specified parport is not bidirectional\n"); | 588 | printk(KERN_ERR "db9.c: specified parport is not bidirectional\n"); |
589 | err = -EINVAL; | 589 | err = -EINVAL; |
590 | goto err_put_pp; | 590 | goto err_put_pp; |
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index ffde8f86e0fb..ce1f10e8984b 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c | |||
@@ -459,7 +459,7 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, | |||
459 | } | 459 | } |
460 | 460 | ||
461 | input_regs(dev, regs); | 461 | input_regs(dev, regs); |
462 | input_report_key(dev, keycode, value); | 462 | input_event(dev, EV_KEY, keycode, value); |
463 | input_sync(dev); | 463 | input_sync(dev); |
464 | 464 | ||
465 | if (value && add_release_event) { | 465 | if (value && add_release_event) { |
diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c index e4e5be111c96..ccf0faeee5c1 100644 --- a/drivers/input/misc/wistron_btns.c +++ b/drivers/input/misc/wistron_btns.c | |||
@@ -285,6 +285,15 @@ static struct key_entry keymap_fujitsu_n3510[] = { | |||
285 | { KE_END, 0 } | 285 | { KE_END, 0 } |
286 | }; | 286 | }; |
287 | 287 | ||
288 | static struct key_entry keymap_wistron_ms2111[] = { | ||
289 | { KE_KEY, 0x11, KEY_PROG1 }, | ||
290 | { KE_KEY, 0x12, KEY_PROG2 }, | ||
291 | { KE_KEY, 0x13, KEY_PROG3 }, | ||
292 | { KE_KEY, 0x31, KEY_MAIL }, | ||
293 | { KE_KEY, 0x36, KEY_WWW }, | ||
294 | { KE_END, 0 } | ||
295 | }; | ||
296 | |||
288 | static struct key_entry keymap_wistron_ms2141[] = { | 297 | static struct key_entry keymap_wistron_ms2141[] = { |
289 | { KE_KEY, 0x11, KEY_PROG1 }, | 298 | { KE_KEY, 0x11, KEY_PROG1 }, |
290 | { KE_KEY, 0x12, KEY_PROG2 }, | 299 | { KE_KEY, 0x12, KEY_PROG2 }, |
@@ -326,6 +335,7 @@ static struct key_entry keymap_aopen_1559as[] = { | |||
326 | { KE_WIFI, 0x30, 0 }, | 335 | { KE_WIFI, 0x30, 0 }, |
327 | { KE_KEY, 0x31, KEY_MAIL }, | 336 | { KE_KEY, 0x31, KEY_MAIL }, |
328 | { KE_KEY, 0x36, KEY_WWW }, | 337 | { KE_KEY, 0x36, KEY_WWW }, |
338 | { KE_END, 0 }, | ||
329 | }; | 339 | }; |
330 | 340 | ||
331 | /* | 341 | /* |
@@ -388,6 +398,15 @@ static struct dmi_system_id dmi_ids[] = { | |||
388 | }, | 398 | }, |
389 | .driver_data = keymap_aopen_1559as | 399 | .driver_data = keymap_aopen_1559as |
390 | }, | 400 | }, |
401 | { | ||
402 | .callback = dmi_matched, | ||
403 | .ident = "Medion MD 9783", | ||
404 | .matches = { | ||
405 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), | ||
406 | DMI_MATCH(DMI_PRODUCT_NAME, "MD 9783"), | ||
407 | }, | ||
408 | .driver_data = keymap_wistron_ms2111 | ||
409 | }, | ||
391 | { NULL, } | 410 | { NULL, } |
392 | }; | 411 | }; |
393 | 412 | ||
diff --git a/drivers/input/serio/ct82c710.c b/drivers/input/serio/ct82c710.c index 096b6a0b5cca..1ac739ef2ffa 100644 --- a/drivers/input/serio/ct82c710.c +++ b/drivers/input/serio/ct82c710.c | |||
@@ -189,7 +189,7 @@ static int __devinit ct82c710_probe(struct platform_device *dev) | |||
189 | strlcpy(ct82c710_port->name, "C&T 82c710 mouse port", | 189 | strlcpy(ct82c710_port->name, "C&T 82c710 mouse port", |
190 | sizeof(ct82c710_port->name)); | 190 | sizeof(ct82c710_port->name)); |
191 | snprintf(ct82c710_port->phys, sizeof(ct82c710_port->phys), | 191 | snprintf(ct82c710_port->phys, sizeof(ct82c710_port->phys), |
192 | "isa%04lx/serio0", CT82C710_DATA); | 192 | "isa%16llx/serio0", (unsigned long long)CT82C710_DATA); |
193 | 193 | ||
194 | serio_register_port(ct82c710_port); | 194 | serio_register_port(ct82c710_port); |
195 | 195 | ||
@@ -241,8 +241,8 @@ static int __init ct82c710_init(void) | |||
241 | 241 | ||
242 | serio_register_port(ct82c710_port); | 242 | serio_register_port(ct82c710_port); |
243 | 243 | ||
244 | printk(KERN_INFO "serio: C&T 82c710 mouse port at %#lx irq %d\n", | 244 | printk(KERN_INFO "serio: C&T 82c710 mouse port at %#llx irq %d\n", |
245 | CT82C710_DATA, CT82C710_IRQ); | 245 | (unsigned long long)CT82C710_DATA, CT82C710_IRQ); |
246 | 246 | ||
247 | return 0; | 247 | return 0; |
248 | 248 | ||
diff --git a/drivers/isdn/hisax/hfc_pci.c b/drivers/isdn/hisax/hfc_pci.c index 91d25acb5ede..3622720f0505 100644 --- a/drivers/isdn/hisax/hfc_pci.c +++ b/drivers/isdn/hisax/hfc_pci.c | |||
@@ -1688,7 +1688,7 @@ setup_hfcpci(struct IsdnCard *card) | |||
1688 | printk(KERN_WARNING "HFC-PCI: No IRQ for PCI card found\n"); | 1688 | printk(KERN_WARNING "HFC-PCI: No IRQ for PCI card found\n"); |
1689 | return (0); | 1689 | return (0); |
1690 | } | 1690 | } |
1691 | cs->hw.hfcpci.pci_io = (char *) dev_hfcpci->resource[ 1].start; | 1691 | cs->hw.hfcpci.pci_io = (char *)(unsigned long)dev_hfcpci->resource[1].start; |
1692 | printk(KERN_INFO "HiSax: HFC-PCI card manufacturer: %s card name: %s\n", id_list[i].vendor_name, id_list[i].card_name); | 1692 | printk(KERN_INFO "HiSax: HFC-PCI card manufacturer: %s card name: %s\n", id_list[i].vendor_name, id_list[i].card_name); |
1693 | } else { | 1693 | } else { |
1694 | printk(KERN_WARNING "HFC-PCI: No PCI card found\n"); | 1694 | printk(KERN_WARNING "HFC-PCI: No PCI card found\n"); |
diff --git a/drivers/isdn/hisax/telespci.c b/drivers/isdn/hisax/telespci.c index e2bb4fd8e25e..e82ab2251b82 100644 --- a/drivers/isdn/hisax/telespci.c +++ b/drivers/isdn/hisax/telespci.c | |||
@@ -311,8 +311,9 @@ setup_telespci(struct IsdnCard *card) | |||
311 | } | 311 | } |
312 | cs->hw.teles0.membase = ioremap(pci_resource_start(dev_tel, 0), | 312 | cs->hw.teles0.membase = ioremap(pci_resource_start(dev_tel, 0), |
313 | PAGE_SIZE); | 313 | PAGE_SIZE); |
314 | printk(KERN_INFO "Found: Zoran, base-address: 0x%lx, irq: 0x%x\n", | 314 | printk(KERN_INFO "Found: Zoran, base-address: 0x%llx, irq: 0x%x\n", |
315 | pci_resource_start(dev_tel, 0), dev_tel->irq); | 315 | (unsigned long long)pci_resource_start(dev_tel, 0), |
316 | dev_tel->irq); | ||
316 | } else { | 317 | } else { |
317 | printk(KERN_WARNING "TelesPCI: No PCI card found\n"); | 318 | printk(KERN_WARNING "TelesPCI: No PCI card found\n"); |
318 | return(0); | 319 | return(0); |
diff --git a/drivers/isdn/i4l/isdn_x25iface.c b/drivers/isdn/i4l/isdn_x25iface.c index 743ac4077f35..8b3efc243161 100644 --- a/drivers/isdn/i4l/isdn_x25iface.c +++ b/drivers/isdn/i4l/isdn_x25iface.c | |||
@@ -208,7 +208,7 @@ static int isdn_x25iface_receive(struct concap_proto *cprot, struct sk_buff *skb | |||
208 | */ | 208 | */ |
209 | static int isdn_x25iface_connect_ind(struct concap_proto *cprot) | 209 | static int isdn_x25iface_connect_ind(struct concap_proto *cprot) |
210 | { | 210 | { |
211 | struct sk_buff * skb = dev_alloc_skb(1); | 211 | struct sk_buff * skb; |
212 | enum wan_states *state_p | 212 | enum wan_states *state_p |
213 | = &( ( (ix25_pdata_t*) (cprot->proto_data) ) -> state); | 213 | = &( ( (ix25_pdata_t*) (cprot->proto_data) ) -> state); |
214 | IX25DEBUG( "isdn_x25iface_connect_ind %s \n" | 214 | IX25DEBUG( "isdn_x25iface_connect_ind %s \n" |
@@ -220,6 +220,8 @@ static int isdn_x25iface_connect_ind(struct concap_proto *cprot) | |||
220 | return -1; | 220 | return -1; |
221 | } | 221 | } |
222 | *state_p = WAN_CONNECTED; | 222 | *state_p = WAN_CONNECTED; |
223 | |||
224 | skb = dev_alloc_skb(1); | ||
223 | if( skb ){ | 225 | if( skb ){ |
224 | *( skb_put(skb, 1) ) = 0x01; | 226 | *( skb_put(skb, 1) ) = 0x01; |
225 | skb->protocol = x25_type_trans(skb, cprot->net_dev); | 227 | skb->protocol = x25_type_trans(skb, cprot->net_dev); |
diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig index 37cd6ee4586b..54f3f6b94efc 100644 --- a/drivers/macintosh/Kconfig +++ b/drivers/macintosh/Kconfig | |||
@@ -78,6 +78,18 @@ config ADB_PMU | |||
78 | this device; you should do so if your machine is one of those | 78 | this device; you should do so if your machine is one of those |
79 | mentioned above. | 79 | mentioned above. |
80 | 80 | ||
81 | config ADB_PMU_LED | ||
82 | bool "Support for the Power/iBook front LED" | ||
83 | depends on ADB_PMU | ||
84 | select NEW_LEDS | ||
85 | select LEDS_CLASS | ||
86 | help | ||
87 | Support the front LED on Power/iBooks as a generic LED that can | ||
88 | be triggered by any of the supported triggers. To get the | ||
89 | behaviour of the old CONFIG_BLK_DEV_IDE_PMAC_BLINK, select this | ||
90 | and the ide-disk LED trigger and configure appropriately through | ||
91 | sysfs. | ||
92 | |||
81 | config PMAC_SMU | 93 | config PMAC_SMU |
82 | bool "Support for SMU based PowerMacs" | 94 | bool "Support for SMU based PowerMacs" |
83 | depends on PPC_PMAC64 | 95 | depends on PPC_PMAC64 |
diff --git a/drivers/macintosh/Makefile b/drivers/macintosh/Makefile index 45a268f8047e..b53d45f87b0b 100644 --- a/drivers/macintosh/Makefile +++ b/drivers/macintosh/Makefile | |||
@@ -12,6 +12,7 @@ obj-$(CONFIG_INPUT_ADBHID) += adbhid.o | |||
12 | obj-$(CONFIG_ANSLCD) += ans-lcd.o | 12 | obj-$(CONFIG_ANSLCD) += ans-lcd.o |
13 | 13 | ||
14 | obj-$(CONFIG_ADB_PMU) += via-pmu.o via-pmu-event.o | 14 | obj-$(CONFIG_ADB_PMU) += via-pmu.o via-pmu-event.o |
15 | obj-$(CONFIG_ADB_PMU_LED) += via-pmu-led.o | ||
15 | obj-$(CONFIG_PMAC_BACKLIGHT) += via-pmu-backlight.o | 16 | obj-$(CONFIG_PMAC_BACKLIGHT) += via-pmu-backlight.o |
16 | obj-$(CONFIG_ADB_CUDA) += via-cuda.o | 17 | obj-$(CONFIG_ADB_CUDA) += via-cuda.o |
17 | obj-$(CONFIG_PMAC_APM_EMU) += apm_emu.o | 18 | obj-$(CONFIG_PMAC_APM_EMU) += apm_emu.o |
diff --git a/drivers/macintosh/macio_asic.c b/drivers/macintosh/macio_asic.c index 431bd37225a1..c687ac703941 100644 --- a/drivers/macintosh/macio_asic.c +++ b/drivers/macintosh/macio_asic.c | |||
@@ -428,10 +428,10 @@ static struct macio_dev * macio_add_one_device(struct macio_chip *chip, | |||
428 | 428 | ||
429 | /* MacIO itself has a different reg, we use it's PCI base */ | 429 | /* MacIO itself has a different reg, we use it's PCI base */ |
430 | if (np == chip->of_node) { | 430 | if (np == chip->of_node) { |
431 | sprintf(dev->ofdev.dev.bus_id, "%1d.%08lx:%.*s", | 431 | sprintf(dev->ofdev.dev.bus_id, "%1d.%016llx:%.*s", |
432 | chip->lbus.index, | 432 | chip->lbus.index, |
433 | #ifdef CONFIG_PCI | 433 | #ifdef CONFIG_PCI |
434 | pci_resource_start(chip->lbus.pdev, 0), | 434 | (unsigned long long)pci_resource_start(chip->lbus.pdev, 0), |
435 | #else | 435 | #else |
436 | 0, /* NuBus may want to do something better here */ | 436 | 0, /* NuBus may want to do something better here */ |
437 | #endif | 437 | #endif |
diff --git a/drivers/macintosh/via-pmu-led.c b/drivers/macintosh/via-pmu-led.c new file mode 100644 index 000000000000..af8375ed0f5e --- /dev/null +++ b/drivers/macintosh/via-pmu-led.c | |||
@@ -0,0 +1,144 @@ | |||
1 | /* | ||
2 | * via-pmu LED class device | ||
3 | * | ||
4 | * Copyright 2006 Johannes Berg <johannes@sipsolutions.net> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, but | ||
12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
14 | * NON INFRINGEMENT. See the GNU General Public License for more | ||
15 | * details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | * | ||
21 | */ | ||
22 | #include <linux/types.h> | ||
23 | #include <linux/kernel.h> | ||
24 | #include <linux/device.h> | ||
25 | #include <linux/leds.h> | ||
26 | #include <linux/adb.h> | ||
27 | #include <linux/pmu.h> | ||
28 | #include <asm/prom.h> | ||
29 | |||
30 | static spinlock_t pmu_blink_lock; | ||
31 | static struct adb_request pmu_blink_req; | ||
32 | /* -1: no change, 0: request off, 1: request on */ | ||
33 | static int requested_change; | ||
34 | static int sleeping; | ||
35 | |||
36 | static void pmu_req_done(struct adb_request * req) | ||
37 | { | ||
38 | unsigned long flags; | ||
39 | |||
40 | spin_lock_irqsave(&pmu_blink_lock, flags); | ||
41 | /* if someone requested a change in the meantime | ||
42 | * (we only see the last one which is fine) | ||
43 | * then apply it now */ | ||
44 | if (requested_change != -1 && !sleeping) | ||
45 | pmu_request(&pmu_blink_req, NULL, 4, 0xee, 4, 0, requested_change); | ||
46 | /* reset requested change */ | ||
47 | requested_change = -1; | ||
48 | spin_unlock_irqrestore(&pmu_blink_lock, flags); | ||
49 | } | ||
50 | |||
51 | static void pmu_led_set(struct led_classdev *led_cdev, | ||
52 | enum led_brightness brightness) | ||
53 | { | ||
54 | unsigned long flags; | ||
55 | |||
56 | spin_lock_irqsave(&pmu_blink_lock, flags); | ||
57 | switch (brightness) { | ||
58 | case LED_OFF: | ||
59 | requested_change = 0; | ||
60 | break; | ||
61 | case LED_FULL: | ||
62 | requested_change = 1; | ||
63 | break; | ||
64 | default: | ||
65 | goto out; | ||
66 | break; | ||
67 | } | ||
68 | /* if request isn't done, then don't do anything */ | ||
69 | if (pmu_blink_req.complete && !sleeping) | ||
70 | pmu_request(&pmu_blink_req, NULL, 4, 0xee, 4, 0, requested_change); | ||
71 | out: | ||
72 | spin_unlock_irqrestore(&pmu_blink_lock, flags); | ||
73 | } | ||
74 | |||
75 | static struct led_classdev pmu_led = { | ||
76 | .name = "pmu-front-led", | ||
77 | #ifdef CONFIG_BLK_DEV_IDE_PMAC_BLINK | ||
78 | .default_trigger = "ide-disk", | ||
79 | #endif | ||
80 | .brightness_set = pmu_led_set, | ||
81 | }; | ||
82 | |||
83 | #ifdef CONFIG_PM | ||
84 | static int pmu_led_sleep_call(struct pmu_sleep_notifier *self, int when) | ||
85 | { | ||
86 | unsigned long flags; | ||
87 | |||
88 | spin_lock_irqsave(&pmu_blink_lock, flags); | ||
89 | |||
90 | switch (when) { | ||
91 | case PBOOK_SLEEP_REQUEST: | ||
92 | sleeping = 1; | ||
93 | break; | ||
94 | case PBOOK_WAKE: | ||
95 | sleeping = 0; | ||
96 | break; | ||
97 | default: | ||
98 | /* do nothing */ | ||
99 | break; | ||
100 | } | ||
101 | spin_unlock_irqrestore(&pmu_blink_lock, flags); | ||
102 | |||
103 | return PBOOK_SLEEP_OK; | ||
104 | } | ||
105 | |||
106 | static struct pmu_sleep_notifier via_pmu_led_sleep_notif = { | ||
107 | .notifier_call = pmu_led_sleep_call, | ||
108 | }; | ||
109 | #endif | ||
110 | |||
111 | static int __init via_pmu_led_init(void) | ||
112 | { | ||
113 | struct device_node *dt; | ||
114 | const char *model; | ||
115 | |||
116 | /* only do this on keylargo based models */ | ||
117 | if (pmu_get_model() != PMU_KEYLARGO_BASED) | ||
118 | return -ENODEV; | ||
119 | |||
120 | dt = of_find_node_by_path("/"); | ||
121 | if (dt == NULL) | ||
122 | return -ENODEV; | ||
123 | model = (const char *)get_property(dt, "model", NULL); | ||
124 | if (model == NULL) | ||
125 | return -ENODEV; | ||
126 | if (strncmp(model, "PowerBook", strlen("PowerBook")) != 0 && | ||
127 | strncmp(model, "iBook", strlen("iBook")) != 0) { | ||
128 | of_node_put(dt); | ||
129 | /* ignore */ | ||
130 | return -ENODEV; | ||
131 | } | ||
132 | of_node_put(dt); | ||
133 | |||
134 | spin_lock_init(&pmu_blink_lock); | ||
135 | /* no outstanding req */ | ||
136 | pmu_blink_req.complete = 1; | ||
137 | pmu_blink_req.done = pmu_req_done; | ||
138 | #ifdef CONFIG_PM | ||
139 | pmu_register_sleep_notifier(&via_pmu_led_sleep_notif); | ||
140 | #endif | ||
141 | return led_classdev_register(NULL, &pmu_led); | ||
142 | } | ||
143 | |||
144 | late_initcall(via_pmu_led_init); | ||
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index f920e50ea124..837ec4eb3d60 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -2827,7 +2827,6 @@ static inline sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *ski | |||
2827 | struct stripe_head *sh; | 2827 | struct stripe_head *sh; |
2828 | int pd_idx; | 2828 | int pd_idx; |
2829 | int raid_disks = conf->raid_disks; | 2829 | int raid_disks = conf->raid_disks; |
2830 | int data_disks = raid_disks - conf->max_degraded; | ||
2831 | sector_t max_sector = mddev->size << 1; | 2830 | sector_t max_sector = mddev->size << 1; |
2832 | int sync_blocks; | 2831 | int sync_blocks; |
2833 | int still_degraded = 0; | 2832 | int still_degraded = 0; |
diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c index 423e954948be..aa3203ae670c 100644 --- a/drivers/media/video/bt8xx/bttv-driver.c +++ b/drivers/media/video/bt8xx/bttv-driver.c | |||
@@ -4019,8 +4019,9 @@ static int __devinit bttv_probe(struct pci_dev *dev, | |||
4019 | if (!request_mem_region(pci_resource_start(dev,0), | 4019 | if (!request_mem_region(pci_resource_start(dev,0), |
4020 | pci_resource_len(dev,0), | 4020 | pci_resource_len(dev,0), |
4021 | btv->c.name)) { | 4021 | btv->c.name)) { |
4022 | printk(KERN_WARNING "bttv%d: can't request iomem (0x%lx).\n", | 4022 | printk(KERN_WARNING "bttv%d: can't request iomem (0x%llx).\n", |
4023 | btv->c.nr, pci_resource_start(dev,0)); | 4023 | btv->c.nr, |
4024 | (unsigned long long)pci_resource_start(dev,0)); | ||
4024 | return -EBUSY; | 4025 | return -EBUSY; |
4025 | } | 4026 | } |
4026 | pci_set_master(dev); | 4027 | pci_set_master(dev); |
@@ -4031,8 +4032,9 @@ static int __devinit bttv_probe(struct pci_dev *dev, | |||
4031 | pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat); | 4032 | pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat); |
4032 | printk(KERN_INFO "bttv%d: Bt%d (rev %d) at %s, ", | 4033 | printk(KERN_INFO "bttv%d: Bt%d (rev %d) at %s, ", |
4033 | bttv_num,btv->id, btv->revision, pci_name(dev)); | 4034 | bttv_num,btv->id, btv->revision, pci_name(dev)); |
4034 | printk("irq: %d, latency: %d, mmio: 0x%lx\n", | 4035 | printk("irq: %d, latency: %d, mmio: 0x%llx\n", |
4035 | btv->c.pci->irq, lat, pci_resource_start(dev,0)); | 4036 | btv->c.pci->irq, lat, |
4037 | (unsigned long long)pci_resource_start(dev,0)); | ||
4036 | schedule(); | 4038 | schedule(); |
4037 | 4039 | ||
4038 | btv->bt848_mmio=ioremap(pci_resource_start(dev,0), 0x1000); | 4040 | btv->bt848_mmio=ioremap(pci_resource_start(dev,0), 0x1000); |
diff --git a/drivers/media/video/cx88/cx88-alsa.c b/drivers/media/video/cx88/cx88-alsa.c index 2194cbeca33b..292a5e81eb75 100644 --- a/drivers/media/video/cx88/cx88-alsa.c +++ b/drivers/media/video/cx88/cx88-alsa.c | |||
@@ -712,9 +712,9 @@ static int __devinit snd_cx88_create(struct snd_card *card, | |||
712 | pci_read_config_byte(pci, PCI_LATENCY_TIMER, &chip->pci_lat); | 712 | pci_read_config_byte(pci, PCI_LATENCY_TIMER, &chip->pci_lat); |
713 | 713 | ||
714 | dprintk(1,"ALSA %s/%i: found at %s, rev: %d, irq: %d, " | 714 | dprintk(1,"ALSA %s/%i: found at %s, rev: %d, irq: %d, " |
715 | "latency: %d, mmio: 0x%lx\n", core->name, devno, | 715 | "latency: %d, mmio: 0x%llx\n", core->name, devno, |
716 | pci_name(pci), chip->pci_rev, pci->irq, | 716 | pci_name(pci), chip->pci_rev, pci->irq, |
717 | chip->pci_lat,pci_resource_start(pci,0)); | 717 | chip->pci_lat,(unsigned long long)pci_resource_start(pci,0)); |
718 | 718 | ||
719 | chip->irq = pci->irq; | 719 | chip->irq = pci->irq; |
720 | synchronize_irq(chip->irq); | 720 | synchronize_irq(chip->irq); |
@@ -766,8 +766,8 @@ static int __devinit cx88_audio_initdev(struct pci_dev *pci, | |||
766 | 766 | ||
767 | strcpy (card->driver, "CX88x"); | 767 | strcpy (card->driver, "CX88x"); |
768 | sprintf(card->shortname, "Conexant CX%x", pci->device); | 768 | sprintf(card->shortname, "Conexant CX%x", pci->device); |
769 | sprintf(card->longname, "%s at %#lx", | 769 | sprintf(card->longname, "%s at %#llx", |
770 | card->shortname, pci_resource_start(pci, 0)); | 770 | card->shortname,(unsigned long long)pci_resource_start(pci, 0)); |
771 | strcpy (card->mixername, "CX88"); | 771 | strcpy (card->mixername, "CX88"); |
772 | 772 | ||
773 | dprintk (0, "%s/%i: ALSA support for cx2388x boards\n", | 773 | dprintk (0, "%s/%i: ALSA support for cx2388x boards\n", |
diff --git a/drivers/media/video/cx88/cx88-core.c b/drivers/media/video/cx88/cx88-core.c index 26f4c0fb8c36..973d3f39b2d5 100644 --- a/drivers/media/video/cx88/cx88-core.c +++ b/drivers/media/video/cx88/cx88-core.c | |||
@@ -1031,8 +1031,8 @@ static int get_ressources(struct cx88_core *core, struct pci_dev *pci) | |||
1031 | pci_resource_len(pci,0), | 1031 | pci_resource_len(pci,0), |
1032 | core->name)) | 1032 | core->name)) |
1033 | return 0; | 1033 | return 0; |
1034 | printk(KERN_ERR "%s: can't get MMIO memory @ 0x%lx\n", | 1034 | printk(KERN_ERR "%s: can't get MMIO memory @ 0x%llx\n", |
1035 | core->name,pci_resource_start(pci,0)); | 1035 | core->name,(unsigned long long)pci_resource_start(pci,0)); |
1036 | return -EBUSY; | 1036 | return -EBUSY; |
1037 | } | 1037 | } |
1038 | 1038 | ||
diff --git a/drivers/media/video/cx88/cx88-mpeg.c b/drivers/media/video/cx88/cx88-mpeg.c index a9d7795a8e14..2c12aca1b6a3 100644 --- a/drivers/media/video/cx88/cx88-mpeg.c +++ b/drivers/media/video/cx88/cx88-mpeg.c | |||
@@ -420,9 +420,9 @@ int cx8802_init_common(struct cx8802_dev *dev) | |||
420 | pci_read_config_byte(dev->pci, PCI_CLASS_REVISION, &dev->pci_rev); | 420 | pci_read_config_byte(dev->pci, PCI_CLASS_REVISION, &dev->pci_rev); |
421 | pci_read_config_byte(dev->pci, PCI_LATENCY_TIMER, &dev->pci_lat); | 421 | pci_read_config_byte(dev->pci, PCI_LATENCY_TIMER, &dev->pci_lat); |
422 | printk(KERN_INFO "%s/2: found at %s, rev: %d, irq: %d, " | 422 | printk(KERN_INFO "%s/2: found at %s, rev: %d, irq: %d, " |
423 | "latency: %d, mmio: 0x%lx\n", dev->core->name, | 423 | "latency: %d, mmio: 0x%llx\n", dev->core->name, |
424 | pci_name(dev->pci), dev->pci_rev, dev->pci->irq, | 424 | pci_name(dev->pci), dev->pci_rev, dev->pci->irq, |
425 | dev->pci_lat,pci_resource_start(dev->pci,0)); | 425 | dev->pci_lat,(unsigned long long)pci_resource_start(dev->pci,0)); |
426 | 426 | ||
427 | /* initialize driver struct */ | 427 | /* initialize driver struct */ |
428 | spin_lock_init(&dev->slock); | 428 | spin_lock_init(&dev->slock); |
diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c index dcda5291b990..8d5cf474b68e 100644 --- a/drivers/media/video/cx88/cx88-video.c +++ b/drivers/media/video/cx88/cx88-video.c | |||
@@ -1847,9 +1847,9 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev, | |||
1847 | pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev); | 1847 | pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev); |
1848 | pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat); | 1848 | pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat); |
1849 | printk(KERN_INFO "%s/0: found at %s, rev: %d, irq: %d, " | 1849 | printk(KERN_INFO "%s/0: found at %s, rev: %d, irq: %d, " |
1850 | "latency: %d, mmio: 0x%lx\n", core->name, | 1850 | "latency: %d, mmio: 0x%llx\n", core->name, |
1851 | pci_name(pci_dev), dev->pci_rev, pci_dev->irq, | 1851 | pci_name(pci_dev), dev->pci_rev, pci_dev->irq, |
1852 | dev->pci_lat,pci_resource_start(pci_dev,0)); | 1852 | dev->pci_lat,(unsigned long long)pci_resource_start(pci_dev,0)); |
1853 | 1853 | ||
1854 | pci_set_master(pci_dev); | 1854 | pci_set_master(pci_dev); |
1855 | if (!pci_dma_supported(pci_dev,0xffffffff)) { | 1855 | if (!pci_dma_supported(pci_dev,0xffffffff)) { |
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c index f0c2111f14ad..da3007d2f411 100644 --- a/drivers/media/video/saa7134/saa7134-core.c +++ b/drivers/media/video/saa7134/saa7134-core.c | |||
@@ -871,9 +871,9 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
871 | pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev); | 871 | pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev); |
872 | pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat); | 872 | pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat); |
873 | printk(KERN_INFO "%s: found at %s, rev: %d, irq: %d, " | 873 | printk(KERN_INFO "%s: found at %s, rev: %d, irq: %d, " |
874 | "latency: %d, mmio: 0x%lx\n", dev->name, | 874 | "latency: %d, mmio: 0x%llx\n", dev->name, |
875 | pci_name(pci_dev), dev->pci_rev, pci_dev->irq, | 875 | pci_name(pci_dev), dev->pci_rev, pci_dev->irq, |
876 | dev->pci_lat,pci_resource_start(pci_dev,0)); | 876 | dev->pci_lat,(unsigned long long)pci_resource_start(pci_dev,0)); |
877 | pci_set_master(pci_dev); | 877 | pci_set_master(pci_dev); |
878 | if (!pci_dma_supported(pci_dev, DMA_32BIT_MASK)) { | 878 | if (!pci_dma_supported(pci_dev, DMA_32BIT_MASK)) { |
879 | printk("%s: Oops: no 32bit PCI DMA ???\n",dev->name); | 879 | printk("%s: Oops: no 32bit PCI DMA ???\n",dev->name); |
@@ -905,8 +905,8 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
905 | pci_resource_len(pci_dev,0), | 905 | pci_resource_len(pci_dev,0), |
906 | dev->name)) { | 906 | dev->name)) { |
907 | err = -EBUSY; | 907 | err = -EBUSY; |
908 | printk(KERN_ERR "%s: can't get MMIO memory @ 0x%lx\n", | 908 | printk(KERN_ERR "%s: can't get MMIO memory @ 0x%llx\n", |
909 | dev->name,pci_resource_start(pci_dev,0)); | 909 | dev->name,(unsigned long long)pci_resource_start(pci_dev,0)); |
910 | goto fail1; | 910 | goto fail1; |
911 | } | 911 | } |
912 | dev->lmmio = ioremap(pci_resource_start(pci_dev,0), 0x1000); | 912 | dev->lmmio = ioremap(pci_resource_start(pci_dev,0), 0x1000); |
diff --git a/drivers/message/i2o/iop.c b/drivers/message/i2o/iop.c index c74e5460f834..3305c12372a2 100644 --- a/drivers/message/i2o/iop.c +++ b/drivers/message/i2o/iop.c | |||
@@ -683,9 +683,10 @@ static int i2o_iop_systab_set(struct i2o_controller *c) | |||
683 | c->mem_alloc = 1; | 683 | c->mem_alloc = 1; |
684 | sb->current_mem_size = 1 + res->end - res->start; | 684 | sb->current_mem_size = 1 + res->end - res->start; |
685 | sb->current_mem_base = res->start; | 685 | sb->current_mem_base = res->start; |
686 | osm_info("%s: allocated %ld bytes of PCI memory at " | 686 | osm_info("%s: allocated %llu bytes of PCI memory at " |
687 | "0x%08lX.\n", c->name, | 687 | "0x%016llX.\n", c->name, |
688 | 1 + res->end - res->start, res->start); | 688 | (unsigned long long)(1 + res->end - res->start), |
689 | (unsigned long long)res->start); | ||
689 | } | 690 | } |
690 | } | 691 | } |
691 | 692 | ||
@@ -704,9 +705,10 @@ static int i2o_iop_systab_set(struct i2o_controller *c) | |||
704 | c->io_alloc = 1; | 705 | c->io_alloc = 1; |
705 | sb->current_io_size = 1 + res->end - res->start; | 706 | sb->current_io_size = 1 + res->end - res->start; |
706 | sb->current_mem_base = res->start; | 707 | sb->current_mem_base = res->start; |
707 | osm_info("%s: allocated %ld bytes of PCI I/O at 0x%08lX" | 708 | osm_info("%s: allocated %llu bytes of PCI I/O at " |
708 | ".\n", c->name, 1 + res->end - res->start, | 709 | "0x%016llX.\n", c->name, |
709 | res->start); | 710 | (unsigned long long)(1 + res->end - res->start), |
711 | (unsigned long long)res->start); | ||
710 | } | 712 | } |
711 | } | 713 | } |
712 | 714 | ||
diff --git a/drivers/mmc/mmci.c b/drivers/mmc/mmci.c index da8e4d7339cc..8576a65ca1c3 100644 --- a/drivers/mmc/mmci.c +++ b/drivers/mmc/mmci.c | |||
@@ -546,9 +546,9 @@ static int mmci_probe(struct amba_device *dev, void *id) | |||
546 | 546 | ||
547 | mmc_add_host(mmc); | 547 | mmc_add_host(mmc); |
548 | 548 | ||
549 | printk(KERN_INFO "%s: MMCI rev %x cfg %02x at 0x%08lx irq %d,%d\n", | 549 | printk(KERN_INFO "%s: MMCI rev %x cfg %02x at 0x%016llx irq %d,%d\n", |
550 | mmc_hostname(mmc), amba_rev(dev), amba_config(dev), | 550 | mmc_hostname(mmc), amba_rev(dev), amba_config(dev), |
551 | dev->res.start, dev->irq[0], dev->irq[1]); | 551 | (unsigned long long)dev->res.start, dev->irq[0], dev->irq[1]); |
552 | 552 | ||
553 | init_timer(&host->timer); | 553 | init_timer(&host->timer); |
554 | host->timer.data = (unsigned long)host; | 554 | host->timer.data = (unsigned long)host; |
diff --git a/drivers/mtd/devices/pmc551.c b/drivers/mtd/devices/pmc551.c index f620d74f1004..30f07b473ae2 100644 --- a/drivers/mtd/devices/pmc551.c +++ b/drivers/mtd/devices/pmc551.c | |||
@@ -551,11 +551,11 @@ static u32 fixup_pmc551 (struct pci_dev *dev) | |||
551 | /* | 551 | /* |
552 | * Some screen fun | 552 | * Some screen fun |
553 | */ | 553 | */ |
554 | printk(KERN_DEBUG "pmc551: %d%c (0x%x) of %sprefetchable memory at 0x%lx\n", | 554 | printk(KERN_DEBUG "pmc551: %d%c (0x%x) of %sprefetchable memory at 0x%llx\n", |
555 | (size<1024)?size:(size<1048576)?size>>10:size>>20, | 555 | (size<1024)?size:(size<1048576)?size>>10:size>>20, |
556 | (size<1024)?'B':(size<1048576)?'K':'M', | 556 | (size<1024)?'B':(size<1048576)?'K':'M', |
557 | size, ((dcmd&(0x1<<3)) == 0)?"non-":"", | 557 | size, ((dcmd&(0x1<<3)) == 0)?"non-":"", |
558 | (dev->resource[0].start)&PCI_BASE_ADDRESS_MEM_MASK ); | 558 | (unsigned long long)((dev->resource[0].start)&PCI_BASE_ADDRESS_MEM_MASK)); |
559 | 559 | ||
560 | /* | 560 | /* |
561 | * Check to see the state of the memory | 561 | * Check to see the state of the memory |
@@ -685,8 +685,8 @@ static int __init init_pmc551(void) | |||
685 | break; | 685 | break; |
686 | } | 686 | } |
687 | 687 | ||
688 | printk(KERN_NOTICE "pmc551: Found PCI V370PDC at 0x%lX\n", | 688 | printk(KERN_NOTICE "pmc551: Found PCI V370PDC at 0x%llx\n", |
689 | PCI_Device->resource[0].start); | 689 | (unsigned long long)PCI_Device->resource[0].start); |
690 | 690 | ||
691 | /* | 691 | /* |
692 | * The PMC551 device acts VERY weird if you don't init it | 692 | * The PMC551 device acts VERY weird if you don't init it |
diff --git a/drivers/mtd/maps/amd76xrom.c b/drivers/mtd/maps/amd76xrom.c index c350878d4592..a50587005263 100644 --- a/drivers/mtd/maps/amd76xrom.c +++ b/drivers/mtd/maps/amd76xrom.c | |||
@@ -123,9 +123,10 @@ static int __devinit amd76xrom_init_one (struct pci_dev *pdev, | |||
123 | window->rsrc.parent = NULL; | 123 | window->rsrc.parent = NULL; |
124 | printk(KERN_ERR MOD_NAME | 124 | printk(KERN_ERR MOD_NAME |
125 | " %s(): Unable to register resource" | 125 | " %s(): Unable to register resource" |
126 | " 0x%.08lx-0x%.08lx - kernel bug?\n", | 126 | " 0x%.16llx-0x%.16llx - kernel bug?\n", |
127 | __func__, | 127 | __func__, |
128 | window->rsrc.start, window->rsrc.end); | 128 | (unsigned long long)window->rsrc.start, |
129 | (unsigned long long)window->rsrc.end); | ||
129 | } | 130 | } |
130 | 131 | ||
131 | #if 0 | 132 | #if 0 |
diff --git a/drivers/mtd/maps/ichxrom.c b/drivers/mtd/maps/ichxrom.c index ea5073781b3a..16732794edf3 100644 --- a/drivers/mtd/maps/ichxrom.c +++ b/drivers/mtd/maps/ichxrom.c | |||
@@ -177,9 +177,10 @@ static int __devinit ichxrom_init_one (struct pci_dev *pdev, | |||
177 | window->rsrc.parent = NULL; | 177 | window->rsrc.parent = NULL; |
178 | printk(KERN_DEBUG MOD_NAME | 178 | printk(KERN_DEBUG MOD_NAME |
179 | ": %s(): Unable to register resource" | 179 | ": %s(): Unable to register resource" |
180 | " 0x%.08lx-0x%.08lx - kernel bug?\n", | 180 | " 0x%.16llx-0x%.16llx - kernel bug?\n", |
181 | __func__, | 181 | __func__, |
182 | window->rsrc.start, window->rsrc.end); | 182 | (unsigned long long)window->rsrc.start, |
183 | (unsigned long long)window->rsrc.end); | ||
183 | } | 184 | } |
184 | 185 | ||
185 | /* Map the firmware hub into my address space. */ | 186 | /* Map the firmware hub into my address space. */ |
diff --git a/drivers/mtd/maps/scx200_docflash.c b/drivers/mtd/maps/scx200_docflash.c index 28b8a571a91a..331a15859d71 100644 --- a/drivers/mtd/maps/scx200_docflash.c +++ b/drivers/mtd/maps/scx200_docflash.c | |||
@@ -164,8 +164,9 @@ static int __init init_scx200_docflash(void) | |||
164 | outl(pmr, scx200_cb_base + SCx200_PMR); | 164 | outl(pmr, scx200_cb_base + SCx200_PMR); |
165 | } | 165 | } |
166 | 166 | ||
167 | printk(KERN_INFO NAME ": DOCCS mapped at 0x%lx-0x%lx, width %d\n", | 167 | printk(KERN_INFO NAME ": DOCCS mapped at 0x%llx-0x%llx, width %d\n", |
168 | docmem.start, docmem.end, width); | 168 | (unsigned long long)docmem.start, |
169 | (unsigned long long)docmem.end, width); | ||
169 | 170 | ||
170 | scx200_docflash_map.size = size; | 171 | scx200_docflash_map.size = size; |
171 | if (width == 8) | 172 | if (width == 8) |
diff --git a/drivers/mtd/maps/sun_uflash.c b/drivers/mtd/maps/sun_uflash.c index 24a03152d196..4db2055cee31 100644 --- a/drivers/mtd/maps/sun_uflash.c +++ b/drivers/mtd/maps/sun_uflash.c | |||
@@ -62,9 +62,10 @@ int uflash_devinit(struct linux_ebus_device *edev, struct device_node *dp) | |||
62 | /* Non-CFI userflash device-- once I find one we | 62 | /* Non-CFI userflash device-- once I find one we |
63 | * can work on supporting it. | 63 | * can work on supporting it. |
64 | */ | 64 | */ |
65 | printk("%s: unsupported device at 0x%lx (%d regs): " \ | 65 | printk("%s: unsupported device at 0x%llx (%d regs): " \ |
66 | "email ebrower@usa.net\n", | 66 | "email ebrower@usa.net\n", |
67 | dp->full_name, res->start, edev->num_addrs); | 67 | dp->full_name, (unsigned long long)res->start, |
68 | edev->num_addrs); | ||
68 | 69 | ||
69 | return -ENODEV; | 70 | return -ENODEV; |
70 | } | 71 | } |
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index b467c383ae60..d2f808979a2b 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c | |||
@@ -1407,8 +1407,10 @@ static int __devinit vortex_probe1(struct device *gendev, | |||
1407 | } | 1407 | } |
1408 | 1408 | ||
1409 | if (print_info) { | 1409 | if (print_info) { |
1410 | printk(KERN_INFO "%s: CardBus functions mapped %8.8lx->%p\n", | 1410 | printk(KERN_INFO "%s: CardBus functions mapped " |
1411 | print_name, pci_resource_start(pdev, 2), | 1411 | "%16.16llx->%p\n", |
1412 | print_name, | ||
1413 | (unsigned long long)pci_resource_start(pdev, 2), | ||
1412 | vp->cb_fn_base); | 1414 | vp->cb_fn_base); |
1413 | } | 1415 | } |
1414 | EL3WINDOW(2); | 1416 | EL3WINDOW(2); |
diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index 0cdc830449d8..d26dd6a7062d 100644 --- a/drivers/net/8139cp.c +++ b/drivers/net/8139cp.c | |||
@@ -1823,7 +1823,7 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1823 | struct cp_private *cp; | 1823 | struct cp_private *cp; |
1824 | int rc; | 1824 | int rc; |
1825 | void __iomem *regs; | 1825 | void __iomem *regs; |
1826 | long pciaddr; | 1826 | resource_size_t pciaddr; |
1827 | unsigned int addr_len, i, pci_using_dac; | 1827 | unsigned int addr_len, i, pci_using_dac; |
1828 | u8 pci_rev; | 1828 | u8 pci_rev; |
1829 | 1829 | ||
@@ -1883,8 +1883,8 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1883 | } | 1883 | } |
1884 | if (pci_resource_len(pdev, 1) < CP_REGS_SIZE) { | 1884 | if (pci_resource_len(pdev, 1) < CP_REGS_SIZE) { |
1885 | rc = -EIO; | 1885 | rc = -EIO; |
1886 | printk(KERN_ERR PFX "MMIO resource (%lx) too small on pci dev %s\n", | 1886 | printk(KERN_ERR PFX "MMIO resource (%llx) too small on pci dev %s\n", |
1887 | pci_resource_len(pdev, 1), pci_name(pdev)); | 1887 | (unsigned long long)pci_resource_len(pdev, 1), pci_name(pdev)); |
1888 | goto err_out_res; | 1888 | goto err_out_res; |
1889 | } | 1889 | } |
1890 | 1890 | ||
@@ -1916,8 +1916,9 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1916 | regs = ioremap(pciaddr, CP_REGS_SIZE); | 1916 | regs = ioremap(pciaddr, CP_REGS_SIZE); |
1917 | if (!regs) { | 1917 | if (!regs) { |
1918 | rc = -EIO; | 1918 | rc = -EIO; |
1919 | printk(KERN_ERR PFX "Cannot map PCI MMIO (%lx@%lx) on pci dev %s\n", | 1919 | printk(KERN_ERR PFX "Cannot map PCI MMIO (%llx@%llx) on pci dev %s\n", |
1920 | pci_resource_len(pdev, 1), pciaddr, pci_name(pdev)); | 1920 | (unsigned long long)pci_resource_len(pdev, 1), |
1921 | (unsigned long long)pciaddr, pci_name(pdev)); | ||
1921 | goto err_out_res; | 1922 | goto err_out_res; |
1922 | } | 1923 | } |
1923 | dev->base_addr = (unsigned long) regs; | 1924 | dev->base_addr = (unsigned long) regs; |
diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c index abd6261465f1..ed2e3c03bc88 100644 --- a/drivers/net/8139too.c +++ b/drivers/net/8139too.c | |||
@@ -1341,9 +1341,9 @@ static int rtl8139_open (struct net_device *dev) | |||
1341 | netif_start_queue (dev); | 1341 | netif_start_queue (dev); |
1342 | 1342 | ||
1343 | if (netif_msg_ifup(tp)) | 1343 | if (netif_msg_ifup(tp)) |
1344 | printk(KERN_DEBUG "%s: rtl8139_open() ioaddr %#lx IRQ %d" | 1344 | printk(KERN_DEBUG "%s: rtl8139_open() ioaddr %#llx IRQ %d" |
1345 | " GP Pins %2.2x %s-duplex.\n", | 1345 | " GP Pins %2.2x %s-duplex.\n", dev->name, |
1346 | dev->name, pci_resource_start (tp->pci_dev, 1), | 1346 | (unsigned long long)pci_resource_start (tp->pci_dev, 1), |
1347 | dev->irq, RTL_R8 (MediaStatus), | 1347 | dev->irq, RTL_R8 (MediaStatus), |
1348 | tp->mii.full_duplex ? "full" : "half"); | 1348 | tp->mii.full_duplex ? "full" : "half"); |
1349 | 1349 | ||
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index f37170cc1a37..93a286570923 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
@@ -2678,9 +2678,9 @@ static int __devinit e100_probe(struct pci_dev *pdev, | |||
2678 | goto err_out_free; | 2678 | goto err_out_free; |
2679 | } | 2679 | } |
2680 | 2680 | ||
2681 | DPRINTK(PROBE, INFO, "addr 0x%lx, irq %d, " | 2681 | DPRINTK(PROBE, INFO, "addr 0x%llx, irq %d, " |
2682 | "MAC addr %02X:%02X:%02X:%02X:%02X:%02X\n", | 2682 | "MAC addr %02X:%02X:%02X:%02X:%02X:%02X\n", |
2683 | pci_resource_start(pdev, 0), pdev->irq, | 2683 | (unsigned long long)pci_resource_start(pdev, 0), pdev->irq, |
2684 | netdev->dev_addr[0], netdev->dev_addr[1], netdev->dev_addr[2], | 2684 | netdev->dev_addr[0], netdev->dev_addr[1], netdev->dev_addr[2], |
2685 | netdev->dev_addr[3], netdev->dev_addr[4], netdev->dev_addr[5]); | 2685 | netdev->dev_addr[3], netdev->dev_addr[4], netdev->dev_addr[5]); |
2686 | 2686 | ||
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index 19a4a16055dc..1608efab4e3d 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
@@ -3354,8 +3354,8 @@ static int __devinit skge_probe(struct pci_dev *pdev, | |||
3354 | if (err) | 3354 | if (err) |
3355 | goto err_out_free_irq; | 3355 | goto err_out_free_irq; |
3356 | 3356 | ||
3357 | printk(KERN_INFO PFX DRV_VERSION " addr 0x%lx irq %d chip %s rev %d\n", | 3357 | printk(KERN_INFO PFX DRV_VERSION " addr 0x%llx irq %d chip %s rev %d\n", |
3358 | pci_resource_start(pdev, 0), pdev->irq, | 3358 | (unsigned long long)pci_resource_start(pdev, 0), pdev->irq, |
3359 | skge_board_name(hw), hw->chip_rev); | 3359 | skge_board_name(hw), hw->chip_rev); |
3360 | 3360 | ||
3361 | if ((dev = skge_devinit(hw, 0, using_dac)) == NULL) | 3361 | if ((dev = skge_devinit(hw, 0, using_dac)) == NULL) |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index d3577871be28..e122007e16da 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -3311,9 +3311,9 @@ static int __devinit sky2_probe(struct pci_dev *pdev, | |||
3311 | if (err) | 3311 | if (err) |
3312 | goto err_out_iounmap; | 3312 | goto err_out_iounmap; |
3313 | 3313 | ||
3314 | printk(KERN_INFO PFX "v%s addr 0x%lx irq %d Yukon-%s (0x%x) rev %d\n", | 3314 | printk(KERN_INFO PFX "v%s addr 0x%llx irq %d Yukon-%s (0x%x) rev %d\n", |
3315 | DRV_VERSION, pci_resource_start(pdev, 0), pdev->irq, | 3315 | DRV_VERSION, (unsigned long long)pci_resource_start(pdev, 0), |
3316 | yukon2_name[hw->chip_id - CHIP_ID_YUKON_XL], | 3316 | pdev->irq, yukon2_name[hw->chip_id - CHIP_ID_YUKON_XL], |
3317 | hw->chip_id, hw->chip_rev); | 3317 | hw->chip_id, hw->chip_rev); |
3318 | 3318 | ||
3319 | dev = sky2_init_netdev(hw, 0, using_dac); | 3319 | dev = sky2_init_netdev(hw, 0, using_dac); |
diff --git a/drivers/net/tulip/de2104x.c b/drivers/net/tulip/de2104x.c index 5f743b972949..fc2468ecce0b 100644 --- a/drivers/net/tulip/de2104x.c +++ b/drivers/net/tulip/de2104x.c | |||
@@ -2007,8 +2007,8 @@ static int __init de_init_one (struct pci_dev *pdev, | |||
2007 | } | 2007 | } |
2008 | if (pci_resource_len(pdev, 1) < DE_REGS_SIZE) { | 2008 | if (pci_resource_len(pdev, 1) < DE_REGS_SIZE) { |
2009 | rc = -EIO; | 2009 | rc = -EIO; |
2010 | printk(KERN_ERR PFX "MMIO resource (%lx) too small on pci dev %s\n", | 2010 | printk(KERN_ERR PFX "MMIO resource (%llx) too small on pci dev %s\n", |
2011 | pci_resource_len(pdev, 1), pci_name(pdev)); | 2011 | (unsigned long long)pci_resource_len(pdev, 1), pci_name(pdev)); |
2012 | goto err_out_res; | 2012 | goto err_out_res; |
2013 | } | 2013 | } |
2014 | 2014 | ||
@@ -2016,8 +2016,9 @@ static int __init de_init_one (struct pci_dev *pdev, | |||
2016 | regs = ioremap_nocache(pciaddr, DE_REGS_SIZE); | 2016 | regs = ioremap_nocache(pciaddr, DE_REGS_SIZE); |
2017 | if (!regs) { | 2017 | if (!regs) { |
2018 | rc = -EIO; | 2018 | rc = -EIO; |
2019 | printk(KERN_ERR PFX "Cannot map PCI MMIO (%lx@%lx) on pci dev %s\n", | 2019 | printk(KERN_ERR PFX "Cannot map PCI MMIO (%llx@%lx) on pci dev %s\n", |
2020 | pci_resource_len(pdev, 1), pciaddr, pci_name(pdev)); | 2020 | (unsigned long long)pci_resource_len(pdev, 1), |
2021 | pciaddr, pci_name(pdev)); | ||
2021 | goto err_out_res; | 2022 | goto err_out_res; |
2022 | } | 2023 | } |
2023 | dev->base_addr = (unsigned long) regs; | 2024 | dev->base_addr = (unsigned long) regs; |
diff --git a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c index e0de66739a42..53fd9b56d0bd 100644 --- a/drivers/net/tulip/tulip_core.c +++ b/drivers/net/tulip/tulip_core.c | |||
@@ -1350,10 +1350,10 @@ static int __devinit tulip_init_one (struct pci_dev *pdev, | |||
1350 | SET_MODULE_OWNER(dev); | 1350 | SET_MODULE_OWNER(dev); |
1351 | SET_NETDEV_DEV(dev, &pdev->dev); | 1351 | SET_NETDEV_DEV(dev, &pdev->dev); |
1352 | if (pci_resource_len (pdev, 0) < tulip_tbl[chip_idx].io_size) { | 1352 | if (pci_resource_len (pdev, 0) < tulip_tbl[chip_idx].io_size) { |
1353 | printk (KERN_ERR PFX "%s: I/O region (0x%lx@0x%lx) too small, " | 1353 | printk (KERN_ERR PFX "%s: I/O region (0x%llx@0x%llx) too small, " |
1354 | "aborting\n", pci_name(pdev), | 1354 | "aborting\n", pci_name(pdev), |
1355 | pci_resource_len (pdev, 0), | 1355 | (unsigned long long)pci_resource_len (pdev, 0), |
1356 | pci_resource_start (pdev, 0)); | 1356 | (unsigned long long)pci_resource_start (pdev, 0)); |
1357 | goto err_out_free_netdev; | 1357 | goto err_out_free_netdev; |
1358 | } | 1358 | } |
1359 | 1359 | ||
diff --git a/drivers/net/typhoon.c b/drivers/net/typhoon.c index e49e8b520c28..e24d2dafcf6c 100644 --- a/drivers/net/typhoon.c +++ b/drivers/net/typhoon.c | |||
@@ -2568,9 +2568,10 @@ typhoon_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
2568 | 2568 | ||
2569 | pci_set_drvdata(pdev, dev); | 2569 | pci_set_drvdata(pdev, dev); |
2570 | 2570 | ||
2571 | printk(KERN_INFO "%s: %s at %s 0x%lx, ", | 2571 | printk(KERN_INFO "%s: %s at %s 0x%llx, ", |
2572 | dev->name, typhoon_card_info[card_id].name, | 2572 | dev->name, typhoon_card_info[card_id].name, |
2573 | use_mmio ? "MMIO" : "IO", pci_resource_start(pdev, use_mmio)); | 2573 | use_mmio ? "MMIO" : "IO", |
2574 | (unsigned long long)pci_resource_start(pdev, use_mmio)); | ||
2574 | for(i = 0; i < 5; i++) | 2575 | for(i = 0; i < 5; i++) |
2575 | printk("%2.2x:", dev->dev_addr[i]); | 2576 | printk("%2.2x:", dev->dev_addr[i]); |
2576 | printk("%2.2x\n", dev->dev_addr[i]); | 2577 | printk("%2.2x\n", dev->dev_addr[i]); |
diff --git a/drivers/net/wan/dscc4.c b/drivers/net/wan/dscc4.c index 4505540e3c59..04a376ec0ed8 100644 --- a/drivers/net/wan/dscc4.c +++ b/drivers/net/wan/dscc4.c | |||
@@ -732,15 +732,15 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev, | |||
732 | ioaddr = ioremap(pci_resource_start(pdev, 0), | 732 | ioaddr = ioremap(pci_resource_start(pdev, 0), |
733 | pci_resource_len(pdev, 0)); | 733 | pci_resource_len(pdev, 0)); |
734 | if (!ioaddr) { | 734 | if (!ioaddr) { |
735 | printk(KERN_ERR "%s: cannot remap MMIO region %lx @ %lx\n", | 735 | printk(KERN_ERR "%s: cannot remap MMIO region %llx @ %llx\n", |
736 | DRV_NAME, pci_resource_len(pdev, 0), | 736 | DRV_NAME, (unsigned long long)pci_resource_len(pdev, 0), |
737 | pci_resource_start(pdev, 0)); | 737 | (unsigned long long)pci_resource_start(pdev, 0)); |
738 | rc = -EIO; | 738 | rc = -EIO; |
739 | goto err_free_mmio_regions_2; | 739 | goto err_free_mmio_regions_2; |
740 | } | 740 | } |
741 | printk(KERN_DEBUG "Siemens DSCC4, MMIO at %#lx (regs), %#lx (lbi), IRQ %d\n", | 741 | printk(KERN_DEBUG "Siemens DSCC4, MMIO at %#llx (regs), %#llx (lbi), IRQ %d\n", |
742 | pci_resource_start(pdev, 0), | 742 | (unsigned long long)pci_resource_start(pdev, 0), |
743 | pci_resource_start(pdev, 1), pdev->irq); | 743 | (unsigned long long)pci_resource_start(pdev, 1), pdev->irq); |
744 | 744 | ||
745 | /* Cf errata DS5 p.2 */ | 745 | /* Cf errata DS5 p.2 */ |
746 | pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xf8); | 746 | pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xf8); |
diff --git a/drivers/net/wan/pc300_drv.c b/drivers/net/wan/pc300_drv.c index a3e65d1bc19b..d7897ae89f90 100644 --- a/drivers/net/wan/pc300_drv.c +++ b/drivers/net/wan/pc300_drv.c | |||
@@ -3445,9 +3445,9 @@ cpc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
3445 | 3445 | ||
3446 | card = (pc300_t *) kmalloc(sizeof(pc300_t), GFP_KERNEL); | 3446 | card = (pc300_t *) kmalloc(sizeof(pc300_t), GFP_KERNEL); |
3447 | if (card == NULL) { | 3447 | if (card == NULL) { |
3448 | printk("PC300 found at RAM 0x%08lx, " | 3448 | printk("PC300 found at RAM 0x%016llx, " |
3449 | "but could not allocate card structure.\n", | 3449 | "but could not allocate card structure.\n", |
3450 | pci_resource_start(pdev, 3)); | 3450 | (unsigned long long)pci_resource_start(pdev, 3)); |
3451 | err = -ENOMEM; | 3451 | err = -ENOMEM; |
3452 | goto err_disable_dev; | 3452 | goto err_disable_dev; |
3453 | } | 3453 | } |
diff --git a/drivers/parisc/Kconfig b/drivers/parisc/Kconfig index 3f5de867acd7..1d3b84b4af3f 100644 --- a/drivers/parisc/Kconfig +++ b/drivers/parisc/Kconfig | |||
@@ -140,18 +140,37 @@ config CHASSIS_LCD_LED | |||
140 | If unsure, say Y. | 140 | If unsure, say Y. |
141 | 141 | ||
142 | config PDC_CHASSIS | 142 | config PDC_CHASSIS |
143 | bool "PDC chassis State Panel support" | 143 | bool "PDC chassis state codes support" |
144 | default y | 144 | default y |
145 | help | 145 | help |
146 | Say Y here if you want to enable support for the LED State front | 146 | Say Y here if you want to enable support for Chassis codes. |
147 | panel as found on E class, and support for the GSP Virtual Front | 147 | That includes support for LED State front panel as found on E |
148 | Panel (LED State and message logging) as found on high end | 148 | class, and support for the GSP Virtual Front Panel (LED State and |
149 | servers such as A, L and N-class. | 149 | message logging) as found on high end servers such as A, L and |
150 | 150 | N-class. | |
151 | This has nothing to do with Chassis LCD and LED support. | 151 | This driver will also display progress messages on LCD display, |
152 | such as "INI", "RUN" and "FLT", and might thus clobber messages | ||
153 | shown by the LED/LCD driver. | ||
154 | This driver updates the state panel (LED and/or LCD) upon system | ||
155 | state change (eg: boot, shutdown or panic). | ||
152 | 156 | ||
153 | If unsure, say Y. | 157 | If unsure, say Y. |
154 | 158 | ||
159 | |||
160 | config PDC_CHASSIS_WARN | ||
161 | bool "PDC chassis warnings support" | ||
162 | depends on PROC_FS | ||
163 | default y | ||
164 | help | ||
165 | Say Y here if you want to enable support for Chassis warnings. | ||
166 | This will add a proc entry '/proc/chassis' giving some information | ||
167 | about the overall health state of the system. | ||
168 | This includes NVRAM battery level, overtemp or failures such as | ||
169 | fans or power units. | ||
170 | |||
171 | If unsure, say Y. | ||
172 | |||
173 | |||
155 | config PDC_STABLE | 174 | config PDC_STABLE |
156 | tristate "PDC Stable Storage support" | 175 | tristate "PDC Stable Storage support" |
157 | depends on SYSFS | 176 | depends on SYSFS |
diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index 6e8ed0c81a6c..ce0a6ebcff15 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c | |||
@@ -299,7 +299,7 @@ struct pci_port_ops dino_port_ops = { | |||
299 | 299 | ||
300 | static void dino_disable_irq(unsigned int irq) | 300 | static void dino_disable_irq(unsigned int irq) |
301 | { | 301 | { |
302 | struct dino_device *dino_dev = irq_desc[irq].handler_data; | 302 | struct dino_device *dino_dev = irq_desc[irq].chip_data; |
303 | int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS); | 303 | int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS); |
304 | 304 | ||
305 | DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq); | 305 | DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq); |
@@ -311,7 +311,7 @@ static void dino_disable_irq(unsigned int irq) | |||
311 | 311 | ||
312 | static void dino_enable_irq(unsigned int irq) | 312 | static void dino_enable_irq(unsigned int irq) |
313 | { | 313 | { |
314 | struct dino_device *dino_dev = irq_desc[irq].handler_data; | 314 | struct dino_device *dino_dev = irq_desc[irq].chip_data; |
315 | int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS); | 315 | int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS); |
316 | u32 tmp; | 316 | u32 tmp; |
317 | 317 | ||
diff --git a/drivers/parisc/eisa.c b/drivers/parisc/eisa.c index 9d3bd15bf53b..58f0ce8d78e0 100644 --- a/drivers/parisc/eisa.c +++ b/drivers/parisc/eisa.c | |||
@@ -350,7 +350,7 @@ static int __devinit eisa_probe(struct parisc_device *dev) | |||
350 | irq_desc[2].action = &irq2_action; | 350 | irq_desc[2].action = &irq2_action; |
351 | 351 | ||
352 | for (i = 0; i < 16; i++) { | 352 | for (i = 0; i < 16; i++) { |
353 | irq_desc[i].handler = &eisa_interrupt_type; | 353 | irq_desc[i].chip = &eisa_interrupt_type; |
354 | } | 354 | } |
355 | 355 | ||
356 | EISA_bus = 1; | 356 | EISA_bus = 1; |
diff --git a/drivers/parisc/gsc.c b/drivers/parisc/gsc.c index 16d40f95978d..5476ba7709b3 100644 --- a/drivers/parisc/gsc.c +++ b/drivers/parisc/gsc.c | |||
@@ -109,7 +109,7 @@ int gsc_find_local_irq(unsigned int irq, int *global_irqs, int limit) | |||
109 | 109 | ||
110 | static void gsc_asic_disable_irq(unsigned int irq) | 110 | static void gsc_asic_disable_irq(unsigned int irq) |
111 | { | 111 | { |
112 | struct gsc_asic *irq_dev = irq_desc[irq].handler_data; | 112 | struct gsc_asic *irq_dev = irq_desc[irq].chip_data; |
113 | int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); | 113 | int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); |
114 | u32 imr; | 114 | u32 imr; |
115 | 115 | ||
@@ -124,7 +124,7 @@ static void gsc_asic_disable_irq(unsigned int irq) | |||
124 | 124 | ||
125 | static void gsc_asic_enable_irq(unsigned int irq) | 125 | static void gsc_asic_enable_irq(unsigned int irq) |
126 | { | 126 | { |
127 | struct gsc_asic *irq_dev = irq_desc[irq].handler_data; | 127 | struct gsc_asic *irq_dev = irq_desc[irq].chip_data; |
128 | int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); | 128 | int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); |
129 | u32 imr; | 129 | u32 imr; |
130 | 130 | ||
@@ -164,8 +164,8 @@ int gsc_assign_irq(struct hw_interrupt_type *type, void *data) | |||
164 | if (irq > GSC_IRQ_MAX) | 164 | if (irq > GSC_IRQ_MAX) |
165 | return NO_IRQ; | 165 | return NO_IRQ; |
166 | 166 | ||
167 | irq_desc[irq].handler = type; | 167 | irq_desc[irq].chip = type; |
168 | irq_desc[irq].handler_data = data; | 168 | irq_desc[irq].chip_data = data; |
169 | return irq++; | 169 | return irq++; |
170 | } | 170 | } |
171 | 171 | ||
diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index 7a458d5bc751..1fbda77cefc2 100644 --- a/drivers/parisc/iosapic.c +++ b/drivers/parisc/iosapic.c | |||
@@ -619,7 +619,7 @@ iosapic_set_irt_data( struct vector_info *vi, u32 *dp0, u32 *dp1) | |||
619 | 619 | ||
620 | static struct vector_info *iosapic_get_vector(unsigned int irq) | 620 | static struct vector_info *iosapic_get_vector(unsigned int irq) |
621 | { | 621 | { |
622 | return irq_desc[irq].handler_data; | 622 | return irq_desc[irq].chip_data; |
623 | } | 623 | } |
624 | 624 | ||
625 | static void iosapic_disable_irq(unsigned int irq) | 625 | static void iosapic_disable_irq(unsigned int irq) |
diff --git a/drivers/parisc/pdc_stable.c b/drivers/parisc/pdc_stable.c index bbeabe3fc4c6..ea1b7a63598e 100644 --- a/drivers/parisc/pdc_stable.c +++ b/drivers/parisc/pdc_stable.c | |||
@@ -28,8 +28,15 @@ | |||
28 | * following code can deal with just 96 bytes of Stable Storage, and all | 28 | * following code can deal with just 96 bytes of Stable Storage, and all |
29 | * sizes between 96 and 192 bytes (provided they are multiple of struct | 29 | * sizes between 96 and 192 bytes (provided they are multiple of struct |
30 | * device_path size, eg: 128, 160 and 192) to provide full information. | 30 | * device_path size, eg: 128, 160 and 192) to provide full information. |
31 | * The code makes no use of data above 192 bytes. One last word: there's one | 31 | * One last word: there's one path we can always count on: the primary path. |
32 | * path we can always count on: the primary path. | 32 | * Anything above 224 bytes is used for 'osdep2' OS-dependent storage area. |
33 | * | ||
34 | * The first OS-dependent area should always be available. Obviously, this is | ||
35 | * not true for the other one. Also bear in mind that reading/writing from/to | ||
36 | * osdep2 is much more expensive than from/to osdep1. | ||
37 | * NOTE: We do not handle the 2 bytes OS-dep area at 0x5D, nor the first | ||
38 | * 2 bytes of storage available right after OSID. That's a total of 4 bytes | ||
39 | * sacrificed: -ETOOLAZY :P | ||
33 | * | 40 | * |
34 | * The current policy wrt file permissions is: | 41 | * The current policy wrt file permissions is: |
35 | * - write: root only | 42 | * - write: root only |
@@ -64,15 +71,18 @@ | |||
64 | #include <asm/uaccess.h> | 71 | #include <asm/uaccess.h> |
65 | #include <asm/hardware.h> | 72 | #include <asm/hardware.h> |
66 | 73 | ||
67 | #define PDCS_VERSION "0.22" | 74 | #define PDCS_VERSION "0.30" |
68 | #define PDCS_PREFIX "PDC Stable Storage" | 75 | #define PDCS_PREFIX "PDC Stable Storage" |
69 | 76 | ||
70 | #define PDCS_ADDR_PPRI 0x00 | 77 | #define PDCS_ADDR_PPRI 0x00 |
71 | #define PDCS_ADDR_OSID 0x40 | 78 | #define PDCS_ADDR_OSID 0x40 |
79 | #define PDCS_ADDR_OSD1 0x48 | ||
80 | #define PDCS_ADDR_DIAG 0x58 | ||
72 | #define PDCS_ADDR_FSIZ 0x5C | 81 | #define PDCS_ADDR_FSIZ 0x5C |
73 | #define PDCS_ADDR_PCON 0x60 | 82 | #define PDCS_ADDR_PCON 0x60 |
74 | #define PDCS_ADDR_PALT 0x80 | 83 | #define PDCS_ADDR_PALT 0x80 |
75 | #define PDCS_ADDR_PKBD 0xA0 | 84 | #define PDCS_ADDR_PKBD 0xA0 |
85 | #define PDCS_ADDR_OSD2 0xE0 | ||
76 | 86 | ||
77 | MODULE_AUTHOR("Thibaut VARENE <varenet@parisc-linux.org>"); | 87 | MODULE_AUTHOR("Thibaut VARENE <varenet@parisc-linux.org>"); |
78 | MODULE_DESCRIPTION("sysfs interface to HP PDC Stable Storage data"); | 88 | MODULE_DESCRIPTION("sysfs interface to HP PDC Stable Storage data"); |
@@ -82,6 +92,9 @@ MODULE_VERSION(PDCS_VERSION); | |||
82 | /* holds Stable Storage size. Initialized once and for all, no lock needed */ | 92 | /* holds Stable Storage size. Initialized once and for all, no lock needed */ |
83 | static unsigned long pdcs_size __read_mostly; | 93 | static unsigned long pdcs_size __read_mostly; |
84 | 94 | ||
95 | /* holds OS ID. Initialized once and for all, hopefully to 0x0006 */ | ||
96 | static u16 pdcs_osid __read_mostly; | ||
97 | |||
85 | /* This struct defines what we need to deal with a parisc pdc path entry */ | 98 | /* This struct defines what we need to deal with a parisc pdc path entry */ |
86 | struct pdcspath_entry { | 99 | struct pdcspath_entry { |
87 | rwlock_t rw_lock; /* to protect path entry access */ | 100 | rwlock_t rw_lock; /* to protect path entry access */ |
@@ -609,27 +622,64 @@ static ssize_t | |||
609 | pdcs_osid_read(struct subsystem *entry, char *buf) | 622 | pdcs_osid_read(struct subsystem *entry, char *buf) |
610 | { | 623 | { |
611 | char *out = buf; | 624 | char *out = buf; |
612 | __u32 result; | ||
613 | char *tmpstr = NULL; | ||
614 | 625 | ||
615 | if (!entry || !buf) | 626 | if (!entry || !buf) |
616 | return -EINVAL; | 627 | return -EINVAL; |
617 | 628 | ||
618 | /* get OSID */ | 629 | out += sprintf(out, "%s dependent data (0x%.4x)\n", |
619 | if (pdc_stable_read(PDCS_ADDR_OSID, &result, sizeof(result)) != PDC_OK) | 630 | os_id_to_string(pdcs_osid), pdcs_osid); |
631 | |||
632 | return out - buf; | ||
633 | } | ||
634 | |||
635 | /** | ||
636 | * pdcs_osdep1_read - Stable Storage OS-Dependent data area 1 output. | ||
637 | * @entry: An allocated and populated subsytem struct. We don't use it tho. | ||
638 | * @buf: The output buffer to write to. | ||
639 | * | ||
640 | * This can hold 16 bytes of OS-Dependent data. | ||
641 | */ | ||
642 | static ssize_t | ||
643 | pdcs_osdep1_read(struct subsystem *entry, char *buf) | ||
644 | { | ||
645 | char *out = buf; | ||
646 | u32 result[4]; | ||
647 | |||
648 | if (!entry || !buf) | ||
649 | return -EINVAL; | ||
650 | |||
651 | if (pdc_stable_read(PDCS_ADDR_OSD1, &result, sizeof(result)) != PDC_OK) | ||
620 | return -EIO; | 652 | return -EIO; |
621 | 653 | ||
622 | /* the actual result is 16 bits away */ | 654 | out += sprintf(out, "0x%.8x\n", result[0]); |
623 | switch (result >> 16) { | 655 | out += sprintf(out, "0x%.8x\n", result[1]); |
624 | case 0x0000: tmpstr = "No OS-dependent data"; break; | 656 | out += sprintf(out, "0x%.8x\n", result[2]); |
625 | case 0x0001: tmpstr = "HP-UX dependent data"; break; | 657 | out += sprintf(out, "0x%.8x\n", result[3]); |
626 | case 0x0002: tmpstr = "MPE-iX dependent data"; break; | 658 | |
627 | case 0x0003: tmpstr = "OSF dependent data"; break; | 659 | return out - buf; |
628 | case 0x0004: tmpstr = "HP-RT dependent data"; break; | 660 | } |
629 | case 0x0005: tmpstr = "Novell Netware dependent data"; break; | 661 | |
630 | default: tmpstr = "Unknown"; break; | 662 | /** |
631 | } | 663 | * pdcs_diagnostic_read - Stable Storage Diagnostic register output. |
632 | out += sprintf(out, "%s (0x%.4x)\n", tmpstr, (result >> 16)); | 664 | * @entry: An allocated and populated subsytem struct. We don't use it tho. |
665 | * @buf: The output buffer to write to. | ||
666 | * | ||
667 | * I have NFC how to interpret the content of that register ;-). | ||
668 | */ | ||
669 | static ssize_t | ||
670 | pdcs_diagnostic_read(struct subsystem *entry, char *buf) | ||
671 | { | ||
672 | char *out = buf; | ||
673 | u32 result; | ||
674 | |||
675 | if (!entry || !buf) | ||
676 | return -EINVAL; | ||
677 | |||
678 | /* get diagnostic */ | ||
679 | if (pdc_stable_read(PDCS_ADDR_DIAG, &result, sizeof(result)) != PDC_OK) | ||
680 | return -EIO; | ||
681 | |||
682 | out += sprintf(out, "0x%.4x\n", (result >> 16)); | ||
633 | 683 | ||
634 | return out - buf; | 684 | return out - buf; |
635 | } | 685 | } |
@@ -645,7 +695,7 @@ static ssize_t | |||
645 | pdcs_fastsize_read(struct subsystem *entry, char *buf) | 695 | pdcs_fastsize_read(struct subsystem *entry, char *buf) |
646 | { | 696 | { |
647 | char *out = buf; | 697 | char *out = buf; |
648 | __u32 result; | 698 | u32 result; |
649 | 699 | ||
650 | if (!entry || !buf) | 700 | if (!entry || !buf) |
651 | return -EINVAL; | 701 | return -EINVAL; |
@@ -664,6 +714,39 @@ pdcs_fastsize_read(struct subsystem *entry, char *buf) | |||
664 | } | 714 | } |
665 | 715 | ||
666 | /** | 716 | /** |
717 | * pdcs_osdep2_read - Stable Storage OS-Dependent data area 2 output. | ||
718 | * @entry: An allocated and populated subsytem struct. We don't use it tho. | ||
719 | * @buf: The output buffer to write to. | ||
720 | * | ||
721 | * This can hold pdcs_size - 224 bytes of OS-Dependent data, when available. | ||
722 | */ | ||
723 | static ssize_t | ||
724 | pdcs_osdep2_read(struct subsystem *entry, char *buf) | ||
725 | { | ||
726 | char *out = buf; | ||
727 | unsigned long size; | ||
728 | unsigned short i; | ||
729 | u32 result; | ||
730 | |||
731 | if (unlikely(pdcs_size <= 224)) | ||
732 | return -ENODATA; | ||
733 | |||
734 | size = pdcs_size - 224; | ||
735 | |||
736 | if (!entry || !buf) | ||
737 | return -EINVAL; | ||
738 | |||
739 | for (i=0; i<size; i+=4) { | ||
740 | if (unlikely(pdc_stable_read(PDCS_ADDR_OSD2 + i, &result, | ||
741 | sizeof(result)) != PDC_OK)) | ||
742 | return -EIO; | ||
743 | out += sprintf(out, "0x%.8x\n", result); | ||
744 | } | ||
745 | |||
746 | return out - buf; | ||
747 | } | ||
748 | |||
749 | /** | ||
667 | * pdcs_auto_write - This function handles autoboot/search flag modifying. | 750 | * pdcs_auto_write - This function handles autoboot/search flag modifying. |
668 | * @entry: An allocated and populated subsytem struct. We don't use it tho. | 751 | * @entry: An allocated and populated subsytem struct. We don't use it tho. |
669 | * @buf: The input buffer to read from. | 752 | * @buf: The input buffer to read from. |
@@ -770,13 +853,100 @@ pdcs_autosearch_write(struct subsystem *entry, const char *buf, size_t count) | |||
770 | return pdcs_auto_write(entry, buf, count, PF_AUTOSEARCH); | 853 | return pdcs_auto_write(entry, buf, count, PF_AUTOSEARCH); |
771 | } | 854 | } |
772 | 855 | ||
856 | /** | ||
857 | * pdcs_osdep1_write - Stable Storage OS-Dependent data area 1 input. | ||
858 | * @entry: An allocated and populated subsytem struct. We don't use it tho. | ||
859 | * @buf: The input buffer to read from. | ||
860 | * @count: The number of bytes to be read. | ||
861 | * | ||
862 | * This can store 16 bytes of OS-Dependent data. We use a byte-by-byte | ||
863 | * write approach. It's up to userspace to deal with it when constructing | ||
864 | * its input buffer. | ||
865 | */ | ||
866 | static ssize_t | ||
867 | pdcs_osdep1_write(struct subsystem *entry, const char *buf, size_t count) | ||
868 | { | ||
869 | u8 in[16]; | ||
870 | |||
871 | if (!capable(CAP_SYS_ADMIN)) | ||
872 | return -EACCES; | ||
873 | |||
874 | if (!entry || !buf || !count) | ||
875 | return -EINVAL; | ||
876 | |||
877 | if (unlikely(pdcs_osid != OS_ID_LINUX)) | ||
878 | return -EPERM; | ||
879 | |||
880 | if (count > 16) | ||
881 | return -EMSGSIZE; | ||
882 | |||
883 | /* We'll use a local copy of buf */ | ||
884 | memset(in, 0, 16); | ||
885 | memcpy(in, buf, count); | ||
886 | |||
887 | if (pdc_stable_write(PDCS_ADDR_OSD1, &in, sizeof(in)) != PDC_OK) | ||
888 | return -EIO; | ||
889 | |||
890 | return count; | ||
891 | } | ||
892 | |||
893 | /** | ||
894 | * pdcs_osdep2_write - Stable Storage OS-Dependent data area 2 input. | ||
895 | * @entry: An allocated and populated subsytem struct. We don't use it tho. | ||
896 | * @buf: The input buffer to read from. | ||
897 | * @count: The number of bytes to be read. | ||
898 | * | ||
899 | * This can store pdcs_size - 224 bytes of OS-Dependent data. We use a | ||
900 | * byte-by-byte write approach. It's up to userspace to deal with it when | ||
901 | * constructing its input buffer. | ||
902 | */ | ||
903 | static ssize_t | ||
904 | pdcs_osdep2_write(struct subsystem *entry, const char *buf, size_t count) | ||
905 | { | ||
906 | unsigned long size; | ||
907 | unsigned short i; | ||
908 | u8 in[4]; | ||
909 | |||
910 | if (!capable(CAP_SYS_ADMIN)) | ||
911 | return -EACCES; | ||
912 | |||
913 | if (!entry || !buf || !count) | ||
914 | return -EINVAL; | ||
915 | |||
916 | if (unlikely(pdcs_size <= 224)) | ||
917 | return -ENOSYS; | ||
918 | |||
919 | if (unlikely(pdcs_osid != OS_ID_LINUX)) | ||
920 | return -EPERM; | ||
921 | |||
922 | size = pdcs_size - 224; | ||
923 | |||
924 | if (count > size) | ||
925 | return -EMSGSIZE; | ||
926 | |||
927 | /* We'll use a local copy of buf */ | ||
928 | |||
929 | for (i=0; i<count; i+=4) { | ||
930 | memset(in, 0, 4); | ||
931 | memcpy(in, buf+i, (count-i < 4) ? count-i : 4); | ||
932 | if (unlikely(pdc_stable_write(PDCS_ADDR_OSD2 + i, &in, | ||
933 | sizeof(in)) != PDC_OK)) | ||
934 | return -EIO; | ||
935 | } | ||
936 | |||
937 | return count; | ||
938 | } | ||
939 | |||
773 | /* The remaining attributes. */ | 940 | /* The remaining attributes. */ |
774 | static PDCS_ATTR(size, 0444, pdcs_size_read, NULL); | 941 | static PDCS_ATTR(size, 0444, pdcs_size_read, NULL); |
775 | static PDCS_ATTR(autoboot, 0644, pdcs_autoboot_read, pdcs_autoboot_write); | 942 | static PDCS_ATTR(autoboot, 0644, pdcs_autoboot_read, pdcs_autoboot_write); |
776 | static PDCS_ATTR(autosearch, 0644, pdcs_autosearch_read, pdcs_autosearch_write); | 943 | static PDCS_ATTR(autosearch, 0644, pdcs_autosearch_read, pdcs_autosearch_write); |
777 | static PDCS_ATTR(timer, 0444, pdcs_timer_read, NULL); | 944 | static PDCS_ATTR(timer, 0444, pdcs_timer_read, NULL); |
778 | static PDCS_ATTR(osid, 0400, pdcs_osid_read, NULL); | 945 | static PDCS_ATTR(osid, 0444, pdcs_osid_read, NULL); |
946 | static PDCS_ATTR(osdep1, 0600, pdcs_osdep1_read, pdcs_osdep1_write); | ||
947 | static PDCS_ATTR(diagnostic, 0400, pdcs_diagnostic_read, NULL); | ||
779 | static PDCS_ATTR(fastsize, 0400, pdcs_fastsize_read, NULL); | 948 | static PDCS_ATTR(fastsize, 0400, pdcs_fastsize_read, NULL); |
949 | static PDCS_ATTR(osdep2, 0600, pdcs_osdep2_read, pdcs_osdep2_write); | ||
780 | 950 | ||
781 | static struct subsys_attribute *pdcs_subsys_attrs[] = { | 951 | static struct subsys_attribute *pdcs_subsys_attrs[] = { |
782 | &pdcs_attr_size, | 952 | &pdcs_attr_size, |
@@ -784,7 +954,10 @@ static struct subsys_attribute *pdcs_subsys_attrs[] = { | |||
784 | &pdcs_attr_autosearch, | 954 | &pdcs_attr_autosearch, |
785 | &pdcs_attr_timer, | 955 | &pdcs_attr_timer, |
786 | &pdcs_attr_osid, | 956 | &pdcs_attr_osid, |
957 | &pdcs_attr_osdep1, | ||
958 | &pdcs_attr_diagnostic, | ||
787 | &pdcs_attr_fastsize, | 959 | &pdcs_attr_fastsize, |
960 | &pdcs_attr_osdep2, | ||
788 | NULL, | 961 | NULL, |
789 | }; | 962 | }; |
790 | 963 | ||
@@ -865,6 +1038,7 @@ pdc_stable_init(void) | |||
865 | { | 1038 | { |
866 | struct subsys_attribute *attr; | 1039 | struct subsys_attribute *attr; |
867 | int i, rc = 0, error = 0; | 1040 | int i, rc = 0, error = 0; |
1041 | u32 result; | ||
868 | 1042 | ||
869 | /* find the size of the stable storage */ | 1043 | /* find the size of the stable storage */ |
870 | if (pdc_stable_get_size(&pdcs_size) != PDC_OK) | 1044 | if (pdc_stable_get_size(&pdcs_size) != PDC_OK) |
@@ -876,6 +1050,13 @@ pdc_stable_init(void) | |||
876 | 1050 | ||
877 | printk(KERN_INFO PDCS_PREFIX " facility v%s\n", PDCS_VERSION); | 1051 | printk(KERN_INFO PDCS_PREFIX " facility v%s\n", PDCS_VERSION); |
878 | 1052 | ||
1053 | /* get OSID */ | ||
1054 | if (pdc_stable_read(PDCS_ADDR_OSID, &result, sizeof(result)) != PDC_OK) | ||
1055 | return -EIO; | ||
1056 | |||
1057 | /* the actual result is 16 bits away */ | ||
1058 | pdcs_osid = (u16)(result >> 16); | ||
1059 | |||
879 | /* For now we'll register the stable subsys within this driver */ | 1060 | /* For now we'll register the stable subsys within this driver */ |
880 | if ((rc = firmware_register(&stable_subsys))) | 1061 | if ((rc = firmware_register(&stable_subsys))) |
881 | goto fail_firmreg; | 1062 | goto fail_firmreg; |
@@ -887,7 +1068,7 @@ pdc_stable_init(void) | |||
887 | 1068 | ||
888 | /* register the paths subsys as a subsystem of stable subsys */ | 1069 | /* register the paths subsys as a subsystem of stable subsys */ |
889 | kset_set_kset_s(&paths_subsys, stable_subsys); | 1070 | kset_set_kset_s(&paths_subsys, stable_subsys); |
890 | if ((rc= subsystem_register(&paths_subsys))) | 1071 | if ((rc = subsystem_register(&paths_subsys))) |
891 | goto fail_subsysreg; | 1072 | goto fail_subsysreg; |
892 | 1073 | ||
893 | /* now we create all "files" for the paths subsys */ | 1074 | /* now we create all "files" for the paths subsys */ |
diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c index 278f325021ee..d09e39e39c60 100644 --- a/drivers/parisc/sba_iommu.c +++ b/drivers/parisc/sba_iommu.c | |||
@@ -316,10 +316,10 @@ static int reserve_sba_gart = 1; | |||
316 | ** | 316 | ** |
317 | ** Superdome (in particular, REO) allows only 64-bit CSR accesses. | 317 | ** Superdome (in particular, REO) allows only 64-bit CSR accesses. |
318 | */ | 318 | */ |
319 | #define READ_REG32(addr) le32_to_cpu(__raw_readl(addr)) | 319 | #define READ_REG32(addr) readl(addr) |
320 | #define READ_REG64(addr) le64_to_cpu(__raw_readq(addr)) | 320 | #define READ_REG64(addr) readq(addr) |
321 | #define WRITE_REG32(val, addr) __raw_writel(cpu_to_le32(val), addr) | 321 | #define WRITE_REG32(val, addr) writel((val), (addr)) |
322 | #define WRITE_REG64(val, addr) __raw_writeq(cpu_to_le64(val), addr) | 322 | #define WRITE_REG64(val, addr) writeq((val), (addr)) |
323 | 323 | ||
324 | #ifdef CONFIG_64BIT | 324 | #ifdef CONFIG_64BIT |
325 | #define READ_REG(addr) READ_REG64(addr) | 325 | #define READ_REG(addr) READ_REG64(addr) |
@@ -1427,7 +1427,7 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num) | |||
1427 | iov_order = get_order(iova_space_size >> (IOVP_SHIFT - PAGE_SHIFT)); | 1427 | iov_order = get_order(iova_space_size >> (IOVP_SHIFT - PAGE_SHIFT)); |
1428 | ioc->pdir_size = (iova_space_size / IOVP_SIZE) * sizeof(u64); | 1428 | ioc->pdir_size = (iova_space_size / IOVP_SIZE) * sizeof(u64); |
1429 | 1429 | ||
1430 | DBG_INIT("%s() hpa 0x%lx IOV %dMB (%d bits)\n", | 1430 | DBG_INIT("%s() hpa 0x%p IOV %dMB (%d bits)\n", |
1431 | __FUNCTION__, ioc->ioc_hpa, iova_space_size >> 20, | 1431 | __FUNCTION__, ioc->ioc_hpa, iova_space_size >> 20, |
1432 | iov_order + PAGE_SHIFT); | 1432 | iov_order + PAGE_SHIFT); |
1433 | 1433 | ||
@@ -1764,7 +1764,7 @@ printk("sba_hw_init(): mem_boot 0x%x 0x%x 0x%x 0x%x\n", PAGE0->mem_boot.hpa, | |||
1764 | 1764 | ||
1765 | sba_dev->num_ioc = num_ioc; | 1765 | sba_dev->num_ioc = num_ioc; |
1766 | for (i = 0; i < num_ioc; i++) { | 1766 | for (i = 0; i < num_ioc; i++) { |
1767 | unsigned long ioc_hpa = sba_dev->ioc[i].ioc_hpa; | 1767 | void __iomem *ioc_hpa = sba_dev->ioc[i].ioc_hpa; |
1768 | unsigned int j; | 1768 | unsigned int j; |
1769 | 1769 | ||
1770 | for (j=0; j < sizeof(u64) * ROPES_PER_IOC; j+=sizeof(u64)) { | 1770 | for (j=0; j < sizeof(u64) * ROPES_PER_IOC; j+=sizeof(u64)) { |
@@ -1776,7 +1776,8 @@ printk("sba_hw_init(): mem_boot 0x%x 0x%x 0x%x 0x%x\n", PAGE0->mem_boot.hpa, | |||
1776 | * Improves netperf UDP_STREAM by ~10% for bcm5701. | 1776 | * Improves netperf UDP_STREAM by ~10% for bcm5701. |
1777 | */ | 1777 | */ |
1778 | if (IS_PLUTO(sba_dev->iodc)) { | 1778 | if (IS_PLUTO(sba_dev->iodc)) { |
1779 | unsigned long rope_cfg, cfg_val; | 1779 | void __iomem *rope_cfg; |
1780 | unsigned long cfg_val; | ||
1780 | 1781 | ||
1781 | rope_cfg = ioc_hpa + IOC_ROPE0_CFG + j; | 1782 | rope_cfg = ioc_hpa + IOC_ROPE0_CFG + j; |
1782 | cfg_val = READ_REG(rope_cfg); | 1783 | cfg_val = READ_REG(rope_cfg); |
@@ -1902,7 +1903,7 @@ sba_common_init(struct sba_device *sba_dev) | |||
1902 | * (bit #61, big endian), we have to flush and sync every time | 1903 | * (bit #61, big endian), we have to flush and sync every time |
1903 | * IO-PDIR is changed in Ike/Astro. | 1904 | * IO-PDIR is changed in Ike/Astro. |
1904 | */ | 1905 | */ |
1905 | if (boot_cpu_data.pdc.capabilities & PDC_MODEL_IOPDIR_FDC) { | 1906 | if (ioc_needs_fdc) { |
1906 | printk(KERN_INFO MODULE_NAME " FDC/SYNC required.\n"); | 1907 | printk(KERN_INFO MODULE_NAME " FDC/SYNC required.\n"); |
1907 | } else { | 1908 | } else { |
1908 | printk(KERN_INFO MODULE_NAME " IOC has cache coherent PDIR.\n"); | 1909 | printk(KERN_INFO MODULE_NAME " IOC has cache coherent PDIR.\n"); |
diff --git a/drivers/parisc/superio.c b/drivers/parisc/superio.c index 828eb45062de..a988dc7a9abd 100644 --- a/drivers/parisc/superio.c +++ b/drivers/parisc/superio.c | |||
@@ -360,7 +360,7 @@ int superio_fixup_irq(struct pci_dev *pcidev) | |||
360 | #endif | 360 | #endif |
361 | 361 | ||
362 | for (i = 0; i < 16; i++) { | 362 | for (i = 0; i < 16; i++) { |
363 | irq_desc[i].handler = &superio_interrupt_type; | 363 | irq_desc[i].chip = &superio_interrupt_type; |
364 | } | 364 | } |
365 | 365 | ||
366 | /* | 366 | /* |
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c index 723092682023..5f7db9d2436e 100644 --- a/drivers/pci/bus.c +++ b/drivers/pci/bus.c | |||
@@ -34,11 +34,11 @@ | |||
34 | */ | 34 | */ |
35 | int | 35 | int |
36 | pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, | 36 | pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, |
37 | unsigned long size, unsigned long align, unsigned long min, | 37 | resource_size_t size, resource_size_t align, |
38 | unsigned int type_mask, | 38 | resource_size_t min, unsigned int type_mask, |
39 | void (*alignf)(void *, struct resource *, | 39 | void (*alignf)(void *, struct resource *, resource_size_t, |
40 | unsigned long, unsigned long), | 40 | resource_size_t), |
41 | void *alignf_data) | 41 | void *alignf_data) |
42 | { | 42 | { |
43 | int i, ret = -ENOMEM; | 43 | int i, ret = -ENOMEM; |
44 | 44 | ||
diff --git a/drivers/pci/hotplug/cpcihp_zt5550.c b/drivers/pci/hotplug/cpcihp_zt5550.c index f7cb00da38df..1ec165df8522 100644 --- a/drivers/pci/hotplug/cpcihp_zt5550.c +++ b/drivers/pci/hotplug/cpcihp_zt5550.c | |||
@@ -95,8 +95,8 @@ static int zt5550_hc_config(struct pci_dev *pdev) | |||
95 | 95 | ||
96 | hc_dev = pdev; | 96 | hc_dev = pdev; |
97 | dbg("hc_dev = %p", hc_dev); | 97 | dbg("hc_dev = %p", hc_dev); |
98 | dbg("pci resource start %lx", pci_resource_start(hc_dev, 1)); | 98 | dbg("pci resource start %llx", (unsigned long long)pci_resource_start(hc_dev, 1)); |
99 | dbg("pci resource len %lx", pci_resource_len(hc_dev, 1)); | 99 | dbg("pci resource len %llx", (unsigned long long)pci_resource_len(hc_dev, 1)); |
100 | 100 | ||
101 | if(!request_mem_region(pci_resource_start(hc_dev, 1), | 101 | if(!request_mem_region(pci_resource_start(hc_dev, 1), |
102 | pci_resource_len(hc_dev, 1), MY_NAME)) { | 102 | pci_resource_len(hc_dev, 1), MY_NAME)) { |
@@ -108,8 +108,9 @@ static int zt5550_hc_config(struct pci_dev *pdev) | |||
108 | hc_registers = | 108 | hc_registers = |
109 | ioremap(pci_resource_start(hc_dev, 1), pci_resource_len(hc_dev, 1)); | 109 | ioremap(pci_resource_start(hc_dev, 1), pci_resource_len(hc_dev, 1)); |
110 | if(!hc_registers) { | 110 | if(!hc_registers) { |
111 | err("cannot remap MMIO region %lx @ %lx", | 111 | err("cannot remap MMIO region %llx @ %llx", |
112 | pci_resource_len(hc_dev, 1), pci_resource_start(hc_dev, 1)); | 112 | (unsigned long long)pci_resource_len(hc_dev, 1), |
113 | (unsigned long long)pci_resource_start(hc_dev, 1)); | ||
113 | ret = -ENODEV; | 114 | ret = -ENODEV; |
114 | goto exit_release_region; | 115 | goto exit_release_region; |
115 | } | 116 | } |
diff --git a/drivers/pci/hotplug/cpqphp_core.c b/drivers/pci/hotplug/cpqphp_core.c index 9bc1deb8df52..f8658d63f077 100644 --- a/drivers/pci/hotplug/cpqphp_core.c +++ b/drivers/pci/hotplug/cpqphp_core.c | |||
@@ -1089,8 +1089,8 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1089 | } | 1089 | } |
1090 | 1090 | ||
1091 | dbg("pdev = %p\n", pdev); | 1091 | dbg("pdev = %p\n", pdev); |
1092 | dbg("pci resource start %lx\n", pci_resource_start(pdev, 0)); | 1092 | dbg("pci resource start %llx\n", (unsigned long long)pci_resource_start(pdev, 0)); |
1093 | dbg("pci resource len %lx\n", pci_resource_len(pdev, 0)); | 1093 | dbg("pci resource len %llx\n", (unsigned long long)pci_resource_len(pdev, 0)); |
1094 | 1094 | ||
1095 | if (!request_mem_region(pci_resource_start(pdev, 0), | 1095 | if (!request_mem_region(pci_resource_start(pdev, 0), |
1096 | pci_resource_len(pdev, 0), MY_NAME)) { | 1096 | pci_resource_len(pdev, 0), MY_NAME)) { |
@@ -1102,9 +1102,9 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1102 | ctrl->hpc_reg = ioremap(pci_resource_start(pdev, 0), | 1102 | ctrl->hpc_reg = ioremap(pci_resource_start(pdev, 0), |
1103 | pci_resource_len(pdev, 0)); | 1103 | pci_resource_len(pdev, 0)); |
1104 | if (!ctrl->hpc_reg) { | 1104 | if (!ctrl->hpc_reg) { |
1105 | err("cannot remap MMIO region %lx @ %lx\n", | 1105 | err("cannot remap MMIO region %llx @ %llx\n", |
1106 | pci_resource_len(pdev, 0), | 1106 | (unsigned long long)pci_resource_len(pdev, 0), |
1107 | pci_resource_start(pdev, 0)); | 1107 | (unsigned long long)pci_resource_start(pdev, 0)); |
1108 | rc = -ENODEV; | 1108 | rc = -ENODEV; |
1109 | goto err_free_mem_region; | 1109 | goto err_free_mem_region; |
1110 | } | 1110 | } |
diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index d77138ecb098..11f7858f0064 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c | |||
@@ -1398,8 +1398,9 @@ int pcie_init(struct controller * ctrl, struct pcie_device *dev) | |||
1398 | 1398 | ||
1399 | for ( rc = 0; rc < DEVICE_COUNT_RESOURCE; rc++) | 1399 | for ( rc = 0; rc < DEVICE_COUNT_RESOURCE; rc++) |
1400 | if (pci_resource_len(pdev, rc) > 0) | 1400 | if (pci_resource_len(pdev, rc) > 0) |
1401 | dbg("pci resource[%d] start=0x%lx(len=0x%lx)\n", rc, | 1401 | dbg("pci resource[%d] start=0x%llx(len=0x%llx)\n", rc, |
1402 | pci_resource_start(pdev, rc), pci_resource_len(pdev, rc)); | 1402 | (unsigned long long)pci_resource_start(pdev, rc), |
1403 | (unsigned long long)pci_resource_len(pdev, rc)); | ||
1403 | 1404 | ||
1404 | info("HPC vendor_id %x device_id %x ss_vid %x ss_did %x\n", pdev->vendor, pdev->device, | 1405 | info("HPC vendor_id %x device_id %x ss_vid %x ss_did %x\n", pdev->vendor, pdev->device, |
1405 | pdev->subsystem_vendor, pdev->subsystem_device); | 1406 | pdev->subsystem_vendor, pdev->subsystem_device); |
diff --git a/drivers/pci/hotplug/shpchp_sysfs.c b/drivers/pci/hotplug/shpchp_sysfs.c index f5cfbf2c047c..620e1139e607 100644 --- a/drivers/pci/hotplug/shpchp_sysfs.c +++ b/drivers/pci/hotplug/shpchp_sysfs.c | |||
@@ -51,8 +51,10 @@ static ssize_t show_ctrl (struct device *dev, struct device_attribute *attr, cha | |||
51 | res = bus->resource[index]; | 51 | res = bus->resource[index]; |
52 | if (res && (res->flags & IORESOURCE_MEM) && | 52 | if (res && (res->flags & IORESOURCE_MEM) && |
53 | !(res->flags & IORESOURCE_PREFETCH)) { | 53 | !(res->flags & IORESOURCE_PREFETCH)) { |
54 | out += sprintf(out, "start = %8.8lx, length = %8.8lx\n", | 54 | out += sprintf(out, "start = %8.8llx, " |
55 | res->start, (res->end - res->start)); | 55 | "length = %8.8llx\n", |
56 | (unsigned long long)res->start, | ||
57 | (unsigned long long)(res->end - res->start)); | ||
56 | } | 58 | } |
57 | } | 59 | } |
58 | out += sprintf(out, "Free resources: prefetchable memory\n"); | 60 | out += sprintf(out, "Free resources: prefetchable memory\n"); |
@@ -60,16 +62,20 @@ static ssize_t show_ctrl (struct device *dev, struct device_attribute *attr, cha | |||
60 | res = bus->resource[index]; | 62 | res = bus->resource[index]; |
61 | if (res && (res->flags & IORESOURCE_MEM) && | 63 | if (res && (res->flags & IORESOURCE_MEM) && |
62 | (res->flags & IORESOURCE_PREFETCH)) { | 64 | (res->flags & IORESOURCE_PREFETCH)) { |
63 | out += sprintf(out, "start = %8.8lx, length = %8.8lx\n", | 65 | out += sprintf(out, "start = %8.8llx, " |
64 | res->start, (res->end - res->start)); | 66 | "length = %8.8llx\n", |
67 | (unsigned long long)res->start, | ||
68 | (unsigned long long)(res->end - res->start)); | ||
65 | } | 69 | } |
66 | } | 70 | } |
67 | out += sprintf(out, "Free resources: IO\n"); | 71 | out += sprintf(out, "Free resources: IO\n"); |
68 | for (index = 0; index < PCI_BUS_NUM_RESOURCES; index++) { | 72 | for (index = 0; index < PCI_BUS_NUM_RESOURCES; index++) { |
69 | res = bus->resource[index]; | 73 | res = bus->resource[index]; |
70 | if (res && (res->flags & IORESOURCE_IO)) { | 74 | if (res && (res->flags & IORESOURCE_IO)) { |
71 | out += sprintf(out, "start = %8.8lx, length = %8.8lx\n", | 75 | out += sprintf(out, "start = %8.8llx, " |
72 | res->start, (res->end - res->start)); | 76 | "length = %8.8llx\n", |
77 | (unsigned long long)res->start, | ||
78 | (unsigned long long)(res->end - res->start)); | ||
73 | } | 79 | } |
74 | } | 80 | } |
75 | out += sprintf(out, "Free resources: bus numbers\n"); | 81 | out += sprintf(out, "Free resources: bus numbers\n"); |
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 7f8429284fab..76d023d8a33b 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -429,12 +429,12 @@ static void irq_handler_init(int cap_id, int pos, int mask) | |||
429 | 429 | ||
430 | spin_lock_irqsave(&irq_desc[pos].lock, flags); | 430 | spin_lock_irqsave(&irq_desc[pos].lock, flags); |
431 | if (cap_id == PCI_CAP_ID_MSIX) | 431 | if (cap_id == PCI_CAP_ID_MSIX) |
432 | irq_desc[pos].handler = &msix_irq_type; | 432 | irq_desc[pos].chip = &msix_irq_type; |
433 | else { | 433 | else { |
434 | if (!mask) | 434 | if (!mask) |
435 | irq_desc[pos].handler = &msi_irq_wo_maskbit_type; | 435 | irq_desc[pos].chip = &msi_irq_wo_maskbit_type; |
436 | else | 436 | else |
437 | irq_desc[pos].handler = &msi_irq_w_maskbit_type; | 437 | irq_desc[pos].chip = &msi_irq_w_maskbit_type; |
438 | } | 438 | } |
439 | spin_unlock_irqrestore(&irq_desc[pos].lock, flags); | 439 | spin_unlock_irqrestore(&irq_desc[pos].lock, flags); |
440 | } | 440 | } |
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index bc405c035ce3..606f9b6f70eb 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
@@ -87,7 +87,7 @@ resource_show(struct device * dev, struct device_attribute *attr, char * buf) | |||
87 | char * str = buf; | 87 | char * str = buf; |
88 | int i; | 88 | int i; |
89 | int max = 7; | 89 | int max = 7; |
90 | u64 start, end; | 90 | resource_size_t start, end; |
91 | 91 | ||
92 | if (pci_dev->subordinate) | 92 | if (pci_dev->subordinate) |
93 | max = DEVICE_COUNT_RESOURCE; | 93 | max = DEVICE_COUNT_RESOURCE; |
@@ -365,7 +365,7 @@ pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, | |||
365 | struct device, kobj)); | 365 | struct device, kobj)); |
366 | struct resource *res = (struct resource *)attr->private; | 366 | struct resource *res = (struct resource *)attr->private; |
367 | enum pci_mmap_state mmap_type; | 367 | enum pci_mmap_state mmap_type; |
368 | u64 start, end; | 368 | resource_size_t start, end; |
369 | int i; | 369 | int i; |
370 | 370 | ||
371 | for (i = 0; i < PCI_ROM_RESOURCE; i++) | 371 | for (i = 0; i < PCI_ROM_RESOURCE; i++) |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 23d3b17c8cad..cf57d7de3765 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -691,10 +691,12 @@ int pci_request_region(struct pci_dev *pdev, int bar, const char *res_name) | |||
691 | return 0; | 691 | return 0; |
692 | 692 | ||
693 | err_out: | 693 | err_out: |
694 | printk (KERN_WARNING "PCI: Unable to reserve %s region #%d:%lx@%lx for device %s\n", | 694 | printk (KERN_WARNING "PCI: Unable to reserve %s region #%d:%llx@%llx " |
695 | "for device %s\n", | ||
695 | pci_resource_flags(pdev, bar) & IORESOURCE_IO ? "I/O" : "mem", | 696 | pci_resource_flags(pdev, bar) & IORESOURCE_IO ? "I/O" : "mem", |
696 | bar + 1, /* PCI BAR # */ | 697 | bar + 1, /* PCI BAR # */ |
697 | pci_resource_len(pdev, bar), pci_resource_start(pdev, bar), | 698 | (unsigned long long)pci_resource_len(pdev, bar), |
699 | (unsigned long long)pci_resource_start(pdev, bar), | ||
698 | pci_name(pdev)); | 700 | pci_name(pdev)); |
699 | return -EBUSY; | 701 | return -EBUSY; |
700 | } | 702 | } |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 29bdeca031a8..9cc842b666eb 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
@@ -6,10 +6,10 @@ extern int pci_create_sysfs_dev_files(struct pci_dev *pdev); | |||
6 | extern void pci_remove_sysfs_dev_files(struct pci_dev *pdev); | 6 | extern void pci_remove_sysfs_dev_files(struct pci_dev *pdev); |
7 | extern void pci_cleanup_rom(struct pci_dev *dev); | 7 | extern void pci_cleanup_rom(struct pci_dev *dev); |
8 | extern int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, | 8 | extern int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, |
9 | unsigned long size, unsigned long align, | 9 | resource_size_t size, resource_size_t align, |
10 | unsigned long min, unsigned int type_mask, | 10 | resource_size_t min, unsigned int type_mask, |
11 | void (*alignf)(void *, struct resource *, | 11 | void (*alignf)(void *, struct resource *, |
12 | unsigned long, unsigned long), | 12 | resource_size_t, resource_size_t), |
13 | void *alignf_data); | 13 | void *alignf_data); |
14 | /* Firmware callbacks */ | 14 | /* Firmware callbacks */ |
15 | extern int (*platform_pci_choose_state)(struct pci_dev *dev, pm_message_t state); | 15 | extern int (*platform_pci_choose_state)(struct pci_dev *dev, pm_message_t state); |
diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c index 54b2ebc9c91a..99cf33379769 100644 --- a/drivers/pci/proc.c +++ b/drivers/pci/proc.c | |||
@@ -302,12 +302,6 @@ static struct file_operations proc_bus_pci_operations = { | |||
302 | #endif /* HAVE_PCI_MMAP */ | 302 | #endif /* HAVE_PCI_MMAP */ |
303 | }; | 303 | }; |
304 | 304 | ||
305 | #if BITS_PER_LONG == 32 | ||
306 | #define LONG_FORMAT "\t%08lx" | ||
307 | #else | ||
308 | #define LONG_FORMAT "\t%16lx" | ||
309 | #endif | ||
310 | |||
311 | /* iterator */ | 305 | /* iterator */ |
312 | static void *pci_seq_start(struct seq_file *m, loff_t *pos) | 306 | static void *pci_seq_start(struct seq_file *m, loff_t *pos) |
313 | { | 307 | { |
@@ -356,18 +350,18 @@ static int show_device(struct seq_file *m, void *v) | |||
356 | dev->irq); | 350 | dev->irq); |
357 | /* Here should be 7 and not PCI_NUM_RESOURCES as we need to preserve compatibility */ | 351 | /* Here should be 7 and not PCI_NUM_RESOURCES as we need to preserve compatibility */ |
358 | for (i=0; i<7; i++) { | 352 | for (i=0; i<7; i++) { |
359 | u64 start, end; | 353 | resource_size_t start, end; |
360 | pci_resource_to_user(dev, i, &dev->resource[i], &start, &end); | 354 | pci_resource_to_user(dev, i, &dev->resource[i], &start, &end); |
361 | seq_printf(m, LONG_FORMAT, | 355 | seq_printf(m, "\t%16llx", |
362 | ((unsigned long)start) | | 356 | (unsigned long long)(start | |
363 | (dev->resource[i].flags & PCI_REGION_FLAG_MASK)); | 357 | (dev->resource[i].flags & PCI_REGION_FLAG_MASK))); |
364 | } | 358 | } |
365 | for (i=0; i<7; i++) { | 359 | for (i=0; i<7; i++) { |
366 | u64 start, end; | 360 | resource_size_t start, end; |
367 | pci_resource_to_user(dev, i, &dev->resource[i], &start, &end); | 361 | pci_resource_to_user(dev, i, &dev->resource[i], &start, &end); |
368 | seq_printf(m, LONG_FORMAT, | 362 | seq_printf(m, "\t%16llx", |
369 | dev->resource[i].start < dev->resource[i].end ? | 363 | dev->resource[i].start < dev->resource[i].end ? |
370 | (unsigned long)(end - start) + 1 : 0); | 364 | (unsigned long long)(end - start) + 1 : 0); |
371 | } | 365 | } |
372 | seq_putc(m, '\t'); | 366 | seq_putc(m, '\t'); |
373 | if (drv) | 367 | if (drv) |
diff --git a/drivers/pci/rom.c b/drivers/pci/rom.c index 598a115cd00e..cbb69cf41311 100644 --- a/drivers/pci/rom.c +++ b/drivers/pci/rom.c | |||
@@ -80,8 +80,8 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size) | |||
80 | } else { | 80 | } else { |
81 | if (res->flags & IORESOURCE_ROM_COPY) { | 81 | if (res->flags & IORESOURCE_ROM_COPY) { |
82 | *size = pci_resource_len(pdev, PCI_ROM_RESOURCE); | 82 | *size = pci_resource_len(pdev, PCI_ROM_RESOURCE); |
83 | return (void __iomem *)pci_resource_start(pdev, | 83 | return (void __iomem *)(unsigned long) |
84 | PCI_ROM_RESOURCE); | 84 | pci_resource_start(pdev, PCI_ROM_RESOURCE); |
85 | } else { | 85 | } else { |
86 | /* assign the ROM an address if it doesn't have one */ | 86 | /* assign the ROM an address if it doesn't have one */ |
87 | if (res->parent == NULL && | 87 | if (res->parent == NULL && |
@@ -170,11 +170,11 @@ void __iomem *pci_map_rom_copy(struct pci_dev *pdev, size_t *size) | |||
170 | return rom; | 170 | return rom; |
171 | 171 | ||
172 | res->end = res->start + *size; | 172 | res->end = res->start + *size; |
173 | memcpy_fromio((void*)res->start, rom, *size); | 173 | memcpy_fromio((void*)(unsigned long)res->start, rom, *size); |
174 | pci_unmap_rom(pdev, rom); | 174 | pci_unmap_rom(pdev, rom); |
175 | res->flags |= IORESOURCE_ROM_COPY; | 175 | res->flags |= IORESOURCE_ROM_COPY; |
176 | 176 | ||
177 | return (void __iomem *)res->start; | 177 | return (void __iomem *)(unsigned long)res->start; |
178 | } | 178 | } |
179 | 179 | ||
180 | /** | 180 | /** |
@@ -227,7 +227,7 @@ void pci_cleanup_rom(struct pci_dev *pdev) | |||
227 | { | 227 | { |
228 | struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; | 228 | struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; |
229 | if (res->flags & IORESOURCE_ROM_COPY) { | 229 | if (res->flags & IORESOURCE_ROM_COPY) { |
230 | kfree((void*)res->start); | 230 | kfree((void*)(unsigned long)res->start); |
231 | res->flags &= ~IORESOURCE_ROM_COPY; | 231 | res->flags &= ~IORESOURCE_ROM_COPY; |
232 | res->start = 0; | 232 | res->start = 0; |
233 | res->end = 0; | 233 | res->end = 0; |
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 35086e80faa9..47c1071ad84e 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
@@ -357,8 +357,10 @@ pbus_size_mem(struct pci_bus *bus, unsigned long mask, unsigned long type) | |||
357 | order = __ffs(align) - 20; | 357 | order = __ffs(align) - 20; |
358 | if (order > 11) { | 358 | if (order > 11) { |
359 | printk(KERN_WARNING "PCI: region %s/%d " | 359 | printk(KERN_WARNING "PCI: region %s/%d " |
360 | "too large: %lx-%lx\n", | 360 | "too large: %llx-%llx\n", |
361 | pci_name(dev), i, r->start, r->end); | 361 | pci_name(dev), i, |
362 | (unsigned long long)r->start, | ||
363 | (unsigned long long)r->end); | ||
362 | r->flags = 0; | 364 | r->flags = 0; |
363 | continue; | 365 | continue; |
364 | } | 366 | } |
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c index 577f4b55c46d..ab78e4bbdd83 100644 --- a/drivers/pci/setup-res.c +++ b/drivers/pci/setup-res.c | |||
@@ -40,8 +40,9 @@ pci_update_resource(struct pci_dev *dev, struct resource *res, int resno) | |||
40 | 40 | ||
41 | pcibios_resource_to_bus(dev, ®ion, res); | 41 | pcibios_resource_to_bus(dev, ®ion, res); |
42 | 42 | ||
43 | pr_debug(" got res [%lx:%lx] bus [%lx:%lx] flags %lx for " | 43 | pr_debug(" got res [%llx:%llx] bus [%lx:%lx] flags %lx for " |
44 | "BAR %d of %s\n", res->start, res->end, | 44 | "BAR %d of %s\n", (unsigned long long)res->start, |
45 | (unsigned long long)res->end, | ||
45 | region.start, region.end, res->flags, resno, pci_name(dev)); | 46 | region.start, region.end, res->flags, resno, pci_name(dev)); |
46 | 47 | ||
47 | new = region.start | (res->flags & PCI_REGION_FLAG_MASK); | 48 | new = region.start | (res->flags & PCI_REGION_FLAG_MASK); |
@@ -104,10 +105,12 @@ pci_claim_resource(struct pci_dev *dev, int resource) | |||
104 | err = insert_resource(root, res); | 105 | err = insert_resource(root, res); |
105 | 106 | ||
106 | if (err) { | 107 | if (err) { |
107 | printk(KERN_ERR "PCI: %s region %d of %s %s [%lx:%lx]\n", | 108 | printk(KERN_ERR "PCI: %s region %d of %s %s [%llx:%llx]\n", |
108 | root ? "Address space collision on" : | 109 | root ? "Address space collision on" : |
109 | "No parent found for", | 110 | "No parent found for", |
110 | resource, dtype, pci_name(dev), res->start, res->end); | 111 | resource, dtype, pci_name(dev), |
112 | (unsigned long long)res->start, | ||
113 | (unsigned long long)res->end); | ||
111 | } | 114 | } |
112 | 115 | ||
113 | return err; | 116 | return err; |
@@ -118,7 +121,7 @@ int pci_assign_resource(struct pci_dev *dev, int resno) | |||
118 | { | 121 | { |
119 | struct pci_bus *bus = dev->bus; | 122 | struct pci_bus *bus = dev->bus; |
120 | struct resource *res = dev->resource + resno; | 123 | struct resource *res = dev->resource + resno; |
121 | unsigned long size, min, align; | 124 | resource_size_t size, min, align; |
122 | int ret; | 125 | int ret; |
123 | 126 | ||
124 | size = res->end - res->start + 1; | 127 | size = res->end - res->start + 1; |
@@ -145,9 +148,11 @@ int pci_assign_resource(struct pci_dev *dev, int resno) | |||
145 | } | 148 | } |
146 | 149 | ||
147 | if (ret) { | 150 | if (ret) { |
148 | printk(KERN_ERR "PCI: Failed to allocate %s resource #%d:%lx@%lx for %s\n", | 151 | printk(KERN_ERR "PCI: Failed to allocate %s resource " |
149 | res->flags & IORESOURCE_IO ? "I/O" : "mem", | 152 | "#%d:%llx@%llx for %s\n", |
150 | resno, size, res->start, pci_name(dev)); | 153 | res->flags & IORESOURCE_IO ? "I/O" : "mem", |
154 | resno, (unsigned long long)size, | ||
155 | (unsigned long long)res->start, pci_name(dev)); | ||
151 | } else if (resno < PCI_BRIDGE_RESOURCES) { | 156 | } else if (resno < PCI_BRIDGE_RESOURCES) { |
152 | pci_update_resource(dev, res, resno); | 157 | pci_update_resource(dev, res, resno); |
153 | } | 158 | } |
@@ -204,7 +209,7 @@ pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) | |||
204 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | 209 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { |
205 | struct resource *r; | 210 | struct resource *r; |
206 | struct resource_list *list, *tmp; | 211 | struct resource_list *list, *tmp; |
207 | unsigned long r_align; | 212 | resource_size_t r_align; |
208 | 213 | ||
209 | r = &dev->resource[i]; | 214 | r = &dev->resource[i]; |
210 | r_align = r->end - r->start; | 215 | r_align = r->end - r->start; |
@@ -213,13 +218,14 @@ pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) | |||
213 | continue; | 218 | continue; |
214 | if (!r_align) { | 219 | if (!r_align) { |
215 | printk(KERN_WARNING "PCI: Ignore bogus resource %d " | 220 | printk(KERN_WARNING "PCI: Ignore bogus resource %d " |
216 | "[%lx:%lx] of %s\n", | 221 | "[%llx:%llx] of %s\n", |
217 | i, r->start, r->end, pci_name(dev)); | 222 | i, (unsigned long long)r->start, |
223 | (unsigned long long)r->end, pci_name(dev)); | ||
218 | continue; | 224 | continue; |
219 | } | 225 | } |
220 | r_align = (i < PCI_BRIDGE_RESOURCES) ? r_align + 1 : r->start; | 226 | r_align = (i < PCI_BRIDGE_RESOURCES) ? r_align + 1 : r->start; |
221 | for (list = head; ; list = list->next) { | 227 | for (list = head; ; list = list->next) { |
222 | unsigned long align = 0; | 228 | resource_size_t align = 0; |
223 | struct resource_list *ln = list->next; | 229 | struct resource_list *ln = list->next; |
224 | int idx; | 230 | int idx; |
225 | 231 | ||
diff --git a/drivers/pcmcia/hd64465_ss.c b/drivers/pcmcia/hd64465_ss.c index b39435bbfaeb..c662e4f89d46 100644 --- a/drivers/pcmcia/hd64465_ss.c +++ b/drivers/pcmcia/hd64465_ss.c | |||
@@ -244,8 +244,8 @@ static void hs_map_irq(hs_socket_t *sp, unsigned int irq) | |||
244 | 244 | ||
245 | hs_mapped_irq[irq].sock = sp; | 245 | hs_mapped_irq[irq].sock = sp; |
246 | /* insert ourselves as the irq controller */ | 246 | /* insert ourselves as the irq controller */ |
247 | hs_mapped_irq[irq].old_handler = irq_desc[irq].handler; | 247 | hs_mapped_irq[irq].old_handler = irq_desc[irq].chip; |
248 | irq_desc[irq].handler = &hd64465_ss_irq_type; | 248 | irq_desc[irq].chip = &hd64465_ss_irq_type; |
249 | } | 249 | } |
250 | 250 | ||
251 | 251 | ||
@@ -260,7 +260,7 @@ static void hs_unmap_irq(hs_socket_t *sp, unsigned int irq) | |||
260 | return; | 260 | return; |
261 | 261 | ||
262 | /* restore the original irq controller */ | 262 | /* restore the original irq controller */ |
263 | irq_desc[irq].handler = hs_mapped_irq[irq].old_handler; | 263 | irq_desc[irq].chip = hs_mapped_irq[irq].old_handler; |
264 | } | 264 | } |
265 | 265 | ||
266 | /*============================================================*/ | 266 | /*============================================================*/ |
diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c index a2f05f485156..ff51a65d9433 100644 --- a/drivers/pcmcia/i82365.c +++ b/drivers/pcmcia/i82365.c | |||
@@ -1084,9 +1084,10 @@ static int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem) | |||
1084 | u_short base, i; | 1084 | u_short base, i; |
1085 | u_char map; | 1085 | u_char map; |
1086 | 1086 | ||
1087 | debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, %#lx-%#lx, " | 1087 | debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, %#llx-%#llx, " |
1088 | "%#x)\n", sock, mem->map, mem->flags, mem->speed, | 1088 | "%#x)\n", sock, mem->map, mem->flags, mem->speed, |
1089 | mem->res->start, mem->res->end, mem->card_start); | 1089 | (unsigned long long)mem->res->start, |
1090 | (unsigned long long)mem->res->end, mem->card_start); | ||
1090 | 1091 | ||
1091 | map = mem->map; | 1092 | map = mem->map; |
1092 | if ((map > 4) || (mem->card_start > 0x3ffffff) || | 1093 | if ((map > 4) || (mem->card_start > 0x3ffffff) || |
diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c index 247ab837f841..9ee26c1b8635 100644 --- a/drivers/pcmcia/pd6729.c +++ b/drivers/pcmcia/pd6729.c | |||
@@ -642,7 +642,8 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev, | |||
642 | goto err_out_free_mem; | 642 | goto err_out_free_mem; |
643 | 643 | ||
644 | printk(KERN_INFO "pd6729: Cirrus PD6729 PCI to PCMCIA Bridge " | 644 | printk(KERN_INFO "pd6729: Cirrus PD6729 PCI to PCMCIA Bridge " |
645 | "at 0x%lx on irq %d\n", pci_resource_start(dev, 0), dev->irq); | 645 | "at 0x%llx on irq %d\n", |
646 | (unsigned long long)pci_resource_start(dev, 0), dev->irq); | ||
646 | /* | 647 | /* |
647 | * Since we have no memory BARs some firmware may not | 648 | * Since we have no memory BARs some firmware may not |
648 | * have had PCI_COMMAND_MEMORY enabled, yet the device needs it. | 649 | * have had PCI_COMMAND_MEMORY enabled, yet the device needs it. |
diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c index 0f8b157c9717..c3176b16b7be 100644 --- a/drivers/pcmcia/rsrc_nonstatic.c +++ b/drivers/pcmcia/rsrc_nonstatic.c | |||
@@ -72,7 +72,7 @@ static DEFINE_MUTEX(rsrc_mutex); | |||
72 | ======================================================================*/ | 72 | ======================================================================*/ |
73 | 73 | ||
74 | static struct resource * | 74 | static struct resource * |
75 | make_resource(unsigned long b, unsigned long n, int flags, char *name) | 75 | make_resource(resource_size_t b, resource_size_t n, int flags, char *name) |
76 | { | 76 | { |
77 | struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL); | 77 | struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL); |
78 | 78 | ||
@@ -86,8 +86,8 @@ make_resource(unsigned long b, unsigned long n, int flags, char *name) | |||
86 | } | 86 | } |
87 | 87 | ||
88 | static struct resource * | 88 | static struct resource * |
89 | claim_region(struct pcmcia_socket *s, unsigned long base, unsigned long size, | 89 | claim_region(struct pcmcia_socket *s, resource_size_t base, |
90 | int type, char *name) | 90 | resource_size_t size, int type, char *name) |
91 | { | 91 | { |
92 | struct resource *res, *parent; | 92 | struct resource *res, *parent; |
93 | 93 | ||
@@ -519,10 +519,10 @@ struct pcmcia_align_data { | |||
519 | 519 | ||
520 | static void | 520 | static void |
521 | pcmcia_common_align(void *align_data, struct resource *res, | 521 | pcmcia_common_align(void *align_data, struct resource *res, |
522 | unsigned long size, unsigned long align) | 522 | resource_size_t size, resource_size_t align) |
523 | { | 523 | { |
524 | struct pcmcia_align_data *data = align_data; | 524 | struct pcmcia_align_data *data = align_data; |
525 | unsigned long start; | 525 | resource_size_t start; |
526 | /* | 526 | /* |
527 | * Ensure that we have the correct start address | 527 | * Ensure that we have the correct start address |
528 | */ | 528 | */ |
@@ -533,8 +533,8 @@ pcmcia_common_align(void *align_data, struct resource *res, | |||
533 | } | 533 | } |
534 | 534 | ||
535 | static void | 535 | static void |
536 | pcmcia_align(void *align_data, struct resource *res, | 536 | pcmcia_align(void *align_data, struct resource *res, resource_size_t size, |
537 | unsigned long size, unsigned long align) | 537 | resource_size_t align) |
538 | { | 538 | { |
539 | struct pcmcia_align_data *data = align_data; | 539 | struct pcmcia_align_data *data = align_data; |
540 | struct resource_map *m; | 540 | struct resource_map *m; |
@@ -808,8 +808,10 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s) | |||
808 | if (res->flags & IORESOURCE_IO) { | 808 | if (res->flags & IORESOURCE_IO) { |
809 | if (res == &ioport_resource) | 809 | if (res == &ioport_resource) |
810 | continue; | 810 | continue; |
811 | printk(KERN_INFO "pcmcia: parent PCI bridge I/O window: 0x%lx - 0x%lx\n", | 811 | printk(KERN_INFO "pcmcia: parent PCI bridge I/O " |
812 | res->start, res->end); | 812 | "window: 0x%llx - 0x%llx\n", |
813 | (unsigned long long)res->start, | ||
814 | (unsigned long long)res->end); | ||
813 | if (!adjust_io(s, ADD_MANAGED_RESOURCE, res->start, res->end)) | 815 | if (!adjust_io(s, ADD_MANAGED_RESOURCE, res->start, res->end)) |
814 | done |= IORESOURCE_IO; | 816 | done |= IORESOURCE_IO; |
815 | 817 | ||
@@ -818,8 +820,10 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s) | |||
818 | if (res->flags & IORESOURCE_MEM) { | 820 | if (res->flags & IORESOURCE_MEM) { |
819 | if (res == &iomem_resource) | 821 | if (res == &iomem_resource) |
820 | continue; | 822 | continue; |
821 | printk(KERN_INFO "pcmcia: parent PCI bridge Memory window: 0x%lx - 0x%lx\n", | 823 | printk(KERN_INFO "pcmcia: parent PCI bridge Memory " |
822 | res->start, res->end); | 824 | "window: 0x%llx - 0x%llx\n", |
825 | (unsigned long long)res->start, | ||
826 | (unsigned long long)res->end); | ||
823 | if (!adjust_memory(s, ADD_MANAGED_RESOURCE, res->start, res->end)) | 827 | if (!adjust_memory(s, ADD_MANAGED_RESOURCE, res->start, res->end)) |
824 | done |= IORESOURCE_MEM; | 828 | done |= IORESOURCE_MEM; |
825 | } | 829 | } |
diff --git a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c index 73bad1d5cb23..65a60671659f 100644 --- a/drivers/pcmcia/tcic.c +++ b/drivers/pcmcia/tcic.c | |||
@@ -756,8 +756,9 @@ static int tcic_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *m | |||
756 | u_long base, len, mmap; | 756 | u_long base, len, mmap; |
757 | 757 | ||
758 | debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, " | 758 | debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, " |
759 | "%#lx-%#lx, %#x)\n", psock, mem->map, mem->flags, | 759 | "%#llx-%#llx, %#x)\n", psock, mem->map, mem->flags, |
760 | mem->speed, mem->res->start, mem->res->end, mem->card_start); | 760 | mem->speed, (unsigned long long)mem->res->start, |
761 | (unsigned long long)mem->res->end, mem->card_start); | ||
761 | if ((mem->map > 3) || (mem->card_start > 0x3ffffff) || | 762 | if ((mem->map > 3) || (mem->card_start > 0x3ffffff) || |
762 | (mem->res->start > 0xffffff) || (mem->res->end > 0xffffff) || | 763 | (mem->res->start > 0xffffff) || (mem->res->end > 0xffffff) || |
763 | (mem->res->start > mem->res->end) || (mem->speed > 1000)) | 764 | (mem->res->start > mem->res->end) || (mem->speed > 1000)) |
diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c index a2d8ce7fef9c..3163e3d73da1 100644 --- a/drivers/pnp/interface.c +++ b/drivers/pnp/interface.c | |||
@@ -264,7 +264,7 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at | |||
264 | if (pnp_port_flags(dev, i) & IORESOURCE_DISABLED) | 264 | if (pnp_port_flags(dev, i) & IORESOURCE_DISABLED) |
265 | pnp_printf(buffer," disabled\n"); | 265 | pnp_printf(buffer," disabled\n"); |
266 | else | 266 | else |
267 | pnp_printf(buffer," 0x%lx-0x%lx\n", | 267 | pnp_printf(buffer," 0x%llx-0x%llx\n", |
268 | pnp_port_start(dev, i), | 268 | pnp_port_start(dev, i), |
269 | pnp_port_end(dev, i)); | 269 | pnp_port_end(dev, i)); |
270 | } | 270 | } |
@@ -275,7 +275,7 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at | |||
275 | if (pnp_mem_flags(dev, i) & IORESOURCE_DISABLED) | 275 | if (pnp_mem_flags(dev, i) & IORESOURCE_DISABLED) |
276 | pnp_printf(buffer," disabled\n"); | 276 | pnp_printf(buffer," disabled\n"); |
277 | else | 277 | else |
278 | pnp_printf(buffer," 0x%lx-0x%lx\n", | 278 | pnp_printf(buffer," 0x%llx-0x%llx\n", |
279 | pnp_mem_start(dev, i), | 279 | pnp_mem_start(dev, i), |
280 | pnp_mem_end(dev, i)); | 280 | pnp_mem_end(dev, i)); |
281 | } | 281 | } |
@@ -286,7 +286,7 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at | |||
286 | if (pnp_irq_flags(dev, i) & IORESOURCE_DISABLED) | 286 | if (pnp_irq_flags(dev, i) & IORESOURCE_DISABLED) |
287 | pnp_printf(buffer," disabled\n"); | 287 | pnp_printf(buffer," disabled\n"); |
288 | else | 288 | else |
289 | pnp_printf(buffer," %ld\n", | 289 | pnp_printf(buffer," %lld\n", |
290 | pnp_irq(dev, i)); | 290 | pnp_irq(dev, i)); |
291 | } | 291 | } |
292 | } | 292 | } |
@@ -296,7 +296,7 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at | |||
296 | if (pnp_dma_flags(dev, i) & IORESOURCE_DISABLED) | 296 | if (pnp_dma_flags(dev, i) & IORESOURCE_DISABLED) |
297 | pnp_printf(buffer," disabled\n"); | 297 | pnp_printf(buffer," disabled\n"); |
298 | else | 298 | else |
299 | pnp_printf(buffer," %ld\n", | 299 | pnp_printf(buffer," %lld\n", |
300 | pnp_dma(dev, i)); | 300 | pnp_dma(dev, i)); |
301 | } | 301 | } |
302 | } | 302 | } |
diff --git a/drivers/pnp/manager.c b/drivers/pnp/manager.c index 6fff109bdab6..1d7a5b87f4cb 100644 --- a/drivers/pnp/manager.c +++ b/drivers/pnp/manager.c | |||
@@ -20,7 +20,8 @@ DECLARE_MUTEX(pnp_res_mutex); | |||
20 | 20 | ||
21 | static int pnp_assign_port(struct pnp_dev *dev, struct pnp_port *rule, int idx) | 21 | static int pnp_assign_port(struct pnp_dev *dev, struct pnp_port *rule, int idx) |
22 | { | 22 | { |
23 | unsigned long *start, *end, *flags; | 23 | resource_size_t *start, *end; |
24 | unsigned long *flags; | ||
24 | 25 | ||
25 | if (!dev || !rule) | 26 | if (!dev || !rule) |
26 | return -EINVAL; | 27 | return -EINVAL; |
@@ -63,7 +64,8 @@ static int pnp_assign_port(struct pnp_dev *dev, struct pnp_port *rule, int idx) | |||
63 | 64 | ||
64 | static int pnp_assign_mem(struct pnp_dev *dev, struct pnp_mem *rule, int idx) | 65 | static int pnp_assign_mem(struct pnp_dev *dev, struct pnp_mem *rule, int idx) |
65 | { | 66 | { |
66 | unsigned long *start, *end, *flags; | 67 | resource_size_t *start, *end; |
68 | unsigned long *flags; | ||
67 | 69 | ||
68 | if (!dev || !rule) | 70 | if (!dev || !rule) |
69 | return -EINVAL; | 71 | return -EINVAL; |
@@ -116,7 +118,8 @@ static int pnp_assign_mem(struct pnp_dev *dev, struct pnp_mem *rule, int idx) | |||
116 | 118 | ||
117 | static int pnp_assign_irq(struct pnp_dev * dev, struct pnp_irq *rule, int idx) | 119 | static int pnp_assign_irq(struct pnp_dev * dev, struct pnp_irq *rule, int idx) |
118 | { | 120 | { |
119 | unsigned long *start, *end, *flags; | 121 | resource_size_t *start, *end; |
122 | unsigned long *flags; | ||
120 | int i; | 123 | int i; |
121 | 124 | ||
122 | /* IRQ priority: this table is good for i386 */ | 125 | /* IRQ priority: this table is good for i386 */ |
@@ -168,7 +171,8 @@ static int pnp_assign_irq(struct pnp_dev * dev, struct pnp_irq *rule, int idx) | |||
168 | 171 | ||
169 | static int pnp_assign_dma(struct pnp_dev *dev, struct pnp_dma *rule, int idx) | 172 | static int pnp_assign_dma(struct pnp_dev *dev, struct pnp_dma *rule, int idx) |
170 | { | 173 | { |
171 | unsigned long *start, *end, *flags; | 174 | resource_size_t *start, *end; |
175 | unsigned long *flags; | ||
172 | int i; | 176 | int i; |
173 | 177 | ||
174 | /* DMA priority: this table is good for i386 */ | 178 | /* DMA priority: this table is good for i386 */ |
@@ -582,7 +586,8 @@ int pnp_disable_dev(struct pnp_dev *dev) | |||
582 | * @size: size of region | 586 | * @size: size of region |
583 | * | 587 | * |
584 | */ | 588 | */ |
585 | void pnp_resource_change(struct resource *resource, unsigned long start, unsigned long size) | 589 | void pnp_resource_change(struct resource *resource, resource_size_t start, |
590 | resource_size_t size) | ||
586 | { | 591 | { |
587 | if (resource == NULL) | 592 | if (resource == NULL) |
588 | return; | 593 | return; |
diff --git a/drivers/pnp/resource.c b/drivers/pnp/resource.c index 6ded527169f4..7bb892f58cc0 100644 --- a/drivers/pnp/resource.c +++ b/drivers/pnp/resource.c | |||
@@ -241,7 +241,7 @@ int pnp_check_port(struct pnp_dev * dev, int idx) | |||
241 | { | 241 | { |
242 | int tmp; | 242 | int tmp; |
243 | struct pnp_dev *tdev; | 243 | struct pnp_dev *tdev; |
244 | unsigned long *port, *end, *tport, *tend; | 244 | resource_size_t *port, *end, *tport, *tend; |
245 | port = &dev->res.port_resource[idx].start; | 245 | port = &dev->res.port_resource[idx].start; |
246 | end = &dev->res.port_resource[idx].end; | 246 | end = &dev->res.port_resource[idx].end; |
247 | 247 | ||
@@ -297,7 +297,7 @@ int pnp_check_mem(struct pnp_dev * dev, int idx) | |||
297 | { | 297 | { |
298 | int tmp; | 298 | int tmp; |
299 | struct pnp_dev *tdev; | 299 | struct pnp_dev *tdev; |
300 | unsigned long *addr, *end, *taddr, *tend; | 300 | resource_size_t *addr, *end, *taddr, *tend; |
301 | addr = &dev->res.mem_resource[idx].start; | 301 | addr = &dev->res.mem_resource[idx].start; |
302 | end = &dev->res.mem_resource[idx].end; | 302 | end = &dev->res.mem_resource[idx].end; |
303 | 303 | ||
@@ -358,7 +358,7 @@ int pnp_check_irq(struct pnp_dev * dev, int idx) | |||
358 | { | 358 | { |
359 | int tmp; | 359 | int tmp; |
360 | struct pnp_dev *tdev; | 360 | struct pnp_dev *tdev; |
361 | unsigned long * irq = &dev->res.irq_resource[idx].start; | 361 | resource_size_t * irq = &dev->res.irq_resource[idx].start; |
362 | 362 | ||
363 | /* if the resource doesn't exist, don't complain about it */ | 363 | /* if the resource doesn't exist, don't complain about it */ |
364 | if (cannot_compare(dev->res.irq_resource[idx].flags)) | 364 | if (cannot_compare(dev->res.irq_resource[idx].flags)) |
@@ -423,7 +423,7 @@ int pnp_check_dma(struct pnp_dev * dev, int idx) | |||
423 | #ifndef CONFIG_IA64 | 423 | #ifndef CONFIG_IA64 |
424 | int tmp; | 424 | int tmp; |
425 | struct pnp_dev *tdev; | 425 | struct pnp_dev *tdev; |
426 | unsigned long * dma = &dev->res.dma_resource[idx].start; | 426 | resource_size_t * dma = &dev->res.dma_resource[idx].start; |
427 | 427 | ||
428 | /* if the resource doesn't exist, don't complain about it */ | 428 | /* if the resource doesn't exist, don't complain about it */ |
429 | if (cannot_compare(dev->res.dma_resource[idx].flags)) | 429 | if (cannot_compare(dev->res.dma_resource[idx].flags)) |
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index bccff400b198..f2fc81a9074d 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
@@ -162,6 +162,16 @@ config RTC_DRV_PCF8583 | |||
162 | This driver can also be built as a module. If so, the module | 162 | This driver can also be built as a module. If so, the module |
163 | will be called rtc-pcf8583. | 163 | will be called rtc-pcf8583. |
164 | 164 | ||
165 | config RTC_DRV_RS5C348 | ||
166 | tristate "Ricoh RS5C348A/B" | ||
167 | depends on RTC_CLASS && SPI | ||
168 | help | ||
169 | If you say yes here you get support for the | ||
170 | Ricoh RS5C348A and RS5C348B RTC chips. | ||
171 | |||
172 | This driver can also be built as a module. If so, the module | ||
173 | will be called rtc-rs5c348. | ||
174 | |||
165 | config RTC_DRV_RS5C372 | 175 | config RTC_DRV_RS5C372 |
166 | tristate "Ricoh RS5C372A/B" | 176 | tristate "Ricoh RS5C372A/B" |
167 | depends on RTC_CLASS && I2C | 177 | depends on RTC_CLASS && I2C |
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 900d210dd1a2..da5e38774e13 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile | |||
@@ -19,6 +19,7 @@ obj-$(CONFIG_RTC_DRV_DS1742) += rtc-ds1742.o | |||
19 | obj-$(CONFIG_RTC_DRV_PCF8563) += rtc-pcf8563.o | 19 | obj-$(CONFIG_RTC_DRV_PCF8563) += rtc-pcf8563.o |
20 | obj-$(CONFIG_RTC_DRV_PCF8583) += rtc-pcf8583.o | 20 | obj-$(CONFIG_RTC_DRV_PCF8583) += rtc-pcf8583.o |
21 | obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o | 21 | obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o |
22 | obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o | ||
22 | obj-$(CONFIG_RTC_DRV_M48T86) += rtc-m48t86.o | 23 | obj-$(CONFIG_RTC_DRV_M48T86) += rtc-m48t86.o |
23 | obj-$(CONFIG_RTC_DRV_DS1553) += rtc-ds1553.o | 24 | obj-$(CONFIG_RTC_DRV_DS1553) += rtc-ds1553.o |
24 | obj-$(CONFIG_RTC_DRV_EP93XX) += rtc-ep93xx.o | 25 | obj-$(CONFIG_RTC_DRV_EP93XX) += rtc-ep93xx.o |
diff --git a/drivers/rtc/rtc-rs5c348.c b/drivers/rtc/rtc-rs5c348.c new file mode 100644 index 000000000000..0964d1dba925 --- /dev/null +++ b/drivers/rtc/rtc-rs5c348.c | |||
@@ -0,0 +1,246 @@ | |||
1 | /* | ||
2 | * A SPI driver for the Ricoh RS5C348 RTC | ||
3 | * | ||
4 | * Copyright (C) 2006 Atsushi Nemoto <anemo@mba.ocn.ne.jp> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * The board specific init code should provide characteristics of this | ||
11 | * device: | ||
12 | * Mode 1 (High-Active, Shift-Then-Sample), High Avtive CS | ||
13 | */ | ||
14 | |||
15 | #include <linux/bcd.h> | ||
16 | #include <linux/delay.h> | ||
17 | #include <linux/device.h> | ||
18 | #include <linux/errno.h> | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/kernel.h> | ||
21 | #include <linux/string.h> | ||
22 | #include <linux/rtc.h> | ||
23 | #include <linux/workqueue.h> | ||
24 | #include <linux/spi/spi.h> | ||
25 | |||
26 | #define DRV_VERSION "0.1" | ||
27 | |||
28 | #define RS5C348_REG_SECS 0 | ||
29 | #define RS5C348_REG_MINS 1 | ||
30 | #define RS5C348_REG_HOURS 2 | ||
31 | #define RS5C348_REG_WDAY 3 | ||
32 | #define RS5C348_REG_DAY 4 | ||
33 | #define RS5C348_REG_MONTH 5 | ||
34 | #define RS5C348_REG_YEAR 6 | ||
35 | #define RS5C348_REG_CTL1 14 | ||
36 | #define RS5C348_REG_CTL2 15 | ||
37 | |||
38 | #define RS5C348_SECS_MASK 0x7f | ||
39 | #define RS5C348_MINS_MASK 0x7f | ||
40 | #define RS5C348_HOURS_MASK 0x3f | ||
41 | #define RS5C348_WDAY_MASK 0x03 | ||
42 | #define RS5C348_DAY_MASK 0x3f | ||
43 | #define RS5C348_MONTH_MASK 0x1f | ||
44 | |||
45 | #define RS5C348_BIT_PM 0x20 /* REG_HOURS */ | ||
46 | #define RS5C348_BIT_Y2K 0x80 /* REG_MONTH */ | ||
47 | #define RS5C348_BIT_24H 0x20 /* REG_CTL1 */ | ||
48 | #define RS5C348_BIT_XSTP 0x10 /* REG_CTL2 */ | ||
49 | #define RS5C348_BIT_VDET 0x40 /* REG_CTL2 */ | ||
50 | |||
51 | #define RS5C348_CMD_W(addr) (((addr) << 4) | 0x08) /* single write */ | ||
52 | #define RS5C348_CMD_R(addr) (((addr) << 4) | 0x0c) /* single read */ | ||
53 | #define RS5C348_CMD_MW(addr) (((addr) << 4) | 0x00) /* burst write */ | ||
54 | #define RS5C348_CMD_MR(addr) (((addr) << 4) | 0x04) /* burst read */ | ||
55 | |||
56 | struct rs5c348_plat_data { | ||
57 | struct rtc_device *rtc; | ||
58 | int rtc_24h; | ||
59 | }; | ||
60 | |||
61 | static int | ||
62 | rs5c348_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
63 | { | ||
64 | struct spi_device *spi = to_spi_device(dev); | ||
65 | struct rs5c348_plat_data *pdata = spi->dev.platform_data; | ||
66 | u8 txbuf[5+7], *txp; | ||
67 | int ret; | ||
68 | |||
69 | /* Transfer 5 bytes before writing SEC. This gives 31us for carry. */ | ||
70 | txp = txbuf; | ||
71 | txbuf[0] = RS5C348_CMD_R(RS5C348_REG_CTL2); /* cmd, ctl2 */ | ||
72 | txbuf[1] = 0; /* dummy */ | ||
73 | txbuf[2] = RS5C348_CMD_R(RS5C348_REG_CTL2); /* cmd, ctl2 */ | ||
74 | txbuf[3] = 0; /* dummy */ | ||
75 | txbuf[4] = RS5C348_CMD_MW(RS5C348_REG_SECS); /* cmd, sec, ... */ | ||
76 | txp = &txbuf[5]; | ||
77 | txp[RS5C348_REG_SECS] = BIN2BCD(tm->tm_sec); | ||
78 | txp[RS5C348_REG_MINS] = BIN2BCD(tm->tm_min); | ||
79 | if (pdata->rtc_24h) { | ||
80 | txp[RS5C348_REG_HOURS] = BIN2BCD(tm->tm_hour); | ||
81 | } else { | ||
82 | /* hour 0 is AM12, noon is PM12 */ | ||
83 | txp[RS5C348_REG_HOURS] = BIN2BCD((tm->tm_hour + 11) % 12 + 1) | | ||
84 | (tm->tm_hour >= 12 ? RS5C348_BIT_PM : 0); | ||
85 | } | ||
86 | txp[RS5C348_REG_WDAY] = BIN2BCD(tm->tm_wday); | ||
87 | txp[RS5C348_REG_DAY] = BIN2BCD(tm->tm_mday); | ||
88 | txp[RS5C348_REG_MONTH] = BIN2BCD(tm->tm_mon + 1) | | ||
89 | (tm->tm_year >= 100 ? RS5C348_BIT_Y2K : 0); | ||
90 | txp[RS5C348_REG_YEAR] = BIN2BCD(tm->tm_year % 100); | ||
91 | /* write in one transfer to avoid data inconsistency */ | ||
92 | ret = spi_write_then_read(spi, txbuf, sizeof(txbuf), NULL, 0); | ||
93 | udelay(62); /* Tcsr 62us */ | ||
94 | return ret; | ||
95 | } | ||
96 | |||
97 | static int | ||
98 | rs5c348_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
99 | { | ||
100 | struct spi_device *spi = to_spi_device(dev); | ||
101 | struct rs5c348_plat_data *pdata = spi->dev.platform_data; | ||
102 | u8 txbuf[5], rxbuf[7]; | ||
103 | int ret; | ||
104 | |||
105 | /* Transfer 5 byte befores reading SEC. This gives 31us for carry. */ | ||
106 | txbuf[0] = RS5C348_CMD_R(RS5C348_REG_CTL2); /* cmd, ctl2 */ | ||
107 | txbuf[1] = 0; /* dummy */ | ||
108 | txbuf[2] = RS5C348_CMD_R(RS5C348_REG_CTL2); /* cmd, ctl2 */ | ||
109 | txbuf[3] = 0; /* dummy */ | ||
110 | txbuf[4] = RS5C348_CMD_MR(RS5C348_REG_SECS); /* cmd, sec, ... */ | ||
111 | |||
112 | /* read in one transfer to avoid data inconsistency */ | ||
113 | ret = spi_write_then_read(spi, txbuf, sizeof(txbuf), | ||
114 | rxbuf, sizeof(rxbuf)); | ||
115 | udelay(62); /* Tcsr 62us */ | ||
116 | if (ret < 0) | ||
117 | return ret; | ||
118 | |||
119 | tm->tm_sec = BCD2BIN(rxbuf[RS5C348_REG_SECS] & RS5C348_SECS_MASK); | ||
120 | tm->tm_min = BCD2BIN(rxbuf[RS5C348_REG_MINS] & RS5C348_MINS_MASK); | ||
121 | tm->tm_hour = BCD2BIN(rxbuf[RS5C348_REG_HOURS] & RS5C348_HOURS_MASK); | ||
122 | if (!pdata->rtc_24h) { | ||
123 | tm->tm_hour %= 12; | ||
124 | if (rxbuf[RS5C348_REG_HOURS] & RS5C348_BIT_PM) | ||
125 | tm->tm_hour += 12; | ||
126 | } | ||
127 | tm->tm_wday = BCD2BIN(rxbuf[RS5C348_REG_WDAY] & RS5C348_WDAY_MASK); | ||
128 | tm->tm_mday = BCD2BIN(rxbuf[RS5C348_REG_DAY] & RS5C348_DAY_MASK); | ||
129 | tm->tm_mon = | ||
130 | BCD2BIN(rxbuf[RS5C348_REG_MONTH] & RS5C348_MONTH_MASK) - 1; | ||
131 | /* year is 1900 + tm->tm_year */ | ||
132 | tm->tm_year = BCD2BIN(rxbuf[RS5C348_REG_YEAR]) + | ||
133 | ((rxbuf[RS5C348_REG_MONTH] & RS5C348_BIT_Y2K) ? 100 : 0); | ||
134 | |||
135 | if (rtc_valid_tm(tm) < 0) { | ||
136 | dev_err(&spi->dev, "retrieved date/time is not valid.\n"); | ||
137 | rtc_time_to_tm(0, tm); | ||
138 | } | ||
139 | |||
140 | return 0; | ||
141 | } | ||
142 | |||
143 | static struct rtc_class_ops rs5c348_rtc_ops = { | ||
144 | .read_time = rs5c348_rtc_read_time, | ||
145 | .set_time = rs5c348_rtc_set_time, | ||
146 | }; | ||
147 | |||
148 | static struct spi_driver rs5c348_driver; | ||
149 | |||
150 | static int __devinit rs5c348_probe(struct spi_device *spi) | ||
151 | { | ||
152 | int ret; | ||
153 | struct rtc_device *rtc; | ||
154 | struct rs5c348_plat_data *pdata; | ||
155 | |||
156 | pdata = kzalloc(sizeof(struct rs5c348_plat_data), GFP_KERNEL); | ||
157 | if (!pdata) | ||
158 | return -ENOMEM; | ||
159 | spi->dev.platform_data = pdata; | ||
160 | |||
161 | /* Check D7 of SECOND register */ | ||
162 | ret = spi_w8r8(spi, RS5C348_CMD_R(RS5C348_REG_SECS)); | ||
163 | if (ret < 0 || (ret & 0x80)) { | ||
164 | dev_err(&spi->dev, "not found.\n"); | ||
165 | goto kfree_exit; | ||
166 | } | ||
167 | |||
168 | dev_info(&spi->dev, "chip found, driver version " DRV_VERSION "\n"); | ||
169 | dev_info(&spi->dev, "spiclk %u KHz.\n", | ||
170 | (spi->max_speed_hz + 500) / 1000); | ||
171 | |||
172 | /* turn RTC on if it was not on */ | ||
173 | ret = spi_w8r8(spi, RS5C348_CMD_R(RS5C348_REG_CTL2)); | ||
174 | if (ret < 0) | ||
175 | goto kfree_exit; | ||
176 | if (ret & (RS5C348_BIT_XSTP | RS5C348_BIT_VDET)) { | ||
177 | u8 buf[2]; | ||
178 | if (ret & RS5C348_BIT_VDET) | ||
179 | dev_warn(&spi->dev, "voltage-low detected.\n"); | ||
180 | buf[0] = RS5C348_CMD_W(RS5C348_REG_CTL2); | ||
181 | buf[1] = 0; | ||
182 | ret = spi_write_then_read(spi, buf, sizeof(buf), NULL, 0); | ||
183 | if (ret < 0) | ||
184 | goto kfree_exit; | ||
185 | } | ||
186 | |||
187 | ret = spi_w8r8(spi, RS5C348_CMD_R(RS5C348_REG_CTL1)); | ||
188 | if (ret < 0) | ||
189 | goto kfree_exit; | ||
190 | if (ret & RS5C348_BIT_24H) | ||
191 | pdata->rtc_24h = 1; | ||
192 | |||
193 | rtc = rtc_device_register(rs5c348_driver.driver.name, &spi->dev, | ||
194 | &rs5c348_rtc_ops, THIS_MODULE); | ||
195 | |||
196 | if (IS_ERR(rtc)) { | ||
197 | ret = PTR_ERR(rtc); | ||
198 | goto kfree_exit; | ||
199 | } | ||
200 | |||
201 | pdata->rtc = rtc; | ||
202 | |||
203 | return 0; | ||
204 | kfree_exit: | ||
205 | kfree(pdata); | ||
206 | return ret; | ||
207 | } | ||
208 | |||
209 | static int __devexit rs5c348_remove(struct spi_device *spi) | ||
210 | { | ||
211 | struct rs5c348_plat_data *pdata = spi->dev.platform_data; | ||
212 | struct rtc_device *rtc = pdata->rtc; | ||
213 | |||
214 | if (rtc) | ||
215 | rtc_device_unregister(rtc); | ||
216 | kfree(pdata); | ||
217 | return 0; | ||
218 | } | ||
219 | |||
220 | static struct spi_driver rs5c348_driver = { | ||
221 | .driver = { | ||
222 | .name = "rs5c348", | ||
223 | .bus = &spi_bus_type, | ||
224 | .owner = THIS_MODULE, | ||
225 | }, | ||
226 | .probe = rs5c348_probe, | ||
227 | .remove = __devexit_p(rs5c348_remove), | ||
228 | }; | ||
229 | |||
230 | static __init int rs5c348_init(void) | ||
231 | { | ||
232 | return spi_register_driver(&rs5c348_driver); | ||
233 | } | ||
234 | |||
235 | static __exit void rs5c348_exit(void) | ||
236 | { | ||
237 | spi_unregister_driver(&rs5c348_driver); | ||
238 | } | ||
239 | |||
240 | module_init(rs5c348_init); | ||
241 | module_exit(rs5c348_exit); | ||
242 | |||
243 | MODULE_AUTHOR("Atsushi Nemoto <anemo@mba.ocn.ne.jp>"); | ||
244 | MODULE_DESCRIPTION("Ricoh RS5C348 RTC driver"); | ||
245 | MODULE_LICENSE("GPL"); | ||
246 | MODULE_VERSION(DRV_VERSION); | ||
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index cfb1fff3787c..bafcd2f20ae2 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
@@ -95,7 +95,7 @@ dasd_alloc_device(void) | |||
95 | spin_lock_init(&device->mem_lock); | 95 | spin_lock_init(&device->mem_lock); |
96 | spin_lock_init(&device->request_queue_lock); | 96 | spin_lock_init(&device->request_queue_lock); |
97 | atomic_set (&device->tasklet_scheduled, 0); | 97 | atomic_set (&device->tasklet_scheduled, 0); |
98 | tasklet_init(&device->tasklet, | 98 | tasklet_init(&device->tasklet, |
99 | (void (*)(unsigned long)) dasd_tasklet, | 99 | (void (*)(unsigned long)) dasd_tasklet, |
100 | (unsigned long) device); | 100 | (unsigned long) device); |
101 | INIT_LIST_HEAD(&device->ccw_queue); | 101 | INIT_LIST_HEAD(&device->ccw_queue); |
@@ -128,7 +128,7 @@ dasd_state_new_to_known(struct dasd_device *device) | |||
128 | int rc; | 128 | int rc; |
129 | 129 | ||
130 | /* | 130 | /* |
131 | * As long as the device is not in state DASD_STATE_NEW we want to | 131 | * As long as the device is not in state DASD_STATE_NEW we want to |
132 | * keep the reference count > 0. | 132 | * keep the reference count > 0. |
133 | */ | 133 | */ |
134 | dasd_get_device(device); | 134 | dasd_get_device(device); |
@@ -336,7 +336,7 @@ dasd_decrease_state(struct dasd_device *device) | |||
336 | if (device->state == DASD_STATE_ONLINE && | 336 | if (device->state == DASD_STATE_ONLINE && |
337 | device->target <= DASD_STATE_READY) | 337 | device->target <= DASD_STATE_READY) |
338 | dasd_state_online_to_ready(device); | 338 | dasd_state_online_to_ready(device); |
339 | 339 | ||
340 | if (device->state == DASD_STATE_READY && | 340 | if (device->state == DASD_STATE_READY && |
341 | device->target <= DASD_STATE_BASIC) | 341 | device->target <= DASD_STATE_BASIC) |
342 | dasd_state_ready_to_basic(device); | 342 | dasd_state_ready_to_basic(device); |
@@ -348,7 +348,7 @@ dasd_decrease_state(struct dasd_device *device) | |||
348 | if (device->state == DASD_STATE_BASIC && | 348 | if (device->state == DASD_STATE_BASIC && |
349 | device->target <= DASD_STATE_KNOWN) | 349 | device->target <= DASD_STATE_KNOWN) |
350 | dasd_state_basic_to_known(device); | 350 | dasd_state_basic_to_known(device); |
351 | 351 | ||
352 | if (device->state == DASD_STATE_KNOWN && | 352 | if (device->state == DASD_STATE_KNOWN && |
353 | device->target <= DASD_STATE_NEW) | 353 | device->target <= DASD_STATE_NEW) |
354 | dasd_state_known_to_new(device); | 354 | dasd_state_known_to_new(device); |
@@ -994,7 +994,7 @@ dasd_int_handler(struct ccw_device *cdev, unsigned long intparm, | |||
994 | ((irb->scsw.cstat << 8) | irb->scsw.dstat), cqr); | 994 | ((irb->scsw.cstat << 8) | irb->scsw.dstat), cqr); |
995 | 995 | ||
996 | /* Find out the appropriate era_action. */ | 996 | /* Find out the appropriate era_action. */ |
997 | if (irb->scsw.fctl & SCSW_FCTL_HALT_FUNC) | 997 | if (irb->scsw.fctl & SCSW_FCTL_HALT_FUNC) |
998 | era = dasd_era_fatal; | 998 | era = dasd_era_fatal; |
999 | else if (irb->scsw.dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END) && | 999 | else if (irb->scsw.dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END) && |
1000 | irb->scsw.cstat == 0 && | 1000 | irb->scsw.cstat == 0 && |
@@ -1004,7 +1004,7 @@ dasd_int_handler(struct ccw_device *cdev, unsigned long intparm, | |||
1004 | era = dasd_era_fatal; /* don't recover this request */ | 1004 | era = dasd_era_fatal; /* don't recover this request */ |
1005 | else if (irb->esw.esw0.erw.cons) | 1005 | else if (irb->esw.esw0.erw.cons) |
1006 | era = device->discipline->examine_error(cqr, irb); | 1006 | era = device->discipline->examine_error(cqr, irb); |
1007 | else | 1007 | else |
1008 | era = dasd_era_recover; | 1008 | era = dasd_era_recover; |
1009 | 1009 | ||
1010 | DBF_DEV_EVENT(DBF_DEBUG, device, "era_code %d", era); | 1010 | DBF_DEV_EVENT(DBF_DEBUG, device, "era_code %d", era); |
@@ -1287,7 +1287,7 @@ __dasd_start_head(struct dasd_device * device) | |||
1287 | } | 1287 | } |
1288 | 1288 | ||
1289 | /* | 1289 | /* |
1290 | * Remove requests from the ccw queue. | 1290 | * Remove requests from the ccw queue. |
1291 | */ | 1291 | */ |
1292 | static void | 1292 | static void |
1293 | dasd_flush_ccw_queue(struct dasd_device * device, int all) | 1293 | dasd_flush_ccw_queue(struct dasd_device * device, int all) |
@@ -1450,23 +1450,23 @@ dasd_sleep_on(struct dasd_ccw_req * cqr) | |||
1450 | wait_queue_head_t wait_q; | 1450 | wait_queue_head_t wait_q; |
1451 | struct dasd_device *device; | 1451 | struct dasd_device *device; |
1452 | int rc; | 1452 | int rc; |
1453 | 1453 | ||
1454 | device = cqr->device; | 1454 | device = cqr->device; |
1455 | spin_lock_irq(get_ccwdev_lock(device->cdev)); | 1455 | spin_lock_irq(get_ccwdev_lock(device->cdev)); |
1456 | 1456 | ||
1457 | init_waitqueue_head (&wait_q); | 1457 | init_waitqueue_head (&wait_q); |
1458 | cqr->callback = dasd_wakeup_cb; | 1458 | cqr->callback = dasd_wakeup_cb; |
1459 | cqr->callback_data = (void *) &wait_q; | 1459 | cqr->callback_data = (void *) &wait_q; |
1460 | cqr->status = DASD_CQR_QUEUED; | 1460 | cqr->status = DASD_CQR_QUEUED; |
1461 | list_add_tail(&cqr->list, &device->ccw_queue); | 1461 | list_add_tail(&cqr->list, &device->ccw_queue); |
1462 | 1462 | ||
1463 | /* let the bh start the request to keep them in order */ | 1463 | /* let the bh start the request to keep them in order */ |
1464 | dasd_schedule_bh(device); | 1464 | dasd_schedule_bh(device); |
1465 | 1465 | ||
1466 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); | 1466 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); |
1467 | 1467 | ||
1468 | wait_event(wait_q, _wait_for_wakeup(cqr)); | 1468 | wait_event(wait_q, _wait_for_wakeup(cqr)); |
1469 | 1469 | ||
1470 | /* Request status is either done or failed. */ | 1470 | /* Request status is either done or failed. */ |
1471 | rc = (cqr->status == DASD_CQR_FAILED) ? -EIO : 0; | 1471 | rc = (cqr->status == DASD_CQR_FAILED) ? -EIO : 0; |
1472 | return rc; | 1472 | return rc; |
@@ -1568,7 +1568,7 @@ dasd_sleep_on_immediatly(struct dasd_ccw_req * cqr) | |||
1568 | wait_queue_head_t wait_q; | 1568 | wait_queue_head_t wait_q; |
1569 | struct dasd_device *device; | 1569 | struct dasd_device *device; |
1570 | int rc; | 1570 | int rc; |
1571 | 1571 | ||
1572 | device = cqr->device; | 1572 | device = cqr->device; |
1573 | spin_lock_irq(get_ccwdev_lock(device->cdev)); | 1573 | spin_lock_irq(get_ccwdev_lock(device->cdev)); |
1574 | rc = _dasd_term_running_cqr(device); | 1574 | rc = _dasd_term_running_cqr(device); |
@@ -1576,20 +1576,20 @@ dasd_sleep_on_immediatly(struct dasd_ccw_req * cqr) | |||
1576 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); | 1576 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); |
1577 | return rc; | 1577 | return rc; |
1578 | } | 1578 | } |
1579 | 1579 | ||
1580 | init_waitqueue_head (&wait_q); | 1580 | init_waitqueue_head (&wait_q); |
1581 | cqr->callback = dasd_wakeup_cb; | 1581 | cqr->callback = dasd_wakeup_cb; |
1582 | cqr->callback_data = (void *) &wait_q; | 1582 | cqr->callback_data = (void *) &wait_q; |
1583 | cqr->status = DASD_CQR_QUEUED; | 1583 | cqr->status = DASD_CQR_QUEUED; |
1584 | list_add(&cqr->list, &device->ccw_queue); | 1584 | list_add(&cqr->list, &device->ccw_queue); |
1585 | 1585 | ||
1586 | /* let the bh start the request to keep them in order */ | 1586 | /* let the bh start the request to keep them in order */ |
1587 | dasd_schedule_bh(device); | 1587 | dasd_schedule_bh(device); |
1588 | 1588 | ||
1589 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); | 1589 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); |
1590 | 1590 | ||
1591 | wait_event(wait_q, _wait_for_wakeup(cqr)); | 1591 | wait_event(wait_q, _wait_for_wakeup(cqr)); |
1592 | 1592 | ||
1593 | /* Request status is either done or failed. */ | 1593 | /* Request status is either done or failed. */ |
1594 | rc = (cqr->status == DASD_CQR_FAILED) ? -EIO : 0; | 1594 | rc = (cqr->status == DASD_CQR_FAILED) ? -EIO : 0; |
1595 | return rc; | 1595 | return rc; |
@@ -1725,7 +1725,7 @@ dasd_flush_request_queue(struct dasd_device * device) | |||
1725 | 1725 | ||
1726 | if (!device->request_queue) | 1726 | if (!device->request_queue) |
1727 | return; | 1727 | return; |
1728 | 1728 | ||
1729 | spin_lock_irq(&device->request_queue_lock); | 1729 | spin_lock_irq(&device->request_queue_lock); |
1730 | while (!list_empty(&device->request_queue->queue_head)) { | 1730 | while (!list_empty(&device->request_queue->queue_head)) { |
1731 | req = elv_next_request(device->request_queue); | 1731 | req = elv_next_request(device->request_queue); |
@@ -1855,15 +1855,34 @@ dasd_generic_probe (struct ccw_device *cdev, | |||
1855 | { | 1855 | { |
1856 | int ret; | 1856 | int ret; |
1857 | 1857 | ||
1858 | ret = ccw_device_set_options(cdev, CCWDEV_DO_PATHGROUP); | ||
1859 | if (ret) { | ||
1860 | printk(KERN_WARNING | ||
1861 | "dasd_generic_probe: could not set ccw-device options " | ||
1862 | "for %s\n", cdev->dev.bus_id); | ||
1863 | return ret; | ||
1864 | } | ||
1858 | ret = dasd_add_sysfs_files(cdev); | 1865 | ret = dasd_add_sysfs_files(cdev); |
1859 | if (ret) { | 1866 | if (ret) { |
1860 | printk(KERN_WARNING | 1867 | printk(KERN_WARNING |
1861 | "dasd_generic_probe: could not add sysfs entries " | 1868 | "dasd_generic_probe: could not add sysfs entries " |
1862 | "for %s\n", cdev->dev.bus_id); | 1869 | "for %s\n", cdev->dev.bus_id); |
1863 | } else { | 1870 | return ret; |
1864 | cdev->handler = &dasd_int_handler; | ||
1865 | } | 1871 | } |
1872 | cdev->handler = &dasd_int_handler; | ||
1866 | 1873 | ||
1874 | /* | ||
1875 | * Automatically online either all dasd devices (dasd_autodetect) | ||
1876 | * or all devices specified with dasd= parameters during | ||
1877 | * initial probe. | ||
1878 | */ | ||
1879 | if ((dasd_get_feature(cdev, DASD_FEATURE_INITIAL_ONLINE) > 0 ) || | ||
1880 | (dasd_autodetect && dasd_busid_known(cdev->dev.bus_id) != 0)) | ||
1881 | ret = ccw_device_set_online(cdev); | ||
1882 | if (ret) | ||
1883 | printk(KERN_WARNING | ||
1884 | "dasd_generic_probe: could not initially online " | ||
1885 | "ccw-device %s\n", cdev->dev.bus_id); | ||
1867 | return ret; | 1886 | return ret; |
1868 | } | 1887 | } |
1869 | 1888 | ||
@@ -1911,6 +1930,8 @@ dasd_generic_set_online (struct ccw_device *cdev, | |||
1911 | struct dasd_device *device; | 1930 | struct dasd_device *device; |
1912 | int rc; | 1931 | int rc; |
1913 | 1932 | ||
1933 | /* first online clears initial online feature flag */ | ||
1934 | dasd_set_feature(cdev, DASD_FEATURE_INITIAL_ONLINE, 0); | ||
1914 | device = dasd_create_device(cdev); | 1935 | device = dasd_create_device(cdev); |
1915 | if (IS_ERR(device)) | 1936 | if (IS_ERR(device)) |
1916 | return PTR_ERR(device); | 1937 | return PTR_ERR(device); |
@@ -2065,31 +2086,6 @@ dasd_generic_notify(struct ccw_device *cdev, int event) | |||
2065 | return ret; | 2086 | return ret; |
2066 | } | 2087 | } |
2067 | 2088 | ||
2068 | /* | ||
2069 | * Automatically online either all dasd devices (dasd_autodetect) or | ||
2070 | * all devices specified with dasd= parameters. | ||
2071 | */ | ||
2072 | static int | ||
2073 | __dasd_auto_online(struct device *dev, void *data) | ||
2074 | { | ||
2075 | struct ccw_device *cdev; | ||
2076 | |||
2077 | cdev = to_ccwdev(dev); | ||
2078 | if (dasd_autodetect || dasd_busid_known(cdev->dev.bus_id) == 0) | ||
2079 | ccw_device_set_online(cdev); | ||
2080 | return 0; | ||
2081 | } | ||
2082 | |||
2083 | void | ||
2084 | dasd_generic_auto_online (struct ccw_driver *dasd_discipline_driver) | ||
2085 | { | ||
2086 | struct device_driver *drv; | ||
2087 | |||
2088 | drv = get_driver(&dasd_discipline_driver->driver); | ||
2089 | driver_for_each_device(drv, NULL, NULL, __dasd_auto_online); | ||
2090 | put_driver(drv); | ||
2091 | } | ||
2092 | |||
2093 | 2089 | ||
2094 | static int __init | 2090 | static int __init |
2095 | dasd_init(void) | 2091 | dasd_init(void) |
@@ -2170,23 +2166,4 @@ EXPORT_SYMBOL_GPL(dasd_generic_remove); | |||
2170 | EXPORT_SYMBOL_GPL(dasd_generic_notify); | 2166 | EXPORT_SYMBOL_GPL(dasd_generic_notify); |
2171 | EXPORT_SYMBOL_GPL(dasd_generic_set_online); | 2167 | EXPORT_SYMBOL_GPL(dasd_generic_set_online); |
2172 | EXPORT_SYMBOL_GPL(dasd_generic_set_offline); | 2168 | EXPORT_SYMBOL_GPL(dasd_generic_set_offline); |
2173 | EXPORT_SYMBOL_GPL(dasd_generic_auto_online); | ||
2174 | 2169 | ||
2175 | /* | ||
2176 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
2177 | * Emacs will notice this stuff at the end of the file and automatically | ||
2178 | * adjust the settings for this buffer only. This must remain at the end | ||
2179 | * of the file. | ||
2180 | * --------------------------------------------------------------------------- | ||
2181 | * Local variables: | ||
2182 | * c-indent-level: 4 | ||
2183 | * c-brace-imaginary-offset: 0 | ||
2184 | * c-brace-offset: -4 | ||
2185 | * c-argdecl-indent: 4 | ||
2186 | * c-label-offset: -4 | ||
2187 | * c-continued-statement-offset: 4 | ||
2188 | * c-continued-brace-offset: 0 | ||
2189 | * indent-tabs-mode: 1 | ||
2190 | * tab-width: 8 | ||
2191 | * End: | ||
2192 | */ | ||
diff --git a/drivers/s390/block/dasd_3370_erp.c b/drivers/s390/block/dasd_3370_erp.c index 1d11c2a9525d..1ddab8991d92 100644 --- a/drivers/s390/block/dasd_3370_erp.c +++ b/drivers/s390/block/dasd_3370_erp.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * File...........: linux/drivers/s390/block/dasd_3370_erp.c | 2 | * File...........: linux/drivers/s390/block/dasd_3370_erp.c |
3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> | 3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> |
4 | * Bugreports.to..: <Linux390@de.ibm.com> | 4 | * Bugreports.to..: <Linux390@de.ibm.com> |
@@ -12,10 +12,10 @@ | |||
12 | 12 | ||
13 | 13 | ||
14 | /* | 14 | /* |
15 | * DASD_3370_ERP_EXAMINE | 15 | * DASD_3370_ERP_EXAMINE |
16 | * | 16 | * |
17 | * DESCRIPTION | 17 | * DESCRIPTION |
18 | * Checks only for fatal/no/recover error. | 18 | * Checks only for fatal/no/recover error. |
19 | * A detailed examination of the sense data is done later outside | 19 | * A detailed examination of the sense data is done later outside |
20 | * the interrupt handler. | 20 | * the interrupt handler. |
21 | * | 21 | * |
@@ -23,7 +23,7 @@ | |||
23 | * 'Chapter 7. 3370 Sense Data'. | 23 | * 'Chapter 7. 3370 Sense Data'. |
24 | * | 24 | * |
25 | * RETURN VALUES | 25 | * RETURN VALUES |
26 | * dasd_era_none no error | 26 | * dasd_era_none no error |
27 | * dasd_era_fatal for all fatal (unrecoverable errors) | 27 | * dasd_era_fatal for all fatal (unrecoverable errors) |
28 | * dasd_era_recover for all others. | 28 | * dasd_era_recover for all others. |
29 | */ | 29 | */ |
@@ -82,22 +82,3 @@ dasd_3370_erp_examine(struct dasd_ccw_req * cqr, struct irb * irb) | |||
82 | return dasd_era_recover; | 82 | return dasd_era_recover; |
83 | 83 | ||
84 | } /* END dasd_3370_erp_examine */ | 84 | } /* END dasd_3370_erp_examine */ |
85 | |||
86 | /* | ||
87 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
88 | * Emacs will notice this stuff at the end of the file and automatically | ||
89 | * adjust the settings for this buffer only. This must remain at the end | ||
90 | * of the file. | ||
91 | * --------------------------------------------------------------------------- | ||
92 | * Local variables: | ||
93 | * c-indent-level: 4 | ||
94 | * c-brace-imaginary-offset: 0 | ||
95 | * c-brace-offset: -4 | ||
96 | * c-argdecl-indent: 4 | ||
97 | * c-label-offset: -4 | ||
98 | * c-continued-statement-offset: 4 | ||
99 | * c-continued-brace-offset: 0 | ||
100 | * indent-tabs-mode: 1 | ||
101 | * tab-width: 8 | ||
102 | * End: | ||
103 | */ | ||
diff --git a/drivers/s390/block/dasd_3990_erp.c b/drivers/s390/block/dasd_3990_erp.c index 2ed51562319e..669805d4402d 100644 --- a/drivers/s390/block/dasd_3990_erp.c +++ b/drivers/s390/block/dasd_3990_erp.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * File...........: linux/drivers/s390/block/dasd_3990_erp.c | 2 | * File...........: linux/drivers/s390/block/dasd_3990_erp.c |
3 | * Author(s)......: Horst Hummel <Horst.Hummel@de.ibm.com> | 3 | * Author(s)......: Horst Hummel <Horst.Hummel@de.ibm.com> |
4 | * Holger Smolinski <Holger.Smolinski@de.ibm.com> | 4 | * Holger Smolinski <Holger.Smolinski@de.ibm.com> |
5 | * Bugreports.to..: <Linux390@de.ibm.com> | 5 | * Bugreports.to..: <Linux390@de.ibm.com> |
6 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000, 2001 | 6 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000, 2001 |
@@ -25,23 +25,23 @@ struct DCTL_data { | |||
25 | } __attribute__ ((packed)); | 25 | } __attribute__ ((packed)); |
26 | 26 | ||
27 | /* | 27 | /* |
28 | ***************************************************************************** | 28 | ***************************************************************************** |
29 | * SECTION ERP EXAMINATION | 29 | * SECTION ERP EXAMINATION |
30 | ***************************************************************************** | 30 | ***************************************************************************** |
31 | */ | 31 | */ |
32 | 32 | ||
33 | /* | 33 | /* |
34 | * DASD_3990_ERP_EXAMINE_24 | 34 | * DASD_3990_ERP_EXAMINE_24 |
35 | * | 35 | * |
36 | * DESCRIPTION | 36 | * DESCRIPTION |
37 | * Checks only for fatal (unrecoverable) error. | 37 | * Checks only for fatal (unrecoverable) error. |
38 | * A detailed examination of the sense data is done later outside | 38 | * A detailed examination of the sense data is done later outside |
39 | * the interrupt handler. | 39 | * the interrupt handler. |
40 | * | 40 | * |
41 | * Each bit configuration leading to an action code 2 (Exit with | 41 | * Each bit configuration leading to an action code 2 (Exit with |
42 | * programming error or unusual condition indication) | 42 | * programming error or unusual condition indication) |
43 | * are handled as fatal error´s. | 43 | * are handled as fatal error´s. |
44 | * | 44 | * |
45 | * All other configurations are handled as recoverable errors. | 45 | * All other configurations are handled as recoverable errors. |
46 | * | 46 | * |
47 | * RETURN VALUES | 47 | * RETURN VALUES |
@@ -93,15 +93,15 @@ dasd_3990_erp_examine_24(struct dasd_ccw_req * cqr, char *sense) | |||
93 | } /* END dasd_3990_erp_examine_24 */ | 93 | } /* END dasd_3990_erp_examine_24 */ |
94 | 94 | ||
95 | /* | 95 | /* |
96 | * DASD_3990_ERP_EXAMINE_32 | 96 | * DASD_3990_ERP_EXAMINE_32 |
97 | * | 97 | * |
98 | * DESCRIPTION | 98 | * DESCRIPTION |
99 | * Checks only for fatal/no/recoverable error. | 99 | * Checks only for fatal/no/recoverable error. |
100 | * A detailed examination of the sense data is done later outside | 100 | * A detailed examination of the sense data is done later outside |
101 | * the interrupt handler. | 101 | * the interrupt handler. |
102 | * | 102 | * |
103 | * RETURN VALUES | 103 | * RETURN VALUES |
104 | * dasd_era_none no error | 104 | * dasd_era_none no error |
105 | * dasd_era_fatal for all fatal (unrecoverable errors) | 105 | * dasd_era_fatal for all fatal (unrecoverable errors) |
106 | * dasd_era_recover for recoverable others. | 106 | * dasd_era_recover for recoverable others. |
107 | */ | 107 | */ |
@@ -128,10 +128,10 @@ dasd_3990_erp_examine_32(struct dasd_ccw_req * cqr, char *sense) | |||
128 | } /* end dasd_3990_erp_examine_32 */ | 128 | } /* end dasd_3990_erp_examine_32 */ |
129 | 129 | ||
130 | /* | 130 | /* |
131 | * DASD_3990_ERP_EXAMINE | 131 | * DASD_3990_ERP_EXAMINE |
132 | * | 132 | * |
133 | * DESCRIPTION | 133 | * DESCRIPTION |
134 | * Checks only for fatal/no/recover error. | 134 | * Checks only for fatal/no/recover error. |
135 | * A detailed examination of the sense data is done later outside | 135 | * A detailed examination of the sense data is done later outside |
136 | * the interrupt handler. | 136 | * the interrupt handler. |
137 | * | 137 | * |
@@ -139,7 +139,7 @@ dasd_3990_erp_examine_32(struct dasd_ccw_req * cqr, char *sense) | |||
139 | * 'Chapter 7. Error Recovery Procedures'. | 139 | * 'Chapter 7. Error Recovery Procedures'. |
140 | * | 140 | * |
141 | * RETURN VALUES | 141 | * RETURN VALUES |
142 | * dasd_era_none no error | 142 | * dasd_era_none no error |
143 | * dasd_era_fatal for all fatal (unrecoverable errors) | 143 | * dasd_era_fatal for all fatal (unrecoverable errors) |
144 | * dasd_era_recover for all others. | 144 | * dasd_era_recover for all others. |
145 | */ | 145 | */ |
@@ -178,18 +178,18 @@ dasd_3990_erp_examine(struct dasd_ccw_req * cqr, struct irb * irb) | |||
178 | } /* END dasd_3990_erp_examine */ | 178 | } /* END dasd_3990_erp_examine */ |
179 | 179 | ||
180 | /* | 180 | /* |
181 | ***************************************************************************** | 181 | ***************************************************************************** |
182 | * SECTION ERP HANDLING | 182 | * SECTION ERP HANDLING |
183 | ***************************************************************************** | 183 | ***************************************************************************** |
184 | */ | 184 | */ |
185 | /* | 185 | /* |
186 | ***************************************************************************** | 186 | ***************************************************************************** |
187 | * 24 and 32 byte sense ERP functions | 187 | * 24 and 32 byte sense ERP functions |
188 | ***************************************************************************** | 188 | ***************************************************************************** |
189 | */ | 189 | */ |
190 | 190 | ||
191 | /* | 191 | /* |
192 | * DASD_3990_ERP_CLEANUP | 192 | * DASD_3990_ERP_CLEANUP |
193 | * | 193 | * |
194 | * DESCRIPTION | 194 | * DESCRIPTION |
195 | * Removes the already build but not necessary ERP request and sets | 195 | * Removes the already build but not necessary ERP request and sets |
@@ -197,10 +197,10 @@ dasd_3990_erp_examine(struct dasd_ccw_req * cqr, struct irb * irb) | |||
197 | * | 197 | * |
198 | * PARAMETER | 198 | * PARAMETER |
199 | * erp request to be blocked | 199 | * erp request to be blocked |
200 | * final_status either DASD_CQR_DONE or DASD_CQR_FAILED | 200 | * final_status either DASD_CQR_DONE or DASD_CQR_FAILED |
201 | * | 201 | * |
202 | * RETURN VALUES | 202 | * RETURN VALUES |
203 | * cqr original cqr | 203 | * cqr original cqr |
204 | */ | 204 | */ |
205 | static struct dasd_ccw_req * | 205 | static struct dasd_ccw_req * |
206 | dasd_3990_erp_cleanup(struct dasd_ccw_req * erp, char final_status) | 206 | dasd_3990_erp_cleanup(struct dasd_ccw_req * erp, char final_status) |
@@ -214,7 +214,7 @@ dasd_3990_erp_cleanup(struct dasd_ccw_req * erp, char final_status) | |||
214 | } /* end dasd_3990_erp_cleanup */ | 214 | } /* end dasd_3990_erp_cleanup */ |
215 | 215 | ||
216 | /* | 216 | /* |
217 | * DASD_3990_ERP_BLOCK_QUEUE | 217 | * DASD_3990_ERP_BLOCK_QUEUE |
218 | * | 218 | * |
219 | * DESCRIPTION | 219 | * DESCRIPTION |
220 | * Block the given device request queue to prevent from further | 220 | * Block the given device request queue to prevent from further |
@@ -237,7 +237,7 @@ dasd_3990_erp_block_queue(struct dasd_ccw_req * erp, int expires) | |||
237 | } | 237 | } |
238 | 238 | ||
239 | /* | 239 | /* |
240 | * DASD_3990_ERP_INT_REQ | 240 | * DASD_3990_ERP_INT_REQ |
241 | * | 241 | * |
242 | * DESCRIPTION | 242 | * DESCRIPTION |
243 | * Handles 'Intervention Required' error. | 243 | * Handles 'Intervention Required' error. |
@@ -277,7 +277,7 @@ dasd_3990_erp_int_req(struct dasd_ccw_req * erp) | |||
277 | } /* end dasd_3990_erp_int_req */ | 277 | } /* end dasd_3990_erp_int_req */ |
278 | 278 | ||
279 | /* | 279 | /* |
280 | * DASD_3990_ERP_ALTERNATE_PATH | 280 | * DASD_3990_ERP_ALTERNATE_PATH |
281 | * | 281 | * |
282 | * DESCRIPTION | 282 | * DESCRIPTION |
283 | * Repeat the operation on a different channel path. | 283 | * Repeat the operation on a different channel path. |
@@ -330,15 +330,15 @@ dasd_3990_erp_alternate_path(struct dasd_ccw_req * erp) | |||
330 | * DASD_3990_ERP_DCTL | 330 | * DASD_3990_ERP_DCTL |
331 | * | 331 | * |
332 | * DESCRIPTION | 332 | * DESCRIPTION |
333 | * Setup cqr to do the Diagnostic Control (DCTL) command with an | 333 | * Setup cqr to do the Diagnostic Control (DCTL) command with an |
334 | * Inhibit Write subcommand (0x20) and the given modifier. | 334 | * Inhibit Write subcommand (0x20) and the given modifier. |
335 | * | 335 | * |
336 | * PARAMETER | 336 | * PARAMETER |
337 | * erp pointer to the current (failed) ERP | 337 | * erp pointer to the current (failed) ERP |
338 | * modifier subcommand modifier | 338 | * modifier subcommand modifier |
339 | * | 339 | * |
340 | * RETURN VALUES | 340 | * RETURN VALUES |
341 | * dctl_cqr pointer to NEW dctl_cqr | 341 | * dctl_cqr pointer to NEW dctl_cqr |
342 | * | 342 | * |
343 | */ | 343 | */ |
344 | static struct dasd_ccw_req * | 344 | static struct dasd_ccw_req * |
@@ -386,7 +386,7 @@ dasd_3990_erp_DCTL(struct dasd_ccw_req * erp, char modifier) | |||
386 | } /* end dasd_3990_erp_DCTL */ | 386 | } /* end dasd_3990_erp_DCTL */ |
387 | 387 | ||
388 | /* | 388 | /* |
389 | * DASD_3990_ERP_ACTION_1 | 389 | * DASD_3990_ERP_ACTION_1 |
390 | * | 390 | * |
391 | * DESCRIPTION | 391 | * DESCRIPTION |
392 | * Setup ERP to do the ERP action 1 (see Reference manual). | 392 | * Setup ERP to do the ERP action 1 (see Reference manual). |
@@ -415,7 +415,7 @@ dasd_3990_erp_action_1(struct dasd_ccw_req * erp) | |||
415 | } /* end dasd_3990_erp_action_1 */ | 415 | } /* end dasd_3990_erp_action_1 */ |
416 | 416 | ||
417 | /* | 417 | /* |
418 | * DASD_3990_ERP_ACTION_4 | 418 | * DASD_3990_ERP_ACTION_4 |
419 | * | 419 | * |
420 | * DESCRIPTION | 420 | * DESCRIPTION |
421 | * Setup ERP to do the ERP action 4 (see Reference manual). | 421 | * Setup ERP to do the ERP action 4 (see Reference manual). |
@@ -453,11 +453,11 @@ dasd_3990_erp_action_4(struct dasd_ccw_req * erp, char *sense) | |||
453 | 453 | ||
454 | if (sense[25] == 0x1D) { /* state change pending */ | 454 | if (sense[25] == 0x1D) { /* state change pending */ |
455 | 455 | ||
456 | DEV_MESSAGE(KERN_INFO, device, | 456 | DEV_MESSAGE(KERN_INFO, device, |
457 | "waiting for state change pending " | 457 | "waiting for state change pending " |
458 | "interrupt, %d retries left", | 458 | "interrupt, %d retries left", |
459 | erp->retries); | 459 | erp->retries); |
460 | 460 | ||
461 | dasd_3990_erp_block_queue(erp, 30*HZ); | 461 | dasd_3990_erp_block_queue(erp, 30*HZ); |
462 | 462 | ||
463 | } else if (sense[25] == 0x1E) { /* busy */ | 463 | } else if (sense[25] == 0x1E) { /* busy */ |
@@ -469,9 +469,9 @@ dasd_3990_erp_action_4(struct dasd_ccw_req * erp, char *sense) | |||
469 | } else { | 469 | } else { |
470 | 470 | ||
471 | /* no state change pending - retry */ | 471 | /* no state change pending - retry */ |
472 | DEV_MESSAGE (KERN_INFO, device, | 472 | DEV_MESSAGE (KERN_INFO, device, |
473 | "redriving request immediately, " | 473 | "redriving request immediately, " |
474 | "%d retries left", | 474 | "%d retries left", |
475 | erp->retries); | 475 | erp->retries); |
476 | erp->status = DASD_CQR_QUEUED; | 476 | erp->status = DASD_CQR_QUEUED; |
477 | } | 477 | } |
@@ -482,13 +482,13 @@ dasd_3990_erp_action_4(struct dasd_ccw_req * erp, char *sense) | |||
482 | } /* end dasd_3990_erp_action_4 */ | 482 | } /* end dasd_3990_erp_action_4 */ |
483 | 483 | ||
484 | /* | 484 | /* |
485 | ***************************************************************************** | 485 | ***************************************************************************** |
486 | * 24 byte sense ERP functions (only) | 486 | * 24 byte sense ERP functions (only) |
487 | ***************************************************************************** | 487 | ***************************************************************************** |
488 | */ | 488 | */ |
489 | 489 | ||
490 | /* | 490 | /* |
491 | * DASD_3990_ERP_ACTION_5 | 491 | * DASD_3990_ERP_ACTION_5 |
492 | * | 492 | * |
493 | * DESCRIPTION | 493 | * DESCRIPTION |
494 | * Setup ERP to do the ERP action 5 (see Reference manual). | 494 | * Setup ERP to do the ERP action 5 (see Reference manual). |
@@ -523,7 +523,7 @@ dasd_3990_erp_action_5(struct dasd_ccw_req * erp) | |||
523 | * | 523 | * |
524 | * PARAMETER | 524 | * PARAMETER |
525 | * sense current sense data | 525 | * sense current sense data |
526 | * | 526 | * |
527 | * RETURN VALUES | 527 | * RETURN VALUES |
528 | * void | 528 | * void |
529 | */ | 529 | */ |
@@ -1150,9 +1150,9 @@ dasd_3990_handle_env_data(struct dasd_ccw_req * erp, char *sense) | |||
1150 | * PARAMETER | 1150 | * PARAMETER |
1151 | * erp current erp_head | 1151 | * erp current erp_head |
1152 | * sense current sense data | 1152 | * sense current sense data |
1153 | * | 1153 | * |
1154 | * RETURN VALUES | 1154 | * RETURN VALUES |
1155 | * erp 'new' erp_head - pointer to new ERP | 1155 | * erp 'new' erp_head - pointer to new ERP |
1156 | */ | 1156 | */ |
1157 | static struct dasd_ccw_req * | 1157 | static struct dasd_ccw_req * |
1158 | dasd_3990_erp_com_rej(struct dasd_ccw_req * erp, char *sense) | 1158 | dasd_3990_erp_com_rej(struct dasd_ccw_req * erp, char *sense) |
@@ -1185,7 +1185,7 @@ dasd_3990_erp_com_rej(struct dasd_ccw_req * erp, char *sense) | |||
1185 | } /* end dasd_3990_erp_com_rej */ | 1185 | } /* end dasd_3990_erp_com_rej */ |
1186 | 1186 | ||
1187 | /* | 1187 | /* |
1188 | * DASD_3990_ERP_BUS_OUT | 1188 | * DASD_3990_ERP_BUS_OUT |
1189 | * | 1189 | * |
1190 | * DESCRIPTION | 1190 | * DESCRIPTION |
1191 | * Handles 24 byte 'Bus Out Parity Check' error. | 1191 | * Handles 24 byte 'Bus Out Parity Check' error. |
@@ -1483,7 +1483,7 @@ dasd_3990_erp_env_data(struct dasd_ccw_req * erp, char *sense) | |||
1483 | * | 1483 | * |
1484 | * PARAMETER | 1484 | * PARAMETER |
1485 | * erp already added default ERP | 1485 | * erp already added default ERP |
1486 | * | 1486 | * |
1487 | * RETURN VALUES | 1487 | * RETURN VALUES |
1488 | * erp new erp_head - pointer to new ERP | 1488 | * erp new erp_head - pointer to new ERP |
1489 | */ | 1489 | */ |
@@ -1527,11 +1527,11 @@ dasd_3990_erp_file_prot(struct dasd_ccw_req * erp) | |||
1527 | } /* end dasd_3990_erp_file_prot */ | 1527 | } /* end dasd_3990_erp_file_prot */ |
1528 | 1528 | ||
1529 | /* | 1529 | /* |
1530 | * DASD_3990_ERP_INSPECT_24 | 1530 | * DASD_3990_ERP_INSPECT_24 |
1531 | * | 1531 | * |
1532 | * DESCRIPTION | 1532 | * DESCRIPTION |
1533 | * Does a detailed inspection of the 24 byte sense data | 1533 | * Does a detailed inspection of the 24 byte sense data |
1534 | * and sets up a related error recovery action. | 1534 | * and sets up a related error recovery action. |
1535 | * | 1535 | * |
1536 | * PARAMETER | 1536 | * PARAMETER |
1537 | * sense sense data of the actual error | 1537 | * sense sense data of the actual error |
@@ -1602,13 +1602,13 @@ dasd_3990_erp_inspect_24(struct dasd_ccw_req * erp, char *sense) | |||
1602 | } /* END dasd_3990_erp_inspect_24 */ | 1602 | } /* END dasd_3990_erp_inspect_24 */ |
1603 | 1603 | ||
1604 | /* | 1604 | /* |
1605 | ***************************************************************************** | 1605 | ***************************************************************************** |
1606 | * 32 byte sense ERP functions (only) | 1606 | * 32 byte sense ERP functions (only) |
1607 | ***************************************************************************** | 1607 | ***************************************************************************** |
1608 | */ | 1608 | */ |
1609 | 1609 | ||
1610 | /* | 1610 | /* |
1611 | * DASD_3990_ERPACTION_10_32 | 1611 | * DASD_3990_ERPACTION_10_32 |
1612 | * | 1612 | * |
1613 | * DESCRIPTION | 1613 | * DESCRIPTION |
1614 | * Handles 32 byte 'Action 10' of Single Program Action Codes. | 1614 | * Handles 32 byte 'Action 10' of Single Program Action Codes. |
@@ -1616,7 +1616,7 @@ dasd_3990_erp_inspect_24(struct dasd_ccw_req * erp, char *sense) | |||
1616 | * | 1616 | * |
1617 | * PARAMETER | 1617 | * PARAMETER |
1618 | * erp current erp_head | 1618 | * erp current erp_head |
1619 | * sense current sense data | 1619 | * sense current sense data |
1620 | * RETURN VALUES | 1620 | * RETURN VALUES |
1621 | * erp modified erp_head | 1621 | * erp modified erp_head |
1622 | */ | 1622 | */ |
@@ -1640,18 +1640,18 @@ dasd_3990_erp_action_10_32(struct dasd_ccw_req * erp, char *sense) | |||
1640 | * | 1640 | * |
1641 | * DESCRIPTION | 1641 | * DESCRIPTION |
1642 | * Handles 32 byte 'Action 1B' of Single Program Action Codes. | 1642 | * Handles 32 byte 'Action 1B' of Single Program Action Codes. |
1643 | * A write operation could not be finished because of an unexpected | 1643 | * A write operation could not be finished because of an unexpected |
1644 | * condition. | 1644 | * condition. |
1645 | * The already created 'default erp' is used to get the link to | 1645 | * The already created 'default erp' is used to get the link to |
1646 | * the erp chain, but it can not be used for this recovery | 1646 | * the erp chain, but it can not be used for this recovery |
1647 | * action because it contains no DE/LO data space. | 1647 | * action because it contains no DE/LO data space. |
1648 | * | 1648 | * |
1649 | * PARAMETER | 1649 | * PARAMETER |
1650 | * default_erp already added default erp. | 1650 | * default_erp already added default erp. |
1651 | * sense current sense data | 1651 | * sense current sense data |
1652 | * | 1652 | * |
1653 | * RETURN VALUES | 1653 | * RETURN VALUES |
1654 | * erp new erp or | 1654 | * erp new erp or |
1655 | * default_erp in case of imprecise ending or error | 1655 | * default_erp in case of imprecise ending or error |
1656 | */ | 1656 | */ |
1657 | static struct dasd_ccw_req * | 1657 | static struct dasd_ccw_req * |
@@ -1789,16 +1789,16 @@ dasd_3990_erp_action_1B_32(struct dasd_ccw_req * default_erp, char *sense) | |||
1789 | * DASD_3990_UPDATE_1B | 1789 | * DASD_3990_UPDATE_1B |
1790 | * | 1790 | * |
1791 | * DESCRIPTION | 1791 | * DESCRIPTION |
1792 | * Handles the update to the 32 byte 'Action 1B' of Single Program | 1792 | * Handles the update to the 32 byte 'Action 1B' of Single Program |
1793 | * Action Codes in case the first action was not successful. | 1793 | * Action Codes in case the first action was not successful. |
1794 | * The already created 'previous_erp' is the currently not successful | 1794 | * The already created 'previous_erp' is the currently not successful |
1795 | * ERP. | 1795 | * ERP. |
1796 | * | 1796 | * |
1797 | * PARAMETER | 1797 | * PARAMETER |
1798 | * previous_erp already created previous erp. | 1798 | * previous_erp already created previous erp. |
1799 | * sense current sense data | 1799 | * sense current sense data |
1800 | * RETURN VALUES | 1800 | * RETURN VALUES |
1801 | * erp modified erp | 1801 | * erp modified erp |
1802 | */ | 1802 | */ |
1803 | static struct dasd_ccw_req * | 1803 | static struct dasd_ccw_req * |
1804 | dasd_3990_update_1B(struct dasd_ccw_req * previous_erp, char *sense) | 1804 | dasd_3990_update_1B(struct dasd_ccw_req * previous_erp, char *sense) |
@@ -1897,7 +1897,7 @@ dasd_3990_update_1B(struct dasd_ccw_req * previous_erp, char *sense) | |||
1897 | } /* end dasd_3990_update_1B */ | 1897 | } /* end dasd_3990_update_1B */ |
1898 | 1898 | ||
1899 | /* | 1899 | /* |
1900 | * DASD_3990_ERP_COMPOUND_RETRY | 1900 | * DASD_3990_ERP_COMPOUND_RETRY |
1901 | * | 1901 | * |
1902 | * DESCRIPTION | 1902 | * DESCRIPTION |
1903 | * Handles the compound ERP action retry code. | 1903 | * Handles the compound ERP action retry code. |
@@ -1943,7 +1943,7 @@ dasd_3990_erp_compound_retry(struct dasd_ccw_req * erp, char *sense) | |||
1943 | } /* end dasd_3990_erp_compound_retry */ | 1943 | } /* end dasd_3990_erp_compound_retry */ |
1944 | 1944 | ||
1945 | /* | 1945 | /* |
1946 | * DASD_3990_ERP_COMPOUND_PATH | 1946 | * DASD_3990_ERP_COMPOUND_PATH |
1947 | * | 1947 | * |
1948 | * DESCRIPTION | 1948 | * DESCRIPTION |
1949 | * Handles the compound ERP action for retry on alternate | 1949 | * Handles the compound ERP action for retry on alternate |
@@ -1965,7 +1965,7 @@ dasd_3990_erp_compound_path(struct dasd_ccw_req * erp, char *sense) | |||
1965 | dasd_3990_erp_alternate_path(erp); | 1965 | dasd_3990_erp_alternate_path(erp); |
1966 | 1966 | ||
1967 | if (erp->status == DASD_CQR_FAILED) { | 1967 | if (erp->status == DASD_CQR_FAILED) { |
1968 | /* reset the lpm and the status to be able to | 1968 | /* reset the lpm and the status to be able to |
1969 | * try further actions. */ | 1969 | * try further actions. */ |
1970 | 1970 | ||
1971 | erp->lpm = 0; | 1971 | erp->lpm = 0; |
@@ -1980,7 +1980,7 @@ dasd_3990_erp_compound_path(struct dasd_ccw_req * erp, char *sense) | |||
1980 | } /* end dasd_3990_erp_compound_path */ | 1980 | } /* end dasd_3990_erp_compound_path */ |
1981 | 1981 | ||
1982 | /* | 1982 | /* |
1983 | * DASD_3990_ERP_COMPOUND_CODE | 1983 | * DASD_3990_ERP_COMPOUND_CODE |
1984 | * | 1984 | * |
1985 | * DESCRIPTION | 1985 | * DESCRIPTION |
1986 | * Handles the compound ERP action for retry code. | 1986 | * Handles the compound ERP action for retry code. |
@@ -2001,18 +2001,18 @@ dasd_3990_erp_compound_code(struct dasd_ccw_req * erp, char *sense) | |||
2001 | 2001 | ||
2002 | switch (sense[28]) { | 2002 | switch (sense[28]) { |
2003 | case 0x17: | 2003 | case 0x17: |
2004 | /* issue a Diagnostic Control command with an | 2004 | /* issue a Diagnostic Control command with an |
2005 | * Inhibit Write subcommand and controler modifier */ | 2005 | * Inhibit Write subcommand and controler modifier */ |
2006 | erp = dasd_3990_erp_DCTL(erp, 0x20); | 2006 | erp = dasd_3990_erp_DCTL(erp, 0x20); |
2007 | break; | 2007 | break; |
2008 | 2008 | ||
2009 | case 0x25: | 2009 | case 0x25: |
2010 | /* wait for 5 seconds and retry again */ | 2010 | /* wait for 5 seconds and retry again */ |
2011 | erp->retries = 1; | 2011 | erp->retries = 1; |
2012 | 2012 | ||
2013 | dasd_3990_erp_block_queue (erp, 5*HZ); | 2013 | dasd_3990_erp_block_queue (erp, 5*HZ); |
2014 | break; | 2014 | break; |
2015 | 2015 | ||
2016 | default: | 2016 | default: |
2017 | /* should not happen - continue */ | 2017 | /* should not happen - continue */ |
2018 | break; | 2018 | break; |
@@ -2026,7 +2026,7 @@ dasd_3990_erp_compound_code(struct dasd_ccw_req * erp, char *sense) | |||
2026 | } /* end dasd_3990_erp_compound_code */ | 2026 | } /* end dasd_3990_erp_compound_code */ |
2027 | 2027 | ||
2028 | /* | 2028 | /* |
2029 | * DASD_3990_ERP_COMPOUND_CONFIG | 2029 | * DASD_3990_ERP_COMPOUND_CONFIG |
2030 | * | 2030 | * |
2031 | * DESCRIPTION | 2031 | * DESCRIPTION |
2032 | * Handles the compound ERP action for configruation | 2032 | * Handles the compound ERP action for configruation |
@@ -2063,10 +2063,10 @@ dasd_3990_erp_compound_config(struct dasd_ccw_req * erp, char *sense) | |||
2063 | } /* end dasd_3990_erp_compound_config */ | 2063 | } /* end dasd_3990_erp_compound_config */ |
2064 | 2064 | ||
2065 | /* | 2065 | /* |
2066 | * DASD_3990_ERP_COMPOUND | 2066 | * DASD_3990_ERP_COMPOUND |
2067 | * | 2067 | * |
2068 | * DESCRIPTION | 2068 | * DESCRIPTION |
2069 | * Does the further compound program action if | 2069 | * Does the further compound program action if |
2070 | * compound retry was not successful. | 2070 | * compound retry was not successful. |
2071 | * | 2071 | * |
2072 | * PARAMETER | 2072 | * PARAMETER |
@@ -2110,11 +2110,11 @@ dasd_3990_erp_compound(struct dasd_ccw_req * erp, char *sense) | |||
2110 | } /* end dasd_3990_erp_compound */ | 2110 | } /* end dasd_3990_erp_compound */ |
2111 | 2111 | ||
2112 | /* | 2112 | /* |
2113 | * DASD_3990_ERP_INSPECT_32 | 2113 | * DASD_3990_ERP_INSPECT_32 |
2114 | * | 2114 | * |
2115 | * DESCRIPTION | 2115 | * DESCRIPTION |
2116 | * Does a detailed inspection of the 32 byte sense data | 2116 | * Does a detailed inspection of the 32 byte sense data |
2117 | * and sets up a related error recovery action. | 2117 | * and sets up a related error recovery action. |
2118 | * | 2118 | * |
2119 | * PARAMETER | 2119 | * PARAMETER |
2120 | * sense sense data of the actual error | 2120 | * sense sense data of the actual error |
@@ -2228,9 +2228,9 @@ dasd_3990_erp_inspect_32(struct dasd_ccw_req * erp, char *sense) | |||
2228 | } /* end dasd_3990_erp_inspect_32 */ | 2228 | } /* end dasd_3990_erp_inspect_32 */ |
2229 | 2229 | ||
2230 | /* | 2230 | /* |
2231 | ***************************************************************************** | 2231 | ***************************************************************************** |
2232 | * main ERP control fuctions (24 and 32 byte sense) | 2232 | * main ERP control fuctions (24 and 32 byte sense) |
2233 | ***************************************************************************** | 2233 | ***************************************************************************** |
2234 | */ | 2234 | */ |
2235 | 2235 | ||
2236 | /* | 2236 | /* |
@@ -2243,7 +2243,7 @@ dasd_3990_erp_inspect_32(struct dasd_ccw_req * erp, char *sense) | |||
2243 | * PARAMETER | 2243 | * PARAMETER |
2244 | * erp pointer to the currently created default ERP | 2244 | * erp pointer to the currently created default ERP |
2245 | * RETURN VALUES | 2245 | * RETURN VALUES |
2246 | * erp_new contens was possibly modified | 2246 | * erp_new contens was possibly modified |
2247 | */ | 2247 | */ |
2248 | static struct dasd_ccw_req * | 2248 | static struct dasd_ccw_req * |
2249 | dasd_3990_erp_inspect(struct dasd_ccw_req * erp) | 2249 | dasd_3990_erp_inspect(struct dasd_ccw_req * erp) |
@@ -2272,14 +2272,14 @@ dasd_3990_erp_inspect(struct dasd_ccw_req * erp) | |||
2272 | 2272 | ||
2273 | /* | 2273 | /* |
2274 | * DASD_3990_ERP_ADD_ERP | 2274 | * DASD_3990_ERP_ADD_ERP |
2275 | * | 2275 | * |
2276 | * DESCRIPTION | 2276 | * DESCRIPTION |
2277 | * This funtion adds an additional request block (ERP) to the head of | 2277 | * This funtion adds an additional request block (ERP) to the head of |
2278 | * the given cqr (or erp). | 2278 | * the given cqr (or erp). |
2279 | * This erp is initialized as an default erp (retry TIC) | 2279 | * This erp is initialized as an default erp (retry TIC) |
2280 | * | 2280 | * |
2281 | * PARAMETER | 2281 | * PARAMETER |
2282 | * cqr head of the current ERP-chain (or single cqr if | 2282 | * cqr head of the current ERP-chain (or single cqr if |
2283 | * first error) | 2283 | * first error) |
2284 | * RETURN VALUES | 2284 | * RETURN VALUES |
2285 | * erp pointer to new ERP-chain head | 2285 | * erp pointer to new ERP-chain head |
@@ -2332,15 +2332,15 @@ dasd_3990_erp_add_erp(struct dasd_ccw_req * cqr) | |||
2332 | } | 2332 | } |
2333 | 2333 | ||
2334 | /* | 2334 | /* |
2335 | * DASD_3990_ERP_ADDITIONAL_ERP | 2335 | * DASD_3990_ERP_ADDITIONAL_ERP |
2336 | * | 2336 | * |
2337 | * DESCRIPTION | 2337 | * DESCRIPTION |
2338 | * An additional ERP is needed to handle the current error. | 2338 | * An additional ERP is needed to handle the current error. |
2339 | * Add ERP to the head of the ERP-chain containing the ERP processing | 2339 | * Add ERP to the head of the ERP-chain containing the ERP processing |
2340 | * determined based on the sense data. | 2340 | * determined based on the sense data. |
2341 | * | 2341 | * |
2342 | * PARAMETER | 2342 | * PARAMETER |
2343 | * cqr head of the current ERP-chain (or single cqr if | 2343 | * cqr head of the current ERP-chain (or single cqr if |
2344 | * first error) | 2344 | * first error) |
2345 | * | 2345 | * |
2346 | * RETURN VALUES | 2346 | * RETURN VALUES |
@@ -2376,7 +2376,7 @@ dasd_3990_erp_additional_erp(struct dasd_ccw_req * cqr) | |||
2376 | * 24 byte sense byte 25 and 27 is set as well. | 2376 | * 24 byte sense byte 25 and 27 is set as well. |
2377 | * | 2377 | * |
2378 | * PARAMETER | 2378 | * PARAMETER |
2379 | * cqr1 first cqr, which will be compared with the | 2379 | * cqr1 first cqr, which will be compared with the |
2380 | * cqr2 second cqr. | 2380 | * cqr2 second cqr. |
2381 | * | 2381 | * |
2382 | * RETURN VALUES | 2382 | * RETURN VALUES |
@@ -2415,7 +2415,7 @@ dasd_3990_erp_error_match(struct dasd_ccw_req *cqr1, struct dasd_ccw_req *cqr2) | |||
2415 | * cqr failed cqr (either original cqr or already an erp) | 2415 | * cqr failed cqr (either original cqr or already an erp) |
2416 | * | 2416 | * |
2417 | * RETURN VALUES | 2417 | * RETURN VALUES |
2418 | * erp erp-pointer to the already defined error | 2418 | * erp erp-pointer to the already defined error |
2419 | * recovery procedure OR | 2419 | * recovery procedure OR |
2420 | * NULL if a 'new' error occurred. | 2420 | * NULL if a 'new' error occurred. |
2421 | */ | 2421 | */ |
@@ -2451,10 +2451,10 @@ dasd_3990_erp_in_erp(struct dasd_ccw_req *cqr) | |||
2451 | * DASD_3990_ERP_FURTHER_ERP (24 & 32 byte sense) | 2451 | * DASD_3990_ERP_FURTHER_ERP (24 & 32 byte sense) |
2452 | * | 2452 | * |
2453 | * DESCRIPTION | 2453 | * DESCRIPTION |
2454 | * No retry is left for the current ERP. Check what has to be done | 2454 | * No retry is left for the current ERP. Check what has to be done |
2455 | * with the ERP. | 2455 | * with the ERP. |
2456 | * - do further defined ERP action or | 2456 | * - do further defined ERP action or |
2457 | * - wait for interrupt or | 2457 | * - wait for interrupt or |
2458 | * - exit with permanent error | 2458 | * - exit with permanent error |
2459 | * | 2459 | * |
2460 | * PARAMETER | 2460 | * PARAMETER |
@@ -2485,7 +2485,7 @@ dasd_3990_erp_further_erp(struct dasd_ccw_req *erp) | |||
2485 | 2485 | ||
2486 | if (!(sense[2] & DASD_SENSE_BIT_0)) { | 2486 | if (!(sense[2] & DASD_SENSE_BIT_0)) { |
2487 | 2487 | ||
2488 | /* issue a Diagnostic Control command with an | 2488 | /* issue a Diagnostic Control command with an |
2489 | * Inhibit Write subcommand */ | 2489 | * Inhibit Write subcommand */ |
2490 | 2490 | ||
2491 | switch (sense[25]) { | 2491 | switch (sense[25]) { |
@@ -2535,14 +2535,14 @@ dasd_3990_erp_further_erp(struct dasd_ccw_req *erp) | |||
2535 | } /* end dasd_3990_erp_further_erp */ | 2535 | } /* end dasd_3990_erp_further_erp */ |
2536 | 2536 | ||
2537 | /* | 2537 | /* |
2538 | * DASD_3990_ERP_HANDLE_MATCH_ERP | 2538 | * DASD_3990_ERP_HANDLE_MATCH_ERP |
2539 | * | 2539 | * |
2540 | * DESCRIPTION | 2540 | * DESCRIPTION |
2541 | * An error occurred again and an ERP has been detected which is already | 2541 | * An error occurred again and an ERP has been detected which is already |
2542 | * used to handle this error (e.g. retries). | 2542 | * used to handle this error (e.g. retries). |
2543 | * All prior ERP's are asumed to be successful and therefore removed | 2543 | * All prior ERP's are asumed to be successful and therefore removed |
2544 | * from queue. | 2544 | * from queue. |
2545 | * If retry counter of matching erp is already 0, it is checked if further | 2545 | * If retry counter of matching erp is already 0, it is checked if further |
2546 | * action is needed (besides retry) or if the ERP has failed. | 2546 | * action is needed (besides retry) or if the ERP has failed. |
2547 | * | 2547 | * |
2548 | * PARAMETER | 2548 | * PARAMETER |
@@ -2631,7 +2631,7 @@ dasd_3990_erp_handle_match_erp(struct dasd_ccw_req *erp_head, | |||
2631 | * erp erp-pointer to the head of the ERP action chain. | 2631 | * erp erp-pointer to the head of the ERP action chain. |
2632 | * This means: | 2632 | * This means: |
2633 | * - either a ptr to an additional ERP cqr or | 2633 | * - either a ptr to an additional ERP cqr or |
2634 | * - the original given cqr (which's status might | 2634 | * - the original given cqr (which's status might |
2635 | * be modified) | 2635 | * be modified) |
2636 | */ | 2636 | */ |
2637 | struct dasd_ccw_req * | 2637 | struct dasd_ccw_req * |
@@ -2723,22 +2723,3 @@ dasd_3990_erp_action(struct dasd_ccw_req * cqr) | |||
2723 | return erp; | 2723 | return erp; |
2724 | 2724 | ||
2725 | } /* end dasd_3990_erp_action */ | 2725 | } /* end dasd_3990_erp_action */ |
2726 | |||
2727 | /* | ||
2728 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
2729 | * Emacs will notice this stuff at the end of the file and automatically | ||
2730 | * adjust the settings for this buffer only. This must remain at the end | ||
2731 | * of the file. | ||
2732 | * --------------------------------------------------------------------------- | ||
2733 | * Local variables: | ||
2734 | * c-indent-level: 4 | ||
2735 | * c-brace-imaginary-offset: 0 | ||
2736 | * c-brace-offset: -4 | ||
2737 | * c-argdecl-indent: 4 | ||
2738 | * c-label-offset: -4 | ||
2739 | * c-continued-statement-offset: 4 | ||
2740 | * c-continued-brace-offset: 0 | ||
2741 | * indent-tabs-mode: 1 | ||
2742 | * tab-width: 8 | ||
2743 | * End: | ||
2744 | */ | ||
diff --git a/drivers/s390/block/dasd_9336_erp.c b/drivers/s390/block/dasd_9336_erp.c index dc861446d056..6e082688475a 100644 --- a/drivers/s390/block/dasd_9336_erp.c +++ b/drivers/s390/block/dasd_9336_erp.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * File...........: linux/drivers/s390/block/dasd_9336_erp.c | 2 | * File...........: linux/drivers/s390/block/dasd_9336_erp.c |
3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> | 3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> |
4 | * Bugreports.to..: <Linux390@de.ibm.com> | 4 | * Bugreports.to..: <Linux390@de.ibm.com> |
@@ -12,10 +12,10 @@ | |||
12 | 12 | ||
13 | 13 | ||
14 | /* | 14 | /* |
15 | * DASD_9336_ERP_EXAMINE | 15 | * DASD_9336_ERP_EXAMINE |
16 | * | 16 | * |
17 | * DESCRIPTION | 17 | * DESCRIPTION |
18 | * Checks only for fatal/no/recover error. | 18 | * Checks only for fatal/no/recover error. |
19 | * A detailed examination of the sense data is done later outside | 19 | * A detailed examination of the sense data is done later outside |
20 | * the interrupt handler. | 20 | * the interrupt handler. |
21 | * | 21 | * |
@@ -23,7 +23,7 @@ | |||
23 | * 'Chapter 7. 9336 Sense Data'. | 23 | * 'Chapter 7. 9336 Sense Data'. |
24 | * | 24 | * |
25 | * RETURN VALUES | 25 | * RETURN VALUES |
26 | * dasd_era_none no error | 26 | * dasd_era_none no error |
27 | * dasd_era_fatal for all fatal (unrecoverable errors) | 27 | * dasd_era_fatal for all fatal (unrecoverable errors) |
28 | * dasd_era_recover for all others. | 28 | * dasd_era_recover for all others. |
29 | */ | 29 | */ |
@@ -39,22 +39,3 @@ dasd_9336_erp_examine(struct dasd_ccw_req * cqr, struct irb * irb) | |||
39 | return dasd_era_recover; | 39 | return dasd_era_recover; |
40 | 40 | ||
41 | } /* END dasd_9336_erp_examine */ | 41 | } /* END dasd_9336_erp_examine */ |
42 | |||
43 | /* | ||
44 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
45 | * Emacs will notice this stuff at the end of the file and automatically | ||
46 | * adjust the settings for this buffer only. This must remain at the end | ||
47 | * of the file. | ||
48 | * --------------------------------------------------------------------------- | ||
49 | * Local variables: | ||
50 | * c-indent-level: 4 | ||
51 | * c-brace-imaginary-offset: 0 | ||
52 | * c-brace-offset: -4 | ||
53 | * c-argdecl-indent: 4 | ||
54 | * c-label-offset: -4 | ||
55 | * c-continued-statement-offset: 4 | ||
56 | * c-continued-brace-offset: 0 | ||
57 | * indent-tabs-mode: 1 | ||
58 | * tab-width: 8 | ||
59 | * End: | ||
60 | */ | ||
diff --git a/drivers/s390/block/dasd_9343_erp.c b/drivers/s390/block/dasd_9343_erp.c index 4a5b79569aaa..ddecb9808ed4 100644 --- a/drivers/s390/block/dasd_9343_erp.c +++ b/drivers/s390/block/dasd_9343_erp.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * File...........: linux/drivers/s390/block/dasd_9345_erp.c | 2 | * File...........: linux/drivers/s390/block/dasd_9345_erp.c |
3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> | 3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> |
4 | * Bugreports.to..: <Linux390@de.ibm.com> | 4 | * Bugreports.to..: <Linux390@de.ibm.com> |
diff --git a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c index 216bc4fba199..9e9ae7179602 100644 --- a/drivers/s390/block/dasd_devmap.c +++ b/drivers/s390/block/dasd_devmap.c | |||
@@ -27,7 +27,7 @@ | |||
27 | #include "dasd_int.h" | 27 | #include "dasd_int.h" |
28 | 28 | ||
29 | kmem_cache_t *dasd_page_cache; | 29 | kmem_cache_t *dasd_page_cache; |
30 | EXPORT_SYMBOL(dasd_page_cache); | 30 | EXPORT_SYMBOL_GPL(dasd_page_cache); |
31 | 31 | ||
32 | /* | 32 | /* |
33 | * dasd_devmap_t is used to store the features and the relation | 33 | * dasd_devmap_t is used to store the features and the relation |
@@ -49,6 +49,20 @@ struct dasd_devmap { | |||
49 | }; | 49 | }; |
50 | 50 | ||
51 | /* | 51 | /* |
52 | * dasd_servermap is used to store the server_id of all storage servers | ||
53 | * accessed by DASD device driver. | ||
54 | */ | ||
55 | struct dasd_servermap { | ||
56 | struct list_head list; | ||
57 | struct server_id { | ||
58 | char vendor[4]; | ||
59 | char serial[15]; | ||
60 | } sid; | ||
61 | }; | ||
62 | |||
63 | static struct list_head dasd_serverlist; | ||
64 | |||
65 | /* | ||
52 | * Parameter parsing functions for dasd= parameter. The syntax is: | 66 | * Parameter parsing functions for dasd= parameter. The syntax is: |
53 | * <devno> : (0x)?[0-9a-fA-F]+ | 67 | * <devno> : (0x)?[0-9a-fA-F]+ |
54 | * <busid> : [0-0a-f]\.[0-9a-f]\.(0x)?[0-9a-fA-F]+ | 68 | * <busid> : [0-0a-f]\.[0-9a-f]\.(0x)?[0-9a-fA-F]+ |
@@ -64,6 +78,8 @@ struct dasd_devmap { | |||
64 | 78 | ||
65 | int dasd_probeonly = 0; /* is true, when probeonly mode is active */ | 79 | int dasd_probeonly = 0; /* is true, when probeonly mode is active */ |
66 | int dasd_autodetect = 0; /* is true, when autodetection is active */ | 80 | int dasd_autodetect = 0; /* is true, when autodetection is active */ |
81 | int dasd_nopav = 0; /* is true, when PAV is disabled */ | ||
82 | EXPORT_SYMBOL_GPL(dasd_nopav); | ||
67 | 83 | ||
68 | /* | 84 | /* |
69 | * char *dasd[] is intended to hold the ranges supplied by the dasd= statement | 85 | * char *dasd[] is intended to hold the ranges supplied by the dasd= statement |
@@ -123,7 +139,7 @@ static inline int | |||
123 | dasd_busid(char **str, int *id0, int *id1, int *devno) | 139 | dasd_busid(char **str, int *id0, int *id1, int *devno) |
124 | { | 140 | { |
125 | int val, old_style; | 141 | int val, old_style; |
126 | 142 | ||
127 | /* check for leading '0x' */ | 143 | /* check for leading '0x' */ |
128 | old_style = 0; | 144 | old_style = 0; |
129 | if ((*str)[0] == '0' && (*str)[1] == 'x') { | 145 | if ((*str)[0] == '0' && (*str)[1] == 'x') { |
@@ -179,7 +195,7 @@ dasd_feature_list(char *str, char **endp) | |||
179 | features = 0; | 195 | features = 0; |
180 | 196 | ||
181 | while (1) { | 197 | while (1) { |
182 | for (len = 0; | 198 | for (len = 0; |
183 | str[len] && str[len] != ':' && str[len] != ')'; len++); | 199 | str[len] && str[len] != ':' && str[len] != ')'; len++); |
184 | if (len == 2 && !strncmp(str, "ro", 2)) | 200 | if (len == 2 && !strncmp(str, "ro", 2)) |
185 | features |= DASD_FEATURE_READONLY; | 201 | features |= DASD_FEATURE_READONLY; |
@@ -228,19 +244,24 @@ dasd_parse_keyword( char *parsestring ) { | |||
228 | length = strlen(parsestring); | 244 | length = strlen(parsestring); |
229 | residual_str = parsestring + length; | 245 | residual_str = parsestring + length; |
230 | } | 246 | } |
231 | if (strncmp ("autodetect", parsestring, length) == 0) { | 247 | if (strncmp("autodetect", parsestring, length) == 0) { |
232 | dasd_autodetect = 1; | 248 | dasd_autodetect = 1; |
233 | MESSAGE (KERN_INFO, "%s", | 249 | MESSAGE (KERN_INFO, "%s", |
234 | "turning to autodetection mode"); | 250 | "turning to autodetection mode"); |
235 | return residual_str; | 251 | return residual_str; |
236 | } | 252 | } |
237 | if (strncmp ("probeonly", parsestring, length) == 0) { | 253 | if (strncmp("probeonly", parsestring, length) == 0) { |
238 | dasd_probeonly = 1; | 254 | dasd_probeonly = 1; |
239 | MESSAGE(KERN_INFO, "%s", | 255 | MESSAGE(KERN_INFO, "%s", |
240 | "turning to probeonly mode"); | 256 | "turning to probeonly mode"); |
241 | return residual_str; | 257 | return residual_str; |
242 | } | 258 | } |
243 | if (strncmp ("fixedbuffers", parsestring, length) == 0) { | 259 | if (strncmp("nopav", parsestring, length) == 0) { |
260 | dasd_nopav = 1; | ||
261 | MESSAGE(KERN_INFO, "%s", "disable PAV mode"); | ||
262 | return residual_str; | ||
263 | } | ||
264 | if (strncmp("fixedbuffers", parsestring, length) == 0) { | ||
244 | if (dasd_page_cache) | 265 | if (dasd_page_cache) |
245 | return residual_str; | 266 | return residual_str; |
246 | dasd_page_cache = | 267 | dasd_page_cache = |
@@ -294,6 +315,8 @@ dasd_parse_range( char *parsestring ) { | |||
294 | features = dasd_feature_list(str, &str); | 315 | features = dasd_feature_list(str, &str); |
295 | if (features < 0) | 316 | if (features < 0) |
296 | return ERR_PTR(-EINVAL); | 317 | return ERR_PTR(-EINVAL); |
318 | /* each device in dasd= parameter should be set initially online */ | ||
319 | features |= DASD_FEATURE_INITIAL_ONLINE; | ||
297 | while (from <= to) { | 320 | while (from <= to) { |
298 | sprintf(bus_id, "%01x.%01x.%04x", | 321 | sprintf(bus_id, "%01x.%01x.%04x", |
299 | from_id0, from_id1, from++); | 322 | from_id0, from_id1, from++); |
@@ -359,7 +382,7 @@ dasd_parse(void) | |||
359 | * Add a devmap for the device specified by busid. It is possible that | 382 | * Add a devmap for the device specified by busid. It is possible that |
360 | * the devmap already exists (dasd= parameter). The order of the devices | 383 | * the devmap already exists (dasd= parameter). The order of the devices |
361 | * added through this function will define the kdevs for the individual | 384 | * added through this function will define the kdevs for the individual |
362 | * devices. | 385 | * devices. |
363 | */ | 386 | */ |
364 | static struct dasd_devmap * | 387 | static struct dasd_devmap * |
365 | dasd_add_busid(char *bus_id, int features) | 388 | dasd_add_busid(char *bus_id, int features) |
@@ -368,7 +391,7 @@ dasd_add_busid(char *bus_id, int features) | |||
368 | int hash; | 391 | int hash; |
369 | 392 | ||
370 | new = (struct dasd_devmap *) | 393 | new = (struct dasd_devmap *) |
371 | kmalloc(sizeof(struct dasd_devmap), GFP_KERNEL); | 394 | kzalloc(sizeof(struct dasd_devmap), GFP_KERNEL); |
372 | if (!new) | 395 | if (!new) |
373 | return ERR_PTR(-ENOMEM); | 396 | return ERR_PTR(-ENOMEM); |
374 | spin_lock(&dasd_devmap_lock); | 397 | spin_lock(&dasd_devmap_lock); |
@@ -630,7 +653,8 @@ dasd_ro_show(struct device *dev, struct device_attribute *attr, char *buf) | |||
630 | } | 653 | } |
631 | 654 | ||
632 | static ssize_t | 655 | static ssize_t |
633 | dasd_ro_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | 656 | dasd_ro_store(struct device *dev, struct device_attribute *attr, |
657 | const char *buf, size_t count) | ||
634 | { | 658 | { |
635 | struct dasd_devmap *devmap; | 659 | struct dasd_devmap *devmap; |
636 | int ro_flag; | 660 | int ro_flag; |
@@ -658,7 +682,7 @@ static DEVICE_ATTR(readonly, 0644, dasd_ro_show, dasd_ro_store); | |||
658 | * use_diag controls whether the driver should use diag rather than ssch | 682 | * use_diag controls whether the driver should use diag rather than ssch |
659 | * to talk to the device | 683 | * to talk to the device |
660 | */ | 684 | */ |
661 | static ssize_t | 685 | static ssize_t |
662 | dasd_use_diag_show(struct device *dev, struct device_attribute *attr, char *buf) | 686 | dasd_use_diag_show(struct device *dev, struct device_attribute *attr, char *buf) |
663 | { | 687 | { |
664 | struct dasd_devmap *devmap; | 688 | struct dasd_devmap *devmap; |
@@ -673,7 +697,8 @@ dasd_use_diag_show(struct device *dev, struct device_attribute *attr, char *buf) | |||
673 | } | 697 | } |
674 | 698 | ||
675 | static ssize_t | 699 | static ssize_t |
676 | dasd_use_diag_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | 700 | dasd_use_diag_store(struct device *dev, struct device_attribute *attr, |
701 | const char *buf, size_t count) | ||
677 | { | 702 | { |
678 | struct dasd_devmap *devmap; | 703 | struct dasd_devmap *devmap; |
679 | ssize_t rc; | 704 | ssize_t rc; |
@@ -697,11 +722,11 @@ dasd_use_diag_store(struct device *dev, struct device_attribute *attr, const cha | |||
697 | return rc; | 722 | return rc; |
698 | } | 723 | } |
699 | 724 | ||
700 | static | 725 | static DEVICE_ATTR(use_diag, 0644, dasd_use_diag_show, dasd_use_diag_store); |
701 | DEVICE_ATTR(use_diag, 0644, dasd_use_diag_show, dasd_use_diag_store); | ||
702 | 726 | ||
703 | static ssize_t | 727 | static ssize_t |
704 | dasd_discipline_show(struct device *dev, struct device_attribute *attr, char *buf) | 728 | dasd_discipline_show(struct device *dev, struct device_attribute *attr, |
729 | char *buf) | ||
705 | { | 730 | { |
706 | struct dasd_devmap *devmap; | 731 | struct dasd_devmap *devmap; |
707 | char *dname; | 732 | char *dname; |
@@ -834,6 +859,38 @@ static struct attribute_group dasd_attr_group = { | |||
834 | .attrs = dasd_attrs, | 859 | .attrs = dasd_attrs, |
835 | }; | 860 | }; |
836 | 861 | ||
862 | /* | ||
863 | * Check if the related storage server is already contained in the | ||
864 | * dasd_serverlist. If server is not contained, create new entry. | ||
865 | * Return 0 if server was already in serverlist, | ||
866 | * 1 if the server was added successfully | ||
867 | * <0 in case of error. | ||
868 | */ | ||
869 | static int | ||
870 | dasd_add_server(struct dasd_uid *uid) | ||
871 | { | ||
872 | struct dasd_servermap *new, *tmp; | ||
873 | |||
874 | /* check if server is already contained */ | ||
875 | list_for_each_entry(tmp, &dasd_serverlist, list) | ||
876 | // normale cmp? | ||
877 | if (strncmp(tmp->sid.vendor, uid->vendor, | ||
878 | sizeof(tmp->sid.vendor)) == 0 | ||
879 | && strncmp(tmp->sid.serial, uid->serial, | ||
880 | sizeof(tmp->sid.serial)) == 0) | ||
881 | return 0; | ||
882 | |||
883 | new = (struct dasd_servermap *) | ||
884 | kzalloc(sizeof(struct dasd_servermap), GFP_KERNEL); | ||
885 | if (!new) | ||
886 | return -ENOMEM; | ||
887 | |||
888 | strncpy(new->sid.vendor, uid->vendor, sizeof(new->sid.vendor)); | ||
889 | strncpy(new->sid.serial, uid->serial, sizeof(new->sid.serial)); | ||
890 | list_add(&new->list, &dasd_serverlist); | ||
891 | return 1; | ||
892 | } | ||
893 | |||
837 | 894 | ||
838 | /* | 895 | /* |
839 | * Return copy of the device unique identifier. | 896 | * Return copy of the device unique identifier. |
@@ -854,21 +911,26 @@ dasd_get_uid(struct ccw_device *cdev, struct dasd_uid *uid) | |||
854 | 911 | ||
855 | /* | 912 | /* |
856 | * Register the given device unique identifier into devmap struct. | 913 | * Register the given device unique identifier into devmap struct. |
914 | * Return 0 if server was already in serverlist, | ||
915 | * 1 if the server was added successful | ||
916 | * <0 in case of error. | ||
857 | */ | 917 | */ |
858 | int | 918 | int |
859 | dasd_set_uid(struct ccw_device *cdev, struct dasd_uid *uid) | 919 | dasd_set_uid(struct ccw_device *cdev, struct dasd_uid *uid) |
860 | { | 920 | { |
861 | struct dasd_devmap *devmap; | 921 | struct dasd_devmap *devmap; |
922 | int rc; | ||
862 | 923 | ||
863 | devmap = dasd_find_busid(cdev->dev.bus_id); | 924 | devmap = dasd_find_busid(cdev->dev.bus_id); |
864 | if (IS_ERR(devmap)) | 925 | if (IS_ERR(devmap)) |
865 | return PTR_ERR(devmap); | 926 | return PTR_ERR(devmap); |
866 | spin_lock(&dasd_devmap_lock); | 927 | spin_lock(&dasd_devmap_lock); |
867 | devmap->uid = *uid; | 928 | devmap->uid = *uid; |
929 | rc = dasd_add_server(uid); | ||
868 | spin_unlock(&dasd_devmap_lock); | 930 | spin_unlock(&dasd_devmap_lock); |
869 | return 0; | 931 | return rc; |
870 | } | 932 | } |
871 | EXPORT_SYMBOL(dasd_set_uid); | 933 | EXPORT_SYMBOL_GPL(dasd_set_uid); |
872 | 934 | ||
873 | /* | 935 | /* |
874 | * Return value of the specified feature. | 936 | * Return value of the specified feature. |
@@ -880,7 +942,7 @@ dasd_get_feature(struct ccw_device *cdev, int feature) | |||
880 | 942 | ||
881 | devmap = dasd_find_busid(cdev->dev.bus_id); | 943 | devmap = dasd_find_busid(cdev->dev.bus_id); |
882 | if (IS_ERR(devmap)) | 944 | if (IS_ERR(devmap)) |
883 | return (int) PTR_ERR(devmap); | 945 | return PTR_ERR(devmap); |
884 | 946 | ||
885 | return ((devmap->features & feature) != 0); | 947 | return ((devmap->features & feature) != 0); |
886 | } | 948 | } |
@@ -896,7 +958,7 @@ dasd_set_feature(struct ccw_device *cdev, int feature, int flag) | |||
896 | 958 | ||
897 | devmap = dasd_find_busid(cdev->dev.bus_id); | 959 | devmap = dasd_find_busid(cdev->dev.bus_id); |
898 | if (IS_ERR(devmap)) | 960 | if (IS_ERR(devmap)) |
899 | return (int) PTR_ERR(devmap); | 961 | return PTR_ERR(devmap); |
900 | 962 | ||
901 | spin_lock(&dasd_devmap_lock); | 963 | spin_lock(&dasd_devmap_lock); |
902 | if (flag) | 964 | if (flag) |
@@ -932,8 +994,10 @@ dasd_devmap_init(void) | |||
932 | dasd_max_devindex = 0; | 994 | dasd_max_devindex = 0; |
933 | for (i = 0; i < 256; i++) | 995 | for (i = 0; i < 256; i++) |
934 | INIT_LIST_HEAD(&dasd_hashlists[i]); | 996 | INIT_LIST_HEAD(&dasd_hashlists[i]); |
935 | return 0; | ||
936 | 997 | ||
998 | /* Initialize servermap structure. */ | ||
999 | INIT_LIST_HEAD(&dasd_serverlist); | ||
1000 | return 0; | ||
937 | } | 1001 | } |
938 | 1002 | ||
939 | void | 1003 | void |
diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c index 3f9d704d2657..4002f6c1c1b3 100644 --- a/drivers/s390/block/dasd_diag.c +++ b/drivers/s390/block/dasd_diag.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * File...........: linux/drivers/s390/block/dasd_diag.c | 2 | * File...........: linux/drivers/s390/block/dasd_diag.c |
3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> | 3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> |
4 | * Based on.......: linux/drivers/s390/block/mdisk.c | 4 | * Based on.......: linux/drivers/s390/block/mdisk.c |
@@ -336,7 +336,7 @@ dasd_diag_check_device(struct dasd_device *device) | |||
336 | 336 | ||
337 | private = (struct dasd_diag_private *) device->private; | 337 | private = (struct dasd_diag_private *) device->private; |
338 | if (private == NULL) { | 338 | if (private == NULL) { |
339 | private = kmalloc(sizeof(struct dasd_diag_private),GFP_KERNEL); | 339 | private = kzalloc(sizeof(struct dasd_diag_private),GFP_KERNEL); |
340 | if (private == NULL) { | 340 | if (private == NULL) { |
341 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 341 | DEV_MESSAGE(KERN_WARNING, device, "%s", |
342 | "memory allocation failed for private data"); | 342 | "memory allocation failed for private data"); |
@@ -527,7 +527,7 @@ dasd_diag_build_cp(struct dasd_device * device, struct request *req) | |||
527 | datasize, device); | 527 | datasize, device); |
528 | if (IS_ERR(cqr)) | 528 | if (IS_ERR(cqr)) |
529 | return cqr; | 529 | return cqr; |
530 | 530 | ||
531 | dreq = (struct dasd_diag_req *) cqr->data; | 531 | dreq = (struct dasd_diag_req *) cqr->data; |
532 | dreq->block_count = count; | 532 | dreq->block_count = count; |
533 | dbio = dreq->bio; | 533 | dbio = dreq->bio; |
diff --git a/drivers/s390/block/dasd_diag.h b/drivers/s390/block/dasd_diag.h index 38a4e55f8953..b8c78267ff3e 100644 --- a/drivers/s390/block/dasd_diag.h +++ b/drivers/s390/block/dasd_diag.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * File...........: linux/drivers/s390/block/dasd_diag.h | 2 | * File...........: linux/drivers/s390/block/dasd_diag.h |
3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> | 3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> |
4 | * Based on.......: linux/drivers/s390/block/mdisk.h | 4 | * Based on.......: linux/drivers/s390/block/mdisk.h |
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 7d5a6cee4bd8..0dfab30e8089 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * File...........: linux/drivers/s390/block/dasd_eckd.c | 2 | * File...........: linux/drivers/s390/block/dasd_eckd.c |
3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> | 3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> |
4 | * Horst Hummel <Horst.Hummel@de.ibm.com> | 4 | * Horst Hummel <Horst.Hummel@de.ibm.com> |
5 | * Carsten Otte <Cotte@de.ibm.com> | 5 | * Carsten Otte <Cotte@de.ibm.com> |
6 | * Martin Schwidefsky <schwidefsky@de.ibm.com> | 6 | * Martin Schwidefsky <schwidefsky@de.ibm.com> |
7 | * Bugreports.to..: <Linux390@de.ibm.com> | 7 | * Bugreports.to..: <Linux390@de.ibm.com> |
@@ -24,6 +24,7 @@ | |||
24 | #include <asm/io.h> | 24 | #include <asm/io.h> |
25 | #include <asm/todclk.h> | 25 | #include <asm/todclk.h> |
26 | #include <asm/uaccess.h> | 26 | #include <asm/uaccess.h> |
27 | #include <asm/cio.h> | ||
27 | #include <asm/ccwdev.h> | 28 | #include <asm/ccwdev.h> |
28 | 29 | ||
29 | #include "dasd_int.h" | 30 | #include "dasd_int.h" |
@@ -89,17 +90,22 @@ dasd_eckd_probe (struct ccw_device *cdev) | |||
89 | { | 90 | { |
90 | int ret; | 91 | int ret; |
91 | 92 | ||
92 | ret = dasd_generic_probe (cdev, &dasd_eckd_discipline); | 93 | /* set ECKD specific ccw-device options */ |
93 | if (ret) | 94 | ret = ccw_device_set_options(cdev, CCWDEV_ALLOW_FORCE); |
95 | if (ret) { | ||
96 | printk(KERN_WARNING | ||
97 | "dasd_eckd_probe: could not set ccw-device options " | ||
98 | "for %s\n", cdev->dev.bus_id); | ||
94 | return ret; | 99 | return ret; |
95 | ccw_device_set_options(cdev, CCWDEV_DO_PATHGROUP | CCWDEV_ALLOW_FORCE); | 100 | } |
96 | return 0; | 101 | ret = dasd_generic_probe(cdev, &dasd_eckd_discipline); |
102 | return ret; | ||
97 | } | 103 | } |
98 | 104 | ||
99 | static int | 105 | static int |
100 | dasd_eckd_set_online(struct ccw_device *cdev) | 106 | dasd_eckd_set_online(struct ccw_device *cdev) |
101 | { | 107 | { |
102 | return dasd_generic_set_online (cdev, &dasd_eckd_discipline); | 108 | return dasd_generic_set_online(cdev, &dasd_eckd_discipline); |
103 | } | 109 | } |
104 | 110 | ||
105 | static struct ccw_driver dasd_eckd_driver = { | 111 | static struct ccw_driver dasd_eckd_driver = { |
@@ -210,14 +216,14 @@ check_XRC (struct ccw1 *de_ccw, | |||
210 | 216 | ||
211 | /* switch on System Time Stamp - needed for XRC Support */ | 217 | /* switch on System Time Stamp - needed for XRC Support */ |
212 | if (private->rdc_data.facilities.XRC_supported) { | 218 | if (private->rdc_data.facilities.XRC_supported) { |
213 | 219 | ||
214 | data->ga_extended |= 0x08; /* switch on 'Time Stamp Valid' */ | 220 | data->ga_extended |= 0x08; /* switch on 'Time Stamp Valid' */ |
215 | data->ga_extended |= 0x02; /* switch on 'Extended Parameter' */ | 221 | data->ga_extended |= 0x02; /* switch on 'Extended Parameter' */ |
216 | 222 | ||
217 | data->ep_sys_time = get_clock (); | 223 | data->ep_sys_time = get_clock (); |
218 | 224 | ||
219 | de_ccw->count = sizeof (struct DE_eckd_data); | 225 | de_ccw->count = sizeof (struct DE_eckd_data); |
220 | de_ccw->flags |= CCW_FLAG_SLI; | 226 | de_ccw->flags |= CCW_FLAG_SLI; |
221 | } | 227 | } |
222 | 228 | ||
223 | return; | 229 | return; |
@@ -296,8 +302,8 @@ define_extent(struct ccw1 * ccw, struct DE_eckd_data * data, int trk, | |||
296 | /* check for sequential prestage - enhance cylinder range */ | 302 | /* check for sequential prestage - enhance cylinder range */ |
297 | if (data->attributes.operation == DASD_SEQ_PRESTAGE || | 303 | if (data->attributes.operation == DASD_SEQ_PRESTAGE || |
298 | data->attributes.operation == DASD_SEQ_ACCESS) { | 304 | data->attributes.operation == DASD_SEQ_ACCESS) { |
299 | 305 | ||
300 | if (end.cyl + private->attrib.nr_cyl < geo.cyl) | 306 | if (end.cyl + private->attrib.nr_cyl < geo.cyl) |
301 | end.cyl += private->attrib.nr_cyl; | 307 | end.cyl += private->attrib.nr_cyl; |
302 | else | 308 | else |
303 | end.cyl = (geo.cyl - 1); | 309 | end.cyl = (geo.cyl - 1); |
@@ -317,7 +323,7 @@ locate_record(struct ccw1 *ccw, struct LO_eckd_data *data, int trk, | |||
317 | struct dasd_eckd_private *private; | 323 | struct dasd_eckd_private *private; |
318 | int sector; | 324 | int sector; |
319 | int dn, d; | 325 | int dn, d; |
320 | 326 | ||
321 | private = (struct dasd_eckd_private *) device->private; | 327 | private = (struct dasd_eckd_private *) device->private; |
322 | 328 | ||
323 | DBF_DEV_EVENT(DBF_INFO, device, | 329 | DBF_DEV_EVENT(DBF_INFO, device, |
@@ -541,6 +547,86 @@ dasd_eckd_read_conf(struct dasd_device *device) | |||
541 | } | 547 | } |
542 | 548 | ||
543 | /* | 549 | /* |
550 | * Build CP for Perform Subsystem Function - SSC. | ||
551 | */ | ||
552 | struct dasd_ccw_req * | ||
553 | dasd_eckd_build_psf_ssc(struct dasd_device *device) | ||
554 | { | ||
555 | struct dasd_ccw_req *cqr; | ||
556 | struct dasd_psf_ssc_data *psf_ssc_data; | ||
557 | struct ccw1 *ccw; | ||
558 | |||
559 | cqr = dasd_smalloc_request("ECKD", 1 /* PSF */ , | ||
560 | sizeof(struct dasd_psf_ssc_data), | ||
561 | device); | ||
562 | |||
563 | if (IS_ERR(cqr)) { | ||
564 | DEV_MESSAGE(KERN_WARNING, device, "%s", | ||
565 | "Could not allocate PSF-SSC request"); | ||
566 | return cqr; | ||
567 | } | ||
568 | psf_ssc_data = (struct dasd_psf_ssc_data *)cqr->data; | ||
569 | psf_ssc_data->order = PSF_ORDER_SSC; | ||
570 | psf_ssc_data->suborder = 0x08; | ||
571 | |||
572 | ccw = cqr->cpaddr; | ||
573 | ccw->cmd_code = DASD_ECKD_CCW_PSF; | ||
574 | ccw->cda = (__u32)(addr_t)psf_ssc_data; | ||
575 | ccw->count = 66; | ||
576 | |||
577 | cqr->device = device; | ||
578 | cqr->expires = 10*HZ; | ||
579 | cqr->buildclk = get_clock(); | ||
580 | cqr->status = DASD_CQR_FILLED; | ||
581 | return cqr; | ||
582 | } | ||
583 | |||
584 | /* | ||
585 | * Perform Subsystem Function. | ||
586 | * It is necessary to trigger CIO for channel revalidation since this | ||
587 | * call might change behaviour of DASD devices. | ||
588 | */ | ||
589 | static int | ||
590 | dasd_eckd_psf_ssc(struct dasd_device *device) | ||
591 | { | ||
592 | struct dasd_ccw_req *cqr; | ||
593 | int rc; | ||
594 | |||
595 | cqr = dasd_eckd_build_psf_ssc(device); | ||
596 | if (IS_ERR(cqr)) | ||
597 | return PTR_ERR(cqr); | ||
598 | |||
599 | rc = dasd_sleep_on(cqr); | ||
600 | if (!rc) | ||
601 | /* trigger CIO to reprobe devices */ | ||
602 | css_schedule_reprobe(); | ||
603 | dasd_sfree_request(cqr, cqr->device); | ||
604 | return rc; | ||
605 | } | ||
606 | |||
607 | /* | ||
608 | * Valide storage server of current device. | ||
609 | */ | ||
610 | static int | ||
611 | dasd_eckd_validate_server(struct dasd_device *device) | ||
612 | { | ||
613 | int rc; | ||
614 | |||
615 | /* Currently PAV is the only reason to 'validate' server on LPAR */ | ||
616 | if (dasd_nopav || MACHINE_IS_VM) | ||
617 | return 0; | ||
618 | |||
619 | rc = dasd_eckd_psf_ssc(device); | ||
620 | if (rc) | ||
621 | /* may be requested feature is not available on server, | ||
622 | * therefore just report error and go ahead */ | ||
623 | DEV_MESSAGE(KERN_INFO, device, | ||
624 | "Perform Subsystem Function returned rc=%d", rc); | ||
625 | /* RE-Read Configuration Data */ | ||
626 | return dasd_eckd_read_conf(device); | ||
627 | } | ||
628 | |||
629 | /* | ||
544 | * Check device characteristics. | 630 | * Check device characteristics. |
545 | * If the device is accessible using ECKD discipline, the device is enabled. | 631 | * If the device is accessible using ECKD discipline, the device is enabled. |
546 | */ | 632 | */ |
@@ -554,7 +640,7 @@ dasd_eckd_check_characteristics(struct dasd_device *device) | |||
554 | 640 | ||
555 | private = (struct dasd_eckd_private *) device->private; | 641 | private = (struct dasd_eckd_private *) device->private; |
556 | if (private == NULL) { | 642 | if (private == NULL) { |
557 | private = kmalloc(sizeof(struct dasd_eckd_private), | 643 | private = kzalloc(sizeof(struct dasd_eckd_private), |
558 | GFP_KERNEL | GFP_DMA); | 644 | GFP_KERNEL | GFP_DMA); |
559 | if (private == NULL) { | 645 | if (private == NULL) { |
560 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 646 | DEV_MESSAGE(KERN_WARNING, device, "%s", |
@@ -562,7 +648,6 @@ dasd_eckd_check_characteristics(struct dasd_device *device) | |||
562 | "data"); | 648 | "data"); |
563 | return -ENOMEM; | 649 | return -ENOMEM; |
564 | } | 650 | } |
565 | memset(private, 0, sizeof(struct dasd_eckd_private)); | ||
566 | device->private = (void *) private; | 651 | device->private = (void *) private; |
567 | } | 652 | } |
568 | /* Invalidate status of initial analysis. */ | 653 | /* Invalidate status of initial analysis. */ |
@@ -571,16 +656,29 @@ dasd_eckd_check_characteristics(struct dasd_device *device) | |||
571 | private->attrib.operation = DASD_NORMAL_CACHE; | 656 | private->attrib.operation = DASD_NORMAL_CACHE; |
572 | private->attrib.nr_cyl = 0; | 657 | private->attrib.nr_cyl = 0; |
573 | 658 | ||
659 | /* Read Configuration Data */ | ||
660 | rc = dasd_eckd_read_conf(device); | ||
661 | if (rc) | ||
662 | return rc; | ||
663 | |||
664 | /* Generate device unique id and register in devmap */ | ||
665 | rc = dasd_eckd_generate_uid(device, &uid); | ||
666 | if (rc) | ||
667 | return rc; | ||
668 | rc = dasd_set_uid(device->cdev, &uid); | ||
669 | if (rc == 1) /* new server found */ | ||
670 | rc = dasd_eckd_validate_server(device); | ||
671 | if (rc) | ||
672 | return rc; | ||
673 | |||
574 | /* Read Device Characteristics */ | 674 | /* Read Device Characteristics */ |
575 | rdc_data = (void *) &(private->rdc_data); | 675 | rdc_data = (void *) &(private->rdc_data); |
576 | memset(rdc_data, 0, sizeof(rdc_data)); | 676 | memset(rdc_data, 0, sizeof(rdc_data)); |
577 | rc = read_dev_chars(device->cdev, &rdc_data, 64); | 677 | rc = read_dev_chars(device->cdev, &rdc_data, 64); |
578 | if (rc) { | 678 | if (rc) |
579 | DEV_MESSAGE(KERN_WARNING, device, | 679 | DEV_MESSAGE(KERN_WARNING, device, |
580 | "Read device characteristics returned error %d", | 680 | "Read device characteristics returned " |
581 | rc); | 681 | "rc=%d", rc); |
582 | return rc; | ||
583 | } | ||
584 | 682 | ||
585 | DEV_MESSAGE(KERN_INFO, device, | 683 | DEV_MESSAGE(KERN_INFO, device, |
586 | "%04X/%02X(CU:%04X/%02X) Cyl:%d Head:%d Sec:%d", | 684 | "%04X/%02X(CU:%04X/%02X) Cyl:%d Head:%d Sec:%d", |
@@ -591,19 +689,6 @@ dasd_eckd_check_characteristics(struct dasd_device *device) | |||
591 | private->rdc_data.no_cyl, | 689 | private->rdc_data.no_cyl, |
592 | private->rdc_data.trk_per_cyl, | 690 | private->rdc_data.trk_per_cyl, |
593 | private->rdc_data.sec_per_trk); | 691 | private->rdc_data.sec_per_trk); |
594 | |||
595 | /* Read Configuration Data */ | ||
596 | rc = dasd_eckd_read_conf (device); | ||
597 | if (rc) | ||
598 | return rc; | ||
599 | |||
600 | /* Generate device unique id and register in devmap */ | ||
601 | rc = dasd_eckd_generate_uid(device, &uid); | ||
602 | if (rc) | ||
603 | return rc; | ||
604 | |||
605 | rc = dasd_set_uid(device->cdev, &uid); | ||
606 | |||
607 | return rc; | 692 | return rc; |
608 | } | 693 | } |
609 | 694 | ||
@@ -773,7 +858,7 @@ dasd_eckd_end_analysis(struct dasd_device *device) | |||
773 | ((private->rdc_data.no_cyl * | 858 | ((private->rdc_data.no_cyl * |
774 | private->rdc_data.trk_per_cyl * | 859 | private->rdc_data.trk_per_cyl * |
775 | blk_per_trk * (device->bp_block >> 9)) >> 1), | 860 | blk_per_trk * (device->bp_block >> 9)) >> 1), |
776 | ((blk_per_trk * device->bp_block) >> 10), | 861 | ((blk_per_trk * device->bp_block) >> 10), |
777 | private->uses_cdl ? | 862 | private->uses_cdl ? |
778 | "compatible disk layout" : "linux disk layout"); | 863 | "compatible disk layout" : "linux disk layout"); |
779 | 864 | ||
@@ -970,7 +1055,7 @@ dasd_eckd_format_device(struct dasd_device * device, | |||
970 | if (i < 3) { | 1055 | if (i < 3) { |
971 | ect->kl = 4; | 1056 | ect->kl = 4; |
972 | ect->dl = sizes_trk0[i] - 4; | 1057 | ect->dl = sizes_trk0[i] - 4; |
973 | } | 1058 | } |
974 | } | 1059 | } |
975 | if ((fdata->intensity & 0x08) && | 1060 | if ((fdata->intensity & 0x08) && |
976 | fdata->start_unit == 1) { | 1061 | fdata->start_unit == 1) { |
@@ -1270,7 +1355,7 @@ dasd_eckd_fill_info(struct dasd_device * device, | |||
1270 | 1355 | ||
1271 | /* | 1356 | /* |
1272 | * Release device ioctl. | 1357 | * Release device ioctl. |
1273 | * Buils a channel programm to releases a prior reserved | 1358 | * Buils a channel programm to releases a prior reserved |
1274 | * (see dasd_eckd_reserve) device. | 1359 | * (see dasd_eckd_reserve) device. |
1275 | */ | 1360 | */ |
1276 | static int | 1361 | static int |
@@ -1310,8 +1395,8 @@ dasd_eckd_release(struct dasd_device *device) | |||
1310 | /* | 1395 | /* |
1311 | * Reserve device ioctl. | 1396 | * Reserve device ioctl. |
1312 | * Options are set to 'synchronous wait for interrupt' and | 1397 | * Options are set to 'synchronous wait for interrupt' and |
1313 | * 'timeout the request'. This leads to a terminate IO if | 1398 | * 'timeout the request'. This leads to a terminate IO if |
1314 | * the interrupt is outstanding for a certain time. | 1399 | * the interrupt is outstanding for a certain time. |
1315 | */ | 1400 | */ |
1316 | static int | 1401 | static int |
1317 | dasd_eckd_reserve(struct dasd_device *device) | 1402 | dasd_eckd_reserve(struct dasd_device *device) |
@@ -1349,7 +1434,7 @@ dasd_eckd_reserve(struct dasd_device *device) | |||
1349 | 1434 | ||
1350 | /* | 1435 | /* |
1351 | * Steal lock ioctl - unconditional reserve device. | 1436 | * Steal lock ioctl - unconditional reserve device. |
1352 | * Buils a channel programm to break a device's reservation. | 1437 | * Buils a channel programm to break a device's reservation. |
1353 | * (unconditional reserve) | 1438 | * (unconditional reserve) |
1354 | */ | 1439 | */ |
1355 | static int | 1440 | static int |
@@ -1522,6 +1607,40 @@ dasd_eckd_ioctl(struct dasd_device *device, unsigned int cmd, void __user *argp) | |||
1522 | } | 1607 | } |
1523 | 1608 | ||
1524 | /* | 1609 | /* |
1610 | * Dump the range of CCWs into 'page' buffer | ||
1611 | * and return number of printed chars. | ||
1612 | */ | ||
1613 | static inline int | ||
1614 | dasd_eckd_dump_ccw_range(struct ccw1 *from, struct ccw1 *to, char *page) | ||
1615 | { | ||
1616 | int len, count; | ||
1617 | char *datap; | ||
1618 | |||
1619 | len = 0; | ||
1620 | while (from <= to) { | ||
1621 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER | ||
1622 | " CCW %p: %08X %08X DAT:", | ||
1623 | from, ((int *) from)[0], ((int *) from)[1]); | ||
1624 | |||
1625 | /* get pointer to data (consider IDALs) */ | ||
1626 | if (from->flags & CCW_FLAG_IDA) | ||
1627 | datap = (char *) *((addr_t *) (addr_t) from->cda); | ||
1628 | else | ||
1629 | datap = (char *) ((addr_t) from->cda); | ||
1630 | |||
1631 | /* dump data (max 32 bytes) */ | ||
1632 | for (count = 0; count < from->count && count < 32; count++) { | ||
1633 | if (count % 8 == 0) len += sprintf(page + len, " "); | ||
1634 | if (count % 4 == 0) len += sprintf(page + len, " "); | ||
1635 | len += sprintf(page + len, "%02x", datap[count]); | ||
1636 | } | ||
1637 | len += sprintf(page + len, "\n"); | ||
1638 | from++; | ||
1639 | } | ||
1640 | return len; | ||
1641 | } | ||
1642 | |||
1643 | /* | ||
1525 | * Print sense data and related channel program. | 1644 | * Print sense data and related channel program. |
1526 | * Parts are printed because printk buffer is only 1024 bytes. | 1645 | * Parts are printed because printk buffer is only 1024 bytes. |
1527 | */ | 1646 | */ |
@@ -1530,8 +1649,8 @@ dasd_eckd_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req, | |||
1530 | struct irb *irb) | 1649 | struct irb *irb) |
1531 | { | 1650 | { |
1532 | char *page; | 1651 | char *page; |
1533 | struct ccw1 *act, *end, *last; | 1652 | struct ccw1 *first, *last, *fail, *from, *to; |
1534 | int len, sl, sct, count; | 1653 | int len, sl, sct; |
1535 | 1654 | ||
1536 | page = (char *) get_zeroed_page(GFP_ATOMIC); | 1655 | page = (char *) get_zeroed_page(GFP_ATOMIC); |
1537 | if (page == NULL) { | 1656 | if (page == NULL) { |
@@ -1539,7 +1658,8 @@ dasd_eckd_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req, | |||
1539 | "No memory to dump sense data"); | 1658 | "No memory to dump sense data"); |
1540 | return; | 1659 | return; |
1541 | } | 1660 | } |
1542 | len = sprintf(page, KERN_ERR PRINTK_HEADER | 1661 | /* dump the sense data */ |
1662 | len = sprintf(page, KERN_ERR PRINTK_HEADER | ||
1543 | " I/O status report for device %s:\n", | 1663 | " I/O status report for device %s:\n", |
1544 | device->cdev->dev.bus_id); | 1664 | device->cdev->dev.bus_id); |
1545 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER | 1665 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER |
@@ -1564,87 +1684,55 @@ dasd_eckd_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req, | |||
1564 | 1684 | ||
1565 | if (irb->ecw[27] & DASD_SENSE_BIT_0) { | 1685 | if (irb->ecw[27] & DASD_SENSE_BIT_0) { |
1566 | /* 24 Byte Sense Data */ | 1686 | /* 24 Byte Sense Data */ |
1567 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER | 1687 | sprintf(page + len, KERN_ERR PRINTK_HEADER |
1568 | " 24 Byte: %x MSG %x, " | 1688 | " 24 Byte: %x MSG %x, " |
1569 | "%s MSGb to SYSOP\n", | 1689 | "%s MSGb to SYSOP\n", |
1570 | irb->ecw[7] >> 4, irb->ecw[7] & 0x0f, | 1690 | irb->ecw[7] >> 4, irb->ecw[7] & 0x0f, |
1571 | irb->ecw[1] & 0x10 ? "" : "no"); | 1691 | irb->ecw[1] & 0x10 ? "" : "no"); |
1572 | } else { | 1692 | } else { |
1573 | /* 32 Byte Sense Data */ | 1693 | /* 32 Byte Sense Data */ |
1574 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER | 1694 | sprintf(page + len, KERN_ERR PRINTK_HEADER |
1575 | " 32 Byte: Format: %x " | 1695 | " 32 Byte: Format: %x " |
1576 | "Exception class %x\n", | 1696 | "Exception class %x\n", |
1577 | irb->ecw[6] & 0x0f, irb->ecw[22] >> 4); | 1697 | irb->ecw[6] & 0x0f, irb->ecw[22] >> 4); |
1578 | } | 1698 | } |
1579 | } else { | 1699 | } else { |
1580 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER | 1700 | sprintf(page + len, KERN_ERR PRINTK_HEADER |
1581 | " SORRY - NO VALID SENSE AVAILABLE\n"); | 1701 | " SORRY - NO VALID SENSE AVAILABLE\n"); |
1582 | } | 1702 | } |
1583 | MESSAGE_LOG(KERN_ERR, "%s", | 1703 | printk("%s", page); |
1584 | page + sizeof(KERN_ERR PRINTK_HEADER)); | 1704 | |
1585 | 1705 | /* dump the Channel Program (max 140 Bytes per line) */ | |
1586 | /* dump the Channel Program */ | 1706 | /* Count CCW and print first CCWs (maximum 1024 % 140 = 7) */ |
1587 | /* print first CCWs (maximum 8) */ | 1707 | first = req->cpaddr; |
1588 | act = req->cpaddr; | 1708 | for (last = first; last->flags & (CCW_FLAG_CC | CCW_FLAG_DC); last++); |
1589 | for (last = act; last->flags & (CCW_FLAG_CC | CCW_FLAG_DC); last++); | 1709 | to = min(first + 6, last); |
1590 | end = min(act + 8, last); | 1710 | len = sprintf(page, KERN_ERR PRINTK_HEADER |
1591 | len = sprintf(page, KERN_ERR PRINTK_HEADER | ||
1592 | " Related CP in req: %p\n", req); | 1711 | " Related CP in req: %p\n", req); |
1593 | while (act <= end) { | 1712 | dasd_eckd_dump_ccw_range(first, to, page + len); |
1594 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER | 1713 | printk("%s", page); |
1595 | " CCW %p: %08X %08X DAT:", | ||
1596 | act, ((int *) act)[0], ((int *) act)[1]); | ||
1597 | for (count = 0; count < 32 && count < act->count; | ||
1598 | count += sizeof(int)) | ||
1599 | len += sprintf(page + len, " %08X", | ||
1600 | ((int *) (addr_t) act->cda) | ||
1601 | [(count>>2)]); | ||
1602 | len += sprintf(page + len, "\n"); | ||
1603 | act++; | ||
1604 | } | ||
1605 | MESSAGE_LOG(KERN_ERR, "%s", | ||
1606 | page + sizeof(KERN_ERR PRINTK_HEADER)); | ||
1607 | 1714 | ||
1608 | /* print failing CCW area */ | 1715 | /* print failing CCW area (maximum 4) */ |
1716 | /* scsw->cda is either valid or zero */ | ||
1609 | len = 0; | 1717 | len = 0; |
1610 | if (act < ((struct ccw1 *)(addr_t) irb->scsw.cpa) - 2) { | 1718 | from = ++to; |
1611 | act = ((struct ccw1 *)(addr_t) irb->scsw.cpa) - 2; | 1719 | fail = (struct ccw1 *)(addr_t) irb->scsw.cpa; /* failing CCW */ |
1612 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER "......\n"); | 1720 | if (from < fail - 2) { |
1613 | } | 1721 | from = fail - 2; /* there is a gap - print header */ |
1614 | end = min((struct ccw1 *)(addr_t) irb->scsw.cpa + 2, last); | 1722 | len += sprintf(page, KERN_ERR PRINTK_HEADER "......\n"); |
1615 | while (act <= end) { | ||
1616 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER | ||
1617 | " CCW %p: %08X %08X DAT:", | ||
1618 | act, ((int *) act)[0], ((int *) act)[1]); | ||
1619 | for (count = 0; count < 32 && count < act->count; | ||
1620 | count += sizeof(int)) | ||
1621 | len += sprintf(page + len, " %08X", | ||
1622 | ((int *) (addr_t) act->cda) | ||
1623 | [(count>>2)]); | ||
1624 | len += sprintf(page + len, "\n"); | ||
1625 | act++; | ||
1626 | } | 1723 | } |
1724 | to = min(fail + 1, last); | ||
1725 | len += dasd_eckd_dump_ccw_range(from, to, page + len); | ||
1627 | 1726 | ||
1628 | /* print last CCWs */ | 1727 | /* print last CCWs (maximum 2) */ |
1629 | if (act < last - 2) { | 1728 | from = max(from, ++to); |
1630 | act = last - 2; | 1729 | if (from < last - 1) { |
1730 | from = last - 1; /* there is a gap - print header */ | ||
1631 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER "......\n"); | 1731 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER "......\n"); |
1632 | } | 1732 | } |
1633 | while (act <= last) { | 1733 | len += dasd_eckd_dump_ccw_range(from, last, page + len); |
1634 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER | ||
1635 | " CCW %p: %08X %08X DAT:", | ||
1636 | act, ((int *) act)[0], ((int *) act)[1]); | ||
1637 | for (count = 0; count < 32 && count < act->count; | ||
1638 | count += sizeof(int)) | ||
1639 | len += sprintf(page + len, " %08X", | ||
1640 | ((int *) (addr_t) act->cda) | ||
1641 | [(count>>2)]); | ||
1642 | len += sprintf(page + len, "\n"); | ||
1643 | act++; | ||
1644 | } | ||
1645 | if (len > 0) | 1734 | if (len > 0) |
1646 | MESSAGE_LOG(KERN_ERR, "%s", | 1735 | printk("%s", page); |
1647 | page + sizeof(KERN_ERR PRINTK_HEADER)); | ||
1648 | free_page((unsigned long) page); | 1736 | free_page((unsigned long) page); |
1649 | } | 1737 | } |
1650 | 1738 | ||
@@ -1685,14 +1773,8 @@ static struct dasd_discipline dasd_eckd_discipline = { | |||
1685 | static int __init | 1773 | static int __init |
1686 | dasd_eckd_init(void) | 1774 | dasd_eckd_init(void) |
1687 | { | 1775 | { |
1688 | int ret; | ||
1689 | |||
1690 | ASCEBC(dasd_eckd_discipline.ebcname, 4); | 1776 | ASCEBC(dasd_eckd_discipline.ebcname, 4); |
1691 | 1777 | return ccw_driver_register(&dasd_eckd_driver); | |
1692 | ret = ccw_driver_register(&dasd_eckd_driver); | ||
1693 | if (!ret) | ||
1694 | dasd_generic_auto_online(&dasd_eckd_driver); | ||
1695 | return ret; | ||
1696 | } | 1778 | } |
1697 | 1779 | ||
1698 | static void __exit | 1780 | static void __exit |
@@ -1703,22 +1785,3 @@ dasd_eckd_cleanup(void) | |||
1703 | 1785 | ||
1704 | module_init(dasd_eckd_init); | 1786 | module_init(dasd_eckd_init); |
1705 | module_exit(dasd_eckd_cleanup); | 1787 | module_exit(dasd_eckd_cleanup); |
1706 | |||
1707 | /* | ||
1708 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
1709 | * Emacs will notice this stuff at the end of the file and automatically | ||
1710 | * adjust the settings for this buffer only. This must remain at the end | ||
1711 | * of the file. | ||
1712 | * --------------------------------------------------------------------------- | ||
1713 | * Local variables: | ||
1714 | * c-indent-level: 4 | ||
1715 | * c-brace-imaginary-offset: 0 | ||
1716 | * c-brace-offset: -4 | ||
1717 | * c-argdecl-indent: 4 | ||
1718 | * c-label-offset: -4 | ||
1719 | * c-continued-statement-offset: 4 | ||
1720 | * c-continued-brace-offset: 0 | ||
1721 | * indent-tabs-mode: 1 | ||
1722 | * tab-width: 8 | ||
1723 | * End: | ||
1724 | */ | ||
diff --git a/drivers/s390/block/dasd_eckd.h b/drivers/s390/block/dasd_eckd.h index d5734e976e1c..712ff1650134 100644 --- a/drivers/s390/block/dasd_eckd.h +++ b/drivers/s390/block/dasd_eckd.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * File...........: linux/drivers/s390/block/dasd_eckd.h | 2 | * File...........: linux/drivers/s390/block/dasd_eckd.h |
3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> | 3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> |
4 | * Horst Hummel <Horst.Hummel@de.ibm.com> | 4 | * Horst Hummel <Horst.Hummel@de.ibm.com> |
5 | * Bugreports.to..: <Linux390@de.ibm.com> | 5 | * Bugreports.to..: <Linux390@de.ibm.com> |
6 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 | 6 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 |
7 | * | 7 | * |
@@ -41,9 +41,10 @@ | |||
41 | #define DASD_ECKD_CCW_RESERVE 0xB4 | 41 | #define DASD_ECKD_CCW_RESERVE 0xB4 |
42 | 42 | ||
43 | /* | 43 | /* |
44 | *Perform Subsystem Function / Sub-Orders | 44 | * Perform Subsystem Function / Sub-Orders |
45 | */ | 45 | */ |
46 | #define PSF_ORDER_PRSSD 0x18 | 46 | #define PSF_ORDER_PRSSD 0x18 |
47 | #define PSF_ORDER_SSC 0x1D | ||
47 | 48 | ||
48 | /***************************************************************************** | 49 | /***************************************************************************** |
49 | * SECTION: Type Definitions | 50 | * SECTION: Type Definitions |
@@ -155,7 +156,7 @@ struct dasd_eckd_characteristics { | |||
155 | unsigned char reserved2:4; | 156 | unsigned char reserved2:4; |
156 | unsigned char reserved3:8; | 157 | unsigned char reserved3:8; |
157 | unsigned char defect_wr:1; | 158 | unsigned char defect_wr:1; |
158 | unsigned char XRC_supported:1; | 159 | unsigned char XRC_supported:1; |
159 | unsigned char reserved4:1; | 160 | unsigned char reserved4:1; |
160 | unsigned char striping:1; | 161 | unsigned char striping:1; |
161 | unsigned char reserved5:4; | 162 | unsigned char reserved5:4; |
@@ -343,7 +344,7 @@ struct dasd_eckd_path { | |||
343 | }; | 344 | }; |
344 | 345 | ||
345 | /* | 346 | /* |
346 | * Perform Subsystem Function - Prepare for Read Subsystem Data | 347 | * Perform Subsystem Function - Prepare for Read Subsystem Data |
347 | */ | 348 | */ |
348 | struct dasd_psf_prssd_data { | 349 | struct dasd_psf_prssd_data { |
349 | unsigned char order; | 350 | unsigned char order; |
@@ -353,4 +354,15 @@ struct dasd_psf_prssd_data { | |||
353 | unsigned char varies[9]; | 354 | unsigned char varies[9]; |
354 | } __attribute__ ((packed)); | 355 | } __attribute__ ((packed)); |
355 | 356 | ||
357 | /* | ||
358 | * Perform Subsystem Function - Set Subsystem Characteristics | ||
359 | */ | ||
360 | struct dasd_psf_ssc_data { | ||
361 | unsigned char order; | ||
362 | unsigned char flags; | ||
363 | unsigned char cu_type[4]; | ||
364 | unsigned char suborder; | ||
365 | unsigned char reserved[59]; | ||
366 | } __attribute__((packed)); | ||
367 | |||
356 | #endif /* DASD_ECKD_H */ | 368 | #endif /* DASD_ECKD_H */ |
diff --git a/drivers/s390/block/dasd_eer.c b/drivers/s390/block/dasd_eer.c index 2d8af709947f..da65f1b032f5 100644 --- a/drivers/s390/block/dasd_eer.c +++ b/drivers/s390/block/dasd_eer.c | |||
@@ -276,7 +276,7 @@ struct dasd_eer_header { | |||
276 | __u64 tv_sec; | 276 | __u64 tv_sec; |
277 | __u64 tv_usec; | 277 | __u64 tv_usec; |
278 | char busid[DASD_EER_BUSID_SIZE]; | 278 | char busid[DASD_EER_BUSID_SIZE]; |
279 | }; | 279 | } __attribute__ ((packed)); |
280 | 280 | ||
281 | /* | 281 | /* |
282 | * The following function can be used for those triggers that have | 282 | * The following function can be used for those triggers that have |
@@ -521,6 +521,8 @@ static int dasd_eer_open(struct inode *inp, struct file *filp) | |||
521 | unsigned long flags; | 521 | unsigned long flags; |
522 | 522 | ||
523 | eerb = kzalloc(sizeof(struct eerbuffer), GFP_KERNEL); | 523 | eerb = kzalloc(sizeof(struct eerbuffer), GFP_KERNEL); |
524 | if (!eerb) | ||
525 | return -ENOMEM; | ||
524 | eerb->buffer_page_count = eer_pages; | 526 | eerb->buffer_page_count = eer_pages; |
525 | if (eerb->buffer_page_count < 1 || | 527 | if (eerb->buffer_page_count < 1 || |
526 | eerb->buffer_page_count > INT_MAX / PAGE_SIZE) { | 528 | eerb->buffer_page_count > INT_MAX / PAGE_SIZE) { |
diff --git a/drivers/s390/block/dasd_erp.c b/drivers/s390/block/dasd_erp.c index b842377cb0c6..4108d96f6a5a 100644 --- a/drivers/s390/block/dasd_erp.c +++ b/drivers/s390/block/dasd_erp.c | |||
@@ -90,7 +90,7 @@ dasd_default_erp_action(struct dasd_ccw_req * cqr) | |||
90 | 90 | ||
91 | /* just retry - there is nothing to save ... I got no sense data.... */ | 91 | /* just retry - there is nothing to save ... I got no sense data.... */ |
92 | if (cqr->retries > 0) { | 92 | if (cqr->retries > 0) { |
93 | DEV_MESSAGE (KERN_DEBUG, device, | 93 | DEV_MESSAGE (KERN_DEBUG, device, |
94 | "default ERP called (%i retries left)", | 94 | "default ERP called (%i retries left)", |
95 | cqr->retries); | 95 | cqr->retries); |
96 | cqr->lpm = LPM_ANYPATH; | 96 | cqr->lpm = LPM_ANYPATH; |
@@ -155,7 +155,7 @@ dasd_default_erp_postaction(struct dasd_ccw_req * cqr) | |||
155 | 155 | ||
156 | /* | 156 | /* |
157 | * Print the hex dump of the memory used by a request. This includes | 157 | * Print the hex dump of the memory used by a request. This includes |
158 | * all error recovery ccws that have been chained in from of the | 158 | * all error recovery ccws that have been chained in from of the |
159 | * real request. | 159 | * real request. |
160 | */ | 160 | */ |
161 | static inline void | 161 | static inline void |
@@ -227,12 +227,12 @@ dasd_log_ccw(struct dasd_ccw_req * cqr, int caller, __u32 cpa) | |||
227 | /* | 227 | /* |
228 | * Log bytes arround failed CCW but only if we did | 228 | * Log bytes arround failed CCW but only if we did |
229 | * not log the whole CP of the CCW is outside the | 229 | * not log the whole CP of the CCW is outside the |
230 | * logged CP. | 230 | * logged CP. |
231 | */ | 231 | */ |
232 | if (cplength > 40 || | 232 | if (cplength > 40 || |
233 | ((addr_t) cpa < (addr_t) lcqr->cpaddr && | 233 | ((addr_t) cpa < (addr_t) lcqr->cpaddr && |
234 | (addr_t) cpa > (addr_t) (lcqr->cpaddr + cplength + 4))) { | 234 | (addr_t) cpa > (addr_t) (lcqr->cpaddr + cplength + 4))) { |
235 | 235 | ||
236 | DEV_MESSAGE(KERN_ERR, device, | 236 | DEV_MESSAGE(KERN_ERR, device, |
237 | "Failed CCW (%p) (area):", | 237 | "Failed CCW (%p) (area):", |
238 | (void *) (long) cpa); | 238 | (void *) (long) cpa); |
diff --git a/drivers/s390/block/dasd_fba.c b/drivers/s390/block/dasd_fba.c index 91145698f8e9..bb7755b9b19d 100644 --- a/drivers/s390/block/dasd_fba.c +++ b/drivers/s390/block/dasd_fba.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * File...........: linux/drivers/s390/block/dasd_fba.c | 2 | * File...........: linux/drivers/s390/block/dasd_fba.c |
3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> | 3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> |
4 | * Bugreports.to..: <Linux390@de.ibm.com> | 4 | * Bugreports.to..: <Linux390@de.ibm.com> |
@@ -56,19 +56,13 @@ static struct ccw_driver dasd_fba_driver; /* see below */ | |||
56 | static int | 56 | static int |
57 | dasd_fba_probe(struct ccw_device *cdev) | 57 | dasd_fba_probe(struct ccw_device *cdev) |
58 | { | 58 | { |
59 | int ret; | 59 | return dasd_generic_probe(cdev, &dasd_fba_discipline); |
60 | |||
61 | ret = dasd_generic_probe (cdev, &dasd_fba_discipline); | ||
62 | if (ret) | ||
63 | return ret; | ||
64 | ccw_device_set_options(cdev, CCWDEV_DO_PATHGROUP); | ||
65 | return 0; | ||
66 | } | 60 | } |
67 | 61 | ||
68 | static int | 62 | static int |
69 | dasd_fba_set_online(struct ccw_device *cdev) | 63 | dasd_fba_set_online(struct ccw_device *cdev) |
70 | { | 64 | { |
71 | return dasd_generic_set_online (cdev, &dasd_fba_discipline); | 65 | return dasd_generic_set_online(cdev, &dasd_fba_discipline); |
72 | } | 66 | } |
73 | 67 | ||
74 | static struct ccw_driver dasd_fba_driver = { | 68 | static struct ccw_driver dasd_fba_driver = { |
@@ -125,13 +119,13 @@ static int | |||
125 | dasd_fba_check_characteristics(struct dasd_device *device) | 119 | dasd_fba_check_characteristics(struct dasd_device *device) |
126 | { | 120 | { |
127 | struct dasd_fba_private *private; | 121 | struct dasd_fba_private *private; |
128 | struct ccw_device *cdev = device->cdev; | 122 | struct ccw_device *cdev = device->cdev; |
129 | void *rdc_data; | 123 | void *rdc_data; |
130 | int rc; | 124 | int rc; |
131 | 125 | ||
132 | private = (struct dasd_fba_private *) device->private; | 126 | private = (struct dasd_fba_private *) device->private; |
133 | if (private == NULL) { | 127 | if (private == NULL) { |
134 | private = kmalloc(sizeof(struct dasd_fba_private), GFP_KERNEL); | 128 | private = kzalloc(sizeof(struct dasd_fba_private), GFP_KERNEL); |
135 | if (private == NULL) { | 129 | if (private == NULL) { |
136 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 130 | DEV_MESSAGE(KERN_WARNING, device, "%s", |
137 | "memory allocation failed for private " | 131 | "memory allocation failed for private " |
@@ -204,7 +198,7 @@ dasd_fba_examine_error(struct dasd_ccw_req * cqr, struct irb * irb) | |||
204 | if (irb->scsw.cstat == 0x00 && | 198 | if (irb->scsw.cstat == 0x00 && |
205 | irb->scsw.dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END)) | 199 | irb->scsw.dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END)) |
206 | return dasd_era_none; | 200 | return dasd_era_none; |
207 | 201 | ||
208 | cdev = device->cdev; | 202 | cdev = device->cdev; |
209 | switch (cdev->id.dev_type) { | 203 | switch (cdev->id.dev_type) { |
210 | case 0x3370: | 204 | case 0x3370: |
@@ -539,7 +533,7 @@ dasd_fba_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req, | |||
539 | * 8192 bytes (=2 pages). For 64 bit one dasd_mchunkt_t structure has | 533 | * 8192 bytes (=2 pages). For 64 bit one dasd_mchunkt_t structure has |
540 | * 24 bytes, the struct dasd_ccw_req has 136 bytes and each block can use | 534 | * 24 bytes, the struct dasd_ccw_req has 136 bytes and each block can use |
541 | * up to 16 bytes (8 for the ccw and 8 for the idal pointer). In | 535 | * up to 16 bytes (8 for the ccw and 8 for the idal pointer). In |
542 | * addition we have one define extent ccw + 16 bytes of data and a | 536 | * addition we have one define extent ccw + 16 bytes of data and a |
543 | * locate record ccw for each block (stupid devices!) + 16 bytes of data. | 537 | * locate record ccw for each block (stupid devices!) + 16 bytes of data. |
544 | * That makes: | 538 | * That makes: |
545 | * (8192 - 24 - 136 - 8 - 16) / 40 = 200.2 blocks at maximum. | 539 | * (8192 - 24 - 136 - 8 - 16) / 40 = 200.2 blocks at maximum. |
@@ -569,16 +563,8 @@ static struct dasd_discipline dasd_fba_discipline = { | |||
569 | static int __init | 563 | static int __init |
570 | dasd_fba_init(void) | 564 | dasd_fba_init(void) |
571 | { | 565 | { |
572 | int ret; | ||
573 | |||
574 | ASCEBC(dasd_fba_discipline.ebcname, 4); | 566 | ASCEBC(dasd_fba_discipline.ebcname, 4); |
575 | 567 | return ccw_driver_register(&dasd_fba_driver); | |
576 | ret = ccw_driver_register(&dasd_fba_driver); | ||
577 | if (ret) | ||
578 | return ret; | ||
579 | |||
580 | dasd_generic_auto_online(&dasd_fba_driver); | ||
581 | return 0; | ||
582 | } | 568 | } |
583 | 569 | ||
584 | static void __exit | 570 | static void __exit |
@@ -589,22 +575,3 @@ dasd_fba_cleanup(void) | |||
589 | 575 | ||
590 | module_init(dasd_fba_init); | 576 | module_init(dasd_fba_init); |
591 | module_exit(dasd_fba_cleanup); | 577 | module_exit(dasd_fba_cleanup); |
592 | |||
593 | /* | ||
594 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
595 | * Emacs will notice this stuff at the end of the file and automatically | ||
596 | * adjust the settings for this buffer only. This must remain at the end | ||
597 | * of the file. | ||
598 | * --------------------------------------------------------------------------- | ||
599 | * Local variables: | ||
600 | * c-indent-level: 4 | ||
601 | * c-brace-imaginary-offset: 0 | ||
602 | * c-brace-offset: -4 | ||
603 | * c-argdecl-indent: 4 | ||
604 | * c-label-offset: -4 | ||
605 | * c-continued-statement-offset: 4 | ||
606 | * c-continued-brace-offset: 0 | ||
607 | * indent-tabs-mode: 1 | ||
608 | * tab-width: 8 | ||
609 | * End: | ||
610 | */ | ||
diff --git a/drivers/s390/block/dasd_fba.h b/drivers/s390/block/dasd_fba.h index da1fa91fc01d..14c910baa5fe 100644 --- a/drivers/s390/block/dasd_fba.h +++ b/drivers/s390/block/dasd_fba.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * File...........: linux/drivers/s390/block/dasd_fba.h | 2 | * File...........: linux/drivers/s390/block/dasd_fba.h |
3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> | 3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> |
4 | * Bugreports.to..: <Linux390@de.ibm.com> | 4 | * Bugreports.to..: <Linux390@de.ibm.com> |
diff --git a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h index d4b13e300a76..03a83efc34c4 100644 --- a/drivers/s390/block/dasd_int.h +++ b/drivers/s390/block/dasd_int.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * File...........: linux/drivers/s390/block/dasd_int.h | 2 | * File...........: linux/drivers/s390/block/dasd_int.h |
3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> | 3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> |
4 | * Horst Hummel <Horst.Hummel@de.ibm.com> | 4 | * Horst Hummel <Horst.Hummel@de.ibm.com> |
5 | * Martin Schwidefsky <schwidefsky@de.ibm.com> | 5 | * Martin Schwidefsky <schwidefsky@de.ibm.com> |
6 | * Bugreports.to..: <Linux390@de.ibm.com> | 6 | * Bugreports.to..: <Linux390@de.ibm.com> |
7 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 | 7 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 |
@@ -186,7 +186,7 @@ struct dasd_ccw_req { | |||
186 | void *callback_data; | 186 | void *callback_data; |
187 | }; | 187 | }; |
188 | 188 | ||
189 | /* | 189 | /* |
190 | * dasd_ccw_req -> status can be: | 190 | * dasd_ccw_req -> status can be: |
191 | */ | 191 | */ |
192 | #define DASD_CQR_FILLED 0x00 /* request is ready to be processed */ | 192 | #define DASD_CQR_FILLED 0x00 /* request is ready to be processed */ |
@@ -248,7 +248,7 @@ struct dasd_discipline { | |||
248 | /* | 248 | /* |
249 | * Error recovery functions. examine_error() returns a value that | 249 | * Error recovery functions. examine_error() returns a value that |
250 | * indicates what to do for an error condition. If examine_error() | 250 | * indicates what to do for an error condition. If examine_error() |
251 | * returns 'dasd_era_recover' erp_action() is called to create a | 251 | * returns 'dasd_era_recover' erp_action() is called to create a |
252 | * special error recovery ccw. erp_postaction() is called after | 252 | * special error recovery ccw. erp_postaction() is called after |
253 | * an error recovery ccw has finished its execution. dump_sense | 253 | * an error recovery ccw has finished its execution. dump_sense |
254 | * is called for every error condition to print the sense data | 254 | * is called for every error condition to print the sense data |
@@ -302,11 +302,11 @@ struct dasd_device { | |||
302 | spinlock_t request_queue_lock; | 302 | spinlock_t request_queue_lock; |
303 | struct block_device *bdev; | 303 | struct block_device *bdev; |
304 | unsigned int devindex; | 304 | unsigned int devindex; |
305 | unsigned long blocks; /* size of volume in blocks */ | 305 | unsigned long blocks; /* size of volume in blocks */ |
306 | unsigned int bp_block; /* bytes per block */ | 306 | unsigned int bp_block; /* bytes per block */ |
307 | unsigned int s2b_shift; /* log2 (bp_block/512) */ | 307 | unsigned int s2b_shift; /* log2 (bp_block/512) */ |
308 | unsigned long flags; /* per device flags */ | 308 | unsigned long flags; /* per device flags */ |
309 | unsigned short features; /* copy of devmap-features (read-only!) */ | 309 | unsigned short features; /* copy of devmap-features (read-only!) */ |
310 | 310 | ||
311 | /* extended error reporting stuff (eer) */ | 311 | /* extended error reporting stuff (eer) */ |
312 | struct dasd_ccw_req *eer_cqr; | 312 | struct dasd_ccw_req *eer_cqr; |
@@ -513,12 +513,12 @@ void dasd_generic_remove (struct ccw_device *cdev); | |||
513 | int dasd_generic_set_online(struct ccw_device *, struct dasd_discipline *); | 513 | int dasd_generic_set_online(struct ccw_device *, struct dasd_discipline *); |
514 | int dasd_generic_set_offline (struct ccw_device *cdev); | 514 | int dasd_generic_set_offline (struct ccw_device *cdev); |
515 | int dasd_generic_notify(struct ccw_device *, int); | 515 | int dasd_generic_notify(struct ccw_device *, int); |
516 | void dasd_generic_auto_online (struct ccw_driver *); | ||
517 | 516 | ||
518 | /* externals in dasd_devmap.c */ | 517 | /* externals in dasd_devmap.c */ |
519 | extern int dasd_max_devindex; | 518 | extern int dasd_max_devindex; |
520 | extern int dasd_probeonly; | 519 | extern int dasd_probeonly; |
521 | extern int dasd_autodetect; | 520 | extern int dasd_autodetect; |
521 | extern int dasd_nopav; | ||
522 | 522 | ||
523 | int dasd_devmap_init(void); | 523 | int dasd_devmap_init(void); |
524 | void dasd_devmap_exit(void); | 524 | void dasd_devmap_exit(void); |
@@ -606,22 +606,3 @@ static inline int dasd_eer_enabled(struct dasd_device *device) | |||
606 | #endif /* __KERNEL__ */ | 606 | #endif /* __KERNEL__ */ |
607 | 607 | ||
608 | #endif /* DASD_H */ | 608 | #endif /* DASD_H */ |
609 | |||
610 | /* | ||
611 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
612 | * Emacs will notice this stuff at the end of the file and automatically | ||
613 | * adjust the settings for this buffer only. This must remain at the end | ||
614 | * of the file. | ||
615 | * --------------------------------------------------------------------------- | ||
616 | * Local variables: | ||
617 | * c-indent-level: 4 | ||
618 | * c-brace-imaginary-offset: 0 | ||
619 | * c-brace-offset: -4 | ||
620 | * c-argdecl-indent: 4 | ||
621 | * c-label-offset: -4 | ||
622 | * c-continued-statement-offset: 4 | ||
623 | * c-continued-brace-offset: 0 | ||
624 | * indent-tabs-mode: 1 | ||
625 | * tab-width: 8 | ||
626 | * End: | ||
627 | */ | ||
diff --git a/drivers/s390/block/dasd_ioctl.c b/drivers/s390/block/dasd_ioctl.c index b8c80d28df41..302bcd0f28be 100644 --- a/drivers/s390/block/dasd_ioctl.c +++ b/drivers/s390/block/dasd_ioctl.c | |||
@@ -90,10 +90,10 @@ static int | |||
90 | dasd_ioctl_quiesce(struct dasd_device *device) | 90 | dasd_ioctl_quiesce(struct dasd_device *device) |
91 | { | 91 | { |
92 | unsigned long flags; | 92 | unsigned long flags; |
93 | 93 | ||
94 | if (!capable (CAP_SYS_ADMIN)) | 94 | if (!capable (CAP_SYS_ADMIN)) |
95 | return -EACCES; | 95 | return -EACCES; |
96 | 96 | ||
97 | DEV_MESSAGE (KERN_DEBUG, device, "%s", | 97 | DEV_MESSAGE (KERN_DEBUG, device, "%s", |
98 | "Quiesce IO on device"); | 98 | "Quiesce IO on device"); |
99 | spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); | 99 | spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); |
@@ -110,13 +110,13 @@ static int | |||
110 | dasd_ioctl_resume(struct dasd_device *device) | 110 | dasd_ioctl_resume(struct dasd_device *device) |
111 | { | 111 | { |
112 | unsigned long flags; | 112 | unsigned long flags; |
113 | 113 | ||
114 | if (!capable (CAP_SYS_ADMIN)) | 114 | if (!capable (CAP_SYS_ADMIN)) |
115 | return -EACCES; | 115 | return -EACCES; |
116 | 116 | ||
117 | DEV_MESSAGE (KERN_DEBUG, device, "%s", | 117 | DEV_MESSAGE (KERN_DEBUG, device, "%s", |
118 | "resume IO on device"); | 118 | "resume IO on device"); |
119 | 119 | ||
120 | spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); | 120 | spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); |
121 | device->stopped &= ~DASD_STOPPED_QUIESCE; | 121 | device->stopped &= ~DASD_STOPPED_QUIESCE; |
122 | spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); | 122 | spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); |
@@ -287,7 +287,7 @@ dasd_ioctl_information(struct dasd_device *device, | |||
287 | dasd_info->open_count = atomic_read(&device->open_count); | 287 | dasd_info->open_count = atomic_read(&device->open_count); |
288 | if (!device->bdev) | 288 | if (!device->bdev) |
289 | dasd_info->open_count++; | 289 | dasd_info->open_count++; |
290 | 290 | ||
291 | /* | 291 | /* |
292 | * check if device is really formatted | 292 | * check if device is really formatted |
293 | * LDL / CDL was returned by 'fill_info' | 293 | * LDL / CDL was returned by 'fill_info' |
diff --git a/drivers/s390/char/raw3270.c b/drivers/s390/char/raw3270.c index eecb2afad5c2..3c1314b7391b 100644 --- a/drivers/s390/char/raw3270.c +++ b/drivers/s390/char/raw3270.c | |||
@@ -50,6 +50,9 @@ struct raw3270 { | |||
50 | unsigned char *ascebc; /* ascii -> ebcdic table */ | 50 | unsigned char *ascebc; /* ascii -> ebcdic table */ |
51 | struct class_device *clttydev; /* 3270-class tty device ptr */ | 51 | struct class_device *clttydev; /* 3270-class tty device ptr */ |
52 | struct class_device *cltubdev; /* 3270-class tub device ptr */ | 52 | struct class_device *cltubdev; /* 3270-class tub device ptr */ |
53 | |||
54 | struct raw3270_request init_request; | ||
55 | unsigned char init_data[256]; | ||
53 | }; | 56 | }; |
54 | 57 | ||
55 | /* raw3270->flags */ | 58 | /* raw3270->flags */ |
@@ -484,8 +487,6 @@ struct raw3270_ua { /* Query Reply structure for Usable Area */ | |||
484 | } __attribute__ ((packed)) aua; | 487 | } __attribute__ ((packed)) aua; |
485 | } __attribute__ ((packed)); | 488 | } __attribute__ ((packed)); |
486 | 489 | ||
487 | static unsigned char raw3270_init_data[256]; | ||
488 | static struct raw3270_request raw3270_init_request; | ||
489 | static struct diag210 raw3270_init_diag210; | 490 | static struct diag210 raw3270_init_diag210; |
490 | static DECLARE_MUTEX(raw3270_init_sem); | 491 | static DECLARE_MUTEX(raw3270_init_sem); |
491 | 492 | ||
@@ -644,17 +645,17 @@ __raw3270_size_device(struct raw3270 *rp) | |||
644 | * required (3270 device switched to 'stand-by') and command | 645 | * required (3270 device switched to 'stand-by') and command |
645 | * rejects (old devices that can't do 'read partition'). | 646 | * rejects (old devices that can't do 'read partition'). |
646 | */ | 647 | */ |
647 | memset(&raw3270_init_request, 0, sizeof(raw3270_init_request)); | 648 | memset(&rp->init_request, 0, sizeof(rp->init_request)); |
648 | memset(raw3270_init_data, 0, sizeof(raw3270_init_data)); | 649 | memset(&rp->init_data, 0, 256); |
649 | /* Store 'read partition' data stream to raw3270_init_data */ | 650 | /* Store 'read partition' data stream to init_data */ |
650 | memcpy(raw3270_init_data, wbuf, sizeof(wbuf)); | 651 | memcpy(&rp->init_data, wbuf, sizeof(wbuf)); |
651 | INIT_LIST_HEAD(&raw3270_init_request.list); | 652 | INIT_LIST_HEAD(&rp->init_request.list); |
652 | raw3270_init_request.ccw.cmd_code = TC_WRITESF; | 653 | rp->init_request.ccw.cmd_code = TC_WRITESF; |
653 | raw3270_init_request.ccw.flags = CCW_FLAG_SLI; | 654 | rp->init_request.ccw.flags = CCW_FLAG_SLI; |
654 | raw3270_init_request.ccw.count = sizeof(wbuf); | 655 | rp->init_request.ccw.count = sizeof(wbuf); |
655 | raw3270_init_request.ccw.cda = (__u32) __pa(raw3270_init_data); | 656 | rp->init_request.ccw.cda = (__u32) __pa(&rp->init_data); |
656 | 657 | ||
657 | rc = raw3270_start_init(rp, &raw3270_init_view, &raw3270_init_request); | 658 | rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); |
658 | if (rc) | 659 | if (rc) |
659 | /* Check error cases: -ERESTARTSYS, -EIO and -EOPNOTSUPP */ | 660 | /* Check error cases: -ERESTARTSYS, -EIO and -EOPNOTSUPP */ |
660 | return rc; | 661 | return rc; |
@@ -679,18 +680,18 @@ __raw3270_size_device(struct raw3270 *rp) | |||
679 | * The device accepted the 'read partition' command. Now | 680 | * The device accepted the 'read partition' command. Now |
680 | * set up a read ccw and issue it. | 681 | * set up a read ccw and issue it. |
681 | */ | 682 | */ |
682 | raw3270_init_request.ccw.cmd_code = TC_READMOD; | 683 | rp->init_request.ccw.cmd_code = TC_READMOD; |
683 | raw3270_init_request.ccw.flags = CCW_FLAG_SLI; | 684 | rp->init_request.ccw.flags = CCW_FLAG_SLI; |
684 | raw3270_init_request.ccw.count = sizeof(raw3270_init_data); | 685 | rp->init_request.ccw.count = sizeof(rp->init_data); |
685 | raw3270_init_request.ccw.cda = (__u32) __pa(raw3270_init_data); | 686 | rp->init_request.ccw.cda = (__u32) __pa(rp->init_data); |
686 | rc = raw3270_start_init(rp, &raw3270_init_view, &raw3270_init_request); | 687 | rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); |
687 | if (rc) | 688 | if (rc) |
688 | return rc; | 689 | return rc; |
689 | /* Got a Query Reply */ | 690 | /* Got a Query Reply */ |
690 | count = sizeof(raw3270_init_data) - raw3270_init_request.rescnt; | 691 | count = sizeof(rp->init_data) - rp->init_request.rescnt; |
691 | uap = (struct raw3270_ua *) (raw3270_init_data + 1); | 692 | uap = (struct raw3270_ua *) (rp->init_data + 1); |
692 | /* Paranoia check. */ | 693 | /* Paranoia check. */ |
693 | if (raw3270_init_data[0] != 0x88 || uap->uab.qcode != 0x81) | 694 | if (rp->init_data[0] != 0x88 || uap->uab.qcode != 0x81) |
694 | return -EOPNOTSUPP; | 695 | return -EOPNOTSUPP; |
695 | /* Copy rows/columns of default Usable Area */ | 696 | /* Copy rows/columns of default Usable Area */ |
696 | rp->rows = uap->uab.h; | 697 | rp->rows = uap->uab.h; |
@@ -749,18 +750,18 @@ raw3270_reset_device(struct raw3270 *rp) | |||
749 | int rc; | 750 | int rc; |
750 | 751 | ||
751 | down(&raw3270_init_sem); | 752 | down(&raw3270_init_sem); |
752 | memset(&raw3270_init_request, 0, sizeof(raw3270_init_request)); | 753 | memset(&rp->init_request, 0, sizeof(rp->init_request)); |
753 | memset(raw3270_init_data, 0, sizeof(raw3270_init_data)); | 754 | memset(&rp->init_data, 0, sizeof(rp->init_data)); |
754 | /* Store reset data stream to raw3270_init_data/raw3270_init_request */ | 755 | /* Store reset data stream to init_data/init_request */ |
755 | raw3270_init_data[0] = TW_KR; | 756 | rp->init_data[0] = TW_KR; |
756 | INIT_LIST_HEAD(&raw3270_init_request.list); | 757 | INIT_LIST_HEAD(&rp->init_request.list); |
757 | raw3270_init_request.ccw.cmd_code = TC_EWRITEA; | 758 | rp->init_request.ccw.cmd_code = TC_EWRITEA; |
758 | raw3270_init_request.ccw.flags = CCW_FLAG_SLI; | 759 | rp->init_request.ccw.flags = CCW_FLAG_SLI; |
759 | raw3270_init_request.ccw.count = 1; | 760 | rp->init_request.ccw.count = 1; |
760 | raw3270_init_request.ccw.cda = (__u32) __pa(raw3270_init_data); | 761 | rp->init_request.ccw.cda = (__u32) __pa(rp->init_data); |
761 | rp->view = &raw3270_init_view; | 762 | rp->view = &raw3270_init_view; |
762 | raw3270_init_view.dev = rp; | 763 | raw3270_init_view.dev = rp; |
763 | rc = raw3270_start_init(rp, &raw3270_init_view, &raw3270_init_request); | 764 | rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); |
764 | raw3270_init_view.dev = 0; | 765 | raw3270_init_view.dev = 0; |
765 | rp->view = 0; | 766 | rp->view = 0; |
766 | up(&raw3270_init_sem); | 767 | up(&raw3270_init_sem); |
@@ -854,7 +855,7 @@ raw3270_setup_console(struct ccw_device *cdev) | |||
854 | char *ascebc; | 855 | char *ascebc; |
855 | int rc; | 856 | int rc; |
856 | 857 | ||
857 | rp = (struct raw3270 *) alloc_bootmem(sizeof(struct raw3270)); | 858 | rp = (struct raw3270 *) alloc_bootmem_low(sizeof(struct raw3270)); |
858 | ascebc = (char *) alloc_bootmem(256); | 859 | ascebc = (char *) alloc_bootmem(256); |
859 | rc = raw3270_setup_device(cdev, rp, ascebc); | 860 | rc = raw3270_setup_device(cdev, rp, ascebc); |
860 | if (rc) | 861 | if (rc) |
@@ -895,7 +896,7 @@ raw3270_create_device(struct ccw_device *cdev) | |||
895 | char *ascebc; | 896 | char *ascebc; |
896 | int rc; | 897 | int rc; |
897 | 898 | ||
898 | rp = kmalloc(sizeof(struct raw3270), GFP_KERNEL); | 899 | rp = kmalloc(sizeof(struct raw3270), GFP_KERNEL | GFP_DMA); |
899 | if (!rp) | 900 | if (!rp) |
900 | return ERR_PTR(-ENOMEM); | 901 | return ERR_PTR(-ENOMEM); |
901 | ascebc = kmalloc(256, GFP_KERNEL); | 902 | ascebc = kmalloc(256, GFP_KERNEL); |
diff --git a/drivers/s390/cio/blacklist.c b/drivers/s390/cio/blacklist.c index 0960bef7b199..15b895496a45 100644 --- a/drivers/s390/cio/blacklist.c +++ b/drivers/s390/cio/blacklist.c | |||
@@ -224,39 +224,6 @@ is_blacklisted (int ssid, int devno) | |||
224 | } | 224 | } |
225 | 225 | ||
226 | #ifdef CONFIG_PROC_FS | 226 | #ifdef CONFIG_PROC_FS |
227 | static int | ||
228 | __s390_redo_validation(struct subchannel_id schid, void *data) | ||
229 | { | ||
230 | int ret; | ||
231 | struct subchannel *sch; | ||
232 | |||
233 | sch = get_subchannel_by_schid(schid); | ||
234 | if (sch) { | ||
235 | /* Already known. */ | ||
236 | put_device(&sch->dev); | ||
237 | return 0; | ||
238 | } | ||
239 | ret = css_probe_device(schid); | ||
240 | if (ret == -ENXIO) | ||
241 | return ret; /* We're through. */ | ||
242 | if (ret == -ENOMEM) | ||
243 | /* Stop validation for now. Bad, but no need for a panic. */ | ||
244 | return ret; | ||
245 | return 0; | ||
246 | } | ||
247 | |||
248 | /* | ||
249 | * Function: s390_redo_validation | ||
250 | * Look for no longer blacklisted devices | ||
251 | * FIXME: there must be a better way to do this */ | ||
252 | static inline void | ||
253 | s390_redo_validation (void) | ||
254 | { | ||
255 | CIO_TRACE_EVENT (0, "redoval"); | ||
256 | |||
257 | for_each_subchannel(__s390_redo_validation, NULL); | ||
258 | } | ||
259 | |||
260 | /* | 227 | /* |
261 | * Function: blacklist_parse_proc_parameters | 228 | * Function: blacklist_parse_proc_parameters |
262 | * parse the stuff which is piped to /proc/cio_ignore | 229 | * parse the stuff which is piped to /proc/cio_ignore |
@@ -281,7 +248,7 @@ blacklist_parse_proc_parameters (char *buf) | |||
281 | return; | 248 | return; |
282 | } | 249 | } |
283 | 250 | ||
284 | s390_redo_validation (); | 251 | css_schedule_reprobe(); |
285 | } | 252 | } |
286 | 253 | ||
287 | /* Iterator struct for all devices. */ | 254 | /* Iterator struct for all devices. */ |
diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c index bdfee7fbaa2e..c7319a07ba35 100644 --- a/drivers/s390/cio/ccwgroup.c +++ b/drivers/s390/cio/ccwgroup.c | |||
@@ -404,21 +404,24 @@ ccwgroup_driver_register (struct ccwgroup_driver *cdriver) | |||
404 | } | 404 | } |
405 | 405 | ||
406 | static int | 406 | static int |
407 | __ccwgroup_driver_unregister_device(struct device *dev, void *data) | 407 | __ccwgroup_match_all(struct device *dev, void *data) |
408 | { | 408 | { |
409 | __ccwgroup_remove_symlinks(to_ccwgroupdev(dev)); | 409 | return 1; |
410 | device_unregister(dev); | ||
411 | put_device(dev); | ||
412 | return 0; | ||
413 | } | 410 | } |
414 | 411 | ||
415 | void | 412 | void |
416 | ccwgroup_driver_unregister (struct ccwgroup_driver *cdriver) | 413 | ccwgroup_driver_unregister (struct ccwgroup_driver *cdriver) |
417 | { | 414 | { |
415 | struct device *dev; | ||
416 | |||
418 | /* We don't want ccwgroup devices to live longer than their driver. */ | 417 | /* We don't want ccwgroup devices to live longer than their driver. */ |
419 | get_driver(&cdriver->driver); | 418 | get_driver(&cdriver->driver); |
420 | driver_for_each_device(&cdriver->driver, NULL, NULL, | 419 | while ((dev = driver_find_device(&cdriver->driver, NULL, NULL, |
421 | __ccwgroup_driver_unregister_device); | 420 | __ccwgroup_match_all))) { |
421 | __ccwgroup_remove_symlinks(to_ccwgroupdev(dev)); | ||
422 | device_unregister(dev); | ||
423 | put_device(dev); | ||
424 | } | ||
422 | put_driver(&cdriver->driver); | 425 | put_driver(&cdriver->driver); |
423 | driver_unregister(&cdriver->driver); | 426 | driver_unregister(&cdriver->driver); |
424 | } | 427 | } |
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c index 72187e54dcac..b00f3ed051a0 100644 --- a/drivers/s390/cio/chsc.c +++ b/drivers/s390/cio/chsc.c | |||
@@ -244,8 +244,7 @@ s390_subchannel_remove_chpid(struct device *dev, void *data) | |||
244 | 244 | ||
245 | if ((sch->schib.scsw.actl & SCSW_ACTL_DEVACT) && | 245 | if ((sch->schib.scsw.actl & SCSW_ACTL_DEVACT) && |
246 | (sch->schib.scsw.actl & SCSW_ACTL_SCHACT) && | 246 | (sch->schib.scsw.actl & SCSW_ACTL_SCHACT) && |
247 | (sch->schib.pmcw.lpum == mask) && | 247 | (sch->schib.pmcw.lpum == mask)) { |
248 | (sch->vpm == 0)) { | ||
249 | int cc; | 248 | int cc; |
250 | 249 | ||
251 | cc = cio_clear(sch); | 250 | cc = cio_clear(sch); |
@@ -918,12 +917,13 @@ chp_measurement_read(struct kobject *kobj, char *buf, loff_t off, size_t count) | |||
918 | chp = to_channelpath(container_of(kobj, struct device, kobj)); | 917 | chp = to_channelpath(container_of(kobj, struct device, kobj)); |
919 | css = to_css(chp->dev.parent); | 918 | css = to_css(chp->dev.parent); |
920 | 919 | ||
921 | size = sizeof(struct cmg_chars); | 920 | size = sizeof(struct cmg_entry); |
922 | 921 | ||
923 | /* Only allow single reads. */ | 922 | /* Only allow single reads. */ |
924 | if (off || count < size) | 923 | if (off || count < size) |
925 | return 0; | 924 | return 0; |
926 | chp_measurement_copy_block((struct cmg_entry *)buf, css, chp->id); | 925 | chp_measurement_copy_block((struct cmg_entry *)buf, css, chp->id); |
926 | count = size; | ||
927 | return count; | 927 | return count; |
928 | } | 928 | } |
929 | 929 | ||
diff --git a/drivers/s390/cio/cmf.c b/drivers/s390/cio/cmf.c index 07ef3f640f4a..1c3e8e9012b0 100644 --- a/drivers/s390/cio/cmf.c +++ b/drivers/s390/cio/cmf.c | |||
@@ -3,9 +3,10 @@ | |||
3 | * | 3 | * |
4 | * Linux on zSeries Channel Measurement Facility support | 4 | * Linux on zSeries Channel Measurement Facility support |
5 | * | 5 | * |
6 | * Copyright 2000,2003 IBM Corporation | 6 | * Copyright 2000,2006 IBM Corporation |
7 | * | 7 | * |
8 | * Author: Arnd Bergmann <arndb@de.ibm.com> | 8 | * Authors: Arnd Bergmann <arndb@de.ibm.com> |
9 | * Cornelia Huck <cornelia.huck@de.ibm.com> | ||
9 | * | 10 | * |
10 | * original idea from Natarajan Krishnaswami <nkrishna@us.ibm.com> | 11 | * original idea from Natarajan Krishnaswami <nkrishna@us.ibm.com> |
11 | * | 12 | * |
@@ -96,9 +97,9 @@ module_param(format, bool, 0444); | |||
96 | /** | 97 | /** |
97 | * struct cmb_operations - functions to use depending on cmb_format | 98 | * struct cmb_operations - functions to use depending on cmb_format |
98 | * | 99 | * |
99 | * all these functions operate on a struct cmf_device. There is only | 100 | * Most of these functions operate on a struct ccw_device. There is only |
100 | * one instance of struct cmb_operations because all cmf_device | 101 | * one instance of struct cmb_operations because the format of the measurement |
101 | * objects are guaranteed to be of the same type. | 102 | * data is guaranteed to be the same for every ccw_device. |
102 | * | 103 | * |
103 | * @alloc: allocate memory for a channel measurement block, | 104 | * @alloc: allocate memory for a channel measurement block, |
104 | * either with the help of a special pool or with kmalloc | 105 | * either with the help of a special pool or with kmalloc |
@@ -107,6 +108,7 @@ module_param(format, bool, 0444); | |||
107 | * @readall: read a measurement block in a common format | 108 | * @readall: read a measurement block in a common format |
108 | * @reset: clear the data in the associated measurement block and | 109 | * @reset: clear the data in the associated measurement block and |
109 | * reset its time stamp | 110 | * reset its time stamp |
111 | * @align: align an allocated block so that the hardware can use it | ||
110 | */ | 112 | */ |
111 | struct cmb_operations { | 113 | struct cmb_operations { |
112 | int (*alloc) (struct ccw_device*); | 114 | int (*alloc) (struct ccw_device*); |
@@ -115,11 +117,19 @@ struct cmb_operations { | |||
115 | u64 (*read) (struct ccw_device*, int); | 117 | u64 (*read) (struct ccw_device*, int); |
116 | int (*readall)(struct ccw_device*, struct cmbdata *); | 118 | int (*readall)(struct ccw_device*, struct cmbdata *); |
117 | void (*reset) (struct ccw_device*); | 119 | void (*reset) (struct ccw_device*); |
120 | void * (*align) (void *); | ||
118 | 121 | ||
119 | struct attribute_group *attr_group; | 122 | struct attribute_group *attr_group; |
120 | }; | 123 | }; |
121 | static struct cmb_operations *cmbops; | 124 | static struct cmb_operations *cmbops; |
122 | 125 | ||
126 | struct cmb_data { | ||
127 | void *hw_block; /* Pointer to block updated by hardware */ | ||
128 | void *last_block; /* Last changed block copied from hardware block */ | ||
129 | int size; /* Size of hw_block and last_block */ | ||
130 | unsigned long long last_update; /* when last_block was updated */ | ||
131 | }; | ||
132 | |||
123 | /* our user interface is designed in terms of nanoseconds, | 133 | /* our user interface is designed in terms of nanoseconds, |
124 | * while the hardware measures total times in its own | 134 | * while the hardware measures total times in its own |
125 | * unit.*/ | 135 | * unit.*/ |
@@ -226,63 +236,229 @@ struct set_schib_struct { | |||
226 | unsigned long address; | 236 | unsigned long address; |
227 | wait_queue_head_t wait; | 237 | wait_queue_head_t wait; |
228 | int ret; | 238 | int ret; |
239 | struct kref kref; | ||
229 | }; | 240 | }; |
230 | 241 | ||
242 | static void cmf_set_schib_release(struct kref *kref) | ||
243 | { | ||
244 | struct set_schib_struct *set_data; | ||
245 | |||
246 | set_data = container_of(kref, struct set_schib_struct, kref); | ||
247 | kfree(set_data); | ||
248 | } | ||
249 | |||
250 | #define CMF_PENDING 1 | ||
251 | |||
231 | static int set_schib_wait(struct ccw_device *cdev, u32 mme, | 252 | static int set_schib_wait(struct ccw_device *cdev, u32 mme, |
232 | int mbfc, unsigned long address) | 253 | int mbfc, unsigned long address) |
233 | { | 254 | { |
234 | struct set_schib_struct s = { | 255 | struct set_schib_struct *set_data; |
235 | .mme = mme, | 256 | int ret; |
236 | .mbfc = mbfc, | ||
237 | .address = address, | ||
238 | .wait = __WAIT_QUEUE_HEAD_INITIALIZER(s.wait), | ||
239 | }; | ||
240 | 257 | ||
241 | spin_lock_irq(cdev->ccwlock); | 258 | spin_lock_irq(cdev->ccwlock); |
242 | s.ret = set_schib(cdev, mme, mbfc, address); | 259 | if (!cdev->private->cmb) { |
243 | if (s.ret != -EBUSY) { | 260 | ret = -ENODEV; |
244 | goto out_nowait; | 261 | goto out; |
245 | } | 262 | } |
263 | set_data = kzalloc(sizeof(struct set_schib_struct), GFP_ATOMIC); | ||
264 | if (!set_data) { | ||
265 | ret = -ENOMEM; | ||
266 | goto out; | ||
267 | } | ||
268 | init_waitqueue_head(&set_data->wait); | ||
269 | kref_init(&set_data->kref); | ||
270 | set_data->mme = mme; | ||
271 | set_data->mbfc = mbfc; | ||
272 | set_data->address = address; | ||
273 | |||
274 | ret = set_schib(cdev, mme, mbfc, address); | ||
275 | if (ret != -EBUSY) | ||
276 | goto out_put; | ||
246 | 277 | ||
247 | if (cdev->private->state != DEV_STATE_ONLINE) { | 278 | if (cdev->private->state != DEV_STATE_ONLINE) { |
248 | s.ret = -EBUSY; | ||
249 | /* if the device is not online, don't even try again */ | 279 | /* if the device is not online, don't even try again */ |
250 | goto out_nowait; | 280 | ret = -EBUSY; |
281 | goto out_put; | ||
251 | } | 282 | } |
283 | |||
252 | cdev->private->state = DEV_STATE_CMFCHANGE; | 284 | cdev->private->state = DEV_STATE_CMFCHANGE; |
253 | cdev->private->cmb_wait = &s; | 285 | set_data->ret = CMF_PENDING; |
254 | s.ret = 1; | 286 | cdev->private->cmb_wait = set_data; |
255 | 287 | ||
256 | spin_unlock_irq(cdev->ccwlock); | 288 | spin_unlock_irq(cdev->ccwlock); |
257 | if (wait_event_interruptible(s.wait, s.ret != 1)) { | 289 | if (wait_event_interruptible(set_data->wait, |
290 | set_data->ret != CMF_PENDING)) { | ||
258 | spin_lock_irq(cdev->ccwlock); | 291 | spin_lock_irq(cdev->ccwlock); |
259 | if (s.ret == 1) { | 292 | if (set_data->ret == CMF_PENDING) { |
260 | s.ret = -ERESTARTSYS; | 293 | set_data->ret = -ERESTARTSYS; |
261 | cdev->private->cmb_wait = 0; | ||
262 | if (cdev->private->state == DEV_STATE_CMFCHANGE) | 294 | if (cdev->private->state == DEV_STATE_CMFCHANGE) |
263 | cdev->private->state = DEV_STATE_ONLINE; | 295 | cdev->private->state = DEV_STATE_ONLINE; |
264 | } | 296 | } |
265 | spin_unlock_irq(cdev->ccwlock); | 297 | spin_unlock_irq(cdev->ccwlock); |
266 | } | 298 | } |
267 | return s.ret; | 299 | spin_lock_irq(cdev->ccwlock); |
268 | 300 | cdev->private->cmb_wait = NULL; | |
269 | out_nowait: | 301 | ret = set_data->ret; |
302 | out_put: | ||
303 | kref_put(&set_data->kref, cmf_set_schib_release); | ||
304 | out: | ||
270 | spin_unlock_irq(cdev->ccwlock); | 305 | spin_unlock_irq(cdev->ccwlock); |
271 | return s.ret; | 306 | return ret; |
272 | } | 307 | } |
273 | 308 | ||
274 | void retry_set_schib(struct ccw_device *cdev) | 309 | void retry_set_schib(struct ccw_device *cdev) |
275 | { | 310 | { |
276 | struct set_schib_struct *s; | 311 | struct set_schib_struct *set_data; |
312 | |||
313 | set_data = cdev->private->cmb_wait; | ||
314 | if (!set_data) { | ||
315 | WARN_ON(1); | ||
316 | return; | ||
317 | } | ||
318 | kref_get(&set_data->kref); | ||
319 | set_data->ret = set_schib(cdev, set_data->mme, set_data->mbfc, | ||
320 | set_data->address); | ||
321 | wake_up(&set_data->wait); | ||
322 | kref_put(&set_data->kref, cmf_set_schib_release); | ||
323 | } | ||
324 | |||
325 | static int cmf_copy_block(struct ccw_device *cdev) | ||
326 | { | ||
327 | struct subchannel *sch; | ||
328 | void *reference_buf; | ||
329 | void *hw_block; | ||
330 | struct cmb_data *cmb_data; | ||
331 | |||
332 | sch = to_subchannel(cdev->dev.parent); | ||
333 | |||
334 | if (stsch(sch->schid, &sch->schib)) | ||
335 | return -ENODEV; | ||
336 | |||
337 | if (sch->schib.scsw.fctl & SCSW_FCTL_START_FUNC) { | ||
338 | /* Don't copy if a start function is in progress. */ | ||
339 | if ((!sch->schib.scsw.actl & SCSW_ACTL_SUSPENDED) && | ||
340 | (sch->schib.scsw.actl & | ||
341 | (SCSW_ACTL_DEVACT | SCSW_ACTL_SCHACT)) && | ||
342 | (!sch->schib.scsw.stctl & SCSW_STCTL_SEC_STATUS)) | ||
343 | return -EBUSY; | ||
344 | } | ||
345 | cmb_data = cdev->private->cmb; | ||
346 | hw_block = cmbops->align(cmb_data->hw_block); | ||
347 | if (!memcmp(cmb_data->last_block, hw_block, cmb_data->size)) | ||
348 | /* No need to copy. */ | ||
349 | return 0; | ||
350 | reference_buf = kzalloc(cmb_data->size, GFP_ATOMIC); | ||
351 | if (!reference_buf) | ||
352 | return -ENOMEM; | ||
353 | /* Ensure consistency of block copied from hardware. */ | ||
354 | do { | ||
355 | memcpy(cmb_data->last_block, hw_block, cmb_data->size); | ||
356 | memcpy(reference_buf, hw_block, cmb_data->size); | ||
357 | } while (memcmp(cmb_data->last_block, reference_buf, cmb_data->size)); | ||
358 | cmb_data->last_update = get_clock(); | ||
359 | kfree(reference_buf); | ||
360 | return 0; | ||
361 | } | ||
362 | |||
363 | struct copy_block_struct { | ||
364 | wait_queue_head_t wait; | ||
365 | int ret; | ||
366 | struct kref kref; | ||
367 | }; | ||
368 | |||
369 | static void cmf_copy_block_release(struct kref *kref) | ||
370 | { | ||
371 | struct copy_block_struct *copy_block; | ||
372 | |||
373 | copy_block = container_of(kref, struct copy_block_struct, kref); | ||
374 | kfree(copy_block); | ||
375 | } | ||
376 | |||
377 | static int cmf_cmb_copy_wait(struct ccw_device *cdev) | ||
378 | { | ||
379 | struct copy_block_struct *copy_block; | ||
380 | int ret; | ||
381 | unsigned long flags; | ||
382 | |||
383 | spin_lock_irqsave(cdev->ccwlock, flags); | ||
384 | if (!cdev->private->cmb) { | ||
385 | ret = -ENODEV; | ||
386 | goto out; | ||
387 | } | ||
388 | copy_block = kzalloc(sizeof(struct copy_block_struct), GFP_ATOMIC); | ||
389 | if (!copy_block) { | ||
390 | ret = -ENOMEM; | ||
391 | goto out; | ||
392 | } | ||
393 | init_waitqueue_head(©_block->wait); | ||
394 | kref_init(©_block->kref); | ||
395 | |||
396 | ret = cmf_copy_block(cdev); | ||
397 | if (ret != -EBUSY) | ||
398 | goto out_put; | ||
399 | |||
400 | if (cdev->private->state != DEV_STATE_ONLINE) { | ||
401 | ret = -EBUSY; | ||
402 | goto out_put; | ||
403 | } | ||
404 | |||
405 | cdev->private->state = DEV_STATE_CMFUPDATE; | ||
406 | copy_block->ret = CMF_PENDING; | ||
407 | cdev->private->cmb_wait = copy_block; | ||
408 | |||
409 | spin_unlock_irqrestore(cdev->ccwlock, flags); | ||
410 | if (wait_event_interruptible(copy_block->wait, | ||
411 | copy_block->ret != CMF_PENDING)) { | ||
412 | spin_lock_irqsave(cdev->ccwlock, flags); | ||
413 | if (copy_block->ret == CMF_PENDING) { | ||
414 | copy_block->ret = -ERESTARTSYS; | ||
415 | if (cdev->private->state == DEV_STATE_CMFUPDATE) | ||
416 | cdev->private->state = DEV_STATE_ONLINE; | ||
417 | } | ||
418 | spin_unlock_irqrestore(cdev->ccwlock, flags); | ||
419 | } | ||
420 | spin_lock_irqsave(cdev->ccwlock, flags); | ||
421 | cdev->private->cmb_wait = NULL; | ||
422 | ret = copy_block->ret; | ||
423 | out_put: | ||
424 | kref_put(©_block->kref, cmf_copy_block_release); | ||
425 | out: | ||
426 | spin_unlock_irqrestore(cdev->ccwlock, flags); | ||
427 | return ret; | ||
428 | } | ||
429 | |||
430 | void cmf_retry_copy_block(struct ccw_device *cdev) | ||
431 | { | ||
432 | struct copy_block_struct *copy_block; | ||
277 | 433 | ||
278 | s = cdev->private->cmb_wait; | 434 | copy_block = cdev->private->cmb_wait; |
279 | cdev->private->cmb_wait = 0; | 435 | if (!copy_block) { |
280 | if (!s) { | ||
281 | WARN_ON(1); | 436 | WARN_ON(1); |
282 | return; | 437 | return; |
283 | } | 438 | } |
284 | s->ret = set_schib(cdev, s->mme, s->mbfc, s->address); | 439 | kref_get(©_block->kref); |
285 | wake_up(&s->wait); | 440 | copy_block->ret = cmf_copy_block(cdev); |
441 | wake_up(©_block->wait); | ||
442 | kref_put(©_block->kref, cmf_copy_block_release); | ||
443 | } | ||
444 | |||
445 | static void cmf_generic_reset(struct ccw_device *cdev) | ||
446 | { | ||
447 | struct cmb_data *cmb_data; | ||
448 | |||
449 | spin_lock_irq(cdev->ccwlock); | ||
450 | cmb_data = cdev->private->cmb; | ||
451 | if (cmb_data) { | ||
452 | memset(cmb_data->last_block, 0, cmb_data->size); | ||
453 | /* | ||
454 | * Need to reset hw block as well to make the hardware start | ||
455 | * from 0 again. | ||
456 | */ | ||
457 | memset(cmbops->align(cmb_data->hw_block), 0, cmb_data->size); | ||
458 | cmb_data->last_update = 0; | ||
459 | } | ||
460 | cdev->private->cmb_start_time = get_clock(); | ||
461 | spin_unlock_irq(cdev->ccwlock); | ||
286 | } | 462 | } |
287 | 463 | ||
288 | /** | 464 | /** |
@@ -343,8 +519,8 @@ struct cmb { | |||
343 | /* insert a single device into the cmb_area list | 519 | /* insert a single device into the cmb_area list |
344 | * called with cmb_area.lock held from alloc_cmb | 520 | * called with cmb_area.lock held from alloc_cmb |
345 | */ | 521 | */ |
346 | static inline int | 522 | static inline int alloc_cmb_single (struct ccw_device *cdev, |
347 | alloc_cmb_single (struct ccw_device *cdev) | 523 | struct cmb_data *cmb_data) |
348 | { | 524 | { |
349 | struct cmb *cmb; | 525 | struct cmb *cmb; |
350 | struct ccw_device_private *node; | 526 | struct ccw_device_private *node; |
@@ -358,10 +534,12 @@ alloc_cmb_single (struct ccw_device *cdev) | |||
358 | 534 | ||
359 | /* find first unused cmb in cmb_area.mem. | 535 | /* find first unused cmb in cmb_area.mem. |
360 | * this is a little tricky: cmb_area.list | 536 | * this is a little tricky: cmb_area.list |
361 | * remains sorted by ->cmb pointers */ | 537 | * remains sorted by ->cmb->hw_data pointers */ |
362 | cmb = cmb_area.mem; | 538 | cmb = cmb_area.mem; |
363 | list_for_each_entry(node, &cmb_area.list, cmb_list) { | 539 | list_for_each_entry(node, &cmb_area.list, cmb_list) { |
364 | if ((struct cmb*)node->cmb > cmb) | 540 | struct cmb_data *data; |
541 | data = node->cmb; | ||
542 | if ((struct cmb*)data->hw_block > cmb) | ||
365 | break; | 543 | break; |
366 | cmb++; | 544 | cmb++; |
367 | } | 545 | } |
@@ -372,7 +550,8 @@ alloc_cmb_single (struct ccw_device *cdev) | |||
372 | 550 | ||
373 | /* insert new cmb */ | 551 | /* insert new cmb */ |
374 | list_add_tail(&cdev->private->cmb_list, &node->cmb_list); | 552 | list_add_tail(&cdev->private->cmb_list, &node->cmb_list); |
375 | cdev->private->cmb = cmb; | 553 | cmb_data->hw_block = cmb; |
554 | cdev->private->cmb = cmb_data; | ||
376 | ret = 0; | 555 | ret = 0; |
377 | out: | 556 | out: |
378 | spin_unlock_irq(cdev->ccwlock); | 557 | spin_unlock_irq(cdev->ccwlock); |
@@ -385,7 +564,19 @@ alloc_cmb (struct ccw_device *cdev) | |||
385 | int ret; | 564 | int ret; |
386 | struct cmb *mem; | 565 | struct cmb *mem; |
387 | ssize_t size; | 566 | ssize_t size; |
567 | struct cmb_data *cmb_data; | ||
568 | |||
569 | /* Allocate private cmb_data. */ | ||
570 | cmb_data = kzalloc(sizeof(struct cmb_data), GFP_KERNEL); | ||
571 | if (!cmb_data) | ||
572 | return -ENOMEM; | ||
388 | 573 | ||
574 | cmb_data->last_block = kzalloc(sizeof(struct cmb), GFP_KERNEL); | ||
575 | if (!cmb_data->last_block) { | ||
576 | kfree(cmb_data); | ||
577 | return -ENOMEM; | ||
578 | } | ||
579 | cmb_data->size = sizeof(struct cmb); | ||
389 | spin_lock(&cmb_area.lock); | 580 | spin_lock(&cmb_area.lock); |
390 | 581 | ||
391 | if (!cmb_area.mem) { | 582 | if (!cmb_area.mem) { |
@@ -414,29 +605,36 @@ alloc_cmb (struct ccw_device *cdev) | |||
414 | } | 605 | } |
415 | 606 | ||
416 | /* do the actual allocation */ | 607 | /* do the actual allocation */ |
417 | ret = alloc_cmb_single(cdev); | 608 | ret = alloc_cmb_single(cdev, cmb_data); |
418 | out: | 609 | out: |
419 | spin_unlock(&cmb_area.lock); | 610 | spin_unlock(&cmb_area.lock); |
420 | 611 | if (ret) { | |
612 | kfree(cmb_data->last_block); | ||
613 | kfree(cmb_data); | ||
614 | } | ||
421 | return ret; | 615 | return ret; |
422 | } | 616 | } |
423 | 617 | ||
424 | static void | 618 | static void free_cmb(struct ccw_device *cdev) |
425 | free_cmb(struct ccw_device *cdev) | ||
426 | { | 619 | { |
427 | struct ccw_device_private *priv; | 620 | struct ccw_device_private *priv; |
428 | 621 | struct cmb_data *cmb_data; | |
429 | priv = cdev->private; | ||
430 | 622 | ||
431 | spin_lock(&cmb_area.lock); | 623 | spin_lock(&cmb_area.lock); |
432 | spin_lock_irq(cdev->ccwlock); | 624 | spin_lock_irq(cdev->ccwlock); |
433 | 625 | ||
626 | priv = cdev->private; | ||
627 | |||
434 | if (list_empty(&priv->cmb_list)) { | 628 | if (list_empty(&priv->cmb_list)) { |
435 | /* already freed */ | 629 | /* already freed */ |
436 | goto out; | 630 | goto out; |
437 | } | 631 | } |
438 | 632 | ||
633 | cmb_data = priv->cmb; | ||
439 | priv->cmb = NULL; | 634 | priv->cmb = NULL; |
635 | if (cmb_data) | ||
636 | kfree(cmb_data->last_block); | ||
637 | kfree(cmb_data); | ||
440 | list_del_init(&priv->cmb_list); | 638 | list_del_init(&priv->cmb_list); |
441 | 639 | ||
442 | if (list_empty(&cmb_area.list)) { | 640 | if (list_empty(&cmb_area.list)) { |
@@ -451,83 +649,97 @@ out: | |||
451 | spin_unlock(&cmb_area.lock); | 649 | spin_unlock(&cmb_area.lock); |
452 | } | 650 | } |
453 | 651 | ||
454 | static int | 652 | static int set_cmb(struct ccw_device *cdev, u32 mme) |
455 | set_cmb(struct ccw_device *cdev, u32 mme) | ||
456 | { | 653 | { |
457 | u16 offset; | 654 | u16 offset; |
655 | struct cmb_data *cmb_data; | ||
656 | unsigned long flags; | ||
458 | 657 | ||
459 | if (!cdev->private->cmb) | 658 | spin_lock_irqsave(cdev->ccwlock, flags); |
659 | if (!cdev->private->cmb) { | ||
660 | spin_unlock_irqrestore(cdev->ccwlock, flags); | ||
460 | return -EINVAL; | 661 | return -EINVAL; |
461 | 662 | } | |
462 | offset = mme ? (struct cmb *)cdev->private->cmb - cmb_area.mem : 0; | 663 | cmb_data = cdev->private->cmb; |
664 | offset = mme ? (struct cmb *)cmb_data->hw_block - cmb_area.mem : 0; | ||
665 | spin_unlock_irqrestore(cdev->ccwlock, flags); | ||
463 | 666 | ||
464 | return set_schib_wait(cdev, mme, 0, offset); | 667 | return set_schib_wait(cdev, mme, 0, offset); |
465 | } | 668 | } |
466 | 669 | ||
467 | static u64 | 670 | static u64 read_cmb (struct ccw_device *cdev, int index) |
468 | read_cmb (struct ccw_device *cdev, int index) | ||
469 | { | 671 | { |
470 | /* yes, we have to put it on the stack | 672 | struct cmb *cmb; |
471 | * because the cmb must only be accessed | ||
472 | * atomically, e.g. with mvc */ | ||
473 | struct cmb cmb; | ||
474 | unsigned long flags; | ||
475 | u32 val; | 673 | u32 val; |
674 | int ret; | ||
675 | unsigned long flags; | ||
676 | |||
677 | ret = cmf_cmb_copy_wait(cdev); | ||
678 | if (ret < 0) | ||
679 | return 0; | ||
476 | 680 | ||
477 | spin_lock_irqsave(cdev->ccwlock, flags); | 681 | spin_lock_irqsave(cdev->ccwlock, flags); |
478 | if (!cdev->private->cmb) { | 682 | if (!cdev->private->cmb) { |
479 | spin_unlock_irqrestore(cdev->ccwlock, flags); | 683 | ret = 0; |
480 | return 0; | 684 | goto out; |
481 | } | 685 | } |
482 | 686 | cmb = ((struct cmb_data *)cdev->private->cmb)->last_block; | |
483 | cmb = *(struct cmb*)cdev->private->cmb; | ||
484 | spin_unlock_irqrestore(cdev->ccwlock, flags); | ||
485 | 687 | ||
486 | switch (index) { | 688 | switch (index) { |
487 | case cmb_ssch_rsch_count: | 689 | case cmb_ssch_rsch_count: |
488 | return cmb.ssch_rsch_count; | 690 | ret = cmb->ssch_rsch_count; |
691 | goto out; | ||
489 | case cmb_sample_count: | 692 | case cmb_sample_count: |
490 | return cmb.sample_count; | 693 | ret = cmb->sample_count; |
694 | goto out; | ||
491 | case cmb_device_connect_time: | 695 | case cmb_device_connect_time: |
492 | val = cmb.device_connect_time; | 696 | val = cmb->device_connect_time; |
493 | break; | 697 | break; |
494 | case cmb_function_pending_time: | 698 | case cmb_function_pending_time: |
495 | val = cmb.function_pending_time; | 699 | val = cmb->function_pending_time; |
496 | break; | 700 | break; |
497 | case cmb_device_disconnect_time: | 701 | case cmb_device_disconnect_time: |
498 | val = cmb.device_disconnect_time; | 702 | val = cmb->device_disconnect_time; |
499 | break; | 703 | break; |
500 | case cmb_control_unit_queuing_time: | 704 | case cmb_control_unit_queuing_time: |
501 | val = cmb.control_unit_queuing_time; | 705 | val = cmb->control_unit_queuing_time; |
502 | break; | 706 | break; |
503 | case cmb_device_active_only_time: | 707 | case cmb_device_active_only_time: |
504 | val = cmb.device_active_only_time; | 708 | val = cmb->device_active_only_time; |
505 | break; | 709 | break; |
506 | default: | 710 | default: |
507 | return 0; | 711 | ret = 0; |
712 | goto out; | ||
508 | } | 713 | } |
509 | return time_to_avg_nsec(val, cmb.sample_count); | 714 | ret = time_to_avg_nsec(val, cmb->sample_count); |
715 | out: | ||
716 | spin_unlock_irqrestore(cdev->ccwlock, flags); | ||
717 | return ret; | ||
510 | } | 718 | } |
511 | 719 | ||
512 | static int | 720 | static int readall_cmb (struct ccw_device *cdev, struct cmbdata *data) |
513 | readall_cmb (struct ccw_device *cdev, struct cmbdata *data) | ||
514 | { | 721 | { |
515 | /* yes, we have to put it on the stack | 722 | struct cmb *cmb; |
516 | * because the cmb must only be accessed | 723 | struct cmb_data *cmb_data; |
517 | * atomically, e.g. with mvc */ | ||
518 | struct cmb cmb; | ||
519 | unsigned long flags; | ||
520 | u64 time; | 724 | u64 time; |
725 | unsigned long flags; | ||
726 | int ret; | ||
521 | 727 | ||
728 | ret = cmf_cmb_copy_wait(cdev); | ||
729 | if (ret < 0) | ||
730 | return ret; | ||
522 | spin_lock_irqsave(cdev->ccwlock, flags); | 731 | spin_lock_irqsave(cdev->ccwlock, flags); |
523 | if (!cdev->private->cmb) { | 732 | cmb_data = cdev->private->cmb; |
524 | spin_unlock_irqrestore(cdev->ccwlock, flags); | 733 | if (!cmb_data) { |
525 | return -ENODEV; | 734 | ret = -ENODEV; |
735 | goto out; | ||
526 | } | 736 | } |
527 | 737 | if (cmb_data->last_update == 0) { | |
528 | cmb = *(struct cmb*)cdev->private->cmb; | 738 | ret = -EAGAIN; |
529 | time = get_clock() - cdev->private->cmb_start_time; | 739 | goto out; |
530 | spin_unlock_irqrestore(cdev->ccwlock, flags); | 740 | } |
741 | cmb = cmb_data->last_block; | ||
742 | time = cmb_data->last_update - cdev->private->cmb_start_time; | ||
531 | 743 | ||
532 | memset(data, 0, sizeof(struct cmbdata)); | 744 | memset(data, 0, sizeof(struct cmbdata)); |
533 | 745 | ||
@@ -538,31 +750,32 @@ readall_cmb (struct ccw_device *cdev, struct cmbdata *data) | |||
538 | data->elapsed_time = (time * 1000) >> 12; | 750 | data->elapsed_time = (time * 1000) >> 12; |
539 | 751 | ||
540 | /* copy data to new structure */ | 752 | /* copy data to new structure */ |
541 | data->ssch_rsch_count = cmb.ssch_rsch_count; | 753 | data->ssch_rsch_count = cmb->ssch_rsch_count; |
542 | data->sample_count = cmb.sample_count; | 754 | data->sample_count = cmb->sample_count; |
543 | 755 | ||
544 | /* time fields are converted to nanoseconds while copying */ | 756 | /* time fields are converted to nanoseconds while copying */ |
545 | data->device_connect_time = time_to_nsec(cmb.device_connect_time); | 757 | data->device_connect_time = time_to_nsec(cmb->device_connect_time); |
546 | data->function_pending_time = time_to_nsec(cmb.function_pending_time); | 758 | data->function_pending_time = time_to_nsec(cmb->function_pending_time); |
547 | data->device_disconnect_time = time_to_nsec(cmb.device_disconnect_time); | 759 | data->device_disconnect_time = |
760 | time_to_nsec(cmb->device_disconnect_time); | ||
548 | data->control_unit_queuing_time | 761 | data->control_unit_queuing_time |
549 | = time_to_nsec(cmb.control_unit_queuing_time); | 762 | = time_to_nsec(cmb->control_unit_queuing_time); |
550 | data->device_active_only_time | 763 | data->device_active_only_time |
551 | = time_to_nsec(cmb.device_active_only_time); | 764 | = time_to_nsec(cmb->device_active_only_time); |
765 | ret = 0; | ||
766 | out: | ||
767 | spin_unlock_irqrestore(cdev->ccwlock, flags); | ||
768 | return ret; | ||
769 | } | ||
552 | 770 | ||
553 | return 0; | 771 | static void reset_cmb(struct ccw_device *cdev) |
772 | { | ||
773 | cmf_generic_reset(cdev); | ||
554 | } | 774 | } |
555 | 775 | ||
556 | static void | 776 | static void * align_cmb(void *area) |
557 | reset_cmb(struct ccw_device *cdev) | ||
558 | { | 777 | { |
559 | struct cmb *cmb; | 778 | return area; |
560 | spin_lock_irq(cdev->ccwlock); | ||
561 | cmb = cdev->private->cmb; | ||
562 | if (cmb) | ||
563 | memset (cmb, 0, sizeof (*cmb)); | ||
564 | cdev->private->cmb_start_time = get_clock(); | ||
565 | spin_unlock_irq(cdev->ccwlock); | ||
566 | } | 779 | } |
567 | 780 | ||
568 | static struct attribute_group cmf_attr_group; | 781 | static struct attribute_group cmf_attr_group; |
@@ -574,6 +787,7 @@ static struct cmb_operations cmbops_basic = { | |||
574 | .read = read_cmb, | 787 | .read = read_cmb, |
575 | .readall = readall_cmb, | 788 | .readall = readall_cmb, |
576 | .reset = reset_cmb, | 789 | .reset = reset_cmb, |
790 | .align = align_cmb, | ||
577 | .attr_group = &cmf_attr_group, | 791 | .attr_group = &cmf_attr_group, |
578 | }; | 792 | }; |
579 | 793 | ||
@@ -610,22 +824,34 @@ static inline struct cmbe* cmbe_align(struct cmbe *c) | |||
610 | return (struct cmbe*)addr; | 824 | return (struct cmbe*)addr; |
611 | } | 825 | } |
612 | 826 | ||
613 | static int | 827 | static int alloc_cmbe (struct ccw_device *cdev) |
614 | alloc_cmbe (struct ccw_device *cdev) | ||
615 | { | 828 | { |
616 | struct cmbe *cmbe; | 829 | struct cmbe *cmbe; |
617 | cmbe = kmalloc (sizeof (*cmbe) * 2, GFP_KERNEL); | 830 | struct cmb_data *cmb_data; |
831 | int ret; | ||
832 | |||
833 | cmbe = kzalloc (sizeof (*cmbe) * 2, GFP_KERNEL); | ||
618 | if (!cmbe) | 834 | if (!cmbe) |
619 | return -ENOMEM; | 835 | return -ENOMEM; |
620 | 836 | cmb_data = kzalloc(sizeof(struct cmb_data), GFP_KERNEL); | |
837 | if (!cmb_data) { | ||
838 | ret = -ENOMEM; | ||
839 | goto out_free; | ||
840 | } | ||
841 | cmb_data->last_block = kzalloc(sizeof(struct cmbe), GFP_KERNEL); | ||
842 | if (!cmb_data->last_block) { | ||
843 | ret = -ENOMEM; | ||
844 | goto out_free; | ||
845 | } | ||
846 | cmb_data->size = sizeof(struct cmbe); | ||
621 | spin_lock_irq(cdev->ccwlock); | 847 | spin_lock_irq(cdev->ccwlock); |
622 | if (cdev->private->cmb) { | 848 | if (cdev->private->cmb) { |
623 | kfree(cmbe); | ||
624 | spin_unlock_irq(cdev->ccwlock); | 849 | spin_unlock_irq(cdev->ccwlock); |
625 | return -EBUSY; | 850 | ret = -EBUSY; |
851 | goto out_free; | ||
626 | } | 852 | } |
627 | 853 | cmb_data->hw_block = cmbe; | |
628 | cdev->private->cmb = cmbe; | 854 | cdev->private->cmb = cmb_data; |
629 | spin_unlock_irq(cdev->ccwlock); | 855 | spin_unlock_irq(cdev->ccwlock); |
630 | 856 | ||
631 | /* activate global measurement if this is the first channel */ | 857 | /* activate global measurement if this is the first channel */ |
@@ -636,14 +862,24 @@ alloc_cmbe (struct ccw_device *cdev) | |||
636 | spin_unlock(&cmb_area.lock); | 862 | spin_unlock(&cmb_area.lock); |
637 | 863 | ||
638 | return 0; | 864 | return 0; |
865 | out_free: | ||
866 | if (cmb_data) | ||
867 | kfree(cmb_data->last_block); | ||
868 | kfree(cmb_data); | ||
869 | kfree(cmbe); | ||
870 | return ret; | ||
639 | } | 871 | } |
640 | 872 | ||
641 | static void | 873 | static void free_cmbe (struct ccw_device *cdev) |
642 | free_cmbe (struct ccw_device *cdev) | ||
643 | { | 874 | { |
875 | struct cmb_data *cmb_data; | ||
876 | |||
644 | spin_lock_irq(cdev->ccwlock); | 877 | spin_lock_irq(cdev->ccwlock); |
645 | kfree(cdev->private->cmb); | 878 | cmb_data = cdev->private->cmb; |
646 | cdev->private->cmb = NULL; | 879 | cdev->private->cmb = NULL; |
880 | if (cmb_data) | ||
881 | kfree(cmb_data->last_block); | ||
882 | kfree(cmb_data); | ||
647 | spin_unlock_irq(cdev->ccwlock); | 883 | spin_unlock_irq(cdev->ccwlock); |
648 | 884 | ||
649 | /* deactivate global measurement if this is the last channel */ | 885 | /* deactivate global measurement if this is the last channel */ |
@@ -654,89 +890,105 @@ free_cmbe (struct ccw_device *cdev) | |||
654 | spin_unlock(&cmb_area.lock); | 890 | spin_unlock(&cmb_area.lock); |
655 | } | 891 | } |
656 | 892 | ||
657 | static int | 893 | static int set_cmbe(struct ccw_device *cdev, u32 mme) |
658 | set_cmbe(struct ccw_device *cdev, u32 mme) | ||
659 | { | 894 | { |
660 | unsigned long mba; | 895 | unsigned long mba; |
896 | struct cmb_data *cmb_data; | ||
897 | unsigned long flags; | ||
661 | 898 | ||
662 | if (!cdev->private->cmb) | 899 | spin_lock_irqsave(cdev->ccwlock, flags); |
900 | if (!cdev->private->cmb) { | ||
901 | spin_unlock_irqrestore(cdev->ccwlock, flags); | ||
663 | return -EINVAL; | 902 | return -EINVAL; |
664 | mba = mme ? (unsigned long) cmbe_align(cdev->private->cmb) : 0; | 903 | } |
904 | cmb_data = cdev->private->cmb; | ||
905 | mba = mme ? (unsigned long) cmbe_align(cmb_data->hw_block) : 0; | ||
906 | spin_unlock_irqrestore(cdev->ccwlock, flags); | ||
665 | 907 | ||
666 | return set_schib_wait(cdev, mme, 1, mba); | 908 | return set_schib_wait(cdev, mme, 1, mba); |
667 | } | 909 | } |
668 | 910 | ||
669 | 911 | ||
670 | u64 | 912 | static u64 read_cmbe (struct ccw_device *cdev, int index) |
671 | read_cmbe (struct ccw_device *cdev, int index) | ||
672 | { | 913 | { |
673 | /* yes, we have to put it on the stack | 914 | struct cmbe *cmb; |
674 | * because the cmb must only be accessed | 915 | struct cmb_data *cmb_data; |
675 | * atomically, e.g. with mvc */ | ||
676 | struct cmbe cmb; | ||
677 | unsigned long flags; | ||
678 | u32 val; | 916 | u32 val; |
917 | int ret; | ||
918 | unsigned long flags; | ||
679 | 919 | ||
680 | spin_lock_irqsave(cdev->ccwlock, flags); | 920 | ret = cmf_cmb_copy_wait(cdev); |
681 | if (!cdev->private->cmb) { | 921 | if (ret < 0) |
682 | spin_unlock_irqrestore(cdev->ccwlock, flags); | ||
683 | return 0; | 922 | return 0; |
684 | } | ||
685 | 923 | ||
686 | cmb = *cmbe_align(cdev->private->cmb); | 924 | spin_lock_irqsave(cdev->ccwlock, flags); |
687 | spin_unlock_irqrestore(cdev->ccwlock, flags); | 925 | cmb_data = cdev->private->cmb; |
926 | if (!cmb_data) { | ||
927 | ret = 0; | ||
928 | goto out; | ||
929 | } | ||
930 | cmb = cmb_data->last_block; | ||
688 | 931 | ||
689 | switch (index) { | 932 | switch (index) { |
690 | case cmb_ssch_rsch_count: | 933 | case cmb_ssch_rsch_count: |
691 | return cmb.ssch_rsch_count; | 934 | ret = cmb->ssch_rsch_count; |
935 | goto out; | ||
692 | case cmb_sample_count: | 936 | case cmb_sample_count: |
693 | return cmb.sample_count; | 937 | ret = cmb->sample_count; |
938 | goto out; | ||
694 | case cmb_device_connect_time: | 939 | case cmb_device_connect_time: |
695 | val = cmb.device_connect_time; | 940 | val = cmb->device_connect_time; |
696 | break; | 941 | break; |
697 | case cmb_function_pending_time: | 942 | case cmb_function_pending_time: |
698 | val = cmb.function_pending_time; | 943 | val = cmb->function_pending_time; |
699 | break; | 944 | break; |
700 | case cmb_device_disconnect_time: | 945 | case cmb_device_disconnect_time: |
701 | val = cmb.device_disconnect_time; | 946 | val = cmb->device_disconnect_time; |
702 | break; | 947 | break; |
703 | case cmb_control_unit_queuing_time: | 948 | case cmb_control_unit_queuing_time: |
704 | val = cmb.control_unit_queuing_time; | 949 | val = cmb->control_unit_queuing_time; |
705 | break; | 950 | break; |
706 | case cmb_device_active_only_time: | 951 | case cmb_device_active_only_time: |
707 | val = cmb.device_active_only_time; | 952 | val = cmb->device_active_only_time; |
708 | break; | 953 | break; |
709 | case cmb_device_busy_time: | 954 | case cmb_device_busy_time: |
710 | val = cmb.device_busy_time; | 955 | val = cmb->device_busy_time; |
711 | break; | 956 | break; |
712 | case cmb_initial_command_response_time: | 957 | case cmb_initial_command_response_time: |
713 | val = cmb.initial_command_response_time; | 958 | val = cmb->initial_command_response_time; |
714 | break; | 959 | break; |
715 | default: | 960 | default: |
716 | return 0; | 961 | ret = 0; |
962 | goto out; | ||
717 | } | 963 | } |
718 | return time_to_avg_nsec(val, cmb.sample_count); | 964 | ret = time_to_avg_nsec(val, cmb->sample_count); |
965 | out: | ||
966 | spin_unlock_irqrestore(cdev->ccwlock, flags); | ||
967 | return ret; | ||
719 | } | 968 | } |
720 | 969 | ||
721 | static int | 970 | static int readall_cmbe (struct ccw_device *cdev, struct cmbdata *data) |
722 | readall_cmbe (struct ccw_device *cdev, struct cmbdata *data) | ||
723 | { | 971 | { |
724 | /* yes, we have to put it on the stack | 972 | struct cmbe *cmb; |
725 | * because the cmb must only be accessed | 973 | struct cmb_data *cmb_data; |
726 | * atomically, e.g. with mvc */ | ||
727 | struct cmbe cmb; | ||
728 | unsigned long flags; | ||
729 | u64 time; | 974 | u64 time; |
975 | unsigned long flags; | ||
976 | int ret; | ||
730 | 977 | ||
978 | ret = cmf_cmb_copy_wait(cdev); | ||
979 | if (ret < 0) | ||
980 | return ret; | ||
731 | spin_lock_irqsave(cdev->ccwlock, flags); | 981 | spin_lock_irqsave(cdev->ccwlock, flags); |
732 | if (!cdev->private->cmb) { | 982 | cmb_data = cdev->private->cmb; |
733 | spin_unlock_irqrestore(cdev->ccwlock, flags); | 983 | if (!cmb_data) { |
734 | return -ENODEV; | 984 | ret = -ENODEV; |
985 | goto out; | ||
735 | } | 986 | } |
736 | 987 | if (cmb_data->last_update == 0) { | |
737 | cmb = *cmbe_align(cdev->private->cmb); | 988 | ret = -EAGAIN; |
738 | time = get_clock() - cdev->private->cmb_start_time; | 989 | goto out; |
739 | spin_unlock_irqrestore(cdev->ccwlock, flags); | 990 | } |
991 | time = cmb_data->last_update - cdev->private->cmb_start_time; | ||
740 | 992 | ||
741 | memset (data, 0, sizeof(struct cmbdata)); | 993 | memset (data, 0, sizeof(struct cmbdata)); |
742 | 994 | ||
@@ -746,35 +998,38 @@ readall_cmbe (struct ccw_device *cdev, struct cmbdata *data) | |||
746 | /* conver to nanoseconds */ | 998 | /* conver to nanoseconds */ |
747 | data->elapsed_time = (time * 1000) >> 12; | 999 | data->elapsed_time = (time * 1000) >> 12; |
748 | 1000 | ||
1001 | cmb = cmb_data->last_block; | ||
749 | /* copy data to new structure */ | 1002 | /* copy data to new structure */ |
750 | data->ssch_rsch_count = cmb.ssch_rsch_count; | 1003 | data->ssch_rsch_count = cmb->ssch_rsch_count; |
751 | data->sample_count = cmb.sample_count; | 1004 | data->sample_count = cmb->sample_count; |
752 | 1005 | ||
753 | /* time fields are converted to nanoseconds while copying */ | 1006 | /* time fields are converted to nanoseconds while copying */ |
754 | data->device_connect_time = time_to_nsec(cmb.device_connect_time); | 1007 | data->device_connect_time = time_to_nsec(cmb->device_connect_time); |
755 | data->function_pending_time = time_to_nsec(cmb.function_pending_time); | 1008 | data->function_pending_time = time_to_nsec(cmb->function_pending_time); |
756 | data->device_disconnect_time = time_to_nsec(cmb.device_disconnect_time); | 1009 | data->device_disconnect_time = |
1010 | time_to_nsec(cmb->device_disconnect_time); | ||
757 | data->control_unit_queuing_time | 1011 | data->control_unit_queuing_time |
758 | = time_to_nsec(cmb.control_unit_queuing_time); | 1012 | = time_to_nsec(cmb->control_unit_queuing_time); |
759 | data->device_active_only_time | 1013 | data->device_active_only_time |
760 | = time_to_nsec(cmb.device_active_only_time); | 1014 | = time_to_nsec(cmb->device_active_only_time); |
761 | data->device_busy_time = time_to_nsec(cmb.device_busy_time); | 1015 | data->device_busy_time = time_to_nsec(cmb->device_busy_time); |
762 | data->initial_command_response_time | 1016 | data->initial_command_response_time |
763 | = time_to_nsec(cmb.initial_command_response_time); | 1017 | = time_to_nsec(cmb->initial_command_response_time); |
764 | 1018 | ||
765 | return 0; | 1019 | ret = 0; |
1020 | out: | ||
1021 | spin_unlock_irqrestore(cdev->ccwlock, flags); | ||
1022 | return ret; | ||
766 | } | 1023 | } |
767 | 1024 | ||
768 | static void | 1025 | static void reset_cmbe(struct ccw_device *cdev) |
769 | reset_cmbe(struct ccw_device *cdev) | ||
770 | { | 1026 | { |
771 | struct cmbe *cmb; | 1027 | cmf_generic_reset(cdev); |
772 | spin_lock_irq(cdev->ccwlock); | 1028 | } |
773 | cmb = cmbe_align(cdev->private->cmb); | 1029 | |
774 | if (cmb) | 1030 | static void * align_cmbe(void *area) |
775 | memset (cmb, 0, sizeof (*cmb)); | 1031 | { |
776 | cdev->private->cmb_start_time = get_clock(); | 1032 | return cmbe_align(area); |
777 | spin_unlock_irq(cdev->ccwlock); | ||
778 | } | 1033 | } |
779 | 1034 | ||
780 | static struct attribute_group cmf_attr_group_ext; | 1035 | static struct attribute_group cmf_attr_group_ext; |
@@ -786,6 +1041,7 @@ static struct cmb_operations cmbops_extended = { | |||
786 | .read = read_cmbe, | 1041 | .read = read_cmbe, |
787 | .readall = readall_cmbe, | 1042 | .readall = readall_cmbe, |
788 | .reset = reset_cmbe, | 1043 | .reset = reset_cmbe, |
1044 | .align = align_cmbe, | ||
789 | .attr_group = &cmf_attr_group_ext, | 1045 | .attr_group = &cmf_attr_group_ext, |
790 | }; | 1046 | }; |
791 | 1047 | ||
@@ -803,14 +1059,19 @@ cmb_show_avg_sample_interval(struct device *dev, struct device_attribute *attr, | |||
803 | struct ccw_device *cdev; | 1059 | struct ccw_device *cdev; |
804 | long interval; | 1060 | long interval; |
805 | unsigned long count; | 1061 | unsigned long count; |
1062 | struct cmb_data *cmb_data; | ||
806 | 1063 | ||
807 | cdev = to_ccwdev(dev); | 1064 | cdev = to_ccwdev(dev); |
808 | interval = get_clock() - cdev->private->cmb_start_time; | ||
809 | count = cmf_read(cdev, cmb_sample_count); | 1065 | count = cmf_read(cdev, cmb_sample_count); |
810 | if (count) | 1066 | spin_lock_irq(cdev->ccwlock); |
1067 | cmb_data = cdev->private->cmb; | ||
1068 | if (count) { | ||
1069 | interval = cmb_data->last_update - | ||
1070 | cdev->private->cmb_start_time; | ||
811 | interval /= count; | 1071 | interval /= count; |
812 | else | 1072 | } else |
813 | interval = -1; | 1073 | interval = -1; |
1074 | spin_unlock_irq(cdev->ccwlock); | ||
814 | return sprintf(buf, "%ld\n", interval); | 1075 | return sprintf(buf, "%ld\n", interval); |
815 | } | 1076 | } |
816 | 1077 | ||
@@ -823,7 +1084,10 @@ cmb_show_avg_utilization(struct device *dev, struct device_attribute *attr, char | |||
823 | int ret; | 1084 | int ret; |
824 | 1085 | ||
825 | ret = cmf_readall(to_ccwdev(dev), &data); | 1086 | ret = cmf_readall(to_ccwdev(dev), &data); |
826 | if (ret) | 1087 | if (ret == -EAGAIN || ret == -ENODEV) |
1088 | /* No data (yet/currently) available to use for calculation. */ | ||
1089 | return sprintf(buf, "n/a\n"); | ||
1090 | else if (ret) | ||
827 | return ret; | 1091 | return ret; |
828 | 1092 | ||
829 | utilization = data.device_connect_time + | 1093 | utilization = data.device_connect_time + |
@@ -982,6 +1246,13 @@ cmf_readall(struct ccw_device *cdev, struct cmbdata *data) | |||
982 | return cmbops->readall(cdev, data); | 1246 | return cmbops->readall(cdev, data); |
983 | } | 1247 | } |
984 | 1248 | ||
1249 | /* Reenable cmf when a disconnected device becomes available again. */ | ||
1250 | int cmf_reenable(struct ccw_device *cdev) | ||
1251 | { | ||
1252 | cmbops->reset(cdev); | ||
1253 | return cmbops->set(cdev, 2); | ||
1254 | } | ||
1255 | |||
985 | static int __init | 1256 | static int __init |
986 | init_cmf(void) | 1257 | init_cmf(void) |
987 | { | 1258 | { |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index 74ea8aac4b7d..1d3be80797f8 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -19,9 +19,11 @@ | |||
19 | #include "cio_debug.h" | 19 | #include "cio_debug.h" |
20 | #include "ioasm.h" | 20 | #include "ioasm.h" |
21 | #include "chsc.h" | 21 | #include "chsc.h" |
22 | #include "device.h" | ||
22 | 23 | ||
23 | int need_rescan = 0; | 24 | int need_rescan = 0; |
24 | int css_init_done = 0; | 25 | int css_init_done = 0; |
26 | static int need_reprobe = 0; | ||
25 | static int max_ssid = 0; | 27 | static int max_ssid = 0; |
26 | 28 | ||
27 | struct channel_subsystem *css[__MAX_CSSID + 1]; | 29 | struct channel_subsystem *css[__MAX_CSSID + 1]; |
@@ -339,6 +341,67 @@ typedef void (*workfunc)(void *); | |||
339 | DECLARE_WORK(slow_path_work, (workfunc)css_trigger_slow_path, NULL); | 341 | DECLARE_WORK(slow_path_work, (workfunc)css_trigger_slow_path, NULL); |
340 | struct workqueue_struct *slow_path_wq; | 342 | struct workqueue_struct *slow_path_wq; |
341 | 343 | ||
344 | /* Reprobe subchannel if unregistered. */ | ||
345 | static int reprobe_subchannel(struct subchannel_id schid, void *data) | ||
346 | { | ||
347 | struct subchannel *sch; | ||
348 | int ret; | ||
349 | |||
350 | CIO_DEBUG(KERN_INFO, 6, "cio: reprobe 0.%x.%04x\n", | ||
351 | schid.ssid, schid.sch_no); | ||
352 | if (need_reprobe) | ||
353 | return -EAGAIN; | ||
354 | |||
355 | sch = get_subchannel_by_schid(schid); | ||
356 | if (sch) { | ||
357 | /* Already known. */ | ||
358 | put_device(&sch->dev); | ||
359 | return 0; | ||
360 | } | ||
361 | |||
362 | ret = css_probe_device(schid); | ||
363 | switch (ret) { | ||
364 | case 0: | ||
365 | break; | ||
366 | case -ENXIO: | ||
367 | case -ENOMEM: | ||
368 | /* These should abort looping */ | ||
369 | break; | ||
370 | default: | ||
371 | ret = 0; | ||
372 | } | ||
373 | |||
374 | return ret; | ||
375 | } | ||
376 | |||
377 | /* Work function used to reprobe all unregistered subchannels. */ | ||
378 | static void reprobe_all(void *data) | ||
379 | { | ||
380 | int ret; | ||
381 | |||
382 | CIO_MSG_EVENT(2, "reprobe start\n"); | ||
383 | |||
384 | need_reprobe = 0; | ||
385 | /* Make sure initial subchannel scan is done. */ | ||
386 | wait_event(ccw_device_init_wq, | ||
387 | atomic_read(&ccw_device_init_count) == 0); | ||
388 | ret = for_each_subchannel(reprobe_subchannel, NULL); | ||
389 | |||
390 | CIO_MSG_EVENT(2, "reprobe done (rc=%d, need_reprobe=%d)\n", ret, | ||
391 | need_reprobe); | ||
392 | } | ||
393 | |||
394 | DECLARE_WORK(css_reprobe_work, reprobe_all, NULL); | ||
395 | |||
396 | /* Schedule reprobing of all unregistered subchannels. */ | ||
397 | void css_schedule_reprobe(void) | ||
398 | { | ||
399 | need_reprobe = 1; | ||
400 | queue_work(ccw_device_work, &css_reprobe_work); | ||
401 | } | ||
402 | |||
403 | EXPORT_SYMBOL_GPL(css_schedule_reprobe); | ||
404 | |||
342 | /* | 405 | /* |
343 | * Rescan for new devices. FIXME: This is slow. | 406 | * Rescan for new devices. FIXME: This is slow. |
344 | * This function is called when we have lost CRWs due to overflows and we have | 407 | * This function is called when we have lost CRWs due to overflows and we have |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 8e3053c2a451..eafde43e8410 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -133,8 +133,8 @@ struct css_driver io_subchannel_driver = { | |||
133 | 133 | ||
134 | struct workqueue_struct *ccw_device_work; | 134 | struct workqueue_struct *ccw_device_work; |
135 | struct workqueue_struct *ccw_device_notify_work; | 135 | struct workqueue_struct *ccw_device_notify_work; |
136 | static wait_queue_head_t ccw_device_init_wq; | 136 | wait_queue_head_t ccw_device_init_wq; |
137 | static atomic_t ccw_device_init_count; | 137 | atomic_t ccw_device_init_count; |
138 | 138 | ||
139 | static int __init | 139 | static int __init |
140 | init_ccw_bus_type (void) | 140 | init_ccw_bus_type (void) |
diff --git a/drivers/s390/cio/device.h b/drivers/s390/cio/device.h index 11587ebb7289..00be9a5b4acd 100644 --- a/drivers/s390/cio/device.h +++ b/drivers/s390/cio/device.h | |||
@@ -1,6 +1,10 @@ | |||
1 | #ifndef S390_DEVICE_H | 1 | #ifndef S390_DEVICE_H |
2 | #define S390_DEVICE_H | 2 | #define S390_DEVICE_H |
3 | 3 | ||
4 | #include <asm/ccwdev.h> | ||
5 | #include <asm/atomic.h> | ||
6 | #include <linux/wait.h> | ||
7 | |||
4 | /* | 8 | /* |
5 | * states of the device statemachine | 9 | * states of the device statemachine |
6 | */ | 10 | */ |
@@ -23,6 +27,7 @@ enum dev_state { | |||
23 | DEV_STATE_DISCONNECTED, | 27 | DEV_STATE_DISCONNECTED, |
24 | DEV_STATE_DISCONNECTED_SENSE_ID, | 28 | DEV_STATE_DISCONNECTED_SENSE_ID, |
25 | DEV_STATE_CMFCHANGE, | 29 | DEV_STATE_CMFCHANGE, |
30 | DEV_STATE_CMFUPDATE, | ||
26 | /* last element! */ | 31 | /* last element! */ |
27 | NR_DEV_STATES | 32 | NR_DEV_STATES |
28 | }; | 33 | }; |
@@ -67,6 +72,8 @@ dev_fsm_final_state(struct ccw_device *cdev) | |||
67 | 72 | ||
68 | extern struct workqueue_struct *ccw_device_work; | 73 | extern struct workqueue_struct *ccw_device_work; |
69 | extern struct workqueue_struct *ccw_device_notify_work; | 74 | extern struct workqueue_struct *ccw_device_notify_work; |
75 | extern wait_queue_head_t ccw_device_init_wq; | ||
76 | extern atomic_t ccw_device_init_count; | ||
70 | 77 | ||
71 | void io_subchannel_recog_done(struct ccw_device *cdev); | 78 | void io_subchannel_recog_done(struct ccw_device *cdev); |
72 | 79 | ||
@@ -112,5 +119,8 @@ int ccw_device_stlck(struct ccw_device *); | |||
112 | void ccw_device_set_timeout(struct ccw_device *, int); | 119 | void ccw_device_set_timeout(struct ccw_device *, int); |
113 | extern struct subchannel_id ccw_device_get_subchannel_id(struct ccw_device *); | 120 | extern struct subchannel_id ccw_device_get_subchannel_id(struct ccw_device *); |
114 | 121 | ||
122 | /* Channel measurement facility related */ | ||
115 | void retry_set_schib(struct ccw_device *cdev); | 123 | void retry_set_schib(struct ccw_device *cdev); |
124 | void cmf_retry_copy_block(struct ccw_device *); | ||
125 | int cmf_reenable(struct ccw_device *); | ||
116 | #endif | 126 | #endif |
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index 49ec562d7f60..7d0dd72635eb 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c | |||
@@ -336,8 +336,11 @@ ccw_device_oper_notify(void *data) | |||
336 | if (!ret) | 336 | if (!ret) |
337 | /* Driver doesn't want device back. */ | 337 | /* Driver doesn't want device back. */ |
338 | ccw_device_do_unreg_rereg((void *)cdev); | 338 | ccw_device_do_unreg_rereg((void *)cdev); |
339 | else | 339 | else { |
340 | /* Reenable channel measurements, if needed. */ | ||
341 | cmf_reenable(cdev); | ||
340 | wake_up(&cdev->private->wait_q); | 342 | wake_up(&cdev->private->wait_q); |
343 | } | ||
341 | } | 344 | } |
342 | 345 | ||
343 | /* | 346 | /* |
@@ -861,6 +864,8 @@ ccw_device_clear_verify(struct ccw_device *cdev, enum dev_event dev_event) | |||
861 | irb = (struct irb *) __LC_IRB; | 864 | irb = (struct irb *) __LC_IRB; |
862 | /* Accumulate status. We don't do basic sense. */ | 865 | /* Accumulate status. We don't do basic sense. */ |
863 | ccw_device_accumulate_irb(cdev, irb); | 866 | ccw_device_accumulate_irb(cdev, irb); |
867 | /* Remember to clear irb to avoid residuals. */ | ||
868 | memset(&cdev->private->irb, 0, sizeof(struct irb)); | ||
864 | /* Try to start delayed device verification. */ | 869 | /* Try to start delayed device verification. */ |
865 | ccw_device_online_verify(cdev, 0); | 870 | ccw_device_online_verify(cdev, 0); |
866 | /* Note: Don't call handler for cio initiated clear! */ | 871 | /* Note: Don't call handler for cio initiated clear! */ |
@@ -1093,6 +1098,13 @@ ccw_device_change_cmfstate(struct ccw_device *cdev, enum dev_event dev_event) | |||
1093 | dev_fsm_event(cdev, dev_event); | 1098 | dev_fsm_event(cdev, dev_event); |
1094 | } | 1099 | } |
1095 | 1100 | ||
1101 | static void ccw_device_update_cmfblock(struct ccw_device *cdev, | ||
1102 | enum dev_event dev_event) | ||
1103 | { | ||
1104 | cmf_retry_copy_block(cdev); | ||
1105 | cdev->private->state = DEV_STATE_ONLINE; | ||
1106 | dev_fsm_event(cdev, dev_event); | ||
1107 | } | ||
1096 | 1108 | ||
1097 | static void | 1109 | static void |
1098 | ccw_device_quiesce_done(struct ccw_device *cdev, enum dev_event dev_event) | 1110 | ccw_device_quiesce_done(struct ccw_device *cdev, enum dev_event dev_event) |
@@ -1247,6 +1259,12 @@ fsm_func_t *dev_jumptable[NR_DEV_STATES][NR_DEV_EVENTS] = { | |||
1247 | [DEV_EVENT_TIMEOUT] = ccw_device_change_cmfstate, | 1259 | [DEV_EVENT_TIMEOUT] = ccw_device_change_cmfstate, |
1248 | [DEV_EVENT_VERIFY] = ccw_device_change_cmfstate, | 1260 | [DEV_EVENT_VERIFY] = ccw_device_change_cmfstate, |
1249 | }, | 1261 | }, |
1262 | [DEV_STATE_CMFUPDATE] = { | ||
1263 | [DEV_EVENT_NOTOPER] = ccw_device_update_cmfblock, | ||
1264 | [DEV_EVENT_INTERRUPT] = ccw_device_update_cmfblock, | ||
1265 | [DEV_EVENT_TIMEOUT] = ccw_device_update_cmfblock, | ||
1266 | [DEV_EVENT_VERIFY] = ccw_device_update_cmfblock, | ||
1267 | }, | ||
1250 | }; | 1268 | }; |
1251 | 1269 | ||
1252 | /* | 1270 | /* |
diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c index 795abb5a65ba..b266ad8e14ff 100644 --- a/drivers/s390/cio/device_ops.c +++ b/drivers/s390/cio/device_ops.c | |||
@@ -78,7 +78,8 @@ ccw_device_start_key(struct ccw_device *cdev, struct ccw1 *cpa, | |||
78 | return -ENODEV; | 78 | return -ENODEV; |
79 | if (cdev->private->state == DEV_STATE_NOT_OPER) | 79 | if (cdev->private->state == DEV_STATE_NOT_OPER) |
80 | return -ENODEV; | 80 | return -ENODEV; |
81 | if (cdev->private->state == DEV_STATE_VERIFY) { | 81 | if (cdev->private->state == DEV_STATE_VERIFY || |
82 | cdev->private->state == DEV_STATE_CLEAR_VERIFY) { | ||
82 | /* Remember to fake irb when finished. */ | 83 | /* Remember to fake irb when finished. */ |
83 | if (!cdev->private->flags.fake_irb) { | 84 | if (!cdev->private->flags.fake_irb) { |
84 | cdev->private->flags.fake_irb = 1; | 85 | cdev->private->flags.fake_irb = 1; |
@@ -270,7 +271,8 @@ ccw_device_wake_up(struct ccw_device *cdev, unsigned long ip, struct irb *irb) | |||
270 | * We didn't get channel end / device end. Check if path | 271 | * We didn't get channel end / device end. Check if path |
271 | * verification has been started; we can retry after it has | 272 | * verification has been started; we can retry after it has |
272 | * finished. We also retry unit checks except for command reject | 273 | * finished. We also retry unit checks except for command reject |
273 | * or intervention required. | 274 | * or intervention required. Also check for long busy |
275 | * conditions. | ||
274 | */ | 276 | */ |
275 | if (cdev->private->flags.doverify || | 277 | if (cdev->private->flags.doverify || |
276 | cdev->private->state == DEV_STATE_VERIFY) | 278 | cdev->private->state == DEV_STATE_VERIFY) |
@@ -279,6 +281,10 @@ ccw_device_wake_up(struct ccw_device *cdev, unsigned long ip, struct irb *irb) | |||
279 | !(irb->ecw[0] & | 281 | !(irb->ecw[0] & |
280 | (SNS0_CMD_REJECT | SNS0_INTERVENTION_REQ))) | 282 | (SNS0_CMD_REJECT | SNS0_INTERVENTION_REQ))) |
281 | cdev->private->intparm = -EAGAIN; | 283 | cdev->private->intparm = -EAGAIN; |
284 | else if ((irb->scsw.dstat & DEV_STAT_ATTENTION) && | ||
285 | (irb->scsw.dstat & DEV_STAT_DEV_END) && | ||
286 | (irb->scsw.dstat & DEV_STAT_UNIT_EXCEP)) | ||
287 | cdev->private->intparm = -EAGAIN; | ||
282 | else | 288 | else |
283 | cdev->private->intparm = -EIO; | 289 | cdev->private->intparm = -EIO; |
284 | 290 | ||
diff --git a/drivers/s390/s390mach.c b/drivers/s390/s390mach.c index f99e55308b32..8dc75002acbe 100644 --- a/drivers/s390/s390mach.c +++ b/drivers/s390/s390mach.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/errno.h> | 14 | #include <linux/errno.h> |
15 | #include <linux/workqueue.h> | 15 | #include <linux/workqueue.h> |
16 | #include <linux/time.h> | 16 | #include <linux/time.h> |
17 | #include <linux/kthread.h> | ||
17 | 18 | ||
18 | #include <asm/lowcore.h> | 19 | #include <asm/lowcore.h> |
19 | 20 | ||
@@ -56,8 +57,6 @@ s390_collect_crw_info(void *param) | |||
56 | unsigned int chain; | 57 | unsigned int chain; |
57 | 58 | ||
58 | sem = (struct semaphore *)param; | 59 | sem = (struct semaphore *)param; |
59 | /* Set a nice name. */ | ||
60 | daemonize("kmcheck"); | ||
61 | repeat: | 60 | repeat: |
62 | down_interruptible(sem); | 61 | down_interruptible(sem); |
63 | slow = 0; | 62 | slow = 0; |
@@ -516,7 +515,7 @@ arch_initcall(machine_check_init); | |||
516 | static int __init | 515 | static int __init |
517 | machine_check_crw_init (void) | 516 | machine_check_crw_init (void) |
518 | { | 517 | { |
519 | kernel_thread(s390_collect_crw_info, &m_sem, CLONE_FS|CLONE_FILES); | 518 | kthread_run(s390_collect_crw_info, &m_sem, "kmcheck"); |
520 | ctl_set_bit(14, 28); /* enable channel report MCH */ | 519 | ctl_set_bit(14, 28); /* enable channel report MCH */ |
521 | return 0; | 520 | return 0; |
522 | } | 521 | } |
diff --git a/drivers/scsi/sata_via.c b/drivers/scsi/sata_via.c index 67c3d2999775..501ce1791782 100644 --- a/drivers/scsi/sata_via.c +++ b/drivers/scsi/sata_via.c | |||
@@ -335,10 +335,10 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
335 | if ((pci_resource_start(pdev, i) == 0) || | 335 | if ((pci_resource_start(pdev, i) == 0) || |
336 | (pci_resource_len(pdev, i) < bar_sizes[i])) { | 336 | (pci_resource_len(pdev, i) < bar_sizes[i])) { |
337 | dev_printk(KERN_ERR, &pdev->dev, | 337 | dev_printk(KERN_ERR, &pdev->dev, |
338 | "invalid PCI BAR %u (sz 0x%lx, val 0x%lx)\n", | 338 | "invalid PCI BAR %u (sz 0x%llx, val 0x%llx)\n", |
339 | i, | 339 | i, |
340 | pci_resource_start(pdev, i), | 340 | (unsigned long long)pci_resource_start(pdev, i), |
341 | pci_resource_len(pdev, i)); | 341 | (unsigned long long)pci_resource_len(pdev, i)); |
342 | rc = -ENODEV; | 342 | rc = -ENODEV; |
343 | goto err_out_regions; | 343 | goto err_out_regions; |
344 | } | 344 | } |
diff --git a/drivers/serial/68328serial.c b/drivers/serial/68328serial.c index b88a7c1158af..bff94541991c 100644 --- a/drivers/serial/68328serial.c +++ b/drivers/serial/68328serial.c | |||
@@ -131,17 +131,6 @@ static int m68328_console_baud = CONSOLE_BAUD_RATE; | |||
131 | static int m68328_console_cbaud = DEFAULT_CBAUD; | 131 | static int m68328_console_cbaud = DEFAULT_CBAUD; |
132 | 132 | ||
133 | 133 | ||
134 | /* | ||
135 | * tmp_buf is used as a temporary buffer by serial_write. We need to | ||
136 | * lock it in case the memcpy_fromfs blocks while swapping in a page, | ||
137 | * and some other program tries to do a serial write at the same time. | ||
138 | * Since the lock will only come under contention when the system is | ||
139 | * swapping and available memory is low, it makes sense to share one | ||
140 | * buffer across all the serial ports, since it significantly saves | ||
141 | * memory if large numbers of serial ports are open. | ||
142 | */ | ||
143 | static unsigned char tmp_buf[SERIAL_XMIT_SIZE]; /* This is cheating */ | ||
144 | |||
145 | static inline int serial_paranoia_check(struct m68k_serial *info, | 134 | static inline int serial_paranoia_check(struct m68k_serial *info, |
146 | char *name, const char *routine) | 135 | char *name, const char *routine) |
147 | { | 136 | { |
@@ -211,16 +200,16 @@ static void rs_stop(struct tty_struct *tty) | |||
211 | if (serial_paranoia_check(info, tty->name, "rs_stop")) | 200 | if (serial_paranoia_check(info, tty->name, "rs_stop")) |
212 | return; | 201 | return; |
213 | 202 | ||
214 | save_flags(flags); cli(); | 203 | local_irq_save(flags); |
215 | uart->ustcnt &= ~USTCNT_TXEN; | 204 | uart->ustcnt &= ~USTCNT_TXEN; |
216 | restore_flags(flags); | 205 | local_irq_restore(flags); |
217 | } | 206 | } |
218 | 207 | ||
219 | static void rs_put_char(char ch) | 208 | static void rs_put_char(char ch) |
220 | { | 209 | { |
221 | int flags, loops = 0; | 210 | int flags, loops = 0; |
222 | 211 | ||
223 | save_flags(flags); cli(); | 212 | local_irq_save(flags); |
224 | 213 | ||
225 | while (!(UTX & UTX_TX_AVAIL) && (loops < 1000)) { | 214 | while (!(UTX & UTX_TX_AVAIL) && (loops < 1000)) { |
226 | loops++; | 215 | loops++; |
@@ -229,7 +218,7 @@ static void rs_put_char(char ch) | |||
229 | 218 | ||
230 | UTX_TXDATA = ch; | 219 | UTX_TXDATA = ch; |
231 | udelay(5); | 220 | udelay(5); |
232 | restore_flags(flags); | 221 | local_irq_restore(flags); |
233 | } | 222 | } |
234 | 223 | ||
235 | static void rs_start(struct tty_struct *tty) | 224 | static void rs_start(struct tty_struct *tty) |
@@ -241,7 +230,7 @@ static void rs_start(struct tty_struct *tty) | |||
241 | if (serial_paranoia_check(info, tty->name, "rs_start")) | 230 | if (serial_paranoia_check(info, tty->name, "rs_start")) |
242 | return; | 231 | return; |
243 | 232 | ||
244 | save_flags(flags); cli(); | 233 | local_irq_save(flags); |
245 | if (info->xmit_cnt && info->xmit_buf && !(uart->ustcnt & USTCNT_TXEN)) { | 234 | if (info->xmit_cnt && info->xmit_buf && !(uart->ustcnt & USTCNT_TXEN)) { |
246 | #ifdef USE_INTS | 235 | #ifdef USE_INTS |
247 | uart->ustcnt |= USTCNT_TXEN | USTCNT_TX_INTR_MASK; | 236 | uart->ustcnt |= USTCNT_TXEN | USTCNT_TX_INTR_MASK; |
@@ -249,7 +238,7 @@ static void rs_start(struct tty_struct *tty) | |||
249 | uart->ustcnt |= USTCNT_TXEN; | 238 | uart->ustcnt |= USTCNT_TXEN; |
250 | #endif | 239 | #endif |
251 | } | 240 | } |
252 | restore_flags(flags); | 241 | local_irq_restore(flags); |
253 | } | 242 | } |
254 | 243 | ||
255 | /* Drop into either the boot monitor or kadb upon receiving a break | 244 | /* Drop into either the boot monitor or kadb upon receiving a break |
@@ -327,14 +316,6 @@ static void receive_chars(struct m68k_serial *info, struct pt_regs *regs, | |||
327 | if(!tty) | 316 | if(!tty) |
328 | goto clear_and_exit; | 317 | goto clear_and_exit; |
329 | 318 | ||
330 | /* | ||
331 | * Make sure that we do not overflow the buffer | ||
332 | */ | ||
333 | if (tty_request_buffer_room(tty, 1) == 0) { | ||
334 | tty_schedule_flip(tty); | ||
335 | return; | ||
336 | } | ||
337 | |||
338 | flag = TTY_NORMAL; | 319 | flag = TTY_NORMAL; |
339 | 320 | ||
340 | if(rx & URX_PARITY_ERROR) { | 321 | if(rx & URX_PARITY_ERROR) { |
@@ -473,7 +454,7 @@ static int startup(struct m68k_serial * info) | |||
473 | return -ENOMEM; | 454 | return -ENOMEM; |
474 | } | 455 | } |
475 | 456 | ||
476 | save_flags(flags); cli(); | 457 | local_irq_save(flags); |
477 | 458 | ||
478 | /* | 459 | /* |
479 | * Clear the FIFO buffers and disable them | 460 | * Clear the FIFO buffers and disable them |
@@ -506,7 +487,7 @@ static int startup(struct m68k_serial * info) | |||
506 | change_speed(info); | 487 | change_speed(info); |
507 | 488 | ||
508 | info->flags |= S_INITIALIZED; | 489 | info->flags |= S_INITIALIZED; |
509 | restore_flags(flags); | 490 | local_irq_restore(flags); |
510 | return 0; | 491 | return 0; |
511 | } | 492 | } |
512 | 493 | ||
@@ -523,7 +504,7 @@ static void shutdown(struct m68k_serial * info) | |||
523 | if (!(info->flags & S_INITIALIZED)) | 504 | if (!(info->flags & S_INITIALIZED)) |
524 | return; | 505 | return; |
525 | 506 | ||
526 | save_flags(flags); cli(); /* Disable interrupts */ | 507 | local_irq_save(flags); |
527 | 508 | ||
528 | if (info->xmit_buf) { | 509 | if (info->xmit_buf) { |
529 | free_page((unsigned long) info->xmit_buf); | 510 | free_page((unsigned long) info->xmit_buf); |
@@ -534,7 +515,7 @@ static void shutdown(struct m68k_serial * info) | |||
534 | set_bit(TTY_IO_ERROR, &info->tty->flags); | 515 | set_bit(TTY_IO_ERROR, &info->tty->flags); |
535 | 516 | ||
536 | info->flags &= ~S_INITIALIZED; | 517 | info->flags &= ~S_INITIALIZED; |
537 | restore_flags(flags); | 518 | local_irq_restore(flags); |
538 | } | 519 | } |
539 | 520 | ||
540 | struct { | 521 | struct { |
@@ -655,24 +636,24 @@ static void rs_fair_output(void) | |||
655 | if (info == 0) return; | 636 | if (info == 0) return; |
656 | if (info->xmit_buf == 0) return; | 637 | if (info->xmit_buf == 0) return; |
657 | 638 | ||
658 | save_flags(flags); cli(); | 639 | local_irq_save(flags); |
659 | left = info->xmit_cnt; | 640 | left = info->xmit_cnt; |
660 | while (left != 0) { | 641 | while (left != 0) { |
661 | c = info->xmit_buf[info->xmit_tail]; | 642 | c = info->xmit_buf[info->xmit_tail]; |
662 | info->xmit_tail = (info->xmit_tail+1) & (SERIAL_XMIT_SIZE-1); | 643 | info->xmit_tail = (info->xmit_tail+1) & (SERIAL_XMIT_SIZE-1); |
663 | info->xmit_cnt--; | 644 | info->xmit_cnt--; |
664 | restore_flags(flags); | 645 | local_irq_restore(flags); |
665 | 646 | ||
666 | rs_put_char(c); | 647 | rs_put_char(c); |
667 | 648 | ||
668 | save_flags(flags); cli(); | 649 | local_irq_save(flags); |
669 | left = min(info->xmit_cnt, left-1); | 650 | left = min(info->xmit_cnt, left-1); |
670 | } | 651 | } |
671 | 652 | ||
672 | /* Last character is being transmitted now (hopefully). */ | 653 | /* Last character is being transmitted now (hopefully). */ |
673 | udelay(5); | 654 | udelay(5); |
674 | 655 | ||
675 | restore_flags(flags); | 656 | local_irq_restore(flags); |
676 | return; | 657 | return; |
677 | } | 658 | } |
678 | 659 | ||
@@ -720,11 +701,11 @@ static void rs_flush_chars(struct tty_struct *tty) | |||
720 | #endif | 701 | #endif |
721 | 702 | ||
722 | /* Enable transmitter */ | 703 | /* Enable transmitter */ |
723 | save_flags(flags); cli(); | 704 | local_irq_save(flags); |
724 | 705 | ||
725 | if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped || | 706 | if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped || |
726 | !info->xmit_buf) { | 707 | !info->xmit_buf) { |
727 | restore_flags(flags); | 708 | local_irq_restore(flags); |
728 | return; | 709 | return; |
729 | } | 710 | } |
730 | 711 | ||
@@ -749,7 +730,7 @@ static void rs_flush_chars(struct tty_struct *tty) | |||
749 | while (!(uart->utx.w & UTX_TX_AVAIL)) udelay(5); | 730 | while (!(uart->utx.w & UTX_TX_AVAIL)) udelay(5); |
750 | } | 731 | } |
751 | #endif | 732 | #endif |
752 | restore_flags(flags); | 733 | local_irq_restore(flags); |
753 | } | 734 | } |
754 | 735 | ||
755 | extern void console_printn(const char * b, int count); | 736 | extern void console_printn(const char * b, int count); |
@@ -768,18 +749,22 @@ static int rs_write(struct tty_struct * tty, | |||
768 | if (!tty || !info->xmit_buf) | 749 | if (!tty || !info->xmit_buf) |
769 | return 0; | 750 | return 0; |
770 | 751 | ||
771 | save_flags(flags); | 752 | local_save_flags(flags); |
772 | while (1) { | 753 | while (1) { |
773 | cli(); | 754 | local_irq_disable(); |
774 | c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, | 755 | c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, |
775 | SERIAL_XMIT_SIZE - info->xmit_head)); | 756 | SERIAL_XMIT_SIZE - info->xmit_head)); |
757 | local_irq_restore(flags); | ||
758 | |||
776 | if (c <= 0) | 759 | if (c <= 0) |
777 | break; | 760 | break; |
778 | 761 | ||
779 | memcpy(info->xmit_buf + info->xmit_head, buf, c); | 762 | memcpy(info->xmit_buf + info->xmit_head, buf, c); |
763 | |||
764 | local_irq_disable(); | ||
780 | info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE-1); | 765 | info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE-1); |
781 | info->xmit_cnt += c; | 766 | info->xmit_cnt += c; |
782 | restore_flags(flags); | 767 | local_irq_restore(flags); |
783 | buf += c; | 768 | buf += c; |
784 | count -= c; | 769 | count -= c; |
785 | total += c; | 770 | total += c; |
@@ -787,7 +772,7 @@ static int rs_write(struct tty_struct * tty, | |||
787 | 772 | ||
788 | if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped) { | 773 | if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped) { |
789 | /* Enable transmitter */ | 774 | /* Enable transmitter */ |
790 | cli(); | 775 | local_irq_disable(); |
791 | #ifndef USE_INTS | 776 | #ifndef USE_INTS |
792 | while(info->xmit_cnt) { | 777 | while(info->xmit_cnt) { |
793 | #endif | 778 | #endif |
@@ -807,9 +792,9 @@ static int rs_write(struct tty_struct * tty, | |||
807 | #ifndef USE_INTS | 792 | #ifndef USE_INTS |
808 | } | 793 | } |
809 | #endif | 794 | #endif |
810 | restore_flags(flags); | 795 | local_irq_restore(flags); |
811 | } | 796 | } |
812 | restore_flags(flags); | 797 | |
813 | return total; | 798 | return total; |
814 | } | 799 | } |
815 | 800 | ||
@@ -838,12 +823,13 @@ static int rs_chars_in_buffer(struct tty_struct *tty) | |||
838 | static void rs_flush_buffer(struct tty_struct *tty) | 823 | static void rs_flush_buffer(struct tty_struct *tty) |
839 | { | 824 | { |
840 | struct m68k_serial *info = (struct m68k_serial *)tty->driver_data; | 825 | struct m68k_serial *info = (struct m68k_serial *)tty->driver_data; |
826 | unsigned long flags; | ||
841 | 827 | ||
842 | if (serial_paranoia_check(info, tty->name, "rs_flush_buffer")) | 828 | if (serial_paranoia_check(info, tty->name, "rs_flush_buffer")) |
843 | return; | 829 | return; |
844 | cli(); | 830 | local_irq_save(flags); |
845 | info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; | 831 | info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; |
846 | sti(); | 832 | local_irq_restore(flags); |
847 | tty_wakeup(tty); | 833 | tty_wakeup(tty); |
848 | } | 834 | } |
849 | 835 | ||
@@ -973,14 +959,15 @@ static int get_lsr_info(struct m68k_serial * info, unsigned int *value) | |||
973 | m68328_uart *uart = &uart_addr[info->line]; | 959 | m68328_uart *uart = &uart_addr[info->line]; |
974 | #endif | 960 | #endif |
975 | unsigned char status; | 961 | unsigned char status; |
962 | unsigned long flags; | ||
976 | 963 | ||
977 | cli(); | 964 | local_irq_save(flags); |
978 | #ifdef CONFIG_SERIAL_68328_RTS_CTS | 965 | #ifdef CONFIG_SERIAL_68328_RTS_CTS |
979 | status = (uart->utx.w & UTX_CTS_STAT) ? 1 : 0; | 966 | status = (uart->utx.w & UTX_CTS_STAT) ? 1 : 0; |
980 | #else | 967 | #else |
981 | status = 0; | 968 | status = 0; |
982 | #endif | 969 | #endif |
983 | sti(); | 970 | local_irq_restore(flags); |
984 | put_user(status,value); | 971 | put_user(status,value); |
985 | return 0; | 972 | return 0; |
986 | } | 973 | } |
@@ -994,14 +981,13 @@ static void send_break(struct m68k_serial * info, unsigned int duration) | |||
994 | unsigned long flags; | 981 | unsigned long flags; |
995 | if (!info->port) | 982 | if (!info->port) |
996 | return; | 983 | return; |
997 | save_flags(flags); | 984 | local_irq_save(flags); |
998 | cli(); | ||
999 | #ifdef USE_INTS | 985 | #ifdef USE_INTS |
1000 | uart->utx.w |= UTX_SEND_BREAK; | 986 | uart->utx.w |= UTX_SEND_BREAK; |
1001 | msleep_interruptible(duration); | 987 | msleep_interruptible(duration); |
1002 | uart->utx.w &= ~UTX_SEND_BREAK; | 988 | uart->utx.w &= ~UTX_SEND_BREAK; |
1003 | #endif | 989 | #endif |
1004 | restore_flags(flags); | 990 | local_irq_restore(flags); |
1005 | } | 991 | } |
1006 | 992 | ||
1007 | static int rs_ioctl(struct tty_struct *tty, struct file * file, | 993 | static int rs_ioctl(struct tty_struct *tty, struct file * file, |
@@ -1060,7 +1046,7 @@ static int rs_ioctl(struct tty_struct *tty, struct file * file, | |||
1060 | (struct serial_struct *) arg); | 1046 | (struct serial_struct *) arg); |
1061 | case TIOCSERGETLSR: /* Get line status register */ | 1047 | case TIOCSERGETLSR: /* Get line status register */ |
1062 | if (access_ok(VERIFY_WRITE, (void *) arg, | 1048 | if (access_ok(VERIFY_WRITE, (void *) arg, |
1063 | sizeof(unsigned int)); | 1049 | sizeof(unsigned int))) |
1064 | return get_lsr_info(info, (unsigned int *) arg); | 1050 | return get_lsr_info(info, (unsigned int *) arg); |
1065 | return -EFAULT; | 1051 | return -EFAULT; |
1066 | case TIOCSERGSTRUCT: | 1052 | case TIOCSERGSTRUCT: |
@@ -1113,10 +1099,10 @@ static void rs_close(struct tty_struct *tty, struct file * filp) | |||
1113 | if (!info || serial_paranoia_check(info, tty->name, "rs_close")) | 1099 | if (!info || serial_paranoia_check(info, tty->name, "rs_close")) |
1114 | return; | 1100 | return; |
1115 | 1101 | ||
1116 | save_flags(flags); cli(); | 1102 | local_irq_save(flags); |
1117 | 1103 | ||
1118 | if (tty_hung_up_p(filp)) { | 1104 | if (tty_hung_up_p(filp)) { |
1119 | restore_flags(flags); | 1105 | local_irq_restore(flags); |
1120 | return; | 1106 | return; |
1121 | } | 1107 | } |
1122 | 1108 | ||
@@ -1138,7 +1124,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp) | |||
1138 | info->count = 0; | 1124 | info->count = 0; |
1139 | } | 1125 | } |
1140 | if (info->count) { | 1126 | if (info->count) { |
1141 | restore_flags(flags); | 1127 | local_irq_restore(flags); |
1142 | return; | 1128 | return; |
1143 | } | 1129 | } |
1144 | info->flags |= S_CLOSING; | 1130 | info->flags |= S_CLOSING; |
@@ -1186,7 +1172,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp) | |||
1186 | } | 1172 | } |
1187 | info->flags &= ~(S_NORMAL_ACTIVE|S_CLOSING); | 1173 | info->flags &= ~(S_NORMAL_ACTIVE|S_CLOSING); |
1188 | wake_up_interruptible(&info->close_wait); | 1174 | wake_up_interruptible(&info->close_wait); |
1189 | restore_flags(flags); | 1175 | local_irq_restore(flags); |
1190 | } | 1176 | } |
1191 | 1177 | ||
1192 | /* | 1178 | /* |
@@ -1262,9 +1248,9 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, | |||
1262 | info->count--; | 1248 | info->count--; |
1263 | info->blocked_open++; | 1249 | info->blocked_open++; |
1264 | while (1) { | 1250 | while (1) { |
1265 | cli(); | 1251 | local_irq_disable(); |
1266 | m68k_rtsdtr(info, 1); | 1252 | m68k_rtsdtr(info, 1); |
1267 | sti(); | 1253 | local_irq_enable(); |
1268 | current->state = TASK_INTERRUPTIBLE; | 1254 | current->state = TASK_INTERRUPTIBLE; |
1269 | if (tty_hung_up_p(filp) || | 1255 | if (tty_hung_up_p(filp) || |
1270 | !(info->flags & S_INITIALIZED)) { | 1256 | !(info->flags & S_INITIALIZED)) { |
@@ -1444,7 +1430,7 @@ rs68328_init(void) | |||
1444 | return -ENOMEM; | 1430 | return -ENOMEM; |
1445 | } | 1431 | } |
1446 | 1432 | ||
1447 | save_flags(flags); cli(); | 1433 | local_irq_save(flags); |
1448 | 1434 | ||
1449 | for(i=0;i<NR_PORTS;i++) { | 1435 | for(i=0;i<NR_PORTS;i++) { |
1450 | 1436 | ||
@@ -1489,7 +1475,7 @@ rs68328_init(void) | |||
1489 | serial_pm[i]->data = info; | 1475 | serial_pm[i]->data = info; |
1490 | #endif | 1476 | #endif |
1491 | } | 1477 | } |
1492 | restore_flags(flags); | 1478 | local_irq_restore(flags); |
1493 | return 0; | 1479 | return 0; |
1494 | } | 1480 | } |
1495 | 1481 | ||
diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c index 94886c000d2a..864ef859be56 100644 --- a/drivers/serial/8250_pci.c +++ b/drivers/serial/8250_pci.c | |||
@@ -594,8 +594,8 @@ pci_default_setup(struct serial_private *priv, struct pciserial_board *board, | |||
594 | else | 594 | else |
595 | offset += idx * board->uart_offset; | 595 | offset += idx * board->uart_offset; |
596 | 596 | ||
597 | maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) / | 597 | maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) >> |
598 | (8 << board->reg_shift); | 598 | (board->reg_shift + 3); |
599 | 599 | ||
600 | if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr) | 600 | if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr) |
601 | return 1; | 601 | return 1; |
diff --git a/drivers/serial/crisv10.c b/drivers/serial/crisv10.c index 89700141f87e..5cacc5e74a92 100644 --- a/drivers/serial/crisv10.c +++ b/drivers/serial/crisv10.c | |||
@@ -2573,12 +2573,6 @@ static void flush_to_flip_buffer(struct e100_serial *info) | |||
2573 | 2573 | ||
2574 | DFLIP( | 2574 | DFLIP( |
2575 | if (1) { | 2575 | if (1) { |
2576 | |||
2577 | if (test_bit(TTY_DONT_FLIP, &tty->flags)) { | ||
2578 | DEBUG_LOG(info->line, "*** TTY_DONT_FLIP set flip.count %i ***\n", tty->flip.count); | ||
2579 | DEBUG_LOG(info->line, "*** recv_cnt %i\n", info->recv_cnt); | ||
2580 | } else { | ||
2581 | } | ||
2582 | DEBUG_LOG(info->line, "*** rxtot %i\n", info->icount.rx); | 2576 | DEBUG_LOG(info->line, "*** rxtot %i\n", info->icount.rx); |
2583 | DEBUG_LOG(info->line, "ldisc %lu\n", tty->ldisc.chars_in_buffer(tty)); | 2577 | DEBUG_LOG(info->line, "ldisc %lu\n", tty->ldisc.chars_in_buffer(tty)); |
2584 | DEBUG_LOG(info->line, "room %lu\n", tty->ldisc.receive_room(tty)); | 2578 | DEBUG_LOG(info->line, "room %lu\n", tty->ldisc.receive_room(tty)); |
diff --git a/drivers/serial/jsm/jsm_tty.c b/drivers/serial/jsm/jsm_tty.c index 7d823705193c..f8262e6ad8d3 100644 --- a/drivers/serial/jsm/jsm_tty.c +++ b/drivers/serial/jsm/jsm_tty.c | |||
@@ -589,13 +589,6 @@ void jsm_input(struct jsm_channel *ch) | |||
589 | ld = tty_ldisc_ref(tp); | 589 | ld = tty_ldisc_ref(tp); |
590 | 590 | ||
591 | /* | 591 | /* |
592 | * If the DONT_FLIP flag is on, don't flush our buffer, and act | ||
593 | * like the ld doesn't have any space to put the data right now. | ||
594 | */ | ||
595 | if (test_bit(TTY_DONT_FLIP, &tp->flags)) | ||
596 | len = 0; | ||
597 | |||
598 | /* | ||
599 | * If we were unable to get a reference to the ld, | 592 | * If we were unable to get a reference to the ld, |
600 | * don't flush our buffer, and act like the ld doesn't | 593 | * don't flush our buffer, and act like the ld doesn't |
601 | * have any space to put the data right now. | 594 | * have any space to put the data right now. |
diff --git a/drivers/sn/ioc4.c b/drivers/sn/ioc4.c index 8256a97eb508..8562821e6498 100644 --- a/drivers/sn/ioc4.c +++ b/drivers/sn/ioc4.c | |||
@@ -438,7 +438,7 @@ static struct pci_device_id ioc4_id_table[] = { | |||
438 | {0} | 438 | {0} |
439 | }; | 439 | }; |
440 | 440 | ||
441 | static struct pci_driver __devinitdata ioc4_driver = { | 441 | static struct pci_driver ioc4_driver = { |
442 | .name = "IOC4", | 442 | .name = "IOC4", |
443 | .id_table = ioc4_id_table, | 443 | .id_table = ioc4_id_table, |
444 | .probe = ioc4_probe, | 444 | .probe = ioc4_probe, |
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 1cea4a6799fe..ed1cdf6ac8f3 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
@@ -210,6 +210,7 @@ spi_new_device(struct spi_master *master, struct spi_board_info *chip) | |||
210 | proxy->master = master; | 210 | proxy->master = master; |
211 | proxy->chip_select = chip->chip_select; | 211 | proxy->chip_select = chip->chip_select; |
212 | proxy->max_speed_hz = chip->max_speed_hz; | 212 | proxy->max_speed_hz = chip->max_speed_hz; |
213 | proxy->mode = chip->mode; | ||
213 | proxy->irq = chip->irq; | 214 | proxy->irq = chip->irq; |
214 | proxy->modalias = chip->modalias; | 215 | proxy->modalias = chip->modalias; |
215 | 216 | ||
diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c index 6b4bc3f2bd86..89bcda5a3298 100644 --- a/drivers/usb/host/sl811-hcd.c +++ b/drivers/usb/host/sl811-hcd.c | |||
@@ -1684,9 +1684,13 @@ sl811h_probe(struct platform_device *dev) | |||
1684 | if (!addr || !data) | 1684 | if (!addr || !data) |
1685 | return -ENODEV; | 1685 | return -ENODEV; |
1686 | ioaddr = 1; | 1686 | ioaddr = 1; |
1687 | 1687 | /* | |
1688 | addr_reg = (void __iomem *) addr->start; | 1688 | * NOTE: 64-bit resource->start is getting truncated |
1689 | data_reg = (void __iomem *) data->start; | 1689 | * to avoid compiler warning, assuming that ->start |
1690 | * is always 32-bit for this case | ||
1691 | */ | ||
1692 | addr_reg = (void __iomem *) (unsigned long) addr->start; | ||
1693 | data_reg = (void __iomem *) (unsigned long) data->start; | ||
1690 | } else { | 1694 | } else { |
1691 | addr_reg = ioremap(addr->start, 1); | 1695 | addr_reg = ioremap(addr->start, 1); |
1692 | if (addr_reg == NULL) { | 1696 | if (addr_reg == NULL) { |
diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c index 9432c7302275..d7f3f736a692 100644 --- a/drivers/usb/serial/ir-usb.c +++ b/drivers/usb/serial/ir-usb.c | |||
@@ -453,8 +453,7 @@ static void ir_read_bulk_callback (struct urb *urb, struct pt_regs *regs) | |||
453 | tty = port->tty; | 453 | tty = port->tty; |
454 | 454 | ||
455 | /* | 455 | /* |
456 | * FIXME: must not do this in IRQ context, | 456 | * FIXME: must not do this in IRQ context |
457 | * must honour TTY_DONT_FLIP | ||
458 | */ | 457 | */ |
459 | tty->ldisc.receive_buf( | 458 | tty->ldisc.receive_buf( |
460 | tty, | 459 | tty, |
diff --git a/drivers/video/aty/radeon_backlight.c b/drivers/video/aty/radeon_backlight.c index 7de66b855d4e..1755dddf1899 100644 --- a/drivers/video/aty/radeon_backlight.c +++ b/drivers/video/aty/radeon_backlight.c | |||
@@ -40,14 +40,14 @@ static int radeon_bl_get_level_brightness(struct radeon_bl_privdata *pdata, | |||
40 | 40 | ||
41 | mutex_unlock(&info->bl_mutex); | 41 | mutex_unlock(&info->bl_mutex); |
42 | 42 | ||
43 | if (pdata->negative) | ||
44 | rlevel = MAX_RADEON_LEVEL - rlevel; | ||
45 | |||
46 | if (rlevel < 0) | 43 | if (rlevel < 0) |
47 | rlevel = 0; | 44 | rlevel = 0; |
48 | else if (rlevel > MAX_RADEON_LEVEL) | 45 | else if (rlevel > MAX_RADEON_LEVEL) |
49 | rlevel = MAX_RADEON_LEVEL; | 46 | rlevel = MAX_RADEON_LEVEL; |
50 | 47 | ||
48 | if (pdata->negative) | ||
49 | rlevel = MAX_RADEON_LEVEL - rlevel; | ||
50 | |||
51 | return rlevel; | 51 | return rlevel; |
52 | } | 52 | } |
53 | 53 | ||
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index f32b590730f2..01401cd63ac0 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c | |||
@@ -390,7 +390,7 @@ static const char *vgacon_startup(void) | |||
390 | vga_video_port_val = VGA_CRT_DM; | 390 | vga_video_port_val = VGA_CRT_DM; |
391 | if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) { | 391 | if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) { |
392 | static struct resource ega_console_resource = | 392 | static struct resource ega_console_resource = |
393 | { "ega", 0x3B0, 0x3BF }; | 393 | { .name = "ega", .start = 0x3B0, .end = 0x3BF }; |
394 | vga_video_type = VIDEO_TYPE_EGAM; | 394 | vga_video_type = VIDEO_TYPE_EGAM; |
395 | vga_vram_size = 0x8000; | 395 | vga_vram_size = 0x8000; |
396 | display_desc = "EGA+"; | 396 | display_desc = "EGA+"; |
@@ -398,9 +398,9 @@ static const char *vgacon_startup(void) | |||
398 | &ega_console_resource); | 398 | &ega_console_resource); |
399 | } else { | 399 | } else { |
400 | static struct resource mda1_console_resource = | 400 | static struct resource mda1_console_resource = |
401 | { "mda", 0x3B0, 0x3BB }; | 401 | { .name = "mda", .start = 0x3B0, .end = 0x3BB }; |
402 | static struct resource mda2_console_resource = | 402 | static struct resource mda2_console_resource = |
403 | { "mda", 0x3BF, 0x3BF }; | 403 | { .name = "mda", .start = 0x3BF, .end = 0x3BF }; |
404 | vga_video_type = VIDEO_TYPE_MDA; | 404 | vga_video_type = VIDEO_TYPE_MDA; |
405 | vga_vram_size = 0x2000; | 405 | vga_vram_size = 0x2000; |
406 | display_desc = "*MDA"; | 406 | display_desc = "*MDA"; |
@@ -423,14 +423,14 @@ static const char *vgacon_startup(void) | |||
423 | 423 | ||
424 | if (!ORIG_VIDEO_ISVGA) { | 424 | if (!ORIG_VIDEO_ISVGA) { |
425 | static struct resource ega_console_resource | 425 | static struct resource ega_console_resource |
426 | = { "ega", 0x3C0, 0x3DF }; | 426 | = { .name = "ega", .start = 0x3C0, .end = 0x3DF }; |
427 | vga_video_type = VIDEO_TYPE_EGAC; | 427 | vga_video_type = VIDEO_TYPE_EGAC; |
428 | display_desc = "EGA"; | 428 | display_desc = "EGA"; |
429 | request_resource(&ioport_resource, | 429 | request_resource(&ioport_resource, |
430 | &ega_console_resource); | 430 | &ega_console_resource); |
431 | } else { | 431 | } else { |
432 | static struct resource vga_console_resource | 432 | static struct resource vga_console_resource |
433 | = { "vga+", 0x3C0, 0x3DF }; | 433 | = { .name = "vga+", .start = 0x3C0, .end = 0x3DF }; |
434 | vga_video_type = VIDEO_TYPE_VGAC; | 434 | vga_video_type = VIDEO_TYPE_VGAC; |
435 | display_desc = "VGA+"; | 435 | display_desc = "VGA+"; |
436 | request_resource(&ioport_resource, | 436 | request_resource(&ioport_resource, |
@@ -474,7 +474,7 @@ static const char *vgacon_startup(void) | |||
474 | } | 474 | } |
475 | } else { | 475 | } else { |
476 | static struct resource cga_console_resource = | 476 | static struct resource cga_console_resource = |
477 | { "cga", 0x3D4, 0x3D5 }; | 477 | { .name = "cga", .start = 0x3D4, .end = 0x3D5 }; |
478 | vga_video_type = VIDEO_TYPE_CGA; | 478 | vga_video_type = VIDEO_TYPE_CGA; |
479 | vga_vram_size = 0x2000; | 479 | vga_vram_size = 0x2000; |
480 | display_desc = "*CGA"; | 480 | display_desc = "*CGA"; |
diff --git a/drivers/video/sgivwfb.c b/drivers/video/sgivwfb.c index 2e6df1fcb2b9..c0cc5e3ba7b5 100644 --- a/drivers/video/sgivwfb.c +++ b/drivers/video/sgivwfb.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #include <asm/io.h> | 23 | #include <asm/io.h> |
24 | #include <asm/mtrr.h> | 24 | #include <asm/mtrr.h> |
25 | 25 | ||
26 | #include <setup_arch.h> | ||
27 | |||
26 | #define INCLUDE_TIMING_TABLE_DATA | 28 | #define INCLUDE_TIMING_TABLE_DATA |
27 | #define DBE_REG_BASE par->regs | 29 | #define DBE_REG_BASE par->regs |
28 | #include <video/sgivw.h> | 30 | #include <video/sgivw.h> |
@@ -42,10 +44,6 @@ struct sgivw_par { | |||
42 | * The default can be overridden if the driver is compiled as a module | 44 | * The default can be overridden if the driver is compiled as a module |
43 | */ | 45 | */ |
44 | 46 | ||
45 | /* set by arch/i386/kernel/setup.c */ | ||
46 | extern unsigned long sgivwfb_mem_phys; | ||
47 | extern unsigned long sgivwfb_mem_size; | ||
48 | |||
49 | static int ypan = 0; | 47 | static int ypan = 0; |
50 | static int ywrap = 0; | 48 | static int ywrap = 0; |
51 | 49 | ||
diff --git a/fs/9p/mux.c b/fs/9p/mux.c index 12e1baa4508d..8d45ed668837 100644 --- a/fs/9p/mux.c +++ b/fs/9p/mux.c | |||
@@ -932,6 +932,8 @@ v9fs_mux_rpc(struct v9fs_mux_data *m, struct v9fs_fcall *tc, | |||
932 | r.rcall || r.err); | 932 | r.rcall || r.err); |
933 | } while (!r.rcall && !r.err && err==-ERESTARTSYS && | 933 | } while (!r.rcall && !r.err && err==-ERESTARTSYS && |
934 | m->trans->status==Connected && !m->err); | 934 | m->trans->status==Connected && !m->err); |
935 | |||
936 | err = -ERESTARTSYS; | ||
935 | } | 937 | } |
936 | sigpending = 1; | 938 | sigpending = 1; |
937 | } | 939 | } |
diff --git a/fs/9p/v9fs_vfs.h b/fs/9p/v9fs_vfs.h index f867b8d3e973..450b0c1b385e 100644 --- a/fs/9p/v9fs_vfs.h +++ b/fs/9p/v9fs_vfs.h | |||
@@ -38,7 +38,7 @@ | |||
38 | */ | 38 | */ |
39 | 39 | ||
40 | extern struct file_system_type v9fs_fs_type; | 40 | extern struct file_system_type v9fs_fs_type; |
41 | extern struct address_space_operations v9fs_addr_operations; | 41 | extern const struct address_space_operations v9fs_addr_operations; |
42 | extern const struct file_operations v9fs_file_operations; | 42 | extern const struct file_operations v9fs_file_operations; |
43 | extern const struct file_operations v9fs_dir_operations; | 43 | extern const struct file_operations v9fs_dir_operations; |
44 | extern struct dentry_operations v9fs_dentry_operations; | 44 | extern struct dentry_operations v9fs_dentry_operations; |
diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index efda46fb64d9..d4f0aa3c87f2 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c | |||
@@ -103,6 +103,6 @@ UnmapAndUnlock: | |||
103 | return retval; | 103 | return retval; |
104 | } | 104 | } |
105 | 105 | ||
106 | struct address_space_operations v9fs_addr_operations = { | 106 | const struct address_space_operations v9fs_addr_operations = { |
107 | .readpage = v9fs_vfs_readpage, | 107 | .readpage = v9fs_vfs_readpage, |
108 | }; | 108 | }; |
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 5c6bdf82146c..2f580a197b8d 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
@@ -300,7 +300,7 @@ clunk_fid: | |||
300 | fid = V9FS_NOFID; | 300 | fid = V9FS_NOFID; |
301 | 301 | ||
302 | put_fid: | 302 | put_fid: |
303 | if (fid >= 0) | 303 | if (fid != V9FS_NOFID) |
304 | v9fs_put_idpool(fid, &v9ses->fidpool); | 304 | v9fs_put_idpool(fid, &v9ses->fidpool); |
305 | 305 | ||
306 | kfree(fcall); | 306 | kfree(fcall); |
diff --git a/fs/adfs/inode.c b/fs/adfs/inode.c index a02802a30798..534f3eecc985 100644 --- a/fs/adfs/inode.c +++ b/fs/adfs/inode.c | |||
@@ -72,7 +72,7 @@ static sector_t _adfs_bmap(struct address_space *mapping, sector_t block) | |||
72 | return generic_block_bmap(mapping, block, adfs_get_block); | 72 | return generic_block_bmap(mapping, block, adfs_get_block); |
73 | } | 73 | } |
74 | 74 | ||
75 | static struct address_space_operations adfs_aops = { | 75 | static const struct address_space_operations adfs_aops = { |
76 | .readpage = adfs_readpage, | 76 | .readpage = adfs_readpage, |
77 | .writepage = adfs_writepage, | 77 | .writepage = adfs_writepage, |
78 | .sync_page = block_sync_page, | 78 | .sync_page = block_sync_page, |
diff --git a/fs/affs/affs.h b/fs/affs/affs.h index a43a876742b8..0ddd4cc0d1a0 100644 --- a/fs/affs/affs.h +++ b/fs/affs/affs.h | |||
@@ -195,9 +195,9 @@ extern struct inode_operations affs_symlink_inode_operations; | |||
195 | extern const struct file_operations affs_file_operations; | 195 | extern const struct file_operations affs_file_operations; |
196 | extern const struct file_operations affs_file_operations_ofs; | 196 | extern const struct file_operations affs_file_operations_ofs; |
197 | extern const struct file_operations affs_dir_operations; | 197 | extern const struct file_operations affs_dir_operations; |
198 | extern struct address_space_operations affs_symlink_aops; | 198 | extern const struct address_space_operations affs_symlink_aops; |
199 | extern struct address_space_operations affs_aops; | 199 | extern const struct address_space_operations affs_aops; |
200 | extern struct address_space_operations affs_aops_ofs; | 200 | extern const struct address_space_operations affs_aops_ofs; |
201 | 201 | ||
202 | extern struct dentry_operations affs_dentry_operations; | 202 | extern struct dentry_operations affs_dentry_operations; |
203 | extern struct dentry_operations affs_dentry_operations_intl; | 203 | extern struct dentry_operations affs_dentry_operations_intl; |
diff --git a/fs/affs/file.c b/fs/affs/file.c index 7076262af39b..3de8590e4f6a 100644 --- a/fs/affs/file.c +++ b/fs/affs/file.c | |||
@@ -406,7 +406,7 @@ static sector_t _affs_bmap(struct address_space *mapping, sector_t block) | |||
406 | { | 406 | { |
407 | return generic_block_bmap(mapping,block,affs_get_block); | 407 | return generic_block_bmap(mapping,block,affs_get_block); |
408 | } | 408 | } |
409 | struct address_space_operations affs_aops = { | 409 | const struct address_space_operations affs_aops = { |
410 | .readpage = affs_readpage, | 410 | .readpage = affs_readpage, |
411 | .writepage = affs_writepage, | 411 | .writepage = affs_writepage, |
412 | .sync_page = block_sync_page, | 412 | .sync_page = block_sync_page, |
@@ -759,7 +759,7 @@ out: | |||
759 | goto done; | 759 | goto done; |
760 | } | 760 | } |
761 | 761 | ||
762 | struct address_space_operations affs_aops_ofs = { | 762 | const struct address_space_operations affs_aops_ofs = { |
763 | .readpage = affs_readpage_ofs, | 763 | .readpage = affs_readpage_ofs, |
764 | //.writepage = affs_writepage_ofs, | 764 | //.writepage = affs_writepage_ofs, |
765 | //.sync_page = affs_sync_page_ofs, | 765 | //.sync_page = affs_sync_page_ofs, |
diff --git a/fs/affs/symlink.c b/fs/affs/symlink.c index 426f0f094f23..f802256a5933 100644 --- a/fs/affs/symlink.c +++ b/fs/affs/symlink.c | |||
@@ -66,7 +66,7 @@ fail: | |||
66 | return err; | 66 | return err; |
67 | } | 67 | } |
68 | 68 | ||
69 | struct address_space_operations affs_symlink_aops = { | 69 | const struct address_space_operations affs_symlink_aops = { |
70 | .readpage = affs_symlink_readpage, | 70 | .readpage = affs_symlink_readpage, |
71 | }; | 71 | }; |
72 | 72 | ||
diff --git a/fs/afs/file.c b/fs/afs/file.c index 7bb716887e29..67d6634101fd 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c | |||
@@ -35,7 +35,7 @@ struct inode_operations afs_file_inode_operations = { | |||
35 | .getattr = afs_inode_getattr, | 35 | .getattr = afs_inode_getattr, |
36 | }; | 36 | }; |
37 | 37 | ||
38 | struct address_space_operations afs_fs_aops = { | 38 | const struct address_space_operations afs_fs_aops = { |
39 | .readpage = afs_file_readpage, | 39 | .readpage = afs_file_readpage, |
40 | .sync_page = block_sync_page, | 40 | .sync_page = block_sync_page, |
41 | .set_page_dirty = __set_page_dirty_nobuffers, | 41 | .set_page_dirty = __set_page_dirty_nobuffers, |
diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 72febdf9a35a..e88b3b65ae49 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h | |||
@@ -69,7 +69,7 @@ extern const struct file_operations afs_dir_file_operations; | |||
69 | /* | 69 | /* |
70 | * file.c | 70 | * file.c |
71 | */ | 71 | */ |
72 | extern struct address_space_operations afs_fs_aops; | 72 | extern const struct address_space_operations afs_fs_aops; |
73 | extern struct inode_operations afs_file_inode_operations; | 73 | extern struct inode_operations afs_file_inode_operations; |
74 | 74 | ||
75 | #ifdef AFS_CACHING_SUPPORT | 75 | #ifdef AFS_CACHING_SUPPORT |
diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c index 08201fab26cd..a83e889a97cd 100644 --- a/fs/befs/linuxvfs.c +++ b/fs/befs/linuxvfs.c | |||
@@ -73,7 +73,7 @@ static struct inode_operations befs_dir_inode_operations = { | |||
73 | .lookup = befs_lookup, | 73 | .lookup = befs_lookup, |
74 | }; | 74 | }; |
75 | 75 | ||
76 | static struct address_space_operations befs_aops = { | 76 | static const struct address_space_operations befs_aops = { |
77 | .readpage = befs_readpage, | 77 | .readpage = befs_readpage, |
78 | .sync_page = block_sync_page, | 78 | .sync_page = block_sync_page, |
79 | .bmap = befs_bmap, | 79 | .bmap = befs_bmap, |
diff --git a/fs/bfs/bfs.h b/fs/bfs/bfs.h index 9d791004b21c..31973bbbf057 100644 --- a/fs/bfs/bfs.h +++ b/fs/bfs/bfs.h | |||
@@ -50,7 +50,7 @@ static inline struct bfs_inode_info *BFS_I(struct inode *inode) | |||
50 | /* file.c */ | 50 | /* file.c */ |
51 | extern struct inode_operations bfs_file_inops; | 51 | extern struct inode_operations bfs_file_inops; |
52 | extern const struct file_operations bfs_file_operations; | 52 | extern const struct file_operations bfs_file_operations; |
53 | extern struct address_space_operations bfs_aops; | 53 | extern const struct address_space_operations bfs_aops; |
54 | 54 | ||
55 | /* dir.c */ | 55 | /* dir.c */ |
56 | extern struct inode_operations bfs_dir_inops; | 56 | extern struct inode_operations bfs_dir_inops; |
diff --git a/fs/bfs/file.c b/fs/bfs/file.c index d83cd74a2e4e..3d5aca28a0a0 100644 --- a/fs/bfs/file.c +++ b/fs/bfs/file.c | |||
@@ -153,7 +153,7 @@ static sector_t bfs_bmap(struct address_space *mapping, sector_t block) | |||
153 | return generic_block_bmap(mapping, block, bfs_get_block); | 153 | return generic_block_bmap(mapping, block, bfs_get_block); |
154 | } | 154 | } |
155 | 155 | ||
156 | struct address_space_operations bfs_aops = { | 156 | const struct address_space_operations bfs_aops = { |
157 | .readpage = bfs_readpage, | 157 | .readpage = bfs_readpage, |
158 | .writepage = bfs_writepage, | 158 | .writepage = bfs_writepage, |
159 | .sync_page = block_sync_page, | 159 | .sync_page = block_sync_page, |
diff --git a/fs/block_dev.c b/fs/block_dev.c index 028d9fb9c2d5..7f7600e2381c 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -1095,7 +1095,7 @@ static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg) | |||
1095 | return blkdev_ioctl(file->f_mapping->host, file, cmd, arg); | 1095 | return blkdev_ioctl(file->f_mapping->host, file, cmd, arg); |
1096 | } | 1096 | } |
1097 | 1097 | ||
1098 | struct address_space_operations def_blk_aops = { | 1098 | const struct address_space_operations def_blk_aops = { |
1099 | .readpage = blkdev_readpage, | 1099 | .readpage = blkdev_readpage, |
1100 | .writepage = blkdev_writepage, | 1100 | .writepage = blkdev_writepage, |
1101 | .sync_page = block_sync_page, | 1101 | .sync_page = block_sync_page, |
diff --git a/fs/buffer.c b/fs/buffer.c index f23bb647db47..e9994722f4a3 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
@@ -2598,7 +2598,7 @@ int nobh_truncate_page(struct address_space *mapping, loff_t from) | |||
2598 | unsigned offset = from & (PAGE_CACHE_SIZE-1); | 2598 | unsigned offset = from & (PAGE_CACHE_SIZE-1); |
2599 | unsigned to; | 2599 | unsigned to; |
2600 | struct page *page; | 2600 | struct page *page; |
2601 | struct address_space_operations *a_ops = mapping->a_ops; | 2601 | const struct address_space_operations *a_ops = mapping->a_ops; |
2602 | char *kaddr; | 2602 | char *kaddr; |
2603 | int ret = 0; | 2603 | int ret = 0; |
2604 | 2604 | ||
diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h index a6384d83fdef..8f75c6f24701 100644 --- a/fs/cifs/cifsfs.h +++ b/fs/cifs/cifsfs.h | |||
@@ -32,8 +32,8 @@ | |||
32 | #define TRUE 1 | 32 | #define TRUE 1 |
33 | #endif | 33 | #endif |
34 | 34 | ||
35 | extern struct address_space_operations cifs_addr_ops; | 35 | extern const struct address_space_operations cifs_addr_ops; |
36 | extern struct address_space_operations cifs_addr_ops_smallbuf; | 36 | extern const struct address_space_operations cifs_addr_ops_smallbuf; |
37 | 37 | ||
38 | /* Functions related to super block operations */ | 38 | /* Functions related to super block operations */ |
39 | extern struct super_operations cifs_super_ops; | 39 | extern struct super_operations cifs_super_ops; |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index e9c1573f6aa7..5861eb42e626 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -1942,7 +1942,7 @@ static int cifs_prepare_write(struct file *file, struct page *page, | |||
1942 | return 0; | 1942 | return 0; |
1943 | } | 1943 | } |
1944 | 1944 | ||
1945 | struct address_space_operations cifs_addr_ops = { | 1945 | const struct address_space_operations cifs_addr_ops = { |
1946 | .readpage = cifs_readpage, | 1946 | .readpage = cifs_readpage, |
1947 | .readpages = cifs_readpages, | 1947 | .readpages = cifs_readpages, |
1948 | .writepage = cifs_writepage, | 1948 | .writepage = cifs_writepage, |
@@ -1959,7 +1959,7 @@ struct address_space_operations cifs_addr_ops = { | |||
1959 | * contain the header plus one complete page of data. Otherwise, we need | 1959 | * contain the header plus one complete page of data. Otherwise, we need |
1960 | * to leave cifs_readpages out of the address space operations. | 1960 | * to leave cifs_readpages out of the address space operations. |
1961 | */ | 1961 | */ |
1962 | struct address_space_operations cifs_addr_ops_smallbuf = { | 1962 | const struct address_space_operations cifs_addr_ops_smallbuf = { |
1963 | .readpage = cifs_readpage, | 1963 | .readpage = cifs_readpage, |
1964 | .writepage = cifs_writepage, | 1964 | .writepage = cifs_writepage, |
1965 | .writepages = cifs_writepages, | 1965 | .writepages = cifs_writepages, |
diff --git a/fs/coda/symlink.c b/fs/coda/symlink.c index b35e5bbd9c99..76e00a65a75b 100644 --- a/fs/coda/symlink.c +++ b/fs/coda/symlink.c | |||
@@ -50,6 +50,6 @@ fail: | |||
50 | return error; | 50 | return error; |
51 | } | 51 | } |
52 | 52 | ||
53 | struct address_space_operations coda_symlink_aops = { | 53 | const struct address_space_operations coda_symlink_aops = { |
54 | .readpage = coda_symlink_filler, | 54 | .readpage = coda_symlink_filler, |
55 | }; | 55 | }; |
diff --git a/fs/configfs/inode.c b/fs/configfs/inode.c index c153bd9534cb..e14488ca6411 100644 --- a/fs/configfs/inode.c +++ b/fs/configfs/inode.c | |||
@@ -38,7 +38,7 @@ | |||
38 | 38 | ||
39 | extern struct super_block * configfs_sb; | 39 | extern struct super_block * configfs_sb; |
40 | 40 | ||
41 | static struct address_space_operations configfs_aops = { | 41 | static const struct address_space_operations configfs_aops = { |
42 | .readpage = simple_readpage, | 42 | .readpage = simple_readpage, |
43 | .prepare_write = simple_prepare_write, | 43 | .prepare_write = simple_prepare_write, |
44 | .commit_write = simple_commit_write | 44 | .commit_write = simple_commit_write |
diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index c45d73860803..223c0431042d 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c | |||
@@ -30,7 +30,7 @@ | |||
30 | static struct super_operations cramfs_ops; | 30 | static struct super_operations cramfs_ops; |
31 | static struct inode_operations cramfs_dir_inode_operations; | 31 | static struct inode_operations cramfs_dir_inode_operations; |
32 | static const struct file_operations cramfs_directory_operations; | 32 | static const struct file_operations cramfs_directory_operations; |
33 | static struct address_space_operations cramfs_aops; | 33 | static const struct address_space_operations cramfs_aops; |
34 | 34 | ||
35 | static DEFINE_MUTEX(read_mutex); | 35 | static DEFINE_MUTEX(read_mutex); |
36 | 36 | ||
@@ -501,7 +501,7 @@ static int cramfs_readpage(struct file *file, struct page * page) | |||
501 | return 0; | 501 | return 0; |
502 | } | 502 | } |
503 | 503 | ||
504 | static struct address_space_operations cramfs_aops = { | 504 | static const struct address_space_operations cramfs_aops = { |
505 | .readpage = cramfs_readpage | 505 | .readpage = cramfs_readpage |
506 | }; | 506 | }; |
507 | 507 | ||
diff --git a/fs/efs/inode.c b/fs/efs/inode.c index 180607f9314d..174696f9bf14 100644 --- a/fs/efs/inode.c +++ b/fs/efs/inode.c | |||
@@ -21,7 +21,7 @@ static sector_t _efs_bmap(struct address_space *mapping, sector_t block) | |||
21 | { | 21 | { |
22 | return generic_block_bmap(mapping,block,efs_get_block); | 22 | return generic_block_bmap(mapping,block,efs_get_block); |
23 | } | 23 | } |
24 | static struct address_space_operations efs_aops = { | 24 | static const struct address_space_operations efs_aops = { |
25 | .readpage = efs_readpage, | 25 | .readpage = efs_readpage, |
26 | .sync_page = block_sync_page, | 26 | .sync_page = block_sync_page, |
27 | .bmap = _efs_bmap | 27 | .bmap = _efs_bmap |
diff --git a/fs/efs/symlink.c b/fs/efs/symlink.c index 3d9a350e3e7f..e249cf733a6b 100644 --- a/fs/efs/symlink.c +++ b/fs/efs/symlink.c | |||
@@ -53,6 +53,6 @@ fail: | |||
53 | return err; | 53 | return err; |
54 | } | 54 | } |
55 | 55 | ||
56 | struct address_space_operations efs_symlink_aops = { | 56 | const struct address_space_operations efs_symlink_aops = { |
57 | .readpage = efs_symlink_readpage | 57 | .readpage = efs_symlink_readpage |
58 | }; | 58 | }; |
diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h index 9f74a62be555..e65a019fc7a5 100644 --- a/fs/ext2/ext2.h +++ b/fs/ext2/ext2.h | |||
@@ -162,9 +162,9 @@ extern const struct file_operations ext2_file_operations; | |||
162 | extern const struct file_operations ext2_xip_file_operations; | 162 | extern const struct file_operations ext2_xip_file_operations; |
163 | 163 | ||
164 | /* inode.c */ | 164 | /* inode.c */ |
165 | extern struct address_space_operations ext2_aops; | 165 | extern const struct address_space_operations ext2_aops; |
166 | extern struct address_space_operations ext2_aops_xip; | 166 | extern const struct address_space_operations ext2_aops_xip; |
167 | extern struct address_space_operations ext2_nobh_aops; | 167 | extern const struct address_space_operations ext2_nobh_aops; |
168 | 168 | ||
169 | /* namei.c */ | 169 | /* namei.c */ |
170 | extern struct inode_operations ext2_dir_inode_operations; | 170 | extern struct inode_operations ext2_dir_inode_operations; |
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 04af9c45dce2..fb4d3220eb8d 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c | |||
@@ -684,7 +684,7 @@ ext2_writepages(struct address_space *mapping, struct writeback_control *wbc) | |||
684 | return mpage_writepages(mapping, wbc, ext2_get_block); | 684 | return mpage_writepages(mapping, wbc, ext2_get_block); |
685 | } | 685 | } |
686 | 686 | ||
687 | struct address_space_operations ext2_aops = { | 687 | const struct address_space_operations ext2_aops = { |
688 | .readpage = ext2_readpage, | 688 | .readpage = ext2_readpage, |
689 | .readpages = ext2_readpages, | 689 | .readpages = ext2_readpages, |
690 | .writepage = ext2_writepage, | 690 | .writepage = ext2_writepage, |
@@ -697,12 +697,12 @@ struct address_space_operations ext2_aops = { | |||
697 | .migratepage = buffer_migrate_page, | 697 | .migratepage = buffer_migrate_page, |
698 | }; | 698 | }; |
699 | 699 | ||
700 | struct address_space_operations ext2_aops_xip = { | 700 | const struct address_space_operations ext2_aops_xip = { |
701 | .bmap = ext2_bmap, | 701 | .bmap = ext2_bmap, |
702 | .get_xip_page = ext2_get_xip_page, | 702 | .get_xip_page = ext2_get_xip_page, |
703 | }; | 703 | }; |
704 | 704 | ||
705 | struct address_space_operations ext2_nobh_aops = { | 705 | const struct address_space_operations ext2_nobh_aops = { |
706 | .readpage = ext2_readpage, | 706 | .readpage = ext2_readpage, |
707 | .readpages = ext2_readpages, | 707 | .readpages = ext2_readpages, |
708 | .writepage = ext2_nobh_writepage, | 708 | .writepage = ext2_nobh_writepage, |
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 0321e1b9034a..f804d5e9d60c 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c | |||
@@ -1698,7 +1698,7 @@ static int ext3_journalled_set_page_dirty(struct page *page) | |||
1698 | return __set_page_dirty_nobuffers(page); | 1698 | return __set_page_dirty_nobuffers(page); |
1699 | } | 1699 | } |
1700 | 1700 | ||
1701 | static struct address_space_operations ext3_ordered_aops = { | 1701 | static const struct address_space_operations ext3_ordered_aops = { |
1702 | .readpage = ext3_readpage, | 1702 | .readpage = ext3_readpage, |
1703 | .readpages = ext3_readpages, | 1703 | .readpages = ext3_readpages, |
1704 | .writepage = ext3_ordered_writepage, | 1704 | .writepage = ext3_ordered_writepage, |
@@ -1712,7 +1712,7 @@ static struct address_space_operations ext3_ordered_aops = { | |||
1712 | .migratepage = buffer_migrate_page, | 1712 | .migratepage = buffer_migrate_page, |
1713 | }; | 1713 | }; |
1714 | 1714 | ||
1715 | static struct address_space_operations ext3_writeback_aops = { | 1715 | static const struct address_space_operations ext3_writeback_aops = { |
1716 | .readpage = ext3_readpage, | 1716 | .readpage = ext3_readpage, |
1717 | .readpages = ext3_readpages, | 1717 | .readpages = ext3_readpages, |
1718 | .writepage = ext3_writeback_writepage, | 1718 | .writepage = ext3_writeback_writepage, |
@@ -1726,7 +1726,7 @@ static struct address_space_operations ext3_writeback_aops = { | |||
1726 | .migratepage = buffer_migrate_page, | 1726 | .migratepage = buffer_migrate_page, |
1727 | }; | 1727 | }; |
1728 | 1728 | ||
1729 | static struct address_space_operations ext3_journalled_aops = { | 1729 | static const struct address_space_operations ext3_journalled_aops = { |
1730 | .readpage = ext3_readpage, | 1730 | .readpage = ext3_readpage, |
1731 | .readpages = ext3_readpages, | 1731 | .readpages = ext3_readpages, |
1732 | .writepage = ext3_journalled_writepage, | 1732 | .writepage = ext3_journalled_writepage, |
diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 7c35d582ec10..31b7174176ba 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c | |||
@@ -196,7 +196,7 @@ static sector_t _fat_bmap(struct address_space *mapping, sector_t block) | |||
196 | return generic_block_bmap(mapping, block, fat_get_block); | 196 | return generic_block_bmap(mapping, block, fat_get_block); |
197 | } | 197 | } |
198 | 198 | ||
199 | static struct address_space_operations fat_aops = { | 199 | static const struct address_space_operations fat_aops = { |
200 | .readpage = fat_readpage, | 200 | .readpage = fat_readpage, |
201 | .readpages = fat_readpages, | 201 | .readpages = fat_readpages, |
202 | .writepage = fat_writepage, | 202 | .writepage = fat_writepage, |
diff --git a/fs/freevxfs/vxfs_immed.c b/fs/freevxfs/vxfs_immed.c index 6f5df1700e95..4e25f3fbed86 100644 --- a/fs/freevxfs/vxfs_immed.c +++ b/fs/freevxfs/vxfs_immed.c | |||
@@ -56,7 +56,7 @@ struct inode_operations vxfs_immed_symlink_iops = { | |||
56 | /* | 56 | /* |
57 | * Adress space operations for immed files and directories. | 57 | * Adress space operations for immed files and directories. |
58 | */ | 58 | */ |
59 | struct address_space_operations vxfs_immed_aops = { | 59 | const struct address_space_operations vxfs_immed_aops = { |
60 | .readpage = vxfs_immed_readpage, | 60 | .readpage = vxfs_immed_readpage, |
61 | }; | 61 | }; |
62 | 62 | ||
diff --git a/fs/freevxfs/vxfs_inode.c b/fs/freevxfs/vxfs_inode.c index f544aae9169f..ca6a39714771 100644 --- a/fs/freevxfs/vxfs_inode.c +++ b/fs/freevxfs/vxfs_inode.c | |||
@@ -41,8 +41,8 @@ | |||
41 | #include "vxfs_extern.h" | 41 | #include "vxfs_extern.h" |
42 | 42 | ||
43 | 43 | ||
44 | extern struct address_space_operations vxfs_aops; | 44 | extern const struct address_space_operations vxfs_aops; |
45 | extern struct address_space_operations vxfs_immed_aops; | 45 | extern const struct address_space_operations vxfs_immed_aops; |
46 | 46 | ||
47 | extern struct inode_operations vxfs_immed_symlink_iops; | 47 | extern struct inode_operations vxfs_immed_symlink_iops; |
48 | 48 | ||
@@ -295,7 +295,7 @@ vxfs_read_inode(struct inode *ip) | |||
295 | { | 295 | { |
296 | struct super_block *sbp = ip->i_sb; | 296 | struct super_block *sbp = ip->i_sb; |
297 | struct vxfs_inode_info *vip; | 297 | struct vxfs_inode_info *vip; |
298 | struct address_space_operations *aops; | 298 | const struct address_space_operations *aops; |
299 | ino_t ino = ip->i_ino; | 299 | ino_t ino = ip->i_ino; |
300 | 300 | ||
301 | if (!(vip = __vxfs_iget(ino, VXFS_SBI(sbp)->vsi_ilist))) | 301 | if (!(vip = __vxfs_iget(ino, VXFS_SBI(sbp)->vsi_ilist))) |
diff --git a/fs/freevxfs/vxfs_subr.c b/fs/freevxfs/vxfs_subr.c index c1be118fc067..decac62efe57 100644 --- a/fs/freevxfs/vxfs_subr.c +++ b/fs/freevxfs/vxfs_subr.c | |||
@@ -42,7 +42,7 @@ | |||
42 | static int vxfs_readpage(struct file *, struct page *); | 42 | static int vxfs_readpage(struct file *, struct page *); |
43 | static sector_t vxfs_bmap(struct address_space *, sector_t); | 43 | static sector_t vxfs_bmap(struct address_space *, sector_t); |
44 | 44 | ||
45 | struct address_space_operations vxfs_aops = { | 45 | const struct address_space_operations vxfs_aops = { |
46 | .readpage = vxfs_readpage, | 46 | .readpage = vxfs_readpage, |
47 | .bmap = vxfs_bmap, | 47 | .bmap = vxfs_bmap, |
48 | .sync_page = block_sync_page, | 48 | .sync_page = block_sync_page, |
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 28aa81eae2cc..63614ed16336 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -770,7 +770,7 @@ static const struct file_operations fuse_direct_io_file_operations = { | |||
770 | /* no mmap and sendfile */ | 770 | /* no mmap and sendfile */ |
771 | }; | 771 | }; |
772 | 772 | ||
773 | static struct address_space_operations fuse_file_aops = { | 773 | static const struct address_space_operations fuse_file_aops = { |
774 | .readpage = fuse_readpage, | 774 | .readpage = fuse_readpage, |
775 | .prepare_write = fuse_prepare_write, | 775 | .prepare_write = fuse_prepare_write, |
776 | .commit_write = fuse_commit_write, | 776 | .commit_write = fuse_commit_write, |
diff --git a/fs/hfs/hfs_fs.h b/fs/hfs/hfs_fs.h index 3ed8663a8db1..735332dfd1b8 100644 --- a/fs/hfs/hfs_fs.h +++ b/fs/hfs/hfs_fs.h | |||
@@ -182,8 +182,8 @@ extern void hfs_file_truncate(struct inode *); | |||
182 | extern int hfs_get_block(struct inode *, sector_t, struct buffer_head *, int); | 182 | extern int hfs_get_block(struct inode *, sector_t, struct buffer_head *, int); |
183 | 183 | ||
184 | /* inode.c */ | 184 | /* inode.c */ |
185 | extern struct address_space_operations hfs_aops; | 185 | extern const struct address_space_operations hfs_aops; |
186 | extern struct address_space_operations hfs_btree_aops; | 186 | extern const struct address_space_operations hfs_btree_aops; |
187 | 187 | ||
188 | extern struct inode *hfs_new_inode(struct inode *, struct qstr *, int); | 188 | extern struct inode *hfs_new_inode(struct inode *, struct qstr *, int); |
189 | extern void hfs_inode_write_fork(struct inode *, struct hfs_extent *, __be32 *, __be32 *); | 189 | extern void hfs_inode_write_fork(struct inode *, struct hfs_extent *, __be32 *, __be32 *); |
diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c index 2d4ced22201b..315cf44a90b2 100644 --- a/fs/hfs/inode.c +++ b/fs/hfs/inode.c | |||
@@ -114,7 +114,7 @@ static int hfs_writepages(struct address_space *mapping, | |||
114 | return mpage_writepages(mapping, wbc, hfs_get_block); | 114 | return mpage_writepages(mapping, wbc, hfs_get_block); |
115 | } | 115 | } |
116 | 116 | ||
117 | struct address_space_operations hfs_btree_aops = { | 117 | const struct address_space_operations hfs_btree_aops = { |
118 | .readpage = hfs_readpage, | 118 | .readpage = hfs_readpage, |
119 | .writepage = hfs_writepage, | 119 | .writepage = hfs_writepage, |
120 | .sync_page = block_sync_page, | 120 | .sync_page = block_sync_page, |
@@ -124,7 +124,7 @@ struct address_space_operations hfs_btree_aops = { | |||
124 | .releasepage = hfs_releasepage, | 124 | .releasepage = hfs_releasepage, |
125 | }; | 125 | }; |
126 | 126 | ||
127 | struct address_space_operations hfs_aops = { | 127 | const struct address_space_operations hfs_aops = { |
128 | .readpage = hfs_readpage, | 128 | .readpage = hfs_readpage, |
129 | .writepage = hfs_writepage, | 129 | .writepage = hfs_writepage, |
130 | .sync_page = block_sync_page, | 130 | .sync_page = block_sync_page, |
diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h index 7ae393637a0c..8a1ca5ef7ada 100644 --- a/fs/hfsplus/hfsplus_fs.h +++ b/fs/hfsplus/hfsplus_fs.h | |||
@@ -323,8 +323,8 @@ int hfsplus_file_extend(struct inode *); | |||
323 | void hfsplus_file_truncate(struct inode *); | 323 | void hfsplus_file_truncate(struct inode *); |
324 | 324 | ||
325 | /* inode.c */ | 325 | /* inode.c */ |
326 | extern struct address_space_operations hfsplus_aops; | 326 | extern const struct address_space_operations hfsplus_aops; |
327 | extern struct address_space_operations hfsplus_btree_aops; | 327 | extern const struct address_space_operations hfsplus_btree_aops; |
328 | 328 | ||
329 | void hfsplus_inode_read_fork(struct inode *, struct hfsplus_fork_raw *); | 329 | void hfsplus_inode_read_fork(struct inode *, struct hfsplus_fork_raw *); |
330 | void hfsplus_inode_write_fork(struct inode *, struct hfsplus_fork_raw *); | 330 | void hfsplus_inode_write_fork(struct inode *, struct hfsplus_fork_raw *); |
diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c index acf66dba3e01..924ecdef8091 100644 --- a/fs/hfsplus/inode.c +++ b/fs/hfsplus/inode.c | |||
@@ -109,7 +109,7 @@ static int hfsplus_writepages(struct address_space *mapping, | |||
109 | return mpage_writepages(mapping, wbc, hfsplus_get_block); | 109 | return mpage_writepages(mapping, wbc, hfsplus_get_block); |
110 | } | 110 | } |
111 | 111 | ||
112 | struct address_space_operations hfsplus_btree_aops = { | 112 | const struct address_space_operations hfsplus_btree_aops = { |
113 | .readpage = hfsplus_readpage, | 113 | .readpage = hfsplus_readpage, |
114 | .writepage = hfsplus_writepage, | 114 | .writepage = hfsplus_writepage, |
115 | .sync_page = block_sync_page, | 115 | .sync_page = block_sync_page, |
@@ -119,7 +119,7 @@ struct address_space_operations hfsplus_btree_aops = { | |||
119 | .releasepage = hfsplus_releasepage, | 119 | .releasepage = hfsplus_releasepage, |
120 | }; | 120 | }; |
121 | 121 | ||
122 | struct address_space_operations hfsplus_aops = { | 122 | const struct address_space_operations hfsplus_aops = { |
123 | .readpage = hfsplus_readpage, | 123 | .readpage = hfsplus_readpage, |
124 | .writepage = hfsplus_writepage, | 124 | .writepage = hfsplus_writepage, |
125 | .sync_page = block_sync_page, | 125 | .sync_page = block_sync_page, |
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 8e0d37743e7c..b82e3d9c8790 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c | |||
@@ -54,7 +54,7 @@ static int append = 0; | |||
54 | 54 | ||
55 | static struct inode_operations hostfs_iops; | 55 | static struct inode_operations hostfs_iops; |
56 | static struct inode_operations hostfs_dir_iops; | 56 | static struct inode_operations hostfs_dir_iops; |
57 | static struct address_space_operations hostfs_link_aops; | 57 | static const struct address_space_operations hostfs_link_aops; |
58 | 58 | ||
59 | #ifndef MODULE | 59 | #ifndef MODULE |
60 | static int __init hostfs_args(char *options, int *add) | 60 | static int __init hostfs_args(char *options, int *add) |
@@ -518,7 +518,7 @@ int hostfs_commit_write(struct file *file, struct page *page, unsigned from, | |||
518 | return(err); | 518 | return(err); |
519 | } | 519 | } |
520 | 520 | ||
521 | static struct address_space_operations hostfs_aops = { | 521 | static const struct address_space_operations hostfs_aops = { |
522 | .writepage = hostfs_writepage, | 522 | .writepage = hostfs_writepage, |
523 | .readpage = hostfs_readpage, | 523 | .readpage = hostfs_readpage, |
524 | .set_page_dirty = __set_page_dirty_nobuffers, | 524 | .set_page_dirty = __set_page_dirty_nobuffers, |
@@ -935,7 +935,7 @@ int hostfs_link_readpage(struct file *file, struct page *page) | |||
935 | return(err); | 935 | return(err); |
936 | } | 936 | } |
937 | 937 | ||
938 | static struct address_space_operations hostfs_link_aops = { | 938 | static const struct address_space_operations hostfs_link_aops = { |
939 | .readpage = hostfs_link_readpage, | 939 | .readpage = hostfs_link_readpage, |
940 | }; | 940 | }; |
941 | 941 | ||
diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c index d3b9fffe45a1..d9eb19b7b8ae 100644 --- a/fs/hpfs/file.c +++ b/fs/hpfs/file.c | |||
@@ -99,7 +99,7 @@ static sector_t _hpfs_bmap(struct address_space *mapping, sector_t block) | |||
99 | { | 99 | { |
100 | return generic_block_bmap(mapping,block,hpfs_get_block); | 100 | return generic_block_bmap(mapping,block,hpfs_get_block); |
101 | } | 101 | } |
102 | struct address_space_operations hpfs_aops = { | 102 | const struct address_space_operations hpfs_aops = { |
103 | .readpage = hpfs_readpage, | 103 | .readpage = hpfs_readpage, |
104 | .writepage = hpfs_writepage, | 104 | .writepage = hpfs_writepage, |
105 | .sync_page = block_sync_page, | 105 | .sync_page = block_sync_page, |
diff --git a/fs/hpfs/hpfs_fn.h b/fs/hpfs/hpfs_fn.h index 29b7a3e55173..f687d54ed442 100644 --- a/fs/hpfs/hpfs_fn.h +++ b/fs/hpfs/hpfs_fn.h | |||
@@ -268,7 +268,7 @@ void hpfs_set_ea(struct inode *, struct fnode *, char *, char *, int); | |||
268 | int hpfs_file_fsync(struct file *, struct dentry *, int); | 268 | int hpfs_file_fsync(struct file *, struct dentry *, int); |
269 | extern const struct file_operations hpfs_file_ops; | 269 | extern const struct file_operations hpfs_file_ops; |
270 | extern struct inode_operations hpfs_file_iops; | 270 | extern struct inode_operations hpfs_file_iops; |
271 | extern struct address_space_operations hpfs_aops; | 271 | extern const struct address_space_operations hpfs_aops; |
272 | 272 | ||
273 | /* inode.c */ | 273 | /* inode.c */ |
274 | 274 | ||
@@ -304,7 +304,7 @@ void hpfs_decide_conv(struct inode *, unsigned char *, unsigned); | |||
304 | /* namei.c */ | 304 | /* namei.c */ |
305 | 305 | ||
306 | extern struct inode_operations hpfs_dir_iops; | 306 | extern struct inode_operations hpfs_dir_iops; |
307 | extern struct address_space_operations hpfs_symlink_aops; | 307 | extern const struct address_space_operations hpfs_symlink_aops; |
308 | 308 | ||
309 | static inline struct hpfs_inode_info *hpfs_i(struct inode *inode) | 309 | static inline struct hpfs_inode_info *hpfs_i(struct inode *inode) |
310 | { | 310 | { |
diff --git a/fs/hpfs/namei.c b/fs/hpfs/namei.c index a03abb12c610..59e7dc182a0c 100644 --- a/fs/hpfs/namei.c +++ b/fs/hpfs/namei.c | |||
@@ -538,7 +538,7 @@ fail: | |||
538 | return err; | 538 | return err; |
539 | } | 539 | } |
540 | 540 | ||
541 | struct address_space_operations hpfs_symlink_aops = { | 541 | const struct address_space_operations hpfs_symlink_aops = { |
542 | .readpage = hpfs_symlink_readpage | 542 | .readpage = hpfs_symlink_readpage |
543 | }; | 543 | }; |
544 | 544 | ||
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index e6410d8edd0e..6449cb697967 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
@@ -34,7 +34,7 @@ | |||
34 | #define HUGETLBFS_MAGIC 0x958458f6 | 34 | #define HUGETLBFS_MAGIC 0x958458f6 |
35 | 35 | ||
36 | static struct super_operations hugetlbfs_ops; | 36 | static struct super_operations hugetlbfs_ops; |
37 | static struct address_space_operations hugetlbfs_aops; | 37 | static const struct address_space_operations hugetlbfs_aops; |
38 | const struct file_operations hugetlbfs_file_operations; | 38 | const struct file_operations hugetlbfs_file_operations; |
39 | static struct inode_operations hugetlbfs_dir_inode_operations; | 39 | static struct inode_operations hugetlbfs_dir_inode_operations; |
40 | static struct inode_operations hugetlbfs_inode_operations; | 40 | static struct inode_operations hugetlbfs_inode_operations; |
@@ -547,7 +547,7 @@ static void hugetlbfs_destroy_inode(struct inode *inode) | |||
547 | kmem_cache_free(hugetlbfs_inode_cachep, HUGETLBFS_I(inode)); | 547 | kmem_cache_free(hugetlbfs_inode_cachep, HUGETLBFS_I(inode)); |
548 | } | 548 | } |
549 | 549 | ||
550 | static struct address_space_operations hugetlbfs_aops = { | 550 | static const struct address_space_operations hugetlbfs_aops = { |
551 | .readpage = hugetlbfs_readpage, | 551 | .readpage = hugetlbfs_readpage, |
552 | .prepare_write = hugetlbfs_prepare_write, | 552 | .prepare_write = hugetlbfs_prepare_write, |
553 | .commit_write = hugetlbfs_commit_write, | 553 | .commit_write = hugetlbfs_commit_write, |
diff --git a/fs/inode.c b/fs/inode.c index 3a2446a27d2c..f42961eb983b 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
@@ -102,7 +102,7 @@ static kmem_cache_t * inode_cachep __read_mostly; | |||
102 | 102 | ||
103 | static struct inode *alloc_inode(struct super_block *sb) | 103 | static struct inode *alloc_inode(struct super_block *sb) |
104 | { | 104 | { |
105 | static struct address_space_operations empty_aops; | 105 | static const struct address_space_operations empty_aops; |
106 | static struct inode_operations empty_iops; | 106 | static struct inode_operations empty_iops; |
107 | static const struct file_operations empty_fops; | 107 | static const struct file_operations empty_fops; |
108 | struct inode *inode; | 108 | struct inode *inode; |
diff --git a/fs/isofs/compress.c b/fs/isofs/compress.c index 4917315db732..3a39158cca96 100644 --- a/fs/isofs/compress.c +++ b/fs/isofs/compress.c | |||
@@ -312,7 +312,7 @@ eio: | |||
312 | return err; | 312 | return err; |
313 | } | 313 | } |
314 | 314 | ||
315 | struct address_space_operations zisofs_aops = { | 315 | const struct address_space_operations zisofs_aops = { |
316 | .readpage = zisofs_readpage, | 316 | .readpage = zisofs_readpage, |
317 | /* No sync_page operation supported? */ | 317 | /* No sync_page operation supported? */ |
318 | /* No bmap operation supported */ | 318 | /* No bmap operation supported */ |
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 3f9c8ba1fa1f..bb11c7fb4019 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c | |||
@@ -1054,7 +1054,7 @@ static sector_t _isofs_bmap(struct address_space *mapping, sector_t block) | |||
1054 | return generic_block_bmap(mapping,block,isofs_get_block); | 1054 | return generic_block_bmap(mapping,block,isofs_get_block); |
1055 | } | 1055 | } |
1056 | 1056 | ||
1057 | static struct address_space_operations isofs_aops = { | 1057 | static const struct address_space_operations isofs_aops = { |
1058 | .readpage = isofs_readpage, | 1058 | .readpage = isofs_readpage, |
1059 | .sync_page = block_sync_page, | 1059 | .sync_page = block_sync_page, |
1060 | .bmap = _isofs_bmap | 1060 | .bmap = _isofs_bmap |
diff --git a/fs/isofs/isofs.h b/fs/isofs/isofs.h index b87ba066f5e7..e6308c8b5735 100644 --- a/fs/isofs/isofs.h +++ b/fs/isofs/isofs.h | |||
@@ -176,5 +176,5 @@ isofs_normalize_block_and_offset(struct iso_directory_record* de, | |||
176 | 176 | ||
177 | extern struct inode_operations isofs_dir_inode_operations; | 177 | extern struct inode_operations isofs_dir_inode_operations; |
178 | extern const struct file_operations isofs_dir_operations; | 178 | extern const struct file_operations isofs_dir_operations; |
179 | extern struct address_space_operations isofs_symlink_aops; | 179 | extern const struct address_space_operations isofs_symlink_aops; |
180 | extern struct export_operations isofs_export_ops; | 180 | extern struct export_operations isofs_export_ops; |
diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c index 4326cb47f8fa..f3a1db3098de 100644 --- a/fs/isofs/rock.c +++ b/fs/isofs/rock.c | |||
@@ -754,6 +754,6 @@ error: | |||
754 | return -EIO; | 754 | return -EIO; |
755 | } | 755 | } |
756 | 756 | ||
757 | struct address_space_operations isofs_symlink_aops = { | 757 | const struct address_space_operations isofs_symlink_aops = { |
758 | .readpage = rock_ridge_symlink_readpage | 758 | .readpage = rock_ridge_symlink_readpage |
759 | }; | 759 | }; |
diff --git a/fs/isofs/zisofs.h b/fs/isofs/zisofs.h index d78485d101c2..273795709155 100644 --- a/fs/isofs/zisofs.h +++ b/fs/isofs/zisofs.h | |||
@@ -15,7 +15,7 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | #ifdef CONFIG_ZISOFS | 17 | #ifdef CONFIG_ZISOFS |
18 | extern struct address_space_operations zisofs_aops; | 18 | extern const struct address_space_operations zisofs_aops; |
19 | extern int __init zisofs_init(void); | 19 | extern int __init zisofs_init(void); |
20 | extern void zisofs_cleanup(void); | 20 | extern void zisofs_cleanup(void); |
21 | #endif | 21 | #endif |
diff --git a/fs/jffs/inode-v23.c b/fs/jffs/inode-v23.c index 9e46ea6da752..93068697a9bf 100644 --- a/fs/jffs/inode-v23.c +++ b/fs/jffs/inode-v23.c | |||
@@ -59,7 +59,7 @@ static const struct file_operations jffs_file_operations; | |||
59 | static struct inode_operations jffs_file_inode_operations; | 59 | static struct inode_operations jffs_file_inode_operations; |
60 | static const struct file_operations jffs_dir_operations; | 60 | static const struct file_operations jffs_dir_operations; |
61 | static struct inode_operations jffs_dir_inode_operations; | 61 | static struct inode_operations jffs_dir_inode_operations; |
62 | static struct address_space_operations jffs_address_operations; | 62 | static const struct address_space_operations jffs_address_operations; |
63 | 63 | ||
64 | kmem_cache_t *node_cache = NULL; | 64 | kmem_cache_t *node_cache = NULL; |
65 | kmem_cache_t *fm_cache = NULL; | 65 | kmem_cache_t *fm_cache = NULL; |
@@ -1614,7 +1614,7 @@ jffs_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | |||
1614 | } /* jffs_ioctl() */ | 1614 | } /* jffs_ioctl() */ |
1615 | 1615 | ||
1616 | 1616 | ||
1617 | static struct address_space_operations jffs_address_operations = { | 1617 | static const struct address_space_operations jffs_address_operations = { |
1618 | .readpage = jffs_readpage, | 1618 | .readpage = jffs_readpage, |
1619 | .prepare_write = jffs_prepare_write, | 1619 | .prepare_write = jffs_prepare_write, |
1620 | .commit_write = jffs_commit_write, | 1620 | .commit_write = jffs_commit_write, |
diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c index bb8844f40e48..3ed6e3e120b6 100644 --- a/fs/jffs2/file.c +++ b/fs/jffs2/file.c | |||
@@ -62,7 +62,7 @@ struct inode_operations jffs2_file_inode_operations = | |||
62 | .removexattr = jffs2_removexattr | 62 | .removexattr = jffs2_removexattr |
63 | }; | 63 | }; |
64 | 64 | ||
65 | struct address_space_operations jffs2_file_address_operations = | 65 | const struct address_space_operations jffs2_file_address_operations = |
66 | { | 66 | { |
67 | .readpage = jffs2_readpage, | 67 | .readpage = jffs2_readpage, |
68 | .prepare_write =jffs2_prepare_write, | 68 | .prepare_write =jffs2_prepare_write, |
diff --git a/fs/jffs2/os-linux.h b/fs/jffs2/os-linux.h index 6b5223565405..9f41fc01a371 100644 --- a/fs/jffs2/os-linux.h +++ b/fs/jffs2/os-linux.h | |||
@@ -158,7 +158,7 @@ extern struct inode_operations jffs2_dir_inode_operations; | |||
158 | /* file.c */ | 158 | /* file.c */ |
159 | extern const struct file_operations jffs2_file_operations; | 159 | extern const struct file_operations jffs2_file_operations; |
160 | extern struct inode_operations jffs2_file_inode_operations; | 160 | extern struct inode_operations jffs2_file_inode_operations; |
161 | extern struct address_space_operations jffs2_file_address_operations; | 161 | extern const struct address_space_operations jffs2_file_address_operations; |
162 | int jffs2_fsync(struct file *, struct dentry *, int); | 162 | int jffs2_fsync(struct file *, struct dentry *, int); |
163 | int jffs2_do_readpage_unlock (struct inode *inode, struct page *pg); | 163 | int jffs2_do_readpage_unlock (struct inode *inode, struct page *pg); |
164 | 164 | ||
diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index 04eb78f1252e..43e3f566aad6 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c | |||
@@ -305,7 +305,7 @@ static ssize_t jfs_direct_IO(int rw, struct kiocb *iocb, | |||
305 | offset, nr_segs, jfs_get_block, NULL); | 305 | offset, nr_segs, jfs_get_block, NULL); |
306 | } | 306 | } |
307 | 307 | ||
308 | struct address_space_operations jfs_aops = { | 308 | const struct address_space_operations jfs_aops = { |
309 | .readpage = jfs_readpage, | 309 | .readpage = jfs_readpage, |
310 | .readpages = jfs_readpages, | 310 | .readpages = jfs_readpages, |
311 | .writepage = jfs_writepage, | 311 | .writepage = jfs_writepage, |
diff --git a/fs/jfs/jfs_inode.h b/fs/jfs/jfs_inode.h index c30072674464..b5c7da6190dc 100644 --- a/fs/jfs/jfs_inode.h +++ b/fs/jfs/jfs_inode.h | |||
@@ -33,7 +33,7 @@ extern void jfs_free_zero_link(struct inode *); | |||
33 | extern struct dentry *jfs_get_parent(struct dentry *dentry); | 33 | extern struct dentry *jfs_get_parent(struct dentry *dentry); |
34 | extern void jfs_set_inode_flags(struct inode *); | 34 | extern void jfs_set_inode_flags(struct inode *); |
35 | 35 | ||
36 | extern struct address_space_operations jfs_aops; | 36 | extern const struct address_space_operations jfs_aops; |
37 | extern struct inode_operations jfs_dir_inode_operations; | 37 | extern struct inode_operations jfs_dir_inode_operations; |
38 | extern const struct file_operations jfs_dir_operations; | 38 | extern const struct file_operations jfs_dir_operations; |
39 | extern struct inode_operations jfs_file_inode_operations; | 39 | extern struct inode_operations jfs_file_inode_operations; |
diff --git a/fs/jfs/jfs_metapage.c b/fs/jfs/jfs_metapage.c index 7f6e88039700..e1e0a6e6ebdf 100644 --- a/fs/jfs/jfs_metapage.c +++ b/fs/jfs/jfs_metapage.c | |||
@@ -577,7 +577,7 @@ static void metapage_invalidatepage(struct page *page, unsigned long offset) | |||
577 | metapage_releasepage(page, 0); | 577 | metapage_releasepage(page, 0); |
578 | } | 578 | } |
579 | 579 | ||
580 | struct address_space_operations jfs_metapage_aops = { | 580 | const struct address_space_operations jfs_metapage_aops = { |
581 | .readpage = metapage_readpage, | 581 | .readpage = metapage_readpage, |
582 | .writepage = metapage_writepage, | 582 | .writepage = metapage_writepage, |
583 | .sync_page = block_sync_page, | 583 | .sync_page = block_sync_page, |
diff --git a/fs/jfs/jfs_metapage.h b/fs/jfs/jfs_metapage.h index f0b7d3282b07..d17a3290f5aa 100644 --- a/fs/jfs/jfs_metapage.h +++ b/fs/jfs/jfs_metapage.h | |||
@@ -139,7 +139,7 @@ static inline void metapage_homeok(struct metapage *mp) | |||
139 | put_metapage(mp); | 139 | put_metapage(mp); |
140 | } | 140 | } |
141 | 141 | ||
142 | extern struct address_space_operations jfs_metapage_aops; | 142 | extern const struct address_space_operations jfs_metapage_aops; |
143 | 143 | ||
144 | /* | 144 | /* |
145 | * This routines invalidate all pages for an extent. | 145 | * This routines invalidate all pages for an extent. |
diff --git a/fs/minix/inode.c b/fs/minix/inode.c index a6fb509b7341..9ea91c5eeb7b 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c | |||
@@ -335,7 +335,7 @@ static sector_t minix_bmap(struct address_space *mapping, sector_t block) | |||
335 | { | 335 | { |
336 | return generic_block_bmap(mapping,block,minix_get_block); | 336 | return generic_block_bmap(mapping,block,minix_get_block); |
337 | } | 337 | } |
338 | static struct address_space_operations minix_aops = { | 338 | static const struct address_space_operations minix_aops = { |
339 | .readpage = minix_readpage, | 339 | .readpage = minix_readpage, |
340 | .writepage = minix_writepage, | 340 | .writepage = minix_writepage, |
341 | .sync_page = block_sync_page, | 341 | .sync_page = block_sync_page, |
diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c index 90d2ea28f333..6c51c1198464 100644 --- a/fs/ncpfs/inode.c +++ b/fs/ncpfs/inode.c | |||
@@ -105,7 +105,7 @@ static struct super_operations ncp_sops = | |||
105 | 105 | ||
106 | extern struct dentry_operations ncp_root_dentry_operations; | 106 | extern struct dentry_operations ncp_root_dentry_operations; |
107 | #if defined(CONFIG_NCPFS_EXTRAS) || defined(CONFIG_NCPFS_NFS_NS) | 107 | #if defined(CONFIG_NCPFS_EXTRAS) || defined(CONFIG_NCPFS_NFS_NS) |
108 | extern struct address_space_operations ncp_symlink_aops; | 108 | extern const struct address_space_operations ncp_symlink_aops; |
109 | extern int ncp_symlink(struct inode*, struct dentry*, const char*); | 109 | extern int ncp_symlink(struct inode*, struct dentry*, const char*); |
110 | #endif | 110 | #endif |
111 | 111 | ||
diff --git a/fs/ncpfs/symlink.c b/fs/ncpfs/symlink.c index e935f1b34bc2..f76b1392a012 100644 --- a/fs/ncpfs/symlink.c +++ b/fs/ncpfs/symlink.c | |||
@@ -99,7 +99,7 @@ fail: | |||
99 | /* | 99 | /* |
100 | * symlinks can't do much... | 100 | * symlinks can't do much... |
101 | */ | 101 | */ |
102 | struct address_space_operations ncp_symlink_aops = { | 102 | const struct address_space_operations ncp_symlink_aops = { |
103 | .readpage = ncp_symlink_readpage, | 103 | .readpage = ncp_symlink_readpage, |
104 | }; | 104 | }; |
105 | 105 | ||
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index add289138836..cc2b874ad5a4 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
@@ -315,7 +315,7 @@ static int nfs_release_page(struct page *page, gfp_t gfp) | |||
315 | return !nfs_wb_page(page->mapping->host, page); | 315 | return !nfs_wb_page(page->mapping->host, page); |
316 | } | 316 | } |
317 | 317 | ||
318 | struct address_space_operations nfs_file_aops = { | 318 | const struct address_space_operations nfs_file_aops = { |
319 | .readpage = nfs_readpage, | 319 | .readpage = nfs_readpage, |
320 | .readpages = nfs_readpages, | 320 | .readpages = nfs_readpages, |
321 | .set_page_dirty = __set_page_dirty_nobuffers, | 321 | .set_page_dirty = __set_page_dirty_nobuffers, |
diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c index 580412d330cb..bc579bfdfbd8 100644 --- a/fs/ntfs/aops.c +++ b/fs/ntfs/aops.c | |||
@@ -1544,7 +1544,7 @@ err_out: | |||
1544 | /** | 1544 | /** |
1545 | * ntfs_aops - general address space operations for inodes and attributes | 1545 | * ntfs_aops - general address space operations for inodes and attributes |
1546 | */ | 1546 | */ |
1547 | struct address_space_operations ntfs_aops = { | 1547 | const struct address_space_operations ntfs_aops = { |
1548 | .readpage = ntfs_readpage, /* Fill page with data. */ | 1548 | .readpage = ntfs_readpage, /* Fill page with data. */ |
1549 | .sync_page = block_sync_page, /* Currently, just unplugs the | 1549 | .sync_page = block_sync_page, /* Currently, just unplugs the |
1550 | disk request queue. */ | 1550 | disk request queue. */ |
@@ -1560,7 +1560,7 @@ struct address_space_operations ntfs_aops = { | |||
1560 | * ntfs_mst_aops - general address space operations for mst protecteed inodes | 1560 | * ntfs_mst_aops - general address space operations for mst protecteed inodes |
1561 | * and attributes | 1561 | * and attributes |
1562 | */ | 1562 | */ |
1563 | struct address_space_operations ntfs_mst_aops = { | 1563 | const struct address_space_operations ntfs_mst_aops = { |
1564 | .readpage = ntfs_readpage, /* Fill page with data. */ | 1564 | .readpage = ntfs_readpage, /* Fill page with data. */ |
1565 | .sync_page = block_sync_page, /* Currently, just unplugs the | 1565 | .sync_page = block_sync_page, /* Currently, just unplugs the |
1566 | disk request queue. */ | 1566 | disk request queue. */ |
diff --git a/fs/ntfs/ntfs.h b/fs/ntfs/ntfs.h index bf7b3d7c0930..ddd3d503097c 100644 --- a/fs/ntfs/ntfs.h +++ b/fs/ntfs/ntfs.h | |||
@@ -57,8 +57,8 @@ extern struct kmem_cache *ntfs_attr_ctx_cache; | |||
57 | extern struct kmem_cache *ntfs_index_ctx_cache; | 57 | extern struct kmem_cache *ntfs_index_ctx_cache; |
58 | 58 | ||
59 | /* The various operations structs defined throughout the driver files. */ | 59 | /* The various operations structs defined throughout the driver files. */ |
60 | extern struct address_space_operations ntfs_aops; | 60 | extern const struct address_space_operations ntfs_aops; |
61 | extern struct address_space_operations ntfs_mst_aops; | 61 | extern const struct address_space_operations ntfs_mst_aops; |
62 | 62 | ||
63 | extern const struct file_operations ntfs_file_ops; | 63 | extern const struct file_operations ntfs_file_ops; |
64 | extern struct inode_operations ntfs_file_inode_ops; | 64 | extern struct inode_operations ntfs_file_inode_ops; |
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 47152bf9a7f2..cca71317b6d6 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
@@ -666,7 +666,7 @@ out: | |||
666 | return ret; | 666 | return ret; |
667 | } | 667 | } |
668 | 668 | ||
669 | struct address_space_operations ocfs2_aops = { | 669 | const struct address_space_operations ocfs2_aops = { |
670 | .readpage = ocfs2_readpage, | 670 | .readpage = ocfs2_readpage, |
671 | .writepage = ocfs2_writepage, | 671 | .writepage = ocfs2_writepage, |
672 | .prepare_write = ocfs2_prepare_write, | 672 | .prepare_write = ocfs2_prepare_write, |
diff --git a/fs/ocfs2/inode.h b/fs/ocfs2/inode.h index 84c507961287..35140f6cf840 100644 --- a/fs/ocfs2/inode.h +++ b/fs/ocfs2/inode.h | |||
@@ -114,7 +114,7 @@ static inline struct ocfs2_inode_info *OCFS2_I(struct inode *inode) | |||
114 | 114 | ||
115 | extern kmem_cache_t *ocfs2_inode_cache; | 115 | extern kmem_cache_t *ocfs2_inode_cache; |
116 | 116 | ||
117 | extern struct address_space_operations ocfs2_aops; | 117 | extern const struct address_space_operations ocfs2_aops; |
118 | 118 | ||
119 | struct buffer_head *ocfs2_bread(struct inode *inode, int block, | 119 | struct buffer_head *ocfs2_bread(struct inode *inode, int block, |
120 | int *err, int reada); | 120 | int *err, int reada); |
diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c index 2f24c46f72a1..8bc182a88748 100644 --- a/fs/qnx4/inode.c +++ b/fs/qnx4/inode.c | |||
@@ -450,7 +450,7 @@ static sector_t qnx4_bmap(struct address_space *mapping, sector_t block) | |||
450 | { | 450 | { |
451 | return generic_block_bmap(mapping,block,qnx4_get_block); | 451 | return generic_block_bmap(mapping,block,qnx4_get_block); |
452 | } | 452 | } |
453 | static struct address_space_operations qnx4_aops = { | 453 | static const struct address_space_operations qnx4_aops = { |
454 | .readpage = qnx4_readpage, | 454 | .readpage = qnx4_readpage, |
455 | .writepage = qnx4_writepage, | 455 | .writepage = qnx4_writepage, |
456 | .sync_page = block_sync_page, | 456 | .sync_page = block_sync_page, |
diff --git a/fs/ramfs/file-mmu.c b/fs/ramfs/file-mmu.c index 00a933eb820c..86f14cacf641 100644 --- a/fs/ramfs/file-mmu.c +++ b/fs/ramfs/file-mmu.c | |||
@@ -26,7 +26,7 @@ | |||
26 | 26 | ||
27 | #include <linux/fs.h> | 27 | #include <linux/fs.h> |
28 | 28 | ||
29 | struct address_space_operations ramfs_aops = { | 29 | const struct address_space_operations ramfs_aops = { |
30 | .readpage = simple_readpage, | 30 | .readpage = simple_readpage, |
31 | .prepare_write = simple_prepare_write, | 31 | .prepare_write = simple_prepare_write, |
32 | .commit_write = simple_commit_write | 32 | .commit_write = simple_commit_write |
diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c index f443a84b98a5..99fffc9e1bfd 100644 --- a/fs/ramfs/file-nommu.c +++ b/fs/ramfs/file-nommu.c | |||
@@ -27,7 +27,7 @@ | |||
27 | 27 | ||
28 | static int ramfs_nommu_setattr(struct dentry *, struct iattr *); | 28 | static int ramfs_nommu_setattr(struct dentry *, struct iattr *); |
29 | 29 | ||
30 | struct address_space_operations ramfs_aops = { | 30 | const struct address_space_operations ramfs_aops = { |
31 | .readpage = simple_readpage, | 31 | .readpage = simple_readpage, |
32 | .prepare_write = simple_prepare_write, | 32 | .prepare_write = simple_prepare_write, |
33 | .commit_write = simple_commit_write | 33 | .commit_write = simple_commit_write |
diff --git a/fs/ramfs/internal.h b/fs/ramfs/internal.h index 313237631b49..c2bb58e74653 100644 --- a/fs/ramfs/internal.h +++ b/fs/ramfs/internal.h | |||
@@ -10,6 +10,6 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | 12 | ||
13 | extern struct address_space_operations ramfs_aops; | 13 | extern const struct address_space_operations ramfs_aops; |
14 | extern const struct file_operations ramfs_file_operations; | 14 | extern const struct file_operations ramfs_file_operations; |
15 | extern struct inode_operations ramfs_file_inode_operations; | 15 | extern struct inode_operations ramfs_file_inode_operations; |
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 9857e50f85e7..a24858a632fa 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
@@ -2996,7 +2996,7 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
2996 | return error; | 2996 | return error; |
2997 | } | 2997 | } |
2998 | 2998 | ||
2999 | struct address_space_operations reiserfs_address_space_operations = { | 2999 | const struct address_space_operations reiserfs_address_space_operations = { |
3000 | .writepage = reiserfs_writepage, | 3000 | .writepage = reiserfs_writepage, |
3001 | .readpage = reiserfs_readpage, | 3001 | .readpage = reiserfs_readpage, |
3002 | .readpages = reiserfs_readpages, | 3002 | .readpages = reiserfs_readpages, |
diff --git a/fs/romfs/inode.c b/fs/romfs/inode.c index 283fbc6b8eea..22eed61ebf69 100644 --- a/fs/romfs/inode.c +++ b/fs/romfs/inode.c | |||
@@ -459,7 +459,7 @@ err_out: | |||
459 | 459 | ||
460 | /* Mapping from our types to the kernel */ | 460 | /* Mapping from our types to the kernel */ |
461 | 461 | ||
462 | static struct address_space_operations romfs_aops = { | 462 | static const struct address_space_operations romfs_aops = { |
463 | .readpage = romfs_readpage | 463 | .readpage = romfs_readpage |
464 | }; | 464 | }; |
465 | 465 | ||
diff --git a/fs/smbfs/file.c b/fs/smbfs/file.c index ed9a24d19d7d..dae67048baba 100644 --- a/fs/smbfs/file.c +++ b/fs/smbfs/file.c | |||
@@ -306,7 +306,7 @@ static int smb_commit_write(struct file *file, struct page *page, | |||
306 | return status; | 306 | return status; |
307 | } | 307 | } |
308 | 308 | ||
309 | struct address_space_operations smb_file_aops = { | 309 | const struct address_space_operations smb_file_aops = { |
310 | .readpage = smb_readpage, | 310 | .readpage = smb_readpage, |
311 | .writepage = smb_writepage, | 311 | .writepage = smb_writepage, |
312 | .prepare_write = smb_prepare_write, | 312 | .prepare_write = smb_prepare_write, |
diff --git a/fs/smbfs/proto.h b/fs/smbfs/proto.h index 972ed7dad388..34fb462b2379 100644 --- a/fs/smbfs/proto.h +++ b/fs/smbfs/proto.h | |||
@@ -63,7 +63,7 @@ extern int smb_revalidate_inode(struct dentry *dentry); | |||
63 | extern int smb_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat); | 63 | extern int smb_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat); |
64 | extern int smb_notify_change(struct dentry *dentry, struct iattr *attr); | 64 | extern int smb_notify_change(struct dentry *dentry, struct iattr *attr); |
65 | /* file.c */ | 65 | /* file.c */ |
66 | extern struct address_space_operations smb_file_aops; | 66 | extern const struct address_space_operations smb_file_aops; |
67 | extern const struct file_operations smb_file_operations; | 67 | extern const struct file_operations smb_file_operations; |
68 | extern struct inode_operations smb_file_inode_operations; | 68 | extern struct inode_operations smb_file_inode_operations; |
69 | /* ioctl.c */ | 69 | /* ioctl.c */ |
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index f0b347bd12ca..5e0e31cc46f5 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c | |||
@@ -16,7 +16,7 @@ | |||
16 | 16 | ||
17 | extern struct super_block * sysfs_sb; | 17 | extern struct super_block * sysfs_sb; |
18 | 18 | ||
19 | static struct address_space_operations sysfs_aops = { | 19 | static const struct address_space_operations sysfs_aops = { |
20 | .readpage = simple_readpage, | 20 | .readpage = simple_readpage, |
21 | .prepare_write = simple_prepare_write, | 21 | .prepare_write = simple_prepare_write, |
22 | .commit_write = simple_commit_write | 22 | .commit_write = simple_commit_write |
diff --git a/fs/sysv/itree.c b/fs/sysv/itree.c index 86f5f8d43d0f..f2bcccd1d6fc 100644 --- a/fs/sysv/itree.c +++ b/fs/sysv/itree.c | |||
@@ -465,7 +465,7 @@ static sector_t sysv_bmap(struct address_space *mapping, sector_t block) | |||
465 | { | 465 | { |
466 | return generic_block_bmap(mapping,block,get_block); | 466 | return generic_block_bmap(mapping,block,get_block); |
467 | } | 467 | } |
468 | struct address_space_operations sysv_aops = { | 468 | const struct address_space_operations sysv_aops = { |
469 | .readpage = sysv_readpage, | 469 | .readpage = sysv_readpage, |
470 | .writepage = sysv_writepage, | 470 | .writepage = sysv_writepage, |
471 | .sync_page = block_sync_page, | 471 | .sync_page = block_sync_page, |
diff --git a/fs/sysv/sysv.h b/fs/sysv/sysv.h index 393a480e4deb..9dcc82120935 100644 --- a/fs/sysv/sysv.h +++ b/fs/sysv/sysv.h | |||
@@ -161,7 +161,7 @@ extern struct inode_operations sysv_dir_inode_operations; | |||
161 | extern struct inode_operations sysv_fast_symlink_inode_operations; | 161 | extern struct inode_operations sysv_fast_symlink_inode_operations; |
162 | extern const struct file_operations sysv_file_operations; | 162 | extern const struct file_operations sysv_file_operations; |
163 | extern const struct file_operations sysv_dir_operations; | 163 | extern const struct file_operations sysv_dir_operations; |
164 | extern struct address_space_operations sysv_aops; | 164 | extern const struct address_space_operations sysv_aops; |
165 | extern struct super_operations sysv_sops; | 165 | extern struct super_operations sysv_sops; |
166 | extern struct dentry_operations sysv_dentry_operations; | 166 | extern struct dentry_operations sysv_dentry_operations; |
167 | 167 | ||
diff --git a/fs/udf/file.c b/fs/udf/file.c index e34b00e303f1..a59e5f33daf6 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
@@ -95,7 +95,7 @@ static int udf_adinicb_commit_write(struct file *file, struct page *page, unsign | |||
95 | return 0; | 95 | return 0; |
96 | } | 96 | } |
97 | 97 | ||
98 | struct address_space_operations udf_adinicb_aops = { | 98 | const struct address_space_operations udf_adinicb_aops = { |
99 | .readpage = udf_adinicb_readpage, | 99 | .readpage = udf_adinicb_readpage, |
100 | .writepage = udf_adinicb_writepage, | 100 | .writepage = udf_adinicb_writepage, |
101 | .sync_page = block_sync_page, | 101 | .sync_page = block_sync_page, |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 2983afd5e7fd..605f5111b6d8 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
@@ -132,7 +132,7 @@ static sector_t udf_bmap(struct address_space *mapping, sector_t block) | |||
132 | return generic_block_bmap(mapping,block,udf_get_block); | 132 | return generic_block_bmap(mapping,block,udf_get_block); |
133 | } | 133 | } |
134 | 134 | ||
135 | struct address_space_operations udf_aops = { | 135 | const struct address_space_operations udf_aops = { |
136 | .readpage = udf_readpage, | 136 | .readpage = udf_readpage, |
137 | .writepage = udf_writepage, | 137 | .writepage = udf_writepage, |
138 | .sync_page = block_sync_page, | 138 | .sync_page = block_sync_page, |
diff --git a/fs/udf/symlink.c b/fs/udf/symlink.c index 674bb40edc83..ba068a786563 100644 --- a/fs/udf/symlink.c +++ b/fs/udf/symlink.c | |||
@@ -113,6 +113,6 @@ out: | |||
113 | /* | 113 | /* |
114 | * symlinks can't do much... | 114 | * symlinks can't do much... |
115 | */ | 115 | */ |
116 | struct address_space_operations udf_symlink_aops = { | 116 | const struct address_space_operations udf_symlink_aops = { |
117 | .readpage = udf_symlink_filler, | 117 | .readpage = udf_symlink_filler, |
118 | }; | 118 | }; |
diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h index 023e19ba5a2e..2f992387cc9e 100644 --- a/fs/udf/udfdecl.h +++ b/fs/udf/udfdecl.h | |||
@@ -47,9 +47,9 @@ extern struct inode_operations udf_dir_inode_operations; | |||
47 | extern const struct file_operations udf_dir_operations; | 47 | extern const struct file_operations udf_dir_operations; |
48 | extern struct inode_operations udf_file_inode_operations; | 48 | extern struct inode_operations udf_file_inode_operations; |
49 | extern const struct file_operations udf_file_operations; | 49 | extern const struct file_operations udf_file_operations; |
50 | extern struct address_space_operations udf_aops; | 50 | extern const struct address_space_operations udf_aops; |
51 | extern struct address_space_operations udf_adinicb_aops; | 51 | extern const struct address_space_operations udf_adinicb_aops; |
52 | extern struct address_space_operations udf_symlink_aops; | 52 | extern const struct address_space_operations udf_symlink_aops; |
53 | 53 | ||
54 | struct udf_fileident_bh | 54 | struct udf_fileident_bh |
55 | { | 55 | { |
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 259bd196099d..488b5ff48afb 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c | |||
@@ -98,7 +98,9 @@ static u64 ufs_frag_map(struct inode *inode, sector_t frag) | |||
98 | u64 temp = 0L; | 98 | u64 temp = 0L; |
99 | 99 | ||
100 | UFSD(": frag = %llu depth = %d\n", (unsigned long long)frag, depth); | 100 | UFSD(": frag = %llu depth = %d\n", (unsigned long long)frag, depth); |
101 | UFSD(": uspi->s_fpbshift = %d ,uspi->s_apbmask = %x, mask=%llx\n",uspi->s_fpbshift,uspi->s_apbmask,mask); | 101 | UFSD(": uspi->s_fpbshift = %d ,uspi->s_apbmask = %x, mask=%llx\n", |
102 | uspi->s_fpbshift, uspi->s_apbmask, | ||
103 | (unsigned long long)mask); | ||
102 | 104 | ||
103 | if (depth == 0) | 105 | if (depth == 0) |
104 | return 0; | 106 | return 0; |
@@ -429,7 +431,7 @@ int ufs_getfrag_block(struct inode *inode, sector_t fragment, struct buffer_head | |||
429 | 431 | ||
430 | if (!create) { | 432 | if (!create) { |
431 | phys64 = ufs_frag_map(inode, fragment); | 433 | phys64 = ufs_frag_map(inode, fragment); |
432 | UFSD("phys64 = %llu \n",phys64); | 434 | UFSD("phys64 = %llu\n", (unsigned long long)phys64); |
433 | if (phys64) | 435 | if (phys64) |
434 | map_bh(bh_result, sb, phys64); | 436 | map_bh(bh_result, sb, phys64); |
435 | return 0; | 437 | return 0; |
@@ -574,7 +576,7 @@ static sector_t ufs_bmap(struct address_space *mapping, sector_t block) | |||
574 | { | 576 | { |
575 | return generic_block_bmap(mapping,block,ufs_getfrag_block); | 577 | return generic_block_bmap(mapping,block,ufs_getfrag_block); |
576 | } | 578 | } |
577 | struct address_space_operations ufs_aops = { | 579 | const struct address_space_operations ufs_aops = { |
578 | .readpage = ufs_readpage, | 580 | .readpage = ufs_readpage, |
579 | .writepage = ufs_writepage, | 581 | .writepage = ufs_writepage, |
580 | .sync_page = block_sync_page, | 582 | .sync_page = block_sync_page, |
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 3e807b828e22..c40f81ba9b13 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c | |||
@@ -1454,7 +1454,7 @@ xfs_vm_invalidatepage( | |||
1454 | block_invalidatepage(page, offset); | 1454 | block_invalidatepage(page, offset); |
1455 | } | 1455 | } |
1456 | 1456 | ||
1457 | struct address_space_operations xfs_address_space_operations = { | 1457 | const struct address_space_operations xfs_address_space_operations = { |
1458 | .readpage = xfs_vm_readpage, | 1458 | .readpage = xfs_vm_readpage, |
1459 | .readpages = xfs_vm_readpages, | 1459 | .readpages = xfs_vm_readpages, |
1460 | .writepage = xfs_vm_writepage, | 1460 | .writepage = xfs_vm_writepage, |
diff --git a/fs/xfs/linux-2.6/xfs_aops.h b/fs/xfs/linux-2.6/xfs_aops.h index 706d8c781b8a..2244e516b66a 100644 --- a/fs/xfs/linux-2.6/xfs_aops.h +++ b/fs/xfs/linux-2.6/xfs_aops.h | |||
@@ -40,7 +40,7 @@ typedef struct xfs_ioend { | |||
40 | struct work_struct io_work; /* xfsdatad work queue */ | 40 | struct work_struct io_work; /* xfsdatad work queue */ |
41 | } xfs_ioend_t; | 41 | } xfs_ioend_t; |
42 | 42 | ||
43 | extern struct address_space_operations xfs_address_space_operations; | 43 | extern const struct address_space_operations xfs_address_space_operations; |
44 | extern int xfs_get_blocks(struct inode *, sector_t, struct buffer_head *, int); | 44 | extern int xfs_get_blocks(struct inode *, sector_t, struct buffer_head *, int); |
45 | 45 | ||
46 | #endif /* __XFS_AOPS_H__ */ | 46 | #endif /* __XFS_AOPS_H__ */ |
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 26fed0756f01..2af528dcfb04 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
@@ -1520,7 +1520,7 @@ xfs_mapping_buftarg( | |||
1520 | struct backing_dev_info *bdi; | 1520 | struct backing_dev_info *bdi; |
1521 | struct inode *inode; | 1521 | struct inode *inode; |
1522 | struct address_space *mapping; | 1522 | struct address_space *mapping; |
1523 | static struct address_space_operations mapping_aops = { | 1523 | static const struct address_space_operations mapping_aops = { |
1524 | .sync_page = block_sync_page, | 1524 | .sync_page = block_sync_page, |
1525 | .migratepage = fail_migrate_page, | 1525 | .migratepage = fail_migrate_page, |
1526 | }; | 1526 | }; |
diff --git a/include/asm-alpha/hw_irq.h b/include/asm-alpha/hw_irq.h index ca9d43b63502..a37db0f95092 100644 --- a/include/asm-alpha/hw_irq.h +++ b/include/asm-alpha/hw_irq.h | |||
@@ -2,8 +2,6 @@ | |||
2 | #define _ALPHA_HW_IRQ_H | 2 | #define _ALPHA_HW_IRQ_H |
3 | 3 | ||
4 | 4 | ||
5 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} | ||
6 | |||
7 | extern volatile unsigned long irq_err_count; | 5 | extern volatile unsigned long irq_err_count; |
8 | 6 | ||
9 | #ifdef CONFIG_ALPHA_GENERIC | 7 | #ifdef CONFIG_ALPHA_GENERIC |
diff --git a/include/asm-arm/arch-at91rm9200/memory.h b/include/asm-arm/arch-at91rm9200/memory.h index 3c327c404373..f985069e6d01 100644 --- a/include/asm-arm/arch-at91rm9200/memory.h +++ b/include/asm-arm/arch-at91rm9200/memory.h | |||
@@ -33,9 +33,7 @@ | |||
33 | * bus_to_virt: Used to convert an address for DMA operations | 33 | * bus_to_virt: Used to convert an address for DMA operations |
34 | * to an address that the kernel can use. | 34 | * to an address that the kernel can use. |
35 | */ | 35 | */ |
36 | #define __virt_to_bus__is_a_macro | ||
37 | #define __virt_to_bus(x) __virt_to_phys(x) | 36 | #define __virt_to_bus(x) __virt_to_phys(x) |
38 | #define __bus_to_virt__is_a_macro | ||
39 | #define __bus_to_virt(x) __phys_to_virt(x) | 37 | #define __bus_to_virt(x) __phys_to_virt(x) |
40 | 38 | ||
41 | #endif | 39 | #endif |
diff --git a/include/asm-arm/arch-h720x/memory.h b/include/asm-arm/arch-h720x/memory.h index 4a1bfd78a0fe..53e923dba76e 100644 --- a/include/asm-arm/arch-h720x/memory.h +++ b/include/asm-arm/arch-h720x/memory.h | |||
@@ -23,9 +23,7 @@ | |||
23 | * There is something to do here later !, Mar 2000, Jungjun Kim | 23 | * There is something to do here later !, Mar 2000, Jungjun Kim |
24 | */ | 24 | */ |
25 | 25 | ||
26 | #define __virt_to_bus__is_a_macro | ||
27 | #define __virt_to_bus(x) __virt_to_phys(x) | 26 | #define __virt_to_bus(x) __virt_to_phys(x) |
28 | #define __bus_to_virt__is_a_macro | ||
29 | #define __bus_to_virt(x) __phys_to_virt(x) | 27 | #define __bus_to_virt(x) __phys_to_virt(x) |
30 | 28 | ||
31 | #endif | 29 | #endif |
diff --git a/include/asm-arm/arch-imx/memory.h b/include/asm-arm/arch-imx/memory.h index d09ae32cd2f4..5ad90127915f 100644 --- a/include/asm-arm/arch-imx/memory.h +++ b/include/asm-arm/arch-imx/memory.h | |||
@@ -30,9 +30,7 @@ | |||
30 | * bus_to_virt: Used to convert an address for DMA operations | 30 | * bus_to_virt: Used to convert an address for DMA operations |
31 | * to an address that the kernel can use. | 31 | * to an address that the kernel can use. |
32 | */ | 32 | */ |
33 | #define __virt_to_bus__is_a_macro | 33 | #define __virt_to_bus(x) (x - PAGE_OFFSET + PHYS_OFFSET) |
34 | #define __virt_to_bus(x) (x - PAGE_OFFSET + PHYS_OFFSET) | 34 | #define __bus_to_virt(x) (x - PHYS_OFFSET + PAGE_OFFSET) |
35 | #define __bus_to_virt__is_a_macro | ||
36 | #define __bus_to_virt(x) (x - PHYS_OFFSET + PAGE_OFFSET) | ||
37 | 35 | ||
38 | #endif | 36 | #endif |
diff --git a/include/asm-arm/arch-ixp23xx/ixp23xx.h b/include/asm-arm/arch-ixp23xx/ixp23xx.h index d0a72201ee96..3927b1d61b17 100644 --- a/include/asm-arm/arch-ixp23xx/ixp23xx.h +++ b/include/asm-arm/arch-ixp23xx/ixp23xx.h | |||
@@ -295,15 +295,4 @@ | |||
295 | #define IXP23XX_PCI_CPP_ADDR_BITS IXP23XX_PCI_CSR(0x0160) | 295 | #define IXP23XX_PCI_CPP_ADDR_BITS IXP23XX_PCI_CSR(0x0160) |
296 | 296 | ||
297 | 297 | ||
298 | #ifndef __ASSEMBLY__ | ||
299 | /* | ||
300 | * Is system memory on the XSI or CPP bus? | ||
301 | */ | ||
302 | static inline unsigned ixp23xx_cpp_boot(void) | ||
303 | { | ||
304 | return (*IXP23XX_EXP_CFG0 & IXP23XX_EXP_CFG0_XSI_NOT_PRES); | ||
305 | } | ||
306 | #endif | ||
307 | |||
308 | |||
309 | #endif | 298 | #endif |
diff --git a/include/asm-arm/arch-ixp23xx/platform.h b/include/asm-arm/arch-ixp23xx/platform.h index 19a73b39c864..56e16d66645a 100644 --- a/include/asm-arm/arch-ixp23xx/platform.h +++ b/include/asm-arm/arch-ixp23xx/platform.h | |||
@@ -43,5 +43,15 @@ extern struct sys_timer ixp23xx_timer; | |||
43 | 43 | ||
44 | #define IXP23XX_UART_XTAL 14745600 | 44 | #define IXP23XX_UART_XTAL 14745600 |
45 | 45 | ||
46 | #ifndef __ASSEMBLY__ | ||
47 | /* | ||
48 | * Is system memory on the XSI or CPP bus? | ||
49 | */ | ||
50 | static inline unsigned ixp23xx_cpp_boot(void) | ||
51 | { | ||
52 | return (*IXP23XX_EXP_CFG0 & IXP23XX_EXP_CFG0_XSI_NOT_PRES); | ||
53 | } | ||
54 | #endif | ||
55 | |||
46 | 56 | ||
47 | #endif | 57 | #endif |
diff --git a/include/asm-arm/arch-ixp23xx/uncompress.h b/include/asm-arm/arch-ixp23xx/uncompress.h index 013575e6a9a1..16c1110f2304 100644 --- a/include/asm-arm/arch-ixp23xx/uncompress.h +++ b/include/asm-arm/arch-ixp23xx/uncompress.h | |||
@@ -11,7 +11,7 @@ | |||
11 | #ifndef __ASM_ARCH_UNCOMPRESS_H | 11 | #ifndef __ASM_ARCH_UNCOMPRESS_H |
12 | #define __ASM_ARCH_UNCOMPRESS_H | 12 | #define __ASM_ARCH_UNCOMPRESS_H |
13 | 13 | ||
14 | #include <asm/hardware.h> | 14 | #include <asm/arch/ixp23xx.h> |
15 | #include <linux/serial_reg.h> | 15 | #include <linux/serial_reg.h> |
16 | 16 | ||
17 | #define UART_BASE ((volatile u32 *)IXP23XX_UART1_PHYS) | 17 | #define UART_BASE ((volatile u32 *)IXP23XX_UART1_PHYS) |
diff --git a/include/asm-arm/arch-s3c2410/regs-dsc.h b/include/asm-arm/arch-s3c2410/regs-dsc.h index 84aca61cbaa3..a0a124875164 100644 --- a/include/asm-arm/arch-s3c2410/regs-dsc.h +++ b/include/asm-arm/arch-s3c2410/regs-dsc.h | |||
@@ -7,25 +7,23 @@ | |||
7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | * | 9 | * |
10 | * S3C2440 Signal Drive Strength Control | 10 | * S3C2440/S3C2412 Signal Drive Strength Control |
11 | * | ||
12 | * Changelog: | ||
13 | * 11-Aug-2004 BJD Created file | ||
14 | * 25-Aug-2004 BJD Added the _SELECT_* defs for using with functions | ||
15 | */ | 11 | */ |
16 | 12 | ||
17 | 13 | ||
18 | #ifndef __ASM_ARCH_REGS_DSC_H | 14 | #ifndef __ASM_ARCH_REGS_DSC_H |
19 | #define __ASM_ARCH_REGS_DSC_H "2440-dsc" | 15 | #define __ASM_ARCH_REGS_DSC_H "2440-dsc" |
20 | 16 | ||
21 | #ifdef CONFIG_CPU_S3C2440 | 17 | #if defined(CONFIG_CPU_S3C2412) |
18 | #define S3C2412_DSC0 S3C2410_GPIOREG(0xdc) | ||
19 | #define S3C2412_DSC1 S3C2410_GPIOREG(0xe0) | ||
20 | #endif | ||
21 | |||
22 | #if defined(CONFIG_CPU_S3C2440) | ||
22 | 23 | ||
23 | #define S3C2440_DSC0 S3C2410_GPIOREG(0xc4) | 24 | #define S3C2440_DSC0 S3C2410_GPIOREG(0xc4) |
24 | #define S3C2440_DSC1 S3C2410_GPIOREG(0xc8) | 25 | #define S3C2440_DSC1 S3C2410_GPIOREG(0xc8) |
25 | 26 | ||
26 | #define S3C2412_DSC0 S3C2410_GPIOREG(0xdc) | ||
27 | #define S3C2412_DSC1 S3C2410_GPIOREG(0xe0) | ||
28 | |||
29 | #define S3C2440_SELECT_DSC0 (0) | 27 | #define S3C2440_SELECT_DSC0 (0) |
30 | #define S3C2440_SELECT_DSC1 (1<<31) | 28 | #define S3C2440_SELECT_DSC1 (1<<31) |
31 | 29 | ||
diff --git a/include/asm-arm/bugs.h b/include/asm-arm/bugs.h index 4c80ec519d45..ca54eb0f12d7 100644 --- a/include/asm-arm/bugs.h +++ b/include/asm-arm/bugs.h | |||
@@ -10,8 +10,12 @@ | |||
10 | #ifndef __ASM_BUGS_H | 10 | #ifndef __ASM_BUGS_H |
11 | #define __ASM_BUGS_H | 11 | #define __ASM_BUGS_H |
12 | 12 | ||
13 | #ifdef CONFIG_MMU | ||
13 | extern void check_writebuffer_bugs(void); | 14 | extern void check_writebuffer_bugs(void); |
14 | 15 | ||
15 | #define check_bugs() check_writebuffer_bugs() | 16 | #define check_bugs() check_writebuffer_bugs() |
17 | #else | ||
18 | #define check_bugs() do { } while (0) | ||
19 | #endif | ||
16 | 20 | ||
17 | #endif | 21 | #endif |
diff --git a/include/asm-arm/domain.h b/include/asm-arm/domain.h index f8ea2de4848e..4c2885abbe6c 100644 --- a/include/asm-arm/domain.h +++ b/include/asm-arm/domain.h | |||
@@ -50,6 +50,8 @@ | |||
50 | #define domain_val(dom,type) ((type) << (2*(dom))) | 50 | #define domain_val(dom,type) ((type) << (2*(dom))) |
51 | 51 | ||
52 | #ifndef __ASSEMBLY__ | 52 | #ifndef __ASSEMBLY__ |
53 | |||
54 | #ifdef CONFIG_MMU | ||
53 | #define set_domain(x) \ | 55 | #define set_domain(x) \ |
54 | do { \ | 56 | do { \ |
55 | __asm__ __volatile__( \ | 57 | __asm__ __volatile__( \ |
@@ -66,5 +68,10 @@ | |||
66 | set_domain(thread->cpu_domain); \ | 68 | set_domain(thread->cpu_domain); \ |
67 | } while (0) | 69 | } while (0) |
68 | 70 | ||
71 | #else | ||
72 | #define set_domain(x) do { } while (0) | ||
73 | #define modify_domain(dom,type) do { } while (0) | ||
74 | #endif | ||
75 | |||
69 | #endif | 76 | #endif |
70 | #endif /* !__ASSEMBLY__ */ | 77 | #endif /* !__ASSEMBLY__ */ |
diff --git a/include/asm-arm/fpstate.h b/include/asm-arm/fpstate.h index 132c3c5628b2..6af4e6bd1290 100644 --- a/include/asm-arm/fpstate.h +++ b/include/asm-arm/fpstate.h | |||
@@ -72,6 +72,14 @@ union fp_state { | |||
72 | 72 | ||
73 | #define FP_SIZE (sizeof(union fp_state) / sizeof(int)) | 73 | #define FP_SIZE (sizeof(union fp_state) / sizeof(int)) |
74 | 74 | ||
75 | struct crunch_state { | ||
76 | unsigned int mvdx[16][2]; | ||
77 | unsigned int mvax[4][3]; | ||
78 | unsigned int dspsc[2]; | ||
79 | }; | ||
80 | |||
81 | #define CRUNCH_SIZE sizeof(struct crunch_state) | ||
82 | |||
75 | #endif | 83 | #endif |
76 | 84 | ||
77 | #endif | 85 | #endif |
diff --git a/include/asm-arm/mach/map.h b/include/asm-arm/mach/map.h index e8ea67c97c73..cef5364ed5fe 100644 --- a/include/asm-arm/mach/map.h +++ b/include/asm-arm/mach/map.h | |||
@@ -16,8 +16,6 @@ struct map_desc { | |||
16 | unsigned int type; | 16 | unsigned int type; |
17 | }; | 17 | }; |
18 | 18 | ||
19 | struct meminfo; | ||
20 | |||
21 | #define MT_DEVICE 0 | 19 | #define MT_DEVICE 0 |
22 | #define MT_CACHECLEAN 1 | 20 | #define MT_CACHECLEAN 1 |
23 | #define MT_MINICLEAN 2 | 21 | #define MT_MINICLEAN 2 |
@@ -28,7 +26,8 @@ struct meminfo; | |||
28 | #define MT_IXP2000_DEVICE 7 | 26 | #define MT_IXP2000_DEVICE 7 |
29 | #define MT_NONSHARED_DEVICE 8 | 27 | #define MT_NONSHARED_DEVICE 8 |
30 | 28 | ||
31 | extern void create_memmap_holes(struct meminfo *); | 29 | #ifdef CONFIG_MMU |
32 | extern void memtable_init(struct meminfo *); | ||
33 | extern void iotable_init(struct map_desc *, int); | 30 | extern void iotable_init(struct map_desc *, int); |
34 | extern void setup_io_desc(void); | 31 | #else |
32 | #define iotable_init(map,num) do { } while (0) | ||
33 | #endif | ||
diff --git a/include/asm-arm/mach/pci.h b/include/asm-arm/mach/pci.h index 25d540ed0079..923e0ca66200 100644 --- a/include/asm-arm/mach/pci.h +++ b/include/asm-arm/mach/pci.h | |||
@@ -28,7 +28,7 @@ struct hw_pci { | |||
28 | struct pci_sys_data { | 28 | struct pci_sys_data { |
29 | struct list_head node; | 29 | struct list_head node; |
30 | int busnr; /* primary bus number */ | 30 | int busnr; /* primary bus number */ |
31 | unsigned long mem_offset; /* bus->cpu memory mapping offset */ | 31 | u64 mem_offset; /* bus->cpu memory mapping offset */ |
32 | unsigned long io_offset; /* bus->cpu IO mapping offset */ | 32 | unsigned long io_offset; /* bus->cpu IO mapping offset */ |
33 | struct pci_bus *bus; /* PCI bus */ | 33 | struct pci_bus *bus; /* PCI bus */ |
34 | struct resource *resource[3]; /* Primary PCI bus resources */ | 34 | struct resource *resource[3]; /* Primary PCI bus resources */ |
diff --git a/include/asm-arm/memory.h b/include/asm-arm/memory.h index 731e321a57d1..94f973b704f1 100644 --- a/include/asm-arm/memory.h +++ b/include/asm-arm/memory.h | |||
@@ -2,6 +2,7 @@ | |||
2 | * linux/include/asm-arm/memory.h | 2 | * linux/include/asm-arm/memory.h |
3 | * | 3 | * |
4 | * Copyright (C) 2000-2002 Russell King | 4 | * Copyright (C) 2000-2002 Russell King |
5 | * modification for nommu, Hyok S. Choi, 2004 | ||
5 | * | 6 | * |
6 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
@@ -26,6 +27,8 @@ | |||
26 | #include <asm/arch/memory.h> | 27 | #include <asm/arch/memory.h> |
27 | #include <asm/sizes.h> | 28 | #include <asm/sizes.h> |
28 | 29 | ||
30 | #ifdef CONFIG_MMU | ||
31 | |||
29 | #ifndef TASK_SIZE | 32 | #ifndef TASK_SIZE |
30 | /* | 33 | /* |
31 | * TASK_SIZE - the maximum size of a user space task. | 34 | * TASK_SIZE - the maximum size of a user space task. |
@@ -48,6 +51,60 @@ | |||
48 | #endif | 51 | #endif |
49 | 52 | ||
50 | /* | 53 | /* |
54 | * The module space lives between the addresses given by TASK_SIZE | ||
55 | * and PAGE_OFFSET - it must be within 32MB of the kernel text. | ||
56 | */ | ||
57 | #define MODULE_END (PAGE_OFFSET) | ||
58 | #define MODULE_START (MODULE_END - 16*1048576) | ||
59 | |||
60 | #if TASK_SIZE > MODULE_START | ||
61 | #error Top of user space clashes with start of module space | ||
62 | #endif | ||
63 | |||
64 | /* | ||
65 | * The XIP kernel gets mapped at the bottom of the module vm area. | ||
66 | * Since we use sections to map it, this macro replaces the physical address | ||
67 | * with its virtual address while keeping offset from the base section. | ||
68 | */ | ||
69 | #define XIP_VIRT_ADDR(physaddr) (MODULE_START + ((physaddr) & 0x000fffff)) | ||
70 | |||
71 | #else /* CONFIG_MMU */ | ||
72 | |||
73 | /* | ||
74 | * The limitation of user task size can grow up to the end of free ram region. | ||
75 | * It is difficult to define and perhaps will never meet the original meaning | ||
76 | * of this define that was meant to. | ||
77 | * Fortunately, there is no reference for this in noMMU mode, for now. | ||
78 | */ | ||
79 | #ifndef TASK_SIZE | ||
80 | #define TASK_SIZE (CONFIG_DRAM_SIZE) | ||
81 | #endif | ||
82 | |||
83 | #ifndef TASK_UNMAPPED_BASE | ||
84 | #define TASK_UNMAPPED_BASE UL(0x00000000) | ||
85 | #endif | ||
86 | |||
87 | #ifndef PHYS_OFFSET | ||
88 | #define PHYS_OFFSET (CONFIG_DRAM_BASE) | ||
89 | #endif | ||
90 | |||
91 | #ifndef END_MEM | ||
92 | #define END_MEM (CONFIG_DRAM_BASE + CONFIG_DRAM_SIZE) | ||
93 | #endif | ||
94 | |||
95 | #ifndef PAGE_OFFSET | ||
96 | #define PAGE_OFFSET (PHYS_OFFSET) | ||
97 | #endif | ||
98 | |||
99 | /* | ||
100 | * The module can be at any place in ram in nommu mode. | ||
101 | */ | ||
102 | #define MODULE_END (END_MEM) | ||
103 | #define MODULE_START (PHYS_OFFSET) | ||
104 | |||
105 | #endif /* !CONFIG_MMU */ | ||
106 | |||
107 | /* | ||
51 | * Size of DMA-consistent memory region. Must be multiple of 2M, | 108 | * Size of DMA-consistent memory region. Must be multiple of 2M, |
52 | * between 2MB and 14MB inclusive. | 109 | * between 2MB and 14MB inclusive. |
53 | */ | 110 | */ |
@@ -71,24 +128,6 @@ | |||
71 | #define __phys_to_pfn(paddr) ((paddr) >> PAGE_SHIFT) | 128 | #define __phys_to_pfn(paddr) ((paddr) >> PAGE_SHIFT) |
72 | #define __pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT) | 129 | #define __pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT) |
73 | 130 | ||
74 | /* | ||
75 | * The module space lives between the addresses given by TASK_SIZE | ||
76 | * and PAGE_OFFSET - it must be within 32MB of the kernel text. | ||
77 | */ | ||
78 | #define MODULE_END (PAGE_OFFSET) | ||
79 | #define MODULE_START (MODULE_END - 16*1048576) | ||
80 | |||
81 | #if TASK_SIZE > MODULE_START | ||
82 | #error Top of user space clashes with start of module space | ||
83 | #endif | ||
84 | |||
85 | /* | ||
86 | * The XIP kernel gets mapped at the bottom of the module vm area. | ||
87 | * Since we use sections to map it, this macro replaces the physical address | ||
88 | * with its virtual address while keeping offset from the base section. | ||
89 | */ | ||
90 | #define XIP_VIRT_ADDR(physaddr) (MODULE_START + ((physaddr) & 0x000fffff)) | ||
91 | |||
92 | #ifndef __ASSEMBLY__ | 131 | #ifndef __ASSEMBLY__ |
93 | 132 | ||
94 | /* | 133 | /* |
diff --git a/include/asm-arm/mmu.h b/include/asm-arm/mmu.h index a457cb71984f..23dde52e0945 100644 --- a/include/asm-arm/mmu.h +++ b/include/asm-arm/mmu.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __ARM_MMU_H | 1 | #ifndef __ARM_MMU_H |
2 | #define __ARM_MMU_H | 2 | #define __ARM_MMU_H |
3 | 3 | ||
4 | #ifdef CONFIG_MMU | ||
5 | |||
4 | typedef struct { | 6 | typedef struct { |
5 | #if __LINUX_ARM_ARCH__ >= 6 | 7 | #if __LINUX_ARM_ARCH__ >= 6 |
6 | unsigned int id; | 8 | unsigned int id; |
@@ -13,4 +15,18 @@ typedef struct { | |||
13 | #define ASID(mm) (0) | 15 | #define ASID(mm) (0) |
14 | #endif | 16 | #endif |
15 | 17 | ||
18 | #else | ||
19 | |||
20 | /* | ||
21 | * From nommu.h: | ||
22 | * Copyright (C) 2002, David McCullough <davidm@snapgear.com> | ||
23 | * modified for 2.6 by Hyok S. Choi <hyok.choi@samsung.com> | ||
24 | */ | ||
25 | typedef struct { | ||
26 | struct vm_list_struct *vmlist; | ||
27 | unsigned long end_brk; | ||
28 | } mm_context_t; | ||
29 | |||
30 | #endif | ||
31 | |||
16 | #endif | 32 | #endif |
diff --git a/include/asm-arm/mmu_context.h b/include/asm-arm/mmu_context.h index 81c59facea3b..9fadb01e030d 100644 --- a/include/asm-arm/mmu_context.h +++ b/include/asm-arm/mmu_context.h | |||
@@ -82,6 +82,7 @@ static inline void | |||
82 | switch_mm(struct mm_struct *prev, struct mm_struct *next, | 82 | switch_mm(struct mm_struct *prev, struct mm_struct *next, |
83 | struct task_struct *tsk) | 83 | struct task_struct *tsk) |
84 | { | 84 | { |
85 | #ifdef CONFIG_MMU | ||
85 | unsigned int cpu = smp_processor_id(); | 86 | unsigned int cpu = smp_processor_id(); |
86 | 87 | ||
87 | if (prev != next) { | 88 | if (prev != next) { |
@@ -91,6 +92,7 @@ switch_mm(struct mm_struct *prev, struct mm_struct *next, | |||
91 | if (cache_is_vivt()) | 92 | if (cache_is_vivt()) |
92 | cpu_clear(cpu, prev->cpu_vm_mask); | 93 | cpu_clear(cpu, prev->cpu_vm_mask); |
93 | } | 94 | } |
95 | #endif | ||
94 | } | 96 | } |
95 | 97 | ||
96 | #define deactivate_mm(tsk,mm) do { } while (0) | 98 | #define deactivate_mm(tsk,mm) do { } while (0) |
diff --git a/include/asm-arm/page-nommu.h b/include/asm-arm/page-nommu.h new file mode 100644 index 000000000000..a1bcad060480 --- /dev/null +++ b/include/asm-arm/page-nommu.h | |||
@@ -0,0 +1,51 @@ | |||
1 | /* | ||
2 | * linux/include/asm-arm/page-nommu.h | ||
3 | * | ||
4 | * Copyright (C) 2004 Hyok S. Choi | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #ifndef _ASMARM_PAGE_NOMMU_H | ||
11 | #define _ASMARM_PAGE_NOMMU_H | ||
12 | |||
13 | #if !defined(CONFIG_SMALL_TASKS) && PAGE_SHIFT < 13 | ||
14 | #define KTHREAD_SIZE (8192) | ||
15 | #else | ||
16 | #define KTHREAD_SIZE PAGE_SIZE | ||
17 | #endif | ||
18 | |||
19 | #define get_user_page(vaddr) __get_free_page(GFP_KERNEL) | ||
20 | #define free_user_page(page, addr) free_page(addr) | ||
21 | |||
22 | #define clear_page(page) memset((page), 0, PAGE_SIZE) | ||
23 | #define copy_page(to,from) memcpy((to), (from), PAGE_SIZE) | ||
24 | |||
25 | #define clear_user_page(page, vaddr, pg) clear_page(page) | ||
26 | #define copy_user_page(to, from, vaddr, pg) copy_page(to, from) | ||
27 | |||
28 | /* | ||
29 | * These are used to make use of C type-checking.. | ||
30 | */ | ||
31 | typedef unsigned long pte_t; | ||
32 | typedef unsigned long pmd_t; | ||
33 | typedef unsigned long pgd_t[2]; | ||
34 | typedef unsigned long pgprot_t; | ||
35 | |||
36 | #define pte_val(x) (x) | ||
37 | #define pmd_val(x) (x) | ||
38 | #define pgd_val(x) ((x)[0]) | ||
39 | #define pgprot_val(x) (x) | ||
40 | |||
41 | #define __pte(x) (x) | ||
42 | #define __pmd(x) (x) | ||
43 | #define __pgprot(x) (x) | ||
44 | |||
45 | /* to align the pointer to the (next) page boundary */ | ||
46 | #define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) | ||
47 | |||
48 | extern unsigned long memory_start; | ||
49 | extern unsigned long memory_end; | ||
50 | |||
51 | #endif | ||
diff --git a/include/asm-arm/page.h b/include/asm-arm/page.h index 66cfeb5290ea..63d12f0244c5 100644 --- a/include/asm-arm/page.h +++ b/include/asm-arm/page.h | |||
@@ -23,6 +23,12 @@ | |||
23 | 23 | ||
24 | #ifndef __ASSEMBLY__ | 24 | #ifndef __ASSEMBLY__ |
25 | 25 | ||
26 | #ifndef CONFIG_MMU | ||
27 | |||
28 | #include "page-nommu.h" | ||
29 | |||
30 | #else | ||
31 | |||
26 | #include <asm/glue.h> | 32 | #include <asm/glue.h> |
27 | 33 | ||
28 | /* | 34 | /* |
@@ -171,6 +177,8 @@ typedef unsigned long pgprot_t; | |||
171 | /* the upper-most page table pointer */ | 177 | /* the upper-most page table pointer */ |
172 | extern pmd_t *top_pmd; | 178 | extern pmd_t *top_pmd; |
173 | 179 | ||
180 | #endif /* CONFIG_MMU */ | ||
181 | |||
174 | #include <asm/memory.h> | 182 | #include <asm/memory.h> |
175 | 183 | ||
176 | #endif /* !__ASSEMBLY__ */ | 184 | #endif /* !__ASSEMBLY__ */ |
diff --git a/include/asm-arm/pgalloc.h b/include/asm-arm/pgalloc.h index c4ac2e67768d..4d4394552911 100644 --- a/include/asm-arm/pgalloc.h +++ b/include/asm-arm/pgalloc.h | |||
@@ -16,6 +16,10 @@ | |||
16 | #include <asm/cacheflush.h> | 16 | #include <asm/cacheflush.h> |
17 | #include <asm/tlbflush.h> | 17 | #include <asm/tlbflush.h> |
18 | 18 | ||
19 | #define check_pgt_cache() do { } while (0) | ||
20 | |||
21 | #ifdef CONFIG_MMU | ||
22 | |||
19 | #define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_USER)) | 23 | #define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_USER)) |
20 | #define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL)) | 24 | #define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL)) |
21 | 25 | ||
@@ -32,8 +36,6 @@ extern void free_pgd_slow(pgd_t *pgd); | |||
32 | #define pgd_alloc(mm) get_pgd_slow(mm) | 36 | #define pgd_alloc(mm) get_pgd_slow(mm) |
33 | #define pgd_free(pgd) free_pgd_slow(pgd) | 37 | #define pgd_free(pgd) free_pgd_slow(pgd) |
34 | 38 | ||
35 | #define check_pgt_cache() do { } while (0) | ||
36 | |||
37 | /* | 39 | /* |
38 | * Allocate one PTE table. | 40 | * Allocate one PTE table. |
39 | * | 41 | * |
@@ -126,4 +128,6 @@ pmd_populate(struct mm_struct *mm, pmd_t *pmdp, struct page *ptep) | |||
126 | __pmd_populate(pmdp, page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE); | 128 | __pmd_populate(pmdp, page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE); |
127 | } | 129 | } |
128 | 130 | ||
131 | #endif /* CONFIG_MMU */ | ||
132 | |||
129 | #endif | 133 | #endif |
diff --git a/include/asm-arm/pgtable-nommu.h b/include/asm-arm/pgtable-nommu.h new file mode 100644 index 000000000000..b13322dccf41 --- /dev/null +++ b/include/asm-arm/pgtable-nommu.h | |||
@@ -0,0 +1,123 @@ | |||
1 | /* | ||
2 | * linux/include/asm-arm/pgtable-nommu.h | ||
3 | * | ||
4 | * Copyright (C) 1995-2002 Russell King | ||
5 | * Copyright (C) 2004 Hyok S. Choi | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | #ifndef _ASMARM_PGTABLE_NOMMU_H | ||
12 | #define _ASMARM_PGTABLE_NOMMU_H | ||
13 | |||
14 | #ifndef __ASSEMBLY__ | ||
15 | |||
16 | #include <linux/config.h> | ||
17 | #include <linux/slab.h> | ||
18 | #include <asm/processor.h> | ||
19 | #include <asm/page.h> | ||
20 | #include <asm/io.h> | ||
21 | |||
22 | /* | ||
23 | * Trivial page table functions. | ||
24 | */ | ||
25 | #define pgd_present(pgd) (1) | ||
26 | #define pgd_none(pgd) (0) | ||
27 | #define pgd_bad(pgd) (0) | ||
28 | #define pgd_clear(pgdp) | ||
29 | #define kern_addr_valid(addr) (1) | ||
30 | #define pmd_offset(a, b) ((void *)0) | ||
31 | /* FIXME */ | ||
32 | /* | ||
33 | * PMD_SHIFT determines the size of the area a second-level page table can map | ||
34 | * PGDIR_SHIFT determines what a third-level page table entry can map | ||
35 | */ | ||
36 | #define PGDIR_SHIFT 21 | ||
37 | |||
38 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) | ||
39 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) | ||
40 | /* FIXME */ | ||
41 | |||
42 | #define PAGE_NONE __pgprot(0) | ||
43 | #define PAGE_SHARED __pgprot(0) | ||
44 | #define PAGE_COPY __pgprot(0) | ||
45 | #define PAGE_READONLY __pgprot(0) | ||
46 | #define PAGE_KERNEL __pgprot(0) | ||
47 | |||
48 | //extern void paging_init(struct meminfo *, struct machine_desc *); | ||
49 | #define swapper_pg_dir ((pgd_t *) 0) | ||
50 | |||
51 | #define __swp_type(x) (0) | ||
52 | #define __swp_offset(x) (0) | ||
53 | #define __swp_entry(typ,off) ((swp_entry_t) { ((typ) | ((off) << 7)) }) | ||
54 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) | ||
55 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) | ||
56 | |||
57 | |||
58 | typedef pte_t *pte_addr_t; | ||
59 | |||
60 | static inline int pte_file(pte_t pte) { return 0; } | ||
61 | |||
62 | /* | ||
63 | * ZERO_PAGE is a global shared page that is always zero: used | ||
64 | * for zero-mapped memory areas etc.. | ||
65 | */ | ||
66 | #define ZERO_PAGE(vaddr) (virt_to_page(0)) | ||
67 | |||
68 | /* | ||
69 | * Mark the prot value as uncacheable and unbufferable. | ||
70 | */ | ||
71 | #define pgprot_noncached(prot) __pgprot(0) | ||
72 | #define pgprot_writecombine(prot) __pgprot(0) | ||
73 | |||
74 | |||
75 | /* | ||
76 | * These would be in other places but having them here reduces the diffs. | ||
77 | */ | ||
78 | extern unsigned int kobjsize(const void *objp); | ||
79 | extern int is_in_rom(unsigned long); | ||
80 | |||
81 | /* | ||
82 | * No page table caches to initialise. | ||
83 | */ | ||
84 | #define pgtable_cache_init() do { } while (0) | ||
85 | #define io_remap_page_range remap_page_range | ||
86 | #define io_remap_pfn_range remap_pfn_range | ||
87 | |||
88 | #define MK_IOSPACE_PFN(space, pfn) (pfn) | ||
89 | #define GET_IOSPACE(pfn) 0 | ||
90 | #define GET_PFN(pfn) (pfn) | ||
91 | |||
92 | |||
93 | /* | ||
94 | * All 32bit addresses are effectively valid for vmalloc... | ||
95 | * Sort of meaningless for non-VM targets. | ||
96 | */ | ||
97 | #define VMALLOC_START 0 | ||
98 | #define VMALLOC_END 0xffffffff | ||
99 | |||
100 | #define FIRST_USER_ADDRESS (0) | ||
101 | |||
102 | #else | ||
103 | |||
104 | /* | ||
105 | * dummy tlb and user structures. | ||
106 | */ | ||
107 | #define v3_tlb_fns (0) | ||
108 | #define v4_tlb_fns (0) | ||
109 | #define v4wb_tlb_fns (0) | ||
110 | #define v4wbi_tlb_fns (0) | ||
111 | #define v6_tlb_fns (0) | ||
112 | |||
113 | #define v3_user_fns (0) | ||
114 | #define v4_user_fns (0) | ||
115 | #define v4_mc_user_fns (0) | ||
116 | #define v4wb_user_fns (0) | ||
117 | #define v4wt_user_fns (0) | ||
118 | #define v6_user_fns (0) | ||
119 | #define xscale_mc_user_fns (0) | ||
120 | |||
121 | #endif /*__ASSEMBLY__*/ | ||
122 | |||
123 | #endif /* _ASMARM_PGTABLE_H */ | ||
diff --git a/include/asm-arm/pgtable.h b/include/asm-arm/pgtable.h index e85c08d78dda..8d3919c6458c 100644 --- a/include/asm-arm/pgtable.h +++ b/include/asm-arm/pgtable.h | |||
@@ -11,9 +11,15 @@ | |||
11 | #define _ASMARM_PGTABLE_H | 11 | #define _ASMARM_PGTABLE_H |
12 | 12 | ||
13 | #include <asm-generic/4level-fixup.h> | 13 | #include <asm-generic/4level-fixup.h> |
14 | #include <asm/proc-fns.h> | ||
15 | |||
16 | #ifndef CONFIG_MMU | ||
17 | |||
18 | #include "pgtable-nommu.h" | ||
19 | |||
20 | #else | ||
14 | 21 | ||
15 | #include <asm/memory.h> | 22 | #include <asm/memory.h> |
16 | #include <asm/proc-fns.h> | ||
17 | #include <asm/arch/vmalloc.h> | 23 | #include <asm/arch/vmalloc.h> |
18 | 24 | ||
19 | /* | 25 | /* |
@@ -378,4 +384,6 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; | |||
378 | 384 | ||
379 | #endif /* !__ASSEMBLY__ */ | 385 | #endif /* !__ASSEMBLY__ */ |
380 | 386 | ||
387 | #endif /* CONFIG_MMU */ | ||
388 | |||
381 | #endif /* _ASMARM_PGTABLE_H */ | 389 | #endif /* _ASMARM_PGTABLE_H */ |
diff --git a/include/asm-arm/proc-fns.h b/include/asm-arm/proc-fns.h index e9310895e79d..1bde92cdaebd 100644 --- a/include/asm-arm/proc-fns.h +++ b/include/asm-arm/proc-fns.h | |||
@@ -165,6 +165,8 @@ | |||
165 | 165 | ||
166 | #include <asm/memory.h> | 166 | #include <asm/memory.h> |
167 | 167 | ||
168 | #ifdef CONFIG_MMU | ||
169 | |||
168 | #define cpu_switch_mm(pgd,mm) cpu_do_switch_mm(virt_to_phys(pgd),mm) | 170 | #define cpu_switch_mm(pgd,mm) cpu_do_switch_mm(virt_to_phys(pgd),mm) |
169 | 171 | ||
170 | #define cpu_get_pgd() \ | 172 | #define cpu_get_pgd() \ |
@@ -176,6 +178,8 @@ | |||
176 | (pgd_t *)phys_to_virt(pg); \ | 178 | (pgd_t *)phys_to_virt(pg); \ |
177 | }) | 179 | }) |
178 | 180 | ||
181 | #endif | ||
182 | |||
179 | #endif /* __ASSEMBLY__ */ | 183 | #endif /* __ASSEMBLY__ */ |
180 | #endif /* __KERNEL__ */ | 184 | #endif /* __KERNEL__ */ |
181 | #endif /* __ASM_PROCFNS_H */ | 185 | #endif /* __ASM_PROCFNS_H */ |
diff --git a/include/asm-arm/ptrace.h b/include/asm-arm/ptrace.h index 2bebe3dc0a30..5a8ef787dbf8 100644 --- a/include/asm-arm/ptrace.h +++ b/include/asm-arm/ptrace.h | |||
@@ -25,6 +25,11 @@ | |||
25 | 25 | ||
26 | #define PTRACE_SET_SYSCALL 23 | 26 | #define PTRACE_SET_SYSCALL 23 |
27 | 27 | ||
28 | /* PTRACE_SYSCALL is 24 */ | ||
29 | |||
30 | #define PTRACE_GETCRUNCHREGS 25 | ||
31 | #define PTRACE_SETCRUNCHREGS 26 | ||
32 | |||
28 | /* | 33 | /* |
29 | * PSR bits | 34 | * PSR bits |
30 | */ | 35 | */ |
diff --git a/include/asm-arm/thread_info.h b/include/asm-arm/thread_info.h index cfbccb63c67b..c46b5c84275f 100644 --- a/include/asm-arm/thread_info.h +++ b/include/asm-arm/thread_info.h | |||
@@ -59,6 +59,7 @@ struct thread_info { | |||
59 | struct cpu_context_save cpu_context; /* cpu context */ | 59 | struct cpu_context_save cpu_context; /* cpu context */ |
60 | __u8 used_cp[16]; /* thread used copro */ | 60 | __u8 used_cp[16]; /* thread used copro */ |
61 | unsigned long tp_value; | 61 | unsigned long tp_value; |
62 | struct crunch_state crunchstate; | ||
62 | union fp_state fpstate __attribute__((aligned(8))); | 63 | union fp_state fpstate __attribute__((aligned(8))); |
63 | union vfp_state vfpstate; | 64 | union vfp_state vfpstate; |
64 | struct restart_block restart_block; | 65 | struct restart_block restart_block; |
@@ -101,6 +102,11 @@ extern void free_thread_info(struct thread_info *); | |||
101 | #define thread_saved_fp(tsk) \ | 102 | #define thread_saved_fp(tsk) \ |
102 | ((unsigned long)(task_thread_info(tsk)->cpu_context.fp)) | 103 | ((unsigned long)(task_thread_info(tsk)->cpu_context.fp)) |
103 | 104 | ||
105 | extern void crunch_task_disable(struct thread_info *); | ||
106 | extern void crunch_task_copy(struct thread_info *, void *); | ||
107 | extern void crunch_task_restore(struct thread_info *, void *); | ||
108 | extern void crunch_task_release(struct thread_info *); | ||
109 | |||
104 | extern void iwmmxt_task_disable(struct thread_info *); | 110 | extern void iwmmxt_task_disable(struct thread_info *); |
105 | extern void iwmmxt_task_copy(struct thread_info *, void *); | 111 | extern void iwmmxt_task_copy(struct thread_info *, void *); |
106 | extern void iwmmxt_task_restore(struct thread_info *, void *); | 112 | extern void iwmmxt_task_restore(struct thread_info *, void *); |
diff --git a/include/asm-arm/uaccess.h b/include/asm-arm/uaccess.h index 064f0f5e8e2b..87aba57a66c4 100644 --- a/include/asm-arm/uaccess.h +++ b/include/asm-arm/uaccess.h | |||
@@ -41,15 +41,24 @@ struct exception_table_entry | |||
41 | extern int fixup_exception(struct pt_regs *regs); | 41 | extern int fixup_exception(struct pt_regs *regs); |
42 | 42 | ||
43 | /* | 43 | /* |
44 | * These two are intentionally not defined anywhere - if the kernel | ||
45 | * code generates any references to them, that's a bug. | ||
46 | */ | ||
47 | extern int __get_user_bad(void); | ||
48 | extern int __put_user_bad(void); | ||
49 | |||
50 | /* | ||
44 | * Note that this is actually 0x1,0000,0000 | 51 | * Note that this is actually 0x1,0000,0000 |
45 | */ | 52 | */ |
46 | #define KERNEL_DS 0x00000000 | 53 | #define KERNEL_DS 0x00000000 |
47 | #define USER_DS TASK_SIZE | ||
48 | |||
49 | #define get_ds() (KERNEL_DS) | 54 | #define get_ds() (KERNEL_DS) |
55 | |||
56 | #ifdef CONFIG_MMU | ||
57 | |||
58 | #define USER_DS TASK_SIZE | ||
50 | #define get_fs() (current_thread_info()->addr_limit) | 59 | #define get_fs() (current_thread_info()->addr_limit) |
51 | 60 | ||
52 | static inline void set_fs (mm_segment_t fs) | 61 | static inline void set_fs(mm_segment_t fs) |
53 | { | 62 | { |
54 | current_thread_info()->addr_limit = fs; | 63 | current_thread_info()->addr_limit = fs; |
55 | modify_domain(DOMAIN_KERNEL, fs ? DOMAIN_CLIENT : DOMAIN_MANAGER); | 64 | modify_domain(DOMAIN_KERNEL, fs ? DOMAIN_CLIENT : DOMAIN_MANAGER); |
@@ -75,8 +84,6 @@ static inline void set_fs (mm_segment_t fs) | |||
75 | : "cc"); \ | 84 | : "cc"); \ |
76 | flag; }) | 85 | flag; }) |
77 | 86 | ||
78 | #define access_ok(type,addr,size) (__range_ok(addr,size) == 0) | ||
79 | |||
80 | /* | 87 | /* |
81 | * Single-value transfer routines. They automatically use the right | 88 | * Single-value transfer routines. They automatically use the right |
82 | * size if we just have the right pointer type. Note that the functions | 89 | * size if we just have the right pointer type. Note that the functions |
@@ -87,20 +94,10 @@ static inline void set_fs (mm_segment_t fs) | |||
87 | * fixup code, but there are a few places where it intrudes on the | 94 | * fixup code, but there are a few places where it intrudes on the |
88 | * main code path. When we only write to user space, there is no | 95 | * main code path. When we only write to user space, there is no |
89 | * problem. | 96 | * problem. |
90 | * | ||
91 | * The "__xxx" versions of the user access functions do not verify the | ||
92 | * address space - it must have been done previously with a separate | ||
93 | * "access_ok()" call. | ||
94 | * | ||
95 | * The "xxx_error" versions set the third argument to EFAULT if an | ||
96 | * error occurs, and leave it unchanged on success. Note that these | ||
97 | * versions are void (ie, don't return a value as such). | ||
98 | */ | 97 | */ |
99 | |||
100 | extern int __get_user_1(void *); | 98 | extern int __get_user_1(void *); |
101 | extern int __get_user_2(void *); | 99 | extern int __get_user_2(void *); |
102 | extern int __get_user_4(void *); | 100 | extern int __get_user_4(void *); |
103 | extern int __get_user_bad(void); | ||
104 | 101 | ||
105 | #define __get_user_x(__r2,__p,__e,__s,__i...) \ | 102 | #define __get_user_x(__r2,__p,__e,__s,__i...) \ |
106 | __asm__ __volatile__ ( \ | 103 | __asm__ __volatile__ ( \ |
@@ -131,6 +128,74 @@ extern int __get_user_bad(void); | |||
131 | __e; \ | 128 | __e; \ |
132 | }) | 129 | }) |
133 | 130 | ||
131 | extern int __put_user_1(void *, unsigned int); | ||
132 | extern int __put_user_2(void *, unsigned int); | ||
133 | extern int __put_user_4(void *, unsigned int); | ||
134 | extern int __put_user_8(void *, unsigned long long); | ||
135 | |||
136 | #define __put_user_x(__r2,__p,__e,__s) \ | ||
137 | __asm__ __volatile__ ( \ | ||
138 | __asmeq("%0", "r0") __asmeq("%2", "r2") \ | ||
139 | "bl __put_user_" #__s \ | ||
140 | : "=&r" (__e) \ | ||
141 | : "0" (__p), "r" (__r2) \ | ||
142 | : "ip", "lr", "cc") | ||
143 | |||
144 | #define put_user(x,p) \ | ||
145 | ({ \ | ||
146 | const register typeof(*(p)) __r2 asm("r2") = (x); \ | ||
147 | const register typeof(*(p)) __user *__p asm("r0") = (p);\ | ||
148 | register int __e asm("r0"); \ | ||
149 | switch (sizeof(*(__p))) { \ | ||
150 | case 1: \ | ||
151 | __put_user_x(__r2, __p, __e, 1); \ | ||
152 | break; \ | ||
153 | case 2: \ | ||
154 | __put_user_x(__r2, __p, __e, 2); \ | ||
155 | break; \ | ||
156 | case 4: \ | ||
157 | __put_user_x(__r2, __p, __e, 4); \ | ||
158 | break; \ | ||
159 | case 8: \ | ||
160 | __put_user_x(__r2, __p, __e, 8); \ | ||
161 | break; \ | ||
162 | default: __e = __put_user_bad(); break; \ | ||
163 | } \ | ||
164 | __e; \ | ||
165 | }) | ||
166 | |||
167 | #else /* CONFIG_MMU */ | ||
168 | |||
169 | /* | ||
170 | * uClinux has only one addr space, so has simplified address limits. | ||
171 | */ | ||
172 | #define USER_DS KERNEL_DS | ||
173 | |||
174 | #define segment_eq(a,b) (1) | ||
175 | #define __addr_ok(addr) (1) | ||
176 | #define __range_ok(addr,size) (0) | ||
177 | #define get_fs() (KERNEL_DS) | ||
178 | |||
179 | static inline void set_fs(mm_segment_t fs) | ||
180 | { | ||
181 | } | ||
182 | |||
183 | #define get_user(x,p) __get_user(x,p) | ||
184 | #define put_user(x,p) __put_user(x,p) | ||
185 | |||
186 | #endif /* CONFIG_MMU */ | ||
187 | |||
188 | #define access_ok(type,addr,size) (__range_ok(addr,size) == 0) | ||
189 | |||
190 | /* | ||
191 | * The "__xxx" versions of the user access functions do not verify the | ||
192 | * address space - it must have been done previously with a separate | ||
193 | * "access_ok()" call. | ||
194 | * | ||
195 | * The "xxx_error" versions set the third argument to EFAULT if an | ||
196 | * error occurs, and leave it unchanged on success. Note that these | ||
197 | * versions are void (ie, don't return a value as such). | ||
198 | */ | ||
134 | #define __get_user(x,ptr) \ | 199 | #define __get_user(x,ptr) \ |
135 | ({ \ | 200 | ({ \ |
136 | long __gu_err = 0; \ | 201 | long __gu_err = 0; \ |
@@ -212,43 +277,6 @@ do { \ | |||
212 | : "r" (addr), "i" (-EFAULT) \ | 277 | : "r" (addr), "i" (-EFAULT) \ |
213 | : "cc") | 278 | : "cc") |
214 | 279 | ||
215 | extern int __put_user_1(void *, unsigned int); | ||
216 | extern int __put_user_2(void *, unsigned int); | ||
217 | extern int __put_user_4(void *, unsigned int); | ||
218 | extern int __put_user_8(void *, unsigned long long); | ||
219 | extern int __put_user_bad(void); | ||
220 | |||
221 | #define __put_user_x(__r2,__p,__e,__s) \ | ||
222 | __asm__ __volatile__ ( \ | ||
223 | __asmeq("%0", "r0") __asmeq("%2", "r2") \ | ||
224 | "bl __put_user_" #__s \ | ||
225 | : "=&r" (__e) \ | ||
226 | : "0" (__p), "r" (__r2) \ | ||
227 | : "ip", "lr", "cc") | ||
228 | |||
229 | #define put_user(x,p) \ | ||
230 | ({ \ | ||
231 | const register typeof(*(p)) __r2 asm("r2") = (x); \ | ||
232 | const register typeof(*(p)) __user *__p asm("r0") = (p);\ | ||
233 | register int __e asm("r0"); \ | ||
234 | switch (sizeof(*(__p))) { \ | ||
235 | case 1: \ | ||
236 | __put_user_x(__r2, __p, __e, 1); \ | ||
237 | break; \ | ||
238 | case 2: \ | ||
239 | __put_user_x(__r2, __p, __e, 2); \ | ||
240 | break; \ | ||
241 | case 4: \ | ||
242 | __put_user_x(__r2, __p, __e, 4); \ | ||
243 | break; \ | ||
244 | case 8: \ | ||
245 | __put_user_x(__r2, __p, __e, 8); \ | ||
246 | break; \ | ||
247 | default: __e = __put_user_bad(); break; \ | ||
248 | } \ | ||
249 | __e; \ | ||
250 | }) | ||
251 | |||
252 | #define __put_user(x,ptr) \ | 280 | #define __put_user(x,ptr) \ |
253 | ({ \ | 281 | ({ \ |
254 | long __pu_err = 0; \ | 282 | long __pu_err = 0; \ |
@@ -353,66 +381,54 @@ do { \ | |||
353 | : "r" (x), "i" (-EFAULT) \ | 381 | : "r" (x), "i" (-EFAULT) \ |
354 | : "cc") | 382 | : "cc") |
355 | 383 | ||
356 | extern unsigned long __arch_copy_from_user(void *to, const void __user *from, unsigned long n); | 384 | |
357 | extern unsigned long __arch_copy_to_user(void __user *to, const void *from, unsigned long n); | 385 | #ifdef CONFIG_MMU |
358 | extern unsigned long __arch_clear_user(void __user *addr, unsigned long n); | 386 | extern unsigned long __copy_from_user(void *to, const void __user *from, unsigned long n); |
359 | extern unsigned long __arch_strncpy_from_user(char *to, const char __user *from, unsigned long count); | 387 | extern unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n); |
360 | extern unsigned long __arch_strnlen_user(const char __user *s, long n); | 388 | extern unsigned long __clear_user(void __user *addr, unsigned long n); |
389 | #else | ||
390 | #define __copy_from_user(to,from,n) (memcpy(to, (void __force *)from, n), 0) | ||
391 | #define __copy_to_user(to,from,n) (memcpy((void __force *)to, from, n), 0) | ||
392 | #define __clear_user(addr,n) (memset((void __force *)addr, 0, n), 0) | ||
393 | #endif | ||
394 | |||
395 | extern unsigned long __strncpy_from_user(char *to, const char __user *from, unsigned long count); | ||
396 | extern unsigned long __strnlen_user(const char __user *s, long n); | ||
361 | 397 | ||
362 | static inline unsigned long copy_from_user(void *to, const void __user *from, unsigned long n) | 398 | static inline unsigned long copy_from_user(void *to, const void __user *from, unsigned long n) |
363 | { | 399 | { |
364 | if (access_ok(VERIFY_READ, from, n)) | 400 | if (access_ok(VERIFY_READ, from, n)) |
365 | n = __arch_copy_from_user(to, from, n); | 401 | n = __copy_from_user(to, from, n); |
366 | else /* security hole - plug it */ | 402 | else /* security hole - plug it */ |
367 | memzero(to, n); | 403 | memzero(to, n); |
368 | return n; | 404 | return n; |
369 | } | 405 | } |
370 | 406 | ||
371 | static inline unsigned long __copy_from_user(void *to, const void __user *from, unsigned long n) | ||
372 | { | ||
373 | return __arch_copy_from_user(to, from, n); | ||
374 | } | ||
375 | |||
376 | static inline unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) | 407 | static inline unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) |
377 | { | 408 | { |
378 | if (access_ok(VERIFY_WRITE, to, n)) | 409 | if (access_ok(VERIFY_WRITE, to, n)) |
379 | n = __arch_copy_to_user(to, from, n); | 410 | n = __copy_to_user(to, from, n); |
380 | return n; | 411 | return n; |
381 | } | 412 | } |
382 | 413 | ||
383 | static inline unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n) | ||
384 | { | ||
385 | return __arch_copy_to_user(to, from, n); | ||
386 | } | ||
387 | |||
388 | #define __copy_to_user_inatomic __copy_to_user | 414 | #define __copy_to_user_inatomic __copy_to_user |
389 | #define __copy_from_user_inatomic __copy_from_user | 415 | #define __copy_from_user_inatomic __copy_from_user |
390 | 416 | ||
391 | static inline unsigned long clear_user (void __user *to, unsigned long n) | 417 | static inline unsigned long clear_user(void __user *to, unsigned long n) |
392 | { | 418 | { |
393 | if (access_ok(VERIFY_WRITE, to, n)) | 419 | if (access_ok(VERIFY_WRITE, to, n)) |
394 | n = __arch_clear_user(to, n); | 420 | n = __clear_user(to, n); |
395 | return n; | 421 | return n; |
396 | } | 422 | } |
397 | 423 | ||
398 | static inline unsigned long __clear_user (void __user *to, unsigned long n) | 424 | static inline long strncpy_from_user(char *dst, const char __user *src, long count) |
399 | { | ||
400 | return __arch_clear_user(to, n); | ||
401 | } | ||
402 | |||
403 | static inline long strncpy_from_user (char *dst, const char __user *src, long count) | ||
404 | { | 425 | { |
405 | long res = -EFAULT; | 426 | long res = -EFAULT; |
406 | if (access_ok(VERIFY_READ, src, 1)) | 427 | if (access_ok(VERIFY_READ, src, 1)) |
407 | res = __arch_strncpy_from_user(dst, src, count); | 428 | res = __strncpy_from_user(dst, src, count); |
408 | return res; | 429 | return res; |
409 | } | 430 | } |
410 | 431 | ||
411 | static inline long __strncpy_from_user (char *dst, const char __user *src, long count) | ||
412 | { | ||
413 | return __arch_strncpy_from_user(dst, src, count); | ||
414 | } | ||
415 | |||
416 | #define strlen_user(s) strnlen_user(s, ~0UL >> 1) | 432 | #define strlen_user(s) strnlen_user(s, ~0UL >> 1) |
417 | 433 | ||
418 | static inline long strnlen_user(const char __user *s, long n) | 434 | static inline long strnlen_user(const char __user *s, long n) |
@@ -420,7 +436,7 @@ static inline long strnlen_user(const char __user *s, long n) | |||
420 | unsigned long res = 0; | 436 | unsigned long res = 0; |
421 | 437 | ||
422 | if (__addr_ok(s)) | 438 | if (__addr_ok(s)) |
423 | res = __arch_strnlen_user(s, n); | 439 | res = __strnlen_user(s, n); |
424 | 440 | ||
425 | return res; | 441 | return res; |
426 | } | 442 | } |
diff --git a/include/asm-arm/ucontext.h b/include/asm-arm/ucontext.h index 9e6f7ca9f5ae..bf65e9f4525d 100644 --- a/include/asm-arm/ucontext.h +++ b/include/asm-arm/ucontext.h | |||
@@ -35,6 +35,17 @@ struct ucontext { | |||
35 | * bytes, to prevent unpredictable padding in the signal frame. | 35 | * bytes, to prevent unpredictable padding in the signal frame. |
36 | */ | 36 | */ |
37 | 37 | ||
38 | #ifdef CONFIG_CRUNCH | ||
39 | #define CRUNCH_MAGIC 0x5065cf03 | ||
40 | #define CRUNCH_STORAGE_SIZE (CRUNCH_SIZE + 8) | ||
41 | |||
42 | struct crunch_sigframe { | ||
43 | unsigned long magic; | ||
44 | unsigned long size; | ||
45 | struct crunch_state storage; | ||
46 | } __attribute__((__aligned__(8))); | ||
47 | #endif | ||
48 | |||
38 | #ifdef CONFIG_IWMMXT | 49 | #ifdef CONFIG_IWMMXT |
39 | /* iwmmxt_area is 0x98 bytes long, preceeded by 8 bytes of signature */ | 50 | /* iwmmxt_area is 0x98 bytes long, preceeded by 8 bytes of signature */ |
40 | #define IWMMXT_MAGIC 0x12ef842a | 51 | #define IWMMXT_MAGIC 0x12ef842a |
@@ -74,6 +85,9 @@ struct vfp_sigframe | |||
74 | * one of these. | 85 | * one of these. |
75 | */ | 86 | */ |
76 | struct aux_sigframe { | 87 | struct aux_sigframe { |
88 | #ifdef CONFIG_CRUNCH | ||
89 | struct crunch_sigframe crunch; | ||
90 | #endif | ||
77 | #ifdef CONFIG_IWMMXT | 91 | #ifdef CONFIG_IWMMXT |
78 | struct iwmmxt_sigframe iwmmxt; | 92 | struct iwmmxt_sigframe iwmmxt; |
79 | #endif | 93 | #endif |
diff --git a/include/asm-cris/hw_irq.h b/include/asm-cris/hw_irq.h index 341536a234e9..298066020af2 100644 --- a/include/asm-cris/hw_irq.h +++ b/include/asm-cris/hw_irq.h | |||
@@ -1,7 +1,5 @@ | |||
1 | #ifndef _ASM_HW_IRQ_H | 1 | #ifndef _ASM_HW_IRQ_H |
2 | #define _ASM_HW_IRQ_H | 2 | #define _ASM_HW_IRQ_H |
3 | 3 | ||
4 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} | ||
5 | |||
6 | #endif | 4 | #endif |
7 | 5 | ||
diff --git a/include/asm-cris/irq.h b/include/asm-cris/irq.h index 4b338792218b..998cce9f3200 100644 --- a/include/asm-cris/irq.h +++ b/include/asm-cris/irq.h | |||
@@ -1,11 +1,6 @@ | |||
1 | #ifndef _ASM_IRQ_H | 1 | #ifndef _ASM_IRQ_H |
2 | #define _ASM_IRQ_H | 2 | #define _ASM_IRQ_H |
3 | 3 | ||
4 | /* | ||
5 | * IRQ line status macro IRQ_PER_CPU is used | ||
6 | */ | ||
7 | #define ARCH_HAS_IRQ_PER_CPU | ||
8 | |||
9 | #include <asm/arch/irq.h> | 4 | #include <asm/arch/irq.h> |
10 | 5 | ||
11 | static inline int irq_canonicalize(int irq) | 6 | static inline int irq_canonicalize(int irq) |
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 9d11550b4818..db5a3732f106 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
@@ -58,6 +58,20 @@ | |||
58 | VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \ | 58 | VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \ |
59 | } \ | 59 | } \ |
60 | \ | 60 | \ |
61 | /* Kernel symbol table: Normal unused symbols */ \ | ||
62 | __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \ | ||
63 | VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \ | ||
64 | *(__ksymtab_unused) \ | ||
65 | VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \ | ||
66 | } \ | ||
67 | \ | ||
68 | /* Kernel symbol table: GPL-only unused symbols */ \ | ||
69 | __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \ | ||
70 | VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \ | ||
71 | *(__ksymtab_unused_gpl) \ | ||
72 | VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \ | ||
73 | } \ | ||
74 | \ | ||
61 | /* Kernel symbol table: GPL-future-only symbols */ \ | 75 | /* Kernel symbol table: GPL-future-only symbols */ \ |
62 | __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \ | 76 | __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \ |
63 | VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \ | 77 | VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \ |
@@ -79,6 +93,20 @@ | |||
79 | VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \ | 93 | VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \ |
80 | } \ | 94 | } \ |
81 | \ | 95 | \ |
96 | /* Kernel symbol table: Normal unused symbols */ \ | ||
97 | __kcrctab_unused : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) { \ | ||
98 | VMLINUX_SYMBOL(__start___kcrctab_unused) = .; \ | ||
99 | *(__kcrctab_unused) \ | ||
100 | VMLINUX_SYMBOL(__stop___kcrctab_unused) = .; \ | ||
101 | } \ | ||
102 | \ | ||
103 | /* Kernel symbol table: GPL-only unused symbols */ \ | ||
104 | __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \ | ||
105 | VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .; \ | ||
106 | *(__kcrctab_unused_gpl) \ | ||
107 | VMLINUX_SYMBOL(__stop___kcrctab_unused_gpl) = .; \ | ||
108 | } \ | ||
109 | \ | ||
82 | /* Kernel symbol table: GPL-future-only symbols */ \ | 110 | /* Kernel symbol table: GPL-future-only symbols */ \ |
83 | __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \ | 111 | __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \ |
84 | VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .; \ | 112 | VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .; \ |
diff --git a/include/asm-i386/hw_irq.h b/include/asm-i386/hw_irq.h index a4c0a5a9ffd8..87e5a351d881 100644 --- a/include/asm-i386/hw_irq.h +++ b/include/asm-i386/hw_irq.h | |||
@@ -69,14 +69,4 @@ extern atomic_t irq_mis_count; | |||
69 | 69 | ||
70 | #define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs)) | 70 | #define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs)) |
71 | 71 | ||
72 | #if defined(CONFIG_X86_IO_APIC) | ||
73 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) | ||
74 | { | ||
75 | if (IO_APIC_IRQ(i)) | ||
76 | send_IPI_self(IO_APIC_VECTOR(i)); | ||
77 | } | ||
78 | #else | ||
79 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} | ||
80 | #endif | ||
81 | |||
82 | #endif /* _ASM_HW_IRQ_H */ | 72 | #endif /* _ASM_HW_IRQ_H */ |
diff --git a/include/asm-i386/mach-visws/setup_arch.h b/include/asm-i386/mach-visws/setup_arch.h index b92d6d9a4d3c..33f700ef6831 100644 --- a/include/asm-i386/mach-visws/setup_arch.h +++ b/include/asm-i386/mach-visws/setup_arch.h | |||
@@ -1,5 +1,8 @@ | |||
1 | /* Hook to call BIOS initialisation function */ | 1 | /* Hook to call BIOS initialisation function */ |
2 | 2 | ||
3 | extern unsigned long sgivwfb_mem_phys; | ||
4 | extern unsigned long sgivwfb_mem_size; | ||
5 | |||
3 | /* no action for visws */ | 6 | /* no action for visws */ |
4 | 7 | ||
5 | #define ARCH_SETUP | 8 | #define ARCH_SETUP |
diff --git a/include/asm-ia64/hw_irq.h b/include/asm-ia64/hw_irq.h index ea8b8c407ab4..27f9df6b9145 100644 --- a/include/asm-ia64/hw_irq.h +++ b/include/asm-ia64/hw_irq.h | |||
@@ -97,8 +97,7 @@ extern int reserve_irq_vector (int vector); | |||
97 | extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect); | 97 | extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect); |
98 | extern void register_percpu_irq (ia64_vector vec, struct irqaction *action); | 98 | extern void register_percpu_irq (ia64_vector vec, struct irqaction *action); |
99 | 99 | ||
100 | static inline void | 100 | static inline void ia64_resend_irq(unsigned int vector) |
101 | hw_resend_irq (struct hw_interrupt_type *h, unsigned int vector) | ||
102 | { | 101 | { |
103 | platform_send_ipi(smp_processor_id(), vector, IA64_IPI_DM_INT, 0); | 102 | platform_send_ipi(smp_processor_id(), vector, IA64_IPI_DM_INT, 0); |
104 | } | 103 | } |
diff --git a/include/asm-ia64/irq.h b/include/asm-ia64/irq.h index dbe86c0bbce5..79479e2c6966 100644 --- a/include/asm-ia64/irq.h +++ b/include/asm-ia64/irq.h | |||
@@ -14,11 +14,6 @@ | |||
14 | #define NR_IRQS 256 | 14 | #define NR_IRQS 256 |
15 | #define NR_IRQ_VECTORS NR_IRQS | 15 | #define NR_IRQ_VECTORS NR_IRQS |
16 | 16 | ||
17 | /* | ||
18 | * IRQ line status macro IRQ_PER_CPU is used | ||
19 | */ | ||
20 | #define ARCH_HAS_IRQ_PER_CPU | ||
21 | |||
22 | static __inline__ int | 17 | static __inline__ int |
23 | irq_canonicalize (int irq) | 18 | irq_canonicalize (int irq) |
24 | { | 19 | { |
diff --git a/include/asm-ia64/sn/sn_sal.h b/include/asm-ia64/sn/sn_sal.h index cd490b20d592..bd4452bda357 100644 --- a/include/asm-ia64/sn/sn_sal.h +++ b/include/asm-ia64/sn/sn_sal.h | |||
@@ -85,6 +85,7 @@ | |||
85 | #define SN_SAL_GET_PROM_FEATURE_SET 0x02000065 | 85 | #define SN_SAL_GET_PROM_FEATURE_SET 0x02000065 |
86 | #define SN_SAL_SET_OS_FEATURE_SET 0x02000066 | 86 | #define SN_SAL_SET_OS_FEATURE_SET 0x02000066 |
87 | #define SN_SAL_INJECT_ERROR 0x02000067 | 87 | #define SN_SAL_INJECT_ERROR 0x02000067 |
88 | #define SN_SAL_SET_CPU_NUMBER 0x02000068 | ||
88 | 89 | ||
89 | /* | 90 | /* |
90 | * Service-specific constants | 91 | * Service-specific constants |
@@ -1150,4 +1151,13 @@ sn_inject_error(u64 paddr, u64 *data, u64 *ecc) | |||
1150 | local_irq_restore(irq_flags); | 1151 | local_irq_restore(irq_flags); |
1151 | return ret_stuff.status; | 1152 | return ret_stuff.status; |
1152 | } | 1153 | } |
1154 | |||
1155 | static inline int | ||
1156 | ia64_sn_set_cpu_number(int cpu) | ||
1157 | { | ||
1158 | struct ia64_sal_retval rv; | ||
1159 | |||
1160 | SAL_CALL_NOLOCK(rv, SN_SAL_SET_CPU_NUMBER, cpu, 0, 0, 0, 0, 0, 0); | ||
1161 | return rv.status; | ||
1162 | } | ||
1153 | #endif /* _ASM_IA64_SN_SN_SAL_H */ | 1163 | #endif /* _ASM_IA64_SN_SN_SAL_H */ |
diff --git a/include/asm-m32r/hw_irq.h b/include/asm-m32r/hw_irq.h index 8d7e9d0e09e8..7138537cda03 100644 --- a/include/asm-m32r/hw_irq.h +++ b/include/asm-m32r/hw_irq.h | |||
@@ -1,9 +1,4 @@ | |||
1 | #ifndef _ASM_M32R_HW_IRQ_H | 1 | #ifndef _ASM_M32R_HW_IRQ_H |
2 | #define _ASM_M32R_HW_IRQ_H | 2 | #define _ASM_M32R_HW_IRQ_H |
3 | 3 | ||
4 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) | ||
5 | { | ||
6 | /* Nothing to do */ | ||
7 | } | ||
8 | |||
9 | #endif /* _ASM_M32R_HW_IRQ_H */ | 4 | #endif /* _ASM_M32R_HW_IRQ_H */ |
diff --git a/include/asm-m68knommu/bootstd.h b/include/asm-m68knommu/bootstd.h index 3fdc79f06d50..bdc1a4ac4fe9 100644 --- a/include/asm-m68knommu/bootstd.h +++ b/include/asm-m68knommu/bootstd.h | |||
@@ -52,7 +52,7 @@ type name(void) \ | |||
52 | __asm__ __volatile__ ("trap #2" \ | 52 | __asm__ __volatile__ ("trap #2" \ |
53 | : "=g" (__res) \ | 53 | : "=g" (__res) \ |
54 | : "0" (__res) \ | 54 | : "0" (__res) \ |
55 | : "%d0"); \ | 55 | ); \ |
56 | __bsc_return(type,__res); \ | 56 | __bsc_return(type,__res); \ |
57 | } | 57 | } |
58 | 58 | ||
@@ -64,7 +64,7 @@ type name(atype a) \ | |||
64 | __asm__ __volatile__ ("trap #2" \ | 64 | __asm__ __volatile__ ("trap #2" \ |
65 | : "=g" (__res) \ | 65 | : "=g" (__res) \ |
66 | : "0" (__res), "d" (__a) \ | 66 | : "0" (__res), "d" (__a) \ |
67 | : "%d0"); \ | 67 | ); \ |
68 | __bsc_return(type,__res); \ | 68 | __bsc_return(type,__res); \ |
69 | } | 69 | } |
70 | 70 | ||
@@ -77,7 +77,7 @@ type name(atype a, btype b) \ | |||
77 | __asm__ __volatile__ ("trap #2" \ | 77 | __asm__ __volatile__ ("trap #2" \ |
78 | : "=g" (__res) \ | 78 | : "=g" (__res) \ |
79 | : "0" (__res), "d" (__a), "d" (__b) \ | 79 | : "0" (__res), "d" (__a), "d" (__b) \ |
80 | : "%d0"); \ | 80 | ); \ |
81 | __bsc_return(type,__res); \ | 81 | __bsc_return(type,__res); \ |
82 | } | 82 | } |
83 | 83 | ||
@@ -92,7 +92,7 @@ type name(atype a, btype b, ctype c) \ | |||
92 | : "=g" (__res) \ | 92 | : "=g" (__res) \ |
93 | : "0" (__res), "d" (__a), "d" (__b), \ | 93 | : "0" (__res), "d" (__a), "d" (__b), \ |
94 | "d" (__c) \ | 94 | "d" (__c) \ |
95 | : "%d0"); \ | 95 | ); \ |
96 | __bsc_return(type,__res); \ | 96 | __bsc_return(type,__res); \ |
97 | } | 97 | } |
98 | 98 | ||
@@ -108,7 +108,7 @@ type name(atype a, btype b, ctype c, dtype d) \ | |||
108 | : "=g" (__res) \ | 108 | : "=g" (__res) \ |
109 | : "0" (__res), "d" (__a), "d" (__b), \ | 109 | : "0" (__res), "d" (__a), "d" (__b), \ |
110 | "d" (__c), "d" (__d) \ | 110 | "d" (__c), "d" (__d) \ |
111 | : "%d0"); \ | 111 | ); \ |
112 | __bsc_return(type,__res); \ | 112 | __bsc_return(type,__res); \ |
113 | } | 113 | } |
114 | 114 | ||
@@ -125,7 +125,7 @@ type name(atype a, btype b, ctype c, dtype d, etype e) \ | |||
125 | : "=g" (__res) \ | 125 | : "=g" (__res) \ |
126 | : "0" (__res), "d" (__a), "d" (__b), \ | 126 | : "0" (__res), "d" (__a), "d" (__b), \ |
127 | "d" (__c), "d" (__d), "d" (__e) \ | 127 | "d" (__c), "d" (__d), "d" (__e) \ |
128 | : "%d0"); \ | 128 | ); \ |
129 | __bsc_return(type,__res); \ | 129 | __bsc_return(type,__res); \ |
130 | } | 130 | } |
131 | 131 | ||
diff --git a/include/asm-mips/hw_irq.h b/include/asm-mips/hw_irq.h index c854d017c0e5..458d9fdc76bf 100644 --- a/include/asm-mips/hw_irq.h +++ b/include/asm-mips/hw_irq.h | |||
@@ -19,9 +19,9 @@ extern void init_8259A(int aeoi); | |||
19 | 19 | ||
20 | extern atomic_t irq_err_count; | 20 | extern atomic_t irq_err_count; |
21 | 21 | ||
22 | /* This may not be apropriate for all machines, we'll see ... */ | 22 | /* |
23 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) | 23 | * interrupt-retrigger: NOP for now. This may not be apropriate for all |
24 | { | 24 | * machines, we'll see ... |
25 | } | 25 | */ |
26 | 26 | ||
27 | #endif /* __ASM_HW_IRQ_H */ | 27 | #endif /* __ASM_HW_IRQ_H */ |
diff --git a/include/asm-mips/mach-mips/irq.h b/include/asm-mips/mach-mips/irq.h index 083d9c512a04..e994b0c01227 100644 --- a/include/asm-mips/mach-mips/irq.h +++ b/include/asm-mips/mach-mips/irq.h | |||
@@ -4,10 +4,4 @@ | |||
4 | 4 | ||
5 | #define NR_IRQS 256 | 5 | #define NR_IRQS 256 |
6 | 6 | ||
7 | #ifdef CONFIG_SMP | ||
8 | |||
9 | #define ARCH_HAS_IRQ_PER_CPU | ||
10 | |||
11 | #endif | ||
12 | |||
13 | #endif /* __ASM_MACH_MIPS_IRQ_H */ | 7 | #endif /* __ASM_MACH_MIPS_IRQ_H */ |
diff --git a/include/asm-parisc/assembly.h b/include/asm-parisc/assembly.h index 3ce3440d1b0c..1a7bfe699e0c 100644 --- a/include/asm-parisc/assembly.h +++ b/include/asm-parisc/assembly.h | |||
@@ -48,6 +48,7 @@ | |||
48 | #define CALLEE_SAVE_FRAME_SIZE (CALLEE_REG_FRAME_SIZE + CALLEE_FLOAT_FRAME_SIZE) | 48 | #define CALLEE_SAVE_FRAME_SIZE (CALLEE_REG_FRAME_SIZE + CALLEE_FLOAT_FRAME_SIZE) |
49 | 49 | ||
50 | #ifdef CONFIG_PA20 | 50 | #ifdef CONFIG_PA20 |
51 | #define LDCW ldcw,co | ||
51 | #define BL b,l | 52 | #define BL b,l |
52 | # ifdef CONFIG_64BIT | 53 | # ifdef CONFIG_64BIT |
53 | # define LEVEL 2.0w | 54 | # define LEVEL 2.0w |
@@ -55,6 +56,7 @@ | |||
55 | # define LEVEL 2.0 | 56 | # define LEVEL 2.0 |
56 | # endif | 57 | # endif |
57 | #else | 58 | #else |
59 | #define LDCW ldcw | ||
58 | #define BL bl | 60 | #define BL bl |
59 | #define LEVEL 1.1 | 61 | #define LEVEL 1.1 |
60 | #endif | 62 | #endif |
diff --git a/include/asm-parisc/compat.h b/include/asm-parisc/compat.h index 289624d8b2d4..71b4eeea205a 100644 --- a/include/asm-parisc/compat.h +++ b/include/asm-parisc/compat.h | |||
@@ -5,6 +5,7 @@ | |||
5 | */ | 5 | */ |
6 | #include <linux/types.h> | 6 | #include <linux/types.h> |
7 | #include <linux/sched.h> | 7 | #include <linux/sched.h> |
8 | #include <linux/personality.h> | ||
8 | 9 | ||
9 | #define COMPAT_USER_HZ 100 | 10 | #define COMPAT_USER_HZ 100 |
10 | 11 | ||
@@ -149,4 +150,14 @@ static __inline__ void __user *compat_alloc_user_space(long len) | |||
149 | return (void __user *)regs->gr[30]; | 150 | return (void __user *)regs->gr[30]; |
150 | } | 151 | } |
151 | 152 | ||
153 | static inline int __is_compat_task(struct task_struct *t) | ||
154 | { | ||
155 | return personality(t->personality) == PER_LINUX32; | ||
156 | } | ||
157 | |||
158 | static inline int is_compat_task(void) | ||
159 | { | ||
160 | return __is_compat_task(current); | ||
161 | } | ||
162 | |||
152 | #endif /* _ASM_PARISC_COMPAT_H */ | 163 | #endif /* _ASM_PARISC_COMPAT_H */ |
diff --git a/include/asm-parisc/hw_irq.h b/include/asm-parisc/hw_irq.h index 151426e27521..6707f7df3921 100644 --- a/include/asm-parisc/hw_irq.h +++ b/include/asm-parisc/hw_irq.h | |||
@@ -3,15 +3,6 @@ | |||
3 | 3 | ||
4 | /* | 4 | /* |
5 | * linux/include/asm/hw_irq.h | 5 | * linux/include/asm/hw_irq.h |
6 | * | ||
7 | * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar | ||
8 | * | ||
9 | * moved some of the old arch/i386/kernel/irq.h to here. VY | ||
10 | * | ||
11 | * IRQ/IPI changes taken from work by Thomas Radke | ||
12 | * <tomsoft@informatik.tu-chemnitz.de> | ||
13 | */ | 6 | */ |
14 | 7 | ||
15 | extern void hw_resend_irq(struct hw_interrupt_type *, unsigned int); | ||
16 | |||
17 | #endif | 8 | #endif |
diff --git a/include/asm-parisc/irq.h b/include/asm-parisc/irq.h index 377ba90c7d02..5cae260615a2 100644 --- a/include/asm-parisc/irq.h +++ b/include/asm-parisc/irq.h | |||
@@ -26,11 +26,6 @@ | |||
26 | 26 | ||
27 | #define NR_IRQS (CPU_IRQ_MAX + 1) | 27 | #define NR_IRQS (CPU_IRQ_MAX + 1) |
28 | 28 | ||
29 | /* | ||
30 | * IRQ line status macro IRQ_PER_CPU is used | ||
31 | */ | ||
32 | #define ARCH_HAS_IRQ_PER_CPU | ||
33 | |||
34 | static __inline__ int irq_canonicalize(int irq) | 29 | static __inline__ int irq_canonicalize(int irq) |
35 | { | 30 | { |
36 | return (irq == 2) ? 9 : irq; | 31 | return (irq == 2) ? 9 : irq; |
diff --git a/include/asm-parisc/pdc.h b/include/asm-parisc/pdc.h index 08364f957e7a..c9b2e35326ee 100644 --- a/include/asm-parisc/pdc.h +++ b/include/asm-parisc/pdc.h | |||
@@ -278,12 +278,11 @@ typedef struct { | |||
278 | /* constants for OS (NVM...) */ | 278 | /* constants for OS (NVM...) */ |
279 | #define OS_ID_NONE 0 /* Undefined OS ID */ | 279 | #define OS_ID_NONE 0 /* Undefined OS ID */ |
280 | #define OS_ID_HPUX 1 /* HP-UX OS */ | 280 | #define OS_ID_HPUX 1 /* HP-UX OS */ |
281 | #define OS_ID_LINUX OS_ID_HPUX /* just use the same value as hpux */ | ||
282 | #define OS_ID_MPEXL 2 /* MPE XL OS */ | 281 | #define OS_ID_MPEXL 2 /* MPE XL OS */ |
283 | #define OS_ID_OSF 3 /* OSF OS */ | 282 | #define OS_ID_OSF 3 /* OSF OS */ |
284 | #define OS_ID_HPRT 4 /* HP-RT OS */ | 283 | #define OS_ID_HPRT 4 /* HP-RT OS */ |
285 | #define OS_ID_NOVEL 5 /* NOVELL OS */ | 284 | #define OS_ID_NOVEL 5 /* NOVELL OS */ |
286 | #define OS_ID_NT 6 /* NT OS */ | 285 | #define OS_ID_LINUX 6 /* Linux */ |
287 | 286 | ||
288 | 287 | ||
289 | /* constants for PDC_CHASSIS */ | 288 | /* constants for PDC_CHASSIS */ |
@@ -352,8 +351,8 @@ struct pdc_cache_cf { /* for PDC_CACHE (I/D-caches) */ | |||
352 | cc_wt : 1, /* 0 = WT-Dcache, 1 = WB-Dcache */ | 351 | cc_wt : 1, /* 0 = WT-Dcache, 1 = WB-Dcache */ |
353 | cc_sh : 2, /* 0 = separate I/D-cache, else shared I/D-cache */ | 352 | cc_sh : 2, /* 0 = separate I/D-cache, else shared I/D-cache */ |
354 | cc_cst : 3, /* 0 = incoherent D-cache, 1=coherent D-cache */ | 353 | cc_cst : 3, /* 0 = incoherent D-cache, 1=coherent D-cache */ |
355 | cc_pad1 : 5, /* reserved */ | 354 | cc_pad1 : 10, /* reserved */ |
356 | cc_assoc: 8; /* associativity of I/D-cache */ | 355 | cc_hv : 3; /* hversion dependent */ |
357 | }; | 356 | }; |
358 | 357 | ||
359 | struct pdc_tlb_cf { /* for PDC_CACHE (I/D-TLB's) */ | 358 | struct pdc_tlb_cf { /* for PDC_CACHE (I/D-TLB's) */ |
@@ -719,6 +718,7 @@ void setup_pdc(void); /* in inventory.c */ | |||
719 | int pdc_add_valid(unsigned long address); | 718 | int pdc_add_valid(unsigned long address); |
720 | int pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_info, unsigned long len); | 719 | int pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_info, unsigned long len); |
721 | int pdc_chassis_disp(unsigned long disp); | 720 | int pdc_chassis_disp(unsigned long disp); |
721 | int pdc_chassis_warn(unsigned long *warn); | ||
722 | int pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info); | 722 | int pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info); |
723 | int pdc_iodc_read(unsigned long *actcnt, unsigned long hpa, unsigned int index, | 723 | int pdc_iodc_read(unsigned long *actcnt, unsigned long hpa, unsigned int index, |
724 | void *iodc_data, unsigned int iodc_data_size); | 724 | void *iodc_data, unsigned int iodc_data_size); |
@@ -732,6 +732,7 @@ int pdc_model_cpuid(unsigned long *cpu_id); | |||
732 | int pdc_model_versions(unsigned long *versions, int id); | 732 | int pdc_model_versions(unsigned long *versions, int id); |
733 | int pdc_model_capabilities(unsigned long *capabilities); | 733 | int pdc_model_capabilities(unsigned long *capabilities); |
734 | int pdc_cache_info(struct pdc_cache_info *cache); | 734 | int pdc_cache_info(struct pdc_cache_info *cache); |
735 | int pdc_spaceid_bits(unsigned long *space_bits); | ||
735 | #ifndef CONFIG_PA20 | 736 | #ifndef CONFIG_PA20 |
736 | int pdc_btlb_info(struct pdc_btlb_info *btlb); | 737 | int pdc_btlb_info(struct pdc_btlb_info *btlb); |
737 | int pdc_mem_map_hpa(struct pdc_memory_map *r_addr, struct pdc_module_path *mod_path); | 738 | int pdc_mem_map_hpa(struct pdc_memory_map *r_addr, struct pdc_module_path *mod_path); |
@@ -775,6 +776,18 @@ int pdc_sti_call(unsigned long func, unsigned long flags, | |||
775 | 776 | ||
776 | extern void pdc_init(void); | 777 | extern void pdc_init(void); |
777 | 778 | ||
779 | static inline char * os_id_to_string(u16 os_id) { | ||
780 | switch(os_id) { | ||
781 | case OS_ID_NONE: return "No OS"; | ||
782 | case OS_ID_HPUX: return "HP-UX"; | ||
783 | case OS_ID_MPEXL: return "MPE-iX"; | ||
784 | case OS_ID_OSF: return "OSF"; | ||
785 | case OS_ID_HPRT: return "HP-RT"; | ||
786 | case OS_ID_NOVEL: return "Novell Netware"; | ||
787 | case OS_ID_LINUX: return "Linux"; | ||
788 | default: return "Unknown"; | ||
789 | } | ||
790 | } | ||
778 | #endif /* __ASSEMBLY__ */ | 791 | #endif /* __ASSEMBLY__ */ |
779 | 792 | ||
780 | #endif /* _PARISC_PDC_H */ | 793 | #endif /* _PARISC_PDC_H */ |
diff --git a/include/asm-parisc/pgtable.h b/include/asm-parisc/pgtable.h index b6bcc672ba80..5066c54dae0a 100644 --- a/include/asm-parisc/pgtable.h +++ b/include/asm-parisc/pgtable.h | |||
@@ -506,13 +506,13 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, | |||
506 | 506 | ||
507 | /* TLB page size encoding - see table 3-1 in parisc20.pdf */ | 507 | /* TLB page size encoding - see table 3-1 in parisc20.pdf */ |
508 | #define _PAGE_SIZE_ENCODING_4K 0 | 508 | #define _PAGE_SIZE_ENCODING_4K 0 |
509 | #define _PAGE_SIZE_ENCODING_16K 1 | 509 | #define _PAGE_SIZE_ENCODING_16K 1 |
510 | #define _PAGE_SIZE_ENCODING_64K 2 | 510 | #define _PAGE_SIZE_ENCODING_64K 2 |
511 | #define _PAGE_SIZE_ENCODING_256K 3 | 511 | #define _PAGE_SIZE_ENCODING_256K 3 |
512 | #define _PAGE_SIZE_ENCODING_1M 4 | 512 | #define _PAGE_SIZE_ENCODING_1M 4 |
513 | #define _PAGE_SIZE_ENCODING_4M 5 | 513 | #define _PAGE_SIZE_ENCODING_4M 5 |
514 | #define _PAGE_SIZE_ENCODING_16M 6 | 514 | #define _PAGE_SIZE_ENCODING_16M 6 |
515 | #define _PAGE_SIZE_ENCODING_64M 7 | 515 | #define _PAGE_SIZE_ENCODING_64M 7 |
516 | 516 | ||
517 | #if defined(CONFIG_PARISC_PAGE_SIZE_4KB) | 517 | #if defined(CONFIG_PARISC_PAGE_SIZE_4KB) |
518 | # define _PAGE_SIZE_ENCODING_DEFAULT _PAGE_SIZE_ENCODING_4K | 518 | # define _PAGE_SIZE_ENCODING_DEFAULT _PAGE_SIZE_ENCODING_4K |
diff --git a/include/asm-parisc/processor.h b/include/asm-parisc/processor.h index ca49dc91f4fc..b73626f040da 100644 --- a/include/asm-parisc/processor.h +++ b/include/asm-parisc/processor.h | |||
@@ -26,14 +26,12 @@ | |||
26 | * Default implementation of macro that returns current | 26 | * Default implementation of macro that returns current |
27 | * instruction pointer ("program counter"). | 27 | * instruction pointer ("program counter"). |
28 | */ | 28 | */ |
29 | 29 | #ifdef CONFIG_PA20 | |
30 | /* We cannot use MFIA as it was added for PA2.0 - prumpf | 30 | #define current_ia(x) __asm__("mfia %0" : "=r"(x)) |
31 | 31 | #else /* mfia added in pa2.0 */ | |
32 | At one point there were no "0f/0b" type local symbols in gas for | 32 | #define current_ia(x) __asm__("blr 0,%0\n\tnop" : "=r"(x)) |
33 | PA-RISC. This is no longer true, but this still seems like the | 33 | #endif |
34 | nicest way to implement this. */ | 34 | #define current_text_addr() ({ void *pc; current_ia(pc); pc; }) |
35 | |||
36 | #define current_text_addr() ({ void *pc; __asm__("\n\tblr 0,%0\n\tnop":"=r" (pc)); pc; }) | ||
37 | 35 | ||
38 | #define TASK_SIZE (current->thread.task_size) | 36 | #define TASK_SIZE (current->thread.task_size) |
39 | #define TASK_UNMAPPED_BASE (current->thread.map_base) | 37 | #define TASK_UNMAPPED_BASE (current->thread.map_base) |
diff --git a/include/asm-parisc/system.h b/include/asm-parisc/system.h index 863876134b2c..5fe2d2329ab5 100644 --- a/include/asm-parisc/system.h +++ b/include/asm-parisc/system.h | |||
@@ -155,13 +155,14 @@ static inline void set_eiem(unsigned long val) | |||
155 | type and dynamically select the 16-byte aligned int from the array | 155 | type and dynamically select the 16-byte aligned int from the array |
156 | for the semaphore. */ | 156 | for the semaphore. */ |
157 | 157 | ||
158 | #define __PA_LDCW_ALIGNMENT 16 | 158 | #define __PA_LDCW_ALIGNMENT 16 |
159 | #define __ldcw_align(a) ({ \ | 159 | #define __ldcw_align(a) ({ \ |
160 | unsigned long __ret = (unsigned long) &(a)->lock[0]; \ | 160 | unsigned long __ret = (unsigned long) &(a)->lock[0]; \ |
161 | __ret = (__ret + __PA_LDCW_ALIGNMENT - 1) & ~(__PA_LDCW_ALIGNMENT - 1); \ | 161 | __ret = (__ret + __PA_LDCW_ALIGNMENT - 1) \ |
162 | (volatile unsigned int *) __ret; \ | 162 | & ~(__PA_LDCW_ALIGNMENT - 1); \ |
163 | (volatile unsigned int *) __ret; \ | ||
163 | }) | 164 | }) |
164 | #define LDCW "ldcw" | 165 | #define __LDCW "ldcw" |
165 | 166 | ||
166 | #else /*CONFIG_PA20*/ | 167 | #else /*CONFIG_PA20*/ |
167 | /* From: "Jim Hull" <jim.hull of hp.com> | 168 | /* From: "Jim Hull" <jim.hull of hp.com> |
@@ -171,17 +172,18 @@ static inline void set_eiem(unsigned long val) | |||
171 | they only require "natural" alignment (4-byte for ldcw, 8-byte for | 172 | they only require "natural" alignment (4-byte for ldcw, 8-byte for |
172 | ldcd). */ | 173 | ldcd). */ |
173 | 174 | ||
174 | #define __PA_LDCW_ALIGNMENT 4 | 175 | #define __PA_LDCW_ALIGNMENT 4 |
175 | #define __ldcw_align(a) ((volatile unsigned int *)a) | 176 | #define __ldcw_align(a) ((volatile unsigned int *)a) |
176 | #define LDCW "ldcw,co" | 177 | #define __LDCW "ldcw,co" |
177 | 178 | ||
178 | #endif /*!CONFIG_PA20*/ | 179 | #endif /*!CONFIG_PA20*/ |
179 | 180 | ||
180 | /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */ | 181 | /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */ |
181 | #define __ldcw(a) ({ \ | 182 | #define __ldcw(a) ({ \ |
182 | unsigned __ret; \ | 183 | unsigned __ret; \ |
183 | __asm__ __volatile__(LDCW " 0(%1),%0" : "=r" (__ret) : "r" (a)); \ | 184 | __asm__ __volatile__(__LDCW " 0(%1),%0" \ |
184 | __ret; \ | 185 | : "=r" (__ret) : "r" (a)); \ |
186 | __ret; \ | ||
185 | }) | 187 | }) |
186 | 188 | ||
187 | #ifdef CONFIG_SMP | 189 | #ifdef CONFIG_SMP |
diff --git a/include/asm-parisc/uaccess.h b/include/asm-parisc/uaccess.h index f6c417c8c484..d973e8b3466c 100644 --- a/include/asm-parisc/uaccess.h +++ b/include/asm-parisc/uaccess.h | |||
@@ -172,7 +172,11 @@ struct exception_data { | |||
172 | /* | 172 | /* |
173 | * The "__put_user/kernel_asm()" macros tell gcc they read from memory | 173 | * The "__put_user/kernel_asm()" macros tell gcc they read from memory |
174 | * instead of writing. This is because they do not write to any memory | 174 | * instead of writing. This is because they do not write to any memory |
175 | * gcc knows about, so there are no aliasing issues. | 175 | * gcc knows about, so there are no aliasing issues. These macros must |
176 | * also be aware that "fixup_put_user_skip_[12]" are executed in the | ||
177 | * context of the fault, and any registers used there must be listed | ||
178 | * as clobbers. In this case only "r1" is used by the current routines. | ||
179 | * r8/r9 are already listed as err/val. | ||
176 | */ | 180 | */ |
177 | 181 | ||
178 | #ifdef __LP64__ | 182 | #ifdef __LP64__ |
@@ -183,7 +187,8 @@ struct exception_data { | |||
183 | "\t.dword\t1b,fixup_put_user_skip_1\n" \ | 187 | "\t.dword\t1b,fixup_put_user_skip_1\n" \ |
184 | "\t.previous" \ | 188 | "\t.previous" \ |
185 | : "=r"(__pu_err) \ | 189 | : "=r"(__pu_err) \ |
186 | : "r"(ptr), "r"(x), "0"(__pu_err)) | 190 | : "r"(ptr), "r"(x), "0"(__pu_err) \ |
191 | : "r1") | ||
187 | 192 | ||
188 | #define __put_user_asm(stx,x,ptr) \ | 193 | #define __put_user_asm(stx,x,ptr) \ |
189 | __asm__ __volatile__ ( \ | 194 | __asm__ __volatile__ ( \ |
diff --git a/include/asm-parisc/unistd.h b/include/asm-parisc/unistd.h index 12b867238a47..27bcfad1c3e3 100644 --- a/include/asm-parisc/unistd.h +++ b/include/asm-parisc/unistd.h | |||
@@ -797,11 +797,6 @@ | |||
797 | 797 | ||
798 | #define SYS_ify(syscall_name) __NR_##syscall_name | 798 | #define SYS_ify(syscall_name) __NR_##syscall_name |
799 | 799 | ||
800 | /* Assume all syscalls are done from PIC code just to be | ||
801 | * safe. The worst case scenario is that you lose a register | ||
802 | * and save/restore r19 across the syscall. */ | ||
803 | #define PIC | ||
804 | |||
805 | #ifndef ASM_LINE_SEP | 800 | #ifndef ASM_LINE_SEP |
806 | # define ASM_LINE_SEP ; | 801 | # define ASM_LINE_SEP ; |
807 | #endif | 802 | #endif |
diff --git a/include/asm-powerpc/cputable.h b/include/asm-powerpc/cputable.h index fab41c280aa1..1ba3c9983614 100644 --- a/include/asm-powerpc/cputable.h +++ b/include/asm-powerpc/cputable.h | |||
@@ -117,38 +117,30 @@ extern void do_cpu_ftr_fixups(unsigned long offset); | |||
117 | #define CPU_FTR_PPC_LE ASM_CONST(0x0000000000200000) | 117 | #define CPU_FTR_PPC_LE ASM_CONST(0x0000000000200000) |
118 | #define CPU_FTR_REAL_LE ASM_CONST(0x0000000000400000) | 118 | #define CPU_FTR_REAL_LE ASM_CONST(0x0000000000400000) |
119 | 119 | ||
120 | /* | ||
121 | * Add the 64-bit processor unique features in the top half of the word; | ||
122 | * on 32-bit, make the names available but defined to be 0. | ||
123 | */ | ||
120 | #ifdef __powerpc64__ | 124 | #ifdef __powerpc64__ |
121 | /* Add the 64b processor unique features in the top half of the word */ | 125 | #define LONG_ASM_CONST(x) ASM_CONST(x) |
122 | #define CPU_FTR_SLB ASM_CONST(0x0000000100000000) | ||
123 | #define CPU_FTR_16M_PAGE ASM_CONST(0x0000000200000000) | ||
124 | #define CPU_FTR_TLBIEL ASM_CONST(0x0000000400000000) | ||
125 | #define CPU_FTR_NOEXECUTE ASM_CONST(0x0000000800000000) | ||
126 | #define CPU_FTR_IABR ASM_CONST(0x0000002000000000) | ||
127 | #define CPU_FTR_MMCRA ASM_CONST(0x0000004000000000) | ||
128 | #define CPU_FTR_CTRL ASM_CONST(0x0000008000000000) | ||
129 | #define CPU_FTR_SMT ASM_CONST(0x0000010000000000) | ||
130 | #define CPU_FTR_COHERENT_ICACHE ASM_CONST(0x0000020000000000) | ||
131 | #define CPU_FTR_LOCKLESS_TLBIE ASM_CONST(0x0000040000000000) | ||
132 | #define CPU_FTR_CI_LARGE_PAGE ASM_CONST(0x0000100000000000) | ||
133 | #define CPU_FTR_PAUSE_ZERO ASM_CONST(0x0000200000000000) | ||
134 | #define CPU_FTR_PURR ASM_CONST(0x0000400000000000) | ||
135 | #else | 126 | #else |
136 | /* ensure on 32b processors the flags are available for compiling but | 127 | #define LONG_ASM_CONST(x) 0 |
137 | * don't do anything */ | ||
138 | #define CPU_FTR_SLB ASM_CONST(0x0) | ||
139 | #define CPU_FTR_16M_PAGE ASM_CONST(0x0) | ||
140 | #define CPU_FTR_TLBIEL ASM_CONST(0x0) | ||
141 | #define CPU_FTR_NOEXECUTE ASM_CONST(0x0) | ||
142 | #define CPU_FTR_IABR ASM_CONST(0x0) | ||
143 | #define CPU_FTR_MMCRA ASM_CONST(0x0) | ||
144 | #define CPU_FTR_CTRL ASM_CONST(0x0) | ||
145 | #define CPU_FTR_SMT ASM_CONST(0x0) | ||
146 | #define CPU_FTR_COHERENT_ICACHE ASM_CONST(0x0) | ||
147 | #define CPU_FTR_LOCKLESS_TLBIE ASM_CONST(0x0) | ||
148 | #define CPU_FTR_CI_LARGE_PAGE ASM_CONST(0x0) | ||
149 | #define CPU_FTR_PURR ASM_CONST(0x0) | ||
150 | #endif | 128 | #endif |
151 | 129 | ||
130 | #define CPU_FTR_SLB LONG_ASM_CONST(0x0000000100000000) | ||
131 | #define CPU_FTR_16M_PAGE LONG_ASM_CONST(0x0000000200000000) | ||
132 | #define CPU_FTR_TLBIEL LONG_ASM_CONST(0x0000000400000000) | ||
133 | #define CPU_FTR_NOEXECUTE LONG_ASM_CONST(0x0000000800000000) | ||
134 | #define CPU_FTR_IABR LONG_ASM_CONST(0x0000002000000000) | ||
135 | #define CPU_FTR_MMCRA LONG_ASM_CONST(0x0000004000000000) | ||
136 | #define CPU_FTR_CTRL LONG_ASM_CONST(0x0000008000000000) | ||
137 | #define CPU_FTR_SMT LONG_ASM_CONST(0x0000010000000000) | ||
138 | #define CPU_FTR_COHERENT_ICACHE LONG_ASM_CONST(0x0000020000000000) | ||
139 | #define CPU_FTR_LOCKLESS_TLBIE LONG_ASM_CONST(0x0000040000000000) | ||
140 | #define CPU_FTR_CI_LARGE_PAGE LONG_ASM_CONST(0x0000100000000000) | ||
141 | #define CPU_FTR_PAUSE_ZERO LONG_ASM_CONST(0x0000200000000000) | ||
142 | #define CPU_FTR_PURR LONG_ASM_CONST(0x0000400000000000) | ||
143 | |||
152 | #ifndef __ASSEMBLY__ | 144 | #ifndef __ASSEMBLY__ |
153 | 145 | ||
154 | #define CPU_FTR_PPCAS_ARCH_V2_BASE (CPU_FTR_SLB | \ | 146 | #define CPU_FTR_PPCAS_ARCH_V2_BASE (CPU_FTR_SLB | \ |
diff --git a/include/asm-powerpc/hw_irq.h b/include/asm-powerpc/hw_irq.h index ce0f7db63c16..d40359204aba 100644 --- a/include/asm-powerpc/hw_irq.h +++ b/include/asm-powerpc/hw_irq.h | |||
@@ -86,27 +86,27 @@ static inline void local_irq_save_ptr(unsigned long *flags) | |||
86 | #define mask_irq(irq) \ | 86 | #define mask_irq(irq) \ |
87 | ({ \ | 87 | ({ \ |
88 | irq_desc_t *desc = get_irq_desc(irq); \ | 88 | irq_desc_t *desc = get_irq_desc(irq); \ |
89 | if (desc->handler && desc->handler->disable) \ | 89 | if (desc->chip && desc->chip->disable) \ |
90 | desc->handler->disable(irq); \ | 90 | desc->chip->disable(irq); \ |
91 | }) | 91 | }) |
92 | #define unmask_irq(irq) \ | 92 | #define unmask_irq(irq) \ |
93 | ({ \ | 93 | ({ \ |
94 | irq_desc_t *desc = get_irq_desc(irq); \ | 94 | irq_desc_t *desc = get_irq_desc(irq); \ |
95 | if (desc->handler && desc->handler->enable) \ | 95 | if (desc->chip && desc->chip->enable) \ |
96 | desc->handler->enable(irq); \ | 96 | desc->chip->enable(irq); \ |
97 | }) | 97 | }) |
98 | #define ack_irq(irq) \ | 98 | #define ack_irq(irq) \ |
99 | ({ \ | 99 | ({ \ |
100 | irq_desc_t *desc = get_irq_desc(irq); \ | 100 | irq_desc_t *desc = get_irq_desc(irq); \ |
101 | if (desc->handler && desc->handler->ack) \ | 101 | if (desc->chip && desc->chip->ack) \ |
102 | desc->handler->ack(irq); \ | 102 | desc->chip->ack(irq); \ |
103 | }) | 103 | }) |
104 | 104 | ||
105 | /* Should we handle this via lost interrupts and IPIs or should we don't care like | 105 | /* |
106 | * we do now ? --BenH. | 106 | * interrupt-retrigger: should we handle this via lost interrupts and IPIs |
107 | * or should we not care like we do now ? --BenH. | ||
107 | */ | 108 | */ |
108 | struct hw_interrupt_type; | 109 | struct hw_interrupt_type; |
109 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} | ||
110 | 110 | ||
111 | #endif /* __KERNEL__ */ | 111 | #endif /* __KERNEL__ */ |
112 | #endif /* _ASM_POWERPC_HW_IRQ_H */ | 112 | #endif /* _ASM_POWERPC_HW_IRQ_H */ |
diff --git a/include/asm-powerpc/irq.h b/include/asm-powerpc/irq.h index a10feec29d4d..eb5f33e1977a 100644 --- a/include/asm-powerpc/irq.h +++ b/include/asm-powerpc/irq.h | |||
@@ -30,11 +30,6 @@ | |||
30 | #define IRQ_POLARITY_POSITIVE 0x2 /* high level or low->high edge */ | 30 | #define IRQ_POLARITY_POSITIVE 0x2 /* high level or low->high edge */ |
31 | #define IRQ_POLARITY_NEGATIVE 0x0 /* low level or high->low edge */ | 31 | #define IRQ_POLARITY_NEGATIVE 0x0 /* low level or high->low edge */ |
32 | 32 | ||
33 | /* | ||
34 | * IRQ line status macro IRQ_PER_CPU is used | ||
35 | */ | ||
36 | #define ARCH_HAS_IRQ_PER_CPU | ||
37 | |||
38 | #define get_irq_desc(irq) (&irq_desc[(irq)]) | 33 | #define get_irq_desc(irq) (&irq_desc[(irq)]) |
39 | 34 | ||
40 | /* Define a way to iterate across irqs. */ | 35 | /* Define a way to iterate across irqs. */ |
diff --git a/include/asm-powerpc/iseries/it_lp_queue.h b/include/asm-powerpc/iseries/it_lp_queue.h index b7c6fc12cce2..284c5a7db3ac 100644 --- a/include/asm-powerpc/iseries/it_lp_queue.h +++ b/include/asm-powerpc/iseries/it_lp_queue.h | |||
@@ -29,20 +29,20 @@ | |||
29 | 29 | ||
30 | struct HvLpEvent; | 30 | struct HvLpEvent; |
31 | 31 | ||
32 | #define ITMaxLpQueues 8 | 32 | #define IT_LP_MAX_QUEUES 8 |
33 | 33 | ||
34 | #define NotUsed 0 // Queue will not be used by PLIC | 34 | #define IT_LP_NOT_USED 0 /* Queue will not be used by PLIC */ |
35 | #define DedicatedIo 1 // Queue dedicated to IO processor specified | 35 | #define IT_LP_DEDICATED_IO 1 /* Queue dedicated to IO processor specified */ |
36 | #define DedicatedLp 2 // Queue dedicated to LP specified | 36 | #define IT_LP_DEDICATED_LP 2 /* Queue dedicated to LP specified */ |
37 | #define Shared 3 // Queue shared for both IO and LP | 37 | #define IT_LP_SHARED 3 /* Queue shared for both IO and LP */ |
38 | 38 | ||
39 | #define LpEventStackSize 4096 | 39 | #define IT_LP_EVENT_STACK_SIZE 4096 |
40 | #define LpEventMaxSize 256 | 40 | #define IT_LP_EVENT_MAX_SIZE 256 |
41 | #define LpEventAlign 64 | 41 | #define IT_LP_EVENT_ALIGN 64 |
42 | 42 | ||
43 | struct hvlpevent_queue { | 43 | struct hvlpevent_queue { |
44 | /* | 44 | /* |
45 | * The xSlicCurEventPtr is the pointer to the next event stack entry | 45 | * The hq_current_event is the pointer to the next event stack entry |
46 | * that will become valid. The OS must peek at this entry to determine | 46 | * that will become valid. The OS must peek at this entry to determine |
47 | * if it is valid. PLIC will set the valid indicator as the very last | 47 | * if it is valid. PLIC will set the valid indicator as the very last |
48 | * store into that entry. | 48 | * store into that entry. |
@@ -52,23 +52,23 @@ struct hvlpevent_queue { | |||
52 | * location again. | 52 | * location again. |
53 | * | 53 | * |
54 | * If the event stack fills and there are overflow events, then PLIC | 54 | * If the event stack fills and there are overflow events, then PLIC |
55 | * will set the xPlicOverflowIntPending flag in which case the OS will | 55 | * will set the hq_overflow_pending flag in which case the OS will |
56 | * have to fetch the additional LP events once they have drained the | 56 | * have to fetch the additional LP events once they have drained the |
57 | * event stack. | 57 | * event stack. |
58 | * | 58 | * |
59 | * The first 16-bytes are known by both the OS and PLIC. The remainder | 59 | * The first 16-bytes are known by both the OS and PLIC. The remainder |
60 | * of the cache line is for use by the OS. | 60 | * of the cache line is for use by the OS. |
61 | */ | 61 | */ |
62 | u8 xPlicOverflowIntPending;// 0x00 Overflow events are pending | 62 | u8 hq_overflow_pending; /* 0x00 Overflow events are pending */ |
63 | u8 xPlicStatus; // 0x01 DedicatedIo or DedicatedLp or NotUsed | 63 | u8 hq_status; /* 0x01 DedicatedIo or DedicatedLp or NotUsed */ |
64 | u16 xSlicLogicalProcIndex; // 0x02 Logical Proc Index for correlation | 64 | u16 hq_proc_index; /* 0x02 Logical Proc Index for correlation */ |
65 | u8 xPlicRsvd[12]; // 0x04 | 65 | u8 hq_reserved1[12]; /* 0x04 */ |
66 | char *xSlicCurEventPtr; // 0x10 | 66 | char *hq_current_event; /* 0x10 */ |
67 | char *xSlicLastValidEventPtr; // 0x18 | 67 | char *hq_last_event; /* 0x18 */ |
68 | char *xSlicEventStackPtr; // 0x20 | 68 | char *hq_event_stack; /* 0x20 */ |
69 | u8 xIndex; // 0x28 unique sequential index. | 69 | u8 hq_index; /* 0x28 unique sequential index. */ |
70 | u8 xSlicRsvd[3]; // 0x29-2b | 70 | u8 hq_reserved2[3]; /* 0x29-2b */ |
71 | spinlock_t lock; | 71 | spinlock_t hq_lock; |
72 | }; | 72 | }; |
73 | 73 | ||
74 | extern struct hvlpevent_queue hvlpevent_queue; | 74 | extern struct hvlpevent_queue hvlpevent_queue; |
diff --git a/include/asm-powerpc/kdump.h b/include/asm-powerpc/kdump.h index 5a5c3b5ab1e0..dc1574c945f8 100644 --- a/include/asm-powerpc/kdump.h +++ b/include/asm-powerpc/kdump.h | |||
@@ -15,6 +15,8 @@ | |||
15 | #define KDUMP_TRAMPOLINE_START 0x0100 | 15 | #define KDUMP_TRAMPOLINE_START 0x0100 |
16 | #define KDUMP_TRAMPOLINE_END 0x3000 | 16 | #define KDUMP_TRAMPOLINE_END 0x3000 |
17 | 17 | ||
18 | #define KDUMP_MIN_TCE_ENTRIES 2048 | ||
19 | |||
18 | #else /* !CONFIG_CRASH_DUMP */ | 20 | #else /* !CONFIG_CRASH_DUMP */ |
19 | 21 | ||
20 | #define PHYSICAL_START 0x0 | 22 | #define PHYSICAL_START 0x0 |
diff --git a/include/asm-powerpc/kexec.h b/include/asm-powerpc/kexec.h index efe8872ec583..8f7fd5cfec34 100644 --- a/include/asm-powerpc/kexec.h +++ b/include/asm-powerpc/kexec.h | |||
@@ -112,9 +112,13 @@ static inline void crash_setup_regs(struct pt_regs *newregs, | |||
112 | #ifdef __powerpc64__ | 112 | #ifdef __powerpc64__ |
113 | extern void kexec_smp_wait(void); /* get and clear naca physid, wait for | 113 | extern void kexec_smp_wait(void); /* get and clear naca physid, wait for |
114 | master to copy new code to 0 */ | 114 | master to copy new code to 0 */ |
115 | extern void __init kexec_setup(void); | ||
116 | extern int crashing_cpu; | 115 | extern int crashing_cpu; |
117 | extern void crash_send_ipi(void (*crash_ipi_callback)(struct pt_regs *)); | 116 | extern void crash_send_ipi(void (*crash_ipi_callback)(struct pt_regs *)); |
117 | extern cpumask_t cpus_in_sr; | ||
118 | static inline int kexec_sr_activated(int cpu) | ||
119 | { | ||
120 | return cpu_isset(cpu,cpus_in_sr); | ||
121 | } | ||
118 | #endif /* __powerpc64 __ */ | 122 | #endif /* __powerpc64 __ */ |
119 | 123 | ||
120 | struct kimage; | 124 | struct kimage; |
@@ -124,10 +128,13 @@ extern int default_machine_kexec_prepare(struct kimage *image); | |||
124 | extern void default_machine_crash_shutdown(struct pt_regs *regs); | 128 | extern void default_machine_crash_shutdown(struct pt_regs *regs); |
125 | 129 | ||
126 | extern void machine_kexec_simple(struct kimage *image); | 130 | extern void machine_kexec_simple(struct kimage *image); |
131 | extern void crash_kexec_secondary(struct pt_regs *regs); | ||
127 | extern int overlaps_crashkernel(unsigned long start, unsigned long size); | 132 | extern int overlaps_crashkernel(unsigned long start, unsigned long size); |
128 | extern void reserve_crashkernel(void); | 133 | extern void reserve_crashkernel(void); |
129 | 134 | ||
130 | #else /* !CONFIG_KEXEC */ | 135 | #else /* !CONFIG_KEXEC */ |
136 | static inline int kexec_sr_activated(int cpu) { return 0; } | ||
137 | static inline void crash_kexec_secondary(struct pt_regs *regs) { } | ||
131 | 138 | ||
132 | static inline int overlaps_crashkernel(unsigned long start, unsigned long size) | 139 | static inline int overlaps_crashkernel(unsigned long start, unsigned long size) |
133 | { | 140 | { |
diff --git a/include/asm-powerpc/machdep.h b/include/asm-powerpc/machdep.h index 73db1f71329d..eba133d149a7 100644 --- a/include/asm-powerpc/machdep.h +++ b/include/asm-powerpc/machdep.h | |||
@@ -81,6 +81,8 @@ struct machdep_calls { | |||
81 | void (*tce_free)(struct iommu_table *tbl, | 81 | void (*tce_free)(struct iommu_table *tbl, |
82 | long index, | 82 | long index, |
83 | long npages); | 83 | long npages); |
84 | unsigned long (*tce_get)(struct iommu_table *tbl, | ||
85 | long index); | ||
84 | void (*tce_flush)(struct iommu_table *tbl); | 86 | void (*tce_flush)(struct iommu_table *tbl); |
85 | void (*iommu_dev_setup)(struct pci_dev *dev); | 87 | void (*iommu_dev_setup)(struct pci_dev *dev); |
86 | void (*iommu_bus_setup)(struct pci_bus *bus); | 88 | void (*iommu_bus_setup)(struct pci_bus *bus); |
diff --git a/include/asm-powerpc/mmu.h b/include/asm-powerpc/mmu.h index 3a5ebe229af5..c3fc7a28e3cd 100644 --- a/include/asm-powerpc/mmu.h +++ b/include/asm-powerpc/mmu.h | |||
@@ -238,7 +238,6 @@ extern int hash_huge_page(struct mm_struct *mm, unsigned long access, | |||
238 | unsigned long ea, unsigned long vsid, int local, | 238 | unsigned long ea, unsigned long vsid, int local, |
239 | unsigned long trap); | 239 | unsigned long trap); |
240 | 240 | ||
241 | extern void htab_finish_init(void); | ||
242 | extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend, | 241 | extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend, |
243 | unsigned long pstart, unsigned long mode, | 242 | unsigned long pstart, unsigned long mode, |
244 | int psize); | 243 | int psize); |
diff --git a/include/asm-powerpc/mmu_context.h b/include/asm-powerpc/mmu_context.h index 8c6b1a6d944f..083ac917bd29 100644 --- a/include/asm-powerpc/mmu_context.h +++ b/include/asm-powerpc/mmu_context.h | |||
@@ -25,8 +25,13 @@ static inline void enter_lazy_tlb(struct mm_struct *mm, | |||
25 | { | 25 | { |
26 | } | 26 | } |
27 | 27 | ||
28 | /* | ||
29 | * The proto-VSID space has 2^35 - 1 segments available for user mappings. | ||
30 | * Each segment contains 2^28 bytes. Each context maps 2^44 bytes, | ||
31 | * so we can support 2^19-1 contexts (19 == 35 + 28 - 44). | ||
32 | */ | ||
28 | #define NO_CONTEXT 0 | 33 | #define NO_CONTEXT 0 |
29 | #define MAX_CONTEXT (0x100000-1) | 34 | #define MAX_CONTEXT ((1UL << 19) - 1) |
30 | 35 | ||
31 | extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm); | 36 | extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm); |
32 | extern void destroy_context(struct mm_struct *mm); | 37 | extern void destroy_context(struct mm_struct *mm); |
diff --git a/include/asm-powerpc/mpc86xx.h b/include/asm-powerpc/mpc86xx.h index d0a6718d188b..f260382739fa 100644 --- a/include/asm-powerpc/mpc86xx.h +++ b/include/asm-powerpc/mpc86xx.h | |||
@@ -15,15 +15,10 @@ | |||
15 | #ifndef __ASM_POWERPC_MPC86xx_H__ | 15 | #ifndef __ASM_POWERPC_MPC86xx_H__ |
16 | #define __ASM_POWERPC_MPC86xx_H__ | 16 | #define __ASM_POWERPC_MPC86xx_H__ |
17 | 17 | ||
18 | #include <linux/config.h> | ||
19 | #include <asm/mmu.h> | 18 | #include <asm/mmu.h> |
20 | 19 | ||
21 | #ifdef CONFIG_PPC_86xx | 20 | #ifdef CONFIG_PPC_86xx |
22 | 21 | ||
23 | #ifdef CONFIG_MPC8641_HPCN | ||
24 | #include <platforms/86xx/mpc8641_hpcn.h> | ||
25 | #endif | ||
26 | |||
27 | #define _IO_BASE isa_io_base | 22 | #define _IO_BASE isa_io_base |
28 | #define _ISA_MEM_BASE isa_mem_base | 23 | #define _ISA_MEM_BASE isa_mem_base |
29 | #ifdef CONFIG_PCI | 24 | #ifdef CONFIG_PCI |
diff --git a/include/asm-powerpc/pci.h b/include/asm-powerpc/pci.h index 5d2c9e6c4be2..46afd29b904e 100644 --- a/include/asm-powerpc/pci.h +++ b/include/asm-powerpc/pci.h | |||
@@ -242,7 +242,7 @@ extern pgprot_t pci_phys_mem_access_prot(struct file *file, | |||
242 | #define HAVE_ARCH_PCI_RESOURCE_TO_USER | 242 | #define HAVE_ARCH_PCI_RESOURCE_TO_USER |
243 | extern void pci_resource_to_user(const struct pci_dev *dev, int bar, | 243 | extern void pci_resource_to_user(const struct pci_dev *dev, int bar, |
244 | const struct resource *rsrc, | 244 | const struct resource *rsrc, |
245 | u64 *start, u64 *end); | 245 | resource_size_t *start, resource_size_t *end); |
246 | #endif /* CONFIG_PPC_MULTIPLATFORM || CONFIG_PPC32 */ | 246 | #endif /* CONFIG_PPC_MULTIPLATFORM || CONFIG_PPC32 */ |
247 | 247 | ||
248 | #endif /* __KERNEL__ */ | 248 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-powerpc/rtas.h b/include/asm-powerpc/rtas.h index 02e213e3d69f..a33c6acffa61 100644 --- a/include/asm-powerpc/rtas.h +++ b/include/asm-powerpc/rtas.h | |||
@@ -181,6 +181,9 @@ extern int rtas_set_rtc_time(struct rtc_time *rtc_time); | |||
181 | extern unsigned int rtas_busy_delay_time(int status); | 181 | extern unsigned int rtas_busy_delay_time(int status); |
182 | extern unsigned int rtas_busy_delay(int status); | 182 | extern unsigned int rtas_busy_delay(int status); |
183 | 183 | ||
184 | extern int early_init_dt_scan_rtas(unsigned long node, | ||
185 | const char *uname, int depth, void *data); | ||
186 | |||
184 | extern void pSeries_log_error(char *buf, unsigned int err_type, int fatal); | 187 | extern void pSeries_log_error(char *buf, unsigned int err_type, int fatal); |
185 | 188 | ||
186 | /* Error types logged. */ | 189 | /* Error types logged. */ |
diff --git a/include/asm-powerpc/time.h b/include/asm-powerpc/time.h index 4463148c659f..dcde4410348d 100644 --- a/include/asm-powerpc/time.h +++ b/include/asm-powerpc/time.h | |||
@@ -18,8 +18,9 @@ | |||
18 | #include <linux/percpu.h> | 18 | #include <linux/percpu.h> |
19 | 19 | ||
20 | #include <asm/processor.h> | 20 | #include <asm/processor.h> |
21 | #ifdef CONFIG_PPC64 | 21 | #ifdef CONFIG_PPC_ISERIES |
22 | #include <asm/paca.h> | 22 | #include <asm/paca.h> |
23 | #include <asm/firmware.h> | ||
23 | #include <asm/iseries/hv_call.h> | 24 | #include <asm/iseries/hv_call.h> |
24 | #endif | 25 | #endif |
25 | 26 | ||
@@ -177,7 +178,8 @@ static inline void set_dec(int val) | |||
177 | #ifdef CONFIG_PPC_ISERIES | 178 | #ifdef CONFIG_PPC_ISERIES |
178 | int cur_dec; | 179 | int cur_dec; |
179 | 180 | ||
180 | if (get_lppaca()->shared_proc) { | 181 | if (firmware_has_feature(FW_FEATURE_ISERIES) && |
182 | get_lppaca()->shared_proc) { | ||
181 | get_lppaca()->virtual_decr = val; | 183 | get_lppaca()->virtual_decr = val; |
182 | cur_dec = get_dec(); | 184 | cur_dec = get_dec(); |
183 | if (cur_dec > val) | 185 | if (cur_dec > val) |
diff --git a/include/asm-powerpc/todc.h b/include/asm-powerpc/todc.h new file mode 100644 index 000000000000..60a8c39b8c11 --- /dev/null +++ b/include/asm-powerpc/todc.h | |||
@@ -0,0 +1,487 @@ | |||
1 | /* | ||
2 | * Definitions for the M48Txx and mc146818 series of Time of day/Real Time | ||
3 | * Clock chips. | ||
4 | * | ||
5 | * Author: Mark A. Greer <mgreer@mvista.com> | ||
6 | * | ||
7 | * 2001 (c) MontaVista, Software, Inc. This file is licensed under | ||
8 | * the terms of the GNU General Public License version 2. This program | ||
9 | * is licensed "as is" without any warranty of any kind, whether express | ||
10 | * or implied. | ||
11 | */ | ||
12 | |||
13 | /* | ||
14 | * Support for the M48T37/M48T59/.../mc146818 Real Time Clock chips. | ||
15 | * Purpose is to make one generic file that handles all of these chips instead | ||
16 | * of every platform implementing the same code over & over again. | ||
17 | */ | ||
18 | |||
19 | #ifndef __PPC_KERNEL_TODC_H | ||
20 | #define __PPC_KERNEL_TODC_H | ||
21 | |||
22 | typedef struct { | ||
23 | uint rtc_type; /* your particular chip */ | ||
24 | |||
25 | /* | ||
26 | * Following are the addresses of the AS0, AS1, and DATA registers | ||
27 | * of these chips. Note that these are board-specific. | ||
28 | */ | ||
29 | unsigned int nvram_as0; | ||
30 | unsigned int nvram_as1; | ||
31 | unsigned int nvram_data; | ||
32 | |||
33 | /* | ||
34 | * Define bits to stop external set of regs from changing so | ||
35 | * the chip can be read/written reliably. | ||
36 | */ | ||
37 | unsigned char enable_read; | ||
38 | unsigned char enable_write; | ||
39 | |||
40 | /* | ||
41 | * Following is the number of AS0 address bits. This is normally | ||
42 | * 8 but some bad hardware routes address lines incorrectly. | ||
43 | */ | ||
44 | int as0_bits; | ||
45 | |||
46 | int nvram_size; /* Size of NVRAM on chip */ | ||
47 | int sw_flags; /* Software control flags */ | ||
48 | |||
49 | /* Following are the register offsets for the particular chip */ | ||
50 | int year; | ||
51 | int month; | ||
52 | int day_of_month; | ||
53 | int day_of_week; | ||
54 | int hours; | ||
55 | int minutes; | ||
56 | int seconds; | ||
57 | int control_b; | ||
58 | int control_a; | ||
59 | int watchdog; | ||
60 | int interrupts; | ||
61 | int alarm_date; | ||
62 | int alarm_hour; | ||
63 | int alarm_minutes; | ||
64 | int alarm_seconds; | ||
65 | int century; | ||
66 | int flags; | ||
67 | |||
68 | /* | ||
69 | * Some RTC chips have their NVRAM buried behind a addr/data pair of | ||
70 | * regs on the first level/clock registers. The following fields | ||
71 | * are the addresses for those addr/data regs. | ||
72 | */ | ||
73 | int nvram_addr_reg; | ||
74 | int nvram_data_reg; | ||
75 | } todc_info_t; | ||
76 | |||
77 | /* | ||
78 | * Define the types of TODC/RTC variants that are supported in | ||
79 | * arch/ppc/kernel/todc_time.c | ||
80 | * Make a new one of these for any chip somehow differs from what's already | ||
81 | * defined. That way, if you ever need to put in code to touch those | ||
82 | * bits/registers in todc_time.c, you can put it inside an | ||
83 | * 'if (todc_info->rtc_type == TODC_TYPE_XXX)' so you won't break | ||
84 | * anyone else. | ||
85 | */ | ||
86 | #define TODC_TYPE_MK48T35 1 | ||
87 | #define TODC_TYPE_MK48T37 2 | ||
88 | #define TODC_TYPE_MK48T59 3 | ||
89 | #define TODC_TYPE_DS1693 4 /* Dallas DS1693 RTC */ | ||
90 | #define TODC_TYPE_DS1743 5 /* Dallas DS1743 RTC */ | ||
91 | #define TODC_TYPE_DS1746 6 /* Dallas DS1746 RTC */ | ||
92 | #define TODC_TYPE_DS1747 7 /* Dallas DS1747 RTC */ | ||
93 | #define TODC_TYPE_DS1501 8 /* Dallas DS1501 RTC */ | ||
94 | #define TODC_TYPE_DS1643 9 /* Dallas DS1643 RTC */ | ||
95 | #define TODC_TYPE_PC97307 10 /* PC97307 internal RTC */ | ||
96 | #define TODC_TYPE_DS1557 11 /* Dallas DS1557 RTC */ | ||
97 | #define TODC_TYPE_DS17285 12 /* Dallas DS17285 RTC */ | ||
98 | #define TODC_TYPE_DS1553 13 /* Dallas DS1553 RTC */ | ||
99 | #define TODC_TYPE_MC146818 100 /* Leave room for m48txx's */ | ||
100 | |||
101 | /* | ||
102 | * Bit to clear/set to enable reads/writes to the chip | ||
103 | */ | ||
104 | #define TODC_MK48TXX_CNTL_A_R 0x40 | ||
105 | #define TODC_MK48TXX_CNTL_A_W 0x80 | ||
106 | #define TODC_MK48TXX_DAY_CB 0x80 | ||
107 | |||
108 | #define TODC_DS1501_CNTL_B_TE 0x80 | ||
109 | |||
110 | /* | ||
111 | * Define flag bits used by todc routines. | ||
112 | */ | ||
113 | #define TODC_FLAG_2_LEVEL_NVRAM 0x00000001 | ||
114 | |||
115 | /* | ||
116 | * Define the values for the various RTC's that should to into the todc_info | ||
117 | * table. | ||
118 | * Note: The XXX_NVRAM_SIZE, XXX_NVRAM_ADDR_REG, and XXX_NVRAM_DATA_REG only | ||
119 | * matter if XXX_SW_FLAGS has TODC_FLAG_2_LEVEL_NVRAM set. | ||
120 | */ | ||
121 | #define TODC_TYPE_MK48T35_NVRAM_SIZE 0x7ff8 | ||
122 | #define TODC_TYPE_MK48T35_SW_FLAGS 0 | ||
123 | #define TODC_TYPE_MK48T35_YEAR 0x7fff | ||
124 | #define TODC_TYPE_MK48T35_MONTH 0x7ffe | ||
125 | #define TODC_TYPE_MK48T35_DOM 0x7ffd /* Day of Month */ | ||
126 | #define TODC_TYPE_MK48T35_DOW 0x7ffc /* Day of Week */ | ||
127 | #define TODC_TYPE_MK48T35_HOURS 0x7ffb | ||
128 | #define TODC_TYPE_MK48T35_MINUTES 0x7ffa | ||
129 | #define TODC_TYPE_MK48T35_SECONDS 0x7ff9 | ||
130 | #define TODC_TYPE_MK48T35_CNTL_B 0x7ff9 | ||
131 | #define TODC_TYPE_MK48T35_CNTL_A 0x7ff8 | ||
132 | #define TODC_TYPE_MK48T35_WATCHDOG 0x0000 | ||
133 | #define TODC_TYPE_MK48T35_INTERRUPTS 0x0000 | ||
134 | #define TODC_TYPE_MK48T35_ALARM_DATE 0x0000 | ||
135 | #define TODC_TYPE_MK48T35_ALARM_HOUR 0x0000 | ||
136 | #define TODC_TYPE_MK48T35_ALARM_MINUTES 0x0000 | ||
137 | #define TODC_TYPE_MK48T35_ALARM_SECONDS 0x0000 | ||
138 | #define TODC_TYPE_MK48T35_CENTURY 0x0000 | ||
139 | #define TODC_TYPE_MK48T35_FLAGS 0x0000 | ||
140 | #define TODC_TYPE_MK48T35_NVRAM_ADDR_REG 0 | ||
141 | #define TODC_TYPE_MK48T35_NVRAM_DATA_REG 0 | ||
142 | |||
143 | #define TODC_TYPE_MK48T37_NVRAM_SIZE 0x7ff0 | ||
144 | #define TODC_TYPE_MK48T37_SW_FLAGS 0 | ||
145 | #define TODC_TYPE_MK48T37_YEAR 0x7fff | ||
146 | #define TODC_TYPE_MK48T37_MONTH 0x7ffe | ||
147 | #define TODC_TYPE_MK48T37_DOM 0x7ffd /* Day of Month */ | ||
148 | #define TODC_TYPE_MK48T37_DOW 0x7ffc /* Day of Week */ | ||
149 | #define TODC_TYPE_MK48T37_HOURS 0x7ffb | ||
150 | #define TODC_TYPE_MK48T37_MINUTES 0x7ffa | ||
151 | #define TODC_TYPE_MK48T37_SECONDS 0x7ff9 | ||
152 | #define TODC_TYPE_MK48T37_CNTL_B 0x7ff9 | ||
153 | #define TODC_TYPE_MK48T37_CNTL_A 0x7ff8 | ||
154 | #define TODC_TYPE_MK48T37_WATCHDOG 0x7ff7 | ||
155 | #define TODC_TYPE_MK48T37_INTERRUPTS 0x7ff6 | ||
156 | #define TODC_TYPE_MK48T37_ALARM_DATE 0x7ff5 | ||
157 | #define TODC_TYPE_MK48T37_ALARM_HOUR 0x7ff4 | ||
158 | #define TODC_TYPE_MK48T37_ALARM_MINUTES 0x7ff3 | ||
159 | #define TODC_TYPE_MK48T37_ALARM_SECONDS 0x7ff2 | ||
160 | #define TODC_TYPE_MK48T37_CENTURY 0x7ff1 | ||
161 | #define TODC_TYPE_MK48T37_FLAGS 0x7ff0 | ||
162 | #define TODC_TYPE_MK48T37_NVRAM_ADDR_REG 0 | ||
163 | #define TODC_TYPE_MK48T37_NVRAM_DATA_REG 0 | ||
164 | |||
165 | #define TODC_TYPE_MK48T59_NVRAM_SIZE 0x1ff0 | ||
166 | #define TODC_TYPE_MK48T59_SW_FLAGS 0 | ||
167 | #define TODC_TYPE_MK48T59_YEAR 0x1fff | ||
168 | #define TODC_TYPE_MK48T59_MONTH 0x1ffe | ||
169 | #define TODC_TYPE_MK48T59_DOM 0x1ffd /* Day of Month */ | ||
170 | #define TODC_TYPE_MK48T59_DOW 0x1ffc /* Day of Week */ | ||
171 | #define TODC_TYPE_MK48T59_HOURS 0x1ffb | ||
172 | #define TODC_TYPE_MK48T59_MINUTES 0x1ffa | ||
173 | #define TODC_TYPE_MK48T59_SECONDS 0x1ff9 | ||
174 | #define TODC_TYPE_MK48T59_CNTL_B 0x1ff9 | ||
175 | #define TODC_TYPE_MK48T59_CNTL_A 0x1ff8 | ||
176 | #define TODC_TYPE_MK48T59_WATCHDOG 0x1fff | ||
177 | #define TODC_TYPE_MK48T59_INTERRUPTS 0x1fff | ||
178 | #define TODC_TYPE_MK48T59_ALARM_DATE 0x1fff | ||
179 | #define TODC_TYPE_MK48T59_ALARM_HOUR 0x1fff | ||
180 | #define TODC_TYPE_MK48T59_ALARM_MINUTES 0x1fff | ||
181 | #define TODC_TYPE_MK48T59_ALARM_SECONDS 0x1fff | ||
182 | #define TODC_TYPE_MK48T59_CENTURY 0x1fff | ||
183 | #define TODC_TYPE_MK48T59_FLAGS 0x1fff | ||
184 | #define TODC_TYPE_MK48T59_NVRAM_ADDR_REG 0 | ||
185 | #define TODC_TYPE_MK48T59_NVRAM_DATA_REG 0 | ||
186 | |||
187 | #define TODC_TYPE_DS1501_NVRAM_SIZE 0x100 | ||
188 | #define TODC_TYPE_DS1501_SW_FLAGS TODC_FLAG_2_LEVEL_NVRAM | ||
189 | #define TODC_TYPE_DS1501_YEAR (TODC_TYPE_DS1501_NVRAM_SIZE + 0x06) | ||
190 | #define TODC_TYPE_DS1501_MONTH (TODC_TYPE_DS1501_NVRAM_SIZE + 0x05) | ||
191 | #define TODC_TYPE_DS1501_DOM (TODC_TYPE_DS1501_NVRAM_SIZE + 0x04) | ||
192 | #define TODC_TYPE_DS1501_DOW (TODC_TYPE_DS1501_NVRAM_SIZE + 0x03) | ||
193 | #define TODC_TYPE_DS1501_HOURS (TODC_TYPE_DS1501_NVRAM_SIZE + 0x02) | ||
194 | #define TODC_TYPE_DS1501_MINUTES (TODC_TYPE_DS1501_NVRAM_SIZE + 0x01) | ||
195 | #define TODC_TYPE_DS1501_SECONDS (TODC_TYPE_DS1501_NVRAM_SIZE + 0x00) | ||
196 | #define TODC_TYPE_DS1501_CNTL_B (TODC_TYPE_DS1501_NVRAM_SIZE + 0x0f) | ||
197 | #define TODC_TYPE_DS1501_CNTL_A (TODC_TYPE_DS1501_NVRAM_SIZE + 0x0f) | ||
198 | #define TODC_TYPE_DS1501_WATCHDOG (TODC_TYPE_DS1501_NVRAM_SIZE + 0xff) | ||
199 | #define TODC_TYPE_DS1501_INTERRUPTS (TODC_TYPE_DS1501_NVRAM_SIZE + 0xff) | ||
200 | #define TODC_TYPE_DS1501_ALARM_DATE (TODC_TYPE_DS1501_NVRAM_SIZE + 0x0b) | ||
201 | #define TODC_TYPE_DS1501_ALARM_HOUR (TODC_TYPE_DS1501_NVRAM_SIZE + 0x0a) | ||
202 | #define TODC_TYPE_DS1501_ALARM_MINUTES (TODC_TYPE_DS1501_NVRAM_SIZE + 0x09) | ||
203 | #define TODC_TYPE_DS1501_ALARM_SECONDS (TODC_TYPE_DS1501_NVRAM_SIZE + 0x08) | ||
204 | #define TODC_TYPE_DS1501_CENTURY (TODC_TYPE_DS1501_NVRAM_SIZE + 0x07) | ||
205 | #define TODC_TYPE_DS1501_FLAGS (TODC_TYPE_DS1501_NVRAM_SIZE + 0xff) | ||
206 | #define TODC_TYPE_DS1501_NVRAM_ADDR_REG 0x10 | ||
207 | #define TODC_TYPE_DS1501_NVRAM_DATA_REG 0x13 | ||
208 | |||
209 | #define TODC_TYPE_DS1553_NVRAM_SIZE 0x1ff0 | ||
210 | #define TODC_TYPE_DS1553_SW_FLAGS 0 | ||
211 | #define TODC_TYPE_DS1553_YEAR 0x1fff | ||
212 | #define TODC_TYPE_DS1553_MONTH 0x1ffe | ||
213 | #define TODC_TYPE_DS1553_DOM 0x1ffd /* Day of Month */ | ||
214 | #define TODC_TYPE_DS1553_DOW 0x1ffc /* Day of Week */ | ||
215 | #define TODC_TYPE_DS1553_HOURS 0x1ffb | ||
216 | #define TODC_TYPE_DS1553_MINUTES 0x1ffa | ||
217 | #define TODC_TYPE_DS1553_SECONDS 0x1ff9 | ||
218 | #define TODC_TYPE_DS1553_CNTL_B 0x1ff9 | ||
219 | #define TODC_TYPE_DS1553_CNTL_A 0x1ff8 /* control_a R/W regs */ | ||
220 | #define TODC_TYPE_DS1553_WATCHDOG 0x1ff7 | ||
221 | #define TODC_TYPE_DS1553_INTERRUPTS 0x1ff6 | ||
222 | #define TODC_TYPE_DS1553_ALARM_DATE 0x1ff5 | ||
223 | #define TODC_TYPE_DS1553_ALARM_HOUR 0x1ff4 | ||
224 | #define TODC_TYPE_DS1553_ALARM_MINUTES 0x1ff3 | ||
225 | #define TODC_TYPE_DS1553_ALARM_SECONDS 0x1ff2 | ||
226 | #define TODC_TYPE_DS1553_CENTURY 0x1ff8 | ||
227 | #define TODC_TYPE_DS1553_FLAGS 0x1ff0 | ||
228 | #define TODC_TYPE_DS1553_NVRAM_ADDR_REG 0 | ||
229 | #define TODC_TYPE_DS1553_NVRAM_DATA_REG 0 | ||
230 | |||
231 | #define TODC_TYPE_DS1557_NVRAM_SIZE 0x7fff0 | ||
232 | #define TODC_TYPE_DS1557_SW_FLAGS 0 | ||
233 | #define TODC_TYPE_DS1557_YEAR 0x7ffff | ||
234 | #define TODC_TYPE_DS1557_MONTH 0x7fffe | ||
235 | #define TODC_TYPE_DS1557_DOM 0x7fffd /* Day of Month */ | ||
236 | #define TODC_TYPE_DS1557_DOW 0x7fffc /* Day of Week */ | ||
237 | #define TODC_TYPE_DS1557_HOURS 0x7fffb | ||
238 | #define TODC_TYPE_DS1557_MINUTES 0x7fffa | ||
239 | #define TODC_TYPE_DS1557_SECONDS 0x7fff9 | ||
240 | #define TODC_TYPE_DS1557_CNTL_B 0x7fff9 | ||
241 | #define TODC_TYPE_DS1557_CNTL_A 0x7fff8 /* control_a R/W regs */ | ||
242 | #define TODC_TYPE_DS1557_WATCHDOG 0x7fff7 | ||
243 | #define TODC_TYPE_DS1557_INTERRUPTS 0x7fff6 | ||
244 | #define TODC_TYPE_DS1557_ALARM_DATE 0x7fff5 | ||
245 | #define TODC_TYPE_DS1557_ALARM_HOUR 0x7fff4 | ||
246 | #define TODC_TYPE_DS1557_ALARM_MINUTES 0x7fff3 | ||
247 | #define TODC_TYPE_DS1557_ALARM_SECONDS 0x7fff2 | ||
248 | #define TODC_TYPE_DS1557_CENTURY 0x7fff8 | ||
249 | #define TODC_TYPE_DS1557_FLAGS 0x7fff0 | ||
250 | #define TODC_TYPE_DS1557_NVRAM_ADDR_REG 0 | ||
251 | #define TODC_TYPE_DS1557_NVRAM_DATA_REG 0 | ||
252 | |||
253 | #define TODC_TYPE_DS1643_NVRAM_SIZE 0x1ff8 | ||
254 | #define TODC_TYPE_DS1643_SW_FLAGS 0 | ||
255 | #define TODC_TYPE_DS1643_YEAR 0x1fff | ||
256 | #define TODC_TYPE_DS1643_MONTH 0x1ffe | ||
257 | #define TODC_TYPE_DS1643_DOM 0x1ffd /* Day of Month */ | ||
258 | #define TODC_TYPE_DS1643_DOW 0x1ffc /* Day of Week */ | ||
259 | #define TODC_TYPE_DS1643_HOURS 0x1ffb | ||
260 | #define TODC_TYPE_DS1643_MINUTES 0x1ffa | ||
261 | #define TODC_TYPE_DS1643_SECONDS 0x1ff9 | ||
262 | #define TODC_TYPE_DS1643_CNTL_B 0x1ff9 | ||
263 | #define TODC_TYPE_DS1643_CNTL_A 0x1ff8 /* control_a R/W regs */ | ||
264 | #define TODC_TYPE_DS1643_WATCHDOG 0x1fff | ||
265 | #define TODC_TYPE_DS1643_INTERRUPTS 0x1fff | ||
266 | #define TODC_TYPE_DS1643_ALARM_DATE 0x1fff | ||
267 | #define TODC_TYPE_DS1643_ALARM_HOUR 0x1fff | ||
268 | #define TODC_TYPE_DS1643_ALARM_MINUTES 0x1fff | ||
269 | #define TODC_TYPE_DS1643_ALARM_SECONDS 0x1fff | ||
270 | #define TODC_TYPE_DS1643_CENTURY 0x1ff8 | ||
271 | #define TODC_TYPE_DS1643_FLAGS 0x1fff | ||
272 | #define TODC_TYPE_DS1643_NVRAM_ADDR_REG 0 | ||
273 | #define TODC_TYPE_DS1643_NVRAM_DATA_REG 0 | ||
274 | |||
275 | #define TODC_TYPE_DS1693_NVRAM_SIZE 0 /* Not handled yet */ | ||
276 | #define TODC_TYPE_DS1693_SW_FLAGS 0 | ||
277 | #define TODC_TYPE_DS1693_YEAR 0x09 | ||
278 | #define TODC_TYPE_DS1693_MONTH 0x08 | ||
279 | #define TODC_TYPE_DS1693_DOM 0x07 /* Day of Month */ | ||
280 | #define TODC_TYPE_DS1693_DOW 0x06 /* Day of Week */ | ||
281 | #define TODC_TYPE_DS1693_HOURS 0x04 | ||
282 | #define TODC_TYPE_DS1693_MINUTES 0x02 | ||
283 | #define TODC_TYPE_DS1693_SECONDS 0x00 | ||
284 | #define TODC_TYPE_DS1693_CNTL_B 0x0b | ||
285 | #define TODC_TYPE_DS1693_CNTL_A 0x0a | ||
286 | #define TODC_TYPE_DS1693_WATCHDOG 0xff | ||
287 | #define TODC_TYPE_DS1693_INTERRUPTS 0xff | ||
288 | #define TODC_TYPE_DS1693_ALARM_DATE 0x49 | ||
289 | #define TODC_TYPE_DS1693_ALARM_HOUR 0x05 | ||
290 | #define TODC_TYPE_DS1693_ALARM_MINUTES 0x03 | ||
291 | #define TODC_TYPE_DS1693_ALARM_SECONDS 0x01 | ||
292 | #define TODC_TYPE_DS1693_CENTURY 0x48 | ||
293 | #define TODC_TYPE_DS1693_FLAGS 0xff | ||
294 | #define TODC_TYPE_DS1693_NVRAM_ADDR_REG 0 | ||
295 | #define TODC_TYPE_DS1693_NVRAM_DATA_REG 0 | ||
296 | |||
297 | #define TODC_TYPE_DS1743_NVRAM_SIZE 0x1ff8 | ||
298 | #define TODC_TYPE_DS1743_SW_FLAGS 0 | ||
299 | #define TODC_TYPE_DS1743_YEAR 0x1fff | ||
300 | #define TODC_TYPE_DS1743_MONTH 0x1ffe | ||
301 | #define TODC_TYPE_DS1743_DOM 0x1ffd /* Day of Month */ | ||
302 | #define TODC_TYPE_DS1743_DOW 0x1ffc /* Day of Week */ | ||
303 | #define TODC_TYPE_DS1743_HOURS 0x1ffb | ||
304 | #define TODC_TYPE_DS1743_MINUTES 0x1ffa | ||
305 | #define TODC_TYPE_DS1743_SECONDS 0x1ff9 | ||
306 | #define TODC_TYPE_DS1743_CNTL_B 0x1ff9 | ||
307 | #define TODC_TYPE_DS1743_CNTL_A 0x1ff8 /* control_a R/W regs */ | ||
308 | #define TODC_TYPE_DS1743_WATCHDOG 0x1fff | ||
309 | #define TODC_TYPE_DS1743_INTERRUPTS 0x1fff | ||
310 | #define TODC_TYPE_DS1743_ALARM_DATE 0x1fff | ||
311 | #define TODC_TYPE_DS1743_ALARM_HOUR 0x1fff | ||
312 | #define TODC_TYPE_DS1743_ALARM_MINUTES 0x1fff | ||
313 | #define TODC_TYPE_DS1743_ALARM_SECONDS 0x1fff | ||
314 | #define TODC_TYPE_DS1743_CENTURY 0x1ff8 | ||
315 | #define TODC_TYPE_DS1743_FLAGS 0x1fff | ||
316 | #define TODC_TYPE_DS1743_NVRAM_ADDR_REG 0 | ||
317 | #define TODC_TYPE_DS1743_NVRAM_DATA_REG 0 | ||
318 | |||
319 | #define TODC_TYPE_DS1746_NVRAM_SIZE 0x1fff8 | ||
320 | #define TODC_TYPE_DS1746_SW_FLAGS 0 | ||
321 | #define TODC_TYPE_DS1746_YEAR 0x1ffff | ||
322 | #define TODC_TYPE_DS1746_MONTH 0x1fffe | ||
323 | #define TODC_TYPE_DS1746_DOM 0x1fffd /* Day of Month */ | ||
324 | #define TODC_TYPE_DS1746_DOW 0x1fffc /* Day of Week */ | ||
325 | #define TODC_TYPE_DS1746_HOURS 0x1fffb | ||
326 | #define TODC_TYPE_DS1746_MINUTES 0x1fffa | ||
327 | #define TODC_TYPE_DS1746_SECONDS 0x1fff9 | ||
328 | #define TODC_TYPE_DS1746_CNTL_B 0x1fff9 | ||
329 | #define TODC_TYPE_DS1746_CNTL_A 0x1fff8 /* control_a R/W regs */ | ||
330 | #define TODC_TYPE_DS1746_WATCHDOG 0x00000 | ||
331 | #define TODC_TYPE_DS1746_INTERRUPTS 0x00000 | ||
332 | #define TODC_TYPE_DS1746_ALARM_DATE 0x00000 | ||
333 | #define TODC_TYPE_DS1746_ALARM_HOUR 0x00000 | ||
334 | #define TODC_TYPE_DS1746_ALARM_MINUTES 0x00000 | ||
335 | #define TODC_TYPE_DS1746_ALARM_SECONDS 0x00000 | ||
336 | #define TODC_TYPE_DS1746_CENTURY 0x00000 | ||
337 | #define TODC_TYPE_DS1746_FLAGS 0x00000 | ||
338 | #define TODC_TYPE_DS1746_NVRAM_ADDR_REG 0 | ||
339 | #define TODC_TYPE_DS1746_NVRAM_DATA_REG 0 | ||
340 | |||
341 | #define TODC_TYPE_DS1747_NVRAM_SIZE 0x7fff8 | ||
342 | #define TODC_TYPE_DS1747_SW_FLAGS 0 | ||
343 | #define TODC_TYPE_DS1747_YEAR 0x7ffff | ||
344 | #define TODC_TYPE_DS1747_MONTH 0x7fffe | ||
345 | #define TODC_TYPE_DS1747_DOM 0x7fffd /* Day of Month */ | ||
346 | #define TODC_TYPE_DS1747_DOW 0x7fffc /* Day of Week */ | ||
347 | #define TODC_TYPE_DS1747_HOURS 0x7fffb | ||
348 | #define TODC_TYPE_DS1747_MINUTES 0x7fffa | ||
349 | #define TODC_TYPE_DS1747_SECONDS 0x7fff9 | ||
350 | #define TODC_TYPE_DS1747_CNTL_B 0x7fff9 | ||
351 | #define TODC_TYPE_DS1747_CNTL_A 0x7fff8 /* control_a R/W regs */ | ||
352 | #define TODC_TYPE_DS1747_WATCHDOG 0x00000 | ||
353 | #define TODC_TYPE_DS1747_INTERRUPTS 0x00000 | ||
354 | #define TODC_TYPE_DS1747_ALARM_DATE 0x00000 | ||
355 | #define TODC_TYPE_DS1747_ALARM_HOUR 0x00000 | ||
356 | #define TODC_TYPE_DS1747_ALARM_MINUTES 0x00000 | ||
357 | #define TODC_TYPE_DS1747_ALARM_SECONDS 0x00000 | ||
358 | #define TODC_TYPE_DS1747_CENTURY 0x00000 | ||
359 | #define TODC_TYPE_DS1747_FLAGS 0x00000 | ||
360 | #define TODC_TYPE_DS1747_NVRAM_ADDR_REG 0 | ||
361 | #define TODC_TYPE_DS1747_NVRAM_DATA_REG 0 | ||
362 | |||
363 | #define TODC_TYPE_DS17285_NVRAM_SIZE (0x1000-0x80) /* 4Kx8 NVRAM (minus RTC regs) */ | ||
364 | #define TODC_TYPE_DS17285_SW_FLAGS TODC_FLAG_2_LEVEL_NVRAM | ||
365 | #define TODC_TYPE_DS17285_SECONDS (TODC_TYPE_DS17285_NVRAM_SIZE + 0x00) | ||
366 | #define TODC_TYPE_DS17285_ALARM_SECONDS (TODC_TYPE_DS17285_NVRAM_SIZE + 0x01) | ||
367 | #define TODC_TYPE_DS17285_MINUTES (TODC_TYPE_DS17285_NVRAM_SIZE + 0x02) | ||
368 | #define TODC_TYPE_DS17285_ALARM_MINUTES (TODC_TYPE_DS17285_NVRAM_SIZE + 0x03) | ||
369 | #define TODC_TYPE_DS17285_HOURS (TODC_TYPE_DS17285_NVRAM_SIZE + 0x04) | ||
370 | #define TODC_TYPE_DS17285_ALARM_HOUR (TODC_TYPE_DS17285_NVRAM_SIZE + 0x05) | ||
371 | #define TODC_TYPE_DS17285_DOW (TODC_TYPE_DS17285_NVRAM_SIZE + 0x06) | ||
372 | #define TODC_TYPE_DS17285_DOM (TODC_TYPE_DS17285_NVRAM_SIZE + 0x07) | ||
373 | #define TODC_TYPE_DS17285_MONTH (TODC_TYPE_DS17285_NVRAM_SIZE + 0x08) | ||
374 | #define TODC_TYPE_DS17285_YEAR (TODC_TYPE_DS17285_NVRAM_SIZE + 0x09) | ||
375 | #define TODC_TYPE_DS17285_CNTL_A (TODC_TYPE_DS17285_NVRAM_SIZE + 0x0A) | ||
376 | #define TODC_TYPE_DS17285_CNTL_B (TODC_TYPE_DS17285_NVRAM_SIZE + 0x0B) | ||
377 | #define TODC_TYPE_DS17285_CNTL_C (TODC_TYPE_DS17285_NVRAM_SIZE + 0x0C) | ||
378 | #define TODC_TYPE_DS17285_CNTL_D (TODC_TYPE_DS17285_NVRAM_SIZE + 0x0D) | ||
379 | #define TODC_TYPE_DS17285_WATCHDOG 0 | ||
380 | #define TODC_TYPE_DS17285_INTERRUPTS 0 | ||
381 | #define TODC_TYPE_DS17285_ALARM_DATE 0 | ||
382 | #define TODC_TYPE_DS17285_CENTURY 0 | ||
383 | #define TODC_TYPE_DS17285_FLAGS 0 | ||
384 | #define TODC_TYPE_DS17285_NVRAM_ADDR_REG 0x50 | ||
385 | #define TODC_TYPE_DS17285_NVRAM_DATA_REG 0x53 | ||
386 | |||
387 | #define TODC_TYPE_MC146818_NVRAM_SIZE 0 /* XXXX */ | ||
388 | #define TODC_TYPE_MC146818_SW_FLAGS 0 | ||
389 | #define TODC_TYPE_MC146818_YEAR 0x09 | ||
390 | #define TODC_TYPE_MC146818_MONTH 0x08 | ||
391 | #define TODC_TYPE_MC146818_DOM 0x07 /* Day of Month */ | ||
392 | #define TODC_TYPE_MC146818_DOW 0x06 /* Day of Week */ | ||
393 | #define TODC_TYPE_MC146818_HOURS 0x04 | ||
394 | #define TODC_TYPE_MC146818_MINUTES 0x02 | ||
395 | #define TODC_TYPE_MC146818_SECONDS 0x00 | ||
396 | #define TODC_TYPE_MC146818_CNTL_B 0x0a | ||
397 | #define TODC_TYPE_MC146818_CNTL_A 0x0b /* control_a R/W regs */ | ||
398 | #define TODC_TYPE_MC146818_WATCHDOG 0 | ||
399 | #define TODC_TYPE_MC146818_INTERRUPTS 0x0c | ||
400 | #define TODC_TYPE_MC146818_ALARM_DATE 0xff | ||
401 | #define TODC_TYPE_MC146818_ALARM_HOUR 0x05 | ||
402 | #define TODC_TYPE_MC146818_ALARM_MINUTES 0x03 | ||
403 | #define TODC_TYPE_MC146818_ALARM_SECONDS 0x01 | ||
404 | #define TODC_TYPE_MC146818_CENTURY 0xff | ||
405 | #define TODC_TYPE_MC146818_FLAGS 0xff | ||
406 | #define TODC_TYPE_MC146818_NVRAM_ADDR_REG 0 | ||
407 | #define TODC_TYPE_MC146818_NVRAM_DATA_REG 0 | ||
408 | |||
409 | #define TODC_TYPE_PC97307_NVRAM_SIZE 0 /* No NVRAM? */ | ||
410 | #define TODC_TYPE_PC97307_SW_FLAGS 0 | ||
411 | #define TODC_TYPE_PC97307_YEAR 0x09 | ||
412 | #define TODC_TYPE_PC97307_MONTH 0x08 | ||
413 | #define TODC_TYPE_PC97307_DOM 0x07 /* Day of Month */ | ||
414 | #define TODC_TYPE_PC97307_DOW 0x06 /* Day of Week */ | ||
415 | #define TODC_TYPE_PC97307_HOURS 0x04 | ||
416 | #define TODC_TYPE_PC97307_MINUTES 0x02 | ||
417 | #define TODC_TYPE_PC97307_SECONDS 0x00 | ||
418 | #define TODC_TYPE_PC97307_CNTL_B 0x0a | ||
419 | #define TODC_TYPE_PC97307_CNTL_A 0x0b /* control_a R/W regs */ | ||
420 | #define TODC_TYPE_PC97307_WATCHDOG 0x0c | ||
421 | #define TODC_TYPE_PC97307_INTERRUPTS 0x0d | ||
422 | #define TODC_TYPE_PC97307_ALARM_DATE 0xff | ||
423 | #define TODC_TYPE_PC97307_ALARM_HOUR 0x05 | ||
424 | #define TODC_TYPE_PC97307_ALARM_MINUTES 0x03 | ||
425 | #define TODC_TYPE_PC97307_ALARM_SECONDS 0x01 | ||
426 | #define TODC_TYPE_PC97307_CENTURY 0xff | ||
427 | #define TODC_TYPE_PC97307_FLAGS 0xff | ||
428 | #define TODC_TYPE_PC97307_NVRAM_ADDR_REG 0 | ||
429 | #define TODC_TYPE_PC97307_NVRAM_DATA_REG 0 | ||
430 | |||
431 | /* | ||
432 | * Define macros to allocate and init the todc_info_t table that will | ||
433 | * be used by the todc_time.c routines. | ||
434 | */ | ||
435 | #define TODC_ALLOC() \ | ||
436 | static todc_info_t todc_info_alloc; \ | ||
437 | todc_info_t *todc_info = &todc_info_alloc; | ||
438 | |||
439 | #define TODC_INIT(clock_type, as0, as1, data, bits) { \ | ||
440 | todc_info->rtc_type = clock_type; \ | ||
441 | \ | ||
442 | todc_info->nvram_as0 = (unsigned int)(as0); \ | ||
443 | todc_info->nvram_as1 = (unsigned int)(as1); \ | ||
444 | todc_info->nvram_data = (unsigned int)(data); \ | ||
445 | \ | ||
446 | todc_info->as0_bits = (bits); \ | ||
447 | \ | ||
448 | todc_info->nvram_size = clock_type ##_NVRAM_SIZE; \ | ||
449 | todc_info->sw_flags = clock_type ##_SW_FLAGS; \ | ||
450 | \ | ||
451 | todc_info->year = clock_type ##_YEAR; \ | ||
452 | todc_info->month = clock_type ##_MONTH; \ | ||
453 | todc_info->day_of_month = clock_type ##_DOM; \ | ||
454 | todc_info->day_of_week = clock_type ##_DOW; \ | ||
455 | todc_info->hours = clock_type ##_HOURS; \ | ||
456 | todc_info->minutes = clock_type ##_MINUTES; \ | ||
457 | todc_info->seconds = clock_type ##_SECONDS; \ | ||
458 | todc_info->control_b = clock_type ##_CNTL_B; \ | ||
459 | todc_info->control_a = clock_type ##_CNTL_A; \ | ||
460 | todc_info->watchdog = clock_type ##_WATCHDOG; \ | ||
461 | todc_info->interrupts = clock_type ##_INTERRUPTS; \ | ||
462 | todc_info->alarm_date = clock_type ##_ALARM_DATE; \ | ||
463 | todc_info->alarm_hour = clock_type ##_ALARM_HOUR; \ | ||
464 | todc_info->alarm_minutes = clock_type ##_ALARM_MINUTES; \ | ||
465 | todc_info->alarm_seconds = clock_type ##_ALARM_SECONDS; \ | ||
466 | todc_info->century = clock_type ##_CENTURY; \ | ||
467 | todc_info->flags = clock_type ##_FLAGS; \ | ||
468 | \ | ||
469 | todc_info->nvram_addr_reg = clock_type ##_NVRAM_ADDR_REG; \ | ||
470 | todc_info->nvram_data_reg = clock_type ##_NVRAM_DATA_REG; \ | ||
471 | } | ||
472 | |||
473 | extern todc_info_t *todc_info; | ||
474 | |||
475 | unsigned char todc_direct_read_val(int addr); | ||
476 | void todc_direct_write_val(int addr, unsigned char val); | ||
477 | unsigned char todc_m48txx_read_val(int addr); | ||
478 | void todc_m48txx_write_val(int addr, unsigned char val); | ||
479 | unsigned char todc_mc146818_read_val(int addr); | ||
480 | void todc_mc146818_write_val(int addr, unsigned char val); | ||
481 | |||
482 | long todc_time_init(void); | ||
483 | void todc_get_rtc_time(struct rtc_time *); | ||
484 | int todc_set_rtc_time(struct rtc_time *); | ||
485 | void todc_calibrate_decr(void); | ||
486 | |||
487 | #endif /* __PPC_KERNEL_TODC_H */ | ||
diff --git a/include/asm-powerpc/tsi108.h b/include/asm-powerpc/tsi108.h new file mode 100644 index 000000000000..c4c278d72f71 --- /dev/null +++ b/include/asm-powerpc/tsi108.h | |||
@@ -0,0 +1,109 @@ | |||
1 | /* | ||
2 | * include/asm-ppc/tsi108.h | ||
3 | * | ||
4 | * common routine and memory layout for Tundra TSI108(Grendel) host bridge | ||
5 | * memory controller. | ||
6 | * | ||
7 | * Author: Jacob Pan (jacob.pan@freescale.com) | ||
8 | * Alex Bounine (alexandreb@tundra.com) | ||
9 | * 2004 (c) Freescale Semiconductor Inc. This file is licensed under | ||
10 | * the terms of the GNU General Public License version 2. This program | ||
11 | * is licensed "as is" without any warranty of any kind, whether express | ||
12 | * or implied. | ||
13 | */ | ||
14 | #ifndef __PPC_KERNEL_TSI108_H | ||
15 | #define __PPC_KERNEL_TSI108_H | ||
16 | |||
17 | #include <asm/pci-bridge.h> | ||
18 | |||
19 | /* Size of entire register space */ | ||
20 | #define TSI108_REG_SIZE (0x10000) | ||
21 | |||
22 | /* Sizes of register spaces for individual blocks */ | ||
23 | #define TSI108_HLP_SIZE 0x1000 | ||
24 | #define TSI108_PCI_SIZE 0x1000 | ||
25 | #define TSI108_CLK_SIZE 0x1000 | ||
26 | #define TSI108_PB_SIZE 0x1000 | ||
27 | #define TSI108_SD_SIZE 0x1000 | ||
28 | #define TSI108_DMA_SIZE 0x1000 | ||
29 | #define TSI108_ETH_SIZE 0x1000 | ||
30 | #define TSI108_I2C_SIZE 0x400 | ||
31 | #define TSI108_MPIC_SIZE 0x400 | ||
32 | #define TSI108_UART0_SIZE 0x200 | ||
33 | #define TSI108_GPIO_SIZE 0x200 | ||
34 | #define TSI108_UART1_SIZE 0x200 | ||
35 | |||
36 | /* Offsets within Tsi108(A) CSR space for individual blocks */ | ||
37 | #define TSI108_HLP_OFFSET 0x0000 | ||
38 | #define TSI108_PCI_OFFSET 0x1000 | ||
39 | #define TSI108_CLK_OFFSET 0x2000 | ||
40 | #define TSI108_PB_OFFSET 0x3000 | ||
41 | #define TSI108_SD_OFFSET 0x4000 | ||
42 | #define TSI108_DMA_OFFSET 0x5000 | ||
43 | #define TSI108_ETH_OFFSET 0x6000 | ||
44 | #define TSI108_I2C_OFFSET 0x7000 | ||
45 | #define TSI108_MPIC_OFFSET 0x7400 | ||
46 | #define TSI108_UART0_OFFSET 0x7800 | ||
47 | #define TSI108_GPIO_OFFSET 0x7A00 | ||
48 | #define TSI108_UART1_OFFSET 0x7C00 | ||
49 | |||
50 | /* Tsi108 registers used by common code components */ | ||
51 | #define TSI108_PCI_CSR (0x004) | ||
52 | #define TSI108_PCI_IRP_CFG_CTL (0x180) | ||
53 | #define TSI108_PCI_IRP_STAT (0x184) | ||
54 | #define TSI108_PCI_IRP_ENABLE (0x188) | ||
55 | #define TSI108_PCI_IRP_INTAD (0x18C) | ||
56 | |||
57 | #define TSI108_PCI_IRP_STAT_P_INT (0x00400000) | ||
58 | #define TSI108_PCI_IRP_ENABLE_P_INT (0x00400000) | ||
59 | |||
60 | #define TSI108_CG_PWRUP_STATUS (0x234) | ||
61 | |||
62 | #define TSI108_PB_ISR (0x00C) | ||
63 | #define TSI108_PB_ERRCS (0x404) | ||
64 | #define TSI108_PB_AERR (0x408) | ||
65 | |||
66 | #define TSI108_PB_ERRCS_ES (1 << 1) | ||
67 | #define TSI108_PB_ISR_PBS_RD_ERR (1 << 8) | ||
68 | |||
69 | #define TSI108_PCI_CFG_BASE_PHYS (0xfb000000) | ||
70 | #define TSI108_PCI_CFG_SIZE (0x01000000) | ||
71 | /* Global variables */ | ||
72 | |||
73 | extern u32 tsi108_pci_cfg_base; | ||
74 | /* Exported functions */ | ||
75 | |||
76 | extern int tsi108_bridge_init(struct pci_controller *hose, uint phys_csr_base); | ||
77 | extern unsigned long tsi108_get_mem_size(void); | ||
78 | extern unsigned long tsi108_get_cpu_clk(void); | ||
79 | extern unsigned long tsi108_get_sdc_clk(void); | ||
80 | extern int tsi108_direct_write_config(struct pci_bus *bus, unsigned int devfn, | ||
81 | int offset, int len, u32 val); | ||
82 | extern int tsi108_direct_read_config(struct pci_bus *bus, unsigned int devfn, | ||
83 | int offset, int len, u32 * val); | ||
84 | extern void tsi108_clear_pci_error(u32 pci_cfg_base); | ||
85 | |||
86 | extern phys_addr_t get_csrbase(void); | ||
87 | |||
88 | typedef struct { | ||
89 | u32 regs; /* hw registers base address */ | ||
90 | u32 phyregs; /* phy registers base address */ | ||
91 | u16 phy; /* phy address */ | ||
92 | u16 irq_num; /* irq number */ | ||
93 | u8 mac_addr[6]; /* phy mac address */ | ||
94 | } hw_info; | ||
95 | |||
96 | extern u32 get_vir_csrbase(void); | ||
97 | extern u32 tsi108_csr_vir_base; | ||
98 | |||
99 | extern inline u32 tsi108_read_reg(u32 reg_offset) | ||
100 | { | ||
101 | return in_be32((volatile u32 *)(tsi108_csr_vir_base + reg_offset)); | ||
102 | } | ||
103 | |||
104 | extern inline void tsi108_write_reg(u32 reg_offset, u32 val) | ||
105 | { | ||
106 | out_be32((volatile u32 *)(tsi108_csr_vir_base + reg_offset), val); | ||
107 | } | ||
108 | |||
109 | #endif /* __PPC_KERNEL_TSI108_H */ | ||
diff --git a/include/asm-powerpc/udbg.h b/include/asm-powerpc/udbg.h index 19a1517ac43b..55e57844fa78 100644 --- a/include/asm-powerpc/udbg.h +++ b/include/asm-powerpc/udbg.h | |||
@@ -42,7 +42,8 @@ extern void __init udbg_init_debug_lpar(void); | |||
42 | extern void __init udbg_init_pmac_realmode(void); | 42 | extern void __init udbg_init_pmac_realmode(void); |
43 | extern void __init udbg_init_maple_realmode(void); | 43 | extern void __init udbg_init_maple_realmode(void); |
44 | extern void __init udbg_init_iseries(void); | 44 | extern void __init udbg_init_iseries(void); |
45 | extern void __init udbg_init_rtas(void); | 45 | extern void __init udbg_init_rtas_panel(void); |
46 | extern void __init udbg_init_rtas_console(void); | ||
46 | 47 | ||
47 | #endif /* __KERNEL__ */ | 48 | #endif /* __KERNEL__ */ |
48 | #endif /* _ASM_POWERPC_UDBG_H */ | 49 | #endif /* _ASM_POWERPC_UDBG_H */ |
diff --git a/include/asm-ppc/pci.h b/include/asm-ppc/pci.h index 61434edbad7b..11ffaaa5da16 100644 --- a/include/asm-ppc/pci.h +++ b/include/asm-ppc/pci.h | |||
@@ -133,7 +133,7 @@ extern pgprot_t pci_phys_mem_access_prot(struct file *file, | |||
133 | #define HAVE_ARCH_PCI_RESOURCE_TO_USER | 133 | #define HAVE_ARCH_PCI_RESOURCE_TO_USER |
134 | extern void pci_resource_to_user(const struct pci_dev *dev, int bar, | 134 | extern void pci_resource_to_user(const struct pci_dev *dev, int bar, |
135 | const struct resource *rsrc, | 135 | const struct resource *rsrc, |
136 | u64 *start, u64 *end); | 136 | resource_size_t *start, resource_size_t *end); |
137 | 137 | ||
138 | 138 | ||
139 | #endif /* __KERNEL__ */ | 139 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-s390/bitops.h b/include/asm-s390/bitops.h index 4d2b126ba159..0ddcdba79e4a 100644 --- a/include/asm-s390/bitops.h +++ b/include/asm-s390/bitops.h | |||
@@ -12,6 +12,9 @@ | |||
12 | * Copyright (C) 1992, Linus Torvalds | 12 | * Copyright (C) 1992, Linus Torvalds |
13 | * | 13 | * |
14 | */ | 14 | */ |
15 | |||
16 | #ifdef __KERNEL__ | ||
17 | |||
15 | #include <linux/compiler.h> | 18 | #include <linux/compiler.h> |
16 | 19 | ||
17 | /* | 20 | /* |
@@ -50,19 +53,6 @@ | |||
50 | * with operation of the form "set_bit(bitnr, flags)". | 53 | * with operation of the form "set_bit(bitnr, flags)". |
51 | */ | 54 | */ |
52 | 55 | ||
53 | /* set ALIGN_CS to 1 if the SMP safe bit operations should | ||
54 | * align the address to 4 byte boundary. It seems to work | ||
55 | * without the alignment. | ||
56 | */ | ||
57 | #ifdef __KERNEL__ | ||
58 | #define ALIGN_CS 0 | ||
59 | #else | ||
60 | #define ALIGN_CS 1 | ||
61 | #ifndef CONFIG_SMP | ||
62 | #error "bitops won't work without CONFIG_SMP" | ||
63 | #endif | ||
64 | #endif | ||
65 | |||
66 | /* bitmap tables from arch/S390/kernel/bitmap.S */ | 56 | /* bitmap tables from arch/S390/kernel/bitmap.S */ |
67 | extern const char _oi_bitmap[]; | 57 | extern const char _oi_bitmap[]; |
68 | extern const char _ni_bitmap[]; | 58 | extern const char _ni_bitmap[]; |
@@ -121,10 +111,6 @@ static inline void set_bit_cs(unsigned long nr, volatile unsigned long *ptr) | |||
121 | unsigned long addr, old, new, mask; | 111 | unsigned long addr, old, new, mask; |
122 | 112 | ||
123 | addr = (unsigned long) ptr; | 113 | addr = (unsigned long) ptr; |
124 | #if ALIGN_CS == 1 | ||
125 | nr += (addr & __BITOPS_ALIGN) << 3; /* add alignment to bit number */ | ||
126 | addr ^= addr & __BITOPS_ALIGN; /* align address to 8 */ | ||
127 | #endif | ||
128 | /* calculate address for CS */ | 114 | /* calculate address for CS */ |
129 | addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; | 115 | addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; |
130 | /* make OR mask */ | 116 | /* make OR mask */ |
@@ -141,10 +127,6 @@ static inline void clear_bit_cs(unsigned long nr, volatile unsigned long *ptr) | |||
141 | unsigned long addr, old, new, mask; | 127 | unsigned long addr, old, new, mask; |
142 | 128 | ||
143 | addr = (unsigned long) ptr; | 129 | addr = (unsigned long) ptr; |
144 | #if ALIGN_CS == 1 | ||
145 | nr += (addr & __BITOPS_ALIGN) << 3; /* add alignment to bit number */ | ||
146 | addr ^= addr & __BITOPS_ALIGN; /* align address to 8 */ | ||
147 | #endif | ||
148 | /* calculate address for CS */ | 130 | /* calculate address for CS */ |
149 | addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; | 131 | addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; |
150 | /* make AND mask */ | 132 | /* make AND mask */ |
@@ -161,10 +143,6 @@ static inline void change_bit_cs(unsigned long nr, volatile unsigned long *ptr) | |||
161 | unsigned long addr, old, new, mask; | 143 | unsigned long addr, old, new, mask; |
162 | 144 | ||
163 | addr = (unsigned long) ptr; | 145 | addr = (unsigned long) ptr; |
164 | #if ALIGN_CS == 1 | ||
165 | nr += (addr & __BITOPS_ALIGN) << 3; /* add alignment to bit number */ | ||
166 | addr ^= addr & __BITOPS_ALIGN; /* align address to 8 */ | ||
167 | #endif | ||
168 | /* calculate address for CS */ | 146 | /* calculate address for CS */ |
169 | addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; | 147 | addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; |
170 | /* make XOR mask */ | 148 | /* make XOR mask */ |
@@ -182,10 +160,6 @@ test_and_set_bit_cs(unsigned long nr, volatile unsigned long *ptr) | |||
182 | unsigned long addr, old, new, mask; | 160 | unsigned long addr, old, new, mask; |
183 | 161 | ||
184 | addr = (unsigned long) ptr; | 162 | addr = (unsigned long) ptr; |
185 | #if ALIGN_CS == 1 | ||
186 | nr += (addr & __BITOPS_ALIGN) << 3; /* add alignment to bit number */ | ||
187 | addr ^= addr & __BITOPS_ALIGN; /* align address to 8 */ | ||
188 | #endif | ||
189 | /* calculate address for CS */ | 163 | /* calculate address for CS */ |
190 | addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; | 164 | addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; |
191 | /* make OR/test mask */ | 165 | /* make OR/test mask */ |
@@ -205,10 +179,6 @@ test_and_clear_bit_cs(unsigned long nr, volatile unsigned long *ptr) | |||
205 | unsigned long addr, old, new, mask; | 179 | unsigned long addr, old, new, mask; |
206 | 180 | ||
207 | addr = (unsigned long) ptr; | 181 | addr = (unsigned long) ptr; |
208 | #if ALIGN_CS == 1 | ||
209 | nr += (addr & __BITOPS_ALIGN) << 3; /* add alignment to bit number */ | ||
210 | addr ^= addr & __BITOPS_ALIGN; /* align address to 8 */ | ||
211 | #endif | ||
212 | /* calculate address for CS */ | 182 | /* calculate address for CS */ |
213 | addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; | 183 | addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; |
214 | /* make AND/test mask */ | 184 | /* make AND/test mask */ |
@@ -228,10 +198,6 @@ test_and_change_bit_cs(unsigned long nr, volatile unsigned long *ptr) | |||
228 | unsigned long addr, old, new, mask; | 198 | unsigned long addr, old, new, mask; |
229 | 199 | ||
230 | addr = (unsigned long) ptr; | 200 | addr = (unsigned long) ptr; |
231 | #if ALIGN_CS == 1 | ||
232 | nr += (addr & __BITOPS_ALIGN) << 3; /* add alignment to bit number */ | ||
233 | addr ^= addr & __BITOPS_ALIGN; /* align address to 8 */ | ||
234 | #endif | ||
235 | /* calculate address for CS */ | 201 | /* calculate address for CS */ |
236 | addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; | 202 | addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; |
237 | /* make XOR/test mask */ | 203 | /* make XOR/test mask */ |
@@ -834,8 +800,6 @@ static inline int sched_find_first_bit(unsigned long *b) | |||
834 | 800 | ||
835 | #include <asm-generic/bitops/hweight.h> | 801 | #include <asm-generic/bitops/hweight.h> |
836 | 802 | ||
837 | #ifdef __KERNEL__ | ||
838 | |||
839 | /* | 803 | /* |
840 | * ATTENTION: intel byte ordering convention for ext2 and minix !! | 804 | * ATTENTION: intel byte ordering convention for ext2 and minix !! |
841 | * bit 0 is the LSB of addr; bit 31 is the MSB of addr; | 805 | * bit 0 is the LSB of addr; bit 31 is the MSB of addr; |
diff --git a/include/asm-s390/cio.h b/include/asm-s390/cio.h index 089cf567c317..2b1619306351 100644 --- a/include/asm-s390/cio.h +++ b/include/asm-s390/cio.h | |||
@@ -276,6 +276,8 @@ extern void wait_cons_dev(void); | |||
276 | 276 | ||
277 | extern void clear_all_subchannels(void); | 277 | extern void clear_all_subchannels(void); |
278 | 278 | ||
279 | extern void css_schedule_reprobe(void); | ||
280 | |||
279 | #endif | 281 | #endif |
280 | 282 | ||
281 | #endif | 283 | #endif |
diff --git a/include/asm-s390/cmb.h b/include/asm-s390/cmb.h index 2d09950a9c11..241756f80df3 100644 --- a/include/asm-s390/cmb.h +++ b/include/asm-s390/cmb.h | |||
@@ -44,10 +44,6 @@ struct cmbdata { | |||
44 | #define BIODASDCMFENABLE _IO(DASD_IOCTL_LETTER,32) | 44 | #define BIODASDCMFENABLE _IO(DASD_IOCTL_LETTER,32) |
45 | /* enable channel measurement */ | 45 | /* enable channel measurement */ |
46 | #define BIODASDCMFDISABLE _IO(DASD_IOCTL_LETTER,33) | 46 | #define BIODASDCMFDISABLE _IO(DASD_IOCTL_LETTER,33) |
47 | /* reset channel measurement block */ | ||
48 | #define BIODASDRESETCMB _IO(DASD_IOCTL_LETTER,34) | ||
49 | /* read channel measurement data */ | ||
50 | #define BIODASDREADCMB _IOWR(DASD_IOCTL_LETTER,32,__u64) | ||
51 | /* read channel measurement data */ | 47 | /* read channel measurement data */ |
52 | #define BIODASDREADALLCMB _IOWR(DASD_IOCTL_LETTER,33,struct cmbdata) | 48 | #define BIODASDREADALLCMB _IOWR(DASD_IOCTL_LETTER,33,struct cmbdata) |
53 | 49 | ||
diff --git a/include/asm-s390/dasd.h b/include/asm-s390/dasd.h index 1630c26e8f45..c042f9578081 100644 --- a/include/asm-s390/dasd.h +++ b/include/asm-s390/dasd.h | |||
@@ -68,10 +68,12 @@ typedef struct dasd_information2_t { | |||
68 | * 0x00: default features | 68 | * 0x00: default features |
69 | * 0x01: readonly (ro) | 69 | * 0x01: readonly (ro) |
70 | * 0x02: use diag discipline (diag) | 70 | * 0x02: use diag discipline (diag) |
71 | * 0x04: set the device initially online (internal use only) | ||
71 | */ | 72 | */ |
72 | #define DASD_FEATURE_DEFAULT 0 | 73 | #define DASD_FEATURE_DEFAULT 0x00 |
73 | #define DASD_FEATURE_READONLY 1 | 74 | #define DASD_FEATURE_READONLY 0x01 |
74 | #define DASD_FEATURE_USEDIAG 2 | 75 | #define DASD_FEATURE_USEDIAG 0x02 |
76 | #define DASD_FEATURE_INITIAL_ONLINE 0x04 | ||
75 | 77 | ||
76 | #define DASD_PARTN_BITS 2 | 78 | #define DASD_PARTN_BITS 2 |
77 | 79 | ||
diff --git a/include/asm-s390/thread_info.h b/include/asm-s390/thread_info.h index 8e0c7ed73d03..0a518915bf90 100644 --- a/include/asm-s390/thread_info.h +++ b/include/asm-s390/thread_info.h | |||
@@ -63,6 +63,7 @@ struct thread_info { | |||
63 | .exec_domain = &default_exec_domain, \ | 63 | .exec_domain = &default_exec_domain, \ |
64 | .flags = 0, \ | 64 | .flags = 0, \ |
65 | .cpu = 0, \ | 65 | .cpu = 0, \ |
66 | .preempt_count = 1, \ | ||
66 | .restart_block = { \ | 67 | .restart_block = { \ |
67 | .fn = do_no_restart_syscall, \ | 68 | .fn = do_no_restart_syscall, \ |
68 | }, \ | 69 | }, \ |
diff --git a/include/asm-s390/unistd.h b/include/asm-s390/unistd.h index e21443d3ea1d..aa7a243862e1 100644 --- a/include/asm-s390/unistd.h +++ b/include/asm-s390/unistd.h | |||
@@ -394,11 +394,9 @@ | |||
394 | 394 | ||
395 | #ifdef __KERNEL__ | 395 | #ifdef __KERNEL__ |
396 | 396 | ||
397 | /* user-visible error numbers are in the range -1 - -122: see <asm-s390/errno.h> */ | ||
398 | |||
399 | #define __syscall_return(type, res) \ | 397 | #define __syscall_return(type, res) \ |
400 | do { \ | 398 | do { \ |
401 | if ((unsigned long)(res) >= (unsigned long)(-125)) { \ | 399 | if ((unsigned long)(res) >= (unsigned long)(-4095)) {\ |
402 | errno = -(res); \ | 400 | errno = -(res); \ |
403 | res = -1; \ | 401 | res = -1; \ |
404 | } \ | 402 | } \ |
diff --git a/include/asm-sh/hw_irq.h b/include/asm-sh/hw_irq.h index 1d934fb2c581..fed26616967a 100644 --- a/include/asm-sh/hw_irq.h +++ b/include/asm-sh/hw_irq.h | |||
@@ -1,9 +1,4 @@ | |||
1 | #ifndef __ASM_SH_HW_IRQ_H | 1 | #ifndef __ASM_SH_HW_IRQ_H |
2 | #define __ASM_SH_HW_IRQ_H | 2 | #define __ASM_SH_HW_IRQ_H |
3 | 3 | ||
4 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) | ||
5 | { | ||
6 | /* Nothing to do */ | ||
7 | } | ||
8 | |||
9 | #endif /* __ASM_SH_HW_IRQ_H */ | 4 | #endif /* __ASM_SH_HW_IRQ_H */ |
diff --git a/include/asm-sh64/hw_irq.h b/include/asm-sh64/hw_irq.h index ae718d1f2d6c..ebb39089b0ac 100644 --- a/include/asm-sh64/hw_irq.h +++ b/include/asm-sh64/hw_irq.h | |||
@@ -11,6 +11,5 @@ | |||
11 | * Copyright (C) 2000, 2001 Paolo Alberelli | 11 | * Copyright (C) 2000, 2001 Paolo Alberelli |
12 | * | 12 | * |
13 | */ | 13 | */ |
14 | static __inline__ void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) { /* Nothing to do */ } | ||
15 | 14 | ||
16 | #endif /* __ASM_SH64_HW_IRQ_H */ | 15 | #endif /* __ASM_SH64_HW_IRQ_H */ |
diff --git a/include/asm-um/hw_irq.h b/include/asm-um/hw_irq.h index 4ee38c0b6a64..1cf84cf5f21a 100644 --- a/include/asm-um/hw_irq.h +++ b/include/asm-um/hw_irq.h | |||
@@ -4,7 +4,4 @@ | |||
4 | #include "asm/irq.h" | 4 | #include "asm/irq.h" |
5 | #include "asm/archparam.h" | 5 | #include "asm/archparam.h" |
6 | 6 | ||
7 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) | ||
8 | {} | ||
9 | |||
10 | #endif | 7 | #endif |
diff --git a/include/asm-v850/hw_irq.h b/include/asm-v850/hw_irq.h index a8aab4342712..043e94bb6bd8 100644 --- a/include/asm-v850/hw_irq.h +++ b/include/asm-v850/hw_irq.h | |||
@@ -1,8 +1,4 @@ | |||
1 | #ifndef __V850_HW_IRQ_H__ | 1 | #ifndef __V850_HW_IRQ_H__ |
2 | #define __V850_HW_IRQ_H__ | 2 | #define __V850_HW_IRQ_H__ |
3 | 3 | ||
4 | static inline void hw_resend_irq (struct hw_interrupt_type *h, unsigned int i) | ||
5 | { | ||
6 | } | ||
7 | |||
8 | #endif /* __V850_HW_IRQ_H__ */ | 4 | #endif /* __V850_HW_IRQ_H__ */ |
diff --git a/include/asm-x86_64/hw_irq.h b/include/asm-x86_64/hw_irq.h index 931877462788..48a4a5364e85 100644 --- a/include/asm-x86_64/hw_irq.h +++ b/include/asm-x86_64/hw_irq.h | |||
@@ -127,15 +127,6 @@ __asm__( \ | |||
127 | "push $~(" #nr ") ; " \ | 127 | "push $~(" #nr ") ; " \ |
128 | "jmp common_interrupt"); | 128 | "jmp common_interrupt"); |
129 | 129 | ||
130 | #if defined(CONFIG_X86_IO_APIC) | ||
131 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) { | ||
132 | if (IO_APIC_IRQ(i)) | ||
133 | send_IPI_self(IO_APIC_VECTOR(i)); | ||
134 | } | ||
135 | #else | ||
136 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} | ||
137 | #endif | ||
138 | |||
139 | #define platform_legacy_irq(irq) ((irq) < 16) | 130 | #define platform_legacy_irq(irq) ((irq) < 16) |
140 | 131 | ||
141 | #endif | 132 | #endif |
diff --git a/include/asm-xtensa/hw_irq.h b/include/asm-xtensa/hw_irq.h index ccf436249eaa..3ddbea759b2b 100644 --- a/include/asm-xtensa/hw_irq.h +++ b/include/asm-xtensa/hw_irq.h | |||
@@ -11,8 +11,4 @@ | |||
11 | #ifndef _XTENSA_HW_IRQ_H | 11 | #ifndef _XTENSA_HW_IRQ_H |
12 | #define _XTENSA_HW_IRQ_H | 12 | #define _XTENSA_HW_IRQ_H |
13 | 13 | ||
14 | static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) | ||
15 | { | ||
16 | } | ||
17 | |||
18 | #endif | 14 | #endif |
diff --git a/include/linux/ac97_codec.h b/include/linux/ac97_codec.h index c35833824e11..2ed2fd855133 100644 --- a/include/linux/ac97_codec.h +++ b/include/linux/ac97_codec.h | |||
@@ -259,7 +259,7 @@ struct ac97_codec { | |||
259 | int type; | 259 | int type; |
260 | u32 model; | 260 | u32 model; |
261 | 261 | ||
262 | int modem:1; | 262 | unsigned int modem:1; |
263 | 263 | ||
264 | struct ac97_ops *codec_ops; | 264 | struct ac97_ops *codec_ops; |
265 | 265 | ||
diff --git a/include/linux/coda_linux.h b/include/linux/coda_linux.h index 7b5c5df5cb69..be512cc98791 100644 --- a/include/linux/coda_linux.h +++ b/include/linux/coda_linux.h | |||
@@ -27,8 +27,8 @@ extern struct inode_operations coda_dir_inode_operations; | |||
27 | extern struct inode_operations coda_file_inode_operations; | 27 | extern struct inode_operations coda_file_inode_operations; |
28 | extern struct inode_operations coda_ioctl_inode_operations; | 28 | extern struct inode_operations coda_ioctl_inode_operations; |
29 | 29 | ||
30 | extern struct address_space_operations coda_file_aops; | 30 | extern const struct address_space_operations coda_file_aops; |
31 | extern struct address_space_operations coda_symlink_aops; | 31 | extern const struct address_space_operations coda_symlink_aops; |
32 | 32 | ||
33 | extern const struct file_operations coda_dir_operations; | 33 | extern const struct file_operations coda_dir_operations; |
34 | extern const struct file_operations coda_file_operations; | 34 | extern const struct file_operations coda_file_operations; |
diff --git a/include/linux/efs_fs.h b/include/linux/efs_fs.h index fbfa6b52e2fb..278ef4495819 100644 --- a/include/linux/efs_fs.h +++ b/include/linux/efs_fs.h | |||
@@ -38,7 +38,7 @@ struct statfs; | |||
38 | 38 | ||
39 | extern struct inode_operations efs_dir_inode_operations; | 39 | extern struct inode_operations efs_dir_inode_operations; |
40 | extern const struct file_operations efs_dir_operations; | 40 | extern const struct file_operations efs_dir_operations; |
41 | extern struct address_space_operations efs_symlink_aops; | 41 | extern const struct address_space_operations efs_symlink_aops; |
42 | 42 | ||
43 | extern void efs_read_inode(struct inode *); | 43 | extern void efs_read_inode(struct inode *); |
44 | extern efs_block_t efs_map_block(struct inode *, efs_block_t); | 44 | extern efs_block_t efs_map_block(struct inode *, efs_block_t); |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 2d8b348c1192..e04a5cfe874f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -392,7 +392,7 @@ struct address_space { | |||
392 | unsigned int truncate_count; /* Cover race condition with truncate */ | 392 | unsigned int truncate_count; /* Cover race condition with truncate */ |
393 | unsigned long nrpages; /* number of total pages */ | 393 | unsigned long nrpages; /* number of total pages */ |
394 | pgoff_t writeback_index;/* writeback starts here */ | 394 | pgoff_t writeback_index;/* writeback starts here */ |
395 | struct address_space_operations *a_ops; /* methods */ | 395 | const struct address_space_operations *a_ops; /* methods */ |
396 | unsigned long flags; /* error bits/gfp mask */ | 396 | unsigned long flags; /* error bits/gfp mask */ |
397 | struct backing_dev_info *backing_dev_info; /* device readahead, etc */ | 397 | struct backing_dev_info *backing_dev_info; /* device readahead, etc */ |
398 | spinlock_t private_lock; /* for use by the address_space */ | 398 | spinlock_t private_lock; /* for use by the address_space */ |
@@ -1405,7 +1405,7 @@ extern void bd_forget(struct inode *inode); | |||
1405 | extern void bdput(struct block_device *); | 1405 | extern void bdput(struct block_device *); |
1406 | extern struct block_device *open_by_devnum(dev_t, unsigned); | 1406 | extern struct block_device *open_by_devnum(dev_t, unsigned); |
1407 | extern const struct file_operations def_blk_fops; | 1407 | extern const struct file_operations def_blk_fops; |
1408 | extern struct address_space_operations def_blk_aops; | 1408 | extern const struct address_space_operations def_blk_aops; |
1409 | extern const struct file_operations def_chr_fops; | 1409 | extern const struct file_operations def_chr_fops; |
1410 | extern const struct file_operations bad_sock_fops; | 1410 | extern const struct file_operations bad_sock_fops; |
1411 | extern const struct file_operations def_fifo_fops; | 1411 | extern const struct file_operations def_fifo_fops; |
diff --git a/include/linux/ide.h b/include/linux/ide.h index ef7bef207f48..0c100168c0cf 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -793,6 +793,7 @@ typedef struct hwif_s { | |||
793 | unsigned auto_poll : 1; /* supports nop auto-poll */ | 793 | unsigned auto_poll : 1; /* supports nop auto-poll */ |
794 | unsigned sg_mapped : 1; /* sg_table and sg_nents are ready */ | 794 | unsigned sg_mapped : 1; /* sg_table and sg_nents are ready */ |
795 | unsigned no_io_32bit : 1; /* 1 = can not do 32-bit IO ops */ | 795 | unsigned no_io_32bit : 1; /* 1 = can not do 32-bit IO ops */ |
796 | unsigned err_stops_fifo : 1; /* 1=data FIFO is cleared by an error */ | ||
796 | 797 | ||
797 | struct device gendev; | 798 | struct device gendev; |
798 | struct completion gendev_rel_comp; /* To deal with device release() */ | 799 | struct completion gendev_rel_comp; /* To deal with device release() */ |
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 70741e170114..db2a63a11633 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
@@ -36,6 +36,20 @@ extern void free_irq(unsigned int, void *); | |||
36 | extern void disable_irq_nosync(unsigned int irq); | 36 | extern void disable_irq_nosync(unsigned int irq); |
37 | extern void disable_irq(unsigned int irq); | 37 | extern void disable_irq(unsigned int irq); |
38 | extern void enable_irq(unsigned int irq); | 38 | extern void enable_irq(unsigned int irq); |
39 | |||
40 | /* IRQ wakeup (PM) control: */ | ||
41 | extern int set_irq_wake(unsigned int irq, unsigned int on); | ||
42 | |||
43 | static inline int enable_irq_wake(unsigned int irq) | ||
44 | { | ||
45 | return set_irq_wake(irq, 1); | ||
46 | } | ||
47 | |||
48 | static inline int disable_irq_wake(unsigned int irq) | ||
49 | { | ||
50 | return set_irq_wake(irq, 0); | ||
51 | } | ||
52 | |||
39 | #endif | 53 | #endif |
40 | 54 | ||
41 | #ifndef __ARCH_SET_SOFTIRQ_PENDING | 55 | #ifndef __ARCH_SET_SOFTIRQ_PENDING |
diff --git a/include/linux/ioport.h b/include/linux/ioport.h index edfc733b1575..87a9fc039b47 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h | |||
@@ -9,13 +9,15 @@ | |||
9 | #define _LINUX_IOPORT_H | 9 | #define _LINUX_IOPORT_H |
10 | 10 | ||
11 | #include <linux/compiler.h> | 11 | #include <linux/compiler.h> |
12 | #include <linux/types.h> | ||
12 | /* | 13 | /* |
13 | * Resources are tree-like, allowing | 14 | * Resources are tree-like, allowing |
14 | * nesting etc.. | 15 | * nesting etc.. |
15 | */ | 16 | */ |
16 | struct resource { | 17 | struct resource { |
18 | resource_size_t start; | ||
19 | resource_size_t end; | ||
17 | const char *name; | 20 | const char *name; |
18 | unsigned long start, end; | ||
19 | unsigned long flags; | 21 | unsigned long flags; |
20 | struct resource *parent, *sibling, *child; | 22 | struct resource *parent, *sibling, *child; |
21 | }; | 23 | }; |
@@ -96,14 +98,13 @@ extern struct resource * ____request_resource(struct resource *root, struct reso | |||
96 | extern int release_resource(struct resource *new); | 98 | extern int release_resource(struct resource *new); |
97 | extern __deprecated_for_modules int insert_resource(struct resource *parent, struct resource *new); | 99 | extern __deprecated_for_modules int insert_resource(struct resource *parent, struct resource *new); |
98 | extern int allocate_resource(struct resource *root, struct resource *new, | 100 | extern int allocate_resource(struct resource *root, struct resource *new, |
99 | unsigned long size, | 101 | resource_size_t size, resource_size_t min, |
100 | unsigned long min, unsigned long max, | 102 | resource_size_t max, resource_size_t align, |
101 | unsigned long align, | ||
102 | void (*alignf)(void *, struct resource *, | 103 | void (*alignf)(void *, struct resource *, |
103 | unsigned long, unsigned long), | 104 | resource_size_t, resource_size_t), |
104 | void *alignf_data); | 105 | void *alignf_data); |
105 | int adjust_resource(struct resource *res, unsigned long start, | 106 | int adjust_resource(struct resource *res, resource_size_t start, |
106 | unsigned long size); | 107 | resource_size_t size); |
107 | 108 | ||
108 | /* get registered SYSTEM_RAM resources in specified area */ | 109 | /* get registered SYSTEM_RAM resources in specified area */ |
109 | extern int find_next_system_ram(struct resource *res); | 110 | extern int find_next_system_ram(struct resource *res); |
@@ -113,17 +114,21 @@ extern int find_next_system_ram(struct resource *res); | |||
113 | #define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name)) | 114 | #define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name)) |
114 | #define rename_region(region, newname) do { (region)->name = (newname); } while (0) | 115 | #define rename_region(region, newname) do { (region)->name = (newname); } while (0) |
115 | 116 | ||
116 | extern struct resource * __request_region(struct resource *, unsigned long start, unsigned long n, const char *name); | 117 | extern struct resource * __request_region(struct resource *, |
118 | resource_size_t start, | ||
119 | resource_size_t n, const char *name); | ||
117 | 120 | ||
118 | /* Compatibility cruft */ | 121 | /* Compatibility cruft */ |
119 | #define release_region(start,n) __release_region(&ioport_resource, (start), (n)) | 122 | #define release_region(start,n) __release_region(&ioport_resource, (start), (n)) |
120 | #define check_mem_region(start,n) __check_region(&iomem_resource, (start), (n)) | 123 | #define check_mem_region(start,n) __check_region(&iomem_resource, (start), (n)) |
121 | #define release_mem_region(start,n) __release_region(&iomem_resource, (start), (n)) | 124 | #define release_mem_region(start,n) __release_region(&iomem_resource, (start), (n)) |
122 | 125 | ||
123 | extern int __check_region(struct resource *, unsigned long, unsigned long); | 126 | extern int __check_region(struct resource *, resource_size_t, resource_size_t); |
124 | extern void __release_region(struct resource *, unsigned long, unsigned long); | 127 | extern void __release_region(struct resource *, resource_size_t, |
128 | resource_size_t); | ||
125 | 129 | ||
126 | static inline int __deprecated check_region(unsigned long s, unsigned long n) | 130 | static inline int __deprecated check_region(resource_size_t s, |
131 | resource_size_t n) | ||
127 | { | 132 | { |
128 | return __check_region(&ioport_resource, s, n); | 133 | return __check_region(&ioport_resource, s, n); |
129 | } | 134 | } |
diff --git a/include/linux/irq.h b/include/linux/irq.h index 676e00dfb21a..0832149cdb18 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -1,5 +1,5 @@ | |||
1 | #ifndef __irq_h | 1 | #ifndef _LINUX_IRQ_H |
2 | #define __irq_h | 2 | #define _LINUX_IRQ_H |
3 | 3 | ||
4 | /* | 4 | /* |
5 | * Please do not include this file in generic code. There is currently | 5 | * Please do not include this file in generic code. There is currently |
@@ -11,7 +11,7 @@ | |||
11 | 11 | ||
12 | #include <linux/smp.h> | 12 | #include <linux/smp.h> |
13 | 13 | ||
14 | #if !defined(CONFIG_S390) | 14 | #ifndef CONFIG_S390 |
15 | 15 | ||
16 | #include <linux/linkage.h> | 16 | #include <linux/linkage.h> |
17 | #include <linux/cache.h> | 17 | #include <linux/cache.h> |
@@ -33,75 +33,160 @@ | |||
33 | #define IRQ_WAITING 32 /* IRQ not yet seen - for autodetection */ | 33 | #define IRQ_WAITING 32 /* IRQ not yet seen - for autodetection */ |
34 | #define IRQ_LEVEL 64 /* IRQ level triggered */ | 34 | #define IRQ_LEVEL 64 /* IRQ level triggered */ |
35 | #define IRQ_MASKED 128 /* IRQ masked - shouldn't be seen again */ | 35 | #define IRQ_MASKED 128 /* IRQ masked - shouldn't be seen again */ |
36 | #if defined(ARCH_HAS_IRQ_PER_CPU) | 36 | #ifdef CONFIG_IRQ_PER_CPU |
37 | # define IRQ_PER_CPU 256 /* IRQ is per CPU */ | 37 | # define IRQ_PER_CPU 256 /* IRQ is per CPU */ |
38 | # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) | 38 | # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) |
39 | #else | 39 | #else |
40 | # define CHECK_IRQ_PER_CPU(var) 0 | 40 | # define CHECK_IRQ_PER_CPU(var) 0 |
41 | #endif | 41 | #endif |
42 | 42 | ||
43 | #define IRQ_NOPROBE 512 /* IRQ is not valid for probing */ | ||
44 | #define IRQ_NOREQUEST 1024 /* IRQ cannot be requested */ | ||
45 | #define IRQ_NOAUTOEN 2048 /* IRQ will not be enabled on request irq */ | ||
46 | #define IRQ_DELAYED_DISABLE \ | ||
47 | 4096 /* IRQ disable (masking) happens delayed. */ | ||
48 | |||
43 | /* | 49 | /* |
44 | * Interrupt controller descriptor. This is all we need | 50 | * IRQ types, see also include/linux/interrupt.h |
45 | * to describe about the low-level hardware. | ||
46 | */ | 51 | */ |
47 | struct hw_interrupt_type { | 52 | #define IRQ_TYPE_NONE 0x0000 /* Default, unspecified type */ |
48 | const char * typename; | 53 | #define IRQ_TYPE_EDGE_RISING 0x0001 /* Edge rising type */ |
49 | unsigned int (*startup)(unsigned int irq); | 54 | #define IRQ_TYPE_EDGE_FALLING 0x0002 /* Edge falling type */ |
50 | void (*shutdown)(unsigned int irq); | 55 | #define IRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING) |
51 | void (*enable)(unsigned int irq); | 56 | #define IRQ_TYPE_LEVEL_HIGH 0x0004 /* Level high type */ |
52 | void (*disable)(unsigned int irq); | 57 | #define IRQ_TYPE_LEVEL_LOW 0x0008 /* Level low type */ |
53 | void (*ack)(unsigned int irq); | 58 | #define IRQ_TYPE_SENSE_MASK 0x000f /* Mask of the above */ |
54 | void (*end)(unsigned int irq); | 59 | #define IRQ_TYPE_SIMPLE 0x0010 /* Simple type */ |
55 | void (*set_affinity)(unsigned int irq, cpumask_t dest); | 60 | #define IRQ_TYPE_PERCPU 0x0020 /* Per CPU type */ |
61 | #define IRQ_TYPE_PROBE 0x0040 /* Probing in progress */ | ||
62 | |||
63 | struct proc_dir_entry; | ||
64 | |||
65 | /** | ||
66 | * struct irq_chip - hardware interrupt chip descriptor | ||
67 | * | ||
68 | * @name: name for /proc/interrupts | ||
69 | * @startup: start up the interrupt (defaults to ->enable if NULL) | ||
70 | * @shutdown: shut down the interrupt (defaults to ->disable if NULL) | ||
71 | * @enable: enable the interrupt (defaults to chip->unmask if NULL) | ||
72 | * @disable: disable the interrupt (defaults to chip->mask if NULL) | ||
73 | * @ack: start of a new interrupt | ||
74 | * @mask: mask an interrupt source | ||
75 | * @mask_ack: ack and mask an interrupt source | ||
76 | * @unmask: unmask an interrupt source | ||
77 | * @eoi: end of interrupt - chip level | ||
78 | * @end: end of interrupt - flow level | ||
79 | * @set_affinity: set the CPU affinity on SMP machines | ||
80 | * @retrigger: resend an IRQ to the CPU | ||
81 | * @set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ | ||
82 | * @set_wake: enable/disable power-management wake-on of an IRQ | ||
83 | * | ||
84 | * @release: release function solely used by UML | ||
85 | * @typename: obsoleted by name, kept as migration helper | ||
86 | */ | ||
87 | struct irq_chip { | ||
88 | const char *name; | ||
89 | unsigned int (*startup)(unsigned int irq); | ||
90 | void (*shutdown)(unsigned int irq); | ||
91 | void (*enable)(unsigned int irq); | ||
92 | void (*disable)(unsigned int irq); | ||
93 | |||
94 | void (*ack)(unsigned int irq); | ||
95 | void (*mask)(unsigned int irq); | ||
96 | void (*mask_ack)(unsigned int irq); | ||
97 | void (*unmask)(unsigned int irq); | ||
98 | void (*eoi)(unsigned int irq); | ||
99 | |||
100 | void (*end)(unsigned int irq); | ||
101 | void (*set_affinity)(unsigned int irq, cpumask_t dest); | ||
102 | int (*retrigger)(unsigned int irq); | ||
103 | int (*set_type)(unsigned int irq, unsigned int flow_type); | ||
104 | int (*set_wake)(unsigned int irq, unsigned int on); | ||
105 | |||
56 | /* Currently used only by UML, might disappear one day.*/ | 106 | /* Currently used only by UML, might disappear one day.*/ |
57 | #ifdef CONFIG_IRQ_RELEASE_METHOD | 107 | #ifdef CONFIG_IRQ_RELEASE_METHOD |
58 | void (*release)(unsigned int irq, void *dev_id); | 108 | void (*release)(unsigned int irq, void *dev_id); |
59 | #endif | 109 | #endif |
110 | /* | ||
111 | * For compatibility, ->typename is copied into ->name. | ||
112 | * Will disappear. | ||
113 | */ | ||
114 | const char *typename; | ||
60 | }; | 115 | }; |
61 | 116 | ||
62 | typedef struct hw_interrupt_type hw_irq_controller; | 117 | /** |
63 | 118 | * struct irq_desc - interrupt descriptor | |
64 | /* | 119 | * |
65 | * This is the "IRQ descriptor", which contains various information | 120 | * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] |
66 | * about the irq, including what kind of hardware handling it has, | 121 | * @chip: low level interrupt hardware access |
67 | * whether it is disabled etc etc. | 122 | * @handler_data: per-IRQ data for the irq_chip methods |
123 | * @chip_data: platform-specific per-chip private data for the chip | ||
124 | * methods, to allow shared chip implementations | ||
125 | * @action: the irq action chain | ||
126 | * @status: status information | ||
127 | * @depth: disable-depth, for nested irq_disable() calls | ||
128 | * @irq_count: stats field to detect stalled irqs | ||
129 | * @irqs_unhandled: stats field for spurious unhandled interrupts | ||
130 | * @lock: locking for SMP | ||
131 | * @affinity: IRQ affinity on SMP | ||
132 | * @cpu: cpu index useful for balancing | ||
133 | * @pending_mask: pending rebalanced interrupts | ||
134 | * @move_irq: need to re-target IRQ destination | ||
135 | * @dir: /proc/irq/ procfs entry | ||
136 | * @affinity_entry: /proc/irq/smp_affinity procfs entry on SMP | ||
68 | * | 137 | * |
69 | * Pad this out to 32 bytes for cache and indexing reasons. | 138 | * Pad this out to 32 bytes for cache and indexing reasons. |
70 | */ | 139 | */ |
71 | typedef struct irq_desc { | 140 | struct irq_desc { |
72 | hw_irq_controller *handler; | 141 | void fastcall (*handle_irq)(unsigned int irq, |
73 | void *handler_data; | 142 | struct irq_desc *desc, |
74 | struct irqaction *action; /* IRQ action list */ | 143 | struct pt_regs *regs); |
75 | unsigned int status; /* IRQ status */ | 144 | struct irq_chip *chip; |
76 | unsigned int depth; /* nested irq disables */ | 145 | void *handler_data; |
77 | unsigned int irq_count; /* For detecting broken interrupts */ | 146 | void *chip_data; |
78 | unsigned int irqs_unhandled; | 147 | struct irqaction *action; /* IRQ action list */ |
79 | spinlock_t lock; | 148 | unsigned int status; /* IRQ status */ |
80 | #if defined (CONFIG_GENERIC_PENDING_IRQ) || defined (CONFIG_IRQBALANCE) | 149 | |
81 | unsigned int move_irq; /* Flag need to re-target intr dest*/ | 150 | unsigned int depth; /* nested irq disables */ |
151 | unsigned int irq_count; /* For detecting broken IRQs */ | ||
152 | unsigned int irqs_unhandled; | ||
153 | spinlock_t lock; | ||
154 | #ifdef CONFIG_SMP | ||
155 | cpumask_t affinity; | ||
156 | unsigned int cpu; | ||
157 | #endif | ||
158 | #if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE) | ||
159 | cpumask_t pending_mask; | ||
160 | unsigned int move_irq; /* need to re-target IRQ dest */ | ||
82 | #endif | 161 | #endif |
83 | } ____cacheline_aligned irq_desc_t; | 162 | #ifdef CONFIG_PROC_FS |
163 | struct proc_dir_entry *dir; | ||
164 | #endif | ||
165 | } ____cacheline_aligned; | ||
84 | 166 | ||
85 | extern irq_desc_t irq_desc [NR_IRQS]; | 167 | extern struct irq_desc irq_desc[NR_IRQS]; |
86 | 168 | ||
87 | /* Return a pointer to the irq descriptor for IRQ. */ | 169 | /* |
88 | static inline irq_desc_t * | 170 | * Migration helpers for obsolete names, they will go away: |
89 | irq_descp (int irq) | 171 | */ |
90 | { | 172 | #define hw_interrupt_type irq_chip |
91 | return irq_desc + irq; | 173 | typedef struct irq_chip hw_irq_controller; |
92 | } | 174 | #define no_irq_type no_irq_chip |
175 | typedef struct irq_desc irq_desc_t; | ||
93 | 176 | ||
94 | #include <asm/hw_irq.h> /* the arch dependent stuff */ | 177 | /* |
178 | * Pick up the arch-dependent methods: | ||
179 | */ | ||
180 | #include <asm/hw_irq.h> | ||
95 | 181 | ||
96 | extern int setup_irq(unsigned int irq, struct irqaction * new); | 182 | extern int setup_irq(unsigned int irq, struct irqaction *new); |
97 | 183 | ||
98 | #ifdef CONFIG_GENERIC_HARDIRQS | 184 | #ifdef CONFIG_GENERIC_HARDIRQS |
99 | extern cpumask_t irq_affinity[NR_IRQS]; | ||
100 | 185 | ||
101 | #ifdef CONFIG_SMP | 186 | #ifdef CONFIG_SMP |
102 | static inline void set_native_irq_info(int irq, cpumask_t mask) | 187 | static inline void set_native_irq_info(int irq, cpumask_t mask) |
103 | { | 188 | { |
104 | irq_affinity[irq] = mask; | 189 | irq_desc[irq].affinity = mask; |
105 | } | 190 | } |
106 | #else | 191 | #else |
107 | static inline void set_native_irq_info(int irq, cpumask_t mask) | 192 | static inline void set_native_irq_info(int irq, cpumask_t mask) |
@@ -111,8 +196,7 @@ static inline void set_native_irq_info(int irq, cpumask_t mask) | |||
111 | 196 | ||
112 | #ifdef CONFIG_SMP | 197 | #ifdef CONFIG_SMP |
113 | 198 | ||
114 | #if defined (CONFIG_GENERIC_PENDING_IRQ) || defined (CONFIG_IRQBALANCE) | 199 | #if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE) |
115 | extern cpumask_t pending_irq_cpumask[NR_IRQS]; | ||
116 | 200 | ||
117 | void set_pending_irq(unsigned int irq, cpumask_t mask); | 201 | void set_pending_irq(unsigned int irq, cpumask_t mask); |
118 | void move_native_irq(int irq); | 202 | void move_native_irq(int irq); |
@@ -133,7 +217,7 @@ static inline void set_irq_info(int irq, cpumask_t mask) | |||
133 | { | 217 | { |
134 | } | 218 | } |
135 | 219 | ||
136 | #else // CONFIG_PCI_MSI | 220 | #else /* CONFIG_PCI_MSI */ |
137 | 221 | ||
138 | static inline void move_irq(int irq) | 222 | static inline void move_irq(int irq) |
139 | { | 223 | { |
@@ -144,26 +228,36 @@ static inline void set_irq_info(int irq, cpumask_t mask) | |||
144 | { | 228 | { |
145 | set_native_irq_info(irq, mask); | 229 | set_native_irq_info(irq, mask); |
146 | } | 230 | } |
147 | #endif // CONFIG_PCI_MSI | ||
148 | 231 | ||
149 | #else // CONFIG_GENERIC_PENDING_IRQ || CONFIG_IRQBALANCE | 232 | #endif /* CONFIG_PCI_MSI */ |
233 | |||
234 | #else /* CONFIG_GENERIC_PENDING_IRQ || CONFIG_IRQBALANCE */ | ||
235 | |||
236 | static inline void move_irq(int irq) | ||
237 | { | ||
238 | } | ||
239 | |||
240 | static inline void move_native_irq(int irq) | ||
241 | { | ||
242 | } | ||
243 | |||
244 | static inline void set_pending_irq(unsigned int irq, cpumask_t mask) | ||
245 | { | ||
246 | } | ||
150 | 247 | ||
151 | #define move_irq(x) | ||
152 | #define move_native_irq(x) | ||
153 | #define set_pending_irq(x,y) | ||
154 | static inline void set_irq_info(int irq, cpumask_t mask) | 248 | static inline void set_irq_info(int irq, cpumask_t mask) |
155 | { | 249 | { |
156 | set_native_irq_info(irq, mask); | 250 | set_native_irq_info(irq, mask); |
157 | } | 251 | } |
158 | 252 | ||
159 | #endif // CONFIG_GENERIC_PENDING_IRQ | 253 | #endif /* CONFIG_GENERIC_PENDING_IRQ */ |
160 | 254 | ||
161 | #else // CONFIG_SMP | 255 | #else /* CONFIG_SMP */ |
162 | 256 | ||
163 | #define move_irq(x) | 257 | #define move_irq(x) |
164 | #define move_native_irq(x) | 258 | #define move_native_irq(x) |
165 | 259 | ||
166 | #endif // CONFIG_SMP | 260 | #endif /* CONFIG_SMP */ |
167 | 261 | ||
168 | #ifdef CONFIG_IRQBALANCE | 262 | #ifdef CONFIG_IRQBALANCE |
169 | extern void set_balance_irq_affinity(unsigned int irq, cpumask_t mask); | 263 | extern void set_balance_irq_affinity(unsigned int irq, cpumask_t mask); |
@@ -173,32 +267,138 @@ static inline void set_balance_irq_affinity(unsigned int irq, cpumask_t mask) | |||
173 | } | 267 | } |
174 | #endif | 268 | #endif |
175 | 269 | ||
270 | #ifdef CONFIG_AUTO_IRQ_AFFINITY | ||
271 | extern int select_smp_affinity(unsigned int irq); | ||
272 | #else | ||
273 | static inline int select_smp_affinity(unsigned int irq) | ||
274 | { | ||
275 | return 1; | ||
276 | } | ||
277 | #endif | ||
278 | |||
176 | extern int no_irq_affinity; | 279 | extern int no_irq_affinity; |
177 | extern int noirqdebug_setup(char *str); | ||
178 | 280 | ||
179 | extern fastcall irqreturn_t handle_IRQ_event(unsigned int irq, struct pt_regs *regs, | 281 | /* Handle irq action chains: */ |
180 | struct irqaction *action); | 282 | extern int handle_IRQ_event(unsigned int irq, struct pt_regs *regs, |
283 | struct irqaction *action); | ||
284 | |||
285 | /* | ||
286 | * Built-in IRQ handlers for various IRQ types, | ||
287 | * callable via desc->chip->handle_irq() | ||
288 | */ | ||
289 | extern void fastcall | ||
290 | handle_level_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); | ||
291 | extern void fastcall | ||
292 | handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc, | ||
293 | struct pt_regs *regs); | ||
294 | extern void fastcall | ||
295 | handle_edge_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); | ||
296 | extern void fastcall | ||
297 | handle_simple_irq(unsigned int irq, struct irq_desc *desc, | ||
298 | struct pt_regs *regs); | ||
299 | extern void fastcall | ||
300 | handle_percpu_irq(unsigned int irq, struct irq_desc *desc, | ||
301 | struct pt_regs *regs); | ||
302 | extern void fastcall | ||
303 | handle_bad_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); | ||
304 | |||
305 | /* | ||
306 | * Get a descriptive string for the highlevel handler, for | ||
307 | * /proc/interrupts output: | ||
308 | */ | ||
309 | extern const char * | ||
310 | handle_irq_name(void fastcall (*handle)(unsigned int, struct irq_desc *, | ||
311 | struct pt_regs *)); | ||
312 | |||
313 | /* | ||
314 | * Monolithic do_IRQ implementation. | ||
315 | * (is an explicit fastcall, because i386 4KSTACKS calls it from assembly) | ||
316 | */ | ||
181 | extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs); | 317 | extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs); |
182 | extern void note_interrupt(unsigned int irq, irq_desc_t *desc, | ||
183 | int action_ret, struct pt_regs *regs); | ||
184 | extern int can_request_irq(unsigned int irq, unsigned long irqflags); | ||
185 | 318 | ||
319 | /* | ||
320 | * Architectures call this to let the generic IRQ layer | ||
321 | * handle an interrupt. If the descriptor is attached to an | ||
322 | * irqchip-style controller then we call the ->handle_irq() handler, | ||
323 | * and it calls __do_IRQ() if it's attached to an irqtype-style controller. | ||
324 | */ | ||
325 | static inline void generic_handle_irq(unsigned int irq, struct pt_regs *regs) | ||
326 | { | ||
327 | struct irq_desc *desc = irq_desc + irq; | ||
328 | |||
329 | if (likely(desc->handle_irq)) | ||
330 | desc->handle_irq(irq, desc, regs); | ||
331 | else | ||
332 | __do_IRQ(irq, regs); | ||
333 | } | ||
334 | |||
335 | /* Handling of unhandled and spurious interrupts: */ | ||
336 | extern void note_interrupt(unsigned int irq, struct irq_desc *desc, | ||
337 | int action_ret, struct pt_regs *regs); | ||
338 | |||
339 | /* Resending of interrupts :*/ | ||
340 | void check_irq_resend(struct irq_desc *desc, unsigned int irq); | ||
341 | |||
342 | /* Initialize /proc/irq/ */ | ||
186 | extern void init_irq_proc(void); | 343 | extern void init_irq_proc(void); |
187 | 344 | ||
188 | #ifdef CONFIG_AUTO_IRQ_AFFINITY | 345 | /* Enable/disable irq debugging output: */ |
189 | extern int select_smp_affinity(unsigned int irq); | 346 | extern int noirqdebug_setup(char *str); |
190 | #else | 347 | |
191 | static inline int | 348 | /* Checks whether the interrupt can be requested by request_irq(): */ |
192 | select_smp_affinity(unsigned int irq) | 349 | extern int can_request_irq(unsigned int irq, unsigned long irqflags); |
350 | |||
351 | /* Dummy irq-chip implementation: */ | ||
352 | extern struct irq_chip no_irq_chip; | ||
353 | |||
354 | extern void | ||
355 | set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip, | ||
356 | void fastcall (*handle)(unsigned int, | ||
357 | struct irq_desc *, | ||
358 | struct pt_regs *)); | ||
359 | extern void | ||
360 | __set_irq_handler(unsigned int irq, | ||
361 | void fastcall (*handle)(unsigned int, struct irq_desc *, | ||
362 | struct pt_regs *), | ||
363 | int is_chained); | ||
364 | |||
365 | /* | ||
366 | * Set a highlevel flow handler for a given IRQ: | ||
367 | */ | ||
368 | static inline void | ||
369 | set_irq_handler(unsigned int irq, | ||
370 | void fastcall (*handle)(unsigned int, struct irq_desc *, | ||
371 | struct pt_regs *)) | ||
193 | { | 372 | { |
194 | return 1; | 373 | __set_irq_handler(irq, handle, 0); |
195 | } | 374 | } |
196 | #endif | ||
197 | 375 | ||
198 | #endif | 376 | /* |
377 | * Set a highlevel chained flow handler for a given IRQ. | ||
378 | * (a chained handler is automatically enabled and set to | ||
379 | * IRQ_NOREQUEST and IRQ_NOPROBE) | ||
380 | */ | ||
381 | static inline void | ||
382 | set_irq_chained_handler(unsigned int irq, | ||
383 | void fastcall (*handle)(unsigned int, struct irq_desc *, | ||
384 | struct pt_regs *)) | ||
385 | { | ||
386 | __set_irq_handler(irq, handle, 1); | ||
387 | } | ||
199 | 388 | ||
200 | extern hw_irq_controller no_irq_type; /* needed in every arch ? */ | 389 | /* Set/get chip/data for an IRQ: */ |
201 | 390 | ||
202 | #endif | 391 | extern int set_irq_chip(unsigned int irq, struct irq_chip *chip); |
392 | extern int set_irq_data(unsigned int irq, void *data); | ||
393 | extern int set_irq_chip_data(unsigned int irq, void *data); | ||
394 | extern int set_irq_type(unsigned int irq, unsigned int type); | ||
395 | |||
396 | #define get_irq_chip(irq) (irq_desc[irq].chip) | ||
397 | #define get_irq_chip_data(irq) (irq_desc[irq].chip_data) | ||
398 | #define get_irq_data(irq) (irq_desc[irq].handler_data) | ||
399 | |||
400 | #endif /* CONFIG_GENERIC_HARDIRQS */ | ||
401 | |||
402 | #endif /* !CONFIG_S390 */ | ||
203 | 403 | ||
204 | #endif /* __irq_h */ | 404 | #endif /* _LINUX_IRQ_H */ |
diff --git a/include/linux/isdn/tpam.h b/include/linux/isdn/tpam.h deleted file mode 100644 index d18dd0dc570d..000000000000 --- a/include/linux/isdn/tpam.h +++ /dev/null | |||
@@ -1,55 +0,0 @@ | |||
1 | /* $Id: tpam.h,v 1.1.2.1 2001/06/08 08:23:46 kai Exp $ | ||
2 | * | ||
3 | * Turbo PAM ISDN driver for Linux. (Kernel Driver) | ||
4 | * | ||
5 | * Copyright 2001 Stelian Pop <stelian.pop@fr.alcove.com>, Alcôve | ||
6 | * | ||
7 | * For all support questions please contact: <support@auvertech.fr> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2, or (at your option) | ||
12 | * any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | * | ||
23 | */ | ||
24 | |||
25 | #ifndef _TPAM_H_ | ||
26 | #define _TPAM_H_ | ||
27 | |||
28 | #include <linux/types.h> | ||
29 | |||
30 | /* IOCTL commands */ | ||
31 | #define TPAM_CMD_DSPLOAD 0x0001 | ||
32 | #define TPAM_CMD_DSPSAVE 0x0002 | ||
33 | #define TPAM_CMD_DSPRUN 0x0003 | ||
34 | #define TPAM_CMD_LOOPMODEON 0x0004 | ||
35 | #define TPAM_CMD_LOOPMODEOFF 0x0005 | ||
36 | |||
37 | /* addresses of debug information zones on board */ | ||
38 | #define TPAM_TRAPAUDIT_REGISTER 0x005493e4 | ||
39 | #define TPAM_NCOAUDIT_REGISTER 0x00500000 | ||
40 | #define TPAM_MSGAUDIT_REGISTER 0x008E30F0 | ||
41 | |||
42 | /* length of debug information zones on board */ | ||
43 | #define TPAM_TRAPAUDIT_LENGTH 10000 | ||
44 | #define TPAM_NCOAUDIT_LENGTH 300000 | ||
45 | #define TPAM_NCOAUDIT_COUNT 30 | ||
46 | #define TPAM_MSGAUDIT_LENGTH 60000 | ||
47 | |||
48 | /* IOCTL load/save parameter */ | ||
49 | typedef struct tpam_dsp_ioctl { | ||
50 | __u32 address; /* address to load/save data */ | ||
51 | __u32 data_len; /* size of data to be loaded/saved */ | ||
52 | __u8 data[0]; /* data */ | ||
53 | } tpam_dsp_ioctl; | ||
54 | |||
55 | #endif /* _TPAM_H_ */ | ||
diff --git a/include/linux/kbd_kern.h b/include/linux/kbd_kern.h index 4eb851ece080..efe0ee4cc80b 100644 --- a/include/linux/kbd_kern.h +++ b/include/linux/kbd_kern.h | |||
@@ -155,10 +155,8 @@ static inline void con_schedule_flip(struct tty_struct *t) | |||
155 | { | 155 | { |
156 | unsigned long flags; | 156 | unsigned long flags; |
157 | spin_lock_irqsave(&t->buf.lock, flags); | 157 | spin_lock_irqsave(&t->buf.lock, flags); |
158 | if (t->buf.tail != NULL) { | 158 | if (t->buf.tail != NULL) |
159 | t->buf.tail->active = 0; | ||
160 | t->buf.tail->commit = t->buf.tail->used; | 159 | t->buf.tail->commit = t->buf.tail->used; |
161 | } | ||
162 | spin_unlock_irqrestore(&t->buf.lock, flags); | 160 | spin_unlock_irqrestore(&t->buf.lock, flags); |
163 | schedule_work(&t->buf.work); | 161 | schedule_work(&t->buf.work); |
164 | } | 162 | } |
diff --git a/include/linux/key.h b/include/linux/key.h index e693e729bc92..169f05e4863e 100644 --- a/include/linux/key.h +++ b/include/linux/key.h | |||
@@ -177,7 +177,8 @@ struct key { | |||
177 | /* | 177 | /* |
178 | * kernel managed key type definition | 178 | * kernel managed key type definition |
179 | */ | 179 | */ |
180 | typedef int (*request_key_actor_t)(struct key *key, struct key *authkey, const char *op); | 180 | typedef int (*request_key_actor_t)(struct key *key, struct key *authkey, |
181 | const char *op, void *aux); | ||
181 | 182 | ||
182 | struct key_type { | 183 | struct key_type { |
183 | /* name of the type */ | 184 | /* name of the type */ |
@@ -285,6 +286,11 @@ extern struct key *request_key(struct key_type *type, | |||
285 | const char *description, | 286 | const char *description, |
286 | const char *callout_info); | 287 | const char *callout_info); |
287 | 288 | ||
289 | extern struct key *request_key_with_auxdata(struct key_type *type, | ||
290 | const char *description, | ||
291 | const char *callout_info, | ||
292 | void *aux); | ||
293 | |||
288 | extern int key_validate(struct key *key); | 294 | extern int key_validate(struct key *key); |
289 | 295 | ||
290 | extern key_ref_t key_create_or_update(key_ref_t keyring, | 296 | extern key_ref_t key_create_or_update(key_ref_t keyring, |
diff --git a/include/linux/module.h b/include/linux/module.h index 9ebbb74b7b72..9e9dc7c24d95 100644 --- a/include/linux/module.h +++ b/include/linux/module.h | |||
@@ -203,6 +203,15 @@ void *__symbol_get_gpl(const char *symbol); | |||
203 | #define EXPORT_SYMBOL_GPL_FUTURE(sym) \ | 203 | #define EXPORT_SYMBOL_GPL_FUTURE(sym) \ |
204 | __EXPORT_SYMBOL(sym, "_gpl_future") | 204 | __EXPORT_SYMBOL(sym, "_gpl_future") |
205 | 205 | ||
206 | |||
207 | #ifdef CONFIG_UNUSED_SYMBOLS | ||
208 | #define EXPORT_UNUSED_SYMBOL(sym) __EXPORT_SYMBOL(sym, "_unused") | ||
209 | #define EXPORT_UNUSED_SYMBOL_GPL(sym) __EXPORT_SYMBOL(sym, "_unused_gpl") | ||
210 | #else | ||
211 | #define EXPORT_UNUSED_SYMBOL(sym) | ||
212 | #define EXPORT_UNUSED_SYMBOL_GPL(sym) | ||
213 | #endif | ||
214 | |||
206 | #endif | 215 | #endif |
207 | 216 | ||
208 | struct module_ref | 217 | struct module_ref |
@@ -261,6 +270,15 @@ struct module | |||
261 | unsigned int num_gpl_syms; | 270 | unsigned int num_gpl_syms; |
262 | const unsigned long *gpl_crcs; | 271 | const unsigned long *gpl_crcs; |
263 | 272 | ||
273 | /* unused exported symbols. */ | ||
274 | const struct kernel_symbol *unused_syms; | ||
275 | unsigned int num_unused_syms; | ||
276 | const unsigned long *unused_crcs; | ||
277 | /* GPL-only, unused exported symbols. */ | ||
278 | const struct kernel_symbol *unused_gpl_syms; | ||
279 | unsigned int num_unused_gpl_syms; | ||
280 | const unsigned long *unused_gpl_crcs; | ||
281 | |||
264 | /* symbols that will be GPL-only in the near future. */ | 282 | /* symbols that will be GPL-only in the near future. */ |
265 | const struct kernel_symbol *gpl_future_syms; | 283 | const struct kernel_symbol *gpl_future_syms; |
266 | unsigned int num_gpl_future_syms; | 284 | unsigned int num_gpl_future_syms; |
@@ -456,6 +474,8 @@ void module_remove_driver(struct device_driver *); | |||
456 | #define EXPORT_SYMBOL(sym) | 474 | #define EXPORT_SYMBOL(sym) |
457 | #define EXPORT_SYMBOL_GPL(sym) | 475 | #define EXPORT_SYMBOL_GPL(sym) |
458 | #define EXPORT_SYMBOL_GPL_FUTURE(sym) | 476 | #define EXPORT_SYMBOL_GPL_FUTURE(sym) |
477 | #define EXPORT_UNUSED_SYMBOL(sym) | ||
478 | #define EXPORT_UNUSED_SYMBOL_GPL(sym) | ||
459 | 479 | ||
460 | /* Given an address, look for it in the exception tables. */ | 480 | /* Given an address, look for it in the exception tables. */ |
461 | static inline const struct exception_table_entry * | 481 | static inline const struct exception_table_entry * |
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 0a1740b2532e..d90b1bb37563 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
@@ -335,7 +335,7 @@ extern struct inode_operations nfs_file_inode_operations; | |||
335 | extern struct inode_operations nfs3_file_inode_operations; | 335 | extern struct inode_operations nfs3_file_inode_operations; |
336 | #endif /* CONFIG_NFS_V3 */ | 336 | #endif /* CONFIG_NFS_V3 */ |
337 | extern const struct file_operations nfs_file_operations; | 337 | extern const struct file_operations nfs_file_operations; |
338 | extern struct address_space_operations nfs_file_aops; | 338 | extern const struct address_space_operations nfs_file_aops; |
339 | 339 | ||
340 | static inline struct rpc_cred *nfs_file_cred(struct file *file) | 340 | static inline struct rpc_cred *nfs_file_cred(struct file *file) |
341 | { | 341 | { |
diff --git a/include/linux/pci.h b/include/linux/pci.h index 62a8c22f5f60..983fca251b25 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -404,8 +404,8 @@ int pcibios_enable_device(struct pci_dev *, int mask); | |||
404 | char *pcibios_setup (char *str); | 404 | char *pcibios_setup (char *str); |
405 | 405 | ||
406 | /* Used only when drivers/pci/setup.c is used */ | 406 | /* Used only when drivers/pci/setup.c is used */ |
407 | void pcibios_align_resource(void *, struct resource *, | 407 | void pcibios_align_resource(void *, struct resource *, resource_size_t, |
408 | unsigned long, unsigned long); | 408 | resource_size_t); |
409 | void pcibios_update_irq(struct pci_dev *, int irq); | 409 | void pcibios_update_irq(struct pci_dev *, int irq); |
410 | 410 | ||
411 | /* Generic PCI functions used internally */ | 411 | /* Generic PCI functions used internally */ |
@@ -532,10 +532,10 @@ void pci_release_region(struct pci_dev *, int); | |||
532 | 532 | ||
533 | /* drivers/pci/bus.c */ | 533 | /* drivers/pci/bus.c */ |
534 | int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, | 534 | int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, |
535 | unsigned long size, unsigned long align, | 535 | resource_size_t size, resource_size_t align, |
536 | unsigned long min, unsigned int type_mask, | 536 | resource_size_t min, unsigned int type_mask, |
537 | void (*alignf)(void *, struct resource *, | 537 | void (*alignf)(void *, struct resource *, |
538 | unsigned long, unsigned long), | 538 | resource_size_t, resource_size_t), |
539 | void *alignf_data); | 539 | void *alignf_data); |
540 | void pci_enable_bridges(struct pci_bus *bus); | 540 | void pci_enable_bridges(struct pci_bus *bus); |
541 | 541 | ||
@@ -730,7 +730,8 @@ static inline char *pci_name(struct pci_dev *pdev) | |||
730 | */ | 730 | */ |
731 | #ifndef HAVE_ARCH_PCI_RESOURCE_TO_USER | 731 | #ifndef HAVE_ARCH_PCI_RESOURCE_TO_USER |
732 | static inline void pci_resource_to_user(const struct pci_dev *dev, int bar, | 732 | static inline void pci_resource_to_user(const struct pci_dev *dev, int bar, |
733 | const struct resource *rsrc, u64 *start, u64 *end) | 733 | const struct resource *rsrc, resource_size_t *start, |
734 | resource_size_t *end) | ||
734 | { | 735 | { |
735 | *start = rsrc->start; | 736 | *start = rsrc->start; |
736 | *end = rsrc->end; | 737 | *end = rsrc->end; |
diff --git a/include/linux/plist.h b/include/linux/plist.h index 3404faef542c..b95818a037ad 100644 --- a/include/linux/plist.h +++ b/include/linux/plist.h | |||
@@ -73,6 +73,7 @@ | |||
73 | #ifndef _LINUX_PLIST_H_ | 73 | #ifndef _LINUX_PLIST_H_ |
74 | #define _LINUX_PLIST_H_ | 74 | #define _LINUX_PLIST_H_ |
75 | 75 | ||
76 | #include <linux/kernel.h> | ||
76 | #include <linux/list.h> | 77 | #include <linux/list.h> |
77 | #include <linux/spinlock_types.h> | 78 | #include <linux/spinlock_types.h> |
78 | 79 | ||
diff --git a/include/linux/pnp.h b/include/linux/pnp.h index 93b0959eb40f..ab8a8dd8d64c 100644 --- a/include/linux/pnp.h +++ b/include/linux/pnp.h | |||
@@ -389,7 +389,8 @@ int pnp_start_dev(struct pnp_dev *dev); | |||
389 | int pnp_stop_dev(struct pnp_dev *dev); | 389 | int pnp_stop_dev(struct pnp_dev *dev); |
390 | int pnp_activate_dev(struct pnp_dev *dev); | 390 | int pnp_activate_dev(struct pnp_dev *dev); |
391 | int pnp_disable_dev(struct pnp_dev *dev); | 391 | int pnp_disable_dev(struct pnp_dev *dev); |
392 | void pnp_resource_change(struct resource *resource, unsigned long start, unsigned long size); | 392 | void pnp_resource_change(struct resource *resource, resource_size_t start, |
393 | resource_size_t size); | ||
393 | 394 | ||
394 | /* protocol helpers */ | 395 | /* protocol helpers */ |
395 | int pnp_is_active(struct pnp_dev * dev); | 396 | int pnp_is_active(struct pnp_dev * dev); |
@@ -434,7 +435,9 @@ static inline int pnp_start_dev(struct pnp_dev *dev) { return -ENODEV; } | |||
434 | static inline int pnp_stop_dev(struct pnp_dev *dev) { return -ENODEV; } | 435 | static inline int pnp_stop_dev(struct pnp_dev *dev) { return -ENODEV; } |
435 | static inline int pnp_activate_dev(struct pnp_dev *dev) { return -ENODEV; } | 436 | static inline int pnp_activate_dev(struct pnp_dev *dev) { return -ENODEV; } |
436 | static inline int pnp_disable_dev(struct pnp_dev *dev) { return -ENODEV; } | 437 | static inline int pnp_disable_dev(struct pnp_dev *dev) { return -ENODEV; } |
437 | static inline void pnp_resource_change(struct resource *resource, unsigned long start, unsigned long size) { } | 438 | static inline void pnp_resource_change(struct resource *resource, |
439 | resource_size_t start, | ||
440 | resource_size_t size) { } | ||
438 | 441 | ||
439 | /* protocol helpers */ | 442 | /* protocol helpers */ |
440 | static inline int pnp_is_active(struct pnp_dev * dev) { return 0; } | 443 | static inline int pnp_is_active(struct pnp_dev * dev) { return 0; } |
diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h index 5676c4210e2c..daa2d83cefe8 100644 --- a/include/linux/reiserfs_fs.h +++ b/include/linux/reiserfs_fs.h | |||
@@ -1973,7 +1973,7 @@ void reiserfs_unmap_buffer(struct buffer_head *); | |||
1973 | /* file.c */ | 1973 | /* file.c */ |
1974 | extern struct inode_operations reiserfs_file_inode_operations; | 1974 | extern struct inode_operations reiserfs_file_inode_operations; |
1975 | extern const struct file_operations reiserfs_file_operations; | 1975 | extern const struct file_operations reiserfs_file_operations; |
1976 | extern struct address_space_operations reiserfs_address_space_operations; | 1976 | extern const struct address_space_operations reiserfs_address_space_operations; |
1977 | 1977 | ||
1978 | /* fix_nodes.c */ | 1978 | /* fix_nodes.c */ |
1979 | 1979 | ||
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index e928c0dcc297..c8bb68099eb9 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h | |||
@@ -642,10 +642,14 @@ struct spi_board_info { | |||
642 | u16 bus_num; | 642 | u16 bus_num; |
643 | u16 chip_select; | 643 | u16 chip_select; |
644 | 644 | ||
645 | /* mode becomes spi_device.mode, and is essential for chips | ||
646 | * where the default of SPI_CS_HIGH = 0 is wrong. | ||
647 | */ | ||
648 | u8 mode; | ||
649 | |||
645 | /* ... may need additional spi_device chip config data here. | 650 | /* ... may need additional spi_device chip config data here. |
646 | * avoid stuff protocol drivers can set; but include stuff | 651 | * avoid stuff protocol drivers can set; but include stuff |
647 | * needed to behave without being bound to a driver: | 652 | * needed to behave without being bound to a driver: |
648 | * - chipselect polarity | ||
649 | * - quirks like clock rate mattering when not selected | 653 | * - quirks like clock rate mattering when not selected |
650 | */ | 654 | */ |
651 | }; | 655 | }; |
diff --git a/include/linux/tty.h b/include/linux/tty.h index cb35ca50a0a6..b3b807e4b050 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h | |||
@@ -57,7 +57,6 @@ struct tty_buffer { | |||
57 | unsigned char *flag_buf_ptr; | 57 | unsigned char *flag_buf_ptr; |
58 | int used; | 58 | int used; |
59 | int size; | 59 | int size; |
60 | int active; | ||
61 | int commit; | 60 | int commit; |
62 | int read; | 61 | int read; |
63 | /* Data points here */ | 62 | /* Data points here */ |
@@ -259,7 +258,6 @@ struct tty_struct { | |||
259 | #define TTY_DO_WRITE_WAKEUP 5 /* Call write_wakeup after queuing new */ | 258 | #define TTY_DO_WRITE_WAKEUP 5 /* Call write_wakeup after queuing new */ |
260 | #define TTY_PUSH 6 /* n_tty private */ | 259 | #define TTY_PUSH 6 /* n_tty private */ |
261 | #define TTY_CLOSING 7 /* ->close() in progress */ | 260 | #define TTY_CLOSING 7 /* ->close() in progress */ |
262 | #define TTY_DONT_FLIP 8 /* Defer buffer flip */ | ||
263 | #define TTY_LDISC 9 /* Line discipline attached */ | 261 | #define TTY_LDISC 9 /* Line discipline attached */ |
264 | #define TTY_HW_COOK_OUT 14 /* Hardware can do output cooking */ | 262 | #define TTY_HW_COOK_OUT 14 /* Hardware can do output cooking */ |
265 | #define TTY_HW_COOK_IN 15 /* Hardware can do input cooking */ | 263 | #define TTY_HW_COOK_IN 15 /* Hardware can do input cooking */ |
diff --git a/include/linux/tty_flip.h b/include/linux/tty_flip.h index 31548303ee37..eb677cf56106 100644 --- a/include/linux/tty_flip.h +++ b/include/linux/tty_flip.h | |||
@@ -12,7 +12,7 @@ static inline int tty_insert_flip_char(struct tty_struct *tty, | |||
12 | unsigned char ch, char flag) | 12 | unsigned char ch, char flag) |
13 | { | 13 | { |
14 | struct tty_buffer *tb = tty->buf.tail; | 14 | struct tty_buffer *tb = tty->buf.tail; |
15 | if (tb && tb->active && tb->used < tb->size) { | 15 | if (tb && tb->used < tb->size) { |
16 | tb->flag_buf_ptr[tb->used] = flag; | 16 | tb->flag_buf_ptr[tb->used] = flag; |
17 | tb->char_buf_ptr[tb->used++] = ch; | 17 | tb->char_buf_ptr[tb->used++] = ch; |
18 | return 1; | 18 | return 1; |
diff --git a/include/linux/types.h b/include/linux/types.h index a5e46e783ffa..3f235660a3cd 100644 --- a/include/linux/types.h +++ b/include/linux/types.h | |||
@@ -177,8 +177,15 @@ typedef __u64 __bitwise __be64; | |||
177 | 177 | ||
178 | #ifdef __KERNEL__ | 178 | #ifdef __KERNEL__ |
179 | typedef unsigned __bitwise__ gfp_t; | 179 | typedef unsigned __bitwise__ gfp_t; |
180 | |||
181 | #ifdef CONFIG_RESOURCES_64BIT | ||
182 | typedef u64 resource_size_t; | ||
183 | #else | ||
184 | typedef u32 resource_size_t; | ||
180 | #endif | 185 | #endif |
181 | 186 | ||
187 | #endif /* __KERNEL__ */ | ||
188 | |||
182 | struct ustat { | 189 | struct ustat { |
183 | __kernel_daddr_t f_tfree; | 190 | __kernel_daddr_t f_tfree; |
184 | __kernel_ino_t f_tinode; | 191 | __kernel_ino_t f_tinode; |
diff --git a/include/linux/ufs_fs.h b/include/linux/ufs_fs.h index 914f911325be..e39b7cc43390 100644 --- a/include/linux/ufs_fs.h +++ b/include/linux/ufs_fs.h | |||
@@ -966,7 +966,7 @@ extern void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de, | |||
966 | extern struct inode_operations ufs_file_inode_operations; | 966 | extern struct inode_operations ufs_file_inode_operations; |
967 | extern const struct file_operations ufs_file_operations; | 967 | extern const struct file_operations ufs_file_operations; |
968 | 968 | ||
969 | extern struct address_space_operations ufs_aops; | 969 | extern const struct address_space_operations ufs_aops; |
970 | 970 | ||
971 | /* ialloc.c */ | 971 | /* ialloc.c */ |
972 | extern void ufs_free_inode (struct inode *inode); | 972 | extern void ufs_free_inode (struct inode *inode); |
diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h index 1192ed8f4fe8..011bcfeb9f09 100644 --- a/include/linux/watchdog.h +++ b/include/linux/watchdog.h | |||
@@ -28,6 +28,9 @@ struct watchdog_info { | |||
28 | #define WDIOC_KEEPALIVE _IOR(WATCHDOG_IOCTL_BASE, 5, int) | 28 | #define WDIOC_KEEPALIVE _IOR(WATCHDOG_IOCTL_BASE, 5, int) |
29 | #define WDIOC_SETTIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 6, int) | 29 | #define WDIOC_SETTIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 6, int) |
30 | #define WDIOC_GETTIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 7, int) | 30 | #define WDIOC_GETTIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 7, int) |
31 | #define WDIOC_SETPRETIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 8, int) | ||
32 | #define WDIOC_GETPRETIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 9, int) | ||
33 | #define WDIOC_GETTIMELEFT _IOR(WATCHDOG_IOCTL_BASE, 10, int) | ||
31 | 34 | ||
32 | #define WDIOF_UNKNOWN -1 /* Unknown flag error */ | 35 | #define WDIOF_UNKNOWN -1 /* Unknown flag error */ |
33 | #define WDIOS_UNKNOWN -1 /* Unknown status error */ | 36 | #define WDIOS_UNKNOWN -1 /* Unknown status error */ |
@@ -38,9 +41,10 @@ struct watchdog_info { | |||
38 | #define WDIOF_EXTERN2 0x0008 /* External relay 2 */ | 41 | #define WDIOF_EXTERN2 0x0008 /* External relay 2 */ |
39 | #define WDIOF_POWERUNDER 0x0010 /* Power bad/power fault */ | 42 | #define WDIOF_POWERUNDER 0x0010 /* Power bad/power fault */ |
40 | #define WDIOF_CARDRESET 0x0020 /* Card previously reset the CPU */ | 43 | #define WDIOF_CARDRESET 0x0020 /* Card previously reset the CPU */ |
41 | #define WDIOF_POWEROVER 0x0040 /* Power over voltage */ | 44 | #define WDIOF_POWEROVER 0x0040 /* Power over voltage */ |
42 | #define WDIOF_SETTIMEOUT 0x0080 /* Set timeout (in seconds) */ | 45 | #define WDIOF_SETTIMEOUT 0x0080 /* Set timeout (in seconds) */ |
43 | #define WDIOF_MAGICCLOSE 0x0100 /* Supports magic close char */ | 46 | #define WDIOF_MAGICCLOSE 0x0100 /* Supports magic close char */ |
47 | #define WDIOF_PRETIMEOUT 0x0200 /* Pretimeout (in seconds), get/set */ | ||
44 | #define WDIOF_KEEPALIVEPING 0x8000 /* Keep alive ping reply */ | 48 | #define WDIOF_KEEPALIVEPING 0x8000 /* Keep alive ping reply */ |
45 | 49 | ||
46 | #define WDIOS_DISABLECARD 0x0001 /* Turn off the watchdog timer */ | 50 | #define WDIOS_DISABLECARD 0x0001 /* Turn off the watchdog timer */ |
diff --git a/kernel/irq/Makefile b/kernel/irq/Makefile index 9f77f50d8143..1dab0ac3f797 100644 --- a/kernel/irq/Makefile +++ b/kernel/irq/Makefile | |||
@@ -1,5 +1,5 @@ | |||
1 | 1 | ||
2 | obj-y := handle.o manage.o spurious.o | 2 | obj-y := handle.o manage.o spurious.o resend.o chip.o |
3 | obj-$(CONFIG_GENERIC_IRQ_PROBE) += autoprobe.o | 3 | obj-$(CONFIG_GENERIC_IRQ_PROBE) += autoprobe.o |
4 | obj-$(CONFIG_PROC_FS) += proc.o | 4 | obj-$(CONFIG_PROC_FS) += proc.o |
5 | obj-$(CONFIG_GENERIC_PENDING_IRQ) += migration.o | 5 | obj-$(CONFIG_GENERIC_PENDING_IRQ) += migration.o |
diff --git a/kernel/irq/autoprobe.c b/kernel/irq/autoprobe.c index 3467097ca61a..533068cfb607 100644 --- a/kernel/irq/autoprobe.c +++ b/kernel/irq/autoprobe.c | |||
@@ -11,12 +11,14 @@ | |||
11 | #include <linux/interrupt.h> | 11 | #include <linux/interrupt.h> |
12 | #include <linux/delay.h> | 12 | #include <linux/delay.h> |
13 | 13 | ||
14 | #include "internals.h" | ||
15 | |||
14 | /* | 16 | /* |
15 | * Autodetection depends on the fact that any interrupt that | 17 | * Autodetection depends on the fact that any interrupt that |
16 | * comes in on to an unassigned handler will get stuck with | 18 | * comes in on to an unassigned handler will get stuck with |
17 | * "IRQ_WAITING" cleared and the interrupt disabled. | 19 | * "IRQ_WAITING" cleared and the interrupt disabled. |
18 | */ | 20 | */ |
19 | static DECLARE_MUTEX(probe_sem); | 21 | static DEFINE_MUTEX(probing_active); |
20 | 22 | ||
21 | /** | 23 | /** |
22 | * probe_irq_on - begin an interrupt autodetect | 24 | * probe_irq_on - begin an interrupt autodetect |
@@ -27,11 +29,11 @@ static DECLARE_MUTEX(probe_sem); | |||
27 | */ | 29 | */ |
28 | unsigned long probe_irq_on(void) | 30 | unsigned long probe_irq_on(void) |
29 | { | 31 | { |
30 | unsigned long val; | 32 | struct irq_desc *desc; |
31 | irq_desc_t *desc; | 33 | unsigned long mask; |
32 | unsigned int i; | 34 | unsigned int i; |
33 | 35 | ||
34 | down(&probe_sem); | 36 | mutex_lock(&probing_active); |
35 | /* | 37 | /* |
36 | * something may have generated an irq long ago and we want to | 38 | * something may have generated an irq long ago and we want to |
37 | * flush such a longstanding irq before considering it as spurious. | 39 | * flush such a longstanding irq before considering it as spurious. |
@@ -40,8 +42,21 @@ unsigned long probe_irq_on(void) | |||
40 | desc = irq_desc + i; | 42 | desc = irq_desc + i; |
41 | 43 | ||
42 | spin_lock_irq(&desc->lock); | 44 | spin_lock_irq(&desc->lock); |
43 | if (!irq_desc[i].action) | 45 | if (!desc->action && !(desc->status & IRQ_NOPROBE)) { |
44 | irq_desc[i].handler->startup(i); | 46 | /* |
47 | * An old-style architecture might still have | ||
48 | * the handle_bad_irq handler there: | ||
49 | */ | ||
50 | compat_irq_chip_set_default_handler(desc); | ||
51 | |||
52 | /* | ||
53 | * Some chips need to know about probing in | ||
54 | * progress: | ||
55 | */ | ||
56 | if (desc->chip->set_type) | ||
57 | desc->chip->set_type(i, IRQ_TYPE_PROBE); | ||
58 | desc->chip->startup(i); | ||
59 | } | ||
45 | spin_unlock_irq(&desc->lock); | 60 | spin_unlock_irq(&desc->lock); |
46 | } | 61 | } |
47 | 62 | ||
@@ -57,9 +72,9 @@ unsigned long probe_irq_on(void) | |||
57 | desc = irq_desc + i; | 72 | desc = irq_desc + i; |
58 | 73 | ||
59 | spin_lock_irq(&desc->lock); | 74 | spin_lock_irq(&desc->lock); |
60 | if (!desc->action) { | 75 | if (!desc->action && !(desc->status & IRQ_NOPROBE)) { |
61 | desc->status |= IRQ_AUTODETECT | IRQ_WAITING; | 76 | desc->status |= IRQ_AUTODETECT | IRQ_WAITING; |
62 | if (desc->handler->startup(i)) | 77 | if (desc->chip->startup(i)) |
63 | desc->status |= IRQ_PENDING; | 78 | desc->status |= IRQ_PENDING; |
64 | } | 79 | } |
65 | spin_unlock_irq(&desc->lock); | 80 | spin_unlock_irq(&desc->lock); |
@@ -73,11 +88,11 @@ unsigned long probe_irq_on(void) | |||
73 | /* | 88 | /* |
74 | * Now filter out any obviously spurious interrupts | 89 | * Now filter out any obviously spurious interrupts |
75 | */ | 90 | */ |
76 | val = 0; | 91 | mask = 0; |
77 | for (i = 0; i < NR_IRQS; i++) { | 92 | for (i = 0; i < NR_IRQS; i++) { |
78 | irq_desc_t *desc = irq_desc + i; | ||
79 | unsigned int status; | 93 | unsigned int status; |
80 | 94 | ||
95 | desc = irq_desc + i; | ||
81 | spin_lock_irq(&desc->lock); | 96 | spin_lock_irq(&desc->lock); |
82 | status = desc->status; | 97 | status = desc->status; |
83 | 98 | ||
@@ -85,17 +100,16 @@ unsigned long probe_irq_on(void) | |||
85 | /* It triggered already - consider it spurious. */ | 100 | /* It triggered already - consider it spurious. */ |
86 | if (!(status & IRQ_WAITING)) { | 101 | if (!(status & IRQ_WAITING)) { |
87 | desc->status = status & ~IRQ_AUTODETECT; | 102 | desc->status = status & ~IRQ_AUTODETECT; |
88 | desc->handler->shutdown(i); | 103 | desc->chip->shutdown(i); |
89 | } else | 104 | } else |
90 | if (i < 32) | 105 | if (i < 32) |
91 | val |= 1 << i; | 106 | mask |= 1 << i; |
92 | } | 107 | } |
93 | spin_unlock_irq(&desc->lock); | 108 | spin_unlock_irq(&desc->lock); |
94 | } | 109 | } |
95 | 110 | ||
96 | return val; | 111 | return mask; |
97 | } | 112 | } |
98 | |||
99 | EXPORT_SYMBOL(probe_irq_on); | 113 | EXPORT_SYMBOL(probe_irq_on); |
100 | 114 | ||
101 | /** | 115 | /** |
@@ -117,7 +131,7 @@ unsigned int probe_irq_mask(unsigned long val) | |||
117 | 131 | ||
118 | mask = 0; | 132 | mask = 0; |
119 | for (i = 0; i < NR_IRQS; i++) { | 133 | for (i = 0; i < NR_IRQS; i++) { |
120 | irq_desc_t *desc = irq_desc + i; | 134 | struct irq_desc *desc = irq_desc + i; |
121 | unsigned int status; | 135 | unsigned int status; |
122 | 136 | ||
123 | spin_lock_irq(&desc->lock); | 137 | spin_lock_irq(&desc->lock); |
@@ -128,11 +142,11 @@ unsigned int probe_irq_mask(unsigned long val) | |||
128 | mask |= 1 << i; | 142 | mask |= 1 << i; |
129 | 143 | ||
130 | desc->status = status & ~IRQ_AUTODETECT; | 144 | desc->status = status & ~IRQ_AUTODETECT; |
131 | desc->handler->shutdown(i); | 145 | desc->chip->shutdown(i); |
132 | } | 146 | } |
133 | spin_unlock_irq(&desc->lock); | 147 | spin_unlock_irq(&desc->lock); |
134 | } | 148 | } |
135 | up(&probe_sem); | 149 | mutex_unlock(&probing_active); |
136 | 150 | ||
137 | return mask & val; | 151 | return mask & val; |
138 | } | 152 | } |
@@ -160,7 +174,7 @@ int probe_irq_off(unsigned long val) | |||
160 | int i, irq_found = 0, nr_irqs = 0; | 174 | int i, irq_found = 0, nr_irqs = 0; |
161 | 175 | ||
162 | for (i = 0; i < NR_IRQS; i++) { | 176 | for (i = 0; i < NR_IRQS; i++) { |
163 | irq_desc_t *desc = irq_desc + i; | 177 | struct irq_desc *desc = irq_desc + i; |
164 | unsigned int status; | 178 | unsigned int status; |
165 | 179 | ||
166 | spin_lock_irq(&desc->lock); | 180 | spin_lock_irq(&desc->lock); |
@@ -173,16 +187,16 @@ int probe_irq_off(unsigned long val) | |||
173 | nr_irqs++; | 187 | nr_irqs++; |
174 | } | 188 | } |
175 | desc->status = status & ~IRQ_AUTODETECT; | 189 | desc->status = status & ~IRQ_AUTODETECT; |
176 | desc->handler->shutdown(i); | 190 | desc->chip->shutdown(i); |
177 | } | 191 | } |
178 | spin_unlock_irq(&desc->lock); | 192 | spin_unlock_irq(&desc->lock); |
179 | } | 193 | } |
180 | up(&probe_sem); | 194 | mutex_unlock(&probing_active); |
181 | 195 | ||
182 | if (nr_irqs > 1) | 196 | if (nr_irqs > 1) |
183 | irq_found = -irq_found; | 197 | irq_found = -irq_found; |
198 | |||
184 | return irq_found; | 199 | return irq_found; |
185 | } | 200 | } |
186 | |||
187 | EXPORT_SYMBOL(probe_irq_off); | 201 | EXPORT_SYMBOL(probe_irq_off); |
188 | 202 | ||
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c new file mode 100644 index 000000000000..4a0952d9458b --- /dev/null +++ b/kernel/irq/chip.c | |||
@@ -0,0 +1,525 @@ | |||
1 | /* | ||
2 | * linux/kernel/irq/chip.c | ||
3 | * | ||
4 | * Copyright (C) 1992, 1998-2006 Linus Torvalds, Ingo Molnar | ||
5 | * Copyright (C) 2005-2006, Thomas Gleixner, Russell King | ||
6 | * | ||
7 | * This file contains the core interrupt handling code, for irq-chip | ||
8 | * based architectures. | ||
9 | * | ||
10 | * Detailed information is available in Documentation/DocBook/genericirq | ||
11 | */ | ||
12 | |||
13 | #include <linux/irq.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <linux/interrupt.h> | ||
16 | #include <linux/kernel_stat.h> | ||
17 | |||
18 | #include "internals.h" | ||
19 | |||
20 | /** | ||
21 | * set_irq_chip - set the irq chip for an irq | ||
22 | * @irq: irq number | ||
23 | * @chip: pointer to irq chip description structure | ||
24 | */ | ||
25 | int set_irq_chip(unsigned int irq, struct irq_chip *chip) | ||
26 | { | ||
27 | struct irq_desc *desc; | ||
28 | unsigned long flags; | ||
29 | |||
30 | if (irq >= NR_IRQS) { | ||
31 | printk(KERN_ERR "Trying to install chip for IRQ%d\n", irq); | ||
32 | WARN_ON(1); | ||
33 | return -EINVAL; | ||
34 | } | ||
35 | |||
36 | if (!chip) | ||
37 | chip = &no_irq_chip; | ||
38 | |||
39 | desc = irq_desc + irq; | ||
40 | spin_lock_irqsave(&desc->lock, flags); | ||
41 | irq_chip_set_defaults(chip); | ||
42 | desc->chip = chip; | ||
43 | /* | ||
44 | * For compatibility only: | ||
45 | */ | ||
46 | desc->chip = chip; | ||
47 | spin_unlock_irqrestore(&desc->lock, flags); | ||
48 | |||
49 | return 0; | ||
50 | } | ||
51 | EXPORT_SYMBOL(set_irq_chip); | ||
52 | |||
53 | /** | ||
54 | * set_irq_type - set the irq type for an irq | ||
55 | * @irq: irq number | ||
56 | * @type: interrupt type - see include/linux/interrupt.h | ||
57 | */ | ||
58 | int set_irq_type(unsigned int irq, unsigned int type) | ||
59 | { | ||
60 | struct irq_desc *desc; | ||
61 | unsigned long flags; | ||
62 | int ret = -ENXIO; | ||
63 | |||
64 | if (irq >= NR_IRQS) { | ||
65 | printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq); | ||
66 | return -ENODEV; | ||
67 | } | ||
68 | |||
69 | desc = irq_desc + irq; | ||
70 | if (desc->chip->set_type) { | ||
71 | spin_lock_irqsave(&desc->lock, flags); | ||
72 | ret = desc->chip->set_type(irq, type); | ||
73 | spin_unlock_irqrestore(&desc->lock, flags); | ||
74 | } | ||
75 | return ret; | ||
76 | } | ||
77 | EXPORT_SYMBOL(set_irq_type); | ||
78 | |||
79 | /** | ||
80 | * set_irq_data - set irq type data for an irq | ||
81 | * @irq: Interrupt number | ||
82 | * @data: Pointer to interrupt specific data | ||
83 | * | ||
84 | * Set the hardware irq controller data for an irq | ||
85 | */ | ||
86 | int set_irq_data(unsigned int irq, void *data) | ||
87 | { | ||
88 | struct irq_desc *desc; | ||
89 | unsigned long flags; | ||
90 | |||
91 | if (irq >= NR_IRQS) { | ||
92 | printk(KERN_ERR | ||
93 | "Trying to install controller data for IRQ%d\n", irq); | ||
94 | return -EINVAL; | ||
95 | } | ||
96 | |||
97 | desc = irq_desc + irq; | ||
98 | spin_lock_irqsave(&desc->lock, flags); | ||
99 | desc->handler_data = data; | ||
100 | spin_unlock_irqrestore(&desc->lock, flags); | ||
101 | return 0; | ||
102 | } | ||
103 | EXPORT_SYMBOL(set_irq_data); | ||
104 | |||
105 | /** | ||
106 | * set_irq_chip_data - set irq chip data for an irq | ||
107 | * @irq: Interrupt number | ||
108 | * @data: Pointer to chip specific data | ||
109 | * | ||
110 | * Set the hardware irq chip data for an irq | ||
111 | */ | ||
112 | int set_irq_chip_data(unsigned int irq, void *data) | ||
113 | { | ||
114 | struct irq_desc *desc = irq_desc + irq; | ||
115 | unsigned long flags; | ||
116 | |||
117 | if (irq >= NR_IRQS || !desc->chip) { | ||
118 | printk(KERN_ERR "BUG: bad set_irq_chip_data(IRQ#%d)\n", irq); | ||
119 | return -EINVAL; | ||
120 | } | ||
121 | |||
122 | spin_lock_irqsave(&desc->lock, flags); | ||
123 | desc->chip_data = data; | ||
124 | spin_unlock_irqrestore(&desc->lock, flags); | ||
125 | |||
126 | return 0; | ||
127 | } | ||
128 | EXPORT_SYMBOL(set_irq_chip_data); | ||
129 | |||
130 | /* | ||
131 | * default enable function | ||
132 | */ | ||
133 | static void default_enable(unsigned int irq) | ||
134 | { | ||
135 | struct irq_desc *desc = irq_desc + irq; | ||
136 | |||
137 | desc->chip->unmask(irq); | ||
138 | desc->status &= ~IRQ_MASKED; | ||
139 | } | ||
140 | |||
141 | /* | ||
142 | * default disable function | ||
143 | */ | ||
144 | static void default_disable(unsigned int irq) | ||
145 | { | ||
146 | struct irq_desc *desc = irq_desc + irq; | ||
147 | |||
148 | if (!(desc->status & IRQ_DELAYED_DISABLE)) | ||
149 | irq_desc[irq].chip->mask(irq); | ||
150 | } | ||
151 | |||
152 | /* | ||
153 | * default startup function | ||
154 | */ | ||
155 | static unsigned int default_startup(unsigned int irq) | ||
156 | { | ||
157 | irq_desc[irq].chip->enable(irq); | ||
158 | |||
159 | return 0; | ||
160 | } | ||
161 | |||
162 | /* | ||
163 | * Fixup enable/disable function pointers | ||
164 | */ | ||
165 | void irq_chip_set_defaults(struct irq_chip *chip) | ||
166 | { | ||
167 | if (!chip->enable) | ||
168 | chip->enable = default_enable; | ||
169 | if (!chip->disable) | ||
170 | chip->disable = default_disable; | ||
171 | if (!chip->startup) | ||
172 | chip->startup = default_startup; | ||
173 | if (!chip->shutdown) | ||
174 | chip->shutdown = chip->disable; | ||
175 | if (!chip->name) | ||
176 | chip->name = chip->typename; | ||
177 | } | ||
178 | |||
179 | static inline void mask_ack_irq(struct irq_desc *desc, int irq) | ||
180 | { | ||
181 | if (desc->chip->mask_ack) | ||
182 | desc->chip->mask_ack(irq); | ||
183 | else { | ||
184 | desc->chip->mask(irq); | ||
185 | desc->chip->ack(irq); | ||
186 | } | ||
187 | } | ||
188 | |||
189 | /** | ||
190 | * handle_simple_irq - Simple and software-decoded IRQs. | ||
191 | * @irq: the interrupt number | ||
192 | * @desc: the interrupt description structure for this irq | ||
193 | * @regs: pointer to a register structure | ||
194 | * | ||
195 | * Simple interrupts are either sent from a demultiplexing interrupt | ||
196 | * handler or come from hardware, where no interrupt hardware control | ||
197 | * is necessary. | ||
198 | * | ||
199 | * Note: The caller is expected to handle the ack, clear, mask and | ||
200 | * unmask issues if necessary. | ||
201 | */ | ||
202 | void fastcall | ||
203 | handle_simple_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs) | ||
204 | { | ||
205 | struct irqaction *action; | ||
206 | irqreturn_t action_ret; | ||
207 | const unsigned int cpu = smp_processor_id(); | ||
208 | |||
209 | spin_lock(&desc->lock); | ||
210 | |||
211 | if (unlikely(desc->status & IRQ_INPROGRESS)) | ||
212 | goto out_unlock; | ||
213 | desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); | ||
214 | kstat_cpu(cpu).irqs[irq]++; | ||
215 | |||
216 | action = desc->action; | ||
217 | if (unlikely(!action || (desc->status & IRQ_DISABLED))) | ||
218 | goto out_unlock; | ||
219 | |||
220 | desc->status |= IRQ_INPROGRESS; | ||
221 | spin_unlock(&desc->lock); | ||
222 | |||
223 | action_ret = handle_IRQ_event(irq, regs, action); | ||
224 | if (!noirqdebug) | ||
225 | note_interrupt(irq, desc, action_ret, regs); | ||
226 | |||
227 | spin_lock(&desc->lock); | ||
228 | desc->status &= ~IRQ_INPROGRESS; | ||
229 | out_unlock: | ||
230 | spin_unlock(&desc->lock); | ||
231 | } | ||
232 | |||
233 | /** | ||
234 | * handle_level_irq - Level type irq handler | ||
235 | * @irq: the interrupt number | ||
236 | * @desc: the interrupt description structure for this irq | ||
237 | * @regs: pointer to a register structure | ||
238 | * | ||
239 | * Level type interrupts are active as long as the hardware line has | ||
240 | * the active level. This may require to mask the interrupt and unmask | ||
241 | * it after the associated handler has acknowledged the device, so the | ||
242 | * interrupt line is back to inactive. | ||
243 | */ | ||
244 | void fastcall | ||
245 | handle_level_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs) | ||
246 | { | ||
247 | unsigned int cpu = smp_processor_id(); | ||
248 | struct irqaction *action; | ||
249 | irqreturn_t action_ret; | ||
250 | |||
251 | spin_lock(&desc->lock); | ||
252 | mask_ack_irq(desc, irq); | ||
253 | |||
254 | if (unlikely(desc->status & IRQ_INPROGRESS)) | ||
255 | goto out; | ||
256 | desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); | ||
257 | kstat_cpu(cpu).irqs[irq]++; | ||
258 | |||
259 | /* | ||
260 | * If its disabled or no action available | ||
261 | * keep it masked and get out of here | ||
262 | */ | ||
263 | action = desc->action; | ||
264 | if (unlikely(!action || (desc->status & IRQ_DISABLED))) | ||
265 | goto out; | ||
266 | |||
267 | desc->status |= IRQ_INPROGRESS; | ||
268 | spin_unlock(&desc->lock); | ||
269 | |||
270 | action_ret = handle_IRQ_event(irq, regs, action); | ||
271 | if (!noirqdebug) | ||
272 | note_interrupt(irq, desc, action_ret, regs); | ||
273 | |||
274 | spin_lock(&desc->lock); | ||
275 | desc->status &= ~IRQ_INPROGRESS; | ||
276 | out: | ||
277 | if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask) | ||
278 | desc->chip->unmask(irq); | ||
279 | spin_unlock(&desc->lock); | ||
280 | } | ||
281 | |||
282 | /** | ||
283 | * handle_fasteoi_irq - irq handler for transparent controllers | ||
284 | * @irq: the interrupt number | ||
285 | * @desc: the interrupt description structure for this irq | ||
286 | * @regs: pointer to a register structure | ||
287 | * | ||
288 | * Only a single callback will be issued to the chip: an ->eoi() | ||
289 | * call when the interrupt has been serviced. This enables support | ||
290 | * for modern forms of interrupt handlers, which handle the flow | ||
291 | * details in hardware, transparently. | ||
292 | */ | ||
293 | void fastcall | ||
294 | handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc, | ||
295 | struct pt_regs *regs) | ||
296 | { | ||
297 | unsigned int cpu = smp_processor_id(); | ||
298 | struct irqaction *action; | ||
299 | irqreturn_t action_ret; | ||
300 | |||
301 | spin_lock(&desc->lock); | ||
302 | |||
303 | if (unlikely(desc->status & IRQ_INPROGRESS)) | ||
304 | goto out; | ||
305 | |||
306 | desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); | ||
307 | kstat_cpu(cpu).irqs[irq]++; | ||
308 | |||
309 | /* | ||
310 | * If its disabled or no action available | ||
311 | * keep it masked and get out of here | ||
312 | */ | ||
313 | action = desc->action; | ||
314 | if (unlikely(!action || (desc->status & IRQ_DISABLED))) { | ||
315 | desc->status |= IRQ_PENDING; | ||
316 | goto out; | ||
317 | } | ||
318 | |||
319 | desc->status |= IRQ_INPROGRESS; | ||
320 | desc->status &= ~IRQ_PENDING; | ||
321 | spin_unlock(&desc->lock); | ||
322 | |||
323 | action_ret = handle_IRQ_event(irq, regs, action); | ||
324 | if (!noirqdebug) | ||
325 | note_interrupt(irq, desc, action_ret, regs); | ||
326 | |||
327 | spin_lock(&desc->lock); | ||
328 | desc->status &= ~IRQ_INPROGRESS; | ||
329 | out: | ||
330 | desc->chip->eoi(irq); | ||
331 | |||
332 | spin_unlock(&desc->lock); | ||
333 | } | ||
334 | |||
335 | /** | ||
336 | * handle_edge_irq - edge type IRQ handler | ||
337 | * @irq: the interrupt number | ||
338 | * @desc: the interrupt description structure for this irq | ||
339 | * @regs: pointer to a register structure | ||
340 | * | ||
341 | * Interrupt occures on the falling and/or rising edge of a hardware | ||
342 | * signal. The occurence is latched into the irq controller hardware | ||
343 | * and must be acked in order to be reenabled. After the ack another | ||
344 | * interrupt can happen on the same source even before the first one | ||
345 | * is handled by the assosiacted event handler. If this happens it | ||
346 | * might be necessary to disable (mask) the interrupt depending on the | ||
347 | * controller hardware. This requires to reenable the interrupt inside | ||
348 | * of the loop which handles the interrupts which have arrived while | ||
349 | * the handler was running. If all pending interrupts are handled, the | ||
350 | * loop is left. | ||
351 | */ | ||
352 | void fastcall | ||
353 | handle_edge_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs) | ||
354 | { | ||
355 | const unsigned int cpu = smp_processor_id(); | ||
356 | |||
357 | spin_lock(&desc->lock); | ||
358 | |||
359 | desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); | ||
360 | |||
361 | /* | ||
362 | * If we're currently running this IRQ, or its disabled, | ||
363 | * we shouldn't process the IRQ. Mark it pending, handle | ||
364 | * the necessary masking and go out | ||
365 | */ | ||
366 | if (unlikely((desc->status & (IRQ_INPROGRESS | IRQ_DISABLED)) || | ||
367 | !desc->action)) { | ||
368 | desc->status |= (IRQ_PENDING | IRQ_MASKED); | ||
369 | mask_ack_irq(desc, irq); | ||
370 | goto out_unlock; | ||
371 | } | ||
372 | |||
373 | kstat_cpu(cpu).irqs[irq]++; | ||
374 | |||
375 | /* Start handling the irq */ | ||
376 | desc->chip->ack(irq); | ||
377 | |||
378 | /* Mark the IRQ currently in progress.*/ | ||
379 | desc->status |= IRQ_INPROGRESS; | ||
380 | |||
381 | do { | ||
382 | struct irqaction *action = desc->action; | ||
383 | irqreturn_t action_ret; | ||
384 | |||
385 | if (unlikely(!action)) { | ||
386 | desc->chip->mask(irq); | ||
387 | goto out_unlock; | ||
388 | } | ||
389 | |||
390 | /* | ||
391 | * When another irq arrived while we were handling | ||
392 | * one, we could have masked the irq. | ||
393 | * Renable it, if it was not disabled in meantime. | ||
394 | */ | ||
395 | if (unlikely((desc->status & | ||
396 | (IRQ_PENDING | IRQ_MASKED | IRQ_DISABLED)) == | ||
397 | (IRQ_PENDING | IRQ_MASKED))) { | ||
398 | desc->chip->unmask(irq); | ||
399 | desc->status &= ~IRQ_MASKED; | ||
400 | } | ||
401 | |||
402 | desc->status &= ~IRQ_PENDING; | ||
403 | spin_unlock(&desc->lock); | ||
404 | action_ret = handle_IRQ_event(irq, regs, action); | ||
405 | if (!noirqdebug) | ||
406 | note_interrupt(irq, desc, action_ret, regs); | ||
407 | spin_lock(&desc->lock); | ||
408 | |||
409 | } while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING); | ||
410 | |||
411 | desc->status &= ~IRQ_INPROGRESS; | ||
412 | out_unlock: | ||
413 | spin_unlock(&desc->lock); | ||
414 | } | ||
415 | |||
416 | #ifdef CONFIG_SMP | ||
417 | /** | ||
418 | * handle_percpu_IRQ - Per CPU local irq handler | ||
419 | * @irq: the interrupt number | ||
420 | * @desc: the interrupt description structure for this irq | ||
421 | * @regs: pointer to a register structure | ||
422 | * | ||
423 | * Per CPU interrupts on SMP machines without locking requirements | ||
424 | */ | ||
425 | void fastcall | ||
426 | handle_percpu_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs) | ||
427 | { | ||
428 | irqreturn_t action_ret; | ||
429 | |||
430 | kstat_this_cpu.irqs[irq]++; | ||
431 | |||
432 | if (desc->chip->ack) | ||
433 | desc->chip->ack(irq); | ||
434 | |||
435 | action_ret = handle_IRQ_event(irq, regs, desc->action); | ||
436 | if (!noirqdebug) | ||
437 | note_interrupt(irq, desc, action_ret, regs); | ||
438 | |||
439 | if (desc->chip->eoi) | ||
440 | desc->chip->eoi(irq); | ||
441 | } | ||
442 | |||
443 | #endif /* CONFIG_SMP */ | ||
444 | |||
445 | void | ||
446 | __set_irq_handler(unsigned int irq, | ||
447 | void fastcall (*handle)(unsigned int, irq_desc_t *, | ||
448 | struct pt_regs *), | ||
449 | int is_chained) | ||
450 | { | ||
451 | struct irq_desc *desc; | ||
452 | unsigned long flags; | ||
453 | |||
454 | if (irq >= NR_IRQS) { | ||
455 | printk(KERN_ERR | ||
456 | "Trying to install type control for IRQ%d\n", irq); | ||
457 | return; | ||
458 | } | ||
459 | |||
460 | desc = irq_desc + irq; | ||
461 | |||
462 | if (!handle) | ||
463 | handle = handle_bad_irq; | ||
464 | |||
465 | if (is_chained && desc->chip == &no_irq_chip) | ||
466 | printk(KERN_WARNING "Trying to install " | ||
467 | "chained interrupt type for IRQ%d\n", irq); | ||
468 | |||
469 | spin_lock_irqsave(&desc->lock, flags); | ||
470 | |||
471 | /* Uninstall? */ | ||
472 | if (handle == handle_bad_irq) { | ||
473 | if (desc->chip != &no_irq_chip) { | ||
474 | desc->chip->mask(irq); | ||
475 | desc->chip->ack(irq); | ||
476 | } | ||
477 | desc->status |= IRQ_DISABLED; | ||
478 | desc->depth = 1; | ||
479 | } | ||
480 | desc->handle_irq = handle; | ||
481 | |||
482 | if (handle != handle_bad_irq && is_chained) { | ||
483 | desc->status &= ~IRQ_DISABLED; | ||
484 | desc->status |= IRQ_NOREQUEST | IRQ_NOPROBE; | ||
485 | desc->depth = 0; | ||
486 | desc->chip->unmask(irq); | ||
487 | } | ||
488 | spin_unlock_irqrestore(&desc->lock, flags); | ||
489 | } | ||
490 | |||
491 | void | ||
492 | set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip, | ||
493 | void fastcall (*handle)(unsigned int, | ||
494 | struct irq_desc *, | ||
495 | struct pt_regs *)) | ||
496 | { | ||
497 | set_irq_chip(irq, chip); | ||
498 | __set_irq_handler(irq, handle, 0); | ||
499 | } | ||
500 | |||
501 | /* | ||
502 | * Get a descriptive string for the highlevel handler, for | ||
503 | * /proc/interrupts output: | ||
504 | */ | ||
505 | const char * | ||
506 | handle_irq_name(void fastcall (*handle)(unsigned int, struct irq_desc *, | ||
507 | struct pt_regs *)) | ||
508 | { | ||
509 | if (handle == handle_level_irq) | ||
510 | return "level "; | ||
511 | if (handle == handle_fasteoi_irq) | ||
512 | return "fasteoi"; | ||
513 | if (handle == handle_edge_irq) | ||
514 | return "edge "; | ||
515 | if (handle == handle_simple_irq) | ||
516 | return "simple "; | ||
517 | #ifdef CONFIG_SMP | ||
518 | if (handle == handle_percpu_irq) | ||
519 | return "percpu "; | ||
520 | #endif | ||
521 | if (handle == handle_bad_irq) | ||
522 | return "bad "; | ||
523 | |||
524 | return NULL; | ||
525 | } | ||
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 0f6530117105..5a360dd4331b 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c | |||
@@ -1,9 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * linux/kernel/irq/handle.c | 2 | * linux/kernel/irq/handle.c |
3 | * | 3 | * |
4 | * Copyright (C) 1992, 1998-2004 Linus Torvalds, Ingo Molnar | 4 | * Copyright (C) 1992, 1998-2006 Linus Torvalds, Ingo Molnar |
5 | * Copyright (C) 2005-2006, Thomas Gleixner, Russell King | ||
5 | * | 6 | * |
6 | * This file contains the core interrupt handling code. | 7 | * This file contains the core interrupt handling code. |
8 | * | ||
9 | * Detailed information is available in Documentation/DocBook/genericirq | ||
10 | * | ||
7 | */ | 11 | */ |
8 | 12 | ||
9 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
@@ -14,11 +18,22 @@ | |||
14 | 18 | ||
15 | #include "internals.h" | 19 | #include "internals.h" |
16 | 20 | ||
21 | /** | ||
22 | * handle_bad_irq - handle spurious and unhandled irqs | ||
23 | */ | ||
24 | void fastcall | ||
25 | handle_bad_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs) | ||
26 | { | ||
27 | print_irq_desc(irq, desc); | ||
28 | kstat_this_cpu.irqs[irq]++; | ||
29 | ack_bad_irq(irq); | ||
30 | } | ||
31 | |||
17 | /* | 32 | /* |
18 | * Linux has a controller-independent interrupt architecture. | 33 | * Linux has a controller-independent interrupt architecture. |
19 | * Every controller has a 'controller-template', that is used | 34 | * Every controller has a 'controller-template', that is used |
20 | * by the main code to do the right thing. Each driver-visible | 35 | * by the main code to do the right thing. Each driver-visible |
21 | * interrupt source is transparently wired to the apropriate | 36 | * interrupt source is transparently wired to the appropriate |
22 | * controller. Thus drivers need not be aware of the | 37 | * controller. Thus drivers need not be aware of the |
23 | * interrupt-controller. | 38 | * interrupt-controller. |
24 | * | 39 | * |
@@ -28,41 +43,52 @@ | |||
28 | * | 43 | * |
29 | * Controller mappings for all interrupt sources: | 44 | * Controller mappings for all interrupt sources: |
30 | */ | 45 | */ |
31 | irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned = { | 46 | struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned = { |
32 | [0 ... NR_IRQS-1] = { | 47 | [0 ... NR_IRQS-1] = { |
33 | .status = IRQ_DISABLED, | 48 | .status = IRQ_DISABLED, |
34 | .handler = &no_irq_type, | 49 | .chip = &no_irq_chip, |
35 | .lock = SPIN_LOCK_UNLOCKED | 50 | .handle_irq = handle_bad_irq, |
51 | .depth = 1, | ||
52 | .lock = SPIN_LOCK_UNLOCKED, | ||
53 | #ifdef CONFIG_SMP | ||
54 | .affinity = CPU_MASK_ALL | ||
55 | #endif | ||
36 | } | 56 | } |
37 | }; | 57 | }; |
38 | 58 | ||
39 | /* | 59 | /* |
40 | * Generic 'no controller' code | 60 | * What should we do if we get a hw irq event on an illegal vector? |
61 | * Each architecture has to answer this themself. | ||
41 | */ | 62 | */ |
42 | static void end_none(unsigned int irq) { } | 63 | static void ack_bad(unsigned int irq) |
43 | static void enable_none(unsigned int irq) { } | ||
44 | static void disable_none(unsigned int irq) { } | ||
45 | static void shutdown_none(unsigned int irq) { } | ||
46 | static unsigned int startup_none(unsigned int irq) { return 0; } | ||
47 | |||
48 | static void ack_none(unsigned int irq) | ||
49 | { | 64 | { |
50 | /* | 65 | print_irq_desc(irq, irq_desc + irq); |
51 | * 'what should we do if we get a hw irq event on an illegal vector'. | ||
52 | * each architecture has to answer this themself. | ||
53 | */ | ||
54 | ack_bad_irq(irq); | 66 | ack_bad_irq(irq); |
55 | } | 67 | } |
56 | 68 | ||
57 | struct hw_interrupt_type no_irq_type = { | 69 | /* |
58 | .typename = "none", | 70 | * NOP functions |
59 | .startup = startup_none, | 71 | */ |
60 | .shutdown = shutdown_none, | 72 | static void noop(unsigned int irq) |
61 | .enable = enable_none, | 73 | { |
62 | .disable = disable_none, | 74 | } |
63 | .ack = ack_none, | 75 | |
64 | .end = end_none, | 76 | static unsigned int noop_ret(unsigned int irq) |
65 | .set_affinity = NULL | 77 | { |
78 | return 0; | ||
79 | } | ||
80 | |||
81 | /* | ||
82 | * Generic no controller implementation | ||
83 | */ | ||
84 | struct irq_chip no_irq_chip = { | ||
85 | .name = "none", | ||
86 | .startup = noop_ret, | ||
87 | .shutdown = noop, | ||
88 | .enable = noop, | ||
89 | .disable = noop, | ||
90 | .ack = ack_bad, | ||
91 | .end = noop, | ||
66 | }; | 92 | }; |
67 | 93 | ||
68 | /* | 94 | /* |
@@ -73,11 +99,16 @@ irqreturn_t no_action(int cpl, void *dev_id, struct pt_regs *regs) | |||
73 | return IRQ_NONE; | 99 | return IRQ_NONE; |
74 | } | 100 | } |
75 | 101 | ||
76 | /* | 102 | /** |
77 | * Have got an event to handle: | 103 | * handle_IRQ_event - irq action chain handler |
104 | * @irq: the interrupt number | ||
105 | * @regs: pointer to a register structure | ||
106 | * @action: the interrupt action chain for this irq | ||
107 | * | ||
108 | * Handles the action chain of an irq event | ||
78 | */ | 109 | */ |
79 | fastcall irqreturn_t handle_IRQ_event(unsigned int irq, struct pt_regs *regs, | 110 | irqreturn_t handle_IRQ_event(unsigned int irq, struct pt_regs *regs, |
80 | struct irqaction *action) | 111 | struct irqaction *action) |
81 | { | 112 | { |
82 | irqreturn_t ret, retval = IRQ_NONE; | 113 | irqreturn_t ret, retval = IRQ_NONE; |
83 | unsigned int status = 0; | 114 | unsigned int status = 0; |
@@ -100,15 +131,22 @@ fastcall irqreturn_t handle_IRQ_event(unsigned int irq, struct pt_regs *regs, | |||
100 | return retval; | 131 | return retval; |
101 | } | 132 | } |
102 | 133 | ||
103 | /* | 134 | /** |
104 | * do_IRQ handles all normal device IRQ's (the special | 135 | * __do_IRQ - original all in one highlevel IRQ handler |
136 | * @irq: the interrupt number | ||
137 | * @regs: pointer to a register structure | ||
138 | * | ||
139 | * __do_IRQ handles all normal device IRQ's (the special | ||
105 | * SMP cross-CPU interrupts have their own specific | 140 | * SMP cross-CPU interrupts have their own specific |
106 | * handlers). | 141 | * handlers). |
142 | * | ||
143 | * This is the original x86 implementation which is used for every | ||
144 | * interrupt type. | ||
107 | */ | 145 | */ |
108 | fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs) | 146 | fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs) |
109 | { | 147 | { |
110 | irq_desc_t *desc = irq_desc + irq; | 148 | struct irq_desc *desc = irq_desc + irq; |
111 | struct irqaction * action; | 149 | struct irqaction *action; |
112 | unsigned int status; | 150 | unsigned int status; |
113 | 151 | ||
114 | kstat_this_cpu.irqs[irq]++; | 152 | kstat_this_cpu.irqs[irq]++; |
@@ -118,16 +156,16 @@ fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs) | |||
118 | /* | 156 | /* |
119 | * No locking required for CPU-local interrupts: | 157 | * No locking required for CPU-local interrupts: |
120 | */ | 158 | */ |
121 | if (desc->handler->ack) | 159 | if (desc->chip->ack) |
122 | desc->handler->ack(irq); | 160 | desc->chip->ack(irq); |
123 | action_ret = handle_IRQ_event(irq, regs, desc->action); | 161 | action_ret = handle_IRQ_event(irq, regs, desc->action); |
124 | desc->handler->end(irq); | 162 | desc->chip->end(irq); |
125 | return 1; | 163 | return 1; |
126 | } | 164 | } |
127 | 165 | ||
128 | spin_lock(&desc->lock); | 166 | spin_lock(&desc->lock); |
129 | if (desc->handler->ack) | 167 | if (desc->chip->ack) |
130 | desc->handler->ack(irq); | 168 | desc->chip->ack(irq); |
131 | /* | 169 | /* |
132 | * REPLAY is when Linux resends an IRQ that was dropped earlier | 170 | * REPLAY is when Linux resends an IRQ that was dropped earlier |
133 | * WAITING is used by probe to mark irqs that are being tested | 171 | * WAITING is used by probe to mark irqs that are being tested |
@@ -187,7 +225,7 @@ out: | |||
187 | * The ->end() handler has to deal with interrupts which got | 225 | * The ->end() handler has to deal with interrupts which got |
188 | * disabled while the handler was running. | 226 | * disabled while the handler was running. |
189 | */ | 227 | */ |
190 | desc->handler->end(irq); | 228 | desc->chip->end(irq); |
191 | spin_unlock(&desc->lock); | 229 | spin_unlock(&desc->lock); |
192 | 230 | ||
193 | return 1; | 231 | return 1; |
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index 46feba630266..08a849a22447 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h | |||
@@ -4,6 +4,12 @@ | |||
4 | 4 | ||
5 | extern int noirqdebug; | 5 | extern int noirqdebug; |
6 | 6 | ||
7 | /* Set default functions for irq_chip structures: */ | ||
8 | extern void irq_chip_set_defaults(struct irq_chip *chip); | ||
9 | |||
10 | /* Set default handler: */ | ||
11 | extern void compat_irq_chip_set_default_handler(struct irq_desc *desc); | ||
12 | |||
7 | #ifdef CONFIG_PROC_FS | 13 | #ifdef CONFIG_PROC_FS |
8 | extern void register_irq_proc(unsigned int irq); | 14 | extern void register_irq_proc(unsigned int irq); |
9 | extern void register_handler_proc(unsigned int irq, struct irqaction *action); | 15 | extern void register_handler_proc(unsigned int irq, struct irqaction *action); |
@@ -16,3 +22,43 @@ static inline void unregister_handler_proc(unsigned int irq, | |||
16 | struct irqaction *action) { } | 22 | struct irqaction *action) { } |
17 | #endif | 23 | #endif |
18 | 24 | ||
25 | /* | ||
26 | * Debugging printout: | ||
27 | */ | ||
28 | |||
29 | #include <linux/kallsyms.h> | ||
30 | |||
31 | #define P(f) if (desc->status & f) printk("%14s set\n", #f) | ||
32 | |||
33 | static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc) | ||
34 | { | ||
35 | printk("irq %d, desc: %p, depth: %d, count: %d, unhandled: %d\n", | ||
36 | irq, desc, desc->depth, desc->irq_count, desc->irqs_unhandled); | ||
37 | printk("->handle_irq(): %p, ", desc->handle_irq); | ||
38 | print_symbol("%s\n", (unsigned long)desc->handle_irq); | ||
39 | printk("->chip(): %p, ", desc->chip); | ||
40 | print_symbol("%s\n", (unsigned long)desc->chip); | ||
41 | printk("->action(): %p\n", desc->action); | ||
42 | if (desc->action) { | ||
43 | printk("->action->handler(): %p, ", desc->action->handler); | ||
44 | print_symbol("%s\n", (unsigned long)desc->action->handler); | ||
45 | } | ||
46 | |||
47 | P(IRQ_INPROGRESS); | ||
48 | P(IRQ_DISABLED); | ||
49 | P(IRQ_PENDING); | ||
50 | P(IRQ_REPLAY); | ||
51 | P(IRQ_AUTODETECT); | ||
52 | P(IRQ_WAITING); | ||
53 | P(IRQ_LEVEL); | ||
54 | P(IRQ_MASKED); | ||
55 | #ifdef CONFIG_IRQ_PER_CPU | ||
56 | P(IRQ_PER_CPU); | ||
57 | #endif | ||
58 | P(IRQ_NOPROBE); | ||
59 | P(IRQ_NOREQUEST); | ||
60 | P(IRQ_NOAUTOEN); | ||
61 | } | ||
62 | |||
63 | #undef P | ||
64 | |||
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 1279e3499534..9eb1d518ee1c 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -1,7 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * linux/kernel/irq/manage.c | 2 | * linux/kernel/irq/manage.c |
3 | * | 3 | * |
4 | * Copyright (C) 1992, 1998-2004 Linus Torvalds, Ingo Molnar | 4 | * Copyright (C) 1992, 1998-2006 Linus Torvalds, Ingo Molnar |
5 | * Copyright (C) 2005-2006 Thomas Gleixner | ||
5 | * | 6 | * |
6 | * This file contains driver APIs to the irq subsystem. | 7 | * This file contains driver APIs to the irq subsystem. |
7 | */ | 8 | */ |
@@ -16,12 +17,6 @@ | |||
16 | 17 | ||
17 | #ifdef CONFIG_SMP | 18 | #ifdef CONFIG_SMP |
18 | 19 | ||
19 | cpumask_t irq_affinity[NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL }; | ||
20 | |||
21 | #if defined (CONFIG_GENERIC_PENDING_IRQ) || defined (CONFIG_IRQBALANCE) | ||
22 | cpumask_t __cacheline_aligned pending_irq_cpumask[NR_IRQS]; | ||
23 | #endif | ||
24 | |||
25 | /** | 20 | /** |
26 | * synchronize_irq - wait for pending IRQ handlers (on other CPUs) | 21 | * synchronize_irq - wait for pending IRQ handlers (on other CPUs) |
27 | * @irq: interrupt number to wait for | 22 | * @irq: interrupt number to wait for |
@@ -42,7 +37,6 @@ void synchronize_irq(unsigned int irq) | |||
42 | while (desc->status & IRQ_INPROGRESS) | 37 | while (desc->status & IRQ_INPROGRESS) |
43 | cpu_relax(); | 38 | cpu_relax(); |
44 | } | 39 | } |
45 | |||
46 | EXPORT_SYMBOL(synchronize_irq); | 40 | EXPORT_SYMBOL(synchronize_irq); |
47 | 41 | ||
48 | #endif | 42 | #endif |
@@ -60,7 +54,7 @@ EXPORT_SYMBOL(synchronize_irq); | |||
60 | */ | 54 | */ |
61 | void disable_irq_nosync(unsigned int irq) | 55 | void disable_irq_nosync(unsigned int irq) |
62 | { | 56 | { |
63 | irq_desc_t *desc = irq_desc + irq; | 57 | struct irq_desc *desc = irq_desc + irq; |
64 | unsigned long flags; | 58 | unsigned long flags; |
65 | 59 | ||
66 | if (irq >= NR_IRQS) | 60 | if (irq >= NR_IRQS) |
@@ -69,11 +63,10 @@ void disable_irq_nosync(unsigned int irq) | |||
69 | spin_lock_irqsave(&desc->lock, flags); | 63 | spin_lock_irqsave(&desc->lock, flags); |
70 | if (!desc->depth++) { | 64 | if (!desc->depth++) { |
71 | desc->status |= IRQ_DISABLED; | 65 | desc->status |= IRQ_DISABLED; |
72 | desc->handler->disable(irq); | 66 | desc->chip->disable(irq); |
73 | } | 67 | } |
74 | spin_unlock_irqrestore(&desc->lock, flags); | 68 | spin_unlock_irqrestore(&desc->lock, flags); |
75 | } | 69 | } |
76 | |||
77 | EXPORT_SYMBOL(disable_irq_nosync); | 70 | EXPORT_SYMBOL(disable_irq_nosync); |
78 | 71 | ||
79 | /** | 72 | /** |
@@ -90,7 +83,7 @@ EXPORT_SYMBOL(disable_irq_nosync); | |||
90 | */ | 83 | */ |
91 | void disable_irq(unsigned int irq) | 84 | void disable_irq(unsigned int irq) |
92 | { | 85 | { |
93 | irq_desc_t *desc = irq_desc + irq; | 86 | struct irq_desc *desc = irq_desc + irq; |
94 | 87 | ||
95 | if (irq >= NR_IRQS) | 88 | if (irq >= NR_IRQS) |
96 | return; | 89 | return; |
@@ -99,7 +92,6 @@ void disable_irq(unsigned int irq) | |||
99 | if (desc->action) | 92 | if (desc->action) |
100 | synchronize_irq(irq); | 93 | synchronize_irq(irq); |
101 | } | 94 | } |
102 | |||
103 | EXPORT_SYMBOL(disable_irq); | 95 | EXPORT_SYMBOL(disable_irq); |
104 | 96 | ||
105 | /** | 97 | /** |
@@ -114,7 +106,7 @@ EXPORT_SYMBOL(disable_irq); | |||
114 | */ | 106 | */ |
115 | void enable_irq(unsigned int irq) | 107 | void enable_irq(unsigned int irq) |
116 | { | 108 | { |
117 | irq_desc_t *desc = irq_desc + irq; | 109 | struct irq_desc *desc = irq_desc + irq; |
118 | unsigned long flags; | 110 | unsigned long flags; |
119 | 111 | ||
120 | if (irq >= NR_IRQS) | 112 | if (irq >= NR_IRQS) |
@@ -123,17 +115,15 @@ void enable_irq(unsigned int irq) | |||
123 | spin_lock_irqsave(&desc->lock, flags); | 115 | spin_lock_irqsave(&desc->lock, flags); |
124 | switch (desc->depth) { | 116 | switch (desc->depth) { |
125 | case 0: | 117 | case 0: |
118 | printk(KERN_WARNING "Unablanced enable_irq(%d)\n", irq); | ||
126 | WARN_ON(1); | 119 | WARN_ON(1); |
127 | break; | 120 | break; |
128 | case 1: { | 121 | case 1: { |
129 | unsigned int status = desc->status & ~IRQ_DISABLED; | 122 | unsigned int status = desc->status & ~IRQ_DISABLED; |
130 | 123 | ||
131 | desc->status = status; | 124 | /* Prevent probing on this irq: */ |
132 | if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) { | 125 | desc->status = status | IRQ_NOPROBE; |
133 | desc->status = status | IRQ_REPLAY; | 126 | check_irq_resend(desc, irq); |
134 | hw_resend_irq(desc->handler,irq); | ||
135 | } | ||
136 | desc->handler->enable(irq); | ||
137 | /* fall-through */ | 127 | /* fall-through */ |
138 | } | 128 | } |
139 | default: | 129 | default: |
@@ -141,9 +131,29 @@ void enable_irq(unsigned int irq) | |||
141 | } | 131 | } |
142 | spin_unlock_irqrestore(&desc->lock, flags); | 132 | spin_unlock_irqrestore(&desc->lock, flags); |
143 | } | 133 | } |
144 | |||
145 | EXPORT_SYMBOL(enable_irq); | 134 | EXPORT_SYMBOL(enable_irq); |
146 | 135 | ||
136 | /** | ||
137 | * set_irq_wake - control irq power management wakeup | ||
138 | * @irq: interrupt to control | ||
139 | * @on: enable/disable power management wakeup | ||
140 | * | ||
141 | * Enable/disable power management wakeup mode | ||
142 | */ | ||
143 | int set_irq_wake(unsigned int irq, unsigned int on) | ||
144 | { | ||
145 | struct irq_desc *desc = irq_desc + irq; | ||
146 | unsigned long flags; | ||
147 | int ret = -ENXIO; | ||
148 | |||
149 | spin_lock_irqsave(&desc->lock, flags); | ||
150 | if (desc->chip->set_wake) | ||
151 | ret = desc->chip->set_wake(irq, on); | ||
152 | spin_unlock_irqrestore(&desc->lock, flags); | ||
153 | return ret; | ||
154 | } | ||
155 | EXPORT_SYMBOL(set_irq_wake); | ||
156 | |||
147 | /* | 157 | /* |
148 | * Internal function that tells the architecture code whether a | 158 | * Internal function that tells the architecture code whether a |
149 | * particular irq has been exclusively allocated or is available | 159 | * particular irq has been exclusively allocated or is available |
@@ -153,7 +163,7 @@ int can_request_irq(unsigned int irq, unsigned long irqflags) | |||
153 | { | 163 | { |
154 | struct irqaction *action; | 164 | struct irqaction *action; |
155 | 165 | ||
156 | if (irq >= NR_IRQS) | 166 | if (irq >= NR_IRQS || irq_desc[irq].status & IRQ_NOREQUEST) |
157 | return 0; | 167 | return 0; |
158 | 168 | ||
159 | action = irq_desc[irq].action; | 169 | action = irq_desc[irq].action; |
@@ -164,11 +174,22 @@ int can_request_irq(unsigned int irq, unsigned long irqflags) | |||
164 | return !action; | 174 | return !action; |
165 | } | 175 | } |
166 | 176 | ||
177 | void compat_irq_chip_set_default_handler(struct irq_desc *desc) | ||
178 | { | ||
179 | /* | ||
180 | * If the architecture still has not overriden | ||
181 | * the flow handler then zap the default. This | ||
182 | * should catch incorrect flow-type setting. | ||
183 | */ | ||
184 | if (desc->handle_irq == &handle_bad_irq) | ||
185 | desc->handle_irq = NULL; | ||
186 | } | ||
187 | |||
167 | /* | 188 | /* |
168 | * Internal function to register an irqaction - typically used to | 189 | * Internal function to register an irqaction - typically used to |
169 | * allocate special interrupts that are part of the architecture. | 190 | * allocate special interrupts that are part of the architecture. |
170 | */ | 191 | */ |
171 | int setup_irq(unsigned int irq, struct irqaction * new) | 192 | int setup_irq(unsigned int irq, struct irqaction *new) |
172 | { | 193 | { |
173 | struct irq_desc *desc = irq_desc + irq; | 194 | struct irq_desc *desc = irq_desc + irq; |
174 | struct irqaction *old, **p; | 195 | struct irqaction *old, **p; |
@@ -178,7 +199,7 @@ int setup_irq(unsigned int irq, struct irqaction * new) | |||
178 | if (irq >= NR_IRQS) | 199 | if (irq >= NR_IRQS) |
179 | return -EINVAL; | 200 | return -EINVAL; |
180 | 201 | ||
181 | if (desc->handler == &no_irq_type) | 202 | if (desc->chip == &no_irq_chip) |
182 | return -ENOSYS; | 203 | return -ENOSYS; |
183 | /* | 204 | /* |
184 | * Some drivers like serial.c use request_irq() heavily, | 205 | * Some drivers like serial.c use request_irq() heavily, |
@@ -200,14 +221,21 @@ int setup_irq(unsigned int irq, struct irqaction * new) | |||
200 | /* | 221 | /* |
201 | * The following block of code has to be executed atomically | 222 | * The following block of code has to be executed atomically |
202 | */ | 223 | */ |
203 | spin_lock_irqsave(&desc->lock,flags); | 224 | spin_lock_irqsave(&desc->lock, flags); |
204 | p = &desc->action; | 225 | p = &desc->action; |
205 | if ((old = *p) != NULL) { | 226 | old = *p; |
206 | /* Can't share interrupts unless both agree to */ | 227 | if (old) { |
207 | if (!(old->flags & new->flags & SA_SHIRQ)) | 228 | /* |
229 | * Can't share interrupts unless both agree to and are | ||
230 | * the same type (level, edge, polarity). So both flag | ||
231 | * fields must have SA_SHIRQ set and the bits which | ||
232 | * set the trigger type must match. | ||
233 | */ | ||
234 | if (!((old->flags & new->flags) & SA_SHIRQ) || | ||
235 | ((old->flags ^ new->flags) & SA_TRIGGER_MASK)) | ||
208 | goto mismatch; | 236 | goto mismatch; |
209 | 237 | ||
210 | #if defined(ARCH_HAS_IRQ_PER_CPU) && defined(SA_PERCPU_IRQ) | 238 | #if defined(CONFIG_IRQ_PER_CPU) && defined(SA_PERCPU_IRQ) |
211 | /* All handlers must agree on per-cpuness */ | 239 | /* All handlers must agree on per-cpuness */ |
212 | if ((old->flags & IRQ_PER_CPU) != (new->flags & IRQ_PER_CPU)) | 240 | if ((old->flags & IRQ_PER_CPU) != (new->flags & IRQ_PER_CPU)) |
213 | goto mismatch; | 241 | goto mismatch; |
@@ -222,20 +250,44 @@ int setup_irq(unsigned int irq, struct irqaction * new) | |||
222 | } | 250 | } |
223 | 251 | ||
224 | *p = new; | 252 | *p = new; |
225 | #if defined(ARCH_HAS_IRQ_PER_CPU) && defined(SA_PERCPU_IRQ) | 253 | #if defined(CONFIG_IRQ_PER_CPU) && defined(SA_PERCPU_IRQ) |
226 | if (new->flags & SA_PERCPU_IRQ) | 254 | if (new->flags & SA_PERCPU_IRQ) |
227 | desc->status |= IRQ_PER_CPU; | 255 | desc->status |= IRQ_PER_CPU; |
228 | #endif | 256 | #endif |
229 | if (!shared) { | 257 | if (!shared) { |
230 | desc->depth = 0; | 258 | irq_chip_set_defaults(desc->chip); |
231 | desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | | 259 | |
232 | IRQ_WAITING | IRQ_INPROGRESS); | 260 | /* Setup the type (level, edge polarity) if configured: */ |
233 | if (desc->handler->startup) | 261 | if (new->flags & SA_TRIGGER_MASK) { |
234 | desc->handler->startup(irq); | 262 | if (desc->chip && desc->chip->set_type) |
235 | else | 263 | desc->chip->set_type(irq, |
236 | desc->handler->enable(irq); | 264 | new->flags & SA_TRIGGER_MASK); |
265 | else | ||
266 | /* | ||
267 | * SA_TRIGGER_* but the PIC does not support | ||
268 | * multiple flow-types? | ||
269 | */ | ||
270 | printk(KERN_WARNING "setup_irq(%d) SA_TRIGGER" | ||
271 | "set. No set_type function available\n", | ||
272 | irq); | ||
273 | } else | ||
274 | compat_irq_chip_set_default_handler(desc); | ||
275 | |||
276 | desc->status &= ~(IRQ_AUTODETECT | IRQ_WAITING | | ||
277 | IRQ_INPROGRESS); | ||
278 | |||
279 | if (!(desc->status & IRQ_NOAUTOEN)) { | ||
280 | desc->depth = 0; | ||
281 | desc->status &= ~IRQ_DISABLED; | ||
282 | if (desc->chip->startup) | ||
283 | desc->chip->startup(irq); | ||
284 | else | ||
285 | desc->chip->enable(irq); | ||
286 | } else | ||
287 | /* Undo nested disables: */ | ||
288 | desc->depth = 1; | ||
237 | } | 289 | } |
238 | spin_unlock_irqrestore(&desc->lock,flags); | 290 | spin_unlock_irqrestore(&desc->lock, flags); |
239 | 291 | ||
240 | new->irq = irq; | 292 | new->irq = irq; |
241 | register_irq_proc(irq); | 293 | register_irq_proc(irq); |
@@ -278,10 +330,10 @@ void free_irq(unsigned int irq, void *dev_id) | |||
278 | return; | 330 | return; |
279 | 331 | ||
280 | desc = irq_desc + irq; | 332 | desc = irq_desc + irq; |
281 | spin_lock_irqsave(&desc->lock,flags); | 333 | spin_lock_irqsave(&desc->lock, flags); |
282 | p = &desc->action; | 334 | p = &desc->action; |
283 | for (;;) { | 335 | for (;;) { |
284 | struct irqaction * action = *p; | 336 | struct irqaction *action = *p; |
285 | 337 | ||
286 | if (action) { | 338 | if (action) { |
287 | struct irqaction **pp = p; | 339 | struct irqaction **pp = p; |
@@ -295,18 +347,18 @@ void free_irq(unsigned int irq, void *dev_id) | |||
295 | 347 | ||
296 | /* Currently used only by UML, might disappear one day.*/ | 348 | /* Currently used only by UML, might disappear one day.*/ |
297 | #ifdef CONFIG_IRQ_RELEASE_METHOD | 349 | #ifdef CONFIG_IRQ_RELEASE_METHOD |
298 | if (desc->handler->release) | 350 | if (desc->chip->release) |
299 | desc->handler->release(irq, dev_id); | 351 | desc->chip->release(irq, dev_id); |
300 | #endif | 352 | #endif |
301 | 353 | ||
302 | if (!desc->action) { | 354 | if (!desc->action) { |
303 | desc->status |= IRQ_DISABLED; | 355 | desc->status |= IRQ_DISABLED; |
304 | if (desc->handler->shutdown) | 356 | if (desc->chip->shutdown) |
305 | desc->handler->shutdown(irq); | 357 | desc->chip->shutdown(irq); |
306 | else | 358 | else |
307 | desc->handler->disable(irq); | 359 | desc->chip->disable(irq); |
308 | } | 360 | } |
309 | spin_unlock_irqrestore(&desc->lock,flags); | 361 | spin_unlock_irqrestore(&desc->lock, flags); |
310 | unregister_handler_proc(irq, action); | 362 | unregister_handler_proc(irq, action); |
311 | 363 | ||
312 | /* Make sure it's not being used on another CPU */ | 364 | /* Make sure it's not being used on another CPU */ |
@@ -314,12 +366,11 @@ void free_irq(unsigned int irq, void *dev_id) | |||
314 | kfree(action); | 366 | kfree(action); |
315 | return; | 367 | return; |
316 | } | 368 | } |
317 | printk(KERN_ERR "Trying to free free IRQ%d\n",irq); | 369 | printk(KERN_ERR "Trying to free free IRQ%d\n", irq); |
318 | spin_unlock_irqrestore(&desc->lock,flags); | 370 | spin_unlock_irqrestore(&desc->lock, flags); |
319 | return; | 371 | return; |
320 | } | 372 | } |
321 | } | 373 | } |
322 | |||
323 | EXPORT_SYMBOL(free_irq); | 374 | EXPORT_SYMBOL(free_irq); |
324 | 375 | ||
325 | /** | 376 | /** |
@@ -353,9 +404,9 @@ EXPORT_SYMBOL(free_irq); | |||
353 | */ | 404 | */ |
354 | int request_irq(unsigned int irq, | 405 | int request_irq(unsigned int irq, |
355 | irqreturn_t (*handler)(int, void *, struct pt_regs *), | 406 | irqreturn_t (*handler)(int, void *, struct pt_regs *), |
356 | unsigned long irqflags, const char * devname, void *dev_id) | 407 | unsigned long irqflags, const char *devname, void *dev_id) |
357 | { | 408 | { |
358 | struct irqaction * action; | 409 | struct irqaction *action; |
359 | int retval; | 410 | int retval; |
360 | 411 | ||
361 | /* | 412 | /* |
@@ -368,6 +419,8 @@ int request_irq(unsigned int irq, | |||
368 | return -EINVAL; | 419 | return -EINVAL; |
369 | if (irq >= NR_IRQS) | 420 | if (irq >= NR_IRQS) |
370 | return -EINVAL; | 421 | return -EINVAL; |
422 | if (irq_desc[irq].status & IRQ_NOREQUEST) | ||
423 | return -EINVAL; | ||
371 | if (!handler) | 424 | if (!handler) |
372 | return -EINVAL; | 425 | return -EINVAL; |
373 | 426 | ||
@@ -390,6 +443,5 @@ int request_irq(unsigned int irq, | |||
390 | 443 | ||
391 | return retval; | 444 | return retval; |
392 | } | 445 | } |
393 | |||
394 | EXPORT_SYMBOL(request_irq); | 446 | EXPORT_SYMBOL(request_irq); |
395 | 447 | ||
diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c index a12d00eb5e7c..a57ebe9fa6f6 100644 --- a/kernel/irq/migration.c +++ b/kernel/irq/migration.c | |||
@@ -3,19 +3,19 @@ | |||
3 | 3 | ||
4 | void set_pending_irq(unsigned int irq, cpumask_t mask) | 4 | void set_pending_irq(unsigned int irq, cpumask_t mask) |
5 | { | 5 | { |
6 | irq_desc_t *desc = irq_desc + irq; | 6 | struct irq_desc *desc = irq_desc + irq; |
7 | unsigned long flags; | 7 | unsigned long flags; |
8 | 8 | ||
9 | spin_lock_irqsave(&desc->lock, flags); | 9 | spin_lock_irqsave(&desc->lock, flags); |
10 | desc->move_irq = 1; | 10 | desc->move_irq = 1; |
11 | pending_irq_cpumask[irq] = mask; | 11 | irq_desc[irq].pending_mask = mask; |
12 | spin_unlock_irqrestore(&desc->lock, flags); | 12 | spin_unlock_irqrestore(&desc->lock, flags); |
13 | } | 13 | } |
14 | 14 | ||
15 | void move_native_irq(int irq) | 15 | void move_native_irq(int irq) |
16 | { | 16 | { |
17 | struct irq_desc *desc = irq_desc + irq; | ||
17 | cpumask_t tmp; | 18 | cpumask_t tmp; |
18 | irq_desc_t *desc = irq_descp(irq); | ||
19 | 19 | ||
20 | if (likely(!desc->move_irq)) | 20 | if (likely(!desc->move_irq)) |
21 | return; | 21 | return; |
@@ -30,15 +30,15 @@ void move_native_irq(int irq) | |||
30 | 30 | ||
31 | desc->move_irq = 0; | 31 | desc->move_irq = 0; |
32 | 32 | ||
33 | if (unlikely(cpus_empty(pending_irq_cpumask[irq]))) | 33 | if (unlikely(cpus_empty(irq_desc[irq].pending_mask))) |
34 | return; | 34 | return; |
35 | 35 | ||
36 | if (!desc->handler->set_affinity) | 36 | if (!desc->chip->set_affinity) |
37 | return; | 37 | return; |
38 | 38 | ||
39 | assert_spin_locked(&desc->lock); | 39 | assert_spin_locked(&desc->lock); |
40 | 40 | ||
41 | cpus_and(tmp, pending_irq_cpumask[irq], cpu_online_map); | 41 | cpus_and(tmp, irq_desc[irq].pending_mask, cpu_online_map); |
42 | 42 | ||
43 | /* | 43 | /* |
44 | * If there was a valid mask to work with, please | 44 | * If there was a valid mask to work with, please |
@@ -51,12 +51,12 @@ void move_native_irq(int irq) | |||
51 | */ | 51 | */ |
52 | if (likely(!cpus_empty(tmp))) { | 52 | if (likely(!cpus_empty(tmp))) { |
53 | if (likely(!(desc->status & IRQ_DISABLED))) | 53 | if (likely(!(desc->status & IRQ_DISABLED))) |
54 | desc->handler->disable(irq); | 54 | desc->chip->disable(irq); |
55 | 55 | ||
56 | desc->handler->set_affinity(irq,tmp); | 56 | desc->chip->set_affinity(irq,tmp); |
57 | 57 | ||
58 | if (likely(!(desc->status & IRQ_DISABLED))) | 58 | if (likely(!(desc->status & IRQ_DISABLED))) |
59 | desc->handler->enable(irq); | 59 | desc->chip->enable(irq); |
60 | } | 60 | } |
61 | cpus_clear(pending_irq_cpumask[irq]); | 61 | cpus_clear(irq_desc[irq].pending_mask); |
62 | } | 62 | } |
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index afacd6f585fa..607c7809ad01 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c | |||
@@ -12,15 +12,10 @@ | |||
12 | 12 | ||
13 | #include "internals.h" | 13 | #include "internals.h" |
14 | 14 | ||
15 | static struct proc_dir_entry *root_irq_dir, *irq_dir[NR_IRQS]; | 15 | static struct proc_dir_entry *root_irq_dir; |
16 | 16 | ||
17 | #ifdef CONFIG_SMP | 17 | #ifdef CONFIG_SMP |
18 | 18 | ||
19 | /* | ||
20 | * The /proc/irq/<irq>/smp_affinity values: | ||
21 | */ | ||
22 | static struct proc_dir_entry *smp_affinity_entry[NR_IRQS]; | ||
23 | |||
24 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 19 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
25 | void proc_set_irq_affinity(unsigned int irq, cpumask_t mask_val) | 20 | void proc_set_irq_affinity(unsigned int irq, cpumask_t mask_val) |
26 | { | 21 | { |
@@ -36,15 +31,15 @@ void proc_set_irq_affinity(unsigned int irq, cpumask_t mask_val) | |||
36 | void proc_set_irq_affinity(unsigned int irq, cpumask_t mask_val) | 31 | void proc_set_irq_affinity(unsigned int irq, cpumask_t mask_val) |
37 | { | 32 | { |
38 | set_balance_irq_affinity(irq, mask_val); | 33 | set_balance_irq_affinity(irq, mask_val); |
39 | irq_affinity[irq] = mask_val; | 34 | irq_desc[irq].affinity = mask_val; |
40 | irq_desc[irq].handler->set_affinity(irq, mask_val); | 35 | irq_desc[irq].chip->set_affinity(irq, mask_val); |
41 | } | 36 | } |
42 | #endif | 37 | #endif |
43 | 38 | ||
44 | static int irq_affinity_read_proc(char *page, char **start, off_t off, | 39 | static int irq_affinity_read_proc(char *page, char **start, off_t off, |
45 | int count, int *eof, void *data) | 40 | int count, int *eof, void *data) |
46 | { | 41 | { |
47 | int len = cpumask_scnprintf(page, count, irq_affinity[(long)data]); | 42 | int len = cpumask_scnprintf(page, count, irq_desc[(long)data].affinity); |
48 | 43 | ||
49 | if (count - len < 2) | 44 | if (count - len < 2) |
50 | return -EINVAL; | 45 | return -EINVAL; |
@@ -59,7 +54,7 @@ static int irq_affinity_write_proc(struct file *file, const char __user *buffer, | |||
59 | unsigned int irq = (int)(long)data, full_count = count, err; | 54 | unsigned int irq = (int)(long)data, full_count = count, err; |
60 | cpumask_t new_value, tmp; | 55 | cpumask_t new_value, tmp; |
61 | 56 | ||
62 | if (!irq_desc[irq].handler->set_affinity || no_irq_affinity) | 57 | if (!irq_desc[irq].chip->set_affinity || no_irq_affinity) |
63 | return -EIO; | 58 | return -EIO; |
64 | 59 | ||
65 | err = cpumask_parse(buffer, count, new_value); | 60 | err = cpumask_parse(buffer, count, new_value); |
@@ -102,7 +97,7 @@ void register_handler_proc(unsigned int irq, struct irqaction *action) | |||
102 | { | 97 | { |
103 | char name [MAX_NAMELEN]; | 98 | char name [MAX_NAMELEN]; |
104 | 99 | ||
105 | if (!irq_dir[irq] || action->dir || !action->name || | 100 | if (!irq_desc[irq].dir || action->dir || !action->name || |
106 | !name_unique(irq, action)) | 101 | !name_unique(irq, action)) |
107 | return; | 102 | return; |
108 | 103 | ||
@@ -110,7 +105,7 @@ void register_handler_proc(unsigned int irq, struct irqaction *action) | |||
110 | snprintf(name, MAX_NAMELEN, "%s", action->name); | 105 | snprintf(name, MAX_NAMELEN, "%s", action->name); |
111 | 106 | ||
112 | /* create /proc/irq/1234/handler/ */ | 107 | /* create /proc/irq/1234/handler/ */ |
113 | action->dir = proc_mkdir(name, irq_dir[irq]); | 108 | action->dir = proc_mkdir(name, irq_desc[irq].dir); |
114 | } | 109 | } |
115 | 110 | ||
116 | #undef MAX_NAMELEN | 111 | #undef MAX_NAMELEN |
@@ -122,22 +117,22 @@ void register_irq_proc(unsigned int irq) | |||
122 | char name [MAX_NAMELEN]; | 117 | char name [MAX_NAMELEN]; |
123 | 118 | ||
124 | if (!root_irq_dir || | 119 | if (!root_irq_dir || |
125 | (irq_desc[irq].handler == &no_irq_type) || | 120 | (irq_desc[irq].chip == &no_irq_chip) || |
126 | irq_dir[irq]) | 121 | irq_desc[irq].dir) |
127 | return; | 122 | return; |
128 | 123 | ||
129 | memset(name, 0, MAX_NAMELEN); | 124 | memset(name, 0, MAX_NAMELEN); |
130 | sprintf(name, "%d", irq); | 125 | sprintf(name, "%d", irq); |
131 | 126 | ||
132 | /* create /proc/irq/1234 */ | 127 | /* create /proc/irq/1234 */ |
133 | irq_dir[irq] = proc_mkdir(name, root_irq_dir); | 128 | irq_desc[irq].dir = proc_mkdir(name, root_irq_dir); |
134 | 129 | ||
135 | #ifdef CONFIG_SMP | 130 | #ifdef CONFIG_SMP |
136 | { | 131 | { |
137 | struct proc_dir_entry *entry; | 132 | struct proc_dir_entry *entry; |
138 | 133 | ||
139 | /* create /proc/irq/<irq>/smp_affinity */ | 134 | /* create /proc/irq/<irq>/smp_affinity */ |
140 | entry = create_proc_entry("smp_affinity", 0600, irq_dir[irq]); | 135 | entry = create_proc_entry("smp_affinity", 0600, irq_desc[irq].dir); |
141 | 136 | ||
142 | if (entry) { | 137 | if (entry) { |
143 | entry->nlink = 1; | 138 | entry->nlink = 1; |
@@ -145,7 +140,6 @@ void register_irq_proc(unsigned int irq) | |||
145 | entry->read_proc = irq_affinity_read_proc; | 140 | entry->read_proc = irq_affinity_read_proc; |
146 | entry->write_proc = irq_affinity_write_proc; | 141 | entry->write_proc = irq_affinity_write_proc; |
147 | } | 142 | } |
148 | smp_affinity_entry[irq] = entry; | ||
149 | } | 143 | } |
150 | #endif | 144 | #endif |
151 | } | 145 | } |
@@ -155,7 +149,7 @@ void register_irq_proc(unsigned int irq) | |||
155 | void unregister_handler_proc(unsigned int irq, struct irqaction *action) | 149 | void unregister_handler_proc(unsigned int irq, struct irqaction *action) |
156 | { | 150 | { |
157 | if (action->dir) | 151 | if (action->dir) |
158 | remove_proc_entry(action->dir->name, irq_dir[irq]); | 152 | remove_proc_entry(action->dir->name, irq_desc[irq].dir); |
159 | } | 153 | } |
160 | 154 | ||
161 | void init_irq_proc(void) | 155 | void init_irq_proc(void) |
diff --git a/kernel/irq/resend.c b/kernel/irq/resend.c new file mode 100644 index 000000000000..872f91ba2ce8 --- /dev/null +++ b/kernel/irq/resend.c | |||
@@ -0,0 +1,78 @@ | |||
1 | /* | ||
2 | * linux/kernel/irq/resend.c | ||
3 | * | ||
4 | * Copyright (C) 1992, 1998-2006 Linus Torvalds, Ingo Molnar | ||
5 | * Copyright (C) 2005-2006, Thomas Gleixner | ||
6 | * | ||
7 | * This file contains the IRQ-resend code | ||
8 | * | ||
9 | * If the interrupt is waiting to be processed, we try to re-run it. | ||
10 | * We can't directly run it from here since the caller might be in an | ||
11 | * interrupt-protected region. Not all irq controller chips can | ||
12 | * retrigger interrupts at the hardware level, so in those cases | ||
13 | * we allow the resending of IRQs via a tasklet. | ||
14 | */ | ||
15 | |||
16 | #include <linux/irq.h> | ||
17 | #include <linux/module.h> | ||
18 | #include <linux/random.h> | ||
19 | #include <linux/interrupt.h> | ||
20 | |||
21 | #include "internals.h" | ||
22 | |||
23 | #ifdef CONFIG_HARDIRQS_SW_RESEND | ||
24 | |||
25 | /* Bitmap to handle software resend of interrupts: */ | ||
26 | static DECLARE_BITMAP(irqs_resend, NR_IRQS); | ||
27 | |||
28 | /* | ||
29 | * Run software resends of IRQ's | ||
30 | */ | ||
31 | static void resend_irqs(unsigned long arg) | ||
32 | { | ||
33 | struct irq_desc *desc; | ||
34 | int irq; | ||
35 | |||
36 | while (!bitmap_empty(irqs_resend, NR_IRQS)) { | ||
37 | irq = find_first_bit(irqs_resend, NR_IRQS); | ||
38 | clear_bit(irq, irqs_resend); | ||
39 | desc = irq_desc + irq; | ||
40 | local_irq_disable(); | ||
41 | desc->handle_irq(irq, desc, NULL); | ||
42 | local_irq_enable(); | ||
43 | } | ||
44 | } | ||
45 | |||
46 | /* Tasklet to handle resend: */ | ||
47 | static DECLARE_TASKLET(resend_tasklet, resend_irqs, 0); | ||
48 | |||
49 | #endif | ||
50 | |||
51 | /* | ||
52 | * IRQ resend | ||
53 | * | ||
54 | * Is called with interrupts disabled and desc->lock held. | ||
55 | */ | ||
56 | void check_irq_resend(struct irq_desc *desc, unsigned int irq) | ||
57 | { | ||
58 | unsigned int status = desc->status; | ||
59 | |||
60 | /* | ||
61 | * Make sure the interrupt is enabled, before resending it: | ||
62 | */ | ||
63 | desc->chip->enable(irq); | ||
64 | |||
65 | if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) { | ||
66 | desc->status &= ~IRQ_PENDING; | ||
67 | desc->status = status | IRQ_REPLAY; | ||
68 | |||
69 | if (!desc->chip || !desc->chip->retrigger || | ||
70 | !desc->chip->retrigger(irq)) { | ||
71 | #ifdef CONFIG_HARDIRQS_SW_RESEND | ||
72 | /* Set it pending and activate the softirq: */ | ||
73 | set_bit(irq, irqs_resend); | ||
74 | tasklet_schedule(&resend_tasklet); | ||
75 | #endif | ||
76 | } | ||
77 | } | ||
78 | } | ||
diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c index b2fb3c18d06b..b483deed311c 100644 --- a/kernel/irq/spurious.c +++ b/kernel/irq/spurious.c | |||
@@ -16,22 +16,20 @@ static int irqfixup __read_mostly; | |||
16 | /* | 16 | /* |
17 | * Recovery handler for misrouted interrupts. | 17 | * Recovery handler for misrouted interrupts. |
18 | */ | 18 | */ |
19 | |||
20 | static int misrouted_irq(int irq, struct pt_regs *regs) | 19 | static int misrouted_irq(int irq, struct pt_regs *regs) |
21 | { | 20 | { |
22 | int i; | 21 | int i; |
23 | irq_desc_t *desc; | ||
24 | int ok = 0; | 22 | int ok = 0; |
25 | int work = 0; /* Did we do work for a real IRQ */ | 23 | int work = 0; /* Did we do work for a real IRQ */ |
26 | 24 | ||
27 | for(i = 1; i < NR_IRQS; i++) { | 25 | for (i = 1; i < NR_IRQS; i++) { |
26 | struct irq_desc *desc = irq_desc + i; | ||
28 | struct irqaction *action; | 27 | struct irqaction *action; |
29 | 28 | ||
30 | if (i == irq) /* Already tried */ | 29 | if (i == irq) /* Already tried */ |
31 | continue; | 30 | continue; |
32 | desc = &irq_desc[i]; | 31 | |
33 | spin_lock(&desc->lock); | 32 | spin_lock(&desc->lock); |
34 | action = desc->action; | ||
35 | /* Already running on another processor */ | 33 | /* Already running on another processor */ |
36 | if (desc->status & IRQ_INPROGRESS) { | 34 | if (desc->status & IRQ_INPROGRESS) { |
37 | /* | 35 | /* |
@@ -45,7 +43,9 @@ static int misrouted_irq(int irq, struct pt_regs *regs) | |||
45 | } | 43 | } |
46 | /* Honour the normal IRQ locking */ | 44 | /* Honour the normal IRQ locking */ |
47 | desc->status |= IRQ_INPROGRESS; | 45 | desc->status |= IRQ_INPROGRESS; |
46 | action = desc->action; | ||
48 | spin_unlock(&desc->lock); | 47 | spin_unlock(&desc->lock); |
48 | |||
49 | while (action) { | 49 | while (action) { |
50 | /* Only shared IRQ handlers are safe to call */ | 50 | /* Only shared IRQ handlers are safe to call */ |
51 | if (action->flags & SA_SHIRQ) { | 51 | if (action->flags & SA_SHIRQ) { |
@@ -62,9 +62,8 @@ static int misrouted_irq(int irq, struct pt_regs *regs) | |||
62 | 62 | ||
63 | /* | 63 | /* |
64 | * While we were looking for a fixup someone queued a real | 64 | * While we were looking for a fixup someone queued a real |
65 | * IRQ clashing with our walk | 65 | * IRQ clashing with our walk: |
66 | */ | 66 | */ |
67 | |||
68 | while ((desc->status & IRQ_PENDING) && action) { | 67 | while ((desc->status & IRQ_PENDING) && action) { |
69 | /* | 68 | /* |
70 | * Perform real IRQ processing for the IRQ we deferred | 69 | * Perform real IRQ processing for the IRQ we deferred |
@@ -80,8 +79,8 @@ static int misrouted_irq(int irq, struct pt_regs *regs) | |||
80 | * If we did actual work for the real IRQ line we must let the | 79 | * If we did actual work for the real IRQ line we must let the |
81 | * IRQ controller clean up too | 80 | * IRQ controller clean up too |
82 | */ | 81 | */ |
83 | if(work) | 82 | if (work && desc->chip && desc->chip->end) |
84 | desc->handler->end(i); | 83 | desc->chip->end(i); |
85 | spin_unlock(&desc->lock); | 84 | spin_unlock(&desc->lock); |
86 | } | 85 | } |
87 | /* So the caller can adjust the irq error counts */ | 86 | /* So the caller can adjust the irq error counts */ |
@@ -100,7 +99,8 @@ static int misrouted_irq(int irq, struct pt_regs *regs) | |||
100 | */ | 99 | */ |
101 | 100 | ||
102 | static void | 101 | static void |
103 | __report_bad_irq(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret) | 102 | __report_bad_irq(unsigned int irq, struct irq_desc *desc, |
103 | irqreturn_t action_ret) | ||
104 | { | 104 | { |
105 | struct irqaction *action; | 105 | struct irqaction *action; |
106 | 106 | ||
@@ -113,6 +113,7 @@ __report_bad_irq(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret) | |||
113 | } | 113 | } |
114 | dump_stack(); | 114 | dump_stack(); |
115 | printk(KERN_ERR "handlers:\n"); | 115 | printk(KERN_ERR "handlers:\n"); |
116 | |||
116 | action = desc->action; | 117 | action = desc->action; |
117 | while (action) { | 118 | while (action) { |
118 | printk(KERN_ERR "[<%p>]", action->handler); | 119 | printk(KERN_ERR "[<%p>]", action->handler); |
@@ -123,7 +124,8 @@ __report_bad_irq(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret) | |||
123 | } | 124 | } |
124 | } | 125 | } |
125 | 126 | ||
126 | static void report_bad_irq(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret) | 127 | static void |
128 | report_bad_irq(unsigned int irq, struct irq_desc *desc, irqreturn_t action_ret) | ||
127 | { | 129 | { |
128 | static int count = 100; | 130 | static int count = 100; |
129 | 131 | ||
@@ -133,8 +135,8 @@ static void report_bad_irq(unsigned int irq, irq_desc_t *desc, irqreturn_t actio | |||
133 | } | 135 | } |
134 | } | 136 | } |
135 | 137 | ||
136 | void note_interrupt(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret, | 138 | void note_interrupt(unsigned int irq, struct irq_desc *desc, |
137 | struct pt_regs *regs) | 139 | irqreturn_t action_ret, struct pt_regs *regs) |
138 | { | 140 | { |
139 | if (unlikely(action_ret != IRQ_HANDLED)) { | 141 | if (unlikely(action_ret != IRQ_HANDLED)) { |
140 | desc->irqs_unhandled++; | 142 | desc->irqs_unhandled++; |
@@ -166,7 +168,8 @@ void note_interrupt(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret, | |||
166 | */ | 168 | */ |
167 | printk(KERN_EMERG "Disabling IRQ #%d\n", irq); | 169 | printk(KERN_EMERG "Disabling IRQ #%d\n", irq); |
168 | desc->status |= IRQ_DISABLED; | 170 | desc->status |= IRQ_DISABLED; |
169 | desc->handler->disable(irq); | 171 | desc->depth = 1; |
172 | desc->chip->disable(irq); | ||
170 | } | 173 | } |
171 | desc->irqs_unhandled = 0; | 174 | desc->irqs_unhandled = 0; |
172 | } | 175 | } |
@@ -177,6 +180,7 @@ int __init noirqdebug_setup(char *str) | |||
177 | { | 180 | { |
178 | noirqdebug = 1; | 181 | noirqdebug = 1; |
179 | printk(KERN_INFO "IRQ lockup detection disabled\n"); | 182 | printk(KERN_INFO "IRQ lockup detection disabled\n"); |
183 | |||
180 | return 1; | 184 | return 1; |
181 | } | 185 | } |
182 | 186 | ||
@@ -187,6 +191,7 @@ static int __init irqfixup_setup(char *str) | |||
187 | irqfixup = 1; | 191 | irqfixup = 1; |
188 | printk(KERN_WARNING "Misrouted IRQ fixup support enabled.\n"); | 192 | printk(KERN_WARNING "Misrouted IRQ fixup support enabled.\n"); |
189 | printk(KERN_WARNING "This may impact system performance.\n"); | 193 | printk(KERN_WARNING "This may impact system performance.\n"); |
194 | |||
190 | return 1; | 195 | return 1; |
191 | } | 196 | } |
192 | 197 | ||
diff --git a/kernel/kexec.c b/kernel/kexec.c index 58f0f382597c..50087ecf337e 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
@@ -1042,7 +1042,6 @@ asmlinkage long compat_sys_kexec_load(unsigned long entry, | |||
1042 | 1042 | ||
1043 | void crash_kexec(struct pt_regs *regs) | 1043 | void crash_kexec(struct pt_regs *regs) |
1044 | { | 1044 | { |
1045 | struct kimage *image; | ||
1046 | int locked; | 1045 | int locked; |
1047 | 1046 | ||
1048 | 1047 | ||
@@ -1056,12 +1055,11 @@ void crash_kexec(struct pt_regs *regs) | |||
1056 | */ | 1055 | */ |
1057 | locked = xchg(&kexec_lock, 1); | 1056 | locked = xchg(&kexec_lock, 1); |
1058 | if (!locked) { | 1057 | if (!locked) { |
1059 | image = xchg(&kexec_crash_image, NULL); | 1058 | if (kexec_crash_image) { |
1060 | if (image) { | ||
1061 | struct pt_regs fixed_regs; | 1059 | struct pt_regs fixed_regs; |
1062 | crash_setup_regs(&fixed_regs, regs); | 1060 | crash_setup_regs(&fixed_regs, regs); |
1063 | machine_crash_shutdown(&fixed_regs); | 1061 | machine_crash_shutdown(&fixed_regs); |
1064 | machine_kexec(image); | 1062 | machine_kexec(kexec_crash_image); |
1065 | } | 1063 | } |
1066 | xchg(&kexec_lock, 0); | 1064 | xchg(&kexec_lock, 0); |
1067 | } | 1065 | } |
diff --git a/kernel/module.c b/kernel/module.c index 10e5b872adf6..99c022ac3d21 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* Rewritten by Rusty Russell, on the backs of many others... | 1 | /* |
2 | Copyright (C) 2002 Richard Henderson | 2 | Copyright (C) 2002 Richard Henderson |
3 | Copyright (C) 2001 Rusty Russell, 2002 Rusty Russell IBM. | 3 | Copyright (C) 2001 Rusty Russell, 2002 Rusty Russell IBM. |
4 | 4 | ||
@@ -122,9 +122,17 @@ extern const struct kernel_symbol __start___ksymtab_gpl[]; | |||
122 | extern const struct kernel_symbol __stop___ksymtab_gpl[]; | 122 | extern const struct kernel_symbol __stop___ksymtab_gpl[]; |
123 | extern const struct kernel_symbol __start___ksymtab_gpl_future[]; | 123 | extern const struct kernel_symbol __start___ksymtab_gpl_future[]; |
124 | extern const struct kernel_symbol __stop___ksymtab_gpl_future[]; | 124 | extern const struct kernel_symbol __stop___ksymtab_gpl_future[]; |
125 | extern const struct kernel_symbol __start___ksymtab_unused[]; | ||
126 | extern const struct kernel_symbol __stop___ksymtab_unused[]; | ||
127 | extern const struct kernel_symbol __start___ksymtab_unused_gpl[]; | ||
128 | extern const struct kernel_symbol __stop___ksymtab_unused_gpl[]; | ||
129 | extern const struct kernel_symbol __start___ksymtab_gpl_future[]; | ||
130 | extern const struct kernel_symbol __stop___ksymtab_gpl_future[]; | ||
125 | extern const unsigned long __start___kcrctab[]; | 131 | extern const unsigned long __start___kcrctab[]; |
126 | extern const unsigned long __start___kcrctab_gpl[]; | 132 | extern const unsigned long __start___kcrctab_gpl[]; |
127 | extern const unsigned long __start___kcrctab_gpl_future[]; | 133 | extern const unsigned long __start___kcrctab_gpl_future[]; |
134 | extern const unsigned long __start___kcrctab_unused[]; | ||
135 | extern const unsigned long __start___kcrctab_unused_gpl[]; | ||
128 | 136 | ||
129 | #ifndef CONFIG_MODVERSIONS | 137 | #ifndef CONFIG_MODVERSIONS |
130 | #define symversion(base, idx) NULL | 138 | #define symversion(base, idx) NULL |
@@ -144,6 +152,17 @@ static const struct kernel_symbol *lookup_symbol(const char *name, | |||
144 | return NULL; | 152 | return NULL; |
145 | } | 153 | } |
146 | 154 | ||
155 | static void printk_unused_warning(const char *name) | ||
156 | { | ||
157 | printk(KERN_WARNING "Symbol %s is marked as UNUSED, " | ||
158 | "however this module is using it.\n", name); | ||
159 | printk(KERN_WARNING "This symbol will go away in the future.\n"); | ||
160 | printk(KERN_WARNING "Please evalute if this is the right api to use, " | ||
161 | "and if it really is, submit a report the linux kernel " | ||
162 | "mailinglist together with submitting your code for " | ||
163 | "inclusion.\n"); | ||
164 | } | ||
165 | |||
147 | /* Find a symbol, return value, crc and module which owns it */ | 166 | /* Find a symbol, return value, crc and module which owns it */ |
148 | static unsigned long __find_symbol(const char *name, | 167 | static unsigned long __find_symbol(const char *name, |
149 | struct module **owner, | 168 | struct module **owner, |
@@ -186,6 +205,25 @@ static unsigned long __find_symbol(const char *name, | |||
186 | return ks->value; | 205 | return ks->value; |
187 | } | 206 | } |
188 | 207 | ||
208 | ks = lookup_symbol(name, __start___ksymtab_unused, | ||
209 | __stop___ksymtab_unused); | ||
210 | if (ks) { | ||
211 | printk_unused_warning(name); | ||
212 | *crc = symversion(__start___kcrctab_unused, | ||
213 | (ks - __start___ksymtab_unused)); | ||
214 | return ks->value; | ||
215 | } | ||
216 | |||
217 | if (gplok) | ||
218 | ks = lookup_symbol(name, __start___ksymtab_unused_gpl, | ||
219 | __stop___ksymtab_unused_gpl); | ||
220 | if (ks) { | ||
221 | printk_unused_warning(name); | ||
222 | *crc = symversion(__start___kcrctab_unused_gpl, | ||
223 | (ks - __start___ksymtab_unused_gpl)); | ||
224 | return ks->value; | ||
225 | } | ||
226 | |||
189 | /* Now try modules. */ | 227 | /* Now try modules. */ |
190 | list_for_each_entry(mod, &modules, list) { | 228 | list_for_each_entry(mod, &modules, list) { |
191 | *owner = mod; | 229 | *owner = mod; |
@@ -204,6 +242,23 @@ static unsigned long __find_symbol(const char *name, | |||
204 | return ks->value; | 242 | return ks->value; |
205 | } | 243 | } |
206 | } | 244 | } |
245 | ks = lookup_symbol(name, mod->unused_syms, mod->unused_syms + mod->num_unused_syms); | ||
246 | if (ks) { | ||
247 | printk_unused_warning(name); | ||
248 | *crc = symversion(mod->unused_crcs, (ks - mod->unused_syms)); | ||
249 | return ks->value; | ||
250 | } | ||
251 | |||
252 | if (gplok) { | ||
253 | ks = lookup_symbol(name, mod->unused_gpl_syms, | ||
254 | mod->unused_gpl_syms + mod->num_unused_gpl_syms); | ||
255 | if (ks) { | ||
256 | printk_unused_warning(name); | ||
257 | *crc = symversion(mod->unused_gpl_crcs, | ||
258 | (ks - mod->unused_gpl_syms)); | ||
259 | return ks->value; | ||
260 | } | ||
261 | } | ||
207 | ks = lookup_symbol(name, mod->gpl_future_syms, | 262 | ks = lookup_symbol(name, mod->gpl_future_syms, |
208 | (mod->gpl_future_syms + | 263 | (mod->gpl_future_syms + |
209 | mod->num_gpl_future_syms)); | 264 | mod->num_gpl_future_syms)); |
@@ -1403,10 +1458,27 @@ static struct module *load_module(void __user *umod, | |||
1403 | Elf_Ehdr *hdr; | 1458 | Elf_Ehdr *hdr; |
1404 | Elf_Shdr *sechdrs; | 1459 | Elf_Shdr *sechdrs; |
1405 | char *secstrings, *args, *modmagic, *strtab = NULL; | 1460 | char *secstrings, *args, *modmagic, *strtab = NULL; |
1406 | unsigned int i, symindex = 0, strindex = 0, setupindex, exindex, | 1461 | unsigned int i; |
1407 | exportindex, modindex, obsparmindex, infoindex, gplindex, | 1462 | unsigned int symindex = 0; |
1408 | crcindex, gplcrcindex, versindex, pcpuindex, gplfutureindex, | 1463 | unsigned int strindex = 0; |
1409 | gplfuturecrcindex, unwindex = 0; | 1464 | unsigned int setupindex; |
1465 | unsigned int exindex; | ||
1466 | unsigned int exportindex; | ||
1467 | unsigned int modindex; | ||
1468 | unsigned int obsparmindex; | ||
1469 | unsigned int infoindex; | ||
1470 | unsigned int gplindex; | ||
1471 | unsigned int crcindex; | ||
1472 | unsigned int gplcrcindex; | ||
1473 | unsigned int versindex; | ||
1474 | unsigned int pcpuindex; | ||
1475 | unsigned int gplfutureindex; | ||
1476 | unsigned int gplfuturecrcindex; | ||
1477 | unsigned int unwindex = 0; | ||
1478 | unsigned int unusedindex; | ||
1479 | unsigned int unusedcrcindex; | ||
1480 | unsigned int unusedgplindex; | ||
1481 | unsigned int unusedgplcrcindex; | ||
1410 | struct module *mod; | 1482 | struct module *mod; |
1411 | long err = 0; | 1483 | long err = 0; |
1412 | void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */ | 1484 | void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */ |
@@ -1487,9 +1559,13 @@ static struct module *load_module(void __user *umod, | |||
1487 | exportindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab"); | 1559 | exportindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab"); |
1488 | gplindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_gpl"); | 1560 | gplindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_gpl"); |
1489 | gplfutureindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_gpl_future"); | 1561 | gplfutureindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_gpl_future"); |
1562 | unusedindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_unused"); | ||
1563 | unusedgplindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_unused_gpl"); | ||
1490 | crcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab"); | 1564 | crcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab"); |
1491 | gplcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_gpl"); | 1565 | gplcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_gpl"); |
1492 | gplfuturecrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_gpl_future"); | 1566 | gplfuturecrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_gpl_future"); |
1567 | unusedcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_unused"); | ||
1568 | unusedgplcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_unused_gpl"); | ||
1493 | setupindex = find_sec(hdr, sechdrs, secstrings, "__param"); | 1569 | setupindex = find_sec(hdr, sechdrs, secstrings, "__param"); |
1494 | exindex = find_sec(hdr, sechdrs, secstrings, "__ex_table"); | 1570 | exindex = find_sec(hdr, sechdrs, secstrings, "__ex_table"); |
1495 | obsparmindex = find_sec(hdr, sechdrs, secstrings, "__obsparm"); | 1571 | obsparmindex = find_sec(hdr, sechdrs, secstrings, "__obsparm"); |
@@ -1638,14 +1714,27 @@ static struct module *load_module(void __user *umod, | |||
1638 | mod->gpl_crcs = (void *)sechdrs[gplcrcindex].sh_addr; | 1714 | mod->gpl_crcs = (void *)sechdrs[gplcrcindex].sh_addr; |
1639 | mod->num_gpl_future_syms = sechdrs[gplfutureindex].sh_size / | 1715 | mod->num_gpl_future_syms = sechdrs[gplfutureindex].sh_size / |
1640 | sizeof(*mod->gpl_future_syms); | 1716 | sizeof(*mod->gpl_future_syms); |
1717 | mod->num_unused_syms = sechdrs[unusedindex].sh_size / | ||
1718 | sizeof(*mod->unused_syms); | ||
1719 | mod->num_unused_gpl_syms = sechdrs[unusedgplindex].sh_size / | ||
1720 | sizeof(*mod->unused_gpl_syms); | ||
1641 | mod->gpl_future_syms = (void *)sechdrs[gplfutureindex].sh_addr; | 1721 | mod->gpl_future_syms = (void *)sechdrs[gplfutureindex].sh_addr; |
1642 | if (gplfuturecrcindex) | 1722 | if (gplfuturecrcindex) |
1643 | mod->gpl_future_crcs = (void *)sechdrs[gplfuturecrcindex].sh_addr; | 1723 | mod->gpl_future_crcs = (void *)sechdrs[gplfuturecrcindex].sh_addr; |
1644 | 1724 | ||
1725 | mod->unused_syms = (void *)sechdrs[unusedindex].sh_addr; | ||
1726 | if (unusedcrcindex) | ||
1727 | mod->unused_crcs = (void *)sechdrs[unusedcrcindex].sh_addr; | ||
1728 | mod->unused_gpl_syms = (void *)sechdrs[unusedgplindex].sh_addr; | ||
1729 | if (unusedgplcrcindex) | ||
1730 | mod->unused_crcs = (void *)sechdrs[unusedgplcrcindex].sh_addr; | ||
1731 | |||
1645 | #ifdef CONFIG_MODVERSIONS | 1732 | #ifdef CONFIG_MODVERSIONS |
1646 | if ((mod->num_syms && !crcindex) || | 1733 | if ((mod->num_syms && !crcindex) || |
1647 | (mod->num_gpl_syms && !gplcrcindex) || | 1734 | (mod->num_gpl_syms && !gplcrcindex) || |
1648 | (mod->num_gpl_future_syms && !gplfuturecrcindex)) { | 1735 | (mod->num_gpl_future_syms && !gplfuturecrcindex) || |
1736 | (mod->num_unused_syms && !unusedcrcindex) || | ||
1737 | (mod->num_unused_gpl_syms && !unusedgplcrcindex)) { | ||
1649 | printk(KERN_WARNING "%s: No versions for exported symbols." | 1738 | printk(KERN_WARNING "%s: No versions for exported symbols." |
1650 | " Tainting kernel.\n", mod->name); | 1739 | " Tainting kernel.\n", mod->name); |
1651 | add_taint(TAINT_FORCED_MODULE); | 1740 | add_taint(TAINT_FORCED_MODULE); |
diff --git a/kernel/resource.c b/kernel/resource.c index 2404f9b0bc47..bf1130d81b7f 100644 --- a/kernel/resource.c +++ b/kernel/resource.c | |||
@@ -23,20 +23,18 @@ | |||
23 | 23 | ||
24 | struct resource ioport_resource = { | 24 | struct resource ioport_resource = { |
25 | .name = "PCI IO", | 25 | .name = "PCI IO", |
26 | .start = 0x0000, | 26 | .start = 0, |
27 | .end = IO_SPACE_LIMIT, | 27 | .end = IO_SPACE_LIMIT, |
28 | .flags = IORESOURCE_IO, | 28 | .flags = IORESOURCE_IO, |
29 | }; | 29 | }; |
30 | |||
31 | EXPORT_SYMBOL(ioport_resource); | 30 | EXPORT_SYMBOL(ioport_resource); |
32 | 31 | ||
33 | struct resource iomem_resource = { | 32 | struct resource iomem_resource = { |
34 | .name = "PCI mem", | 33 | .name = "PCI mem", |
35 | .start = 0UL, | 34 | .start = 0, |
36 | .end = ~0UL, | 35 | .end = -1, |
37 | .flags = IORESOURCE_MEM, | 36 | .flags = IORESOURCE_MEM, |
38 | }; | 37 | }; |
39 | |||
40 | EXPORT_SYMBOL(iomem_resource); | 38 | EXPORT_SYMBOL(iomem_resource); |
41 | 39 | ||
42 | static DEFINE_RWLOCK(resource_lock); | 40 | static DEFINE_RWLOCK(resource_lock); |
@@ -83,10 +81,10 @@ static int r_show(struct seq_file *m, void *v) | |||
83 | for (depth = 0, p = r; depth < MAX_IORES_LEVEL; depth++, p = p->parent) | 81 | for (depth = 0, p = r; depth < MAX_IORES_LEVEL; depth++, p = p->parent) |
84 | if (p->parent == root) | 82 | if (p->parent == root) |
85 | break; | 83 | break; |
86 | seq_printf(m, "%*s%0*lx-%0*lx : %s\n", | 84 | seq_printf(m, "%*s%0*llx-%0*llx : %s\n", |
87 | depth * 2, "", | 85 | depth * 2, "", |
88 | width, r->start, | 86 | width, (unsigned long long) r->start, |
89 | width, r->end, | 87 | width, (unsigned long long) r->end, |
90 | r->name ? r->name : "<BAD>"); | 88 | r->name ? r->name : "<BAD>"); |
91 | return 0; | 89 | return 0; |
92 | } | 90 | } |
@@ -151,8 +149,8 @@ __initcall(ioresources_init); | |||
151 | /* Return the conflict entry if you can't request it */ | 149 | /* Return the conflict entry if you can't request it */ |
152 | static struct resource * __request_resource(struct resource *root, struct resource *new) | 150 | static struct resource * __request_resource(struct resource *root, struct resource *new) |
153 | { | 151 | { |
154 | unsigned long start = new->start; | 152 | resource_size_t start = new->start; |
155 | unsigned long end = new->end; | 153 | resource_size_t end = new->end; |
156 | struct resource *tmp, **p; | 154 | struct resource *tmp, **p; |
157 | 155 | ||
158 | if (end < start) | 156 | if (end < start) |
@@ -274,11 +272,10 @@ int find_next_system_ram(struct resource *res) | |||
274 | * Find empty slot in the resource tree given range and alignment. | 272 | * Find empty slot in the resource tree given range and alignment. |
275 | */ | 273 | */ |
276 | static int find_resource(struct resource *root, struct resource *new, | 274 | static int find_resource(struct resource *root, struct resource *new, |
277 | unsigned long size, | 275 | resource_size_t size, resource_size_t min, |
278 | unsigned long min, unsigned long max, | 276 | resource_size_t max, resource_size_t align, |
279 | unsigned long align, | ||
280 | void (*alignf)(void *, struct resource *, | 277 | void (*alignf)(void *, struct resource *, |
281 | unsigned long, unsigned long), | 278 | resource_size_t, resource_size_t), |
282 | void *alignf_data) | 279 | void *alignf_data) |
283 | { | 280 | { |
284 | struct resource *this = root->child; | 281 | struct resource *this = root->child; |
@@ -320,11 +317,10 @@ static int find_resource(struct resource *root, struct resource *new, | |||
320 | * Allocate empty slot in the resource tree given range and alignment. | 317 | * Allocate empty slot in the resource tree given range and alignment. |
321 | */ | 318 | */ |
322 | int allocate_resource(struct resource *root, struct resource *new, | 319 | int allocate_resource(struct resource *root, struct resource *new, |
323 | unsigned long size, | 320 | resource_size_t size, resource_size_t min, |
324 | unsigned long min, unsigned long max, | 321 | resource_size_t max, resource_size_t align, |
325 | unsigned long align, | ||
326 | void (*alignf)(void *, struct resource *, | 322 | void (*alignf)(void *, struct resource *, |
327 | unsigned long, unsigned long), | 323 | resource_size_t, resource_size_t), |
328 | void *alignf_data) | 324 | void *alignf_data) |
329 | { | 325 | { |
330 | int err; | 326 | int err; |
@@ -416,10 +412,10 @@ EXPORT_SYMBOL(insert_resource); | |||
416 | * arguments. Returns -EBUSY if it can't fit. Existing children of | 412 | * arguments. Returns -EBUSY if it can't fit. Existing children of |
417 | * the resource are assumed to be immutable. | 413 | * the resource are assumed to be immutable. |
418 | */ | 414 | */ |
419 | int adjust_resource(struct resource *res, unsigned long start, unsigned long size) | 415 | int adjust_resource(struct resource *res, resource_size_t start, resource_size_t size) |
420 | { | 416 | { |
421 | struct resource *tmp, *parent = res->parent; | 417 | struct resource *tmp, *parent = res->parent; |
422 | unsigned long end = start + size - 1; | 418 | resource_size_t end = start + size - 1; |
423 | int result = -EBUSY; | 419 | int result = -EBUSY; |
424 | 420 | ||
425 | write_lock(&resource_lock); | 421 | write_lock(&resource_lock); |
@@ -466,7 +462,9 @@ EXPORT_SYMBOL(adjust_resource); | |||
466 | * | 462 | * |
467 | * Release-region releases a matching busy region. | 463 | * Release-region releases a matching busy region. |
468 | */ | 464 | */ |
469 | struct resource * __request_region(struct resource *parent, unsigned long start, unsigned long n, const char *name) | 465 | struct resource * __request_region(struct resource *parent, |
466 | resource_size_t start, resource_size_t n, | ||
467 | const char *name) | ||
470 | { | 468 | { |
471 | struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL); | 469 | struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL); |
472 | 470 | ||
@@ -502,7 +500,8 @@ struct resource * __request_region(struct resource *parent, unsigned long start, | |||
502 | 500 | ||
503 | EXPORT_SYMBOL(__request_region); | 501 | EXPORT_SYMBOL(__request_region); |
504 | 502 | ||
505 | int __check_region(struct resource *parent, unsigned long start, unsigned long n) | 503 | int __check_region(struct resource *parent, resource_size_t start, |
504 | resource_size_t n) | ||
506 | { | 505 | { |
507 | struct resource * res; | 506 | struct resource * res; |
508 | 507 | ||
@@ -517,10 +516,11 @@ int __check_region(struct resource *parent, unsigned long start, unsigned long n | |||
517 | 516 | ||
518 | EXPORT_SYMBOL(__check_region); | 517 | EXPORT_SYMBOL(__check_region); |
519 | 518 | ||
520 | void __release_region(struct resource *parent, unsigned long start, unsigned long n) | 519 | void __release_region(struct resource *parent, resource_size_t start, |
520 | resource_size_t n) | ||
521 | { | 521 | { |
522 | struct resource **p; | 522 | struct resource **p; |
523 | unsigned long end; | 523 | resource_size_t end; |
524 | 524 | ||
525 | p = &parent->child; | 525 | p = &parent->child; |
526 | end = start + n - 1; | 526 | end = start + n - 1; |
@@ -549,7 +549,9 @@ void __release_region(struct resource *parent, unsigned long start, unsigned lon | |||
549 | 549 | ||
550 | write_unlock(&resource_lock); | 550 | write_unlock(&resource_lock); |
551 | 551 | ||
552 | printk(KERN_WARNING "Trying to free nonexistent resource <%08lx-%08lx>\n", start, end); | 552 | printk(KERN_WARNING "Trying to free nonexistent resource " |
553 | "<%016llx-%016llx>\n", (unsigned long long)start, | ||
554 | (unsigned long long)end); | ||
553 | } | 555 | } |
554 | 556 | ||
555 | EXPORT_SYMBOL(__release_region); | 557 | EXPORT_SYMBOL(__release_region); |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 5330911ebd30..e4fcbd12cf6e 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
@@ -23,6 +23,22 @@ config MAGIC_SYSRQ | |||
23 | keys are documented in <file:Documentation/sysrq.txt>. Don't say Y | 23 | keys are documented in <file:Documentation/sysrq.txt>. Don't say Y |
24 | unless you really know what this hack does. | 24 | unless you really know what this hack does. |
25 | 25 | ||
26 | config UNUSED_SYMBOLS | ||
27 | bool "Enable unused/obsolete exported symbols" | ||
28 | default y if X86 | ||
29 | help | ||
30 | Unused but exported symbols make the kernel needlessly bigger. For | ||
31 | that reason most of these unused exports will soon be removed. This | ||
32 | option is provided temporarily to provide a transition period in case | ||
33 | some external kernel module needs one of these symbols anyway. If you | ||
34 | encounter such a case in your module, consider if you are actually | ||
35 | using the right API. (rationale: since nobody in the kernel is using | ||
36 | this in a module, there is a pretty good chance it's actually the | ||
37 | wrong interface to use). If you really need the symbol, please send a | ||
38 | mail to the linux kernel mailing list mentioning the symbol and why | ||
39 | you really need it, and what the merge plan to the mainline kernel for | ||
40 | your module is. | ||
41 | |||
26 | config DEBUG_KERNEL | 42 | config DEBUG_KERNEL |
27 | bool "Kernel debugging" | 43 | bool "Kernel debugging" |
28 | help | 44 | help |
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 797428afd111..bed7229378f2 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
@@ -489,7 +489,7 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) | |||
489 | if (str < end) | 489 | if (str < end) |
490 | *str = '\0'; | 490 | *str = '\0'; |
491 | else | 491 | else |
492 | *end = '\0'; | 492 | end[-1] = '\0'; |
493 | } | 493 | } |
494 | /* the trailing null byte doesn't count towards the total */ | 494 | /* the trailing null byte doesn't count towards the total */ |
495 | return str-buf; | 495 | return str-buf; |
diff --git a/mm/Kconfig b/mm/Kconfig index e76c023eb0bb..8f5b45615f7b 100644 --- a/mm/Kconfig +++ b/mm/Kconfig | |||
@@ -115,7 +115,7 @@ config SPARSEMEM_EXTREME | |||
115 | # eventually, we can have this option just 'select SPARSEMEM' | 115 | # eventually, we can have this option just 'select SPARSEMEM' |
116 | config MEMORY_HOTPLUG | 116 | config MEMORY_HOTPLUG |
117 | bool "Allow for memory hot-add" | 117 | bool "Allow for memory hot-add" |
118 | depends on SPARSEMEM && HOTPLUG && !SOFTWARE_SUSPEND | 118 | depends on SPARSEMEM && HOTPLUG && !SOFTWARE_SUSPEND && ARCH_ENABLE_MEMORY_HOTPLUG |
119 | depends on (IA64 || X86 || PPC64) | 119 | depends on (IA64 || X86 || PPC64) |
120 | 120 | ||
121 | comment "Memory hotplug is currently incompatible with Software Suspend" | 121 | comment "Memory hotplug is currently incompatible with Software Suspend" |
@@ -146,3 +146,9 @@ config MIGRATION | |||
146 | while the virtual addresses are not changed. This is useful for | 146 | while the virtual addresses are not changed. This is useful for |
147 | example on NUMA systems to put pages nearer to the processors accessing | 147 | example on NUMA systems to put pages nearer to the processors accessing |
148 | the page. | 148 | the page. |
149 | |||
150 | config RESOURCES_64BIT | ||
151 | bool "64 bit Memory and IO resources (EXPERIMENTAL)" if (!64BIT && EXPERIMENTAL) | ||
152 | default 64BIT | ||
153 | help | ||
154 | This option allows memory and IO resources to be 64 bit. | ||
diff --git a/mm/filemap.c b/mm/filemap.c index d504d6e98886..648f2c0c8e18 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -2069,7 +2069,7 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov, | |||
2069 | { | 2069 | { |
2070 | struct file *file = iocb->ki_filp; | 2070 | struct file *file = iocb->ki_filp; |
2071 | struct address_space * mapping = file->f_mapping; | 2071 | struct address_space * mapping = file->f_mapping; |
2072 | struct address_space_operations *a_ops = mapping->a_ops; | 2072 | const struct address_space_operations *a_ops = mapping->a_ops; |
2073 | struct inode *inode = mapping->host; | 2073 | struct inode *inode = mapping->host; |
2074 | long status = 0; | 2074 | long status = 0; |
2075 | struct page *page; | 2075 | struct page *page; |
@@ -2125,6 +2125,12 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov, | |||
2125 | break; | 2125 | break; |
2126 | } | 2126 | } |
2127 | 2127 | ||
2128 | if (unlikely(bytes == 0)) { | ||
2129 | status = 0; | ||
2130 | copied = 0; | ||
2131 | goto zero_length_segment; | ||
2132 | } | ||
2133 | |||
2128 | status = a_ops->prepare_write(file, page, offset, offset+bytes); | 2134 | status = a_ops->prepare_write(file, page, offset, offset+bytes); |
2129 | if (unlikely(status)) { | 2135 | if (unlikely(status)) { |
2130 | loff_t isize = i_size_read(inode); | 2136 | loff_t isize = i_size_read(inode); |
@@ -2154,7 +2160,8 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov, | |||
2154 | page_cache_release(page); | 2160 | page_cache_release(page); |
2155 | continue; | 2161 | continue; |
2156 | } | 2162 | } |
2157 | if (likely(copied > 0)) { | 2163 | zero_length_segment: |
2164 | if (likely(copied >= 0)) { | ||
2158 | if (!status) | 2165 | if (!status) |
2159 | status = copied; | 2166 | status = copied; |
2160 | 2167 | ||
@@ -2219,7 +2226,7 @@ __generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov, | |||
2219 | unsigned long nr_segs, loff_t *ppos) | 2226 | unsigned long nr_segs, loff_t *ppos) |
2220 | { | 2227 | { |
2221 | struct file *file = iocb->ki_filp; | 2228 | struct file *file = iocb->ki_filp; |
2222 | struct address_space * mapping = file->f_mapping; | 2229 | const struct address_space * mapping = file->f_mapping; |
2223 | size_t ocount; /* original count */ | 2230 | size_t ocount; /* original count */ |
2224 | size_t count; /* after file limit checks */ | 2231 | size_t count; /* after file limit checks */ |
2225 | struct inode *inode = mapping->host; | 2232 | struct inode *inode = mapping->host; |
diff --git a/mm/filemap.h b/mm/filemap.h index 536979fb4ba7..3f2a343c6015 100644 --- a/mm/filemap.h +++ b/mm/filemap.h | |||
@@ -88,7 +88,7 @@ filemap_set_next_iovec(const struct iovec **iovp, size_t *basep, size_t bytes) | |||
88 | const struct iovec *iov = *iovp; | 88 | const struct iovec *iov = *iovp; |
89 | size_t base = *basep; | 89 | size_t base = *basep; |
90 | 90 | ||
91 | while (bytes) { | 91 | do { |
92 | int copy = min(bytes, iov->iov_len - base); | 92 | int copy = min(bytes, iov->iov_len - base); |
93 | 93 | ||
94 | bytes -= copy; | 94 | bytes -= copy; |
@@ -97,7 +97,7 @@ filemap_set_next_iovec(const struct iovec **iovp, size_t *basep, size_t bytes) | |||
97 | iov++; | 97 | iov++; |
98 | base = 0; | 98 | base = 0; |
99 | } | 99 | } |
100 | } | 100 | } while (bytes); |
101 | *iovp = iov; | 101 | *iovp = iov; |
102 | *basep = base; | 102 | *basep = base; |
103 | } | 103 | } |
diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c index b960ac8e5918..b4fd0d7c9bfb 100644 --- a/mm/filemap_xip.c +++ b/mm/filemap_xip.c | |||
@@ -273,7 +273,7 @@ __xip_file_write(struct file *filp, const char __user *buf, | |||
273 | size_t count, loff_t pos, loff_t *ppos) | 273 | size_t count, loff_t pos, loff_t *ppos) |
274 | { | 274 | { |
275 | struct address_space * mapping = filp->f_mapping; | 275 | struct address_space * mapping = filp->f_mapping; |
276 | struct address_space_operations *a_ops = mapping->a_ops; | 276 | const struct address_space_operations *a_ops = mapping->a_ops; |
277 | struct inode *inode = mapping->host; | 277 | struct inode *inode = mapping->host; |
278 | long status = 0; | 278 | long status = 0; |
279 | struct page *page; | 279 | struct page *page; |
diff --git a/mm/shmem.c b/mm/shmem.c index 38bc3334f263..ea64c07cbe72 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -174,7 +174,7 @@ static inline void shmem_unacct_blocks(unsigned long flags, long pages) | |||
174 | } | 174 | } |
175 | 175 | ||
176 | static struct super_operations shmem_ops; | 176 | static struct super_operations shmem_ops; |
177 | static struct address_space_operations shmem_aops; | 177 | static const struct address_space_operations shmem_aops; |
178 | static struct file_operations shmem_file_operations; | 178 | static struct file_operations shmem_file_operations; |
179 | static struct inode_operations shmem_inode_operations; | 179 | static struct inode_operations shmem_inode_operations; |
180 | static struct inode_operations shmem_dir_inode_operations; | 180 | static struct inode_operations shmem_dir_inode_operations; |
@@ -2162,7 +2162,7 @@ static void destroy_inodecache(void) | |||
2162 | printk(KERN_INFO "shmem_inode_cache: not all structures were freed\n"); | 2162 | printk(KERN_INFO "shmem_inode_cache: not all structures were freed\n"); |
2163 | } | 2163 | } |
2164 | 2164 | ||
2165 | static struct address_space_operations shmem_aops = { | 2165 | static const struct address_space_operations shmem_aops = { |
2166 | .writepage = shmem_writepage, | 2166 | .writepage = shmem_writepage, |
2167 | .set_page_dirty = __set_page_dirty_nobuffers, | 2167 | .set_page_dirty = __set_page_dirty_nobuffers, |
2168 | #ifdef CONFIG_TMPFS | 2168 | #ifdef CONFIG_TMPFS |
diff --git a/mm/swap_state.c b/mm/swap_state.c index e0e1583f32c2..7535211bb495 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c | |||
@@ -24,7 +24,7 @@ | |||
24 | * vmscan's shrink_list, to make sync_page look nicer, and to allow | 24 | * vmscan's shrink_list, to make sync_page look nicer, and to allow |
25 | * future use of radix_tree tags in the swap cache. | 25 | * future use of radix_tree tags in the swap cache. |
26 | */ | 26 | */ |
27 | static struct address_space_operations swap_aops = { | 27 | static const struct address_space_operations swap_aops = { |
28 | .writepage = swap_writepage, | 28 | .writepage = swap_writepage, |
29 | .sync_page = block_sync_page, | 29 | .sync_page = block_sync_page, |
30 | .set_page_dirty = __set_page_dirty_nobuffers, | 30 | .set_page_dirty = __set_page_dirty_nobuffers, |
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c index 74368f79ee5d..b81fad893328 100644 --- a/net/bluetooth/rfcomm/tty.c +++ b/net/bluetooth/rfcomm/tty.c | |||
@@ -480,12 +480,8 @@ static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb) | |||
480 | 480 | ||
481 | BT_DBG("dlc %p tty %p len %d", dlc, tty, skb->len); | 481 | BT_DBG("dlc %p tty %p len %d", dlc, tty, skb->len); |
482 | 482 | ||
483 | if (test_bit(TTY_DONT_FLIP, &tty->flags)) { | 483 | tty_insert_flip_string(tty, skb->data, skb->len); |
484 | tty_buffer_request_room(tty, skb->len); | 484 | tty_flip_buffer_push(tty); |
485 | tty_insert_flip_string(tty, skb->data, skb->len); | ||
486 | tty_flip_buffer_push(tty); | ||
487 | } else | ||
488 | tty->ldisc.receive_buf(tty, skb->data, NULL, skb->len); | ||
489 | 485 | ||
490 | kfree_skb(skb); | 486 | kfree_skb(skb); |
491 | } | 487 | } |
diff --git a/security/keys/internal.h b/security/keys/internal.h index 3c2877f0663e..1bb416f4bbce 100644 --- a/security/keys/internal.h +++ b/security/keys/internal.h | |||
@@ -99,6 +99,7 @@ extern int install_process_keyring(struct task_struct *tsk); | |||
99 | extern struct key *request_key_and_link(struct key_type *type, | 99 | extern struct key *request_key_and_link(struct key_type *type, |
100 | const char *description, | 100 | const char *description, |
101 | const char *callout_info, | 101 | const char *callout_info, |
102 | void *aux, | ||
102 | struct key *dest_keyring, | 103 | struct key *dest_keyring, |
103 | unsigned long flags); | 104 | unsigned long flags); |
104 | 105 | ||
diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c index 329411cf8768..d9ca15c109cc 100644 --- a/security/keys/keyctl.c +++ b/security/keys/keyctl.c | |||
@@ -183,7 +183,7 @@ asmlinkage long sys_request_key(const char __user *_type, | |||
183 | } | 183 | } |
184 | 184 | ||
185 | /* do the search */ | 185 | /* do the search */ |
186 | key = request_key_and_link(ktype, description, callout_info, | 186 | key = request_key_and_link(ktype, description, callout_info, NULL, |
187 | key_ref_to_ptr(dest_ref), | 187 | key_ref_to_ptr(dest_ref), |
188 | KEY_ALLOC_IN_QUOTA); | 188 | KEY_ALLOC_IN_QUOTA); |
189 | if (IS_ERR(key)) { | 189 | if (IS_ERR(key)) { |
diff --git a/security/keys/request_key.c b/security/keys/request_key.c index 58d1efd4fc2c..f573ac189a0a 100644 --- a/security/keys/request_key.c +++ b/security/keys/request_key.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* request_key.c: request a key from userspace | 1 | /* request_key.c: request a key from userspace |
2 | * | 2 | * |
3 | * Copyright (C) 2004-5 Red Hat, Inc. All Rights Reserved. | 3 | * Copyright (C) 2004-6 Red Hat, Inc. All Rights Reserved. |
4 | * Written by David Howells (dhowells@redhat.com) | 4 | * Written by David Howells (dhowells@redhat.com) |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or | 6 | * This program is free software; you can redistribute it and/or |
@@ -33,7 +33,8 @@ DECLARE_WAIT_QUEUE_HEAD(request_key_conswq); | |||
33 | */ | 33 | */ |
34 | static int call_sbin_request_key(struct key *key, | 34 | static int call_sbin_request_key(struct key *key, |
35 | struct key *authkey, | 35 | struct key *authkey, |
36 | const char *op) | 36 | const char *op, |
37 | void *aux) | ||
37 | { | 38 | { |
38 | struct task_struct *tsk = current; | 39 | struct task_struct *tsk = current; |
39 | key_serial_t prkey, sskey; | 40 | key_serial_t prkey, sskey; |
@@ -127,6 +128,7 @@ error_alloc: | |||
127 | static struct key *__request_key_construction(struct key_type *type, | 128 | static struct key *__request_key_construction(struct key_type *type, |
128 | const char *description, | 129 | const char *description, |
129 | const char *callout_info, | 130 | const char *callout_info, |
131 | void *aux, | ||
130 | unsigned long flags) | 132 | unsigned long flags) |
131 | { | 133 | { |
132 | request_key_actor_t actor; | 134 | request_key_actor_t actor; |
@@ -164,7 +166,7 @@ static struct key *__request_key_construction(struct key_type *type, | |||
164 | actor = call_sbin_request_key; | 166 | actor = call_sbin_request_key; |
165 | if (type->request_key) | 167 | if (type->request_key) |
166 | actor = type->request_key; | 168 | actor = type->request_key; |
167 | ret = actor(key, authkey, "create"); | 169 | ret = actor(key, authkey, "create", aux); |
168 | if (ret < 0) | 170 | if (ret < 0) |
169 | goto request_failed; | 171 | goto request_failed; |
170 | 172 | ||
@@ -258,8 +260,9 @@ alloc_failed: | |||
258 | */ | 260 | */ |
259 | static struct key *request_key_construction(struct key_type *type, | 261 | static struct key *request_key_construction(struct key_type *type, |
260 | const char *description, | 262 | const char *description, |
261 | struct key_user *user, | ||
262 | const char *callout_info, | 263 | const char *callout_info, |
264 | void *aux, | ||
265 | struct key_user *user, | ||
263 | unsigned long flags) | 266 | unsigned long flags) |
264 | { | 267 | { |
265 | struct key_construction *pcons; | 268 | struct key_construction *pcons; |
@@ -284,7 +287,7 @@ static struct key *request_key_construction(struct key_type *type, | |||
284 | } | 287 | } |
285 | 288 | ||
286 | /* see about getting userspace to construct the key */ | 289 | /* see about getting userspace to construct the key */ |
287 | key = __request_key_construction(type, description, callout_info, | 290 | key = __request_key_construction(type, description, callout_info, aux, |
288 | flags); | 291 | flags); |
289 | error: | 292 | error: |
290 | kleave(" = %p", key); | 293 | kleave(" = %p", key); |
@@ -392,6 +395,7 @@ static void request_key_link(struct key *key, struct key *dest_keyring) | |||
392 | struct key *request_key_and_link(struct key_type *type, | 395 | struct key *request_key_and_link(struct key_type *type, |
393 | const char *description, | 396 | const char *description, |
394 | const char *callout_info, | 397 | const char *callout_info, |
398 | void *aux, | ||
395 | struct key *dest_keyring, | 399 | struct key *dest_keyring, |
396 | unsigned long flags) | 400 | unsigned long flags) |
397 | { | 401 | { |
@@ -399,8 +403,9 @@ struct key *request_key_and_link(struct key_type *type, | |||
399 | struct key *key; | 403 | struct key *key; |
400 | key_ref_t key_ref; | 404 | key_ref_t key_ref; |
401 | 405 | ||
402 | kenter("%s,%s,%s,%p,%lx", | 406 | kenter("%s,%s,%s,%p,%p,%lx", |
403 | type->name, description, callout_info, dest_keyring, flags); | 407 | type->name, description, callout_info, aux, |
408 | dest_keyring, flags); | ||
404 | 409 | ||
405 | /* search all the process keyrings for a key */ | 410 | /* search all the process keyrings for a key */ |
406 | key_ref = search_process_keyrings(type, description, type->match, | 411 | key_ref = search_process_keyrings(type, description, type->match, |
@@ -433,8 +438,8 @@ struct key *request_key_and_link(struct key_type *type, | |||
433 | /* ask userspace (returns NULL if it waited on a key | 438 | /* ask userspace (returns NULL if it waited on a key |
434 | * being constructed) */ | 439 | * being constructed) */ |
435 | key = request_key_construction(type, description, | 440 | key = request_key_construction(type, description, |
436 | user, callout_info, | 441 | callout_info, aux, |
437 | flags); | 442 | user, flags); |
438 | if (key) | 443 | if (key) |
439 | break; | 444 | break; |
440 | 445 | ||
@@ -491,8 +496,27 @@ struct key *request_key(struct key_type *type, | |||
491 | const char *callout_info) | 496 | const char *callout_info) |
492 | { | 497 | { |
493 | return request_key_and_link(type, description, callout_info, NULL, | 498 | return request_key_and_link(type, description, callout_info, NULL, |
494 | KEY_ALLOC_IN_QUOTA); | 499 | NULL, KEY_ALLOC_IN_QUOTA); |
495 | 500 | ||
496 | } /* end request_key() */ | 501 | } /* end request_key() */ |
497 | 502 | ||
498 | EXPORT_SYMBOL(request_key); | 503 | EXPORT_SYMBOL(request_key); |
504 | |||
505 | /*****************************************************************************/ | ||
506 | /* | ||
507 | * request a key with auxiliary data for the upcaller | ||
508 | * - search the process's keyrings | ||
509 | * - check the list of keys being created or updated | ||
510 | * - call out to userspace for a key if supplementary info was provided | ||
511 | */ | ||
512 | struct key *request_key_with_auxdata(struct key_type *type, | ||
513 | const char *description, | ||
514 | const char *callout_info, | ||
515 | void *aux) | ||
516 | { | ||
517 | return request_key_and_link(type, description, callout_info, aux, | ||
518 | NULL, KEY_ALLOC_IN_QUOTA); | ||
519 | |||
520 | } /* end request_key_with_auxdata() */ | ||
521 | |||
522 | EXPORT_SYMBOL(request_key_with_auxdata); | ||
diff --git a/sound/arm/aaci.c b/sound/arm/aaci.c index 5f22d70fefc0..6b18225672c7 100644 --- a/sound/arm/aaci.c +++ b/sound/arm/aaci.c | |||
@@ -779,8 +779,9 @@ static struct aaci * __devinit aaci_init_card(struct amba_device *dev) | |||
779 | strlcpy(card->driver, DRIVER_NAME, sizeof(card->driver)); | 779 | strlcpy(card->driver, DRIVER_NAME, sizeof(card->driver)); |
780 | strlcpy(card->shortname, "ARM AC'97 Interface", sizeof(card->shortname)); | 780 | strlcpy(card->shortname, "ARM AC'97 Interface", sizeof(card->shortname)); |
781 | snprintf(card->longname, sizeof(card->longname), | 781 | snprintf(card->longname, sizeof(card->longname), |
782 | "%s at 0x%08lx, irq %d", | 782 | "%s at 0x%016llx, irq %d", |
783 | card->shortname, dev->res.start, dev->irq[0]); | 783 | card->shortname, (unsigned long long)dev->res.start, |
784 | dev->irq[0]); | ||
784 | 785 | ||
785 | aaci = card->private_data; | 786 | aaci = card->private_data; |
786 | mutex_init(&aaci->ac97_sem); | 787 | mutex_init(&aaci->ac97_sem); |
diff --git a/sound/drivers/mpu401/mpu401.c b/sound/drivers/mpu401/mpu401.c index d3cbbb047582..8b80024968be 100644 --- a/sound/drivers/mpu401/mpu401.c +++ b/sound/drivers/mpu401/mpu401.c | |||
@@ -160,8 +160,9 @@ static int __devinit snd_mpu401_pnp(int dev, struct pnp_dev *device, | |||
160 | return -ENODEV; | 160 | return -ENODEV; |
161 | } | 161 | } |
162 | if (pnp_port_len(device, 0) < IO_EXTENT) { | 162 | if (pnp_port_len(device, 0) < IO_EXTENT) { |
163 | snd_printk(KERN_ERR "PnP port length is %ld, expected %d\n", | 163 | snd_printk(KERN_ERR "PnP port length is %llu, expected %d\n", |
164 | pnp_port_len(device, 0), IO_EXTENT); | 164 | (unsigned long long)pnp_port_len(device, 0), |
165 | IO_EXTENT); | ||
165 | return -ENODEV; | 166 | return -ENODEV; |
166 | } | 167 | } |
167 | port[dev] = pnp_port_start(device, 0); | 168 | port[dev] = pnp_port_start(device, 0); |
diff --git a/sound/isa/es18xx.c b/sound/isa/es18xx.c index e6945db8ed1b..af60b0bc8115 100644 --- a/sound/isa/es18xx.c +++ b/sound/isa/es18xx.c | |||
@@ -2088,7 +2088,8 @@ static int __devinit snd_audiodrive_pnp(int dev, struct snd_audiodrive *acard, | |||
2088 | kfree(cfg); | 2088 | kfree(cfg); |
2089 | return -EAGAIN; | 2089 | return -EAGAIN; |
2090 | } | 2090 | } |
2091 | snd_printdd("pnp: port=0x%lx\n", pnp_port_start(acard->devc, 0)); | 2091 | snd_printdd("pnp: port=0x%llx\n", |
2092 | (unsigned long long)pnp_port_start(acard->devc, 0)); | ||
2092 | /* PnP initialization */ | 2093 | /* PnP initialization */ |
2093 | pdev = acard->dev; | 2094 | pdev = acard->dev; |
2094 | pnp_init_resource_table(cfg); | 2095 | pnp_init_resource_table(cfg); |
diff --git a/sound/isa/gus/interwave.c b/sound/isa/gus/interwave.c index 866300f2acbb..c1c86e0fa56d 100644 --- a/sound/isa/gus/interwave.c +++ b/sound/isa/gus/interwave.c | |||
@@ -611,10 +611,10 @@ static int __devinit snd_interwave_pnp(int dev, struct snd_interwave *iwcard, | |||
611 | if (dma2[dev] >= 0) | 611 | if (dma2[dev] >= 0) |
612 | dma2[dev] = pnp_dma(pdev, 1); | 612 | dma2[dev] = pnp_dma(pdev, 1); |
613 | irq[dev] = pnp_irq(pdev, 0); | 613 | irq[dev] = pnp_irq(pdev, 0); |
614 | snd_printdd("isapnp IW: sb port=0x%lx, gf1 port=0x%lx, codec port=0x%lx\n", | 614 | snd_printdd("isapnp IW: sb port=0x%llx, gf1 port=0x%llx, codec port=0x%llx\n", |
615 | pnp_port_start(pdev, 0), | 615 | (unsigned long long)pnp_port_start(pdev, 0), |
616 | pnp_port_start(pdev, 1), | 616 | (unsigned long long)pnp_port_start(pdev, 1), |
617 | pnp_port_start(pdev, 2)); | 617 | (unsigned long long)pnp_port_start(pdev, 2)); |
618 | snd_printdd("isapnp IW: dma1=%i, dma2=%i, irq=%i\n", dma1[dev], dma2[dev], irq[dev]); | 618 | snd_printdd("isapnp IW: dma1=%i, dma2=%i, irq=%i\n", dma1[dev], dma2[dev], irq[dev]); |
619 | #ifdef SNDRV_STB | 619 | #ifdef SNDRV_STB |
620 | /* Tone Control initialization */ | 620 | /* Tone Control initialization */ |
diff --git a/sound/isa/sb/sb16.c b/sound/isa/sb/sb16.c index 7f7f05fa518a..d64e67f2bafa 100644 --- a/sound/isa/sb/sb16.c +++ b/sound/isa/sb/sb16.c | |||
@@ -327,7 +327,8 @@ static int __devinit snd_card_sb16_pnp(int dev, struct snd_card_sb16 *acard, | |||
327 | goto __wt_error; | 327 | goto __wt_error; |
328 | } | 328 | } |
329 | awe_port[dev] = pnp_port_start(pdev, 0); | 329 | awe_port[dev] = pnp_port_start(pdev, 0); |
330 | snd_printdd("pnp SB16: wavetable port=0x%lx\n", pnp_port_start(pdev, 0)); | 330 | snd_printdd("pnp SB16: wavetable port=0x%llx\n", |
331 | (unsigned long long)pnp_port_start(pdev, 0)); | ||
331 | } else { | 332 | } else { |
332 | __wt_error: | 333 | __wt_error: |
333 | if (pdev) { | 334 | if (pdev) { |
diff --git a/sound/oss/Kconfig b/sound/oss/Kconfig index 3b8cdbca2636..f4980ca5c05c 100644 --- a/sound/oss/Kconfig +++ b/sound/oss/Kconfig | |||
@@ -493,6 +493,19 @@ config SOUND_CS4232 | |||
493 | See <file:Documentation/sound/oss/CS4232> for more information on | 493 | See <file:Documentation/sound/oss/CS4232> for more information on |
494 | configuring this card. | 494 | configuring this card. |
495 | 495 | ||
496 | config SOUND_SSCAPE | ||
497 | tristate "Ensoniq SoundScape support" | ||
498 | depends on SOUND_OSS | ||
499 | help | ||
500 | Answer Y if you have a sound card based on the Ensoniq SoundScape | ||
501 | chipset. Such cards are being manufactured at least by Ensoniq, Spea | ||
502 | and Reveal (Reveal makes also other cards). | ||
503 | |||
504 | If you compile the driver into the kernel, you have to add | ||
505 | "sscape=<io>,<irq>,<dma>,<mpuio>,<mpuirq>" to the kernel command | ||
506 | line. | ||
507 | |||
508 | |||
496 | config SOUND_VMIDI | 509 | config SOUND_VMIDI |
497 | tristate "Loopback MIDI device support" | 510 | tristate "Loopback MIDI device support" |
498 | depends on SOUND_OSS | 511 | depends on SOUND_OSS |
diff --git a/sound/oss/cs4232.c b/sound/oss/cs4232.c index c7f86f09c28d..80f6c08e26e7 100644 --- a/sound/oss/cs4232.c +++ b/sound/oss/cs4232.c | |||
@@ -405,7 +405,7 @@ static const struct pnp_device_id cs4232_pnp_table[] = { | |||
405 | 405 | ||
406 | MODULE_DEVICE_TABLE(pnp, cs4232_pnp_table); | 406 | MODULE_DEVICE_TABLE(pnp, cs4232_pnp_table); |
407 | 407 | ||
408 | static int cs4232_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) | 408 | static int __init cs4232_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) |
409 | { | 409 | { |
410 | struct address_info *isapnpcfg; | 410 | struct address_info *isapnpcfg; |
411 | 411 | ||
diff --git a/sound/oss/forte.c b/sound/oss/forte.c index 0294eec8ad90..44e578098d76 100644 --- a/sound/oss/forte.c +++ b/sound/oss/forte.c | |||
@@ -2035,8 +2035,9 @@ forte_probe (struct pci_dev *pci_dev, const struct pci_device_id *pci_id) | |||
2035 | 2035 | ||
2036 | pci_set_drvdata (pci_dev, chip); | 2036 | pci_set_drvdata (pci_dev, chip); |
2037 | 2037 | ||
2038 | printk (KERN_INFO PFX "FM801 chip found at 0x%04lX-0x%04lX IRQ %u\n", | 2038 | printk (KERN_INFO PFX "FM801 chip found at 0x%04lX-0x%16llX IRQ %u\n", |
2039 | chip->iobase, pci_resource_end (pci_dev, 0), chip->irq); | 2039 | chip->iobase, (unsigned long long)pci_resource_end (pci_dev, 0), |
2040 | chip->irq); | ||
2040 | 2041 | ||
2041 | /* Power it up */ | 2042 | /* Power it up */ |
2042 | if ((ret = forte_chip_init (chip)) == 0) | 2043 | if ((ret = forte_chip_init (chip)) == 0) |
diff --git a/sound/oss/via82cxxx_audio.c b/sound/oss/via82cxxx_audio.c index 2343dedd44ae..29a6e0cff79f 100644 --- a/sound/oss/via82cxxx_audio.c +++ b/sound/oss/via82cxxx_audio.c | |||
@@ -309,7 +309,7 @@ struct via_info { | |||
309 | unsigned sixchannel: 1; /* 8233/35 with 6 channel support */ | 309 | unsigned sixchannel: 1; /* 8233/35 with 6 channel support */ |
310 | unsigned volume: 1; | 310 | unsigned volume: 1; |
311 | 311 | ||
312 | int locked_rate : 1; | 312 | unsigned locked_rate : 1; |
313 | 313 | ||
314 | int mixer_vol; /* 8233/35 volume - not yet implemented */ | 314 | int mixer_vol; /* 8233/35 volume - not yet implemented */ |
315 | 315 | ||
diff --git a/sound/pci/bt87x.c b/sound/pci/bt87x.c index c33642d8d9a1..497ed6b20060 100644 --- a/sound/pci/bt87x.c +++ b/sound/pci/bt87x.c | |||
@@ -888,8 +888,9 @@ static int __devinit snd_bt87x_probe(struct pci_dev *pci, | |||
888 | 888 | ||
889 | strcpy(card->driver, "Bt87x"); | 889 | strcpy(card->driver, "Bt87x"); |
890 | sprintf(card->shortname, "Brooktree Bt%x", pci->device); | 890 | sprintf(card->shortname, "Brooktree Bt%x", pci->device); |
891 | sprintf(card->longname, "%s at %#lx, irq %i", | 891 | sprintf(card->longname, "%s at %#llx, irq %i", |
892 | card->shortname, pci_resource_start(pci, 0), chip->irq); | 892 | card->shortname, (unsigned long long)pci_resource_start(pci, 0), |
893 | chip->irq); | ||
893 | strcpy(card->mixername, "Bt87x"); | 894 | strcpy(card->mixername, "Bt87x"); |
894 | 895 | ||
895 | err = snd_card_register(card); | 896 | err = snd_card_register(card); |
diff --git a/sound/pci/sonicvibes.c b/sound/pci/sonicvibes.c index dcf402948347..e5511606af04 100644 --- a/sound/pci/sonicvibes.c +++ b/sound/pci/sonicvibes.c | |||
@@ -1441,10 +1441,10 @@ static int __devinit snd_sonic_probe(struct pci_dev *pci, | |||
1441 | 1441 | ||
1442 | strcpy(card->driver, "SonicVibes"); | 1442 | strcpy(card->driver, "SonicVibes"); |
1443 | strcpy(card->shortname, "S3 SonicVibes"); | 1443 | strcpy(card->shortname, "S3 SonicVibes"); |
1444 | sprintf(card->longname, "%s rev %i at 0x%lx, irq %i", | 1444 | sprintf(card->longname, "%s rev %i at 0x%llx, irq %i", |
1445 | card->shortname, | 1445 | card->shortname, |
1446 | sonic->revision, | 1446 | sonic->revision, |
1447 | pci_resource_start(pci, 1), | 1447 | (unsigned long long)pci_resource_start(pci, 1), |
1448 | sonic->irq); | 1448 | sonic->irq); |
1449 | 1449 | ||
1450 | if ((err = snd_sonicvibes_pcm(sonic, 0, NULL)) < 0) { | 1450 | if ((err = snd_sonicvibes_pcm(sonic, 0, NULL)) < 0) { |
diff --git a/sound/ppc/pmac.c b/sound/ppc/pmac.c index b678814975c9..be98f6377339 100644 --- a/sound/ppc/pmac.c +++ b/sound/ppc/pmac.c | |||
@@ -1170,9 +1170,10 @@ int __init snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return) | |||
1170 | chip->rsrc[i].start + 1, | 1170 | chip->rsrc[i].start + 1, |
1171 | rnames[i]) == NULL) { | 1171 | rnames[i]) == NULL) { |
1172 | printk(KERN_ERR "snd: can't request rsrc " | 1172 | printk(KERN_ERR "snd: can't request rsrc " |
1173 | " %d (%s: 0x%08lx:%08lx)\n", | 1173 | " %d (%s: 0x%016lx:%016lx)\n", |
1174 | i, rnames[i], chip->rsrc[i].start, | 1174 | i, rnames[i], |
1175 | chip->rsrc[i].end); | 1175 | (unsigned long long)chip->rsrc[i].start, |
1176 | (unsigned long long)chip->rsrc[i].end); | ||
1176 | err = -ENODEV; | 1177 | err = -ENODEV; |
1177 | goto __error; | 1178 | goto __error; |
1178 | } | 1179 | } |
@@ -1201,9 +1202,10 @@ int __init snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return) | |||
1201 | chip->rsrc[i].start + 1, | 1202 | chip->rsrc[i].start + 1, |
1202 | rnames[i]) == NULL) { | 1203 | rnames[i]) == NULL) { |
1203 | printk(KERN_ERR "snd: can't request rsrc " | 1204 | printk(KERN_ERR "snd: can't request rsrc " |
1204 | " %d (%s: 0x%08lx:%08lx)\n", | 1205 | " %d (%s: 0x%016llx:%016llx)\n", |
1205 | i, rnames[i], chip->rsrc[i].start, | 1206 | i, rnames[i], |
1206 | chip->rsrc[i].end); | 1207 | (unsigned long long)chip->rsrc[i].start, |
1208 | (unsigned long long)chip->rsrc[i].end); | ||
1207 | err = -ENODEV; | 1209 | err = -ENODEV; |
1208 | goto __error; | 1210 | goto __error; |
1209 | } | 1211 | } |
diff --git a/sound/sparc/cs4231.c b/sound/sparc/cs4231.c index da54d04a3e3a..d9d14c2707db 100644 --- a/sound/sparc/cs4231.c +++ b/sound/sparc/cs4231.c | |||
@@ -2037,10 +2037,10 @@ static int __init cs4231_sbus_attach(struct sbus_dev *sdev) | |||
2037 | if (err) | 2037 | if (err) |
2038 | return err; | 2038 | return err; |
2039 | 2039 | ||
2040 | sprintf(card->longname, "%s at 0x%02lx:0x%08lx, irq %d", | 2040 | sprintf(card->longname, "%s at 0x%02lx:0x%016lx, irq %d", |
2041 | card->shortname, | 2041 | card->shortname, |
2042 | rp->flags & 0xffL, | 2042 | rp->flags & 0xffL, |
2043 | rp->start, | 2043 | (unsigned long long)rp->start, |
2044 | sdev->irqs[0]); | 2044 | sdev->irqs[0]); |
2045 | 2045 | ||
2046 | if ((err = snd_cs4231_sbus_create(card, sdev, dev, &cp)) < 0) { | 2046 | if ((err = snd_cs4231_sbus_create(card, sdev, dev, &cp)) < 0) { |
diff --git a/sound/sparc/dbri.c b/sound/sparc/dbri.c index 5eecdd09a79d..a7489a3dd75a 100644 --- a/sound/sparc/dbri.c +++ b/sound/sparc/dbri.c | |||
@@ -2645,9 +2645,9 @@ static int __init dbri_attach(int prom_node, struct sbus_dev *sdev) | |||
2645 | strcpy(card->driver, "DBRI"); | 2645 | strcpy(card->driver, "DBRI"); |
2646 | strcpy(card->shortname, "Sun DBRI"); | 2646 | strcpy(card->shortname, "Sun DBRI"); |
2647 | rp = &sdev->resource[0]; | 2647 | rp = &sdev->resource[0]; |
2648 | sprintf(card->longname, "%s at 0x%02lx:0x%08lx, irq %d", | 2648 | sprintf(card->longname, "%s at 0x%02lx:0x%016lx, irq %d", |
2649 | card->shortname, | 2649 | card->shortname, |
2650 | rp->flags & 0xffL, rp->start, irq.pri); | 2650 | rp->flags & 0xffL, (unsigned long long)rp->start, irq.pri); |
2651 | 2651 | ||
2652 | if ((err = snd_dbri_create(card, sdev, &irq, dev)) < 0) { | 2652 | if ((err = snd_dbri_create(card, sdev, &irq, dev)) < 0) { |
2653 | snd_card_free(card); | 2653 | snd_card_free(card); |