mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	USB: allow users to run setserial with cdc-acm
We had a user report that running setserial on /dev/ttyACM0 didn't work.
He pointed at an old patch by Oliver Neukum from 2008 that never went anywhere..
http://permalink.gmane.org/gmane.linux.usb.general/9236
I made some minor changes to get it to apply again, and got the user to retest on 3.1,
and he reported it worked for him. https://bugzilla.redhat.com/show_bug.cgi?id=787607
The diff below is against 3.3rc. The only difference between this and
the version the user tested is the removal of the if (!ACM_READY) test
Havard removed ACM_READY in 99823f457d
I'm unclear if there's need for a different test in its place.
From: Oliver Neukum <oliver@neukum.org>
Signed-off-by: Dave Jones <davej@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
			
			
This commit is contained in:
		
							parent
							
								
									4c95432682
								
							
						
					
					
						commit
						18c75720e6
					
				
					 1 changed files with 29 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -39,6 +39,7 @@
 | 
			
		|||
#include <linux/serial.h>
 | 
			
		||||
#include <linux/tty_driver.h>
 | 
			
		||||
#include <linux/tty_flip.h>
 | 
			
		||||
#include <linux/serial.h>
 | 
			
		||||
#include <linux/module.h>
 | 
			
		||||
#include <linux/mutex.h>
 | 
			
		||||
#include <linux/uaccess.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -773,10 +774,37 @@ static int acm_tty_tiocmset(struct tty_struct *tty,
 | 
			
		|||
	return acm_set_control(acm, acm->ctrlout = newctrl);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int get_serial_info(struct acm *acm, struct serial_struct __user *info)
 | 
			
		||||
{
 | 
			
		||||
	struct serial_struct tmp;
 | 
			
		||||
 | 
			
		||||
	if (!info)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	memset(&tmp, 0, sizeof(tmp));
 | 
			
		||||
	tmp.flags = ASYNC_LOW_LATENCY;
 | 
			
		||||
	tmp.xmit_fifo_size = acm->writesize;
 | 
			
		||||
	tmp.baud_base = le32_to_cpu(acm->line.dwDTERate);
 | 
			
		||||
 | 
			
		||||
	if (copy_to_user(info, &tmp, sizeof(tmp)))
 | 
			
		||||
		return -EFAULT;
 | 
			
		||||
	else
 | 
			
		||||
		return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int acm_tty_ioctl(struct tty_struct *tty,
 | 
			
		||||
					unsigned int cmd, unsigned long arg)
 | 
			
		||||
{
 | 
			
		||||
	return -ENOIOCTLCMD;
 | 
			
		||||
	struct acm *acm = tty->driver_data;
 | 
			
		||||
	int rv = -ENOIOCTLCMD;
 | 
			
		||||
 | 
			
		||||
	switch (cmd) {
 | 
			
		||||
	case TIOCGSERIAL: /* gets serial port data */
 | 
			
		||||
		rv = get_serial_info(acm, (struct serial_struct __user *) arg);
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const __u32 acm_tty_speed[] = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue