The attached patch fixes an issue I have with ulpt and my Brother
HL1240 laser printer.  Sending a request with bmRequestType =
UT_WRITE_CLASS_OTHER causes the printer to disconnect from the usb bus
which appears to act as a hard reset.  If no objections I'll commit in
a few days.

Joe
Index: sys/dev/usbmisc/ulpt/ulpt.c
===================================================================
RCS file: /home/dcvs/src/sys/dev/usbmisc/ulpt/ulpt.c,v
retrieving revision 1.24
diff -u -r1.24 ulpt.c
--- sys/dev/usbmisc/ulpt/ulpt.c 6 Nov 2007 07:37:01 -0000       1.24
+++ sys/dev/usbmisc/ulpt/ulpt.c 7 Feb 2008 11:39:41 -0000
@@ -116,6 +116,8 @@
 
        int sc_refcnt;
        u_char sc_dying;
+       int vendor;
+       int product;
 };
 
 static d_open_t ulptopen;
@@ -256,6 +258,8 @@
 
        sc->sc_in = -1;
        sc->sc_out = -1;
+       sc->vendor = uaa->vendor;
+       sc->product = uaa->product;
        for (i = 0; i < epcount; i++) {
                ed = usbd_interface2endpoint_descriptor(iface, i);
                if (ed == NULL) {
@@ -365,6 +369,10 @@
 ulpt_reset(struct ulpt_softc *sc)
 {
        usb_device_request_t req;
+       int other_fails;
+
+       /* The Brother HL1240 doesn't handle UT_WRITE_CLASS_OTHER */
+       other_fails = (sc->vendor == 0x04f9 && sc->product == 0x0006);
 
        DPRINTFN(1, ("ulpt_reset\n"));
        req.bRequest = UR_SOFT_RESET;
@@ -379,7 +387,8 @@
         * so we try both.
         */
        req.bmRequestType = UT_WRITE_CLASS_OTHER;
-       if (usbd_do_request(sc->sc_udev, &req, 0)) {    /* 1.0 */
+       /* Some printers don't handle UT_WRITE_CLASS_OTHER */
+       if (other_fails || usbd_do_request(sc->sc_udev, &req, 0)) {/* 1.0 */
                req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
                (void)usbd_do_request(sc->sc_udev, &req, 0); /* 1.1 */
        }

Reply via email to