Annotation of src/sys/dev/pcmcia/if_ne_pcmcia.c, Revision 1.156
1.156 ! uwe 1: /* $NetBSD: if_ne_pcmcia.c,v 1.155 2008/05/16 20:27:20 jnemeth Exp $ */
1.2 thorpej 2:
3: /*
4: * Copyright (c) 1997 Marc Horowitz. All rights reserved.
5: *
6: * Redistribution and use in source and binary forms, with or without
7: * modification, are permitted provided that the following conditions
8: * are met:
9: * 1. Redistributions of source code must retain the above copyright
10: * notice, this list of conditions and the following disclaimer.
11: * 2. Redistributions in binary form must reproduce the above copyright
12: * notice, this list of conditions and the following disclaimer in the
13: * documentation and/or other materials provided with the distribution.
14: * 3. All advertising materials mentioning features or use of this software
15: * must display the following acknowledgement:
16: * This product includes software developed by Marc Horowitz.
17: * 4. The name of the author may not be used to endorse or promote products
18: * derived from this software without specific prior written permission.
19: *
20: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30: */
1.83 lukem 31:
32: #include <sys/cdefs.h>
1.156 ! uwe 33: __KERNEL_RCSID(0, "$NetBSD: if_ne_pcmcia.c,v 1.155 2008/05/16 20:27:20 jnemeth Exp $");
1.2 thorpej 34:
35: #include <sys/param.h>
36: #include <sys/systm.h>
37: #include <sys/select.h>
38: #include <sys/device.h>
39: #include <sys/socket.h>
40:
41: #include <net/if_types.h>
42: #include <net/if.h>
1.5 thorpej 43: #include <net/if_media.h>
1.2 thorpej 44: #include <net/if_ether.h>
45:
1.150 ad 46: #include <sys/bus.h>
47: #include <sys/intr.h>
1.2 thorpej 48:
49: #include <dev/pcmcia/pcmciareg.h>
50: #include <dev/pcmcia/pcmciavar.h>
1.15 christos 51: #include <dev/pcmcia/pcmciadevs.h>
1.2 thorpej 52:
53: #include <dev/ic/dp8390reg.h>
54: #include <dev/ic/dp8390var.h>
55:
56: #include <dev/ic/ne2000reg.h>
57: #include <dev/ic/ne2000var.h>
58:
1.22 thorpej 59: #include <dev/ic/rtl80x9reg.h>
60: #include <dev/ic/rtl80x9var.h>
61:
1.75 thorpej 62: #include <dev/ic/dl10019var.h>
63:
1.80 enami 64: #include <dev/ic/ax88190reg.h>
65: #include <dev/ic/ax88190var.h>
66:
1.152 cube 67: int ne_pcmcia_match(device_t, cfdata_t , void *);
1.138 perry 68: int ne_pcmcia_validate_config(struct pcmcia_config_entry *);
1.152 cube 69: void ne_pcmcia_attach(device_t, device_t, void *);
70: int ne_pcmcia_detach(device_t, int);
1.2 thorpej 71:
1.138 perry 72: int ne_pcmcia_enable(struct dp8390_softc *);
73: void ne_pcmcia_disable(struct dp8390_softc *);
1.2 thorpej 74:
75: struct ne_pcmcia_softc {
76: struct ne2000_softc sc_ne2000; /* real "ne2000" softc */
77:
1.129 mycroft 78: void *sc_ih; /* interrupt handle */
79:
1.2 thorpej 80: struct pcmcia_function *sc_pf; /* our PCMCIA function */
1.129 mycroft 81: int sc_state;
82: #define NE_PCMCIA_ATTACHED 3
1.143 peter 83: void *sc_powerhook; /* power management hook */
1.2 thorpej 84: };
85:
1.138 perry 86: u_int8_t *ne_pcmcia_get_enaddr(struct ne_pcmcia_softc *, int,
87: u_int8_t [ETHER_ADDR_LEN]);
88: u_int8_t *ne_pcmcia_dl10019_get_enaddr(struct ne_pcmcia_softc *,
89: u_int8_t [ETHER_ADDR_LEN]);
1.52 itojun 90:
1.152 cube 91: CFATTACH_DECL_NEW(ne_pcmcia, sizeof(struct ne_pcmcia_softc),
1.99 thorpej 92: ne_pcmcia_match, ne_pcmcia_attach, ne_pcmcia_detach, dp8390_activate);
1.2 thorpej 93:
1.67 jdolecek 94: static const struct ne2000dev {
1.4 enami 95: int32_t manufacturer;
96: int32_t product;
1.140 christos 97: const char *cis_info[4];
1.2 thorpej 98: int function;
99: int enet_maddr;
100: unsigned char enet_vendor[3];
1.39 enami 101: int flags;
102: #define NE2000DVF_DL10019 0x0001 /* chip is D-Link DL10019 */
1.55 enami 103: #define NE2000DVF_AX88190 0x0002 /* chip is ASIX AX88190 */
1.2 thorpej 104: } ne2000devs[] = {
1.117 mycroft 105: { PCMCIA_VENDOR_EDIMAX, PCMCIA_PRODUCT_EDIMAX_EP4000A,
1.123 mycroft 106: PCMCIA_CIS_INVALID,
1.144 christos 107: 0, -1, { 0x00, 0xa0, 0x0c }, 0 },
1.85 aymeric 108:
1.146 jmcneill 109: { PCMCIA_VENDOR_EDIMAX, PCMCIA_PRODUCT_EDIMAX_EP4101,
110: PCMCIA_CIS_INVALID,
111: 0, -1, { 0x00, 0x90, 0xcc }, NE2000DVF_AX88190 },
112:
1.117 mycroft 113: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.69 aymeric 114: PCMCIA_CIS_SYNERGY21_S21810,
1.144 christos 115: 0, -1, { 0x00, 0x48, 0x54 }, 0 },
1.69 aymeric 116:
1.117 mycroft 117: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.37 is 118: PCMCIA_CIS_AMBICOM_AMB8002T,
1.144 christos 119: 0, -1, { 0x00, 0x10, 0x7a }, 0 },
1.37 is 120:
1.117 mycroft 121: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.119 mycroft 122: PCMCIA_CIS_AMBICOM_AMB8110,
123: 0, -1, { 0x00, 0x10, 0x7a }, NE2000DVF_AX88190 },
124:
125: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.15 christos 126: PCMCIA_CIS_PREMAX_PE200,
1.144 christos 127: 0, 0x07f0, { 0x00, 0x20, 0xe0 }, 0 },
1.15 christos 128:
1.117 mycroft 129: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.118 mycroft 130: PCMCIA_CIS_PREMAX_PE200,
1.144 christos 131: 0, -1, { 0x00, 0x20, 0xe0 }, 0 },
1.118 mycroft 132:
133: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.19 veego 134: PCMCIA_CIS_PLANET_SMARTCOM2000,
1.144 christos 135: 0, 0xff0, { 0x00, 0x00, 0xe8 }, 0 },
1.19 veego 136:
1.117 mycroft 137: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.19 veego 138: PCMCIA_CIS_DLINK_DE660,
1.144 christos 139: 0, -1, { 0x00, 0x80, 0xc8 }, 0 },
1.79 christos 140:
1.117 mycroft 141: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.79 christos 142: PCMCIA_CIS_DLINK_DE660PLUS,
1.144 christos 143: 0, -1, { 0x00, 0x80, 0xc8 }, 0 },
1.59 tron 144:
1.117 mycroft 145: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.59 tron 146: PCMCIA_CIS_RPTI_EP400,
1.144 christos 147: 0, 0x110, { 0x00, 0x40, 0x95 }, 0 },
1.19 veego 148:
1.117 mycroft 149: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.19 veego 150: PCMCIA_CIS_RPTI_EP401,
1.144 christos 151: 0, -1, { 0x00, 0x40, 0x95 }, 0 },
1.19 veego 152:
1.117 mycroft 153: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.19 veego 154: PCMCIA_CIS_ACCTON_EN2212,
1.144 christos 155: 0, 0x0ff0, { 0x00, 0x00, 0xe8 }, 0 },
1.117 mycroft 156:
157: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.96 bouyer 158: PCMCIA_CIS_ACCTON_EN2216,
1.144 christos 159: 0, -1, { 0x00, 0x00, 0xe8 }, 0 },
1.29 thorpej 160:
1.117 mycroft 161: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.29 thorpej 162: PCMCIA_CIS_SVEC_COMBOCARD,
1.144 christos 163: 0, -1, { 0x00, 0xe0, 0x98 }, 0 },
1.34 augustss 164:
1.117 mycroft 165: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.31 marc 166: PCMCIA_CIS_SVEC_LANCARD,
1.144 christos 167: 0, 0x7f0, { 0x00, 0xc0, 0x6c }, 0 },
1.19 veego 168:
1.117 mycroft 169: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_EPSON_EEN10B,
1.45 danw 170: PCMCIA_CIS_EPSON_EEN10B,
1.144 christos 171: 0, 0xff0, { 0x00, 0x00, 0x48 }, 0 },
1.77 christos 172:
1.117 mycroft 173: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.108 uwe 174: PCMCIA_CIS_TAMARACK_ETHERNET,
1.144 christos 175: 0, -1, { 0x00, 0x00, 0x00 }, 0 },
1.108 uwe 176:
1.117 mycroft 177: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.77 christos 178: PCMCIA_CIS_CNET_NE2000,
1.144 christos 179: 0, -1, { 0x00, 0x80, 0xad }, 0 },
1.81 christos 180:
1.119 mycroft 181: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
182: PCMCIA_CIS_GENIUS_ME3000II,
1.144 christos 183: 0, -1, { 0x00, 0x40, 0x95 }, 0 },
1.119 mycroft 184:
185:
1.19 veego 186: /*
187: * You have to add new entries which contains
1.139 perry 188: * PCMCIA_VENDOR_INVALID and/or PCMCIA_PRODUCT_INVALID
1.19 veego 189: * in front of this comment.
190: *
191: * There are cards which use a generic vendor and product id but needs
192: * a different handling depending on the cis_info, so ne2000_match
193: * needs a table where the exceptions comes first and then the normal
194: * product and vendor entries.
195: */
196:
1.117 mycroft 197: { PCMCIA_VENDOR_IBM, PCMCIA_PRODUCT_IBM_INFOMOVER,
1.123 mycroft 198: PCMCIA_CIS_INVALID,
1.144 christos 199: 0, 0x0ff0, { 0xff, 0xff, 0xff }, 0 },
1.15 christos 200:
1.117 mycroft 201: { PCMCIA_VENDOR_LINKSYS, PCMCIA_PRODUCT_LINKSYS_ECARD_1,
1.123 mycroft 202: PCMCIA_CIS_INVALID,
1.144 christos 203: 0, -1, { 0x00, 0x80, 0xc8 }, 0 },
1.24 itohy 204:
1.117 mycroft 205: { PCMCIA_VENDOR_LINKSYS, PCMCIA_PRODUCT_LINKSYS_COMBO_ECARD,
1.123 mycroft 206: PCMCIA_CIS_INVALID,
207: 0, -1, { 0xff, 0xff, 0xff }, NE2000DVF_DL10019 },
1.46 mycroft 208:
1.117 mycroft 209: { PCMCIA_VENDOR_LINKSYS, PCMCIA_PRODUCT_LINKSYS_COMBO_ECARD,
1.123 mycroft 210: PCMCIA_CIS_INVALID,
211: 0, -1, { 0xff, 0xff, 0xff }, NE2000DVF_AX88190 },
1.56 enami 212:
1.123 mycroft 213: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.86 is 214: PCMCIA_CIS_LANTECH_FASTNETTX,
215: 0, -1, { 0x00, 0x04, 0x1c }, NE2000DVF_AX88190 },
216:
1.117 mycroft 217: { PCMCIA_VENDOR_LINKSYS, PCMCIA_PRODUCT_LINKSYS_ETHERFAST,
1.123 mycroft 218: PCMCIA_CIS_INVALID,
1.117 mycroft 219: 0, -1, { 0xff, 0xff, 0xff }, NE2000DVF_DL10019 },
1.46 mycroft 220:
1.117 mycroft 221: { PCMCIA_VENDOR_NETGEAR, PCMCIA_PRODUCT_NETGEAR_FA410TXC,
1.123 mycroft 222: PCMCIA_CIS_INVALID,
223: 0, -1, { 0xff, 0xff, 0xff }, NE2000DVF_DL10019 },
224:
225: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.110 cube 226: PCMCIA_CIS_DLINK_DFE670TXD,
1.117 mycroft 227: 0, -1, { 0xff, 0xff, 0xff }, NE2000DVF_DL10019 },
1.110 cube 228:
1.123 mycroft 229: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.65 msaitoh 230: PCMCIA_CIS_MELCO_LPC2_TX,
231: 0, -1, { 0x00, 0x40, 0x26 }, NE2000DVF_DL10019 },
232:
1.117 mycroft 233: { PCMCIA_VENDOR_LINKSYS, PCMCIA_PRODUCT_LINKSYS_COMBO_ECARD,
1.123 mycroft 234: PCMCIA_CIS_INVALID,
1.144 christos 235: 0, -1, { 0x00, 0x80, 0xc8 }, 0 },
1.17 thorpej 236:
1.117 mycroft 237: { PCMCIA_VENDOR_LINKSYS, PCMCIA_PRODUCT_LINKSYS_TRUST_COMBO_ECARD,
1.123 mycroft 238: PCMCIA_CIS_INVALID,
1.144 christos 239: 0, 0x0120, { 0x20, 0x04, 0x49 }, 0 },
1.20 jtk 240:
241: /* Although the comments above say to put VENDOR/PRODUCT INVALID IDs
242: above this list, we need to keep this one below the ECARD_1, or else
243: both will match the same more-generic entry rather than the more
244: specific one above with proper vendor and product IDs. */
1.117 mycroft 245: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.20 jtk 246: PCMCIA_CIS_LINKSYS_ECARD_2,
1.144 christos 247: 0, -1, { 0x00, 0x80, 0xc8 }, 0 },
1.24 itohy 248:
249: /*
250: * D-Link DE-650 has many minor versions:
251: *
252: * CIS information Manufacturer Product Note
253: * 1 "D-Link, DE-650" INVALID INVALID white card
254: * 2 "D-Link, DE-650, Ver 01.00" INVALID INVALID became bare metal
255: * 3 "D-Link, DE-650, Ver 01.00" 0x149 0x265 minor change in look
256: * 4 "D-Link, DE-650, Ver 01.00" 0x149 0x265 collision LED added
257: *
258: * While the 1st and the 2nd types should use the "D-Link DE-650" entry,
259: * the 3rd and the 4th types should use the "Linksys EtherCard" entry.
260: * Therefore, this enty must be below the LINKSYS_ECARD_1. --itohy
261: */
1.117 mycroft 262: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.24 itohy 263: PCMCIA_CIS_DLINK_DE650,
1.144 christos 264: 0, 0x0040, { 0x00, 0x80, 0xc8 }, 0 },
1.15 christos 265:
1.44 enami 266: /*
267: * IO-DATA PCLA/TE and later version of PCLA/T has valid
268: * vendor/product ID and it is possible to read MAC address
269: * using standard I/O ports. It also read from CIS offset 0x01c0.
270: * On the other hand, earlier version of PCLA/T doesn't have valid
271: * vendor/product ID and MAC address must be read from CIS offset
272: * 0x0ff0 (i.e., usual ne2000 way to read it doesn't work).
273: * And CIS information of earlier and later version of PCLA/T are
274: * same except fourth element. So, for now, we place the entry for
275: * PCLA/TE (and later version of PCLA/T) followed by entry
276: * for the earlier version of PCLA/T (or, modify to match all CIS
277: * information and have three or more individual entries).
278: */
1.117 mycroft 279: { PCMCIA_VENDOR_IODATA, PCMCIA_PRODUCT_IODATA_PCLATE,
1.123 mycroft 280: PCMCIA_CIS_INVALID,
1.144 christos 281: 0, -1, { 0xff, 0xff, 0xff }, 0 },
1.44 enami 282:
1.145 jmcneill 283: { PCMCIA_VENDOR_IODATA3, PCMCIA_PRODUCT_IODATA3_PCETTXR,
284: PCMCIA_CIS_IODATA3_PCETTXR,
285: 0, -1, { 0x00, 0xa0, 0xb0 }, NE2000DVF_DL10019 },
286:
1.44 enami 287: /*
288: * This entry should be placed after above PCLA-TE entry.
289: * See above comments for detail.
290: */
1.117 mycroft 291: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.15 christos 292: PCMCIA_CIS_IODATA_PCLAT,
1.144 christos 293: 0, 0x0ff0, { 0x00, 0xa0, 0xb0 }, 0 },
1.15 christos 294:
1.117 mycroft 295: { PCMCIA_VENDOR_DAYNA, PCMCIA_PRODUCT_DAYNA_COMMUNICARD_E_1,
1.123 mycroft 296: PCMCIA_CIS_INVALID,
1.144 christos 297: 0, 0x0110, { 0x00, 0x80, 0x19 }, 0 },
1.18 dbj 298:
1.117 mycroft 299: { PCMCIA_VENDOR_DAYNA, PCMCIA_PRODUCT_DAYNA_COMMUNICARD_E_2,
1.123 mycroft 300: PCMCIA_CIS_INVALID,
1.144 christos 301: 0, -1, { 0x00, 0x80, 0x19 }, 0 },
1.28 thorpej 302:
1.123 mycroft 303: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.38 enami 304: PCMCIA_CIS_COREGA_ETHER_PCC_T,
1.144 christos 305: 0, -1, { 0x00, 0x00, 0xf4 }, 0 },
1.82 mjl 306:
1.123 mycroft 307: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.82 mjl 308: PCMCIA_CIS_COREGA_ETHER_PCC_TD,
1.144 christos 309: 0, -1, { 0x00, 0x00, 0xf4 }, 0 },
1.107 hamajima 310:
1.123 mycroft 311: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.107 hamajima 312: PCMCIA_CIS_COREGA_ETHER_PCC_TL,
1.144 christos 313: 0, -1, { 0x00, 0x00, 0xf4 }, 0 },
1.38 enami 314:
1.123 mycroft 315: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.38 enami 316: PCMCIA_CIS_COREGA_ETHER_II_PCC_T,
1.144 christos 317: 0, -1, { 0x00, 0x00, 0xf4 }, 0 },
1.91 itojun 318:
1.123 mycroft 319: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.91 itojun 320: PCMCIA_CIS_COREGA_ETHER_II_PCC_TD,
1.144 christos 321: 0, -1, { 0x00, 0x00, 0xf4 }, 0 },
1.42 jun 322:
1.123 mycroft 323: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.42 jun 324: PCMCIA_CIS_COREGA_FAST_ETHER_PCC_TX,
325: 0, -1, { 0x00, 0x00, 0xf4 }, NE2000DVF_DL10019 },
1.73 ichiro 326:
1.123 mycroft 327: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.73 ichiro 328: PCMCIA_CIS_COREGA_FETHER_PCC_TXF,
329: 0, -1, { 0x00, 0x90, 0x99 }, NE2000DVF_DL10019 },
1.71 ichiro 330:
1.123 mycroft 331: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.71 ichiro 332: PCMCIA_CIS_COREGA_FETHER_PCC_TXD,
1.144 christos 333: 0, -1, { 0x00, 0x90, 0x99 }, 0 },
1.40 jun 334:
1.123 mycroft 335: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.114 itohy 336: PCMCIA_CIS_COREGA_FETHER_II_PCC_TXD,
1.123 mycroft 337: 0, -1, { 0x00, 0x90, 0x99 }, NE2000DVF_AX88190 },
1.114 itohy 338:
1.155 jnemeth 339: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
340: PCMCIA_CIS_COREGA_LAPCCTXD,
341: 0, -1, { 0x00, 0x90, 0x99 }, 0 },
342:
1.117 mycroft 343: { PCMCIA_VENDOR_COMPEX, PCMCIA_PRODUCT_COMPEX_LINKPORT_ENET_B,
1.123 mycroft 344: PCMCIA_CIS_INVALID,
1.144 christos 345: 0, 0x01c0, { 0xff, 0xff, 0xff }, 0 },
1.35 christos 346:
1.117 mycroft 347: { PCMCIA_VENDOR_SMC, PCMCIA_PRODUCT_SMC_EZCARD,
1.123 mycroft 348: PCMCIA_CIS_INVALID,
1.144 christos 349: 0, 0x01c0, { 0x00, 0xe0, 0x29 }, 0 },
1.100 kanaoka 350:
1.123 mycroft 351: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.100 kanaoka 352: PCMCIA_CIS_SMC_8041,
1.144 christos 353: 0, -1, { 0x00, 0x04, 0xe2 }, 0 },
1.43 jun 354:
1.117 mycroft 355: { PCMCIA_VENDOR_SOCKET, PCMCIA_PRODUCT_SOCKET_EA_ETHER,
1.123 mycroft 356: PCMCIA_CIS_INVALID,
1.144 christos 357: 0, -1, { 0x00, 0xc0, 0x1b }, 0 },
1.72 jhawk 358:
1.117 mycroft 359: { PCMCIA_VENDOR_SOCKET, PCMCIA_PRODUCT_SOCKET_LP_ETHER_CF,
1.123 mycroft 360: PCMCIA_CIS_INVALID,
1.144 christos 361: 0, -1, { 0x00, 0xc0, 0x1b }, 0 },
1.102 martin 362:
1.117 mycroft 363: { PCMCIA_VENDOR_SOCKET, PCMCIA_PRODUCT_SOCKET_LP_ETH_10_100_CF,
1.123 mycroft 364: PCMCIA_CIS_INVALID,
1.102 martin 365: 0, -1, { 0x00, 0xe0, 0x98 }, NE2000DVF_DL10019 },
1.66 toddpw 366:
1.117 mycroft 367: { PCMCIA_VENDOR_SOCKET, PCMCIA_PRODUCT_SOCKET_LP_ETHER,
1.123 mycroft 368: PCMCIA_CIS_INVALID,
1.144 christos 369: 0, -1, { 0x00, 0xc0, 0x1b }, 0 },
1.28 thorpej 370:
1.117 mycroft 371: { PCMCIA_VENDOR_KINGSTON, PCMCIA_PRODUCT_KINGSTON_KNE2,
1.123 mycroft 372: PCMCIA_CIS_INVALID,
1.144 christos 373: 0, -1, { 0x00, 0xc0, 0xf0 }, 0 },
1.76 toddpw 374:
1.117 mycroft 375: { PCMCIA_VENDOR_XIRCOM, PCMCIA_PRODUCT_XIRCOM_CFE_10,
1.123 mycroft 376: PCMCIA_CIS_INVALID,
1.144 christos 377: 0, -1, { 0x00, 0x10, 0xa4 }, 0 },
1.54 enami 378:
1.117 mycroft 379: { PCMCIA_VENDOR_MELCO, PCMCIA_PRODUCT_MELCO_LPC3_TX,
1.123 mycroft 380: PCMCIA_CIS_INVALID,
1.117 mycroft 381: 0, -1, { 0xff, 0xff, 0xff }, NE2000DVF_AX88190 },
1.116 mycroft 382:
1.123 mycroft 383: { PCMCIA_VENDOR_BUFFALO, PCMCIA_PRODUCT_BUFFALO_LPC_CF_CLT,
384: PCMCIA_CIS_INVALID,
1.144 christos 385: 0, -1, { 0x00, 0x07, 0x40 }, 0 },
1.58 uch 386:
1.123 mycroft 387: { PCMCIA_VENDOR_BUFFALO, PCMCIA_PRODUCT_BUFFALO_LPC3_CLT,
388: PCMCIA_CIS_INVALID,
1.144 christos 389: 0, -1, { 0x00, 0x07, 0x40 }, 0 },
1.121 enami 390:
1.117 mycroft 391: { PCMCIA_VENDOR_BUFFALO, PCMCIA_PRODUCT_BUFFALO_LPC4_CLX,
1.123 mycroft 392: PCMCIA_CIS_INVALID,
393: 0, -1, { 0x00, 0x40, 0xfa }, NE2000DVF_AX88190 },
1.104 christos 394:
1.117 mycroft 395: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.58 uch 396: PCMCIA_CIS_BILLIONTON_LNT10TN,
1.144 christos 397: 0, -1, { 0x00, 0x00, 0x00 }, 0 },
1.101 christos 398:
1.117 mycroft 399: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.101 christos 400: PCMCIA_CIS_BILLIONTON_CFLT10N,
1.144 christos 401: 0, -1, { 0x00, 0x00, 0x00 }, 0 },
1.60 scw 402:
1.117 mycroft 403: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.60 scw 404: PCMCIA_CIS_NDC_ND5100_E,
1.144 christos 405: 0, -1, { 0x00, 0x80, 0xc6 }, 0 },
1.65 msaitoh 406:
1.117 mycroft 407: { PCMCIA_VENDOR_TELECOMDEVICE, PCMCIA_PRODUCT_TELECOMDEVICE_TCD_HPC100,
1.123 mycroft 408: PCMCIA_CIS_INVALID,
1.65 msaitoh 409: 0, -1, { 0x00, 0x40, 0x26 }, NE2000DVF_AX88190 },
410:
1.117 mycroft 411: { PCMCIA_VENDOR_MACNICA, PCMCIA_PRODUCT_MACNICA_ME1_JEIDA,
1.123 mycroft 412: PCMCIA_CIS_INVALID,
1.144 christos 413: 0, 0x00b8, { 0x08, 0x00, 0x42 }, 0 },
1.90 chris 414:
1.117 mycroft 415: { PCMCIA_VENDOR_NETGEAR, PCMCIA_PRODUCT_NETGEAR_FA411,
1.123 mycroft 416: PCMCIA_CIS_INVALID,
1.144 christos 417: 0, -1, { 0x00, 0x40, 0xf4 }, 0 },
1.94 christos 418:
1.123 mycroft 419: { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
1.94 christos 420: PCMCIA_CIS_DYNALINK_L10C,
1.144 christos 421: 0, -1, { 0x00, 0x00, 0x00 }, 0 },
1.55 enami 422:
1.123 mycroft 423: { PCMCIA_VENDOR_ALLIEDTELESIS, PCMCIA_PRODUCT_ALLIEDTELESIS_LA_PCM,
424: PCMCIA_CIS_INVALID,
1.144 christos 425: 0, 0x0ff0, { 0x00, 0x00, 0xf4 }, 0 },
1.123 mycroft 426:
427: { PCMCIA_VENDOR_NEXTCOM, PCMCIA_PRODUCT_NEXTCOM_NEXTHAWK,
428: PCMCIA_CIS_INVALID,
1.144 christos 429: 0, -1, { 0x00, 0x40, 0xb4 }, 0 },
1.123 mycroft 430:
1.142 christos 431: { PCMCIA_VENDOR_BELKIN, PCMCIA_PRODUCT_BELKIN_F5D5020,
432: PCMCIA_CIS_BELKIN_F5D5020,
433: 0, -1, { 0x00, 0x30, 0xbd } , NE2000DVF_AX88190 },
434:
1.2 thorpej 435: #if 0
436: /* the rest of these are stolen from the linux pcnet pcmcia device
437: driver. Since I don't know the manfid or cis info strings for
438: any of them, they're not compiled in until I do. */
439: { "APEX MultiCard",
440: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 441: 0x03f4, { 0x00, 0x20, 0xe5 }, 0 },
1.2 thorpej 442: { "ASANTE FriendlyNet",
443: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 444: 0x4910, { 0x00, 0x00, 0x94 }, 0 },
1.2 thorpej 445: { "Danpex EN-6200P2",
446: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 447: 0x0110, { 0x00, 0x40, 0xc7 }, 0 },
1.2 thorpej 448: { "DataTrek NetCard",
449: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 450: 0x0ff0, { 0x00, 0x20, 0xe8 }, 0 },
1.2 thorpej 451: { "EP-210 Ethernet",
452: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 453: 0x0110, { 0x00, 0x40, 0x33 }, 0 },
1.2 thorpej 454: { "ELECOM Laneed LD-CDWA",
455: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 456: 0x00b8, { 0x08, 0x00, 0x42 }, 0 },
1.2 thorpej 457: { "Grey Cell GCS2220",
458: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 459: 0x0000, { 0x00, 0x47, 0x43 }, 0 },
1.2 thorpej 460: { "Hypertec Ethernet",
461: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 462: 0x01c0, { 0x00, 0x40, 0x4c }, 0 },
1.2 thorpej 463: { "IBM CCAE",
464: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 465: 0x0ff0, { 0x08, 0x00, 0x5a }, 0 },
1.2 thorpej 466: { "IBM CCAE",
467: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 468: 0x0ff0, { 0x00, 0x04, 0xac }, 0 },
1.2 thorpej 469: { "IBM CCAE",
470: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 471: 0x0ff0, { 0x00, 0x06, 0x29 }, 0 },
1.2 thorpej 472: { "IBM FME",
473: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 474: 0x0374, { 0x00, 0x04, 0xac }, 0 },
1.2 thorpej 475: { "IBM FME",
476: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 477: 0x0374, { 0x08, 0x00, 0x5a }, 0 },
1.2 thorpej 478: { "Katron PE-520",
479: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 480: 0x0110, { 0x00, 0x40, 0xf6 }, 0 },
1.2 thorpej 481: { "Kingston KNE-PCM/x",
482: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 483: 0x0ff0, { 0x00, 0xc0, 0xf0 }, 0 },
1.2 thorpej 484: { "Kingston KNE-PCM/x",
485: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 486: 0x0ff0, { 0xe2, 0x0c, 0x0f }, 0 },
1.2 thorpej 487: { "Longshine LCS-8534",
488: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 489: 0x0000, { 0x08, 0x00, 0x00 }, 0 },
1.2 thorpej 490: { "Maxtech PCN2000",
491: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 492: 0x5000, { 0x00, 0x00, 0xe8 }, 0 },
1.2 thorpej 493: { "NDC Instant-Link",
494: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 495: 0x003a, { 0x00, 0x80, 0xc6 }, 0 },
1.2 thorpej 496: { "NE2000 Compatible",
497: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 498: 0x0ff0, { 0x00, 0xa0, 0x0c }, 0 },
1.2 thorpej 499: { "Network General Sniffer",
500: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 501: 0x0ff0, { 0x00, 0x00, 0x65 }, 0 },
1.2 thorpej 502: { "Panasonic VEL211",
503: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 504: 0x0ff0, { 0x00, 0x80, 0x45 }, 0 },
1.2 thorpej 505: { "SCM Ethernet",
506: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 507: 0x0ff0, { 0x00, 0x20, 0xcb }, 0 },
1.2 thorpej 508: { "Volktek NPL-402CT",
509: 0x0000, 0x0000, NULL, NULL, 0,
1.144 christos 510: 0x0060, { 0x00, 0x40, 0x05 }, 0 },
1.2 thorpej 511: #endif
512: };
513:
514: #define NE2000_NDEVS (sizeof(ne2000devs) / sizeof(ne2000devs[0]))
515:
1.136 christos 516: static const struct ne2000dev *
517: ne2000_match(struct pcmcia_card *card, int fct, int n)
518: {
519: size_t i;
520:
1.137 enami 521: /*
522: * See if it matches by manufacturer & product.
523: */
524: if (card->manufacturer == ne2000devs[n].manufacturer &&
525: card->manufacturer != PCMCIA_VENDOR_INVALID &&
526: card->product == ne2000devs[n].product &&
1.136 christos 527: card->product != PCMCIA_PRODUCT_INVALID)
1.137 enami 528: goto match;
1.136 christos 529:
1.137 enami 530: /*
531: * Otherwise, try to match by CIS strings.
532: */
1.136 christos 533: for (i = 0; i < 2; i++)
534: if (card->cis1_info[i] == NULL ||
535: ne2000devs[n].cis_info[i] == NULL ||
536: strcmp(card->cis1_info[i], ne2000devs[n].cis_info[i]) != 0)
1.137 enami 537: return (NULL);
1.136 christos 538:
1.137 enami 539: match:
540: /*
541: * Finally, see if function number matches.
542: */
543: return (fct == ne2000devs[n].function ? &ne2000devs[n] : NULL);
1.136 christos 544: }
545:
1.2 thorpej 546:
547: int
1.152 cube 548: ne_pcmcia_match(device_t parent, cfdata_t match, void *aux)
1.2 thorpej 549: {
550: struct pcmcia_attach_args *pa = aux;
551: int i;
552:
553: for (i = 0; i < NE2000_NDEVS; i++) {
554: if (ne2000_match(pa->card, pa->pf->number, i))
555: return (1);
556: }
557:
558: return (0);
559: }
560:
1.129 mycroft 561: int
1.152 cube 562: ne_pcmcia_validate_config(struct pcmcia_config_entry *cfe)
1.129 mycroft 563: {
564: if (cfe->iftype != PCMCIA_IFTYPE_IO ||
565: cfe->num_iospace < 1 || cfe->num_iospace > 2)
566: return (EINVAL);
567: /* Some cards have a memory space, but we don't use it. */
568: cfe->num_memspace = 0;
569: return (0);
570: }
571:
1.2 thorpej 572: void
1.152 cube 573: ne_pcmcia_attach(device_t parent, device_t self, void *aux)
1.2 thorpej 574: {
1.152 cube 575: struct ne_pcmcia_softc *psc = device_private(self);
1.2 thorpej 576: struct ne2000_softc *nsc = &psc->sc_ne2000;
577: struct dp8390_softc *dsc = &nsc->sc_dp8390;
578: struct pcmcia_attach_args *pa = aux;
579: struct pcmcia_config_entry *cfe;
1.106 mycroft 580: const struct ne2000dev *ne_dev;
1.53 enami 581: int i;
1.55 enami 582: u_int8_t myea[6], *enaddr;
1.22 thorpej 583: const char *typestr = "";
1.129 mycroft 584: int error;
1.22 thorpej 585:
1.153 uwe 586: aprint_naive("\n");
587:
1.152 cube 588: dsc->sc_dev = self;
1.2 thorpej 589: psc->sc_pf = pa->pf;
590:
1.129 mycroft 591: error = pcmcia_function_configure(pa->pf, ne_pcmcia_validate_config);
592: if (error) {
1.152 cube 593: aprint_error_dev(self, "configure failed, error=%d\n", error);
1.129 mycroft 594: return;
1.2 thorpej 595: }
596:
1.129 mycroft 597: cfe = pa->pf->cfe;
598: dsc->sc_regt = cfe->iospace[0].handle.iot;
599: dsc->sc_regh = cfe->iospace[0].handle.ioh;
1.2 thorpej 600:
1.127 mycroft 601: if (cfe->num_iospace == 1) {
1.129 mycroft 602: nsc->sc_asict = dsc->sc_regt;
1.127 mycroft 603: if (bus_space_subregion(dsc->sc_regt, dsc->sc_regh,
1.129 mycroft 604: NE2000_ASIC_OFFSET, NE2000_ASIC_NPORTS, &nsc->sc_asich)) {
1.152 cube 605: aprint_error_dev(self,
606: "can't get subregion for asic\n");
1.129 mycroft 607: goto fail;
1.127 mycroft 608: }
609: } else {
1.129 mycroft 610: nsc->sc_asict = cfe->iospace[1].handle.iot;
611: nsc->sc_asich = cfe->iospace[1].handle.ioh;
1.128 mycroft 612: }
613:
1.129 mycroft 614: error = ne_pcmcia_enable(dsc);
1.130 mycroft 615: if (error)
1.129 mycroft 616: goto fail;
1.127 mycroft 617:
1.128 mycroft 618: /* Set up power management hooks. */
619: dsc->sc_enable = ne_pcmcia_enable;
620: dsc->sc_disable = ne_pcmcia_disable;
621:
1.2 thorpej 622: /*
623: * Read the station address from the board.
624: */
1.46 mycroft 625: i = 0;
626: again:
1.55 enami 627: enaddr = NULL; /* Ask ASIC by default */
1.93 jonathan 628: typestr = ""; /* clear previous card-type */
1.46 mycroft 629: for (; i < NE2000_NDEVS; i++) {
1.53 enami 630: ne_dev = ne2000_match(pa->card, pa->pf->number, i);
631: if (ne_dev != NULL) {
1.2 thorpej 632: if (ne_dev->enet_maddr >= 0) {
1.139 perry 633: enaddr = ne_pcmcia_get_enaddr(psc,
1.53 enami 634: ne_dev->enet_maddr, myea);
635: if (enaddr == NULL)
636: continue;
1.2 thorpej 637: }
1.106 mycroft 638: goto found;
1.2 thorpej 639: }
1.39 enami 640: }
1.152 cube 641: aprint_error_dev(self, "can't match ethernet vendor code\n");
1.111 cube 642: if (enaddr != NULL)
1.152 cube 643: aprint_error_dev(self,
644: "ethernet vendor code %02x:%02x:%02x\n",
645: enaddr[0], enaddr[1], enaddr[2]);
1.129 mycroft 646: goto fail2;
1.39 enami 647:
1.106 mycroft 648: found:
1.39 enami 649: if ((ne_dev->flags & NE2000DVF_DL10019) != 0) {
1.74 thorpej 650: u_int8_t type;
651:
1.53 enami 652: enaddr = ne_pcmcia_dl10019_get_enaddr(psc, myea);
653: if (enaddr == NULL) {
1.47 mycroft 654: ++i;
655: goto again;
1.39 enami 656: }
1.74 thorpej 657:
1.75 thorpej 658: dsc->sc_mediachange = dl10019_mediachange;
659: dsc->sc_mediastatus = dl10019_mediastatus;
660: dsc->init_card = dl10019_init_card;
661: dsc->stop_card = dl10019_stop_card;
662: dsc->sc_media_init = dl10019_media_init;
663: dsc->sc_media_fini = dl10019_media_fini;
664:
1.74 thorpej 665: /* Determine if this is a DL10019 or a DL10022. */
666: type = bus_space_read_1(nsc->sc_asict, nsc->sc_asich, 0x0f);
667: if (type == 0x91 || type == 0x99) {
668: nsc->sc_type = NE2000_TYPE_DL10022;
669: typestr = " (DL10022)";
670: } else {
671: nsc->sc_type = NE2000_TYPE_DL10019;
672: typestr = " (DL10019)";
673: }
1.2 thorpej 674: }
675:
1.55 enami 676: if ((ne_dev->flags & NE2000DVF_AX88190) != 0) {
1.123 mycroft 677: u_int8_t test;
678:
1.135 mycroft 679: /* XXX This is highly bogus. */
680: if ((pa->pf->ccr_mask & (1 << PCMCIA_CCR_IOBASE0)) == 0) {
1.64 msaitoh 681: ++i;
682: goto again;
683: }
1.80 enami 684:
685: dsc->sc_mediachange = ax88190_mediachange;
686: dsc->sc_mediastatus = ax88190_mediastatus;
687: dsc->init_card = ax88190_init_card;
688: dsc->stop_card = ax88190_stop_card;
689: dsc->sc_media_init = ax88190_media_init;
690: dsc->sc_media_fini = ax88190_media_fini;
691:
1.123 mycroft 692: test = bus_space_read_1(nsc->sc_asict, nsc->sc_asich, 0x05);
693: if (test != 0) {
1.104 christos 694: nsc->sc_type = NE2000_TYPE_AX88790;
695: typestr = " (AX88790)";
696: } else {
697: nsc->sc_type = NE2000_TYPE_AX88190;
698: typestr = " (AX88190)";
699: }
1.55 enami 700: }
701:
1.117 mycroft 702: if (enaddr != NULL &&
703: ne_dev->enet_vendor[0] != 0xff) {
1.2 thorpej 704: /*
705: * Make sure this is what we expect.
706: */
707: if (enaddr[0] != ne_dev->enet_vendor[0] ||
708: enaddr[1] != ne_dev->enet_vendor[1] ||
709: enaddr[2] != ne_dev->enet_vendor[2]) {
1.46 mycroft 710: ++i;
711: goto again;
1.2 thorpej 712: }
713: }
714:
1.22 thorpej 715: /*
1.109 wiz 716: * Check for a Realtek 8019.
1.22 thorpej 717: */
1.151 dholland 718: if (nsc->sc_type == NE2000_TYPE_UNKNOWN) {
1.75 thorpej 719: bus_space_write_1(dsc->sc_regt, dsc->sc_regh, ED_P0_CR,
720: ED_CR_PAGE_0 | ED_CR_STP);
721: if (bus_space_read_1(dsc->sc_regt, dsc->sc_regh,
722: NERTL_RTL0_8019ID0) == RTL0_8019ID0 &&
723: bus_space_read_1(dsc->sc_regt, dsc->sc_regh,
724: NERTL_RTL0_8019ID1) == RTL0_8019ID1) {
725: typestr = " (RTL8019)";
726: dsc->sc_mediachange = rtl80x9_mediachange;
727: dsc->sc_mediastatus = rtl80x9_mediastatus;
1.95 simonb 728: dsc->init_card = rtl80x9_init_card;
1.75 thorpej 729: dsc->sc_media_init = rtl80x9_media_init;
730: }
1.22 thorpej 731: }
732:
1.68 thorpej 733: if (ne2000_attach(nsc, enaddr))
1.129 mycroft 734: goto fail2;
1.2 thorpej 735:
1.156 ! uwe 736: /* dopowerhooks(9) - deprecated, only called by hpcs* apmdev(4) */
1.154 cegger 737: psc->sc_powerhook = powerhook_establish(device_xname(self),
1.147 jmcneill 738: ne2000_power, nsc);
1.143 peter 739: if (psc->sc_powerhook == NULL)
1.152 cube 740: aprint_error_dev(self,
741: "WARNING: unable to establish power hook\n");
1.143 peter 742:
1.156 ! uwe 743: /* pmf(9) power hooks */
! 744: if (!pmf_device_register(self, ne2000_suspend, ne2000_resume))
! 745: aprint_error_dev(self, "unable to establish power handler\n");
! 746: else {
! 747: #if 0 /* XXX: notyet: if_stop is NULL! */
! 748: pmf_class_network_register(self, &dsc->sc_ec.ec_if);
! 749: #endif
! 750: }
! 751:
1.129 mycroft 752: psc->sc_state = NE_PCMCIA_ATTACHED;
753: ne_pcmcia_disable(dsc);
1.52 itojun 754: return;
755:
1.129 mycroft 756: fail2:
757: ne_pcmcia_disable(dsc);
758: fail:
759: pcmcia_function_unconfigure(pa->pf);
1.25 thorpej 760: }
761:
762: int
1.152 cube 763: ne_pcmcia_detach(device_t self, int flags)
1.25 thorpej 764: {
1.152 cube 765: struct ne_pcmcia_softc *psc = device_private(self);
1.127 mycroft 766: struct pcmcia_function *pf = psc->sc_pf;
1.53 enami 767: int error;
1.26 thorpej 768:
1.129 mycroft 769: if (psc->sc_state != NE_PCMCIA_ATTACHED)
1.53 enami 770: return (0);
771:
1.143 peter 772: if (psc->sc_powerhook != NULL)
773: powerhook_disestablish(psc->sc_powerhook);
774:
1.53 enami 775: error = ne2000_detach(&psc->sc_ne2000, flags);
1.129 mycroft 776: if (error)
1.53 enami 777: return (error);
778:
1.129 mycroft 779: pcmcia_function_unconfigure(pf);
1.53 enami 780:
781: return (0);
1.2 thorpej 782: }
783:
784: int
1.152 cube 785: ne_pcmcia_enable(struct dp8390_softc *dsc)
1.2 thorpej 786: {
787: struct ne_pcmcia_softc *psc = (struct ne_pcmcia_softc *)dsc;
1.135 mycroft 788: int error;
1.2 thorpej 789:
790: /* set up the interrupt */
791: psc->sc_ih = pcmcia_intr_establish(psc->sc_pf, IPL_NET, dp8390_intr,
792: dsc);
1.130 mycroft 793: if (!psc->sc_ih)
1.135 mycroft 794: return (EIO);
1.2 thorpej 795:
1.135 mycroft 796: error = pcmcia_function_enable(psc->sc_pf);
797: if (error) {
798: pcmcia_intr_disestablish(psc->sc_pf, psc->sc_ih);
799: psc->sc_ih = 0;
1.104 christos 800: }
1.55 enami 801:
1.135 mycroft 802: return (error);
1.2 thorpej 803: }
804:
805: void
1.152 cube 806: ne_pcmcia_disable(struct dp8390_softc *dsc)
1.2 thorpej 807: {
808: struct ne_pcmcia_softc *psc = (struct ne_pcmcia_softc *)dsc;
809:
810: pcmcia_function_disable(psc->sc_pf);
811: pcmcia_intr_disestablish(psc->sc_pf, psc->sc_ih);
1.129 mycroft 812: psc->sc_ih = 0;
1.52 itojun 813: }
814:
1.53 enami 815: u_int8_t *
1.152 cube 816: ne_pcmcia_get_enaddr(struct ne_pcmcia_softc *psc, int maddr,
817: u_int8_t myea[ETHER_ADDR_LEN])
1.52 itojun 818: {
1.53 enami 819: struct ne2000_softc *nsc = &psc->sc_ne2000;
820: struct dp8390_softc *dsc = &nsc->sc_dp8390;
821: struct pcmcia_mem_handle pcmh;
1.84 soren 822: bus_size_t offset;
1.53 enami 823: u_int8_t *enaddr = NULL;
824: int j, mwindow;
825:
826: if (maddr < 0)
827: return (NULL);
828:
829: if (pcmcia_mem_alloc(psc->sc_pf, ETHER_ADDR_LEN * 2, &pcmh)) {
1.152 cube 830: aprint_error_dev(dsc->sc_dev,
831: "can't alloc mem for enet addr\n");
1.53 enami 832: goto fail_1;
833: }
834: if (pcmcia_mem_map(psc->sc_pf, PCMCIA_MEM_ATTR, maddr,
835: ETHER_ADDR_LEN * 2, &pcmh, &offset, &mwindow)) {
1.152 cube 836: aprint_error_dev(dsc->sc_dev, "can't map mem for enet addr\n");
1.53 enami 837: goto fail_2;
1.52 itojun 838: }
1.53 enami 839: for (j = 0; j < ETHER_ADDR_LEN; j++)
840: myea[j] = bus_space_read_1(pcmh.memt, pcmh.memh,
841: offset + (j * 2));
842: enaddr = myea;
843:
844: pcmcia_mem_unmap(psc->sc_pf, mwindow);
845: fail_2:
846: pcmcia_mem_free(psc->sc_pf, &pcmh);
847: fail_1:
848: return (enaddr);
849: }
850:
851: u_int8_t *
1.152 cube 852: ne_pcmcia_dl10019_get_enaddr(struct ne_pcmcia_softc *psc,
853: u_int8_t myea[ETHER_ADDR_LEN])
1.53 enami 854: {
855: struct ne2000_softc *nsc = &psc->sc_ne2000;
856: u_int8_t sum;
857: int j;
858:
859: #define PAR0 0x04
860: for (j = 0, sum = 0; j < 8; j++)
861: sum += bus_space_read_1(nsc->sc_asict, nsc->sc_asich,
862: PAR0 + j);
863: if (sum != 0xff)
864: return (NULL);
865: for (j = 0; j < ETHER_ADDR_LEN; j++)
866: myea[j] = bus_space_read_1(nsc->sc_asict,
867: nsc->sc_asich, PAR0 + j);
868: #undef PAR0
869: return (myea);
1.55 enami 870: }
CVSweb <webmaster@jp.NetBSD.org>