Web lists-archives.com

[RFC PATCH 19/30] diva: Prepare diva_os_enter_spin_lock() for handling softirq mask




This pair of function is implemented on top of spin_lock_bh() that
is going to handle a softirq mask in order to apply finegrained vector
disablement. The lock function is going to return the previous vectors
enabled mask prior to the last call to local_bh_disable(), following a
similar model to that of local_irq_save/restore. Subsequent calls to
local_bh_disable() and friends can then stack up:

	bh = local_bh_disable(vec_mask);
		bh2 = diva_os_enter_spin_lock() {
			return spin_lock_bh(...)
		}
		...
		diva_os_leave_spin_lock(bh2) {
			spin_unlock_bh(bh2, ...);
		}
	local_bh_enable(bh);

To prepare for that, make diva_os_enter_spin_lock() able to return a
saved vector enabled mask and pass it back to diva_os_leave_spin_lock().
We'll plug it to spin_lock_bh() in a subsequent patch.

Thanks to coccinelle that helped a lot with scripts such as the
following:

	@spin exists@
	identifier func;
	expression e, e1, e2;
	@@
	func(...) {
	+ unsigned int bh;
	...
	- diva_os_enter_spin_lock(e, e1, e2);
	+ bh = diva_os_enter_spin_lock(e, e1, e2);
	...
	- diva_os_leave_spin_lock(e, e1, e2);
	+ diva_os_leave_spin_lock(e, e1, e2, bh);
	...
	}

Signed-off-by: Frederic Weisbecker <frederic@xxxxxxxxxx>
Cc: Ingo Molnar <mingo@xxxxxxxxxx>
Cc: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx>
Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
Cc: David S. Miller <davem@xxxxxxxxxxxxx>
Cc: Mauro Carvalho Chehab <mchehab@xxxxxxxxxxxxxxxx>
Cc: Paul E. McKenney <paulmck@xxxxxxxxxxxxxxxxxx>
---
 drivers/isdn/hardware/eicon/capifunc.c |  53 ++++++++------
 drivers/isdn/hardware/eicon/dadapter.c |  39 ++++++----
 drivers/isdn/hardware/eicon/debug.c    | 129 +++++++++++++++++++--------------
 drivers/isdn/hardware/eicon/debug_if.h |   6 +-
 drivers/isdn/hardware/eicon/diva.c     |  45 +++++++-----
 drivers/isdn/hardware/eicon/idifunc.c  |  22 +++---
 drivers/isdn/hardware/eicon/io.c       |  88 ++++++++++++----------
 drivers/isdn/hardware/eicon/mntfunc.c  |  13 ++--
 drivers/isdn/hardware/eicon/platform.h |   9 ++-
 drivers/isdn/hardware/eicon/um_idi.c   | 104 ++++++++++++++++----------
 10 files changed, 304 insertions(+), 204 deletions(-)

