dz: test after postfix decrement fails in dz_console_putchar()
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
@@ -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);
Quoted 2 lines · Roel Kluin
When loops reaches 0 the postfix decrement still subtracts, so the test fails
You are right -- thanks for spotting it!
Maciej
Hi,
Quoted 9 lines · Roel Kluin
When loops reaches 0 the postfix decrement still subtracts, so the test fails
Signed-off-by Roel Kluin <[email protected]>---
drivers/serial/dz.c +0
-0
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
-0if (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
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