staging: comedi: usbduxsigma: move usbduxsigma_firmware_upload()
For aesthetics, move this function near its caller. Also, move the FIRMWARE_MAX_LEN define so its with the other firmware constants and fix the whitespace. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Cc: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
5f1d72ecfb
commit
46c878080b
1 changed files with 76 additions and 78 deletions
|
@ -56,8 +56,9 @@ Status: testing
|
||||||
|
|
||||||
/* constants for "firmware" upload and download */
|
/* constants for "firmware" upload and download */
|
||||||
#define FIRMWARE "usbduxsigma_firmware.bin"
|
#define FIRMWARE "usbduxsigma_firmware.bin"
|
||||||
#define USBDUXSUB_FIRMWARE 0xA0
|
#define FIRMWARE_MAX_LEN 0x4000
|
||||||
#define VENDOR_DIR_IN 0xC0
|
#define USBDUXSUB_FIRMWARE 0xa0
|
||||||
|
#define VENDOR_DIR_IN 0xc0
|
||||||
#define VENDOR_DIR_OUT 0x40
|
#define VENDOR_DIR_OUT 0x40
|
||||||
|
|
||||||
/* internal addresses of the 8051 processor */
|
/* internal addresses of the 8051 processor */
|
||||||
|
@ -482,80 +483,6 @@ static void usbduxsub_ao_IsocIrq(struct urb *urb)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the FX2LP has twice as much as the standard FX2 */
|
|
||||||
#define FIRMWARE_MAX_LEN 0x4000
|
|
||||||
|
|
||||||
static int usbduxsigma_firmware_upload(struct comedi_device *dev,
|
|
||||||
const u8 *data, size_t size,
|
|
||||||
unsigned long context)
|
|
||||||
{
|
|
||||||
struct usb_device *usb = comedi_to_usb_dev(dev);
|
|
||||||
uint8_t *buf;
|
|
||||||
uint8_t *tmp;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!data)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (size > FIRMWARE_MAX_LEN) {
|
|
||||||
dev_err(dev->class_dev, "firmware binary too large for FX2\n");
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we generate a local buffer for the firmware */
|
|
||||||
buf = kmemdup(data, size, GFP_KERNEL);
|
|
||||||
if (!buf)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
/* we need a malloc'ed buffer for usb_control_msg() */
|
|
||||||
tmp = kmalloc(1, GFP_KERNEL);
|
|
||||||
if (!tmp) {
|
|
||||||
kfree(buf);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* stop the current firmware on the device */
|
|
||||||
*tmp = 1; /* 7f92 to one */
|
|
||||||
ret = usb_control_msg(usb, usb_sndctrlpipe(usb, 0),
|
|
||||||
USBDUXSUB_FIRMWARE,
|
|
||||||
VENDOR_DIR_OUT,
|
|
||||||
USBDUXSUB_CPUCS, 0x0000,
|
|
||||||
tmp, 1,
|
|
||||||
BULK_TIMEOUT);
|
|
||||||
if (ret < 0) {
|
|
||||||
dev_err(dev->class_dev, "can not stop firmware\n");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* upload the new firmware to the device */
|
|
||||||
ret = usb_control_msg(usb, usb_sndctrlpipe(usb, 0),
|
|
||||||
USBDUXSUB_FIRMWARE,
|
|
||||||
VENDOR_DIR_OUT,
|
|
||||||
0, 0x0000,
|
|
||||||
buf, size,
|
|
||||||
BULK_TIMEOUT);
|
|
||||||
if (ret < 0) {
|
|
||||||
dev_err(dev->class_dev, "firmware upload failed\n");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* start the new firmware on the device */
|
|
||||||
*tmp = 0; /* 7f92 to zero */
|
|
||||||
ret = usb_control_msg(usb, usb_sndctrlpipe(usb, 0),
|
|
||||||
USBDUXSUB_FIRMWARE,
|
|
||||||
VENDOR_DIR_OUT,
|
|
||||||
USBDUXSUB_CPUCS, 0x0000,
|
|
||||||
tmp, 1,
|
|
||||||
BULK_TIMEOUT);
|
|
||||||
if (ret < 0)
|
|
||||||
dev_err(dev->class_dev, "can not start firmware\n");
|
|
||||||
|
|
||||||
done:
|
|
||||||
kfree(tmp);
|
|
||||||
kfree(buf);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int usbduxsigma_submit_urbs(struct comedi_device *dev,
|
static int usbduxsigma_submit_urbs(struct comedi_device *dev,
|
||||||
struct urb **urbs, int num_urbs,
|
struct urb **urbs, int num_urbs,
|
||||||
int input_urb)
|
int input_urb)
|
||||||
|
@ -1650,6 +1577,77 @@ static int usbduxsigma_attach_common(struct comedi_device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int usbduxsigma_firmware_upload(struct comedi_device *dev,
|
||||||
|
const u8 *data, size_t size,
|
||||||
|
unsigned long context)
|
||||||
|
{
|
||||||
|
struct usb_device *usb = comedi_to_usb_dev(dev);
|
||||||
|
uint8_t *buf;
|
||||||
|
uint8_t *tmp;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!data)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (size > FIRMWARE_MAX_LEN) {
|
||||||
|
dev_err(dev->class_dev, "firmware binary too large for FX2\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we generate a local buffer for the firmware */
|
||||||
|
buf = kmemdup(data, size, GFP_KERNEL);
|
||||||
|
if (!buf)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
/* we need a malloc'ed buffer for usb_control_msg() */
|
||||||
|
tmp = kmalloc(1, GFP_KERNEL);
|
||||||
|
if (!tmp) {
|
||||||
|
kfree(buf);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* stop the current firmware on the device */
|
||||||
|
*tmp = 1; /* 7f92 to one */
|
||||||
|
ret = usb_control_msg(usb, usb_sndctrlpipe(usb, 0),
|
||||||
|
USBDUXSUB_FIRMWARE,
|
||||||
|
VENDOR_DIR_OUT,
|
||||||
|
USBDUXSUB_CPUCS, 0x0000,
|
||||||
|
tmp, 1,
|
||||||
|
BULK_TIMEOUT);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(dev->class_dev, "can not stop firmware\n");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* upload the new firmware to the device */
|
||||||
|
ret = usb_control_msg(usb, usb_sndctrlpipe(usb, 0),
|
||||||
|
USBDUXSUB_FIRMWARE,
|
||||||
|
VENDOR_DIR_OUT,
|
||||||
|
0, 0x0000,
|
||||||
|
buf, size,
|
||||||
|
BULK_TIMEOUT);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(dev->class_dev, "firmware upload failed\n");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* start the new firmware on the device */
|
||||||
|
*tmp = 0; /* 7f92 to zero */
|
||||||
|
ret = usb_control_msg(usb, usb_sndctrlpipe(usb, 0),
|
||||||
|
USBDUXSUB_FIRMWARE,
|
||||||
|
VENDOR_DIR_OUT,
|
||||||
|
USBDUXSUB_CPUCS, 0x0000,
|
||||||
|
tmp, 1,
|
||||||
|
BULK_TIMEOUT);
|
||||||
|
if (ret < 0)
|
||||||
|
dev_err(dev->class_dev, "can not start firmware\n");
|
||||||
|
|
||||||
|
done:
|
||||||
|
kfree(tmp);
|
||||||
|
kfree(buf);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int usbduxsigma_alloc_usb_buffers(struct comedi_device *dev)
|
static int usbduxsigma_alloc_usb_buffers(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
struct usb_device *usb = comedi_to_usb_dev(dev);
|
struct usb_device *usb = comedi_to_usb_dev(dev);
|
||||||
|
|
Loading…
Add table
Reference in a new issue