diff options
author | msmith <msmith@FreeBSD.org> | 1998-08-13 20:31:17 +0000 |
---|---|---|
committer | msmith <msmith@FreeBSD.org> | 1998-08-13 20:31:17 +0000 |
commit | 34dae5c76bd6cded637315239efb465b6632d17a (patch) | |
tree | 5d45a2d4e85b27e054143202b90ac9360a84e1fd /sys/i386/isa/if_cs.c | |
parent | c0198b7da71600250c5ab933c9bbddc26b6df813 (diff) | |
download | FreeBSD-src-34dae5c76bd6cded637315239efb465b6632d17a.zip FreeBSD-src-34dae5c76bd6cded637315239efb465b6632d17a.tar.gz |
Fix BNC/AUI autodetection.
Submitted by: MIHIRA "Sanpei" Yoshiro <sanpei@sanpei.org>
Submitted by: Oleg Sharoiko <os@rsu.ru>
Diffstat (limited to 'sys/i386/isa/if_cs.c')
-rw-r--r-- | sys/i386/isa/if_cs.c | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/sys/i386/isa/if_cs.c b/sys/i386/isa/if_cs.c index 3e5520c..1a81c66 100644 --- a/sys/i386/isa/if_cs.c +++ b/sys/i386/isa/if_cs.c @@ -27,7 +27,7 @@ */ /* - * $Id: if_cs.c,v 1.1 1998/07/20 20:00:42 msmith Exp $ + * $Id: if_cs.c,v 1.2 1998/08/12 18:02:48 bde Exp $ * * Device driver for Crystal Semiconductor CS8920 based ethernet * adapters. By Maxim Bolotin and Oleg Sharoiko, 27-April-1997 @@ -258,6 +258,12 @@ send_test_pkt(struct cs_softc *sc) 0, 46, /* A 46 in network order */ 0, 0, /* DSAP=0 & SSAP=0 fields */ 0xf3, 0 /* Control (Test Req + P bit set) */ }; + int i; + u_char ether_address_backup[ETHER_ADDR_LEN]; + + for (i = 0; i < ETHER_ADDR_LEN; i++) { + ether_address_backup[i] = sc->arpcom.ac_enaddr[i]; + } cs_writereg(sc->nic_addr, PP_LineCTL, cs_readreg(sc->nic_addr, PP_LineCTL) | SERIAL_TX_ON ); @@ -270,15 +276,26 @@ send_test_pkt(struct cs_softc *sc) /* Wait for chip to allocate memory */ DELAY(50000); - if (!(cs_readreg(sc->nic_addr, PP_BusST) & READY_FOR_TX_NOW)) + if (!(cs_readreg(sc->nic_addr, PP_BusST) & READY_FOR_TX_NOW)) { + for (i = 0; i < ETHER_ADDR_LEN; i++) { + sc->arpcom.ac_enaddr[i] = ether_address_backup[i]; + } return 0; + } outsw(sc->nic_addr + TX_FRAME_PORT, test_packet, sizeof(test_packet)); DELAY(30000); - if ((cs_readreg(sc->nic_addr,PP_TxEvent) & TX_SEND_OK_BITS) == TX_OK) + if ((cs_readreg(sc->nic_addr,PP_TxEvent) & TX_SEND_OK_BITS) == TX_OK) { + for (i = 0; i < ETHER_ADDR_LEN; i++) { + sc->arpcom.ac_enaddr[i] = ether_address_backup[i]; + } return 1; + } + for (i = 0; i < ETHER_ADDR_LEN; i++) { + sc->arpcom.ac_enaddr[i] = ether_address_backup[i]; + } return 0; } @@ -647,7 +664,8 @@ cs_init(void *xsc) /* Enable receiver and transmitter */ cs_writereg(sc->nic_addr, PP_LineCTL, - sc->line_ctl | SERIAL_RX_ON | SERIAL_TX_ON); + cs_readreg( sc->nic_addr, PP_LineCTL ) | + SERIAL_RX_ON | SERIAL_TX_ON); /* Configure the receiver mode */ cs_setmode(sc); @@ -1164,20 +1182,16 @@ cs_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) if (line_status & LINK_OK) ifmr->ifm_status |= IFM_ACTIVE; } else { - /* - * XXX I don't know if this is correct or not. - * If AUI will be reported instead of BNC - * then this is wrong. - */ - if (line_status & AUI_ON) - ifmr->ifm_active |= IFM_10_5; - else - ifmr->ifm_active |= IFM_10_2; -#ifdef CS_BROKEN_BNC_DETECT - printf(CS_NAME"%d: PP_LineST: %02x PP_SelfST: %02x\n", - ifp->if_unit,line_status, - cs_readreg(sc->nic_addr,PP_SelfST)); -#endif + if (line_status & AUI_ON) { + cs_writereg(sc->nic_addr, PP_SelfCTL, + cs_readreg(sc->nic_addr, PP_SelfCTL) | + HCB1_ENBL); + if (((sc->adapter_cnf & A_CNF_DC_DC_POLARITY)!=0)^ + (cs_readreg(sc->nic_addr, PP_SelfCTL)&HCB1)) + ifmr->ifm_active |= IFM_10_2; + else + ifmr->ifm_active |= IFM_10_5; + } } } |