diff options
author | Mark Kettenis <kettenis@cvs.openbsd.org> | 2019-07-27 13:20:13 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@cvs.openbsd.org> | 2019-07-27 13:20:13 +0000 |
commit | 9c03f0a3261331e5f5a0ad156c197d08693b6d86 (patch) | |
tree | 96405a6d8b3ce1581aad893d69cbcc14c97b86d7 | |
parent | 91e5f8f62f5b075c1a32f841743d0b3544c750c1 (diff) |
Make target numbers match the NVMe namespace identifiers. This fixes booting
from nvme(4) on sparc64 as the OBP device paths contain namespace identifiers
that we end up matching to targets when trying to find the device we booted
from. Also results in (slightly) cleaner code and less confusion as the
numbers now match instead of being off-by-one.
ok dlg@
-rw-r--r-- | sys/dev/ic/nvme.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/sys/dev/ic/nvme.c b/sys/dev/ic/nvme.c index ffef0ee36fe..98f4a8e5d5c 100644 --- a/sys/dev/ic/nvme.c +++ b/sys/dev/ic/nvme.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nvme.c,v 1.62 2019/05/08 15:32:53 tedu Exp $ */ +/* $OpenBSD: nvme.c,v 1.63 2019/07/27 13:20:12 kettenis Exp $ */ /* * Copyright (c) 2014 David Gwynne <dlg@openbsd.org> @@ -365,14 +365,14 @@ nvme_attach(struct nvme_softc *sc) nvme_write4(sc, NVME_INTMC, 1); - sc->sc_namespaces = mallocarray(sc->sc_nn, sizeof(*sc->sc_namespaces), - M_DEVBUF, M_WAITOK|M_ZERO); + sc->sc_namespaces = mallocarray(sc->sc_nn + 1, + sizeof(*sc->sc_namespaces), M_DEVBUF, M_WAITOK|M_ZERO); sc->sc_link.adapter = &nvme_switch; sc->sc_link.adapter_softc = sc; - sc->sc_link.adapter_buswidth = sc->sc_nn; + sc->sc_link.adapter_buswidth = sc->sc_nn + 1; sc->sc_link.luns = 1; - sc->sc_link.adapter_target = sc->sc_nn; + sc->sc_link.adapter_target = 0; sc->sc_link.openings = 64; sc->sc_link.pool = &sc->sc_iopool; @@ -456,7 +456,7 @@ nvme_scsi_probe(struct scsi_link *link) memset(&sqe, 0, sizeof(sqe)); sqe.opcode = NVM_ADMIN_IDENTIFY; - htolem32(&sqe.nsid, link->target + 1); + htolem32(&sqe.nsid, link->target); htolem64(&sqe.entry.prp[0], NVME_DMA_DVA(mem)); htolem32(&sqe.cdw10, 0); @@ -654,7 +654,7 @@ nvme_scsi_io_fill(struct nvme_softc *sc, struct nvme_ccb *ccb, void *slot) sqe->opcode = ISSET(xs->flags, SCSI_DATA_IN) ? NVM_CMD_READ : NVM_CMD_WRITE; - htolem32(&sqe->nsid, link->target + 1); + htolem32(&sqe->nsid, link->target); htolem64(&sqe->entry.prp[0], dmap->dm_segs[0].ds_addr); switch (dmap->dm_nsegs) { @@ -730,7 +730,7 @@ nvme_scsi_sync_fill(struct nvme_softc *sc, struct nvme_ccb *ccb, void *slot) struct scsi_link *link = xs->sc_link; sqe->opcode = NVM_CMD_FLUSH; - htolem32(&sqe->nsid, link->target + 1); + htolem32(&sqe->nsid, link->target); } void @@ -1066,7 +1066,7 @@ nvme_identify(struct nvme_softc *sc, u_int mps) * At least one Apple NVMe device presents a second, bogus disk that is * inaccessible, so cap targets at 1. * - * sd1 at scsibus1 targ 1 lun 0: <NVMe, APPLE SSD AP0512, 16.1> [..] + * sd1 at scsibus1 targ 2 lun 0: <NVMe, APPLE SSD AP0512, 16.1> [..] * sd1: 0MB, 4096 bytes/sector, 2 sectors */ if (sc->sc_nn > 1 && @@ -1515,7 +1515,7 @@ nvme_hibernate_io(dev_t dev, daddr_t blkno, vaddr_t addr, size_t size, bus_sc = (struct scsibus_softc *)scsibus; SLIST_FOREACH(link, &bus_sc->sc_link_list, bus_list) { if (link->device_softc == disk) { - my->nsid = link->target + 1; + my->nsid = link->target; break; } } |