mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-05 02:51:00 +00:00
f59be6e850
Currently, the BOOTP code sends out its initial request as soon as the Ethernet driver indicates "link up". If this packet is lost or not replied to for some reason, the code waits for a 1s timeout before retrying. For some reason, such early packets are often lost on my system, so this causes an annoying delay. To optimize this, modify the BOOTP code to have very short timeouts for the first packet transmitted, but gradually increase the timeout each time a timeout occurs. This way, if the first packet is lost, the second packet is transmitted quite quickly and hence the overall delay is low. However, if there's still no response, we don't keep spewing out packets at an insane speed. It's arguably more correct to try and find out why the first packet is lost. However, it seems to disappear inside my Ethenet chip; the TX chip indicates no error during TX (not that it has much in the way of reporting...), yet wireshark on the RX side doesn't see any packet. FWIW, I'm using an ASIX USB Ethernet adapter. Perhaps "link up" is reported too early or based on the wrong condition in HW, and we should add some fixed extra delay into the driver. However, this would slow down every link up event even if it ends up not being needed in some cases. Having BOOTP retry quickly applies the fix/WAR to every possible Ethernet device, and is quite simple to implement, so seems a better solution. Signed-off-by: Stephen Warren <swarren@nvidia.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
94 lines
2.4 KiB
C
94 lines
2.4 KiB
C
/*
|
|
* Copied from LiMon - BOOTP.
|
|
*
|
|
* Copyright 1994, 1995, 2000 Neil Russell.
|
|
* (See License)
|
|
* Copyright 2000 Paolo Scaffardi
|
|
*/
|
|
|
|
#ifndef __BOOTP_H__
|
|
#define __BOOTP_H__
|
|
|
|
#ifndef __NET_H__
|
|
#include <net.h>
|
|
#endif /* __NET_H__ */
|
|
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
* BOOTP header.
|
|
*/
|
|
#if defined(CONFIG_CMD_DHCP)
|
|
/* Minimum DHCP Options size per RFC2131 - results in 576 byte pkt */
|
|
#define OPT_FIELD_SIZE 312
|
|
#if defined(CONFIG_BOOTP_VENDOREX)
|
|
extern u8 *dhcp_vendorex_prep(u8 *e); /*rtn new e after add own opts. */
|
|
extern u8 *dhcp_vendorex_proc(u8 *e); /*rtn next e if mine,else NULL */
|
|
#endif
|
|
#else
|
|
#define OPT_FIELD_SIZE 64
|
|
#endif
|
|
|
|
struct Bootp_t {
|
|
uchar bp_op; /* Operation */
|
|
# define OP_BOOTREQUEST 1
|
|
# define OP_BOOTREPLY 2
|
|
uchar bp_htype; /* Hardware type */
|
|
# define HWT_ETHER 1
|
|
uchar bp_hlen; /* Hardware address length */
|
|
# define HWL_ETHER 6
|
|
uchar bp_hops; /* Hop count (gateway thing) */
|
|
ulong bp_id; /* Transaction ID */
|
|
ushort bp_secs; /* Seconds since boot */
|
|
ushort bp_spare1; /* Alignment */
|
|
IPaddr_t bp_ciaddr; /* Client IP address */
|
|
IPaddr_t bp_yiaddr; /* Your (client) IP address */
|
|
IPaddr_t bp_siaddr; /* Server IP address */
|
|
IPaddr_t bp_giaddr; /* Gateway IP address */
|
|
uchar bp_chaddr[16]; /* Client hardware address */
|
|
char bp_sname[64]; /* Server host name */
|
|
char bp_file[128]; /* Boot file name */
|
|
char bp_vend[OPT_FIELD_SIZE]; /* Vendor information */
|
|
};
|
|
|
|
#define BOOTP_HDR_SIZE sizeof(struct Bootp_t)
|
|
|
|
/**********************************************************************/
|
|
/*
|
|
* Global functions and variables.
|
|
*/
|
|
|
|
/* bootp.c */
|
|
extern ulong BootpID; /* ID of cur BOOTP request */
|
|
extern char BootFile[128]; /* Boot file name */
|
|
extern int BootpTry;
|
|
|
|
|
|
/* Send a BOOTP request */
|
|
extern void BootpReset(void);
|
|
extern void BootpRequest(void);
|
|
|
|
/****************** DHCP Support *********************/
|
|
extern void DhcpRequest(void);
|
|
|
|
/* DHCP States */
|
|
typedef enum { INIT,
|
|
INIT_REBOOT,
|
|
REBOOTING,
|
|
SELECTING,
|
|
REQUESTING,
|
|
REBINDING,
|
|
BOUND,
|
|
RENEWING } dhcp_state_t;
|
|
|
|
#define DHCP_DISCOVER 1
|
|
#define DHCP_OFFER 2
|
|
#define DHCP_REQUEST 3
|
|
#define DHCP_DECLINE 4
|
|
#define DHCP_ACK 5
|
|
#define DHCP_NAK 6
|
|
#define DHCP_RELEASE 7
|
|
|
|
/**********************************************************************/
|
|
|
|
#endif /* __BOOTP_H__ */
|