/* clean up after our dma is done */ static int sun3scsi_dma_finish(int write_flag) { unsigned short fifo; int ret = 0; sun3_dma_active = 0; dregs->csr &= ~CSR_DMA_ENABLE; fifo = dregs->fifo_count; if(write_flag) { if((fifo > 0) && (fifo < sun3_dma_orig_count)) fifo++; } last_residual = fifo; #ifdef SUN3_SCSI_DEBUG printk("scsi: residual %x total %x\n", fifo, sun3_dma_orig_count); #endif /* empty bytes from the fifo which didn't make it */ if((!write_flag) && (dregs->csr & CSR_LEFT)) { unsigned char *vaddr; #ifdef SUN3_SCSI_DEBUG printk("scsi: got left over bytes\n"); #endif vaddr = (unsigned char *)dvma_vmetov(sun3_dma_orig_addr); vaddr += (sun3_dma_orig_count - fifo); vaddr--; switch(dregs->csr & CSR_LEFT) { case CSR_LEFT_3: *vaddr = (dregs->bpack_lo & 0xff00) >> 8; vaddr--; case CSR_LEFT_2: *vaddr = (dregs->bpack_hi & 0x00ff); vaddr--; case CSR_LEFT_1: *vaddr = (dregs->bpack_hi & 0xff00) >> 8; break; } }
/* clean up after our dma is done */ static int sun3scsi_dma_finish(int write_flag) { unsigned short __maybe_unused count; unsigned short fifo; int ret = 0; sun3_dma_active = 0; #ifdef SUN3_SCSI_VME dregs->csr &= ~CSR_DMA_ENABLE; fifo = dregs->fifo_count; if (write_flag) { if ((fifo > 0) && (fifo < sun3_dma_orig_count)) fifo++; } last_residual = fifo; /* empty bytes from the fifo which didn't make it */ if ((!write_flag) && (dregs->csr & CSR_LEFT)) { unsigned char *vaddr; vaddr = (unsigned char *)dvma_vmetov(sun3_dma_orig_addr); vaddr += (sun3_dma_orig_count - fifo); vaddr--; switch (dregs->csr & CSR_LEFT) { case CSR_LEFT_3: *vaddr = (dregs->bpack_lo & 0xff00) >> 8; vaddr--; case CSR_LEFT_2: *vaddr = (dregs->bpack_hi & 0x00ff); vaddr--; case CSR_LEFT_1: *vaddr = (dregs->bpack_hi & 0xff00) >> 8; break; } }