From owner-p4-projects@FreeBSD.ORG Mon Jun 4 22:28:53 2012 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id B599310656B1; Mon, 4 Jun 2012 22:28:53 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 77BCA106568D for ; Mon, 4 Jun 2012 22:28:53 +0000 (UTC) (envelope-from brooks@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 474598FC0C for ; Mon, 4 Jun 2012 22:28:53 +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 q54MSrqb026480 for ; Mon, 4 Jun 2012 22:28:53 GMT (envelope-from brooks@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id q54MSr4k026477 for perforce@freebsd.org; Mon, 4 Jun 2012 22:28:53 GMT (envelope-from brooks@freebsd.org) Date: Mon, 4 Jun 2012 22:28:53 GMT Message-Id: <201206042228.q54MSr4k026477@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to brooks@freebsd.org using -f From: Brooks Davis To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 212283 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: Mon, 04 Jun 2012 22:28:54 -0000 http://p4web.freebsd.org/@@212283?ac=10 Change 212283 by brooks@brooks_ecr_current on 2012/06/04 22:28:34 Alter rwatson's retry algorithm to try to fix any wrong 16-bit words with a single write during the first pass. If we find any of these, do a single pass rescan as per normal and fall back to the prior whole buffer rewrite scheme on failure. With this change I make it to multi user mode with an single fixup instead of nearly 18k retrys in some cases with the full sector mode. Affected files ... .. //depot/projects/ctsrd/beribsd/src/sys/dev/altera/sdcard/altera_sdcard_io.c#13 edit Differences ... ==== //depot/projects/ctsrd/beribsd/src/sys/dev/altera/sdcard/altera_sdcard_io.c#13 (text+ko) ==== @@ -232,8 +232,8 @@ altera_sdcard_write_rxtx_buffer(struct altera_sdcard_softc *sc, void *data, size_t len) { - u_int differences, i, retry_counter; - uint16_t v; + u_int corrections, differences, i, retry_counter; + uint16_t d, v; KASSERT((uintptr_t)data % 2 == 0, ("%s: unaligned data %p", __func__, data)); @@ -252,12 +252,30 @@ * * XXXRW: Do we want a limit counter for retries here? */ +recheck: + corrections = 0; differences = 0; if (altera_sdcard_verify_rxtx_writes) { for (i = 0; i < ALTERA_SDCARD_SECTORSIZE; i += 2) { v = bus_read_2(sc->as_res, ALTERA_SDCARD_OFF_RXTX_BUFFER + i); - if (v != *(uint16_t *)((uint8_t *)data + i)) { + d = *(uint16_t *)((uint8_t *)data + i); + if (v != d) { + if (retry_counter == 0) { + bus_write_2(sc->as_res, + ALTERA_SDCARD_OFF_RXTX_BUFFER + i, + d); + v = bus_read_2(sc->as_res, + ALTERA_SDCARD_OFF_RXTX_BUFFER + i); + if (v == d) { + corrections++; + device_printf(sc->as_dev, + "%s: single word rewrite worked" + " at offset %u\n", + __func__, i); + continue; + } + } differences++; device_printf(sc->as_dev, "%s: retrying write -- difference" @@ -266,8 +284,12 @@ retry_counter); } } - if (differences) + if (differences != 0) { retry_counter++; + if (retry_counter == 1 && + corrections == differences) + goto recheck; + } } } while (differences != 0); if (retry_counter)