Annotation of sys/dev/pcmcia/if_wi_pcmcia.c, Revision 1.1
1.1 ! nbrk 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: }
CVSweb