diff --git a/drivers/isdn/hardware/eicon/capifunc.c b/drivers/isdn/hardware/eicon/capifunc.c
index 7a0bdbd..c345286 100644
--- a/drivers/isdn/hardware/eicon/capifunc.c
+++ b/drivers/isdn/hardware/eicon/capifunc.c
@@ -390,6 +390,7 @@ static void clean_adapter(int id, struct list_head *free_mem_q)
  */
 static void divacapi_remove_card(DESCRIPTOR *d)
 {
+	unsigned int bh;
 	diva_card *card = NULL;
 	diva_os_spin_lock_magic_t old_irql;
 	LIST_HEAD(free_mem_q);
@@ -401,7 +402,7 @@ static void divacapi_remove_card(DESCRIPTOR *d)
 	 * Ensures that there is no call from sendf to CAPI in
 	 * the time CAPI controller is about to be removed.
 	 */
-	diva_os_enter_spin_lock(&api_lock, &old_irql, "remove card");
+	bh = diva_os_enter_spin_lock(&api_lock, &old_irql, "remove card");
 	list_for_each(tmp, &cards) {
 		card = list_entry(tmp, diva_card, list);
 		if (card->d.request == d->request) {
@@ -410,7 +411,7 @@ static void divacapi_remove_card(DESCRIPTOR *d)
 			break;
 		}
 	}
-	diva_os_leave_spin_lock(&api_lock, &old_irql, "remove card");
+	diva_os_leave_spin_lock(&api_lock, &old_irql, "remove card", bh);
 
 	if (card) {
 		/*
@@ -423,7 +424,7 @@ static void divacapi_remove_card(DESCRIPTOR *d)
 		 * Now get API lock (to ensure stable state of LI tables)
 		 * and update the adapter map/LI table.
 		 */
-		diva_os_enter_spin_lock(&api_lock, &old_irql, "remove card");
+		bh = diva_os_enter_spin_lock(&api_lock, &old_irql, "remove card");
 
 		clean_adapter(card->Id - 1, &free_mem_q);
 		DBG_TRC(("DelAdapterMap (%d) -> (%d)",
@@ -431,7 +432,7 @@ static void divacapi_remove_card(DESCRIPTOR *d)
 			ControllerMap[card->Id] = 0;
 		DBG_TRC(("adapter remove, max_adapter=%d",
 			 max_adapter));
-		diva_os_leave_spin_lock(&api_lock, &old_irql, "remove card");
+		diva_os_leave_spin_lock(&api_lock, &old_irql, "remove card", bh);
 
 		/* After releasing the lock, we can free the memory */
 		diva_os_free(0, card);
@@ -449,13 +450,14 @@ static void divacapi_remove_card(DESCRIPTOR *d)
  */
 static void divacapi_remove_cards(void)
 {
+	unsigned int bh;
 	DESCRIPTOR d;
 	struct list_head *tmp;
 	diva_card *card;
 	diva_os_spin_lock_magic_t old_irql;
 
 rescan:
-	diva_os_enter_spin_lock(&api_lock, &old_irql, "remove cards");
+	bh = diva_os_enter_spin_lock(&api_lock, &old_irql, "remove cards");
 	list_for_each(tmp, &cards) {
 		card = list_entry(tmp, diva_card, list);
 		diva_os_leave_spin_lock(&api_lock, &old_irql, "remove cards");
@@ -463,7 +465,7 @@ static void divacapi_remove_cards(void)
 		divacapi_remove_card(&d);
 		goto rescan;
 	}
-	diva_os_leave_spin_lock(&api_lock, &old_irql, "remove cards");
+	diva_os_leave_spin_lock(&api_lock, &old_irql, "remove cards", bh);
 }
 
 /*
@@ -471,13 +473,15 @@ static void divacapi_remove_cards(void)
  */
 static void sync_callback(ENTITY *e)
 {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t old_irql;
 
 	DBG_TRC(("cb:Id=%x,Rc=%x,Ind=%x", e->Id, e->Rc, e->Ind))
 
-		diva_os_enter_spin_lock(&api_lock, &old_irql, "sync_callback");
+		bh = diva_os_enter_spin_lock(&api_lock, &old_irql,
+					     "sync_callback");
 	callback(e);
-	diva_os_leave_spin_lock(&api_lock, &old_irql, "sync_callback");
+	diva_os_leave_spin_lock(&api_lock, &old_irql, "sync_callback", bh);
 }
 
 /*
@@ -485,6 +489,7 @@ static void sync_callback(ENTITY *e)
  */
 static int diva_add_card(DESCRIPTOR *d)
 {
+	unsigned int bh;
 	int k = 0, i = 0;
 	diva_os_spin_lock_magic_t old_irql;
 	diva_card *card = NULL;
@@ -521,9 +526,9 @@ static int diva_add_card(DESCRIPTOR *d)
 		return (0);
 	}
 
-	diva_os_enter_spin_lock(&api_lock, &old_irql, "find id");
+	bh = diva_os_enter_spin_lock(&api_lock, &old_irql, "find id");
 	card->Id = find_free_id();
-	diva_os_leave_spin_lock(&api_lock, &old_irql, "find id");
+	diva_os_leave_spin_lock(&api_lock, &old_irql, "find id", bh);
 
 	strlcpy(ctrl->manu, M_COMPANY, sizeof(ctrl->manu));
 	ctrl->version.majorversion = 2;
@@ -630,7 +635,7 @@ static int diva_add_card(DESCRIPTOR *d)
 	}
 
 	/* Prevent access to line interconnect table in process update */
-	diva_os_enter_spin_lock(&api_lock, &old_irql, "add card");
+	bh = diva_os_enter_spin_lock(&api_lock, &old_irql, "add card");
 
 	j = 0;
 	for (i = 0; i < k; i++) {
@@ -686,7 +691,7 @@ static int diva_add_card(DESCRIPTOR *d)
 	list_add(&(card->list), &cards);
 	AutomaticLaw(a);
 
-	diva_os_leave_spin_lock(&api_lock, &old_irql, "add card");
+	diva_os_leave_spin_lock(&api_lock, &old_irql, "add card", bh);
 
 	if (mem_to_free) {
 		diva_os_free(0, mem_to_free);
@@ -733,6 +738,7 @@ static void diva_register_appl(struct capi_ctr *ctrl, __u16 appl,
 	diva_os_spin_lock_magic_t old_irql;
 	unsigned int mem_len;
 	int nconn = rp->level3cnt;
+	unsigned int bh;
 
 
 	if (diva_os_in_irq()) {
@@ -809,7 +815,7 @@ static void diva_register_appl(struct capi_ctr *ctrl, __u16 appl,
 	}
 
 	/* initialize application data */
-	diva_os_enter_spin_lock(&api_lock, &old_irql, "register_appl");
+	bh = diva_os_enter_spin_lock(&api_lock, &old_irql, "register_appl");
 
 	this = &application[appl - 1];
 	memset(this, 0, sizeof(APPL));
@@ -838,7 +844,7 @@ static void diva_register_appl(struct capi_ctr *ctrl, __u16 appl,
 	}
 
 	CapiRegister(this->Id);
-	diva_os_leave_spin_lock(&api_lock, &old_irql, "register_appl");
+	diva_os_leave_spin_lock(&api_lock, &old_irql, "register_appl", bh);
 
 }
 
@@ -847,6 +853,7 @@ static void diva_register_appl(struct capi_ctr *ctrl, __u16 appl,
  */
 static void diva_release_appl(struct capi_ctr *ctrl, __u16 appl)
 {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t old_irql;
 	APPL *this = &application[appl - 1];
 	void *mem_to_free = NULL;
@@ -858,14 +865,14 @@ static void diva_release_appl(struct capi_ctr *ctrl, __u16 appl)
 				return;
 		}
 
-	diva_os_enter_spin_lock(&api_lock, &old_irql, "release_appl");
+	bh = diva_os_enter_spin_lock(&api_lock, &old_irql, "release_appl");
 	if (this->Id) {
 		CapiRelease(this->Id);
 		mem_to_free = this->DataNCCI;
 		this->DataNCCI = NULL;
 		this->Id = 0;
 	}
-	diva_os_leave_spin_lock(&api_lock, &old_irql, "release_appl");
+	diva_os_leave_spin_lock(&api_lock, &old_irql, "release_appl", bh);
 
 	if (mem_to_free)
 		diva_os_free(0, mem_to_free);
@@ -888,6 +895,7 @@ static u16 diva_send_message(struct capi_ctr *ctrl,
 	word clength = GET_WORD(&msg->header.length);
 	word command = GET_WORD(&msg->header.command);
 	u16 retval = CAPI_NOERROR;
+	unsigned int bh;
 
 	if (diva_os_in_irq()) {
 		DBG_ERR(("CAPI_SEND_MSG - in irq context !"))
@@ -900,10 +908,10 @@ static u16 diva_send_message(struct capi_ctr *ctrl,
 				return CAPI_REGOSRESOURCEERR;
 		}
 
-	diva_os_enter_spin_lock(&api_lock, &old_irql, "send message");
+	bh = diva_os_enter_spin_lock(&api_lock, &old_irql, "send message");
 
 	if (!this->Id) {
-		diva_os_leave_spin_lock(&api_lock, &old_irql, "send message");
+		diva_os_leave_spin_lock(&api_lock, &old_irql, "send message", bh);
 		return CAPI_ILLAPPNR;
 	}
 
@@ -997,7 +1005,7 @@ static u16 diva_send_message(struct capi_ctr *ctrl,
 	}
 
 write_end:
-	diva_os_leave_spin_lock(&api_lock, &old_irql, "send message");
+	diva_os_leave_spin_lock(&api_lock, &old_irql, "send message", bh);
 	if (retval == CAPI_NOERROR)
 		diva_os_free_message_buffer(dmb);
 	return retval;
@@ -1163,13 +1171,16 @@ static void remove_main_structs(void)
  */
 static void do_api_remove_start(void)
 {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t old_irql;
 	int ret = 1, count = 100;
 
 	do {
-		diva_os_enter_spin_lock(&api_lock, &old_irql, "api remove start");
+		bh = diva_os_enter_spin_lock(&api_lock, &old_irql,
+					     "api remove start");
 		ret = api_remove_start();
-		diva_os_leave_spin_lock(&api_lock, &old_irql, "api remove start");
+		diva_os_leave_spin_lock(&api_lock, &old_irql,
+					"api remove start", bh);
 
 		diva_os_sleep(10);
 	} while (ret && count--);
diff --git a/drivers/isdn/hardware/eicon/dadapter.c b/drivers/isdn/hardware/eicon/dadapter.c
index 5142099..842c1f1 100644
--- a/drivers/isdn/hardware/eicon/dadapter.c
+++ b/drivers/isdn/hardware/eicon/dadapter.c
@@ -106,6 +106,7 @@ void diva_didd_load_time_finit(void) {
    return -1 adapter array overflow
    -------------------------------------------------------------------------- */
 static int diva_didd_add_descriptor(DESCRIPTOR *d) {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t      irql;
 	int i;
 	if (d->type == IDI_DIMAINT) {
@@ -123,16 +124,17 @@ static int diva_didd_add_descriptor(DESCRIPTOR *d) {
 		return (NEW_MAX_DESCRIPTORS);
 	}
 	for (i = 0; i < NEW_MAX_DESCRIPTORS; i++) {
-		diva_os_enter_spin_lock(&didd_spin, &irql, "didd_add");
+		bh = diva_os_enter_spin_lock(&didd_spin, &irql, "didd_add");
 		if (HandleTable[i].type == 0) {
 			memcpy(&HandleTable[i], d, sizeof(*d));
 			Adapters++;
-			diva_os_leave_spin_lock(&didd_spin, &irql, "didd_add");
+			diva_os_leave_spin_lock(&didd_spin, &irql, "didd_add",
+						bh);
 			diva_notify_adapter_change(d, 0); /* we have new adapter */
 			DBG_TRC(("Add adapter[%d], request=%08x", (i + 1), d->request))
 				return (i + 1);
 		}
-		diva_os_leave_spin_lock(&didd_spin, &irql, "didd_add");
+		diva_os_leave_spin_lock(&didd_spin, &irql, "didd_add", bh);
 	}
 	DBG_ERR(("Can't add adapter, out of resources"))
 		return (-1);
@@ -143,6 +145,7 @@ static int diva_didd_add_descriptor(DESCRIPTOR *d) {
    return 0 on success
    -------------------------------------------------------------------------- */
 static int diva_didd_remove_descriptor(IDI_CALL request) {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t      irql;
 	int i;
 	if (request == MAdapter.request) {
@@ -155,10 +158,12 @@ static int diva_didd_remove_descriptor(IDI_CALL request) {
 	for (i = 0; (Adapters && (i < NEW_MAX_DESCRIPTORS)); i++) {
 		if (HandleTable[i].request == request) {
 			diva_notify_adapter_change(&HandleTable[i], 1); /* About to remove */
-			diva_os_enter_spin_lock(&didd_spin, &irql, "didd_rm");
+			bh = diva_os_enter_spin_lock(&didd_spin, &irql,
+						     "didd_rm");
 			memset(&HandleTable[i], 0x00, sizeof(HandleTable[0]));
 			Adapters--;
-			diva_os_leave_spin_lock(&didd_spin, &irql, "didd_rm");
+			diva_os_leave_spin_lock(&didd_spin, &irql, "didd_rm",
+						bh);
 			DBG_TRC(("Remove adapter[%d], request=%08x", (i + 1), request))
 				return (0);
 		}
@@ -171,13 +176,14 @@ static int diva_didd_remove_descriptor(IDI_CALL request) {
    return 1 if not enough space to save all available adapters
    -------------------------------------------------------------------------- */
 static int diva_didd_read_adapter_array(DESCRIPTOR *buffer, int length) {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t      irql;
 	int src, dst;
 	memset(buffer, 0x00, length);
 	length /= sizeof(DESCRIPTOR);
 	DBG_TRC(("DIDD_Read, space = %d, Adapters = %d", length, Adapters + 2))
 
-		diva_os_enter_spin_lock(&didd_spin, &irql, "didd_read");
+		bh = diva_os_enter_spin_lock(&didd_spin, &irql, "didd_read");
 	for (src = 0, dst = 0;
 	     (Adapters && (src < NEW_MAX_DESCRIPTORS) && (dst < length));
 	     src++) {
@@ -186,7 +192,7 @@ static int diva_didd_read_adapter_array(DESCRIPTOR *buffer, int length) {
 			dst++;
 		}
 	}
-	diva_os_leave_spin_lock(&didd_spin, &irql, "didd_read");
+	diva_os_leave_spin_lock(&didd_spin, &irql, "didd_read", bh);
 	if (dst < length) {
 		memcpy(&buffer[dst], &MAdapter, sizeof(DESCRIPTOR));
 		dst++;
@@ -268,19 +274,22 @@ static void IDI_CALL_LINK_T diva_dadapter_request(	\
 static dword diva_register_adapter_callback(		\
 	didd_adapter_change_callback_t callback,
 	void IDI_CALL_ENTITY_T *context) {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t irql;
 	dword i;
 
 	for (i = 0; i < DIVA_DIDD_MAX_NOTIFICATIONS; i++) {
-		diva_os_enter_spin_lock(&didd_spin, &irql, "didd_nfy_add");
+		bh = diva_os_enter_spin_lock(&didd_spin, &irql,
+				             "didd_nfy_add");
 		if (!NotificationTable[i].callback) {
 			NotificationTable[i].callback = callback;
 			NotificationTable[i].context = context;
-			diva_os_leave_spin_lock(&didd_spin, &irql, "didd_nfy_add");
+			diva_os_leave_spin_lock(&didd_spin, &irql,
+						"didd_nfy_add", bh);
 			DBG_TRC(("Register adapter notification[%d]=%08x", i + 1, callback))
 				return (i + 1);
 		}
-		diva_os_leave_spin_lock(&didd_spin, &irql, "didd_nfy_add");
+		diva_os_leave_spin_lock(&didd_spin, &irql, "didd_nfy_add", bh);
 	}
 	DBG_ERR(("Can't register adapter notification, overflow"))
 		return (0);
@@ -289,12 +298,13 @@ static dword diva_register_adapter_callback(		\
    IDI client does register his notification function
    -------------------------------------------------------------------------- */
 static void diva_remove_adapter_callback(dword handle) {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t irql;
 	if (handle && ((--handle) < DIVA_DIDD_MAX_NOTIFICATIONS)) {
-		diva_os_enter_spin_lock(&didd_spin, &irql, "didd_nfy_rm");
+		bh = diva_os_enter_spin_lock(&didd_spin, &irql, "didd_nfy_rm");
 		NotificationTable[handle].callback = NULL;
 		NotificationTable[handle].context  = NULL;
-		diva_os_leave_spin_lock(&didd_spin, &irql, "didd_nfy_rm");
+		diva_os_leave_spin_lock(&didd_spin, &irql, "didd_nfy_rm", bh);
 		DBG_TRC(("Remove adapter notification[%d]", (int)(handle + 1)))
 			return;
 	}
@@ -307,17 +317,18 @@ static void diva_remove_adapter_callback(dword handle) {
    Step 2: Read Adapter Array
    -------------------------------------------------------------------------- */
 static void diva_notify_adapter_change(DESCRIPTOR *d, int removal) {
+	unsigned int bh;
 	int i, do_notify;
 	didd_adapter_change_notification_t nfy;
 	diva_os_spin_lock_magic_t irql;
 	for (i = 0; i < DIVA_DIDD_MAX_NOTIFICATIONS; i++) {
 		do_notify = 0;
-		diva_os_enter_spin_lock(&didd_spin, &irql, "didd_nfy");
+		bh = diva_os_enter_spin_lock(&didd_spin, &irql, "didd_nfy");
 		if (NotificationTable[i].callback) {
 			memcpy(&nfy, &NotificationTable[i], sizeof(nfy));
 			do_notify = 1;
 		}
-		diva_os_leave_spin_lock(&didd_spin, &irql, "didd_nfy");
+		diva_os_leave_spin_lock(&didd_spin, &irql, "didd_nfy", bh);
 		if (do_notify) {
 			(*(nfy.callback))(nfy.context, d, removal);
 		}
diff --git a/drivers/isdn/hardware/eicon/debug.c b/drivers/isdn/hardware/eicon/debug.c
index 3017881..cbfcd5c 100644
--- a/drivers/isdn/hardware/eicon/debug.c
+++ b/drivers/isdn/hardware/eicon/debug.c
@@ -307,19 +307,20 @@ dword diva_dbg_q_length(void) {
   entry.
 */
 diva_dbg_entry_head_t *diva_maint_get_message(word *size,
-					      diva_os_spin_lock_magic_t *old_irql) {
+					      diva_os_spin_lock_magic_t *old_irql,
+					      unsigned int *bh) {
 	diva_dbg_entry_head_t *pmsg = NULL;
 
-	diva_os_enter_spin_lock(&dbg_q_lock, old_irql, "read");
+	*bh = diva_os_enter_spin_lock(&dbg_q_lock, old_irql, "read");
 	if (dbg_q_busy) {
-		diva_os_leave_spin_lock(&dbg_q_lock, old_irql, "read_busy");
+		diva_os_leave_spin_lock(&dbg_q_lock, old_irql, "read_busy", *bh);
 		return NULL;
 	}
 	dbg_q_busy = 1;
 
 	if (!(pmsg = (diva_dbg_entry_head_t *)queuePeekMsg(dbg_queue, size))) {
 		dbg_q_busy = 0;
-		diva_os_leave_spin_lock(&dbg_q_lock, old_irql, "read_empty");
+		diva_os_leave_spin_lock(&dbg_q_lock, old_irql, "read_empty", *bh);
 	}
 
 	return (pmsg);
@@ -330,7 +331,8 @@ diva_dbg_entry_head_t *diva_maint_get_message(word *size,
   acknowledge last message and unlock queue
 */
 void diva_maint_ack_message(int do_release,
-			    diva_os_spin_lock_magic_t *old_irql) {
+			    diva_os_spin_lock_magic_t *old_irql,
+			    unsigned int bh) {
 	if (!dbg_q_busy) {
 		return;
 	}
@@ -338,7 +340,7 @@ void diva_maint_ack_message(int do_release,
 		queueFreeMsg(dbg_queue);
 	}
 	dbg_q_busy = 0;
-	diva_os_leave_spin_lock(&dbg_q_lock, old_irql, "read_ack");
+	diva_os_leave_spin_lock(&dbg_q_lock, old_irql, "read_ack", bh);
 }
 
 
@@ -369,6 +371,7 @@ void diva_maint_prtComp(char *format, ...) {
 }
 
 static void DI_register(void *arg) {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t old_irql;
 	dword sec, usec;
 	pDbgHandle	hDbg;
@@ -386,14 +389,15 @@ static void DI_register(void *arg) {
 		return;
 	}
 
-	diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "register");
+	bh = diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "register");
 
 	for (id = 1; id < ARRAY_SIZE(clients); id++) {
 		if (clients[id].hDbg == hDbg) {
 			/*
 			  driver already registered
 			*/
-			diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register");
+			diva_os_leave_spin_lock(&dbg_q_lock, &old_irql,
+						"register", bh);
 			return;
 		}
 		if (clients[id].hDbg) { /* slot is busy */
@@ -476,7 +480,7 @@ static void DI_register(void *arg) {
 		}
 	}
 
-	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register");
+	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register", bh);
 }
 
 static void DI_deregister(pDbgHandle hDbg) {
@@ -485,11 +489,12 @@ static void DI_deregister(pDbgHandle hDbg) {
 	int i;
 	word size;
 	byte *pmem = NULL;
+	unsigned int bh, bh2;
 
 	diva_os_get_time(&sec, &usec);
 
-	diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "read");
-	diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "read");
+	bh = diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "read");
+	bh2 = diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "read");
 
 	for (i = 1; i < ARRAY_SIZE(clients); i++) {
 		if (clients[i].hDbg == hDbg) {
@@ -551,8 +556,8 @@ static void DI_deregister(pDbgHandle hDbg) {
 		}
 	}
 
-	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "read_ack");
-	diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "read_ack");
+	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "read_ack", bh2);
+	diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "read_ack", bh);
 
 	if (pmem) {
 		diva_os_free(0, pmem);
@@ -571,6 +576,7 @@ static void DI_format(int do_lock,
 		      int type,
 		      char *format,
 		      va_list ap) {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t old_irql;
 	dword sec, usec;
 	diva_dbg_entry_head_t *pmsg = NULL;
@@ -595,7 +601,7 @@ static void DI_format(int do_lock,
 	diva_os_get_time(&sec, &usec);
 
 	if (do_lock) {
-		diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "format");
+		bh = diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "format");
 	}
 
 	switch (type) {
@@ -720,7 +726,7 @@ static void DI_format(int do_lock,
 	}
 
 	if (do_lock) {
-		diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "format");
+		diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "format", bh);
 	}
 }
 
@@ -728,6 +734,7 @@ static void DI_format(int do_lock,
   Write driver ID and driver revision to callers buffer
 */
 int diva_get_driver_info(dword id, byte *data, int data_length) {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t old_irql;
 	byte *p = data;
 	int to_copy;
@@ -737,7 +744,7 @@ int diva_get_driver_info(dword id, byte *data, int data_length) {
 		return (-1);
 	}
 
-	diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "driver info");
+	bh = diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "driver info");
 
 	if (clients[id].hDbg) {
 		*p++ = 1;
@@ -774,19 +781,20 @@ int diva_get_driver_info(dword id, byte *data, int data_length) {
 	}
 	*p++ = 0;
 
-	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "driver info");
+	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "driver info", bh);
 
 	return (p - data);
 }
 
 int diva_get_driver_dbg_mask(dword id, byte *data) {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t old_irql;
 	int ret = -1;
 
 	if (!data || !id || (id >= ARRAY_SIZE(clients))) {
 		return (-1);
 	}
-	diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "driver info");
+	bh = diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "driver info");
 
 	if (clients[id].hDbg) {
 		ret = 4;
@@ -796,12 +804,13 @@ int diva_get_driver_dbg_mask(dword id, byte *data) {
 		*data++ = (byte)(clients[id].hDbg->dbgMask >> 24);
 	}
 
-	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "driver info");
+	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "driver info", bh);
 
 	return (ret);
 }
 
 int diva_set_driver_dbg_mask(dword id, dword mask) {
+	unsigned int bh, bh2;
 	diva_os_spin_lock_magic_t old_irql, old_irql1;
 	int ret = -1;
 
@@ -810,8 +819,9 @@ int diva_set_driver_dbg_mask(dword id, dword mask) {
 		return (-1);
 	}
 
-	diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "dbg mask");
-	diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "dbg mask");
+	bh = diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1,
+				     "dbg mask");
+	bh2 = diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "dbg mask");
 
 	if (clients[id].hDbg) {
 		dword old_mask = clients[id].hDbg->dbgMask;
@@ -823,14 +833,14 @@ int diva_set_driver_dbg_mask(dword id, dword mask) {
 	}
 
 
-	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "dbg mask");
+	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "dbg mask", bh2);
 
 	if (clients[id].request_pending) {
 		clients[id].request_pending = 0;
 		(*(clients[id].request))((ENTITY *)(*(clients[id].pIdiLib->DivaSTraceGetHandle))(clients[id].pIdiLib->hLib));
 	}
 
-	diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "dbg mask");
+	diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "dbg mask", bh);
 
 	return (ret);
 }
@@ -856,6 +866,7 @@ static int diva_get_idi_adapter_info(IDI_CALL request, dword *serial, dword *log
   Register XDI adapter as MAINT compatible driver
 */
 void diva_mnt_add_xdi_adapter(const DESCRIPTOR *d) {
+	unsigned int bh, bh2;
 	diva_os_spin_lock_magic_t old_irql, old_irql1;
 	dword sec, usec, logical, serial, org_mask;
 	int id, free_id = -1;
@@ -881,13 +892,15 @@ void diva_mnt_add_xdi_adapter(const DESCRIPTOR *d) {
 	}
 	memset(pmem, 0x00, DivaSTraceGetMemotyRequirement(d->channels));
 
-	diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "register");
-	diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "register");
+	bh = diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1,
+				     "register");
+	bh2 = diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "register");
 
 	for (id = 1; id < ARRAY_SIZE(clients); id++) {
 		if (clients[id].hDbg && (clients[id].request == d->request)) {
-			diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register");
-			diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "register");
+			diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register", bh2);
+			diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1,
+						"register", bh);
 			diva_os_free(0, pmem);
 			return;
 		}
@@ -908,8 +921,9 @@ void diva_mnt_add_xdi_adapter(const DESCRIPTOR *d) {
 	}
 
 	if (free_id < 0) {
-		diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register");
-		diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "register");
+		diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register", bh2);
+		diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1,
+					"register", bh);
 		diva_os_free(0, pmem);
 		return;
 	}
@@ -967,8 +981,9 @@ void diva_mnt_add_xdi_adapter(const DESCRIPTOR *d) {
 		clients[id].request = NULL;
 		clients[id].request_pending = 0;
 		clients[id].hDbg    = NULL;
-		diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register");
-		diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "register");
+		diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register", bh2);
+		diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1,
+					"register", bh);
 		diva_os_free(0, pmem);
 		return;
 	}
@@ -1006,14 +1021,14 @@ void diva_mnt_add_xdi_adapter(const DESCRIPTOR *d) {
 	org_mask = clients[id].Dbg.dbgMask;
 	clients[id].Dbg.dbgMask = 0;
 
-	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register");
+	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "register", bh2);
 
 	if (clients[id].request_pending) {
 		clients[id].request_pending = 0;
 		(*(clients[id].request))((ENTITY *)(*(clients[id].pIdiLib->DivaSTraceGetHandle))(clients[id].pIdiLib->hLib));
 	}
 
-	diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "register");
+	diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "register", bh);
 
 	diva_set_driver_dbg_mask(id, org_mask);
 }
@@ -1027,11 +1042,12 @@ void diva_mnt_remove_xdi_adapter(const DESCRIPTOR *d) {
 	int i;
 	word size;
 	byte *pmem = NULL;
+	unsigned int bh, bh2;
 
 	diva_os_get_time(&sec, &usec);
 
-	diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "read");
-	diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "read");
+	bh = diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "read");
+	bh2 = diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "read");
 
 	for (i = 1; i < ARRAY_SIZE(clients); i++) {
 		if (clients[i].hDbg && (clients[i].request == d->request)) {
@@ -1094,8 +1110,8 @@ void diva_mnt_remove_xdi_adapter(const DESCRIPTOR *d) {
 		}
 	}
 
-	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "read_ack");
-	diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "read_ack");
+	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "read_ack", bh2);
+	diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "read_ack", bh);
 
 	if (pmem) {
 		diva_os_free(0, pmem);
@@ -1355,13 +1371,14 @@ static void single_p(byte *P, word *PLength, byte Id) {
 }
 
 static void diva_maint_xdi_cb(ENTITY *e) {
+	unsigned int bh, bh2;
 	diva_strace_context_t *pLib = DIVAS_CONTAINING_RECORD(e, diva_strace_context_t, e);
 	diva_maint_client_t *pC;
 	diva_os_spin_lock_magic_t old_irql, old_irql1;
 
 
-	diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "xdi_cb");
-	diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "xdi_cb");
+	bh = diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "xdi_cb");
+	bh2 = diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "xdi_cb");
 
 	pC = (diva_maint_client_t *)pLib->hAdapter;
 
