minion - zero the chip driver queue count just after flushing the chip queue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
diff --git a/driver-minion.c b/driver-minion.c
index cc39908..0c1bf0b 100644
--- a/driver-minion.c
+++ b/driver-minion.c
@@ -1776,7 +1776,7 @@ static void *minion_spi_write(void *userdata)
{
struct cgpu_info *minioncgpu = (struct cgpu_info *)userdata;
struct minion_info *minioninfo = (struct minion_info *)(minioncgpu->device_data);
- K_ITEM *item, *tail, *task;
+ K_ITEM *item, *tail, *task, *work;
TITEM *titem;
applog(MINION_LOG, "%s%i: SPI writing...",
@@ -1879,6 +1879,7 @@ static void *minion_spi_write(void *userdata)
minioncgpu->drv->name,
minioncgpu->device_id,
chip);
+
K_WLOCK(minioninfo->tfree_list);
task = k_get_head(minioninfo->tfree_list, MINION_FFL_HERE);
DATAT(task)->chip = chip;
@@ -1900,8 +1901,20 @@ static void *minion_spi_write(void *userdata)
}
}
break;
- case WRITE_ADDR(MINION_QUE_0):
case WRITE_ADDR(MINION_SYS_RSTN_CTL):
+ // Do this here after it has actually been flushed
+ if ((titem->wbuf[0] & SYS_RSTN_CTL_FLUSH) == SYS_RSTN_CTL_FLUSH) {
+ K_WLOCK(minioninfo->wwork_list);
+ work = minioninfo->wchip_list[titem->chip]->head;
+ while (work) {
+ DATAW(work)->stale = true;
+ work = work->next;
+ }
+ minioninfo->wchip_list[titem->chip]->count_up = 0;
+ K_WUNLOCK(minioninfo->wwork_list);
+ }
+ break;
+ case WRITE_ADDR(MINION_QUE_0):
default:
break;
}
@@ -2325,26 +2338,15 @@ static void *minion_results(void *userdata)
static void minion_flush_work(struct cgpu_info *minioncgpu)
{
struct minion_info *minioninfo = (struct minion_info *)(minioncgpu->device_data);
- K_ITEM *stale_unused_work, *prev_unused, *task, *prev_task, *work;
+ K_ITEM *stale_unused_work, *prev_unused, *task, *prev_task;
int i;
applog(MINION_LOG, "%s%i: flushing work",
minioncgpu->drv->name, minioncgpu->device_id);
- // set stale all wchip_list contents
// TODO: N.B. scanwork also gets work locks - which master thread calls flush?
K_WLOCK(minioninfo->wwork_list);
- for (i = 0; i < MINION_CHIPS; i++)
- if (minioninfo->chip[i]) {
- work = minioninfo->wchip_list[i]->head;
- while (work) {
- DATAW(work)->stale = true;
- work = work->next;
- }
- minioninfo->wchip_list[i]->count_up = 0;
- }
-
// Simply remove the whole unused wwork_list
stale_unused_work = minioninfo->wwork_list->tail;
if (stale_unused_work) {