static bool ztex_lowl_probe(const struct lowlevel_device_info * const info) { const char * const product = info->product; const char * const serial = info->serial; if (info->lowl != &lowl_usb) { bfg_probe_result_flags = BPR_WRONG_DEVTYPE; applog(LOG_DEBUG, "%s: Matched \"%s\" serial \"%s\", but lowlevel driver is not usb!", __func__, product, serial); return false; } libusb_device * const usbdev = info->lowl_data; const enum ztex_check_result err = libztex_checkDevice(usbdev); switch (err) { case CHECK_ERROR: applogr(false, LOG_ERR, "%s: Can not check device %s", ztex_drv.dname, info->devid); case CHECK_IS_NOT_ZTEX: return false; case CHECK_OK: break; case CHECK_RESCAN: bfg_need_detect_rescan = true; return false; } int fpgacount; struct libztex_device *ztex_master; struct cgpu_info *ztex; ztex_master = libztex_prepare_device2(usbdev); if (!ztex_master) applogr(false, LOG_ERR, "%s: libztex_prepare_device2 failed on %s", ztex_drv.dname, info->devid); if (bfg_claim_usb(&ztex_drv, true, ztex_master->usbbus, ztex_master->usbaddress)) return false; ztex_master->root = ztex_master; fpgacount = libztex_numberOfFpgas(ztex_master); ztex_master->handles = fpgacount; ztex = ztex_setup(ztex_master, fpgacount); if (fpgacount > 1) pthread_mutex_init(&ztex->device_ztex->mutex, NULL); return true; }
static void ztex_detect(void) { int cnt; int i,j; int fpgacount; struct libztex_dev_list **ztex_devices; struct libztex_device *ztex_slave; struct cgpu_info *ztex; cnt = libztex_scanDevices(&ztex_devices); if (cnt > 0) applog(LOG_WARNING, "Found %d ztex board%s", cnt, cnt > 1 ? "s" : ""); for (i = 0; i < cnt; i++) { ztex = calloc(1, sizeof(struct cgpu_info)); ztex->api = &ztex_api; ztex->device_ztex = ztex_devices[i]->dev; ztex->threads = 1; ztex->device_ztex->fpgaNum = 0; ztex->device_ztex->root = ztex->device_ztex; add_cgpu(ztex); fpgacount = libztex_numberOfFpgas(ztex->device_ztex); if (fpgacount > 1) pthread_mutex_init(&ztex->device_ztex->mutex, NULL); for (j = 1; j < fpgacount; j++) { ztex = calloc(1, sizeof(struct cgpu_info)); ztex->api = &ztex_api; ztex_slave = calloc(1, sizeof(struct libztex_device)); memcpy(ztex_slave, ztex_devices[i]->dev, sizeof(struct libztex_device)); ztex->device_ztex = ztex_slave; ztex->threads = 1; ztex_slave->fpgaNum = j; ztex_slave->root = ztex_devices[i]->dev; ztex_slave->repr[strlen(ztex_slave->repr) - 1] = ('1' + j); add_cgpu(ztex); } applog(LOG_WARNING,"%s: Found Ztex (fpga count = %d) , mark as %d", ztex->device_ztex->repr, fpgacount, ztex->device_id); } if (cnt > 0) libztex_freeDevList(ztex_devices); }