Update cis tuple parser, add a pccarddevs entry,

and improve PCCARD_IVAR_ETHADDR in pccard_read_ivar().

Change points:

(1) Read Function Ext tuple.
(2) Add Ratoc REX-R280 entry(fe driver).
(3) Take ether address from function ext tuple.

Reviewed by: imp
Obtained from: NetBSD
This commit is contained in:
Takeshi Shibagaki 2001-09-02 06:37:41 +00:00
parent 81597dfc29
commit a8bc31671a
5 changed files with 78 additions and 2 deletions

View File

@ -43,6 +43,8 @@
#include <sys/rman.h>
#include <machine/resource.h>
#include <net/ethernet.h>
#include <dev/pccard/pccardreg.h>
#include <dev/pccard/pccardvar.h>
@ -392,7 +394,9 @@ pccard_function_init(struct pccard_function *pf)
rle->res = r;
}
if (cfe->num_memspace > 0) {
goto not_this_one;
/*
* Not implement yet, Fix me.
*/
}
if (cfe->irqmask) {
cfe->irqrid = 0;
@ -934,7 +938,7 @@ pccard_read_ivar(device_t bus, device_t child, int which, u_char *result)
switch (which) {
default:
case PCCARD_IVAR_ETHADDR:
return (ENOENT);
bcopy(func->pf_funce_lan_nid, result, ETHER_ADDR_LEN);
break;
case PCCARD_IVAR_VENDOR:
*(u_int32_t *) result = sc->card.manufacturer;

View File

@ -70,6 +70,7 @@ struct cis_state {
};
int pccard_parse_cis_tuple(struct pccard_tuple *, void *);
static int decode_funce(struct pccard_tuple *, struct pccard_function *);
void
pccard_read_cis(struct pccard_softc *sc)
@ -768,6 +769,17 @@ pccard_parse_cis_tuple(struct pccard_tuple *tuple, void *arg)
DPRINTF(("CISTPL_FUNCID\n"));
break;
case PCCARD_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);
}
DPRINTF(("CISTPL_FUNCE\n"));
break;
case PCCARD_CISTPL_CONFIG:
if (tuple->length < 3) {
DPRINTF(("CISTPL_CONFIG too short %d\n",
@ -1205,3 +1217,36 @@ pccard_parse_cis_tuple(struct pccard_tuple *tuple, void *arg)
return (0);
}
static int
decode_funce(struct pccard_tuple *tuple, struct pccard_function *pf)
{
int type = pccard_tuple_read_1(tuple, 0);
switch (pf->function) {
case PCCARD_FUNCTION_DISK:
if (type == PCCARD_TPLFE_TYPE_DISK_DEVICE_INTERFACE) {
pf->pf_funce_disk_interface
= pccard_tuple_read_1(tuple, 1);
}
break;
case PCCARD_FUNCTION_NETWORK:
if (type == PCCARD_TPLFE_TYPE_LAN_NID) {
int i;
int len = pccard_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]
= pccard_tuple_read_1(tuple, i + 2);
}
pf->pf_funce_lan_nidlen = len;
}
break;
default:
break;
}
return 0;
}

View File

@ -273,6 +273,9 @@ product BAY STACK_660 0x0807 BayStack 660 Wireless LAN
/* Raylink/WebGear */
product RAYTHEON WLAN 0x0000 WLAN Adapter
/* RATOC System Inc. Products */
product RATOC REX_R280 0x1 RATOC REX-R280
/* Samsung */
product SAMSUNG SWL_2000N 0x02 Samsung MagicLAN SWL-2000N

View File

@ -474,6 +474,11 @@
#define PCCARD_PRODUCT_RAYTHEON_WLAN 0x0000
#define PCCARD_STR_RAYTHEON_WLAN "WLAN Adapter"
/* 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"
/* Samsung */
#define PCCARD_CIS_SAMSUNG_SWL_2000N { NULL, NULL, NULL, NULL }
#define PCCARD_PRODUCT_SAMSUNG_SWL_2000N 0x02

View File

@ -113,6 +113,20 @@ struct pccard_config_entry {
STAILQ_ENTRY(pccard_config_entry) cfe_list;
};
struct pccard_funce_disk {
int pfd_interface;
};
struct pccard_funce_lan {
int pfl_nidlen;
u_int8_t pfl_nid[8];
};
union pccard_funce {
struct pccard_funce_disk pfv_disk;
struct pccard_funce_lan pfv_lan;
};
struct pccard_function {
/* read off the card */
int number;
@ -140,6 +154,11 @@ struct pccard_function {
driver_intr_t *intr_handler;
void *intr_handler_arg;
void *intr_handler_cookie;
union pccard_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 */