1179595Sbenno/*- 2179595Sbenno * Copyright (c) 2008 Benno Rice 3179595Sbenno * All rights reserved. 4179595Sbenno * 5179595Sbenno * Redistribution and use in source and binary forms, with or without 6179595Sbenno * modification, are permitted provided that the following conditions 7179595Sbenno * are met: 8179595Sbenno * 1. Redistributions of source code must retain the above copyright 9179595Sbenno * notice, this list of conditions and the following disclaimer. 10179595Sbenno * 2. Redistributions in binary form must reproduce the above copyright 11179595Sbenno * notice, this list of conditions and the following disclaimer in the 12179595Sbenno * documentation and/or other materials provided with the distribution. 13179595Sbenno * 14179595Sbenno * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15179595Sbenno * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16179595Sbenno * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17179595Sbenno * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18179595Sbenno * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19179595Sbenno * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20179595Sbenno * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21179595Sbenno * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22179595Sbenno * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23179595Sbenno * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24179595Sbenno * 25179595Sbenno */ 26179595Sbenno 27179595Sbenno#include <sys/cdefs.h> 28179595Sbenno__FBSDID("$FreeBSD$"); 29179595Sbenno 30179595Sbenno#include <sys/param.h> 31259342Sian#include <sys/bus.h> 32179595Sbenno#include <sys/kernel.h> 33259342Sian#include <sys/module.h> 34179595Sbenno#include <sys/socket.h> 35259342Sian#include <sys/systm.h> 36259342Sian#include <sys/taskqueue.h> 37179595Sbenno 38179595Sbenno#include <machine/bus.h> 39179595Sbenno#include <machine/resource.h> 40179595Sbenno 41236987Simp#include <net/ethernet.h> 42179595Sbenno#include <net/if.h> 43179595Sbenno#include <net/if_arp.h> 44179595Sbenno#include <net/if_media.h> 45179595Sbenno 46179595Sbenno#include <dev/smc/if_smcvar.h> 47179595Sbenno 48179595Sbenno#include <dev/mii/mii.h> 49179595Sbenno#include <dev/mii/miivar.h> 50179595Sbenno 51179595Sbenno#include "miibus_if.h" 52179595Sbenno 53179595Sbenno#include <arm/xscale/pxa/pxareg.h> 54179595Sbenno#include <arm/xscale/pxa/pxavar.h> 55179595Sbenno 56179595Sbennostatic int smc_smi_probe(device_t); 57179595Sbennostatic int smc_smi_attach(device_t); 58179595Sbennostatic int smc_smi_detach(device_t); 59179595Sbenno 60179595Sbennostatic int 61179595Sbennosmc_smi_probe(device_t dev) 62179595Sbenno{ 63179595Sbenno struct smc_softc *sc; 64179595Sbenno 65179595Sbenno sc = device_get_softc(dev); 66179595Sbenno sc->smc_usemem = 1; 67179595Sbenno 68179595Sbenno if (smc_probe(dev) != 0) { 69179595Sbenno return (ENXIO); 70179595Sbenno } 71179595Sbenno return (0); 72179595Sbenno} 73179595Sbenno 74179595Sbennostatic int 75179595Sbennosmc_smi_attach(device_t dev) 76179595Sbenno{ 77179595Sbenno int err; 78179595Sbenno struct smc_softc *sc; 79179595Sbenno 80179595Sbenno sc = device_get_softc(dev); 81179595Sbenno 82179595Sbenno err = smc_attach(dev); 83179595Sbenno if (err) { 84179595Sbenno return (err); 85179595Sbenno } 86179595Sbenno 87179595Sbenno return (0); 88179595Sbenno} 89179595Sbenno 90179595Sbennostatic int 91179595Sbennosmc_smi_detach(device_t dev) 92179595Sbenno{ 93179595Sbenno 94179595Sbenno smc_detach(dev); 95179595Sbenno 96179595Sbenno return (0); 97179595Sbenno} 98179595Sbenno 99179595Sbennostatic device_method_t smc_smi_methods[] = { 100179595Sbenno /* Device interface */ 101179595Sbenno DEVMETHOD(device_probe, smc_smi_probe), 102179595Sbenno DEVMETHOD(device_attach, smc_smi_attach), 103179595Sbenno DEVMETHOD(device_detach, smc_smi_detach), 104179595Sbenno 105179595Sbenno /* MII interface */ 106179595Sbenno DEVMETHOD(miibus_readreg, smc_miibus_readreg), 107179595Sbenno DEVMETHOD(miibus_writereg, smc_miibus_writereg), 108179595Sbenno DEVMETHOD(miibus_statchg, smc_miibus_statchg), 109179595Sbenno 110179595Sbenno { 0, 0 } 111179595Sbenno}; 112179595Sbenno 113179595Sbennostatic driver_t smc_smi_driver = { 114179595Sbenno "smc", 115179595Sbenno smc_smi_methods, 116179595Sbenno sizeof(struct smc_softc), 117179595Sbenno}; 118179595Sbenno 119179595Sbennoextern devclass_t smc_devclass; 120179595Sbenno 121179595SbennoDRIVER_MODULE(smc, smi, smc_smi_driver, smc_devclass, 0, 0); 122179595SbennoDRIVER_MODULE(miibus, smc, miibus_driver, miibus_devclass, 0, 0); 123179595SbennoMODULE_DEPEND(smc, smi, 1, 1, 1); 124179595SbennoMODULE_DEPEND(smc, ether, 1, 1, 1); 125179595SbennoMODULE_DEPEND(smc, miibus, 1, 1, 1); 126