.. | .. |
---|
839 | 839 | *z1t = cpu_to_le16(new_z1); /* now send data */ |
---|
840 | 840 | if (bch->tx_idx < bch->tx_skb->len) |
---|
841 | 841 | return; |
---|
842 | | - dev_kfree_skb(bch->tx_skb); |
---|
| 842 | + dev_kfree_skb_any(bch->tx_skb); |
---|
843 | 843 | if (get_next_bframe(bch)) |
---|
844 | 844 | goto next_t_frame; |
---|
845 | 845 | return; |
---|
.. | .. |
---|
895 | 895 | } |
---|
896 | 896 | bz->za[new_f1].z1 = cpu_to_le16(new_z1); /* for next buffer */ |
---|
897 | 897 | bz->f1 = new_f1; /* next frame */ |
---|
898 | | - dev_kfree_skb(bch->tx_skb); |
---|
| 898 | + dev_kfree_skb_any(bch->tx_skb); |
---|
899 | 899 | get_next_bframe(bch); |
---|
900 | 900 | } |
---|
901 | 901 | |
---|
.. | .. |
---|
1119 | 1119 | if (bch->tx_skb && bch->tx_idx < bch->tx_skb->len) |
---|
1120 | 1120 | hfcpci_fill_fifo(bch); |
---|
1121 | 1121 | else { |
---|
1122 | | - dev_kfree_skb(bch->tx_skb); |
---|
| 1122 | + dev_kfree_skb_any(bch->tx_skb); |
---|
1123 | 1123 | if (get_next_bframe(bch)) |
---|
1124 | 1124 | hfcpci_fill_fifo(bch); |
---|
1125 | 1125 | } |
---|
.. | .. |
---|
1617 | 1617 | test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags); |
---|
1618 | 1618 | spin_lock_irqsave(&hc->lock, flags); |
---|
1619 | 1619 | if (hc->hw.protocol == ISDN_P_NT_S0) { |
---|
| 1620 | + struct sk_buff_head free_queue; |
---|
| 1621 | + |
---|
| 1622 | + __skb_queue_head_init(&free_queue); |
---|
1620 | 1623 | /* prepare deactivation */ |
---|
1621 | 1624 | Write_hfc(hc, HFCPCI_STATES, 0x40); |
---|
1622 | | - skb_queue_purge(&dch->squeue); |
---|
| 1625 | + skb_queue_splice_init(&dch->squeue, &free_queue); |
---|
1623 | 1626 | if (dch->tx_skb) { |
---|
1624 | | - dev_kfree_skb(dch->tx_skb); |
---|
| 1627 | + __skb_queue_tail(&free_queue, dch->tx_skb); |
---|
1625 | 1628 | dch->tx_skb = NULL; |
---|
1626 | 1629 | } |
---|
1627 | 1630 | dch->tx_idx = 0; |
---|
1628 | 1631 | if (dch->rx_skb) { |
---|
1629 | | - dev_kfree_skb(dch->rx_skb); |
---|
| 1632 | + __skb_queue_tail(&free_queue, dch->rx_skb); |
---|
1630 | 1633 | dch->rx_skb = NULL; |
---|
1631 | 1634 | } |
---|
1632 | 1635 | test_and_clear_bit(FLG_TX_BUSY, &dch->Flags); |
---|
.. | .. |
---|
1639 | 1642 | hc->hw.mst_m &= ~HFCPCI_MASTER; |
---|
1640 | 1643 | Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m); |
---|
1641 | 1644 | ret = 0; |
---|
| 1645 | + spin_unlock_irqrestore(&hc->lock, flags); |
---|
| 1646 | + __skb_queue_purge(&free_queue); |
---|
1642 | 1647 | } else { |
---|
1643 | 1648 | ret = l1_event(dch->l1, hh->prim); |
---|
| 1649 | + spin_unlock_irqrestore(&hc->lock, flags); |
---|
1644 | 1650 | } |
---|
1645 | | - spin_unlock_irqrestore(&hc->lock, flags); |
---|
1646 | 1651 | break; |
---|
1647 | 1652 | } |
---|
1648 | 1653 | if (!ret) |
---|
.. | .. |
---|
2272 | 2277 | return 0; |
---|
2273 | 2278 | |
---|
2274 | 2279 | if (hc->hw.int_m2 & HFCPCI_IRQ_ENABLE) { |
---|
2275 | | - spin_lock(&hc->lock); |
---|
| 2280 | + spin_lock_irq(&hc->lock); |
---|
2276 | 2281 | bch = Sel_BCS(hc, hc->hw.bswapped ? 2 : 1); |
---|
2277 | 2282 | if (bch && bch->state == ISDN_P_B_RAW) { /* B1 rx&tx */ |
---|
2278 | 2283 | main_rec_hfcpci(bch); |
---|
.. | .. |
---|
2283 | 2288 | main_rec_hfcpci(bch); |
---|
2284 | 2289 | tx_birq(bch); |
---|
2285 | 2290 | } |
---|
2286 | | - spin_unlock(&hc->lock); |
---|
| 2291 | + spin_unlock_irq(&hc->lock); |
---|
2287 | 2292 | } |
---|
2288 | 2293 | return 0; |
---|
2289 | 2294 | } |
---|