From: "Jiang, Dave" <dave.jiang@intel.com>
To: "bhelgaas@google.com" <bhelgaas@google.com>
Cc: "Allen.Hubbe@emc.com" <Allen.Hubbe@emc.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
"jdmason@kudzu.us" <jdmason@kudzu.us>,
"linux-ntb@googlegroups.com" <linux-ntb@googlegroups.com>
Subject: Re: [PATCH 04/16] Check the DID for certain workaround error flags to be set.
Date: Wed, 20 May 2015 21:15:39 +0000 [thread overview]
Message-ID: <1432156539.19618.135.camel@intel.com> (raw)
In-Reply-To: <CAErSpo45RH8BA_GzGGTekDfM0fSMBPPs79NpFyYsvVPdhVSqGw@mail.gmail.com>
T24gV2VkLCAyMDE1LTA1LTIwIGF0IDE2OjExIC0wNTAwLCBCam9ybiBIZWxnYWFzIHdyb3RlOg0K
PiBPbiBXZWQsIE1heSAyMCwgMjAxNSBhdCAxMDo0MSBBTSwgQWxsZW4gSHViYmUgPEFsbGVuLkh1
YmJlQGVtYy5jb20+IHdyb3RlOg0KPiA+IEZyb206IERhdmUgSmlhbmcgPGRhdmUuamlhbmdAaW50
ZWwuY29tPg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0Bp
bnRlbC5jb20+DQo+IA0KPiBOZWVkcyBhIHRvcGljIGluIHRoZSBzdWJqZWN0IGxpbmUgYW5kIGEg
Y2hhbmdlbG9nLg0KPiANCj4gSXQgYWxzbyBzZWVtcyB0byBkbyBhIGxvdCBtb3JlIHRoYW4ganVz
dCBjaGVja2luZyBkZXZpY2UgSUQgKEkgYXNzdW1lDQo+IHRoYXQncyB3aGF0ICJESUQiIG1lYW5z
KSwgc28gdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgc3BsaXQgaW50bw0KPiBzZXZlcmFsIHBhdGNo
ZXMgdGhhdCBlYWNoIGRvIG9uZSB0aGluZy4gIEkgc2VlIGF0IGxlYXN0Og0KPiANCj4gICAtIGNv
c21ldGljIGNvZGUgcmVzdHJ1Y3R1cmluZw0KPiAgIC0gd29ya19zdHJ1Y3QvdGFza2xldF9zdHJ1
Y3QgY2hhbmdlcw0KPiAgIC0gbmV3ICNkZWZpbmVzIGFuZCBiYXIyX29mZigpIGNoYW5nZXMNCg0K
SSB0aGluayB0aGlzIHBhdGNoIGdvdCBtYW5nbGVkIHdpdGggY291cGxlIG90aGVyIHBhdGNoZXMu
IEFsbGVuPw0KDQo+IA0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf
aW50ZWwuYyB8IDE5NiArKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0NCj4gPiAg
ZHJpdmVycy9udGIvaHcvaW50ZWwvbnRiX2h3X2ludGVsLmggfCAgMjQgKysrKy0NCj4gPiAgZHJp
dmVycy9udGIvbnRiX3RyYW5zcG9ydC5jICAgICAgICAgfCAgMTYgKy0tDQo+ID4gIDMgZmlsZXMg
Y2hhbmdlZCwgMTMzIGluc2VydGlvbnMoKyksIDEwMyBkZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRp
ZmYgLS1naXQgYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYyBiL2RyaXZlcnMv
bnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gaW5kZXggZDE2MmYyMi4uODlmZWE1MCAx
MDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYw0KPiA+
ICsrKyBiL2RyaXZlcnMvbnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gQEAgLTUwMyw3
ICs1MDMsNiBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAq
ZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBzaXplX3QgYnVmX3NpemU7DQo+
ID4gICAgICAgICBzc2l6ZV90IHJldCwgb2ZmOw0KPiA+ICAgICAgICAgdW5pb24geyB1NjQgdjY0
OyB1MzIgdjMyOyB1MTYgdjE2OyB9IHU7DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25nIHJlZzsN
Cj4gPg0KPiA+ICAgICAgICAgbmRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsNCj4gPiAgICAgICAg
IG1taW8gPSBuZGV2LT5zZWxmX21taW87DQo+ID4gQEAgLTUzOCwxMCArNTM3LDEwIEBAIHN0YXRp
YyBzc2l6ZV90IG5kZXZfZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNl
ciAqdWJ1ZiwNCj4gPg0KPiA+ICAgICAgICAgaWYgKCFuZGV2LT5yZWctPmxpbmtfaXNfdXAobmRl
dikpIHsNCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1
Zl9zaXplIC0gb2ZmLA0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaW5r
IFNhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIkxpbmsgU3RhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+
ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBv
ZmYsDQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU2F0dXMgLVx0
XHRVcFxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU3Rh
dHVzIC1cdFx0VXBcbiIpOw0KPiA+ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1
ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIkxpbmsgU3BlZWQgLVx0XHRQQ0ktRSBHZW4gJXVcbiIsDQo+ID4gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgTlRCX0xOS19TVEFfU1BFRUQobmRldi0+bG5rX3N0YSkpOw0K
PiA+IEBAIC01NjgsMzYgKzU2NywzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVh
ZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBvZmYg
Kz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAg
ICAgICAgICAgICAgICJEb29yYmVsbCBNYXNrIENhY2hlZCAtXHQlI2xseFxuIiwgbmRldi0+ZGJf
bWFzayk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZfcmVnLT5kYl9tYXNrOw0K
PiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1pbyArIHJlZyk7DQo+ID4g
KyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsgbmRldi0+c2VsZl9yZWct
PmRiX21hc2spOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z
aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9vcmJlbGwgTWFzayAt
XHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZf
cmVnLT5kYl9iZWxsOw0KPiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1p
byArIHJlZyk7DQo+ID4gKyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsg
bmRldi0+c2VsZl9yZWctPmRiX2JlbGwpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi
dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAi
RG9vcmJlbGwgQmVsbCAtXHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAgICAgICAgIG9m
ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg
ICAgICAgICAgICAgICAgIlxuTlRCIEluY29taW5nIFhMQVQ6XG4iKTsNCj4gPg0KPiA+IC0gICAg
ICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMik7DQo+ID4gLSAg
ICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgdS52NjQgPSBp
b3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMikpOw0K
PiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0K
PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDIzIC1cdFx0JSMwMThsbHhcbiIsIHUu
djY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJh
cjJfeGxhdCwgNCk7DQo+ID4gLSAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0K
PiA+ICsgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9y
ZWctPmJhcjJfeGxhdCwgNCkpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBv
ZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDQ1
IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9v
ZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDIpOw0KPiA+IC0gICAgICAgdS52NjQgPSBp
b3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyAr
IGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xpbWl0LCAyKSk7DQo+ID4gICAgICAgICBv
ZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAg
ICAgICAgICAgICAgICAgICJMTVQyMyAtXHRcdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0K
PiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDQp
Ow0KPiA+IC0gICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAg
IHUudjY0ID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xp
bWl0LCA0KSk7DQo+ID4gICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3Np
emUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICJMTVQ0NSAtXHRcdFx0JSMw
MThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IEBAIC02MDYsNDEgKzU5OSwzNCBAQCBzdGF0aWMg
c3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIg
KnVidWYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYg
KyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIlxuTlRCIE91dGdvaW5nIEIyQiBYTEFUOlxuIik7DQo+ID4NCj4gPiAtICAg
ICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJfUEJBUjJYTEFUX09GRlNFVCwg
Mik7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsg
cmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8g
KyBTTkJfUEJBUjIzWExBVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9m
ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCMkIgWExBVDIzIC1cdFx0JSMwMThsbHhc
biIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IGJhcjJf
b2ZmKFNOQl9QQkFSMlhMQVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAg
ICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAg
ICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4g
ICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z
aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IkIyQiBYTEFUNDUgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+ID4gLSAgICAgICAg
ICAgICAgICAgICAgICAgcmVnID0gYmFyMl9vZmYoU05CX1BCQVIyTE1UX09GRlNFVCwgMik7DQo+
ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsN
Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJf
UEJBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNj
bnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIkIyQiBMTVQyMyAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2
NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJf
UEJBUjJMTVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9
IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHUudjY0
ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAg
ICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYs
DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQjJCIExNVDQ1
IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICAgICAg
ICAgIG9mZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbk5UQiBTZWNvbmRhcnkgQkFS
OlxuIik7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIwX29mZihT
TkJfU0JBUjBCQVNFX09GRlNFVCwgMCk7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52
NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1
LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjBCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg
ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g
b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNCQVIw
MSAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAg
ICAgICByZWcgPSBiYXIwX29mZihTTkJfU0JBUjBCQVNFX09GRlNFVCwgMik7DQo+ID4gLSAgICAg
ICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAg
ICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjIzQkFT
RV9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmludGYo
YnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICJTQkFSMjMgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+
ID4gLSAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gYmFyMF9vZmYoU05CX1NCQVIwQkFTRV9P
RkZTRVQsIDQpOw0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHUudjY0ID0gaW9yZWFkNjQo
bW1pbyArIHJlZyk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2
NChtbWlvICsgU05CX1NCQVI0NUJBU0VfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAgICAgICAgICAg
ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0JBUjQ1IC1cdFx0JSMwMThs
bHhcbiIsIHUudjY0KTsNCj4gPiAgICAgICAgICAgICAgICAgfQ0KPiA+IEBAIC02NDgsMzEgKzYz
NCwzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmls
cCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmlu
dGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiXG5TTkIgTlRCIFN0YXRpc3RpY3M6XG4iKTsNCj4gPg0KPiA+IC0gICAgICAg
ICAgICAgICByZWcgPSBTTkJfVVNNRU1NSVNTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAg
dS52MTYgPSBpb3JlYWQxNihtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgdS52MTYg
PSBpb3JlYWQxNihtbWlvICsgU05CX1VTTUVNTUlTU19PRkZTRVQpOw0KPiA+ICAgICAgICAgICAg
ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVwc3RyZWFtIE1lbW9yeSBNaXNzIC1cdCV1
XG4iLCB1LnYxNik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi
dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICJcblNOQiBOVEIgSGFyZHdhcmUgRXJyb3JzOlxuIik7DQo+ID4NCj4gPiAtICAgICAg
ICAgICAgICAgcmVnID0gU05CX0RFVlNUU19PRkZTRVQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlm
ICghcGNpX3JlYWRfY29uZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjE2KSkNCj4g
PiArICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfd29yZChuZGV2LT5udGIucGRl
diwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkJfREVW
U1RTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBvZmYgKz0g
c2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAiREVWU1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsN
Cj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcgPSBTTkJfTElOS19TVEFUVVNfT0ZGU0VUOw0K
PiA+IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ193b3JkKG5kZXYtPm50Yi5w
ZGV2LCByZWcsICZ1LnYxNikpDQo+ID4gKyAgICAgICAgICAgICAgIGlmICghcGNpX3JlYWRfY29u
ZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgU05CX0xJTktfU1RBVFVTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAg
ICAgICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUg
LSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTE5L
U1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcg
PSBTTkJfVU5DRVJSU1RTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVh
ZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjMyKSkNCj4gPiArICAgICAg
ICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4g
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOQl9VTkNFUlJTVFNf
T0ZGU0VULCAmdS52MzIpKQ0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25w
cmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICJVTkNFUlJTVFMgLVx0XHQlIzA2eFxuIiwgdS52MzIpOw0K
PiA+DQo+ID4gLSAgICAgICAgICAgICAgIHJlZyA9IFNOQl9DT1JFUlJTVFNfT0ZGU0VUOw0KPiA+
IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ19kd29yZChuZGV2LT5udGIucGRl
diwgcmVnLCAmdS52MzIpKQ0KPiA+ICsgICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZp
Z19kd29yZChuZGV2LT5udGIucGRldiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgU05CX0NPUkVSUlNUU19PRkZTRVQsICZ1LnYzMikpDQo+ID4gICAgICAg
ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g
b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPUkVS
UlNUUyAtXHRcdCUjMDZ4XG4iLCB1LnYzMik7DQo+ID4gICAgICAgICB9DQo+ID4gQEAgLTEzODgs
NyArMTM3Myw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50ZWxfbnRi
X2RldiAqbmRldiwNCj4gPiAgew0KPiA+ICAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7DQo+
ID4gICAgICAgICB2b2lkIF9faW9tZW0gKm1taW87DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25n
IG9mZjsNCj4gPiAgICAgICAgIHJlc291cmNlX3NpemVfdCBiYXJfc2l6ZTsNCj4gPiAgICAgICAg
IHBoeXNfYWRkcl90IGJhcl9hZGRyOw0KPiA+ICAgICAgICAgaW50IGIyYl9iYXI7DQo+ID4gQEAg
LTE0ODQsOSArMTQ2OCw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50
ZWxfbnRiX2RldiAqbmRldiwNCj4gPiAgICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2Rldihu
ZGV2KSwgIlNCQVI1U1ogJSN4XG4iLCBiYXJfc3opOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4g
LSAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBiYXIgYmFzZSBhZGRyZXNzZXMgKi8NCj4gPiAtICAg
ICAgIG9mZiA9IFNOQl9TQkFSMEJBU0VfT0ZGU0VUOw0KPiA+IC0NCj4gPiAgICAgICAgIC8qIFNC
QVIwMSBoaXQgYnkgZmlyc3QgcGFydCBvZiB0aGUgYjJiIGJhciAqLw0KPiA+ICAgICAgICAgaWYg
KGIyYl9iYXIgPT0gMCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJh
cjBfYWRkcjsNCj4gPiBAQCAtMTUwNCw3ICsxNDg1LDcgQEAgc3RhdGljIGludCBzbmJfc2V0dXBf
YjJiX213KHN0cnVjdCBpbnRlbF9udGJfZGV2ICpuZGV2LA0KPiA+ICAgICAgICAgfQ0KPiA+DQo+
ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjAxICUjMDE4bGx4XG4iLCBi
YXJfYWRkcik7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29m
ZihvZmYsIDApKTsNCj4gPiArICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9T
QkFSMEJBU0VfT0ZGU0VUKTsNCj4gPg0KPiA+ICAgICAgICAgLyogT3RoZXIgU0JBUiBhcmUgbm9y
bWFsbHkgaGl0IGJ5IHRoZSBQQkFSIHhsYXQsIGV4Y2VwdCBmb3IgYjJiIGJhci4NCj4gPiAgICAg
ICAgICAqIFRoZSBiMmIgYmFyIGlzIGVpdGhlciBkaXNhYmxlZCBhYm92ZSwgb3IgY29uZmlndXJl
ZCBoYWxmLXNpemUsIGFuZA0KPiA+IEBAIC0xNTEyLDEwMiArMTQ5Myw5NiBAQCBzdGF0aWMgaW50
IHNuYl9zZXR1cF9iMmJfbXcoc3RydWN0IGludGVsX250Yl9kZXYgKm5kZXYsDQo+ID4gICAgICAg
ICAgKi8NCj4gPg0KPiA+ICAgICAgICAgYmFyX2FkZHIgPSBhZGRyLT5iYXIyX2FkZHI2NCArIChi
MmJfYmFyID09IDIgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQo
YmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYsIDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRy
ID0gaW9yZWFkNjQobW1pbyArIGJhcjBfb2ZmKG9mZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0
ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVIyM0JBU0VfT0ZGU0VUKTsNCj4gPiArICAgICAg
IGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSMjNCQVNFX09GRlNFVCk7DQo+ID4g
ICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjIzICUjMDE4bGx4XG4iLCBiYXJf
YWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICghbmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAg
ICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAg
ICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+
IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYs
IDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFy
MF9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwg
bW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9h
ZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg
ICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNDUgJSMwMThsbHhcbiIsIGJh
cl9hZGRyKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gICAgICAgICAgICAgICAgIGJhcl9h
ZGRyID0gYWRkci0+YmFyNF9hZGRyMzIgKw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIChi
MmJfYmFyID09IDQgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICAgICAgICAgIGlv
d3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAg
ICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIwX29mZihvZmYsIDQpKTsNCj4g
PiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVI0QkFT
RV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8g
KyBTTkJfU0JBUjRCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRl
dl9kZXYobmRldiksICJTQkFSNCAlIzAxMGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAg
ICAgICAgICAgICAgIGJhcl9hZGRyID0gYWRkci0+YmFyNV9hZGRyMzIgKw0KPiA+ICAgICAgICAg
ICAgICAgICAgICAgICAgIChiMmJfYmFyID09IDUgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4g
LSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwg
NSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIw
X29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBt
bWlvICsgU05CX1NCQVI1QkFTRV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRk
ciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAg
ICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNSAlIzAxMGxseFxuIiwgYmFyX2Fk
ZHIpOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBi
YXIgbGltaXRzID09IGJhc2UgYWRkcnMgKHplcm8gbGVuZ3RoIHdpbmRvd3MpICovDQo+ID4gLSAg
ICAgICBvZmYgPSBTTkJfU0JBUjJMTVRfT0ZGU0VUOw0KPiA+DQo+ID4gICAgICAgICBiYXJfYWRk
ciA9IGFkZHItPmJhcjJfYWRkcjY0ICsgKGIyYl9iYXIgPT0gMiA/IG5kZXYtPmIyYl9vZmYgOiAw
KTsNCj4gPiAtICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwg
MikpOw0KPiA+IC0gICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2Zm
LCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjIz
TE1UX09GRlNFVCk7DQo+ID4gKyAgICAgICBiYXJfYWRkciA9IGlvcmVhZDY0KG1taW8gKyBTTkJf
U0JBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAi
U0JBUjIzTE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh
bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHIt
PmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0
ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy
X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy
X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg
ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNDVMTVRfT0ZGU0VUKTsN
Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgU05CX1NCQVI0
NUxNVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp
LCAiU0JBUjQ1TE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVsc2Ug
ew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjMyICsNCj4g
PiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6
IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBiYXIy
X29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMiht
bWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMihi
YXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNExNVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg
ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjRMTVRfT0ZGU0VUKTsNCj4gPiAg
ICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2RldihuZGV2KSwgIlNCQVI0TE1UICUjMDEwbGx4
XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBhZGRy
LT5iYXI1X2FkZHIzMiArDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgKGIyYl9iYXIgPT0g
NSA/IG5kZXYtPmIyYl9vZmYgOiAwKTsNCj4gPiAtICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh
cl9hZGRyLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4gLSAgICAgICAgICAgICAgIGJh
cl9hZGRyID0gaW9yZWFkMzIobW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+ICsgICAgICAg
ICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjVMTVRfT0ZGU0VUKTsN
Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMihtbWlvICsgU05CX1NCQVI1
TE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks
ICJTQkFSNUxNVCAlIzA1bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9DQo+ID4NCj4g
PiAgICAgICAgIC8qIHplcm8gaW5jb21pbmcgdHJhbnNsYXRpb24gYWRkcnMgKi8NCj4gPiAtICAg
ICAgIG9mZiA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VUOw0KPiA+IC0NCj4gPiAtICAgICAgIGlvd3Jp
dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo
MCwgbW1pbyArIFNOQl9TQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh
bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1p
byArIGJhcjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwg
bW1pbyArIFNOQl9TQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+
IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNCkpOw0K
PiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkp
Ow0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIFNOQl9TQkFSNFhMQVRf
T0ZGU0VUKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKDAsIG1taW8gKyBTTkJfU0JB
UjVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHplcm8g
b3V0Z29pbmcgdHJhbnNsYXRpb24gbGltaXRzICh3aG9sZSBiYXIgc2l6ZSB3aW5kb3dzKSAqLw0K
PiA+IC0gICAgICAgb2ZmID0gU05CX1BCQVIyTE1UX09GRlNFVDsNCj4gPiAtICAgICAgIGlvd3Jp
dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo
MCwgbW1pbyArIFNOQl9QQkFSMjNMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIGlmICghbmRldi0+
YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyArIGJh
cjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyAr
IFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gLSAgICAg
ICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gLSAg
ICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4g
KyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI0TE1UX09GRlNFVCk7
DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI1TE1UX09G
RlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHNldCBvdXRnb2luZyB0
cmFuc2xhdGlvbiBvZmZzZXRzICovDQo+ID4gLSAgICAgICBvZmYgPSBTTkJfUEJBUjJYTEFUX09G
RlNFVDsNCj4gPiAtDQo+ID4gICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy
NjQ7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYs
IDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG9m
ZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVIy
M1hMQVRfT0ZGU0VUKTsNCj4gPiArICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNO
Ql9QQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp
LCAiUEJBUjIzWExBVCAlIzAxOGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAgICAgICBp
ZiAoIW5kZXYtPmJhcjRfc3BsaXQpIHsNCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBw
ZWVyX2FkZHItPmJhcjRfYWRkcjY0Ow0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy
X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy
X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg
ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7
DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFS
NDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRl
diksICJQQkFSNDVYTEFUICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVs
c2Ugew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy
NjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjJf
b2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1t
aW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh
cl9hZGRyLCBtbWlvICsgU05CX1BCQVI0WExBVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg
ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjRYTEFUX09GRlNFVCk7DQo+ID4g
ICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJQQkFSNFhMQVQgJSMwMTBs
bHhcbiIsIGJhcl9hZGRyKTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBl
ZXJfYWRkci0+YmFyMl9hZGRyNjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJf
YWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJf
YWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIyX29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAg
ICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVI1WExBVF9PRkZTRVQpOw0K
PiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjVY
TEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks
ICJQQkFSNVhMQVQgJSMwMTBsbHhcbiIsIGJhcl9hZGRyKTsNCj4gPiAgICAgICAgIH0NCj4gPg0K
PiA+IEBAIC0xNzQ3LDI5ICsxNzIyLDY4IEBAIHN0YXRpYyBpbnQgc25iX2luaXRfZGV2KHN0cnVj
dCBpbnRlbF9udGJfZGV2ICpuZGV2KQ0KPiA+ICAgICAgICAgdTggcHBkOw0KPiA+ICAgICAgICAg
aW50IHJjLCBtZW07DQo+ID4NCj4gPiArICAgICAgIHBkZXYgPSBuZGV2X3BkZXYobmRldik7DQo+
ID4gKw0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsNCj4gPiAgICAgICAgIC8q
IFRoZXJlIGlzIGEgWGVvbiBoYXJkd2FyZSBlcnJhdGEgcmVsYXRlZCB0byB3cml0ZXMgdG8gU0RP
T1JCRUxMIG9yDQo+ID4gICAgICAgICAgKiBCMkJET09SQkVMTCBpbiBjb25qdW5jdGlvbiB3aXRo
IGluYm91bmQgYWNjZXNzIHRvIE5UQiBNTUlPIFNwYWNlLA0KPiA+ICAgICAgICAgICogd2hpY2gg
bWF5IGhhbmcgdGhlIHN5c3RlbS4gIFRvIHdvcmthcm91bmQgdGhpcyB1c2UgdGhlIHNlY29uZCBt
ZW1vcnkNCj4gPiAgICAgICAgICAqIHdpbmRvdyB0byBhY2Nlc3MgdGhlIGludGVycnVwdCBhbmQg
c2NyYXRjaCBwYWQgcmVnaXN0ZXJzIG9uIHRoZQ0KPiA+ICAgICAgICAgICogcmVtb3RlIHN5c3Rl
bS4NCj4gPiAgICAgICAgICAqLw0KPiA+IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRC
X0hXRVJSX1NET09SQkVMTF9MT0NLVVA7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURf
SU5URUxfTlRCX1NTX0pTRjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9O
VEJfUFNfSlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJf
SlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+
ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAg
ICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNh
c2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lf
REVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0Vf
SURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5U
RUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJf
UFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNY
Og0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfU0RP
T1JCRUxMX0xPQ0tVUDsNCj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICB9
DQo+ID4NCj4gPiArICAgICAgIHN3aXRjaCAocGRldi0+ZGV2aWNlKSB7DQo+ID4gICAgICAgICAv
KiBUaGVyZSBpcyBhIGhhcmR3YXJlIGVycmF0YSByZWxhdGVkIHRvIGFjY2Vzc2luZyBhbnkgcmVn
aXN0ZXIgaW4NCj4gPiAgICAgICAgICAqIFNCMDFCQVNFIGluIHRoZSBwcmVzZW5jZSBvZiBiaWRp
cmVjdGlvbmFsIHRyYWZmaWMgY3Jvc3NpbmcgdGhlIE5UQi4NCj4gPiAgICAgICAgICAqLw0KPiA+
IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRCX0hXRVJSX1NCMDFCQVNFX0xPQ0tVUDsN
Cj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsg
ICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBj
YXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBD
SV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklD
RV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lO
VEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8
PSBOVEJfSFdFUlJfU0IwMUJBU0VfTE9DS1VQOw0KPiA+ICsgICAgICAgICAgICAgICBicmVhazsN
Cj4gPiArICAgICAgIH0NCj4gPg0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsN
Cj4gPiAgICAgICAgIC8qIEhXIEVycmF0YSBvbiBiaXQgMTQgb2YgYjJiZG9vcmJlbGwgcmVnaXN0
ZXIuICBXcml0ZXMgd2lsbCBub3QgYmUNCj4gPiAgICAgICAgICAqIG1pcnJvcmVkIHRvIHRoZSBy
ZW1vdGUgc3lzdGVtLiAgU2hyaW5rIHRoZSBudW1iZXIgb2YgYml0cyBieSBvbmUsDQo+ID4gICAg
ICAgICAgKiBzaW5jZSBiaXQgMTQgaXMgdGhlIGxhc3QgYml0Lg0KPiA+ICAgICAgICAgICovDQo+
ID4gLSAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklU
MTQ7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0pTRjoNCj4g
PiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSlNGOg0KPiA+ICsgICAg
ICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSlNGOg0KPiA+ICsgICAgICAgY2Fz
ZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9E
RVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9J
RF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRF
TF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9Q
U19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6
DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiAr
ICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAg
Y2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAg
ICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklUMTQ7DQo+ID4g
KyAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+ICsgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICBu
ZGV2LT5yZWcgPSAmc25iX3JlZzsNCj4gPg0KPiA+IC0gICAgICAgcGRldiA9IG5kZXZfcGRldihu
ZGV2KTsNCj4gPiAtDQo+ID4gICAgICAgICByYyA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYs
IFNOQl9QUERfT0ZGU0VULCAmcHBkKTsNCj4gPiAgICAgICAgIGlmIChyYykNCj4gPiAgICAgICAg
ICAgICAgICAgcmV0dXJuIC1FSU87DQo+ID4gQEAgLTIwNjIsMTQgKzIwNzYsMTQgQEAgc3RhdGlj
IGNvbnN0IHN0cnVjdCBpbnRlbF9udGJfeGxhdF9yZWcgc25iX3ByaV94bGF0ID0gew0KPiA+ICAg
ICAgICAgICogd2luZG93IGJ5IHNldHRpbmcgdGhlIGxpbWl0IGVxdWFsIHRvIGJhc2UsIG5vciBj
YW4gaXQgbGltaXQgdGhlIHNpemUNCj4gPiAgICAgICAgICAqIG9mIHRoZSBtZW1vcnkgd2luZG93
IGJ5IHNldHRpbmcgdGhlIGxpbWl0IHRvIGJhc2UgKyBzaXplLg0KPiA+ICAgICAgICAgICovDQo+
ID4gLSAgICAgICAuYmFyMl9saW1pdCAgICAgICAgICAgICA9IFNOQl9QQkFSMkxNVF9PRkZTRVQs
DQo+ID4gLSAgICAgICAuYmFyMl94bGF0ICAgICAgICAgICAgICA9IFNOQl9QQkFSMlhMQVRfT0ZG
U0VULA0KPiA+ICsgICAgICAgLmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfUEJBUjIzTE1U
X09GRlNFVCwNCj4gPiArICAgICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1BCQVIy
M1hMQVRfT0ZGU0VULA0KPiA+ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50
ZWxfbnRiX3hsYXRfcmVnIHNuYl9zZWNfeGxhdCA9IHsNCj4gPiAgICAgICAgIC5iYXIwX2Jhc2Ug
ICAgICAgICAgICAgID0gU05CX1NCQVIwQkFTRV9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFyMl9s
aW1pdCAgICAgICAgICAgICA9IFNOQl9TQkFSMkxNVF9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFy
Ml94bGF0ICAgICAgICAgICAgICA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VULA0KPiA+ICsgICAgICAg
LmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfU0JBUjIzTE1UX09GRlNFVCwNCj4gPiArICAg
ICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1NCQVIyM1hMQVRfT0ZGU0VULA0KPiA+
ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfYjJiX2FkZHIgc25iX2Iy
Yl91c2RfYWRkciA9IHsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9udGIvaHcvaW50ZWwvbnRi
X2h3X2ludGVsLmggYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuaA0KPiA+IGlu
ZGV4IDAyMjRiMWEuLmZlYzY4OWQgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvaHcvaW50
ZWwvbnRiX2h3X2ludGVsLmgNCj4gPiArKysgYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf
aW50ZWwuaA0KPiA+IEBAIC03MCwxMSArNzAsMjcgQEANCj4gPg0KPiA+ICAvKiBTTkIgaGFyZHdh
cmUgKGFuZCBKU0YsIElWVCwgSFNYKSAqLw0KPiA+DQo+ID4gLSNkZWZpbmUgU05CX1BCQVIyTE1U
X09GRlNFVCAgICAgICAgICAgIDB4MDAwMA0KPiA+IC0jZGVmaW5lIFNOQl9QQkFSMlhMQVRfT0ZG
U0VUICAgICAgICAgICAweDAwMTANCj4gPiAtI2RlZmluZSBTTkJfU0JBUjJMTVRfT0ZGU0VUICAg
ICAgICAgICAgMHgwMDIwDQo+ID4gLSNkZWZpbmUgU05CX1NCQVIyWExBVF9PRkZTRVQgICAgICAg
ICAgIDB4MDAzMA0KPiA+ICsjZGVmaW5lIFNOQl9QQkFSMjNMTVRfT0ZGU0VUICAgICAgICAgICAw
eDAwMDANCj4gPiArI2RlZmluZSBTTkJfUEJBUjQ1TE1UX09GRlNFVCAgICAgICAgICAgMHgwMDA4
DQo+ID4gKyNkZWZpbmUgU05CX1BCQVI0TE1UX09GRlNFVCAgICAgICAgICAgIDB4MDAwOA0KPiA+
ICsjZGVmaW5lIFNOQl9QQkFSNUxNVF9PRkZTRVQgICAgICAgICAgICAweDAwMGMNCj4gPiArI2Rl
ZmluZSBTTkJfUEJBUjIzWExBVF9PRkZTRVQgICAgICAgICAgMHgwMDEwDQo+ID4gKyNkZWZpbmUg
U05CX1BCQVI0NVhMQVRfT0ZGU0VUICAgICAgICAgIDB4MDAxOA0KPiA+ICsjZGVmaW5lIFNOQl9Q
QkFSNFhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwMTgNCj4gPiArI2RlZmluZSBTTkJfUEJBUjVY
TEFUX09GRlNFVCAgICAgICAgICAgMHgwMDFjDQo+ID4gKyNkZWZpbmUgU05CX1NCQVIyM0xNVF9P
RkZTRVQgICAgICAgICAgIDB4MDAyMA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSNDVMTVRfT0ZGU0VU
ICAgICAgICAgICAweDAwMjgNCj4gPiArI2RlZmluZSBTTkJfU0JBUjRMTVRfT0ZGU0VUICAgICAg
ICAgICAgMHgwMDI4DQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1TE1UX09GRlNFVCAgICAgICAgICAg
IDB4MDAyYw0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSMjNYTEFUX09GRlNFVCAgICAgICAgICAweDAw
MzANCj4gPiArI2RlZmluZSBTTkJfU0JBUjQ1WExBVF9PRkZTRVQgICAgICAgICAgMHgwMDM4DQo+
ID4gKyNkZWZpbmUgU05CX1NCQVI0WExBVF9PRkZTRVQgICAgICAgICAgIDB4MDAzOA0KPiA+ICsj
ZGVmaW5lIFNOQl9TQkFSNVhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwM2MNCj4gPiAgI2RlZmlu
ZSBTTkJfU0JBUjBCQVNFX09GRlNFVCAgICAgICAgICAgMHgwMDQwDQo+ID4gKyNkZWZpbmUgU05C
X1NCQVIyM0JBU0VfT0ZGU0VUICAgICAgICAgIDB4MDA0OA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFS
NDVCQVNFX09GRlNFVCAgICAgICAgICAweDAwNTANCj4gPiArI2RlZmluZSBTTkJfU0JBUjRCQVNF
X09GRlNFVCAgICAgICAgICAgMHgwMDUwDQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1QkFTRV9PRkZT
RVQgICAgICAgICAgIDB4MDA1NA0KPiA+ICAjZGVmaW5lIFNOQl9TQkRGX09GRlNFVCAgICAgICAg
ICAgICAgICAgICAgICAgIDB4MDA1Yw0KPiA+ICAjZGVmaW5lIFNOQl9OVEJDTlRMX09GRlNFVCAg
ICAgICAgICAgICAweDAwNTgNCj4gPiAgI2RlZmluZSBTTkJfUERPT1JCRUxMX09GRlNFVCAgICAg
ICAgICAgMHgwMDYwDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQu
YyBiL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQuYw0KPiA+IGluZGV4IGYxZWQxYjcuLmJiMmVi
ODUgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gKysr
IGIvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gQEAgLTIwNCw4ICsyMDQsOCBAQCBz
dHJ1Y3QgbnRiX3RyYW5zcG9ydF9jdHggew0KPiA+DQo+ID4gICAgICAgICBib29sIGxpbmtfaXNf
dXA7DQo+ID4gICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGxpbmtfd29yazsNCj4gPiAtICAg
ICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBkYl93b3JrOw0KPiA+ICAgICAgICAgc3RydWN0IHdvcmtf
c3RydWN0IGxpbmtfY2xlYW51cDsNCj4gPiArICAgICAgIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBk
Yl93b3JrOw0KPiA+ICB9Ow0KPiA+DQo+ID4gIGVudW0gew0KPiA+IEBAIC0yNDEsNyArMjQxLDcg
QEAgZW51bSB7DQo+ID4gICNkZWZpbmUgTlRCX1FQX0RFRl9OVU1fRU5UUklFUyAxMDANCj4gPiAg
I2RlZmluZSBOVEJfTElOS19ET1dOX1RJTUVPVVQgIDEwDQo+ID4NCj4gPiAtc3RhdGljIHZvaWQg
bnRiX3RyYW5zcG9ydF9kb29yYmVsbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpOw0KPiA+
ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsodW5zaWduZWQgbG9uZyBk
YXRhKTsNCj4gPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0
X29wczsNCj4gPiAgc3RhdGljIHN0cnVjdCBudGJfY2xpZW50IG50Yl90cmFuc3BvcnRfY2xpZW50
Ow0KPiA+DQo+ID4gQEAgLTEwMDIsOCArMTAwMiw5IEBAIHN0YXRpYyBpbnQgbnRiX3RyYW5zcG9y
dF9wcm9iZShzdHJ1Y3QgbnRiX2NsaWVudCAqc2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+
ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZudC0+bGlu
a193b3JrLCBudGJfdHJhbnNwb3J0X2xpbmtfd29yayk7DQo+ID4gLSAgICAgICBJTklUX1dPUkso
Jm50LT5kYl93b3JrLCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmspOw0KPiA+ICAgICAgICAg
SU5JVF9XT1JLKCZudC0+bGlua19jbGVhbnVwLCBudGJfdHJhbnNwb3J0X2xpbmtfY2xlYW51cF93
b3JrKTsNCj4gPiArICAgICAgIHRhc2tsZXRfaW5pdCgmbnQtPmRiX3dvcmssIG50Yl90cmFuc3Bv
cnRfZG9vcmJlbGxfd29yaywNCj4gPiArICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9u
ZyludCk7DQo+ID4NCj4gPiAgICAgICAgIHJjID0gbnRiX3NldF9jdHgobmRldiwgbnQsICZudGJf
dHJhbnNwb3J0X29wcyk7DQo+ID4gICAgICAgICBpZiAocmMpDQo+ID4gQEAgLTEwNDQsNyArMTA0
NSw3IEBAIHN0YXRpYyB2b2lkIG50Yl90cmFuc3BvcnRfZnJlZShzdHJ1Y3QgbnRiX2NsaWVudCAq
c2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+ID4gICAgICAgICBpbnQgaTsNCj4gPg0KPiA+
ICAgICAgICAgbnRiX3RyYW5zcG9ydF9saW5rX2NsZWFudXAobnQpOw0KPiA+IC0gICAgICAgY2Fu
Y2VsX3dvcmtfc3luYygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xldF9kaXNhYmxl
KCZudC0+ZGJfd29yayk7DQo+ID4gICAgICAgICBjYW5jZWxfd29ya19zeW5jKCZudC0+bGlua19j
bGVhbnVwKTsNCj4gPiAgICAgICAgIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbnQtPmxpbmtf
d29yayk7DQo+ID4NCj4gPiBAQCAtMTg1MCwxMCArMTg1MSw5IEBAIHVuc2lnbmVkIGludCBudGJf
dHJhbnNwb3J0X21heF9zaXplKHN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCkNCj4gPiAgfQ0K
PiA+ICBFWFBPUlRfU1lNQk9MX0dQTChudGJfdHJhbnNwb3J0X21heF9zaXplKTsNCj4gPg0KPiA+
IC1zdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsoc3RydWN0IHdvcmtfc3Ry
dWN0ICp3b3JrKQ0KPiA+ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmso
dW5zaWduZWQgbG9uZyBkYXRhKQ0KPiA+ICB7DQo+ID4gLSAgICAgICBzdHJ1Y3QgbnRiX3RyYW5z
cG9ydF9jdHggKm50ID0gY29udGFpbmVyX29mKHdvcmssDQo+ID4gLSAgICAgICAgICAgICAgICAg
ICAgICAgc3RydWN0IG50Yl90cmFuc3BvcnRfY3R4LCBkYl93b3JrKTsNCj4gPiArICAgICAgIHN0
cnVjdCBudGJfdHJhbnNwb3J0X2N0eCAqbnQgPSAodm9pZCAqKWRhdGE7DQo+ID4gICAgICAgICBz
dHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXA7DQo+ID4gICAgICAgICB1NjQgZGJfbWFzaywgZGJf
Yml0cywgZGJfYWdhaW47DQo+ID4gICAgICAgICB1bnNpZ25lZCBpbnQgcXBfbnVtOw0KPiA+IEBA
IC0xODkwLDcgKzE4OTAsNyBAQCBzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX2Nh
bGxiYWNrKHZvaWQgKmRhdGEsIGludCB2ZWN0b3IpDQo+ID4NCj4gPiAgICAgICAgIG50Yl9kYl9z
ZXRfbWFzayhudC0+bmRldiwgbnRiX2RiX3ZhbGlkX21hc2sobnQtPm5kZXYpKTsNCj4gPg0KPiA+
IC0gICAgICAgc2NoZWR1bGVfd29yaygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xl
dF9zY2hlZHVsZSgmbnQtPmRiX3dvcmspOw0KPiA+ICB9DQo+ID4NCj4gPiAgc3RhdGljIGNvbnN0
IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0X29wcyA9IHsNCj4gPiAtLQ0KPiA+IDIu
NC4wLnJjMC40My5nY2Y4YThjNg0KPiA+DQo+ID4gLS0NCj4gPiBUbyB1bnN1YnNjcmliZSBmcm9t
IHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtcGNpIiBpbg0KPiA+
IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnDQo+ID4g
TW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8t
aW5mby5odG1sDQo=
WARNING: multiple messages have this Message-ID (diff)
From: "Jiang, Dave" <dave.jiang@intel.com>
To: "bhelgaas@google.com" <bhelgaas@google.com>
Cc: "Allen.Hubbe@emc.com" <Allen.Hubbe@emc.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
"jdmason@kudzu.us" <jdmason@kudzu.us>,
"linux-ntb@googlegroups.com" <linux-ntb@googlegroups.com>
Subject: Re: [PATCH 04/16] Check the DID for certain workaround error flags to be set.
Date: Wed, 20 May 2015 21:15:39 +0000 [thread overview]
Message-ID: <1432156539.19618.135.camel@intel.com> (raw)
In-Reply-To: <CAErSpo45RH8BA_GzGGTekDfM0fSMBPPs79NpFyYsvVPdhVSqGw@mail.gmail.com>
On Wed, 2015-05-20 at 16:11 -0500, Bjorn Helgaas wrote:
> On Wed, May 20, 2015 at 10:41 AM, Allen Hubbe <Allen.Hubbe@emc.com> wrote:
> > From: Dave Jiang <dave.jiang@intel.com>
> >
> > Signed-off-by: Dave Jiang <dave.jiang@intel.com>
>
> Needs a topic in the subject line and a changelog.
>
> It also seems to do a lot more than just checking device ID (I assume
> that's what "DID" means), so this should probably be split into
> several patches that each do one thing. I see at least:
>
> - cosmetic code restructuring
> - work_struct/tasklet_struct changes
> - new #defines and bar2_off() changes
I think this patch got mangled with couple other patches. Allen?
>
> > ---
> > drivers/ntb/hw/intel/ntb_hw_intel.c | 196 +++++++++++++++++++-----------------
> > drivers/ntb/hw/intel/ntb_hw_intel.h | 24 ++++-
> > drivers/ntb/ntb_transport.c | 16 +--
> > 3 files changed, 133 insertions(+), 103 deletions(-)
> >
> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c b/drivers/ntb/hw/intel/ntb_hw_intel.c
> > index d162f22..89fea50 100644
> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.c
> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.c
> > @@ -503,7 +503,6 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
> > size_t buf_size;
> > ssize_t ret, off;
> > union { u64 v64; u32 v32; u16 v16; } u;
> > - unsigned long reg;
> >
> > ndev = filp->private_data;
> > mmio = ndev->self_mmio;
> > @@ -538,10 +537,10 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
> >
> > if (!ndev->reg->link_is_up(ndev)) {
> > off += scnprintf(buf + off, buf_size - off,
> > - "Link Satus -\t\tDown\n");
> > + "Link Status -\t\tDown\n");
> > } else {
> > off += scnprintf(buf + off, buf_size - off,
> > - "Link Satus -\t\tUp\n");
> > + "Link Status -\t\tUp\n");
> > off += scnprintf(buf + off, buf_size - off,
> > "Link Speed -\t\tPCI-E Gen %u\n",
> > NTB_LNK_STA_SPEED(ndev->lnk_sta));
> > @@ -568,36 +567,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
> > off += scnprintf(buf + off, buf_size - off,
> > "Doorbell Mask Cached -\t%#llx\n", ndev->db_mask);
> >
> > - reg = ndev->self_reg->db_mask;
> > - u.v64 = ndev_db_read(ndev, mmio + reg);
> > + u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask);
> > off += scnprintf(buf + off, buf_size - off,
> > "Doorbell Mask -\t\t%#llx\n", u.v64);
> >
> > - reg = ndev->self_reg->db_bell;
> > - u.v64 = ndev_db_read(ndev, mmio + reg);
> > + u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell);
> > off += scnprintf(buf + off, buf_size - off,
> > "Doorbell Bell -\t\t%#llx\n", u.v64);
> >
> > off += scnprintf(buf + off, buf_size - off,
> > "\nNTB Incoming XLAT:\n");
> >
> > - reg = bar2_off(ndev->xlat_reg->bar2_xlat, 2);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 2));
> > off += scnprintf(buf + off, buf_size - off,
> > "XLAT23 -\t\t%#018llx\n", u.v64);
> >
> > - reg = bar2_off(ndev->xlat_reg->bar2_xlat, 4);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4));
> > off += scnprintf(buf + off, buf_size - off,
> > "XLAT45 -\t\t%#018llx\n", u.v64);
> >
> > - reg = bar2_off(ndev->xlat_reg->bar2_limit, 2);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 2));
> > off += scnprintf(buf + off, buf_size - off,
> > "LMT23 -\t\t\t%#018llx\n", u.v64);
> >
> > - reg = bar2_off(ndev->xlat_reg->bar2_limit, 4);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4));
> > off += scnprintf(buf + off, buf_size - off,
> > "LMT45 -\t\t\t%#018llx\n", u.v64);
> >
> > @@ -606,41 +599,34 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
> > off += scnprintf(buf + off, buf_size - off,
> > "\nNTB Outgoing B2B XLAT:\n");
> >
> > - reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 2);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "B2B XLAT23 -\t\t%#018llx\n", u.v64);
> >
> > - reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 4);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "B2B XLAT45 -\t\t%#018llx\n", u.v64);
> >
> > - reg = bar2_off(SNB_PBAR2LMT_OFFSET, 2);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + SNB_PBAR23LMT_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "B2B LMT23 -\t\t%#018llx\n", u.v64);
> >
> > - reg = bar2_off(SNB_PBAR2LMT_OFFSET, 4);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + SNB_PBAR45LMT_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "B2B LMT45 -\t\t%#018llx\n", u.v64);
> >
> > off += scnprintf(buf + off, buf_size - off,
> > "\nNTB Secondary BAR:\n");
> >
> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 0);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + SNB_SBAR0BASE_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "SBAR01 -\t\t%#018llx\n", u.v64);
> >
> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 2);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + SNB_SBAR23BASE_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "SBAR23 -\t\t%#018llx\n", u.v64);
> >
> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 4);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + SNB_SBAR45BASE_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "SBAR45 -\t\t%#018llx\n", u.v64);
> > }
> > @@ -648,31 +634,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
> > off += scnprintf(buf + off, buf_size - off,
> > "\nSNB NTB Statistics:\n");
> >
> > - reg = SNB_USMEMMISS_OFFSET;
> > - u.v16 = ioread16(mmio + reg);
> > + u.v16 = ioread16(mmio + SNB_USMEMMISS_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "Upstream Memory Miss -\t%u\n", u.v16);
> >
> > off += scnprintf(buf + off, buf_size - off,
> > "\nSNB NTB Hardware Errors:\n");
> >
> > - reg = SNB_DEVSTS_OFFSET;
> > - if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))
> > + if (!pci_read_config_word(ndev->ntb.pdev,
> > + SNB_DEVSTS_OFFSET, &u.v16))
> > off += scnprintf(buf + off, buf_size - off,
> > "DEVSTS -\t\t%#06x\n", u.v16);
> >
> > - reg = SNB_LINK_STATUS_OFFSET;
> > - if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))
> > + if (!pci_read_config_word(ndev->ntb.pdev,
> > + SNB_LINK_STATUS_OFFSET, &u.v16))
> > off += scnprintf(buf + off, buf_size - off,
> > "LNKSTS -\t\t%#06x\n", u.v16);
> >
> > - reg = SNB_UNCERRSTS_OFFSET;
> > - if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))
> > + if (!pci_read_config_dword(ndev->ntb.pdev,
> > + SNB_UNCERRSTS_OFFSET, &u.v32))
> > off += scnprintf(buf + off, buf_size - off,
> > "UNCERRSTS -\t\t%#06x\n", u.v32);
> >
> > - reg = SNB_CORERRSTS_OFFSET;
> > - if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))
> > + if (!pci_read_config_dword(ndev->ntb.pdev,
> > + SNB_CORERRSTS_OFFSET, &u.v32))
> > off += scnprintf(buf + off, buf_size - off,
> > "CORERRSTS -\t\t%#06x\n", u.v32);
> > }
> > @@ -1388,7 +1373,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
> > {
> > struct pci_dev *pdev;
> > void __iomem *mmio;
> > - unsigned long off;
> > resource_size_t bar_size;
> > phys_addr_t bar_addr;
> > int b2b_bar;
> > @@ -1484,9 +1468,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
> > dev_dbg(ndev_dev(ndev), "SBAR5SZ %#x\n", bar_sz);
> > }
> >
> > - /* setup incoming bar base addresses */
> > - off = SNB_SBAR0BASE_OFFSET;
> > -
> > /* SBAR01 hit by first part of the b2b bar */
> > if (b2b_bar == 0) {
> > bar_addr = addr->bar0_addr;
> > @@ -1504,7 +1485,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
> > }
> >
> > dev_dbg(ndev_dev(ndev), "SBAR01 %#018llx\n", bar_addr);
> > - iowrite64(bar_addr, mmio + bar0_off(off, 0));
> > + iowrite64(bar_addr, mmio + SNB_SBAR0BASE_OFFSET);
> >
> > /* Other SBAR are normally hit by the PBAR xlat, except for b2b bar.
> > * The b2b bar is either disabled above, or configured half-size, and
> > @@ -1512,102 +1493,96 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
> > */
> >
> > bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);
> > - iowrite64(bar_addr, mmio + bar0_off(off, 2));
> > - bar_addr = ioread64(mmio + bar0_off(off, 2));
> > + iowrite64(bar_addr, mmio + SNB_SBAR23BASE_OFFSET);
> > + bar_addr = ioread64(mmio + SNB_SBAR23BASE_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR23 %#018llx\n", bar_addr);
> >
> > if (!ndev->bar4_split) {
> > bar_addr = addr->bar4_addr64 +
> > (b2b_bar == 4 ? ndev->b2b_off : 0);
> > - iowrite64(bar_addr, mmio + bar0_off(off, 4));
> > - bar_addr = ioread64(mmio + bar0_off(off, 4));
> > + iowrite64(bar_addr, mmio + SNB_SBAR45BASE_OFFSET);
> > + bar_addr = ioread64(mmio + SNB_SBAR45BASE_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR45 %#018llx\n", bar_addr);
> > } else {
> > bar_addr = addr->bar4_addr32 +
> > (b2b_bar == 4 ? ndev->b2b_off : 0);
> > - iowrite32(bar_addr, mmio + bar0_off(off, 4));
> > - bar_addr = ioread32(mmio + bar0_off(off, 4));
> > + iowrite32(bar_addr, mmio + SNB_SBAR4BASE_OFFSET);
> > + bar_addr = ioread32(mmio + SNB_SBAR4BASE_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR4 %#010llx\n", bar_addr);
> >
> > bar_addr = addr->bar5_addr32 +
> > (b2b_bar == 5 ? ndev->b2b_off : 0);
> > - iowrite32(bar_addr, mmio + bar0_off(off, 5));
> > - bar_addr = ioread32(mmio + bar0_off(off, 5));
> > + iowrite32(bar_addr, mmio + SNB_SBAR5BASE_OFFSET);
> > + bar_addr = ioread32(mmio + SNB_SBAR5BASE_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR5 %#010llx\n", bar_addr);
> > }
> >
> > /* setup incoming bar limits == base addrs (zero length windows) */
> > - off = SNB_SBAR2LMT_OFFSET;
> >
> > bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);
> > - iowrite64(bar_addr, mmio + bar2_off(off, 2));
> > - bar_addr = ioread64(mmio + bar2_off(off, 2));
> > + iowrite64(bar_addr, mmio + SNB_SBAR23LMT_OFFSET);
> > + bar_addr = ioread64(mmio + SNB_SBAR23LMT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR23LMT %#018llx\n", bar_addr);
> >
> > if (!ndev->bar4_split) {
> > bar_addr = addr->bar4_addr64 +
> > (b2b_bar == 4 ? ndev->b2b_off : 0);
> > - iowrite64(bar_addr, mmio + bar2_off(off, 4));
> > - bar_addr = ioread64(mmio + bar2_off(off, 4));
> > + iowrite64(bar_addr, mmio + SNB_SBAR45LMT_OFFSET);
> > + bar_addr = ioread64(mmio + SNB_SBAR45LMT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR45LMT %#018llx\n", bar_addr);
> > } else {
> > bar_addr = addr->bar4_addr32 +
> > (b2b_bar == 4 ? ndev->b2b_off : 0);
> > - iowrite32(bar_addr, mmio + bar2_off(off, 4));
> > - bar_addr = ioread32(mmio + bar2_off(off, 4));
> > + iowrite32(bar_addr, mmio + SNB_SBAR4LMT_OFFSET);
> > + bar_addr = ioread32(mmio + SNB_SBAR4LMT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR4LMT %#010llx\n", bar_addr);
> >
> > bar_addr = addr->bar5_addr32 +
> > (b2b_bar == 5 ? ndev->b2b_off : 0);
> > - iowrite32(bar_addr, mmio + bar2_off(off, 5));
> > - bar_addr = ioread32(mmio + bar2_off(off, 5));
> > + iowrite32(bar_addr, mmio + SNB_SBAR5LMT_OFFSET);
> > + bar_addr = ioread32(mmio + SNB_SBAR5LMT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR5LMT %#05llx\n", bar_addr);
> > }
> >
> > /* zero incoming translation addrs */
> > - off = SNB_SBAR2XLAT_OFFSET;
> > -
> > - iowrite64(0, mmio + bar2_off(off, 2));
> > + iowrite64(0, mmio + SNB_SBAR23XLAT_OFFSET);
> >
> > if (!ndev->bar4_split) {
> > - iowrite64(0, mmio + bar2_off(off, 4));
> > + iowrite64(0, mmio + SNB_SBAR45XLAT_OFFSET);
> > } else {
> > - iowrite32(0, mmio + bar2_off(off, 4));
> > - iowrite32(0, mmio + bar2_off(off, 5));
> > + iowrite32(0, mmio + SNB_SBAR4XLAT_OFFSET);
> > + iowrite32(0, mmio + SNB_SBAR5XLAT_OFFSET);
> > }
> >
> > /* zero outgoing translation limits (whole bar size windows) */
> > - off = SNB_PBAR2LMT_OFFSET;
> > - iowrite64(0, mmio + bar2_off(off, 2));
> > + iowrite64(0, mmio + SNB_PBAR23LMT_OFFSET);
> > if (!ndev->bar4_split) {
> > - iowrite64(0, mmio + bar2_off(off, 4));
> > + iowrite64(0, mmio + SNB_PBAR45LMT_OFFSET);
> > } else {
> > - iowrite32(0, mmio + bar2_off(off, 4));
> > - iowrite32(0, mmio + bar2_off(off, 5));
> > + iowrite32(0, mmio + SNB_PBAR4LMT_OFFSET);
> > + iowrite32(0, mmio + SNB_PBAR5LMT_OFFSET);
> > }
> >
> > /* set outgoing translation offsets */
> > - off = SNB_PBAR2XLAT_OFFSET;
> > -
> > bar_addr = peer_addr->bar2_addr64;
> > - iowrite64(bar_addr, mmio + bar2_off(off, 2));
> > - bar_addr = ioread64(mmio + bar2_off(off, 2));
> > + iowrite64(bar_addr, mmio + SNB_PBAR23XLAT_OFFSET);
> > + bar_addr = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "PBAR23XLAT %#018llx\n", bar_addr);
> >
> > if (!ndev->bar4_split) {
> > bar_addr = peer_addr->bar4_addr64;
> > - iowrite64(bar_addr, mmio + bar2_off(off, 4));
> > - bar_addr = ioread64(mmio + bar2_off(off, 4));
> > + iowrite64(bar_addr, mmio + SNB_PBAR45XLAT_OFFSET);
> > + bar_addr = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "PBAR45XLAT %#018llx\n", bar_addr);
> > } else {
> > bar_addr = peer_addr->bar2_addr64;
> > - iowrite32(bar_addr, mmio + bar2_off(off, 4));
> > - bar_addr = ioread32(mmio + bar2_off(off, 4));
> > + iowrite32(bar_addr, mmio + SNB_PBAR4XLAT_OFFSET);
> > + bar_addr = ioread32(mmio + SNB_PBAR4XLAT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "PBAR4XLAT %#010llx\n", bar_addr);
> >
> > bar_addr = peer_addr->bar2_addr64;
> > - iowrite32(bar_addr, mmio + bar2_off(off, 5));
> > - bar_addr = ioread32(mmio + bar2_off(off, 5));
> > + iowrite32(bar_addr, mmio + SNB_PBAR5XLAT_OFFSET);
> > + bar_addr = ioread32(mmio + SNB_PBAR5XLAT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "PBAR5XLAT %#010llx\n", bar_addr);
> > }
> >
> > @@ -1747,29 +1722,68 @@ static int snb_init_dev(struct intel_ntb_dev *ndev)
> > u8 ppd;
> > int rc, mem;
> >
> > + pdev = ndev_pdev(ndev);
> > +
> > + switch (pdev->device) {
> > /* There is a Xeon hardware errata related to writes to SDOORBELL or
> > * B2BDOORBELL in conjunction with inbound access to NTB MMIO Space,
> > * which may hang the system. To workaround this use the second memory
> > * window to access the interrupt and scratch pad registers on the
> > * remote system.
> > */
> > - ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
> > + ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;
> > + break;
> > + }
> >
> > + switch (pdev->device) {
> > /* There is a hardware errata related to accessing any register in
> > * SB01BASE in the presence of bidirectional traffic crossing the NTB.
> > */
> > - ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
> > + ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;
> > + break;
> > + }
> >
> > + switch (pdev->device) {
> > /* HW Errata on bit 14 of b2bdoorbell register. Writes will not be
> > * mirrored to the remote system. Shrink the number of bits by one,
> > * since bit 14 is the last bit.
> > */
> > - ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
> > + ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;
> > + break;
> > + }
> >
> > ndev->reg = &snb_reg;
> >
> > - pdev = ndev_pdev(ndev);
> > -
> > rc = pci_read_config_byte(pdev, SNB_PPD_OFFSET, &ppd);
> > if (rc)
> > return -EIO;
> > @@ -2062,14 +2076,14 @@ static const struct intel_ntb_xlat_reg snb_pri_xlat = {
> > * window by setting the limit equal to base, nor can it limit the size
> > * of the memory window by setting the limit to base + size.
> > */
> > - .bar2_limit = SNB_PBAR2LMT_OFFSET,
> > - .bar2_xlat = SNB_PBAR2XLAT_OFFSET,
> > + .bar2_limit = SNB_PBAR23LMT_OFFSET,
> > + .bar2_xlat = SNB_PBAR23XLAT_OFFSET,
> > };
> >
> > static const struct intel_ntb_xlat_reg snb_sec_xlat = {
> > .bar0_base = SNB_SBAR0BASE_OFFSET,
> > - .bar2_limit = SNB_SBAR2LMT_OFFSET,
> > - .bar2_xlat = SNB_SBAR2XLAT_OFFSET,
> > + .bar2_limit = SNB_SBAR23LMT_OFFSET,
> > + .bar2_xlat = SNB_SBAR23XLAT_OFFSET,
> > };
> >
> > static const struct intel_b2b_addr snb_b2b_usd_addr = {
> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.h b/drivers/ntb/hw/intel/ntb_hw_intel.h
> > index 0224b1a..fec689d 100644
> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.h
> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.h
> > @@ -70,11 +70,27 @@
> >
> > /* SNB hardware (and JSF, IVT, HSX) */
> >
> > -#define SNB_PBAR2LMT_OFFSET 0x0000
> > -#define SNB_PBAR2XLAT_OFFSET 0x0010
> > -#define SNB_SBAR2LMT_OFFSET 0x0020
> > -#define SNB_SBAR2XLAT_OFFSET 0x0030
> > +#define SNB_PBAR23LMT_OFFSET 0x0000
> > +#define SNB_PBAR45LMT_OFFSET 0x0008
> > +#define SNB_PBAR4LMT_OFFSET 0x0008
> > +#define SNB_PBAR5LMT_OFFSET 0x000c
> > +#define SNB_PBAR23XLAT_OFFSET 0x0010
> > +#define SNB_PBAR45XLAT_OFFSET 0x0018
> > +#define SNB_PBAR4XLAT_OFFSET 0x0018
> > +#define SNB_PBAR5XLAT_OFFSET 0x001c
> > +#define SNB_SBAR23LMT_OFFSET 0x0020
> > +#define SNB_SBAR45LMT_OFFSET 0x0028
> > +#define SNB_SBAR4LMT_OFFSET 0x0028
> > +#define SNB_SBAR5LMT_OFFSET 0x002c
> > +#define SNB_SBAR23XLAT_OFFSET 0x0030
> > +#define SNB_SBAR45XLAT_OFFSET 0x0038
> > +#define SNB_SBAR4XLAT_OFFSET 0x0038
> > +#define SNB_SBAR5XLAT_OFFSET 0x003c
> > #define SNB_SBAR0BASE_OFFSET 0x0040
> > +#define SNB_SBAR23BASE_OFFSET 0x0048
> > +#define SNB_SBAR45BASE_OFFSET 0x0050
> > +#define SNB_SBAR4BASE_OFFSET 0x0050
> > +#define SNB_SBAR5BASE_OFFSET 0x0054
> > #define SNB_SBDF_OFFSET 0x005c
> > #define SNB_NTBCNTL_OFFSET 0x0058
> > #define SNB_PDOORBELL_OFFSET 0x0060
> > diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c
> > index f1ed1b7..bb2eb85 100644
> > --- a/drivers/ntb/ntb_transport.c
> > +++ b/drivers/ntb/ntb_transport.c
> > @@ -204,8 +204,8 @@ struct ntb_transport_ctx {
> >
> > bool link_is_up;
> > struct delayed_work link_work;
> > - struct work_struct db_work;
> > struct work_struct link_cleanup;
> > + struct tasklet_struct db_work;
> > };
> >
> > enum {
> > @@ -241,7 +241,7 @@ enum {
> > #define NTB_QP_DEF_NUM_ENTRIES 100
> > #define NTB_LINK_DOWN_TIMEOUT 10
> >
> > -static void ntb_transport_doorbell_work(struct work_struct *ws);
> > +static void ntb_transport_doorbell_work(unsigned long data);
> > static const struct ntb_ctx_ops ntb_transport_ops;
> > static struct ntb_client ntb_transport_client;
> >
> > @@ -1002,8 +1002,9 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
> > }
> >
> > INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work);
> > - INIT_WORK(&nt->db_work, ntb_transport_doorbell_work);
> > INIT_WORK(&nt->link_cleanup, ntb_transport_link_cleanup_work);
> > + tasklet_init(&nt->db_work, ntb_transport_doorbell_work,
> > + (unsigned long)nt);
> >
> > rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops);
> > if (rc)
> > @@ -1044,7 +1045,7 @@ static void ntb_transport_free(struct ntb_client *self, struct ntb_dev *ndev)
> > int i;
> >
> > ntb_transport_link_cleanup(nt);
> > - cancel_work_sync(&nt->db_work);
> > + tasklet_disable(&nt->db_work);
> > cancel_work_sync(&nt->link_cleanup);
> > cancel_delayed_work_sync(&nt->link_work);
> >
> > @@ -1850,10 +1851,9 @@ unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp)
> > }
> > EXPORT_SYMBOL_GPL(ntb_transport_max_size);
> >
> > -static void ntb_transport_doorbell_work(struct work_struct *work)
> > +static void ntb_transport_doorbell_work(unsigned long data)
> > {
> > - struct ntb_transport_ctx *nt = container_of(work,
> > - struct ntb_transport_ctx, db_work);
> > + struct ntb_transport_ctx *nt = (void *)data;
> > struct ntb_transport_qp *qp;
> > u64 db_mask, db_bits, db_again;
> > unsigned int qp_num;
> > @@ -1890,7 +1890,7 @@ static void ntb_transport_doorbell_callback(void *data, int vector)
> >
> > ntb_db_set_mask(nt->ndev, ntb_db_valid_mask(nt->ndev));
> >
> > - schedule_work(&nt->db_work);
> > + tasklet_schedule(&nt->db_work);
> > }
> >
> > static const struct ntb_ctx_ops ntb_transport_ops = {
> > --
> > 2.4.0.rc0.43.gcf8a8c6
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
WARNING: multiple messages have this Message-ID (diff)
From: "Jiang, Dave" <dave.jiang@intel.com>
To: "bhelgaas@google.com" <bhelgaas@google.com>
Cc: "Allen.Hubbe@emc.com" <Allen.Hubbe@emc.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
"jdmason@kudzu.us" <jdmason@kudzu.us>,
"linux-ntb@googlegroups.com" <linux-ntb@googlegroups.com>
Subject: Re: [PATCH 04/16] Check the DID for certain workaround error flags to be set.
Date: Wed, 20 May 2015 21:15:39 +0000 [thread overview]
Message-ID: <1432156539.19618.135.camel@intel.com> (raw)
In-Reply-To: <CAErSpo45RH8BA_GzGGTekDfM0fSMBPPs79NpFyYsvVPdhVSqGw@mail.gmail.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 26814 bytes --]
On Wed, 2015-05-20 at 16:11 -0500, Bjorn Helgaas wrote:
> On Wed, May 20, 2015 at 10:41 AM, Allen Hubbe <Allen.Hubbe@emc.com> wrote:
> > From: Dave Jiang <dave.jiang@intel.com>
> >
> > Signed-off-by: Dave Jiang <dave.jiang@intel.com>
>
> Needs a topic in the subject line and a changelog.
>
> It also seems to do a lot more than just checking device ID (I assume
> that's what "DID" means), so this should probably be split into
> several patches that each do one thing. I see at least:
>
> - cosmetic code restructuring
> - work_struct/tasklet_struct changes
> - new #defines and bar2_off() changes
I think this patch got mangled with couple other patches. Allen?
>
> > ---
> > drivers/ntb/hw/intel/ntb_hw_intel.c | 196 +++++++++++++++++++-----------------
> > drivers/ntb/hw/intel/ntb_hw_intel.h | 24 ++++-
> > drivers/ntb/ntb_transport.c | 16 +--
> > 3 files changed, 133 insertions(+), 103 deletions(-)
> >
> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c b/drivers/ntb/hw/intel/ntb_hw_intel.c
> > index d162f22..89fea50 100644
> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.c
> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.c
> > @@ -503,7 +503,6 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
> > size_t buf_size;
> > ssize_t ret, off;
> > union { u64 v64; u32 v32; u16 v16; } u;
> > - unsigned long reg;
> >
> > ndev = filp->private_data;
> > mmio = ndev->self_mmio;
> > @@ -538,10 +537,10 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
> >
> > if (!ndev->reg->link_is_up(ndev)) {
> > off += scnprintf(buf + off, buf_size - off,
> > - "Link Satus -\t\tDown\n");
> > + "Link Status -\t\tDown\n");
> > } else {
> > off += scnprintf(buf + off, buf_size - off,
> > - "Link Satus -\t\tUp\n");
> > + "Link Status -\t\tUp\n");
> > off += scnprintf(buf + off, buf_size - off,
> > "Link Speed -\t\tPCI-E Gen %u\n",
> > NTB_LNK_STA_SPEED(ndev->lnk_sta));
> > @@ -568,36 +567,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
> > off += scnprintf(buf + off, buf_size - off,
> > "Doorbell Mask Cached -\t%#llx\n", ndev->db_mask);
> >
> > - reg = ndev->self_reg->db_mask;
> > - u.v64 = ndev_db_read(ndev, mmio + reg);
> > + u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask);
> > off += scnprintf(buf + off, buf_size - off,
> > "Doorbell Mask -\t\t%#llx\n", u.v64);
> >
> > - reg = ndev->self_reg->db_bell;
> > - u.v64 = ndev_db_read(ndev, mmio + reg);
> > + u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell);
> > off += scnprintf(buf + off, buf_size - off,
> > "Doorbell Bell -\t\t%#llx\n", u.v64);
> >
> > off += scnprintf(buf + off, buf_size - off,
> > "\nNTB Incoming XLAT:\n");
> >
> > - reg = bar2_off(ndev->xlat_reg->bar2_xlat, 2);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 2));
> > off += scnprintf(buf + off, buf_size - off,
> > "XLAT23 -\t\t%#018llx\n", u.v64);
> >
> > - reg = bar2_off(ndev->xlat_reg->bar2_xlat, 4);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4));
> > off += scnprintf(buf + off, buf_size - off,
> > "XLAT45 -\t\t%#018llx\n", u.v64);
> >
> > - reg = bar2_off(ndev->xlat_reg->bar2_limit, 2);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 2));
> > off += scnprintf(buf + off, buf_size - off,
> > "LMT23 -\t\t\t%#018llx\n", u.v64);
> >
> > - reg = bar2_off(ndev->xlat_reg->bar2_limit, 4);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4));
> > off += scnprintf(buf + off, buf_size - off,
> > "LMT45 -\t\t\t%#018llx\n", u.v64);
> >
> > @@ -606,41 +599,34 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
> > off += scnprintf(buf + off, buf_size - off,
> > "\nNTB Outgoing B2B XLAT:\n");
> >
> > - reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 2);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "B2B XLAT23 -\t\t%#018llx\n", u.v64);
> >
> > - reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 4);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "B2B XLAT45 -\t\t%#018llx\n", u.v64);
> >
> > - reg = bar2_off(SNB_PBAR2LMT_OFFSET, 2);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + SNB_PBAR23LMT_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "B2B LMT23 -\t\t%#018llx\n", u.v64);
> >
> > - reg = bar2_off(SNB_PBAR2LMT_OFFSET, 4);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + SNB_PBAR45LMT_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "B2B LMT45 -\t\t%#018llx\n", u.v64);
> >
> > off += scnprintf(buf + off, buf_size - off,
> > "\nNTB Secondary BAR:\n");
> >
> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 0);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + SNB_SBAR0BASE_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "SBAR01 -\t\t%#018llx\n", u.v64);
> >
> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 2);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + SNB_SBAR23BASE_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "SBAR23 -\t\t%#018llx\n", u.v64);
> >
> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 4);
> > - u.v64 = ioread64(mmio + reg);
> > + u.v64 = ioread64(mmio + SNB_SBAR45BASE_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "SBAR45 -\t\t%#018llx\n", u.v64);
> > }
> > @@ -648,31 +634,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
> > off += scnprintf(buf + off, buf_size - off,
> > "\nSNB NTB Statistics:\n");
> >
> > - reg = SNB_USMEMMISS_OFFSET;
> > - u.v16 = ioread16(mmio + reg);
> > + u.v16 = ioread16(mmio + SNB_USMEMMISS_OFFSET);
> > off += scnprintf(buf + off, buf_size - off,
> > "Upstream Memory Miss -\t%u\n", u.v16);
> >
> > off += scnprintf(buf + off, buf_size - off,
> > "\nSNB NTB Hardware Errors:\n");
> >
> > - reg = SNB_DEVSTS_OFFSET;
> > - if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))
> > + if (!pci_read_config_word(ndev->ntb.pdev,
> > + SNB_DEVSTS_OFFSET, &u.v16))
> > off += scnprintf(buf + off, buf_size - off,
> > "DEVSTS -\t\t%#06x\n", u.v16);
> >
> > - reg = SNB_LINK_STATUS_OFFSET;
> > - if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))
> > + if (!pci_read_config_word(ndev->ntb.pdev,
> > + SNB_LINK_STATUS_OFFSET, &u.v16))
> > off += scnprintf(buf + off, buf_size - off,
> > "LNKSTS -\t\t%#06x\n", u.v16);
> >
> > - reg = SNB_UNCERRSTS_OFFSET;
> > - if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))
> > + if (!pci_read_config_dword(ndev->ntb.pdev,
> > + SNB_UNCERRSTS_OFFSET, &u.v32))
> > off += scnprintf(buf + off, buf_size - off,
> > "UNCERRSTS -\t\t%#06x\n", u.v32);
> >
> > - reg = SNB_CORERRSTS_OFFSET;
> > - if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))
> > + if (!pci_read_config_dword(ndev->ntb.pdev,
> > + SNB_CORERRSTS_OFFSET, &u.v32))
> > off += scnprintf(buf + off, buf_size - off,
> > "CORERRSTS -\t\t%#06x\n", u.v32);
> > }
> > @@ -1388,7 +1373,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
> > {
> > struct pci_dev *pdev;
> > void __iomem *mmio;
> > - unsigned long off;
> > resource_size_t bar_size;
> > phys_addr_t bar_addr;
> > int b2b_bar;
> > @@ -1484,9 +1468,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
> > dev_dbg(ndev_dev(ndev), "SBAR5SZ %#x\n", bar_sz);
> > }
> >
> > - /* setup incoming bar base addresses */
> > - off = SNB_SBAR0BASE_OFFSET;
> > -
> > /* SBAR01 hit by first part of the b2b bar */
> > if (b2b_bar == 0) {
> > bar_addr = addr->bar0_addr;
> > @@ -1504,7 +1485,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
> > }
> >
> > dev_dbg(ndev_dev(ndev), "SBAR01 %#018llx\n", bar_addr);
> > - iowrite64(bar_addr, mmio + bar0_off(off, 0));
> > + iowrite64(bar_addr, mmio + SNB_SBAR0BASE_OFFSET);
> >
> > /* Other SBAR are normally hit by the PBAR xlat, except for b2b bar.
> > * The b2b bar is either disabled above, or configured half-size, and
> > @@ -1512,102 +1493,96 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
> > */
> >
> > bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);
> > - iowrite64(bar_addr, mmio + bar0_off(off, 2));
> > - bar_addr = ioread64(mmio + bar0_off(off, 2));
> > + iowrite64(bar_addr, mmio + SNB_SBAR23BASE_OFFSET);
> > + bar_addr = ioread64(mmio + SNB_SBAR23BASE_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR23 %#018llx\n", bar_addr);
> >
> > if (!ndev->bar4_split) {
> > bar_addr = addr->bar4_addr64 +
> > (b2b_bar == 4 ? ndev->b2b_off : 0);
> > - iowrite64(bar_addr, mmio + bar0_off(off, 4));
> > - bar_addr = ioread64(mmio + bar0_off(off, 4));
> > + iowrite64(bar_addr, mmio + SNB_SBAR45BASE_OFFSET);
> > + bar_addr = ioread64(mmio + SNB_SBAR45BASE_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR45 %#018llx\n", bar_addr);
> > } else {
> > bar_addr = addr->bar4_addr32 +
> > (b2b_bar == 4 ? ndev->b2b_off : 0);
> > - iowrite32(bar_addr, mmio + bar0_off(off, 4));
> > - bar_addr = ioread32(mmio + bar0_off(off, 4));
> > + iowrite32(bar_addr, mmio + SNB_SBAR4BASE_OFFSET);
> > + bar_addr = ioread32(mmio + SNB_SBAR4BASE_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR4 %#010llx\n", bar_addr);
> >
> > bar_addr = addr->bar5_addr32 +
> > (b2b_bar == 5 ? ndev->b2b_off : 0);
> > - iowrite32(bar_addr, mmio + bar0_off(off, 5));
> > - bar_addr = ioread32(mmio + bar0_off(off, 5));
> > + iowrite32(bar_addr, mmio + SNB_SBAR5BASE_OFFSET);
> > + bar_addr = ioread32(mmio + SNB_SBAR5BASE_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR5 %#010llx\n", bar_addr);
> > }
> >
> > /* setup incoming bar limits == base addrs (zero length windows) */
> > - off = SNB_SBAR2LMT_OFFSET;
> >
> > bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);
> > - iowrite64(bar_addr, mmio + bar2_off(off, 2));
> > - bar_addr = ioread64(mmio + bar2_off(off, 2));
> > + iowrite64(bar_addr, mmio + SNB_SBAR23LMT_OFFSET);
> > + bar_addr = ioread64(mmio + SNB_SBAR23LMT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR23LMT %#018llx\n", bar_addr);
> >
> > if (!ndev->bar4_split) {
> > bar_addr = addr->bar4_addr64 +
> > (b2b_bar == 4 ? ndev->b2b_off : 0);
> > - iowrite64(bar_addr, mmio + bar2_off(off, 4));
> > - bar_addr = ioread64(mmio + bar2_off(off, 4));
> > + iowrite64(bar_addr, mmio + SNB_SBAR45LMT_OFFSET);
> > + bar_addr = ioread64(mmio + SNB_SBAR45LMT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR45LMT %#018llx\n", bar_addr);
> > } else {
> > bar_addr = addr->bar4_addr32 +
> > (b2b_bar == 4 ? ndev->b2b_off : 0);
> > - iowrite32(bar_addr, mmio + bar2_off(off, 4));
> > - bar_addr = ioread32(mmio + bar2_off(off, 4));
> > + iowrite32(bar_addr, mmio + SNB_SBAR4LMT_OFFSET);
> > + bar_addr = ioread32(mmio + SNB_SBAR4LMT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR4LMT %#010llx\n", bar_addr);
> >
> > bar_addr = addr->bar5_addr32 +
> > (b2b_bar == 5 ? ndev->b2b_off : 0);
> > - iowrite32(bar_addr, mmio + bar2_off(off, 5));
> > - bar_addr = ioread32(mmio + bar2_off(off, 5));
> > + iowrite32(bar_addr, mmio + SNB_SBAR5LMT_OFFSET);
> > + bar_addr = ioread32(mmio + SNB_SBAR5LMT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "SBAR5LMT %#05llx\n", bar_addr);
> > }
> >
> > /* zero incoming translation addrs */
> > - off = SNB_SBAR2XLAT_OFFSET;
> > -
> > - iowrite64(0, mmio + bar2_off(off, 2));
> > + iowrite64(0, mmio + SNB_SBAR23XLAT_OFFSET);
> >
> > if (!ndev->bar4_split) {
> > - iowrite64(0, mmio + bar2_off(off, 4));
> > + iowrite64(0, mmio + SNB_SBAR45XLAT_OFFSET);
> > } else {
> > - iowrite32(0, mmio + bar2_off(off, 4));
> > - iowrite32(0, mmio + bar2_off(off, 5));
> > + iowrite32(0, mmio + SNB_SBAR4XLAT_OFFSET);
> > + iowrite32(0, mmio + SNB_SBAR5XLAT_OFFSET);
> > }
> >
> > /* zero outgoing translation limits (whole bar size windows) */
> > - off = SNB_PBAR2LMT_OFFSET;
> > - iowrite64(0, mmio + bar2_off(off, 2));
> > + iowrite64(0, mmio + SNB_PBAR23LMT_OFFSET);
> > if (!ndev->bar4_split) {
> > - iowrite64(0, mmio + bar2_off(off, 4));
> > + iowrite64(0, mmio + SNB_PBAR45LMT_OFFSET);
> > } else {
> > - iowrite32(0, mmio + bar2_off(off, 4));
> > - iowrite32(0, mmio + bar2_off(off, 5));
> > + iowrite32(0, mmio + SNB_PBAR4LMT_OFFSET);
> > + iowrite32(0, mmio + SNB_PBAR5LMT_OFFSET);
> > }
> >
> > /* set outgoing translation offsets */
> > - off = SNB_PBAR2XLAT_OFFSET;
> > -
> > bar_addr = peer_addr->bar2_addr64;
> > - iowrite64(bar_addr, mmio + bar2_off(off, 2));
> > - bar_addr = ioread64(mmio + bar2_off(off, 2));
> > + iowrite64(bar_addr, mmio + SNB_PBAR23XLAT_OFFSET);
> > + bar_addr = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "PBAR23XLAT %#018llx\n", bar_addr);
> >
> > if (!ndev->bar4_split) {
> > bar_addr = peer_addr->bar4_addr64;
> > - iowrite64(bar_addr, mmio + bar2_off(off, 4));
> > - bar_addr = ioread64(mmio + bar2_off(off, 4));
> > + iowrite64(bar_addr, mmio + SNB_PBAR45XLAT_OFFSET);
> > + bar_addr = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "PBAR45XLAT %#018llx\n", bar_addr);
> > } else {
> > bar_addr = peer_addr->bar2_addr64;
> > - iowrite32(bar_addr, mmio + bar2_off(off, 4));
> > - bar_addr = ioread32(mmio + bar2_off(off, 4));
> > + iowrite32(bar_addr, mmio + SNB_PBAR4XLAT_OFFSET);
> > + bar_addr = ioread32(mmio + SNB_PBAR4XLAT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "PBAR4XLAT %#010llx\n", bar_addr);
> >
> > bar_addr = peer_addr->bar2_addr64;
> > - iowrite32(bar_addr, mmio + bar2_off(off, 5));
> > - bar_addr = ioread32(mmio + bar2_off(off, 5));
> > + iowrite32(bar_addr, mmio + SNB_PBAR5XLAT_OFFSET);
> > + bar_addr = ioread32(mmio + SNB_PBAR5XLAT_OFFSET);
> > dev_dbg(ndev_dev(ndev), "PBAR5XLAT %#010llx\n", bar_addr);
> > }
> >
> > @@ -1747,29 +1722,68 @@ static int snb_init_dev(struct intel_ntb_dev *ndev)
> > u8 ppd;
> > int rc, mem;
> >
> > + pdev = ndev_pdev(ndev);
> > +
> > + switch (pdev->device) {
> > /* There is a Xeon hardware errata related to writes to SDOORBELL or
> > * B2BDOORBELL in conjunction with inbound access to NTB MMIO Space,
> > * which may hang the system. To workaround this use the second memory
> > * window to access the interrupt and scratch pad registers on the
> > * remote system.
> > */
> > - ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
> > + ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;
> > + break;
> > + }
> >
> > + switch (pdev->device) {
> > /* There is a hardware errata related to accessing any register in
> > * SB01BASE in the presence of bidirectional traffic crossing the NTB.
> > */
> > - ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
> > + ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;
> > + break;
> > + }
> >
> > + switch (pdev->device) {
> > /* HW Errata on bit 14 of b2bdoorbell register. Writes will not be
> > * mirrored to the remote system. Shrink the number of bits by one,
> > * since bit 14 is the last bit.
> > */
> > - ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
> > + ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;
> > + break;
> > + }
> >
> > ndev->reg = &snb_reg;
> >
> > - pdev = ndev_pdev(ndev);
> > -
> > rc = pci_read_config_byte(pdev, SNB_PPD_OFFSET, &ppd);
> > if (rc)
> > return -EIO;
> > @@ -2062,14 +2076,14 @@ static const struct intel_ntb_xlat_reg snb_pri_xlat = {
> > * window by setting the limit equal to base, nor can it limit the size
> > * of the memory window by setting the limit to base + size.
> > */
> > - .bar2_limit = SNB_PBAR2LMT_OFFSET,
> > - .bar2_xlat = SNB_PBAR2XLAT_OFFSET,
> > + .bar2_limit = SNB_PBAR23LMT_OFFSET,
> > + .bar2_xlat = SNB_PBAR23XLAT_OFFSET,
> > };
> >
> > static const struct intel_ntb_xlat_reg snb_sec_xlat = {
> > .bar0_base = SNB_SBAR0BASE_OFFSET,
> > - .bar2_limit = SNB_SBAR2LMT_OFFSET,
> > - .bar2_xlat = SNB_SBAR2XLAT_OFFSET,
> > + .bar2_limit = SNB_SBAR23LMT_OFFSET,
> > + .bar2_xlat = SNB_SBAR23XLAT_OFFSET,
> > };
> >
> > static const struct intel_b2b_addr snb_b2b_usd_addr = {
> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.h b/drivers/ntb/hw/intel/ntb_hw_intel.h
> > index 0224b1a..fec689d 100644
> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.h
> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.h
> > @@ -70,11 +70,27 @@
> >
> > /* SNB hardware (and JSF, IVT, HSX) */
> >
> > -#define SNB_PBAR2LMT_OFFSET 0x0000
> > -#define SNB_PBAR2XLAT_OFFSET 0x0010
> > -#define SNB_SBAR2LMT_OFFSET 0x0020
> > -#define SNB_SBAR2XLAT_OFFSET 0x0030
> > +#define SNB_PBAR23LMT_OFFSET 0x0000
> > +#define SNB_PBAR45LMT_OFFSET 0x0008
> > +#define SNB_PBAR4LMT_OFFSET 0x0008
> > +#define SNB_PBAR5LMT_OFFSET 0x000c
> > +#define SNB_PBAR23XLAT_OFFSET 0x0010
> > +#define SNB_PBAR45XLAT_OFFSET 0x0018
> > +#define SNB_PBAR4XLAT_OFFSET 0x0018
> > +#define SNB_PBAR5XLAT_OFFSET 0x001c
> > +#define SNB_SBAR23LMT_OFFSET 0x0020
> > +#define SNB_SBAR45LMT_OFFSET 0x0028
> > +#define SNB_SBAR4LMT_OFFSET 0x0028
> > +#define SNB_SBAR5LMT_OFFSET 0x002c
> > +#define SNB_SBAR23XLAT_OFFSET 0x0030
> > +#define SNB_SBAR45XLAT_OFFSET 0x0038
> > +#define SNB_SBAR4XLAT_OFFSET 0x0038
> > +#define SNB_SBAR5XLAT_OFFSET 0x003c
> > #define SNB_SBAR0BASE_OFFSET 0x0040
> > +#define SNB_SBAR23BASE_OFFSET 0x0048
> > +#define SNB_SBAR45BASE_OFFSET 0x0050
> > +#define SNB_SBAR4BASE_OFFSET 0x0050
> > +#define SNB_SBAR5BASE_OFFSET 0x0054
> > #define SNB_SBDF_OFFSET 0x005c
> > #define SNB_NTBCNTL_OFFSET 0x0058
> > #define SNB_PDOORBELL_OFFSET 0x0060
> > diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c
> > index f1ed1b7..bb2eb85 100644
> > --- a/drivers/ntb/ntb_transport.c
> > +++ b/drivers/ntb/ntb_transport.c
> > @@ -204,8 +204,8 @@ struct ntb_transport_ctx {
> >
> > bool link_is_up;
> > struct delayed_work link_work;
> > - struct work_struct db_work;
> > struct work_struct link_cleanup;
> > + struct tasklet_struct db_work;
> > };
> >
> > enum {
> > @@ -241,7 +241,7 @@ enum {
> > #define NTB_QP_DEF_NUM_ENTRIES 100
> > #define NTB_LINK_DOWN_TIMEOUT 10
> >
> > -static void ntb_transport_doorbell_work(struct work_struct *ws);
> > +static void ntb_transport_doorbell_work(unsigned long data);
> > static const struct ntb_ctx_ops ntb_transport_ops;
> > static struct ntb_client ntb_transport_client;
> >
> > @@ -1002,8 +1002,9 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
> > }
> >
> > INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work);
> > - INIT_WORK(&nt->db_work, ntb_transport_doorbell_work);
> > INIT_WORK(&nt->link_cleanup, ntb_transport_link_cleanup_work);
> > + tasklet_init(&nt->db_work, ntb_transport_doorbell_work,
> > + (unsigned long)nt);
> >
> > rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops);
> > if (rc)
> > @@ -1044,7 +1045,7 @@ static void ntb_transport_free(struct ntb_client *self, struct ntb_dev *ndev)
> > int i;
> >
> > ntb_transport_link_cleanup(nt);
> > - cancel_work_sync(&nt->db_work);
> > + tasklet_disable(&nt->db_work);
> > cancel_work_sync(&nt->link_cleanup);
> > cancel_delayed_work_sync(&nt->link_work);
> >
> > @@ -1850,10 +1851,9 @@ unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp)
> > }
> > EXPORT_SYMBOL_GPL(ntb_transport_max_size);
> >
> > -static void ntb_transport_doorbell_work(struct work_struct *work)
> > +static void ntb_transport_doorbell_work(unsigned long data)
> > {
> > - struct ntb_transport_ctx *nt = container_of(work,
> > - struct ntb_transport_ctx, db_work);
> > + struct ntb_transport_ctx *nt = (void *)data;
> > struct ntb_transport_qp *qp;
> > u64 db_mask, db_bits, db_again;
> > unsigned int qp_num;
> > @@ -1890,7 +1890,7 @@ static void ntb_transport_doorbell_callback(void *data, int vector)
> >
> > ntb_db_set_mask(nt->ndev, ntb_db_valid_mask(nt->ndev));
> >
> > - schedule_work(&nt->db_work);
> > + tasklet_schedule(&nt->db_work);
> > }
> >
> > static const struct ntb_ctx_ops ntb_transport_ops = {
> > --
> > 2.4.0.rc0.43.gcf8a8c6
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
ÿôèº{.nÇ+·®+%Ëÿ±éݶ\x17¥wÿº{.nÇ+·¥{±þG«éÿ{ayº\x1dÊÚë,j\a¢f£¢·hïêÿêçz_è®\x03(éÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?¨èÚ&£ø§~á¶iOæ¬z·vØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?I¥
next prev parent reply other threads:[~2015-05-20 21:15 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-20 15:41 [PATCH 00/16] ntb: NTB Abstraction Layer Allen Hubbe
2015-05-20 15:41 ` [PATCH 01/16] Move files in preparation for NTB Abstraction Allen Hubbe
2015-05-20 15:41 ` [PATCH 02/16] NTB Abstraction Layer Allen Hubbe
2015-05-21 8:51 ` Paul Bolle
2015-05-21 11:32 ` Hubbe, Allen
2015-05-21 11:32 ` Hubbe, Allen
2015-05-21 11:32 ` Hubbe, Allen
2015-05-20 15:41 ` [PATCH 03/16] ntb: Enable link training for RP mode in the driver probe Allen Hubbe
2015-05-20 21:21 ` Bjorn Helgaas
2015-05-20 21:46 ` Hubbe, Allen
2015-05-20 21:46 ` Hubbe, Allen
2015-05-20 21:46 ` Hubbe, Allen
2015-05-20 22:20 ` Bjorn Helgaas
2015-05-20 23:00 ` Hubbe, Allen
2015-05-20 23:00 ` Hubbe, Allen
2015-05-21 12:06 ` Bjorn Helgaas
2015-05-21 12:49 ` Hubbe, Allen
2015-05-21 12:49 ` Hubbe, Allen
2015-05-20 15:41 ` [PATCH 04/16] Check the DID for certain workaround error flags to be set Allen Hubbe
2015-05-20 21:11 ` Bjorn Helgaas
2015-05-20 21:15 ` Jiang, Dave [this message]
2015-05-20 21:15 ` Jiang, Dave
2015-05-20 21:15 ` Jiang, Dave
2015-05-20 21:26 ` Hubbe, Allen
2015-05-20 21:26 ` Hubbe, Allen
2015-05-20 21:26 ` Hubbe, Allen
2015-05-20 15:41 ` [PATCH 05/16] Intel NTB params for snb b2b addresses Allen Hubbe
2015-05-20 15:41 ` [PATCH 06/16] NTB Pingpong Client Allen Hubbe
2015-05-21 8:54 ` Paul Bolle
2015-05-20 15:41 ` [PATCH 07/16] NTB Tool Client Allen Hubbe
2015-05-21 9:02 ` Paul Bolle
2015-05-20 15:41 ` [PATCH 08/16] ntb_transport: rate limit ntb_qp_link_work Allen Hubbe
2015-05-20 15:41 ` [PATCH 09/16] ntb_transport: differentiate link down messages Allen Hubbe
2015-05-20 15:41 ` [PATCH 10/16] ntb_transport: don't advance rx on link down Allen Hubbe
2015-05-20 15:41 ` [PATCH 11/16] ntb_transport: reset qp link stats on down Allen Hubbe
2015-05-20 15:41 ` [PATCH 12/16] ntb_transport: numa aware memory and dma chan Allen Hubbe
2015-05-20 15:41 ` [PATCH 13/16] ntb_hw_intel: numa aware memory allocation Allen Hubbe
2015-05-20 15:41 ` [PATCH 14/16] ntb: performance improvement by write combining Allen Hubbe
2015-05-20 15:41 ` [PATCH 15/16] ntb: default to cpu memcpy for performance Allen Hubbe
2015-05-20 15:41 ` [PATCH 16/16] ntb_transport: fix small code format issues Allen Hubbe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1432156539.19618.135.camel@intel.com \
--to=dave.jiang@intel.com \
--cc=Allen.Hubbe@emc.com \
--cc=bhelgaas@google.com \
--cc=jdmason@kudzu.us \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-ntb@googlegroups.com \
--cc=linux-pci@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.