socsvn commit: r287378 - soc2015/pratiksinghal/cubie-head/sys/arm/allwinner

pratiksinghal at FreeBSD.org pratiksinghal at FreeBSD.org
Sat Jun 20 12:47:39 UTC 2015


Author: pratiksinghal
Date: Sat Jun 20 12:47:38 2015
New Revision: 287378
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=287378

Log:
  1) Cleaned up unused variables from softc
  2) Corrected the handling of length in prepare function
  3) Corrected the post i/o sync operations.

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 12:15:08 2015	(r287377)
+++ soc2015/pratiksinghal/cubie-head/sys/arm/allwinner/a10_mmc.c	Sat Jun 20 12:47:38 2015	(r287378)
@@ -85,19 +85,16 @@
 	int 			a10_use_dma ;
 
 	/* Fields required for DMA access */
-	uint32_t 		a10_dma_xfer_len ;
-	bus_dma_segment_t*	a10_dma_segs ;
-	int 			a10_dma_nsegs ;
-	bus_size_t		a10_dma_size ;
 	struct a10_mmc_cb  	a10_dma_cb_arg ;
 	bus_dmamap_t		a10_dma_map ;
 	bus_dma_tag_t 		a10_dma_tag ;
-	int 			a10_dma_ndesc;
 	void* 			a10_dma_desc ;
 	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_addrs[A10_DMA_NSEGS] ;
+	bus_size_t		a10_dma_buff_sizes[A10_DMA_NSEGS] ;  
+	uint32_t 		a10_dma_nsegs ; 
 
 };
 
@@ -230,7 +227,7 @@
 			sc->a10_use_dma = 0 ;
 		}
 	}
-	sc->a10_dma_buff_addrs[0] = 0;
+	sc->a10_dma_nsegs = 0 ; 
 #ifdef DEBUG
 	device_printf(sc->a10_dev, "DMA status %d\n", sc->a10_use_dma) ;
 #endif
@@ -248,15 +245,13 @@
 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) ;
+	uint32_t a10_dma_size = sizeof(struct a10_mmc_dma_desc)*(A10_MMC_NDESC);
 
 	uint32_t error ;
 	error = bus_dma_tag_create(bus_get_dma_tag(dev),1,
-				sc->a10_dma_size,BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR,
-				NULL,NULL,sc->a10_dma_size,
-				1,sc->a10_dma_size,0,
+				a10_dma_size,BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR,
+				NULL,NULL,a10_dma_size,
+				1,a10_dma_size,0,
 				NULL,NULL,&sc->a10_dma_tag) ;
 	if (error)
 		return (error) ;
@@ -264,7 +259,7 @@
 		if (error)
 			return (error) ;
 
-	error = bus_dmamap_load(sc->a10_dma_tag, sc->a10_dma_map,sc->a10_dma_desc,sc->a10_dma_size,a10_dma_cb, &sc->a10_dma_cb_arg,0) ;
+	error = bus_dmamap_load(sc->a10_dma_tag, sc->a10_dma_map,sc->a10_dma_desc,a10_dma_size,a10_dma_cb, &sc->a10_dma_cb_arg,0) ;
 
 	if ((error != 0)&&(error != EINPROGRESS))
 		return (error) ;
@@ -300,9 +295,9 @@
 	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_addrs,0) ;
+					&sc->a10_dma_nsegs,0) ;
 	if (error == EINPROGRESS) {
-		for( ; sc->a10_dma_buff_addrs[0] == 0 ; )  { }
+		for( ; sc->a10_dma_nsegs == 0 ; )  { }
 	}
 	else if (error != 0)  {
 		device_printf(sc->a10_dev, "DMA transaction failed due to insufficient resources\n") ;
@@ -310,11 +305,10 @@
 	}
 
 	while (rem > 0) {
-		if (desc == sc->a10_dma_ndesc)
+		if (desc == A10_MMC_NDESC)
 			break ;
-		len = min(sc->a10_dma_xfer_len, rem) ;
+		len = min(sc->a10_dma_buff_sizes[desc], rem) ;
 		dma[desc].buff_size = htole32(len) ;
-		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) ;
 
@@ -336,8 +330,8 @@
 		desc++ ;
 	}
 
-	if ((desc == sc->a10_dma_ndesc) && (rem > 0)) {
-		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) ;
+	if ((desc == A10_MMC_NDESC) && (rem > 0)) {
+		device_printf(sc->a10_dev, "Couldn't find enough descriptors for DMA transfer! desc = %d,A10_MMC_NDESC = %d\n",desc, A10_MMC_NDESC) ;
 		return EIO ;
 	}
 
@@ -374,7 +368,8 @@
 static int
 a10_mmc_can_do_dma(struct mmc_request* req)
 {
-	if ((req->cmd->data->len > A10_MMC_DMA_MAXLEN) || (req->cmd->data->len <= A10_MMC_DMA_MINLEN))
+	if (req->cmd->data->len > A10_MMC_DMA_MAXLEN) 
+	//if ((req->cmd->data->len > A10_MMC_DMA_MAXLEN) || (req->cmd->data->len <= A10_MMC_DMA_MINLEN))
 		return (0) ;
 	else
 		return (1) ;
@@ -398,10 +393,12 @@
 		printf("a10_mmc: Error in a10_dma_buff_callback function, code = %d\n", error) ;
 		return  ;
 	}
-	bus_addr_t* ptr = (bus_addr_t*) arg ;
-	int i = 0;
-	for(i=0; i<nsegs; i++)
-		ptr[i] = segs[i].ds_addr ; 
+	int i ; 
+	*(uint32_t*)arg = nsegs ; 
+	for(i=0; i<nsegs; i++) { 
+		sc->a10_dma_buff_addrs[i] = segs[i].ds_addr ; 
+		sc->a10_dma_buff_sizes[i] = segs[i].ds_len ; 
+	}
 }
 
 static int
@@ -465,7 +462,7 @@
 	sc->a10_resid = 0;
 	sc->a10_idst = 0 ;
 	sc->a10_intr_wait = 0;
-	sc->a10_dma_buff_addrs[0] = 0 ;
+	sc->a10_dma_nsegs = 0 ;
 	req->done(req);
 }
 
@@ -594,9 +591,9 @@
 
 	if ((idst & A10_MMC_IDMAC_COMPLETE) && ((sc->a10_intr & sc->a10_intr_wait) == sc->a10_intr_wait)) {
 		if (sc->a10_dma_ops == 0)
-			bus_dmamap_sync(sc->a10_dma_tag, sc->a10_dma_map, BUS_DMASYNC_POSTREAD) ;
+			bus_dmamap_sync(sc->a10_dma_buff_tag, sc->a10_dma_buff_map, BUS_DMASYNC_POSTREAD) ;
 		else if (sc->a10_dma_ops == 1)
-			bus_dmamap_sync(sc->a10_dma_tag, sc->a10_dma_map, BUS_DMASYNC_POSTWRITE) ;
+			bus_dmamap_sync(sc->a10_dma_buff_tag, sc->a10_dma_buff_map, BUS_DMASYNC_POSTWRITE) ;
 		else
 			device_printf(sc->a10_dev, "Invalid operations request!\n") ;
 		bus_dmamap_unload(sc->a10_dma_buff_tag, sc->a10_dma_buff_map) ;


More information about the svn-soc-all mailing list