Subject: port-i386/5177: PCMCIA port allocations may conflict with display
To: None <gnats-bugs@gnats.netbsd.org>
From: Andreas Gustafsson <gson@araneus.fi>
List: netbsd-bugs
Date: 03/19/1998 16:03:10
>Number:         5177
>Category:       port-i386
>Synopsis:       PCMCIA port allocations may conflict with display
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    gnats-admin (GNATS administrator)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Mar 19 07:05:02 1998
>Last-Modified:
>Originator:     Andreas Gustafsson
>Organization:
Araneus Information Systems Oy
>Release:        1.3
>Environment:

System: NetBSD guava.araneus.fi 1.3 NetBSD 1.3 (GUAVA) #0: Thu Feb 12 12:46:34 EET 1998 gson@guava.araneus.fi:/z/src/sys/arch/i386/compile/GUAVA i386


>Description:

NetBSD 1.3 (i386) sometimes allocates I/O port 0x3c0 to a PCMCIA
device.  This loses, because port 0x3c0 (among others) is used by the
ubiquitous VGA display adapter.  Similar lossage may also occur with
the I/O ports of other display types such as CGA or MDA, but those are
rare on PCMCIA-equipped systems.

This happens because the default PCMCIA ISA I/O port allocation range
(0x300 - 0x3FF) happens to include the ports used by VGA, and the
console drivers fail to reserve these addresses by mapping them using
bus_space_map.

>How-To-Repeat:

Attempt to boot a NetBSD 1.3 GENERIC kernel on an IBM ThinkPad 365XDT
with a D-Link DE650 Ethernet card (which, incidentally, is
misidentified as a Linksys card by NetBSD 1.3).  Notice the following
console output:

  ne2 at pcmcia0 function 0 port 0x3c0-0x3cf port 0x3d0-0x3df
  ne2: Linksys EthernetCard Ethernet
  ne2: where did the card go?

Boot the INSTALL kernel, notice that allocations now start at 0x340,
and that the card now works (although it is still misidentified as a
Linksys).

>Fix:

This could be fixed in several ways:

  1. Change pcic_isa_alloc_iobase / pcic_isa_alloc_iosize
     to exclude ports used by common display adapters

  2. Change the console drivers to bus_space_map the I/O ports
     of the display adapters

  3. Reserve the I/O ports used by common display adapters
     during machine-dependent initialization

Here is a patch which implements alternative 2. for the pccons driver
only.  If integrated, something similar needs to be added to pcvt,
too.

*** pccons.c.old	Sat Nov  1 17:02:19 1997
--- pccons.c	Wed Mar 18 21:23:26 1998
***************
*** 65,70 ****
--- 65,71 ----
  #include <machine/pc/display.h>
  #include <machine/pccons.h>
  #include <machine/conf.h>
+ #include <machine/bus.h>
  
  #include <dev/isa/isareg.h>
  #include <dev/isa/isavar.h>
***************
*** 520,525 ****
--- 521,527 ----
  {
  	struct pc_softc *sc = (void *)self;
  	struct isa_attach_args *ia = aux;
+         bus_space_handle_t ioh;
  
  	if (crtat == 0)
  		pcinit();
***************
*** 530,535 ****
--- 532,549 ----
  	sc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq, IST_EDGE,
  	    IPL_TTY, pcintr, sc);
  
+ 	/* reserve i/o ports to keep pcmcia away */
+ 
+         if (bus_space_map(ia->ia_iot, addr_6845, 0x2, 0, &ioh)) {
+ 	    printf("pc: mapping of CRTC registers failed\n");
+ 	}
+ 
+ 	if (vs.color) {
+ 	    if (bus_space_map(ia->ia_iot, 0x3C0, 0x10, 0, &ioh)) {
+ 		printf("pc: mapping of VGA registers failed\n");
+ 	    }
+ 	}
+ 	
  	/*
  	 * Look for children of the keyboard controller.
  	 * XXX Really should decouple keyboard controller
>Audit-Trail:
>Unformatted: