8855d6f
diff -ur libmtp-1.0.6-orig/src/libusb-glue.c libmtp-1.0.6/src/libusb-glue.c
8855d6f
--- libmtp-1.0.6-orig/src/libusb-glue.c	2011-06-23 19:33:51.736858307 +0200
aad49f0
+++ libmtp-1.0.6/src/libusb-glue.c	2011-10-22 23:31:01.766206773 +0200
8855d6f
@@ -275,6 +275,13 @@
8855d6f
 	    &dev->config[i].interface[j].altsetting[k];
8855d6f
 
8855d6f
 	  /*
8855d6f
+	   * MTP interfaces have three endpoints, two bulk and one
8855d6f
+	   * interrupt. Don't probe anything else.
8855d6f
+	   */
8855d6f
+	  if (intf->bNumEndpoints != 3)
8855d6f
+	    continue;
8855d6f
+
8855d6f
+	  /*
8855d6f
 	   * We only want to probe for the OS descriptor if the
8855d6f
 	   * device is USB_CLASS_VENDOR_SPEC or one of the interfaces
8855d6f
 	   * in it is, so flag if we find an interface like this.
8855d6f
@@ -1753,6 +1760,16 @@
8855d6f
     usb_resetep(ptp_usb->handle, ptp_usb->outep);
8855d6f
     usb_release_interface(ptp_usb->handle, (int) ptp_usb->interface);
8855d6f
   }
8855d6f
+  if (FLAG_FORCE_RESET_ON_CLOSE(ptp_usb)) {
8855d6f
+    /*
8855d6f
+     * Some devices really love to get reset after being
8855d6f
+     * disconnected. Again, since Windows never disconnects
8855d6f
+     * a device closing behaviour is seldom or never exercised
8855d6f
+     * on devices when engineered and often error prone.
8855d6f
+     * Reset may help some.
8855d6f
+     */
8855d6f
+    usb_reset(ptp_usb->handle);
8855d6f
+  }
8855d6f
   usb_close(ptp_usb->handle);
8855d6f
 }
8855d6f
 
8855d6f
@@ -1911,10 +1928,9 @@
8855d6f
    */
8855d6f
   if ((ret = ptp_opensession(params, 1)) == PTP_ERROR_IO) {
8855d6f
     LIBMTP_ERROR("PTP_ERROR_IO: failed to open session, trying again after resetting USB interface\n");
8855d6f
-    close_usb(ptp_usb);
8855d6f
-
8855d6f
     LIBMTP_ERROR("LIBMTP libusb: Attempt to reset device\n");
8855d6f
     usb_reset(ptp_usb->handle);
8855d6f
+    close_usb(ptp_usb);
8855d6f
 
8855d6f
     if(init_ptp_usb(params, ptp_usb, libusb_device) <0) {
8855d6f
       LIBMTP_ERROR("LIBMTP PANIC: Could not init USB on second attempt\n");
aad49f0
diff -ur libmtp-1.0.6-orig/src/libusb-glue.h libmtp-1.0.6/src/libusb-glue.h
aad49f0
--- libmtp-1.0.6-orig/src/libusb-glue.h	2011-06-23 19:33:51.736858307 +0200
aad49f0
+++ libmtp-1.0.6/src/libusb-glue.h	2011-10-22 23:32:29.377583765 +0200
aad49f0
@@ -136,6 +136,10 @@
aad49f0
   ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_UNIQUE_FILENAMES)
aad49f0
 #define FLAG_SWITCH_MODE_BLACKBERRY(a) \
aad49f0
   ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_SWITCH_MODE_BLACKBERRY)
aad49f0
+#define FLAG_LONG_TIMEOUT(a) \
aad49f0
+  ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_LONG_TIMEOUT)
aad49f0
+#define FLAG_FORCE_RESET_ON_CLOSE(a) \
aad49f0
+  ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_FORCE_RESET_ON_CLOSE)
aad49f0
 
aad49f0
 /* connect_first_device return codes */
aad49f0
 #define PTP_CD_RC_CONNECTED	0
aad49f0
Endast i libmtp-1.0.6/src: libusb-glue.h.orig
8855d6f
diff -ur libmtp-1.0.6-orig/util/mtp-hotplug.c libmtp-1.0.6/util/mtp-hotplug.c
8855d6f
--- libmtp-1.0.6-orig/util/mtp-hotplug.c	2011-06-23 19:33:51.713858478 +0200
aad49f0
+++ libmtp-1.0.6/util/mtp-hotplug.c	2011-10-22 23:31:01.766206773 +0200
8855d6f
@@ -140,6 +140,12 @@
8855d6f
       printf("SUBSYSTEM==\"usb\", GOTO=\"libmtp_usb_rules\"\n"
8855d6f
 	     "GOTO=\"libmtp_rules_end\"\n\n"
8855d6f
 	     "LABEL=\"libmtp_usb_rules\"\n\n");
8855d6f
+      printf("# Some sensitive devices we surely don\'t wanna probe, color instruments\n");
8855d6f
+      printf("ATTR{idVendor}==\"0670\", GOTO=\"libmtp_rules_end\"\n");
8855d6f
+      printf("ATTR{idVendor}==\"0765\", GOTO=\"libmtp_rules_end\"\n");
8855d6f
+      printf("ATTR{idVendor}==\"085c\", GOTO=\"libmtp_rules_end\"\n");
8855d6f
+      printf("ATTR{idVendor}==\"0971\", GOTO=\"libmtp_rules_end\"\n");
8855d6f
+      printf("\n");
8855d6f
       break;
8855d6f
     case style_udev_old:
8855d6f
       printf("# UDEV-style hotplug map for libmtp\n");
8855d6f
@@ -242,7 +248,7 @@
8855d6f
      * every USB device that is either PTP or vendor specific
8855d6f
      */
8855d6f
     printf("\n# Autoprobe vendor-specific, communication and PTP devices\n");
8855d6f
-    printf("ENV{ID_MTP_DEVICE}!=\"1\", ATTR{bDeviceClass}==\"00|02|06|ff\", PROGRAM=\"%smtp-probe /sys$env{DEVPATH} $attr{busnum} $attr{devnum}\", RESULT==\"1\", %s", mtp_probe_dir, action);
8855d6f
+    printf("ENV{ID_MTP_DEVICE}!=\"1\", ENV{MTP_NO_PROBE}!=\"1\", ENV{COLOR_MEASUREMENT_DEVICE}!=\"1\", ENV{libsane_matched}!=\"yes\", ATTR{bDeviceClass}==\"00|02|06|ef|ff\", PROGRAM=\"%smtp-probe /sys$env{DEVPATH} $attr{busnum} $attr{devnum}\", RESULT==\"1\", %s", mtp_probe_dir, action);
8855d6f
     if (udev_group != NULL) printf(", GROUP=\"%s\"", udev_group);
8855d6f
     if (udev_mode != NULL) printf(", MODE=\"%s\"", udev_mode);
8855d6f
     printf("\n");