@@ -1378,7 +1395,7 @@ static void diva_maint_xdi_cb(ENTITY *e) {
 		}
 	}
 
-	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "xdi_cb");
+	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "xdi_cb", bh2);
 
 
 	if (pC->request_pending) {
@@ -1386,7 +1403,7 @@ static void diva_maint_xdi_cb(ENTITY *e) {
 		(*(pC->request))(e);
 	}
 
-	diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "xdi_cb");
+	diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "xdi_cb", bh);
 }
 
 
@@ -1916,6 +1933,7 @@ void diva_mnt_internal_dprintf(dword drv_id, dword type, char *fmt, ...) {
   Shutdown all adapters before driver removal
 */
 int diva_mnt_shutdown_xdi_adapters(void) {
+	unsigned int bh, bh2;
 	diva_os_spin_lock_magic_t old_irql, old_irql1;
 	int i, fret = 0;
 	byte *pmem;
@@ -1924,8 +1942,9 @@ int diva_mnt_shutdown_xdi_adapters(void) {
 	for (i = 1; i < ARRAY_SIZE(clients); i++) {
 		pmem = NULL;
 
-		diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "unload");
-		diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "unload");
+		bh = diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1,
+					     "unload");
+		bh2 = diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "unload");
 
 		if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request) {
 			if ((*(clients[i].pIdiLib->DivaSTraceLibraryStop))(clients[i].pIdiLib) == 1) {
@@ -1955,7 +1974,7 @@ int diva_mnt_shutdown_xdi_adapters(void) {
 			}
 		}
 
-		diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "unload");
+		diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "unload", bh2);
 		if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request && clients[i].request_pending) {
 			clients[i].request_pending = 0;
 			(*(clients[i].request))((ENTITY *)(*(clients[i].pIdiLib->DivaSTraceGetHandle))(clients[i].pIdiLib->hLib));
@@ -1964,7 +1983,8 @@ int diva_mnt_shutdown_xdi_adapters(void) {
 				clients[i].dma_handle = -1;
 			}
 		}
