Moderately hacked pccard code from newconfig. It is somewhat in

incomplete and likely has problem.  The code was originally pcmcia,
but I renamed it to pccard and made it compile on FreeBSD -current.  I
converted SIMPLEQ to STAILQ as well as a few sc->dev.xname ->
device_printf changes.  This is a green port of fairly mature code.

I derived this work from the FreeBSD newconfig project
(http://www.jp.freebsd.org/newconfig).  Any problems with it are
likely introduced by me.

Obtained from: newconfig project
This commit is contained in:
Warner Losh 1999-10-26 06:52:31 +00:00
parent 6a39c0d602
commit c2380338f0
13 changed files with 4695 additions and 0 deletions

View File

@ -0,0 +1,8 @@
# $NetBSD: Makefile.pcmciadevs,v 1.1 1998/07/19 17:28:15 christos Exp $
# $FreeBSD$
AWK= awk
pccarddevs.h pccarddevs_data.h: pccarddevs devlist2h.awk
/bin/rm -f pccarddevs.h pccarddevs_data.h
${AWK} -f devlist2h.awk pccarddevs

View File

@ -0,0 +1,226 @@
#! /usr/bin/awk -f
# $NetBSD: devlist2h.awk,v 1.3 1998/09/05 14:42:06 christos Exp $
# $FreeBSD$
#
# Copyright (c) 1998 The NetBSD Foundation, Inc.
# All rights reserved.
#
# This code is derived from software contributed to The NetBSD Foundation
# by Christos Zoulas.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
# must display the following acknowledgement:
# This product includes software developed by the NetBSD
# Foundation, Inc. and its contributors.
# 4. Neither the name of The NetBSD Foundation nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# Copyright (c) 1995, 1996 Christopher G. Demetriou
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
# must display the following acknowledgement:
# This product includes software developed by Christopher G. Demetriou.
# This product includes software developed by Christos Zoulas
# 4. The name of the author(s) may not be used to endorse or promote products
# derived from this software without specific prior written permission
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
function collectline(f, line) {
oparen = 0
line = ""
while (f <= NF) {
if ($f == "#") {
line = line "("
oparen = 1
f++
continue
}
if (oparen) {
line = line $f
if (f < NF)
line = line " "
f++
continue
}
line = line $f
if (f < NF)
line = line " "
f++
}
if (oparen)
line = line ")"
return line
}
BEGIN {
nproducts = nvendors = 0
dfile="pccarddevs_data.h"
hfile="pccarddevs.h"
}
NR == 1 {
VERSION = $0
gsub("\\$", "", VERSION)
printf("/*\t\$FreeBSD\$\t*/\n\n") > dfile
printf("/*\n") > dfile
printf(" * THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.\n") \
> dfile
printf(" *\n") > dfile
printf(" * generated from:\n") > dfile
printf(" *\t%s\n", VERSION) > dfile
printf(" */\n") > dfile
printf("/*\t\$FreeBSD\$\t*/\n\n") > hfile
printf("/*\n") > hfile
printf(" * THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.\n") \
> hfile
printf(" *\n") > hfile
printf(" * generated from:\n") > hfile
printf(" *\t%s\n", VERSION) > hfile
printf(" */\n") > hfile
next
}
$1 == "vendor" {
nvendors++
vendorindex[$2] = nvendors; # record index for this name, for later.
vendors[nvendors, 1] = $2; # name
vendors[nvendors, 2] = $3; # id
printf("#define\tPCCARD_VENDOR_%s\t%s\t", vendors[nvendors, 1],
vendors[nvendors, 2]) > hfile
vendors[nvendors, 3] = collectline(4, line)
printf("/* %s */\n", vendors[nvendors, 3]) > hfile
next
}
$1 == "product" {
nproducts++
products[nproducts, 1] = $2; # vendor name
products[nproducts, 2] = $3; # product id
products[nproducts, 3] = $4; # id
f = 5;
if ($4 == "{") {
products[nproducts, 3] = -1
z = "{ "
for (i = 0; i < 4; i++) {
if (f <= NF) {
gsub("&sp", " ", $f)
gsub("&tab", "\t", $f)
gsub("&nl", "\n", $f)
z = z $f " "
f++
}
else {
if (i == 3)
z = z "NULL "
else
z = z "NULL, "
}
}
products[nproducts, 4] = z $f
f++
}
else {
products[nproducts, 4] = "{ NULL, NULL, NULL, NULL }"
}
printf("#define\tPCCARD_CIS_%s_%s\t%s\n",
products[nproducts, 1], products[nproducts, 2],
products[nproducts, 4]) > hfile
printf("#define\tPCCARD_PRODUCT_%s_%s\t%s\n", products[nproducts, 1],
products[nproducts, 2], products[nproducts, 3]) > hfile
products[nproducts, 5] = collectline(f, line)
printf("#define\tPCCARD_STR_%s_%s\t\"%s\"\n",
products[nproducts, 1], products[nproducts, 2],
products[nproducts, 5]) > hfile
next
}
{
if ($0 == "")
blanklines++
print $0 > hfile
if (blanklines < 2)
print $0 > dfile
}
END {
# print out the match tables
printf("\n") > dfile
printf("struct pccard_knowndev pccard_knowndevs[] = {\n") > dfile
for (i = 1; i <= nproducts; i++) {
printf("\t{\n") > dfile
if (products[i, 3] == -1) {
printf("\t PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_%s_%s,\n",
products[i, 1], products[i, 2]) > dfile
} else {
printf("\t PCCARD_VENDOR_%s, PCCARD_PRODUCT_%s_%s,\n",
products[i, 1], products[i, 1], products[i, 2]) > dfile
}
printf("\t PCCARD_CIS_%s_%s,\n",
products[i, 1], products[i, 2]) > dfile
printf("\t ") > dfile
printf("0") > dfile
printf(",\n") > dfile
vendi = vendorindex[products[i, 1]];
printf("\t \"%s\",\n", vendors[vendi, 3]) > dfile
printf("\t \"%s\"\t},\n", products[i, 5]) > dfile
printf("\t},\n") > dfile
}
for (i = 1; i <= nvendors; i++) {
printf("\t{\n") > dfile
printf("\t PCCARD_VENDOR_%s, 0,\n", vendors[i, 1]) > dfile
printf("\t PCCARD_KNOWNDEV_NOPROD,\n") > dfile
printf("\t PCCARD_CIS_INVALID,\n") > dfile
printf("\t \"%s\",\n", vendors[i, 3]) > dfile
printf("\t NULL,\n") > dfile
printf("\t},\n") > dfile
}
printf("\t{ 0, 0, { NULL, NULL, NULL, NULL }, 0, NULL, NULL, }\n") > dfile
printf("};\n") > dfile
}

View File

@ -0,0 +1,71 @@
# $NetBSD: files.pcmcia,v 1.14 1999/01/01 19:30:03 christos Exp $
# $FreeBSD$
#
# Config.new file and device description for machine-independent PCMCIA code.
# Included by ports that need it.
defopt PCMCIAVERBOSE
device pcmcia {[function = -1], [irq = -1]}
file dev/pcmcia/pcmcia.c pcmcia
file dev/pcmcia/pcmcia_cis.c pcmcia
file dev/pcmcia/pcmcia_cis_quirks.c pcmcia
# device declaration in sys/conf/files
attach pcmcia at pcmciabus
# 3Com 3c589 Ethernet, 3c562 multifunction Ethernet, and 3CXEM556
# multifunction Ethernet controllers
# device declaration in sys/conf/files
attach ep at pcmcia with ep_pcmcia: elink
file dev/pcmcia/if_ep_pcmcia.c ep_pcmcia
# National Semiconductor DS8390/WD83C690-based boards
# (NE[12]000, and clones)
attach ne at pcmcia with ne_pcmcia: rtl80x9
file dev/pcmcia/if_ne_pcmcia.c ne_pcmcia
# Adaptec APA-1460 SCSI Host Adapter
#attach aic at pcmcia with aic_pcmcia
#file dev/pcmcia/aic_pcmcia.c aic_pcmcia
#attach com at pcmcia with com_pcmcia
#file dev/pcmcia/com_pcmcia.c com_pcmcia
# Digital RoamAbout / Lucent WaveLAN PCMCIA card
#device wl: arp, ether, ifnet
#attach wl at pcmcia with wl_pcmcia
#file dev/pcmcia/if_wl_pcmcia.c wl_pcmcia
#defopt opt_wl_pcmcia.h WL_TIMER WLP_CC_DEBUG WL_DEBUG MMC_STATUS WL_IFCNTRS WL_TIMING
# PCMCIA IDE controller
#attach wdc at pcmcia with wdc_pcmcia
#file dev/pcmcia/wdc_pcmcia.c wdc_pcmcia
# SMC91Cxx Ethernet Controllers (i.e. Megahertz X-Jack)
attach sn at pcmcia with sm_pcmcia
file dev/pcmcia/if_sm_pcmcia.c sm_pcmcia
# MB8696x Ethernet Controllers (i.e. TDK LAK CD021BX)
attach fe at pcmcia with mbe_pcmcia
file dev/pcmcia/if_mbe_pcmcia.c mbe_pcmcia
# PCMCIA Floppy controller
#attach fdc at pcmcia with fdc_pcmcia
#file dev/pcmcia/fdc_pcmcia.c fdc_pcmcia
# PCMCIA multi-port serial cards
#device pcmcom {[slave = -1]}
#attach pcmcom at pcmcia
#attach com at pcmcom with com_pcmcom
#file dev/pcmcia/pcmcom.c pcmcom | com_pcmcom needs-flag
# Xircom Netwave
#device cnw: arp, ether, ifnet
#attach cnw at pcmcia
#file dev/pcmcia/if_cnw.c cnw
# Xircom CreditCard
device xe: ether, ifnet
attach xe at pcmcia with xe_pcmcia
file dev/pcmcia/if_xe.c xe

888
sys/dev/pccard/pccard.c Normal file
View File

@ -0,0 +1,888 @@
/* $NetBSD: pcmcia.c,v 1.13 1998/12/24 04:51:59 marc Exp $ */
/* $FreeBSD$ */
/*
* Copyright (c) 1997 Marc Horowitz. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Marc Horowitz.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/kernel.h>
#include <sys/queue.h>
#include <sys/types.h>
#include <sys/bus.h>
#include <machine/bus.h>
#include <sys/rman.h>
#include <machine/resource.h>
#include <dev/pccard/pccardreg.h>
#include <dev/pccard/pccardchip.h>
#include <dev/pccard/pccardvar.h>
#ifdef PCCARDDEBUG
int pccard_debug = 0;
#define DPRINTF(arg) if (pccard_debug) printf arg
int pccardintr_debug = 0;
/* this is done this way to avoid doing lots of conditionals
at interrupt level. */
#define PCCARD_CARD_INTR (pccardintr_debug?pccard_card_intrdebug:pccard_card_intr)
#else
#define DPRINTF(arg)
#define PCCARD_CARD_INTR (pccard_card_intr)
#endif
#ifdef PCCARDVERBOSE
int pccard_verbose = 1;
#else
int pccard_verbose = 0;
#endif
int pccard_print __P((void *, const char *));
static __inline void pccard_socket_enable __P((pccard_chipset_tag_t,
pccard_chipset_handle_t *));
static __inline void pccard_socket_disable __P((pccard_chipset_tag_t,
pccard_chipset_handle_t *));
int pccard_card_intr __P((void *));
#ifdef PCCARDDEBUG
int pccard_card_intrdebug __P((void *));
#endif
int
pccard_ccr_read(pf, ccr)
struct pccard_function *pf;
int ccr;
{
return (bus_space_read_1(pf->pf_ccrt, pf->pf_ccrh,
pf->pf_ccr_offset + ccr));
}
void
pccard_ccr_write(pf, ccr, val)
struct pccard_function *pf;
int ccr;
int val;
{
if ((pf->ccr_mask) & (1 << (ccr / 2))) {
bus_space_write_1(pf->pf_ccrt, pf->pf_ccrh,
pf->pf_ccr_offset + ccr, val);
}
}
static int
pccard_card_attach(device_t dev)
{
struct pccard_softc *sc = (struct pccard_softc *)
device_get_softc(dev);
struct pccard_function *pf;
struct pccard_attach_args paa;
int attached;
/*
* this is here so that when socket_enable calls gettype, trt happens
*/
STAILQ_INIT(&sc->card.pf_head);
pccard_chip_socket_enable(sc->pct, sc->pch);
pccard_read_cis(sc);
pccard_chip_socket_disable(sc->pct, sc->pch);
pccard_check_cis_quirks(dev);
/*
* bail now if the card has no functions, or if there was an error in
* the cis.
*/
if (sc->card.error)
return (1);
if (STAILQ_EMPTY(&sc->card.pf_head))
return (1);
if (pccard_verbose)
pccard_print_cis(dev);
attached = 0;
STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
if (STAILQ_EMPTY(&pf->cfe_head))
continue;
#ifdef DIAGNOSTIC
if (pf->child != NULL) {
printf("%s: %s still attached to function %d!\n",
sc->dev.dv_xname, pf->child->dv_xname,
pf->number);
panic("pccard_card_attach");
}
#endif
pf->sc = sc;
pf->child = NULL;
pf->cfe = NULL;
pf->ih_fct = NULL;
pf->ih_arg = NULL;
}
STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
if (STAILQ_EMPTY(&pf->cfe_head))
continue;
paa.manufacturer = sc->card.manufacturer;
paa.product = sc->card.product;
paa.card = &sc->card;
paa.pf = pf;
#if XXX
if (attach_child()) {
attached++;
DPRINTF(("%s: function %d CCR at %d "
"offset %lx: %x %x %x %x, %x %x %x %x, %x\n",
sc->dev.dv_xname, pf->number,
pf->pf_ccr_window, pf->pf_ccr_offset,
pccard_ccr_read(pf, 0x00),
pccard_ccr_read(pf, 0x02), pccard_ccr_read(pf, 0x04),
pccard_ccr_read(pf, 0x06), pccard_ccr_read(pf, 0x0A),
pccard_ccr_read(pf, 0x0C), pccard_ccr_read(pf, 0x0E),
pccard_ccr_read(pf, 0x10), pccard_ccr_read(pf, 0x12)));
}
#endif
}
return (attached ? 0 : 1);
}
static void
pccard_card_detach(device_t dev, int flags)
{
struct pccard_softc *sc = (struct pccard_softc *)
device_get_softc(dev);
struct pccard_function *pf;
#if XXX
int error;
#endif
/*
* We are running on either the PCCARD socket's event thread
* or in user context detaching a device by user request.
*/
STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
if (STAILQ_FIRST(&pf->cfe_head) == NULL)
continue;
if (pf->child == NULL)
continue;
DPRINTF(("%s: detaching %s (function %d)\n",
sc->dev.dv_xname, pf->child->dv_xname, pf->number));
#if XXX
if ((error = config_detach(pf->child, flags)) != 0) {
printf("%s: error %d detaching %s (function %d)\n",
sc->dev.dv_xname, error, pf->child->dv_xname,
pf->number);
} else
pf->child = NULL;
#endif
}
}
static void
pccard_card_deactivate(device_t dev)
{
struct pccard_softc *sc = (struct pccard_softc *)
device_get_softc(dev);
struct pccard_function *pf;
/*
* We're in the chip's card removal interrupt handler.
* Deactivate the child driver. The PCCARD socket's
* event thread will run later to finish the detach.
*/
STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
if (STAILQ_FIRST(&pf->cfe_head) == NULL)
continue;
if (pf->child == NULL)
continue;
DPRINTF(("%s: deactivating %s (function %d)\n",
sc->dev.dv_xname, pf->child->dv_xname, pf->number));
#if XXX
config_deactivate(pf->child);
#endif
}
}
static int
pccard_card_gettype(device_t dev)
{
struct pccard_softc *sc = (struct pccard_softc *)
device_get_softc(dev);
struct pccard_function *pf;
/*
* set the iftype to memory if this card has no functions (not yet
* probed), or only one function, and that is not initialized yet or
* that is memory.
*/
pf = STAILQ_FIRST(&sc->card.pf_head);
if (pf == NULL ||
(STAILQ_NEXT(pf, pf_list) == NULL &&
(pf->cfe == NULL || pf->cfe->iftype == PCCARD_IFTYPE_MEMORY)))
return (PCCARD_IFTYPE_MEMORY);
else
return (PCCARD_IFTYPE_IO);
}
/*
* Initialize a PCCARD function. May be called as long as the function is
* disabled.
*/
void
pccard_function_init(pf, cfe)
struct pccard_function *pf;
struct pccard_config_entry *cfe;
{
if (pf->pf_flags & PFF_ENABLED)
panic("pccard_function_init: function is enabled");
/* Remember which configuration entry we are using. */
pf->cfe = cfe;
}
static __inline void pccard_socket_enable(pct, pch)
pccard_chipset_tag_t pct;
pccard_chipset_handle_t *pch;
{
pccard_chip_socket_enable(pct, pch);
}
static __inline void pccard_socket_disable(pct, pch)
pccard_chipset_tag_t pct;
pccard_chipset_handle_t *pch;
{
pccard_chip_socket_disable(pct, pch);
}
/* Enable a PCCARD function */
int
pccard_function_enable(pf)
struct pccard_function *pf;
{
struct pccard_function *tmp;
int reg;
if (pf->cfe == NULL)
panic("pccard_function_enable: function not initialized");
/*
* Increase the reference count on the socket, enabling power, if
* necessary.
*/
if (pf->sc->sc_enabled_count++ == 0)
pccard_chip_socket_enable(pf->sc->pct, pf->sc->pch);
DPRINTF(("%s: ++enabled_count = %d\n", pf->sc->dev.dv_xname,
pf->sc->sc_enabled_count));
if (pf->pf_flags & PFF_ENABLED) {
/*
* Don't do anything if we're already enabled.
*/
return (0);
}
/*
* it's possible for different functions' CCRs to be in the same
* underlying page. Check for that.
*/
STAILQ_FOREACH(tmp, &pf->sc->card.pf_head, pf_list) {
if ((tmp->pf_flags & PFF_ENABLED) &&
(pf->ccr_base >= (tmp->ccr_base - tmp->pf_ccr_offset)) &&
((pf->ccr_base + PCCARD_CCR_SIZE) <=
(tmp->ccr_base - tmp->pf_ccr_offset +
tmp->pf_ccr_realsize))) {
pf->pf_ccrt = tmp->pf_ccrt;
pf->pf_ccrh = tmp->pf_ccrh;
pf->pf_ccr_realsize = tmp->pf_ccr_realsize;
/*
* pf->pf_ccr_offset = (tmp->pf_ccr_offset -
* tmp->ccr_base) + pf->ccr_base;
*/
pf->pf_ccr_offset =
(tmp->pf_ccr_offset + pf->ccr_base) -
tmp->ccr_base;
pf->pf_ccr_window = tmp->pf_ccr_window;
break;
}
}
if (tmp == NULL) {
if (pccard_mem_alloc(pf, PCCARD_CCR_SIZE, &pf->pf_pcmh))
goto bad;
if (pccard_mem_map(pf, PCCARD_MEM_ATTR, pf->ccr_base,
PCCARD_CCR_SIZE, &pf->pf_pcmh, &pf->pf_ccr_offset,
&pf->pf_ccr_window)) {
pccard_mem_free(pf, &pf->pf_pcmh);
goto bad;
}
}
reg = (pf->cfe->number & PCCARD_CCR_OPTION_CFINDEX);
reg |= PCCARD_CCR_OPTION_LEVIREQ;
if (pccard_mfc(pf->sc)) {
reg |= (PCCARD_CCR_OPTION_FUNC_ENABLE |
PCCARD_CCR_OPTION_ADDR_DECODE);
if (pf->ih_fct)
reg |= PCCARD_CCR_OPTION_IREQ_ENABLE;
}
pccard_ccr_write(pf, PCCARD_CCR_OPTION, reg);
reg = 0;
if ((pf->cfe->flags & PCCARD_CFE_IO16) == 0)
reg |= PCCARD_CCR_STATUS_IOIS8;
if (pf->cfe->flags & PCCARD_CFE_AUDIO)
reg |= PCCARD_CCR_STATUS_AUDIO;
pccard_ccr_write(pf, PCCARD_CCR_STATUS, reg);
pccard_ccr_write(pf, PCCARD_CCR_SOCKETCOPY, 0);
if (pccard_mfc(pf->sc)) {
long tmp, iosize;
tmp = pf->pf_mfc_iomax - pf->pf_mfc_iobase;
/* round up to nearest (2^n)-1 */
for (iosize = 1; iosize < tmp; iosize <<= 1)
;
iosize--;
pccard_ccr_write(pf, PCCARD_CCR_IOBASE0,
pf->pf_mfc_iobase & 0xff);
pccard_ccr_write(pf, PCCARD_CCR_IOBASE1,
(pf->pf_mfc_iobase >> 8) & 0xff);
pccard_ccr_write(pf, PCCARD_CCR_IOBASE2, 0);
pccard_ccr_write(pf, PCCARD_CCR_IOBASE3, 0);
pccard_ccr_write(pf, PCCARD_CCR_IOSIZE, iosize);
}
#ifdef PCCARDDEBUG
if (pccard_debug) {
STAILQ_FOREACH(tmp, &pf->sc->card.pf_head, pf_list) {
printf("%s: function %d CCR at %d offset %lx: "
"%x %x %x %x, %x %x %x %x, %x\n",
tmp->sc->dev.dv_xname, tmp->number,
tmp->pf_ccr_window, tmp->pf_ccr_offset,
pccard_ccr_read(tmp, 0x00),
pccard_ccr_read(tmp, 0x02),
pccard_ccr_read(tmp, 0x04),
pccard_ccr_read(tmp, 0x06),
pccard_ccr_read(tmp, 0x0A),
pccard_ccr_read(tmp, 0x0C),
pccard_ccr_read(tmp, 0x0E),
pccard_ccr_read(tmp, 0x10),
pccard_ccr_read(tmp, 0x12));
}
}
#endif
pf->pf_flags |= PFF_ENABLED;
return (0);
bad:
/*
* Decrement the reference count, and power down the socket, if
* necessary.
*/
if (--pf->sc->sc_enabled_count == 0)
pccard_chip_socket_disable(pf->sc->pct, pf->sc->pch);
DPRINTF(("%s: --enabled_count = %d\n", pf->sc->dev.dv_xname,
pf->sc->sc_enabled_count));
return (1);
}
/* Disable PCCARD function. */
void
pccard_function_disable(pf)
struct pccard_function *pf;
{
struct pccard_function *tmp;
if (pf->cfe == NULL)
panic("pccard_function_enable: function not initialized");
if ((pf->pf_flags & PFF_ENABLED) == 0) {
/*
* Don't do anything if we're already disabled.
*/
return;
}
/*
* it's possible for different functions' CCRs to be in the same
* underlying page. Check for that. Note we mark us as disabled
* first to avoid matching ourself.
*/
pf->pf_flags &= ~PFF_ENABLED;
STAILQ_FOREACH(tmp, &pf->sc->card.pf_head, pf_list) {
if ((tmp->pf_flags & PFF_ENABLED) &&
(pf->ccr_base >= (tmp->ccr_base - tmp->pf_ccr_offset)) &&
((pf->ccr_base + PCCARD_CCR_SIZE) <=
(tmp->ccr_base - tmp->pf_ccr_offset + tmp->pf_ccr_realsize)))
break;
}
/* Not used by anyone else; unmap the CCR. */
if (tmp == NULL) {
pccard_mem_unmap(pf, pf->pf_ccr_window);
pccard_mem_free(pf, &pf->pf_pcmh);
}
/*
* Decrement the reference count, and power down the socket, if
* necessary.
*/
if (--pf->sc->sc_enabled_count == 0)
pccard_chip_socket_disable(pf->sc->pct, pf->sc->pch);
DPRINTF(("%s: --enabled_count = %d\n", pf->sc->dev.dv_xname,
pf->sc->sc_enabled_count));
}
int
pccard_io_map(pf, width, offset, size, pcihp, windowp)
struct pccard_function *pf;
int width;
bus_addr_t offset;
bus_size_t size;
struct pccard_io_handle *pcihp;
int *windowp;
{
int reg;
if (pccard_chip_io_map(pf->sc->pct, pf->sc->pch,
width, offset, size, pcihp, windowp))
return (1);
/*
* XXX in the multifunction multi-iospace-per-function case, this
* needs to cooperate with io_alloc to make sure that the spaces
* don't overlap, and that the ccr's are set correctly
*/
if (pccard_mfc(pf->sc)) {
long tmp, iosize;
if (pf->pf_mfc_iomax == 0) {
pf->pf_mfc_iobase = pcihp->addr + offset;
pf->pf_mfc_iomax = pf->pf_mfc_iobase + size;
} else {
/* this makes the assumption that nothing overlaps */
if (pf->pf_mfc_iobase > pcihp->addr + offset)
pf->pf_mfc_iobase = pcihp->addr + offset;
if (pf->pf_mfc_iomax < pcihp->addr + offset + size)
pf->pf_mfc_iomax = pcihp->addr + offset + size;
}
tmp = pf->pf_mfc_iomax - pf->pf_mfc_iobase;
/* round up to nearest (2^n)-1 */
for (iosize = 1; iosize >= tmp; iosize <<= 1)
;
iosize--;
pccard_ccr_write(pf, PCCARD_CCR_IOBASE0,
pf->pf_mfc_iobase & 0xff);
pccard_ccr_write(pf, PCCARD_CCR_IOBASE1,
(pf->pf_mfc_iobase >> 8) & 0xff);
pccard_ccr_write(pf, PCCARD_CCR_IOBASE2, 0);
pccard_ccr_write(pf, PCCARD_CCR_IOBASE3, 0);
pccard_ccr_write(pf, PCCARD_CCR_IOSIZE, iosize);
reg = pccard_ccr_read(pf, PCCARD_CCR_OPTION);
reg |= PCCARD_CCR_OPTION_ADDR_DECODE;
pccard_ccr_write(pf, PCCARD_CCR_OPTION, reg);
}
return (0);
}
void
pccard_io_unmap(pf, window)
struct pccard_function *pf;
int window;
{
pccard_chip_io_unmap(pf->sc->pct, pf->sc->pch, window);
/* XXX Anything for multi-function cards? */
}
void *
pccard_intr_establish(pf, ipl, ih_fct, ih_arg)
struct pccard_function *pf;
int ipl;
int (*ih_fct) __P((void *));
void *ih_arg;
{
void *ret;
/* behave differently if this is a multifunction card */
if (pccard_mfc(pf->sc)) {
int s, ihcnt, hiipl, reg;
struct pccard_function *pf2;
/*
* mask all the ipl's which are already used by this card,
* and find the highest ipl number (lowest priority)
*/
ihcnt = 0;
s = 0; /* this is only here to keep the compiler
happy */
hiipl = 0; /* this is only here to keep the compiler
happy */
STAILQ_FOREACH(pf2, &pf->sc->card.pf_head, pf_list) {
if (pf2->ih_fct) {
DPRINTF(("%s: function %d has ih_fct %p\n",
pf->sc->dev.dv_xname, pf2->number,
pf2->ih_fct));
if (ihcnt == 0) {
hiipl = pf2->ih_ipl;
} else {
if (pf2->ih_ipl > hiipl)
hiipl = pf2->ih_ipl;
}
ihcnt++;
}
}
/*
* establish the real interrupt, changing the ipl if
* necessary
*/
if (ihcnt == 0) {
#ifdef DIAGNOSTIC
if (pf->sc->ih != NULL)
panic("card has intr handler, but no function does");
#endif
s = splhigh();
/* set up the handler for the new function */
pf->ih_fct = ih_fct;
pf->ih_arg = ih_arg;
pf->ih_ipl = ipl;
pf->sc->ih = pccard_chip_intr_establish(pf->sc->pct,
pf->sc->pch, pf, ipl, PCCARD_CARD_INTR, pf->sc);
splx(s);
} else if (ipl > hiipl) {
#ifdef DIAGNOSTIC
if (pf->sc->ih == NULL)
panic("functions have ih, but the card does not");
#endif
/* XXX need #ifdef for splserial on x86 */
s = splhigh();
pccard_chip_intr_disestablish(pf->sc->pct, pf->sc->pch,
pf->sc->ih);
/* set up the handler for the new function */
pf->ih_fct = ih_fct;
pf->ih_arg = ih_arg;
pf->ih_ipl = ipl;
pf->sc->ih = pccard_chip_intr_establish(pf->sc->pct,
pf->sc->pch, pf, ipl, PCCARD_CARD_INTR, pf->sc);
splx(s);
} else {
s = splhigh();
/* set up the handler for the new function */
pf->ih_fct = ih_fct;
pf->ih_arg = ih_arg;
pf->ih_ipl = ipl;
splx(s);
}
ret = pf->sc->ih;
if (ret != NULL) {
reg = pccard_ccr_read(pf, PCCARD_CCR_OPTION);
reg |= PCCARD_CCR_OPTION_IREQ_ENABLE;
pccard_ccr_write(pf, PCCARD_CCR_OPTION, reg);
reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS);
reg |= PCCARD_CCR_STATUS_INTRACK;
pccard_ccr_write(pf, PCCARD_CCR_STATUS, reg);
}
} else {
ret = pccard_chip_intr_establish(pf->sc->pct, pf->sc->pch,
pf, ipl, ih_fct, ih_arg);
}
return (ret);
}
void
pccard_intr_disestablish(pf, ih)
struct pccard_function *pf;
void *ih;
{
/* behave differently if this is a multifunction card */
if (pccard_mfc(pf->sc)) {
int s, ihcnt, hiipl;
struct pccard_function *pf2;
/*
* mask all the ipl's which are already used by this card,
* and find the highest ipl number (lowest priority). Skip
* the current function.
*/
ihcnt = 0;
s = 0; /* this is only here to keep the compipler
happy */
hiipl = 0; /* this is only here to keep the compipler
happy */
STAILQ_FOREACH(pf2, &pf->sc->card.pf_head, pf_list) {
if (pf2 == pf)
continue;
if (pf2->ih_fct) {
if (ihcnt == 0) {
hiipl = pf2->ih_ipl;
} else {
if (pf2->ih_ipl > hiipl)
hiipl = pf2->ih_ipl;
}
ihcnt++;
}
}
/*
* if the ih being removed is lower priority than the lowest
* priority remaining interrupt, up the priority.
*/
/* ihcnt is the number of interrupt handlers *not* including
the one about to be removed. */
if (ihcnt == 0) {
int reg;
#ifdef DIAGNOSTIC
if (pf->sc->ih == NULL)
panic("disestablishing last function, but card has no ih");
#endif
pccard_chip_intr_disestablish(pf->sc->pct, pf->sc->pch,
pf->sc->ih);
reg = pccard_ccr_read(pf, PCCARD_CCR_OPTION);
reg &= ~PCCARD_CCR_OPTION_IREQ_ENABLE;
pccard_ccr_write(pf, PCCARD_CCR_OPTION, reg);
pf->ih_fct = NULL;
pf->ih_arg = NULL;
pf->sc->ih = NULL;
} else if (pf->ih_ipl > hiipl) {
#ifdef DIAGNOSTIC
if (pf->sc->ih == NULL)
panic("changing ih ipl, but card has no ih");
#endif
/* XXX need #ifdef for splserial on x86 */
s = splhigh();
pccard_chip_intr_disestablish(pf->sc->pct, pf->sc->pch,
pf->sc->ih);
pf->sc->ih = pccard_chip_intr_establish(pf->sc->pct,
pf->sc->pch, pf, hiipl, PCCARD_CARD_INTR, pf->sc);
/* null out the handler for this function */
pf->ih_fct = NULL;
pf->ih_arg = NULL;
splx(s);
} else {
s = splhigh();
pf->ih_fct = NULL;
pf->ih_arg = NULL;
splx(s);
}
} else {
pccard_chip_intr_disestablish(pf->sc->pct, pf->sc->pch, ih);
}
}
int
pccard_card_intr(arg)
void *arg;
{
struct pccard_softc *sc = arg;
struct pccard_function *pf;
int reg, ret, ret2;
ret = 0;
STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
if (pf->ih_fct != NULL &&
(pf->ccr_mask & (1 << (PCCARD_CCR_STATUS / 2)))) {
reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS);
if (reg & PCCARD_CCR_STATUS_INTR) {
ret2 = (*pf->ih_fct)(pf->ih_arg);
if (ret2 != 0 && ret == 0)
ret = ret2;
reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS);
pccard_ccr_write(pf, PCCARD_CCR_STATUS,
reg & ~PCCARD_CCR_STATUS_INTR);
}
}
}
return (ret);
}
#ifdef PCCARDDEBUG
int
pccard_card_intrdebug(arg)
void *arg;
{
struct pccard_softc *sc = arg;
struct pccard_function *pf;
int reg, ret, ret2;
ret = 0;
STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
printf("%s: intr flags=%x fct=%d cor=%02x csr=%02x pin=%02x",
sc->dev.dv_xname, pf->pf_flags, pf->number,
pccard_ccr_read(pf, PCCARD_CCR_OPTION),
pccard_ccr_read(pf, PCCARD_CCR_STATUS),
pccard_ccr_read(pf, PCCARD_CCR_PIN));
if (pf->ih_fct != NULL &&
(pf->ccr_mask & (1 << (PCCARD_CCR_STATUS / 2)))) {
reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS);
if (reg & PCCARD_CCR_STATUS_INTR) {
ret2 = (*pf->ih_fct)(pf->ih_arg);
if (ret2 != 0 && ret == 0)
ret = ret2;
reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS);
printf("; csr %02x->%02x",
reg, reg & ~PCCARD_CCR_STATUS_INTR);
pccard_ccr_write(pf, PCCARD_CCR_STATUS,
reg & ~PCCARD_CCR_STATUS_INTR);
}
}
printf("\n");
}
return (ret);
}
#endif
static int
pccard_add_children(device_t dev, int busno)
{
device_add_child(dev, NULL, -1, NULL);
return 0;
}
static int
pccard_probe(device_t dev)
{
device_set_desc(dev, "PC Card bus -- newconfig version");
return pccard_add_children(dev, device_get_unit(dev));
}
static device_method_t pccard_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, pccard_probe),
DEVMETHOD(device_attach, bus_generic_attach),
DEVMETHOD(device_shutdown, bus_generic_shutdown),
DEVMETHOD(device_suspend, bus_generic_suspend),
DEVMETHOD(device_resume, bus_generic_resume),
/* Bus interface */
#if 0
DEVMETHOD(bus_print_child, pccard_print_child),
#endif
DEVMETHOD(bus_driver_added, bus_generic_driver_added),
#if 0
DEVMETHOD(bus_alloc_resource, pccard_alloc_resource),
DEVMETHOD(bus_release_resource, pccard_release_resource),
#endif
DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
DEVMETHOD(bus_setup_intr, bus_generic_setup_intr),
DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
#if 0
DEVMETHOD(bus_set_resource, pccard_set_resource),
DEVMETHOD(bus_get_resource, pccard_get_resource),
DEVMETHOD(bus_delete_resource, pccard_delete_resource),
#endif
{ 0, 0 }
};
static driver_t pccard_driver = {
"pccard",
pccard_methods,
1, /* no softc */
};
devclass_t pccard_devclass;
DRIVER_MODULE(pccard, pcicx, pccard_driver, pccard_devclass, 0, 0);
DRIVER_MODULE(pccard, pc98pcic, pccard_driver, pccard_devclass, 0, 0);
DRIVER_MODULE(pccard, pccbb, pccard_driver, pccard_devclass, 0, 0);

