Browse Source

add shutdown function

nfactor-troky
Xiangfu 13 years ago
parent
commit
706c4de111
  1. 42
      icarus.c

42
icarus.c

@ -52,7 +52,9 @@ @@ -52,7 +52,9 @@
#define ICARUS_READ_FAULT_COUNT (8)
int icarus_read_count;
static int icarus_read_count;
static int icarus_write_fault;
struct device_api icarus_api;
static void rev(unsigned char *s, size_t l)
@ -136,7 +138,7 @@ static void icarus_write(int fd, const void *buf, size_t bufLen) @@ -136,7 +138,7 @@ static void icarus_write(int fd, const void *buf, size_t bufLen)
ret = write(fd, buf, bufLen);
if (unlikely(ret != bufLen))
quit(1, "Icarus: Send data failed!");
icarus_write_fault = 1;
}
#define icarus_close(fd) close(fd)
@ -144,7 +146,6 @@ static void icarus_write(int fd, const void *buf, size_t bufLen) @@ -144,7 +146,6 @@ static void icarus_write(int fd, const void *buf, size_t bufLen)
static bool icarus_detect_one(const char *devpath)
{
int fd;
static int i = 0;
const unsigned char golden_ob[] =
"2db907f9cb4eb938ded904f4832c4331"
@ -189,12 +190,14 @@ static bool icarus_detect_one(const char *devpath) @@ -189,12 +190,14 @@ static bool icarus_detect_one(const char *devpath)
/* We have a real Icarus! */
struct cgpu_info *icarus;
icarus = calloc(1, sizeof(*icarus));
devices[total_devices++] = icarus;
icarus = calloc(1, sizeof(struct cgpu_info));
icarus->api = &icarus_api;
icarus->device_id = i++;
icarus->device_id = total_devices;
icarus->device_path = strdup(devpath);
icarus->threads = 1;
devices[total_devices++] = icarus;
icarus_write_fault = 0;
return true;
}
@ -209,7 +212,7 @@ static void icarus_detect() @@ -209,7 +212,7 @@ static void icarus_detect()
}
}
static bool icarus_thread_prepare(struct thr_info *thr)
static bool icarus_prepare(struct thr_info *thr)
{
struct cgpu_info *icarus = thr->cgpu;
@ -255,6 +258,8 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work, @@ -255,6 +258,8 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work,
tcflush(fd, TCOFLUSH);
#endif
icarus_write(fd, ob_bin, sizeof(ob_bin));
if (icarus_write_fault)
return 0; /* This should never happen */
ob_hex = bin2hex(ob_bin, sizeof(ob_bin));
if (ob_hex) {
@ -299,9 +304,30 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work, @@ -299,9 +304,30 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work,
return hash_count;
}
static void icarus_shutdown(struct thr_info *thr)
{
struct cgpu_info *icarus;
int fd;
if (thr->cgpu) {
icarus = thr->cgpu;
if (icarus->device_path)
free(icarus->device_path);
close(icarus->device_fd);
devices[icarus->device_id] = NULL;
free(icarus);
thr->cgpu = NULL;
}
}
struct device_api icarus_api = {
.name = "Icarus",
.api_detect = icarus_detect,
.thread_prepare = icarus_thread_prepare,
.thread_prepare = icarus_prepare,
.scanhash = icarus_scanhash,
.thread_shutdown = icarus_shutdown,
};

Loading…
Cancel
Save