提交 2f70c49e 编写于 作者: H Heiko Schocher 提交者: Ben Warren

netloop: speed up NetLoop

NetLoop polls every cycle with getenv some environment variables.
This is horribly slow, especially when the environment is big.

This patch reads only the environment variables in NetLoop,
when they were changed.

Also moved the init part of the NetLoop function in a seperate
function.
Signed-off-by: NHeiko Schocher <hs@denx.de>
Signed-off-by: NBen Warren <biggerbadderben@gmail.com>
上级 ad2d1639
...@@ -75,7 +75,12 @@ DECLARE_GLOBAL_DATA_PTR; ...@@ -75,7 +75,12 @@ DECLARE_GLOBAL_DATA_PTR;
static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE; static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE;
#define N_BAUDRATES (sizeof(baudrate_table) / sizeof(baudrate_table[0])) #define N_BAUDRATES (sizeof(baudrate_table) / sizeof(baudrate_table[0]))
static int env_id = 1;
int get_env_id (void)
{
return env_id;
}
/************************************************************************ /************************************************************************
* Command interface: print one or all environment variables * Command interface: print one or all environment variables
*/ */
...@@ -160,6 +165,7 @@ int _do_setenv (int flag, int argc, char *argv[]) ...@@ -160,6 +165,7 @@ int _do_setenv (int flag, int argc, char *argv[])
return 1; return 1;
} }
env_id++;
/* /*
* search if variable with this name already exists * search if variable with this name already exists
*/ */
......
...@@ -269,6 +269,7 @@ void forceenv (char *, char *); ...@@ -269,6 +269,7 @@ void forceenv (char *, char *);
#ifdef CONFIG_AUTO_COMPLETE #ifdef CONFIG_AUTO_COMPLETE
int env_complete(char *var, int maxv, char *cmdv[], int maxsz, char *buf); int env_complete(char *var, int maxv, char *cmdv[], int maxsz, char *buf);
#endif #endif
int get_env_id (void);
void pci_init (void); void pci_init (void);
void pci_init_board(void); void pci_init_board(void);
......
...@@ -28,6 +28,9 @@ ...@@ -28,6 +28,9 @@
#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI) #if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI)
static char *act = NULL;
static int env_changed_id = 0;
/* /*
* CPU and board-specific Ethernet initializations. Aliased function * CPU and board-specific Ethernet initializations. Aliased function
* signals caller to move on * signals caller to move on
...@@ -461,13 +464,17 @@ void eth_try_another(int first_restart) ...@@ -461,13 +464,17 @@ void eth_try_another(int first_restart)
#ifdef CONFIG_NET_MULTI #ifdef CONFIG_NET_MULTI
void eth_set_current(void) void eth_set_current(void)
{ {
char *act;
struct eth_device* old_current; struct eth_device* old_current;
int env_id;
if (!eth_current) /* XXX no current */ if (!eth_current) /* XXX no current */
return; return;
act = getenv("ethact"); env_id = get_env_id();
if ((act == NULL) || (env_changed_id != env_id)) {
act = getenv("ethact");
env_changed_id = env_id;
}
if (act != NULL) { if (act != NULL) {
old_current = eth_current; old_current = eth_current;
do { do {
......
...@@ -209,6 +209,8 @@ uchar NetArpWaitPacketBuf[PKTSIZE_ALIGN + PKTALIGN]; ...@@ -209,6 +209,8 @@ uchar NetArpWaitPacketBuf[PKTSIZE_ALIGN + PKTALIGN];
ulong NetArpWaitTimerStart; ulong NetArpWaitTimerStart;
int NetArpWaitTry; int NetArpWaitTry;
int env_changed_id = 0;
void ArpRequest (void) void ArpRequest (void)
{ {
int i; int i;
...@@ -276,6 +278,78 @@ void ArpTimeoutCheck(void) ...@@ -276,6 +278,78 @@ void ArpTimeoutCheck(void)
} }
} }
int
NetInitLoop(proto_t protocol)
{
bd_t *bd = gd->bd;
int env_id = get_env_id ();
/* update only when the environment has changed */
if (env_changed_id == env_id)
return 0;
switch (protocol) {
#if defined(CONFIG_CMD_NFS)
case NFS:
#endif
#if defined(CONFIG_CMD_PING)
case PING:
#endif
#if defined(CONFIG_CMD_SNTP)
case SNTP:
#endif
case NETCONS:
case TFTP:
NetCopyIP(&NetOurIP, &bd->bi_ip_addr);
NetOurGatewayIP = getenv_IPaddr ("gatewayip");
NetOurSubnetMask= getenv_IPaddr ("netmask");
NetOurVLAN = getenv_VLAN("vlan");
NetOurNativeVLAN = getenv_VLAN("nvlan");
switch (protocol) {
#if defined(CONFIG_CMD_NFS)
case NFS:
#endif
case NETCONS:
case TFTP:
NetServerIP = getenv_IPaddr ("serverip");
break;
#if defined(CONFIG_CMD_PING)
case PING:
/* nothing */
break;
#endif
#if defined(CONFIG_CMD_SNTP)
case SNTP:
/* nothing */
break;
#endif
default:
break;
}
break;
case BOOTP:
case RARP:
/*
* initialize our IP addr to 0 in order to accept ANY
* IP addr assigned to us by the BOOTP / RARP server
*/
NetOurIP = 0;
NetServerIP = getenv_IPaddr ("serverip");
NetOurVLAN = getenv_VLAN("vlan"); /* VLANs must be read */
NetOurNativeVLAN = getenv_VLAN("nvlan");
case CDP:
NetOurVLAN = getenv_VLAN("vlan"); /* VLANs must be read */
NetOurNativeVLAN = getenv_VLAN("nvlan");
break;
default:
break;
}
env_changed_id = env_id;
return 0;
}
/**********************************************************************/ /**********************************************************************/
/* /*
* Main network processing loop. * Main network processing loop.
...@@ -340,65 +414,7 @@ restart: ...@@ -340,65 +414,7 @@ restart:
* here on, this code is a state machine driven by received * here on, this code is a state machine driven by received
* packets and timer events. * packets and timer events.
*/ */
NetInitLoop(protocol);
switch (protocol) {
#if defined(CONFIG_CMD_NFS)
case NFS:
#endif
#if defined(CONFIG_CMD_PING)
case PING:
#endif
#if defined(CONFIG_CMD_SNTP)
case SNTP:
#endif
case NETCONS:
case TFTP:
NetCopyIP(&NetOurIP, &bd->bi_ip_addr);
NetOurGatewayIP = getenv_IPaddr ("gatewayip");
NetOurSubnetMask= getenv_IPaddr ("netmask");
NetOurVLAN = getenv_VLAN("vlan");
NetOurNativeVLAN = getenv_VLAN("nvlan");
switch (protocol) {
#if defined(CONFIG_CMD_NFS)
case NFS:
#endif
case NETCONS:
case TFTP:
NetServerIP = getenv_IPaddr ("serverip");
break;
#if defined(CONFIG_CMD_PING)
case PING:
/* nothing */
break;
#endif
#if defined(CONFIG_CMD_SNTP)
case SNTP:
/* nothing */
break;
#endif
default:
break;
}
break;
case BOOTP:
case RARP:
/*
* initialize our IP addr to 0 in order to accept ANY
* IP addr assigned to us by the BOOTP / RARP server
*/
NetOurIP = 0;
NetServerIP = getenv_IPaddr ("serverip");
NetOurVLAN = getenv_VLAN("vlan"); /* VLANs must be read */
NetOurNativeVLAN = getenv_VLAN("nvlan");
case CDP:
NetOurVLAN = getenv_VLAN("vlan"); /* VLANs must be read */
NetOurNativeVLAN = getenv_VLAN("nvlan");
break;
default:
break;
}
switch (net_check_prereq (protocol)) { switch (net_check_prereq (protocol)) {
case 1: case 1:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册