summaryrefslogtreecommitdiffstats
path: root/src/net/netdev_settings.c
diff options
context:
space:
mode:
authorShao Miller2009-11-09 14:57:23 +0100
committerStefan Hajnoczi2009-12-14 18:54:53 +0100
commit177389fb73d3a7c883c76cbefd72ea598eb0a530 (patch)
tree1167f4989dc0db458dadc6d73814caa20bb85a0a /src/net/netdev_settings.c
parent[eepro100] Add missing FILE_LICENCE() to eepro100.h (diff)
downloadipxe-177389fb73d3a7c883c76cbefd72ea598eb0a530.tar.gz
ipxe-177389fb73d3a7c883c76cbefd72ea598eb0a530.tar.xz
ipxe-177389fb73d3a7c883c76cbefd72ea598eb0a530.zip
[settings] Add Bus ID setting
Users can find the bus type and PCI IDs for a network interface with: netX/busid Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Diffstat (limited to 'src/net/netdev_settings.c')
-rw-r--r--src/net/netdev_settings.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/net/netdev_settings.c b/src/net/netdev_settings.c
index b9220f5e..d814193b 100644
--- a/src/net/netdev_settings.c
+++ b/src/net/netdev_settings.c
@@ -20,8 +20,10 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <string.h>
#include <errno.h>
+#include <byteswap.h>
#include <gpxe/dhcp.h>
#include <gpxe/settings.h>
+#include <gpxe/device.h>
#include <gpxe/netdevice.h>
/** @file
@@ -36,6 +38,11 @@ struct setting mac_setting __setting = {
.description = "MAC address",
.type = &setting_type_hex,
};
+struct setting busid_setting __setting = {
+ .name = "busid",
+ .description = "Bus ID",
+ .type = &setting_type_hex,
+};
/**
* Store value of network device setting
@@ -74,6 +81,8 @@ static int netdev_fetch ( struct settings *settings, struct setting *setting,
void *data, size_t len ) {
struct net_device *netdev = container_of ( settings, struct net_device,
settings.settings );
+ struct device_description *desc = &netdev->dev->desc;
+ struct dhcp_netdev_desc dhcp_desc;
if ( setting_cmp ( setting, &mac_setting ) == 0 ) {
if ( len > netdev->ll_protocol->ll_addr_len )
@@ -81,6 +90,15 @@ static int netdev_fetch ( struct settings *settings, struct setting *setting,
memcpy ( data, netdev->ll_addr, len );
return netdev->ll_protocol->ll_addr_len;
}
+ if ( setting_cmp ( setting, &busid_setting ) == 0 ) {
+ dhcp_desc.type = desc->bus_type;
+ dhcp_desc.vendor = htons ( desc->vendor );
+ dhcp_desc.device = htons ( desc->device );
+ if ( len > sizeof ( dhcp_desc ) )
+ len = sizeof ( dhcp_desc );
+ memcpy ( data, &dhcp_desc, len );
+ return sizeof ( dhcp_desc );
+ }
return generic_settings_fetch ( settings, setting, data, len );
}