|
|
@@ -142,13 +142,12 @@ static int avalon_write(struct cgpu_info *avalon, char *buf, ssize_t len, int ep
|
|
|
return AVA_SEND_OK;
|
|
|
}
|
|
|
|
|
|
-static int avalon_send_task(const struct avalon_task *at, struct cgpu_info *avalon)
|
|
|
+static int avalon_send_task(const struct avalon_task *at, struct cgpu_info *avalon,
|
|
|
+ struct avalon_info *info)
|
|
|
|
|
|
{
|
|
|
uint8_t buf[AVALON_WRITE_SIZE + 4 * AVALON_DEFAULT_ASIC_NUM];
|
|
|
int delay, ret, i, ep = C_AVALON_TASK;
|
|
|
- struct avalon_info *info;
|
|
|
- cgtimer_t ts_start;
|
|
|
uint32_t nonce_range;
|
|
|
size_t nr_len;
|
|
|
|
|
|
@@ -189,7 +188,6 @@ static int avalon_send_task(const struct avalon_task *at, struct cgpu_info *aval
|
|
|
tt |= ((buf[4] & 0x80) ? (1 << 0) : 0);
|
|
|
buf[4] = tt;
|
|
|
#endif
|
|
|
- info = avalon->device_data;
|
|
|
delay = nr_len * 10 * 1000000;
|
|
|
delay = delay / info->baud;
|
|
|
delay += 4000;
|
|
|
@@ -202,11 +200,14 @@ static int avalon_send_task(const struct avalon_task *at, struct cgpu_info *aval
|
|
|
applog(LOG_DEBUG, "Avalon: Sent(%u):", (unsigned int)nr_len);
|
|
|
hexdump(buf, nr_len);
|
|
|
}
|
|
|
- cgsleep_prepare_r(&ts_start);
|
|
|
+ /* Sleep from the last time we sent data */
|
|
|
+ cgsleep_us_r(&info->cgsent, info->send_delay);
|
|
|
+
|
|
|
+ cgsleep_prepare_r(&info->cgsent);
|
|
|
ret = avalon_write(avalon, (char *)buf, nr_len, ep);
|
|
|
- cgsleep_us_r(&ts_start, delay);
|
|
|
|
|
|
- applog(LOG_DEBUG, "Avalon: Sent: Buffer delay: %dus", delay);
|
|
|
+ applog(LOG_DEBUG, "Avalon: Sent: Buffer delay: %dus", info->send_delay);
|
|
|
+ info->send_delay = delay;
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
@@ -319,7 +320,7 @@ static int avalon_reset(struct cgpu_info *avalon, bool initial)
|
|
|
AVALON_DEFAULT_FREQUENCY);
|
|
|
|
|
|
wait_avalon_ready(avalon);
|
|
|
- ret = avalon_send_task(&at, avalon);
|
|
|
+ ret = avalon_send_task(&at, avalon, info);
|
|
|
if (unlikely(ret == AVA_SEND_ERROR))
|
|
|
return -1;
|
|
|
|
|
|
@@ -560,7 +561,7 @@ static void avalon_idle(struct cgpu_info *avalon, struct avalon_info *info)
|
|
|
avalon_init_task(&at, 0, 0, info->fan_pwm, info->timeout,
|
|
|
info->asic_count, info->miner_count, 1, 1,
|
|
|
info->frequency);
|
|
|
- avalon_send_task(&at, avalon);
|
|
|
+ avalon_send_task(&at, avalon, info);
|
|
|
}
|
|
|
applog(LOG_WARNING, "%s%i: Idling %d miners", avalon->drv->name, avalon->device_id, i);
|
|
|
wait_avalon_ready(avalon);
|
|
|
@@ -1148,7 +1149,7 @@ static void *avalon_send_tasks(void *userdata)
|
|
|
avalon_reset_auto(info);
|
|
|
}
|
|
|
|
|
|
- ret = avalon_send_task(&at, avalon);
|
|
|
+ ret = avalon_send_task(&at, avalon, info);
|
|
|
|
|
|
if (unlikely(ret == AVA_SEND_ERROR)) {
|
|
|
/* Send errors are fatal */
|