svn commit: r330759 - in head: sbin/nvmecontrol sys/dev/nvme

Alexander Motin mav at FreeBSD.org
Sun Mar 11 05:09:03 UTC 2018


Author: mav
Date: Sun Mar 11 05:09:02 2018
New Revision: 330759
URL: https://svnweb.freebsd.org/changeset/base/330759

Log:
  Add new identify data structures fields from NVMe 1.3a.
  
  Some of them are already supported by existing hardware, so reporting
  them `nvmecontrol identify` can be useful.

Modified:
  head/sbin/nvmecontrol/identify.c
  head/sys/dev/nvme/nvme.h

Modified: head/sbin/nvmecontrol/identify.c
==============================================================================
--- head/sbin/nvmecontrol/identify.c	Sun Mar 11 04:37:05 2018	(r330758)
+++ head/sbin/nvmecontrol/identify.c	Sun Mar 11 05:09:02 2018	(r330759)
@@ -95,25 +95,35 @@ print_controller(struct nvme_controller_data *cdata)
 
 	printf("Controller Capabilities/Features\n");
 	printf("================================\n");
-	printf("Vendor ID:                  %04x\n", cdata->vid);
-	printf("Subsystem Vendor ID:        %04x\n", cdata->ssvid);
+	printf("Vendor ID:                   %04x\n", cdata->vid);
+	printf("Subsystem Vendor ID:         %04x\n", cdata->ssvid);
 	nvme_strvis(str, cdata->sn, sizeof(str), NVME_SERIAL_NUMBER_LENGTH);
-	printf("Serial Number:              %s\n", str);
+	printf("Serial Number:               %s\n", str);
 	nvme_strvis(str, cdata->mn, sizeof(str), NVME_MODEL_NUMBER_LENGTH);
-	printf("Model Number:               %s\n", str);
+	printf("Model Number:                %s\n", str);
 	nvme_strvis(str, cdata->fr, sizeof(str), NVME_FIRMWARE_REVISION_LENGTH);
-	printf("Firmware Version:           %s\n", str);
-	printf("Recommended Arb Burst:      %d\n", cdata->rab);
-	printf("IEEE OUI Identifier:        %02x %02x %02x\n",
+	printf("Firmware Version:            %s\n", str);
+	printf("Recommended Arb Burst:       %d\n", cdata->rab);
+	printf("IEEE OUI Identifier:         %02x %02x %02x\n",
 		cdata->ieee[0], cdata->ieee[1], cdata->ieee[2]);
-	printf("Multi-Interface Cap:        %02x\n", cdata->mic);
+	printf("Multi-Path I/O Capabilities: %s%s%s%s\n",
+	    (cdata->mic == 0) ? "Not Supported" : "",
+	    ((cdata->mic >> NVME_CTRLR_DATA_MIC_SRIOVVF_SHIFT) &
+	     NVME_CTRLR_DATA_MIC_SRIOVVF_MASK) ? "SR-IOV VF, " : "",
+	    ((cdata->mic >> NVME_CTRLR_DATA_MIC_MCTRLRS_SHIFT) &
+	     NVME_CTRLR_DATA_MIC_MCTRLRS_MASK) ? "Multiple controllers, " : "",
+	    ((cdata->mic >> NVME_CTRLR_DATA_MIC_MPORTS_SHIFT) &
+	     NVME_CTRLR_DATA_MIC_MPORTS_MASK) ? "Multiple ports" : "");
 	/* TODO: Use CAP.MPSMIN to determine true memory page size. */
-	printf("Max Data Transfer Size:     ");
+	printf("Max Data Transfer Size:      ");
 	if (cdata->mdts == 0)
 		printf("Unlimited\n");
 	else
 		printf("%d\n", PAGE_SIZE * (1 << cdata->mdts));
-	printf("Controller ID:              0x%02x\n", cdata->ctrlr_id);
+	printf("Controller ID:               0x%02x\n", cdata->ctrlr_id);
+	printf("Version:                     %d.%d.%d\n",
+	    (cdata->ver >> 16) & 0xffff, (cdata->ver >> 8) & 0xff,
+	    cdata->ver & 0xff);
 	printf("\n");
 
 	printf("Admin Command Set Attributes\n");
@@ -126,6 +136,21 @@ print_controller(struct nvme_controller_data *cdata)
 		fw ? "Supported" : "Not Supported");
 	printf("Namespace Managment:         %s\n",
 		nsmgmt ? "Supported" : "Not Supported");
