From ef62b281970e00c321872498b3eccf60e2926a81 Mon Sep 17 00:00:00 2001 From: Kano Date: Sun, 29 Sep 2013 17:14:10 +1000 Subject: [PATCH 1/2] Icarus - CMR shouldn't wait the full timeout due to handle sharing --- driver-icarus.c | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/driver-icarus.c b/driver-icarus.c index a42988bb..9ad4e43a 100644 --- a/driver-icarus.c +++ b/driver-icarus.c @@ -74,6 +74,7 @@ ASSERT1(sizeof(uint32_t) == 4); // USB ms timeout to wait - user specified timeouts are multiples of this #define ICARUS_WAIT_TIMEOUT 100 +#define ICARUS_CMR2_TIMEOUT 1 // Defined in multiples of ICARUS_WAIT_TIMEOUT // Must of course be greater than ICARUS_READ_COUNT_TIMING/ICARUS_WAIT_TIMEOUT @@ -186,6 +187,8 @@ struct ICARUS_INFO { struct ICARUS_HISTORY history[INFO_HISTORY+1]; uint32_t min_data_count; + int timeout; + // seconds per Hash double Hs; // ms til we abort @@ -434,7 +437,7 @@ static int icarus_get_nonce(struct cgpu_info *icarus, unsigned char *buf, struct struct ICARUS_INFO *info = (struct ICARUS_INFO *)(icarus->device_data); struct timeval read_start, read_finish; int err, amt; - int rc = 0; + int rc = 0, delay; int read_amount = ICARUS_READ_SIZE; bool first = true; @@ -446,7 +449,7 @@ static int icarus_get_nonce(struct cgpu_info *icarus, unsigned char *buf, struct cgtime(&read_start); err = usb_read_ii_timeout(icarus, info->intinfo, (char *)buf, read_amount, &amt, - ICARUS_WAIT_TIMEOUT, C_GETRESULTS); + info->timeout, C_GETRESULTS); cgtime(&read_finish); if (err < 0 && err != LIBUSB_ERROR_TIMEOUT) { applog(LOG_ERR, "%s%i: Comms error (rerr=%d amt=%d)", @@ -483,6 +486,21 @@ static int icarus_get_nonce(struct cgpu_info *icarus, unsigned char *buf, struct read_amount -= amt; first = false; } + + if (info->timeout < ICARUS_WAIT_TIMEOUT) { + delay = ICARUS_WAIT_TIMEOUT - rc; + if (delay > 0) { + cgsleep_ms(delay); + + if (thr && thr->work_restart) { + if (opt_debug) { + applog(LOG_DEBUG, + "Icarus Read: Work restart at %d ms", rc); + } + return ICA_NONCE_RESTART; + } + } + } } } @@ -796,6 +814,7 @@ static bool icarus_detect_one(struct libusb_device *dev, struct usb_find_devices int baud, uninitialised_var(work_division), uninitialised_var(fpga_count); struct cgpu_info *icarus; int ret, err, amount, tries; + enum sub_ident ident; bool ok; icarus = usb_alloc_cgpu(&icarus_drv, 1); @@ -814,6 +833,23 @@ static bool icarus_detect_one(struct libusb_device *dev, struct usb_find_devices quit(1, "Failed to malloc ICARUS_INFO"); icarus->device_data = (void *)info; + ident = usb_ident(icarus); + switch (ident) { + case IDENT_ICA: + case IDENT_BLT: + case IDENT_LLT: + case IDENT_AMU: + case IDENT_CMR1: + info->timeout = ICARUS_WAIT_TIMEOUT; + break; + case IDENT_CMR2: + info->timeout = ICARUS_CMR2_TIMEOUT; + break; + default: + quit(1, "%s icarus_detect_one() invalid %s ident=%d", + icarus->drv->dname, icarus->drv->dname, ident); + } + tries = 2; ok = false; while (!ok && tries-- > 0) { From c7fb4aad787911e3e2b9b57df6b7551a2e9c4305 Mon Sep 17 00:00:00 2001 From: Kano Date: Sun, 29 Sep 2013 17:21:32 +1000 Subject: [PATCH 2/2] Icarus remove unneeded opt_debug tests due to applog being a macro --- driver-icarus.c | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/driver-icarus.c b/driver-icarus.c index 9ad4e43a..6ac1a0bf 100644 --- a/driver-icarus.c +++ b/driver-icarus.c @@ -474,10 +474,7 @@ static int icarus_get_nonce(struct cgpu_info *icarus, unsigned char *buf, struct } if (thr && thr->work_restart) { - if (opt_debug) { - applog(LOG_DEBUG, - "Icarus Read: Work restart at %d ms", rc); - } + applog(LOG_DEBUG, "Icarus Read: Work restart at %d ms", rc); return ICA_NONCE_RESTART; } @@ -493,10 +490,7 @@ static int icarus_get_nonce(struct cgpu_info *icarus, unsigned char *buf, struct cgsleep_ms(delay); if (thr && thr->work_restart) { - if (opt_debug) { - applog(LOG_DEBUG, - "Icarus Read: Work restart at %d ms", rc); - } + applog(LOG_DEBUG, "Icarus Read: Work restart at %d ms", rc); return ICA_NONCE_RESTART; } } @@ -1055,12 +1049,10 @@ static int64_t icarus_scanhash(struct thr_info *thr, struct work *work, if (unlikely(estimate_hashes > 0xffffffff)) estimate_hashes = 0xffffffff; - if (opt_debug) { - applog(LOG_DEBUG, "%s%d: no nonce = 0x%08lX hashes (%ld.%06lds)", - icarus->drv->name, icarus->device_id, - (long unsigned int)estimate_hashes, - elapsed.tv_sec, elapsed.tv_usec); - } + applog(LOG_DEBUG, "%s%d: no nonce = 0x%08lX hashes (%ld.%06lds)", + icarus->drv->name, icarus->device_id, + (long unsigned int)estimate_hashes, + elapsed.tv_sec, elapsed.tv_usec); return estimate_hashes; } @@ -1092,12 +1084,10 @@ static int64_t icarus_scanhash(struct thr_info *thr, struct work *work, if (opt_debug || info->do_icarus_timing) timersub(&tv_finish, &tv_start, &elapsed); - if (opt_debug) { - applog(LOG_DEBUG, "%s%d: nonce = 0x%08x = 0x%08lX hashes (%ld.%06lds)", - icarus->drv->name, icarus->device_id, - nonce, (long unsigned int)hash_count, - elapsed.tv_sec, elapsed.tv_usec); - } + applog(LOG_DEBUG, "%s%d: nonce = 0x%08x = 0x%08lX hashes (%ld.%06lds)", + icarus->drv->name, icarus->device_id, + nonce, (long unsigned int)hash_count, + elapsed.tv_sec, elapsed.tv_usec); // Ignore possible end condition values ... and hw errors // TODO: set limitations on calculated values depending on the device