Commit 83d55856 authored by Martin Habets's avatar Martin Habets Committed by Greg Kroah-Hartman

[PATCH] USB: usblp printer GET_DEVICE_ID fix

There is a problem in the usblp 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.
parent 91d7f4e3
...@@ -226,11 +226,21 @@ extern struct usb_driver usblp_driver; ...@@ -226,11 +226,21 @@ extern struct usb_driver usblp_driver;
static int usblp_ctrl_msg(struct usblp *usblp, int request, int type, int dir, int recip, int value, void *buf, int len) 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), dir ? usb_rcvctrlpipe(usblp->dev, 0) : usb_sndctrlpipe(usblp->dev, 0),
request, type | dir | recip, value, usblp->ifnum, buf, len, USBLP_WRITE_TIMEOUT); request, type | dir | recip, value, index, buf, len, USBLP_WRITE_TIMEOUT);
dbg("usblp_control_msg: rq: 0x%02x dir: %d recip: %d value: %d len: %#x result: %d", dbg("usblp_control_msg: rq: 0x%02x dir: %d recip: %d value: %d idx: %d len: %#x result: %d",
request, !!dir, recip, value, len, retval); request, !!dir, recip, value, index, len, retval);
return retval < 0 ? retval : 0; return retval < 0 ? retval : 0;
} }
...@@ -440,6 +450,9 @@ static int usblp_ioctl(struct inode *inode, struct file *file, unsigned int cmd, ...@@ -440,6 +450,9 @@ static int usblp_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
goto done; 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 */ if (_IOC_TYPE(cmd) == 'P') /* new-style ioctl number */
switch (_IOC_NR(cmd)) { switch (_IOC_NR(cmd)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment