Re: [PATCH] sungem: limit reaches -1, but 0 tested

From: Roel Kluin
Date: Sun Feb 01 2009 - 12:15:44 EST


David Miller wrote:
> From: Roel Kluin <roel.kluin@xxxxxxxxx>
> Date: Sat, 31 Jan 2009 13:42:36 +0100
>
>> With a postfix decrement these reach -1 rather than 0,
>> but after the loop it is tested to have become 0.
>>
>> Signed-off-by: Roel Kluin <roel.kluin@xxxxxxxxx>
>
> Just like the case just pointed out in your 'net' version
> of this patch, it is being tested "<= 0" so this fix
> is not necessary at all.

The change is correct although the changelog is not clear.
This is also true for the cassini patch, here included as well.

How about:

------------------>8----------------8<-------------------------
while (limit--)
if (test())
break;

if (limit <= 0)
goto test_failed;

In the last iteration, limit is decremented after the test to 0.
If just thereafter test() succeeds and a break occurs, the goto
still occurs because limit is 0.

Signed-off-by: Roel Kluin <roel.kluin@xxxxxxxxx>
---
drivers/net/cassini.c | 4 ++--
drivers/net/sungem_phy.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c
index 840b3d1..bbbc3bb 100644
--- a/drivers/net/cassini.c
+++ b/drivers/net/cassini.c
@@ -806,7 +806,7 @@ static int cas_reset_mii_phy(struct cas *cp)

cas_phy_write(cp, MII_BMCR, BMCR_RESET);
udelay(100);
- while (limit--) {
+ while (--limit) {
val = cas_phy_read(cp, MII_BMCR);
if ((val & BMCR_RESET) == 0)
break;
@@ -979,7 +979,7 @@ static void cas_phy_init(struct cas *cp)
writel(val, cp->regs + REG_PCS_MII_CTRL);

limit = STOP_TRIES;
- while (limit-- > 0) {
+ while (--limit > 0) {
udelay(10);
if ((readl(cp->regs + REG_PCS_MII_CTRL) &
PCS_MII_RESET) == 0)
diff --git a/drivers/net/sungem_phy.c b/drivers/net/sungem_phy.c
index 61843fd..78f8cee 100644
--- a/drivers/net/sungem_phy.c
+++ b/drivers/net/sungem_phy.c
@@ -79,7 +79,7 @@ static int reset_one_mii_phy(struct mii_phy* phy, int phy_id)

udelay(100);

- while (limit--) {
+ while (--limit) {
val = __phy_read(phy, phy_id, MII_BMCR);
if ((val & BMCR_RESET) == 0)
break;

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/