|
@@ -219,6 +219,18 @@ struct ICARUS_INFO {
|
|
|
bool initialised;
|
|
bool initialised;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+#define ICARUS_MIDSTATE_SIZE 32
|
|
|
|
|
+#define ICARUS_UNUSED_SIZE 20
|
|
|
|
|
+#define ICARUS_WORK_SIZE 12
|
|
|
|
|
+
|
|
|
|
|
+#define ICARUS_WORK_DATA_OFFSET 64
|
|
|
|
|
+
|
|
|
|
|
+struct ICARUS_WORK {
|
|
|
|
|
+ uint8_t midstate[ICARUS_MIDSTATE_SIZE];
|
|
|
|
|
+ uint8_t unused[ICARUS_UNUSED_SIZE];
|
|
|
|
|
+ uint8_t work[ICARUS_WORK_SIZE];
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
#define END_CONDITION 0x0000ffff
|
|
#define END_CONDITION 0x0000ffff
|
|
|
|
|
|
|
|
// Looking for options in --icarus-timing and --icarus-options:
|
|
// Looking for options in --icarus-timing and --icarus-options:
|
|
@@ -803,7 +815,8 @@ static bool icarus_detect_one(struct libusb_device *dev, struct usb_find_devices
|
|
|
|
|
|
|
|
const char golden_nonce[] = "000187a2";
|
|
const char golden_nonce[] = "000187a2";
|
|
|
const uint32_t golden_nonce_val = 0x000187a2;
|
|
const uint32_t golden_nonce_val = 0x000187a2;
|
|
|
- unsigned char ob_bin[64], nonce_bin[ICARUS_READ_SIZE];
|
|
|
|
|
|
|
+ unsigned char nonce_bin[ICARUS_READ_SIZE];
|
|
|
|
|
+ struct ICARUS_WORK workdata;
|
|
|
char *nonce_hex;
|
|
char *nonce_hex;
|
|
|
int baud, uninitialised_var(work_division), uninitialised_var(fpga_count);
|
|
int baud, uninitialised_var(work_division), uninitialised_var(fpga_count);
|
|
|
struct cgpu_info *icarus;
|
|
struct cgpu_info *icarus;
|
|
@@ -811,6 +824,9 @@ static bool icarus_detect_one(struct libusb_device *dev, struct usb_find_devices
|
|
|
enum sub_ident ident;
|
|
enum sub_ident ident;
|
|
|
bool ok;
|
|
bool ok;
|
|
|
|
|
|
|
|
|
|
+ if ((sizeof(workdata) << 1) != (sizeof(golden_ob) - 1))
|
|
|
|
|
+ quithere(1, "Data and golden_ob sizes don't match");
|
|
|
|
|
+
|
|
|
icarus = usb_alloc_cgpu(&icarus_drv, 1);
|
|
icarus = usb_alloc_cgpu(&icarus_drv, 1);
|
|
|
|
|
|
|
|
if (!usb_init(icarus, dev, found))
|
|
if (!usb_init(icarus, dev, found))
|
|
@@ -820,7 +836,7 @@ static bool icarus_detect_one(struct libusb_device *dev, struct usb_find_devices
|
|
|
|
|
|
|
|
get_options(this_option_offset, icarus, &baud, &work_division, &fpga_count);
|
|
get_options(this_option_offset, icarus, &baud, &work_division, &fpga_count);
|
|
|
|
|
|
|
|
- hex2bin(ob_bin, golden_ob, sizeof(ob_bin));
|
|
|
|
|
|
|
+ hex2bin((void *)(&workdata), golden_ob, sizeof(workdata));
|
|
|
|
|
|
|
|
info = (struct ICARUS_INFO *)calloc(1, sizeof(struct ICARUS_INFO));
|
|
info = (struct ICARUS_INFO *)calloc(1, sizeof(struct ICARUS_INFO));
|
|
|
if (unlikely(!info))
|
|
if (unlikely(!info))
|
|
@@ -849,9 +865,9 @@ static bool icarus_detect_one(struct libusb_device *dev, struct usb_find_devices
|
|
|
while (!ok && tries-- > 0) {
|
|
while (!ok && tries-- > 0) {
|
|
|
icarus_initialise(icarus, baud);
|
|
icarus_initialise(icarus, baud);
|
|
|
|
|
|
|
|
- err = usb_write(icarus, (char *)ob_bin, sizeof(ob_bin), &amount, C_SENDTESTWORK);
|
|
|
|
|
|
|
+ err = usb_write(icarus, (void *)(&workdata), sizeof(workdata), &amount, C_SENDTESTWORK);
|
|
|
|
|
|
|
|
- if (err != LIBUSB_SUCCESS || amount != sizeof(ob_bin))
|
|
|
|
|
|
|
+ if (err != LIBUSB_SUCCESS || amount != sizeof(workdata))
|
|
|
continue;
|
|
continue;
|
|
|
|
|
|
|
|
memset(nonce_bin, 0, sizeof(nonce_bin));
|
|
memset(nonce_bin, 0, sizeof(nonce_bin));
|
|
@@ -974,7 +990,8 @@ static int64_t icarus_scanhash(struct thr_info *thr, struct work *work,
|
|
|
struct cgpu_info *icarus = thr->cgpu;
|
|
struct cgpu_info *icarus = thr->cgpu;
|
|
|
struct ICARUS_INFO *info = (struct ICARUS_INFO *)(icarus->device_data);
|
|
struct ICARUS_INFO *info = (struct ICARUS_INFO *)(icarus->device_data);
|
|
|
int ret, err, amount;
|
|
int ret, err, amount;
|
|
|
- unsigned char ob_bin[64], nonce_bin[ICARUS_READ_SIZE];
|
|
|
|
|
|
|
+ unsigned char nonce_bin[ICARUS_READ_SIZE];
|
|
|
|
|
+ struct ICARUS_WORK workdata;
|
|
|
char *ob_hex;
|
|
char *ob_hex;
|
|
|
uint32_t nonce;
|
|
uint32_t nonce;
|
|
|
int64_t hash_count;
|
|
int64_t hash_count;
|
|
@@ -1002,17 +1019,17 @@ static int64_t icarus_scanhash(struct thr_info *thr, struct work *work,
|
|
|
|
|
|
|
|
elapsed.tv_sec = elapsed.tv_usec = 0;
|
|
elapsed.tv_sec = elapsed.tv_usec = 0;
|
|
|
|
|
|
|
|
- memset(ob_bin, 0, sizeof(ob_bin));
|
|
|
|
|
- memcpy(ob_bin, work->midstate, 32);
|
|
|
|
|
- memcpy(ob_bin + 52, work->data + 64, 12);
|
|
|
|
|
- rev(ob_bin, 32);
|
|
|
|
|
- rev(ob_bin + 52, 12);
|
|
|
|
|
|
|
+ memset((void *)(&workdata), 0, sizeof(workdata));
|
|
|
|
|
+ memcpy(&(workdata.midstate), work->midstate, ICARUS_MIDSTATE_SIZE);
|
|
|
|
|
+ memcpy(&(workdata.work), work->data + ICARUS_WORK_DATA_OFFSET, ICARUS_WORK_SIZE);
|
|
|
|
|
+ rev((void *)(&(workdata.midstate)), ICARUS_MIDSTATE_SIZE);
|
|
|
|
|
+ rev((void *)(&(workdata.work)), ICARUS_WORK_SIZE);
|
|
|
|
|
|
|
|
// We only want results for the work we are about to send
|
|
// We only want results for the work we are about to send
|
|
|
usb_buffer_clear(icarus);
|
|
usb_buffer_clear(icarus);
|
|
|
|
|
|
|
|
- err = usb_write_ii(icarus, info->intinfo, (char *)ob_bin, sizeof(ob_bin), &amount, C_SENDWORK);
|
|
|
|
|
- if (err < 0 || amount != sizeof(ob_bin)) {
|
|
|
|
|
|
|
+ err = usb_write_ii(icarus, info->intinfo, (char *)(&workdata), sizeof(workdata), &amount, C_SENDWORK);
|
|
|
|
|
+ if (err < 0 || amount != sizeof(workdata)) {
|
|
|
applog(LOG_ERR, "%s%i: Comms error (werr=%d amt=%d)",
|
|
applog(LOG_ERR, "%s%i: Comms error (werr=%d amt=%d)",
|
|
|
icarus->drv->name, icarus->device_id, err, amount);
|
|
icarus->drv->name, icarus->device_id, err, amount);
|
|
|
dev_error(icarus, REASON_DEV_COMMS_ERROR);
|
|
dev_error(icarus, REASON_DEV_COMMS_ERROR);
|
|
@@ -1021,7 +1038,7 @@ static int64_t icarus_scanhash(struct thr_info *thr, struct work *work,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (opt_debug) {
|
|
if (opt_debug) {
|
|
|
- ob_hex = bin2hex(ob_bin, sizeof(ob_bin));
|
|
|
|
|
|
|
+ ob_hex = bin2hex((void *)(&workdata), sizeof(workdata));
|
|
|
applog(LOG_DEBUG, "%s%d: sent %s",
|
|
applog(LOG_DEBUG, "%s%d: sent %s",
|
|
|
icarus->drv->name, icarus->device_id, ob_hex);
|
|
icarus->drv->name, icarus->device_id, ob_hex);
|
|
|
free(ob_hex);
|
|
free(ob_hex);
|