Browse Source

Merge branch 'master' into stratum

nfactor-troky
Con Kolivas 12 years ago
parent
commit
0a90207111
  1. 2
      API-README
  2. 18
      NEWS
  3. 2
      api.c
  4. 6
      cgminer.c
  5. 2
      configure.ac
  6. 5
      driver-bitforce.c
  7. 71
      driver-icarus.c
  8. 3
      driver-modminer.c
  9. 3
      findnonce.c
  10. 2
      fpgautils.c
  11. 4
      miner.h
  12. 8
      ocl.c

2
API-README

@ -383,7 +383,7 @@ miner.php - an example web page to access the API
Feature Changelog for external applications using the API: Feature Changelog for external applications using the API:
API V1.19 API V1.19 (cgminer v2.7.6)
Added API commands: Added API commands:
'debug' 'debug'

18
NEWS

@ -1,5 +1,23 @@
Version 2.7.7 - October 7, 2012
- Fix unused warnings on ming build.
- Fix sign warning in ocl.c
- fds need to be zeroed before set in modminer.
- Put scrypt warning on separate line to avoid 0 being shown on windows as
bufsize.
- Display correct pool number when block is found.
- Prevent corrupt values returned from the opencl code from trying to read
beyond the end of the buffer by masking the value to a max of 15.
- Icarus USB write failure is also a comms error
- api.c DEBUG message has no paramter
- Icarus catch more USB errors and close/reopen the port
- API-README update cgminer verison number
- hashmeter fix stats kh/s on 32bit windows
Version 2.7.6 - September 24, 2012 Version 2.7.6 - September 24, 2012
- Reorder libztex header include order to fix missing struct definition.
- Display share difficulty on log with a shortened hash display on submission. - Display share difficulty on log with a shortened hash display on submission.
- API stats add some pool getwork difficulty stats - API stats add some pool getwork difficulty stats
- Ignore any pings pushed to the worker threads if the thread is still paused to - Ignore any pings pushed to the worker threads if the thread is still paused to

2
api.c

