[U-Boot] [PATCH 1/1] efi_loader: completely initialize network

Heinrich Schuchardt xypron.glpk at gmx.de
Wed Apr 4 11:20:57 UTC 2018


On 04/04/2018 11:42 AM, Alexander Graf wrote:
> 
> 
> On 03.04.18 22:06, Heinrich Schuchardt wrote:
>> Add missing network initialization code.
>>
>> Before the patch the network was only usable if a network command like
>> dhcp or tftp had beed executed.
>>
>> This was visible when interrupting the console countdown and executing
>> bootefi selftest for vexpress_ca15_tc2_defconfig.
>>
>> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
>> ---
>>  lib/efi_loader/efi_net.c | 36 ++++++++++++++++++++++++++++++++++--
>>  1 file changed, 34 insertions(+), 2 deletions(-)
>>
>> diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c
>> index 3d860e658e..9afe76cdb3 100644
>> --- a/lib/efi_loader/efi_net.c
>> +++ b/lib/efi_loader/efi_net.c
>> @@ -54,14 +54,46 @@ static efi_status_t EFIAPI efi_net_stop(struct efi_simple_network *this)
>>  	return EFI_EXIT(EFI_SUCCESS);
>>  }
>>  
>> +/*
>> + * Initialize network adapter and allocate transmit and receive buffers.
>> + *
>> + * This function implements the Initialize service of the
>> + * EFI_SIMPLE_NETWORK_PROTOCOL. See the Unified Extensible Firmware Interface
>> + * (UEFI) specification for details.
>> + *
>> + * @this:	pointer to the protocol instance
>> + * @extra_rx:	extra receive buffer to be allocated
>> + * @extra_tx:	extra transmit buffer to be allocated
>> + * @return:	status code
>> + */
>>  static efi_status_t EFIAPI efi_net_initialize(struct efi_simple_network *this,
>>  					      ulong extra_rx, ulong extra_tx)
>>  {
>> +	int ret;
>> +	efi_status_t r = EFI_SUCCESS;
>> +
>>  	EFI_ENTRY("%p, %lx, %lx", this, extra_rx, extra_tx);
>>  
>> -	eth_init();
>> +	if (!this) {
>> +		r = EFI_INVALID_PARAMETER;
>> +		goto error;
>> +	}
>>  
>> -	return EFI_EXIT(EFI_SUCCESS);
>> +	/* Setup packet buffers */
>> +	net_init();
>> +	/* Disable hardware and put it into the reset state */
>> +	eth_halt();
>> +	/* Set current device according to environment variables */
>> +	eth_set_current();
> 
> Is there any way to do the above dance only when needed? Some network
> adapters can take quite a while to initialize and I'd prefer to not go
> through that when not absolutely necessary.
> 
> 
> Alex

Please, have a look at function net_loop() in net/net.c. This sequence
is always used if any network boot command is issued (except when
executing the network console).

The sequence is only executed when the EFI application requests to
initialize the network. So if you start grub.efi from disk you will not
have to wait for the network.

Best regards

Heinrich

> 
>> +	/* Get hardware ready for send and receive operations */
>> +	ret = eth_init();
>> +	if (ret < 0) {
>> +		eth_halt();
>> +		r = EFI_DEVICE_ERROR;
>> +	}
>> +
>> +error:
>> +	return EFI_EXIT(r);
>>  }
>>  
>>  static efi_status_t EFIAPI efi_net_reset(struct efi_simple_network *this,
>>
> 



More information about the U-Boot mailing list