netpoll: Fix carrier detection for drivers that are using phylib
authorAnton Vorontsov <avorontsov@ru.mvista.com>
Thu, 9 Jul 2009 03:09:44 +0000 (20:09 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 9 Jul 2009 03:09:44 +0000 (20:09 -0700)
Using early netconsole and gianfar driver this error pops up:

  netconsole: timeout waiting for carrier

It appears that net/core/netpoll.c:netpoll_setup() is using
cond_resched() in a loop waiting for a carrier.

The thing is that cond_resched() is a no-op when system_state !=
SYSTEM_RUNNING, and so drivers/net/phy/phy.c's state_queue is never
scheduled, therefore link detection doesn't work.

I belive that the main problem is in cond_resched()[1], but despite
how the cond_resched() story ends, it might be a good idea to call
msleep(1) instead of cond_resched(), as suggested by Andrew Morton.

[1] http://lkml.org/lkml/2009/7/7/463

Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/netpoll.c

index 9675f312830dd762bcd530eee90569de5a89b320..df30feb2fc725b047ef744273e7c506714bbac61 100644 (file)
@@ -740,7 +740,7 @@ int netpoll_setup(struct netpoll *np)
                                       np->name);
                                break;
                        }
-                       cond_resched();
+                       msleep(1);
                }
 
                /* If carrier appears to come up instantly, we don't