diff options
| author | Tony Luck <tony.luck@intel.com> | 2005-07-13 12:15:43 -0700 | 
|---|---|---|
| committer | Tony Luck <tony.luck@intel.com> | 2005-07-13 12:15:43 -0700 | 
| commit | 99ad25a313bda566a346b46a6015afa65bc0a02b (patch) | |
| tree | b9443fed1ab74f320c4ee0791864ee96d7c069df /drivers/usb/class | |
| parent | f62c4a96f74d6c6dd56d1742697e94a5c2085e87 (diff) | |
| parent | 9a556e89081b0c1c2f83cee915363b15a68a6f2d (diff) | |
Auto merge with /home/aegl/GIT/linus
Diffstat (limited to 'drivers/usb/class')
| -rw-r--r-- | drivers/usb/class/cdc-acm.c | 31 | 
1 files changed, 16 insertions, 15 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 69e859e0f51d..adff5a77e31f 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -422,6 +422,17 @@ bail_out:  	return -EIO;  } +static void acm_tty_unregister(struct acm *acm) +{ +	tty_unregister_device(acm_tty_driver, acm->minor); +	usb_put_intf(acm->control); +	acm_table[acm->minor] = NULL; +	usb_free_urb(acm->ctrlurb); +	usb_free_urb(acm->readurb); +	usb_free_urb(acm->writeurb); +	kfree(acm); +} +  static void acm_tty_close(struct tty_struct *tty, struct file *filp)  {  	struct acm *acm = tty->driver_data; @@ -436,14 +447,8 @@ static void acm_tty_close(struct tty_struct *tty, struct file *filp)  			usb_kill_urb(acm->ctrlurb);  			usb_kill_urb(acm->writeurb);  			usb_kill_urb(acm->readurb); -		} else { -			tty_unregister_device(acm_tty_driver, acm->minor); -			acm_table[acm->minor] = NULL; -			usb_free_urb(acm->ctrlurb); -			usb_free_urb(acm->readurb); -			usb_free_urb(acm->writeurb); -			kfree(acm); -		} +		} else +			acm_tty_unregister(acm);  	}  	up(&open_sem);  } @@ -905,7 +910,8 @@ skip_normal_probe:  	usb_driver_claim_interface(&acm_driver, data_interface, acm); -	tty_register_device(acm_tty_driver, minor, &intf->dev); +	usb_get_intf(control_interface); +	tty_register_device(acm_tty_driver, minor, &control_interface->dev);  	acm_table[minor] = acm;  	usb_set_intfdata (intf, acm); @@ -954,12 +960,7 @@ static void acm_disconnect(struct usb_interface *intf)  	usb_driver_release_interface(&acm_driver, acm->data);  	if (!acm->used) { -		tty_unregister_device(acm_tty_driver, acm->minor); -		acm_table[acm->minor] = NULL; -		usb_free_urb(acm->ctrlurb); -		usb_free_urb(acm->readurb); -		usb_free_urb(acm->writeurb); -		kfree(acm); +		acm_tty_unregister(acm);  		up(&open_sem);  		return;  	}  | 
