Module Name:    src
Committed By:   nonaka
Date:           Thu Sep  8 15:00:08 UTC 2016

Modified Files:
        src/etc: MAKEDEV.tmpl
        src/sys/conf: majors
        src/sys/dev/ic: nvme.c

Log Message:
Fix to cannnot be opened a nvme(4) namespace device file.


To generate a diff of this commit:
cvs rdiff -u -r1.182 -r1.183 src/etc/MAKEDEV.tmpl
cvs rdiff -u -r1.74 -r1.75 src/sys/conf/majors
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/ic/nvme.c

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

Modified files:

Index: src/etc/MAKEDEV.tmpl
diff -u src/etc/MAKEDEV.tmpl:1.182 src/etc/MAKEDEV.tmpl:1.183
--- src/etc/MAKEDEV.tmpl:1.182	Sat Jul 23 06:48:27 2016
+++ src/etc/MAKEDEV.tmpl	Thu Sep  8 15:00:08 2016
@@ -1,5 +1,5 @@
 #!/bin/sh -
-#	$NetBSD: MAKEDEV.tmpl,v 1.182 2016/07/23 06:48:27 kre Exp $
+#	$NetBSD: MAKEDEV.tmpl,v 1.183 2016/09/08 15:00:08 nonaka Exp $
 #
 # Copyright (c) 2003,2007,2008 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -2211,12 +2211,12 @@ nvme[0-9]*ns[0-9]*)
 		warn "bad nsid for $i: $subunit"
 		break
 	fi
-	mkdev nvme${unit}ns$subunit c %nvmens_chr% $(($unit * 65536 + $subunit))
+	mkdev nvme${unit}ns$subunit c %nvme_chr% $(($unit * 65536 + $subunit))
 	;;
 
 nvme[0-9]*)
 	unit=${i#nvme}
-	mkdev nvme$unit c %nvme_chr% $unit
+	mkdev nvme$unit c %nvme_chr% $(($unit * 65536))
 	;;
 
 midevend)

Index: src/sys/conf/majors
diff -u src/sys/conf/majors:1.74 src/sys/conf/majors:1.75
--- src/sys/conf/majors:1.74	Sat Jun  4 16:11:50 2016
+++ src/sys/conf/majors	Thu Sep  8 15:00:08 2016
@@ -1,4 +1,4 @@
-# $NetBSD: majors,v 1.74 2016/06/04 16:11:50 nonaka Exp $
+# $NetBSD: majors,v 1.75 2016/09/08 15:00:08 nonaka Exp $
 #
 # Device majors for Machine-Independent drivers.
 #
@@ -73,4 +73,3 @@ device-major lua       char 209         
 
 device-major hdmicec   char 340            hdmicec
 device-major nvme      char 341		   nvme
-device-major nvmens    char 342		   nvmens

Index: src/sys/dev/ic/nvme.c
diff -u src/sys/dev/ic/nvme.c:1.4 src/sys/dev/ic/nvme.c:1.5
--- src/sys/dev/ic/nvme.c:1.4	Thu Sep  8 04:41:16 2016
+++ src/sys/dev/ic/nvme.c	Thu Sep  8 15:00:08 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: nvme.c,v 1.4 2016/09/08 04:41:16 nonaka Exp $	*/
+/*	$NetBSD: nvme.c,v 1.5 2016/09/08 15:00:08 nonaka Exp $	*/
 /*	$OpenBSD: nvme.c,v 1.49 2016/04/18 05:59:50 dlg Exp $ */
 
 /*
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvme.c,v 1.4 2016/09/08 04:41:16 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvme.c,v 1.5 2016/09/08 15:00:08 nonaka Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1436,7 +1436,6 @@ nvme_dmamem_free(struct nvme_softc *sc, 
  * ioctl
  */
 
-/* nvme */
 dev_type_open(nvmeopen);
 dev_type_close(nvmeclose);
 dev_type_ioctl(nvmeioctl);