-		diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "unload");
+		diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1,
+					"unload", bh);
 
 		if (pmem) {
 			diva_os_free(0, pmem);
@@ -1979,11 +1999,13 @@ int diva_mnt_shutdown_xdi_adapters(void) {
   Affects B- and Audio Tap trace mask at run time
 */
 int diva_set_trace_filter(int filter_length, const char *filter) {
+	unsigned int bh, bh2;
 	diva_os_spin_lock_magic_t old_irql, old_irql1;
 	int i, ch, on, client_b_on, client_atap_on;
 
-	diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1, "dbg mask");
-	diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "write_filter");
+	bh = diva_os_enter_spin_lock(&dbg_adapter_lock, &old_irql1,
+				     "dbg mask");
+	bh2 = diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "write_filter");
 
 	if (filter_length <= DIVA_MAX_SELECTIVE_FILTER_LENGTH) {
 		memcpy(&TraceFilter[0], filter, filter_length);
@@ -2015,29 +2037,30 @@ int diva_set_trace_filter(int filter_length, const char *filter) {
 
 	for (i = 1; i < ARRAY_SIZE(clients); i++) {
 		if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request && clients[i].request_pending) {
-			diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "write_filter");
+			diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "write_filter", bh2);
 			clients[i].request_pending = 0;
 			(*(clients[i].request))((ENTITY *)(*(clients[i].pIdiLib->DivaSTraceGetHandle))(clients[i].pIdiLib->hLib));
-			diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "write_filter");
+			bh2 = diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "write_filter");
 		}
 	}
 
-	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "write_filter");
-	diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "dbg mask");
+	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "write_filter", bh2);
+	diva_os_leave_spin_lock(&dbg_adapter_lock, &old_irql1, "dbg mask", bh);
 
 	return (filter_length);
 }
 
 int diva_get_trace_filter(int max_length, char *filter) {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t old_irql;
 	int len;
 
-	diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "read_filter");
+	bh = diva_os_enter_spin_lock(&dbg_q_lock, &old_irql, "read_filter");
 	len = strlen(&TraceFilter[0]) + 1;
 	if (max_length >= len) {
 		memcpy(filter, &TraceFilter[0], len);
 	}
-	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "read_filter");
+	diva_os_leave_spin_lock(&dbg_q_lock, &old_irql, "read_filter", bh);
 
 	return (len);
 }
diff --git a/drivers/isdn/hardware/eicon/debug_if.h b/drivers/isdn/hardware/eicon/debug_if.h
index fc5953a..baead0f 100644
--- a/drivers/isdn/hardware/eicon/debug_if.h
+++ b/drivers/isdn/hardware/eicon/debug_if.h
@@ -45,9 +45,11 @@ int diva_maint_init(byte *base, unsigned long length, int do_init);
 void *diva_maint_finit(void);
 dword diva_dbg_q_length(void);
 diva_dbg_entry_head_t *diva_maint_get_message(word *size,
-					      diva_os_spin_lock_magic_t *old_irql);
+					      diva_os_spin_lock_magic_t *old_irql,
+					      unsigned int *bh);
 void diva_maint_ack_message(int do_release,
-			    diva_os_spin_lock_magic_t *old_irql);
+			    diva_os_spin_lock_magic_t *old_irql,
+			    unsigned int bh);
 void diva_maint_prtComp(char *format, ...);
 void diva_maint_wakeup_read(void);
 int diva_get_driver_info(dword id, byte *data, int data_length);
diff --git a/drivers/isdn/hardware/eicon/diva.c b/drivers/isdn/hardware/eicon/diva.c
index 1b25d8b..92e11ea 100644
--- a/drivers/isdn/hardware/eicon/diva.c
+++ b/drivers/isdn/hardware/eicon/diva.c
@@ -166,6 +166,7 @@ static diva_os_xdi_adapter_t *diva_q_get_next(struct list_head *what)
    -------------------------------------------------------------------------- */
 void *diva_driver_add_card(void *pdev, unsigned long CardOrdinal)
 {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t old_irql;
 	diva_os_xdi_adapter_t *pdiva, *pa;
 	int i, j, max, nr;
@@ -189,14 +190,14 @@ void *diva_driver_add_card(void *pdev, unsigned long CardOrdinal)
 				nr = 1;
 			}
 
-			diva_os_enter_spin_lock(&adapter_lock, &old_irql, "add card");
+			bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql, "add card");
 
 			for (i = 0; i < max; i++) {
 				if (!diva_find_free_adapters(i, nr)) {
 					pdiva->controller = i + 1;
 					pdiva->xdi_adapter.ANum = pdiva->controller;
 					IoAdapters[i] = &pdiva->xdi_adapter;
-					diva_os_leave_spin_lock(&adapter_lock, &old_irql, "add card");
+					diva_os_leave_spin_lock(&adapter_lock, &old_irql, "add card", bh);
 					create_adapter_proc(pdiva);	/* add adapter to proc file system */
 
 					DBG_LOG(("add %s:%d",
@@ -204,7 +205,7 @@ void *diva_driver_add_card(void *pdev, unsigned long CardOrdinal)
 						 [CardOrdinal].Name,
 						 pdiva->controller))
 
-						diva_os_enter_spin_lock(&adapter_lock, &old_irql, "add card");
+						bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql, "add card");
 					pa = pdiva;
 					for (j = 1; j < nr; j++) {	/* slave adapters, if any */
 						pa = diva_q_get_next(&pa->link);
@@ -212,23 +213,23 @@ void *diva_driver_add_card(void *pdev, unsigned long CardOrdinal)
 							pa->controller = i + 1 + j;
 							pa->xdi_adapter.ANum = pa->controller;
 							IoAdapters[i + j] = &pa->xdi_adapter;
-							diva_os_leave_spin_lock(&adapter_lock, &old_irql, "add card");
+							diva_os_leave_spin_lock(&adapter_lock, &old_irql, "add card", bh);
 							DBG_LOG(("add slave adapter (%d)",
 								 pa->controller))
 								create_adapter_proc(pa);	/* add adapter to proc file system */
-							diva_os_enter_spin_lock(&adapter_lock, &old_irql, "add card");
+							bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql, "add card");
 						} else {
 							DBG_ERR(("slave adapter problem"))
 								break;
 						}
 					}
 
