Author: jimharris
Date: Fri Jul 19 21:33:24 2013
New Revision: 253474
URL: http://svnweb.freebsd.org/changeset/base/253474

Log:
  Fix nvme(4) and nvd(4) to support non 512-byte sector sizes.
  
  Recent testing with QEMU that has variable sector size support for
  NVMe uncovered some of these issues.  Chatham prototype boards supported
  only 512 byte sectors.
  
  Sponsored by: Intel
  Reviewed by:  carl
  MFC after:    3 days

Modified:
  head/sbin/nvmecontrol/devlist.c
  head/sys/dev/nvme/nvme_ns.c
  head/sys/dev/nvme/nvme_ns_cmd.c

Modified: head/sbin/nvmecontrol/devlist.c
==============================================================================
--- head/sbin/nvmecontrol/devlist.c     Fri Jul 19 21:30:53 2013        
(r253473)
+++ head/sbin/nvmecontrol/devlist.c     Fri Jul 19 21:33:24 2013        
(r253474)
@@ -53,7 +53,7 @@ static inline uint32_t
 ns_get_sector_size(struct nvme_namespace_data *nsdata)
 {
 
-       return (1 << nsdata->lbaf[0].lbads);
+       return (1 << nsdata->lbaf[nsdata->flbas.format].lbads);
 }
 
 void

Modified: head/sys/dev/nvme/nvme_ns.c
==============================================================================
--- head/sys/dev/nvme/nvme_ns.c Fri Jul 19 21:30:53 2013        (r253473)
+++ head/sys/dev/nvme/nvme_ns.c Fri Jul 19 21:33:24 2013        (r253474)
@@ -155,7 +155,7 @@ nvme_ns_get_max_io_xfer_size(struct nvme
 uint32_t
 nvme_ns_get_sector_size(struct nvme_namespace *ns)
 {
-       return (1 << ns->data.lbaf[0].lbads);
+       return (1 << ns->data.lbaf[ns->data.flbas.format].lbads);
 }
 
 uint64_t
@@ -310,6 +310,16 @@ nvme_ns_construct(struct nvme_namespace 
        }
 #endif
 
+       /*
+        * Note: format is a 0-based value, so > is appropriate here,
+        *  not >=.
+        */
+       if (ns->data.flbas.format > ns->data.nlbaf) {
+               printf("lba format %d exceeds number supported (%d)\n",
+                   ns->data.flbas.format, ns->data.nlbaf+1);
+               return (1);
+       }
+
        if (ctrlr->cdata.oncs.dsm)
                ns->flags |= NVME_NS_DEALLOCATE_SUPPORTED;
 

Modified: head/sys/dev/nvme/nvme_ns_cmd.c
==============================================================================
--- head/sys/dev/nvme/nvme_ns_cmd.c     Fri Jul 19 21:30:53 2013        
(r253473)
+++ head/sys/dev/nvme/nvme_ns_cmd.c     Fri Jul 19 21:33:24 2013        
(r253474)
@@ -36,7 +36,8 @@ nvme_ns_cmd_read(struct nvme_namespace *
        struct nvme_request     *req;
        struct nvme_command     *cmd;
 
-       req = nvme_allocate_request_vaddr(payload, lba_count*512, cb_fn, 
cb_arg);
+       req = nvme_allocate_request_vaddr(payload,
+           lba_count*nvme_ns_get_sector_size(ns), cb_fn, cb_arg);
 
        if (req == NULL)
                return (ENOMEM);
@@ -89,8 +90,8 @@ nvme_ns_cmd_write(struct nvme_namespace 
        struct nvme_request     *req;
        struct nvme_command     *cmd;
 
-       req = nvme_allocate_request_vaddr(payload, lba_count*512, cb_fn,
-           cb_arg);
+       req = nvme_allocate_request_vaddr(payload,
+           lba_count*nvme_ns_get_sector_size(ns), cb_fn, cb_arg);
 
        if (req == NULL)
                return (ENOMEM);
_______________________________________________
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