|
|
@ -216,36 +216,6 @@ static void avalon_decode_nonce(struct thr_info *thr, struct cgpu_info *avalon, |
|
|
|
submit_nonce(thr, work, nonce); |
|
|
|
submit_nonce(thr, work, nonce); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int avalon_write(int fd, char *buf, ssize_t len) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
ssize_t wrote = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (len > 0) { |
|
|
|
|
|
|
|
struct timeval timeout; |
|
|
|
|
|
|
|
ssize_t ret; |
|
|
|
|
|
|
|
fd_set wd; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
timeout.tv_sec = 0; |
|
|
|
|
|
|
|
timeout.tv_usec = 100000; |
|
|
|
|
|
|
|
FD_ZERO(&wd); |
|
|
|
|
|
|
|
FD_SET((SOCKETTYPE)fd, &wd); |
|
|
|
|
|
|
|
ret = select(fd + 1, NULL, &wd, NULL, &timeout); |
|
|
|
|
|
|
|
if (unlikely(ret < 1)) { |
|
|
|
|
|
|
|
applog(LOG_WARNING, "Select error on avalon_write"); |
|
|
|
|
|
|
|
return AVA_SEND_ERROR; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
ret = write(fd, buf + wrote, len); |
|
|
|
|
|
|
|
if (unlikely(ret < 1)) { |
|
|
|
|
|
|
|
applog(LOG_WARNING, "Write error on avalon_write"); |
|
|
|
|
|
|
|
return AVA_SEND_ERROR; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
wrote += ret; |
|
|
|
|
|
|
|
len -= ret; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int avalon_read(int fd, char *buf, ssize_t len) |
|
|
|
static int avalon_read(int fd, char *buf, ssize_t len) |
|
|
|
{ |
|
|
|
{ |
|
|
|
ssize_t aread = 0; |
|
|
|
ssize_t aread = 0; |
|
|
@ -279,13 +249,20 @@ static int avalon_read(int fd, char *buf, ssize_t len) |
|
|
|
static int avalon_reset(struct cgpu_info *avalon, int fd) |
|
|
|
static int avalon_reset(struct cgpu_info *avalon, int fd) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct avalon_result ar; |
|
|
|
struct avalon_result ar; |
|
|
|
char reset = 0xad; |
|
|
|
struct avalon_task at; |
|
|
|
uint8_t *buf; |
|
|
|
uint8_t *buf; |
|
|
|
int ret, i = 0; |
|
|
|
int ret, i = 0; |
|
|
|
struct timespec p; |
|
|
|
struct timespec p; |
|
|
|
|
|
|
|
|
|
|
|
/* Send reset, then check for result */ |
|
|
|
/* Send reset, then check for result */ |
|
|
|
ret = avalon_write(fd, &reset, 1); |
|
|
|
avalon_init_task(&at, 1, 0, |
|
|
|
|
|
|
|
AVALON_DEFAULT_FAN_MAX_PWM, |
|
|
|
|
|
|
|
AVALON_DEFAULT_TIMEOUT, |
|
|
|
|
|
|
|
AVALON_DEFAULT_ASIC_NUM, |
|
|
|
|
|
|
|
AVALON_DEFAULT_MINER_NUM, |
|
|
|
|
|
|
|
0, 0, |
|
|
|
|
|
|
|
AVALON_DEFAULT_FREQUENCY); |
|
|
|
|
|
|
|
ret = avalon_send_task(fd, &at, NULL); |
|
|
|
if (unlikely(ret == AVA_SEND_ERROR)) |
|
|
|
if (unlikely(ret == AVA_SEND_ERROR)) |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
|
|