From owner-p4-projects@FreeBSD.ORG Wed Apr 11 12:19:45 2012 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A845C1065675; Wed, 11 Apr 2012 12:19:45 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 525C7106566B for ; Wed, 11 Apr 2012 12:19:45 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 39ED58FC12 for ; Wed, 11 Apr 2012 12:19:45 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id q3BCJjda052346 for ; Wed, 11 Apr 2012 12:19:45 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id q3BCJi24052343 for perforce@freebsd.org; Wed, 11 Apr 2012 12:19:44 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Wed, 11 Apr 2012 12:19:44 GMT Message-Id: <201204111219.q3BCJi24052343@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 209412 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Apr 2012 12:19:45 -0000 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 +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) &&