Browse Source

Merge branch 'dev_x6500' into bfgminer

Luke Dashjr 13 years ago
parent
commit
0d4dbc54de
2 changed files with 14 additions and 1 deletions
  1. 8 0
      driver-x6500.c
  2. 6 1
      ft232r.c

+ 8 - 0
driver-x6500.c

@@ -243,6 +243,7 @@ x6500_fpga_upload_bitstream(struct cgpu_info *x6500, struct jtag_port *jp1)
 		return false;
 	if (!ft232r_purge_buffers(ftdi, FTDI_PURGE_BOTH))
 		return false;
+	jp->a->bufread = 0;
 	jp->a->async = true;
 
 	ssize_t buflen;
@@ -266,6 +267,7 @@ x6500_fpga_upload_bitstream(struct cgpu_info *x6500, struct jtag_port *jp1)
 		return false;
 	if (!ft232r_purge_buffers(ftdi, FTDI_PURGE_BOTH))
 		return false;
+	jp->a->bufread = 0;
 	jp->a->async = false;
 	jp->a->bufread = 0;
 
@@ -588,6 +590,12 @@ int64_t x6500_process_results(struct thr_info *thr, struct work *work)
 				++hw_errors;
 				++x6500->hw_errors;
 				++imm_bad_nonces;
+
+				// Purge buffers just in case of read/write desync
+				mutex_lock(&x6500->device_mutex);
+				ft232r_purge_buffers(jtag->a->ftdi, FTDI_PURGE_BOTH);
+				mutex_unlock(&x6500->device_mutex);
+				jtag->a->bufread = 0;
 			}
 		}
 

+ 6 - 1
ft232r.c

@@ -219,9 +219,14 @@ void ft232r_close(struct ft232r_device_handle *dev)
 
 bool ft232r_purge_buffers(struct ft232r_device_handle *dev, enum ft232r_reset_purge purge)
 {
-	if (purge & FTDI_PURGE_RX)
+	if (ft232r_flush(dev) < 0)
+		return false;
+
+	if (purge & FTDI_PURGE_RX) {
 		if (libusb_control_transfer(dev->h, FTDI_REQTYPE_OUT, FTDI_REQUEST_RESET, FTDI_PURGE_RX, FTDI_INDEX, NULL, 0, FTDI_TIMEOUT))
 			return false;
+		dev->ibufLen = 0;
+	}
 	if (purge & FTDI_PURGE_TX)
 		if (libusb_control_transfer(dev->h, FTDI_REQTYPE_OUT, FTDI_REQUEST_RESET, FTDI_PURGE_TX, FTDI_INDEX, NULL, 0, FTDI_TIMEOUT))
 			return false;