Module Name:    src
Committed By:   ahoka
Date:           Sun Apr 10 12:48:10 UTC 2011

Modified Files:
        src/sys/dev/nand: nand.c nand.h

Log Message:
Fix locking and simplify some error path.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/nand/nand.c
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/nand/nand.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/nand/nand.c
diff -u src/sys/dev/nand/nand.c:1.7 src/sys/dev/nand/nand.c:1.8
--- src/sys/dev/nand/nand.c:1.7	Mon Apr  4 14:25:10 2011
+++ src/sys/dev/nand/nand.c	Sun Apr 10 12:48:09 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: nand.c,v 1.7 2011/04/04 14:25:10 ahoka Exp $	*/
+/*	$NetBSD: nand.c,v 1.8 2011/04/10 12:48:09 ahoka Exp $	*/
 
 /*-
  * Copyright (c) 2010 Department of Software Engineering,
@@ -34,7 +34,7 @@
 /* Common driver for NAND chips implementing the ONFI 2.2 specification */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nand.c,v 1.7 2011/04/04 14:25:10 ahoka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nand.c,v 1.8 2011/04/10 12:48:09 ahoka Exp $");
 
 #include "locators.h"
 
@@ -1050,7 +1050,7 @@
 	const uint8_t *bufp;
 	flash_off_t addr;
 	size_t left, count;
-	int error, i;
+	int error = 0, i;
 
 	first = offset & chip->nc_page_mask;
 	firstoff = offset & ~chip->nc_page_mask;
@@ -1061,26 +1061,30 @@
 	addr = first;
 	*retlen = 0;
 
+	mutex_enter(&sc->sc_device_lock);
 	if (count == 1) {
 		if (nand_isbad(self, addr)) {
 			aprint_error_dev(self,
 			    "nand_flash_write_unaligned: "
 			    "bad block encountered\n");
-			return EIO;
+			error = EIO;
+			goto out;
 		}
 
 		error = nand_read_page(self, addr, chip->nc_page_cache);
-		if (error)
-			return error;
+		if (error) {
+			goto out;
+		}
 
 		memcpy(chip->nc_page_cache + firstoff, buf, len);
 
 		error = nand_program_page(self, addr, chip->nc_page_cache);
-		if (error)
-			return error;
+		if (error) {
+			goto out;
+		}
 
 		*retlen = len;
-		return 0;
+		goto out;
 	}
 
 	bufp = buf;
@@ -1091,14 +1095,16 @@
 			aprint_error_dev(self,
 			    "nand_flash_write_unaligned: "
 			    "bad block encountered\n");
-			return EIO;
+			error = EIO;
+			goto out;
 		}
 
 		if (i == 0) {
 			error = nand_read_page(self,
 			    addr, chip->nc_page_cache);
-			if (error)
-				return error;
+			if (error) {
+				goto out;
+			}
 
 			memcpy(chip->nc_page_cache + firstoff,
 			    bufp, chip->nc_page_size - firstoff);
@@ -1106,8 +1112,9 @@
 			printf("program page: %s: %d\n", __FILE__, __LINE__);
 			error = nand_program_page(self,
 			    addr, chip->nc_page_cache);
-			if (error)
-				return error;
+			if (error) {
+				goto out;
+			}
 
 			bufp += chip->nc_page_size - firstoff;
 			left -= chip->nc_page_size - firstoff;
@@ -1116,15 +1123,17 @@
 		} else if (i == count - 1) {
 			error = nand_read_page(self,
 			    addr, chip->nc_page_cache);
-			if (error)
-				return error;
+			if (error) {
+				goto out;
+			}
 
 			memcpy(chip->nc_page_cache, bufp, left);
 
 			error = nand_program_page(self,
 			    addr, chip->nc_page_cache);
-			if (error)
-				return error;
+			if (error) {
+				goto out;
+			}
 
 			*retlen += left;
 			KASSERT(left < chip->nc_page_size);
@@ -1138,8 +1147,9 @@
 			KASSERT(left > chip->nc_page_size);
 
 			error = nand_program_page(self, addr, bufp);
-			if (error)
-				return error;
+			if (error) {
+				goto out;
+			}
 
 			bufp += chip->nc_page_size;
 			left -= chip->nc_page_size;
@@ -1150,8 +1160,10 @@
 	}
 
 	KASSERT(*retlen == len);
