客户通过command line "ip=dhcp"打开dhcp,但是在网线没有连接的情况下,dhcp阻塞了启动过程。

就这个问题分析了$ksrc/net/ipv4/ipconfig.c,发现是因为其中retries被重复初始化,所以始终在retry hdcp。

进一步的改善是,如果发现网线没有连接的话,根本不运行dhcp,

!             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;
!                 }
!             }

另外,如果dhcp server不存在于网络的话,尝试连接的时间偏长,而源码中甚至进行了2次尝试。这种情况应该只针对于ic eepro100,而我们项目用的是ip3902,因此不需要做两次尝试。

所以,综合修改如下面的patch文件:

*** /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();