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>
This commit is contained in:
Stefan Weil 2010-03-02 22:37:43 +01:00 committed by Michael S. Tsirkin
parent 0908bba157
commit 6cded3a43a

View File

@ -20,7 +20,7 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>. * along with this program; if not, see <http://www.gnu.org/licenses/>.
* *
* Tested features (i82559): * Tested features (i82559):
* PXE boot (i386) no valid link * PXE boot (i386) ok
* Linux networking (i386) ok * Linux networking (i386) ok
* *
* Untested: * Untested:
@ -33,10 +33,6 @@
* Open Source Software Developer Manual * Open Source Software Developer Manual
*/ */
#if defined(TARGET_I386)
# warning "PXE boot still not working!"
#endif
#include <stddef.h> /* offsetof */ #include <stddef.h> /* offsetof */
#include <stdbool.h> #include <stdbool.h>
#include "hw.h" #include "hw.h"
@ -243,6 +239,17 @@ typedef struct {
bool has_extended_tcb_support; bool has_extended_tcb_support;
} EEPRO100State; } 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 */ /* Default values for MDI (PHY) registers */
static const uint16_t eepro100_mdi_default[] = { static const uint16_t eepro100_mdi_default[] = {
/* MDI Registers 0 - 6, 7 */ /* MDI Registers 0 - 6, 7 */
@ -632,9 +639,10 @@ static void nic_selective_reset(EEPRO100State * s)
uint16_t *eeprom_contents = eeprom93xx_data(s->eeprom); uint16_t *eeprom_contents = eeprom93xx_data(s->eeprom);
//~ eeprom93xx_reset(s->eeprom); //~ eeprom93xx_reset(s->eeprom);
memcpy(eeprom_contents, s->conf.macaddr.a, 6); memcpy(eeprom_contents, s->conf.macaddr.a, 6);
eeprom_contents[0xa] = 0x4000; eeprom_contents[EEPROM_ID] = 0x4000;
if (s->device == i82557B || s->device == i82557C) if (s->device == i82557B || s->device == i82557C)
eeprom_contents[5] = 0x0100; eeprom_contents[5] = 0x0100;
eeprom_contents[EEPROM_PHY_ID] = 1;
uint16_t sum = 0; uint16_t sum = 0;
for (i = 0; i < EEPROM_SIZE - 1; i++) { for (i = 0; i < EEPROM_SIZE - 1; i++) {
sum += eeprom_contents[i]; sum += eeprom_contents[i];