Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Apr 2012 04:53:32 +0000 (UTC)
From:      Grzegorz Bernacki <gber@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r233977 - in projects/nand: sbin/newfs_nandfs usr.sbin/nandsim usr.sbin/nandtool
Message-ID:  <201204070453.q374rWXo043111@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gber
Date: Sat Apr  7 04:53:32 2012
New Revision: 233977
URL: http://svn.freebsd.org/changeset/base/233977

Log:
  nandtool newfs: Follow-up to latest changes in geom & cleanup
  
  Obtained from: Semihalf
  Supported by:  FreeBSD Foundation, Juniper Networks

Modified:
  projects/nand/sbin/newfs_nandfs/newfs_nandfs.c
  projects/nand/usr.sbin/nandsim/nandsim.c
  projects/nand/usr.sbin/nandtool/Makefile
  projects/nand/usr.sbin/nandtool/nand_erase.c
  projects/nand/usr.sbin/nandtool/nand_info.c
  projects/nand/usr.sbin/nandtool/nand_read.c
  projects/nand/usr.sbin/nandtool/nand_readoob.c
  projects/nand/usr.sbin/nandtool/nand_write.c
  projects/nand/usr.sbin/nandtool/nand_writeoob.c
  projects/nand/usr.sbin/nandtool/nandtool.c

Modified: projects/nand/sbin/newfs_nandfs/newfs_nandfs.c
==============================================================================
--- projects/nand/sbin/newfs_nandfs/newfs_nandfs.c	Sat Apr  7 04:39:14 2012	(r233976)
+++ projects/nand/sbin/newfs_nandfs/newfs_nandfs.c	Sat Apr  7 04:53:32 2012	(r233977)
@@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$");
 #include <unistd.h>
 
 #include <fs/nandfs/nandfs_fs.h>
+#include <dev/nand/nand_dev.h>
 
 #define DEBUG
 #undef DEBUG
@@ -165,7 +166,7 @@ nandfs_log2(unsigned n)
 	 * N.B. this function will return 0 if supplied 0.
 	 */
 	for (count = 0; n/2; count++)
-	    n /= 2;
+		n /= 2;
 	return count;
 }
 
@@ -750,7 +751,7 @@ save_cpfile(void)
 	/* mark rest of cp as invalid */
 	cno = NANDFS_FIRST_CNO + 1;
 	i = NANDFS_CPFILE_FIRST_CHECKPOINT_OFFSET + 1;
