Date: Thu, 11 Jun 2015 00:24:32 GMT From: pratiksinghal@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r286930 - soc2015/pratiksinghal/cubie-head/sys/arm/allwinner Message-ID: <201506110024.t5B0OWpj075879@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201506110024.t5B0OWpj075879>