diff options
author | Michael Brown | 2013-10-31 15:09:43 +0100 |
---|---|---|
committer | Michael Brown | 2013-11-01 03:26:44 +0100 |
commit | 5c11ff630440b5ef6d1bfadab06e265f61312369 (patch) | |
tree | f0014ce8335637cd92f997c4bb301f9da723edb6 /src/net/netdevice.c | |
parent | [parseopt] Add parse_timeout() (diff) | |
download | ipxe-5c11ff630440b5ef6d1bfadab06e265f61312369.tar.gz ipxe-5c11ff630440b5ef6d1bfadab06e265f61312369.tar.xz ipxe-5c11ff630440b5ef6d1bfadab06e265f61312369.zip |
[netdevice] Make all net_driver methods optional
Most network upper-layer drivers do not implement all three methods
(probe, notify, and remove). Save code by making all methods
optional.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net/netdevice.c')
-rw-r--r-- | src/net/netdevice.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/net/netdevice.c b/src/net/netdevice.c index c7c86c1a..fcd1f7cf 100644 --- a/src/net/netdevice.c +++ b/src/net/netdevice.c @@ -90,8 +90,10 @@ static int netdev_has_ll_addr ( struct net_device *netdev ) { static void netdev_notify ( struct net_device *netdev ) { struct net_driver *driver; - for_each_table_entry ( driver, NET_DRIVERS ) - driver->notify ( netdev ); + for_each_table_entry ( driver, NET_DRIVERS ) { + if ( driver->notify ) + driver->notify ( netdev ); + } } /** @@ -535,7 +537,7 @@ int register_netdev ( struct net_device *netdev ) { /* Probe device */ for_each_table_entry ( driver, NET_DRIVERS ) { - if ( ( rc = driver->probe ( netdev ) ) != 0 ) { + if ( driver->probe && ( rc = driver->probe ( netdev ) ) != 0 ) { DBGC ( netdev, "NETDEV %s could not add %s device: " "%s\n", netdev->name, driver->name, strerror ( rc ) ); @@ -546,8 +548,10 @@ int register_netdev ( struct net_device *netdev ) { return 0; err_probe: - for_each_table_entry_continue_reverse ( driver, NET_DRIVERS ) - driver->remove ( netdev ); + for_each_table_entry_continue_reverse ( driver, NET_DRIVERS ) { + if ( driver->remove ) + driver->remove ( netdev ); + } clear_settings ( netdev_settings ( netdev ) ); unregister_settings ( netdev_settings ( netdev ) ); err_register_settings: @@ -629,8 +633,10 @@ void unregister_netdev ( struct net_device *netdev ) { netdev_close ( netdev ); /* Remove device */ - for_each_table_entry_reverse ( driver, NET_DRIVERS ) - driver->remove ( netdev ); + for_each_table_entry_reverse ( driver, NET_DRIVERS ) { + if ( driver->remove ) + driver->remove ( netdev ); + } /* Unregister per-netdev configuration settings */ clear_settings ( netdev_settings ( netdev ) ); |