diff --git a/driver-avalon.c b/driver-avalon.c index 36d4fc77..b47bff66 100644 --- a/driver-avalon.c +++ b/driver-avalon.c @@ -1016,6 +1016,15 @@ static void *avalon_send_tasks(void *userdata) mutex_unlock(&info->lock); } + if (usb_ident(avalon) == IDENT_BTB) { + // Give other threads the chance to acquire qlock + i = 0; + do { + nmsleep(40); + } while (!avalon->shutdown && i++ < 15 + && avalon->queued < avalon_get_work_count); + } + mutex_lock(&info->qlock); start_count = avalon->work_array * avalon_get_work_count; end_count = start_count + avalon_get_work_count; diff --git a/driver-avalon.h b/driver-avalon.h index 562483b1..116e80fe 100644 --- a/driver-avalon.h +++ b/driver-avalon.h @@ -146,7 +146,7 @@ struct avalon_info { #define AVALON_WRITE_SIZE (sizeof(struct avalon_task)) #define AVALON_READ_SIZE (sizeof(struct avalon_result)) -#define AVALON_ARRAY_SIZE 3 +#define AVALON_ARRAY_SIZE 4 #define AVA_GETS_ERROR -1 #define AVA_GETS_OK 0