~registry/cgminer/git

4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
1
/*
4730 by Con Kolivas
Fix various unused warnings
2
 * Copyright 2013-2015 Con Kolivas <kernel@kolivas.org>
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
3
 * Copyright 2012-2014 Xiangfu <xiangfu@openmobilefree.com>
4
 *
5
 * This program is free software; you can redistribute it and/or modify it
6
 * under the terms of the GNU General Public License as published by the Free
7
 * Software Foundation; either version 3 of the License, or (at your option)
8
 * any later version.  See COPYING for more details.
9
 */
10
11
#include "config.h"
12
13
#include <limits.h>
14
#include <pthread.h>
15
#include <stdio.h>
16
#include <sys/time.h>
17
#include <sys/types.h>
18
#include <dirent.h>
19
#include <unistd.h>
20
#ifndef WIN32
21
  #include <termios.h>
22
  #include <sys/stat.h>
23
  #include <fcntl.h>
24
  #ifndef O_CLOEXEC
25
    #define O_CLOEXEC 0
26
  #endif
27
#else
28
  #include <io.h>
29
#endif
30
31
#include "elist.h"
32
#include "miner.h"
33
#include "driver-hashratio.h"
34
#include "crc.h"
35
#include "usbutils.h"
36
4648 by Con Kolivas
Fix segfault when writing config with hashratio built in
37
static int opt_hashratio_fan_min = HRTO_DEFAULT_FAN_MIN;
38
static int opt_hashratio_fan_max = HRTO_DEFAULT_FAN_MAX;
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
39
4648 by Con Kolivas
Fix segfault when writing config with hashratio built in
40
static int hashratio_freq = HRTO_DEFAULT_FREQUENCY;
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
41
42
//static int get_fan_pwm(int temp) {
43
//	int pwm;
44
//	uint8_t fan_pwm_arr[] = {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
45
//		30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
46
//		30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
47
//		30, 37, 49, 61, 73, 85, 88, 91, 94, 97, 100, 100, 100, 100, 100, 100,
48
//		100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
49
//		100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
50
//		100, 100, 100, 100, 100, 100, 100};
51
//	if (temp < 0 || temp >= sizeof(fan_pwm_arr)/sizeof(fan_pwm_arr[0]) ||
52
//		fan_pwm_arr[temp] > opt_hashratio_fan_max) {
53
//		return opt_hashratio_fan_max;
54
//	}
55
//	pwm = HRTO_PWM_MAX - fan_pwm_arr[temp] * HRTO_PWM_MAX / 100;
56
//
57
//	if (pwm < opt_hashratio_fan_min) {
58
//		return opt_hashratio_fan_min;
59
//	}
60
//	if (pwm > opt_hashratio_fan_max) {
61
//		return opt_hashratio_fan_max;
62
//	}
63
//	return pwm;
64
//}
65
66
char *set_hashratio_freq(char *arg)
67
{
68
	int val, ret;
69
	
70
	ret = sscanf(arg, "%d", &val);
71
	if (ret != 1)
72
		return "No values passed to hashratio-freq";
73
	
74
	if (val < HRTO_DEFAULT_FREQUENCY_MIN || val > HRTO_DEFAULT_FREQUENCY_MAX)
75
		return "Invalid value passed to hashratio-freq";
4648 by Con Kolivas
Fix segfault when writing config with hashratio built in
76
77
	hashratio_freq = val;
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
78
	
79
	return NULL;
80
}
81
82
char *set_hashratio_fan(char *arg)
83
{
84
	int val1, val2, ret;
85
86
	ret = sscanf(arg, "%d-%d", &val1, &val2);
87
	if (ret < 1)
88
		return "No values passed to hashratio-fan";
89
	if (ret == 1)
90
		val2 = val1;
91
92
	if (val1 < 0 || val1 > 100 || val2 < 0 || val2 > 100 || val2 < val1)
93
		return "Invalid value passed to hashratio-fan";
94
95
	opt_hashratio_fan_min = val1 * HRTO_PWM_MAX / 100;
96
	opt_hashratio_fan_max = val2 * HRTO_PWM_MAX / 100;
97
98
	return NULL;
99
}
100
101
static int hashratio_init_pkg(struct hashratio_pkg *pkg, uint8_t type,
102
							  uint8_t idx, uint8_t cnt)