@@ -1465,88 +1464,6 @@ int
 nvmeopen(dev_t dev, int flag, int mode, struct lwp *l)
 {
 	struct nvme_softc *sc;
-	int unit = minor(dev);
-
-	if ((sc = device_lookup_private(&nvme_cd, unit)) == NULL)
-		return ENXIO;
-	if ((sc->sc_flags & NVME_F_ATTACHED) == 0)
-		return ENXIO;
-	if (ISSET(sc->sc_flags, NVME_F_OPEN))
-		return EBUSY;
-
-	SET(sc->sc_flags, NVME_F_OPEN);
-	return 0;
-}
-
-/*
- * Accept the last close on the control device.
- */
-int
-nvmeclose(dev_t dev, int flag, int mode, struct lwp *l)
-{
-	struct nvme_softc *sc;
-	int unit = minor(dev);
-
-	sc = device_lookup_private(&nvme_cd, unit);
-	if (sc == NULL)
-		return ENXIO;
-
-	CLR(sc->sc_flags, NVME_F_OPEN);
-	return 0;
-}
-
-/*
- * Handle control operations.
- */
-int
-nvmeioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
-{
-	struct nvme_softc *sc;
-	struct nvme_pt_command *pt;
-	int unit = minor(dev);
-
-	sc = device_lookup_private(&nvme_cd, unit);
-	if (sc == NULL)
-		return ENXIO;
-
-	switch (cmd) {
-	case NVME_PASSTHROUGH_CMD:
-		pt = (struct nvme_pt_command *)data;
-		return nvme_command_passthrough(sc, pt, pt->cmd.nsid, l, true);
-	}
-
-	return ENOTTY;
-}
-
-/* nvmens */
-dev_type_open(nvmensopen);
-dev_type_close(nvmensclose);
-dev_type_ioctl(nvmensioctl);
-
-const struct cdevsw nvmens_cdevsw = {
-	.d_open = nvmensopen,
-	.d_close = nvmensclose,
-	.d_read = noread,
-	.d_write = nowrite,
-	.d_ioctl = nvmensioctl,
-	.d_stop = nostop,
-	.d_tty = notty,
-	.d_poll = nopoll,
-	.d_mmap = nommap,
-	.d_kqfilter = nokqfilter,
-	.d_discard = nodiscard,
-	.d_flag = D_OTHER,
-};
-
-extern struct cfdriver nvmens_cd;
-
-/*
- * Accept an open operation on the control device.
- */
-int
-nvmensopen(dev_t dev, int flag, int mode, struct lwp *l)
-{
-	struct nvme_softc *sc;
 	int unit = minor(dev) / 0x10000;
 	int nsid = minor(dev) & 0xffff;
 	int nsidx;
@@ -1555,16 +1472,21 @@ nvmensopen(dev_t dev, int flag, int mode
 		return ENXIO;
 	if ((sc->sc_flags & NVME_F_ATTACHED) == 0)
 		return ENXIO;
-	if (nsid == 0)
-		return ENXIO;
-
-	nsidx = nsid - 1;
-	if (nsidx >= sc->sc_nn || sc->sc_namespaces[nsidx].dev == NULL)
-		return ENXIO;
-	if (ISSET(sc->sc_namespaces[nsidx].flags, NVME_NS_F_OPEN))
-		return EBUSY;
 
-	SET(sc->sc_namespaces[nsidx].flags, NVME_NS_F_OPEN);
+	if (nsid == 0) {
+		/* controller */
+		if (ISSET(sc->sc_flags, NVME_F_OPEN))
+			return EBUSY;
+		SET(sc->sc_flags, NVME_F_OPEN);
+	} else {
+		/* namespace */
+		nsidx = nsid - 1;
+		if (nsidx >= sc->sc_nn || sc->sc_namespaces[nsidx].dev == NULL)
+			return ENXIO;
+		if (ISSET(sc->sc_namespaces[nsidx].flags, NVME_NS_F_OPEN))
+			return EBUSY;
+		SET(sc->sc_namespaces[nsidx].flags, NVME_NS_F_OPEN);
+	}
 	return 0;
 }
 
@@ -1572,7 +1494,7 @@ nvmensopen(dev_t dev, int flag, int mode
  * Accept the last close on the control device.
  */
 int
-nvmensclose(dev_t dev, int flag, int mode, struct lwp *l)
+nvmeclose(dev_t dev, int flag, int mode, struct lwp *l)
 {
 	struct nvme_softc *sc;
 	int unit = minor(dev) / 0x10000;
@@ -1582,14 +1504,18 @@ nvmensclose(dev_t dev, int flag, int mod
 	sc = device_lookup_private(&nvme_cd, unit);
 	if (sc == NULL)
 		return ENXIO;
-	if (nsid == 0)
-		return ENXIO;
 
-	nsidx = nsid - 1;
-	if (nsidx >= sc->sc_nn)
-		return ENXIO;
+	if (nsid == 0) {
+		/* controller */
+		CLR(sc->sc_flags, NVME_F_OPEN);
+	} else {
+		/* namespace */
+		nsidx = nsid - 1;
+		if (nsidx >= sc->sc_nn)
+			return ENXIO;
+		CLR(sc->sc_namespaces[nsidx].flags, NVME_NS_F_OPEN);
+	}
 
-	CLR(sc->sc_namespaces[nsidx].flags, NVME_NS_F_OPEN);
 	return 0;
 }
 
@@ -1597,21 +1523,22 @@ nvmensclose(dev_t dev, int flag, int mod
  * Handle control operations.
  */
 int
-nvmensioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
+nvmeioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
 {
 	struct nvme_softc *sc;
 	int unit = minor(dev) / 0x10000;
 	int nsid = minor(dev) & 0xffff;
+	struct nvme_pt_command *pt;
 
 	sc = device_lookup_private(&nvme_cd, unit);
 	if (sc == NULL)
 		return ENXIO;
-	if (nsid == 0)
-		return ENXIO;
 
 	switch (cmd) {
 	case NVME_PASSTHROUGH_CMD:
-		return nvme_command_passthrough(sc, data, nsid, l, false);
+		pt = data;
+		return nvme_command_passthrough(sc, data,
+		    nsid == 0 ? pt->cmd.nsid : nsid, l, nsid == 0);
 	}
 
 	return ENOTTY;

Reply via email to