/* * ppb_MS_loop() * * Execute a microseq loop * */ int ppb_MS_loop(device_t bus, device_t dev, struct ppb_microseq *prolog, struct ppb_microseq *body, struct ppb_microseq *epilog, int iter, int *ret) { struct ppb_microseq loop_microseq[] = { MS_CALL(0), /* execute prolog */ MS_SET(MS_UNKNOWN), /* set size of transfer */ /* loop: */ MS_CALL(0), /* execute body */ MS_DBRA(-1 /* loop: */), MS_CALL(0), /* execute epilog */ MS_RET(0) }; /* initialize the structure */ loop_microseq[0].arg[0].p = (void *)prolog; loop_microseq[1].arg[0].i = iter; loop_microseq[2].arg[0].p = (void *)body; loop_microseq[4].arg[0].p = (void *)epilog; /* execute the loop */ return (ppb_MS_microseq(bus, dev, loop_microseq, ret)); }
static char vpoio_select(struct vpoio_data *vpo, int initiator, int target) { device_t ppbus = device_get_parent(vpo->vpo_dev); int ret; struct ppb_microseq select_microseq[] = { /* parameter list */ #define SELECT_TARGET MS_PARAM(0, 1, MS_TYP_INT) #define SELECT_INITIATOR MS_PARAM(3, 1, MS_TYP_INT) /* send the select command to the drive */ MS_DASS(MS_UNKNOWN), MS_CASS(H_nAUTO | H_nSELIN | H_INIT | H_STROBE), MS_CASS( H_AUTO | H_nSELIN | H_INIT | H_STROBE), MS_DASS(MS_UNKNOWN), MS_CASS( H_AUTO | H_nSELIN | H_nINIT | H_STROBE), /* now, wait until the drive is ready */ MS_SET(VP0_SELTMO), /* loop: */ MS_BRSET(H_ACK, 2 /* ready */), MS_DBRA(-2 /* loop */), /* error: */ MS_RET(1), /* ready: */ MS_RET(0) }; /* initialize the select microsequence */ ppb_MS_init_msq(select_microseq, 2, SELECT_TARGET, 1 << target, SELECT_INITIATOR, 1 << initiator); ppb_MS_microseq(ppbus, vpo->vpo_dev, select_microseq, &ret); if (ret) return (VP0_ESELECT_TIMEOUT); return (0); }
MS_DBRA(-7 /* loop */), \ MS_CASS(H_AUTO | H_nSELIN | H_INIT | H_STROBE), \ MS_RET(0) \ } /* * This is the sub-microseqence for MS_GET in PS2 mode */ static struct ppb_microseq ps2_inbyte_submicroseq[] = { MS_CASS(PCD | H_AUTO | H_SELIN | H_INIT | H_nSTROBE), /* loop: */ MS_RFETCH_P(1, MS_REG_DTR, MS_FETCH_ALL), MS_CASS(PCD | H_nAUTO | H_SELIN | H_INIT | H_nSTROBE), MS_CASS(PCD | H_AUTO | H_SELIN | H_INIT | H_nSTROBE), MS_DBRA(-4 /* loop */), MS_CASS(H_AUTO | H_nSELIN | H_INIT | H_STROBE), MS_RET(0) }; /* * This is the sub-microsequence for MS_PUT in both NIBBLE and PS2 modes */ static struct ppb_microseq spp_outbyte_submicroseq[] = { /* loop: */ MS_RASSERT_P(1, MS_REG_DTR), MS_CASS(H_nAUTO | H_nSELIN | H_INIT | H_STROBE), MS_CASS( H_AUTO | H_nSELIN | H_INIT | H_STROBE), MS_DELAY(VP0_PULSE),