All of lore.kernel.org
 help / color / mirror / Atom feed
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.