3 * Copyright (c) 1996 Stefan Esser <se@freebsd.org>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice immediately at the beginning of the file, without modification,
11 * this list of conditions, and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Absolutely no warranty of function or purpose is made by the author
17 * 4. Modifications may be freely made to this file if the above conditions
20 * $FreeBSD: src/sys/dev/ed/if_ed_pci.c,v 1.34 2003/10/31 18:31:58 brooks Exp $
21 * $DragonFly: src/sys/dev/netif/ed/if_ed_pci.c,v 1.16 2008/08/17 04:32:33 sephe Exp $
24 #include <sys/param.h>
25 #include <sys/systm.h>
26 #include <sys/socket.h>
27 #include <sys/kernel.h>
28 #include <sys/module.h>
29 #include <sys/interrupt.h>
34 #include <net/if_arp.h>
35 #include <net/if_mib.h>
37 #include <bus/pci/pcidevs.h>
38 #include <bus/pci/pcireg.h>
39 #include <bus/pci/pcivar.h>
43 static int ed_pci_detach(device_t dev
);
45 static struct ed_type
{
50 { PCI_VENDOR_REALTEK
, PCI_PRODUCT_REALTEK_RT8029
,
51 "NE2000 PCI Ethernet (RealTek 8029)" },
52 { PCI_VENDOR_NETVIN
, PCI_PRODUCT_NETVIN_5000
,
53 "NE2000 PCI Ethernet (NetVin 5000)" },
54 { PCI_VENDOR_PROLAN
, PCI_PRODUCT_PROLAN_NE2KETHER
,
55 "NE2000 PCI Ethernet (ProLAN)" },
56 { PCI_VENDOR_COMPEX
, PCI_PRODUCT_COMPEX_NE2KETHER
,
57 "NE2000 PCI Ethernet (Compex)" },
58 { PCI_VENDOR_KTI
, PCI_PRODUCT_KTI_NE2KETHER
,
59 "NE2000 PCI Ethernet (KTI)" },
60 { PCI_VENDOR_WINBOND
, PCI_PRODUCT_WINBOND_W89C940F
,
61 "NE2000 PCI Ethernet (Winbond W89C940)" },
62 { PCI_VENDOR_SURECOM
, PCI_PRODUCT_SURECOM_NE34
,
63 "NE2000 PCI Ethernet (Surecom NE-34)" },
64 { PCI_VENDOR_VIATECH
, PCI_PRODUCT_VIATECH_VT86C926
,
65 "NE2000 PCI Ethernet (VIA VT86C926)" },
69 static int ed_pci_probe (device_t
);
70 static int ed_pci_attach (device_t
);
73 ed_pci_probe(device_t dev
)
76 uint16_t product
= pci_get_device(dev
);
77 uint16_t vendor
= pci_get_vendor(dev
);
79 for (t
= ed_devs
; t
->ed_name
!= NULL
; t
++) {
80 if (vendor
== t
->ed_vid
&& product
== t
->ed_did
) {
81 device_set_desc(dev
, t
->ed_name
);
89 ed_pci_attach(device_t dev
)
91 struct ed_softc
*sc
= device_get_softc(dev
);
95 error
= ed_probe_Novell(dev
, PCIR_MAPS
, flags
);
99 error
= ed_alloc_irq(dev
, 0, RF_SHAREABLE
);
101 ed_release_resources(dev
);
105 error
= ed_attach(dev
);
107 struct ifnet
*ifp
= &sc
->arpcom
.ac_if
;
109 error
= bus_setup_intr(dev
, sc
->irq_res
, INTR_MPSAFE
,
110 edintr
, sc
, &sc
->irq_handle
,
116 ithread_cpuid(rman_get_start(sc
->irq_res
));
117 KKASSERT(ifp
->if_cpuid
>= 0 && ifp
->if_cpuid
< ncpus
);
120 ed_release_resources(dev
);
126 ed_pci_detach(device_t dev
)
128 struct ed_softc
*sc
= device_get_softc(dev
);
129 struct ifnet
*ifp
= &sc
->arpcom
.ac_if
;
131 lwkt_serialize_enter(ifp
->if_serializer
);
134 device_printf(dev
, "already unloaded\n");
135 lwkt_serialize_exit(ifp
->if_serializer
);
139 ifp
->if_flags
&= ~IFF_RUNNING
;
141 bus_teardown_intr(dev
, sc
->irq_res
, sc
->irq_handle
);
143 lwkt_serialize_exit(ifp
->if_serializer
);
146 ed_release_resources(dev
);
150 static device_method_t ed_pci_methods
[] = {
151 /* Device interface */
152 DEVMETHOD(device_probe
, ed_pci_probe
),
153 DEVMETHOD(device_attach
, ed_pci_attach
),
154 DEVMETHOD(device_attach
, ed_pci_detach
),
159 static driver_t ed_pci_driver
= {
162 sizeof(struct ed_softc
),
165 DRIVER_MODULE(ed
, pci
, ed_pci_driver
, ed_devclass
, 0, 0);
166 MODULE_DEPEND(ed
, pci
, 1, 1, 1);