|
|
@ -286,7 +286,7 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work, |
|
|
|
char *ob_hex, *nonce_hex; |
|
|
|
char *ob_hex, *nonce_hex; |
|
|
|
uint32_t nonce; |
|
|
|
uint32_t nonce; |
|
|
|
uint32_t hash_count; |
|
|
|
uint32_t hash_count; |
|
|
|
time_t t = 0; |
|
|
|
struct timeval tv_start, tv_end, diff; |
|
|
|
|
|
|
|
|
|
|
|
icarus = thr->cgpu; |
|
|
|
icarus = thr->cgpu; |
|
|
|
fd = icarus->device_fd; |
|
|
|
fd = icarus->device_fd; |
|
|
@ -299,13 +299,15 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work, |
|
|
|
#ifndef WIN32 |
|
|
|
#ifndef WIN32 |
|
|
|
tcflush(fd, TCOFLUSH); |
|
|
|
tcflush(fd, TCOFLUSH); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gettimeofday(&tv_start, NULL); |
|
|
|
|
|
|
|
|
|
|
|
ret = icarus_write(fd, ob_bin, sizeof(ob_bin)); |
|
|
|
ret = icarus_write(fd, ob_bin, sizeof(ob_bin)); |
|
|
|
if (ret) |
|
|
|
if (ret) |
|
|
|
return 0; /* This should never happen */ |
|
|
|
return 0; /* This should never happen */ |
|
|
|
|
|
|
|
|
|
|
|
ob_hex = bin2hex(ob_bin, sizeof(ob_bin)); |
|
|
|
ob_hex = bin2hex(ob_bin, sizeof(ob_bin)); |
|
|
|
if (ob_hex) { |
|
|
|
if (ob_hex) { |
|
|
|
t = time(NULL); |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Icarus %s send: %s", |
|
|
|
applog(LOG_DEBUG, "Icarus %s send: %s", |
|
|
|
icarus->device_id, ob_hex); |
|
|
|
icarus->device_id, ob_hex); |
|
|
|
free(ob_hex); |
|
|
|
free(ob_hex); |
|
|
@ -315,23 +317,32 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work, |
|
|
|
memset(nonce_bin, 0, sizeof(nonce_bin)); |
|
|
|
memset(nonce_bin, 0, sizeof(nonce_bin)); |
|
|
|
ret = icarus_gets(nonce_bin, sizeof(nonce_bin), fd, wr); |
|
|
|
ret = icarus_gets(nonce_bin, sizeof(nonce_bin), fd, wr); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gettimeofday(&tv_end, NULL); |
|
|
|
|
|
|
|
timeval_subtract(&diff, &tv_end, &tv_start); |
|
|
|
|
|
|
|
|
|
|
|
nonce_hex = bin2hex(nonce_bin, sizeof(nonce_bin)); |
|
|
|
nonce_hex = bin2hex(nonce_bin, sizeof(nonce_bin)); |
|
|
|
if (nonce_hex) { |
|
|
|
if (nonce_hex) { |
|
|
|
t = time(NULL) - t; |
|
|
|
applog(LOG_DEBUG, "Icarus %d returned (in %d.%06d seconds): %s", |
|
|
|
applog(LOG_DEBUG, "Icarus %d return (elapse %d seconds): %s", |
|
|
|
icarus->device_id, diff.tv_sec, diff.tv_usec, nonce_hex); |
|
|
|
icarus->device_id, t, nonce_hex); |
|
|
|
|
|
|
|
free(nonce_hex); |
|
|
|
free(nonce_hex); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
memcpy((char *)&nonce, nonce_bin, sizeof(nonce_bin)); |
|
|
|
memcpy((char *)&nonce, nonce_bin, sizeof(nonce_bin)); |
|
|
|
|
|
|
|
|
|
|
|
if (nonce == 0 && ret) |
|
|
|
work->blk.nonce = 0xffffffff; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (nonce == 0 && ret) { |
|
|
|
|
|
|
|
if (unlikely(diff.tv_sec > 12 || (diff.tv_sec == 11 && diff.tv_usec > 300067))) |
|
|
|
return 0xffffffff; |
|
|
|
return 0xffffffff; |
|
|
|
|
|
|
|
// Approximately how much of the nonce Icarus scans in 1 second...
|
|
|
|
|
|
|
|
// 0x16a7a561 would be if it was exactly 380 MH/s
|
|
|
|
|
|
|
|
// 0x168b7b4b was the average over a 201-sample period based on time to find actual shares
|
|
|
|
|
|
|
|
return (0x168b7b4b * diff.tv_sec) + (0x17a * diff.tv_usec); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#ifndef __BIG_ENDIAN__ |
|
|
|
#ifndef __BIG_ENDIAN__ |
|
|
|
nonce = swab32(nonce); |
|
|
|
nonce = swab32(nonce); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
work->blk.nonce = 0xffffffff; |
|
|
|
|
|
|
|
submit_nonce(thr, work, nonce); |
|
|
|
submit_nonce(thr, work, nonce); |
|
|
|
|
|
|
|
|
|
|
|
hash_count = (nonce & 0x7fffffff); |
|
|
|
hash_count = (nonce & 0x7fffffff); |
|
|
@ -344,6 +355,8 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work, |
|
|
|
hash_count <<= 1; |
|
|
|
hash_count <<= 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
applog(LOG_DEBUG, "0x%x hashes in %d.%06d seconds", hash_count, diff.tv_sec, diff.tv_usec); |
|
|
|
|
|
|
|
|
|
|
|
return hash_count; |
|
|
|
return hash_count; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|