Commit 81e80134 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman
Browse files

staging: comedi: usbdux: fix usbdux_pwm_start()



Add the missing down/up of the semaphore to prevent other commands
from being issued to the usb device while the pwn is being stopped.

Rename the local variable used for the private data pointer to the
comedi "norm".

Use memset() to initialize the urb transfer buffer.

Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 96ca3704
Loading
Loading
Loading
Loading
+17 −17
Original line number Diff line number Diff line
@@ -1544,35 +1544,35 @@ static int usbdux_pwm_period(struct comedi_device *dev,
	return 0;
}

/* is called from insn so there's no need to do all the sanity checks */
static int usbdux_pwm_start(struct comedi_device *dev,
			    struct comedi_subdevice *s)
{
	int ret, i;
	struct usbdux_private *this_usbduxsub = dev->private;
	struct usbdux_private *devpriv = dev->private;
	int ret = 0;

	if (this_usbduxsub->pwm_cmd_running) {
		/* already running */
		return 0;
	}
	down(&devpriv->sem);

	if (devpriv->pwm_cmd_running)
		goto pwm_start_exit;

	this_usbduxsub->dux_commands[1] = ((int8_t) this_usbduxsub->pwn_delay);
	devpriv->dux_commands[1] = devpriv->pwn_delay;
	ret = send_dux_commands(dev, SENDPWMON);
	if (ret < 0)
		return ret;
		goto pwm_start_exit;

	/* initialise the buffer */
	for (i = 0; i < this_usbduxsub->size_pwm_buf; i++)
		((char *)(this_usbduxsub->urb_pwm->transfer_buffer))[i] = 0;
	memset(devpriv->urb_pwm->transfer_buffer, 0, devpriv->size_pwm_buf);

	this_usbduxsub->pwm_cmd_running = 1;
	devpriv->pwm_cmd_running = 1;
	ret = usbduxsub_submit_pwm_urbs(dev);
	if (ret < 0) {
		this_usbduxsub->pwm_cmd_running = 0;
	if (ret < 0)
		devpriv->pwm_cmd_running = 0;

pwm_start_exit:
	up(&devpriv->sem);

	return ret;
}
	return 0;
}

/* generates the bit pattern for PWM with the optional sign bit */
static int usbdux_pwm_pattern(struct comedi_device *dev,