Skip site navigation (1)Skip section navigation (2)
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>