summaryrefslogtreecommitdiffstats
path: root/sys/dev/ep
diff options
context:
space:
mode:
authornate <nate@FreeBSD.org>1996-06-14 21:28:35 +0000
committernate <nate@FreeBSD.org>1996-06-14 21:28:35 +0000
commitc320ff1cb91b46fa311603a7d209f86de375ee08 (patch)
tree21fb241e50be740f3d3a491473ad93ff3ed60aae /sys/dev/ep
parent0826bf5711fc2c4dbc7f0ebe9f34ce93f2bf18e7 (diff)
downloadFreeBSD-src-c320ff1cb91b46fa311603a7d209f86de375ee08.zip
FreeBSD-src-c320ff1cb91b46fa311603a7d209f86de375ee08.tar.gz
Better code for switching the ethernet transceiver.
My 3C509B-COMBO works fine with the following patch. Switching between UTP and BNC is quite easy. (Just type 'ifconfig ep0 link1 -link2' or 'ifconifg ep0 link2 -link1'.) [ I tested this with the additional PC-CARD patches and it works on both connectors on my 3C589B and 3C589C ] Reviewed by: nate Submitted by: Naoki Hamada <nao@sbl.cl.nec.co.jp>
Diffstat (limited to 'sys/dev/ep')
-rw-r--r--sys/dev/ep/if_ep.c62
1 files changed, 32 insertions, 30 deletions
diff --git a/sys/dev/ep/if_ep.c b/sys/dev/ep/if_ep.c
index a6a24df..772e043 100644
--- a/sys/dev/ep/if_ep.c
+++ b/sys/dev/ep/if_ep.c
@@ -38,7 +38,7 @@
*/
/*
- * $Id: if_ep.c,v 1.44 1996/05/24 15:22:36 gibbs Exp $
+ * $Id: if_ep.c,v 1.45 1996/06/12 05:03:38 gpalmer Exp $
*
* Promiscuous mode added and interrupt logic slightly changed
* to reduce the number of adapter failures. Transceiver select
@@ -496,7 +496,7 @@ ep_attach(sc)
p[i] = htons(sc->epb->eth_addr[i]);
outw(BASE + EP_W2_ADDR_0 + (i * 2), ntohs(p[i]));
}
- printf(" address %6D\n", sc->arpcom.ac_enaddr, ":");
+ printf(" address %6D\n", sc->arpcom.ac_enaddr);
ifp->if_softc = sc;
ifp->if_unit = sc->unit;
@@ -640,39 +640,40 @@ epinit(sc)
*
*/
+ /* Set the xcvr. */
if(ifp->if_flags & IFF_LINK0 && sc->ep_connectors & AUI) {
- /* nothing */
+ i = ACF_CONNECTOR_AUI;
} else if(ifp->if_flags & IFF_LINK1 && sc->ep_connectors & BNC) {
- outw(BASE + EP_COMMAND, START_TRANSCEIVER);
- DELAY(1000);
+ i = ACF_CONNECTOR_BNC;
} else if(ifp->if_flags & IFF_LINK2 && sc->ep_connectors & UTP) {
- GO_WINDOW(4);
- outw(BASE + EP_W4_MEDIA_TYPE, ENABLE_UTP);
- GO_WINDOW(1);
+ i = ACF_CONNECTOR_UTP;
} else {
- GO_WINDOW(1);
- switch(sc->ep_connector) {
- case ACF_CONNECTOR_UTP:
- if(sc->ep_connectors & UTP) {
- GO_WINDOW(4);
- outw(BASE + EP_W4_MEDIA_TYPE, ENABLE_UTP);
- GO_WINDOW(1);
- }
- break;
- case ACF_CONNECTOR_BNC:
- if(sc->ep_connectors & BNC) {
- outw(BASE + EP_COMMAND, START_TRANSCEIVER);
- DELAY(1000);
- }
- break;
- case ACF_CONNECTOR_AUI:
- /* nothing to do */
- break;
- default:
- printf("ep%d: strange connector type in EEPROM: assuming AUI\n",
- sc->unit);
- break;
+ i = sc->ep_connector;
+ }
+ GO_WINDOW(0);
+ j = inw(BASE + EP_W0_ADDRESS_CFG) & 0x3fff;
+ outw(BASE + EP_W0_ADDRESS_CFG, j | (i << ACF_CONNECTOR_BITS));
+
+ switch(i) {
+ case ACF_CONNECTOR_UTP:
+ if(sc->ep_connectors & UTP) {
+ GO_WINDOW(4);
+ outw(BASE + EP_W4_MEDIA_TYPE, ENABLE_UTP);
+ }
+ break;
+ case ACF_CONNECTOR_BNC:
+ if(sc->ep_connectors & BNC) {
+ outw(BASE + EP_COMMAND, START_TRANSCEIVER);
+ DELAY(1000);
}
+ break;
+ case ACF_CONNECTOR_AUI:
+ /* nothing to do */
+ break;
+ default:
+ printf("ep%d: strange connector type in EEPROM: assuming AUI\n",
+ sc->unit);
+ break;
}
outw(BASE + EP_COMMAND, RX_ENABLE);
@@ -717,6 +718,7 @@ epinit(sc)
sc->next_mb = 0;
epmbuffill((caddr_t) sc, 0);
+ GO_WINDOW(1);
epstart(ifp);
splx(s);
OpenPOWER on IntegriCloud