nvme fixes for Linux 5.19
- quirks, quirks, quirks to work around buggy consumer grade devices (Keith Bush, Ning Wang, Stefan Reiter, Rasheed Hsueh) - better kernel messages for devices that need quirking (Keith Bush) - make a kernel message more useful (Thomas Weißschuh) -----BEGIN PGP SIGNATURE----- iQI/BAABCgApFiEEgdbnc3r/njty3Iq9D55TZVIEUYMFAmKp3z4LHGhjaEBsc3Qu ZGUACgkQD55TZVIEUYNSthAAjtGLy08+EvU0+LXT/mJv19iuT7w5rGjOFaW6onno xGOJ0H32EasvdVC9yU1h7FTmULZGC3Hl48G7GtfFO+9EvbHICVof95egAjdzrD6O ubpqgpc6oXwJwVcQ2ZebLKpdoRuAFsLJ+eqEAq+i+UuTd4yTkNRjjcow85ZpNe9x iqvjaGBEZatWkqjKJ+G6eJyhMvFdckYjaAlfR/fSoxl2ToJu61JsJotBz2eRdcz9 jSIQ0yx4eeI6A/yfzVWmYWOYh4D3DVR6hLsGTzmrMzLXFi5L/jk1fBs1/vm8AY69 /xPt200WC+xlZosHG70pzT3yYAtkY8dCPG5IUPQfKFmNhLNIUXpH23F3HazshdLj yvUiUwZi2CEJ2kj+8G+wBk8KMa2MjMrFsj1x+MsAxqOUc7Hnz3UNBtet8jN0die1 +5KviZCbCRGe9fu7w2sQIYUctJdiwcx18tLBX2TBdh01sZ6EEMbxwFP56G9k+xmO Gd6BUR3eV3uc9jPxHYfSVbOwwsJARIUeheqvhUP0W3BlFfm5jKBuCSEjLRRwaP4n Snzk4UGK3MkIqmQ0x5up/N2rtCP9ZUZF5UDoUhiiiOQWVcHOJh9oMS6XiE0j6jQW N4pwRVKMcAKXGAxOiXPjwg+rGKf9M0IzzB95NRW5ChpEei7f85Mt85DEL0CGLDue 22M= =9++P -----END PGP SIGNATURE----- Merge tag 'nvme-5.19-2022-06-15' of git://git.infradead.org/nvme into block-5.19 Pull NVMe fixes from Christoph: "nvme fixes for Linux 5.19 - quirks, quirks, quirks to work around buggy consumer grade devices (Keith Bush, Ning Wang, Stefan Reiter, Rasheed Hsueh) - better kernel messages for devices that need quirking (Keith Bush) - make a kernel message more useful (Thomas Weißschuh)" * tag 'nvme-5.19-2022-06-15' of git://git.infradead.org/nvme: nvme-pci: disable write zeros support on UMIC and Samsung SSDs nvme-pci: avoid the deepest sleep state on ZHITAI TiPro7000 SSDs nvme-pci: sk hynix p31 has bogus namespace ids nvme-pci: smi has bogus namespace ids nvme-pci: phison e12 has bogus namespace ids nvme-pci: add NVME_QUIRK_BOGUS_NID for ADATA XPG GAMMIX S50 nvme-pci: add trouble shooting steps for timeouts nvme: add bug report info for global duplicate id nvme: add device name to warning in uuid_show()
This commit is contained in:
Коммит
2396e958c8
|
@ -3285,8 +3285,8 @@ static ssize_t uuid_show(struct device *dev, struct device_attribute *attr,
|
|||
* we have no UUID set
|
||||
*/
|
||||
if (uuid_is_null(&ids->uuid)) {
|
||||
printk_ratelimited(KERN_WARNING
|
||||
"No UUID available providing old NGUID\n");
|
||||
dev_warn_ratelimited(dev,
|
||||
"No UUID available providing old NGUID\n");
|
||||
return sysfs_emit(buf, "%pU\n", ids->nguid);
|
||||
}
|
||||
return sysfs_emit(buf, "%pU\n", &ids->uuid);
|
||||
|
@ -3863,6 +3863,7 @@ static int nvme_init_ns_head(struct nvme_ns *ns, unsigned nsid,
|
|||
if (ret) {
|
||||
dev_err(ctrl->device,
|
||||
"globally duplicate IDs for nsid %d\n", nsid);
|
||||
nvme_print_device_info(ctrl);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -503,6 +503,7 @@ struct nvme_ctrl_ops {
|
|||
void (*submit_async_event)(struct nvme_ctrl *ctrl);
|
||||
void (*delete_ctrl)(struct nvme_ctrl *ctrl);
|
||||
int (*get_address)(struct nvme_ctrl *ctrl, char *buf, int size);
|
||||
void (*print_device_info)(struct nvme_ctrl *ctrl);
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -548,6 +549,33 @@ static inline struct request *nvme_cid_to_rq(struct blk_mq_tags *tags,
|
|||
return blk_mq_tag_to_rq(tags, nvme_tag_from_cid(command_id));
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the length of the string without the space padding
|
||||
*/
|
||||
static inline int nvme_strlen(char *s, int len)
|
||||
{
|
||||
while (s[len - 1] == ' ')
|
||||
len--;
|
||||
return len;
|
||||
}
|
||||
|
||||
static inline void nvme_print_device_info(struct nvme_ctrl *ctrl)
|
||||
{
|
||||
struct nvme_subsystem *subsys = ctrl->subsys;
|
||||
|
||||
if (ctrl->ops->print_device_info) {
|
||||
ctrl->ops->print_device_info(ctrl);
|
||||
return;
|
||||
}
|
||||
|
||||
dev_err(ctrl->device,
|
||||
"VID:%04x model:%.*s firmware:%.*s\n", subsys->vendor_id,
|
||||
nvme_strlen(subsys->model, sizeof(subsys->model)),
|
||||
subsys->model, nvme_strlen(subsys->firmware_rev,
|
||||
sizeof(subsys->firmware_rev)),
|
||||
subsys->firmware_rev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
|
||||
void nvme_fault_inject_init(struct nvme_fault_inject *fault_inj,
|
||||
const char *dev_name);
|
||||
|
|
|
@ -1334,6 +1334,14 @@ static void nvme_warn_reset(struct nvme_dev *dev, u32 csts)
|
|||
dev_warn(dev->ctrl.device,
|
||||
"controller is down; will reset: CSTS=0x%x, PCI_STATUS read failed (%d)\n",
|
||||
csts, result);
|
||||
|
||||
if (csts != ~0)
|
||||
return;
|
||||
|
||||
dev_warn(dev->ctrl.device,
|
||||
"Does your device have a faulty power saving mode enabled?\n");
|
||||
dev_warn(dev->ctrl.device,
|
||||
"Try \"nvme_core.default_ps_max_latency_us=0 pcie_aspm=off\" and report a bug\n");
|
||||
}
|
||||
|
||||
static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved)
|
||||
|
@ -2976,6 +2984,21 @@ static int nvme_pci_get_address(struct nvme_ctrl *ctrl, char *buf, int size)
|
|||
return snprintf(buf, size, "%s\n", dev_name(&pdev->dev));
|
||||
}
|
||||
|
||||
|
||||
static void nvme_pci_print_device_info(struct nvme_ctrl *ctrl)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(to_nvme_dev(ctrl)->dev);
|
||||
struct nvme_subsystem *subsys = ctrl->subsys;
|
||||
|
||||
dev_err(ctrl->device,
|
||||
"VID:DID %04x:%04x model:%.*s firmware:%.*s\n",
|
||||
pdev->vendor, pdev->device,
|
||||
nvme_strlen(subsys->model, sizeof(subsys->model)),
|
||||
subsys->model, nvme_strlen(subsys->firmware_rev,
|
||||
sizeof(subsys->firmware_rev)),
|
||||
subsys->firmware_rev);
|
||||
}
|
||||
|
||||
static const struct nvme_ctrl_ops nvme_pci_ctrl_ops = {
|
||||
.name = "pcie",
|
||||
.module = THIS_MODULE,
|
||||
|
@ -2987,6 +3010,7 @@ static const struct nvme_ctrl_ops nvme_pci_ctrl_ops = {
|
|||
.free_ctrl = nvme_pci_free_ctrl,
|
||||
.submit_async_event = nvme_pci_submit_async_event,
|
||||
.get_address = nvme_pci_get_address,
|
||||
.print_device_info = nvme_pci_print_device_info,
|
||||
};
|
||||
|
||||
static int nvme_dev_map(struct nvme_dev *dev)
|
||||
|
@ -3421,7 +3445,8 @@ static const struct pci_device_id nvme_id_table[] = {
|
|||
{ PCI_VDEVICE(REDHAT, 0x0010), /* Qemu emulated controller */
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x126f, 0x2263), /* Silicon Motion unidentified */
|
||||
.driver_data = NVME_QUIRK_NO_NS_DESC_LIST, },
|
||||
.driver_data = NVME_QUIRK_NO_NS_DESC_LIST |
|
||||
NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1bb1, 0x0100), /* Seagate Nytro Flash Storage */
|
||||
.driver_data = NVME_QUIRK_DELAY_BEFORE_CHK_RDY |
|
||||
NVME_QUIRK_NO_NS_DESC_LIST, },
|
||||
|
@ -3437,6 +3462,8 @@ static const struct pci_device_id nvme_id_table[] = {
|
|||
.driver_data = NVME_QUIRK_DELAY_BEFORE_CHK_RDY |
|
||||
NVME_QUIRK_DISABLE_WRITE_ZEROES|
|
||||
NVME_QUIRK_IGNORE_DEV_SUBNQN, },
|
||||
{ PCI_DEVICE(0x1987, 0x5012), /* Phison E12 */
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1987, 0x5016), /* Phison E16 */
|
||||
.driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN, },
|
||||
{ PCI_DEVICE(0x1b4b, 0x1092), /* Lexar 256 GB SSD */
|
||||
|
@ -3449,10 +3476,20 @@ static const struct pci_device_id nvme_id_table[] = {
|
|||
NVME_QUIRK_IGNORE_DEV_SUBNQN, },
|
||||
{ PCI_DEVICE(0x1c5c, 0x1504), /* SK Hynix PC400 */
|
||||
.driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
|
||||
{ PCI_DEVICE(0x1c5c, 0x174a), /* SK Hynix P31 SSD */
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x15b7, 0x2001), /* Sandisk Skyhawk */
|
||||
.driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
|
||||
{ PCI_DEVICE(0x1d97, 0x2263), /* SPCC */
|
||||
.driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
|
||||
{ PCI_DEVICE(0x144d, 0xa80b), /* Samsung PM9B1 256G and 512G */
|
||||
.driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
|
||||
{ PCI_DEVICE(0x144d, 0xa809), /* Samsung MZALQ256HBJD 256G */
|
||||
.driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
|
||||
{ PCI_DEVICE(0x1cc4, 0x6303), /* UMIS RPJTJ512MGE1QDY 512G */
|
||||
.driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
|
||||
{ PCI_DEVICE(0x1cc4, 0x6302), /* UMIS RPJTJ256MGE1QDY 256G */
|
||||
.driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
|
||||
{ PCI_DEVICE(0x2646, 0x2262), /* KINGSTON SKC2000 NVMe SSD */
|
||||
.driver_data = NVME_QUIRK_NO_DEEPEST_PS, },
|
||||
{ PCI_DEVICE(0x2646, 0x2263), /* KINGSTON A2000 NVMe SSD */
|
||||
|
@ -3463,6 +3500,10 @@ static const struct pci_device_id nvme_id_table[] = {
|
|||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1e4B, 0x1202), /* MAXIO MAP1202 */
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1cc1, 0x5350), /* ADATA XPG GAMMIX S50 */
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1e49, 0x0041), /* ZHITAI TiPro7000 NVMe SSD */
|
||||
.driver_data = NVME_QUIRK_NO_DEEPEST_PS, },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0x0061),
|
||||
.driver_data = NVME_QUIRK_DMA_ADDRESS_BITS_48, },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0x0065),
|
||||
|
|
Загрузка…
Ссылка в новой задаче