[BACK]Return to pcmcia_cis_quirks.c CVS log [TXT][DIR] Up to [local] / sys / dev / pcmcia

Annotation of sys/dev/pcmcia/pcmcia_cis_quirks.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: pcmcia_cis_quirks.c,v 1.8 2005/10/27 16:42:19 deraadt Exp $   */
        !             2: /*     $NetBSD: pcmcia_cis_quirks.c,v 1.3 1998/12/29 09:00:28 marc Exp $       */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 1998 Marc Horowitz.  All rights reserved.
        !             6:  *
        !             7:  * Redistribution and use in source and binary forms, with or without
        !             8:  * modification, are permitted provided that the following conditions
        !             9:  * are met:
        !            10:  * 1. Redistributions of source code must retain the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer.
        !            12:  * 2. Redistributions in binary form must reproduce the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer in the
        !            14:  *    documentation and/or other materials provided with the distribution.
        !            15:  * 3. All advertising materials mentioning features or use of this software
        !            16:  *    must display the following acknowledgement:
        !            17:  *     This product includes software developed by Marc Horowitz.
        !            18:  * 4. The name of the author may not be used to endorse or promote products
        !            19:  *    derived from this software without specific prior written permission.
        !            20:  *
        !            21:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            22:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            23:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            24:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            25:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            26:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            27:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            28:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            29:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            30:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            31:  */
        !            32:
        !            33: #include <sys/types.h>
        !            34: #include <sys/param.h>
        !            35: #include <sys/systm.h>
        !            36: #include <sys/device.h>
        !            37: #include <sys/mbuf.h>
        !            38:
        !            39: #include <dev/pcmcia/pcmciadevs.h>
        !            40: #include <dev/pcmcia/pcmciareg.h>
        !            41: #include <dev/pcmcia/pcmciachip.h>
        !            42: #include <dev/pcmcia/pcmciavar.h>
        !            43:
        !            44: /* There are cards out there whose CIS flat-out lies.  This file
        !            45:    contains struct pcmcia_function chains for those devices. */
        !            46:
        !            47: /* these structures are just static templates which are then copied
        !            48:    into "live" allocated structures */
        !            49:
        !            50: struct pcmcia_function pcmcia_3cxem556_func0 = {
        !            51:        0,                      /* function number */
        !            52:        PCMCIA_FUNCTION_NETWORK,
        !            53:        0x07,                   /* last cfe number */
        !            54:        0x800,                  /* ccr_base */
        !            55:        0x63,                   /* ccr_mask */
        !            56: };
        !            57:
        !            58: struct pcmcia_config_entry pcmcia_3cxem556_func0_cfe0 = {
        !            59:        0x07,                   /* cfe number */
        !            60:        PCMCIA_CFE_IO8 | PCMCIA_CFE_IO16 | PCMCIA_CFE_IRQLEVEL,
        !            61:        PCMCIA_IFTYPE_IO,
        !            62:        1,                      /* num_iospace */
        !            63:        4,                      /* iomask */
        !            64:        { { 0x0010, 0 } },      /* iospace */
        !            65:        0xffff,                 /* irqmask */
        !            66:        0,                      /* num_memspace */
        !            67:        { },                    /* memspace */
        !            68:        0,                      /* maxtwins */
        !            69: };
        !            70:
        !            71: static struct pcmcia_function pcmcia_3cxem556_func1 = {
        !            72:        1,                      /* function number */
        !            73:        PCMCIA_FUNCTION_SERIAL,
        !            74:        0x27,                   /* last cfe number */
        !            75:        0x900,                  /* ccr_base */
        !            76:        0x63,                   /* ccr_mask */
        !            77: };
        !            78:
        !            79: static struct pcmcia_config_entry pcmcia_3cxem556_func1_cfe0 = {
        !            80:        0x27,                   /* cfe number */
        !            81:        PCMCIA_CFE_IO8 | PCMCIA_CFE_IRQLEVEL,
        !            82:        PCMCIA_IFTYPE_IO,
        !            83:        1,                      /* num_iospace */
        !            84:        3,                      /* iomask */
        !            85:        { { 0x0008, 0 } },      /* iospace */
        !            86:        0xffff,                 /* irqmask */
        !            87:        0,                      /* num_memspace */
        !            88:        { },                    /* memspace */
        !            89:        0,                      /* maxtwins */
        !            90: };
        !            91:
        !            92: struct pcmcia_function pcmcia_megahertz_xjem1144_func0 = {
        !            93:        0,                      /* function number */
        !            94:        PCMCIA_FUNCTION_NETWORK,
        !            95:        0x07,                   /* last cfe number */
        !            96:        0x200,                  /* ccr_base */
        !            97:        0x63,                   /* ccr_mask */
        !            98: };
        !            99:
        !           100: struct pcmcia_config_entry pcmcia_megahertz_xjem1144_func0_cfe0 = {
        !           101:        0x07,                   /* cfe number */
        !           102:        PCMCIA_CFE_IO8 | PCMCIA_CFE_IO16 | PCMCIA_CFE_IRQLEVEL,
        !           103:        PCMCIA_IFTYPE_IO,
        !           104:        1,                      /* num_iospace */
        !           105:        4,                      /* iomask */
        !           106:        { { 0x0010, 0 } },      /* iospace */
        !           107:        0xffff,                 /* irqmask */
        !           108:        0,                      /* num_memspace */
        !           109:        { },                    /* memspace */
        !           110:        0,                      /* maxtwins */
        !           111: };
        !           112:
        !           113: static struct pcmcia_function pcmcia_megahertz_xjem1144_func1 = {
        !           114:        1,                      /* function number */
        !           115:        PCMCIA_FUNCTION_SERIAL,
        !           116:        0x35,                   /* last cfe number */
        !           117:        0x300,                  /* ccr_base */
        !           118:        0x3,                    /* ccr_mask */
        !           119: };
        !           120:
        !           121: static struct pcmcia_config_entry pcmcia_megahertz_xjem1144_func1_cfe0 = {
        !           122:        0x35,                   /* cfe number */
        !           123:        PCMCIA_CFE_IO8 | PCMCIA_CFE_IRQLEVEL, PCMCIA_IFTYPE_IO,
        !           124:        1,                      /* num_iospace */
        !           125:        0,                      /* iomask */
        !           126:        { { 0x0008, 0x2f8 } },  /* iospace */
        !           127:        0xffff,                 /* irqmask */
        !           128:        0,                      /* num_memspace */
        !           129:        { },                    /* memspace */
        !           130:        0,                      /* maxtwins */
        !           131: };
        !           132:
        !           133: static struct pcmcia_function pcmcia_sierra_a555_func1 = {
        !           134:        1,                      /* function number */
        !           135:        PCMCIA_FUNCTION_SERIAL,
        !           136:        0x24,                   /* last cfe number */
        !           137:        0x700,                  /* ccr_base */
        !           138:        0x73,                   /* ccr_mask */
        !           139: };
        !           140:
        !           141: static struct pcmcia_config_entry pcmcia_sierra_a555_func1_cfe0 = {
        !           142:        0x20,                   /* cfe number */
        !           143:        PCMCIA_CFE_IO8 | PCMCIA_CFE_IRQLEVEL, PCMCIA_IFTYPE_IO,
        !           144:        1,                      /* num_iospace */
        !           145:        0,                      /* iomask */
        !           146:        { { 0x0008, 0x3f8 } },  /* iospace */
        !           147:        0x3fbc,                 /* irqmask */
        !           148:        0,                      /* num_memspace */
        !           149:        { },                    /* memspace */
        !           150:        0,                      /* maxtwins */
        !           151: };
        !           152:
        !           153: static struct pcmcia_function pcmcia_sveclancard_func0 = {
        !           154:        0,                      /* function number */
        !           155:        PCMCIA_FUNCTION_NETWORK,
        !           156:        0x1,                    /* last cfe number */
        !           157:        0x100,                  /* ccr_base */
        !           158:        0x1,                    /* ccr_mask */
        !           159: };
        !           160:
        !           161: static struct pcmcia_config_entry pcmcia_sveclancard_func0_cfe0 = {
        !           162:        0x1,                    /* cfe number */
        !           163:        PCMCIA_CFE_MWAIT_REQUIRED | PCMCIA_CFE_RDYBSY_ACTIVE |
        !           164:        PCMCIA_CFE_WP_ACTIVE | PCMCIA_CFE_BVD_ACTIVE | PCMCIA_CFE_IO16,
        !           165:        PCMCIA_IFTYPE_IO,
        !           166:        1,                      /* num_iospace */
        !           167:        5,                      /* iomask */
        !           168:        { { 0x20, 0x300 } },    /* iospace */
        !           169:        0xdeb8,                 /* irqmask */
        !           170:        0,                      /* num_memspace */
        !           171:        { },                    /* memspace */
        !           172:        0,                      /* maxtwins */
        !           173: };
        !           174:
        !           175: static struct pcmcia_cis_quirk pcmcia_cis_quirks[] = {
        !           176:        { PCMCIA_VENDOR_3COM, PCMCIA_PRODUCT_3COM_3CXEM556, PCMCIA_CIS_INVALID,
        !           177:          &pcmcia_3cxem556_func0, &pcmcia_3cxem556_func0_cfe0 },
        !           178:        { PCMCIA_VENDOR_3COM, PCMCIA_PRODUCT_3COM_3CXEM556, PCMCIA_CIS_INVALID,
        !           179:          &pcmcia_3cxem556_func1, &pcmcia_3cxem556_func1_cfe0 },
        !           180:        { PCMCIA_VENDOR_3COM, PCMCIA_PRODUCT_3COM_3CXEM556B,
        !           181:          PCMCIA_CIS_INVALID,
        !           182:          &pcmcia_3cxem556_func0, &pcmcia_3cxem556_func0_cfe0 },
        !           183:        { PCMCIA_VENDOR_3COM, PCMCIA_PRODUCT_3COM_3CXEM556B,
        !           184:          PCMCIA_CIS_INVALID,
        !           185:          &pcmcia_3cxem556_func1, &pcmcia_3cxem556_func1_cfe0 },
        !           186:        { PCMCIA_VENDOR_MEGAHERTZ2, PCMCIA_PRODUCT_MEGAHERTZ2_XJEM1144,
        !           187:          PCMCIA_CIS_INVALID,
        !           188:          &pcmcia_megahertz_xjem1144_func0,
        !           189:          &pcmcia_megahertz_xjem1144_func0_cfe0 },
        !           190:        { PCMCIA_VENDOR_MEGAHERTZ2, PCMCIA_PRODUCT_MEGAHERTZ2_XJEM1144,
        !           191:          PCMCIA_CIS_INVALID,
        !           192:          &pcmcia_megahertz_xjem1144_func1,
        !           193:          &pcmcia_megahertz_xjem1144_func1_cfe0 },
        !           194:        { PCMCIA_VENDOR_SIERRA, PCMCIA_PRODUCT_SIERRA_A550,
        !           195:          PCMCIA_CIS_INVALID,
        !           196:          &pcmcia_sierra_a555_func1, &pcmcia_sierra_a555_func1_cfe0 },
        !           197:        { PCMCIA_VENDOR_SIERRA, PCMCIA_PRODUCT_SIERRA_A555,
        !           198:          PCMCIA_CIS_INVALID,
        !           199:          &pcmcia_sierra_a555_func1, &pcmcia_sierra_a555_func1_cfe0 },
        !           200:        { PCMCIA_VENDOR_SIERRA, PCMCIA_PRODUCT_SIERRA_A710,
        !           201:          PCMCIA_CIS_INVALID,
        !           202:          &pcmcia_sierra_a555_func1, &pcmcia_sierra_a555_func1_cfe0 },
        !           203:        { PCMCIA_VENDOR_SIERRA, PCMCIA_PRODUCT_SIERRA_AC710,
        !           204:          PCMCIA_CIS_INVALID,
        !           205:          &pcmcia_sierra_a555_func1, &pcmcia_sierra_a555_func1_cfe0 },
        !           206:        { PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
        !           207:          PCMCIA_CIS_SVEC_LANCARD,
        !           208:          &pcmcia_sveclancard_func0, &pcmcia_sveclancard_func0_cfe0 },
        !           209: };
        !           210:
        !           211: void pcmcia_check_cis_quirks(sc)
        !           212:        struct pcmcia_softc *sc;
        !           213: {
        !           214:        int wiped = 0;
        !           215:        int i, j;
        !           216:        struct pcmcia_function *pf, *pf_next, *pf_last;
        !           217:        struct pcmcia_config_entry *cfe, *cfe_next;
        !           218:
        !           219:        pf = NULL;
        !           220:        pf_last = NULL;
        !           221:
        !           222:
        !           223:        for (i = 0; i < sizeof(pcmcia_cis_quirks)/sizeof(pcmcia_cis_quirks[0]);
        !           224:            i++) {
        !           225:                if ((sc->card.manufacturer == pcmcia_cis_quirks[i].manufacturer) &&
        !           226:                        (sc->card.product == pcmcia_cis_quirks[i].product) &&
        !           227:                        (((sc->card.manufacturer != PCMCIA_VENDOR_INVALID) &&
        !           228:                          (sc->card.product != PCMCIA_PRODUCT_INVALID)) ||
        !           229:                         ((sc->card.manufacturer == PCMCIA_VENDOR_INVALID) &&
        !           230:                          (sc->card.product == PCMCIA_PRODUCT_INVALID) &&
        !           231:                          sc->card.cis1_info[0] &&
        !           232:                          (strcmp(sc->card.cis1_info[0],
        !           233:                                          pcmcia_cis_quirks[i].cis1_info[0]) == 0) &&
        !           234:                          sc->card.cis1_info[1] &&
        !           235:                          (strcmp(sc->card.cis1_info[1],
        !           236:                                          pcmcia_cis_quirks[i].cis1_info[1]) == 0)))) {
        !           237:                        if (!wiped) {
        !           238:                                if (pcmcia_verbose) {
        !           239:                                        printf("%s: using CIS quirks for ", sc->dev.dv_xname);
        !           240:                                        for (j = 0; j < 4; j++) {
        !           241:                                                if (sc->card.cis1_info[j] == NULL)
        !           242:                                                        break;
        !           243:                                                if (j)
        !           244:                                                        printf(", ");
        !           245:                                                printf("%s", sc->card.cis1_info[j]);
        !           246:                                        }
        !           247:                                        printf("\n");
        !           248:                                }
        !           249:
        !           250:                                for (pf = SIMPLEQ_FIRST(&sc->card.pf_head); pf != NULL;
        !           251:                                     pf = pf_next) {
        !           252:                                        for (cfe = SIMPLEQ_FIRST(&pf->cfe_head); cfe != NULL;
        !           253:                                             cfe = cfe_next) {
        !           254:                                                cfe_next = SIMPLEQ_NEXT(cfe, cfe_list);
        !           255:                                                free(cfe, M_DEVBUF);
        !           256:                                        }
        !           257:                                        pf_next = SIMPLEQ_NEXT(pf, pf_list);
        !           258:                                        free(pf, M_DEVBUF);
        !           259:                                }
        !           260:
        !           261:                                SIMPLEQ_INIT(&sc->card.pf_head);
        !           262:                                wiped = 1;
        !           263:                        }
        !           264:
        !           265:                        if (pf_last == pcmcia_cis_quirks[i].pf) {
        !           266:                                cfe = malloc(sizeof(*cfe), M_DEVBUF, M_NOWAIT);
        !           267:                                if (cfe == NULL)
        !           268:                                        return;
        !           269:                                *cfe = *pcmcia_cis_quirks[i].cfe;
        !           270:
        !           271:                                SIMPLEQ_INSERT_TAIL(&pf->cfe_head, cfe, cfe_list);
        !           272:                        } else {
        !           273:                                pf = malloc(sizeof(*pf), M_DEVBUF, M_NOWAIT);
        !           274:                                if (pf == NULL)
        !           275:                                        return;
        !           276:                                *pf = *pcmcia_cis_quirks[i].pf;
        !           277:                                SIMPLEQ_INIT(&pf->cfe_head);
        !           278:
        !           279:                                cfe = malloc(sizeof(*cfe), M_DEVBUF, M_NOWAIT);
        !           280:                                if (cfe == NULL)
        !           281:                                        return;
        !           282:                                *cfe = *pcmcia_cis_quirks[i].cfe;
        !           283:
        !           284:                                SIMPLEQ_INSERT_TAIL(&pf->cfe_head, cfe, cfe_list);
        !           285:                                SIMPLEQ_INSERT_TAIL(&sc->card.pf_head, pf, pf_list);
        !           286:
        !           287:                                pf_last = pcmcia_cis_quirks[i].pf;
        !           288:                        }
        !           289:                }
        !           290:        }
        !           291: }

CVSweb