Date: Sat, 20 Jun 2015 12:15:09 GMT From: pratiksinghal@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r287377 - soc2015/pratiksinghal/cubie-head/sys/arm/allwinner Message-ID: <201506201215.t5KCF9OG021731@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: pratiksinghal Date: Sat Jun 20 12:15:08 2015 New Revision: 287377 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=287377 Log: Corrected the way segment address is passed in prepare function 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 Sat Jun 20 11:20:25 2015 (r287376) +++ soc2015/pratiksinghal/cubie-head/sys/arm/allwinner/a10_mmc.c Sat Jun 20 12:15:08 2015 (r287377) @@ -97,7 +97,7 @@ int a10_dma_ops ; bus_dma_tag_t a10_dma_buff_tag ; bus_dmamap_t a10_dma_buff_map ; - bus_addr_t a10_dma_buff_addr ; + bus_addr_t a10_dma_buff_addrs[A10_DMA_NSEGS] ; }; @@ -230,7 +230,7 @@ sc->a10_use_dma = 0 ; } } - sc->a10_dma_buff_addr = 0; + sc->a10_dma_buff_addrs[0] = 0; #ifdef DEBUG device_printf(sc->a10_dev, "DMA status %d\n", sc->a10_use_dma) ; #endif @@ -300,22 +300,22 @@ rem = min(len,cmd->data->len) ; uint32_t error = bus_dmamap_load(sc->a10_dma_buff_tag, sc->a10_dma_buff_map, cmd->data->data,rem,a10_dma_buff_cb, - &sc->a10_dma_buff_addr,0) ; + sc->a10_dma_buff_addrs,0) ; if (error == EINPROGRESS) { - for( ; sc->a10_dma_buff_addr == 0 ; ) { } + for( ; sc->a10_dma_buff_addrs[0] == 0 ; ) { } } else if (error != 0) { device_printf(sc->a10_dev, "DMA transaction failed due to insufficient resources\n") ; return EIO ; } - bus_addr_t paddr = sc->a10_dma_buff_addr ; while (rem > 0) { if (desc == sc->a10_dma_ndesc) break ; len = min(sc->a10_dma_xfer_len, rem) ; dma[desc].buff_size = htole32(len) ; - dma[desc].buff_addr = htole32(paddr + off) ; + device_printf(sc->a10_dev, "The address is %lu\n", sc->a10_dma_buff_addrs[desc]) ; + dma[desc].buff_addr = htole32(sc->a10_dma_buff_addrs[desc]) ; dma[desc].config = htole32(A10_MMC_DMA_CONFIG_CH|A10_MMC_DMA_CONFIG_OWN) ; cmd->data->len -= len ; @@ -374,11 +374,10 @@ static int a10_mmc_can_do_dma(struct mmc_request* req) { - return (1) ; - //if ((req->cmd->data->len > A10_MMC_DMA_MAXLEN) || (req->cmd->data->len <= A10_MMC_DMA_MINLEN)) - // return (0) ; - //else - // return (1) ; + if ((req->cmd->data->len > A10_MMC_DMA_MAXLEN) || (req->cmd->data->len <= A10_MMC_DMA_MINLEN)) + return (0) ; + else + return (1) ; } static void a10_dma_cb(void* arg, bus_dma_segment_t* segs, int nsegs, int error) @@ -399,7 +398,10 @@ printf("a10_mmc: Error in a10_dma_buff_callback function, code = %d\n", error) ; return ; } - *(bus_addr_t*)arg = segs[0].ds_addr ; + bus_addr_t* ptr = (bus_addr_t*) arg ; + int i = 0; + for(i=0; i<nsegs; i++) + ptr[i] = segs[i].ds_addr ; } static int @@ -463,7 +465,7 @@ sc->a10_resid = 0; sc->a10_idst = 0 ; sc->a10_intr_wait = 0; - sc->a10_dma_buff_addr = 0 ; + sc->a10_dma_buff_addrs[0] = 0 ; req->done(req); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201506201215.t5KCF9OG021731>