patch-2.4.20 linux-2.4.20/arch/s390x/kernel/s390_ext.c
Next file: linux-2.4.20/arch/s390x/kernel/s390_ksyms.c
Previous file: linux-2.4.20/arch/s390x/kernel/ptrace.c
Back to the patch index
Back to the overall index
- Lines: 87
- Date:
Thu Nov 28 15:53:11 2002
- Orig file:
linux-2.4.19/arch/s390x/kernel/s390_ext.c
- Orig date:
Wed Jul 25 14:12:01 2001
diff -urN linux-2.4.19/arch/s390x/kernel/s390_ext.c linux-2.4.20/arch/s390x/kernel/s390_ext.c
@@ -21,34 +21,31 @@
* iucv and 0x2603 pfault) this is always the first element.
*/
ext_int_info_t *ext_int_hash[256] = { 0, };
-ext_int_info_t ext_int_info_timer;
-ext_int_info_t ext_int_info_hwc;
-ext_int_info_t ext_int_pfault;
int register_external_interrupt(__u16 code, ext_int_handler_t handler) {
ext_int_info_t *p;
int index;
- index = code & 0xff;
- p = ext_int_hash[index];
- while (p != NULL) {
- if (p->code == code)
- return -EBUSY;
- p = p->next;
- }
- if (code == 0x1004) /* time_init is done before kmalloc works :-/ */
- p = &ext_int_info_timer;
- else if (code == 0x2401) /* hwc_init is done too early too */
- p = &ext_int_info_hwc;
- else if (code == 0x2603) /* pfault_init is done too early too */
- p = &ext_int_pfault;
- else
- p = (ext_int_info_t *)
- kmalloc(sizeof(ext_int_info_t), GFP_ATOMIC);
+ p = (ext_int_info_t *) kmalloc(sizeof(ext_int_info_t), GFP_ATOMIC);
if (p == NULL)
return -ENOMEM;
p->code = code;
p->handler = handler;
+ index = code & 0xff;
+ p->next = ext_int_hash[index];
+ ext_int_hash[index] = p;
+ return 0;
+}
+
+int register_early_external_interrupt(__u16 code, ext_int_handler_t handler,
+ ext_int_info_t *p) {
+ int index;
+
+ if (p == NULL)
+ return -EINVAL;
+ p->code = code;
+ p->handler = handler;
+ index = code & 0xff;
p->next = ext_int_hash[index];
ext_int_hash[index] = p;
return 0;
@@ -73,11 +70,33 @@
q->next = p->next;
else
ext_int_hash[index] = p->next;
- if (code != 0x1004 && code != 0x2401 && code != 0x2603)
- kfree(p);
+ kfree(p);
return 0;
}
+int unregister_early_external_interrupt(__u16 code, ext_int_handler_t handler,
+ ext_int_info_t *p) {
+ ext_int_info_t *q;
+ int index;
+
+ if (p == NULL || p->code != code || p->handler != handler)
+ return -EINVAL;
+ index = code & 0xff;
+ q = ext_int_hash[index];
+ if (p != q) {
+ while (q != NULL) {
+ if (q->next == p)
+ break;
+ q = q->next;
+ }
+ if (q == NULL)
+ return -ENOENT;
+ q->next = p->next;
+ } else
+ ext_int_hash[index] = p->next;
+ return 0;
+}
+
EXPORT_SYMBOL(register_external_interrupt);
EXPORT_SYMBOL(unregister_external_interrupt);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)