|
|
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");
|