103
{
104
	unsigned short crc;
105
106
	pkg->head[0] = HRTO_H1;
107
	pkg->head[1] = HRTO_H2;
108
109
	pkg->type = type;
110
	pkg->idx = idx;
111
	pkg->cnt = cnt;
112
113
	crc = crc16(pkg->data, HRTO_P_DATA_LEN);
114
115
	pkg->crc[0] = (crc & 0xff00) >> 8;
116
	pkg->crc[1] = crc & 0x00ff;
117
	return 0;
118
}
119
120
static int job_idcmp(uint8_t *job_id, char *pool_job_id)
121
{
122
	int job_id_len;
123
	unsigned short crc, crc_expect;
124
125
	if (!pool_job_id)
126
		return 1;
127
128
	job_id_len = strlen(pool_job_id);
4559.2.30 by Con Kolivas
Fix stratum updates not being passed to hashratio devices and clean up
129
	crc_expect = crc16((const unsigned char *)pool_job_id, job_id_len);
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
130
131
	crc = job_id[0] << 8 | job_id[1];
132
133
	if (crc_expect == crc)
134
		return 0;
135
136
	applog(LOG_DEBUG, "Hashratio: job_id not match! [%04x:%04x (%s)]",
137
	       crc, crc_expect, pool_job_id);
138
139
	return 1;
140
}
141
142
static int decode_pkg(struct thr_info *thr, struct hashratio_ret *ar, uint8_t *pkg)
143
{
144
	struct cgpu_info *hashratio = thr->cgpu;
145
	struct hashratio_info *info = hashratio->device_data;
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
146
	struct pool *pool, *real_pool, *pool_stratum = &info->pool;
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
147
148
	unsigned int expected_crc;
149
	unsigned int actual_crc;
150
	uint32_t nonce, nonce2, miner;
151
	int pool_no;
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
152
	uint8_t job_id[4];
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
153
	int tmp;
154
155
	int type = HRTO_GETS_ERROR;
156
157
	memcpy((uint8_t *)ar, pkg, HRTO_READ_SIZE);
158
159
//	applog(LOG_DEBUG, "pkg.type, hex: %02x, dec: %d", ar->type, ar->type);
160
	
161
	if (ar->head[0] == HRTO_H1 && ar->head[1] == HRTO_H2) {
162
		expected_crc = crc16(ar->data, HRTO_P_DATA_LEN);
163
		actual_crc = (ar->crc[0] & 0xff) |
164
			((ar->crc[1] & 0xff) << 8);
165
166
		type = ar->type;
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
167
		applog(LOG_DEBUG, "hashratio: %d: expected crc(%04x), actual_crc(%04x)", type, expected_crc, actual_crc);
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
168
		if (expected_crc != actual_crc)
169
			goto out;
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
170
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
171
		switch(type) {
172
		case HRTO_P_NONCE:
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
173
			applog(LOG_DEBUG, "Hashratio: HRTO_P_NONCE");
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
174
			memcpy(&miner,   ar->data + 0, 4);
175
			memcpy(&pool_no, ar->data + 4, 4);
176
			memcpy(&nonce2,  ar->data + 8, 4);
177
			/* Calc time    ar->data + 12 */
178
			memcpy(&nonce, ar->data + 12, 4);
179
			memcpy(job_id, ar->data + 16, 4);
180
181
			miner = be32toh(miner);
182
			pool_no = be32toh(pool_no);
183
			if (miner >= HRTO_DEFAULT_MINERS || pool_no >= total_pools || pool_no < 0) {
184
				applog(LOG_DEBUG, "hashratio: Wrong miner/pool/id no %d,%d", miner, pool_no);
185
				break;
186
			} else
187
				info->matching_work[miner]++;
188
			nonce2 = be32toh(nonce2);
189
			nonce = be32toh(nonce);
190
191
			applog(LOG_DEBUG, "hashratio: Found! [%s] %d:(%08x) (%08x)",
192
			       job_id, pool_no, nonce2, nonce);
193
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
194
			real_pool = pool = pools[pool_no];
195
			if (job_idcmp(job_id, pool->swork.job_id)) {
196
				if (!job_idcmp(job_id, pool_stratum->swork.job_id)) {
4559.2.30 by Con Kolivas
Fix stratum updates not being passed to hashratio devices and clean up
197
					applog(LOG_DEBUG, "Hashratio: Match to previous stratum! (%s)", pool_stratum->swork.job_id);
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
198
					pool = pool_stratum;
199
				} else {
4559.2.30 by Con Kolivas
Fix stratum updates not being passed to hashratio devices and clean up
200
					applog(LOG_DEBUG, "Hashratio Cannot match to any stratum! (%s)", pool->swork.job_id);
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
201
					break;
202
				}
203
			}
4715 by Con Kolivas
Fix ava4 build incompatibilites and missing write config parameters
204
			submit_nonce2_nonce(thr, pool, real_pool, nonce2, nonce, 0);
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
205
			break;
206
		case HRTO_P_STATUS:
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
207
			applog(LOG_DEBUG, "Hashratio: HRTO_P_STATUS");
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
208
			memcpy(&tmp, ar->data, 4);
209
			tmp = be32toh(tmp);
210
			info->temp = (tmp & 0x00f0) >> 8;
211
			if (info->temp_max < info->temp) {
212
				info->temp_max = info->temp;
213
			}
214
//			info->temp[1] = tmp & 0xffff;
215
216
			memcpy(&tmp, ar->data + 4, 4);
217
			tmp = be32toh(tmp);
218
			info->fan[0] = tmp >> 16;
219
			info->fan[1] = tmp & 0xffff;
220
221
			// local_work
222
			memcpy(&tmp, ar->data + 8, 4);
223
			tmp = be32toh(tmp);
224
			info->local_work = tmp;
225
			info->local_works += tmp;
226
			
227
			// hw_work
228
			memcpy(&tmp, ar->data + 12, 4);
229
			tmp = be32toh(tmp);
230
			info->hw_works += tmp;
231
			
232
			hashratio->temp = info->temp;
233
			break;
234
		case HRTO_P_ACKDETECT:
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
235
			applog(LOG_DEBUG, "Hashratio: HRTO_P_ACKDETECT");
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
236
			break;
237
		case HRTO_P_ACK:
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
238
			applog(LOG_DEBUG, "Hashratio: HRTO_P_ACK");
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
239
			break;
240
		case HRTO_P_NAK:
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
241
			applog(LOG_DEBUG, "Hashratio: HRTO_P_NAK");
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
242
			break;
243
		default:
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
244
			applog(LOG_DEBUG, "Hashratio: HRTO_GETS_ERROR");
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
245
			type = HRTO_GETS_ERROR;
246
			break;
247
		}
248
	}
249
250
out:
251
	return type;
252
}
253
254
static inline int hashratio_gets(struct cgpu_info *hashratio, uint8_t *buf)
255
{
256
	int i;
257
	int read_amount = HRTO_READ_SIZE;
258
	uint8_t buf_tmp[HRTO_READ_SIZE];
259
	uint8_t buf_copy[2 * HRTO_READ_SIZE];
260
	uint8_t *buf_back = buf;
261
	int ret = 0;
262
263
	while (true) {
264
		int err;
265
266
		do {
267
			memset(buf, 0, read_amount);
268
			err = usb_read(hashratio, (char *)buf, read_amount, &ret, C_HRO_READ);
269
			if (unlikely(err < 0 || ret != read_amount)) {
270
				applog(LOG_ERR, "hashratio: Error on read in hashratio_gets got %d", ret);
271
				return HRTO_GETS_ERROR;
272
			}
273
			if (likely(ret >= read_amount)) {
274
				for (i = 1; i < read_amount; i++) {
275
					if (buf_back[i - 1] == HRTO_H1 && buf_back[i] == HRTO_H2)
276
						break;
277
				}
278
				i -= 1;
279
				if (i) {
280
					err = usb_read(hashratio, (char *)buf, read_amount, &ret, C_HRO_READ);
4559.2.45 by Con Kolivas
Fix error in 2nd read functions for av2 and hro
281
					if (unlikely(err < 0 || ret != read_amount)) {
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
282
						applog(LOG_ERR, "hashratio: Error on 2nd read in hashratio_gets got %d", ret);
283
						return HRTO_GETS_ERROR;
284
					}
285
					memcpy(buf_copy, buf_back + i, HRTO_READ_SIZE - i);
286
					memcpy(buf_copy + HRTO_READ_SIZE - i, buf_tmp, i);
287
					memcpy(buf_back, buf_copy, HRTO_READ_SIZE);
288
				}
289
				return HRTO_GETS_OK;
290
			}
291
			buf += ret;
292
			read_amount -= ret;
293
			continue;
294
		} while (ret > 0);
295
296
		return HRTO_GETS_TIMEOUT;
297
	}
298
}
299
300
static int hashratio_send_pkg(struct cgpu_info *hashratio, const struct hashratio_pkg *pkg)
301
{
302
	int err, amount;
303
	uint8_t buf[HRTO_WRITE_SIZE];
304
	int nr_len = HRTO_WRITE_SIZE;
305
306
	memcpy(buf, pkg, HRTO_WRITE_SIZE);
307
//	if (opt_debug) {
308
//		applog(LOG_DEBUG, "hashratio: Sent(%d):", nr_len);
309
//		hexdump((uint8_t *)buf, nr_len);
310
//	}
311
4559.2.32 by Con Kolivas
Handle disconnected hashratio devices
312
	if (unlikely(hashratio->usbinfo.nodev))
313
		return HRTO_SEND_ERROR;
314
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
315
	err = usb_write(hashratio, (char *)buf, nr_len, &amount, C_HRO_WRITE);
316
	if (err || amount != nr_len) {
317
		applog(LOG_DEBUG, "hashratio: Send(%d)!", amount);
318
		return HRTO_SEND_ERROR;
319
	}
320
321
	return HRTO_SEND_OK;
322
}
323
4559.2.32 by Con Kolivas
Handle disconnected hashratio devices
324
static int hashratio_send_pkgs(struct cgpu_info *hashratio, const struct hashratio_pkg *pkg)
325
{
326
	int ret;
327
328
	do {
329
		if (unlikely(hashratio->usbinfo.nodev))
330
			return -1;
331
		ret = hashratio_send_pkg(hashratio, pkg);
332
	} while (ret != HRTO_SEND_OK);
333
	return 0;
334
}
335
336
static void hashratio_stratum_pkgs(struct cgpu_info *hashratio, struct pool *pool)
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
337
{
338
	const int merkle_offset = 36;
339
	struct hashratio_pkg pkg;
340
	int i, a, b, tmp;
341
	unsigned char target[32];
342
	int job_id_len;
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
343
	unsigned short crc;
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
344
345
	/* Send out the first stratum message STATIC */
346
	applog(LOG_DEBUG, "hashratio: Pool stratum message STATIC: %d, %d, %d, %d, %d, %d",
347
	       pool->coinbase_len,
348
	       pool->nonce2_offset,
349
	       pool->n2size,
350
	       merkle_offset,
351
	       pool->merkles,
352
		   pool->pool_no);
353
	memset(pkg.data, 0, HRTO_P_DATA_LEN);
354
	tmp = be32toh(pool->coinbase_len);
355
	memcpy(pkg.data, &tmp, 4);
356
357
	tmp = be32toh(pool->nonce2_offset);
358
	memcpy(pkg.data + 4, &tmp, 4);
359
360
	tmp = be32toh(pool->n2size);
361
	memcpy(pkg.data + 8, &tmp, 4);
362
363
	tmp = be32toh(merkle_offset);
364
	memcpy(pkg.data + 12, &tmp, 4);
365
366
	tmp = be32toh(pool->merkles);
367
	memcpy(pkg.data + 16, &tmp, 4);
368
369
	tmp = be32toh((int)pool->sdiff);
370
	memcpy(pkg.data + 20, &tmp, 4);
371
372
	tmp = be32toh((int)pool->pool_no);
373
	memcpy(pkg.data + 24, &tmp, 4);
374
375
	hashratio_init_pkg(&pkg, HRTO_P_STATIC, 1, 1);
4559.2.32 by Con Kolivas
Handle disconnected hashratio devices
376
	if (hashratio_send_pkgs(hashratio, &pkg))
377
		return;
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
378
379
	set_target(target, pool->sdiff);
380
	memcpy(pkg.data, target, 32);
381
	if (opt_debug) {
382
		char *target_str;
383
		target_str = bin2hex(target, 32);
384
		applog(LOG_DEBUG, "hashratio: Pool stratum target: %s", target_str);
385
		free(target_str);
386
	}
387
	hashratio_init_pkg(&pkg, HRTO_P_TARGET, 1, 1);
4559.2.32 by Con Kolivas
Handle disconnected hashratio devices
388
	if (hashratio_send_pkgs(hashratio, &pkg))
389
		return;
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
390
391
	applog(LOG_DEBUG, "hashratio: Pool stratum message JOBS_ID: %s",
392
	       pool->swork.job_id);
393
	memset(pkg.data, 0, HRTO_P_DATA_LEN);
394
395
	job_id_len = strlen(pool->swork.job_id);
4559.2.30 by Con Kolivas
Fix stratum updates not being passed to hashratio devices and clean up
396
	crc = crc16((const unsigned char *)pool->swork.job_id, job_id_len);
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
397
	pkg.data[0] = (crc & 0xff00) >> 8;
398
	pkg.data[1] = crc & 0x00ff;
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
399
	hashratio_init_pkg(&pkg, HRTO_P_JOB_ID, 1, 1);
4559.2.32 by Con Kolivas
Handle disconnected hashratio devices
400
	if (hashratio_send_pkgs(hashratio, &pkg))
401
		return;
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
402
403
	a = pool->coinbase_len / HRTO_P_DATA_LEN;
404
	b = pool->coinbase_len % HRTO_P_DATA_LEN;
405
	applog(LOG_DEBUG, "pool->coinbase_len: %d", pool->coinbase_len);
406
	applog(LOG_DEBUG, "hashratio: Pool stratum message COINBASE: %d %d", a, b);
407
	for (i = 0; i < a; i++) {
408
		memcpy(pkg.data, pool->coinbase + i * 32, 32);
409
		hashratio_init_pkg(&pkg, HRTO_P_COINBASE, i + 1, a + (b ? 1 : 0));
4559.2.32 by Con Kolivas
Handle disconnected hashratio devices
410
		if (hashratio_send_pkgs(hashratio, &pkg))
411
			return;
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
412
		if (i % 25 == 0) {
413
			cgsleep_ms(2);
414
		}
415
	}
416
	if (b) {
417
		memset(pkg.data, 0, HRTO_P_DATA_LEN);
418
		memcpy(pkg.data, pool->coinbase + i * 32, b);
419
		hashratio_init_pkg(&pkg, HRTO_P_COINBASE, i + 1, i + 1);
4559.2.32 by Con Kolivas
Handle disconnected hashratio devices
420
		if (hashratio_send_pkgs(hashratio, &pkg))
421
			return;
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
422
	}
423
424
	b = pool->merkles;
425
	applog(LOG_DEBUG, "hashratio: Pool stratum message MERKLES: %d", b);
426
	for (i = 0; i < b; i++) {
427
		memset(pkg.data, 0, HRTO_P_DATA_LEN);
428
		memcpy(pkg.data, pool->swork.merkle_bin[i], 32);
429
		hashratio_init_pkg(&pkg, HRTO_P_MERKLES, i + 1, b);
4559.2.32 by Con Kolivas
Handle disconnected hashratio devices
430
		if (hashratio_send_pkgs(hashratio, &pkg))
431
			return;
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
432
	}
433
434
	applog(LOG_DEBUG, "hashratio: Pool stratum message HEADER: 4");
435
	for (i = 0; i < 4; i++) {
436
		memset(pkg.data, 0, HRTO_P_HEADER);
437
		memcpy(pkg.data, pool->header_bin + i * 32, 32);
438
		hashratio_init_pkg(&pkg, HRTO_P_HEADER, i + 1, 4);
4559.2.32 by Con Kolivas
Handle disconnected hashratio devices
439
		if (hashratio_send_pkgs(hashratio, &pkg))
440
			return;
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
441
442
	}
443
}
444
445
static int hashratio_get_result(struct thr_info *thr, struct hashratio_ret *ar)
446
{
447
	struct cgpu_info *hashratio = thr->cgpu;
448
	uint8_t result[HRTO_READ_SIZE];
449
	int ret;
450
451
	memset(result, 0, HRTO_READ_SIZE);
452
453
	ret = hashratio_gets(hashratio, result);
4559.2.32 by Con Kolivas
Handle disconnected hashratio devices
454
	if (ret != HRTO_GETS_OK)
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
455
		return ret;
456
457
//	if (opt_debug) {
458
//		applog(LOG_DEBUG, "hashratio: Get(ret = %d):", ret);
459
//		hexdump((uint8_t *)result, HRTO_READ_SIZE);
460
//	}
461
462
	return decode_pkg(thr, ar, result);
463
}
464
465
#define HASHRATIO_LATENCY 5
466
467
static void hashratio_initialise(struct cgpu_info *hashratio)
468
{
469
	int err, interface;
470
471
	if (hashratio->usbinfo.nodev)
472
		return;
473
474
	interface = usb_interface(hashratio);
475
	// Reset
476
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_RESET,
477
				FTDI_VALUE_RESET, interface, C_RESET);