+	printf("Device Self-test:            %sSupported\n",
+	    ((oacs >> NVME_CTRLR_DATA_OACS_SELFTEST_SHIFT) &
+	     NVME_CTRLR_DATA_OACS_SELFTEST_MASK) ? "" : "Not ");
+	printf("Directives:                  %sSupported\n",
+	    ((oacs >> NVME_CTRLR_DATA_OACS_DIRECTIVES_SHIFT) &
+	     NVME_CTRLR_DATA_OACS_DIRECTIVES_MASK) ? "" : "Not ");
+	printf("NVMe-MI Send/Receive:        %sSupported\n",
+	    ((oacs >> NVME_CTRLR_DATA_OACS_NVMEMI_SHIFT) &
+	     NVME_CTRLR_DATA_OACS_NVMEMI_MASK) ? "" : "Not ");
+	printf("Virtualization Management:   %sSupported\n",
+	    ((oacs >> NVME_CTRLR_DATA_OACS_VM_SHIFT) &
+	     NVME_CTRLR_DATA_OACS_VM_MASK) ? "" : "Not ");
+	printf("Doorbell Buffer Config       %sSupported\n",
+	    ((oacs >> NVME_CTRLR_DATA_OACS_DBBUFFER_SHIFT) &
+	     NVME_CTRLR_DATA_OACS_DBBUFFER_MASK) ? "" : "Not ");
 	printf("Abort Command Limit:         %d\n", cdata->acl+1);
 	printf("Async Event Request Limit:   %d\n", cdata->aerl+1);
 	printf("Number of Firmware Slots:    ");
@@ -159,6 +184,18 @@ print_controller(struct nvme_controller_data *cdata)
 		write_unc ? "Supported" : "Not Supported");
 	printf("Dataset Management Command:  %s\n",
 		dsm ? "Supported" : "Not Supported");
+	printf("Write Zeroes Command:        %sSupported\n",
+	    ((oncs >> NVME_CTRLR_DATA_ONCS_WRZERO_SHIFT) &
+	     NVME_CTRLR_DATA_ONCS_WRZERO_MASK) ? "" : "Not ");
+	printf("Save Features:               %sSupported\n",
+	    ((oncs >> NVME_CTRLR_DATA_ONCS_SAVEFEAT_SHIFT) &
+	     NVME_CTRLR_DATA_ONCS_SAVEFEAT_MASK) ? "" : "Not ");
+	printf("Reservations:                %sSupported\n",
+	    ((oncs >> NVME_CTRLR_DATA_ONCS_RESERV_SHIFT) &
+	     NVME_CTRLR_DATA_ONCS_RESERV_MASK) ? "" : "Not ");
+	printf("Timestamp feature:           %sSupported\n",
+	    ((oncs >> NVME_CTRLR_DATA_ONCS_TIMESTAMP_SHIFT) &
+	     NVME_CTRLR_DATA_ONCS_TIMESTAMP_MASK) ? "" : "Not ");
 	printf("Volatile Write Cache:        %s\n",
 		vwc_present ? "Present" : "Not Present");
 