+out:
+	mutex_exit(&sc->sc_device_lock);
 
-	return 0;
+	return error;
 }
 
 int
@@ -1198,8 +1210,9 @@
 		}
 
 		error = nand_program_page(self, addr, bufp);
-		if (error)
+		if (error) {
 			goto out;
+		}
 
 		addr += chip->nc_page_size;
 		bufp += chip->nc_page_size;
@@ -1240,8 +1253,9 @@
 	mutex_enter(&sc->sc_device_lock);
 	if (count == 1) {
 		error = nand_read_page(self, addr, chip->nc_page_cache);
-		if (error)
+		if (error) {
 			goto out;
+		}
 
 		memcpy(bufp, chip->nc_page_cache + firstoff, len);
 
@@ -1251,8 +1265,9 @@
 
 	for (i = 0; i < count && left != 0; i++) {
 		error = nand_read_page(self, addr, chip->nc_page_cache);
-		if (error)
+		if (error) {
 			goto out;
+		}
 
 		if (i == 0) {
 			memcpy(bufp, chip->nc_page_cache + firstoff,
@@ -1415,7 +1430,7 @@
 	struct nand_softc *sc = device_private(self);
 	struct nand_chip *chip = &sc->sc_chip;
 	flash_off_t addr;
-	int error;
+	int error = 0;
 
 	if (ei->ei_addr < 0 || ei->ei_len < chip->nc_block_size)
 		return EINVAL;
@@ -1448,17 +1463,18 @@
 	addr = ei->ei_addr;
 	while (addr < ei->ei_addr + ei->ei_len) {
 		if (nand_isbad(self, addr)) {
-			mutex_exit(&sc->sc_device_lock);
 			aprint_error_dev(self, "bad block encountered\n");
 			ei->ei_state = FLASH_ERASE_FAILED;
-			return EIO;
+			
+			error = EIO;
+			goto out;
 		}
 
 		error = nand_erase_block(self, addr);
 		if (error) {
-			mutex_exit(&sc->sc_device_lock);
 			ei->ei_state = FLASH_ERASE_FAILED;
-			return error;
+			
+			goto out;
 		}
 
 		addr += chip->nc_block_size;
@@ -1466,10 +1482,15 @@
 	mutex_exit(&sc->sc_device_lock);
 
 	ei->ei_state = FLASH_ERASE_DONE;
-	if (ei->ei_callback != NULL)
+	if (ei->ei_callback != NULL) {
 		ei->ei_callback(ei);
+	}
 
 	return 0;
+out:
+	mutex_exit(&sc->sc_device_lock);
+
+	return error;
 }
 
 static int

Index: src/sys/dev/nand/nand.h
diff -u src/sys/dev/nand/nand.h:1.5 src/sys/dev/nand/nand.h:1.6
--- src/sys/dev/nand/nand.h:1.5	Mon Apr  4 14:25:10 2011
+++ src/sys/dev/nand/nand.h	Sun Apr 10 12:48:09 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: nand.h,v 1.5 2011/04/04 14:25:10 ahoka Exp $	*/
+/*	$NetBSD: nand.h,v 1.6 2011/04/10 12:48:09 ahoka Exp $	*/
 
 /*-
  * Copyright (c) 2010 Department of Software Engineering,
@@ -44,7 +44,6 @@
 #include <dev/nand/onfi.h>
 #include <dev/flash/flash.h>
 
-//#define NAND_DEBUG 1
 #ifdef NAND_DEBUG
 #define DPRINTF(x)	if (nanddebug) printf x
 #define DPRINTFN(n,x)	if (nanddebug>(n)) printf x

Reply via email to