Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mISDN: Make clearing B-channel a common function

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>

+17 -47
+1 -15
drivers/isdn/hardware/mISDN/hfcmulti.c
··· 3416 3416 u_long flags; 3417 3417 3418 3418 spin_lock_irqsave(&hc->lock, flags); 3419 - if (test_and_clear_bit(FLG_TX_NEXT, &bch->Flags)) { 3420 - dev_kfree_skb(bch->next_skb); 3421 - bch->next_skb = NULL; 3422 - } 3423 - if (bch->tx_skb) { 3424 - dev_kfree_skb(bch->tx_skb); 3425 - bch->tx_skb = NULL; 3426 - } 3427 - bch->tx_idx = 0; 3428 - if (bch->rx_skb) { 3429 - dev_kfree_skb(bch->rx_skb); 3430 - bch->rx_skb = NULL; 3431 - } 3419 + mISDN_clear_bchannel(bch); 3432 3420 hc->chan[bch->slot].coeff_count = 0; 3433 - test_and_clear_bit(FLG_ACTIVE, &bch->Flags); 3434 - test_and_clear_bit(FLG_TX_BUSY, &bch->Flags); 3435 3421 hc->chan[bch->slot].rx_off = 0; 3436 3422 hc->chan[bch->slot].conf = -1; 3437 3423 mode_hfcmulti(hc, bch->slot, ISDN_P_NONE, -1, 0, -1, 0);
+1 -15
drivers/isdn/hardware/mISDN/hfcpci.c
··· 1522 1522 u_long flags; 1523 1523 1524 1524 spin_lock_irqsave(&hc->lock, flags); 1525 - if (test_and_clear_bit(FLG_TX_NEXT, &bch->Flags)) { 1526 - dev_kfree_skb(bch->next_skb); 1527 - bch->next_skb = NULL; 1528 - } 1529 - if (bch->tx_skb) { 1530 - dev_kfree_skb(bch->tx_skb); 1531 - bch->tx_skb = NULL; 1532 - } 1533 - bch->tx_idx = 0; 1534 - if (bch->rx_skb) { 1535 - dev_kfree_skb(bch->rx_skb); 1536 - bch->rx_skb = NULL; 1537 - } 1525 + mISDN_clear_bchannel(bch); 1538 1526 mode_hfcpci(bch, bch->nr, ISDN_P_NONE); 1539 - test_and_clear_bit(FLG_ACTIVE, &bch->Flags); 1540 - test_and_clear_bit(FLG_TX_BUSY, &bch->Flags); 1541 1527 spin_unlock_irqrestore(&hc->lock, flags); 1542 1528 } 1543 1529
+1 -15
drivers/isdn/hardware/mISDN/hfcsusb.c
··· 1809 1809 hw->name, __func__, bch->nr); 1810 1810 1811 1811 spin_lock_irqsave(&hw->lock, flags); 1812 - if (test_and_clear_bit(FLG_TX_NEXT, &bch->Flags)) { 1813 - dev_kfree_skb(bch->next_skb); 1814 - bch->next_skb = NULL; 1815 - } 1816 - if (bch->tx_skb) { 1817 - dev_kfree_skb(bch->tx_skb); 1818 - bch->tx_skb = NULL; 1819 - } 1820 - bch->tx_idx = 0; 1821 - if (bch->rx_skb) { 1822 - dev_kfree_skb(bch->rx_skb); 1823 - bch->rx_skb = NULL; 1824 - } 1825 - clear_bit(FLG_ACTIVE, &bch->Flags); 1826 - clear_bit(FLG_TX_BUSY, &bch->Flags); 1812 + mISDN_clear_bchannel(bch); 1827 1813 spin_unlock_irqrestore(&hw->lock, flags); 1828 1814 hfcsusb_setup_bch(bch, ISDN_P_NONE); 1829 1815 hfcsusb_stop_endpoint(hw, bch->nr);
+13 -2
drivers/isdn/mISDN/hwchannel.c
··· 114 114 } 115 115 EXPORT_SYMBOL(mISDN_freedchannel); 116 116 117 - int 118 - mISDN_freebchannel(struct bchannel *ch) 117 + void 118 + mISDN_clear_bchannel(struct bchannel *ch) 119 119 { 120 120 if (ch->tx_skb) { 121 121 dev_kfree_skb(ch->tx_skb); 122 122 ch->tx_skb = NULL; 123 123 } 124 + ch->tx_idx = 0; 124 125 if (ch->rx_skb) { 125 126 dev_kfree_skb(ch->rx_skb); 126 127 ch->rx_skb = NULL; ··· 130 129 dev_kfree_skb(ch->next_skb); 131 130 ch->next_skb = NULL; 132 131 } 132 + test_and_clear_bit(FLG_TX_BUSY, &ch->Flags); 133 + test_and_clear_bit(FLG_TX_NEXT, &ch->Flags); 134 + test_and_clear_bit(FLG_ACTIVE, &ch->Flags); 135 + } 136 + EXPORT_SYMBOL(mISDN_clear_bchannel); 137 + 138 + int 139 + mISDN_freebchannel(struct bchannel *ch) 140 + { 141 + mISDN_clear_bchannel(ch); 133 142 skb_queue_purge(&ch->rqueue); 134 143 ch->rcount = 0; 135 144 flush_scheduled_work();
+1
include/linux/mISDNhw.h
··· 168 168 extern int mISDN_initdchannel(struct dchannel *, int, void *); 169 169 extern int mISDN_initbchannel(struct bchannel *, int); 170 170 extern int mISDN_freedchannel(struct dchannel *); 171 + extern void mISDN_clear_bchannel(struct bchannel *); 171 172 extern int mISDN_freebchannel(struct bchannel *); 172 173 extern void queue_ch_frame(struct mISDNchannel *, u_int, 173 174 int, struct sk_buff *);