478
479
	applog(LOG_DEBUG, "%s%i: reset got err %d",
480
		hashratio->drv->name, hashratio->device_id, err);
481
482
	if (hashratio->usbinfo.nodev)
483
		return;
484
485
	// Set latency
486
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_LATENCY,
487
			   HASHRATIO_LATENCY, interface, C_LATENCY);
488
489
	applog(LOG_DEBUG, "%s%i: latency got err %d",
490
		hashratio->drv->name, hashratio->device_id, err);
491
492
	if (hashratio->usbinfo.nodev)
493
		return;
494
495
	// Set data
496
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_DATA,
497
				FTDI_VALUE_DATA_AVA, interface, C_SETDATA);
498
499
	applog(LOG_DEBUG, "%s%i: data got err %d",
500
		hashratio->drv->name, hashratio->device_id, err);
4559.2.33 by Con Kolivas
Reinstate missing necessary init sequence for hashratio
501
502
	if (hashratio->usbinfo.nodev)
503
		return;
504
505
	// Set the baud
506
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_BAUD, FTDI_VALUE_BAUD_AVA,
507
				(FTDI_INDEX_BAUD_AVA & 0xff00) | interface,
508
				C_SETBAUD);
509
510
	applog(LOG_DEBUG, "%s%i: setbaud got err %d",
511
		hashratio->drv->name, hashratio->device_id, err);