1229
sys/dev/pccard/pccard_cis.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,208 @@
/* $NetBSD: pcmcia_cis_quirks.c,v 1.3 1998/12/29 09:00:28 marc Exp $ */
/* $FreeBSD$ */
#define PCCARDDEBUG
/*
* Copyright (c) 1998 Marc Horowitz. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Marc Horowitz.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/kernel.h>
#include <sys/queue.h>
#include <sys/types.h>
#include <sys/bus.h>
#include <machine/bus.h>
#include <sys/rman.h>
#include <machine/resource.h>
#include <dev/pccard/pccarddevs.h>
#include <dev/pccard/pccardreg.h>
#include <dev/pccard/pccardchip.h>
#include <dev/pccard/pccardvar.h>
/* There are cards out there whose CIS flat-out lies. This file
contains struct pccard_function chains for those devices. */
/* these structures are just static templates which are then copied
into "live" allocated structures */
struct pccard_function pccard_3cxem556_func0 = {
0, /* function number */
PCCARD_FUNCTION_NETWORK,
0x07, /* last cfe number */
0x800, /* ccr_base */
0x63, /* ccr_mask */
};
struct pccard_config_entry pccard_3cxem556_func0_cfe0 = {
0x07, /* cfe number */
PCCARD_CFE_IO8 | PCCARD_CFE_IO16 | PCCARD_CFE_IRQLEVEL,
PCCARD_IFTYPE_IO,
1, /* num_iospace */
4, /* iomask */
{ { 0x0010, 0 } }, /* iospace */
0xffff, /* irqmask */
0, /* num_memspace */
{ }, /* memspace */
0, /* maxtwins */
};
static struct pccard_function pccard_3cxem556_func1 = {
1, /* function number */
PCCARD_FUNCTION_SERIAL,
0x27, /* last cfe number */
0x900, /* ccr_base */
0x63, /* ccr_mask */
};
static struct pccard_config_entry pccard_3cxem556_func1_cfe0 = {
0x27, /* cfe number */
PCCARD_CFE_IO8 | PCCARD_CFE_IRQLEVEL,
PCCARD_IFTYPE_IO,
1, /* num_iospace */
3, /* iomask */
{ { 0x0008, 0 } }, /* iospace */
0xffff, /* irqmask */
0, /* num_memspace */
{ }, /* memspace */
0, /* maxtwins */
};
static struct pccard_function pccard_sveclancard_func0 = {
0, /* function number */
PCCARD_FUNCTION_NETWORK,
0x1, /* last cfe number */
0x100, /* ccr_base */
0x1, /* ccr_mask */
};
static struct pccard_config_entry pccard_sveclancard_func0_cfe0 = {
0x1, /* cfe number */
PCCARD_CFE_MWAIT_REQUIRED | PCCARD_CFE_RDYBSY_ACTIVE |
PCCARD_CFE_WP_ACTIVE | PCCARD_CFE_BVD_ACTIVE | PCCARD_CFE_IO16,
PCCARD_IFTYPE_IO,
1, /* num_iospace */
5, /* iomask */
{ { 0x20, 0x300 } }, /* iospace */
0xdeb8, /* irqmask */
0, /* num_memspace */
{ }, /* memspace */
0, /* maxtwins */
};
static struct pccard_cis_quirk pccard_cis_quirks[] = {
{ PCCARD_VENDOR_3COM, PCCARD_PRODUCT_3COM_3CXEM556, PCCARD_CIS_INVALID,
&pccard_3cxem556_func0, &pccard_3cxem556_func0_cfe0 },
{ PCCARD_VENDOR_3COM, PCCARD_PRODUCT_3COM_3CXEM556, PCCARD_CIS_INVALID,
&pccard_3cxem556_func1, &pccard_3cxem556_func1_cfe0 },
{ PCCARD_VENDOR_INVALID, PCCARD_PRODUCT_INVALID, PCCARD_CIS_SVEC_LANCARD,
&pccard_sveclancard_func0, &pccard_sveclancard_func0_cfe0 },
};
static int n_pccard_cis_quirks =
sizeof(pccard_cis_quirks)/sizeof(pccard_cis_quirks[0]);
void pccard_check_cis_quirks(device_t dev)
{
struct pccard_softc *sc = (struct pccard_softc *)
device_get_softc(dev);
int wiped = 0;
int i, j;
struct pccard_function *pf, *pf_next, *pf_last;
struct pccard_config_entry *cfe, *cfe_next;
pf = NULL;
pf_last = NULL;
for (i=0; i<n_pccard_cis_quirks; i++) {
if ((sc->card.manufacturer == pccard_cis_quirks[i].manufacturer) &&
(sc->card.product == pccard_cis_quirks[i].product) &&
(((sc->card.manufacturer != PCCARD_VENDOR_INVALID) &&
(sc->card.product != PCCARD_PRODUCT_INVALID)) ||
((sc->card.manufacturer == PCCARD_VENDOR_INVALID) &&
(sc->card.product == PCCARD_PRODUCT_INVALID) &&
sc->card.cis1_info[0] &&
(strcmp(sc->card.cis1_info[0],
pccard_cis_quirks[i].cis1_info[0]) == 0) &&
sc->card.cis1_info[1] &&
(strcmp(sc->card.cis1_info[1],
pccard_cis_quirks[i].cis1_info[1]) == 0)))) {
if (!wiped) {
if (pccard_verbose) {
device_printf(dev, "using CIS quirks for ");
for (j = 0; j < 4; j++) {
if (sc->card.cis1_info[j] == NULL)
break;
if (j)
printf(", ");
printf("%s", sc->card.cis1_info[j]);
}
printf("\n");
}
for (pf = STAILQ_FIRST(&sc->card.pf_head); pf != NULL;
pf = pf_next) {
for (cfe = STAILQ_FIRST(&pf->cfe_head); cfe != NULL;
cfe = cfe_next) {
cfe_next = STAILQ_NEXT(cfe, cfe_list);
free(cfe, M_DEVBUF);
}
pf_next = STAILQ_NEXT(pf, pf_list);
free(pf, M_DEVBUF);
}
STAILQ_INIT(&sc->card.pf_head);
wiped = 1;
}
if (pf_last == pccard_cis_quirks[i].pf) {
cfe = malloc(sizeof(*cfe), M_DEVBUF, M_NOWAIT);
*cfe = *pccard_cis_quirks[i].cfe;
STAILQ_INSERT_TAIL(&pf->cfe_head, cfe, cfe_list);
} else {
pf = malloc(sizeof(*pf), M_DEVBUF, M_NOWAIT);
*pf = *pccard_cis_quirks[i].pf;
STAILQ_INIT(&pf->cfe_head);
cfe = malloc(sizeof(*cfe), M_DEVBUF, M_NOWAIT);
*cfe = *pccard_cis_quirks[i].cfe;
STAILQ_INSERT_TAIL(&pf->cfe_head, cfe, cfe_list);
STAILQ_INSERT_TAIL(&sc->card.pf_head, pf, pf_list);
pf_last = pccard_cis_quirks[i].pf;
}
}
}
}

