diff --git a/include/spdk/pci_ids.h b/include/spdk/pci_ids.h index 9b6fb78cc..345a545fb 100644 --- a/include/spdk/pci_ids.h +++ b/include/spdk/pci_ids.h @@ -54,6 +54,7 @@ extern "C" { #define SPDK_PCI_VID_VMWARE 0x15ad #define SPDK_PCI_VID_REDHAT 0x1b36 #define SPDK_PCI_VID_NUTANIX 0x4e58 +#define SPDK_PCI_VID_HUAWEI 0x19e5 #define SPDK_PCI_CLASS_ANY_ID 0xffffff /** diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 996888c4d..4c852e8eb 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -1939,7 +1939,7 @@ nvme_ctrlr_identify_done(void *arg, const struct spdk_nvme_cpl *cpl) } } - if (ctrlr->cdata.sgls.supported) { + if (ctrlr->cdata.sgls.supported && !(ctrlr->quirks & NVME_QUIRK_NOT_USE_SGL)) { assert(ctrlr->cdata.sgls.supported != 0x3); ctrlr->flags |= SPDK_NVME_CTRLR_SGL_SUPPORTED; if (ctrlr->cdata.sgls.supported == 0x2) { diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 9da6bde37..83ea3d7a4 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -163,6 +163,12 @@ extern pid_t g_spdk_nvme_pid; */ #define NVME_QUIRK_MDTS_EXCLUDE_MD 0x8000 +/** + * Force not to use SGL even the controller report that it can + * support it. + */ +#define NVME_QUIRK_NOT_USE_SGL 0x10000 + #define NVME_MAX_ASYNC_EVENTS (8) #define NVME_MAX_ADMIN_TIMEOUT_IN_SECS (30) diff --git a/lib/nvme/nvme_quirks.c b/lib/nvme/nvme_quirks.c index 92ac8d940..85beb5f35 100644 --- a/lib/nvme/nvme_quirks.c +++ b/lib/nvme/nvme_quirks.c @@ -109,6 +109,9 @@ static const struct nvme_quirk nvme_quirks[] = { { {SPDK_PCI_CLASS_NVME, SPDK_PCI_VID_INTEL, 0x4140, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_QUIRK_MDTS_EXCLUDE_MD }, + { {SPDK_PCI_CLASS_NVME, SPDK_PCI_VID_HUAWEI, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + NVME_QUIRK_NOT_USE_SGL + }, { {0x000000, 0x0000, 0x0000, 0x0000, 0x0000}, 0} };