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:
parent
0908bba157
commit
6cded3a43a
@ -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];
|
||||||
|
Loading…
Reference in New Issue
Block a user