Subject: HPT366 (UDMA/66 patch)
To: Roger Brooks <R.S.Brooks@liverpool.ac.uk>
From: Roger Brooks <R.S.Brooks@liverpool.ac.uk>
List: current-users
Date: 03/08/2000 22:11:15
  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---559023410-1804928587-952553475=:4262
Content-Type: TEXT/PLAIN; charset=US-ASCII

I am now very puzzled about the HPT366.  I still can't get both channels
to work concurrently.

Last night I modified my code to use a wdc command queue which is shared
between the two halves of the HPT366 (each of which appears as a single-channel
PCI-IDE device).  But this made no difference.  As before the disk on each
channel probed and attached correctly, and I could do I/O to either disk
on its own without any problems.  But as soon as I tried to read from
both disks at the same time, I got an immediate hangup.

While looking at the wdc driver, I spotted code for hardware-locking
(the (*claim_hw)() and (*free_hw)() function pointers in struct wdc_softc.
This looks like a bit of "haunted code", in that it doesn't seem to be used by
anything.  I wasn't convinced that it does anything more than a shared
channel queue, but decided to give it a try, but this made no difference.
This code is included in the patch.

One thing did work (not that it's any use).  A couple of nights earlier I
had tried "slugging" hpt366_pci_intr() with a DELAY(100000) to try to
serialise I/O on the two channels, but it didn't work.  I forgot to remove
this delay when I added the shared command queue, and for the first time
I was able to read from both channels of the HPT366 (albeit V E R Y
S L O W L Y !!!).

Clearly there is something very wrong.  When the system locks up I can't
break in with kgdb.  Last night I recompiled the kernel to include ddb,
but I can't get in with that either.  The strange thing is that accessing
one disk at a time shows no problems at all (although the experiment with
the shared channel queue suggests that the HPT366 needs a "rest period"
when switching channels).  It's as though the HPT366 grabs the bus, then
goes insane and won't let go again.  

Manuel Bouyer was concerned that the shared IRQ might be the problem.
I'm doubtful about this, because I put a printf in hpt366_pci_intr() to
print the channel number and the return value from wdcintr().  As far as
I could see (reading from one disk, then the other), wdcintr() was claiming
the interrupt on the right channel.

As I can't use a kernel debugger, the only way I'm going to get
anywhere is by turning on all the wdc and pciide debug printing (and
probably putting even more printf()'s in as well).  This means I'll
have to build a kernel with a serial console - and run without syslogd,
because it throws a wobbler with wdc debug printing on, as each message
written to /var/log/syslog results in several more!

First, I'm going to contact Highpoint-Tech to see if I can get programming
info.  I've been meaning to do this for a while, but the Linux patches
looked quite simple...  I'm also going to flash a new BIOS, as my BP6
motherboard (bought last August) has the initial version (LP, with v 1.07
HPT366 BIOS).  I've just downloaded version NJ (with v 1.21 of HPT366 BIOS).

I've attached my patches (to -current last supped 26/02/00) for anyone who
wants to try it (cd to /usr/src/sys before applying).

The most useful things to try would be:

    Two UDMA/66 disks (identical if possible) on the same HPT366 channel

    Two UDMA/66 disks (identical if possible), one on each HPT366 channel,

but any reports of success or failure would be useful.




Roger

------------------------------------------------------------------------------
Roger Brooks (Systems Programmer),          |  Email: R.S.Brooks@liv.ac.uk
Computing Services Dept,                    |  Tel:   +44 151 794 4441
The University of Liverpool,                |  Fax:   +44 151 794 4442
PO Box 147, Liverpool L69 3BX, UK           | 
------------------------------------------------------------------------------

---559023410-1804928587-952553475=:4262
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=HPT366-patch
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.GSO.4.10.10003082211150.4262@uxb.liv.ac.uk>
Content-Description: UDMA/66 patch for HPT366
Content-Disposition: attachment; filename=HPT366-patch

ZGlmZiAtYyAtLW5ldy1maWxlIHBjaS5vbGQvcGNpZGV2cyBwY2kvcGNpZGV2
cw0KKioqIHBjaS5vbGQvcGNpZGV2cwlXZWQgRmViIDE2IDEyOjIyOjU4IDIw
MDANCi0tLSBwY2kvcGNpZGV2cwlTYXQgRmViIDI2IDIzOjU3OjU1IDIwMDAN
CioqKioqKioqKioqKioqKg0KKioqIDEzNDksMTM1NCAqKioqDQotLS0gMTM0
OSwxMzU3IC0tLS0NCiAgcHJvZHVjdCBUUklERU5UCVRHVUlfOTY4MAkweDk2
ODAJVEdVSSA5NjgwDQogIHByb2R1Y3QgVFJJREVOVAlUR1VJXzk2ODIJMHg5
NjgyCVRHVUkgOTY4Mg0KICANCisgLyogVHJpb25lcyBUZWNobm9sb2dpZXMg
cHJvZHVjdHMgKi8NCisgcHJvZHVjdCBUUklPTkVTIEhQVDM2NiAgICAgICAg
ICAweDAwMDQgIEhQVDM2NiBVRE1BLzY2IENvbnRyb2xsZXINCisgDQogIC8q
IFRyaVRlY2ggTWljcm9lbGVjdHJvbmljcyBwcm9kdWN0cyovDQogIHByb2R1
Y3QgVFJJVEVDSAlUUjI1MjAyCQkweGZjMDIJUHlyYW1pZDNEIFRSMjUyMDIN
CiAgDQpkaWZmIC1jIC0tbmV3LWZpbGUgcGNpLm9sZC9wY2lpZGUuYyBwY2kv
cGNpaWRlLmMNCioqKiBwY2kub2xkL3BjaWlkZS5jCVdlZCBKYW4gMTkgMTI6
MzE6NDkgMjAwMA0KLS0tIHBjaS9wY2lpZGUuYwlXZWQgTWFyICA4IDAwOjAz
OjMyIDIwMDANCioqKioqKioqKioqKioqKg0KKioqIDExNSwxMjAgKioqKg0K
LS0tIDExNSwxMjEgLS0tLQ0KICAjaW5jbHVkZSA8ZGV2L3BjaS9wY2lpZGVf
c2lzX3JlZy5oPg0KICAjaW5jbHVkZSA8ZGV2L3BjaS9wY2lpZGVfYWNlcl9y
ZWcuaD4NCiAgI2luY2x1ZGUgPGRldi9wY2kvcGNpaWRlX3BkYzIwMnh4X3Jl
Zy5oPg0KKyAjaW5jbHVkZSA8ZGV2L3BjaS9wY2lpZGVfaHB0MzY2X3JlZy5o
Pg0KICANCiAgLyogaW5saW5lcyBmb3IgcmVhZGluZy93cml0aW5nIDgtYml0
IFBDSSByZWdpc3RlcnMgKi8NCiAgc3RhdGljIF9faW5saW5lIHVfaW50OF90
IHBjaWlkZV9wY2lfcmVhZCBfX1AoKHBjaV9jaGlwc2V0X3RhZ190LCBwY2l0
YWdfdCwNCioqKioqKioqKioqKioqKg0KKioqIDE4MSwxODYgKioqKg0KLS0t
IDE4MiwxOTMgLS0tLQ0KICB2b2lkIHBkYzIwMnh4X3NldHVwX2NoYW5uZWwg
X19QKChzdHJ1Y3QgY2hhbm5lbF9zb2Z0YyopKTsNCiAgaW50ICBwZGMyMDJ4
eF9wY2lfaW50ciBfX1AoKHZvaWQgKikpOw0KICANCisgdm9pZCBocHQzNjZf
Y2hpcF9tYXAgX19QKChzdHJ1Y3QgcGNpaWRlX3NvZnRjKiwgc3RydWN0IHBj
aV9hdHRhY2hfYXJncyopKTsNCisgdm9pZCBocHQzNjZfc2V0dXBfY2hhbm5l
bCBfX1AoKHN0cnVjdCBjaGFubmVsX3NvZnRjKikpOw0KKyBpbnQgIGhwdDM2
Nl9jbGFpbV9odyBfX1AoKHZvaWQgKiwgaW50KSk7DQorIHZvaWQgaHB0MzY2
X2ZyZWVfaHcgX19QKCh2b2lkICopKTsNCisgaW50ICBocHQzNjZfcGNpX2lu
dHIgX19QKCh2b2lkICopKTsNCisgDQogIHZvaWQgcGNpaWRlX2NoYW5uZWxf
ZG1hX3NldHVwIF9fUCgoc3RydWN0IHBjaWlkZV9jaGFubmVsICopKTsNCiAg
aW50ICBwY2lpZGVfZG1hX3RhYmxlX3NldHVwIF9fUCgoc3RydWN0IHBjaWlk
ZV9zb2Z0YyosIGludCwgaW50KSk7DQogIGludCAgcGNpaWRlX2RtYV9pbml0
IF9fUCgodm9pZCosIGludCwgaW50LCB2b2lkICosIHNpemVfdCwgaW50KSk7
DQoqKioqKioqKioqKioqKioNCioqKiAzMzYsMzQxICoqKioNCi0tLSAzNDMs
MzYwIC0tLS0NCiAgCX0NCiAgfTsNCiAgDQorIGNvbnN0IHN0cnVjdCBwY2lp
ZGVfcHJvZHVjdF9kZXNjIHBjaWlkZV90cmlvbmVzX3Byb2R1Y3RzW10gPSAg
ew0KKyAJeyBQQ0lfUFJPRFVDVF9UUklPTkVTX0hQVDM2NiwNCisgCSAgSURF
X1BDSV9DTEFTU19PVkVSUklERSwNCisgCSAgIlRyaW9uZXMvSGlnaHBvaW50
IEhQVDM2NiBVRE1BLzY2IElERSBDb250cm9sbGVyIiwNCisgCSAgaHB0MzY2
X2NoaXBfbWFwLA0KKyAJfSwNCisgCXsgMCwNCisgCSAgMCwNCisgCSAgTlVM
TCwNCisgCX0NCisgfTsNCisgDQogIHN0cnVjdCBwY2lpZGVfdmVuZG9yX2Rl
c2Mgew0KICAJdV9pbnQzMl90IGlkZV92ZW5kb3I7DQogIAljb25zdCBzdHJ1
Y3QgcGNpaWRlX3Byb2R1Y3RfZGVzYyAqaWRlX3Byb2R1Y3RzOw0KKioqKioq
KioqKioqKioqDQoqKiogMzQ5LDM1NCAqKioqDQotLS0gMzY4LDM3NCAtLS0t
DQogIAl7IFBDSV9WRU5ET1JfU0lTLCBwY2lpZGVfc2lzX3Byb2R1Y3RzIH0s
DQogIAl7IFBDSV9WRU5ET1JfQUxJLCBwY2lpZGVfYWNlcl9wcm9kdWN0cyB9
LA0KICAJeyBQQ0lfVkVORE9SX1BST01JU0UsIHBjaWlkZV9wcm9taXNlX3By
b2R1Y3RzIH0sDQorIAl7IFBDSV9WRU5ET1JfVFJJT05FUywgcGNpaWRlX3Ry
aW9uZXNfcHJvZHVjdHMgfSwNCiAgCXsgMCwgTlVMTCB9DQogIH07DQogIA0K
KioqKioqKioqKioqKioqDQoqKiogMjcwNCwyNzA2ICoqKioNCi0tLSAyNzI0
LDI5MjQgLS0tLQ0KICAJfQ0KICAJcmV0dXJuIHJ2Ow0KICB9DQorIA0KKyB2
b2lkDQorIGhwdDM2Nl9jaGlwX21hcChzYywgcGEpDQorICAgICAgICAgc3Ry
dWN0IHBjaWlkZV9zb2Z0YyAqc2M7DQorIAlzdHJ1Y3QgcGNpX2F0dGFjaF9h
cmdzICpwYTsNCisgew0KKyAJc3RydWN0IHBjaWlkZV9jaGFubmVsICpjcDsN
CisgCXVfaW50OF90IGNhYmxlLCByZWc1MWg7DQorIAlwY2lyZWdfdCBpbnRl
cmZhY2U7DQorIAlidXNfc2l6ZV90IGNtZHNpemUsIGN0bHNpemU7DQorIAlz
dGF0aWMgc3RydWN0IGNoYW5uZWxfcXVldWUgKnF1ZXVlID0gTlVMTDsNCisg
CXN0YXRpYyBpbnQgZGV2aWNlID0gLTE7DQorIAljaGFyICpxdHlwZSA9ICJz
aGFyZWQiOw0KKyANCisgCWlmIChwY2lpZGVfY2hpcGVuKHNjLCBwYSkgPT0g
MCkNCisgCQlyZXR1cm47DQorIA0KKyAJLyoNCisgCSAqIGNhbid0IHJlbHkg
b24gdGhlIFBDSV9DTEFTU19SRUcgY29udGVudCBpZiB0aGUgY2hpcCB3YXMg
aW4gcmFpZA0KKyAJICogbW9kZS4gV2UgaGF2ZSB0byBmYWtlIGludGVyZmFj
ZQ0KKyAJICovDQorIAlpbnRlcmZhY2UgPSBQQ0lJREVfSU5URVJGQUNFX1NF
VFRBQkxFKDApIHwgUENJSURFX0lOVEVSRkFDRV9QQ0koMCk7DQorIA0KKyAJ
cHJpbnRmKCIlczogYnVzLW1hc3RlciBETUEgc3VwcG9ydCBwcmVzZW50IiwN
CisgCQlzYy0+c2Nfd2RjZGV2LnNjX2Rldi5kdl94bmFtZSk7DQorIAlwY2lp
ZGVfbWFwcmVnX2RtYShzYywgcGEpOw0KKyAJcHJpbnRmKCJcbiIpOw0KKyAJ
c2MtPnNjX3dkY2Rldi5jYXAgPSBXRENfQ0FQQUJJTElUWV9EQVRBMTYgfCBX
RENfQ0FQQUJJTElUWV9EQVRBMzIgfA0KKyAJICAgIFdEQ19DQVBBQklMSVRZ
X01PREUgfCBXRENfQ0FQQUJJTElUWV9ETUEgfCBXRENfQ0FQQUJJTElUWV9V
RE1BOw0KKyAJc2MtPnNjX3dkY2Rldi5QSU9fY2FwID0gNDsNCisgCXNjLT5z
Y193ZGNkZXYuRE1BX2NhcCA9IDI7DQorIAlzYy0+c2Nfd2RjZGV2LlVETUFf
Y2FwID0gNDsNCisgDQorIAlzYy0+c2Nfd2RjZGV2LnNldF9tb2RlcyA9IGhw
dDM2Nl9zZXR1cF9jaGFubmVsOw0KKyAJc2MtPnNjX3dkY2Rldi5jaGFubmVs
cyA9IHNjLT53ZGNfY2hhbmFycmF5Ow0KKyAJc2MtPnNjX3dkY2Rldi5uY2hh
bm5lbHMgPSAxOw0KKyANCisgCXJlZzUxaCA9IHBjaWlkZV9wY2lfcmVhZCgg
c2MtPnNjX3BjLCBzYy0+c2NfdGFnLCAweDUxICk7DQorIAlwcmludGYoICIl
czogcmVnNTFoID0gMHglMDJ4XG4iLCANCisgCQlzYy0+c2Nfd2RjZGV2LnNj
X2Rldi5kdl94bmFtZSwgcmVnNTFoICk7DQorIAkvKg0KKyAJICogIFR1cm4g
b2ZmIGZhc3QgaW50ZXJydXB0IHByZWRpY3Rpb24NCisgCSAqLw0KKyAJcGNp
aWRlX3BjaV93cml0ZSggc2MtPnNjX3BjLCBzYy0+c2NfdGFnLCAweDUxLCBy
ZWc1MWggJiB+MHg4MCApOw0KKyAJY2FibGUgPSBwY2lpZGVfcGNpX3JlYWQo
c2MtPnNjX3BjLCBzYy0+c2NfdGFnLCAweDVhICk7DQorIAlwcmludGYoICIl
czogY2hhbm5lbCAlZCBVRE1BLyVzIGNhYmxlIChyZWc1YWggPSAweCUwMngp
XG4iLCANCisgCQlzYy0+c2Nfd2RjZGV2LnNjX2Rldi5kdl94bmFtZSwgMCwN
CisgCQkoY2FibGUgJiAweDAyKSA/ICIzMyIgOiAiNjYiLCBjYWJsZSApOw0K
KyAJY3AgPSAmc2MtPnBjaWlkZV9jaGFubmVsc1swXTsNCisgDQorIAlzYy0+
d2RjX2NoYW5hcnJheVswXSA9ICZjcC0+d2RjX2NoYW5uZWw7DQorIAljcC0+
bmFtZSA9IFBDSUlERV9DSEFOTkVMX05BTUUoMCk7DQorIAljcC0+d2RjX2No
YW5uZWwuY2hhbm5lbCA9IDA7DQorIAljcC0+d2RjX2NoYW5uZWwud2RjID0g
JnNjLT5zY193ZGNkZXY7DQorIAlzYy0+c2Nfd2RjZGV2LmNsYWltX2h3ID0g
aHB0MzY2X2NsYWltX2h3Ow0KKyAJc2MtPnNjX3dkY2Rldi5mcmVlX2h3ID0g
aHB0MzY2X2ZyZWVfaHc7DQorIAlzYy0+c2Nfd2RjZGV2LmNhcCB8PSBXRENf
Q0FQQUJJTElUWV9IV0xPQ0s7DQorIAlpZiggcGEtPnBhX2RldmljZSAhPSBk
ZXZpY2UgfHwgcXVldWUgPT0gTlVMTCkgew0KKyAJCXF1ZXVlID0gbWFsbG9j
KHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9xdWV1ZSksIE1fREVWQlVGLCBNX05P
V0FJVCk7DQorIAkJaWYgKHF1ZXVlID09IE5VTEwpIHsNCisgCQkJcHJpbnRm
KCIlcyAlcyBjaGFubmVsOiAiDQorIAkJICAgIAkgICAgImNhbid0IGFsbG9j
YXRlIG1lbW9yeSBmb3IgY29tbWFuZCBxdWV1ZSIsDQorIAkJCXNjLT5zY193
ZGNkZXYuc2NfZGV2LmR2X3huYW1lLCBjcC0+bmFtZSk7DQorIAkJCXJldHVy
bjsNCisgCQl9DQorIAkJZGV2aWNlID0gcGEtPnBhX2RldmljZTsNCisgCQlx
dHlwZSA9ICJzaGFyZWFibGUiOw0KKyAJfQ0KKyAJY3AtPndkY19jaGFubmVs
LmNoX3F1ZXVlID0gcXVldWU7DQorIAlwcmludGYoIiVzOiAlcyBjaGFubmVs
IGNvbmZpZ3VyZWQgdG8gbmF0aXZlLVBDSSBtb2RlICglcyBxdWV1ZSlcbiIs
DQorIAkgICAgCSAgICBzYy0+c2Nfd2RjZGV2LnNjX2Rldi5kdl94bmFtZSwg
Y3AtPm5hbWUsIHF0eXBlKTsNCisgCQ0KKyAJcGNpaWRlX21hcGNoYW4ocGEs
IGNwLCBpbnRlcmZhY2UsICZjbWRzaXplLCAmY3Rsc2l6ZSwgaHB0MzY2X3Bj
aV9pbnRyKTsNCisgCWlmIChjcC0+aHdfb2sgPT0gMCkNCisgCQlyZXR1cm47
DQorIAlocHQzNjZfc2V0dXBfY2hhbm5lbCgmY3AtPndkY19jaGFubmVsKTsN
CisgDQorIAlyZXR1cm47DQorIH0NCisgDQorIA0KKyB2b2lkDQorIGhwdDM2
Nl9zZXR1cF9jaGFubmVsKGNocCkNCisgCXN0cnVjdCBjaGFubmVsX3NvZnRj
ICpjaHA7DQorIHsNCisgICAgICAgICBzdHJ1Y3QgYXRhX2RyaXZlX2RhdGFz
ICpkcnZwOw0KKyAJaW50IGRyaXZlOw0KKyAJdV9pbnQzMl90IHRpbTsNCisg
CXVfaW50MzJfdCBpZGVkbWFfY3RsOw0KKyAJc3RydWN0IHBjaWlkZV9jaGFu
bmVsICpjcCA9IChzdHJ1Y3QgcGNpaWRlX2NoYW5uZWwqKWNocDsNCisgCXN0
cnVjdCBwY2lpZGVfc29mdGMgKnNjID0gKHN0cnVjdCBwY2lpZGVfc29mdGMg
KiljcC0+d2RjX2NoYW5uZWwud2RjOw0KKyANCisgDQorIAkvKiBzZXR1cCBE
TUEgaWYgbmVlZGVkICovDQorIAlwY2lpZGVfY2hhbm5lbF9kbWFfc2V0dXAo
Y3ApOw0KKyANCisgCWlkZWRtYV9jdGwgPSAwOw0KKyANCisgCS8qIFBlciBj
aGFubmVsIHNldHRpbmdzICovDQorIAlmb3IgKGRyaXZlID0gMDsgZHJpdmUg
PCAyOyBkcml2ZSsrKSB7DQorIAkJZHJ2cCA9ICZjaHAtPmNoX2RyaXZlW2Ry
aXZlXTsNCisgCQkvKiBJZiBubyBkcml2ZSwgc2tpcCAqLw0KKyAJCWlmICgo
ZHJ2cC0+ZHJpdmVfZmxhZ3MgJiBEUklWRSkgPT0gMCkNCisgCQkJY29udGlu
dWU7DQorIA0KKyAJCXRpbSA9IHBjaV9jb25mX3JlYWQoc2MtPnNjX3BjLCBz
Yy0+c2NfdGFnLA0KKyAJCQkJCUhQVDM2Nl9EQVRBX1RJTShkcml2ZSkpOw0K
KyAJCXByaW50ZiggIiVzOiBidXMgc3BlZWQgcmVnaXN0ZXIgPSAweCUwOHhc
biIsDQorIAkJCWRydnAtPmRydl9zb2Z0Yy0+ZHZfeG5hbWUsIHRpbSApOw0K
KyANCisgICAgICAgICAgICAgICAgIC8qIGFkZCB0aW1pbmcgdmFsdWVzLCBz
ZXR1cCBETUEgaWYgbmVlZGVkICovDQorICAgICAgICAgICAgICAgICB0aW0g
PSBocHQzNjZfZGF0YV90aW1fcGlvW2RydnAtPlBJT19tb2RlXTsNCisgICAg
ICAgICAgICAgICAgIGlmIChkcnZwLT5kcml2ZV9mbGFncyAmIERSSVZFX0RN
QSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAvKg0KKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgKiB1c2UgTXVsdGl3b3JkIERNQS4NCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICogVGltaW5ncyB3aWxsIGJlIHVzZWQg
Zm9yIGJvdGggUElPIGFuZCBETUEsIHNvIGFkanVzdA0KKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgKiBETUEgbW9kZSBpZiBuZWVkZWQNCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmIChkcnZwLT5QSU9fbW9kZSA+PSAzICYmDQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAoZHJ2cC0+RE1BX21vZGUgKyAyKSA+IGRydnAt
PlBJT19tb2RlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZHJ2cC0+RE1BX21vZGUgPSBkcnZwLT5QSU9fbW9kZSAtIDI7DQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAg
ICAgICAgICAgIHRpbSA9IGhwdDM2Nl9kYXRhX3RpbV9kbWFbZHJ2cC0+RE1B
X21vZGVdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpZGVkbWFfY3Rs
IHw9IElERURNQV9DVExfRFJWX0RNQShkcml2ZSk7DQorICAgICAgICAgICAg
ICAgICB9DQorICAgICAgICAgICAgICAgICBpZiAoZHJ2cC0+ZHJpdmVfZmxh
Z3MgJiBEUklWRV9VRE1BKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAg
IHRpbSA9IGhwdDM2Nl9kYXRhX3RpbV91ZG1hW2RydnAtPkRNQV9tb2RlXTsN
CisgICAgICAgICAgICAgICAgICAgICAgICAgaWRlZG1hX2N0bCB8PSBJREVE
TUFfQ1RMX0RSVl9ETUEoZHJpdmUpOw0KKyAgICAgICAgICAgICAgICAgfQ0K
KyAJCXRpbSAmPSB+MHg4MDAwMDAwMDsNCisgCQlwY2lfY29uZl93cml0ZShz
Yy0+c2NfcGMsIHNjLT5zY190YWcsDQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBIUFQzNjZfREFUQV9USU0oZHJpdmUpLCB0aW0pOw0K
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAJfQ0KKyAJaWYgKGlk
ZWRtYV9jdGwgIT0gMCkgew0KKyAJCS8qIEFkZCBzb2Z0d2FyZSBiaXRzIGlu
IHN0YXR1cyByZWdpc3RlciAqLw0KKyAJCWJ1c19zcGFjZV93cml0ZV8xKHNj
LT5zY19kbWFfaW90LCBzYy0+c2NfZG1hX2lvaCwNCisgCQkgICAgSURFRE1B
X0NUTCwgaWRlZG1hX2N0bCk7DQorIAl9DQorIAlwY2lpZGVfcHJpbnRfbW9k
ZXMoY3ApOw0KKyB9DQorIA0KKyBzdGF0aWMgaW50IGhwdDM2Nl9idXN5ID0g
MDsNCisgDQorIGludA0KKyBocHQzNjZfY2xhaW1faHcoIGNwLCBuICkNCisg
CXZvaWQgKmNwOw0KKyAJaW50IG47DQorIHsNCisgI2lmIDANCisgCXN0cnVj
dCBjaGFubmVsX3NvZnRjICpjaHAgPSAoc3RydWN0IGNoYW5uZWxfc29mdGMg
KikgY3A7DQorICNlbmRpZg0KKyAJaW50IHMgPSBzcGxiaW8oKTsNCisgCWlu
dCBydiA9IDA7DQorIA0KKyAJaWYoICFocHQzNjZfYnVzeSApDQorIAkJcnYg
PSBocHQzNjZfYnVzeSA9IDE7DQorIAlzcGx4KCBzICk7DQorIAlyZXR1cm4g
KHJ2KTsNCisgfQkJDQorIA0KKyB2b2lkDQorIGhwdDM2Nl9mcmVlX2h3KCBj
cCApDQorIAl2b2lkICpjcDsNCisgew0KKyAjaWYgMA0KKyAJc3RydWN0IGNo
YW5uZWxfc29mdGMgKmNocCA9IChzdHJ1Y3QgY2hhbm5lbF9zb2Z0YyAqKSBj
cDsNCisgI2VuZGlmDQorIA0KKyAJaHB0MzY2X2J1c3kgPSAwOw0KKyB9CQkN
CisgDQorIGludA0KKyBocHQzNjZfcGNpX2ludHIoYXJnKQ0KKyAJdm9pZCAq
YXJnOw0KKyB7DQorIAlzdHJ1Y3QgcGNpaWRlX3NvZnRjICpzYyA9IGFyZzsN
CisgCXN0cnVjdCBwY2lpZGVfY2hhbm5lbCAqY3AgPSAmc2MtPnBjaWlkZV9j
aGFubmVsc1swXTsNCisgCXN0cnVjdCBjaGFubmVsX3NvZnRjICp3ZGNfY3Ag
PSAmY3AtPndkY19jaGFubmVsOw0KKyAJaW50IHJ2ID0gMDsNCisgI2lmIDAN
CisgCXVfaW50OF90IGRtYXN0YXQ7DQorIA0KKyAJLyoNCisgCSAqIEZyZWVC
U0QgaGFzIHRoaXMgY29kZSB0byBhdm9pZCBjYWxsaW5nIGludGVycnVwdCBo
YW5kbGVyIHdpdGgNCisgCSAqIG90aGVyIGNoYW5uZWwsIGJ1dCBJIGRvbid0
IHRoaW5rIGl0J3MgbmVlZGVkIGluIE5ldEJTRC4NCisgCSAqLw0KKyAJZG1h
c3RhdCA9IHBjaWlkZV9wY2lfcmVhZCggc2MtPnNjX3BjLCBzYy0+c2NfdGFn
LCBJREVETUFfQ1RMICk7DQorIAlpZiggIShkbWFzdGF0ICYgSURFRE1BX0NU
TF9JTlRSKSApDQorIAkJcmV0dXJuIDA7DQorIAlwY2lpZGVfcGNpX3dyaXRl
KCBzYy0+c2NfcGMsIHNjLT5zY190YWcsIElERURNQV9DVEwsIGRtYXN0YXQg
KTsNCisgI2VuZGlmDQorIA0KKyAJcnYgPSB3ZGNpbnRyKHdkY19jcCk7DQor
IA0KKyAJcmV0dXJuIChydik7DQorIH0NCisgDQpkaWZmIC1jIC0tbmV3LWZp
bGUgcGNpLm9sZC9wY2lpZGVfaHB0MzY2X3JlZy5oIHBjaS9wY2lpZGVfaHB0
MzY2X3JlZy5oDQoqKiogcGNpLm9sZC9wY2lpZGVfaHB0MzY2X3JlZy5oCVRo
dSBKYW4gIDEgMDE6MDA6MDAgMTk3MA0KLS0tIHBjaS9wY2lpZGVfaHB0MzY2
X3JlZy5oCVR1ZSBNYXIgIDcgMjM6NTk6NTcgMjAwMA0KKioqKioqKioqKioq
KioqDQoqKiogMCAqKioqDQotLS0gMSw2MCAtLS0tDQorIC8qDQorICAqIENv
cHlyaWdodCAoYykgMjAwMCBUaGUgTmV0QlNEIEZvdW5kYXRpb24sIEluYy4N
CisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgICoNCisgICogQXV0aG9y
OiAgUm9nZXIgQnJvb2tzIChyc2JAbGl2LmFjLnVrKS4NCisgICoNCisgICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0DQorICAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucw0KKyAgKiBhcmUgbWV0Og0KKyAgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dA0KKyAgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorICAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0DQorICAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUN
CisgICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCisgICogMy4gQWxs
IGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9y
IHVzZSBvZiB0aGlzIHNvZnR3YXJlDQorICAqICAgIG11c3QgZGlzcGxheSB0
aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoNCisgICogICAgICAgIFRo
aXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhl
IE5ldEJTRA0KKyAgKiAgICAgICAgRm91bmRhdGlvbiwgSW5jLiBhbmQgaXRz
IGNvbnRyaWJ1dG9ycy4NCisgICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBU
aGUgTmV0QlNEIEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisg
ICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkDQorICAqICAgIGZyb20gdGhpcyBz
b2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4NCisgICoNCisgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgTkVUQlNEIEZPVU5EQVRJT04sIElOQy4gQU5EIENPTlRSSUJVVE9S
Uw0KKyAgKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQNCisgICog
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVINCisgICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBGT1VOREFU
SU9OIE9SIENPTlRSSUJVVE9SUw0KKyAgKiBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SDQorICAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GDQorICAqIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUw0KKyAgKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTg0KKyAgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQ0KKyAgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQ0KKyAgKiBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisgICoNCisgICovDQorIA0K
KyAvKg0KKyAgKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIEhpZ2hw
b2ludC9UcmlvbmVzIEhQVDM2NiBVRE1BLzY2IFBDSSBJREUNCisgICogY29u
dHJvbGxlci4gIA0KKyAgKg0KKyAgKiBUaGlzIGNoaXAgaGFzIDIgUENJIElE
RSBmdW5jdGlvbnMsIGVhY2ggb2Ygd2l0aCBvbmx5IG9uZSAocHJpbWFyeSkN
CisgICogY2hhbm5lbC4NCisgICogVGhlIGZvbGxvd2luZyB0aW1pbmcgaW5m
b3JtYXRpb24gd2FzIGdsZWFuZWQgZnJvbSB0aGUgTGludXggZHJpdmVyDQor
ICAqIHBhdGNoZWQgYnkgQW5kcmUgSGVkcmljayAoYW5kcmVAc3VzZS5jb20p
Lg0KKyAgKg0KKyAgKiBJIHN0aWxsIGNhbid0IGdldCBib3RoIGNoYW5uZWxz
IHRvIHdvcmsgY29uY3VycmVudGx5ICg3LzMvMjAwMCkuDQorICAqLw0KKyAN
CisgDQorIHN0YXRpYyBpbnQzMl90IGhwdDM2Nl9kYXRhX3RpbV91ZG1hW10g
PQ0KKyAgICAgICAgIHsgMHg5MGM4YTczMSwgMHg5MGNiYTczMSwgMHg5MGNh
YTczMSwgMHg5MGNmYTczMSwgMHg5MGM5YTczMSB9Ow0KKyANCisgc3RhdGlj
IGludDMyX3QgaHB0MzY2X2RhdGFfdGltX2RtYVtdID0geyAweGEwYzhhNzk3
LCAweGEwYzhhNzMyLCAweGEwYzhhNzMxIH07DQorIA0KKyBzdGF0aWMgaW50
MzJfdCBocHQzNjZfZGF0YV90aW1fcGlvW10gPQ0KKyAgICAgICAgIHsgMHhj
MGQwYTdhYSwgMHhjMGQwYTdhMywgMHhjMGQwYTc1MywgMHhjMGM4YTc0Miwg
MHhjMGM4YTczMSB9Ow0KKyANCisgI2RlZmluZSBIUFQzNjZfREFUQV9USU0o
IGRyaXZlICkgKChkcml2ZSkgPT0gMCA/IDB4NDAgOiAweDQzICkNCisgDQor
IA0K
---559023410-1804928587-952553475=:4262--