Deleted Added
full compact
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);