mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-10 23:08:07 +00:00
Merge pull request #381 from denis2342/hw_errors
several changes to avoid the display of hw errors
This commit is contained in:
commit
c45096d839
124
driver-ztex.c
124
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,14 +222,25 @@ static int64_t ztex_scanhash(struct thr_info *thr, struct work *work,
|
||||
}
|
||||
|
||||
overflow = false;
|
||||
int count = 0;
|
||||
int validNonces = 0;
|
||||
double errorCount = 0;
|
||||
|
||||
applog(LOG_DEBUG, "%s: entering poll loop", ztex->repr);
|
||||
while (!(overflow || thr->work_restart)) {
|
||||
nmsleep(250);
|
||||
count++;
|
||||
|
||||
int sleepcount = 0;
|
||||
while (thr->work_restart == 0 && sleepcount < 25) {
|
||||
nmsleep(10);
|
||||
sleepcount += 1;
|
||||
}
|
||||
|
||||
if (thr->work_restart) {
|
||||
applog(LOG_DEBUG, "%s: New work detected", ztex->repr);
|
||||
break;
|
||||
}
|
||||
|
||||
ztex_selectFpga(ztex);
|
||||
i = libztex_readHashData(ztex, &hdata[0]);
|
||||
if (i < 0) {
|
||||
@ -274,12 +267,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,40 +277,68 @@ 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) {
|
||||
thr->cgpu->hw_errors++;
|
||||
errorCount += (1.0 / ztex->numNonces);
|
||||
}
|
||||
}
|
||||
else
|
||||
validNonces++;
|
||||
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// only add the errorCount if we had at least some valid nonces or
|
||||
// had no valid nonces in the last round
|
||||
if (errorCount > 0.0) {
|
||||
if (ztex->nonceCheckValid > 0 && validNonces == 0) {
|
||||
applog(LOG_ERR, "%s: resetting %.1f errors", ztex->repr, errorCount);
|
||||
}
|
||||
else {
|
||||
ztex->errorCount[ztex->freqM] += errorCount;
|
||||
}
|
||||
}
|
||||
|
||||
// remember the number of valid nonces for the check in the next round
|
||||
ztex->nonceCheckValid = validNonces;
|
||||
|
||||
ztex->errorRate[ztex->freqM] = ztex->errorCount[ztex->freqM] / ztex->errorWeight[ztex->freqM] * (ztex->errorWeight[ztex->freqM] < 100? ztex->errorWeight[ztex->freqM] * 0.01: 1.0);
|
||||
if (ztex->errorRate[ztex->freqM] > ztex->maxErrorRate[ztex->freqM])
|
||||
ztex->maxErrorRate[ztex->freqM] = ztex->errorRate[ztex->freqM];
|
||||
|
10
libztex.c
10
libztex.c
@ -701,6 +701,9 @@ int libztex_prepare_device(struct libusb_device *dev, struct libztex_device** zt
|
||||
newdev->maxErrorRate[cnt] = 0;
|
||||
}
|
||||
|
||||
// fake that the last round found something valid
|
||||
newdev->nonceCheckValid = 1;
|
||||
|
||||
newdev->usbbus = libusb_get_bus_number(dev);
|
||||
newdev->usbaddress = libusb_get_device_address(dev);
|
||||
sprintf(newdev->repr, "ZTEX %s-1", newdev->snString);
|
||||
@ -878,11 +881,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]);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user