Changeset View
Changeset View
Standalone View
Standalone View
head/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
Show First 20 Lines • Show All 533 Lines • ▼ Show 20 Lines | bcm_sdhci_dma_intr(int ch, void *arg) | ||||
bus_dmamap_unload(sc->sc_dma_tag, sc->sc_dma_map); | bus_dmamap_unload(sc->sc_dma_tag, sc->sc_dma_map); | ||||
sc->dmamap_seg_count = 0; | sc->dmamap_seg_count = 0; | ||||
sc->dmamap_seg_index = 0; | sc->dmamap_seg_index = 0; | ||||
left = min(BCM_SDHCI_BUFFER_SIZE, | left = min(BCM_SDHCI_BUFFER_SIZE, | ||||
slot->curcmd->data->len - slot->offset); | slot->curcmd->data->len - slot->offset); | ||||
/* | |||||
* If there is less than buffer size outstanding, we would not handle | |||||
* it anymore using DMA if bcm_sdhci_will_handle_transfer() were asked. | |||||
* Re-enable interrupts and return and let the SDHCI state machine | |||||
* finish the job. | |||||
*/ | |||||
if (left < BCM_SDHCI_BUFFER_SIZE) { | |||||
/* Re-enable data interrupts. */ | |||||
slot->intmask |= SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL | | |||||
SDHCI_INT_DATA_END; | |||||
bcm_sdhci_write_4(slot->bus, slot, SDHCI_SIGNAL_ENABLE, | |||||
slot->intmask); | |||||
mtx_unlock(&slot->mtx); | |||||
return; | |||||
} | |||||
/* DATA END? */ | /* DATA END? */ | ||||
reg = bcm_sdhci_read_4(slot->bus, slot, SDHCI_INT_STATUS); | reg = bcm_sdhci_read_4(slot->bus, slot, SDHCI_INT_STATUS); | ||||
if (reg & SDHCI_INT_DATA_END) { | if (reg & SDHCI_INT_DATA_END) { | ||||
/* ACK for all outstanding interrupts */ | /* ACK for all outstanding interrupts */ | ||||
bcm_sdhci_write_4(slot->bus, slot, SDHCI_INT_STATUS, reg); | bcm_sdhci_write_4(slot->bus, slot, SDHCI_INT_STATUS, reg); | ||||
/* enable INT */ | /* enable INT */ | ||||
▲ Show 20 Lines • Show All 184 Lines • Show Last 20 Lines |