/* Prototype: fasdmatype_t powertecscsi_dma_setup(host, SCpnt, direction, min_type) * Purpose : initialises DMA/PIO * Params : host - host * SCpnt - command * direction - DMA on to/off of card * min_type - minimum DMA support that we must have for this transfer * Returns : type of transfer to be performed */ static fasdmatype_t powertecscsi_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp, fasdmadir_t direction, fasdmatype_t min_type) { PowerTecScsi_Info *info = (PowerTecScsi_Info *)host->hostdata; int dmach = host->dma_channel; if (dmach != NO_DMA && (min_type == fasdma_real_all || SCp->this_residual >= 512)) { int buf; for (buf = 1; buf <= SCp->buffers_residual && buf < NR_SG; buf++) { info->dmasg[buf].address = __virt_to_bus( (unsigned long)SCp->buffer[buf].address); info->dmasg[buf].length = SCp->buffer[buf].length; powertecscsi_invalidate(SCp->buffer[buf].address, SCp->buffer[buf].length, direction); } info->dmasg[0].address = __virt_to_phys((unsigned long)SCp->ptr); info->dmasg[0].length = SCp->this_residual; powertecscsi_invalidate(SCp->ptr, SCp->this_residual, direction); disable_dma(dmach); set_dma_sg(dmach, info->dmasg, buf); set_dma_mode(dmach, direction == DMA_OUT ? DMA_MODE_WRITE : DMA_MODE_READ); enable_dma(dmach); return fasdma_real_all; } /* * If we're not doing DMA, * we'll do slow PIO */ return fasdma_pio; }
/* Prototype: fasdmatype_t eesoxscsi_dma_setup(host, SCpnt, direction, min_type) * Purpose : initialises DMA/PIO * Params : host - host * SCpnt - command * direction - DMA on to/off of card * min_type - minimum DMA support that we must have for this transfer * Returns : type of transfer to be performed */ static fasdmatype_t eesoxscsi_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp, fasdmadir_t direction, fasdmatype_t min_type) { EESOXScsi_Info *info = (EESOXScsi_Info *)host->hostdata; int dmach = host->dma_channel; if (dmach != NO_DMA && (min_type == fasdma_real_all || SCp->this_residual >= 512)) { int buf; for(buf = 1; buf <= SCp->buffers_residual && buf < NR_SG; buf++) { info->dmasg[buf].address = __virt_to_bus( (unsigned long)SCp->buffer[buf].address); info->dmasg[buf].length = SCp->buffer[buf].length; eesoxscsi_invalidate(SCp->buffer[buf].address, SCp->buffer[buf].length, direction); } info->dmasg[0].address = __virt_to_phys((unsigned long)SCp->ptr); info->dmasg[0].length = SCp->this_residual; eesoxscsi_invalidate(SCp->ptr, SCp->this_residual, direction); disable_dma(dmach); set_dma_sg(dmach, info->dmasg, buf); set_dma_mode(dmach, direction == DMA_OUT ? DMA_MODE_WRITE : DMA_MODE_READ); enable_dma(dmach); return fasdma_real_all; } /* * We don't do DMA, we only do slow PIO * * Some day, we will do Pseudo DMA */ return fasdma_pseudo; }