summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2015-11-26 09:59:44 +0100
committerJens Axboe <axboe@fb.com>2015-12-01 10:59:38 -0700
commit01fec28a6f3ba96d4f46a538eae089dd92189fd1 (patch)
tree727c0cf65913b62484ca8fe0502cd173b6d1b953
parentbf7d3ebbd219d8ad948e812d03e1decfd96c97d0 (diff)
downloadlinux-stable-01fec28a6f3ba96d4f46a538eae089dd92189fd1.tar.gz
linux-stable-01fec28a6f3ba96d4f46a538eae089dd92189fd1.tar.bz2
linux-stable-01fec28a6f3ba96d4f46a538eae089dd92189fd1.zip
nvme: use vendor it from identify
Use the vendor ID from the identify data instead of the PCI device to make the SCSI translation layer independent from the PCI driver. The NVMe spec defines them as having the same value for current PCIe devices. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--drivers/nvme/host/scsi.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/nvme/host/scsi.c b/drivers/nvme/host/scsi.c
index b42cf448a55e..0bf90b62ec27 100644
--- a/drivers/nvme/host/scsi.c
+++ b/drivers/nvme/host/scsi.c
@@ -649,6 +649,8 @@ static int nvme_fill_device_id_scsi_string(struct nvme_ns *ns,
struct sg_io_hdr *hdr, u8 *inq_response, int alloc_len)
{
struct nvme_dev *dev = ns->dev;
+ struct nvme_id_ctrl *id_ctrl;
+ int nvme_sc, res;
if (alloc_len < 72) {
return nvme_trans_completion(hdr,
@@ -657,6 +659,11 @@ static int nvme_fill_device_id_scsi_string(struct nvme_ns *ns,
SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
}
+ nvme_sc = nvme_identify_ctrl(dev, &id_ctrl);
+ res = nvme_trans_status_code(hdr, nvme_sc);
+ if (res)
+ return res;
+
memset(inq_response, 0, alloc_len);
inq_response[1] = INQ_DEVICE_IDENTIFICATION_PAGE;
inq_response[3] = 0x48; /* Page Length */
@@ -667,12 +674,14 @@ static int nvme_fill_device_id_scsi_string(struct nvme_ns *ns,
inq_response[6] = 0x00; /* Rsvd */
inq_response[7] = 0x44; /* Designator Length */
- sprintf(&inq_response[8], "%04x", to_pci_dev(dev->dev)->vendor);
+ sprintf(&inq_response[8], "%04x", le16_to_cpu(id_ctrl->vid));
memcpy(&inq_response[12], dev->model, sizeof(dev->model));
sprintf(&inq_response[52], "%04x", cpu_to_be32(ns->ns_id));
memcpy(&inq_response[56], dev->serial, sizeof(dev->serial));
- return nvme_trans_copy_to_user(hdr, inq_response, alloc_len);
+ res = nvme_trans_copy_to_user(hdr, inq_response, alloc_len);
+ kfree(id_ctrl);
+ return res;
}
static int nvme_trans_device_id_page(struct nvme_ns *ns, struct sg_io_hdr *hdr,