Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Apr 2012 12:19:44 GMT
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 209412 for review
Message-ID:  <201204111219.q3BCJi24052343@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@209412?ac=10

Change 209412 by rwatson@rwatson_svr_ctsrd_mipsbuild on 2012/04/11 12:19:09

	Refinements to the Altera SD Card IP core device driver:
	
	1. Make ignoring CRC errors on read configurable, although currently
	   only with the debugger, not with a sysctl.  Spurious CRC errors
	   still seem to be generated with moderate frequency, so we
	   continue to ignore them by default.
	
	2. Use 16-bit fetch and store operations when reading and writing
	   from larger buffers, especially the RXTX buffer, on the IP core.
	   Although there appears to be VHDL to support 8-bit fetches and
	   stores over Avalon, they don't appear to work.  This introduces
	   an alignment requirement on buffers passed down the storage
	   stack, due to bus_space assuming that alignment of the I/O target
	   implies similar alignment to the I/O source.  Assertion added to
	   check on each I/O that this is true -- thus far it always has
	   been with UFS.
	
	With these changes, read-write mounts of UFS on the Terasic DE-4 SD
	Card slot appear reliable from FreeBSD/BERI.

Affected files ...

.. //depot/projects/ctsrd/beribsd/src/sys/dev/altera/sdcard/altera_sdcard_io.c#11 edit

Differences ...

==== //depot/projects/ctsrd/beribsd/src/sys/dev/altera/sdcard/altera_sdcard_io.c#11 (text+ko) ====

@@ -53,6 +53,8 @@
 
 #include <dev/altera/sdcard/altera_sdcard.h>
 
+int altera_sdcard_ignore_crc_errors = 1;
+
 /*
  * Low-level I/O routines for the Altera SD Card University IP Core driver.
  *
@@ -146,8 +148,10 @@
 	 * XXXRW: Treating this as an array of bytes, so no byte swapping --
 	 * is that a safe assumption?
 	 */
-	bus_read_region_1(sc->as_res, ALTERA_SDCARD_OFF_CSD,
-	    sc->as_csd.csd_data, sizeof(sc->as_csd));
+	KASSERT(((uintptr_t)&sc->as_csd.csd_data) % 2 == 0,
+	    ("%s: CSD buffer unaligned", __func__));
+	bus_read_region_2(sc->as_res, ALTERA_SDCARD_OFF_CSD,
+	    (uint16_t *)sc->as_csd.csd_data, sizeof(sc->as_csd) / 2);
 
 	/*
 	 * Interpret the loaded CSD, extracting certain fields and copying
@@ -214,11 +218,13 @@
     size_t len)
 {
 
-	KASSERT(len <= ALTERA_SDCARD_SECTORSIZE,
+	KASSERT((uintptr_t)data % 2 == 0,
+	    ("%s: unaligned data %p", __func__, data));
+	KASSERT((len <= ALTERA_SDCARD_SECTORSIZE) && (len % 2 == 0),
 	    ("%s: invalid length %ju", __func__, len));
 
-	bus_read_region_1(sc->as_res, ALTERA_SDCARD_OFF_RXTX_BUFFER, data,
-	    len);
+	bus_read_region_2(sc->as_res, ALTERA_SDCARD_OFF_RXTX_BUFFER,
+	    (uint16_t *)data, len / 2);
 }
 
 static void
@@ -226,11 +232,13 @@
     size_t len)
 {
 
-	KASSERT(len <= ALTERA_SDCARD_SECTORSIZE,
+	KASSERT((uintptr_t)data % 2 == 0,
+	    ("%s: unaligned data %p", __func__, data));
+	KASSERT((len <= ALTERA_SDCARD_SECTORSIZE) && (len % 2 == 0),
 	    ("%s: invalid length %ju", __func__, len));
 
-	bus_write_region_1(sc->as_res, ALTERA_SDCARD_OFF_RXTX_BUFFER, data,
-	    len);
+	bus_write_region_2(sc->as_res, ALTERA_SDCARD_OFF_RXTX_BUFFER,
+	    (uint16_t *)data, len / 2);
 }
 
 static void
@@ -303,14 +311,16 @@
 	 * quirks handled in the process:
 	 *
 	 * 1. ALTERA_SDCARD_ASR_CMDDATAERROR is ignored for BIO_WRITE.
-	 * 2. ALTERA_SDCARD_RR1_COMMANDCRCFAILED is ignored for BIO_READ.
+	 * 2. ALTERA_SDCARD_RR1_COMMANDCRCFAILED is optionally ignored for
+	 *    BIO_READ.
 	 */
 	error = 0;
 	rr1 = altera_sdcard_read_rr1(sc);
 	switch (bp->bio_cmd) {
 	case BIO_READ:
 		mask = ALTERA_SDCARD_RR1_ERRORMASK;
-		mask &= ~ALTERA_SDCARD_RR1_COMMANDCRCFAILED;
+		if (altera_sdcard_ignore_crc_errors)
+			mask &= ~ALTERA_SDCARD_RR1_COMMANDCRCFAILED;
 		if (asr & ALTERA_SDCARD_ASR_CMDTIMEOUT)
 			error = EIO;
 		else if ((asr & ALTERA_SDCARD_ASR_CMDDATAERROR) &&



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