diff for duplicates of <1532461998.20066.5.camel@gmail.com> diff --git a/a/1.txt b/N1/1.txt index 219b3d0..13381d0 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,148 +1,87 @@ -Hi Alex, - -On Tue, 2018-07-24@10:14 -0600, Alex Williamson wrote: -> The Samsung SM961/PM961 (960 EVO) sometimes fails to return from FLR -> with the PCI config space reading back as -1.??A reproducible instance -> of this behavior is resolved by clearing the enable bit in the NVMe -> configuration register and waiting for the ready status to clear -> (disabling the NVMe controller) prior to FLR. -> -> Signed-off-by: Alex Williamson <alex.williamson at redhat.com> -> --- -> ?drivers/pci/quirks.c |???83 -> ++++++++++++++++++++++++++++++++++++++++++++++++++ -> ?1 file changed, 83 insertions(+) -> -> diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c -> index e72c8742aafa..3899cdd2514b 100644 -> --- a/drivers/pci/quirks.c -> +++ b/drivers/pci/quirks.c -> @@ -28,6 +28,7 @@ -> ?#include <linux/platform_data/x86/apple.h> -> ?#include <linux/pm_runtime.h> -> ?#include <linux/switchtec.h> -> +#include <linux/nvme.h> -> ?#include <asm/dma.h> /* isa_dma_bridge_buggy */ -> ?#include "pci.h" -> ? -> @@ -3669,6 +3670,87 @@ static int reset_chelsio_generic_dev(struct pci_dev -> *dev, int probe) -> ?#define PCI_DEVICE_ID_INTEL_IVB_M_VGA??????0x0156 -> ?#define PCI_DEVICE_ID_INTEL_IVB_M2_VGA?????0x0166 -> ? -> +/* -> + * The Samsung SM961/PM961 controller can sometimes enter a fatal state after -> + * FLR where config space reads from the device return -1.??We seem to be -> + * able to avoid this condition if we disable the NVMe controller prior to -> + * FLR.??This quirk is generic for any NVMe class device requiring similar -> + * assistance to quiesce the device prior to FLR. -> + * -> + * NVMe specification: https://nvmexpress.org/resources/specifications/ -> + * Revision 1.0e: - -It seems too old version of NVMe specification. ?Do you have any special reason -to comment the specified 1.0 version instead of 1.3 or something newer? - -> + *????Chapter 2: Required and optional PCI config registers -> + *????Chapter 3: NVMe control registers -> + *????Chapter 7.3: Reset behavior -> + */ -> +static int nvme_disable_and_flr(struct pci_dev *dev, int probe) - -The name of this function seems able to be started with 'reset_' prefix just -like other quirks for reset. -What about reset_samsung_pm961 or something? - -> +{ -> + void __iomem *bar; -> + u16 cmd; -> + u32 cfg; -> + -> + if (dev->class != PCI_CLASS_STORAGE_EXPRESS || -> + ????!pcie_has_flr(dev) || !pci_resource_start(dev, 0)) -> + return -ENOTTY; -> + -> + if (probe) -> + return 0; -> + -> + bar = pci_iomap(dev, 0, NVME_REG_CC + sizeof(cfg)); -> + if (!bar) -> + return -ENOTTY; -> + -> + pci_read_config_word(dev, PCI_COMMAND, &cmd); -> + pci_write_config_word(dev, PCI_COMMAND, cmd | PCI_COMMAND_MEMORY); -> + -> + cfg = readl(bar + NVME_REG_CC); -> + -> + /* Disable controller if enabled */ -> + if (cfg & NVME_CC_ENABLE) { -> + u64 cap = readq(bar + NVME_REG_CAP); -> + unsigned long timeout; -> + -> + /* -> + ?* Per nvme_disable_ctrl() skip shutdown notification as it -> + ?* could complete commands to the admin queue.??We only -> intend -> + ?* to quiesce the device before reset. -> + ?*/ -> + cfg &= ~(NVME_CC_SHN_MASK | NVME_CC_ENABLE); -> + -> + writel(cfg, bar + NVME_REG_CC); -> + -> + /* -> + ?* Some controllers require an additional delay here, see -> + ?* NVME_QUIRK_DELAY_BEFORE_CHK_RDY.??None of those are yet -> + ?* supported by this quirk. -> + ?*/ -> + -> + /* Cap register provides max timeout in 500ms increments */ -> + timeout = ((NVME_CAP_TIMEOUT(cap) + 1) * HZ / 2) + jiffies; -> + -> + for (;;) { -> + u32 status = readl(bar + NVME_REG_CSTS); -> + -> + /* Ready status becomes zero on disable complete */ -> + if (!(status & NVME_CSTS_RDY)) -> + break; -> + -> + msleep(100); -> + -> + if (time_after(jiffies, timeout)) { -> + pci_warn(dev, "Timeout waiting for NVMe ready -> status to clear after disable\n"); -> + break; -> + } -> + } -> + } -> + -> + pci_iounmap(dev, bar); -> + -> + pcie_flr(dev); -> + -> + return 0; -> +} -> + -> ?static const struct pci_dev_reset_methods pci_dev_reset_methods[] = { -> ? { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82599_SFP_VF, -> ? ?reset_intel_82599_sfp_virtfn }, -> @@ -3676,6 +3758,7 @@ static const struct pci_dev_reset_methods -> pci_dev_reset_methods[] = { -> ? reset_ivb_igd }, -> ? { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IVB_M2_VGA, -> ? reset_ivb_igd }, -> + { PCI_VENDOR_ID_SAMSUNG, 0xa804, nvme_disable_and_flr }, - -Why don't we just define a macro just like other DEVICE_IDs. (e.g. -PCIE_DEVICE_ID_INTEL_82599_SFP_VF). - -#define PCI_DEVICE_ID_SAMSUNG_PM961 ?0xa804 - -> ? { PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID, -> ? reset_chelsio_generic_dev }, -> ? { 0 } -> -> -> _______________________________________________ -> Linux-nvme mailing list -> Linux-nvme at lists.infradead.org -> http://lists.infradead.org/mailman/listinfo/linux-nvme +SGkgQWxleCwKCk9uIFR1ZSwgMjAxOC0wNy0yNCBhdCAxMDoxNCAtMDYwMCwgQWxleCBXaWxsaWFt +c29uIHdyb3RlOgo+IFRoZSBTYW1zdW5nIFNNOTYxL1BNOTYxICg5NjAgRVZPKSBzb21ldGltZXMg +ZmFpbHMgdG8gcmV0dXJuIGZyb20gRkxSCj4gd2l0aCB0aGUgUENJIGNvbmZpZyBzcGFjZSByZWFk +aW5nIGJhY2sgYXMgLTEuwqDCoEEgcmVwcm9kdWNpYmxlIGluc3RhbmNlCj4gb2YgdGhpcyBiZWhh +dmlvciBpcyByZXNvbHZlZCBieSBjbGVhcmluZyB0aGUgZW5hYmxlIGJpdCBpbiB0aGUgTlZNZQo+ +IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYW5kIHdhaXRpbmcgZm9yIHRoZSByZWFkeSBzdGF0dXMg +dG8gY2xlYXIKPiAoZGlzYWJsaW5nIHRoZSBOVk1lIGNvbnRyb2xsZXIpIHByaW9yIHRvIEZMUi4K +PiAKPiBTaWduZWQtb2ZmLWJ5OiBBbGV4IFdpbGxpYW1zb24gPGFsZXgud2lsbGlhbXNvbkByZWRo +YXQuY29tPgo+IC0tLQo+IMKgZHJpdmVycy9wY2kvcXVpcmtzLmMgfMKgwqDCoDgzCj4gKysrKysr +KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiDCoDEgZmlsZSBj +aGFuZ2VkLCA4MyBpbnNlcnRpb25zKCspCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1 +aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKPiBpbmRleCBlNzJjODc0MmFhZmEuLjM4OTlj +ZGQyNTE0YiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3BjaS9xdWlya3MuYwo+ICsrKyBiL2RyaXZl +cnMvcGNpL3F1aXJrcy5jCj4gQEAgLTI4LDYgKzI4LDcgQEAKPiDCoCNpbmNsdWRlIDxsaW51eC9w +bGF0Zm9ybV9kYXRhL3g4Ni9hcHBsZS5oPgo+IMKgI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUu +aD4KPiDCoCNpbmNsdWRlIDxsaW51eC9zd2l0Y2h0ZWMuaD4KPiArI2luY2x1ZGUgPGxpbnV4L252 +bWUuaD4KPiDCoCNpbmNsdWRlIDxhc20vZG1hLmg+CS8qIGlzYV9kbWFfYnJpZGdlX2J1Z2d5ICov +Cj4gwqAjaW5jbHVkZSAicGNpLmgiCj4gwqAKPiBAQCAtMzY2OSw2ICszNjcwLDg3IEBAIHN0YXRp +YyBpbnQgcmVzZXRfY2hlbHNpb19nZW5lcmljX2RldihzdHJ1Y3QgcGNpX2Rldgo+ICpkZXYsIGlu +dCBwcm9iZSkKPiDCoCNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JVkJfTV9WR0HCoMKgwqDC +oMKgwqAweDAxNTYKPiDCoCNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JVkJfTTJfVkdBwqDC +oMKgwqDCoDB4MDE2Ngo+IMKgCj4gKy8qCj4gKyAqIFRoZSBTYW1zdW5nIFNNOTYxL1BNOTYxIGNv +bnRyb2xsZXIgY2FuIHNvbWV0aW1lcyBlbnRlciBhIGZhdGFsIHN0YXRlIGFmdGVyCj4gKyAqIEZM +UiB3aGVyZSBjb25maWcgc3BhY2UgcmVhZHMgZnJvbSB0aGUgZGV2aWNlIHJldHVybiAtMS7CoMKg +V2Ugc2VlbSB0byBiZQo+ICsgKiBhYmxlIHRvIGF2b2lkIHRoaXMgY29uZGl0aW9uIGlmIHdlIGRp +c2FibGUgdGhlIE5WTWUgY29udHJvbGxlciBwcmlvciB0bwo+ICsgKiBGTFIuwqDCoFRoaXMgcXVp +cmsgaXMgZ2VuZXJpYyBmb3IgYW55IE5WTWUgY2xhc3MgZGV2aWNlIHJlcXVpcmluZyBzaW1pbGFy +Cj4gKyAqIGFzc2lzdGFuY2UgdG8gcXVpZXNjZSB0aGUgZGV2aWNlIHByaW9yIHRvIEZMUi4KPiAr +ICoKPiArICogTlZNZSBzcGVjaWZpY2F0aW9uOiBodHRwczovL252bWV4cHJlc3Mub3JnL3Jlc291 +cmNlcy9zcGVjaWZpY2F0aW9ucy8KPiArICogUmV2aXNpb24gMS4wZToKCkl0IHNlZW1zIHRvbyBv +bGQgdmVyc2lvbiBvZiBOVk1lIHNwZWNpZmljYXRpb24uIMKgRG8geW91IGhhdmUgYW55IHNwZWNp +YWwgcmVhc29uCnRvIGNvbW1lbnQgdGhlIHNwZWNpZmllZCAxLjAgdmVyc2lvbiBpbnN0ZWFkIG9m +IDEuMyBvciBzb21ldGhpbmcgbmV3ZXI/Cgo+ICsgKsKgwqDCoMKgQ2hhcHRlciAyOiBSZXF1aXJl +ZCBhbmQgb3B0aW9uYWwgUENJIGNvbmZpZyByZWdpc3RlcnMKPiArICrCoMKgwqDCoENoYXB0ZXIg +MzogTlZNZSBjb250cm9sIHJlZ2lzdGVycwo+ICsgKsKgwqDCoMKgQ2hhcHRlciA3LjM6IFJlc2V0 +IGJlaGF2aW9yCj4gKyAqLwo+ICtzdGF0aWMgaW50IG52bWVfZGlzYWJsZV9hbmRfZmxyKHN0cnVj +dCBwY2lfZGV2ICpkZXYsIGludCBwcm9iZSkKClRoZSBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gc2Vl +bXMgYWJsZSB0byBiZSBzdGFydGVkIHdpdGggJ3Jlc2V0XycgcHJlZml4IGp1c3QKbGlrZSBvdGhl +ciBxdWlya3MgZm9yIHJlc2V0LgpXaGF0IGFib3V0IHJlc2V0X3NhbXN1bmdfcG05NjEgb3Igc29t +ZXRoaW5nPwoKPiArewo+ICsJdm9pZCBfX2lvbWVtICpiYXI7Cj4gKwl1MTYgY21kOwo+ICsJdTMy +IGNmZzsKPiArCj4gKwlpZiAoZGV2LT5jbGFzcyAhPSBQQ0lfQ0xBU1NfU1RPUkFHRV9FWFBSRVNT +IHx8Cj4gKwnCoMKgwqDCoCFwY2llX2hhc19mbHIoZGV2KSB8fCAhcGNpX3Jlc291cmNlX3N0YXJ0 +KGRldiwgMCkpCj4gKwkJcmV0dXJuIC1FTk9UVFk7Cj4gKwo+ICsJaWYgKHByb2JlKQo+ICsJCXJl +dHVybiAwOwo+ICsKPiArCWJhciA9IHBjaV9pb21hcChkZXYsIDAsIE5WTUVfUkVHX0NDICsgc2l6 +ZW9mKGNmZykpOwo+ICsJaWYgKCFiYXIpCj4gKwkJcmV0dXJuIC1FTk9UVFk7Cj4gKwo+ICsJcGNp +X3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Cj4gKwlwY2lfd3JpdGVf +Y29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kIHwgUENJX0NPTU1BTkRfTUVNT1JZKTsK +PiArCj4gKwljZmcgPSByZWFkbChiYXIgKyBOVk1FX1JFR19DQyk7Cj4gKwo+ICsJLyogRGlzYWJs +ZSBjb250cm9sbGVyIGlmIGVuYWJsZWQgKi8KPiArCWlmIChjZmcgJiBOVk1FX0NDX0VOQUJMRSkg +ewo+ICsJCXU2NCBjYXAgPSByZWFkcShiYXIgKyBOVk1FX1JFR19DQVApOwo+ICsJCXVuc2lnbmVk +IGxvbmcgdGltZW91dDsKPiArCj4gKwkJLyoKPiArCQnCoCogUGVyIG52bWVfZGlzYWJsZV9jdHJs +KCkgc2tpcCBzaHV0ZG93biBub3RpZmljYXRpb24gYXMgaXQKPiArCQnCoCogY291bGQgY29tcGxl +dGUgY29tbWFuZHMgdG8gdGhlIGFkbWluIHF1ZXVlLsKgwqBXZSBvbmx5Cj4gaW50ZW5kCj4gKwkJ +wqAqIHRvIHF1aWVzY2UgdGhlIGRldmljZSBiZWZvcmUgcmVzZXQuCj4gKwkJwqAqLwo+ICsJCWNm +ZyAmPSB+KE5WTUVfQ0NfU0hOX01BU0sgfCBOVk1FX0NDX0VOQUJMRSk7Cj4gKwo+ICsJCXdyaXRl +bChjZmcsIGJhciArIE5WTUVfUkVHX0NDKTsKPiArCj4gKwkJLyoKPiArCQnCoCogU29tZSBjb250 +cm9sbGVycyByZXF1aXJlIGFuIGFkZGl0aW9uYWwgZGVsYXkgaGVyZSwgc2VlCj4gKwkJwqAqIE5W +TUVfUVVJUktfREVMQVlfQkVGT1JFX0NIS19SRFkuwqDCoE5vbmUgb2YgdGhvc2UgYXJlIHlldAo+ +ICsJCcKgKiBzdXBwb3J0ZWQgYnkgdGhpcyBxdWlyay4KPiArCQnCoCovCj4gKwo+ICsJCS8qIENh +cCByZWdpc3RlciBwcm92aWRlcyBtYXggdGltZW91dCBpbiA1MDBtcyBpbmNyZW1lbnRzICovCj4g +KwkJdGltZW91dCA9ICgoTlZNRV9DQVBfVElNRU9VVChjYXApICsgMSkgKiBIWiAvIDIpICsgamlm +ZmllczsKPiArCj4gKwkJZm9yICg7Oykgewo+ICsJCQl1MzIgc3RhdHVzID0gcmVhZGwoYmFyICsg +TlZNRV9SRUdfQ1NUUyk7Cj4gKwo+ICsJCQkvKiBSZWFkeSBzdGF0dXMgYmVjb21lcyB6ZXJvIG9u +IGRpc2FibGUgY29tcGxldGUgKi8KPiArCQkJaWYgKCEoc3RhdHVzICYgTlZNRV9DU1RTX1JEWSkp +Cj4gKwkJCQlicmVhazsKPiArCj4gKwkJCW1zbGVlcCgxMDApOwo+ICsKPiArCQkJaWYgKHRpbWVf +YWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKPiArCQkJCXBjaV93YXJuKGRldiwgIlRpbWVvdXQg +d2FpdGluZyBmb3IgTlZNZSByZWFkeQo+IHN0YXR1cyB0byBjbGVhciBhZnRlciBkaXNhYmxlXG4i +KTsKPiArCQkJCWJyZWFrOwo+ICsJCQl9Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXBjaV9pb3VubWFw +KGRldiwgYmFyKTsKPiArCj4gKwlwY2llX2ZscihkZXYpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9 +Cj4gKwo+IMKgc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2X3Jlc2V0X21ldGhvZHMgcGNpX2Rl +dl9yZXNldF9tZXRob2RzW10gPSB7Cj4gwqAJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVW +SUNFX0lEX0lOVEVMXzgyNTk5X1NGUF9WRiwKPiDCoAkJwqByZXNldF9pbnRlbF84MjU5OV9zZnBf +dmlydGZuIH0sCj4gQEAgLTM2NzYsNiArMzc1OCw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNp +X2Rldl9yZXNldF9tZXRob2RzCj4gcGNpX2Rldl9yZXNldF9tZXRob2RzW10gPSB7Cj4gwqAJCXJl +c2V0X2l2Yl9pZ2QgfSwKPiDCoAl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURf +SU5URUxfSVZCX00yX1ZHQSwKPiDCoAkJcmVzZXRfaXZiX2lnZCB9LAo+ICsJeyBQQ0lfVkVORE9S +X0lEX1NBTVNVTkcsIDB4YTgwNCwgbnZtZV9kaXNhYmxlX2FuZF9mbHIgfSwKCldoeSBkb24ndCB3 +ZSBqdXN0IGRlZmluZSBhIG1hY3JvIGp1c3QgbGlrZSBvdGhlciBERVZJQ0VfSURzLiAoZS5nLgpQ +Q0lFX0RFVklDRV9JRF9JTlRFTF84MjU5OV9TRlBfVkYpLgoKI2RlZmluZSBQQ0lfREVWSUNFX0lE +X1NBTVNVTkdfUE05NjEgwqAweGE4MDQKCj4gwqAJeyBQQ0lfVkVORE9SX0lEX0NIRUxTSU8sIFBD +SV9BTllfSUQsCj4gwqAJCXJlc2V0X2NoZWxzaW9fZ2VuZXJpY19kZXYgfSwKPiDCoAl7IDAgfQo+ +IAo+IAo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4g +TGludXgtbnZtZSBtYWlsaW5nIGxpc3QKPiBMaW51eC1udm1lQGxpc3RzLmluZnJhZGVhZC5vcmcK +PiBodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW52bWUK +Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4LW52 +bWUgbWFpbGluZyBsaXN0CkxpbnV4LW52bWVAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlz +dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW52bWUK diff --git a/a/content_digest b/N1/content_digest index c592d42..d21ace2 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -1,157 +1,100 @@ "ref\020180724160440.2729.75178.stgit@gimli.home\0" "ref\020180724161440.2729.89835.stgit@gimli.home\0" - "From\0minwoo.im.dev@gmail.com (Minwoo Im)\0" - "Subject\0[PATCH v3 2/3] PCI: Samsung SM961/PM961 NVMe disable before FLR quirk\0" + "From\0Minwoo Im <minwoo.im.dev@gmail.com>\0" + "Subject\0Re: [PATCH v3 2/3] PCI: Samsung SM961/PM961 NVMe disable before FLR quirk\0" "Date\0Wed, 25 Jul 2018 04:53:18 +0900\0" + "To\0Alex Williamson <alex.williamson@redhat.com>" + " linux-pci@vger.kernel.org\0" + "Cc\0linux-kernel@vger.kernel.org" + " linux-nvme@lists.infradead.org\0" "\00:1\0" "b\0" - "Hi Alex,\n" - "\n" - "On Tue, 2018-07-24@10:14 -0600, Alex Williamson wrote:\n" - "> The Samsung SM961/PM961 (960 EVO) sometimes fails to return from FLR\n" - "> with the PCI config space reading back as -1.??A reproducible instance\n" - "> of this behavior is resolved by clearing the enable bit in the NVMe\n" - "> configuration register and waiting for the ready status to clear\n" - "> (disabling the NVMe controller) prior to FLR.\n" - "> \n" - "> Signed-off-by: Alex Williamson <alex.williamson at redhat.com>\n" - "> ---\n" - "> ?drivers/pci/quirks.c |???83\n" - "> ++++++++++++++++++++++++++++++++++++++++++++++++++\n" - "> ?1 file changed, 83 insertions(+)\n" - "> \n" - "> diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c\n" - "> index e72c8742aafa..3899cdd2514b 100644\n" - "> --- a/drivers/pci/quirks.c\n" - "> +++ b/drivers/pci/quirks.c\n" - "> @@ -28,6 +28,7 @@\n" - "> ?#include <linux/platform_data/x86/apple.h>\n" - "> ?#include <linux/pm_runtime.h>\n" - "> ?#include <linux/switchtec.h>\n" - "> +#include <linux/nvme.h>\n" - "> ?#include <asm/dma.h>\t/* isa_dma_bridge_buggy */\n" - "> ?#include \"pci.h\"\n" - "> ?\n" - "> @@ -3669,6 +3670,87 @@ static int reset_chelsio_generic_dev(struct pci_dev\n" - "> *dev, int probe)\n" - "> ?#define PCI_DEVICE_ID_INTEL_IVB_M_VGA??????0x0156\n" - "> ?#define PCI_DEVICE_ID_INTEL_IVB_M2_VGA?????0x0166\n" - "> ?\n" - "> +/*\n" - "> + * The Samsung SM961/PM961 controller can sometimes enter a fatal state after\n" - "> + * FLR where config space reads from the device return -1.??We seem to be\n" - "> + * able to avoid this condition if we disable the NVMe controller prior to\n" - "> + * FLR.??This quirk is generic for any NVMe class device requiring similar\n" - "> + * assistance to quiesce the device prior to FLR.\n" - "> + *\n" - "> + * NVMe specification: https://nvmexpress.org/resources/specifications/\n" - "> + * Revision 1.0e:\n" - "\n" - "It seems too old version of NVMe specification. ?Do you have any special reason\n" - "to comment the specified 1.0 version instead of 1.3 or something newer?\n" - "\n" - "> + *????Chapter 2: Required and optional PCI config registers\n" - "> + *????Chapter 3: NVMe control registers\n" - "> + *????Chapter 7.3: Reset behavior\n" - "> + */\n" - "> +static int nvme_disable_and_flr(struct pci_dev *dev, int probe)\n" - "\n" - "The name of this function seems able to be started with 'reset_' prefix just\n" - "like other quirks for reset.\n" - "What about reset_samsung_pm961 or something?\n" - "\n" - "> +{\n" - "> +\tvoid __iomem *bar;\n" - "> +\tu16 cmd;\n" - "> +\tu32 cfg;\n" - "> +\n" - "> +\tif (dev->class != PCI_CLASS_STORAGE_EXPRESS ||\n" - "> +\t????!pcie_has_flr(dev) || !pci_resource_start(dev, 0))\n" - "> +\t\treturn -ENOTTY;\n" - "> +\n" - "> +\tif (probe)\n" - "> +\t\treturn 0;\n" - "> +\n" - "> +\tbar = pci_iomap(dev, 0, NVME_REG_CC + sizeof(cfg));\n" - "> +\tif (!bar)\n" - "> +\t\treturn -ENOTTY;\n" - "> +\n" - "> +\tpci_read_config_word(dev, PCI_COMMAND, &cmd);\n" - "> +\tpci_write_config_word(dev, PCI_COMMAND, cmd | PCI_COMMAND_MEMORY);\n" - "> +\n" - "> +\tcfg = readl(bar + NVME_REG_CC);\n" - "> +\n" - "> +\t/* Disable controller if enabled */\n" - "> +\tif (cfg & NVME_CC_ENABLE) {\n" - "> +\t\tu64 cap = readq(bar + NVME_REG_CAP);\n" - "> +\t\tunsigned long timeout;\n" - "> +\n" - "> +\t\t/*\n" - "> +\t\t?* Per nvme_disable_ctrl() skip shutdown notification as it\n" - "> +\t\t?* could complete commands to the admin queue.??We only\n" - "> intend\n" - "> +\t\t?* to quiesce the device before reset.\n" - "> +\t\t?*/\n" - "> +\t\tcfg &= ~(NVME_CC_SHN_MASK | NVME_CC_ENABLE);\n" - "> +\n" - "> +\t\twritel(cfg, bar + NVME_REG_CC);\n" - "> +\n" - "> +\t\t/*\n" - "> +\t\t?* Some controllers require an additional delay here, see\n" - "> +\t\t?* NVME_QUIRK_DELAY_BEFORE_CHK_RDY.??None of those are yet\n" - "> +\t\t?* supported by this quirk.\n" - "> +\t\t?*/\n" - "> +\n" - "> +\t\t/* Cap register provides max timeout in 500ms increments */\n" - "> +\t\ttimeout = ((NVME_CAP_TIMEOUT(cap) + 1) * HZ / 2) + jiffies;\n" - "> +\n" - "> +\t\tfor (;;) {\n" - "> +\t\t\tu32 status = readl(bar + NVME_REG_CSTS);\n" - "> +\n" - "> +\t\t\t/* Ready status becomes zero on disable complete */\n" - "> +\t\t\tif (!(status & NVME_CSTS_RDY))\n" - "> +\t\t\t\tbreak;\n" - "> +\n" - "> +\t\t\tmsleep(100);\n" - "> +\n" - "> +\t\t\tif (time_after(jiffies, timeout)) {\n" - "> +\t\t\t\tpci_warn(dev, \"Timeout waiting for NVMe ready\n" - "> status to clear after disable\\n\");\n" - "> +\t\t\t\tbreak;\n" - "> +\t\t\t}\n" - "> +\t\t}\n" - "> +\t}\n" - "> +\n" - "> +\tpci_iounmap(dev, bar);\n" - "> +\n" - "> +\tpcie_flr(dev);\n" - "> +\n" - "> +\treturn 0;\n" - "> +}\n" - "> +\n" - "> ?static const struct pci_dev_reset_methods pci_dev_reset_methods[] = {\n" - "> ?\t{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82599_SFP_VF,\n" - "> ?\t\t?reset_intel_82599_sfp_virtfn },\n" - "> @@ -3676,6 +3758,7 @@ static const struct pci_dev_reset_methods\n" - "> pci_dev_reset_methods[] = {\n" - "> ?\t\treset_ivb_igd },\n" - "> ?\t{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IVB_M2_VGA,\n" - "> ?\t\treset_ivb_igd },\n" - "> +\t{ PCI_VENDOR_ID_SAMSUNG, 0xa804, nvme_disable_and_flr },\n" - "\n" - "Why don't we just define a macro just like other DEVICE_IDs. (e.g.\n" - "PCIE_DEVICE_ID_INTEL_82599_SFP_VF).\n" - "\n" - "#define PCI_DEVICE_ID_SAMSUNG_PM961 ?0xa804\n" - "\n" - "> ?\t{ PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID,\n" - "> ?\t\treset_chelsio_generic_dev },\n" - "> ?\t{ 0 }\n" - "> \n" - "> \n" - "> _______________________________________________\n" - "> Linux-nvme mailing list\n" - "> Linux-nvme at lists.infradead.org\n" - > http://lists.infradead.org/mailman/listinfo/linux-nvme + "SGkgQWxleCwKCk9uIFR1ZSwgMjAxOC0wNy0yNCBhdCAxMDoxNCAtMDYwMCwgQWxleCBXaWxsaWFt\n" + "c29uIHdyb3RlOgo+IFRoZSBTYW1zdW5nIFNNOTYxL1BNOTYxICg5NjAgRVZPKSBzb21ldGltZXMg\n" + "ZmFpbHMgdG8gcmV0dXJuIGZyb20gRkxSCj4gd2l0aCB0aGUgUENJIGNvbmZpZyBzcGFjZSByZWFk\n" + "aW5nIGJhY2sgYXMgLTEuwqDCoEEgcmVwcm9kdWNpYmxlIGluc3RhbmNlCj4gb2YgdGhpcyBiZWhh\n" + "dmlvciBpcyByZXNvbHZlZCBieSBjbGVhcmluZyB0aGUgZW5hYmxlIGJpdCBpbiB0aGUgTlZNZQo+\n" + "IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYW5kIHdhaXRpbmcgZm9yIHRoZSByZWFkeSBzdGF0dXMg\n" + "dG8gY2xlYXIKPiAoZGlzYWJsaW5nIHRoZSBOVk1lIGNvbnRyb2xsZXIpIHByaW9yIHRvIEZMUi4K\n" + "PiAKPiBTaWduZWQtb2ZmLWJ5OiBBbGV4IFdpbGxpYW1zb24gPGFsZXgud2lsbGlhbXNvbkByZWRo\n" + "YXQuY29tPgo+IC0tLQo+IMKgZHJpdmVycy9wY2kvcXVpcmtzLmMgfMKgwqDCoDgzCj4gKysrKysr\n" + "KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiDCoDEgZmlsZSBj\n" + "aGFuZ2VkLCA4MyBpbnNlcnRpb25zKCspCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1\n" + "aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKPiBpbmRleCBlNzJjODc0MmFhZmEuLjM4OTlj\n" + "ZGQyNTE0YiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3BjaS9xdWlya3MuYwo+ICsrKyBiL2RyaXZl\n" + "cnMvcGNpL3F1aXJrcy5jCj4gQEAgLTI4LDYgKzI4LDcgQEAKPiDCoCNpbmNsdWRlIDxsaW51eC9w\n" + "bGF0Zm9ybV9kYXRhL3g4Ni9hcHBsZS5oPgo+IMKgI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUu\n" + "aD4KPiDCoCNpbmNsdWRlIDxsaW51eC9zd2l0Y2h0ZWMuaD4KPiArI2luY2x1ZGUgPGxpbnV4L252\n" + "bWUuaD4KPiDCoCNpbmNsdWRlIDxhc20vZG1hLmg+CS8qIGlzYV9kbWFfYnJpZGdlX2J1Z2d5ICov\n" + "Cj4gwqAjaW5jbHVkZSAicGNpLmgiCj4gwqAKPiBAQCAtMzY2OSw2ICszNjcwLDg3IEBAIHN0YXRp\n" + "YyBpbnQgcmVzZXRfY2hlbHNpb19nZW5lcmljX2RldihzdHJ1Y3QgcGNpX2Rldgo+ICpkZXYsIGlu\n" + "dCBwcm9iZSkKPiDCoCNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JVkJfTV9WR0HCoMKgwqDC\n" + "oMKgwqAweDAxNTYKPiDCoCNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JVkJfTTJfVkdBwqDC\n" + "oMKgwqDCoDB4MDE2Ngo+IMKgCj4gKy8qCj4gKyAqIFRoZSBTYW1zdW5nIFNNOTYxL1BNOTYxIGNv\n" + "bnRyb2xsZXIgY2FuIHNvbWV0aW1lcyBlbnRlciBhIGZhdGFsIHN0YXRlIGFmdGVyCj4gKyAqIEZM\n" + "UiB3aGVyZSBjb25maWcgc3BhY2UgcmVhZHMgZnJvbSB0aGUgZGV2aWNlIHJldHVybiAtMS7CoMKg\n" + "V2Ugc2VlbSB0byBiZQo+ICsgKiBhYmxlIHRvIGF2b2lkIHRoaXMgY29uZGl0aW9uIGlmIHdlIGRp\n" + "c2FibGUgdGhlIE5WTWUgY29udHJvbGxlciBwcmlvciB0bwo+ICsgKiBGTFIuwqDCoFRoaXMgcXVp\n" + "cmsgaXMgZ2VuZXJpYyBmb3IgYW55IE5WTWUgY2xhc3MgZGV2aWNlIHJlcXVpcmluZyBzaW1pbGFy\n" + "Cj4gKyAqIGFzc2lzdGFuY2UgdG8gcXVpZXNjZSB0aGUgZGV2aWNlIHByaW9yIHRvIEZMUi4KPiAr\n" + "ICoKPiArICogTlZNZSBzcGVjaWZpY2F0aW9uOiBodHRwczovL252bWV4cHJlc3Mub3JnL3Jlc291\n" + "cmNlcy9zcGVjaWZpY2F0aW9ucy8KPiArICogUmV2aXNpb24gMS4wZToKCkl0IHNlZW1zIHRvbyBv\n" + "bGQgdmVyc2lvbiBvZiBOVk1lIHNwZWNpZmljYXRpb24uIMKgRG8geW91IGhhdmUgYW55IHNwZWNp\n" + "YWwgcmVhc29uCnRvIGNvbW1lbnQgdGhlIHNwZWNpZmllZCAxLjAgdmVyc2lvbiBpbnN0ZWFkIG9m\n" + "IDEuMyBvciBzb21ldGhpbmcgbmV3ZXI/Cgo+ICsgKsKgwqDCoMKgQ2hhcHRlciAyOiBSZXF1aXJl\n" + "ZCBhbmQgb3B0aW9uYWwgUENJIGNvbmZpZyByZWdpc3RlcnMKPiArICrCoMKgwqDCoENoYXB0ZXIg\n" + "MzogTlZNZSBjb250cm9sIHJlZ2lzdGVycwo+ICsgKsKgwqDCoMKgQ2hhcHRlciA3LjM6IFJlc2V0\n" + "IGJlaGF2aW9yCj4gKyAqLwo+ICtzdGF0aWMgaW50IG52bWVfZGlzYWJsZV9hbmRfZmxyKHN0cnVj\n" + "dCBwY2lfZGV2ICpkZXYsIGludCBwcm9iZSkKClRoZSBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gc2Vl\n" + "bXMgYWJsZSB0byBiZSBzdGFydGVkIHdpdGggJ3Jlc2V0XycgcHJlZml4IGp1c3QKbGlrZSBvdGhl\n" + "ciBxdWlya3MgZm9yIHJlc2V0LgpXaGF0IGFib3V0IHJlc2V0X3NhbXN1bmdfcG05NjEgb3Igc29t\n" + "ZXRoaW5nPwoKPiArewo+ICsJdm9pZCBfX2lvbWVtICpiYXI7Cj4gKwl1MTYgY21kOwo+ICsJdTMy\n" + "IGNmZzsKPiArCj4gKwlpZiAoZGV2LT5jbGFzcyAhPSBQQ0lfQ0xBU1NfU1RPUkFHRV9FWFBSRVNT\n" + "IHx8Cj4gKwnCoMKgwqDCoCFwY2llX2hhc19mbHIoZGV2KSB8fCAhcGNpX3Jlc291cmNlX3N0YXJ0\n" + "KGRldiwgMCkpCj4gKwkJcmV0dXJuIC1FTk9UVFk7Cj4gKwo+ICsJaWYgKHByb2JlKQo+ICsJCXJl\n" + "dHVybiAwOwo+ICsKPiArCWJhciA9IHBjaV9pb21hcChkZXYsIDAsIE5WTUVfUkVHX0NDICsgc2l6\n" + "ZW9mKGNmZykpOwo+ICsJaWYgKCFiYXIpCj4gKwkJcmV0dXJuIC1FTk9UVFk7Cj4gKwo+ICsJcGNp\n" + "X3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Cj4gKwlwY2lfd3JpdGVf\n" + "Y29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kIHwgUENJX0NPTU1BTkRfTUVNT1JZKTsK\n" + "PiArCj4gKwljZmcgPSByZWFkbChiYXIgKyBOVk1FX1JFR19DQyk7Cj4gKwo+ICsJLyogRGlzYWJs\n" + "ZSBjb250cm9sbGVyIGlmIGVuYWJsZWQgKi8KPiArCWlmIChjZmcgJiBOVk1FX0NDX0VOQUJMRSkg\n" + "ewo+ICsJCXU2NCBjYXAgPSByZWFkcShiYXIgKyBOVk1FX1JFR19DQVApOwo+ICsJCXVuc2lnbmVk\n" + "IGxvbmcgdGltZW91dDsKPiArCj4gKwkJLyoKPiArCQnCoCogUGVyIG52bWVfZGlzYWJsZV9jdHJs\n" + "KCkgc2tpcCBzaHV0ZG93biBub3RpZmljYXRpb24gYXMgaXQKPiArCQnCoCogY291bGQgY29tcGxl\n" + "dGUgY29tbWFuZHMgdG8gdGhlIGFkbWluIHF1ZXVlLsKgwqBXZSBvbmx5Cj4gaW50ZW5kCj4gKwkJ\n" + "wqAqIHRvIHF1aWVzY2UgdGhlIGRldmljZSBiZWZvcmUgcmVzZXQuCj4gKwkJwqAqLwo+ICsJCWNm\n" + "ZyAmPSB+KE5WTUVfQ0NfU0hOX01BU0sgfCBOVk1FX0NDX0VOQUJMRSk7Cj4gKwo+ICsJCXdyaXRl\n" + "bChjZmcsIGJhciArIE5WTUVfUkVHX0NDKTsKPiArCj4gKwkJLyoKPiArCQnCoCogU29tZSBjb250\n" + "cm9sbGVycyByZXF1aXJlIGFuIGFkZGl0aW9uYWwgZGVsYXkgaGVyZSwgc2VlCj4gKwkJwqAqIE5W\n" + "TUVfUVVJUktfREVMQVlfQkVGT1JFX0NIS19SRFkuwqDCoE5vbmUgb2YgdGhvc2UgYXJlIHlldAo+\n" + "ICsJCcKgKiBzdXBwb3J0ZWQgYnkgdGhpcyBxdWlyay4KPiArCQnCoCovCj4gKwo+ICsJCS8qIENh\n" + "cCByZWdpc3RlciBwcm92aWRlcyBtYXggdGltZW91dCBpbiA1MDBtcyBpbmNyZW1lbnRzICovCj4g\n" + "KwkJdGltZW91dCA9ICgoTlZNRV9DQVBfVElNRU9VVChjYXApICsgMSkgKiBIWiAvIDIpICsgamlm\n" + "ZmllczsKPiArCj4gKwkJZm9yICg7Oykgewo+ICsJCQl1MzIgc3RhdHVzID0gcmVhZGwoYmFyICsg\n" + "TlZNRV9SRUdfQ1NUUyk7Cj4gKwo+ICsJCQkvKiBSZWFkeSBzdGF0dXMgYmVjb21lcyB6ZXJvIG9u\n" + "IGRpc2FibGUgY29tcGxldGUgKi8KPiArCQkJaWYgKCEoc3RhdHVzICYgTlZNRV9DU1RTX1JEWSkp\n" + "Cj4gKwkJCQlicmVhazsKPiArCj4gKwkJCW1zbGVlcCgxMDApOwo+ICsKPiArCQkJaWYgKHRpbWVf\n" + "YWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKPiArCQkJCXBjaV93YXJuKGRldiwgIlRpbWVvdXQg\n" + "d2FpdGluZyBmb3IgTlZNZSByZWFkeQo+IHN0YXR1cyB0byBjbGVhciBhZnRlciBkaXNhYmxlXG4i\n" + "KTsKPiArCQkJCWJyZWFrOwo+ICsJCQl9Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXBjaV9pb3VubWFw\n" + "KGRldiwgYmFyKTsKPiArCj4gKwlwY2llX2ZscihkZXYpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9\n" + "Cj4gKwo+IMKgc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2X3Jlc2V0X21ldGhvZHMgcGNpX2Rl\n" + "dl9yZXNldF9tZXRob2RzW10gPSB7Cj4gwqAJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVW\n" + "SUNFX0lEX0lOVEVMXzgyNTk5X1NGUF9WRiwKPiDCoAkJwqByZXNldF9pbnRlbF84MjU5OV9zZnBf\n" + "dmlydGZuIH0sCj4gQEAgLTM2NzYsNiArMzc1OCw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNp\n" + "X2Rldl9yZXNldF9tZXRob2RzCj4gcGNpX2Rldl9yZXNldF9tZXRob2RzW10gPSB7Cj4gwqAJCXJl\n" + "c2V0X2l2Yl9pZ2QgfSwKPiDCoAl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURf\n" + "SU5URUxfSVZCX00yX1ZHQSwKPiDCoAkJcmVzZXRfaXZiX2lnZCB9LAo+ICsJeyBQQ0lfVkVORE9S\n" + "X0lEX1NBTVNVTkcsIDB4YTgwNCwgbnZtZV9kaXNhYmxlX2FuZF9mbHIgfSwKCldoeSBkb24ndCB3\n" + "ZSBqdXN0IGRlZmluZSBhIG1hY3JvIGp1c3QgbGlrZSBvdGhlciBERVZJQ0VfSURzLiAoZS5nLgpQ\n" + "Q0lFX0RFVklDRV9JRF9JTlRFTF84MjU5OV9TRlBfVkYpLgoKI2RlZmluZSBQQ0lfREVWSUNFX0lE\n" + "X1NBTVNVTkdfUE05NjEgwqAweGE4MDQKCj4gwqAJeyBQQ0lfVkVORE9SX0lEX0NIRUxTSU8sIFBD\n" + "SV9BTllfSUQsCj4gwqAJCXJlc2V0X2NoZWxzaW9fZ2VuZXJpY19kZXYgfSwKPiDCoAl7IDAgfQo+\n" + "IAo+IAo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4g\n" + "TGludXgtbnZtZSBtYWlsaW5nIGxpc3QKPiBMaW51eC1udm1lQGxpc3RzLmluZnJhZGVhZC5vcmcK\n" + "PiBodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW52bWUK\n" + "Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4LW52\n" + "bWUgbWFpbGluZyBsaXN0CkxpbnV4LW52bWVAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlz\n" + dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW52bWUK -dcdbcabc24ba102c49286b78c0c2a96512541d2830c6f30f4ca2e49793061e24 +607165f56d68b99b73c9a209a31deb9810037b365f04c22d828ec255f1ec0933
diff --git a/a/1.txt b/N2/1.txt index 219b3d0..2d011e2 100644 --- a/a/1.txt +++ b/N2/1.txt @@ -1,51 +1,51 @@ Hi Alex, -On Tue, 2018-07-24@10:14 -0600, Alex Williamson wrote: +On Tue, 2018-07-24 at 10:14 -0600, Alex Williamson wrote: > The Samsung SM961/PM961 (960 EVO) sometimes fails to return from FLR -> with the PCI config space reading back as -1.??A reproducible instance +> with the PCI config space reading back as -1. A reproducible instance > of this behavior is resolved by clearing the enable bit in the NVMe > configuration register and waiting for the ready status to clear > (disabling the NVMe controller) prior to FLR. > -> Signed-off-by: Alex Williamson <alex.williamson at redhat.com> +> Signed-off-by: Alex Williamson <alex.williamson@redhat.com> > --- -> ?drivers/pci/quirks.c |???83 +> drivers/pci/quirks.c | 83 > ++++++++++++++++++++++++++++++++++++++++++++++++++ -> ?1 file changed, 83 insertions(+) +> 1 file changed, 83 insertions(+) > > diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c > index e72c8742aafa..3899cdd2514b 100644 > --- a/drivers/pci/quirks.c > +++ b/drivers/pci/quirks.c > @@ -28,6 +28,7 @@ -> ?#include <linux/platform_data/x86/apple.h> -> ?#include <linux/pm_runtime.h> -> ?#include <linux/switchtec.h> +> #include <linux/platform_data/x86/apple.h> +> #include <linux/pm_runtime.h> +> #include <linux/switchtec.h> > +#include <linux/nvme.h> -> ?#include <asm/dma.h> /* isa_dma_bridge_buggy */ -> ?#include "pci.h" -> ? +> #include <asm/dma.h> /* isa_dma_bridge_buggy */ +> #include "pci.h" +> > @@ -3669,6 +3670,87 @@ static int reset_chelsio_generic_dev(struct pci_dev > *dev, int probe) -> ?#define PCI_DEVICE_ID_INTEL_IVB_M_VGA??????0x0156 -> ?#define PCI_DEVICE_ID_INTEL_IVB_M2_VGA?????0x0166 -> ? +> #define PCI_DEVICE_ID_INTEL_IVB_M_VGA 0x0156 +> #define PCI_DEVICE_ID_INTEL_IVB_M2_VGA 0x0166 +> > +/* > + * The Samsung SM961/PM961 controller can sometimes enter a fatal state after -> + * FLR where config space reads from the device return -1.??We seem to be +> + * FLR where config space reads from the device return -1. We seem to be > + * able to avoid this condition if we disable the NVMe controller prior to -> + * FLR.??This quirk is generic for any NVMe class device requiring similar +> + * FLR. This quirk is generic for any NVMe class device requiring similar > + * assistance to quiesce the device prior to FLR. > + * > + * NVMe specification: https://nvmexpress.org/resources/specifications/ > + * Revision 1.0e: -It seems too old version of NVMe specification. ?Do you have any special reason +It seems too old version of NVMe specification. Do you have any special reason to comment the specified 1.0 version instead of 1.3 or something newer? -> + *????Chapter 2: Required and optional PCI config registers -> + *????Chapter 3: NVMe control registers -> + *????Chapter 7.3: Reset behavior +> + * Chapter 2: Required and optional PCI config registers +> + * Chapter 3: NVMe control registers +> + * Chapter 7.3: Reset behavior > + */ > +static int nvme_disable_and_flr(struct pci_dev *dev, int probe) @@ -59,7 +59,7 @@ What about reset_samsung_pm961 or something? > + u32 cfg; > + > + if (dev->class != PCI_CLASS_STORAGE_EXPRESS || -> + ????!pcie_has_flr(dev) || !pci_resource_start(dev, 0)) +> + !pcie_has_flr(dev) || !pci_resource_start(dev, 0)) > + return -ENOTTY; > + > + if (probe) @@ -80,20 +80,20 @@ What about reset_samsung_pm961 or something? > + unsigned long timeout; > + > + /* -> + ?* Per nvme_disable_ctrl() skip shutdown notification as it -> + ?* could complete commands to the admin queue.??We only +> + * Per nvme_disable_ctrl() skip shutdown notification as it +> + * could complete commands to the admin queue. We only > intend -> + ?* to quiesce the device before reset. -> + ?*/ +> + * to quiesce the device before reset. +> + */ > + cfg &= ~(NVME_CC_SHN_MASK | NVME_CC_ENABLE); > + > + writel(cfg, bar + NVME_REG_CC); > + > + /* -> + ?* Some controllers require an additional delay here, see -> + ?* NVME_QUIRK_DELAY_BEFORE_CHK_RDY.??None of those are yet -> + ?* supported by this quirk. -> + ?*/ +> + * Some controllers require an additional delay here, see +> + * NVME_QUIRK_DELAY_BEFORE_CHK_RDY. None of those are yet +> + * supported by this quirk. +> + */ > + > + /* Cap register provides max timeout in 500ms increments */ > + timeout = ((NVME_CAP_TIMEOUT(cap) + 1) * HZ / 2) + jiffies; @@ -122,27 +122,27 @@ What about reset_samsung_pm961 or something? > + return 0; > +} > + -> ?static const struct pci_dev_reset_methods pci_dev_reset_methods[] = { -> ? { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82599_SFP_VF, -> ? ?reset_intel_82599_sfp_virtfn }, +> static const struct pci_dev_reset_methods pci_dev_reset_methods[] = { +> { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82599_SFP_VF, +> reset_intel_82599_sfp_virtfn }, > @@ -3676,6 +3758,7 @@ static const struct pci_dev_reset_methods > pci_dev_reset_methods[] = { -> ? reset_ivb_igd }, -> ? { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IVB_M2_VGA, -> ? reset_ivb_igd }, +> reset_ivb_igd }, +> { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IVB_M2_VGA, +> reset_ivb_igd }, > + { PCI_VENDOR_ID_SAMSUNG, 0xa804, nvme_disable_and_flr }, Why don't we just define a macro just like other DEVICE_IDs. (e.g. PCIE_DEVICE_ID_INTEL_82599_SFP_VF). -#define PCI_DEVICE_ID_SAMSUNG_PM961 ?0xa804 +#define PCI_DEVICE_ID_SAMSUNG_PM961 0xa804 -> ? { PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID, -> ? reset_chelsio_generic_dev }, -> ? { 0 } +> { PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID, +> reset_chelsio_generic_dev }, +> { 0 } > > > _______________________________________________ > Linux-nvme mailing list -> Linux-nvme at lists.infradead.org +> Linux-nvme@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-nvme diff --git a/a/content_digest b/N2/content_digest index c592d42..2d5c751 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -1,58 +1,62 @@ "ref\020180724160440.2729.75178.stgit@gimli.home\0" "ref\020180724161440.2729.89835.stgit@gimli.home\0" - "From\0minwoo.im.dev@gmail.com (Minwoo Im)\0" - "Subject\0[PATCH v3 2/3] PCI: Samsung SM961/PM961 NVMe disable before FLR quirk\0" + "From\0Minwoo Im <minwoo.im.dev@gmail.com>\0" + "Subject\0Re: [PATCH v3 2/3] PCI: Samsung SM961/PM961 NVMe disable before FLR quirk\0" "Date\0Wed, 25 Jul 2018 04:53:18 +0900\0" + "To\0Alex Williamson <alex.williamson@redhat.com>" + " linux-pci@vger.kernel.org\0" + "Cc\0linux-kernel@vger.kernel.org" + " linux-nvme@lists.infradead.org\0" "\00:1\0" "b\0" "Hi Alex,\n" "\n" - "On Tue, 2018-07-24@10:14 -0600, Alex Williamson wrote:\n" + "On Tue, 2018-07-24 at 10:14 -0600, Alex Williamson wrote:\n" "> The Samsung SM961/PM961 (960 EVO) sometimes fails to return from FLR\n" - "> with the PCI config space reading back as -1.??A reproducible instance\n" + "> with the PCI config space reading back as -1.\302\240\302\240A reproducible instance\n" "> of this behavior is resolved by clearing the enable bit in the NVMe\n" "> configuration register and waiting for the ready status to clear\n" "> (disabling the NVMe controller) prior to FLR.\n" "> \n" - "> Signed-off-by: Alex Williamson <alex.williamson at redhat.com>\n" + "> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>\n" "> ---\n" - "> ?drivers/pci/quirks.c |???83\n" + "> \302\240drivers/pci/quirks.c |\302\240\302\240\302\24083\n" "> ++++++++++++++++++++++++++++++++++++++++++++++++++\n" - "> ?1 file changed, 83 insertions(+)\n" + "> \302\2401 file changed, 83 insertions(+)\n" "> \n" "> diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c\n" "> index e72c8742aafa..3899cdd2514b 100644\n" "> --- a/drivers/pci/quirks.c\n" "> +++ b/drivers/pci/quirks.c\n" "> @@ -28,6 +28,7 @@\n" - "> ?#include <linux/platform_data/x86/apple.h>\n" - "> ?#include <linux/pm_runtime.h>\n" - "> ?#include <linux/switchtec.h>\n" + "> \302\240#include <linux/platform_data/x86/apple.h>\n" + "> \302\240#include <linux/pm_runtime.h>\n" + "> \302\240#include <linux/switchtec.h>\n" "> +#include <linux/nvme.h>\n" - "> ?#include <asm/dma.h>\t/* isa_dma_bridge_buggy */\n" - "> ?#include \"pci.h\"\n" - "> ?\n" + "> \302\240#include <asm/dma.h>\t/* isa_dma_bridge_buggy */\n" + "> \302\240#include \"pci.h\"\n" + "> \302\240\n" "> @@ -3669,6 +3670,87 @@ static int reset_chelsio_generic_dev(struct pci_dev\n" "> *dev, int probe)\n" - "> ?#define PCI_DEVICE_ID_INTEL_IVB_M_VGA??????0x0156\n" - "> ?#define PCI_DEVICE_ID_INTEL_IVB_M2_VGA?????0x0166\n" - "> ?\n" + "> \302\240#define PCI_DEVICE_ID_INTEL_IVB_M_VGA\302\240\302\240\302\240\302\240\302\240\302\2400x0156\n" + "> \302\240#define PCI_DEVICE_ID_INTEL_IVB_M2_VGA\302\240\302\240\302\240\302\240\302\2400x0166\n" + "> \302\240\n" "> +/*\n" "> + * The Samsung SM961/PM961 controller can sometimes enter a fatal state after\n" - "> + * FLR where config space reads from the device return -1.??We seem to be\n" + "> + * FLR where config space reads from the device return -1.\302\240\302\240We seem to be\n" "> + * able to avoid this condition if we disable the NVMe controller prior to\n" - "> + * FLR.??This quirk is generic for any NVMe class device requiring similar\n" + "> + * FLR.\302\240\302\240This quirk is generic for any NVMe class device requiring similar\n" "> + * assistance to quiesce the device prior to FLR.\n" "> + *\n" "> + * NVMe specification: https://nvmexpress.org/resources/specifications/\n" "> + * Revision 1.0e:\n" "\n" - "It seems too old version of NVMe specification. ?Do you have any special reason\n" + "It seems too old version of NVMe specification. \302\240Do you have any special reason\n" "to comment the specified 1.0 version instead of 1.3 or something newer?\n" "\n" - "> + *????Chapter 2: Required and optional PCI config registers\n" - "> + *????Chapter 3: NVMe control registers\n" - "> + *????Chapter 7.3: Reset behavior\n" + "> + *\302\240\302\240\302\240\302\240Chapter 2: Required and optional PCI config registers\n" + "> + *\302\240\302\240\302\240\302\240Chapter 3: NVMe control registers\n" + "> + *\302\240\302\240\302\240\302\240Chapter 7.3: Reset behavior\n" "> + */\n" "> +static int nvme_disable_and_flr(struct pci_dev *dev, int probe)\n" "\n" @@ -66,7 +70,7 @@ "> +\tu32 cfg;\n" "> +\n" "> +\tif (dev->class != PCI_CLASS_STORAGE_EXPRESS ||\n" - "> +\t????!pcie_has_flr(dev) || !pci_resource_start(dev, 0))\n" + "> +\t\302\240\302\240\302\240\302\240!pcie_has_flr(dev) || !pci_resource_start(dev, 0))\n" "> +\t\treturn -ENOTTY;\n" "> +\n" "> +\tif (probe)\n" @@ -87,20 +91,20 @@ "> +\t\tunsigned long timeout;\n" "> +\n" "> +\t\t/*\n" - "> +\t\t?* Per nvme_disable_ctrl() skip shutdown notification as it\n" - "> +\t\t?* could complete commands to the admin queue.??We only\n" + "> +\t\t\302\240* Per nvme_disable_ctrl() skip shutdown notification as it\n" + "> +\t\t\302\240* could complete commands to the admin queue.\302\240\302\240We only\n" "> intend\n" - "> +\t\t?* to quiesce the device before reset.\n" - "> +\t\t?*/\n" + "> +\t\t\302\240* to quiesce the device before reset.\n" + "> +\t\t\302\240*/\n" "> +\t\tcfg &= ~(NVME_CC_SHN_MASK | NVME_CC_ENABLE);\n" "> +\n" "> +\t\twritel(cfg, bar + NVME_REG_CC);\n" "> +\n" "> +\t\t/*\n" - "> +\t\t?* Some controllers require an additional delay here, see\n" - "> +\t\t?* NVME_QUIRK_DELAY_BEFORE_CHK_RDY.??None of those are yet\n" - "> +\t\t?* supported by this quirk.\n" - "> +\t\t?*/\n" + "> +\t\t\302\240* Some controllers require an additional delay here, see\n" + "> +\t\t\302\240* NVME_QUIRK_DELAY_BEFORE_CHK_RDY.\302\240\302\240None of those are yet\n" + "> +\t\t\302\240* supported by this quirk.\n" + "> +\t\t\302\240*/\n" "> +\n" "> +\t\t/* Cap register provides max timeout in 500ms increments */\n" "> +\t\ttimeout = ((NVME_CAP_TIMEOUT(cap) + 1) * HZ / 2) + jiffies;\n" @@ -129,29 +133,29 @@ "> +\treturn 0;\n" "> +}\n" "> +\n" - "> ?static const struct pci_dev_reset_methods pci_dev_reset_methods[] = {\n" - "> ?\t{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82599_SFP_VF,\n" - "> ?\t\t?reset_intel_82599_sfp_virtfn },\n" + "> \302\240static const struct pci_dev_reset_methods pci_dev_reset_methods[] = {\n" + "> \302\240\t{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82599_SFP_VF,\n" + "> \302\240\t\t\302\240reset_intel_82599_sfp_virtfn },\n" "> @@ -3676,6 +3758,7 @@ static const struct pci_dev_reset_methods\n" "> pci_dev_reset_methods[] = {\n" - "> ?\t\treset_ivb_igd },\n" - "> ?\t{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IVB_M2_VGA,\n" - "> ?\t\treset_ivb_igd },\n" + "> \302\240\t\treset_ivb_igd },\n" + "> \302\240\t{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IVB_M2_VGA,\n" + "> \302\240\t\treset_ivb_igd },\n" "> +\t{ PCI_VENDOR_ID_SAMSUNG, 0xa804, nvme_disable_and_flr },\n" "\n" "Why don't we just define a macro just like other DEVICE_IDs. (e.g.\n" "PCIE_DEVICE_ID_INTEL_82599_SFP_VF).\n" "\n" - "#define PCI_DEVICE_ID_SAMSUNG_PM961 ?0xa804\n" + "#define PCI_DEVICE_ID_SAMSUNG_PM961 \302\2400xa804\n" "\n" - "> ?\t{ PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID,\n" - "> ?\t\treset_chelsio_generic_dev },\n" - "> ?\t{ 0 }\n" + "> \302\240\t{ PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID,\n" + "> \302\240\t\treset_chelsio_generic_dev },\n" + "> \302\240\t{ 0 }\n" "> \n" "> \n" "> _______________________________________________\n" "> Linux-nvme mailing list\n" - "> Linux-nvme at lists.infradead.org\n" + "> Linux-nvme@lists.infradead.org\n" > http://lists.infradead.org/mailman/listinfo/linux-nvme -dcdbcabc24ba102c49286b78c0c2a96512541d2830c6f30f4ca2e49793061e24 +6e94f0be4b2ce81cfe3cda7bba66026346c59e6170ae72cce8c19d51a4d5d2d2
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.