Re: patch usb-iowarrior.patch added to gregkh-2.6 tree

Robert Marquardt <[email protected]>
Newsgroups gmane.linux.usb.devel
Message-ID <[email protected]>
Greg KH wrote:

> Can you send this in 'diff -u' format so that I can apply it (or at
> least determine where it should go in the driver?


Lets try it.
A diff of iowarrior.c and iowarrior.h from your kernel tree.
I renamed packet_size to report_size to make clear what is used in the 
driver. The driver handles HID reports.

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV

_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
iowarrior.diff (text/plain, 7.7 KB)
--- gregkh.orig/iowarrior.c	2007-02-21 09:40:53.000000000 +0100
+++ iowarrior.c	2007-02-21 09:43:27.000000000 +0100
@@ -48,7 +48,7 @@
 /*
    maximum number of urbs that are submitted for writes at the same time,
    this applies to the IOWarrior56 only!
-   IOWarrior24 and IOWarrior40 use synchronus usb_control_msg calls.
+   IOWarrior24 and IOWarrior40 use synchronous usb_control_msg calls.
 */
 #define MAX_WRITES_IN_FLIGHT 4
 
@@ -93,7 +93,7 @@
 	int present;			/* this is 1 as long as the device is connected */
 	int opened;			/* this is 1 if the device is currently open */
 	char chip_serial[9];		/* the serial number string of the chip connected */
-	int packet_size;		/* number of bytes in a report */
+	int report_size;		/* number of bytes in a report */
 	u16 product_id;
 };
 
@@ -185,10 +185,10 @@
 	if ((intr_idx != read_idx)
 	    && (dev->interface->cur_altsetting->desc.bInterfaceNumber == 0)) {
 		/* + 1 for serial number */
-		offset = aux_idx * (dev->packet_size + 1);
+		offset = aux_idx * (dev->report_size + 1);
 		if (!memcmp
 		    (dev->read_queue + offset, urb->transfer_buffer,
-		     dev->packet_size)) {
+		     dev->report_size)) {
 			/* equal values on interface 0 will be ignored */
 			spin_unlock(&dev->intr_idx_lock);
 			goto exit;
@@ -205,10 +205,10 @@
 	}
 
 	/* +1 for serial number */
-	offset = intr_idx * (dev->packet_size + 1);
+	offset = intr_idx * (dev->report_size + 1);
 	memcpy(dev->read_queue + offset, urb->transfer_buffer,
-	       dev->packet_size);
-	*(dev->read_queue + offset + (dev->packet_size)) = dev->serial_number++;
+	       dev->report_size);
+	*(dev->read_queue + offset + (dev->report_size)) = dev->serial_number++;
 
 	atomic_set(&dev->intr_idx, aux_idx);
 	spin_unlock(&dev->intr_idx_lock);
@@ -290,8 +290,8 @@
 	dbg("%s - minor %d, count = %zd", __func__, dev->minor, count);
 
 	/* read count must be packet size (+ time stamp) */
-	if ((count != dev->packet_size)
-	    && (count != (dev->packet_size + 1)))
+	if ((count != dev->report_size)
+	    && (count != (dev->report_size + 1)))
 		return -EINVAL;
 
 	/* repeat until no buffer overrun in callback handler occur */
@@ -324,7 +324,7 @@
 			}
 		}
 
-		offset = read_idx * (dev->packet_size + 1);
+		offset = read_idx * (dev->report_size + 1);
 		if (copy_to_user(buffer, dev->read_queue + offset, count)) {
 			return -EFAULT;
 		}
@@ -361,7 +361,7 @@
 		goto exit;
 	}
 	/* We only accept full reports */
