mirror of https://github.com/ipxe/ipxe.git
[vmware] Use driver-private data to hold GuestInfo settings block
Simplify the per-netdevice GuestInfo settings code by using driver-private data to hold the settings block, instead of using a separate allocation. The settings block (if existent) will be automatically unregistered when the parent network device settings block is unregistered, and no longer needs to be separately freed. The guestinfo_net_remove() function may therefore be omitted completely. Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/1052/head
parent
8b1d34badf
commit
8cbf248198
|
@ -210,66 +210,32 @@ struct init_fn guestinfo_init_fn __init_fn ( INIT_NORMAL ) = {
|
||||||
* @v priv Private data
|
* @v priv Private data
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
static int guestinfo_net_probe ( struct net_device *netdev,
|
static int guestinfo_net_probe ( struct net_device *netdev, void *priv ) {
|
||||||
void *priv __unused ) {
|
struct settings *settings = priv;
|
||||||
struct settings *settings;
|
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* Do nothing unless we have a GuestInfo channel available */
|
/* Do nothing unless we have a GuestInfo channel available */
|
||||||
if ( guestinfo_channel < 0 )
|
if ( guestinfo_channel < 0 )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Allocate and initialise settings block */
|
/* Initialise and register settings */
|
||||||
settings = zalloc ( sizeof ( *settings ) );
|
settings_init ( settings, &guestinfo_settings_operations,
|
||||||
if ( ! settings ) {
|
&netdev->refcnt, NULL );
|
||||||
rc = -ENOMEM;
|
|
||||||
goto err_alloc;
|
|
||||||
}
|
|
||||||
settings_init ( settings, &guestinfo_settings_operations, NULL, NULL );
|
|
||||||
|
|
||||||
/* Register settings */
|
|
||||||
if ( ( rc = register_settings ( settings, netdev_settings ( netdev ),
|
if ( ( rc = register_settings ( settings, netdev_settings ( netdev ),
|
||||||
"vmware" ) ) != 0 ) {
|
"vmware" ) ) != 0 ) {
|
||||||
DBGC ( settings, "GuestInfo %p could not register for %s: %s\n",
|
DBGC ( settings, "GuestInfo %p could not register for %s: %s\n",
|
||||||
settings, netdev->name, strerror ( rc ) );
|
settings, netdev->name, strerror ( rc ) );
|
||||||
goto err_register;
|
return rc;
|
||||||
}
|
}
|
||||||
DBGC ( settings, "GuestInfo %p registered for %s\n",
|
DBGC ( settings, "GuestInfo %p registered for %s\n",
|
||||||
settings, netdev->name );
|
settings, netdev->name );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_register:
|
|
||||||
free ( settings );
|
|
||||||
err_alloc:
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove per-netdevice GuestInfo settings
|
|
||||||
*
|
|
||||||
* @v netdev Network device
|
|
||||||
* @v priv Private data
|
|
||||||
*/
|
|
||||||
static void guestinfo_net_remove ( struct net_device *netdev,
|
|
||||||
void *priv __unused ) {
|
|
||||||
struct settings *parent = netdev_settings ( netdev );
|
|
||||||
struct settings *settings;
|
|
||||||
|
|
||||||
list_for_each_entry ( settings, &parent->children, siblings ) {
|
|
||||||
if ( settings->op == &guestinfo_settings_operations ) {
|
|
||||||
DBGC ( settings, "GuestInfo %p unregistered for %s\n",
|
|
||||||
settings, netdev->name );
|
|
||||||
unregister_settings ( settings );
|
|
||||||
free ( settings );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** GuestInfo per-netdevice driver */
|
/** GuestInfo per-netdevice driver */
|
||||||
struct net_driver guestinfo_net_driver __net_driver = {
|
struct net_driver guestinfo_net_driver __net_driver = {
|
||||||
.name = "GuestInfo",
|
.name = "GuestInfo",
|
||||||
|
.priv_len = sizeof ( struct settings ),
|
||||||
.probe = guestinfo_net_probe,
|
.probe = guestinfo_net_probe,
|
||||||
.remove = guestinfo_net_remove,
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue