Browse Source

Use new get_work_status prototype and print FPGA CRC error counters to log

Pelle Nilsson 11 years ago
parent
commit
142bdb6705
3 changed files with 11 additions and 6 deletions
  1. 4 2
      driver-titan.c
  2. 6 3
      titan-asic.c
  3. 1 1
      titan-asic.h

+ 4 - 2
driver-titan.c

@@ -570,6 +570,7 @@ static void knc_titan_poll(struct thr_info * const thr)
 	struct knc_titan_die *die_p;
 	struct knc_titan_die *die_p;
 	struct timeval tv_now;
 	struct timeval tv_now;
 	int num_request_busy;
 	int num_request_busy;
+	int num_status_byte_error[4];
 	bool fpga_status_checked;
 	bool fpga_status_checked;
 
 
 	knc_titan_prune_local_queue(thr);
 	knc_titan_prune_local_queue(thr);
@@ -600,7 +601,7 @@ static void knc_titan_poll(struct thr_info * const thr)
 						/* Use FPGA accelerated unicasts */
 						/* Use FPGA accelerated unicasts */
 						if (!fpga_status_checked) {
 						if (!fpga_status_checked) {
 							timer_set_now(&knc->tv_prev);
 							timer_set_now(&knc->tv_prev);
-							knc_titan_get_work_status(first_proc->device->dev_repr, knc->ctx, asic, &num_request_busy);
+							knc_titan_get_work_status(first_proc->device->dev_repr, knc->ctx, asic, &num_request_busy, num_status_byte_error);
 							fpga_status_checked = true;
 							fpga_status_checked = true;
 						}
 						}
 						if (num_request_busy == 0) {
 						if (num_request_busy == 0) {
@@ -611,11 +612,12 @@ static void knc_titan_poll(struct thr_info * const thr)
 					}
 					}
 				} else {
 				} else {
 					if (knc->asic_served_by_fpga[asic]) {
 					if (knc->asic_served_by_fpga[asic]) {
-						knc_titan_get_work_status(first_proc->device->dev_repr, knc->ctx, asic, &num_request_busy);
+						knc_titan_get_work_status(first_proc->device->dev_repr, knc->ctx, asic, &num_request_busy, num_status_byte_error);
 						if (num_request_busy == 0) {
 						if (num_request_busy == 0) {
 							timer_set_now(&tv_now);
 							timer_set_now(&tv_now);
 							double diff = ((tv_now.tv_sec - knc->tv_prev.tv_sec) * 1000000.0 + (tv_now.tv_usec - knc->tv_prev.tv_usec)) / 1000000.0;
 							double diff = ((tv_now.tv_sec - knc->tv_prev.tv_sec) * 1000000.0 + (tv_now.tv_usec - knc->tv_prev.tv_usec)) / 1000000.0;
 							applog(LOG_INFO, "%s: Flush took %f secs for ASIC %d", knc_titan_drv.dname, diff, asic);
 							applog(LOG_INFO, "%s: Flush took %f secs for ASIC %d", knc_titan_drv.dname, diff, asic);
+							applog(LOG_DEBUG, "FPGA CRC error counters: %d %d %d %d", num_status_byte_error[0], num_status_byte_error[1], num_status_byte_error[2], num_status_byte_error[3]);
 							knc->asic_served_by_fpga[asic] = false;
 							knc->asic_served_by_fpga[asic] = false;
 						}
 						}
 					}
 					}

+ 6 - 3
titan-asic.c

@@ -189,14 +189,15 @@ bool knc_titan_set_work_parallel(const char *repr, void * const ctx, int asic, i
 	return true;
 	return true;
 }
 }
 
 
-bool knc_titan_get_work_status(const char *repr, void * const ctx, int asic, int *num_request_busy)
+bool knc_titan_get_work_status(const char *repr, void * const ctx, int asic, int *num_request_busy, int *num_status_byte_error)
 {
 {
 	uint8_t request[2];
 	uint8_t request[2];
 	int request_length;
 	int request_length;
-	int response_length = 4;
+	int response_length = 12;
 	uint8_t response[response_length];
 	uint8_t response[response_length];
 	int status;
 	int status;
 	uint8_t num_request_busy_byte;
 	uint8_t num_request_busy_byte;
+	uint16_t num_status_byte_error_counters[4];
 
 
 	request_length = knc_prepare_titan_work_status(request, asic);
 	request_length = knc_prepare_titan_work_status(request, asic);
 
 
@@ -206,12 +207,14 @@ bool knc_titan_get_work_status(const char *repr, void * const ctx, int asic, int
 		return false;
 		return false;
 	}
 	}
 
 
-	status = knc_decode_work_status(response + 2, &num_request_busy_byte);
+	status = knc_decode_work_status(response + 2, &num_request_busy_byte, num_status_byte_error_counters);
 	if (status) {
 	if (status) {
 		applog(LOG_INFO, "%s[%d]: get_work_status got undefined response", repr, asic);
 		applog(LOG_INFO, "%s[%d]: get_work_status got undefined response", repr, asic);
 		return false;
 		return false;
 	}
 	}
 
 
 	*num_request_busy = num_request_busy_byte;
 	*num_request_busy = num_request_busy_byte;
+	for (int i = 0 ; i < KNC_STATUS_BYTE_ERROR_COUNTERS ; i++)
+		num_status_byte_error[i] = num_status_byte_error_counters[i];
 	return true;
 	return true;
 }
 }

+ 1 - 1
titan-asic.h

@@ -39,6 +39,6 @@ bool knc_titan_get_report(const char *repr, void * const ctx, int channel, int d
 bool knc_titan_setup_core_local(const char *repr, void * const ctx, int channel, int die, int core, struct titan_setup_core_params *params);
 bool knc_titan_setup_core_local(const char *repr, void * const ctx, int channel, int die, int core, struct titan_setup_core_params *params);
 bool knc_titan_setup_spi(const char *repr, void * const ctx, int asic, int divider, int preclk, int declk, int sslowmin);
 bool knc_titan_setup_spi(const char *repr, void * const ctx, int asic, int divider, int preclk, int declk, int sslowmin);
 bool knc_titan_set_work_parallel(const char *repr, void * const ctx, int asic, int die, int core_start, int slot, struct work *work, bool urgent, int num, int resend);
 bool knc_titan_set_work_parallel(const char *repr, void * const ctx, int asic, int die, int core_start, int slot, struct work *work, bool urgent, int num, int resend);
-bool knc_titan_get_work_status(const char *repr, void * const ctx, int asic, int *num_request_busy);
+bool knc_titan_get_work_status(const char *repr, void * const ctx, int asic, int *num_request_busy, int *num_status_byte_error);
 
 
 #endif /* __TITAN_ASIC_H */
 #endif /* __TITAN_ASIC_H */