Skip to contentSkip to conversation

dz: test after postfix decrement fails in dz_console_putchar()

PATCH In review Roel Kluin 3 participants 4 messages Apr 9, 2008

lore
Share & tools
lore

Roel Kluin

author
#0 lore raw

PATCH 1/1 dz: test after postfix decrement fails in dz_console_putchar()

When loops reaches 0 the postfix decrement still subtracts, so the test fails

---

drivers/serial/dz.c +1 -1
index 116211f..0dddd68 100644
@@ -819,7 +819,7 @@ static void dz_console_putchar(struct uart_port *uport, int ch)
 		dz_out(dport, DZ_TCR, mask);
 		iob();
 		udelay(2);
-	} while (loops--);
+	} while (--loops);
 
 	if (loops)				/* Cannot send otherwise. */
 		dz_out(dport, DZ_TDR, ch);
#2 lore raw
In reply to Roel Kluin

Hi,

Quoted 9 lines · Roel Kluin

When loops reaches 0 the postfix decrement still subtracts, so the test fails

---

drivers/serial/dz.c +0 -0
index 116211f..0dddd68 100644

drivers/serial/dz.c static void dz_console_putchar(struct uart_port *uport, int ch) · line 822

Quoted 5 lines
drivers/serial/dz.c +1 -1
@@ -819,7 +819,7 @@ static void dz_console_putchar(struct uart_port *uport, int ch)
 		dz_out(dport, DZ_TCR, mask);
 		iob();
 		udelay(2);
-	} while (loops--);
+	} while (--loops);

It will run loops + 1 times. After your change it does run loops times.

drivers/serial/dz.c static void dz_console_putchar(struct uart_port *uport, int ch) · line 825

Quoted 2 lines
drivers/serial/dz.c +0 -0
 	if (loops)				/* Cannot send otherwise. */
 		dz_out(dport, DZ_TDR, ch);

The intention was probably that this gets executed if the break in the loop (trdy == dport->port.line) is reached. Without your fix, this branch is also taken if the while-loop terminates with loops == -1 because of the postfix dec.

Your fix is correct but your changelog entry is wrong.

Hannes

#3 lore raw
Quoted 4 lines · Johannes Weiner

The intention was probably that this gets executed if the break in the loop (trdy == dport->port.line) is reached. Without your fix, this branch is also taken if the while-loop terminates with loops == -1 because of the postfix dec.

You are right about the intention -- you cannot send a character to the
transmitter unless the intended line has been reported as selected for transmission by the serial controller. Otherwise it will go to the wrong line -- this is a serial multiplexer that selects transmission lines by itself.

It used to be the other kind of a "while" loop. This is a cut & paste
bug -- I noticed the problem with the terminating condition of the loop and correctly moved it to the end, but forgot to adjust the decrementation.

Quoted 1 line

Your fix is correct but your changelog entry is wrong.

s/fails/incorrectly succeeds/

Maciej