Date: Mon, 15 Dec 2003 12:48:20 +0300 From: =?Windows-1251?B?x+Dp6u7iINEuwy4=?= <zs060174@uic.tula.ru> To: FreeBSD-gnats-submit@FreeBSD.org Subject: kern/60248: Problem with USB printer HP LaserJet 1300 Message-ID: <1928717640.20031215124820@uic.tula.ru> Resent-Message-ID: <200312150950.hBF9oKfT033598@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 60248 >Category: kern >Synopsis: Problem with USB printer HP LaserJet 1300 >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Mon Dec 15 01:50:20 PST 2003 >Closed-Date: >Last-Modified: >Originator: úÁÊËÏ× ó.ç. >Release: FreeBSD 4.9-RELEASE-p1 i386 >Organization: <organization of PR author (multiple lines)> >Environment: System: FreeBSD acc.acc.tula.ru 4.9-RELEASE-p1 FreeBSD 4.9-RELEASE-p1 #13: Sun Dec 14 18:54:10 MSK 2003 acc107_3@acc.acc.tula.ru:/usr/obj/usr/src/sys/Z i386 <machine, os, target, libraries (multiple lines)> >Description: <precise description of the problem (multiple lines)> I have a USB printer HP LaserJet 1300. My FreeBSD detected it as "ugen" device instead "ulpt" device. ugen0: Hewlett-Packard hp LaserJet 1300, rev 1.10/1.00, addr 2 >How-To-Repeat: allways :) >Fix: patch with --ignore-whitespace --Sr1nOIr3CvdE5hEN - --- ulpt.c.orig Fri May 2 15:50:58 2003 +++ ulpt.c Fri May 2 15:56:40 2003 @@ -174,7 +174,8 @@ id->bInterfaceClass == UICLASS_PRINTER && id->bInterfaceSubClass == UISUBCLASS_PRINTER && (id->bInterfaceProtocol == UIPROTO_PRINTER_UNI || - id->bInterfaceProtocol == UIPROTO_PRINTER_BI)) + id->bInterfaceProtocol == UIPROTO_PRINTER_BI || + id->bInterfaceProtocol == UIPROTO_PRINTER_1284)) return (UMATCH_IFACECLASS_IFACESUBCLASS_IFACEPROTO); return (UMATCH_NONE); } @@ -183,79 +184,63 @@ { USB_ATTACH_START(ulpt, sc, uaa); usbd_device_handle dev = uaa->device; + + usb_config_descriptor_t *cdesc; + usbd_interface_handle iface = uaa->iface; - usb_interface_descriptor_t *id = usbd_get_interface_descriptor(iface); + usb_interface_descriptor_t *ifcd = usbd_get_interface_descriptor(iface); + usb_interface_descriptor_t *id, *iend; char devinfo[1024]; usb_endpoint_descriptor_t *ed; usbd_status err; + u_int8_t epcount; + int i, altno; DPRINTFN(10,("ulpt_attach: sc=%p\n", sc)); usbd_devinfo(dev, 0, devinfo); USB_ATTACH_SETUP; - printf("%s: %s, iclass %d/%d\n", USBDEVNAME(sc->sc_dev), - devinfo, id->bInterfaceClass, id->bInterfaceSubClass); - /* Figure out which endpoint is the bulk out endpoint. */ - ed = usbd_interface2endpoint_descriptor(iface, 0); - if (ed == NULL) - goto nobulk; - if (UE_GET_DIR(ed->bEndpointAddress) != UE_DIR_OUT || - (ed->bmAttributes & UE_XFERTYPE) != UE_BULK) { - /* In case we are using a bidir protocol... */ - ed = usbd_interface2endpoint_descriptor(iface, 1); - if (ed == NULL) - goto nobulk; - if (UE_GET_DIR(ed->bEndpointAddress) != UE_DIR_OUT || - (ed->bmAttributes & UE_XFERTYPE) != UE_BULK) - goto nobulk; - } - sc->sc_bulk = ed->bEndpointAddress; - DPRINTFN(10, ("ulpt_attach: bulk=%d\n", sc->sc_bulk)); - - sc->sc_iface = iface; - err = usbd_interface2device_handle(iface, &sc->sc_udev); - if (err) { - sc->sc_dying = 1; - USB_ATTACH_ERROR_RETURN; - } - sc->sc_ifaceno = id->bInterfaceNumber; - -#if 0 -/* - * This code is disabled because for some mysterious reason it causes - * printing not to work. But only sometimes, and mostly with - * UHCI and less often with OHCI. *sigh* - */ - { - usb_config_descriptor_t *cd = usbd_get_config_descriptor(dev); - usb_device_request_t req; - int len, alen; - - req.bmRequestType = UT_READ_CLASS_INTERFACE; - req.bRequest = UR_GET_DEVICE_ID; - USETW(req.wValue, cd->bConfigurationValue); - USETW2(req.wIndex, id->bInterfaceNumber, id->bAlternateSetting); - USETW(req.wLength, sizeof devinfo - 1); - err = usbd_do_request_flags(dev, &req, devinfo, USBD_SHORT_XFER_OK, - &alen); - if (err) { - printf("%s: cannot get device id\n", USBDEVNAME(sc->sc_dev)); - } else if (alen <= 2) { - printf("%s: empty device id, no printer connected?\n", - USBDEVNAME(sc->sc_dev)); - } else { - /* devinfo now contains an IEEE-1284 device ID */ - len = ((devinfo[0] & 0xff) << 8) | (devinfo[1] & 0xff); - if (len > sizeof devinfo - 3) - len = sizeof devinfo - 3; - devinfo[len] = 0; - printf("%s: device id <", USBDEVNAME(sc->sc_dev)); - ieee1284_print_id(devinfo+2); - printf(">\n"); - } - } + cdesc = usbd_get_config_descriptor(dev); + if (cdesc == NULL) { + printf("%s: failed to get configuration descriptor\n", + USBDEVNAME(sc->sc_dev)); + USB_ATTACH_ERROR_RETURN; + } + iend = (usb_interface_descriptor_t *) + ((char *)cdesc + UGETW(cdesc->wTotalLength)); +#ifdef DIAGNOSTIC + if (ifcd < (usb_interface_descriptor_t *)cdesc || + ifcd >= iend) + panic("ulpt: iface desc out of range\n"); #endif - + /* Step through all the descriptors looking for bidir mode */ + for (id = ifcd, altno = 0; + id < iend; + id = (void *)((char *)id + id->bLength)) { + if (id->bDescriptorType == UDESC_INTERFACE && + id->bInterfaceNumber == ifcd->bInterfaceNumber) { + if (id->bInterfaceClass == UICLASS_PRINTER && + id->bInterfaceSubClass == UISUBCLASS_PRINTER && + id->bInterfaceProtocol == UIPROTO_PRINTER_BI) { + DPRINTF(("ulpt_attach: set altno = %d\n", altno)); + err = usbd_set_interface(iface, altno); + if (err == 0) { + printf("%s: %s, iclass %d/%d-%d(%d)\n",USBDEVNAME(sc->sc_dev), + devinfo, id->bInterfaceClass, id->bInterfaceSubClass, + id->bInterfaceNumber+id->bAlternateSetting,id->bInterfaceProtocol); + epcount = 0; + (void)usbd_endpoint_count(iface, &epcount); + for (i = 0; i < epcount; i++) { + ed = usbd_interface2endpoint_descriptor(iface, i); + if (ed != NULL) { + if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT && + (ed->bmAttributes & UE_XFERTYPE) == UE_BULK) { + sc->sc_bulk = ed->bEndpointAddress; + DPRINTFN(10, ("ulpt_attach: bulk=%d\n",sc->sc_bulk)); + sc->sc_iface = iface; + err = usbd_interface2device_handle(iface,&sc->sc_udev); + if (err == 0) { + sc->sc_ifaceno = id->bInterfaceNumber; #if defined(__FreeBSD__) sc->dev = make_dev(&ulpt_cdevsw, device_get_unit(self), UID_ROOT, GID_OPERATOR, 0644, "ulpt%d", device_get_unit(self)); @@ -263,10 +248,17 @@ device_get_unit(self)|ULPT_NOPRIME, UID_ROOT, GID_OPERATOR, 0644, "unlpt%d", device_get_unit(self)); #endif - USB_ATTACH_SUCCESS_RETURN; - - nobulk: + } + } + } + } + } + } + altno++; + } + } + id = ifcd; /* not found, use original */ printf("%s: could not find bulk endpoint\n", USBDEVNAME(sc->sc_dev)); sc->sc_dying = 1; USB_ATTACH_ERROR_RETURN; --Sr1nOIr3CvdE5hEN-- >Release-Note: >Audit-Trail: >Unformatted: To: FreeBSD-gnats-submit@freebsd.org From:zs060174@uic.tula.ru Reply-To:zs060174@uic.tula.ru Cc: X-send-pr-version: 3.113 X-GNATS-Notify:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1928717640.20031215124820>