From 812852cc364a58dfd85082a46155b946b8002db1 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Fri, 9 Aug 2013 06:31:57 +1000 Subject: [PATCH] Move bflsc defines to a header file. --- Makefile.am | 2 +- cgminer.c | 4 + driver-bflsc.c | 345 +---------------------------------------------- driver-bflsc.h | 356 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 362 insertions(+), 345 deletions(-) create mode 100644 driver-bflsc.h diff --git a/Makefile.am b/Makefile.am index b9487ee4..c53738aa 100644 --- a/Makefile.am +++ b/Makefile.am @@ -67,7 +67,7 @@ cgminer_SOURCES += usbutils.c endif if HAS_BFLSC -cgminer_SOURCES += driver-bflsc.c +cgminer_SOURCES += driver-bflsc.c driver-bflsc.h endif if HAS_BITFORCE diff --git a/cgminer.c b/cgminer.c index 9de859fd..f6b2ccc0 100644 --- a/cgminer.c +++ b/cgminer.c @@ -56,6 +56,10 @@ #include "driver-avalon.h" #endif +#ifdef USE_BFLSC +#include "driver-bflsc.h" +#endif + #if defined(unix) || defined(__APPLE__) #include #include diff --git a/driver-bflsc.c b/driver-bflsc.c index 07ffdc33..5fe68a08 100644 --- a/driver-bflsc.c +++ b/driver-bflsc.c @@ -26,350 +26,7 @@ #include "compat.h" #include "miner.h" #include "usbutils.h" - -#define BLANK "" -#define LFSTR "" - -/* - * Firmware - * DRV_V2 expects (beyond V1) the GetInfo to return the chip count - * The queues are 40 instead of 20 and are *usually* consumed and filled - * in bursts due to e.g. a 16 chip device doing 16 items at a time and - * returning 16 results at a time - * If the device has varying chip speeds, it will gradually break up the - * burst of results as we progress - */ -enum driver_version { - BFLSC_DRVUNDEF = 0, - BFLSC_DRV1, - BFLSC_DRV2 -}; - -/* - * With Firmware 1.0.0 and a result queue of 20 the Max is: - * inprocess = 12 - * max count = 9 - * 64+1+24+1+1+(1+8)*8+1 per line = 164 * 20 - * OK = 3 - * Total: 3304 - * - * With Firmware 1.2.* and a result queue of 40 but a limit of 15 replies: - * inprocess = 12 - * max count = 9 - * 64+1+24+1+1+1+1+(1+8)*8+1 per line = 166 * 15 - * OK = 3 - * Total: 2514 - * - */ -#define BFLSC_BUFSIZ (0x1000) - -#define BFLSC_INFO_TIMEOUT 999 - -#define BFLSC_DI_FIRMWARE "FIRMWARE" -#define BFLSC_DI_ENGINES "ENGINES" -#define BFLSC_DI_JOBSINQUE "JOBS IN QUEUE" -#define BFLSC_DI_XLINKMODE "XLINK MODE" -#define BFLSC_DI_XLINKPRESENT "XLINK PRESENT" -#define BFLSC_DI_DEVICESINCHAIN "DEVICES IN CHAIN" -#define BFLSC_DI_CHAINPRESENCE "CHAIN PRESENCE MASK" -#define BFLSC_DI_CHIPS "CHIP PARALLELIZATION" - -#define FULLNONCE 0x100000000ULL - -struct bflsc_dev { - // Work - unsigned int ms_work; - int work_queued; - int work_complete; - int nonces_hw; // TODO: this - need to add a paramter to submit_nonce() - // so can pass 'dev' to hw_error - uint64_t hashes_unsent; - uint64_t hashes_sent; - uint64_t nonces_found; - - struct timeval last_check_result; - struct timeval last_dev_result; // array > 0 - struct timeval last_nonce_result; // > 0 nonce - - // Info - char getinfo[(BFLSC_BUFSIZ+4)*4]; - char *firmware; - int engines; // each engine represents a 'thread' in a chip - char *xlink_mode; - char *xlink_present; - char *chips; - - // Status - bool dead; // TODO: handle seperate x-link devices failing? - bool overheat; - - // Stats - float temp1; - float temp2; - float vcc1; - float vcc2; - float vmain; - float temp1_max; - float temp2_max; - time_t temp1_max_time; - time_t temp2_max_time; - float temp1_5min_av; // TODO: - float temp2_5min_av; // TODO: - - // To handle the fact that flushing the queue may not remove all work - // (normally one item is still being processed) - // and also that once the queue is flushed, results may still be in - // the output queue - but we don't want to process them at the time of doing an LP - // when result_id > flush_id+1, flushed work can be discarded since it - // is no longer in the device - uint64_t flush_id; // counter when results were last flushed - uint64_t result_id; // counter when results were last checked - bool flushed; // are any flushed? -}; - -#define QUE_MAX_RESULTS 8 - -struct bflsc_info { - enum driver_version driver_version; - pthread_rwlock_t stat_lock; - struct thr_info results_thr; - uint64_t hashes_sent; - uint32_t update_count; - struct timeval last_update; - int sc_count; - struct bflsc_dev *sc_devs; - unsigned int scan_sleep_time; - unsigned int results_sleep_time; - unsigned int default_ms_work; - bool shutdown; - bool flash_led; - bool not_first_work; // allow ignoring the first nonce error - bool fanauto; - int que_size; - int que_full_enough; - int que_watermark; - int que_low; - int que_noncecount; - int que_fld_min; - int que_fld_max; - int flush_size; - // count of given size, [+2] is for any > QUE_MAX_RESULTS - uint64_t result_size[QUE_MAX_RESULTS+2]; -}; - -#define BFLSC_XLINKHDR '@' -#define BFLSC_MAXPAYLOAD 255 - -struct DataForwardToChain { - uint8_t header; - uint8_t payloadSize; - uint8_t deviceAddress; - uint8_t payloadData[BFLSC_MAXPAYLOAD]; -}; - -#define DATAFORWARDSIZE(data) (1 + 1 + 1 + data.payloadSize) - -#define MIDSTATE_BYTES 32 -#define MERKLE_OFFSET 64 -#define MERKLE_BYTES 12 -#define BFLSC_QJOBSIZ (MIDSTATE_BYTES+MERKLE_BYTES+1) -#define BFLSC_EOB 0xaa - -struct QueueJobStructure { - uint8_t payloadSize; - uint8_t midState[MIDSTATE_BYTES]; - uint8_t blockData[MERKLE_BYTES]; - uint8_t endOfBlock; -}; - -#define QUE_RES_LINES_MIN 3 -#define QUE_MIDSTATE 0 -#define QUE_BLOCKDATA 1 - -#define QUE_NONCECOUNT_V1 2 -#define QUE_FLD_MIN_V1 3 -#define QUE_FLD_MAX_V1 (QUE_MAX_RESULTS+QUE_FLD_MIN_V1) - -#define QUE_CHIP_V2 2 -#define QUE_NONCECOUNT_V2 3 -#define QUE_FLD_MIN_V2 4 -#define QUE_FLD_MAX_V2 (QUE_MAX_RESULTS+QUE_FLD_MIN_V2) - -#define BFLSC_SIGNATURE 0xc1 -#define BFLSC_EOW 0xfe - -// N.B. this will only work with 5 jobs -// requires a different jobs[N] for each job count -// but really only need to handle 5 anyway -struct QueueJobPackStructure { - uint8_t payloadSize; - uint8_t signature; - uint8_t jobsInArray; - struct QueueJobStructure jobs[5]; - uint8_t endOfWrapper; -}; - -// TODO: Implement in API and also in usb device selection -struct SaveString { - uint8_t payloadSize; - uint8_t payloadData[BFLSC_MAXPAYLOAD]; -}; - -// Commands (Single Stage) -#define BFLSC_IDENTIFY "ZGX" -#define BFLSC_IDENTIFY_LEN (sizeof(BFLSC_IDENTIFY)-1) -#define BFLSC_DETAILS "ZCX" -#define BFLSC_DETAILS_LEN (sizeof(BFLSC_DETAILS)-1) -#define BFLSC_FIRMWARE "ZJX" -#define BFLSC_FIRMWARE_LEN (sizeof(BFLSC_FIRMWARE)-1) -#define BFLSC_FLASH "ZMX" -#define BFLSC_FLASH_LEN (sizeof(BFLSC_FLASH)-1) -#define BFLSC_VOLTAGE "ZTX" -#define BFLSC_VOLTAGE_LEN (sizeof(BFLSC_VOLTAGE)-1) -#define BFLSC_TEMPERATURE "ZLX" -#define BFLSC_TEMPERATURE_LEN (sizeof(BFLSC_TEMPERATURE)-1) -#define BFLSC_QRES "ZOX" -#define BFLSC_QRES_LEN (sizeof(BFLSC_QRES)-1) -#define BFLSC_QFLUSH "ZQX" -#define BFLSC_QFLUSH_LEN (sizeof(BFLSC_QFLUSH)-1) -#define BFLSC_FANAUTO "Z9X" -#define BFLSC_FANOUT_LEN (sizeof(BFLSC_FANAUTO)-1) -#define BFLSC_FAN0 "Z0X" -#define BFLSC_FAN0_LEN (sizeof(BFLSC_FAN0)-1) -#define BFLSC_FAN1 "Z1X" -#define BFLSC_FAN1_LEN (sizeof(BFLSC_FAN1)-1) -#define BFLSC_FAN2 "Z2X" -#define BFLSC_FAN2_LEN (sizeof(BFLSC_FAN2)-1) -#define BFLSC_FAN3 "Z3X" -#define BFLSC_FAN3_LEN (sizeof(BFLSC_FAN3)-1) -#define BFLSC_FAN4 "Z4X" -#define BFLSC_FAN4_LEN (sizeof(BFLSC_FAN4)-1) -#define BFLSC_LOADSTR "ZUX" -#define BFLSC_LOADSTR_LEN (sizeof(BFLSC_LOADSTR)-1) - -// Commands (Dual Stage) -#define BFLSC_QJOB "ZNX" -#define BFLSC_QJOB_LEN (sizeof(BFLSC_QJOB)-1) -#define BFLSC_QJOBS "ZWX" -#define BFLSC_QJOBS_LEN (sizeof(BFLSC_QJOBS)-1) -#define BFLSC_SAVESTR "ZSX" -#define BFLSC_SAVESTR_LEN (sizeof(BFLSC_SAVESTR)-1) - -// Replies -#define BFLSC_IDENTITY "BitFORCE SC" -#define BFLSC_BFLSC "SHA256 SC" - -#define BFLSC_OK "OK\n" -#define BFLSC_OK_LEN (sizeof(BFLSC_OK)-1) -#define BFLSC_SUCCESS "SUCCESS\n" -#define BFLSC_SUCCESS_LEN (sizeof(BFLSC_SUCCESS)-1) - -#define BFLSC_RESULT "COUNT:" -#define BFLSC_RESULT_LEN (sizeof(BFLSC_RESULT)-1) - -#define BFLSC_ANERR "ERR:" -#define BFLSC_ANERR_LEN (sizeof(BFLSC_ANERR)-1) -#define BFLSC_TIMEOUT BFLSC_ANERR "TIMEOUT" -#define BFLSC_TIMEOUT_LEN (sizeof(BFLSC_TIMEOUT)-1) -// x-link timeout has a space (a number follows) -#define BFLSC_XTIMEOUT BFLSC_ANERR "TIMEOUT " -#define BFLSC_XTIMEOUT_LEN (sizeof(BFLSC_XTIMEOUT)-1) -#define BFLSC_INVALID BFLSC_ANERR "INVALID DATA" -#define BFLSC_INVALID_LEN (sizeof(BFLSC_INVALID)-1) -#define BFLSC_ERRSIG BFLSC_ANERR "SIGNATURE" -#define BFLSC_ERRSIG_LEN (sizeof(BFLSC_ERRSIG)-1) -#define BFLSC_OKQ "OK:QUEUED" -#define BFLSC_OKQ_LEN (sizeof(BFLSC_OKQ)-1) -// Followed by N=1..5 -#define BFLSC_OKQN "OK:QUEUED " -#define BFLSC_OKQN_LEN (sizeof(BFLSC_OKQN)-1) -#define BFLSC_QFULL "QUEUE FULL" -#define BFLSC_QFULL_LEN (sizeof(BFLSC_QFULL)-1) -#define BFLSC_HITEMP "HIGH TEMPERATURE RECOVERY" -#define BFLSC_HITEMP_LEN (sizeof(BFLSC_HITEMP)-1) -#define BFLSC_EMPTYSTR "MEMORY EMPTY" -#define BFLSC_EMPTYSTR_LEN (sizeof(BFLSC_EMPTYSTR)-1) - -// Queued and non-queued are the same -#define FullNonceRangeJob QueueJobStructure -#define BFLSC_JOBSIZ BFLSC_QJOBSIZ - -// Non queued commands (not used) -#define BFLSC_SENDWORK "ZDX" -#define BFLSC_SENDWORK_LEN (sizeof(BFLSC_SENDWORK)-1) -#define BFLSC_WORKSTATUS "ZFX" -#define BFLSC_WORKSTATUS_LEN (sizeof(BFLSC_WORKSTATUS)-1) -#define BFLSC_SENDRANGE "ZPX" -#define BFLSC_SENDRANGE_LEN (sizeof(BFLSC_SENDRANGE)-1) - -// Non queued work replies (not used) -#define BFLSC_NONCE "NONCE-FOUND:" -#define BFLSC_NONCE_LEN (sizeof(BFLSC_NONCE)-1) -#define BFLSC_NO_NONCE "NO-NONCE" -#define BFLSC_NO_NONCE_LEN (sizeof(BFLSC_NO_NONCE)-1) -#define BFLSC_IDLE "IDLE" -#define BFLSC_IDLE_LEN (sizeof(BFLSC_IDLE)-1) -#define BFLSC_BUSY "BUSY" -#define BFLSC_BUSY_LEN (sizeof(BFLSC_BUSY)-1) - -#define BFLSC_MINIRIG "BAM" -#define BFLSC_SINGLE "BAS" -#define BFLSC_LITTLESINGLE "BAL" -#define BFLSC_JALAPENO "BAJ" - -// Default expected time for a nonce range -// - thus no need to check until this + last time work was found -// 60GH/s MiniRig (1 board) or Single -#define BAM_WORK_TIME 71.58 -#define BAS_WORK_TIME 71.58 -// 30GH/s Little Single -#define BAL_WORK_TIME 143.17 -// 4.5GH/s Jalapeno -#define BAJ_WORK_TIME 954.44 - -// Defaults (slightly over half the work time) but ensure none are above 100 -// SCAN_TIME - delay after sending work -// RES_TIME - delay between checking for results -#define BAM_SCAN_TIME 20 -#define BAM_RES_TIME 2 -#define BAS_SCAN_TIME 360 -#define BAS_RES_TIME 36 -#define BAL_SCAN_TIME 720 -#define BAL_RES_TIME 72 -#define BAJ_SCAN_TIME 1000 -#define BAJ_RES_TIME 100 -#define BFLSC_MAX_SLEEP 2000 - -#define BAJ_LATENCY LATENCY_STD -#define BAL_LATENCY 12 -#define BAS_LATENCY 12 -// For now a BAM doesn't really exist - it's currently 8 independent BASs -#define BAM_LATENCY 2 - -#define BFLSC_TEMP_SLEEPMS 5 - -#define BFLSC_QUE_SIZE_V1 20 -#define BFLSC_QUE_FULL_ENOUGH_V1 13 -#define BFLSC_QUE_WATERMARK_V1 6 -#define BFLSC_QUE_LOW_V1 2 - -// TODO: use 5 batch jobs -// TODO: base these numbers on the chip count? -#define BFLSC_QUE_SIZE_V2 40 -#define BFLSC_QUE_FULL_ENOUGH_V2 36 -#define BFLSC_QUE_WATERMARK_V2 32 -#define BFLSC_QUE_LOW_V2 8 - -// Must drop this far below cutoff before resuming work -#define BFLSC_TEMP_RECOVER 5 - -// If initialisation fails the first time, -// sleep this amount (ms) and try again -#define REINIT_TIME_FIRST_MS 100 -// Max ms per sleep -#define REINIT_TIME_MAX_MS 800 -// Keep trying up to this many us -#define REINIT_TIME_MAX 3000000 +#include "driver-bflsc.h" static const char *blank = ""; diff --git a/driver-bflsc.h b/driver-bflsc.h new file mode 100644 index 00000000..e949424c --- /dev/null +++ b/driver-bflsc.h @@ -0,0 +1,356 @@ +/* + * Copyright 2013 Con Kolivas + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 3 of the License, or (at your option) + * any later version. See COPYING for more details. + */ + +#ifndef BFLSC_H +#define BFLSC_H +#define BLANK "" +#define LFSTR "" + +/* + * Firmware + * DRV_V2 expects (beyond V1) the GetInfo to return the chip count + * The queues are 40 instead of 20 and are *usually* consumed and filled + * in bursts due to e.g. a 16 chip device doing 16 items at a time and + * returning 16 results at a time + * If the device has varying chip speeds, it will gradually break up the + * burst of results as we progress + */ +enum driver_version { + BFLSC_DRVUNDEF = 0, + BFLSC_DRV1, + BFLSC_DRV2 +}; + +/* + * With Firmware 1.0.0 and a result queue of 20 the Max is: + * inprocess = 12 + * max count = 9 + * 64+1+24+1+1+(1+8)*8+1 per line = 164 * 20 + * OK = 3 + * Total: 3304 + * + * With Firmware 1.2.* and a result queue of 40 but a limit of 15 replies: + * inprocess = 12 + * max count = 9 + * 64+1+24+1+1+1+1+(1+8)*8+1 per line = 166 * 15 + * OK = 3 + * Total: 2514 + * + */ +#define BFLSC_BUFSIZ (0x1000) + +#define BFLSC_INFO_TIMEOUT 999 + +#define BFLSC_DI_FIRMWARE "FIRMWARE" +#define BFLSC_DI_ENGINES "ENGINES" +#define BFLSC_DI_JOBSINQUE "JOBS IN QUEUE" +#define BFLSC_DI_XLINKMODE "XLINK MODE" +#define BFLSC_DI_XLINKPRESENT "XLINK PRESENT" +#define BFLSC_DI_DEVICESINCHAIN "DEVICES IN CHAIN" +#define BFLSC_DI_CHAINPRESENCE "CHAIN PRESENCE MASK" +#define BFLSC_DI_CHIPS "CHIP PARALLELIZATION" + +#define FULLNONCE 0x100000000ULL + +struct bflsc_dev { + // Work + unsigned int ms_work; + int work_queued; + int work_complete; + int nonces_hw; // TODO: this - need to add a paramter to submit_nonce() + // so can pass 'dev' to hw_error + uint64_t hashes_unsent; + uint64_t hashes_sent; + uint64_t nonces_found; + + struct timeval last_check_result; + struct timeval last_dev_result; // array > 0 + struct timeval last_nonce_result; // > 0 nonce + + // Info + char getinfo[(BFLSC_BUFSIZ+4)*4]; + char *firmware; + int engines; // each engine represents a 'thread' in a chip + char *xlink_mode; + char *xlink_present; + char *chips; + + // Status + bool dead; // TODO: handle seperate x-link devices failing? + bool overheat; + + // Stats + float temp1; + float temp2; + float vcc1; + float vcc2; + float vmain; + float temp1_max; + float temp2_max; + time_t temp1_max_time; + time_t temp2_max_time; + float temp1_5min_av; // TODO: + float temp2_5min_av; // TODO: + + // To handle the fact that flushing the queue may not remove all work + // (normally one item is still being processed) + // and also that once the queue is flushed, results may still be in + // the output queue - but we don't want to process them at the time of doing an LP + // when result_id > flush_id+1, flushed work can be discarded since it + // is no longer in the device + uint64_t flush_id; // counter when results were last flushed + uint64_t result_id; // counter when results were last checked + bool flushed; // are any flushed? +}; + +#define QUE_MAX_RESULTS 8 + +struct bflsc_info { + enum driver_version driver_version; + pthread_rwlock_t stat_lock; + struct thr_info results_thr; + uint64_t hashes_sent; + uint32_t update_count; + struct timeval last_update; + int sc_count; + struct bflsc_dev *sc_devs; + unsigned int scan_sleep_time; + unsigned int results_sleep_time; + unsigned int default_ms_work; + bool shutdown; + bool flash_led; + bool not_first_work; // allow ignoring the first nonce error + bool fanauto; + int que_size; + int que_full_enough; + int que_watermark; + int que_low; + int que_noncecount; + int que_fld_min; + int que_fld_max; + int flush_size; + // count of given size, [+2] is for any > QUE_MAX_RESULTS + uint64_t result_size[QUE_MAX_RESULTS+2]; +}; + +#define BFLSC_XLINKHDR '@' +#define BFLSC_MAXPAYLOAD 255 + +struct DataForwardToChain { + uint8_t header; + uint8_t payloadSize; + uint8_t deviceAddress; + uint8_t payloadData[BFLSC_MAXPAYLOAD]; +}; + +#define DATAFORWARDSIZE(data) (1 + 1 + 1 + data.payloadSize) + +#define MIDSTATE_BYTES 32 +#define MERKLE_OFFSET 64 +#define MERKLE_BYTES 12 +#define BFLSC_QJOBSIZ (MIDSTATE_BYTES+MERKLE_BYTES+1) +#define BFLSC_EOB 0xaa + +struct QueueJobStructure { + uint8_t payloadSize; + uint8_t midState[MIDSTATE_BYTES]; + uint8_t blockData[MERKLE_BYTES]; + uint8_t endOfBlock; +}; + +#define QUE_RES_LINES_MIN 3 +#define QUE_MIDSTATE 0 +#define QUE_BLOCKDATA 1 + +#define QUE_NONCECOUNT_V1 2 +#define QUE_FLD_MIN_V1 3 +#define QUE_FLD_MAX_V1 (QUE_MAX_RESULTS+QUE_FLD_MIN_V1) + +#define QUE_CHIP_V2 2 +#define QUE_NONCECOUNT_V2 3 +#define QUE_FLD_MIN_V2 4 +#define QUE_FLD_MAX_V2 (QUE_MAX_RESULTS+QUE_FLD_MIN_V2) + +#define BFLSC_SIGNATURE 0xc1 +#define BFLSC_EOW 0xfe + +// N.B. this will only work with 5 jobs +// requires a different jobs[N] for each job count +// but really only need to handle 5 anyway +struct QueueJobPackStructure { + uint8_t payloadSize; + uint8_t signature; + uint8_t jobsInArray; + struct QueueJobStructure jobs[5]; + uint8_t endOfWrapper; +}; + +// TODO: Implement in API and also in usb device selection +struct SaveString { + uint8_t payloadSize; + uint8_t payloadData[BFLSC_MAXPAYLOAD]; +}; + +// Commands (Single Stage) +#define BFLSC_IDENTIFY "ZGX" +#define BFLSC_IDENTIFY_LEN (sizeof(BFLSC_IDENTIFY)-1) +#define BFLSC_DETAILS "ZCX" +#define BFLSC_DETAILS_LEN (sizeof(BFLSC_DETAILS)-1) +#define BFLSC_FIRMWARE "ZJX" +#define BFLSC_FIRMWARE_LEN (sizeof(BFLSC_FIRMWARE)-1) +#define BFLSC_FLASH "ZMX" +#define BFLSC_FLASH_LEN (sizeof(BFLSC_FLASH)-1) +#define BFLSC_VOLTAGE "ZTX" +#define BFLSC_VOLTAGE_LEN (sizeof(BFLSC_VOLTAGE)-1) +#define BFLSC_TEMPERATURE "ZLX" +#define BFLSC_TEMPERATURE_LEN (sizeof(BFLSC_TEMPERATURE)-1) +#define BFLSC_QRES "ZOX" +#define BFLSC_QRES_LEN (sizeof(BFLSC_QRES)-1) +#define BFLSC_QFLUSH "ZQX" +#define BFLSC_QFLUSH_LEN (sizeof(BFLSC_QFLUSH)-1) +#define BFLSC_FANAUTO "Z9X" +#define BFLSC_FANOUT_LEN (sizeof(BFLSC_FANAUTO)-1) +#define BFLSC_FAN0 "Z0X" +#define BFLSC_FAN0_LEN (sizeof(BFLSC_FAN0)-1) +#define BFLSC_FAN1 "Z1X" +#define BFLSC_FAN1_LEN (sizeof(BFLSC_FAN1)-1) +#define BFLSC_FAN2 "Z2X" +#define BFLSC_FAN2_LEN (sizeof(BFLSC_FAN2)-1) +#define BFLSC_FAN3 "Z3X" +#define BFLSC_FAN3_LEN (sizeof(BFLSC_FAN3)-1) +#define BFLSC_FAN4 "Z4X" +#define BFLSC_FAN4_LEN (sizeof(BFLSC_FAN4)-1) +#define BFLSC_LOADSTR "ZUX" +#define BFLSC_LOADSTR_LEN (sizeof(BFLSC_LOADSTR)-1) + +// Commands (Dual Stage) +#define BFLSC_QJOB "ZNX" +#define BFLSC_QJOB_LEN (sizeof(BFLSC_QJOB)-1) +#define BFLSC_QJOBS "ZWX" +#define BFLSC_QJOBS_LEN (sizeof(BFLSC_QJOBS)-1) +#define BFLSC_SAVESTR "ZSX" +#define BFLSC_SAVESTR_LEN (sizeof(BFLSC_SAVESTR)-1) + +// Replies +#define BFLSC_IDENTITY "BitFORCE SC" +#define BFLSC_BFLSC "SHA256 SC" + +#define BFLSC_OK "OK\n" +#define BFLSC_OK_LEN (sizeof(BFLSC_OK)-1) +#define BFLSC_SUCCESS "SUCCESS\n" +#define BFLSC_SUCCESS_LEN (sizeof(BFLSC_SUCCESS)-1) + +#define BFLSC_RESULT "COUNT:" +#define BFLSC_RESULT_LEN (sizeof(BFLSC_RESULT)-1) + +#define BFLSC_ANERR "ERR:" +#define BFLSC_ANERR_LEN (sizeof(BFLSC_ANERR)-1) +#define BFLSC_TIMEOUT BFLSC_ANERR "TIMEOUT" +#define BFLSC_TIMEOUT_LEN (sizeof(BFLSC_TIMEOUT)-1) +// x-link timeout has a space (a number follows) +#define BFLSC_XTIMEOUT BFLSC_ANERR "TIMEOUT " +#define BFLSC_XTIMEOUT_LEN (sizeof(BFLSC_XTIMEOUT)-1) +#define BFLSC_INVALID BFLSC_ANERR "INVALID DATA" +#define BFLSC_INVALID_LEN (sizeof(BFLSC_INVALID)-1) +#define BFLSC_ERRSIG BFLSC_ANERR "SIGNATURE" +#define BFLSC_ERRSIG_LEN (sizeof(BFLSC_ERRSIG)-1) +#define BFLSC_OKQ "OK:QUEUED" +#define BFLSC_OKQ_LEN (sizeof(BFLSC_OKQ)-1) +// Followed by N=1..5 +#define BFLSC_OKQN "OK:QUEUED " +#define BFLSC_OKQN_LEN (sizeof(BFLSC_OKQN)-1) +#define BFLSC_QFULL "QUEUE FULL" +#define BFLSC_QFULL_LEN (sizeof(BFLSC_QFULL)-1) +#define BFLSC_HITEMP "HIGH TEMPERATURE RECOVERY" +#define BFLSC_HITEMP_LEN (sizeof(BFLSC_HITEMP)-1) +#define BFLSC_EMPTYSTR "MEMORY EMPTY" +#define BFLSC_EMPTYSTR_LEN (sizeof(BFLSC_EMPTYSTR)-1) + +// Queued and non-queued are the same +#define FullNonceRangeJob QueueJobStructure +#define BFLSC_JOBSIZ BFLSC_QJOBSIZ + +// Non queued commands (not used) +#define BFLSC_SENDWORK "ZDX" +#define BFLSC_SENDWORK_LEN (sizeof(BFLSC_SENDWORK)-1) +#define BFLSC_WORKSTATUS "ZFX" +#define BFLSC_WORKSTATUS_LEN (sizeof(BFLSC_WORKSTATUS)-1) +#define BFLSC_SENDRANGE "ZPX" +#define BFLSC_SENDRANGE_LEN (sizeof(BFLSC_SENDRANGE)-1) + +// Non queued work replies (not used) +#define BFLSC_NONCE "NONCE-FOUND:" +#define BFLSC_NONCE_LEN (sizeof(BFLSC_NONCE)-1) +#define BFLSC_NO_NONCE "NO-NONCE" +#define BFLSC_NO_NONCE_LEN (sizeof(BFLSC_NO_NONCE)-1) +#define BFLSC_IDLE "IDLE" +#define BFLSC_IDLE_LEN (sizeof(BFLSC_IDLE)-1) +#define BFLSC_BUSY "BUSY" +#define BFLSC_BUSY_LEN (sizeof(BFLSC_BUSY)-1) + +#define BFLSC_MINIRIG "BAM" +#define BFLSC_SINGLE "BAS" +#define BFLSC_LITTLESINGLE "BAL" +#define BFLSC_JALAPENO "BAJ" + +// Default expected time for a nonce range +// - thus no need to check until this + last time work was found +// 60GH/s MiniRig (1 board) or Single +#define BAM_WORK_TIME 71.58 +#define BAS_WORK_TIME 71.58 +// 30GH/s Little Single +#define BAL_WORK_TIME 143.17 +// 4.5GH/s Jalapeno +#define BAJ_WORK_TIME 954.44 + +// Defaults (slightly over half the work time) but ensure none are above 100 +// SCAN_TIME - delay after sending work +// RES_TIME - delay between checking for results +#define BAM_SCAN_TIME 20 +#define BAM_RES_TIME 2 +#define BAS_SCAN_TIME 360 +#define BAS_RES_TIME 36 +#define BAL_SCAN_TIME 720 +#define BAL_RES_TIME 72 +#define BAJ_SCAN_TIME 1000 +#define BAJ_RES_TIME 100 +#define BFLSC_MAX_SLEEP 2000 + +#define BAJ_LATENCY LATENCY_STD +#define BAL_LATENCY 12 +#define BAS_LATENCY 12 +// For now a BAM doesn't really exist - it's currently 8 independent BASs +#define BAM_LATENCY 2 + +#define BFLSC_TEMP_SLEEPMS 5 + +#define BFLSC_QUE_SIZE_V1 20 +#define BFLSC_QUE_FULL_ENOUGH_V1 13 +#define BFLSC_QUE_WATERMARK_V1 6 +#define BFLSC_QUE_LOW_V1 2 + +// TODO: use 5 batch jobs +// TODO: base these numbers on the chip count? +#define BFLSC_QUE_SIZE_V2 40 +#define BFLSC_QUE_FULL_ENOUGH_V2 36 +#define BFLSC_QUE_WATERMARK_V2 32 +#define BFLSC_QUE_LOW_V2 8 + +// Must drop this far below cutoff before resuming work +#define BFLSC_TEMP_RECOVER 5 + +// If initialisation fails the first time, +// sleep this amount (ms) and try again +#define REINIT_TIME_FIRST_MS 100 +// Max ms per sleep +#define REINIT_TIME_MAX_MS 800 +// Keep trying up to this many us +#define REINIT_TIME_MAX 3000000 + +#endif /* BFLSC_H */