Author: jimharris
Date: Tue Mar 26 21:00:18 2013
New Revision: 248756
URL: http://svnweb.freebsd.org/changeset/base/248756

Log:
  Create struct nvme_status.
  
  NVMe error log entries include status, so breaking this out into
  its own data structure allows it to be included in both the
  nvme_completion data structure as well as error log entry data
  structures.
  
  While here, expose nvme_completion_is_error(), and change all of
  the places that were explicitly looking at sc/sct bits to use this
  macro instead.
  
  Sponsored by: Intel
  Reviewed by:  carl

Modified:
  head/sys/dev/nvd/nvd.c
  head/sys/dev/nvme/nvme.c
  head/sys/dev/nvme/nvme.h
  head/sys/dev/nvme/nvme_ctrlr.c
  head/sys/dev/nvme/nvme_ns.c
  head/sys/dev/nvme/nvme_qpair.c
  head/sys/dev/nvme/nvme_test.c
  head/sys/dev/nvme/nvme_uio.c

Modified: head/sys/dev/nvd/nvd.c
==============================================================================
--- head/sys/dev/nvd/nvd.c      Tue Mar 26 20:56:58 2013        (r248755)
+++ head/sys/dev/nvd/nvd.c      Tue Mar 26 21:00:18 2013        (r248756)
@@ -153,7 +153,7 @@ nvd_ioctl(struct disk *ndisk, u_long cmd
 }
 
 static void
