Tangent:

I don't like the style used for the delay loops in azalia.c.

1. There's an off by one where 0 passes both conditionals. It's
unlikely this matters, but it's needless inconsistency.
2. I think i <= 0 is a dangerous idiom because any code refactor that
changes the variable in question to unsigned introduces an infinite
loop.

This can wait til after 5.5, but I made the diff since I was looking
at the code.

Index: azalia.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/azalia.c,v
retrieving revision 1.210
diff -u -p -r1.210 azalia.c
--- azalia.c    25 Feb 2014 18:40:37 -0000      1.210
+++ azalia.c    25 Feb 2014 20:02:20 -0000
@@ -771,26 +771,26 @@ azalia_reset(azalia_t *az)
        DPRINTF(("%s: resetting\n", __func__));
        gctl = AZ_READ_4(az, GCTL);
        AZ_WRITE_4(az, GCTL, gctl & ~HDA_GCTL_CRST);
-       for (i = 5000; i >= 0; i--) {
+       for (i = 5000; i > 0; i--) {
                DELAY(10);
                if ((AZ_READ_4(az, GCTL) & HDA_GCTL_CRST) == 0)
                        break;
        }
        DPRINTF(("%s: reset counter = %d\n", __func__, i));
-       if (i <= 0) {
+       if (i == 0) {
                DPRINTF(("%s: reset failure\n", XNAME(az)));
                return(ETIMEDOUT);
        }
        DELAY(1000);
        gctl = AZ_READ_4(az, GCTL);
        AZ_WRITE_4(az, GCTL, gctl | HDA_GCTL_CRST);
-       for (i = 5000; i >= 0; i--) {
+       for (i = 5000; i > 0; i--) {
                DELAY(10);
                if (AZ_READ_4(az, GCTL) & HDA_GCTL_CRST)
                        break;
        }
        DPRINTF(("%s: reset counter = %d\n", __func__, i));
-       if (i <= 0) {
+       if (i == 0) {
                DPRINTF(("%s: reset-exit failure\n", XNAME(az)));
                return(ETIMEDOUT);
        }
@@ -1016,13 +1016,13 @@ azalia_halt_corb(azalia_t *az)
        corbctl = AZ_READ_1(az, CORBCTL);
        if (corbctl & HDA_CORBCTL_CORBRUN) { /* running? */
                AZ_WRITE_1(az, CORBCTL, corbctl & ~HDA_CORBCTL_CORBRUN);
-               for (i = 5000; i >= 0; i--) {
+               for (i = 5000; i > 0; i--) {
                        DELAY(10);
                        corbctl = AZ_READ_1(az, CORBCTL);
                        if ((corbctl & HDA_CORBCTL_CORBRUN) == 0)
                                break;
                }
-               if (i <= 0) {
+               if (i == 0) {
                        DPRINTF(("%s: CORB is running\n", XNAME(az)));
                        return EBUSY;
                }
@@ -1061,13 +1061,13 @@ azalia_init_corb(azalia_t *az, int resum
        corbrp = AZ_READ_2(az, CORBRP);
        AZ_WRITE_2(az, CORBRP, corbrp | HDA_CORBRP_CORBRPRST);
        AZ_WRITE_2(az, CORBRP, corbrp & ~HDA_CORBRP_CORBRPRST);
-       for (i = 5000; i >= 0; i--) {
+       for (i = 5000; i > 0; i--) {
                DELAY(10);
                corbrp = AZ_READ_2(az, CORBRP);
                if ((corbrp & HDA_CORBRP_CORBRPRST) == 0)
                        break;
        }
-       if (i <= 0) {
+       if (i == 0) {
                DPRINTF(("%s: CORBRP reset failure\n", XNAME(az)));
                return -1;
        }
@@ -1093,13 +1093,13 @@ azalia_halt_rirb(azalia_t *az)
        rirbctl = AZ_READ_1(az, RIRBCTL);
        if (rirbctl & HDA_RIRBCTL_RIRBDMAEN) { /* running? */
                AZ_WRITE_1(az, RIRBCTL, rirbctl & ~HDA_RIRBCTL_RIRBDMAEN);
-               for (i = 5000; i >= 0; i--) {
+               for (i = 5000; i > 0; i--) {
                        DELAY(10);
                        rirbctl = AZ_READ_1(az, RIRBCTL);
                        if ((rirbctl & HDA_RIRBCTL_RIRBDMAEN) == 0)
                                break;
                }
-               if (i <= 0) {
+               if (i == 0) {
                        DPRINTF(("%s: RIRB is running\n", XNAME(az)));
                        return(EBUSY);
                }
@@ -1161,13 +1161,13 @@ azalia_init_rirb(azalia_t *az, int resum
        rirbctl = AZ_READ_1(az, RIRBCTL);
        AZ_WRITE_1(az, RIRBCTL, rirbctl |
            HDA_RIRBCTL_RIRBDMAEN | HDA_RIRBCTL_RINTCTL);
-       for (i = 5000; i >= 0; i--) {
+       for (i = 5000; i > 0; i--) {
                DELAY(10);
                rirbctl = AZ_READ_1(az, RIRBCTL);
                if (rirbctl & HDA_RIRBCTL_RIRBDMAEN)
                        break;
        }
-       if (i <= 0) {
+       if (i == 0) {
                DPRINTF(("%s: RIRB is not running\n", XNAME(az)));
                return(EBUSY);
        }
@@ -1244,7 +1244,7 @@ azalia_get_response(azalia_t *az, uint32
                        DELAY(10);
                        i--;
                }
-               if (i <= 0) {
+               if (i == 0) {
                        DPRINTF(("%s: RIRB time out\n", XNAME(az)));
                        return(ETIMEDOUT);
                }
@@ -3708,26 +3708,26 @@ azalia_stream_reset(stream_t *this)
        /* Start reset and wait for chip to enter. */
        ctl = STR_READ_2(this, CTL);
        STR_WRITE_2(this, CTL, ctl | HDA_SD_CTL_SRST);
-       for (i = 5000; i >= 0; i--) {
+       for (i = 5000; i > 0; i--) {
                DELAY(10);
                ctl = STR_READ_2(this, CTL);
                if (ctl & HDA_SD_CTL_SRST)
                        break;
        }
-       if (i <= 0) {
+       if (i == 0) {
                DPRINTF(("%s: stream reset failure 1\n", XNAME(this->az)));
                return -1;
        }
 
        /* Clear reset and wait for chip to finish */
        STR_WRITE_2(this, CTL, ctl & ~HDA_SD_CTL_SRST);
-       for (i = 5000; i >= 0; i--) {
+       for (i = 5000; i > 0; i--) {
                DELAY(10);
                ctl = STR_READ_2(this, CTL);
                if ((ctl & HDA_SD_CTL_SRST) == 0)
                        break;
        }
-       if (i <= 0) {
+       if (i == 0) {
                DPRINTF(("%s: stream reset failure 2\n", XNAME(this->az)));
                return -1;
        }

Reply via email to