if_sn_pccard.c revision 66058
154994Simp/* 254994Simp * Copyright (c) 1999 M. Warner Losh <imp@village.org> 354994Simp * All rights reserved. 454994Simp * 554994Simp * Redistribution and use in source and binary forms, with or without 654994Simp * modification, are permitted provided that the following conditions 754994Simp * are met: 854994Simp * 1. Redistributions of source code must retain the above copyright 954994Simp * notice, this list of conditions and the following disclaimer. 1054994Simp * 2. Redistributions in binary form must reproduce the above copyright 1154994Simp * notice, this list of conditions and the following disclaimer in the 1254994Simp * documentation and/or other materials provided with the distribution. 1354994Simp * 1454994Simp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1554994Simp * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1654994Simp * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1754994Simp * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 1854994Simp * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 1954994Simp * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2054994Simp * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2154994Simp * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2254994Simp * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2354994Simp * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2454994Simp * 2554994Simp * $FreeBSD: head/sys/dev/sn/if_sn_pccard.c 66058 2000-09-19 04:39:20Z imp $ 2654994Simp */ 2754994Simp 2854994Simp/* 2954994Simp * Modifications for Megahertz X-Jack Ethernet Card (XJ-10BT) 3054994Simp * 3154994Simp * Copyright (c) 1996 by Tatsumi Hosokawa <hosokawa@jp.FreeBSD.org> 3254994Simp * BSD-nomads, Tokyo, Japan. 3354994Simp */ 3454994Simp 3554994Simp#include <sys/param.h> 3654994Simp#include <sys/systm.h> 3754994Simp#include <sys/kernel.h> 3854994Simp#include <sys/socket.h> 3954994Simp 4054994Simp#include <sys/module.h> 4154994Simp#include <sys/bus.h> 4254994Simp 4354994Simp#include <machine/bus.h> 4454994Simp#include <machine/resource.h> 4554994Simp#include <sys/rman.h> 4654994Simp 4756366Shosokawa#include <net/ethernet.h> 4854994Simp#include <net/if.h> 4954994Simp#include <net/if_arp.h> 5054994Simp#include <net/if_media.h> 5154994Simp 5254994Simp#include <machine/clock.h> 5354994Simp 5454994Simp#include <dev/sn/if_snreg.h> 5554994Simp#include <dev/sn/if_snvar.h> 5656366Shosokawa#include <dev/pccard/pccardvar.h> 5754994Simp 5866058Simp#include <dev/pccard/pccarddevs.h> 5966058Simp 6066058Simp#include "card_if.h" 6166058Simp 6254994Simp/* 6354994Simp * Initialize the device - called from Slot manager. 6454994Simp */ 6554994Simpstatic int 6654994Simpsn_pccard_probe(device_t dev) 6754994Simp{ 6866058Simp int err; 6966058Simp 7066058Simp printf ("Probing sn driver\n"); 7166058Simp err = sn_probe(dev, 1); 7266058Simp printf("sn_probe says %d\n", err); 7366058Simp return (err); 7454994Simp} 7554994Simp 7654994Simpstatic int 7754994Simpsn_pccard_attach(device_t dev) 7854994Simp{ 7956366Shosokawa struct sn_softc *sc = device_get_softc(dev); 8056366Shosokawa int i; 8156366Shosokawa u_char sum; 8256366Shosokawa u_char ether_addr[ETHER_ADDR_LEN]; 8356366Shosokawa 8456397Shosokawa sc->pccard_enaddr = 0; 8556366Shosokawa pccard_get_ether(dev, ether_addr); 8656366Shosokawa for (i = 0, sum = 0; i < ETHER_ADDR_LEN; i++) 8756366Shosokawa sum |= ether_addr[i]; 8856397Shosokawa if (sum) { 8956397Shosokawa sc->pccard_enaddr = 1; 9056366Shosokawa bcopy(ether_addr, sc->arpcom.ac_enaddr, ETHER_ADDR_LEN); 9156397Shosokawa } 9254994Simp return (sn_attach(dev)); 9354994Simp} 9454994Simp 9554994Simpstatic int 9654994Simpsn_pccard_detach(device_t dev) 9754994Simp{ 9854994Simp struct sn_softc *sc = device_get_softc(dev); 9954994Simp 10054994Simp sc->arpcom.ac_if.if_flags &= ~IFF_RUNNING; 10163090Sarchie ether_ifdetach(&sc->arpcom.ac_if, ETHER_BPF_SUPPORTED); 10254994Simp sn_deactivate(dev); 10354994Simp return 0; 10454994Simp} 10554994Simp 10666058Simpstatic int 10766058Simpsn_pccard_match(device_t dev) 10866058Simp{ 10966058Simp return EIO; 11066058Simp} 11166058Simp 11254994Simpstatic device_method_t sn_pccard_methods[] = { 11354994Simp /* Device interface */ 11466058Simp DEVMETHOD(device_probe, pccard_compat_probe), 11566058Simp DEVMETHOD(device_attach, pccard_compat_attach), 11654994Simp DEVMETHOD(device_detach, sn_pccard_detach), 11754994Simp 11866058Simp /* Card interface */ 11966058Simp DEVMETHOD(card_compat_match, sn_pccard_match), 12066058Simp DEVMETHOD(card_compat_probe, sn_pccard_probe), 12166058Simp DEVMETHOD(card_compat_attach, sn_pccard_attach), 12266058Simp 12354994Simp { 0, 0 } 12454994Simp}; 12554994Simp 12654994Simpstatic driver_t sn_pccard_driver = { 12754994Simp "sn", 12854994Simp sn_pccard_methods, 12954994Simp sizeof(struct sn_softc), 13054994Simp}; 13154994Simp 13254994Simpextern devclass_t sn_devclass; 13354994Simp 13466058SimpDRIVER_MODULE(if_sn, pccard, sn_pccard_driver, sn_devclass, 0, 0); 13566058SimpMODULE_DEPEND(if_sn, pccard, 1, 1, 1); 13666058SimpMODULE_DEPEND(if_sn, pcic, 1, 1, 1); /* XXX */ 137