140
sys/dev/pccard/pccardchip.h Normal file
View File

@ -0,0 +1,140 @@
/* $NetBSD: pcmciachip.h,v 1.3 1998/11/17 08:49:12 thorpej Exp $ */
/* $FreeBSD$ */
/*
* Copyright (c) 1997 Marc Horowitz. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Marc Horowitz.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _PCCARD_PCCARDCHIP_H_
#define _PCCARD_PCCARDCHIP_H_
#include <machine/bus.h>
struct pccard_function;
struct pccard_mem_handle;
struct pccard_io_handle;
/* interfaces for pccard to call the chipset */
typedef struct pccard_chip_functions *pccard_chipset_tag_t;
typedef void *pccard_chipset_handle_t;
typedef int pccard_mem_handle_t;
#define PCCARD_MEM_ATTR 1
#define PCCARD_MEM_COMMON 2
#define PCCARD_WIDTH_AUTO 0
#define PCCARD_WIDTH_IO8 1
#define PCCARD_WIDTH_IO16 2
struct pccard_chip_functions {
/* memory space allocation */
int (*mem_alloc) __P((pccard_chipset_handle_t, bus_size_t,
struct pccard_mem_handle *));
void (*mem_free) __P((pccard_chipset_handle_t,
struct pccard_mem_handle *));
/* memory space window mapping */
int (*mem_map) __P((pccard_chipset_handle_t, int, bus_addr_t,
bus_size_t, struct pccard_mem_handle *,
bus_addr_t *, int *));
void (*mem_unmap) __P((pccard_chipset_handle_t, int));
/* I/O space allocation */
int (*io_alloc) __P((pccard_chipset_handle_t, bus_addr_t,
bus_size_t, bus_size_t, struct pccard_io_handle *));
void (*io_free) __P((pccard_chipset_handle_t,
struct pccard_io_handle *));
/* I/O space window mapping */
int (*io_map) __P((pccard_chipset_handle_t, int, bus_addr_t,
bus_size_t, struct pccard_io_handle *, int *));
void (*io_unmap) __P((pccard_chipset_handle_t, int));
/* interrupt glue */
void *(*intr_establish) __P((pccard_chipset_handle_t,
struct pccard_function *, int, int (*)(void *), void *));
void (*intr_disestablish) __P((pccard_chipset_handle_t, void *));
/* card enable/disable */
void (*socket_enable) __P((pccard_chipset_handle_t));
void (*socket_disable) __P((pccard_chipset_handle_t));
};
/* Memory space functions. */
#define pccard_chip_mem_alloc(tag, handle, size, pcmhp) \
((*(tag)->mem_alloc)((handle), (size), (pcmhp)))
#define pccard_chip_mem_free(tag, handle, pcmhp) \
((*(tag)->mem_free)((handle), (pcmhp)))
#define pccard_chip_mem_map(tag, handle, kind, card_addr, size, pcmhp, \
offsetp, windowp) \
((*(tag)->mem_map)((handle), (kind), (card_addr), (size), (pcmhp), \
(offsetp), (windowp)))
#define pccard_chip_mem_unmap(tag, handle, window) \
((*(tag)->mem_unmap)((handle), (window)))
/* I/O space functions. */
#define pccard_chip_io_alloc(tag, handle, start, size, align, pcihp) \
((*(tag)->io_alloc)((handle), (start), (size), (align), (pcihp)))
#define pccard_chip_io_free(tag, handle, pcihp) \
((*(tag)->io_free)((handle), (pcihp)))
#define pccard_chip_io_map(tag, handle, width, card_addr, size, pcihp, \
windowp) \
((*(tag)->io_map)((handle), (width), (card_addr), (size), (pcihp), \
(windowp)))
#define pccard_chip_io_unmap(tag, handle, window) \
((*(tag)->io_unmap)((handle), (window)))
/* Interrupt functions. */
#define pccard_chip_intr_establish(tag, handle, pf, ipl, fct, arg) \
((*(tag)->intr_establish)((handle), (pf), (ipl), (fct), (arg)))
#define pccard_chip_intr_disestablish(tag, handle, ih) \
((*(tag)->intr_disestablish)((handle), (ih)))
/* Socket functions. */
#define pccard_chip_socket_enable(tag, handle) \
((*(tag)->socket_enable)((handle)))
#define pccard_chip_socket_disable(tag, handle) \
((*(tag)->socket_disable)((handle)))
struct pccardbus_attach_args {
char *paa_busname;
pccard_chipset_tag_t pct;
pccard_chipset_handle_t pch;
bus_addr_t iobase; /* start i/o space allocation here */
bus_size_t iosize; /* size of the i/o space range */
};
#endif /* _PCCARD_PCCARDCHIP_H_ */

