Subject: Re: 3ware management utilities -- any cluse?
To: Brian Buhrow <buhrow@lothlorien.nfbcal.org>
From: Masaru OKI <oki@netbsd.org>
List: current-users
Date: 12/13/2002 10:58:33
--------_3DF93A2830A605836A70_MULTIPART_MIXED_
Content-Type: text/plain; charset="US-ASCII"
Content-Transfer-Encoding: 7bit

On Thu, 12 Dec 2002 17:32:22 -0800
Subject: Re: 3ware management utilities -- any cluse?
buhrow@lothlorien.nfbcal.org (Brian Buhrow) wrote:

> 	Following up on my own question, I have found the FreeBSD 3dmd utility, 
> which seems to run fine, except that it wants to talk to an actual
> /dev/twex device.  I believe I see that portion of the driver in the
> FreeBSD-current source tree, and wonder if anyone has tried to port that
> portion of the 3ware escalade's functionality to NetBSD?  

I tried to port ioctls on the twe driver (for -current).  reading status
work fine with FreeBSD 3dmd, but writing parameter is not tested.

for test: put tweio.h into sys/dev/pci, apply attached patch, compile
          kernel, reboot, MAKEDEV twe0, and run FreeBSD 3dmd.

-- 
Masaru OKI <oki@netbsd.org>

--------_3DF93A2830A605836A70_MULTIPART_MIXED_
Content-Type: application/octet-stream; name="src.diff"
Content-Disposition: attachment;
 filename="src.diff"
Content-Transfer-Encoding: base64