-nvd_done(void *arg, const struct nvme_completion *status)
+nvd_done(void *arg, const struct nvme_completion *cpl)
 {
        struct bio *bp;
        struct nvd_disk *ndisk;
@@ -168,7 +168,7 @@ nvd_done(void *arg, const struct nvme_co
         * TODO: add more extensive translation of NVMe status codes
         *  to different bio error codes (i.e. EIO, EINVAL, etc.)
         */
-       if (status->sf_sc || status->sf_sct) {
+       if (nvme_completion_is_error(cpl)) {
                bp->bio_error = EIO;
                bp->bio_flags |= BIO_ERROR;
                bp->bio_resid = bp->bio_bcount;

Modified: head/sys/dev/nvme/nvme.c
==============================================================================
--- head/sys/dev/nvme/nvme.c    Tue Mar 26 20:56:58 2013        (r248755)
+++ head/sys/dev/nvme/nvme.c    Tue Mar 26 21:00:18 2013        (r248756)
@@ -223,8 +223,8 @@ nvme_dump_completion(struct nvme_complet
        printf("cdw0:%08x sqhd:%04x sqid:%04x "
            "cid:%04x p:%x sc:%02x sct:%x m:%x dnr:%x\n",
            cpl->cdw0, cpl->sqhd, cpl->sqid,
-           cpl->cid, cpl->p, cpl->sf_sc, cpl->sf_sct, cpl->sf_m,
-           cpl->sf_dnr);
+           cpl->cid, cpl->status.p, cpl->status.sc, cpl->status.sct,
+           cpl->status.m, cpl->status.dnr);
 }
 
 void

Modified: head/sys/dev/nvme/nvme.h
==============================================================================
--- head/sys/dev/nvme/nvme.h    Tue Mar 26 20:56:58 2013        (r248755)
+++ head/sys/dev/nvme/nvme.h    Tue Mar 26 21:00:18 2013        (r248756)
@@ -223,26 +223,31 @@ struct nvme_command
        uint32_t cdw15;         /* command-specific */
 } __packed;
 
+struct nvme_status {
+
+       uint16_t p      :  1;   /* phase tag */
+       uint16_t sc     :  8;   /* status code */
+       uint16_t sct    :  3;   /* status code type */
+       uint16_t rsvd2  :  2;
+       uint16_t m      :  1;   /* more */
+       uint16_t dnr    :  1;   /* do not retry */
+} __packed;
+
 struct nvme_completion {
 
        /* dword 0 */
-       uint32_t cdw0;          /* command-specific */
+       uint32_t                cdw0;   /* command-specific */
 
        /* dword 1 */
-       uint32_t rsvd1;
+       uint32_t                rsvd1;
 
        /* dword 2 */
-       uint16_t sqhd;          /* submission queue head pointer */
-       uint16_t sqid;          /* submission queue identifier */
+       uint16_t                sqhd;   /* submission queue head pointer */
+       uint16_t                sqid;   /* submission queue identifier */
 
        /* dword 3 */
-       uint16_t cid;           /* command identifier */
-       uint16_t p      :  1;   /* phase tag */
-       uint16_t sf_sc  :  8;   /* status field - status code */
-       uint16_t sf_sct :  3;   /* status field - status code type */
-       uint16_t rsvd2  :  2;
-       uint16_t sf_m   :  1;   /* status field - more */
-       uint16_t sf_dnr :  1;   /* status field - do not retry */
+       uint16_t                cid;    /* command identifier */
+       struct nvme_status      status;
 } __packed;
 
 struct nvme_dsm_range {
@@ -686,6 +691,9 @@ enum nvme_io_test_flags {
        NVME_TEST_FLAG_REFTHREAD =      0x1,
 };
 
+#define nvme_completion_is_error(cpl)                                  \
+       ((cpl)->status.sc != 0 || (cpl)->status.sct != 0)
+
 #ifdef _KERNEL
 
 struct bio;

Modified: head/sys/dev/nvme/nvme_ctrlr.c
==============================================================================
--- head/sys/dev/nvme/nvme_ctrlr.c      Tue Mar 26 20:56:58 2013        
(r248755)
+++ head/sys/dev/nvme/nvme_ctrlr.c      Tue Mar 26 21:00:18 2013        
(r248756)
@@ -447,7 +447,7 @@ nvme_ctrlr_identify(struct nvme_controll
            nvme_ctrlr_cb, &cpl);
        status = msleep(&cpl, mtx, PRIBIO, "nvme_start", hz*5);
        mtx_unlock(mtx);
-       if ((status != 0) || cpl.sf_sc || cpl.sf_sct) {
+       if ((status != 0) || nvme_completion_is_error(&cpl)) {
                printf("nvme_identify_controller failed!\n");
                return (ENXIO);
        }
@@ -474,7 +474,7 @@ nvme_ctrlr_set_num_qpairs(struct nvme_co
            nvme_ctrlr_cb, &cpl);
        status = msleep(&cpl, mtx, PRIBIO, "nvme_start", hz*5);
        mtx_unlock(mtx);
-       if ((status != 0) || cpl.sf_sc || cpl.sf_sct) {
+       if ((status != 0) || nvme_completion_is_error(&cpl)) {
                printf("nvme_set_num_queues failed!\n");
                return (ENXIO);
        }
@@ -522,7 +522,7 @@ nvme_ctrlr_create_qpairs(struct nvme_con
                    nvme_ctrlr_cb, &cpl);
                status = msleep(&cpl, mtx, PRIBIO, "nvme_start", hz*5);
                mtx_unlock(mtx);
-               if ((status != 0) || cpl.sf_sc || cpl.sf_sct) {
+               if ((status != 0) || nvme_completion_is_error(&cpl)) {
                        printf("nvme_create_io_cq failed!\n");
                        return (ENXIO);
                }
@@ -532,7 +532,7 @@ nvme_ctrlr_create_qpairs(struct nvme_con
                    nvme_ctrlr_cb, &cpl);
                status = msleep(&cpl, mtx, PRIBIO, "nvme_start", hz*5);
                mtx_unlock(mtx);
-               if ((status != 0) || cpl.sf_sc || cpl.sf_sct) {
+               if ((status != 0) || nvme_completion_is_error(&cpl)) {
                        printf("nvme_create_io_sq failed!\n");
                        return (ENXIO);
                }
@@ -562,7 +562,7 @@ nvme_ctrlr_async_event_cb(void *arg, con
 {
        struct nvme_async_event_request *aer = arg;
 
-       if (cpl->sf_sc == NVME_SC_ABORTED_SQ_DELETION) {
+       if (cpl->status.sc == NVME_SC_ABORTED_SQ_DELETION) {
                /*
                 *  This is simulated when controller is being shut down, to
                 *  effectively abort outstanding asynchronous event requests
@@ -783,7 +783,7 @@ nvme_ctrlr_ioctl(struct cdev *cdev, u_lo
                    nvme_ctrlr_cb, &cpl);
                msleep(&cpl, mtx, PRIBIO, "nvme_ioctl", 0);
                mtx_unlock(mtx);
-               if (cpl.sf_sc || cpl.sf_sct)
+               if (nvme_completion_is_error(&cpl))
                        return (ENXIO);
                memcpy(arg, &ctrlr->cdata, sizeof(ctrlr->cdata));
                break;

Modified: head/sys/dev/nvme/nvme_ns.c
==============================================================================
--- head/sys/dev/nvme/nvme_ns.c Tue Mar 26 20:56:58 2013        (r248755)
+++ head/sys/dev/nvme/nvme_ns.c Tue Mar 26 21:00:18 2013        (r248756)
@@ -90,7 +90,7 @@ nvme_ns_ioctl(struct cdev *cdev, u_long 
                    nvme_ns_cb, &cpl);
                msleep(&cpl, mtx, PRIBIO, "nvme_ioctl", 0);
                mtx_unlock(mtx);
-               if (cpl.sf_sc || cpl.sf_sct)
+               if (nvme_completion_is_error(&cpl))
                        return (ENXIO);
                memcpy(arg, &ns->data, sizeof(ns->data));
                break;
@@ -132,7 +132,7 @@ nvme_ns_close(struct cdev *dev __unused,
 }
 
 static void
-nvme_ns_strategy_done(void *arg, const struct nvme_completion *status)
+nvme_ns_strategy_done(void *arg, const struct nvme_completion *cpl)
 {
        struct bio *bp = arg;
 
@@ -140,7 +140,7 @@ nvme_ns_strategy_done(void *arg, const s
         * TODO: add more extensive translation of NVMe status codes
         *  to different bio error codes (i.e. EIO, EINVAL, etc.)
         */
-       if (status->sf_sc || status->sf_sct) {
+       if (nvme_completion_is_error(cpl)) {
                bp->bio_error = EIO;
                bp->bio_flags |= BIO_ERROR;
                bp->bio_resid = bp->bio_bcount;
@@ -338,7 +338,7 @@ nvme_ns_construct(struct nvme_namespace 
                    nvme_ns_cb, &cpl);
                status = msleep(&cpl, mtx, PRIBIO, "nvme_start", hz*5);
                mtx_unlock(mtx);
-               if ((status != 0) || cpl.sf_sc || cpl.sf_sct) {
+               if ((status != 0) || nvme_completion_is_error(&cpl)) {
                        printf("nvme_identify_namespace failed!\n");
                        return (ENXIO);
                }

Modified: head/sys/dev/nvme/nvme_qpair.c
==============================================================================
--- head/sys/dev/nvme/nvme_qpair.c      Tue Mar 26 20:56:58 2013        
(r248755)
+++ head/sys/dev/nvme/nvme_qpair.c      Tue Mar 26 21:00:18 2013        
(r248756)
@@ -38,13 +38,6 @@ static void  _nvme_qpair_submit_request(s
                                           struct nvme_request *req);
 
 static boolean_t
-nvme_completion_is_error(struct nvme_completion *cpl)
-{
-
-       return (cpl->sf_sc != 0 || cpl->sf_sct != 0);
-}
-
-static boolean_t
 nvme_completion_is_retry(const struct nvme_completion *cpl)
 {
        /*
@@ -53,13 +46,13 @@ nvme_completion_is_retry(const struct nv
         *  NAMESPACE_NOT_READY is the only case where we should
         *  look at the DNR bit.
         */
-       switch (cpl->sf_sct) {
+       switch (cpl->status.sct) {
        case NVME_SCT_GENERIC:
-               switch (cpl->sf_sc) {
+               switch (cpl->status.sc) {
                case NVME_SC_ABORTED_BY_REQUEST:
                        return (1);
                case NVME_SC_NAMESPACE_NOT_READY:
-                       if (cpl->sf_dnr)
+                       if (cpl->status.dnr)
                                return (0);
                        else
                                return (1);
@@ -168,8 +161,8 @@ nvme_qpair_manual_complete_tracker(struc
        memset(&cpl, 0, sizeof(cpl));
        cpl.sqid = qpair->id;
        cpl.cid = tr->cid;
-       cpl.sf_sct = sct;
-       cpl.sf_sc = sc;
+       cpl.status.sct = sct;
+       cpl.status.sc = sc;
        nvme_qpair_complete_tracker(qpair, tr, &cpl, print_on_error);
 }
 
@@ -193,7 +186,7 @@ nvme_qpair_process_completions(struct nv
        while (1) {
                cpl = &qpair->cpl[qpair->cq_head];
 
-               if (cpl->p != qpair->phase)
+               if (cpl->status.p != qpair->phase)
                        break;
 
                tr = qpair->act_tr[cpl->cid];

Modified: head/sys/dev/nvme/nvme_test.c
==============================================================================
--- head/sys/dev/nvme/nvme_test.c       Tue Mar 26 20:56:58 2013        
(r248755)
+++ head/sys/dev/nvme/nvme_test.c       Tue Mar 26 21:00:18 2013        
(r248756)
@@ -172,14 +172,14 @@ nvme_ns_bio_test(void *arg)
 }
 
 static void
-nvme_ns_io_test_cb(void *arg, const struct nvme_completion *status)
+nvme_ns_io_test_cb(void *arg, const struct nvme_completion *cpl)
 {
        struct nvme_io_test_thread      *tth = arg;
        struct timeval                  t;
 
        tth->io_completed++;
 
-       if (status->sf_sc || status->sf_sct) {
+       if (nvme_completion_is_error(cpl)) {
                printf("%s: error occurred\n", __func__);
                wakeup_one(tth);
                return;

Modified: head/sys/dev/nvme/nvme_uio.c
==============================================================================
--- head/sys/dev/nvme/nvme_uio.c        Tue Mar 26 20:56:58 2013        
(r248755)
+++ head/sys/dev/nvme/nvme_uio.c        Tue Mar 26 21:00:18 2013        
(r248756)
@@ -35,12 +35,12 @@ __FBSDID("$FreeBSD$");
 #include "nvme_private.h"
 
 static void
-nvme_uio_done(void *arg, const struct nvme_completion *status)
+nvme_uio_done(void *arg, const struct nvme_completion *cpl)
 {
        struct mtx *mtx;
        struct uio *uio = arg;
 
-       if (status->sf_sc == 0 && status->sf_sct == 0)
+       if (!nvme_completion_is_error(cpl))
                uio->uio_resid = 0;
 
        mtx = mtx_pool_find(mtxpool_sleep, arg);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to