This at least compiles now. Haven't separated out the EMBEDDED code yet.

pull/1/head
Michael Brown 2005-04-15 16:49:46 +00:00
parent 1bd7b97e5c
commit 8c082aa468
1 changed files with 241 additions and 252 deletions

View File

@ -69,13 +69,10 @@
#include "etherboot.h"
#include "nic.h"
#include "isa.h"
#include "console.h"
#include "cs89x0.h"
#ifndef EMBEDDED
static unsigned short eth_nic_base;
#else
static unsigned long eth_nic_base;
#endif
static unsigned long eth_mem_start;
static unsigned short eth_irqno;
static unsigned short eth_cs_type; /* one of: CS8900, CS8920, CS8920M */
@ -454,48 +451,46 @@ static void cs89x0_irq(struct nic *nic __unused, irq_action_t action __unused)
}
}
static struct nic_operations cs89x0_operations = {
.connect = dummy_connect,
.poll = cs89x0_poll,
.transmit = cs89x0_transmit,
.irq = cs89x0_irq,
.disable = cs89x0_disable,
};
/**************************************************************************
ETH_PROBE - Look for an adapter
***************************************************************************/
static int cs89x0_probe(struct dev *dev, unsigned short *probe_addrs __unused)
{
struct nic *nic = (struct nic *)dev;
static const unsigned int netcard_portlist[] = {
#ifdef CS_SCAN
CS_SCAN,
#else /* use "conservative" default values for autoprobing */
#ifndef EMBEDDED
0x300,0x320,0x340,0x200,0x220,0x240,
0x260,0x280,0x2a0,0x2c0,0x2e0,
/* if that did not work, then be more aggressive */
0x301,0x321,0x341,0x201,0x221,0x241,
0x261,0x281,0x2a1,0x2c1,0x2e1,
#else
0x01000300,
#endif
#endif
0};
int i, result = -1;
unsigned rev_type = 0, ioaddr, ioidx, isa_cnf, cs_revision;
unsigned short eeprom_buff[CHKSUM_LEN];
for (ioidx = 0; (ioaddr=netcard_portlist[ioidx++]) != 0; ) {
static int cs89x0_probe_addr ( uint16_t ioaddr ) {
/* if they give us an odd I/O address, then do ONE write to
the address port, to get it back to address zero, where we
expect to find the EISA signature word. */
if (ioaddr & 1) {
ioaddr &= ~1;
if ((inw(ioaddr + ADD_PORT) & ADD_MASK) != ADD_SIG)
continue;
return 0;
outw(PP_ChipID, ioaddr + ADD_PORT);
}
if (inw(ioaddr + DATA_PORT) != CHIP_EISA_ID_SIG)
continue;
eth_nic_base = ioaddr;
return 0;
return 1;
}
static int cs89x0_probe ( struct dev *dev, struct isa_device *isa ) {
struct nic *nic = nic_device ( dev );
int i, result = -1;
unsigned rev_type = 0, isa_cnf, cs_revision;
unsigned short eeprom_buff[CHKSUM_LEN];
nic->ioaddr = ( isa->ioaddr & ~1 );
nic->irqno = 0;
eth_nic_base = nic->ioaddr;
/* get the chip type */
rev_type = readreg(PRODUCT_ID_ADD);
@ -512,17 +507,18 @@ static int cs89x0_probe(struct dev *dev, unsigned short *probe_addrs __unused)
if ((readreg(PP_SelfST) & EEPROM_PRESENT) == 0) {
printf("\ncs: no EEPROM...\n");
outw(PP_ChipID, eth_nic_base + ADD_PORT);
continue; }
else if (get_eeprom_data(START_EEPROM_DATA,CHKSUM_LEN,
return 0;
} else if (get_eeprom_data(START_EEPROM_DATA,CHKSUM_LEN,
eeprom_buff) < 0) {
printf("\ncs: EEPROM read failed...\n");
outw(PP_ChipID, eth_nic_base + ADD_PORT);
continue; }
else if (get_eeprom_chksum(START_EEPROM_DATA,CHKSUM_LEN,
return 0;
} else if (get_eeprom_chksum(START_EEPROM_DATA,CHKSUM_LEN,
eeprom_buff) < 0) {
printf("\ncs: EEPROM checksum bad...\n");
outw(PP_ChipID, eth_nic_base + ADD_PORT);
continue; }
return 0;
}
/* get transmission control word but keep the
autonegotiation bits */
@ -605,7 +601,7 @@ static int cs89x0_probe(struct dev *dev, unsigned short *probe_addrs __unused)
writereg(PP_LineCTL, readreg(PP_LineCTL) &
~(SERIAL_TX_ON | SERIAL_RX_ON));
outw(PP_ChipID, eth_nic_base + ADD_PORT);
continue;
return 0;
}
#endif
/* Initialize the card for probing of the attached media */
@ -676,44 +672,37 @@ static int cs89x0_probe(struct dev *dev, unsigned short *probe_addrs __unused)
writereg(PP_LineCTL, readreg(PP_LineCTL) | SERIAL_RX_ON |
SERIAL_TX_ON);
break;
return 0;
#ifdef EMBEDDED
error:
writereg(PP_LineCTL, readreg(PP_LineCTL) &
~(SERIAL_TX_ON | SERIAL_RX_ON));
outw(PP_ChipID, eth_nic_base + ADD_PORT);
continue;
return 0;
#endif
}
if (ioaddr == 0)
return (0);
nic->irqno = 0;
nic->ioaddr = ioaddr;
static struct nic_operations cs89x0_operations;
static struct nic_operations cs89x0_operations = {
.connect = dummy_connect,
.poll = cs89x0_poll,
.transmit = cs89x0_transmit,
.irq = cs89x0_irq,
.disable = cs89x0_disable,
};
nic->nic_op = &cs89x0_operations;
/* Based on PnP ISA map */
dev->devid.vendor_id = htons(ISAPNP_VENDOR('C','S','C'));
dev->devid.device_id = htons(0x0007);
return 1;
}
static struct isa_driver cs89x0_driver __isa_driver = {
.type = NIC_DRIVER,
.name = "CS89x0",
.probe = cs89x0_probe,
.ioaddrs = 0,
static struct isa_probe_addr cs89x0_probe_addrs[] = {
#ifndef EMBEDDED
/* use "conservative" default values for autoprobing */
{ 0x300 }, { 0x320 }, { 0x340 }, { 0x200 }, { 0x220 }, { 0x240 },
{ 0x260 }, { 0x280 }, { 0x2a0 }, { 0x2c0 }, { 0x2e0 },
/* if that did not work, then be more aggressive */
{ 0x301 }, { 0x321 }, { 0x341 }, { 0x201 }, { 0x221 }, { 0x241 },
{ 0x261 }, { 0x281 }, { 0x2a1 }, { 0x2c1 }, { 0x2e1 },
#else
0x01000300,
#endif
};
ISA_ROM("cs89x0","Crystal Semiconductor CS89x0");
static struct isa_driver cs89x0_driver =
ISA_DRIVER ( "CS89x0", cs89x0_probe_addrs, cs89x0_probe_addr,
ISAPNP_VENDOR('C','S','C'), 0x0007 );
ISA_ROM ( "cs89x0", "Crystal Semiconductor CS89x0" );
/*
* Local variables: