客戶經過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();
源碼