-					diva_os_leave_spin_lock(&adapter_lock, &old_irql, "add card");
+					diva_os_leave_spin_lock(&adapter_lock, &old_irql, "add card", bh);
 					return (pdiva);
 				}
 			}
 
-			diva_os_leave_spin_lock(&adapter_lock, &old_irql, "add card");
+			diva_os_leave_spin_lock(&adapter_lock, &old_irql, "add card", bh);
 
 			/*
 			  Not able to add adapter - remove it and return error
@@ -260,17 +261,19 @@ int divasa_xdi_driver_entry(void)
    -------------------------------------------------------------------------- */
 static diva_os_xdi_adapter_t *get_and_remove_from_queue(void)
 {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t old_irql;
 	diva_os_xdi_adapter_t *a = NULL;
 
-	diva_os_enter_spin_lock(&adapter_lock, &old_irql, "driver_unload");
+	bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql,
+				     "driver_unload");
 
 	if (!list_empty(&adapter_queue)) {
 		a = list_entry(adapter_queue.next, diva_os_xdi_adapter_t, link);
 		list_del(adapter_queue.next);
 	}
 
-	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "driver_unload");
+	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "driver_unload", bh);
 	return (a);
 }
 
@@ -282,12 +285,13 @@ void diva_driver_remove_card(void *pdiva)
 	diva_os_spin_lock_magic_t old_irql;
 	diva_os_xdi_adapter_t *a[4];
 	diva_os_xdi_adapter_t *pa;
+	unsigned int bh;
 	int i;
 
 	pa = a[0] = (diva_os_xdi_adapter_t *) pdiva;
 	a[1] = a[2] = a[3] = NULL;
 
-	diva_os_enter_spin_lock(&adapter_lock, &old_irql, "remode adapter");
+	bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql, "remode adapter");
 
 	for (i = 1; i < 4; i++) {
 		if ((pa = diva_q_get_next(&pa->link))
@@ -302,7 +306,7 @@ void diva_driver_remove_card(void *pdiva)
 		list_del(&a[i]->link);
 	}
 
-	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "driver_unload");
+	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "driver_unload", bh);
 
 	(*(a[0]->interface.cleanup_adapter_proc)) (a[0]);
 
@@ -326,6 +330,7 @@ static void *divas_create_pci_card(int handle, void *pci_dev_handle)
 	diva_supported_cards_info_t *pI = &divas_supported_cards[handle];
 	diva_os_spin_lock_magic_t old_irql;
 	diva_os_xdi_adapter_t *a;
+	unsigned int bh;
 
 	DBG_LOG(("found %d-%s", pI->CardOrdinal, CardProperties[pI->CardOrdinal].Name))
 
@@ -348,14 +353,14 @@ static void *divas_create_pci_card(int handle, void *pci_dev_handle)
 	  Add master adapter first, so slave adapters will receive higher
 	  numbers as master adapter
 	*/
-	diva_os_enter_spin_lock(&adapter_lock, &old_irql, "found_pci_card");
+	bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql, "found_pci_card");
 	list_add_tail(&a->link, &adapter_queue);
-	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "found_pci_card");
+	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "found_pci_card", bh);
 
 	if ((*(pI->init_card)) (a)) {
-		diva_os_enter_spin_lock(&adapter_lock, &old_irql, "found_pci_card");
+		bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql, "found_pci_card");
 		list_del(&a->link);
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "found_pci_card");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "found_pci_card", bh);
 		diva_os_free(0, a);
 		DBG_ERR(("A: can't get adapter resources"));
 		return NULL;
@@ -391,6 +396,7 @@ void *diva_xdi_open_adapter(void *os_handle, const void __user *src,
 			    int length, void *mptr,
 			    divas_xdi_copy_from_user_fn_t cp_fn)
 {
+	unsigned int bh;
 	diva_xdi_um_cfg_cmd_t *msg = (diva_xdi_um_cfg_cmd_t *)mptr;
 	diva_os_xdi_adapter_t *a = NULL;
 	diva_os_spin_lock_magic_t old_irql;
@@ -405,14 +411,14 @@ void *diva_xdi_open_adapter(void *os_handle, const void __user *src,
 		DBG_ERR(("A: A(?) open, write error"))
 			return NULL;
 	}
-	diva_os_enter_spin_lock(&adapter_lock, &old_irql, "open_adapter");
+	bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql, "open_adapter");
 	list_for_each(tmp, &adapter_queue) {
 		a = list_entry(tmp, diva_os_xdi_adapter_t, link);
 		if (a->controller == (int)msg->adapter)
 			break;
 		a = NULL;
 	}
-	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "open_adapter");
+	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "open_adapter", bh);
 
 	if (!a) {
 		DBG_ERR(("A: A(%d) open, adapter not found", msg->adapter))
@@ -614,11 +620,12 @@ void diva_xdi_display_adapter_features(int card)
 
 void diva_add_slave_adapter(diva_os_xdi_adapter_t *a)
 {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t old_irql;
 
-	diva_os_enter_spin_lock(&adapter_lock, &old_irql, "add_slave");
+	bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql, "add_slave");
 	list_add_tail(&a->link, &adapter_queue);
-	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "add_slave");
+	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "add_slave", bh);
 }
 
 int diva_card_read_xlog(diva_os_xdi_adapter_t *a)
diff --git a/drivers/isdn/hardware/eicon/idifunc.c b/drivers/isdn/hardware/eicon/idifunc.c
index fef6586..1c489c3 100644
--- a/drivers/isdn/hardware/eicon/idifunc.c
+++ b/drivers/isdn/hardware/eicon/idifunc.c
@@ -60,20 +60,21 @@ static diva_os_spin_lock_t ll_lock;
  */
 static udiva_card *find_card_in_list(DESCRIPTOR *d)
 {
+	unsigned int bh;
 	udiva_card *card;
 	struct list_head *tmp;
 	diva_os_spin_lock_magic_t old_irql;
 
-	diva_os_enter_spin_lock(&ll_lock, &old_irql, "find card");
+	bh = diva_os_enter_spin_lock(&ll_lock, &old_irql, "find card");
 	list_for_each(tmp, &cards) {
 		card = list_entry(tmp, udiva_card, list);
 		if (card->d.request == d->request) {
 			diva_os_leave_spin_lock(&ll_lock, &old_irql,
-						"find card");
+						"find card", bh);
 			return (card);
 		}
 	}
-	diva_os_leave_spin_lock(&ll_lock, &old_irql, "find card");
+	diva_os_leave_spin_lock(&ll_lock, &old_irql, "find card", bh);
 	return ((udiva_card *) NULL);
 }
 
