Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/arm26/podulebus Handle detecting the available medi...
details: https://anonhg.NetBSD.org/src/rev/6469a47fa1fc
branches: trunk
changeset: 500744:6469a47fa1fc
user: bjh21 <bjh21%NetBSD.org@localhost>
date: Sun Dec 17 22:29:26 2000 +0000
description:
Handle detecting the available media and state of medium selection links
on EtherLan 100 (and presumably 500) boards.
diffstat:
sys/arch/arm26/podulebus/if_eh.c | 120 ++++++++++++++++++++++++++++++-----
sys/arch/arm26/podulebus/if_ehreg.h | 6 +-
2 files changed, 108 insertions(+), 18 deletions(-)
diffs (246 lines):
diff -r 91512a75eb93 -r 6469a47fa1fc sys/arch/arm26/podulebus/if_eh.c
--- a/sys/arch/arm26/podulebus/if_eh.c Sun Dec 17 22:23:12 2000 +0000
+++ b/sys/arch/arm26/podulebus/if_eh.c Sun Dec 17 22:29:26 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_eh.c,v 1.2 2000/12/16 18:24:36 bjh21 Exp $ */
+/* $NetBSD: if_eh.c,v 1.3 2000/12/17 22:29:26 bjh21 Exp $ */
/*-
* Copyright (c) 2000 Ben Harris
@@ -53,7 +53,7 @@
#include <sys/param.h>
-__KERNEL_RCSID(0, "$NetBSD: if_eh.c,v 1.2 2000/12/16 18:24:36 bjh21 Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_eh.c,v 1.3 2000/12/17 22:29:26 bjh21 Exp $");
#include <sys/systm.h>
#include <sys/device.h>
@@ -91,15 +91,23 @@
#include <machine/bswap.h>
#endif
+#define EH_MEDIA_2 0
+#define EH_MEDIA_T 1
+#define EH_MEDIA_2_T 2
+#define EH_MEDIA_FL_T 3
+
struct eh_softc {
struct dp8390_softc sc_dp;
bus_space_tag_t sc_datat;
bus_space_handle_t sc_datah;
bus_space_tag_t sc_ctlt;
bus_space_handle_t sc_ctlh;
+ bus_space_tag_t sc_ctl2t;
+ bus_space_handle_t sc_ctl2h;
struct irq_handler *sc_ih;
int sc_flags;
#define EHF_16BIT 0x01
+#define EHF_MAU 0x02
int sc_type;
u_int8_t sc_ctrl; /* Current control reg state */
};
@@ -112,6 +120,7 @@
void eh_writemem(struct eh_softc *, u_int8_t *, int, size_t);
void eh_readmem(struct eh_softc *, int, u_int8_t *, size_t);
static void eh_init_card(struct dp8390_softc *);
+static int eh_availmedia(struct eh_softc *);
/* if_media glue */
static int eh_mediachange(struct dp8390_softc *);
@@ -145,18 +154,28 @@
static const u_int8_t demo_addr_100[] = { 0x00, 0xc0, 0x32, 0x00, 0x84, 0x57 };
static const u_int8_t demo_addr_200[] = { 0x00, 0xc0, 0x32, 0x00, 0x17, 0xbf };
+/* XXX 10baseFL on E513 */
+static int media_only2[] = { IFM_ETHER | IFM_10_2 };
+static int media_onlyt[] = { IFM_ETHER | IFM_10_T };
+static int media_2andt[] =
+ { IFM_ETHER | IFM_10_2, IFM_ETHER | IFM_10_T, IFM_ETHER | IFM_AUTO };
+static const struct {
+ int nmedia;
+ int *media;
+} media_switch[] = {
+ { 1, media_only2 },
+ { 1, media_onlyt },
+ { 3, media_2andt }
+};
+
static void
eh_attach(struct device *parent, struct device *self, void *aux)
{
struct podulebus_attach_args *pa = aux;
struct eh_softc *sc = (struct eh_softc *)self;
struct dp8390_softc *dsc = &sc->sc_dp;
- /* XXX Not all cards really support all media */
- /* XXX 10baseFL on E513 */
- int media[] =
- { IFM_ETHER | IFM_AUTO,
- IFM_ETHER | IFM_10_2,
- IFM_ETHER | IFM_10_T};
+ int *media;
+ int mediaset, nmedia;
int i;
/* Canonicalise card type. */
@@ -178,13 +197,15 @@
/* Memory size and width varies. */
dsc->mem_start = 0;
switch (sc->sc_type) {
+ case PODULE_ICUBED_ETHERLAN200:
+ sc->sc_flags |= EHF_MAU;
+ /* FALLTHROUGH */
case PODULE_ICUBED_ETHERLAN100:
- case PODULE_ICUBED_ETHERLAN200:
- printf(": 8-bit, 32 KB RAM\n");
+ printf(": 8-bit, 32 KB RAM");
dsc->mem_size = 0x8000;
break;
case PODULE_ICUBED_ETHERLAN500:
- printf(": 16-bit, 64 KB RAM\n");
+ printf(": 16-bit, 64 KB RAM");
sc->sc_flags |= EHF_16BIT;
dsc->mem_size = 0x10000;
break;
@@ -200,6 +221,9 @@
sc->sc_ctlt = pa->pa_fast_t;
bus_space_subregion(sc->sc_ctlt, pa->pa_fast_h, EH_CTRL, 1,
&sc->sc_ctlh);
+ sc->sc_ctl2t = pa->pa_fast_t;
+ bus_space_subregion(sc->sc_ctl2t, pa->pa_fast_h, EH_CTRL2, 1,
+ &sc->sc_ctl2h);
/* dsc->cr_proto? */
/* dsc->rcr_proto? */
@@ -226,6 +250,26 @@
sc->sc_ctrl = 0x00;
+ if (!(sc->sc_flags & EHF_MAU))
+ mediaset = eh_availmedia(sc);
+ else
+ /* XXX get MAU type */
+ mediaset = EH_MEDIA_2_T;
+ switch (mediaset) {
+ case EH_MEDIA_2:
+ printf(", 10base2 only");
+ break;
+ case EH_MEDIA_T:
+ printf(", 10baseT only");
+ break;
+ case EH_MEDIA_2_T:
+ printf(", combo 10base2/T");
+ break;
+ }
+ media = media_switch[mediaset].media;
+ nmedia = media_switch[mediaset].nmedia;
+ printf("\n");
+
/* XXX XXX XXX Ethernet address */
switch (sc->sc_type) {
case PODULE_ICUBED_ETHERLAN100:
@@ -236,9 +280,8 @@
break;
}
printf("%s: rigged demo mode\n", self->dv_xname);
-
- dp8390_config(dsc, media, sizeof(media) / sizeof(media[0]),
- IFM_ETHER | IFM_10_2);
+
+ dp8390_config(dsc, media, nmedia, media[0]);
dp8390_stop(dsc);
#if 0
@@ -644,6 +687,45 @@
}
/*
+ * Work out the media types available on the current card.
+ *
+ * We try to switch to each of 10base2 and 10baseT in turn. If the card
+ * only supports one type, the media select line will be tied to select
+ * that, so it won't move when we push it.
+ *
+ * The media select jumpers (at least on the EtherLan 100) have the same
+ * effect.
+ */
+
+int
+eh_availmedia(struct eh_softc *sc)
+{
+
+ /* Set the card to use AUI (10b2 or 10bFL) */
+ bus_space_write_1(sc->sc_ctlt, sc->sc_ctlh, 0,
+ sc->sc_ctrl & ~EH_CTRL_MEDIA);
+ /* Check whether that worked */
+ if ((bus_space_read_1(sc->sc_ctl2t, sc->sc_ctl2h, 0) &
+ EH_CTRL2_10B2) == 0) {
+ bus_space_write_1(sc->sc_ctlt, sc->sc_ctlh, 0, sc->sc_ctrl);
+ return EH_MEDIA_T;
+ }
+
+ /* Try 10bT and see if that works */
+ bus_space_write_1(sc->sc_ctlt, sc->sc_ctlh, 0,
+ sc->sc_ctrl | EH_CTRL_MEDIA);
+ if ((bus_space_read_1(sc->sc_ctl2t, sc->sc_ctl2h, 0) &
+ EH_CTRL2_10B2)) {
+ bus_space_write_1(sc->sc_ctlt, sc->sc_ctlh, 0, sc->sc_ctrl);
+ return EH_MEDIA_2;
+ }
+
+ /* If both of them worked, this is a combo card. */
+ bus_space_write_1(sc->sc_ctlt, sc->sc_ctlh, 0, sc->sc_ctrl);
+ return EH_MEDIA_2_T;
+}
+
+/*
* Medium selection has changed.
*/
int
@@ -685,14 +767,18 @@
eh_mediastatus(struct dp8390_softc *dsc, struct ifmediareq *ifmr)
{
struct eh_softc *sc = (struct eh_softc *)dsc;
+ int ctrl2;
/* XXX 10baseFL on E513? */
- if (sc->sc_ctrl & EH_CTRL_MEDIA) {
+ /* Read the actual medium currently in use. */
+ ctrl2 = bus_space_read_1(sc->sc_ctl2t, sc->sc_ctl2h, 0);
+ if (ctrl2 & EH_CTRL2_10B2) {
+ ifmr->ifm_active = IFM_ETHER | IFM_10_2;
+ } else {
ifmr->ifm_active = IFM_ETHER | IFM_10_T | IFM_AVALID;
if (bus_space_read_1(sc->sc_ctlt, sc->sc_ctlh, 0) &
EH_CTRL_LINK)
ifmr->ifm_active |= IFM_ACTIVE;
- } else
- ifmr->ifm_active = IFM_ETHER | IFM_10_2;
+ }
}
diff -r 91512a75eb93 -r 6469a47fa1fc sys/arch/arm26/podulebus/if_ehreg.h
--- a/sys/arch/arm26/podulebus/if_ehreg.h Sun Dec 17 22:23:12 2000 +0000
+++ b/sys/arch/arm26/podulebus/if_ehreg.h Sun Dec 17 22:29:26 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ehreg.h,v 1.2 2000/12/16 18:23:14 bjh21 Exp $ */
+/* $NetBSD: if_ehreg.h,v 1.3 2000/12/17 22:29:26 bjh21 Exp $ */
/*
* This file is in the public domain
@@ -17,6 +17,7 @@
#define EH_DP8390 0x000 /* MEMC space */
#define EH_DATA 0x200 /* MEMC space */
#define EH_CTRL 0x200 /* FAST space */
+#define EH_CTRL2 0xa00 /* FAST space */
/* Bits of the control register */
#define EH_CTRL_IE 0x01 /* Interrupt enable (W) */
@@ -24,4 +25,7 @@
#define EH_CTRL_MEDIA 0x02 /* Media select (0 = 10b2, 1 = 10bT) (W) */
#define EH_CTRL_LINK 0x02 /* Link beat detect (R) */
+/* Bits of control register 2 */
+#define EH_CTRL2_10B2 0x01 /* Media sense (0 = 10bT, 1 = 10b2) (R) */
+
#endif
Home |
Main Index |
Thread Index |
Old Index