@@ -177,8 +214,8 @@ static void
 print_namespace(struct nvme_namespace_data *nsdata)
 {
 	uint32_t	i;
-	uint32_t	lbaf, lbads, ms;
-	uint8_t		thin_prov;
+	uint32_t	lbaf, lbads, ms, rp;
+	uint8_t		thin_prov, ptype;
 	uint8_t		flbas_fmt;
 
 	thin_prov = (nsdata->nsfeat >> NVME_NS_DATA_NSFEAT_THIN_PROV_SHIFT) &
@@ -200,14 +237,79 @@ print_namespace(struct nvme_namespace_data *nsdata)
 		thin_prov ? "Supported" : "Not Supported");
 	printf("Number of LBA Formats:       %d\n", nsdata->nlbaf+1);
 	printf("Current LBA Format:          LBA Format #%02d\n", flbas_fmt);
+	printf("Data Protection Caps:        %s%s%s%s%s%s\n",
+	    (nsdata->dpc == 0) ? "Not Supported" : "",
+	    ((nsdata->dpc >> NVME_NS_DATA_DPC_MD_END_SHIFT) &
+	     NVME_NS_DATA_DPC_MD_END_MASK) ? "Last Bytes, " : "",
+	    ((nsdata->dpc >> NVME_NS_DATA_DPC_MD_START_SHIFT) &
+	     NVME_NS_DATA_DPC_MD_START_MASK) ? "First Bytes, " : "",
+	    ((nsdata->dpc >> NVME_NS_DATA_DPC_PIT3_SHIFT) &
+	     NVME_NS_DATA_DPC_PIT3_MASK) ? "Type 3, " : "",
+	    ((nsdata->dpc >> NVME_NS_DATA_DPC_PIT2_SHIFT) &
+	     NVME_NS_DATA_DPC_PIT2_MASK) ? "Type 2, " : "",
+	    ((nsdata->dpc >> NVME_NS_DATA_DPC_PIT2_MASK) &
+	     NVME_NS_DATA_DPC_PIT1_MASK) ? "Type 1" : "");
+	printf("Data Protection Settings:    ");
+	ptype = (nsdata->dps >> NVME_NS_DATA_DPS_PIT_SHIFT) &
+	    NVME_NS_DATA_DPS_PIT_MASK;
+	if (ptype) {
+		printf("Type %d, %s Bytes\n", ptype,
+		    ((nsdata->dps >> NVME_NS_DATA_DPS_MD_START_SHIFT) &
+		     NVME_NS_DATA_DPS_MD_START_MASK) ? "First" : "Last");
+	} else {
+		printf("Not Enabled\n");
+	}
+	printf("Multi-Path I/O Capabilities: %s%s\n",
+	    (nsdata->nmic == 0) ? "Not Supported" : "",
+	    ((nsdata->nmic >> NVME_NS_DATA_NMIC_MAY_BE_SHARED_SHIFT) &
+	     NVME_NS_DATA_NMIC_MAY_BE_SHARED_MASK) ? "May be shared" : "");
+	printf("Reservation Capabilities:    %s%s%s%s%s%s%s%s%s\n",
+	    (nsdata->rescap == 0) ? "Not Supported" : "",
+	    ((nsdata->rescap >> NVME_NS_DATA_RESCAP_IEKEY13_SHIFT) &
+	     NVME_NS_DATA_RESCAP_IEKEY13_MASK) ? "IEKEY13, " : "",
+	    ((nsdata->rescap >> NVME_NS_DATA_RESCAP_EX_AC_AR_SHIFT) &
+	     NVME_NS_DATA_RESCAP_EX_AC_AR_MASK) ? "EX_AC_AR, " : "",
+	    ((nsdata->rescap >> NVME_NS_DATA_RESCAP_WR_EX_AR_SHIFT) &
+	     NVME_NS_DATA_RESCAP_WR_EX_AR_MASK) ? "WR_EX_AR, " : "",
+	    ((nsdata->rescap >> NVME_NS_DATA_RESCAP_EX_AC_RO_SHIFT) &
+	     NVME_NS_DATA_RESCAP_EX_AC_RO_MASK) ? "EX_AC_RO, " : "",
+	    ((nsdata->rescap >> NVME_NS_DATA_RESCAP_WR_EX_RO_SHIFT) &
+	     NVME_NS_DATA_RESCAP_WR_EX_RO_MASK) ? "WR_EX_RO, " : "",
+	    ((nsdata->rescap >> NVME_NS_DATA_RESCAP_EX_AC_SHIFT) &
+	     NVME_NS_DATA_RESCAP_EX_AC_MASK) ? "EX_AC, " : "",
+	    ((nsdata->rescap >> NVME_NS_DATA_RESCAP_WR_EX_SHIFT) &
+	     NVME_NS_DATA_RESCAP_WR_EX_MASK) ? "WR_EX, " : "",
+	    ((nsdata->rescap >> NVME_NS_DATA_RESCAP_PTPL_SHIFT) &
+	     NVME_NS_DATA_RESCAP_PTPL_MASK) ? "PTPL" : "");
+	printf("Format Progress Indicator:   ");
+	if ((nsdata->fpi >> NVME_NS_DATA_FPI_SUPP_SHIFT) &
+	    NVME_NS_DATA_FPI_SUPP_MASK) {
+		printf("%u%% remains\n",
+		    (nsdata->fpi >> NVME_NS_DATA_FPI_PERC_SHIFT) &
+		    NVME_NS_DATA_FPI_PERC_MASK);
+	} else
+		printf("Not Supported\n");
+	printf("Optimal I/O Boundary (LBAs): %u\n", nsdata->noiob);
+	printf("Globally Unique Identifier:  ");
+	for (i = 0; i < sizeof(nsdata->nguid); i++)
+		printf("%02x", nsdata->nguid[i]);
+	printf("\n");
+	printf("IEEE EUI64:                  ");
+	for (i = 0; i < sizeof(nsdata->eui64); i++)
+		printf("%02x", nsdata->eui64[i]);
+	printf("\n");
 	for (i = 0; i <= nsdata->nlbaf; i++) {
 		lbaf = nsdata->lbaf[i];
 		lbads = (lbaf >> NVME_NS_DATA_LBAF_LBADS_SHIFT) &
 			NVME_NS_DATA_LBAF_LBADS_MASK;
 		ms = (lbaf >> NVME_NS_DATA_LBAF_MS_SHIFT) &
 			NVME_NS_DATA_LBAF_MS_MASK;
-		printf("LBA Format #%02d: Data Size: %5d  Metadata Size: %5d\n",
-		    i, 1 << lbads, ms);
+		rp = (lbaf >> NVME_NS_DATA_LBAF_RP_SHIFT) &
+			NVME_NS_DATA_LBAF_RP_MASK;
+		printf("LBA Format #%02d: Data Size: %5d  Metadata Size: %5d"
+		    "  Performance: %s\n",
+		    i, 1 << lbads, ms, (rp == 0) ? "Best" :
+		    (rp == 1) ? "Better" : (rp == 2) ? "Good" : "Degraded");
 	}
 }
 
