Generate the output hash for scrypt as well and use the one function to set share_diff.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
diff --git a/cgminer.c b/cgminer.c
index 3e89049..33ff829 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -2342,7 +2342,10 @@ static uint64_t share_diff(const struct work *work)
uint64_t ret;
swab256(rhash, work->hash);
- data64 = (uint64_t *)(rhash + 4);
+ if (opt_scrypt)
+ data64 = (uint64_t *)(rhash + 2);
+ else
+ data64 = (uint64_t *)(rhash + 4);
d64 = be64toh(*data64);
if (unlikely(!d64))
d64 = 1;
@@ -2356,23 +2359,6 @@ static uint64_t share_diff(const struct work *work)
return ret;
}
-static uint64_t scrypt_diff(const struct work *work)
-{
- const uint64_t scrypt_diffone = 0x0000ffff00000000ul;
- uint64_t d64 = work->outputhash, ret;
-
- if (unlikely(!d64))
- d64 = 1;
- ret = scrypt_diffone / d64;
- mutex_lock(&control_lock);
- if (ret > best_diff) {
- best_diff = ret;
- suffix_string(best_diff, best_share, 0);
- }
- mutex_unlock(&control_lock);
- return ret;
-}
-
static bool submit_upstream_work(struct work *work, CURL *curl, bool resubmit)
{
char *hexstr = NULL;
@@ -2383,7 +2369,6 @@ static bool submit_upstream_work(struct work *work, CURL *curl, bool resubmit)
struct cgpu_info *cgpu = thr_info[thr_id].cgpu;
struct pool *pool = work->pool;
int rolltime;
- uint32_t *hash32;
struct timeval tv_submit, tv_submit_reply;
char hashshow[64 + 4] = "";
char worktime[200] = "";
@@ -2464,26 +2449,20 @@ static bool submit_upstream_work(struct work *work, CURL *curl, bool resubmit)
if (!QUIET) {
int intdiff = floor(work->work_difficulty);
+ char diffdisp[16], *outhash;
+ unsigned char rhash[32];
uint64_t sharediff;
- char diffdisp[16];
-
- hash32 = (uint32_t *)(work->hash);
- if (opt_scrypt) {
- uint64_t outhash;
-
- scrypt_outputhash(work);
- sharediff = scrypt_diff(work);
- suffix_string(sharediff, diffdisp, 0);
- outhash = work->outputhash >> 16;
- sprintf(hashshow, "%08lx Diff %s/%d", (unsigned long)outhash, diffdisp, intdiff);
- } else {
- sharediff = share_diff(work);
- suffix_string(sharediff, diffdisp, 0);
-
- sprintf(hashshow, "%08lx Diff %s/%d%s", (unsigned long)(hash32[6]), diffdisp, intdiff,
- work->block? " BLOCK!" : "");
- }
+ swab256(rhash, work->hash);
+ if (opt_scrypt)
+ outhash = bin2hex(rhash + 2, 4);
+ else
+ outhash = bin2hex(rhash + 4, 4);
+ sharediff = share_diff(work);
+ suffix_string(sharediff, diffdisp, 0);
+ sprintf(hashshow, "%s Diff %s/%d%s", outhash, diffdisp, intdiff,
+ work->block? " BLOCK!" : "");
+ free(outhash);
if (opt_worktime) {
char workclone[20];
@@ -3095,16 +3074,20 @@ static bool stale_work(struct work *work, bool share)
static void check_solve(struct work *work)
{
+ if (opt_scrypt)
+ scrypt_outputhash(work);
+ else {
#ifndef MIPSEB
- /* This segfaults on openwrt */
- work->block = regeneratehash(work);
+ /* This segfaults on openwrt */
+ work->block = regeneratehash(work);
+#endif
+ }
if (unlikely(work->block)) {
work->pool->solved++;
found_blocks++;
work->mandatory = true;
applog(LOG_NOTICE, "Found block for pool %d!", work->pool->pool_no);
}
-#endif
}
static void *submit_work_thread(void *userdata)
diff --git a/miner.h b/miner.h
index 2b5897a..b8a9124 100644
--- a/miner.h
+++ b/miner.h
@@ -972,8 +972,6 @@ struct work {
unsigned char target[32];
unsigned char hash[32];
- uint64_t outputhash;
-
int rolls;
dev_blk_ctx blk;
diff --git a/scrypt.c b/scrypt.c
index d4bb267..128be6e 100644
--- a/scrypt.c
+++ b/scrypt.c
@@ -407,16 +407,16 @@ static void scrypt_1024_1_1_256_sp(const uint32_t* input, char* scratchpad, uint
void scrypt_outputhash(struct work *work)
{
- uint32_t data[20], ohash[8], rhash[8];
+ uint32_t data[20];
char *scratchbuf;
uint32_t *nonce = (uint32_t *)(work->data + 76);
+ uint32_t *ohash = (uint32_t *)(work->hash);
be32enc_vect(data, (const uint32_t *)work->data, 19);
data[19] = htobe32(*nonce);
scratchbuf = alloca(SCRATCHBUF_SIZE);
scrypt_1024_1_1_256_sp(data, scratchbuf, ohash);
- swap256(rhash, ohash);
- work->outputhash = be64toh(*((uint64_t *)rhash));
+ flip32(ohash, ohash);
}
/* Used externally as confirmation of correct OCL code */