root/dev/pcmcia/if_wi_pcmcia.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. wi_lookup
  2. wi_pcmcia_match
  3. wi_pcmcia_attach
  4. wi_pcmcia_detach
  5. wi_pcmcia_activate

    1 /* $OpenBSD: if_wi_pcmcia.c,v 1.66 2006/11/26 19:46:28 deraadt Exp $ */
    2 /* $NetBSD: if_wi_pcmcia.c,v 1.14 2001/11/26 04:34:56 ichiro Exp $ */
    3 
    4 /*
    5  * Copyright (c) 1997, 1998, 1999
    6  *      Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  * 3. All advertising materials mentioning features or use of this software
   17  *    must display the following acknowledgement:
   18  *      This product includes software developed by Bill Paul.
   19  * 4. Neither the name of the author nor the names of any co-contributors
   20  *    may be used to endorse or promote products derived from this software
   21  *    without specific prior written permission.
   22  *
   23  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
   24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   26  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
   27  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   30  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   31  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   32  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
   33  * THE POSSIBILITY OF SUCH DAMAGE.
   34  *
   35  *      From: if_wi.c,v 1.7 1999/07/04 14:40:22 wpaul Exp $
   36  */
   37 
   38 /*
   39  * Lucent WaveLAN/IEEE 802.11 PCMCIA driver for OpenBSD.
   40  *
   41  * Originally written by Bill Paul <wpaul@ctr.columbia.edu>
   42  * Electrical Engineering Department
   43  * Columbia University, New York City
   44  */
   45 
   46 #include <sys/param.h>
   47 #include <sys/systm.h>
   48 #include <sys/timeout.h>
   49 #include <sys/socket.h>
   50 #include <sys/device.h>
   51 #include <sys/tree.h>
   52 
   53 #include <net/if.h>
   54 #include <net/if_dl.h>
   55 #include <net/if_media.h>
   56 
   57 #ifdef INET
   58 #include <netinet/in.h>
   59 #include <netinet/if_ether.h>
   60 #endif
   61 
   62 #include <net80211/ieee80211_var.h>
   63 #include <net80211/ieee80211_ioctl.h>
   64 
   65 #include <machine/bus.h>
   66 
   67 #include <dev/pcmcia/pcmciareg.h>
   68 #include <dev/pcmcia/pcmciavar.h>
   69 #include <dev/pcmcia/pcmciadevs.h>
   70 
   71 #include <dev/ic/if_wireg.h>
   72 #include <dev/ic/if_wi_ieee.h>
   73 #include <dev/ic/if_wivar.h>
   74 
   75 int     wi_pcmcia_match(struct device *, void *, void *);
   76 void    wi_pcmcia_attach(struct device *, struct device *, void *);
   77 int     wi_pcmcia_detach(struct device *, int);
   78 int     wi_pcmcia_activate(struct device *, enum devact);
   79 
   80 struct wi_pcmcia_softc {
   81         struct wi_softc sc_wi;
   82 
   83         struct pcmcia_io_handle sc_pcioh;
   84         int                     sc_io_window;
   85         struct pcmcia_function  *sc_pf;
   86 };
   87 
   88 struct cfattach wi_pcmcia_ca = {
   89         sizeof (struct wi_pcmcia_softc), wi_pcmcia_match, wi_pcmcia_attach,
   90         wi_pcmcia_detach, wi_pcmcia_activate
   91 };
   92 
   93 static const struct wi_pcmcia_product {
   94         u_int16_t       pp_vendor;
   95         u_int16_t       pp_product;
   96         const char      *pp_cisinfo[4];
   97 } wi_pcmcia_products[] = {
   98         { PCMCIA_VENDOR_LUCENT,
   99           PCMCIA_PRODUCT_LUCENT_WAVELAN_IEEE,
  100           PCMCIA_CIS_LUCENT_WAVELAN_IEEE
  101         },
  102         { PCMCIA_VENDOR_3COM,
  103           PCMCIA_PRODUCT_3COM_3CRWE737A,
  104           PCMCIA_CIS_3COM_3CRWE737A
  105         },
  106         { PCMCIA_VENDOR_3COM,
  107           PCMCIA_PRODUCT_3COM_3CRWE777A,
  108           PCMCIA_CIS_3COM_3CRWE777A
  109         },
  110         { PCMCIA_VENDOR_COREGA,
  111           PCMCIA_PRODUCT_COREGA_WIRELESS_LAN_PCC_11,
  112           PCMCIA_CIS_COREGA_WIRELESS_LAN_PCC_11
  113         },
  114         { PCMCIA_VENDOR_COREGA,
  115           PCMCIA_PRODUCT_COREGA_WIRELESS_LAN_PCCA_11,
  116           PCMCIA_CIS_COREGA_WIRELESS_LAN_PCCA_11
  117         },
  118         { PCMCIA_VENDOR_COREGA,
  119           PCMCIA_PRODUCT_COREGA_WIRELESS_LAN_PCCB_11,
  120           PCMCIA_CIS_COREGA_WIRELESS_LAN_PCCB_11
  121         },
  122         { PCMCIA_VENDOR_COREGA,
  123           PCMCIA_PRODUCT_COREGA_WIRELESS_LAN_PCCL_11,
  124           PCMCIA_CIS_COREGA_WIRELESS_LAN_PCCL_11
  125         },
  126         { PCMCIA_VENDOR_COREGA,
  127           PCMCIA_PRODUCT_COREGA_WIRELESS_LAN_WLCFL_11,
  128           PCMCIA_CIS_COREGA_WIRELESS_LAN_WLCFL_11
  129         },
  130         { PCMCIA_VENDOR_INTEL,
  131           PCMCIA_PRODUCT_INTEL_PRO_WLAN_2011,
  132           PCMCIA_CIS_INTEL_PRO_WLAN_2011
  133         },
  134         { PCMCIA_VENDOR_INTERSIL,
  135           PCMCIA_PRODUCT_INTERSIL_PRISM2,
  136           PCMCIA_CIS_INTERSIL_PRISM2
  137         },
  138         { PCMCIA_VENDOR_SAMSUNG,
  139           PCMCIA_PRODUCT_SAMSUNG_SWL_2000N,
  140           PCMCIA_CIS_SAMSUNG_SWL_2000N
  141         },
  142         { PCMCIA_VENDOR_LINKSYS2,
  143           PCMCIA_PRODUCT_LINKSYS2_IWN,
  144           PCMCIA_CIS_LINKSYS2_IWN
  145         },
  146         { PCMCIA_VENDOR_LINKSYS2,
  147           PCMCIA_PRODUCT_LINKSYS2_IWN2,
  148           PCMCIA_CIS_LINKSYS2_IWN2
  149         },
  150         { PCMCIA_VENDOR_LINKSYS2,
  151           PCMCIA_PRODUCT_LINKSYS2_WCF11,
  152           PCMCIA_CIS_LINKSYS2_WCF11
  153         },
  154         { PCMCIA_VENDOR_LUCENT,
  155           PCMCIA_PRODUCT_LUCENT_WAVELAN_IEEE,
  156           PCMCIA_CIS_SMC_2632W
  157         },
  158         { PCMCIA_VENDOR_LUCENT,
  159           PCMCIA_PRODUCT_LUCENT_WAVELAN_IEEE,
  160           PCMCIA_CIS_NANOSPEED_PRISM2
  161         },
  162         { PCMCIA_VENDOR_ELSA,
  163           PCMCIA_PRODUCT_ELSA_XI300_IEEE,
  164           PCMCIA_CIS_ELSA_XI300_IEEE
  165         },
  166         { PCMCIA_VENDOR_ELSA,
  167           PCMCIA_PRODUCT_ELSA_XI325_IEEE,
  168           PCMCIA_CIS_ELSA_XI325_IEEE
  169         },
  170         { PCMCIA_VENDOR_ELSA,
  171           PCMCIA_PRODUCT_ELSA_WNB11CFZ,
  172           PCMCIA_CIS_ELSA_WNB11CFZ
  173         },
  174         { PCMCIA_VENDOR_COMPAQ,
  175           PCMCIA_PRODUCT_COMPAQ_NC5004,
  176           PCMCIA_CIS_COMPAQ_NC5004
  177         },
  178         { PCMCIA_VENDOR_CONTEC,
  179           PCMCIA_PRODUCT_CONTEC_FX_DS110_PCC,
  180           PCMCIA_CIS_CONTEC_FX_DS110_PCC
  181         },
  182         { PCMCIA_VENDOR_TDK,
  183           PCMCIA_PRODUCT_TDK_LAK_CD011WL,
  184           PCMCIA_CIS_TDK_LAK_CD011WL
  185         },
  186         { PCMCIA_VENDOR_LUCENT,
  187           PCMCIA_PRODUCT_LUCENT_WAVELAN_IEEE,
  188           PCMCIA_CIS_NEC_CMZ_RT_WP
  189         },
  190         { PCMCIA_VENDOR_LUCENT,
  191           PCMCIA_PRODUCT_LUCENT_WAVELAN_IEEE,
  192           PCMCIA_CIS_NTT_ME_WLAN
  193         },
  194         { PCMCIA_VENDOR_ADDTRON,
  195           PCMCIA_PRODUCT_ADDTRON_AWP100,
  196           PCMCIA_CIS_ADDTRON_AWP100
  197         },
  198         { PCMCIA_VENDOR_LUCENT,
  199           PCMCIA_PRODUCT_LUCENT_WAVELAN_IEEE,
  200           PCMCIA_CIS_CABLETRON_ROAMABOUT
  201         },
  202         { PCMCIA_VENDOR_IODATA2,
  203           PCMCIA_PRODUCT_IODATA2_WCF12,
  204           PCMCIA_CIS_IODATA2_WCF12
  205         },
  206         { PCMCIA_VENDOR_IODATA2,
  207           PCMCIA_PRODUCT_IODATA2_WNB11PCM,
  208           PCMCIA_CIS_IODATA2_WNB11PCM
  209         },
  210         { PCMCIA_VENDOR_GEMTEK,
  211           PCMCIA_PRODUCT_GEMTEK_WLAN,
  212           PCMCIA_CIS_GEMTEK_WLAN
  213         },
  214         { PCMCIA_VENDOR_ELSA,
  215           PCMCIA_PRODUCT_ELSA_XI800_IEEE,
  216           PCMCIA_CIS_ELSA_XI800_IEEE
  217         },
  218         { PCMCIA_VENDOR_BUFFALO,
  219           PCMCIA_PRODUCT_BUFFALO_WLI_PCM_S11,
  220           PCMCIA_CIS_BUFFALO_WLI_PCM_S11
  221         },
  222         { PCMCIA_VENDOR_BUFFALO,
  223           PCMCIA_PRODUCT_BUFFALO_WLI_CF_S11G,
  224           PCMCIA_CIS_BUFFALO_WLI_CF_S11G
  225         },
  226         { PCMCIA_VENDOR_EMTAC,
  227           PCMCIA_PRODUCT_EMTAC_WLAN,
  228           PCMCIA_CIS_EMTAC_WLAN
  229         },
  230         { PCMCIA_VENDOR_SIMPLETECH,
  231           PCMCIA_PRODUCT_SIMPLETECH_SPECTRUM24_ALT,
  232           PCMCIA_CIS_SIMPLETECH_SPECTRUM24_ALT
  233         },
  234         { PCMCIA_VENDOR_ERICSSON,
  235           PCMCIA_PRODUCT_ERICSSON_WIRELESSLAN,
  236           PCMCIA_CIS_ERICSSON_WIRELESSLAN
  237         },
  238         { PCMCIA_VENDOR_PROXIM,
  239           PCMCIA_PRODUCT_PROXIM_RANGELANDS_8430,
  240           PCMCIA_CIS_PROXIM_RANGELANDS_8430
  241         },
  242         { PCMCIA_VENDOR_ACTIONTEC,
  243           PCMCIA_PRODUCT_ACTIONTEC_HWC01170,
  244           PCMCIA_CIS_ACTIONTEC_HWC01170
  245         },
  246         { PCMCIA_VENDOR_NOKIA,
  247           PCMCIA_PRODUCT_NOKIA_C020_WLAN,
  248           PCMCIA_CIS_NOKIA_C020_WLAN
  249         },
  250         { PCMCIA_VENDOR_NOKIA,
  251           PCMCIA_PRODUCT_NOKIA_C110_WLAN,
  252           PCMCIA_CIS_NOKIA_C110_WLAN
  253         },
  254         { PCMCIA_VENDOR_NETGEAR2,
  255           PCMCIA_PRODUCT_NETGEAR2_MA401RA,
  256           PCMCIA_CIS_NETGEAR2_MA401RA
  257         },
  258         { PCMCIA_VENDOR_NETGEAR2,
  259           PCMCIA_PRODUCT_NETGEAR2_DWL650,
  260           PCMCIA_CIS_NETGEAR2_DWL650
  261         },
  262         { PCMCIA_VENDOR_AIRVAST,
  263           PCMCIA_PRODUCT_AIRVAST_WN_100,
  264           PCMCIA_CIS_AIRVAST_WN_100
  265         },
  266         { PCMCIA_VENDOR_SIEMENS,
  267           PCMCIA_PRODUCT_SIEMENS_SS1021,
  268           PCMCIA_CIS_SIEMENS_SS1021
  269         },
  270         { PCMCIA_VENDOR_PROXIM,
  271           PCMCIA_PRODUCT_PROXIM_HARMONY_80211B,
  272           PCMCIA_CIS_PROXIM_HARMONY_80211B
  273         },
  274         { PCMCIA_VENDOR_MICROSOFT,
  275           PCMCIA_PRODUCT_MICROSOFT_MN520,
  276           PCMCIA_CIS_MICROSOFT_MN520
  277         },
  278         { PCMCIA_VENDOR_ADAPTEC2,
  279           PCMCIA_PRODUCT_ADAPTEC2_AWN8030,
  280           PCMCIA_CIS_ADAPTEC2_AWN8030
  281         },
  282         { PCMCIA_VENDOR_ASUS,
  283           PCMCIA_PRODUCT_ASUS_WL_100,
  284           PCMCIA_CIS_ASUS_WL_100
  285         },
  286         { PCMCIA_VENDOR_SENAO,
  287           PCMCIA_PRODUCT_SENAO_EL2511CD2EM,
  288           PCMCIA_CIS_SENAO_EL2511CD2EM
  289         },
  290         { PCMCIA_VENDOR_ARTEM,
  291           PCMCIA_PRODUCT_ARTEM_ONAIR,
  292           PCMCIA_CIS_ARTEM_ONAIR
  293         },
  294         { PCMCIA_VENDOR_PLANEX,
  295           PCMCIA_PRODUCT_PLANEX_GWNS11H,
  296           PCMCIA_CIS_PLANEX_GWNS11H
  297         },
  298         { PCMCIA_VENDOR_SYMBOL,
  299           PCMCIA_PRODUCT_SYMBOL_LA4100,
  300           PCMCIA_CIS_SYMBOL_LA4100
  301         },
  302         { PCMCIA_VENDOR_BAY,
  303           PCMCIA_PRODUCT_BAY_EMOBILITY_11B,
  304           PCMCIA_CIS_BAY_EMOBILITY_11B
  305         },
  306         { PCMCIA_VENDOR_GREYCELL,
  307           PCMCIA_PRODUCT_GREYCELL_DWL650H,
  308           PCMCIA_CIS_GREYCELL_DWL650H
  309         },
  310         { PCMCIA_VENDOR_FUJITSU,
  311           PCMCIA_PRODUCT_FUJITSU_WL110,
  312           PCMCIA_CIS_FUJITSU_WL110
  313         },
  314         { PCMCIA_VENDOR_ALLIEDTELESIS,
  315           PCMCIA_PRODUCT_ALLIEDTELESIS_WR211PCM,
  316           PCMCIA_CIS_ALLIEDTELESIS_WR211PCM
  317         },
  318         { PCMCIA_VENDOR_HWN,
  319           PCMCIA_PRODUCT_HWN_AIRWAY80211,
  320           PCMCIA_CIS_HWN_AIRWAY80211
  321         },
  322         { PCMCIA_VENDOR_SOCKET,
  323           PCMCIA_PRODUCT_SOCKET_LP_WLAN_CF,
  324           PCMCIA_CIS_SOCKET_LP_WLAN_CF
  325         }
  326 };
  327 
  328 static const struct wi_pcmcia_product *wi_lookup(struct pcmcia_attach_args *pa);
  329 
  330 const struct wi_pcmcia_product *
  331 wi_lookup(struct pcmcia_attach_args *pa)
  332 {
  333         const struct wi_pcmcia_product *pp;
  334         const struct wi_pcmcia_product *epp = wi_pcmcia_products +
  335             sizeof(wi_pcmcia_products) / sizeof(wi_pcmcia_products[0]);
  336 
  337         /*
  338          * Several PRISM II-based cards use the Lucent WaveLAN vendor
  339          * and product IDs so we match by CIS information first.
  340          */
  341         for (pp = wi_pcmcia_products; pp < epp; pp++) {
  342                 if (pa->card->cis1_info[0] != NULL &&
  343                     pp->pp_cisinfo[0] != NULL &&
  344                     strcmp(pa->card->cis1_info[0], pp->pp_cisinfo[0]) == 0 &&
  345                     pa->card->cis1_info[1] != NULL &&
  346                     pp->pp_cisinfo[1] != NULL &&
  347                     strcmp(pa->card->cis1_info[1], pp->pp_cisinfo[1]) == 0)
  348                         return (pp);
  349         }
  350 
  351         /* Match by vendor/product ID. */
  352         for (pp = wi_pcmcia_products; pp < epp; pp++) {
  353                 if (pa->manufacturer != PCMCIA_VENDOR_INVALID &&
  354                     pa->manufacturer == pp->pp_vendor &&
  355                     pa->product != PCMCIA_PRODUCT_INVALID &&
  356                     pa->product == pp->pp_product)
  357                         return (pp);
  358         }
  359 
  360         return (NULL);
  361 }
  362 
  363 int
  364 wi_pcmcia_match(struct device *parent, void *match, void *aux)
  365 {
  366         struct pcmcia_attach_args *pa = aux;
  367 
  368         if (wi_lookup(pa) != NULL)
  369                 return (1);
  370         return (0);
  371 }
  372 
  373 void
  374 wi_pcmcia_attach(struct device *parent, struct device *self, void *aux)
  375 {
  376         struct wi_pcmcia_softc  *psc = (struct wi_pcmcia_softc *)self;
  377         struct wi_softc         *sc = &psc->sc_wi;
  378         struct pcmcia_attach_args *pa = aux;
  379         struct pcmcia_function  *pf = pa->pf;
  380         struct pcmcia_config_entry *cfe = SIMPLEQ_FIRST(&pf->cfe_head);
  381         const char              *intrstr;
  382         int                     state = 0;
  383 
  384         psc->sc_pf = pf;
  385 
  386         /* Enable the card. */
  387         pcmcia_function_init(pf, cfe);
  388         if (pcmcia_function_enable(pf)) {
  389                 printf(": function enable failed\n");
  390                 goto bad;
  391         }
  392         state++;
  393 
  394         if (pcmcia_io_alloc(pf, 0, WI_IOSIZ, WI_IOSIZ, &psc->sc_pcioh)) {
  395                 printf(": can't alloc i/o space\n");
  396                 goto bad;
  397         }
  398         state++;
  399 
  400         if (pcmcia_io_map(pf, PCMCIA_WIDTH_IO16, 0, WI_IOSIZ,
  401             &psc->sc_pcioh, &psc->sc_io_window)) {
  402                 printf(": can't map io space\n");
  403                 goto bad;
  404         }
  405         state++;
  406 
  407         printf(" port 0x%lx/%lu", psc->sc_pcioh.addr,
  408             (u_long)psc->sc_pcioh.size);
  409 
  410         sc->wi_ltag = sc->wi_btag = psc->sc_pcioh.iot;
  411         sc->wi_lhandle = sc->wi_bhandle = psc->sc_pcioh.ioh;
  412         sc->wi_cor_offset = WI_COR_OFFSET;
  413         sc->wi_flags |= WI_FLAGS_BUS_PCMCIA;
  414 
  415         /* Make sure interrupts are disabled. */
  416         CSR_WRITE_2(sc, WI_INT_EN, 0);
  417         CSR_WRITE_2(sc, WI_EVENT_ACK, 0xffff);
  418 
  419         /* Establish the interrupt. */
  420         sc->sc_ih = pcmcia_intr_establish(pa->pf, IPL_NET, wi_intr, psc,
  421             sc->sc_dev.dv_xname);
  422         if (sc->sc_ih == NULL) {
  423                 printf("%s: couldn't establish interrupt\n",
  424                     sc->sc_dev.dv_xname);
  425                 goto bad;
  426         }
  427 
  428         intrstr = pcmcia_intr_string(psc->sc_pf, sc->sc_ih);
  429         printf("%s%s\n", *intrstr ? ", " : "", intrstr);
  430         if (wi_attach(sc, &wi_func_io) == 0)
  431                 return;
  432 
  433         /* wi_attach() failed, do some cleanup */
  434         pcmcia_intr_disestablish(psc->sc_pf, sc->sc_ih);
  435         sc->sc_ih = NULL;
  436 
  437 bad:
  438         if (state > 2)
  439                 pcmcia_io_unmap(pf, psc->sc_io_window);
  440         if (state > 1)
  441                 pcmcia_io_free(pf, &psc->sc_pcioh);
  442         if (state > 0)
  443                 pcmcia_function_disable(pf);
  444 }
  445 
  446 int
  447 wi_pcmcia_detach(struct device *dev, int flags)
  448 {
  449         struct wi_pcmcia_softc *psc = (struct wi_pcmcia_softc *)dev;
  450         struct wi_softc *sc = &psc->sc_wi;
  451         struct ifnet *ifp = &sc->sc_ic.ic_if;
  452 
  453         if (!(sc->wi_flags & WI_FLAGS_ATTACHED))
  454                 return (0);
  455 
  456         wi_detach(sc);
  457 
  458         sc->wi_flags = 0;
  459 
  460         pcmcia_io_unmap(psc->sc_pf, psc->sc_io_window);
  461         pcmcia_io_free(psc->sc_pf, &psc->sc_pcioh);
  462 
  463         ether_ifdetach(ifp);
  464         if_detach(ifp);
  465 
  466         return (0);
  467 }
  468 
  469 int
  470 wi_pcmcia_activate(struct device *dev, enum devact act)
  471 {
  472         struct wi_pcmcia_softc *psc = (struct wi_pcmcia_softc *)dev;
  473         struct wi_softc *sc = &psc->sc_wi;
  474         struct ifnet *ifp = &sc->sc_ic.ic_if;
  475         int s;
  476 
  477         s = splnet();
  478         switch (act) {
  479         case DVACT_ACTIVATE:
  480                 pcmcia_function_enable(psc->sc_pf);
  481                 sc->sc_ih = pcmcia_intr_establish(psc->sc_pf, IPL_NET,
  482                     wi_intr, sc, sc->sc_dev.dv_xname);
  483                 wi_cor_reset(sc);
  484                 wi_init(sc);
  485                 break;
  486 
  487         case DVACT_DEACTIVATE:
  488                 ifp->if_timer = 0;
  489                 if (ifp->if_flags & IFF_RUNNING)
  490                         wi_stop(sc);
  491                 sc->wi_flags &= ~WI_FLAGS_INITIALIZED;
  492                 if (sc->sc_ih != NULL)
  493                         pcmcia_intr_disestablish(psc->sc_pf, sc->sc_ih);
  494                 pcmcia_function_disable(psc->sc_pf);
  495                 break;
  496         }
  497         splx(s);
  498         return (0);
  499 }

/* [<][>][^][v][top][bottom][index][help] */