[cups/f17] quirk handler for port reset done by new USB backend (bug #847923, STR #4155)

Jiří Popelka jpopelka at fedoraproject.org
Thu Aug 23 12:14:01 UTC 2012


commit 0dfbd99e82067d47e94e7d57500523ebf10141fd
Author: Jiri Popelka <jpopelka at redhat.com>
Date:   Thu Aug 23 13:45:22 2012 +0200

    quirk handler for port reset done by new USB backend (bug #847923, STR #4155)

 cups-usblp-quirks.patch |   86 +++++++++++++++++++++++++++++++++++++++++++++++
 cups.spec               |   10 +++++-
 2 files changed, 95 insertions(+), 1 deletions(-)
---
diff --git a/cups-usblp-quirks.patch b/cups-usblp-quirks.patch
new file mode 100644
index 0000000..135f939
--- /dev/null
+++ b/cups-usblp-quirks.patch
@@ -0,0 +1,86 @@
+diff -up cups-1.5.4/backend/usb-libusb.c.usblp-quirks cups-1.5.4/backend/usb-libusb.c
+--- cups-1.5.4/backend/usb-libusb.c.usblp-quirks	2012-07-16 19:16:46.000000000 +0200
++++ cups-1.5.4/backend/usb-libusb.c	2012-08-23 13:37:28.309013482 +0200
+@@ -70,7 +70,7 @@ typedef struct usb_printer_s		/**** USB
+ 			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 @@ struct quirk_printer_struct {
+ #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,21 @@ static const struct quirk_printer_struct
+ 	{ 0x0409, 0xf1be, USBLP_QUIRK_BIDIR }, /* NEC Picty800 (HP OEM) */
+ 	{ 0x0482, 0x0010, USBLP_QUIRK_BIDIR }, /* Kyocera Mita FS 820,
+ 						  by zut <kernel at zut.de> */
++	{ 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 */
+ 	{ 0x04f9, 0x000d, USBLP_QUIRK_BIDIR |
+ 			  USBLP_QUIRK_NO_REATTACH }, /* Brother Industries, Ltd
+ 						  HL-1440 Laser Printer */
+ 	{ 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) */
++	{ 0x04e8, 0x0000, USBLP_QUIRK_RESET }, /* All Samsung devices */
+ 	{ 0, 0 }
+ };
+ 
+@@ -256,7 +264,12 @@ print_device(const char *uri,		/* I - De
+   }
+ 
+   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 +786,7 @@ close_device(usb_printer_t *printer)	/*
+     * 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 +1302,7 @@ open_device(usb_printer_t *printer,	/* I
+   }
+ 
+   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 +1600,8 @@ static unsigned int quirks(int vendor, i
+   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;
diff --git a/cups.spec b/cups.spec
index cc9314b..bcf4e0d 100644
--- a/cups.spec
+++ b/cups.spec
@@ -12,7 +12,7 @@
 Summary: Common Unix Printing System
 Name: cups
 Version: 1.5.4
-Release: 1%{?dist}
+Release: 2%{?dist}
 License: GPLv2
 Group: System Environment/Daemons
 Source: http://ftp.easysw.com/pub/cups/%{version}/cups-%{version}-source.tar.bz2
@@ -55,6 +55,7 @@ Patch20: cups-filter-debug.patch
 Patch21: cups-uri-compat.patch
 Patch22: cups-cups-get-classes.patch
 Patch23: cups-str3382.patch
+Patch24: cups-usblp-quirks.patch
 Patch25: cups-0755.patch
 Patch26: cups-snmp-quirks.patch
 Patch27: cups-hp-deviceid-oid.patch
@@ -261,6 +262,10 @@ Sends IPP requests to the specified URI and tests and/or displays the results.
 %patch22 -p1 -b .cups-get-classes
 # Fix temporary filename creation.
 %patch23 -p1 -b .str3382
+# Problem is a port reset which is done by the new USB backend of CUPS 1.5.4 and 1.6.x to clean up after the job.
+# This patch adds a quirk handler for this reset so that it will not be done for all printers.
+#(bug #847923, STR #4155)
+%patch24 -p1 -b .usblp-quirks
 # Use mode 0755 for binaries and libraries where appropriate.
 %patch25 -p1 -b .0755
 # Handle SNMP supply level quirks (bug #581825).
@@ -656,6 +661,9 @@ rm -f %{cups_serverbin}/backend/smb
 %{_mandir}/man1/ipptool.1.gz
 
 %changelog
+* Thu Aug 23 2012 Jiri Popelka <jpopelka at redhat.com> 1:1.5.4-2
+- quirk handler for port reset done by new USB backend (bug #847923, STR #4155)
+
 * Thu Jul 26 2012 Jiri Popelka <jpopelka at redhat.com> 1:1.5.4-1
 - 1.5.4
 


More information about the scm-commits mailing list