Commit c45096d839af05429a8d9e0bb64cf0f39deb6d4a

Con Kolivas 2013-03-04T12:56:12

Merge pull request #381 from denis2342/hw_errors several changes to avoid the display of hw errors

diff --git a/driver-ztex.c b/driver-ztex.c
index 13b70be..f046c40 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,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];
diff --git a/libztex.c b/libztex.c
index 71d6200..b3dfbeb 100644
--- a/libztex.c
+++ b/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]);
 		}
diff --git a/libztex.h b/libztex.h
index ffd056e..c1d09b6 100644
--- a/libztex.h
+++ b/libztex.h
@@ -73,6 +73,8 @@ struct libztex_device {
 	double errorRate[256];
 	double maxErrorRate[256];
 
+	int16_t nonceCheckValid;
+
 	int16_t numberOfFpgas;
 	int selectedFpga;
 	bool parallelConfigSupport;