From owner-svn-src-stable@FreeBSD.ORG Wed Jul 24 22:46:28 2013 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 52071D42; Wed, 24 Jul 2013 22:46:28 +0000 (UTC) (envelope-from jimharris@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 2E819202A; Wed, 24 Jul 2013 22:46:28 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r6OMkSYD038123; Wed, 24 Jul 2013 22:46:28 GMT (envelope-from jimharris@svn.freebsd.org) Received: (from jimharris@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r6OMkRLt038120; Wed, 24 Jul 2013 22:46:27 GMT (envelope-from jimharris@svn.freebsd.org) Message-Id: <201307242246.r6OMkRLt038120@svn.freebsd.org> From: Jim Harris Date: Wed, 24 Jul 2013 22:46:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r253630 - in stable/9: sbin/nvmecontrol sys/dev/nvme X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 24 Jul 2013 22:46:28 -0000 Author: jimharris Date: Wed Jul 24 22:46:27 2013 New Revision: 253630 URL: http://svnweb.freebsd.org/changeset/base/253630 Log: MFC r253474: 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. Approved by: re (kib) Sponsored by: Intel Modified: stable/9/sbin/nvmecontrol/devlist.c stable/9/sys/dev/nvme/nvme_ns.c stable/9/sys/dev/nvme/nvme_ns_cmd.c Directory Properties: stable/9/sbin/nvmecontrol/ (props changed) stable/9/sys/ (props changed) stable/9/sys/dev/ (props changed) Modified: stable/9/sbin/nvmecontrol/devlist.c ============================================================================== --- stable/9/sbin/nvmecontrol/devlist.c Wed Jul 24 22:44:46 2013 (r253629) +++ stable/9/sbin/nvmecontrol/devlist.c Wed Jul 24 22:46:27 2013 (r253630) @@ -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: stable/9/sys/dev/nvme/nvme_ns.c ============================================================================== --- stable/9/sys/dev/nvme/nvme_ns.c Wed Jul 24 22:44:46 2013 (r253629) +++ stable/9/sys/dev/nvme/nvme_ns.c Wed Jul 24 22:46:27 2013 (r253630) @@ -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: stable/9/sys/dev/nvme/nvme_ns_cmd.c ============================================================================== --- stable/9/sys/dev/nvme/nvme_ns_cmd.c Wed Jul 24 22:44:46 2013 (r253629) +++ stable/9/sys/dev/nvme/nvme_ns_cmd.c Wed Jul 24 22:46:27 2013 (r253630) @@ -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);