Add a cis decoding function which decodes some CISTPL_FUNCE tuples for

disk and network functions.
This commit is contained in:
haya 2000-10-17 10:13:46 +00:00
parent 7cc4fa0618
commit 8130f0ec5d
2 changed files with 80 additions and 2 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: pcmcia_cis.c,v 1.19 2000/07/14 08:02:12 jun Exp $ */
/* $NetBSD: pcmcia_cis.c,v 1.20 2000/10/17 10:13:46 haya Exp $ */
#define PCMCIACISDEBUG
@ -60,6 +60,8 @@ struct cis_state {
};
int pcmcia_parse_cis_tuple __P((struct pcmcia_tuple *, void *));
static int decode_funce __P((struct pcmcia_tuple *, struct pcmcia_function *));
void
pcmcia_read_cis(sc)
@ -529,6 +531,13 @@ pcmcia_print_cis(sc)
break;
case PCMCIA_FUNCTION_DISK:
printf("fixed disk");
switch (pf->pf_funce_disk_interface) {
case PCMCIA_TPLFE_DDI_PCCARD_ATA:
printf("(ata)");
break;
default:
break;
}
break;
case PCMCIA_FUNCTION_VIDEO:
printf("video adapter");
@ -828,6 +837,16 @@ pcmcia_parse_cis_tuple(tuple, arg)
DPRINTF(("CISTPL_FUNCID\n"));
break;
case PCMCIA_CISTPL_FUNCE:
if (state->pf == NULL || state->pf->function <= 0) {
DPRINTF(("CISTPL_FUNCE is not followed by "
"valid CISTPL_FUNCID\n"));
break;
}
if (tuple->length >= 2) {
decode_funce(tuple, state->pf);
}
break;
case PCMCIA_CISTPL_CONFIG:
if (tuple->length < 3) {
DPRINTF(("CISTPL_CONFIG too short %d\n",
@ -1283,3 +1302,41 @@ pcmcia_parse_cis_tuple(tuple, arg)
return (0);
}
static int
decode_funce(tuple, pf)
struct pcmcia_tuple *tuple;
struct pcmcia_function *pf;
{
int type = pcmcia_tuple_read_1(tuple, 0);
switch (pf->function) {
case PCMCIA_FUNCTION_DISK:
if (type == PCMCIA_TPLFE_TYPE_DISK_DEVICE_INTERFACE) {
pf->pf_funce_disk_interface
= pcmcia_tuple_read_1(tuple, 1);
}
break;
case PCMCIA_FUNCTION_NETWORK:
if (type == PCMCIA_TPLFE_TYPE_LAN_NID) {
int i;
int len = pcmcia_tuple_read_1(tuple, 1);
if (tuple->length < 2 + len || len > 8) {
/* tuple length not enough or nid too long */
break;
}
for (i = 0; i < len; ++i) {
pf->pf_funce_lan_nid[i]
= pcmcia_tuple_read_1(tuple, 2 + i);
}
pf->pf_funce_lan_nidlen = len;
}
break;
default:
break;
}
return 0;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: pcmciavar.h,v 1.12 2000/02/08 12:51:31 enami Exp $ */
/* $NetBSD: pcmciavar.h,v 1.13 2000/10/17 10:13:47 haya Exp $ */
/*
* Copyright (c) 1997 Marc Horowitz. All rights reserved.
@ -105,6 +105,22 @@ struct pcmcia_config_entry {
SIMPLEQ_ENTRY(pcmcia_config_entry) cfe_list;
};
struct pcmcia_funce_disk {
int pfd_interface;
};
struct pcmcia_funce_lan {
int pfl_nidlen;
u_int8_t pfl_nid[8];
};
union pcmcia_funce {
struct pcmcia_funce_disk pfv_disk;
struct pcmcia_funce_lan pfv_lan;
};
struct pcmcia_function {
/* read off the card */
int number;
@ -131,6 +147,11 @@ struct pcmcia_function {
void *ih_arg;
int ih_ipl;
int pf_flags;
union pcmcia_funce pf_funce; /* CISTPL_FUNCE */
#define pf_funce_disk_interface pf_funce.pfv_disk.pfd_interface
#define pf_funce_lan_nid pf_funce.pfv_lan.pfl_nid
#define pf_funce_lan_nidlen pf_funce.pfv_lan.pfl_nidlen
};
/* pf_flags */