@@ -252,7 +354,7 @@ identify_ctrlr(int argc, char *argv[])
 			hexlength = sizeof(struct nvme_controller_data);
 		else
 			hexlength = offsetof(struct nvme_controller_data,
-			    reserved5);
+			    reserved8);
 		print_hex(&cdata, hexlength);
 		exit(0);
 	}

Modified: head/sys/dev/nvme/nvme.h
==============================================================================
--- head/sys/dev/nvme/nvme.h	Sun Mar 11 04:37:05 2018	(r330758)
+++ head/sys/dev/nvme/nvme.h	Sun Mar 11 05:09:02 2018	(r330759)
@@ -153,6 +153,17 @@
 #define NVME_PWR_ST_APS_SHIFT				(6)
 #define NVME_PWR_ST_APS_MASK				(0x3)
 
+/** Controller Multi-path I/O and Namespace Sharing Capabilities */
+/* More then one port */
+#define NVME_CTRLR_DATA_MIC_MPORTS_SHIFT		(0)
+#define NVME_CTRLR_DATA_MIC_MPORTS_MASK			(0x1)
+/* More then one controller */
+#define NVME_CTRLR_DATA_MIC_MCTRLRS_SHIFT		(1)
+#define NVME_CTRLR_DATA_MIC_MCTRLRS_MASK		(0x1)
+/* SR-IOV Virtual Function */
+#define NVME_CTRLR_DATA_MIC_SRIOVVF_SHIFT		(2)
+#define NVME_CTRLR_DATA_MIC_SRIOVVF_MASK		(0x1)
+
 /** OACS - optional admin command support */
 /* supports security send/receive commands */
 #define NVME_CTRLR_DATA_OACS_SECURITY_SHIFT		(0)