-	if (count != dev->packet_size) {
+	if (count != dev->report_size) {
 		retval = -EINVAL;
 		goto exit;
 	}
@@ -369,7 +369,7 @@
 	    dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV1 ||
 	    dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV2 ||
 	    dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW40) {
-		/* IOW24 and IOW40 use a synchronus call */
+		/* IOW24 and IOW40 use a synchronous call */
 		buf = kmalloc(8, GFP_KERNEL);	/* 8 bytes are enough for both products */
 		if (!buf) {
 			retval = -ENOMEM;
@@ -385,7 +385,7 @@
 		kfree(buf);
 		goto exit;
 	} else if (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) {
-		/* The IOW56 uses asynchronus IO and more urbs */
+		/* The IOW56 uses asynchronous IO and more urbs */
 		if (atomic_read(&dev->write_busy) == MAX_WRITES_IN_FLIGHT) {
 			/* Wait until we are below the limit for submitted urbs */
 			if (file->f_flags & O_NONBLOCK) {
@@ -424,7 +424,7 @@
 			dbg("%s Unable to allocate urb ", __func__);
 			goto error;
 		}
-		buf = usb_buffer_alloc(dev->udev, dev->packet_size,
+		buf = usb_buffer_alloc(dev->udev, dev->report_size,
 				       GFP_KERNEL, &int_out_urb->transfer_dma);
 		if (!buf) {
 			retval = -ENOMEM;
@@ -435,7 +435,7 @@
 				 usb_sndintpipe(dev->udev,
 						dev->int_out_endpoint->
 						bEndpointAddress), buf,
-				 dev->packet_size, iowarrior_write_callback,
+				 dev->report_size, iowarrior_write_callback,
 				 dev, dev->int_out_endpoint->bInterval);
 		int_out_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 		if (copy_from_user(buf, user_buffer, count)) {
@@ -460,7 +460,7 @@
 		goto exit;
 	}
 error:
-	usb_buffer_free(dev->udev, dev->packet_size, buf,
+	usb_buffer_free(dev->udev, dev->report_size, buf,
 			int_out_urb->transfer_dma);
 	usb_free_urb(int_out_urb);
 	atomic_dec(&dev->write_busy);
@@ -510,13 +510,13 @@
 		    dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV2 ||
 		    dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW40) {
 			io_res = copy_from_user(buffer, user_buffer,
-						dev->packet_size);
+						dev->report_size);
 			if (io_res) {
 				retval = -EFAULT;
 			} else {
 				io_res = usb_set_report(dev->interface, 2, 0,
 							buffer,
-							dev->packet_size);
+							dev->report_size);
 				if (io_res < 0)
 					retval = io_res;
 			}
@@ -528,11 +528,11 @@
 	case IOW_READ:
 		io_res = usb_get_report(dev->udev,
 					dev->interface->cur_altsetting, 1, 0,
-					buffer, dev->packet_size);
+					buffer, dev->report_size);
 		if (io_res < 0)
 			retval = io_res;
 		else {
-			io_res = copy_to_user(user_buffer, buffer, dev->packet_size);
+			io_res = copy_to_user(user_buffer, buffer, dev->report_size);
 			if (io_res < 0)
 				retval = -EFAULT;
 		}
@@ -549,7 +549,7 @@
 			info.revision = le16_to_cpu(dev->udev->descriptor.bcdDevice);
 			info.speed = le16_to_cpu(dev->udev->speed);	/* 0==UNKNOWN, 1==LOW(usb1.1) ,2=FULL(usb1.1), 3=HIGH(usb2.0) */
 			info.if_num = dev->interface->cur_altsetting->desc.bInterfaceNumber;
-			info.packet_size = dev->packet_size;
+			info.report_size = dev->report_size;
 			/* serial number string has been read earlier 8 chars or empty string */
 			memcpy(info.serial, dev->chip_serial,
 			       sizeof(dev->chip_serial));
@@ -777,15 +777,20 @@
 			/* this one will match for the IOWarrior56 only */
 			dev->int_out_endpoint = endpoint;
 	}
-	/* we have to check the packet_size often, so remember it in the endianess suitable for our machine */
-	dev->packet_size = le16_to_cpu(dev->int_in_endpoint->wMaxPacketSize);
+	/* we have to check the report_size often, so remember it in the endianess suitable for our machine */
+	dev->report_size = le16_to_cpu(dev->int_in_endpoint->wMaxPacketSize);
+	if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0)
+	    && (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56))
+		/* IOWarrior56 has wMaxPacketSize different from report size */
+		dev->report_size = 7;
+
 	/* create the urb and buffer for reading */
 	dev->int_in_urb = usb_alloc_urb(0, GFP_KERNEL);
 	if (!dev->int_in_urb) {
 		dev_err(&interface->dev, "Couldn't allocate interrupt_in_urb\n");
 		goto error;
 	}
-	dev->int_in_buffer = kmalloc(dev->packet_size, GFP_KERNEL);
+	dev->int_in_buffer = kmalloc(dev->report_size, GFP_KERNEL);
 	if (!dev->int_in_buffer) {
 		dev_err(&interface->dev, "Couldn't allocate int_in_buffer\n");
 		goto error;
@@ -793,12 +798,12 @@
 	usb_fill_int_urb(dev->int_in_urb, dev->udev,
 			 usb_rcvintpipe(dev->udev,
 					dev->int_in_endpoint->bEndpointAddress),
-			 dev->int_in_buffer, dev->packet_size,
+			 dev->int_in_buffer, dev->report_size,
 			 iowarrior_callback, dev,
 			 dev->int_in_endpoint->bInterval);
 	/* create an internal buffer for interrupt data from the device */
 	dev->read_queue =
-	    kmalloc(((dev->packet_size + 1) * MAX_INTERRUPT_BUFFER),
+	    kmalloc(((dev->report_size + 1) * MAX_INTERRUPT_BUFFER),
 		    GFP_KERNEL);
 	if (!dev->read_queue) {
 		dev_err(&interface->dev, "Couldn't allocate read_queue\n");
--- gregkh.orig/iowarrior.h	2007-02-21 09:40:42.000000000 +0100
+++ iowarrior.h	2007-02-21 09:38:51.000000000 +0100
@@ -19,7 +19,7 @@
 	__u32 speed;		/* USB-speed of the device (0=UNKNOWN, 1=LOW, 2=FULL 3=HIGH) */
 	__u32 power;		/* power consumption of the device in mA */
 	__u32 if_num;		/* the number of the endpoint */
-	__u32 packet_size;	/* size of the data-packets on this interface */
+	__u32 report_size;	/* max report size on this interface */
 };
 
 /*
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.