@@ -82,6 +83,7 @@ static udiva_card *find_card_in_list(DESCRIPTOR *d)
  */
 static void um_new_card(DESCRIPTOR *d)
 {
+	unsigned int bh;
 	int adapter_nr = 0;
 	udiva_card *card = NULL;
 	IDI_SYNC_REQ sync_req;
@@ -100,9 +102,9 @@ static void um_new_card(DESCRIPTOR *d)
 		sync_req.xdi_logical_adapter_number.info.logical_adapter_number;
 	card->Id = adapter_nr;
 	if (!(diva_user_mode_idi_create_adapter(d, adapter_nr))) {
-		diva_os_enter_spin_lock(&ll_lock, &old_irql, "add card");
+		bh = diva_os_enter_spin_lock(&ll_lock, &old_irql, "add card");
 		list_add_tail(&card->list, &cards);
-		diva_os_leave_spin_lock(&ll_lock, &old_irql, "add card");
+		diva_os_leave_spin_lock(&ll_lock, &old_irql, "add card", bh);
 	} else {
 		DBG_ERR(("could not create user mode idi card %d",
 			 adapter_nr));
@@ -115,6 +117,7 @@ static void um_new_card(DESCRIPTOR *d)
  */
 static void um_remove_card(DESCRIPTOR *d)
 {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t old_irql;
 	udiva_card *card = NULL;
 
@@ -123,9 +126,9 @@ static void um_remove_card(DESCRIPTOR *d)
 		return;
 	}
 	diva_user_mode_idi_remove_adapter(card->Id);
-	diva_os_enter_spin_lock(&ll_lock, &old_irql, "remove card");
+	bh = diva_os_enter_spin_lock(&ll_lock, &old_irql, "remove card");
 	list_del(&card->list);
-	diva_os_leave_spin_lock(&ll_lock, &old_irql, "remove card");
+	diva_os_leave_spin_lock(&ll_lock, &old_irql, "remove card", bh);
 	DBG_LOG(("idi proc entry removed for card %d", card->Id));
 	diva_os_free(0, card);
 }
@@ -135,11 +138,12 @@ static void um_remove_card(DESCRIPTOR *d)
  */
 static void __exit remove_all_idi_proc(void)
 {
+	unsigned int bh;
 	udiva_card *card;
 	diva_os_spin_lock_magic_t old_irql;
 
 rescan:
-	diva_os_enter_spin_lock(&ll_lock, &old_irql, "remove all");
+	bh = diva_os_enter_spin_lock(&ll_lock, &old_irql, "remove all");
 	if (!list_empty(&cards)) {
 		card = list_entry(cards.next, udiva_card, list);
 		list_del(&card->list);
@@ -148,7 +152,7 @@ static void __exit remove_all_idi_proc(void)
 		diva_os_free(0, card);
 		goto rescan;
 	}
-	diva_os_leave_spin_lock(&ll_lock, &old_irql, "remove all");
+	diva_os_leave_spin_lock(&ll_lock, &old_irql, "remove all", bh);
 }
 
 /*
diff --git a/drivers/isdn/hardware/eicon/io.c b/drivers/isdn/hardware/eicon/io.c
index 8851ce5..df3d1f8 100644
--- a/drivers/isdn/hardware/eicon/io.c
+++ b/drivers/isdn/hardware/eicon/io.c
@@ -202,6 +202,7 @@ dump_trap_frame(PISDN_ADAPTER IoAdapter, byte __iomem *exceptionFrame)
    -------------------------------------------------------------------------- */
 void request(PISDN_ADAPTER IoAdapter, ENTITY *e)
 {
+	unsigned int bh;
 	byte i;
 	diva_os_spin_lock_magic_t irql;
 /*
@@ -222,7 +223,7 @@ void request(PISDN_ADAPTER IoAdapter, ENTITY *e)
 				pI->descriptor_number = -1;
 				return;
 			}
-			diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql, "dma_op");
+			bh = diva_enter_spin_lock(&IoAdapter->data_spin_lock, &irql, "dma_op");
 			if (pI->operation == IDI_SYNC_REQ_DMA_DESCRIPTOR_ALLOC) {
 				pI->descriptor_number = diva_alloc_dma_map_entry(\
 					(struct _diva_dma_map_entry *)IoAdapter->dma_map);
@@ -249,7 +250,7 @@ void request(PISDN_ADAPTER IoAdapter, ENTITY *e)
 				pI->descriptor_number = -1;
 				pI->operation         = -1;
 			}
-			diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "dma_op");
+			diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "dma_op", bh);
 		} return;
 #endif
 		case IDI_SYNC_REQ_XDI_GET_LOGICAL_ADAPTER_NUMBER: {
@@ -373,7 +374,8 @@ void request(PISDN_ADAPTER IoAdapter, ENTITY *e)
 			DBG_FTL(("xdi: uninitialized Adapter used - ignore request"))
 				return;
 		}
-	diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req");
+	bh = diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql,
+				     "data_req");
 /*
  * assign an entity
  */
@@ -383,7 +385,8 @@ void request(PISDN_ADAPTER IoAdapter, ENTITY *e)
 		{
 			DBG_FTL(("xdi: all Ids in use (max=%d) --> Req ignored",
 				 IoAdapter->e_max))
-				diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req");
+				diva_os_leave_spin_lock(&IoAdapter->data_spin_lock,
+							&irql, "data_req", bh);
 			return;
 		}
 /*
@@ -416,7 +419,8 @@ void request(PISDN_ADAPTER IoAdapter, ENTITY *e)
 					(*(IoAdapter->os_trap_nfy_Fnc))(IoAdapter, IoAdapter->ANum);
 				}
 			}
-		diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req");
+		diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql,
+					"data_req", bh);
 		return;
 	}
 /*
@@ -444,12 +448,14 @@ void request(PISDN_ADAPTER IoAdapter, ENTITY *e)
  * queue the DPC to process the request
  */
 	diva_os_schedule_soft_isr(&IoAdapter->req_soft_isr);
-	diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req");
+	diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req",
+				bh);
 }
 /* ---------------------------------------------------------------------
    Main DPC routine
    --------------------------------------------------------------------- */
 void DIDpcRoutine(struct _diva_os_soft_isr *psoft_isr, void *Context) {
+	unsigned int bh;
 	PISDN_ADAPTER IoAdapter = (PISDN_ADAPTER)Context;
 	ADAPTER *a = &IoAdapter->a;
 	diva_os_atomic_t *pin_dpc = &IoAdapter->in_dpc;
@@ -469,9 +475,8 @@ void DIDpcRoutine(struct _diva_os_soft_isr *psoft_isr, void *Context) {
 		if (IoAdapter->pcm_pending) {
 			struct pc_maint *pcm;
 			diva_os_spin_lock_magic_t OldIrql;
-			diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
-						&OldIrql,
-						"data_dpc");
+			bh = diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
+						     &OldIrql, "data_dpc");
 			pcm = (struct pc_maint *)IoAdapter->pcm_data;
 			switch (IoAdapter->pcm_pending) {
 			case 1: /* ask card for XLOG */
@@ -489,8 +494,7 @@ void DIDpcRoutine(struct _diva_os_soft_isr *psoft_isr, void *Context) {
 				break;
 			}
 			diva_os_leave_spin_lock(&IoAdapter->data_spin_lock,
-						&OldIrql,
-						"data_dpc");
+						&OldIrql, "data_dpc", bh);
 		}
 		/* ---------------------------------------------------------------- */
 	}
@@ -501,6 +505,7 @@ void DIDpcRoutine(struct _diva_os_soft_isr *psoft_isr, void *Context) {
 static void
 pcm_req(PISDN_ADAPTER IoAdapter, ENTITY *e)
 {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t OldIrql;
 	int              i, rc;
 	ADAPTER         *a = &IoAdapter->a;
@@ -511,45 +516,43 @@ pcm_req(PISDN_ADAPTER IoAdapter, ENTITY *e)
  */
 	if (IoAdapter->Properties.Card == CARD_MAE)
 	{
-		diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
-					&OldIrql,
-					"data_pcm_1");
+		bh = diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
+					     &OldIrql, "data_pcm_1");
 		IoAdapter->pcm_data = (void *)pcm;
 		IoAdapter->pcm_pending = 1;
 		diva_os_schedule_soft_isr(&IoAdapter->req_soft_isr);
-		diva_os_leave_spin_lock(&IoAdapter->data_spin_lock,
-					&OldIrql,
-					"data_pcm_1");
+		diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &OldIrql,
+					"data_pcm_1", bh);
 		for (rc = 0, i = (IoAdapter->trapped ? 3000 : 250); !rc && (i > 0); --i)
 		{
 			diva_os_sleep(1);
 			if (IoAdapter->pcm_pending == 3) {
-				diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
+				bh = diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
 							&OldIrql,
 							"data_pcm_3");
 				IoAdapter->pcm_pending = 0;
 				IoAdapter->pcm_data    = NULL;
 				diva_os_leave_spin_lock(&IoAdapter->data_spin_lock,
 							&OldIrql,
-							"data_pcm_3");
+							"data_pcm_3", bh);
 				return;
 			}
-			diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
+			bh = diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
 						&OldIrql,
 						"data_pcm_2");
 			diva_os_schedule_soft_isr(&IoAdapter->req_soft_isr);
 			diva_os_leave_spin_lock(&IoAdapter->data_spin_lock,
 						&OldIrql,
-						"data_pcm_2");
+						"data_pcm_2", bh);
 		}
-		diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
+		bh = diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
 					&OldIrql,
 					"data_pcm_4");
 		IoAdapter->pcm_pending = 0;
 		IoAdapter->pcm_data    = NULL;
 		diva_os_leave_spin_lock(&IoAdapter->data_spin_lock,
 					&OldIrql,
-					"data_pcm_4");
+					"data_pcm_4", bh);
 		goto Trapped;
 	}
 /*
@@ -755,48 +758,55 @@ void io_inc(ADAPTER *a, void *adr)
 /*------------------------------------------------------------------*/
 void free_entity(ADAPTER *a, byte e_no)
 {
+	unsigned int bh;
 	PISDN_ADAPTER IoAdapter;
 	diva_os_spin_lock_magic_t irql;
 	IoAdapter = (PISDN_ADAPTER) a->io;
-	diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_free");
+	bh = diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql,
+				     "data_free");
 	IoAdapter->e_tbl[e_no].e = NULL;
 	IoAdapter->e_count--;
-	diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_free");
+	diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql,
+				"data_free", bh);
 }
 void assign_queue(ADAPTER *a, byte e_no, word ref)
 {
+	unsigned int bh;
 	PISDN_ADAPTER IoAdapter;
 	diva_os_spin_lock_magic_t irql;
 	IoAdapter = (PISDN_ADAPTER) a->io;
-	diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_assign");
+	bh = diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql,
+				     "data_assign");
 	IoAdapter->e_tbl[e_no].assign_ref = ref;
 	IoAdapter->e_tbl[e_no].next = (byte)IoAdapter->assign;
 	IoAdapter->assign = e_no;
-	diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_assign");
+	diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql,
+				"data_assign", bh);
 }
 byte get_assign(ADAPTER *a, word ref)
 {
+	unsigned int bh;
 	PISDN_ADAPTER IoAdapter;
 	diva_os_spin_lock_magic_t irql;
 	byte e_no;
 	IoAdapter = (PISDN_ADAPTER) a->io;
-	diva_os_enter_spin_lock(&IoAdapter->data_spin_lock,
-				&irql,
-				"data_assign_get");
+	bh = diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql,
+				     "data_assign_get");
 	for (e_no = (byte)IoAdapter->assign;
 	    e_no && IoAdapter->e_tbl[e_no].assign_ref != ref;
 	    e_no = IoAdapter->e_tbl[e_no].next);
-	diva_os_leave_spin_lock(&IoAdapter->data_spin_lock,
-				&irql,
-				"data_assign_get");
+	diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql,
+				"data_assign_get", bh);
 	return e_no;
 }
 void req_queue(ADAPTER *a, byte e_no)
 {
+	unsigned int bh;
 	PISDN_ADAPTER IoAdapter;
 	diva_os_spin_lock_magic_t irql;
 	IoAdapter = (PISDN_ADAPTER) a->io;
-	diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req_q");
+	bh = diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql,
+				     "data_req_q");
 	IoAdapter->e_tbl[e_no].next = 0;
 	if (IoAdapter->head) {
 		IoAdapter->e_tbl[IoAdapter->tail].next = e_no;
@@ -806,7 +816,8 @@ void req_queue(ADAPTER *a, byte e_no)
 		IoAdapter->head = e_no;
 		IoAdapter->tail = e_no;
 	}
