Commit ea4cf57d943025d86b01c1e5dfbbc8661371d0e7

Con Kolivas 2013-03-31T15:25:46

Merge pull request #413 from kanoi/bflsc find_work() to find work in devices work queue + usbutils extra message requirements + functions for handling work queues

diff --git a/cgminer.c b/cgminer.c
index 42270f4..e119965 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -5786,6 +5786,58 @@ struct work *get_queued(struct cgpu_info *cgpu)
 	return ret;
 }
 
+/* This function is for including work in the given que hashtable.
+ * The calling function must lock access to the que if it is required. */
+struct work *add_to_work_que(struct work *que, struct work *work)
+{
+	HASH_ADD_INT(que, id, work);
+	return que;
+}
+
+/* This function is for removing work from the given que hashtable.
+ * The calling function must lock access to the que if it is required. */
+struct work *del_from_work_que(struct work *que, struct work *work)
+{
+	HASH_DEL(que, work);
+	return que;
+}
+
+/* This function is for finding an already queued work item in the
+ * given que hashtable. Code using this function must be able
+ * to handle NULL as a return which implies there is no matching work.
+ * The calling function must lock access to the que if it is required.
+ * The common values for midstatelen, offset, datalen are 32, 64, 12 */
+struct work *find_work_bymidstate(struct work *que, char *midstate, size_t midstatelen, char *data, int offset, size_t datalen)
+{
+	struct work *work, *tmp, *ret = NULL;
+
+	HASH_ITER(hh, que, work, tmp) {
+		if (work->queued &&
+		    memcmp(work->midstate, midstate, midstatelen) == 0 &&
+		    memcmp(work->data + offset, data, datalen) == 0) {
+			ret = work;
+			break;
+		}
+	}
+
+	return ret;
+}
+
+/* This function is for finding an already queued work item in the
+ * device's queued_work hashtable. Code using this function must be able
+ * to handle NULL as a return which implies there is no matching work.
+ * The common values for midstatelen, offset, datalen are 32, 64, 12 */
+struct work *find_queued_work_bymidstate(struct cgpu_info *cgpu, char *midstate, size_t midstatelen, char *data, int offset, size_t datalen)
+{
+	struct work *ret;
+
+	rd_lock(&cgpu->qlock);
+	ret = find_work_bymidstate(cgpu->queued_work, midstate, midstatelen, data, offset, datalen);
+	rd_unlock(&cgpu->qlock);
+
+	return ret;
+}
+
 /* This function should be used by queued device drivers when they're sure
  * the work struct is no longer in use. */
 void work_completed(struct cgpu_info *cgpu, struct work *work)
