|
|
| version 1.6, 2003/11/20 22:07:27 | version 1.7, 2004/02/13 21:15:12 |
|---|---|
| Line 24 | Line 24 |
| * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| * SUCH DAMAGE. | * SUCH DAMAGE. |
| * | * |
| * $FreeBSD: src/sys/dev/ed/if_ed_pccard.c,v 1.9.2.6 2001/07/25 18:06:01 iedowse Exp $ | * $FreeBSD: src/sys/dev/ed/if_ed_pccard.c,v 1.55 2003/12/31 04:25:00 kato Exp $ |
| * $DragonFly$ | * $DragonFly$ |
| */ | */ |
| #include "opt_ed.h" | |
| #include <sys/param.h> | #include <sys/param.h> |
| #include <sys/systm.h> | #include <sys/systm.h> |
| #include <sys/socket.h> | #include <sys/socket.h> |
| #include <sys/kernel.h> | #include <sys/kernel.h> |
| #include <sys/conf.h> | #include <sys/conf.h> |
| #include <sys/uio.h> | #include <sys/uio.h> |
| #include <sys/select.h> | |
| #include <sys/device.h> | |
| #include <machine/clock.h> | |
| #include <sys/module.h> | #include <sys/module.h> |
| #include <sys/bus.h> | #include <sys/bus.h> |
| #include <machine/bus.h> | #include <machine/bus.h> |
| #include <sys/rman.h> | |
| #include <machine/resource.h> | |
| #include <net/ethernet.h> | #include <net/ethernet.h> |
| #include <net/if.h> | #include <net/if.h> |
| Line 51 | Line 52 |
| #include "if_edreg.h" | #include "if_edreg.h" |
| #include "if_edvar.h" | #include "if_edvar.h" |
| #include <bus/pccard/pccardvar.h> | #include <bus/pccard/pccardvar.h> |
| #include <bus/pccard/cardinfo.h> | #include <bus/pccard/pccarddevs.h> |
| #include <bus/pccard/slot.h> | #ifndef ED_NO_MIIBUS |
| #include "../mii_layer/mii.h" | #include <dev/netif/mii_layer/mii.h> |
| #include "../mii_layer/miivar.h" | #include <dev/netif/mii_layer/miivar.h> |
| #endif | |
| #include "card_if.h" | |
| #ifndef ED_NO_MIIBUS | |
| /* "device miibus" required. See GENERIC if you get errors here. */ | /* "device miibus" required. See GENERIC if you get errors here. */ |
| #include "miibus_if.h" | #include "miibus_if.h" |
| #define CARD_MAJOR 50 | MODULE_DEPEND(ed, miibus, 1, 1, 1); |
| #endif | |
| MODULE_DEPEND(ed, ether, 1, 1, 1); | |
| MODULE_DEPEND(ed, pccard, 1, 1, 1); | |
| /* | /* |
| * PC-Card (PCMCIA) specific code. | * PC-Card (PCMCIA) specific code. |
| */ | */ |
| static int ed_pccard_match(device_t); | |
| static int ed_pccard_probe(device_t); | static int ed_pccard_probe(device_t); |
| static int ed_pccard_attach(device_t); | static int ed_pccard_attach(device_t); |
| static int ed_pccard_detach(device_t); | static int ed_pccard_detach(device_t); |
| static int ed_pccard_Linksys(device_t dev); | |
| static int ed_pccard_ax88190(device_t dev); | |
| static void ax88190_geteprom(struct ed_softc *); | static void ax88190_geteprom(struct ed_softc *); |
| static int ed_pccard_memwrite(device_t dev, off_t offset, u_char byte); | static int ed_pccard_memwrite(device_t dev, off_t offset, u_char byte); |
| static int ed_pccard_memread(device_t dev, off_t offset, u_char *buf, int size); | #ifndef ED_NO_MIIBUS |
| static int ed_pccard_Linksys(device_t dev); | |
| static void ed_pccard_dlink_mii_reset(struct ed_softc *sc); | static void ed_pccard_dlink_mii_reset(struct ed_softc *sc); |
| static u_int ed_pccard_dlink_mii_readbits(struct ed_softc *sc, int nbits); | static u_int ed_pccard_dlink_mii_readbits(struct ed_softc *sc, int nbits); |
| static void ed_pccard_dlink_mii_writebits(struct ed_softc *sc, u_int val, | static void ed_pccard_dlink_mii_writebits(struct ed_softc *sc, u_int val, |
| int nbits); | int nbits); |
| static int linksys; | #endif |
| static device_method_t ed_pccard_methods[] = { | |
| /* Device interface */ | |
| DEVMETHOD(device_probe, ed_pccard_probe), | |
| DEVMETHOD(device_attach, ed_pccard_attach), | |
| DEVMETHOD(device_detach, ed_pccard_detach), | |
| /* Bus interface */ | |
| DEVMETHOD(bus_child_detached, ed_child_detached), | |
| /* MII interface */ | |
| DEVMETHOD(miibus_readreg, ed_miibus_readreg), | |
| DEVMETHOD(miibus_writereg, ed_miibus_writereg), | |
| { 0, 0 } | |
| }; | |
| static driver_t ed_pccard_driver = { | |
| "ed", | |
| ed_pccard_methods, | |
| sizeof(struct ed_softc) | |
| }; | |
| static devclass_t ed_pccard_devclass; | |
| DRIVER_MODULE(if_ed, pccard, ed_pccard_driver, ed_pccard_devclass, 0, 0); | |
| DRIVER_MODULE(miibus, ed, miibus_driver, miibus_devclass, 0, 0); | |
| /* | /* |
| * ed_pccard_detach - unload the driver and clear the table. | * ed_pccard_detach - unload the driver and clear the table. |
| Line 132 ed_pccard_detach(device_t dev) | Line 116 ed_pccard_detach(device_t dev) |
| return (0); | return (0); |
| } | } |
| static const struct ed_product { | |
| struct pccard_product prod; | |
| int flags; | |
| #define NE2000DVF_DL10019 0x0001 /* chip is D-Link DL10019 */ | |
| #define NE2000DVF_AX88190 0x0002 /* chip is ASIX AX88190 */ | |
| } ed_pccard_products[] = { | |
| { PCMCIA_CARD(ACCTON, EN2212, 0), 0}, | |
| { PCMCIA_CARD(ALLIEDTELESIS, LA_PCM, 0), 0}, | |
| { PCMCIA_CARD(AMBICOM, AMB8002T, 0), 0}, | |
| { PCMCIA_CARD(BILLIONTON, LNT10TN, 0), 0}, | |
| { PCMCIA_CARD(BILLIONTON, CFLT10N, 0), 0}, | |
| { PCMCIA_CARD(BUFFALO, LPC3_CLT, 0), 0}, | |
| { PCMCIA_CARD(BUFFALO, LPC3_CLX, 0), NE2000DVF_AX88190}, | |
| { PCMCIA_CARD(BUFFALO, LPC_CF_CLT, 0), 0}, | |
| { PCMCIA_CARD(CNET, NE2000, 0), 0}, | |
| { PCMCIA_CARD(COMPEX, LINKPORT_ENET_B, 0), 0}, | |
| { PCMCIA_CARD(COREGA, ETHER_II_PCC_T, 0), 0}, | |
| { PCMCIA_CARD(COREGA, ETHER_II_PCC_TD, 0), 0}, | |
| { PCMCIA_CARD(COREGA, ETHER_PCC_T, 0), 0}, | |
| { PCMCIA_CARD(COREGA, ETHER_PCC_TD, 0), 0}, | |
| { PCMCIA_CARD(COREGA, FAST_ETHER_PCC_TX, 0), NE2000DVF_DL10019 }, | |
| { PCMCIA_CARD(COREGA, FETHER_PCC_TXD, 0), NE2000DVF_AX88190 }, | |
| { PCMCIA_CARD(COREGA, FETHER_PCC_TXF, 0), NE2000DVF_DL10019 }, | |
| { PCMCIA_CARD(DAYNA, COMMUNICARD_E_1, 0), 0}, | |
| { PCMCIA_CARD(DAYNA, COMMUNICARD_E_2, 0), 0}, | |
| { PCMCIA_CARD(DIGITAL, DEPCMXX, 0), 0 }, | |
| { PCMCIA_CARD(DLINK, DE650, 0), 0}, | |
| { PCMCIA_CARD(DLINK, DE660, 0), 0 }, | |
| { PCMCIA_CARD(DLINK, DE660PLUS, 0), 0}, | |
| { PCMCIA_CARD(DLINK, DFE670TXD, 0), NE2000DVF_DL10019}, | |
| { PCMCIA_CARD(DYNALINK, L10C, 0), 0}, | |
| { PCMCIA_CARD(EDIMAX, EP4000A, 0), 0}, | |
| { PCMCIA_CARD(EPSON, EEN10B, 0), 0}, | |
| { PCMCIA_CARD(EXP, THINLANCOMBO, 0), 0}, | |
| { PCMCIA_CARD(IBM, INFOMOVER, 0), 0}, | |
| { PCMCIA_CARD(IODATA, PCLAT, 0), 0}, | |
| { PCMCIA_CARD(IODATA, PCLATE, 0), 0}, | |
| { PCMCIA_CARD(KINGSTON, KNE2, 0), 0}, | |
| { PCMCIA_CARD(LANTECH, FASTNETTX, 0),NE2000DVF_AX88190 }, | |
| { PCMCIA_CARD(LINKSYS, COMBO_ECARD, 0), NE2000DVF_DL10019 }, | |
| { PCMCIA_CARD(LINKSYS, ECARD_1, 0), 0}, | |
| { PCMCIA_CARD(LINKSYS, ECARD_2, 0), 0}, | |
| { PCMCIA_CARD(LINKSYS, ETHERFAST, 0), NE2000DVF_DL10019 }, | |
| { PCMCIA_CARD(LINKSYS, PCM100, 0), 0}, | |
| { PCMCIA_CARD(LINKSYS, TRUST_COMBO_ECARD, 0), 0}, | |
| { PCMCIA_CARD(LINKSYS, ETHERFAST, 0), NE2000DVF_DL10019 }, | |
| { PCMCIA_CARD(MACNICA, ME1_JEIDA, 0), 0}, | |
| { PCMCIA_CARD(MELCO, LPC3_CLX, 0), NE2000DVF_AX88190}, | |
| { PCMCIA_CARD(MELCO, LPC3_TX, 0), NE2000DVF_AX88190 }, | |
| { PCMCIA_CARD(NDC, ND5100_E, 0), 0}, | |
| { PCMCIA_CARD(NETGEAR, FA410TXC, 0), NE2000DVF_DL10019}, | |
| { PCMCIA_CARD(NETGEAR, FA411, 0), NE2000DVF_AX88190}, | |
| { PCMCIA_CARD(PLANET, SMARTCOM2000, 0), 0 }, | |
| { PCMCIA_CARD(PREMAX, PE200, 0), 0}, | |
| { PCMCIA_CARD(RPTI, EP400, 0), 0}, | |
| { PCMCIA_CARD(RPTI, EP401, 0), 0}, | |
| { PCMCIA_CARD(SMC, EZCARD, 0), 0}, | |
| { PCMCIA_CARD(SOCKET, EA_ETHER, 0), 0}, | |
| { PCMCIA_CARD(SOCKET, LP_ETHER, 0), 0}, | |
| { PCMCIA_CARD(SOCKET, LP_ETHER_CF, 0), 0}, | |
| { PCMCIA_CARD(SOCKET, LP_ETH_10_100_CF, 0), NE2000DVF_DL10019}, | |
| { PCMCIA_CARD(SVEC, COMBOCARD, 0), 0}, | |
| { PCMCIA_CARD(SVEC, LANCARD, 0), 0}, | |
| { PCMCIA_CARD(SYNERGY21, S21810, 0), 0}, | |
| { PCMCIA_CARD(TDK, LAK_CD031, 0), 0}, | |
| { PCMCIA_CARD(TELECOMDEVICE, TCD_HPC100, 0), NE2000DVF_AX88190 }, | |
| { PCMCIA_CARD(XIRCOM, CFE_10, 0), 0}, | |
| { PCMCIA_CARD(ZONET, ZEN, 0), 0}, | |
| { { NULL } } | |
| }; | |
| static int | |
| ed_pccard_match(device_t dev) | |
| { | |
| const struct ed_product *pp; | |
| if ((pp = (const struct ed_product *) pccard_product_lookup(dev, | |
| (const struct pccard_product *) ed_pccard_products, | |
| sizeof(ed_pccard_products[0]), NULL)) != NULL) { | |
| if (pp->prod.pp_name != NULL) | |
| device_set_desc(dev, pp->prod.pp_name); | |
| if (pp->flags & NE2000DVF_DL10019) | |
| device_set_flags(dev, ED_FLAGS_LINKSYS); | |
| else if (pp->flags & NE2000DVF_AX88190) | |
| device_set_flags(dev, ED_FLAGS_AX88190); | |
| return (0); | |
| } | |
| return (EIO); | |
| } | |
| /* | /* |
| * Probe framework for pccards. Replicates the standard framework, | * Probe framework for pccards. Replicates the standard framework, |
| * minus the pccard driver registration and ignores the ether address | * minus the pccard driver registration and ignores the ether address |
| Line 140 ed_pccard_detach(device_t dev) | Line 214 ed_pccard_detach(device_t dev) |
| static int | static int |
| ed_pccard_probe(device_t dev) | ed_pccard_probe(device_t dev) |
| { | { |
| struct ed_softc *sc = device_get_softc(dev); | |
| int flags = device_get_flags(dev); | |
| int error; | int error; |
| int flags = device_get_flags(dev); | |
| if (ED_FLAGS_GETTYPE(flags) == ED_FLAGS_AX88190) { | if (ED_FLAGS_GETTYPE(flags) == ED_FLAGS_AX88190) { |
| /* Special setup for AX88190 */ | error = ed_pccard_ax88190(dev); |
| u_char rdbuf[4]; | goto end2; |
| int iobase; | |
| int attr_ioport; | |
| /* XXX Allocate the port resource during setup. */ | |
| error = ed_alloc_port(dev, 0, ED_NOVELL_IO_PORTS); | |
| if (error) | |
| return (error); | |
| sc->asic_offset = ED_NOVELL_ASIC_OFFSET; | |
| sc->nic_offset = ED_NOVELL_NIC_OFFSET; | |
| sc->chip_type = ED_CHIP_TYPE_AX88190; | |
| /* | |
| * Check & Set Attribute Memory IOBASE Register | |
| */ | |
| ed_pccard_memread(dev, ED_AX88190_IOBASE0, rdbuf, 4); | |
| attr_ioport = rdbuf[2] << 8 | rdbuf[0]; | |
| iobase = rman_get_start(sc->port_res); | |
| if (attr_ioport != iobase) { | |
| #if notdef | |
| printf("AX88190 IOBASE MISMATCH %04x -> %04x Setting\n", attr_ioport, iobase); | |
| #endif /* notdef */ | |
| ed_pccard_memwrite(dev, ED_AX88190_IOBASE0, | |
| iobase & 0xff); | |
| ed_pccard_memwrite(dev, ED_AX88190_IOBASE1, | |
| (iobase >> 8) & 0xff); | |
| } | |
| ax88190_geteprom(sc); | |
| ed_release_resources(dev); | |
| } | } |
| error = ed_probe_Novell(dev, 0, flags); | error = ed_probe_Novell(dev, 0, flags); |
| Line 192 ed_pccard_probe(device_t dev) | Line 234 ed_pccard_probe(device_t dev) |
| goto end2; | goto end2; |
| end: | end: |
| if (ED_FLAGS_GETTYPE(flags) & ED_FLAGS_LINKSYS) { | if (ED_FLAGS_GETTYPE(flags) & ED_FLAGS_LINKSYS) |
| linksys = ed_pccard_Linksys(dev); | ed_pccard_Linksys(dev); |
| } else { | |
| linksys = 0; | |
| } | |
| end2: | end2: |
| if (error == 0) | if (error == 0) |
| error = ed_alloc_irq(dev, 0, 0); | error = ed_alloc_irq(dev, 0, 0); |
| Line 209 static int | Line 248 static int |
| ed_pccard_attach(device_t dev) | ed_pccard_attach(device_t dev) |
| { | { |
| struct ed_softc *sc = device_get_softc(dev); | struct ed_softc *sc = device_get_softc(dev); |
| int flags = device_get_flags(dev); | |
| int error; | int error; |
| int i; | int i; |
| u_char sum; | u_char sum; |
| Line 229 ed_pccard_attach(device_t dev) | Line 267 ed_pccard_attach(device_t dev) |
| return (error); | return (error); |
| } | } |
| if (linksys == 0) { | if (sc->vendor != ED_VENDOR_LINKSYS) { |
| pccard_get_ether(dev, ether_addr); | pccard_get_ether(dev, ether_addr); |
| for (i = 0, sum = 0; i < ETHER_ADDR_LEN; i++) | for (i = 0, sum = 0; i < ETHER_ADDR_LEN; i++) |
| sum |= ether_addr[i]; | sum |= ether_addr[i]; |
| Line 237 ed_pccard_attach(device_t dev) | Line 275 ed_pccard_attach(device_t dev) |
| bcopy(ether_addr, sc->arpcom.ac_enaddr, ETHER_ADDR_LEN); | bcopy(ether_addr, sc->arpcom.ac_enaddr, ETHER_ADDR_LEN); |
| } | } |
| error = ed_attach(sc, device_get_unit(dev), flags); | error = ed_attach(dev); |
| #ifndef ED_NO_MIIBUS | |
| if (error == 0 && sc->vendor == ED_VENDOR_LINKSYS) { | if (error == 0 && sc->vendor == ED_VENDOR_LINKSYS) { |
| /* Probe for an MII bus, but ignore errors. */ | /* Probe for an MII bus, but ignore errors. */ |
| ed_pccard_dlink_mii_reset(sc); | ed_pccard_dlink_mii_reset(sc); |
| Line 246 ed_pccard_attach(device_t dev) | Line 285 ed_pccard_attach(device_t dev) |
| mii_phy_probe(dev, &sc->miibus, ed_ifmedia_upd, | mii_phy_probe(dev, &sc->miibus, ed_ifmedia_upd, |
| ed_ifmedia_sts); | ed_ifmedia_sts); |
| } | } |
| #endif | |
| return (error); | return (error); |
| } | } |
| Line 260 ax88190_geteprom(struct ed_softc *sc) | Line 300 ax88190_geteprom(struct ed_softc *sc) |
| } pg_seq[] = { | } pg_seq[] = { |
| {ED_P0_CR, ED_CR_RD2|ED_CR_STP}, /* Select Page0 */ | {ED_P0_CR, ED_CR_RD2|ED_CR_STP}, /* Select Page0 */ |
| {ED_P0_DCR, 0x01}, | {ED_P0_DCR, 0x01}, |
| {ED_P0_RBCR0, 0x00}, /* Clear the count regs. */ | {ED_P0_RBCR0, 0x00}, /* Clear the count regs. */ |
| {ED_P0_RBCR1, 0x00}, | {ED_P0_RBCR1, 0x00}, |
| {ED_P0_IMR, 0x00}, /* Mask completion irq. */ | {ED_P0_IMR, 0x00}, /* Mask completion irq. */ |
| {ED_P0_ISR, 0xff}, | {ED_P0_ISR, 0xff}, |
| {ED_P0_RCR, ED_RCR_MON | ED_RCR_INTT}, /* Set To Monitor */ | {ED_P0_RCR, ED_RCR_MON | ED_RCR_INTT}, /* Set To Monitor */ |
| {ED_P0_TCR, ED_TCR_LB0}, /* loopback mode. */ | {ED_P0_TCR, ED_TCR_LB0}, /* loopback mode. */ |
| {ED_P0_RBCR0, 32}, | {ED_P0_RBCR0, 32}, |
| {ED_P0_RBCR1, 0x00}, | {ED_P0_RBCR1, 0x00}, |
| {ED_P0_RSAR0, 0x00}, | {ED_P0_RSAR0, 0x00}, |
| Line 287 ax88190_geteprom(struct ed_softc *sc) | Line 327 ax88190_geteprom(struct ed_softc *sc) |
| /* Get Data */ | /* Get Data */ |
| for (i = 0; i < 16; i++) | for (i = 0; i < 16; i++) |
| prom[i] = ed_asic_inb(sc, 0); | prom[i] = ed_asic_inb(sc, 0); |
| /* | |
| for (i = 0; i < 16; i++) | |
| printf("ax88190 eprom [%02d] %02x %02x\n", | |
| i,prom[i] & 0xff,prom[i] >> 8); | |
| */ | |
| sc->arpcom.ac_enaddr[0] = prom[0] & 0xff; | sc->arpcom.ac_enaddr[0] = prom[0] & 0xff; |
| sc->arpcom.ac_enaddr[1] = prom[0] >> 8; | sc->arpcom.ac_enaddr[1] = prom[0] >> 8; |
| sc->arpcom.ac_enaddr[2] = prom[1] & 0xff; | sc->arpcom.ac_enaddr[2] = prom[1] & 0xff; |
| Line 300 ax88190_geteprom(struct ed_softc *sc) | Line 335 ax88190_geteprom(struct ed_softc *sc) |
| sc->arpcom.ac_enaddr[5] = prom[2] >> 8; | sc->arpcom.ac_enaddr[5] = prom[2] >> 8; |
| } | } |
| /* XXX: Warner-san, any plan to provide access to the attribute memory? */ | |
| static int | static int |
| ed_pccard_memwrite(device_t dev, off_t offset, u_char byte) | ed_pccard_memwrite(device_t dev, off_t offset, u_char byte) |
| { | { |
| struct pccard_devinfo *devi; | int cis_rid; |
| dev_t d; | struct resource *cis; |
| struct iovec iov; | |
| struct uio uios; | cis_rid = 0; |
| cis = bus_alloc_resource(dev, SYS_RES_MEMORY, &cis_rid, 0, ~0, | |
| devi = device_get_ivars(dev); | 4 << 10, RF_ACTIVE | RF_SHAREABLE); |
| if (cis == NULL) | |
| iov.iov_base = &byte; | return (ENXIO); |
| iov.iov_len = sizeof(byte); | CARD_SET_RES_FLAGS(device_get_parent(dev), dev, SYS_RES_MEMORY, |
| cis_rid, PCCARD_A_MEM_ATTR); | |
| uios.uio_iov = &iov; | |
| uios.uio_iovcnt = 1; | |
| uios.uio_offset = offset; | |
| uios.uio_resid = sizeof(byte); | |
| uios.uio_segflg = UIO_SYSSPACE; | |
| uios.uio_rw = UIO_WRITE; | |
| uios.uio_td = NULL; | |
| d = makedev(CARD_MAJOR, devi->slt->slotnum); | bus_space_write_1(rman_get_bustag(cis), rman_get_bushandle(cis), |
| return (dev_dwrite(d, &uios, 0)); | offset, byte); |
| } | |
| static int | bus_deactivate_resource(dev, SYS_RES_MEMORY, cis_rid, cis); |
| ed_pccard_memread(device_t dev, off_t offset, u_char *buf, int size) | bus_release_resource(dev, SYS_RES_MEMORY, cis_rid, cis); |
| { | |
| struct pccard_devinfo *devi; | |
| dev_t d; | |
| struct iovec iov; | |
| struct uio uios; | |
| devi = device_get_ivars(dev); | |
| iov.iov_base = buf; | |
| iov.iov_len = size; | |
| uios.uio_iov = &iov; | |
| uios.uio_iovcnt = 1; | |
| uios.uio_offset = offset; | |
| uios.uio_resid = size; | |
| uios.uio_segflg = UIO_SYSSPACE; | |
| uios.uio_rw = UIO_READ; | |
| uios.uio_td = NULL; | |
| d = makedev(CARD_MAJOR, devi->slt->slotnum); | return (0); |
| return (dev_dread(d, &uios, 0)); | |
| } | } |
| /* | /* |
| Line 390 ed_pccard_Linksys(device_t dev) | Line 397 ed_pccard_Linksys(device_t dev) |
| return (1); | return (1); |
| } | } |
| /* | |
| * Special setup for AX88190 | |
| */ | |
| static int | |
| ed_pccard_ax88190(device_t dev) | |
| { | |
| int error; | |
| int flags = device_get_flags(dev); | |
| int iobase; | |
| struct ed_softc *sc = device_get_softc(dev); | |
| /* Allocate the port resource during setup. */ | |
| error = ed_alloc_port(dev, 0, ED_NOVELL_IO_PORTS); | |
| if (error) | |
| return (error); | |
| sc->asic_offset = ED_NOVELL_ASIC_OFFSET; | |
| sc->nic_offset = ED_NOVELL_NIC_OFFSET; | |
| sc->chip_type = ED_CHIP_TYPE_AX88190; | |
| /* | |
| * Set Attribute Memory IOBASE Register. Is this a deficiency in | |
| * the PC Card layer, or an ax88190 specific issue? xxx | |
| */ | |
| iobase = rman_get_start(sc->port_res); | |
| ed_pccard_memwrite(dev, ED_AX88190_IOBASE0, iobase & 0xff); | |
| ed_pccard_memwrite(dev, ED_AX88190_IOBASE1, (iobase >> 8) & 0xff); | |
| ax88190_geteprom(sc); | |
| ed_release_resources(dev); | |
| error = ed_probe_Novell(dev, 0, flags); | |
| if (error == 0) { | |
| sc->vendor = ED_VENDOR_PCCARD; | |
| sc->type = ED_TYPE_NE2000; | |
| sc->type_str = "AX88190"; | |
| } | |
| return (error); | |
| } | |
| #ifndef ED_NO_MIIBUS | |
| /* MII bit-twiddling routines for cards using Dlink chipset */ | /* MII bit-twiddling routines for cards using Dlink chipset */ |
| #define DLINK_MIISET(sc, x) ed_asic_outb(sc, ED_DLINK_MIIBUS, \ | #define DLINK_MIISET(sc, x) ed_asic_outb(sc, ED_DLINK_MIIBUS, \ |
| ed_asic_inb(sc, ED_DLINK_MIIBUS) | (x)) | ed_asic_inb(sc, ED_DLINK_MIIBUS) | (x)) |
| Line 457 ed_pccard_dlink_mii_readbits(sc, nbits) | Line 503 ed_pccard_dlink_mii_readbits(sc, nbits) |
| return val; | return val; |
| } | } |
| #endif | |
| static device_method_t ed_pccard_methods[] = { | |
| /* Device interface */ | |
| DEVMETHOD(device_probe, pccard_compat_probe), | |
| DEVMETHOD(device_attach, pccard_compat_attach), | |
| DEVMETHOD(device_detach, ed_pccard_detach), | |
| #ifndef ED_NO_MIIBUS | |
| /* Bus interface */ | |
| DEVMETHOD(bus_child_detached, ed_child_detached), | |
| /* MII interface */ | |
| DEVMETHOD(miibus_readreg, ed_miibus_readreg), | |
| DEVMETHOD(miibus_writereg, ed_miibus_writereg), | |
| #endif | |
| /* Card interface */ | |
| DEVMETHOD(card_compat_match, ed_pccard_match), | |
| DEVMETHOD(card_compat_probe, ed_pccard_probe), | |
| DEVMETHOD(card_compat_attach, ed_pccard_attach), | |
| { 0, 0 } | |
| }; | |
| static driver_t ed_pccard_driver = { | |
| "ed", | |
| ed_pccard_methods, | |
| sizeof(struct ed_softc) | |
| }; | |
| DRIVER_MODULE(if_ed, pccard, ed_pccard_driver, ed_devclass, 0, 0); | |
| #ifndef ED_NO_MIIBUS | |
| MODULE_DEPEND(if_ed, miibus, 1, 1, 1); | |
| DRIVER_MODULE(miibus, ed, miibus_driver, miibus_devclass, 0, 0); | |
| #endif |