socsvn commit: r286930 - soc2015/pratiksinghal/cubie-head/sys/arm/allwinner
pratiksinghal at FreeBSD.org
pratiksinghal at FreeBSD.org
Thu Jun 11 00:24:32 UTC 2015
Author: pratiksinghal
Date: Thu Jun 11 00:24:31 2015
New Revision: 286930
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=286930
Log:
Corrected the handling of interrupts
Modified:
soc2015/pratiksinghal/cubie-head/sys/arm/allwinner/a10_mmc.c
Modified: soc2015/pratiksinghal/cubie-head/sys/arm/allwinner/a10_mmc.c
==============================================================================
--- soc2015/pratiksinghal/cubie-head/sys/arm/allwinner/a10_mmc.c Wed Jun 10 22:39:10 2015 (r286929)
+++ soc2015/pratiksinghal/cubie-head/sys/arm/allwinner/a10_mmc.c Thu Jun 11 00:24:31 2015 (r286930)
@@ -228,6 +228,7 @@
static int
a10_mmc_setup_dma(struct a10_mmc_softc* sc, device_t dev)
{
+ sc->a10_dma_xfer_len = 0x2000 ;
sc->a10_dma_ndesc = A10_MMC_NDESC ;
sc->a10_dma_size = sizeof(struct a10_mmc_dma_desc)*(sc->a10_dma_ndesc) ;
@@ -260,21 +261,16 @@
static int
a10_mmc_prepare_dma(struct a10_mmc_softc* sc)
{
- device_printf(sc->a10_dev, "In the start of prepare dma\n") ;
struct a10_mmc_dma_desc* dma = sc->a10_dma_desc ;
struct mmc_command* cmd = sc->a10_req->cmd ;
- device_printf(sc->a10_dev, "After the cmd part\n") ;
int read = (sc->a10_req->cmd->data->flags & MMC_DATA_WRITE) ? 0 : 1 ;
- device_printf(sc->a10_dev, "After the read part\n") ;
bus_addr_t desc_paddr = (sc->a10_dma_cb_arg).addr ;
- device_printf(sc->a10_dev, "After the block before the for loop\n") ;
bus_size_t off = 0 ;
int desc, rem,seg ;
- uint32_t val ;
+ uint32_t val;
desc = 0 ;
- device_printf(sc->a10_dev, "Before the starting of for loop\n") ;
/* Pick a segment and program all the descriptors in the segment. */
for(seg = 0; seg < sc->a10_dma_cb_arg.nsegs ; seg++)
{
@@ -310,13 +306,11 @@
}
}
- device_printf(sc->a10_dev, "After the for loop in a10_prepare_dma\n") ;
if(desc == sc->a10_dma_ndesc) {
- device_printf(sc->a10_dev, "Couldn't find enough descriptors for DMA transfer") ;
+ device_printf(sc->a10_dev, "Couldn't find enough descriptors for DMA transfer! desc = %d,sc->a10_dma_ndesc = %d\n",desc, sc->a10_dma_ndesc) ;
return EIO ;
}
- device_printf(sc->a10_dev, "After the desc check\n") ;
bus_dmamap_sync(sc->a10_dma_tag, sc->a10_dma_map, BUS_DMASYNC_PREWRITE) ;
val = A10_MMC_READ_4(sc, A10_MMC_GCTRL) ;
@@ -341,7 +335,6 @@
A10_MMC_WRITE_4(sc, A10_MMC_DLBA,desc_paddr) ;
A10_MMC_WRITE_4(sc, A10_MMC_FTRGL,A10_MMC_DMA_FTRGLEVEL_A20) ;
- device_printf(sc->a10_dev, "Done preparing for DMA\n") ;
return (0) ;
}
@@ -526,38 +519,6 @@
return;
}
- if(sc->a10_use_dma == 1) {
- if(idst) {
- uint32_t comp = 0 ;
- sc->a10_idst = idst ;
-
- if(idst & A10_MMC_IDMAC_ERROR)
- sc->a10_req->cmd->error = EIO ;
- if(!(idst & A10_MMC_IDMAC_COMPLETE))
- sc->a10_req->cmd->error = ETIMEDOUT ;
- else
- comp = 1 ;
-
- data = sc->a10_req->cmd->data ;
-
- if(data->flags&MMC_DATA_WRITE)
- bus_dmamap_sync(sc->a10_dma_tag,sc->a10_dma_map,BUS_DMASYNC_POSTWRITE) ;
- else
- bus_dmamap_sync(sc->a10_dma_tag,sc->a10_dma_map, BUS_DMASYNC_POSTREAD) ;
- if(comp == 0)
- a10_mmc_req_done(sc) ;
- else
- a10_mmc_req_ok(sc) ;
- }
- else
- a10_mmc_req_done(sc) ;
-
- A10_MMC_WRITE_4(sc, A10_MMC_IDST, idst) ;
- A10_MMC_WRITE_4(sc, A10_MMC_RINTR, rint) ;
- A10_MMC_UNLOCK(sc) ;
- return ;
- }
-
if (rint & A10_MMC_INT_ERR_BIT) {
device_printf(sc->a10_dev, "error rint: 0x%08X\n", rint);
if (rint & A10_MMC_RESP_TIMEOUT)
@@ -570,13 +531,50 @@
return;
}
+ /* Do we have to return from here or continue afterwards ? */
+ /* What is the DMA only, what is PIO only and what is common part ? */
+ if(sc->a10_use_dma == 1) {
+ uint32_t comp = 0 ;
+ device_printf(sc->a10_dev, "IDST = %d\n", idst) ;
+ sc->a10_idst = idst ;
+ if(idst & A10_MMC_IDMAC_ERROR) {
+ device_printf(sc->a10_dev, "I/O error with DMA\n") ;
+ sc->a10_req->cmd->error = EIO ;
+ }
+ if(!(idst & A10_MMC_IDMAC_COMPLETE)) {
+ device_printf(sc->a10_dev, "Timeout error with DMA\n") ;
+ sc->a10_req->cmd->error = ETIMEDOUT ;
+ }
+ else
+ comp = 1 ;
+
+ if(sc->a10_req->cmd->data != NULL) {
+ data = sc->a10_req->cmd->data ;
+ if(data->flags&MMC_DATA_WRITE)
+ bus_dmamap_sync(sc->a10_dma_tag,sc->a10_dma_map,BUS_DMASYNC_POSTWRITE) ;
+ else
+ bus_dmamap_sync(sc->a10_dma_tag,sc->a10_dma_map, BUS_DMASYNC_POSTREAD) ;
+ }
+
+ if(comp == 0)
+ a10_mmc_req_done(sc) ;
+ else {
+ device_printf(sc->a10_dev, "DMA transfer working!\n") ;
+ a10_mmc_req_ok(sc) ;
+ }
+
+ }
+ A10_MMC_WRITE_4(sc, A10_MMC_IDST, idst) ;
+
sc->a10_intr |= rint;
- data = sc->a10_req->cmd->data;
- if (data != NULL && (rint & (A10_MMC_DATA_OVER |
- A10_MMC_RX_DATA_REQ | A10_MMC_TX_DATA_REQ)) != 0)
- a10_mmc_pio_transfer(sc, data);
- if ((sc->a10_intr & sc->a10_intr_wait) == sc->a10_intr_wait)
- a10_mmc_req_ok(sc);
+ if(sc->a10_use_dma == 0) {
+ data = sc->a10_req->cmd->data;
+ if (data != NULL && (rint & (A10_MMC_DATA_OVER |
+ A10_MMC_RX_DATA_REQ | A10_MMC_TX_DATA_REQ)) != 0)
+ a10_mmc_pio_transfer(sc, data);
+ if ((sc->a10_intr & sc->a10_intr_wait) == sc->a10_intr_wait)
+ a10_mmc_req_ok(sc);
+ }
A10_MMC_WRITE_4(sc, A10_MMC_RINTR, rint);
A10_MMC_UNLOCK(sc);
@@ -591,13 +589,13 @@
uint32_t cmdreg;
sc = device_get_softc(bus);
- device_printf(sc->a10_dev, "a10_req = %p\n", sc->a10_req) ;
A10_MMC_LOCK(sc);
if (sc->a10_req) {
A10_MMC_UNLOCK(sc);
return (EBUSY);
}
sc->a10_req = req;
+ device_printf(sc->a10_dev, "a10_req = %p\n", sc->a10_req) ;
cmd = req->cmd;
cmdreg = A10_MMC_START;
if (cmd->opcode == MMC_GO_IDLE_STATE)
@@ -626,11 +624,16 @@
blksz = min(cmd->data->len, MMC_SECTOR_SIZE);
A10_MMC_WRITE_4(sc, A10_MMC_BLKSZ, blksz);
A10_MMC_WRITE_4(sc, A10_MMC_BCNTR, cmd->data->len);
- if(sc->a10_use_dma == 1)
- a10_mmc_prepare_dma(sc) ;
}
A10_MMC_WRITE_4(sc, A10_MMC_CARG, cmd->arg);
+
+ if(cmd->data != NULL ) {
+ if(sc->a10_use_dma == 1) {
+ a10_mmc_prepare_dma(sc) ;
+ }
+ }
+
A10_MMC_WRITE_4(sc, A10_MMC_CMDR, cmdreg | cmd->opcode);
callout_reset(&sc->a10_timeoutc, sc->a10_timeout * hz,
a10_mmc_timeout, sc);
More information about the svn-soc-all
mailing list