hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/isdn/hardware/mISDN/hfcpci.c
....@@ -839,7 +839,7 @@
839839 *z1t = cpu_to_le16(new_z1); /* now send data */
840840 if (bch->tx_idx < bch->tx_skb->len)
841841 return;
842
- dev_kfree_skb(bch->tx_skb);
842
+ dev_kfree_skb_any(bch->tx_skb);
843843 if (get_next_bframe(bch))
844844 goto next_t_frame;
845845 return;
....@@ -895,7 +895,7 @@
895895 }
896896 bz->za[new_f1].z1 = cpu_to_le16(new_z1); /* for next buffer */
897897 bz->f1 = new_f1; /* next frame */
898
- dev_kfree_skb(bch->tx_skb);
898
+ dev_kfree_skb_any(bch->tx_skb);
899899 get_next_bframe(bch);
900900 }
901901
....@@ -1119,7 +1119,7 @@
11191119 if (bch->tx_skb && bch->tx_idx < bch->tx_skb->len)
11201120 hfcpci_fill_fifo(bch);
11211121 else {
1122
- dev_kfree_skb(bch->tx_skb);
1122
+ dev_kfree_skb_any(bch->tx_skb);
11231123 if (get_next_bframe(bch))
11241124 hfcpci_fill_fifo(bch);
11251125 }
....@@ -1617,16 +1617,19 @@
16171617 test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
16181618 spin_lock_irqsave(&hc->lock, flags);
16191619 if (hc->hw.protocol == ISDN_P_NT_S0) {
1620
+ struct sk_buff_head free_queue;
1621
+
1622
+ __skb_queue_head_init(&free_queue);
16201623 /* prepare deactivation */
16211624 Write_hfc(hc, HFCPCI_STATES, 0x40);
1622
- skb_queue_purge(&dch->squeue);
1625
+ skb_queue_splice_init(&dch->squeue, &free_queue);
16231626 if (dch->tx_skb) {
1624
- dev_kfree_skb(dch->tx_skb);
1627
+ __skb_queue_tail(&free_queue, dch->tx_skb);
16251628 dch->tx_skb = NULL;
16261629 }
16271630 dch->tx_idx = 0;
16281631 if (dch->rx_skb) {
1629
- dev_kfree_skb(dch->rx_skb);
1632
+ __skb_queue_tail(&free_queue, dch->rx_skb);
16301633 dch->rx_skb = NULL;
16311634 }
16321635 test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
....@@ -1639,10 +1642,12 @@
16391642 hc->hw.mst_m &= ~HFCPCI_MASTER;
16401643 Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
16411644 ret = 0;
1645
+ spin_unlock_irqrestore(&hc->lock, flags);
1646
+ __skb_queue_purge(&free_queue);
16421647 } else {
16431648 ret = l1_event(dch->l1, hh->prim);
1649
+ spin_unlock_irqrestore(&hc->lock, flags);
16441650 }
1645
- spin_unlock_irqrestore(&hc->lock, flags);
16461651 break;
16471652 }
16481653 if (!ret)
....@@ -2272,7 +2277,7 @@
22722277 return 0;
22732278
22742279 if (hc->hw.int_m2 & HFCPCI_IRQ_ENABLE) {
2275
- spin_lock(&hc->lock);
2280
+ spin_lock_irq(&hc->lock);
22762281 bch = Sel_BCS(hc, hc->hw.bswapped ? 2 : 1);
22772282 if (bch && bch->state == ISDN_P_B_RAW) { /* B1 rx&tx */
22782283 main_rec_hfcpci(bch);
....@@ -2283,7 +2288,7 @@
22832288 main_rec_hfcpci(bch);
22842289 tx_birq(bch);
22852290 }
2286
- spin_unlock(&hc->lock);
2291
+ spin_unlock_irq(&hc->lock);
22872292 }
22882293 return 0;
22892294 }