Re: [PATCH 1/5] forcedeth: mgmt unit interface
From: Andrew Morton <akpm@linux-foundation.org>
Date: 2009-01-30 22:36:24
On Fri, 30 Jan 2009 13:56:26 -0500 Ayaz Abdulla [off-list ref] wrote:
+static int nv_mgmt_get_version(struct net_device *dev)
+{
+ struct fe_priv *np = netdev_priv(dev);
+ u8 __iomem *base = get_hwbase(dev);
+ u32 data_ready = readl(base + NvRegTransmitterControl);
+ u32 data_ready2;
+ int i;
+
+ writel(NVREG_MGMTUNITGETVERSION, base + NvRegMgmtUnitGetVersion);
+ writel(data_ready ^ NVREG_XMITCTL_DATA_START, base + NvRegTransmitterControl);
+ for (i = 0; i < 100000; i++) {
+ data_ready2 = readl(base + NvRegTransmitterControl);
+ if ((data_ready & NVREG_XMITCTL_DATA_READY) != (data_ready2 & NVREG_XMITCTL_DATA_READY))
+ break;
+ udelay(50);
+ }
+
+ if (i == 100000 || (data_ready2 & NVREG_XMITCTL_DATA_ERROR))
+ return 0;
+
+ np->mgmt_version = readl(base + NvRegMgmtUnitVersion) & NVREG_MGMTUNITVERSION;
+
+ return 1;
+}
A five second busy-wait still sucks :(
Why not do
start = jiffies;
while (time_before(jiffies, start + 5*HZ)) {
...
schedule_timeout_uninterruptible(1);
}
?