diff --git a/cgminer.c b/cgminer.c index baa380c1..cdf15a95 100644 --- a/cgminer.c +++ b/cgminer.c @@ -5078,17 +5078,27 @@ static void gen_hash(unsigned char *data, unsigned char *hash, int len) * 0x00000000ffff0000000000000000000000000000000000000000000000000000 * so we use a big endian 64 bit unsigned integer centred on the 5th byte to * cover a huge range of difficulty targets, though not all 256 bits' worth */ -static void set_work_target(struct work *work, int diff) +static void set_work_target(struct work *work, double diff) { unsigned char rtarget[32], target[32]; + double d64; uint64_t *data64, h64; - h64 = diffone; - h64 /= (uint64_t)diff; - memset(rtarget, 0, 32); - data64 = (uint64_t *)(rtarget + 4); - *data64 = htobe64(h64); - swab256(target, rtarget); + d64 = diffone; + d64 /= diff; + h64 = d64; + + if (h64) { + memset(rtarget, 0, 32); + data64 = (uint64_t *)(rtarget + 4); + *data64 = htobe64(h64); + swab256(target, rtarget); + } else { + /* Support for the classic all FFs just-below-1 diff */ + memset(target, 0xff, 28); + memset(&target[28], 0, 4); + } + if (opt_debug) { char *htarget = bin2hex(target, 32); diff --git a/miner.h b/miner.h index 2b52eaad..6e331522 100644 --- a/miner.h +++ b/miner.h @@ -821,7 +821,7 @@ struct stratum_work { bool clean; int merkles; - int diff; + double diff; }; #define RECVSIZE 8192 @@ -966,7 +966,7 @@ struct work { char job_id[64]; char nonce2[64]; char ntime[16]; - int sdiff; + double sdiff; bool gbt; char gbt_coinbase[512]; diff --git a/util.c b/util.c index 072c5ce8..d5c2e542 100644 --- a/util.c +++ b/util.c @@ -1131,17 +1131,17 @@ static bool parse_notify(struct pool *pool, json_t *val) static bool parse_diff(struct pool *pool, json_t *val) { - int diff; + double diff; - diff = json_integer_value(json_array_get(val, 0)); - if (diff < 1) + diff = json_number_value(json_array_get(val, 0)); + if (diff == 0) return false; mutex_lock(&pool->pool_lock); pool->swork.diff = diff; mutex_unlock(&pool->pool_lock); - applog(LOG_DEBUG, "Pool %d difficulty set to %d", pool->pool_no, diff); + applog(LOG_DEBUG, "Pool %d difficulty set to %f", pool->pool_no, diff); return true; } @@ -1266,24 +1266,20 @@ bool auth_stratum(struct pool *pool) sprintf(s, "{\"id\": %d, \"method\": \"mining.authorize\", \"params\": [\"%s\", \"%s\"]}", swork_id++, pool->rpc_user, pool->rpc_pass); - /* Parse all data prior sending auth request */ - while (sock_full(pool, false)) { + if (!stratum_send(pool, s, strlen(s))) + goto out; + + /* Parse all data in the queue and anything left should be auth */ + while (42) { sret = recv_line(pool); - if (!parse_method(pool, sret)) { - clear_sock(pool); - applog(LOG_INFO, "Failed to parse stratum buffer"); + if (!sret) + goto out; + if (parse_method(pool, sret)) free(sret); - return ret; - } - free(sret); + else + break; } - if (!stratum_send(pool, s, strlen(s))) - goto out; - - sret = recv_line(pool); - if (!sret) - goto out; val = JSON_LOADS(sret, &err); free(sret); res_val = json_object_get(val, "result");