You seem to have put in some hard work there. Yes, your analysis is
correct. the problem has been corrected not so long ago, albeit in a
slightly different way.

As it is now the ppi bus does not attach if the bus is polled mode. But
you are saying it works in polled mode as well.

I've attached a patch that only enables the alloc and setup of the irq
in the case where PERIPH_1284 is defined. If that is defined, then the
irq alloc is attempted, but if it fails, your patch kicks in and does
not set it up in ppiopen.

The patch is against current as of 2000-05-05, so you will have
to update that part of the source. If this is not an option for
you, let me know and send me the output of ident ppi.c, so I can
make a patch for you. Mike, please let me know if this works for you.

Nicolas, could you tell me whether this is the correct thing to do? the
thing that I think is missing is somehow the possibility to use
'interrupts' even in polled mode. Basically the ppbus should simulate
the interrupt by calling the interrupt after a poll has decided that an
interrupt has occurred.

Mike, well done!

Nick
--
[EMAIL PROTECTED]
[EMAIL PROTECTED]                                          USB project
http://www.etla.net/~n_hibma/
Index: ppi.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ppbus/ppi.c,v
retrieving revision 1.22
diff -w -u -r1.22 ppi.c
--- ppi.c       2000/04/07 00:09:24     1.22
+++ ppi.c       2000/05/05 14:27:26
@@ -68,8 +68,10 @@
     int                ppi_mode;                       /* IEEE1284 mode */
     char       ppi_buffer[BUFSIZE];
 
+#ifdef PERIPH_1284
     struct resource *intr_resource;    /* interrupt resource */
     void *intr_cookie;                 /* interrupt registration cookie */
+#endif /* PERIPH_1284 */
 };
 
 #define DEVTOSOFTC(dev) \
@@ -170,13 +172,11 @@
        /* retrive the irq */
        BUS_READ_IVAR(device_get_parent(dev), dev, PPBUS_IVAR_IRQ, &irq);
 
+#ifdef PERIPH_1284
        /* declare our interrupt handler */
        ppi->intr_resource = bus_alloc_resource(dev, SYS_RES_IRQ,
                                                &zero, irq, irq, 1, RF_ACTIVE);
-       if (ppi->intr_resource == NULL) {
-               device_printf(dev, "can't allocate irq\n");
-               return (ENOMEM);
-       }
+#endif /* PERIPH_1284 */
 
        make_dev(&ppi_cdevsw, device_get_unit(dev),     /* XXX cleanup */
                 UID_ROOT, GID_WHEEL,
@@ -276,9 +276,13 @@
 
                ppi->ppi_flags |= HAVE_PPBUS;
 
+#ifdef PERIPH_1284
+               if (ppi->intr_resource) {
                /* register our interrupt handler */
                BUS_SETUP_INTR(device_get_parent(ppidev), ppidev, ppi->intr_resource,
                               INTR_TYPE_TTY, ppiintr, dev, &ppi->intr_cookie);
+               }
+#endif /* PERIPH_1284 */
        }
        ppi->ppi_count += 1;
 

Reply via email to