@ -523,7 +523,7 @@ struct CODES {
{ SEVERITY_ERR, MSG_INVBOOL, PARAM_NONE, "Invalid parameter should be true or false" }, { SEVERITY_ERR, MSG_INVBOOL, PARAM_NONE, "Invalid parameter should be true or false" },
{ SEVERITY_SUCC, MSG_FOO, PARAM_BOOL, "Failover-Only set to %s" }, { SEVERITY_SUCC, MSG_FOO, PARAM_BOOL, "Failover-Only set to %s" },
{ SEVERITY_SUCC, MSG_MINECOIN,PARAM_NONE, "CGMiner coin" }, { SEVERITY_SUCC, MSG_MINECOIN,PARAM_NONE, "CGMiner coin" },
{ SEVERITY_SUCC, MSG_DEBUGSET,PARAM_STR, "Debug settings" }, { SEVERITY_SUCC, MSG_DEBUGSET,PARAM_NONE, "Debug settings" },
#ifdef HAVE_AN_FPGA #ifdef HAVE_AN_FPGA
{ SEVERITY_SUCC, MSG_PGAIDENT,PARAM_PGA, "Identify command sent to PGA%d" }, { SEVERITY_SUCC, MSG_PGAIDENT,PARAM_PGA, "Identify command sent to PGA%d" },
{ SEVERITY_WARN, MSG_PGANOID, PARAM_PGA, "PGA%d does not support identify" }, { SEVERITY_WARN, MSG_PGANOID, PARAM_PGA, "PGA%d does not support identify" },

6
cgminer.c

@ -2719,7 +2719,7 @@ static void check_solve(struct work *work)
work->pool->solved++; work->pool->solved++;
found_blocks++; found_blocks++;
work->mandatory = true; work->mandatory = true;
applog(LOG_NOTICE, "Found block for pool %d!", work->pool); applog(LOG_NOTICE, "Found block for pool %d!", work->pool->pool_no);
} }
#endif #endif
} }
@ -3946,7 +3946,7 @@ static inline void thread_reportout(struct thr_info *thr)
} }
static void hashmeter(int thr_id, struct timeval *diff, static void hashmeter(int thr_id, struct timeval *diff,
unsigned long long hashes_done) uint64_t hashes_done)
{ {
struct timeval temp_tv_end, total_diff; struct timeval temp_tv_end, total_diff;
double secs; double secs;
@ -3974,7 +3974,7 @@ static void hashmeter(int thr_id, struct timeval *diff,
double thread_rolling = 0.0; double thread_rolling = 0.0;
int i; int i;
applog(LOG_DEBUG, "[thread %d: %llu hashes, %.1f khash/sec]", applog(LOG_DEBUG, "[thread %d: %"PRIu64" hashes, %.1f khash/sec]",
thr_id, hashes_done, hashes_done / 1000 / secs); thr_id, hashes_done, hashes_done / 1000 / secs);
/* Rolling average for each thread and each device */ /* Rolling average for each thread and each device */

2
configure.ac

@ -2,7 +2,7 @@
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--## ##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
m4_define([v_maj], [2]) m4_define([v_maj], [2])
m4_define([v_min], [7]) m4_define([v_min], [7])
m4_define([v_mic], [6]) m4_define([v_mic], [7])
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--## ##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
m4_define([v_ver], [v_maj.v_min.v_mic]) m4_define([v_ver], [v_maj.v_min.v_mic])
m4_define([lt_rev], m4_eval(v_maj + v_min)) m4_define([lt_rev], m4_eval(v_maj + v_min))

5
driver-bitforce.c

@ -410,6 +410,11 @@ static bool bitforce_get_temp(struct cgpu_info *bitforce)
if ((!strncasecmp(pdevbuf, "TEMP", 4)) && (s = strchr(pdevbuf + 4, ':'))) { if ((!strncasecmp(pdevbuf, "TEMP", 4)) && (s = strchr(pdevbuf + 4, ':'))) {
float temp = strtof(s + 1, NULL); float temp = strtof(s + 1, NULL);
/* Cope with older software that breaks and reads nonsense
* values */
if (temp > 100)
temp = strtod(s + 1, NULL);
if (temp > 0) { if (temp > 0) {
bitforce->temp = temp; bitforce->temp = temp;
if (unlikely(bitforce->cutofftemp > 0 && temp > bitforce->cutofftemp)) { if (unlikely(bitforce->cutofftemp > 0 && temp > bitforce->cutofftemp)) {

71
driver-icarus.c

@ -225,6 +225,11 @@ static void rev(unsigned char *s, size_t l)
#define icarus_open2(devpath, baud, purge) serial_open(devpath, baud, ICARUS_READ_FAULT_DECISECONDS, purge) #define icarus_open2(devpath, baud, purge) serial_open(devpath, baud, ICARUS_READ_FAULT_DECISECONDS, purge)
#define icarus_open(devpath, baud) icarus_open2(devpath, baud, false) #define icarus_open(devpath, baud) icarus_open2(devpath, baud, false)
#define ICA_GETS_ERROR -1
#define ICA_GETS_OK 0
#define ICA_GETS_RESTART 1
#define ICA_GETS_TIMEOUT 2
static int icarus_gets(unsigned char *buf, int fd, struct timeval *tv_finish, struct thr_info *thr, int read_count) static int icarus_gets(unsigned char *buf, int fd, struct timeval *tv_finish, struct thr_info *thr, int read_count)
{ {
ssize_t ret = 0; ssize_t ret = 0;
@ -235,12 +240,14 @@ static int icarus_gets(unsigned char *buf, int fd, struct timeval *tv_finish, st
// Read reply 1 byte at a time to get earliest tv_finish // Read reply 1 byte at a time to get earliest tv_finish
while (true) { while (true) {
ret = read(fd, buf, 1); ret = read(fd, buf, 1);
if (ret < 0)
return ICA_GETS_ERROR;
if (first) if (first)
gettimeofday(tv_finish, NULL); gettimeofday(tv_finish, NULL);
if (ret >= read_amount) if (ret >= read_amount)
return 0; return ICA_GETS_OK;
if (ret > 0) { if (ret > 0) {
buf += ret; buf += ret;
@ -256,16 +263,16 @@ static int icarus_gets(unsigned char *buf, int fd, struct timeval *tv_finish, st
"Icarus Read: No data in %.2f seconds", "Icarus Read: No data in %.2f seconds",
(float)rc/(float)TIME_FACTOR); (float)rc/(float)TIME_FACTOR);
} }
return 1; return ICA_GETS_TIMEOUT;
} }
if (thr->work_restart) { if (thr && thr->work_restart) {
if (opt_debug) { if (opt_debug) {
applog(LOG_DEBUG, applog(LOG_DEBUG,
"Icarus Read: Work restart at %.2f seconds", "Icarus Read: Work restart at %.2f seconds",
(float)(rc)/(float)TIME_FACTOR); (float)(rc)/(float)TIME_FACTOR);
} }
return 1; return ICA_GETS_RESTART;
} }
} }
} }
@ -283,6 +290,13 @@ static int icarus_write(int fd, const void *buf, size_t bufLen)
#define icarus_close(fd) close(fd) #define icarus_close(fd) close(fd)
static void do_icarus_close(struct thr_info *thr)
{
struct cgpu_info *icarus = thr->cgpu;
icarus_close(icarus->device_fd);
icarus->device_fd = -1;
}
static const char *timing_mode_str(enum timing_mode timing_mode) static const char *timing_mode_str(enum timing_mode timing_mode)
{ {
switch(timing_mode) { switch(timing_mode) {
@ -535,10 +549,7 @@ static bool icarus_detect_one(const char *devpath)
gettimeofday(&tv_start, NULL); gettimeofday(&tv_start, NULL);
memset(nonce_bin, 0, sizeof(nonce_bin)); memset(nonce_bin, 0, sizeof(nonce_bin));
struct thr_info dummy = { icarus_gets(nonce_bin, fd, &tv_finish, NULL, 1);
.work_restart = false,
};
icarus_gets(nonce_bin, fd, &tv_finish, &dummy, 1);
icarus_close(fd); icarus_close(fd);
@ -565,6 +576,7 @@ static bool icarus_detect_one(const char *devpath)
icarus = calloc(1, sizeof(struct cgpu_info)); icarus = calloc(1, sizeof(struct cgpu_info));
icarus->api = &icarus_api; icarus->api = &icarus_api;
icarus->device_path = strdup(devpath); icarus->device_path = strdup(devpath);
icarus->device_fd = -1;
icarus->threads = 1; icarus->threads = 1;
add_cgpu(icarus); add_cgpu(icarus);
icarus_info = realloc(icarus_info, sizeof(struct ICARUS_INFO *) * (total_devices + 1)); icarus_info = realloc(icarus_info, sizeof(struct ICARUS_INFO *) * (total_devices + 1));
@ -609,6 +621,8 @@ static bool icarus_prepare(struct thr_info *thr)
struct timeval now; struct timeval now;
icarus->device_fd = -1;
int fd = icarus_open(icarus->device_path, icarus_info[icarus->device_id]->baud); int fd = icarus_open(icarus->device_path, icarus_info[icarus->device_id]->baud);
if (unlikely(-1 == fd)) { if (unlikely(-1 == fd)) {
applog(LOG_ERR, "Failed to open Icarus on %s", applog(LOG_ERR, "Failed to open Icarus on %s",
@ -655,6 +669,17 @@ static int64_t icarus_scanhash(struct thr_info *thr, struct work *work,
elapsed.tv_sec = elapsed.tv_usec = 0; elapsed.tv_sec = elapsed.tv_usec = 0;
icarus = thr->cgpu; icarus = thr->cgpu;
if (icarus->device_fd == -1)
if (!icarus_prepare(thr)) {
applog(LOG_ERR, "ICA%i: Comms error", icarus->device_id);
icarus->device_last_not_well = time(NULL);
icarus->device_not_well_reason = REASON_DEV_COMMS_ERROR;
icarus->dev_comms_error_count++;
// fail the device if the reopen attempt fails
return -1;
}
fd = icarus->device_fd; fd = icarus->device_fd;
memset(ob_bin, 0, sizeof(ob_bin)); memset(ob_bin, 0, sizeof(ob_bin));
@ -666,8 +691,14 @@ static int64_t icarus_scanhash(struct thr_info *thr, struct work *work,
tcflush(fd, TCOFLUSH); tcflush(fd, TCOFLUSH);
#endif #endif
ret = icarus_write(fd, ob_bin, sizeof(ob_bin)); ret = icarus_write(fd, ob_bin, sizeof(ob_bin));
if (ret) if (ret) {
return -1; /* This should never happen */ do_icarus_close(thr);
applog(LOG_ERR, "ICA%i: Comms error", icarus->device_id);
icarus->device_last_not_well = time(NULL);
icarus->device_not_well_reason = REASON_DEV_COMMS_ERROR;
icarus->dev_comms_error_count++;
return 0; /* This should never happen */
}
gettimeofday(&tv_start, NULL); gettimeofday(&tv_start, NULL);
@ -684,12 +715,19 @@ static int64_t icarus_scanhash(struct thr_info *thr, struct work *work,
memset(nonce_bin, 0, sizeof(nonce_bin)); memset(nonce_bin, 0, sizeof(nonce_bin));
info = icarus_info[icarus->device_id]; info = icarus_info[icarus->device_id];
ret = icarus_gets(nonce_bin, fd, &tv_finish, thr, info->read_count); ret = icarus_gets(nonce_bin, fd, &tv_finish, thr, info->read_count);
if (ret == ICA_GETS_ERROR) {
do_icarus_close(thr);
applog(LOG_ERR, "ICA%i: Comms error", icarus->device_id);
icarus->device_last_not_well = time(NULL);
icarus->device_not_well_reason = REASON_DEV_COMMS_ERROR;
icarus->dev_comms_error_count++;
return 0;
}
work->blk.nonce = 0xffffffff; work->blk.nonce = 0xffffffff;
memcpy((char *)&nonce, nonce_bin, sizeof(nonce_bin));
// aborted before becoming idle, get new work // aborted before becoming idle, get new work
if (nonce == 0 && ret) { if (ret == ICA_GETS_TIMEOUT || ret == ICA_GETS_RESTART) {
timersub(&tv_finish, &tv_start, &elapsed); timersub(&tv_finish, &tv_start, &elapsed);
// ONLY up to just when it aborted // ONLY up to just when it aborted
@ -711,6 +749,8 @@ static int64_t icarus_scanhash(struct thr_info *thr, struct work *work,
return estimate_hashes; return estimate_hashes;
} }
memcpy((char *)&nonce, nonce_bin, sizeof(nonce_bin));
#if !defined (__BIG_ENDIAN__) && !defined(MIPSEB) #if !defined (__BIG_ENDIAN__) && !defined(MIPSEB)
nonce = swab32(nonce); nonce = swab32(nonce);
#endif #endif
@ -719,6 +759,10 @@ static int64_t icarus_scanhash(struct thr_info *thr, struct work *work,
submit_nonce(thr, work, nonce); submit_nonce(thr, work, nonce);
was_hw_error = (curr_hw_errors > icarus->hw_errors); was_hw_error = (curr_hw_errors > icarus->hw_errors);
// Force a USB close/reopen on any hw error
if (was_hw_error)
do_icarus_close(thr);
hash_count = (nonce & info->nonce_mask); hash_count = (nonce & info->nonce_mask);
hash_count++; hash_count++;
hash_count *= info->fpga_count; hash_count *= info->fpga_count;
@ -864,8 +908,7 @@ static struct api_data *icarus_api_stats(struct cgpu_info *cgpu)
static void icarus_shutdown(struct thr_info *thr) static void icarus_shutdown(struct thr_info *thr)
{ {
struct cgpu_info *icarus = thr->cgpu; do_icarus_close(thr);
icarus_close(icarus->device_fd);
} }
struct device_api icarus_api = { struct device_api icarus_api = {

3
driver-modminer.c

@ -128,6 +128,7 @@ modminer_detect()
} while(0) } while(0)
#define status_read(eng) do { \ #define status_read(eng) do { \
FD_ZERO(&fds); \
FD_SET(fd, &fds); \ FD_SET(fd, &fds); \
select(fd+1, &fds, NULL, NULL, NULL); \ select(fd+1, &fds, NULL, NULL, NULL); \
if (1 != read(fd, buf, 1)) \ if (1 != read(fd, buf, 1)) \
@ -139,7 +140,7 @@ select(fd+1, &fds, NULL, NULL, NULL); \
static bool static bool
modminer_fpga_upload_bitstream(struct cgpu_info*modminer) modminer_fpga_upload_bitstream(struct cgpu_info*modminer)
{ {
fd_set fds; fd_set fds;
char buf[0x100]; char buf[0x100];
unsigned char *ubuf = (unsigned char*)buf; unsigned char *ubuf = (unsigned char*)buf;
unsigned long len; unsigned long len;

3
findnonce.c

@ -252,6 +252,9 @@ static void *postcalc_hash(void *userdata)
pthread_detach(pthread_self()); pthread_detach(pthread_self());
/* To prevent corrupt values in FOUND from trying to read beyond the
* end of the res[] array */
pcd->res[FOUND] &= FOUND;
for (entry = 0; entry < pcd->res[FOUND]; entry++) { for (entry = 0; entry < pcd->res[FOUND]; entry++) {
uint32_t nonce = pcd->res[entry]; uint32_t nonce = pcd->res[entry];

2
fpgautils.c

@ -74,7 +74,7 @@ int serial_autodetect_udev(__maybe_unused detectone_func_t detectone, __maybe_un
} }
#endif #endif
int serial_autodetect_devserial(detectone_func_t detectone, const char*prodname) int serial_autodetect_devserial(__maybe_unused detectone_func_t detectone, __maybe_unused const char*prodname)
{ {
#ifndef WIN32 #ifndef WIN32
DIR *D; DIR *D;

4
miner.h

@ -392,8 +392,8 @@ struct cgpu_info {
#ifdef USE_SCRYPT #ifdef USE_SCRYPT
int opt_lg, lookup_gap; int opt_lg, lookup_gap;
int opt_tc, thread_concurrency; size_t opt_tc, thread_concurrency;
int shaders; size_t shaders;
#endif #endif
struct timeval tv_gpustart; struct timeval tv_gpustart;
struct timeval tv_gpumid; struct timeval tv_gpumid;

8
ocl.c

@ -541,7 +541,7 @@ _clState *initCl(unsigned int gpu, char *name, size_t nameSize)
strcat(binaryfilename, "g"); strcat(binaryfilename, "g");
if (opt_scrypt) { if (opt_scrypt) {
#ifdef USE_SCRYPT #ifdef USE_SCRYPT
sprintf(numbuf, "lg%dtc%d", cgpu->lookup_gap, cgpu->thread_concurrency); sprintf(numbuf, "lg%utc%u", cgpu->lookup_gap, (unsigned int)cgpu->thread_concurrency);
strcat(binaryfilename, numbuf); strcat(binaryfilename, numbuf);
#endif #endif
} else { } else {
@ -614,7 +614,7 @@ build:
#ifdef USE_SCRYPT #ifdef USE_SCRYPT
if (opt_scrypt) if (opt_scrypt)
sprintf(CompilerOptions, "-D LOOKUP_GAP=%d -D CONCURRENT_THREADS=%d -D WORKSIZE=%d", sprintf(CompilerOptions, "-D LOOKUP_GAP=%d -D CONCURRENT_THREADS=%d -D WORKSIZE=%d",
cgpu->lookup_gap, cgpu->thread_concurrency, (int)clState->wsize); cgpu->lookup_gap, (unsigned int)cgpu->thread_concurrency, (int)clState->wsize);
else else
#endif #endif
{ {
@ -810,8 +810,8 @@ built:
/* Use the max alloc value which has been rounded to a power of /* Use the max alloc value which has been rounded to a power of
* 2 greater >= required amount earlier */ * 2 greater >= required amount earlier */
if (bufsize > cgpu->max_alloc) { if (bufsize > cgpu->max_alloc) {
applog(LOG_WARNING, "Maximum buffer memory device %d supports says %u, your scrypt settings come to %u", applog(LOG_WARNING, "Maximum buffer memory device %d supports says %u", gpu, cgpu->max_alloc);
gpu, cgpu->max_alloc, bufsize); applog(LOG_WARNING, "Your scrypt settings come to %u", bufsize);
} else } else
bufsize = cgpu->max_alloc; bufsize = cgpu->max_alloc;
applog(LOG_DEBUG, "Creating scrypt buffer sized %d", bufsize); applog(LOG_DEBUG, "Creating scrypt buffer sized %d", bufsize);

Loading…
Cancel
Save