@@ -166,6 +177,21 @@
 /* supports namespace management commands */
 #define NVME_CTRLR_DATA_OACS_NSMGMT_SHIFT		(3)
 #define NVME_CTRLR_DATA_OACS_NSMGMT_MASK		(0x1)
+/* supports Device Self-test command */
+#define NVME_CTRLR_DATA_OACS_SELFTEST_SHIFT		(4)
+#define NVME_CTRLR_DATA_OACS_SELFTEST_MASK		(0x1)
+/* supports Directives */
+#define NVME_CTRLR_DATA_OACS_DIRECTIVES_SHIFT		(5)
+#define NVME_CTRLR_DATA_OACS_DIRECTIVES_MASK		(0x1)
+/* supports NVMe-MI Send/Receive */
+#define NVME_CTRLR_DATA_OACS_NVMEMI_SHIFT		(6)
+#define NVME_CTRLR_DATA_OACS_NVMEMI_MASK		(0x1)
+/* supports Virtualization Management */
+#define NVME_CTRLR_DATA_OACS_VM_SHIFT			(7)
+#define NVME_CTRLR_DATA_OACS_VM_MASK			(0x1)
+/* supports Doorbell Buffer Config */
+#define NVME_CTRLR_DATA_OACS_DBBUFFER_SHIFT		(8)
+#define NVME_CTRLR_DATA_OACS_DBBUFFER_MASK		(0x1)
 
 /** firmware updates */
 /* first slot is read-only */
@@ -209,6 +235,14 @@
 #define NVME_CTRLR_DATA_ONCS_WRITE_UNC_MASK		(0x1)
 #define NVME_CTRLR_DATA_ONCS_DSM_SHIFT			(2)
 #define NVME_CTRLR_DATA_ONCS_DSM_MASK			(0x1)
+#define NVME_CTRLR_DATA_ONCS_WRZERO_SHIFT		(3)
+#define NVME_CTRLR_DATA_ONCS_WRZERO_MASK		(0x1)
+#define NVME_CTRLR_DATA_ONCS_SAVEFEAT_SHIFT		(4)
+#define NVME_CTRLR_DATA_ONCS_SAVEFEAT_MASK		(0x1)
+#define NVME_CTRLR_DATA_ONCS_RESERV_SHIFT		(5)
+#define NVME_CTRLR_DATA_ONCS_RESERV_MASK		(0x1)
+#define NVME_CTRLR_DATA_ONCS_TIMESTAMP_SHIFT		(6)
+#define NVME_CTRLR_DATA_ONCS_TIMESTAMP_MASK		(0x1)
 
 /** volatile write cache */
 #define NVME_CTRLR_DATA_VWC_PRESENT_SHIFT		(0)
@@ -218,6 +252,15 @@
 /* thin provisioning */
 #define NVME_NS_DATA_NSFEAT_THIN_PROV_SHIFT		(0)
 #define NVME_NS_DATA_NSFEAT_THIN_PROV_MASK		(0x1)
