455 dma[j-2] |= MID_DMA_END;
456 j = j >> 1;
457 dma_wr = eni_in(MID_DMA_WR_RX);
458 dma_rd = eni_in(MID_DMA_RD_RX);
459
460
461
462
463 if (!NEPMOK(dma_wr,j+j+1,dma_rd,NR_DMA_RX)) {
464 printk(KERN_WARNING DEV_LABEL "(itf %d): RX DMA full\n",
465 vcc->dev->number);
466 goto trouble;
467 }
468 for (i = 0; i < j; i++) {
469 writel(dma[i*2],eni_dev->rx_dma+dma_wr*8);
470 writel(dma[i*2+1],eni_dev->rx_dma+dma_wr*8+4);
471 dma_wr = (dma_wr+1) & (NR_DMA_RX-1);
472 }
473 if (skb) {
474 ENI_PRV_POS(skb) = eni_vcc->descr+size+1;
475 skb_queue_tail(&eni_dev->rx_queue,skb);
476 eni_vcc->last = skb;
477rx_enqueued++;
478 }
479 eni_vcc->descr = here;
480 eni_out(dma_wr,MID_DMA_WR_RX);
481 return 0;
482
483trouble:
484 if (paddr)
485 pci_unmap_single(eni_dev->pci_dev,paddr,skb->len,
486 PCI_DMA_FROMDEVICE);
487 if (skb) dev_kfree_skb_irq(skb);
488 return -1;
489}
490
491
492static void discard(struct atm_vcc *vcc,unsigned long size)
493{
494 struct eni_vcc *eni_vcc;
495