if_ed_pccard.c (71324) | if_ed_pccard.c (73374) |
---|---|
1/* 2 * Copyright (c) 1995, David Greenman 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 10 unchanged lines hidden (view full) --- 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * | 1/* 2 * Copyright (c) 1995, David Greenman 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 10 unchanged lines hidden (view full) --- 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * |
27 * $FreeBSD: head/sys/dev/ed/if_ed_pccard.c 71324 2001-01-21 08:20:23Z imp $ | 27 * $FreeBSD: head/sys/dev/ed/if_ed_pccard.c 73374 2001-03-03 08:31:37Z imp $ |
28 */ 29 30#include <sys/param.h> 31#include <sys/systm.h> 32#include <sys/socket.h> 33#include <sys/kernel.h> 34#include <sys/conf.h> 35#include <sys/uio.h> 36 37#include <sys/module.h> 38#include <sys/bus.h> 39#include <machine/bus.h> 40#include <sys/rman.h> 41#include <machine/resource.h> 42 43#include <net/ethernet.h> 44#include <net/if.h> 45#include <net/if_arp.h> 46#include <net/if_mib.h> | 28 */ 29 30#include <sys/param.h> 31#include <sys/systm.h> 32#include <sys/socket.h> 33#include <sys/kernel.h> 34#include <sys/conf.h> 35#include <sys/uio.h> 36 37#include <sys/module.h> 38#include <sys/bus.h> 39#include <machine/bus.h> 40#include <sys/rman.h> 41#include <machine/resource.h> 42 43#include <net/ethernet.h> 44#include <net/if.h> 45#include <net/if_arp.h> 46#include <net/if_mib.h> |
47#include <net/if_media.h> |
|
47 48#include <dev/ed/if_edreg.h> 49#include <dev/ed/if_edvar.h> 50#include <dev/pccard/pccardvar.h> 51#include <dev/pccard/pccarddevs.h> | 48 49#include <dev/ed/if_edreg.h> 50#include <dev/ed/if_edvar.h> 51#include <dev/pccard/pccardvar.h> 52#include <dev/pccard/pccarddevs.h> |
53#include <dev/mii/mii.h> 54#include <dev/mii/miivar.h> |
|
52 53#include "card_if.h" | 55 56#include "card_if.h" |
57/* "device miibus" required. See GENERIC if you get errors here. */ 58#include "miibus_if.h" |
|
54 | 59 |
60MODULE_DEPEND(ed, miibus, 1, 1, 1); 61 |
|
55/* 56 * PC-Card (PCMCIA) specific code. 57 */ 58static int ed_pccard_match(device_t); 59static int ed_pccard_probe(device_t); 60static int ed_pccard_attach(device_t); 61static int ed_pccard_detach(device_t); 62 63static int ed_pccard_Linksys(device_t dev); 64static int ed_pccard_ax88190(device_t dev); 65 66static void ax88190_geteprom(struct ed_softc *); 67static int ed_pccard_memwrite(device_t dev, off_t offset, u_char byte); | 62/* 63 * PC-Card (PCMCIA) specific code. 64 */ 65static int ed_pccard_match(device_t); 66static int ed_pccard_probe(device_t); 67static int ed_pccard_attach(device_t); 68static int ed_pccard_detach(device_t); 69 70static int ed_pccard_Linksys(device_t dev); 71static int ed_pccard_ax88190(device_t dev); 72 73static void ax88190_geteprom(struct ed_softc *); 74static int ed_pccard_memwrite(device_t dev, off_t offset, u_char byte); |
75static void ed_pccard_dlink_mii_reset(struct ed_softc *sc); 76static u_int ed_pccard_dlink_mii_readbits(struct ed_softc *sc, int nbits); 77static void ed_pccard_dlink_mii_writebits(struct ed_softc *sc, u_int val, 78 int nbits); |
|
68static int linksys; 69 70/* 71 * ed_pccard_detach - unload the driver and clear the table. 72 * XXX TODO: 73 * This is usually called when the card is ejected, but 74 * can be caused by a modunload of a controller driver. 75 * The idea is to reset the driver's view of the device --- 578 unchanged lines hidden (view full) --- 654 for (i = 0; i < ETHER_ADDR_LEN; i++) { 655 sc->arpcom.ac_enaddr[i] = ed_asic_inb(sc, 0x04 + i); 656 } 657 658 ed_nic_outb(sc, ED_P0_DCR, ED_DCR_WTS | ED_DCR_FT1 | ED_DCR_LS); 659 sc->isa16bit = 1; 660 sc->type = ED_TYPE_NE2000; 661 sc->type_str = "Linksys"; | 79static int linksys; 80 81/* 82 * ed_pccard_detach - unload the driver and clear the table. 83 * XXX TODO: 84 * This is usually called when the card is ejected, but 85 * can be caused by a modunload of a controller driver. 86 * The idea is to reset the driver's view of the device --- 578 unchanged lines hidden (view full) --- 665 for (i = 0; i < ETHER_ADDR_LEN; i++) { 666 sc->arpcom.ac_enaddr[i] = ed_asic_inb(sc, 0x04 + i); 667 } 668 669 ed_nic_outb(sc, ED_P0_DCR, ED_DCR_WTS | ED_DCR_FT1 | ED_DCR_LS); 670 sc->isa16bit = 1; 671 sc->type = ED_TYPE_NE2000; 672 sc->type_str = "Linksys"; |
673 674 /* Probe for an MII bus, but continue as normal if there isn't one. */ 675 ed_pccard_dlink_mii_reset(sc); 676 sc->mii_readbits = ed_pccard_dlink_mii_readbits; 677 sc->mii_writebits = ed_pccard_dlink_mii_writebits; 678 mii_phy_probe(dev, &sc->miibus, ed_ifmedia_upd, ed_ifmedia_sts); 679 |
|
662 return (1); 663} 664 665/* 666 * Special setup for AX88190 667 */ 668static int 669ed_pccard_ax88190(device_t dev) --- 19 unchanged lines hidden (view full) --- 689 ed_pccard_memwrite(dev, ED_AX88190_IOBASE0, iobase & 0xff); 690 ed_pccard_memwrite(dev, ED_AX88190_IOBASE1, (iobase >> 8) & 0xff); 691 ax88190_geteprom(sc); 692 ed_release_resources(dev); 693 error = ed_probe_Novell(dev, 0, flags); 694 return (error); 695} 696 | 680 return (1); 681} 682 683/* 684 * Special setup for AX88190 685 */ 686static int 687ed_pccard_ax88190(device_t dev) --- 19 unchanged lines hidden (view full) --- 707 ed_pccard_memwrite(dev, ED_AX88190_IOBASE0, iobase & 0xff); 708 ed_pccard_memwrite(dev, ED_AX88190_IOBASE1, (iobase >> 8) & 0xff); 709 ax88190_geteprom(sc); 710 ed_release_resources(dev); 711 error = ed_probe_Novell(dev, 0, flags); 712 return (error); 713} 714 |
715/* MII bit-twiddling routines for cards using Dlink chipset */ 716#define DLINK_MIISET(sc, x) ed_asic_outb(sc, ED_DLINK_MIIBUS, \ 717 ed_asic_inb(sc, ED_DLINK_MIIBUS) | (x)) 718#define DLINK_MIICLR(sc, x) ed_asic_outb(sc, ED_DLINK_MIIBUS, \ 719 ed_asic_inb(sc, ED_DLINK_MIIBUS) & ~(x)) 720 721static void 722ed_pccard_dlink_mii_reset(sc) 723 struct ed_softc *sc; 724{ 725 ed_asic_outb(sc, ED_DLINK_MIIBUS, 0); 726 DELAY(10); 727 DLINK_MIISET(sc, ED_DLINK_MII_RESET2); 728 DELAY(10); 729 DLINK_MIISET(sc, ED_DLINK_MII_RESET1); 730 DELAY(10); 731 DLINK_MIICLR(sc, ED_DLINK_MII_RESET1); 732 DELAY(10); 733 DLINK_MIICLR(sc, ED_DLINK_MII_RESET2); 734 DELAY(10); 735} 736 737static void 738ed_pccard_dlink_mii_writebits(sc, val, nbits) 739 struct ed_softc *sc; 740 u_int val; 741 int nbits; 742{ 743 int i; 744 745 DLINK_MIISET(sc, ED_DLINK_MII_DIROUT); 746 747 for (i = nbits - 1; i >= 0; i--) { 748 if ((val >> i) & 1) 749 DLINK_MIISET(sc, ED_DLINK_MII_DATAOUT); 750 else 751 DLINK_MIICLR(sc, ED_DLINK_MII_DATAOUT); 752 DELAY(10); 753 DLINK_MIISET(sc, ED_DLINK_MII_CLK); 754 DELAY(10); 755 DLINK_MIICLR(sc, ED_DLINK_MII_CLK); 756 DELAY(10); 757 } 758} 759 760static u_int 761ed_pccard_dlink_mii_readbits(sc, nbits) 762 struct ed_softc *sc; 763 int nbits; 764{ 765 int i; 766 u_int val = 0; 767 768 DLINK_MIICLR(sc, ED_DLINK_MII_DIROUT); 769 770 for (i = nbits - 1; i >= 0; i--) { 771 DLINK_MIISET(sc, ED_DLINK_MII_CLK); 772 DELAY(10); 773 val <<= 1; 774 if (ed_asic_inb(sc, ED_DLINK_MIIBUS) & ED_DLINK_MII_DATATIN) 775 val++; 776 DLINK_MIICLR(sc, ED_DLINK_MII_CLK); 777 DELAY(10); 778 } 779 780 return val; 781} 782 |
|
697static device_method_t ed_pccard_methods[] = { 698 /* Device interface */ 699 DEVMETHOD(device_probe, pccard_compat_probe), 700 DEVMETHOD(device_attach, pccard_compat_attach), 701 DEVMETHOD(device_detach, ed_pccard_detach), 702 | 783static device_method_t ed_pccard_methods[] = { 784 /* Device interface */ 785 DEVMETHOD(device_probe, pccard_compat_probe), 786 DEVMETHOD(device_attach, pccard_compat_attach), 787 DEVMETHOD(device_detach, ed_pccard_detach), 788 |
789 /* Bus interface */ 790 DEVMETHOD(bus_child_detached, ed_child_detached), 791 792 /* MII interface */ 793 DEVMETHOD(miibus_readreg, ed_miibus_readreg), 794 DEVMETHOD(miibus_writereg, ed_miibus_writereg), 795 |
|
703 /* Card interface */ 704 DEVMETHOD(card_compat_match, ed_pccard_match), 705 DEVMETHOD(card_compat_probe, ed_pccard_probe), 706 DEVMETHOD(card_compat_attach, ed_pccard_attach), 707 { 0, 0 } 708}; 709 710static driver_t ed_pccard_driver = { 711 "ed", 712 ed_pccard_methods, 713 sizeof(struct ed_softc) 714}; 715 716DRIVER_MODULE(if_ed, pccard, ed_pccard_driver, ed_devclass, 0, 0); | 796 /* Card interface */ 797 DEVMETHOD(card_compat_match, ed_pccard_match), 798 DEVMETHOD(card_compat_probe, ed_pccard_probe), 799 DEVMETHOD(card_compat_attach, ed_pccard_attach), 800 { 0, 0 } 801}; 802 803static driver_t ed_pccard_driver = { 804 "ed", 805 ed_pccard_methods, 806 sizeof(struct ed_softc) 807}; 808 809DRIVER_MODULE(if_ed, pccard, ed_pccard_driver, ed_devclass, 0, 0); |
810DRIVER_MODULE(miibus, ed, miibus_driver, miibus_devclass, 0, 0); |
|