Commit fb286f0471a04ef646c8e5c79750ae6718183745

Authored by Karsten Keil
1 parent f3fad223ed

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>

Showing 5 changed files with 17 additions and 47 deletions Side-by-side Diff

drivers/isdn/hardware/mISDN/hfcmulti.c
... ... @@ -3416,22 +3416,8 @@
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);
drivers/isdn/hardware/mISDN/hfcpci.c
... ... @@ -1522,22 +1522,8 @@
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  
drivers/isdn/hardware/mISDN/hfcsusb.c
... ... @@ -1809,21 +1809,7 @@
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);
drivers/isdn/mISDN/hwchannel.c
... ... @@ -114,13 +114,14 @@
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;
... ... @@ -129,6 +130,16 @@
129 130 dev_kfree_skb(ch->next_skb);
130 131 ch->next_skb = NULL;
131 132 }
  133 + test_and_clear_bit(FLG_TX_BUSY, &ch->Flags);
  134 + test_and_clear_bit(FLG_TX_NEXT, &ch->Flags);
  135 + test_and_clear_bit(FLG_ACTIVE, &ch->Flags);
  136 +}
  137 +EXPORT_SYMBOL(mISDN_clear_bchannel);
  138 +
  139 +int
  140 +mISDN_freebchannel(struct bchannel *ch)
  141 +{
  142 + mISDN_clear_bchannel(ch);
132 143 skb_queue_purge(&ch->rqueue);
133 144 ch->rcount = 0;
134 145 flush_scheduled_work();
include/linux/mISDNhw.h
... ... @@ -168,6 +168,7 @@
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 *);