diff options
Diffstat (limited to 'sys/dev/ed')
-rw-r--r-- | sys/dev/ed/if_ed.c | 115 | ||||
-rw-r--r-- | sys/dev/ed/if_ed_pci.c | 95 |
2 files changed, 185 insertions, 25 deletions
diff --git a/sys/dev/ed/if_ed.c b/sys/dev/ed/if_ed.c index e1784a2..bde3444 100644 --- a/sys/dev/ed/if_ed.c +++ b/sys/dev/ed/if_ed.c @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: if_ed.c,v 1.96 1996/04/08 01:25:22 davidg Exp $ + * $Id: if_ed.c,v 1.97 1996/04/23 18:36:54 nate Exp $ */ /* @@ -130,7 +130,9 @@ struct ed_softc { static struct ed_softc ed_softc[NED]; -static int ed_attach __P((struct isa_device *)); +static int ed_attach __P((struct ed_softc *, int, int)); +static int ed_attach_isa __P((struct isa_device *)); + static void ed_init __P((struct ifnet *)); static int ed_ioctl __P((struct ifnet *, int, caddr_t)); static int ed_probe __P((struct isa_device *)); @@ -143,7 +145,17 @@ static int ed_probe_generic8390 __P((struct ed_softc *)); static int ed_probe_WD80x3 __P((struct isa_device *)); static int ed_probe_3Com __P((struct isa_device *)); static int ed_probe_Novell __P((struct isa_device *)); +static int ed_probe_Novell_generic __P((struct ed_softc *, int, int, int)); + +#include "pci.h" +#if NPCI > 0 +void *ed_attach_NE2000_pci __P((int, int)); +#endif + +#include "crd.h" +#if NCRD > 0 static int ed_probe_pccard __P((struct isa_device *, u_char *)); +#endif static void ds_getmcaf __P((struct ed_softc *, u_long *)); @@ -164,7 +176,6 @@ static u_short ed_pio_write_mbufs __P((struct ed_softc *, struct mbuf *, static void ed_setrcr(struct ed_softc *); static u_long ds_crc(u_char *ep); -#include "crd.h" #if NCRD > 0 #include <sys/select.h> #include <pccard/card.h> @@ -225,7 +236,7 @@ edinit(struct pccard_dev *dp, int first) sc->gone = 0; if (ed_probe_pccard(&dp->isahd,dp->misc)==0) return(ENXIO); - if (ed_attach(&dp->isahd)==0) + if (ed_attach_isa(&dp->isahd)==0) return(ENXIO); } /* @@ -271,14 +282,14 @@ edunload(struct pccard_dev *dp) static int card_intr(struct pccard_dev *dp) { - edintr(dp->isahd.id_unit); + edintr_sc(&ed_softc[dp->isahd.id_unit]); return(1); } #endif /* NCRD > 0 */ struct isa_driver eddriver = { ed_probe, - ed_attach, + ed_attach_isa, "ed", 1 /* We are ultra sensitive */ }; @@ -1083,17 +1094,19 @@ ed_probe_3Com(isa_dev) * Probe and vendor-specific initialization routine for NE1000/2000 boards */ static int -ed_probe_Novell(isa_dev) - struct isa_device *isa_dev; +ed_probe_Novell_generic(sc, port, unit, flags) + struct ed_softc *sc; + int port; + int unit; + int flags; { - struct ed_softc *sc = &ed_softc[isa_dev->id_unit]; u_int memsize, n; u_char romdata[16], tmp; static char test_pattern[32] = "THIS is A memory TEST pattern"; char test_buffer[32]; - sc->asic_addr = isa_dev->id_iobase + ED_NOVELL_ASIC_OFFSET; - sc->nic_addr = isa_dev->id_iobase + ED_NOVELL_NIC_OFFSET; + sc->asic_addr = port + ED_NOVELL_ASIC_OFFSET; + sc->nic_addr = port + ED_NOVELL_NIC_OFFSET; /* XXX - do Novell-specific probe here */ @@ -1132,7 +1145,6 @@ ed_probe_Novell(isa_dev) sc->vendor = ED_VENDOR_NOVELL; sc->mem_shared = 0; sc->cr_proto = ED_CR_RD2; - isa_dev->id_maddr = 0; /* * Test the ability to read and write to the NIC memory. This has the @@ -1235,7 +1247,7 @@ ed_probe_Novell(isa_dev) } if (mstart == 0) { - printf("ed%d: Cannot find start of RAM.\n", isa_dev->id_unit); + printf("ed%d: Cannot find start of RAM.\n", unit); return 0; } /* Search for the start of RAM. */ @@ -1257,10 +1269,10 @@ ed_probe_Novell(isa_dev) } if (msize == 0) { - printf("ed%d: Cannot find any RAM, start : %d, x = %d.\n", isa_dev->id_unit, mstart, x); + printf("ed%d: Cannot find any RAM, start : %d, x = %d.\n", unit, mstart, x); return 0; } - printf("ed%d: RAM start at %d, size : %d.\n", isa_dev->id_unit, mstart, msize); + printf("ed%d: RAM start at %d, size : %d.\n", unit, mstart, msize); sc->mem_size = msize; sc->mem_start = (char *) mstart; @@ -1273,7 +1285,7 @@ ed_probe_Novell(isa_dev) * Use one xmit buffer if < 16k, two buffers otherwise (if not told * otherwise). */ - if ((memsize < 16384) || (isa_dev->id_flags & ED_FLAGS_NO_MULTI_BUFFERING)) + if ((memsize < 16384) || (flags & ED_FLAGS_NO_MULTI_BUFFERING)) sc->txb_cnt = 1; else sc->txb_cnt = 2; @@ -1300,6 +1312,18 @@ ed_probe_Novell(isa_dev) return (ED_NOVELL_IO_PORTS); } +static int +ed_probe_Novell(isa_dev) + struct isa_device *isa_dev; +{ + struct ed_softc *sc = &ed_softc[isa_dev->id_unit]; + + isa_dev->id_maddr = 0; + return ed_probe_Novell_generic(sc, isa_dev->id_iobase, + isa_dev->id_unit, isa_dev->id_flags); +} + +#if NCRD > 0 /* * Probe and vendor-specific initialization routine for PCCARDs @@ -1409,14 +1433,17 @@ ed_probe_pccard(isa_dev, ether) return (ED_PC_IO_PORTS); } +#endif /* NCRD > 0 */ + /* * Install interface into kernel networking data structures */ static int -ed_attach(isa_dev) - struct isa_device *isa_dev; +ed_attach(sc, unit, flags) + struct ed_softc *sc; + int unit; + int flags; { - struct ed_softc *sc = &ed_softc[isa_dev->id_unit]; struct ifnet *ifp = &sc->arpcom.ac_if; /* @@ -1429,7 +1456,7 @@ ed_attach(isa_dev) * Initialize ifnet structure */ ifp->if_softc = sc; - ifp->if_unit = isa_dev->id_unit; + ifp->if_unit = unit; ifp->if_name = "ed"; ifp->if_output = ether_output; ifp->if_start = ed_start; @@ -1442,7 +1469,7 @@ ed_attach(isa_dev) * tranceiver for AUI operation), based on compile-time * config option. */ - if (isa_dev->id_flags & ED_FLAGS_DISABLE_TRANCEIVER) + if (flags & ED_FLAGS_DISABLE_TRANCEIVER) ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | IFF_ALTPHYS); else @@ -1461,7 +1488,7 @@ ed_attach(isa_dev) /* * Print additional info when attached */ - printf("ed%d: address %6D, ", isa_dev->id_unit, + printf("%s%d: address %6D, ", ifp->if_name, ifp->if_unit, sc->arpcom.ac_enaddr, ":"); if (sc->type_str && (*sc->type_str != 0)) @@ -1483,6 +1510,38 @@ ed_attach(isa_dev) return 1; } +static int +ed_attach_isa(isa_dev) + struct isa_device *isa_dev; +{ + int unit = isa_dev->id_unit; + struct ed_softc *sc = &ed_softc[unit]; + int flags = isa_dev->id_flags; + + return ed_attach(sc, unit, flags); +} + +#if NPCI > 0 +void * +ed_attach_NE2000_pci(unit, port) + int unit; + int port; +{ + struct ed_softc *sc = malloc(sizeof *sc, M_DEVBUF, M_NOWAIT); + int isa_flags = 0; + + if (!sc) + return sc; + + if (ed_probe_Novell_generic(sc, port, unit, isa_flags) == 0 + || ed_attach(sc, unit, isa_flags) == 0) { + free(sc, M_DEVBUF); + return NULL; + } + return sc; +} +#endif + /* * Reset interface. */ @@ -2040,10 +2099,9 @@ ed_rint(sc) * Ethernet interface interrupt processor */ void -edintr(unit) - int unit; +edintr_sc(sc) + struct ed_softc *sc; { - struct ed_softc *sc = &ed_softc[unit]; struct ifnet *ifp = (struct ifnet *)sc; u_char isr; @@ -2249,6 +2307,13 @@ edintr(unit) } } +void +edintr(unit) + int unit; +{ + edintr_sc (&ed_softc[unit]); +} + /* * Process an ioctl request. This code needs some work - it looks * pretty ugly. diff --git a/sys/dev/ed/if_ed_pci.c b/sys/dev/ed/if_ed_pci.c new file mode 100644 index 0000000..e8a000d --- /dev/null +++ b/sys/dev/ed/if_ed_pci.c @@ -0,0 +1,95 @@ +/* + * + * 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 */ + |