A random patch that's been in my source tree...

Figure out whether the shared memory region is word-accessible in the same
place we figure out its size, and store this in the softc, rather than using a
series of comparisons later.
This commit is contained in:
mycroft 2004-03-17 23:47:16 +00:00
parent b28430ff55
commit 2d3bb76a10
2 changed files with 44 additions and 53 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: ne2000.c,v 1.41 2003/11/02 11:07:45 wiz Exp $ */
/* $NetBSD: ne2000.c,v 1.42 2004/03/17 23:47:16 mycroft Exp $ */
/*-
* Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@ -55,7 +55,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ne2000.c,v 1.41 2003/11/02 11:07:45 wiz Exp $");
__KERNEL_RCSID(0, "$NetBSD: ne2000.c,v 1.42 2004/03/17 23:47:16 mycroft Exp $");
#include "opt_ipkdb.h"
@ -126,16 +126,36 @@ ne2000_attach(nsc, myea)
* Detect it again unless caller specified it; this gives us
* the memory size.
*/
if (nsc->sc_type == 0) {
if (nsc->sc_type == NE2000_TYPE_UNKNOWN)
nsc->sc_type = ne2000_detect(nict, nich, asict, asich);
if (nsc->sc_type == 0) {
printf("%s: where did the card go?\n",
dsc->sc_dev.dv_xname);
return (1);
}
/*
* 8k of memory for NE1000, 16k for NE2000 and 24k for the
* card uses DL10019.
*/
switch (nsc->sc_type) {
case NE2000_TYPE_UNKNOWN:
default:
printf("%s: where did the card go?\n", dsc->sc_dev.dv_xname);
return (1);
case NE2000_TYPE_NE1000:
memsize = 8192;
useword = 0;
break;
case NE2000_TYPE_NE2000:
case NE2000_TYPE_AX88190: /* XXX really? */
case NE2000_TYPE_AX88790:
memsize = 8192 * 2;
useword = 1;
break;
case NE2000_TYPE_DL10019:
case NE2000_TYPE_DL10022:
memsize = 8192 * 3;
useword = 1;
break;
}
useword = NE2000_USE_WORD(nsc);
nsc->sc_useword = useword;
dsc->cr_proto = ED_CR_RD2;
if (nsc->sc_type == NE2000_TYPE_AX88190 ||
@ -164,28 +184,6 @@ ne2000_attach(nsc, myea)
for (i = 0; i < 16; i++)
dsc->sc_reg_map[i] = i;
/*
* 8k of memory for NE1000, 16k for NE2000 and 24k for the
* card uses DL10019.
*/
switch (nsc->sc_type) {
case NE2000_TYPE_NE1000:
memsize = 8192;
break;
case NE2000_TYPE_NE2000:
case NE2000_TYPE_AX88190: /* XXX really? */
case NE2000_TYPE_AX88790:
memsize = 8192 * 2;
break;
case NE2000_TYPE_DL10019:
case NE2000_TYPE_DL10022:
memsize = 8192 * 3;
break;
default:
memsize = 0;
break;
}
/*
* NIC memory doens't start at zero on an NE board.
* The start address is tied to the bus width.
@ -668,7 +666,7 @@ ne2000_ring_copy(sc, src, dst, amount)
bus_space_tag_t asict = nsc->sc_asict;
bus_space_handle_t asich = nsc->sc_asich;
u_short tmp_amount;
int useword = NE2000_USE_WORD(nsc);
int useword = nsc->sc_useword;
/* Does copy wrap to lower addr in ring buffer? */
if (src + amount > sc->mem_end) {
@ -699,7 +697,7 @@ ne2000_read_hdr(sc, buf, hdr)
ne2000_readmem(sc->sc_regt, sc->sc_regh, nsc->sc_asict, nsc->sc_asich,
buf, (u_int8_t *)hdr, sizeof(struct dp8390_ring),
NE2000_USE_WORD(nsc));
nsc->sc_useword);
#if BYTE_ORDER == BIG_ENDIAN
hdr->count = bswap16(hdr->count);
#endif
@ -864,7 +862,7 @@ ne2000_ipkdb_attach(kip)
if (np->sc_type == 0)
return -1;
useword = NE2000_USE_WORD(np);
useword = np->sc_useword;
dp->cr_proto = ED_CR_RD2;
dp->dcr_reg = ED_DCR_FT1 | ED_DCR_LS | (useword ? ED_DCR_WTS : 0);
@ -927,9 +925,8 @@ ne2000_ipkdb_attach(kip)
} else {
ne2000_readmem(nict, nich, np->sc_asict, np->sc_asich,
0, romdata, sizeof romdata, useword);
useword = useword ? 2 : 1;
for (i = 0; i < ETHER_ADDR_LEN; i++)
kip->myenetaddr[i] = romdata[i * useword];
kip->myenetaddr[i] = romdata[i << useword];
}
kip->flags |= IPKDB_MYHW;

View File

@ -1,4 +1,4 @@
/* $NetBSD: ne2000var.h,v 1.14 2003/10/22 00:12:36 christos Exp $ */
/* $NetBSD: ne2000var.h,v 1.15 2004/03/17 23:47:16 mycroft Exp $ */
/*-
* Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@ -46,24 +46,18 @@ struct ne2000_softc {
bus_space_tag_t sc_asict; /* space tag for ASIC */
bus_space_handle_t sc_asich; /* space handle for ASIC */
int sc_type;
enum {
NE2000_TYPE_UNKNOWN = 0,
NE2000_TYPE_NE1000,
NE2000_TYPE_NE2000,
NE2000_TYPE_DL10019,
NE2000_TYPE_DL10022,
NE2000_TYPE_AX88190,
NE2000_TYPE_AX88790
} sc_type;
int sc_useword;
};
/* sc_type */
#define NE2000_TYPE_NE1000 1
#define NE2000_TYPE_NE2000 2
#define NE2000_TYPE_DL10019 3
#define NE2000_TYPE_DL10022 4
#define NE2000_TYPE_AX88190 5
#define NE2000_TYPE_AX88790 6
#define NE2000_USE_WORD(sc) \
(((sc)->sc_type == NE2000_TYPE_NE2000) || \
((sc)->sc_type == NE2000_TYPE_DL10019) || \
((sc)->sc_type == NE2000_TYPE_DL10022) || \
((sc)->sc_type == NE2000_TYPE_AX88190) || \
((sc)->sc_type == NE2000_TYPE_AX88790))
int ne2000_attach __P((struct ne2000_softc *, u_int8_t *));
int ne2000_detect __P((bus_space_tag_t, bus_space_handle_t,
bus_space_tag_t, bus_space_handle_t));