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;