diff options
Diffstat (limited to 'drivers/atm/he.c')
-rw-r--r-- | drivers/atm/he.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/atm/he.c b/drivers/atm/he.c index d369130f4235..ffcb9fd31c38 100644 --- a/drivers/atm/he.c +++ b/drivers/atm/he.c | |||
@@ -1928,7 +1928,9 @@ he_service_rbrq(struct he_dev *he_dev, int group) | |||
1928 | #ifdef notdef | 1928 | #ifdef notdef |
1929 | ATM_SKB(skb)->vcc = vcc; | 1929 | ATM_SKB(skb)->vcc = vcc; |
1930 | #endif | 1930 | #endif |
1931 | spin_unlock(&he_dev->global_lock); | ||
1931 | vcc->push(vcc, skb); | 1932 | vcc->push(vcc, skb); |
1933 | spin_lock(&he_dev->global_lock); | ||
1932 | 1934 | ||
1933 | atomic_inc(&vcc->stats->rx); | 1935 | atomic_inc(&vcc->stats->rx); |
1934 | 1936 | ||
@@ -2282,6 +2284,8 @@ __enqueue_tpd(struct he_dev *he_dev, struct he_tpd *tpd, unsigned cid) | |||
2282 | TPDRQ_MASK(he_readl(he_dev, TPDRQ_B_H))); | 2284 | TPDRQ_MASK(he_readl(he_dev, TPDRQ_B_H))); |
2283 | 2285 | ||
2284 | if (new_tail == he_dev->tpdrq_head) { | 2286 | if (new_tail == he_dev->tpdrq_head) { |
2287 | int slot; | ||
2288 | |||
2285 | hprintk("tpdrq full (cid 0x%x)\n", cid); | 2289 | hprintk("tpdrq full (cid 0x%x)\n", cid); |
2286 | /* | 2290 | /* |
2287 | * FIXME | 2291 | * FIXME |
@@ -2289,6 +2293,13 @@ __enqueue_tpd(struct he_dev *he_dev, struct he_tpd *tpd, unsigned cid) | |||
2289 | * after service_tbrq, service the backlog | 2293 | * after service_tbrq, service the backlog |
2290 | * for now, we just drop the pdu | 2294 | * for now, we just drop the pdu |
2291 | */ | 2295 | */ |
2296 | for (slot = 0; slot < TPD_MAXIOV; ++slot) { | ||
2297 | if (tpd->iovec[slot].addr) | ||
2298 | pci_unmap_single(he_dev->pci_dev, | ||
2299 | tpd->iovec[slot].addr, | ||
2300 | tpd->iovec[slot].len & TPD_LEN_MASK, | ||
2301 | PCI_DMA_TODEVICE); | ||
2302 | } | ||
2292 | if (tpd->skb) { | 2303 | if (tpd->skb) { |
2293 | if (tpd->vcc->pop) | 2304 | if (tpd->vcc->pop) |
2294 | tpd->vcc->pop(tpd->vcc, tpd->skb); | 2305 | tpd->vcc->pop(tpd->vcc, tpd->skb); |