mirror of
https://github.com/torvalds/linux.git
synced 2024-12-01 08:31:37 +00:00
nvme: introduce NVME_QUIRK_IGNORE_DEV_SUBNQN
If a device provides an NQN it is expected to be globally unique. Unfortunately some firmware revisions for Intel 760p/Pro 7600p devices did not satisfy this requirement. In these circumstances if a system has >1 affected device then only one device is enabled. If this quirk is enabled then the device supplied subnqn is ignored and we fallback to generating one as if the field was empty. In this case we also suppress the version check so we don't print a warning when the quirk is enabled. Reviewed-by: Keith Busch <keith.busch@intel.com> Signed-off-by: James Dingwall <james@dingwall.me.uk> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
3da584f571
commit
6299358d19
@ -2173,14 +2173,16 @@ static void nvme_init_subnqn(struct nvme_subsystem *subsys, struct nvme_ctrl *ct
|
|||||||
size_t nqnlen;
|
size_t nqnlen;
|
||||||
int off;
|
int off;
|
||||||
|
|
||||||
nqnlen = strnlen(id->subnqn, NVMF_NQN_SIZE);
|
if(!(ctrl->quirks & NVME_QUIRK_IGNORE_DEV_SUBNQN)) {
|
||||||
if (nqnlen > 0 && nqnlen < NVMF_NQN_SIZE) {
|
nqnlen = strnlen(id->subnqn, NVMF_NQN_SIZE);
|
||||||
strlcpy(subsys->subnqn, id->subnqn, NVMF_NQN_SIZE);
|
if (nqnlen > 0 && nqnlen < NVMF_NQN_SIZE) {
|
||||||
return;
|
strlcpy(subsys->subnqn, id->subnqn, NVMF_NQN_SIZE);
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (ctrl->vs >= NVME_VS(1, 2, 1))
|
if (ctrl->vs >= NVME_VS(1, 2, 1))
|
||||||
dev_warn(ctrl->device, "missing or invalid SUBNQN field.\n");
|
dev_warn(ctrl->device, "missing or invalid SUBNQN field.\n");
|
||||||
|
}
|
||||||
|
|
||||||
/* Generate a "fake" NQN per Figure 254 in NVMe 1.3 + ECN 001 */
|
/* Generate a "fake" NQN per Figure 254 in NVMe 1.3 + ECN 001 */
|
||||||
off = snprintf(subsys->subnqn, NVMF_NQN_SIZE,
|
off = snprintf(subsys->subnqn, NVMF_NQN_SIZE,
|
||||||
|
@ -90,6 +90,11 @@ enum nvme_quirks {
|
|||||||
* Set MEDIUM priority on SQ creation
|
* Set MEDIUM priority on SQ creation
|
||||||
*/
|
*/
|
||||||
NVME_QUIRK_MEDIUM_PRIO_SQ = (1 << 7),
|
NVME_QUIRK_MEDIUM_PRIO_SQ = (1 << 7),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ignore device provided subnqn.
|
||||||
|
*/
|
||||||
|
NVME_QUIRK_IGNORE_DEV_SUBNQN = (1 << 8),
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2971,6 +2971,8 @@ static const struct pci_device_id nvme_id_table[] = {
|
|||||||
{ PCI_VDEVICE(INTEL, 0xf1a5), /* Intel 600P/P3100 */
|
{ PCI_VDEVICE(INTEL, 0xf1a5), /* Intel 600P/P3100 */
|
||||||
.driver_data = NVME_QUIRK_NO_DEEPEST_PS |
|
.driver_data = NVME_QUIRK_NO_DEEPEST_PS |
|
||||||
NVME_QUIRK_MEDIUM_PRIO_SQ },
|
NVME_QUIRK_MEDIUM_PRIO_SQ },
|
||||||
|
{ PCI_VDEVICE(INTEL, 0xf1a6), /* Intel 760p/Pro 7600p */
|
||||||
|
.driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN, },
|
||||||
{ PCI_VDEVICE(INTEL, 0x5845), /* Qemu emulated controller */
|
{ PCI_VDEVICE(INTEL, 0x5845), /* Qemu emulated controller */
|
||||||
.driver_data = NVME_QUIRK_IDENTIFY_CNS, },
|
.driver_data = NVME_QUIRK_IDENTIFY_CNS, },
|
||||||
{ PCI_DEVICE(0x1bb1, 0x0100), /* Seagate Nytro Flash Storage */
|
{ PCI_DEVICE(0x1bb1, 0x0100), /* Seagate Nytro Flash Storage */
|
||||||
|
Loading…
Reference in New Issue
Block a user