181
sys/dev/pccard/pccarddevs Normal file
View File

@ -0,0 +1,181 @@
$NetBSD: pcmciadevs,v 1.33 1999/02/19 21:49:43 abs Exp $
/* $FreeBSD$ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Christos Zoulas.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* List of known PCMCIA vendors
*/
vendor FUJITSU 0x0004 Fujitsu Corporation
vendor SANDISK 0x0045 Sandisk Corporation
vendor NEWMEDIA 0x0057 NewMedia Corporation
vendor INTEL 0x0089 Intel Corporation
vendor IBM 0x00a4 IBM Corporation
vendor MOTOROLA 0x0109 Motorola Corporation
vendor 3COM 0x0101 3Com Corporation
vendor MEGAHERTZ 0x0102 Megahertz Corporation
vendor SOCKET 0x0104 Socket Communications
vendor TDK 0x0105 TDK Corporation
vendor SMC 0x0108 Standard Microsystems Corporation
vendor USROBOTICS 0x0115 US Robotics Corporation
vendor MEGAHERTZ2 0x0128 Megahertz Corporation
vendor ADAPTEC 0x012f Adaptec Corporation
vendor COMPAQ1 0x0138 Compaq Corporation (1)
vendor LINKSYS 0x0149 Linksys Corporation
vendor SIMPLETECH 0x014d Simple Technology
vendor COMPAQ2 0x0183 Compaq Corporation (2)
vendor DAYNA 0x0194 Dayna Corporation
vendor IODATA 0x01bf I-O DATA
vendor COMPEX 0x8a01 Compex Corporation
vendor COREGA 0xc00f Corega K.K.
vendor HAGIWARASYSCOM 0xc012 Hagiwara SYS-COM
vendor RATOC 0xc015 RATOC System Inc.
/*
* List of known products. Grouped by vendor.
*/
/* Adaptec Products */
product ADAPTEC APA1460_1 0x0001 Adaptec APA-1460/A SCSI Host Adapter
product ADAPTEC APA1460_2 0x0002 Adaptec APA-1460/B SCSI Host Adapter
/* 3COM Products */
product 3COM 3C562 0x0562 3Com 3c562 33.6 Modem/10Mbps Ethernet
product 3COM 3C589 0x0589 3Com 3c589 10Mbps Ethernet
product 3COM 3C574 0x0574 3Com 3c574-TX 10/100Mbps Ethernet
product 3COM 3CXEM556 0x0035 3Com/Megahertz 3CXEM556 Ethernet/Modem
/* Compex Products */
product COMPEX LINKPORT_ENET_B 0x0100 Compex Linkport ENET-B Ethernet
/* Dayna Products */
product DAYNA COMMUNICARD_E_1 0x002d Dayna CommuniCard E
product DAYNA COMMUNICARD_E_2 0x002f Dayna CommuniCard E
/* DIGITAL Products */
product DIGITAL MOBILE_MEDIA_CDROM 0x0d00 Digital Mobile Media CD-ROM
/* Fujutsu Products */
product FUJITSU SCSI600 0x0401 Fujitsu SCSI 600 Interface
/* Motorola Products */
product MOTOROLA POWER144 0x0105 Motorola Power 14.4 Modem
product MOTOROLA PM100C 0x0302 Motorola Personal Messenger 100C CDPD Modem
/* IBM Products */
product IBM INFOMOVER 0x0002 National Semiconductor InfoMover
product IBM HOME_AND_AWAY 0x002e IBM Home and Away Modem
product IBM WIRELESS_LAN_ENTRY 0x0032 Wireless LAN Entry
product IBM PORTABLE_CDROM_DRIVE 0x002d PCMCIA Portable CD-ROM Drive
/* I-O DATA */
product IODATA PCLAT 0x2216 I-O DATA PCLA/T
/* Linksys corporation */
product LINKSYS ECARD_1 0x0265 Linksys EthernetCard or D-Link DE-650
product LINKSYS COMBO_ECARD 0xc1ab Linksys Combo EthernetCard
product LINKSYS TRUST_COMBO_ECARD 0x021b Trust (Linksys) Combo EthernetCard
/* Megahertz Products */
product MEGAHERTZ XJ4288 0x0023 Megahertz XJ4288 Modem
product MEGAHERTZ XJ5560 0x0034 Megahertz X-JACK 56kbps Modem
product MEGAHERTZ2 XJACK 0x0103 Megahertz X-JACK Ethernet
product MEGAHERTZ XJEM3336 0x0006 Megahertz X-JACK Ethernet Modem
/* US Robotics Products */
product USROBOTICS WORLDPORT144 0x3330 US Robotics WorldPort 14.4 Modem
/* Sandisk Products */
product SANDISK SDCFB 0x0401 Sandisk CompactFlash Card
/* Simple Technology Products */
product SIMPLETECH COMMUNICATOR288 0x0100 Simple Technology 28.8 Communicator
/* Socket Communications Products */
product SOCKET PAGECARD 0x0003 Socket Communications PageCard
product SOCKET DUAL_RS232 0x0006 Socket Communications Dual RS232
/* TDK Products */
product TDK LAK_CD021BX 0x0200 TDK LAK-CD021BX Ethernet
product TDK DFL9610 0x0d0a TDK DFL9610 Ethernet & Digital Cellular
/* TDK Vendor ID also used by Xircom! */
product TDK XIR_CE_10 0x0108 Xircom CreditCard Ethernet
product TDK XIR_CEM_10 0x110a Xircom CreditCard Ethernet + Modem
product TDK XIR_CEM_28 0x110b Xircom CreditCard Ethernet + Modem 28.8
product TDK XIR_PS_CE2_10 0x010b Xircom CreditCard CE2 Ethernet
product TDK XIR_CE3_100 0x010a Xircom CreditCard Ethernet 10/100
product TDK XIR_CNW 0x0802 Xircom CreditCard Netwave
/* NewMedia Products */
product NEWMEDIA BASICS 0x0019 NewMedia BASICS Ethernet
/* Standard Microsystems Corporation Products */
product SMC 8016 0x0105 SMC 8016 EtherCard
/* RATOC System Inc. Products */
product RATOC REX_R280 0x1 RATOC REX-R280
/* Cards we know only by their cis */
vendor PREMAX -1 Premax
vendor PLANET -1 Planet
vendor DLINK -1 D-Link
vendor RPTI -1 RPTI
vendor ACCTON -1 ACCTON
vendor YEDATA -1 Y-E DATA
vendor DIGITAL -1 Digital Equipment Corporation
vendor TEAC -1 TEAC
vendor SVEC -1 SVEC/Hawking Technology
vendor NAKAGAWAMETAL -1 NAKAGAWA METAL
product MEGAHERTZ XJ2288 { "MEGAHERTZ", "MODEM&spXJ2288", NULL, NULL } Megahertz XJ2288 Modem
product PREMAX PE200 { "PMX&sp&sp&sp", "PE-200", NULL, NULL } PreMax PE-200
product PLANET SMARTCOM2000 { "PCMCIA", "UE2212", NULL, NULL } Planet SmartCOM 2000
product DLINK DE650 { "D-Link", "DE-650", NULL, NULL } D-Link DE-650
product DLINK DE660 { "D-Link", "DE-660", NULL, NULL } D-Link DE-660
product RPTI EP401 { "RPTI", "EP401&spEthernet&spNE2000&spCompatible", NULL, NULL } RPTI EP401
product ACCTON EN2212 { "ACCTON", "EN2212", NULL, NULL } Accton EN2212
product YEDATA EXTERNAL_FDD { "Y-E&spDATA", "External&spFDD", NULL, NULL } Y-E DATA External FDD
product DIGITAL DEPCMXX { "DIGITAL", "DEPCM-XX", NULL, NULL } DEC DEPCM-BA
product TEAC IDECARDII { NULL, "NinjaATA-", NULL, NULL } TEAC IDE Card/II
product LINKSYS ECARD_2 { "LINKSYS", "E-CARD", NULL, NULL } Linksys E-Card
product COREGA PCC_2 { "corega&spK.K.", "corega&spEther&spPCC-T", NULL, NULL } Corega
product SVEC COMBOCARD { "Ethernet", "Adapter", NULL, NULL } SVEC/Hawking Tech. Combo Card
product SVEC LANCARD { "SVEC", "FD605&spPCMCIA&spEtherNet&spCard", "V1-1", NULL } SVEC PCMCIA Lan Card
product NAKAGAWAMETAL LNT10TN { "PCMCIA", "LNT-10TN", NULL, NULL } NAKAGAWA METAL LNT-10TN NE2000 Compatible Card

300
sys/dev/pccard/pccarddevs.h Normal file
View File

