Commit 43ec4349 authored by Kai Germaschewski's avatar Kai Germaschewski

ISDN/HiSax: Shared bc_open/close()

Another bunch of duplicated code is gone..
parent d4c12f8b
...@@ -467,51 +467,13 @@ void ...@@ -467,51 +467,13 @@ void
close_hdlcstate(struct BCState *bcs) close_hdlcstate(struct BCState *bcs)
{ {
modehdlc(bcs, 0, 0); modehdlc(bcs, 0, 0);
if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) { bc_close(bcs);
if (bcs->rcvbuf) {
kfree(bcs->rcvbuf);
bcs->rcvbuf = NULL;
}
if (bcs->blog) {
kfree(bcs->blog);
bcs->blog = NULL;
}
skb_queue_purge(&bcs->rqueue);
skb_queue_purge(&bcs->squeue);
if (bcs->tx_skb) {
dev_kfree_skb_any(bcs->tx_skb);
bcs->tx_skb = NULL;
test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
}
}
} }
int int
open_hdlcstate(struct IsdnCardState *cs, struct BCState *bcs) open_hdlcstate(struct IsdnCardState *cs, struct BCState *bcs)
{ {
if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) { return bc_open(bcs);
if (!(bcs->rcvbuf = kmalloc(HSCX_BUFMAX, GFP_ATOMIC))) {
printk(KERN_WARNING
"HiSax: No memory for hdlc.rcvbuf\n");
return (1);
}
if (!(bcs->blog = kmalloc(MAX_BLOG_SPACE, GFP_ATOMIC))) {
printk(KERN_WARNING
"HiSax: No memory for bcs->blog\n");
test_and_clear_bit(BC_FLG_INIT, &bcs->Flag);
kfree(bcs->rcvbuf);
bcs->rcvbuf = NULL;
return (2);
}
skb_queue_head_init(&bcs->rqueue);
skb_queue_head_init(&bcs->squeue);
}
bcs->tx_skb = NULL;
test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
bcs->event = 0;
bcs->rcvidx = 0;
bcs->tx_cnt = 0;
return (0);
} }
int int
......
...@@ -152,48 +152,13 @@ void ...@@ -152,48 +152,13 @@ void
close_hscxstate(struct BCState *bcs) close_hscxstate(struct BCState *bcs)
{ {
modehscx(bcs, 0, bcs->channel); modehscx(bcs, 0, bcs->channel);
if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) { bc_close(bcs);
if (bcs->rcvbuf) {
kfree(bcs->rcvbuf);
bcs->rcvbuf = NULL;
}
if (bcs->blog) {
kfree(bcs->blog);
bcs->blog = NULL;
}
skb_queue_purge(&bcs->rqueue);
skb_queue_purge(&bcs->squeue);
skb_queue_purge(&bcs->cmpl_queue);
if (bcs->tx_skb) {
dev_kfree_skb_any(bcs->tx_skb);
bcs->tx_skb = NULL;
test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
}
}
} }
int int
open_hscxstate(struct IsdnCardState *cs, struct BCState *bcs) open_hscxstate(struct IsdnCardState *cs, struct BCState *bcs)
{ {
if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) { bc_open(bcs);
if (!(bcs->rcvbuf = kmalloc(HSCX_BUFMAX, GFP_ATOMIC))) {
printk(KERN_WARNING
"HiSax: No memory for hscx.rcvbuf\n");
test_and_clear_bit(BC_FLG_INIT, &bcs->Flag);
return (1);
}
if (!(bcs->blog = kmalloc(MAX_BLOG_SPACE, GFP_ATOMIC))) {
printk(KERN_WARNING
"HiSax: No memory for bcs->blog\n");
test_and_clear_bit(BC_FLG_INIT, &bcs->Flag);
kfree(bcs->rcvbuf);
bcs->rcvbuf = NULL;
return (2);
}
skb_queue_head_init(&bcs->rqueue);
skb_queue_head_init(&bcs->squeue);
skb_queue_head_init(&bcs->cmpl_queue);
}
bcs->tx_skb = NULL; bcs->tx_skb = NULL;
test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag); test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
bcs->event = 0; bcs->event = 0;
......
...@@ -644,23 +644,7 @@ static void ...@@ -644,23 +644,7 @@ static void
bch_close_state(struct BCState *bcs) bch_close_state(struct BCState *bcs)
{ {
bch_mode(bcs, 0, bcs->channel); bch_mode(bcs, 0, bcs->channel);
if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) { bc_close(bcs);
if (bcs->rcvbuf) {
kfree(bcs->rcvbuf);
bcs->rcvbuf = NULL;
}
if (bcs->blog) {
kfree(bcs->blog);
bcs->blog = NULL;
}
skb_queue_purge(&bcs->rqueue);
skb_queue_purge(&bcs->squeue);
if (bcs->tx_skb) {
dev_kfree_skb_any(bcs->tx_skb);
bcs->tx_skb = NULL;
clear_bit(BC_FLG_BUSY, &bcs->Flag);
}
}
} }
//---------------------------------------------------------- //----------------------------------------------------------
...@@ -668,30 +652,7 @@ bch_close_state(struct BCState *bcs) ...@@ -668,30 +652,7 @@ bch_close_state(struct BCState *bcs)
static int static int
bch_open_state(struct IsdnCardState *cs, struct BCState *bcs) bch_open_state(struct IsdnCardState *cs, struct BCState *bcs)
{ {
if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) { return bc_open(bcs);
if (!(bcs->rcvbuf = kmalloc(HSCX_BUFMAX, GFP_ATOMIC))) {
printk(KERN_WARNING
"HiSax open_bchstate(): No memory for hscx.rcvbuf\n");
clear_bit(BC_FLG_INIT, &bcs->Flag);
return (1);
}
if (!(bcs->blog = kmalloc(MAX_BLOG_SPACE, GFP_ATOMIC))) {
printk(KERN_WARNING
"HiSax open_bchstate: No memory for bcs->blog\n");
clear_bit(BC_FLG_INIT, &bcs->Flag);
kfree(bcs->rcvbuf);
bcs->rcvbuf = NULL;
return (2);
}
skb_queue_head_init(&bcs->rqueue);
skb_queue_head_init(&bcs->squeue);
}
bcs->tx_skb = NULL;
clear_bit(BC_FLG_BUSY, &bcs->Flag);
bcs->event = 0;
bcs->rcvidx = 0;
bcs->tx_cnt = 0;
return (0);
} }
//---------------------------------------------------------- //----------------------------------------------------------
......
...@@ -459,7 +459,7 @@ recv_rme_b(struct BCState *bcs) ...@@ -459,7 +459,7 @@ recv_rme_b(struct BCState *bcs)
skb = dev_alloc_skb(count); skb = dev_alloc_skb(count);
if (!skb) { if (!skb) {
printk(KERN_WARNING "%s: out of memory\n", __FUNCTION__); printk(KERN_WARNING "HiSax: %s: out of memory\n", __FUNCTION__);
return; return;
} }
memcpy(skb_put(skb, count), bcs->rcvbuf, count); memcpy(skb_put(skb, count), bcs->rcvbuf, count);
...@@ -476,3 +476,58 @@ recv_rpf_b(struct BCState *bcs) ...@@ -476,3 +476,58 @@ recv_rpf_b(struct BCState *bcs)
recv_rme_b(bcs); recv_rme_b(bcs);
} }
static inline int
bc_open(struct BCState *bcs)
{
if (test_and_set_bit(BC_FLG_INIT, &bcs->Flag))
return 0;
bcs->rcvbuf = kmalloc(HSCX_BUFMAX, GFP_ATOMIC);
if (!bcs->rcvbuf)
goto err;
bcs->blog = kmalloc(MAX_BLOG_SPACE, GFP_ATOMIC);
if (!bcs->blog)
goto err_rcvbuf;
skb_queue_head_init(&bcs->rqueue);
skb_queue_head_init(&bcs->squeue);
skb_queue_head_init(&bcs->cmpl_queue);
clear_bit(BC_FLG_BUSY, &bcs->Flag);
bcs->tx_skb = NULL;
bcs->rcvidx = 0;
bcs->tx_cnt = 0;
bcs->event = 0;
return 0;
err_rcvbuf:
kfree(bcs->rcvbuf);
err:
clear_bit(BC_FLG_INIT, &bcs->Flag);
printk(KERN_WARNING "HiSax: %s: out of memory\n", __FUNCTION__);
return -ENOMEM;;
}
static inline void
bc_close(struct BCState *bcs)
{
if (!test_and_clear_bit(BC_FLG_INIT, &bcs->Flag))
return;
kfree(bcs->rcvbuf);
bcs->rcvbuf = NULL;
kfree(bcs->blog);
bcs->blog = NULL;
skb_queue_purge(&bcs->rqueue);
skb_queue_purge(&bcs->squeue);
skb_queue_purge(&bcs->cmpl_queue);
if (bcs->tx_skb) {
dev_kfree_skb_any(bcs->tx_skb);
bcs->tx_skb = NULL;
clear_bit(BC_FLG_BUSY, &bcs->Flag);
}
}
...@@ -190,52 +190,13 @@ void ...@@ -190,52 +190,13 @@ void
close_jadestate(struct BCState *bcs) close_jadestate(struct BCState *bcs)
{ {
modejade(bcs, 0, bcs->channel); modejade(bcs, 0, bcs->channel);
if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) { bc_close(bcs);
if (bcs->rcvbuf) {
kfree(bcs->rcvbuf);
bcs->rcvbuf = NULL;
}
if (bcs->blog) {
kfree(bcs->blog);
bcs->blog = NULL;
}
skb_queue_purge(&bcs->rqueue);
skb_queue_purge(&bcs->squeue);
if (bcs->tx_skb) {
dev_kfree_skb_any(bcs->tx_skb);
bcs->tx_skb = NULL;
test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
}
}
} }
static int static int
open_jadestate(struct IsdnCardState *cs, struct BCState *bcs) open_jadestate(struct IsdnCardState *cs, struct BCState *bcs)
{ {
if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) { return bc_open(bcs);;
if (!(bcs->rcvbuf = kmalloc(HSCX_BUFMAX, GFP_ATOMIC))) {
printk(KERN_WARNING
"HiSax: No memory for hscx.rcvbuf\n");
test_and_clear_bit(BC_FLG_INIT, &bcs->Flag);
return (1);
}
if (!(bcs->blog = kmalloc(MAX_BLOG_SPACE, GFP_ATOMIC))) {
printk(KERN_WARNING
"HiSax: No memory for bcs->blog\n");
test_and_clear_bit(BC_FLG_INIT, &bcs->Flag);
kfree(bcs->rcvbuf);
bcs->rcvbuf = NULL;
return (2);
}
skb_queue_head_init(&bcs->rqueue);
skb_queue_head_init(&bcs->squeue);
}
bcs->tx_skb = NULL;
test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
bcs->event = 0;
bcs->rcvidx = 0;
bcs->tx_cnt = 0;
return (0);
} }
......
...@@ -598,52 +598,13 @@ static void ...@@ -598,52 +598,13 @@ static void
close_w6692state(struct BCState *bcs) close_w6692state(struct BCState *bcs)
{ {
W6692Bmode(bcs, 0, bcs->channel); W6692Bmode(bcs, 0, bcs->channel);
if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) { bc_close(bcs);
if (bcs->rcvbuf) {
kfree(bcs->rcvbuf);
bcs->rcvbuf = NULL;
}
if (bcs->blog) {
kfree(bcs->blog);
bcs->blog = NULL;
}
skb_queue_purge(&bcs->rqueue);
skb_queue_purge(&bcs->squeue);
if (bcs->tx_skb) {
dev_kfree_skb_any(bcs->tx_skb);
bcs->tx_skb = NULL;
test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
}
}
} }
static int static int
open_w6692state(struct IsdnCardState *cs, struct BCState *bcs) open_w6692state(struct IsdnCardState *cs, struct BCState *bcs)
{ {
if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) { return bc_open(bcs);
if (!(bcs->rcvbuf = kmalloc(HSCX_BUFMAX, GFP_ATOMIC))) {
printk(KERN_WARNING
"HiSax: No memory for w6692.rcvbuf\n");
test_and_clear_bit(BC_FLG_INIT, &bcs->Flag);
return (1);
}
if (!(bcs->blog = kmalloc(MAX_BLOG_SPACE, GFP_ATOMIC))) {
printk(KERN_WARNING
"HiSax: No memory for bcs->blog\n");
test_and_clear_bit(BC_FLG_INIT, &bcs->Flag);
kfree(bcs->rcvbuf);
bcs->rcvbuf = NULL;
return (2);
}
skb_queue_head_init(&bcs->rqueue);
skb_queue_head_init(&bcs->squeue);
}
bcs->tx_skb = NULL;
test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
bcs->event = 0;
bcs->rcvidx = 0;
bcs->tx_cnt = 0;
return (0);
} }
static int static int
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment