[PATCH] isdn4linux: Siemens Gigaset drivers: make some variables non-atomic

With Hansjoerg Lipp <hjlipp@web.de>

Replace some atomic_t variables in the Gigaset drivers by non-atomic ones,
using spinlocks instead to assure atomicity, as proposed in discussions on the
linux-kernel mailing list.

Signed-off-by: Hansjoerg Lipp <hjlipp@web.de>
Signed-off-by: Tilman Schmidt <tilman@imap.cc>
Cc: Karsten Keil <kkeil@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Tilman Schmidt
2006-04-10 22:55:16 -07:00
committed by Linus Torvalds
parent 27d1ac2ef7
commit 69049cc87d
10 changed files with 211 additions and 154 deletions

View File

@@ -56,11 +56,6 @@ static int writebuf_from_LL(int driverID, int channel, int ack,
"Receiving data from LL (id: %d, ch: %d, ack: %d, sz: %d)",
driverID, channel, ack, len);
if (!atomic_read(&cs->connected)) {
err("%s: disconnected", __func__);
return -ENODEV;
}
if (!len) {
if (ack)
notice("%s: not ACKing empty packet", __func__);
@@ -78,7 +73,7 @@ static int writebuf_from_LL(int driverID, int channel, int ack,
len, skblen, (unsigned) skb->head[0], (unsigned) skb->head[1]);
/* pass to device-specific module */
return cs->ops->send_skb(bcs, skb);
return cs->ops->send_skb(bcs, skb); //FIXME cs->ops->send_skb() must handle !cs->connected correctly
}
void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *skb)
@@ -119,11 +114,12 @@ static int command_from_LL(isdn_ctrl *cntrl)
struct bc_state *bcs;
int retval = 0;
struct setup_parm *sp;
unsigned param;
unsigned long flags;
gigaset_debugdrivers();
//FIXME "remove test for &connected"
if ((!cs || !atomic_read(&cs->connected))) {
if (!cs) {
warn("LL tried to access unknown device with nr. %d",
cntrl->driver);
return -ENODEV;
@@ -166,8 +162,11 @@ static int command_from_LL(isdn_ctrl *cntrl)
}
*sp = cntrl->parm.setup;
if (!gigaset_add_event(cs, &bcs->at_state, EV_DIAL, sp,
atomic_read(&bcs->at_state.seq_index),
spin_lock_irqsave(&cs->lock, flags);
param = bcs->at_state.seq_index;
spin_unlock_irqrestore(&cs->lock, flags);
if (!gigaset_add_event(cs, &bcs->at_state, EV_DIAL, sp, param,
NULL)) {
//FIXME what should we do?
kfree(sp);