static int dma_setup(struct scsi_cmnd *cmd, int datainp) { struct ip22_hostdata *hdata = host_to_hostdata(cmd->device->host); struct hpc3_scsiregs *hregs = (struct hpc3_scsiregs *) cmd->device->host->base; pr_debug("dma_setup: datainp<%d> hcp<%p> ", datainp, hdata->cpu); hdata->wh.dma_dir = datainp; /* * wd33c93 shouldn't pass us bogus dma_setups, but it does:-( The * other wd33c93 drivers deal with it the same way (which isn't that * obvious). IMHO a better fix would be, not to do these dma setups * in the first place. */ if (cmd->SCp.ptr == NULL || cmd->SCp.this_residual == 0) return 1; fill_hpc_entries(hdata, cmd, datainp); pr_debug(" HPCGO\n"); /* Start up the HPC. */ hregs->ndptr = hdata->dma; if (datainp) hregs->ctrl = HPC3_SCTRL_ACTIVE; else hregs->ctrl = HPC3_SCTRL_ACTIVE | HPC3_SCTRL_DIR; return 0; }
static int dma_setup(Scsi_Cmnd *cmd, int datainp) { struct WD33C93_hostdata *hdata = (struct WD33C93_hostdata *)cmd->host->hostdata; struct hpc3_scsiregs *hregs = (struct hpc3_scsiregs *) cmd->host->base; struct hpc_chunk *hcp = (struct hpc_chunk *) hdata->dma_bounce_buffer; #ifdef DEBUG_DMA printk("dma_setup: datainp<%d> hcp<%p> ", datainp, hcp); #endif hdata->dma_dir = datainp; /* * wd33c93 shouldn't pass us bogus dma_setups, but * it does:-( The other wd33c93 drivers deal with * it the same way (which isn't that obvious). * IMHO a better fix would be, not to do these * dma setups in the first place */ if (cmd->SCp.ptr == NULL) return 1; fill_hpc_entries (&hcp, cmd->SCp.ptr,cmd->SCp.this_residual); /* To make sure, if we trip an HPC bug, that we transfer * every single byte, we tag on an extra zero length dma * descriptor at the end of the chain. */ hcp->desc.pbuf = 0; hcp->desc.cntinfo = (HPCDMA_EOX); #ifdef DEBUG_DMA printk(" HPCGO\n"); #endif /* Start up the HPC. */ hregs->ndptr = PHYSADDR(hdata->dma_bounce_buffer); if(datainp) { dma_cache_inv((unsigned long) cmd->SCp.ptr, cmd->SCp.this_residual); hregs->ctrl = (HPC3_SCTRL_ACTIVE); } else { dma_cache_wback_inv((unsigned long) cmd->SCp.ptr, cmd->SCp.this_residual); hregs->ctrl = (HPC3_SCTRL_ACTIVE | HPC3_SCTRL_DIR); } return 0; }