You can find attached the patch (onetouch.diff) to add functionality to the Onetouch Button on Maxtor OneTouch external Hard Drives as well as a kernel log of the failure(onetouch_kern_log).

I hope a few of you remember me and my driver (and it's many, many problems) I have been busy with other project, but have taken the time once again to rewrite the driver. Unfortunately I got to the same point as I did with the original driver.

When I plug the drive in the device is recognized and everything works. The button on the front is recognized in any keybinding software. I unplug the drive and everything seems to go fine. When I plug the drive back in it seems like i have a 70% chance of a complete system hang. The other 30% the drive and button work as expected.

If someone would be willing to give me a few pointers as to where I have gone wrong I'd be happy to continue working on this and hopefully have it added to the -mm tree.

All follow-ups to this e-mail and changes to the code/patch will be found at a url which I can post if needed, as to not spam the list with huge attachments.

Thanks in Advance,
Nick Sillik
[EMAIL PROTECTED]
Jul 14 15:09:49 localhost kernel: usb 3-1: new high speed USB device using 
ehci_hcd and address 4
Jul 14 15:09:49 localhost kernel: ehci_hcd 0000:00:02.2: port 1 high speed
Jul 14 15:09:49 localhost kernel: ehci_hcd 0000:00:02.2: GetStatus port 1 
status 001005 POWER sig=se0 PE CONNECT
Jul 14 15:09:49 localhost kernel: usb 3-1: default language 0x0409
Jul 14 15:09:49 localhost kernel: usb 3-1: new device strings: Mfr=1, 
Product=3, SerialNumber=2
Jul 14 15:09:49 localhost kernel: usb 3-1: Product: OneTouch
Jul 14 15:09:49 localhost kernel: usb 3-1: Manufacturer: Maxtor
Jul 14 15:09:49 localhost kernel: usb 3-1: SerialNumber: Y35ME9WE
Jul 14 15:09:49 localhost kernel: usb 3-1: hotplug
Jul 14 15:09:49 localhost kernel: usb 3-1: adding 3-1:1.0 (config #1, interface 
0)
Jul 14 15:09:49 localhost kernel: usb 3-1:1.0: hotplug
Jul 14 15:09:49 localhost kernel: usb-storage 3-1:1.0: usb_probe_interface
Jul 14 15:09:49 localhost kernel: usb-storage 3-1:1.0: usb_probe_interface - 
got id
Jul 14 15:09:49 localhost kernel: usb 3-1: link qh32-0001/c167e100 start 31 
[7/0 us]
Jul 14 15:09:49 localhost kernel: usb-input: Maxtor OneTouch on 
usb-0000:00:02.2-1
Jul 14 15:09:49 localhost kernel: scsi1 : SCSI emulation for USB Mass Storage 
devices
Jul 14 15:09:49 localhost kernel: usb-storage: device found at 4
Jul 14 15:09:49 localhost kernel: usb-storage: waiting for device to settle 
before scanning
Jul 14 15:09:54 localhost kernel:   Vendor: Maxtor    Model: OneTouch          
Rev: 0201
Jul 14 15:09:54 localhost kernel:   Type:   Direct-Access                      
ANSI SCSI revision: 00
Jul 14 15:09:54 localhost kernel: SCSI device sda: 240119808 512-byte hdwr 
sectors (122941 MB)
Jul 14 15:09:54 localhost kernel: sda: assuming drive cache: write through
Jul 14 15:09:54 localhost kernel: SCSI device sda: 240119808 512-byte hdwr 
sectors (122941 MB)
Jul 14 15:09:54 localhost kernel: sda: assuming drive cache: write through
Jul 14 15:09:54 localhost kernel:  sda: sda1 sda2 sda3
Jul 14 15:09:54 localhost kernel: Attached scsi disk sda at scsi1, channel 0, 
id 0, lun 0
Jul 14 15:09:54 localhost kernel: Attached scsi generic sg0 at scsi1, channel 
0, id 0, lun 0,  type 0
Jul 14 15:09:54 localhost kernel: usb-storage: device scan complete
Jul 14 15:11:53 localhost kernel: hub 3-0:1.0: state 5 ports 6 chg 0000 evt 0002
Jul 14 15:11:53 localhost kernel: ehci_hcd 0000:00:02.2: GetStatus port 1 
status 001002 POWER sig=se0 CSC
Jul 14 15:11:53 localhost kernel: hub 3-0:1.0: port 1, status 0100, change 
0001, 12 Mb/s
Jul 14 15:11:53 localhost kernel: usb 3-1: USB disconnect, address 4
Jul 14 15:11:53 localhost kernel: usb 3-1: usb_disable_device nuking all URBs
Jul 14 15:11:53 localhost kernel: usb 3-1: unlink qh32-0001/c167e100 start 31 
[7/0 us]
Jul 14 15:11:53 localhost kernel: ehci_hcd 0000:00:02.2: shutdown urb d675cb00 
pipe 40408480 ep1in-intr
Jul 14 15:11:53 localhost kernel: usb 3-1: unregistering interface 3-1:1.0
Jul 14 15:11:53 localhost kernel: Onetouch De-Registered<7>usb 3-1:1.0: hotplug
Jul 14 15:11:53 localhost kernel: usb 3-1: unregistering device
Jul 14 15:11:53 localhost kernel: usb 3-1: hotplug
Jul 14 15:11:53 localhost kernel: hub 3-0:1.0: debounce: port 1: total 100ms 
stable 100ms status 0x100
Jul 14 15:12:08 localhost kernel: hub 3-0:1.0: state 5 ports 6 chg 0000 evt 0002
Jul 14 15:12:08 localhost kernel: ehci_hcd 0000:00:02.2: GetStatus port 1 
status 001803 POWER sig=j CSC CONNECT
Jul 14 15:12:08 localhost kernel: hub 3-0:1.0: port 1, status 0501, change 
0001, 480 Mb/s
Jul 14 15:12:08 localhost kernel: hub 3-0:1.0: debounce: port 1: total 100ms 
stable 100ms status 0x501
Jul 14 15:12:08 localhost kernel: ehci_hcd 0000:00:02.2: port 1 high speed
Jul 14 15:12:08 localhost kernel: ehci_hcd 0000:00:02.2: GetStatus port 1 
status 001005 POWER sig=se0 PE CONNECT
Jul 14 15:12:08 localhost kernel: usb 3-1: new high speed USB device using 
ehci_hcd and address 5
Jul 14 15:13:11 localhost kernel: Inspecting 
/boot/System.map-2.6.13-rc1-mm1-onetouch
diff -urN linux-2.6.13-rc1-mm1/drivers/usb/storage/Kconfig linux-2.6.13-rc1-mm1-onetouch/drivers/usb/storage/Kconfig
--- linux-2.6.13-rc1-mm1/drivers/usb/storage/Kconfig	2005-07-04 21:20:51.000000000 -0400
+++ linux-2.6.13-rc1-mm1-onetouch/drivers/usb/storage/Kconfig	2005-07-04 21:24:31.000000000 -0400
@@ -111,3 +111,15 @@
 	  Say Y here to include additional code to support the Lexar Jumpshot
 	  USB CompactFlash reader.
 
+
+config USB_STORAGE_ONETOUCH
+	bool "Support OneTouch Button on Maxtor Hard Drives (EXPERIMENTAL)"
+	depends on USB_STORAGE && INPUT_EVDEV && EXPERIMENTAL
+	help
+	  Say Y here to include additional code to support the Maxtor OneTouch
+	  USB hard drive's onetouch button.
+
+	  This code registers the button on the front of Maxtor OneTouch USB
+	  hard drive's as an input device. An action can be associated with
+	  this input in any keybinding software. (e.g. gnome's keyboard short-
+	  cuts)
diff -urN linux-2.6.13-rc1-mm1/drivers/usb/storage/Makefile linux-2.6.13-rc1-mm1-onetouch/drivers/usb/storage/Makefile
--- linux-2.6.13-rc1-mm1/drivers/usb/storage/Makefile	2005-07-04 21:20:51.000000000 -0400
+++ linux-2.6.13-rc1-mm1-onetouch/drivers/usb/storage/Makefile	2005-07-04 21:24:39.000000000 -0400
@@ -18,6 +18,7 @@
 usb-storage-obj-$(CONFIG_USB_STORAGE_ISD200)	+= isd200.o
 usb-storage-obj-$(CONFIG_USB_STORAGE_DATAFAB)	+= datafab.o
 usb-storage-obj-$(CONFIG_USB_STORAGE_JUMPSHOT)	+= jumpshot.o
+usb-storage-obj-$(CONFIG_USB_STORAGE_ONETOUCH)	+= onetouch.o
 
 usb-storage-objs :=	scsiglue.o protocol.o transport.o usb.o \
 			initializers.o $(usb-storage-obj-y)
diff -urN linux-2.6.13-rc1-mm1/drivers/usb/storage/onetouch.c linux-2.6.13-rc1-mm1-onetouch/drivers/usb/storage/onetouch.c
--- linux-2.6.13-rc1-mm1/drivers/usb/storage/onetouch.c	1969-12-31 19:00:00.000000000 -0500
+++ linux-2.6.13-rc1-mm1-onetouch/drivers/usb/storage/onetouch.c	2005-07-07 20:14:10.000000000 -0400
@@ -0,0 +1,206 @@
+/*
+ * Support for the Maxtor OneTouch USB hard drive's button
+ *
+ * Current development and maintenance by:
+ *	Copyright (c) 2005 Nick Sillik <[EMAIL PROTECTED]>
+ *
+ * Initial work by:
+ * 	Copyright (c) 2003 Erik Thyrén <[EMAIL PROTECTED]>
+ *
+ * Based on usbmouse.c (Vojtech Pavlik) and xpad.c (Marko Friedemann)
+ *
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/input.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/usb.h>
+#include "usb.h"
+#include "onetouch.h"
+#include "debug.h"
+
+void onetouch_release_input(void *onetouch_);
+
+struct usb_onetouch {
+	char name[128];
+	char phys[64];
+	struct input_dev dev;	/* input device interface */
+	struct usb_device *udev;	/* usb device */
+
+	struct urb *irq;	/* urb for interrupt in report */
+	unsigned char *data;	/* input data */
+	dma_addr_t data_dma;
+};
+
+static void usb_onetouch_irq(struct urb *urb, struct pt_regs *regs)
+{
+	struct usb_onetouch *onetouch = urb->context;
+	signed char *data = onetouch->data;
+	struct input_dev *dev = &onetouch->dev;
+	int status;
+
+	switch (urb->status) {
+	case 0:			/* success */
+		break;
+	case -ECONNRESET:	/* unlink */
+	case -ENOENT:
+	case -ESHUTDOWN:
+		return;
+	/* -EPIPE:  should clear the halt */
+	default:		/* error */
+		goto resubmit;
+	}
+
+	input_regs(dev, regs);
+
+	input_report_key(&onetouch->dev, ONETOUCH_BUTTON,
+			 data[0] & 0x02);
+
+	input_sync(dev);
+resubmit:
+	status = usb_submit_urb (urb, SLAB_ATOMIC);
+	if (status)
+		err ("can't resubmit intr, %s-%s/input0, status %d",
+			onetouch->udev->bus->bus_name,
+			onetouch->udev->devpath, status);
+}
+
+static int usb_onetouch_open(struct input_dev *dev)
+{
+	struct usb_onetouch *onetouch = dev->private;
+
+	onetouch->irq->dev = onetouch->udev;
+	if (usb_submit_urb(onetouch->irq, GFP_KERNEL)) {
+		err("usb_submit_urb failed");
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static void usb_onetouch_close(struct input_dev *dev)
+{
+	struct usb_onetouch *onetouch = dev->private;
+
+	usb_kill_urb(onetouch->irq);
+}
+
+int onetouch_connect_input(struct us_data *ss)
+{
+	struct usb_device *udev = ss->pusb_dev;
+	struct usb_host_interface *interface;
+	struct usb_endpoint_descriptor *endpoint;
+	struct usb_onetouch *onetouch;
+	int pipe, maxp;
+	char path[64];
+
+	interface = ss->pusb_intf->cur_altsetting;
+
+	endpoint = &interface->endpoint[2].desc;
+	if(!(endpoint->bEndpointAddress & 0x80))
+		return -ENODEV;
+	if((endpoint->bmAttributes & 3) != 3)
+		return -ENODEV;
+
+	pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress);
+	maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
+
+	if (!(onetouch = kmalloc(sizeof(struct usb_onetouch), GFP_KERNEL)))
+		return -ENOMEM;
+	memset(onetouch, 0, sizeof(struct usb_onetouch));
+
+	onetouch->data = usb_buffer_alloc(udev, ONETOUCH_PKT_LEN, SLAB_ATOMIC, &onetouch->data_dma);
+	if (!onetouch->data){
+		kfree(onetouch);
+		return -ENOMEM;
+	}
+
+	onetouch->irq = usb_alloc_urb(0, GFP_KERNEL);
+	if (!onetouch->irq){
+		kfree(onetouch);
+		usb_buffer_free(udev, ONETOUCH_PKT_LEN, onetouch->data, onetouch->data_dma);
+		return -ENODEV;
+	}
+
+
+	onetouch->udev = udev;
+
+	set_bit(EV_KEY, onetouch->dev.evbit);
+	set_bit(ONETOUCH_BUTTON, onetouch->dev.keybit);
+	clear_bit(0, onetouch->dev.keybit);
+
+	onetouch->dev.private = onetouch;
+	onetouch->dev.open = usb_onetouch_open;
+	onetouch->dev.close = usb_onetouch_close;
+
+	usb_make_path(udev, path, 64);
+	sprintf(onetouch->phys, "%s/input0", path);
+
+	onetouch->dev.name = onetouch->name;
+	onetouch->dev.phys = onetouch->phys;
+
+	onetouch->dev.id.bustype = BUS_USB;
+	onetouch->dev.id.vendor = le16_to_cpu(udev->descriptor.idVendor);
+	onetouch->dev.id.product = le16_to_cpu(udev->descriptor.idProduct);
+	onetouch->dev.id.version = le16_to_cpu(udev->descriptor.bcdDevice);
+
+	onetouch->dev.dev = &udev->dev;
+
+	if (udev->manufacturer)
+		strcat(onetouch->name, udev->manufacturer);
+	if (udev->product)
+		sprintf(onetouch->name, "%s %s", onetouch->name,
+			udev->product);
+	if (!strlen(onetouch->name))
+		sprintf(onetouch->name, "Maxtor Onetouch %04x:%04x",
+			onetouch->dev.id.vendor, onetouch->dev.id.product);
+
+	usb_fill_int_urb(onetouch->irq, udev, pipe, onetouch->data,
+			 (maxp > 8 ? 8 : maxp),
+			 usb_onetouch_irq, onetouch, endpoint->bInterval);
+	onetouch->irq->transfer_dma = onetouch->data_dma;
+	onetouch->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
+
+	ss->extra_destructor = onetouch_release_input;
+	ss->extra = onetouch;
+
+	input_register_device(&onetouch->dev);
+	printk(KERN_INFO "usb-input: %s on %s\n", onetouch->dev.name, path);
+
+	return 0;
+}
+
+void onetouch_release_input(void *onetouch_)
+{
+	struct usb_onetouch *onetouch = (struct usb_onetouch *) onetouch_;
+
+	if (onetouch) {
+		usb_kill_urb(onetouch->irq);
+		input_unregister_device(&onetouch->dev);
+		usb_free_urb(onetouch->irq);
+		usb_buffer_free(onetouch->udev, ONETOUCH_PKT_LEN,
+				onetouch->data, onetouch->data_dma);
+		kfree(onetouch);
+		printk(KERN_INFO "Onetouch De-Registered");
+	}
+}
diff -urN linux-2.6.13-rc1-mm1/drivers/usb/storage/onetouch.h linux-2.6.13-rc1-mm1-onetouch/drivers/usb/storage/onetouch.h
--- linux-2.6.13-rc1-mm1/drivers/usb/storage/onetouch.h	1969-12-31 19:00:00.000000000 -0500
+++ linux-2.6.13-rc1-mm1-onetouch/drivers/usb/storage/onetouch.h	2005-07-06 19:29:08.000000000 -0400
@@ -0,0 +1,9 @@
+#ifndef _ONETOUCH_H_
+#define _ONETOUCH_H_
+
+#define ONETOUCH_PKT_LEN        0x02
+#define ONETOUCH_BUTTON         KEY_PROG1
+
+int onetouch_connect_input(struct us_data *ss);
+
+#endif
diff -urN linux-2.6.13-rc1-mm1/drivers/usb/storage/unusual_devs.h linux-2.6.13-rc1-mm1-onetouch/drivers/usb/storage/unusual_devs.h
--- linux-2.6.13-rc1-mm1/drivers/usb/storage/unusual_devs.h	2005-07-04 21:20:51.000000000 -0400
+++ linux-2.6.13-rc1-mm1-onetouch/drivers/usb/storage/unusual_devs.h	2005-07-04 21:24:11.000000000 -0400
@@ -929,6 +929,18 @@
 	       US_FL_SINGLE_LUN ),
 #endif
 
