Browse Source

Move bflsc defines to a header file.

Con Kolivas 12 years ago
parent
commit
812852cc36
4 changed files with 362 additions and 345 deletions
  1. 1 1
      Makefile.am
  2. 4 0
      cgminer.c
  3. 1 344
      driver-bflsc.c
  4. 356 0
      driver-bflsc.h

+ 1 - 1
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

+ 4 - 0
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 <errno.h>
 	#include <fcntl.h>

+ 1 - 344
driver-bflsc.c

@@ -26,350 +26,7 @@
 #include "compat.h"
 #include "miner.h"
 #include "usbutils.h"
-
-#define BLANK ""
-#define LFSTR "<LF>"
-
-/*
- * 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 = "";
 

+ 356 - 0
driver-bflsc.h

@@ -0,0 +1,356 @@
+/*
+ * Copyright 2013 Con Kolivas <kernel@kolivas.org>
+ *
+ * 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 "<LF>"
+
+/*
+ * 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 */