-	diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req_q");
+	diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql,
+				"data_req_q", bh);
 }
 byte look_req(ADAPTER *a)
 {
@@ -816,13 +827,16 @@ byte look_req(ADAPTER *a)
 }
 void next_req(ADAPTER *a)
 {
+	unsigned int bh;
 	PISDN_ADAPTER IoAdapter;
 	diva_os_spin_lock_magic_t irql;
 	IoAdapter = (PISDN_ADAPTER) a->io;
-	diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req_next");
+	bh = diva_os_enter_spin_lock(&IoAdapter->data_spin_lock, &irql,
+				     "data_req_next");
 	IoAdapter->head = IoAdapter->e_tbl[IoAdapter->head].next;
 	if (!IoAdapter->head) IoAdapter->tail = 0;
-	diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql, "data_req_next");
+	diva_os_leave_spin_lock(&IoAdapter->data_spin_lock, &irql,
+				"data_req_next", bh);
 }
 /*------------------------------------------------------------------*/
 /* memory map functions                                             */
diff --git a/drivers/isdn/hardware/eicon/mntfunc.c b/drivers/isdn/hardware/eicon/mntfunc.c
index 1cd9aff..b7a87ec 100644
--- a/drivers/isdn/hardware/eicon/mntfunc.c
+++ b/drivers/isdn/hardware/eicon/mntfunc.c
@@ -137,6 +137,7 @@ int maint_read_write(void __user *buf, int count)
 {
 	byte data[128];
 	dword cmd, id, mask;
+	unsigned int bh;
 	int ret = 0;
 
 	if (count < (3 * sizeof(dword)))
@@ -218,17 +219,17 @@ int maint_read_write(void __user *buf, int count)
 
 		for (;;) {
 			if (!(pmsg =
-			      diva_maint_get_message(&size, &old_irql))) {
+			      diva_maint_get_message(&size, &old_irql, &bh))) {
 				break;
 			}
 			if (size > mask) {
-				diva_maint_ack_message(0, &old_irql);
+				diva_maint_ack_message(0, &old_irql, bh);
 				ret = -EINVAL;
 				break;
 			}
 			ret = size;
 			memcpy(pbuf, pmsg, size);
-			diva_maint_ack_message(1, &old_irql);
+			diva_maint_ack_message(1, &old_irql, bh);
 			if ((count < size) ||
 			    diva_os_copy_to_user(NULL, buf, (void *) pbuf, size))
 				ret = -EFAULT;
@@ -255,11 +256,11 @@ int maint_read_write(void __user *buf, int count)
 
 		for (;;) {
 			if (!(pmsg =
-			      diva_maint_get_message(&size, &old_irql))) {
+			      diva_maint_get_message(&size, &old_irql, &bh))) {
 				break;
 			}
 			if ((size + 8) > mask) {
-				diva_maint_ack_message(0, &old_irql);
+				diva_maint_ack_message(0, &old_irql, bh);
 				break;
 			}
 			/*
@@ -273,7 +274,7 @@ int maint_read_write(void __user *buf, int count)
 			  Write message
 			*/
 			memcpy(&pbuf[written], pmsg, size);
-			diva_maint_ack_message(1, &old_irql);
+			diva_maint_ack_message(1, &old_irql, bh);
 			written += size;
 			mask -= (size + 4);
 		}
diff --git a/drivers/isdn/hardware/eicon/platform.h b/drivers/isdn/hardware/eicon/platform.h
index 62e2073..345c901 100644
--- a/drivers/isdn/hardware/eicon/platform.h
+++ b/drivers/isdn/hardware/eicon/platform.h
@@ -235,12 +235,13 @@ typedef long diva_os_spin_lock_magic_t;
 typedef spinlock_t diva_os_spin_lock_t;
 static __inline__ int diva_os_initialize_spin_lock(spinlock_t *lock, void *unused) { \
 	spin_lock_init(lock); return (0); }
-static __inline__ void diva_os_enter_spin_lock(diva_os_spin_lock_t *a, \
-					       diva_os_spin_lock_magic_t *old_irql, \
-					       void *dbg) { spin_lock_bh(a); }
+static __inline__ unsigned int diva_os_enter_spin_lock(diva_os_spin_lock_t *a, \
+						       diva_os_spin_lock_magic_t *old_irql, \
+						       void *dbg) { spin_lock_bh(a); }
 static __inline__ void diva_os_leave_spin_lock(diva_os_spin_lock_t *a, \
 					       diva_os_spin_lock_magic_t *old_irql, \
-					       void *dbg) { spin_unlock_bh(a); }
+					       void *dbg,
+					       unsigned int bh) { spin_unlock_bh(a); }
 
 #define diva_os_destroy_spin_lock(a, b) do { } while (0)
 
diff --git a/drivers/isdn/hardware/eicon/um_idi.c b/drivers/isdn/hardware/eicon/um_idi.c
index db4dd4f..138be33 100644
--- a/drivers/isdn/hardware/eicon/um_idi.c
+++ b/drivers/isdn/hardware/eicon/um_idi.c
@@ -121,6 +121,7 @@ void diva_user_mode_idi_finit(void)
    ------------------------------------------------------------------------- */
 int diva_user_mode_idi_create_adapter(const DESCRIPTOR *d, int adapter_nr)
 {
+	unsigned int bh;
 	diva_os_spin_lock_magic_t old_irql;
 	diva_um_idi_adapter_t *a =
 		(diva_um_idi_adapter_t *) diva_os_malloc(0,
@@ -139,9 +140,11 @@ int diva_user_mode_idi_create_adapter(const DESCRIPTOR *d, int adapter_nr)
 	DBG_LOG(("DIDD_ADD A(%d), type:%02x, features:%04x, channels:%d",
 		 adapter_nr, a->d.type, a->d.features, a->d.channels));
 
-	diva_os_enter_spin_lock(&adapter_lock, &old_irql, "create_adapter");
+	bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql,
+				     "create_adapter");
 	list_add_tail(&a->link, &adapter_q);
-	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "create_adapter");
+	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "create_adapter",
+				bh);
 	return (0);
 }
 
@@ -208,6 +211,7 @@ static void cleanup_entity(divas_um_idi_entity_t *e)
    ------------------------------------------------------------------------ */
 void *divas_um_idi_create_entity(dword adapter_nr, void *file)
 {
+	unsigned int bh;
 	divas_um_idi_entity_t *e;
 	diva_um_idi_adapter_t *a;
 	diva_os_spin_lock_magic_t old_irql;
@@ -235,7 +239,8 @@ void *divas_um_idi_create_entity(dword adapter_nr, void *file)
 			return NULL;
 		}
 
-		diva_os_enter_spin_lock(&adapter_lock, &old_irql, "create_entity");
+		bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql,
+					     "create_entity");
 		/*
 		  Look for Adapter requested
 		*/
@@ -243,7 +248,8 @@ void *divas_um_idi_create_entity(dword adapter_nr, void *file)
 			/*
 			  No adapter was found, or this adapter was removed
 			*/
-			diva_os_leave_spin_lock(&adapter_lock, &old_irql, "create_entity");
+			diva_os_leave_spin_lock(&adapter_lock, &old_irql,
+						"create_entity", bh);
 
 			DBG_LOG(("A: no adapter(%ld)", adapter_nr));
 
@@ -259,7 +265,8 @@ void *divas_um_idi_create_entity(dword adapter_nr, void *file)
 
 		list_add_tail(&e->link, &a->entity_q);	/* link from adapter */
 
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "create_entity");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql,
+					"create_entity", bh);
 
 		DBG_LOG(("A(%ld), create E(%08x)", adapter_nr, e));
 	}
@@ -272,6 +279,7 @@ void *divas_um_idi_create_entity(dword adapter_nr, void *file)
    ------------------------------------------------------------------------ */
 int divas_um_idi_delete_entity(int adapter_nr, void *entity)
 {
+	unsigned int bh;
 	divas_um_idi_entity_t *e;
 	diva_um_idi_adapter_t *a;
 	diva_os_spin_lock_magic_t old_irql;
@@ -279,11 +287,12 @@ int divas_um_idi_delete_entity(int adapter_nr, void *entity)
 	if (!(e = (divas_um_idi_entity_t *) entity))
 		return (-1);
 
-	diva_os_enter_spin_lock(&adapter_lock, &old_irql, "delete_entity");
+	bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql,
+				     "delete_entity");
 	if ((a = e->adapter)) {
 		list_del(&e->link);
 	}
-	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "delete_entity");
+	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "delete_entity", bh);
 
 	diva_um_idi_stop_wdog(entity);
 	cleanup_entity(e);
@@ -304,6 +313,7 @@ int diva_um_idi_read(void *entity,
 		     void *dst,
 		     int max_length, divas_um_idi_copy_to_user_fn_t cp_fn)
 {
+	unsigned int bh;
 	divas_um_idi_entity_t *e;
 	diva_um_idi_adapter_t *a;
 	const void *data;
@@ -311,14 +321,14 @@ int diva_um_idi_read(void *entity,
 	diva_um_idi_data_queue_t *q;
 	diva_os_spin_lock_magic_t old_irql;
 
-	diva_os_enter_spin_lock(&adapter_lock, &old_irql, "read");
+	bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql, "read");
 
 	e = (divas_um_idi_entity_t *) entity;
 	if (!e || (!(a = e->adapter)) ||
 	    (e->status & DIVA_UM_IDI_REMOVE_PENDING) ||
 	    (e->status & DIVA_UM_IDI_REMOVED) ||
 	    (a->status & DIVA_UM_IDI_ADAPTER_REMOVED)) {
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "read");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "read", bh);
 		DBG_ERR(("E(%08x) read failed - adapter removed", e))
 			return (-1);
 	}
