There is a problem in the GET_DEVICE_ID ioctl() implementation. The patch below
(against 2.6 current) fixes the code to be according to the official usb printer spec.

Most printers are not affected by this fix, as they use interface 0 and alternate 0.
For those, nothing changes. But my printer/scanner uses interface 1 for the printer.
Also attached is parts of kern.log before and after the patch.

Best regards,
Martin Habets

-----
Part of kern.log:
Apr  1 19:09:55 palantir8 kernel: usb 1-2: new full speed USB device using address 3
Apr  1 19:09:55 palantir8 kernel: usb 1-2: new device strings: Mfr=1, Product=2, 
SerialNumber=3
Apr  1 19:09:55 palantir8 kernel: 
/home/opendev/src/linux/linux-2.6.5-rc2/drivers/usb/core/message.c: USB device number 
3 default language ID 0x409
Apr  1 19:09:55 palantir8 kernel: usb 1-2: Product: USB MFP
Apr  1 19:09:55 palantir8 kernel: usb 1-2: Manufacturer: EPSON
Apr  1 19:09:55 palantir8 kernel: usb 1-2: SerialNumber: W23231910201022370
Apr  1 19:09:55 palantir8 kernel: 
/home/opendev/src/linux/linux-2.6.5-rc2/drivers/usb/core/usb.c: usb_hotplug
Apr  1 19:09:56 palantir8 kernel: usb 1-2: registering 1-2:1.0 (config #1, interface 0)
Apr  1 19:09:56 palantir8 kernel: 
/home/opendev/src/linux/linux-2.6.5-rc2/drivers/usb/core/usb.c: usb_hotplug
Apr  1 19:09:56 palantir8 kernel: usb 1-2: registering 1-2:1.1 (config #1, interface 1)
Apr  1 19:09:56 palantir8 kernel: 
/home/opendev/src/linux/linux-2.6.5-rc2/drivers/usb/core/usb.c: usb_hotplug
Apr  1 19:09:57 palantir8 kernel: usblp 1-2:1.1: usb_probe_interface
Apr  1 19:09:57 palantir8 kernel: usblp 1-2:1.1: usb_probe_interface - got id
Apr  1 19:09:57 palantir8 kernel: 
/home/opendev/src/linux/linux-2.6.5-rc2/drivers/usb/class/usblp.c: usblp0 set protocol 
2
Apr  1 19:09:57 palantir8 kernel: 
/home/opendev/src/linux/linux-2.6.5-rc2/drivers/usb/class/usblp.c: usblp_control_msg: 
rq: 0x00 dir: 1 recip: 1 value: 1 len: 0x3ff result: -32
Apr  1 19:09:57 palantir8 kernel: 
/home/opendev/src/linux/linux-2.6.5-rc2/drivers/usb/class/usblp.c: usblp0: error = -32 
reading IEEE-1284 Device ID string

After patch:
Apr  3 03:13:04 palantir8 kernel: 
/home/opendev/src/linux/linux-2.6.5-rc2/drivers/usb/class/usblp.c: usblp0 set protocol 
2
Apr  3 03:13:04 palantir8 kernel: 
/home/opendev/src/linux/linux-2.6.5-rc2/drivers/usb/class/usblp.c: usblp_control_msg: 
rq: 0x00 dir: 1 recip: 1 value: 0 idx: 256 len: 0x3ff result: 84
Apr  3 03:13:04 palantir8 kernel: 
/home/opendev/src/linux/linux-2.6.5-rc2/drivers/usb/class/usblp.c: usblp0 Device ID 
string [len=84]="MFG:EPSON;CMD:ESCPL2,BDC,D4;MDL:Stylus CX3200;CLS:PRINTER;DES:EPSON 
Stylus CX3200;"

-----

--- 2.6/drivers/usb/class/usblp.c.original      2004-03-20 00:11:03.000000000 +0000
+++ 2.6/drivers/usb/class/usblp.c       2004-04-03 04:18:19.000000000 +0100
@@ -226,11 +226,21 @@
 
 static int usblp_ctrl_msg(struct usblp *usblp, int request, int type, int dir, int 
recip, int value, void *buf, int len)
 {
-       int retval = usb_control_msg(usblp->dev,
+       int retval;
+       int index = usblp->ifnum;
+
+       /* High byte has the interface index.
+          Low byte has the alternate setting.
+        */
+       if ((request == USBLP_REQ_GET_ID) && (type == USB_TYPE_CLASS)) {
+         index = 
(usblp->ifnum<<8)|usblp->protocol[usblp->current_protocol].alt_setting;
+       }
+
+       retval = usb_control_msg(usblp->dev,
                dir ? usb_rcvctrlpipe(usblp->dev, 0) : usb_sndctrlpipe(usblp->dev, 0),
-               request, type | dir | recip, value, usblp->ifnum, buf, len, 
USBLP_WRITE_TIMEOUT);
-       dbg("usblp_control_msg: rq: 0x%02x dir: %d recip: %d value: %d len: %#x 
result: %d",
-               request, !!dir, recip, value, len, retval);
+               request, type | dir | recip, value, index, buf, len, 
USBLP_WRITE_TIMEOUT);
+       dbg("usblp_control_msg: rq: 0x%02x dir: %d recip: %d value: %d idx: %d len: 
%#x result: %d",
+               request, !!dir, recip, value, index, len, retval);
        return retval < 0 ? retval : 0;
 }
 
@@ -440,6 +450,9 @@
                goto done;
        }
 
+       dbg("usblp_ioctl: cmd=0x%x (%c nr=%d len=%d dir=%d)", cmd, _IOC_TYPE(cmd),
+               _IOC_NR(cmd), _IOC_SIZE(cmd), _IOC_DIR(cmd) );
+
        if (_IOC_TYPE(cmd) == 'P')      /* new-style ioctl number */
 
                switch (_IOC_NR(cmd)) {


-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to