static bool avalon2_detect_one(const char *devpath) { struct avalon2_info *info; int ackdetect; int fd; int tmp, i, modular[3]; char mm_version[AVA2_DEFAULT_MODULARS][16]; struct cgpu_info *avalon2; struct avalon2_pkg detect_pkg; struct avalon2_ret ret_pkg; applog(LOG_DEBUG, "Avalon2 Detect: Attempting to open %s", devpath); fd = avalon2_open(devpath, AVA2_IO_SPEED, true); if (unlikely(fd == -1)) { applog(LOG_ERR, "Avalon2 Detect: Failed to open %s", devpath); return false; } tcflush(fd, TCIOFLUSH); for (i = 0; i < AVA2_DEFAULT_MODULARS; i++) { modular[i] = 0; strcpy(mm_version[i], "NONE"); /* Send out detect pkg */ memset(detect_pkg.data, 0, AVA2_P_DATA_LEN); tmp = be32toh(i); memcpy(detect_pkg.data + 28, &tmp, 4); avalon2_init_pkg(&detect_pkg, AVA2_P_DETECT, 1, 1); avalon2_send_pkg(fd, &detect_pkg, NULL); ackdetect = avalon2_get_result(NULL, fd, &ret_pkg); applog(LOG_DEBUG, "Avalon2 Detect ID[%d]: %d", i, ackdetect); if (ackdetect != AVA2_P_ACKDETECT) continue; modular[i] = 1; memcpy(mm_version[i], ret_pkg.data, 15); mm_version[i][15] = '\0'; } if (!modular[0] && !modular[1] && !modular[2]) return false; /* We have a real Avalon! */ avalon2 = calloc(1, sizeof(struct cgpu_info)); avalon2->drv = &avalon2_drv; avalon2->device_path = strdup(devpath); avalon2->threads = AVA2_MINER_THREADS; add_cgpu(avalon2); applog(LOG_INFO, "Avalon2 Detect: Found at %s, mark as %d", devpath, avalon2->device_id); avalon2->device_data = calloc(sizeof(struct avalon2_info), 1); if (unlikely(!(avalon2->device_data))) quit(1, "Failed to malloc avalon2_info"); info = avalon2->device_data; strcpy(info->mm_version[0], mm_version[0]); strcpy(info->mm_version[1], mm_version[1]); strcpy(info->mm_version[2], mm_version[2]); info->baud = AVA2_IO_SPEED; info->fan_pwm = AVA2_DEFAULT_FAN_PWM; info->set_voltage = AVA2_DEFAULT_VOLTAGE_MIN; info->set_frequency = AVA2_DEFAULT_FREQUENCY; info->temp_max = 0; info->temp_history_index = 0; info->temp_sum = 0; info->temp_old = 0; info->modulars[0] = modular[0]; info->modulars[1] = modular[1]; info->modulars[2] = modular[2]; /* Enable modular */ info->fd = -1; /* Set asic to idle mode after detect */ avalon2_close(fd); return true; }
static bool avalon2_detect_one(const char *devpath) { struct avalon2_info *info; int ackdetect; int fd; int tmp, i, j, modular[AVA2_DEFAULT_MODULARS]; char mm_version[AVA2_DEFAULT_MODULARS][16]; struct cgpu_info *avalon2; struct avalon2_pkg detect_pkg; struct avalon2_ret ret_pkg; applog(LOG_DEBUG, "Avalon2 Detect: Attempting to open %s", devpath); fd = avalon2_open(devpath, AVA2_IO_SPEED, true); if (unlikely(fd == -1)) { applog(LOG_ERR, "Avalon2 Detect: Failed to open %s", devpath); return false; } tcflush(fd, TCIOFLUSH); for (i = 0; i < AVA2_DEFAULT_MODULARS; i++) modular[i] = 0; for (j = 0; j < 2; j++) { for (i = 0; i < AVA2_DEFAULT_MODULARS; i++) { strcpy(mm_version[i], AVA2_MM_VERNULL); /* Send out detect pkg */ memset(detect_pkg.data, 0, AVA2_P_DATA_LEN); tmp = be32toh(i); memcpy(detect_pkg.data + 28, &tmp, 4); avalon2_init_pkg(&detect_pkg, AVA2_P_DETECT, 1, 1); avalon2_send_pkg(fd, &detect_pkg, NULL); ackdetect = avalon2_get_result(NULL, fd, &ret_pkg); applog(LOG_DEBUG, "Avalon2 Detect ID[%d]: %d", i, ackdetect); if (ackdetect != AVA2_P_ACKDETECT && modular[i] == 0) continue; modular[i] = 1; memcpy(mm_version[i], ret_pkg.data, 15); mm_version[i][15] = '\0'; } } avalon2_close(fd); if (!modular[0] && !modular[1] && !modular[2] && !modular[3]) return false; /* We have a real Avalon! */ avalon2 = calloc(1, sizeof(struct cgpu_info)); avalon2->drv = &avalon2_drv; avalon2->device_path = strdup(devpath); avalon2->threads = AVA2_MINER_THREADS; add_cgpu(avalon2); applog(LOG_INFO, "Avalon2 Detect: Found at %s, mark as %d", devpath, avalon2->device_id); avalon2->device_data = calloc(sizeof(struct avalon2_info), 1); if (unlikely(!(avalon2->device_data))) quit(1, "Failed to malloc avalon2_info"); info = avalon2->device_data; info->fd = -1; info->baud = AVA2_IO_SPEED; info->fan_pwm = AVA2_DEFAULT_FAN_PWM; info->set_voltage = AVA2_DEFAULT_VOLTAGE_MIN; info->set_frequency = AVA2_DEFAULT_FREQUENCY; info->temp_max = 0; for (i = 0; i < AVA2_DEFAULT_MODULARS; i++) { strcpy(info->mm_version[i], mm_version[i]); info->modulars[i] = modular[i]; /* Enable modular */ info->enable[i] = modular[i]; info->dev_type[i] = AVA2_ID_AVAX; if (!strncmp((char *)&(info->mm_version[i]), AVA2_FW2_PREFIXSTR, 2)) info->dev_type[i] = AVA2_ID_AVA2; if (!strncmp((char *)&(info->mm_version[i]), AVA2_FW3_PREFIXSTR, 2)) info->dev_type[i] = AVA2_ID_AVA3; } pool_stratum.swork.job_id = NULL; pool_stratum.merkles = 0; return true; }