Port-hpcarm archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
SA-11xx PCMCIA can't detect cards present on boot
Folks:
It looks like the vmlocking merge borked the SA-11xx PCMCIA driver's
ability to detect cards that are present on boot, which is key
to at least the hpcarm port's ability to with root on a CF card.
Looking at the changes in sys/arch/arm/sa11x0/sa11x1_pcic.c, the
initial card-attachment (and card-event thread creation) was at
one point done via a kthread... the vmlocking merge in rev. 1.14
changed it to be called directly from sacpcic_attach_common().
What this means in practical terms is that cards present at boot
don't attach presumably because other socket state (like power,
etc.) hasn't yet been set up. When card detection is deferred
until later, all works as before.
The create-one-kthread-to-spawn-another code is somewhat silly,
so I've replaced it that with socket attach finalization via
config_interrupts() instead...
Anyone have any objections to the patch below? I know the code
needs whacking to fix the device_t usage, but I don't want to
mix that up with the bugfix..
Thanks,
--rafal
--
Time is an illusion; lunchtime, doubly so. |/\/\| Rafal Boni
-- Ford Prefect |\/\/|
rafal%pobox.com@localhost
Index: sa11x1_pcic.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/sa11x0/sa11x1_pcic.c,v
retrieving revision 1.16
diff -u -p -r1.16 sa11x1_pcic.c
--- sa11x1_pcic.c 17 Oct 2007 19:53:43 -0000 1.16
+++ sa11x1_pcic.c 14 Apr 2008 03:11:40 -0000
@@ -64,6 +64,7 @@ __KERNEL_RCSID(0, "$NetBSD: sa11x1_pcic.
#include "sacpcic.h"
static int sacpcic_print(void *, const char *);
+static void sacpcic_config_intr(struct device *self);
void
sacpcic_attach_common(struct sacc_softc *psc, struct sacpcic_softc *sc,
@@ -99,17 +100,35 @@ sacpcic_attach_common(struct sacc_softc
config_found_ia(&sc->sc_pc.sc_dev, "pcmciabus", &paa,
sacpcic_print);
- sacc_intr_establish((sacc_chipset_tag_t)psc,
- i ? IRQ_S1_CDVALID : IRQ_S0_CDVALID,
- IST_EDGE_RAISE, IPL_BIO, sapcic_intr,
- &sc->sc_socket[i]);
-
/* create kthread */
sapcic_kthread_create(&sc->sc_socket[i]);
-#if 0 /* XXX */
- /* establish_intr should be after creating the kthread */
- config_interrupt(&sc->sc_socket[i], sapcic_config_intr);
-#endif
+ }
+
+ config_interrupts(&sc->sc_pc.sc_dev, sacpcic_config_intr);
+}
+
+void
+sacpcic_config_intr(struct device *self)
+{
+ struct sacpcic_softc *sc = (struct sacpcic_softc *) self;
+
+ int i;
+ for (i = 0; i < 2; i++) {
+ sacc_intr_establish(
+ (sacc_chipset_tag_t)sc->sc_socket[i].pcictag_cookie,
+ i ? IRQ_S1_CDVALID : IRQ_S0_CDVALID,
+ IST_EDGE_RAISE, IPL_BIO, sapcic_intr,
+ &sc->sc_socket[i]);
+
+ sc->sc_socket[i].laststatus =
+ (sc->sc_socket[i].pcictag->read)(&sc->sc_socket[i],
+ SAPCIC_STATUS_CARD);
+ if (sc->sc_socket[i].laststatus == SAPCIC_CARD_VALID) {
+ printf("%s: card present\n",
+ sc->sc_socket[i].sc->sc_dev.dv_xname);
+
+ pcmcia_card_attach(sc->sc_socket[i].pcmcia);
+ }
}
}
Index: sa11xx_pcic.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/sa11x0/sa11xx_pcic.c,v
retrieving revision 1.11
diff -u -p -r1.11 sa11xx_pcic.c
--- sa11xx_pcic.c 6 Dec 2007 17:00:31 -0000 1.11
+++ sa11xx_pcic.c 14 Apr 2008 03:11:40 -0000
@@ -124,14 +124,6 @@ sapcic_kthread_create(void *arg)
mutex_init(&so->sc->sc_lock, MUTEX_DEFAULT, IPL_NONE);
- so->laststatus = (so->pcictag->read)(so, SAPCIC_STATUS_CARD);
- if (so->laststatus == SAPCIC_CARD_VALID) {
- printf("%s: card present\n",
- so->sc->sc_dev.dv_xname);
-
- pcmcia_card_attach(so->pcmcia);
- }
-
if (kthread_create(PRI_NONE, 0, NULL, sapcic_event_thread, so,
&so->event_thread, "%s,%d", so->sc->sc_dev.dv_xname, so->socket)) {
printf("%s: unable to create event thread for socket %d\n",
Home |
Main Index |
Thread Index |
Old Index