hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/isdn/hardware/mISDN/hfcmulti.c
....@@ -3219,6 +3219,7 @@
32193219 hfcm_l1callback(struct dchannel *dch, u_int cmd)
32203220 {
32213221 struct hfc_multi *hc = dch->hw;
3222
+ struct sk_buff_head free_queue;
32223223 u_long flags;
32233224
32243225 switch (cmd) {
....@@ -3247,6 +3248,7 @@
32473248 l1_event(dch->l1, HW_POWERUP_IND);
32483249 break;
32493250 case HW_DEACT_REQ:
3251
+ __skb_queue_head_init(&free_queue);
32503252 /* start deactivation */
32513253 spin_lock_irqsave(&hc->lock, flags);
32523254 if (hc->ctype == HFC_TYPE_E1) {
....@@ -3266,20 +3268,21 @@
32663268 plxsd_checksync(hc, 0);
32673269 }
32683270 }
3269
- skb_queue_purge(&dch->squeue);
3271
+ skb_queue_splice_init(&dch->squeue, &free_queue);
32703272 if (dch->tx_skb) {
3271
- dev_kfree_skb(dch->tx_skb);
3273
+ __skb_queue_tail(&free_queue, dch->tx_skb);
32723274 dch->tx_skb = NULL;
32733275 }
32743276 dch->tx_idx = 0;
32753277 if (dch->rx_skb) {
3276
- dev_kfree_skb(dch->rx_skb);
3278
+ __skb_queue_tail(&free_queue, dch->rx_skb);
32773279 dch->rx_skb = NULL;
32783280 }
32793281 test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
32803282 if (test_and_clear_bit(FLG_BUSY_TIMER, &dch->Flags))
32813283 del_timer(&dch->timer);
32823284 spin_unlock_irqrestore(&hc->lock, flags);
3285
+ __skb_queue_purge(&free_queue);
32833286 break;
32843287 case HW_POWERUP_REQ:
32853288 spin_lock_irqsave(&hc->lock, flags);
....@@ -3386,6 +3389,9 @@
33863389 case PH_DEACTIVATE_REQ:
33873390 test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
33883391 if (dch->dev.D.protocol != ISDN_P_TE_S0) {
3392
+ struct sk_buff_head free_queue;
3393
+
3394
+ __skb_queue_head_init(&free_queue);
33893395 spin_lock_irqsave(&hc->lock, flags);
33903396 if (debug & DEBUG_HFCMULTI_MSG)
33913397 printk(KERN_DEBUG
....@@ -3407,14 +3413,14 @@
34073413 /* deactivate */
34083414 dch->state = 1;
34093415 }
3410
- skb_queue_purge(&dch->squeue);
3416
+ skb_queue_splice_init(&dch->squeue, &free_queue);
34113417 if (dch->tx_skb) {
3412
- dev_kfree_skb(dch->tx_skb);
3418
+ __skb_queue_tail(&free_queue, dch->tx_skb);
34133419 dch->tx_skb = NULL;
34143420 }
34153421 dch->tx_idx = 0;
34163422 if (dch->rx_skb) {
3417
- dev_kfree_skb(dch->rx_skb);
3423
+ __skb_queue_tail(&free_queue, dch->rx_skb);
34183424 dch->rx_skb = NULL;
34193425 }
34203426 test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
....@@ -3426,6 +3432,7 @@
34263432 #endif
34273433 ret = 0;
34283434 spin_unlock_irqrestore(&hc->lock, flags);
3435
+ __skb_queue_purge(&free_queue);
34293436 } else
34303437 ret = l1_event(dch->l1, hh->prim);
34313438 break;