Commit fb286f0471a04ef646c8e5c79750ae6718183745
1 parent
f3fad223ed
Exists in
master
and in
7 other branches
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 *); |