From owner-freebsd-mobile Sun Oct 13 23:27:06 1996 Return-Path: owner-mobile Received: (from root@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id XAA01280 for mobile-outgoing; Sun, 13 Oct 1996 23:27:06 -0700 (PDT) Received: from genesis.atrad.adelaide.edu.au (genesis.atrad.adelaide.edu.au [129.127.96.120]) by freefall.freebsd.org (8.7.5/8.7.3) with ESMTP id XAA01253 for ; Sun, 13 Oct 1996 23:26:51 -0700 (PDT) Received: from msmith@localhost by genesis.atrad.adelaide.edu.au (8.6.12/8.6.9) id PAA13513; Mon, 14 Oct 1996 15:56:35 +0930 From: Michael Smith Message-Id: <199610140626.PAA13513@genesis.atrad.adelaide.edu.au> Subject: Re: Working PCMCIA/CD-ROM/Modem/ethernet? To: nate@mt.sri.com (Nate Williams) Date: Mon, 14 Oct 1996 15:56:34 +0930 (CST) Cc: mobile@freebsd.org In-Reply-To: <199610140618.AAA29097@rocky.mt.sri.com> from "Nate Williams" at Oct 14, 96 00:18:56 am MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: owner-mobile@freebsd.org X-Loop: FreeBSD.org Precedence: bulk Nate Williams stands accused of saying: > > > I was referring > > to this patch, which attempts to make the pccard probe in if_ed.c work > > with non-memory-mapped cards. Obviously the printf()s are bogus; what > > is needed is someone with a shared-memory 'ed' card to verify that > > this still finds their card OK. The probe as it stands in -current > > doesn't even consider PIO-only cards. > > Can you send this to the mobile list, since I don't have any ED cards to > test it with (either desktop or laptop). Done. People - anyone with an 'ed' card (PCCard or desktop), please test this and _let_us_know_if_it_works_ for you! (patch below). > > This is still partly broken in that my card at least doesn't wake up > > out of suspend properly, but it means that the system doesn't hang > > forever when I suspend and when it comes back a remove/reinsert gets > > the card going again. > > AFAIK, *NONE* of the cards correctly wakeup out of suspend properly yet. > I know mine doesn't (3C589[BC], as it requires the same remove/insert > that you have to do. I think the only sensible way to handle a suspend is to "eject" the cards as part of the suspend process, and then treat any cards that are present on resume as new insertions; attempting to maintain state across suspends is just stupid. > Nate > > ps. Sorry for not getting back to you sooner with this! That's OK; I'm sorry I haven't pursued the matter harder earlier - I've had this patch in one form or another since July or so, but the machine it's running on keeps getting borrowed from me and taken elsewhere 8( *** /sys/i386/isa/if_ed.c Wed Aug 7 17:05:39 1996 --- if_ed.c Wed Aug 14 11:08:43 1996 *************** *** 226,232 **** */ static void edsuspend(struct pccard_dev *dp) ! { printf("ed%d: suspending\n", dp->isahd.id_unit); } --- 226,242 ---- */ static void edsuspend(struct pccard_dev *dp) ! { ! struct ed_softc *sc = &ed_softc[dp->isahd.id_unit]; ! /* ! * Some 'ed' cards will generate a interrupt as they go away, ! * and by the time the interrupt handler gets to the card, ! * the interrupt can't be cleared. ! * By setting gone here, we tell the handler to ignore the ! * interrupt when it happens. ! */ ! sc->gone = 1; /* avoid spinning endlessly in interrupt handler */ ! printf("ed%d: suspending\n", dp->isahd.id_unit); } *************** *** 254,260 **** --- 264,273 ---- return(ENXIO); if (ed_attach_isa(&dp->isahd)==0) return(ENXIO); + } else { + sc->gone = 0; /* reenable after a suspend */ } + /* * XXX TODO: * If it was initialized before, the device structure *************** *** 1364,1474 **** #if NCRD > 0 /* ! * Probe and vendor-specific initialization routine for PCCARDs */ static int ed_probe_pccard(isa_dev, ether) struct isa_device *isa_dev; u_char *ether; { ! struct ed_softc *sc = &ed_softc[isa_dev->id_unit]; ! int i; ! u_int memsize; ! u_char isa16bit; ! ! sc->nic_addr = isa_dev->id_iobase; ! sc->gone = 0; ! sc->is790 = 0; ! sc->cr_proto = ED_CR_RD2; ! sc->vendor = ED_VENDOR_PCCARD; ! sc->type = 0; ! sc->type_str = "PCCARD"; ! sc->kdc.kdc_description = "PCCARD Ethernet"; ! sc->mem_size = isa_dev->id_msize = memsize = 16384; ! sc->isa16bit = isa16bit = 1; ! ! for (i = 0; i < ETHER_ADDR_LEN; ++i) ! sc->arpcom.ac_enaddr[i] = ether[i]; ! ! #if ED_DEBUG ! printf("type = %x type_str=%s isa16bit=%d memsize=%d id_msize=%d\n", ! sc->type, sc->type_str, isa16bit, memsize, isa_dev->id_msize); ! #endif ! ! i = inb(sc->nic_addr + ED_PC_RESET); ! DELAY(100000); ! outb(sc->nic_addr + ED_PC_RESET,i); ! DELAY(100000); ! i = inb(sc->nic_addr + ED_PC_MISC); ! if (!i) { ! int j; ! printf("ed_probe_pccard: possible failure\n"); ! for (j=0;j<20 && !i;j++) { ! printf("."); ! DELAY(100000); ! i = inb(sc->nic_addr + ED_PC_MISC); ! } ! if (!i) { ! printf("dead :-(\n"); ! return 0; ! } ! printf("\n"); ! } ! /* ! * Set initial values for width/size. ! */ ! ! /* Make sure that we really have an 8390 based board */ ! if (!ed_probe_generic8390(sc)) { ! printf("ed_probe_generic8390 failed\n"); ! return (0); ! } ! sc->txb_cnt = 2; ! sc->tx_page_start = ED_PC_PAGE_OFFSET; ! sc->rec_page_start = sc->tx_page_start + ED_TXBUF_SIZE * sc->txb_cnt; ! sc->rec_page_stop = sc->tx_page_start + memsize / ED_PAGE_SIZE; ! ! sc->mem_shared = 1; ! sc->mem_start = (caddr_t) isa_dev->id_maddr; ! sc->mem_size = memsize; ! sc->mem_end = sc->mem_start + memsize; ! ! sc->mem_ring = sc->mem_start + ! sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE; ! ! /* ! * Now zero memory and verify that it is clear ! */ ! bzero(sc->mem_start, memsize); ! ! for (i = 0; i < memsize; ++i) { ! if (sc->mem_start[i]) { ! printf("ed%d: failed to clear shared memory at %lx - check configuration\n", ! isa_dev->id_unit, kvtop(sc->mem_start + i)); ! return (0); ! } ! sc->mem_start[i] = (i - 5) & 0xff; ! } ! for (i = 0; i < memsize; ++i) { ! if ((sc->mem_start[i] & 0xff) != ((i - 5) & 0xff)) { ! printf("ed%d: shared memory failed at %lx (%x != %x) - check configuration\n", ! isa_dev->id_unit, kvtop(sc->mem_start + i), ! sc->mem_start[i], (i-5) & 0xff); ! return (0); ! } ! } ! i = inb(sc->nic_addr + ED_PC_MISC); ! if (!i) { ! printf("ed_probe_pccard: possible failure(2)\n"); ! } ! /* clear any pending interupts that we may have caused */ ! outb(sc->nic_addr + ED_P0_ISR, 0xff); ! return (ED_PC_IO_PORTS); } #endif /* NCRD > 0 */ --- 1377,1414 ---- #if NCRD > 0 /* ! * Probe framework for pccards. Replicates the standard framework, ! * minus the pccard driver registration and ignores the ether address ! * supplied (from the CIS), relying on the probe to find it instead. */ static int ed_probe_pccard(isa_dev, ether) struct isa_device *isa_dev; u_char *ether; { ! int nports; ! printf("ed_probe_pccard: try WD80x3\n"); ! nports = ed_probe_WD80x3(isa_dev); ! if (nports) ! return (nports); ! printf("ed_probe_pccard: try 3Com\n"); ! nports = ed_probe_3Com(isa_dev); ! if (nports) ! return (nports); ! printf("ed_probe_pccard: try NEx000\n"); ! nports = ed_probe_Novell(isa_dev); ! if (nports) ! return (nports); ! printf("ed_probe_pccard: try HP PClan\n"); ! nports = ed_probe_HP_pclanp(isa_dev); ! if (nports) ! return (nports); ! return (0); } #endif /* NCRD > 0 */ -- ]] Mike Smith, Software Engineer msmith@atrad.adelaide.edu.au [[ ]] Genesis Software genesis@atrad.adelaide.edu.au [[ ]] High-speed data acquisition and (GSM mobile) 0411-222-496 [[ ]] realtime instrument control (ph/fax) +61-8-267-3039 [[ ]] Collector of old Unix hardware. "Where are your PEZ?" The Tick [[