@ -0,0 +1,300 @@
/* $FreeBSD$ */
/*
* THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.
*
* generated from:
* NetBSD: pcmciadevs,v 1.33 1999/02/19 21:49:43 abs Exp
*/
/* $FreeBSD$ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Christos Zoulas.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* List of known PCMCIA vendors
*/
#define PCCARD_VENDOR_FUJITSU 0x0004 /* Fujitsu Corporation */
#define PCCARD_VENDOR_SANDISK 0x0045 /* Sandisk Corporation */
#define PCCARD_VENDOR_NEWMEDIA 0x0057 /* NewMedia Corporation */
#define PCCARD_VENDOR_INTEL 0x0089 /* Intel Corporation */
#define PCCARD_VENDOR_IBM 0x00a4 /* IBM Corporation */
#define PCCARD_VENDOR_MOTOROLA 0x0109 /* Motorola Corporation */
#define PCCARD_VENDOR_3COM 0x0101 /* 3Com Corporation */
#define PCCARD_VENDOR_MEGAHERTZ 0x0102 /* Megahertz Corporation */
#define PCCARD_VENDOR_SOCKET 0x0104 /* Socket Communications */
#define PCCARD_VENDOR_TDK 0x0105 /* TDK Corporation */
#define PCCARD_VENDOR_SMC 0x0108 /* Standard Microsystems Corporation */
#define PCCARD_VENDOR_USROBOTICS 0x0115 /* US Robotics Corporation */
#define PCCARD_VENDOR_MEGAHERTZ2 0x0128 /* Megahertz Corporation */
#define PCCARD_VENDOR_ADAPTEC 0x012f /* Adaptec Corporation */
#define PCCARD_VENDOR_COMPAQ1 0x0138 /* Compaq Corporation (1) */
#define PCCARD_VENDOR_LINKSYS 0x0149 /* Linksys Corporation */
#define PCCARD_VENDOR_SIMPLETECH 0x014d /* Simple Technology */
#define PCCARD_VENDOR_COMPAQ2 0x0183 /* Compaq Corporation (2) */
#define PCCARD_VENDOR_DAYNA 0x0194 /* Dayna Corporation */
#define PCCARD_VENDOR_IODATA 0x01bf /* I-O DATA */
#define PCCARD_VENDOR_COMPEX 0x8a01 /* Compex Corporation */
#define PCCARD_VENDOR_COREGA 0xc00f /* Corega K.K. */
#define PCCARD_VENDOR_HAGIWARASYSCOM 0xc012 /* Hagiwara SYS-COM */
#define PCCARD_VENDOR_RATOC 0xc015 /* RATOC System Inc. */
/*
* List of known products. Grouped by vendor.
*/
/* Adaptec Products */
#define PCCARD_CIS_ADAPTEC_APA1460_1 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_ADAPTEC_APA1460_1 0x0001
#define PCCARD_STR_ADAPTEC_APA1460_1 "Adaptec APA-1460/A SCSI Host Adapter"
#define PCCARD_CIS_ADAPTEC_APA1460_2 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_ADAPTEC_APA1460_2 0x0002
#define PCCARD_STR_ADAPTEC_APA1460_2 "Adaptec APA-1460/B SCSI Host Adapter"
/* 3COM Products */
#define PCCARD_CIS_3COM_3C562 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_3COM_3C562 0x0562
#define PCCARD_STR_3COM_3C562 "3Com 3c562 33.6 Modem/10Mbps Ethernet"
#define PCCARD_CIS_3COM_3C589 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_3COM_3C589 0x0589
#define PCCARD_STR_3COM_3C589 "3Com 3c589 10Mbps Ethernet"
#define PCCARD_CIS_3COM_3C574 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_3COM_3C574 0x0574
#define PCCARD_STR_3COM_3C574 "3Com 3c574-TX 10/100Mbps Ethernet"
#define PCCARD_CIS_3COM_3CXEM556 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_3COM_3CXEM556 0x0035
#define PCCARD_STR_3COM_3CXEM556 "3Com/Megahertz 3CXEM556 Ethernet/Modem"
/* Compex Products */
#define PCCARD_CIS_COMPEX_LINKPORT_ENET_B { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_COMPEX_LINKPORT_ENET_B 0x0100
#define PCCARD_STR_COMPEX_LINKPORT_ENET_B "Compex Linkport ENET-B Ethernet"
/* Dayna Products */
#define PCCARD_CIS_DAYNA_COMMUNICARD_E_1 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_DAYNA_COMMUNICARD_E_1 0x002d
#define PCCARD_STR_DAYNA_COMMUNICARD_E_1 "Dayna CommuniCard E"
#define PCCARD_CIS_DAYNA_COMMUNICARD_E_2 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_DAYNA_COMMUNICARD_E_2 0x002f
#define PCCARD_STR_DAYNA_COMMUNICARD_E_2 "Dayna CommuniCard E"
/* DIGITAL Products */
#define PCCARD_CIS_DIGITAL_MOBILE_MEDIA_CDROM { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_DIGITAL_MOBILE_MEDIA_CDROM 0x0d00
#define PCCARD_STR_DIGITAL_MOBILE_MEDIA_CDROM "Digital Mobile Media CD-ROM"
/* Fujutsu Products */
#define PCCARD_CIS_FUJITSU_SCSI600 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_FUJITSU_SCSI600 0x0401
#define PCCARD_STR_FUJITSU_SCSI600 "Fujitsu SCSI 600 Interface"
/* Motorola Products */
#define PCCARD_CIS_MOTOROLA_POWER144 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_MOTOROLA_POWER144 0x0105
#define PCCARD_STR_MOTOROLA_POWER144 "Motorola Power 14.4 Modem"
#define PCCARD_CIS_MOTOROLA_PM100C { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_MOTOROLA_PM100C 0x0302
#define PCCARD_STR_MOTOROLA_PM100C "Motorola Personal Messenger 100C CDPD Modem"
/* IBM Products */
#define PCCARD_CIS_IBM_INFOMOVER { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_IBM_INFOMOVER 0x0002
#define PCCARD_STR_IBM_INFOMOVER "National Semiconductor InfoMover"
#define PCCARD_CIS_IBM_HOME_AND_AWAY { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_IBM_HOME_AND_AWAY 0x002e
#define PCCARD_STR_IBM_HOME_AND_AWAY "IBM Home and Away Modem"
#define PCCARD_CIS_IBM_WIRELESS_LAN_ENTRY { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_IBM_WIRELESS_LAN_ENTRY 0x0032
#define PCCARD_STR_IBM_WIRELESS_LAN_ENTRY "Wireless LAN Entry"
#define PCCARD_CIS_IBM_PORTABLE_CDROM_DRIVE { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_IBM_PORTABLE_CDROM_DRIVE 0x002d
#define PCCARD_STR_IBM_PORTABLE_CDROM_DRIVE "PCMCIA Portable CD-ROM Drive"
/* I-O DATA */
#define PCCARD_CIS_IODATA_PCLAT { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_IODATA_PCLAT 0x2216
#define PCCARD_STR_IODATA_PCLAT "I-O DATA PCLA/T"
/* Linksys corporation */
#define PCCARD_CIS_LINKSYS_ECARD_1 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_LINKSYS_ECARD_1 0x0265
#define PCCARD_STR_LINKSYS_ECARD_1 "Linksys EthernetCard or D-Link DE-650"
#define PCCARD_CIS_LINKSYS_COMBO_ECARD { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_LINKSYS_COMBO_ECARD 0xc1ab
#define PCCARD_STR_LINKSYS_COMBO_ECARD "Linksys Combo EthernetCard"
#define PCCARD_CIS_LINKSYS_TRUST_COMBO_ECARD { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_LINKSYS_TRUST_COMBO_ECARD 0x021b
#define PCCARD_STR_LINKSYS_TRUST_COMBO_ECARD "Trust (Linksys) Combo EthernetCard"
/* Megahertz Products */
#define PCCARD_CIS_MEGAHERTZ_XJ4288 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_MEGAHERTZ_XJ4288 0x0023
#define PCCARD_STR_MEGAHERTZ_XJ4288 "Megahertz XJ4288 Modem"
#define PCCARD_CIS_MEGAHERTZ_XJ5560 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_MEGAHERTZ_XJ5560 0x0034
#define PCCARD_STR_MEGAHERTZ_XJ5560 "Megahertz X-JACK 56kbps Modem"
#define PCCARD_CIS_MEGAHERTZ2_XJACK { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_MEGAHERTZ2_XJACK 0x0103
#define PCCARD_STR_MEGAHERTZ2_XJACK "Megahertz X-JACK Ethernet"
#define PCCARD_CIS_MEGAHERTZ_XJEM3336 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_MEGAHERTZ_XJEM3336 0x0006
#define PCCARD_STR_MEGAHERTZ_XJEM3336 "Megahertz X-JACK Ethernet Modem"
/* US Robotics Products */
#define PCCARD_CIS_USROBOTICS_WORLDPORT144 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_USROBOTICS_WORLDPORT144 0x3330
#define PCCARD_STR_USROBOTICS_WORLDPORT144 "US Robotics WorldPort 14.4 Modem"
/* Sandisk Products */
#define PCCARD_CIS_SANDISK_SDCFB { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_SANDISK_SDCFB 0x0401
#define PCCARD_STR_SANDISK_SDCFB "Sandisk CompactFlash Card"
/* Simple Technology Products */
#define PCCARD_CIS_SIMPLETECH_COMMUNICATOR288 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_SIMPLETECH_COMMUNICATOR288 0x0100
#define PCCARD_STR_SIMPLETECH_COMMUNICATOR288 "Simple Technology 28.8 Communicator"
/* Socket Communications Products */
#define PCCARD_CIS_SOCKET_PAGECARD { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_SOCKET_PAGECARD 0x0003
#define PCCARD_STR_SOCKET_PAGECARD "Socket Communications PageCard"
#define PCCARD_CIS_SOCKET_DUAL_RS232 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_SOCKET_DUAL_RS232 0x0006
#define PCCARD_STR_SOCKET_DUAL_RS232 "Socket Communications Dual RS232"
/* TDK Products */
#define PCCARD_CIS_TDK_LAK_CD021BX { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_TDK_LAK_CD021BX 0x0200
#define PCCARD_STR_TDK_LAK_CD021BX "TDK LAK-CD021BX Ethernet"
#define PCCARD_CIS_TDK_DFL9610 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_TDK_DFL9610 0x0d0a
#define PCCARD_STR_TDK_DFL9610 "TDK DFL9610 Ethernet & Digital Cellular"
/* TDK Vendor ID also used by Xircom! */
#define PCCARD_CIS_TDK_XIR_CE_10 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_TDK_XIR_CE_10 0x0108
#define PCCARD_STR_TDK_XIR_CE_10 "Xircom CreditCard Ethernet"
#define PCCARD_CIS_TDK_XIR_CEM_10 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_TDK_XIR_CEM_10 0x110a
#define PCCARD_STR_TDK_XIR_CEM_10 "Xircom CreditCard Ethernet + Modem"
#define PCCARD_CIS_TDK_XIR_CEM_28 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_TDK_XIR_CEM_28 0x110b
#define PCCARD_STR_TDK_XIR_CEM_28 "Xircom CreditCard Ethernet + Modem 28.8"
#define PCCARD_CIS_TDK_XIR_PS_CE2_10 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_TDK_XIR_PS_CE2_10 0x010b
#define PCCARD_STR_TDK_XIR_PS_CE2_10 "Xircom CreditCard CE2 Ethernet"
#define PCCARD_CIS_TDK_XIR_CE3_100 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_TDK_XIR_CE3_100 0x010a
#define PCCARD_STR_TDK_XIR_CE3_100 "Xircom CreditCard Ethernet 10/100"
#define PCCARD_CIS_TDK_XIR_CNW { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_TDK_XIR_CNW 0x0802
#define PCCARD_STR_TDK_XIR_CNW "Xircom CreditCard Netwave"
/* NewMedia Products */
#define PCCARD_CIS_NEWMEDIA_BASICS { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_NEWMEDIA_BASICS 0x0019
#define PCCARD_STR_NEWMEDIA_BASICS "NewMedia BASICS Ethernet"
/* Standard Microsystems Corporation Products */
#define PCCARD_CIS_SMC_8016 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_SMC_8016 0x0105
#define PCCARD_STR_SMC_8016 "SMC 8016 EtherCard"
/* RATOC System Inc. Products */
#define PCCARD_CIS_RATOC_REX_R280 { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_RATOC_REX_R280 0x1
#define PCCARD_STR_RATOC_REX_R280 "RATOC REX-R280"
/* Cards we know only by their cis */
#define PCCARD_VENDOR_PREMAX -1 /* Premax */
#define PCCARD_VENDOR_PLANET -1 /* Planet */
#define PCCARD_VENDOR_DLINK -1 /* D-Link */
#define PCCARD_VENDOR_RPTI -1 /* RPTI */
#define PCCARD_VENDOR_ACCTON -1 /* ACCTON */
#define PCCARD_VENDOR_YEDATA -1 /* Y-E DATA */
#define PCCARD_VENDOR_DIGITAL -1 /* Digital Equipment Corporation */
#define PCCARD_VENDOR_TEAC -1 /* TEAC */
#define PCCARD_VENDOR_SVEC -1 /* SVEC/Hawking Technology */
#define PCCARD_VENDOR_NAKAGAWAMETAL -1 /* NAKAGAWA METAL */
#define PCCARD_CIS_MEGAHERTZ_XJ2288 { "MEGAHERTZ", "MODEM XJ2288", NULL, NULL }
#define PCCARD_PRODUCT_MEGAHERTZ_XJ2288 -1
#define PCCARD_STR_MEGAHERTZ_XJ2288 "Megahertz XJ2288 Modem"
#define PCCARD_CIS_PREMAX_PE200 { "PMX ", "PE-200", NULL, NULL }
#define PCCARD_PRODUCT_PREMAX_PE200 -1
#define PCCARD_STR_PREMAX_PE200 "PreMax PE-200"
#define PCCARD_CIS_PLANET_SMARTCOM2000 { "PCMCIA", "UE2212", NULL, NULL }
#define PCCARD_PRODUCT_PLANET_SMARTCOM2000 -1
#define PCCARD_STR_PLANET_SMARTCOM2000 "Planet SmartCOM 2000"
#define PCCARD_CIS_DLINK_DE650 { "D-Link", "DE-650", NULL, NULL }
#define PCCARD_PRODUCT_DLINK_DE650 -1
#define PCCARD_STR_DLINK_DE650 "D-Link DE-650"
#define PCCARD_CIS_DLINK_DE660 { "D-Link", "DE-660", NULL, NULL }
#define PCCARD_PRODUCT_DLINK_DE660 -1
#define PCCARD_STR_DLINK_DE660 "D-Link DE-660"
#define PCCARD_CIS_RPTI_EP401 { "RPTI", "EP401 Ethernet NE2000 Compatible", NULL, NULL }
#define PCCARD_PRODUCT_RPTI_EP401 -1
#define PCCARD_STR_RPTI_EP401 "RPTI EP401"
#define PCCARD_CIS_ACCTON_EN2212 { "ACCTON", "EN2212", NULL, NULL }
#define PCCARD_PRODUCT_ACCTON_EN2212 -1
#define PCCARD_STR_ACCTON_EN2212 "Accton EN2212"
#define PCCARD_CIS_YEDATA_EXTERNAL_FDD { "Y-E DATA", "External FDD", NULL, NULL }
#define PCCARD_PRODUCT_YEDATA_EXTERNAL_FDD -1
#define PCCARD_STR_YEDATA_EXTERNAL_FDD "Y-E DATA External FDD"
#define PCCARD_CIS_DIGITAL_DEPCMXX { "DIGITAL", "DEPCM-XX", NULL, NULL }
#define PCCARD_PRODUCT_DIGITAL_DEPCMXX -1
#define PCCARD_STR_DIGITAL_DEPCMXX "DEC DEPCM-BA"
#define PCCARD_CIS_TEAC_IDECARDII { NULL, "NinjaATA-", NULL, NULL }
#define PCCARD_PRODUCT_TEAC_IDECARDII -1
#define PCCARD_STR_TEAC_IDECARDII "TEAC IDE Card/II"
#define PCCARD_CIS_LINKSYS_ECARD_2 { "LINKSYS", "E-CARD", NULL, NULL }
#define PCCARD_PRODUCT_LINKSYS_ECARD_2 -1
#define PCCARD_STR_LINKSYS_ECARD_2 "Linksys E-Card"
#define PCCARD_CIS_COREGA_PCC_2 { "corega K.K.", "corega Ether PCC-T", NULL, NULL }
#define PCCARD_PRODUCT_COREGA_PCC_2 -1
#define PCCARD_STR_COREGA_PCC_2 "Corega"
#define PCCARD_CIS_SVEC_COMBOCARD { "Ethernet", "Adapter", NULL, NULL }
#define PCCARD_PRODUCT_SVEC_COMBOCARD -1
#define PCCARD_STR_SVEC_COMBOCARD "SVEC/Hawking Tech. Combo Card"
#define PCCARD_CIS_SVEC_LANCARD { "SVEC", "FD605 PCMCIA EtherNet Card", "V1-1", NULL }
#define PCCARD_PRODUCT_SVEC_LANCARD -1
#define PCCARD_STR_SVEC_LANCARD "SVEC PCMCIA Lan Card"
#define PCCARD_CIS_NAKAGAWAMETAL_LNT10TN { "PCMCIA", "LNT-10TN", NULL, NULL }
#define PCCARD_PRODUCT_NAKAGAWAMETAL_LNT10TN -1
#define PCCARD_STR_NAKAGAWAMETAL_LNT10TN "NAKAGAWA METAL LNT-10TN NE2000 Compatible Card"

View File

