[PATCH] NVMe: Add SCSI VPD Block Limits Translation
Andrey Kuzmin
andrey.v.kuzmin at gmail.com
Fri Dec 5 06:03:42 PST 2014
On Dec 5, 2014 3:14 AM, "Keith Busch" <keith.busch at intel.com> wrote:
>
> This adds the translation for Inquriy VPD page b0 in accordance with
> the translation reference.
>
> Signed-off-by: Keith Busch <keith.busch at intel.com>
> ---
> drivers/block/nvme-scsi.c | 28 +++++++++++++++++++++++++++-
> 1 file changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/block/nvme-scsi.c b/drivers/block/nvme-scsi.c
> index d194ac2..85c4dab 100644
> --- a/drivers/block/nvme-scsi.c
> +++ b/drivers/block/nvme-scsi.c
> @@ -55,6 +55,7 @@ static int sg_version_num = 30534; /* 2 digits for each component */
> #define VPD_SERIAL_NUMBER 0x80
> #define VPD_DEVICE_IDENTIFIERS 0x83
> #define VPD_EXTENDED_INQUIRY 0x86
> +#define VPD_BLOCK_LIMITS 0xB0
> #define VPD_BLOCK_DEV_CHARACTERISTICS 0xB1
>
>
> /* CDB offsets */
> @@ -132,9 +133,10 @@ static int sg_version_num = 30534; /* 2 digits for each component */
> #define INQ_UNIT_SERIAL_NUMBER_PAGE 0x80
> #define INQ_DEVICE_IDENTIFICATION_PAGE 0x83
> #define INQ_EXTENDED_INQUIRY_DATA_PAGE 0x86
> +#define INQ_BDEV_LIMITS_PAGE 0xB0
> #define INQ_BDEV_CHARACTERISTICS_PAGE 0xB1
> #define INQ_SERIAL_NUMBER_LENGTH 0x14
> -#define INQ_NUM_SUPPORTED_VPD_PAGES 5
> +#define INQ_NUM_SUPPORTED_VPD_PAGES 6
> #define VERSION_SPC_4 0x06
> #define ACA_UNSUPPORTED 0
> #define STANDARD_INQUIRY_LENGTH 36
Are there any specific reasons for the above SPC-4 stuff to be defined
in the nvme driver instead of include/scsi where it seems to
(naturally) belong? Just my 0.02 :).
Regards,
Andrey
> @@ -747,6 +749,7 @@ static int nvme_trans_supported_vpd_pages(struct nvme_ns *ns,
> inq_response[6] = INQ_DEVICE_IDENTIFICATION_PAGE;
> inq_response[7] = INQ_EXTENDED_INQUIRY_DATA_PAGE;
> inq_response[8] = INQ_BDEV_CHARACTERISTICS_PAGE;
> + inq_response[9] = INQ_BDEV_LIMITS_PAGE;
>
> xfer_len = min(alloc_len, STANDARD_INQUIRY_LENGTH);
> res = nvme_trans_copy_to_user(hdr, inq_response, xfer_len);
> @@ -956,6 +959,25 @@ static int nvme_trans_ext_inq_page(struct nvme_ns *ns, struct sg_io_hdr *hdr,
> return res;
> }
>
> +static int nvme_trans_bdev_limits_page(struct nvme_ns *ns, struct sg_io_hdr *hdr,
> + u8 *inq_response, int alloc_len)
> +{
> + __be32 max_sectors = cpu_to_be32(queue_max_hw_sectors(ns->queue));
> + __be32 max_discard = cpu_to_be32(ns->queue->limits.max_discard_sectors);
> + __be32 discard_desc_count = cpu_to_be32(0x100);
> +
> + memset(inq_response, 0, STANDARD_INQUIRY_LENGTH);
> + inq_response[1] = VPD_BLOCK_LIMITS;
> + inq_response[3] = 0x3c; /* Page Length */
> + memcpy(&inq_response[8], &max_sectors, sizeof(u32));
> + memcpy(&inq_response[20], &max_discard, sizeof(u32));
> +
> + if (max_discard)
> + memcpy(&inq_response[24], &discard_desc_count, sizeof(u32));
> +
> + return nvme_trans_copy_to_user(hdr, inq_response, 0x3c);
> +}
> +
> static int nvme_trans_bdev_char_page(struct nvme_ns *ns, struct sg_io_hdr *hdr,
> int alloc_len)
> {
> @@ -2286,6 +2308,10 @@ static int nvme_trans_inquiry(struct nvme_ns *ns, struct sg_io_hdr *hdr,
> case VPD_EXTENDED_INQUIRY:
> res = nvme_trans_ext_inq_page(ns, hdr, alloc_len);
> break;
> + case VPD_BLOCK_LIMITS:
> + res = nvme_trans_bdev_limits_page(ns, hdr, inq_response,
> + alloc_len);
> + break;
> case VPD_BLOCK_DEV_CHARACTERISTICS:
> res = nvme_trans_bdev_char_page(ns, hdr, alloc_len);
> break;
> --
> 1.7.10.4
>
>
> _______________________________________________
> Linux-nvme mailing list
> Linux-nvme at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-nvme
More information about the Linux-nvme
mailing list