+/* Submitted by: Nick Sillik <[EMAIL PROTECTED]>
+ * Needed for OneTouch extension to usb-storage
+ *
+ */
+#ifdef CONFIG_USB_STORAGE_ONETOUCH
+	UNUSUAL_DEV(  0x0d49, 0x7010, 0x0000, 0x9999,
+			"Maxtor",
+			"OneTouch External Harddrive",
+			US_SC_DEVICE, US_PR_DEVICE, onetouch_connect_input,
+			0),
+#endif
+
 /* Submitted by Joris Struyve <[EMAIL PROTECTED]> */
 UNUSUAL_DEV( 0x0d96, 0x410a, 0x0001, 0xffff,
 		"Medion",
diff -urN linux-2.6.13-rc1-mm1/drivers/usb/storage/usb.c linux-2.6.13-rc1-mm1-onetouch/drivers/usb/storage/usb.c
--- linux-2.6.13-rc1-mm1/drivers/usb/storage/usb.c	2005-07-04 21:20:51.000000000 -0400
+++ linux-2.6.13-rc1-mm1-onetouch/drivers/usb/storage/usb.c	2005-07-04 22:53:54.000000000 -0400
@@ -90,7 +90,9 @@
 #ifdef CONFIG_USB_STORAGE_JUMPSHOT
 #include "jumpshot.h"
 #endif
-
+#ifdef CONFIG_USB_STORAGE_ONETOUCH
+#include "onetouch.h"
+#endif
 
 /* Some informational data */
 MODULE_AUTHOR("Matthew Dharm <[EMAIL PROTECTED]>");

Reply via email to