Module Name:    src
Committed By:   ahoka
Date:           Sat Nov  3 12:45:28 UTC 2012

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

Log Message:
Endiannes fixes from Brett Slager in ONFI Param page parsing.
Similar changes in nandemulator by me.
Remove panic about more than one LUNs.


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/sys/dev/nand/nand.c
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/nand/nandemulator.c

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.21 src/sys/dev/nand/nand.c:1.22
--- src/sys/dev/nand/nand.c:1.21	Sat Nov  3 12:12:48 2012
+++ src/sys/dev/nand/nand.c	Sat Nov  3 12:45:28 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: nand.c,v 1.21 2012/11/03 12:12:48 ahoka Exp $	*/
+/*	$NetBSD: nand.c,v 1.22 2012/11/03 12:45:28 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.21 2012/11/03 12:12:48 ahoka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nand.c,v 1.22 2012/11/03 12:45:28 ahoka Exp $");
 
 #include "locators.h"
 
@@ -550,33 +550,29 @@ nand_fill_chip_structure(device_t self, 
 
 	aprint_normal_dev(self, "vendor: %s, model: %s\n", vendor, model);
 
-	/* XXX TODO multiple LUNs */
-	if (params.param_numluns != 1) {
-		aprint_error_dev(self,
-		    "more than one LUNs are not supported yet!\n");
-
-		return 1;
-	}
-
-	chip->nc_size = params.param_pagesize * params.param_blocksize *
-	    params.param_lunsize * params.param_numluns;
-
-	chip->nc_page_size = params.param_pagesize;
-	chip->nc_block_size = params.param_blocksize * params.param_pagesize;
-	chip->nc_spare_size = params.param_sparesize;
-	chip->nc_lun_blocks = params.param_lunsize;
+	chip->nc_page_size = le32toh(params.param_pagesize);
+	chip->nc_block_size =
+	    le32toh(params.param_blocksize) * chip->nc_page_size;
+	chip->nc_spare_size = le16toh(params.param_sparesize);
+	chip->nc_lun_blocks = le32toh(params.param_lunsize);
 	chip->nc_num_luns = params.param_numluns;
 
+	chip->nc_size =
+	    chip->nc_block_size * chip->nc_lun_blocks * chip->nc_num_luns;
+
 	/* the lower 4 bits contain the row address cycles */
 	chip->nc_addr_cycles_row = params.param_addr_cycles & 0x07;
 	/* the upper 4 bits contain the column address cycles */
 	chip->nc_addr_cycles_column = (params.param_addr_cycles & ~0x07) >> 4;
 
-	if (params.param_features & ONFI_FEATURE_16BIT)
+	uint16_t features = le16toh(params.param_features);
+	if (features & ONFI_FEATURE_16BIT) {
 		chip->nc_flags |= NC_BUSWIDTH_16;
+	}
 
-	if (params.param_features & ONFI_FEATURE_EXTENDED_PARAM)
+	if (features & ONFI_FEATURE_EXTENDED_PARAM) {
 		chip->nc_flags |= NC_EXTENDED_PARAM;
+	}
 
 	return 0;
 }

Index: src/sys/dev/nand/nandemulator.c
diff -u src/sys/dev/nand/nandemulator.c:1.5 src/sys/dev/nand/nandemulator.c:1.6
--- src/sys/dev/nand/nandemulator.c:1.5	Tue Jun 28 10:32:45 2011
+++ src/sys/dev/nand/nandemulator.c	Sat Nov  3 12:45:28 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: nandemulator.c,v 1.5 2011/06/28 10:32:45 ahoka Exp $	*/
+/*	$NetBSD: nandemulator.c,v 1.6 2012/11/03 12:45:28 ahoka Exp $	*/
 
 /*-
  * Copyright (c) 2011 Department of Software Engineering,
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nandemulator.c,v 1.5 2011/06/28 10:32:45 ahoka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nandemulator.c,v 1.6 2012/11/03 12:45:28 ahoka Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -235,11 +235,11 @@ nandemulator_attach(device_t parent, dev
 	for (i = 0; i < 4; i++) {
 		opp = &sc->sc_parameter_page[i];
 
-		opp->param_signature = *(uint32_t *)sig;
-		opp->param_pagesize = sc->sc_page_size;
-		opp->param_blocksize = sc->sc_block_size;
-		opp->param_sparesize = sc->sc_spare_size;
-		opp->param_lunsize = sc->sc_lun_size;
+		opp->param_signature = htole32(*(uint32_t *)sig);
+		opp->param_pagesize = htole32(sc->sc_page_size);
+		opp->param_blocksize = htole32(sc->sc_block_size);
+		opp->param_sparesize = htole16(sc->sc_spare_size);
+		opp->param_lunsize = htole32(sc->sc_lun_size);
 		opp->param_numluns = 1;
 
 		opp->param_manufacturer_id = 0x00;
@@ -248,7 +248,8 @@ nandemulator_attach(device_t parent, dev
 		memcpy(opp->param_model,
 		    "NANDEMULATOR", strlen("NANDEMULATOR"));
 
-		opp->param_features = ONFI_FEATURE_16BIT;
+		uint16_t features = ONFI_FEATURE_16BIT;
+		opp->param_features = htole16(features);
 
 		/* the lower 4 bits contain the row address cycles
 		 * the upper 4 bits contain the column address cycles

Reply via email to