Commit 84eb1fba authored by Joe Hershberger's avatar Joe Hershberger Committed by Simon Glass
Browse files

net: Refactor in preparation for driver model



Move some things around and organize things so that the driver model
implementation will fit in more easily.
Signed-off-by: default avatarJoe Hershberger <joe.hershberger@ni.com>
Reviewed-by: default avatarSimon Glass <sjg@chromium.org>
parent ff997432
......@@ -97,13 +97,9 @@ struct eth_device {
void *priv;
};
int eth_initialize(bd_t *bis); /* Initialize network subsystem */
int eth_register(struct eth_device *dev);/* Register network device */
int eth_unregister(struct eth_device *dev);/* Remove network device */
void eth_try_another(int first_restart); /* Change the device */
void eth_set_current(void); /* set nterface to ethcur var */
/* get the current device MAC */
extern struct eth_device *eth_current;
static inline __attribute__((always_inline))
......@@ -111,7 +107,10 @@ struct eth_device *eth_get_dev(void)
{
return eth_current;
}
struct eth_device *eth_get_dev_by_name(const char *devname);
struct eth_device *eth_get_dev_by_index(int index); /* get dev @ index */
/* get the current device MAC */
static inline unsigned char *eth_get_ethaddr(void)
{
if (eth_current)
......@@ -119,8 +118,37 @@ static inline unsigned char *eth_get_ethaddr(void)
return NULL;
}
struct eth_device *eth_get_dev_by_name(const char *devname);
struct eth_device *eth_get_dev_by_index(int index); /* get dev @ index */
/* Set active state */
static inline __attribute__((always_inline)) int eth_init_state_only(bd_t *bis)
{
eth_get_dev()->state = ETH_STATE_ACTIVE;
return 0;
}
/* Set passive state */
static inline __attribute__((always_inline)) void eth_halt_state_only(void)
{
eth_get_dev()->state = ETH_STATE_PASSIVE;
}
/*
* Set the hardware address for an ethernet interface based on 'eth%daddr'
* environment variable (or just 'ethaddr' if eth_number is 0).
* Args:
* base_name - base name for device (normally "eth")
* eth_number - value of %d (0 for first device of this type)
* Returns:
* 0 is success, non-zero is error status from driver.
*/
int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
int eth_number);
int usb_eth_initialize(bd_t *bi);
int eth_initialize(bd_t *bis); /* Initialize network subsystem */
void eth_try_another(int first_restart); /* Change the device */
void eth_set_current(void); /* set nterface to ethcur var */
int eth_get_dev_index(void); /* get the device index */
void eth_parse_enetaddr(const char *addr, uchar *enetaddr);
int eth_getenv_enetaddr(char *name, uchar *enetaddr);
......@@ -138,7 +166,6 @@ int eth_setenv_enetaddr(char *name, const uchar *enetaddr);
int eth_getenv_enetaddr_by_index(const char *base_name, int index,
uchar *enetaddr);
int usb_eth_initialize(bd_t *bi);
int eth_init(bd_t *bis); /* Initialize the device */
int eth_send(void *packet, int length); /* Send a packet */
......@@ -148,32 +175,7 @@ extern void (*push_packet)(void *packet, int length);
#endif
int eth_rx(void); /* Check for received packets */
void eth_halt(void); /* stop SCC */
char *eth_get_name(void); /* get name of current device */
/* Set active state */
static inline __attribute__((always_inline)) int eth_init_state_only(bd_t *bis)
{
eth_get_dev()->state = ETH_STATE_ACTIVE;
return 0;
}
/* Set passive state */
static inline __attribute__((always_inline)) void eth_halt_state_only(void)
{
eth_get_dev()->state = ETH_STATE_PASSIVE;
}
/*
* Set the hardware address for an ethernet interface based on 'eth%daddr'
* environment variable (or just 'ethaddr' if eth_number is 0).
* Args:
* base_name - base name for device (normally "eth")
* eth_number - value of %d (0 for first device of this type)
* Returns:
* 0 is success, non-zero is error status from driver.
*/
int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
int eth_number);
const char *eth_get_name(void); /* get name of current device */
#ifdef CONFIG_MCAST_TFTP
int eth_mcast_join(IPaddr_t mcast_addr, u8 join);
......
......@@ -55,6 +55,14 @@ static inline int eth_setenv_enetaddr_by_index(const char *base_name, int index,
return eth_setenv_enetaddr(enetvar, enetaddr);
}
static void eth_env_init(void)
{
const char *s;
s = getenv("bootfile");
if (s != NULL)
copy_filename(BootFile, s, sizeof(BootFile));
}
static int eth_mac_skip(int index)
{
......@@ -64,6 +72,8 @@ static int eth_mac_skip(int index)
return ((skip_state = getenv(enetvar)) != NULL);
}
static void eth_current_changed(void);
/*
* CPU and board-specific Ethernet initializations. Aliased function
* signals caller to move on
......@@ -87,6 +97,11 @@ static unsigned int eth_rcv_current, eth_rcv_last;
static struct eth_device *eth_devices;
struct eth_device *eth_current;
static void eth_set_current_to_next(void)
{
eth_current = eth_current->next;
}
struct eth_device *eth_get_dev_by_name(const char *devname)
{
struct eth_device *dev, *target_dev;
......@@ -137,22 +152,6 @@ int eth_get_dev_index(void)
return eth_current->index;
}
static void eth_current_changed(void)
{
char *act = getenv("ethact");
/* update current ethernet name */
if (eth_current) {
if (act == NULL || strcmp(act, eth_current->name) != 0)
setenv("ethact", eth_current->name);
}
/*
* remove the variable completely if there is no active
* interface
*/
else if (act != NULL)
setenv("ethact", NULL);
}
int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
int eth_number)
{
......@@ -251,14 +250,6 @@ int eth_unregister(struct eth_device *dev)
return 0;
}
static void eth_env_init(bd_t *bis)
{
const char *s;
if ((s = getenv("bootfile")) != NULL)
copy_filename(BootFile, s, sizeof(BootFile));
}
int eth_initialize(bd_t *bis)
{
int num_devices = 0;
......@@ -274,7 +265,7 @@ int eth_initialize(bd_t *bis)
phy_init();
#endif
eth_env_init(bis);
eth_env_init();
/*
* If board-specific initialization exists, call it.
......@@ -479,6 +470,22 @@ int eth_receive(void *packet, int length)
}
#endif /* CONFIG_API */
static void eth_current_changed(void)
{
char *act = getenv("ethact");
/* update current ethernet name */
if (eth_get_dev()) {
if (act == NULL || strcmp(act, eth_get_name()) != 0)
setenv("ethact", eth_get_name());
}
/*
* remove the variable completely if there is no active
* interface
*/
else if (act != NULL)
setenv("ethact", NULL);
}
void eth_try_another(int first_restart)
{
static struct eth_device *first_failed;
......@@ -492,17 +499,17 @@ void eth_try_another(int first_restart)
if ((ethrotate != NULL) && (strcmp(ethrotate, "no") == 0))
return;
if (!eth_current)
if (!eth_get_dev())
return;
if (first_restart)
first_failed = eth_current;
first_failed = eth_get_dev();
eth_current = eth_current->next;
eth_set_current_to_next();
eth_current_changed();
if (first_failed == eth_current)
if (first_failed == eth_get_dev())
NetRestartWrap = 1;
}
......@@ -513,7 +520,7 @@ void eth_set_current(void)
struct eth_device *old_current;
int env_id;
if (!eth_current) /* XXX no current */
if (!eth_get_dev()) /* XXX no current */
return;
env_id = get_env_id();
......@@ -522,18 +529,18 @@ void eth_set_current(void)
env_changed_id = env_id;
}
if (act != NULL) {
old_current = eth_current;
old_current = eth_get_dev();
do {
if (strcmp(eth_current->name, act) == 0)
if (strcmp(eth_get_name(), act) == 0)
return;
eth_current = eth_current->next;
} while (old_current != eth_current);
eth_set_current_to_next();
} while (old_current != eth_get_dev());
}
eth_current_changed();
}
char *eth_get_name(void)
const char *eth_get_name(void)
{
return eth_current ? eth_current->name : "unknown";
return eth_get_dev() ? eth_get_dev()->name : "unknown";
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment