[BACK]Return to if_ne_pcmcia.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / dev / pcmcia

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>