SW5kZXg6IGV0Yy9ldGMuaTM4Ni9NQUtFREVWDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL2N2c3Jv
b3QvYmFzZXNyYy9ldGMvZXRjLmkzODYvTUFLRURFVix2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEu
MTg3DQpkaWZmIC11IC1yMS4xODcgTUFLRURFVg0KLS0tIGV0Yy9ldGMuaTM4Ni9NQUtFREVWCTIw
MDIvMTIvMDcgMTk6NTA6NTgJMS4xODcNCisrKyBldGMvZXRjLmkzODYvTUFLRURFVgkyMDAyLzEy
LzEzIDAxOjQwOjQ1DQpAQCAtMTgxLDcgKzE4MSw3IEBADQogCW1ha2VkZXYgY2NkMCBjY2QxIGNj
ZDIgY2NkMyBtZDAgc3MwIGNoMCB1azAgdWsxIHJhbmRvbQ0KIAltYWtlZGV2IGNnZDAgY2dkMSBj
Z2QyIGNnZDMNCiAJbWFrZWRldiBzcGVha2VyIGxrbSBtbXMwIGxtczAgam95MCBqb3kxIGFwbSBs
b2NhbCBzYXRsaW5rMA0KLQltYWtlZGV2IGlvcDAgbWx4MCBtbHkwIGRwdDAgZHB0aTANCisJbWFr
ZWRldiBpb3AwIG1seDAgbWx5MCBkcHQwIGRwdGkwIHR3ZTANCiAJbWFrZWRldiBhdWRpbw0KIAlt
YWtlZGV2IHJhZGlvDQogCW1ha2VkZXYgdXNicw0KQEAgLTg0Myw2ICs4NDMsMTMgQEANCiAJcm0g
LWYgbWx5JHVuaXQNCiAJbWtub2QgbWx5JHVuaXQgYyA4MCAkdW5pdA0KIAljaG1vZCA2MDAgbWx5
JHVuaXQNCisJOzsNCisNCit0d2UqKQ0KKwl1bml0PSR7aSN0d2V9DQorCXJtIC1mIHR3ZSR1bml0
DQorCW1rbm9kIHR3ZSR1bml0IGMgOTcgJHVuaXQNCisJY2htb2QgNjAwIHR3ZSR1bml0DQogCTs7
DQogDQogYWdwKikNCkluZGV4OiBzeXMvZGV2L3BjaS90d2UuYw0KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZp
bGU6IC9jdnNyb290L3N5c3NyYy9zeXMvZGV2L3BjaS90d2UuYyx2DQpyZXRyaWV2aW5nIHJldmlz
aW9uIDEuMzINCmRpZmYgLXUgLXIxLjMyIHR3ZS5jDQotLS0gc3lzL2Rldi9wY2kvdHdlLmMJMjAw
Mi8xMS8yNSAwNzo0Nzo1MwkxLjMyDQorKysgc3lzL2Rldi9wY2kvdHdlLmMJMjAwMi8xMi8xMyAw
MTo0MDo0NQ0KQEAgLTgxLDYgKzgxLDcgQEANCiAjaW5jbHVkZSA8c3lzL2J1Zi5oPg0KICNpbmNs
dWRlIDxzeXMvZW5kaWFuLmg+DQogI2luY2x1ZGUgPHN5cy9tYWxsb2MuaD4NCisjaW5jbHVkZSA8
c3lzL2NvbmYuaD4NCiAjaW5jbHVkZSA8c3lzL2Rpc2suaD4NCiANCiAjaW5jbHVkZSA8dXZtL3V2
bV9leHRlcm4uaD4NCkBAIC05Myw2ICs5NCw3IEBADQogI2luY2x1ZGUgPGRldi9wY2kvcGNpZGV2
cy5oPg0KICNpbmNsdWRlIDxkZXYvcGNpL3R3ZXJlZy5oPg0KICNpbmNsdWRlIDxkZXYvcGNpL3R3
ZXZhci5oPg0KKyNpbmNsdWRlIDxkZXYvcGNpL3R3ZWlvLmg+DQogDQogI2RlZmluZQlQQ0lfQ0JJ
TwkweDEwDQogDQpAQCAtMTAzLDYgKzEwNSw3IEBADQogc3RhdGljIGludAl0d2VfbWF0Y2goc3Ry
dWN0IGRldmljZSAqLCBzdHJ1Y3QgY2ZkYXRhICosIHZvaWQgKik7DQogc3RhdGljIGludAl0d2Vf
cGFyYW1fZ2V0KHN0cnVjdCB0d2Vfc29mdGMgKiwgaW50LCBpbnQsIHNpemVfdCwNCiAJCQkgICAg
ICB2b2lkICgqKShzdHJ1Y3QgdHdlX2NjYiAqLCBpbnQpLCB2b2lkICoqKTsNCitzdGF0aWMgaW50
CXR3ZV9wYXJhbV9zZXQoc3RydWN0IHR3ZV9zb2Z0YyAqLCBpbnQsIGludCwgc2l6ZV90LCB2b2lk
ICopOw0KIHN0YXRpYyB2b2lkCXR3ZV9wb2xsKHN0cnVjdCB0d2Vfc29mdGMgKik7DQogc3RhdGlj
IGludAl0d2VfcHJpbnQodm9pZCAqLCBjb25zdCBjaGFyICopOw0KIHN0YXRpYyBpbnQJdHdlX3Jl
c2V0KHN0cnVjdCB0d2Vfc29mdGMgKik7DQpAQCAtMTEzLDYgKzExNiwxNyBAQA0KIHN0YXRpYyBp
bmxpbmUgdV9pbnQzMl90CXR3ZV9pbmwoc3RydWN0IHR3ZV9zb2Z0YyAqLCBpbnQpOw0KIHN0YXRp
YyBpbmxpbmUgdm9pZAl0d2Vfb3V0bChzdHJ1Y3QgdHdlX3NvZnRjICosIGludCwgdV9pbnQzMl90
KTsNCiANCitkZXZfdHlwZV9vcGVuKHR3ZW9wZW4pOw0KK2Rldl90eXBlX2Nsb3NlKHR3ZWNsb3Nl
KTsNCitkZXZfdHlwZV9pb2N0bCh0d2Vpb2N0bCk7DQorDQorY29uc3Qgc3RydWN0IGNkZXZzdyB0
d2VfY2RldnN3ID0gew0KKwl0d2VvcGVuLCB0d2VjbG9zZSwgbm9yZWFkLCBub3dyaXRlLCB0d2Vp
b2N0bCwNCisJbm9zdG9wLCBub3R0eSwgbm9wb2xsLCBub21tYXAsDQorfTsNCisNCitleHRlcm4g
c3RydWN0CWNmZHJpdmVyIHR3ZV9jZDsgDQorDQogQ0ZBVFRBQ0hfREVDTCh0d2UsIHNpemVvZihz
dHJ1Y3QgdHdlX3NvZnRjKSwNCiAgICAgdHdlX21hdGNoLCB0d2VfYXR0YWNoLCBOVUxMLCBOVUxM
KTsNCiANCkBAIC02NzMsNiArNjg3LDYxIEBADQogfQ0KIA0KIC8qDQorICogRXhlY3V0ZSBhIFRX
RV9PUF9TRVRfUEFSQU0gY29tbWFuZC4NCisgKi8NCitzdGF0aWMgaW50DQordHdlX3BhcmFtX3Nl
dChzdHJ1Y3QgdHdlX3NvZnRjICpzYywgaW50IHRhYmxlX2lkLCBpbnQgcGFyYW1faWQsIHNpemVf
dCBzaXplLA0KKwkgICAgICB2b2lkICpidWYpDQorew0KKwlzdHJ1Y3QgdHdlX2NjYiAqY2NiOw0K
KwlzdHJ1Y3QgdHdlX2NtZCAqdGM7DQorCXN0cnVjdCB0d2VfcGFyYW0gKnRwOw0KKwlpbnQgcnYs
IHM7DQorDQorCXJ2ID0gdHdlX2NjYl9hbGxvYyhzYywgJmNjYiwNCisJICAgIFRXRV9DQ0JfUEFS
QU0gfCBUV0VfQ0NCX0RBVEFfSU4gfCBUV0VfQ0NCX0RBVEFfT1VUKTsNCisJaWYgKHJ2ICE9IDAp
DQorCQlyZXR1cm4gKHJ2KTsNCisNCisJdHAgPSBtYWxsb2MoVFdFX1NFQ1RPUl9TSVpFLCBNX0RF
VkJVRiwgTV9OT1dBSVQpOw0KKw0KKwljY2ItPmNjYl9kYXRhID0gdHA7DQorCWNjYi0+Y2NiX2Rh
dGFzaXplID0gVFdFX1NFQ1RPUl9TSVpFOw0KKwljY2ItPmNjYl90eC50eF9oYW5kbGVyID0gMDsN
CisJY2NiLT5jY2JfdHgudHhfY29udGV4dCA9IHRwOw0KKwljY2ItPmNjYl90eC50eF9kdiA9ICZz
Yy0+c2NfZHY7DQorDQorCXRjID0gY2NiLT5jY2JfY21kOw0KKwl0Yy0+dGNfc2l6ZSA9IDI7DQor
CXRjLT50Y19vcGNvZGUgPSBUV0VfT1BfU0VUX1BBUkFNIHwgKHRjLT50Y19zaXplIDw8IDUpOw0K
Kwl0Yy0+dGNfdW5pdCA9IDA7DQorCXRjLT50Y19jb3VudCA9IGh0b2xlMTYoMSk7DQorDQorCS8q
IEZpbGwgaW4gdGhlIG91dGJvdW5kIHBhcmFtZXRlciBkYXRhLiAqLw0KKwl0cC0+dHBfdGFibGVf
aWQgPSBodG9sZTE2KHRhYmxlX2lkKTsNCisJdHAtPnRwX3BhcmFtX2lkID0gcGFyYW1faWQ7DQor
CXRwLT50cF9wYXJhbV9zaXplID0gc2l6ZTsNCisJYmNvcHkoYnVmLCB0cC0+dHBfZGF0YSwgc2l6
ZSk7DQorDQorCS8qIE1hcCB0aGUgdHJhbnNmZXIuICovDQorCWlmICgocnYgPSB0d2VfY2NiX21h
cChzYywgY2NiKSkgIT0gMCkgew0KKwkJdHdlX2NjYl9mcmVlKHNjLCBjY2IpOw0KKwkJZnJlZSh0
cCwgTV9ERVZCVUYpOw0KKwkJcmV0dXJuIChydik7DQorCX0NCisNCisJLyogU3VibWl0IHRoZSBj
b21tYW5kIGFuZCB3YWl0LiAqLw0KKwlzID0gc3BsYmlvKCk7DQorCXJ2ID0gdHdlX2NjYl9wb2xs
KHNjLCBjY2IsIDUpOw0KKwl0d2VfY2NiX3VubWFwKHNjLCBjY2IpOw0KKwl0d2VfY2NiX2ZyZWUo
c2MsIGNjYik7DQorCXNwbHgocyk7DQorCWZyZWUodHAsIE1fREVWQlVGKTsNCisNCisJcmV0dXJu
IChydik7DQorfQ0KKw0KKy8qDQogICogRXhlY3V0ZSBhIFRXRV9PUF9JTklUX0NPTk5FQ1RJT04g
Y29tbWFuZC4gIFJldHVybiBub24temVybyBvbiBlcnJvci4gDQogICogTXVzdCBiZSBjYWxsZWQg
d2l0aCBpbnRlcnJ1cHRzIGJsb2NrZWQuDQogICovDQpAQCAtMTA1Miw0ICsxMTIxLDE1NyBAQA0K
IAkJcnYgPSBFQlVTWTsNCiANCiAJcmV0dXJuIChydik7DQorfQ0KKw0KKw0KKy8qDQorICogQWNj
ZXB0IGFuIG9wZW4gb3BlcmF0aW9uIG9uIHRoZSBjb250cm9sIGRldmljZS4NCisgKi8NCitpbnQN
Cit0d2VvcGVuKGRldl90IGRldiwgaW50IGZsYWcsIGludCBtb2RlLCBzdHJ1Y3QgcHJvYyAqcCkN
Cit7DQorCXN0cnVjdCB0d2Vfc29mdGMgKnR3ZTsNCisNCisJaWYgKCh0d2UgPSBkZXZpY2VfbG9v
a3VwKCZ0d2VfY2QsIG1pbm9yKGRldikpKSA9PSBOVUxMKQ0KKwkJcmV0dXJuIChFTlhJTyk7DQor
CWlmICgodHdlLT5zY19mbGFncyAmIFRXRUZfT1BFTikgIT0gMCkNCisJCXJldHVybiAoRUJVU1kp
Ow0KKw0KKwl0d2UtPnNjX2ZsYWdzIHw9IFRXRUZfT1BFTjsNCisJcmV0dXJuICgwKTsNCit9DQor
DQorLyoNCisgKiBBY2NlcHQgdGhlIGxhc3QgY2xvc2Ugb24gdGhlIGNvbnRyb2wgZGV2aWNlLg0K
KyAqLw0KK2ludA0KK3R3ZWNsb3NlKGRldl90IGRldiwgaW50IGZsYWcsIGludCBtb2RlLCBzdHJ1
Y3QgcHJvYyAqcCkNCit7DQorCXN0cnVjdCB0d2Vfc29mdGMgKnR3ZTsNCisNCisJdHdlID0gZGV2
aWNlX2xvb2t1cCgmdHdlX2NkLCBtaW5vcihkZXYpKTsNCisJdHdlLT5zY19mbGFncyAmPSB+VFdF
Rl9PUEVOOw0KKwlyZXR1cm4gKDApOw0KK30NCisNCisvKg0KKyAqIEhhbmRsZSBjb250cm9sIG9w
ZXJhdGlvbnMuDQorICovDQoraW50DQordHdlaW9jdGwoZGV2X3QgZGV2LCB1X2xvbmcgY21kLCBj
YWRkcl90IGRhdGEsIGludCBmbGFnLCBzdHJ1Y3QgcHJvYyAqcCkNCit7DQorCXN0cnVjdCB0d2Vf
c29mdGMgKnR3ZTsNCisJc3RydWN0IHR3ZV9jY2IgKmNjYjsNCisJc3RydWN0IHR3ZV9wYXJhbSAq
cGFyYW07DQorCXN0cnVjdCB0d2VfdXNlcmNvbW1hbmQgKnR1Ow0KKwlzdHJ1Y3QgdHdlX3BhcmFt
Y29tbWFuZCAqdHA7DQorCXVuaW9uIHR3ZV9zdGF0cmVxdWVzdCAqdHM7DQorCXZvaWQgKnBkYXRh
Ow0KKwlpbnQgcnYsIHMsIGVycm9yOw0KKwl1X2ludDhfdCBjbWRpZDsNCisNCisJaWYgKHNlY3Vy
ZWxldmVsID49IDIpDQorCQlyZXR1cm4gKEVQRVJNKTsNCisNCisJdHdlID0gZGV2aWNlX2xvb2t1
cCgmdHdlX2NkLCBtaW5vcihkZXYpKTsNCisJdHUgPSAoc3RydWN0IHR3ZV91c2VyY29tbWFuZCAq
KWRhdGE7DQorCXRwID0gKHN0cnVjdCB0d2VfcGFyYW1jb21tYW5kICopZGF0YTsNCisJdHMgPSAo
dW5pb24gdHdlX3N0YXRyZXF1ZXN0ICopZGF0YTsNCisNCisJLyogSG1tLCBjb21wYXRpYmxlIHdp
dGggRnJlZUJTRCAqLw0KKwlzd2l0Y2ggKGNtZCkgew0KKwljYXNlIFRXRUlPX0NPTU1BTkQ6DQor
CQlpZiAodHUtPnR1X3NpemUgPiAwKSB7DQorCQkJcGRhdGEgPSBtYWxsb2ModHUtPnR1X3NpemUs
IE1fREVWQlVGLCBNX1dBSVRPSyk7DQorCQkJZXJyb3IgPSBjb3B5aW4odHUtPnR1X2RhdGEsIHBk
YXRhLCB0dS0+dHVfc2l6ZSk7DQorCQkJaWYgKGVycm9yICE9IDApDQorCQkJCXJldHVybiAoZXJy
b3IpOw0KKwkJCXJ2ID0gdHdlX2NjYl9hbGxvYyh0d2UsICZjY2IsDQorCQkJCQkgICBUV0VfQ0NC
X1BBUkFNIHwNCisJCQkJCSAgIFRXRV9DQ0JfREFUQV9JTiB8IFRXRV9DQ0JfREFUQV9PVVQpOw0K
KwkJfSBlbHNlIHsNCisJCQlydiA9IHR3ZV9jY2JfYWxsb2ModHdlLCAmY2NiLCAwKTsNCisJCX0N
CisJCWlmIChydiAhPSAwKQ0KKwkJCXJldHVybiAocnYpOw0KKwkJY21kaWQgPSBjY2ItPmNjYl9j
bWRpZDsNCisJCWJjb3B5KCZ0dS0+dHVfY21kLCBjY2ItPmNjYl9jbWQsIHNpemVvZihzdHJ1Y3Qg
dHdlX2NtZCkpOw0KKwkJY2NiLT5jY2JfY21kaWQgPSBjbWRpZDsNCisJCWlmIChjY2ItPmNjYl9m
bGFncyAmIFRXRV9DQ0JfUEFSQU0pIHsNCisJCQljY2ItPmNjYl9kYXRhID0gcGRhdGE7DQorCQkJ
Y2NiLT5jY2JfZGF0YXNpemUgPSBUV0VfU0VDVE9SX1NJWkU7DQorCQkJY2NiLT5jY2JfdHgudHhf
aGFuZGxlciA9IDA7DQorCQkJY2NiLT5jY2JfdHgudHhfY29udGV4dCA9IHBkYXRhOw0KKwkJCWNj
Yi0+Y2NiX3R4LnR4X2R2ID0gJnR3ZS0+c2NfZHY7DQorCQl9DQorCQkvKiBNYXAgdGhlIHRyYW5z
ZmVyLiAqLw0KKwkJaWYgKChydiA9IHR3ZV9jY2JfbWFwKHR3ZSwgY2NiKSkgIT0gMCkgew0KKwkJ
CXR3ZV9jY2JfZnJlZSh0d2UsIGNjYik7DQorCQkJZnJlZSh0cCwgTV9ERVZCVUYpOw0KKwkJCXJl
dHVybiAocnYpOw0KKwkJfQ0KKw0KKwkJLyogU3VibWl0IHRoZSBjb21tYW5kIGFuZCB3YWl0LiAq
Lw0KKwkJcyA9IHNwbGJpbygpOw0KKwkJcnYgPSB0d2VfY2NiX3BvbGwodHdlLCBjY2IsIDUpOw0K
KwkJdHdlX2NjYl91bm1hcCh0d2UsIGNjYik7DQorCQl0d2VfY2NiX2ZyZWUodHdlLCBjY2IpOw0K
KwkJc3BseChzKTsNCisNCisJCWlmICh0dS0+dHVfc2l6ZSA+IDApIHsNCisJCQllcnJvciA9IGNv
cHlvdXQocGRhdGEsIHR1LT50dV9kYXRhLCB0dS0+dHVfc2l6ZSk7DQorCQkJaWYgKGVycm9yICE9
IDApDQorCQkJCXJldHVybiAoZXJyb3IpOw0KKwkJCWZyZWUocGRhdGEsIE1fREVWQlVGKTsNCisJ
CX0NCisJCXJldHVybiAoMCk7DQorDQorCWNhc2UgVFdFSU9fU1RBVFM6DQorCQlyZXR1cm4gKEVO
T0VOVCk7DQorDQorCWNhc2UgVFdFSU9fQUVOX1BPTEw6DQorCQlpZiAoKHR3ZS0+c2NfZmxhZ3Mg
JiBUV0VGX0FFTikgPT0gMCkNCisJCQlyZXR1cm4gKEVOT0VOVCk7DQorCQlyZXR1cm4gKDApOw0K
Kw0KKwljYXNlIFRXRUlPX0FFTl9XQUlUOg0KKwkJcyA9IHNwbGJpbygpOw0KKwkJd2hpbGUgKCh0
d2UtPnNjX2ZsYWdzICYgVFdFRl9BRU4pID09IDApIHsNCisJCQkvKiB0c2xlZXAoKTsgKi8NCisJ
CX0NCisJCXNwbHgocyk7DQorCQlyZXR1cm4gKDApOw0KKw0KKwljYXNlIFRXRUlPX0dFVF9QQVJB
TToNCisJCWVycm9yID0gdHdlX3BhcmFtX2dldCh0d2UsIHRwLT50cF90YWJsZV9pZCwgdHAtPnRw
X3BhcmFtX2lkLA0KKwkJCQkgICAgICB0cC0+dHBfc2l6ZSwgMCwgKHZvaWQgKiopJnBhcmFtKTsN
CisJCWlmIChlcnJvciAhPSAwKQ0KKwkJCXJldHVybiAoZXJyb3IpOw0KKwkJaWYgKHBhcmFtLT50
cF9wYXJhbV9zaXplID4gdHAtPnRwX3NpemUpDQorCQkJcmV0dXJuIChFRkFVTFQpOw0KKwkJaWYg
KChlcnJvciA9IGNvcHlvdXQocGFyYW0tPnRwX2RhdGEsIHRwLT50cF9kYXRhLA0KKwkJCQkgICAg
IHBhcmFtLT50cF9wYXJhbV9zaXplKSkgIT0gMCkNCisJCQlyZXR1cm4gKGVycm9yKTsNCisJCWZy
ZWUocGFyYW0sIE1fREVWQlVGKTsNCisJCXJldHVybiAoMCk7DQorDQorCWNhc2UgVFdFSU9fU0VU
X1BBUkFNOg0KKwkJcGRhdGEgPSBtYWxsb2ModHAtPnRwX3NpemUsIE1fREVWQlVGLCBNX1dBSVRP
Syk7DQorCQlpZiAoKGVycm9yID0gY29weWluKHRwLT50cF9kYXRhLCBwZGF0YSwgdHAtPnRwX3Np
emUpKSAhPSAwKQ0KKwkJCXJldHVybiAoZXJyb3IpOw0KKwkJaWYgKChlcnJvciA9IHR3ZV9wYXJh
bV9zZXQodHdlLCB0cC0+dHBfdGFibGVfaWQsDQorCQkJCQkgICB0cC0+dHBfcGFyYW1faWQsIHRw
LT50cF9zaXplLA0KKwkJCQkJICAgcGRhdGEpKSAhPSAwKQ0KKwkJCXJldHVybiAoZXJyb3IpOw0K
KwkJZnJlZShwZGF0YSwgTV9ERVZCVUYpOw0KKwkJcmV0dXJuIDA7DQorDQorCWNhc2UgVFdFSU9f
UkVTRVQ6DQorCQl0d2VfcmVzZXQodHdlKTsNCisJCXJldHVybiAoMCk7DQorDQorCWRlZmF1bHQ6
DQorCQlicmVhazsNCisJfQ0KKwlyZXR1cm4gKEVOT1RUWSk7CS8qIFhYWCBzaHV0IHVwIGdjYyAq
Lw0KIH0NCkluZGV4OiBzeXMvZGV2L3BjaS90d2V2YXIuaA0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6
IC9jdnNyb290L3N5c3NyYy9zeXMvZGV2L3BjaS90d2V2YXIuaCx2DQpyZXRyaWV2aW5nIHJldmlz
aW9uIDEuMTINCmRpZmYgLXUgLXIxLjEyIHR3ZXZhci5oDQotLS0gc3lzL2Rldi9wY2kvdHdldmFy
LmgJMjAwMi8wNS8yNCAxODoxMDowNwkxLjEyDQorKysgc3lzL2Rldi9wY2kvdHdldmFyLmgJMjAw
Mi8xMi8xMyAwMTo0MDo0NQ0KQEAgLTYyLDYgKzYyLDcgQEANCiAJdV9pbnQJCQlzY19kc2l6ZVtU
V0VfTUFYX1VOSVRTXTsNCiB9Ow0KICNkZWZpbmUJVFdFRl9BRU4JMHgwMQkvKiByZXRyaWV2aW5n
IGFuIEFFTiAqLw0KKyNkZWZpbmUgVFdFRl9PUEVOCTB4MDIJLyogY29udHJvbCBkZXZpY2UgaXMg
b3BlbmVkICovDQogDQogLyogT3B0aW9uYWwgcGVyLWNvbW1hbmQgY29udGV4dC4gKi8NCiBzdHJ1
Y3QgdHdlX2NvbnRleHQgew0KSW5kZXg6IHN5cy9hcmNoL2kzODYvY29uZi9tYWpvcnMuaTM4Ng0K
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQ0KUkNTIGZpbGU6IC9jdnNyb290L3N5c3NyYy9zeXMvYXJjaC9pMzg2L2NvbmYv
bWFqb3JzLmkzODYsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjYNCmRpZmYgLXUgLXIxLjYgbWFq
b3JzLmkzODYNCi0tLSBzeXMvYXJjaC9pMzg2L2NvbmYvbWFqb3JzLmkzODYJMjAwMi8xMi8wNyAx
OTo0ODozMAkxLjYNCisrKyBzeXMvYXJjaC9pMzg2L2NvbmYvbWFqb3JzLmkzODYJMjAwMi8xMi8x
MyAwMTo0MDo0NQ0KQEAgLTk1LDMgKzk1LDQgQEANCiBkZXZpY2UtbWFqb3IJdmVyaWZpZWRleGVj
CWNoYXIgOTQJCQl2ZXJpZmllZGV4ZWMNCiBkZXZpY2UtbWFqb3IJZndpc28JCWNoYXIgOTUJCQlm
d2lzbw0KIGRldmljZS1tYWpvcglkcHQJCWNoYXIgOTYJCQlkcHQNCitkZXZpY2UtbWFqb3IJdHdl
CQljaGFyIDk3CQkJdHdlDQo=

