mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-23 04:54:26 +00:00
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
This commit is contained in:
commit
ea4cf57d94
52
cgminer.c
52
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)
|
||||
|
4
miner.h
4
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, ...);
|
||||
|
29
usbutils.c
29
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>
|
||||
|
@ -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 *));
|
||||
|
Loading…
x
Reference in New Issue
Block a user