void spi_waitbits(sdioh_info_t *sd, bool yield) { struct sdos_info *sdos; sdos = (struct sdos_info *)sd->sdos_info; #ifndef BCMSDYIELD ASSERT(!yield); #endif sd_trace(("%s: yield %d canblock %d\n", __FUNCTION__, yield, BLOCKABLE())); /* Clear the "interrupt happened" flag and last intrstatus */ sd->got_hcint = FALSE; #ifdef BCMSDYIELD if (yield && BLOCKABLE()) { /* Wait for the indication, the interrupt will be masked when the ISR fires. */ wait_event_interruptible(sdos->intr_wait_queue, (sd->got_hcint)); } else #endif /* BCMSDYIELD */ { spi_spinbits(sd); } }
uint16 sdstd_waitbits(sdioh_info_t *sd, uint16 norm, uint16 err, bool yield) { struct sdos_info *sdos; sdos = (struct sdos_info *)sd->sdos_info; #ifndef BCMSDYIELD ASSERT(!yield); #endif sd_trace(("%s: int 0x%02x err 0x%02x yield %d canblock %d\n", __FUNCTION__, norm, err, yield, BLOCKABLE())); /* Clear the "interrupt happened" flag and last intrstatus */ sd->got_hcint = FALSE; sd->last_intrstatus = 0; #ifdef BCMSDYIELD if (yield && BLOCKABLE()) { /* Enable interrupts, wait for the indication, then disable */ sdstd_intrs_on(sd, norm, err); wait_event_interruptible(sdos->intr_wait_queue, (sd->got_hcint)); sdstd_intrs_off(sd, norm, err); } else #endif /* BCMSDYIELD */ { sdstd_spinbits(sd, norm, err); } sd_trace(("%s: last_intrstatus 0x%04x\n", __FUNCTION__, sd->last_intrstatus)); return sd->last_intrstatus; }
/* Returns 0 for success, -1 for interrupted, -2 for timeout */ int sdstd_waitbits(sdioh_info_t *sd, uint16 norm, uint16 err, bool yield, uint16 *bits) { struct sdos_info *sdos; int rc = 0; sdos = (struct sdos_info *)sd->sdos_info; #ifndef BCMSDYIELD ASSERT(!yield); #endif sd_trace(("%s: int 0x%02x err 0x%02x yield %d canblock %d\n", __FUNCTION__, norm, err, yield, BLOCKABLE())); /* Clear the "interrupt happened" flag and last intrstatus */ sd->got_hcint = FALSE; sd->last_intrstatus = 0; #ifdef BCMSDYIELD if (yield && BLOCKABLE()) { /* Enable interrupts, wait for the indication, then disable */ sdstd_intrs_on(sd, norm, err); rc = wait_event_interruptible_timeout(sdos->intr_wait_queue, (sd->got_hcint), SDSTD_WAITBITS_TIMEOUT); if (rc < 0) rc = -1; /* interrupted */ else if (rc == 0) rc = -2; /* timeout */ else rc = 0; /* success */ sdstd_intrs_off(sd, norm, err); } else #endif /* BCMSDYIELD */ { sdstd_spinbits(sd, norm, err); } sd_trace(("%s: last_intrstatus 0x%04x\n", __FUNCTION__, sd->last_intrstatus)); *bits = sd->last_intrstatus; return rc; }