diff options
author | Stefan Weil <weil@mail.berlios.de> | 2010-03-02 22:37:43 +0100 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2010-03-03 13:33:50 +0200 |
commit | 6cded3a43ad0044d9831590795d9c6cf0dc2d2ee (patch) | |
tree | bcad208164e6aa739ea3492848ef380642324335 /hw/eepro100.c | |
parent | 0908bba1577d39bef09dd617b650d6dbd04ccf9e (diff) |
eepro100: Fix PXE boot
The phy handling was wrong for PXE, GPXE boot:
GPXE's eepro100 driver did not detect a valid link.
This is fixed here.
V2 - Use UPPER_CASE for enum values
Signed-off-by: Stefan Weil <weil@mail.berlios.de>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/eepro100.c')
-rw-r--r-- | hw/eepro100.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/hw/eepro100.c b/hw/eepro100.c index 124bc49528..f6764cc7fa 100644 --- a/hw/eepro100.c +++ b/hw/eepro100.c @@ -20,7 +20,7 @@ * along with this program; if not, see <http://www.gnu.org/licenses/>. * * Tested features (i82559): - * PXE boot (i386) no valid link + * PXE boot (i386) ok * Linux networking (i386) ok * * Untested: @@ -33,10 +33,6 @@ * Open Source Software Developer Manual */ -#if defined(TARGET_I386) -# warning "PXE boot still not working!" -#endif - #include <stddef.h> /* offsetof */ #include <stdbool.h> #include "hw.h" @@ -243,6 +239,17 @@ typedef struct { bool has_extended_tcb_support; } EEPRO100State; +/* Word indices in EEPROM. */ +typedef enum { + EEPROM_CNFG_MDIX = 0x03, + EEPROM_ID = 0x05, + EEPROM_PHY_ID = 0x06, + EEPROM_VENDOR_ID = 0x0c, + EEPROM_CONFIG_ASF = 0x0d, + EEPROM_DEVICE_ID = 0x23, + EEPROM_SMBUS_ADDR = 0x90, +} EEPROMOffset; + /* Default values for MDI (PHY) registers */ static const uint16_t eepro100_mdi_default[] = { /* MDI Registers 0 - 6, 7 */ @@ -632,9 +639,10 @@ static void nic_selective_reset(EEPRO100State * s) uint16_t *eeprom_contents = eeprom93xx_data(s->eeprom); //~ eeprom93xx_reset(s->eeprom); memcpy(eeprom_contents, s->conf.macaddr.a, 6); - eeprom_contents[0xa] = 0x4000; + eeprom_contents[EEPROM_ID] = 0x4000; if (s->device == i82557B || s->device == i82557C) eeprom_contents[5] = 0x0100; + eeprom_contents[EEPROM_PHY_ID] = 1; uint16_t sum = 0; for (i = 0; i < EEPROM_SIZE - 1; i++) { sum += eeprom_contents[i]; |