lkml.org 
[lkml]   [2009]   [Jul]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH 05/13] mISDN: Make clearing B-channel a common function
    From
    Clearing B-channel is needed in every driver, so it makes sense
    to have it as common function.

    Signed-off-by: Karsten Keil <keil@b1-systems.de>
    ---
    drivers/isdn/hardware/mISDN/hfcmulti.c | 16 +---------------
    drivers/isdn/hardware/mISDN/hfcpci.c | 16 +---------------
    drivers/isdn/hardware/mISDN/hfcsusb.c | 16 +---------------
    drivers/isdn/mISDN/hwchannel.c | 15 +++++++++++++--
    include/linux/mISDNhw.h | 1 +
    5 files changed, 17 insertions(+), 47 deletions(-)

    diff --git a/drivers/isdn/hardware/mISDN/hfcmulti.c b/drivers/isdn/hardware/mISDN/hfcmulti.c
    index e1dab30..fd77bb1 100644
    --- a/drivers/isdn/hardware/mISDN/hfcmulti.c
    +++ b/drivers/isdn/hardware/mISDN/hfcmulti.c
    @@ -3416,22 +3416,8 @@ deactivate_bchannel(struct bchannel *bch)
    u_long flags;

    spin_lock_irqsave(&hc->lock, flags);
    - if (test_and_clear_bit(FLG_TX_NEXT, &bch->Flags)) {
    - dev_kfree_skb(bch->next_skb);
    - bch->next_skb = NULL;
    - }
    - if (bch->tx_skb) {
    - dev_kfree_skb(bch->tx_skb);
    - bch->tx_skb = NULL;
    - }
    - bch->tx_idx = 0;
    - if (bch->rx_skb) {
    - dev_kfree_skb(bch->rx_skb);
    - bch->rx_skb = NULL;
    - }
    + mISDN_clear_bchannel(bch);
    hc->chan[bch->slot].coeff_count = 0;
    - test_and_clear_bit(FLG_ACTIVE, &bch->Flags);
    - test_and_clear_bit(FLG_TX_BUSY, &bch->Flags);
    hc->chan[bch->slot].rx_off = 0;
    hc->chan[bch->slot].conf = -1;
    mode_hfcmulti(hc, bch->slot, ISDN_P_NONE, -1, 0, -1, 0);
    diff --git a/drivers/isdn/hardware/mISDN/hfcpci.c b/drivers/isdn/hardware/mISDN/hfcpci.c
    index 228ffbe..70e6b0e 100644
    --- a/drivers/isdn/hardware/mISDN/hfcpci.c
    +++ b/drivers/isdn/hardware/mISDN/hfcpci.c
    @@ -1522,22 +1522,8 @@ deactivate_bchannel(struct bchannel *bch)
    u_long flags;

    spin_lock_irqsave(&hc->lock, flags);
    - if (test_and_clear_bit(FLG_TX_NEXT, &bch->Flags)) {
    - dev_kfree_skb(bch->next_skb);
    - bch->next_skb = NULL;
    - }
    - if (bch->tx_skb) {
    - dev_kfree_skb(bch->tx_skb);
    - bch->tx_skb = NULL;
    - }
    - bch->tx_idx = 0;
    - if (bch->rx_skb) {
    - dev_kfree_skb(bch->rx_skb);
    - bch->rx_skb = NULL;
    - }
    + mISDN_clear_bchannel(bch);
    mode_hfcpci(bch, bch->nr, ISDN_P_NONE);
    - test_and_clear_bit(FLG_ACTIVE, &bch->Flags);
    - test_and_clear_bit(FLG_TX_BUSY, &bch->Flags);
    spin_unlock_irqrestore(&hc->lock, flags);
    }

    diff --git a/drivers/isdn/hardware/mISDN/hfcsusb.c b/drivers/isdn/hardware/mISDN/hfcsusb.c
    index 6b7704c..fc46a26 100644
    --- a/drivers/isdn/hardware/mISDN/hfcsusb.c
    +++ b/drivers/isdn/hardware/mISDN/hfcsusb.c
    @@ -1809,21 +1809,7 @@ deactivate_bchannel(struct bchannel *bch)
    hw->name, __func__, bch->nr);

    spin_lock_irqsave(&hw->lock, flags);
    - if (test_and_clear_bit(FLG_TX_NEXT, &bch->Flags)) {
    - dev_kfree_skb(bch->next_skb);
    - bch->next_skb = NULL;
    - }
    - if (bch->tx_skb) {
    - dev_kfree_skb(bch->tx_skb);
    - bch->tx_skb = NULL;
    - }
    - bch->tx_idx = 0;
    - if (bch->rx_skb) {
    - dev_kfree_skb(bch->rx_skb);
    - bch->rx_skb = NULL;
    - }
    - clear_bit(FLG_ACTIVE, &bch->Flags);
    - clear_bit(FLG_TX_BUSY, &bch->Flags);
    + mISDN_clear_bchannel(bch);
    spin_unlock_irqrestore(&hw->lock, flags);
    hfcsusb_setup_bch(bch, ISDN_P_NONE);
    hfcsusb_stop_endpoint(hw, bch->nr);
    diff --git a/drivers/isdn/mISDN/hwchannel.c b/drivers/isdn/mISDN/hwchannel.c
    index 0481a0c..e8049be 100644
    --- a/drivers/isdn/mISDN/hwchannel.c
    +++ b/drivers/isdn/mISDN/hwchannel.c
    @@ -114,13 +114,14 @@ mISDN_freedchannel(struct dchannel *ch)
    }
    EXPORT_SYMBOL(mISDN_freedchannel);

    -int
    -mISDN_freebchannel(struct bchannel *ch)
    +void
    +mISDN_clear_bchannel(struct bchannel *ch)
    {
    if (ch->tx_skb) {
    dev_kfree_skb(ch->tx_skb);
    ch->tx_skb = NULL;
    }
    + ch->tx_idx = 0;
    if (ch->rx_skb) {
    dev_kfree_skb(ch->rx_skb);
    ch->rx_skb = NULL;
    @@ -129,6 +130,16 @@ mISDN_freebchannel(struct bchannel *ch)
    dev_kfree_skb(ch->next_skb);
    ch->next_skb = NULL;
    }
    + test_and_clear_bit(FLG_TX_BUSY, &ch->Flags);
    + test_and_clear_bit(FLG_TX_NEXT, &ch->Flags);
    + test_and_clear_bit(FLG_ACTIVE, &ch->Flags);
    +}
    +EXPORT_SYMBOL(mISDN_clear_bchannel);
    +
    +int
    +mISDN_freebchannel(struct bchannel *ch)
    +{
    + mISDN_clear_bchannel(ch);
    skb_queue_purge(&ch->rqueue);
    ch->rcount = 0;
    flush_scheduled_work();
    diff --git a/include/linux/mISDNhw.h b/include/linux/mISDNhw.h
    index 7f9831d..4af8414 100644
    --- a/include/linux/mISDNhw.h
    +++ b/include/linux/mISDNhw.h
    @@ -168,6 +168,7 @@ struct bchannel {
    extern int mISDN_initdchannel(struct dchannel *, int, void *);
    extern int mISDN_initbchannel(struct bchannel *, int);
    extern int mISDN_freedchannel(struct dchannel *);
    +extern void mISDN_clear_bchannel(struct bchannel *);
    extern int mISDN_freebchannel(struct bchannel *);
    extern void queue_ch_frame(struct mISDNchannel *, u_int,
    int, struct sk_buff *);
    --
    1.6.0.2


    \
     
     \ /
      Last update: 2009-07-25 22:17    [W:6.992 / U:0.248 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site