freebsd-dev/sys/dev/ed/if_ed_pci.c
Stefan Eßer 8408422768 Add support for NE2000 compatible PCI Ethernet cards. The PCI probe
is enabled by having an "device ed0 at isa? [...]" config line.
The first PCI card will get a unit number one higher than the highest
defined for any ISA card of the ED type, e.g. if ed0 and ed1 are
configured, then the PCI cards will be ed2, ed3, ...

BEWARE: If you have configured your kernel as ed0 with the port address
as assigned by the PCI BIOS, then your card will be found by both the
PCI and ISA probes, and bad things may happen. Make sure to restore
the original port address form the GENERIC kernel for the ed0 device!

Reviewed by:	davidg
1996-05-18 17:56:42 +00:00

96 lines
2.1 KiB
C

/*
*
* Copyright (c) 1996 Stefan Esser <se@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice immediately at the beginning of the file, without modification,
* this list of conditions, and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Absolutely no warranty of function or purpose is made by the author
* Stefan Esser.
* 4. Modifications may be freely made to this file if the above conditions
* are met.
*
* $Id:$
*/
#include <pci.h>
#if NPCI > 0
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
#include <sys/kernel.h>
#include <pci/pcireg.h>
#include <pci/pcivar.h>
#include <i386/isa/isa_device.h>
#include <ed.h>
#define PCI_DEVICE_ID_NE2000 0x802910ec
static char* ed_pci_probe __P((pcici_t tag, pcidi_t type));
static void ed_pci_attach __P((pcici_t config_id, int unit));
static u_long ed_pci_count = NED;
static void ed_pci_shutdown(void *arg)
{
}
static struct pci_device ed_pci_driver = {
"ed",
ed_pci_probe,
ed_pci_attach,
&ed_pci_count,
ed_pci_shutdown,
};
DATA_SET (pcidevice_set, ed_pci_driver);
static char*
ed_pci_probe (pcici_t tag, pcidi_t type)
{
switch(type) {
case PCI_DEVICE_ID_NE2000:
return ("NE2000 compatible PCI Ethernet adapter");
break;
default:
break;
}
return (0);
}
void edintr_sc (void*);
static void
ed_pci_attach(config_id, unit)
pcici_t config_id;
int unit;
{
u_long io_port;
void *ed; /* device specific data ... */
io_port = pci_conf_read(config_id, PCI_MAP_REG_START) & ~PCI_MAP_IO;
ed = ed_attach_NE2000_pci(unit, io_port);
if (!ed)
return;
if(!(pci_map_int(config_id, edintr_sc, (void *)ed, &net_imask))) {
free (ed, M_DEVBUF);
return;
}
return;
}
#endif /* NPCI > 0 */