客户经过command line "ip=dhcp"打开dhcp,可是在网线没有链接的状况下,dhcp阻塞了启动过程。linux
就这个问题分析了$ksrc/net/ipv4/ipconfig.c,发现是由于其中retries被重复初始化,因此始终在retry hdcp。网络
进一步的改善是,若是发现网线没有链接的话,根本不运行dhcp,ide
! for_each_netdev(&init_net, dev) {
! if( (strcmp(dev->name, "eth0") == 0) && (!netif_carrier_ok(dev)) )
! {
! printk("eth0: link down, do not run dhcp\n");
! return -1;
! }
! }ui
另外,若是dhcp server不存在于网络的话,尝试链接的时间偏长,而源码中甚至进行了2次尝试。这种状况应该只针对于ic eepro100,而咱们项目用的是ip3902,所以不须要作两次尝试。server
因此,综合修改以下面的patch文件:ip
*** /home/qianjiang/pls/oceanblue/stb225/build_STB236_NANDflash_HDdecoding/packages/linux-2.6.24.7_nxp/net/ipv4/ipconfig.c 2008-11-27 16:31:47.000000000 +0800
--- ipconfig.c 2010-08-25 18:03:45.766316864 +0800
***************
*** 92,98 ****
--- 92,102 ----
#define CONF_POST_OPEN 1 /* After opening: 1 second */
/* Define the timeout for waiting for a DHCP/BOOTP/RARP reply */
+ #ifdef CONFIG_EEPRO100
#define CONF_OPEN_RETRIES 2 /* (Re)open devices twice */
+ #else
+ #define CONF_OPEN_RETRIES 1
+ #endif
#define CONF_SEND_RETRIES 6 /* Send six requests per open */
#define CONF_INTER_TIMEOUT (HZ/2) /* Inter-device timeout: 1/2 second */
#define CONF_BASE_TIMEOUT (HZ*2) /* Initial timeout: 2 seconds */
***************
*** 1264,1269 ****
--- 1268,1278 ----
static int __init ip_auto_config(void)
{
__be32 addr;
+ struct net_device *dev;
+
+ #ifdef IPCONFIG_DYNAMIC
+ int retries = CONF_OPEN_RETRIES;
+ #endif
#ifdef CONFIG_PROC_FS
proc_net_fops_create(&init_net, "pnp", S_IRUGO, &pnp_seq_fops);
***************
*** 1272,1277 ****
--- 1281,1288 ----
if (!ic_enable)
return 0;
+
+
DBG(("IP-Config: Entered.\n"));
#ifdef IPCONFIG_DYNAMIC
try_try_again:
***************
*** 1316,1322 ****
ic_first_dev->next) {
#ifdef IPCONFIG_DYNAMIC
! int retries = CONF_OPEN_RETRIES;
if (ic_dynamic() < 0) {
ic_close_devs();
--- 1327,1339 ----
ic_first_dev->next) {
#ifdef IPCONFIG_DYNAMIC
! for_each_netdev(&init_net, dev) {
! if( (strcmp(dev->name, "eth0") == 0) && (!netif_carrier_ok(dev)) )
! {
! printk("eth0: link down, do not run dhcp\n");
! return -1;
! }
! }
if (ic_dynamic() < 0) {
ic_close_devs();
源码