-	for (;i < entries; i++) {
+	for (; i < entries; i++) {
 		cp[i].cp_cno = cno++;
 		cp[i].cp_flags = NANDFS_CHECKPOINT_INVALID;
 	}
@@ -909,10 +910,10 @@ check_parameters(void)
 	i = 0;
 	if (volumelabel) {
 		while (isalnum(volumelabel[++i]));
-			if (volumelabel[i] != '\0') {
-				errx(1, "bad volume label. "
-				    "Valid characters are alphanumerics.");
-			}
+		if (volumelabel[i] != '\0') {
+			errx(1, "bad volume label. "
+			    "Valid characters are alphanumerics.");
+		}
 
 		if (strlen(volumelabel) >= 16)
 			errx(1, "Bad volume label. Length is longer than %d.",
@@ -969,6 +970,7 @@ check_mounted(const char *fname, mode_t 
 static void
 calculate_geometry(int fd)
 {
+	struct chip_param_io chip_params;
 	char ident[DISK_IDENT_SIZE];
 	char medianame[MAXPATHLEN];
 
@@ -988,8 +990,13 @@ calculate_geometry(int fd)
 	debug("mediasize: %#jx", mediasize);
 
 	/* Get storage erase unit size */
-	if (ioctl(fd, DIOCNBLKSIZE, &erasesize))
+	if (!is_nand)
 		erasesize = NANDFS_DEF_ERASESIZE;
+	else if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) == -1)
+		errx(1, "Cannot ioctl(NAND_IO_GET_CHIP_PARAM)");
+	else
+		erasesize = chip_params.page_size * chip_params.pages_per_block;
+
 	debug("erasesize: %#jx", (uintmax_t)erasesize);
 
 	if (blocks_per_segment == 0) {
@@ -1134,8 +1141,8 @@ main(int argc, char *argv[])
 	fname = *argv++;
 	if (!strchr(fname, '/')) {
 		snprintf(buf, sizeof(buf), "%s%s", _PATH_DEV, fname);
-	if (!(fname = strdup(buf)))
-		err(1, NULL);
+		if (!(fname = strdup(buf)))
+			err(1, NULL);
 	}
 
 	fd = g_open(fname, 1);

Modified: projects/nand/usr.sbin/nandsim/nandsim.c
==============================================================================
--- projects/nand/usr.sbin/nandsim/nandsim.c	Sat Apr  7 04:39:14 2012	(r233976)
+++ projects/nand/usr.sbin/nandsim/nandsim.c	Sat Apr  7 04:53:32 2012	(r233977)
@@ -38,7 +38,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/types.h>
 
 #include <dev/nand/nandsim.h>
-#include <dev/nand/nand_cdev.h>
+#include <dev/nand/nand_dev.h>
 
 #include <ctype.h>
 #include <fcntl.h>

Modified: projects/nand/usr.sbin/nandtool/Makefile
==============================================================================
--- projects/nand/usr.sbin/nandtool/Makefile	Sat Apr  7 04:39:14 2012	(r233976)
+++ projects/nand/usr.sbin/nandtool/Makefile	Sat Apr  7 04:53:32 2012	(r233977)
@@ -1,3 +1,5 @@
+# $FreeBSD$
+
 PROG=	nandtool
 SRCS=	nandtool.c nand_read.c nand_write.c nand_erase.c nand_info.c
 SRCS+=	nand_readoob.c nand_writeoob.c
@@ -6,6 +8,4 @@ DPADD=	${LIBGEOM}
 LDADD=	-lgeom
 MAN=	nandtool.8
 
-WARNS?=	7
-
 .include <bsd.prog.mk>

Modified: projects/nand/usr.sbin/nandtool/nand_erase.c
==============================================================================
--- projects/nand/usr.sbin/nandtool/nand_erase.c	Sat Apr  7 04:39:14 2012	(r233976)
+++ projects/nand/usr.sbin/nandtool/nand_erase.c	Sat Apr  7 04:53:32 2012	(r233977)
@@ -34,16 +34,17 @@ __FBSDID("$FreeBSD$");
 #include <sys/types.h>
 #include <sys/disk.h>
 #include <libgeom.h>
-#include <dev/nand/nand_cdev.h>
+#include <dev/nand/nand_dev.h>
 #include "nandtool.h"
 
 int nand_erase(struct cmd_param *params)
 {
+	struct chip_param_io chip_params;
 	char *dev;
 	int fd = -1;
 	off_t pos, count, err = 0;
 	off_t start, nblocks, i;
-	int page_size, block_size, mult;
+	int block_size, mult;
 
 	if (!(dev = param_get_string(params, "dev"))) {
 		fprintf(stderr, "Please supply valid 'dev' parameter.\n");
@@ -58,21 +59,17 @@ int nand_erase(struct cmd_param *params)
 	if ((count = param_get_int(params, "count")) < 0)
 		count = 1;
 
-	if (ioctl(fd, DIOCGSECTORSIZE, &page_size)) {
-		perrorf("Cannot get page size for %s", dev);
+	if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) == -1) {
+		perrorf("Cannot ioctl(NAND_IO_GET_CHIP_PARAM)");
 		err = errno;
 		goto out;
 	}
 
-	if (ioctl(fd, DIOCNBLKSIZE, &block_size)) {
-		perrorf("Cannot get block size for %s", dev);
-		err = errno;
-		goto out;
-	}
+	block_size = chip_params.page_size * chip_params.pages_per_block;
 
 	if (param_has_value(params, "page")) {
-		pos = page_size * param_get_int(params, "page");
-		mult = page_size;
+		pos = chip_params.page_size * param_get_int(params, "page");
+		mult = chip_params.page_size;
 	} else if (param_has_value(params, "block")) {
 		pos = block_size * param_get_int(params, "block");
 		mult = block_size;
@@ -82,7 +79,7 @@ int nand_erase(struct cmd_param *params)
 
 	} else {
 		/* Erase all chip */
-		if (ioctl(fd, DIOCGMEDIASIZE, &count) < 0) {
+		if (ioctl(fd, DIOCGMEDIASIZE, &count) == -1) {
 			err = errno;
 			goto out;
 		}

Modified: projects/nand/usr.sbin/nandtool/nand_info.c
==============================================================================
--- projects/nand/usr.sbin/nandtool/nand_info.c	Sat Apr  7 04:39:14 2012	(r233976)
+++ projects/nand/usr.sbin/nandtool/nand_info.c	Sat Apr  7 04:53:32 2012	(r233977)
@@ -34,17 +34,19 @@ __FBSDID("$FreeBSD$");
 #include <errno.h>
 #include <libgeom.h>
 #include <sys/disk.h>
-#include <dev/nand/nand_cdev.h>
+#include <dev/nand/nand_dev.h>
 #include "nandtool.h"
 
 int nand_info(struct cmd_param *params)
 {
-	int fd = -1, page_size, block_size, oob_size, err = 0;
-	off_t media_size;
+	struct chip_param_io chip_params;
+	int fd = -1, err = 0, block_size;
+	off_t chip_size, media_size;
 	const char *dev;
 
 	if ((dev = param_get_string(params, "dev")) == NULL) {
-		fprintf(stderr, "Please supply 'dev' parameter, eg. 'dev=/dev/gnand0'\n");
+		fprintf(stderr, "Please supply 'dev' parameter, eg. "
+		    "'dev=/dev/gnand0'\n");
 		return (EINVAL);
 	}
 
@@ -53,35 +55,29 @@ int nand_info(struct cmd_param *params)
 		return (errno);
 	}
 
-	if (ioctl(fd, DIOCGSECTORSIZE, &page_size) < 0) {
-		perrorf("Cannot ioctl(DIOCGSECTORSIZE)");
+	if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) == -1) {
+		perrorf("Cannot ioctl(NAND_IO_GET_CHIP_PARAM)");
 		err = errno;
 		goto out;
 	}
 
-	if (ioctl(fd, DIOCNBLKSIZE, &block_size) < 0) {
-		perrorf("Cannot ioctl(DIOCGSECTORSIZE)");
-		err = errno;
-		goto out;
-	}
-
-	if (ioctl(fd, DIOCNOOBSIZE, &oob_size) < 0) {
-		perrorf("Cannot ioctl(DIOCGSECTORSIZE)");
-		err = errno;
-		goto out;
-	}
-
-	if (ioctl(fd, DIOCGMEDIASIZE, &media_size) < 0) {
+	if (ioctl(fd, DIOCGMEDIASIZE, &media_size) == -1) {
 		perrorf("Cannot ioctl(DIOCGMEDIASIZE)");
 		err = errno;
 		goto out;
 	}
 
+	block_size = chip_params.page_size * chip_params.pages_per_block;
+	chip_size = block_size * chip_params.blocks;
+
 	printf("Device:\t\t\t%s\n", dev);
-	printf("Page size:\t\t%d bytes\n", page_size);
-	printf("Block size:\t\t%d bytes (%d KB)\n", block_size, block_size / 1024);
-	printf("OOB size per page:\t%d bytes\n", oob_size);
-	printf("Chip size:\t\t%jd MB\n", (uintmax_t)(media_size / 1024 / 1024));
+	printf("Page size:\t\t%d bytes\n", chip_params.page_size);
+	printf("Block size:\t\t%d bytes (%d KB)\n", block_size,
+	    block_size / 1024);
+	printf("OOB size per page:\t%d bytes\n", chip_params.oob_size);
+	printf("Chip size:\t\t%jd MB\n", (uintmax_t)(chip_size / 1024 / 1024));
+	printf("Slice size:\t\t%jd MB\n",
+	    (uintmax_t)(media_size / 1024 / 1024));
 
 out:
 	if (fd != -1)
@@ -89,4 +85,3 @@ out:
 
 	return (err);
 }
-

Modified: projects/nand/usr.sbin/nandtool/nand_read.c
==============================================================================
--- projects/nand/usr.sbin/nandtool/nand_read.c	Sat Apr  7 04:39:14 2012	(r233976)
+++ projects/nand/usr.sbin/nandtool/nand_read.c	Sat Apr  7 04:53:32 2012	(r233977)
@@ -34,15 +34,16 @@ __FBSDID("$FreeBSD$");
 #include <fcntl.h>
 #include <libgeom.h>
 #include <sys/disk.h>
-#include <dev/nand/nand_cdev.h>
+#include <dev/nand/nand_dev.h>
 #include "nandtool.h"
 
 int nand_read(struct cmd_param *params)
 {
+	struct chip_param_io chip_params;
 	int fd = -1, out_fd = -1, ret;
 	char *dev, *out;
 	uint8_t *buf = NULL;
-	int pos, done = 0, count, mult, page_size, block_size;
+	int pos, done = 0, count, mult, block_size;
 	int err = 0;
 
 	if (!(dev = param_get_string(params, "dev"))) {
@@ -64,28 +65,24 @@ int nand_read(struct cmd_param *params)
 		goto out;
 	}
 
-	if (ioctl(fd, DIOCNBLKSIZE, &block_size) < 0) {
-		perrorf("ioctl(DIOCNBLKSIZE) failed");
+	if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) == -1) {
+		perrorf("Cannot ioctl(NAND_IO_GET_CHIP_PARAM)");
 		err = errno;
 		goto out;
 	}
 
-	if (ioctl(fd, DIOCGSECTORSIZE, &page_size) < 0) {
-		perrorf("ioctl(DIOCGSECTORSIZE) failed");
-		err = errno;
-		goto out;
-	}
+	block_size = chip_params.page_size * chip_params.pages_per_block;
 
 	if (param_has_value(params, "page")) {
-		pos = page_size * param_get_int(params, "page");
-		mult = page_size;
+		pos = chip_params.page_size * param_get_int(params, "page");
+		mult = chip_params.page_size;
 	} else if (param_has_value(params, "block")) {
 		pos = block_size * param_get_int(params, "block");
 		mult = block_size;
 	} else if (param_has_value(params, "pos")) {
 		pos = param_get_int(params, "pos");
 		mult = 1;
-		if (pos % page_size) {
+		if (pos % chip_params.page_size) {
 			fprintf(stderr, "Position must be page-size aligned!\n");
 			err = errno;
 			goto out;
@@ -102,8 +99,9 @@ int nand_read(struct cmd_param *params)
 	else
 		count = param_get_int(params, "count") * mult;
 
-	if (!(buf = malloc(page_size))) {
-		perrorf("Cannot allocate buffer [size %x]", page_size);
+	if (!(buf = malloc(chip_params.page_size))) {
+		perrorf("Cannot allocate buffer [size %x]",
+		    chip_params.page_size);
 		err = errno;
 		goto out;
 	}
@@ -111,7 +109,8 @@ int nand_read(struct cmd_param *params)
 	lseek(fd, pos, SEEK_SET);
 
 	while (done < count) {
-		if ((ret = read(fd, buf, page_size)) != page_size) {
+		if ((ret = read(fd, buf, chip_params.page_size)) !=
+		    (int32_t)chip_params.page_size) {
 			perrorf("read error (read %d bytes)", ret);
 			goto out;
 		}
@@ -119,13 +118,14 @@ int nand_read(struct cmd_param *params)
 		done += ret;
 
 		if (out_fd != -1) {
-			if ((ret = write(out_fd, buf, page_size)) != page_size) {
+			if ((ret = write(out_fd, buf, chip_params.page_size)) !=
+			    (int32_t)chip_params.page_size) {
 				perrorf("write error (written %d bytes)", ret);
 				err = errno;
 				goto out;
 			}
 		} else
-			hexdump(buf, page_size);
+			hexdump(buf, chip_params.page_size);
 	}
 
 out:

Modified: projects/nand/usr.sbin/nandtool/nand_readoob.c
==============================================================================
--- projects/nand/usr.sbin/nandtool/nand_readoob.c	Sat Apr  7 04:39:14 2012	(r233976)
+++ projects/nand/usr.sbin/nandtool/nand_readoob.c	Sat Apr  7 04:53:32 2012	(r233977)
@@ -35,24 +35,24 @@ __FBSDID("$FreeBSD$");
 #include <libgeom.h>
 #include <sys/types.h>
 #include <sys/disk.h>
-#include <dev/nand/nand_cdev.h>
+#include <dev/nand/nand_dev.h>
 #include "nandtool.h"
 
 int nand_read_oob(struct cmd_param *params)
 {
+	struct chip_param_io chip_params;
+	struct nand_oob_rw req;
 	char *dev, *out;
 	int fd = -1, fd_out = -1;
-	int err = 0;
+	int page, err = 0;
 	uint8_t *buf = NULL;
-	int oobsize, page, pagesize;
-	struct nand_oob_request req;
 
 	if ((page = param_get_int(params, "page")) < 0) {
 		fprintf(stderr, "You must supply valid 'page' argument.\n");
 		return (EINVAL);
 	}
 
-	if (!(dev = param_get_string(params, "dev"))){
+	if (!(dev = param_get_string(params, "dev"))) {
 		fprintf(stderr, "You must supply 'dev' argument.\n");
 		return (EINVAL);
 	}
@@ -71,39 +71,33 @@ int nand_read_oob(struct cmd_param *para
 		goto out;
 	}
 
-	if (ioctl(fd, DIOCGSECTORSIZE, &pagesize)) {
-		perrorf("Cannot get page size for %s", dev);
+	if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) == -1) {
+		perrorf("Cannot ioctl(NAND_IO_GET_CHIP_PARAM)");
 		err = errno;
 		goto out;
 	}
 
-	if (ioctl(fd, DIOCNOOBSIZE, &oobsize)) {
-		perrorf("Cannot get OOB size for %s", dev);
-		err = errno;
-		goto out;
-	}
-
-	buf = malloc(oobsize);
+	buf = malloc(chip_params.oob_size);
 	if (buf == NULL) {
-		perrorf("Cannot allocate %d bytes\n", oobsize);
+		perrorf("Cannot allocate %d bytes\n", chip_params.oob_size);
 		err = errno;
 		goto out;
 	}
 
-	req.length = oobsize;
-	req.offset = page * pagesize;
-	req.ubuf = buf;
+	req.page = page;
+	req.len = chip_params.oob_size;
+	req.data = buf;
 
-	if (ioctl(fd, DIOCNREADOOB, &req)) {
+	if (ioctl(fd, NAND_IO_OOB_READ, &req) == -1) {
 		perrorf("Cannot read OOB from %s", dev);
 		err = errno;
 		goto out;
 	}
 
 	if (fd_out != -1)
-		write(fd_out, buf, oobsize);
+		write(fd_out, buf, chip_params.oob_size);
 	else
-		hexdump(buf, oobsize);
+		hexdump(buf, chip_params.oob_size);
 
 out:
 	if (fd != -1)

Modified: projects/nand/usr.sbin/nandtool/nand_write.c
==============================================================================
--- projects/nand/usr.sbin/nandtool/nand_write.c	Sat Apr  7 04:39:14 2012	(r233976)
+++ projects/nand/usr.sbin/nandtool/nand_write.c	Sat Apr  7 04:53:32 2012	(r233977)
@@ -34,15 +34,16 @@ __FBSDID("$FreeBSD$");
 #include <fcntl.h>
 #include <libgeom.h>
 #include <sys/disk.h>
-#include <dev/nand/nand_cdev.h>
+#include <dev/nand/nand_dev.h>
 #include "nandtool.h"
 
 int nand_write(struct cmd_param *params)
 {
+	struct chip_param_io chip_params;
 	char *dev, *file;
 	int fd = -1, in_fd = -1, ret, err = 0;
 	uint8_t *buf = NULL;
-	int page_size, block_size, mult, pos, done = 0, count, raw;
+	int block_size, mult, pos, done = 0, count, raw;
 
 	raw = param_get_boolean(params, "raw");
 
@@ -67,29 +68,26 @@ int nand_write(struct cmd_param *params)
 		goto out;
 	}
 
-	if (ioctl(fd, DIOCGSECTORSIZE, &page_size) < 0) {
-		perrorf("ioctl(DIOCGSECTORSIZE) failed");
+	if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) == -1) {
+		perrorf("Cannot ioctl(NAND_IO_GET_CHIP_PARAM)");
 		err = errno;
 		goto out;
 	}
 
-	if (ioctl(fd, DIOCNBLKSIZE, &block_size) < 0) {
-		perrorf("ioctl(DIOCNBLKSIZE) failed");
-		err = errno;
-		goto out;
-	}
+	block_size = chip_params.page_size * chip_params.pages_per_block;
 
 	if (param_has_value(params, "page")) {
-		pos = page_size * param_get_int(params, "page");
-		mult = page_size;
+		pos = chip_params.page_size * param_get_int(params, "page");
+		mult = chip_params.page_size;
 	} else if (param_has_value(params, "block")) {
 		pos = block_size * param_get_int(params, "block");
 		mult = block_size;
 	} else if (param_has_value(params, "pos")) {
 		pos = param_get_int(params, "pos");
 		mult = 1;
-		if (pos % page_size) {
-			fprintf(stderr, "Position must be page-size aligned!\n");
+		if (pos % chip_params.page_size) {
+			fprintf(stderr, "Position must be page-size "
+			    "aligned!\n");
 			errno = EINVAL;
 			goto out;
 		}
@@ -105,17 +103,18 @@ int nand_write(struct cmd_param *params)
 	else
 		count = param_get_int(params, "count") * mult;
 
-	if (!(buf = malloc(page_size))) {
-		perrorf("Cannot allocate buffer [size %x]", page_size);
+	if (!(buf = malloc(chip_params.page_size))) {
+		perrorf("Cannot allocate buffer [size %x]",
+		    chip_params.page_size);
 		err = errno;
 		goto out;
 	}
 
 	lseek(fd, pos, SEEK_SET);
 
-	while (done < count)
-	{
-		if ((ret = read(in_fd, buf, page_size)) != page_size) {
+	while (done < count) {
+		if ((ret = read(in_fd, buf, chip_params.page_size)) !=
+		    (int32_t)chip_params.page_size) {
 			if (ret > 0) {
 				/* End of file ahead, truncate here */
 				break;
@@ -126,7 +125,8 @@ int nand_write(struct cmd_param *params)
 			}
 		}
 
-		if ((ret = write(fd, buf, page_size)) != page_size) {
+		if ((ret = write(fd, buf, chip_params.page_size)) !=
+		    (int32_t)chip_params.page_size) {
 			err = errno;
 			goto out;
 		}

Modified: projects/nand/usr.sbin/nandtool/nand_writeoob.c
==============================================================================
--- projects/nand/usr.sbin/nandtool/nand_writeoob.c	Sat Apr  7 04:39:14 2012	(r233976)
+++ projects/nand/usr.sbin/nandtool/nand_writeoob.c	Sat Apr  7 04:53:32 2012	(r233977)
@@ -34,16 +34,17 @@ __FBSDID("$FreeBSD$");
 #include <fcntl.h>
 #include <libgeom.h>
 #include <sys/disk.h>
-#include <dev/nand/nand_cdev.h>
+#include <dev/nand/nand_dev.h>
 #include "nandtool.h"
 
 int nand_write_oob(struct cmd_param *params)
 {
+	struct chip_param_io chip_params;
+	struct nand_oob_rw req;
 	char *dev, *in;
 	int fd = -1, fd_in = -1;
 	uint8_t *buf = NULL;
-	int pagesize, oobsize, page, err = 0;
-	struct nand_oob_request req;
+	int page, err = 0;
 
 	if (!(dev = param_get_string(params, "dev"))) {
 		fprintf(stderr, "Please supply valid 'dev' parameter.\n");
@@ -71,38 +72,30 @@ int nand_write_oob(struct cmd_param *par
 		goto out;
 	}
 
-	if (ioctl(fd, DIOCGSECTORSIZE, &pagesize)) {
-		perrorf("Cannot get page size for %s", dev);
+	if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) == -1) {
+		perrorf("Cannot ioctl(NAND_IO_GET_CHIP_PARAM)");
 		err = errno;
 		goto out;
 	}
 
-
-	if (ioctl(fd, DIOCNOOBSIZE, &oobsize)) {
-		perrorf("Cannot get OOB size for %s", dev);
-		err = errno;
-		goto out;
-	}
-
-	buf = xmalloc(oobsize);
+	buf = xmalloc(chip_params.oob_size);
 	if (buf == NULL) {
-		perrorf("Cannot allocate %d bytes\n", oobsize);
+		perrorf("Cannot allocate %d bytes\n", chip_params.oob_size);
 		err = errno;
 		goto out;
 	}
 
-	if (read(fd_in, buf, oobsize) < 0) {
+	if (read(fd_in, buf, chip_params.oob_size) < 0) {
 		perrorf("Cannot read from %s", in);
 		err = errno;
 		goto out;
 	}
 
+	req.page = page;
+	req.len = chip_params.oob_size;
+	req.data = buf;
 
-	req.offset = page * pagesize;
-	req.length = oobsize;
-	req.ubuf = buf;
-
-	if (ioctl(fd, DIOCNWRITEOOB, &req)) {
+	if (ioctl(fd, NAND_IO_OOB_PROG, &req) == -1) {
 		perrorf("Cannot write OOB to %s", dev);
 		err = errno;
 		goto out;

Modified: projects/nand/usr.sbin/nandtool/nandtool.c
==============================================================================
--- projects/nand/usr.sbin/nandtool/nandtool.c	Sat Apr  7 04:39:14 2012	(r233976)
+++ projects/nand/usr.sbin/nandtool/nandtool.c	Sat Apr  7 04:53:32 2012	(r233977)
@@ -55,7 +55,8 @@ static const struct {
 	{ NULL, NULL, NULL },
 };
 
-char *param_get_string(struct cmd_param *params, const char *name)
+char *
+param_get_string(struct cmd_param *params, const char *name)
 {
 	int i;
 
@@ -67,7 +68,8 @@ char *param_get_string(struct cmd_param 
 	return (NULL);
 }
 
-int param_get_int(struct cmd_param *params, const char *name)
+int
+param_get_int(struct cmd_param *params, const char *name)
 {
 	unsigned long ret;
 	char *str = param_get_string(params, name);
@@ -85,7 +87,8 @@ int param_get_int(struct cmd_param *para
 	return (ret);
 }
 
-int param_get_boolean(struct cmd_param *params, const char *name)
+int
+param_get_boolean(struct cmd_param *params, const char *name)
 {
 	char *str = param_get_string(params, name);
 
@@ -98,7 +101,8 @@ int param_get_boolean(struct cmd_param *
 	return (0);
 }
 
-int param_has_value(struct cmd_param *params, const char *name)
+int
+param_has_value(struct cmd_param *params, const char *name)
 {
 	int i;
 
@@ -110,16 +114,18 @@ int param_has_value(struct cmd_param *pa
 	return (0);
 }
 
-int param_get_count(struct cmd_param *params)
+int
+param_get_count(struct cmd_param *params)
 {
 	int i;
 
 	for (i = 0; params[i].name[0] != '\0'; i++);
 
-	return i;
+	return (i);
 }
 
-void hexdump(uint8_t *buf, int length)
+void
+hexdump(uint8_t *buf, int length)
 {
 	int i, j;
 	for (i = 0; i < length; i += 16) {
@@ -140,28 +146,33 @@ void hexdump(uint8_t *buf, int length)
 	}
 }
 
-void *xmalloc(size_t len)
+void *
+xmalloc(size_t len)
 {
 	void *ret = malloc(len);
 
 	if (!ret) {
-		fprintf(stderr, "Cannot allocate buffer of %zd bytes. Exiting.\n", len);
+		fprintf(stderr, "Cannot allocate buffer of %zd bytes. "
+		    "Exiting.\n", len);
 		exit(EX_OSERR);
 	}
 
-	return ret;
+	return (ret);
 }
 
-void perrorf(const char *format, ...)
+void
+perrorf(const char *format, ...)
 {
 	va_list args;
+
 	va_start(args, format);
 	vfprintf(stderr, format, args);
 	va_end(args);
 	fprintf(stderr, ": %s\n", strerror(errno));
 }
 
-int usage(struct cmd_param *params)
+int
+usage(struct cmd_param *params)
 {
 	int i;
 
@@ -174,7 +185,8 @@ int usage(struct cmd_param *params)
 			fprintf(stderr, "\t%s\n", commands[i].name);
 
 		fprintf(stderr, "\n");
-		fprintf(stderr, "For information about particular command, type:\n");
+		fprintf(stderr, "For information about particular command, "
+		    "type:\n");
 		fprintf(stderr, "'nandtool help topic=<command>'\n");
 	} else if (param_has_value(params, "topic")) {
 		for (i = 0; commands[i].name != NULL; i++) {
@@ -194,7 +206,8 @@ int usage(struct cmd_param *params)
 	return (EX_USAGE);
 }
 
-int main(int argc, const char *argv[])
+int
+main(int argc, const char *argv[])
 {
 	struct cmd_param *params;
 	int i, ret, idx;
@@ -210,13 +223,14 @@ int main(int argc, const char *argv[])
 		if (sscanf(argv[i], "%63[^=]=%63s", params[idx].name,
 		    params[idx].value) < 2) {
 			fprintf(stderr, "Syntax error in argument %d. "
-			   "Argument should be in form 'name=value'.\n", i);
+			    "Argument should be in form 'name=value'.\n", i);
+			free(params);
 			return (-1);
 		}
 	}
 
-	params[idx+1].name[0] = '\0';
-	params[idx+1].value[0] = '\0';
+	params[idx].name[0] = '\0';
+	params[idx].value[0] = '\0';
 
 	for (i = 0; commands[i].name != NULL; i++) {
 		if (!strcmp(commands[i].name, argv[1])) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204070453.q374rWXo043111>