~ubuntu-branches/ubuntu/trusty/ipxe/trusty

« back to all changes in this revision

Viewing changes to src/net/netdev_settings.c

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2013-11-26 17:50:47 UTC
  • mfrom: (1.2.2)
  • mto: This revision was merged to the branch mainline in revision 18.
  • Revision ID: package-import@ubuntu.com-20131126175047-rrtzcroy6yyz7lqp
Tags: upstream-1.0.0+git-20131111.c3d1e78
ImportĀ upstreamĀ versionĀ 1.0.0+git-20131111.c3d1e78

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
#include <ipxe/settings.h>
28
28
#include <ipxe/device.h>
29
29
#include <ipxe/netdevice.h>
 
30
#include <ipxe/init.h>
30
31
 
31
32
/** @file
32
33
 *
34
35
 *
35
36
 */
36
37
 
37
 
/** Network device named settings */
 
38
/** Network device predefined settings */
38
39
struct setting mac_setting __setting ( SETTING_NETDEV ) = {
39
40
        .name = "mac",
40
41
        .description = "MAC address",
41
42
        .type = &setting_type_hex,
42
43
};
 
44
struct setting bustype_setting __setting ( SETTING_NETDEV ) = {
 
45
        .name = "bustype",
 
46
        .description = "Bus type",
 
47
        .type = &setting_type_string,
 
48
};
 
49
struct setting busloc_setting __setting ( SETTING_NETDEV ) = {
 
50
        .name = "busloc",
 
51
        .description = "Bus location",
 
52
        .type = &setting_type_uint32,
 
53
};
43
54
struct setting busid_setting __setting ( SETTING_NETDEV ) = {
44
55
        .name = "busid",
45
56
        .description = "Bus ID",
94
105
}
95
106
 
96
107
/**
 
108
 * Fetch bus type setting
 
109
 *
 
110
 * @v netdev            Network device
 
111
 * @v data              Buffer to fill with setting data
 
112
 * @v len               Length of buffer
 
113
 * @ret len             Length of setting data, or negative error
 
114
 */
 
115
static int netdev_fetch_bustype ( struct net_device *netdev, void *data,
 
116
                                  size_t len ) {
 
117
        static const char *bustypes[] = {
 
118
                [BUS_TYPE_PCI] = "PCI",
 
119
                [BUS_TYPE_ISAPNP] = "ISAPNP",
 
120
                [BUS_TYPE_EISA] = "EISA",
 
121
                [BUS_TYPE_MCA] = "MCA",
 
122
                [BUS_TYPE_ISA] = "ISA",
 
123
                [BUS_TYPE_TAP] = "TAP",
 
124
        };
 
125
        struct device_description *desc = &netdev->dev->desc;
 
126
        const char *bustype;
 
127
 
 
128
        assert ( desc->bus_type < ( sizeof ( bustypes ) /
 
129
                                    sizeof ( bustypes[0] ) ) );
 
130
        bustype = bustypes[desc->bus_type];
 
131
        assert ( bustype != NULL );
 
132
        strncpy ( data, bustype, len );
 
133
        return strlen ( bustype );
 
134
}
 
135
 
 
136
/**
 
137
 * Fetch bus location setting
 
138
 *
 
139
 * @v netdev            Network device
 
140
 * @v data              Buffer to fill with setting data
 
141
 * @v len               Length of buffer
 
142
 * @ret len             Length of setting data, or negative error
 
143
 */
 
144
static int netdev_fetch_busloc ( struct net_device *netdev, void *data,
 
145
                                 size_t len ) {
 
146
        struct device_description *desc = &netdev->dev->desc;
 
147
        uint32_t busloc;
 
148
 
 
149
        busloc = cpu_to_be32 ( desc->location );
 
150
        if ( len > sizeof ( busloc ) )
 
151
                len = sizeof ( busloc );
 
152
        memcpy ( data, &busloc, len );
 
153
        return sizeof ( busloc );
 
154
}
 
155
 
 
156
/**
97
157
 * Fetch bus ID setting
98
158
 *
99
159
 * @v netdev            Network device
157
217
/** Network device settings */
158
218
static struct netdev_setting_operation netdev_setting_operations[] = {
159
219
        { &mac_setting, netdev_store_mac, netdev_fetch_mac },
 
220
        { &bustype_setting, NULL, netdev_fetch_bustype },
 
221
        { &busloc_setting, NULL, netdev_fetch_busloc },
160
222
        { &busid_setting, NULL, netdev_fetch_busid },
161
223
        { &chip_setting, NULL, netdev_fetch_chip },
162
224
};
235
297
        .fetch = netdev_fetch,
236
298
        .clear = netdev_clear,
237
299
};
 
300
 
 
301
/**
 
302
 * Redirect "netX" settings block
 
303
 *
 
304
 * @v settings          Settings block
 
305
 * @ret settings        Underlying settings block
 
306
 */
 
307
static struct settings * netdev_redirect ( struct settings *settings ) {
 
308
        struct net_device *netdev;
 
309
 
 
310
        /* Redirect to most recently opened network device */
 
311
        netdev = last_opened_netdev();
 
312
        if ( netdev ) {
 
313
                return netdev_settings ( netdev );
 
314
        } else {
 
315
                return settings;
 
316
        }
 
317
}
 
318
 
 
319
/** "netX" settings operations */
 
320
static struct settings_operations netdev_redirect_settings_operations = {
 
321
        .redirect = netdev_redirect,
 
322
};
 
323
 
 
324
/** "netX" settings */
 
325
static struct settings netdev_redirect_settings = {
 
326
        .refcnt = NULL,
 
327
        .siblings = LIST_HEAD_INIT ( netdev_redirect_settings.siblings ),
 
328
        .children = LIST_HEAD_INIT ( netdev_redirect_settings.children ),
 
329
        .op = &netdev_redirect_settings_operations,
 
330
};
 
331
 
 
332
/** Initialise "netX" settings */
 
333
static void netdev_redirect_settings_init ( void ) {
 
334
        int rc;
 
335
 
 
336
        if ( ( rc = register_settings ( &netdev_redirect_settings, NULL,
 
337
                                        "netX" ) ) != 0 ) {
 
338
                DBG ( "Could not register netX settings: %s\n",
 
339
                      strerror ( rc ) );
 
340
                return;
 
341
        }
 
342
}
 
343
 
 
344
/** "netX" settings initialiser */
 
345
struct init_fn netdev_redirect_settings_init_fn __init_fn ( INIT_LATE ) = {
 
346
        .initialise = netdev_redirect_settings_init,
 
347
};