Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 30230
b: refs/heads/master
c: 6aa6547
h: refs/heads/master
v: v3
  • Loading branch information
Michael Buesch authored and Linus Torvalds committed Jun 26, 2006
1 parent 8c52d5a commit 976eb04
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 23 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e6f47f978bcd5413fff610613b18e9e0eab9bc1b
refs/heads/master: 6aa65472d18703064898eefb5eb58f7ecd0d8912
54 changes: 32 additions & 22 deletions trunk/drivers/isdn/capi/capi.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@ struct capincci;
#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
struct capiminor;

struct datahandle_queue {
struct list_head list;
u16 datahandle;
};

struct capiminor {
struct list_head list;
struct capincci *nccip;
Expand All @@ -109,12 +114,9 @@ struct capiminor {
int outbytes;

/* transmit path */
struct datahandle_queue {
struct datahandle_queue *next;
u16 datahandle;
} *ackqueue;
struct list_head ackqueue;
int nack;

spinlock_t ackqlock;
};
#endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */

Expand Down Expand Up @@ -156,48 +158,54 @@ static LIST_HEAD(capiminor_list);

static int capincci_add_ack(struct capiminor *mp, u16 datahandle)
{
struct datahandle_queue *n, **pp;
struct datahandle_queue *n;
unsigned long flags;

n = kmalloc(sizeof(*n), GFP_ATOMIC);
if (!n) {
printk(KERN_ERR "capi: alloc datahandle failed\n");
return -1;
if (unlikely(!n)) {
printk(KERN_ERR "capi: alloc datahandle failed\n");
return -1;
}
n->next = NULL;
n->datahandle = datahandle;
for (pp = &mp->ackqueue; *pp; pp = &(*pp)->next) ;
*pp = n;
INIT_LIST_HEAD(&n->list);
spin_lock_irqsave(&mp->ackqlock, flags);
list_add_tail(&n->list, &mp->ackqueue);
mp->nack++;
spin_unlock_irqrestore(&mp->ackqlock, flags);
return 0;
}

static int capiminor_del_ack(struct capiminor *mp, u16 datahandle)
{
struct datahandle_queue **pp, *p;
struct datahandle_queue *p, *tmp;
unsigned long flags;

for (pp = &mp->ackqueue; *pp; pp = &(*pp)->next) {
if ((*pp)->datahandle == datahandle) {
p = *pp;
*pp = (*pp)->next;
spin_lock_irqsave(&mp->ackqlock, flags);
list_for_each_entry_safe(p, tmp, &mp->ackqueue, list) {
if (p->datahandle == datahandle) {
list_del(&p->list);
kfree(p);
mp->nack--;
spin_unlock_irqrestore(&mp->ackqlock, flags);
return 0;
}
}
spin_unlock_irqrestore(&mp->ackqlock, flags);
return -1;
}

static void capiminor_del_all_ack(struct capiminor *mp)
{
struct datahandle_queue **pp, *p;
struct datahandle_queue *p, *tmp;
unsigned long flags;

pp = &mp->ackqueue;
while (*pp) {
p = *pp;
*pp = (*pp)->next;
spin_lock_irqsave(&mp->ackqlock, flags);
list_for_each_entry_safe(p, tmp, &mp->ackqueue, list) {
list_del(&p->list);
kfree(p);
mp->nack--;
}
spin_unlock_irqrestore(&mp->ackqlock, flags);
}


Expand All @@ -220,6 +228,8 @@ static struct capiminor *capiminor_alloc(struct capi20_appl *ap, u32 ncci)
mp->ncci = ncci;
mp->msgid = 0;
atomic_set(&mp->ttyopencount,0);
INIT_LIST_HEAD(&mp->ackqueue);
spin_lock_init(&mp->ackqlock);

skb_queue_head_init(&mp->inqueue);
skb_queue_head_init(&mp->outqueue);
Expand Down

0 comments on commit 976eb04

Please sign in to comment.