On Sun, Jan 19, 2014 at 12:48:51AM +0100, Hans de Goede wrote:
> + timeout = 0x100000;
> + do {
> + reg_val = sunxi_getbits(reg_base + AHCI_PHYCS0R, 0x7, 28);
> + } while (--timeout && (reg_val != 0x2));
> + if (!timeout) {
> + dev_err(dev, "PHY power up failed.\n");
> + return -EIO;
> + }
This is not a good way to detect failure - there's several things wrong
here.
First, how long does sunxi_getbits() take? What does that depend on?
Therefore, how long does it take to time out?
Secondly, what if the success condition becomes true at the same time that
a timeout occurs?
So:
timeout = some_us_value;
do {
reg_val = sunxi_getbits(reg_base + AHCI_PHYCS0R, 0x7, 28);
if (reg_val == 2)
break;
timeout--;
if (timeout == 0) {
dev_err(dev, "PHY power up failed.\n");
return -EIO;
}
udelay(1);
} while (1);
is far more predictable. Same goes for the other loop in this function.
--
FTTC broadband for 0.8mile line: 5.8Mbps down 500kbps up. Estimation
in database were 13.1 to 19Mbit for a good line, about 7.5+ for a bad.
Estimate before purchase was "up to 13.2Mbit".
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html