Hi all,

I make 2 patches for NEWCARD.
one is to supoort to suspend/resume PC Card devices on NEWCARD.
other is to ignore ghost interrupt at ed driver when removing PC Card.

It is a quick hack and I only tested on my NotePC, Sony VAIO 818.
So I don't know my patches work fine on other NotePC.

Please try if you have interest to my patches.
Thanks,

-------
YAMAMOTO Shigeru        <[EMAIL PROTECTED]>
Index: sys/dev/pccbb/pccbb.c
===================================================================
RCS file: /share/cvsup/FreeBSD/current/usr/src/sys/dev/pccbb/pccbb.c,v
retrieving revision 1.27
diff -u -r1.27 pccbb.c
--- sys/dev/pccbb/pccbb.c       3 Nov 2001 16:45:31 -0000       1.27
+++ sys/dev/pccbb/pccbb.c       18 Nov 2001 19:37:52 -0000
@@ -2096,14 +2096,112 @@
            b, s, f, reg, val, width);
 }
 
+static
+int
+pccbb_suspend(device_t dev) {
+       int                     error = 0;
+       struct pccbb_softc*     sc = device_get_softc(dev);
+       int                     numdevs;
+       device_t*               devlist;
+       int                     tmp;
+
+       bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_intrhand);
+
+       device_get_children(dev, &devlist, &numdevs);
+
+       error = 0;
+       for (tmp = 0; tmp < numdevs; tmp++) {
+               if (device_detach(devlist[tmp]) == 0) {
+                       device_delete_child(dev, devlist[tmp]);
+               }
+               else {
+                       error++;
+               }
+       }
+       free(devlist, M_TEMP);
+       if (error > 0) {
+               return ENXIO;
+       }
+
+       sc->sc_cbdev = NULL;
+       sc->sc_pccarddev = NULL;
+
+       return(error);
+}
+
+static
+int
+pccbb_resume(device_t self)
+{
+       int     error = 0;
+       struct pccbb_softc *sc = (struct pccbb_softc *)device_get_softc(self);
+
+       pci_write_config(self, PCCBBR_SOCKBASE,
+                               rman_get_start(sc->sc_base_res), 4);
+       DEVPRINTF((self, "PCI Memory allocated: %08lx\n",
+                               rman_get_start(sc->sc_base_res)));
+
+       pccbb_chipinit(sc);
+
+       /* CSC Interrupt: Card detect interrupt on */
+       sc->sc_socketreg->socket_mask |= PCCBB_SOCKET_MASK_CD;
+
+       /* reset interrupt */
+       {
+               u_int32_t tmp;
+
+               tmp = sc->sc_socketreg->socket_event;
+               sc->sc_socketreg->socket_event = tmp;
+       }
+
+       /* establish the interrupt. */
+       if (bus_setup_intr(self, sc->sc_irq_res, INTR_TYPE_BIO, pccbb_intr, sc,
+           &(sc->sc_intrhand))) {
+               device_printf(self, "couldn't establish interrupt");
+               bus_release_resource(self, SYS_RES_IRQ, 0, sc->sc_irq_res);
+               bus_release_resource(self, SYS_RES_MEMORY, PCCBBR_SOCKBASE,
+                   sc->sc_base_res);
+               mtx_destroy(&sc->sc_mtx);
+               error = ENOMEM;
+       }
+
+       /* attach children */
+       if (!error) {
+               sc->sc_cbdev = device_add_child(self, "cardbus", -1);
+               if (sc->sc_cbdev == NULL)
+                       DEVPRINTF((self, "WARNING: cannot add cardbus bus.\n"));
+               else if (device_probe_and_attach(sc->sc_cbdev) != 0) {
+                       DEVPRINTF((self, "WARNING: cannot attach cardbus bus!\n"));
+                       sc->sc_cbdev = NULL;
+               }
+
+               sc->sc_pccarddev = device_add_child(self, "pccard", -1);
+               if (sc->sc_pccarddev == NULL)
+                       DEVPRINTF((self, "WARNING: cannot add pccard bus.\n"));
+               else if (device_probe_and_attach(sc->sc_pccarddev) != 0) {
+                       DEVPRINTF((self, "WARNING: cannot attach pccard bus.\n"));
+                       sc->sc_pccarddev = NULL;
+               }
+       }
+
+       /* wakeup thread */
+       if (!error) {
+               mtx_lock(&sc->sc_mtx);
+               wakeup(sc);
+               mtx_unlock(&sc->sc_mtx);
+       }
+
+       return(error);
+}
+
 static device_method_t pccbb_methods[] = {
        /* Device interface */
        DEVMETHOD(device_probe,                 pccbb_probe),
        DEVMETHOD(device_attach,                pccbb_attach),
        DEVMETHOD(device_detach,                pccbb_detach),
        DEVMETHOD(device_shutdown,              pccbb_shutdown),
-       DEVMETHOD(device_suspend,               bus_generic_suspend),
-       DEVMETHOD(device_resume,                bus_generic_resume),
+       DEVMETHOD(device_suspend,               pccbb_suspend),
+       DEVMETHOD(device_resume,                pccbb_resume),
 
        /* bus methods */
        DEVMETHOD(bus_print_child,              bus_generic_print_child),
Index: sys/dev/ed/if_ed.c
===================================================================
RCS file: /share/cvsup/FreeBSD/current/usr/src/sys/dev/ed/if_ed.c,v
retrieving revision 1.206
diff -u -r1.206 if_ed.c
--- sys/dev/ed/if_ed.c  4 Nov 2001 22:56:20 -0000       1.206
+++ sys/dev/ed/if_ed.c  11 Nov 2001 15:25:52 -0000
@@ -2296,7 +2296,7 @@
        /*
         * loop until there are no more new interrupts
         */
-       while ((isr = ed_nic_inb(sc, ED_P0_ISR)) != 0) {
+       while ((isr = ed_nic_inb(sc, ED_P0_ISR)) != 0 && isr != 0xff) {
 
                /*
                 * reset all the bits that we are 'acknowledging' by writing a

Reply via email to