diff options
Diffstat (limited to 'ft2232_spi.c')
| -rw-r--r-- | ft2232_spi.c | 20 | 
1 files changed, 16 insertions, 4 deletions
diff --git a/ft2232_spi.c b/ft2232_spi.c index 17930ebe..aa007533 100644 --- a/ft2232_spi.c +++ b/ft2232_spi.c @@ -198,7 +198,8 @@ int ft2232_spi_send_command(unsigned int writecnt, unsigned int readcnt,  {  	struct ftdi_context *ftdic = &ftdic_context;  	static unsigned char *buf = NULL; -	int i = 0, ret = 0; +	/* failed is special. We use bitwise ops, but it is essentially bool. */ +	int i = 0, ret = 0, failed = 0;  	if (writecnt > 65536 || readcnt > 65536)  		return SPI_INVALID_LENGTH; @@ -237,6 +238,11 @@ int ft2232_spi_send_command(unsigned int writecnt, unsigned int readcnt,  		buf[i++] = (readcnt - 1) & 0xff;  		buf[i++] = ((readcnt - 1) >> 8) & 0xff;  		ret = send_buf(ftdic, buf, i); +		failed = ret; +		/* We can't abort here, we still have to deassert CS#. */ +		if (ret) +			fprintf(stderr, "send_buf failed before read: %i\n", +				ret);  		i = 0;  		if (ret == 0) {  			/* @@ -245,6 +251,10 @@ int ft2232_spi_send_command(unsigned int writecnt, unsigned int readcnt,  			 * command. We may be scheduled out etc.  			 */  			ret = get_buf(ftdic, readarr, readcnt); +			failed |= ret; +			/* We can't abort here either. */ +			if (ret) +				fprintf(stderr, "get_buf failed: %i\n", ret);  		}  	} @@ -252,10 +262,12 @@ int ft2232_spi_send_command(unsigned int writecnt, unsigned int readcnt,  	buf[i++] = SET_BITS_LOW;  	buf[i++] = CS_BIT;  	buf[i++] = 0x0b; -	if (send_buf(ftdic, buf, i)) -		return -1; +	ret = send_buf(ftdic, buf, i); +	failed |= ret; +	if (ret) +		fprintf(stderr, "send_buf failed at end: %i\n", ret); -	return ret; +	return failed ? -1 : 0;  }  int ft2232_spi_read(struct flashchip *flash, uint8_t *buf, int start, int len)  | 
