diff options
Diffstat (limited to 'drivers/nvme/host/pci.c')
| -rw-r--r-- | drivers/nvme/host/pci.c | 17 | 
1 files changed, 14 insertions, 3 deletions
| diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index a11cfd470089..f5800c3c9082 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -1759,6 +1759,7 @@ static void nvme_free_host_mem(struct nvme_dev *dev)  			dev->nr_host_mem_descs * sizeof(*dev->host_mem_descs),  			dev->host_mem_descs, dev->host_mem_descs_dma);  	dev->host_mem_descs = NULL; +	dev->nr_host_mem_descs = 0;  }  static int __nvme_alloc_host_mem(struct nvme_dev *dev, u64 preferred, @@ -1787,7 +1788,7 @@ static int __nvme_alloc_host_mem(struct nvme_dev *dev, u64 preferred,  	if (!bufs)  		goto out_free_descs; -	for (size = 0; size < preferred; size += len) { +	for (size = 0; size < preferred && i < max_entries; size += len) {  		dma_addr_t dma_addr;  		len = min_t(u64, chunk_size, preferred - size); @@ -2428,7 +2429,7 @@ static int nvme_dev_map(struct nvme_dev *dev)  	return -ENODEV;  } -static unsigned long check_dell_samsung_bug(struct pci_dev *pdev) +static unsigned long check_vendor_combination_bug(struct pci_dev *pdev)  {  	if (pdev->vendor == 0x144d && pdev->device == 0xa802) {  		/* @@ -2443,6 +2444,14 @@ static unsigned long check_dell_samsung_bug(struct pci_dev *pdev)  		    (dmi_match(DMI_PRODUCT_NAME, "XPS 15 9550") ||  		     dmi_match(DMI_PRODUCT_NAME, "Precision 5510")))  			return NVME_QUIRK_NO_DEEPEST_PS; +	} else if (pdev->vendor == 0x144d && pdev->device == 0xa804) { +		/* +		 * Samsung SSD 960 EVO drops off the PCIe bus after system +		 * suspend on a Ryzen board, ASUS PRIME B350M-A. +		 */ +		if (dmi_match(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC.") && +		    dmi_match(DMI_BOARD_NAME, "PRIME B350M-A")) +			return NVME_QUIRK_NO_APST;  	}  	return 0; @@ -2482,7 +2491,7 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	if (result)  		goto unmap; -	quirks |= check_dell_samsung_bug(pdev); +	quirks |= check_vendor_combination_bug(pdev);  	result = nvme_init_ctrl(&dev->ctrl, &pdev->dev, &nvme_pci_ctrl_ops,  			quirks); @@ -2665,6 +2674,8 @@ static const struct pci_device_id nvme_id_table[] = {  		.driver_data = NVME_QUIRK_IDENTIFY_CNS, },  	{ PCI_DEVICE(0x1c58, 0x0003),	/* HGST adapter */  		.driver_data = NVME_QUIRK_DELAY_BEFORE_CHK_RDY, }, +	{ PCI_DEVICE(0x1c58, 0x0023),	/* WDC SN200 adapter */ +		.driver_data = NVME_QUIRK_DELAY_BEFORE_CHK_RDY, },  	{ PCI_DEVICE(0x1c5f, 0x0540),	/* Memblaze Pblaze4 adapter */  		.driver_data = NVME_QUIRK_DELAY_BEFORE_CHK_RDY, },  	{ PCI_DEVICE(0x144d, 0xa821),   /* Samsung PM1725 */ | 

