Skip to content

Commit

Permalink
Merge pull request ckolivas#381 from denis2342/hw_errors
Browse files Browse the repository at this point in the history
several changes to avoid the display of hw errors
  • Loading branch information
ckolivas committed Mar 4, 2013
2 parents 59261a8 + f530615 commit c45096d
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 54 deletions.
124 changes: 71 additions & 53 deletions driver-ztex.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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,
Expand Down Expand Up @@ -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) {
Expand All @@ -274,53 +267,78 @@ 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]) {
applog(LOG_DEBUG, "%s: overflow nonce=%0.8x lastnonce=%0.8x", ztex->repr, nonce, lastnonce[i]);
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];
Expand Down
10 changes: 9 additions & 1 deletion libztex.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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]);
}
Expand Down
2 changes: 2 additions & 0 deletions libztex.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ struct libztex_device {
double errorRate[256];
double maxErrorRate[256];

int16_t nonceCheckValid;

int16_t numberOfFpgas;
int selectedFpga;
bool parallelConfigSupport;
Expand Down

0 comments on commit c45096d

Please sign in to comment.