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]);
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to