diff --git a/miner.h b/miner.h
index b3ac3ae..0595f94 100644
--- a/miner.h
+++ b/miner.h
@@ -1183,6 +1183,10 @@ struct modminer_fpga_state {
 extern void get_datestamp(char *, struct timeval *);
 extern void submit_nonce(struct thr_info *thr, struct work *work, uint32_t nonce);
 extern struct work *get_queued(struct cgpu_info *cgpu);
+extern struct work *add_to_work_que(struct work *que, struct work *work);
+extern struct work *del_from_work_que(struct work *que, struct work *work);
+extern struct work *find_work_bymidstate(struct work *que, char *midstate, size_t midstatelen, char *data, int offset, size_t datalen);
+extern struct work *find_queued_work_bymidstate(struct cgpu_info *cgpu, char *midstate, size_t midstatelen, char *data, int offset, size_t datalen);
 extern void work_completed(struct cgpu_info *cgpu, struct work *work);
 extern void hash_queued_work(struct thr_info *mythr);
 extern void tailsprintf(char *f, const char *fmt, ...);
diff --git a/usbutils.c b/usbutils.c
index 1394147..69bd72e 100644
--- a/usbutils.c
+++ b/usbutils.c
@@ -195,6 +195,8 @@ extern struct device_drv avalon_drv;
 
 #define STRBUFLEN 256
 static const char *BLANK = "";
+static const char *space = " ";
+static const char *nodatareturned = "no data returned ";
 
 // For device limits by driver
 static struct driver_count {
@@ -286,6 +288,12 @@ static const char *C_PURGETX_S = "PurgeTx";
 static const char *C_FLASHREPLY_S = "FlashReply";
 static const char *C_REQUESTDETAILS_S = "RequestDetails";
 static const char *C_GETDETAILS_S = "GetDetails";
+static const char *C_REQUESTRESULTS_S = "RequestResults";
+static const char *C_GETRESULTS_S = "GetResults";
+static const char *C_REQUESTQUEJOB_S = "RequestQueJob";
+static const char *C_REQUESTQUEJOBSTATUS_S = "RequestQueJobStatus";
+static const char *C_QUEJOB_S = "QueJob";
+static const char *C_QUEJOBSTATUS_S = "QueJobStatus";
 
 #ifdef EOL
 #undef EOL
@@ -745,6 +753,12 @@ static void cgusb_check_init()
 		usb_commands[C_FLASHREPLY] = C_FLASHREPLY_S;
 		usb_commands[C_REQUESTDETAILS] = C_REQUESTDETAILS_S;
 		usb_commands[C_GETDETAILS] = C_GETDETAILS_S;
+		usb_commands[C_REQUESTRESULTS] = C_REQUESTRESULTS_S;
+		usb_commands[C_GETRESULTS] = C_GETRESULTS_S;
+		usb_commands[C_REQUESTQUEJOB] = C_REQUESTQUEJOB_S;
+		usb_commands[C_REQUESTQUEJOBSTATUS] = C_REQUESTQUEJOBSTATUS_S;
+		usb_commands[C_QUEJOB] = C_QUEJOB_S;
+		usb_commands[C_QUEJOBSTATUS] = C_QUEJOBSTATUS_S;
 
 		stats_initialised = true;
 	}
@@ -759,6 +773,21 @@ const char *usb_cmdname(enum usb_cmds cmd)
 	return usb_commands[cmd];
 }
 
+void usb_applog(struct cgpu_info *cgpu, enum usb_cmds cmd, char *msg, int amount, int err)
+{
+	if (msg && !*msg)
+		msg = NULL;
+
+	if (!msg && amount == 0 && err == LIBUSB_SUCCESS)
+		msg = (char *)nodatareturned;
+
+        applog(LOG_ERR, "%s%i: %s failed%s%s (err=%d amt%d)",
+                        cgpu->drv->name, cgpu->device_id,
+                        usb_cmdname(cmd),
+                        msg ? space : BLANK, msg ? msg : BLANK,
+                        err, amount);
+}
+
 #ifndef WIN32
 #include <errno.h>
 #include <unistd.h>
diff --git a/usbutils.h b/usbutils.h
index 7cacc43..8e34d81 100644
--- a/usbutils.h
+++ b/usbutils.h
@@ -125,6 +125,12 @@ enum usb_cmds {
 	C_FLASHREPLY,
 	C_REQUESTDETAILS,
 	C_GETDETAILS,
+	C_REQUESTRESULTS,
+	C_GETRESULTS,
+	C_REQUESTQUEJOB,
+	C_REQUESTQUEJOBSTATUS,
+	C_QUEJOB,
+	C_QUEJOBSTATUS,
 	C_MAX
 };
 
@@ -133,6 +139,7 @@ struct cgpu_info;
 
 void usb_all(int level);
 const char *usb_cmdname(enum usb_cmds cmd);
+void usb_applog(struct cgpu_info *bflsc, enum usb_cmds cmd, char *msg, int amount, int err);
 void usb_uninit(struct cgpu_info *cgpu);
 bool usb_init(struct cgpu_info *cgpu, struct libusb_device *dev, struct usb_find_devices *found);
 void usb_detect(struct device_drv *drv, bool (*device_detect)(struct libusb_device *, struct usb_find_devices *));