/** * Fetch value of network device setting * * @v settings Settings block * @v setting Setting to fetch * @v data Setting data, or NULL to clear setting * @v len Length of setting data * @ret rc Return status code */ 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 ) len = netdev->ll_protocol->ll_addr_len; 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 ); }
/** * Generate EFI SNP questions * * @v snpdev SNP device * @v ifr IFR builder * @v varstore_id Variable store identifier */ static void efi_snp_hii_questions ( struct efi_snp_device *snpdev, struct efi_ifr_builder *ifr, unsigned int varstore_id ) { struct setting *setting; struct setting *previous = NULL; unsigned int name_id; unsigned int prompt_id; unsigned int help_id; unsigned int question_id; /* Add all applicable settings */ for_each_table_entry ( setting, SETTINGS ) { if ( ! efi_snp_hii_setting_applies ( snpdev, setting ) ) continue; if ( previous && ( setting_cmp ( setting, previous ) == 0 ) ) continue; previous = setting; name_id = efi_ifr_string ( ifr, "%s", setting->name ); prompt_id = efi_ifr_string ( ifr, "%s", setting->description ); help_id = efi_ifr_string ( ifr, PRODUCT_SETTING_URI, setting->name ); question_id = setting->tag; efi_ifr_string_op ( ifr, prompt_id, help_id, question_id, varstore_id, name_id, 0, 0x00, 0xff, 0 ); } }
/** * Store value of network device setting * * @v settings Settings block * @v setting Setting to store * @v data Setting data, or NULL to clear setting * @v len Length of setting data * @ret rc Return status code */ static int netdev_store ( struct settings *settings, struct setting *setting, const void *data, size_t len ) { struct net_device *netdev = container_of ( settings, struct net_device, settings.settings ); if ( setting_cmp ( setting, &mac_setting ) == 0 ) { if ( len != netdev->ll_protocol->ll_addr_len ) return -EINVAL; memcpy ( netdev->ll_addr, data, len ); return 0; } return generic_settings_store ( settings, setting, data, len ); }