512
513
	if (hashratio->usbinfo.nodev)
514
		return;
515
516
	// Set Modem Control
517
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_MODEM,
518
				FTDI_VALUE_MODEM, interface, C_SETMODEM);
519
520
	applog(LOG_DEBUG, "%s%i: setmodemctrl got err %d",
521
		hashratio->drv->name, hashratio->device_id, err);
522
523
	if (hashratio->usbinfo.nodev)
524
		return;
525
526
	// Set Flow Control
527
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_FLOW,
528
				FTDI_VALUE_FLOW, interface, C_SETFLOW);
529
530
	applog(LOG_DEBUG, "%s%i: setflowctrl got err %d",
531
		hashratio->drv->name, hashratio->device_id, err);
532
533
	if (hashratio->usbinfo.nodev)
534
		return;
535
536
	/* hashratio repeats the following */
537
	// Set Modem Control
538
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_MODEM,
539
				FTDI_VALUE_MODEM, interface, C_SETMODEM);
540
541
	applog(LOG_DEBUG, "%s%i: setmodemctrl 2 got err %d",
542
		hashratio->drv->name, hashratio->device_id, err);
543
544
	if (hashratio->usbinfo.nodev)
545
		return;
546
547
	// Set Flow Control
548
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_FLOW,
549
				FTDI_VALUE_FLOW, interface, C_SETFLOW);