@ -0,0 +1,679 @@
/* $FreeBSD$ */
/*
* THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.
*
* generated from:
* NetBSD: pcmciadevs,v 1.33 1999/02/19 21:49:43 abs Exp
*/
/* $FreeBSD$ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Christos Zoulas.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
struct pccard_knowndev pccard_knowndevs[] = {
{
PCCARD_VENDOR_ADAPTEC, PCCARD_PRODUCT_ADAPTEC_APA1460_1,
PCCARD_CIS_ADAPTEC_APA1460_1,
0,
"Adaptec Corporation",
"Adaptec APA-1460/A SCSI Host Adapter" },
},
{
PCCARD_VENDOR_ADAPTEC, PCCARD_PRODUCT_ADAPTEC_APA1460_2,
PCCARD_CIS_ADAPTEC_APA1460_2,
0,
"Adaptec Corporation",
"Adaptec APA-1460/B SCSI Host Adapter" },
},
{
PCCARD_VENDOR_3COM, PCCARD_PRODUCT_3COM_3C562,
PCCARD_CIS_3COM_3C562,
0,
"3Com Corporation",
"3Com 3c562 33.6 Modem/10Mbps Ethernet" },
},
{
PCCARD_VENDOR_3COM, PCCARD_PRODUCT_3COM_3C589,
PCCARD_CIS_3COM_3C589,
0,
"3Com Corporation",
"3Com 3c589 10Mbps Ethernet" },
},
{
PCCARD_VENDOR_3COM, PCCARD_PRODUCT_3COM_3C574,
PCCARD_CIS_3COM_3C574,
0,
"3Com Corporation",
"3Com 3c574-TX 10/100Mbps Ethernet" },
},
{
PCCARD_VENDOR_3COM, PCCARD_PRODUCT_3COM_3CXEM556,
PCCARD_CIS_3COM_3CXEM556,
0,
"3Com Corporation",
"3Com/Megahertz 3CXEM556 Ethernet/Modem" },
},
{
PCCARD_VENDOR_COMPEX, PCCARD_PRODUCT_COMPEX_LINKPORT_ENET_B,
PCCARD_CIS_COMPEX_LINKPORT_ENET_B,
0,
"Compex Corporation",
"Compex Linkport ENET-B Ethernet" },
},
{
PCCARD_VENDOR_DAYNA, PCCARD_PRODUCT_DAYNA_COMMUNICARD_E_1,
PCCARD_CIS_DAYNA_COMMUNICARD_E_1,
0,
"Dayna Corporation",
"Dayna CommuniCard E" },
},
{
PCCARD_VENDOR_DAYNA, PCCARD_PRODUCT_DAYNA_COMMUNICARD_E_2,
PCCARD_CIS_DAYNA_COMMUNICARD_E_2,
0,
"Dayna Corporation",
"Dayna CommuniCard E" },
},
{
PCCARD_VENDOR_DIGITAL, PCCARD_PRODUCT_DIGITAL_MOBILE_MEDIA_CDROM,
PCCARD_CIS_DIGITAL_MOBILE_MEDIA_CDROM,
0,
"Digital Equipment Corporation",
"Digital Mobile Media CD-ROM" },
},
{
PCCARD_VENDOR_FUJITSU, PCCARD_PRODUCT_FUJITSU_SCSI600,
PCCARD_CIS_FUJITSU_SCSI600,
0,
"Fujitsu Corporation",
"Fujitsu SCSI 600 Interface" },
},
{
PCCARD_VENDOR_MOTOROLA, PCCARD_PRODUCT_MOTOROLA_POWER144,
PCCARD_CIS_MOTOROLA_POWER144,
0,
"Motorola Corporation",
"Motorola Power 14.4 Modem" },
},
{
PCCARD_VENDOR_MOTOROLA, PCCARD_PRODUCT_MOTOROLA_PM100C,
PCCARD_CIS_MOTOROLA_PM100C,
0,
"Motorola Corporation",
"Motorola Personal Messenger 100C CDPD Modem" },
},
{
PCCARD_VENDOR_IBM, PCCARD_PRODUCT_IBM_INFOMOVER,
PCCARD_CIS_IBM_INFOMOVER,
0,
"IBM Corporation",
"National Semiconductor InfoMover" },
},
{
PCCARD_VENDOR_IBM, PCCARD_PRODUCT_IBM_HOME_AND_AWAY,
PCCARD_CIS_IBM_HOME_AND_AWAY,
0,
"IBM Corporation",
"IBM Home and Away Modem" },
},
{
PCCARD_VENDOR_IBM, PCCARD_PRODUCT_IBM_WIRELESS_LAN_ENTRY,
PCCARD_CIS_IBM_WIRELESS_LAN_ENTRY,
0,
"IBM Corporation",
"Wireless LAN Entry" },
},
{
PCCARD_VENDOR_IBM, PCCARD_PRODUCT_IBM_PORTABLE_CDROM_DRIVE,
PCCARD_CIS_IBM_PORTABLE_CDROM_DRIVE,
0,
"IBM Corporation",
"PCMCIA Portable CD-ROM Drive" },
},
{
PCCARD_VENDOR_IODATA, PCCARD_PRODUCT_IODATA_PCLAT,
PCCARD_CIS_IODATA_PCLAT,
0,
"I-O DATA",
"I-O DATA PCLA/T" },
},
{
PCCARD_VENDOR_LINKSYS, PCCARD_PRODUCT_LINKSYS_ECARD_1,
PCCARD_CIS_LINKSYS_ECARD_1,
0,
"Linksys Corporation",
"Linksys EthernetCard or D-Link DE-650" },
},
{
PCCARD_VENDOR_LINKSYS, PCCARD_PRODUCT_LINKSYS_COMBO_ECARD,
PCCARD_CIS_LINKSYS_COMBO_ECARD,
0,
"Linksys Corporation",
"Linksys Combo EthernetCard" },
},
{
PCCARD_VENDOR_LINKSYS, PCCARD_PRODUCT_LINKSYS_TRUST_COMBO_ECARD,
PCCARD_CIS_LINKSYS_TRUST_COMBO_ECARD,
0,
"Linksys Corporation",
"Trust (Linksys) Combo EthernetCard" },
},
{
PCCARD_VENDOR_MEGAHERTZ, PCCARD_PRODUCT_MEGAHERTZ_XJ4288,
PCCARD_CIS_MEGAHERTZ_XJ4288,
0,
"Megahertz Corporation",
"Megahertz XJ4288 Modem" },
},
{
PCCARD_VENDOR_MEGAHERTZ, PCCARD_PRODUCT_MEGAHERTZ_XJ5560,
PCCARD_CIS_MEGAHERTZ_XJ5560,
0,
"Megahertz Corporation",
"Megahertz X-JACK 56kbps Modem" },
},
{
PCCARD_VENDOR_MEGAHERTZ2, PCCARD_PRODUCT_MEGAHERTZ2_XJACK,
PCCARD_CIS_MEGAHERTZ2_XJACK,
0,
"Megahertz Corporation",
"Megahertz X-JACK Ethernet" },
},
{
PCCARD_VENDOR_MEGAHERTZ, PCCARD_PRODUCT_MEGAHERTZ_XJEM3336,
PCCARD_CIS_MEGAHERTZ_XJEM3336,
0,
"Megahertz Corporation",
"Megahertz X-JACK Ethernet Modem" },
},
{
PCCARD_VENDOR_USROBOTICS, PCCARD_PRODUCT_USROBOTICS_WORLDPORT144,
PCCARD_CIS_USROBOTICS_WORLDPORT144,
0,
"US Robotics Corporation",
"US Robotics WorldPort 14.4 Modem" },
},
{
PCCARD_VENDOR_SANDISK, PCCARD_PRODUCT_SANDISK_SDCFB,
PCCARD_CIS_SANDISK_SDCFB,
0,
"Sandisk Corporation",
"Sandisk CompactFlash Card" },
},
{
PCCARD_VENDOR_SIMPLETECH, PCCARD_PRODUCT_SIMPLETECH_COMMUNICATOR288,
PCCARD_CIS_SIMPLETECH_COMMUNICATOR288,
0,
"Simple Technology",
"Simple Technology 28.8 Communicator" },
},
{
PCCARD_VENDOR_SOCKET, PCCARD_PRODUCT_SOCKET_PAGECARD,
PCCARD_CIS_SOCKET_PAGECARD,
0,
"Socket Communications",
"Socket Communications PageCard" },
},
{
PCCARD_VENDOR_SOCKET, PCCARD_PRODUCT_SOCKET_DUAL_RS232,
PCCARD_CIS_SOCKET_DUAL_RS232,
0,
"Socket Communications",
"Socket Communications Dual RS232" },
},
{
PCCARD_VENDOR_TDK, PCCARD_PRODUCT_TDK_LAK_CD021BX,
PCCARD_CIS_TDK_LAK_CD021BX,
0,
"TDK Corporation",
"TDK LAK-CD021BX Ethernet" },
},
{
PCCARD_VENDOR_TDK, PCCARD_PRODUCT_TDK_DFL9610,
PCCARD_CIS_TDK_DFL9610,
0,
"TDK Corporation",
"TDK DFL9610 Ethernet & Digital Cellular" },
},
{
PCCARD_VENDOR_TDK, PCCARD_PRODUCT_TDK_XIR_CE_10,
PCCARD_CIS_TDK_XIR_CE_10,
0,
"TDK Corporation",
"Xircom CreditCard Ethernet" },
},
{
PCCARD_VENDOR_TDK, PCCARD_PRODUCT_TDK_XIR_CEM_10,
PCCARD_CIS_TDK_XIR_CEM_10,
0,
"TDK Corporation",
"Xircom CreditCard Ethernet + Modem" },
},
{
PCCARD_VENDOR_TDK, PCCARD_PRODUCT_TDK_XIR_CEM_28,
PCCARD_CIS_TDK_XIR_CEM_28,
0,
"TDK Corporation",
"Xircom CreditCard Ethernet + Modem 28.8" },
},
{
PCCARD_VENDOR_TDK, PCCARD_PRODUCT_TDK_XIR_PS_CE2_10,
PCCARD_CIS_TDK_XIR_PS_CE2_10,
0,
"TDK Corporation",
"Xircom CreditCard CE2 Ethernet" },
},
{
PCCARD_VENDOR_TDK, PCCARD_PRODUCT_TDK_XIR_CE3_100,
PCCARD_CIS_TDK_XIR_CE3_100,
0,
"TDK Corporation",
"Xircom CreditCard Ethernet 10/100" },
},
{
PCCARD_VENDOR_TDK, PCCARD_PRODUCT_TDK_XIR_CNW,
PCCARD_CIS_TDK_XIR_CNW,
0,
"TDK Corporation",
"Xircom CreditCard Netwave" },
},
{
PCCARD_VENDOR_NEWMEDIA, PCCARD_PRODUCT_NEWMEDIA_BASICS,
PCCARD_CIS_NEWMEDIA_BASICS,
0,
"NewMedia Corporation",
"NewMedia BASICS Ethernet" },
},
{
PCCARD_VENDOR_SMC, PCCARD_PRODUCT_SMC_8016,
PCCARD_CIS_SMC_8016,
0,
"Standard Microsystems Corporation",
"SMC 8016 EtherCard" },
},
{
PCCARD_VENDOR_RATOC, PCCARD_PRODUCT_RATOC_REX_R280,
PCCARD_CIS_RATOC_REX_R280,
0,
"RATOC System Inc.",
"RATOC REX-R280" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_MEGAHERTZ_XJ2288,
PCCARD_CIS_MEGAHERTZ_XJ2288,
0,
"Megahertz Corporation",
"Megahertz XJ2288 Modem" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_PREMAX_PE200,
PCCARD_CIS_PREMAX_PE200,
0,
"Premax",
"PreMax PE-200" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_PLANET_SMARTCOM2000,
PCCARD_CIS_PLANET_SMARTCOM2000,
0,
"Planet",
"Planet SmartCOM 2000" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_DLINK_DE650,
PCCARD_CIS_DLINK_DE650,
0,
"D-Link",
"D-Link DE-650" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_DLINK_DE660,
PCCARD_CIS_DLINK_DE660,
0,
"D-Link",
"D-Link DE-660" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_RPTI_EP401,
PCCARD_CIS_RPTI_EP401,
0,
"RPTI",
"RPTI EP401" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_ACCTON_EN2212,
PCCARD_CIS_ACCTON_EN2212,
0,
"ACCTON",
"Accton EN2212" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_YEDATA_EXTERNAL_FDD,
PCCARD_CIS_YEDATA_EXTERNAL_FDD,
0,
"Y-E DATA",
"Y-E DATA External FDD" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_DIGITAL_DEPCMXX,
PCCARD_CIS_DIGITAL_DEPCMXX,
0,
"Digital Equipment Corporation",
"DEC DEPCM-BA" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_TEAC_IDECARDII,
PCCARD_CIS_TEAC_IDECARDII,
0,
"TEAC",
"TEAC IDE Card/II" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_LINKSYS_ECARD_2,
PCCARD_CIS_LINKSYS_ECARD_2,
0,
"Linksys Corporation",
"Linksys E-Card" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_COREGA_PCC_2,
PCCARD_CIS_COREGA_PCC_2,
0,
"Corega K.K.",
"Corega" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_SVEC_COMBOCARD,
PCCARD_CIS_SVEC_COMBOCARD,
0,
"SVEC/Hawking Technology",
"SVEC/Hawking Tech. Combo Card" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_SVEC_LANCARD,
PCCARD_CIS_SVEC_LANCARD,
0,
"SVEC/Hawking Technology",
"SVEC PCMCIA Lan Card" },
},
{
PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_NAKAGAWAMETAL_LNT10TN,
PCCARD_CIS_NAKAGAWAMETAL_LNT10TN,
0,
"NAKAGAWA METAL",
"NAKAGAWA METAL LNT-10TN NE2000 Compatible Card" },
},
{
PCCARD_VENDOR_FUJITSU, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Fujitsu Corporation",
NULL,
},
{
PCCARD_VENDOR_SANDISK, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Sandisk Corporation",
NULL,
},
{
PCCARD_VENDOR_NEWMEDIA, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"NewMedia Corporation",
NULL,
},
{
PCCARD_VENDOR_INTEL, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Intel Corporation",
NULL,
},
{
PCCARD_VENDOR_IBM, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"IBM Corporation",
NULL,
},
{
PCCARD_VENDOR_MOTOROLA, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Motorola Corporation",
NULL,
},
{
PCCARD_VENDOR_3COM, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"3Com Corporation",
NULL,
},
{
PCCARD_VENDOR_MEGAHERTZ, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Megahertz Corporation",
NULL,
},
{
PCCARD_VENDOR_SOCKET, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Socket Communications",
NULL,
},
{
PCCARD_VENDOR_TDK, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"TDK Corporation",
NULL,
},
{
PCCARD_VENDOR_SMC, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Standard Microsystems Corporation",
NULL,
},
{
PCCARD_VENDOR_USROBOTICS, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"US Robotics Corporation",
NULL,
},
{
PCCARD_VENDOR_MEGAHERTZ2, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Megahertz Corporation",
NULL,
},
{
PCCARD_VENDOR_ADAPTEC, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Adaptec Corporation",
NULL,
},
{
PCCARD_VENDOR_COMPAQ1, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Compaq Corporation (1)",
NULL,
},
{
PCCARD_VENDOR_LINKSYS, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Linksys Corporation",
NULL,
},
{
PCCARD_VENDOR_SIMPLETECH, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Simple Technology",
NULL,
},
{
PCCARD_VENDOR_COMPAQ2, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Compaq Corporation (2)",
NULL,
},
{
PCCARD_VENDOR_DAYNA, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Dayna Corporation",
NULL,
},
{
PCCARD_VENDOR_IODATA, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"I-O DATA",
NULL,
},
{
PCCARD_VENDOR_COMPEX, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Compex Corporation",
NULL,
},
{
PCCARD_VENDOR_COREGA, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Corega K.K.",
NULL,
},
{
PCCARD_VENDOR_HAGIWARASYSCOM, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Hagiwara SYS-COM",
NULL,
},
{
PCCARD_VENDOR_RATOC, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"RATOC System Inc.",
NULL,
},
{
PCCARD_VENDOR_PREMAX, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Premax",
NULL,
},
{
PCCARD_VENDOR_PLANET, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Planet",
NULL,
},
{
PCCARD_VENDOR_DLINK, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"D-Link",
NULL,
},
{
PCCARD_VENDOR_RPTI, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"RPTI",
NULL,
},
{
PCCARD_VENDOR_ACCTON, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"ACCTON",
NULL,
},
{
PCCARD_VENDOR_YEDATA, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Y-E DATA",
NULL,
},
{
PCCARD_VENDOR_DIGITAL, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"Digital Equipment Corporation",
NULL,
},
{
PCCARD_VENDOR_TEAC, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"TEAC",
NULL,
},
{
PCCARD_VENDOR_SVEC, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"SVEC/Hawking Technology",
NULL,
},
{
PCCARD_VENDOR_NAKAGAWAMETAL, 0,
PCCARD_KNOWNDEV_NOPROD,
PCCARD_CIS_INVALID,
"NAKAGAWA METAL",
NULL,
},
{ 0, 0, { NULL, NULL, NULL, NULL }, 0, NULL, NULL, }
};

249
sys/dev/pccard/pccardreg.h Normal file
View File

@ -0,0 +1,249 @@
/* $NetBSD: pcmciareg.h,v 1.7 1998/10/29 09:45:52 enami Exp $ */
/* $FreeBSD$ */
/*
* Copyright (c) 1997 Marc Horowitz. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Marc Horowitz.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/* most of this is from the PCCARD PC Card Standard, Release 2.1 */
/* Note: the weird indenting here is to make the constants more
readable. Please don't normalize it. --marc */
/*
* CIS Tuples */
/* Layer 1 Basic Compatibility Tuples */
#define PCCARD_CISTPL_NULL 0x00
#define PCCARD_CISTPL_DEVICE 0x01
#define PCCARD_DTYPE_MASK 0xF0
#define PCCARD_DTYPE_NULL 0x00
#define PCCARD_DTYPE_ROM 0x10
#define PCCARD_DTYPE_OTPROM 0x20
#define PCCARD_DTYPE_EPROM 0x30
#define PCCARD_DTYPE_EEPROM 0x40
#define PCCARD_DTYPE_FLASH 0x50
#define PCCARD_DTYPE_SRAM 0x60
#define PCCARD_DTYPE_DRAM 0x70
#define PCCARD_DTYPE_FUNCSPEC 0xD0
#define PCCARD_DTYPE_EXTEND 0xE0
#define PCCARD_DSPEED_MASK 0x07
#define PCCARD_DSPEED_NULL 0x00
#define PCCARD_DSPEED_250NS 0x01
#define PCCARD_DSPEED_200NS 0x02
#define PCCARD_DSPEED_150NS 0x03
#define PCCARD_DSPEED_100NS 0x04
#define PCCARD_DSPEED_EXT 0x07
/*
* the 2.1 docs have 0x02-0x07 as reserved, but the linux drivers list the
* follwing tuple code values. I have at least one card (3com 3c562
* lan+modem) which has a code 0x06 tuple, so I'm going to assume that these
* are for real
*/
#define PCCARD_CISTPL_LONGLINK_CB 0x02
#define PCCARD_CISTPL_INDIRECT 0x03
#define PCCARD_CISTPL_CONFIG_CB 0x04
#define PCCARD_CISTPL_CFTABLE_ENTRY_CB 0x05
#define PCCARD_CISTPL_LONGLINK_MFC 0x06
#define PCCARD_MFC_MEM_ATTR 0x00
#define PCCARD_MFC_MEM_COMMON 0x01
#define PCCARD_CISTPL_BAR 0x07
#define PCCARD_CISTPL_PWR_MGMNT 0x08
#define PCCARD_CISTPL_CHECKSUM 0x10
#define PCCARD_CISTPL_LONGLINK_A 0x11
#define PCCARD_CISTPL_LONGLINK_C 0x12
#define PCCARD_CISTPL_LINKTARGET 0x13
#define PCCARD_CISTPL_NO_LINK 0x14
#define PCCARD_CISTPL_VERS_1 0x15
#define PCCARD_CISTPL_ALTSTR 0x16
#define PCCARD_CISTPL_DEVICE_A 0x17
#define PCCARD_CISTPL_JEDEC_C 0x18
#define PCCARD_CISTPL_JEDEC_A 0x19
#define PCCARD_CISTPL_CONFIG 0x1A
#define PCCARD_TPCC_RASZ_MASK 0x03
#define PCCARD_TPCC_RASZ_SHIFT 0
#define PCCARD_TPCC_RMSZ_MASK 0x3C
#define PCCARD_TPCC_RMSZ_SHIFT 2
#define PCCARD_TPCC_RFSZ_MASK 0xC0
#define PCCARD_TPCC_RFSZ_SHIFT 6
#define PCCARD_CISTPL_CFTABLE_ENTRY 0x1B
#define PCCARD_TPCE_INDX_INTFACE 0x80
#define PCCARD_TPCE_INDX_DEFAULT 0x40
#define PCCARD_TPCE_INDX_NUM_MASK 0x3F
#define PCCARD_TPCE_IF_MWAIT 0x80
#define PCCARD_TPCE_IF_RDYBSY 0x40
#define PCCARD_TPCE_IF_WP 0x20
#define PCCARD_TPCE_IF_BVD 0x10
#define PCCARD_TPCE_IF_IFTYPE 0x0F
#define PCCARD_IFTYPE_MEMORY 0
#define PCCARD_IFTYPE_IO 1
#define PCCARD_TPCE_FS_MISC 0x80
#define PCCARD_TPCE_FS_MEMSPACE_MASK 0x60
#define PCCARD_TPCE_FS_MEMSPACE_NONE 0x00
#define PCCARD_TPCE_FS_MEMSPACE_LENGTH 0x20
#define PCCARD_TPCE_FS_MEMSPACE_LENGTHADDR 0x40
#define PCCARD_TPCE_FS_MEMSPACE_TABLE 0x60
#define PCCARD_TPCE_FS_IRQ 0x10
#define PCCARD_TPCE_FS_IOSPACE 0x08
#define PCCARD_TPCE_FS_TIMING 0x04
#define PCCARD_TPCE_FS_POWER_MASK 0x03
#define PCCARD_TPCE_FS_POWER_NONE 0x00
#define PCCARD_TPCE_FS_POWER_VCC 0x01
#define PCCARD_TPCE_FS_POWER_VCCVPP1 0x02
#define PCCARD_TPCE_FS_POWER_VCCVPP1VPP2 0x03
#define PCCARD_TPCE_TD_RESERVED_MASK 0xE0
#define PCCARD_TPCE_TD_RDYBSY_MASK 0x1C
#define PCCARD_TPCE_TD_WAIT_MASK 0x03
#define PCCARD_TPCE_IO_HASRANGE 0x80
#define PCCARD_TPCE_IO_BUSWIDTH_16BIT 0x40
#define PCCARD_TPCE_IO_BUSWIDTH_8BIT 0x20
#define PCCARD_TPCE_IO_IOADDRLINES_MASK 0x1F
#define PCCARD_TPCE_IO_RANGE_LENGTHSIZE_MASK 0xC0
#define PCCARD_TPCE_IO_RANGE_LENGTHSIZE_NONE 0x00
#define PCCARD_TPCE_IO_RANGE_LENGTHSIZE_ONE 0x40
#define PCCARD_TPCE_IO_RANGE_LENGTHSIZE_TWO 0x80
#define PCCARD_TPCE_IO_RANGE_LENGTHSIZE_FOUR 0xC0
#define PCCARD_TPCE_IO_RANGE_ADDRSIZE_MASK 0x30
#define PCCARD_TPCE_IO_RANGE_ADDRSIZE_NONE 0x00
#define PCCARD_TPCE_IO_RANGE_ADDRSIZE_ONE 0x10
#define PCCARD_TPCE_IO_RANGE_ADDRSIZE_TWO 0x20
#define PCCARD_TPCE_IO_RANGE_ADDRSIZE_FOUR 0x30
#define PCCARD_TPCE_IO_RANGE_COUNT 0x0F
#define PCCARD_TPCE_IR_SHARE 0x80
#define PCCARD_TPCE_IR_PULSE 0x40
#define PCCARD_TPCE_IR_LEVEL 0x20
#define PCCARD_TPCE_IR_HASMASK 0x10
#define PCCARD_TPCE_IR_IRQ 0x0F
#define PCCARD_TPCE_MS_HOSTADDR 0x80
#define PCCARD_TPCE_MS_CARDADDR_SIZE_MASK 0x60
#define PCCARD_TPCE_MS_CARDADDR_SIZE_SHIFT 5
#define PCCARD_TPCE_MS_LENGTH_SIZE_MASK 0x18
#define PCCARD_TPCE_MS_LENGTH_SIZE_SHIFT 3
#define PCCARD_TPCE_MS_COUNT 0x07
#define PCCARD_TPCE_MI_EXT 0x80
#define PCCARD_TPCE_MI_RESERVED 0x40
#define PCCARD_TPCE_MI_PWRDOWN 0x20
#define PCCARD_TPCE_MI_READONLY 0x10
#define PCCARD_TPCE_MI_AUDIO 0x08
#define PCCARD_TPCE_MI_MAXTWINS 0x07
#define PCCARD_CISTPL_DEVICE_OC 0x1C
#define PCCARD_CISTPL_DEVICE_OA 0x1D
#define PCCARD_CISTPL_DEVICE_GEO 0x1E
#define PCCARD_CISTPL_DEVICE_GEO_A 0x1F
#define PCCARD_CISTPL_MANFID 0x20
#define PCCARD_CISTPL_FUNCID 0x21
#define PCCARD_FUNCTION_UNSPEC -1
#define PCCARD_FUNCTION_MULTIFUNCTION 0
#define PCCARD_FUNCTION_MEMORY 1
#define PCCARD_FUNCTION_SERIAL 2
#define PCCARD_FUNCTION_PARALLEL 3
#define PCCARD_FUNCTION_DISK 4
#define PCCARD_FUNCTION_VIDEO 5
#define PCCARD_FUNCTION_NETWORK 6
#define PCCARD_FUNCTION_AIMS 7
#define PCCARD_FUNCTION_SCSI 8
#define PCCARD_FUNCTION_SECURITY 9
#define PCCARD_FUNCTION_INSTRUMENT 10
#define PCCARD_CISTPL_FUNCE 0x22
#define PCCARD_TPLFE_TYPE_LAN_TECH 0x01
#define PCCARD_TPLFE_TYPE_LAN_SPEED 0x02
#define PCCARD_TPLFE_TYPE_LAN_MEDIA 0x03
#define PCCARD_TPLFE_TYPE_LAN_NID 0x04
#define PCCARD_TPLFE_TYPE_LAN_CONN 0x05
#define PCCARD_TPLFE_TYPE_DISK_DEVICE_INTERFACE 0x01
#define PCCARD_TPLFE_DDI_PCCARD_ATA 0x01
#define PCCARD_CISTPL_END 0xFF
/* Layer 2 Data Recording Format Tuples */
#define PCCARD_CISTPL_SWIL 0x23
/* #define PCCARD_CISTPL_RESERVED 0x24-0x3F */
#define PCCARD_CISTPL_VERS_2 0x40
#define PCCARD_CISTPL_FORMAT 0x41
#define PCCARD_CISTPL_GEOMETRY 0x42
#define PCCARD_CISTPL_BYTEORDER 0x43
#define PCCARD_CISTPL_DATE 0x44
#define PCCARD_CISTPL_BATTERY 0x45
#define PCCARD_CISTPL_FORAMT_A 0x47
/* Layer 3 Data Organization Tuples */
#define PCCARD_CISTPL_ORG 0x46
/* #define PCCARD_CISTPL_RESERVED 0x47-0x7F */
/* Layer 4 System-Specific Standard Tuples */
/* #define PCCARD_CISTPL_RESERVED 0x80-0x8F */
#define PCCARD_CISTPL_SPCL 0x90
/* #define PCCARD_CISTPL_RESERVED 0x90-0xFE */
/*
* Card Configuration Registers
*/
#define PCCARD_CCR_OPTION 0x00
#define PCCARD_CCR_OPTION_SRESET 0x80
#define PCCARD_CCR_OPTION_LEVIREQ 0x40
#define PCCARD_CCR_OPTION_CFINDEX 0x3F
#define PCCARD_CCR_OPTION_IREQ_ENABLE 0x04
#define PCCARD_CCR_OPTION_ADDR_DECODE 0x02
#define PCCARD_CCR_OPTION_FUNC_ENABLE 0x01
#define PCCARD_CCR_STATUS 0x02
#define PCCARD_CCR_STATUS_PINCHANGED 0x80
#define PCCARD_CCR_STATUS_SIGCHG 0x40
#define PCCARD_CCR_STATUS_IOIS8 0x20
#define PCCARD_CCR_STATUS_RESERVED1 0x10
#define PCCARD_CCR_STATUS_AUDIO 0x08
#define PCCARD_CCR_STATUS_PWRDWN 0x04
#define PCCARD_CCR_STATUS_INTR 0x02
#define PCCARD_CCR_STATUS_INTRACK 0x01
#define PCCARD_CCR_PIN 0x04
#define PCCARD_CCR_PIN_CBVD1 0x80
#define PCCARD_CCR_PIN_CBVD2 0x40
#define PCCARD_CCR_PIN_CRDYBSY 0x20
#define PCCARD_CCR_PIN_CWPROT 0x10
#define PCCARD_CCR_PIN_RBVD1 0x08
#define PCCARD_CCR_PIN_RBVD2 0x04
#define PCCARD_CCR_PIN_RRDYBSY 0x02
#define PCCARD_CCR_PIN_RWPROT 0x01
#define PCCARD_CCR_SOCKETCOPY 0x06
#define PCCARD_CCR_SOCKETCOPY_RESERVED 0x80
#define PCCARD_CCR_SOCKETCOPY_COPY_MASK 0x70
#define PCCARD_CCR_SOCKETCOPY_COPY_SHIFT 4
#define PCCARD_CCR_SOCKETCOPY_SOCKET_MASK 0x0F
#define PCCARD_CCR_EXTSTATUS 0x08
#define PCCARD_CCR_IOBASE0 0x0A
#define PCCARD_CCR_IOBASE1 0x0C
#define PCCARD_CCR_IOBASE2 0x0E
#define PCCARD_CCR_IOBASE3 0x10
#define PCCARD_CCR_IOSIZE 0x12
#define PCCARD_CCR_SIZE 0x14

