diff --git a/include/net.h b/include/net.h index 6912a55..509d1b3 100644 --- a/include/net.h +++ b/include/net.h @@ -80,7 +80,8 @@ int eth_register(struct eth_device* dev); /* Register network device */ void eth_unregister(struct eth_device* dev); /* Unregister network device */ int eth_set_ethaddr(struct eth_device *edev, const char *ethaddr); - +int eth_open(struct eth_device *edev); +void eth_close(struct eth_device *edev); int eth_send(struct eth_device *edev, void *packet, int length); /* Send a packet */ int eth_rx(void); /* Check for received packets */ diff --git a/net/dhcp.c b/net/dhcp.c index 670a6a6..a27fa89 100644 --- a/net/dhcp.c +++ b/net/dhcp.c @@ -609,6 +609,10 @@ struct dhcp_result *res; int ret; + ret = eth_open(edev); + if (ret) + return ret; + ret = dhcp_request(edev, param, &res); if (ret) return ret; diff --git a/net/eth.c b/net/eth.c index 53d24ba..4a8a7a8 100644 --- a/net/eth.c +++ b/net/eth.c @@ -211,33 +211,12 @@ return edev->phydev->link ? 0 : -ENETDOWN; } -/* - * Check if we have a current ethernet device and - * eventually open it if we have to. - */ -static int eth_check_open(struct eth_device *edev) -{ - int ret; - - if (edev->active) - return 0; - - ret = edev->open(edev); - if (ret) - return ret; - - edev->active = 1; - - return eth_carrier_check(edev, 1); -} - int eth_send(struct eth_device *edev, void *packet, int length) { int ret; - ret = eth_check_open(edev); - if (ret) - return ret; + if (!edev->active) + return -ENETDOWN; ret = eth_carrier_check(edev, 0); if (ret) @@ -252,10 +231,6 @@ { int ret; - ret = eth_check_open(edev); - if (ret) - return ret; - ret = eth_carrier_check(edev, 0); if (ret) return ret; @@ -422,6 +397,32 @@ return 0; } +int eth_open(struct eth_device *edev) +{ + int ret; + + if (edev->active) + return 0; + + ret = edev->open(edev); + if (!ret) + edev->active = 1; + + eth_carrier_check(edev, 1); + + return ret; +} + +void eth_close(struct eth_device *edev) +{ + if (!edev->active) + return; + + edev->halt(edev); + + edev->active = 0; +} + void eth_unregister(struct eth_device *edev) { if (edev->active) diff --git a/net/ifup.c b/net/ifup.c index d550f82..e5e8ef2 100644 --- a/net/ifup.c +++ b/net/ifup.c @@ -214,6 +214,10 @@ if (ret) return ret; + ret = eth_open(edev); + if (ret) + return ret; + if (edev->global_mode == ETH_MODE_DHCP) { if (IS_ENABLED(CONFIG_NET_DHCP)) { ret = dhcp(edev, NULL);