support FUJITSU MB86960/5 based ethernet cards

FMV-J181,182,182A
This commit is contained in:
ichiro 2001-12-23 09:25:19 +00:00
parent 766857df86
commit c4552cab7f
2 changed files with 70 additions and 23 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: if_mbe_pcmcia.c,v 1.24 2001/12/18 11:32:47 ichiro Exp $ */
/* $NetBSD: if_mbe_pcmcia.c,v 1.25 2001/12/23 09:25:19 ichiro Exp $ */
/*-
* Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: if_mbe_pcmcia.c,v 1.24 2001/12/18 11:32:47 ichiro Exp $");
__KERNEL_RCSID(0, "$NetBSD: if_mbe_pcmcia.c,v 1.25 2001/12/23 09:25:19 ichiro Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -90,6 +90,8 @@ struct mbe_pcmcia_get_enaddr_args {
int mbe_pcmcia_get_enaddr_from_cis __P((struct pcmcia_tuple *, void *));
int mbe_pcmcia_get_enaddr_from_mem __P((struct mbe_pcmcia_softc *,
struct mbe_pcmcia_get_enaddr_args *));
int mbe_pcmcia_get_enaddr_from_io __P((struct mbe_pcmcia_softc *,
struct mbe_pcmcia_get_enaddr_args *));
static const struct mbe_pcmcia_product {
const char *mpp_name; /* product name */
@ -98,6 +100,8 @@ static const struct mbe_pcmcia_product {
const char *mpp_cisinfo[4]; /* CIS information */
u_int32_t mpp_ioalign; /* required alignment */
int mpp_enet_maddr;
int flags;
#define MBH10302 0x0001 /* FUJITSU MBH10302 */
} mbe_pcmcia_products[] = {
{ PCMCIA_STR_TDK_LAK_CD021BX, PCMCIA_VENDOR_TDK,
PCMCIA_PRODUCT_TDK_LAK_CD021BX, PCMCIA_CIS_TDK_LAK_CD021BX,
@ -110,7 +114,7 @@ static const struct mbe_pcmcia_product {
#if 0 /* XXX 86960-based? */
{ PCMCIA_STR_TDK_LAK_DFL9610, PCMCIA_VENDOR_TDK,
PCMCIA_PRODUCT_TDK_LAK_DFL9610, PCMCIA_CIS_TDK_DFL9610,
0, -1 },
0, -1, MBH10302 /* XXX */ },
#endif
{ PCMCIA_STR_CONTEC_CNETPC, PCMCIA_VENDOR_CONTEC,
@ -121,14 +125,26 @@ static const struct mbe_pcmcia_product {
PCMCIA_PRODUCT_FUJITSU_LA501, PCMCIA_CIS_FUJITSU_LA501,
0x20, -1 },
{ PCMCIA_STR_FUJITSU_LA10S, PCMCIA_VENDOR_FUJITSU,
PCMCIA_PRODUCT_FUJITSU_LA10S, PCMCIA_CIS_FUJITSU_LA10S,
0, -1 },
{ PCMCIA_STR_FUJITSU_FMV_J181, PCMCIA_VENDOR_FUJITSU,
PCMCIA_PRODUCT_FUJITSU_FMV_J181, PCMCIA_CIS_FUJITSU_FMV_J181,
0x20, -1, MBH10302 },
{ PCMCIA_STR_FUJITSU_FMV_J182, PCMCIA_VENDOR_FUJITSU,
PCMCIA_PRODUCT_FUJITSU_FMV_J182, PCMCIA_CIS_FUJITSU_FMV_J182,
0, 0xf2c },
{ PCMCIA_STR_FUJITSU_FMV_J182A, PCMCIA_VENDOR_FUJITSU,
PCMCIA_PRODUCT_FUJITSU_FMV_J182A, PCMCIA_CIS_FUJITSU_FMV_J182A,
0, 0x1cc },
{ PCMCIA_STR_FUJITSU_ITCFJ182A, PCMCIA_VENDOR_FUJITSU,
PCMCIA_PRODUCT_FUJITSU_ITCFJ182A, PCMCIA_CIS_FUJITSU_ITCFJ182A,
0, 0x1cc },
{ PCMCIA_STR_FUJITSU_LA10S, PCMCIA_VENDOR_FUJITSU,
PCMCIA_PRODUCT_FUJITSU_LA10S, PCMCIA_CIS_FUJITSU_LA10S,
0, -1 },
{ PCMCIA_STR_RATOC_REX_R280, PCMCIA_VENDOR_RATOC,
PCMCIA_PRODUCT_RATOC_REX_R280, PCMCIA_CIS_RATOC_REX_R280,
0, 0x1fc },
@ -151,7 +167,9 @@ mbe_pcmcia_lookup(pa)
strcmp(pa->card->cis1_info[0], mpp->mpp_cisinfo[0]) == 0 &&
pa->card->cis1_info[1] != NULL &&
mpp->mpp_cisinfo[1] != NULL &&
strcmp(pa->card->cis1_info[1], mpp->mpp_cisinfo[1]) == 0)
strcmp(pa->card->cis1_info[1], mpp->mpp_cisinfo[1]) == 0 &&
(mpp->mpp_cisinfo[2] == NULL ||
strcmp(pa->card->cis1_info[2], mpp->mpp_cisinfo[2]) == 0))
return (mpp);
/* match by vendor/product id */
@ -226,7 +244,8 @@ mbe_pcmcia_attach(parent, self, aux)
* Don't bother checking flags; the back-end sets the chip
* into 16-bit mode.
*/
if (pcmcia_io_map(pa->pf, PCMCIA_WIDTH_IO16, 0, cfe->iospace[0].length,
if (pcmcia_io_map(pa->pf, PCMCIA_WIDTH_IO16, 0,
mpp->mpp_ioalign ? mpp->mpp_ioalign : cfe->iospace[0].length,
&psc->sc_pcioh, &psc->sc_io_window)) {
printf(": can't map i/o space\n");
goto iomap_failed;
@ -234,7 +253,7 @@ mbe_pcmcia_attach(parent, self, aux)
printf(": %s\n", mpp->mpp_name);
/* Read station address from mem or CIS. */
/* Read station address from io/mem or CIS. */
if (mpp->mpp_enet_maddr >= 0) {
pgea.maddr = mpp->mpp_enet_maddr;
if (mbe_pcmcia_get_enaddr_from_mem(psc, &pgea) != 0) {
@ -242,6 +261,14 @@ mbe_pcmcia_attach(parent, self, aux)
"from mem\n", sc->sc_dev.dv_xname);
goto no_enaddr;
}
} else if ((mpp->flags & MBH10302) != 0) {
bus_space_write_1(sc->sc_bst, sc->sc_bsh, FE_MBH0 ,
FE_MBH0_MASK | FE_MBH0_INTR_ENABLE);
if (mbe_pcmcia_get_enaddr_from_io(psc, &pgea) != 0) {
printf("%s: Couldn't get ethernet address "
"from io\n", sc->sc_dev.dv_xname);
goto no_enaddr;
}
} else {
rv = pcmcia_scan_cis(parent,
mbe_pcmcia_get_enaddr_from_cis, &pgea);
@ -266,7 +293,10 @@ mbe_pcmcia_attach(parent, self, aux)
}
/* Perform generic initialization. */
mb86960_attach(sc, MB86960_TYPE_86965, pgea.enaddr);
if ((mpp->flags & MBH10302) != 0)
mb86960_attach(sc, MB86960_TYPE_86960, pgea.enaddr);
else
mb86960_attach(sc, MB86960_TYPE_86965, pgea.enaddr);
mb86960_config(sc, NULL, 0, 0);
@ -370,6 +400,22 @@ mbe_pcmcia_get_enaddr_from_cis(tuple, arg)
return (0);
}
int
mbe_pcmcia_get_enaddr_from_io(psc, ea)
struct mbe_pcmcia_softc *psc;
struct mbe_pcmcia_get_enaddr_args *ea;
{
int i;
for (i = 0; i < ETHER_ADDR_LEN; i++)
ea->enaddr[i] = bus_space_read_1(psc->sc_pcioh.iot,
psc->sc_pcioh.ioh, FE_MBH_ENADDR + i);
if (ea->enaddr == NULL)
return (1);
return (0);
}
int
mbe_pcmcia_get_enaddr_from_mem(psc, ea)
struct mbe_pcmcia_softc *psc;

View File

@ -1,4 +1,4 @@
/* $NetBSD: pcmcia_cis_quirks.c,v 1.16 2001/12/16 06:07:50 ichiro Exp $ */
/* $NetBSD: pcmcia_cis_quirks.c,v 1.17 2001/12/23 09:25:19 ichiro Exp $ */
/*
* Copyright (c) 1998 Marc Horowitz. All rights reserved.
@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: pcmcia_cis_quirks.c,v 1.16 2001/12/16 06:07:50 ichiro Exp $");
__KERNEL_RCSID(0, "$NetBSD: pcmcia_cis_quirks.c,v 1.17 2001/12/23 09:25:19 ichiro Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -256,22 +256,22 @@ static const struct pcmcia_config_entry pcmcia_emtac_a2424i_func0_cfe0 = {
0, /* maxtwins */
};
static const struct pcmcia_function pcmcia_fujitsu_j182a_func0 = {
static const struct pcmcia_function pcmcia_fujitsu_j181_func0 = {
0, /* function number */
PCMCIA_FUNCTION_NETWORK,
0x3d, /* last cfe number */
0x3f0, /* ccr_base */
0x21, /* last cfe number */
0xfe0, /* ccr_base */
0xf, /* ccr_mask */
};
};
static const struct pcmcia_config_entry pcmcia_fujitsu_j182a_func0_cfe0 = {
0x31, /* cfe number */
PCMCIA_CFE_IO8 | PCMCIA_CFE_IO16 |
PCMCIA_CFE_IRQLEVEL | PCMCIA_CFE_POWERDOWN,
static const struct pcmcia_config_entry pcmcia_fujitsu_j181_func0_cfe0 = {
0xc, /* cfe number */
PCMCIA_CFE_MWAIT_REQUIRED | PCMCIA_CFE_WP_ACTIVE | PCMCIA_CFE_IO8 |
PCMCIA_CFE_IO16 | PCMCIA_CFE_IRQLEVEL | PCMCIA_CFE_IRQPULSE,
PCMCIA_IFTYPE_IO,
1, /* num_iospace */
10, /* iomask */
{ { 0x20, 0x220 } }, /* iospace */
{ { 0x20, 0x140 } }, /* iospace */
0xffff, /* irqmask */
0, /* num_memspace */
{ { 0 } }, /* memspace */
@ -311,8 +311,9 @@ static const struct pcmcia_cis_quirk pcmcia_cis_quirks[] = {
&pcmcia_ndc_nd5100_func0, &pcmcia_ndc_nd5100_func0_cfe0 },
{ PCMCIA_VENDOR_EMTAC, PCMCIA_PRODUCT_EMTAC_WLAN, PCMCIA_CIS_INVALID,
&pcmcia_emtac_a2424i_func0, &pcmcia_emtac_a2424i_func0_cfe0 },
{ PCMCIA_VENDOR_FUJITSU, PCMCIA_PRODUCT_FUJITSU_ITCFJ182A, PCMCIA_CIS_INVALID,
&pcmcia_fujitsu_j182a_func0, &pcmcia_fujitsu_j182a_func0_cfe0 },
{ PCMCIA_VENDOR_INVALID, PCMCIA_PRODUCT_INVALID,
PCMCIA_CIS_FUJITSU_FMV_J181,
&pcmcia_fujitsu_j181_func0, &pcmcia_fujitsu_j181_func0_cfe0 },
};
static int n_pcmcia_cis_quirks =