290
sys/dev/pccard/pccardvar.h Normal file
View File

@ -0,0 +1,290 @@
/* $NetBSD: pcmciavar.h,v 1.9 1998/12/29 09:00:28 marc Exp $ */
/* $FreeBSD$ */
/*
* Copyright (c) 1997 Marc Horowitz. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Marc Horowitz.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/types.h>
#include <sys/queue.h>
#include <machine/bus.h>
#include <dev/pccard/pccardchip.h>
extern int pccard_verbose;
/*
* Contains information about mapped/allocated i/o spaces.
*/
struct pccard_io_handle {
bus_space_tag_t iot; /* bus space tag (from chipset) */
bus_space_handle_t ioh; /* mapped space handle */
bus_addr_t addr; /* resulting address in bus space */
bus_size_t size; /* size of i/o space */
int flags; /* misc. information */
};
#define PCCARD_IO_ALLOCATED 0x01 /* i/o space was allocated */
/*
* Contains information about allocated memory space.
*/
struct pccard_mem_handle {
bus_space_tag_t memt; /* bus space tag (from chipset) */
bus_space_handle_t memh; /* mapped space handle */
bus_addr_t addr; /* resulting address in bus space */
bus_size_t size; /* size of mem space */
pccard_mem_handle_t mhandle; /* opaque memory handle */
bus_size_t realsize; /* how much we really allocated */
};
/* pccard itself */
#define PCCARD_CFE_MWAIT_REQUIRED 0x0001
#define PCCARD_CFE_RDYBSY_ACTIVE 0x0002
#define PCCARD_CFE_WP_ACTIVE 0x0004
#define PCCARD_CFE_BVD_ACTIVE 0x0008
#define PCCARD_CFE_IO8 0x0010
#define PCCARD_CFE_IO16 0x0020
#define PCCARD_CFE_IRQSHARE 0x0040
#define PCCARD_CFE_IRQPULSE 0x0080
#define PCCARD_CFE_IRQLEVEL 0x0100
#define PCCARD_CFE_POWERDOWN 0x0200
#define PCCARD_CFE_READONLY 0x0400
#define PCCARD_CFE_AUDIO 0x0800
struct pccard_config_entry {
int number;
u_int32_t flags;
int iftype;
int num_iospace;
/*
* The card will only decode this mask in any case, so we can
* do dynamic allocation with this in mind, in case the suggestions
* below are no good.
*/
u_long iomask;
struct {
u_long length;
u_long start;
} iospace[4]; /* XXX this could be as high as 16 */
u_int16_t irqmask;
int num_memspace;
struct {
u_long length;
u_long cardaddr;
u_long hostaddr;
} memspace[2]; /* XXX this could be as high as 8 */
int maxtwins;
STAILQ_ENTRY(pccard_config_entry) cfe_list;
};
struct pccard_function {
/* read off the card */
int number;
int function;
int last_config_index;
u_long ccr_base;
u_long ccr_mask;
STAILQ_HEAD(, pccard_config_entry) cfe_head;
STAILQ_ENTRY(pccard_function) pf_list;
/* run-time state */
struct pccard_softc *sc;
struct device *child;
struct pccard_config_entry *cfe;
struct pccard_mem_handle pf_pcmh;
#define pf_ccrt pf_pcmh.memt
#define pf_ccrh pf_pcmh.memh
#define pf_ccr_mhandle pf_pcmh.mhandle
#define pf_ccr_realsize pf_pcmh.realsize
bus_addr_t pf_ccr_offset;
int pf_ccr_window;
long pf_mfc_iobase;
long pf_mfc_iomax;
int (*ih_fct) __P((void *));
void *ih_arg;
int ih_ipl;
int pf_flags;
};
/* pf_flags */
#define PFF_ENABLED 0x0001 /* function is enabled */
struct pccard_card {
int cis1_major;
int cis1_minor;
/* XXX waste of space? */
char cis1_info_buf[256];
char *cis1_info[4];
/*
* Use int32_t for manufacturer and product so that they can
* hold the id value found in card CIS and special value that
* indicates no id was found.
*/
int32_t manufacturer;
#define PCCARD_VENDOR_INVALID -1
int32_t product;
#define PCCARD_PRODUCT_INVALID -1
u_int16_t error;
#define PCCARD_CIS_INVALID { NULL, NULL, NULL, NULL }
STAILQ_HEAD(, pccard_function) pf_head;
};
struct pccardbus_if {
int (*if_card_attach) __P((struct device*));
void (*if_card_detach) __P((struct device*, int));
void (*if_card_deactivate) __P((struct device*));
int (*if_card_gettype) __P((struct device*));
};
struct pccard_softc {
/* this stuff is for the socket */
pccard_chipset_tag_t pct;
pccard_chipset_handle_t pch;
/* this stuff is for the card */
struct pccard_card card;
void *ih;
int sc_enabled_count; /* how many functions are
enabled */
/*
* These are passed down from the PCCARD chip, and exist only
* so that cards with Very Special address allocation needs
* know what range they should be dealing with.
*/
bus_addr_t iobase; /* start i/o space allocation here */
bus_size_t iosize; /* size of the i/o space range */
/* pccardbus (upper) interface functions */
struct pccardbus_if sc_if;
};
void
pccardbus_if_setup __P((struct pccard_softc*));
struct pccard_cis_quirk {
int32_t manufacturer;
int32_t product;
char *cis1_info[4];
struct pccard_function *pf;
struct pccard_config_entry *cfe;
};
struct pccard_attach_args {
int32_t manufacturer;
int32_t product;
struct pccard_card *card;
struct pccard_function *pf;
};
struct pccard_tuple {
unsigned int code;
unsigned int length;
u_long mult;
bus_addr_t ptr;
bus_space_tag_t memt;
bus_space_handle_t memh;
};
void pccard_read_cis __P((struct pccard_softc *));
void pccard_check_cis_quirks(device_t);
void pccard_print_cis(device_t);
int pccard_scan_cis __P((struct device * dev,
int (*) (struct pccard_tuple *, void *), void *));
#define pccard_cis_read_1(tuple, idx0) \
(bus_space_read_1((tuple)->memt, (tuple)->memh, (tuple)->mult*(idx0)))
#define pccard_tuple_read_1(tuple, idx1) \
(pccard_cis_read_1((tuple), ((tuple)->ptr+(2+(idx1)))))
#define pccard_tuple_read_2(tuple, idx2) \
(pccard_tuple_read_1((tuple), (idx2)) | \
(pccard_tuple_read_1((tuple), (idx2)+1)<<8))
#define pccard_tuple_read_3(tuple, idx3) \
(pccard_tuple_read_1((tuple), (idx3)) | \
(pccard_tuple_read_1((tuple), (idx3)+1)<<8) | \
(pccard_tuple_read_1((tuple), (idx3)+2)<<16))
#define pccard_tuple_read_4(tuple, idx4) \
(pccard_tuple_read_1((tuple), (idx4)) | \
(pccard_tuple_read_1((tuple), (idx4)+1)<<8) | \
(pccard_tuple_read_1((tuple), (idx4)+2)<<16) | \
(pccard_tuple_read_1((tuple), (idx4)+3)<<24))
#define pccard_tuple_read_n(tuple, n, idxn) \
(((n)==1)?pccard_tuple_read_1((tuple), (idxn)) : \
(((n)==2)?pccard_tuple_read_2((tuple), (idxn)) : \
(((n)==3)?pccard_tuple_read_3((tuple), (idxn)) : \
/* n == 4 */ pccard_tuple_read_4((tuple), (idxn)))))
#define PCCARD_SPACE_MEMORY 1
#define PCCARD_SPACE_IO 2
int pccard_ccr_read __P((struct pccard_function *, int));
void pccard_ccr_write __P((struct pccard_function *, int, int));
#define pccard_mfc(sc) (STAILQ_FIRST(&(sc)->card.pf_head) && \
STAILQ_NEXT(STAILQ_FIRST(&(sc)->card.pf_head),pf_list))
void pccard_function_init __P((struct pccard_function *,
struct pccard_config_entry *));
int pccard_function_enable __P((struct pccard_function *));
void pccard_function_disable __P((struct pccard_function *));
#define pccard_io_alloc(pf, start, size, align, pciop) \
(pccard_chip_io_alloc((pf)->sc->pct, pf->sc->pch, (start), \
(size), (align), (pciop)))
#define pccard_io_free(pf, pciohp) \
(pccard_chip_io_free((pf)->sc->pct, (pf)->sc->pch, (pciohp)))
int pccard_io_map __P((struct pccard_function *, int, bus_addr_t,
bus_size_t, struct pccard_io_handle *, int *));
void pccard_io_unmap __P((struct pccard_function *, int));
#define pccard_mem_alloc(pf, size, pcmhp) \
(pccard_chip_mem_alloc((pf)->sc->pct, (pf)->sc->pch, (size), (pcmhp)))
#define pccard_mem_free(pf, pcmhp) \
(pccard_chip_mem_free((pf)->sc->pct, (pf)->sc->pch, (pcmhp)))
#define pccard_mem_map(pf, kind, card_addr, size, pcmhp, offsetp, windowp) \
(pccard_chip_mem_map((pf)->sc->pct, (pf)->sc->pch, (kind), \
(card_addr), (size), (pcmhp), (offsetp), (windowp)))
#define pccard_mem_unmap(pf, window) \
(pccard_chip_mem_unmap((pf)->sc->pct, (pf)->sc->pch, (window)))
void *pccard_intr_establish __P((struct pccard_function *, int,
int (*) (void *), void *));
void pccard_intr_disestablish __P((struct pccard_function *, void *));

