Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/nand Fix locking and simplify some error path.



details:   https://anonhg.NetBSD.org/src/rev/7d6de375953b
branches:  trunk
changeset: 764010:7d6de375953b
user:      ahoka <ahoka%NetBSD.org@localhost>
date:      Sun Apr 10 12:48:09 2011 +0000

description:
Fix locking and simplify some error path.

diffstat:

 sys/dev/nand/nand.c |  81 +++++++++++++++++++++++++++++++++-------------------
 sys/dev/nand/nand.h |   3 +-
 2 files changed, 52 insertions(+), 32 deletions(-)

diffs (241 lines):

diff -r 5d7095fcec6a -r 7d6de375953b sys/dev/nand/nand.c
--- a/sys/dev/nand/nand.c       Sun Apr 10 11:31:48 2011 +0000
+++ b/sys/dev/nand/nand.c       Sun Apr 10 12:48:09 2011 +0000
@@ -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
diff -r 5d7095fcec6a -r 7d6de375953b sys/dev/nand/nand.h
--- a/sys/dev/nand/nand.h       Sun Apr 10 11:31:48 2011 +0000
+++ b/sys/dev/nand/nand.h       Sun Apr 10 12:48:09 2011 +0000
@@ -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



Home | Main Index | Thread Index | Old Index