ztex: precheck the secondary solutions to avoid hw errors the ztex bitstreams gives back the latest checked nonce and its hash7 value and two possible solutions. every 250ms the latest nonce is checked and compared with hash7 to count hw errors and adapt the MHz value. one change is to use the solutions even if the latest nonce is not correct. the original java ztex code also does it this way. since the second solution is often not correct we have alot of hw errors. now we always check the second solution before we submit it to the cgminer main code. the java code also ignores all hw errors 500ms after a sendHash. we now do the same. this can possibly yield in a higher MHz rate. but the chance is so low nobody will ever notice in practice.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
diff --git a/driver-ztex.c b/driver-ztex.c
index 23aa97e..de7011f 100644
--- a/driver-ztex.c
+++ b/driver-ztex.c
@@ -146,9 +146,7 @@ static bool ztex_updateFreq(struct libztex_device* ztex)
}
-static bool ztex_checkNonce(struct libztex_device *ztex,
- struct work *work,
- struct libztex_hash_data *hdata)
+static uint32_t ztex_checkNonce(struct work *work, uint32_t nonce)
{
uint32_t *data32 = (uint32_t *)(work->data);
unsigned char swap[80];
@@ -158,31 +156,15 @@ static bool ztex_checkNonce(struct libztex_device *ztex,
uint32_t *hash2_32 = (uint32_t *)hash2;
int i;
-#if defined(__BIGENDIAN__) || defined(MIPSEB)
- hdata->nonce = swab32(hdata->nonce);
- hdata->hash7 = swab32(hdata->hash7);
-#endif
+ swap32[76/4] = htonl(nonce);
- work->data[64 + 12 + 0] = (hdata->nonce >> 0) & 0xff;
- work->data[64 + 12 + 1] = (hdata->nonce >> 8) & 0xff;
- work->data[64 + 12 + 2] = (hdata->nonce >> 16) & 0xff;
- work->data[64 + 12 + 3] = (hdata->nonce >> 24) & 0xff;
-
- for (i = 0; i < 80 / 4; i++)
+ for (i = 0; i < 76 / 4; i++)
swap32[i] = swab32(data32[i]);
sha2(swap, 80, hash1);
sha2(hash1, 32, hash2);
-#if defined(__BIGENDIAN__) || defined(MIPSEB)
- if (hash2_32[7] != ((hdata->hash7 + 0x5be0cd19) & 0xFFFFFFFF)) {
-#else
- if (swab32(hash2_32[7]) != ((hdata->hash7 + 0x5be0cd19) & 0xFFFFFFFF)) {
-#endif
- ztex->errorCount[ztex->freqM] += 1.0 / ztex->numNonces;
- applog(LOG_DEBUG, "%s: checkNonce failed for %0.8X", ztex->repr, hdata->nonce);
- return false;
- }
- return true;
+
+ return htonl(hash2_32[7]);
}
static int64_t ztex_scanhash(struct thr_info *thr, struct work *work,
@@ -240,9 +222,11 @@ static int64_t ztex_scanhash(struct thr_info *thr, struct work *work,
}
overflow = false;
+ int count = 0;
applog(LOG_DEBUG, "%s: entering poll loop", ztex->repr);
while (!(overflow || thr->work_restart)) {
+ count++;
nmsleep(250);
if (thr->work_restart) {
applog(LOG_DEBUG, "%s: New work detected", ztex->repr);
@@ -274,12 +258,9 @@ static int64_t ztex_scanhash(struct thr_info *thr, struct work *work,
ztex->errorCount[ztex->freqM] *= 0.995;
ztex->errorWeight[ztex->freqM] = ztex->errorWeight[ztex->freqM] * 0.995 + 1.0;
-
+
for (i = 0; i < ztex->numNonces; i++) {
nonce = hdata[i].nonce;
-#if defined(__BIGENDIAN__) || defined(MIPSEB)
- nonce = swab32(nonce);
-#endif
if (nonce > noncecnt)
noncecnt = nonce;
if (((0xffffffff - nonce) < (nonce - lastnonce[i])) || nonce < lastnonce[i]) {
@@ -287,36 +268,47 @@ static int64_t ztex_scanhash(struct thr_info *thr, struct work *work,
overflow = true;
} else
lastnonce[i] = nonce;
-#if !(defined(__BIGENDIAN__) || defined(MIPSEB))
- nonce = swab32(nonce);
-#endif
- if (!ztex_checkNonce(ztex, work, &hdata[i])) {
- thr->cgpu->hw_errors++;
- continue;
+
+ if (ztex_checkNonce(work, nonce) != (hdata->hash7 + 0x5be0cd19)) {
+ applog(LOG_DEBUG, "%s: checkNonce failed for %0.8X", ztex->repr, nonce);
+
+ // do not count errors in the first 500ms after sendHashData (2x250 wait time)
+ if (count > 2) {
+ ztex->errorCount[ztex->freqM] += 1.0 / ztex->numNonces;
+ thr->cgpu->hw_errors++;
+ }
}
+
for (j=0; j<=ztex->extraSolutions; j++) {
nonce = hdata[i].goldenNonce[j];
- if (nonce > 0) {
- found = false;
- for (k = 0; k < backlog_max; k++) {
- if (backlog[k] == nonce) {
- found = true;
- break;
- }
- }
- if (!found) {
- applog(LOG_DEBUG, "%s: Share found N%dE%d", ztex->repr, i, j);
- backlog[backlog_p++] = nonce;
- if (backlog_p >= backlog_max)
- backlog_p = 0;
-#if defined(__BIGENDIAN__) || defined(MIPSEB)
- nonce = swab32(nonce);
-#endif
- work->blk.nonce = 0xffffffff;
- submit_nonce(thr, work, nonce);
- applog(LOG_DEBUG, "%s: submitted %0.8x", ztex->repr, nonce);
+
+ if (nonce == ztex->offsNonces) {
+ continue;
+ }
+
+ // precheck the extraSolutions since they often fail
+ if (j > 0 && ztex_checkNonce(work, nonce) != 0) {
+ continue;
+ }
+
+ found = false;
+ for (k = 0; k < backlog_max; k++) {
+ if (backlog[k] == nonce) {
+ found = true;
+ break;
}
}
+ if (!found) {
+ applog(LOG_DEBUG, "%s: Share found N%dE%d", ztex->repr, i, j);
+ backlog[backlog_p++] = nonce;
+
+ if (backlog_p >= backlog_max)
+ backlog_p = 0;
+
+ work->blk.nonce = 0xffffffff;
+ submit_nonce(thr, work, nonce);
+ applog(LOG_DEBUG, "%s: submitted %0.8x", ztex->repr, nonce);
+ }
}
}
}
diff --git a/libztex.c b/libztex.c
index 71d6200..d33c5c5 100644
--- a/libztex.c
+++ b/libztex.c
@@ -878,11 +878,16 @@ int libztex_readHashData(struct libztex_device *ztex, struct libztex_hash_data n
//applog(LOG_DEBUG, "W %d:0 %0.8x", i, nonces[i].goldenNonce[0]);
memcpy((char*)&nonces[i].nonce, &rbuf[(i*bufsize)+4], 4);
- nonces[i].nonce -= ztex->offsNonces;
memcpy((char*)&nonces[i].hash7, &rbuf[(i*bufsize)+8], 4);
+ nonces[i].nonce = htole32(nonces[i].nonce);
+ nonces[i].hash7 = htole32(nonces[i].hash7);
+
+ nonces[i].nonce -= ztex->offsNonces;
+
for (j=0; j<ztex->extraSolutions; j++) {
memcpy((char*)&nonces[i].goldenNonce[j+1], &rbuf[(i*bufsize)+12+(j*4)], 4);
+ nonces[i].goldenNonce[j+1] = htole32(nonces[i].goldenNonce[j+1]);
nonces[i].goldenNonce[j+1] -= ztex->offsNonces;
//applog(LOG_DEBUG, "W %d:%d %0.8x", i, j+1, nonces[i].goldenNonce[j+1]);
}