Hi Michael, and thanks for your very detailed bugreport, it's greatly
appreciated.
Without much insight into your specific problem, would the (quite invasive)
attached patch solve your problem ? It's the "backport" of latest upstream
CUPS libusb backend over 1.5.3-2.3 .
Le samedi, 20 octobre 2012 01.03:40, Michael Biebl a écrit :
> On a different note: I don't quite understand, by you modprobe the usblp
> module on upgrades, but not in the init script
>
> If the module is needed, shouldn't you also load it when you reboot?
> If it's not needed, why the modprobe?
Well... As far as I understand it (and I'm a young cups bird), the module
should either be loaded by default or on-demand. It has been blacklisted for a
while so the postinst ensures that a non-rebooted system upgraded through
these versions would get a loaded module. I think (but might be wrong), that
the module would otherwise be loaded.
Looking forward for the results of the attached patch!
Cheers,
OdyX
--- a/backend/usb-libusb.c
+++ b/backend/usb-libusb.c
@@ -70,7 +70,7 @@
read_endp, /* Read endpoint */
protocol, /* Protocol: 1 = Uni-di, 2 = Bi-di. */
usblp_attached, /* "usblp" kernel module attached? */
- opened_for_job; /* Set to 1 by print_device() */
+ reset_after_job; /* Set to 1 by print_device() */
unsigned int quirks; /* Quirks flags */
struct libusb_device_handle *handle; /* Open handle to device */
} usb_printer_t;
@@ -122,6 +122,8 @@
#define USBLP_QUIRK_USB_INIT 0x2 /* needs vendor USB init string */
#define USBLP_QUIRK_BAD_CLASS 0x4 /* descriptor uses vendor-specific
Class or SubClass */
+#define USBLP_QUIRK_RESET 0x4000 /* After printing do a reset
+ for clean-up */
#define USBLP_QUIRK_NO_REATTACH 0x8000 /* After printing we cannot re-attach
the usblp kernel module */
@@ -141,15 +143,41 @@
{ 0x0409, 0xf1be, USBLP_QUIRK_BIDIR }, /* NEC Picty800 (HP OEM) */
{ 0x0482, 0x0010, USBLP_QUIRK_BIDIR }, /* Kyocera Mita FS 820,
by zut <[email protected]> */
+ { 0x04a9, 0x10a2, USBLP_QUIRK_BIDIR }, /* Canon, Inc. PIXMA iP4200
+ Printer, http://www.cups.org/str.php?L4155 */
+ { 0x04a9, 0x10b6, USBLP_QUIRK_BIDIR }, /* Canon, Inc. PIXMA iP4300
+ Printer, https://bugs.launchpad.net/bugs/1032385 */
+ { 0x04a9, 0x170c, USBLP_QUIRK_BIDIR }, /* Canon, Inc. MP500
+ Printer, https://bugs.launchpad.net/bugs/1032456 */
+ { 0x04a9, 0x1717, USBLP_QUIRK_BIDIR }, /* Canon, Inc. MP510
+ Printer, https://bugs.launchpad.net/bugs/1050009 */
+ { 0x04a9, 0x173d, USBLP_QUIRK_BIDIR }, /* Canon, Inc. MP550
+ Printer, http://www.cups.org/str.php?L4155 */
+ { 0x04a9, 0x173e, USBLP_QUIRK_BIDIR }, /* Canon, Inc. MP560
+ Printer, http://www.cups.org/str.php?L4155 */
+ { 0x04f9, 0x001a, USBLP_QUIRK_NO_REATTACH }, /* Brother Industries, Ltd
+ HL-1430 Laser Printer,
+ https://bugs.launchpad.net/bugs/1038695 */
{ 0x04f9, 0x000d, USBLP_QUIRK_BIDIR |
USBLP_QUIRK_NO_REATTACH }, /* Brother Industries, Ltd
- HL-1440 Laser Printer */
+ HL-1440 Laser Printer,
+ https://bugs.launchpad.net/bugs/1000253 */
+ { 0x06bc, 0x000b, USBLP_QUIRK_NO_REATTACH }, /* Oki Data Corp.
+ Okipage 14ex Printer,
+ https://bugs.launchpad.net/bugs/872483 */
+ { 0x06bc, 0x01c7, USBLP_QUIRK_NO_REATTACH }, /* Oki Data Corp. B410d,
+ https://bugs.launchpad.net/bugs/872483 */
{ 0x04b8, 0x0202, USBLP_QUIRK_BAD_CLASS }, /* Seiko Epson Receipt
Printer M129C */
{ 0x067b, 0x2305, USBLP_QUIRK_BIDIR |
- USBLP_QUIRK_NO_REATTACH },
+ USBLP_QUIRK_NO_REATTACH |
+ USBLP_QUIRK_RESET },
/* Prolific Technology, Inc. PL2305 Parallel Port
- (USB -> Parallel adapter) */
+ (USB -> Parallel adapter), https://bugs.launchpad.net/bugs/987485 */
+ { 0x04e8, 0x0000, USBLP_QUIRK_RESET }, /* All Samsung devices,
+ https://bugs.launchpad.net/bugs/1032456 */
+ { 0x0a5f, 0x0000, USBLP_QUIRK_BIDIR }, /* All Zebra devices,
+ https://bugs.launchpad.net/bugs/1001028 */
{ 0, 0 }
};
@@ -256,7 +284,12 @@
}
g.print_fd = print_fd;
- g.printer->opened_for_job = 1;
+
+ /*
+ * Some devices need a reset after finishing a job, these devices are
+ * marked with the USBLP_QUIRK_RESET quirk.
+ */
+ g.printer->reset_after_job = (g.printer->quirks & USBLP_QUIRK_RESET ? 1 : 0);
/*
* If we are printing data from a print driver on stdin, ignore SIGTERM
@@ -772,7 +805,7 @@
* Reset the device to clean up after the job
*/
- if (printer->opened_for_job == 1)
+ if (printer->reset_after_job == 1)
{
if ((errcode = libusb_reset_device(printer->handle)) < 0)
fprintf(stderr,
@@ -1288,7 +1321,7 @@
}
printer->usblp_attached = 0;
- printer->opened_for_job = 0;
+ printer->reset_after_job = 0;
if (verbose)
fputs("STATE: +connecting-to-device\n", stderr);
@@ -1586,7 +1619,8 @@
for (i = 0; quirk_printers[i].vendorId; i++)
{
if (vendor == quirk_printers[i].vendorId &&
- product == quirk_printers[i].productId)
+ (quirk_printers[i].productId == 0x0000 ||
+ product == quirk_printers[i].productId))
return quirk_printers[i].quirks;
}
return 0;