Add ethernet code safe for being called from a poller. Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> --- include/net.h | 8 ++++++++ net/eth.c | 26 ++++++++++++++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/include/net.h b/include/net.h index 6912a557b5..d7a1f4aaea 100644 --- a/include/net.h +++ b/include/net.h @@ -19,6 +19,7 @@ #include <stdlib.h> #include <clock.h> #include <led.h> +#include <slice.h> #include <xfuncs.h> #include <linux/phy.h> #include <linux/string.h> /* memcpy */ @@ -63,6 +64,8 @@ struct eth_device { char *bootarg; char *linuxdevname; + struct slice slice; + bool ifup; #define ETH_MODE_DHCP 0 #define ETH_MODE_STATIC 1 @@ -72,6 +75,11 @@ struct eth_device { #define dev_to_edev(d) container_of(d, struct eth_device, dev) +static inline struct slice *eth_device_slice(struct eth_device *edev) +{ + return &edev->slice; +} + static inline const char *eth_name(struct eth_device *edev) { return edev->devname; diff --git a/net/eth.c b/net/eth.c index 53d24baa16..6d36d05a6f 100644 --- a/net/eth.c +++ b/net/eth.c @@ -235,32 +235,44 @@ int eth_send(struct eth_device *edev, void *packet, int length) { int ret; + slice_acquire(eth_device_slice(edev)); + ret = eth_check_open(edev); if (ret) - return ret; + goto out; ret = eth_carrier_check(edev, 0); if (ret) - return ret; + goto out; led_trigger_network(LED_TRIGGER_NET_TX); - return edev->send(edev, packet, length); + ret = edev->send(edev, packet, length); +out: + slice_release(eth_device_slice(edev)); + + return ret; } static int __eth_rx(struct eth_device *edev) { int ret; + slice_acquire(eth_device_slice(edev)); + ret = eth_check_open(edev); if (ret) - return ret; + goto out; ret = eth_carrier_check(edev, 0); if (ret) - return ret; + goto out; - return edev->recv(edev); + ret = edev->recv(edev); +out: + slice_release(eth_device_slice(edev)); + + return ret; } int eth_rx(void) @@ -377,6 +389,8 @@ int eth_register(struct eth_device *edev) edev->dev.id = DEVICE_ID_DYNAMIC; } + slice_init(&edev->slice, dev); + ret = register_device(&edev->dev); if (ret) return ret; -- 2.25.1 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox