drivers: remove redundant PCI ID tables

- remove PCI tables where system.conf suffices
- remove drivers' ability to mess up NIC order
- fix dp8390 PCI enumeration
- convert ti1225 to instance model
- add system.conf entry for ti1225
This commit is contained in:
David van Moolenbroek 2012-03-07 00:49:16 +01:00
parent de45264c74
commit 5152cfd8bd
18 changed files with 118 additions and 707 deletions

View file

@ -1905,14 +1905,12 @@ PRIVATE void port_init(struct port_state *ps)
/*===========================================================================*
* ahci_probe *
*===========================================================================*/
PRIVATE int ahci_probe(int instance)
PRIVATE int ahci_probe(int skip)
{
/* Find a matching PCI device.
*/
int r, skip, devind;
int r, devind;
u16_t vid, did;
u8_t bcr, scr, pir;
u32_t t3;
pci_init();
@ -1920,25 +1918,7 @@ PRIVATE int ahci_probe(int instance)
if (r <= 0)
return -1;
skip = 0;
for (;;) {
/* Get the class register values. */
bcr = pci_attr_r8(devind, PCI_BCR);
scr = pci_attr_r8(devind, PCI_SCR);
pir = pci_attr_r8(devind, PCI_PIFR);
t3 = (bcr << 16) | (scr << 8) | pir;
/* If the device is a match, see if we have to leave it to
* another driver instance.
*/
if (t3 == PCI_T3_AHCI) {
if (skip == instance)
break;
skip++;
}
while (skip--) {
r = pci_next_dev(&devind, &vid, &did);
if (r <= 0)
return -1;

View file

@ -84,14 +84,6 @@ PRIVATE struct {
PRIVATE iovec_s_t iovec[NR_IOREQS];
PRIVATE struct {
u16_t vid;
u16_t did;
} pcitab[] = {
{ 0x1969, 0x2048 }, /* Attansic Technology Corp, L2 FastEthernet */
{ 0x0000, 0x0000 }
};
PRIVATE int instance;
/*===========================================================================*
@ -465,13 +457,13 @@ PRIVATE int atl2_setup(void)
/*===========================================================================*
* atl2_probe *
*===========================================================================*/
PRIVATE int atl2_probe(int instance)
PRIVATE int atl2_probe(int skip)
{
/* Find a matching PCI device.
*/
u16_t vid, did;
char *dname;
int i, r, devind, skip;
int r, devind;
pci_init();
@ -479,19 +471,7 @@ PRIVATE int atl2_probe(int instance)
if (r <= 0)
return -1;
skip = 0;
for (;;) {
for (i = 0; pcitab[i].vid != 0; i++)
if (pcitab[i].vid == vid && pcitab[i].did == did)
break;
if (pcitab[i].vid != 0) {
if (skip == instance) break;
skip++;
}
while (skip--) {
r = pci_next_dev(&devind, &vid, &did);
if (r <= 0)
return -1;

View file

@ -285,7 +285,8 @@ PRIVATE void do_watchdog(void *UNUSED(message))
return;
}
PRIVATE int de_probe(dpeth_t *dep, int skip){
PRIVATE int de_probe(dpeth_t *dep, int skip)
{
int i, r, devind;
u16_t vid, did, temp16;
@ -295,16 +296,8 @@ PRIVATE int de_probe(dpeth_t *dep, int skip){
if (r == 0)
return FALSE;
for(;;)
while (skip--)
{
if ( DEC21140A_VID == vid &&
DEC21140A_DID == did)
{
if (!skip)
break;
skip--;
}
r= pci_next_dev(&devind, &vid, &did);
if (!r)
return FALSE;

View file

@ -32,8 +32,6 @@ Created: 09/01/2009 Nicolas Tittley (first.last @ gmail DOT com)
#define DE_MIN_BASE_ADDR 0x0400
#define DE_SROM_EA_OFFSET 20
#define DE_SETUP_FRAME_SIZE 192
#define DEC21140A_VID 0x1011
#define DEC21140A_DID 0x0009
typedef struct iovec_dat_s {

View file

@ -324,11 +324,9 @@ void dp8390_dump()
*===========================================================================*/
static void pci_conf()
{
int confnr;
char envvar[16];
struct dpeth *dep;
static char envfmt[] = "*:d.d.d";
long v;
int i, pci_instance;
static int first_time= 1;
if (!first_time)
@ -337,30 +335,22 @@ static void pci_conf()
dep= &de_state;
/* Pick a default configuration for this instance. */
confnr= MIN(de_instance, DP_CONF_NR-1);
strcpy(envvar, "DPETH0");
envvar[5] += de_instance;
if (!(dep->de_pci= env_prefix(envvar, "pci")))
return; /* no PCI config */
v= 0;
(void) env_parse(envvar, envfmt, 1, &v, 0, 255);
dep->de_pcibus= v;
v= 0;
(void) env_parse(envvar, envfmt, 2, &v, 0, 255);
dep->de_pcidev= v;
v= 0;
(void) env_parse(envvar, envfmt, 3, &v, 0, 255);
dep->de_pcifunc= v;
if (!dep->de_pci) {
printf("%s: no pci for instance %d\n", dep->de_name,
de_instance);
return;
/* Count the number of dp instances before this one that are configured
* for PCI, so that we can skip that many when enumerating PCI devices.
*/
pci_instance= 0;
for (i= 0; i < de_instance; i++) {
envvar[5]= i;
if (env_prefix(envvar, "pci"))
pci_instance++;
}
if (!rtl_probe(dep, de_instance))
if (!rtl_probe(dep, pci_instance))
dep->de_pci= -1;
}
#endif /* ENABLE_PCI */

View file

@ -257,9 +257,6 @@ typedef struct dpeth
#if ENABLE_PCI
/* PCI config */
char de_pci; /* TRUE iff PCI device */
u8_t de_pcibus;
u8_t de_pcidev;
u8_t de_pcifunc;
#endif
/* Do it yourself send queue */

View file

@ -22,18 +22,6 @@ Created: April 2000 by Philip Homburg <philip@f-mnx.phicoh.com>
#if ENABLE_PCI
PRIVATE struct pcitab
{
u16_t vid;
u16_t did;
int checkclass;
} pcitab[]=
{
{ 0x10ec, 0x8029, 0 }, /* Realtek RTL8029 */
{ 0x0000, 0x0000, 0 }
};
_PROTOTYPE( static void rtl_init, (struct dpeth *dep) );
#if 0
_PROTOTYPE( static u16_t get_ee_word, (dpeth_t *dep, int a) );
@ -46,7 +34,7 @@ PUBLIC int rtl_probe(dep, skip)
struct dpeth *dep;
int skip;
{
int i, r, devind, just_one;
int r, devind;
u16_t vid, did;
u32_t bar;
u8_t ilr;
@ -54,58 +42,12 @@ int skip;
pci_init();
if ((dep->de_pcibus | dep->de_pcidev | dep->de_pcifunc) != 0)
{
/* Look for specific PCI device */
r= pci_find_dev(dep->de_pcibus, dep->de_pcidev,
dep->de_pcifunc, &devind);
if (r == 0)
{
printf("%s: no PCI found at %d.%d.%d\n",
dep->de_name, dep->de_pcibus,
dep->de_pcidev, dep->de_pcifunc);
return 0;
}
pci_ids(devind, &vid, &did);
just_one= TRUE;
}
else
{
r= pci_first_dev(&devind, &vid, &did);
if (r == 0)
return 0;
just_one= FALSE;
}
r= pci_first_dev(&devind, &vid, &did);
if (r == 0)
return 0;
for(;;)
while (skip--)
{
for (i= 0; pcitab[i].vid != 0 || pcitab[i].did != 0; i++)
{
if (pcitab[i].vid != vid)
continue;
if (pcitab[i].did != did)
continue;
if (pcitab[i].checkclass) {
panic("rtl_probe: class check not implemented");
}
break;
}
if (pcitab[i].vid != 0 || pcitab[i].did != 0) {
if (just_one || !skip)
break;
skip--;
}
if (just_one)
{
printf(
"%s: wrong PCI device (%04X/%04X) found at %d.%d.%d\n",
dep->de_name, vid, did,
dep->de_pcibus,
dep->de_pcidev, dep->de_pcifunc);
return 0;
}
r= pci_next_dev(&devind, &vid, &did);
if (!r)
return 0;

View file

@ -242,15 +242,11 @@ PRIVATE int e1000_probe(e1000_t *e, int skip)
return FALSE;
}
/* Loop devices on the PCI bus. */
for(;;)
while (skip--)
{
E1000_DEBUG(3, ("%s: probe() devind %d vid 0x%x did 0x%x\n",
e->name, devind, vid, did));
if (!skip)
break;
skip--;
if (!(r = pci_next_dev(&devind, &vid, &did)))
{
return FALSE;

View file

@ -40,25 +40,6 @@
/* Configuration */
#define FXP_ENVVAR "FXPETH"
struct pcitab
{
u16_t vid;
u16_t did;
int checkclass;
};
PRIVATE struct pcitab pcitab_fxp[]=
{
{ 0x8086, 0x1229, 0 }, /* Intel 82557, etc. */
{ 0x8086, 0x2449, 0 }, /* Intel 82801BA/BAM/CA/CAM */
{ 0x8086, 0x103d, 0 }, /* Intel 82801DB */
{ 0x8086, 0x1064, 0 }, /* Intel 82562 */
{ 0x8086, 0x1031, 0 }, /* Intel 82801CAM VE */
{ 0x8086, 0x1032, 0 }, /* Intel 82801CAM VE */
{ 0x8086, 0x1209, 0 }, /* Intel 82551IT */
{ 0x0000, 0x0000, 0 }
};
typedef int irq_hook_t;
/* ignore interrupt for the moment */
@ -116,9 +97,6 @@ typedef struct fxp
/* PCI related */
int fxp_seen; /* TRUE iff device available */
u8_t fxp_pcibus;
u8_t fxp_pcidev;
u8_t fxp_pcifunc;
/* 'large' items */
irq_hook_t fxp_hook;
@ -422,10 +400,7 @@ message *mp;
*===========================================================================*/
static void fxp_pci_conf()
{
static char envvar[] = FXP_ENVVAR "#";
fxp_t *fp;
long v;
fp= fxp_state;
@ -433,40 +408,9 @@ static void fxp_pci_conf()
fp->fxp_name[4] += fxp_instance;
fp->fxp_seen= FALSE;
fp->fxp_features= FFE_NONE;
envvar[sizeof(FXP_ENVVAR)-1]= '0'+fxp_instance;
#if 0
if (getenv(envvar) != NULL)
{
if (strcmp(getenv(envvar), "off") == 0)
{
fp->fxp_pcibus= 255;
}
if (!env_prefix(envvar, "pci"))
env_panic(envvar);
}
#endif
pci_init();
if (fp->fxp_pcibus == 255)
return;
v= 0;
#if 0
(void) env_parse(envvar, envfmt, 1, &v, 0, 255);
#endif
fp->fxp_pcibus= v;
v= 0;
#if 0
(void) env_parse(envvar, envfmt, 2, &v, 0, 255);
#endif
fp->fxp_pcidev= v;
v= 0;
#if 0
(void) env_parse(envvar, envfmt, 3, &v, 0, 255);
#endif
fp->fxp_pcifunc= v;
if (fxp_probe(fp, fxp_instance))
fp->fxp_seen= TRUE;
}
@ -476,65 +420,18 @@ static void fxp_pci_conf()
*===========================================================================*/
static int fxp_probe(fxp_t *fp, int skip)
{
int i, r, devind, just_one;
int r, devind;
u16_t vid, did;
u32_t bar;
u8_t ilr, rev;
char *dname, *str;
if ((fp->fxp_pcibus | fp->fxp_pcidev | fp->fxp_pcifunc) != 0)
{
/* Look for specific PCI device */
r= pci_find_dev(fp->fxp_pcibus, fp->fxp_pcidev,
fp->fxp_pcifunc, &devind);
if (r == 0)
{
printf("%s: no PCI device found at %d.%d.%d\n",
fp->fxp_name, fp->fxp_pcibus,
fp->fxp_pcidev, fp->fxp_pcifunc);
return FALSE;
}
pci_ids(devind, &vid, &did);
just_one= TRUE;
}
else
{
r= pci_first_dev(&devind, &vid, &did);
if (r == 0)
return FALSE;
just_one= FALSE;
}
r= pci_first_dev(&devind, &vid, &did);
if (r == 0)
return FALSE;
for(;;)
while (skip--)
{
for (i= 0; pcitab_fxp[i].vid != 0; i++)
{
if (pcitab_fxp[i].vid != vid)
continue;
if (pcitab_fxp[i].did != did)
continue;
if (pcitab_fxp[i].checkclass) {
panic("fxp_probe: class check not implemented");
}
break;
}
if (pcitab_fxp[i].vid != 0)
{
if (just_one || !skip)
break;
skip--;
}
if (just_one)
{
printf(
"%s: wrong PCI device (%04x/%04x) found at %d.%d.%d\n",
fp->fxp_name, vid, did,
fp->fxp_pcibus,
fp->fxp_pcidev, fp->fxp_pcifunc);
return FALSE;
}
r= pci_next_dev(&devind, &vid, &did);
if (!r)
return FALSE;

View file

@ -79,19 +79,6 @@ ec_conf_t ec_conf[EC_CONF_NR]= /* Card addresses */
{ 0x0000, 0, 0x00000, },
};
/* Actually, we use PCI-BIOS info. */
PRIVATE struct pcitab
{
u16_t vid;
u16_t did;
int checkclass;
} pcitab[]=
{
{ PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE, 0 }, /* AMD LANCE */
{ 0x0000, 0x0000, 0 }
};
/* General */
_PROTOTYPE( static void do_init, (message *mp) );
_PROTOTYPE( static void ec_init, (ether_card_t *ec) );
@ -1405,63 +1392,15 @@ int skip;
unsigned short pci_cmd;
unsigned short ioaddr;
int lance_version, chip_version;
int devind, just_one, i, r;
int devind, r;
u16_t vid, did;
if ((ec->ec_pcibus | ec->ec_pcidev | ec->ec_pcifunc) != 0)
{
/* Look for specific PCI device */
r= pci_find_dev(ec->ec_pcibus, ec->ec_pcidev,
ec->ec_pcifunc, &devind);
if (r == 0)
{
printf("%s: no PCI found at %d.%d.%d\n",
ec->port_name, ec->ec_pcibus,
ec->ec_pcidev, ec->ec_pcifunc);
return 0;
}
pci_ids(devind, &vid, &did);
just_one= TRUE;
}
else
{
r= pci_first_dev(&devind, &vid, &did);
if (r == 0)
return 0;
just_one= FALSE;
}
r= pci_first_dev(&devind, &vid, &did);
if (r == 0)
return 0;
for(;;)
while (skip--)
{
for (i= 0; pcitab[i].vid != 0; i++)
{
if (pcitab[i].vid != vid)
continue;
if (pcitab[i].did != did)
continue;
if (pcitab[i].checkclass) {
panic("class check not implemented");
}
break;
}
if (pcitab[i].vid != 0)
{
if (just_one || !skip)
break;
skip--;
}
if (just_one)
{
printf(
"%s: wrong PCI device (%04x/%04x) found at %d.%d.%d\n",
ec->port_name, vid, did,
ec->ec_pcibus,
ec->ec_pcidev, ec->ec_pcifunc);
return 0;
}
r= pci_next_dev(&devind, &vid, &did);
if (!r)
return 0;

View file

@ -16,9 +16,6 @@
#define PCI_COMMAND_MASTER 0x4
#define PCI_VENDOR_ID_AMD 0x1022
#define PCI_DEVICE_ID_AMD_LANCE 0x2000
/* macros for 'mode' */
#define EC_DISABLED 0x0
@ -81,10 +78,6 @@ typedef struct ether_card
int ec_hook;
int ec_ramsize;
/* PCI */
u8_t ec_pcibus;
u8_t ec_pcidev;
u8_t ec_pcifunc;
/* Addrassing */
u16_t ec_memseg;

View file

@ -25,17 +25,6 @@
#define VERBOSE 1 /* display message during init */
PRIVATE struct pcitab {
u16_t vid;
u16_t did;
int checkclass;
} pcitab[]=
{
{ 0x1260, 0x3873, 0 },
{ 0x1186, 0x1300, 0 },
{ 0x0000, 0x0000, 0 }
};
#include <stdio.h>
#include <stdlib.h>
@ -488,11 +477,7 @@ static void or_init (message * mp) {
* can be searched (at the end: or_probe function) *
*****************************************************************************/
static void or_pci_conf () {
long v;
t_or *orp;
static char envfmt[] = "*:d.d.d";
static char envvar[] = OR_ENVVAR "#";
static char val[128];
/* extract information from the boot monitor about the pci
* configuration if provided */
@ -501,22 +486,6 @@ static void or_pci_conf () {
strncpy (orp->or_name, OR_NAME, sizeof(OR_NAME));
orp->or_name[sizeof(OR_NAME) - 2] = or_instance + '0';
orp->or_seen = FALSE;
/* whats this envvar; whats the definition;*/
/* i guess this whole loop could be removed*/
envvar[sizeof (OR_ENVVAR) - 1] = '0' + or_instance;
if (0 == env_get_param(envvar, val, sizeof(val)) &&
! env_prefix(envvar, "pci")) {
env_panic(envvar);
}
v = 0;
(void) env_parse (envvar, envfmt, 1, &v, 0, 255);
orp->or_pci_bus = v;
v = 0;
(void) env_parse (envvar, envfmt, 2, &v, 0, 255);
orp->or_pci_dev = v;
v = 0;
(void) env_parse (envvar, envfmt, 3, &v, 0, 255);
orp->or_pci_func = v;
/* Initialize the pci bus, bridges and cards, if not yet done */
pci_init ();
@ -538,67 +507,15 @@ static int or_probe (t_or * orp, int skip)
u32_t bar;
char *dname;
u16_t vid, did;
int i, r, devind, just_one;
int r, devind;
if ((orp->or_pci_bus | orp->or_pci_dev | orp->or_pci_func) != 0) {
/* The monitor has provided us with clues about where the
* device is. Try to find it at that place */
r = pci_find_dev (orp->or_pci_bus, orp->or_pci_dev,
orp->or_pci_func, &devind);
if (r == 0) {
printf ("%s: no PCI found at %d.%d.%d\n",
orp->or_name, orp->or_pci_bus,
orp->or_pci_dev, orp->or_pci_func);
return (0);
}
/* get the information about the card, vendor id and device
* id */
pci_ids (devind, &vid, &did);
just_one = TRUE;
} else {
/* no clue where the card is. Start looking from the
* beginning */
r = pci_first_dev (&devind, &vid, &did);
if (r == 0)
return (0);
just_one = FALSE;
}
/* Start looking from the beginning */
r = pci_first_dev (&devind, &vid, &did);
if (r == 0)
return (0);
while (TRUE) {
/* loop through the pcitab to find a maching entry. The match
* being between one of the values in pcitab and the
* information provided by the pci bus */
for (i = 0; pcitab[i].vid != 0; i++) {
if (pcitab[i].vid != vid)
continue;
if (pcitab[i].did != did)
continue;
if (pcitab[i].checkclass) {
panic("or_probe:class check not implmnted");
}
/* we have found the card in the pci bus */
break;
}
/* unless we are looking for a specific device, we may have to
* skip a number of cards because they are already reserved for
* other (lower) ports of this driver */
if (pcitab[i].vid != 0) {
if (just_one || !skip)
break;
skip--;
}
if (just_one) {
printf ("%s: wrong PCI device", orp->or_name);
printf (" (%04x/%04x) found at %d.%d.%d\n", vid, did,
orp->or_pci_bus, orp->or_pci_dev,
orp->or_pci_func);
return (0);
}
/* if the pci device which was under consideration was not
* of the desired brand or type, get the next device */
/* Skip as many instances as requested */
while (skip--) {
r = pci_next_dev (&devind, &vid, &did);
if (!r)
return (0);

View file

@ -16,7 +16,6 @@
#define LARGE_KEY_LENGTH 13
#define IW_ESSID_MAX_SIZE 32
#define IOVEC_NR 16
#define OR_ENVVAR "ORETH"
#define OR_NAME "orinoco#n"
#define IEEE802_11_HLEN 30
@ -82,9 +81,6 @@ typedef struct s_or
/* PCI related */
int or_seen;
u8_t or_pci_bus;
u8_t or_pci_dev;
u8_t or_pci_func;
int devind;
/* 'large' items */

View file

@ -16,36 +16,6 @@
#include "rtl8139.h"
PRIVATE struct pcitab
{
u16_t vid;
u16_t did;
int checkclass;
} pcitab[]=
{
{ 0x10ec, 0x8139, 0 }, /* Realtek RTL8139 */
/* Alternative IDs */
{ 0x02ac, 0x1012, 0 }, /* SpeedStream 1012 PCMCIA 10/100 */
{ 0x1065, 0x8139, 0 }, /* Texas Microsystems 8139C Network Card */
{ 0x1113, 0x1211, 0 }, /* Accton MPX5030 or SMC1211TX EZCard 10/100 */
{ 0x1186, 0x1300, 0 }, /* D-Link DFE530TX+/DFE538TX */
{ 0x1186, 0x1340, 0 }, /* D-Link DFE690TXD */
{ 0x11db, 0x1234, 0 }, /* Sega Dreamcast HIT-400 */
{ 0x1259, 0xa117, 0 }, /* Allied Telesyn 8139 */
{ 0x1259, 0xa11e, 0 }, /* Allied Telesyn 8139 */
{ 0x126c, 0x1211, 0 }, /* Northern Telecom 10/100BaseTX*/
{ 0x13d1, 0xab06, 0 }, /* AboCom FE2000VX */
{ 0x1432, 0x9130, 0 }, /* Edimax Computer Co. RTL81xx */
{ 0x14ea, 0xab06, 0 }, /* Planex FNW-3603-TX */
{ 0x14ea, 0xab07, 0 }, /* Planex FNW-3800-TX */
{ 0x1500, 0x1360, 0 }, /* Delta Electronics RealTek Ethernet */
{ 0x1743, 0x8139, 0 }, /* Peppercon AG 8139 ROL/F-100 */
{ 0x4033, 0x1360, 0 }, /* Addtron Technology 8139 */
{ 0x0000, 0x0000, 0 }
};
PUBLIC re_t re_state;
static int re_instance;
@ -419,30 +389,12 @@ message *mp;
static void rl_pci_conf()
{
re_t *rep;
static char envvar[] = RL_ENVVAR "#";
static char envfmt[] = "*:d.d.d";
static char val[128];
long v;
rep= &re_state;
strcpy(rep->re_name, "rtl8139#0");
rep->re_name[8] += re_instance;
rep->re_seen= FALSE;
envvar[sizeof(RL_ENVVAR)-1]= '0'+re_instance;
if (0 == env_get_param(envvar, val, sizeof(val)) &&
! env_prefix(envvar, "pci")) {
env_panic(envvar);
}
v= 0;
(void) env_parse(envvar, envfmt, 1, &v, 0, 255);
rep->re_pcibus= v;
v= 0;
(void) env_parse(envvar, envfmt, 2, &v, 0, 255);
rep->re_pcidev= v;
v= 0;
(void) env_parse(envvar, envfmt, 3, &v, 0, 255);
rep->re_pcifunc= v;
pci_init();
@ -457,7 +409,7 @@ static int rl_probe(rep, skip)
re_t *rep;
int skip;
{
int i, r, devind, just_one;
int r, devind;
u16_t vid, did;
u32_t bar;
u8_t ilr;
@ -465,59 +417,12 @@ int skip;
char *dname;
#endif
if ((rep->re_pcibus | rep->re_pcidev | rep->re_pcifunc) != 0)
{
/* Look for specific PCI device */
r= pci_find_dev(rep->re_pcibus, rep->re_pcidev,
rep->re_pcifunc, &devind);
if (r == 0)
{
printf("%s: no PCI found at %d.%d.%d\n",
rep->re_name, rep->re_pcibus,
rep->re_pcidev, rep->re_pcifunc);
return 0;
}
pci_ids(devind, &vid, &did);
just_one= TRUE;
}
else
{
r= pci_first_dev(&devind, &vid, &did);
if (r == 0)
return 0;
just_one= FALSE;
}
r= pci_first_dev(&devind, &vid, &did);
if (r == 0)
return 0;
for(;;)
while (skip--)
{
for (i= 0; pcitab[i].vid != 0; i++)
{
if (pcitab[i].vid != vid)
continue;
if (pcitab[i].did != did)
continue;
if (pcitab[i].checkclass) {
panic("class check not implemented");
}
break;
}
if (pcitab[i].vid != 0)
{
if (just_one || !skip)
break;
skip--;
}
if (just_one)
{
printf(
"%s: wrong PCI device (%04x/%04x) found at %d.%d.%d\n",
rep->re_name, vid, did,
rep->re_pcibus,
rep->re_pcidev, rep->re_pcifunc);
return 0;
}
r= pci_next_dev(&devind, &vid, &did);
if (!r)
return 0;
@ -617,8 +522,7 @@ re_t *rep;
buf += BUF_ALIGNMENT - off;
}
tell_dev((vir_bytes)mallocbuf, tot_bufsize, rep->re_pcibus,
rep->re_pcidev, rep->re_pcifunc);
tell_dev((vir_bytes)mallocbuf, tot_bufsize, 0, 0, 0);
for (i= 0; i<N_TX_BUF; i++)
{

View file

@ -502,9 +502,6 @@ typedef struct re
/* PCI related */
int re_seen; /* TRUE iff device available */
u8_t re_pcibus;
u8_t re_pcidev;
u8_t re_pcifunc;
/* 'large' items */
int re_hook_id; /* IRQ hook id at kernel */

View file

@ -48,31 +48,6 @@
#define RL_ENVVAR "RTLETH" /* Configuration */
PRIVATE struct pcitab
{
u16_t vid;
u16_t did;
int checkclass;
} pcitab[] =
{
{ 0x10ec, 0x8129, 0 }, /* Realtek RTL8129 */
{ 0x10ec, 0x8167, 0 }, /* Realtek RTL8169/8110 Family Gigabit NIC */
{ 0x10ec, 0x8169, 0 }, /* Realtek RTL8169 */
{ 0x10ec, 0x8168, 0 },
{ 0x1186, 0x4300, 0 }, /* D-Link DGE-528T Gigabit adaptor */
{ 0x1259, 0xc107, 0 }, /* Allied Telesyn International Gigabit Ethernet Adapter */
{ 0x1385, 0x8169, 0 }, /* Netgear Gigabit Ethernet Adapter */
{ 0x16ec, 0x0116, 0 }, /* US Robotics Realtek 8169S chip */
{ 0x1737, 0x1032, 0 }, /* Linksys Instant Gigabit Desktop Network Interface */
{ 0x0000, 0x0000, 0 }
};
typedef struct re_desc
{
u32_t status; /* command/status */
@ -143,9 +118,6 @@ typedef struct re {
/* PCI related */
int re_seen; /* TRUE iff device available */
u8_t re_pcibus;
u8_t re_pcidev;
u8_t re_pcifunc;
/* 'large' items */
int re_hook_id; /* IRQ hook id at kernel */
@ -623,31 +595,12 @@ message *mp;
static void rl_pci_conf()
{
re_t *rep;
static char envvar[] = RL_ENVVAR "#";
static char envfmt[] = "*:d.d.d";
static char val[128];
long v;
rep = &re_state;
strcpy(rep->re_name, "rtl8169#0");
rep->re_name[8] += re_instance;
rep->re_seen = FALSE;
envvar[sizeof(RL_ENVVAR)-1] = '0' + re_instance;
if (0 == env_get_param(envvar, val, sizeof(val)) &&
!env_prefix(envvar, "pci"))
{
env_panic(envvar);
}
v = 0;
(void) env_parse(envvar, envfmt, 1, &v, 0, 255);
rep->re_pcibus = v;
v = 0;
(void) env_parse(envvar, envfmt, 2, &v, 0, 255);
rep->re_pcidev = v;
v = 0;
(void) env_parse(envvar, envfmt, 3, &v, 0, 255);
rep->re_pcifunc = v;
pci_init();
@ -662,56 +615,17 @@ static int rl_probe(rep, skip)
re_t *rep;
int skip;
{
int i, r, devind, just_one;
int r, devind;
u16_t vid, did;
u32_t bar;
u8_t ilr;
char *dname;
if ((rep->re_pcibus | rep->re_pcidev | rep->re_pcifunc) != 0) {
/* Look for specific PCI device */
r = pci_find_dev(rep->re_pcibus, rep->re_pcidev,
rep->re_pcifunc, &devind);
if (r == 0) {
printf("%s: no PCI found at %d.%d.%d\n",
rep->re_name, rep->re_pcibus,
rep->re_pcidev, rep->re_pcifunc);
return 0;
}
pci_ids(devind, &vid, &did);
just_one = TRUE;
} else {
r = pci_first_dev(&devind, &vid, &did);
if (r == 0)
return 0;
just_one = FALSE;
}
for (;;) {
for (i = 0; pcitab[i].vid != 0; i++) {
if (pcitab[i].vid != vid)
continue;
if (pcitab[i].did != did)
continue;
if (pcitab[i].checkclass) {
panic("class check not implemented");
}
break;
}
if (pcitab[i].vid != 0) {
if (just_one || !skip)
break;
skip--;
}
if (just_one) {
printf("%s: wrong PCI device (%04x/%04x) found at %d.%d.%d\n",
rep->re_name, vid, did,
rep->re_pcibus,
rep->re_pcidev, rep->re_pcifunc);
return 0;
}
r = pci_first_dev(&devind, &vid, &did);
if (r == 0)
return 0;
while (skip--) {
r = pci_next_dev(&devind, &vid, &did);
if (!r)
return 0;

View file

@ -16,11 +16,8 @@ Created: Dec 2005 by Philip Homburg
/* The use of interrupts is not yet ready for prime time */
#define USE_INTS 0
#define NR_PORTS 2
PRIVATE struct port
{
unsigned p_flags;
int p_devind;
u8_t p_cb_busnr;
u16_t p_exca_port;
@ -29,26 +26,13 @@ PRIVATE struct port
int p_hook;
#endif
volatile struct csr *csr_ptr;
} ports[NR_PORTS];
} port;
#define PF_PRESENT 1
struct pcitab
{
u16_t vid;
u16_t did;
int checkclass;
};
PRIVATE struct pcitab pcitab_ti[]=
{
{ 0x104C, 0xAC1C, 0 }, /* TI PCI1225 */
{ 0x0000, 0x0000, 0 }
};
PRIVATE int instance;
PRIVATE int debug;
FORWARD _PROTOTYPE( void hw_init, (struct port *pp) );
FORWARD _PROTOTYPE( int hw_probe, (int skip) );
FORWARD _PROTOTYPE( void hw_init, (struct port *pp, int devind) );
FORWARD _PROTOTYPE( void do_int, (struct port *pp) );
/* SEF functions and variables. */
@ -84,17 +68,17 @@ int main(int argc, char *argv[])
*===========================================================================*/
PRIVATE void sef_local_startup()
{
/* Register init callbacks. */
sef_setcb_init_fresh(sef_cb_init_fresh);
sef_setcb_init_lu(sef_cb_init_fresh);
sef_setcb_init_restart(sef_cb_init_fresh);
/* Register init callbacks. */
sef_setcb_init_fresh(sef_cb_init_fresh);
sef_setcb_init_lu(sef_cb_init_fresh);
sef_setcb_init_restart(sef_cb_init_fresh);
/* Register live update callbacks. */
sef_setcb_lu_prepare(sef_cb_lu_prepare_always_ready);
sef_setcb_lu_state_isvalid(sef_cb_lu_state_isvalid_standard);
/* Register live update callbacks. */
sef_setcb_lu_prepare(sef_cb_lu_prepare_always_ready);
sef_setcb_lu_state_isvalid(sef_cb_lu_state_isvalid_standard);
/* Let SEF perform startup. */
sef_startup();
/* Let SEF perform startup. */
sef_startup();
}
/*===========================================================================*
@ -103,77 +87,60 @@ PRIVATE void sef_local_startup()
PRIVATE int sef_cb_init_fresh(int UNUSED(type), sef_init_info_t *UNUSED(info))
{
/* Initialize the ti1225 driver. */
int c, i, r, first, devind, port;
u16_t vid, did;
int r, devind;
long v;
if((r=tsc_calibrate()) != OK)
panic("tsc_calibrate failed: %d", r);
debug= 0;
while (c= getopt(env_argc, env_argv, "d?"), c != -1)
{
switch(c)
{
case '?': panic("Usage: ti1225 [-d]");
case 'd': debug++; break;
default: panic("getopt failed");
}
}
v = 0;
(void) env_parse("instance", "d", 0, &v, 0, 255);
instance = (int) v;
pci_init();
v = 0;
(void) env_parse("debug", "d", 0, &v, 0, 1);
debug = (int) v;
first= 1;
port= 0;
for (;;)
{
if (first)
{
first= 0;
r= pci_first_dev(&devind, &vid, &did);
}
else
r= pci_next_dev(&devind, &vid, &did);
if (r != 1)
break;
devind = hw_probe(instance);
for (i= 0; pcitab_ti[i].vid != 0; i++)
{
if (pcitab_ti[i].vid != vid)
continue;
if (pcitab_ti[i].did != did)
continue;
if (pcitab_ti[i].checkclass) {
panic("fxp_probe: class check not implemented");
}
break;
}
if (pcitab_ti[i].vid == 0)
continue;
if (devind < 0)
return(ENODEV);
pci_reserve(devind);
if (debug)
printf("ti1225: found device %04x/%04x\n", vid, did);
ports[port].p_devind= devind;
ports[port].p_flags |= PF_PRESENT;
port++;
if (port >= NR_PORTS)
break;
}
for (i= 0; i<NR_PORTS; i++)
{
if (!(ports[i].p_flags & PF_PRESENT))
continue;
hw_init(&ports[i]);
}
hw_init(&port, devind);
return(OK);
}
PRIVATE void hw_init(struct port *pp)
/*===========================================================================*
* hw_probe *
*===========================================================================*/
PRIVATE int hw_probe(int skip)
{
u16_t vid, did;
int devind;
pci_init();
if (pci_first_dev(&devind, &vid, &did) != 1)
return(-1);
while (skip--)
if (pci_next_dev(&devind, &vid, &did) != 1)
return(-1);
pci_reserve(devind);
if (debug)
printf("ti1225: found device %04x/%04x\n", vid, did);
return(devind);
}
/*===========================================================================*
* hw_init *
*===========================================================================*/
PRIVATE void hw_init(struct port *pp, int devind)
{
u8_t v8;
u16_t v16;
u32_t v32;
@ -181,7 +148,7 @@ PRIVATE void hw_init(struct port *pp)
int r, irq;
#endif
devind= pp->p_devind;
pp->p_devind= devind;
if (debug)
printf("hw_init: devind = %d\n", devind);
@ -277,6 +244,9 @@ PRIVATE void hw_init(struct port *pp)
#endif
}
/*===========================================================================*
* do_int *
*===========================================================================*/
PRIVATE void do_int(struct port *pp)
{
int devind, vcc_5v, vcc_3v, vcc_Xv, vcc_Yv,

View file

@ -459,6 +459,14 @@ service es1371
pci device 1274/1371;
};
service ti1225
{
system
IRQCTL # 19
;
pci device 104c/ac1c;
};
service amddev
{
pci device 1022/1103;