void scsi_amic_start(int unit, boolean_t isread) { dma_softc_t *dmap = &scsi_amic_softc[unit]; if (isread) *dmap->ctrl = MASK8(PDM_SCSI_DMA_CTRL_RUN); else *dmap->ctrl = MASK8(PDM_SCSI_DMA_CTRL_DIR)|MASK8(PDM_SCSI_DMA_CTRL_RUN); eieio(); return; }
void inline ws_mask(char *buf, int len, unsigned int mask) { char *p = buf; char *end = buf + len; /* xor first bits, until aligned */ for (; p < end && (((unsigned long)p) % sizeof(unsigned long *)); p++, mask = ROTATE32(mask)) *p ^= MASK8(mask); /* xor the big chunk, which is aligned */ for (; p < end - (sizeof(int) - 1); p += sizeof(int)) *((int *)p) ^= mask; /* the last chunk may not be processed */ for (; p < end; p++, mask >>= 8) *p ^= MASK8(mask); //ws_print_masked(buf, len); }
void scsi_amic_end(int unit, boolean_t isread) { dma_softc_t *dmap = &scsi_amic_softc[unit]; /* * Flush out the DMA, and kill it. */ eieio(); if ((*dmap->ctrl & MASK8(PDM_SCSI_DMA_CTRL_DIR)) == 0) { *dmap->ctrl |= MASK8(PDM_SCSI_DMA_CTRL_FLUSH); do { eieio(); } while (*dmap->ctrl & MASK8(PDM_SCSI_DMA_CTRL_FLUSH)); } *dmap->ctrl &= ~MASK8(PDM_SCSI_DMA_CTRL_RUN); eieio(); while (*dmap->ctrl & MASK8(PDM_SCSI_DMA_CTRL_RUN)) eieio(); }
void scsi_amic_setup(int unit, vm_offset_t addr, vm_size_t data_in_count, boolean_t isread) { dma_softc_t *dmap = &scsi_amic_softc[unit]; *dmap->ctrl |= MASK8(PDM_SCSI_DMA_CTRL_RESET); eieio(); while (*dmap->ctrl & MASK8(PDM_SCSI_DMA_CTRL_RUN)) eieio(); if (addr & 7) panic("SCSI DMA - non-aligned address"); dmap->base[0] = (unsigned char)((addr >> 24) & 0xff); dmap->base[1] = (unsigned char)((addr >> 16) & 0xff); dmap->base[2] = (unsigned char)((addr >> 8) & 0xff); dmap->base[3] = (unsigned char)((addr) & 0xff); eieio(); return; }