USB: ezusb: add functions for firmware download
This patch adds new functions to upload firmware to the controller. The drivers currently using ezusb are adapted to use these new functions. This also fixes a bug occuring during firmware loading in the whiteheat-driver: The driver iterates over an ihex-formatted firmware using ++ on a "const struct ihex_binrec*" which leads to faulty results, because ihex data is read as length. The function "ihex_next_binrec(record)" has so be used to work correctly Signed-off-by: René Bürgel <rene.buergel@sohard.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
cc183e2a5e
commit
8d733e26c0
@@ -25,8 +25,6 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/ihex.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usb/serial.h>
|
||||
@@ -675,8 +673,6 @@ static int keyspan_pda_fake_startup(struct usb_serial *serial)
|
||||
{
|
||||
int response;
|
||||
const char *fw_name;
|
||||
const struct ihex_binrec *record;
|
||||
const struct firmware *fw;
|
||||
|
||||
/* download the firmware here ... */
|
||||
response = ezusb_fx1_set_reset(serial->dev, 1);
|
||||
@@ -696,30 +692,15 @@ static int keyspan_pda_fake_startup(struct usb_serial *serial)
|
||||
__func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
if (request_ihex_firmware(&fw, fw_name, &serial->dev->dev)) {
|
||||
|
||||
if (ezusb_fx1_ihex_firmware_download(serial->dev, fw_name) < 0) {
|
||||
dev_err(&serial->dev->dev, "failed to load firmware \"%s\"\n",
|
||||
fw_name);
|
||||
return -ENOENT;
|
||||
}
|
||||
record = (const struct ihex_binrec *)fw->data;
|
||||
|
||||
while (record) {
|
||||
response = ezusb_writememory(serial->dev, be32_to_cpu(record->addr),
|
||||
(unsigned char *)record->data,
|
||||
be16_to_cpu(record->len), 0xa0);
|
||||
if (response < 0) {
|
||||
dev_err(&serial->dev->dev, "ezusb_writememory failed "
|
||||
"for Keyspan PDA firmware (%d %04X %p %d)\n",
|
||||
response, be32_to_cpu(record->addr),
|
||||
record->data, be16_to_cpu(record->len));
|
||||
break;
|
||||
}
|
||||
record = ihex_next_binrec(record);
|
||||
}
|
||||
release_firmware(fw);
|
||||
/* bring device out of reset. Renumeration will occur in a moment
|
||||
and the new device will bind to the real driver */
|
||||
response = ezusb_fx1_set_reset(serial->dev, 0);
|
||||
/* after downloading firmware Renumeration will occur in a
|
||||
moment and the new device will bind to the real driver */
|
||||
|
||||
/* we want this device to fail to have a driver assigned to it. */
|
||||
return 1;
|
||||
|
Reference in New Issue
Block a user