226
sys/tools/pccarddevs2h.awk Normal file
View File

@ -0,0 +1,226 @@
#! /usr/bin/awk -f
# $NetBSD: devlist2h.awk,v 1.3 1998/09/05 14:42:06 christos Exp $
# $FreeBSD$
#
# Copyright (c) 1998 The NetBSD Foundation, Inc.
# All rights reserved.
#
# This code is derived from software contributed to The NetBSD Foundation
# by Christos Zoulas.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
# must display the following acknowledgement:
# This product includes software developed by the NetBSD
# Foundation, Inc. and its contributors.
# 4. Neither the name of The NetBSD Foundation nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# Copyright (c) 1995, 1996 Christopher G. Demetriou
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
# must display the following acknowledgement:
# This product includes software developed by Christopher G. Demetriou.
# This product includes software developed by Christos Zoulas
# 4. The name of the author(s) may not be used to endorse or promote products
# derived from this software without specific prior written permission
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
function collectline(f, line) {
oparen = 0
line = ""
while (f <= NF) {
if ($f == "#") {
line = line "("
oparen = 1
f++
continue
}
if (oparen) {
line = line $f
if (f < NF)
line = line " "
f++
continue
}
line = line $f
if (f < NF)
line = line " "
f++
}
if (oparen)
line = line ")"
return line
}
BEGIN {
nproducts = nvendors = 0
dfile="pccarddevs_data.h"
hfile="pccarddevs.h"
}
NR == 1 {
VERSION = $0
gsub("\\$", "", VERSION)
printf("/*\t\$FreeBSD\$\t*/\n\n") > dfile
printf("/*\n") > dfile
printf(" * THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.\n") \
> dfile
printf(" *\n") > dfile
printf(" * generated from:\n") > dfile
printf(" *\t%s\n", VERSION) > dfile
printf(" */\n") > dfile
printf("/*\t\$FreeBSD\$\t*/\n\n") > hfile
printf("/*\n") > hfile
printf(" * THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.\n") \
> hfile
printf(" *\n") > hfile
printf(" * generated from:\n") > hfile
printf(" *\t%s\n", VERSION) > hfile
printf(" */\n") > hfile
next
}
$1 == "vendor" {
nvendors++
vendorindex[$2] = nvendors; # record index for this name, for later.
vendors[nvendors, 1] = $2; # name
vendors[nvendors, 2] = $3; # id
printf("#define\tPCCARD_VENDOR_%s\t%s\t", vendors[nvendors, 1],
vendors[nvendors, 2]) > hfile
vendors[nvendors, 3] = collectline(4, line)
printf("/* %s */\n", vendors[nvendors, 3]) > hfile
next
}
$1 == "product" {
nproducts++
products[nproducts, 1] = $2; # vendor name
products[nproducts, 2] = $3; # product id
products[nproducts, 3] = $4; # id
f = 5;
if ($4 == "{") {
products[nproducts, 3] = -1
z = "{ "
for (i = 0; i < 4; i++) {
if (f <= NF) {
gsub("&sp", " ", $f)
gsub("&tab", "\t", $f)
gsub("&nl", "\n", $f)
z = z $f " "
f++
}
else {
if (i == 3)
z = z "NULL "
else
z = z "NULL, "
}
}
products[nproducts, 4] = z $f
f++
}
else {
products[nproducts, 4] = "{ NULL, NULL, NULL, NULL }"
}
printf("#define\tPCCARD_CIS_%s_%s\t%s\n",
products[nproducts, 1], products[nproducts, 2],
products[nproducts, 4]) > hfile
printf("#define\tPCCARD_PRODUCT_%s_%s\t%s\n", products[nproducts, 1],
products[nproducts, 2], products[nproducts, 3]) > hfile
products[nproducts, 5] = collectline(f, line)
printf("#define\tPCCARD_STR_%s_%s\t\"%s\"\n",
products[nproducts, 1], products[nproducts, 2],
products[nproducts, 5]) > hfile
next
}
{
if ($0 == "")
blanklines++
print $0 > hfile
if (blanklines < 2)
print $0 > dfile
}
END {
# print out the match tables
printf("\n") > dfile
printf("struct pccard_knowndev pccard_knowndevs[] = {\n") > dfile
for (i = 1; i <= nproducts; i++) {
printf("\t{\n") > dfile
if (products[i, 3] == -1) {
printf("\t PCCARD_VENDOR_UNKNOWN, PCCARD_PRODUCT_%s_%s,\n",
products[i, 1], products[i, 2]) > dfile
} else {
printf("\t PCCARD_VENDOR_%s, PCCARD_PRODUCT_%s_%s,\n",
products[i, 1], products[i, 1], products[i, 2]) > dfile
}
printf("\t PCCARD_CIS_%s_%s,\n",
products[i, 1], products[i, 2]) > dfile
printf("\t ") > dfile
printf("0") > dfile
printf(",\n") > dfile
vendi = vendorindex[products[i, 1]];
printf("\t \"%s\",\n", vendors[vendi, 3]) > dfile
printf("\t \"%s\"\t},\n", products[i, 5]) > dfile
printf("\t},\n") > dfile
}
for (i = 1; i <= nvendors; i++) {
printf("\t{\n") > dfile
printf("\t PCCARD_VENDOR_%s, 0,\n", vendors[i, 1]) > dfile
printf("\t PCCARD_KNOWNDEV_NOPROD,\n") > dfile
printf("\t PCCARD_CIS_INVALID,\n") > dfile
printf("\t \"%s\",\n", vendors[i, 3]) > dfile
printf("\t NULL,\n") > dfile
printf("\t},\n") > dfile
}
printf("\t{ 0, 0, { NULL, NULL, NULL, NULL }, 0, NULL, NULL, }\n") > dfile
printf("};\n") > dfile
}