nvme fixes for Linux 6.11
- Fix request without payloads cleanup (Leon) - Use new protection information format (Francis) - Improved debug message for lost pci link (Bart) - Another apst quirk (Wang) - Use appropriate sysfs api for printing chars (Markus) -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE3Fbyvv+648XNRdHTPe3zGtjzRgkFAmajrFcACgkQPe3zGtjz Rgk4QRAA357EtsOgDKAbodaePFsGhmfhVEVhizCkw+yj+l73jGWMRMDfbpNsnkii OTJaXhQgVPrCBGnmbgHn5GehEKJ/VZwW4fFbF42wvetFXWSYFDPL2yqC3YpaPjNp aSJvUM0rw4f+JE52tTPQvVzLQ/M9PZFsJ6sUmoozV5MoPLt4eKKUEHKigCXpXV/p AOwiejVVk035WbKNq4R8DoQsa05Yk0Tv5zKsFgmXEZjrnorC0dpqWQjT5HH6V9pt eHTA2cxKq9qAHBN1Zm/3HUOmxmJZ1GW3AKLxYM+k0ornnfnO7inlQwNJDsQItXXS ZNBELiYIIObVoy6COB03NWMSCcS/TrpfSKJ9s+JOdJt/T+AOVCwQkqpIff6aJTaH k4ppVjChmaY3+taIkLQ5nC1zecCZr7hY+xL0ZkUGhlznKn9x2a1zOBZ6tUuabul6 57JztkeXPyTNZ/t1WhYQQpGQ4MCLXnu81gMRzVKfJcmtMOSrBOO1p8eNjb/LgM4M Qpu9VKS33OBrmMEBlhnBvhkFIXxHUU1CjZJkQ2MYm4YLLnaO4VmmOk3tcX1mpID4 R6GrsXAOBlqjtAyqsTGQJ/+Z5BRp1nhOk/E0APiD+sbgJPiRSJ2HNZpDEbOroYOy 4IiaQwZbyGSjieBWWe0fMMCBbazk2S9ws57eAbVh5/r6L+DSWTc= =1Rzv -----END PGP SIGNATURE----- Merge tag 'nvme-6.11-2024-07-26' of git://git.infradead.org/nvme into block-6.11 Pull NVMe fixes from Keith: "nvme fixes for Linux 6.11 - Fix request without payloads cleanup (Leon) - Use new protection information format (Francis) - Improved debug message for lost pci link (Bart) - Another apst quirk (Wang) - Use appropriate sysfs api for printing chars (Markus)" * tag 'nvme-6.11-2024-07-26' of git://git.infradead.org/nvme: nvme-pci: add missing condition check for existence of mapped data nvme-core: choose PIF from QPIF if QPIFS supports and PIF is QTYPE nvme-pci: Fix the instructions for disabling power management nvme: remove redundant bdev local variable nvme-fabrics: Use seq_putc() in __nvmf_concat_opt_tokens() nvme/pci: Add APST quirk for Lenovo N60z laptop
This commit is contained in:
commit
f6bb5254b7
@ -1876,12 +1876,18 @@ static void nvme_configure_pi_elbas(struct nvme_ns_head *head,
|
|||||||
struct nvme_id_ns *id, struct nvme_id_ns_nvm *nvm)
|
struct nvme_id_ns *id, struct nvme_id_ns_nvm *nvm)
|
||||||
{
|
{
|
||||||
u32 elbaf = le32_to_cpu(nvm->elbaf[nvme_lbaf_index(id->flbas)]);
|
u32 elbaf = le32_to_cpu(nvm->elbaf[nvme_lbaf_index(id->flbas)]);
|
||||||
|
u8 guard_type;
|
||||||
|
|
||||||
/* no support for storage tag formats right now */
|
/* no support for storage tag formats right now */
|
||||||
if (nvme_elbaf_sts(elbaf))
|
if (nvme_elbaf_sts(elbaf))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
head->guard_type = nvme_elbaf_guard_type(elbaf);
|
guard_type = nvme_elbaf_guard_type(elbaf);
|
||||||
|
if ((nvm->pic & NVME_ID_NS_NVM_QPIFS) &&
|
||||||
|
guard_type == NVME_NVM_NS_QTYPE_GUARD)
|
||||||
|
guard_type = nvme_elbaf_qualified_guard_type(elbaf);
|
||||||
|
|
||||||
|
head->guard_type = guard_type;
|
||||||
switch (head->guard_type) {
|
switch (head->guard_type) {
|
||||||
case NVME_NVM_NS_64B_GUARD:
|
case NVME_NVM_NS_64B_GUARD:
|
||||||
head->pi_size = sizeof(struct crc64_pi_tuple);
|
head->pi_size = sizeof(struct crc64_pi_tuple);
|
||||||
|
@ -1403,10 +1403,10 @@ static void __nvmf_concat_opt_tokens(struct seq_file *seq_file)
|
|||||||
tok = &opt_tokens[idx];
|
tok = &opt_tokens[idx];
|
||||||
if (tok->token == NVMF_OPT_ERR)
|
if (tok->token == NVMF_OPT_ERR)
|
||||||
continue;
|
continue;
|
||||||
seq_puts(seq_file, ",");
|
seq_putc(seq_file, ',');
|
||||||
seq_puts(seq_file, tok->pattern);
|
seq_puts(seq_file, tok->pattern);
|
||||||
}
|
}
|
||||||
seq_puts(seq_file, "\n");
|
seq_putc(seq_file, '\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nvmf_dev_show(struct seq_file *seq_file, void *private)
|
static int nvmf_dev_show(struct seq_file *seq_file, void *private)
|
||||||
|
@ -863,7 +863,8 @@ static blk_status_t nvme_prep_rq(struct nvme_dev *dev, struct request *req)
|
|||||||
nvme_start_request(req);
|
nvme_start_request(req);
|
||||||
return BLK_STS_OK;
|
return BLK_STS_OK;
|
||||||
out_unmap_data:
|
out_unmap_data:
|
||||||
nvme_unmap_data(dev, req);
|
if (blk_rq_nr_phys_segments(req))
|
||||||
|
nvme_unmap_data(dev, req);
|
||||||
out_free_cmd:
|
out_free_cmd:
|
||||||
nvme_cleanup_cmd(req);
|
nvme_cleanup_cmd(req);
|
||||||
return ret;
|
return ret;
|
||||||
@ -1309,7 +1310,7 @@ static void nvme_warn_reset(struct nvme_dev *dev, u32 csts)
|
|||||||
dev_warn(dev->ctrl.device,
|
dev_warn(dev->ctrl.device,
|
||||||
"Does your device have a faulty power saving mode enabled?\n");
|
"Does your device have a faulty power saving mode enabled?\n");
|
||||||
dev_warn(dev->ctrl.device,
|
dev_warn(dev->ctrl.device,
|
||||||
"Try \"nvme_core.default_ps_max_latency_us=0 pcie_aspm=off\" and report a bug\n");
|
"Try \"nvme_core.default_ps_max_latency_us=0 pcie_aspm=off pcie_port_pm=off\" and report a bug\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum blk_eh_timer_return nvme_timeout(struct request *req)
|
static enum blk_eh_timer_return nvme_timeout(struct request *req)
|
||||||
@ -2968,6 +2969,13 @@ static unsigned long check_vendor_combination_bug(struct pci_dev *pdev)
|
|||||||
return NVME_QUIRK_FORCE_NO_SIMPLE_SUSPEND;
|
return NVME_QUIRK_FORCE_NO_SIMPLE_SUSPEND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NVMe SSD drops off the PCIe bus after system idle
|
||||||
|
* for 10 hours on a Lenovo N60z board.
|
||||||
|
*/
|
||||||
|
if (dmi_match(DMI_BOARD_NAME, "LXKT-ZXEG-N6"))
|
||||||
|
return NVME_QUIRK_NO_APST;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,13 +233,12 @@ static ssize_t nuse_show(struct device *dev, struct device_attribute *attr,
|
|||||||
{
|
{
|
||||||
struct nvme_ns_head *head = dev_to_ns_head(dev);
|
struct nvme_ns_head *head = dev_to_ns_head(dev);
|
||||||
struct gendisk *disk = dev_to_disk(dev);
|
struct gendisk *disk = dev_to_disk(dev);
|
||||||
struct block_device *bdev = disk->part0;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (nvme_disk_is_ns_head(bdev->bd_disk))
|
if (nvme_disk_is_ns_head(disk))
|
||||||
ret = ns_head_update_nuse(head);
|
ret = ns_head_update_nuse(head);
|
||||||
else
|
else
|
||||||
ret = ns_update_nuse(bdev->bd_disk->private_data);
|
ret = ns_update_nuse(disk->private_data);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -485,6 +485,9 @@ enum {
|
|||||||
NVME_ID_NS_NVM_STS_MASK = 0x7f,
|
NVME_ID_NS_NVM_STS_MASK = 0x7f,
|
||||||
NVME_ID_NS_NVM_GUARD_SHIFT = 7,
|
NVME_ID_NS_NVM_GUARD_SHIFT = 7,
|
||||||
NVME_ID_NS_NVM_GUARD_MASK = 0x3,
|
NVME_ID_NS_NVM_GUARD_MASK = 0x3,
|
||||||
|
NVME_ID_NS_NVM_QPIF_SHIFT = 9,
|
||||||
|
NVME_ID_NS_NVM_QPIF_MASK = 0xf,
|
||||||
|
NVME_ID_NS_NVM_QPIFS = 1 << 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline __u8 nvme_elbaf_sts(__u32 elbaf)
|
static inline __u8 nvme_elbaf_sts(__u32 elbaf)
|
||||||
@ -497,6 +500,11 @@ static inline __u8 nvme_elbaf_guard_type(__u32 elbaf)
|
|||||||
return (elbaf >> NVME_ID_NS_NVM_GUARD_SHIFT) & NVME_ID_NS_NVM_GUARD_MASK;
|
return (elbaf >> NVME_ID_NS_NVM_GUARD_SHIFT) & NVME_ID_NS_NVM_GUARD_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline __u8 nvme_elbaf_qualified_guard_type(__u32 elbaf)
|
||||||
|
{
|
||||||
|
return (elbaf >> NVME_ID_NS_NVM_QPIF_SHIFT) & NVME_ID_NS_NVM_QPIF_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
struct nvme_id_ctrl_nvm {
|
struct nvme_id_ctrl_nvm {
|
||||||
__u8 vsl;
|
__u8 vsl;
|
||||||
__u8 wzsl;
|
__u8 wzsl;
|
||||||
@ -576,6 +584,7 @@ enum {
|
|||||||
NVME_NVM_NS_16B_GUARD = 0,
|
NVME_NVM_NS_16B_GUARD = 0,
|
||||||
NVME_NVM_NS_32B_GUARD = 1,
|
NVME_NVM_NS_32B_GUARD = 1,
|
||||||
NVME_NVM_NS_64B_GUARD = 2,
|
NVME_NVM_NS_64B_GUARD = 2,
|
||||||
|
NVME_NVM_NS_QTYPE_GUARD = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline __u8 nvme_lbaf_index(__u8 flbas)
|
static inline __u8 nvme_lbaf_index(__u8 flbas)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user