Browse Source

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
nfactor-troky
Con Kolivas 12 years ago
parent
commit
ea4cf57d94
  1. 52
      cgminer.c
  2. 4
      miner.h
  3. 29
      usbutils.c
  4. 7
      usbutils.h

52
cgminer.c

@ -5786,6 +5786,58 @@ struct work *get_queued(struct cgpu_info *cgpu)
return ret; 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 /* This function should be used by queued device drivers when they're sure
* the work struct is no longer in use. */ * the work struct is no longer in use. */
void work_completed(struct cgpu_info *cgpu, struct work *work) void work_completed(struct cgpu_info *cgpu, struct work *work)

4
miner.h

@ -1183,6 +1183,10 @@ struct modminer_fpga_state {
extern void get_datestamp(char *, struct timeval *); extern void get_datestamp(char *, struct timeval *);
extern void submit_nonce(struct thr_info *thr, struct work *work, uint32_t nonce); 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 *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 work_completed(struct cgpu_info *cgpu, struct work *work);
extern void hash_queued_work(struct thr_info *mythr); extern void hash_queued_work(struct thr_info *mythr);
extern void tailsprintf(char *f, const char *fmt, ...); extern void tailsprintf(char *f, const char *fmt, ...);

29
usbutils.c

@ -195,6 +195,8 @@ extern struct device_drv avalon_drv;
#define STRBUFLEN 256 #define STRBUFLEN 256
static const char *BLANK = ""; static const char *BLANK = "";
static const char *space = " ";
static const char *nodatareturned = "no data returned ";
// For device limits by driver // For device limits by driver
static struct driver_count { 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_FLASHREPLY_S = "FlashReply";
static const char *C_REQUESTDETAILS_S = "RequestDetails"; static const char *C_REQUESTDETAILS_S = "RequestDetails";
static const char *C_GETDETAILS_S = "GetDetails"; 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 #ifdef EOL
#undef EOL #undef EOL
@ -745,6 +753,12 @@ static void cgusb_check_init()
usb_commands[C_FLASHREPLY] = C_FLASHREPLY_S; usb_commands[C_FLASHREPLY] = C_FLASHREPLY_S;
usb_commands[C_REQUESTDETAILS] = C_REQUESTDETAILS_S; usb_commands[C_REQUESTDETAILS] = C_REQUESTDETAILS_S;
usb_commands[C_GETDETAILS] = C_GETDETAILS_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; stats_initialised = true;
} }
@ -759,6 +773,21 @@ const char *usb_cmdname(enum usb_cmds cmd)
return usb_commands[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 #ifndef WIN32
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>

7
usbutils.h

@ -125,6 +125,12 @@ enum usb_cmds {
C_FLASHREPLY, C_FLASHREPLY,
C_REQUESTDETAILS, C_REQUESTDETAILS,
C_GETDETAILS, C_GETDETAILS,
C_REQUESTRESULTS,
C_GETRESULTS,
C_REQUESTQUEJOB,
C_REQUESTQUEJOBSTATUS,
C_QUEJOB,
C_QUEJOBSTATUS,
C_MAX C_MAX
}; };
@ -133,6 +139,7 @@ struct cgpu_info;
void usb_all(int level); void usb_all(int level);
const char *usb_cmdname(enum usb_cmds cmd); 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); void usb_uninit(struct cgpu_info *cgpu);
bool usb_init(struct cgpu_info *cgpu, struct libusb_device *dev, struct usb_find_devices *found); 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 *)); void usb_detect(struct device_drv *drv, bool (*device_detect)(struct libusb_device *, struct usb_find_devices *));

Loading…
Cancel
Save