@@ -354,7 +364,7 @@ int diva_um_idi_read(void *entity,
 			DBG_ERR(("A: A(%d) E(%08x) read small buffer",
 				 a->adapter_nr, e, ret));
 			diva_os_leave_spin_lock(&adapter_lock, &old_irql,
-						"read");
+						"read", bh);
 			return (-2);
 		}
 		/*
@@ -373,7 +383,7 @@ int diva_um_idi_read(void *entity,
 
 	DBG_TRC(("A(%d) E(%08x) read=%d", a->adapter_nr, e, ret));
 
-	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "read");
+	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "read", bh);
 
 	return (ret);
 }
@@ -384,6 +394,7 @@ int diva_um_idi_write(void *entity,
 		      const void *src,
 		      int length, divas_um_idi_copy_from_user_fn_t cp_fn)
 {
+	unsigned int bh;
 	divas_um_idi_entity_t *e;
 	diva_um_idi_adapter_t *a;
 	diva_um_idi_req_hdr_t *req;
@@ -391,14 +402,14 @@ int diva_um_idi_write(void *entity,
 	int ret = 0;
 	diva_os_spin_lock_magic_t old_irql;
 
-	diva_os_enter_spin_lock(&adapter_lock, &old_irql, "write");
+	bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql, "write");
 
 	e = (divas_um_idi_entity_t *) entity;
 	if (!e || (!(a = e->adapter)) ||
 	    (e->status & DIVA_UM_IDI_REMOVE_PENDING) ||
 	    (e->status & DIVA_UM_IDI_REMOVED) ||
 	    (a->status & DIVA_UM_IDI_ADAPTER_REMOVED)) {
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write", bh);
 		DBG_ERR(("E(%08x) write failed - adapter removed", e))
 			return (-1);
 	}
@@ -406,13 +417,13 @@ int diva_um_idi_write(void *entity,
 	DBG_TRC(("A(%d) E(%08x) write(%d)", a->adapter_nr, e, length));
 
 	if ((length < sizeof(*req)) || (length > sizeof(e->buffer))) {
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write", bh);
 		return (-2);
 	}
 
 	if (e->status & DIVA_UM_IDI_RC_PENDING) {
 		DBG_ERR(("A: A(%d) E(%08x) rc pending", a->adapter_nr, e));
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write", bh);
 		return (-1);	/* should wait for RC code first */
 	}
 
@@ -423,7 +434,7 @@ int diva_um_idi_write(void *entity,
 	if ((ret = (*cp_fn) (os_handle, e->buffer, src, length)) < 0) {
 		DBG_TRC(("A: A(%d) E(%08x) write error=%d", a->adapter_nr,
 			 e, ret));
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write", bh);
 		return (ret);
 	}
 
@@ -436,9 +447,8 @@ int diva_um_idi_write(void *entity,
 		      diva_data_q_get_segment4write(&e->data))) {
 			DBG_ERR(("A(%d) get_features, no free buffer",
 				 a->adapter_nr));
-			diva_os_leave_spin_lock(&adapter_lock,
-						&old_irql,
-						"write");
+			diva_os_leave_spin_lock(&adapter_lock, &old_irql,
+						"write", bh);
 			return (0);
 		}
 		diva_user_mode_idi_adapter_features(a, &(((diva_um_idi_ind_hdr_t
@@ -449,7 +459,7 @@ int diva_um_idi_write(void *entity,
 		diva_data_q_ack_segment4write(&e->data,
 					      sizeof(diva_um_idi_ind_hdr_t));
 
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write", bh);
 
 		diva_os_wakeup_read(e->os_context);
 	}
@@ -464,20 +474,23 @@ int diva_um_idi_write(void *entity,
 			 req->type & DIVA_UM_IDI_REQ_TYPE_MASK));
 		switch (process_idi_request(e, req)) {
 		case -1:
-			diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write");
+			diva_os_leave_spin_lock(&adapter_lock, &old_irql,
+						"write", bh);
 			return (-1);
 		case -2:
-			diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write");
+			diva_os_leave_spin_lock(&adapter_lock, &old_irql,
+						"write", bh);
 			diva_os_wakeup_read(e->os_context);
 			break;
 		default:
-			diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write");
+			diva_os_leave_spin_lock(&adapter_lock, &old_irql,
+						"write", bh);
 			break;
 		}
 		break;
 
 	default:
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "write", bh);
 		return (-1);
 	}
 
@@ -491,13 +504,14 @@ int diva_um_idi_write(void *entity,
    -------------------------------------------------------------------------- */
 static void diva_um_idi_xdi_callback(ENTITY *entity)
 {
+	unsigned int bh;
 	divas_um_idi_entity_t *e = DIVAS_CONTAINING_RECORD(entity,
 							   divas_um_idi_entity_t,
 							   e);
 	diva_os_spin_lock_magic_t old_irql;
 	int call_wakeup = 0;
 
-	diva_os_enter_spin_lock(&adapter_lock, &old_irql, "xdi_callback");
+	bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql, "xdi_callback");
 
 	if (e->e.complete == 255) {
 		if (!(e->status & DIVA_UM_IDI_REMOVE_PENDING)) {
@@ -509,7 +523,8 @@ static void diva_um_idi_xdi_callback(ENTITY *entity)
 			}
 		}
 		e->e.Rc = 0;
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "xdi_callback");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql,
+					"xdi_callback", bh);
 
 		if (call_wakeup) {
 			diva_os_wakeup_read(e->os_context);
@@ -523,7 +538,8 @@ static void diva_um_idi_xdi_callback(ENTITY *entity)
 			call_wakeup = process_idi_ind(e, e->e.Ind);
 		}
 		e->e.Ind = 0;
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "xdi_callback");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql,
+					"xdi_callback", bh);
 		if (call_wakeup) {
 			diva_os_wakeup_read(e->os_context);
 		}
@@ -759,6 +775,7 @@ static int write_return_code(divas_um_idi_entity_t *e, byte rc)
    -------------------------------------------------------------------------- */
 int diva_user_mode_idi_ind_ready(void *entity, void *os_handle)
 {
+	unsigned int bh;
 	divas_um_idi_entity_t *e;
 	diva_um_idi_adapter_t *a;
 	diva_os_spin_lock_magic_t old_irql;
@@ -766,7 +783,7 @@ int diva_user_mode_idi_ind_ready(void *entity, void *os_handle)
 
 	if (!entity)
 		return (-1);
-	diva_os_enter_spin_lock(&adapter_lock, &old_irql, "ind_ready");
+	bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql, "ind_ready");
 	e = (divas_um_idi_entity_t *) entity;
 	a = e->adapter;
 
@@ -774,7 +791,8 @@ int diva_user_mode_idi_ind_ready(void *entity, void *os_handle)
 		/*
 		  Adapter was unloaded
 		*/
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "ind_ready");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "ind_ready",
+					bh);
 		return (-1);	/* adapter was removed */
 	}
 	if (e->status & DIVA_UM_IDI_REMOVED) {
@@ -782,7 +800,8 @@ int diva_user_mode_idi_ind_ready(void *entity, void *os_handle)
 		  entity was removed as result of adapter removal
 		  user should assign this entity again
 		*/
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "ind_ready");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "ind_ready",
+					bh);
 		return (-1);
 	}
 
@@ -792,7 +811,7 @@ int diva_user_mode_idi_ind_ready(void *entity, void *os_handle)
 		ret = 0;
 	}
 
-	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "ind_ready");
+	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "ind_ready", bh);
 
 	return (ret);
 }
@@ -804,19 +823,21 @@ void *diva_um_id_get_os_context(void *entity)
 
 int divas_um_idi_entity_assigned(void *entity)
 {
+	unsigned int bh;
 	divas_um_idi_entity_t *e;
 	diva_um_idi_adapter_t *a;
 	int ret;
 	diva_os_spin_lock_magic_t old_irql;
 
-	diva_os_enter_spin_lock(&adapter_lock, &old_irql, "assigned?");
+	bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql, "assigned?");
 
 
 	e = (divas_um_idi_entity_t *) entity;
 	if (!e || (!(a = e->adapter)) ||
 	    (e->status & DIVA_UM_IDI_REMOVED) ||
 	    (a->status & DIVA_UM_IDI_ADAPTER_REMOVED)) {
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "assigned?");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "assigned?",
+					bh);
 		return (0);
 	}
 
@@ -828,24 +849,27 @@ int divas_um_idi_entity_assigned(void *entity)
 	DBG_TRC(("Id:%02x, rc_count:%d, status:%08x", e->e.Id, e->rc_count,
 		 e->status))
 
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "assigned?");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "assigned?",
+					bh);
 
 	return (ret);
 }
 
 int divas_um_idi_entity_start_remove(void *entity)
 {
+	unsigned int bh;
 	divas_um_idi_entity_t *e;
 	diva_um_idi_adapter_t *a;
 	diva_os_spin_lock_magic_t old_irql;
 
-	diva_os_enter_spin_lock(&adapter_lock, &old_irql, "start_remove");
+	bh = diva_os_enter_spin_lock(&adapter_lock, &old_irql, "start_remove");
 
 	e = (divas_um_idi_entity_t *) entity;
 	if (!e || (!(a = e->adapter)) ||
 	    (e->status & DIVA_UM_IDI_REMOVED) ||
 	    (a->status & DIVA_UM_IDI_ADAPTER_REMOVED)) {
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "start_remove");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql,
+					"start_remove", bh);
 		return (0);
 	}
 
@@ -853,7 +877,8 @@ int divas_um_idi_entity_start_remove(void *entity)
 		/*
 		  Entity BUSY
 		*/
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "start_remove");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql,
+					"start_remove", bh);
 		return (1);
 	}
 
@@ -861,7 +886,8 @@ int divas_um_idi_entity_start_remove(void *entity)
 		/*
 		  Remove request was already pending, and arrived now
 		*/
-		diva_os_leave_spin_lock(&adapter_lock, &old_irql, "start_remove");
+		diva_os_leave_spin_lock(&adapter_lock, &old_irql,
+					"start_remove", bh);
 		return (0);	/* REMOVE was pending */
 	}
 
@@ -880,7 +906,7 @@ int divas_um_idi_entity_start_remove(void *entity)
 	if (a->d.request)
 		(*(a->d.request)) (&e->e);
 
-	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "start_remove");
+	diva_os_leave_spin_lock(&adapter_lock, &old_irql, "start_remove", bh);
 
 	return (0);
 }
-- 
2.7.4