+/* NAWUN, NAWUPF, and NACWU fields are valid */
+#define NVME_NS_DATA_NSFEAT_NA_FIELDS_SHIFT		(1)
+#define NVME_NS_DATA_NSFEAT_NA_FIELDS_MASK		(0x1)
+/* Deallocated or Unwritten Logical Block errors supported */
+#define NVME_NS_DATA_NSFEAT_DEALLOC_SHIFT		(2)
+#define NVME_NS_DATA_NSFEAT_DEALLOC_MASK		(0x1)
+/* NGUID and EUI64 fields are not reusable */
+#define NVME_NS_DATA_NSFEAT_NO_ID_REUSE_SHIFT		(3)
+#define NVME_NS_DATA_NSFEAT_NO_ID_REUSE_MASK		(0x1)
 
 /** formatted lba size */
 #define NVME_NS_DATA_FLBAS_FORMAT_SHIFT			(0)
@@ -259,6 +302,45 @@
 #define NVME_NS_DATA_DPS_MD_START_SHIFT			(3)
 #define NVME_NS_DATA_DPS_MD_START_MASK			(0x1)
 
+/** Namespace Multi-path I/O and Namespace Sharing Capabilities */
+/* the namespace may be attached to two or more controllers */
+#define NVME_NS_DATA_NMIC_MAY_BE_SHARED_SHIFT		(0)
+#define NVME_NS_DATA_NMIC_MAY_BE_SHARED_MASK		(0x1)
+
+/** Reservation Capabilities */
+/* Persist Through Power Loss */
+#define NVME_NS_DATA_RESCAP_PTPL_SHIFT		(0)
+#define NVME_NS_DATA_RESCAP_PTPL_MASK		(0x1)
+/* supports the Write Exclusive */
+#define NVME_NS_DATA_RESCAP_WR_EX_SHIFT		(1)
+#define NVME_NS_DATA_RESCAP_WR_EX_MASK		(0x1)
+/* supports the Exclusive Access */
+#define NVME_NS_DATA_RESCAP_EX_AC_SHIFT		(2)
+#define NVME_NS_DATA_RESCAP_EX_AC_MASK		(0x1)
+/* supports the Write Exclusive – Registrants Only */
+#define NVME_NS_DATA_RESCAP_WR_EX_RO_SHIFT	(3)
+#define NVME_NS_DATA_RESCAP_WR_EX_RO_MASK	(0x1)
+/* supports the Exclusive Access - Registrants Only */
+#define NVME_NS_DATA_RESCAP_EX_AC_RO_SHIFT	(4)
+#define NVME_NS_DATA_RESCAP_EX_AC_RO_MASK	(0x1)
+/* supports the Write Exclusive – All Registrants */
+#define NVME_NS_DATA_RESCAP_WR_EX_AR_SHIFT	(5)
+#define NVME_NS_DATA_RESCAP_WR_EX_AR_MASK	(0x1)
+/* supports the Exclusive Access - All Registrants */
+#define NVME_NS_DATA_RESCAP_EX_AC_AR_SHIFT	(6)
+#define NVME_NS_DATA_RESCAP_EX_AC_AR_MASK	(0x1)
+/* Ignore Existing Key is used as defined in revision 1.3 or later */
+#define NVME_NS_DATA_RESCAP_IEKEY13_SHIFT	(7)
+#define NVME_NS_DATA_RESCAP_IEKEY13_MASK	(0x1)
+
+/** Format Progress Indicator */
+/* percentage of the Format NVM command that remains to be completed */
+#define NVME_NS_DATA_FPI_PERC_SHIFT		(0)
+#define NVME_NS_DATA_FPI_PERC_MASK		(0x7f)
+/* namespace supports the Format Progress Indicator */
+#define NVME_NS_DATA_FPI_SUPP_SHIFT		(7)
+#define NVME_NS_DATA_FPI_SUPP_MASK		(0x1)
+
 /** lba format support */
 /* metadata size */
 #define NVME_NS_DATA_LBAF_MS_SHIFT			(0)
