diff options
| author | Oliver Neukum <oliver@neukum.org> | 2009-12-16 17:05:57 +0100 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-03-02 14:53:19 -0800 | 
| commit | 97d35f95552c9a0ee4777a7f04431a9fd1260478 (patch) | |
| tree | bb5a2c5244b0ae17a2dd07d65e0f1637c7babb1e /drivers/usb/class | |
| parent | 1f141ca2b1f40088203fba061cc7b1f8da7c38ab (diff) | |
| download | olio-linux-3.10-97d35f95552c9a0ee4777a7f04431a9fd1260478.tar.xz olio-linux-3.10-97d35f95552c9a0ee4777a7f04431a9fd1260478.zip  | |
USB: cdc-acm: Update to new autopm API
Update cdc-acm to the async methods eliminating the workqueue
Signed-off-by: Oliver Neukum <oliver@neukum.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/class')
| -rw-r--r-- | drivers/usb/class/cdc-acm.c | 43 | ||||
| -rw-r--r-- | drivers/usb/class/cdc-acm.h | 1 | 
2 files changed, 22 insertions, 22 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index ef2e6f9c890..6ae7ccaff07 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -170,6 +170,7 @@ static void acm_write_done(struct acm *acm, struct acm_wb *wb)  {  	wb->use = 0;  	acm->transmitting--; +	usb_autopm_put_interface_async(acm->control);  }  /* @@ -211,9 +212,12 @@ static int acm_write_start(struct acm *acm, int wbn)  	}  	dbg("%s susp_count: %d", __func__, acm->susp_count); +	usb_autopm_get_interface_async(acm->control);  	if (acm->susp_count) { -		acm->delayed_wb = wb; -		schedule_work(&acm->waker); +		if (!acm->delayed_wb) +			acm->delayed_wb = wb; +		else +			usb_autopm_put_interface_async(acm->control);  		spin_unlock_irqrestore(&acm->write_lock, flags);  		return 0;	/* A white lie */  	} @@ -534,23 +538,6 @@ static void acm_softint(struct work_struct *work)  	tty_kref_put(tty);  } -static void acm_waker(struct work_struct *waker) -{ -	struct acm *acm = container_of(waker, struct acm, waker); -	int rv; - -	rv = usb_autopm_get_interface(acm->control); -	if (rv < 0) { -		dev_err(&acm->dev->dev, "Autopm failure in %s\n", __func__); -		return; -	} -	if (acm->delayed_wb) { -		acm_start_wb(acm, acm->delayed_wb); -		acm->delayed_wb = NULL; -	} -	usb_autopm_put_interface(acm->control); -} -  /*   * TTY handlers   */ @@ -1178,7 +1165,6 @@ made_compressed_probe:  	acm->urb_task.func = acm_rx_tasklet;  	acm->urb_task.data = (unsigned long) acm;  	INIT_WORK(&acm->work, acm_softint); -	INIT_WORK(&acm->waker, acm_waker);  	init_waitqueue_head(&acm->drain_wait);  	spin_lock_init(&acm->throttle_lock);  	spin_lock_init(&acm->write_lock); @@ -1343,7 +1329,6 @@ static void stop_data_traffic(struct acm *acm)  	tasklet_enable(&acm->urb_task);  	cancel_work_sync(&acm->work); -	cancel_work_sync(&acm->waker);  }  static void acm_disconnect(struct usb_interface *intf) @@ -1435,6 +1420,7 @@ static int acm_suspend(struct usb_interface *intf, pm_message_t message)  static int acm_resume(struct usb_interface *intf)  {  	struct acm *acm = usb_get_intfdata(intf); +	struct acm_wb *wb;  	int rv = 0;  	int cnt; @@ -1449,6 +1435,21 @@ static int acm_resume(struct usb_interface *intf)  	mutex_lock(&acm->mutex);  	if (acm->port.count) {  		rv = usb_submit_urb(acm->ctrlurb, GFP_NOIO); + +		spin_lock_irq(&acm->write_lock); +		if (acm->delayed_wb) { +			wb = acm->delayed_wb; +			acm->delayed_wb = NULL; +			spin_unlock_irq(&acm->write_lock); +			acm_start_wb(acm, acm->delayed_wb); +		} else { +			spin_unlock_irq(&acm->write_lock); +		} + +		/* +		 * delayed error checking because we must +		 * do the write path at all cost +		 */  		if (rv < 0)  			goto err_out; diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h index c4a0ee8ffcc..519eb638b6e 100644 --- a/drivers/usb/class/cdc-acm.h +++ b/drivers/usb/class/cdc-acm.h @@ -112,7 +112,6 @@ struct acm {  	struct mutex mutex;  	struct usb_cdc_line_coding line;		/* bits, stop, parity */  	struct work_struct work;			/* work queue entry for line discipline waking up */ -	struct work_struct waker;  	wait_queue_head_t drain_wait;			/* close processing */  	struct tasklet_struct urb_task;                 /* rx processing */  	spinlock_t throttle_lock;			/* synchronize throtteling and read callback */  |