NVMe: Read the model, serial & firmware rev from the controller

Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
diff --git a/drivers/block/nvme.c b/drivers/block/nvme.c
index 40fb2e1..12e37c1 100644
--- a/drivers/block/nvme.c
+++ b/drivers/block/nvme.c
@@ -58,6 +58,9 @@
 	struct msix_entry *entry;
 	struct nvme_bar __iomem *bar;
 	struct list_head namespaces;
+	char serial[20];
+	char model[40];
+	char firmware_rev[8];
 };
 
 /*
@@ -979,6 +982,7 @@
 {
 	int res, nn, i;
 	struct nvme_ns *ns, *next;
+	struct nvme_id_ctrl *ctrl;
 	void *id;
 	dma_addr_t dma_addr;
 	struct nvme_command cid, crt;
@@ -1003,7 +1007,11 @@
 		goto out_free;
 	}
 
-	nn = le32_to_cpup(&((struct nvme_id_ctrl *)id)->nn);
+	ctrl = id;
+	nn = le32_to_cpup(&ctrl->nn);
+	memcpy(dev->serial, ctrl->sn, sizeof(ctrl->sn));
+	memcpy(dev->model, ctrl->mn, sizeof(ctrl->mn));
+	memcpy(dev->firmware_rev, ctrl->fr, sizeof(ctrl->fr));
 
 	cid.identify.cns = 0;
 	memset(&crt, 0, sizeof(crt));