@@ -719,12 +801,35 @@ struct nvme_controller_data {
 	/** volatile write cache */
 	uint8_t			vwc;
 
-	/* TODO: flesh out remaining nvm command set attributes */
-	uint8_t			reserved5[178];
+	/** Atomic Write Unit Normal */
+	uint16_t		awun;
 
-	/* bytes 704-2047: i/o command set attributes */
-	uint8_t			reserved6[1344];
+	/** Atomic Write Unit Power Fail */
+	uint16_t		awupf;
 
+	/** NVM Vendor Specific Command Configuration */
+	uint8_t			nvscc;
+	uint8_t			reserved5;
+
+	/** Atomic Compare & Write Unit */
+	uint16_t		acwu;
+	uint16_t		reserved6;
+
+	/** SGL Support */
+	uint32_t		sgls;
+
+	/* bytes 540-767: Reserved */
+	uint8_t			reserved7[228];
+
+	/** NVM Subsystem NVMe Qualified Name */
+	uint8_t			subnqn[256];
+
+	/* bytes 1024-1791: Reserved */
+	uint8_t			reserved8[768];
+
+	/* bytes 1792-2047: NVMe over Fabrics specification */
+	uint8_t			reserved9[256];
+
 	/* bytes 2048-3071: power state descriptors */
 	struct nvme_power_state power_state[32];
 
@@ -763,8 +868,51 @@ struct nvme_namespace_data {
 	/** end-to-end data protection type settings */
 	uint8_t			dps;
 
-	uint8_t			reserved5[98];
+	/** Namespace Multi-path I/O and Namespace Sharing Capabilities */
+	uint8_t			nmic;
 
+	/** Reservation Capabilities */
+	uint8_t			rescap;
+
+	/** Format Progress Indicator */
+	uint8_t			fpi;
+
+	/** Deallocate Logical Block Features */
+	uint8_t			dlfeat;
+
+	/** Namespace Atomic Write Unit Normal  */
+	uint16_t		nawun;
+
+	/** Namespace Atomic Write Unit Power Fail */
+	uint16_t		nawupf;
+
+	/** Namespace Atomic Compare & Write Unit */
+	uint16_t		nacwu;
+
+	/** Namespace Atomic Boundary Size Normal */
+	uint16_t		nabsn;
+
+	/** Namespace Atomic Boundary Offset */
+	uint16_t		nabo;
+
+	/** Namespace Atomic Boundary Size Power Fail */
+	uint16_t		nabspf;
+
+	/** Namespace Optimal IO Boundary */
+	uint16_t		noiob;
+
+	/** NVM Capacity */
+	uint8_t			nvmcap[16];
+
+	/* bytes 64-103: Reserved */
+	uint8_t			reserved5[40];
+
+	/** Namespace Globally Unique Identifier */
+	uint8_t			nguid[16];
+
+	/** IEEE Extended Unique Identifier */
+	uint8_t			eui64[8];
+
 	/** lba format support */
 	uint32_t		lbaf[16];
 
@@ -1154,6 +1302,10 @@ void	nvme_controller_data_swapbytes(struct nvme_contro
 	s->nn = le32toh(s->nn);
 	s->oncs = le16toh(s->oncs);
 	s->fuses = le16toh(s->fuses);
+	s->awun = le16toh(s->awun);
+	s->awupf = le16toh(s->awupf);
+	s->acwu = le16toh(s->acwu);
+	s->sgls = le32toh(s->sgls);
 	for (i = 0; i < 32; i++)
 		nvme_power_state_swapbytes(&s->power_state[i]);
 }
@@ -1166,6 +1318,13 @@ void	nvme_namespace_data_swapbytes(struct nvme_namespa
 	s->nsze = le64toh(s->nsze);
 	s->ncap = le64toh(s->ncap);
 	s->nuse = le64toh(s->nuse);
+	s->nawun = le16toh(s->nawun);
+	s->nawupf = le16toh(s->nawupf);
+	s->nacwu = le16toh(s->nacwu);
+	s->nabsn = le16toh(s->nabsn);
+	s->nabo = le16toh(s->nabo);
+	s->nabspf = le16toh(s->nabspf);
+	s->noiob = le16toh(s->noiob);
 	for (i = 0; i < 16; i++)
 		s->lbaf[i] = le32toh(s->lbaf[i]);
 }


More information about the svn-src-head mailing list