Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Oct 2006 00:55:07 GMT
From:      Warner Losh <imp@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 107284 for review
Message-ID:  <200610050055.k950t7HF083027@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=107284

Change 107284 by imp@imp_lighthouse on 2006/10/05 00:54:24

	Multi block read support, ifdef'd.  It doesn't quite work right
	for reasons unknown.  Committed so I don't lose it.

Affected files ...

.. //depot/projects/arm/src/sys/dev/mmc/mmcsd.c#10 edit

Differences ...

==== //depot/projects/arm/src/sys/dev/mmc/mmcsd.c#10 (text+ko) ====

@@ -52,6 +52,8 @@
 	struct bio_queue_head bio_queue;
 };
 
+#define	MULTI_BLOCK_READ_BROKEN
+
 /* bus entry points */
 static int mmcsd_probe(device_t dev);
 static int mmcsd_attach(device_t dev);
@@ -143,12 +145,11 @@
 	struct mmcsd_softc *sc = (struct mmcsd_softc*)arg;
 	struct bio *bp;
 	int sz;
-	daddr_t end;
+	daddr_t block, end;
 	struct mmc_command cmd;
 	struct mmc_command stop;
 	struct mmc_request req;
 	struct mmc_data data;
-	uint32_t block;
 	device_t dev;
 
 	dev = sc->dev;
@@ -166,32 +167,53 @@
 		sz = sc->disk->d_sectorsize;
 		end = bp->bio_pblkno + (bp->bio_bcount / sz);
 		// XXX should use read/write_mulit
-		for (block = bp->bio_pblkno; block < end; block++) {
+		for (block = bp->bio_pblkno; block < end;) {
 			char *vaddr = bp->bio_data + (block - bp->bio_pblkno) * sz;
 			memset(&req, 0, sizeof(req));
 			memset(&cmd, 0, sizeof(cmd));
 			memset(&stop, 0, sizeof(stop));
 			req.cmd = &cmd;
 			cmd.data = &data;
-//			req.stop = &stop;
-			if (bp->bio_cmd == BIO_READ)
+			if (bp->bio_cmd == BIO_READ) {
+#ifdef MULTI_BLOCK_READ
+				if (end - block > 1)
+					cmd.opcode = MMC_READ_MULTIPLE_BLOCK;
+				else
+					cmd.opcode = MMC_READ_SINGLE_BLOCK;
+#else
 				cmd.opcode = MMC_READ_SINGLE_BLOCK;
-			else
+#endif
+			} else
 				cmd.opcode = MMC_WRITE_BLOCK;
 			cmd.arg = block << 9;
 			cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
 			// data.timeout_ns = ;
 			// data.timeout_clks = ;
-			data.len = 512;
 			data.data = vaddr;
 			data.mrq = &req;
-			if (bp->bio_cmd == BIO_READ)
+			if (bp->bio_cmd == BIO_READ) {
 				data.flags = MMC_DATA_READ;
-			else
+#ifdef MULTI_BLOCK_READ
+				data.len = bp->bio_bcount;
+				if (end - block > 1) {
+					req.stop = &stop;
+					data.flags |= MMC_DATA_MULTI;
+				}
+				printf("Len %d  %lld-%lld flags %#x sz %d\n",
+				    data.len, block, end, data.flags, sz);
+				block = end;
+#else
+				data.len = sz;
+				block++;
+#endif
+			} else {
 				data.flags = MMC_DATA_WRITE;
-//			stop.opcode = MMC_STOP_TRANSMISSION;
-//			stop.arg = 0;
-//			stop.flags = MMC_RSP_R1B | MMC_CMD_AC;
+				data.len = sz;
+				block++;
+			}
+			stop.opcode = MMC_STOP_TRANSMISSION;
+			stop.arg = 0;
+			stop.flags = MMC_RSP_R1B | MMC_CMD_AC;
 			MMCBUS_WAIT_FOR_REQUEST(device_get_parent(dev), dev,
 			    &req);
 			// XXX error handling



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200610050055.k950t7HF083027>