]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - drivers/s390/cio/airq.c
Linux-2.6.12-rc2
[mirror_ubuntu-artful-kernel.git] / drivers / s390 / cio / airq.c
1 /*
2 * drivers/s390/cio/airq.c
3 * S/390 common I/O routines -- support for adapter interruptions
4 *
5 * $Revision: 1.12 $
6 *
7 * Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
8 * IBM Corporation
9 * Author(s): Ingo Adlung (adlung@de.ibm.com)
10 * Cornelia Huck (cohuck@de.ibm.com)
11 * Arnd Bergmann (arndb@de.ibm.com)
12 */
13
14 #include <linux/init.h>
15 #include <linux/module.h>
16 #include <linux/slab.h>
17 #include <linux/rcupdate.h>
18
19 #include "cio_debug.h"
20 #include "airq.h"
21
22 static adapter_int_handler_t adapter_handler;
23
24 /*
25 * register for adapter interrupts
26 *
27 * With HiperSockets the zSeries architecture provides for
28 * means of adapter interrups, pseudo I/O interrupts that are
29 * not tied to an I/O subchannel, but to an adapter. However,
30 * it doesn't disclose the info how to enable/disable them, but
31 * to recognize them only. Perhaps we should consider them
32 * being shared interrupts, and thus build a linked list
33 * of adapter handlers ... to be evaluated ...
34 */
35 int
36 s390_register_adapter_interrupt (adapter_int_handler_t handler)
37 {
38 int ret;
39 char dbf_txt[15];
40
41 CIO_TRACE_EVENT (4, "rgaint");
42
43 if (handler == NULL)
44 ret = -EINVAL;
45 else
46 ret = (cmpxchg(&adapter_handler, NULL, handler) ? -EBUSY : 0);
47 if (!ret)
48 synchronize_kernel();
49
50 sprintf (dbf_txt, "ret:%d", ret);
51 CIO_TRACE_EVENT (4, dbf_txt);
52
53 return ret;
54 }
55
56 int
57 s390_unregister_adapter_interrupt (adapter_int_handler_t handler)
58 {
59 int ret;
60 char dbf_txt[15];
61
62 CIO_TRACE_EVENT (4, "urgaint");
63
64 if (handler == NULL)
65 ret = -EINVAL;
66 else {
67 adapter_handler = NULL;
68 synchronize_kernel();
69 ret = 0;
70 }
71 sprintf (dbf_txt, "ret:%d", ret);
72 CIO_TRACE_EVENT (4, dbf_txt);
73
74 return ret;
75 }
76
77 void
78 do_adapter_IO (void)
79 {
80 CIO_TRACE_EVENT (6, "doaio");
81
82 if (adapter_handler)
83 (*adapter_handler) ();
84 }
85
86 EXPORT_SYMBOL (s390_register_adapter_interrupt);
87 EXPORT_SYMBOL (s390_unregister_adapter_interrupt);