Subject: Re: kern/30284
To: None <kern-bug-people@netbsd.org, gnats-admin@netbsd.org,>
From: Ja'far Railton <zen25058@zen.co.uk>
List: netbsd-bugs
Date: 06/05/2005 23:33:04
The following reply was made to PR kern/30284; it has been noted by GNATS.
From: "Ja'far Railton" <zen25058@zen.co.uk>
To: gnats-bugs@netbsd.org
Cc:
Subject: Re: kern/30284
Date: Mon, 6 Jun 2005 02:39:50 +0307
----- Forwarded message from Christos Zoulas <christos@tac.gw.com> -----
Try this patch:
Index: pccbb.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/pccbb.c,v
retrieving revision 1.96.2.2
diff -u -u -r1.96.2.2 pccbb.c
--- pccbb.c 28 Jul 2004 21:33:34 -0000 1.96.2.2
+++ pccbb.c 2 Jun 2005 22:50:09 -0000
@@ -100,16 +100,16 @@
#define DELAY_MS(time, param) \
do { \
if (cold == 0) { \
- int tick = (hz*(time))/1000; \
+ int xtick = (hz*(time))/1000; \
\
- if (tick <= 1) { \
- tick = 2; \
+ if (xtick <= 1) { \
+ xtick = 2; \
} \
- tsleep((void *)(param), PWAIT, "pccbb", tick); \
+ tsleep((void *)(param), PWAIT, "pccbb", xtick); \
} else { \
delay((time)*1000); \
} \
- } while (0)
+ } while (/*CONSTCOND*/0)
int pcicbbmatch __P((struct device *, struct cfdata *, void *));
void pccbbattach __P((struct device *, struct device *, void *));
@@ -184,6 +184,7 @@
void *));
STATIC void pccbb_pcmcia_socket_enable __P((pcmcia_chipset_handle_t));
STATIC void pccbb_pcmcia_socket_disable __P((pcmcia_chipset_handle_t));
+STATIC void pccbb_pcmcia_socket_settype(pcmcia_chipset_handle_t, int);
STATIC int pccbb_pcmcia_card_detect __P((pcmcia_chipset_handle_t pch));
static void pccbb_pcmcia_do_io_map __P((struct pcic_handle *, int));
@@ -242,6 +243,7 @@
pccbb_pcmcia_intr_disestablish,
pccbb_pcmcia_socket_enable,
pccbb_pcmcia_socket_disable,
+ pccbb_pcmcia_socket_settype,
pccbb_pcmcia_card_detect
};
@@ -437,7 +439,7 @@
sc->sc_chipset = cb_chipset(pa->pa_id, &flags);
- pci_devinfo(pa->pa_id, 0, 0, devinfo);
+ pci_devinfo(pa->pa_id, 0, 0, devinfo, sizeof(devinfo));
printf(": %s (rev. 0x%02x)", devinfo, PCI_REVISION(pa->pa_class));
#ifdef CBB_DEBUG
printf(" (chipflags %x)", flags);
@@ -1414,6 +1416,29 @@
return 1; /* power changed correctly */
}
+STATIC void
+pccbb_pcmcia_socket_settype(pch, type)
+ pcmcia_chipset_handle_t pch;
+ int type;
+{
+ struct pcic_handle *ph = (struct pcic_handle *)pch;
+ u_int8_t intr;
+
+ /* set the card type */
+
+ intr = Pcic_read(ph, PCIC_INTR);
+ intr &= ~(PCIC_INTR_IRQ_MASK | PCIC_INTR_CARDTYPE_MASK);
+ if (type == PCMCIA_IFTYPE_IO)
+ intr |= PCIC_INTR_CARDTYPE_IO;
+ else
+ intr |= PCIC_INTR_CARDTYPE_MEM;
+ Pcic_write(ph, PCIC_INTR, intr);
+
+ DPRINTF(("%s: pccbb_pcmcia_socket_settype %02x type %s %02x\n",
+ ph->ph_parent->dv_xname, ph->sock,
+ ((type == PCMCIA_IFTYPE_IO) ? "io" : "mem"), intr));
+}
+
#if defined CB_PCMCIA_POLL
struct cb_poll_str {
void *arg;
@@ -2403,7 +2428,7 @@
{
struct pcic_handle *ph = (struct pcic_handle *)pch;
struct pccbb_softc *sc = (struct pccbb_softc *)ph->ph_parent;
- int cardtype, win;
+ int win;
u_int8_t power, intr;
pcireg_t spsr;
int voltage;
@@ -2497,22 +2522,6 @@
return;
}
- /* zero out the address windows */
-
- Pcic_write(ph, PCIC_ADDRWIN_ENABLE, 0);
-
- /* set the card type */
-
- cardtype = pcmcia_card_gettype(ph->pcmcia);
-
- intr |= ((cardtype == PCMCIA_IFTYPE_IO) ?
- PCIC_INTR_CARDTYPE_IO : PCIC_INTR_CARDTYPE_MEM);
- Pcic_write(ph, PCIC_INTR, intr);
-
- DPRINTF(("%s: pccbb_pcmcia_socket_enable %02x cardtype %s %02x\n",
- ph->ph_parent->dv_xname, ph->sock,
- ((cardtype == PCMCIA_IFTYPE_IO) ? "io" : "mem"), intr));
-
/* reinstall all the memory and io mappings */
for (win = 0; win < PCIC_MEM_WINS; ++win) {
----- End forwarded message -----
--
Well done!