550
551
	applog(LOG_DEBUG, "%s%i: setflowctrl 2 got err %d",
552
		hashratio->drv->name, hashratio->device_id, err);
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
553
}
554
555
static struct cgpu_info *hashratio_detect_one(struct libusb_device *dev, struct usb_find_devices *found)
556
{
557
	struct hashratio_info *info;
558
	int err, amount;
559
	int ackdetect;
560
	char mm_version[16];
561
562
	struct cgpu_info *hashratio = usb_alloc_cgpu(&hashratio_drv, 1);
563
	struct hashratio_pkg detect_pkg;
564
	struct hashratio_ret ret_pkg;
565
566
	if (!usb_init(hashratio, dev, found)) {
567
		applog(LOG_ERR, "Hashratio failed usb_init");
568
		hashratio = usb_free_cgpu(hashratio);
569
		return NULL;
570
	}
571
572
	hashratio_initialise(hashratio);
573
574
	strcpy(mm_version, "NONE");
575
	/* Send out detect pkg */
576
	memset(detect_pkg.data, 0, HRTO_P_DATA_LEN);
577
578
	hashratio_init_pkg(&detect_pkg, HRTO_P_DETECT, 1, 1);
579
	hashratio_send_pkg(hashratio, &detect_pkg);
580
	err = usb_read(hashratio, (char *)&ret_pkg, HRTO_READ_SIZE, &amount, C_HRO_READ);
581
	if (err || amount != HRTO_READ_SIZE) {
582
		applog(LOG_ERR, "%s %d: Hashratio failed usb_read with err %d amount %d",
583
		       hashratio->drv->name, hashratio->device_id, err, amount);
584
		usb_uninit(hashratio);
585
		usb_free_cgpu(hashratio);
586
		return NULL;
587
	}
588
589
	ackdetect = ret_pkg.type;
590
	applog(LOG_DEBUG, "hashratio Detect ID: %d", ackdetect);
591
	
592
	if (ackdetect != HRTO_P_ACKDETECT) {
593
		applog(LOG_DEBUG, "Not a hashratio device");
594
		usb_uninit(hashratio);
595
		usb_free_cgpu(hashratio);
596
		return NULL;
597
	}
598
599
	memcpy(mm_version, ret_pkg.data, 15);
600
	mm_version[15] = '\0';
601
602
	/* We have a real Hashratio! */
603
	hashratio->threads = HRTO_MINER_THREADS;
604
	add_cgpu(hashratio);
605
606
	update_usb_stats(hashratio);
607
608
	applog(LOG_INFO, "%s%d: Found at %s", hashratio->drv->name, hashratio->device_id,
609
	       hashratio->device_path);
610
4742 by Con Kolivas
Align_len in all alloc helper calls
611
	hashratio->device_data = cgcalloc(sizeof(struct hashratio_info), 1);
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
612
613
	info = hashratio->device_data;
614
615
	strcpy(info->mm_version, mm_version);
616
617
	info->fan_pwm  = HRTO_DEFAULT_FAN / 100 * HRTO_PWM_MAX;
618
	info->temp_max = 0;
619
	info->temp_history_index = 0;
620
	info->temp_sum = 0;
621
	info->temp_old = 0;
4648 by Con Kolivas
Fix segfault when writing config with hashratio built in
622
	info->default_freq = hashratio_freq;
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
623
624
	return hashratio;
625
}
626
627
static inline void hashratio_detect(bool __maybe_unused hotplug)
628
{
629
	usb_detect(&hashratio_drv, hashratio_detect_one);
630
}
631
632
static bool hashratio_prepare(struct thr_info *thr)
633
{
634
	struct cgpu_info *hashratio = thr->cgpu;
635
	struct hashratio_info *info = hashratio->device_data;
636
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
637
	cglock_init(&info->pool.data_lock);
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
638
639
	return true;
640
}
641
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
642
static void copy_pool_stratum(struct hashratio_info *info, struct pool *pool)
643
{
644
	int i;
645
	int merkles = pool->merkles;
646
	size_t coinbase_len = pool->coinbase_len;
647
	struct pool *pool_stratum = &info->pool;
648
4559.2.30 by Con Kolivas
Fix stratum updates not being passed to hashratio devices and clean up
649
	if (!job_idcmp((uint8_t *)pool->swork.job_id, pool_stratum->swork.job_id))
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
650
		return;
651
652
	cg_wlock(&(pool_stratum->data_lock));
653
	free(pool_stratum->swork.job_id);
654
	free(pool_stratum->nonce1);
655
	free(pool_stratum->coinbase);
656
4742 by Con Kolivas
Align_len in all alloc helper calls
657
	pool_stratum->coinbase = cgcalloc(coinbase_len, 1);
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
658
	memcpy(pool_stratum->coinbase, pool->coinbase, coinbase_len);
659
660
	for (i = 0; i < pool_stratum->merkles; i++)
661
		free(pool_stratum->swork.merkle_bin[i]);
662
	if (merkles) {
4742 by Con Kolivas
Align_len in all alloc helper calls
663
		pool_stratum->swork.merkle_bin = cgrealloc(pool_stratum->swork.merkle_bin,
664
							   sizeof(char *) * merkles + 1);
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
665
		for (i = 0; i < merkles; i++) {
4742 by Con Kolivas
Align_len in all alloc helper calls
666
			pool_stratum->swork.merkle_bin[i] = cgmalloc(32);
4559.2.29 by Con Kolivas
Move to updated avalon2 type driver model for hashratio device
667
			memcpy(pool_stratum->swork.merkle_bin[i], pool->swork.merkle_bin[i], 32);
668
		}
669
	}
670
671
	pool_stratum->sdiff = pool->sdiff;
672
	pool_stratum->coinbase_len = pool->coinbase_len;
673
	pool_stratum->nonce2_offset = pool->nonce2_offset;
674
	pool_stratum->n2size = pool->n2size;
675
	pool_stratum->merkles = pool->merkles;
676
677
	pool_stratum->swork.job_id = strdup(pool->swork.job_id);
678
	pool_stratum->nonce1 = strdup(pool->nonce1);
679
680
	memcpy(pool_stratum->ntime, pool->ntime, sizeof(pool_stratum->ntime));
681
	memcpy(pool_stratum->header_bin, pool->header_bin, sizeof(pool_stratum->header_bin));
682
	cg_wunlock(&(pool_stratum->data_lock));
683
}
684
4559.2.30 by Con Kolivas
Fix stratum updates not being passed to hashratio devices and clean up
685
static void hashratio_update_work(struct cgpu_info *hashratio)
686
{
687
	struct hashratio_info *info = hashratio->device_data;
688
	struct thr_info *thr = hashratio->thr[0];
689
	struct hashratio_pkg send_pkg;
690
	uint32_t tmp, range, start;
691
	struct work *work;
692
	struct pool *pool;
693
694
	applog(LOG_DEBUG, "hashratio: New stratum: restart: %d, update: %d",
695
		thr->work_restart, thr->work_update);
696
	thr->work_update = false;
697
	thr->work_restart = false;
698
699
	work = get_work(thr, thr->id); /* Make sure pool is ready */
700
	discard_work(work); /* Don't leak memory */
701
702
	pool = current_pool();
703
	if (!pool->has_stratum)
704
		quit(1, "hashratio: Miner Manager have to use stratum pool");
705
	if (pool->coinbase_len > HRTO_P_COINBASE_SIZE)
706
		quit(1, "hashratio: Miner Manager pool coinbase length have to less then %d", HRTO_P_COINBASE_SIZE);
707
	if (pool->merkles > HRTO_P_MERKLES_COUNT)
708
		quit(1, "hashratio: Miner Manager merkles have to less then %d", HRTO_P_MERKLES_COUNT);
709
710
	info->pool_no = pool->pool_no;
711
712
	cgtime(&info->last_stratum);
713
	cg_rlock(&pool->data_lock);
714
	info->pool_no = pool->pool_no;
715
	copy_pool_stratum(info, pool);
716
	hashratio_stratum_pkgs(hashratio, pool);
717
	cg_runlock(&pool->data_lock);
718
4600 by Con Kolivas
Don't set default fan to max on hashratio
719
	/* Configure the parameter from outside */
4559.2.30 by Con Kolivas
Fix stratum updates not being passed to hashratio devices and clean up
720
	memset(send_pkg.data, 0, HRTO_P_DATA_LEN);
721
4600 by Con Kolivas
Don't set default fan to max on hashratio
722
	// fan. We're not measuring temperature so set a safe but not max value
723
	info->fan_pwm = HRTO_PWM_MAX * 2 / 3;
4559.2.30 by Con Kolivas
Fix stratum updates not being passed to hashratio devices and clean up
724
	tmp = be32toh(info->fan_pwm);
725
	memcpy(send_pkg.data, &tmp, 4);
726
727
	// freq
728
	tmp = be32toh(info->default_freq);
729
	memcpy(send_pkg.data + 4, &tmp, 4);
730
	applog(LOG_DEBUG, "set freq: %d", info->default_freq);
731
732
	/* Configure the nonce2 offset and range */
4559.2.49 by Con Kolivas
Fix stratum embedded fpgas to not duplicate work with other devices
733
	range = 0xffffffff / (total_devices + 1);
734
	start = range * (hashratio->device_id + 1);
4559.2.30 by Con Kolivas
Fix stratum updates not being passed to hashratio devices and clean up
735
736
	tmp = be32toh(start);
737
	memcpy(send_pkg.data + 8, &tmp, 4);
738
739
	tmp = be32toh(range);
740
	memcpy(send_pkg.data + 12, &tmp, 4);
741
742
	/* Package the data */
743
	hashratio_init_pkg(&send_pkg, HRTO_P_SET, 1, 1);
4559.2.32 by Con Kolivas
Handle disconnected hashratio devices
744
	hashratio_send_pkgs(hashratio, &send_pkg);
4559.2.30 by Con Kolivas
Fix stratum updates not being passed to hashratio devices and clean up
745
}
746
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
747
static int64_t hashratio_scanhash(struct thr_info *thr)
748
{
749
	struct cgpu_info *hashratio = thr->cgpu;
750
	struct hashratio_info *info = hashratio->device_data;
4559.2.30 by Con Kolivas
Fix stratum updates not being passed to hashratio devices and clean up
751
	struct hashratio_pkg send_pkg;
752
	struct hashratio_ret ar;
753
754
	memset(send_pkg.data, 0, HRTO_P_DATA_LEN);
755
	hashratio_init_pkg(&send_pkg, HRTO_P_POLLING, 1, 1);
756
4559.2.32 by Con Kolivas
Handle disconnected hashratio devices
757
	if (unlikely(hashratio->usbinfo.nodev || hashratio_send_pkgs(hashratio, &send_pkg))) {
758
		applog(LOG_ERR, "%s%d: Device disappeared, shutting down thread",
759
		       hashratio->drv->name, hashratio->device_id);
760
		return -1;
761
	}
4559.2.30 by Con Kolivas
Fix stratum updates not being passed to hashratio devices and clean up
762
	hashratio_get_result(thr, &ar);
763
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
764
	return (int64_t)info->local_work * 64 * 0xffffffff;
765
}
766
767
static struct api_data *hashratio_api_stats(struct cgpu_info *cgpu)
768
{
769
	struct api_data *root = NULL;
770
	struct hashratio_info *info = cgpu->device_data;
771
	char buf[24];
772
	char buf2[256];
773
	double hwp;
774
	int i;
775
776
	// mm version
777
	sprintf(buf, "MM Version");
778
	root = api_add_string(root, buf, info->mm_version, false);
779
	
780
	// asic freq
781
	sprintf(buf, "Asic Freq (MHz)");
782
	root = api_add_int(root, buf, &(info->default_freq), false);
783
	
784
	// match work count
785
	for (i = 0; i < HRTO_DEFAULT_MODULARS; i++) {
786
		sprintf(buf, "Match work Modular %02d", i + 1);
787
		memset(buf2, 0, sizeof(buf2));
788
		snprintf(buf2, sizeof(buf2),
789
				 "%02d:%08d %02d:%08d %02d:%08d %02d:%08d "
790
				 "%02d:%08d %02d:%08d %02d:%08d %02d:%08d "
791
				 "%02d:%08d %02d:%08d %02d:%08d %02d:%08d "
792
				 "%02d:%08d %02d:%08d %02d:%08d %02d:%08d",
793
				i*16 + 1, info->matching_work[i*16 + 0],
794
				i*16 + 2, info->matching_work[i*16 + 1],
795
				i*16 + 3, info->matching_work[i*16 + 2],
796
				i*16 + 4, info->matching_work[i*16 + 3],
797
				i*16 + 5, info->matching_work[i*16 + 4],
798
				i*16 + 6, info->matching_work[i*16 + 5],
799
				i*16 + 7, info->matching_work[i*16 + 6],
800
				i*16 + 8, info->matching_work[i*16 + 7],
801
				i*16 + 9, info->matching_work[i*16 + 8],
802
				i*16 + 10, info->matching_work[i*16 + 9],
803
				i*16 + 11, info->matching_work[i*16 + 10],
804
				i*16 + 12, info->matching_work[i*16 + 11],
805
				i*16 + 13, info->matching_work[i*16 + 12],
806
				i*16 + 14, info->matching_work[i*16 + 13],
807
				i*16 + 15, info->matching_work[i*16 + 14],
808
				i*16 + 16, info->matching_work[i*16 + 15]);
809
		root = api_add_string(root, buf, buf2, true);
810
	}
811
	
812
	// local works
813
	sprintf(buf, "Local works");
814
	root = api_add_int(root, buf, &(info->local_works), false);
815
	
816
	// hardware error works
817
	sprintf(buf, "Hardware error works");
818
	root = api_add_int(root, buf, &(info->hw_works), false);
819
	
820
	// device hardware error %
821
	hwp = info->local_works ? ((double)info->hw_works / (double)info->local_works) : 0;
822
	sprintf(buf, "Device hardware error%%");
823
	root = api_add_percent(root, buf, &hwp, true);
824
	
825
	// Temperature
826
	sprintf(buf, "Temperature");
827
	root = api_add_int(root, buf, &(info->temp), false);
828
829
	// Fan
830
	for (i = 0; i < HRTO_FAN_COUNT; i++) {
831
		sprintf(buf, "Fan%d", i+1);
832
		root = api_add_int(root, buf, &(info->fan[i]), false);
833
	}
834
835
	return root;
836
}
837
838
static void hashratio_shutdown(struct thr_info __maybe_unused *thr)
839
{
840
}
841
842
struct device_drv hashratio_drv = {
843
	.drv_id = DRIVER_hashratio,
844
	.dname = "hashratio",
4559.2.35 by Con Kolivas
Fix hashratio device name
845
	.name = "HRO",
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
846
	.get_api_stats   = hashratio_api_stats,
847
	.drv_detect      = hashratio_detect,
848
	.thread_prepare  = hashratio_prepare,
849
	.hash_work       = hash_driver_work,
850
	.scanwork        = hashratio_scanhash,
4559.2.30 by Con Kolivas
Fix stratum updates not being passed to hashratio devices and clean up
851
	.flush_work      = hashratio_update_work,
852
	.update_work     = hashratio_update_work,
4559.2.28 by Con Kolivas
Initial import and conversion of hashratio driver to direct USB
853
	.thread_shutdown = hashratio_shutdown,
854
};