diff --git a/src/jtag/drivers/mpsse.c b/src/jtag/drivers/mpsse.c
index 063ef2ffb69bbf5fbd479105216e0e7802a72d4e..d6cbc8404c6e93330f3f38d6ed87317776b0e617 100644
--- a/src/jtag/drivers/mpsse.c
+++ b/src/jtag/drivers/mpsse.c
@@ -443,8 +443,8 @@ int mpsse_clock_data(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_off
 
 	while (length > 0) {
 		/* Guarantee buffer space enough for a minimum size transfer */
-		if (buffer_write_space(ctx) + (length < 8) < (out ? 4 : 3)
-		    || (in && buffer_read_space(ctx) < 1))
+		if (buffer_write_space(ctx) + (length < 8) < (out || (!out && !in) ? 4 : 3)
+				|| (in && buffer_read_space(ctx) < 1))
 			retval = mpsse_flush(ctx);
 
 		if (length < 8) {
@@ -465,8 +465,8 @@ int mpsse_clock_data(struct mpsse_ctx *ctx, const uint8_t *out, unsigned out_off
 			if (this_bytes > 65536)
 				this_bytes = 65536;
 			/* Buffer space limit. We already made sure there's space for the minimum
-			 *transfer. */
-			if (out && this_bytes + 3 > buffer_write_space(ctx))
+			 * transfer. */
+			if ((out || (!out && !in)) && this_bytes + 3 > buffer_write_space(ctx))
 				this_bytes = buffer_write_space(ctx) - 3;
 			if (in && this_bytes > buffer_read_space(ctx))
 				this_bytes = buffer_read_space(ctx);