bhyve: implement NVMe Namespace Identification Descriptor
NVMe 1.3 compliant controllers must implement the Namespace Identification Descriptor structure (i.e. CNS=3). Previously this was unimplemented. Fixes UNH Test 1.1.4-0 Tested by: Jason Tubnor MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D24884
This commit is contained in:
parent
064ca48f57
commit
f8fa74679c
@ -870,10 +870,13 @@ nvme_opc_identify(struct pci_nvme_softc* sc, struct nvme_command* command,
|
|||||||
struct nvme_completion* compl)
|
struct nvme_completion* compl)
|
||||||
{
|
{
|
||||||
void *dest;
|
void *dest;
|
||||||
|
uint16_t status;
|
||||||
|
|
||||||
DPRINTF("%s identify 0x%x nsid 0x%x", __func__,
|
DPRINTF("%s identify 0x%x nsid 0x%x", __func__,
|
||||||
command->cdw10 & 0xFF, command->nsid);
|
command->cdw10 & 0xFF, command->nsid);
|
||||||
|
|
||||||
|
pci_nvme_status_genc(&status, NVME_SC_SUCCESS);
|
||||||
|
|
||||||
switch (command->cdw10 & 0xFF) {
|
switch (command->cdw10 & 0xFF) {
|
||||||
case 0x00: /* return Identify Namespace data structure */
|
case 0x00: /* return Identify Namespace data structure */
|
||||||
nvme_prp_memcpy(sc->nsc_pi->pi_vmctx, command->prp1,
|
nvme_prp_memcpy(sc->nsc_pi->pi_vmctx, command->prp1,
|
||||||
@ -892,24 +895,30 @@ nvme_opc_identify(struct pci_nvme_softc* sc, struct nvme_command* command,
|
|||||||
((uint32_t *)dest)[0] = 1;
|
((uint32_t *)dest)[0] = 1;
|
||||||
((uint32_t *)dest)[1] = 0;
|
((uint32_t *)dest)[1] = 0;
|
||||||
break;
|
break;
|
||||||
case 0x11:
|
|
||||||
pci_nvme_status_genc(&compl->status,
|
|
||||||
NVME_SC_INVALID_NAMESPACE_OR_FORMAT);
|
|
||||||
return (1);
|
|
||||||
case 0x03: /* list of NSID structures in CDW1.NSID, 4096 bytes */
|
case 0x03: /* list of NSID structures in CDW1.NSID, 4096 bytes */
|
||||||
case 0x10:
|
if (command->nsid != 1) {
|
||||||
case 0x12:
|
pci_nvme_status_genc(&status,
|
||||||
case 0x13:
|
NVME_SC_INVALID_NAMESPACE_OR_FORMAT);
|
||||||
case 0x14:
|
break;
|
||||||
case 0x15:
|
}
|
||||||
|
dest = vm_map_gpa(sc->nsc_pi->pi_vmctx, command->prp1,
|
||||||
|
sizeof(uint32_t) * 1024);
|
||||||
|
/* All bytes after the descriptor shall be zero */
|
||||||
|
bzero(dest, sizeof(uint32_t) * 1024);
|
||||||
|
|
||||||
|
/* Return NIDT=1 (i.e. EUI64) descriptor */
|
||||||
|
((uint8_t *)dest)[0] = 1;
|
||||||
|
((uint8_t *)dest)[1] = sizeof(uint64_t);
|
||||||
|
bcopy(sc->nsdata.eui64, ((uint8_t *)dest) + 4, sizeof(uint64_t));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
DPRINTF("%s unsupported identify command requested 0x%x",
|
DPRINTF("%s unsupported identify command requested 0x%x",
|
||||||
__func__, command->cdw10 & 0xFF);
|
__func__, command->cdw10 & 0xFF);
|
||||||
pci_nvme_status_genc(&compl->status, NVME_SC_INVALID_FIELD);
|
pci_nvme_status_genc(&status, NVME_SC_INVALID_FIELD);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
pci_nvme_status_genc(&compl->status, NVME_SC_SUCCESS);
|
compl->status = status;
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user