*BSD News Article 38483


Return to BSD News archive

Path: sserve!newshost.anu.edu.au!harbinger.cc.monash.edu.au!bunyip.cc.uq.oz.au!munnari.oz.au!spool.mu.edu!uwm.edu!daffy!uwvax!sinetnews!news.u-tokyo.ac.jp!wnoc-tyo-news!wnoc-sfc-news!kogwy!hosokawa
From: hosokawa@mt.cs.keio.ac.jp (HOSOKAWA Tatsumi)
Newsgroups: comp.os.386bsd.bugs
Subject: FreeBSD 2.0 if_ze on Cirrus Logic's PCIC
Date: 27 Nov 1994 15:47:14 GMT
Organization: Tokoro Laboratory, Keio University, Yokohama Japan.
Lines: 70
Message-ID: <3ba9m2$8i6@kogwy.cc.keio.ac.jp>
NNTP-Posting-Host: nanbu.mt.cs.keio.ac.jp
X-Newsreader: mnews [version 1.18PL3] 1994-08/01(Mon)

To FreeBSD nomads:

My subnote has Cirrus Logic's PCIC.  On this machine, ze driver of
FreeBSD sometimes fails in initializing IBM PCMCIA Ethernet card
(especially, on IBM Ethernet card II.)  This always occurs when I used
card manager from DOS before bootstraping FreeBSD.

This is indeed a problem on installing FreeBSD via anonymous FTP.  On
1.1.5.1, this bug is not a critical problem, but on 2.0, it sometimes
results in kernel page fault and the machine hangs up.

I found that following patch solves this problem, but I can't explain
why it works (sorry! :-p) and I don't know following patch works
correctly on other PCICs such as i82365SL and other Intel clones.

Does anyone have same problem?  Is this solution correct?

Cheers,

hosokawa

*** sys.org/i386/isa/if_ze.c	Sun Oct 23 21:27:25 1994
--- sys/i386/isa/if_ze.c	Sat Nov 26 21:47:28 1994
***************
*** 611,617 ****
  	struct isa_device *isa_dev;
  {
  	struct ze_softc *sc = &ze_softc[isa_dev->id_unit];
! 	int i, x;
  	u_int memsize;
  	u_char iptr, memwidth, sum, tmp;
  	int slot;
--- 611,617 ----
  	struct isa_device *isa_dev;
  {
  	struct ze_softc *sc = &ze_softc[isa_dev->id_unit];
! 	int i, x, re_init_flag;
  	u_int memsize;
  	u_char iptr, memwidth, sum, tmp;
  	int slot;
***************
*** 652,657 ****
--- 652,659 ----
  	enet_addr[5] = PEEK(isa_dev->id_maddr+0xffa);
  	pcic_unmap_memory (slot, 0);
  
+ 	re_init_flag = 0;
+ re_init:
  	/*
  	 * (2) map card configuration registers.  these are offset
  	 * in card memory space by 0x20000.  normally we could get
***************
*** 753,758 ****
--- 755,764 ----
  	 * query MAM bit in misc register for 10base2
  	 */
  	tmp = inb (isa_dev->id_iobase + ZE_MISC);
+ 	if (!tmp && !re_init_flag) {
+ 		re_init_flag++;
+ 		goto re_init;
+ 	}
  	sc->mau = tmp & 0x09 ? "10base2" : "10baseT";
  
  	/* set width/size */

---
     -----------------------------------------------------------
     HOSOKAWA, Tatsumi               (hosokawa@mt.cs.keio.ac.jp)
     Dept. of Computer Science, Keio University, Yokohama, Japan
     -----------------------------------------------------------