| From 7c6e9989a4ad40ca657a7b85519873ec1d829527 Mon Sep 17 00:00:00 2001 |
| From: Keith Busch <keith.busch@intel.com> |
| Date: Mon, 19 Dec 2016 11:37:50 -0500 |
| Subject: [PATCH] nvme: simplify stripe quirk |
| |
| commit e6282aef7b89a11d26e731060c4409b7aac278bf upstream. |
| |
| Some OEMs believe they own the Identify Controller vendor specific |
| region and will repurpose it with their own values. While not common, |
| we can't rely on the PCI VID:DID to tell use how to decode the field |
| we reserved for this as the stripe size so we need to do something else |
| for the list of devices using this quirk. |
| |
| The field was supposed to allow flexibility on the device's back-end |
| striping, but it turned out that never materialized; the chunk is always |
| the same as MDTS in the products subscribing to this quirk, so this |
| patch removes the stripe_size field and sets the chunk to the max hw |
| transfer size for the devices using this quirk. |
| |
| Signed-off-by: Keith Busch <keith.busch@intel.com> |
| Signed-off-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c |
| index f56fa1cff25d..0aaa1589e09e 100644 |
| --- a/drivers/nvme/host/core.c |
| +++ b/drivers/nvme/host/core.c |
| @@ -1194,8 +1194,8 @@ static void nvme_set_queue_limits(struct nvme_ctrl *ctrl, |
| blk_queue_max_hw_sectors(q, ctrl->max_hw_sectors); |
| blk_queue_max_segments(q, min_t(u32, max_segments, USHRT_MAX)); |
| } |
| - if (ctrl->stripe_size) |
| - blk_queue_chunk_sectors(q, ctrl->stripe_size >> 9); |
| + if (ctrl->quirks & NVME_QUIRK_STRIPE_SIZE) |
| + blk_queue_chunk_sectors(q, ctrl->max_hw_sectors); |
| blk_queue_virt_boundary(q, ctrl->page_size - 1); |
| if (ctrl->vwc & NVME_CTRL_VWC_PRESENT) |
| vwc = true; |
| @@ -1251,19 +1251,6 @@ int nvme_init_identify(struct nvme_ctrl *ctrl) |
| ctrl->max_hw_sectors = |
| min_not_zero(ctrl->max_hw_sectors, max_hw_sectors); |
| |
| - if ((ctrl->quirks & NVME_QUIRK_STRIPE_SIZE) && id->vs[3]) { |
| - unsigned int max_hw_sectors; |
| - |
| - ctrl->stripe_size = 1 << (id->vs[3] + page_shift); |
| - max_hw_sectors = ctrl->stripe_size >> (page_shift - 9); |
| - if (ctrl->max_hw_sectors) { |
| - ctrl->max_hw_sectors = min(max_hw_sectors, |
| - ctrl->max_hw_sectors); |
| - } else { |
| - ctrl->max_hw_sectors = max_hw_sectors; |
| - } |
| - } |
| - |
| nvme_set_queue_limits(ctrl, ctrl->admin_q); |
| ctrl->sgls = le32_to_cpu(id->sgls); |
| ctrl->kas = le16_to_cpu(id->kas); |
| diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h |
| index ab18b78102bf..334f9218a23d 100644 |
| --- a/drivers/nvme/host/nvme.h |
| +++ b/drivers/nvme/host/nvme.h |
| @@ -120,7 +120,6 @@ struct nvme_ctrl { |
| |
| u32 page_size; |
| u32 max_hw_sectors; |
| - u32 stripe_size; |
| u16 oncs; |
| u16 vid; |
| atomic_t abort_limit; |
| -- |
| 2.12.0 |
| |