Re: handling timeouts on usb_bulk_msg

Andy Greensted <[email protected]> Tue, 06 Nov 2007 08:40:41 +0000
Newsgroups gmane.linux.usb.user
Message-ID <[email protected]>
Alan Stern wrote:
> There are two possible approaches.  The easy way is just to use a very,
> very long timeout.  Alternatively, when a timeout does occur don't
> return to the user; instead loop back and submit another usb_bulk_msg.
> 
> Alan Stern

As suggested, I've modified my driver to continually retry a 
usb_bulk_msg if a timeout occurs (ETIMEDOUT is returned). My read 
function now only returns if data has been read, or another error type 
occurs.

The only problem now is that a program reading from my device will not 
respond to a ^C (or kill). I guess it's stuck in the read loop waiting 
for data!

Any suggestions? Do I need to adjust the way the 'locking' is working

Here is the modified code:

static ssize_t usbDIO_read(struct file *file, char __user *buffer, 
size_t count, loff_t *ppos)
{
	struct usbDIO_deviceData *deviceData;
	int retval = 0;
	int bytesRead;

	deviceData = (struct usbDIO_deviceData *)file->private_data;

	mutex_lock(&deviceData->ioMutex);

	if (!deviceData->interface)
	{
		// disconnect() was called
		retval = -ENODEV;
		goto exit;
	}

	do
	{
		// Do a blocking bulk read to get data from the device
		retval = usb_bulk_msg(deviceData->device,
			usb_rcvbulkpipe(deviceData->device,
			deviceData->bulk_in_endpointAddr),
			deviceData->bulk_in_buffer,
			min(deviceData->bulk_in_size, count),
			&bytesRead,
			HZ);	// 1 second
	}
	while(retval == -ETIMEDOUT);

	if (retval == 0)
	{
		// If successful, copy the data to userspace
		if (copy_to_user(buffer, deviceData->bulk_in_buffer,
				count)) retval = -EFAULT;
		else retval = bytesRead;
	}
	else
	{
		err("usbDIO: %s - Read failed, error %d", __FUNCTION__, retval);
	}

exit:
	mutex_unlock(&deviceData->ioMutex);
	return retval;
}

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-users