--------_3DF93A2830A605836A70_MULTIPART_MIXED_
Content-Type: application/octet-stream; name="tweio.h"
Content-Disposition: attachment;
 filename="tweio.h"
Content-Transfer-Encoding: base64

LyotDQogKiBDb3B5cmlnaHQgKGMpIDIwMDAgTWljaGFlbCBTbWl0aA0KICogQ29weXJpZ2h0IChj
KSAyMDAwIEJTRGkNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQog
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMNCiAqIGFyZSBtZXQ6DQogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQNCiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUNCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQogKg0KICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBB
UyBJUycnIEFORA0KICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQ0KICogQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUNCiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMDQogKiBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUw0KICog
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pDQogKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVA0KICogTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQ0K
ICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRg0KICogU1VDSCBEQU1BR0UuDQogKg0KICogZnJvbSBGcmVlQlNEOiB0
d2Vpby5oLHYgMS4xIDIwMDAvMTAvMjUgMDY6NTk6MDUgbXNtaXRoIEV4cA0KICovDQoNCiNpbmNs
dWRlIDxzeXMvaW9jY29tLmg+DQoNCi8qDQogKiBVc2VyLXNwYWNlIGNvbW1hbmQNCiAqDQogKiBO
b3RlIHRoYXQgdGhlIGNvbW1hbmQncyBzY2F0dGVyL2dhdGhlciBsaXN0IHdpbGwgYmUgY29tcHV0
ZWQgYnkgdGhlDQogKiBkcml2ZXIsIGFuZCBjYW5ub3QgYmUgZmlsbGVkIGluIGJ5IHRoZSBjb25z
dW1lci4NCiAqLw0Kc3RydWN0IHR3ZV91c2VyY29tbWFuZCB7DQoJc3RydWN0IHR3ZV9jbWQJdHVf
Y21kOwkJLyogY29tbWFuZCByZWFkeSBmb3IgdGhlIGNvbnRyb2xsZXIgKi8NCgl2b2lkCQkqdHVf
ZGF0YTsJLyogcG9pbnRlciB0byBkYXRhIGluIHVzZXJzcGFjZSAqLw0KCXNpemVfdAkJdHVfc2l6
ZTsJLyogdXNlcnNwYWNlIGRhdGEgbGVuZ3RoICovDQp9Ow0KDQojZGVmaW5lIFRXRUlPX0NPTU1B
TkQJX0lPV1IoJ1QnLCAxMDAsIHN0cnVjdCB0d2VfdXNlcmNvbW1hbmQpDQoNCi8qDQogKiBDb21t
YW5kIHF1ZXVlIHN0YXRpc3RpY3MNCiAqLw0KI2RlZmluZSBUV0VRX0ZSRUUJMA0KI2RlZmluZSBU
V0VRX0JJTwkxDQojZGVmaW5lIFRXRVFfUkVBRFkJMg0KI2RlZmluZSBUV0VRX0JVU1kJMw0KI2Rl
ZmluZSBUV0VRX0NPTVBMRVRFCTQNCiNkZWZpbmUgVFdFUV9DT1VOVAk1CS8qIHRvdGFsIG51bWJl
ciBvZiBxdWV1ZXMgKi8NCg0Kc3RydWN0IHR3ZV9xc3RhdCB7DQoJdV9pbnQzMl90CXFfbGVuZ3Ro
Ow0KCXVfaW50MzJfdAlxX21heDsNCn07DQoNCi8qDQogKiBTdGF0aXN0aWNzIHJlcXVlc3QNCiAq
Lw0KdW5pb24gdHdlX3N0YXRyZXF1ZXN0IHsNCgl1X2ludDMyX3QJCXRzX2l0ZW07DQoJc3RydWN0
IHR3ZV9xc3RhdAl0c19xc3RhdDsNCn07DQoNCiNkZWZpbmUgVFdFSU9fU1RBVFMJX0lPV1IoJ1Qn
LCAxMDEsIHVuaW9uIHR3ZV9zdGF0cmVxdWVzdCkNCg0KLyoNCiAqIEFFTiBsaXN0ZW4NCiAqLw0K
I2RlZmluZSBUV0VJT19BRU5fUE9MTAlfSU9SKCdUJywgMTAyLCBpbnQpDQojZGVmaW5lIFRXRUlP
X0FFTl9XQUlUCV9JT1IoJ1QnLCAxMDMsIGludCkNCg0KLyoNCiAqIENvbnRyb2xsZXIgcGFyYW1l
dGVyIGFjY2Vzcw0KICovDQpzdHJ1Y3QgdHdlX3BhcmFtY29tbWFuZCB7DQoJdV9pbnQxNl90CXRw
X3RhYmxlX2lkOw0KCXVfaW50OF90CXRwX3BhcmFtX2lkOw0KCXZvaWQJCSp0cF9kYXRhOw0KCXVf
aW50OF90CXRwX3NpemU7DQp9Ow0KDQojZGVmaW5lIFRXRUlPX1NFVF9QQVJBTQlfSU9XICgnVCcs
IDEwNCwgc3RydWN0IHR3ZV9wYXJhbWNvbW1hbmQpDQojZGVmaW5lIFRXRUlPX0dFVF9QQVJBTQlf
SU9XICgnVCcsIDEwNSwgc3RydWN0IHR3ZV9wYXJhbWNvbW1hbmQpDQoNCi8qDQogKiBSZXF1ZXN0
IGEgY29udHJvbGxlciBzb2Z0LXJlc2V0DQogKi8NCiNkZWZpbmUgVFdFSU9fUkVTRVQJX0lPICAo
J1QnLCAxMDYpDQo=

--------_3DF93A2830A605836A70_MULTIPART_MIXED_--