.. | .. |
---|
326 | 326 | test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags); |
---|
327 | 327 | |
---|
328 | 328 | if (hw->protocol == ISDN_P_NT_S0) { |
---|
| 329 | + struct sk_buff_head free_queue; |
---|
| 330 | + |
---|
| 331 | + __skb_queue_head_init(&free_queue); |
---|
329 | 332 | hfcsusb_ph_command(hw, HFC_L1_DEACTIVATE_NT); |
---|
330 | 333 | spin_lock_irqsave(&hw->lock, flags); |
---|
331 | | - skb_queue_purge(&dch->squeue); |
---|
| 334 | + skb_queue_splice_init(&dch->squeue, &free_queue); |
---|
332 | 335 | if (dch->tx_skb) { |
---|
333 | | - dev_kfree_skb(dch->tx_skb); |
---|
| 336 | + __skb_queue_tail(&free_queue, dch->tx_skb); |
---|
334 | 337 | dch->tx_skb = NULL; |
---|
335 | 338 | } |
---|
336 | 339 | dch->tx_idx = 0; |
---|
337 | 340 | if (dch->rx_skb) { |
---|
338 | | - dev_kfree_skb(dch->rx_skb); |
---|
| 341 | + __skb_queue_tail(&free_queue, dch->rx_skb); |
---|
339 | 342 | dch->rx_skb = NULL; |
---|
340 | 343 | } |
---|
341 | 344 | test_and_clear_bit(FLG_TX_BUSY, &dch->Flags); |
---|
342 | 345 | spin_unlock_irqrestore(&hw->lock, flags); |
---|
| 346 | + __skb_queue_purge(&free_queue); |
---|
343 | 347 | #ifdef FIXME |
---|
344 | 348 | if (test_and_clear_bit(FLG_L1_BUSY, &dch->Flags)) |
---|
345 | 349 | dchannel_sched_event(&hc->dch, D_CLEARBUSY); |
---|
.. | .. |
---|
1330 | 1334 | printk("\n"); |
---|
1331 | 1335 | } |
---|
1332 | 1336 | |
---|
1333 | | - dev_kfree_skb(tx_skb); |
---|
| 1337 | + dev_consume_skb_irq(tx_skb); |
---|
1334 | 1338 | tx_skb = NULL; |
---|
1335 | 1339 | if (fifo->dch && get_next_dframe(fifo->dch)) |
---|
1336 | 1340 | tx_skb = fifo->dch->tx_skb; |
---|